From 7aa58465d712a58df41dcae69b0f1c705f124d17 Mon Sep 17 00:00:00 2001 From: Dennis Garcia Date: Mon, 12 Feb 2024 11:11:47 -0600 Subject: [PATCH 01/42] Milestone 1: Executing Miden Client in Browser via WASM --- .gitignore | 5 + wasm/Cargo.toml | 11 + wasm/js/index.js | 13 ++ wasm/js/wasm.js | 1 + wasm/package.json | 22 ++ wasm/rollup.config.js | 39 ++++ wasm/src/lib.rs | 11 + wasm/test.html | 21 ++ wasm/yarn.lock | 499 ++++++++++++++++++++++++++++++++++++++++++ 9 files changed, 622 insertions(+) create mode 100644 wasm/Cargo.toml create mode 100644 wasm/js/index.js create mode 100644 wasm/js/wasm.js create mode 100644 wasm/package.json create mode 100644 wasm/rollup.config.js create mode 100644 wasm/src/lib.rs create mode 100644 wasm/test.html create mode 100644 wasm/yarn.lock diff --git a/.gitignore b/.gitignore index 87b3528f3..56e144ab1 100644 --- a/.gitignore +++ b/.gitignore @@ -15,3 +15,8 @@ Cargo.lock # Ignore Store files that may be spawned using `cargo run` *.sqlite3 + +# Wasm build artefacts to ignore +wasm/node_modules/* +wasm/dist/* + diff --git a/wasm/Cargo.toml b/wasm/Cargo.toml new file mode 100644 index 000000000..efcc87468 --- /dev/null +++ b/wasm/Cargo.toml @@ -0,0 +1,11 @@ +[package] +name = "miden-wasm" +version = "1.0.0" +description = "WebAssembly based toolkit for developing zero knowledge applications with Polygon Miden" +edition = "2021" + +[lib] +crate-type = ["cdylib"] + +[dependencies.wasm-bindgen] +wasm-bindgen = "0.2" \ No newline at end of file diff --git a/wasm/js/index.js b/wasm/js/index.js new file mode 100644 index 000000000..981e9d3f6 --- /dev/null +++ b/wasm/js/index.js @@ -0,0 +1,13 @@ +import wasm from "../dist/wasm.js"; + +const { + greet, +} = await wasm({ + importHook: () => { + return new URL("assets/miden_wasm.wasm", import.meta.url); + }, +}); + +export { + greet, +}; \ No newline at end of file diff --git a/wasm/js/wasm.js b/wasm/js/wasm.js new file mode 100644 index 000000000..5c4a23b42 --- /dev/null +++ b/wasm/js/wasm.js @@ -0,0 +1 @@ +export { default } from "../Cargo.toml"; \ No newline at end of file diff --git a/wasm/package.json b/wasm/package.json new file mode 100644 index 000000000..162f58b46 --- /dev/null +++ b/wasm/package.json @@ -0,0 +1,22 @@ +{ + "name": "miden-wasm", + "version": "1.0.0", + "description": "Wasm build for the Polygon Miden Client", + "type": "module", + "main": "./dist/index.js", + "browser": "./dist/index.js", + "types": "./dist/index.d.ts", + "exports": { + ".": "./dist/index.js" + }, + "scripts": { + "build": "rimraf dist && rollup -c rollup.config.js && rimraf dist/wasm*" + }, + "devDependencies": { + "@wasm-tool/rollup-plugin-rust": "^2.4.2", + "cpr": "^3.0.1", + "rimraf": "^5.0.1", + "rollup": "^3.27.2" + } + } + \ No newline at end of file diff --git a/wasm/rollup.config.js b/wasm/rollup.config.js new file mode 100644 index 000000000..3b5497832 --- /dev/null +++ b/wasm/rollup.config.js @@ -0,0 +1,39 @@ +import rust from "@wasm-tool/rollup-plugin-rust"; + +export default [ + { + input: { + wasm: "./js/wasm.js", + }, + output: { + dir: `dist`, + format: "es", + sourcemap: true, + assetFileNames: "assets/[name][extname]", + }, + plugins: [ + rust({ + cargoArgs: [ + // This enables multi-threading + "--config", `build.rustflags=["-C", "target-feature=+atomics,+bulk-memory,+mutable-globals", "-C", "link-arg=--max-memory=4294967296"]`, + "--no-default-features", + "-Z", "build-std=panic_abort,std", + ], + + experimental: { + typescriptDeclarationDir: "dist/crates", + }, + }), + ], + }, + { + input: { + index: "./js/index.js", + }, + output: { + dir: `dist`, + format: "es", + sourcemap: true, + }, + } +]; diff --git a/wasm/src/lib.rs b/wasm/src/lib.rs new file mode 100644 index 000000000..ca75e9323 --- /dev/null +++ b/wasm/src/lib.rs @@ -0,0 +1,11 @@ +use wasm_bindgen::prelude::*; + +#[wasm_bindgen] +pub fn greet() { + alert("Hello, World!"); +} + +#[wasm_bindgen] +extern "C" { + fn alert(s: &str); +} \ No newline at end of file diff --git a/wasm/test.html b/wasm/test.html new file mode 100644 index 000000000..3d3075817 --- /dev/null +++ b/wasm/test.html @@ -0,0 +1,21 @@ + + + + + WASM Greet Example + + + + + + \ No newline at end of file diff --git a/wasm/yarn.lock b/wasm/yarn.lock new file mode 100644 index 000000000..58aa1500e --- /dev/null +++ b/wasm/yarn.lock @@ -0,0 +1,499 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@iarna/toml@^2.2.5": + version "2.2.5" + resolved "https://registry.yarnpkg.com/@iarna/toml/-/toml-2.2.5.tgz#b32366c89b43c6f8cefbdefac778b9c828e3ba8c" + integrity sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg== + +"@isaacs/cliui@^8.0.2": + version "8.0.2" + resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" + integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== + dependencies: + string-width "^5.1.2" + string-width-cjs "npm:string-width@^4.2.0" + strip-ansi "^7.0.1" + strip-ansi-cjs "npm:strip-ansi@^6.0.1" + wrap-ansi "^8.1.0" + wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" + +"@pkgjs/parseargs@^0.11.0": + version "0.11.0" + resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" + integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== + +"@rollup/pluginutils@^5.0.2": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-5.1.0.tgz#7e53eddc8c7f483a4ad0b94afb1f7f5fd3c771e0" + integrity sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g== + dependencies: + "@types/estree" "^1.0.0" + estree-walker "^2.0.2" + picomatch "^2.3.1" + +"@types/estree@^1.0.0": + version "1.0.5" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4" + integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== + +"@wasm-tool/rollup-plugin-rust@^2.4.2": + version "2.4.5" + resolved "https://registry.yarnpkg.com/@wasm-tool/rollup-plugin-rust/-/rollup-plugin-rust-2.4.5.tgz#203e0be9196ad278533b0996bf29c6dae5b468ec" + integrity sha512-rrgaHm/TmiOCKkt9mz8LMQMzigyn2xLHNZDtJAAv8HDrQt9QbksUkf+mYmsnQDF7gFmWtOEEJE5/7lfYuL0fEQ== + dependencies: + "@iarna/toml" "^2.2.5" + "@rollup/pluginutils" "^5.0.2" + binaryen "^111.0.0" + chalk "^4.0.0" + glob "^10.2.2" + node-fetch "^2.0.0" + rimraf "^5.0.0" + tar "^6.1.11" + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-regex@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" + integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +ansi-styles@^6.1.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" + integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +binaryen@^111.0.0: + version "111.0.0" + resolved "https://registry.yarnpkg.com/binaryen/-/binaryen-111.0.0.tgz#dd970a11d8fe61959f77d609dfee3c19ad80b80a" + integrity sha512-PEXOSHFO85aj1aP4t+KGzvxQ00qXbjCysWlsDjlGkP1e9owNiYdpEkLej21Ax8LDD7xJ01rEmJDqZ/JPoW2GXw== + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + +chalk@^4.0.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chownr@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" + integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +cpr@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/cpr/-/cpr-3.0.1.tgz#b9a55038b7cd81a35c17b9761895bd8496aef1e5" + integrity sha512-Xch4PXQ/KC8lJ+KfJ9JI6eG/nmppLrPPWg5Q+vh65Qr9EjuJEubxh/H/Le1TmCZ7+Xv7iJuNRqapyOFZB+wsxA== + dependencies: + graceful-fs "^4.1.5" + minimist "^1.2.0" + mkdirp "~0.5.1" + rimraf "^2.5.4" + +cross-spawn@^7.0.0: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +eastasianwidth@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" + integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +emoji-regex@^9.2.2: + version "9.2.2" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" + integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== + +estree-walker@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac" + integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== + +foreground-child@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.1.1.tgz#1d173e776d75d2772fed08efe4a0de1ea1b12d0d" + integrity sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg== + dependencies: + cross-spawn "^7.0.0" + signal-exit "^4.0.1" + +fs-minipass@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" + integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== + dependencies: + minipass "^3.0.0" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +fsevents@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== + +glob@^10.2.2, glob@^10.3.7: + version "10.3.10" + resolved "https://registry.yarnpkg.com/glob/-/glob-10.3.10.tgz#0351ebb809fd187fe421ab96af83d3a70715df4b" + integrity sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g== + dependencies: + foreground-child "^3.1.0" + jackspeak "^2.3.5" + minimatch "^9.0.1" + minipass "^5.0.0 || ^6.0.2 || ^7.0.0" + path-scurry "^1.10.1" + +glob@^7.1.3: + version "7.2.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + +graceful-fs@^4.1.5: + version "4.2.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +jackspeak@^2.3.5: + version "2.3.6" + resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-2.3.6.tgz#647ecc472238aee4b06ac0e461acc21a8c505ca8" + integrity sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ== + dependencies: + "@isaacs/cliui" "^8.0.2" + optionalDependencies: + "@pkgjs/parseargs" "^0.11.0" + +"lru-cache@^9.1.1 || ^10.0.0": + version "10.2.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.2.0.tgz#0bd445ca57363465900f4d1f9bd8db343a4d95c3" + integrity sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q== + +minimatch@^3.1.1: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimatch@^9.0.1: + version "9.0.3" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825" + integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== + dependencies: + brace-expansion "^2.0.1" + +minimist@^1.2.0, minimist@^1.2.6: + version "1.2.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== + +minipass@^3.0.0: + version "3.3.6" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.3.6.tgz#7bba384db3a1520d18c9c0e5251c3444e95dd94a" + integrity sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw== + dependencies: + yallist "^4.0.0" + +minipass@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-5.0.0.tgz#3e9788ffb90b694a5d0ec94479a45b5d8738133d" + integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ== + +"minipass@^5.0.0 || ^6.0.2 || ^7.0.0": + version "7.0.4" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.0.4.tgz#dbce03740f50a4786ba994c1fb908844d27b038c" + integrity sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ== + +minizlib@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" + integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== + dependencies: + minipass "^3.0.0" + yallist "^4.0.0" + +mkdirp@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + +mkdirp@~0.5.1: + version "0.5.6" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" + integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== + dependencies: + minimist "^1.2.6" + +node-fetch@^2.0.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" + integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== + dependencies: + whatwg-url "^5.0.0" + +once@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + +path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-scurry@^1.10.1: + version "1.10.1" + resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.10.1.tgz#9ba6bf5aa8500fe9fd67df4f0d9483b2b0bfc698" + integrity sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ== + dependencies: + lru-cache "^9.1.1 || ^10.0.0" + minipass "^5.0.0 || ^6.0.2 || ^7.0.0" + +picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +rimraf@^2.5.4: + version "2.7.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" + integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== + dependencies: + glob "^7.1.3" + +rimraf@^5.0.0, rimraf@^5.0.1: + version "5.0.5" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-5.0.5.tgz#9be65d2d6e683447d2e9013da2bf451139a61ccf" + integrity sha512-CqDakW+hMe/Bz202FPEymy68P+G50RfMQK+Qo5YUqc9SPipvbGjCGKd0RSKEelbsfQuw3g5NZDSrlZZAJurH1A== + dependencies: + glob "^10.3.7" + +rollup@^3.27.2: + version "3.29.4" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-3.29.4.tgz#4d70c0f9834146df8705bfb69a9a19c9e1109981" + integrity sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw== + optionalDependencies: + fsevents "~2.3.2" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +signal-exit@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" + integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== + +"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string-width@^5.0.1, string-width@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" + integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== + dependencies: + eastasianwidth "^0.2.0" + emoji-regex "^9.2.2" + strip-ansi "^7.0.1" + +"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-ansi@^7.0.1: + version "7.1.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" + integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== + dependencies: + ansi-regex "^6.0.1" + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +tar@^6.1.11: + version "6.2.0" + resolved "https://registry.yarnpkg.com/tar/-/tar-6.2.0.tgz#b14ce49a79cb1cd23bc9b016302dea5474493f73" + integrity sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ== + dependencies: + chownr "^2.0.0" + fs-minipass "^2.0.0" + minipass "^5.0.0" + minizlib "^2.1.1" + mkdirp "^1.0.3" + yallist "^4.0.0" + +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== + +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== + +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrap-ansi@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" + integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== + dependencies: + ansi-styles "^6.1.0" + string-width "^5.0.1" + strip-ansi "^7.0.1" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== From 217f4f51d6db172a6771d012b57307370ed52ad4 Mon Sep 17 00:00:00 2001 From: Dennis Garcia Date: Fri, 8 Mar 2024 19:04:19 -0600 Subject: [PATCH 02/42] Setting up web store and web rpc infrastructure. Porting new_account. --- wasm/Cargo.toml | 12 +- wasm/js/db-operations.js | 296 ++++++++++++++++++++++++++ wasm/js/index.js | 2 + wasm/js/web-rpc-client.js | 8 + wasm/src/lib.rs | 4 + wasm/src/native_code/accounts.rs | 144 +++++++++++++ wasm/src/native_code/mod.rs | 26 +++ wasm/src/native_code/rpc/mod.rs | 7 + wasm/src/native_code/store/mod.rs | 75 +++++++ wasm/src/web_client/account.rs | 108 ++++++++++ wasm/src/web_client/mod.rs | 42 ++++ wasm/src/web_client/store/mod.rs | 218 +++++++++++++++++++ wasm/src/web_client/web_rpc_client.rs | 32 +++ wasm/test.html | 41 +++- 14 files changed, 1006 insertions(+), 9 deletions(-) create mode 100644 wasm/js/db-operations.js create mode 100644 wasm/js/web-rpc-client.js create mode 100644 wasm/src/native_code/accounts.rs create mode 100644 wasm/src/native_code/mod.rs create mode 100644 wasm/src/native_code/rpc/mod.rs create mode 100644 wasm/src/native_code/store/mod.rs create mode 100644 wasm/src/web_client/account.rs create mode 100644 wasm/src/web_client/mod.rs create mode 100644 wasm/src/web_client/store/mod.rs create mode 100644 wasm/src/web_client/web_rpc_client.rs diff --git a/wasm/Cargo.toml b/wasm/Cargo.toml index efcc87468..bdf0150e3 100644 --- a/wasm/Cargo.toml +++ b/wasm/Cargo.toml @@ -7,5 +7,13 @@ edition = "2021" [lib] crate-type = ["cdylib"] -[dependencies.wasm-bindgen] -wasm-bindgen = "0.2" \ No newline at end of file +[dependencies] +async-trait = "0.1" +futures = "0.3" +getrandom = { version = "0.2", features = ["js"] } +rand = { version = "0.8.5" } +serde = { version = "1.0", features = ["derive"] } +serde-wasm-bindgen = "0.6.5" +wasm-bindgen = { version = "0.2", features = ["serde-serialize"] } +wasm-bindgen-futures = "0.4" +web-sys = { version = "0.3", features = ["console"] } \ No newline at end of file diff --git a/wasm/js/db-operations.js b/wasm/js/db-operations.js new file mode 100644 index 000000000..c29a70781 --- /dev/null +++ b/wasm/js/db-operations.js @@ -0,0 +1,296 @@ +async function setupIndexedDB() { + const dbName = "MidenClientDB"; + const dbVersion = 1; // Use a higher version if you need to upgrade the DB structure in the future + + return new Promise((resolve, reject) => { + // Open a connection to the database + const request = indexedDB.open(dbName, dbVersion); + + // This event is only triggered when the database is created for the first time, + // or when the version number increases + request.onupgradeneeded = function(event) { + const db = event.target.result; + + // Create an object store named "Greet" if it doesn't already exist -- FOR TESTING + if (!db.objectStoreNames.contains("Greet")) { + db.createObjectStore("Greet", { autoIncrement: true }); + } + + //// ACCOUNTS //// + + // account_code object store + if (!db.objectStoreNames.contains("account_code")) { + db.createObjectStore("account_code", { keyPath: "root" }); + } + + // account_storage object store + if (!db.objectStoreNames.contains("account_storage")) { + db.createObjectStore("account_storage", { keyPath: "root" }); + } + + // account_vaults object store + if (!db.objectStoreNames.contains("account_vaults")) { + db.createObjectStore("account_vaults", { keyPath: "root" }); + } + + // Create account_auth object store with account_id as the keyPath + if (!db.objectStoreNames.contains("account_auth")) { + db.createObjectStore("account_auth", { keyPath: "account_id" }); + } + + // Create accounts object store with a single keyPath + if (!db.objectStoreNames.contains("accounts")) { + const accountsStore = db.createObjectStore("accounts", { keyPath: "id_nonce" }); + // Create indexes for foreign keys + accountsStore.createIndex("code_root", "code_root", { unique: false }); + accountsStore.createIndex("storage_root", "storage_root", { unique: false }); + accountsStore.createIndex("vault_root", "vault_root", { unique: false }); + } + }; + + // Handle successful database open operation + request.onsuccess = function(event) { + const db = event.target.result; + resolve(db); + }; + + // Handle errors when opening the database + request.onerror = function(event) { + console.error("Error opening database:", request.error); + reject(request.error); + }; + }); +} + +async function insertAccountCode(codeRoot, code, moduleArrayBuffer) { + const dbName = "MidenClientDB"; + const storeName = "account_code"; + + return new Promise((resolve, reject) => { + // Open a connection to the database + const request = indexedDB.open(dbName); + + request.onsuccess = function(event) { + const db = event.target.result; + const transaction = db.transaction(storeName, "readwrite"); + const store = transaction.objectStore(storeName); + + // Prepare the data object to insert + const data = { + root: codeRoot, // Using codeRoot as the key + code: code, + module: moduleArrayBuffer, // Assuming module is already a Uint8Array or similar + }; + + // Perform the insert + const insertRequest = store.add(data); + + insertRequest.onsuccess = function() { + resolve(`Successfully inserted code with root: ${codeRoot}`); + }; + + insertRequest.onerror = function() { + reject(`Error inserting code with root: ${codeRoot}: ${insertRequest.error}`); + }; + }; + + request.onerror = function(event) { + console.error("Error opening database:", request.error); + reject(request.error); + }; + }); +} + +async function insertAccountStorage(storageRoot, storageSlots) { + const dbName = "MidenClientDB"; + const storeName = "account_storage"; + + return new Promise((resolve, reject) => { + // Open a connection to the database + const request = indexedDB.open(dbName); + + request.onsuccess = function(event) { + const db = event.target.result; + const transaction = db.transaction(storeName, "readwrite"); + const store = transaction.objectStore(storeName); + + // Prepare the data object to insert + const data = { + root: storageRoot, // Using storageRoot as the key + slots: storageSlots, // Assuming storageSlots is a serialized JSON string or similar format + }; + + // Perform the insert + const insertRequest = store.add(data); + + insertRequest.onsuccess = function() { + resolve(`Successfully inserted storage with root: ${storageRoot}`); + }; + + insertRequest.onerror = function() { + reject(`Error inserting storage with root: ${storageRoot}: ${insertRequest.error}`); + }; + }; + + request.onerror = function(event) { + console.error("Error opening database:", request.error); + reject(request.error); + }; + }); +} + +async function insertAccountAssetVault(vaultRoot, assets) { + const dbName = "MidenClientDB"; + const storeName = "account_vaults"; + + return new Promise((resolve, reject) => { + // Open a connection to the database + const request = indexedDB.open(dbName); + + request.onsuccess = function(event) { + const db = event.target.result; + const transaction = db.transaction(storeName, "readwrite"); + const store = transaction.objectStore(storeName); + + // Prepare the data object to insert + const data = { + root: vaultRoot, // Using vaultRoot as the key + assets: assets, // Assuming assets is a serialized JSON string or similar format + }; + + // Perform the insert + const insertRequest = store.add(data); + + insertRequest.onsuccess = function() { + resolve(`Successfully inserted asset vault with root: ${vaultRoot}`); + }; + + insertRequest.onerror = function() { + reject(`Error inserting asset vault with root: ${vaultRoot}: ${insertRequest.error}`); + }; + }; + + request.onerror = function(event) { + console.error("Error opening database:", request.error); + reject(request.error); + }; + }); +} + +async function insertAccountAuth(accountId, authInfoSerialized) { + const dbName = "MidenClientDB"; + const storeName = "account_auth"; + + return new Promise((resolve, reject) => { + // Open a connection to the database + const request = indexedDB.open(dbName); + + request.onsuccess = function(event) { + const db = event.target.result; + const transaction = db.transaction(storeName, "readwrite"); + const store = transaction.objectStore(storeName); + + // Prepare the data object to insert + const data = { + account_id: accountId, // account_id as the key + auth_info: authInfoSerialized, // Assuming authInfo is already serialized (e.g., JSON string) + }; + + // Perform the insert + const insertRequest = store.add(data); + + insertRequest.onsuccess = function() { + resolve(`Successfully inserted auth info for account ID: ${accountId}`); + }; + + insertRequest.onerror = function() { + reject(`Error inserting auth info for account ID: ${accountId}: ${insertRequest.error}`); + }; + }; + + request.onerror = function(event) { + console.error("Error opening database:", request.error); + reject(request.error); + }; + }); +} + +async function insertAccountRecord(id, codeRoot, storageRoot, vaultRoot, nonce, committed, accountSeedArrayBuffer) { + const dbName = "MidenClientDB"; + const storeName = "accounts"; + + // Convert `id` and `nonce` to strings to ensure precision is maintained without loss. + const idStr = id.toString(); + const nonceStr = nonce.toString(); + + return new Promise((resolve, reject) => { + const request = indexedDB.open(dbName); + + request.onsuccess = function(event) { + const db = event.target.result; + const transaction = db.transaction(storeName, "readwrite"); + const store = transaction.objectStore(storeName); + + // Prepare the data object to insert, using the converted `id` and `nonce` for the `id_nonce` key + const data = { + id_nonce: `${idStr}_${nonceStr}`, // Concatenating `id` and `nonce` for the primary key + code_root: codeRoot, + storage_root: storageRoot, + vault_root: vaultRoot, + committed: committed, + account_seed: accountSeedArrayBuffer, // Directly using `accountSeedArrayBuffer` as it's automatically converted to ArrayBuffer + }; + + const insertRequest = store.add(data); + + insertRequest.onsuccess = function() { + resolve(`Successfully inserted account record for ID: ${idStr} with Nonce: ${nonceStr}`); + }; + + insertRequest.onerror = function() { + reject(`Error inserting account record for ID: ${idStr} with Nonce: ${nonceStr}: ${insertRequest.error}`); + }; + }; + + request.onerror = function(event) { + console.error("Error opening database:", request.error); + reject(request.error); + }; + }); +} + +async function insertGreeting(greeting) { + return new Promise((resolve, reject) => { + const openRequest = indexedDB.open("MidenClientDB", 1); + + openRequest.onsuccess = function(event) { + const db = event.target.result; + const transaction = db.transaction("Greet", "readwrite"); + const store = transaction.objectStore("Greet"); + const putRequest = store.put(greeting); + + putRequest.onsuccess = function() { + resolve(); + }; + + putRequest.onerror = function(e) { + console.error("Error inserting greeting:", e.target.error); + reject(new Error("Error inserting greeting")); + }; + }; + + openRequest.onerror = function(event) { + reject(new Error("Error opening database")); + }; + }); +} + +export { + setupIndexedDB, + insertGreeting, + insertAccountCode, + insertAccountStorage, + insertAccountAssetVault, + insertAccountAuth, + insertAccountRecord + } \ No newline at end of file diff --git a/wasm/js/index.js b/wasm/js/index.js index 981e9d3f6..3bcff4d2b 100644 --- a/wasm/js/index.js +++ b/wasm/js/index.js @@ -2,6 +2,7 @@ import wasm from "../dist/wasm.js"; const { greet, + WebClient } = await wasm({ importHook: () => { return new URL("assets/miden_wasm.wasm", import.meta.url); @@ -10,4 +11,5 @@ const { export { greet, + WebClient, }; \ No newline at end of file diff --git a/wasm/js/web-rpc-client.js b/wasm/js/web-rpc-client.js new file mode 100644 index 000000000..0a87cd51a --- /dev/null +++ b/wasm/js/web-rpc-client.js @@ -0,0 +1,8 @@ +export async function testRpc(endpoint) { + console.log(`Calling ${endpoint}`); + const response = await fetch(endpoint); + if (!response.ok) { + throw new Error(`HTTP error! Status: ${response.status}`); + } + // Assuming you might do something with the response, but no return is needed +} \ No newline at end of file diff --git a/wasm/src/lib.rs b/wasm/src/lib.rs index ca75e9323..95f63fa10 100644 --- a/wasm/src/lib.rs +++ b/wasm/src/lib.rs @@ -1,4 +1,8 @@ +pub mod native_code; +pub mod web_client; + use wasm_bindgen::prelude::*; +use wasm_bindgen_futures::*; #[wasm_bindgen] pub fn greet() { diff --git a/wasm/src/native_code/accounts.rs b/wasm/src/native_code/accounts.rs new file mode 100644 index 000000000..4e93f6f1d --- /dev/null +++ b/wasm/src/native_code/accounts.rs @@ -0,0 +1,144 @@ +// use miden_lib::AuthScheme; +// use miden_objects::{ +// accounts::{Account, AccountType}, +// assets::TokenSymbol, +// crypto::dsa::rpo_falcon512::KeyPair, +// Felt, Word, +// }; + +use rand::{rngs::StdRng, Rng, SeedableRng}; + +use super::{ + rpc::NodeRpcClient, + Client, + store::Store // TODO: Add AuthInfo +}; + +pub enum AccountTemplate { + BasicWallet { + mutable_code: bool, + storage_mode: AccountStorageMode, + }, + FungibleFaucet { + //token_symbol: TokenSymbol, + decimals: u8, + max_supply: u64, + storage_mode: AccountStorageMode, + }, +} + +pub enum AccountStorageMode { + Local, + OnChain, +} + +impl Client { + // ACCOUNT CREATION + // -------------------------------------------------------------------------------------------- + + /// Creates a new [Account] based on an [AccountTemplate] and saves it in the store + pub async fn new_account( + &mut self, + template: AccountTemplate, + ) -> String { // TODO: Add back OG return type Result<(Account, Word), ()> + let mut rng = StdRng::from_entropy(); + + match template { + AccountTemplate::BasicWallet { + mutable_code, + storage_mode, + } => self.new_basic_wallet(mutable_code, &mut rng, storage_mode).await, + AccountTemplate::FungibleFaucet { + //token_symbol, + decimals, + max_supply, + storage_mode, + } => { + self.new_fungible_faucet(decimals, max_supply, &mut rng, storage_mode).await + } + } + } + + /// Creates a new regular account and saves it in the store along with its seed and auth data + /// + /// # Panics + /// + /// If the passed [AccountStorageMode] is [AccountStorageMode::OnChain], this function panics + /// since this feature is not currently supported on Miden + async fn new_basic_wallet( + &mut self, + mutable_code: bool, + rng: &mut StdRng, + account_storage_mode: AccountStorageMode, + ) -> String { // TODO: Add back OG return type Result<(Account, Word), ()> + + // if let AccountStorageMode::OnChain = account_storage_mode { + // todo!("Recording the account on chain is not supported yet"); + // } + + // let key_pair: KeyPair = KeyPair::new()?; + + // let auth_scheme: AuthScheme = AuthScheme::RpoFalcon512 { + // pub_key: key_pair.public_key(), + // }; + + // // we need to use an initial seed to create the wallet account + // let init_seed: [u8; 32] = rng.gen(); + + // let (account, seed) = if !mutable_code { + // miden_lib::accounts::wallets::create_basic_wallet( + // init_seed, + // auth_scheme, + // AccountType::RegularAccountImmutableCode, + // ) + // } else { + // miden_lib::accounts::wallets::create_basic_wallet( + // init_seed, + // auth_scheme, + // AccountType::RegularAccountUpdatableCode, + // ) + // }?; + + // self.insert_account(&account, Some(seed), &AuthInfo::RpoFalcon512(key_pair))?; + // Ok((account, seed)) + + "Called new_basic_wallet".to_string() + } + + async fn new_fungible_faucet( + &mut self, + //token_symbol: TokenSymbol, + decimals: u8, + max_supply: u64, + rng: &mut StdRng, + account_storage_mode: AccountStorageMode, + ) -> String{ // TODO: Add back OG return type Result<(Account, Word), ()> + + // if let AccountStorageMode::OnChain = account_storage_mode { + // todo!("On-chain accounts are not supported yet"); + // } + + // let key_pair: KeyPair = KeyPair::new()?; + + // let auth_scheme: AuthScheme = AuthScheme::RpoFalcon512 { + // pub_key: key_pair.public_key(), + // }; + + // // we need to use an initial seed to create the wallet account + // let init_seed: [u8; 32] = rng.gen(); + + // let (account, seed) = miden_lib::accounts::faucets::create_basic_fungible_faucet( + // init_seed, + // token_symbol, + // decimals, + // Felt::try_from(max_supply.to_le_bytes().as_slice()) + // .expect("u64 can be safely converted to a field element"), + // auth_scheme, + // )?; + + // self.insert_account(&account, Some(seed), &AuthInfo::RpoFalcon512(key_pair))?; + // Ok((account, seed)) + + "Called new_fungible_faucet".to_string() + } +} diff --git a/wasm/src/native_code/mod.rs b/wasm/src/native_code/mod.rs new file mode 100644 index 000000000..4c3345ce7 --- /dev/null +++ b/wasm/src/native_code/mod.rs @@ -0,0 +1,26 @@ +pub mod accounts; + +pub mod store; +use store::Store; + +pub mod rpc; +use rpc::NodeRpcClient; + +// Hoping that eventually we can use the generic store type defined in client/mod.rs. +// For now, wanted to play around with creating a client with a WebStore implementation +// (instead of a SQLite implementation) and getting an underlying store method to execute +// in the browser. + +// TODO: Remove pub from store field +// TODO: Add back generic type for NodeRpcClient and get example working in browser +// TODO: Add back generic type for DataStore and get example working in browser +pub struct Client { + pub store: S, + pub rpc_api: N +} + +impl Client { + pub fn new(api: N, store: S) -> Self { + Self { rpc_api: api, store } + } +} \ No newline at end of file diff --git a/wasm/src/native_code/rpc/mod.rs b/wasm/src/native_code/rpc/mod.rs new file mode 100644 index 000000000..3df6f465f --- /dev/null +++ b/wasm/src/native_code/rpc/mod.rs @@ -0,0 +1,7 @@ +use async_trait::async_trait; + +#[async_trait(?Send)] +pub trait NodeRpcClient { + // Test RPC method to be implemented by the client + async fn test_rpc(&mut self) -> Result<(), ()>; +} \ No newline at end of file diff --git a/wasm/src/native_code/store/mod.rs b/wasm/src/native_code/store/mod.rs new file mode 100644 index 000000000..f024394b3 --- /dev/null +++ b/wasm/src/native_code/store/mod.rs @@ -0,0 +1,75 @@ +// use miden_objects::{ +// accounts::Account, +// crypto::dsa::rpo_falcon512::KeyPair, +// Word, +// }; +// use miden_tx::utils::{ByteReader, ByteWriter, Deserializable, DeserializationError, Serializable}; + +use async_trait::async_trait; + +// Hoping that eventually, we can use the generic store type defined in client/store/mod.rs. +// Might need to add conditional rendering to add async_trait to the trait definitions? +// Or maybe we can just add it to the trait definitions and it will work for both the CLI and the browser? +// Basically, can we keep the generic Client definition and the Store trait definitions the same +// and add what we need for the browser-specific implementation +#[async_trait(?Send)] +pub trait Store { + async fn insert_string( + &mut self, + data: String + ) -> Result<(), ()>; + + // async fn insert_account( + // &mut self, + // account: &Account, + // account_seed: Option, + // auth_info: &AuthInfo, + // ) -> Result<(), ()>; +} + +// DATABASE AUTH INFO +// ================================================================================================ + +// #[derive(Debug)] +// pub enum AuthInfo { +// RpoFalcon512(KeyPair), +// } + +// const RPO_FALCON512_AUTH: u8 = 0; + +// impl AuthInfo { +// /// Returns byte identifier of specific AuthInfo +// const fn type_byte(&self) -> u8 { +// match self { +// AuthInfo::RpoFalcon512(_) => RPO_FALCON512_AUTH, +// } +// } +// } + +// impl Serializable for AuthInfo { +// fn write_into( +// &self, +// target: &mut W, +// ) { +// let mut bytes = vec![self.type_byte()]; +// match self { +// AuthInfo::RpoFalcon512(key_pair) => { +// bytes.append(&mut key_pair.to_bytes()); +// target.write_bytes(&bytes); +// }, +// } +// } +// } + +// impl Deserializable for AuthInfo { +// fn read_from(source: &mut R) -> Result { +// let auth_type: u8 = source.read_u8()?; +// match auth_type { +// RPO_FALCON512_AUTH => { +// let key_pair = KeyPair::read_from(source)?; +// Ok(AuthInfo::RpoFalcon512(key_pair)) +// }, +// val => Err(DeserializationError::InvalidValue(val.to_string())), +// } +// } +// } \ No newline at end of file diff --git a/wasm/src/web_client/account.rs b/wasm/src/web_client/account.rs new file mode 100644 index 000000000..dda50e69b --- /dev/null +++ b/wasm/src/web_client/account.rs @@ -0,0 +1,108 @@ +use super::WebClient; + +use crate::native_code::accounts; +use crate::native_code::rpc::NodeRpcClient; +use crate::native_code::store::Store; + +use serde::{Serialize, Deserialize}; +use serde_wasm_bindgen::from_value; +use wasm_bindgen::prelude::*; +use web_sys::console; + +#[derive(Serialize, Deserialize)] +#[serde(tag = "type")] +pub enum AccountTemplate { + BasicImmutable, + BasicMutable, + FungibleFaucet { + //token_symbol: TokenSymbol, + decimals: u8, + max_supply: u64 + }, + NonFungibleFaucet, +} + +// Account functions to be exposed to the JavaScript environment +// For now, just a simple function that calls an underlying store method +// and inserts a string to the indexedDB store. Also tests out a simple +// RPC call. +#[wasm_bindgen] +impl WebClient { + pub async fn fake_new_account(&mut self) -> Result { + if let Some(ref mut client) = self.get_mut_inner() { + let _ = client.store.insert_string("New account created".to_string()).await + .map(|_| JsValue::from_str("Account created successfully")) + .map_err(|_| JsValue::from_str("Failed to create new account")); + + client.rpc_api.test_rpc().await // This is the new line + .map(|_| JsValue::from_str("RPC call successful")) + .map_err(|_| JsValue::from_str("RPC call failed")) + } else { + Err(JsValue::from_str("Client not initialized")) + } + } + + pub async fn new_account( + &mut self, + template: JsValue + ) -> () { + if let Some(ref mut client) = self.get_mut_inner() { + let account_template_result: Result = from_value(template); + match account_template_result { + Ok(account_template) => { + let client_template = match account_template { + AccountTemplate::BasicImmutable => accounts::AccountTemplate::BasicWallet { + mutable_code: false, + storage_mode: accounts::AccountStorageMode::Local, + }, + AccountTemplate::BasicMutable => accounts::AccountTemplate::BasicWallet { + mutable_code: true, + storage_mode: accounts::AccountStorageMode::Local, + }, + AccountTemplate::FungibleFaucet { + //token_symbol, + decimals, + max_supply, + } => accounts::AccountTemplate::FungibleFaucet { + // token_symbol: TokenSymbol::new(token_symbol) + // .map_err(|err| format!("error: token symbol is invalid: {}", err))?, + decimals: decimals, + max_supply: max_supply, + storage_mode: accounts::AccountStorageMode::Local, + }, + AccountTemplate::NonFungibleFaucet => todo!(), + }; + + // TODO: uncomment this when the Falcon library Rust implementation + // is completed by the miden team + + // match client.new_account(client_template).await { + // Ok((account, word)) => { + // // Create a struct or tuple to hold both values + // let result = (account, word); + // // Convert directly to JsValue + // serde_wasm_bindgen::to_value(&result).map_err(|e| JsValue::from_str(&e.to_string())) + // }, + // Err(err) => Err(JsValue::from_str(&err)), + // } + + // TODO: remove this when the Falcon library Rust implementation + // is completed by the miden team + + let message = client.new_account(client_template).await; + let js_value_message = JsValue::from_str(&message); + + // Print the message to the Chrome console + console::log_1(&js_value_message); + }, + Err(e) => { + // Error handling: log the error message to the browser's console + let error_message = format!("Failed to parse AccountTemplate: {:?}", e); + console::error_1(&error_message.into()); + } + } + } else { + console::error_1(&"Client not initialized".into()); + } + } +} \ No newline at end of file diff --git a/wasm/src/web_client/mod.rs b/wasm/src/web_client/mod.rs new file mode 100644 index 000000000..57f19d034 --- /dev/null +++ b/wasm/src/web_client/mod.rs @@ -0,0 +1,42 @@ +pub mod account; +pub mod store; +pub mod web_rpc_client; + +use store::WebStore; +use web_rpc_client::WebRpcClient; + +use crate::native_code::Client; + +use wasm_bindgen::prelude::*; + +// My strategy here is to create a WebClient struct that has methods exposed +// to the browser environment. When these methods are called, they will +// use the inner client to execute the proper code and store methods. + +#[wasm_bindgen] +pub struct WebClient { + inner: Option> +} + +#[wasm_bindgen] +impl WebClient { + #[wasm_bindgen(constructor)] + pub fn new() -> Self { + WebClient { inner: None } + } + + // Getter for the inner client, used internally for operations + pub(crate) fn get_mut_inner(&mut self) -> Option<&mut Client> { + self.inner.as_mut() + } + + // Exposed method to JS to create an internal client + pub async fn create_client(&mut self) -> Result { + let web_store = WebStore::new().await.map_err(|_| JsValue::from_str("Failed to initialize WebStore"))?; + let web_rpc_client = WebRpcClient::new("http://localhost:57291"); + + self.inner = Some(Client::new(web_rpc_client, web_store)); + + Ok(JsValue::from_str("Client created successfully")) + } +} \ No newline at end of file diff --git a/wasm/src/web_client/store/mod.rs b/wasm/src/web_client/store/mod.rs new file mode 100644 index 000000000..afed9c4a0 --- /dev/null +++ b/wasm/src/web_client/store/mod.rs @@ -0,0 +1,218 @@ +use crate::native_code::store::Store; + +use wasm_bindgen::prelude::*; +use wasm_bindgen_futures::*; + +use async_trait::async_trait; + +#[wasm_bindgen(module = "/js/db-operations.js")] +extern "C" { + #[wasm_bindgen(js_name = setupIndexedDB)] + fn setup_indexed_db() -> js_sys::Promise; + + #[wasm_bindgen(js_name = insertGreeting)] + fn insert_greeting(greeting: String) -> js_sys::Promise; + + #[wasm_bindgen(js_name = insertAccountCode)] + fn insert_account_code_web(code_root: String, code: String, module: Vec) -> js_sys::Promise; + + #[wasm_bindgen(js_name = insertAccountStorage)] + fn insert_account_storage_web(storage_roots: String, storage_slots: Vec) -> js_sys::Promise; + + #[wasm_bindgen(js_name = insertAccountAssetVault)] + fn insert_account_asset_vault_web(vault_root: String, assets: String) -> js_sys::Promise; + + #[wasm_bindgen(js_name = insertAccountAuth)] + fn insert_account_auth_web(id: i64, auth_info: Vec) -> js_sys::Promise; + + #[wasm_bindgen(js_name = insertAccountRecord)] + fn insert_account_record_web(id: i64, code_root: String, storage_root: String, vault_root: String, nonce: i64, committed: bool, account_seed: Option>) -> js_sys::Promise; +} + +// TYPES + +type SerializedAccountCodeData = (String, String, Vec); +type SerializedAccountStorageData = (String, Vec); +type SerializedAccountVaultData = (String, String); +type SerializedAccountAuthData = (i64, Vec); +type SerializedAccountData = (i64, String, String, String, i64, bool); + +// ================================================================================================ + +pub struct WebStore {} + +impl WebStore { + pub async fn new() -> Result { + let _ = JsFuture::from(setup_indexed_db()).await; + Ok(WebStore {}) + } +} + +#[async_trait(?Send)] +impl Store for WebStore { + async fn insert_string( + &mut self, + data: String + ) -> Result<(), ()> { + let result = JsFuture::from(insert_greeting(data)).await; + match result { + Ok(_) => Ok(()), + Err(_) => Err(()), + } + } + + // async fn insert_account( + // &mut self, + // account: &Account, + // account_seed: Option, + // auth_info: &AuthInfo, + // ) -> Result<(), ()> { + // insert_account_code(account.code()).await?; + // insert_account_storage(account.storage()).await?; + // insert_account_asset_vault(account.vault()).await?; + // insert_account_record(account, account_seed).await?; + // insert_account_auth(account.id(), auth_info).await?; + + // Ok(()) + // } +} + +// async fn insert_account_code( +// account_code: &AccountCode +// ) -> Result<(), ()> { +// let (code_root, code, module) = serialize_account_code(account_code)?; +// let result = JsFuture::from(insert_account_code_web(code_root, code, module)).await; +// match result { +// Ok(_) => Ok(()), +// Err(_) => Err(()), +// } +// } + +// fn serialize_account_code( +// account_code: &AccountCode, +// ) -> Result { +// let root = account_code.root().to_string(); +// let procedures = match serde_json::to_string(account_code.procedures()) { +// Ok(procedures) => procedures, +// Err(_) => return Err(()), +// }; +// // Assuming to_bytes() returns a Result and handling its error similarly +// let module = match account_code.module().to_bytes(AstSerdeOptions { +// serialize_imports: true, +// }) { +// Ok(module) => module, +// Err(_) => return Err(()), +// }; + +// Ok((root, procedures, module)) +// } + +// async fn insert_account_storage( +// account_storage: &AccountStorage +// ) -> Result<(), ()> { +// let (storage_root, storage_slots) = serialize_account_storage(account_storage)?; +// let result = JsFuture::from(insert_account_storage_web(storage_root, storage_slots)).await; +// match result { +// Ok(_) => Ok(()), +// Err(_) => Err(()), +// } +// } + +// fn serialize_account_storage( +// account_storage: &AccountStorage, +// ) -> Result { +// let root = account_storage.root().to_string(); +// let storage = account_storage.to_bytes(); + +// Ok((root, storage)) +// } + +// async fn insert_account_asset_vault( +// asset_vault: &AssetVault +// ) -> Result<(), ()> { +// let (vault_root, assets) = serialize_account_asset_vault(asset_vault)?; +// let result = JsFuture::from(insert_account_asset_vault_web(vault_root, assets)).await; +// match result { +// Ok(_) => Ok(()), +// Err(_) => Err(()), +// } +// } + +// fn serialize_account_asset_vault( +// asset_vault: &AssetVault, +// ) -> Result { +// let root = match serde_json::to_string(&asset_vault.commitment()) { +// Ok(root) => root, +// Err(_) => return Err(()), +// }; +// let assets: Vec = asset_vault.assets().collect(); +// let assets = match serde_json::to_string(&assets) { +// Ok(assets) => assets, +// Err(_) => return Err(()), +// }; +// Ok((root, assets)) +// } + +// async fn insert_account_record( +// account: &Account, +// account_seed: Option, +// ) -> Result<(), ()> { +// let (id, code_root, storage_root, vault_root, nonce, committed) = serialize_account(account)?; +// let account_seed = account_seed.map(|seed| seed.to_bytes()); + +// let result = JsFuture::from(insert_account_record_web( +// id, +// code_root, +// storage_root, +// vault_root, +// nonce, +// committed, +// account_seed, +// )).await; +// match result { +// Ok(_) => Ok(()), +// Err(_) => Err(()), +// } +// } + +// fn serialize_account(account: &Account) -> Result { +// let id: u64 = account.id().into(); +// let code_root = account.code().root().to_string(); +// let storage_root = account.storage().root().to_string(); +// let vault_root = match serde_json::to_string(&account.vault().commitment()) { +// Ok(vault_root) => vault_root, +// Err(_) => return Err(()), +// }; +// let committed = account.is_on_chain(); +// let nonce = account.nonce().as_int() as i64; + +// Ok(( +// id as i64, +// code_root, +// storage_root, +// vault_root, +// nonce, +// committed, +// )) +// } + +// async fn insert_account_auth( +// account_id: AccountId, +// auth_info: &AuthInfo, +// ) -> Result<(), ()> { +// let (account_id, auth_info) = serialize_account_auth(account_id, auth_info)?; +// let result = JsFuture::from(insert_account_auth_web(account_id, auth_info)).await; +// match result { +// Ok(_) => Ok(()), +// Err(_) => Err(()), +// } +// } + +// fn serialize_account_auth( +// account_id: AccountId, +// auth_info: &AuthInfo, +// ) -> Result { +// let account_id: u64 = account_id.into(); +// let auth_info = auth_info.to_bytes(); +// Ok((account_id as i64, auth_info)) +// } \ No newline at end of file diff --git a/wasm/src/web_client/web_rpc_client.rs b/wasm/src/web_client/web_rpc_client.rs new file mode 100644 index 000000000..245eeec15 --- /dev/null +++ b/wasm/src/web_client/web_rpc_client.rs @@ -0,0 +1,32 @@ +use crate::native_code::rpc::NodeRpcClient; + +use async_trait::async_trait; +use wasm_bindgen::prelude::*; + +#[wasm_bindgen(module = "/js/web-rpc-client.js")] +extern "C" { + #[wasm_bindgen(js_name = testRpc)] + async fn test_rpc(endpoint: String) -> JsValue; // Directly return JsValue +} + +pub struct WebRpcClient { + endpoint: String +} + +impl WebRpcClient { + pub fn new(endpoint: &str) -> Self { + Self { + endpoint: endpoint.to_string() + } + } +} + +#[async_trait(?Send)] +impl NodeRpcClient for WebRpcClient { + async fn test_rpc(&mut self) -> Result<(), ()> { + let result = test_rpc(self.endpoint.clone()).await; // This now directly returns a JsValue + match result { + _ => Ok(()), // Treat any result as success; adjust as needed for actual error handling + } + } +} \ No newline at end of file diff --git a/wasm/test.html b/wasm/test.html index 3d3075817..38489b74d 100644 --- a/wasm/test.html +++ b/wasm/test.html @@ -2,20 +2,47 @@ - WASM Greet Example + WASM Example \ No newline at end of file From 749a746e0deeef6fa065bd254bf69360e2800315 Mon Sep 17 00:00:00 2001 From: John Stephens Date: Tue, 26 Mar 2024 08:14:07 -0700 Subject: [PATCH 03/42] Add testing website (#2) * Add testing website for miden wasm * Translate schema into dexie * Working greet * More changes * revert change to file * Use dennis changes --- wasm/src/lib.rs | 41 +- website/.eslintrc.json | 3 + website/.gitignore | 36 + website/README.md | 36 + website/next.config.mjs | 16 + website/package.json | 31 + website/postcss.config.js | 6 + website/public/next.svg | 1 + website/public/vercel.svg | 1 + website/src/app/accounts/page.tsx | 3 + website/src/app/favicon.ico | Bin 0 -> 25931 bytes website/src/app/globals.css | 33 + website/src/app/layout.tsx | 35 + website/src/app/notes/page.tsx | 21 + website/src/app/page.tsx | 15 + website/src/app/transactions/page.tsx | 3 + website/src/components/defaultLayout.tsx | 10 + website/src/components/hooks/useWasm.ts | 15 + website/src/components/sidebar.tsx | 47 + website/src/lib/db.ts | 50 + website/src/lib/dbTypes.ts | 85 + website/tailwind.config.ts | 20 + website/tsconfig.json | 26 + website/yarn.lock | 2761 ++++++++++++++++++++++ 24 files changed, 3293 insertions(+), 2 deletions(-) create mode 100644 website/.eslintrc.json create mode 100644 website/.gitignore create mode 100644 website/README.md create mode 100644 website/next.config.mjs create mode 100644 website/package.json create mode 100644 website/postcss.config.js create mode 100644 website/public/next.svg create mode 100644 website/public/vercel.svg create mode 100644 website/src/app/accounts/page.tsx create mode 100644 website/src/app/favicon.ico create mode 100644 website/src/app/globals.css create mode 100644 website/src/app/layout.tsx create mode 100644 website/src/app/notes/page.tsx create mode 100644 website/src/app/page.tsx create mode 100644 website/src/app/transactions/page.tsx create mode 100644 website/src/components/defaultLayout.tsx create mode 100644 website/src/components/hooks/useWasm.ts create mode 100644 website/src/components/sidebar.tsx create mode 100644 website/src/lib/db.ts create mode 100644 website/src/lib/dbTypes.ts create mode 100644 website/tailwind.config.ts create mode 100644 website/tsconfig.json create mode 100644 website/yarn.lock diff --git a/wasm/src/lib.rs b/wasm/src/lib.rs index 95f63fa10..a483c1a95 100644 --- a/wasm/src/lib.rs +++ b/wasm/src/lib.rs @@ -3,13 +3,50 @@ pub mod web_client; use wasm_bindgen::prelude::*; use wasm_bindgen_futures::*; +use web_sys::console; + +pub trait MyTrait { + fn do_something(&self); +} + +#[wasm_bindgen] +extern "C" { + pub type JsImplementor; + + #[wasm_bindgen(method)] + fn do_something(this: &JsImplementor); +} + + +#[wasm_bindgen] +pub struct MyTraitImplementor { + js_implementor: JsImplementor, +} + +#[wasm_bindgen] +impl MyTraitImplementor { + pub fn new(js_implementor: JsImplementor) -> Self { + Self { js_implementor } + } +} + +impl MyTrait for MyTraitImplementor { + fn do_something(&self) { + self.js_implementor.do_something(); + } +} #[wasm_bindgen] pub fn greet() { - alert("Hello, World!"); + unsafe { alert("Hello, World!") }; +} + +#[wasm_bindgen] +pub fn greet2() { + unsafe { console::log_1(&"Hello, World!".into()) }; } #[wasm_bindgen] extern "C" { - fn alert(s: &str); + fn alert(s: &str); } \ No newline at end of file diff --git a/website/.eslintrc.json b/website/.eslintrc.json new file mode 100644 index 000000000..bffb357a7 --- /dev/null +++ b/website/.eslintrc.json @@ -0,0 +1,3 @@ +{ + "extends": "next/core-web-vitals" +} diff --git a/website/.gitignore b/website/.gitignore new file mode 100644 index 000000000..fd3dbb571 --- /dev/null +++ b/website/.gitignore @@ -0,0 +1,36 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js +.yarn/install-state.gz + +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# local env files +.env*.local + +# vercel +.vercel + +# typescript +*.tsbuildinfo +next-env.d.ts diff --git a/website/README.md b/website/README.md new file mode 100644 index 000000000..c4033664f --- /dev/null +++ b/website/README.md @@ -0,0 +1,36 @@ +This is a [Next.js](https://nextjs.org/) project bootstrapped with [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app). + +## Getting Started + +First, run the development server: + +```bash +npm run dev +# or +yarn dev +# or +pnpm dev +# or +bun dev +``` + +Open [http://localhost:3000](http://localhost:3000) with your browser to see the result. + +You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file. + +This project uses [`next/font`](https://nextjs.org/docs/basic-features/font-optimization) to automatically optimize and load Inter, a custom Google Font. + +## Learn More + +To learn more about Next.js, take a look at the following resources: + +- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API. +- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial. + +You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js/) - your feedback and contributions are welcome! + +## Deploy on Vercel + +The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js. + +Check out our [Next.js deployment documentation](https://nextjs.org/docs/deployment) for more details. diff --git a/website/next.config.mjs b/website/next.config.mjs new file mode 100644 index 000000000..38f7a2a12 --- /dev/null +++ b/website/next.config.mjs @@ -0,0 +1,16 @@ +/** @type {import('next').NextConfig} */ +const nextConfig = { + webpack: (config, { isServer }) => { + if (!isServer) { + config.experiments = { + ...config.experiments, + asyncWebAssembly: true, + syncWebAssembly: true, + topLevelAwait: true, + } + } + return config; + } +}; + +export default nextConfig; diff --git a/website/package.json b/website/package.json new file mode 100644 index 000000000..e5b614a1f --- /dev/null +++ b/website/package.json @@ -0,0 +1,31 @@ +{ + "name": "website", + "version": "0.1.0", + "private": true, + "scripts": { + "preinstall": "cd ../wasm && wasm-pack build --target web", + "dev": "next dev", + "build": "next build", + "start": "next start", + "lint": "next lint" + }, + "dependencies": { + "@wasm": "file:../wasm/pkg", + "dexie": "^3.2.7", + "dexie-react-hooks": "^1.1.7", + "next": "14.1.4", + "react": "^18", + "react-dom": "^18" + }, + "devDependencies": { + "@types/node": "^20", + "@types/react": "^18", + "@types/react-dom": "^18", + "autoprefixer": "^10.0.1", + "eslint": "^8", + "eslint-config-next": "14.1.4", + "postcss": "^8", + "tailwindcss": "^3.3.0", + "typescript": "^5" + } +} diff --git a/website/postcss.config.js b/website/postcss.config.js new file mode 100644 index 000000000..12a703d90 --- /dev/null +++ b/website/postcss.config.js @@ -0,0 +1,6 @@ +module.exports = { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +}; diff --git a/website/public/next.svg b/website/public/next.svg new file mode 100644 index 000000000..5174b28c5 --- /dev/null +++ b/website/public/next.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/website/public/vercel.svg b/website/public/vercel.svg new file mode 100644 index 000000000..d2f842227 --- /dev/null +++ b/website/public/vercel.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/website/src/app/accounts/page.tsx b/website/src/app/accounts/page.tsx new file mode 100644 index 000000000..2bc97edfc --- /dev/null +++ b/website/src/app/accounts/page.tsx @@ -0,0 +1,3 @@ +export default function Account() { + return
This is the account page
+} \ No newline at end of file diff --git a/website/src/app/favicon.ico b/website/src/app/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..718d6fea4835ec2d246af9800eddb7ffb276240c GIT binary patch literal 25931 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 LrJugUA?W`A8`#=m literal 0 HcmV?d00001 diff --git a/website/src/app/globals.css b/website/src/app/globals.css new file mode 100644 index 000000000..875c01e81 --- /dev/null +++ b/website/src/app/globals.css @@ -0,0 +1,33 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +:root { + --foreground-rgb: 0, 0, 0; + --background-start-rgb: 214, 219, 220; + --background-end-rgb: 255, 255, 255; +} + +@media (prefers-color-scheme: dark) { + :root { + --foreground-rgb: 255, 255, 255; + --background-start-rgb: 0, 0, 0; + --background-end-rgb: 0, 0, 0; + } +} + +body { + color: rgb(var(--foreground-rgb)); + background: linear-gradient( + to bottom, + transparent, + rgb(var(--background-end-rgb)) + ) + rgb(var(--background-start-rgb)); +} + +@layer utilities { + .text-balance { + text-wrap: balance; + } +} diff --git a/website/src/app/layout.tsx b/website/src/app/layout.tsx new file mode 100644 index 000000000..c6f15090c --- /dev/null +++ b/website/src/app/layout.tsx @@ -0,0 +1,35 @@ +import type { Metadata } from "next"; +import { Inter } from "next/font/google"; +import "./globals.css"; +import Sidebar from "@/components/sidebar"; + +const inter = Inter({ subsets: ["latin"] }); + +export const metadata: Metadata = { + title: "Create Next App", + description: "Generated by create next app", +}; + +export function AppLayout({ children }: {children: React.ReactNode}) { +
+ +
{children}
+
+} + +export default function RootLayout({ + children, +}: Readonly<{ + children: React.ReactNode; +}>) { + return ( + + { +
+ +
{children}
+
+ } + + ); +} diff --git a/website/src/app/notes/page.tsx b/website/src/app/notes/page.tsx new file mode 100644 index 000000000..cfe72db5f --- /dev/null +++ b/website/src/app/notes/page.tsx @@ -0,0 +1,21 @@ + +'use client' +import { useWasm } from '@/components/hooks/useWasm'; +import init, * as wasm from '@wasm'; + +init(); + +export default function Notes() { + const wasm = useWasm(); + wasm?.greet2() + + return ( +
This is the notes page.
+ ) +} + +class MyJSClass { + doSomething() { + console.log("This is a JS class method"); + } +} \ No newline at end of file diff --git a/website/src/app/page.tsx b/website/src/app/page.tsx new file mode 100644 index 000000000..a5134e70f --- /dev/null +++ b/website/src/app/page.tsx @@ -0,0 +1,15 @@ +'use client' +import { useEffect } from "react"; +import { db } from "../lib/db"; + +export default function Home() { + useEffect(() => { + db.open() + }, []) + + return ( +
+

This website will serve as a testing site and demo of the Miden WASM

+
+ ); +} diff --git a/website/src/app/transactions/page.tsx b/website/src/app/transactions/page.tsx new file mode 100644 index 000000000..75f795eca --- /dev/null +++ b/website/src/app/transactions/page.tsx @@ -0,0 +1,3 @@ +export default function Transactions() { + return
This is the transactions page
+} \ No newline at end of file diff --git a/website/src/components/defaultLayout.tsx b/website/src/components/defaultLayout.tsx new file mode 100644 index 000000000..a8db73a2d --- /dev/null +++ b/website/src/components/defaultLayout.tsx @@ -0,0 +1,10 @@ +import Sidebar from "./sidebar"; + +const DefaultLayout = ({ children }: {children: React.ReactNode}) => ( +
+ +
{children}
+
+); + +export default DefaultLayout; \ No newline at end of file diff --git a/website/src/components/hooks/useWasm.ts b/website/src/components/hooks/useWasm.ts new file mode 100644 index 000000000..45d601064 --- /dev/null +++ b/website/src/components/hooks/useWasm.ts @@ -0,0 +1,15 @@ +import { useEffect, useState } from "react"; + +export const useWasm = () => { + const [wasm, setWasm] = useState(null); + + useEffect(() => { + if (wasm === null) { + import("@wasm").then((module) => { + module.default() + return setWasm(module) + }); + } + }, []); // eslint-disable-line react-hooks/exhaustive-deps + return wasm; +}; \ No newline at end of file diff --git a/website/src/components/sidebar.tsx b/website/src/components/sidebar.tsx new file mode 100644 index 000000000..9f168944f --- /dev/null +++ b/website/src/components/sidebar.tsx @@ -0,0 +1,47 @@ +import Link from "next/link"; + +const routes = { + gettingStarted: '/', + accounts: '/accounts', + notes: '/notes', + transactions: '/transactions' +}; + +const menuItems = [ + { + name: 'Getting Started', + href: routes.gettingStarted, + }, + { + name: 'Accounts', + href: routes.accounts, + }, + { + name: 'Notes', + href: routes.notes, + }, + { + name: 'Transactions', + href: routes.transactions, + } +]; + +type SidebarProps = { + className?: string; +}; + +export default function Sidebar({ className }: SidebarProps) { + return ( + + ); +} \ No newline at end of file diff --git a/website/src/lib/db.ts b/website/src/lib/db.ts new file mode 100644 index 000000000..d15158c27 --- /dev/null +++ b/website/src/lib/db.ts @@ -0,0 +1,50 @@ +import Dexie from "dexie"; +import { IAccount, IAccountAuth, IAccountCode, IAccountStorage, IAccountVault, ITransaction, ITransactionScript, IInputNote, IOutputNote, IStateSync, IBlockHeader, IChainMmrNode } from "./dbTypes"; + +export enum Table { + AccountCode = 'accountCode', + AccountStorage = 'accountStorage', + AccountVaults = 'accountVaults', + AccountAuth = 'accountAuth', + Accounts = 'accounts', + Transactions = 'transactions', + TransactionScripts = 'transactionScripts', + InputNotes = 'inputNotes', + OutputNotes = 'outputNotes', + StateSync = 'stateSync', + BlockHeaders = 'blockHeaders', + ChainMmrNodes = 'chainMmrNodes', +} + +export const db = new Dexie('MidenClientDB') +db.version(1).stores({ + [Table.AccountCode]: indexes('root'), + [Table.AccountStorage]: indexes('root'), + [Table.AccountVaults]: indexes('root'), + [Table.AccountAuth]: indexes('accountId'), + [Table.Accounts]: indexes('[id+nonce]', 'id', 'committed', 'codeRoot', 'storageRoot', 'vaultRoot'), + [Table.Transactions]: indexes('id', 'scriptHash', 'blockNum', 'commitHeight'), + [Table.TransactionScripts]: indexes('scriptHash'), + [Table.InputNotes]: indexes('noteId', 'recipient', 'status'), + [Table.OutputNotes]: indexes('noteId', 'recipient', 'status'), + [Table.StateSync]: indexes('blockNum'), + [Table.BlockHeaders]: indexes('blockNum', 'hasClientNotes'), + [Table.ChainMmrNodes]: indexes('id') +}); + +function indexes(...items: string[]) { + return items.join(','); +} + +export const accountCodes = db.table(Table.AccountCode); +export const accountStorages = db.table(Table.AccountStorage); +export const accountVaults = db.table(Table.AccountVaults); +export const accountAuths = db.table(Table.AccountAuth); +export const accounts = db.table(Table.Accounts); +export const transactions = db.table(Table.Transactions); +export const transactionScripts = db.table(Table.TransactionScripts); +export const inputNotes = db.table(Table.InputNotes); +export const outputNotes = db.table(Table.OutputNotes); +export const stateSync = db.table(Table.StateSync); +export const blockHeaders = db.table(Table.BlockHeaders); +export const chainMmrNodes = db.table(Table.ChainMmrNodes); diff --git a/website/src/lib/dbTypes.ts b/website/src/lib/dbTypes.ts new file mode 100644 index 000000000..d280f5b0a --- /dev/null +++ b/website/src/lib/dbTypes.ts @@ -0,0 +1,85 @@ +export interface IAccountCode { + root: Blob; + procedures: Blob; + module: Blob; +} + +export interface IAccountStorage { + root: Blob; + slots: Blob; +} + +export interface IAccountVault { + root: Blob; + assets: Blob; +} + +export interface IAccountAuth { + accountId: bigint; + authInfo: Blob; +} + +export interface IAccount { + id: bigint; + codeRoot: Blob; + storageRoot: Blob; + vaultRoot: Blob; + nonce: bigint; + committed: boolean; + accountSeed: Blob; +} + +export interface ITransaction { + id: Blob; + accountId: bigint; + initAccountState: Blob; + finalAccountState: Blob; + inputNotes: Blob; + outputNotes: Blob; + scriptHash: Blob; + scriptInputs: Blob; + blockNum: bigint; + commitHeight: bigint; +} + +export interface ITransactionScript { + scriptHash: Blob; + program: Blob; +} + +export interface IInputNote { + noteId: Blob; + recipient: Blob; + assets: Blob; + status: string; + inclusionProof: string; + metadata: Blob; + details: string; +} + +export interface IOutputNote { + noteId: Blob; + recipient: Blob; + assets: Blob; + status: string; + inclusionProof: string; + metadata: Blob; + details: string; +} + +export interface IStateSync { + blockNum: bigint; + tags: Blob; +} + +export interface IBlockHeader { + blockNum: bigint; + header: Blob; + chainMmrPeaks: Blob; + hasClientNotes: boolean; +} + +export interface IChainMmrNode { + id: bigint; + node: Blob; +} \ No newline at end of file diff --git a/website/tailwind.config.ts b/website/tailwind.config.ts new file mode 100644 index 000000000..e9a0944e7 --- /dev/null +++ b/website/tailwind.config.ts @@ -0,0 +1,20 @@ +import type { Config } from "tailwindcss"; + +const config: Config = { + content: [ + "./src/pages/**/*.{js,ts,jsx,tsx,mdx}", + "./src/components/**/*.{js,ts,jsx,tsx,mdx}", + "./src/app/**/*.{js,ts,jsx,tsx,mdx}", + ], + theme: { + extend: { + backgroundImage: { + "gradient-radial": "radial-gradient(var(--tw-gradient-stops))", + "gradient-conic": + "conic-gradient(from 180deg at 50% 50%, var(--tw-gradient-stops))", + }, + }, + }, + plugins: [], +}; +export default config; diff --git a/website/tsconfig.json b/website/tsconfig.json new file mode 100644 index 000000000..7b2858930 --- /dev/null +++ b/website/tsconfig.json @@ -0,0 +1,26 @@ +{ + "compilerOptions": { + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "noEmit": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "bundler", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "preserve", + "incremental": true, + "plugins": [ + { + "name": "next" + } + ], + "paths": { + "@/*": ["./src/*"] + } + }, + "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], + "exclude": ["node_modules"] +} diff --git a/website/yarn.lock b/website/yarn.lock new file mode 100644 index 000000000..14fafef43 --- /dev/null +++ b/website/yarn.lock @@ -0,0 +1,2761 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@aashutoshrathi/word-wrap@^1.2.3": + version "1.2.6" + resolved "https://registry.yarnpkg.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz#bd9154aec9983f77b3a034ecaa015c2e4201f6cf" + integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== + +"@alloc/quick-lru@^5.2.0": + version "5.2.0" + resolved "https://registry.yarnpkg.com/@alloc/quick-lru/-/quick-lru-5.2.0.tgz#7bf68b20c0a350f936915fcae06f58e32007ce30" + integrity sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw== + +"@babel/runtime@^7.23.2": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.1.tgz#431f9a794d173b53720e69a6464abc6f0e2a5c57" + integrity sha512-+BIznRzyqBf+2wCTxcKE3wDjfGeCoVE61KSHGpkzqrLi8qxqFwBeUFyId2cxkTmm55fzDGnm0+yCxaxygrLUnQ== + dependencies: + regenerator-runtime "^0.14.0" + +"@eslint-community/eslint-utils@^4.2.0": + version "4.4.0" + resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" + integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== + dependencies: + eslint-visitor-keys "^3.3.0" + +"@eslint-community/regexpp@^4.6.1": + version "4.10.0" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.10.0.tgz#548f6de556857c8bb73bbee70c35dc82a2e74d63" + integrity sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA== + +"@eslint/eslintrc@^2.1.4": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz#388a269f0f25c1b6adc317b5a2c55714894c70ad" + integrity sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ== + dependencies: + ajv "^6.12.4" + debug "^4.3.2" + espree "^9.6.0" + globals "^13.19.0" + ignore "^5.2.0" + import-fresh "^3.2.1" + js-yaml "^4.1.0" + minimatch "^3.1.2" + strip-json-comments "^3.1.1" + +"@eslint/js@8.57.0": + version "8.57.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.0.tgz#a5417ae8427873f1dd08b70b3574b453e67b5f7f" + integrity sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g== + +"@humanwhocodes/config-array@^0.11.14": + version "0.11.14" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.14.tgz#d78e481a039f7566ecc9660b4ea7fe6b1fec442b" + integrity sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg== + dependencies: + "@humanwhocodes/object-schema" "^2.0.2" + debug "^4.3.1" + minimatch "^3.0.5" + +"@humanwhocodes/module-importer@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" + integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== + +"@humanwhocodes/object-schema@^2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz#d9fae00a2d5cb40f92cfe64b47ad749fbc38f917" + integrity sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw== + +"@isaacs/cliui@^8.0.2": + version "8.0.2" + resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" + integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== + dependencies: + string-width "^5.1.2" + string-width-cjs "npm:string-width@^4.2.0" + strip-ansi "^7.0.1" + strip-ansi-cjs "npm:strip-ansi@^6.0.1" + wrap-ansi "^8.1.0" + wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" + +"@jridgewell/gen-mapping@^0.3.2": + version "0.3.5" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz#dcce6aff74bdf6dad1a95802b69b04a2fcb1fb36" + integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg== + dependencies: + "@jridgewell/set-array" "^1.2.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.24" + +"@jridgewell/resolve-uri@^3.1.0": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" + integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== + +"@jridgewell/set-array@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" + integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== + +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": + version "1.4.15" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" + integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== + +"@jridgewell/trace-mapping@^0.3.24": + version "0.3.25" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" + integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== + dependencies: + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" + +"@next/env@14.1.4": + version "14.1.4" + resolved "https://registry.yarnpkg.com/@next/env/-/env-14.1.4.tgz#432e80651733fbd67230bf262aee28be65252674" + integrity sha512-e7X7bbn3Z6DWnDi75UWn+REgAbLEqxI8Tq2pkFOFAMpWAWApz/YCUhtWMWn410h8Q2fYiYL7Yg5OlxMOCfFjJQ== + +"@next/eslint-plugin-next@14.1.4": + version "14.1.4" + resolved "https://registry.yarnpkg.com/@next/eslint-plugin-next/-/eslint-plugin-next-14.1.4.tgz#d7372b5ffede0e466af8af2ff534386418827fc8" + integrity sha512-n4zYNLSyCo0Ln5b7qxqQeQ34OZKXwgbdcx6kmkQbywr+0k6M3Vinft0T72R6CDAcDrne2IAgSud4uWCzFgc5HA== + dependencies: + glob "10.3.10" + +"@next/swc-darwin-arm64@14.1.4": + version "14.1.4" + resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.1.4.tgz#a3bca0dc4393ac4cf3169bbf24df63441de66bb7" + integrity sha512-ubmUkbmW65nIAOmoxT1IROZdmmJMmdYvXIe8211send9ZYJu+SqxSnJM4TrPj9wmL6g9Atvj0S/2cFmMSS99jg== + +"@next/swc-darwin-x64@14.1.4": + version "14.1.4" + resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-14.1.4.tgz#ba3683d4e2d30099f3f2864dd7349a4d9f440140" + integrity sha512-b0Xo1ELj3u7IkZWAKcJPJEhBop117U78l70nfoQGo4xUSvv0PJSTaV4U9xQBLvZlnjsYkc8RwQN1HoH/oQmLlQ== + +"@next/swc-linux-arm64-gnu@14.1.4": + version "14.1.4" + resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.1.4.tgz#3519969293f16379954b7e196deb0c1eecbb2f8b" + integrity sha512-457G0hcLrdYA/u1O2XkRMsDKId5VKe3uKPvrKVOyuARa6nXrdhJOOYU9hkKKyQTMru1B8qEP78IAhf/1XnVqKA== + +"@next/swc-linux-arm64-musl@14.1.4": + version "14.1.4" + resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.1.4.tgz#4bb3196bd402b3f84cf5373ff1021f547264d62f" + integrity sha512-l/kMG+z6MB+fKA9KdtyprkTQ1ihlJcBh66cf0HvqGP+rXBbOXX0dpJatjZbHeunvEHoBBS69GYQG5ry78JMy3g== + +"@next/swc-linux-x64-gnu@14.1.4": + version "14.1.4" + resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.1.4.tgz#1b3372c98c83dcdab946cdb4ee06e068b8139ba3" + integrity sha512-BapIFZ3ZRnvQ1uWbmqEGJuPT9cgLwvKtxhK/L2t4QYO7l+/DxXuIGjvp1x8rvfa/x1FFSsipERZK70pewbtJtw== + +"@next/swc-linux-x64-musl@14.1.4": + version "14.1.4" + resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.1.4.tgz#8459088bdc872648ff78f121db596f2533df5808" + integrity sha512-mqVxTwk4XuBl49qn2A5UmzFImoL1iLm0KQQwtdRJRKl21ylQwwGCxJtIYo2rbfkZHoSKlh/YgztY0qH3wG1xIg== + +"@next/swc-win32-arm64-msvc@14.1.4": + version "14.1.4" + resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.1.4.tgz#84280a08c00cc3be24ddd3a12f4617b108e6dea6" + integrity sha512-xzxF4ErcumXjO2Pvg/wVGrtr9QQJLk3IyQX1ddAC/fi6/5jZCZ9xpuL9Tzc4KPWMFq8GGWFVDMshZOdHGdkvag== + +"@next/swc-win32-ia32-msvc@14.1.4": + version "14.1.4" + resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.1.4.tgz#23ff7f4bd0a27177428669ef6fa5c3923c738031" + integrity sha512-WZiz8OdbkpRw6/IU/lredZWKKZopUMhcI2F+XiMAcPja0uZYdMTZQRoQ0WZcvinn9xZAidimE7tN9W5v9Yyfyw== + +"@next/swc-win32-x64-msvc@14.1.4": + version "14.1.4" + resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.1.4.tgz#bccf5beccfde66d6c66fa4e2509118c796385eda" + integrity sha512-4Rto21sPfw555sZ/XNLqfxDUNeLhNYGO2dlPqsnuCg8N8a2a9u1ltqBOPQ4vj1Gf7eJC0W2hHG2eYUHuiXgY2w== + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": + version "1.2.8" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@pkgjs/parseargs@^0.11.0": + version "0.11.0" + resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" + integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== + +"@rushstack/eslint-patch@^1.3.3": + version "1.8.0" + resolved "https://registry.yarnpkg.com/@rushstack/eslint-patch/-/eslint-patch-1.8.0.tgz#c5545e6a5d2bd5c26b4021c357177a28698c950e" + integrity sha512-0HejFckBN2W+ucM6cUOlwsByTKt9/+0tWhqUffNIcHqCXkthY/mZ7AuYPK/2IIaGWhdl0h+tICDO0ssLMd6XMQ== + +"@swc/helpers@0.5.2": + version "0.5.2" + resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.5.2.tgz#85ea0c76450b61ad7d10a37050289eded783c27d" + integrity sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw== + dependencies: + tslib "^2.4.0" + +"@types/json5@^0.0.29": + version "0.0.29" + resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" + integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== + +"@types/node@^20": + version "20.11.30" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.11.30.tgz#9c33467fc23167a347e73834f788f4b9f399d66f" + integrity sha512-dHM6ZxwlmuZaRmUPfv1p+KrdD1Dci04FbdEm/9wEMouFqxYoFl5aMkt0VMAUtYRQDyYvD41WJLukhq/ha3YuTw== + dependencies: + undici-types "~5.26.4" + +"@types/prop-types@*": + version "15.7.11" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.11.tgz#2596fb352ee96a1379c657734d4b913a613ad563" + integrity sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng== + +"@types/react-dom@^18": + version "18.2.22" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.2.22.tgz#d332febf0815403de6da8a97e5fe282cbe609bae" + integrity sha512-fHkBXPeNtfvri6gdsMYyW+dW7RXFo6Ad09nLFK0VQWR7yGLai/Cyvyj696gbwYvBnhGtevUG9cET0pmUbMtoPQ== + dependencies: + "@types/react" "*" + +"@types/react@*", "@types/react@^18": + version "18.2.67" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.67.tgz#96b7af0b5e79c756f4bdd981de2ca28472c858e5" + integrity sha512-vkIE2vTIMHQ/xL0rgmuoECBCkZFZeHr49HeWSc24AptMbNRo7pwSBvj73rlJJs9fGKj0koS+V7kQB1jHS0uCgw== + dependencies: + "@types/prop-types" "*" + "@types/scheduler" "*" + csstype "^3.0.2" + +"@types/scheduler@*": + version "0.16.8" + resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.8.tgz#ce5ace04cfeabe7ef87c0091e50752e36707deff" + integrity sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A== + +"@typescript-eslint/parser@^5.4.2 || ^6.0.0": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-6.21.0.tgz#af8fcf66feee2edc86bc5d1cf45e33b0630bf35b" + integrity sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ== + dependencies: + "@typescript-eslint/scope-manager" "6.21.0" + "@typescript-eslint/types" "6.21.0" + "@typescript-eslint/typescript-estree" "6.21.0" + "@typescript-eslint/visitor-keys" "6.21.0" + debug "^4.3.4" + +"@typescript-eslint/scope-manager@6.21.0": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz#ea8a9bfc8f1504a6ac5d59a6df308d3a0630a2b1" + integrity sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg== + dependencies: + "@typescript-eslint/types" "6.21.0" + "@typescript-eslint/visitor-keys" "6.21.0" + +"@typescript-eslint/types@6.21.0": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-6.21.0.tgz#205724c5123a8fef7ecd195075fa6e85bac3436d" + integrity sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg== + +"@typescript-eslint/typescript-estree@6.21.0": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz#c47ae7901db3b8bddc3ecd73daff2d0895688c46" + integrity sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ== + dependencies: + "@typescript-eslint/types" "6.21.0" + "@typescript-eslint/visitor-keys" "6.21.0" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + minimatch "9.0.3" + semver "^7.5.4" + ts-api-utils "^1.0.1" + +"@typescript-eslint/visitor-keys@6.21.0": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz#87a99d077aa507e20e238b11d56cc26ade45fe47" + integrity sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A== + dependencies: + "@typescript-eslint/types" "6.21.0" + eslint-visitor-keys "^3.4.1" + +"@ungap/structured-clone@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" + integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== + +"@wasm@file:../wasm/pkg": + version "1.0.0" + +acorn-jsx@^5.3.2: + version "5.3.2" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + +acorn@^8.9.0: + version "8.11.3" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a" + integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== + +ajv@^6.12.4: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-regex@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" + integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +ansi-styles@^6.1.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" + integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== + +any-promise@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" + integrity sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A== + +anymatch@~3.1.2: + version "3.1.3" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +arg@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/arg/-/arg-5.0.2.tgz#c81433cc427c92c4dcf4865142dbca6f15acd59c" + integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg== + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +aria-query@^5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.3.0.tgz#650c569e41ad90b51b3d7df5e5eed1c7549c103e" + integrity sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A== + dependencies: + dequal "^2.0.3" + +array-buffer-byte-length@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz#1e5583ec16763540a27ae52eed99ff899223568f" + integrity sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg== + dependencies: + call-bind "^1.0.5" + is-array-buffer "^3.0.4" + +array-includes@^3.1.6, array-includes@^3.1.7: + version "3.1.8" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.8.tgz#5e370cbe172fdd5dd6530c1d4aadda25281ba97d" + integrity sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-object-atoms "^1.0.0" + get-intrinsic "^1.2.4" + is-string "^1.0.7" + +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + +array.prototype.findlast@^1.2.4: + version "1.2.5" + resolved "https://registry.yarnpkg.com/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz#3e4fbcb30a15a7f5bf64cf2faae22d139c2e4904" + integrity sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + es-shim-unscopables "^1.0.2" + +array.prototype.findlastindex@^1.2.3: + version "1.2.5" + resolved "https://registry.yarnpkg.com/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz#8c35a755c72908719453f87145ca011e39334d0d" + integrity sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + es-shim-unscopables "^1.0.2" + +array.prototype.flat@^1.3.1, array.prototype.flat@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz#1476217df8cff17d72ee8f3ba06738db5b387d18" + integrity sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + es-shim-unscopables "^1.0.0" + +array.prototype.flatmap@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz#c9a7c6831db8e719d6ce639190146c24bbd3e527" + integrity sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + es-shim-unscopables "^1.0.0" + +array.prototype.toreversed@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/array.prototype.toreversed/-/array.prototype.toreversed-1.1.2.tgz#b989a6bf35c4c5051e1dc0325151bf8088954eba" + integrity sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + es-shim-unscopables "^1.0.0" + +array.prototype.tosorted@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.3.tgz#c8c89348337e51b8a3c48a9227f9ce93ceedcba8" + integrity sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg== + dependencies: + call-bind "^1.0.5" + define-properties "^1.2.1" + es-abstract "^1.22.3" + es-errors "^1.1.0" + es-shim-unscopables "^1.0.2" + +arraybuffer.prototype.slice@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz#097972f4255e41bc3425e37dc3f6421cf9aefde6" + integrity sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A== + dependencies: + array-buffer-byte-length "^1.0.1" + call-bind "^1.0.5" + define-properties "^1.2.1" + es-abstract "^1.22.3" + es-errors "^1.2.1" + get-intrinsic "^1.2.3" + is-array-buffer "^3.0.4" + is-shared-array-buffer "^1.0.2" + +ast-types-flow@^0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.8.tgz#0a85e1c92695769ac13a428bb653e7538bea27d6" + integrity sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ== + +autoprefixer@^10.0.1: + version "10.4.19" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.19.tgz#ad25a856e82ee9d7898c59583c1afeb3fa65f89f" + integrity sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew== + dependencies: + browserslist "^4.23.0" + caniuse-lite "^1.0.30001599" + fraction.js "^4.3.7" + normalize-range "^0.1.2" + picocolors "^1.0.0" + postcss-value-parser "^4.2.0" + +available-typed-arrays@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846" + integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ== + dependencies: + possible-typed-array-names "^1.0.0" + +axe-core@=4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.7.0.tgz#34ba5a48a8b564f67e103f0aa5768d76e15bbbbf" + integrity sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ== + +axobject-query@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-3.2.1.tgz#39c378a6e3b06ca679f29138151e45b2b32da62a" + integrity sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg== + dependencies: + dequal "^2.0.3" + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +binary-extensions@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" + integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + +braces@^3.0.2, braces@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +browserslist@^4.23.0: + version "4.23.0" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.0.tgz#8f3acc2bbe73af7213399430890f86c63a5674ab" + integrity sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ== + dependencies: + caniuse-lite "^1.0.30001587" + electron-to-chromium "^1.4.668" + node-releases "^2.0.14" + update-browserslist-db "^1.0.13" + +busboy@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/busboy/-/busboy-1.6.0.tgz#966ea36a9502e43cdb9146962523b92f531f6893" + integrity sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA== + dependencies: + streamsearch "^1.1.0" + +call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" + integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== + dependencies: + es-define-property "^1.0.0" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + set-function-length "^1.2.1" + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camelcase-css@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/camelcase-css/-/camelcase-css-2.0.1.tgz#ee978f6947914cc30c6b44741b6ed1df7f043fd5" + integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== + +caniuse-lite@^1.0.30001579, caniuse-lite@^1.0.30001587, caniuse-lite@^1.0.30001599: + version "1.0.30001599" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001599.tgz#571cf4f3f1506df9bf41fcbb6d10d5d017817bce" + integrity sha512-LRAQHZ4yT1+f9LemSMeqdMpMxZcc4RMWdj4tiFe3G8tNkWK+E58g+/tzotb5cU6TbcVJLr4fySiAW7XmxQvZQA== + +chalk@^4.0.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chokidar@^3.5.3: + version "3.6.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" + integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +client-only@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/client-only/-/client-only-0.0.1.tgz#38bba5d403c41ab150bff64a95c85013cf73bca1" + integrity sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA== + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +commander@^4.0.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" + integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +cross-spawn@^7.0.0, cross-spawn@^7.0.2: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +cssesc@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" + integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== + +csstype@^3.0.2: + version "3.1.3" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81" + integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== + +damerau-levenshtein@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz#b43d286ccbd36bc5b2f7ed41caf2d0aba1f8a6e7" + integrity sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA== + +data-view-buffer@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/data-view-buffer/-/data-view-buffer-1.0.1.tgz#8ea6326efec17a2e42620696e671d7d5a8bc66b2" + integrity sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA== + dependencies: + call-bind "^1.0.6" + es-errors "^1.3.0" + is-data-view "^1.0.1" + +data-view-byte-length@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz#90721ca95ff280677eb793749fce1011347669e2" + integrity sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ== + dependencies: + call-bind "^1.0.7" + es-errors "^1.3.0" + is-data-view "^1.0.1" + +data-view-byte-offset@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz#5e0bbfb4828ed2d1b9b400cd8a7d119bca0ff18a" + integrity sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA== + dependencies: + call-bind "^1.0.6" + es-errors "^1.3.0" + is-data-view "^1.0.1" + +debug@^3.2.7: + version "3.2.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== + dependencies: + ms "^2.1.1" + +debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: + version "4.3.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +deep-is@^0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== + +define-data-property@^1.0.1, define-data-property@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" + integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== + dependencies: + es-define-property "^1.0.0" + es-errors "^1.3.0" + gopd "^1.0.1" + +define-properties@^1.1.3, define-properties@^1.2.0, define-properties@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" + integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== + dependencies: + define-data-property "^1.0.1" + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" + +dequal@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" + integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== + +dexie-react-hooks@^1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/dexie-react-hooks/-/dexie-react-hooks-1.1.7.tgz#75bd92a609a7c3dc3643e2fd21e7db5df6df923b" + integrity sha512-Lwv5W0Hk+uOW3kGnsU9GZoR1er1B7WQ5DSdonoNG+focTNeJbHW6vi6nBoX534VKI3/uwHebYzSw1fwY6a7mTw== + +dexie@^3.2.7: + version "3.2.7" + resolved "https://registry.yarnpkg.com/dexie/-/dexie-3.2.7.tgz#1346541c9c81e3bc6055a042a928837890595e3a" + integrity sha512-2a+BXvVhY5op+smDRLxeBAivE7YcYaneXJ1la3HOkUfX9zKkE/AJ8CNgjiXbtXepFyFmJNGSbmjOwqbT749r/w== + +didyoumean@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/didyoumean/-/didyoumean-1.2.2.tgz#989346ffe9e839b4555ecf5666edea0d3e8ad037" + integrity sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw== + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +dlv@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/dlv/-/dlv-1.1.3.tgz#5c198a8a11453596e751494d49874bc7732f2e79" + integrity sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA== + +doctrine@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== + dependencies: + esutils "^2.0.2" + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + +eastasianwidth@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" + integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== + +electron-to-chromium@^1.4.668: + version "1.4.714" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.714.tgz#708fdc8d5bdec824e41fe8b1b0e10af508a10946" + integrity sha512-OfnVHt+nMRH9Ua5koH/2gKlCAXbG+u1yXwLKyBVqNboBV34ZTwb846RUe8K5mtE1uhz0BXoMarZ13JCQr+sBtQ== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +emoji-regex@^9.2.2: + version "9.2.2" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" + integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== + +enhanced-resolve@^5.12.0: + version "5.16.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.16.0.tgz#65ec88778083056cb32487faa9aef82ed0864787" + integrity sha512-O+QWCviPNSSLAD9Ucn8Awv+poAkqn3T1XY5/N7kR7rQO9yfSGWkYZDwpJ+iKF7B8rxaQKWngSqACpgzeapSyoA== + dependencies: + graceful-fs "^4.2.4" + tapable "^2.2.0" + +es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23.1, es-abstract@^1.23.2: + version "1.23.2" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.23.2.tgz#693312f3940f967b8dd3eebacb590b01712622e0" + integrity sha512-60s3Xv2T2p1ICykc7c+DNDPLDMm9t4QxCOUU0K9JxiLjM3C1zB9YVdN7tjxrFd4+AkZ8CdX1ovUga4P2+1e+/w== + dependencies: + array-buffer-byte-length "^1.0.1" + arraybuffer.prototype.slice "^1.0.3" + available-typed-arrays "^1.0.7" + call-bind "^1.0.7" + data-view-buffer "^1.0.1" + data-view-byte-length "^1.0.1" + data-view-byte-offset "^1.0.0" + es-define-property "^1.0.0" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + es-set-tostringtag "^2.0.3" + es-to-primitive "^1.2.1" + function.prototype.name "^1.1.6" + get-intrinsic "^1.2.4" + get-symbol-description "^1.0.2" + globalthis "^1.0.3" + gopd "^1.0.1" + has-property-descriptors "^1.0.2" + has-proto "^1.0.3" + has-symbols "^1.0.3" + hasown "^2.0.2" + internal-slot "^1.0.7" + is-array-buffer "^3.0.4" + is-callable "^1.2.7" + is-data-view "^1.0.1" + is-negative-zero "^2.0.3" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.3" + is-string "^1.0.7" + is-typed-array "^1.1.13" + is-weakref "^1.0.2" + object-inspect "^1.13.1" + object-keys "^1.1.1" + object.assign "^4.1.5" + regexp.prototype.flags "^1.5.2" + safe-array-concat "^1.1.2" + safe-regex-test "^1.0.3" + string.prototype.trim "^1.2.9" + string.prototype.trimend "^1.0.8" + string.prototype.trimstart "^1.0.7" + typed-array-buffer "^1.0.2" + typed-array-byte-length "^1.0.1" + typed-array-byte-offset "^1.0.2" + typed-array-length "^1.0.5" + unbox-primitive "^1.0.2" + which-typed-array "^1.1.15" + +es-define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845" + integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ== + dependencies: + get-intrinsic "^1.2.4" + +es-errors@^1.1.0, es-errors@^1.2.1, es-errors@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" + integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== + +es-iterator-helpers@^1.0.15, es-iterator-helpers@^1.0.17: + version "1.0.18" + resolved "https://registry.yarnpkg.com/es-iterator-helpers/-/es-iterator-helpers-1.0.18.tgz#4d3424f46b24df38d064af6fbbc89274e29ea69d" + integrity sha512-scxAJaewsahbqTYrGKJihhViaM6DDZDDoucfvzNbK0pOren1g/daDQ3IAhzn+1G14rBG7w+i5N+qul60++zlKA== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.0" + es-errors "^1.3.0" + es-set-tostringtag "^2.0.3" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + globalthis "^1.0.3" + has-property-descriptors "^1.0.2" + has-proto "^1.0.3" + has-symbols "^1.0.3" + internal-slot "^1.0.7" + iterator.prototype "^1.1.2" + safe-array-concat "^1.1.2" + +es-object-atoms@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.0.0.tgz#ddb55cd47ac2e240701260bc2a8e31ecb643d941" + integrity sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw== + dependencies: + es-errors "^1.3.0" + +es-set-tostringtag@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz#8bb60f0a440c2e4281962428438d58545af39777" + integrity sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ== + dependencies: + get-intrinsic "^1.2.4" + has-tostringtag "^1.0.2" + hasown "^2.0.1" + +es-shim-unscopables@^1.0.0, es-shim-unscopables@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz#1f6942e71ecc7835ed1c8a83006d8771a63a3763" + integrity sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw== + dependencies: + hasown "^2.0.0" + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + +escalade@^3.1.1: + version "3.1.2" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.2.tgz#54076e9ab29ea5bf3d8f1ed62acffbb88272df27" + integrity sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA== + +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +eslint-config-next@14.1.4: + version "14.1.4" + resolved "https://registry.yarnpkg.com/eslint-config-next/-/eslint-config-next-14.1.4.tgz#22f2ba4c0993e991249d863656a64c204bae542c" + integrity sha512-cihIahbhYAWwXJwZkAaRPpUi5t9aOi/HdfWXOjZeUOqNWXHD8X22kd1KG58Dc3MVaRx3HoR/oMGk2ltcrqDn8g== + dependencies: + "@next/eslint-plugin-next" "14.1.4" + "@rushstack/eslint-patch" "^1.3.3" + "@typescript-eslint/parser" "^5.4.2 || ^6.0.0" + eslint-import-resolver-node "^0.3.6" + eslint-import-resolver-typescript "^3.5.2" + eslint-plugin-import "^2.28.1" + eslint-plugin-jsx-a11y "^6.7.1" + eslint-plugin-react "^7.33.2" + eslint-plugin-react-hooks "^4.5.0 || 5.0.0-canary-7118f5dd7-20230705" + +eslint-import-resolver-node@^0.3.6, eslint-import-resolver-node@^0.3.9: + version "0.3.9" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz#d4eaac52b8a2e7c3cd1903eb00f7e053356118ac" + integrity sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g== + dependencies: + debug "^3.2.7" + is-core-module "^2.13.0" + resolve "^1.22.4" + +eslint-import-resolver-typescript@^3.5.2: + version "3.6.1" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.1.tgz#7b983680edd3f1c5bce1a5829ae0bc2d57fe9efa" + integrity sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg== + dependencies: + debug "^4.3.4" + enhanced-resolve "^5.12.0" + eslint-module-utils "^2.7.4" + fast-glob "^3.3.1" + get-tsconfig "^4.5.0" + is-core-module "^2.11.0" + is-glob "^4.0.3" + +eslint-module-utils@^2.7.4, eslint-module-utils@^2.8.0: + version "2.8.1" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz#52f2404300c3bd33deece9d7372fb337cc1d7c34" + integrity sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q== + dependencies: + debug "^3.2.7" + +eslint-plugin-import@^2.28.1: + version "2.29.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz#d45b37b5ef5901d639c15270d74d46d161150643" + integrity sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw== + dependencies: + array-includes "^3.1.7" + array.prototype.findlastindex "^1.2.3" + array.prototype.flat "^1.3.2" + array.prototype.flatmap "^1.3.2" + debug "^3.2.7" + doctrine "^2.1.0" + eslint-import-resolver-node "^0.3.9" + eslint-module-utils "^2.8.0" + hasown "^2.0.0" + is-core-module "^2.13.1" + is-glob "^4.0.3" + minimatch "^3.1.2" + object.fromentries "^2.0.7" + object.groupby "^1.0.1" + object.values "^1.1.7" + semver "^6.3.1" + tsconfig-paths "^3.15.0" + +eslint-plugin-jsx-a11y@^6.7.1: + version "6.8.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.8.0.tgz#2fa9c701d44fcd722b7c771ec322432857fcbad2" + integrity sha512-Hdh937BS3KdwwbBaKd5+PLCOmYY6U4f2h9Z2ktwtNKvIdIEu137rjYbcb9ApSbVJfWxANNuiKTD/9tOKjK9qOA== + dependencies: + "@babel/runtime" "^7.23.2" + aria-query "^5.3.0" + array-includes "^3.1.7" + array.prototype.flatmap "^1.3.2" + ast-types-flow "^0.0.8" + axe-core "=4.7.0" + axobject-query "^3.2.1" + damerau-levenshtein "^1.0.8" + emoji-regex "^9.2.2" + es-iterator-helpers "^1.0.15" + hasown "^2.0.0" + jsx-ast-utils "^3.3.5" + language-tags "^1.0.9" + minimatch "^3.1.2" + object.entries "^1.1.7" + object.fromentries "^2.0.7" + +"eslint-plugin-react-hooks@^4.5.0 || 5.0.0-canary-7118f5dd7-20230705": + version "4.6.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz#4c3e697ad95b77e93f8646aaa1630c1ba607edd3" + integrity sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g== + +eslint-plugin-react@^7.33.2: + version "7.34.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.34.1.tgz#6806b70c97796f5bbfb235a5d3379ece5f4da997" + integrity sha512-N97CxlouPT1AHt8Jn0mhhN2RrADlUAsk1/atcT2KyA/l9Q/E6ll7OIGwNumFmWfZ9skV3XXccYS19h80rHtgkw== + dependencies: + array-includes "^3.1.7" + array.prototype.findlast "^1.2.4" + array.prototype.flatmap "^1.3.2" + array.prototype.toreversed "^1.1.2" + array.prototype.tosorted "^1.1.3" + doctrine "^2.1.0" + es-iterator-helpers "^1.0.17" + estraverse "^5.3.0" + jsx-ast-utils "^2.4.1 || ^3.0.0" + minimatch "^3.1.2" + object.entries "^1.1.7" + object.fromentries "^2.0.7" + object.hasown "^1.1.3" + object.values "^1.1.7" + prop-types "^15.8.1" + resolve "^2.0.0-next.5" + semver "^6.3.1" + string.prototype.matchall "^4.0.10" + +eslint-scope@^7.2.2: + version "7.2.2" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f" + integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== + dependencies: + esrecurse "^4.3.0" + estraverse "^5.2.0" + +eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: + version "3.4.3" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" + integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== + +eslint@^8: + version "8.57.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.0.tgz#c786a6fd0e0b68941aaf624596fb987089195668" + integrity sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@eslint-community/regexpp" "^4.6.1" + "@eslint/eslintrc" "^2.1.4" + "@eslint/js" "8.57.0" + "@humanwhocodes/config-array" "^0.11.14" + "@humanwhocodes/module-importer" "^1.0.1" + "@nodelib/fs.walk" "^1.2.8" + "@ungap/structured-clone" "^1.2.0" + ajv "^6.12.4" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.3.2" + doctrine "^3.0.0" + escape-string-regexp "^4.0.0" + eslint-scope "^7.2.2" + eslint-visitor-keys "^3.4.3" + espree "^9.6.1" + esquery "^1.4.2" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" + find-up "^5.0.0" + glob-parent "^6.0.2" + globals "^13.19.0" + graphemer "^1.4.0" + ignore "^5.2.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + is-path-inside "^3.0.3" + js-yaml "^4.1.0" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.4.1" + lodash.merge "^4.6.2" + minimatch "^3.1.2" + natural-compare "^1.4.0" + optionator "^0.9.3" + strip-ansi "^6.0.1" + text-table "^0.2.0" + +espree@^9.6.0, espree@^9.6.1: + version "9.6.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" + integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== + dependencies: + acorn "^8.9.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^3.4.1" + +esquery@^1.4.2: + version "1.5.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" + integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-glob@^3.2.9, fast-glob@^3.3.0, fast-glob@^3.3.1: + version "3.3.2" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" + integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + +fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-levenshtein@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== + +fastq@^1.6.0: + version "1.17.1" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.17.1.tgz#2a523f07a4e7b1e81a42b91b8bf2254107753b47" + integrity sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w== + dependencies: + reusify "^1.0.4" + +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== + dependencies: + flat-cache "^3.0.4" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +flat-cache@^3.0.4: + version "3.2.0" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.2.0.tgz#2c0c2d5040c99b1632771a9d105725c0115363ee" + integrity sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw== + dependencies: + flatted "^3.2.9" + keyv "^4.5.3" + rimraf "^3.0.2" + +flatted@^3.2.9: + version "3.3.1" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.1.tgz#21db470729a6734d4997002f439cb308987f567a" + integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw== + +for-each@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" + integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== + dependencies: + is-callable "^1.1.3" + +foreground-child@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.1.1.tgz#1d173e776d75d2772fed08efe4a0de1ea1b12d0d" + integrity sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg== + dependencies: + cross-spawn "^7.0.0" + signal-exit "^4.0.1" + +fraction.js@^4.3.7: + version "4.3.7" + resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.3.7.tgz#06ca0085157e42fda7f9e726e79fefc4068840f7" + integrity sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew== + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +fsevents@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== + +function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== + +function.prototype.name@^1.1.5, function.prototype.name@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.6.tgz#cdf315b7d90ee77a4c6ee216c3c3362da07533fd" + integrity sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + functions-have-names "^1.2.3" + +functions-have-names@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" + integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== + +get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" + integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== + dependencies: + es-errors "^1.3.0" + function-bind "^1.1.2" + has-proto "^1.0.1" + has-symbols "^1.0.3" + hasown "^2.0.0" + +get-symbol-description@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.2.tgz#533744d5aa20aca4e079c8e5daf7fd44202821f5" + integrity sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg== + dependencies: + call-bind "^1.0.5" + es-errors "^1.3.0" + get-intrinsic "^1.2.4" + +get-tsconfig@^4.5.0: + version "4.7.3" + resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.7.3.tgz#0498163d98f7b58484dd4906999c0c9d5f103f83" + integrity sha512-ZvkrzoUA0PQZM6fy6+/Hce561s+faD1rsNwhnO5FelNjyy7EMGJ3Rz1AQ8GYDWjhRs/7dBLOEJvhK8MiEJOAFg== + dependencies: + resolve-pkg-maps "^1.0.0" + +glob-parent@^5.1.2, glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob-parent@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + +glob@10.3.10, glob@^10.3.10: + version "10.3.10" + resolved "https://registry.yarnpkg.com/glob/-/glob-10.3.10.tgz#0351ebb809fd187fe421ab96af83d3a70715df4b" + integrity sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g== + dependencies: + foreground-child "^3.1.0" + jackspeak "^2.3.5" + minimatch "^9.0.1" + minipass "^5.0.0 || ^6.0.2 || ^7.0.0" + path-scurry "^1.10.1" + +glob@^7.1.3: + version "7.2.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + +globals@^13.19.0: + version "13.24.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.24.0.tgz#8432a19d78ce0c1e833949c36adb345400bb1171" + integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ== + dependencies: + type-fest "^0.20.2" + +globalthis@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf" + integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== + dependencies: + define-properties "^1.1.3" + +globby@^11.1.0: + version "11.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" + integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.2.9" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^3.0.0" + +gopd@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" + integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== + dependencies: + get-intrinsic "^1.1.3" + +graceful-fs@^4.2.11, graceful-fs@^4.2.4: + version "4.2.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + +graphemer@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" + integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== + +has-bigints@^1.0.1, has-bigints@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" + integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" + integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== + dependencies: + es-define-property "^1.0.0" + +has-proto@^1.0.1, has-proto@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.3.tgz#b31ddfe9b0e6e9914536a6ab286426d0214f77fd" + integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q== + +has-symbols@^1.0.2, has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + +has-tostringtag@^1.0.0, has-tostringtag@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" + integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== + dependencies: + has-symbols "^1.0.3" + +hasown@^2.0.0, hasown@^2.0.1, hasown@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" + integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== + dependencies: + function-bind "^1.1.2" + +ignore@^5.2.0: + version "5.3.1" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.1.tgz#5073e554cd42c5b33b394375f538b8593e34d4ef" + integrity sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw== + +import-fresh@^3.2.1: + version "3.3.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +internal-slot@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.7.tgz#c06dcca3ed874249881007b0a5523b172a190802" + integrity sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g== + dependencies: + es-errors "^1.3.0" + hasown "^2.0.0" + side-channel "^1.0.4" + +is-array-buffer@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.4.tgz#7a1f92b3d61edd2bc65d24f130530ea93d7fae98" + integrity sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.1" + +is-async-function@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-async-function/-/is-async-function-2.0.0.tgz#8e4418efd3e5d3a6ebb0164c05ef5afb69aa9646" + integrity sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA== + dependencies: + has-tostringtag "^1.0.0" + +is-bigint@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" + integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== + dependencies: + has-bigints "^1.0.1" + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-boolean-object@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" + integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" + integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== + +is-core-module@^2.11.0, is-core-module@^2.13.0, is-core-module@^2.13.1: + version "2.13.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384" + integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw== + dependencies: + hasown "^2.0.0" + +is-data-view@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-data-view/-/is-data-view-1.0.1.tgz#4b4d3a511b70f3dc26d42c03ca9ca515d847759f" + integrity sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w== + dependencies: + is-typed-array "^1.1.13" + +is-date-object@^1.0.1, is-date-object@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" + integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== + dependencies: + has-tostringtag "^1.0.0" + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-finalizationregistry@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz#c8749b65f17c133313e661b1289b95ad3dbd62e6" + integrity sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw== + dependencies: + call-bind "^1.0.2" + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-generator-function@^1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" + integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== + dependencies: + has-tostringtag "^1.0.0" + +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-map@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.3.tgz#ede96b7fe1e270b3c4465e3a465658764926d62e" + integrity sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw== + +is-negative-zero@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.3.tgz#ced903a027aca6381b777a5743069d7376a49747" + integrity sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw== + +is-number-object@^1.0.4: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" + integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== + dependencies: + has-tostringtag "^1.0.0" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-path-inside@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" + integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== + +is-regex@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" + integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-set@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.3.tgz#8ab209ea424608141372ded6e0cb200ef1d9d01d" + integrity sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg== + +is-shared-array-buffer@^1.0.2, is-shared-array-buffer@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz#1237f1cba059cdb62431d378dcc37d9680181688" + integrity sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg== + dependencies: + call-bind "^1.0.7" + +is-string@^1.0.5, is-string@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" + integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== + dependencies: + has-tostringtag "^1.0.0" + +is-symbol@^1.0.2, is-symbol@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" + integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== + dependencies: + has-symbols "^1.0.2" + +is-typed-array@^1.1.13: + version "1.1.13" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.13.tgz#d6c5ca56df62334959322d7d7dd1cca50debe229" + integrity sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw== + dependencies: + which-typed-array "^1.1.14" + +is-weakmap@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.2.tgz#bf72615d649dfe5f699079c54b83e47d1ae19cfd" + integrity sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w== + +is-weakref@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" + integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== + dependencies: + call-bind "^1.0.2" + +is-weakset@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.3.tgz#e801519df8c0c43e12ff2834eead84ec9e624007" + integrity sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ== + dependencies: + call-bind "^1.0.7" + get-intrinsic "^1.2.4" + +isarray@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" + integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +iterator.prototype@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/iterator.prototype/-/iterator.prototype-1.1.2.tgz#5e29c8924f01916cb9335f1ff80619dcff22b0c0" + integrity sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w== + dependencies: + define-properties "^1.2.1" + get-intrinsic "^1.2.1" + has-symbols "^1.0.3" + reflect.getprototypeof "^1.0.4" + set-function-name "^2.0.1" + +jackspeak@^2.3.5: + version "2.3.6" + resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-2.3.6.tgz#647ecc472238aee4b06ac0e461acc21a8c505ca8" + integrity sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ== + dependencies: + "@isaacs/cliui" "^8.0.2" + optionalDependencies: + "@pkgjs/parseargs" "^0.11.0" + +jiti@^1.19.1: + version "1.21.0" + resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.21.0.tgz#7c97f8fe045724e136a397f7340475244156105d" + integrity sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q== + +"js-tokens@^3.0.0 || ^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +json-buffer@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" + integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== + +json5@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" + integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== + dependencies: + minimist "^1.2.0" + +"jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.3.5: + version "3.3.5" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz#4766bd05a8e2a11af222becd19e15575e52a853a" + integrity sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ== + dependencies: + array-includes "^3.1.6" + array.prototype.flat "^1.3.1" + object.assign "^4.1.4" + object.values "^1.1.6" + +keyv@^4.5.3: + version "4.5.4" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" + integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== + dependencies: + json-buffer "3.0.1" + +language-subtag-registry@^0.3.20: + version "0.3.22" + resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz#2e1500861b2e457eba7e7ae86877cbd08fa1fd1d" + integrity sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w== + +language-tags@^1.0.9: + version "1.0.9" + resolved "https://registry.yarnpkg.com/language-tags/-/language-tags-1.0.9.tgz#1ffdcd0ec0fafb4b1be7f8b11f306ad0f9c08777" + integrity sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA== + dependencies: + language-subtag-registry "^0.3.20" + +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + +lilconfig@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.1.0.tgz#78e23ac89ebb7e1bfbf25b18043de756548e7f52" + integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ== + +lilconfig@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-3.1.1.tgz#9d8a246fa753106cfc205fd2d77042faca56e5e3" + integrity sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ== + +lines-and-columns@^1.1.6: + version "1.2.4" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + +loose-envify@^1.1.0, loose-envify@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +"lru-cache@^9.1.1 || ^10.0.0": + version "10.2.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.2.0.tgz#0bd445ca57363465900f4d1f9bd8db343a4d95c3" + integrity sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q== + +merge2@^1.3.0, merge2@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +micromatch@^4.0.4, micromatch@^4.0.5: + version "4.0.5" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" + integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== + dependencies: + braces "^3.0.2" + picomatch "^2.3.1" + +minimatch@9.0.3, minimatch@^9.0.1: + version "9.0.3" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825" + integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== + dependencies: + brace-expansion "^2.0.1" + +minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimist@^1.2.0, minimist@^1.2.6: + version "1.2.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== + +"minipass@^5.0.0 || ^6.0.2 || ^7.0.0": + version "7.0.4" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.0.4.tgz#dbce03740f50a4786ba994c1fb908844d27b038c" + integrity sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ== + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +ms@^2.1.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +mz@^2.7.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" + integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== + dependencies: + any-promise "^1.0.0" + object-assign "^4.0.1" + thenify-all "^1.0.0" + +nanoid@^3.3.6, nanoid@^3.3.7: + version "3.3.7" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" + integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== + +next@14.1.4: + version "14.1.4" + resolved "https://registry.yarnpkg.com/next/-/next-14.1.4.tgz#203310f7310578563fd5c961f0db4729ce7a502d" + integrity sha512-1WTaXeSrUwlz/XcnhGTY7+8eiaFvdet5z9u3V2jb+Ek1vFo0VhHKSAIJvDWfQpttWjnyw14kBeq28TPq7bTeEQ== + dependencies: + "@next/env" "14.1.4" + "@swc/helpers" "0.5.2" + busboy "1.6.0" + caniuse-lite "^1.0.30001579" + graceful-fs "^4.2.11" + postcss "8.4.31" + styled-jsx "5.1.1" + optionalDependencies: + "@next/swc-darwin-arm64" "14.1.4" + "@next/swc-darwin-x64" "14.1.4" + "@next/swc-linux-arm64-gnu" "14.1.4" + "@next/swc-linux-arm64-musl" "14.1.4" + "@next/swc-linux-x64-gnu" "14.1.4" + "@next/swc-linux-x64-musl" "14.1.4" + "@next/swc-win32-arm64-msvc" "14.1.4" + "@next/swc-win32-ia32-msvc" "14.1.4" + "@next/swc-win32-x64-msvc" "14.1.4" + +node-releases@^2.0.14: + version "2.0.14" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.14.tgz#2ffb053bceb8b2be8495ece1ab6ce600c4461b0b" + integrity sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw== + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +normalize-range@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" + integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA== + +object-assign@^4.0.1, object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== + +object-hash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-3.0.0.tgz#73f97f753e7baffc0e2cc9d6e079079744ac82e9" + integrity sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw== + +object-inspect@^1.13.1: + version "1.13.1" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.1.tgz#b96c6109324ccfef6b12216a956ca4dc2ff94bc2" + integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ== + +object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object.assign@^4.1.4, object.assign@^4.1.5: + version "4.1.5" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.5.tgz#3a833f9ab7fdb80fc9e8d2300c803d216d8fdbb0" + integrity sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ== + dependencies: + call-bind "^1.0.5" + define-properties "^1.2.1" + has-symbols "^1.0.3" + object-keys "^1.1.1" + +object.entries@^1.1.7: + version "1.1.8" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.8.tgz#bffe6f282e01f4d17807204a24f8edd823599c41" + integrity sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + +object.fromentries@^2.0.7: + version "2.0.8" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.8.tgz#f7195d8a9b97bd95cbc1999ea939ecd1a2b00c65" + integrity sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-object-atoms "^1.0.0" + +object.groupby@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/object.groupby/-/object.groupby-1.0.3.tgz#9b125c36238129f6f7b61954a1e7176148d5002e" + integrity sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + +object.hasown@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.3.tgz#6a5f2897bb4d3668b8e79364f98ccf971bda55ae" + integrity sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA== + dependencies: + define-properties "^1.2.0" + es-abstract "^1.22.1" + +object.values@^1.1.6, object.values@^1.1.7: + version "1.2.0" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.2.0.tgz#65405a9d92cee68ac2d303002e0b8470a4d9ab1b" + integrity sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + +once@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +optionator@^0.9.3: + version "0.9.3" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.3.tgz#007397d44ed1872fdc6ed31360190f81814e2c64" + integrity sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg== + dependencies: + "@aashutoshrathi/word-wrap" "^1.2.3" + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + +path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +path-scurry@^1.10.1: + version "1.10.1" + resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.10.1.tgz#9ba6bf5aa8500fe9fd67df4f0d9483b2b0bfc698" + integrity sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ== + dependencies: + lru-cache "^9.1.1 || ^10.0.0" + minipass "^5.0.0 || ^6.0.2 || ^7.0.0" + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +pify@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== + +pirates@^4.0.1: + version "4.0.6" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9" + integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== + +possible-typed-array-names@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz#89bb63c6fada2c3e90adc4a647beeeb39cc7bf8f" + integrity sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q== + +postcss-import@^15.1.0: + version "15.1.0" + resolved "https://registry.yarnpkg.com/postcss-import/-/postcss-import-15.1.0.tgz#41c64ed8cc0e23735a9698b3249ffdbf704adc70" + integrity sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew== + dependencies: + postcss-value-parser "^4.0.0" + read-cache "^1.0.0" + resolve "^1.1.7" + +postcss-js@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-js/-/postcss-js-4.0.1.tgz#61598186f3703bab052f1c4f7d805f3991bee9d2" + integrity sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw== + dependencies: + camelcase-css "^2.0.1" + +postcss-load-config@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-4.0.2.tgz#7159dcf626118d33e299f485d6afe4aff7c4a3e3" + integrity sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ== + dependencies: + lilconfig "^3.0.0" + yaml "^2.3.4" + +postcss-nested@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/postcss-nested/-/postcss-nested-6.0.1.tgz#f83dc9846ca16d2f4fa864f16e9d9f7d0961662c" + integrity sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ== + dependencies: + postcss-selector-parser "^6.0.11" + +postcss-selector-parser@^6.0.11: + version "6.0.16" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz#3b88b9f5c5abd989ef4e2fc9ec8eedd34b20fb04" + integrity sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw== + dependencies: + cssesc "^3.0.0" + util-deprecate "^1.0.2" + +postcss-value-parser@^4.0.0, postcss-value-parser@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" + integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== + +postcss@8.4.31: + version "8.4.31" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.31.tgz#92b451050a9f914da6755af352bdc0192508656d" + integrity sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ== + dependencies: + nanoid "^3.3.6" + picocolors "^1.0.0" + source-map-js "^1.0.2" + +postcss@^8, postcss@^8.4.23: + version "8.4.38" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.38.tgz#b387d533baf2054288e337066d81c6bee9db9e0e" + integrity sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A== + dependencies: + nanoid "^3.3.7" + picocolors "^1.0.0" + source-map-js "^1.2.0" + +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + +prop-types@^15.8.1: + version "15.8.1" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" + integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.13.1" + +punycode@^2.1.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" + integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +react-dom@^18: + version "18.2.0" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.2.0.tgz#22aaf38708db2674ed9ada224ca4aa708d821e3d" + integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g== + dependencies: + loose-envify "^1.1.0" + scheduler "^0.23.0" + +react-is@^16.13.1: + version "16.13.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + +react@^18: + version "18.2.0" + resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5" + integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ== + dependencies: + loose-envify "^1.1.0" + +read-cache@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/read-cache/-/read-cache-1.0.0.tgz#e664ef31161166c9751cdbe8dbcf86b5fb58f774" + integrity sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA== + dependencies: + pify "^2.3.0" + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +reflect.getprototypeof@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz#3ab04c32a8390b770712b7a8633972702d278859" + integrity sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.1" + es-errors "^1.3.0" + get-intrinsic "^1.2.4" + globalthis "^1.0.3" + which-builtin-type "^1.1.3" + +regenerator-runtime@^0.14.0: + version "0.14.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" + integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== + +regexp.prototype.flags@^1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz#138f644a3350f981a858c44f6bb1a61ff59be334" + integrity sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw== + dependencies: + call-bind "^1.0.6" + define-properties "^1.2.1" + es-errors "^1.3.0" + set-function-name "^2.0.1" + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve-pkg-maps@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz#616b3dc2c57056b5588c31cdf4b3d64db133720f" + integrity sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw== + +resolve@^1.1.7, resolve@^1.22.2, resolve@^1.22.4: + version "1.22.8" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" + integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== + dependencies: + is-core-module "^2.13.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +resolve@^2.0.0-next.5: + version "2.0.0-next.5" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.5.tgz#6b0ec3107e671e52b68cd068ef327173b90dc03c" + integrity sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA== + dependencies: + is-core-module "^2.13.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +safe-array-concat@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.2.tgz#81d77ee0c4e8b863635227c721278dd524c20edb" + integrity sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q== + dependencies: + call-bind "^1.0.7" + get-intrinsic "^1.2.4" + has-symbols "^1.0.3" + isarray "^2.0.5" + +safe-regex-test@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.3.tgz#a5b4c0f06e0ab50ea2c395c14d8371232924c377" + integrity sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw== + dependencies: + call-bind "^1.0.6" + es-errors "^1.3.0" + is-regex "^1.1.4" + +scheduler@^0.23.0: + version "0.23.0" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.0.tgz#ba8041afc3d30eb206a487b6b384002e4e61fdfe" + integrity sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw== + dependencies: + loose-envify "^1.1.0" + +semver@^6.3.1: + version "6.3.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== + +semver@^7.5.4: + version "7.6.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.0.tgz#1a46a4db4bffcccd97b743b5005c8325f23d4e2d" + integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg== + dependencies: + lru-cache "^6.0.0" + +set-function-length@^1.2.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" + integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== + dependencies: + define-data-property "^1.1.4" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + gopd "^1.0.1" + has-property-descriptors "^1.0.2" + +set-function-name@^2.0.1, set-function-name@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.2.tgz#16a705c5a0dc2f5e638ca96d8a8cd4e1c2b90985" + integrity sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ== + dependencies: + define-data-property "^1.1.4" + es-errors "^1.3.0" + functions-have-names "^1.2.3" + has-property-descriptors "^1.0.2" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +side-channel@^1.0.4, side-channel@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.6.tgz#abd25fb7cd24baf45466406b1096b7831c9215f2" + integrity sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA== + dependencies: + call-bind "^1.0.7" + es-errors "^1.3.0" + get-intrinsic "^1.2.4" + object-inspect "^1.13.1" + +signal-exit@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" + integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +source-map-js@^1.0.2, source-map-js@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.0.tgz#16b809c162517b5b8c3e7dcd315a2a5c2612b2af" + integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg== + +streamsearch@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764" + integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== + +"string-width-cjs@npm:string-width@^4.2.0": + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string-width@^4.1.0: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string-width@^5.0.1, string-width@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" + integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== + dependencies: + eastasianwidth "^0.2.0" + emoji-regex "^9.2.2" + strip-ansi "^7.0.1" + +string.prototype.matchall@^4.0.10: + version "4.0.11" + resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz#1092a72c59268d2abaad76582dccc687c0297e0a" + integrity sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + get-intrinsic "^1.2.4" + gopd "^1.0.1" + has-symbols "^1.0.3" + internal-slot "^1.0.7" + regexp.prototype.flags "^1.5.2" + set-function-name "^2.0.2" + side-channel "^1.0.6" + +string.prototype.trim@^1.2.9: + version "1.2.9" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz#b6fa326d72d2c78b6df02f7759c73f8f6274faa4" + integrity sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.0" + es-object-atoms "^1.0.0" + +string.prototype.trimend@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz#3651b8513719e8a9f48de7f2f77640b26652b229" + integrity sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + +string.prototype.trimstart@^1.0.7: + version "1.0.8" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz#7ee834dda8c7c17eff3118472bb35bfedaa34dde" + integrity sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + +"strip-ansi-cjs@npm:strip-ansi@^6.0.1": + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-ansi@^7.0.1: + version "7.1.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" + integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== + dependencies: + ansi-regex "^6.0.1" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== + +strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +styled-jsx@5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/styled-jsx/-/styled-jsx-5.1.1.tgz#839a1c3aaacc4e735fed0781b8619ea5d0009d1f" + integrity sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw== + dependencies: + client-only "0.0.1" + +sucrase@^3.32.0: + version "3.35.0" + resolved "https://registry.yarnpkg.com/sucrase/-/sucrase-3.35.0.tgz#57f17a3d7e19b36d8995f06679d121be914ae263" + integrity sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA== + dependencies: + "@jridgewell/gen-mapping" "^0.3.2" + commander "^4.0.0" + glob "^10.3.10" + lines-and-columns "^1.1.6" + mz "^2.7.0" + pirates "^4.0.1" + ts-interface-checker "^0.1.9" + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +tailwindcss@^3.3.0: + version "3.4.1" + resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-3.4.1.tgz#f512ca5d1dd4c9503c7d3d28a968f1ad8f5c839d" + integrity sha512-qAYmXRfk3ENzuPBakNK0SRrUDipP8NQnEY6772uDhflcQz5EhRdD7JNZxyrFHVQNCwULPBn6FNPp9brpO7ctcA== + dependencies: + "@alloc/quick-lru" "^5.2.0" + arg "^5.0.2" + chokidar "^3.5.3" + didyoumean "^1.2.2" + dlv "^1.1.3" + fast-glob "^3.3.0" + glob-parent "^6.0.2" + is-glob "^4.0.3" + jiti "^1.19.1" + lilconfig "^2.1.0" + micromatch "^4.0.5" + normalize-path "^3.0.0" + object-hash "^3.0.0" + picocolors "^1.0.0" + postcss "^8.4.23" + postcss-import "^15.1.0" + postcss-js "^4.0.1" + postcss-load-config "^4.0.1" + postcss-nested "^6.0.1" + postcss-selector-parser "^6.0.11" + resolve "^1.22.2" + sucrase "^3.32.0" + +tapable@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" + integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== + +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== + +thenify-all@^1.0.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" + integrity sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA== + dependencies: + thenify ">= 3.1.0 < 4" + +"thenify@>= 3.1.0 < 4": + version "3.3.1" + resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.3.1.tgz#8932e686a4066038a016dd9e2ca46add9838a95f" + integrity sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw== + dependencies: + any-promise "^1.0.0" + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +ts-api-utils@^1.0.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.3.0.tgz#4b490e27129f1e8e686b45cc4ab63714dc60eea1" + integrity sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ== + +ts-interface-checker@^0.1.9: + version "0.1.13" + resolved "https://registry.yarnpkg.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz#784fd3d679722bc103b1b4b8030bcddb5db2a699" + integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA== + +tsconfig-paths@^3.15.0: + version "3.15.0" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz#5299ec605e55b1abb23ec939ef15edaf483070d4" + integrity sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg== + dependencies: + "@types/json5" "^0.0.29" + json5 "^1.0.2" + minimist "^1.2.6" + strip-bom "^3.0.0" + +tslib@^2.4.0: + version "2.6.2" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" + integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== + +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + +typed-array-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz#1867c5d83b20fcb5ccf32649e5e2fc7424474ff3" + integrity sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ== + dependencies: + call-bind "^1.0.7" + es-errors "^1.3.0" + is-typed-array "^1.1.13" + +typed-array-byte-length@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz#d92972d3cff99a3fa2e765a28fcdc0f1d89dec67" + integrity sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw== + dependencies: + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + has-proto "^1.0.3" + is-typed-array "^1.1.13" + +typed-array-byte-offset@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz#f9ec1acb9259f395093e4567eb3c28a580d02063" + integrity sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA== + dependencies: + available-typed-arrays "^1.0.7" + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + has-proto "^1.0.3" + is-typed-array "^1.1.13" + +typed-array-length@^1.0.5: + version "1.0.6" + resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.6.tgz#57155207c76e64a3457482dfdc1c9d1d3c4c73a3" + integrity sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g== + dependencies: + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + has-proto "^1.0.3" + is-typed-array "^1.1.13" + possible-typed-array-names "^1.0.0" + +typescript@^5: + version "5.4.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.4.3.tgz#5c6fedd4c87bee01cd7a528a30145521f8e0feff" + integrity sha512-KrPd3PKaCLr78MalgiwJnA25Nm8HAmdwN3mYUYZgG/wizIo9EainNVQI9/yDavtVFRN2h3k8uf3GLHuhDMgEHg== + +unbox-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" + integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== + dependencies: + call-bind "^1.0.2" + has-bigints "^1.0.2" + has-symbols "^1.0.3" + which-boxed-primitive "^1.0.2" + +undici-types@~5.26.4: + version "5.26.5" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" + integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== + +update-browserslist-db@^1.0.13: + version "1.0.13" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz#3c5e4f5c083661bd38ef64b6328c26ed6c8248c4" + integrity sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg== + dependencies: + escalade "^3.1.1" + picocolors "^1.0.0" + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +util-deprecate@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + +which-boxed-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" + integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== + dependencies: + is-bigint "^1.0.1" + is-boolean-object "^1.1.0" + is-number-object "^1.0.4" + is-string "^1.0.5" + is-symbol "^1.0.3" + +which-builtin-type@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/which-builtin-type/-/which-builtin-type-1.1.3.tgz#b1b8443707cc58b6e9bf98d32110ff0c2cbd029b" + integrity sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw== + dependencies: + function.prototype.name "^1.1.5" + has-tostringtag "^1.0.0" + is-async-function "^2.0.0" + is-date-object "^1.0.5" + is-finalizationregistry "^1.0.2" + is-generator-function "^1.0.10" + is-regex "^1.1.4" + is-weakref "^1.0.2" + isarray "^2.0.5" + which-boxed-primitive "^1.0.2" + which-collection "^1.0.1" + which-typed-array "^1.1.9" + +which-collection@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.2.tgz#627ef76243920a107e7ce8e96191debe4b16c2a0" + integrity sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw== + dependencies: + is-map "^2.0.3" + is-set "^2.0.3" + is-weakmap "^2.0.2" + is-weakset "^2.0.3" + +which-typed-array@^1.1.14, which-typed-array@^1.1.15, which-typed-array@^1.1.9: + version "1.1.15" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.15.tgz#264859e9b11a649b388bfaaf4f767df1f779b38d" + integrity sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA== + dependencies: + available-typed-arrays "^1.0.7" + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.2" + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrap-ansi@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" + integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== + dependencies: + ansi-styles "^6.1.0" + string-width "^5.0.1" + strip-ansi "^7.0.1" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yaml@^2.3.4: + version "2.4.1" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.4.1.tgz#2e57e0b5e995292c25c75d2658f0664765210eed" + integrity sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg== + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== From 7b3889a05224a211ca36b2afbe2196d7a228e889 Mon Sep 17 00:00:00 2001 From: Dennis Garcia Date: Fri, 29 Mar 2024 11:34:40 -0500 Subject: [PATCH 04/42] Added dexie to wasm folder --- wasm/js/db-operations.js | 296 ------------------------------- wasm/js/db/accounts.js | 131 ++++++++++++++ wasm/js/db/greet.js | 17 ++ wasm/js/db/schema.js | 54 ++++++ wasm/js/web-rpc-client.js | 2 +- wasm/package.json | 44 ++--- wasm/rollup.config.js | 4 + wasm/src/web_client/store/mod.rs | 60 +++++-- wasm/test.html | 23 ++- wasm/yarn.lock | 142 ++++++++++++++- 10 files changed, 431 insertions(+), 342 deletions(-) delete mode 100644 wasm/js/db-operations.js create mode 100644 wasm/js/db/accounts.js create mode 100644 wasm/js/db/greet.js create mode 100644 wasm/js/db/schema.js diff --git a/wasm/js/db-operations.js b/wasm/js/db-operations.js deleted file mode 100644 index c29a70781..000000000 --- a/wasm/js/db-operations.js +++ /dev/null @@ -1,296 +0,0 @@ -async function setupIndexedDB() { - const dbName = "MidenClientDB"; - const dbVersion = 1; // Use a higher version if you need to upgrade the DB structure in the future - - return new Promise((resolve, reject) => { - // Open a connection to the database - const request = indexedDB.open(dbName, dbVersion); - - // This event is only triggered when the database is created for the first time, - // or when the version number increases - request.onupgradeneeded = function(event) { - const db = event.target.result; - - // Create an object store named "Greet" if it doesn't already exist -- FOR TESTING - if (!db.objectStoreNames.contains("Greet")) { - db.createObjectStore("Greet", { autoIncrement: true }); - } - - //// ACCOUNTS //// - - // account_code object store - if (!db.objectStoreNames.contains("account_code")) { - db.createObjectStore("account_code", { keyPath: "root" }); - } - - // account_storage object store - if (!db.objectStoreNames.contains("account_storage")) { - db.createObjectStore("account_storage", { keyPath: "root" }); - } - - // account_vaults object store - if (!db.objectStoreNames.contains("account_vaults")) { - db.createObjectStore("account_vaults", { keyPath: "root" }); - } - - // Create account_auth object store with account_id as the keyPath - if (!db.objectStoreNames.contains("account_auth")) { - db.createObjectStore("account_auth", { keyPath: "account_id" }); - } - - // Create accounts object store with a single keyPath - if (!db.objectStoreNames.contains("accounts")) { - const accountsStore = db.createObjectStore("accounts", { keyPath: "id_nonce" }); - // Create indexes for foreign keys - accountsStore.createIndex("code_root", "code_root", { unique: false }); - accountsStore.createIndex("storage_root", "storage_root", { unique: false }); - accountsStore.createIndex("vault_root", "vault_root", { unique: false }); - } - }; - - // Handle successful database open operation - request.onsuccess = function(event) { - const db = event.target.result; - resolve(db); - }; - - // Handle errors when opening the database - request.onerror = function(event) { - console.error("Error opening database:", request.error); - reject(request.error); - }; - }); -} - -async function insertAccountCode(codeRoot, code, moduleArrayBuffer) { - const dbName = "MidenClientDB"; - const storeName = "account_code"; - - return new Promise((resolve, reject) => { - // Open a connection to the database - const request = indexedDB.open(dbName); - - request.onsuccess = function(event) { - const db = event.target.result; - const transaction = db.transaction(storeName, "readwrite"); - const store = transaction.objectStore(storeName); - - // Prepare the data object to insert - const data = { - root: codeRoot, // Using codeRoot as the key - code: code, - module: moduleArrayBuffer, // Assuming module is already a Uint8Array or similar - }; - - // Perform the insert - const insertRequest = store.add(data); - - insertRequest.onsuccess = function() { - resolve(`Successfully inserted code with root: ${codeRoot}`); - }; - - insertRequest.onerror = function() { - reject(`Error inserting code with root: ${codeRoot}: ${insertRequest.error}`); - }; - }; - - request.onerror = function(event) { - console.error("Error opening database:", request.error); - reject(request.error); - }; - }); -} - -async function insertAccountStorage(storageRoot, storageSlots) { - const dbName = "MidenClientDB"; - const storeName = "account_storage"; - - return new Promise((resolve, reject) => { - // Open a connection to the database - const request = indexedDB.open(dbName); - - request.onsuccess = function(event) { - const db = event.target.result; - const transaction = db.transaction(storeName, "readwrite"); - const store = transaction.objectStore(storeName); - - // Prepare the data object to insert - const data = { - root: storageRoot, // Using storageRoot as the key - slots: storageSlots, // Assuming storageSlots is a serialized JSON string or similar format - }; - - // Perform the insert - const insertRequest = store.add(data); - - insertRequest.onsuccess = function() { - resolve(`Successfully inserted storage with root: ${storageRoot}`); - }; - - insertRequest.onerror = function() { - reject(`Error inserting storage with root: ${storageRoot}: ${insertRequest.error}`); - }; - }; - - request.onerror = function(event) { - console.error("Error opening database:", request.error); - reject(request.error); - }; - }); -} - -async function insertAccountAssetVault(vaultRoot, assets) { - const dbName = "MidenClientDB"; - const storeName = "account_vaults"; - - return new Promise((resolve, reject) => { - // Open a connection to the database - const request = indexedDB.open(dbName); - - request.onsuccess = function(event) { - const db = event.target.result; - const transaction = db.transaction(storeName, "readwrite"); - const store = transaction.objectStore(storeName); - - // Prepare the data object to insert - const data = { - root: vaultRoot, // Using vaultRoot as the key - assets: assets, // Assuming assets is a serialized JSON string or similar format - }; - - // Perform the insert - const insertRequest = store.add(data); - - insertRequest.onsuccess = function() { - resolve(`Successfully inserted asset vault with root: ${vaultRoot}`); - }; - - insertRequest.onerror = function() { - reject(`Error inserting asset vault with root: ${vaultRoot}: ${insertRequest.error}`); - }; - }; - - request.onerror = function(event) { - console.error("Error opening database:", request.error); - reject(request.error); - }; - }); -} - -async function insertAccountAuth(accountId, authInfoSerialized) { - const dbName = "MidenClientDB"; - const storeName = "account_auth"; - - return new Promise((resolve, reject) => { - // Open a connection to the database - const request = indexedDB.open(dbName); - - request.onsuccess = function(event) { - const db = event.target.result; - const transaction = db.transaction(storeName, "readwrite"); - const store = transaction.objectStore(storeName); - - // Prepare the data object to insert - const data = { - account_id: accountId, // account_id as the key - auth_info: authInfoSerialized, // Assuming authInfo is already serialized (e.g., JSON string) - }; - - // Perform the insert - const insertRequest = store.add(data); - - insertRequest.onsuccess = function() { - resolve(`Successfully inserted auth info for account ID: ${accountId}`); - }; - - insertRequest.onerror = function() { - reject(`Error inserting auth info for account ID: ${accountId}: ${insertRequest.error}`); - }; - }; - - request.onerror = function(event) { - console.error("Error opening database:", request.error); - reject(request.error); - }; - }); -} - -async function insertAccountRecord(id, codeRoot, storageRoot, vaultRoot, nonce, committed, accountSeedArrayBuffer) { - const dbName = "MidenClientDB"; - const storeName = "accounts"; - - // Convert `id` and `nonce` to strings to ensure precision is maintained without loss. - const idStr = id.toString(); - const nonceStr = nonce.toString(); - - return new Promise((resolve, reject) => { - const request = indexedDB.open(dbName); - - request.onsuccess = function(event) { - const db = event.target.result; - const transaction = db.transaction(storeName, "readwrite"); - const store = transaction.objectStore(storeName); - - // Prepare the data object to insert, using the converted `id` and `nonce` for the `id_nonce` key - const data = { - id_nonce: `${idStr}_${nonceStr}`, // Concatenating `id` and `nonce` for the primary key - code_root: codeRoot, - storage_root: storageRoot, - vault_root: vaultRoot, - committed: committed, - account_seed: accountSeedArrayBuffer, // Directly using `accountSeedArrayBuffer` as it's automatically converted to ArrayBuffer - }; - - const insertRequest = store.add(data); - - insertRequest.onsuccess = function() { - resolve(`Successfully inserted account record for ID: ${idStr} with Nonce: ${nonceStr}`); - }; - - insertRequest.onerror = function() { - reject(`Error inserting account record for ID: ${idStr} with Nonce: ${nonceStr}: ${insertRequest.error}`); - }; - }; - - request.onerror = function(event) { - console.error("Error opening database:", request.error); - reject(request.error); - }; - }); -} - -async function insertGreeting(greeting) { - return new Promise((resolve, reject) => { - const openRequest = indexedDB.open("MidenClientDB", 1); - - openRequest.onsuccess = function(event) { - const db = event.target.result; - const transaction = db.transaction("Greet", "readwrite"); - const store = transaction.objectStore("Greet"); - const putRequest = store.put(greeting); - - putRequest.onsuccess = function() { - resolve(); - }; - - putRequest.onerror = function(e) { - console.error("Error inserting greeting:", e.target.error); - reject(new Error("Error inserting greeting")); - }; - }; - - openRequest.onerror = function(event) { - reject(new Error("Error opening database")); - }; - }); -} - -export { - setupIndexedDB, - insertGreeting, - insertAccountCode, - insertAccountStorage, - insertAccountAssetVault, - insertAccountAuth, - insertAccountRecord - } \ No newline at end of file diff --git a/wasm/js/db/accounts.js b/wasm/js/db/accounts.js new file mode 100644 index 000000000..675b03912 --- /dev/null +++ b/wasm/js/db/accounts.js @@ -0,0 +1,131 @@ +import { + accountCodes, + accountStorages, + accountVaults, + accountAuths, + accounts +} from './schema.js'; + +export async function insertAccountCode( + codeRoot, + code, + module +) { + try { + // Create a Blob from the ArrayBuffer + const moduleBlob = new Blob([module]); + + // Prepare the data object to insert + const data = { + root: codeRoot, // Using codeRoot as the key + procedures: code, + module: moduleBlob, // Blob created from ArrayBuffer + }; + + // Perform the insert using Dexie + await accountCodes.add(data); + return `Successfully inserted code with root: ${codeRoot}`; + } catch (error) { + console.error(`Error inserting code with root: ${codeRoot}:`, error); + throw error; // Rethrow the error to handle it further up the call chain if needed + } +} + +export async function insertAccountStorage( + storageRoot, + storageSlots +) { + try { + const storageSlotsBlob = new Blob([storageSlots]); + + // Prepare the data object to insert + const data = { + root: storageRoot, // Using storageRoot as the key + slots: storageSlotsBlob, // Blob created from ArrayBuffer + }; + + // Perform the insert using Dexie + await accountStorages.add(data); + return `Successfully inserted storage with root: ${storageRoot}`; + } catch (error) { + console.error(`Error inserting storage with root: ${storageRoot}:`, error); + throw error; // Rethrow the error to handle it further up the call chain if needed + } +} + +export async function insertAccountAssetVault( + vaultRoot, + assets +) { + try { + // Prepare the data object to insert + const data = { + root: vaultRoot, // Using vaultRoot as the key + assets: assets, + }; + + // Perform the insert using Dexie + await accountVaults.add(data); + return `Successfully inserted vault with root: ${vaultRoot}`; + } catch (error) { + console.error(`Error inserting vault with root: ${vaultRoot}:`, error); + throw error; // Rethrow the error to handle it further up the call chain if needed + } +} + +export async function insertAccountAuth( + accountId, + auth +) { + try { + let accountIdStr = accountId.toString(); + let authBlob = new Blob([auth]); + + // Prepare the data object to insert + const data = { + accountId: accountIdStr, // Using accountId as the key + auth: authBlob, + }; + + // Perform the insert using Dexie + await accountAuths.add(data); + return `Successfully inserted auth for account: ${accountId}`; + } catch (error) { + console.error(`Error inserting auth for account: ${accountId}:`, error); + throw error; // Rethrow the error to handle it further up the call chain if needed + } +} + +export async function insertAccountRecord( + accountId, + code_root, + storage_root, + vault_root, + nonce, + committed, + account_seed +) { + try { + let accountIdStr = accountId.toString(); + let nonceStr = nonce.toString(); + let accountSeedBlob = new Blob([account_seed]); + + // Prepare the data object to insert + const data = { + id: accountIdStr, // Using accountId as the key + codeRoot: code_root, + storageRoot: storage_root, + vaultRoot: vault_root, + nonce: nonceStr, + committed: committed, + accountSeed: accountSeedBlob, + }; + + // Perform the insert using Dexie + await accounts.add(data); + return `Successfully inserted account: ${accountId}`; + } catch (error) { + console.error(`Error inserting account: ${accountId}:`, error); + throw error; // Rethrow the error to handle it further up the call chain if needed + } +} \ No newline at end of file diff --git a/wasm/js/db/greet.js b/wasm/js/db/greet.js new file mode 100644 index 000000000..d1e738e46 --- /dev/null +++ b/wasm/js/db/greet.js @@ -0,0 +1,17 @@ +import { greets } from './schema.js'; + +export async function insertGreeting(greeting) { + try { + // Prepare the data object to insert + const data = { + greeting: greeting + }; + + // Perform the insert using Dexie + await greets.add(data); + return `Successfully inserted greeting: ${greeting}`; + } catch (error) { + console.error(`Error inserting greeting: ${greeting}:`, error); + throw error; // Rethrow the error to handle it further up the call chain if needed + } +} \ No newline at end of file diff --git a/wasm/js/db/schema.js b/wasm/js/db/schema.js new file mode 100644 index 000000000..9ddf11a78 --- /dev/null +++ b/wasm/js/db/schema.js @@ -0,0 +1,54 @@ +import Dexie from "dexie"; + +const DATABASE_NAME = 'MidenClientDB'; + +export async function openDatabase() { + console.log('Opening database...') + try { + await db.open(); + console.log("Database opened successfully"); + return true; + } catch (err) { + console.error("Failed to open database: ", err); + return false; + } +} + +const Table = { + AccountCode: 'accountCode', + AccountStorage: 'accountStorage', + AccountVaults: 'accountVaults', + AccountAuth: 'accountAuth', + Accounts: 'accounts', + Greet: 'greets', +}; + +const db = new Dexie(DATABASE_NAME); +db.version(1).stores({ + [Table.AccountCode]: indexes('root'), + [Table.AccountStorage]: indexes('root'), + [Table.AccountVaults]: indexes('root'), + [Table.AccountAuth]: indexes('accountId'), + [Table.Accounts]: indexes('[id+nonce]', 'codeRoot', 'storageRoot', 'vaultRoot'), + [Table.Greet]: '++id', +}); + +function indexes(...items) { + return items.join(','); +} + +const accountCodes = db.table(Table.AccountCode); +const accountStorages = db.table(Table.AccountStorage); +const accountVaults = db.table(Table.AccountVaults); +const accountAuths = db.table(Table.AccountAuth); +const accounts = db.table(Table.Accounts); +const greets = db.table(Table.Greet); + +export { + accountCodes, + accountStorages, + accountVaults, + accountAuths, + accounts, + greets, +}; diff --git a/wasm/js/web-rpc-client.js b/wasm/js/web-rpc-client.js index 0a87cd51a..b730129f4 100644 --- a/wasm/js/web-rpc-client.js +++ b/wasm/js/web-rpc-client.js @@ -2,7 +2,7 @@ export async function testRpc(endpoint) { console.log(`Calling ${endpoint}`); const response = await fetch(endpoint); if (!response.ok) { - throw new Error(`HTTP error! Status: ${response.status}`); + console.log('Failed to call RPC endpoint'); } // Assuming you might do something with the response, but no return is needed } \ No newline at end of file diff --git a/wasm/package.json b/wasm/package.json index 162f58b46..f214f1ab7 100644 --- a/wasm/package.json +++ b/wasm/package.json @@ -1,22 +1,26 @@ { - "name": "miden-wasm", - "version": "1.0.0", - "description": "Wasm build for the Polygon Miden Client", - "type": "module", - "main": "./dist/index.js", - "browser": "./dist/index.js", - "types": "./dist/index.d.ts", - "exports": { - ".": "./dist/index.js" - }, - "scripts": { - "build": "rimraf dist && rollup -c rollup.config.js && rimraf dist/wasm*" - }, - "devDependencies": { - "@wasm-tool/rollup-plugin-rust": "^2.4.2", - "cpr": "^3.0.1", - "rimraf": "^5.0.1", - "rollup": "^3.27.2" - } + "name": "miden-wasm", + "version": "1.0.0", + "description": "Wasm build for the Polygon Miden Client", + "type": "module", + "main": "./dist/index.js", + "browser": "./dist/index.js", + "types": "./dist/index.d.ts", + "exports": { + ".": "./dist/index.js" + }, + "scripts": { + "build": "rimraf dist && rollup -c rollup.config.js && rimraf dist/wasm*" + }, + "devDependencies": { + "@rollup/plugin-commonjs": "^25.0.7", + "@rollup/plugin-node-resolve": "^15.2.3", + "@wasm-tool/rollup-plugin-rust": "^2.4.2", + "cpr": "^3.0.1", + "rimraf": "^5.0.1", + "rollup": "^3.27.2" + }, + "dependencies": { + "dexie": "^4.0.1" } - \ No newline at end of file +} diff --git a/wasm/rollup.config.js b/wasm/rollup.config.js index 3b5497832..a12cdcb04 100644 --- a/wasm/rollup.config.js +++ b/wasm/rollup.config.js @@ -1,4 +1,6 @@ import rust from "@wasm-tool/rollup-plugin-rust"; +import resolve from "@rollup/plugin-node-resolve"; +import commonjs from "@rollup/plugin-commonjs"; export default [ { @@ -24,6 +26,8 @@ export default [ typescriptDeclarationDir: "dist/crates", }, }), + resolve(), // Add this + commonjs(), // And this, if you have CommonJS modules ], }, { diff --git a/wasm/src/web_client/store/mod.rs b/wasm/src/web_client/store/mod.rs index afed9c4a0..0abe186be 100644 --- a/wasm/src/web_client/store/mod.rs +++ b/wasm/src/web_client/store/mod.rs @@ -5,28 +5,58 @@ use wasm_bindgen_futures::*; use async_trait::async_trait; -#[wasm_bindgen(module = "/js/db-operations.js")] +// Example +#[wasm_bindgen(module = "/js/db/greet.js")] extern "C" { - #[wasm_bindgen(js_name = setupIndexedDB)] - fn setup_indexed_db() -> js_sys::Promise; - #[wasm_bindgen(js_name = insertGreeting)] fn insert_greeting(greeting: String) -> js_sys::Promise; +} +// Initialize IndexedDB +#[wasm_bindgen(module = "/js/db/schema.js")] +extern "C" { + #[wasm_bindgen(js_name = openDatabase)] + fn setup_indexed_db() -> js_sys::Promise; +} + +// Account IndexedDB Operations +#[wasm_bindgen(module = "/js/db/accounts.js")] +extern "C" { #[wasm_bindgen(js_name = insertAccountCode)] - fn insert_account_code_web(code_root: String, code: String, module: Vec) -> js_sys::Promise; + fn idxdb_insert_account_code( + code_root: String, + code: String, + module: Vec + ) -> js_sys::Promise; #[wasm_bindgen(js_name = insertAccountStorage)] - fn insert_account_storage_web(storage_roots: String, storage_slots: Vec) -> js_sys::Promise; - + fn idxdb_insert_account_storage( + storage_root: String, + storage_slots: Vec + ) -> js_sys::Promise; + #[wasm_bindgen(js_name = insertAccountAssetVault)] - fn insert_account_asset_vault_web(vault_root: String, assets: String) -> js_sys::Promise; + fn idxdb_insert_account_asset_vault( + vault_root: String, + assets: String + ) -> js_sys::Promise; #[wasm_bindgen(js_name = insertAccountAuth)] - fn insert_account_auth_web(id: i64, auth_info: Vec) -> js_sys::Promise; + fn idxdb_insert_account_auth( + id: i64, + auth_info: Vec + ) -> js_sys::Promise; #[wasm_bindgen(js_name = insertAccountRecord)] - fn insert_account_record_web(id: i64, code_root: String, storage_root: String, vault_root: String, nonce: i64, committed: bool, account_seed: Option>) -> js_sys::Promise; + fn idxdb_insert_account_record( + id: i64, + code_root: String, + storage_root: String, + vault_root: String, + nonce: i64, + committed: bool, + account_seed: Option> + ) -> js_sys::Promise; } // TYPES @@ -81,7 +111,7 @@ impl Store for WebStore { // account_code: &AccountCode // ) -> Result<(), ()> { // let (code_root, code, module) = serialize_account_code(account_code)?; -// let result = JsFuture::from(insert_account_code_web(code_root, code, module)).await; +// let result = JsFuture::from(idxdb_insert_account_code(code_root, code, module)).await; // match result { // Ok(_) => Ok(()), // Err(_) => Err(()), @@ -111,7 +141,7 @@ impl Store for WebStore { // account_storage: &AccountStorage // ) -> Result<(), ()> { // let (storage_root, storage_slots) = serialize_account_storage(account_storage)?; -// let result = JsFuture::from(insert_account_storage_web(storage_root, storage_slots)).await; +// let result = JsFuture::from(idxdb_insert_account_storage(storage_root, storage_slots)).await; // match result { // Ok(_) => Ok(()), // Err(_) => Err(()), @@ -131,7 +161,7 @@ impl Store for WebStore { // asset_vault: &AssetVault // ) -> Result<(), ()> { // let (vault_root, assets) = serialize_account_asset_vault(asset_vault)?; -// let result = JsFuture::from(insert_account_asset_vault_web(vault_root, assets)).await; +// let result = JsFuture::from(idxdb_ insert_account_asset_vault(vault_root, assets)).await; // match result { // Ok(_) => Ok(()), // Err(_) => Err(()), @@ -160,7 +190,7 @@ impl Store for WebStore { // let (id, code_root, storage_root, vault_root, nonce, committed) = serialize_account(account)?; // let account_seed = account_seed.map(|seed| seed.to_bytes()); -// let result = JsFuture::from(insert_account_record_web( +// let result = JsFuture::from(idxdb_insert_account_record( // id, // code_root, // storage_root, @@ -201,7 +231,7 @@ impl Store for WebStore { // auth_info: &AuthInfo, // ) -> Result<(), ()> { // let (account_id, auth_info) = serialize_account_auth(account_id, auth_info)?; -// let result = JsFuture::from(insert_account_auth_web(account_id, auth_info)).await; +// let result = JsFuture::from(idxdb_insert_account_auth(account_id, auth_info)).await; // match result { // Ok(_) => Ok(()), // Err(_) => Err(()), diff --git a/wasm/test.html b/wasm/test.html index 38489b74d..20a7cf89a 100644 --- a/wasm/test.html +++ b/wasm/test.html @@ -9,19 +9,26 @@ \ No newline at end of file diff --git a/wasm/yarn.lock b/wasm/yarn.lock index 58aa1500e..709069e97 100644 --- a/wasm/yarn.lock +++ b/wasm/yarn.lock @@ -19,12 +19,41 @@ wrap-ansi "^8.1.0" wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" +"@jridgewell/sourcemap-codec@^1.4.15": + version "1.4.15" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" + integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== + "@pkgjs/parseargs@^0.11.0": version "0.11.0" resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== -"@rollup/pluginutils@^5.0.2": +"@rollup/plugin-commonjs@^25.0.7": + version "25.0.7" + resolved "https://registry.yarnpkg.com/@rollup/plugin-commonjs/-/plugin-commonjs-25.0.7.tgz#145cec7589ad952171aeb6a585bbeabd0fd3b4cf" + integrity sha512-nEvcR+LRjEjsaSsc4x3XZfCCvZIaSMenZu/OiwOKGN2UhQpAYI7ru7czFvyWbErlpoGjnSX3D5Ch5FcMA3kRWQ== + dependencies: + "@rollup/pluginutils" "^5.0.1" + commondir "^1.0.1" + estree-walker "^2.0.2" + glob "^8.0.3" + is-reference "1.2.1" + magic-string "^0.30.3" + +"@rollup/plugin-node-resolve@^15.2.3": + version "15.2.3" + resolved "https://registry.yarnpkg.com/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.2.3.tgz#e5e0b059bd85ca57489492f295ce88c2d4b0daf9" + integrity sha512-j/lym8nf5E21LwBT4Df1VD6hRO2L2iwUeUmP7litikRsVp1H6NWx20NEp0Y7su+7XGc476GnXXc4kFeZNGmaSQ== + dependencies: + "@rollup/pluginutils" "^5.0.1" + "@types/resolve" "1.20.2" + deepmerge "^4.2.2" + is-builtin-module "^3.2.1" + is-module "^1.0.0" + resolve "^1.22.1" + +"@rollup/pluginutils@^5.0.1", "@rollup/pluginutils@^5.0.2": version "5.1.0" resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-5.1.0.tgz#7e53eddc8c7f483a4ad0b94afb1f7f5fd3c771e0" integrity sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g== @@ -33,11 +62,16 @@ estree-walker "^2.0.2" picomatch "^2.3.1" -"@types/estree@^1.0.0": +"@types/estree@*", "@types/estree@^1.0.0": version "1.0.5" resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4" integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== +"@types/resolve@1.20.2": + version "1.20.2" + resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-1.20.2.tgz#97d26e00cd4a0423b4af620abecf3e6f442b7975" + integrity sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q== + "@wasm-tool/rollup-plugin-rust@^2.4.2": version "2.4.5" resolved "https://registry.yarnpkg.com/@wasm-tool/rollup-plugin-rust/-/rollup-plugin-rust-2.4.5.tgz#203e0be9196ad278533b0996bf29c6dae5b468ec" @@ -99,6 +133,11 @@ brace-expansion@^2.0.1: dependencies: balanced-match "^1.0.0" +builtin-modules@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.3.0.tgz#cae62812b89801e9656336e46223e030386be7b6" + integrity sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw== + chalk@^4.0.0: version "4.1.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" @@ -124,6 +163,11 @@ color-name@~1.1.4: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== + concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" @@ -148,6 +192,16 @@ cross-spawn@^7.0.0: shebang-command "^2.0.0" which "^2.0.1" +deepmerge@^4.2.2: + version "4.3.1" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" + integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== + +dexie@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/dexie/-/dexie-4.0.1.tgz#0b2aa9a39f706f0bb970134047afaa326a3c923e" + integrity sha512-wSNn+TcCh+DuE2pdg058K3MhxA4g+IiZlW7yGz4cMd/t3z2rJXZcV3HDxZljbrICU2Iq0qY4UHnbolTMK/+bcA== + eastasianwidth@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" @@ -193,6 +247,11 @@ fsevents@~2.3.2: resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== +function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== + glob@^10.2.2, glob@^10.3.7: version "10.3.10" resolved "https://registry.yarnpkg.com/glob/-/glob-10.3.10.tgz#0351ebb809fd187fe421ab96af83d3a70715df4b" @@ -216,6 +275,17 @@ glob@^7.1.3: once "^1.3.0" path-is-absolute "^1.0.0" +glob@^8.0.3: + version "8.1.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e" + integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^5.0.1" + once "^1.3.0" + graceful-fs@^4.1.5: version "4.2.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" @@ -226,6 +296,13 @@ has-flag@^4.0.0: resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== +hasown@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" + integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== + dependencies: + function-bind "^1.1.2" + inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" @@ -239,11 +316,37 @@ inherits@2: resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== +is-builtin-module@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-3.2.1.tgz#f03271717d8654cfcaf07ab0463faa3571581169" + integrity sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A== + dependencies: + builtin-modules "^3.3.0" + +is-core-module@^2.13.0: + version "2.13.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384" + integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw== + dependencies: + hasown "^2.0.0" + is-fullwidth-code-point@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== +is-module@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591" + integrity sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g== + +is-reference@1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/is-reference/-/is-reference-1.2.1.tgz#8b2dac0b371f4bc994fdeaba9eb542d03002d0b7" + integrity sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ== + dependencies: + "@types/estree" "*" + isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" @@ -263,6 +366,13 @@ jackspeak@^2.3.5: resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.2.0.tgz#0bd445ca57363465900f4d1f9bd8db343a4d95c3" integrity sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q== +magic-string@^0.30.3: + version "0.30.8" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.8.tgz#14e8624246d2bedba70d5462aa99ac9681844613" + integrity sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ== + dependencies: + "@jridgewell/sourcemap-codec" "^1.4.15" + minimatch@^3.1.1: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" @@ -270,6 +380,13 @@ minimatch@^3.1.1: dependencies: brace-expansion "^1.1.7" +minimatch@^5.0.1: + version "5.1.6" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" + integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== + dependencies: + brace-expansion "^2.0.1" + minimatch@^9.0.1: version "9.0.3" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825" @@ -343,6 +460,11 @@ path-key@^3.1.0: resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + path-scurry@^1.10.1: version "1.10.1" resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.10.1.tgz#9ba6bf5aa8500fe9fd67df4f0d9483b2b0bfc698" @@ -356,6 +478,15 @@ picomatch@^2.3.1: resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== +resolve@^1.22.1: + version "1.22.8" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" + integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== + dependencies: + is-core-module "^2.13.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + rimraf@^2.5.4: version "2.7.1" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" @@ -395,6 +526,7 @@ signal-exit@^4.0.1: integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== "string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0: + name string-width-cjs version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -413,6 +545,7 @@ string-width@^5.0.1, string-width@^5.1.2: strip-ansi "^7.0.1" "strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: + name strip-ansi-cjs version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -433,6 +566,11 @@ supports-color@^7.1.0: dependencies: has-flag "^4.0.0" +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + tar@^6.1.11: version "6.2.0" resolved "https://registry.yarnpkg.com/tar/-/tar-6.2.0.tgz#b14ce49a79cb1cd23bc9b016302dea5474493f73" From b0cc0a63193a12612bdd5b86a13917e0deb065b6 Mon Sep 17 00:00:00 2001 From: Dennis Garcia Date: Wed, 3 Apr 2024 13:34:55 -0500 Subject: [PATCH 05/42] Added rest of accounts methods (#4) --- wasm/js/db/accounts.js | 139 +++++++++- wasm/src/native_code/accounts.rs | 43 ++- wasm/src/native_code/store/mod.rs | 82 +++++- wasm/src/web_client/account.rs | 86 +++++- .../web_client/store/accounts/js_bindings.rs | 62 +++++ wasm/src/web_client/store/accounts/mod.rs | 165 ++++++++++++ wasm/src/web_client/store/accounts/models.rs | 37 +++ wasm/src/web_client/store/accounts/utils.rs | 150 +++++++++++ .../store/mock_example/js_bindings.js | 6 + wasm/src/web_client/store/mock_example/mod.rs | 12 + wasm/src/web_client/store/mod.rs | 249 +++--------------- wasm/test.html | 33 ++- 12 files changed, 834 insertions(+), 230 deletions(-) create mode 100644 wasm/src/web_client/store/accounts/js_bindings.rs create mode 100644 wasm/src/web_client/store/accounts/mod.rs create mode 100644 wasm/src/web_client/store/accounts/models.rs create mode 100644 wasm/src/web_client/store/accounts/utils.rs create mode 100644 wasm/src/web_client/store/mock_example/js_bindings.js create mode 100644 wasm/src/web_client/store/mock_example/mod.rs diff --git a/wasm/js/db/accounts.js b/wasm/js/db/accounts.js index 675b03912..fec24d2a6 100644 --- a/wasm/js/db/accounts.js +++ b/wasm/js/db/accounts.js @@ -6,6 +6,136 @@ import { accounts } from './schema.js'; +// GET FUNCTIONS +export async function getAccountStub( + accountId +) { + try { + // Fetch all records matching the given id + const allMatchingRecords = await db.accounts + .where('id') + .equals(accountId) + .toArray(); + + if (allMatchingRecords.length === 0) { + console.log('No records found for given ID.'); + return null; // No records found + } + + // Convert nonce to BigInt and sort + // Note: This assumes all nonces are valid BigInt strings. + const sortedRecords = allMatchingRecords.sort((a, b) => { + const bigIntA = BigInt(a.nonce); + const bigIntB = BigInt(b.nonce); + return bigIntA > bigIntB ? -1 : bigIntA < bigIntB ? 1 : 0; + }); + + // The first record is the most recent one due to the sorting + const mostRecentRecord = sortedRecords[0]; + console.log('Most recent record found:', mostRecentRecord); + + const account_seed_array_buffer = await data.account_seed.arrayBuffer(); + const accountStub = { + id: data.id, + nonce: data.nonce, + vault_root: data.vaultRoot, + storage_root: data.storageRoot, + code_root: data.codeRoot, + account_seed: new Uint8Array(account_seed_array_buffer) + } + return accountStub; + } catch (error) { + console.error('Error fetching most recent account record:', error); + throw error; // Re-throw the error for further handling + } +} + +export async function getAllAccountStubs() { + try { + // Fetch all records + const allRecords = await db.accounts.toArray(); + + // Use a Map to track the latest record for each id based on nonce + const latestRecordsMap = new Map(); + + allRecords.forEach(record => { + const existingRecord = latestRecordsMap.get(record.id); + if (!existingRecord || BigInt(record.nonce) > BigInt(existingRecord.nonce)) { + latestRecordsMap.set(record.id, record); + } + }); + + // Extract the latest records from the Map + const latestRecords = Array.from(latestRecordsMap.values()); + + console.log('Latest account stub for each id:', latestRecords); + return latestRecords.map(record => { + // Convert fields as necessary, assuming account_seed is already in the correct format + return { + id: record.id, + nonce: record.nonce, + vault_root: record.vaultRoot, + storage_root: record.storageRoot, + code_root: record.codeRoot, + account_seed: record.account_seed // Adjust based on your actual data structure + }; + }); + } catch (error) { + console.error('Error fetching all latest account stubs:', error); + throw error; + } +} + +export async function getAccountCode( + codeRoot +) { + try { + // Fetch all records matching the given root + const allMatchingRecords = await accountCodes + .where('root') + .equals(codeRoot) + .toArray(); + + if (allMatchingRecords.length === 0) { + console.log('No records found for given code root.'); + return null; // No records found + } + + // The first record is the only one due to the uniqueness constraint + const codeRecord = allMatchingRecords[0]; + console.log('Code record found:', codeRecord); + + // Convert the module Blob to an ArrayBuffer + const moduleArrayBuffer = await codeRecord.module.arrayBuffer(); + return { + root: codeRecord.root, + procedures: codeRecord.procedures, + module: new Uint8Array(moduleArrayBuffer), + }; + } catch (error) { + console.error('Error fetching code record:', error); + throw error; // Re-throw the error for further handling + } +} + +export async function getAccountIds() { + try { + let allIds = new Set(); // Use a Set to ensure uniqueness + + // Iterate over each account entry + await accounts.each(account => { + allIds.add(account.id); // Assuming 'account' has an 'id' property + }); + + return Array.from(allIds); // Convert back to array to return a list of unique IDs + } catch (error) { + console.error("Failed to retrieve account IDs: ", error); + throw error; // Or handle the error as fits your application's error handling strategy + } +} + +// INSERT FUNCTIONS + export async function insertAccountCode( codeRoot, code, @@ -78,12 +208,11 @@ export async function insertAccountAuth( auth ) { try { - let accountIdStr = accountId.toString(); let authBlob = new Blob([auth]); // Prepare the data object to insert const data = { - accountId: accountIdStr, // Using accountId as the key + accountId: accountId, // Using accountId as the key auth: authBlob, }; @@ -106,17 +235,15 @@ export async function insertAccountRecord( account_seed ) { try { - let accountIdStr = accountId.toString(); - let nonceStr = nonce.toString(); let accountSeedBlob = new Blob([account_seed]); // Prepare the data object to insert const data = { - id: accountIdStr, // Using accountId as the key + id: accountId, // Using accountId as the key codeRoot: code_root, storageRoot: storage_root, vaultRoot: vault_root, - nonce: nonceStr, + nonce: nonce, committed: committed, accountSeed: accountSeedBlob, }; diff --git a/wasm/src/native_code/accounts.rs b/wasm/src/native_code/accounts.rs index 4e93f6f1d..502469010 100644 --- a/wasm/src/native_code/accounts.rs +++ b/wasm/src/native_code/accounts.rs @@ -40,7 +40,7 @@ impl Client { pub async fn new_account( &mut self, template: AccountTemplate, - ) -> String { // TODO: Add back OG return type Result<(Account, Word), ()> + ) -> String { // TODO: Replace with Result<(Account, Word), ()> let mut rng = StdRng::from_entropy(); match template { @@ -70,7 +70,7 @@ impl Client { mutable_code: bool, rng: &mut StdRng, account_storage_mode: AccountStorageMode, - ) -> String { // TODO: Add back OG return type Result<(Account, Word), ()> + ) -> String { // TODO: Replace with Result<(Account, Word), ()> // if let AccountStorageMode::OnChain = account_storage_mode { // todo!("Recording the account on chain is not supported yet"); @@ -112,7 +112,7 @@ impl Client { max_supply: u64, rng: &mut StdRng, account_storage_mode: AccountStorageMode, - ) -> String{ // TODO: Add back OG return type Result<(Account, Word), ()> + ) -> String{ // TODO: Replace with Result<(Account, Word), ()> // if let AccountStorageMode::OnChain = account_storage_mode { // todo!("On-chain accounts are not supported yet"); @@ -141,4 +141,41 @@ impl Client { "Called new_fungible_faucet".to_string() } + + pub async fn get_account( + &mut self, + account_id: String // TODO: Replace with AccountId + ) -> String { // TODO: Replace with Result<(Account, Option), ()> + // self.store.get_account(account_id).map_err(|err| err.into()) + + "Called get_account".to_string() + } + + pub async fn get_accounts( + &mut self + ) -> String { // TODO: Replace with Result)>, ()> + // self.store.get_account_stubs().map_err(|err| err.into()) + + "Called get_accounts".to_string() + } + + pub async fn get_account_stub_by_id( + &self, + account_id: String, // TODO: Replace with AccountId + ) -> String { // TODO: Replace with Result<(AccountStub, Option), ()> + //self.store.get_account_stub(account_id).map_err(|err| err.into()) + + "Called get_account_stub_by_id".to_string() + } + + pub async fn get_account_auth( + &mut self, + account_id: String // TODO: Replace with AccountId + ) -> String { // TODO: Replace with Result + // self.store.get_account_auth(account_id).map_err(|err| err.into()) + + "Called get_account_auth".to_string() + } + + // TODO: Import Account } diff --git a/wasm/src/native_code/store/mod.rs b/wasm/src/native_code/store/mod.rs index f024394b3..191e62ab1 100644 --- a/wasm/src/native_code/store/mod.rs +++ b/wasm/src/native_code/store/mod.rs @@ -14,17 +14,89 @@ use async_trait::async_trait; // and add what we need for the browser-specific implementation #[async_trait(?Send)] pub trait Store { + // TEST + // -------------------------------------------------------------------------------------------- + async fn insert_string( &mut self, data: String ) -> Result<(), ()>; - // async fn insert_account( + // ACCOUNT + // -------------------------------------------------------------------------------------------- + + // // TODO.. idk where this should be defined + // async fn get_account_code( + // &mut self, + // root: Digest + // ) -> Result<(Vec, ModuleAst), ()>; + + // // TODO.. idk where this should be defined + // async fn get_account_storage( // &mut self, - // account: &Account, - // account_seed: Option, - // auth_info: &AuthInfo, - // ) -> Result<(), ()>; + // root: Digest + // ) -> Result; + + // // TODO.. idk where this should be defined + // async fn get_vault_assets( + // &mut self, + // root: Digest + // ) -> Result, ()>; + + /// Returns the account IDs of all accounts stored in the database + async fn get_account_ids(&self) -> Result, ()>; + + /// Returns a list of [AccountStub] of all accounts stored in the database along with the seeds + /// used to create them. + /// + /// Said accounts' state is the state after the last performed sync. + async fn get_account_stubs(&self) -> Result)>, ()>; + + /// Retrieves an [AccountStub] object for the specified [AccountId] along with the seed + /// used to create it. The seed will be returned if the account is new, otherwise it + /// will be `None`. + /// + /// Said account's state is the state according to the last sync performed. + /// + /// # Errors + /// Returns a `StoreError::AccountDataNotFound` if there is no account for the provided ID + async fn get_account_stub( + &self, + account_id: AccountId, + ) -> Result<(AccountStub, Option), ()>; + + /// Retrieves a full [Account] object. The seed will be returned if the account is new, + /// otherwise it will be `None`. + /// + /// This function returns the [Account]'s latest state. If the account is new (that is, has + /// never executed a trasaction), the returned seed will be `Some(Word)`; otherwise the seed + /// will be `None` + /// + /// # Errors + /// + /// Returns a `StoreError::AccountDataNotFound` if there is no account for the provided ID + async fn get_account( + &self, + account_id: AccountId, + ) -> Result<(Account, Option), ()>; + + /// Retrieves an account's [AuthInfo], utilized to authenticate the account. + /// + /// # Errors + /// + /// Returns a `StoreError::AccountDataNotFound` if there is no account for the provided ID + async fn get_account_auth( + &self, + account_id: AccountId, + ) -> Result; + + /// Inserts an [Account] along with the seed used to create it and its [AuthInfo] + async fn insert_account( + &mut self, + account: &Account, + account_seed: Option, + auth_info: &AuthInfo, + ) -> Result<(), ()>; } // DATABASE AUTH INFO diff --git a/wasm/src/web_client/account.rs b/wasm/src/web_client/account.rs index dda50e69b..b303b5aee 100644 --- a/wasm/src/web_client/account.rs +++ b/wasm/src/web_client/account.rs @@ -1,5 +1,7 @@ use super::WebClient; +//use miden_objects::{accounts::AccountId}; + use crate::native_code::accounts; use crate::native_code::rpc::NodeRpcClient; use crate::native_code::store::Store; @@ -28,7 +30,7 @@ pub enum AccountTemplate { // RPC call. #[wasm_bindgen] impl WebClient { - pub async fn fake_new_account(&mut self) -> Result { + pub async fn testStoreAndRpc(&mut self) -> Result { if let Some(ref mut client) = self.get_mut_inner() { let _ = client.store.insert_string("New account created".to_string()).await .map(|_| JsValue::from_str("Account created successfully")) @@ -105,4 +107,86 @@ impl WebClient { console::error_1(&"Client not initialized".into()); } } + + pub async fn get_account( + &mut self, + account_id: String // TODO: Replace with AccountId + ) -> () { + if let Some(ref mut client) = self.get_mut_inner() { + // let native_account_id = AccountId::from_hex(account_id).map_err(|err| { + // let error_message = err.to_string(); + // let js_value_error_message = JsValue::from_str(&error_message); + + // console::log_1(&js_value_error_message); + // }); + + let message = client.get_account(account_id).await; + let js_value_message = JsValue::from_str(&message); + + // Print the message to the Chrome console + console::log_1(&js_value_message); + } else { + console::error_1(&"Client not initialized".into()); + } + } + + pub async fn get_accounts( + &mut self + ) -> () { + if let Some(ref mut client) = self.get_mut_inner() { + let message = client.get_accounts().await; + let js_value_message = JsValue::from_str(&message); + + // Print the message to the Chrome console + console::log_1(&js_value_message); + } else { + console::error_1(&"Client not initialized".into()); + } + } + + pub async fn get_account_stub_by_id( + &mut self, + account_id: String // TODO: Replace with AccountId + ) -> () { + if let Some(ref mut client) = self.get_mut_inner() { + // let native_account_id = AccountId::from_hex(account_id).map_err(|err| { + // let error_message = err.to_string(); + // let js_value_error_message = JsValue::from_str(&error_message); + + // console::log_1(&js_value_error_message); + // }); + + let message = client.get_account_stub_by_id(account_id).await; + let js_value_message = JsValue::from_str(&message); + + // Print the message to the Chrome console + console::log_1(&js_value_message); + } else { + console::error_1(&"Client not initialized".into()); + } + } + + pub async fn get_account_auth( + &mut self, + account_id: String // TODO: Replace with AccountId + ) -> () { + if let Some(ref mut client) = self.get_mut_inner() { + // let native_account_id = AccountId::from_hex(account_id).map_err(|err| { + // let error_message = err.to_string(); + // let js_value_error_message = JsValue::from_str(&error_message); + + // console::log_1(&js_value_error_message); + // }); + + let message = client.get_account_auth(account_id).await; + let js_value_message = JsValue::from_str(&message); + + // Print the message to the Chrome console + console::log_1(&js_value_message); + } else { + console::error_1(&"Client not initialized".into()); + } + } + + // TODO: Import Account } \ No newline at end of file diff --git a/wasm/src/web_client/store/accounts/js_bindings.rs b/wasm/src/web_client/store/accounts/js_bindings.rs new file mode 100644 index 000000000..56195b63e --- /dev/null +++ b/wasm/src/web_client/store/accounts/js_bindings.rs @@ -0,0 +1,62 @@ +// Account IndexedDB Operations +#[wasm_bindgen(module = "/js/db/accounts.js")] +extern "C" { + // GETS + #[wasm_bindgen(js_name = getAccountStub)] + fn idxdb_get_account_stub( + account_id: String + ) -> JsValue; + + #[wasm_bindgen(js_name = getAccountCode)] + fn idxdb_get_account_code( + root: String + ) -> JsValue; + + #[wasm_bindgen(js_name = getAccountAuth)] + fn idxdb_get_account_auth( + account_id: String + ) -> JsValue; + + #[wasm_bindgen(js_name = getAllAccountStubs)] + fn idxdb_get_account_stubs() -> JsValue; + + #[wasm_bindgen(js_name = getAccountIds)] + fn idxdb_get_account_ids() -> JsValue; + + // INSERTS + #[wasm_bindgen(js_name = insertAccountCode)] + fn idxdb_insert_account_code( + code_root: String, + code: String, + module: Vec + ) -> js_sys::Promise; + + #[wasm_bindgen(js_name = insertAccountStorage)] + fn idxdb_insert_account_storage( + storage_root: String, + storage_slots: Vec + ) -> js_sys::Promise; + + #[wasm_bindgen(js_name = insertAccountAssetVault)] + fn idxdb_insert_account_asset_vault( + vault_root: String, + assets: String + ) -> js_sys::Promise; + + #[wasm_bindgen(js_name = insertAccountAuth)] + fn idxdb_insert_account_auth( + id: String, + auth_info: Vec + ) -> js_sys::Promise; + + #[wasm_bindgen(js_name = insertAccountRecord)] + fn idxdb_insert_account_record( + id: String, + code_root: String, + storage_root: String, + vault_root: String, + nonce: String, + committed: bool, + account_seed: Option> + ) -> js_sys::Promise; +} \ No newline at end of file diff --git a/wasm/src/web_client/store/accounts/mod.rs b/wasm/src/web_client/store/accounts/mod.rs new file mode 100644 index 000000000..c3df18d17 --- /dev/null +++ b/wasm/src/web_client/store/accounts/mod.rs @@ -0,0 +1,165 @@ +impl WebStore { + pub(super) async fn get_account_ids( + &mut self + ) -> Result, ()> { + let results: Vec = idxdb_get_account_ids().await?; + + let converted_results: Result, ()> = results.into_iter().map(|id| { + AccountId::from_hex(&id).map_err(|_err| ()) // Convert any error to `()` + }).collect(); // Collect into a Result, ()> + + // Now, `converted_results` is of type Result, ()>, which you can return directly + return converted_results; + } + + pub(super) async fn get_account_stubs( + &mut self + ) -> Result)>, ()> { + let results = idxdb_get_account_stubs(); + + let account_stubs_idxdb: Vec = from_value(results).unwrap(); + + // Convert each AccountRecordIdxdbObject to AccountStub (and pair with Option) + let account_stubs: Vec<(AccountStub, Option)> = account_stubs_idxdb.into_iter().map(|record| { + // Need to convert the hex string back to AccountId to then turn it into a u64 + let native_account_id: i64 = AccountId::from_hex(&record.id).map_err(|err| err.to_string())?; + let native_nonce: i64 = record.nonce.parse().unwrap(); + let account_seed = record.account_seed.map(|seed| Word::read_from_bytes(&seed)).transpose()?; + + // Convert AccountRecordIdxdbObject to AccountStub here + let account_stub = AccountStub { + id: native_account_id, + nonce: native_nonce, + vault_root: record.vault_root, + storage_root: record.storage_root, + code_root: record.code_root, + account_seed: account_seed, + }; + + // Pair AccountStub with Option, assuming we don't have a Word value to include + (account_stub, None) // Adjust this as needed based on how you derive Word from your data + }).collect(); + + Ok(account_stubs) + } + + pub(crate) async fn get_account_stub( + &self, + account_id: AccountId, + ) -> Result<(AccountStub, Option), ()> { + // Need to convert AccountId to hex string to match the IndexedDB key + let account_id_str = AccountId::to_hex(account_id).map_err(|err| err.to_string())?; + let result = idxdb_get_account_stub(account_id_str); + let account_stub_idxdb: AccountRecordIdxdbOjbect = from_value(result).unwrap(); + + // Need to convert the hex string back to AccountId to then turn it into a u64 + let native_account_id: i64 = AccountId::from_hex(&account_stub_idxdb.id).map_err(|err| err.to_string())?; + let native_nonce: i64 = account_stub_idxdb.nonce.parse().unwrap(); + let account_seed = account_stub_idxdb.account_seed.map(|seed| Word::read_from_bytes(&seed)).transpose()?; + + Ok(( + AccountStub::new( + (native_account_id as u64) + .try_into() + .expect("Conversion from stored AccountID should not panic"), + Felt::new(native_nonce as u64), + serde_json::from_str(&vault_root).map_err(StoreError::JsonDataDeserializationError)?, + Digest::try_from(&storage_root)?, + Digest::try_from(&code_root)?, + ), + account_seed, + )); + } + + pub(crate) async fn get_account( + &mut self, + account_id: AccountId + ) -> Result<(), ()> { // TODO: Replace with Result<(Account, Option), ()> + let (account_stub, seed) = self.get_account_stub(account_id)?; + let (_procedures, module_ast) = self.get_account_code(account_stub.code_root())?; + + let account_code = AccountCode::new(module_ast, &TransactionKernel::assembler()).unwrap(); + + let account_storage = self.get_account_storage(account_stub.storage_root())?; + + let account_vault = self.get_vault_assets(account_stub.vault_root())?; + let account_vault = AssetVault::new(&account_vault)?; + + let account = Account::new( + account_stub.id(), + account_vault, + account_storage, + account_code, + account_stub.nonce(), + ); + + Ok((account, seed)) + } + + pub(crate) async fn get_account_auth( + &mut self, + account_id: AccountId + ) -> Result { + let account_id_str = AccountId::to_hex(account_id).map_err(|err| err.to_string())?; + let result = idxdb_get_account_auth(account_id_str); + let auth_info_idxdb: AccountAuthIdxdbObject = from_value(result).unwrap(); + + // Convert the auth_info to the appropriate AuthInfo enum variant + let auth_info = AuthInfo::from_bytes(&auth_info_idxdb.auth_info); + Ok(auth_info) + } + + pub(super) async fn get_account_code( + &mut self, + root: Digest + ) -> Result<(Vec, ModuleAst), ()> { + let root_serialized = root.to_string(); + let result = idxdb_get_account_code(root_serialized); + let account_code_idxdb: AccountCodeIdxdbObject = from_value(result).unwrap(); + + let procedures = + serde_json::from_str(&account_code_idxdb.procedures)?; + let module = ModuleAst::from_bytes(&account_code_idxdb.module)?; + Ok((procedures, module)); + } + pub(super) async fn get_account_storage( + &mut self, + root: Digest + ) -> Result { + let root_serialized = &root.to_string(); + + let result = idxdb_get_account_storage(root_serialized); + let account_code_idxdb: AccountStorageIdxdbObject = from_value(result).unwrap(); + + let storage = AccountStorage::from_bytes(&account_code_idxdb.storage); + Ok(storage) + } + + pub(super) async fn get_vault_assets( + &mut self, + root: Digest + ) -> Result, ()> { + let root_serialized = &root.to_string(); + + let result = idxdb_get_vault_assets(root_serialized); + let vault_assets_idxdb: AccountVaultIdxdbObject = from_value(result).unwrap(); + + let assets = serde_json::from_str(&assets); + Ok(assets) + } + + pub(crate) async fn insert_account( + &mut self, + account: &Account, + account_seed: Option, + auth_info: &AuthInfo, + ) -> Result<(), ()> { + insert_account_code(account.code()).await?; + insert_account_storage(account.storage()).await?; + insert_account_asset_vault(account.vault()).await?; + insert_account_record(account, account_seed).await?; + insert_account_auth(account.id(), auth_info).await?; + + Ok(()) + } +} \ No newline at end of file diff --git a/wasm/src/web_client/store/accounts/models.rs b/wasm/src/web_client/store/accounts/models.rs new file mode 100644 index 000000000..8277589c8 --- /dev/null +++ b/wasm/src/web_client/store/accounts/models.rs @@ -0,0 +1,37 @@ +use serde::{Deserialize, Serialize}; + +#[derive(Serialize, Deserialize)] +pub struct AccountCodeIdxdbObject { + pub root: String, + pub procedures: String, + pub module: Vec, +} + +#[derive(Serialize, Deserialize)] +pub struct AccountAuthIdxdbObject { + pub id: String, + pub auth_info: Vec, +} + +#[derive(Serialize, Deserialize)] +pub struct AccountStorageIdxdbObject { + pub root: String, + pub storage: Vec, +} + +#[derive(Serialize, Deserialize)] +pub struct AccountVaultIdxdbObject { + pub root: String, + pub assets: String, +} + +#[derive(Serialize, Deserialize)] +pub struct AccountRecordIdxdbOjbect { + pub id: String, + pub nonce: String, + pub vault_root: String, + pub storage_root: String, + pub code_root: String, + // Use Vec to represent the Blob data in Rust. Conversion will be handled in JS. + pub account_seed: Option>, +} \ No newline at end of file diff --git a/wasm/src/web_client/store/accounts/utils.rs b/wasm/src/web_client/store/accounts/utils.rs new file mode 100644 index 000000000..1cd3c1990 --- /dev/null +++ b/wasm/src/web_client/store/accounts/utils.rs @@ -0,0 +1,150 @@ +// TYPES +// ================================================================================================ + +type SerializedAccountCodeData = (String, String, Vec); +type SerializedAccountStorageData = (String, Vec); +type SerializedAccountVaultData = (String, String); +type SerializedAccountAuthData = (String, Vec); +type SerializedAccountData = (String, String, String, String, String, bool); + +// ================================================================================================ + +async fn insert_account_code( + account_code: &AccountCode +) -> Result<(), ()> { + let (code_root, code, module) = serialize_account_code(account_code)?; + let result = JsFuture::from(idxdb_insert_account_code(code_root, code, module)).await; + match result { + Ok(_) => Ok(()), + Err(_) => Err(()), + } +} + +fn serialize_account_code( + account_code: &AccountCode, +) -> Result { + let root = account_code.root().to_string(); + let procedures = match serde_json::to_string(account_code.procedures()) { + Ok(procedures) => procedures, + Err(_) => return Err(()), + }; + // Assuming to_bytes() returns a Result and handling its error similarly + let module = match account_code.module().to_bytes(AstSerdeOptions { + serialize_imports: true, + }) { + Ok(module) => module, + Err(_) => return Err(()), + }; + + Ok((root, procedures, module)) +} + +async fn insert_account_storage( + account_storage: &AccountStorage +) -> Result<(), ()> { + let (storage_root, storage_slots) = serialize_account_storage(account_storage)?; + let result = JsFuture::from(idxdb_insert_account_storage(storage_root, storage_slots)).await; + match result { + Ok(_) => Ok(()), + Err(_) => Err(()), + } +} + +fn serialize_account_storage( + account_storage: &AccountStorage, +) -> Result { + let root = account_storage.root().to_string(); + let storage = account_storage.to_bytes(); + + Ok((root, storage)) +} + +async fn insert_account_asset_vault( + asset_vault: &AssetVault +) -> Result<(), ()> { + let (vault_root, assets) = serialize_account_asset_vault(asset_vault)?; + let result = JsFuture::from(idxdb_ insert_account_asset_vault(vault_root, assets)).await; + match result { + Ok(_) => Ok(()), + Err(_) => Err(()), + } +} + +fn serialize_account_asset_vault( + asset_vault: &AssetVault, +) -> Result { + let root = match serde_json::to_string(&asset_vault.commitment()) { + Ok(root) => root, + Err(_) => return Err(()), + }; + let assets: Vec = asset_vault.assets().collect(); + let assets = match serde_json::to_string(&assets) { + Ok(assets) => assets, + Err(_) => return Err(()), + }; + Ok((root, assets)) +} + +async fn insert_account_record( + account: &Account, + account_seed: Option, +) -> Result<(), ()> { + let (id, code_root, storage_root, vault_root, nonce, committed) = serialize_account(account)?; + let account_seed = account_seed.map(|seed| seed.to_bytes()); + + let result = JsFuture::from(idxdb_insert_account_record( + id, + code_root, + storage_root, + vault_root, + nonce, + committed, + account_seed, + )).await; + match result { + Ok(_) => Ok(()), + Err(_) => Err(()), + } +} + +fn serialize_account(account: &Account) -> Result { + let account_id_str = AccountId::to_hex(account.id()).map_err(|err| err.to_string())?; + let code_root = account.code().root().to_string(); + let storage_root = account.storage().root().to_string(); + let vault_root = match serde_json::to_string(&account.vault().commitment()) { + Ok(vault_root) => vault_root, + Err(_) => return Err(()), + }; + let committed = account.is_on_chain(); + let nonce = account.nonce().to_string(); + + Ok(( + account_id_str, + code_root, + storage_root, + vault_root, + nonce, + committed, + )) +} + +async fn insert_account_auth( + account_id: AccountId, + auth_info: &AuthInfo, +) -> Result<(), ()> { + let (account_id, auth_info) = serialize_account_auth(account_id, auth_info)?; + let result = JsFuture::from(idxdb_insert_account_auth(account_id, auth_info)).await; + match result { + Ok(_) => Ok(()), + Err(_) => Err(()), + } +} + +fn serialize_account_auth( + account_id: AccountId, + auth_info: &AuthInfo, +) -> Result { + let account_id_str = AccountId::to_hex(account_id).map_err(|err| err.to_string())?; + let auth_info = auth_info.to_bytes(); + Ok((account_id_str, auth_info)) +} \ No newline at end of file diff --git a/wasm/src/web_client/store/mock_example/js_bindings.js b/wasm/src/web_client/store/mock_example/js_bindings.js new file mode 100644 index 000000000..a9a3ee2dd --- /dev/null +++ b/wasm/src/web_client/store/mock_example/js_bindings.js @@ -0,0 +1,6 @@ +// Example +#[wasm_bindgen(module = "/js/db/greet.js")] +extern "C" { + #[wasm_bindgen(js_name = insertGreeting)] + fn insert_greeting(greeting: String) -> js_sys::Promise; +} \ No newline at end of file diff --git a/wasm/src/web_client/store/mock_example/mod.rs b/wasm/src/web_client/store/mock_example/mod.rs new file mode 100644 index 000000000..6cb646eae --- /dev/null +++ b/wasm/src/web_client/store/mock_example/mod.rs @@ -0,0 +1,12 @@ +impl WebStore { + pub(crate) async fn insert_string( + &mut self, + data: String + ) -> Result<(), ()> { + let result = JsFuture::from(insert_greeting(data)).await; + match result { + Ok(_) => Ok(()), + Err(_) => Err(()), + } + } +} \ No newline at end of file diff --git a/wasm/src/web_client/store/mod.rs b/wasm/src/web_client/store/mod.rs index 0abe186be..5098cfa27 100644 --- a/wasm/src/web_client/store/mod.rs +++ b/wasm/src/web_client/store/mod.rs @@ -2,16 +2,11 @@ use crate::native_code::store::Store; use wasm_bindgen::prelude::*; use wasm_bindgen_futures::*; +use serde::{Deserialize, Serialize}; +use serde_wasm_bindgen::from_value; use async_trait::async_trait; -// Example -#[wasm_bindgen(module = "/js/db/greet.js")] -extern "C" { - #[wasm_bindgen(js_name = insertGreeting)] - fn insert_greeting(greeting: String) -> js_sys::Promise; -} - // Initialize IndexedDB #[wasm_bindgen(module = "/js/db/schema.js")] extern "C" { @@ -19,54 +14,7 @@ extern "C" { fn setup_indexed_db() -> js_sys::Promise; } -// Account IndexedDB Operations -#[wasm_bindgen(module = "/js/db/accounts.js")] -extern "C" { - #[wasm_bindgen(js_name = insertAccountCode)] - fn idxdb_insert_account_code( - code_root: String, - code: String, - module: Vec - ) -> js_sys::Promise; - - #[wasm_bindgen(js_name = insertAccountStorage)] - fn idxdb_insert_account_storage( - storage_root: String, - storage_slots: Vec - ) -> js_sys::Promise; - - #[wasm_bindgen(js_name = insertAccountAssetVault)] - fn idxdb_insert_account_asset_vault( - vault_root: String, - assets: String - ) -> js_sys::Promise; - - #[wasm_bindgen(js_name = insertAccountAuth)] - fn idxdb_insert_account_auth( - id: i64, - auth_info: Vec - ) -> js_sys::Promise; - - #[wasm_bindgen(js_name = insertAccountRecord)] - fn idxdb_insert_account_record( - id: i64, - code_root: String, - storage_root: String, - vault_root: String, - nonce: i64, - committed: bool, - account_seed: Option> - ) -> js_sys::Promise; -} - -// TYPES - -type SerializedAccountCodeData = (String, String, Vec); -type SerializedAccountStorageData = (String, Vec); -type SerializedAccountVaultData = (String, String); -type SerializedAccountAuthData = (i64, Vec); -type SerializedAccountData = (i64, String, String, String, i64, bool); - +// WEB STORE IMPLEMENTATION // ================================================================================================ pub struct WebStore {} @@ -80,169 +28,50 @@ impl WebStore { #[async_trait(?Send)] impl Store for WebStore { + // TEST FUNCTION async fn insert_string( &mut self, data: String ) -> Result<(), ()> { - let result = JsFuture::from(insert_greeting(data)).await; - match result { - Ok(_) => Ok(()), - Err(_) => Err(()), - } + self.insert_string(data) } - // async fn insert_account( - // &mut self, - // account: &Account, - // account_seed: Option, - // auth_info: &AuthInfo, - // ) -> Result<(), ()> { - // insert_account_code(account.code()).await?; - // insert_account_storage(account.storage()).await?; - // insert_account_asset_vault(account.vault()).await?; - // insert_account_record(account, account_seed).await?; - // insert_account_auth(account.id(), auth_info).await?; - - // Ok(()) - // } -} - -// async fn insert_account_code( -// account_code: &AccountCode -// ) -> Result<(), ()> { -// let (code_root, code, module) = serialize_account_code(account_code)?; -// let result = JsFuture::from(idxdb_insert_account_code(code_root, code, module)).await; -// match result { -// Ok(_) => Ok(()), -// Err(_) => Err(()), -// } -// } - -// fn serialize_account_code( -// account_code: &AccountCode, -// ) -> Result { -// let root = account_code.root().to_string(); -// let procedures = match serde_json::to_string(account_code.procedures()) { -// Ok(procedures) => procedures, -// Err(_) => return Err(()), -// }; -// // Assuming to_bytes() returns a Result and handling its error similarly -// let module = match account_code.module().to_bytes(AstSerdeOptions { -// serialize_imports: true, -// }) { -// Ok(module) => module, -// Err(_) => return Err(()), -// }; - -// Ok((root, procedures, module)) -// } - -// async fn insert_account_storage( -// account_storage: &AccountStorage -// ) -> Result<(), ()> { -// let (storage_root, storage_slots) = serialize_account_storage(account_storage)?; -// let result = JsFuture::from(idxdb_insert_account_storage(storage_root, storage_slots)).await; -// match result { -// Ok(_) => Ok(()), -// Err(_) => Err(()), -// } -// } - -// fn serialize_account_storage( -// account_storage: &AccountStorage, -// ) -> Result { -// let root = account_storage.root().to_string(); -// let storage = account_storage.to_bytes(); - -// Ok((root, storage)) -// } - -// async fn insert_account_asset_vault( -// asset_vault: &AssetVault -// ) -> Result<(), ()> { -// let (vault_root, assets) = serialize_account_asset_vault(asset_vault)?; -// let result = JsFuture::from(idxdb_ insert_account_asset_vault(vault_root, assets)).await; -// match result { -// Ok(_) => Ok(()), -// Err(_) => Err(()), -// } -// } - -// fn serialize_account_asset_vault( -// asset_vault: &AssetVault, -// ) -> Result { -// let root = match serde_json::to_string(&asset_vault.commitment()) { -// Ok(root) => root, -// Err(_) => return Err(()), -// }; -// let assets: Vec = asset_vault.assets().collect(); -// let assets = match serde_json::to_string(&assets) { -// Ok(assets) => assets, -// Err(_) => return Err(()), -// }; -// Ok((root, assets)) -// } - -// async fn insert_account_record( -// account: &Account, -// account_seed: Option, -// ) -> Result<(), ()> { -// let (id, code_root, storage_root, vault_root, nonce, committed) = serialize_account(account)?; -// let account_seed = account_seed.map(|seed| seed.to_bytes()); + // ACCOUNTS + async fn insert_account( + &mut self, + account: &Account, + account_seed: Option, + auth_info: &AuthInfo, + ) -> Result<(), ()> { + self.insert_account(account, account_seed, auth_info) + } -// let result = JsFuture::from(idxdb_insert_account_record( -// id, -// code_root, -// storage_root, -// vault_root, -// nonce, -// committed, -// account_seed, -// )).await; -// match result { -// Ok(_) => Ok(()), -// Err(_) => Err(()), -// } -// } + async fn get_account_ids(&self) -> Result, ()> { + self.get_account_ids() + } -// fn serialize_account(account: &Account) -> Result { -// let id: u64 = account.id().into(); -// let code_root = account.code().root().to_string(); -// let storage_root = account.storage().root().to_string(); -// let vault_root = match serde_json::to_string(&account.vault().commitment()) { -// Ok(vault_root) => vault_root, -// Err(_) => return Err(()), -// }; -// let committed = account.is_on_chain(); -// let nonce = account.nonce().as_int() as i64; + async fn get_account_stubs(&self) -> Result)>, ()> { + self.get_account_stubs() + } -// Ok(( -// id as i64, -// code_root, -// storage_root, -// vault_root, -// nonce, -// committed, -// )) -// } + async fn get_account_stub( + &self, + account_id: AccountId, + ) -> Result<(AccountStub, Option), ()> { + self.get_account_stub(account_id) + } -// async fn insert_account_auth( -// account_id: AccountId, -// auth_info: &AuthInfo, -// ) -> Result<(), ()> { -// let (account_id, auth_info) = serialize_account_auth(account_id, auth_info)?; -// let result = JsFuture::from(idxdb_insert_account_auth(account_id, auth_info)).await; -// match result { -// Ok(_) => Ok(()), -// Err(_) => Err(()), -// } -// } + async fn get_account( + &self, + account_id: AccountId, + ) -> Result<(Account, Option), ()> { + self.get_account(account_id) + } -// fn serialize_account_auth( -// account_id: AccountId, -// auth_info: &AuthInfo, -// ) -> Result { -// let account_id: u64 = account_id.into(); -// let auth_info = auth_info.to_bytes(); -// Ok((account_id as i64, auth_info)) -// } \ No newline at end of file + async fn get_account_auth( + &self, + account_id: AccountId, + ) -> Result { + self.get_account_auth(account_id) + } +} \ No newline at end of file diff --git a/wasm/test.html b/wasm/test.html index 20a7cf89a..ea7f0d524 100644 --- a/wasm/test.html +++ b/wasm/test.html @@ -20,7 +20,7 @@ } } - async function testGreetExample(webClient) { + async function testStoreAndRpc(webClient) { try { await webClient.fake_new_account(); } catch (error) { @@ -40,16 +40,39 @@ try { await webClient.new_account(basicMutableTemplate); await webClient.new_account(fungibleFaucetTemplate); - // console.log(account); - // console.log(word); } catch (error) { - console.error('Failed to create client with web store:', error); + console.error('Failed to call create account:', error); + } + } + + async function testGetAccount(webClient) { + try { + await webClient.get_account("0xTestAccounStringHex"); + + } catch (error) { + console.error('Failed to call get account:', error); + + } + } + + async function testGetAccount(webClient) { + try { + await webClient.get_account("0xTestAccounStringHex"); + + } catch (error) { + console.error('Failed to call get account:', error); + } } + + let webClient = await testCreateClient(); - //await testGreetExample(webClient); + //await testStoreAndRpc(webClient); await testNewAccount(webClient); + await testGetAccount(webClient); + await testGetAccounts(webClient); + \ No newline at end of file From 50dc015419ccd4423a106bc10fdc44ce1d95e907 Mon Sep 17 00:00:00 2001 From: Dennis Garcia Date: Wed, 3 Apr 2024 17:41:44 -0500 Subject: [PATCH 06/42] Cleaned up some code and commented out anything with references to native objects (#5) --- wasm/Cargo.toml | 1 + wasm/js/db/accounts.js | 60 ++++ wasm/js/web-rpc-client.js | 8 +- wasm/src/native_code/accounts.rs | 16 +- wasm/src/native_code/rpc/mod.rs | 4 +- wasm/src/native_code/store/mod.rs | 91 ++--- wasm/src/web_client/account.rs | 36 +- .../web_client/store/accounts/js_bindings.rs | 45 ++- wasm/src/web_client/store/accounts/mod.rs | 335 +++++++++--------- wasm/src/web_client/store/accounts/utils.rs | 292 +++++++-------- .../store/mock_example/js_bindings.js | 6 - .../store/mock_example/js_bindings.rs | 9 + wasm/src/web_client/store/mock_example/mod.rs | 7 +- wasm/src/web_client/store/mod.rs | 74 ++-- wasm/src/web_client/web_rpc_client.rs | 16 +- wasm/test.html | 35 +- 16 files changed, 561 insertions(+), 474 deletions(-) delete mode 100644 wasm/src/web_client/store/mock_example/js_bindings.js create mode 100644 wasm/src/web_client/store/mock_example/js_bindings.rs diff --git a/wasm/Cargo.toml b/wasm/Cargo.toml index bdf0150e3..5c8a38884 100644 --- a/wasm/Cargo.toml +++ b/wasm/Cargo.toml @@ -13,6 +13,7 @@ futures = "0.3" getrandom = { version = "0.2", features = ["js"] } rand = { version = "0.8.5" } serde = { version = "1.0", features = ["derive"] } +serde_json = "1.0" serde-wasm-bindgen = "0.6.5" wasm-bindgen = { version = "0.2", features = ["serde-serialize"] } wasm-bindgen-futures = "0.4" diff --git a/wasm/js/db/accounts.js b/wasm/js/db/accounts.js index fec24d2a6..e2fd6f0e2 100644 --- a/wasm/js/db/accounts.js +++ b/wasm/js/db/accounts.js @@ -118,6 +118,66 @@ export async function getAccountCode( } } +export async function getAccountAssetVault( + vaultRoot +) { + try { + // Fetch all records matching the given root + const allMatchingRecords = await accountVaults + .where('root') + .equals(vaultRoot) + .toArray(); + + if (allMatchingRecords.length === 0) { + console.log('No records found for given code root.'); + return null; // No records found + } + + // The first record is the only one due to the uniqueness constraint + const vaultRecord = allMatchingRecords[0]; + console.log('Vault record found:', vaultRecord); + + return { + root: vaultRecord.root, + assets: vaultRecord.assets + }; + } catch (error) { + console.error('Error fetching code record:', error); + throw error; // Re-throw the error for further handling + } +} + +export async function getAccountStorage( + storageRoot +) { + try { + // Fetch all records matching the given root + const allMatchingRecords = await accountStorages + .where('root') + .equals(storageRoot) + .toArray(); + + if (allMatchingRecords.length === 0) { + console.log('No records found for given code root.'); + return null; // No records found + } + + // The first record is the only one due to the uniqueness constraint + const storageRecord = allMatchingRecords[0]; + console.log('Vault record found:', vaultRecord); + + // Convert the module Blob to an ArrayBuffer + const storageArrayBuffer = await storageRecord.storage.arrayBuffer(); + return { + root: storageRecord.root, + storage: storageArrayBuffer + }; + } catch (error) { + console.error('Error fetching code record:', error); + throw error; // Re-throw the error for further handling + } +} + export async function getAccountIds() { try { let allIds = new Set(); // Use a Set to ensure uniqueness diff --git a/wasm/js/web-rpc-client.js b/wasm/js/web-rpc-client.js index b730129f4..7e7894046 100644 --- a/wasm/js/web-rpc-client.js +++ b/wasm/js/web-rpc-client.js @@ -1,8 +1,8 @@ export async function testRpc(endpoint) { - console.log(`Calling ${endpoint}`); - const response = await fetch(endpoint); - if (!response.ok) { + try { + console.log(`Calling ${endpoint}`); + await fetch(endpoint); + } catch (error) { console.log('Failed to call RPC endpoint'); } - // Assuming you might do something with the response, but no return is needed } \ No newline at end of file diff --git a/wasm/src/native_code/accounts.rs b/wasm/src/native_code/accounts.rs index 502469010..9d746054f 100644 --- a/wasm/src/native_code/accounts.rs +++ b/wasm/src/native_code/accounts.rs @@ -142,6 +142,14 @@ impl Client { "Called new_fungible_faucet".to_string() } + pub async fn get_accounts( + &mut self + ) -> String { // TODO: Replace with Result)>, ()> + // self.store.get_account_stubs().map_err(|err| err.into()) + + "Called get_accounts".to_string() + } + pub async fn get_account( &mut self, account_id: String // TODO: Replace with AccountId @@ -151,14 +159,6 @@ impl Client { "Called get_account".to_string() } - pub async fn get_accounts( - &mut self - ) -> String { // TODO: Replace with Result)>, ()> - // self.store.get_account_stubs().map_err(|err| err.into()) - - "Called get_accounts".to_string() - } - pub async fn get_account_stub_by_id( &self, account_id: String, // TODO: Replace with AccountId diff --git a/wasm/src/native_code/rpc/mod.rs b/wasm/src/native_code/rpc/mod.rs index 3df6f465f..664377f02 100644 --- a/wasm/src/native_code/rpc/mod.rs +++ b/wasm/src/native_code/rpc/mod.rs @@ -1,7 +1,9 @@ +use wasm_bindgen::prelude::*; + use async_trait::async_trait; #[async_trait(?Send)] pub trait NodeRpcClient { // Test RPC method to be implemented by the client - async fn test_rpc(&mut self) -> Result<(), ()>; + async fn test_rpc(&mut self) -> Result<(), JsValue>; } \ No newline at end of file diff --git a/wasm/src/native_code/store/mod.rs b/wasm/src/native_code/store/mod.rs index 191e62ab1..61c769486 100644 --- a/wasm/src/native_code/store/mod.rs +++ b/wasm/src/native_code/store/mod.rs @@ -25,78 +25,31 @@ pub trait Store { // ACCOUNT // -------------------------------------------------------------------------------------------- - // // TODO.. idk where this should be defined - // async fn get_account_code( - // &mut self, - // root: Digest - // ) -> Result<(Vec, ModuleAst), ()>; + // async fn get_account_ids(&self) -> Result, ()>; - // // TODO.. idk where this should be defined - // async fn get_account_storage( - // &mut self, - // root: Digest - // ) -> Result; + // async fn get_account_stubs(&self) -> Result)>, ()>; + + // async fn get_account_stub( + // &self, + // account_id: AccountId, + // ) -> Result<(AccountStub, Option), ()>; + + // async fn get_account( + // &self, + // account_id: AccountId, + // ) -> Result<(Account, Option), ()>; - // // TODO.. idk where this should be defined - // async fn get_vault_assets( + // async fn get_account_auth( + // &self, + // account_id: AccountId, + // ) -> Result; + + // async fn insert_account( // &mut self, - // root: Digest - // ) -> Result, ()>; - - /// Returns the account IDs of all accounts stored in the database - async fn get_account_ids(&self) -> Result, ()>; - - /// Returns a list of [AccountStub] of all accounts stored in the database along with the seeds - /// used to create them. - /// - /// Said accounts' state is the state after the last performed sync. - async fn get_account_stubs(&self) -> Result)>, ()>; - - /// Retrieves an [AccountStub] object for the specified [AccountId] along with the seed - /// used to create it. The seed will be returned if the account is new, otherwise it - /// will be `None`. - /// - /// Said account's state is the state according to the last sync performed. - /// - /// # Errors - /// Returns a `StoreError::AccountDataNotFound` if there is no account for the provided ID - async fn get_account_stub( - &self, - account_id: AccountId, - ) -> Result<(AccountStub, Option), ()>; - - /// Retrieves a full [Account] object. The seed will be returned if the account is new, - /// otherwise it will be `None`. - /// - /// This function returns the [Account]'s latest state. If the account is new (that is, has - /// never executed a trasaction), the returned seed will be `Some(Word)`; otherwise the seed - /// will be `None` - /// - /// # Errors - /// - /// Returns a `StoreError::AccountDataNotFound` if there is no account for the provided ID - async fn get_account( - &self, - account_id: AccountId, - ) -> Result<(Account, Option), ()>; - - /// Retrieves an account's [AuthInfo], utilized to authenticate the account. - /// - /// # Errors - /// - /// Returns a `StoreError::AccountDataNotFound` if there is no account for the provided ID - async fn get_account_auth( - &self, - account_id: AccountId, - ) -> Result; - - /// Inserts an [Account] along with the seed used to create it and its [AuthInfo] - async fn insert_account( - &mut self, - account: &Account, - account_seed: Option, - auth_info: &AuthInfo, - ) -> Result<(), ()>; + // account: &Account, + // account_seed: Option, + // auth_info: &AuthInfo, + // ) -> Result<(), ()>; } // DATABASE AUTH INFO diff --git a/wasm/src/web_client/account.rs b/wasm/src/web_client/account.rs index b303b5aee..33b9aad84 100644 --- a/wasm/src/web_client/account.rs +++ b/wasm/src/web_client/account.rs @@ -30,11 +30,11 @@ pub enum AccountTemplate { // RPC call. #[wasm_bindgen] impl WebClient { - pub async fn testStoreAndRpc(&mut self) -> Result { + pub async fn test_store_and_rpc(&mut self) -> Result { if let Some(ref mut client) = self.get_mut_inner() { - let _ = client.store.insert_string("New account created".to_string()).await - .map(|_| JsValue::from_str("Account created successfully")) - .map_err(|_| JsValue::from_str("Failed to create new account")); + let _ = client.store.insert_string("Test string".to_string()).await + .map(|_| JsValue::from_str("Test string inserted successfully")) + .map_err(|_| JsValue::from_str("Failed to insert test string")); client.rpc_api.test_rpc().await // This is the new line .map(|_| JsValue::from_str("RPC call successful")) @@ -108,19 +108,11 @@ impl WebClient { } } - pub async fn get_account( - &mut self, - account_id: String // TODO: Replace with AccountId + pub async fn get_accounts( + &mut self ) -> () { if let Some(ref mut client) = self.get_mut_inner() { - // let native_account_id = AccountId::from_hex(account_id).map_err(|err| { - // let error_message = err.to_string(); - // let js_value_error_message = JsValue::from_str(&error_message); - - // console::log_1(&js_value_error_message); - // }); - - let message = client.get_account(account_id).await; + let message = client.get_accounts().await; let js_value_message = JsValue::from_str(&message); // Print the message to the Chrome console @@ -130,11 +122,19 @@ impl WebClient { } } - pub async fn get_accounts( - &mut self + pub async fn get_account( + &mut self, + account_id: String // TODO: Replace with AccountId ) -> () { if let Some(ref mut client) = self.get_mut_inner() { - let message = client.get_accounts().await; + // let native_account_id = AccountId::from_hex(account_id).map_err(|err| { + // let error_message = err.to_string(); + // let js_value_error_message = JsValue::from_str(&error_message); + + // console::log_1(&js_value_error_message); + // }); + + let message = client.get_account(account_id).await; let js_value_message = JsValue::from_str(&message); // Print the message to the Chrome console diff --git a/wasm/src/web_client/store/accounts/js_bindings.rs b/wasm/src/web_client/store/accounts/js_bindings.rs index 56195b63e..5571d6d43 100644 --- a/wasm/src/web_client/store/accounts/js_bindings.rs +++ b/wasm/src/web_client/store/accounts/js_bindings.rs @@ -1,56 +1,73 @@ +use wasm_bindgen::prelude::*; +use wasm_bindgen_futures::*; + // Account IndexedDB Operations #[wasm_bindgen(module = "/js/db/accounts.js")] extern "C" { // GETS + // ================================================================================================ + #[wasm_bindgen(js_name = getAccountStub)] - fn idxdb_get_account_stub( + pub fn idxdb_get_account_stub( account_id: String - ) -> JsValue; + ) -> js_sys::Promise; #[wasm_bindgen(js_name = getAccountCode)] - fn idxdb_get_account_code( - root: String - ) -> JsValue; + pub fn idxdb_get_account_code( + code_root: String + ) -> js_sys::Promise; + + #[wasm_bindgen(js_name = getAccountAssetVault)] + pub fn idxdb_get_account_asset_vault( + vault_root: String + ) -> js_sys::Promise; + + #[wasm_bindgen(js_name = getAccountStorage)] + pub fn idxdb_get_account_storage( + storage_root: String + ) -> js_sys::Promise; #[wasm_bindgen(js_name = getAccountAuth)] - fn idxdb_get_account_auth( + pub fn idxdb_get_account_auth( account_id: String - ) -> JsValue; + ) -> js_sys::Promise; #[wasm_bindgen(js_name = getAllAccountStubs)] - fn idxdb_get_account_stubs() -> JsValue; + pub fn idxdb_get_account_stubs() -> js_sys::Promise; #[wasm_bindgen(js_name = getAccountIds)] - fn idxdb_get_account_ids() -> JsValue; + pub fn idxdb_get_account_ids() -> js_sys::Promise; // INSERTS + // ================================================================================================ + #[wasm_bindgen(js_name = insertAccountCode)] - fn idxdb_insert_account_code( + pub fn idxdb_insert_account_code( code_root: String, code: String, module: Vec ) -> js_sys::Promise; #[wasm_bindgen(js_name = insertAccountStorage)] - fn idxdb_insert_account_storage( + pub fn idxdb_insert_account_storage( storage_root: String, storage_slots: Vec ) -> js_sys::Promise; #[wasm_bindgen(js_name = insertAccountAssetVault)] - fn idxdb_insert_account_asset_vault( + pub fn idxdb_insert_account_asset_vault( vault_root: String, assets: String ) -> js_sys::Promise; #[wasm_bindgen(js_name = insertAccountAuth)] - fn idxdb_insert_account_auth( + pub fn idxdb_insert_account_auth( id: String, auth_info: Vec ) -> js_sys::Promise; #[wasm_bindgen(js_name = insertAccountRecord)] - fn idxdb_insert_account_record( + pub fn idxdb_insert_account_record( id: String, code_root: String, storage_root: String, diff --git a/wasm/src/web_client/store/accounts/mod.rs b/wasm/src/web_client/store/accounts/mod.rs index c3df18d17..e0b350082 100644 --- a/wasm/src/web_client/store/accounts/mod.rs +++ b/wasm/src/web_client/store/accounts/mod.rs @@ -1,165 +1,184 @@ +// use wasm_bindgen_futures::*; +// use serde_wasm_bindgen::from_value; + +use super::WebStore; + +mod js_bindings; +// use js_bindings::*; + +mod models; +// use models::*; + +mod utils; +// use utils::*; + impl WebStore { - pub(super) async fn get_account_ids( - &mut self - ) -> Result, ()> { - let results: Vec = idxdb_get_account_ids().await?; + // pub(super) async fn get_account_ids( + // &mut self + // ) -> Result, ()> { + // let promise = idxdb_get_account_ids(); + // let js_value = JsFuture::from(promise).await?; + // let account_ids_as_strings: Vec = from_value(js_value).unwrap(); - let converted_results: Result, ()> = results.into_iter().map(|id| { - AccountId::from_hex(&id).map_err(|_err| ()) // Convert any error to `()` - }).collect(); // Collect into a Result, ()> + // let native_account_ids: Result, ()> = account_ids_as_strings.into_iter().map(|id| { + // AccountId::from_hex(&id).map_err(|_err| ()) // Convert any error to `()` + // }).collect(); // Collect into a Result, ()> - // Now, `converted_results` is of type Result, ()>, which you can return directly - return converted_results; - } - - pub(super) async fn get_account_stubs( - &mut self - ) -> Result)>, ()> { - let results = idxdb_get_account_stubs(); - - let account_stubs_idxdb: Vec = from_value(results).unwrap(); + // return native_account_ids; + // } + + // pub(super) async fn get_account_stubs( + // &mut self + // ) -> Result)>, ()> { + // let promise = idxdb_get_account_stubs(); + // let js_value = JsFuture::from(promise).await?; + // let account_stubs_idxdb: Vec = from_value(js_value).unwrap(); - // Convert each AccountRecordIdxdbObject to AccountStub (and pair with Option) - let account_stubs: Vec<(AccountStub, Option)> = account_stubs_idxdb.into_iter().map(|record| { - // Need to convert the hex string back to AccountId to then turn it into a u64 - let native_account_id: i64 = AccountId::from_hex(&record.id).map_err(|err| err.to_string())?; - let native_nonce: i64 = record.nonce.parse().unwrap(); - let account_seed = record.account_seed.map(|seed| Word::read_from_bytes(&seed)).transpose()?; + // let account_stubs: Vec<(AccountStub, Option)> = account_stubs_idxdb.into_iter().map(|record| { + // // Need to convert the hex string back to AccountId to then turn it into a u64 + // let native_account_id: i64 = AccountId::from_hex(&record.id).map_err(|err| err.to_string())?; + // let native_nonce: i64 = record.nonce.parse().unwrap(); + // let account_seed = record.account_seed.map(|seed| Word::read_from_bytes(&seed)).transpose()?; - // Convert AccountRecordIdxdbObject to AccountStub here - let account_stub = AccountStub { - id: native_account_id, - nonce: native_nonce, - vault_root: record.vault_root, - storage_root: record.storage_root, - code_root: record.code_root, - account_seed: account_seed, - }; - - // Pair AccountStub with Option, assuming we don't have a Word value to include - (account_stub, None) // Adjust this as needed based on how you derive Word from your data - }).collect(); - - Ok(account_stubs) - } - - pub(crate) async fn get_account_stub( - &self, - account_id: AccountId, - ) -> Result<(AccountStub, Option), ()> { - // Need to convert AccountId to hex string to match the IndexedDB key - let account_id_str = AccountId::to_hex(account_id).map_err(|err| err.to_string())?; - let result = idxdb_get_account_stub(account_id_str); - let account_stub_idxdb: AccountRecordIdxdbOjbect = from_value(result).unwrap(); - - // Need to convert the hex string back to AccountId to then turn it into a u64 - let native_account_id: i64 = AccountId::from_hex(&account_stub_idxdb.id).map_err(|err| err.to_string())?; - let native_nonce: i64 = account_stub_idxdb.nonce.parse().unwrap(); - let account_seed = account_stub_idxdb.account_seed.map(|seed| Word::read_from_bytes(&seed)).transpose()?; - - Ok(( - AccountStub::new( - (native_account_id as u64) - .try_into() - .expect("Conversion from stored AccountID should not panic"), - Felt::new(native_nonce as u64), - serde_json::from_str(&vault_root).map_err(StoreError::JsonDataDeserializationError)?, - Digest::try_from(&storage_root)?, - Digest::try_from(&code_root)?, - ), - account_seed, - )); - } - - pub(crate) async fn get_account( - &mut self, - account_id: AccountId - ) -> Result<(), ()> { // TODO: Replace with Result<(Account, Option), ()> - let (account_stub, seed) = self.get_account_stub(account_id)?; - let (_procedures, module_ast) = self.get_account_code(account_stub.code_root())?; - - let account_code = AccountCode::new(module_ast, &TransactionKernel::assembler()).unwrap(); - - let account_storage = self.get_account_storage(account_stub.storage_root())?; - - let account_vault = self.get_vault_assets(account_stub.vault_root())?; - let account_vault = AssetVault::new(&account_vault)?; - - let account = Account::new( - account_stub.id(), - account_vault, - account_storage, - account_code, - account_stub.nonce(), - ); - - Ok((account, seed)) - } - - pub(crate) async fn get_account_auth( - &mut self, - account_id: AccountId - ) -> Result { - let account_id_str = AccountId::to_hex(account_id).map_err(|err| err.to_string())?; - let result = idxdb_get_account_auth(account_id_str); - let auth_info_idxdb: AccountAuthIdxdbObject = from_value(result).unwrap(); + // let account_stub = AccountStub { + // id: native_account_id, + // nonce: native_nonce, + // vault_root: record.vault_root, + // storage_root: record.storage_root, + // code_root: record.code_root, + // account_seed: account_seed, + // }; + + // (account_stub, None) // Adjust this as needed based on how you derive Word from your data + // }).collect(); + + // Ok(account_stubs) + // } + + // pub(crate) async fn get_account_stub( + // &self, + // account_id: AccountId, + // ) -> Result<(AccountStub, Option), ()> { + // let account_id_str = AccountId::to_hex(account_id).map_err(|err| err.to_string())?; + + // let promise = idxdb_get_account_stub(account_id_str); + // let js_value = JsFuture::from(promise).await?; + // let account_stub_idxdb: AccountRecordIdxdbOjbect = from_value(js_value).unwrap(); + + // let native_account_id: i64 = AccountId::from_hex(&account_stub_idxdb.id).map_err(|err| err.to_string())?; + // let native_nonce: i64 = account_stub_idxdb.nonce.parse().unwrap(); + // let account_seed = account_stub_idxdb.account_seed.map(|seed| Word::read_from_bytes(&seed)).transpose()?; + + // Ok(( + // AccountStub::new( + // (native_account_id as u64) + // .try_into() + // .expect("Conversion from stored AccountID should not panic"), + // Felt::new(native_nonce as u64), + // serde_json::from_str(&account_stub_idxdb.vault_root).map_err(|err| err.to_string())?, + // Digest::try_from(&account_stub_idxdb.storage_root)?, + // Digest::try_from(&account_stub_idxdb.code_root)?, + // ), + // account_seed, + // )); + // } + + // pub(crate) async fn get_account( + // &mut self, + // account_id: AccountId + // ) -> Result<(), ()> { // TODO: Replace with Result<(Account, Option), ()> + // let (account_stub, seed) = self.get_account_stub(account_id)?; + // let (_procedures, module_ast) = self.get_account_code(account_stub.code_root())?; + + // let account_code = AccountCode::new(module_ast, &TransactionKernel::assembler()).unwrap(); + + // let account_storage = self.get_account_storage(account_stub.storage_root())?; + + // let account_vault = self.get_vault_assets(account_stub.vault_root())?; + // let account_vault = AssetVault::new(&account_vault)?; + + // let account = Account::new( + // account_stub.id(), + // account_vault, + // account_storage, + // account_code, + // account_stub.nonce(), + // ); + + // Ok((account, seed)) + // } + + // pub(crate) async fn get_account_auth( + // &mut self, + // account_id: AccountId + // ) -> Result { + // let account_id_str = AccountId::to_hex(account_id).map_err(|err| err.to_string())?; + + // let promise = idxdb_get_account_auth(account_id_str); + // let js_value = JsFuture::from(promise).await?; + // let auth_info_idxdb: AccountAuthIdxdbObject = from_value(js_value).unwrap(); - // Convert the auth_info to the appropriate AuthInfo enum variant - let auth_info = AuthInfo::from_bytes(&auth_info_idxdb.auth_info); - Ok(auth_info) - } - - pub(super) async fn get_account_code( - &mut self, - root: Digest - ) -> Result<(Vec, ModuleAst), ()> { - let root_serialized = root.to_string(); - let result = idxdb_get_account_code(root_serialized); - let account_code_idxdb: AccountCodeIdxdbObject = from_value(result).unwrap(); - - let procedures = - serde_json::from_str(&account_code_idxdb.procedures)?; - let module = ModuleAst::from_bytes(&account_code_idxdb.module)?; - Ok((procedures, module)); - } - pub(super) async fn get_account_storage( - &mut self, - root: Digest - ) -> Result { - let root_serialized = &root.to_string(); - - let result = idxdb_get_account_storage(root_serialized); - let account_code_idxdb: AccountStorageIdxdbObject = from_value(result).unwrap(); - - let storage = AccountStorage::from_bytes(&account_code_idxdb.storage); - Ok(storage) - } - - pub(super) async fn get_vault_assets( - &mut self, - root: Digest - ) -> Result, ()> { - let root_serialized = &root.to_string(); - - let result = idxdb_get_vault_assets(root_serialized); - let vault_assets_idxdb: AccountVaultIdxdbObject = from_value(result).unwrap(); - - let assets = serde_json::from_str(&assets); - Ok(assets) - } - - pub(crate) async fn insert_account( - &mut self, - account: &Account, - account_seed: Option, - auth_info: &AuthInfo, - ) -> Result<(), ()> { - insert_account_code(account.code()).await?; - insert_account_storage(account.storage()).await?; - insert_account_asset_vault(account.vault()).await?; - insert_account_record(account, account_seed).await?; - insert_account_auth(account.id(), auth_info).await?; - - Ok(()) - } + // // Convert the auth_info to the appropriate AuthInfo enum variant + // let auth_info = AuthInfo::from_bytes(&auth_info_idxdb.auth_info); + // Ok(auth_info) + // } + + // pub(super) async fn get_account_code( + // &mut self, + // root: Digest + // ) -> Result<(Vec, ModuleAst), ()> { + // let root_serialized = root.to_string(); + + // let promise = idxdb_get_account_code(root_serialized); + // let js_value = JsFuture::from(promise).await?; + // let account_code_idxdb: AccountCodeIdxdbObject = from_value(js_value).unwrap(); + + // let procedures = + // serde_json::from_str(&account_code_idxdb.procedures)?; + // let module = ModuleAst::from_bytes(&account_code_idxdb.module)?; + // Ok((procedures, module)); + // } + + // pub(super) async fn get_account_storage( + // &mut self, + // root: Digest + // ) -> Result { + // let root_serialized = &root.to_string(); + + // let promise = idxdb_get_account_storage(root_serialized); + // let js_value = JsFuture::from(promise).await?; + // let account_storage_idxdb: AccountStorageIdxdbObject = from_value(js_value).unwrap(); + + // let storage = AccountStorage::from_bytes(&account_code_idxdb.storage); + // Ok(storage) + // } + + // pub(super) async fn get_vault_assets( + // &mut self, + // root: Digest + // ) -> Result, ()> { + // let root_serialized = &root.to_string(); + + // let promise = idxdb_get_account_asset_vault(root_serialized); + // let js_value = JsFuture::from(promise).await?; + // let vault_assets_idxdb: AccountVaultIdxdbObject = from_value(js_value).unwrap(); + + // let assets = serde_json::from_str(&vault_assets_idxdb.assets); + // Ok(assets) + // } + + // pub(crate) async fn insert_account( + // &mut self, + // account: &Account, + // account_seed: Option, + // auth_info: &AuthInfo, + // ) -> Result<(), ()> { + // insert_account_code(account.code()).await?; + // insert_account_storage(account.storage()).await?; + // insert_account_asset_vault(account.vault()).await?; + // insert_account_record(account, account_seed).await?; + // insert_account_auth(account.id(), auth_info).await?; + + // Ok(()) + // } } \ No newline at end of file diff --git a/wasm/src/web_client/store/accounts/utils.rs b/wasm/src/web_client/store/accounts/utils.rs index 1cd3c1990..d4c3588b7 100644 --- a/wasm/src/web_client/store/accounts/utils.rs +++ b/wasm/src/web_client/store/accounts/utils.rs @@ -1,150 +1,154 @@ +// use wasm_bindgen_futures::*; + +// use super::js_bindings::*; + // TYPES // ================================================================================================ -type SerializedAccountCodeData = (String, String, Vec); -type SerializedAccountStorageData = (String, Vec); -type SerializedAccountVaultData = (String, String); -type SerializedAccountAuthData = (String, Vec); -type SerializedAccountData = (String, String, String, String, String, bool); +// type SerializedAccountCodeData = (String, String, Vec); +// type SerializedAccountStorageData = (String, Vec); +// type SerializedAccountVaultData = (String, String); +// type SerializedAccountAuthData = (String, Vec); +// type SerializedAccountData = (String, String, String, String, String, bool); // ================================================================================================ -async fn insert_account_code( - account_code: &AccountCode -) -> Result<(), ()> { - let (code_root, code, module) = serialize_account_code(account_code)?; - let result = JsFuture::from(idxdb_insert_account_code(code_root, code, module)).await; - match result { - Ok(_) => Ok(()), - Err(_) => Err(()), - } -} - -fn serialize_account_code( - account_code: &AccountCode, -) -> Result { - let root = account_code.root().to_string(); - let procedures = match serde_json::to_string(account_code.procedures()) { - Ok(procedures) => procedures, - Err(_) => return Err(()), - }; - // Assuming to_bytes() returns a Result and handling its error similarly - let module = match account_code.module().to_bytes(AstSerdeOptions { - serialize_imports: true, - }) { - Ok(module) => module, - Err(_) => return Err(()), - }; - - Ok((root, procedures, module)) -} - -async fn insert_account_storage( - account_storage: &AccountStorage -) -> Result<(), ()> { - let (storage_root, storage_slots) = serialize_account_storage(account_storage)?; - let result = JsFuture::from(idxdb_insert_account_storage(storage_root, storage_slots)).await; - match result { - Ok(_) => Ok(()), - Err(_) => Err(()), - } -} - -fn serialize_account_storage( - account_storage: &AccountStorage, -) -> Result { - let root = account_storage.root().to_string(); - let storage = account_storage.to_bytes(); - - Ok((root, storage)) -} - -async fn insert_account_asset_vault( - asset_vault: &AssetVault -) -> Result<(), ()> { - let (vault_root, assets) = serialize_account_asset_vault(asset_vault)?; - let result = JsFuture::from(idxdb_ insert_account_asset_vault(vault_root, assets)).await; - match result { - Ok(_) => Ok(()), - Err(_) => Err(()), - } -} - -fn serialize_account_asset_vault( - asset_vault: &AssetVault, -) -> Result { - let root = match serde_json::to_string(&asset_vault.commitment()) { - Ok(root) => root, - Err(_) => return Err(()), - }; - let assets: Vec = asset_vault.assets().collect(); - let assets = match serde_json::to_string(&assets) { - Ok(assets) => assets, - Err(_) => return Err(()), - }; - Ok((root, assets)) -} - -async fn insert_account_record( - account: &Account, - account_seed: Option, -) -> Result<(), ()> { - let (id, code_root, storage_root, vault_root, nonce, committed) = serialize_account(account)?; - let account_seed = account_seed.map(|seed| seed.to_bytes()); - - let result = JsFuture::from(idxdb_insert_account_record( - id, - code_root, - storage_root, - vault_root, - nonce, - committed, - account_seed, - )).await; - match result { - Ok(_) => Ok(()), - Err(_) => Err(()), - } -} - -fn serialize_account(account: &Account) -> Result { - let account_id_str = AccountId::to_hex(account.id()).map_err(|err| err.to_string())?; - let code_root = account.code().root().to_string(); - let storage_root = account.storage().root().to_string(); - let vault_root = match serde_json::to_string(&account.vault().commitment()) { - Ok(vault_root) => vault_root, - Err(_) => return Err(()), - }; - let committed = account.is_on_chain(); - let nonce = account.nonce().to_string(); - - Ok(( - account_id_str, - code_root, - storage_root, - vault_root, - nonce, - committed, - )) -} - -async fn insert_account_auth( - account_id: AccountId, - auth_info: &AuthInfo, -) -> Result<(), ()> { - let (account_id, auth_info) = serialize_account_auth(account_id, auth_info)?; - let result = JsFuture::from(idxdb_insert_account_auth(account_id, auth_info)).await; - match result { - Ok(_) => Ok(()), - Err(_) => Err(()), - } -} - -fn serialize_account_auth( - account_id: AccountId, - auth_info: &AuthInfo, -) -> Result { - let account_id_str = AccountId::to_hex(account_id).map_err(|err| err.to_string())?; - let auth_info = auth_info.to_bytes(); - Ok((account_id_str, auth_info)) -} \ No newline at end of file +// pub async fn insert_account_code( +// account_code: &AccountCode +// ) -> Result<(), ()> { +// let (code_root, code, module) = serialize_account_code(account_code)?; +// let result = JsFuture::from(idxdb_insert_account_code(code_root, code, module)).await; +// match result { +// Ok(_) => Ok(()), +// Err(_) => Err(()), +// } +// } + +// fn serialize_account_code( +// account_code: &AccountCode, +// ) -> Result { +// let root = account_code.root().to_string(); +// let procedures = match serde_json::to_string(account_code.procedures()) { +// Ok(procedures) => procedures, +// Err(_) => return Err(()), +// }; +// // Assuming to_bytes() returns a Result and handling its error similarly +// let module = match account_code.module().to_bytes(AstSerdeOptions { +// serialize_imports: true, +// }) { +// Ok(module) => module, +// Err(_) => return Err(()), +// }; + +// Ok((root, procedures, module)) +// } + +// pub async fn insert_account_storage( +// account_storage: &AccountStorage +// ) -> Result<(), ()> { +// let (storage_root, storage_slots) = serialize_account_storage(account_storage)?; +// let result = JsFuture::from(idxdb_insert_account_storage(storage_root, storage_slots)).await; +// match result { +// Ok(_) => Ok(()), +// Err(_) => Err(()), +// } +// } + +// fn serialize_account_storage( +// account_storage: &AccountStorage, +// ) -> Result { +// let root = account_storage.root().to_string(); +// let storage = account_storage.to_bytes(); + +// Ok((root, storage)) +// } + +// pub async fn insert_account_asset_vault( +// asset_vault: &AssetVault +// ) -> Result<(), ()> { +// let (vault_root, assets) = serialize_account_asset_vault(asset_vault)?; +// let result = JsFuture::from(idxdb_insert_account_asset_vault(vault_root, assets)).await; +// match result { +// Ok(_) => Ok(()), +// Err(_) => Err(()), +// } +// } + +// fn serialize_account_asset_vault( +// asset_vault: &AssetVault, +// ) -> Result { +// let root = match serde_json::to_string(&asset_vault.commitment()) { +// Ok(root) => root, +// Err(_) => return Err(()), +// }; +// let assets: Vec = asset_vault.assets().collect(); +// let assets = match serde_json::to_string(&assets) { +// Ok(assets) => assets, +// Err(_) => return Err(()), +// }; +// Ok((root, assets)) +// } + +// pub async fn insert_account_record( +// account: &Account, +// account_seed: Option, +// ) -> Result<(), ()> { +// let (id, code_root, storage_root, vault_root, nonce, committed) = serialize_account(account)?; +// let account_seed = account_seed.map(|seed| seed.to_bytes()); + +// let result = JsFuture::from(idxdb_insert_account_record( +// id, +// code_root, +// storage_root, +// vault_root, +// nonce, +// committed, +// account_seed, +// )).await; +// match result { +// Ok(_) => Ok(()), +// Err(_) => Err(()), +// } +// } + +// fn serialize_account(account: &Account) -> Result { +// let account_id_str = AccountId::to_hex(account.id()).map_err(|err| err.to_string())?; +// let code_root = account.code().root().to_string(); +// let storage_root = account.storage().root().to_string(); +// let vault_root = match serde_json::to_string(&account.vault().commitment()) { +// Ok(vault_root) => vault_root, +// Err(_) => return Err(()), +// }; +// let committed = account.is_on_chain(); +// let nonce = account.nonce().to_string(); + +// Ok(( +// account_id_str, +// code_root, +// storage_root, +// vault_root, +// nonce, +// committed, +// )) +// } + +// pub async fn insert_account_auth( +// account_id: AccountId, +// auth_info: &AuthInfo, +// ) -> Result<(), ()> { +// let (account_id, auth_info) = serialize_account_auth(account_id, auth_info)?; +// let result = JsFuture::from(idxdb_insert_account_auth(account_id, auth_info)).await; +// match result { +// Ok(_) => Ok(()), +// Err(_) => Err(()), +// } +// } + +// fn serialize_account_auth( +// account_id: AccountId, +// auth_info: &AuthInfo, +// ) -> Result { +// let account_id_str = AccountId::to_hex(account_id).map_err(|err| err.to_string())?; +// let auth_info = auth_info.to_bytes(); +// Ok((account_id_str, auth_info)) +// } \ No newline at end of file diff --git a/wasm/src/web_client/store/mock_example/js_bindings.js b/wasm/src/web_client/store/mock_example/js_bindings.js deleted file mode 100644 index a9a3ee2dd..000000000 --- a/wasm/src/web_client/store/mock_example/js_bindings.js +++ /dev/null @@ -1,6 +0,0 @@ -// Example -#[wasm_bindgen(module = "/js/db/greet.js")] -extern "C" { - #[wasm_bindgen(js_name = insertGreeting)] - fn insert_greeting(greeting: String) -> js_sys::Promise; -} \ No newline at end of file diff --git a/wasm/src/web_client/store/mock_example/js_bindings.rs b/wasm/src/web_client/store/mock_example/js_bindings.rs new file mode 100644 index 000000000..c098ef5de --- /dev/null +++ b/wasm/src/web_client/store/mock_example/js_bindings.rs @@ -0,0 +1,9 @@ +use wasm_bindgen::prelude::*; +use wasm_bindgen_futures::*; + +// Example +#[wasm_bindgen(module = "/js/db/greet.js")] +extern "C" { + #[wasm_bindgen(js_name = insertGreeting)] + pub fn insert_greeting(greeting: String) -> js_sys::Promise; +} \ No newline at end of file diff --git a/wasm/src/web_client/store/mock_example/mod.rs b/wasm/src/web_client/store/mock_example/mod.rs index 6cb646eae..c49f546e6 100644 --- a/wasm/src/web_client/store/mock_example/mod.rs +++ b/wasm/src/web_client/store/mock_example/mod.rs @@ -1,9 +1,14 @@ +use wasm_bindgen_futures::*; + +use super::WebStore; +mod js_bindings; + impl WebStore { pub(crate) async fn insert_string( &mut self, data: String ) -> Result<(), ()> { - let result = JsFuture::from(insert_greeting(data)).await; + let result = JsFuture::from(js_bindings::insert_greeting(data)).await; match result { Ok(_) => Ok(()), Err(_) => Err(()), diff --git a/wasm/src/web_client/store/mod.rs b/wasm/src/web_client/store/mod.rs index 5098cfa27..7cf02b268 100644 --- a/wasm/src/web_client/store/mod.rs +++ b/wasm/src/web_client/store/mod.rs @@ -2,11 +2,12 @@ use crate::native_code::store::Store; use wasm_bindgen::prelude::*; use wasm_bindgen_futures::*; -use serde::{Deserialize, Serialize}; -use serde_wasm_bindgen::from_value; use async_trait::async_trait; +pub mod accounts; +pub mod mock_example; + // Initialize IndexedDB #[wasm_bindgen(module = "/js/db/schema.js")] extern "C" { @@ -14,9 +15,6 @@ extern "C" { fn setup_indexed_db() -> js_sys::Promise; } -// WEB STORE IMPLEMENTATION -// ================================================================================================ - pub struct WebStore {} impl WebStore { @@ -33,45 +31,45 @@ impl Store for WebStore { &mut self, data: String ) -> Result<(), ()> { - self.insert_string(data) + self.insert_string(data).await } // ACCOUNTS - async fn insert_account( - &mut self, - account: &Account, - account_seed: Option, - auth_info: &AuthInfo, - ) -> Result<(), ()> { - self.insert_account(account, account_seed, auth_info) - } + // async fn insert_account( + // &mut self, + // account: &Account, + // account_seed: Option, + // auth_info: &AuthInfo, + // ) -> Result<(), ()> { + // self.insert_account(account, account_seed, auth_info) + // } - async fn get_account_ids(&self) -> Result, ()> { - self.get_account_ids() - } + // async fn get_account_ids(&self) -> Result, ()> { + // self.get_account_ids() + // } - async fn get_account_stubs(&self) -> Result)>, ()> { - self.get_account_stubs() - } + // async fn get_account_stubs(&self) -> Result)>, ()> { + // self.get_account_stubs() + // } - async fn get_account_stub( - &self, - account_id: AccountId, - ) -> Result<(AccountStub, Option), ()> { - self.get_account_stub(account_id) - } + // async fn get_account_stub( + // &self, + // account_id: AccountId, + // ) -> Result<(AccountStub, Option), ()> { + // self.get_account_stub(account_id) + // } - async fn get_account( - &self, - account_id: AccountId, - ) -> Result<(Account, Option), ()> { - self.get_account(account_id) - } + // async fn get_account( + // &self, + // account_id: AccountId, + // ) -> Result<(Account, Option), ()> { + // self.get_account(account_id) + // } - async fn get_account_auth( - &self, - account_id: AccountId, - ) -> Result { - self.get_account_auth(account_id) - } + // async fn get_account_auth( + // &self, + // account_id: AccountId, + // ) -> Result { + // self.get_account_auth(account_id) + // } } \ No newline at end of file diff --git a/wasm/src/web_client/web_rpc_client.rs b/wasm/src/web_client/web_rpc_client.rs index 245eeec15..15987b935 100644 --- a/wasm/src/web_client/web_rpc_client.rs +++ b/wasm/src/web_client/web_rpc_client.rs @@ -1,12 +1,14 @@ use crate::native_code::rpc::NodeRpcClient; -use async_trait::async_trait; use wasm_bindgen::prelude::*; +use wasm_bindgen_futures::*; + +use async_trait::async_trait; #[wasm_bindgen(module = "/js/web-rpc-client.js")] extern "C" { #[wasm_bindgen(js_name = testRpc)] - async fn test_rpc(endpoint: String) -> JsValue; // Directly return JsValue + fn test_rpc(endpoint: String) -> js_sys::Promise; } pub struct WebRpcClient { @@ -23,10 +25,14 @@ impl WebRpcClient { #[async_trait(?Send)] impl NodeRpcClient for WebRpcClient { - async fn test_rpc(&mut self) -> Result<(), ()> { - let result = test_rpc(self.endpoint.clone()).await; // This now directly returns a JsValue + async fn test_rpc(&mut self) -> Result<(), JsValue> { + // Now correctly handling the Promise returned by test_rpc + let promise = test_rpc("https://www.google.com".to_string()); + let result = JsFuture::from(promise).await; + match result { - _ => Ok(()), // Treat any result as success; adjust as needed for actual error handling + Ok(_) => Ok(()), + Err(e) => Err(e), } } } \ No newline at end of file diff --git a/wasm/test.html b/wasm/test.html index ea7f0d524..6e55eea47 100644 --- a/wasm/test.html +++ b/wasm/test.html @@ -22,7 +22,7 @@ async function testStoreAndRpc(webClient) { try { - await webClient.fake_new_account(); + await webClient.test_store_and_rpc(); } catch (error) { console.error('Failed to create client with web store:', error); } @@ -45,12 +45,12 @@ } } - async function testGetAccount(webClient) { + async function testGetAccounts(webClient) { try { - await webClient.get_account("0xTestAccounStringHex"); + await webClient.get_accounts(); } catch (error) { - console.error('Failed to call get account:', error); + console.error('Failed to call get accounts:', error); } } @@ -65,14 +65,33 @@ } } - + async function testGetAccountStubById(webClient) { + try { + await webClient.get_account_stub_by_id("0xTestAccounStringHex"); + + } catch (error) { + console.error('Failed to call get account stub by id:', error); + + } + } + + async function testGetAccountAuth(webClient) { + try { + await webClient.get_account_auth("0xTestAccounStringHex"); + + } catch (error) { + console.error('Failed to call get account auth:', error); + + } + } let webClient = await testCreateClient(); - //await testStoreAndRpc(webClient); + await testStoreAndRpc(webClient); await testNewAccount(webClient); - await testGetAccount(webClient); await testGetAccounts(webClient); - + await testGetAccount(webClient); + await testGetAccountStubById(webClient); + await testGetAccountAuth(webClient); \ No newline at end of file From 147fb5127da0b8715c2eabcabdc0fe7e92d1c7ee Mon Sep 17 00:00:00 2001 From: Dennis Garcia Date: Sun, 7 Apr 2024 00:25:26 -0500 Subject: [PATCH 07/42] Finished adding skeleton code for notes (#6) --- wasm/Cargo.toml | 4 +- wasm/js/db/accounts.js | 4 +- wasm/js/db/notes.js | 120 +++++++++++++ wasm/js/db/schema.js | 8 + wasm/src/native_code/mod.rs | 1 + wasm/src/native_code/notes.rs | 45 +++++ wasm/src/native_code/store/mod.rs | 44 ++++- wasm/src/web_client/mod.rs | 1 + wasm/src/web_client/notes.rs | 83 +++++++++ wasm/src/web_client/store/mod.rs | 38 +++- .../src/web_client/store/notes/js_bindings.rs | 52 ++++++ wasm/src/web_client/store/notes/mod.rs | 169 ++++++++++++++++++ wasm/src/web_client/store/notes/models.rs | 17 ++ wasm/src/web_client/store/notes/utils.rs | 105 +++++++++++ wasm/test.html | 38 ++++ 15 files changed, 723 insertions(+), 6 deletions(-) create mode 100644 wasm/js/db/notes.js create mode 100644 wasm/src/native_code/notes.rs create mode 100644 wasm/src/web_client/notes.rs create mode 100644 wasm/src/web_client/store/notes/js_bindings.rs create mode 100644 wasm/src/web_client/store/notes/mod.rs create mode 100644 wasm/src/web_client/store/notes/models.rs create mode 100644 wasm/src/web_client/store/notes/utils.rs diff --git a/wasm/Cargo.toml b/wasm/Cargo.toml index 5c8a38884..7a9feb419 100644 --- a/wasm/Cargo.toml +++ b/wasm/Cargo.toml @@ -17,4 +17,6 @@ serde_json = "1.0" serde-wasm-bindgen = "0.6.5" wasm-bindgen = { version = "0.2", features = ["serde-serialize"] } wasm-bindgen-futures = "0.4" -web-sys = { version = "0.3", features = ["console"] } \ No newline at end of file +web-sys = { version = "0.3", features = ["console"] } +miden-lib = { version= "0.1", default-features = false } +miden-tx = { version= "0.1", default-features = false } \ No newline at end of file diff --git a/wasm/js/db/accounts.js b/wasm/js/db/accounts.js index e2fd6f0e2..db8b992db 100644 --- a/wasm/js/db/accounts.js +++ b/wasm/js/db/accounts.js @@ -12,7 +12,7 @@ export async function getAccountStub( ) { try { // Fetch all records matching the given id - const allMatchingRecords = await db.accounts + const allMatchingRecords = await accounts .where('id') .equals(accountId) .toArray(); @@ -53,7 +53,7 @@ export async function getAccountStub( export async function getAllAccountStubs() { try { // Fetch all records - const allRecords = await db.accounts.toArray(); + const allRecords = await accounts.toArray(); // Use a Map to track the latest record for each id based on nonce const latestRecordsMap = new Map(); diff --git a/wasm/js/db/notes.js b/wasm/js/db/notes.js new file mode 100644 index 000000000..ce7f88c0c --- /dev/null +++ b/wasm/js/db/notes.js @@ -0,0 +1,120 @@ +import { + inputNotes, + outputNotes +} from './schema.js'; + +export async function getInputNotes() { + try { + let notes; + + // Fetch the records based on the filter + if (filter === 'All') { + notes = await db.InputNotes.toArray(); + } else { + notes = await db.InputNotes.where('status').equals(filter.toLowerCase()).toArray(); + } + + // Process each note to convert 'blobField' from Blob to Uint8Array + const processedNotes = await Promise.all(notes.map(async note => { + const assetsArrayBuffer = await note.assets.arrayBuffer(); + note.assets = new Uint8Array(assetsArrayBuffer); + + return note; + })); + + return processedNotes; + } catch { + console.error("Failed to get input notes: ", err); + throw err; + } +} + +export async function getInputNote() { + try { + const note = await inputNotes.get(noteId); + const assetsArrayBuffer = await note.assets.arrayBuffer(); + note.assets = new Uint8Array(assetsArrayBuffer); + + return note + } catch { + console.error("Failed to get input note: ", err); + throw err; + } + +} + +export async function insertInputNote( + noteId, + assets, + recipient, + status, + metadata, + details, + inclusion_proof +) { + try { + let assetsBlob = new Blob([assets]); + + // Prepare the data object to insert + const data = { + noteId: noteId, + assets: assetsBlob, + recipient: recipient, + status: status, + metadata: JSON.stringify(metadata), + details: JSON.stringify(details), + inclusion_proof: JSON.stringify(inclusion_proof), + }; + + // Perform the insert using Dexie + await inputNotes.add(data); + return `Successfully inserted note: ${noteId}`; + } catch (error) { + console.error(`Error inserting note: ${noteId}:`, error); + throw error; // Rethrow the error to handle it further up the call chain if needed + } +} + +export async function insertOutputNote( + noteId, + assets, + recipient, + status, + metadata, + details, + inclusion_proof +) { + try { + let assetsBlob = new Blob([assets]); + + // Prepare the data object to insert + const data = { + noteId: noteId, + assets: assetsBlob, + recipient: recipient, + status: status, + metadata: JSON.stringify(metadata), + details: JSON.stringify(details), + inclusion_proof: JSON.stringify(inclusion_proof), + }; + + // Perform the insert using Dexie + await outputNotes.add(data); + return `Successfully inserted note: ${noteId}`; + } catch (error) { + console.error(`Error inserting note: ${noteId}:`, error); + throw error; // Rethrow the error to handle it further up the call chain if needed + } +} + +export async function getUnspentInputNoteNullifiers() { + try { + const notes = await db.InputNotes.where('status').equals('committed').toArray(); + const nullifiers = notes.map(note => JSON.parse(note.details).nullifier); + + return nullifiers; + } catch (err) { + console.error("Failed to get unspent input note nullifiers: ", err); + throw err; + } +} \ No newline at end of file diff --git a/wasm/js/db/schema.js b/wasm/js/db/schema.js index 9ddf11a78..418841c40 100644 --- a/wasm/js/db/schema.js +++ b/wasm/js/db/schema.js @@ -20,6 +20,8 @@ const Table = { AccountVaults: 'accountVaults', AccountAuth: 'accountAuth', Accounts: 'accounts', + InputNotes: 'inputNotes', + OutputNotes: 'outputNotes', Greet: 'greets', }; @@ -30,6 +32,8 @@ db.version(1).stores({ [Table.AccountVaults]: indexes('root'), [Table.AccountAuth]: indexes('accountId'), [Table.Accounts]: indexes('[id+nonce]', 'codeRoot', 'storageRoot', 'vaultRoot'), + [Table.InputNotes]: indexes('noteId', 'recipient', 'status'), + [Table.OutputNotes]: indexes('noteId', 'recipient', 'status'), [Table.Greet]: '++id', }); @@ -42,6 +46,8 @@ const accountStorages = db.table(Table.AccountStorage); const accountVaults = db.table(Table.AccountVaults); const accountAuths = db.table(Table.AccountAuth); const accounts = db.table(Table.Accounts); +const inputNotes = db.table(Table.InputNotes); +const outputNotes = db.table(Table.OutputNotes); const greets = db.table(Table.Greet); export { @@ -50,5 +56,7 @@ export { accountVaults, accountAuths, accounts, + inputNotes, + outputNotes, greets, }; diff --git a/wasm/src/native_code/mod.rs b/wasm/src/native_code/mod.rs index 4c3345ce7..cf2e05fd0 100644 --- a/wasm/src/native_code/mod.rs +++ b/wasm/src/native_code/mod.rs @@ -1,4 +1,5 @@ pub mod accounts; +pub mod notes; pub mod store; use store::Store; diff --git a/wasm/src/native_code/notes.rs b/wasm/src/native_code/notes.rs new file mode 100644 index 000000000..52f062612 --- /dev/null +++ b/wasm/src/native_code/notes.rs @@ -0,0 +1,45 @@ +use crate::native_code::store::NativeNoteFilter; + +use super::{ + rpc::NodeRpcClient, + Client, + store::Store // TODO: Add AuthInfo +}; + +impl Client { + // INPUT NOTE DATA RETRIEVAL + // -------------------------------------------------------------------------------------------- + + /// Returns input notes managed by this client. + pub async fn get_input_notes( + &self, + filter: NativeNoteFilter, + ) -> String { // TODO: Replace with Result, ()> + //self.store.get_input_notes(filter).map_err(|err| err.into()) + + "Called get_input_notes".to_string() + } + + /// Returns the input note with the specified hash. + pub async fn get_input_note( + &self, + //note_id: NoteId, + ) -> String { // TODO: Replace with Result + //self.store.get_input_note(note_id).map_err(|err| err.into()) + + "Called get_input_note".to_string() + } + + // INPUT NOTE CREATION + // -------------------------------------------------------------------------------------------- + + /// Imports a new input note into the client's store. + pub async fn import_input_note( + &mut self, + //note: InputNoteRecord, + ) -> String { // TODO: Replace with Result<(), ()> + //self.store.insert_input_note(¬e).map_err(|err| err.into()) + + "Called import_input_note".to_string() + } +} \ No newline at end of file diff --git a/wasm/src/native_code/store/mod.rs b/wasm/src/native_code/store/mod.rs index 61c769486..2ab1af7ed 100644 --- a/wasm/src/native_code/store/mod.rs +++ b/wasm/src/native_code/store/mod.rs @@ -22,7 +22,7 @@ pub trait Store { data: String ) -> Result<(), ()>; - // ACCOUNT + // ACCOUNTS // -------------------------------------------------------------------------------------------- // async fn get_account_ids(&self) -> Result, ()>; @@ -50,6 +50,33 @@ pub trait Store { // account_seed: Option, // auth_info: &AuthInfo, // ) -> Result<(), ()>; + + // NOTES + // -------------------------------------------------------------------------------------------- + + // async fn get_input_notes( + // &mut self, + // filter: NativeNoteFilter, + // ) -> Result, ()>; + + // async fn get_input_note( + // &self, + // note_id: NoteId, + // ) -> Result; + + // async fn insert_input_note( + // &mut self, + // note: &InputNoteRecord, + // ) -> Result<(), ()>; + + // async fn get_output_notes( + // &self, + // filter: NativeNoteFilter, + // ) -> Result, ()>; + + // async fn get_unspent_input_note_nullifiers( + // &self + // ) -> Result, ()>; } // DATABASE AUTH INFO @@ -97,4 +124,17 @@ pub trait Store { // val => Err(DeserializationError::InvalidValue(val.to_string())), // } // } -// } \ No newline at end of file +// } + +pub enum NativeNoteFilter { + /// Return a list of all [InputNoteRecord]. + All, + /// Filter by consumed [InputNoteRecord]. notes that have been used as inputs in transactions. + Consumed, + /// Return a list of committed [InputNoteRecord]. These represent notes that the blockchain + /// has included in a block, and for which we are storing anchor data. + Committed, + /// Return a list of pending [InputNoteRecord]. These represent notes for which the store + /// does not have anchor data. + Pending, +} \ No newline at end of file diff --git a/wasm/src/web_client/mod.rs b/wasm/src/web_client/mod.rs index 57f19d034..94012ce0d 100644 --- a/wasm/src/web_client/mod.rs +++ b/wasm/src/web_client/mod.rs @@ -1,4 +1,5 @@ pub mod account; +pub mod notes; pub mod store; pub mod web_rpc_client; diff --git a/wasm/src/web_client/notes.rs b/wasm/src/web_client/notes.rs new file mode 100644 index 000000000..d0dd66d90 --- /dev/null +++ b/wasm/src/web_client/notes.rs @@ -0,0 +1,83 @@ +use wasm_bindgen::prelude::*; +use serde::{Serialize, Deserialize}; +use serde_wasm_bindgen::from_value; +use web_sys::console; + +use crate::native_code::store::NativeNoteFilter; + +use super::WebClient; + +#[derive(Serialize, Deserialize)] +pub enum NoteFilter { + All, + Pending, + Committed, + Consumed, +} + +#[wasm_bindgen] +impl WebClient { + pub async fn get_input_notes( + &mut self, + filter: JsValue + ) -> () { + if let Some(ref mut client) = self.get_mut_inner() { + let filter: NoteFilter = from_value(filter).unwrap(); + let native_filter = match filter { + NoteFilter::Pending => NativeNoteFilter::Pending, + NoteFilter::Committed => NativeNoteFilter::Committed, + NoteFilter::Consumed => NativeNoteFilter::Consumed, + NoteFilter::All => NativeNoteFilter::All + }; + + let message = client.get_input_notes(native_filter).await; + let js_value_message = JsValue::from_str(&message); + + // Print the message to the Chrome console + console::log_1(&js_value_message); + } else { + console::error_1(&"Client not initialized".into()); + } + } + + pub async fn get_input_note( + &mut self, + note_id: String + ) -> () { + if let Some(ref mut client) = self.get_mut_inner() { + // let native_note_id = Digest::try_from(note_id).map_err(|err| { + // let error_message = err.to_string(); + // let js_value_error_message = JsValue::from_str(&error_message); + + // console::log_1(&js_value_error_message); + // }) + // .into(); + + let message = client.get_input_note().await; + let js_value_message = JsValue::from_str(&message); + + // Print the message to the Chrome console + console::log_1(&js_value_message); + } else { + console::error_1(&"Client not initialized".into()); + } + } + + pub async fn import_input_note( + &mut self, + file_data: Vec + ) -> () { + if let Some(ref mut client) = self.get_mut_inner() { + // let input_note_record = + // InputNoteRecord::read_from_bytes(&file_data).map_err(|err| err.to_string())?; + + let message = client.import_input_note().await; + let js_value_message = JsValue::from_str(&message); + + // Print the message to the Chrome console + console::log_1(&js_value_message); + } else { + console::error_1(&"Client not initialized".into()); + } + } +} \ No newline at end of file diff --git a/wasm/src/web_client/store/mod.rs b/wasm/src/web_client/store/mod.rs index 7cf02b268..bdf6ae2cb 100644 --- a/wasm/src/web_client/store/mod.rs +++ b/wasm/src/web_client/store/mod.rs @@ -1,4 +1,4 @@ -use crate::native_code::store::Store; +use crate::native_code::store::{Store, NativeNoteFilter}; use wasm_bindgen::prelude::*; use wasm_bindgen_futures::*; @@ -6,6 +6,7 @@ use wasm_bindgen_futures::*; use async_trait::async_trait; pub mod accounts; +pub mod notes; pub mod mock_example; // Initialize IndexedDB @@ -72,4 +73,39 @@ impl Store for WebStore { // ) -> Result { // self.get_account_auth(account_id) // } + + // NOTES + // async fn get_input_notes( + // &mut self, + // filter: NativeNoteFilter, + // ) -> Result, ()> { + // self.get_input_notes(filter).await + // } + + // async fn get_input_note( + // &mut self, + // note_id: NoteId, + // ) -> Result { + // self.get_input_note(note_id).await + // } + + // async fn insert_input_note( + // &mut self, + // note: &InputNoteRecord, + // ) -> Result<(), ()> { + // self.insert_input_note(note).await + // } + + // async fn get_output_notes( + // &mut self, + // note_filter: NativeNoteFilter, + // ) -> Result, ()> { + // self.get_output_notes(note_filter).await + // } + + // async fn get_unspent_input_note_nullifiers( + // &self + // ) -> Result, ()> { + // self.get_unspent_input_note_nullifiers().await + // } } \ No newline at end of file diff --git a/wasm/src/web_client/store/notes/js_bindings.rs b/wasm/src/web_client/store/notes/js_bindings.rs new file mode 100644 index 000000000..30b06a714 --- /dev/null +++ b/wasm/src/web_client/store/notes/js_bindings.rs @@ -0,0 +1,52 @@ +use wasm_bindgen::prelude::*; +use wasm_bindgen_futures::*; + +// Account IndexedDB Operations +#[wasm_bindgen(module = "/js/db/notes.js")] +extern "C" { + // GETS + // ================================================================================================ + + #[wasm_bindgen(js_name = getInputNotes)] + pub fn idxdb_get_input_notes( + status: String + ) -> js_sys::Promise; + + #[wasm_bindgen(js_name = getInputNote)] + pub fn idxdb_get_input_note( + note_id: String + ) -> js_sys::Promise; + + #[wasm_bindgen(js_name = getOutputNotes)] + pub fn idxdb_get_output_notes( + status: String + ) -> js_sys::Promise; + + #[wasm_bindgen(js_name = getUnpsentInputNoteNullifiers)] + pub fn idxdb_get_unspent_input_note_nullifiers() -> js_sys::Promise; + + // INSERTS + // ================================================================================================ + + #[wasm_bindgen(js_name = insertInputNote)] + pub fn idxdb_insert_input_note( + note_id: String, + assets: Vec, + recipient: String, + status: String, + metadata: String, + details: String, + inclusion_proof: Option + ) -> js_sys::Promise; + + #[wasm_bindgen(js_name = insertOutputNote)] + pub fn idxdb_insert_output_note( + note_id: String, + assets: Vec, + recipient: String, + status: String, + metadata: String, + details: String, + inclusion_proof: Option + ) -> js_sys::Promise; +} \ No newline at end of file diff --git a/wasm/src/web_client/store/notes/mod.rs b/wasm/src/web_client/store/notes/mod.rs new file mode 100644 index 000000000..537f03b5d --- /dev/null +++ b/wasm/src/web_client/store/notes/mod.rs @@ -0,0 +1,169 @@ +use serde_wasm_bindgen::from_value; +use wasm_bindgen_futures::*; + +use super::WebStore; +use crate::native_code::store::NativeNoteFilter; +use crate::web_client::notes::NoteFilter; + +mod js_bindings; +use js_bindings::*; + +mod models; +use models::*; + +mod utils; +use utils::*; + +impl WebStore { + // pub(crate) async fn get_input_notes( + // &mut self, + // filter: NativeNoteFilter + // ) -> Result, ()> { + // let filter_as_str = match filter { + // NativeNoteFilter::Pending => "Pending", + // NativeNoteFilter::Committed => "Committed", + // NativeNoteFilter::Consumed => "Consumed", + // NativeNoteFilter::All => "All", + // }; + + // let promise = idxdb_get_input_notes(filter_as_str.to_string()); + // let js_value = JsFuture::from(promise).await?; + // let input_notes_idxdb: Vec = from_value(js_value).unwrap(); + + // let native_input_notes: Result, ()> = input_notes_idxdb.into_iter().map(|note_idxdb| { + + // let note_details: NoteRecordDetails = + // serde_json::from_str(¬e_idxdb.details).map_err(|_err| ())?; + // let note_metadata: NoteMetadata = + // serde_json::from_str(¬e_idxdb.metadata).map_err(|_err| ())?; + + // let script = NoteScript::read_from_bytes(note_details.script())?; + // let inputs = NoteInputs::read_from_bytes(note_details.inputs())?; + + // let serial_num = note_details.serial_num(); + // let note_metadata = NoteMetadata::new(note_metadata.sender(), note_metadata.tag()); + // let note_assets = NoteAssets::read_from_bytes(¬e_idxdb.assets)?; + // let note = Note::from_parts(script, inputs, note_assets, *serial_num, note_metadata); + + // let inclusion_proof = match note_idxdb.inclusion_proof { + // Some(note_inclusion_proof) => { + // let note_inclusion_proof: NoteInclusionProof = + // serde_json::from_str(¬e_inclusion_proof) + // .map_err(|err| ())?; + + // Some(note_inclusion_proof) + // }, + // _ => None, + // }; + + // Ok(InputNoteRecord::new(note, inclusion_proof)) + // }).collect(); // Collect into a Result, ()> + + // return native_input_notes; + // } + + // pub(crate) async fn get_input_note( + // &mut self, + // note_id: NoteId + // ) -> Result { + // let note_id_str = ¬e_id.inner().to_string(); + + // let promise = idxdb_get_input_note(note_id_str); + // let js_value = JsFuture::from(promise).await?; + // let input_note_idxdb: InputNoteIdxdbObject = from_value(js_value).unwrap(); + + // let note_details: NoteRecordDetails = + // serde_json::from_str(&input_note_idxdb.details).map_err(|_err| ())?; + // let note_metadata: NoteMetadata = + // serde_json::from_str(&input_note_idxdb.metadata).map_err(|_err| ())?; + + // let script = NoteScript::read_from_bytes(note_details.script())?; + // let inputs = NoteInputs::read_from_bytes(note_details.inputs())?; + + // let serial_num = note_details.serial_num(); + // let note_metadata = NoteMetadata::new(note_metadata.sender(), note_metadata.tag()); + // let note_assets = NoteAssets::read_from_bytes(&input_note_idxdb.assets)?; + // let note = Note::from_parts(script, inputs, note_assets, *serial_num, note_metadata); + + // let inclusion_proof = match input_note_idxdb.inclusion_proof { + // Some(note_inclusion_proof) => { + // let note_inclusion_proof: NoteInclusionProof = + // serde_json::from_str(¬e_inclusion_proof) + // .map_err(|err| ())?; + + // Some(note_inclusion_proof) + // }, + // _ => None, + // }; + + // Ok(InputNoteRecord::new(note, inclusion_proof)) + // } + + // pub(crate) async fn insert_input_note( + // &mut self, + // note: &InputNoteRecord + // ) -> Result<(), ()> { + // insert_input_note_util(note).await + // } + + // pub(crate) async fn get_output_notes( + // &mut self, + // filter: NativeNoteFilter + // ) -> Result, ()> { + // let filter_as_str = match filter { + // NativeNoteFilter::Pending => "Pending", + // NativeNoteFilter::Committed => "Committed", + // NativeNoteFilter::Consumed => "Consumed", + // NativeNoteFilter::All => "All", + // }; + + // let promise = idxdb_get_output_notes(filter_as_str.to_string()); + // let js_value = JsFuture::from(promise).await?; + // let output_notes_idxdb: Vec = from_value(js_value).unwrap(); + + // let native_output_notes: Result, ()> = output_notes_idxdb.into_iter().map(|note_idxdb| { + + // let note_details: NoteRecordDetails = + // serde_json::from_str(¬e_idxdb.details).map_err(|_err| ())?; + // let note_metadata: NoteMetadata = + // serde_json::from_str(¬e_idxdb.metadata).map_err(|_err| ())?; + + // let script = NoteScript::read_from_bytes(note_details.script())?; + // let inputs = NoteInputs::read_from_bytes(note_details.inputs())?; + + // let serial_num = note_details.serial_num(); + // let note_metadata = NoteMetadata::new(note_metadata.sender(), note_metadata.tag()); + // let note_assets = NoteAssets::read_from_bytes(¬e_idxdb.assets)?; + // let note = Note::from_parts(script, inputs, note_assets, *serial_num, note_metadata); + + // let inclusion_proof = match note_idxdb.inclusion_proof { + // Some(note_inclusion_proof) => { + // let note_inclusion_proof: NoteInclusionProof = + // serde_json::from_str(¬e_inclusion_proof) + // .map_err(|err| ())?; + + // Some(note_inclusion_proof) + // }, + // _ => None, + // }; + + // Ok(InputNoteRecord::new(note, inclusion_proof)) + // }).collect(); // Collect into a Result, ()> + + // return native_output_notes; + // } + + // pub(crate) async fn get_unspent_input_note_nullifiers( + // &mut self + // ) -> Result, ()>{ + // let promise = idxdb_get_unspent_input_note_nullifiers(); + // let js_value = JsFuture::from(promise).await?; + // let nullifiers_as_str: Vec = from_value(js_value).unwrap(); + + // let nullifiers = nullifiers_as_str.into_iter().map(|s| { + // Digest::try_from(v).map(Nullifier::from).map_err(|err| ()) + // }).collect::, _>>(); + + // return nullifiers + // } +} \ No newline at end of file diff --git a/wasm/src/web_client/store/notes/models.rs b/wasm/src/web_client/store/notes/models.rs new file mode 100644 index 000000000..c967156e3 --- /dev/null +++ b/wasm/src/web_client/store/notes/models.rs @@ -0,0 +1,17 @@ +use serde::{Deserialize, Serialize}; + +#[derive(Serialize, Deserialize)] +pub struct InputNoteIdxdbObject { + pub assets: Vec, + pub details: String, + pub metadata: String, + pub inclusion_proof: Option +} + +#[derive(Serialize, Deserialize)] +pub struct OutputNoteIdxdbObject { + pub assets: Vec, + pub details: String, + pub metadata: String, + pub inclusion_proof: Option +} \ No newline at end of file diff --git a/wasm/src/web_client/store/notes/utils.rs b/wasm/src/web_client/store/notes/utils.rs new file mode 100644 index 000000000..4b424e6aa --- /dev/null +++ b/wasm/src/web_client/store/notes/utils.rs @@ -0,0 +1,105 @@ +use wasm_bindgen_futures::*; + +use super::js_bindings::*; + +// TYPES +// ================================================================================================ + +// type SerializedInputNoteData = (String, Vec, String, String, String, String, Option); + +// type SerializedInputNoteParts = (Vec, String, String, Option); + +// ================================================================================================ + +// pub(crate) fn serialize_note( +// note: &InputNoteRecord +// ) -> Result { +// let note_id = note.note_id().inner().to_string(); +// let note_assets = note.note().assets().to_bytes(); +// let (inclusion_proof, status) = match note.inclusion_proof() { +// Some(proof) => { +// // FIXME: This removal is to accomodate a problem with how the node constructs paths where +// // they are constructed using note ID instead of authentication hash, so for now we remove the first +// // node here. +// // +// // Note: once removed we can also stop creating a new `NoteInclusionProof` +// // +// // See: https://github.com/0xPolygonMiden/miden-node/blob/main/store/src/state.rs#L274 +// let mut path = proof.note_path().clone(); +// if path.len() > 0 { +// let _removed = path.remove(0); +// } + +// let block_num = proof.origin().block_num; +// let node_index = proof.origin().node_index.value(); +// let sub_hash = proof.sub_hash(); +// let note_root = proof.note_root(); + +// let inclusion_proof = serde_json::to_string(&NoteInclusionProof::new( +// block_num, sub_hash, note_root, node_index, path, +// )?) +// .map_err(|err| ())?; + +// (Some(inclusion_proof), String::from("committed")) +// }, +// None => (None, String::from("pending")), +// }; +// let recipient = note.note().recipient().to_hex(); + +// let sender_id = note.note().metadata().sender(); +// let tag = note.note().metadata().tag(); +// let metadata = serde_json::to_string(&NoteMetadata::new(sender_id, tag)) +// .map_err(|err| ())?; + +// let nullifier = note.note().nullifier().inner().to_string(); +// let script = note.note().script().to_bytes(); +// let inputs = note.note().inputs().to_bytes(); +// let serial_num = note.note().serial_num(); +// let details = +// serde_json::to_string(&NoteRecordDetails::new(nullifier, script, inputs, serial_num)) +// .map_err(|err| ())?; + +// Ok((note_id, note_assets, recipient, status, metadata, details, inclusion_proof)) +// } + +// pub(super) async fn insert_input_note_util( +// note: &InputNoteRecord +// ) -> Result<(), ()> { +// let (note_id, assets, recipient, status, metadata, details, inclusion_proof) = +// serialize_note(note)?; + +// let result = JsFuture::from(idxdb_insert_input_note( +// note_id, +// assets, +// recipient, +// status, +// metadata, +// details, +// inclusion_proof +// )).await; +// match result { +// Ok(_) => Ok(()), +// Err(_) => Err(()), +// } +// } + +// pub async fn insert_output_note( +// note: &InputNoteRecord +// ) -> Result<(), ()> { +// let (note_id, assets, recipient, status, metadata, details, inclusion_proof) = +// serialize_note(note)?; + +// let result = JsFuture::from(idxdb_insert_output_note( +// note_id, +// assets, +// recipient, +// status, +// metadata, +// details, +// inclusion_proof +// )).await; +// match result { +// Ok(_) => Ok(()), +// Err(_) => Err(()), +// } +// } \ No newline at end of file diff --git a/wasm/test.html b/wasm/test.html index 6e55eea47..9cecb7b7e 100644 --- a/wasm/test.html +++ b/wasm/test.html @@ -28,6 +28,8 @@ } } + // Accounts Tests + async function testNewAccount(webClient) { const basicMutableTemplate = { type: "BasicMutable" @@ -85,6 +87,38 @@ } } + // Notes Tests + + async function testGetInputNotes(webClient) { + try { + await webClient.get_input_notes("Pending"); + + } catch (error) { + console.error('Failed to call get input notes:', error); + + } + } + + async function testGetInputNote(webClient) { + try { + await webClient.get_input_note("TestString"); + + } catch (error) { + console.error('Failed to call get input note:', error); + + } + } + + async function testImportInputNote(webClient) { + try { + await webClient.import_input_note(new Uint8Array(32)); + + } catch (error) { + console.error('Failed to call import input note:', error); + + } + } + let webClient = await testCreateClient(); await testStoreAndRpc(webClient); await testNewAccount(webClient); @@ -92,6 +126,10 @@ await testGetAccount(webClient); await testGetAccountStubById(webClient); await testGetAccountAuth(webClient); + + await testGetInputNotes(webClient); + await testGetInputNote(webClient); + await testImportInputNote(webClient); \ No newline at end of file From bf23dbce8a8935d54c27de2d070de238de77e8e9 Mon Sep 17 00:00:00 2001 From: Dennis Garcia Date: Thu, 11 Apr 2024 15:00:04 -0500 Subject: [PATCH 08/42] Finished adding skeleton code for transactions (#7) --- wasm/Cargo.toml | 15 +- wasm/js/db/notes.js | 4 +- wasm/js/db/schema.js | 8 + wasm/js/db/transactions.js | 145 +++++++ wasm/package.json | 2 +- wasm/src/native_code/mod.rs | 17 +- wasm/src/native_code/store/data_store.rs | 191 +++++++++ wasm/src/native_code/store/mod.rs | 34 +- wasm/src/native_code/transactions.rs | 371 ++++++++++++++++++ wasm/src/native_code/utils.rs | 100 +++++ wasm/src/web_client/mod.rs | 2 + wasm/src/web_client/store/mod.rs | 19 + wasm/src/web_client/store/notes/mod.rs | 2 +- wasm/src/web_client/store/notes/utils.rs | 4 +- .../store/transactions/js_bindings.rs | 40 ++ wasm/src/web_client/store/transactions/mod.rs | 149 +++++++ .../web_client/store/transactions/models.rs | 16 + .../web_client/store/transactions/utils.rs | 124 ++++++ wasm/src/web_client/transactions.rs | 89 +++++ wasm/test.html | 25 ++ 20 files changed, 1343 insertions(+), 14 deletions(-) create mode 100644 wasm/js/db/transactions.js create mode 100644 wasm/src/native_code/store/data_store.rs create mode 100644 wasm/src/native_code/transactions.rs create mode 100644 wasm/src/native_code/utils.rs create mode 100644 wasm/src/web_client/store/transactions/js_bindings.rs create mode 100644 wasm/src/web_client/store/transactions/mod.rs create mode 100644 wasm/src/web_client/store/transactions/models.rs create mode 100644 wasm/src/web_client/store/transactions/utils.rs create mode 100644 wasm/src/web_client/transactions.rs diff --git a/wasm/Cargo.toml b/wasm/Cargo.toml index 7a9feb419..a12029dd1 100644 --- a/wasm/Cargo.toml +++ b/wasm/Cargo.toml @@ -7,16 +7,25 @@ edition = "2021" [lib] crate-type = ["cdylib"] +[features] +concurrent = [ + "miden-lib/concurrent", + "miden-objects/concurrent", + "miden-tx/concurrent", +] +default = ["miden-objects/serde"] + [dependencies] async-trait = "0.1" futures = "0.3" getrandom = { version = "0.2", features = ["js"] } +miden-lib = { version = "0.2" } +miden-objects = { version = "0.2" } +miden-tx = { version = "0.2" } rand = { version = "0.8.5" } serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" serde-wasm-bindgen = "0.6.5" wasm-bindgen = { version = "0.2", features = ["serde-serialize"] } wasm-bindgen-futures = "0.4" -web-sys = { version = "0.3", features = ["console"] } -miden-lib = { version= "0.1", default-features = false } -miden-tx = { version= "0.1", default-features = false } \ No newline at end of file +web-sys = { version = "0.3", features = ["console"] } \ No newline at end of file diff --git a/wasm/js/db/notes.js b/wasm/js/db/notes.js index ce7f88c0c..abdfa3b6b 100644 --- a/wasm/js/db/notes.js +++ b/wasm/js/db/notes.js @@ -9,9 +9,9 @@ export async function getInputNotes() { // Fetch the records based on the filter if (filter === 'All') { - notes = await db.InputNotes.toArray(); + notes = await inputNotes.toArray(); } else { - notes = await db.InputNotes.where('status').equals(filter.toLowerCase()).toArray(); + notes = await inputNotes.where('status').equals(filter.toLowerCase()).toArray(); } // Process each note to convert 'blobField' from Blob to Uint8Array diff --git a/wasm/js/db/schema.js b/wasm/js/db/schema.js index 418841c40..ca1a568d1 100644 --- a/wasm/js/db/schema.js +++ b/wasm/js/db/schema.js @@ -20,6 +20,8 @@ const Table = { AccountVaults: 'accountVaults', AccountAuth: 'accountAuth', Accounts: 'accounts', + Transactions: 'transactions', + TransactionScripts: 'transactionScripts', InputNotes: 'inputNotes', OutputNotes: 'outputNotes', Greet: 'greets', @@ -32,6 +34,8 @@ db.version(1).stores({ [Table.AccountVaults]: indexes('root'), [Table.AccountAuth]: indexes('accountId'), [Table.Accounts]: indexes('[id+nonce]', 'codeRoot', 'storageRoot', 'vaultRoot'), + [Table.Transactions]: indexes('id', 'scriptHash', 'blockNum', 'commitHeight'), + [Table.TransactionScripts]: indexes('scriptHash'), [Table.InputNotes]: indexes('noteId', 'recipient', 'status'), [Table.OutputNotes]: indexes('noteId', 'recipient', 'status'), [Table.Greet]: '++id', @@ -46,6 +50,8 @@ const accountStorages = db.table(Table.AccountStorage); const accountVaults = db.table(Table.AccountVaults); const accountAuths = db.table(Table.AccountAuth); const accounts = db.table(Table.Accounts); +const transactions = db.table(Table.Transactions); +const transactionScripts = db.table(Table.TransactionScripts); const inputNotes = db.table(Table.InputNotes); const outputNotes = db.table(Table.OutputNotes); const greets = db.table(Table.Greet); @@ -56,6 +62,8 @@ export { accountVaults, accountAuths, accounts, + transactions, + transactionScripts, inputNotes, outputNotes, greets, diff --git a/wasm/js/db/transactions.js b/wasm/js/db/transactions.js new file mode 100644 index 000000000..64a5fcb40 --- /dev/null +++ b/wasm/js/db/transactions.js @@ -0,0 +1,145 @@ +import { + transactions, + transactionScripts, +} from './schema.js' + +export async function getTransactions( + filter +) { + let transactionRecords; + + try { + if (filter === 'Uncomitted') { + transactionRecords = await transactions.where("commitHeight").equals(null).toArray(); + } else { + transactionRecords = await transactions.toArray(); + } + const scriptHashes = transactionRecords.map(transactionRecord => transactionRecord.scriptHash); + const scripts = await transactionScripts.where("scriptHash").anyOf(scriptHashes).toArray(); + + // Create a map of scriptHash to script for quick lookup + const scriptMap = scripts.reduce((map, script) => { + map[script.scriptHash] = script.program; + return map; + }, {}); + + const processedTransactions = await Promise.all(transactionRecords.map(async transactionRecord => { + let scriptHashArrayBuffer = null; + let scriptProgramArrayBuffer = null; + + outputNotesArrayBuffer = await transactionRecord.outputNotes.arrayBuffer(); + if (transactionRecord.scriptHash !== null) { + scriptHashArrayBuffer = await transactionRecord.scriptHash.arrayBuffer(); + } + if (scriptMap[transactionRecord.scriptHash] !== null) { + scriptProgramArrayBuffer = await scriptMap[transactionRecord.scriptHash].arrayBuffer(); + } + + transactionRecord.outputNotes = new Uint8Array(outputNotesArrayBuffer); + if (scriptHashArrayBuffer !== null) { + transactionRecord.scriptHash = new Uint8Array(scriptHashArrayBuffer); + } + if (scriptProgramArrayBuffer !== null) { + transactionRecord.scriptProgram = new Uint8Array(scriptProgramArrayBuffer); + } + + return transactionRecord; + })); + + return processedTransactions + } catch { + console.error("Failed to get transactions: ", err); + throw err; + + } +} + +export async function insertTransactionScript( + scriptHash, + scriptProgram +) { + try { + if (scriptHash === null || scriptProgram === null) { + throw new Error("Script hash and program must be provided."); + } + let scriptHashBlob = new Blob([scriptHash]); + let scriptProgramBlob = new Blob([scriptProgram]); + + const data = { + scriptHash: scriptHashBlob, + program: scriptProgramBlob + } + + await transactionScripts.add(data); + } catch (error) { + // Check if the error is because the record already exists + if (error.name === 'ConstraintError') { + console.log("Transaction script already exists, ignoring."); + } else { + // Re-throw the error if it's not a constraint error + throw error; + } + } +} + +export async function insertProvenTransactionData( + transactionId, + accountId, + initAccountState, + finalAccountState, + inputNotes, + outputNotes, + scriptProgram, + scriptHash, + scriptInputs, + blockNum, + committed +) { + try { + let scriptProgramBlob = null; + let scriptHashBlob = null; + let outputNotesBlob = new Blob([outputNotes]); + if (scriptProgram !== null) { + scriptProgramBlob = new Blob([scriptProgram]); + } + if (scriptHash !== null) { + scriptHashBlob = new Blob([scriptHash]); + } + + const data = { + id: transactionId, + accountId: accountId, + initAccountState: initAccountState, + finalAccountState: finalAccountState, + inputNotes: inputNotes, + outputNotes: outputNotesBlob, + scriptProgram: scriptProgramBlob, + scriptHash: scriptHashBlob, + scriptInputs: scriptInputs, + blockNum: blockNum, + commitHeight: committed + } + + await transactions.add(data); + } catch (err) { + console.error("Failed to insert proven transaction data: ", err); + throw err; + } +} + +export async function markTransactionsAsCommitted( + blockNum, + transactionIds +) { + try { + const updates = transactionIds.map(transactionId => ({ + id: transactionId, + commitHeight: blockNum + })); + + await transactions.bulkPut(updates); + } catch (err) { + console.error("Failed to mark transactions as committed: ", err); + throw err; + } +} \ No newline at end of file diff --git a/wasm/package.json b/wasm/package.json index f214f1ab7..c79a6ba8e 100644 --- a/wasm/package.json +++ b/wasm/package.json @@ -15,7 +15,7 @@ "devDependencies": { "@rollup/plugin-commonjs": "^25.0.7", "@rollup/plugin-node-resolve": "^15.2.3", - "@wasm-tool/rollup-plugin-rust": "^2.4.2", + "@wasm-tool/rollup-plugin-rust": "^2.4.5", "cpr": "^3.0.1", "rimraf": "^5.0.1", "rollup": "^3.27.2" diff --git a/wasm/src/native_code/mod.rs b/wasm/src/native_code/mod.rs index cf2e05fd0..aae3055ad 100644 --- a/wasm/src/native_code/mod.rs +++ b/wasm/src/native_code/mod.rs @@ -1,5 +1,7 @@ pub mod accounts; pub mod notes; +pub mod transactions; +pub mod utils; pub mod store; use store::Store; @@ -17,11 +19,20 @@ use rpc::NodeRpcClient; // TODO: Add back generic type for DataStore and get example working in browser pub struct Client { pub store: S, - pub rpc_api: N + pub rpc_api: N, + // pub tx_executor: TransactionExecutor> } impl Client { - pub fn new(api: N, store: S) -> Self { - Self { rpc_api: api, store } + pub fn new( + api: N, + store: S, + //executor_store: S + ) -> Self { + Self { + rpc_api: api, + store: store, + // tx_executor: TransactionExecutor::new(ClientDataStore::new(executor_store)) + } } } \ No newline at end of file diff --git a/wasm/src/native_code/store/data_store.rs b/wasm/src/native_code/store/data_store.rs new file mode 100644 index 000000000..456c5147f --- /dev/null +++ b/wasm/src/native_code/store/data_store.rs @@ -0,0 +1,191 @@ +// use miden_objects::{ +// accounts::AccountId, +// assembly::ModuleAst, +// crypto::merkle::{InOrderIndex, MerklePath, PartialMmr}, +// notes::NoteId, +// transaction::{ChainMmr, InputNote, InputNotes}, +// utils::collections::BTreeSet, +// BlockHeader, +// }; +// use miden_tx::{DataStore, DataStoreError, TransactionInputs}; + +// use super::{ChainMmrNodeFilter, NoteFilter, Store}; +// use crate::errors::{ClientError, StoreError}; + +// // DATA STORE +// // ================================================================================================ + +// pub struct ClientDataStore { +// /// Local database containing information about the accounts managed by this client. +// pub(crate) store: S, +// } + +// impl ClientDataStore { +// pub fn new(store: S) -> Self { +// Self { store } +// } +// } + +// impl DataStore for ClientDataStore { +// fn get_transaction_inputs( +// &self, +// account_id: AccountId, +// block_num: u32, +// notes: &[NoteId], +// ) -> Result { +// // First validate that no note has already been consumed +// let unspent_notes = self +// .store +// .get_input_notes(NoteFilter::Committed)? +// .iter() +// .map(|note_record| note_record.note_id()) +// .collect::>(); + +// for note_id in notes { +// if !unspent_notes.contains(note_id) { +// return Err(DataStoreError::NoteAlreadyConsumed(*note_id)); +// } +// } + +// // Construct Account +// let (account, seed) = self.store.get_account(account_id)?; + +// // Get header data +// let (block_header, _had_notes) = self.store.get_block_header_by_num(block_num)?; + +// let mut list_of_notes = vec![]; + +// let mut notes_blocks: Vec = vec![]; +// for note_id in notes { +// let input_note_record = self.store.get_input_note(*note_id)?; + +// let input_note: InputNote = input_note_record +// .try_into() +// .map_err(|err: ClientError| DataStoreError::InternalError(err.to_string()))?; + +// list_of_notes.push(input_note.clone()); + +// let note_block_num = input_note.proof().origin().block_num; + +// if note_block_num != block_num { +// notes_blocks.push(note_block_num); +// } +// } + +// let notes_blocks: Vec = self +// .store +// .get_block_headers(¬es_blocks)? +// .iter() +// .map(|(header, _has_notes)| *header) +// .collect(); + +// let partial_mmr = build_partial_mmr_with_paths(&self.store, block_num, ¬es_blocks)?; +// let chain_mmr = ChainMmr::new(partial_mmr, notes_blocks) +// .map_err(|err| DataStoreError::InternalError(err.to_string()))?; + +// let input_notes = +// InputNotes::new(list_of_notes).map_err(DataStoreError::InvalidTransactionInput)?; + +// TransactionInputs::new(account, seed, block_header, chain_mmr, input_notes) +// .map_err(DataStoreError::InvalidTransactionInput) +// } + +// fn get_account_code( +// &self, +// account_id: AccountId, +// ) -> Result { +// let (account, _seed) = self.store.get_account(account_id)?; +// let module_ast = account.code().module().clone(); + +// Ok(module_ast) +// } +// } + +// /// Builds a [PartialMmr] with a specified forest number and a list of blocks that should be +// /// authenticated. +// /// +// /// `authenticated_blocks` cannot contain `forest`. For authenticating the last block we have, +// /// the kernel extends the MMR which is why it's not needed here. +// fn build_partial_mmr_with_paths( +// store: &S, +// forest: u32, +// authenticated_blocks: &[BlockHeader], +// ) -> Result { +// let mut partial_mmr: PartialMmr = { +// let current_peaks = store.get_chain_mmr_peaks_by_block_num(forest)?; + +// PartialMmr::from_peaks(current_peaks) +// }; + +// let block_nums: Vec = authenticated_blocks.iter().map(|b| b.block_num()).collect(); + +// let authentication_paths = +// get_authentication_path_for_blocks(store, &block_nums, partial_mmr.forest())?; + +// for (header, path) in authenticated_blocks.iter().zip(authentication_paths.iter()) { +// partial_mmr +// .track(header.block_num() as usize, header.hash(), path) +// .map_err(|err| DataStoreError::InternalError(err.to_string()))?; +// } + +// Ok(partial_mmr) +// } + +// /// Retrieves all Chain MMR nodes required for authenticating the set of blocks, and then +// /// constructs the path for each of them. +// /// +// /// This method assumes `block_nums` cannot contain `forest`. +// pub fn get_authentication_path_for_blocks( +// store: &S, +// block_nums: &[u32], +// forest: usize, +// ) -> Result, StoreError> { +// let mut node_indices = BTreeSet::new(); + +// // Calculate all needed nodes indices for generating the paths +// for block_num in block_nums { +// let path_depth = mmr_merkle_path_len(*block_num as usize, forest); + +// let mut idx = InOrderIndex::from_leaf_pos(*block_num as usize); + +// for _ in 0..path_depth { +// node_indices.insert(idx.sibling()); +// idx = idx.parent(); +// } +// } + +// // Get all Mmr nodes based on collected indices +// let node_indices: Vec = node_indices.into_iter().collect(); + +// let filter = ChainMmrNodeFilter::List(&node_indices); +// let mmr_nodes = store.get_chain_mmr_nodes(filter)?; + +// // Construct authentication paths +// let mut authentication_paths = vec![]; +// for block_num in block_nums { +// let mut merkle_nodes = vec![]; +// let mut idx = InOrderIndex::from_leaf_pos(*block_num as usize); + +// while let Some(node) = mmr_nodes.get(&idx.sibling()) { +// merkle_nodes.push(*node); +// idx = idx.parent(); +// } +// let path = MerklePath::new(merkle_nodes); +// authentication_paths.push(path); +// } + +// Ok(authentication_paths) +// } + +// /// Calculates the merkle path length for an MMR of a specific forest and a leaf index +// /// `leaf_index` is a 0-indexed leaf number and `forest` is the total amount of leaves +// /// in the MMR at this point. +// fn mmr_merkle_path_len( +// leaf_index: usize, +// forest: usize, +// ) -> usize { +// let before = forest & leaf_index; +// let after = forest ^ before; + +// after.ilog2() as usize +// } \ No newline at end of file diff --git a/wasm/src/native_code/store/mod.rs b/wasm/src/native_code/store/mod.rs index 2ab1af7ed..510e8ee2e 100644 --- a/wasm/src/native_code/store/mod.rs +++ b/wasm/src/native_code/store/mod.rs @@ -22,12 +22,29 @@ pub trait Store { data: String ) -> Result<(), ()>; + // TRANSACTIONS + // -------------------------------------------------------------------------------------------- + + // async fn get_transactions( + // &mut self, + // filter: NativeTransactionFilter, + // ) -> Result, ()>; + + // async fn apply_transaction( + // &mut self, + // tx_result: TransactionResult, + // ) -> Result<(), ()>; + // ACCOUNTS // -------------------------------------------------------------------------------------------- - // async fn get_account_ids(&self) -> Result, ()>; + // async fn get_account_ids( + // &self + // ) -> Result, ()>; - // async fn get_account_stubs(&self) -> Result)>, ()>; + // async fn get_account_stubs( + // &self + // ) -> Result)>, ()>; // async fn get_account_stub( // &self, @@ -77,6 +94,11 @@ pub trait Store { // async fn get_unspent_input_note_nullifiers( // &self // ) -> Result, ()>; + + // TRANSACTIONS + // -------------------------------------------------------------------------------------------- + + } // DATABASE AUTH INFO @@ -126,6 +148,14 @@ pub trait Store { // } // } +pub enum NativeTransactionFilter { + /// Return all transactions. + All, + /// Filter by transactions that have not yet been committed to the blockchain as per the last + /// sync. + Uncomitted, +} + pub enum NativeNoteFilter { /// Return a list of all [InputNoteRecord]. All, diff --git a/wasm/src/native_code/transactions.rs b/wasm/src/native_code/transactions.rs new file mode 100644 index 000000000..078caae04 --- /dev/null +++ b/wasm/src/native_code/transactions.rs @@ -0,0 +1,371 @@ +use super::{ + rpc::NodeRpcClient, + Client, + store::{Store, NativeTransactionFilter} +}; + +// const AUTH_CONSUME_NOTES_SCRIPT: &str = +// include_str!("asm/transaction_scripts/auth_consume_notes.masm"); +// const DISTRIBUTE_FUNGIBLE_ASSET_SCRIPT: &str = +// include_str!("asm/transaction_scripts/distribute_fungible_asset.masm"); +// const AUTH_SEND_ASSET_SCRIPT: &str = include_str!("asm/transaction_scripts/auth_send_asset.masm"); + +// #[derive(Clone)] +// pub enum NativeTransactionTemplate { +// /// Consume outstanding notes for an account. +// ConsumeNotes(AccountId, Vec), +// /// Mint fungible assets using a faucet account +// MintFungibleAsset { +// asset: FungibleAsset, +// target_account_id: AccountId, +// }, +// /// Creates a pay-to-id note directed to a specific account +// PayToId(PaymentTransactionData), +// /// Creates a pay-to-id note directed to a specific account, specifying a block height after +// /// which the note can be recalled +// PayToIdWithRecall(PaymentTransactionData, u32), +// } + +// impl NativeTransactionTemplate { +// /// Returns the executor [AccountId] +// pub fn account_id(&self) -> AccountId { +// match self { +// NativeTransactionTemplate::ConsumeNotes(account_id, _) => *account_id, +// NativeTransactionTemplate::MintFungibleAsset { +// asset, +// target_account_id: _target_account_id, +// } => asset.faucet_id(), +// NativeTransactionTemplate::PayToId(p) => *p.account_id(), +// NativeTransactionTemplate::PayToIdWithRecall(p, _) => *p.account_id(), +// } +// } +// } + +// #[derive(Clone)] +// pub struct PaymentTransactionData { +// asset: Asset, +// sender_account_id: AccountId, +// target_account_id: AccountId, +// } + +// impl PaymentTransactionData { +// pub fn new( +// asset: Asset, +// sender_account_id: AccountId, +// target_account_id: AccountId, +// ) -> PaymentTransactionData { +// PaymentTransactionData { +// asset, +// sender_account_id, +// target_account_id, +// } +// } + +// /// Returns the executor [AccountId] +// pub fn account_id(&self) -> &AccountId { +// &self.sender_account_id +// } +// } + +// pub struct TransactionResult { +// executed_transaction: ExecutedTransaction, +// output_notes: Vec, +// } + +// impl TransactionResult { +// pub fn new( +// executed_transaction: ExecutedTransaction, +// created_notes: Vec, +// ) -> Self { +// Self { +// executed_transaction, +// output_notes: created_notes, +// } +// } + +// pub fn executed_transaction(&self) -> &ExecutedTransaction { +// &self.executed_transaction +// } + +// pub fn created_notes(&self) -> &Vec { +// &self.output_notes +// } + +// pub fn block_num(&self) -> u32 { +// self.executed_transaction.block_header().block_num() +// } + +// pub fn transaction_arguments(&self) -> &TransactionArgs { +// self.executed_transaction.tx_args() +// } + +// pub fn account_delta(&self) -> &AccountDelta { +// self.executed_transaction.account_delta() +// } +// } + +// pub struct TransactionRecord { +// pub id: TransactionId, +// pub account_id: AccountId, +// pub init_account_state: Digest, +// pub final_account_state: Digest, +// pub input_note_nullifiers: Vec, +// pub output_notes: OutputNotes, +// pub transaction_script: Option, +// pub block_num: u32, +// pub transaction_status: TransactionStatus, +// } + +// impl TransactionRecord { +// #[allow(clippy::too_many_arguments)] +// pub fn new( +// id: TransactionId, +// account_id: AccountId, +// init_account_state: Digest, +// final_account_state: Digest, +// input_note_nullifiers: Vec, +// output_notes: OutputNotes, +// transaction_script: Option, +// block_num: u32, +// transaction_status: TransactionStatus, +// ) -> TransactionRecord { +// TransactionRecord { +// id, +// account_id, +// init_account_state, +// final_account_state, +// input_note_nullifiers, +// output_notes, +// transaction_script, +// block_num, +// transaction_status, +// } +// } +// } + +// pub enum TransactionStatus { +// /// Transaction has been submitted but not yet committed +// Pending, +// /// Transaction has been committed and included at the specified block number +// Committed(u32), +// } + +// impl std::fmt::Display for TransactionStatus { +// fn fmt( +// &self, +// f: &mut std::fmt::Formatter<'_>, +// ) -> std::fmt::Result { +// match self { +// TransactionStatus::Pending => write!(f, "Pending"), +// TransactionStatus::Committed(block_number) => { +// write!(f, "Committed (Block: {})", block_number) +// }, +// } +// } +// } + +impl Client { + pub async fn get_transactions( + &mut self, + filter: NativeTransactionFilter, + ) -> String { // TODO: Replace with Result, ()> + //self.store.get_transactions(filter).map_err(|err| err.into()) + + "Called get_transactions".to_string() + } + + pub async fn new_transaction( + &mut self, + //transaction_template: NativeTransactionTemplate, // TODO: Add parameter back + ) -> String { // TODO: Replace with Result + // match transaction_template { + // TransactionTemplate::PayToId(PaymentTransactionData { + // asset: fungible_asset, + // sender_account_id, + // target_account_id, + // }) => self.new_p2id_transaction(fungible_asset, sender_account_id, target_account_id), + // TransactionTemplate::PayToIdWithRecall(_payment_data, _recall_height) => todo!(), + // TransactionTemplate::ConsumeNotes(account_id, list_of_notes) => { + // self.new_consume_notes_transaction(account_id, &list_of_notes) + // }, + // TransactionTemplate::MintFungibleAsset { + // asset, + // target_account_id, + // } => self.new_mint_fungible_asset_transaction(asset, target_account_id), + // } + + "Called new_transaction".to_string() + } + + // fn new_p2id_transaction( + // &mut self, + // fungible_asset: Asset, + // sender_account_id: AccountId, + // target_account_id: AccountId, + // ) -> Result { + // let random_coin = self.get_random_coin(); + + // let created_note = create_p2id_note( + // sender_account_id, + // target_account_id, + // vec![fungible_asset], + // random_coin, + // )?; + + // self.tx_executor.load_account(sender_account_id)?; + + // let block_ref = self.get_sync_height()?; + + // let recipient = created_note + // .recipient() + // .iter() + // .map(|x| x.as_int().to_string()) + // .collect::>() + // .join("."); + + // let tx_script_code = ProgramAst::parse( + // &AUTH_SEND_ASSET_SCRIPT + // .replace("{recipient}", &recipient) + // .replace("{tag}", &Felt::new(Into::::into(target_account_id)).to_string()) + // .replace("{asset}", &prepare_word(&fungible_asset.into()).to_string()), + // ) + // .expect("shipped MASM is well-formed"); + + // self.compile_and_execute_tx( + // sender_account_id, + // &[], + // vec![created_note], + // tx_script_code, + // block_ref, + // ); + // } + + // fn new_consume_notes_transaction( + // &mut self, + // account_id: AccountId, + // note_ids: &[NoteId], + // ) -> Result { + // self.tx_executor + // .load_account(account_id) + // .map_err(|err| ())?; + + // let tx_script_code = + // ProgramAst::parse(AUTH_CONSUME_NOTES_SCRIPT).expect("shipped MASM is well-formed"); + + // let block_num = self.store.get_sync_height()?; + + // // Because the notes are retrieved by the executor, there is no need to cross check here + // // that they exist in the Store + // self.compile_and_execute_tx(account_id, note_ids, vec![], tx_script_code, block_num) + // } + + // fn new_mint_fungible_asset_transaction( + // &mut self, + // asset: FungibleAsset, + // target_id: AccountId, + // ) -> Result { + // let faucet_id = asset.faucet_id(); + + // // Construct Account + // self.tx_executor.load_account(faucet_id)?; + + // let block_ref = self.get_sync_height()?; + // let random_coin = self.get_random_coin(); + + // let created_note = create_p2id_note(faucet_id, target_id, vec![asset.into()], random_coin)?; + + // let recipient = created_note + // .recipient() + // .iter() + // .map(|x| x.as_int().to_string()) + // .collect::>() + // .join("."); + + // let tx_script_code = ProgramAst::parse( + // &DISTRIBUTE_FUNGIBLE_ASSET_SCRIPT + // .replace("{recipient}", &recipient) + // .replace("{tag}", &Felt::new(Into::::into(target_id)).to_string()) + // .replace("{amount}", &Felt::new(asset.amount()).to_string()), + // ) + // .expect("shipped MASM is well-formed"); + + // self.compile_and_execute_tx(faucet_id, &[], vec![created_note], tx_script_code, block_ref) + // } + + // fn compile_and_execute_tx( + // &mut self, + // account_id: AccountId, + // input_notes: &[NoteId], + // output_notes: Vec, + // tx_script: ProgramAst, + // block_num: u32, + // ) -> Result { + // let account_auth = self.store.get_account_auth(account_id)?; + // let (pubkey_input, advice_map): (Word, Vec) = match account_auth { + // AuthInfo::RpoFalcon512(key) => ( + // key.public_key().into(), + // key.to_bytes().iter().map(|a| Felt::new(*a as u64)).collect::>(), + // ), + // }; + // let script_inputs = vec![(pubkey_input, advice_map)]; + + // let tx_script = self.tx_executor.compile_tx_script(tx_script, script_inputs, vec![])?; + + // let tx_args = TransactionArgs::with_tx_script(tx_script); + + // // Execute the transaction and get the witness + // let executed_transaction = self.tx_executor.execute_transaction( + // account_id, + // block_num, + // input_notes, + // Some(tx_args), + // )?; + + // Ok(TransactionResult::new(executed_transaction, output_notes)) + // } + + /// Proves the specified transaction witness, submits it to the node, and stores the transaction in + /// the local database for tracking. + pub async fn send_transaction( + &mut self, + //tx_result: TransactionResult, TODO: Add parameter back + ) -> String { // TODO: Replace with Result<(), ()> + // let transaction_prover = TransactionProver::new(ProvingOptions::default()); + // let proven_transaction = + // transaction_prover.prove_transaction(tx_result.executed_transaction().clone())?; + + // info!("Proved transaction, submitting to the node..."); + + // self.submit_proven_transaction_request(proven_transaction.clone()).await?; + + // // Transaction was proven and submitted to the node correctly, persist note details and update account + // self.store.apply_transaction(tx_result)?; + + // Ok(()) + + "Called send_transaction".to_string() + } + + // async fn submit_proven_transaction_request( + // &mut self, + // proven_transaction: ProvenTransaction, + // ) -> Result<(), ()> { + // Ok(self.rpc_api.submit_proven_transaction(proven_transaction).await?) + // } + + // fn get_random_coin( + // &mut self + // ) -> RpoRandomCoin { + // let mut rng = StdRng::from_entropy(); + // let coin_seed: [u64; 4] = rng.gen(); + + // RpoRandomCoin::new(coin_seed.map(Felt::new)) + // } +} + +// HELPERS +// ================================================================================================ + +// pub fn prepare_word(word: &Word) -> String { +// word.iter().map(|x| x.as_int().to_string()).collect::>().join(".") +// } \ No newline at end of file diff --git a/wasm/src/native_code/utils.rs b/wasm/src/native_code/utils.rs new file mode 100644 index 000000000..ea7205158 --- /dev/null +++ b/wasm/src/native_code/utils.rs @@ -0,0 +1,100 @@ +use super::{ + rpc::NodeRpcClient, + Client, + store::Store // TODO: Add AuthInfo +}; + +// pub fn build_transaction_template( +// client: &Client, +// transaction_type: &TransactionType, +// ) -> Result { +// match transaction_type { +// TransactionType::P2ID { +// sender_account_id, +// target_account_id, +// faucet_id, +// amount, +// } => { +// let faucet_id = AccountId::from_hex(faucet_id).map_err(|err| err.to_string())?; +// let fungible_asset = +// FungibleAsset::new(faucet_id, *amount).map_err(|err| err.to_string())?.into(); +// let sender_account_id = +// AccountId::from_hex(sender_account_id).map_err(|err| err.to_string())?; +// let target_account_id = +// AccountId::from_hex(target_account_id).map_err(|err| err.to_string())?; +// let payment_transaction = +// PaymentTransactionData::new(fungible_asset, sender_account_id, target_account_id); + +// Ok(TransactionTemplate::PayToId(payment_transaction)) +// }, +// TransactionType::P2IDR => { +// todo!() +// }, +// TransactionType::Mint { +// faucet_id, +// target_account_id, +// amount, +// } => { +// let faucet_id = AccountId::from_hex(faucet_id).map_err(|err| err.to_string())?; +// let fungible_asset = +// FungibleAsset::new(faucet_id, *amount).map_err(|err| err.to_string())?; +// let target_account_id = +// AccountId::from_hex(target_account_id).map_err(|err| err.to_string())?; + +// Ok(TransactionTemplate::MintFungibleAsset { +// asset: fungible_asset, +// target_account_id, +// }) +// }, +// TransactionType::ConsumeNotes { +// account_id, +// list_of_notes, +// } => { +// let list_of_notes = list_of_notes +// .iter() +// .map(|note_id| { +// get_note_with_id_prefix(client, note_id) +// .map(|note_record| note_record.note_id()) +// .map_err(|err| err.to_string()) +// }) +// .collect::, _>>()?; + +// let account_id = AccountId::from_hex(account_id).map_err(|err| err.to_string())?; + +// Ok(TransactionTemplate::ConsumeNotes(account_id, list_of_notes)) +// }, +// } +// } + +// pub(crate) fn get_note_with_id_prefix( +// client: &Client, +// note_id_prefix: &str, +// ) -> Result { +// let input_note_records = client +// .get_input_notes(ClientNoteFilter::All) +// .map_err(|err| { +// tracing::error!("Error when fetching all notes from the store: {err}"); +// NoteIdPrefixFetchError::NoMatch(note_id_prefix.to_string()) +// })? +// .into_iter() +// .filter(|note_record| note_record.note_id().to_hex().starts_with(note_id_prefix)) +// .collect::>(); + +// if input_note_records.is_empty() { +// return Err(NoteIdPrefixFetchError::NoMatch(note_id_prefix.to_string())); +// } +// if input_note_records.len() > 1 { +// let input_note_record_ids = input_note_records +// .iter() +// .map(|input_note_record| input_note_record.note_id()) +// .collect::>(); +// tracing::error!( +// "Multiple notes found for the prefix {}: {:?}", +// note_id_prefix, +// input_note_record_ids +// ); +// return Err(NoteIdPrefixFetchError::MultipleMatches(note_id_prefix.to_string())); +// } + +// Ok(input_note_records[0].clone()) +// } diff --git a/wasm/src/web_client/mod.rs b/wasm/src/web_client/mod.rs index 94012ce0d..481fcb8a4 100644 --- a/wasm/src/web_client/mod.rs +++ b/wasm/src/web_client/mod.rs @@ -1,5 +1,6 @@ pub mod account; pub mod notes; +pub mod transactions; pub mod store; pub mod web_rpc_client; @@ -35,6 +36,7 @@ impl WebClient { pub async fn create_client(&mut self) -> Result { let web_store = WebStore::new().await.map_err(|_| JsValue::from_str("Failed to initialize WebStore"))?; let web_rpc_client = WebRpcClient::new("http://localhost:57291"); + //let executor_store = WebStore::new().await.map_err(|_| JsValue::from_str("Failed to initialize ExecutorStore"))?; self.inner = Some(Client::new(web_rpc_client, web_store)); diff --git a/wasm/src/web_client/store/mod.rs b/wasm/src/web_client/store/mod.rs index bdf6ae2cb..6fffaf23c 100644 --- a/wasm/src/web_client/store/mod.rs +++ b/wasm/src/web_client/store/mod.rs @@ -7,6 +7,7 @@ use async_trait::async_trait; pub mod accounts; pub mod notes; +pub mod transactions; pub mod mock_example; // Initialize IndexedDB @@ -35,6 +36,21 @@ impl Store for WebStore { self.insert_string(data).await } + // TRANSACTIONS + // async fn get_transactions( + // &mut self, + // transaction_filter: TransactionFilter, + // ) -> Result, ()> { + // self.get_transactions(transaction_filter).await + // } + + // async fn apply_transaction( + // &mut self, + // tx_result: TransactionResult, + // ) -> Result<(), ()> { + // self.apply_transaction(tx_result).await + // } + // ACCOUNTS // async fn insert_account( // &mut self, @@ -108,4 +124,7 @@ impl Store for WebStore { // ) -> Result, ()> { // self.get_unspent_input_note_nullifiers().await // } + + // TRANSACTIONS + } \ No newline at end of file diff --git a/wasm/src/web_client/store/notes/mod.rs b/wasm/src/web_client/store/notes/mod.rs index 537f03b5d..d94c08106 100644 --- a/wasm/src/web_client/store/notes/mod.rs +++ b/wasm/src/web_client/store/notes/mod.rs @@ -103,7 +103,7 @@ impl WebStore { // &mut self, // note: &InputNoteRecord // ) -> Result<(), ()> { - // insert_input_note_util(note).await + // insert_input_note_tx(note).await // } // pub(crate) async fn get_output_notes( diff --git a/wasm/src/web_client/store/notes/utils.rs b/wasm/src/web_client/store/notes/utils.rs index 4b424e6aa..82769abb5 100644 --- a/wasm/src/web_client/store/notes/utils.rs +++ b/wasm/src/web_client/store/notes/utils.rs @@ -62,7 +62,7 @@ use super::js_bindings::*; // Ok((note_id, note_assets, recipient, status, metadata, details, inclusion_proof)) // } -// pub(super) async fn insert_input_note_util( +// pub(super) async fn insert_input_note_tx( // note: &InputNoteRecord // ) -> Result<(), ()> { // let (note_id, assets, recipient, status, metadata, details, inclusion_proof) = @@ -83,7 +83,7 @@ use super::js_bindings::*; // } // } -// pub async fn insert_output_note( +// pub async fn insert_output_note_tx( // note: &InputNoteRecord // ) -> Result<(), ()> { // let (note_id, assets, recipient, status, metadata, details, inclusion_proof) = diff --git a/wasm/src/web_client/store/transactions/js_bindings.rs b/wasm/src/web_client/store/transactions/js_bindings.rs new file mode 100644 index 000000000..2989b12ef --- /dev/null +++ b/wasm/src/web_client/store/transactions/js_bindings.rs @@ -0,0 +1,40 @@ +use wasm_bindgen::prelude::*; +use wasm_bindgen_futures::*; + +#[wasm_bindgen(module = "/js/db/transactions.js")] +extern "C" { + // GETS + // ================================================================================================ + + #[wasm_bindgen(js_name = getTransactions)] + pub fn idxdb_get_transactions( + filter: String + ) -> js_sys::Promise; + + #[wasm_bindgen(js_name = insertTransactionScript)] + pub fn idxdb_insert_transaction_script( + script_hash: Option>, + script_program: Option> + ) -> js_sys::Promise; + + #[wasm_bindgen(js_name = insertProvenTransactionData)] + pub fn idxdb_insert_proven_transaction_data( + transaction_id: String, + account_id: String, + init_account_state: String, + final_account_state: String, + input_notes: String, + output_notes: Vec, + script_program: Option>, + script_hash: Option>, + script_inputs: Option, + block_num: String, + committed: Option + ) -> js_sys::Promise; + + #[wasm_bindgen(js_name = markTransactionsAsCommitted)] + pub fn idxdb_mark_transactions_as_committed( + block_num: String, + transaction_ids: Vec + ) -> js_sys::Promise; +} \ No newline at end of file diff --git a/wasm/src/web_client/store/transactions/mod.rs b/wasm/src/web_client/store/transactions/mod.rs new file mode 100644 index 000000000..59d661fe1 --- /dev/null +++ b/wasm/src/web_client/store/transactions/mod.rs @@ -0,0 +1,149 @@ +use crate::native_code::{store::NativeTransactionFilter, transactions}; + +use wasm_bindgen_futures::*; +use serde_wasm_bindgen::from_value; + +use super::WebStore; + +mod js_bindings; +use js_bindings::*; + +mod models; +use models::*; + +mod utils; +use utils::*; + +impl WebStore { + // pub async fn get_transactions( + // &mut self, + // filter: NativeTransactionFilter + // ) -> Result, ()> { + // let filter_as_str = match filter { + // NativeTransactionFilter::All => "All", + // NativeTransactionFilter::Uncomitted => "Uncomitted", + // }; + + // let promise = idxdb_get_transactions(filter_as_str.to_string()); + // let js_value = JsFuture::from(promise).await?; + // let transactions_idxdb: Vec = from_value(js_value).unwrap(); + + // let transaction_records: Result, ()> = transactions_idxdb.into_iter().map(|tx_idxdb| { + // let native_account_id = AccountId::from_hex(&tx_idxdb.account_id).map_err(|_err| ())?; + // let block_num_as_u32: u32 = tx_idxdb.block_num.parse::().unwrap(); + // let commit_height_as_u32: Option = match tx_idxdb.commit_height { + // Some(height) => Some(height.parse::().unwrap()), + // _ => None, + // }; + + // let id: Digest = tx_idxdb.id.try_into()?; + // let init_account_state: Digest = init_account_state.try_into()?; + + // let final_account_state: Digest = final_account_state.try_into()?; + + // let input_note_nullifiers: Vec = + // serde_json::from_str(&input_notes).map_err(StoreError::JsonDataDeserializationError)?; + + // let output_notes: OutputNotes = OutputNotes::read_from_bytes(&output_notes)?; + + // let transaction_script: Option = if script_hash.is_some() { + // let script_hash = script_hash + // .map(|hash| Digest::read_from_bytes(&hash)) + // .transpose()? + // .expect("Script hash should be included in the row"); + + // let script_program = script_program + // .map(|program| ProgramAst::from_bytes(&program)) + // .transpose()? + // .expect("Script program should be included in the row"); + + // let script_inputs = script_inputs + // .map(|hash| serde_json::from_str::>>(&hash)) + // .transpose() + // .map_err(StoreError::JsonDataDeserializationError)? + // .expect("Script inputs should be included in the row"); + + // let tx_script = TransactionScript::from_parts( + // script_program, + // script_hash, + // script_inputs.into_iter().map(|(k, v)| (k.into(), v)), + // )?; + + // Some(tx_script) + // } else { + // None + // }; + + // let transaction_status = + // commit_height_as_u32.map_or(TransactionStatus::Pending, TransactionStatus::Committed); + + // Ok(TransactionRecord { + // id: id.into(), + // native_account_id, + // init_account_state, + // final_account_state, + // input_note_nullifiers, + // output_notes, + // transaction_script, + // block_num_as_u32, + // transaction_status, + // }) + // }).collect(); + + // transaction_records + // } + + // pub async fn apply_transaction( + // &mut self, + // tx_result: TransactionResult + // ) -> Result<(), ()> { + // let account_id = tx_result.executed_transaction().account_id(); + // let account_delta = tx_result.account_delta(); + + // let (mut account, _seed) = self.get_account(account_id).await?; + + // account.apply_delta(account_delta).map_err()?; + + // let created_notes = tx_result + // .created_notes() + // .iter() + // .map(|note| InputNoteRecord::from(note.clone())) + // .collect::>(); + + // // Transaction Data + // insert_proven_transaction_data(tx_result).await?; + + // // Account Data + // update_account(account).await?; + + // // Updates for notes + + // // TODO: see if we should filter the input notes we store to keep notes we can consume with + // // existing accounts + // for note in &created_notes { + // insert_input_note_tx(note).await?; + // } + + // for note in &created_notes { + // insert_output_note_tx(note).await?; + // } + + // Ok(()) + // } + + // pub(crate) async fn mark_transactions_as_committed( + // &mut self, + // block_num: u32, + // transactions_to_commit: &[TransactionId] + // ) -> Result { + // let block_num_as_str = block_num.to_string(); + // let transactions_to_commit_as_str: Vec = transactions_to_commit.iter().map(|tx_id| tx_id.inner().into()).collect(); + + // let promise = idxdb_mark_transactions_as_committed(block_num_as_str, transactions_to_commit_as_str); + // let js_value = JsFuture::from(promise).await?; + // let result: usize = from_value(js_value).unwrap(); + + // Ok(result) + // } +} + diff --git a/wasm/src/web_client/store/transactions/models.rs b/wasm/src/web_client/store/transactions/models.rs new file mode 100644 index 000000000..1963768e1 --- /dev/null +++ b/wasm/src/web_client/store/transactions/models.rs @@ -0,0 +1,16 @@ +use serde::{Deserialize, Serialize}; + +#[derive(Serialize, Deserialize)] +pub struct TransactionIdxdbObject { + pub id: String, + pub account_id: String, // usually i64 + pub init_account_state: String, + pub final_account_state: String, + pub input_notes: String, + pub output_notes: Vec, + pub script_hash: Option>, + pub script_program: Option>, + pub script_inputs: Option, + pub block_num: String, // usually u32 + pub commit_height: Option // usually Option +} \ No newline at end of file diff --git a/wasm/src/web_client/store/transactions/utils.rs b/wasm/src/web_client/store/transactions/utils.rs new file mode 100644 index 000000000..1be3bd64e --- /dev/null +++ b/wasm/src/web_client/store/transactions/utils.rs @@ -0,0 +1,124 @@ +use wasm_bindgen_futures::*; + +use super::js_bindings::*; + +// TYPES +// ================================================================================================ + +// type SerializedTransactionData = ( +// String, +// String, +// String, +// String, +// String, +// Vec, +// Option>, +// Option>, +// Option, +// String, +// Option, +// ); + +// ================================================================================================ + +// pub async fn insert_proven_transaction_data( +// transaction_result: TransactionResult +// ) -> Result<(), ()> { +// let ( +// transaction_id, +// account_id, +// init_account_state, +// final_account_state, +// input_notes, +// output_notes, +// script_program, +// script_hash, +// script_inputs, +// block_num, +// committed +// ) = serialize_transaction_data(transaction_result)?; + +// if let Some(hash) = script_hash.clone() { +// let promise = idxdb_insert_transaction_script(script_hash, script_program); +// let result = JsFuture::from(promise).await; +// } + +// let promise = idxdb_insert_proven_transaction_data( +// transaction_id, +// account_id, +// init_account_state, +// final_account_state, +// input_notes, +// output_notes, +// script_program, +// script_hash, +// script_inputs, +// block_num, +// committed +// ); +// let result = JsFuture::from(promise).await; + +// match result { +// Ok(_) => Ok(()), +// Err(_) => Err(()), +// } +// } + +// pub(super) async fn serialize_transaction_data( +// transaction_result: TransactionResult +// ) -> Result { +// let executed_transaction = transaction_result.executed_transaction(); +// let transaction_id: String = executed_transaction.id().inner().into(); + +// let account_id_as_str: String = AccountId::to_hex(executed_transaction.account_id()); +// let init_account_state = &executed_transaction.initial_account().hash().to_string(); +// let final_account_state = &executed_transaction.final_account().hash().to_string(); + +// // TODO: Double check if saving nullifiers as input notes is enough +// let nullifiers: Vec = +// executed_transaction.input_notes().iter().map(|x| x.id().inner()).collect(); + +// let input_notes = +// serde_json::to_string(&nullifiers).map_err(|err| ())?; + +// let output_notes = executed_transaction.output_notes(); + +// // TODO: Scripts should be in their own tables and only identifiers should be stored here +// let transaction_args = transaction_result.transaction_arguments(); +// let mut script_program = None; +// let mut script_hash = None; +// let mut script_inputs = None; + +// if let Some(tx_script) = transaction_args.tx_script() { +// script_program = Some(tx_script.code().to_bytes(AstSerdeOptions { +// serialize_imports: true, +// })); +// script_hash = Some(tx_script.hash().to_bytes()); +// script_inputs = Some( +// serde_json::to_string(&tx_script.inputs()) +// .map_err(|err| ())?, +// ); +// } + +// Ok(( +// transaction_id, +// account_id_as_str, +// init_account_state.to_owned(), +// final_account_state.to_owned(), +// input_notes, +// output_notes.to_bytes(), +// script_program, +// script_hash, +// script_inputs, +// transaction_result.block_num().to_string(), +// None, +// )) +// } + +// pub(super) async fn update_account( +// new_account_state: Account, +// ) -> Result<(), ()> { +// insert_account_storage(new_account_state.storage())?; +// insert_account_asset_vault(new_account_state.vault())?; +// insert_account_record(&new_account_state, None) +// } \ No newline at end of file diff --git a/wasm/src/web_client/transactions.rs b/wasm/src/web_client/transactions.rs new file mode 100644 index 000000000..84d91a467 --- /dev/null +++ b/wasm/src/web_client/transactions.rs @@ -0,0 +1,89 @@ +use super::WebClient; + +use crate::native_code::store::NativeTransactionFilter; + +use serde::{Serialize, Deserialize}; +use serde_wasm_bindgen::from_value; +use wasm_bindgen::prelude::*; +use web_sys::console; + +#[derive(Serialize, Deserialize)] +pub enum TransactionFilter { + All, + Uncomitted +} + +#[derive(Serialize, Deserialize)] +#[serde(tag = "type")] +pub enum TransactionType { + /// Create a Pay To ID transaction. + P2ID { + sender_account_id: String, + target_account_id: String, + faucet_id: String, + amount: u64, + }, + /// Mint `amount` tokens from the specified fungible faucet (corresponding to `faucet_id`). The created note can then be then consumed by + /// `target_account_id`. + Mint { + target_account_id: String, + faucet_id: String, + amount: u64, + }, + /// Create a Pay To ID with Recall transaction. + P2IDR, + /// Consume with the account corresponding to `account_id` all of the notes from `list_of_notes`. + ConsumeNotes { + account_id: String, + /// A list of note IDs or the hex prefixes of their corresponding IDs + list_of_notes: Vec, + }, +} + +#[wasm_bindgen] +impl WebClient { + pub async fn get_transactions( + &mut self, + filter: JsValue + ) -> () { + if let Some(ref mut client) = self.get_mut_inner() { + let filter: TransactionFilter = from_value(filter).unwrap(); + let native_filter = match filter { + TransactionFilter::All => NativeTransactionFilter::All, + TransactionFilter::Uncomitted => NativeTransactionFilter::Uncomitted + }; + + let message = client.get_transactions(native_filter).await; + let js_value_message = JsValue::from_str(&message); + + // Print the message to the Chrome console + console::log_1(&js_value_message); + } else { + console::error_1(&"Client not initialized".into()); + } + } + + pub async fn new_transaction( + &mut self, + //transaction_type: JsValue + ) -> () { + if let Some(ref mut client) = self.get_mut_inner() { + //let transaction_type: TransactionType = from_value(transaction_type).unwrap(); + //let transaction_template = build_transaction_template(client, transaction_type)?; + + let message = client.new_transaction().await; + let js_value_message = JsValue::from_str(&message); + + // Print the message to the Chrome console + console::log_1(&js_value_message); + + let message = client.send_transaction().await; + let js_value_message = JsValue::from_str(&message); + + // Print the message to the Chrome console + console::log_1(&js_value_message); + } else { + console::error_1(&"Client not initialized".into()); + } + } +} \ No newline at end of file diff --git a/wasm/test.html b/wasm/test.html index 9cecb7b7e..c0ca9c096 100644 --- a/wasm/test.html +++ b/wasm/test.html @@ -119,6 +119,28 @@ } } + // Transaction Tests + + async function testGetTransactions(webClient) { + try { + await webClient.get_transactions("All"); + + } catch (error) { + console.error('Failed to call get transactions:', error); + + } + } + + async function testNewTransaction(webClient) { + try { + await webClient.new_transaction(); + + } catch (error) { + console.error('Failed to call new transaction:', error); + + } + } + let webClient = await testCreateClient(); await testStoreAndRpc(webClient); await testNewAccount(webClient); @@ -130,6 +152,9 @@ await testGetInputNotes(webClient); await testGetInputNote(webClient); await testImportInputNote(webClient); + + await testGetTransactions(webClient); + await testNewTransaction(webClient); \ No newline at end of file From e0d65560a3b1d0e04829bab937766b22665c642f Mon Sep 17 00:00:00 2001 From: Dennis Garcia Date: Tue, 16 Apr 2024 16:05:08 -0500 Subject: [PATCH 09/42] Finished adding skeleton code for sync (#8) --- wasm/js/db/schema.js | 10 + wasm/js/db/sync.js | 171 +++++++++ wasm/src/native_code/mod.rs | 1 + wasm/src/native_code/store/mod.rs | 31 +- wasm/src/native_code/sync.rs | 343 ++++++++++++++++++ wasm/src/web_client/mod.rs | 1 + wasm/src/web_client/store/mod.rs | 38 ++ wasm/src/web_client/store/sync/js_bindings.rs | 32 ++ wasm/src/web_client/store/sync/mod.rs | 102 ++++++ wasm/src/web_client/store/sync/models.rs | 11 + wasm/src/web_client/store/sync/utils.rs | 0 wasm/src/web_client/sync.rs | 20 + wasm/test.html | 13 + 13 files changed, 768 insertions(+), 5 deletions(-) create mode 100644 wasm/js/db/sync.js create mode 100644 wasm/src/native_code/sync.rs create mode 100644 wasm/src/web_client/store/sync/js_bindings.rs create mode 100644 wasm/src/web_client/store/sync/mod.rs create mode 100644 wasm/src/web_client/store/sync/models.rs create mode 100644 wasm/src/web_client/store/sync/utils.rs create mode 100644 wasm/src/web_client/sync.rs diff --git a/wasm/js/db/schema.js b/wasm/js/db/schema.js index ca1a568d1..227513aaa 100644 --- a/wasm/js/db/schema.js +++ b/wasm/js/db/schema.js @@ -24,6 +24,7 @@ const Table = { TransactionScripts: 'transactionScripts', InputNotes: 'inputNotes', OutputNotes: 'outputNotes', + StateSync: 'stateSync', Greet: 'greets', }; @@ -38,6 +39,7 @@ db.version(1).stores({ [Table.TransactionScripts]: indexes('scriptHash'), [Table.InputNotes]: indexes('noteId', 'recipient', 'status'), [Table.OutputNotes]: indexes('noteId', 'recipient', 'status'), + [Table.StateSync]: indexes('id'), [Table.Greet]: '++id', }); @@ -45,6 +47,11 @@ function indexes(...items) { return items.join(','); } +db.on('populate', () => { + // Populate the stateSync table with default values + db.stateSync.put({ id: 1, blockNum: 0, tags: [] }); +}); + const accountCodes = db.table(Table.AccountCode); const accountStorages = db.table(Table.AccountStorage); const accountVaults = db.table(Table.AccountVaults); @@ -54,9 +61,11 @@ const transactions = db.table(Table.Transactions); const transactionScripts = db.table(Table.TransactionScripts); const inputNotes = db.table(Table.InputNotes); const outputNotes = db.table(Table.OutputNotes); +const stateSync = db.table(Table.StateSync); const greets = db.table(Table.Greet); export { + db, accountCodes, accountStorages, accountVaults, @@ -66,5 +75,6 @@ export { transactionScripts, inputNotes, outputNotes, + stateSync, greets, }; diff --git a/wasm/js/db/sync.js b/wasm/js/db/sync.js new file mode 100644 index 000000000..943723efa --- /dev/null +++ b/wasm/js/db/sync.js @@ -0,0 +1,171 @@ +import { + db, + stateSync, + inputNotes, + outputNotes, + transactions +} from './schema.js'; + +export async function getNoteTags() { + try { + const record = await stateSync.get(1); // Since id is the primary key and always 1 + if (record) { + console.log('Retrieved record:', record); + return record.tags; // Accessing blockNum directly from the record + } else { + console.log('No record found with id: 1'); + return null; + } + } catch (error) { + console.error('Error fetching record:', error); + return null; + } +} + +export async function getSyncHeight() { + try { + const record = await stateSync.get(1); // Since id is the primary key and always 1 + if (record) { + console.log('Retrieved record:', record); + return record.blockNum; // Accessing blockNum directly from the record + } else { + console.log('No record found with id: 1'); + return null; + } + } catch (error) { + console.error('Error fetching record:', error); + return null; + } +} + +export async function addNoteTag( + tags +) { + try { + await stateSync.update(1, { tags: tags }); + } catch { + console.error("Failed to add note tag: ", err); + throw err; + } +} + +export async function applyStateSync( + blockNum, + nullifiers, + noteIds, + inclusionProofs, + transactionIds +) { + return db.transaction('rw', stateSync, inputNotes, outputNotes, transactions, async (tx) => { + await updateSyncHeight(tx, blockNum); + await updateSpentNotes(tx, nullifiers); + await updateCommittedNotes(tx, noteIds, inclusionProofs); + await updateCommittedTransactions(tx, blockNum, transactionIds); + }); +} + +async function updateSyncHeight( + tx, + blockNum +) { + try { + await tx.stateSync.update(1, { blockNum: blockNum }); + } catch (error) { + console.error("Failed to update sync height: ", error); + throw error; + } +} + +async function updateSpentNotes( + tx, + nullifiers +) { + try { + // Fetch all notes + const inputNotes = await tx.inputNotes.toArray(); + const outputNotes = await tx.outputNotes.toArray(); + + // Pre-parse all details and store them with their respective note ids for quick access + const parsedInputNotes = inputNotes.map(note => ({ + noteId: note.noteId, + details: JSON.parse(note.details) // Parse the JSON string into an object + })); + + // Iterate through each parsed note and check against the list of nullifiers + for (const note of parsedInputNotes) { + if (nullifiers.includes(note.details.nullifier)) { + // If the nullifier is in the list, update the note's status + await tx.inputNotes.update(note.noteId, { status: 'consumed' }); + } + } + + // Pre-parse all details and store them with their respective note ids for quick access + const parsedOutputNotes = outputNotes.map(note => ({ + noteId: note.noteId, + details: JSON.parse(note.details) // Parse the JSON string into an object + })); + + // Iterate through each parsed note and check against the list of nullifiers + for (const note of parsedOutputNotes) { + if (nullifiers.includes(note.details.nullifier)) { + // If the nullifier is in the list, update the note's status + await tx.outputNotes.update(note.noteId, { status: 'consumed' }); + } + } + + console.log("Spent notes have been updated successfully."); + } catch (error) { + console.error("Error updating input notes:", error); + throw error; + } +} + +async function updateCommittedNotes( + tx, + noteIds, + inclusionProofs +) { + try { + if (noteIds.length !== inclusionProofs.length) { + throw new Error("Arrays noteIds and inclusionProofs must be of the same length"); + } + + for (let i = 0; i < noteIds.length; i++) { + const noteId = noteIds[i]; + const inclusionProof = inclusionProofs[i]; + + // Update input notes + await tx.inputNotes.where({ noteId: noteId }).modify({ + status: 'committed', + inclusion_proof: inclusionProof + }); + + // Update output notes + await tx.outputNotes.where({ noteId: noteId }).modify({ + status: 'committed', + inclusion_proof: inclusionProof + }); + } + } catch (error) { + console.error("Error updating committed notes:", error); + throw error; + } +} + +async function updateCommittedTransactions( + tx, + blockNum, + transactionIds +) { + try { + const updates = transactionIds.map(transactionId => ({ + id: transactionId, + commitHeight: blockNum + })); + + await tx.transactions.bulkPut(updates); + } catch (err) { + console.error("Failed to mark transactions as committed: ", err); + throw err; + } +} \ No newline at end of file diff --git a/wasm/src/native_code/mod.rs b/wasm/src/native_code/mod.rs index aae3055ad..dccd30751 100644 --- a/wasm/src/native_code/mod.rs +++ b/wasm/src/native_code/mod.rs @@ -1,6 +1,7 @@ pub mod accounts; pub mod notes; pub mod transactions; +pub mod sync; pub mod utils; pub mod store; diff --git a/wasm/src/native_code/store/mod.rs b/wasm/src/native_code/store/mod.rs index 510e8ee2e..79f348b39 100644 --- a/wasm/src/native_code/store/mod.rs +++ b/wasm/src/native_code/store/mod.rs @@ -22,6 +22,32 @@ pub trait Store { data: String ) -> Result<(), ()>; + // SYNC + // -------------------------------------------------------------------------------------------- + + // async fn get_note_tags( + // &self + // ) -> Result, ()>; + + // async fn add_note_tag( + // &mut self, + // tag: u64, + // ) -> Result; + + // async fn get_sync_height( + // &self + // ) -> Result; + + // async fn apply_state_sync( + // &mut self, + // block_header: BlockHeader, + // nullifiers: Vec, + // committed_notes: Vec<(NoteId, NoteInclusionProof)>, + // committed_transactions: &[TransactionId], + // new_mmr_peaks: MmrPeaks, + // new_authentication_nodes: &[(InOrderIndex, Digest)], + // ) -> Result<(), ()>; + // TRANSACTIONS // -------------------------------------------------------------------------------------------- @@ -94,11 +120,6 @@ pub trait Store { // async fn get_unspent_input_note_nullifiers( // &self // ) -> Result, ()>; - - // TRANSACTIONS - // -------------------------------------------------------------------------------------------- - - } // DATABASE AUTH INFO diff --git a/wasm/src/native_code/sync.rs b/wasm/src/native_code/sync.rs new file mode 100644 index 000000000..08bf1158f --- /dev/null +++ b/wasm/src/native_code/sync.rs @@ -0,0 +1,343 @@ +use super::{ + rpc::NodeRpcClient, + Client, + store::Store // TODO: Add AuthInfo +}; + +pub enum SyncStatus { + SyncedToLastBlock(u32), + SyncedToBlock(u32), +} + +pub const FILTER_ID_SHIFT: u8 = 48; + +impl Client { + // pub async fn get_sync_height( + // &self, + // ) -> Result { + // self.store.get_sync_height().await? + // } + + // pub async fn get_note_tags( + // &self + // ) -> Result, ()> { + // self.store.get_note_tags().await? + // } + + // pub async fn add_note_tag( + // &mut self, + // tag: u64, + // ) -> Result<(), ()> { + // match result { + // Ok(true) => Ok(()), + // Ok(false) => { + // warn!("Tag {} is already being tracked", tag); + // Ok(()) + // }, + // Err(_) => Ok(()) // Ignore all errors and return Ok(()) for uniformity. + // } + // } + + pub async fn sync_state( + &mut self + ) -> String { // TODO: Replace with Result + // self.ensure_genesis_in_place().await?; + // loop { + // let response = self.sync_state_once().await?; + // if let SyncStatus::SyncedToLastBlock(v) = response { + // return Ok(v); + // } + // } + + "Called sync_state".to_string() + } + + // async fn ensure_genesis_in_place( + // &mut self + // ) -> Result<(), ()> { + // let genesis = self.store.get_block_header_by_num(0).await?; + + // if genesis_result.is_ok() { + // // If the genesis block is found, return Ok. + // Ok(()) + // } else { + // // If there's any error (including genesis block not found), try to retrieve and store genesis. + // // Any error during retrieval or storage is ignored, returning Err(()). + // self.retrieve_and_store_genesis().await.map_err(|_| ()) + // } + // } + + // async fn retrieve_and_store_genesis( + // &mut self + // ) -> Result<(), ()> { + // let genesis_block = self.rpc_api.get_block_header_by_number(Some(0)).await?; + + // let blank_mmr_peaks = + // MmrPeaks::new(0, vec![]).expect("Blank MmrPeaks should not fail to instantiate"); + // // NOTE: If genesis block data ever includes notes in the future, the third parameter in + // // this `insert_block_header` call may be `true` + // self.store.insert_block_header(genesis_block, blank_mmr_peaks, false).await?; + // Ok(()) + // } + + // async fn sync_state_once( + // &mut self + // ) -> Result { + // let current_block_num = self.store.get_sync_height().await?; + + // let accounts: Vec = self + // .store + // .get_account_stubs().await? + // .into_iter() + // .map(|(acc_stub, _)| acc_stub) + // .collect(); + + // let note_tags: Vec = accounts + // .iter() + // .map(|acc| ((u64::from(acc.id()) >> FILTER_ID_SHIFT) as u16)) + // .collect(); + + // // To receive information about added nullifiers, we reduce them to the higher 16 bits + // // Note that besides filtering by nullifier prefixes, the node also filters by block number + // // (it only returns nullifiers from current_block_num until response.block_header.block_num()) + // let nullifiers_tags: Vec = self + // .store + // .get_unspent_input_note_nullifiers().await? + // .iter() + // .map(|nullifier| (nullifier.inner()[3].as_int() >> FILTER_ID_SHIFT) as u16) + // .collect(); + + // // Send request + // let account_ids: Vec = accounts.iter().map(|acc| acc.id()).collect(); + // let response = self + // .rpc_api + // .sync_state(current_block_num, &account_ids, ¬e_tags, &nullifiers_tags) + // .await?; + + // // We don't need to continue if the chain has not advanced + // if response.block_header.block_num() == current_block_num { + // return Ok(SyncStatus::SyncedToLastBlock(current_block_num)); + // } + + // let committed_notes = + // self.build_inclusion_proofs(response.note_inclusions, &response.block_header).await?; + + // // Check if the returned account hashes match latest account hashes in the database + // check_account_hashes(&response.account_hash_updates, &accounts)?; + + // // Derive new nullifiers data + // let new_nullifiers = self.get_new_nullifiers(response.nullifiers).await?; + + // // Build PartialMmr with current data and apply updates + // let (new_peaks, new_authentication_nodes) = { + // let current_partial_mmr = self.build_current_partial_mmr().await?; + + // let (current_block, has_relevant_notes) = + // self.store.get_block_header_by_num(current_block_num).await?; + + // apply_mmr_changes( + // current_partial_mmr, + // response.mmr_delta, + // current_block, + // has_relevant_notes, + // )? + // }; + + // let note_ids: Vec = committed_notes.iter().map(|(id, _)| (*id)).collect(); + + // let uncommitted_transactions = + // self.store.get_transactions(TransactionFilter::Uncomitted).await?; + + // let transactions_to_commit = get_transactions_to_commit( + // &uncommitted_transactions, + // ¬e_ids, + // &new_nullifiers, + // &response.account_hash_updates, + // ); + + // // Apply received and computed updates to the store + // self.store + // .apply_state_sync( + // response.block_header, + // new_nullifiers, + // committed_notes, + // &transactions_to_commit, + // new_peaks, + // &new_authentication_nodes, + // ).await?; + + // if response.chain_tip == response.block_header.block_num() { + // Ok(SyncStatus::SyncedToLastBlock(response.chain_tip)) + // } else { + // Ok(SyncStatus::SyncedToBlock(response.block_header.block_num())) + // } + // } + + // HELPERS + // -------------------------------------------------------------------------------------------- + + // async fn build_inclusion_proofs( + // &self, + // committed_notes: Vec, + // block_header: &BlockHeader, + // ) -> Result, ()> { + // // We'll only pick committed notes that we are tracking as input/output notes. Since the + // // sync response contains notes matching either the provided accounts or the provided tag + // // we might get many notes when we only care about a few of those. + // let pending_input_notes: Vec = self + // .store + // .get_input_notes(NoteFilter::Pending).await? + // .iter() + // .map(|n| n.note().id()) + // .collect(); + + // let pending_output_notes: Vec = self + // .store + // .get_output_notes(NoteFilter::Pending).await? + // .iter() + // .map(|n| n.note().id()) + // .collect(); + + // let mut pending_notes = [pending_input_notes, pending_output_notes].concat(); + // pending_notes.dedup(); + + // committed_notes + // .iter() + // .filter_map(|commited_note| { + // if pending_notes.contains(commited_note.note_id()) { + // // FIXME: This removal is to accomodate a problem with how the node constructs paths where + // // they are constructed using note ID instead of authentication hash, so for now we remove the first + // // node here. + // // + // // See: https://github.com/0xPolygonMiden/miden-node/blob/main/store/src/state.rs#L274 + // let mut merkle_path = commited_note.merkle_path().clone(); + // if merkle_path.len() > 0 { + // let _ = merkle_path.remove(0); + // } + + // let note_inclusion_proof = NoteInclusionProof::new( + // block_header.block_num(), + // block_header.sub_hash(), + // block_header.note_root(), + // commited_note.note_index().into(), + // merkle_path, + // ) + // .map_err(|err| ()) + // .map(|proof| (*commited_note.note_id(), proof)); + + // Some(note_inclusion_proof) + // } else { + // None + // } + // }) + // .collect() + // } + + // pub(crate) async fn build_current_partial_mmr( + // &self + // ) -> Result { + // let current_block_num = self.store.get_sync_height().await?; + + // let tracked_nodes = self.store.get_chain_mmr_nodes(ChainMmrNodeFilter::All).await?; + // let current_peaks = self.store.get_chain_mmr_peaks_by_block_num(current_block_num).await?; + + // let track_latest = if current_block_num != 0 { + // // Attempt to fetch the block header. + // let result = self.store.get_block_header_by_num(current_block_num - 1).await + // .map(|(_, previous_block_had_notes)| previous_block_had_notes) // Directly extract the boolean if successful. + // .unwrap_or(false); // Return false on any error, effectively ignoring the error. + + // result // Use the result as the value for track_latest. + // } else { + // false + // }; + + // Ok(PartialMmr::from_parts(current_peaks, tracked_nodes, track_latest)) + // } + + // async fn get_new_nullifiers( + // &self, + // new_nullifiers: Vec, + // ) -> Result, ()> { + // let nullifiers = self + // .store + // .get_unspent_input_note_nullifiers().await? + // .iter() + // .map(|nullifier| nullifier.inner()) + // .collect::>(); + + // let new_nullifiers = new_nullifiers + // .into_iter() + // .filter(|nullifier| nullifiers.contains(nullifier)) + // .collect(); + + // Ok(new_nullifiers) + // } +} + +// UTILS +// -------------------------------------------------------------------------------------------- + +// fn apply_mmr_changes( +// current_partial_mmr: PartialMmr, +// mmr_delta: MmrDelta, +// current_block_header: BlockHeader, +// current_block_has_relevant_notes: bool, +// ) -> Result<(MmrPeaks, Vec<(InOrderIndex, Digest)>), ()> { +// let mut partial_mmr: PartialMmr = current_partial_mmr; + +// let new_authentication_nodes = partial_mmr +// .add(current_block_header.hash(), current_block_has_relevant_notes) +// .into_iter(); + +// let new_authentication_nodes: Vec<(InOrderIndex, Digest)> = partial_mmr +// .apply(mmr_delta) +// .map_err(|err| ())? +// .into_iter() +// .chain(new_authentication_nodes) +// .collect(); + +// Ok((partial_mmr.peaks(), new_authentication_nodes)) +// } + +// fn check_account_hashes( +// account_updates: &[(AccountId, Digest)], +// current_accounts: &[AccountStub], +// ) -> Result<(), ()> { +// for (remote_account_id, remote_account_hash) in account_updates { +// { +// if let Some(local_account) = +// current_accounts.iter().find(|acc| *remote_account_id == acc.id()) +// { +// if *remote_account_hash != local_account.hash() { +// return (); +// } +// } +// } +// } +// Ok(()) +// } + +// fn get_transactions_to_commit( +// uncommitted_transactions: &[TransactionRecord], +// note_ids: &[NoteId], +// nullifiers: &[Digest], +// account_hash_updates: &[(AccountId, Digest)], +// ) -> Vec { +// uncommitted_transactions +// .iter() +// .filter(|t| { +// // TODO: based on the discussion in +// // https://github.com/0xPolygonMiden/miden-client/issues/144, we should be aware +// // that in the future it'll be possible to have many transactions modifying an +// // account be included in a single block. If that happens, we'll need to rewrite +// // this check +// t.input_note_nullifiers.iter().all(|n| nullifiers.contains(n)) +// && t.output_notes.iter().all(|n| note_ids.contains(&n.id())) +// && account_hash_updates.iter().any(|(account_id, account_hash)| { +// *account_id == t.account_id && *account_hash == t.final_account_state +// }) +// }) +// .map(|t| t.id) +// .collect() +// } \ No newline at end of file diff --git a/wasm/src/web_client/mod.rs b/wasm/src/web_client/mod.rs index 481fcb8a4..a4833e8d7 100644 --- a/wasm/src/web_client/mod.rs +++ b/wasm/src/web_client/mod.rs @@ -1,6 +1,7 @@ pub mod account; pub mod notes; pub mod transactions; +pub mod sync; pub mod store; pub mod web_rpc_client; diff --git a/wasm/src/web_client/store/mod.rs b/wasm/src/web_client/store/mod.rs index 6fffaf23c..b21025c49 100644 --- a/wasm/src/web_client/store/mod.rs +++ b/wasm/src/web_client/store/mod.rs @@ -36,6 +36,44 @@ impl Store for WebStore { self.insert_string(data).await } + // async fn get_note_tags( + // &self + // ) -> Result, ()> { + // self.get_note_tags() + // } + + // async fn add_note_tag( + // &mut self, + // tag: u64, + // ) -> Result { + // self.add_note_tag(tag) + // } + + // async fn get_sync_height( + // &self + // ) -> Result { + // self.get_sync_height() + // } + + // async fn apply_state_sync( + // &mut self, + // block_header: BlockHeader, + // nullifiers: Vec, + // committed_notes: Vec<(NoteId, NoteInclusionProof)>, + // committed_transactions: &[TransactionId], + // new_mmr_peaks: MmrPeaks, + // new_authentication_nodes: &[(InOrderIndex, Digest)], + // ) -> Result<(), ()> { + // self.apply_state_sync( + // block_header, + // nullifiers, + // committed_notes, + // committed_transactions, + // new_mmr_peaks, + // new_authentication_nodes, + // ) + // } + // TRANSACTIONS // async fn get_transactions( // &mut self, diff --git a/wasm/src/web_client/store/sync/js_bindings.rs b/wasm/src/web_client/store/sync/js_bindings.rs new file mode 100644 index 000000000..7adb6b618 --- /dev/null +++ b/wasm/src/web_client/store/sync/js_bindings.rs @@ -0,0 +1,32 @@ +use wasm_bindgen::prelude::*; +use wasm_bindgen_futures::*; + +// Account IndexedDB Operations +#[wasm_bindgen(module = "/js/db/sync.js")] +extern "C" { + // GETS + // ================================================================================================ + + #[wasm_bindgen(js_name = getSyncHeight)] + pub fn idxdb_get_sync_height() -> js_sys::Promise; + + #[wasm_bindgen(js_name = getNoteTags)] + pub fn idxdb_get_note_tags() -> js_sys::Promise; + + // INSERTS + // ================================================================================================ + + #[wasm_bindgen(js_name = insertNoteTag)] + pub fn idxdb_add_note_tag( + tags: String + ) -> js_sys::Promise; + + #[wasm_bindgen(js_name = applyStateSync)] + pub fn idxdb_apply_state_sync( + block_num: String, + nullifiers: Vec, + note_ids: Vec, + inclusion_proofs: Vec, + transactions_to_commit: Vec, + ) -> js_sys::Promise; +} \ No newline at end of file diff --git a/wasm/src/web_client/store/sync/mod.rs b/wasm/src/web_client/store/sync/mod.rs new file mode 100644 index 000000000..661a5bc85 --- /dev/null +++ b/wasm/src/web_client/store/sync/mod.rs @@ -0,0 +1,102 @@ +// use wasm_bindgen_futures::*; +// use serde_wasm_bindgen::from_value; + +use super::WebStore; + +mod js_bindings; +// use js_bindings::*; + +mod models; +// use models::*; + +mod utils; +// use utils::*; + +impl WebStore { + pub(crate) async fn get_note_tags( + &self + ) -> Result, ()>{ + let promsie = idxdb_get_note_tags(); + let js_value = JsFuture::from(promsie).await?; + let tags_idxdb: NoteTagsIdxdbObject = from_value(js_value).unwrap(); + + let tags: Vec = serde_json::from_str(&tags_idxdb.tags).unwrap(); + + return tags; + } + + pub(super) async fn get_sync_height( + &self + ) -> Result { + let promise = idxdb_get_sync_height(); + let js_value = JsFuture::from(promise).await?; + let block_num_idxdb: SyncHeightIdxdbObject = from_value(js_value).unwrap(); + + let block_num_as_u32: u32 = block_num_idxdb.block_num.parse::().unwrap(); + return block_num_as_u32; + } + + pub(super) async fn add_note_tag( + &mut self, + tag: u64 + ) -> Result { + let mut tags = self.get_note_tags().await?; + if tags.contains(&tag) { + return Ok(false); + } + tags.push(tag); + let tags = serde_json::to_string(&tags)?; + + let promise = idxdb_add_note_tag(tags); + let _ = JsFuture::from(promise).await?; + return Ok(true); + } + + pub(super) async fn apply_state_sync( + &mut self, + block_header: BlockHeader, + nullifiers: Vec, + committed_notes: Vec<(NoteId, NoteInclusionProof)>, + committed_transactions: &[TransactionId], + new_mmr_peaks: MmrPeaks, + new_authentication_nodes: &[(InOrderIndex, Digest)], + ) -> Result<(), ()> { + let block_num_as_str = block_header.block_num().to_string(); + let nullifiers_as_str = nullifiers.iter().map(|nullifier| nullifier.to_hex()).collect(); + let note_ids_as_str: Vec = committed_notes.iter().map(|(note_id, _)| note_id.inner().to_hex()).collect(); + let inclusion_proofs_as_str: Vec = committed_notes.iter().map(|(_, inclusion_proof)| { + let block_num = inclusion_proof.origin().block_num; + let sub_hash = inclusion_proof.sub_hash(); + let note_root = inclusion_proof.note_root(); + let note_index = inclusion_proof.origin().node_index.value(); + + serde_json::to_string(&NoteInclusionProof::new( + block_num, + sub_hash, + note_root, + note_index, + inclusion_proof.note_path().clone(), + )).unwrap() + }).collect(); + let transactions_to_commit_as_str: Vec = committed_transactions.iter().map(|tx_id| tx_id.inner().into()).collect(); + + let promise = idxdb_apply_state_sync( + block_num_as_str, + nullifiers_as_str, + note_ids_as_str, + inclusion_proofs_as_str, + transactions_to_commit_as_str, + // new_mmr_peaks, + // new_authentication_nodes, + ); + let _ = JsFuture::from(promise).await?; + + // TODO: HANDLE THESE INSERTS IN JS + // let block_has_relevant_notes = !committed_notes.is_empty(); + // Self::insert_block_header_tx(&tx, block_header, new_mmr_peaks, block_has_relevant_notes)?; + + // Self::insert_chain_mmr_nodes(&tx, new_authentication_nodes)?; + + Ok(()) + } +} \ No newline at end of file diff --git a/wasm/src/web_client/store/sync/models.rs b/wasm/src/web_client/store/sync/models.rs new file mode 100644 index 000000000..4bfdbd09b --- /dev/null +++ b/wasm/src/web_client/store/sync/models.rs @@ -0,0 +1,11 @@ +use serde::{Deserialize, Serialize}; + +#[derive(Serialize, Deserialize)] +pub struct SyncHeightIdxdbObject { + pub block_num: String +} + +#[derive(Serialize, Deserialize)] +pub struct NoteTagsIdxdbObject { + pub tags: String +} \ No newline at end of file diff --git a/wasm/src/web_client/store/sync/utils.rs b/wasm/src/web_client/store/sync/utils.rs new file mode 100644 index 000000000..e69de29bb diff --git a/wasm/src/web_client/sync.rs b/wasm/src/web_client/sync.rs new file mode 100644 index 000000000..fc111459c --- /dev/null +++ b/wasm/src/web_client/sync.rs @@ -0,0 +1,20 @@ +use wasm_bindgen::prelude::*; + +use super::WebClient; + +#[wasm_bindgen] +impl WebClient { + pub async fn sync_state( + &mut self + ) -> () { + if let Some(ref mut client) = self.get_mut_inner() { + let message = client.sync_state().await; + let js_value_message = JsValue::from_str(&message); + + // Print the message to the Chrome console + web_sys::console::log_1(&js_value_message); + } else { + web_sys::console::error_1(&"Client not initialized".into()); + } + } +} \ No newline at end of file diff --git a/wasm/test.html b/wasm/test.html index c0ca9c096..341c3c0ac 100644 --- a/wasm/test.html +++ b/wasm/test.html @@ -141,8 +141,19 @@ } } + async function testSyncState(webClient) { + try { + await webClient.sync_state(); + + } catch (error) { + console.error('Failed to call sync state:', error); + + } + } + let webClient = await testCreateClient(); await testStoreAndRpc(webClient); + await testNewAccount(webClient); await testGetAccounts(webClient); await testGetAccount(webClient); @@ -155,6 +166,8 @@ await testGetTransactions(webClient); await testNewTransaction(webClient); + + await testSyncState(webClient); \ No newline at end of file From 71bcf914904f52788ffd5e39eea63017b6e02e16 Mon Sep 17 00:00:00 2001 From: Dennis Garcia Date: Wed, 17 Apr 2024 17:50:40 -0500 Subject: [PATCH 10/42] Finished Adding Skeleton Code for Chain Data (#9) --- wasm/js/db/chainData.js | 82 ++++++++ wasm/js/db/schema.js | 8 + wasm/js/db/sync.js | 62 +++++- wasm/src/native_code/chain_data.rs | 16 ++ wasm/src/native_code/mod.rs | 1 + wasm/src/native_code/store/mod.rs | 48 +++++ .../store/chain_data/js_bindings.rs | 41 ++++ wasm/src/web_client/store/chain_data/mod.rs | 141 +++++++++++++ .../src/web_client/store/chain_data/models.rs | 20 ++ wasm/src/web_client/store/chain_data/utils.rs | 15 ++ wasm/src/web_client/store/mod.rs | 60 +++++- wasm/src/web_client/store/sync/js_bindings.rs | 5 + wasm/src/web_client/store/sync/mod.rs | 186 +++++++++--------- 13 files changed, 581 insertions(+), 104 deletions(-) create mode 100644 wasm/js/db/chainData.js create mode 100644 wasm/src/native_code/chain_data.rs create mode 100644 wasm/src/web_client/store/chain_data/js_bindings.rs create mode 100644 wasm/src/web_client/store/chain_data/mod.rs create mode 100644 wasm/src/web_client/store/chain_data/models.rs create mode 100644 wasm/src/web_client/store/chain_data/utils.rs diff --git a/wasm/js/db/chainData.js b/wasm/js/db/chainData.js new file mode 100644 index 000000000..7e2b19935 --- /dev/null +++ b/wasm/js/db/chainData.js @@ -0,0 +1,82 @@ +import { + blockHeaders, + chainMmrNodes +} from './schema.js' + +// INSERT FUNCTIONS +export async function insertBlockHeader( + blockNum, + header, + chainMmrPeaks, + hasClientNotes +) { + try { + const data = { + blockNum: blockNum, + header: header, + chainMmrPeaks: chainMmrPeaks, + hasClientNotes: hasClientNotes + }; + + await blockHeaders.add(data); + return `Block header for block ${blockNum} inserted successfully.` + } catch (err) { + console.error("Failed to insert block header: ", err); + throw error; + } +} + +export async function getBlockHeaders( + blockNumbers +) { + try { + const blockHeaderPromises = blockNumbers.map(blockNum => + blockHeaders.get(blockNum) + ); + + const results = await Promise.all(blockHeaderPromises); + return results + } catch (err) { + console.error("Failed to get block headers: ", err); + throw error; + } +} + +export async function getTrackedBlockHeaders() { + try { + // Fetch all records matching the given root + const allMatchingRecords = await blockHeaders + .where('hasClientNotes') + .equals(true) + .toArray(); + } catch (error) { + console.error("Failed to get tracked block headers: ", err); + throw error; + } +} + +export async function getChainMmrNodesAll() { + try { + const chainMmrNodesAll = await chainMmrNodes.toArray(); + return chainMmrNodesAll; + } catch (err) { + console.error("Failed to get chain mmr nodes: ", err); + throw error; + } +} + +export async function getChainMmrNodes( + ids +) { + try { + const chainMmrNodesPromises = ids.map(id => + chainMmrNodes.get(id) + ); + + const results = await Promise.all(chainMmrNodesPromises); + return results; + } catch (err) { + console.error("Failed to get chain mmr nodes: ", err); + throw error; + } +} \ No newline at end of file diff --git a/wasm/js/db/schema.js b/wasm/js/db/schema.js index 227513aaa..a5eedac75 100644 --- a/wasm/js/db/schema.js +++ b/wasm/js/db/schema.js @@ -25,6 +25,8 @@ const Table = { InputNotes: 'inputNotes', OutputNotes: 'outputNotes', StateSync: 'stateSync', + BlockHeaders: 'blockHeaders', + ChainMmrNodes: 'chainMmrNodes', Greet: 'greets', }; @@ -40,6 +42,8 @@ db.version(1).stores({ [Table.InputNotes]: indexes('noteId', 'recipient', 'status'), [Table.OutputNotes]: indexes('noteId', 'recipient', 'status'), [Table.StateSync]: indexes('id'), + [Table.BlockHeaders]: indexes('blockNum'), + [Table.ChainMmrNodes]: indexes('blockNum', 'hasClientNotes'), [Table.Greet]: '++id', }); @@ -62,6 +66,8 @@ const transactionScripts = db.table(Table.TransactionScripts); const inputNotes = db.table(Table.InputNotes); const outputNotes = db.table(Table.OutputNotes); const stateSync = db.table(Table.StateSync); +const blockHeaders = db.table(Table.BlockHeaders); +const chainMmrNodes = db.table(Table.ChainMmrNodes); const greets = db.table(Table.Greet); export { @@ -76,5 +82,7 @@ export { inputNotes, outputNotes, stateSync, + blockHeaders, + chainMmrNodes, greets, }; diff --git a/wasm/js/db/sync.js b/wasm/js/db/sync.js index 943723efa..e790a183e 100644 --- a/wasm/js/db/sync.js +++ b/wasm/js/db/sync.js @@ -3,7 +3,8 @@ import { stateSync, inputNotes, outputNotes, - transactions + transactions, + blockHeaders, } from './schema.js'; export async function getNoteTags() { @@ -51,16 +52,22 @@ export async function addNoteTag( export async function applyStateSync( blockNum, + blockHeader, + chainMmrPeaks, nullifiers, noteIds, inclusionProofs, - transactionIds + transactionIds, + nodeIndices, + nodes, + hasClientNotes ) { - return db.transaction('rw', stateSync, inputNotes, outputNotes, transactions, async (tx) => { + return db.transaction('rw', stateSync, inputNotes, outputNotes, transactions, blockHeaders, async (tx) => { await updateSyncHeight(tx, blockNum); await updateSpentNotes(tx, nullifiers); await updateCommittedNotes(tx, noteIds, inclusionProofs); await updateCommittedTransactions(tx, blockNum, transactionIds); + await updateBlockHeader(tx, blockNum, blockHeader, chainMmrPeaks, hasClientNotes); }); } @@ -168,4 +175,53 @@ async function updateCommittedTransactions( console.error("Failed to mark transactions as committed: ", err); throw err; } +} + +async function updateBlockHeader( + tx, + blockNum, + blockHeader, + chainMmrPeaks, + hasClientNotes +) { + try { + const data = { + blockNum: blockNum, + header: blockHeader, + chainMmrPeaks: chainMmrPeaks, + hasClientNotes: hasClientNotes + }; + + await tx.blockHeaders.add(data); + return `Block header for block ${blockNum} inserted successfully.` + } catch (err) { + console.error("Failed to insert block header: ", err); + throw error; + } +} + +async function updateChainMmrNodes( + tx, + nodeIndices, + nodes +) { + try { + // Check if the arrays are not of the same length + if (nodeIndices.length !== nodes.length) { + throw new Error("nodeIndices and nodes arrays must be of the same length"); + } + + // Create the updates array with objects matching the structure expected by your IndexedDB schema + const updates = nodeIndices.map((index, i) => ({ + index: index, // Assuming 'index' is the primary key or part of it + node: nodes[i] // Other attributes of the object + })); + + // Perform bulk update or insertion; assumes tx.chainMmrNodes is a valid table reference in a transaction + await tx.chainMmrNodes.bulkPut(updates); + return "Successfully updated chain MMR nodes"; + } catch (err) { + console.error("Failed to update chain mmr nodes: ", err); + throw error; + } } \ No newline at end of file diff --git a/wasm/src/native_code/chain_data.rs b/wasm/src/native_code/chain_data.rs new file mode 100644 index 000000000..7c603e9ec --- /dev/null +++ b/wasm/src/native_code/chain_data.rs @@ -0,0 +1,16 @@ +use super::{ + rpc::NodeRpcClient, + Client, + store::Store // TODO: Add AuthInfo +}; + +impl Client { + pub async fn get_block_headers( + &self, + block_numbers: &[u32], + ) -> String { // TODO: Replace with Result, ()> + //self.store.get_block_headers(block_numbers).map_err(|err| ()) + + "Called get_block_headers".to_string() + } +} \ No newline at end of file diff --git a/wasm/src/native_code/mod.rs b/wasm/src/native_code/mod.rs index dccd30751..d9a899ed8 100644 --- a/wasm/src/native_code/mod.rs +++ b/wasm/src/native_code/mod.rs @@ -2,6 +2,7 @@ pub mod accounts; pub mod notes; pub mod transactions; pub mod sync; +pub mod chain_data; pub mod utils; pub mod store; diff --git a/wasm/src/native_code/store/mod.rs b/wasm/src/native_code/store/mod.rs index 79f348b39..a698040f3 100644 --- a/wasm/src/native_code/store/mod.rs +++ b/wasm/src/native_code/store/mod.rs @@ -22,6 +22,47 @@ pub trait Store { data: String ) -> Result<(), ()>; + // CHAIN DATA + // -------------------------------------------------------------------------------------------- + + // async fn get_block_headers( + // &self, + // block_numbers: &[u32], + // ) -> Result, ()>; + + // // TODO + // fn get_block_header_by_num( + // &self, + // block_number: u32, + // ) -> Result<(BlockHeader, bool), StoreError> { + // self.get_block_headers(&[block_number]) + // .map(|block_headers_list| block_headers_list.first().cloned()) + // .and_then(|block_header| { + // block_header.ok_or(StoreError::BlockHeaderNotFound(block_number)) + // }) + // } + + // async fn get_tracked_block_headers( + // &self + // ) -> Result, ()>; + + // async fn get_chain_mmr_nodes( + // &self, + // filter: ChainMmrNodeFilter, + // ) -> Result, ()>; + + // async fn get_chain_mmr_peaks_by_block_num( + // &self, + // block_num: u32 + // ) -> Result; + + // async fn insert_block_header( + // &self, + // block_header: BlockHeader, + // chain_mmr_peaks: MmrPeaks, + // has_client_notes: bool, + // ) -> Result<(), ()>; + // SYNC // -------------------------------------------------------------------------------------------- @@ -169,6 +210,13 @@ pub trait Store { // } // } +// pub enum ChainMmrNodeFilter<'a> { +// /// Return all nodes. +// All, +// /// Filter by the specified in-order indices. +// List(&'a [InOrderIndex]), +// } + pub enum NativeTransactionFilter { /// Return all transactions. All, diff --git a/wasm/src/web_client/store/chain_data/js_bindings.rs b/wasm/src/web_client/store/chain_data/js_bindings.rs new file mode 100644 index 000000000..c599914c2 --- /dev/null +++ b/wasm/src/web_client/store/chain_data/js_bindings.rs @@ -0,0 +1,41 @@ +use wasm_bindgen::prelude::*; +use wasm_bindgen_futures::*; + +// Account IndexedDB Operations +#[wasm_bindgen(module = "/js/db/chainData.js")] +extern "C" { + // GETS + // ================================================================================================ + + #[wasm_bindgen(js_name = getBlockHeaders)] + pub fn idxdb_get_block_headers( + block_numbers: Vec + ) -> js_sys::Promise; + + #[wasm_bindgen(js_name = getTrackedBlockHeaders)] + pub fn idxdb_get_tracked_block_headers() -> js_sys::Promise; + + #[wasm_bindgen(js_name = getChainMmrNodesAll)] + pub fn idxdb_get_chain_mmr_nodes_all() -> js_sys::Promise; + + #[wasm_bindgen(js_name = getChainMmrNodes)] + pub fn idxdb_get_chain_mmr_nodes( + ids: Vec + ) -> js_sys::Promise; + + #[wasm_bindgen(js_name = getChainMmrPeaksByBlockNum)] + pub fn idxdb_get_chain_mmr_peaks_by_block_num( + block_num: String + ) -> js_sys::Promise; + + // INSERTS + // ================================================================================================ + + #[wasm_bindgen(js_name = insertBlockHeader)] + pub fn idxdb_insert_block_header( + block_num: String, + header: String, + chain_mmr_peaks: String, + has_client_notes: bool + ) -> js_sys::Promise; +} \ No newline at end of file diff --git a/wasm/src/web_client/store/chain_data/mod.rs b/wasm/src/web_client/store/chain_data/mod.rs new file mode 100644 index 000000000..e609d3f5c --- /dev/null +++ b/wasm/src/web_client/store/chain_data/mod.rs @@ -0,0 +1,141 @@ +// use wasm_bindgen_futures::JsFuture; +// use serde_wasm_bindgen::from_value; + +// use crate::native_code::store::ChainMmrNodeFilter; + +use super::WebStore; + +// mod js_bindings; +// use js_bindings::*; + +// mod models; +// use models::*; + +// mod utils; +// use utils::*; + +impl WebStore { + // pub(crate) async fn insert_block_header( + // &self, + // block_header: BlockHeader, + // chain_mmr_peaks: MmrPeaks, + // has_client_notes: bool + // ) -> Result<(), ()> { + // let chain_mmr_peaks = chain_mmr_peaks.peaks().to_vec(); + // let (block_num, header, chain_mmr, has_client_notes) = + // serialize_block_header(block_header, chain_mmr_peaks, has_client_notes)?; + + // let promise = idxdb_insert_block_header( + // block_num, + // header, + // chain_mmr, + // has_client_notes + // ); + // let js_value = JsFuture::from(promise).await; + + // Ok(()) + // } + + // pub(crate) async fn get_block_headers( + // &self, + // block_numbers: &[u32], + // ) -> Result, ()> { + // let formatted_block_numbers_list: Vec = block_numbers + // .iter() + // .map(|block_number| (*block_number as i64).to_string()) + // .collect(); + + // let promise = idxdb_get_block_headers(formatted_block_numbers_list); + // let js_value = JsFuture::from(promise).await?; + // let block_headers_idxdb: Vec = from_value(js_value).unwrap(); + + // let results:Result, ()> = block_headers_idxdb.into_iter().map(|record| { + // let block_header = serde_json::from_str(&record.header).unwrap(); + // let has_client_notes = record.has_client_notes; + + // Ok((block_header, has_client_notes)) + // }).collect(); + + // return results; + // } + + // pub(crate) async fn get_tracked_block_headers( + // &self + // ) -> Result, ()> { + // let promise = idxdb_get_tracked_block_headers(); + // let js_value = JsFuture::from(promise).await?; + // let block_headers_idxdb: Vec = from_value(js_value).unwrap(); + + // let results:Result, ()> = block_headers_idxdb.into_iter().map(|record| { + // let block_header = serde_json::from_str(&record.header).unwrap(); + // let has_client_notes = record.has_client_notes; + + // Ok((block_header, has_client_notes)) + // }).collect(); + + // return results; + // } + + // pub(crate) async fn get_chain_mmr_nodes( + // &self, + // filter: ChainMmrNodeFilter, + // ) -> Result, ()> { + // match filter { + // ChainMmrNodeFilter::All => { + // let promise = idxdb_get_chain_mmr_nodes_all(); + // let js_value = JsFuture::from(promise).await?; + // let chain_mmr_nodes_idxdb: Vec = from_value(js_value).unwrap(); + + // let results:Result, ()> = chain_mmr_nodes_idxdb.into_iter().map(|record| { + // let id_as_u64: u64 = record.id.parse::().unwrap(); + // let id = InOrderIndex::new(NonZeroUsize::new(id_as_u64 as usize).unwrap()); + // let node: Digest = + // serde_json::from_str(&record.node).map_err(|err| ())?; + // Ok((id, node)) + // }).collect(); + + // return results; + // }, + // ChainMmrNodeFilter::List(ids) => { + // let formatted_list: Vec = ids + // .iter() + // .map(|id| (Into::::into(*id)).to_string()) + // .collect(); + + // let promise = idxdb_get_chain_mmr_nodes(ids); + // let js_value = JsFuture::from(promise).await?; + // let chain_mmr_nodes_idxdb: Vec = from_value(js_value).unwrap(); + + // let results:Result, ()> = chain_mmr_nodes_idxdb.into_iter().map(|record| { + // let id_as_u64: u64 = record.id.parse::().unwrap(); + // let id = InOrderIndex::new(NonZeroUsize::new(id_as_u64 as usize).unwrap()); + // let node: Digest = + // serde_json::from_str(&record.node).map_err(|err| ())?; + // Ok((id, node)) + // }).collect(); + + // return results; + // } + // } + // } + + // pub(crate) async fn get_chain_mmr_peaks_by_block_num( + // &self, + // block_num: u32, + // ) -> Result { + // let block_num_as_str = block_num.to_string(); + + // let promise = idxdb_get_chain_mmr_peaks_by_block_num(block_num_as_str); + // let js_value = JsFuture::from(promise).await?; + // let mmr_peaks_idxdb: MmrPeaksIdxdbObject = from_value(js_value).unwrap(); + + // if let Some(peaks) = mmr_peaks_idxdb.peaks { + // let mmr_peaks_nodes: Vec = + // serde_json::from_str(&peaks).map_err(|err| ())?; + + // return MmrPeaks::new(block_num as usize, mmr_peaks_nodes).map_err(|err| ()) + // } + + // return Ok(MmrPeaks::new(0, vec![])?); + // } +} \ No newline at end of file diff --git a/wasm/src/web_client/store/chain_data/models.rs b/wasm/src/web_client/store/chain_data/models.rs new file mode 100644 index 000000000..e8130f6e3 --- /dev/null +++ b/wasm/src/web_client/store/chain_data/models.rs @@ -0,0 +1,20 @@ +use serde::{Deserialize, Serialize}; + +#[derive(Serialize, Deserialize)] +pub struct BlockHeaderIdxdbObject { + pub block_num: String, + pub header: String, + pub chain_mmr: String, + pub has_client_notes: bool +} + +#[derive(Serialize, Deserialize)] +pub struct ChainMmrNodeIdxdbObject { + pub id: String, + pub node: String +} + +#[derive(Serialize, Deserialize)] +pub struct MmrPeaksIdxdbObject { + pub peaks: Option +} \ No newline at end of file diff --git a/wasm/src/web_client/store/chain_data/utils.rs b/wasm/src/web_client/store/chain_data/utils.rs new file mode 100644 index 000000000..f0f4e9fe2 --- /dev/null +++ b/wasm/src/web_client/store/chain_data/utils.rs @@ -0,0 +1,15 @@ +// type SerializedBlockHeaderData = (String, String, String, bool); + +// pub fn serialize_block_header( +// block_header: BlockHeader, +// chain_mmr_peaks: Vec, +// has_client_notes: bool, +// ) -> Result { +// let block_num = block_header.block_num().to_string(); +// let header = +// serde_json::to_string(&block_header).map_err(|err| ())?; +// let chain_mmr_peaks = +// serde_json::to_string(&chain_mmr_peaks).map_err(|err| ())?; + +// Ok((block_num, header, chain_mmr_peaks, has_client_notes)) +// } \ No newline at end of file diff --git a/wasm/src/web_client/store/mod.rs b/wasm/src/web_client/store/mod.rs index b21025c49..a658e6833 100644 --- a/wasm/src/web_client/store/mod.rs +++ b/wasm/src/web_client/store/mod.rs @@ -8,6 +8,8 @@ use async_trait::async_trait; pub mod accounts; pub mod notes; pub mod transactions; +pub mod sync; +pub mod chain_data; pub mod mock_example; // Initialize IndexedDB @@ -36,23 +38,61 @@ impl Store for WebStore { self.insert_string(data).await } + // CHAIN DATA + // async fn get_block_headers( + // &self, + // block_numbers: &[u32], + // ) -> Result, ()> { + // self.get_block_headers(block_numbers).await + // } + + // async fn insert_block_header( + // &self, + // block_header: BlockHeader, + // chain_mmr_peaks: MmrPeaks, + // has_client_notes: bool, + // ) -> Result<(), ()> { + // self.insert_block_header(block_header, chain_mmr_peaks, has_client_notes).await + // } + + // async fn get_tracked_block_headers( + // &self + // ) -> Result, ()> { + // self.get_tracked_block_headers().await + // } + + // async fn get_chain_mmr_nodes( + // &self, + // filter: ChainMmrNodeFilter, + // ) -> Result, ()> { + // self.get_chain_mmr_nodes(filter).await + // } + + // async fn get_chain_mmr_peaks_by_block_num( + // &self, + // block_num: u32 + // ) -> Result { + // self.get_chain_mmr_peaks_by_block_num(block_num).await + // } + + // SYNC // async fn get_note_tags( // &self // ) -> Result, ()> { - // self.get_note_tags() + // self.get_note_tags().await // } // async fn add_note_tag( // &mut self, // tag: u64, // ) -> Result { - // self.add_note_tag(tag) + // self.add_note_tag(tag).await // } // async fn get_sync_height( // &self // ) -> Result { - // self.get_sync_height() + // self.get_sync_height().await // } // async fn apply_state_sync( @@ -71,7 +111,7 @@ impl Store for WebStore { // committed_transactions, // new_mmr_peaks, // new_authentication_nodes, - // ) + // ).await // } // TRANSACTIONS @@ -96,36 +136,36 @@ impl Store for WebStore { // account_seed: Option, // auth_info: &AuthInfo, // ) -> Result<(), ()> { - // self.insert_account(account, account_seed, auth_info) + // self.insert_account(account, account_seed, auth_info).await // } // async fn get_account_ids(&self) -> Result, ()> { - // self.get_account_ids() + // self.get_account_ids().await // } // async fn get_account_stubs(&self) -> Result)>, ()> { - // self.get_account_stubs() + // self.get_account_stubs().await // } // async fn get_account_stub( // &self, // account_id: AccountId, // ) -> Result<(AccountStub, Option), ()> { - // self.get_account_stub(account_id) + // self.get_account_stub(account_id).await // } // async fn get_account( // &self, // account_id: AccountId, // ) -> Result<(Account, Option), ()> { - // self.get_account(account_id) + // self.get_account(account_id).await // } // async fn get_account_auth( // &self, // account_id: AccountId, // ) -> Result { - // self.get_account_auth(account_id) + // self.get_account_auth(account_id).await // } // NOTES diff --git a/wasm/src/web_client/store/sync/js_bindings.rs b/wasm/src/web_client/store/sync/js_bindings.rs index 7adb6b618..a999dabd3 100644 --- a/wasm/src/web_client/store/sync/js_bindings.rs +++ b/wasm/src/web_client/store/sync/js_bindings.rs @@ -24,9 +24,14 @@ extern "C" { #[wasm_bindgen(js_name = applyStateSync)] pub fn idxdb_apply_state_sync( block_num: String, + block_header: String, + chain_mmr_peaks: String, nullifiers: Vec, note_ids: Vec, inclusion_proofs: Vec, transactions_to_commit: Vec, + node_indices_as_str: Vec, + nodes_as_str: Vec, + has_client_notes: bool ) -> js_sys::Promise; } \ No newline at end of file diff --git a/wasm/src/web_client/store/sync/mod.rs b/wasm/src/web_client/store/sync/mod.rs index 661a5bc85..e87d75194 100644 --- a/wasm/src/web_client/store/sync/mod.rs +++ b/wasm/src/web_client/store/sync/mod.rs @@ -1,102 +1,106 @@ -// use wasm_bindgen_futures::*; -// use serde_wasm_bindgen::from_value; +use wasm_bindgen_futures::*; +use serde_wasm_bindgen::from_value; use super::WebStore; mod js_bindings; -// use js_bindings::*; +use js_bindings::*; mod models; -// use models::*; +use models::*; mod utils; -// use utils::*; +use utils::*; impl WebStore { - pub(crate) async fn get_note_tags( - &self - ) -> Result, ()>{ - let promsie = idxdb_get_note_tags(); - let js_value = JsFuture::from(promsie).await?; - let tags_idxdb: NoteTagsIdxdbObject = from_value(js_value).unwrap(); - - let tags: Vec = serde_json::from_str(&tags_idxdb.tags).unwrap(); - - return tags; - } - - pub(super) async fn get_sync_height( - &self - ) -> Result { - let promise = idxdb_get_sync_height(); - let js_value = JsFuture::from(promise).await?; - let block_num_idxdb: SyncHeightIdxdbObject = from_value(js_value).unwrap(); - - let block_num_as_u32: u32 = block_num_idxdb.block_num.parse::().unwrap(); - return block_num_as_u32; - } - - pub(super) async fn add_note_tag( - &mut self, - tag: u64 - ) -> Result { - let mut tags = self.get_note_tags().await?; - if tags.contains(&tag) { - return Ok(false); - } - tags.push(tag); - let tags = serde_json::to_string(&tags)?; - - let promise = idxdb_add_note_tag(tags); - let _ = JsFuture::from(promise).await?; - return Ok(true); - } - - pub(super) async fn apply_state_sync( - &mut self, - block_header: BlockHeader, - nullifiers: Vec, - committed_notes: Vec<(NoteId, NoteInclusionProof)>, - committed_transactions: &[TransactionId], - new_mmr_peaks: MmrPeaks, - new_authentication_nodes: &[(InOrderIndex, Digest)], - ) -> Result<(), ()> { - let block_num_as_str = block_header.block_num().to_string(); - let nullifiers_as_str = nullifiers.iter().map(|nullifier| nullifier.to_hex()).collect(); - let note_ids_as_str: Vec = committed_notes.iter().map(|(note_id, _)| note_id.inner().to_hex()).collect(); - let inclusion_proofs_as_str: Vec = committed_notes.iter().map(|(_, inclusion_proof)| { - let block_num = inclusion_proof.origin().block_num; - let sub_hash = inclusion_proof.sub_hash(); - let note_root = inclusion_proof.note_root(); - let note_index = inclusion_proof.origin().node_index.value(); - - serde_json::to_string(&NoteInclusionProof::new( - block_num, - sub_hash, - note_root, - note_index, - inclusion_proof.note_path().clone(), - )).unwrap() - }).collect(); - let transactions_to_commit_as_str: Vec = committed_transactions.iter().map(|tx_id| tx_id.inner().into()).collect(); - - let promise = idxdb_apply_state_sync( - block_num_as_str, - nullifiers_as_str, - note_ids_as_str, - inclusion_proofs_as_str, - transactions_to_commit_as_str, - // new_mmr_peaks, - // new_authentication_nodes, - ); - let _ = JsFuture::from(promise).await?; - - // TODO: HANDLE THESE INSERTS IN JS - // let block_has_relevant_notes = !committed_notes.is_empty(); - // Self::insert_block_header_tx(&tx, block_header, new_mmr_peaks, block_has_relevant_notes)?; - - // Self::insert_chain_mmr_nodes(&tx, new_authentication_nodes)?; - - Ok(()) - } + // pub(crate) async fn get_note_tags( + // &self + // ) -> Result, ()>{ + // let promsie = idxdb_get_note_tags(); + // let js_value = JsFuture::from(promsie).await?; + // let tags_idxdb: NoteTagsIdxdbObject = from_value(js_value).unwrap(); + + // let tags: Vec = serde_json::from_str(&tags_idxdb.tags).unwrap(); + + // return Ok(tags); + // } + + // pub(super) async fn get_sync_height( + // &self + // ) -> Result { + // let promise = idxdb_get_sync_height(); + // let js_value = JsFuture::from(promise).await?; + // let block_num_idxdb: SyncHeightIdxdbObject = from_value(js_value).unwrap(); + + // let block_num_as_u32: u32 = block_num_idxdb.block_num.parse::().unwrap(); + // return Ok(block_num_as_u32); + // } + + // pub(super) async fn add_note_tag( + // &mut self, + // tag: u64 + // ) -> Result { + // let mut tags = self.get_note_tags().await?; + // if tags.contains(&tag) { + // return Ok(false); + // } + // tags.push(tag); + // let tags = serde_json::to_string(&tags)?; + + // let promise = idxdb_add_note_tag(tags); + // let _ = JsFuture::from(promise).await?; + // return Ok(true); + // } + + // pub(super) async fn apply_state_sync( + // &mut self, + // block_header: BlockHeader, + // nullifiers: Vec, + // committed_notes: Vec<(NoteId, NoteInclusionProof)>, + // committed_transactions: &[TransactionId], + // new_mmr_peaks: MmrPeaks, + // new_authentication_nodes: &[(InOrderIndex, Digest)], + // ) -> Result<(), ()> { + // let block_header_as_str = serde_json::to_string(&block_header).map_err(|err| ())?; + // let block_num_as_str = block_header.block_num().to_string(); + // let nullifiers_as_str = nullifiers.iter().map(|nullifier| nullifier.to_hex()).collect(); + // let note_ids_as_str: Vec = committed_notes.iter().map(|(note_id, _)| note_id.inner().to_hex()).collect(); + // let inclusion_proofs_as_str: Vec = committed_notes.iter().map(|(_, inclusion_proof)| { + // let block_num = inclusion_proof.origin().block_num; + // let sub_hash = inclusion_proof.sub_hash(); + // let note_root = inclusion_proof.note_root(); + // let note_index = inclusion_proof.origin().node_index.value(); + + // serde_json::to_string(&NoteInclusionProof::new( + // block_num, + // sub_hash, + // note_root, + // note_index, + // inclusion_proof.note_path().clone(), + // )).unwrap() + // }).collect(); + // let transactions_to_commit_as_str: Vec = committed_transactions.iter().map(|tx_id| tx_id.inner().into()).collect(); + // let new_mmr_peaks_as_str = serde_json::to_string(&new_mmr_peaks.peaks().to_vec()).map_err(|err| ())?; + // let block_has_relevant_notes = !committed_notes.is_empty(); + // let (indices, digests): (Vec, Vec) = new_authentication_nodes.iter().cloned().unzip(); + // let indices: Vec = indices.iter().map(|index| index.into()).collect(); + // let node_indices_as_str: Vec = indices.iter().map(|index| index.to_string()).collect(); + // let nodes_as_str: Vec = digests.iter().map(|digest| serde_json::to_string(&digest).map_err(|err| ())).collect(); + + // let promise = idxdb_apply_state_sync( + // block_num_as_str, + // block_header_as_str, + // new_mmr_peaks_as_str, + // nullifiers_as_str, + // note_ids_as_str, + // inclusion_proofs_as_str, + // transactions_to_commit_as_str, + // node_indices_as_str, + // nodes_as_str, + // block_has_relevant_notes, + // ); + // let _ = JsFuture::from(promise).await; + + // Ok(()) + // } } \ No newline at end of file From 7e6e02b83d8cb50bfda1691538e0d42fb6996545 Mon Sep 17 00:00:00 2001 From: JohnDonavon Date: Fri, 19 Apr 2024 13:31:13 -0700 Subject: [PATCH 11/42] Website updates --- wasm/src/lib.rs | 37 +- website/next.config.mjs | 1 + website/package.json | 4 +- website/src/app/greet/page.tsx | 20 + website/src/app/notes/page.tsx | 23 +- website/src/components/hooks/useWasm.ts | 2 +- website/src/components/sidebar.tsx | 5 + website/yarn.lock | 2761 ----------------------- 8 files changed, 42 insertions(+), 2811 deletions(-) create mode 100644 website/src/app/greet/page.tsx delete mode 100644 website/yarn.lock diff --git a/wasm/src/lib.rs b/wasm/src/lib.rs index a483c1a95..251e05ab3 100644 --- a/wasm/src/lib.rs +++ b/wasm/src/lib.rs @@ -5,48 +5,17 @@ use wasm_bindgen::prelude::*; use wasm_bindgen_futures::*; use web_sys::console; -pub trait MyTrait { - fn do_something(&self); -} - #[wasm_bindgen] extern "C" { - pub type JsImplementor; - - #[wasm_bindgen(method)] - fn do_something(this: &JsImplementor); -} - - -#[wasm_bindgen] -pub struct MyTraitImplementor { - js_implementor: JsImplementor, -} - -#[wasm_bindgen] -impl MyTraitImplementor { - pub fn new(js_implementor: JsImplementor) -> Self { - Self { js_implementor } - } -} - -impl MyTrait for MyTraitImplementor { - fn do_something(&self) { - self.js_implementor.do_something(); - } + fn alert(s: &str); } #[wasm_bindgen] pub fn greet() { - unsafe { alert("Hello, World!") }; + unsafe { alert("Hello world from WASM!") }; } #[wasm_bindgen] pub fn greet2() { - unsafe { console::log_1(&"Hello, World!".into()) }; -} - -#[wasm_bindgen] -extern "C" { - fn alert(s: &str); + unsafe { console::log_1(&"Hello from WASM!".into()) }; } \ No newline at end of file diff --git a/website/next.config.mjs b/website/next.config.mjs index 38f7a2a12..c9c822122 100644 --- a/website/next.config.mjs +++ b/website/next.config.mjs @@ -7,6 +7,7 @@ const nextConfig = { asyncWebAssembly: true, syncWebAssembly: true, topLevelAwait: true, + layers: true, } } return config; diff --git a/website/package.json b/website/package.json index e5b614a1f..b9a8f8e32 100644 --- a/website/package.json +++ b/website/package.json @@ -3,14 +3,14 @@ "version": "0.1.0", "private": true, "scripts": { - "preinstall": "cd ../wasm && wasm-pack build --target web", + "preinstall": "rm -rf node_modules/wasm && rm yarn.lock && cd ../wasm && cargo clean && wasm-pack build --target web", "dev": "next dev", "build": "next build", "start": "next start", "lint": "next lint" }, "dependencies": { - "@wasm": "file:../wasm/pkg", + "wasm": "file:../wasm/pkg", "dexie": "^3.2.7", "dexie-react-hooks": "^1.1.7", "next": "14.1.4", diff --git a/website/src/app/greet/page.tsx b/website/src/app/greet/page.tsx new file mode 100644 index 000000000..93c73dfff --- /dev/null +++ b/website/src/app/greet/page.tsx @@ -0,0 +1,20 @@ +'use client' + +import init, { greet } from 'wasm'; + +export default function Greet() { + + async function greetFromWasm() { + await init(); + greet(); + } + + return ( +
+
+
This is the greeting page.
+ +
+
+ ) +} \ No newline at end of file diff --git a/website/src/app/notes/page.tsx b/website/src/app/notes/page.tsx index cfe72db5f..7d607c81a 100644 --- a/website/src/app/notes/page.tsx +++ b/website/src/app/notes/page.tsx @@ -1,21 +1,18 @@ - 'use client' -import { useWasm } from '@/components/hooks/useWasm'; -import init, * as wasm from '@wasm'; -init(); +import { useEffect } from 'react'; +import init, * as wasm from 'wasm'; export default function Notes() { - const wasm = useWasm(); - wasm?.greet2() + useEffect(() => { + async function greet2() { + await init(); + wasm.greet2(); + } + greet2(); + }) return ( -
This is the notes page.
+
This is the notes page
) -} - -class MyJSClass { - doSomething() { - console.log("This is a JS class method"); - } } \ No newline at end of file diff --git a/website/src/components/hooks/useWasm.ts b/website/src/components/hooks/useWasm.ts index 45d601064..de6f37891 100644 --- a/website/src/components/hooks/useWasm.ts +++ b/website/src/components/hooks/useWasm.ts @@ -5,7 +5,7 @@ export const useWasm = () => { useEffect(() => { if (wasm === null) { - import("@wasm").then((module) => { + import("wasm").then((module) => { module.default() return setWasm(module) }); diff --git a/website/src/components/sidebar.tsx b/website/src/components/sidebar.tsx index 9f168944f..742c606d1 100644 --- a/website/src/components/sidebar.tsx +++ b/website/src/components/sidebar.tsx @@ -2,6 +2,7 @@ import Link from "next/link"; const routes = { gettingStarted: '/', + greet: '/greet', accounts: '/accounts', notes: '/notes', transactions: '/transactions' @@ -12,6 +13,10 @@ const menuItems = [ name: 'Getting Started', href: routes.gettingStarted, }, + { + name: 'Greet', + href: routes.greet, + }, { name: 'Accounts', href: routes.accounts, diff --git a/website/yarn.lock b/website/yarn.lock deleted file mode 100644 index 14fafef43..000000000 --- a/website/yarn.lock +++ /dev/null @@ -1,2761 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@aashutoshrathi/word-wrap@^1.2.3": - version "1.2.6" - resolved "https://registry.yarnpkg.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz#bd9154aec9983f77b3a034ecaa015c2e4201f6cf" - integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== - -"@alloc/quick-lru@^5.2.0": - version "5.2.0" - resolved "https://registry.yarnpkg.com/@alloc/quick-lru/-/quick-lru-5.2.0.tgz#7bf68b20c0a350f936915fcae06f58e32007ce30" - integrity sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw== - -"@babel/runtime@^7.23.2": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.1.tgz#431f9a794d173b53720e69a6464abc6f0e2a5c57" - integrity sha512-+BIznRzyqBf+2wCTxcKE3wDjfGeCoVE61KSHGpkzqrLi8qxqFwBeUFyId2cxkTmm55fzDGnm0+yCxaxygrLUnQ== - dependencies: - regenerator-runtime "^0.14.0" - -"@eslint-community/eslint-utils@^4.2.0": - version "4.4.0" - resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" - integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== - dependencies: - eslint-visitor-keys "^3.3.0" - -"@eslint-community/regexpp@^4.6.1": - version "4.10.0" - resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.10.0.tgz#548f6de556857c8bb73bbee70c35dc82a2e74d63" - integrity sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA== - -"@eslint/eslintrc@^2.1.4": - version "2.1.4" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz#388a269f0f25c1b6adc317b5a2c55714894c70ad" - integrity sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ== - dependencies: - ajv "^6.12.4" - debug "^4.3.2" - espree "^9.6.0" - globals "^13.19.0" - ignore "^5.2.0" - import-fresh "^3.2.1" - js-yaml "^4.1.0" - minimatch "^3.1.2" - strip-json-comments "^3.1.1" - -"@eslint/js@8.57.0": - version "8.57.0" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.0.tgz#a5417ae8427873f1dd08b70b3574b453e67b5f7f" - integrity sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g== - -"@humanwhocodes/config-array@^0.11.14": - version "0.11.14" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.14.tgz#d78e481a039f7566ecc9660b4ea7fe6b1fec442b" - integrity sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg== - dependencies: - "@humanwhocodes/object-schema" "^2.0.2" - debug "^4.3.1" - minimatch "^3.0.5" - -"@humanwhocodes/module-importer@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" - integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== - -"@humanwhocodes/object-schema@^2.0.2": - version "2.0.2" - resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz#d9fae00a2d5cb40f92cfe64b47ad749fbc38f917" - integrity sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw== - -"@isaacs/cliui@^8.0.2": - version "8.0.2" - resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" - integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== - dependencies: - string-width "^5.1.2" - string-width-cjs "npm:string-width@^4.2.0" - strip-ansi "^7.0.1" - strip-ansi-cjs "npm:strip-ansi@^6.0.1" - wrap-ansi "^8.1.0" - wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" - -"@jridgewell/gen-mapping@^0.3.2": - version "0.3.5" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz#dcce6aff74bdf6dad1a95802b69b04a2fcb1fb36" - integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg== - dependencies: - "@jridgewell/set-array" "^1.2.1" - "@jridgewell/sourcemap-codec" "^1.4.10" - "@jridgewell/trace-mapping" "^0.3.24" - -"@jridgewell/resolve-uri@^3.1.0": - version "3.1.2" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" - integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== - -"@jridgewell/set-array@^1.2.1": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" - integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== - -"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": - version "1.4.15" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" - integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== - -"@jridgewell/trace-mapping@^0.3.24": - version "0.3.25" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" - integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== - dependencies: - "@jridgewell/resolve-uri" "^3.1.0" - "@jridgewell/sourcemap-codec" "^1.4.14" - -"@next/env@14.1.4": - version "14.1.4" - resolved "https://registry.yarnpkg.com/@next/env/-/env-14.1.4.tgz#432e80651733fbd67230bf262aee28be65252674" - integrity sha512-e7X7bbn3Z6DWnDi75UWn+REgAbLEqxI8Tq2pkFOFAMpWAWApz/YCUhtWMWn410h8Q2fYiYL7Yg5OlxMOCfFjJQ== - -"@next/eslint-plugin-next@14.1.4": - version "14.1.4" - resolved "https://registry.yarnpkg.com/@next/eslint-plugin-next/-/eslint-plugin-next-14.1.4.tgz#d7372b5ffede0e466af8af2ff534386418827fc8" - integrity sha512-n4zYNLSyCo0Ln5b7qxqQeQ34OZKXwgbdcx6kmkQbywr+0k6M3Vinft0T72R6CDAcDrne2IAgSud4uWCzFgc5HA== - dependencies: - glob "10.3.10" - -"@next/swc-darwin-arm64@14.1.4": - version "14.1.4" - resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.1.4.tgz#a3bca0dc4393ac4cf3169bbf24df63441de66bb7" - integrity sha512-ubmUkbmW65nIAOmoxT1IROZdmmJMmdYvXIe8211send9ZYJu+SqxSnJM4TrPj9wmL6g9Atvj0S/2cFmMSS99jg== - -"@next/swc-darwin-x64@14.1.4": - version "14.1.4" - resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-14.1.4.tgz#ba3683d4e2d30099f3f2864dd7349a4d9f440140" - integrity sha512-b0Xo1ELj3u7IkZWAKcJPJEhBop117U78l70nfoQGo4xUSvv0PJSTaV4U9xQBLvZlnjsYkc8RwQN1HoH/oQmLlQ== - -"@next/swc-linux-arm64-gnu@14.1.4": - version "14.1.4" - resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.1.4.tgz#3519969293f16379954b7e196deb0c1eecbb2f8b" - integrity sha512-457G0hcLrdYA/u1O2XkRMsDKId5VKe3uKPvrKVOyuARa6nXrdhJOOYU9hkKKyQTMru1B8qEP78IAhf/1XnVqKA== - -"@next/swc-linux-arm64-musl@14.1.4": - version "14.1.4" - resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.1.4.tgz#4bb3196bd402b3f84cf5373ff1021f547264d62f" - integrity sha512-l/kMG+z6MB+fKA9KdtyprkTQ1ihlJcBh66cf0HvqGP+rXBbOXX0dpJatjZbHeunvEHoBBS69GYQG5ry78JMy3g== - -"@next/swc-linux-x64-gnu@14.1.4": - version "14.1.4" - resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.1.4.tgz#1b3372c98c83dcdab946cdb4ee06e068b8139ba3" - integrity sha512-BapIFZ3ZRnvQ1uWbmqEGJuPT9cgLwvKtxhK/L2t4QYO7l+/DxXuIGjvp1x8rvfa/x1FFSsipERZK70pewbtJtw== - -"@next/swc-linux-x64-musl@14.1.4": - version "14.1.4" - resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.1.4.tgz#8459088bdc872648ff78f121db596f2533df5808" - integrity sha512-mqVxTwk4XuBl49qn2A5UmzFImoL1iLm0KQQwtdRJRKl21ylQwwGCxJtIYo2rbfkZHoSKlh/YgztY0qH3wG1xIg== - -"@next/swc-win32-arm64-msvc@14.1.4": - version "14.1.4" - resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.1.4.tgz#84280a08c00cc3be24ddd3a12f4617b108e6dea6" - integrity sha512-xzxF4ErcumXjO2Pvg/wVGrtr9QQJLk3IyQX1ddAC/fi6/5jZCZ9xpuL9Tzc4KPWMFq8GGWFVDMshZOdHGdkvag== - -"@next/swc-win32-ia32-msvc@14.1.4": - version "14.1.4" - resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.1.4.tgz#23ff7f4bd0a27177428669ef6fa5c3923c738031" - integrity sha512-WZiz8OdbkpRw6/IU/lredZWKKZopUMhcI2F+XiMAcPja0uZYdMTZQRoQ0WZcvinn9xZAidimE7tN9W5v9Yyfyw== - -"@next/swc-win32-x64-msvc@14.1.4": - version "14.1.4" - resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.1.4.tgz#bccf5beccfde66d6c66fa4e2509118c796385eda" - integrity sha512-4Rto21sPfw555sZ/XNLqfxDUNeLhNYGO2dlPqsnuCg8N8a2a9u1ltqBOPQ4vj1Gf7eJC0W2hHG2eYUHuiXgY2w== - -"@nodelib/fs.scandir@2.1.5": - version "2.1.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" - integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== - dependencies: - "@nodelib/fs.stat" "2.0.5" - run-parallel "^1.1.9" - -"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": - version "2.0.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" - integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== - -"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": - version "1.2.8" - resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" - integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== - dependencies: - "@nodelib/fs.scandir" "2.1.5" - fastq "^1.6.0" - -"@pkgjs/parseargs@^0.11.0": - version "0.11.0" - resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" - integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== - -"@rushstack/eslint-patch@^1.3.3": - version "1.8.0" - resolved "https://registry.yarnpkg.com/@rushstack/eslint-patch/-/eslint-patch-1.8.0.tgz#c5545e6a5d2bd5c26b4021c357177a28698c950e" - integrity sha512-0HejFckBN2W+ucM6cUOlwsByTKt9/+0tWhqUffNIcHqCXkthY/mZ7AuYPK/2IIaGWhdl0h+tICDO0ssLMd6XMQ== - -"@swc/helpers@0.5.2": - version "0.5.2" - resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.5.2.tgz#85ea0c76450b61ad7d10a37050289eded783c27d" - integrity sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw== - dependencies: - tslib "^2.4.0" - -"@types/json5@^0.0.29": - version "0.0.29" - resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" - integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== - -"@types/node@^20": - version "20.11.30" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.11.30.tgz#9c33467fc23167a347e73834f788f4b9f399d66f" - integrity sha512-dHM6ZxwlmuZaRmUPfv1p+KrdD1Dci04FbdEm/9wEMouFqxYoFl5aMkt0VMAUtYRQDyYvD41WJLukhq/ha3YuTw== - dependencies: - undici-types "~5.26.4" - -"@types/prop-types@*": - version "15.7.11" - resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.11.tgz#2596fb352ee96a1379c657734d4b913a613ad563" - integrity sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng== - -"@types/react-dom@^18": - version "18.2.22" - resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.2.22.tgz#d332febf0815403de6da8a97e5fe282cbe609bae" - integrity sha512-fHkBXPeNtfvri6gdsMYyW+dW7RXFo6Ad09nLFK0VQWR7yGLai/Cyvyj696gbwYvBnhGtevUG9cET0pmUbMtoPQ== - dependencies: - "@types/react" "*" - -"@types/react@*", "@types/react@^18": - version "18.2.67" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.67.tgz#96b7af0b5e79c756f4bdd981de2ca28472c858e5" - integrity sha512-vkIE2vTIMHQ/xL0rgmuoECBCkZFZeHr49HeWSc24AptMbNRo7pwSBvj73rlJJs9fGKj0koS+V7kQB1jHS0uCgw== - dependencies: - "@types/prop-types" "*" - "@types/scheduler" "*" - csstype "^3.0.2" - -"@types/scheduler@*": - version "0.16.8" - resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.8.tgz#ce5ace04cfeabe7ef87c0091e50752e36707deff" - integrity sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A== - -"@typescript-eslint/parser@^5.4.2 || ^6.0.0": - version "6.21.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-6.21.0.tgz#af8fcf66feee2edc86bc5d1cf45e33b0630bf35b" - integrity sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ== - dependencies: - "@typescript-eslint/scope-manager" "6.21.0" - "@typescript-eslint/types" "6.21.0" - "@typescript-eslint/typescript-estree" "6.21.0" - "@typescript-eslint/visitor-keys" "6.21.0" - debug "^4.3.4" - -"@typescript-eslint/scope-manager@6.21.0": - version "6.21.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz#ea8a9bfc8f1504a6ac5d59a6df308d3a0630a2b1" - integrity sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg== - dependencies: - "@typescript-eslint/types" "6.21.0" - "@typescript-eslint/visitor-keys" "6.21.0" - -"@typescript-eslint/types@6.21.0": - version "6.21.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-6.21.0.tgz#205724c5123a8fef7ecd195075fa6e85bac3436d" - integrity sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg== - -"@typescript-eslint/typescript-estree@6.21.0": - version "6.21.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz#c47ae7901db3b8bddc3ecd73daff2d0895688c46" - integrity sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ== - dependencies: - "@typescript-eslint/types" "6.21.0" - "@typescript-eslint/visitor-keys" "6.21.0" - debug "^4.3.4" - globby "^11.1.0" - is-glob "^4.0.3" - minimatch "9.0.3" - semver "^7.5.4" - ts-api-utils "^1.0.1" - -"@typescript-eslint/visitor-keys@6.21.0": - version "6.21.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz#87a99d077aa507e20e238b11d56cc26ade45fe47" - integrity sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A== - dependencies: - "@typescript-eslint/types" "6.21.0" - eslint-visitor-keys "^3.4.1" - -"@ungap/structured-clone@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" - integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== - -"@wasm@file:../wasm/pkg": - version "1.0.0" - -acorn-jsx@^5.3.2: - version "5.3.2" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" - integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== - -acorn@^8.9.0: - version "8.11.3" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a" - integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== - -ajv@^6.12.4: - version "6.12.6" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" - integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== - dependencies: - fast-deep-equal "^3.1.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - -ansi-regex@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" - integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== - -ansi-regex@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" - integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== - -ansi-styles@^4.0.0, ansi-styles@^4.1.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -ansi-styles@^6.1.0: - version "6.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" - integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== - -any-promise@^1.0.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" - integrity sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A== - -anymatch@~3.1.2: - version "3.1.3" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" - integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - -arg@^5.0.2: - version "5.0.2" - resolved "https://registry.yarnpkg.com/arg/-/arg-5.0.2.tgz#c81433cc427c92c4dcf4865142dbca6f15acd59c" - integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg== - -argparse@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" - integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== - -aria-query@^5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.3.0.tgz#650c569e41ad90b51b3d7df5e5eed1c7549c103e" - integrity sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A== - dependencies: - dequal "^2.0.3" - -array-buffer-byte-length@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz#1e5583ec16763540a27ae52eed99ff899223568f" - integrity sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg== - dependencies: - call-bind "^1.0.5" - is-array-buffer "^3.0.4" - -array-includes@^3.1.6, array-includes@^3.1.7: - version "3.1.8" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.8.tgz#5e370cbe172fdd5dd6530c1d4aadda25281ba97d" - integrity sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.2" - es-object-atoms "^1.0.0" - get-intrinsic "^1.2.4" - is-string "^1.0.7" - -array-union@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" - integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== - -array.prototype.findlast@^1.2.4: - version "1.2.5" - resolved "https://registry.yarnpkg.com/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz#3e4fbcb30a15a7f5bf64cf2faae22d139c2e4904" - integrity sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.2" - es-errors "^1.3.0" - es-object-atoms "^1.0.0" - es-shim-unscopables "^1.0.2" - -array.prototype.findlastindex@^1.2.3: - version "1.2.5" - resolved "https://registry.yarnpkg.com/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz#8c35a755c72908719453f87145ca011e39334d0d" - integrity sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.2" - es-errors "^1.3.0" - es-object-atoms "^1.0.0" - es-shim-unscopables "^1.0.2" - -array.prototype.flat@^1.3.1, array.prototype.flat@^1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz#1476217df8cff17d72ee8f3ba06738db5b387d18" - integrity sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - es-shim-unscopables "^1.0.0" - -array.prototype.flatmap@^1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz#c9a7c6831db8e719d6ce639190146c24bbd3e527" - integrity sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - es-shim-unscopables "^1.0.0" - -array.prototype.toreversed@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/array.prototype.toreversed/-/array.prototype.toreversed-1.1.2.tgz#b989a6bf35c4c5051e1dc0325151bf8088954eba" - integrity sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - es-shim-unscopables "^1.0.0" - -array.prototype.tosorted@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.3.tgz#c8c89348337e51b8a3c48a9227f9ce93ceedcba8" - integrity sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg== - dependencies: - call-bind "^1.0.5" - define-properties "^1.2.1" - es-abstract "^1.22.3" - es-errors "^1.1.0" - es-shim-unscopables "^1.0.2" - -arraybuffer.prototype.slice@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz#097972f4255e41bc3425e37dc3f6421cf9aefde6" - integrity sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A== - dependencies: - array-buffer-byte-length "^1.0.1" - call-bind "^1.0.5" - define-properties "^1.2.1" - es-abstract "^1.22.3" - es-errors "^1.2.1" - get-intrinsic "^1.2.3" - is-array-buffer "^3.0.4" - is-shared-array-buffer "^1.0.2" - -ast-types-flow@^0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.8.tgz#0a85e1c92695769ac13a428bb653e7538bea27d6" - integrity sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ== - -autoprefixer@^10.0.1: - version "10.4.19" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.19.tgz#ad25a856e82ee9d7898c59583c1afeb3fa65f89f" - integrity sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew== - dependencies: - browserslist "^4.23.0" - caniuse-lite "^1.0.30001599" - fraction.js "^4.3.7" - normalize-range "^0.1.2" - picocolors "^1.0.0" - postcss-value-parser "^4.2.0" - -available-typed-arrays@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846" - integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ== - dependencies: - possible-typed-array-names "^1.0.0" - -axe-core@=4.7.0: - version "4.7.0" - resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.7.0.tgz#34ba5a48a8b564f67e103f0aa5768d76e15bbbbf" - integrity sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ== - -axobject-query@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-3.2.1.tgz#39c378a6e3b06ca679f29138151e45b2b32da62a" - integrity sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg== - dependencies: - dequal "^2.0.3" - -balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" - integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== - -binary-extensions@^2.0.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" - integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -brace-expansion@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" - integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== - dependencies: - balanced-match "^1.0.0" - -braces@^3.0.2, braces@~3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== - dependencies: - fill-range "^7.0.1" - -browserslist@^4.23.0: - version "4.23.0" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.0.tgz#8f3acc2bbe73af7213399430890f86c63a5674ab" - integrity sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ== - dependencies: - caniuse-lite "^1.0.30001587" - electron-to-chromium "^1.4.668" - node-releases "^2.0.14" - update-browserslist-db "^1.0.13" - -busboy@1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/busboy/-/busboy-1.6.0.tgz#966ea36a9502e43cdb9146962523b92f531f6893" - integrity sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA== - dependencies: - streamsearch "^1.1.0" - -call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" - integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== - dependencies: - es-define-property "^1.0.0" - es-errors "^1.3.0" - function-bind "^1.1.2" - get-intrinsic "^1.2.4" - set-function-length "^1.2.1" - -callsites@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" - integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== - -camelcase-css@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/camelcase-css/-/camelcase-css-2.0.1.tgz#ee978f6947914cc30c6b44741b6ed1df7f043fd5" - integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== - -caniuse-lite@^1.0.30001579, caniuse-lite@^1.0.30001587, caniuse-lite@^1.0.30001599: - version "1.0.30001599" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001599.tgz#571cf4f3f1506df9bf41fcbb6d10d5d017817bce" - integrity sha512-LRAQHZ4yT1+f9LemSMeqdMpMxZcc4RMWdj4tiFe3G8tNkWK+E58g+/tzotb5cU6TbcVJLr4fySiAW7XmxQvZQA== - -chalk@^4.0.0: - version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -chokidar@^3.5.3: - version "3.6.0" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" - integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== - dependencies: - anymatch "~3.1.2" - braces "~3.0.2" - glob-parent "~5.1.2" - is-binary-path "~2.1.0" - is-glob "~4.0.1" - normalize-path "~3.0.0" - readdirp "~3.6.0" - optionalDependencies: - fsevents "~2.3.2" - -client-only@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/client-only/-/client-only-0.0.1.tgz#38bba5d403c41ab150bff64a95c85013cf73bca1" - integrity sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA== - -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -commander@^4.0.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" - integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== - -cross-spawn@^7.0.0, cross-spawn@^7.0.2: - version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" - integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - -cssesc@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" - integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== - -csstype@^3.0.2: - version "3.1.3" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81" - integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== - -damerau-levenshtein@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz#b43d286ccbd36bc5b2f7ed41caf2d0aba1f8a6e7" - integrity sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA== - -data-view-buffer@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/data-view-buffer/-/data-view-buffer-1.0.1.tgz#8ea6326efec17a2e42620696e671d7d5a8bc66b2" - integrity sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA== - dependencies: - call-bind "^1.0.6" - es-errors "^1.3.0" - is-data-view "^1.0.1" - -data-view-byte-length@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz#90721ca95ff280677eb793749fce1011347669e2" - integrity sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ== - dependencies: - call-bind "^1.0.7" - es-errors "^1.3.0" - is-data-view "^1.0.1" - -data-view-byte-offset@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz#5e0bbfb4828ed2d1b9b400cd8a7d119bca0ff18a" - integrity sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA== - dependencies: - call-bind "^1.0.6" - es-errors "^1.3.0" - is-data-view "^1.0.1" - -debug@^3.2.7: - version "3.2.7" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" - integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== - dependencies: - ms "^2.1.1" - -debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: - version "4.3.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== - dependencies: - ms "2.1.2" - -deep-is@^0.1.3: - version "0.1.4" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" - integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== - -define-data-property@^1.0.1, define-data-property@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" - integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== - dependencies: - es-define-property "^1.0.0" - es-errors "^1.3.0" - gopd "^1.0.1" - -define-properties@^1.1.3, define-properties@^1.2.0, define-properties@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" - integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== - dependencies: - define-data-property "^1.0.1" - has-property-descriptors "^1.0.0" - object-keys "^1.1.1" - -dequal@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" - integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== - -dexie-react-hooks@^1.1.7: - version "1.1.7" - resolved "https://registry.yarnpkg.com/dexie-react-hooks/-/dexie-react-hooks-1.1.7.tgz#75bd92a609a7c3dc3643e2fd21e7db5df6df923b" - integrity sha512-Lwv5W0Hk+uOW3kGnsU9GZoR1er1B7WQ5DSdonoNG+focTNeJbHW6vi6nBoX534VKI3/uwHebYzSw1fwY6a7mTw== - -dexie@^3.2.7: - version "3.2.7" - resolved "https://registry.yarnpkg.com/dexie/-/dexie-3.2.7.tgz#1346541c9c81e3bc6055a042a928837890595e3a" - integrity sha512-2a+BXvVhY5op+smDRLxeBAivE7YcYaneXJ1la3HOkUfX9zKkE/AJ8CNgjiXbtXepFyFmJNGSbmjOwqbT749r/w== - -didyoumean@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/didyoumean/-/didyoumean-1.2.2.tgz#989346ffe9e839b4555ecf5666edea0d3e8ad037" - integrity sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw== - -dir-glob@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" - integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== - dependencies: - path-type "^4.0.0" - -dlv@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/dlv/-/dlv-1.1.3.tgz#5c198a8a11453596e751494d49874bc7732f2e79" - integrity sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA== - -doctrine@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" - integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== - dependencies: - esutils "^2.0.2" - -doctrine@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" - integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== - dependencies: - esutils "^2.0.2" - -eastasianwidth@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" - integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== - -electron-to-chromium@^1.4.668: - version "1.4.714" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.714.tgz#708fdc8d5bdec824e41fe8b1b0e10af508a10946" - integrity sha512-OfnVHt+nMRH9Ua5koH/2gKlCAXbG+u1yXwLKyBVqNboBV34ZTwb846RUe8K5mtE1uhz0BXoMarZ13JCQr+sBtQ== - -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - -emoji-regex@^9.2.2: - version "9.2.2" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" - integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== - -enhanced-resolve@^5.12.0: - version "5.16.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.16.0.tgz#65ec88778083056cb32487faa9aef82ed0864787" - integrity sha512-O+QWCviPNSSLAD9Ucn8Awv+poAkqn3T1XY5/N7kR7rQO9yfSGWkYZDwpJ+iKF7B8rxaQKWngSqACpgzeapSyoA== - dependencies: - graceful-fs "^4.2.4" - tapable "^2.2.0" - -es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23.1, es-abstract@^1.23.2: - version "1.23.2" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.23.2.tgz#693312f3940f967b8dd3eebacb590b01712622e0" - integrity sha512-60s3Xv2T2p1ICykc7c+DNDPLDMm9t4QxCOUU0K9JxiLjM3C1zB9YVdN7tjxrFd4+AkZ8CdX1ovUga4P2+1e+/w== - dependencies: - array-buffer-byte-length "^1.0.1" - arraybuffer.prototype.slice "^1.0.3" - available-typed-arrays "^1.0.7" - call-bind "^1.0.7" - data-view-buffer "^1.0.1" - data-view-byte-length "^1.0.1" - data-view-byte-offset "^1.0.0" - es-define-property "^1.0.0" - es-errors "^1.3.0" - es-object-atoms "^1.0.0" - es-set-tostringtag "^2.0.3" - es-to-primitive "^1.2.1" - function.prototype.name "^1.1.6" - get-intrinsic "^1.2.4" - get-symbol-description "^1.0.2" - globalthis "^1.0.3" - gopd "^1.0.1" - has-property-descriptors "^1.0.2" - has-proto "^1.0.3" - has-symbols "^1.0.3" - hasown "^2.0.2" - internal-slot "^1.0.7" - is-array-buffer "^3.0.4" - is-callable "^1.2.7" - is-data-view "^1.0.1" - is-negative-zero "^2.0.3" - is-regex "^1.1.4" - is-shared-array-buffer "^1.0.3" - is-string "^1.0.7" - is-typed-array "^1.1.13" - is-weakref "^1.0.2" - object-inspect "^1.13.1" - object-keys "^1.1.1" - object.assign "^4.1.5" - regexp.prototype.flags "^1.5.2" - safe-array-concat "^1.1.2" - safe-regex-test "^1.0.3" - string.prototype.trim "^1.2.9" - string.prototype.trimend "^1.0.8" - string.prototype.trimstart "^1.0.7" - typed-array-buffer "^1.0.2" - typed-array-byte-length "^1.0.1" - typed-array-byte-offset "^1.0.2" - typed-array-length "^1.0.5" - unbox-primitive "^1.0.2" - which-typed-array "^1.1.15" - -es-define-property@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845" - integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ== - dependencies: - get-intrinsic "^1.2.4" - -es-errors@^1.1.0, es-errors@^1.2.1, es-errors@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" - integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== - -es-iterator-helpers@^1.0.15, es-iterator-helpers@^1.0.17: - version "1.0.18" - resolved "https://registry.yarnpkg.com/es-iterator-helpers/-/es-iterator-helpers-1.0.18.tgz#4d3424f46b24df38d064af6fbbc89274e29ea69d" - integrity sha512-scxAJaewsahbqTYrGKJihhViaM6DDZDDoucfvzNbK0pOren1g/daDQ3IAhzn+1G14rBG7w+i5N+qul60++zlKA== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.0" - es-errors "^1.3.0" - es-set-tostringtag "^2.0.3" - function-bind "^1.1.2" - get-intrinsic "^1.2.4" - globalthis "^1.0.3" - has-property-descriptors "^1.0.2" - has-proto "^1.0.3" - has-symbols "^1.0.3" - internal-slot "^1.0.7" - iterator.prototype "^1.1.2" - safe-array-concat "^1.1.2" - -es-object-atoms@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.0.0.tgz#ddb55cd47ac2e240701260bc2a8e31ecb643d941" - integrity sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw== - dependencies: - es-errors "^1.3.0" - -es-set-tostringtag@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz#8bb60f0a440c2e4281962428438d58545af39777" - integrity sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ== - dependencies: - get-intrinsic "^1.2.4" - has-tostringtag "^1.0.2" - hasown "^2.0.1" - -es-shim-unscopables@^1.0.0, es-shim-unscopables@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz#1f6942e71ecc7835ed1c8a83006d8771a63a3763" - integrity sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw== - dependencies: - hasown "^2.0.0" - -es-to-primitive@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" - integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== - dependencies: - is-callable "^1.1.4" - is-date-object "^1.0.1" - is-symbol "^1.0.2" - -escalade@^3.1.1: - version "3.1.2" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.2.tgz#54076e9ab29ea5bf3d8f1ed62acffbb88272df27" - integrity sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA== - -escape-string-regexp@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" - integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== - -eslint-config-next@14.1.4: - version "14.1.4" - resolved "https://registry.yarnpkg.com/eslint-config-next/-/eslint-config-next-14.1.4.tgz#22f2ba4c0993e991249d863656a64c204bae542c" - integrity sha512-cihIahbhYAWwXJwZkAaRPpUi5t9aOi/HdfWXOjZeUOqNWXHD8X22kd1KG58Dc3MVaRx3HoR/oMGk2ltcrqDn8g== - dependencies: - "@next/eslint-plugin-next" "14.1.4" - "@rushstack/eslint-patch" "^1.3.3" - "@typescript-eslint/parser" "^5.4.2 || ^6.0.0" - eslint-import-resolver-node "^0.3.6" - eslint-import-resolver-typescript "^3.5.2" - eslint-plugin-import "^2.28.1" - eslint-plugin-jsx-a11y "^6.7.1" - eslint-plugin-react "^7.33.2" - eslint-plugin-react-hooks "^4.5.0 || 5.0.0-canary-7118f5dd7-20230705" - -eslint-import-resolver-node@^0.3.6, eslint-import-resolver-node@^0.3.9: - version "0.3.9" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz#d4eaac52b8a2e7c3cd1903eb00f7e053356118ac" - integrity sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g== - dependencies: - debug "^3.2.7" - is-core-module "^2.13.0" - resolve "^1.22.4" - -eslint-import-resolver-typescript@^3.5.2: - version "3.6.1" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.1.tgz#7b983680edd3f1c5bce1a5829ae0bc2d57fe9efa" - integrity sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg== - dependencies: - debug "^4.3.4" - enhanced-resolve "^5.12.0" - eslint-module-utils "^2.7.4" - fast-glob "^3.3.1" - get-tsconfig "^4.5.0" - is-core-module "^2.11.0" - is-glob "^4.0.3" - -eslint-module-utils@^2.7.4, eslint-module-utils@^2.8.0: - version "2.8.1" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz#52f2404300c3bd33deece9d7372fb337cc1d7c34" - integrity sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q== - dependencies: - debug "^3.2.7" - -eslint-plugin-import@^2.28.1: - version "2.29.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz#d45b37b5ef5901d639c15270d74d46d161150643" - integrity sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw== - dependencies: - array-includes "^3.1.7" - array.prototype.findlastindex "^1.2.3" - array.prototype.flat "^1.3.2" - array.prototype.flatmap "^1.3.2" - debug "^3.2.7" - doctrine "^2.1.0" - eslint-import-resolver-node "^0.3.9" - eslint-module-utils "^2.8.0" - hasown "^2.0.0" - is-core-module "^2.13.1" - is-glob "^4.0.3" - minimatch "^3.1.2" - object.fromentries "^2.0.7" - object.groupby "^1.0.1" - object.values "^1.1.7" - semver "^6.3.1" - tsconfig-paths "^3.15.0" - -eslint-plugin-jsx-a11y@^6.7.1: - version "6.8.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.8.0.tgz#2fa9c701d44fcd722b7c771ec322432857fcbad2" - integrity sha512-Hdh937BS3KdwwbBaKd5+PLCOmYY6U4f2h9Z2ktwtNKvIdIEu137rjYbcb9ApSbVJfWxANNuiKTD/9tOKjK9qOA== - dependencies: - "@babel/runtime" "^7.23.2" - aria-query "^5.3.0" - array-includes "^3.1.7" - array.prototype.flatmap "^1.3.2" - ast-types-flow "^0.0.8" - axe-core "=4.7.0" - axobject-query "^3.2.1" - damerau-levenshtein "^1.0.8" - emoji-regex "^9.2.2" - es-iterator-helpers "^1.0.15" - hasown "^2.0.0" - jsx-ast-utils "^3.3.5" - language-tags "^1.0.9" - minimatch "^3.1.2" - object.entries "^1.1.7" - object.fromentries "^2.0.7" - -"eslint-plugin-react-hooks@^4.5.0 || 5.0.0-canary-7118f5dd7-20230705": - version "4.6.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz#4c3e697ad95b77e93f8646aaa1630c1ba607edd3" - integrity sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g== - -eslint-plugin-react@^7.33.2: - version "7.34.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.34.1.tgz#6806b70c97796f5bbfb235a5d3379ece5f4da997" - integrity sha512-N97CxlouPT1AHt8Jn0mhhN2RrADlUAsk1/atcT2KyA/l9Q/E6ll7OIGwNumFmWfZ9skV3XXccYS19h80rHtgkw== - dependencies: - array-includes "^3.1.7" - array.prototype.findlast "^1.2.4" - array.prototype.flatmap "^1.3.2" - array.prototype.toreversed "^1.1.2" - array.prototype.tosorted "^1.1.3" - doctrine "^2.1.0" - es-iterator-helpers "^1.0.17" - estraverse "^5.3.0" - jsx-ast-utils "^2.4.1 || ^3.0.0" - minimatch "^3.1.2" - object.entries "^1.1.7" - object.fromentries "^2.0.7" - object.hasown "^1.1.3" - object.values "^1.1.7" - prop-types "^15.8.1" - resolve "^2.0.0-next.5" - semver "^6.3.1" - string.prototype.matchall "^4.0.10" - -eslint-scope@^7.2.2: - version "7.2.2" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f" - integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== - dependencies: - esrecurse "^4.3.0" - estraverse "^5.2.0" - -eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: - version "3.4.3" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" - integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== - -eslint@^8: - version "8.57.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.0.tgz#c786a6fd0e0b68941aaf624596fb987089195668" - integrity sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ== - dependencies: - "@eslint-community/eslint-utils" "^4.2.0" - "@eslint-community/regexpp" "^4.6.1" - "@eslint/eslintrc" "^2.1.4" - "@eslint/js" "8.57.0" - "@humanwhocodes/config-array" "^0.11.14" - "@humanwhocodes/module-importer" "^1.0.1" - "@nodelib/fs.walk" "^1.2.8" - "@ungap/structured-clone" "^1.2.0" - ajv "^6.12.4" - chalk "^4.0.0" - cross-spawn "^7.0.2" - debug "^4.3.2" - doctrine "^3.0.0" - escape-string-regexp "^4.0.0" - eslint-scope "^7.2.2" - eslint-visitor-keys "^3.4.3" - espree "^9.6.1" - esquery "^1.4.2" - esutils "^2.0.2" - fast-deep-equal "^3.1.3" - file-entry-cache "^6.0.1" - find-up "^5.0.0" - glob-parent "^6.0.2" - globals "^13.19.0" - graphemer "^1.4.0" - ignore "^5.2.0" - imurmurhash "^0.1.4" - is-glob "^4.0.0" - is-path-inside "^3.0.3" - js-yaml "^4.1.0" - json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.4.1" - lodash.merge "^4.6.2" - minimatch "^3.1.2" - natural-compare "^1.4.0" - optionator "^0.9.3" - strip-ansi "^6.0.1" - text-table "^0.2.0" - -espree@^9.6.0, espree@^9.6.1: - version "9.6.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" - integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== - dependencies: - acorn "^8.9.0" - acorn-jsx "^5.3.2" - eslint-visitor-keys "^3.4.1" - -esquery@^1.4.2: - version "1.5.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" - integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== - dependencies: - estraverse "^5.1.0" - -esrecurse@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" - integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== - dependencies: - estraverse "^5.2.0" - -estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" - integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== - -esutils@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" - integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== - -fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" - integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== - -fast-glob@^3.2.9, fast-glob@^3.3.0, fast-glob@^3.3.1: - version "3.3.2" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" - integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== - dependencies: - "@nodelib/fs.stat" "^2.0.2" - "@nodelib/fs.walk" "^1.2.3" - glob-parent "^5.1.2" - merge2 "^1.3.0" - micromatch "^4.0.4" - -fast-json-stable-stringify@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" - integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== - -fast-levenshtein@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== - -fastq@^1.6.0: - version "1.17.1" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.17.1.tgz#2a523f07a4e7b1e81a42b91b8bf2254107753b47" - integrity sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w== - dependencies: - reusify "^1.0.4" - -file-entry-cache@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" - integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== - dependencies: - flat-cache "^3.0.4" - -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== - dependencies: - to-regex-range "^5.0.1" - -find-up@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" - integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== - dependencies: - locate-path "^6.0.0" - path-exists "^4.0.0" - -flat-cache@^3.0.4: - version "3.2.0" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.2.0.tgz#2c0c2d5040c99b1632771a9d105725c0115363ee" - integrity sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw== - dependencies: - flatted "^3.2.9" - keyv "^4.5.3" - rimraf "^3.0.2" - -flatted@^3.2.9: - version "3.3.1" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.1.tgz#21db470729a6734d4997002f439cb308987f567a" - integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw== - -for-each@^0.3.3: - version "0.3.3" - resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" - integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== - dependencies: - is-callable "^1.1.3" - -foreground-child@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.1.1.tgz#1d173e776d75d2772fed08efe4a0de1ea1b12d0d" - integrity sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg== - dependencies: - cross-spawn "^7.0.0" - signal-exit "^4.0.1" - -fraction.js@^4.3.7: - version "4.3.7" - resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.3.7.tgz#06ca0085157e42fda7f9e726e79fefc4068840f7" - integrity sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew== - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== - -fsevents@~2.3.2: - version "2.3.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" - integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== - -function-bind@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" - integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== - -function.prototype.name@^1.1.5, function.prototype.name@^1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.6.tgz#cdf315b7d90ee77a4c6ee216c3c3362da07533fd" - integrity sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - functions-have-names "^1.2.3" - -functions-have-names@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" - integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== - -get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" - integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== - dependencies: - es-errors "^1.3.0" - function-bind "^1.1.2" - has-proto "^1.0.1" - has-symbols "^1.0.3" - hasown "^2.0.0" - -get-symbol-description@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.2.tgz#533744d5aa20aca4e079c8e5daf7fd44202821f5" - integrity sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg== - dependencies: - call-bind "^1.0.5" - es-errors "^1.3.0" - get-intrinsic "^1.2.4" - -get-tsconfig@^4.5.0: - version "4.7.3" - resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.7.3.tgz#0498163d98f7b58484dd4906999c0c9d5f103f83" - integrity sha512-ZvkrzoUA0PQZM6fy6+/Hce561s+faD1rsNwhnO5FelNjyy7EMGJ3Rz1AQ8GYDWjhRs/7dBLOEJvhK8MiEJOAFg== - dependencies: - resolve-pkg-maps "^1.0.0" - -glob-parent@^5.1.2, glob-parent@~5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" - integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== - dependencies: - is-glob "^4.0.1" - -glob-parent@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" - integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== - dependencies: - is-glob "^4.0.3" - -glob@10.3.10, glob@^10.3.10: - version "10.3.10" - resolved "https://registry.yarnpkg.com/glob/-/glob-10.3.10.tgz#0351ebb809fd187fe421ab96af83d3a70715df4b" - integrity sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g== - dependencies: - foreground-child "^3.1.0" - jackspeak "^2.3.5" - minimatch "^9.0.1" - minipass "^5.0.0 || ^6.0.2 || ^7.0.0" - path-scurry "^1.10.1" - -glob@^7.1.3: - version "7.2.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" - integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.1.1" - once "^1.3.0" - path-is-absolute "^1.0.0" - -globals@^13.19.0: - version "13.24.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.24.0.tgz#8432a19d78ce0c1e833949c36adb345400bb1171" - integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ== - dependencies: - type-fest "^0.20.2" - -globalthis@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf" - integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== - dependencies: - define-properties "^1.1.3" - -globby@^11.1.0: - version "11.1.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" - integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== - dependencies: - array-union "^2.1.0" - dir-glob "^3.0.1" - fast-glob "^3.2.9" - ignore "^5.2.0" - merge2 "^1.4.1" - slash "^3.0.0" - -gopd@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" - integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== - dependencies: - get-intrinsic "^1.1.3" - -graceful-fs@^4.2.11, graceful-fs@^4.2.4: - version "4.2.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" - integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== - -graphemer@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" - integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== - -has-bigints@^1.0.1, has-bigints@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" - integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - -has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" - integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== - dependencies: - es-define-property "^1.0.0" - -has-proto@^1.0.1, has-proto@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.3.tgz#b31ddfe9b0e6e9914536a6ab286426d0214f77fd" - integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q== - -has-symbols@^1.0.2, has-symbols@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" - integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== - -has-tostringtag@^1.0.0, has-tostringtag@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" - integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== - dependencies: - has-symbols "^1.0.3" - -hasown@^2.0.0, hasown@^2.0.1, hasown@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" - integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== - dependencies: - function-bind "^1.1.2" - -ignore@^5.2.0: - version "5.3.1" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.1.tgz#5073e554cd42c5b33b394375f538b8593e34d4ef" - integrity sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw== - -import-fresh@^3.2.1: - version "3.3.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" - integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== - dependencies: - parent-module "^1.0.0" - resolve-from "^4.0.0" - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -internal-slot@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.7.tgz#c06dcca3ed874249881007b0a5523b172a190802" - integrity sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g== - dependencies: - es-errors "^1.3.0" - hasown "^2.0.0" - side-channel "^1.0.4" - -is-array-buffer@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.4.tgz#7a1f92b3d61edd2bc65d24f130530ea93d7fae98" - integrity sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.2.1" - -is-async-function@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-async-function/-/is-async-function-2.0.0.tgz#8e4418efd3e5d3a6ebb0164c05ef5afb69aa9646" - integrity sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA== - dependencies: - has-tostringtag "^1.0.0" - -is-bigint@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" - integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== - dependencies: - has-bigints "^1.0.1" - -is-binary-path@~2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" - integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== - dependencies: - binary-extensions "^2.0.0" - -is-boolean-object@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" - integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: - version "1.2.7" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" - integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== - -is-core-module@^2.11.0, is-core-module@^2.13.0, is-core-module@^2.13.1: - version "2.13.1" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384" - integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw== - dependencies: - hasown "^2.0.0" - -is-data-view@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-data-view/-/is-data-view-1.0.1.tgz#4b4d3a511b70f3dc26d42c03ca9ca515d847759f" - integrity sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w== - dependencies: - is-typed-array "^1.1.13" - -is-date-object@^1.0.1, is-date-object@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" - integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== - dependencies: - has-tostringtag "^1.0.0" - -is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== - -is-finalizationregistry@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz#c8749b65f17c133313e661b1289b95ad3dbd62e6" - integrity sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw== - dependencies: - call-bind "^1.0.2" - -is-fullwidth-code-point@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" - integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== - -is-generator-function@^1.0.10: - version "1.0.10" - resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" - integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== - dependencies: - has-tostringtag "^1.0.0" - -is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: - version "4.0.3" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" - integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== - dependencies: - is-extglob "^2.1.1" - -is-map@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.3.tgz#ede96b7fe1e270b3c4465e3a465658764926d62e" - integrity sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw== - -is-negative-zero@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.3.tgz#ced903a027aca6381b777a5743069d7376a49747" - integrity sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw== - -is-number-object@^1.0.4: - version "1.0.7" - resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" - integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== - dependencies: - has-tostringtag "^1.0.0" - -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - -is-path-inside@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" - integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== - -is-regex@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" - integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-set@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.3.tgz#8ab209ea424608141372ded6e0cb200ef1d9d01d" - integrity sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg== - -is-shared-array-buffer@^1.0.2, is-shared-array-buffer@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz#1237f1cba059cdb62431d378dcc37d9680181688" - integrity sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg== - dependencies: - call-bind "^1.0.7" - -is-string@^1.0.5, is-string@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" - integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== - dependencies: - has-tostringtag "^1.0.0" - -is-symbol@^1.0.2, is-symbol@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" - integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== - dependencies: - has-symbols "^1.0.2" - -is-typed-array@^1.1.13: - version "1.1.13" - resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.13.tgz#d6c5ca56df62334959322d7d7dd1cca50debe229" - integrity sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw== - dependencies: - which-typed-array "^1.1.14" - -is-weakmap@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.2.tgz#bf72615d649dfe5f699079c54b83e47d1ae19cfd" - integrity sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w== - -is-weakref@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" - integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== - dependencies: - call-bind "^1.0.2" - -is-weakset@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.3.tgz#e801519df8c0c43e12ff2834eead84ec9e624007" - integrity sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ== - dependencies: - call-bind "^1.0.7" - get-intrinsic "^1.2.4" - -isarray@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" - integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== - -iterator.prototype@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/iterator.prototype/-/iterator.prototype-1.1.2.tgz#5e29c8924f01916cb9335f1ff80619dcff22b0c0" - integrity sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w== - dependencies: - define-properties "^1.2.1" - get-intrinsic "^1.2.1" - has-symbols "^1.0.3" - reflect.getprototypeof "^1.0.4" - set-function-name "^2.0.1" - -jackspeak@^2.3.5: - version "2.3.6" - resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-2.3.6.tgz#647ecc472238aee4b06ac0e461acc21a8c505ca8" - integrity sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ== - dependencies: - "@isaacs/cliui" "^8.0.2" - optionalDependencies: - "@pkgjs/parseargs" "^0.11.0" - -jiti@^1.19.1: - version "1.21.0" - resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.21.0.tgz#7c97f8fe045724e136a397f7340475244156105d" - integrity sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q== - -"js-tokens@^3.0.0 || ^4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - -js-yaml@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" - integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== - dependencies: - argparse "^2.0.1" - -json-buffer@3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" - integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== - -json-schema-traverse@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" - integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== - -json-stable-stringify-without-jsonify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" - integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== - -json5@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" - integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== - dependencies: - minimist "^1.2.0" - -"jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.3.5: - version "3.3.5" - resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz#4766bd05a8e2a11af222becd19e15575e52a853a" - integrity sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ== - dependencies: - array-includes "^3.1.6" - array.prototype.flat "^1.3.1" - object.assign "^4.1.4" - object.values "^1.1.6" - -keyv@^4.5.3: - version "4.5.4" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" - integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== - dependencies: - json-buffer "3.0.1" - -language-subtag-registry@^0.3.20: - version "0.3.22" - resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz#2e1500861b2e457eba7e7ae86877cbd08fa1fd1d" - integrity sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w== - -language-tags@^1.0.9: - version "1.0.9" - resolved "https://registry.yarnpkg.com/language-tags/-/language-tags-1.0.9.tgz#1ffdcd0ec0fafb4b1be7f8b11f306ad0f9c08777" - integrity sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA== - dependencies: - language-subtag-registry "^0.3.20" - -levn@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" - integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== - dependencies: - prelude-ls "^1.2.1" - type-check "~0.4.0" - -lilconfig@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.1.0.tgz#78e23ac89ebb7e1bfbf25b18043de756548e7f52" - integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ== - -lilconfig@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-3.1.1.tgz#9d8a246fa753106cfc205fd2d77042faca56e5e3" - integrity sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ== - -lines-and-columns@^1.1.6: - version "1.2.4" - resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" - integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== - -locate-path@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" - integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== - dependencies: - p-locate "^5.0.0" - -lodash.merge@^4.6.2: - version "4.6.2" - resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" - integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== - -loose-envify@^1.1.0, loose-envify@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" - integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== - dependencies: - js-tokens "^3.0.0 || ^4.0.0" - -lru-cache@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" - integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== - dependencies: - yallist "^4.0.0" - -"lru-cache@^9.1.1 || ^10.0.0": - version "10.2.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.2.0.tgz#0bd445ca57363465900f4d1f9bd8db343a4d95c3" - integrity sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q== - -merge2@^1.3.0, merge2@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" - integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== - -micromatch@^4.0.4, micromatch@^4.0.5: - version "4.0.5" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" - integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== - dependencies: - braces "^3.0.2" - picomatch "^2.3.1" - -minimatch@9.0.3, minimatch@^9.0.1: - version "9.0.3" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825" - integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== - dependencies: - brace-expansion "^2.0.1" - -minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== - dependencies: - brace-expansion "^1.1.7" - -minimist@^1.2.0, minimist@^1.2.6: - version "1.2.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" - integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== - -"minipass@^5.0.0 || ^6.0.2 || ^7.0.0": - version "7.0.4" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.0.4.tgz#dbce03740f50a4786ba994c1fb908844d27b038c" - integrity sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ== - -ms@2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -ms@^2.1.1: - version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - -mz@^2.7.0: - version "2.7.0" - resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" - integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== - dependencies: - any-promise "^1.0.0" - object-assign "^4.0.1" - thenify-all "^1.0.0" - -nanoid@^3.3.6, nanoid@^3.3.7: - version "3.3.7" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" - integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== - -natural-compare@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" - integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== - -next@14.1.4: - version "14.1.4" - resolved "https://registry.yarnpkg.com/next/-/next-14.1.4.tgz#203310f7310578563fd5c961f0db4729ce7a502d" - integrity sha512-1WTaXeSrUwlz/XcnhGTY7+8eiaFvdet5z9u3V2jb+Ek1vFo0VhHKSAIJvDWfQpttWjnyw14kBeq28TPq7bTeEQ== - dependencies: - "@next/env" "14.1.4" - "@swc/helpers" "0.5.2" - busboy "1.6.0" - caniuse-lite "^1.0.30001579" - graceful-fs "^4.2.11" - postcss "8.4.31" - styled-jsx "5.1.1" - optionalDependencies: - "@next/swc-darwin-arm64" "14.1.4" - "@next/swc-darwin-x64" "14.1.4" - "@next/swc-linux-arm64-gnu" "14.1.4" - "@next/swc-linux-arm64-musl" "14.1.4" - "@next/swc-linux-x64-gnu" "14.1.4" - "@next/swc-linux-x64-musl" "14.1.4" - "@next/swc-win32-arm64-msvc" "14.1.4" - "@next/swc-win32-ia32-msvc" "14.1.4" - "@next/swc-win32-x64-msvc" "14.1.4" - -node-releases@^2.0.14: - version "2.0.14" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.14.tgz#2ffb053bceb8b2be8495ece1ab6ce600c4461b0b" - integrity sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw== - -normalize-path@^3.0.0, normalize-path@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== - -normalize-range@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" - integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA== - -object-assign@^4.0.1, object-assign@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== - -object-hash@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-3.0.0.tgz#73f97f753e7baffc0e2cc9d6e079079744ac82e9" - integrity sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw== - -object-inspect@^1.13.1: - version "1.13.1" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.1.tgz#b96c6109324ccfef6b12216a956ca4dc2ff94bc2" - integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ== - -object-keys@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" - integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== - -object.assign@^4.1.4, object.assign@^4.1.5: - version "4.1.5" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.5.tgz#3a833f9ab7fdb80fc9e8d2300c803d216d8fdbb0" - integrity sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ== - dependencies: - call-bind "^1.0.5" - define-properties "^1.2.1" - has-symbols "^1.0.3" - object-keys "^1.1.1" - -object.entries@^1.1.7: - version "1.1.8" - resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.8.tgz#bffe6f282e01f4d17807204a24f8edd823599c41" - integrity sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-object-atoms "^1.0.0" - -object.fromentries@^2.0.7: - version "2.0.8" - resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.8.tgz#f7195d8a9b97bd95cbc1999ea939ecd1a2b00c65" - integrity sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.2" - es-object-atoms "^1.0.0" - -object.groupby@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/object.groupby/-/object.groupby-1.0.3.tgz#9b125c36238129f6f7b61954a1e7176148d5002e" - integrity sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.2" - -object.hasown@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.3.tgz#6a5f2897bb4d3668b8e79364f98ccf971bda55ae" - integrity sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA== - dependencies: - define-properties "^1.2.0" - es-abstract "^1.22.1" - -object.values@^1.1.6, object.values@^1.1.7: - version "1.2.0" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.2.0.tgz#65405a9d92cee68ac2d303002e0b8470a4d9ab1b" - integrity sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-object-atoms "^1.0.0" - -once@^1.3.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== - dependencies: - wrappy "1" - -optionator@^0.9.3: - version "0.9.3" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.3.tgz#007397d44ed1872fdc6ed31360190f81814e2c64" - integrity sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg== - dependencies: - "@aashutoshrathi/word-wrap" "^1.2.3" - deep-is "^0.1.3" - fast-levenshtein "^2.0.6" - levn "^0.4.1" - prelude-ls "^1.2.1" - type-check "^0.4.0" - -p-limit@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" - integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== - dependencies: - yocto-queue "^0.1.0" - -p-locate@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" - integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== - dependencies: - p-limit "^3.0.2" - -parent-module@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" - integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== - dependencies: - callsites "^3.0.0" - -path-exists@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" - integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== - -path-key@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" - integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== - -path-parse@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" - integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== - -path-scurry@^1.10.1: - version "1.10.1" - resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.10.1.tgz#9ba6bf5aa8500fe9fd67df4f0d9483b2b0bfc698" - integrity sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ== - dependencies: - lru-cache "^9.1.1 || ^10.0.0" - minipass "^5.0.0 || ^6.0.2 || ^7.0.0" - -path-type@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" - integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== - -picocolors@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" - integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== - -picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" - integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== - -pify@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" - integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== - -pirates@^4.0.1: - version "4.0.6" - resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9" - integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== - -possible-typed-array-names@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz#89bb63c6fada2c3e90adc4a647beeeb39cc7bf8f" - integrity sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q== - -postcss-import@^15.1.0: - version "15.1.0" - resolved "https://registry.yarnpkg.com/postcss-import/-/postcss-import-15.1.0.tgz#41c64ed8cc0e23735a9698b3249ffdbf704adc70" - integrity sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew== - dependencies: - postcss-value-parser "^4.0.0" - read-cache "^1.0.0" - resolve "^1.1.7" - -postcss-js@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-js/-/postcss-js-4.0.1.tgz#61598186f3703bab052f1c4f7d805f3991bee9d2" - integrity sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw== - dependencies: - camelcase-css "^2.0.1" - -postcss-load-config@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-4.0.2.tgz#7159dcf626118d33e299f485d6afe4aff7c4a3e3" - integrity sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ== - dependencies: - lilconfig "^3.0.0" - yaml "^2.3.4" - -postcss-nested@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/postcss-nested/-/postcss-nested-6.0.1.tgz#f83dc9846ca16d2f4fa864f16e9d9f7d0961662c" - integrity sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ== - dependencies: - postcss-selector-parser "^6.0.11" - -postcss-selector-parser@^6.0.11: - version "6.0.16" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz#3b88b9f5c5abd989ef4e2fc9ec8eedd34b20fb04" - integrity sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw== - dependencies: - cssesc "^3.0.0" - util-deprecate "^1.0.2" - -postcss-value-parser@^4.0.0, postcss-value-parser@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" - integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== - -postcss@8.4.31: - version "8.4.31" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.31.tgz#92b451050a9f914da6755af352bdc0192508656d" - integrity sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ== - dependencies: - nanoid "^3.3.6" - picocolors "^1.0.0" - source-map-js "^1.0.2" - -postcss@^8, postcss@^8.4.23: - version "8.4.38" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.38.tgz#b387d533baf2054288e337066d81c6bee9db9e0e" - integrity sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A== - dependencies: - nanoid "^3.3.7" - picocolors "^1.0.0" - source-map-js "^1.2.0" - -prelude-ls@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" - integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== - -prop-types@^15.8.1: - version "15.8.1" - resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" - integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== - dependencies: - loose-envify "^1.4.0" - object-assign "^4.1.1" - react-is "^16.13.1" - -punycode@^2.1.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" - integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== - -queue-microtask@^1.2.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" - integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== - -react-dom@^18: - version "18.2.0" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.2.0.tgz#22aaf38708db2674ed9ada224ca4aa708d821e3d" - integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g== - dependencies: - loose-envify "^1.1.0" - scheduler "^0.23.0" - -react-is@^16.13.1: - version "16.13.1" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" - integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== - -react@^18: - version "18.2.0" - resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5" - integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ== - dependencies: - loose-envify "^1.1.0" - -read-cache@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/read-cache/-/read-cache-1.0.0.tgz#e664ef31161166c9751cdbe8dbcf86b5fb58f774" - integrity sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA== - dependencies: - pify "^2.3.0" - -readdirp@~3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" - integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== - dependencies: - picomatch "^2.2.1" - -reflect.getprototypeof@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz#3ab04c32a8390b770712b7a8633972702d278859" - integrity sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.1" - es-errors "^1.3.0" - get-intrinsic "^1.2.4" - globalthis "^1.0.3" - which-builtin-type "^1.1.3" - -regenerator-runtime@^0.14.0: - version "0.14.1" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" - integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== - -regexp.prototype.flags@^1.5.2: - version "1.5.2" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz#138f644a3350f981a858c44f6bb1a61ff59be334" - integrity sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw== - dependencies: - call-bind "^1.0.6" - define-properties "^1.2.1" - es-errors "^1.3.0" - set-function-name "^2.0.1" - -resolve-from@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" - integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== - -resolve-pkg-maps@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz#616b3dc2c57056b5588c31cdf4b3d64db133720f" - integrity sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw== - -resolve@^1.1.7, resolve@^1.22.2, resolve@^1.22.4: - version "1.22.8" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" - integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== - dependencies: - is-core-module "^2.13.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -resolve@^2.0.0-next.5: - version "2.0.0-next.5" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.5.tgz#6b0ec3107e671e52b68cd068ef327173b90dc03c" - integrity sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA== - dependencies: - is-core-module "^2.13.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -reusify@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" - integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== - -rimraf@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" - integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== - dependencies: - glob "^7.1.3" - -run-parallel@^1.1.9: - version "1.2.0" - resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" - integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== - dependencies: - queue-microtask "^1.2.2" - -safe-array-concat@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.2.tgz#81d77ee0c4e8b863635227c721278dd524c20edb" - integrity sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q== - dependencies: - call-bind "^1.0.7" - get-intrinsic "^1.2.4" - has-symbols "^1.0.3" - isarray "^2.0.5" - -safe-regex-test@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.3.tgz#a5b4c0f06e0ab50ea2c395c14d8371232924c377" - integrity sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw== - dependencies: - call-bind "^1.0.6" - es-errors "^1.3.0" - is-regex "^1.1.4" - -scheduler@^0.23.0: - version "0.23.0" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.0.tgz#ba8041afc3d30eb206a487b6b384002e4e61fdfe" - integrity sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw== - dependencies: - loose-envify "^1.1.0" - -semver@^6.3.1: - version "6.3.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" - integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== - -semver@^7.5.4: - version "7.6.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.0.tgz#1a46a4db4bffcccd97b743b5005c8325f23d4e2d" - integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg== - dependencies: - lru-cache "^6.0.0" - -set-function-length@^1.2.1: - version "1.2.2" - resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" - integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== - dependencies: - define-data-property "^1.1.4" - es-errors "^1.3.0" - function-bind "^1.1.2" - get-intrinsic "^1.2.4" - gopd "^1.0.1" - has-property-descriptors "^1.0.2" - -set-function-name@^2.0.1, set-function-name@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.2.tgz#16a705c5a0dc2f5e638ca96d8a8cd4e1c2b90985" - integrity sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ== - dependencies: - define-data-property "^1.1.4" - es-errors "^1.3.0" - functions-have-names "^1.2.3" - has-property-descriptors "^1.0.2" - -shebang-command@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" - integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== - dependencies: - shebang-regex "^3.0.0" - -shebang-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" - integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== - -side-channel@^1.0.4, side-channel@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.6.tgz#abd25fb7cd24baf45466406b1096b7831c9215f2" - integrity sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA== - dependencies: - call-bind "^1.0.7" - es-errors "^1.3.0" - get-intrinsic "^1.2.4" - object-inspect "^1.13.1" - -signal-exit@^4.0.1: - version "4.1.0" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" - integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== - -slash@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" - integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== - -source-map-js@^1.0.2, source-map-js@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.0.tgz#16b809c162517b5b8c3e7dcd315a2a5c2612b2af" - integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg== - -streamsearch@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764" - integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== - -"string-width-cjs@npm:string-width@^4.2.0": - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string-width@^4.1.0: - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string-width@^5.0.1, string-width@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" - integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== - dependencies: - eastasianwidth "^0.2.0" - emoji-regex "^9.2.2" - strip-ansi "^7.0.1" - -string.prototype.matchall@^4.0.10: - version "4.0.11" - resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz#1092a72c59268d2abaad76582dccc687c0297e0a" - integrity sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.2" - es-errors "^1.3.0" - es-object-atoms "^1.0.0" - get-intrinsic "^1.2.4" - gopd "^1.0.1" - has-symbols "^1.0.3" - internal-slot "^1.0.7" - regexp.prototype.flags "^1.5.2" - set-function-name "^2.0.2" - side-channel "^1.0.6" - -string.prototype.trim@^1.2.9: - version "1.2.9" - resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz#b6fa326d72d2c78b6df02f7759c73f8f6274faa4" - integrity sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.0" - es-object-atoms "^1.0.0" - -string.prototype.trimend@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz#3651b8513719e8a9f48de7f2f77640b26652b229" - integrity sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-object-atoms "^1.0.0" - -string.prototype.trimstart@^1.0.7: - version "1.0.8" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz#7ee834dda8c7c17eff3118472bb35bfedaa34dde" - integrity sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-object-atoms "^1.0.0" - -"strip-ansi-cjs@npm:strip-ansi@^6.0.1": - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-ansi@^7.0.1: - version "7.1.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" - integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== - dependencies: - ansi-regex "^6.0.1" - -strip-bom@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== - -strip-json-comments@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" - integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== - -styled-jsx@5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/styled-jsx/-/styled-jsx-5.1.1.tgz#839a1c3aaacc4e735fed0781b8619ea5d0009d1f" - integrity sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw== - dependencies: - client-only "0.0.1" - -sucrase@^3.32.0: - version "3.35.0" - resolved "https://registry.yarnpkg.com/sucrase/-/sucrase-3.35.0.tgz#57f17a3d7e19b36d8995f06679d121be914ae263" - integrity sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA== - dependencies: - "@jridgewell/gen-mapping" "^0.3.2" - commander "^4.0.0" - glob "^10.3.10" - lines-and-columns "^1.1.6" - mz "^2.7.0" - pirates "^4.0.1" - ts-interface-checker "^0.1.9" - -supports-color@^7.1.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" - integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== - dependencies: - has-flag "^4.0.0" - -supports-preserve-symlinks-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" - integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== - -tailwindcss@^3.3.0: - version "3.4.1" - resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-3.4.1.tgz#f512ca5d1dd4c9503c7d3d28a968f1ad8f5c839d" - integrity sha512-qAYmXRfk3ENzuPBakNK0SRrUDipP8NQnEY6772uDhflcQz5EhRdD7JNZxyrFHVQNCwULPBn6FNPp9brpO7ctcA== - dependencies: - "@alloc/quick-lru" "^5.2.0" - arg "^5.0.2" - chokidar "^3.5.3" - didyoumean "^1.2.2" - dlv "^1.1.3" - fast-glob "^3.3.0" - glob-parent "^6.0.2" - is-glob "^4.0.3" - jiti "^1.19.1" - lilconfig "^2.1.0" - micromatch "^4.0.5" - normalize-path "^3.0.0" - object-hash "^3.0.0" - picocolors "^1.0.0" - postcss "^8.4.23" - postcss-import "^15.1.0" - postcss-js "^4.0.1" - postcss-load-config "^4.0.1" - postcss-nested "^6.0.1" - postcss-selector-parser "^6.0.11" - resolve "^1.22.2" - sucrase "^3.32.0" - -tapable@^2.2.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" - integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== - -text-table@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" - integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== - -thenify-all@^1.0.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" - integrity sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA== - dependencies: - thenify ">= 3.1.0 < 4" - -"thenify@>= 3.1.0 < 4": - version "3.3.1" - resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.3.1.tgz#8932e686a4066038a016dd9e2ca46add9838a95f" - integrity sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw== - dependencies: - any-promise "^1.0.0" - -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== - dependencies: - is-number "^7.0.0" - -ts-api-utils@^1.0.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.3.0.tgz#4b490e27129f1e8e686b45cc4ab63714dc60eea1" - integrity sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ== - -ts-interface-checker@^0.1.9: - version "0.1.13" - resolved "https://registry.yarnpkg.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz#784fd3d679722bc103b1b4b8030bcddb5db2a699" - integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA== - -tsconfig-paths@^3.15.0: - version "3.15.0" - resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz#5299ec605e55b1abb23ec939ef15edaf483070d4" - integrity sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg== - dependencies: - "@types/json5" "^0.0.29" - json5 "^1.0.2" - minimist "^1.2.6" - strip-bom "^3.0.0" - -tslib@^2.4.0: - version "2.6.2" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" - integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== - -type-check@^0.4.0, type-check@~0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" - integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== - dependencies: - prelude-ls "^1.2.1" - -type-fest@^0.20.2: - version "0.20.2" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" - integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== - -typed-array-buffer@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz#1867c5d83b20fcb5ccf32649e5e2fc7424474ff3" - integrity sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ== - dependencies: - call-bind "^1.0.7" - es-errors "^1.3.0" - is-typed-array "^1.1.13" - -typed-array-byte-length@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz#d92972d3cff99a3fa2e765a28fcdc0f1d89dec67" - integrity sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw== - dependencies: - call-bind "^1.0.7" - for-each "^0.3.3" - gopd "^1.0.1" - has-proto "^1.0.3" - is-typed-array "^1.1.13" - -typed-array-byte-offset@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz#f9ec1acb9259f395093e4567eb3c28a580d02063" - integrity sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA== - dependencies: - available-typed-arrays "^1.0.7" - call-bind "^1.0.7" - for-each "^0.3.3" - gopd "^1.0.1" - has-proto "^1.0.3" - is-typed-array "^1.1.13" - -typed-array-length@^1.0.5: - version "1.0.6" - resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.6.tgz#57155207c76e64a3457482dfdc1c9d1d3c4c73a3" - integrity sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g== - dependencies: - call-bind "^1.0.7" - for-each "^0.3.3" - gopd "^1.0.1" - has-proto "^1.0.3" - is-typed-array "^1.1.13" - possible-typed-array-names "^1.0.0" - -typescript@^5: - version "5.4.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.4.3.tgz#5c6fedd4c87bee01cd7a528a30145521f8e0feff" - integrity sha512-KrPd3PKaCLr78MalgiwJnA25Nm8HAmdwN3mYUYZgG/wizIo9EainNVQI9/yDavtVFRN2h3k8uf3GLHuhDMgEHg== - -unbox-primitive@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" - integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== - dependencies: - call-bind "^1.0.2" - has-bigints "^1.0.2" - has-symbols "^1.0.3" - which-boxed-primitive "^1.0.2" - -undici-types@~5.26.4: - version "5.26.5" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" - integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== - -update-browserslist-db@^1.0.13: - version "1.0.13" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz#3c5e4f5c083661bd38ef64b6328c26ed6c8248c4" - integrity sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg== - dependencies: - escalade "^3.1.1" - picocolors "^1.0.0" - -uri-js@^4.2.2: - version "4.4.1" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" - integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== - dependencies: - punycode "^2.1.0" - -util-deprecate@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== - -which-boxed-primitive@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" - integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== - dependencies: - is-bigint "^1.0.1" - is-boolean-object "^1.1.0" - is-number-object "^1.0.4" - is-string "^1.0.5" - is-symbol "^1.0.3" - -which-builtin-type@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/which-builtin-type/-/which-builtin-type-1.1.3.tgz#b1b8443707cc58b6e9bf98d32110ff0c2cbd029b" - integrity sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw== - dependencies: - function.prototype.name "^1.1.5" - has-tostringtag "^1.0.0" - is-async-function "^2.0.0" - is-date-object "^1.0.5" - is-finalizationregistry "^1.0.2" - is-generator-function "^1.0.10" - is-regex "^1.1.4" - is-weakref "^1.0.2" - isarray "^2.0.5" - which-boxed-primitive "^1.0.2" - which-collection "^1.0.1" - which-typed-array "^1.1.9" - -which-collection@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.2.tgz#627ef76243920a107e7ce8e96191debe4b16c2a0" - integrity sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw== - dependencies: - is-map "^2.0.3" - is-set "^2.0.3" - is-weakmap "^2.0.2" - is-weakset "^2.0.3" - -which-typed-array@^1.1.14, which-typed-array@^1.1.15, which-typed-array@^1.1.9: - version "1.1.15" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.15.tgz#264859e9b11a649b388bfaaf4f767df1f779b38d" - integrity sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA== - dependencies: - available-typed-arrays "^1.0.7" - call-bind "^1.0.7" - for-each "^0.3.3" - gopd "^1.0.1" - has-tostringtag "^1.0.2" - -which@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" - integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== - dependencies: - isexe "^2.0.0" - -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrap-ansi@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" - integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== - dependencies: - ansi-styles "^6.1.0" - string-width "^5.0.1" - strip-ansi "^7.0.1" - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== - -yallist@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" - integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== - -yaml@^2.3.4: - version "2.4.1" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.4.1.tgz#2e57e0b5e995292c25c75d2658f0664765210eed" - integrity sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg== - -yocto-queue@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" - integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== From bed6cdef6af96876ca3c7a3dbd5a11b7af69760e Mon Sep 17 00:00:00 2001 From: Dennis Garcia Date: Fri, 19 Apr 2024 16:46:45 -0500 Subject: [PATCH 12/42] Accounts Working With Native Code (#10) --- wasm/Cargo.toml | 11 +- wasm/js/db/accounts.js | 107 ++++- wasm/miden-client.toml | 11 + wasm/src/native_code/accounts.rs | 202 +++++---- wasm/src/native_code/chain_data.rs | 4 +- wasm/src/native_code/errors.rs | 434 +++++++++++++++++++ wasm/src/native_code/mod.rs | 28 +- wasm/src/native_code/notes.rs | 4 +- wasm/src/native_code/store/mod.rs | 152 ++++--- wasm/src/native_code/sync.rs | 4 +- wasm/src/native_code/transactions.rs | 4 +- wasm/src/web_client/account.rs | 169 ++++---- wasm/src/web_client/mod.rs | 19 +- wasm/src/web_client/store/accounts/mod.rs | 343 ++++++++------- wasm/src/web_client/store/accounts/models.rs | 30 +- wasm/src/web_client/store/accounts/utils.rs | 252 +++++------ wasm/src/web_client/store/mod.rs | 78 ++-- wasm/test.html | 73 +++- wasm/test_accounts/account0.mac | Bin 0 -> 337 bytes wasm/test_accounts/account1.mac | Bin 0 -> 1588 bytes wasm/yarn.lock | 2 +- yarn.lock | 4 + 22 files changed, 1281 insertions(+), 650 deletions(-) create mode 100644 wasm/miden-client.toml create mode 100644 wasm/src/native_code/errors.rs create mode 100644 wasm/test_accounts/account0.mac create mode 100644 wasm/test_accounts/account1.mac create mode 100644 yarn.lock diff --git a/wasm/Cargo.toml b/wasm/Cargo.toml index a12029dd1..ec2ac7343 100644 --- a/wasm/Cargo.toml +++ b/wasm/Cargo.toml @@ -13,19 +13,22 @@ concurrent = [ "miden-objects/concurrent", "miden-tx/concurrent", ] -default = ["miden-objects/serde"] +default = ["std"] +std = ["miden-objects/std"] [dependencies] async-trait = "0.1" +base64 = "0.13" futures = "0.3" getrandom = { version = "0.2", features = ["js"] } -miden-lib = { version = "0.2" } -miden-objects = { version = "0.2" } -miden-tx = { version = "0.2" } +miden-lib = { version = "0.2", default-features = false } +miden-objects = { version = "0.2", features = ["serde"] } +miden-tx = { version = "0.2", default-features = false } rand = { version = "0.8.5" } serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" serde-wasm-bindgen = "0.6.5" +tracing = { version = "0.1" } wasm-bindgen = { version = "0.2", features = ["serde-serialize"] } wasm-bindgen-futures = "0.4" web-sys = { version = "0.3", features = ["console"] } \ No newline at end of file diff --git a/wasm/js/db/accounts.js b/wasm/js/db/accounts.js index db8b992db..7bbedbd19 100644 --- a/wasm/js/db/accounts.js +++ b/wasm/js/db/accounts.js @@ -34,14 +34,20 @@ export async function getAccountStub( const mostRecentRecord = sortedRecords[0]; console.log('Most recent record found:', mostRecentRecord); - const account_seed_array_buffer = await data.account_seed.arrayBuffer(); + let accountSeedBase64 = null; + if (mostRecentRecord.accountSeed) { + // Ensure accountSeed is processed as a Uint8Array and converted to Base64 + let accountSeedArrayBuffer = await mostRecentRecord.accountSeed.arrayBuffer(); + let accountSeedArray = new Uint8Array(accountSeedArrayBuffer); + accountSeedBase64 = uint8ArrayToBase64(accountSeedArray); + } const accountStub = { - id: data.id, - nonce: data.nonce, - vault_root: data.vaultRoot, - storage_root: data.storageRoot, - code_root: data.codeRoot, - account_seed: new Uint8Array(account_seed_array_buffer) + id: mostRecentRecord.id, + nonce: mostRecentRecord.nonce, + vault_root: mostRecentRecord.vaultRoot, + storage_root: mostRecentRecord.storageRoot, + code_root: mostRecentRecord.codeRoot, + account_seed: accountSeedBase64 } return accountStub; } catch (error) { @@ -69,17 +75,27 @@ export async function getAllAccountStubs() { const latestRecords = Array.from(latestRecordsMap.values()); console.log('Latest account stub for each id:', latestRecords); - return latestRecords.map(record => { - // Convert fields as necessary, assuming account_seed is already in the correct format + const resultObject = await Promise.all(latestRecords.map(async record => { + let accountSeedBase64 = null; + if (record.accountSeed) { + // Ensure accountSeed is processed as a Uint8Array and converted to Base64 + let accountSeedArrayBuffer = await record.accountSeed.arrayBuffer(); + let accountSeedArray = new Uint8Array(accountSeedArrayBuffer); + accountSeedBase64 = uint8ArrayToBase64(accountSeedArray); + } + return { id: record.id, nonce: record.nonce, vault_root: record.vaultRoot, storage_root: record.storageRoot, code_root: record.codeRoot, - account_seed: record.account_seed // Adjust based on your actual data structure + account_seed: accountSeedBase64 // Now correctly formatted as Base64 }; - }); + })); + + console.log(resultObject[0]); + return resultObject; } catch (error) { console.error('Error fetching all latest account stubs:', error); throw error; @@ -107,10 +123,12 @@ export async function getAccountCode( // Convert the module Blob to an ArrayBuffer const moduleArrayBuffer = await codeRecord.module.arrayBuffer(); + const moduleArray = new Uint8Array(moduleArrayBuffer); + const moduleBase64 = uint8ArrayToBase64(moduleArray); return { root: codeRecord.root, procedures: codeRecord.procedures, - module: new Uint8Array(moduleArrayBuffer), + module: moduleBase64, }; } catch (error) { console.error('Error fetching code record:', error); @@ -164,13 +182,15 @@ export async function getAccountStorage( // The first record is the only one due to the uniqueness constraint const storageRecord = allMatchingRecords[0]; - console.log('Vault record found:', vaultRecord); + console.log('Storage record found:', storageRecord); // Convert the module Blob to an ArrayBuffer - const storageArrayBuffer = await storageRecord.storage.arrayBuffer(); + const storageArrayBuffer = await storageRecord.slots.arrayBuffer(); + const storageArray = new Uint8Array(storageArrayBuffer); + const storageBase64 = uint8ArrayToBase64(storageArray); return { root: storageRecord.root, - storage: storageArrayBuffer + storage: storageBase64 }; } catch (error) { console.error('Error fetching code record:', error); @@ -178,6 +198,39 @@ export async function getAccountStorage( } } +export async function getAccountAuth( + accountId +) { + try { + // Fetch all records matching the given id + const allMatchingRecords = await accountAuths + .where('accountId') + .equals(accountId) + .toArray(); + + if (allMatchingRecords.length === 0) { + console.log('No records found for given account ID.'); + return null; // No records found + } + + // The first record is the only one due to the uniqueness constraint + const authRecord = allMatchingRecords[0]; + console.log('Auth record found:', authRecord); + + // Convert the authInfo Blob to an ArrayBuffer + const authInfoArrayBuffer = await authRecord.authInfo.arrayBuffer(); + const authInfoArray = new Uint8Array(authInfoArrayBuffer); + const authInfoBase64 = uint8ArrayToBase64(authInfoArray); + return { + id: authRecord.accountId, + auth_info: authInfoBase64 + }; + } catch (err) { + console.error('Error fetching account auth:', error); + throw error; // Re-throw the error for further handling + } +} + export async function getAccountIds() { try { let allIds = new Set(); // Use a Set to ensure uniqueness @@ -214,7 +267,6 @@ export async function insertAccountCode( // Perform the insert using Dexie await accountCodes.add(data); - return `Successfully inserted code with root: ${codeRoot}`; } catch (error) { console.error(`Error inserting code with root: ${codeRoot}:`, error); throw error; // Rethrow the error to handle it further up the call chain if needed @@ -236,7 +288,6 @@ export async function insertAccountStorage( // Perform the insert using Dexie await accountStorages.add(data); - return `Successfully inserted storage with root: ${storageRoot}`; } catch (error) { console.error(`Error inserting storage with root: ${storageRoot}:`, error); throw error; // Rethrow the error to handle it further up the call chain if needed @@ -256,7 +307,6 @@ export async function insertAccountAssetVault( // Perform the insert using Dexie await accountVaults.add(data); - return `Successfully inserted vault with root: ${vaultRoot}`; } catch (error) { console.error(`Error inserting vault with root: ${vaultRoot}:`, error); throw error; // Rethrow the error to handle it further up the call chain if needed @@ -265,20 +315,19 @@ export async function insertAccountAssetVault( export async function insertAccountAuth( accountId, - auth + authInfo ) { try { - let authBlob = new Blob([auth]); + let authInfoBlob = new Blob([new Uint8Array(authInfo)]); // Prepare the data object to insert const data = { accountId: accountId, // Using accountId as the key - auth: authBlob, + authInfo: authInfoBlob, }; // Perform the insert using Dexie await accountAuths.add(data); - return `Successfully inserted auth for account: ${accountId}`; } catch (error) { console.error(`Error inserting auth for account: ${accountId}:`, error); throw error; // Rethrow the error to handle it further up the call chain if needed @@ -295,7 +344,13 @@ export async function insertAccountRecord( account_seed ) { try { - let accountSeedBlob = new Blob([account_seed]); + let accountSeedBlob = null; + console.log(account_seed); + if (account_seed) { + console.log(account_seed) + accountSeedBlob = new Blob([new Uint8Array(account_seed)]); + } + // Prepare the data object to insert const data = { @@ -310,9 +365,13 @@ export async function insertAccountRecord( // Perform the insert using Dexie await accounts.add(data); - return `Successfully inserted account: ${accountId}`; } catch (error) { console.error(`Error inserting account: ${accountId}:`, error); throw error; // Rethrow the error to handle it further up the call chain if needed } +} + +function uint8ArrayToBase64(bytes) { + const binary = bytes.reduce((acc, byte) => acc + String.fromCharCode(byte), ''); + return btoa(binary); } \ No newline at end of file diff --git a/wasm/miden-client.toml b/wasm/miden-client.toml new file mode 100644 index 000000000..5971457cb --- /dev/null +++ b/wasm/miden-client.toml @@ -0,0 +1,11 @@ +## USAGE: +## ================================================================================================ +# [rpc]: Settings for the RPC client used to communicate with the node +# - endpoint: tuple indicating the protocol (http, https), the host, and the port where the node is listening. +# [store]: Settings for the client's Store +# - database_filepath: path for the sqlite's database +[rpc] +endpoint = { protocol = "http", host = "localhost", port = 57291 } + +[store] +database_filepath = "store.sqlite3" \ No newline at end of file diff --git a/wasm/src/native_code/accounts.rs b/wasm/src/native_code/accounts.rs index 9d746054f..8f59cc11e 100644 --- a/wasm/src/native_code/accounts.rs +++ b/wasm/src/native_code/accounts.rs @@ -1,12 +1,18 @@ -// use miden_lib::AuthScheme; -// use miden_objects::{ -// accounts::{Account, AccountType}, -// assets::TokenSymbol, -// crypto::dsa::rpo_falcon512::KeyPair, -// Felt, Word, -// }; +use web_sys::console; +use wasm_bindgen::prelude::*; + +use miden_lib::AuthScheme; +use miden_objects::{ + accounts::{ + Account, AccountData, AccountId, AccountStorageType, AccountStub, AccountType, AuthData + }, assets::TokenSymbol, crypto::{ + dsa::rpo_falcon512::SecretKey, + rand::{FeltRng, RpoRandomCoin}, + }, Digest, Word +}; -use rand::{rngs::StdRng, Rng, SeedableRng}; +use crate::native_code::store::AuthInfo; +use crate::native_code::errors::ClientError; use super::{ rpc::NodeRpcClient, @@ -20,19 +26,30 @@ pub enum AccountTemplate { storage_mode: AccountStorageMode, }, FungibleFaucet { - //token_symbol: TokenSymbol, + token_symbol: TokenSymbol, decimals: u8, max_supply: u64, storage_mode: AccountStorageMode, }, } +// TODO: Review this enum and variant names to have a consistent naming across all crates +#[derive(Debug, Clone, Copy)] pub enum AccountStorageMode { Local, OnChain, } -impl Client { +impl From for AccountStorageType { + fn from(mode: AccountStorageMode) -> Self { + match mode { + AccountStorageMode::Local => AccountStorageType::OffChain, + AccountStorageMode::OnChain => AccountStorageType::OnChain, + } + } +} + +impl Client { // ACCOUNT CREATION // -------------------------------------------------------------------------------------------- @@ -40,23 +57,24 @@ impl Client { pub async fn new_account( &mut self, template: AccountTemplate, - ) -> String { // TODO: Replace with Result<(Account, Word), ()> - let mut rng = StdRng::from_entropy(); - - match template { + ) -> Result<(Account, Word), ClientError> { + let account_and_seed = match template { AccountTemplate::BasicWallet { mutable_code, storage_mode, - } => self.new_basic_wallet(mutable_code, &mut rng, storage_mode).await, + } => self.new_basic_wallet(mutable_code,storage_mode).await, AccountTemplate::FungibleFaucet { - //token_symbol, + token_symbol, decimals, max_supply, storage_mode, } => { - self.new_fungible_faucet(decimals, max_supply, &mut rng, storage_mode).await + todo!(); + //self.new_fungible_faucet(token_symbol, decimals, max_supply, storage_mode).await } - } + }?; + + Ok(account_and_seed) } /// Creates a new regular account and saves it in the store along with its seed and auth data @@ -68,49 +86,42 @@ impl Client { async fn new_basic_wallet( &mut self, mutable_code: bool, - rng: &mut StdRng, account_storage_mode: AccountStorageMode, - ) -> String { // TODO: Replace with Result<(Account, Word), ()> - - // if let AccountStorageMode::OnChain = account_storage_mode { - // todo!("Recording the account on chain is not supported yet"); - // } - - // let key_pair: KeyPair = KeyPair::new()?; - - // let auth_scheme: AuthScheme = AuthScheme::RpoFalcon512 { - // pub_key: key_pair.public_key(), - // }; - - // // we need to use an initial seed to create the wallet account - // let init_seed: [u8; 32] = rng.gen(); - - // let (account, seed) = if !mutable_code { - // miden_lib::accounts::wallets::create_basic_wallet( - // init_seed, - // auth_scheme, - // AccountType::RegularAccountImmutableCode, - // ) - // } else { - // miden_lib::accounts::wallets::create_basic_wallet( - // init_seed, - // auth_scheme, - // AccountType::RegularAccountUpdatableCode, - // ) - // }?; - - // self.insert_account(&account, Some(seed), &AuthInfo::RpoFalcon512(key_pair))?; - // Ok((account, seed)) - - "Called new_basic_wallet".to_string() + ) -> Result<(Account, Word), ClientError> { + let key_pair = SecretKey::with_rng(&mut self.rng); + + let auth_scheme: AuthScheme = AuthScheme::RpoFalcon512 { pub_key: key_pair.public_key() }; + + // we need to use an initial seed to create the wallet account + let mut init_seed = [0u8; 32]; + self.rng.fill_bytes(&mut init_seed); + + let (account, seed) = if !mutable_code { + miden_lib::accounts::wallets::create_basic_wallet( + init_seed, + auth_scheme, + AccountType::RegularAccountImmutableCode, + account_storage_mode.into(), + ) + } else { + miden_lib::accounts::wallets::create_basic_wallet( + init_seed, + auth_scheme, + AccountType::RegularAccountUpdatableCode, + account_storage_mode.into(), + ) + }?; + + let _ = self.insert_account(&account, Some(seed), &AuthInfo::RpoFalcon512(key_pair)).await; + + Ok((account, seed)) } async fn new_fungible_faucet( &mut self, - //token_symbol: TokenSymbol, + token_symbol: TokenSymbol, decimals: u8, max_supply: u64, - rng: &mut StdRng, account_storage_mode: AccountStorageMode, ) -> String{ // TODO: Replace with Result<(Account, Word), ()> @@ -142,40 +153,79 @@ impl Client { "Called new_fungible_faucet".to_string() } + pub async fn import_account( + &mut self, + account_data: AccountData + ) -> Result<(), ()> { + match account_data.auth { + AuthData::RpoFalcon512Seed(key_pair_seed) => { + // NOTE: The seed should probably come from a different format from miden-base's AccountData + let seed = Digest::try_from(&key_pair_seed).unwrap().into(); + let mut rng = RpoRandomCoin::new(seed); + + let key_pair = SecretKey::with_rng(&mut rng); + + let account_seed = if !account_data.account.is_new() + && account_data.account_seed.is_some() + { + tracing::warn!("Imported an existing account and still provided a seed when it is not needed. It's possible that the account's file was incorrectly generated. The seed will be ignored."); + // Ignore the seed since it's not a new account + + // TODO: The alternative approach to this is to store the seed anyway, but + // ignore it at the point of executing against this transaction, but that + // approach seems a little bit more incorrect + None + } else { + account_data.account_seed + }; + + self.insert_account( + &account_data.account, + account_seed, + &AuthInfo::RpoFalcon512(key_pair), + ).await + }, + } + } + + pub async fn insert_account( + &mut self, + account: &Account, + account_seed: Option, + auth_info: &AuthInfo, + ) -> Result<(), ()> { + if account.is_new() && account_seed.is_none() { + return Err(()); + } + + self.store + .insert_account(account, account_seed, auth_info).await + } + pub async fn get_accounts( &mut self - ) -> String { // TODO: Replace with Result)>, ()> - // self.store.get_account_stubs().map_err(|err| err.into()) - - "Called get_accounts".to_string() + ) -> Result)>, ()> { + self.store.get_account_stubs().await } pub async fn get_account( &mut self, - account_id: String // TODO: Replace with AccountId - ) -> String { // TODO: Replace with Result<(Account, Option), ()> - // self.store.get_account(account_id).map_err(|err| err.into()) - - "Called get_account".to_string() + account_id: AccountId + ) -> Result<(Account, Option), ()> { + self.store.get_account(account_id).await } pub async fn get_account_stub_by_id( - &self, - account_id: String, // TODO: Replace with AccountId - ) -> String { // TODO: Replace with Result<(AccountStub, Option), ()> - //self.store.get_account_stub(account_id).map_err(|err| err.into()) - - "Called get_account_stub_by_id".to_string() + &mut self, + account_id: AccountId, + ) -> Result<(AccountStub, Option), ()> { + self.store.get_account_stub(account_id).await } pub async fn get_account_auth( &mut self, - account_id: String // TODO: Replace with AccountId - ) -> String { // TODO: Replace with Result - // self.store.get_account_auth(account_id).map_err(|err| err.into()) - - "Called get_account_auth".to_string() + account_id: AccountId + ) -> Result { + self.store.get_account_auth(account_id).await } - - // TODO: Import Account } diff --git a/wasm/src/native_code/chain_data.rs b/wasm/src/native_code/chain_data.rs index 7c603e9ec..61782a487 100644 --- a/wasm/src/native_code/chain_data.rs +++ b/wasm/src/native_code/chain_data.rs @@ -1,10 +1,12 @@ +use miden_objects::crypto::rand::FeltRng; + use super::{ rpc::NodeRpcClient, Client, store::Store // TODO: Add AuthInfo }; -impl Client { +impl Client { pub async fn get_block_headers( &self, block_numbers: &[u32], diff --git a/wasm/src/native_code/errors.rs b/wasm/src/native_code/errors.rs new file mode 100644 index 000000000..47d9ffd24 --- /dev/null +++ b/wasm/src/native_code/errors.rs @@ -0,0 +1,434 @@ +use core::fmt; + +use miden_objects::{ + accounts::AccountId, crypto::merkle::MmrError, notes::NoteId, AccountError, AssetError, + AssetVaultError, Digest, NoteError, TransactionScriptError, +}; +use miden_tx::{ + utils::{DeserializationError, HexParseError}, + DataStoreError, TransactionExecutorError, TransactionProverError, +}; + +// CLIENT ERROR +// ================================================================================================ + +#[derive(Debug)] +pub enum ClientError { + AccountError(AccountError), + AssetError(AssetError), + DataDeserializationError(DeserializationError), + HexParseError(HexParseError), + ImportNewAccountWithoutSeed, + MissingOutputNotes(Vec), + NoteError(NoteError), + NoConsumableNoteForAccount(AccountId), + NodeRpcClientError(NodeRpcClientError), + ScreenerError(ScreenerError), + StoreError(StoreError), + TransactionExecutionError(TransactionExecutorError), + TransactionProvingError(TransactionProverError), +} + +impl fmt::Display for ClientError { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + ClientError::AccountError(err) => write!(f, "account error: {err}"), + ClientError::DataDeserializationError(err) => { + write!(f, "data deserialization error: {err}") + }, + ClientError::AssetError(err) => write!(f, "asset error: {err}"), + ClientError::HexParseError(err) => write!(f, "error turning array to Digest: {err}"), + ClientError::ImportNewAccountWithoutSeed => write!( + f, + "import account error: can't import a new account without its initial seed" + ), + ClientError::MissingOutputNotes(note_ids) => { + write!( + f, + "transaction error: The transaction did not produce expected Note IDs: {}", + note_ids.iter().map(|&id| id.to_hex()).collect::>().join(", ") + ) + }, + ClientError::NoConsumableNoteForAccount(account_id) => { + write!(f, "No consumable note for account ID {}", account_id) + }, + ClientError::NoteError(err) => write!(f, "note error: {err}"), + ClientError::NodeRpcClientError(err) => write!(f, "rpc api error: {err}"), + ClientError::ScreenerError(err) => write!(f, "note screener error: {err}"), + ClientError::StoreError(err) => write!(f, "store error: {err}"), + ClientError::TransactionExecutionError(err) => { + write!(f, "transaction executor error: {err}") + }, + ClientError::TransactionProvingError(err) => { + write!(f, "transaction prover error: {err}") + }, + } + } +} + +// CONVERSIONS +// ================================================================================================ + +impl From for ClientError { + fn from(err: AccountError) -> Self { + Self::AccountError(err) + } +} + +impl From for ClientError { + fn from(err: DeserializationError) -> Self { + Self::DataDeserializationError(err) + } +} + +impl From for ClientError { + fn from(err: HexParseError) -> Self { + Self::HexParseError(err) + } +} + +impl From for ClientError { + fn from(err: NoteError) -> Self { + Self::NoteError(err) + } +} + +impl From for ClientError { + fn from(err: NodeRpcClientError) -> Self { + Self::NodeRpcClientError(err) + } +} + +impl From for ClientError { + fn from(err: StoreError) -> Self { + Self::StoreError(err) + } +} + +impl From for ClientError { + fn from(err: TransactionExecutorError) -> Self { + Self::TransactionExecutionError(err) + } +} + +impl From for ClientError { + fn from(err: TransactionProverError) -> Self { + Self::TransactionProvingError(err) + } +} + +impl From for ClientError { + fn from(err: ScreenerError) -> Self { + Self::ScreenerError(err) + } +} + +impl From for String { + fn from(err: ClientError) -> String { + err.to_string() + } +} + +#[cfg(feature = "std")] +impl std::error::Error for ClientError {} + +// STORE ERROR +// ================================================================================================ + +#[derive(Debug)] +pub enum StoreError { + AssetVaultError(AssetVaultError), + AccountCodeDataNotFound(Digest), + AccountDataNotFound(AccountId), + AccountError(AccountError), + AccountHashMismatch(AccountId), + AccountStorageNotFound(Digest), + BlockHeaderNotFound(u32), + ChainMmrNodeNotFound(u64), + DatabaseError(String), + DataDeserializationError(DeserializationError), + HexParseError(HexParseError), + InputNoteNotFound(NoteId), + InputSerializationError(serde_json::Error), + JsonDataDeserializationError(serde_json::Error), + MmrError(MmrError), + NoteInclusionProofError(NoteError), + NoteTagAlreadyTracked(u64), + ParsingError(String), + QueryError(String), + TransactionScriptError(TransactionScriptError), + VaultDataNotFound(Digest), +} + +impl From for StoreError { + fn from(value: AssetVaultError) -> Self { + StoreError::AssetVaultError(value) + } +} + +impl From for StoreError { + fn from(value: AccountError) -> Self { + StoreError::AccountError(value) + } +} + +impl From for StoreError { + fn from(value: DeserializationError) -> Self { + StoreError::DataDeserializationError(value) + } +} + +impl From for StoreError { + fn from(value: HexParseError) -> Self { + StoreError::HexParseError(value) + } +} + +impl From for StoreError { + fn from(value: MmrError) -> Self { + StoreError::MmrError(value) + } +} + +impl From for StoreError { + fn from(value: NoteError) -> Self { + StoreError::NoteInclusionProofError(value) + } +} + +impl From for StoreError { + fn from(value: TransactionScriptError) -> Self { + StoreError::TransactionScriptError(value) + } +} + +impl fmt::Display for StoreError { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + use StoreError::*; + match self { + AssetVaultError(err) => { + write!(f, "asset vault with root {} not found", err) + }, + AccountCodeDataNotFound(root) => { + write!(f, "account code data with root {} not found", root) + }, + AccountDataNotFound(account_id) => { + write!(f, "Account data was not found for Account Id {account_id}") + }, + AccountError(err) => write!(f, "error instantiating Account: {err}"), + AccountHashMismatch(account_id) => { + write!(f, "account hash mismatch for account {account_id}") + }, + AccountStorageNotFound(root) => { + write!(f, "account storage data with root {} not found", root) + }, + BlockHeaderNotFound(block_number) => { + write!(f, "block header for block {} not found", block_number) + }, + ChainMmrNodeNotFound(node_index) => { + write!(f, "chain mmr node at index {} not found", node_index) + }, + DatabaseError(err) => write!(f, "database-related non-query error: {err}"), + DataDeserializationError(err) => { + write!(f, "error deserializing data from the store: {err}") + }, + HexParseError(err) => { + write!(f, "error parsing hex: {err}") + }, + InputNoteNotFound(note_id) => { + write!(f, "input note with note id {} not found", note_id.inner()) + }, + InputSerializationError(err) => { + write!(f, "error trying to serialize inputs for the store: {err}") + }, + JsonDataDeserializationError(err) => { + write!(f, "error deserializing data from JSON from the store: {err}") + }, + MmrError(err) => write!(f, "error constructing mmr: {err}"), + NoteTagAlreadyTracked(tag) => write!(f, "note tag {} is already being tracked", tag), + NoteInclusionProofError(error) => { + write!(f, "inclusion proof creation error: {}", error) + }, + ParsingError(err) => { + write!(f, "failed to parse data retrieved from the database: {err}") + }, + QueryError(err) => write!(f, "failed to retrieve data from the database: {err}"), + TransactionScriptError(err) => { + write!(f, "error instantiating transaction script: {err}") + }, + VaultDataNotFound(root) => write!(f, "account vault data for root {} not found", root), + } + } +} + +impl From for DataStoreError { + fn from(value: StoreError) -> Self { + match value { + StoreError::AccountDataNotFound(account_id) => { + DataStoreError::AccountNotFound(account_id) + }, + StoreError::BlockHeaderNotFound(block_num) => DataStoreError::BlockNotFound(block_num), + StoreError::InputNoteNotFound(note_id) => DataStoreError::NoteNotFound(note_id), + err => DataStoreError::InternalError(err.to_string()), + } + } +} + +#[cfg(feature = "std")] +impl std::error::Error for StoreError {} + +// API CLIENT ERROR +// ================================================================================================ + +#[derive(Debug)] +pub enum NodeRpcClientError { + ConnectionError(String), + ConversionFailure(String), + DeserializationError(DeserializationError), + ExpectedFieldMissing(String), + InvalidAccountReceived(String), + NoteError(NoteError), + RequestError(String, String), +} + +impl fmt::Display for NodeRpcClientError { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + NodeRpcClientError::ConnectionError(err) => { + write!(f, "failed to connect to the API server: {err}") + }, + NodeRpcClientError::ConversionFailure(err) => { + write!(f, "failed to convert RPC data: {err}") + }, + NodeRpcClientError::DeserializationError(err) => { + write!(f, "failed to deserialize RPC data: {err}") + }, + NodeRpcClientError::ExpectedFieldMissing(err) => { + write!(f, "rpc API response missing an expected field: {err}") + }, + NodeRpcClientError::InvalidAccountReceived(account_error) => { + write!(f, "rpc API response contained an invalid account: {account_error}") + }, + NodeRpcClientError::NoteError(err) => { + write!(f, "rpc API note failed to validate: {err}") + }, + NodeRpcClientError::RequestError(endpoint, err) => { + write!(f, "rpc request failed for {endpoint}: {err}") + }, + } + } +} + +impl From for NodeRpcClientError { + fn from(err: AccountError) -> Self { + Self::InvalidAccountReceived(err.to_string()) + } +} + +impl From for NodeRpcClientError { + fn from(err: DeserializationError) -> Self { + Self::DeserializationError(err) + } +} + +impl From for NodeRpcClientError { + fn from(err: NoteError) -> Self { + Self::NoteError(err) + } +} + +// NOTE ID PREFIX FETCH ERROR +// ================================================================================================ + +/// Error when Looking for a specific note ID from a partial ID +#[derive(Debug, Eq, PartialEq)] +pub enum NoteIdPrefixFetchError { + NoMatch(String), + MultipleMatches(String), +} + +impl fmt::Display for NoteIdPrefixFetchError { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + NoteIdPrefixFetchError::NoMatch(note_id) => { + write!(f, "No matches were found with the input prefix {note_id}.") + }, + NoteIdPrefixFetchError::MultipleMatches(note_id) => { + write!( + f, + "found more than one note for the provided ID {note_id} and only one match is expected." + ) + }, + } + } +} + +// NOTE SCREENER ERROR +// ================================================================================================ + +/// Error when screening notes to check relevance to a client +#[derive(Debug)] +pub enum ScreenerError { + InvalidNoteInputsError(InvalidNoteInputsError), + StoreError(StoreError), +} + +impl From for ScreenerError { + fn from(error: InvalidNoteInputsError) -> Self { + Self::InvalidNoteInputsError(error) + } +} + +impl From for ScreenerError { + fn from(error: StoreError) -> Self { + Self::StoreError(error) + } +} + +impl fmt::Display for ScreenerError { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + ScreenerError::InvalidNoteInputsError(note_inputs_err) => { + write!(f, "error while processing note inputs: {note_inputs_err}") + }, + ScreenerError::StoreError(store_error) => { + write!(f, "error while fetching data from the store: {store_error}") + }, + } + } +} + +#[derive(Debug)] +pub enum InvalidNoteInputsError { + AccountError(NoteId, AccountError), + AssetError(NoteId, AssetError), + NumInputsError(NoteId, usize), + BlockNumberError(NoteId, u64), +} + +impl fmt::Display for InvalidNoteInputsError { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + InvalidNoteInputsError::AccountError(note_id, account_error) => { + write!(f, "account error for note with ID {}: {account_error}", note_id.to_hex()) + }, + InvalidNoteInputsError::AssetError(note_id, asset_error) => { + write!(f, "asset error for note with ID {}: {asset_error}", note_id.to_hex()) + }, + InvalidNoteInputsError::NumInputsError(note_id, expected_num_inputs) => { + write!( + f, + "expected {expected_num_inputs} note inputs for note with ID {}", + note_id.to_hex() + ) + }, + InvalidNoteInputsError::BlockNumberError(note_id, read_height) => { + write!( + f, + "note input representing block with value {read_height} for note with ID {}", + note_id.to_hex() + ) + }, + } + } +} diff --git a/wasm/src/native_code/mod.rs b/wasm/src/native_code/mod.rs index d9a899ed8..a6ad1cb3c 100644 --- a/wasm/src/native_code/mod.rs +++ b/wasm/src/native_code/mod.rs @@ -1,9 +1,17 @@ + +use miden_objects::{ + crypto::rand::{FeltRng, RpoRandomCoin}, + Felt +}; +use rand::{rngs::StdRng, Rng, SeedableRng}; + pub mod accounts; pub mod notes; pub mod transactions; pub mod sync; pub mod chain_data; pub mod utils; +pub mod errors; pub mod store; use store::Store; @@ -19,22 +27,34 @@ use rpc::NodeRpcClient; // TODO: Remove pub from store field // TODO: Add back generic type for NodeRpcClient and get example working in browser // TODO: Add back generic type for DataStore and get example working in browser -pub struct Client { +pub struct Client { pub store: S, + pub rng: R, pub rpc_api: N, // pub tx_executor: TransactionExecutor> } -impl Client { +impl Client { pub fn new( - api: N, + api: N, + rng: R, store: S, //executor_store: S ) -> Self { Self { - rpc_api: api, store: store, + rng: rng, + rpc_api: api, // tx_executor: TransactionExecutor::new(ClientDataStore::new(executor_store)) } } +} + +/// Gets [RpoRandomCoin] from the client +pub fn get_random_coin() -> RpoRandomCoin { + // TODO: Initialize coin status once along with the client and persist status for retrieval + let mut rng = StdRng::from_entropy(); + let coin_seed: [u64; 4] = rng.gen(); + + RpoRandomCoin::new(coin_seed.map(Felt::new)) } \ No newline at end of file diff --git a/wasm/src/native_code/notes.rs b/wasm/src/native_code/notes.rs index 52f062612..a27771086 100644 --- a/wasm/src/native_code/notes.rs +++ b/wasm/src/native_code/notes.rs @@ -1,3 +1,5 @@ +use miden_objects::crypto::rand::FeltRng; + use crate::native_code::store::NativeNoteFilter; use super::{ @@ -6,7 +8,7 @@ use super::{ store::Store // TODO: Add AuthInfo }; -impl Client { +impl Client { // INPUT NOTE DATA RETRIEVAL // -------------------------------------------------------------------------------------------- diff --git a/wasm/src/native_code/store/mod.rs b/wasm/src/native_code/store/mod.rs index a698040f3..09ed52645 100644 --- a/wasm/src/native_code/store/mod.rs +++ b/wasm/src/native_code/store/mod.rs @@ -1,9 +1,9 @@ -// use miden_objects::{ -// accounts::Account, -// crypto::dsa::rpo_falcon512::KeyPair, -// Word, -// }; -// use miden_tx::utils::{ByteReader, ByteWriter, Deserializable, DeserializationError, Serializable}; +use miden_objects::{ + accounts::{Account, AccountId, AccountStub}, + crypto::dsa::rpo_falcon512::SecretKey, + Felt, Word, +}; +use miden_tx::utils::{ByteReader, ByteWriter, Deserializable, DeserializationError, Serializable}; use async_trait::async_trait; @@ -105,35 +105,35 @@ pub trait Store { // ACCOUNTS // -------------------------------------------------------------------------------------------- - // async fn get_account_ids( - // &self - // ) -> Result, ()>; + async fn get_account_ids( + &mut self + ) -> Result, ()>; - // async fn get_account_stubs( - // &self - // ) -> Result)>, ()>; + async fn get_account_stubs( + &mut self + ) -> Result)>, ()>; - // async fn get_account_stub( - // &self, - // account_id: AccountId, - // ) -> Result<(AccountStub, Option), ()>; + async fn get_account_stub( + &mut self, + account_id: AccountId, + ) -> Result<(AccountStub, Option), ()>; - // async fn get_account( - // &self, - // account_id: AccountId, - // ) -> Result<(Account, Option), ()>; + async fn get_account( + &mut self, + account_id: AccountId, + ) -> Result<(Account, Option), ()>; - // async fn get_account_auth( - // &self, - // account_id: AccountId, - // ) -> Result; + async fn get_account_auth( + &mut self, + account_id: AccountId, + ) -> Result; - // async fn insert_account( - // &mut self, - // account: &Account, - // account_seed: Option, - // auth_info: &AuthInfo, - // ) -> Result<(), ()>; + async fn insert_account( + &mut self, + account: &Account, + account_seed: Option, + auth_info: &AuthInfo, + ) -> Result<(), ()>; // NOTES // -------------------------------------------------------------------------------------------- @@ -166,49 +166,61 @@ pub trait Store { // DATABASE AUTH INFO // ================================================================================================ -// #[derive(Debug)] -// pub enum AuthInfo { -// RpoFalcon512(KeyPair), -// } - -// const RPO_FALCON512_AUTH: u8 = 0; +/// Represents the types of authentication information of accounts +#[derive(Debug)] +pub enum AuthInfo { + RpoFalcon512(SecretKey), +} -// impl AuthInfo { -// /// Returns byte identifier of specific AuthInfo -// const fn type_byte(&self) -> u8 { -// match self { -// AuthInfo::RpoFalcon512(_) => RPO_FALCON512_AUTH, -// } -// } -// } +const RPO_FALCON512_AUTH: u8 = 0; + +impl AuthInfo { + /// Returns byte identifier of specific AuthInfo + const fn type_byte(&self) -> u8 { + match self { + AuthInfo::RpoFalcon512(_) => RPO_FALCON512_AUTH, + } + } + + /// Returns the authentication information as a tuple of (key, value) + /// that can be input to the advice map at the moment of transaction execution. + pub fn into_advice_inputs(self) -> (Word, Vec) { + match self { + AuthInfo::RpoFalcon512(key) => { + let pub_key: Word = key.public_key().into(); + let mut pk_sk_bytes = key.to_bytes(); + pk_sk_bytes.append(&mut pub_key.to_bytes()); + + (pub_key, pk_sk_bytes.iter().map(|a| Felt::new(*a as u64)).collect::>()) + }, + } + } +} -// impl Serializable for AuthInfo { -// fn write_into( -// &self, -// target: &mut W, -// ) { -// let mut bytes = vec![self.type_byte()]; -// match self { -// AuthInfo::RpoFalcon512(key_pair) => { -// bytes.append(&mut key_pair.to_bytes()); -// target.write_bytes(&bytes); -// }, -// } -// } -// } +impl Serializable for AuthInfo { + fn write_into(&self, target: &mut W) { + let mut bytes = vec![self.type_byte()]; + match self { + AuthInfo::RpoFalcon512(key_pair) => { + bytes.append(&mut key_pair.to_bytes()); + target.write_bytes(&bytes); + }, + } + } +} -// impl Deserializable for AuthInfo { -// fn read_from(source: &mut R) -> Result { -// let auth_type: u8 = source.read_u8()?; -// match auth_type { -// RPO_FALCON512_AUTH => { -// let key_pair = KeyPair::read_from(source)?; -// Ok(AuthInfo::RpoFalcon512(key_pair)) -// }, -// val => Err(DeserializationError::InvalidValue(val.to_string())), -// } -// } -// } +impl Deserializable for AuthInfo { + fn read_from(source: &mut R) -> Result { + let auth_type: u8 = source.read_u8()?; + match auth_type { + RPO_FALCON512_AUTH => { + let key_pair = SecretKey::read_from(source)?; + Ok(AuthInfo::RpoFalcon512(key_pair)) + }, + val => Err(DeserializationError::InvalidValue(val.to_string())), + } + } +} // pub enum ChainMmrNodeFilter<'a> { // /// Return all nodes. diff --git a/wasm/src/native_code/sync.rs b/wasm/src/native_code/sync.rs index 08bf1158f..488a89375 100644 --- a/wasm/src/native_code/sync.rs +++ b/wasm/src/native_code/sync.rs @@ -1,3 +1,5 @@ +use miden_objects::crypto::rand::FeltRng; + use super::{ rpc::NodeRpcClient, Client, @@ -11,7 +13,7 @@ pub enum SyncStatus { pub const FILTER_ID_SHIFT: u8 = 48; -impl Client { +impl Client { // pub async fn get_sync_height( // &self, // ) -> Result { diff --git a/wasm/src/native_code/transactions.rs b/wasm/src/native_code/transactions.rs index 078caae04..40f5aec27 100644 --- a/wasm/src/native_code/transactions.rs +++ b/wasm/src/native_code/transactions.rs @@ -1,3 +1,5 @@ +use miden_objects::crypto::rand::FeltRng; + use super::{ rpc::NodeRpcClient, Client, @@ -164,7 +166,7 @@ use super::{ // } // } -impl Client { +impl Client { pub async fn get_transactions( &mut self, filter: NativeTransactionFilter, diff --git a/wasm/src/web_client/account.rs b/wasm/src/web_client/account.rs index 33b9aad84..7fb116b3b 100644 --- a/wasm/src/web_client/account.rs +++ b/wasm/src/web_client/account.rs @@ -1,10 +1,13 @@ use super::WebClient; -//use miden_objects::{accounts::AccountId}; +use base64::encode; +use miden_objects::{accounts::{AccountData, AccountId}, assets::TokenSymbol}; +use miden_tx::utils::{Deserializable, Serializable}; use crate::native_code::accounts; use crate::native_code::rpc::NodeRpcClient; use crate::native_code::store::Store; +use crate::native_code::store::AuthInfo; use serde::{Serialize, Deserialize}; use serde_wasm_bindgen::from_value; @@ -17,9 +20,9 @@ pub enum AccountTemplate { BasicImmutable, BasicMutable, FungibleFaucet { - //token_symbol: TokenSymbol, - decimals: u8, - max_supply: u64 + token_symbol: String, + decimals: String, // u8 + max_supply: String // u64 }, NonFungibleFaucet, } @@ -44,10 +47,35 @@ impl WebClient { } } + pub async fn import_account( + &mut self, + account_bytes: JsValue + ) -> Result { + if let Some(ref mut client) = self.get_mut_inner() { + let account_bytes_result: Vec = from_value(account_bytes).unwrap(); + let account_data = AccountData::read_from_bytes(&account_bytes_result).map_err(|err| err.to_string())?; + let account_id = account_data.account.id().to_string(); + + match client.import_account(account_data).await { + Ok(_) => { + let message = format!("Import account with ID: {}", account_id); + Ok(JsValue::from_str(&message)) + }, + Err(err) => { + let error_message = format!("Failed to import account: {:?}", err); + Err(JsValue::from_str(&error_message)) + + } + } + } else { + Err(JsValue::from_str("Client not initialized")) + } + } + pub async fn new_account( &mut self, template: JsValue - ) -> () { + ) -> Result { if let Some(ref mut client) = self.get_mut_inner() { let account_template_result: Result = from_value(template); match account_template_result { @@ -62,131 +90,104 @@ impl WebClient { storage_mode: accounts::AccountStorageMode::Local, }, AccountTemplate::FungibleFaucet { - //token_symbol, + token_symbol, decimals, max_supply, } => accounts::AccountTemplate::FungibleFaucet { - // token_symbol: TokenSymbol::new(token_symbol) - // .map_err(|err| format!("error: token symbol is invalid: {}", err))?, - decimals: decimals, - max_supply: max_supply, + token_symbol: TokenSymbol::new(&token_symbol).unwrap(), + decimals: decimals.parse::().unwrap(), + max_supply: max_supply.parse::().unwrap(), storage_mode: accounts::AccountStorageMode::Local, }, AccountTemplate::NonFungibleFaucet => todo!(), }; - - // TODO: uncomment this when the Falcon library Rust implementation - // is completed by the miden team - - // match client.new_account(client_template).await { - // Ok((account, word)) => { - // // Create a struct or tuple to hold both values - // let result = (account, word); - // // Convert directly to JsValue - // serde_wasm_bindgen::to_value(&result).map_err(|e| JsValue::from_str(&e.to_string())) - // }, - // Err(err) => Err(JsValue::from_str(&err)), - // } - - // TODO: remove this when the Falcon library Rust implementation - // is completed by the miden team - - let message = client.new_account(client_template).await; - let js_value_message = JsValue::from_str(&message); - - // Print the message to the Chrome console - console::log_1(&js_value_message); + + match client.new_account(client_template).await { + Ok((account, word)) => { + // Create a struct or tuple to hold both values + let result = (account, word); + // Convert directly to JsValue + serde_wasm_bindgen::to_value(&result).map_err(|e| JsValue::from_str(&e.to_string())) + }, + Err(err) => { + let error_message = format!("Failed to create new account: {:?}", err); + Err(JsValue::from_str(&error_message)) + } + } }, Err(e) => { - // Error handling: log the error message to the browser's console let error_message = format!("Failed to parse AccountTemplate: {:?}", e); - console::error_1(&error_message.into()); + Err(JsValue::from_str(&error_message)) } } } else { - console::error_1(&"Client not initialized".into()); + Err(JsValue::from_str("Client not initialized")) } } pub async fn get_accounts( &mut self - ) -> () { + ) -> Result { if let Some(ref mut client) = self.get_mut_inner() { - let message = client.get_accounts().await; - let js_value_message = JsValue::from_str(&message); - - // Print the message to the Chrome console - console::log_1(&js_value_message); + let account_tuples = client.get_accounts().await.unwrap(); + let accounts: Vec = account_tuples.into_iter().map(|(account, word)| { + let word = word.map_or("No word".to_string(), |w| w[0].to_string()); + format!("ID: {}, Word: {}", account.id().to_string(), word) + }).collect(); + + // Convert the Vec to JsValue + serde_wasm_bindgen::to_value(&accounts).map_err(|e| JsValue::from_str(&e.to_string())) } else { - console::error_1(&"Client not initialized".into()); + Err(JsValue::from_str("Client not initialized")) } } pub async fn get_account( &mut self, - account_id: String // TODO: Replace with AccountId - ) -> () { + account_id: String + ) -> Result { if let Some(ref mut client) = self.get_mut_inner() { - // let native_account_id = AccountId::from_hex(account_id).map_err(|err| { - // let error_message = err.to_string(); - // let js_value_error_message = JsValue::from_str(&error_message); + let native_account_id = AccountId::from_hex(&account_id).unwrap(); - // console::log_1(&js_value_error_message); - // }); + let result = client.get_account(native_account_id).await.unwrap(); - let message = client.get_account(account_id).await; - let js_value_message = JsValue::from_str(&message); - - // Print the message to the Chrome console - console::log_1(&js_value_message); + let word = result.1.map_or("No word".to_string(), |w| w[0].to_string()); + Ok(JsValue::from_str(&format!("ID: {}, Word: {}", result.0.id().to_string(), word))) } else { - console::error_1(&"Client not initialized".into()); + Err(JsValue::from_str("Client not initialized")) } } pub async fn get_account_stub_by_id( &mut self, - account_id: String // TODO: Replace with AccountId - ) -> () { + account_id: String + ) -> Result { if let Some(ref mut client) = self.get_mut_inner() { - // let native_account_id = AccountId::from_hex(account_id).map_err(|err| { - // let error_message = err.to_string(); - // let js_value_error_message = JsValue::from_str(&error_message); - - // console::log_1(&js_value_error_message); - // }); + let native_account_id = AccountId::from_hex(&account_id).unwrap(); - let message = client.get_account_stub_by_id(account_id).await; - let js_value_message = JsValue::from_str(&message); + let result = client.get_account_stub_by_id(native_account_id).await.unwrap(); - // Print the message to the Chrome console - console::log_1(&js_value_message); + let word = result.1.map_or("No word".to_string(), |w| w[0].to_string()); + Ok(JsValue::from_str(&format!("ID: {}, Word: {}", result.0.id().to_string(), word))) } else { - console::error_1(&"Client not initialized".into()); + Err(JsValue::from_str("Client not initialized")) } } pub async fn get_account_auth( &mut self, - account_id: String // TODO: Replace with AccountId - ) -> () { + account_id: String + ) -> Result { if let Some(ref mut client) = self.get_mut_inner() { - // let native_account_id = AccountId::from_hex(account_id).map_err(|err| { - // let error_message = err.to_string(); - // let js_value_error_message = JsValue::from_str(&error_message); - - // console::log_1(&js_value_error_message); - // }); + let native_account_id = AccountId::from_hex(&account_id).unwrap(); - let message = client.get_account_auth(account_id).await; - let js_value_message = JsValue::from_str(&message); - - // Print the message to the Chrome console - console::log_1(&js_value_message); + let result = client.get_account_auth(native_account_id).await.unwrap(); + let mut bytes = Vec::new(); + result.write_into(&mut bytes); + let base64_encoded = encode(&bytes); + Ok(JsValue::from_str(&base64_encoded)) } else { - console::error_1(&"Client not initialized".into()); + Err(JsValue::from_str("Client not initialized")) } } - - // TODO: Import Account } \ No newline at end of file diff --git a/wasm/src/web_client/mod.rs b/wasm/src/web_client/mod.rs index a4833e8d7..bb0a7b6c5 100644 --- a/wasm/src/web_client/mod.rs +++ b/wasm/src/web_client/mod.rs @@ -1,3 +1,11 @@ +use wasm_bindgen::prelude::*; +use miden_objects::crypto::rand::RpoRandomCoin; + +use crate::native_code::{ + Client, + get_random_coin +}; + pub mod account; pub mod notes; pub mod transactions; @@ -8,17 +16,13 @@ pub mod web_rpc_client; use store::WebStore; use web_rpc_client::WebRpcClient; -use crate::native_code::Client; - -use wasm_bindgen::prelude::*; - // My strategy here is to create a WebClient struct that has methods exposed // to the browser environment. When these methods are called, they will // use the inner client to execute the proper code and store methods. #[wasm_bindgen] pub struct WebClient { - inner: Option> + inner: Option> } #[wasm_bindgen] @@ -29,17 +33,18 @@ impl WebClient { } // Getter for the inner client, used internally for operations - pub(crate) fn get_mut_inner(&mut self) -> Option<&mut Client> { + pub(crate) fn get_mut_inner(&mut self) -> Option<&mut Client> { self.inner.as_mut() } // Exposed method to JS to create an internal client pub async fn create_client(&mut self) -> Result { + let rng = get_random_coin(); let web_store = WebStore::new().await.map_err(|_| JsValue::from_str("Failed to initialize WebStore"))?; let web_rpc_client = WebRpcClient::new("http://localhost:57291"); //let executor_store = WebStore::new().await.map_err(|_| JsValue::from_str("Failed to initialize ExecutorStore"))?; - self.inner = Some(Client::new(web_rpc_client, web_store)); + self.inner = Some(Client::new(web_rpc_client, rng, web_store)); Ok(JsValue::from_str("Client created successfully")) } diff --git a/wasm/src/web_client/store/accounts/mod.rs b/wasm/src/web_client/store/accounts/mod.rs index e0b350082..7876ae108 100644 --- a/wasm/src/web_client/store/accounts/mod.rs +++ b/wasm/src/web_client/store/accounts/mod.rs @@ -1,184 +1,195 @@ -// use wasm_bindgen_futures::*; -// use serde_wasm_bindgen::from_value; +use miden_lib::transaction::TransactionKernel; +use serde::{Serialize, Deserialize}; +use serde_wasm_bindgen::from_value; +use wasm_bindgen_futures::*; +use web_sys::console; +use wasm_bindgen::prelude::*; + +use miden_objects::{ + accounts::{Account, AccountCode, AccountId, AccountStorage, AccountStub}, assembly::ModuleAst, assets::{Asset, AssetVault}, Digest, Felt, Word +}; +use miden_objects::utils::Deserializable; + +use crate::native_code::store::{Store, AuthInfo, NativeNoteFilter}; use super::WebStore; mod js_bindings; -// use js_bindings::*; +use js_bindings::*; mod models; -// use models::*; +use models::*; mod utils; -// use utils::*; +use utils::*; impl WebStore { - // pub(super) async fn get_account_ids( - // &mut self - // ) -> Result, ()> { - // let promise = idxdb_get_account_ids(); - // let js_value = JsFuture::from(promise).await?; - // let account_ids_as_strings: Vec = from_value(js_value).unwrap(); + pub(super) async fn get_account_ids( + &mut self + ) -> Result, ()> { + let promise = idxdb_get_account_ids(); + let js_value = JsFuture::from(promise).await.unwrap(); + let account_ids_as_strings: Vec = from_value(js_value).unwrap(); - // let native_account_ids: Result, ()> = account_ids_as_strings.into_iter().map(|id| { - // AccountId::from_hex(&id).map_err(|_err| ()) // Convert any error to `()` - // }).collect(); // Collect into a Result, ()> + let native_account_ids: Vec = account_ids_as_strings.into_iter().map(|id| { + AccountId::from_hex(&id).unwrap() + }).collect(); - // return native_account_ids; - // } - - // pub(super) async fn get_account_stubs( - // &mut self - // ) -> Result)>, ()> { - // let promise = idxdb_get_account_stubs(); - // let js_value = JsFuture::from(promise).await?; - // let account_stubs_idxdb: Vec = from_value(js_value).unwrap(); + return Ok(native_account_ids); + } + + pub(super) async fn get_account_stubs( + &mut self + ) -> Result)>, ()> { + let promise = idxdb_get_account_stubs(); + let js_value = JsFuture::from(promise).await.unwrap(); + let account_stubs_idxdb: Vec = from_value(js_value).unwrap(); - // let account_stubs: Vec<(AccountStub, Option)> = account_stubs_idxdb.into_iter().map(|record| { - // // Need to convert the hex string back to AccountId to then turn it into a u64 - // let native_account_id: i64 = AccountId::from_hex(&record.id).map_err(|err| err.to_string())?; - // let native_nonce: i64 = record.nonce.parse().unwrap(); - // let account_seed = record.account_seed.map(|seed| Word::read_from_bytes(&seed)).transpose()?; + let account_stubs: Vec<(AccountStub, Option)> = account_stubs_idxdb.into_iter().map(|record| { + let native_account_id: AccountId = AccountId::from_hex(&record.id).unwrap(); + let native_nonce: u64 = record.nonce.parse::().unwrap(); + let account_seed = record.account_seed.map(|seed| Word::read_from_bytes(&seed)).transpose().unwrap(); - // let account_stub = AccountStub { - // id: native_account_id, - // nonce: native_nonce, - // vault_root: record.vault_root, - // storage_root: record.storage_root, - // code_root: record.code_root, - // account_seed: account_seed, - // }; - - // (account_stub, None) // Adjust this as needed based on how you derive Word from your data - // }).collect(); - - // Ok(account_stubs) - // } - - // pub(crate) async fn get_account_stub( - // &self, - // account_id: AccountId, - // ) -> Result<(AccountStub, Option), ()> { - // let account_id_str = AccountId::to_hex(account_id).map_err(|err| err.to_string())?; + let account_stub = AccountStub::new( + native_account_id, + Felt::new(native_nonce), + Digest::try_from(&record.vault_root).unwrap(), + Digest::try_from(&record.storage_root).unwrap(), + Digest::try_from(&record.code_root).unwrap(), + ); + + (account_stub, account_seed) // Adjust this as needed based on how you derive Word from your data + }).collect(); + + Ok(account_stubs) + } + + pub(crate) async fn get_account_stub( + &mut self, + account_id: AccountId, + ) -> Result<(AccountStub, Option), ()> { + let account_id_str = account_id.to_string(); - // let promise = idxdb_get_account_stub(account_id_str); - // let js_value = JsFuture::from(promise).await?; - // let account_stub_idxdb: AccountRecordIdxdbOjbect = from_value(js_value).unwrap(); - - // let native_account_id: i64 = AccountId::from_hex(&account_stub_idxdb.id).map_err(|err| err.to_string())?; - // let native_nonce: i64 = account_stub_idxdb.nonce.parse().unwrap(); - // let account_seed = account_stub_idxdb.account_seed.map(|seed| Word::read_from_bytes(&seed)).transpose()?; - - // Ok(( - // AccountStub::new( - // (native_account_id as u64) - // .try_into() - // .expect("Conversion from stored AccountID should not panic"), - // Felt::new(native_nonce as u64), - // serde_json::from_str(&account_stub_idxdb.vault_root).map_err(|err| err.to_string())?, - // Digest::try_from(&account_stub_idxdb.storage_root)?, - // Digest::try_from(&account_stub_idxdb.code_root)?, - // ), - // account_seed, - // )); - // } - - // pub(crate) async fn get_account( - // &mut self, - // account_id: AccountId - // ) -> Result<(), ()> { // TODO: Replace with Result<(Account, Option), ()> - // let (account_stub, seed) = self.get_account_stub(account_id)?; - // let (_procedures, module_ast) = self.get_account_code(account_stub.code_root())?; - - // let account_code = AccountCode::new(module_ast, &TransactionKernel::assembler()).unwrap(); - - // let account_storage = self.get_account_storage(account_stub.storage_root())?; - - // let account_vault = self.get_vault_assets(account_stub.vault_root())?; - // let account_vault = AssetVault::new(&account_vault)?; - - // let account = Account::new( - // account_stub.id(), - // account_vault, - // account_storage, - // account_code, - // account_stub.nonce(), - // ); - - // Ok((account, seed)) - // } - - // pub(crate) async fn get_account_auth( - // &mut self, - // account_id: AccountId - // ) -> Result { - // let account_id_str = AccountId::to_hex(account_id).map_err(|err| err.to_string())?; - - // let promise = idxdb_get_account_auth(account_id_str); - // let js_value = JsFuture::from(promise).await?; - // let auth_info_idxdb: AccountAuthIdxdbObject = from_value(js_value).unwrap(); + let promise = idxdb_get_account_stub(account_id_str); + let js_value = JsFuture::from(promise).await.unwrap(); + let account_stub_idxdb: AccountRecordIdxdbOjbect = from_value(js_value).unwrap(); + + let native_account_id: AccountId = AccountId::from_hex(&account_stub_idxdb.id).unwrap(); + let native_nonce: u64 = account_stub_idxdb.nonce.parse::().unwrap(); + let account_seed = account_stub_idxdb.account_seed.map(|seed| Word::read_from_bytes(&seed)).transpose().unwrap(); + + Ok(( + AccountStub::new( + native_account_id, + Felt::new(native_nonce), + Digest::try_from(&account_stub_idxdb.vault_root).unwrap(), + Digest::try_from(&account_stub_idxdb.storage_root).unwrap(), + Digest::try_from(&account_stub_idxdb.code_root).unwrap(), + ), + account_seed, + )) + } + + pub(crate) async fn get_account( + &mut self, + account_id: AccountId + ) -> Result<(Account, Option), ()> { + let (account_stub, seed) = self.get_account_stub(account_id).await.unwrap(); + + let (_procedures, module_ast) = self.get_account_code(account_stub.code_root()).await.unwrap(); + + let account_code = AccountCode::new(module_ast, &TransactionKernel::assembler()).unwrap(); + + let account_storage = self.get_account_storage(account_stub.storage_root()).await.unwrap(); + + let account_vault = self.get_vault_assets(account_stub.vault_root()).await.unwrap(); + let account_vault = AssetVault::new(&account_vault).unwrap(); + + let account = Account::new( + account_stub.id(), + account_vault, + account_storage, + account_code, + account_stub.nonce(), + ); + + Ok((account, seed)) + } + + pub(crate) async fn get_account_auth( + &mut self, + account_id: AccountId + ) -> Result { + let account_id_str = account_id.to_string(); + + let promise = idxdb_get_account_auth(account_id_str); + let js_value = JsFuture::from(promise).await.unwrap(); + let auth_info_idxdb: AccountAuthIdxdbObject = from_value(js_value).unwrap(); + + // Convert the auth_info to the appropriate AuthInfo enum variant + let auth_info = AuthInfo::read_from_bytes(&auth_info_idxdb.auth_info).unwrap(); + + Ok(auth_info) + } + + pub(super) async fn get_account_code( + &mut self, + root: Digest + ) -> Result<(Vec, ModuleAst), ()> { + let root_serialized = root.to_string(); + + let promise = idxdb_get_account_code(root_serialized); + let js_value = JsFuture::from(promise).await.unwrap(); + let account_code_idxdb: AccountCodeIdxdbObject = from_value(js_value).unwrap(); + + let procedures = + serde_json::from_str(&account_code_idxdb.procedures).unwrap(); + + let module = ModuleAst::from_bytes(&account_code_idxdb.module).unwrap(); - // // Convert the auth_info to the appropriate AuthInfo enum variant - // let auth_info = AuthInfo::from_bytes(&auth_info_idxdb.auth_info); - // Ok(auth_info) - // } - - // pub(super) async fn get_account_code( - // &mut self, - // root: Digest - // ) -> Result<(Vec, ModuleAst), ()> { - // let root_serialized = root.to_string(); - - // let promise = idxdb_get_account_code(root_serialized); - // let js_value = JsFuture::from(promise).await?; - // let account_code_idxdb: AccountCodeIdxdbObject = from_value(js_value).unwrap(); - - // let procedures = - // serde_json::from_str(&account_code_idxdb.procedures)?; - // let module = ModuleAst::from_bytes(&account_code_idxdb.module)?; - // Ok((procedures, module)); - // } + Ok((procedures, module)) + } - // pub(super) async fn get_account_storage( - // &mut self, - // root: Digest - // ) -> Result { - // let root_serialized = &root.to_string(); - - // let promise = idxdb_get_account_storage(root_serialized); - // let js_value = JsFuture::from(promise).await?; - // let account_storage_idxdb: AccountStorageIdxdbObject = from_value(js_value).unwrap(); - - // let storage = AccountStorage::from_bytes(&account_code_idxdb.storage); - // Ok(storage) - // } - - // pub(super) async fn get_vault_assets( - // &mut self, - // root: Digest - // ) -> Result, ()> { - // let root_serialized = &root.to_string(); - - // let promise = idxdb_get_account_asset_vault(root_serialized); - // let js_value = JsFuture::from(promise).await?; - // let vault_assets_idxdb: AccountVaultIdxdbObject = from_value(js_value).unwrap(); - - // let assets = serde_json::from_str(&vault_assets_idxdb.assets); - // Ok(assets) - // } - - // pub(crate) async fn insert_account( - // &mut self, - // account: &Account, - // account_seed: Option, - // auth_info: &AuthInfo, - // ) -> Result<(), ()> { - // insert_account_code(account.code()).await?; - // insert_account_storage(account.storage()).await?; - // insert_account_asset_vault(account.vault()).await?; - // insert_account_record(account, account_seed).await?; - // insert_account_auth(account.id(), auth_info).await?; - - // Ok(()) - // } + pub(super) async fn get_account_storage( + &mut self, + root: Digest + ) -> Result { + let root_serialized = root.to_string(); + + let promise = idxdb_get_account_storage(root_serialized); + let js_value = JsFuture::from(promise).await.unwrap(); + let account_storage_idxdb: AccountStorageIdxdbObject = from_value(js_value).unwrap(); + + let storage = AccountStorage::read_from_bytes(&account_storage_idxdb.storage).unwrap(); + Ok(storage) + } + + pub(super) async fn get_vault_assets( + &mut self, + root: Digest + ) -> Result, ()> { + let root_serialized = root.to_string(); + + let promise = idxdb_get_account_asset_vault(root_serialized); + let js_value = JsFuture::from(promise).await.unwrap(); + let vault_assets_idxdb: AccountVaultIdxdbObject = from_value(js_value).unwrap(); + + let assets = serde_json::from_str(&vault_assets_idxdb.assets).unwrap(); + Ok(assets) + } + + pub(crate) async fn insert_account( + &mut self, + account: &Account, + account_seed: Option, + auth_info: &AuthInfo, + ) -> Result<(), ()> { + insert_account_code(account.code()).await; + insert_account_storage(account.storage()).await; + insert_account_asset_vault(account.vault()).await; + insert_account_record(account, account_seed).await; + insert_account_auth(account.id(), auth_info).await; + + Ok(()) + } } \ No newline at end of file diff --git a/wasm/src/web_client/store/accounts/models.rs b/wasm/src/web_client/store/accounts/models.rs index 8277589c8..0f406bffd 100644 --- a/wasm/src/web_client/store/accounts/models.rs +++ b/wasm/src/web_client/store/accounts/models.rs @@ -1,21 +1,26 @@ -use serde::{Deserialize, Serialize}; +use base64::{decode as base64_decode, DecodeError}; +use serde::{Deserialize, Deserializer, Serialize}; +use serde::de::{Error, Unexpected}; #[derive(Serialize, Deserialize)] pub struct AccountCodeIdxdbObject { pub root: String, pub procedures: String, + #[serde(deserialize_with = "base64_to_vec_u8_required", default)] pub module: Vec, } #[derive(Serialize, Deserialize)] pub struct AccountAuthIdxdbObject { pub id: String, + #[serde(deserialize_with = "base64_to_vec_u8_required", default)] pub auth_info: Vec, } #[derive(Serialize, Deserialize)] pub struct AccountStorageIdxdbObject { pub root: String, + #[serde(deserialize_with = "base64_to_vec_u8_required", default)] pub storage: Vec, } @@ -32,6 +37,27 @@ pub struct AccountRecordIdxdbOjbect { pub vault_root: String, pub storage_root: String, pub code_root: String, - // Use Vec to represent the Blob data in Rust. Conversion will be handled in JS. + #[serde(deserialize_with = "base64_to_vec_u8_optional", default)] pub account_seed: Option>, +} + +fn base64_to_vec_u8_required<'de, D>(deserializer: D) -> Result, D::Error> +where + D: Deserializer<'de>, +{ + let base64_str: String = Deserialize::deserialize(deserializer)?; + base64_decode(&base64_str).map_err(|e| Error::custom(format!("Base64 decode error: {}", e))) +} + +fn base64_to_vec_u8_optional<'de, D>(deserializer: D) -> Result>, D::Error> +where + D: Deserializer<'de>, +{ + let base64_str: Option = Option::deserialize(deserializer)?; + match base64_str { + Some(str) => base64_decode(&str) + .map(Some) + .map_err(|e| Error::custom(format!("Base64 decode error: {}", e))), + None => Ok(None), + } } \ No newline at end of file diff --git a/wasm/src/web_client/store/accounts/utils.rs b/wasm/src/web_client/store/accounts/utils.rs index d4c3588b7..f5303101c 100644 --- a/wasm/src/web_client/store/accounts/utils.rs +++ b/wasm/src/web_client/store/accounts/utils.rs @@ -1,154 +1,98 @@ -// use wasm_bindgen_futures::*; - -// use super::js_bindings::*; - -// TYPES -// ================================================================================================ - -// type SerializedAccountCodeData = (String, String, Vec); -// type SerializedAccountStorageData = (String, Vec); -// type SerializedAccountVaultData = (String, String); -// type SerializedAccountAuthData = (String, Vec); -// type SerializedAccountData = (String, String, String, String, String, bool); - -// ================================================================================================ - -// pub async fn insert_account_code( -// account_code: &AccountCode -// ) -> Result<(), ()> { -// let (code_root, code, module) = serialize_account_code(account_code)?; -// let result = JsFuture::from(idxdb_insert_account_code(code_root, code, module)).await; -// match result { -// Ok(_) => Ok(()), -// Err(_) => Err(()), -// } -// } - -// fn serialize_account_code( -// account_code: &AccountCode, -// ) -> Result { -// let root = account_code.root().to_string(); -// let procedures = match serde_json::to_string(account_code.procedures()) { -// Ok(procedures) => procedures, -// Err(_) => return Err(()), -// }; -// // Assuming to_bytes() returns a Result and handling its error similarly -// let module = match account_code.module().to_bytes(AstSerdeOptions { -// serialize_imports: true, -// }) { -// Ok(module) => module, -// Err(_) => return Err(()), -// }; - -// Ok((root, procedures, module)) -// } - -// pub async fn insert_account_storage( -// account_storage: &AccountStorage -// ) -> Result<(), ()> { -// let (storage_root, storage_slots) = serialize_account_storage(account_storage)?; -// let result = JsFuture::from(idxdb_insert_account_storage(storage_root, storage_slots)).await; -// match result { -// Ok(_) => Ok(()), -// Err(_) => Err(()), -// } -// } - -// fn serialize_account_storage( -// account_storage: &AccountStorage, -// ) -> Result { -// let root = account_storage.root().to_string(); -// let storage = account_storage.to_bytes(); - -// Ok((root, storage)) -// } - -// pub async fn insert_account_asset_vault( -// asset_vault: &AssetVault -// ) -> Result<(), ()> { -// let (vault_root, assets) = serialize_account_asset_vault(asset_vault)?; -// let result = JsFuture::from(idxdb_insert_account_asset_vault(vault_root, assets)).await; -// match result { -// Ok(_) => Ok(()), -// Err(_) => Err(()), -// } -// } - -// fn serialize_account_asset_vault( -// asset_vault: &AssetVault, -// ) -> Result { -// let root = match serde_json::to_string(&asset_vault.commitment()) { -// Ok(root) => root, -// Err(_) => return Err(()), -// }; -// let assets: Vec = asset_vault.assets().collect(); -// let assets = match serde_json::to_string(&assets) { -// Ok(assets) => assets, -// Err(_) => return Err(()), -// }; -// Ok((root, assets)) -// } - -// pub async fn insert_account_record( -// account: &Account, -// account_seed: Option, -// ) -> Result<(), ()> { -// let (id, code_root, storage_root, vault_root, nonce, committed) = serialize_account(account)?; -// let account_seed = account_seed.map(|seed| seed.to_bytes()); - -// let result = JsFuture::from(idxdb_insert_account_record( -// id, -// code_root, -// storage_root, -// vault_root, -// nonce, -// committed, -// account_seed, -// )).await; -// match result { -// Ok(_) => Ok(()), -// Err(_) => Err(()), -// } -// } - -// fn serialize_account(account: &Account) -> Result { -// let account_id_str = AccountId::to_hex(account.id()).map_err(|err| err.to_string())?; -// let code_root = account.code().root().to_string(); -// let storage_root = account.storage().root().to_string(); -// let vault_root = match serde_json::to_string(&account.vault().commitment()) { -// Ok(vault_root) => vault_root, -// Err(_) => return Err(()), -// }; -// let committed = account.is_on_chain(); -// let nonce = account.nonce().to_string(); - -// Ok(( -// account_id_str, -// code_root, -// storage_root, -// vault_root, -// nonce, -// committed, -// )) -// } - -// pub async fn insert_account_auth( -// account_id: AccountId, -// auth_info: &AuthInfo, -// ) -> Result<(), ()> { -// let (account_id, auth_info) = serialize_account_auth(account_id, auth_info)?; -// let result = JsFuture::from(idxdb_insert_account_auth(account_id, auth_info)).await; -// match result { -// Ok(_) => Ok(()), -// Err(_) => Err(()), -// } -// } - -// fn serialize_account_auth( -// account_id: AccountId, -// auth_info: &AuthInfo, -// ) -> Result { -// let account_id_str = AccountId::to_hex(account_id).map_err(|err| err.to_string())?; -// let auth_info = auth_info.to_bytes(); -// Ok((account_id_str, auth_info)) -// } \ No newline at end of file +use web_sys::console; +use wasm_bindgen::prelude::*; + +use miden_objects::{accounts::{Account, AccountCode, AccountId, AccountStorage}, assembly::AstSerdeOptions, assets::{Asset, AssetVault}, Word}; +use miden_tx::utils::Serializable; +use wasm_bindgen_futures::*; + +use crate::native_code::store::AuthInfo; + +use super::js_bindings::*; + +pub async fn insert_account_code( + account_code: &AccountCode +) -> Result<(), ()> { + let root = account_code.root().to_string(); + let procedures = serde_json::to_string(account_code.procedures()).unwrap(); + let module = account_code.module().to_bytes(AstSerdeOptions { serialize_imports: true }); + + let promise = idxdb_insert_account_code(root, procedures, module); + let js_value = JsFuture::from(promise).await; + match js_value { + Ok(_) => Ok(()), + Err(_) => Err(()), + } +} + +pub async fn insert_account_storage( + account_storage: &AccountStorage +) -> Result<(), ()> { + let root = account_storage.root().to_string(); + let storage = account_storage.to_bytes(); + + let promise = idxdb_insert_account_storage(root, storage); + let js_value = JsFuture::from(promise).await; + + match js_value { + Ok(_) => Ok(()), + Err(_) => Err(()), + } +} + +pub async fn insert_account_asset_vault( + asset_vault: &AssetVault +) -> Result<(), ()> { + let root = (&asset_vault.commitment()).to_string(); + let assets: Vec = asset_vault.assets().collect(); + let assets_as_str = serde_json::to_string(&assets).unwrap(); + + let promise = idxdb_insert_account_asset_vault(root, assets_as_str); + let js_value = JsFuture::from(promise).await; + match js_value { + Ok(_) => Ok(()), + Err(_) => Err(()), + } +} + +pub async fn insert_account_auth( + account_id: AccountId, + auth_info: &AuthInfo, +) -> Result<(), ()> { + let account_id_str = account_id.to_string(); + let auth_info = auth_info.to_bytes(); + + let promise = idxdb_insert_account_auth(account_id_str, auth_info); + let js_value = JsFuture::from(promise).await; + match js_value { + Ok(_) => Ok(()), + Err(_) => Err(()), + } +} + +pub async fn insert_account_record( + account: &Account, + account_seed: Option, +) -> Result<(), ()> { + let account_id_str = AccountId::to_hex(&account.id()); + let code_root = account.code().root().to_string(); + let storage_root = account.storage().root().to_string(); + let vault_root = (&account.vault().commitment()).to_string(); + let committed = account.is_on_chain(); + let nonce = account.nonce().to_string(); + let account_seed = account_seed.map(|seed| seed.to_bytes()); + + let promise = idxdb_insert_account_record( + account_id_str, + code_root, + storage_root, + vault_root, + nonce, + committed, + account_seed, + ); + let js_value = JsFuture::from(promise).await; + match js_value { + Ok(_) => Ok(()), + Err(_) => Err(()), + } +} \ No newline at end of file diff --git a/wasm/src/web_client/store/mod.rs b/wasm/src/web_client/store/mod.rs index a658e6833..e70f485c2 100644 --- a/wasm/src/web_client/store/mod.rs +++ b/wasm/src/web_client/store/mod.rs @@ -1,9 +1,13 @@ -use crate::native_code::store::{Store, NativeNoteFilter}; - +use async_trait::async_trait; use wasm_bindgen::prelude::*; use wasm_bindgen_futures::*; -use async_trait::async_trait; +use miden_objects::{ + accounts::{Account, AccountId, AccountStub}, + Word +}; + +use crate::native_code::store::{Store, AuthInfo}; pub mod accounts; pub mod notes; @@ -130,43 +134,47 @@ impl Store for WebStore { // } // ACCOUNTS - // async fn insert_account( - // &mut self, - // account: &Account, - // account_seed: Option, - // auth_info: &AuthInfo, - // ) -> Result<(), ()> { - // self.insert_account(account, account_seed, auth_info).await - // } + async fn insert_account( + &mut self, + account: &Account, + account_seed: Option, + auth_info: &AuthInfo, + ) -> Result<(), ()> { + self.insert_account(account, account_seed, auth_info).await + } - // async fn get_account_ids(&self) -> Result, ()> { - // self.get_account_ids().await - // } + async fn get_account_ids( + &mut self + ) -> Result, ()> { + self.get_account_ids().await + } - // async fn get_account_stubs(&self) -> Result)>, ()> { - // self.get_account_stubs().await - // } + async fn get_account_stubs( + &mut self + ) -> Result)>, ()> { + self.get_account_stubs().await + } - // async fn get_account_stub( - // &self, - // account_id: AccountId, - // ) -> Result<(AccountStub, Option), ()> { - // self.get_account_stub(account_id).await - // } + async fn get_account_stub( + &mut self, + account_id: AccountId, + ) -> Result<(AccountStub, Option), ()> { + self.get_account_stub(account_id).await + } - // async fn get_account( - // &self, - // account_id: AccountId, - // ) -> Result<(Account, Option), ()> { - // self.get_account(account_id).await - // } + async fn get_account( + &mut self, + account_id: AccountId, + ) -> Result<(Account, Option), ()> { + self.get_account(account_id).await + } - // async fn get_account_auth( - // &self, - // account_id: AccountId, - // ) -> Result { - // self.get_account_auth(account_id).await - // } + async fn get_account_auth( + &mut self, + account_id: AccountId, + ) -> Result { + self.get_account_auth(account_id).await + } // NOTES // async fn get_input_notes( diff --git a/wasm/test.html b/wasm/test.html index 341c3c0ac..b70deb741 100644 --- a/wasm/test.html +++ b/wasm/test.html @@ -5,10 +5,29 @@ WASM Example + \ No newline at end of file diff --git a/wasm/test_accounts/account0.mac b/wasm/test_accounts/account0.mac new file mode 100644 index 0000000000000000000000000000000000000000..96129e38b2629abcd3a4e72e65bae6bf7094996e GIT binary patch literal 337 zcmXrMJ*VQK)Wlu}5MX5RJMwbE&PPkvChJBzR6V+Gu`FW;>Mhpx~0vTR= zmv`0Is(#zX6P&Q?%Ic#Be#Q!~p_;}eUEQ%e{ambX{)C|%W)xh5i;`TlE-M18L% zBUf>1UJ6VB0|QgG(~7i+jc>MVzQ}do%fBu+{M_k7?}Jvz@wRU^mtP)O@*u03)u-tF z@yBX2j{He5PvW`P>@&l0{RWGrmuGZ7W!iQ@jYo8uUuA~zYt8m6>{^FjHF?`SS?VR1 zX}xyY3;n{oj9~u*L!k1poQ;`jZ%DV^pGkQ<>%~_v%x2lcmy|R$*CBj1w|EA_MrGIZ L&edn%Gvc5D*wBzY literal 0 HcmV?d00001 diff --git a/wasm/test_accounts/account1.mac b/wasm/test_accounts/account1.mac new file mode 100644 index 0000000000000000000000000000000000000000..64d3671033e1659ba5033d6d361b00fc6894ac7a GIT binary patch literal 1588 zcma)6e{2**6yB?V<=UpDq%~MV2T`%+I7_wGaGRF^pFR@8!j=A00+X=g~o84L4 z28jWGg-BA6rlBU1SRh;^HE9e1qt+jQ)hHIc5ImJeBx(4grY6MLlNf!o_rsi8~@BJbcot>zAL}@cPkEX|;BZrc$Rux9uOT!7kTgyf0>3W=zGp zY_jIHO(LaVp$@lc+~wr!l1B<_2dOr3G`$}glyRaU)ny49*9pRoL%4&uiMU3PWt-1Z z1@>(sQ;QPDgZ>D!T<)wx-PkZ)#si4sL;x|9lNj%}NC0gKKOA`~65br`@prg97wqj@ z+zz0|d49oQu*bg!Wl<3Y4nQFH26W;i&lNKTIUbcYB6mJiEVFTx$+|08Q|5t)+(CdY za4Z}FzQ|MyL9oCaX{N5^vWsSjlZBGT#bY80-l%A5_NBlSx|L67nL;KzFN;A8)9y!DQ9wl}U*>jVGolCm zQ4N|WV+Q3Sg#uF!Iz#)gEJL&q+cph^VOs-8@Cqk=Q01eokxiY5s_UTMD72p2m^oPH z)MSE2oKTiPq>sqpB?aLGrp)00BXETgvdx1?kr)5XQAowEob9EDZE~yws^elN12a_= zC#)!P07Swj*sE6qeBlEF_ff+I*1B%?LVCxwEWJPIlcWl1%$HuFeY>7~_eX4Rl()Pv z@L(dN9{OIE<@A~T(wXR`U(eq>`q>>f?W+3lo8f~If8uuEN*Imw3E%O$edj)U>FmqO z&a%pC>FSlE&!ua|QEbP1kB6peTdLz#%dSt~Iea-?zD+xn80u=e=T^MzdHsQ|yX#gB zE{MA}vwdxFhiNJvpWKkZjI?%khKuGvSls(FFKzMBoPz~6Q9u(+bZR^~i>78EpJB&9n~?zp;p?P|2-M#psRFZ#mq!@ccbgsp**NM`ub%4W9o`i=J1 z+KKvI_me$J$@aFS+BG(Fvf-NX*awww8_#_8#V4~{k}E1+d8eiR*wcJsZgFPc%ydPv zY-sAOk&8b%&9}^5+<5r}8#uN=?yU=z&hhh^10&HNn%)@SHqn@hJYhUEIPm78pC*S! zX3Cd@fRuOnS||CH)ydNbr;fCjxxc^vqIG)o$&Q_=O!elE)v- Date: Mon, 22 Apr 2024 21:24:57 -0500 Subject: [PATCH 13/42] Notes Code With Native Code Untested (#11) --- wasm/js/db/accounts.js | 4 +- wasm/js/db/notes.js | 213 +++++++--- wasm/js/db/schema.js | 4 + wasm/js/db/sync.js | 1 + wasm/src/native_code/notes.rs | 36 +- wasm/src/native_code/store/mod.rs | 58 +-- .../store/note_record/input_note_record.rs | 189 +++++++++ wasm/src/native_code/store/note_record/mod.rs | 173 ++++++++ .../store/note_record/output_note_record.rs | 98 +++++ wasm/src/web_client/notes.rs | 81 ++-- wasm/src/web_client/store/accounts/mod.rs | 2 +- wasm/src/web_client/store/mod.rs | 75 ++-- .../src/web_client/store/notes/js_bindings.rs | 10 +- wasm/src/web_client/store/notes/mod.rs | 371 +++++++++++------- wasm/src/web_client/store/notes/models.rs | 14 +- wasm/src/web_client/store/notes/utils.rs | 307 ++++++++++----- 16 files changed, 1212 insertions(+), 424 deletions(-) create mode 100644 wasm/src/native_code/store/note_record/input_note_record.rs create mode 100644 wasm/src/native_code/store/note_record/mod.rs create mode 100644 wasm/src/native_code/store/note_record/output_note_record.rs diff --git a/wasm/js/db/accounts.js b/wasm/js/db/accounts.js index 7bbedbd19..a75509039 100644 --- a/wasm/js/db/accounts.js +++ b/wasm/js/db/accounts.js @@ -256,7 +256,7 @@ export async function insertAccountCode( ) { try { // Create a Blob from the ArrayBuffer - const moduleBlob = new Blob([module]); + const moduleBlob = new Blob([new Uint8Array(module)]); // Prepare the data object to insert const data = { @@ -278,7 +278,7 @@ export async function insertAccountStorage( storageSlots ) { try { - const storageSlotsBlob = new Blob([storageSlots]); + const storageSlotsBlob = new Blob([new Uint8Array(storageSlots)]); // Prepare the data object to insert const data = { diff --git a/wasm/js/db/notes.js b/wasm/js/db/notes.js index abdfa3b6b..28128ecb4 100644 --- a/wasm/js/db/notes.js +++ b/wasm/js/db/notes.js @@ -1,23 +1,82 @@ import { inputNotes, - outputNotes + outputNotes, + notesScripts, } from './schema.js'; -export async function getInputNotes() { +export async function getOutputNotes( + status +) { + try { + let notes; + + // Fetch the records based on the filter + if (status === 'All') { + notes = await outputNotes.toArray(); + } else { + notes = await outputNotes.where('status').equals(status.toLowerCase()).toArray(); + } + + // Fetch all scripts from the scripts table for joining + const scripts = await notesScripts.toArray(); + const scriptMap = new Map(scripts.map(script => [script.script_hash, script.serialized_note_script])); + + // Process each note to convert 'blobField' from Blob to Uint8Array + const processedNotes = await Promise.all(notes.map(async note => { + const assetsArrayBuffer = await note.assets.arrayBuffer(); + const assetsArray = new Uint8Array(assetsArrayBuffer); + const assetsBase64 = uint8ArrayToBase64(assetsArray); + note.assets = assetsBase64; + + // Parse details JSON and perform a "join" + if (note.details) { + const details = JSON.parse(note.details); + if (details.script_hash) { + note.serialized_note_script = scriptMap.get(details.script_hash) || null; + } + } + + return note; + })); + + return processedNotes; + } catch { + console.error("Failed to get input notes: ", err); + throw err; + } +} + +export async function getInputNotes( + status +) { try { let notes; // Fetch the records based on the filter - if (filter === 'All') { + if (status === 'All') { notes = await inputNotes.toArray(); } else { - notes = await inputNotes.where('status').equals(filter.toLowerCase()).toArray(); + notes = await inputNotes.where('status').equals(status.toLowerCase()).toArray(); } + // Fetch all scripts from the scripts table for joining + const scripts = await notesScripts.toArray(); + const scriptMap = new Map(scripts.map(script => [script.script_hash, script.serialized_note_script])); + // Process each note to convert 'blobField' from Blob to Uint8Array const processedNotes = await Promise.all(notes.map(async note => { const assetsArrayBuffer = await note.assets.arrayBuffer(); - note.assets = new Uint8Array(assetsArrayBuffer); + const assetsArray = new Uint8Array(assetsArrayBuffer); + const assetsBase64 = uint8ArrayToBase64(assetsArray); + note.assets = assetsBase64; + + // Parse details JSON and perform a "join" + if (note.details) { + const details = JSON.parse(note.details); + if (details.script_hash) { + note.serialized_note_script = scriptMap.get(details.script_hash) || null; + } + } return note; })); @@ -29,11 +88,25 @@ export async function getInputNotes() { } } -export async function getInputNote() { +export async function getInputNote( + noteId +) { try { const note = await inputNotes.get(noteId); + const assetsArrayBuffer = await note.assets.arrayBuffer(); - note.assets = new Uint8Array(assetsArrayBuffer); + const assetsArray = new Uint8Array(assetsArrayBuffer); + const assetsBase64 = uint8ArrayToBase64(assetsArray); + + if (note.details) { + const details = JSON.parse(note.details); + if (details.script_hash) { + const script = await notesScripts.get(details.script_hash); + note.serialized_note_script = script ? script.serialized_note_script : null; + } + } + + note.assets = assetsBase64 return note } catch { @@ -50,29 +123,43 @@ export async function insertInputNote( status, metadata, details, - inclusion_proof + noteScriptHash, + serializedNoteScript, + inclusionProof ) { - try { - let assetsBlob = new Blob([assets]); - - // Prepare the data object to insert - const data = { - noteId: noteId, - assets: assetsBlob, - recipient: recipient, - status: status, - metadata: JSON.stringify(metadata), - details: JSON.stringify(details), - inclusion_proof: JSON.stringify(inclusion_proof), - }; - - // Perform the insert using Dexie - await inputNotes.add(data); - return `Successfully inserted note: ${noteId}`; - } catch (error) { - console.error(`Error inserting note: ${noteId}:`, error); - throw error; // Rethrow the error to handle it further up the call chain if needed - } + return db.transaction('rw', inputNotes, notesScripts, async (tx) => { + try { + let assetsBlob = new Blob([new Uint8Array(assets)]); + + // Prepare the data object to insert + const data = { + noteId: noteId, + assets: assetsBlob, + recipient: recipient, + status: status, + metadata: metadata ? JSON.stringify(metadata) : null, + details: JSON.stringify(details), + inclusionProof: inclusionProof ? JSON.stringify(inclusionProof) : null, + }; + + // Perform the insert using Dexie + await tx.inputNotes.add(data); + + const exists = await tx.notesScripts.get(noteScriptHash); + if (!exists) { + let serializedNoteScriptBlob = new Blob([new Uint8Array(serializedNoteScript)]); + + const data = { + scriptHash: noteScriptHash, + serializedNoteScript: serializedNoteScriptBlob, + }; + await tx.notesScripts.add(data); + } + } catch { + console.error(`Error inserting note: ${noteId}:`, error); + throw error; // Rethrow the error to handle it further up the call chain if needed + } + }); } export async function insertOutputNote( @@ -82,34 +169,51 @@ export async function insertOutputNote( status, metadata, details, - inclusion_proof + noteScriptHash, + serializedNoteScript, + inclusionProof ) { - try { - let assetsBlob = new Blob([assets]); - - // Prepare the data object to insert - const data = { - noteId: noteId, - assets: assetsBlob, - recipient: recipient, - status: status, - metadata: JSON.stringify(metadata), - details: JSON.stringify(details), - inclusion_proof: JSON.stringify(inclusion_proof), - }; - - // Perform the insert using Dexie - await outputNotes.add(data); - return `Successfully inserted note: ${noteId}`; - } catch (error) { - console.error(`Error inserting note: ${noteId}:`, error); - throw error; // Rethrow the error to handle it further up the call chain if needed - } + return db.transaction('rw', outputNotes, notesScripts, async (tx) => { + try { + let assetsBlob = new Blob([new Uint8Array(assets)]); + + // Prepare the data object to insert + const data = { + noteId: noteId, + assets: assetsBlob, + recipient: recipient, + status: status, + metadata: JSON.stringify(metadata), + details: details ? JSON.stringify(details) : null, + inclusionProof: inclusionProof ? JSON.stringify(inclusionProof) : null, + }; + + // Perform the insert using Dexie + await tx.outputNotes.add(data); + + const exists = await tx.notesScripts.get(noteScriptHash); + if (!exists) { + let serializedNoteScriptBlob = null; + if (serializedNoteScript) { + serializedNoteScriptBlob = new Blob([new Uint8Array(serializedNoteScript)]); + } + + const data = { + scriptHash: noteScriptHash, + serializedNoteScript: serializedNoteScriptBlob, + }; + await tx.notesScripts.add(data); + } + } catch { + console.error(`Error inserting note: ${noteId}:`, error); + throw error; // Rethrow the error to handle it further up the call chain if needed + } + }); } export async function getUnspentInputNoteNullifiers() { try { - const notes = await db.InputNotes.where('status').equals('committed').toArray(); + const notes = await db.InputNotes.where('status').equals('Committed').toArray(); const nullifiers = notes.map(note => JSON.parse(note.details).nullifier); return nullifiers; @@ -117,4 +221,9 @@ export async function getUnspentInputNoteNullifiers() { console.error("Failed to get unspent input note nullifiers: ", err); throw err; } +} + +function uint8ArrayToBase64(bytes) { + const binary = bytes.reduce((acc, byte) => acc + String.fromCharCode(byte), ''); + return btoa(binary); } \ No newline at end of file diff --git a/wasm/js/db/schema.js b/wasm/js/db/schema.js index a5eedac75..09e143b58 100644 --- a/wasm/js/db/schema.js +++ b/wasm/js/db/schema.js @@ -24,6 +24,7 @@ const Table = { TransactionScripts: 'transactionScripts', InputNotes: 'inputNotes', OutputNotes: 'outputNotes', + NotesScripts: 'notesScripts', StateSync: 'stateSync', BlockHeaders: 'blockHeaders', ChainMmrNodes: 'chainMmrNodes', @@ -41,6 +42,7 @@ db.version(1).stores({ [Table.TransactionScripts]: indexes('scriptHash'), [Table.InputNotes]: indexes('noteId', 'recipient', 'status'), [Table.OutputNotes]: indexes('noteId', 'recipient', 'status'), + [Table.NotesScripts]: indexes('scriptHash'), [Table.StateSync]: indexes('id'), [Table.BlockHeaders]: indexes('blockNum'), [Table.ChainMmrNodes]: indexes('blockNum', 'hasClientNotes'), @@ -65,6 +67,7 @@ const transactions = db.table(Table.Transactions); const transactionScripts = db.table(Table.TransactionScripts); const inputNotes = db.table(Table.InputNotes); const outputNotes = db.table(Table.OutputNotes); +const notesScripts = db.table(Table.NotesScripts); const stateSync = db.table(Table.StateSync); const blockHeaders = db.table(Table.BlockHeaders); const chainMmrNodes = db.table(Table.ChainMmrNodes); @@ -81,6 +84,7 @@ export { transactionScripts, inputNotes, outputNotes, + notesScripts, stateSync, blockHeaders, chainMmrNodes, diff --git a/wasm/js/db/sync.js b/wasm/js/db/sync.js index e790a183e..991e170f1 100644 --- a/wasm/js/db/sync.js +++ b/wasm/js/db/sync.js @@ -68,6 +68,7 @@ export async function applyStateSync( await updateCommittedNotes(tx, noteIds, inclusionProofs); await updateCommittedTransactions(tx, blockNum, transactionIds); await updateBlockHeader(tx, blockNum, blockHeader, chainMmrPeaks, hasClientNotes); + await updateChainMmrNodes(tx, nodeIndices, nodes); }); } diff --git a/wasm/src/native_code/notes.rs b/wasm/src/native_code/notes.rs index a27771086..fbae4e43c 100644 --- a/wasm/src/native_code/notes.rs +++ b/wasm/src/native_code/notes.rs @@ -1,11 +1,9 @@ -use miden_objects::crypto::rand::FeltRng; +use miden_objects::{crypto::rand::FeltRng, notes::NoteId}; -use crate::native_code::store::NativeNoteFilter; +use crate::native_code::store::NoteFilter; use super::{ - rpc::NodeRpcClient, - Client, - store::Store // TODO: Add AuthInfo + errors::StoreError, rpc::NodeRpcClient, store::{note_record::InputNoteRecord, Store}, Client // TODO: Add AuthInfo }; impl Client { @@ -14,22 +12,18 @@ impl Client { /// Returns input notes managed by this client. pub async fn get_input_notes( - &self, - filter: NativeNoteFilter, - ) -> String { // TODO: Replace with Result, ()> - //self.store.get_input_notes(filter).map_err(|err| err.into()) - - "Called get_input_notes".to_string() + &mut self, + filter: NoteFilter, + ) -> Result, StoreError> { + self.store.get_input_notes(filter).await } /// Returns the input note with the specified hash. pub async fn get_input_note( - &self, - //note_id: NoteId, - ) -> String { // TODO: Replace with Result - //self.store.get_input_note(note_id).map_err(|err| err.into()) - - "Called get_input_note".to_string() + &mut self, + note_id: NoteId, + ) -> Result { + self.store.get_input_note(note_id).await } // INPUT NOTE CREATION @@ -38,10 +32,8 @@ impl Client { /// Imports a new input note into the client's store. pub async fn import_input_note( &mut self, - //note: InputNoteRecord, - ) -> String { // TODO: Replace with Result<(), ()> - //self.store.insert_input_note(¬e).map_err(|err| err.into()) - - "Called import_input_note".to_string() + note: InputNoteRecord, + ) -> Result<(), StoreError> { + self.store.insert_input_note(¬e).await } } \ No newline at end of file diff --git a/wasm/src/native_code/store/mod.rs b/wasm/src/native_code/store/mod.rs index 09ed52645..69241cb73 100644 --- a/wasm/src/native_code/store/mod.rs +++ b/wasm/src/native_code/store/mod.rs @@ -1,12 +1,16 @@ use miden_objects::{ - accounts::{Account, AccountId, AccountStub}, - crypto::dsa::rpo_falcon512::SecretKey, - Felt, Word, + accounts::{Account, AccountId, AccountStub}, crypto::dsa::rpo_falcon512::SecretKey, notes::{NoteId, Nullifier}, Digest, Felt, Word }; use miden_tx::utils::{ByteReader, ByteWriter, Deserializable, DeserializationError, Serializable}; use async_trait::async_trait; +use self::note_record::{InputNoteRecord, OutputNoteRecord}; + +use super::errors::StoreError; + +pub mod note_record; + // Hoping that eventually, we can use the generic store type defined in client/store/mod.rs. // Might need to add conditional rendering to add async_trait to the trait definitions? // Or maybe we can just add it to the trait definitions and it will work for both the CLI and the browser? @@ -138,29 +142,37 @@ pub trait Store { // NOTES // -------------------------------------------------------------------------------------------- - // async fn get_input_notes( - // &mut self, - // filter: NativeNoteFilter, - // ) -> Result, ()>; + async fn get_input_notes( + &mut self, + filter: NoteFilter, + ) -> Result, StoreError>; - // async fn get_input_note( - // &self, - // note_id: NoteId, - // ) -> Result; + async fn get_input_note( + &mut self, + note_id: NoteId, + ) -> Result; - // async fn insert_input_note( - // &mut self, - // note: &InputNoteRecord, - // ) -> Result<(), ()>; + async fn insert_input_note( + &mut self, + note: &InputNoteRecord, + ) -> Result<(), StoreError>; - // async fn get_output_notes( - // &self, - // filter: NativeNoteFilter, - // ) -> Result, ()>; + async fn get_output_notes( + &mut self, + filter: NoteFilter, + ) -> Result, StoreError>; - // async fn get_unspent_input_note_nullifiers( - // &self - // ) -> Result, ()>; + async fn get_unspent_input_note_nullifiers( + &mut self + ) -> Result, StoreError> { + let nullifiers = self + .get_input_notes(NoteFilter::Committed).await.unwrap() + .iter() + .map(|input_note| Ok(Nullifier::from(Digest::try_from(input_note.nullifier())?))) + .collect::, _>>(); + + nullifiers + } } // DATABASE AUTH INFO @@ -237,7 +249,7 @@ pub enum NativeTransactionFilter { Uncomitted, } -pub enum NativeNoteFilter { +pub enum NoteFilter { /// Return a list of all [InputNoteRecord]. All, /// Filter by consumed [InputNoteRecord]. notes that have been used as inputs in transactions. diff --git a/wasm/src/native_code/store/note_record/input_note_record.rs b/wasm/src/native_code/store/note_record/input_note_record.rs new file mode 100644 index 000000000..d63f98e67 --- /dev/null +++ b/wasm/src/native_code/store/note_record/input_note_record.rs @@ -0,0 +1,189 @@ +use miden_objects::{ + notes::{ + Note, NoteAssets, NoteId, NoteInclusionProof, NoteInputs, NoteMetadata, NoteRecipient, + }, + transaction::InputNote, + utils::{ByteReader, ByteWriter, Deserializable, DeserializationError, Serializable}, + Digest, +}; + +use super::{NoteRecordDetails, NoteStatus}; +use crate::native_code::errors::ClientError; + +// INPUT NOTE RECORD +// ================================================================================================ + +/// Represents a Note of which the Store can keep track and retrieve. +/// +/// An [InputNoteRecord] contains all the information of a [Note], in addition of (optionally) the +/// [NoteInclusionProof] that identifies when the note was included in the chain. +/// +/// Once the proof is set, the [InputNoteRecord] can be transformed into an [InputNote] and used as +/// input for transactions. +/// +/// It is also possible to convert [Note] and [InputNote] into [InputNoteRecord] (we fill the +/// `metadata` and `inclusion_proof` fields if possible) +#[derive(Clone, Debug, PartialEq)] +pub struct InputNoteRecord { + assets: NoteAssets, + details: NoteRecordDetails, + id: NoteId, + inclusion_proof: Option, + metadata: Option, + recipient: Digest, + status: NoteStatus, +} + +impl InputNoteRecord { + pub fn new( + id: NoteId, + recipient: Digest, + assets: NoteAssets, + status: NoteStatus, + metadata: Option, + inclusion_proof: Option, + details: NoteRecordDetails, + ) -> InputNoteRecord { + InputNoteRecord { + id, + recipient, + assets, + status, + metadata, + inclusion_proof, + details, + } + } + + pub fn id(&self) -> NoteId { + self.id + } + + pub fn recipient(&self) -> Digest { + self.recipient + } + + pub fn assets(&self) -> &NoteAssets { + &self.assets + } + + pub fn status(&self) -> NoteStatus { + self.status + } + + pub fn metadata(&self) -> Option<&NoteMetadata> { + self.metadata.as_ref() + } + + pub fn nullifier(&self) -> &str { + &self.details.nullifier + } + + pub fn inclusion_proof(&self) -> Option<&NoteInclusionProof> { + self.inclusion_proof.as_ref() + } + + pub fn details(&self) -> &NoteRecordDetails { + &self.details + } +} + +impl Serializable for InputNoteRecord { + fn write_into(&self, target: &mut W) { + self.id().write_into(target); + self.recipient().write_into(target); + self.assets().write_into(target); + self.status().write_into(target); + self.metadata().write_into(target); + self.details().write_into(target); + self.inclusion_proof().write_into(target); + } +} + +impl Deserializable for InputNoteRecord { + fn read_from(source: &mut R) -> Result { + let id = NoteId::read_from(source)?; + let recipient = Digest::read_from(source)?; + let assets = NoteAssets::read_from(source)?; + let status = NoteStatus::read_from(source)?; + let metadata = Option::::read_from(source)?; + let details = NoteRecordDetails::read_from(source)?; + let inclusion_proof = Option::::read_from(source)?; + + Ok(InputNoteRecord { + id, + recipient, + assets, + status, + metadata, + inclusion_proof, + details, + }) + } +} + +impl From for InputNoteRecord { + fn from(note: Note) -> Self { + InputNoteRecord { + id: note.id(), + recipient: note.recipient_digest(), + assets: note.assets().clone(), + status: NoteStatus::Pending, + metadata: Some(*note.metadata()), + inclusion_proof: None, + details: NoteRecordDetails::new( + note.nullifier().to_string(), + note.script().clone(), + note.inputs().to_vec(), + note.serial_num(), + ), + } + } +} + +impl From for InputNoteRecord { + fn from(recorded_note: InputNote) -> Self { + InputNoteRecord { + id: recorded_note.note().id(), + recipient: recorded_note.note().recipient_digest(), + assets: recorded_note.note().assets().clone(), + status: NoteStatus::Pending, + metadata: Some(*recorded_note.note().metadata()), + details: NoteRecordDetails::new( + recorded_note.note().nullifier().to_string(), + recorded_note.note().script().clone(), + recorded_note.note().inputs().values().to_vec(), + recorded_note.note().serial_num(), + ), + inclusion_proof: Some(recorded_note.proof().clone()), + } + } +} + +impl TryInto for InputNoteRecord { + type Error = ClientError; + + fn try_into(self) -> Result { + match (self.inclusion_proof, self.metadata) { + (Some(proof), Some(metadata)) => { + // TODO: Write functions to get these fields more easily + let note_inputs = NoteInputs::new(self.details.inputs)?; + let note_recipient = + NoteRecipient::new(self.details.serial_num, self.details.script, note_inputs); + let note = Note::new(self.assets, metadata, note_recipient); + Ok(InputNote::new(note, proof.clone())) + }, + + (None, _) => { + Err(ClientError::NoteError(miden_objects::NoteError::invalid_origin_index( + "Input Note Record contains no inclusion proof".to_string(), + ))) + }, + (_, None) => { + Err(ClientError::NoteError(miden_objects::NoteError::invalid_origin_index( + "Input Note Record contains no metadata".to_string(), + ))) + }, + } + } +} diff --git a/wasm/src/native_code/store/note_record/mod.rs b/wasm/src/native_code/store/note_record/mod.rs new file mode 100644 index 000000000..603d8d479 --- /dev/null +++ b/wasm/src/native_code/store/note_record/mod.rs @@ -0,0 +1,173 @@ +use miden_objects::{ + assembly::{Assembler, ProgramAst}, + notes::NoteScript, + utils::{ByteReader, ByteWriter, Deserializable, DeserializationError, Serializable}, + Digest, Felt, Word, +}; +use serde::{Deserialize, Serialize}; + +mod input_note_record; +mod output_note_record; + +pub use input_note_record::InputNoteRecord; +pub use output_note_record::OutputNoteRecord; + +/// This module defines common structs to be used within the [Store](crate::store::Store) for notes +/// that are available to be consumed ([InputNoteRecord]) and notes that have been produced as a +/// result of executing a transaction ([OutputNoteRecord]). +/// +/// # Features +/// +/// ## Serialization / Deserialization +/// +/// We provide serialization and deserialization support via [Serializable] and [Deserializable] +/// traits implementations, and also via [Serialize] and [Deserialize] from `serde` to provide the +/// ability to serialize most fields into JSON. This is useful for example if you want to store +/// some fields as json columns like we do in +/// [SqliteStore](crate::store::sqlite_store::SqliteStore). For example, suppose we want to store +/// [InputNoteRecord]'s metadata field in a JSON column. In that case, we could do something like: +/// +/// ```ignore +/// fn insert_metadata_into_some_table(db: &mut Database, note: InputNoteRecord) { +/// let note_metadata_json = serde_json::to_string(note.metadata()).unwrap(); +/// +/// db.execute("INSERT INTO notes_metadata (note_id, note_metadata) VALUES (?, ?)", +/// note.id().to_hex(), note_metadata_json).unwrap() +/// } +/// ``` +/// +/// ## Type conversion +/// +/// We also facilitate converting from/into [InputNote](miden_objects::transaction::InputNote) / +/// [Note](miden_objects::notes::Note), although this is not always possible. Check both +/// [InputNoteRecord]'s and [OutputNoteRecord]'s documentation for more details into this + +// NOTE STATUS +// ================================================================================================ +#[derive(Clone, Copy, Debug, Serialize, Deserialize, PartialEq, Eq)] +pub enum NoteStatus { + Pending, + Committed, + Consumed, +} + +impl From for u8 { + fn from(value: NoteStatus) -> Self { + match value { + NoteStatus::Pending => 0, + NoteStatus::Committed => 1, + NoteStatus::Consumed => 2, + } + } +} + +impl TryFrom for NoteStatus { + type Error = DeserializationError; + fn try_from(value: u8) -> Result { + match value { + 0 => Ok(NoteStatus::Pending), + 1 => Ok(NoteStatus::Committed), + 2 => Ok(NoteStatus::Consumed), + _ => Err(DeserializationError::InvalidValue(value.to_string())), + } + } +} + +impl Serializable for NoteStatus { + fn write_into(&self, target: &mut W) { + target.write_bytes(&[(*self).into()]); + } +} + +impl Deserializable for NoteStatus { + fn read_from(source: &mut R) -> Result { + let enum_byte = u8::read_from(source)?; + enum_byte.try_into() + } +} + +fn default_script() -> NoteScript { + let assembler = Assembler::default(); + let note_program_ast = + ProgramAst::parse("begin end").expect("dummy script should be parseable"); + let (note_script, _) = NoteScript::new(note_program_ast, &assembler) + .expect("dummy note script should be created without issues"); + note_script +} + +// NOTE: NoteInputs does not impl Serialize which is why we use Vec here +#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] +pub struct NoteRecordDetails { + nullifier: String, + script_hash: Digest, + #[serde(skip_serializing, skip_deserializing, default = "default_script")] + script: NoteScript, + inputs: Vec, + serial_num: Word, +} + +impl NoteRecordDetails { + pub fn new(nullifier: String, script: NoteScript, inputs: Vec, serial_num: Word) -> Self { + let script_hash = script.hash(); + Self { + nullifier, + script, + script_hash, + inputs, + serial_num, + } + } + + pub fn nullifier(&self) -> &str { + &self.nullifier + } + + pub fn script_hash(&self) -> &Digest { + &self.script_hash + } + + pub fn script(&self) -> &NoteScript { + &self.script + } + + pub fn inputs(&self) -> &Vec { + &self.inputs + } + + pub fn serial_num(&self) -> Word { + self.serial_num + } +} + +impl Serializable for NoteRecordDetails { + fn write_into(&self, target: &mut W) { + let nullifier_bytes = self.nullifier.as_bytes(); + target.write_usize(nullifier_bytes.len()); + target.write_bytes(nullifier_bytes); + + self.script().write_into(target); + + target.write_usize(self.inputs.len()); + target.write_many(self.inputs()); + + self.serial_num().write_into(target); + } +} + +impl Deserializable for NoteRecordDetails { + fn read_from(source: &mut R) -> Result { + let nullifier_len = usize::read_from(source)?; + let nullifier_bytes = source.read_vec(nullifier_len)?; + let nullifier = + String::from_utf8(nullifier_bytes).expect("Nullifier String bytes should be readable."); + + let script = NoteScript::read_from(source)?; + + let inputs_len = source.read_usize()?; + let inputs = source.read_many::(inputs_len)?; + + let serial_num = Word::read_from(source)?; + + Ok(NoteRecordDetails::new(nullifier, script, inputs, serial_num)) + } +} diff --git a/wasm/src/native_code/store/note_record/output_note_record.rs b/wasm/src/native_code/store/note_record/output_note_record.rs new file mode 100644 index 000000000..a5c2441dc --- /dev/null +++ b/wasm/src/native_code/store/note_record/output_note_record.rs @@ -0,0 +1,98 @@ +use miden_objects::{ + notes::{Note, NoteAssets, NoteId, NoteInclusionProof, NoteMetadata}, + Digest, +}; + +use super::{NoteRecordDetails, NoteStatus}; + +// OUTPUT NOTE RECORD +// ================================================================================================ + +/// Represents a Note which was the result of executing some transaction of which the Store can +/// keep track and retrieve. +/// +/// An [OutputNoteRecord] contains all the information of a [Note] while it allows for not knowing +/// the details (nullifier, script, inputs and serial number), in addition of (optionally) the +/// [NoteInclusionProof] that identifies when the note was included in the chain. +/// +/// It is also possible to convert [Note] into [OutputNoteRecord] (we fill the `details` and +/// `inclusion_proof` fields if possible) +#[derive(Clone, Debug, PartialEq)] +pub struct OutputNoteRecord { + assets: NoteAssets, + details: Option, + id: NoteId, + inclusion_proof: Option, + metadata: NoteMetadata, + recipient: Digest, + status: NoteStatus, +} + +impl OutputNoteRecord { + pub fn new( + id: NoteId, + recipient: Digest, + assets: NoteAssets, + status: NoteStatus, + metadata: NoteMetadata, + inclusion_proof: Option, + details: Option, + ) -> OutputNoteRecord { + OutputNoteRecord { + id, + recipient, + assets, + status, + metadata, + inclusion_proof, + details, + } + } + + pub fn id(&self) -> NoteId { + self.id + } + + pub fn recipient(&self) -> Digest { + self.recipient + } + + pub fn assets(&self) -> &NoteAssets { + &self.assets + } + + pub fn status(&self) -> NoteStatus { + self.status + } + + pub fn metadata(&self) -> &NoteMetadata { + &self.metadata + } + + pub fn inclusion_proof(&self) -> Option<&NoteInclusionProof> { + self.inclusion_proof.as_ref() + } + + pub fn details(&self) -> Option<&NoteRecordDetails> { + self.details.as_ref() + } +} + +impl From for OutputNoteRecord { + fn from(note: Note) -> Self { + OutputNoteRecord { + id: note.id(), + recipient: note.recipient_digest(), + assets: note.assets().clone(), + status: NoteStatus::Pending, + metadata: *note.metadata(), + inclusion_proof: None, + details: Some(NoteRecordDetails::new( + note.nullifier().to_string(), + note.script().clone(), + note.inputs().to_vec(), + note.serial_num(), + )), + } + } +} diff --git a/wasm/src/web_client/notes.rs b/wasm/src/web_client/notes.rs index d0dd66d90..50587c3af 100644 --- a/wasm/src/web_client/notes.rs +++ b/wasm/src/web_client/notes.rs @@ -1,14 +1,19 @@ +use miden_objects::{notes::NoteId, Digest}; +use miden_tx::utils::Deserializable; use wasm_bindgen::prelude::*; use serde::{Serialize, Deserialize}; use serde_wasm_bindgen::from_value; use web_sys::console; -use crate::native_code::store::NativeNoteFilter; +use crate::native_code::store::{ + NoteFilter, + note_record::InputNoteRecord +}; use super::WebClient; #[derive(Serialize, Deserialize)] -pub enum NoteFilter { +pub enum WebClientNoteFilter { All, Pending, Committed, @@ -20,64 +25,64 @@ impl WebClient { pub async fn get_input_notes( &mut self, filter: JsValue - ) -> () { + ) -> Result { if let Some(ref mut client) = self.get_mut_inner() { - let filter: NoteFilter = from_value(filter).unwrap(); + let filter: WebClientNoteFilter = from_value(filter).unwrap(); let native_filter = match filter { - NoteFilter::Pending => NativeNoteFilter::Pending, - NoteFilter::Committed => NativeNoteFilter::Committed, - NoteFilter::Consumed => NativeNoteFilter::Consumed, - NoteFilter::All => NativeNoteFilter::All + WebClientNoteFilter::Pending => NoteFilter::Pending, + WebClientNoteFilter::Committed => NoteFilter::Committed, + WebClientNoteFilter::Consumed => NoteFilter::Consumed, + WebClientNoteFilter::All => NoteFilter::All }; - let message = client.get_input_notes(native_filter).await; - let js_value_message = JsValue::from_str(&message); - - // Print the message to the Chrome console - console::log_1(&js_value_message); + let notes: Vec = client.get_input_notes(native_filter).await.unwrap(); + let note_ids = notes.iter().map(|note| + note.id().to_string() + ).collect::>(); + + // Convert the Vec to JsValue + serde_wasm_bindgen::to_value(¬e_ids).map_err(|e| JsValue::from_str(&e.to_string())) } else { - console::error_1(&"Client not initialized".into()); + Err(JsValue::from_str("Client not initialized")) } } pub async fn get_input_note( &mut self, note_id: String - ) -> () { + ) -> Result { if let Some(ref mut client) = self.get_mut_inner() { - // let native_note_id = Digest::try_from(note_id).map_err(|err| { - // let error_message = err.to_string(); - // let js_value_error_message = JsValue::from_str(&error_message); - - // console::log_1(&js_value_error_message); - // }) - // .into(); + let note_id: NoteId = Digest::try_from(note_id) + .map_err(|err| format!("Failed to parse input note id: {}", err))? + .into(); + let note: InputNoteRecord = client.get_input_note(note_id).await.unwrap(); - let message = client.get_input_note().await; - let js_value_message = JsValue::from_str(&message); + let message = format!("Note ID: {}", note.id().to_string()); + Ok(JsValue::from_str(&message)) - // Print the message to the Chrome console - console::log_1(&js_value_message); } else { - console::error_1(&"Client not initialized".into()); + Err(JsValue::from_str("Client not initialized")) } } pub async fn import_input_note( &mut self, - file_data: Vec - ) -> () { + note_bytes: JsValue + ) -> Result { if let Some(ref mut client) = self.get_mut_inner() { - // let input_note_record = - // InputNoteRecord::read_from_bytes(&file_data).map_err(|err| err.to_string())?; - - let message = client.import_input_note().await; - let js_value_message = JsValue::from_str(&message); - - // Print the message to the Chrome console - console::log_1(&js_value_message); + let note_bytes_result: Vec = from_value(note_bytes).unwrap(); + let note_data = InputNoteRecord::read_from_bytes(¬e_bytes_result).map_err(|err| err.to_string())?; + let note_id_as_str = note_data.id().to_string(); + + match client.import_input_note(note_data).await { + Ok(_) => { + let message = format!("Import note with ID: {}", note_id_as_str); + Ok(JsValue::from_str(&message)) + }, + Err(err) => Err(JsValue::from_str(&err.to_string())) + } } else { - console::error_1(&"Client not initialized".into()); + Err(JsValue::from_str("Client not initialized")) } } } \ No newline at end of file diff --git a/wasm/src/web_client/store/accounts/mod.rs b/wasm/src/web_client/store/accounts/mod.rs index 7876ae108..8fcc1d1bc 100644 --- a/wasm/src/web_client/store/accounts/mod.rs +++ b/wasm/src/web_client/store/accounts/mod.rs @@ -10,7 +10,7 @@ use miden_objects::{ }; use miden_objects::utils::Deserializable; -use crate::native_code::store::{Store, AuthInfo, NativeNoteFilter}; +use crate::native_code::store::{Store, AuthInfo, NoteFilter}; use super::WebStore; diff --git a/wasm/src/web_client/store/mod.rs b/wasm/src/web_client/store/mod.rs index e70f485c2..fd9c04ff5 100644 --- a/wasm/src/web_client/store/mod.rs +++ b/wasm/src/web_client/store/mod.rs @@ -3,11 +3,15 @@ use wasm_bindgen::prelude::*; use wasm_bindgen_futures::*; use miden_objects::{ - accounts::{Account, AccountId, AccountStub}, - Word + accounts::{Account, AccountId, AccountStub}, notes::NoteId, Word }; -use crate::native_code::store::{Store, AuthInfo}; +use crate::native_code::{ + errors::StoreError, + store::{ + note_record::{InputNoteRecord, OutputNoteRecord}, AuthInfo, NoteFilter, Store + } +}; pub mod accounts; pub mod notes; @@ -43,6 +47,8 @@ impl Store for WebStore { } // CHAIN DATA + // -------------------------------------------------------------------------------------------- + // async fn get_block_headers( // &self, // block_numbers: &[u32], @@ -80,6 +86,8 @@ impl Store for WebStore { // } // SYNC + // -------------------------------------------------------------------------------------------- + // async fn get_note_tags( // &self // ) -> Result, ()> { @@ -119,6 +127,8 @@ impl Store for WebStore { // } // TRANSACTIONS + // -------------------------------------------------------------------------------------------- + // async fn get_transactions( // &mut self, // transaction_filter: TransactionFilter, @@ -134,6 +144,8 @@ impl Store for WebStore { // } // ACCOUNTS + // -------------------------------------------------------------------------------------------- + async fn insert_account( &mut self, account: &Account, @@ -177,40 +189,33 @@ impl Store for WebStore { } // NOTES - // async fn get_input_notes( - // &mut self, - // filter: NativeNoteFilter, - // ) -> Result, ()> { - // self.get_input_notes(filter).await - // } + // -------------------------------------------------------------------------------------------- - // async fn get_input_note( - // &mut self, - // note_id: NoteId, - // ) -> Result { - // self.get_input_note(note_id).await - // } - - // async fn insert_input_note( - // &mut self, - // note: &InputNoteRecord, - // ) -> Result<(), ()> { - // self.insert_input_note(note).await - // } + async fn get_input_notes( + &mut self, + filter: NoteFilter, + ) -> Result, StoreError> { + self.get_input_notes(filter).await + } - // async fn get_output_notes( - // &mut self, - // note_filter: NativeNoteFilter, - // ) -> Result, ()> { - // self.get_output_notes(note_filter).await - // } + async fn get_input_note( + &mut self, + note_id: NoteId, + ) -> Result { + self.get_input_note(note_id).await + } - // async fn get_unspent_input_note_nullifiers( - // &self - // ) -> Result, ()> { - // self.get_unspent_input_note_nullifiers().await - // } + async fn insert_input_note( + &mut self, + note: &InputNoteRecord, + ) -> Result<(), StoreError> { + self.insert_input_note(note).await + } - // TRANSACTIONS - + async fn get_output_notes( + &mut self, + note_filter: NoteFilter, + ) -> Result, StoreError> { + self.get_output_notes(note_filter).await + } } \ No newline at end of file diff --git a/wasm/src/web_client/store/notes/js_bindings.rs b/wasm/src/web_client/store/notes/js_bindings.rs index 30b06a714..7c09b7b99 100644 --- a/wasm/src/web_client/store/notes/js_bindings.rs +++ b/wasm/src/web_client/store/notes/js_bindings.rs @@ -22,7 +22,7 @@ extern "C" { status: String ) -> js_sys::Promise; - #[wasm_bindgen(js_name = getUnpsentInputNoteNullifiers)] + #[wasm_bindgen(js_name = getUnspentInputNoteNullifiers)] pub fn idxdb_get_unspent_input_note_nullifiers() -> js_sys::Promise; // INSERTS @@ -34,8 +34,10 @@ extern "C" { assets: Vec, recipient: String, status: String, - metadata: String, + metadata: Option, details: String, + note_script_hash: String, + serialized_note_script: Vec, inclusion_proof: Option ) -> js_sys::Promise; @@ -46,7 +48,9 @@ extern "C" { recipient: String, status: String, metadata: String, - details: String, + details: Option, + note_script_hash: Option, + serialized_note_script: Option>, inclusion_proof: Option ) -> js_sys::Promise; } \ No newline at end of file diff --git a/wasm/src/web_client/store/notes/mod.rs b/wasm/src/web_client/store/notes/mod.rs index d94c08106..dfdefb9f4 100644 --- a/wasm/src/web_client/store/notes/mod.rs +++ b/wasm/src/web_client/store/notes/mod.rs @@ -1,9 +1,14 @@ +use miden_objects::notes::{NoteAssets, NoteId, NoteInclusionProof, NoteInputs, NoteMetadata, NoteScript, Nullifier}; +use miden_objects::Digest; +use miden_tx::utils::Deserializable; use serde_wasm_bindgen::from_value; use wasm_bindgen_futures::*; use super::WebStore; -use crate::native_code::store::NativeNoteFilter; -use crate::web_client::notes::NoteFilter; +use crate::native_code::errors::StoreError; +use crate::native_code::store::note_record::{InputNoteRecord, NoteRecordDetails, NoteStatus, OutputNoteRecord}; +use crate::native_code::store::NoteFilter; +use crate::web_client::notes::WebClientNoteFilter; mod js_bindings; use js_bindings::*; @@ -15,155 +20,223 @@ mod utils; use utils::*; impl WebStore { - // pub(crate) async fn get_input_notes( - // &mut self, - // filter: NativeNoteFilter - // ) -> Result, ()> { - // let filter_as_str = match filter { - // NativeNoteFilter::Pending => "Pending", - // NativeNoteFilter::Committed => "Committed", - // NativeNoteFilter::Consumed => "Consumed", - // NativeNoteFilter::All => "All", - // }; - - // let promise = idxdb_get_input_notes(filter_as_str.to_string()); - // let js_value = JsFuture::from(promise).await?; - // let input_notes_idxdb: Vec = from_value(js_value).unwrap(); + pub(crate) async fn get_input_notes( + &mut self, + filter: NoteFilter + ) -> Result, StoreError> { + let filter_as_str = match filter { + NoteFilter::Pending => "Pending", + NoteFilter::Committed => "Committed", + NoteFilter::Consumed => "Consumed", + NoteFilter::All => "All", + }; + + let promise = idxdb_get_input_notes(filter_as_str.to_string()); + let js_value = JsFuture::from(promise).await.unwrap(); + let input_notes_idxdb: Vec = from_value(js_value).unwrap(); - // let native_input_notes: Result, ()> = input_notes_idxdb.into_iter().map(|note_idxdb| { - - // let note_details: NoteRecordDetails = - // serde_json::from_str(¬e_idxdb.details).map_err(|_err| ())?; - // let note_metadata: NoteMetadata = - // serde_json::from_str(¬e_idxdb.metadata).map_err(|_err| ())?; - - // let script = NoteScript::read_from_bytes(note_details.script())?; - // let inputs = NoteInputs::read_from_bytes(note_details.inputs())?; - - // let serial_num = note_details.serial_num(); - // let note_metadata = NoteMetadata::new(note_metadata.sender(), note_metadata.tag()); - // let note_assets = NoteAssets::read_from_bytes(¬e_idxdb.assets)?; - // let note = Note::from_parts(script, inputs, note_assets, *serial_num, note_metadata); - - // let inclusion_proof = match note_idxdb.inclusion_proof { - // Some(note_inclusion_proof) => { - // let note_inclusion_proof: NoteInclusionProof = - // serde_json::from_str(¬e_inclusion_proof) - // .map_err(|err| ())?; - - // Some(note_inclusion_proof) - // }, - // _ => None, - // }; - - // Ok(InputNoteRecord::new(note, inclusion_proof)) - // }).collect(); // Collect into a Result, ()> + let native_input_notes: Result, StoreError> = input_notes_idxdb.into_iter().map(|note_idxdb| { + + // Merge the info that comes from the input notes table and the notes script table + let note_script = NoteScript::read_from_bytes(¬e_idxdb.serialized_note_script)?; + let note_details: NoteRecordDetails = + serde_json::from_str(¬e_idxdb.details).map_err(StoreError::JsonDataDeserializationError)?; + let note_details = NoteRecordDetails::new( + note_details.nullifier().to_string(), + note_script, + note_details.inputs().clone(), + note_details.serial_num(), + ); + + let note_metadata: Option = if let Some(metadata_as_json_str) = note_idxdb.metadata { + Some( + serde_json::from_str(&metadata_as_json_str) + .map_err(StoreError::JsonDataDeserializationError)?, + ) + } else { + None + }; + + let note_assets = NoteAssets::read_from_bytes(¬e_idxdb.assets)?; + + let inclusion_proof = match note_idxdb.inclusion_proof { + Some(note_inclusion_proof) => { + let note_inclusion_proof: NoteInclusionProof = + serde_json::from_str(¬e_inclusion_proof) + .map_err(StoreError::JsonDataDeserializationError)?; + + Some(note_inclusion_proof) + }, + _ => None, + }; + + let recipient = Digest::try_from(note_idxdb.recipient)?; + let id = NoteId::new(recipient, note_assets.commitment()); + let status: NoteStatus = serde_json::from_str(&format!("\"{0}\"", note_idxdb.status)) + .map_err(StoreError::JsonDataDeserializationError)?; + + Ok(InputNoteRecord::new( + id, + recipient, + note_assets, + status, + note_metadata, + inclusion_proof, + note_details, + )) + }).collect(); - // return native_input_notes; - // } - - // pub(crate) async fn get_input_note( - // &mut self, - // note_id: NoteId - // ) -> Result { - // let note_id_str = ¬e_id.inner().to_string(); - - // let promise = idxdb_get_input_note(note_id_str); - // let js_value = JsFuture::from(promise).await?; - // let input_note_idxdb: InputNoteIdxdbObject = from_value(js_value).unwrap(); - - // let note_details: NoteRecordDetails = - // serde_json::from_str(&input_note_idxdb.details).map_err(|_err| ())?; - // let note_metadata: NoteMetadata = - // serde_json::from_str(&input_note_idxdb.metadata).map_err(|_err| ())?; - - // let script = NoteScript::read_from_bytes(note_details.script())?; - // let inputs = NoteInputs::read_from_bytes(note_details.inputs())?; - - // let serial_num = note_details.serial_num(); - // let note_metadata = NoteMetadata::new(note_metadata.sender(), note_metadata.tag()); - // let note_assets = NoteAssets::read_from_bytes(&input_note_idxdb.assets)?; - // let note = Note::from_parts(script, inputs, note_assets, *serial_num, note_metadata); - - // let inclusion_proof = match input_note_idxdb.inclusion_proof { - // Some(note_inclusion_proof) => { - // let note_inclusion_proof: NoteInclusionProof = - // serde_json::from_str(¬e_inclusion_proof) - // .map_err(|err| ())?; - - // Some(note_inclusion_proof) - // }, - // _ => None, - // }; - - // Ok(InputNoteRecord::new(note, inclusion_proof)) - // } - - // pub(crate) async fn insert_input_note( - // &mut self, - // note: &InputNoteRecord - // ) -> Result<(), ()> { - // insert_input_note_tx(note).await - // } - - // pub(crate) async fn get_output_notes( - // &mut self, - // filter: NativeNoteFilter - // ) -> Result, ()> { - // let filter_as_str = match filter { - // NativeNoteFilter::Pending => "Pending", - // NativeNoteFilter::Committed => "Committed", - // NativeNoteFilter::Consumed => "Consumed", - // NativeNoteFilter::All => "All", - // }; - - // let promise = idxdb_get_output_notes(filter_as_str.to_string()); - // let js_value = JsFuture::from(promise).await?; - // let output_notes_idxdb: Vec = from_value(js_value).unwrap(); + return native_input_notes; + } + + pub(crate) async fn get_input_note( + &mut self, + note_id: NoteId + ) -> Result { + let note_id_str = ¬e_id.inner().to_string(); + + let promise = idxdb_get_input_note(note_id_str.to_string()); + let js_value = JsFuture::from(promise).await.unwrap(); + let input_note_idxdb: InputNoteIdxdbObject = from_value(js_value).unwrap(); + + // Merge the info that comes from the input notes table and the notes script table + let note_script = NoteScript::read_from_bytes(&input_note_idxdb.serialized_note_script)?; + let note_details: NoteRecordDetails = + serde_json::from_str(&input_note_idxdb.details).map_err(StoreError::JsonDataDeserializationError)?; + let note_details = NoteRecordDetails::new( + note_details.nullifier().to_string(), + note_script, + note_details.inputs().clone(), + note_details.serial_num(), + ); + + let note_metadata: Option = if let Some(metadata_as_json_str) = input_note_idxdb.metadata { + Some( + serde_json::from_str(&metadata_as_json_str) + .map_err(StoreError::JsonDataDeserializationError)?, + ) + } else { + None + }; + + let note_assets = NoteAssets::read_from_bytes(&input_note_idxdb.assets)?; + + let inclusion_proof = match input_note_idxdb.inclusion_proof { + Some(note_inclusion_proof) => { + let note_inclusion_proof: NoteInclusionProof = + serde_json::from_str(¬e_inclusion_proof) + .map_err(StoreError::JsonDataDeserializationError)?; + + Some(note_inclusion_proof) + }, + _ => None, + }; + + let recipient = Digest::try_from(input_note_idxdb.recipient)?; + let id = NoteId::new(recipient, note_assets.commitment()); + let status: NoteStatus = serde_json::from_str(&format!("\"{0}\"", input_note_idxdb.status)) + .map_err(StoreError::JsonDataDeserializationError)?; + + Ok(InputNoteRecord::new( + id, + recipient, + note_assets, + status, + note_metadata, + inclusion_proof, + note_details, + )) + } + + pub(crate) async fn insert_input_note( + &mut self, + note: &InputNoteRecord + ) -> Result<(), StoreError> { + insert_input_note_tx(note).await + } + + pub(crate) async fn get_output_notes( + &mut self, + filter: NoteFilter + ) -> Result, StoreError> { + let filter_as_str = match filter { + NoteFilter::Pending => "Pending", + NoteFilter::Committed => "Committed", + NoteFilter::Consumed => "Consumed", + NoteFilter::All => "All", + }; + + let promise = idxdb_get_output_notes(filter_as_str.to_string()); + let js_value = JsFuture::from(promise).await.unwrap(); + let output_notes_idxdb: Vec = from_value(js_value).unwrap(); - // let native_output_notes: Result, ()> = output_notes_idxdb.into_iter().map(|note_idxdb| { - - // let note_details: NoteRecordDetails = - // serde_json::from_str(¬e_idxdb.details).map_err(|_err| ())?; - // let note_metadata: NoteMetadata = - // serde_json::from_str(¬e_idxdb.metadata).map_err(|_err| ())?; - - // let script = NoteScript::read_from_bytes(note_details.script())?; - // let inputs = NoteInputs::read_from_bytes(note_details.inputs())?; - - // let serial_num = note_details.serial_num(); - // let note_metadata = NoteMetadata::new(note_metadata.sender(), note_metadata.tag()); - // let note_assets = NoteAssets::read_from_bytes(¬e_idxdb.assets)?; - // let note = Note::from_parts(script, inputs, note_assets, *serial_num, note_metadata); - - // let inclusion_proof = match note_idxdb.inclusion_proof { - // Some(note_inclusion_proof) => { - // let note_inclusion_proof: NoteInclusionProof = - // serde_json::from_str(¬e_inclusion_proof) - // .map_err(|err| ())?; - - // Some(note_inclusion_proof) - // }, - // _ => None, - // }; - - // Ok(InputNoteRecord::new(note, inclusion_proof)) - // }).collect(); // Collect into a Result, ()> + let native_output_notes: Result, StoreError> = output_notes_idxdb.into_iter().map(|note_idxdb| { + + let note_details: Option = if let Some(details_as_json_str) = note_idxdb.details { + // Merge the info that comes from the input notes table and the notes script table + let serialized_note_script = note_idxdb.serialized_note_script + .expect("Has note details so it should have the serialized script"); + let note_script = NoteScript::read_from_bytes(&serialized_note_script)?; + let note_details: NoteRecordDetails = serde_json::from_str(&details_as_json_str) + .map_err(StoreError::JsonDataDeserializationError)?; + let note_details = NoteRecordDetails::new( + note_details.nullifier().to_string(), + note_script, + note_details.inputs().clone(), + note_details.serial_num(), + ); - // return native_output_notes; - // } - - // pub(crate) async fn get_unspent_input_note_nullifiers( - // &mut self - // ) -> Result, ()>{ - // let promise = idxdb_get_unspent_input_note_nullifiers(); - // let js_value = JsFuture::from(promise).await?; - // let nullifiers_as_str: Vec = from_value(js_value).unwrap(); - - // let nullifiers = nullifiers_as_str.into_iter().map(|s| { - // Digest::try_from(v).map(Nullifier::from).map_err(|err| ()) - // }).collect::, _>>(); - - // return nullifiers - // } + Some(note_details) + } else { + None + }; + + let note_metadata: NoteMetadata = + serde_json::from_str(¬e_idxdb.metadata).map_err(StoreError::JsonDataDeserializationError)?; + + let note_assets = NoteAssets::read_from_bytes(¬e_idxdb.assets)?; + + let inclusion_proof = match note_idxdb.inclusion_proof { + Some(note_inclusion_proof) => { + let note_inclusion_proof: NoteInclusionProof = + serde_json::from_str(¬e_inclusion_proof) + .map_err(StoreError::JsonDataDeserializationError)?; + + Some(note_inclusion_proof) + }, + _ => None, + }; + + let recipient = Digest::try_from(note_idxdb.recipient)?; + let id = NoteId::new(recipient, note_assets.commitment()); + let status: NoteStatus = serde_json::from_str(&format!("\"{0}\"", note_idxdb.status)) + .map_err(StoreError::JsonDataDeserializationError)?; + + Ok(OutputNoteRecord::new( + id, + recipient, + note_assets, + status, + note_metadata, + inclusion_proof, + note_details, + )) + }).collect(); // Collect into a Result, ()> + + return native_output_notes; + } + + pub(crate) async fn get_unspent_input_note_nullifiers( + &mut self + ) -> Result, StoreError>{ + let promise = idxdb_get_unspent_input_note_nullifiers(); + let js_value = JsFuture::from(promise).await.unwrap(); + let nullifiers_as_str: Vec = from_value(js_value).unwrap(); + + let nullifiers = nullifiers_as_str.into_iter().map(|s| { + Digest::try_from(s).map(Nullifier::from).map_err(StoreError::HexParseError) + }).collect::, _>>(); + + return nullifiers; + } } \ No newline at end of file diff --git a/wasm/src/web_client/store/notes/models.rs b/wasm/src/web_client/store/notes/models.rs index c967156e3..03f2d69bd 100644 --- a/wasm/src/web_client/store/notes/models.rs +++ b/wasm/src/web_client/store/notes/models.rs @@ -4,14 +4,20 @@ use serde::{Deserialize, Serialize}; pub struct InputNoteIdxdbObject { pub assets: Vec, pub details: String, - pub metadata: String, - pub inclusion_proof: Option + pub recipient: String, + pub status: String, + pub metadata: Option, + pub inclusion_proof: Option, + pub serialized_note_script: Vec } #[derive(Serialize, Deserialize)] pub struct OutputNoteIdxdbObject { pub assets: Vec, - pub details: String, + pub details: Option, + pub recipient: String, + pub status: String, pub metadata: String, - pub inclusion_proof: Option + pub inclusion_proof: Option, + pub serialized_note_script: Option> } \ No newline at end of file diff --git a/wasm/src/web_client/store/notes/utils.rs b/wasm/src/web_client/store/notes/utils.rs index 82769abb5..479db1463 100644 --- a/wasm/src/web_client/store/notes/utils.rs +++ b/wasm/src/web_client/store/notes/utils.rs @@ -1,105 +1,222 @@ +use miden_objects::notes::NoteInclusionProof; +use miden_tx::utils::Serializable; use wasm_bindgen_futures::*; +use crate::native_code::{errors::StoreError, store::note_record::{InputNoteRecord, NoteStatus, OutputNoteRecord}}; + use super::js_bindings::*; // TYPES // ================================================================================================ -// type SerializedInputNoteData = (String, Vec, String, String, String, String, Option); - -// type SerializedInputNoteParts = (Vec, String, String, Option); +type SerializedInputNoteData = ( + String, + Vec, + String, + String, + Option, + String, + String, + Vec, + Option +); + +type SerializedOutputNoteData = ( + String, + Vec, + String, + String, + String, + Option, + Option, + Option>, + Option, +); // ================================================================================================ -// pub(crate) fn serialize_note( -// note: &InputNoteRecord -// ) -> Result { -// let note_id = note.note_id().inner().to_string(); -// let note_assets = note.note().assets().to_bytes(); -// let (inclusion_proof, status) = match note.inclusion_proof() { -// Some(proof) => { -// // FIXME: This removal is to accomodate a problem with how the node constructs paths where -// // they are constructed using note ID instead of authentication hash, so for now we remove the first -// // node here. -// // -// // Note: once removed we can also stop creating a new `NoteInclusionProof` -// // -// // See: https://github.com/0xPolygonMiden/miden-node/blob/main/store/src/state.rs#L274 -// let mut path = proof.note_path().clone(); -// if path.len() > 0 { -// let _removed = path.remove(0); -// } - -// let block_num = proof.origin().block_num; -// let node_index = proof.origin().node_index.value(); -// let sub_hash = proof.sub_hash(); -// let note_root = proof.note_root(); - -// let inclusion_proof = serde_json::to_string(&NoteInclusionProof::new( -// block_num, sub_hash, note_root, node_index, path, -// )?) -// .map_err(|err| ())?; - -// (Some(inclusion_proof), String::from("committed")) -// }, -// None => (None, String::from("pending")), -// }; -// let recipient = note.note().recipient().to_hex(); - -// let sender_id = note.note().metadata().sender(); -// let tag = note.note().metadata().tag(); -// let metadata = serde_json::to_string(&NoteMetadata::new(sender_id, tag)) -// .map_err(|err| ())?; - -// let nullifier = note.note().nullifier().inner().to_string(); -// let script = note.note().script().to_bytes(); -// let inputs = note.note().inputs().to_bytes(); -// let serial_num = note.note().serial_num(); -// let details = -// serde_json::to_string(&NoteRecordDetails::new(nullifier, script, inputs, serial_num)) -// .map_err(|err| ())?; - -// Ok((note_id, note_assets, recipient, status, metadata, details, inclusion_proof)) -// } - -// pub(super) async fn insert_input_note_tx( -// note: &InputNoteRecord -// ) -> Result<(), ()> { -// let (note_id, assets, recipient, status, metadata, details, inclusion_proof) = -// serialize_note(note)?; - -// let result = JsFuture::from(idxdb_insert_input_note( -// note_id, -// assets, -// recipient, -// status, -// metadata, -// details, -// inclusion_proof -// )).await; -// match result { -// Ok(_) => Ok(()), -// Err(_) => Err(()), -// } -// } - -// pub async fn insert_output_note_tx( -// note: &InputNoteRecord -// ) -> Result<(), ()> { -// let (note_id, assets, recipient, status, metadata, details, inclusion_proof) = -// serialize_note(note)?; - -// let result = JsFuture::from(idxdb_insert_output_note( -// note_id, -// assets, -// recipient, -// status, -// metadata, -// details, -// inclusion_proof -// )).await; -// match result { -// Ok(_) => Ok(()), -// Err(_) => Err(()), -// } -// } \ No newline at end of file +pub(crate) fn serialize_input_note( + note: &InputNoteRecord +) -> Result { + let note_id = note.id().inner().to_string(); + let note_assets = note.assets().to_bytes(); + + let (inclusion_proof, status) = match note.inclusion_proof() { + Some(proof) => { + let block_num = proof.origin().block_num; + let node_index = proof.origin().node_index.value(); + let sub_hash = proof.sub_hash(); + let note_root = proof.note_root(); + + let inclusion_proof = serde_json::to_string(&NoteInclusionProof::new( + block_num, + sub_hash, + note_root, + node_index, + proof.note_path().clone(), + )?) + .map_err(StoreError::InputSerializationError)?; + + let status = serde_json::to_string(&NoteStatus::Committed) + .map_err(StoreError::InputSerializationError)? + .replace('\"', ""); + (Some(inclusion_proof), status) + }, + None => { + let status = serde_json::to_string(&NoteStatus::Pending) + .map_err(StoreError::InputSerializationError)? + .replace('\"', ""); + + (None, status) + }, + }; + let recipient = note.recipient().to_hex(); + + let metadata = if let Some(metadata) = note.metadata() { + Some(serde_json::to_string(metadata).map_err(StoreError::InputSerializationError)?) + } else { + None + }; + + let details = + serde_json::to_string(¬e.details()).map_err(StoreError::InputSerializationError)?; + let note_script_hash = note.details().script_hash().to_hex(); + let serialized_note_script = note.details().script().to_bytes(); + + Ok(( + note_id, + note_assets, + recipient, + status, + metadata, + details, + note_script_hash, + serialized_note_script, + inclusion_proof, + )) +} + +pub(super) async fn insert_input_note_tx( + note: &InputNoteRecord +) -> Result<(), StoreError> { + let ( + note_id, + assets, + recipient, + status, + metadata, + details, + note_script_hash, + serialized_note_script, + inclusion_proof + ) = serialize_input_note(note)?; + + let result = JsFuture::from(idxdb_insert_input_note( + note_id, + assets, + recipient, + status, + metadata, + details, + note_script_hash, + serialized_note_script, + inclusion_proof + )).await; + match result { + Ok(_) => Ok(()), + Err(_) => Err(StoreError::QueryError("Failed to insert input note".to_string())), + } +} + +pub(crate) fn serialize_output_note( + note: &OutputNoteRecord, +) -> Result { + let note_id = note.id().inner().to_string(); + let note_assets = note.assets().to_bytes(); + let (inclusion_proof, status) = match note.inclusion_proof() { + Some(proof) => { + let block_num = proof.origin().block_num; + let node_index = proof.origin().node_index.value(); + let sub_hash = proof.sub_hash(); + let note_root = proof.note_root(); + + let inclusion_proof = serde_json::to_string(&NoteInclusionProof::new( + block_num, + sub_hash, + note_root, + node_index, + proof.note_path().clone(), + )?) + .map_err(StoreError::InputSerializationError)?; + + let status = serde_json::to_string(&NoteStatus::Committed) + .map_err(StoreError::InputSerializationError)? + .replace('\"', ""); + + (Some(inclusion_proof), status) + }, + None => { + let status = serde_json::to_string(&NoteStatus::Pending) + .map_err(StoreError::InputSerializationError)? + .replace('\"', ""); + + (None, status) + }, + }; + let recipient = note.recipient().to_hex(); + + let metadata = + serde_json::to_string(note.metadata()).map_err(StoreError::InputSerializationError)?; + + let details = if let Some(details) = note.details() { + Some(serde_json::to_string(&details).map_err(StoreError::InputSerializationError)?) + } else { + None + }; + let note_script_hash = note.details().map(|details| details.script_hash().to_hex()); + let serialized_note_script = note.details().map(|details| details.script().to_bytes()); + + Ok(( + note_id, + note_assets, + recipient, + status, + metadata, + details, + note_script_hash, + serialized_note_script, + inclusion_proof, + )) +} + +pub async fn insert_output_note_tx( + note: &OutputNoteRecord +) -> Result<(), StoreError> { + let ( + note_id, + assets, + recipient, + status, + metadata, + details, + note_script_hash, + serialized_note_script, + inclusion_proof + ) = serialize_output_note(note)?; + + let result = JsFuture::from(idxdb_insert_output_note( + note_id, + assets, + recipient, + status, + metadata, + details, + note_script_hash, + serialized_note_script, + inclusion_proof + )).await; + match result { + Ok(_) => Ok(()), + Err(_) => Err(StoreError::QueryError("Failed to insert output note".to_string())), + } +} \ No newline at end of file From 7bac3dce14b72293a36615827c332815b242944c Mon Sep 17 00:00:00 2001 From: Dennis Garcia Date: Tue, 30 Apr 2024 15:19:57 -0500 Subject: [PATCH 14/42] RPC Calls Working with Tonic Web WASM Client and Envoy (#12) --- wasm/Cargo.toml | 11 +- wasm/build.rs | 25 ++ wasm/config/envoy.yaml | 56 +++ wasm/src/native_code/errors.rs | 47 +++ wasm/src/native_code/rpc/mod.rs | 187 ++++++++- wasm/src/web_client/account.rs | 2 +- wasm/src/web_client/mod.rs | 4 +- wasm/src/web_client/rpc/client_grpc.rs | 47 +++ wasm/src/web_client/rpc/domain/accounts.rs | 248 ++++++++++++ wasm/src/web_client/rpc/domain/blocks.rs | 83 ++++ wasm/src/web_client/rpc/domain/digest.rs | 245 ++++++++++++ wasm/src/web_client/rpc/domain/merkle.rs | 157 ++++++++ wasm/src/web_client/rpc/domain/mod.rs | 30 ++ wasm/src/web_client/rpc/domain/nullifiers.rs | 70 ++++ wasm/src/web_client/rpc/mod.rs | 357 ++++++++++++++++++ wasm/src/web_client/rpc/proto/account.proto | 22 ++ .../web_client/rpc/proto/block_header.proto | 27 ++ .../web_client/rpc/proto/block_producer.proto | 11 + wasm/src/web_client/rpc/proto/digest.proto | 10 + wasm/src/web_client/rpc/proto/merkle.proto | 8 + wasm/src/web_client/rpc/proto/mmr.proto | 9 + wasm/src/web_client/rpc/proto/note.proto | 40 ++ wasm/src/web_client/rpc/proto/requests.proto | 99 +++++ wasm/src/web_client/rpc/proto/responses.proto | 119 ++++++ wasm/src/web_client/rpc/proto/rpc.proto | 15 + wasm/src/web_client/rpc/proto/smt.proto | 32 ++ wasm/src/web_client/rpc/proto/store.proto | 22 ++ wasm/src/web_client/web_rpc_client.rs | 38 -- 28 files changed, 1978 insertions(+), 43 deletions(-) create mode 100644 wasm/build.rs create mode 100644 wasm/config/envoy.yaml create mode 100644 wasm/src/web_client/rpc/client_grpc.rs create mode 100644 wasm/src/web_client/rpc/domain/accounts.rs create mode 100644 wasm/src/web_client/rpc/domain/blocks.rs create mode 100644 wasm/src/web_client/rpc/domain/digest.rs create mode 100644 wasm/src/web_client/rpc/domain/merkle.rs create mode 100644 wasm/src/web_client/rpc/domain/mod.rs create mode 100644 wasm/src/web_client/rpc/domain/nullifiers.rs create mode 100644 wasm/src/web_client/rpc/mod.rs create mode 100644 wasm/src/web_client/rpc/proto/account.proto create mode 100644 wasm/src/web_client/rpc/proto/block_header.proto create mode 100644 wasm/src/web_client/rpc/proto/block_producer.proto create mode 100644 wasm/src/web_client/rpc/proto/digest.proto create mode 100644 wasm/src/web_client/rpc/proto/merkle.proto create mode 100644 wasm/src/web_client/rpc/proto/mmr.proto create mode 100644 wasm/src/web_client/rpc/proto/note.proto create mode 100644 wasm/src/web_client/rpc/proto/requests.proto create mode 100644 wasm/src/web_client/rpc/proto/responses.proto create mode 100644 wasm/src/web_client/rpc/proto/rpc.proto create mode 100644 wasm/src/web_client/rpc/proto/smt.proto create mode 100644 wasm/src/web_client/rpc/proto/store.proto delete mode 100644 wasm/src/web_client/web_rpc_client.rs diff --git a/wasm/Cargo.toml b/wasm/Cargo.toml index ec2ac7343..ecac4591c 100644 --- a/wasm/Cargo.toml +++ b/wasm/Cargo.toml @@ -3,6 +3,7 @@ name = "miden-wasm" version = "1.0.0" description = "WebAssembly based toolkit for developing zero knowledge applications with Polygon Miden" edition = "2021" +build = "build.rs" [lib] crate-type = ["cdylib"] @@ -21,14 +22,22 @@ async-trait = "0.1" base64 = "0.13" futures = "0.3" getrandom = { version = "0.2", features = ["js"] } +hex = { version = "0.4" } miden-lib = { version = "0.2", default-features = false } miden-objects = { version = "0.2", features = ["serde"] } miden-tx = { version = "0.2", default-features = false } rand = { version = "0.8.5" } +prost = { version = "0.12.3" } serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" serde-wasm-bindgen = "0.6.5" +thiserror = { version = "1.0" } +tonic = { version="0.11.0", default-features = false, features=["prost","codegen"] } +tonic-web-wasm-client = "0.5" tracing = { version = "0.1" } wasm-bindgen = { version = "0.2", features = ["serde-serialize"] } wasm-bindgen-futures = "0.4" -web-sys = { version = "0.3", features = ["console"] } \ No newline at end of file +web-sys = { version = "0.3", features = ["console"] } + +[build-dependencies] +tonic-build = { version="0.11.0", default-features = false, features = ["prost"]} \ No newline at end of file diff --git a/wasm/build.rs b/wasm/build.rs new file mode 100644 index 000000000..9e7b766d3 --- /dev/null +++ b/wasm/build.rs @@ -0,0 +1,25 @@ + +use std::io; + +fn main() -> io::Result<()> { + // Compile the proto files into Rust code + tonic_build::configure() + .build_server(false) + .build_client(true) + .compile(&[ + "src/web_client/rpc/proto/account.proto", + "src/web_client/rpc/proto/block_header.proto", + "src/web_client/rpc/proto/block_producer.proto", + "src/web_client/rpc/proto/digest.proto", + "src/web_client/rpc/proto/merkle.proto", + "src/web_client/rpc/proto/mmr.proto", + "src/web_client/rpc/proto/note.proto", + "src/web_client/rpc/proto/requests.proto", + "src/web_client/rpc/proto/responses.proto", + "src/web_client/rpc/proto/rpc.proto", + "src/web_client/rpc/proto/smt.proto", + "src/web_client/rpc/proto/store.proto", + ], &[ + "src/web_client/rpc/proto" + ]) +} \ No newline at end of file diff --git a/wasm/config/envoy.yaml b/wasm/config/envoy.yaml new file mode 100644 index 000000000..f29fdefff --- /dev/null +++ b/wasm/config/envoy.yaml @@ -0,0 +1,56 @@ +static_resources: + listeners: + - name: listener_0 + address: + socket_address: + address: 0.0.0.0 + port_value: 8080 + filter_chains: + - filters: + - name: envoy.filters.network.http_connection_manager + typed_config: + "@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager + stat_prefix: grpc_web + route_config: + name: local_route + virtual_hosts: + - name: local_service + domains: ["*"] + routes: + - match: { prefix: "/" } + route: + cluster: grpc_server + cors: + allow_origin_string_match: + - safe_regex: + google_re2: {} + regex: "http://localhost:3000" + allow_methods: "GET, PUT, DELETE, POST, OPTIONS" + allow_headers: "content-type, x-grpc-web, x-user-agent" + max_age: "1728000" + expose_headers: "custom-header1, grpc-status, grpc-message" + http_filters: + - name: envoy.filters.http.cors + typed_config: + "@type": type.googleapis.com/envoy.extensions.filters.http.cors.v3.Cors + - name: envoy.filters.http.grpc_web + typed_config: + "@type": type.googleapis.com/envoy.extensions.filters.http.grpc_web.v3.GrpcWeb + - name: envoy.filters.http.router + typed_config: + "@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router + clusters: + - name: grpc_server + connect_timeout: 0.25s + type: LOGICAL_DNS + lb_policy: ROUND_ROBIN + load_assignment: + cluster_name: grpc_server + endpoints: + - lb_endpoints: + - endpoint: + address: + socket_address: + address: host.docker.internal + port_value: 57291 + http2_protocol_options: {} \ No newline at end of file diff --git a/wasm/src/native_code/errors.rs b/wasm/src/native_code/errors.rs index 47d9ffd24..d6a1526f8 100644 --- a/wasm/src/native_code/errors.rs +++ b/wasm/src/native_code/errors.rs @@ -9,6 +9,47 @@ use miden_tx::{ DataStoreError, TransactionExecutorError, TransactionProverError, }; +use std::any::type_name; + +use miden_objects::crypto::merkle::{SmtLeafError, SmtProofError}; +use thiserror::Error; + +#[derive(Debug, Clone, PartialEq, Error)] +pub enum ConversionError { + #[error("Hex error: {0}")] + HexError(#[from] hex::FromHexError), + #[error("SMT leaf error: {0}")] + SmtLeafError(#[from] SmtLeafError), + #[error("SMT proof error: {0}")] + SmtProofError(#[from] SmtProofError), + #[error("Too much data, expected {expected}, got {got}")] + TooMuchData { expected: usize, got: usize }, + #[error("Not enough data, expected {expected}, got {got}")] + InsufficientData { expected: usize, got: usize }, + #[error("Value is not in the range 0..MODULUS")] + NotAValidFelt, + #[error("Field `{field_name}` required to be filled in protobuf representation of {entity}")] + MissingFieldInProtobufRepresentation { + entity: &'static str, + field_name: &'static str, + }, +} + +impl Eq for ConversionError {} + +pub trait MissingFieldHelper { + fn missing_field(field_name: &'static str) -> ConversionError; +} + +impl MissingFieldHelper for T { + fn missing_field(field_name: &'static str) -> ConversionError { + ConversionError::MissingFieldInProtobufRepresentation { + entity: type_name::(), + field_name, + } + } +} + // CLIENT ERROR // ================================================================================================ @@ -337,6 +378,12 @@ impl From for NodeRpcClientError { } } +impl From for NodeRpcClientError { + fn from(err: ConversionError) -> Self { + Self::ConversionFailure(err.to_string()) + } +} + // NOTE ID PREFIX FETCH ERROR // ================================================================================================ diff --git a/wasm/src/native_code/rpc/mod.rs b/wasm/src/native_code/rpc/mod.rs index 664377f02..e1cf98a85 100644 --- a/wasm/src/native_code/rpc/mod.rs +++ b/wasm/src/native_code/rpc/mod.rs @@ -1,9 +1,194 @@ +use async_trait::async_trait; +use core::fmt; use wasm_bindgen::prelude::*; -use async_trait::async_trait; +use miden_objects::{ + accounts::{Account, AccountId}, + crypto::merkle::{MerklePath, MmrDelta}, + notes::{Note, NoteId, NoteMetadata, NoteTag}, + transaction::ProvenTransaction, + BlockHeader, Digest, +}; + +use crate::native_code::errors::NodeRpcClientError; + +// NOTE DETAILS +// ================================================================================================ + +/// Describes the possible responses from the `GetNotesById` endpoint for a single note +pub enum NoteDetails { + OffChain(NoteId, NoteMetadata, NoteInclusionDetails), + Public(Note, NoteInclusionDetails), +} + +/// Contains information related to the note inclusion, but not related to the block header +/// that contains the note +pub struct NoteInclusionDetails { + pub block_num: u32, + pub note_index: u32, + pub merkle_path: MerklePath, +} +impl NoteInclusionDetails { + pub fn new(block_num: u32, note_index: u32, merkle_path: MerklePath) -> Self { + Self { block_num, note_index, merkle_path } + } +} + +// NODE RPC CLIENT TRAIT +// ================================================================================================ + +/// Defines the interface for communicating with the Miden node. +/// +/// The implementers are responsible for connecting to the Miden node, handling endpoint +/// requests/responses, and translating responses into domain objects relevant for each of the +/// endpoints. #[async_trait(?Send)] pub trait NodeRpcClient { // Test RPC method to be implemented by the client async fn test_rpc(&mut self) -> Result<(), JsValue>; + + /// Given a Proven Transaction, send it to the node for it to be included in a future block + /// using the `/SubmitProvenTransaction` rpc endpoint + async fn submit_proven_transaction( + &mut self, + proven_transaction: ProvenTransaction, + ) -> Result<(), NodeRpcClientError>; + + /// Given a block number, fetches the block header corresponding to that height from the node + /// using the `/GetBlockHeaderByNumber` endpoint + /// + /// When `None` is provided, returns info regarding the latest block + async fn get_block_header_by_number( + &mut self, + block_number: Option, + ) -> Result; + + /// Fetches note-related data for a list of [NoteId] using the `/GetNotesById` rpc endpoint + /// + /// For any NoteType::Offchain note, the return data is only the [NoteMetadata], whereas + /// for NoteType::Onchain notes, the return data includes all details. + async fn get_notes_by_id( + &mut self, + note_ids: &[NoteId], + ) -> Result, NodeRpcClientError>; + + /// Fetches info from the node necessary to perform a state sync using the + /// `/SyncState` rpc endpoint + /// + /// - `block_num` is the last block number known by the client. The returned [StateSyncInfo] + /// should contain data starting from the next block, until the first block which contains a + /// note of matching the requested tag, or the chain tip if there are no notes. + /// - `account_ids` is a list of account ids and determines the accounts the client is interested + /// in and should receive account updates of. + /// - `note_tags` is a list of tags used to filter the notes the client is interested in, which + /// serves as a "note group" filter. Notice that you can't filter by a specific note id + /// - `nullifiers_tags` similar to `note_tags`, is a list of tags used to filter the nullifiers + /// corresponding to some notes the client is interested in + async fn sync_state( + &mut self, + block_num: u32, + account_ids: &[AccountId], + note_tags: &[NoteTag], + nullifiers_tags: &[u16], + ) -> Result; + + /// Fetches the current state of an account from the node using the `/GetAccountDetails` rpc endpoint + /// + /// - `account_id` is the id of the wanted account. + async fn get_account_update( + &mut self, + account_id: AccountId, + ) -> Result; +} + +// STATE SYNC INFO +// ================================================================================================ + +/// Represents a `SyncStateResponse` with fields converted into domain types +pub struct StateSyncInfo { + /// The block number of the chain tip at the moment of the response + pub chain_tip: u32, + /// The returned block header + pub block_header: BlockHeader, + /// MMR delta that contains data for (current_block.num, incoming_block_header.num-1) + pub mmr_delta: MmrDelta, + /// Tuples of AccountId alongside their new account hashes + pub account_hash_updates: Vec<(AccountId, Digest)>, + /// List of tuples of Note ID, Note Index and Merkle Path for all new notes + pub note_inclusions: Vec, + /// List of nullifiers that identify spent notes + pub nullifiers: Vec, +} + +// COMMITTED NOTE +// ================================================================================================ + +/// Represents a committed note, returned as part of a `SyncStateResponse` +pub struct CommittedNote { + /// Note ID of the committed note + note_id: NoteId, + /// Note index for the note merkle tree + note_index: u32, + /// Merkle path for the note merkle tree up to the block's note root + merkle_path: MerklePath, + /// Note metadata + metadata: NoteMetadata, +} + +impl CommittedNote { + pub fn new( + note_id: NoteId, + note_index: u32, + merkle_path: MerklePath, + metadata: NoteMetadata, + ) -> Self { + Self { + note_id, + note_index, + merkle_path, + metadata, + } + } + + pub fn note_id(&self) -> &NoteId { + &self.note_id + } + + pub fn note_index(&self) -> u32 { + self.note_index + } + + pub fn merkle_path(&self) -> &MerklePath { + &self.merkle_path + } + + #[allow(dead_code)] + pub fn metadata(&self) -> NoteMetadata { + self.metadata + } +} + +// RPC API ENDPOINT +// ================================================================================================ +// +#[derive(Debug)] +pub enum NodeRpcClientEndpoint { + GetAccountDetails, + GetBlockHeaderByNumber, + SyncState, + SubmitProvenTx, +} + +impl fmt::Display for NodeRpcClientEndpoint { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + NodeRpcClientEndpoint::GetAccountDetails => write!(f, "get_account_details"), + NodeRpcClientEndpoint::GetBlockHeaderByNumber => { + write!(f, "get_block_header_by_number") + }, + NodeRpcClientEndpoint::SyncState => write!(f, "sync_state"), + NodeRpcClientEndpoint::SubmitProvenTx => write!(f, "submit_proven_transaction"), + } + } } \ No newline at end of file diff --git a/wasm/src/web_client/account.rs b/wasm/src/web_client/account.rs index 7fb116b3b..c1e5b8736 100644 --- a/wasm/src/web_client/account.rs +++ b/wasm/src/web_client/account.rs @@ -1,7 +1,7 @@ use super::WebClient; use base64::encode; -use miden_objects::{accounts::{AccountData, AccountId}, assets::TokenSymbol}; +use miden_objects::{accounts::{AccountData, AccountId}, assets::TokenSymbol, notes::NoteId}; use miden_tx::utils::{Deserializable, Serializable}; use crate::native_code::accounts; diff --git a/wasm/src/web_client/mod.rs b/wasm/src/web_client/mod.rs index bb0a7b6c5..ad9d6bec7 100644 --- a/wasm/src/web_client/mod.rs +++ b/wasm/src/web_client/mod.rs @@ -11,10 +11,10 @@ pub mod notes; pub mod transactions; pub mod sync; pub mod store; -pub mod web_rpc_client; +pub mod rpc; use store::WebStore; -use web_rpc_client::WebRpcClient; +use rpc::WebRpcClient; // My strategy here is to create a WebClient struct that has methods exposed // to the browser environment. When these methods are called, they will diff --git a/wasm/src/web_client/rpc/client_grpc.rs b/wasm/src/web_client/rpc/client_grpc.rs new file mode 100644 index 000000000..62208f70d --- /dev/null +++ b/wasm/src/web_client/rpc/client_grpc.rs @@ -0,0 +1,47 @@ +pub mod rpc { + tonic::include_proto!("rpc"); +} + +pub mod block_producer { + tonic::include_proto!("block_producer"); +} + +pub mod store { + tonic::include_proto!("store"); +} + +pub mod responses { + tonic::include_proto!("responses"); +} + +pub mod requests { + tonic::include_proto!("requests"); +} + +pub mod block_header { + tonic::include_proto!("block_header"); +} + +pub mod note { + tonic::include_proto!("note"); +} + +pub mod account { + tonic::include_proto!("account"); +} + +pub mod mmr { + tonic::include_proto!("mmr"); +} + +pub mod smt { + tonic::include_proto!("smt"); +} + +pub mod merkle { + tonic::include_proto!("merkle"); +} + +pub mod digest { + tonic::include_proto!("digest"); +} \ No newline at end of file diff --git a/wasm/src/web_client/rpc/domain/accounts.rs b/wasm/src/web_client/rpc/domain/accounts.rs new file mode 100644 index 000000000..cffc99c46 --- /dev/null +++ b/wasm/src/web_client/rpc/domain/accounts.rs @@ -0,0 +1,248 @@ +use std::fmt::{Debug, Display, Formatter}; + +use super::format_opt; +use miden_objects::{ + accounts::{Account, AccountId}, + crypto::{hash::rpo::RpoDigest, merkle::MerklePath}, + transaction::AccountDetails, + utils::Serializable, + Digest, +}; + +use crate::native_code::errors::{ConversionError, MissingFieldHelper}; + +use crate::web_client::rpc::client_grpc::{ + account::{ + AccountId as AccountIdPb, + AccountInfo as AccountInfoPb, + AccountSummary as AccountSummaryPb, + }, + requests::AccountUpdate, + responses::{AccountBlockInputRecord, AccountTransactionInputRecord}, + }; + +// ACCOUNT ID +// ================================================================================================ + +impl Display for AccountIdPb { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + f.write_fmt(format_args!("0x{:x}", self.id)) + } +} + +// impl Debug for AccountIdPb { +// fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { +// Display::fmt(self, f) +// } +// } + +// INTO PROTO ACCOUNT ID +// ------------------------------------------------------------------------------------------------ + +impl From for AccountIdPb { + fn from(value: u64) -> Self { + AccountIdPb { id: value } + } +} + +impl From<&AccountId> for AccountIdPb { + fn from(account_id: &AccountId) -> Self { + (*account_id).into() + } +} + +impl From for AccountIdPb { + fn from(account_id: AccountId) -> Self { + Self { id: account_id.into() } + } +} + +// FROM PROTO ACCOUNT ID +// ------------------------------------------------------------------------------------------------ + +impl From for u64 { + fn from(value: AccountIdPb) -> Self { + value.id + } +} + +impl TryFrom for AccountId { + type Error = ConversionError; + + fn try_from(account_id: AccountIdPb) -> Result { + account_id.id.try_into().map_err(|_| ConversionError::NotAValidFelt) + } +} + +// ACCOUNT UPDATE +// ================================================================================================ + +#[derive(Debug, PartialEq)] +pub struct AccountSummary { + pub account_id: AccountId, + pub account_hash: RpoDigest, + pub block_num: u32, +} + +impl From<&AccountSummary> for AccountSummaryPb { + fn from(update: &AccountSummary) -> Self { + Self { + account_id: Some(update.account_id.into()), + account_hash: Some(update.account_hash.into()), + block_num: update.block_num, + } + } +} + +#[derive(Debug, PartialEq)] +pub struct AccountInfo { + pub summary: AccountSummary, + pub details: Option, +} + +impl From<&AccountInfo> for AccountInfoPb { + fn from(AccountInfo { summary, details }: &AccountInfo) -> Self { + Self { + summary: Some(summary.into()), + details: details.as_ref().map(|account| account.to_bytes()), + } + } +} + +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct AccountUpdateDetails { + pub account_id: AccountId, + pub final_state_hash: Digest, + pub details: Option, +} + +impl From<&AccountUpdateDetails> for AccountUpdate { + fn from(update: &AccountUpdateDetails) -> Self { + Self { + account_id: Some(update.account_id.into()), + account_hash: Some(update.final_state_hash.into()), + details: update.details.as_ref().map(|details| details.to_bytes()), + } + } +} + +// ACCOUNT INPUT RECORD +// ================================================================================================ + +#[derive(Clone, Debug)] +pub struct AccountInputRecord { + pub account_id: AccountId, + pub account_hash: Digest, + pub proof: MerklePath, +} + +impl From for AccountBlockInputRecord { + fn from(from: AccountInputRecord) -> Self { + Self { + account_id: Some(from.account_id.into()), + account_hash: Some(from.account_hash.into()), + proof: Some(from.proof.into()), + } + } +} + +impl TryFrom for AccountInputRecord { + type Error = ConversionError; + + fn try_from(account_input_record: AccountBlockInputRecord) -> Result { + Ok(Self { + account_id: account_input_record + .account_id + .ok_or(AccountBlockInputRecord::missing_field(stringify!(account_id)))? + .try_into()?, + account_hash: account_input_record + .account_hash + .ok_or(AccountBlockInputRecord::missing_field(stringify!(account_hash)))? + .try_into()?, + proof: account_input_record + .proof + .ok_or(AccountBlockInputRecord::missing_field(stringify!(proof)))? + .try_into()?, + }) + } +} + +// ACCOUNT STATE +// ================================================================================================ + +/// Information needed from the store to verify account in transaction. +#[derive(Debug)] +pub struct AccountState { + /// Account ID + pub account_id: AccountId, + /// The account hash in the store corresponding to tx's account ID + pub account_hash: Option, +} + +impl Display for AccountState { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + f.write_fmt(format_args!( + "{{ account_id: {}, account_hash: {} }}", + self.account_id, + format_opt(self.account_hash.as_ref()), + )) + } +} + +impl From for AccountTransactionInputRecord { + fn from(from: AccountState) -> Self { + Self { + account_id: Some(from.account_id.into()), + account_hash: from.account_hash.map(Into::into), + } + } +} + +impl TryFrom for AccountState { + type Error = ConversionError; + + fn try_from(from: AccountTransactionInputRecord) -> Result { + let account_id = from + .account_id + .clone() + .ok_or(AccountTransactionInputRecord::missing_field(stringify!(account_id)))? + .try_into()?; + + let account_hash = from + .account_hash + .ok_or(AccountTransactionInputRecord::missing_field(stringify!(account_hash)))? + .try_into()?; + + // If the hash is equal to `Digest::default()`, it signifies that this is a new account + // which is not yet present in the Store. + let account_hash = if account_hash == Digest::default() { + None + } else { + Some(account_hash) + }; + + Ok(Self { account_id, account_hash }) + } +} + +impl TryFrom for AccountState { + type Error = ConversionError; + + fn try_from(value: AccountUpdate) -> Result { + Ok(Self { + account_id: value + .account_id + .ok_or(AccountUpdate::missing_field(stringify!(account_id)))? + .try_into()?, + account_hash: value.account_hash.map(TryInto::try_into).transpose()?, + }) + } +} + +impl TryFrom<&AccountUpdate> for AccountState { + type Error = ConversionError; + + fn try_from(value: &AccountUpdate) -> Result { + value.clone().try_into() + } +} diff --git a/wasm/src/web_client/rpc/domain/blocks.rs b/wasm/src/web_client/rpc/domain/blocks.rs new file mode 100644 index 000000000..89d3b103e --- /dev/null +++ b/wasm/src/web_client/rpc/domain/blocks.rs @@ -0,0 +1,83 @@ +use miden_objects::BlockHeader; + +use crate::native_code::errors::{ConversionError, MissingFieldHelper}; +use crate::web_client::rpc::client_grpc::block_header; + +// BLOCK HEADER +// ================================================================================================ + +impl From<&BlockHeader> for block_header::BlockHeader { + fn from(header: &BlockHeader) -> Self { + Self { + prev_hash: Some(header.prev_hash().into()), + block_num: header.block_num(), + chain_root: Some(header.chain_root().into()), + account_root: Some(header.account_root().into()), + nullifier_root: Some(header.nullifier_root().into()), + note_root: Some(header.note_root().into()), + batch_root: Some(header.batch_root().into()), + proof_hash: Some(header.proof_hash().into()), + version: u64::from(header.version()) + .try_into() + .expect("Failed to convert BlockHeader.version into u32"), + timestamp: header.timestamp().into(), + } + } +} + +impl From for block_header::BlockHeader { + fn from(header: BlockHeader) -> Self { + (&header).into() + } +} + +impl TryFrom<&block_header::BlockHeader> for BlockHeader { + type Error = ConversionError; + + fn try_from(value: &block_header::BlockHeader) -> Result { + value.clone().try_into() + } +} + +impl TryFrom for BlockHeader { + type Error = ConversionError; + + fn try_from(value: block_header::BlockHeader) -> Result { + Ok(BlockHeader::new( + value + .prev_hash + .ok_or(block_header::BlockHeader::missing_field(stringify!(prev_hash)))? + .try_into()?, + value.block_num, + value + .chain_root + .ok_or(block_header::BlockHeader::missing_field(stringify!(chain_root)))? + .try_into()?, + value + .account_root + .ok_or(block_header::BlockHeader::missing_field(stringify!(account_root)))? + .try_into()?, + value + .nullifier_root + .ok_or(block_header::BlockHeader::missing_field(stringify!(nullifier_root)))? + .try_into()?, + value + .note_root + .ok_or(block_header::BlockHeader::missing_field(stringify!(note_root)))? + .try_into()?, + value + .batch_root + .ok_or(block_header::BlockHeader::missing_field(stringify!(batch_root)))? + .try_into()?, + value + .proof_hash + .ok_or(block_header::BlockHeader::missing_field(stringify!(proof_hash)))? + .try_into()?, + value.version.into(), + value + .timestamp + .try_into() + .expect("timestamp value is greater than or equal to the field modulus"), + )) + } +} diff --git a/wasm/src/web_client/rpc/domain/digest.rs b/wasm/src/web_client/rpc/domain/digest.rs new file mode 100644 index 000000000..7483958e5 --- /dev/null +++ b/wasm/src/web_client/rpc/domain/digest.rs @@ -0,0 +1,245 @@ +use std::fmt::{Debug, Display, Formatter}; + +use hex::{FromHex, ToHex}; +use miden_objects::{notes::NoteId, Digest, Felt, StarkField}; + +use crate::native_code::errors::ConversionError; +use crate::web_client::rpc::client_grpc::digest; + +// CONSTANTS +// ================================================================================================ + +pub const DIGEST_DATA_SIZE: usize = 32; + +// FORMATTING +// ================================================================================================ + +impl Display for digest::Digest { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + f.write_str(&self.encode_hex::()) + } +} + +// impl Debug for digest::Digest { +// fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { +// Display::fmt(self, f) +// } +// } + +impl ToHex for &digest::Digest { + fn encode_hex>(&self) -> T { + (*self).encode_hex() + } + + fn encode_hex_upper>(&self) -> T { + (*self).encode_hex_upper() + } +} + +impl ToHex for digest::Digest { + fn encode_hex>(&self) -> T { + let mut data: Vec = Vec::with_capacity(DIGEST_DATA_SIZE); + data.extend(format!("{:016x}", self.d0).chars()); + data.extend(format!("{:016x}", self.d1).chars()); + data.extend(format!("{:016x}", self.d2).chars()); + data.extend(format!("{:016x}", self.d3).chars()); + data.into_iter().collect() + } + + fn encode_hex_upper>(&self) -> T { + let mut data: Vec = Vec::with_capacity(DIGEST_DATA_SIZE); + data.extend(format!("{:016X}", self.d0).chars()); + data.extend(format!("{:016X}", self.d1).chars()); + data.extend(format!("{:016X}", self.d2).chars()); + data.extend(format!("{:016X}", self.d3).chars()); + data.into_iter().collect() + } +} + +impl FromHex for digest::Digest { + type Error = ConversionError; + + fn from_hex>(hex: T) -> Result { + let data = hex::decode(hex)?; + + match data.len() { + size if size < DIGEST_DATA_SIZE => { + Err(ConversionError::InsufficientData { expected: DIGEST_DATA_SIZE, got: size }) + }, + size if size > DIGEST_DATA_SIZE => { + Err(ConversionError::TooMuchData { expected: DIGEST_DATA_SIZE, got: size }) + }, + _ => { + let d0 = u64::from_be_bytes(data[..8].try_into().unwrap()); + let d1 = u64::from_be_bytes(data[8..16].try_into().unwrap()); + let d2 = u64::from_be_bytes(data[16..24].try_into().unwrap()); + let d3 = u64::from_be_bytes(data[24..32].try_into().unwrap()); + + Ok(digest::Digest { d0, d1, d2, d3 }) + }, + } + } +} + +// INTO +// ================================================================================================ + +impl From<[u64; 4]> for digest::Digest { + fn from(value: [u64; 4]) -> Self { + Self { + d0: value[0], + d1: value[1], + d2: value[2], + d3: value[3], + } + } +} + +impl From<&[u64; 4]> for digest::Digest { + fn from(value: &[u64; 4]) -> Self { + (*value).into() + } +} + +impl From<[Felt; 4]> for digest::Digest { + fn from(value: [Felt; 4]) -> Self { + Self { + d0: value[0].as_int(), + d1: value[1].as_int(), + d2: value[2].as_int(), + d3: value[3].as_int(), + } + } +} + +impl From<&[Felt; 4]> for digest::Digest { + fn from(value: &[Felt; 4]) -> Self { + (*value).into() + } +} + +impl From for digest::Digest { + fn from(value: Digest) -> Self { + Self { + d0: value[0].as_int(), + d1: value[1].as_int(), + d2: value[2].as_int(), + d3: value[3].as_int(), + } + } +} + +impl From<&Digest> for digest::Digest { + fn from(value: &Digest) -> Self { + (*value).into() + } +} + +impl From<&NoteId> for digest::Digest { + fn from(value: &NoteId) -> Self { + (*value).inner().into() + } +} + +impl From for digest::Digest { + fn from(value: NoteId) -> Self { + value.inner().into() + } +} + +// FROM DIGEST +// ================================================================================================ + +impl From for [u64; 4] { + fn from(value: digest::Digest) -> Self { + [value.d0, value.d1, value.d2, value.d3] + } +} + +impl TryFrom for [Felt; 4] { + type Error = ConversionError; + + fn try_from(value: digest::Digest) -> Result { + if ![value.d0, value.d1, value.d2, value.d3] + .iter() + .all(|v| *v < ::MODULUS) + { + Err(ConversionError::NotAValidFelt) + } else { + Ok([ + Felt::new(value.d0), + Felt::new(value.d1), + Felt::new(value.d2), + Felt::new(value.d3), + ]) + } + } +} + +impl TryFrom for Digest { + type Error = ConversionError; + + fn try_from(value: digest::Digest) -> Result { + Ok(Self::new(value.try_into()?)) + } +} + +impl TryFrom<&digest::Digest> for [Felt; 4] { + type Error = ConversionError; + + fn try_from(value: &digest::Digest) -> Result { + value.clone().try_into() + } +} + +impl TryFrom<&digest::Digest> for Digest { + type Error = ConversionError; + + fn try_from(value: &digest::Digest) -> Result { + value.clone().try_into() + } +} + +// TESTS +// ================================================================================================ + +#[cfg(test)] +mod test { + use hex::{FromHex, ToHex}; + use proptest::prelude::*; + + use crate::generated::digest::Digest; + + #[test] + fn test_hex_digest() { + let digest = Digest { + d0: 3488802789098113751, + d1: 5271242459988994564, + d2: 17816570245237064784, + d3: 10910963388447438895, + }; + let encoded: String = ToHex::encode_hex(&digest); + let round_trip: Result = FromHex::from_hex::<&[u8]>(encoded.as_ref()); + assert_eq!(digest, round_trip.unwrap()); + + let digest = Digest { d0: 0, d1: 0, d2: 0, d3: 0 }; + let encoded: String = ToHex::encode_hex(&digest); + let round_trip: Result = FromHex::from_hex::<&[u8]>(encoded.as_ref()); + assert_eq!(digest, round_trip.unwrap()); + } + + proptest! { + #[test] + fn test_encode_decode( + d0: u64, + d1: u64, + d2: u64, + d3: u64, + ) { + let digest = Digest { d0, d1, d2, d3 }; + let encoded: String = ToHex::encode_hex(&digest); + let round_trip: Result = FromHex::from_hex::<&[u8]>(encoded.as_ref()); + assert_eq!(digest, round_trip.unwrap()); + } + } +} diff --git a/wasm/src/web_client/rpc/domain/merkle.rs b/wasm/src/web_client/rpc/domain/merkle.rs new file mode 100644 index 000000000..e3bf20261 --- /dev/null +++ b/wasm/src/web_client/rpc/domain/merkle.rs @@ -0,0 +1,157 @@ +use miden_objects::{ + crypto::merkle::{LeafIndex, MerklePath, MmrDelta, SmtLeaf, SmtProof}, + Digest, Word, +}; + +use super::{convert, try_convert}; + +use crate::native_code::errors::{ConversionError, MissingFieldHelper}; + +use crate::web_client::rpc::client_grpc; + +// MERKLE PATH +// ================================================================================================ + +impl From for client_grpc::merkle::MerklePath { + fn from(value: MerklePath) -> Self { + let siblings = value.nodes().iter().map(client_grpc::digest::Digest::from).collect(); + client_grpc::merkle::MerklePath { siblings } + } +} + +impl TryFrom for MerklePath { + type Error = ConversionError; + + fn try_from(merkle_path: client_grpc::merkle::MerklePath) -> Result { + merkle_path.siblings.into_iter().map(Digest::try_from).collect() + } +} + +// MMR DELTA +// ================================================================================================ + +impl From for client_grpc::mmr::MmrDelta { + fn from(value: MmrDelta) -> Self { + let data = value.data.into_iter().map(client_grpc::digest::Digest::from).collect(); + client_grpc::mmr::MmrDelta { forest: value.forest as u64, data } + } +} + +impl TryFrom for MmrDelta { + type Error = ConversionError; + + fn try_from(value: client_grpc::mmr::MmrDelta) -> Result { + let data: Result, ConversionError> = + value.data.into_iter().map(Digest::try_from).collect(); + + Ok(MmrDelta { + forest: value.forest as usize, + data: data?, + }) + } +} + +// SPARSE MERKLE TREE +// ================================================================================================ + +// SMT LEAF +// ------------------------------------------------------------------------------------------------ + +impl TryFrom for SmtLeaf { + type Error = ConversionError; + + fn try_from(value: client_grpc::smt::SmtLeaf) -> Result { + let leaf = value.leaf.ok_or(client_grpc::smt::SmtLeaf::missing_field(stringify!(leaf)))?; + + match leaf { + client_grpc::smt::smt_leaf::Leaf::Empty(leaf_index) => { + Ok(Self::new_empty(LeafIndex::new_max_depth(leaf_index))) + }, + client_grpc::smt::smt_leaf::Leaf::Single(entry) => { + let (key, value): (Digest, Word) = entry.try_into()?; + + Ok(SmtLeaf::new_single(key, value)) + }, + client_grpc::smt::smt_leaf::Leaf::Multiple(entries) => { + let domain_entries: Vec<(Digest, Word)> = try_convert(entries.entries)?; + + Ok(SmtLeaf::new_multiple(domain_entries)?) + }, + } + } +} + +impl From for client_grpc::smt::SmtLeaf { + fn from(smt_leaf: SmtLeaf) -> Self { + use client_grpc::smt::smt_leaf::Leaf; + + let leaf = match smt_leaf { + SmtLeaf::Empty(leaf_index) => Leaf::Empty(leaf_index.value()), + SmtLeaf::Single(entry) => Leaf::Single(entry.into()), + SmtLeaf::Multiple(entries) => { + Leaf::Multiple(client_grpc::smt::SmtLeafEntries { entries: convert(entries) }) + }, + }; + + Self { leaf: Some(leaf) } + } +} + +// SMT LEAF ENTRY +// ------------------------------------------------------------------------------------------------ + +impl TryFrom for (Digest, Word) { + type Error = ConversionError; + + fn try_from(entry: client_grpc::smt::SmtLeafEntry) -> Result { + let key: Digest = entry + .key + .ok_or(client_grpc::smt::SmtLeafEntry::missing_field(stringify!(key)))? + .try_into()?; + let value: Word = entry + .value + .ok_or(client_grpc::smt::SmtLeafEntry::missing_field(stringify!(value)))? + .try_into()?; + + Ok((key, value)) + } +} + +impl From<(Digest, Word)> for client_grpc::smt::SmtLeafEntry { + fn from((key, value): (Digest, Word)) -> Self { + Self { + key: Some(key.into()), + value: Some(value.into()), + } + } +} + +// SMT PROOF +// ------------------------------------------------------------------------------------------------ + +impl TryFrom for SmtProof { + type Error = ConversionError; + + fn try_from(opening: client_grpc::smt::SmtOpening) -> Result { + let path: MerklePath = opening + .path + .ok_or(client_grpc::smt::SmtOpening::missing_field(stringify!(path)))? + .try_into()?; + let leaf: SmtLeaf = opening + .leaf + .ok_or(client_grpc::smt::SmtOpening::missing_field(stringify!(leaf)))? + .try_into()?; + + Ok(SmtProof::new(path, leaf)?) + } +} + +impl From for client_grpc::smt::SmtOpening { + fn from(proof: SmtProof) -> Self { + let (path, leaf) = proof.into_parts(); + Self { + path: Some(path.into()), + leaf: Some(leaf.into()), + } + } +} diff --git a/wasm/src/web_client/rpc/domain/mod.rs b/wasm/src/web_client/rpc/domain/mod.rs new file mode 100644 index 000000000..828fd0790 --- /dev/null +++ b/wasm/src/web_client/rpc/domain/mod.rs @@ -0,0 +1,30 @@ +use std::fmt::Display; + +pub mod accounts; +pub mod blocks; +pub mod digest; +pub mod merkle; +pub mod nullifiers; + +// UTILITIES +// ================================================================================================ + +pub fn convert(from: T) -> Vec +where + T: IntoIterator, + From: Into, +{ + from.into_iter().map(|e| e.into()).collect() +} + +pub fn try_convert(from: T) -> Result, E> +where + T: IntoIterator, + From: TryInto, +{ + from.into_iter().map(|e| e.try_into()).collect() +} + +pub fn format_opt(opt: Option<&T>) -> String { + opt.map(ToString::to_string).unwrap_or("None".to_owned()) +} \ No newline at end of file diff --git a/wasm/src/web_client/rpc/domain/nullifiers.rs b/wasm/src/web_client/rpc/domain/nullifiers.rs new file mode 100644 index 000000000..c39d8ff3b --- /dev/null +++ b/wasm/src/web_client/rpc/domain/nullifiers.rs @@ -0,0 +1,70 @@ +use miden_objects::{ + crypto::{hash::rpo::RpoDigest, merkle::SmtProof}, + notes::Nullifier, +}; + +use crate::native_code::errors::{ConversionError, MissingFieldHelper}; + +use crate::web_client::rpc::client_grpc::{digest::Digest, responses::NullifierBlockInputRecord}; + +// FROM NULLIFIER +// ================================================================================================ + +impl From<&Nullifier> for Digest { + fn from(value: &Nullifier) -> Self { + (*value).inner().into() + } +} + +impl From for Digest { + fn from(value: Nullifier) -> Self { + value.inner().into() + } +} + +// INTO NULLIFIER +// ================================================================================================ + +impl TryFrom for Nullifier { + type Error = ConversionError; + + fn try_from(value: Digest) -> Result { + let digest: RpoDigest = value.try_into()?; + Ok(digest.into()) + } +} + +// NULLIFIER INPUT RECORD +// ================================================================================================ + +#[derive(Clone, Debug)] +pub struct NullifierWitness { + pub nullifier: Nullifier, + pub proof: SmtProof, +} + +impl TryFrom for NullifierWitness { + type Error = ConversionError; + + fn try_from(nullifier_input_record: NullifierBlockInputRecord) -> Result { + Ok(Self { + nullifier: nullifier_input_record + .nullifier + .ok_or(NullifierBlockInputRecord::missing_field(stringify!(nullifier)))? + .try_into()?, + proof: nullifier_input_record + .opening + .ok_or(NullifierBlockInputRecord::missing_field(stringify!(opening)))? + .try_into()?, + }) + } +} + +impl From for NullifierBlockInputRecord { + fn from(value: NullifierWitness) -> Self { + Self { + nullifier: Some(value.nullifier.into()), + opening: Some(value.proof.into()), + } + } +} diff --git a/wasm/src/web_client/rpc/mod.rs b/wasm/src/web_client/rpc/mod.rs new file mode 100644 index 000000000..bbed22baa --- /dev/null +++ b/wasm/src/web_client/rpc/mod.rs @@ -0,0 +1,357 @@ +use async_trait::async_trait; +use core::fmt; +use tonic::Response; +use tonic_web_wasm_client::Client; +use wasm_bindgen::prelude::*; +use wasm_bindgen_futures::*; + +use miden_objects::{ + accounts::{Account, AccountId}, + notes::{Note, NoteId, NoteMetadata, NoteTag, NoteType}, + transaction::ProvenTransaction, + utils::Deserializable, + BlockHeader, Digest, Felt, +}; +use miden_tx::utils::Serializable; + +use crate::native_code::{ + errors::{ConversionError, NodeRpcClientError}, + rpc::{ + CommittedNote, NodeRpcClient, NodeRpcClientEndpoint, NoteDetails, NoteInclusionDetails, + StateSyncInfo + }, +}; + +use client_grpc::{ + requests::{ + GetAccountDetailsRequest, GetBlockHeaderByNumberRequest, GetNotesByIdRequest, + SubmitProvenTransactionRequest, SyncStateRequest, + }, + responses::SyncStateResponse, + rpc::api_client::ApiClient +}; + +pub mod client_grpc; +pub mod domain; + +#[wasm_bindgen(module = "/js/web-rpc-client.js")] +extern "C" { + #[wasm_bindgen(js_name = testRpc)] + fn test_rpc(endpoint: String) -> js_sys::Promise; +} + +pub struct WebRpcClient { + endpoint: String +} + +impl WebRpcClient { + pub fn new(endpoint: &str) -> Self { + Self { + endpoint: endpoint.to_string() + } + } +} + +fn build_client() -> ApiClient { + let base_url = "http://localhost:8080".to_string(); // for use with envoy proxy + // let base_url = "http://localhost:57291".to_string(); // for use without envoy proxy + let wasm_client = Client::new(base_url); + + ApiClient::new(wasm_client) +} + +#[async_trait(?Send)] +impl NodeRpcClient for WebRpcClient { + async fn test_rpc(&mut self) -> Result<(), JsValue> { + // Now correctly handling the Promise returned by test_rpc + let promise = test_rpc("https://www.google.com".to_string()); + let result = JsFuture::from(promise).await; + + match result { + Ok(_) => Ok(()), + Err(e) => Err(e), + } + } + + async fn submit_proven_transaction( + &mut self, + proven_transaction: ProvenTransaction, + ) -> Result<(), NodeRpcClientError> { + let mut query_client = build_client(); + + let request = SubmitProvenTransactionRequest { + transaction: proven_transaction.to_bytes(), + }; + + let response = query_client.submit_proven_transaction(request).await.map_err(|err| { + NodeRpcClientError::RequestError( + NodeRpcClientEndpoint::SubmitProvenTx.to_string(), + err.to_string(), + ) + })?; + + Ok(()) + } + + async fn get_block_header_by_number( + &mut self, + block_num: Option, + ) -> Result { + let mut query_client = build_client(); + + let request = GetBlockHeaderByNumberRequest { + block_num: block_num, + }; + + // Attempt to send the request and process the response + let response = query_client.get_block_header_by_number(request).await.map_err(|err| { + // log to console all the properties of block header + NodeRpcClientError::RequestError( + NodeRpcClientEndpoint::GetBlockHeaderByNumber.to_string(), + err.to_string(), + ) + })?; + + response + .into_inner() + .block_header + .ok_or(NodeRpcClientError::ExpectedFieldMissing("BlockHeader".into()))? + .try_into() + .map_err(|err: ConversionError| NodeRpcClientError::ConversionFailure(err.to_string())) + } + + async fn get_notes_by_id( + &mut self, + note_ids: &[NoteId], + ) -> Result, NodeRpcClientError> { + let mut query_client = build_client(); + + let request = GetNotesByIdRequest { + note_ids: note_ids.iter().map(|id| id.inner().into()).collect(), + }; + + let response = query_client.get_notes_by_id(request).await.map_err(|err| { + NodeRpcClientError::RequestError( + NodeRpcClientEndpoint::GetBlockHeaderByNumber.to_string(), + err.to_string(), + ) + })?; + + let rpc_notes = response.into_inner().notes; + let mut response_notes = Vec::with_capacity(rpc_notes.len()); + for note in rpc_notes { + let sender_id = + note.sender.ok_or(NodeRpcClientError::ExpectedFieldMissing("Sender".into()))?; + + let inclusion_details = { + let merkle_path = note + .merkle_path + .ok_or(NodeRpcClientError::ExpectedFieldMissing("Notes.MerklePath".into()))? + .try_into()?; + + NoteInclusionDetails::new(note.block_num, note.note_index, merkle_path) + }; + + let note = match note.details { + // On-chain notes include details + Some(details) => { + let note = Note::read_from_bytes(&details)?; + + NoteDetails::Public(note, inclusion_details) + }, + // Off-chain notes do not have details + None => { + let note_tag = NoteTag::from(note.tag).validate(NoteType::OffChain)?; + let note_metadata = NoteMetadata::new( + sender_id.try_into()?, + NoteType::OffChain, + note_tag, + Felt::default(), + )?; + let note_id: miden_objects::Digest = note + .note_id + .ok_or(NodeRpcClientError::ExpectedFieldMissing("Notes.NoteId".into()))? + .try_into()?; + + NoteDetails::OffChain(NoteId::from(note_id), note_metadata, inclusion_details) + }, + }; + response_notes.push(note) + } + + Ok(response_notes) + } + + /// Sends a sync state request to the Miden node, validates and converts the response + /// into a [StateSyncInfo] struct. + async fn sync_state( + &mut self, + block_num: u32, + account_ids: &[AccountId], + note_tags: &[NoteTag], + nullifiers_tags: &[u16], + ) -> Result { + let mut query_client = build_client(); + + let account_ids = account_ids.iter().map(|acc| (*acc).into()).collect(); + let nullifiers = nullifiers_tags.iter().map(|&nullifier| nullifier as u32).collect(); + let note_tags = note_tags.iter().map(|¬e_tag| note_tag.into()).collect(); + + let request = SyncStateRequest { + block_num, + account_ids, + note_tags, + nullifiers, + }; + + let response = query_client.sync_state(request).await.map_err(|err| { + NodeRpcClientError::RequestError( + NodeRpcClientEndpoint::SyncState.to_string(), + err.to_string(), + ) + })?; + response.into_inner().try_into() + } + + /// Sends a [GetAccountDetailsRequest] to the Miden node, and extracts an [Account] from the + /// `GetAccountDetailsResponse` response. + /// + /// # Errors + /// + /// This function will return an error if: + /// + /// - The provided account is not on-chain: this is due to the fact that for offchain accounts + /// the client is responsible + /// - There was an error sending the request to the node + /// - The answer had a `None` for its account, or the account had a `None` at the `details` field. + /// - There is an error during [Account] deserialization + async fn get_account_update( + &mut self, + account_id: AccountId + ) -> Result { + let mut query_client = build_client(); + + let account_id = account_id.into(); + let request = GetAccountDetailsRequest { account_id: Some(account_id) }; + + let response = query_client.get_account_details(request).await.map_err(|err| { + NodeRpcClientError::RequestError( + NodeRpcClientEndpoint::GetAccountDetails.to_string(), + err.to_string(), + ) + })?; + + let response = response.into_inner(); + let account_info = response.account.ok_or(NodeRpcClientError::ExpectedFieldMissing( + "GetAccountDetails response should have an `account`".to_string(), + ))?; + + let details_bytes = + account_info.details.ok_or(NodeRpcClientError::ExpectedFieldMissing( + "GetAccountDetails response's account should have `details`".to_string(), + ))?; + + let details = Account::read_from_bytes(&details_bytes)?; + + Ok(details) + } +} + +// STATE SYNC INFO CONVERSION +// ================================================================================================ + +impl TryFrom for StateSyncInfo { + type Error = NodeRpcClientError; + + fn try_from(value: SyncStateResponse) -> Result { + let chain_tip = value.chain_tip; + + // Validate and convert block header + let block_header = value + .block_header + .ok_or(NodeRpcClientError::ExpectedFieldMissing("BlockHeader".into()))? + .try_into()?; + + // Validate and convert MMR Delta + let mmr_delta = value + .mmr_delta + .ok_or(NodeRpcClientError::ExpectedFieldMissing("MmrDelta".into()))? + .try_into()?; + + // Validate and convert account hash updates into an (AccountId, Digest) tuple + let mut account_hash_updates = vec![]; + for update in value.accounts { + let account_id = update + .account_id + .ok_or(NodeRpcClientError::ExpectedFieldMissing( + "AccountHashUpdate.AccountId".into(), + ))? + .try_into()?; + let account_hash = update + .account_hash + .ok_or(NodeRpcClientError::ExpectedFieldMissing( + "AccountHashUpdate.AccountHash".into(), + ))? + .try_into()?; + account_hash_updates.push((account_id, account_hash)); + } + + // Validate and convert account note inclusions into an (AccountId, Digest) tuple + let mut note_inclusions = vec![]; + for note in value.notes { + let note_id: Digest = note + .note_id + .ok_or(NodeRpcClientError::ExpectedFieldMissing("Notes.Id".into()))? + .try_into()?; + + let note_id: NoteId = note_id.into(); + + let merkle_path = note + .merkle_path + .ok_or(NodeRpcClientError::ExpectedFieldMissing("Notes.MerklePath".into()))? + .try_into()?; + + let sender_account_id = note + .sender + .ok_or(NodeRpcClientError::ExpectedFieldMissing("Notes.Sender".into()))? + .try_into()?; + + let note_type = NoteType::try_from(Felt::new(note.note_type.into()))?; + let metadata = NoteMetadata::new( + sender_account_id, + note_type, + note.tag.into(), + Default::default(), + )?; + + let committed_note = + CommittedNote::new(note_id, note.note_index, merkle_path, metadata); + + note_inclusions.push(committed_note); + } + + let nullifiers = value + .nullifiers + .iter() + .map(|nul_update| { + nul_update + .clone() + .nullifier + .ok_or(NodeRpcClientError::ExpectedFieldMissing("Nullifier".into())) + .and_then(|n| { + Digest::try_from(n) + .map_err(|err| NodeRpcClientError::ConversionFailure(err.to_string())) + }) + }) + .collect::, NodeRpcClientError>>()?; + + Ok(Self { + chain_tip, + block_header, + mmr_delta, + account_hash_updates, + note_inclusions, + nullifiers, + }) + } +} \ No newline at end of file diff --git a/wasm/src/web_client/rpc/proto/account.proto b/wasm/src/web_client/rpc/proto/account.proto new file mode 100644 index 000000000..f73c5dac7 --- /dev/null +++ b/wasm/src/web_client/rpc/proto/account.proto @@ -0,0 +1,22 @@ +syntax = "proto3"; +package account; + +import "digest.proto"; + +message AccountId { + // A miden account is defined with a little bit of proof-of-work, the id itself is defined as + // the first word of a hash digest. For this reason account ids can be considered as random + // values, because of that the encoding bellow uses fixed 64 bits, instead of zig-zag encoding. + fixed64 id = 1; +} + +message AccountSummary { + AccountId account_id = 1; + digest.Digest account_hash = 2; + uint32 block_num = 3; +} + +message AccountInfo { + AccountSummary summary = 1; + optional bytes details = 2; +} diff --git a/wasm/src/web_client/rpc/proto/block_header.proto b/wasm/src/web_client/rpc/proto/block_header.proto new file mode 100644 index 000000000..77189108e --- /dev/null +++ b/wasm/src/web_client/rpc/proto/block_header.proto @@ -0,0 +1,27 @@ +syntax = "proto3"; +package block_header; + +import "digest.proto"; + +message BlockHeader { + // the hash of the previous blocks header. + digest.Digest prev_hash = 1; + // a unique sequential number of the current block. + fixed32 block_num = 2; + // a commitment to an MMR of the entire chain where each block is a leaf. + digest.Digest chain_root = 3; + // a commitment to account database. + digest.Digest account_root = 4; + // a commitment to the nullifier database. + digest.Digest nullifier_root = 5; + // a commitment to all notes created in the current block. + digest.Digest note_root = 6; + // a commitment to a set of transaction batches executed as a part of this block. + digest.Digest batch_root = 7; + // a hash of a STARK proof attesting to the correct state transition. + digest.Digest proof_hash = 8; + // specifies the version of the protocol. + uint32 version = 9; + // the time when the block was created. + uint64 timestamp = 10; +} diff --git a/wasm/src/web_client/rpc/proto/block_producer.proto b/wasm/src/web_client/rpc/proto/block_producer.proto new file mode 100644 index 000000000..d4f2c0062 --- /dev/null +++ b/wasm/src/web_client/rpc/proto/block_producer.proto @@ -0,0 +1,11 @@ +// Specification of the user facing gRPC API. +syntax = "proto3"; +package block_producer; + +import "requests.proto"; +import "responses.proto"; + +service Api { + rpc SubmitProvenTransaction(requests.SubmitProvenTransactionRequest) returns (responses.SubmitProvenTransactionResponse) {} +} + diff --git a/wasm/src/web_client/rpc/proto/digest.proto b/wasm/src/web_client/rpc/proto/digest.proto new file mode 100644 index 000000000..e6a8f066c --- /dev/null +++ b/wasm/src/web_client/rpc/proto/digest.proto @@ -0,0 +1,10 @@ +syntax = "proto3"; +package digest; + +// A hash digest, the result of a hash function. +message Digest { + fixed64 d0 = 1; + fixed64 d1 = 2; + fixed64 d2 = 3; + fixed64 d3 = 4; +} diff --git a/wasm/src/web_client/rpc/proto/merkle.proto b/wasm/src/web_client/rpc/proto/merkle.proto new file mode 100644 index 000000000..abded7231 --- /dev/null +++ b/wasm/src/web_client/rpc/proto/merkle.proto @@ -0,0 +1,8 @@ +syntax = "proto3"; +package merkle; + +import "digest.proto"; + +message MerklePath { + repeated digest.Digest siblings = 1; +} diff --git a/wasm/src/web_client/rpc/proto/mmr.proto b/wasm/src/web_client/rpc/proto/mmr.proto new file mode 100644 index 000000000..baaced2c9 --- /dev/null +++ b/wasm/src/web_client/rpc/proto/mmr.proto @@ -0,0 +1,9 @@ +syntax = "proto3"; +package mmr; + +import "digest.proto"; + +message MmrDelta { + uint64 forest = 1; + repeated digest.Digest data = 2; +} diff --git a/wasm/src/web_client/rpc/proto/note.proto b/wasm/src/web_client/rpc/proto/note.proto new file mode 100644 index 000000000..b389bddb1 --- /dev/null +++ b/wasm/src/web_client/rpc/proto/note.proto @@ -0,0 +1,40 @@ +syntax = "proto3"; +package note; + +import "digest.proto"; +import "merkle.proto"; +import "account.proto"; + +message Note { + fixed32 block_num = 1; + uint32 note_index = 2; + digest.Digest note_id = 3; + account.AccountId sender = 4; + fixed32 tag = 5; + uint32 note_type = 6; + merkle.MerklePath merkle_path = 7; + // This field will be present when the note is on-chain. + // details contain the `Note` in a serialized format. + optional bytes details = 8; +} + +message NoteSyncRecord { + uint32 note_index = 1; + digest.Digest note_id = 2; + account.AccountId sender = 3; + fixed32 tag = 4; + uint32 note_type = 5; + merkle.MerklePath merkle_path = 6; +} + +message NoteCreated { + uint32 batch_index = 1; + uint32 note_index = 2; + digest.Digest note_id = 3; + uint32 note_type = 4; + account.AccountId sender = 5; + fixed32 tag = 6; + // This field will be present when the note is on-chain. + // details contain the `Note` in a serialized format. + optional bytes details = 7; +} diff --git a/wasm/src/web_client/rpc/proto/requests.proto b/wasm/src/web_client/rpc/proto/requests.proto new file mode 100644 index 000000000..43e8301dc --- /dev/null +++ b/wasm/src/web_client/rpc/proto/requests.proto @@ -0,0 +1,99 @@ +syntax = "proto3"; +package requests; + +import "account.proto"; +import "block_header.proto"; +import "digest.proto"; +import "note.proto"; + + +message AccountUpdate { + account.AccountId account_id = 1; + digest.Digest account_hash = 2; + // Details for public (on-chain) account. + optional bytes details = 3; +} + +message ApplyBlockRequest { + block_header.BlockHeader block = 1; + repeated AccountUpdate accounts = 2; + repeated digest.Digest nullifiers = 3; + repeated note.NoteCreated notes = 4; +} + +message CheckNullifiersRequest { + repeated digest.Digest nullifiers = 1; +} + +message GetBlockHeaderByNumberRequest { + // The block number of the target block. + // + // If not provided, means latest know block. + optional uint32 block_num = 1; +} + +// State synchronization request. +// +// Specifies state updates the client is intersted in. The server will return the first block which +// contains a note matching `note_tags` or the chain tip. And the corresponding updates to +// `nullifiers` and `account_ids` for that block range. +message SyncStateRequest { + // Last block known by the client. The response will contain data starting from the next block, + // until the first block which contains a note of matching the requested tag, or the chain tip + // if there are no notes. + fixed32 block_num = 1; + + // Accounts' hash to include in the response. + // + // An account hash will be included if-and-only-if it is the latest update. Meaning it is + // possible there was an update to the account for the given range, but if it is not the latest, + // it won't be included in the response. + repeated account.AccountId account_ids = 2; + + // Determines the tags which the client is interested in. These are only the 16high bits of the + // note's complete tag. + // + // The above means it is not possible to request an specific note, but only a "note family", + // this is done to increase the privacy of the client, by hiding the note's the client is + // intereted on. + repeated uint32 note_tags = 3; + + // Determines the nullifiers the client is interested in. + // + // Similarly to the note_tags, this determins only the 16high bits of the target nullifier. + repeated uint32 nullifiers = 4; +} + +message GetBlockInputsRequest { + // ID of the account against which a transaction is executed. + repeated account.AccountId account_ids = 1; + // Array of nullifiers for all notes consumed by a transaction. + repeated digest.Digest nullifiers = 2; +} + +message GetTransactionInputsRequest { + account.AccountId account_id = 1; + repeated digest.Digest nullifiers = 2; +} + +message SubmitProvenTransactionRequest { + // Transaction encoded using miden's native format + bytes transaction = 1; +} + +message GetNotesByIdRequest { + // List of NoteId's to be queried from the database + repeated digest.Digest note_ids = 1; +} + +message ListNullifiersRequest {} + +message ListAccountsRequest {} + +message ListNotesRequest {} + +// Returns the latest state of an account with the specified ID. +message GetAccountDetailsRequest { + // Account ID to get details. + account.AccountId account_id = 1; +} diff --git a/wasm/src/web_client/rpc/proto/responses.proto b/wasm/src/web_client/rpc/proto/responses.proto new file mode 100644 index 000000000..b9f548d1d --- /dev/null +++ b/wasm/src/web_client/rpc/proto/responses.proto @@ -0,0 +1,119 @@ +syntax = "proto3"; +package responses; + +import "account.proto"; +import "block_header.proto"; +import "digest.proto"; +import "merkle.proto"; +import "mmr.proto"; +import "note.proto"; +import "smt.proto"; + +message ApplyBlockResponse {} + +message CheckNullifiersResponse { + // Each requested nullifier has its corresponding nullifier proof at the same position. + repeated smt.SmtOpening proofs = 1; +} + +message GetBlockHeaderByNumberResponse { + block_header.BlockHeader block_header = 1; +} + +message NullifierUpdate { + digest.Digest nullifier = 1; + fixed32 block_num = 2; +} + +message SyncStateResponse { + // number of the latest block in the chain + fixed32 chain_tip = 1; + + // block header of the block with the first note matching the specified criteria + block_header.BlockHeader block_header = 2; + + // data needed to update the partial MMR from `block_num + 1` to `block_header.block_num` + mmr.MmrDelta mmr_delta = 3; + + // a list of account hashes updated after `block_num + 1` but not after `block_header.block_num` + repeated account.AccountSummary accounts = 5; + + // a list of all notes together with the Merkle paths from `block_header.note_root` + repeated note.NoteSyncRecord notes = 6; + + // a list of nullifiers created between `block_num + 1` and `block_header.block_num` + repeated NullifierUpdate nullifiers = 7; +} + +// An account returned as a response to the GetBlockInputs +message AccountBlockInputRecord { + account.AccountId account_id = 1; + digest.Digest account_hash = 2; + merkle.MerklePath proof = 3; +} + +// A nullifier returned as a response to the GetBlockInputs +message NullifierBlockInputRecord { + digest.Digest nullifier = 1; + smt.SmtOpening opening = 2; +} + +message GetBlockInputsResponse { + // The latest block header + block_header.BlockHeader block_header = 1; + + // Peaks of the above block's mmr, The `forest` value is equal to the block number. + repeated digest.Digest mmr_peaks = 2; + + // The hashes of the requested accounts and their authentication paths + repeated AccountBlockInputRecord account_states = 3; + + // The requested nullifiers and their authentication paths + repeated NullifierBlockInputRecord nullifiers = 4; +} + +// An account returned as a response to the GetTransactionInputs +message AccountTransactionInputRecord { + account.AccountId account_id = 1; + // The latest account hash, zero hash if the account doesn't exist. + digest.Digest account_hash = 2; +} + +// A nullifier returned as a response to the GetTransactionInputs +message NullifierTransactionInputRecord { + digest.Digest nullifier = 1; + // The block at which the nullifier has been consumed, zero if not consumed. + fixed32 block_num = 2; +} + +message GetTransactionInputsResponse { + AccountTransactionInputRecord account_state = 1; + repeated NullifierTransactionInputRecord nullifiers = 2; +} + +message SubmitProvenTransactionResponse {} + +message GetNotesByIdResponse { + // Lists Note's returned by the database + repeated note.Note notes = 1; +} + +message ListNullifiersResponse { + // Lists all nullifiers of the current chain + repeated smt.SmtLeafEntry nullifiers = 1; +} + +message ListAccountsResponse { + // Lists all accounts of the current chain + repeated account.AccountInfo accounts = 1; +} + +message ListNotesResponse { + // Lists all notes of the current chain + repeated note.Note notes = 1; +} + +message GetAccountDetailsResponse { + // Account info (with details for on-chain accounts) + account.AccountInfo account = 1; +} diff --git a/wasm/src/web_client/rpc/proto/rpc.proto b/wasm/src/web_client/rpc/proto/rpc.proto new file mode 100644 index 000000000..b1caf2dc2 --- /dev/null +++ b/wasm/src/web_client/rpc/proto/rpc.proto @@ -0,0 +1,15 @@ +// Specification of the user facing gRPC API. +syntax = "proto3"; +package rpc; + +import "requests.proto"; +import "responses.proto"; + +service Api { + rpc CheckNullifiers(requests.CheckNullifiersRequest) returns (responses.CheckNullifiersResponse) {} + rpc GetBlockHeaderByNumber(requests.GetBlockHeaderByNumberRequest) returns (responses.GetBlockHeaderByNumberResponse) {} + rpc GetNotesById(requests.GetNotesByIdRequest) returns (responses.GetNotesByIdResponse) {} + rpc SyncState(requests.SyncStateRequest) returns (responses.SyncStateResponse) {} + rpc SubmitProvenTransaction(requests.SubmitProvenTransactionRequest) returns (responses.SubmitProvenTransactionResponse) {} + rpc GetAccountDetails(requests.GetAccountDetailsRequest) returns (responses.GetAccountDetailsResponse) {} +} diff --git a/wasm/src/web_client/rpc/proto/smt.proto b/wasm/src/web_client/rpc/proto/smt.proto new file mode 100644 index 000000000..d62634dd4 --- /dev/null +++ b/wasm/src/web_client/rpc/proto/smt.proto @@ -0,0 +1,32 @@ +// Message definitions related to Sparse Merkle Trees (SMT). + +syntax = "proto3"; +package smt; + +import "digest.proto"; +import "merkle.proto"; + +// An entry in a leaf. +message SmtLeafEntry { + digest.Digest key = 1; + digest.Digest value = 2; +} + +message SmtLeafEntries { + repeated SmtLeafEntry entries = 1; +} + +// A leaf in an SMT, sitting at depth 64. A leaf can contain 0, 1 or multiple leaf entries. +message SmtLeaf { + oneof leaf { + uint64 empty = 1; + SmtLeafEntry single = 2; + SmtLeafEntries multiple = 3; + } +} + +// The opening of a leaf in an SMT. +message SmtOpening { + merkle.MerklePath path = 1; + SmtLeaf leaf = 2; +} diff --git a/wasm/src/web_client/rpc/proto/store.proto b/wasm/src/web_client/rpc/proto/store.proto new file mode 100644 index 000000000..112e3cfe2 --- /dev/null +++ b/wasm/src/web_client/rpc/proto/store.proto @@ -0,0 +1,22 @@ +// Specification of the store RPC. +// +// This provided access to the rollup data to the other nodes. +syntax = "proto3"; +package store; + +import "requests.proto"; +import "responses.proto"; + +service Api { + rpc ApplyBlock(requests.ApplyBlockRequest) returns (responses.ApplyBlockResponse) {} + rpc CheckNullifiers(requests.CheckNullifiersRequest) returns (responses.CheckNullifiersResponse) {} + rpc GetBlockHeaderByNumber(requests.GetBlockHeaderByNumberRequest) returns (responses.GetBlockHeaderByNumberResponse) {} + rpc GetBlockInputs(requests.GetBlockInputsRequest) returns (responses.GetBlockInputsResponse) {} + rpc GetNotesById(requests.GetNotesByIdRequest) returns (responses.GetNotesByIdResponse) {} + rpc GetTransactionInputs(requests.GetTransactionInputsRequest) returns (responses.GetTransactionInputsResponse) {} + rpc SyncState(requests.SyncStateRequest) returns (responses.SyncStateResponse) {} + rpc ListNullifiers(requests.ListNullifiersRequest) returns (responses.ListNullifiersResponse) {} + rpc ListAccounts(requests.ListAccountsRequest) returns (responses.ListAccountsResponse) {} + rpc ListNotes(requests.ListNotesRequest) returns (responses.ListNotesResponse) {} + rpc GetAccountDetails(requests.GetAccountDetailsRequest) returns (responses.GetAccountDetailsResponse) {} +} diff --git a/wasm/src/web_client/web_rpc_client.rs b/wasm/src/web_client/web_rpc_client.rs deleted file mode 100644 index 15987b935..000000000 --- a/wasm/src/web_client/web_rpc_client.rs +++ /dev/null @@ -1,38 +0,0 @@ -use crate::native_code::rpc::NodeRpcClient; - -use wasm_bindgen::prelude::*; -use wasm_bindgen_futures::*; - -use async_trait::async_trait; - -#[wasm_bindgen(module = "/js/web-rpc-client.js")] -extern "C" { - #[wasm_bindgen(js_name = testRpc)] - fn test_rpc(endpoint: String) -> js_sys::Promise; -} - -pub struct WebRpcClient { - endpoint: String -} - -impl WebRpcClient { - pub fn new(endpoint: &str) -> Self { - Self { - endpoint: endpoint.to_string() - } - } -} - -#[async_trait(?Send)] -impl NodeRpcClient for WebRpcClient { - async fn test_rpc(&mut self) -> Result<(), JsValue> { - // Now correctly handling the Promise returned by test_rpc - let promise = test_rpc("https://www.google.com".to_string()); - let result = JsFuture::from(promise).await; - - match result { - Ok(_) => Ok(()), - Err(e) => Err(e), - } - } -} \ No newline at end of file From 0e0bb9a6f8462d3dfa870d6be3f6af5728a359b3 Mon Sep 17 00:00:00 2001 From: Dennis Garcia Date: Thu, 2 May 2024 15:29:40 -0500 Subject: [PATCH 15/42] Added Native Code for Transactions, Sync, and Chain Data (#13) --- wasm/Cargo.toml | 6 +- wasm/js/db/accounts.js | 204 +++-- wasm/js/db/chainData.js | 46 +- wasm/js/db/sync.js | 113 +-- wasm/js/db/transactions.js | 69 +- wasm/src/lib.rs | 2 + wasm/src/native_code/accounts.rs | 182 ++-- wasm/src/native_code/chain_data.rs | 12 +- wasm/src/native_code/mod.rs | 10 +- wasm/src/native_code/note_screener.rs | 239 ++++++ wasm/src/native_code/notes.rs | 26 +- wasm/src/native_code/store/data_store.rs | 379 +++++---- wasm/src/native_code/store/mod.rs | 353 ++++---- wasm/src/native_code/sync.rs | 774 ++++++++++-------- wasm/src/native_code/transactions.rs | 373 --------- .../auth_consume_notes.masm | 5 + .../transaction_scripts/auth_send_asset.masm | 12 + .../distribute_fungible_asset.masm | 13 + wasm/src/native_code/transactions/mod.rs | 434 ++++++++++ .../transactions/transaction_request.rs | 170 ++++ wasm/src/web_client/account.rs | 21 +- wasm/src/web_client/examples.rs | 19 + wasm/src/web_client/mod.rs | 13 +- .../web_client/store/accounts/js_bindings.rs | 33 +- wasm/src/web_client/store/accounts/mod.rs | 66 +- .../store/chain_data/js_bindings.rs | 6 + wasm/src/web_client/store/chain_data/mod.rs | 306 ++++--- wasm/src/web_client/store/chain_data/utils.rs | 45 +- wasm/src/web_client/store/mod.rs | 273 +++--- wasm/src/web_client/store/notes/mod.rs | 17 +- wasm/src/web_client/store/notes/models.rs | 29 +- wasm/src/web_client/store/notes/utils.rs | 2 +- wasm/src/web_client/store/sync/js_bindings.rs | 10 +- wasm/src/web_client/store/sync/mod.rs | 226 ++--- wasm/src/web_client/store/sync/utils.rs | 0 .../store/transactions/js_bindings.rs | 3 +- wasm/src/web_client/store/transactions/mod.rs | 289 ++++--- .../web_client/store/transactions/models.rs | 28 +- .../web_client/store/transactions/utils.rs | 236 +++--- wasm/src/web_client/sync.rs | 13 +- wasm/src/web_client/transactions.rs | 252 +++++- wasm/test.html | 2 +- 42 files changed, 3218 insertions(+), 2093 deletions(-) create mode 100644 wasm/src/native_code/note_screener.rs delete mode 100644 wasm/src/native_code/transactions.rs create mode 100644 wasm/src/native_code/transactions/asm/transaction_scripts/auth_consume_notes.masm create mode 100644 wasm/src/native_code/transactions/asm/transaction_scripts/auth_send_asset.masm create mode 100644 wasm/src/native_code/transactions/asm/transaction_scripts/distribute_fungible_asset.masm create mode 100644 wasm/src/native_code/transactions/mod.rs create mode 100644 wasm/src/native_code/transactions/transaction_request.rs create mode 100644 wasm/src/web_client/examples.rs delete mode 100644 wasm/src/web_client/store/sync/utils.rs diff --git a/wasm/Cargo.toml b/wasm/Cargo.toml index ecac4591c..5ae9bd70a 100644 --- a/wasm/Cargo.toml +++ b/wasm/Cargo.toml @@ -23,9 +23,9 @@ base64 = "0.13" futures = "0.3" getrandom = { version = "0.2", features = ["js"] } hex = { version = "0.4" } -miden-lib = { version = "0.2", default-features = false } -miden-objects = { version = "0.2", features = ["serde"] } -miden-tx = { version = "0.2", default-features = false } +miden-lib = { path="../../demox-miden-base/miden-lib", default-features = false } +miden-objects = { path="../../demox-miden-base/objects", features = ["serde"] } +miden-tx = { path="../../demox-miden-base/miden-tx", default-features = false } rand = { version = "0.8.5" } prost = { version = "0.12.3" } serde = { version = "1.0", features = ["derive"] } diff --git a/wasm/js/db/accounts.js b/wasm/js/db/accounts.js index a75509039..960ebcb29 100644 --- a/wasm/js/db/accounts.js +++ b/wasm/js/db/accounts.js @@ -7,53 +7,20 @@ import { } from './schema.js'; // GET FUNCTIONS -export async function getAccountStub( - accountId -) { +export async function getAccountIds() { try { - // Fetch all records matching the given id - const allMatchingRecords = await accounts - .where('id') - .equals(accountId) - .toArray(); - - if (allMatchingRecords.length === 0) { - console.log('No records found for given ID.'); - return null; // No records found - } - - // Convert nonce to BigInt and sort - // Note: This assumes all nonces are valid BigInt strings. - const sortedRecords = allMatchingRecords.sort((a, b) => { - const bigIntA = BigInt(a.nonce); - const bigIntB = BigInt(b.nonce); - return bigIntA > bigIntB ? -1 : bigIntA < bigIntB ? 1 : 0; + let allIds = new Set(); // Use a Set to ensure uniqueness + + // Iterate over each account entry + await accounts.each(account => { + allIds.add(account.id); // Assuming 'account' has an 'id' property }); - - // The first record is the most recent one due to the sorting - const mostRecentRecord = sortedRecords[0]; - console.log('Most recent record found:', mostRecentRecord); - let accountSeedBase64 = null; - if (mostRecentRecord.accountSeed) { - // Ensure accountSeed is processed as a Uint8Array and converted to Base64 - let accountSeedArrayBuffer = await mostRecentRecord.accountSeed.arrayBuffer(); - let accountSeedArray = new Uint8Array(accountSeedArrayBuffer); - accountSeedBase64 = uint8ArrayToBase64(accountSeedArray); - } - const accountStub = { - id: mostRecentRecord.id, - nonce: mostRecentRecord.nonce, - vault_root: mostRecentRecord.vaultRoot, - storage_root: mostRecentRecord.storageRoot, - code_root: mostRecentRecord.codeRoot, - account_seed: accountSeedBase64 - } - return accountStub; - } catch (error) { - console.error('Error fetching most recent account record:', error); - throw error; // Re-throw the error for further handling - } + return Array.from(allIds); // Convert back to array to return a list of unique IDs + } catch (error) { + console.error("Failed to retrieve account IDs: ", error); + throw error; // Or handle the error as fits your application's error handling strategy + } } export async function getAllAccountStubs() { @@ -74,7 +41,6 @@ export async function getAllAccountStubs() { // Extract the latest records from the Map const latestRecords = Array.from(latestRecordsMap.values()); - console.log('Latest account stub for each id:', latestRecords); const resultObject = await Promise.all(latestRecords.map(async record => { let accountSeedBase64 = null; if (record.accountSeed) { @@ -94,7 +60,6 @@ export async function getAllAccountStubs() { }; })); - console.log(resultObject[0]); return resultObject; } catch (error) { console.error('Error fetching all latest account stubs:', error); @@ -102,6 +67,55 @@ export async function getAllAccountStubs() { } } +export async function getAccountStub( + accountId +) { + try { + // Fetch all records matching the given id + const allMatchingRecords = await accounts + .where('id') + .equals(accountId) + .toArray(); + + if (allMatchingRecords.length === 0) { + console.log('No records found for given ID.'); + return null; // No records found + } + + // Convert nonce to BigInt and sort + // Note: This assumes all nonces are valid BigInt strings. + const sortedRecords = allMatchingRecords.sort((a, b) => { + const bigIntA = BigInt(a.nonce); + const bigIntB = BigInt(b.nonce); + return bigIntA > bigIntB ? -1 : bigIntA < bigIntB ? 1 : 0; + }); + + // The first record is the most recent one due to the sorting + const mostRecentRecord = sortedRecords[0]; + console.log('Most recent record found:', mostRecentRecord); + + let accountSeedBase64 = null; + if (mostRecentRecord.accountSeed) { + // Ensure accountSeed is processed as a Uint8Array and converted to Base64 + let accountSeedArrayBuffer = await mostRecentRecord.accountSeed.arrayBuffer(); + let accountSeedArray = new Uint8Array(accountSeedArrayBuffer); + accountSeedBase64 = uint8ArrayToBase64(accountSeedArray); + } + const accountStub = { + id: mostRecentRecord.id, + nonce: mostRecentRecord.nonce, + vault_root: mostRecentRecord.vaultRoot, + storage_root: mostRecentRecord.storageRoot, + code_root: mostRecentRecord.codeRoot, + account_seed: accountSeedBase64 + } + return accountStub; + } catch (error) { + console.error('Error fetching most recent account record:', error); + throw error; // Re-throw the error for further handling + } +} + export async function getAccountCode( codeRoot ) { @@ -136,14 +150,14 @@ export async function getAccountCode( } } -export async function getAccountAssetVault( - vaultRoot +export async function getAccountStorage( + storageRoot ) { try { // Fetch all records matching the given root - const allMatchingRecords = await accountVaults + const allMatchingRecords = await accountStorages .where('root') - .equals(vaultRoot) + .equals(storageRoot) .toArray(); if (allMatchingRecords.length === 0) { @@ -152,12 +166,16 @@ export async function getAccountAssetVault( } // The first record is the only one due to the uniqueness constraint - const vaultRecord = allMatchingRecords[0]; - console.log('Vault record found:', vaultRecord); + const storageRecord = allMatchingRecords[0]; + console.log('Storage record found:', storageRecord); + // Convert the module Blob to an ArrayBuffer + const storageArrayBuffer = await storageRecord.slots.arrayBuffer(); + const storageArray = new Uint8Array(storageArrayBuffer); + const storageBase64 = uint8ArrayToBase64(storageArray); return { - root: vaultRecord.root, - assets: vaultRecord.assets + root: storageRecord.root, + storage: storageBase64 }; } catch (error) { console.error('Error fetching code record:', error); @@ -165,14 +183,14 @@ export async function getAccountAssetVault( } } -export async function getAccountStorage( - storageRoot +export async function getAccountAssetVault( + vaultRoot ) { try { // Fetch all records matching the given root - const allMatchingRecords = await accountStorages + const allMatchingRecords = await accountVaults .where('root') - .equals(storageRoot) + .equals(vaultRoot) .toArray(); if (allMatchingRecords.length === 0) { @@ -181,16 +199,12 @@ export async function getAccountStorage( } // The first record is the only one due to the uniqueness constraint - const storageRecord = allMatchingRecords[0]; - console.log('Storage record found:', storageRecord); + const vaultRecord = allMatchingRecords[0]; + console.log('Vault record found:', vaultRecord); - // Convert the module Blob to an ArrayBuffer - const storageArrayBuffer = await storageRecord.slots.arrayBuffer(); - const storageArray = new Uint8Array(storageArrayBuffer); - const storageBase64 = uint8ArrayToBase64(storageArray); return { - root: storageRecord.root, - storage: storageBase64 + root: vaultRecord.root, + assets: vaultRecord.assets }; } catch (error) { console.error('Error fetching code record:', error); @@ -231,22 +245,6 @@ export async function getAccountAuth( } } -export async function getAccountIds() { - try { - let allIds = new Set(); // Use a Set to ensure uniqueness - - // Iterate over each account entry - await accounts.each(account => { - allIds.add(account.id); // Assuming 'account' has an 'id' property - }); - - return Array.from(allIds); // Convert back to array to return a list of unique IDs - } catch (error) { - console.error("Failed to retrieve account IDs: ", error); - throw error; // Or handle the error as fits your application's error handling strategy - } -} - // INSERT FUNCTIONS export async function insertAccountCode( @@ -313,27 +311,6 @@ export async function insertAccountAssetVault( } } -export async function insertAccountAuth( - accountId, - authInfo -) { - try { - let authInfoBlob = new Blob([new Uint8Array(authInfo)]); - - // Prepare the data object to insert - const data = { - accountId: accountId, // Using accountId as the key - authInfo: authInfoBlob, - }; - - // Perform the insert using Dexie - await accountAuths.add(data); - } catch (error) { - console.error(`Error inserting auth for account: ${accountId}:`, error); - throw error; // Rethrow the error to handle it further up the call chain if needed - } -} - export async function insertAccountRecord( accountId, code_root, @@ -371,6 +348,27 @@ export async function insertAccountRecord( } } +export async function insertAccountAuth( + accountId, + authInfo +) { + try { + let authInfoBlob = new Blob([new Uint8Array(authInfo)]); + + // Prepare the data object to insert + const data = { + accountId: accountId, // Using accountId as the key + authInfo: authInfoBlob, + }; + + // Perform the insert using Dexie + await accountAuths.add(data); + } catch (error) { + console.error(`Error inserting auth for account: ${accountId}:`, error); + throw error; // Rethrow the error to handle it further up the call chain if needed + } +} + function uint8ArrayToBase64(bytes) { const binary = bytes.reduce((acc, byte) => acc + String.fromCharCode(byte), ''); return btoa(binary); diff --git a/wasm/js/db/chainData.js b/wasm/js/db/chainData.js index 7e2b19935..19b0e9b3e 100644 --- a/wasm/js/db/chainData.js +++ b/wasm/js/db/chainData.js @@ -19,13 +19,32 @@ export async function insertBlockHeader( }; await blockHeaders.add(data); - return `Block header for block ${blockNum} inserted successfully.` } catch (err) { console.error("Failed to insert block header: ", err); - throw error; + throw err; } } +export async function insertChainMmrNodes( + ids, + nodes +) { + try { + const data = nodes.map((node, index) => { + return { + id: ids[index], + node: node + } + }); + + await chainMmrNodes.bulkAdd(data); + } catch (err) { + console.error("Failed to insert chain mmr nodes: ", err); + throw err; + } +} + +// GET FUNCTIONS export async function getBlockHeaders( blockNumbers ) { @@ -38,7 +57,7 @@ export async function getBlockHeaders( return results } catch (err) { console.error("Failed to get block headers: ", err); - throw error; + throw err; } } @@ -49,9 +68,22 @@ export async function getTrackedBlockHeaders() { .where('hasClientNotes') .equals(true) .toArray(); - } catch (error) { + return allMatchingRecords; + } catch (err) { console.error("Failed to get tracked block headers: ", err); - throw error; + throw err; + } +} + +export async function getChainMmrPeaksByBlockNum( + blockNum +) { + try { + const blockHeader = await blockHeaders.get(blockNum); + return blockHeader.chainMmrPeaks; + } catch (err) { + console.error("Failed to get chain mmr peaks: ", err); + throw err; } } @@ -61,7 +93,7 @@ export async function getChainMmrNodesAll() { return chainMmrNodesAll; } catch (err) { console.error("Failed to get chain mmr nodes: ", err); - throw error; + throw err; } } @@ -77,6 +109,6 @@ export async function getChainMmrNodes( return results; } catch (err) { console.error("Failed to get chain mmr nodes: ", err); - throw error; + throw err; } } \ No newline at end of file diff --git a/wasm/js/db/sync.js b/wasm/js/db/sync.js index 991e170f1..16c652ee4 100644 --- a/wasm/js/db/sync.js +++ b/wasm/js/db/sync.js @@ -12,7 +12,7 @@ export async function getNoteTags() { const record = await stateSync.get(1); // Since id is the primary key and always 1 if (record) { console.log('Retrieved record:', record); - return record.tags; // Accessing blockNum directly from the record + return record.tags; } else { console.log('No record found with id: 1'); return null; @@ -65,10 +65,10 @@ export async function applyStateSync( return db.transaction('rw', stateSync, inputNotes, outputNotes, transactions, blockHeaders, async (tx) => { await updateSyncHeight(tx, blockNum); await updateSpentNotes(tx, nullifiers); - await updateCommittedNotes(tx, noteIds, inclusionProofs); - await updateCommittedTransactions(tx, blockNum, transactionIds); await updateBlockHeader(tx, blockNum, blockHeader, chainMmrPeaks, hasClientNotes); await updateChainMmrNodes(tx, nodeIndices, nodes); + await updateCommittedNotes(tx, noteIds, inclusionProofs); + await updateCommittedTransactions(tx, blockNum, transactionIds); }); } @@ -78,6 +78,7 @@ async function updateSyncHeight( ) { try { await tx.stateSync.update(1, { blockNum: blockNum }); + console.log("Sync height updated successfully."); } catch (error) { console.error("Failed to update sync height: ", error); throw error; @@ -103,7 +104,7 @@ async function updateSpentNotes( for (const note of parsedInputNotes) { if (nullifiers.includes(note.details.nullifier)) { // If the nullifier is in the list, update the note's status - await tx.inputNotes.update(note.noteId, { status: 'consumed' }); + await tx.inputNotes.update(note.noteId, { status: 'Consumed' }); } } @@ -117,7 +118,7 @@ async function updateSpentNotes( for (const note of parsedOutputNotes) { if (nullifiers.includes(note.details.nullifier)) { // If the nullifier is in the list, update the note's status - await tx.outputNotes.update(note.noteId, { status: 'consumed' }); + await tx.outputNotes.update(note.noteId, { status: 'Consumed' }); } } @@ -128,6 +129,55 @@ async function updateSpentNotes( } } +async function updateBlockHeader( + tx, + blockNum, + blockHeader, + chainMmrPeaks, + hasClientNotes +) { + try { + const data = { + blockNum: blockNum, + header: blockHeader, + chainMmrPeaks: chainMmrPeaks, + hasClientNotes: hasClientNotes + }; + + await tx.blockHeaders.add(data); + console.log(`Block header for block ${blockNum} inserted successfully.`); + } catch (err) { + console.error("Failed to insert block header: ", err); + throw error; + } +} + +async function updateChainMmrNodes( + tx, + nodeIndices, + nodes +) { + try { + // Check if the arrays are not of the same length + if (nodeIndices.length !== nodes.length) { + throw new Error("nodeIndices and nodes arrays must be of the same length"); + } + + // Create the updates array with objects matching the structure expected by your IndexedDB schema + const updates = nodeIndices.map((index, i) => ({ + index: index, // Assuming 'index' is the primary key or part of it + node: nodes[i] // Other attributes of the object + })); + + // Perform bulk update or insertion; assumes tx.chainMmrNodes is a valid table reference in a transaction + await tx.chainMmrNodes.bulkAdd(updates); + console.log("Successfully updated chain MMR nodes"); + } catch (err) { + console.error("Failed to update chain mmr nodes: ", err); + throw error; + } +} + async function updateCommittedNotes( tx, noteIds, @@ -144,13 +194,13 @@ async function updateCommittedNotes( // Update input notes await tx.inputNotes.where({ noteId: noteId }).modify({ - status: 'committed', + status: 'Committed', inclusion_proof: inclusionProof }); // Update output notes await tx.outputNotes.where({ noteId: noteId }).modify({ - status: 'committed', + status: 'Committed', inclusion_proof: inclusionProof }); } @@ -176,53 +226,4 @@ async function updateCommittedTransactions( console.error("Failed to mark transactions as committed: ", err); throw err; } -} - -async function updateBlockHeader( - tx, - blockNum, - blockHeader, - chainMmrPeaks, - hasClientNotes -) { - try { - const data = { - blockNum: blockNum, - header: blockHeader, - chainMmrPeaks: chainMmrPeaks, - hasClientNotes: hasClientNotes - }; - - await tx.blockHeaders.add(data); - return `Block header for block ${blockNum} inserted successfully.` - } catch (err) { - console.error("Failed to insert block header: ", err); - throw error; - } -} - -async function updateChainMmrNodes( - tx, - nodeIndices, - nodes -) { - try { - // Check if the arrays are not of the same length - if (nodeIndices.length !== nodes.length) { - throw new Error("nodeIndices and nodes arrays must be of the same length"); - } - - // Create the updates array with objects matching the structure expected by your IndexedDB schema - const updates = nodeIndices.map((index, i) => ({ - index: index, // Assuming 'index' is the primary key or part of it - node: nodes[i] // Other attributes of the object - })); - - // Perform bulk update or insertion; assumes tx.chainMmrNodes is a valid table reference in a transaction - await tx.chainMmrNodes.bulkPut(updates); - return "Successfully updated chain MMR nodes"; - } catch (err) { - console.error("Failed to update chain mmr nodes: ", err); - throw error; - } } \ No newline at end of file diff --git a/wasm/js/db/transactions.js b/wasm/js/db/transactions.js index 64a5fcb40..259511ae7 100644 --- a/wasm/js/db/transactions.js +++ b/wasm/js/db/transactions.js @@ -24,24 +24,28 @@ export async function getTransactions( }, {}); const processedTransactions = await Promise.all(transactionRecords.map(async transactionRecord => { - let scriptHashArrayBuffer = null; - let scriptProgramArrayBuffer = null; - - outputNotesArrayBuffer = await transactionRecord.outputNotes.arrayBuffer(); + let scriptHashBase64 = null; + let scriptProgramBase64 = null; + if (transactionRecord.scriptHash !== null) { - scriptHashArrayBuffer = await transactionRecord.scriptHash.arrayBuffer(); - } - if (scriptMap[transactionRecord.scriptHash] !== null) { - scriptProgramArrayBuffer = await scriptMap[transactionRecord.scriptHash].arrayBuffer(); + let scriptHashArrayBuffer = await transactionRecord.scriptHash.arrayBuffer(); + let scriptHashArray = new Uint8Array(scriptHashArrayBuffer); + scriptHashBase64 = uint8ArrayToBase64(scriptHashArray); } - transactionRecord.outputNotes = new Uint8Array(outputNotesArrayBuffer); - if (scriptHashArrayBuffer !== null) { - transactionRecord.scriptHash = new Uint8Array(scriptHashArrayBuffer); - } - if (scriptProgramArrayBuffer !== null) { - transactionRecord.scriptProgram = new Uint8Array(scriptProgramArrayBuffer); + if (transactionRecord.scriptProgram !== null) { + let scriptProgramArrayBuffer = await transactionRecord.scriptProgram.arrayBuffer(); + let scriptProgramArray = new Uint8Array(scriptProgramArrayBuffer); + scriptProgramBase64 = uint8ArrayToBase64(scriptProgramArray); } + + let outputNotesArrayBuffer = await transactionRecord.outputNotes.arrayBuffer(); + let outputNotesArray = new Uint8Array(outputNotesArrayBuffer); + let outputNotesBase64 = uint8ArrayToBase64(outputNotesArray); + + transactionRecord.scriptHash = scriptHashBase64; + transactionRecord.scriptProgram = scriptProgramBase64; + transactionRecord.outputNotes = outputNotesBase64; return transactionRecord; })); @@ -59,11 +63,22 @@ export async function insertTransactionScript( scriptProgram ) { try { - if (scriptHash === null || scriptProgram === null) { - throw new Error("Script hash and program must be provided."); + // check if script hash already exists + let record = await transactionScripts.where("scriptHash").equals(scriptHash).first(); + if (record !== undefined) { + console.log("Transaction script already exists, ignoring."); + return; + } + + if (scriptHash === null) { + throw new Error("Script hash must be provided"); + } + let scriptHashBlob = new Blob([new Uint8Array(scriptHash)]); + let scriptProgramBlob = null; + + if (scriptProgram !== null) { + scriptProgramBlob = new Blob([new Uint8Array(scriptProgram)]); } - let scriptHashBlob = new Blob([scriptHash]); - let scriptProgramBlob = new Blob([scriptProgram]); const data = { scriptHash: scriptHashBlob, @@ -89,21 +104,16 @@ export async function insertProvenTransactionData( finalAccountState, inputNotes, outputNotes, - scriptProgram, scriptHash, scriptInputs, blockNum, committed ) { try { - let scriptProgramBlob = null; let scriptHashBlob = null; - let outputNotesBlob = new Blob([outputNotes]); - if (scriptProgram !== null) { - scriptProgramBlob = new Blob([scriptProgram]); - } + let outputNotesBlob = new Blob([new Uint8Array(outputNotes)]); if (scriptHash !== null) { - scriptHashBlob = new Blob([scriptHash]); + scriptHashBlob = new Blob([new Uint8Array(scriptHash)]); } const data = { @@ -113,7 +123,6 @@ export async function insertProvenTransactionData( finalAccountState: finalAccountState, inputNotes: inputNotes, outputNotes: outputNotesBlob, - scriptProgram: scriptProgramBlob, scriptHash: scriptHashBlob, scriptInputs: scriptInputs, blockNum: blockNum, @@ -137,9 +146,15 @@ export async function markTransactionsAsCommitted( commitHeight: blockNum })); - await transactions.bulkPut(updates); + const result = await transactions.bulkPut(updates); + return result.length; } catch (err) { console.error("Failed to mark transactions as committed: ", err); throw err; } +} + +function uint8ArrayToBase64(bytes) { + const binary = bytes.reduce((acc, byte) => acc + String.fromCharCode(byte), ''); + return btoa(binary); } \ No newline at end of file diff --git a/wasm/src/lib.rs b/wasm/src/lib.rs index 251e05ab3..aae0f3b0e 100644 --- a/wasm/src/lib.rs +++ b/wasm/src/lib.rs @@ -1,3 +1,5 @@ +extern crate alloc; + pub mod native_code; pub mod web_client; diff --git a/wasm/src/native_code/accounts.rs b/wasm/src/native_code/accounts.rs index 8f59cc11e..bfa72ba21 100644 --- a/wasm/src/native_code/accounts.rs +++ b/wasm/src/native_code/accounts.rs @@ -7,8 +7,10 @@ use miden_objects::{ Account, AccountData, AccountId, AccountStorageType, AccountStub, AccountType, AuthData }, assets::TokenSymbol, crypto::{ dsa::rpo_falcon512::SecretKey, - rand::{FeltRng, RpoRandomCoin}, - }, Digest, Word + rand::{ + FeltRng, RpoRandomCoin + }, + }, Digest, Felt, Word }; use crate::native_code::store::AuthInfo; @@ -69,20 +71,59 @@ impl Client { max_supply, storage_mode, } => { - todo!(); - //self.new_fungible_faucet(token_symbol, decimals, max_supply, storage_mode).await + self.new_fungible_faucet(token_symbol, decimals, max_supply, storage_mode).await } }?; Ok(account_and_seed) } - /// Creates a new regular account and saves it in the store along with its seed and auth data + /// Saves in the store the [Account] corresponding to `account_data`. + /// + /// # Errors + /// + /// Will return an error if trying to import a new account without providing its seed /// /// # Panics /// - /// If the passed [AccountStorageMode] is [AccountStorageMode::OnChain], this function panics - /// since this feature is not currently supported on Miden + /// Will panic when trying to import a non-new account without a seed since this functionality + /// is not currently implemented + pub async fn import_account( + &mut self, + account_data: AccountData + ) -> Result<(), ClientError> { + match account_data.auth { + AuthData::RpoFalcon512Seed(key_pair_seed) => { + // NOTE: The seed should probably come from a different format from miden-base's AccountData + let seed = Digest::try_from(&key_pair_seed).unwrap().into(); + let mut rng = RpoRandomCoin::new(seed); + + let key_pair = SecretKey::with_rng(&mut rng); + + let account_seed = if !account_data.account.is_new() + && account_data.account_seed.is_some() + { + tracing::warn!("Imported an existing account and still provided a seed when it is not needed. It's possible that the account's file was incorrectly generated. The seed will be ignored."); + // Ignore the seed since it's not a new account + + // TODO: The alternative approach to this is to store the seed anyway, but + // ignore it at the point of executing against this transaction, but that + // approach seems a little bit more incorrect + None + } else { + account_data.account_seed + }; + + self.insert_account( + &account_data.account, + account_seed, + &AuthInfo::RpoFalcon512(key_pair), + ).await + }, + } + } + + /// Creates a new regular account and saves it in the store along with its seed and auth data async fn new_basic_wallet( &mut self, mutable_code: bool, @@ -112,7 +153,7 @@ impl Client { ) }?; - let _ = self.insert_account(&account, Some(seed), &AuthInfo::RpoFalcon512(key_pair)).await; + self.insert_account(&account, Some(seed), &AuthInfo::RpoFalcon512(key_pair)).await?; Ok((account, seed)) } @@ -123,109 +164,84 @@ impl Client { decimals: u8, max_supply: u64, account_storage_mode: AccountStorageMode, - ) -> String{ // TODO: Replace with Result<(Account, Word), ()> - - // if let AccountStorageMode::OnChain = account_storage_mode { - // todo!("On-chain accounts are not supported yet"); - // } - - // let key_pair: KeyPair = KeyPair::new()?; - - // let auth_scheme: AuthScheme = AuthScheme::RpoFalcon512 { - // pub_key: key_pair.public_key(), - // }; - - // // we need to use an initial seed to create the wallet account - // let init_seed: [u8; 32] = rng.gen(); - - // let (account, seed) = miden_lib::accounts::faucets::create_basic_fungible_faucet( - // init_seed, - // token_symbol, - // decimals, - // Felt::try_from(max_supply.to_le_bytes().as_slice()) - // .expect("u64 can be safely converted to a field element"), - // auth_scheme, - // )?; - - // self.insert_account(&account, Some(seed), &AuthInfo::RpoFalcon512(key_pair))?; - // Ok((account, seed)) - - "Called new_fungible_faucet".to_string() - } - - pub async fn import_account( - &mut self, - account_data: AccountData - ) -> Result<(), ()> { - match account_data.auth { - AuthData::RpoFalcon512Seed(key_pair_seed) => { - // NOTE: The seed should probably come from a different format from miden-base's AccountData - let seed = Digest::try_from(&key_pair_seed).unwrap().into(); - let mut rng = RpoRandomCoin::new(seed); - - let key_pair = SecretKey::with_rng(&mut rng); + ) -> Result<(Account, Word), ClientError> { + let key_pair = SecretKey::with_rng(&mut self.rng); - let account_seed = if !account_data.account.is_new() - && account_data.account_seed.is_some() - { - tracing::warn!("Imported an existing account and still provided a seed when it is not needed. It's possible that the account's file was incorrectly generated. The seed will be ignored."); - // Ignore the seed since it's not a new account + let auth_scheme: AuthScheme = AuthScheme::RpoFalcon512 { pub_key: key_pair.public_key() }; - // TODO: The alternative approach to this is to store the seed anyway, but - // ignore it at the point of executing against this transaction, but that - // approach seems a little bit more incorrect - None - } else { - account_data.account_seed - }; + // we need to use an initial seed to create the wallet account + let mut init_seed = [0u8; 32]; + self.rng.fill_bytes(&mut init_seed); - self.insert_account( - &account_data.account, - account_seed, - &AuthInfo::RpoFalcon512(key_pair), - ).await - }, - } + let (account, seed) = miden_lib::accounts::faucets::create_basic_fungible_faucet( + init_seed, + token_symbol, + decimals, + Felt::try_from(max_supply.to_le_bytes().as_slice()) + .expect("u64 can be safely converted to a field element"), + account_storage_mode.into(), + auth_scheme, + )?; + + self.insert_account(&account, Some(seed), &AuthInfo::RpoFalcon512(key_pair)).await?; + Ok((account, seed)) } + /// Inserts a new account into the client's store. + /// + /// # Errors + /// + /// If an account is new and no seed is provided, the function errors out because the client + /// cannot execute transactions against new accounts for which it does not know the seed. pub async fn insert_account( &mut self, account: &Account, account_seed: Option, auth_info: &AuthInfo, - ) -> Result<(), ()> { + ) -> Result<(), ClientError> { if account.is_new() && account_seed.is_none() { - return Err(()); + return Err(ClientError::ImportNewAccountWithoutSeed); } self.store .insert_account(account, account_seed, auth_info).await + .map_err(ClientError::StoreError) } - pub async fn get_accounts( - &mut self - ) -> Result)>, ()> { - self.store.get_account_stubs().await + // ACCOUNT DATA RETRIEVAL + // -------------------------------------------------------------------------------------------- + + /// Returns summary info about the accounts managed by this client. + pub async fn get_accounts(&self) -> Result)>, ClientError> { + self.store.get_account_stubs().await.map_err(|err| err.into()) } + /// Returns summary info about the specified account. pub async fn get_account( - &mut self, + &self, account_id: AccountId - ) -> Result<(Account, Option), ()> { - self.store.get_account(account_id).await + ) -> Result<(Account, Option), ClientError> { + self.store.get_account(account_id).await.map_err(|err| err.into()) } + /// Returns summary info about the specified account. pub async fn get_account_stub_by_id( - &mut self, + &self, account_id: AccountId, - ) -> Result<(AccountStub, Option), ()> { - self.store.get_account_stub(account_id).await + ) -> Result<(AccountStub, Option), ClientError> { + self.store.get_account_stub(account_id).await.map_err(|err| err.into()) } + /// Returns an [AuthInfo] object utilized to authenticate an account. + /// + /// # Errors + /// + /// Returns a [ClientError::StoreError] with a [StoreError::AccountDataNotFound](crate::errors::StoreError::AccountDataNotFound) if the provided ID does + /// not correspond to an existing account. pub async fn get_account_auth( - &mut self, + &self, account_id: AccountId - ) -> Result { - self.store.get_account_auth(account_id).await + ) -> Result { + self.store.get_account_auth(account_id).await.map_err(|err| err.into()) } } diff --git a/wasm/src/native_code/chain_data.rs b/wasm/src/native_code/chain_data.rs index 61782a487..dc250bb3b 100644 --- a/wasm/src/native_code/chain_data.rs +++ b/wasm/src/native_code/chain_data.rs @@ -1,18 +1,14 @@ -use miden_objects::crypto::rand::FeltRng; +use miden_objects::{crypto::rand::FeltRng, BlockHeader}; use super::{ - rpc::NodeRpcClient, - Client, - store::Store // TODO: Add AuthInfo + errors::ClientError, rpc::NodeRpcClient, store::Store, Client // TODO: Add AuthInfo }; impl Client { pub async fn get_block_headers( &self, block_numbers: &[u32], - ) -> String { // TODO: Replace with Result, ()> - //self.store.get_block_headers(block_numbers).map_err(|err| ()) - - "Called get_block_headers".to_string() + ) -> Result, ClientError> { + self.store.get_block_headers(block_numbers).await.map_err(ClientError::StoreError) } } \ No newline at end of file diff --git a/wasm/src/native_code/mod.rs b/wasm/src/native_code/mod.rs index a6ad1cb3c..4fdc910f8 100644 --- a/wasm/src/native_code/mod.rs +++ b/wasm/src/native_code/mod.rs @@ -3,6 +3,7 @@ use miden_objects::{ crypto::rand::{FeltRng, RpoRandomCoin}, Felt }; +use miden_tx::TransactionExecutor; use rand::{rngs::StdRng, Rng, SeedableRng}; pub mod accounts; @@ -12,6 +13,7 @@ pub mod sync; pub mod chain_data; pub mod utils; pub mod errors; +pub mod note_screener; pub mod store; use store::Store; @@ -19,6 +21,8 @@ use store::Store; pub mod rpc; use rpc::NodeRpcClient; +use self::store::data_store::ClientDataStore; + // Hoping that eventually we can use the generic store type defined in client/mod.rs. // For now, wanted to play around with creating a client with a WebStore implementation // (instead of a SQLite implementation) and getting an underlying store method to execute @@ -31,7 +35,7 @@ pub struct Client { pub store: S, pub rng: R, pub rpc_api: N, - // pub tx_executor: TransactionExecutor> + pub tx_executor: TransactionExecutor> } impl Client { @@ -39,13 +43,13 @@ impl Client { api: N, rng: R, store: S, - //executor_store: S + executor_store: S ) -> Self { Self { store: store, rng: rng, rpc_api: api, - // tx_executor: TransactionExecutor::new(ClientDataStore::new(executor_store)) + tx_executor: TransactionExecutor::new(ClientDataStore::new(executor_store)) } } } diff --git a/wasm/src/native_code/note_screener.rs b/wasm/src/native_code/note_screener.rs new file mode 100644 index 000000000..b27ac1258 --- /dev/null +++ b/wasm/src/native_code/note_screener.rs @@ -0,0 +1,239 @@ +use std::collections::BTreeSet; + +use miden_objects::{accounts::AccountId, assets::Asset, notes::Note, Word}; + +use crate::native_code::{ + store::Store, + errors::{InvalidNoteInputsError, ScreenerError} +}; + +// KNOWN SCRIPT ROOTS +// -------------------------------------------------------------------------------------------- +pub(crate) const P2ID_NOTE_SCRIPT_ROOT: &str = + "0xcdfd70344b952980272119bc02b837d14c07bbfc54f86a254422f39391b77b35"; +pub(crate) const P2IDR_NOTE_SCRIPT_ROOT: &str = + "0x41e5727b99a12b36066c09854d39d64dd09d9265c442a9be3626897572bf1745"; +pub(crate) const SWAP_NOTE_SCRIPT_ROOT: &str = + "0x5852920f88985b651cf7ef5e48623f898b6c292f4a2c25dd788ff8b46dd90417"; + +#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord)] +pub enum NoteRelevance { + /// The note can be consumed at any time. + Always, + /// The note can be consumed after the block with the specified number. + After(u32), +} + +pub struct NoteScreener<'a, S: Store> { + store: &'a S, +} + +impl<'a, S: Store> NoteScreener<'a, S> { + pub fn new(store: &'a S) -> Self { + Self { store } + } + + /// Returns a vector of tuples describing the relevance of the provided note to the + /// accounts monitored by this screener. + /// + /// Does a fast check for known scripts (P2ID, P2IDR, SWAP). We're currently + /// unable to execute notes that are not committed so a slow check for other scripts is currently + /// not available. + pub async fn check_relevance( + &self, + note: &Note, + ) -> Result, ScreenerError> { + let account_ids = BTreeSet::from_iter(self.store.get_account_ids().await.unwrap()); + + let script_hash = note.script().hash().to_string(); + let note_relevance = match script_hash.as_str() { + P2ID_NOTE_SCRIPT_ROOT => Self::check_p2id_relevance(note, &account_ids)?, + P2IDR_NOTE_SCRIPT_ROOT => Self::check_p2idr_relevance(note, &account_ids)?, + SWAP_NOTE_SCRIPT_ROOT => self.check_swap_relevance(note, &account_ids).await.unwrap(), + _ => self.check_script_relevance(note, &account_ids)?, + }; + + Ok(note_relevance) + } + + fn check_p2id_relevance( + note: &Note, + account_ids: &BTreeSet, + ) -> Result, ScreenerError> { + let mut note_inputs_iter = note.inputs().values().iter(); + let account_id_felt = note_inputs_iter + .next() + .ok_or(InvalidNoteInputsError::NumInputsError(note.id(), 1))?; + + if note_inputs_iter.next().is_some() { + return Err(InvalidNoteInputsError::NumInputsError(note.id(), 1).into()); + } + + let account_id = AccountId::try_from(*account_id_felt) + .map_err(|err| InvalidNoteInputsError::AccountError(note.id(), err))?; + + if !account_ids.contains(&account_id) { + return Ok(vec![]); + } + Ok(vec![(account_id, NoteRelevance::Always)]) + } + + fn check_p2idr_relevance( + note: &Note, + account_ids: &BTreeSet, + ) -> Result, ScreenerError> { + let mut note_inputs_iter = note.inputs().values().iter(); + let account_id_felt = note_inputs_iter + .next() + .ok_or(InvalidNoteInputsError::NumInputsError(note.id(), 2))?; + let recall_height_felt = note_inputs_iter + .next() + .ok_or(InvalidNoteInputsError::NumInputsError(note.id(), 2))?; + + if note_inputs_iter.next().is_some() { + return Err(InvalidNoteInputsError::NumInputsError(note.id(), 2).into()); + } + + let sender = note.metadata().sender(); + let recall_height: u32 = recall_height_felt.as_int().try_into().map_err(|_err| { + InvalidNoteInputsError::BlockNumberError(note.id(), recall_height_felt.as_int()) + })?; + + let account_id = AccountId::try_from(*account_id_felt) + .map_err(|err| InvalidNoteInputsError::AccountError(note.id(), err))?; + + Ok(vec![ + (account_id, NoteRelevance::Always), + (sender, NoteRelevance::After(recall_height)), + ] + .into_iter() + .filter(|(account_id, _relevance)| account_ids.contains(account_id)) + .collect()) + } + + /// Checks if a swap note can be consumed by any account whose id is in `account_ids` + /// + /// This implementation serves as a placeholder as we're currently not able to create, execute + /// and send SWAP NOTES. Hence, it's also untested. The main logic should be the same: for each + /// account check if it has enough of the wanted asset. + /// This is also very inefficient as we're loading the full accounts. We should instead just + /// load the account's vaults, or even have a function in the `Store` to do this. + /// + /// TODO: test/revisit this in the future + async fn check_swap_relevance( + &self, + note: &Note, + account_ids: &BTreeSet, + ) -> Result, ScreenerError> { + let note_inputs = note.inputs().to_vec(); + if note_inputs.len() != 9 { + return Ok(Vec::new()); + } + + // get the demanded asset from the note's inputs + let asset: Asset = + Word::from([note_inputs[4], note_inputs[5], note_inputs[6], note_inputs[7]]) + .try_into() + .map_err(|err| InvalidNoteInputsError::AssetError(note.id(), err))?; + let asset_faucet_id = AccountId::try_from(asset.vault_key()[3]) + .map_err(|err| InvalidNoteInputsError::AccountError(note.id(), err))?; + + let mut accounts_with_relevance = Vec::new(); + + for account_id in account_ids { + let (account, _) = self.store.get_account(*account_id).await.unwrap(); + + // Check that the account can cover the demanded asset + match asset { + Asset::NonFungible(_non_fungible_asset) + if account.vault().has_non_fungible_asset(asset).expect( + "Should be able to query has_non_fungible_asset for an Asset::NonFungible", + ) => + { + accounts_with_relevance.push((*account_id, NoteRelevance::Always)) + }, + Asset::Fungible(fungible_asset) + if account + .vault() + .get_balance(asset_faucet_id) + .expect("Should be able to query get_balance for an Asset::Fungible") + >= fungible_asset.amount() => + { + accounts_with_relevance.push((*account_id, NoteRelevance::Always)) + }, + _ => {}, + } + } + + Ok(accounts_with_relevance) + } + + fn check_script_relevance( + &self, + _note: &Note, + account_ids: &BTreeSet, + ) -> Result, ScreenerError> { + // TODO: try to execute the note script against relevant accounts; this will + // require querying data from the store + Ok(account_ids + .iter() + .map(|account_id| (*account_id, NoteRelevance::Always)) + .collect()) + } +} + +// #[cfg(test)] +// mod tests { +// use miden_lib::notes::{create_p2id_note, create_p2idr_note, create_swap_note}; +// use miden_objects::{ +// accounts::{AccountId, ACCOUNT_ID_FUNGIBLE_FAUCET_OFF_CHAIN}, +// assets::FungibleAsset, +// crypto::rand::RpoRandomCoin, +// notes::NoteType, +// }; + +// use crate::native_code::note_screener::{ +// P2IDR_NOTE_SCRIPT_ROOT, P2ID_NOTE_SCRIPT_ROOT, SWAP_NOTE_SCRIPT_ROOT, +// }; + +// // We need to make sure the script roots we use for filters are in line with the note scripts +// // coming from Miden objects +// #[test] +// fn ensure_correct_script_roots() { +// // create dummy data for the notes +// let faucet_id: AccountId = ACCOUNT_ID_FUNGIBLE_FAUCET_OFF_CHAIN.try_into().unwrap(); +// let account_id: AccountId = ACCOUNT_ID_FUNGIBLE_FAUCET_OFF_CHAIN.try_into().unwrap(); +// let rng = RpoRandomCoin::new(Default::default()); + +// // create dummy notes to compare note script roots +// let p2id_note = create_p2id_note( +// account_id, +// account_id, +// vec![FungibleAsset::new(faucet_id, 100u64).unwrap().into()], +// NoteType::OffChain, +// rng, +// ) +// .unwrap(); +// let p2idr_note = create_p2idr_note( +// account_id, +// account_id, +// vec![FungibleAsset::new(faucet_id, 100u64).unwrap().into()], +// NoteType::OffChain, +// 10, +// rng, +// ) +// .unwrap(); +// let (swap_note, _serial_num) = create_swap_note( +// account_id, +// FungibleAsset::new(faucet_id, 100u64).unwrap().into(), +// FungibleAsset::new(faucet_id, 100u64).unwrap().into(), +// NoteType::OffChain, +// rng, +// ) +// .unwrap(); + +// assert_eq!(p2id_note.script().hash().to_string(), P2ID_NOTE_SCRIPT_ROOT); +// assert_eq!(p2idr_note.script().hash().to_string(), P2IDR_NOTE_SCRIPT_ROOT); +// assert_eq!(swap_note.script().hash().to_string(), SWAP_NOTE_SCRIPT_ROOT); +// } +// } diff --git a/wasm/src/native_code/notes.rs b/wasm/src/native_code/notes.rs index fbae4e43c..c9eef53b4 100644 --- a/wasm/src/native_code/notes.rs +++ b/wasm/src/native_code/notes.rs @@ -3,7 +3,10 @@ use miden_objects::{crypto::rand::FeltRng, notes::NoteId}; use crate::native_code::store::NoteFilter; use super::{ - errors::StoreError, rpc::NodeRpcClient, store::{note_record::InputNoteRecord, Store}, Client // TODO: Add AuthInfo + errors::ClientError, + rpc::NodeRpcClient, + store::{note_record::InputNoteRecord, Store}, + Client }; impl Client { @@ -11,29 +14,20 @@ impl Client { // -------------------------------------------------------------------------------------------- /// Returns input notes managed by this client. - pub async fn get_input_notes( - &mut self, - filter: NoteFilter, - ) -> Result, StoreError> { - self.store.get_input_notes(filter).await + pub async fn get_input_notes(&self,filter: NoteFilter) -> Result, ClientError> { + self.store.get_input_notes(filter).await.map_err(|err| err.into()) } /// Returns the input note with the specified hash. - pub async fn get_input_note( - &mut self, - note_id: NoteId, - ) -> Result { - self.store.get_input_note(note_id).await + pub async fn get_input_note(&self,note_id: NoteId,) -> Result { + self.store.get_input_note(note_id).await.map_err(|err| err.into()) } // INPUT NOTE CREATION // -------------------------------------------------------------------------------------------- /// Imports a new input note into the client's store. - pub async fn import_input_note( - &mut self, - note: InputNoteRecord, - ) -> Result<(), StoreError> { - self.store.insert_input_note(¬e).await + pub async fn import_input_note(&mut self, note: InputNoteRecord) -> Result<(), ClientError> { + self.store.insert_input_note(¬e).await.map_err(|err| err.into()) } } \ No newline at end of file diff --git a/wasm/src/native_code/store/data_store.rs b/wasm/src/native_code/store/data_store.rs index 456c5147f..f188940d7 100644 --- a/wasm/src/native_code/store/data_store.rs +++ b/wasm/src/native_code/store/data_store.rs @@ -1,191 +1,188 @@ -// use miden_objects::{ -// accounts::AccountId, -// assembly::ModuleAst, -// crypto::merkle::{InOrderIndex, MerklePath, PartialMmr}, -// notes::NoteId, -// transaction::{ChainMmr, InputNote, InputNotes}, -// utils::collections::BTreeSet, -// BlockHeader, -// }; -// use miden_tx::{DataStore, DataStoreError, TransactionInputs}; - -// use super::{ChainMmrNodeFilter, NoteFilter, Store}; -// use crate::errors::{ClientError, StoreError}; - -// // DATA STORE -// // ================================================================================================ - -// pub struct ClientDataStore { -// /// Local database containing information about the accounts managed by this client. -// pub(crate) store: S, -// } - -// impl ClientDataStore { -// pub fn new(store: S) -> Self { -// Self { store } -// } -// } - -// impl DataStore for ClientDataStore { -// fn get_transaction_inputs( -// &self, -// account_id: AccountId, -// block_num: u32, -// notes: &[NoteId], -// ) -> Result { -// // First validate that no note has already been consumed -// let unspent_notes = self -// .store -// .get_input_notes(NoteFilter::Committed)? -// .iter() -// .map(|note_record| note_record.note_id()) -// .collect::>(); - -// for note_id in notes { -// if !unspent_notes.contains(note_id) { -// return Err(DataStoreError::NoteAlreadyConsumed(*note_id)); -// } -// } - -// // Construct Account -// let (account, seed) = self.store.get_account(account_id)?; - -// // Get header data -// let (block_header, _had_notes) = self.store.get_block_header_by_num(block_num)?; - -// let mut list_of_notes = vec![]; - -// let mut notes_blocks: Vec = vec![]; -// for note_id in notes { -// let input_note_record = self.store.get_input_note(*note_id)?; - -// let input_note: InputNote = input_note_record -// .try_into() -// .map_err(|err: ClientError| DataStoreError::InternalError(err.to_string()))?; - -// list_of_notes.push(input_note.clone()); - -// let note_block_num = input_note.proof().origin().block_num; - -// if note_block_num != block_num { -// notes_blocks.push(note_block_num); -// } -// } - -// let notes_blocks: Vec = self -// .store -// .get_block_headers(¬es_blocks)? -// .iter() -// .map(|(header, _has_notes)| *header) -// .collect(); - -// let partial_mmr = build_partial_mmr_with_paths(&self.store, block_num, ¬es_blocks)?; -// let chain_mmr = ChainMmr::new(partial_mmr, notes_blocks) -// .map_err(|err| DataStoreError::InternalError(err.to_string()))?; - -// let input_notes = -// InputNotes::new(list_of_notes).map_err(DataStoreError::InvalidTransactionInput)?; - -// TransactionInputs::new(account, seed, block_header, chain_mmr, input_notes) -// .map_err(DataStoreError::InvalidTransactionInput) -// } - -// fn get_account_code( -// &self, -// account_id: AccountId, -// ) -> Result { -// let (account, _seed) = self.store.get_account(account_id)?; -// let module_ast = account.code().module().clone(); - -// Ok(module_ast) -// } -// } - -// /// Builds a [PartialMmr] with a specified forest number and a list of blocks that should be -// /// authenticated. -// /// -// /// `authenticated_blocks` cannot contain `forest`. For authenticating the last block we have, -// /// the kernel extends the MMR which is why it's not needed here. -// fn build_partial_mmr_with_paths( -// store: &S, -// forest: u32, -// authenticated_blocks: &[BlockHeader], -// ) -> Result { -// let mut partial_mmr: PartialMmr = { -// let current_peaks = store.get_chain_mmr_peaks_by_block_num(forest)?; - -// PartialMmr::from_peaks(current_peaks) -// }; - -// let block_nums: Vec = authenticated_blocks.iter().map(|b| b.block_num()).collect(); - -// let authentication_paths = -// get_authentication_path_for_blocks(store, &block_nums, partial_mmr.forest())?; - -// for (header, path) in authenticated_blocks.iter().zip(authentication_paths.iter()) { -// partial_mmr -// .track(header.block_num() as usize, header.hash(), path) -// .map_err(|err| DataStoreError::InternalError(err.to_string()))?; -// } - -// Ok(partial_mmr) -// } - -// /// Retrieves all Chain MMR nodes required for authenticating the set of blocks, and then -// /// constructs the path for each of them. -// /// -// /// This method assumes `block_nums` cannot contain `forest`. -// pub fn get_authentication_path_for_blocks( -// store: &S, -// block_nums: &[u32], -// forest: usize, -// ) -> Result, StoreError> { -// let mut node_indices = BTreeSet::new(); - -// // Calculate all needed nodes indices for generating the paths -// for block_num in block_nums { -// let path_depth = mmr_merkle_path_len(*block_num as usize, forest); - -// let mut idx = InOrderIndex::from_leaf_pos(*block_num as usize); - -// for _ in 0..path_depth { -// node_indices.insert(idx.sibling()); -// idx = idx.parent(); -// } -// } - -// // Get all Mmr nodes based on collected indices -// let node_indices: Vec = node_indices.into_iter().collect(); - -// let filter = ChainMmrNodeFilter::List(&node_indices); -// let mmr_nodes = store.get_chain_mmr_nodes(filter)?; - -// // Construct authentication paths -// let mut authentication_paths = vec![]; -// for block_num in block_nums { -// let mut merkle_nodes = vec![]; -// let mut idx = InOrderIndex::from_leaf_pos(*block_num as usize); - -// while let Some(node) = mmr_nodes.get(&idx.sibling()) { -// merkle_nodes.push(*node); -// idx = idx.parent(); -// } -// let path = MerklePath::new(merkle_nodes); -// authentication_paths.push(path); -// } - -// Ok(authentication_paths) -// } - -// /// Calculates the merkle path length for an MMR of a specific forest and a leaf index -// /// `leaf_index` is a 0-indexed leaf number and `forest` is the total amount of leaves -// /// in the MMR at this point. -// fn mmr_merkle_path_len( -// leaf_index: usize, -// forest: usize, -// ) -> usize { -// let before = forest & leaf_index; -// let after = forest ^ before; - -// after.ilog2() as usize -// } \ No newline at end of file +use alloc::collections::BTreeSet; +use async_trait::async_trait; + +use miden_objects::{ + accounts::AccountId, + assembly::ModuleAst, + crypto::merkle::{InOrderIndex, MerklePath, PartialMmr}, + notes::NoteId, + transaction::{ChainMmr, InputNote, InputNotes}, + BlockHeader, +}; +use miden_tx::{DataStore, DataStoreError, TransactionInputs}; + +use super::{ChainMmrNodeFilter, NoteFilter, Store}; +use crate::native_code::errors::{ClientError, StoreError}; + +// DATA STORE +// ================================================================================================ + +pub struct ClientDataStore { + /// Local database containing information about the accounts managed by this client. + pub(crate) store: S, +} + +impl ClientDataStore { + pub fn new(store: S) -> Self { + Self { store } + } +} + +#[async_trait(?Send)] +impl DataStore for ClientDataStore { + async fn get_transaction_inputs( + &self, + account_id: AccountId, + block_num: u32, + notes: &[NoteId], + ) -> Result { + // First validate that no note has already been consumed + let unspent_notes = self + .store + .get_input_notes(NoteFilter::Committed).await? + .iter() + .map(|note_record| note_record.id()) + .collect::>(); + + for note_id in notes { + if !unspent_notes.contains(note_id) { + return Err(DataStoreError::NoteAlreadyConsumed(*note_id)); + } + } + + // Construct Account + let (account, seed) = self.store.get_account(account_id).await?; + + // Get header data + let (block_header, _had_notes) = self.store.get_block_header_by_num(block_num).await?; + + let mut list_of_notes = vec![]; + + let mut notes_blocks: Vec = vec![]; + for note_id in notes { + let input_note_record = self.store.get_input_note(*note_id).await?; + + let input_note: InputNote = input_note_record + .try_into() + .map_err(|err: ClientError| DataStoreError::InternalError(err.to_string()))?; + + list_of_notes.push(input_note.clone()); + + let note_block_num = input_note.proof().origin().block_num; + + if note_block_num != block_num { + notes_blocks.push(note_block_num); + } + } + + let notes_blocks: Vec = self + .store + .get_block_headers(¬es_blocks).await? + .iter() + .map(|(header, _has_notes)| *header) + .collect(); + + let partial_mmr = build_partial_mmr_with_paths(&self.store, block_num, ¬es_blocks).await?; + let chain_mmr = ChainMmr::new(partial_mmr, notes_blocks) + .map_err(|err| DataStoreError::InternalError(err.to_string()))?; + + let input_notes = + InputNotes::new(list_of_notes).map_err(DataStoreError::InvalidTransactionInput)?; + + TransactionInputs::new(account, seed, block_header, chain_mmr, input_notes) + .map_err(DataStoreError::InvalidTransactionInput) + } + + async fn get_account_code(&self, account_id: AccountId) -> Result { + let (account, _seed) = self.store.get_account(account_id).await?; + let module_ast = account.code().module().clone(); + + Ok(module_ast) + } +} + +/// Builds a [PartialMmr] with a specified forest number and a list of blocks that should be +/// authenticated. +/// +/// `authenticated_blocks` cannot contain `forest`. For authenticating the last block we have, +/// the kernel extends the MMR which is why it's not needed here. +async fn build_partial_mmr_with_paths( + store: &S, + forest: u32, + authenticated_blocks: &[BlockHeader], +) -> Result { + let mut partial_mmr: PartialMmr = { + let current_peaks = store.get_chain_mmr_peaks_by_block_num(forest).await?; + + PartialMmr::from_peaks(current_peaks) + }; + + let block_nums: Vec = authenticated_blocks.iter().map(|b| b.block_num()).collect(); + + let authentication_paths = + get_authentication_path_for_blocks(store, &block_nums, partial_mmr.forest()).await.unwrap(); + + for (header, path) in authenticated_blocks.iter().zip(authentication_paths.iter()) { + partial_mmr + .track(header.block_num() as usize, header.hash(), path) + .map_err(|err| DataStoreError::InternalError(err.to_string()))?; + } + + Ok(partial_mmr) +} + +/// Retrieves all Chain MMR nodes required for authenticating the set of blocks, and then +/// constructs the path for each of them. +/// +/// This method assumes `block_nums` cannot contain `forest`. +pub async fn get_authentication_path_for_blocks( + store: &S, + block_nums: &[u32], + forest: usize, +) -> Result, StoreError> { + let mut node_indices = BTreeSet::new(); + + // Calculate all needed nodes indices for generating the paths + for block_num in block_nums { + let path_depth = mmr_merkle_path_len(*block_num as usize, forest); + + let mut idx = InOrderIndex::from_leaf_pos(*block_num as usize); + + for _ in 0..path_depth { + node_indices.insert(idx.sibling()); + idx = idx.parent(); + } + } + + // Get all Mmr nodes based on collected indices + let node_indices: Vec = node_indices.into_iter().collect(); + + let filter = ChainMmrNodeFilter::List(&node_indices); + let mmr_nodes = store.get_chain_mmr_nodes(filter).await.unwrap(); + + // Construct authentication paths + let mut authentication_paths = vec![]; + for block_num in block_nums { + let mut merkle_nodes = vec![]; + let mut idx = InOrderIndex::from_leaf_pos(*block_num as usize); + + while let Some(node) = mmr_nodes.get(&idx.sibling()) { + merkle_nodes.push(*node); + idx = idx.parent(); + } + let path = MerklePath::new(merkle_nodes); + authentication_paths.push(path); + } + + Ok(authentication_paths) +} + +/// Calculates the merkle path length for an MMR of a specific forest and a leaf index +/// `leaf_index` is a 0-indexed leaf number and `forest` is the total amount of leaves +/// in the MMR at this point. +fn mmr_merkle_path_len(leaf_index: usize, forest: usize) -> usize { + let before = forest & leaf_index; + let after = forest ^ before; + + after.ilog2() as usize +} diff --git a/wasm/src/native_code/store/mod.rs b/wasm/src/native_code/store/mod.rs index 69241cb73..330124c8f 100644 --- a/wasm/src/native_code/store/mod.rs +++ b/wasm/src/native_code/store/mod.rs @@ -1,21 +1,37 @@ +use async_trait::async_trait; +use std::collections::BTreeMap; + use miden_objects::{ - accounts::{Account, AccountId, AccountStub}, crypto::dsa::rpo_falcon512::SecretKey, notes::{NoteId, Nullifier}, Digest, Felt, Word + accounts::{Account, AccountId, AccountStub}, + crypto::{ + dsa::rpo_falcon512::SecretKey, + merkle::{InOrderIndex, MmrPeaks} + }, + notes::{NoteId, Nullifier}, + transaction::TransactionId, + BlockHeader, Digest, Felt, Word }; use miden_tx::utils::{ByteReader, ByteWriter, Deserializable, DeserializationError, Serializable}; -use async_trait::async_trait; - use self::note_record::{InputNoteRecord, OutputNoteRecord}; +use super::{ + errors::StoreError, + sync::SyncedNewNotes, + transactions::{TransactionRecord, TransactionResult} +}; -use super::errors::StoreError; - +pub mod data_store; pub mod note_record; -// Hoping that eventually, we can use the generic store type defined in client/store/mod.rs. -// Might need to add conditional rendering to add async_trait to the trait definitions? -// Or maybe we can just add it to the trait definitions and it will work for both the CLI and the browser? -// Basically, can we keep the generic Client definition and the Store trait definitions the same -// and add what we need for the browser-specific implementation +// STORE TRAIT +// ================================================================================================ + +/// The [Store] trait exposes all methods that the client store needs in order to track the current +/// state. +/// +/// All update functions are implied to be atomic. That is, if multiple entities are meant to be +/// updated as part of any single function and an error is returned during its execution, any +/// changes that might have happened up to that point need to be rolled back and discarded. #[async_trait(?Send)] pub trait Store { // TEST @@ -26,153 +42,199 @@ pub trait Store { data: String ) -> Result<(), ()>; - // CHAIN DATA + // TRANSACTIONS // -------------------------------------------------------------------------------------------- - // async fn get_block_headers( - // &self, - // block_numbers: &[u32], - // ) -> Result, ()>; - - // // TODO - // fn get_block_header_by_num( - // &self, - // block_number: u32, - // ) -> Result<(BlockHeader, bool), StoreError> { - // self.get_block_headers(&[block_number]) - // .map(|block_headers_list| block_headers_list.first().cloned()) - // .and_then(|block_header| { - // block_header.ok_or(StoreError::BlockHeaderNotFound(block_number)) - // }) - // } - - // async fn get_tracked_block_headers( - // &self - // ) -> Result, ()>; - - // async fn get_chain_mmr_nodes( - // &self, - // filter: ChainMmrNodeFilter, - // ) -> Result, ()>; - - // async fn get_chain_mmr_peaks_by_block_num( - // &self, - // block_num: u32 - // ) -> Result; - - // async fn insert_block_header( - // &self, - // block_header: BlockHeader, - // chain_mmr_peaks: MmrPeaks, - // has_client_notes: bool, - // ) -> Result<(), ()>; + /// Retrieves stored transactions, filtered by [TransactionFilter]. + async fn get_transactions( + &self, + filter: TransactionFilter, + ) -> Result, StoreError>; + + /// Applies a transaction, atomically updating the current state based on the + /// [TransactionResult] + /// + /// An update involves: + /// - Applying the resulting [AccountDelta](miden_objects::accounts::AccountDelta) and storing the new [Account] state + /// - Storing new notes as a result of the transaction execution + /// - Inserting the transaction into the store to track + async fn apply_transaction(&mut self, tx_result: TransactionResult) -> Result<(), StoreError>; - // SYNC + // NOTES // -------------------------------------------------------------------------------------------- - // async fn get_note_tags( - // &self - // ) -> Result, ()>; - - // async fn add_note_tag( - // &mut self, - // tag: u64, - // ) -> Result; - - // async fn get_sync_height( - // &self - // ) -> Result; - - // async fn apply_state_sync( - // &mut self, - // block_header: BlockHeader, - // nullifiers: Vec, - // committed_notes: Vec<(NoteId, NoteInclusionProof)>, - // committed_transactions: &[TransactionId], - // new_mmr_peaks: MmrPeaks, - // new_authentication_nodes: &[(InOrderIndex, Digest)], - // ) -> Result<(), ()>; + /// Retrieves the input notes from the store + async fn get_input_notes(&self, filter: NoteFilter) -> Result, StoreError>; - // TRANSACTIONS - // -------------------------------------------------------------------------------------------- + /// Retrieves the output notes from the store + async fn get_output_notes(&self, filter: NoteFilter) -> Result, StoreError>; - // async fn get_transactions( - // &mut self, - // filter: NativeTransactionFilter, - // ) -> Result, ()>; + /// Retrieves an [InputNoteRecord] for the input note corresponding to the specified ID from + /// the store. + /// + /// # Errors + /// + /// Returns a [StoreError::InputNoteNotFound] if there is no Note with the provided ID + async fn get_input_note(&self, note_id: NoteId) -> Result; - // async fn apply_transaction( - // &mut self, - // tx_result: TransactionResult, - // ) -> Result<(), ()>; + /// Returns the nullifiers of all unspent input notes + /// + /// The default implementation of this method uses [Store::get_input_notes]. + async fn get_unspent_input_note_nullifiers( + &self + ) -> Result, StoreError> { + let nullifiers = self + .get_input_notes(NoteFilter::Committed).await? + .iter() + .map(|input_note| Ok(Nullifier::from(Digest::try_from(input_note.nullifier())?))) + .collect::, _>>(); - // ACCOUNTS - // -------------------------------------------------------------------------------------------- + nullifiers + } - async fn get_account_ids( - &mut self - ) -> Result, ()>; + /// Inserts the provided input note into the database + async fn insert_input_note(&mut self, note: &InputNoteRecord) -> Result<(), StoreError>; - async fn get_account_stubs( - &mut self - ) -> Result)>, ()>; + // CHAIN DATA + // -------------------------------------------------------------------------------------------- - async fn get_account_stub( - &mut self, - account_id: AccountId, - ) -> Result<(AccountStub, Option), ()>; + /// Retrieves a vector of [BlockHeader]s filtered by the provided block numbers. + /// + /// The returned vector may not contain some or all of the requested block headers. It's up to + /// the callee to check whether all requested block headers were found. + /// + /// For each block header an additional boolean value is returned representing whether the block + /// contains notes relevant to the client. + async fn get_block_headers( + &self, + block_numbers: &[u32], + ) -> Result, StoreError>; + + /// Retrieves a [BlockHeader] corresponding to the provided block number and a boolean value + /// that represents whether the block contains notes relevant to the client. + /// + /// The default implementation of this method uses [Store::get_block_headers]. + /// + /// # Errors + /// Returns a [StoreError::BlockHeaderNotFound] if the block was not found. + async fn get_block_header_by_num( + &self, + block_number: u32, + ) -> Result<(BlockHeader, bool), StoreError> { + self.get_block_headers(&[block_number]).await + .map(|block_headers_list| block_headers_list.first().cloned()) + .and_then(|block_header| { + block_header.ok_or(StoreError::BlockHeaderNotFound(block_number)) + }) + } - async fn get_account( + /// Retrieves a list of [BlockHeader] that include relevant notes to the client. + async fn get_tracked_block_headers(&self) -> Result, StoreError>; + + /// Retrieves all MMR authentication nodes based on [ChainMmrNodeFilter]. + async fn get_chain_mmr_nodes<'a>( + &self, + filter: ChainMmrNodeFilter<'a>, + ) -> Result, StoreError>; + + /// Returns peaks information from the blockchain by a specific block number. + /// + /// If there is no chain MMR info stored for the provided block returns an empty [MmrPeaks] + async fn get_chain_mmr_peaks_by_block_num(&self, block_num: u32) -> Result; + + /// Inserts a block header into the store, alongside peaks information at the block's height. + /// + /// `has_client_notes` describes whether the block has relevant notes to the client; this means + /// the client might want to authenticate merkle paths based on this value. + async fn insert_block_header( &mut self, - account_id: AccountId, - ) -> Result<(Account, Option), ()>; + block_header: BlockHeader, + chain_mmr_peaks: MmrPeaks, + has_client_notes: bool, + ) -> Result<(), StoreError>; - async fn get_account_auth( - &mut self, - account_id: AccountId, - ) -> Result; + // ACCOUNT + // -------------------------------------------------------------------------------------------- + /// Returns the account IDs of all accounts stored in the database + async fn get_account_ids(&self) -> Result, StoreError>; + + /// Returns a list of [AccountStub] of all accounts stored in the database along with the seeds + /// used to create them. + /// + /// Said accounts' state is the state after the last performed sync. + async fn get_account_stubs(&self) -> Result)>, StoreError>; + + /// Retrieves an [AccountStub] object for the specified [AccountId] along with the seed + /// used to create it. The seed will be returned if the account is new, otherwise it + /// will be `None`. + /// + /// Said account's state is the state according to the last sync performed. + /// + /// # Errors + /// Returns a `StoreError::AccountDataNotFound` if there is no account for the provided ID + async fn get_account_stub( + &self, + account_id: AccountId, + ) -> Result<(AccountStub, Option), StoreError>; + + /// Retrieves a full [Account] object. The seed will be returned if the account is new, + /// otherwise it will be `None`. + /// + /// This function returns the [Account]'s latest state. If the account is new (that is, has + /// never executed a trasaction), the returned seed will be `Some(Word)`; otherwise the seed + /// will be `None` + /// + /// # Errors + /// + /// Returns a `StoreError::AccountDataNotFound` if there is no account for the provided ID + async fn get_account(&self, account_id: AccountId) -> Result<(Account, Option), StoreError>; + + /// Retrieves an account's [AuthInfo], utilized to authenticate the account. + /// + /// # Errors + /// + /// Returns a `StoreError::AccountDataNotFound` if there is no account for the provided ID + async fn get_account_auth(&self, account_id: AccountId) -> Result; + + /// Inserts an [Account] along with the seed used to create it and its [AuthInfo] async fn insert_account( &mut self, account: &Account, account_seed: Option, auth_info: &AuthInfo, - ) -> Result<(), ()>; + ) -> Result<(), StoreError>; - // NOTES + // SYNC // -------------------------------------------------------------------------------------------- - async fn get_input_notes( - &mut self, - filter: NoteFilter, - ) -> Result, StoreError>; + /// Returns the note tags that the client is interested in. + async fn get_note_tags(&self) -> Result, StoreError>; - async fn get_input_note( - &mut self, - note_id: NoteId, - ) -> Result; + /// Adds a note tag to the list of tags that the client is interested in. + async fn add_note_tag(&mut self, tag: u64) -> Result; - async fn insert_input_note( - &mut self, - note: &InputNoteRecord, - ) -> Result<(), StoreError>; + /// Returns the block number of the last state sync block. + async fn get_sync_height(&self) -> Result; - async fn get_output_notes( + /// Applies the state sync update to the store. An update involves: + /// + /// - Inserting the new block header to the store alongside new MMR peaks information + /// - Updating the notes, marking them as `committed` or `consumed` based on incoming + /// inclusion proofs and nullifiers + /// - Updating transactions in the store, marking as `committed` the ones provided with + /// `committed_transactions` + /// - Storing new MMR authentication nodes + async fn apply_state_sync( &mut self, - filter: NoteFilter, - ) -> Result, StoreError>; - - async fn get_unspent_input_note_nullifiers( - &mut self - ) -> Result, StoreError> { - let nullifiers = self - .get_input_notes(NoteFilter::Committed).await.unwrap() - .iter() - .map(|input_note| Ok(Nullifier::from(Digest::try_from(input_note.nullifier())?))) - .collect::, _>>(); - - nullifiers - } + block_header: BlockHeader, + nullifiers: Vec, + committed_notes: SyncedNewNotes, + committed_transactions: &[TransactionId], + new_mmr_peaks: MmrPeaks, + new_authentication_nodes: &[(InOrderIndex, Digest)], + updated_onchain_accounts: &[Account], + ) -> Result<(), StoreError>; } // DATABASE AUTH INFO @@ -234,14 +296,20 @@ impl Deserializable for AuthInfo { } } -// pub enum ChainMmrNodeFilter<'a> { -// /// Return all nodes. -// All, -// /// Filter by the specified in-order indices. -// List(&'a [InOrderIndex]), -// } +// CHAIN MMR NODE FILTER +// ================================================================================================ + +pub enum ChainMmrNodeFilter<'a> { + /// Return all nodes. + All, + /// Filter by the specified in-order indices. + List(&'a [InOrderIndex]), +} + +// TRANSACTION FILTERS +// ================================================================================================ -pub enum NativeTransactionFilter { +pub enum TransactionFilter { /// Return all transactions. All, /// Filter by transactions that have not yet been committed to the blockchain as per the last @@ -249,15 +317,18 @@ pub enum NativeTransactionFilter { Uncomitted, } +// NOTE FILTER +// ================================================================================================ + pub enum NoteFilter { - /// Return a list of all [InputNoteRecord]. + /// Return a list of all notes ([InputNoteRecord] or [OutputNoteRecord]). All, - /// Filter by consumed [InputNoteRecord]. notes that have been used as inputs in transactions. + /// Filter by consumed notes ([InputNoteRecord] or [OutputNoteRecord]). notes that have been used as inputs in transactions. Consumed, - /// Return a list of committed [InputNoteRecord]. These represent notes that the blockchain + /// Return a list of committed notes ([InputNoteRecord] or [OutputNoteRecord]). These represent notes that the blockchain /// has included in a block, and for which we are storing anchor data. Committed, - /// Return a list of pending [InputNoteRecord]. These represent notes for which the store + /// Return a list of pending notes ([InputNoteRecord] or [OutputNoteRecord]). These represent notes for which the store /// does not have anchor data. Pending, -} \ No newline at end of file +} diff --git a/wasm/src/native_code/sync.rs b/wasm/src/native_code/sync.rs index 488a89375..0b09572fb 100644 --- a/wasm/src/native_code/sync.rs +++ b/wasm/src/native_code/sync.rs @@ -1,9 +1,34 @@ -use miden_objects::crypto::rand::FeltRng; +use std::collections::BTreeSet; + +use miden_objects::{ + accounts::{ + Account, + AccountId, + AccountStub + }, + crypto::{ + merkle::{ + InOrderIndex, + MmrDelta, + MmrPeaks, + PartialMmr + }, rand::FeltRng + }, + notes::{ + NoteExecutionMode, + NoteId, + NoteInclusionProof, + NoteTag + }, + transaction::{ + InputNote, + TransactionId + }, + BlockHeader, Digest +}; use super::{ - rpc::NodeRpcClient, - Client, - store::Store // TODO: Add AuthInfo + errors::{ClientError, StoreError}, rpc::{NodeRpcClient, CommittedNote, NoteDetails}, store::{ChainMmrNodeFilter, NoteFilter, Store, TransactionFilter}, transactions::TransactionRecord, Client // TODO: Add AuthInfo }; pub enum SyncStatus { @@ -11,335 +36,440 @@ pub enum SyncStatus { SyncedToBlock(u32), } +/// Contains information about new notes as consequence of a sync +pub struct SyncedNewNotes { + /// A list of public notes that have been received on sync + new_public_notes: Vec, + /// A list of note IDs alongside their inclusion proofs for locally-tracked + /// notes + new_inclusion_proofs: Vec<(NoteId, NoteInclusionProof)>, +} + +impl SyncedNewNotes { + pub fn new( + new_public_notes: Vec, + new_inclusion_proofs: Vec<(NoteId, NoteInclusionProof)>, + ) -> Self { + Self { new_public_notes, new_inclusion_proofs } + } + + pub fn new_public_notes(&self) -> &[InputNote] { + &self.new_public_notes + } + + pub fn new_inclusion_proofs(&self) -> &[(NoteId, NoteInclusionProof)] { + &self.new_inclusion_proofs + } + + /// Returns whether no new note-related information has been retrieved + pub fn is_empty(&self) -> bool { + self.new_inclusion_proofs.is_empty() && self.new_public_notes.is_empty() + } +} + +// CONSTANTS +// ================================================================================================ + +/// The number of bits to shift identifiers for in use of filters. pub const FILTER_ID_SHIFT: u8 = 48; impl Client { - // pub async fn get_sync_height( - // &self, - // ) -> Result { - // self.store.get_sync_height().await? - // } - - // pub async fn get_note_tags( - // &self - // ) -> Result, ()> { - // self.store.get_note_tags().await? - // } - - // pub async fn add_note_tag( - // &mut self, - // tag: u64, - // ) -> Result<(), ()> { - // match result { - // Ok(true) => Ok(()), - // Ok(false) => { - // warn!("Tag {} is already being tracked", tag); - // Ok(()) - // }, - // Err(_) => Ok(()) // Ignore all errors and return Ok(()) for uniformity. - // } - // } - - pub async fn sync_state( - &mut self - ) -> String { // TODO: Replace with Result - // self.ensure_genesis_in_place().await?; - // loop { - // let response = self.sync_state_once().await?; - // if let SyncStatus::SyncedToLastBlock(v) = response { - // return Ok(v); - // } - // } - - "Called sync_state".to_string() + /// Returns the block number of the last state sync block. + pub async fn get_sync_height(&self) -> Result { + self.store.get_sync_height().await.map_err(|err| err.into()) + } + + /// Returns the list of note tags tracked by the client. + pub async fn get_note_tags(&self) -> Result, ClientError> { + self.store.get_note_tags().await.map_err(|err| err.into()) } - // async fn ensure_genesis_in_place( - // &mut self - // ) -> Result<(), ()> { - // let genesis = self.store.get_block_header_by_num(0).await?; - - // if genesis_result.is_ok() { - // // If the genesis block is found, return Ok. - // Ok(()) - // } else { - // // If there's any error (including genesis block not found), try to retrieve and store genesis. - // // Any error during retrieval or storage is ignored, returning Err(()). - // self.retrieve_and_store_genesis().await.map_err(|_| ()) - // } - // } - - // async fn retrieve_and_store_genesis( - // &mut self - // ) -> Result<(), ()> { - // let genesis_block = self.rpc_api.get_block_header_by_number(Some(0)).await?; - - // let blank_mmr_peaks = - // MmrPeaks::new(0, vec![]).expect("Blank MmrPeaks should not fail to instantiate"); - // // NOTE: If genesis block data ever includes notes in the future, the third parameter in - // // this `insert_block_header` call may be `true` - // self.store.insert_block_header(genesis_block, blank_mmr_peaks, false).await?; - // Ok(()) - // } - - // async fn sync_state_once( - // &mut self - // ) -> Result { - // let current_block_num = self.store.get_sync_height().await?; - - // let accounts: Vec = self - // .store - // .get_account_stubs().await? - // .into_iter() - // .map(|(acc_stub, _)| acc_stub) - // .collect(); - - // let note_tags: Vec = accounts - // .iter() - // .map(|acc| ((u64::from(acc.id()) >> FILTER_ID_SHIFT) as u16)) - // .collect(); - - // // To receive information about added nullifiers, we reduce them to the higher 16 bits - // // Note that besides filtering by nullifier prefixes, the node also filters by block number - // // (it only returns nullifiers from current_block_num until response.block_header.block_num()) - // let nullifiers_tags: Vec = self - // .store - // .get_unspent_input_note_nullifiers().await? - // .iter() - // .map(|nullifier| (nullifier.inner()[3].as_int() >> FILTER_ID_SHIFT) as u16) - // .collect(); - - // // Send request - // let account_ids: Vec = accounts.iter().map(|acc| acc.id()).collect(); - // let response = self - // .rpc_api - // .sync_state(current_block_num, &account_ids, ¬e_tags, &nullifiers_tags) - // .await?; - - // // We don't need to continue if the chain has not advanced - // if response.block_header.block_num() == current_block_num { - // return Ok(SyncStatus::SyncedToLastBlock(current_block_num)); - // } - - // let committed_notes = - // self.build_inclusion_proofs(response.note_inclusions, &response.block_header).await?; - - // // Check if the returned account hashes match latest account hashes in the database - // check_account_hashes(&response.account_hash_updates, &accounts)?; - - // // Derive new nullifiers data - // let new_nullifiers = self.get_new_nullifiers(response.nullifiers).await?; - - // // Build PartialMmr with current data and apply updates - // let (new_peaks, new_authentication_nodes) = { - // let current_partial_mmr = self.build_current_partial_mmr().await?; - - // let (current_block, has_relevant_notes) = - // self.store.get_block_header_by_num(current_block_num).await?; - - // apply_mmr_changes( - // current_partial_mmr, - // response.mmr_delta, - // current_block, - // has_relevant_notes, - // )? - // }; - - // let note_ids: Vec = committed_notes.iter().map(|(id, _)| (*id)).collect(); - - // let uncommitted_transactions = - // self.store.get_transactions(TransactionFilter::Uncomitted).await?; - - // let transactions_to_commit = get_transactions_to_commit( - // &uncommitted_transactions, - // ¬e_ids, - // &new_nullifiers, - // &response.account_hash_updates, - // ); - - // // Apply received and computed updates to the store - // self.store - // .apply_state_sync( - // response.block_header, - // new_nullifiers, - // committed_notes, - // &transactions_to_commit, - // new_peaks, - // &new_authentication_nodes, - // ).await?; - - // if response.chain_tip == response.block_header.block_num() { - // Ok(SyncStatus::SyncedToLastBlock(response.chain_tip)) - // } else { - // Ok(SyncStatus::SyncedToBlock(response.block_header.block_num())) - // } - // } + /// Adds a note tag for the client to track. + pub async fn add_note_tag(&mut self, tag: u64) -> Result<(), ClientError> { + match self.store.add_note_tag(tag).await.map_err(|err| err.into()) { + Ok(true) => Ok(()), + Ok(false) => { + Ok(()) + }, + Err(err) => Err(err), + } + } + + /// Syncs the client's state with the current state of the Miden network. + /// Before doing so, it ensures the genesis block exists in the local store. + /// + /// Returns the block number the client has been synced to. + pub async fn sync_state(&mut self) -> Result { + self.ensure_genesis_in_place().await?; + loop { + let response = self.sync_state_once().await?; + if let SyncStatus::SyncedToLastBlock(v) = response { + return Ok(v); + } + } + } + + /// Attempts to retrieve the genesis block from the store. If not found, + /// it requests it from the node and store it. + async fn ensure_genesis_in_place(&mut self) -> Result<(), ClientError> { + let genesis = self.store.get_block_header_by_num(0).await; + + match genesis { + Ok(_) => Ok(()), + Err(StoreError::BlockHeaderNotFound(0)) => self.retrieve_and_store_genesis().await, + Err(err) => Err(ClientError::StoreError(err)), + } + } + + async fn retrieve_and_store_genesis(&mut self) -> Result<(), ClientError> { + let genesis_block = self.rpc_api.get_block_header_by_number(Some(0)).await?; + + let blank_mmr_peaks = + MmrPeaks::new(0, vec![]).expect("Blank MmrPeaks should not fail to instantiate"); + // NOTE: If genesis block data ever includes notes in the future, the third parameter in + // this `insert_block_header` call may be `true` + self.store.insert_block_header(genesis_block, blank_mmr_peaks, false).await?; + Ok(()) + } + + async fn sync_state_once(&mut self) -> Result { + let current_block_num = self.store.get_sync_height().await?; + + let accounts: Vec = self + .store + .get_account_stubs().await.unwrap() + .into_iter() + .map(|(acc_stub, _)| acc_stub) + .collect(); + + let note_tags: Vec = accounts + .iter() + .map(|acc| NoteTag::from_account_id(acc.id(), NoteExecutionMode::Local)) + .collect::, _>>()?; + + // To receive information about added nullifiers, we reduce them to the higher 16 bits + // Note that besides filtering by nullifier prefixes, the node also filters by block number + // (it only returns nullifiers from current_block_num until response.block_header.block_num()) + let nullifiers_tags: Vec = self + .store + .get_unspent_input_note_nullifiers().await? + .iter() + .map(|nullifier| (nullifier.inner()[3].as_int() >> FILTER_ID_SHIFT) as u16) + .collect(); + + // Send request + let account_ids: Vec = accounts.iter().map(|acc| acc.id()).collect(); + let response = self + .rpc_api + .sync_state(current_block_num, &account_ids, ¬e_tags, &nullifiers_tags) + .await?; + + // We don't need to continue if the chain has not advanced + if response.block_header.block_num() == current_block_num { + return Ok(SyncStatus::SyncedToLastBlock(current_block_num)); + } + + let new_note_details = + self.get_note_details(response.note_inclusions, &response.block_header).await?; + + let (onchain_accounts, offchain_accounts): (Vec<_>, Vec<_>) = + accounts.into_iter().partition(|account_stub| account_stub.id().is_on_chain()); + + let updated_onchain_accounts = self + .get_updated_onchain_accounts(&response.account_hash_updates, &onchain_accounts) + .await?; + self.validate_local_account_hashes(&response.account_hash_updates, &offchain_accounts)?; + + // Derive new nullifiers data + let new_nullifiers = self.get_new_nullifiers(response.nullifiers).await?; + + // Build PartialMmr with current data and apply updates + let (new_peaks, new_authentication_nodes) = { + let current_partial_mmr = self.build_current_partial_mmr().await?; + + let (current_block, has_relevant_notes) = + self.store.get_block_header_by_num(current_block_num).await?; + + apply_mmr_changes( + current_partial_mmr, + response.mmr_delta, + current_block, + has_relevant_notes, + )? + }; + + let note_ids: Vec = + new_note_details.new_inclusion_proofs.iter().map(|(id, _)| (*id)).collect(); + + let uncommitted_transactions = + self.store.get_transactions(TransactionFilter::Uncomitted).await?; + + let transactions_to_commit = get_transactions_to_commit( + &uncommitted_transactions, + ¬e_ids, + &new_nullifiers, + &response.account_hash_updates, + ); + + // Apply received and computed updates to the store + self.store + .apply_state_sync( + response.block_header, + new_nullifiers, + new_note_details, + &transactions_to_commit, + new_peaks, + &new_authentication_nodes, + &updated_onchain_accounts, + ).await + .map_err(ClientError::StoreError)?; + + if response.chain_tip == response.block_header.block_num() { + Ok(SyncStatus::SyncedToLastBlock(response.chain_tip)) + } else { + Ok(SyncStatus::SyncedToBlock(response.block_header.block_num())) + } + } // HELPERS // -------------------------------------------------------------------------------------------- - // async fn build_inclusion_proofs( - // &self, - // committed_notes: Vec, - // block_header: &BlockHeader, - // ) -> Result, ()> { - // // We'll only pick committed notes that we are tracking as input/output notes. Since the - // // sync response contains notes matching either the provided accounts or the provided tag - // // we might get many notes when we only care about a few of those. - // let pending_input_notes: Vec = self - // .store - // .get_input_notes(NoteFilter::Pending).await? - // .iter() - // .map(|n| n.note().id()) - // .collect(); - - // let pending_output_notes: Vec = self - // .store - // .get_output_notes(NoteFilter::Pending).await? - // .iter() - // .map(|n| n.note().id()) - // .collect(); - - // let mut pending_notes = [pending_input_notes, pending_output_notes].concat(); - // pending_notes.dedup(); - - // committed_notes - // .iter() - // .filter_map(|commited_note| { - // if pending_notes.contains(commited_note.note_id()) { - // // FIXME: This removal is to accomodate a problem with how the node constructs paths where - // // they are constructed using note ID instead of authentication hash, so for now we remove the first - // // node here. - // // - // // See: https://github.com/0xPolygonMiden/miden-node/blob/main/store/src/state.rs#L274 - // let mut merkle_path = commited_note.merkle_path().clone(); - // if merkle_path.len() > 0 { - // let _ = merkle_path.remove(0); - // } - - // let note_inclusion_proof = NoteInclusionProof::new( - // block_header.block_num(), - // block_header.sub_hash(), - // block_header.note_root(), - // commited_note.note_index().into(), - // merkle_path, - // ) - // .map_err(|err| ()) - // .map(|proof| (*commited_note.note_id(), proof)); - - // Some(note_inclusion_proof) - // } else { - // None - // } - // }) - // .collect() - // } - - // pub(crate) async fn build_current_partial_mmr( - // &self - // ) -> Result { - // let current_block_num = self.store.get_sync_height().await?; - - // let tracked_nodes = self.store.get_chain_mmr_nodes(ChainMmrNodeFilter::All).await?; - // let current_peaks = self.store.get_chain_mmr_peaks_by_block_num(current_block_num).await?; - - // let track_latest = if current_block_num != 0 { - // // Attempt to fetch the block header. - // let result = self.store.get_block_header_by_num(current_block_num - 1).await - // .map(|(_, previous_block_had_notes)| previous_block_had_notes) // Directly extract the boolean if successful. - // .unwrap_or(false); // Return false on any error, effectively ignoring the error. - - // result // Use the result as the value for track_latest. - // } else { - // false - // }; - - // Ok(PartialMmr::from_parts(current_peaks, tracked_nodes, track_latest)) - // } - - // async fn get_new_nullifiers( - // &self, - // new_nullifiers: Vec, - // ) -> Result, ()> { - // let nullifiers = self - // .store - // .get_unspent_input_note_nullifiers().await? - // .iter() - // .map(|nullifier| nullifier.inner()) - // .collect::>(); - - // let new_nullifiers = new_nullifiers - // .into_iter() - // .filter(|nullifier| nullifiers.contains(nullifier)) - // .collect(); - - // Ok(new_nullifiers) - // } + /// Extracts information about notes that the client is interested in, creating the note inclusion + /// proof in order to correctly update store data + async fn get_note_details( + &mut self, + committed_notes: Vec, + block_header: &BlockHeader, + ) -> Result { + // We'll only pick committed notes that we are tracking as input/output notes. Since the + // sync response contains notes matching either the provided accounts or the provided tag + // we might get many notes when we only care about a few of those. + + let mut new_public_notes = vec![]; + let mut local_notes_proofs = vec![]; + + let pending_input_notes = + self.store.get_input_notes(NoteFilter::Pending).await?.into_iter().map(|n| n.id()); + + let pending_output_notes = + self.store.get_output_notes(NoteFilter::Pending).await?.into_iter().map(|n| n.id()); + + let mut all_pending_notes: BTreeSet = BTreeSet::new(); + + pending_input_notes.chain(pending_output_notes).for_each(|id| { + all_pending_notes.insert(id); + }); + + for committed_note in committed_notes { + if all_pending_notes.contains(committed_note.note_id()) { + // The note belongs to our locally tracked set of pending notes, build the inclusion proof + let note_with_inclusion_proof = NoteInclusionProof::new( + block_header.block_num(), + block_header.sub_hash(), + block_header.note_root(), + committed_note.note_index().into(), + committed_note.merkle_path().clone(), + ) + .map_err(ClientError::NoteError) + .map(|proof| (*committed_note.note_id(), proof))?; + + local_notes_proofs.push(note_with_inclusion_proof); + } else { + // The note is public and we are not tracking it, push to the list of IDs to query + new_public_notes.push(*committed_note.note_id()); + } + } + + // Query the node for input note data and build the entities + let new_public_notes = + self.fetch_public_note_details(&new_public_notes, block_header).await?; + + Ok(SyncedNewNotes::new(new_public_notes, local_notes_proofs)) + } + + /// Queries the node for all received notes that are not being locally tracked in the client + /// + /// The client can receive metadata for private notes that it's not tracking. In this case, + /// notes are ignored for now as they become useless until details are imported. + async fn fetch_public_note_details( + &mut self, + query_notes: &[NoteId], + block_header: &BlockHeader, + ) -> Result, ClientError> { + if query_notes.is_empty() { + return Ok(vec![]); + } + let notes_data = self.rpc_api.get_notes_by_id(query_notes).await?; + let mut return_notes = Vec::with_capacity(query_notes.len()); + for note_data in notes_data { + match note_data { + NoteDetails::OffChain(id, ..) => { + // TODO: Is there any benefit to not ignoring these? In any case we do not have + // the recipient which is mandatory right now. + }, + NoteDetails::Public(note, inclusion_proof) => { + let note_inclusion_proof = NoteInclusionProof::new( + block_header.block_num(), + block_header.sub_hash(), + block_header.note_root(), + inclusion_proof.note_index as u64, + inclusion_proof.merkle_path, + ) + .map_err(ClientError::NoteError)?; + + return_notes.push(InputNote::new(note, note_inclusion_proof)) + }, + } + } + Ok(return_notes) + } + + /// Builds the current view of the chain's [PartialMmr]. Because we want to add all new + /// authentication nodes that could come from applying the MMR updates, we need to track all + /// known leaves thus far. + /// + /// As part of the syncing process, we add the current block number so we don't need to + /// track it here. + pub(crate) async fn build_current_partial_mmr(&self) -> Result { + let current_block_num = self.store.get_sync_height().await?; + + let tracked_nodes = self.store.get_chain_mmr_nodes(ChainMmrNodeFilter::All).await?; + let current_peaks = self.store.get_chain_mmr_peaks_by_block_num(current_block_num).await?; + + let track_latest = if current_block_num != 0 { + match self.store.get_block_header_by_num(current_block_num - 1).await { + Ok((_, previous_block_had_notes)) => Ok(previous_block_had_notes), + Err(StoreError::BlockHeaderNotFound(_)) => Ok(false), + Err(err) => Err(ClientError::StoreError(err)), + }? + } else { + false + }; + + Ok(PartialMmr::from_parts(current_peaks, tracked_nodes, track_latest)) + } + + /// Extracts information about nullifiers for unspent input notes that the client is tracking + /// from the received [SyncStateResponse] + async fn get_new_nullifiers(&self, new_nullifiers: Vec) -> Result, ClientError> { + // Get current unspent nullifiers + let nullifiers = self + .store + .get_unspent_input_note_nullifiers().await? + .iter() + .map(|nullifier| nullifier.inner()) + .collect::>(); + + let new_nullifiers = new_nullifiers + .into_iter() + .filter(|nullifier| nullifiers.contains(nullifier)) + .collect(); + + Ok(new_nullifiers) + } + + async fn get_updated_onchain_accounts( + &mut self, + account_updates: &[(AccountId, Digest)], + current_onchain_accounts: &[AccountStub], + ) -> Result, ClientError> { + let mut accounts_to_update: Vec = Vec::new(); + for (remote_account_id, remote_account_hash) in account_updates { + // check if this updated account is tracked by the client + let current_account = current_onchain_accounts + .iter() + .find(|acc| *remote_account_id == acc.id() && *remote_account_hash != acc.hash()); + + if let Some(tracked_account) = current_account { + let account = self.rpc_api.get_account_update(tracked_account.id()).await?; + accounts_to_update.push(account); + } + } + Ok(accounts_to_update) + } + + /// Validates account hash updates and returns an error if there is a mismatch. + fn validate_local_account_hashes( + &mut self, + account_updates: &[(AccountId, Digest)], + current_offchain_accounts: &[AccountStub], + ) -> Result<(), ClientError> { + for (remote_account_id, remote_account_hash) in account_updates { + // ensure that if we track that account, it has the same hash + let mismatched_accounts = current_offchain_accounts + .iter() + .find(|acc| *remote_account_id == acc.id() && *remote_account_hash != acc.hash()); + + // OffChain accounts should always have the latest known state + if mismatched_accounts.is_some() { + return Err(StoreError::AccountHashMismatch(*remote_account_id).into()); + } + } + Ok(()) + } } // UTILS // -------------------------------------------------------------------------------------------- -// fn apply_mmr_changes( -// current_partial_mmr: PartialMmr, -// mmr_delta: MmrDelta, -// current_block_header: BlockHeader, -// current_block_has_relevant_notes: bool, -// ) -> Result<(MmrPeaks, Vec<(InOrderIndex, Digest)>), ()> { -// let mut partial_mmr: PartialMmr = current_partial_mmr; - -// let new_authentication_nodes = partial_mmr -// .add(current_block_header.hash(), current_block_has_relevant_notes) -// .into_iter(); - -// let new_authentication_nodes: Vec<(InOrderIndex, Digest)> = partial_mmr -// .apply(mmr_delta) -// .map_err(|err| ())? -// .into_iter() -// .chain(new_authentication_nodes) -// .collect(); - -// Ok((partial_mmr.peaks(), new_authentication_nodes)) -// } - -// fn check_account_hashes( -// account_updates: &[(AccountId, Digest)], -// current_accounts: &[AccountStub], -// ) -> Result<(), ()> { -// for (remote_account_id, remote_account_hash) in account_updates { -// { -// if let Some(local_account) = -// current_accounts.iter().find(|acc| *remote_account_id == acc.id()) -// { -// if *remote_account_hash != local_account.hash() { -// return (); -// } -// } -// } -// } -// Ok(()) -// } - -// fn get_transactions_to_commit( -// uncommitted_transactions: &[TransactionRecord], -// note_ids: &[NoteId], -// nullifiers: &[Digest], -// account_hash_updates: &[(AccountId, Digest)], -// ) -> Vec { -// uncommitted_transactions -// .iter() -// .filter(|t| { -// // TODO: based on the discussion in -// // https://github.com/0xPolygonMiden/miden-client/issues/144, we should be aware -// // that in the future it'll be possible to have many transactions modifying an -// // account be included in a single block. If that happens, we'll need to rewrite -// // this check -// t.input_note_nullifiers.iter().all(|n| nullifiers.contains(n)) -// && t.output_notes.iter().all(|n| note_ids.contains(&n.id())) -// && account_hash_updates.iter().any(|(account_id, account_hash)| { -// *account_id == t.account_id && *account_hash == t.final_account_state -// }) -// }) -// .map(|t| t.id) -// .collect() -// } \ No newline at end of file +/// Applies changes to the Mmr structure, storing authentication nodes for leaves we track +/// and returns the updated [PartialMmr] +fn apply_mmr_changes( + current_partial_mmr: PartialMmr, + mmr_delta: MmrDelta, + current_block_header: BlockHeader, + current_block_has_relevant_notes: bool, +) -> Result<(MmrPeaks, Vec<(InOrderIndex, Digest)>), StoreError> { + let mut partial_mmr: PartialMmr = current_partial_mmr; + + // First, apply curent_block to the Mmr + let new_authentication_nodes = partial_mmr + .add(current_block_header.hash(), current_block_has_relevant_notes) + .into_iter(); + + // Apply the Mmr delta to bring Mmr to forest equal to chain tip + let new_authentication_nodes: Vec<(InOrderIndex, Digest)> = partial_mmr + .apply(mmr_delta) + .map_err(StoreError::MmrError)? + .into_iter() + .chain(new_authentication_nodes) + .collect(); + + Ok((partial_mmr.peaks(), new_authentication_nodes)) +} + +/// Returns the list of transactions that should be marked as committed based on the state update info +/// +/// To set an uncommitted transaction as committed three things must hold: +/// +/// - All of the transaction's output notes are committed +/// - All of the transaction's input notes are consumed, which means we got their nullifiers as +/// part of the update +/// - The account corresponding to the transaction hash matches the transaction's +// final_account_state +fn get_transactions_to_commit( + uncommitted_transactions: &[TransactionRecord], + _note_ids: &[NoteId], + nullifiers: &[Digest], + account_hash_updates: &[(AccountId, Digest)], +) -> Vec { + uncommitted_transactions + .iter() + .filter(|t| { + // TODO: based on the discussion in + // https://github.com/0xPolygonMiden/miden-client/issues/144, we should be aware + // that in the future it'll be possible to have many transactions modifying an + // account be included in a single block. If that happens, we'll need to rewrite + // this check + + // TODO: Review this. Because we receive note IDs based on account ID tags, + // we cannot base the status change on output notes alone; + t.input_note_nullifiers.iter().all(|n| nullifiers.contains(n)) + //&& t.output_notes.iter().all(|n| note_ids.contains(&n.id())) + && account_hash_updates.iter().any(|(account_id, account_hash)| { + *account_id == t.account_id && *account_hash == t.final_account_state + }) + }) + .map(|t| t.id) + .collect() +} \ No newline at end of file diff --git a/wasm/src/native_code/transactions.rs b/wasm/src/native_code/transactions.rs deleted file mode 100644 index 40f5aec27..000000000 --- a/wasm/src/native_code/transactions.rs +++ /dev/null @@ -1,373 +0,0 @@ -use miden_objects::crypto::rand::FeltRng; - -use super::{ - rpc::NodeRpcClient, - Client, - store::{Store, NativeTransactionFilter} -}; - -// const AUTH_CONSUME_NOTES_SCRIPT: &str = -// include_str!("asm/transaction_scripts/auth_consume_notes.masm"); -// const DISTRIBUTE_FUNGIBLE_ASSET_SCRIPT: &str = -// include_str!("asm/transaction_scripts/distribute_fungible_asset.masm"); -// const AUTH_SEND_ASSET_SCRIPT: &str = include_str!("asm/transaction_scripts/auth_send_asset.masm"); - -// #[derive(Clone)] -// pub enum NativeTransactionTemplate { -// /// Consume outstanding notes for an account. -// ConsumeNotes(AccountId, Vec), -// /// Mint fungible assets using a faucet account -// MintFungibleAsset { -// asset: FungibleAsset, -// target_account_id: AccountId, -// }, -// /// Creates a pay-to-id note directed to a specific account -// PayToId(PaymentTransactionData), -// /// Creates a pay-to-id note directed to a specific account, specifying a block height after -// /// which the note can be recalled -// PayToIdWithRecall(PaymentTransactionData, u32), -// } - -// impl NativeTransactionTemplate { -// /// Returns the executor [AccountId] -// pub fn account_id(&self) -> AccountId { -// match self { -// NativeTransactionTemplate::ConsumeNotes(account_id, _) => *account_id, -// NativeTransactionTemplate::MintFungibleAsset { -// asset, -// target_account_id: _target_account_id, -// } => asset.faucet_id(), -// NativeTransactionTemplate::PayToId(p) => *p.account_id(), -// NativeTransactionTemplate::PayToIdWithRecall(p, _) => *p.account_id(), -// } -// } -// } - -// #[derive(Clone)] -// pub struct PaymentTransactionData { -// asset: Asset, -// sender_account_id: AccountId, -// target_account_id: AccountId, -// } - -// impl PaymentTransactionData { -// pub fn new( -// asset: Asset, -// sender_account_id: AccountId, -// target_account_id: AccountId, -// ) -> PaymentTransactionData { -// PaymentTransactionData { -// asset, -// sender_account_id, -// target_account_id, -// } -// } - -// /// Returns the executor [AccountId] -// pub fn account_id(&self) -> &AccountId { -// &self.sender_account_id -// } -// } - -// pub struct TransactionResult { -// executed_transaction: ExecutedTransaction, -// output_notes: Vec, -// } - -// impl TransactionResult { -// pub fn new( -// executed_transaction: ExecutedTransaction, -// created_notes: Vec, -// ) -> Self { -// Self { -// executed_transaction, -// output_notes: created_notes, -// } -// } - -// pub fn executed_transaction(&self) -> &ExecutedTransaction { -// &self.executed_transaction -// } - -// pub fn created_notes(&self) -> &Vec { -// &self.output_notes -// } - -// pub fn block_num(&self) -> u32 { -// self.executed_transaction.block_header().block_num() -// } - -// pub fn transaction_arguments(&self) -> &TransactionArgs { -// self.executed_transaction.tx_args() -// } - -// pub fn account_delta(&self) -> &AccountDelta { -// self.executed_transaction.account_delta() -// } -// } - -// pub struct TransactionRecord { -// pub id: TransactionId, -// pub account_id: AccountId, -// pub init_account_state: Digest, -// pub final_account_state: Digest, -// pub input_note_nullifiers: Vec, -// pub output_notes: OutputNotes, -// pub transaction_script: Option, -// pub block_num: u32, -// pub transaction_status: TransactionStatus, -// } - -// impl TransactionRecord { -// #[allow(clippy::too_many_arguments)] -// pub fn new( -// id: TransactionId, -// account_id: AccountId, -// init_account_state: Digest, -// final_account_state: Digest, -// input_note_nullifiers: Vec, -// output_notes: OutputNotes, -// transaction_script: Option, -// block_num: u32, -// transaction_status: TransactionStatus, -// ) -> TransactionRecord { -// TransactionRecord { -// id, -// account_id, -// init_account_state, -// final_account_state, -// input_note_nullifiers, -// output_notes, -// transaction_script, -// block_num, -// transaction_status, -// } -// } -// } - -// pub enum TransactionStatus { -// /// Transaction has been submitted but not yet committed -// Pending, -// /// Transaction has been committed and included at the specified block number -// Committed(u32), -// } - -// impl std::fmt::Display for TransactionStatus { -// fn fmt( -// &self, -// f: &mut std::fmt::Formatter<'_>, -// ) -> std::fmt::Result { -// match self { -// TransactionStatus::Pending => write!(f, "Pending"), -// TransactionStatus::Committed(block_number) => { -// write!(f, "Committed (Block: {})", block_number) -// }, -// } -// } -// } - -impl Client { - pub async fn get_transactions( - &mut self, - filter: NativeTransactionFilter, - ) -> String { // TODO: Replace with Result, ()> - //self.store.get_transactions(filter).map_err(|err| err.into()) - - "Called get_transactions".to_string() - } - - pub async fn new_transaction( - &mut self, - //transaction_template: NativeTransactionTemplate, // TODO: Add parameter back - ) -> String { // TODO: Replace with Result - // match transaction_template { - // TransactionTemplate::PayToId(PaymentTransactionData { - // asset: fungible_asset, - // sender_account_id, - // target_account_id, - // }) => self.new_p2id_transaction(fungible_asset, sender_account_id, target_account_id), - // TransactionTemplate::PayToIdWithRecall(_payment_data, _recall_height) => todo!(), - // TransactionTemplate::ConsumeNotes(account_id, list_of_notes) => { - // self.new_consume_notes_transaction(account_id, &list_of_notes) - // }, - // TransactionTemplate::MintFungibleAsset { - // asset, - // target_account_id, - // } => self.new_mint_fungible_asset_transaction(asset, target_account_id), - // } - - "Called new_transaction".to_string() - } - - // fn new_p2id_transaction( - // &mut self, - // fungible_asset: Asset, - // sender_account_id: AccountId, - // target_account_id: AccountId, - // ) -> Result { - // let random_coin = self.get_random_coin(); - - // let created_note = create_p2id_note( - // sender_account_id, - // target_account_id, - // vec![fungible_asset], - // random_coin, - // )?; - - // self.tx_executor.load_account(sender_account_id)?; - - // let block_ref = self.get_sync_height()?; - - // let recipient = created_note - // .recipient() - // .iter() - // .map(|x| x.as_int().to_string()) - // .collect::>() - // .join("."); - - // let tx_script_code = ProgramAst::parse( - // &AUTH_SEND_ASSET_SCRIPT - // .replace("{recipient}", &recipient) - // .replace("{tag}", &Felt::new(Into::::into(target_account_id)).to_string()) - // .replace("{asset}", &prepare_word(&fungible_asset.into()).to_string()), - // ) - // .expect("shipped MASM is well-formed"); - - // self.compile_and_execute_tx( - // sender_account_id, - // &[], - // vec![created_note], - // tx_script_code, - // block_ref, - // ); - // } - - // fn new_consume_notes_transaction( - // &mut self, - // account_id: AccountId, - // note_ids: &[NoteId], - // ) -> Result { - // self.tx_executor - // .load_account(account_id) - // .map_err(|err| ())?; - - // let tx_script_code = - // ProgramAst::parse(AUTH_CONSUME_NOTES_SCRIPT).expect("shipped MASM is well-formed"); - - // let block_num = self.store.get_sync_height()?; - - // // Because the notes are retrieved by the executor, there is no need to cross check here - // // that they exist in the Store - // self.compile_and_execute_tx(account_id, note_ids, vec![], tx_script_code, block_num) - // } - - // fn new_mint_fungible_asset_transaction( - // &mut self, - // asset: FungibleAsset, - // target_id: AccountId, - // ) -> Result { - // let faucet_id = asset.faucet_id(); - - // // Construct Account - // self.tx_executor.load_account(faucet_id)?; - - // let block_ref = self.get_sync_height()?; - // let random_coin = self.get_random_coin(); - - // let created_note = create_p2id_note(faucet_id, target_id, vec![asset.into()], random_coin)?; - - // let recipient = created_note - // .recipient() - // .iter() - // .map(|x| x.as_int().to_string()) - // .collect::>() - // .join("."); - - // let tx_script_code = ProgramAst::parse( - // &DISTRIBUTE_FUNGIBLE_ASSET_SCRIPT - // .replace("{recipient}", &recipient) - // .replace("{tag}", &Felt::new(Into::::into(target_id)).to_string()) - // .replace("{amount}", &Felt::new(asset.amount()).to_string()), - // ) - // .expect("shipped MASM is well-formed"); - - // self.compile_and_execute_tx(faucet_id, &[], vec![created_note], tx_script_code, block_ref) - // } - - // fn compile_and_execute_tx( - // &mut self, - // account_id: AccountId, - // input_notes: &[NoteId], - // output_notes: Vec, - // tx_script: ProgramAst, - // block_num: u32, - // ) -> Result { - // let account_auth = self.store.get_account_auth(account_id)?; - // let (pubkey_input, advice_map): (Word, Vec) = match account_auth { - // AuthInfo::RpoFalcon512(key) => ( - // key.public_key().into(), - // key.to_bytes().iter().map(|a| Felt::new(*a as u64)).collect::>(), - // ), - // }; - // let script_inputs = vec![(pubkey_input, advice_map)]; - - // let tx_script = self.tx_executor.compile_tx_script(tx_script, script_inputs, vec![])?; - - // let tx_args = TransactionArgs::with_tx_script(tx_script); - - // // Execute the transaction and get the witness - // let executed_transaction = self.tx_executor.execute_transaction( - // account_id, - // block_num, - // input_notes, - // Some(tx_args), - // )?; - - // Ok(TransactionResult::new(executed_transaction, output_notes)) - // } - - /// Proves the specified transaction witness, submits it to the node, and stores the transaction in - /// the local database for tracking. - pub async fn send_transaction( - &mut self, - //tx_result: TransactionResult, TODO: Add parameter back - ) -> String { // TODO: Replace with Result<(), ()> - // let transaction_prover = TransactionProver::new(ProvingOptions::default()); - // let proven_transaction = - // transaction_prover.prove_transaction(tx_result.executed_transaction().clone())?; - - // info!("Proved transaction, submitting to the node..."); - - // self.submit_proven_transaction_request(proven_transaction.clone()).await?; - - // // Transaction was proven and submitted to the node correctly, persist note details and update account - // self.store.apply_transaction(tx_result)?; - - // Ok(()) - - "Called send_transaction".to_string() - } - - // async fn submit_proven_transaction_request( - // &mut self, - // proven_transaction: ProvenTransaction, - // ) -> Result<(), ()> { - // Ok(self.rpc_api.submit_proven_transaction(proven_transaction).await?) - // } - - // fn get_random_coin( - // &mut self - // ) -> RpoRandomCoin { - // let mut rng = StdRng::from_entropy(); - // let coin_seed: [u64; 4] = rng.gen(); - - // RpoRandomCoin::new(coin_seed.map(Felt::new)) - // } -} - -// HELPERS -// ================================================================================================ - -// pub fn prepare_word(word: &Word) -> String { -// word.iter().map(|x| x.as_int().to_string()).collect::>().join(".") -// } \ No newline at end of file diff --git a/wasm/src/native_code/transactions/asm/transaction_scripts/auth_consume_notes.masm b/wasm/src/native_code/transactions/asm/transaction_scripts/auth_consume_notes.masm new file mode 100644 index 000000000..5cf19e425 --- /dev/null +++ b/wasm/src/native_code/transactions/asm/transaction_scripts/auth_consume_notes.masm @@ -0,0 +1,5 @@ +use.miden::contracts::auth::basic->auth_tx + +begin + call.auth_tx::auth_tx_rpo_falcon512 +end diff --git a/wasm/src/native_code/transactions/asm/transaction_scripts/auth_send_asset.masm b/wasm/src/native_code/transactions/asm/transaction_scripts/auth_send_asset.masm new file mode 100644 index 000000000..540c95e5f --- /dev/null +++ b/wasm/src/native_code/transactions/asm/transaction_scripts/auth_send_asset.masm @@ -0,0 +1,12 @@ +use.miden::contracts::auth::basic->auth_tx +use.miden::contracts::wallets::basic->wallet + +begin + push.{recipient} + push.{note_type} + push.{tag} + push.{asset} + call.wallet::send_asset + drop drop dropw dropw + call.auth_tx::auth_tx_rpo_falcon512 +end diff --git a/wasm/src/native_code/transactions/asm/transaction_scripts/distribute_fungible_asset.masm b/wasm/src/native_code/transactions/asm/transaction_scripts/distribute_fungible_asset.masm new file mode 100644 index 000000000..d26a77558 --- /dev/null +++ b/wasm/src/native_code/transactions/asm/transaction_scripts/distribute_fungible_asset.masm @@ -0,0 +1,13 @@ +use.miden::contracts::faucets::basic_fungible->faucet +use.miden::contracts::auth::basic->auth_tx + +begin + push.{recipient} + push.{note_type} + push.{tag} + push.{amount} + call.faucet::distribute + + call.auth_tx::auth_tx_rpo_falcon512 + dropw dropw +end diff --git a/wasm/src/native_code/transactions/mod.rs b/wasm/src/native_code/transactions/mod.rs new file mode 100644 index 000000000..40b61e212 --- /dev/null +++ b/wasm/src/native_code/transactions/mod.rs @@ -0,0 +1,434 @@ +use alloc::collections::{BTreeMap, BTreeSet}; + +use miden_lib::notes::{create_p2id_note, create_p2idr_note}; +use miden_objects::{ + accounts::{AccountDelta, AccountId}, + assembly::ProgramAst, + assets::FungibleAsset, + crypto::rand::{FeltRng, RpoRandomCoin}, + notes::{Note, NoteId, NoteType}, + transaction::{ + ExecutedTransaction, OutputNotes, ProvenTransaction, TransactionArgs, TransactionId, + TransactionScript, + }, + Digest, Felt, Word, +}; +use miden_tx::{ProvingOptions, ScriptTarget, TransactionProver}; +use rand::{rngs::StdRng, Rng, SeedableRng}; + +use self::transaction_request::{PaymentTransactionData, TransactionRequest, TransactionTemplate}; + +use super::{ + errors::ClientError, note_screener::{NoteRelevance, NoteScreener}, rpc::NodeRpcClient, store::{AuthInfo, Store, TransactionFilter}, Client +}; + +pub mod transaction_request; + +// TRANSACTION RESULT +// -------------------------------------------------------------------------------------------- + +/// Represents the result of executing a transaction by the client +/// +/// It contains an [ExecutedTransaction], a list of [Note] that describe the details of the notes +/// created by the transaction execution, and a list of `usize` `relevant_notes` that contain the +/// indices of `output_notes` that are relevant to the client +pub struct TransactionResult { + executed_transaction: ExecutedTransaction, + output_notes: Vec, + relevant_notes: Option>>, +} + +impl TransactionResult { + pub fn new(executed_transaction: ExecutedTransaction, created_notes: Vec) -> Self { + Self { + executed_transaction, + output_notes: created_notes, + relevant_notes: None, + } + } + + pub fn executed_transaction(&self) -> &ExecutedTransaction { + &self.executed_transaction + } + + pub fn created_notes(&self) -> &Vec { + &self.output_notes + } + + pub fn relevant_notes(&self) -> Vec<&Note> { + if let Some(relevant_notes) = &self.relevant_notes { + relevant_notes + .keys() + .map(|note_index| &self.output_notes[*note_index]) + .collect() + } else { + self.created_notes().iter().collect() + } + } + + pub fn set_relevant_notes( + &mut self, + relevant_notes: BTreeMap>, + ) { + self.relevant_notes = Some(relevant_notes); + } + + pub fn block_num(&self) -> u32 { + self.executed_transaction.block_header().block_num() + } + + pub fn transaction_arguments(&self) -> &TransactionArgs { + self.executed_transaction.tx_args() + } + + pub fn account_delta(&self) -> &AccountDelta { + self.executed_transaction.account_delta() + } +} + +// TRANSACTION RECORD +// -------------------------------------------------------------------------------------------- + +/// Describes a transaction that has been executed and is being tracked on the Client +/// +/// Currently, the `commit_height` (and `committed` status) is set based on the height +/// at which the transaction's output notes are committed. +pub struct TransactionRecord { + pub id: TransactionId, + pub account_id: AccountId, + pub init_account_state: Digest, + pub final_account_state: Digest, + pub input_note_nullifiers: Vec, + pub output_notes: OutputNotes, + pub transaction_script: Option, + pub block_num: u32, + pub transaction_status: TransactionStatus, +} + +impl TransactionRecord { + #[allow(clippy::too_many_arguments)] + pub fn new( + id: TransactionId, + account_id: AccountId, + init_account_state: Digest, + final_account_state: Digest, + input_note_nullifiers: Vec, + output_notes: OutputNotes, + transaction_script: Option, + block_num: u32, + transaction_status: TransactionStatus, + ) -> TransactionRecord { + TransactionRecord { + id, + account_id, + init_account_state, + final_account_state, + input_note_nullifiers, + output_notes, + transaction_script, + block_num, + transaction_status, + } + } +} + +/// Represents the status of a transaction +pub enum TransactionStatus { + /// Transaction has been submitted but not yet committed + Pending, + /// Transaction has been committed and included at the specified block number + Committed(u32), +} + +impl std::fmt::Display for TransactionStatus { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + TransactionStatus::Pending => write!(f, "Pending"), + TransactionStatus::Committed(block_number) => { + write!(f, "Committed (Block: {})", block_number) + }, + } + } +} + +impl Client { + // TRANSACTION DATA RETRIEVAL + // -------------------------------------------------------------------------------------------- + + pub async fn get_transactions( + &self, + filter: TransactionFilter, + ) -> Result, ClientError> { + self.store.get_transactions(filter).await.map_err(|err| err.into()) + } + + // TRANSACTION + // -------------------------------------------------------------------------------------------- + + /// Compiles a [TransactionTemplate] into a [TransactionRequest] that can be then executed by the + /// client + pub async fn build_transaction_request( + &mut self, + transaction_template: TransactionTemplate, + ) -> Result { + let account_id = transaction_template.account_id(); + let account_auth = self.store.get_account_auth(account_id).await.unwrap(); + + match transaction_template { + TransactionTemplate::ConsumeNotes(_, notes) => { + let program_ast = ProgramAst::parse(transaction_request::AUTH_CONSUME_NOTES_SCRIPT) + .expect("shipped MASM is well-formed"); + let notes = notes.iter().map(|id| (*id, None)).collect(); + + let tx_script = { + let script_inputs = vec![account_auth.into_advice_inputs()]; + self.tx_executor.compile_tx_script(program_ast, script_inputs, vec![])? + }; + Ok(TransactionRequest::new(account_id, notes, vec![], Some(tx_script))) + }, + TransactionTemplate::MintFungibleAsset(asset, target_account_id, note_type) => { + self.build_mint_tx_request(asset, account_auth, target_account_id, note_type) + }, + TransactionTemplate::PayToId(payment_data, note_type) => { + self.build_p2id_tx_request(account_auth, payment_data, None, note_type) + }, + TransactionTemplate::PayToIdWithRecall(payment_data, recall_height, note_type) => self + .build_p2id_tx_request(account_auth, payment_data, Some(recall_height), note_type), + } + } + + /// Creates and executes a transaction specified by the template, but does not change the + /// local database. + /// + /// # Errors + /// + /// - Returns [ClientError::MissingOutputNotes] if the [TransactionRequest] ouput notes are + /// not a subset of executor's output notes + /// - Returns a [ClientError::TransactionExecutionError] + pub async fn new_transaction( + &mut self, + transaction_request: TransactionRequest + ) -> Result { + let account_id = transaction_request.account_id(); + self.tx_executor + .load_account(account_id).await + .map_err(ClientError::TransactionExecutionError)?; + + let block_num = self.store.get_sync_height().await.unwrap(); + + let note_ids = transaction_request.get_input_note_ids(); + + let output_notes = transaction_request.expected_output_notes().to_vec(); + + // Execute the transaction and get the witness + let executed_transaction = self.tx_executor.execute_transaction( + account_id, + block_num, + ¬e_ids, + transaction_request.into(), + ).await?; + + // Check that the expected output notes is a subset of the transaction's output notes + let tx_note_ids: BTreeSet = + executed_transaction.output_notes().iter().map(|n| n.id()).collect(); + + let missing_note_ids: Vec = output_notes + .iter() + .filter_map(|n| (!tx_note_ids.contains(&n.id())).then_some(n.id())) + .collect(); + + if !missing_note_ids.is_empty() { + return Err(ClientError::MissingOutputNotes(missing_note_ids)); + } + + Ok(TransactionResult::new(executed_transaction, output_notes)) + } + + /// Proves the specified transaction witness, submits it to the node, and stores the transaction in + /// the local database for tracking. + pub async fn submit_transaction( + &mut self, + tx_result: TransactionResult + ) -> Result<(), ClientError> { + let transaction_prover = TransactionProver::new(ProvingOptions::default()); + + let proven_transaction = + transaction_prover.prove_transaction(tx_result.executed_transaction().clone())?; + + self.submit_proven_transaction_request(proven_transaction.clone()).await?; + + let note_screener = NoteScreener::new(&self.store); + let mut relevant_notes = BTreeMap::new(); + + for (idx, note) in tx_result.created_notes().iter().enumerate() { + let account_relevance = note_screener.check_relevance(note).await.unwrap(); + if !account_relevance.is_empty() { + relevant_notes.insert(idx, account_relevance); + } + } + + let mut tx_result = tx_result; + tx_result.set_relevant_notes(relevant_notes); + + // Transaction was proven and submitted to the node correctly, persist note details and update account + self.store.apply_transaction(tx_result).await.unwrap(); + + Ok(()) + } + + /// Compiles the provided transaction script source and inputs into a [TransactionScript] and + /// checks (to the extent possible) that the transaction script can be executed against all + /// accounts with the specified interfaces. + pub fn compile_tx_script( + &self, + program: ProgramAst, + inputs: T, + target_account_procs: Vec, + ) -> Result + where + T: IntoIterator)>, + { + self.tx_executor + .compile_tx_script(program, inputs, target_account_procs) + .map_err(ClientError::TransactionExecutionError) + } + + async fn submit_proven_transaction_request( + &mut self, + proven_transaction: ProvenTransaction, + ) -> Result<(), ClientError> { + Ok(self.rpc_api.submit_proven_transaction(proven_transaction).await.unwrap()) + } + + // HELPERS + // -------------------------------------------------------------------------------------------- + + /// Gets [RpoRandomCoin] from the client + fn get_random_coin(&self) -> RpoRandomCoin { + // TODO: Initialize coin status once along with the client and persist status for retrieval + let mut rng = StdRng::from_entropy(); + let coin_seed: [u64; 4] = rng.gen(); + + RpoRandomCoin::new(coin_seed.map(Felt::new)) + } + + /// Helper to build a [TransactionRequest] for P2ID-type transactions easily. + /// + /// - auth_info has to be from the executor account + /// - If recall_height is Some(), a P2IDR note will be created. Otherwise, a P2ID is created. + fn build_p2id_tx_request( + &self, + auth_info: AuthInfo, + payment_data: PaymentTransactionData, + recall_height: Option, + note_type: NoteType, + ) -> Result { + let random_coin = self.get_random_coin(); + + let created_note = if let Some(recall_height) = recall_height { + create_p2idr_note( + payment_data.account_id(), + payment_data.target_account_id(), + vec![payment_data.asset()], + note_type, + recall_height, + random_coin, + )? + } else { + create_p2id_note( + payment_data.account_id(), + payment_data.target_account_id(), + vec![payment_data.asset()], + note_type, + random_coin, + )? + }; + + let recipient = created_note + .recipient_digest() + .iter() + .map(|x| x.as_int().to_string()) + .collect::>() + .join("."); + + let note_tag = created_note.metadata().tag().inner(); + + let tx_script = ProgramAst::parse( + &transaction_request::AUTH_SEND_ASSET_SCRIPT + .replace("{recipient}", &recipient) + .replace("{note_type}", &Felt::new(note_type as u64).to_string()) + .replace("{tag}", &Felt::new(note_tag.into()).to_string()) + .replace("{asset}", &prepare_word(&payment_data.asset().into()).to_string()), + ) + .expect("shipped MASM is well-formed"); + + let tx_script = { + let script_inputs = vec![auth_info.into_advice_inputs()]; + self.tx_executor.compile_tx_script(tx_script, script_inputs, vec![])? + }; + + Ok(TransactionRequest::new( + payment_data.account_id(), + BTreeMap::new(), + vec![created_note], + Some(tx_script), + )) + } + + /// Helper to build a [TransactionRequest] for transaction to mint fungible tokens. + /// + /// - faucet_auth_info has to be from the faucet account + fn build_mint_tx_request( + &self, + asset: FungibleAsset, + faucet_auth_info: AuthInfo, + target_account_id: AccountId, + note_type: NoteType, + ) -> Result { + let random_coin = self.get_random_coin(); + let created_note = create_p2id_note( + asset.faucet_id(), + target_account_id, + vec![asset.into()], + note_type, + random_coin, + )?; + + let recipient = created_note + .recipient_digest() + .iter() + .map(|x| x.as_int().to_string()) + .collect::>() + .join("."); + + let note_tag = created_note.metadata().tag().inner(); + + let tx_script = ProgramAst::parse( + &transaction_request::DISTRIBUTE_FUNGIBLE_ASSET_SCRIPT + .replace("{recipient}", &recipient) + .replace("{note_type}", &Felt::new(note_type as u64).to_string()) + .replace("{tag}", &Felt::new(note_tag.into()).to_string()) + .replace("{amount}", &Felt::new(asset.amount()).to_string()), + ) + .expect("shipped MASM is well-formed"); + + let tx_script = { + let script_inputs = vec![faucet_auth_info.into_advice_inputs()]; + self.tx_executor.compile_tx_script(tx_script, script_inputs, vec![])? + }; + + Ok(TransactionRequest::new( + asset.faucet_id(), + BTreeMap::new(), + vec![created_note], + Some(tx_script), + )) + } +} + +// HELPERS +// ================================================================================================ + +pub fn prepare_word(word: &Word) -> String { + word.iter().map(|x| x.as_int().to_string()).collect::>().join(".") +} \ No newline at end of file diff --git a/wasm/src/native_code/transactions/transaction_request.rs b/wasm/src/native_code/transactions/transaction_request.rs new file mode 100644 index 000000000..37b58f879 --- /dev/null +++ b/wasm/src/native_code/transactions/transaction_request.rs @@ -0,0 +1,170 @@ +use alloc::collections::BTreeMap; + +use miden_objects::{ + accounts::AccountId, + assets::{Asset, FungibleAsset}, + notes::{Note, NoteId, NoteType}, + transaction::{TransactionArgs, TransactionScript}, + vm::AdviceMap, + Word, +}; + +// MASM SCRIPTS +// -------------------------------------------------------------------------------------------- + +pub const AUTH_CONSUME_NOTES_SCRIPT: &str = + include_str!("asm/transaction_scripts/auth_consume_notes.masm"); +pub const DISTRIBUTE_FUNGIBLE_ASSET_SCRIPT: &str = + include_str!("asm/transaction_scripts/distribute_fungible_asset.masm"); +pub const AUTH_SEND_ASSET_SCRIPT: &str = + include_str!("asm/transaction_scripts/auth_send_asset.masm"); + +// TRANSACTION REQUEST +// -------------------------------------------------------------------------------------------- + +pub type NoteArgs = Word; + +/// Represents the most general way of defining an executable transaction +#[derive(Clone, Debug)] +pub struct TransactionRequest { + /// ID of the account against which the transactions is to be executed. + account_id: AccountId, + /// Notes to be consumed by the transaction together with their (optional) arguments. + input_notes: BTreeMap>, + /// A list of notes expected to be generated by the transactions. + expected_output_notes: Vec, + /// Optional transaction script (together with its arguments). + tx_script: Option, +} + +impl TransactionRequest { + // CONSTRUCTORS + // -------------------------------------------------------------------------------------------- + + pub fn new( + account_id: AccountId, + input_notes: BTreeMap>, + expected_output_notes: Vec, + tx_script: Option, + ) -> Self { + Self { + account_id, + input_notes, + expected_output_notes, + tx_script, + } + } + + // PUBLIC ACCESSORS + // -------------------------------------------------------------------------------------------- + + pub fn account_id(&self) -> AccountId { + self.account_id + } + + pub fn input_notes(&self) -> &BTreeMap> { + &self.input_notes + } + + pub fn get_input_note_ids(&self) -> Vec { + self.input_notes.keys().cloned().collect() + } + + pub fn get_note_args(&self) -> BTreeMap { + self.input_notes + .iter() + .filter_map(|(note, args)| args.map(|a| (*note, a))) + .collect() + } + + pub fn expected_output_notes(&self) -> &[Note] { + &self.expected_output_notes + } + + pub fn tx_script(&self) -> Option<&TransactionScript> { + self.tx_script.as_ref() + } +} + +impl From for TransactionArgs { + fn from(val: TransactionRequest) -> Self { + let note_args = val.get_note_args(); + let mut tx_args = TransactionArgs::new(val.tx_script, Some(note_args), AdviceMap::new()); + + let output_notes = val.expected_output_notes.into_iter(); + tx_args.extend_expected_output_notes(output_notes); + + tx_args + } +} + +// TRANSACTION TEMPLATE +// -------------------------------------------------------------------------------------------- + +#[derive(Clone, Debug)] +pub enum TransactionTemplate { + /// Consume the specified notes against an account. + ConsumeNotes(AccountId, Vec), + /// Mint fungible assets using a faucet account and creates a note with the specified + /// type that can be consumed by the target Account ID + MintFungibleAsset(FungibleAsset, AccountId, NoteType), + /// Creates a pay-to-id note with the specified type directed to a specific account + PayToId(PaymentTransactionData, NoteType), + /// Creates a pay-to-id note directed to a specific account, specifying a block height after + /// which the note can be recalled + PayToIdWithRecall(PaymentTransactionData, u32, NoteType), +} + +impl TransactionTemplate { + /// Returns the [AccountId] of the account which the transaction will be executed against + pub fn account_id(&self) -> AccountId { + match self { + TransactionTemplate::ConsumeNotes(account_id, _) => *account_id, + TransactionTemplate::MintFungibleAsset(asset, ..) => asset.faucet_id(), + TransactionTemplate::PayToId(payment_data, _) => payment_data.account_id(), + TransactionTemplate::PayToIdWithRecall(payment_data, ..) => payment_data.account_id(), + } + } +} + +// PAYMENT TRANSACTION DATA +// -------------------------------------------------------------------------------------------- + +#[derive(Clone, Debug)] +pub struct PaymentTransactionData { + asset: Asset, + sender_account_id: AccountId, + target_account_id: AccountId, +} + +impl PaymentTransactionData { + // CONSTRUCTORS + // -------------------------------------------------------------------------------------------- + + pub fn new( + asset: Asset, + sender_account_id: AccountId, + target_account_id: AccountId, + ) -> PaymentTransactionData { + PaymentTransactionData { + asset, + sender_account_id, + target_account_id, + } + } + + /// Returns the executor [AccountId] + pub fn account_id(&self) -> AccountId { + self.sender_account_id + } + + /// Returns the target [AccountId] + pub fn target_account_id(&self) -> AccountId { + self.target_account_id + } + + /// Returns the transaction [Asset] + pub fn asset(&self) -> Asset { + self.asset + } +} diff --git a/wasm/src/web_client/account.rs b/wasm/src/web_client/account.rs index c1e5b8736..ed5fcdb9e 100644 --- a/wasm/src/web_client/account.rs +++ b/wasm/src/web_client/account.rs @@ -33,20 +33,6 @@ pub enum AccountTemplate { // RPC call. #[wasm_bindgen] impl WebClient { - pub async fn test_store_and_rpc(&mut self) -> Result { - if let Some(ref mut client) = self.get_mut_inner() { - let _ = client.store.insert_string("Test string".to_string()).await - .map(|_| JsValue::from_str("Test string inserted successfully")) - .map_err(|_| JsValue::from_str("Failed to insert test string")); - - client.rpc_api.test_rpc().await // This is the new line - .map(|_| JsValue::from_str("RPC call successful")) - .map_err(|_| JsValue::from_str("RPC call failed")) - } else { - Err(JsValue::from_str("Client not initialized")) - } - } - pub async fn import_account( &mut self, account_bytes: JsValue @@ -58,7 +44,7 @@ impl WebClient { match client.import_account(account_data).await { Ok(_) => { - let message = format!("Import account with ID: {}", account_id); + let message = format!("Imported account with ID: {}", account_id); Ok(JsValue::from_str(&message)) }, Err(err) => { @@ -130,9 +116,8 @@ impl WebClient { ) -> Result { if let Some(ref mut client) = self.get_mut_inner() { let account_tuples = client.get_accounts().await.unwrap(); - let accounts: Vec = account_tuples.into_iter().map(|(account, word)| { - let word = word.map_or("No word".to_string(), |w| w[0].to_string()); - format!("ID: {}, Word: {}", account.id().to_string(), word) + let accounts: Vec = account_tuples.into_iter().map(|(account, _)| { + format!("{}", account.id().to_string()) }).collect(); // Convert the Vec to JsValue diff --git a/wasm/src/web_client/examples.rs b/wasm/src/web_client/examples.rs new file mode 100644 index 000000000..a59b89422 --- /dev/null +++ b/wasm/src/web_client/examples.rs @@ -0,0 +1,19 @@ +use super::WebClient; +use wasm_bindgen::prelude::*; + +#[wasm_bindgen] +impl WebClient { + pub async fn test_store_and_rpc(&mut self) -> Result { + if let Some(ref mut client) = self.get_mut_inner() { + let _ = client.store.insert_string("Test string".to_string()).await + .map(|_| JsValue::from_str("Test string inserted successfully")) + .map_err(|_| JsValue::from_str("Failed to insert test string")); + + client.rpc_api.test_rpc().await // This is the new line + .map(|_| JsValue::from_str("RPC call successful")) + .map_err(|_| JsValue::from_str("RPC call failed")) + } else { + Err(JsValue::from_str("Client not initialized")) + } + } +} \ No newline at end of file diff --git a/wasm/src/web_client/mod.rs b/wasm/src/web_client/mod.rs index ad9d6bec7..970e5e712 100644 --- a/wasm/src/web_client/mod.rs +++ b/wasm/src/web_client/mod.rs @@ -39,12 +39,19 @@ impl WebClient { // Exposed method to JS to create an internal client pub async fn create_client(&mut self) -> Result { + web_sys::console::log_1(&JsValue::from_str("create_client_1")); let rng = get_random_coin(); - let web_store = WebStore::new().await.map_err(|_| JsValue::from_str("Failed to initialize WebStore"))?; + web_sys::console::log_1(&JsValue::from_str("create_client_2")); + let web_store: WebStore = WebStore::new().await.map_err(|_| JsValue::from_str("Failed to initialize WebStore"))?; + web_sys::console::log_1(&JsValue::from_str("create_client_3")); let web_rpc_client = WebRpcClient::new("http://localhost:57291"); - //let executor_store = WebStore::new().await.map_err(|_| JsValue::from_str("Failed to initialize ExecutorStore"))?; + web_sys::console::log_1(&JsValue::from_str("create_client_4")); + let executor_store = WebStore::new().await.map_err(|_| JsValue::from_str("Failed to initialize ExecutorStore"))?; + web_sys::console::log_1(&JsValue::from_str("create_client_5")); - self.inner = Some(Client::new(web_rpc_client, rng, web_store)); + self.inner = Some(Client::new(web_rpc_client, rng, web_store, executor_store)); + + web_sys::console::log_1(&JsValue::from_str("create_client_5")); Ok(JsValue::from_str("Client created successfully")) } diff --git a/wasm/src/web_client/store/accounts/js_bindings.rs b/wasm/src/web_client/store/accounts/js_bindings.rs index 5571d6d43..1901b7ff8 100644 --- a/wasm/src/web_client/store/accounts/js_bindings.rs +++ b/wasm/src/web_client/store/accounts/js_bindings.rs @@ -6,6 +6,11 @@ use wasm_bindgen_futures::*; extern "C" { // GETS // ================================================================================================ + #[wasm_bindgen(js_name = getAccountIds)] + pub fn idxdb_get_account_ids() -> js_sys::Promise; + + #[wasm_bindgen(js_name = getAllAccountStubs)] + pub fn idxdb_get_account_stubs() -> js_sys::Promise; #[wasm_bindgen(js_name = getAccountStub)] pub fn idxdb_get_account_stub( @@ -17,27 +22,21 @@ extern "C" { code_root: String ) -> js_sys::Promise; - #[wasm_bindgen(js_name = getAccountAssetVault)] - pub fn idxdb_get_account_asset_vault( - vault_root: String - ) -> js_sys::Promise; - #[wasm_bindgen(js_name = getAccountStorage)] pub fn idxdb_get_account_storage( storage_root: String ) -> js_sys::Promise; + #[wasm_bindgen(js_name = getAccountAssetVault)] + pub fn idxdb_get_account_asset_vault( + vault_root: String + ) -> js_sys::Promise; + #[wasm_bindgen(js_name = getAccountAuth)] pub fn idxdb_get_account_auth( account_id: String ) -> js_sys::Promise; - #[wasm_bindgen(js_name = getAllAccountStubs)] - pub fn idxdb_get_account_stubs() -> js_sys::Promise; - - #[wasm_bindgen(js_name = getAccountIds)] - pub fn idxdb_get_account_ids() -> js_sys::Promise; - // INSERTS // ================================================================================================ @@ -60,12 +59,6 @@ extern "C" { assets: String ) -> js_sys::Promise; - #[wasm_bindgen(js_name = insertAccountAuth)] - pub fn idxdb_insert_account_auth( - id: String, - auth_info: Vec - ) -> js_sys::Promise; - #[wasm_bindgen(js_name = insertAccountRecord)] pub fn idxdb_insert_account_record( id: String, @@ -76,4 +69,10 @@ extern "C" { committed: bool, account_seed: Option> ) -> js_sys::Promise; + + #[wasm_bindgen(js_name = insertAccountAuth)] + pub fn idxdb_insert_account_auth( + id: String, + auth_info: Vec + ) -> js_sys::Promise; } \ No newline at end of file diff --git a/wasm/src/web_client/store/accounts/mod.rs b/wasm/src/web_client/store/accounts/mod.rs index 8fcc1d1bc..e1dc50a48 100644 --- a/wasm/src/web_client/store/accounts/mod.rs +++ b/wasm/src/web_client/store/accounts/mod.rs @@ -10,7 +10,7 @@ use miden_objects::{ }; use miden_objects::utils::Deserializable; -use crate::native_code::store::{Store, AuthInfo, NoteFilter}; +use crate::native_code::{errors::StoreError, store::{AuthInfo, NoteFilter, Store}}; use super::WebStore; @@ -20,13 +20,13 @@ use js_bindings::*; mod models; use models::*; -mod utils; +pub(crate) mod utils; use utils::*; impl WebStore { pub(super) async fn get_account_ids( - &mut self - ) -> Result, ()> { + &self + ) -> Result, StoreError> { let promise = idxdb_get_account_ids(); let js_value = JsFuture::from(promise).await.unwrap(); let account_ids_as_strings: Vec = from_value(js_value).unwrap(); @@ -39,8 +39,8 @@ impl WebStore { } pub(super) async fn get_account_stubs( - &mut self - ) -> Result)>, ()> { + &self + ) -> Result)>, StoreError> { let promise = idxdb_get_account_stubs(); let js_value = JsFuture::from(promise).await.unwrap(); let account_stubs_idxdb: Vec = from_value(js_value).unwrap(); @@ -65,9 +65,9 @@ impl WebStore { } pub(crate) async fn get_account_stub( - &mut self, + &self, account_id: AccountId, - ) -> Result<(AccountStub, Option), ()> { + ) -> Result<(AccountStub, Option), StoreError> { let account_id_str = account_id.to_string(); let promise = idxdb_get_account_stub(account_id_str); @@ -91,9 +91,9 @@ impl WebStore { } pub(crate) async fn get_account( - &mut self, + &self, account_id: AccountId - ) -> Result<(Account, Option), ()> { + ) -> Result<(Account, Option), StoreError> { let (account_stub, seed) = self.get_account_stub(account_id).await.unwrap(); let (_procedures, module_ast) = self.get_account_code(account_stub.code_root()).await.unwrap(); @@ -116,26 +116,10 @@ impl WebStore { Ok((account, seed)) } - pub(crate) async fn get_account_auth( - &mut self, - account_id: AccountId - ) -> Result { - let account_id_str = account_id.to_string(); - - let promise = idxdb_get_account_auth(account_id_str); - let js_value = JsFuture::from(promise).await.unwrap(); - let auth_info_idxdb: AccountAuthIdxdbObject = from_value(js_value).unwrap(); - - // Convert the auth_info to the appropriate AuthInfo enum variant - let auth_info = AuthInfo::read_from_bytes(&auth_info_idxdb.auth_info).unwrap(); - - Ok(auth_info) - } - pub(super) async fn get_account_code( - &mut self, + &self, root: Digest - ) -> Result<(Vec, ModuleAst), ()> { + ) -> Result<(Vec, ModuleAst), StoreError> { let root_serialized = root.to_string(); let promise = idxdb_get_account_code(root_serialized); @@ -151,9 +135,9 @@ impl WebStore { } pub(super) async fn get_account_storage( - &mut self, + &self, root: Digest - ) -> Result { + ) -> Result { let root_serialized = root.to_string(); let promise = idxdb_get_account_storage(root_serialized); @@ -165,9 +149,9 @@ impl WebStore { } pub(super) async fn get_vault_assets( - &mut self, + &self, root: Digest - ) -> Result, ()> { + ) -> Result, StoreError> { let root_serialized = root.to_string(); let promise = idxdb_get_account_asset_vault(root_serialized); @@ -178,12 +162,28 @@ impl WebStore { Ok(assets) } + pub(crate) async fn get_account_auth( + &self, + account_id: AccountId + ) -> Result { + let account_id_str = account_id.to_string(); + + let promise = idxdb_get_account_auth(account_id_str); + let js_value = JsFuture::from(promise).await.unwrap(); + let auth_info_idxdb: AccountAuthIdxdbObject = from_value(js_value).unwrap(); + + // Convert the auth_info to the appropriate AuthInfo enum variant + let auth_info = AuthInfo::read_from_bytes(&auth_info_idxdb.auth_info).unwrap(); + + Ok(auth_info) + } + pub(crate) async fn insert_account( &mut self, account: &Account, account_seed: Option, auth_info: &AuthInfo, - ) -> Result<(), ()> { + ) -> Result<(), StoreError> { insert_account_code(account.code()).await; insert_account_storage(account.storage()).await; insert_account_asset_vault(account.vault()).await; diff --git a/wasm/src/web_client/store/chain_data/js_bindings.rs b/wasm/src/web_client/store/chain_data/js_bindings.rs index c599914c2..4ae35fec2 100644 --- a/wasm/src/web_client/store/chain_data/js_bindings.rs +++ b/wasm/src/web_client/store/chain_data/js_bindings.rs @@ -38,4 +38,10 @@ extern "C" { chain_mmr_peaks: String, has_client_notes: bool ) -> js_sys::Promise; + + #[wasm_bindgen(js_name = insertChainMmrNodes)] + pub fn idxdb_insert_chain_mmr_nodes( + ids: Vec, + nodes: Vec + ) -> js_sys::Promise; } \ No newline at end of file diff --git a/wasm/src/web_client/store/chain_data/mod.rs b/wasm/src/web_client/store/chain_data/mod.rs index e609d3f5c..99959bd03 100644 --- a/wasm/src/web_client/store/chain_data/mod.rs +++ b/wasm/src/web_client/store/chain_data/mod.rs @@ -1,141 +1,185 @@ -// use wasm_bindgen_futures::JsFuture; -// use serde_wasm_bindgen::from_value; +use std::{collections::BTreeMap, num::NonZeroUsize}; -// use crate::native_code::store::ChainMmrNodeFilter; +use wasm_bindgen_futures::JsFuture; +use serde_wasm_bindgen::from_value; + +use crate::native_code::{ + errors::StoreError, + store::ChainMmrNodeFilter +}; + +use miden_objects::{crypto::merkle::{InOrderIndex, MmrPeaks}, BlockHeader, Digest}; use super::WebStore; -// mod js_bindings; -// use js_bindings::*; +mod js_bindings; +use js_bindings::*; -// mod models; -// use models::*; +mod models; +use models::*; -// mod utils; -// use utils::*; +pub mod utils; +use utils::*; impl WebStore { - // pub(crate) async fn insert_block_header( - // &self, - // block_header: BlockHeader, - // chain_mmr_peaks: MmrPeaks, - // has_client_notes: bool - // ) -> Result<(), ()> { - // let chain_mmr_peaks = chain_mmr_peaks.peaks().to_vec(); - // let (block_num, header, chain_mmr, has_client_notes) = - // serialize_block_header(block_header, chain_mmr_peaks, has_client_notes)?; - - // let promise = idxdb_insert_block_header( - // block_num, - // header, - // chain_mmr, - // has_client_notes - // ); - // let js_value = JsFuture::from(promise).await; - - // Ok(()) - // } - - // pub(crate) async fn get_block_headers( - // &self, - // block_numbers: &[u32], - // ) -> Result, ()> { - // let formatted_block_numbers_list: Vec = block_numbers - // .iter() - // .map(|block_number| (*block_number as i64).to_string()) - // .collect(); - - // let promise = idxdb_get_block_headers(formatted_block_numbers_list); - // let js_value = JsFuture::from(promise).await?; - // let block_headers_idxdb: Vec = from_value(js_value).unwrap(); - - // let results:Result, ()> = block_headers_idxdb.into_iter().map(|record| { - // let block_header = serde_json::from_str(&record.header).unwrap(); - // let has_client_notes = record.has_client_notes; - - // Ok((block_header, has_client_notes)) - // }).collect(); - - // return results; - // } - - // pub(crate) async fn get_tracked_block_headers( - // &self - // ) -> Result, ()> { - // let promise = idxdb_get_tracked_block_headers(); - // let js_value = JsFuture::from(promise).await?; - // let block_headers_idxdb: Vec = from_value(js_value).unwrap(); - - // let results:Result, ()> = block_headers_idxdb.into_iter().map(|record| { - // let block_header = serde_json::from_str(&record.header).unwrap(); - // let has_client_notes = record.has_client_notes; - - // Ok((block_header, has_client_notes)) - // }).collect(); - - // return results; - // } - - // pub(crate) async fn get_chain_mmr_nodes( - // &self, - // filter: ChainMmrNodeFilter, - // ) -> Result, ()> { - // match filter { - // ChainMmrNodeFilter::All => { - // let promise = idxdb_get_chain_mmr_nodes_all(); - // let js_value = JsFuture::from(promise).await?; - // let chain_mmr_nodes_idxdb: Vec = from_value(js_value).unwrap(); - - // let results:Result, ()> = chain_mmr_nodes_idxdb.into_iter().map(|record| { - // let id_as_u64: u64 = record.id.parse::().unwrap(); - // let id = InOrderIndex::new(NonZeroUsize::new(id_as_u64 as usize).unwrap()); - // let node: Digest = - // serde_json::from_str(&record.node).map_err(|err| ())?; - // Ok((id, node)) - // }).collect(); - - // return results; - // }, - // ChainMmrNodeFilter::List(ids) => { - // let formatted_list: Vec = ids - // .iter() - // .map(|id| (Into::::into(*id)).to_string()) - // .collect(); - - // let promise = idxdb_get_chain_mmr_nodes(ids); - // let js_value = JsFuture::from(promise).await?; - // let chain_mmr_nodes_idxdb: Vec = from_value(js_value).unwrap(); - - // let results:Result, ()> = chain_mmr_nodes_idxdb.into_iter().map(|record| { - // let id_as_u64: u64 = record.id.parse::().unwrap(); - // let id = InOrderIndex::new(NonZeroUsize::new(id_as_u64 as usize).unwrap()); - // let node: Digest = - // serde_json::from_str(&record.node).map_err(|err| ())?; - // Ok((id, node)) - // }).collect(); - - // return results; - // } - // } - // } - - // pub(crate) async fn get_chain_mmr_peaks_by_block_num( - // &self, - // block_num: u32, - // ) -> Result { - // let block_num_as_str = block_num.to_string(); + pub(crate) async fn insert_block_header( + &mut self, + block_header: BlockHeader, + chain_mmr_peaks: MmrPeaks, + has_client_notes: bool + ) -> Result<(), StoreError> { + let chain_mmr_peaks = chain_mmr_peaks.peaks().to_vec(); + let (block_num, header, chain_mmr, has_client_notes) = + serialize_block_header(block_header, chain_mmr_peaks, has_client_notes)?; + + let promise = idxdb_insert_block_header( + block_num, + header, + chain_mmr, + has_client_notes + ); + JsFuture::from(promise).await.unwrap(); + + Ok(()) + } + + pub(crate) async fn get_block_headers( + &self, + block_numbers: &[u32], + ) -> Result, StoreError> { + let formatted_block_numbers_list: Vec = block_numbers + .iter() + .map(|block_number| (*block_number as i64).to_string()) + .collect(); + + let promise = idxdb_get_block_headers(formatted_block_numbers_list); + let js_value = JsFuture::from(promise).await.unwrap(); + let block_headers_idxdb: Vec = from_value(js_value).unwrap(); + + let results:Result, StoreError> = block_headers_idxdb.into_iter().map(|record| { + let block_header = serde_json::from_str(&record.header).map_err(StoreError::JsonDataDeserializationError)?; + let has_client_notes = record.has_client_notes; + + Ok((block_header, has_client_notes)) + }).collect(); + + return results; + } + + pub(crate) async fn get_tracked_block_headers( + &self + ) -> Result, StoreError> { + let promise = idxdb_get_tracked_block_headers(); + let js_value = JsFuture::from(promise).await.unwrap(); + let block_headers_idxdb: Vec = from_value(js_value).unwrap(); + + let results:Result, StoreError> = block_headers_idxdb.into_iter().map(|record| { + let block_header = serde_json::from_str(&record.header).unwrap(); + + Ok(block_header) + }).collect(); + + return results; + } + + pub(crate) async fn get_chain_mmr_nodes( + &self, + filter: ChainMmrNodeFilter<'_>, + ) -> Result, StoreError> { + match filter { + ChainMmrNodeFilter::All => { + let promise = idxdb_get_chain_mmr_nodes_all(); + let js_value = JsFuture::from(promise).await.unwrap(); + let chain_mmr_nodes_idxdb: Vec = from_value(js_value).unwrap(); + + let results:Result, StoreError> = chain_mmr_nodes_idxdb.into_iter().map(|record| { + let id_as_u64: u64 = record.id.parse::().unwrap(); + let id = InOrderIndex::new(NonZeroUsize::new(id_as_u64 as usize).unwrap()); + let node: Digest = + serde_json::from_str(&record.node).map_err(StoreError::JsonDataDeserializationError)?; + Ok((id, node)) + }).collect(); + + return results; + }, + ChainMmrNodeFilter::List(ids) => { + let formatted_list: Vec = ids + .iter() + .map(|id| (Into::::into(*id)).to_string()) + .collect(); + + let promise = idxdb_get_chain_mmr_nodes(formatted_list); + let js_value = JsFuture::from(promise).await.unwrap(); + let chain_mmr_nodes_idxdb: Vec = from_value(js_value).unwrap(); + + let results:Result, StoreError> = chain_mmr_nodes_idxdb.into_iter().map(|record| { + let id_as_u64: u64 = record.id.parse::().unwrap(); + let id = InOrderIndex::new(NonZeroUsize::new(id_as_u64 as usize).unwrap()); + let node: Digest = + serde_json::from_str(&record.node).map_err(StoreError::JsonDataDeserializationError)?; + Ok((id, node)) + }).collect(); + + return results; + } + } + } + + pub(crate) async fn get_chain_mmr_peaks_by_block_num( + &self, + block_num: u32, + ) -> Result { + let block_num_as_str = block_num.to_string(); - // let promise = idxdb_get_chain_mmr_peaks_by_block_num(block_num_as_str); - // let js_value = JsFuture::from(promise).await?; - // let mmr_peaks_idxdb: MmrPeaksIdxdbObject = from_value(js_value).unwrap(); - - // if let Some(peaks) = mmr_peaks_idxdb.peaks { - // let mmr_peaks_nodes: Vec = - // serde_json::from_str(&peaks).map_err(|err| ())?; - - // return MmrPeaks::new(block_num as usize, mmr_peaks_nodes).map_err(|err| ()) - // } - - // return Ok(MmrPeaks::new(0, vec![])?); - // } + let promise = idxdb_get_chain_mmr_peaks_by_block_num(block_num_as_str); + let js_value = JsFuture::from(promise).await.unwrap(); + let mmr_peaks_idxdb: MmrPeaksIdxdbObject = from_value(js_value).unwrap(); + + if let Some(peaks) = mmr_peaks_idxdb.peaks { + let mmr_peaks_nodes: Vec = + serde_json::from_str(&peaks).map_err(StoreError::JsonDataDeserializationError)?; + + return MmrPeaks::new(block_num as usize, mmr_peaks_nodes).map_err(StoreError::MmrError) + } + + return Ok(MmrPeaks::new(0, vec![])?); + } + + pub(crate) async fn insert_chain_mmr_nodes( + nodes: &[(InOrderIndex, Digest)], + ) -> Result<(), StoreError> { + let mut serialized_node_ids = Vec::new(); + let mut serialized_nodes = Vec::new(); + for (id, node) in nodes.iter() { + let (serialized_id, serialized_node) = serialize_chain_mmr_node(*id, *node)?; + serialized_node_ids.push(serialized_id); + serialized_nodes.push(serialized_node); + }; + + let promise = idxdb_insert_chain_mmr_nodes(serialized_node_ids, serialized_nodes); + JsFuture::from(promise).await.unwrap(); + + Ok(()) + } + + // Without self? + pub(crate) async fn insert_block_header_tx( + block_header: BlockHeader, + chain_mmr_peaks: MmrPeaks, + has_client_notes: bool, + ) -> Result<(), StoreError> { + let chain_mmr_peaks = chain_mmr_peaks.peaks().to_vec(); + let (block_num, header, chain_mmr, has_client_notes) = + serialize_block_header(block_header, chain_mmr_peaks, has_client_notes)?; + + let promise = idxdb_insert_block_header( + block_num, + header, + chain_mmr, + has_client_notes + ); + JsFuture::from(promise).await.unwrap(); + + Ok(()) + } } \ No newline at end of file diff --git a/wasm/src/web_client/store/chain_data/utils.rs b/wasm/src/web_client/store/chain_data/utils.rs index f0f4e9fe2..b16bfca7e 100644 --- a/wasm/src/web_client/store/chain_data/utils.rs +++ b/wasm/src/web_client/store/chain_data/utils.rs @@ -1,15 +1,30 @@ -// type SerializedBlockHeaderData = (String, String, String, bool); - -// pub fn serialize_block_header( -// block_header: BlockHeader, -// chain_mmr_peaks: Vec, -// has_client_notes: bool, -// ) -> Result { -// let block_num = block_header.block_num().to_string(); -// let header = -// serde_json::to_string(&block_header).map_err(|err| ())?; -// let chain_mmr_peaks = -// serde_json::to_string(&chain_mmr_peaks).map_err(|err| ())?; - -// Ok((block_num, header, chain_mmr_peaks, has_client_notes)) -// } \ No newline at end of file +use miden_objects::{crypto::merkle::InOrderIndex, BlockHeader, Digest}; + +use crate::native_code::errors::StoreError; + +type SerializedBlockHeaderData = (String, String, String, bool); +type SerializedChainMmrNodeData = (String, String); + +pub fn serialize_block_header( + block_header: BlockHeader, + chain_mmr_peaks: Vec, + has_client_notes: bool, +) -> Result { + let block_num = block_header.block_num().to_string(); + let header = + serde_json::to_string(&block_header).map_err(StoreError::InputSerializationError)?; + let chain_mmr_peaks = + serde_json::to_string(&chain_mmr_peaks).map_err(StoreError::InputSerializationError)?; + + Ok((block_num, header, chain_mmr_peaks, has_client_notes)) +} + +pub fn serialize_chain_mmr_node( + id: InOrderIndex, + node: Digest, +) -> Result { + let id: u64 = id.into(); + let id_as_str = id.to_string(); + let node = serde_json::to_string(&node).map_err(StoreError::InputSerializationError)?; + Ok((id_as_str, node)) +} \ No newline at end of file diff --git a/wasm/src/web_client/store/mod.rs b/wasm/src/web_client/store/mod.rs index fd9c04ff5..81608c237 100644 --- a/wasm/src/web_client/store/mod.rs +++ b/wasm/src/web_client/store/mod.rs @@ -1,16 +1,17 @@ +use std::collections::BTreeMap; + use async_trait::async_trait; use wasm_bindgen::prelude::*; use wasm_bindgen_futures::*; use miden_objects::{ - accounts::{Account, AccountId, AccountStub}, notes::NoteId, Word + accounts::{Account, AccountId, AccountStub}, crypto::merkle::{InOrderIndex, MmrPeaks}, notes::{NoteId, NoteInclusionProof}, transaction::TransactionId, BlockHeader, Digest, Word }; use crate::native_code::{ - errors::StoreError, - store::{ - note_record::{InputNoteRecord, OutputNoteRecord}, AuthInfo, NoteFilter, Store - } + errors::{ClientError, StoreError}, store::{ + note_record::{InputNoteRecord, OutputNoteRecord}, AuthInfo, ChainMmrNodeFilter, NoteFilter, Store, TransactionFilter + }, sync::SyncedNewNotes, transactions::{TransactionRecord, TransactionResult} }; pub mod accounts; @@ -31,7 +32,7 @@ pub struct WebStore {} impl WebStore { pub async fn new() -> Result { - let _ = JsFuture::from(setup_indexed_db()).await; + JsFuture::from(setup_indexed_db()).await; Ok(WebStore {}) } } @@ -46,102 +47,135 @@ impl Store for WebStore { self.insert_string(data).await } - // CHAIN DATA + // SYNC // -------------------------------------------------------------------------------------------- - // async fn get_block_headers( - // &self, - // block_numbers: &[u32], - // ) -> Result, ()> { - // self.get_block_headers(block_numbers).await - // } - - // async fn insert_block_header( - // &self, - // block_header: BlockHeader, - // chain_mmr_peaks: MmrPeaks, - // has_client_notes: bool, - // ) -> Result<(), ()> { - // self.insert_block_header(block_header, chain_mmr_peaks, has_client_notes).await - // } - - // async fn get_tracked_block_headers( - // &self - // ) -> Result, ()> { - // self.get_tracked_block_headers().await - // } - - // async fn get_chain_mmr_nodes( - // &self, - // filter: ChainMmrNodeFilter, - // ) -> Result, ()> { - // self.get_chain_mmr_nodes(filter).await - // } - - // async fn get_chain_mmr_peaks_by_block_num( - // &self, - // block_num: u32 - // ) -> Result { - // self.get_chain_mmr_peaks_by_block_num(block_num).await - // } + async fn get_note_tags( + &self + ) -> Result, StoreError> { + self.get_note_tags().await + } - // SYNC - // -------------------------------------------------------------------------------------------- + async fn add_note_tag( + &mut self, + tag: u64, + ) -> Result { + self.add_note_tag(tag).await + } - // async fn get_note_tags( - // &self - // ) -> Result, ()> { - // self.get_note_tags().await - // } - - // async fn add_note_tag( - // &mut self, - // tag: u64, - // ) -> Result { - // self.add_note_tag(tag).await - // } - - // async fn get_sync_height( - // &self - // ) -> Result { - // self.get_sync_height().await - // } - - // async fn apply_state_sync( - // &mut self, - // block_header: BlockHeader, - // nullifiers: Vec, - // committed_notes: Vec<(NoteId, NoteInclusionProof)>, - // committed_transactions: &[TransactionId], - // new_mmr_peaks: MmrPeaks, - // new_authentication_nodes: &[(InOrderIndex, Digest)], - // ) -> Result<(), ()> { - // self.apply_state_sync( - // block_header, - // nullifiers, - // committed_notes, - // committed_transactions, - // new_mmr_peaks, - // new_authentication_nodes, - // ).await - // } + async fn get_sync_height( + &self + ) -> Result { + self.get_sync_height().await + } + + async fn apply_state_sync( + &mut self, + block_header: BlockHeader, + nullifiers: Vec, + committed_notes: SyncedNewNotes, + committed_transactions: &[TransactionId], + new_mmr_peaks: MmrPeaks, + new_authentication_nodes: &[(InOrderIndex, Digest)], + updated_onchain_accounts: &[Account], + ) -> Result<(), StoreError> { + self.apply_state_sync( + block_header, + nullifiers, + committed_notes, + committed_transactions, + new_mmr_peaks, + new_authentication_nodes, + updated_onchain_accounts, + ).await + } // TRANSACTIONS // -------------------------------------------------------------------------------------------- - // async fn get_transactions( - // &mut self, - // transaction_filter: TransactionFilter, - // ) -> Result, ()> { - // self.get_transactions(transaction_filter).await - // } + async fn get_transactions( + &self, + transaction_filter: TransactionFilter, + ) -> Result, StoreError> { + self.get_transactions(transaction_filter).await + } + + async fn apply_transaction( + &mut self, + tx_result: TransactionResult, + ) -> Result<(), StoreError> { + self.apply_transaction(tx_result).await + } + + // NOTES + // -------------------------------------------------------------------------------------------- - // async fn apply_transaction( - // &mut self, - // tx_result: TransactionResult, - // ) -> Result<(), ()> { - // self.apply_transaction(tx_result).await - // } + async fn get_input_notes( + &self, + filter: NoteFilter, + ) -> Result, StoreError> { + self.get_input_notes(filter).await + } + + async fn get_output_notes( + &self, + note_filter: NoteFilter, + ) -> Result, StoreError> { + self.get_output_notes(note_filter).await + } + + async fn get_input_note( + &self, + note_id: NoteId, + ) -> Result { + self.get_input_note(note_id).await + } + + async fn insert_input_note( + &mut self, + note: &InputNoteRecord, + ) -> Result<(), StoreError> { + self.insert_input_note(note).await + } + + // CHAIN DATA + // -------------------------------------------------------------------------------------------- + + async fn insert_block_header( + &mut self, + block_header: BlockHeader, + chain_mmr_peaks: MmrPeaks, + has_client_notes: bool, + ) -> Result<(), StoreError> { + self.insert_block_header(block_header, chain_mmr_peaks, has_client_notes).await + } + + async fn get_block_headers( + &self, + block_numbers: &[u32], + ) -> Result, StoreError> { + self.get_block_headers(block_numbers).await + } + + async fn get_tracked_block_headers( + &self + ) -> Result, StoreError> { + self.get_tracked_block_headers().await + } + + async fn get_chain_mmr_nodes<'a>( + &self, + filter: ChainMmrNodeFilter<'a>, + ) -> Result, StoreError> { + self.get_chain_mmr_nodes(filter).await + } + + async fn get_chain_mmr_peaks_by_block_num( + &self, + block_num: u32 + ) -> Result { + self.get_chain_mmr_peaks_by_block_num(block_num).await + } // ACCOUNTS // -------------------------------------------------------------------------------------------- @@ -151,71 +185,40 @@ impl Store for WebStore { account: &Account, account_seed: Option, auth_info: &AuthInfo, - ) -> Result<(), ()> { + ) -> Result<(), StoreError> { self.insert_account(account, account_seed, auth_info).await } async fn get_account_ids( - &mut self - ) -> Result, ()> { + &self + ) -> Result, StoreError> { self.get_account_ids().await } async fn get_account_stubs( - &mut self - ) -> Result)>, ()> { + &self + ) -> Result)>, StoreError> { self.get_account_stubs().await } async fn get_account_stub( - &mut self, + &self, account_id: AccountId, - ) -> Result<(AccountStub, Option), ()> { + ) -> Result<(AccountStub, Option), StoreError> { self.get_account_stub(account_id).await } async fn get_account( - &mut self, + &self, account_id: AccountId, - ) -> Result<(Account, Option), ()> { + ) -> Result<(Account, Option), StoreError> { self.get_account(account_id).await } async fn get_account_auth( - &mut self, + &self, account_id: AccountId, - ) -> Result { + ) -> Result { self.get_account_auth(account_id).await } - - // NOTES - // -------------------------------------------------------------------------------------------- - - async fn get_input_notes( - &mut self, - filter: NoteFilter, - ) -> Result, StoreError> { - self.get_input_notes(filter).await - } - - async fn get_input_note( - &mut self, - note_id: NoteId, - ) -> Result { - self.get_input_note(note_id).await - } - - async fn insert_input_note( - &mut self, - note: &InputNoteRecord, - ) -> Result<(), StoreError> { - self.insert_input_note(note).await - } - - async fn get_output_notes( - &mut self, - note_filter: NoteFilter, - ) -> Result, StoreError> { - self.get_output_notes(note_filter).await - } } \ No newline at end of file diff --git a/wasm/src/web_client/store/notes/mod.rs b/wasm/src/web_client/store/notes/mod.rs index dfdefb9f4..2e25c0354 100644 --- a/wasm/src/web_client/store/notes/mod.rs +++ b/wasm/src/web_client/store/notes/mod.rs @@ -6,7 +6,12 @@ use wasm_bindgen_futures::*; use super::WebStore; use crate::native_code::errors::StoreError; -use crate::native_code::store::note_record::{InputNoteRecord, NoteRecordDetails, NoteStatus, OutputNoteRecord}; +use crate::native_code::store::note_record::{ + InputNoteRecord, + NoteRecordDetails, + NoteStatus, + OutputNoteRecord +}; use crate::native_code::store::NoteFilter; use crate::web_client::notes::WebClientNoteFilter; @@ -16,12 +21,12 @@ use js_bindings::*; mod models; use models::*; -mod utils; +pub(crate) mod utils; use utils::*; impl WebStore { pub(crate) async fn get_input_notes( - &mut self, + &self, filter: NoteFilter ) -> Result, StoreError> { let filter_as_str = match filter { @@ -90,7 +95,7 @@ impl WebStore { } pub(crate) async fn get_input_note( - &mut self, + &self, note_id: NoteId ) -> Result { let note_id_str = ¬e_id.inner().to_string(); @@ -156,7 +161,7 @@ impl WebStore { } pub(crate) async fn get_output_notes( - &mut self, + &self, filter: NoteFilter ) -> Result, StoreError> { let filter_as_str = match filter { @@ -227,7 +232,7 @@ impl WebStore { } pub(crate) async fn get_unspent_input_note_nullifiers( - &mut self + &self ) -> Result, StoreError>{ let promise = idxdb_get_unspent_input_note_nullifiers(); let js_value = JsFuture::from(promise).await.unwrap(); diff --git a/wasm/src/web_client/store/notes/models.rs b/wasm/src/web_client/store/notes/models.rs index 03f2d69bd..e94f7690b 100644 --- a/wasm/src/web_client/store/notes/models.rs +++ b/wasm/src/web_client/store/notes/models.rs @@ -1,23 +1,50 @@ -use serde::{Deserialize, Serialize}; +use base64::{decode as base64_decode, DecodeError}; +use serde::{Deserialize, Deserializer, Serialize}; +use serde::de::{Error, Unexpected}; #[derive(Serialize, Deserialize)] pub struct InputNoteIdxdbObject { + #[serde(deserialize_with = "base64_to_vec_u8_required", default)] pub assets: Vec, pub details: String, pub recipient: String, pub status: String, pub metadata: Option, pub inclusion_proof: Option, + #[serde(deserialize_with = "base64_to_vec_u8_required", default)] pub serialized_note_script: Vec } #[derive(Serialize, Deserialize)] pub struct OutputNoteIdxdbObject { + #[serde(deserialize_with = "base64_to_vec_u8_required", default)] pub assets: Vec, pub details: Option, pub recipient: String, pub status: String, pub metadata: String, pub inclusion_proof: Option, + #[serde(deserialize_with = "base64_to_vec_u8_optional", default)] pub serialized_note_script: Option> +} + +fn base64_to_vec_u8_required<'de, D>(deserializer: D) -> Result, D::Error> +where + D: Deserializer<'de>, +{ + let base64_str: String = Deserialize::deserialize(deserializer)?; + base64_decode(&base64_str).map_err(|e| Error::custom(format!("Base64 decode error: {}", e))) +} + +fn base64_to_vec_u8_optional<'de, D>(deserializer: D) -> Result>, D::Error> +where + D: Deserializer<'de>, +{ + let base64_str: Option = Option::deserialize(deserializer)?; + match base64_str { + Some(str) => base64_decode(&str) + .map(Some) + .map_err(|e| Error::custom(format!("Base64 decode error: {}", e))), + None => Ok(None), + } } \ No newline at end of file diff --git a/wasm/src/web_client/store/notes/utils.rs b/wasm/src/web_client/store/notes/utils.rs index 479db1463..2c721190c 100644 --- a/wasm/src/web_client/store/notes/utils.rs +++ b/wasm/src/web_client/store/notes/utils.rs @@ -96,7 +96,7 @@ pub(crate) fn serialize_input_note( )) } -pub(super) async fn insert_input_note_tx( +pub async fn insert_input_note_tx( note: &InputNoteRecord ) -> Result<(), StoreError> { let ( diff --git a/wasm/src/web_client/store/sync/js_bindings.rs b/wasm/src/web_client/store/sync/js_bindings.rs index a999dabd3..bcd1f84da 100644 --- a/wasm/src/web_client/store/sync/js_bindings.rs +++ b/wasm/src/web_client/store/sync/js_bindings.rs @@ -16,7 +16,7 @@ extern "C" { // INSERTS // ================================================================================================ - #[wasm_bindgen(js_name = insertNoteTag)] + #[wasm_bindgen(js_name = addNoteTag)] pub fn idxdb_add_note_tag( tags: String ) -> js_sys::Promise; @@ -24,14 +24,14 @@ extern "C" { #[wasm_bindgen(js_name = applyStateSync)] pub fn idxdb_apply_state_sync( block_num: String, + nullifiers: Vec, block_header: String, chain_mmr_peaks: String, - nullifiers: Vec, + has_client_notes: bool, + serialized_node_ids: Vec, + serialized_nodes: Vec, note_ids: Vec, inclusion_proofs: Vec, transactions_to_commit: Vec, - node_indices_as_str: Vec, - nodes_as_str: Vec, - has_client_notes: bool ) -> js_sys::Promise; } \ No newline at end of file diff --git a/wasm/src/web_client/store/sync/mod.rs b/wasm/src/web_client/store/sync/mod.rs index e87d75194..951064839 100644 --- a/wasm/src/web_client/store/sync/mod.rs +++ b/wasm/src/web_client/store/sync/mod.rs @@ -1,7 +1,18 @@ +use miden_objects::{ + accounts::Account, + crypto::merkle::{ + InOrderIndex, MmrPeaks + }, + notes::NoteInclusionProof, + transaction::TransactionId, + BlockHeader, Digest +}; use wasm_bindgen_futures::*; use serde_wasm_bindgen::from_value; -use super::WebStore; +use crate::native_code::{errors::StoreError, sync::SyncedNewNotes}; + +use super::{chain_data::utils::serialize_chain_mmr_node, notes::utils::insert_input_note_tx, transactions::utils::update_account, WebStore}; mod js_bindings; use js_bindings::*; @@ -9,98 +20,125 @@ use js_bindings::*; mod models; use models::*; -mod utils; -use utils::*; - impl WebStore { - // pub(crate) async fn get_note_tags( - // &self - // ) -> Result, ()>{ - // let promsie = idxdb_get_note_tags(); - // let js_value = JsFuture::from(promsie).await?; - // let tags_idxdb: NoteTagsIdxdbObject = from_value(js_value).unwrap(); - - // let tags: Vec = serde_json::from_str(&tags_idxdb.tags).unwrap(); - - // return Ok(tags); - // } - - // pub(super) async fn get_sync_height( - // &self - // ) -> Result { - // let promise = idxdb_get_sync_height(); - // let js_value = JsFuture::from(promise).await?; - // let block_num_idxdb: SyncHeightIdxdbObject = from_value(js_value).unwrap(); - - // let block_num_as_u32: u32 = block_num_idxdb.block_num.parse::().unwrap(); - // return Ok(block_num_as_u32); - // } - - // pub(super) async fn add_note_tag( - // &mut self, - // tag: u64 - // ) -> Result { - // let mut tags = self.get_note_tags().await?; - // if tags.contains(&tag) { - // return Ok(false); - // } - // tags.push(tag); - // let tags = serde_json::to_string(&tags)?; - - // let promise = idxdb_add_note_tag(tags); - // let _ = JsFuture::from(promise).await?; - // return Ok(true); - // } - - // pub(super) async fn apply_state_sync( - // &mut self, - // block_header: BlockHeader, - // nullifiers: Vec, - // committed_notes: Vec<(NoteId, NoteInclusionProof)>, - // committed_transactions: &[TransactionId], - // new_mmr_peaks: MmrPeaks, - // new_authentication_nodes: &[(InOrderIndex, Digest)], - // ) -> Result<(), ()> { - // let block_header_as_str = serde_json::to_string(&block_header).map_err(|err| ())?; - // let block_num_as_str = block_header.block_num().to_string(); - // let nullifiers_as_str = nullifiers.iter().map(|nullifier| nullifier.to_hex()).collect(); - // let note_ids_as_str: Vec = committed_notes.iter().map(|(note_id, _)| note_id.inner().to_hex()).collect(); - // let inclusion_proofs_as_str: Vec = committed_notes.iter().map(|(_, inclusion_proof)| { - // let block_num = inclusion_proof.origin().block_num; - // let sub_hash = inclusion_proof.sub_hash(); - // let note_root = inclusion_proof.note_root(); - // let note_index = inclusion_proof.origin().node_index.value(); - - // serde_json::to_string(&NoteInclusionProof::new( - // block_num, - // sub_hash, - // note_root, - // note_index, - // inclusion_proof.note_path().clone(), - // )).unwrap() - // }).collect(); - // let transactions_to_commit_as_str: Vec = committed_transactions.iter().map(|tx_id| tx_id.inner().into()).collect(); - // let new_mmr_peaks_as_str = serde_json::to_string(&new_mmr_peaks.peaks().to_vec()).map_err(|err| ())?; - // let block_has_relevant_notes = !committed_notes.is_empty(); - // let (indices, digests): (Vec, Vec) = new_authentication_nodes.iter().cloned().unzip(); - // let indices: Vec = indices.iter().map(|index| index.into()).collect(); - // let node_indices_as_str: Vec = indices.iter().map(|index| index.to_string()).collect(); - // let nodes_as_str: Vec = digests.iter().map(|digest| serde_json::to_string(&digest).map_err(|err| ())).collect(); - - // let promise = idxdb_apply_state_sync( - // block_num_as_str, - // block_header_as_str, - // new_mmr_peaks_as_str, - // nullifiers_as_str, - // note_ids_as_str, - // inclusion_proofs_as_str, - // transactions_to_commit_as_str, - // node_indices_as_str, - // nodes_as_str, - // block_has_relevant_notes, - // ); - // let _ = JsFuture::from(promise).await; - - // Ok(()) - // } + pub(crate) async fn get_note_tags( + &self + ) -> Result, StoreError>{ + let promsie = idxdb_get_note_tags(); + let js_value = JsFuture::from(promsie).await.unwrap(); + let tags_idxdb: NoteTagsIdxdbObject = from_value(js_value).unwrap(); + + let tags: Vec = serde_json::from_str(&tags_idxdb.tags).unwrap(); + + return Ok(tags); + } + + pub(super) async fn get_sync_height( + &self + ) -> Result { + let promise = idxdb_get_sync_height(); + let js_value = JsFuture::from(promise).await.unwrap(); + let block_num_idxdb: SyncHeightIdxdbObject = from_value(js_value).unwrap(); + + let block_num_as_u32: u32 = block_num_idxdb.block_num.parse::().unwrap(); + return Ok(block_num_as_u32); + } + + pub(super) async fn add_note_tag( + &mut self, + tag: u64 + ) -> Result { + let mut tags = self.get_note_tags().await.unwrap(); + if tags.contains(&tag) { + return Ok(false); + } + tags.push(tag); + let tags = serde_json::to_string(&tags).map_err(StoreError::InputSerializationError)?; + + let promise = idxdb_add_note_tag(tags); + JsFuture::from(promise).await.unwrap(); + return Ok(true); + } + + pub(super) async fn apply_state_sync( + &mut self, + block_header: BlockHeader, + nullifiers: Vec, + committed_notes: SyncedNewNotes, + committed_transactions: &[TransactionId], + new_mmr_peaks: MmrPeaks, + new_authentication_nodes: &[(InOrderIndex, Digest)], + updated_onchain_accounts: &[Account], + ) -> Result<(), StoreError> { + // Serialize data for updating state sync and block header + let block_num_as_str = block_header.block_num().to_string(); + + // Serialize data for updating spent notes + let nullifiers_as_str = nullifiers.iter().map(|nullifier| nullifier.to_hex()).collect(); + + // Serialize data for updating block header + let block_header_as_str = serde_json::to_string(&block_header).map_err(StoreError::InputSerializationError)?; + let new_mmr_peaks_as_str = serde_json::to_string(&new_mmr_peaks.peaks().to_vec()).map_err(StoreError::InputSerializationError)?; + let block_has_relevant_notes = !committed_notes.is_empty(); + + // Serialize data for updating chain MMR nodes + let mut serialized_node_ids = Vec::new(); + let mut serialized_nodes = Vec::new(); + for (id, node) in new_authentication_nodes.iter() { + let (serialized_id, serialized_node) = serialize_chain_mmr_node(*id, *node)?; + serialized_node_ids.push(serialized_id); + serialized_nodes.push(serialized_node); + }; + + // Serialize data for updating committed notes + let note_ids_as_str: Vec = committed_notes.new_inclusion_proofs().iter().map(|(note_id, _)| note_id.inner().to_hex()).collect(); + let inclusion_proofs_as_str: Vec = committed_notes.new_inclusion_proofs().iter().map(|(_, inclusion_proof)| { + let block_num = inclusion_proof.origin().block_num; + let sub_hash = inclusion_proof.sub_hash(); + let note_root = inclusion_proof.note_root(); + let note_index = inclusion_proof.origin().node_index.value(); + + // Create a NoteInclusionProof and serialize it to JSON, handle errors with `?` + let proof = NoteInclusionProof::new( + block_num, + sub_hash, + note_root, + note_index, + inclusion_proof.note_path().clone(), + ).unwrap(); + + serde_json::to_string(&proof).unwrap() + }).collect(); + + // TODO: LOP INTO idxdb_apply_state_sync call + // Commit new public notes + for note in committed_notes.new_public_notes() { + insert_input_note_tx(¬e.clone().into()).await.unwrap(); + } + + // Serialize data for updating committed transactions + let transactions_to_commit_as_str: Vec = committed_transactions.iter().map(|tx_id| tx_id.to_string()).collect(); + + // TODO: LOP INTO idxdb_apply_state_sync call + // Update onchain accounts on the db that have been updated onchain + for account in updated_onchain_accounts { + update_account(account.clone()).await.unwrap(); + } + + let promise = idxdb_apply_state_sync( + block_num_as_str, + nullifiers_as_str, + block_header_as_str, + new_mmr_peaks_as_str, + block_has_relevant_notes, + serialized_node_ids, + serialized_nodes, + note_ids_as_str, + inclusion_proofs_as_str, + transactions_to_commit_as_str, + ); + JsFuture::from(promise).await.unwrap(); + + Ok(()) + } } \ No newline at end of file diff --git a/wasm/src/web_client/store/sync/utils.rs b/wasm/src/web_client/store/sync/utils.rs deleted file mode 100644 index e69de29bb..000000000 diff --git a/wasm/src/web_client/store/transactions/js_bindings.rs b/wasm/src/web_client/store/transactions/js_bindings.rs index 2989b12ef..8e00d4688 100644 --- a/wasm/src/web_client/store/transactions/js_bindings.rs +++ b/wasm/src/web_client/store/transactions/js_bindings.rs @@ -13,7 +13,7 @@ extern "C" { #[wasm_bindgen(js_name = insertTransactionScript)] pub fn idxdb_insert_transaction_script( - script_hash: Option>, + script_hash: Vec, script_program: Option> ) -> js_sys::Promise; @@ -25,7 +25,6 @@ extern "C" { final_account_state: String, input_notes: String, output_notes: Vec, - script_program: Option>, script_hash: Option>, script_inputs: Option, block_num: String, diff --git a/wasm/src/web_client/store/transactions/mod.rs b/wasm/src/web_client/store/transactions/mod.rs index 59d661fe1..69601100f 100644 --- a/wasm/src/web_client/store/transactions/mod.rs +++ b/wasm/src/web_client/store/transactions/mod.rs @@ -1,5 +1,24 @@ -use crate::native_code::{store::NativeTransactionFilter, transactions}; - +use std::collections::BTreeMap; + +use crate::native_code::{ + errors::StoreError, + store::{ + note_record::{ + InputNoteRecord, + OutputNoteRecord + }, TransactionFilter + }, transactions::{ + TransactionRecord, + TransactionResult, TransactionStatus +} +}; +use crate::web_client::store::notes::utils::{ + insert_input_note_tx, + insert_output_note_tx +}; + +use miden_objects::{accounts::AccountId, assembly::ProgramAst, transaction::{OutputNotes, TransactionId, TransactionScript}, Digest, Felt}; +use miden_tx::utils::Deserializable; use wasm_bindgen_futures::*; use serde_wasm_bindgen::from_value; @@ -11,139 +30,145 @@ use js_bindings::*; mod models; use models::*; -mod utils; +pub mod utils; use utils::*; impl WebStore { - // pub async fn get_transactions( - // &mut self, - // filter: NativeTransactionFilter - // ) -> Result, ()> { - // let filter_as_str = match filter { - // NativeTransactionFilter::All => "All", - // NativeTransactionFilter::Uncomitted => "Uncomitted", - // }; - - // let promise = idxdb_get_transactions(filter_as_str.to_string()); - // let js_value = JsFuture::from(promise).await?; - // let transactions_idxdb: Vec = from_value(js_value).unwrap(); - - // let transaction_records: Result, ()> = transactions_idxdb.into_iter().map(|tx_idxdb| { - // let native_account_id = AccountId::from_hex(&tx_idxdb.account_id).map_err(|_err| ())?; - // let block_num_as_u32: u32 = tx_idxdb.block_num.parse::().unwrap(); - // let commit_height_as_u32: Option = match tx_idxdb.commit_height { - // Some(height) => Some(height.parse::().unwrap()), - // _ => None, - // }; - - // let id: Digest = tx_idxdb.id.try_into()?; - // let init_account_state: Digest = init_account_state.try_into()?; - - // let final_account_state: Digest = final_account_state.try_into()?; - - // let input_note_nullifiers: Vec = - // serde_json::from_str(&input_notes).map_err(StoreError::JsonDataDeserializationError)?; - - // let output_notes: OutputNotes = OutputNotes::read_from_bytes(&output_notes)?; - - // let transaction_script: Option = if script_hash.is_some() { - // let script_hash = script_hash - // .map(|hash| Digest::read_from_bytes(&hash)) - // .transpose()? - // .expect("Script hash should be included in the row"); - - // let script_program = script_program - // .map(|program| ProgramAst::from_bytes(&program)) - // .transpose()? - // .expect("Script program should be included in the row"); - - // let script_inputs = script_inputs - // .map(|hash| serde_json::from_str::>>(&hash)) - // .transpose() - // .map_err(StoreError::JsonDataDeserializationError)? - // .expect("Script inputs should be included in the row"); - - // let tx_script = TransactionScript::from_parts( - // script_program, - // script_hash, - // script_inputs.into_iter().map(|(k, v)| (k.into(), v)), - // )?; - - // Some(tx_script) - // } else { - // None - // }; - - // let transaction_status = - // commit_height_as_u32.map_or(TransactionStatus::Pending, TransactionStatus::Committed); - - // Ok(TransactionRecord { - // id: id.into(), - // native_account_id, - // init_account_state, - // final_account_state, - // input_note_nullifiers, - // output_notes, - // transaction_script, - // block_num_as_u32, - // transaction_status, - // }) - // }).collect(); - - // transaction_records - // } - - // pub async fn apply_transaction( - // &mut self, - // tx_result: TransactionResult - // ) -> Result<(), ()> { - // let account_id = tx_result.executed_transaction().account_id(); - // let account_delta = tx_result.account_delta(); - - // let (mut account, _seed) = self.get_account(account_id).await?; - - // account.apply_delta(account_delta).map_err()?; - - // let created_notes = tx_result - // .created_notes() - // .iter() - // .map(|note| InputNoteRecord::from(note.clone())) - // .collect::>(); - - // // Transaction Data - // insert_proven_transaction_data(tx_result).await?; - - // // Account Data - // update_account(account).await?; - - // // Updates for notes - - // // TODO: see if we should filter the input notes we store to keep notes we can consume with - // // existing accounts - // for note in &created_notes { - // insert_input_note_tx(note).await?; - // } - - // for note in &created_notes { - // insert_output_note_tx(note).await?; - // } - - // Ok(()) - // } - - // pub(crate) async fn mark_transactions_as_committed( - // &mut self, - // block_num: u32, - // transactions_to_commit: &[TransactionId] - // ) -> Result { - // let block_num_as_str = block_num.to_string(); - // let transactions_to_commit_as_str: Vec = transactions_to_commit.iter().map(|tx_id| tx_id.inner().into()).collect(); - - // let promise = idxdb_mark_transactions_as_committed(block_num_as_str, transactions_to_commit_as_str); - // let js_value = JsFuture::from(promise).await?; - // let result: usize = from_value(js_value).unwrap(); + pub async fn get_transactions( + &mut self, + filter: TransactionFilter + ) -> Result, StoreError> { + let filter_as_str = match filter { + TransactionFilter::All => "All", + TransactionFilter::Uncomitted => "Uncomitted", + }; + + let promise = idxdb_get_transactions(filter_as_str.to_string()); + let js_value = JsFuture::from(promise).await.unwrap(); + let transactions_idxdb: Vec = from_value(js_value).unwrap(); + + let transaction_records: Result, StoreError> = transactions_idxdb.into_iter().map(|tx_idxdb| { + let native_account_id = AccountId::from_hex(&tx_idxdb.account_id).unwrap(); + let block_num_as_u32: u32 = tx_idxdb.block_num.parse::().unwrap(); + let commit_height_as_u32: Option = match tx_idxdb.commit_height { + Some(height) => Some(height.parse::().unwrap()), + _ => None, + }; + + let id: Digest = tx_idxdb.id.try_into()?; + let init_account_state: Digest = tx_idxdb.init_account_state.try_into()?; + + let final_account_state: Digest = tx_idxdb.final_account_state.try_into()?; + + let input_note_nullifiers: Vec = + serde_json::from_str(&tx_idxdb.input_notes).map_err(StoreError::JsonDataDeserializationError)?; + + let output_notes = OutputNotes::read_from_bytes(&tx_idxdb.output_notes)?; + + let transaction_script: Option = if tx_idxdb.script_hash.is_some() { + let script_hash = tx_idxdb.script_hash + .map(|hash| Digest::read_from_bytes(&hash)) + .transpose()? + .expect("Script hash should be included in the row"); + + let script_program = tx_idxdb.script_program + .map(|program| ProgramAst::from_bytes(&program)) + .transpose()? + .expect("Script program should be included in the row"); + + let script_inputs = tx_idxdb.script_inputs + .map(|hash| serde_json::from_str::>>(&hash)) + .transpose() + .map_err(StoreError::JsonDataDeserializationError)? + .expect("Script inputs should be included in the row"); + + let tx_script = TransactionScript::from_parts( + script_program, + script_hash, + script_inputs.into_iter().map(|(k, v)| (k.into(), v)), + )?; + + Some(tx_script) + } else { + None + }; + + let transaction_status = + commit_height_as_u32.map_or(TransactionStatus::Pending, TransactionStatus::Committed); + + Ok(TransactionRecord { + id: id.into(), + account_id: native_account_id, + init_account_state, + final_account_state, + input_note_nullifiers, + output_notes, + transaction_script, + block_num: block_num_as_u32, + transaction_status, + }) + }).collect(); + + transaction_records + } + + pub async fn apply_transaction( + &mut self, + tx_result: TransactionResult + ) -> Result<(), StoreError> { + let account_id = tx_result.executed_transaction().account_id(); + let account_delta = tx_result.account_delta(); + + let (mut account, _seed) = self.get_account(account_id).await.unwrap(); + + account.apply_delta(account_delta).map_err(StoreError::AccountError)?; + + let created_input_notes = tx_result + .relevant_notes() + .into_iter() + .map(|note| InputNoteRecord::from(note.clone())) + .collect::>(); + + let created_output_notes = tx_result + .created_notes() + .iter() + .map(|note| OutputNoteRecord::from(note.clone())) + .collect::>(); + + // Transaction Data + insert_proven_transaction_data(tx_result).await.unwrap(); + + // Account Data + update_account(account).await.unwrap(); + + // Updates for notes + + // TODO: see if we should filter the input notes we store to keep notes we can consume with + // existing accounts + for note in &created_input_notes { + insert_input_note_tx(note).await.unwrap(); + } + + for note in &created_output_notes { + insert_output_note_tx(note).await.unwrap(); + } + + Ok(()) + } + + pub(crate) async fn mark_transactions_as_committed( + &mut self, + block_num: u32, + transactions_to_commit: &[TransactionId] + ) -> Result { + let block_num_as_str = block_num.to_string(); + let transactions_to_commit_as_str: Vec = transactions_to_commit.iter().map(|tx_id| tx_id.inner().into()).collect(); + + let promise = idxdb_mark_transactions_as_committed(block_num_as_str, transactions_to_commit_as_str); + let js_value = JsFuture::from(promise).await.unwrap(); + let result: usize = from_value(js_value).unwrap(); - // Ok(result) - // } + Ok(result) + } } diff --git a/wasm/src/web_client/store/transactions/models.rs b/wasm/src/web_client/store/transactions/models.rs index 1963768e1..9a9b30b6c 100644 --- a/wasm/src/web_client/store/transactions/models.rs +++ b/wasm/src/web_client/store/transactions/models.rs @@ -1,4 +1,6 @@ -use serde::{Deserialize, Serialize}; +use base64::{decode as base64_decode, DecodeError}; +use serde::{Deserialize, Deserializer, Serialize}; +use serde::de::{Error, Unexpected}; #[derive(Serialize, Deserialize)] pub struct TransactionIdxdbObject { @@ -7,10 +9,34 @@ pub struct TransactionIdxdbObject { pub init_account_state: String, pub final_account_state: String, pub input_notes: String, + #[serde(deserialize_with = "base64_to_vec_u8_required", default)] pub output_notes: Vec, + #[serde(deserialize_with = "base64_to_vec_u8_optional", default)] pub script_hash: Option>, + #[serde(deserialize_with = "base64_to_vec_u8_optional", default)] pub script_program: Option>, pub script_inputs: Option, pub block_num: String, // usually u32 pub commit_height: Option // usually Option +} + +fn base64_to_vec_u8_required<'de, D>(deserializer: D) -> Result, D::Error> +where + D: Deserializer<'de>, +{ + let base64_str: String = Deserialize::deserialize(deserializer)?; + base64_decode(&base64_str).map_err(|e| Error::custom(format!("Base64 decode error: {}", e))) +} + +fn base64_to_vec_u8_optional<'de, D>(deserializer: D) -> Result>, D::Error> +where + D: Deserializer<'de>, +{ + let base64_str: Option = Option::deserialize(deserializer)?; + match base64_str { + Some(str) => base64_decode(&str) + .map(Some) + .map_err(|e| Error::custom(format!("Base64 decode error: {}", e))), + None => Ok(None), + } } \ No newline at end of file diff --git a/wasm/src/web_client/store/transactions/utils.rs b/wasm/src/web_client/store/transactions/utils.rs index 1be3bd64e..76f67e2de 100644 --- a/wasm/src/web_client/store/transactions/utils.rs +++ b/wasm/src/web_client/store/transactions/utils.rs @@ -1,124 +1,132 @@ +use miden_objects::{accounts::Account, assembly::AstSerdeOptions, transaction::ToNullifier, Digest}; +use miden_tx::utils::Serializable; use wasm_bindgen_futures::*; +use crate::native_code::{errors::StoreError, transactions::TransactionResult}; + +use crate::web_client::store::accounts::utils::{ + insert_account_asset_vault, + insert_account_storage, + insert_account_record +}; use super::js_bindings::*; // TYPES // ================================================================================================ -// type SerializedTransactionData = ( -// String, -// String, -// String, -// String, -// String, -// Vec, -// Option>, -// Option>, -// Option, -// String, -// Option, -// ); +type SerializedTransactionData = ( + String, + String, + String, + String, + String, + Vec, + Option>, + Option>, + Option, + String, + Option, +); // ================================================================================================ -// pub async fn insert_proven_transaction_data( -// transaction_result: TransactionResult -// ) -> Result<(), ()> { -// let ( -// transaction_id, -// account_id, -// init_account_state, -// final_account_state, -// input_notes, -// output_notes, -// script_program, -// script_hash, -// script_inputs, -// block_num, -// committed -// ) = serialize_transaction_data(transaction_result)?; - -// if let Some(hash) = script_hash.clone() { -// let promise = idxdb_insert_transaction_script(script_hash, script_program); -// let result = JsFuture::from(promise).await; -// } - -// let promise = idxdb_insert_proven_transaction_data( -// transaction_id, -// account_id, -// init_account_state, -// final_account_state, -// input_notes, -// output_notes, -// script_program, -// script_hash, -// script_inputs, -// block_num, -// committed -// ); -// let result = JsFuture::from(promise).await; - -// match result { -// Ok(_) => Ok(()), -// Err(_) => Err(()), -// } -// } - -// pub(super) async fn serialize_transaction_data( -// transaction_result: TransactionResult -// ) -> Result { -// let executed_transaction = transaction_result.executed_transaction(); -// let transaction_id: String = executed_transaction.id().inner().into(); - -// let account_id_as_str: String = AccountId::to_hex(executed_transaction.account_id()); -// let init_account_state = &executed_transaction.initial_account().hash().to_string(); -// let final_account_state = &executed_transaction.final_account().hash().to_string(); - -// // TODO: Double check if saving nullifiers as input notes is enough -// let nullifiers: Vec = -// executed_transaction.input_notes().iter().map(|x| x.id().inner()).collect(); - -// let input_notes = -// serde_json::to_string(&nullifiers).map_err(|err| ())?; - -// let output_notes = executed_transaction.output_notes(); - -// // TODO: Scripts should be in their own tables and only identifiers should be stored here -// let transaction_args = transaction_result.transaction_arguments(); -// let mut script_program = None; -// let mut script_hash = None; -// let mut script_inputs = None; - -// if let Some(tx_script) = transaction_args.tx_script() { -// script_program = Some(tx_script.code().to_bytes(AstSerdeOptions { -// serialize_imports: true, -// })); -// script_hash = Some(tx_script.hash().to_bytes()); -// script_inputs = Some( -// serde_json::to_string(&tx_script.inputs()) -// .map_err(|err| ())?, -// ); -// } - -// Ok(( -// transaction_id, -// account_id_as_str, -// init_account_state.to_owned(), -// final_account_state.to_owned(), -// input_notes, -// output_notes.to_bytes(), -// script_program, -// script_hash, -// script_inputs, -// transaction_result.block_num().to_string(), -// None, -// )) -// } - -// pub(super) async fn update_account( -// new_account_state: Account, -// ) -> Result<(), ()> { -// insert_account_storage(new_account_state.storage())?; -// insert_account_asset_vault(new_account_state.vault())?; -// insert_account_record(&new_account_state, None) -// } \ No newline at end of file +pub async fn insert_proven_transaction_data( + transaction_result: TransactionResult +) -> Result<(), StoreError> { + let ( + transaction_id, + account_id, + init_account_state, + final_account_state, + input_notes, + output_notes, + script_program, + script_hash, + script_inputs, + block_num, + committed + ) = serialize_transaction_data(transaction_result)?; + + if let Some(hash) = script_hash.clone() { + let promise = idxdb_insert_transaction_script(hash, script_program.clone()); + JsFuture::from(promise).await.unwrap(); + } + + let promise = idxdb_insert_proven_transaction_data( + transaction_id, + account_id, + init_account_state, + final_account_state, + input_notes, + output_notes, + script_hash.clone(), + script_inputs.clone(), + block_num, + committed + ); + JsFuture::from(promise).await.unwrap(); + + Ok(()) +} + +pub(super) fn serialize_transaction_data( + transaction_result: TransactionResult +) -> Result { + let executed_transaction = transaction_result.executed_transaction(); + let transaction_id: String = executed_transaction.id().inner().into(); + + let account_id_as_str: String = executed_transaction.account_id().to_string(); + let init_account_state = &executed_transaction.initial_account().hash().to_string(); + let final_account_state = &executed_transaction.final_account().hash().to_string(); + + // TODO: Double check if saving nullifiers as input notes is enough + let nullifiers: Vec = executed_transaction + .input_notes() + .iter() + .map(|x| x.nullifier().inner()) + .collect(); + + let input_notes = + serde_json::to_string(&nullifiers).map_err(StoreError::InputSerializationError)?; + + let output_notes = executed_transaction.output_notes(); + + // TODO: Scripts should be in their own tables and only identifiers should be stored here + let transaction_args = transaction_result.transaction_arguments(); + let mut script_program = None; + let mut script_hash = None; + let mut script_inputs = None; + + if let Some(tx_script) = transaction_args.tx_script() { + script_program = Some(tx_script.code().to_bytes(AstSerdeOptions { + serialize_imports: true, + })); + script_hash = Some(tx_script.hash().to_bytes()); + script_inputs = Some( + serde_json::to_string(&tx_script.inputs()) + .map_err(StoreError::InputSerializationError)?, + ); + } + + Ok(( + transaction_id, + account_id_as_str, + init_account_state.to_owned(), + final_account_state.to_owned(), + input_notes, + output_notes.to_bytes(), + script_program, + script_hash, + script_inputs, + transaction_result.block_num().to_string(), + None, + )) +} + +pub async fn update_account( + new_account_state: Account, +) -> Result<(), ()> { + insert_account_storage(new_account_state.storage()).await; + insert_account_asset_vault(new_account_state.vault()).await; + insert_account_record(&new_account_state, None).await +} \ No newline at end of file diff --git a/wasm/src/web_client/sync.rs b/wasm/src/web_client/sync.rs index fc111459c..ab22bdcf0 100644 --- a/wasm/src/web_client/sync.rs +++ b/wasm/src/web_client/sync.rs @@ -6,15 +6,14 @@ use super::WebClient; impl WebClient { pub async fn sync_state( &mut self - ) -> () { + ) -> Result { if let Some(ref mut client) = self.get_mut_inner() { - let message = client.sync_state().await; - let js_value_message = JsValue::from_str(&message); - - // Print the message to the Chrome console - web_sys::console::log_1(&js_value_message); + let block_num = client.sync_state().await.unwrap(); + + let message = format!("State synced to block {}", block_num); + Ok(JsValue::from_str(&message)) } else { - web_sys::console::error_1(&"Client not initialized".into()); + Err(JsValue::from_str("Client not initialized")) } } } \ No newline at end of file diff --git a/wasm/src/web_client/transactions.rs b/wasm/src/web_client/transactions.rs index 84d91a467..a24760a6d 100644 --- a/wasm/src/web_client/transactions.rs +++ b/wasm/src/web_client/transactions.rs @@ -1,37 +1,61 @@ +use miden_objects::{ + accounts::AccountId, + assets::FungibleAsset, + crypto::rand::FeltRng, + notes::{ + NoteId, NoteType as MidenNoteType + } +}; + use super::WebClient; -use crate::native_code::store::NativeTransactionFilter; +use crate::native_code::{ + errors::NoteIdPrefixFetchError, + rpc::NodeRpcClient, + store::{ + note_record::InputNoteRecord, + NoteFilter, + Store, + TransactionFilter + }, + transactions::transaction_request::{ + PaymentTransactionData, TransactionTemplate + }, Client +}; use serde::{Serialize, Deserialize}; use serde_wasm_bindgen::from_value; use wasm_bindgen::prelude::*; use web_sys::console; -#[derive(Serialize, Deserialize)] -pub enum TransactionFilter { - All, - Uncomitted -} - #[derive(Serialize, Deserialize)] #[serde(tag = "type")] pub enum TransactionType { - /// Create a Pay To ID transaction. + /// Create a pay-to-id transaction. P2ID { sender_account_id: String, target_account_id: String, faucet_id: String, - amount: u64, + amount: String, + note_type: String, }, /// Mint `amount` tokens from the specified fungible faucet (corresponding to `faucet_id`). The created note can then be then consumed by /// `target_account_id`. Mint { target_account_id: String, faucet_id: String, - amount: u64, + amount: String, + note_type: String, + }, + /// Create a pay-to-id with recall transaction. + P2IDR { + sender_account_id: String, + target_account_id: String, + faucet_id: String, + amount: String, + recall_height: String, + note_type: String, }, - /// Create a Pay To ID with Recall transaction. - P2IDR, /// Consume with the account corresponding to `account_id` all of the notes from `list_of_notes`. ConsumeNotes { account_id: String, @@ -43,47 +67,187 @@ pub enum TransactionType { #[wasm_bindgen] impl WebClient { pub async fn get_transactions( - &mut self, - filter: JsValue - ) -> () { + &mut self + ) -> Result { if let Some(ref mut client) = self.get_mut_inner() { - let filter: TransactionFilter = from_value(filter).unwrap(); - let native_filter = match filter { - TransactionFilter::All => NativeTransactionFilter::All, - TransactionFilter::Uncomitted => NativeTransactionFilter::Uncomitted - }; - - let message = client.get_transactions(native_filter).await; - let js_value_message = JsValue::from_str(&message); - - // Print the message to the Chrome console - console::log_1(&js_value_message); + let transactions = client.get_transactions(TransactionFilter::All).await.unwrap(); + let formatted_transactions: Vec> = transactions.iter().map(|transaction| { + vec![ + transaction.id.to_string(), + transaction.transaction_status.to_string(), + transaction.account_id.to_string(), + transaction.transaction_script + .as_ref() + .map(|x| x.hash().to_string()) + .unwrap_or("-".to_string()), + transaction.input_note_nullifiers.len().to_string(), + transaction.output_notes.num_notes().to_string(), + ] + }).collect(); + + serde_wasm_bindgen::to_value(&formatted_transactions).map_err(|e| JsValue::from_str(&e.to_string())) } else { - console::error_1(&"Client not initialized".into()); + Err(JsValue::from_str("Client not initialized")) } } pub async fn new_transaction( &mut self, - //transaction_type: JsValue - ) -> () { + transaction_type: JsValue + ) -> Result { if let Some(ref mut client) = self.get_mut_inner() { - //let transaction_type: TransactionType = from_value(transaction_type).unwrap(); - //let transaction_template = build_transaction_template(client, transaction_type)?; - - let message = client.new_transaction().await; - let js_value_message = JsValue::from_str(&message); - - // Print the message to the Chrome console - console::log_1(&js_value_message); - - let message = client.send_transaction().await; - let js_value_message = JsValue::from_str(&message); - - // Print the message to the Chrome console - console::log_1(&js_value_message); + let transaction_type: TransactionType = from_value(transaction_type).unwrap(); + let transaction_template: TransactionTemplate = build_transaction_template(client, &transaction_type).await.unwrap(); + let transaction_request = client.build_transaction_request(transaction_template).await.unwrap(); + + let transaction_execution_result = client.new_transaction(transaction_request).await.unwrap(); + + client.submit_transaction(transaction_execution_result).await.unwrap(); + + Ok(JsValue::from_str("Transaction submitted successfully")) } else { - console::error_1(&"Client not initialized".into()); + Err(JsValue::from_str("Client not initialized")) } } +} + +fn parse_note_type( + note_type: String +) -> MidenNoteType { + match note_type.as_str() { + "Public" => MidenNoteType::Public, + "Private" => MidenNoteType::OffChain, + _ => MidenNoteType::OffChain + } +} + +async fn build_transaction_template( + client: &Client, + transaction_type: &TransactionType, +) -> Result { + match transaction_type { + TransactionType::P2ID { + sender_account_id, + target_account_id, + faucet_id, + amount, + note_type, + } => { + let note_type: MidenNoteType = parse_note_type(note_type.to_string()); + let amount_as_u64: u64 = amount.parse::().map_err(|err| err.to_string())?; + + let faucet_id = AccountId::from_hex(faucet_id).map_err(|err| err.to_string())?; + let fungible_asset = + FungibleAsset::new(faucet_id, amount_as_u64).map_err(|err| err.to_string())?.into(); + let sender_account_id = + AccountId::from_hex(sender_account_id).map_err(|err| err.to_string())?; + let target_account_id = + AccountId::from_hex(target_account_id).map_err(|err| err.to_string())?; + + let payment_transaction = + PaymentTransactionData::new(fungible_asset, sender_account_id, target_account_id); + + Ok(TransactionTemplate::PayToId(payment_transaction, note_type)) + }, + TransactionType::P2IDR { + sender_account_id, + target_account_id, + faucet_id, + amount, + recall_height, + note_type, + } => { + let note_type: MidenNoteType = parse_note_type(note_type.to_string()); + let amount_as_u64: u64 = amount.parse::().map_err(|err| err.to_string())?; + let recall_height_as_u32: u32 = recall_height.parse::().map_err(|err| err.to_string())?; + + let faucet_id = AccountId::from_hex(faucet_id).map_err(|err| err.to_string())?; + let fungible_asset = + FungibleAsset::new(faucet_id, amount_as_u64).map_err(|err| err.to_string())?.into(); + let sender_account_id = + AccountId::from_hex(sender_account_id).map_err(|err| err.to_string())?; + let target_account_id = + AccountId::from_hex(target_account_id).map_err(|err| err.to_string())?; + + let payment_transaction = + PaymentTransactionData::new(fungible_asset, sender_account_id, target_account_id); + Ok(TransactionTemplate::PayToIdWithRecall( + payment_transaction, + recall_height_as_u32, + note_type, + )) + }, + TransactionType::Mint { + faucet_id, + target_account_id, + amount, + note_type, + } => { + let note_type: MidenNoteType = parse_note_type(note_type.to_string()); + let amount_as_u64: u64 = amount.parse::().map_err(|err| err.to_string())?; + + let faucet_id = AccountId::from_hex(faucet_id).map_err(|err| err.to_string())?; + let fungible_asset = + FungibleAsset::new(faucet_id, amount_as_u64).map_err(|err| err.to_string())?; + let target_account_id = + AccountId::from_hex(target_account_id).map_err(|err| err.to_string())?; + + Ok(TransactionTemplate::MintFungibleAsset( + fungible_asset, + target_account_id, + note_type, + )) + }, + TransactionType::ConsumeNotes { account_id, list_of_notes } => { + let mut note_ids = Vec::new(); + for note_id in list_of_notes.iter() { + let note_record = get_note_with_id_prefix(client, note_id).await + .unwrap(); + note_ids.push(note_record.id()); + } + let list_of_notes = note_ids; // now contains Vec + + let account_id = AccountId::from_hex(account_id).map_err(|err| err.to_string())?; + + Ok(TransactionTemplate::ConsumeNotes(account_id, list_of_notes)) + }, + } +} + +/// Returns all client's notes whose ID starts with `note_id_prefix` +/// +/// # Errors +/// +/// - Returns [NoteIdPrefixFetchError::NoMatch] if we were unable to find any note where +/// `note_id_prefix` is a prefix of its id. +/// - Returns [NoteIdPrefixFetchError::MultipleMatches] if there were more than one note found +/// where `note_id_prefix` is a prefix of its id. +pub(crate) async fn get_note_with_id_prefix( + client: &Client, + note_id_prefix: &str, +) -> Result { + let input_note_records = client + .get_input_notes(NoteFilter::All).await + .map_err(|err| NoteIdPrefixFetchError::NoMatch(note_id_prefix.to_string()))? + .into_iter() + .filter(|note_record| note_record.id().to_hex().starts_with(note_id_prefix)) + .collect::>(); + + if input_note_records.is_empty() { + return Err(NoteIdPrefixFetchError::NoMatch(note_id_prefix.to_string())); + } + if input_note_records.len() > 1 { + let input_note_record_ids = input_note_records + .iter() + .map(|input_note_record| input_note_record.id()) + .collect::>(); + tracing::error!( + "Multiple notes found for the prefix {}: {:?}", + note_id_prefix, + input_note_record_ids + ); + return Err(NoteIdPrefixFetchError::MultipleMatches(note_id_prefix.to_string())); + } + + Ok(input_note_records[0].clone()) } \ No newline at end of file diff --git a/wasm/test.html b/wasm/test.html index b70deb741..13a250492 100644 --- a/wasm/test.html +++ b/wasm/test.html @@ -187,7 +187,7 @@ } let webClient = await testCreateClient(); - await testStoreAndRpc(webClient); + //await testStoreAndRpc(webClient); // await testNewAccount(webClient); // await testGetAccounts(webClient); From 722ca073700b626d36d2390e54cd1557b4a6827d Mon Sep 17 00:00:00 2001 From: Dennis Garcia Date: Sun, 5 May 2024 20:59:22 -0500 Subject: [PATCH 16/42] Accounts Fully Working + Basic Sync Working (#14) --- wasm/js/db/chainData.js | 19 ++++++++- wasm/js/db/schema.js | 2 +- wasm/js/db/sync.js | 39 ++++++++++++++++--- wasm/js/db/transactions.js | 7 +++- wasm/src/native_code/sync.rs | 3 +- wasm/src/web_client/account.rs | 5 +-- wasm/src/web_client/mod.rs | 6 --- wasm/src/web_client/rpc/mod.rs | 4 +- wasm/src/web_client/store/accounts/mod.rs | 4 -- wasm/src/web_client/store/chain_data/mod.rs | 30 ++++++++++---- wasm/src/web_client/store/transactions/mod.rs | 2 +- wasm/test.html | 8 ++-- 12 files changed, 90 insertions(+), 39 deletions(-) diff --git a/wasm/js/db/chainData.js b/wasm/js/db/chainData.js index 19b0e9b3e..c3efd9369 100644 --- a/wasm/js/db/chainData.js +++ b/wasm/js/db/chainData.js @@ -54,6 +54,21 @@ export async function getBlockHeaders( ); const results = await Promise.all(blockHeaderPromises); + + // replace any undefined values with null + results.forEach((result, index) => { + if (result === undefined) { + results[index] = null; + } else { + results[index] = { + block_num: results[index].blockNum, + header: results[index].header, + chain_mmr: results[index].chainMmrPeaks, + has_client_notes: results[index].hasClientNotes + } + } + }); + return results } catch (err) { console.error("Failed to get block headers: ", err); @@ -80,7 +95,9 @@ export async function getChainMmrPeaksByBlockNum( ) { try { const blockHeader = await blockHeaders.get(blockNum); - return blockHeader.chainMmrPeaks; + return { + peaks: blockHeader.chainMmrPeaks + }; } catch (err) { console.error("Failed to get chain mmr peaks: ", err); throw err; diff --git a/wasm/js/db/schema.js b/wasm/js/db/schema.js index 09e143b58..33ec49c16 100644 --- a/wasm/js/db/schema.js +++ b/wasm/js/db/schema.js @@ -55,7 +55,7 @@ function indexes(...items) { db.on('populate', () => { // Populate the stateSync table with default values - db.stateSync.put({ id: 1, blockNum: 0, tags: [] }); + db.stateSync.put({ id: 1, blockNum: "0", tags: [] }); }); const accountCodes = db.table(Table.AccountCode); diff --git a/wasm/js/db/sync.js b/wasm/js/db/sync.js index 16c652ee4..71925992a 100644 --- a/wasm/js/db/sync.js +++ b/wasm/js/db/sync.js @@ -27,8 +27,10 @@ export async function getSyncHeight() { try { const record = await stateSync.get(1); // Since id is the primary key and always 1 if (record) { - console.log('Retrieved record:', record); - return record.blockNum; // Accessing blockNum directly from the record + let data = { + block_num: record.blockNum + }; + return data; } else { console.log('No record found with id: 1'); return null; @@ -52,16 +54,26 @@ export async function addNoteTag( export async function applyStateSync( blockNum, + nullifiers, blockHeader, chainMmrPeaks, - nullifiers, + hasClientNotes, + nodeIndices, + nodes, noteIds, inclusionProofs, transactionIds, - nodeIndices, - nodes, - hasClientNotes ) { + console.log('blockNum: ', blockNum) + console.log('blockHeader: ', blockHeader) + console.log('chainMmrPeaks: ', chainMmrPeaks) + console.log('nullifiers: ', nullifiers) + console.log('noteIds: ', noteIds) + console.log('inclusionProofs: ', inclusionProofs) + console.log('transactionIds: ', transactionIds) + console.log('nodeIndices: ', nodeIndices) + console.log('nodes: ', nodes) + console.log('hasClientNotes: ', hasClientNotes) return db.transaction('rw', stateSync, inputNotes, outputNotes, transactions, blockHeaders, async (tx) => { await updateSyncHeight(tx, blockNum); await updateSpentNotes(tx, nullifiers); @@ -163,6 +175,11 @@ async function updateChainMmrNodes( throw new Error("nodeIndices and nodes arrays must be of the same length"); } + if (nodeIndices.length === 0) { + console.log("No chain MMR nodes to update"); + return; + } + // Create the updates array with objects matching the structure expected by your IndexedDB schema const updates = nodeIndices.map((index, i) => ({ index: index, // Assuming 'index' is the primary key or part of it @@ -188,6 +205,11 @@ async function updateCommittedNotes( throw new Error("Arrays noteIds and inclusionProofs must be of the same length"); } + if (noteIds.length === 0) { + console.log("No notes to update"); + return; + } + for (let i = 0; i < noteIds.length; i++) { const noteId = noteIds[i]; const inclusionProof = inclusionProofs[i]; @@ -216,6 +238,11 @@ async function updateCommittedTransactions( transactionIds ) { try { + if (transactionIds.length === 0) { + console.log("No transactions to update"); + return; + } + const updates = transactionIds.map(transactionId => ({ id: transactionId, commitHeight: blockNum diff --git a/wasm/js/db/transactions.js b/wasm/js/db/transactions.js index 259511ae7..fbcf9877d 100644 --- a/wasm/js/db/transactions.js +++ b/wasm/js/db/transactions.js @@ -10,10 +10,15 @@ export async function getTransactions( try { if (filter === 'Uncomitted') { - transactionRecords = await transactions.where("commitHeight").equals(null).toArray(); + transactionRecords = await transactions.filter(tx => tx.commitHeight === undefined).toArray(); } else { transactionRecords = await transactions.toArray(); } + + if (transactionRecords.length === 0) { + return []; + } + const scriptHashes = transactionRecords.map(transactionRecord => transactionRecord.scriptHash); const scripts = await transactionScripts.where("scriptHash").anyOf(scriptHashes).toArray(); diff --git a/wasm/src/native_code/sync.rs b/wasm/src/native_code/sync.rs index 0b09572fb..a637f1903 100644 --- a/wasm/src/native_code/sync.rs +++ b/wasm/src/native_code/sync.rs @@ -173,7 +173,7 @@ impl Client { self.get_note_details(response.note_inclusions, &response.block_header).await?; let (onchain_accounts, offchain_accounts): (Vec<_>, Vec<_>) = - accounts.into_iter().partition(|account_stub| account_stub.id().is_on_chain()); + accounts.into_iter().partition(|account_stub: &AccountStub| account_stub.id().is_on_chain()); let updated_onchain_accounts = self .get_updated_onchain_accounts(&response.account_hash_updates, &onchain_accounts) @@ -332,7 +332,6 @@ impl Client { /// track it here. pub(crate) async fn build_current_partial_mmr(&self) -> Result { let current_block_num = self.store.get_sync_height().await?; - let tracked_nodes = self.store.get_chain_mmr_nodes(ChainMmrNodeFilter::All).await?; let current_peaks = self.store.get_chain_mmr_peaks_by_block_num(current_block_num).await?; diff --git a/wasm/src/web_client/account.rs b/wasm/src/web_client/account.rs index ed5fcdb9e..55047517e 100644 --- a/wasm/src/web_client/account.rs +++ b/wasm/src/web_client/account.rs @@ -89,11 +89,10 @@ impl WebClient { }; match client.new_account(client_template).await { - Ok((account, word)) => { + Ok((account, _)) => { // Create a struct or tuple to hold both values - let result = (account, word); // Convert directly to JsValue - serde_wasm_bindgen::to_value(&result).map_err(|e| JsValue::from_str(&e.to_string())) + serde_wasm_bindgen::to_value(&account.id().to_string()).map_err(|e| JsValue::from_str(&e.to_string())) }, Err(err) => { let error_message = format!("Failed to create new account: {:?}", err); diff --git a/wasm/src/web_client/mod.rs b/wasm/src/web_client/mod.rs index 970e5e712..52a353c35 100644 --- a/wasm/src/web_client/mod.rs +++ b/wasm/src/web_client/mod.rs @@ -41,18 +41,12 @@ impl WebClient { pub async fn create_client(&mut self) -> Result { web_sys::console::log_1(&JsValue::from_str("create_client_1")); let rng = get_random_coin(); - web_sys::console::log_1(&JsValue::from_str("create_client_2")); let web_store: WebStore = WebStore::new().await.map_err(|_| JsValue::from_str("Failed to initialize WebStore"))?; - web_sys::console::log_1(&JsValue::from_str("create_client_3")); let web_rpc_client = WebRpcClient::new("http://localhost:57291"); - web_sys::console::log_1(&JsValue::from_str("create_client_4")); let executor_store = WebStore::new().await.map_err(|_| JsValue::from_str("Failed to initialize ExecutorStore"))?; - web_sys::console::log_1(&JsValue::from_str("create_client_5")); self.inner = Some(Client::new(web_rpc_client, rng, web_store, executor_store)); - web_sys::console::log_1(&JsValue::from_str("create_client_5")); - Ok(JsValue::from_str("Client created successfully")) } } \ No newline at end of file diff --git a/wasm/src/web_client/rpc/mod.rs b/wasm/src/web_client/rpc/mod.rs index bbed22baa..d391a714b 100644 --- a/wasm/src/web_client/rpc/mod.rs +++ b/wasm/src/web_client/rpc/mod.rs @@ -53,8 +53,8 @@ impl WebRpcClient { } fn build_client() -> ApiClient { - let base_url = "http://localhost:8080".to_string(); // for use with envoy proxy - // let base_url = "http://localhost:57291".to_string(); // for use without envoy proxy + // let base_url = "http://localhost:8080".to_string(); // for use with envoy proxy + let base_url = "http://localhost:57291".to_string(); // for use without envoy proxy let wasm_client = Client::new(base_url); ApiClient::new(wasm_client) diff --git a/wasm/src/web_client/store/accounts/mod.rs b/wasm/src/web_client/store/accounts/mod.rs index e1dc50a48..8a1d85983 100644 --- a/wasm/src/web_client/store/accounts/mod.rs +++ b/wasm/src/web_client/store/accounts/mod.rs @@ -95,13 +95,9 @@ impl WebStore { account_id: AccountId ) -> Result<(Account, Option), StoreError> { let (account_stub, seed) = self.get_account_stub(account_id).await.unwrap(); - let (_procedures, module_ast) = self.get_account_code(account_stub.code_root()).await.unwrap(); - let account_code = AccountCode::new(module_ast, &TransactionKernel::assembler()).unwrap(); - let account_storage = self.get_account_storage(account_stub.storage_root()).await.unwrap(); - let account_vault = self.get_vault_assets(account_stub.vault_root()).await.unwrap(); let account_vault = AssetVault::new(&account_vault).unwrap(); diff --git a/wasm/src/web_client/store/chain_data/mod.rs b/wasm/src/web_client/store/chain_data/mod.rs index 99959bd03..7e790a81f 100644 --- a/wasm/src/web_client/store/chain_data/mod.rs +++ b/wasm/src/web_client/store/chain_data/mod.rs @@ -54,14 +54,28 @@ impl WebStore { let promise = idxdb_get_block_headers(formatted_block_numbers_list); let js_value = JsFuture::from(promise).await.unwrap(); - let block_headers_idxdb: Vec = from_value(js_value).unwrap(); - - let results:Result, StoreError> = block_headers_idxdb.into_iter().map(|record| { - let block_header = serde_json::from_str(&record.header).map_err(StoreError::JsonDataDeserializationError)?; - let has_client_notes = record.has_client_notes; - - Ok((block_header, has_client_notes)) - }).collect(); + let block_headers_idxdb: Vec> = from_value(js_value).unwrap(); + + // Transform the list of Option to a list of results + let results: Result, StoreError> = block_headers_idxdb.into_iter() + .enumerate() // Adding enumerate for better error tracking/logging + .filter_map(|(index, record_option)| { + match record_option { + Some(record) => Some(Ok(record)), + None => { + None // Skip over missing records instead of erroring out + }, + } + }) + .map(|record_result: Result |{ + let record = record_result?; + let block_header = serde_json::from_str(&record.header) + .map_err(StoreError::JsonDataDeserializationError)?; + let has_client_notes = record.has_client_notes; + + Ok((block_header, has_client_notes)) + }) + .collect(); // Collects into Result, StoreError> return results; } diff --git a/wasm/src/web_client/store/transactions/mod.rs b/wasm/src/web_client/store/transactions/mod.rs index 69601100f..7e7081d77 100644 --- a/wasm/src/web_client/store/transactions/mod.rs +++ b/wasm/src/web_client/store/transactions/mod.rs @@ -35,7 +35,7 @@ use utils::*; impl WebStore { pub async fn get_transactions( - &mut self, + &self, filter: TransactionFilter ) -> Result, StoreError> { let filter_as_str = match filter { diff --git a/wasm/test.html b/wasm/test.html index 13a250492..5063fdde4 100644 --- a/wasm/test.html +++ b/wasm/test.html @@ -91,7 +91,7 @@ async function testGetAccount(webClient) { try { - let result = await webClient.get_account("0x8d911ae1789cdb33"); + let result = await webClient.get_account("0x9daeab54109472e8"); console.log(result); } catch (error) { @@ -178,8 +178,8 @@ async function testSyncState(webClient) { try { - await webClient.sync_state(); - + let result = await webClient.sync_state(); + console.log(result); } catch (error) { console.error('Failed to call sync state:', error); @@ -202,7 +202,7 @@ // await testGetTransactions(webClient); // await testNewTransaction(webClient); - // await testSyncState(webClient); + await testSyncState(webClient); \ No newline at end of file From a40071a902b90ea0419a31cd461b8293bde3de89 Mon Sep 17 00:00:00 2001 From: Dennis Garcia Date: Fri, 10 May 2024 11:20:10 -0500 Subject: [PATCH 17/42] Miden-Client Transaction Example Working on Browser (#15) --- wasm/Cargo.toml | 1 + wasm/js/db/notes.js | 74 ++++++++++++++++++------ wasm/js/db/schema.js | 2 +- wasm/js/db/sync.js | 29 ++-------- wasm/js/db/transactions.js | 56 ++++++++++++------ wasm/rollup.config.js | 1 + wasm/src/web_client/mod.rs | 1 - wasm/src/web_client/store/notes/mod.rs | 2 - wasm/src/web_client/store/notes/utils.rs | 11 ++-- wasm/src/web_client/transactions.rs | 4 ++ wasm/test.html | 66 ++++++++++++++++++--- 11 files changed, 167 insertions(+), 80 deletions(-) diff --git a/wasm/Cargo.toml b/wasm/Cargo.toml index 5ae9bd70a..a58b01664 100644 --- a/wasm/Cargo.toml +++ b/wasm/Cargo.toml @@ -16,6 +16,7 @@ concurrent = [ ] default = ["std"] std = ["miden-objects/std"] +testing = ["miden-objects/testing", "miden-lib/testing"] [dependencies] async-trait = "0.1" diff --git a/wasm/js/db/notes.js b/wasm/js/db/notes.js index 28128ecb4..2f895b41f 100644 --- a/wasm/js/db/notes.js +++ b/wasm/js/db/notes.js @@ -1,4 +1,5 @@ import { + db, inputNotes, outputNotes, notesScripts, @@ -14,12 +15,12 @@ export async function getOutputNotes( if (status === 'All') { notes = await outputNotes.toArray(); } else { - notes = await outputNotes.where('status').equals(status.toLowerCase()).toArray(); + notes = await outputNotes.where('status').equals(status).toArray(); } // Fetch all scripts from the scripts table for joining const scripts = await notesScripts.toArray(); - const scriptMap = new Map(scripts.map(script => [script.script_hash, script.serialized_note_script])); + const scriptMap = new Map(scripts.map(script => [script.scriptHash, script.serializedNoteScript])); // Process each note to convert 'blobField' from Blob to Uint8Array const processedNotes = await Promise.all(notes.map(async note => { @@ -28,17 +29,28 @@ export async function getOutputNotes( const assetsBase64 = uint8ArrayToBase64(assetsArray); note.assets = assetsBase64; + let serializedNoteScriptBase64 = null; // Parse details JSON and perform a "join" if (note.details) { const details = JSON.parse(note.details); if (details.script_hash) { - note.serialized_note_script = scriptMap.get(details.script_hash) || null; + let serializedNoteScript = scriptMap.get(details.script_hash); + let serializedNoteScriptArrayBuffer = await serializedNoteScript.arrayBuffer(); + const serializedNoteScriptArray = new Uint8Array(serializedNoteScriptArrayBuffer); + serializedNoteScriptBase64 = uint8ArrayToBase64(serializedNoteScriptArray); } } - return note; + return { + assets: note.assets, + details: note.details ? note.details : null, + recipient: note.recipient, + status: note.status, + metadata: note.metadata, + inclusion_proof: note.inclusionProof ? note.inclusionProof : null, + serialized_note_script: serializedNoteScriptBase64 + }; })); - return processedNotes; } catch { console.error("Failed to get input notes: ", err); @@ -56,12 +68,11 @@ export async function getInputNotes( if (status === 'All') { notes = await inputNotes.toArray(); } else { - notes = await inputNotes.where('status').equals(status.toLowerCase()).toArray(); + notes = await inputNotes.where('status').equals(status).toArray(); } - // Fetch all scripts from the scripts table for joining const scripts = await notesScripts.toArray(); - const scriptMap = new Map(scripts.map(script => [script.script_hash, script.serialized_note_script])); + const scriptMap = new Map(scripts.map(script => [script.scriptHash, script.serializedNoteScript])); // Process each note to convert 'blobField' from Blob to Uint8Array const processedNotes = await Promise.all(notes.map(async note => { @@ -70,17 +81,28 @@ export async function getInputNotes( const assetsBase64 = uint8ArrayToBase64(assetsArray); note.assets = assetsBase64; + let serializedNoteScriptBase64 = null; // Parse details JSON and perform a "join" if (note.details) { const details = JSON.parse(note.details); if (details.script_hash) { - note.serialized_note_script = scriptMap.get(details.script_hash) || null; + let serializedNoteScript = scriptMap.get(details.script_hash); + let serializedNoteScriptArrayBuffer = await serializedNoteScript.arrayBuffer(); + const serializedNoteScriptArray = new Uint8Array(serializedNoteScriptArrayBuffer); + serializedNoteScriptBase64 = uint8ArrayToBase64(serializedNoteScriptArray); } } - return note; + return { + assets: note.assets, + details: note.details, + recipient: note.recipient, + status: note.status, + metadata: note.metadata ? note.metadata : null, + inclusion_proof: note.inclusionProof ? note.inclusionProof : null, + serialized_note_script: serializedNoteScriptBase64 + }; })); - return processedNotes; } catch { console.error("Failed to get input notes: ", err); @@ -98,22 +120,36 @@ export async function getInputNote( const assetsArray = new Uint8Array(assetsArrayBuffer); const assetsBase64 = uint8ArrayToBase64(assetsArray); + + let serializedNoteScriptBase64 = null; if (note.details) { const details = JSON.parse(note.details); if (details.script_hash) { - const script = await notesScripts.get(details.script_hash); - note.serialized_note_script = script ? script.serialized_note_script : null; + let noteScriptRecord = await notesScripts.get(details.script_hash); + let serializedNoteScript = noteScriptRecord.serializedNoteScript; + let serializedNoteScriptArrayBuffer = await serializedNoteScript.arrayBuffer(); + let serializedNoteScriptArray = new Uint8Array(serializedNoteScriptArrayBuffer); + serializedNoteScriptBase64 = uint8ArrayToBase64(serializedNoteScriptArray); } } note.assets = assetsBase64 - return note + const data = { + assets: note.assets, + details: note.details, + recipient: note.recipient, + status: note.status, + metadata: note.metadata ? note.metadata : null, + inclusion_proof: note.inclusionProof ? note.inclusionProof : null, + serialized_note_script: serializedNoteScriptBase64 + } + + return data; } catch { console.error("Failed to get input note: ", err); throw err; } - } export async function insertInputNote( @@ -137,8 +173,8 @@ export async function insertInputNote( assets: assetsBlob, recipient: recipient, status: status, - metadata: metadata ? JSON.stringify(metadata) : null, - details: JSON.stringify(details), + metadata: metadata ? metadata : null, + details: details, inclusionProof: inclusionProof ? JSON.stringify(inclusionProof) : null, }; @@ -183,8 +219,8 @@ export async function insertOutputNote( assets: assetsBlob, recipient: recipient, status: status, - metadata: JSON.stringify(metadata), - details: details ? JSON.stringify(details) : null, + metadata: metadata, + details: details ? details : null, inclusionProof: inclusionProof ? JSON.stringify(inclusionProof) : null, }; diff --git a/wasm/js/db/schema.js b/wasm/js/db/schema.js index 33ec49c16..5ab253068 100644 --- a/wasm/js/db/schema.js +++ b/wasm/js/db/schema.js @@ -45,7 +45,7 @@ db.version(1).stores({ [Table.NotesScripts]: indexes('scriptHash'), [Table.StateSync]: indexes('id'), [Table.BlockHeaders]: indexes('blockNum'), - [Table.ChainMmrNodes]: indexes('blockNum', 'hasClientNotes'), + [Table.ChainMmrNodes]: indexes('id'), [Table.Greet]: '++id', }); diff --git a/wasm/js/db/sync.js b/wasm/js/db/sync.js index 71925992a..544ad032d 100644 --- a/wasm/js/db/sync.js +++ b/wasm/js/db/sync.js @@ -5,16 +5,15 @@ import { outputNotes, transactions, blockHeaders, + chainMmrNodes, } from './schema.js'; export async function getNoteTags() { try { const record = await stateSync.get(1); // Since id is the primary key and always 1 if (record) { - console.log('Retrieved record:', record); return record.tags; } else { - console.log('No record found with id: 1'); return null; } } catch (error) { @@ -32,7 +31,6 @@ export async function getSyncHeight() { }; return data; } else { - console.log('No record found with id: 1'); return null; } } catch (error) { @@ -64,17 +62,7 @@ export async function applyStateSync( inclusionProofs, transactionIds, ) { - console.log('blockNum: ', blockNum) - console.log('blockHeader: ', blockHeader) - console.log('chainMmrPeaks: ', chainMmrPeaks) - console.log('nullifiers: ', nullifiers) - console.log('noteIds: ', noteIds) - console.log('inclusionProofs: ', inclusionProofs) - console.log('transactionIds: ', transactionIds) - console.log('nodeIndices: ', nodeIndices) - console.log('nodes: ', nodes) - console.log('hasClientNotes: ', hasClientNotes) - return db.transaction('rw', stateSync, inputNotes, outputNotes, transactions, blockHeaders, async (tx) => { + return db.transaction('rw', stateSync, inputNotes, outputNotes, transactions, blockHeaders, chainMmrNodes, async (tx) => { await updateSyncHeight(tx, blockNum); await updateSpentNotes(tx, nullifiers); await updateBlockHeader(tx, blockNum, blockHeader, chainMmrPeaks, hasClientNotes); @@ -90,7 +78,6 @@ async function updateSyncHeight( ) { try { await tx.stateSync.update(1, { blockNum: blockNum }); - console.log("Sync height updated successfully."); } catch (error) { console.error("Failed to update sync height: ", error); throw error; @@ -134,7 +121,6 @@ async function updateSpentNotes( } } - console.log("Spent notes have been updated successfully."); } catch (error) { console.error("Error updating input notes:", error); throw error; @@ -157,7 +143,6 @@ async function updateBlockHeader( }; await tx.blockHeaders.add(data); - console.log(`Block header for block ${blockNum} inserted successfully.`); } catch (err) { console.error("Failed to insert block header: ", err); throw error; @@ -176,19 +161,17 @@ async function updateChainMmrNodes( } if (nodeIndices.length === 0) { - console.log("No chain MMR nodes to update"); return; } // Create the updates array with objects matching the structure expected by your IndexedDB schema const updates = nodeIndices.map((index, i) => ({ - index: index, // Assuming 'index' is the primary key or part of it + id: index, // Assuming 'index' is the primary key or part of it node: nodes[i] // Other attributes of the object })); // Perform bulk update or insertion; assumes tx.chainMmrNodes is a valid table reference in a transaction await tx.chainMmrNodes.bulkAdd(updates); - console.log("Successfully updated chain MMR nodes"); } catch (err) { console.error("Failed to update chain mmr nodes: ", err); throw error; @@ -206,7 +189,6 @@ async function updateCommittedNotes( } if (noteIds.length === 0) { - console.log("No notes to update"); return; } @@ -217,13 +199,13 @@ async function updateCommittedNotes( // Update input notes await tx.inputNotes.where({ noteId: noteId }).modify({ status: 'Committed', - inclusion_proof: inclusionProof + inclusionProof: inclusionProof }); // Update output notes await tx.outputNotes.where({ noteId: noteId }).modify({ status: 'Committed', - inclusion_proof: inclusionProof + inclusionProof: inclusionProof }); } } catch (error) { @@ -239,7 +221,6 @@ async function updateCommittedTransactions( ) { try { if (transactionIds.length === 0) { - console.log("No transactions to update"); return; } diff --git a/wasm/js/db/transactions.js b/wasm/js/db/transactions.js index fbcf9877d..c766e91c9 100644 --- a/wasm/js/db/transactions.js +++ b/wasm/js/db/transactions.js @@ -10,7 +10,7 @@ export async function getTransactions( try { if (filter === 'Uncomitted') { - transactionRecords = await transactions.filter(tx => tx.commitHeight === undefined).toArray(); + transactionRecords = await transactions.filter(tx => tx.commitHeight === undefined || tx.commitHeight === null).toArray(); } else { transactionRecords = await transactions.toArray(); } @@ -19,29 +19,37 @@ export async function getTransactions( return []; } - const scriptHashes = transactionRecords.map(transactionRecord => transactionRecord.scriptHash); + const scriptHashes = await Promise.all(transactionRecords.map(async transactionRecord => { + const scriptHashArrayBuffer = await transactionRecord.scriptHash.arrayBuffer(); + const scriptHashArray = new Uint8Array(scriptHashArrayBuffer); + const scriptHashBase64 = uint8ArrayToBase64(scriptHashArray); + return scriptHashBase64; + })); + const scripts = await transactionScripts.where("scriptHash").anyOf(scriptHashes).toArray(); // Create a map of scriptHash to script for quick lookup - const scriptMap = scripts.reduce((map, script) => { - map[script.scriptHash] = script.program; - return map; - }, {}); + const scriptMap = new Map(); + scripts.forEach(script => { + scriptMap.set(script.scriptHash, script.program); + }); const processedTransactions = await Promise.all(transactionRecords.map(async transactionRecord => { let scriptHashBase64 = null; let scriptProgramBase64 = null; - if (transactionRecord.scriptHash !== null) { + if (transactionRecord.scriptHash) { let scriptHashArrayBuffer = await transactionRecord.scriptHash.arrayBuffer(); let scriptHashArray = new Uint8Array(scriptHashArrayBuffer); scriptHashBase64 = uint8ArrayToBase64(scriptHashArray); - } - if (transactionRecord.scriptProgram !== null) { - let scriptProgramArrayBuffer = await transactionRecord.scriptProgram.arrayBuffer(); - let scriptProgramArray = new Uint8Array(scriptProgramArrayBuffer); - scriptProgramBase64 = uint8ArrayToBase64(scriptProgramArray); + const scriptProgram = scriptMap.get(scriptHashBase64); + if (scriptProgram) { + let scriptProgramArrayBuffer = await scriptProgram.arrayBuffer(); + let scriptProgramArray = new Uint8Array(scriptProgramArrayBuffer); + scriptProgramBase64 = uint8ArrayToBase64(scriptProgramArray); + + } } let outputNotesArrayBuffer = await transactionRecord.outputNotes.arrayBuffer(); @@ -49,10 +57,22 @@ export async function getTransactions( let outputNotesBase64 = uint8ArrayToBase64(outputNotesArray); transactionRecord.scriptHash = scriptHashBase64; - transactionRecord.scriptProgram = scriptProgramBase64; transactionRecord.outputNotes = outputNotesBase64; - return transactionRecord; + + return { + id: transactionRecord.id, + account_id: transactionRecord.accountId, + init_account_state: transactionRecord.initAccountState, + final_account_state: transactionRecord.finalAccountState, + input_notes: transactionRecord.inputNotes, + output_notes: transactionRecord.outputNotes, + script_hash: transactionRecord.scriptHash ? transactionRecord.scriptHash : null, + script_program: scriptProgramBase64, + script_inputs: transactionRecord.scriptInputs ? transactionRecord.scriptInputs : null, + block_num: transactionRecord.blockNum, + commit_height: transactionRecord.commitHeight + }; })); return processedTransactions @@ -71,14 +91,14 @@ export async function insertTransactionScript( // check if script hash already exists let record = await transactionScripts.where("scriptHash").equals(scriptHash).first(); if (record !== undefined) { - console.log("Transaction script already exists, ignoring."); return; } if (scriptHash === null) { throw new Error("Script hash must be provided"); } - let scriptHashBlob = new Blob([new Uint8Array(scriptHash)]); + let scriptHashArray = new Uint8Array(scriptHash); + let scriptHashBase64 = uint8ArrayToBase64(scriptHashArray); let scriptProgramBlob = null; if (scriptProgram !== null) { @@ -86,15 +106,15 @@ export async function insertTransactionScript( } const data = { - scriptHash: scriptHashBlob, + scriptHash: scriptHashBase64, program: scriptProgramBlob } + await transactionScripts.add(data); } catch (error) { // Check if the error is because the record already exists if (error.name === 'ConstraintError') { - console.log("Transaction script already exists, ignoring."); } else { // Re-throw the error if it's not a constraint error throw error; diff --git a/wasm/rollup.config.js b/wasm/rollup.config.js index a12cdcb04..07882fad1 100644 --- a/wasm/rollup.config.js +++ b/wasm/rollup.config.js @@ -17,6 +17,7 @@ export default [ rust({ cargoArgs: [ // This enables multi-threading + "--features", "testing", // Add this line to include the concurrent feature "--config", `build.rustflags=["-C", "target-feature=+atomics,+bulk-memory,+mutable-globals", "-C", "link-arg=--max-memory=4294967296"]`, "--no-default-features", "-Z", "build-std=panic_abort,std", diff --git a/wasm/src/web_client/mod.rs b/wasm/src/web_client/mod.rs index 52a353c35..f8950d952 100644 --- a/wasm/src/web_client/mod.rs +++ b/wasm/src/web_client/mod.rs @@ -39,7 +39,6 @@ impl WebClient { // Exposed method to JS to create an internal client pub async fn create_client(&mut self) -> Result { - web_sys::console::log_1(&JsValue::from_str("create_client_1")); let rng = get_random_coin(); let web_store: WebStore = WebStore::new().await.map_err(|_| JsValue::from_str("Failed to initialize WebStore"))?; let web_rpc_client = WebRpcClient::new("http://localhost:57291"); diff --git a/wasm/src/web_client/store/notes/mod.rs b/wasm/src/web_client/store/notes/mod.rs index 2e25c0354..ccd41bab1 100644 --- a/wasm/src/web_client/store/notes/mod.rs +++ b/wasm/src/web_client/store/notes/mod.rs @@ -176,7 +176,6 @@ impl WebStore { let output_notes_idxdb: Vec = from_value(js_value).unwrap(); let native_output_notes: Result, StoreError> = output_notes_idxdb.into_iter().map(|note_idxdb| { - let note_details: Option = if let Some(details_as_json_str) = note_idxdb.details { // Merge the info that comes from the input notes table and the notes script table let serialized_note_script = note_idxdb.serialized_note_script @@ -198,7 +197,6 @@ impl WebStore { let note_metadata: NoteMetadata = serde_json::from_str(¬e_idxdb.metadata).map_err(StoreError::JsonDataDeserializationError)?; - let note_assets = NoteAssets::read_from_bytes(¬e_idxdb.assets)?; let inclusion_proof = match note_idxdb.inclusion_proof { diff --git a/wasm/src/web_client/store/notes/utils.rs b/wasm/src/web_client/store/notes/utils.rs index 2c721190c..d459530e8 100644 --- a/wasm/src/web_client/store/notes/utils.rs +++ b/wasm/src/web_client/store/notes/utils.rs @@ -111,7 +111,7 @@ pub async fn insert_input_note_tx( inclusion_proof ) = serialize_input_note(note)?; - let result = JsFuture::from(idxdb_insert_input_note( + let promise = idxdb_insert_input_note( note_id, assets, recipient, @@ -121,11 +121,10 @@ pub async fn insert_input_note_tx( note_script_hash, serialized_note_script, inclusion_proof - )).await; - match result { - Ok(_) => Ok(()), - Err(_) => Err(StoreError::QueryError("Failed to insert input note".to_string())), - } + ); + JsFuture::from(promise).await.unwrap(); + + Ok(()) } pub(crate) fn serialize_output_note( diff --git a/wasm/src/web_client/transactions.rs b/wasm/src/web_client/transactions.rs index a24760a6d..19c0a9f17 100644 --- a/wasm/src/web_client/transactions.rs +++ b/wasm/src/web_client/transactions.rs @@ -25,6 +25,7 @@ use crate::native_code::{ use serde::{Serialize, Deserialize}; use serde_wasm_bindgen::from_value; + use wasm_bindgen::prelude::*; use web_sys::console; @@ -102,8 +103,10 @@ impl WebClient { let transaction_execution_result = client.new_transaction(transaction_request).await.unwrap(); + client.submit_transaction(transaction_execution_result).await.unwrap(); + Ok(JsValue::from_str("Transaction submitted successfully")) } else { Err(JsValue::from_str("Client not initialized")) @@ -226,6 +229,7 @@ pub(crate) async fn get_note_with_id_prefix, note_id_prefix: &str, ) -> Result { + // log the note_id_prefix let input_note_records = client .get_input_notes(NoteFilter::All).await .map_err(|err| NoteIdPrefixFetchError::NoMatch(note_id_prefix.to_string()))? diff --git a/wasm/test.html b/wasm/test.html index 5063fdde4..d74fa4b5c 100644 --- a/wasm/test.html +++ b/wasm/test.html @@ -49,20 +49,28 @@ // Accounts Tests - async function testNewAccount(webClient) { + async function testNewRegularAccount(webClient) { const basicMutableTemplate = { type: "BasicMutable" }; + try { + let result = await webClient.new_account(basicMutableTemplate); + return result; + } catch (error) { + console.error('Failed to call create account:', error); + } + } + + async function testNewFaucetAccount(webClient) { const fungibleFaucetTemplate = { type: "FungibleFaucet", token_symbol: "TEST", - decimals: "18", + decimals: "10", max_supply: "1000000" }; try { - let result = await webClient.new_account(basicMutableTemplate); - console.log(result); - //await webClient.new_account(fungibleFaucetTemplate); + let result = await webClient.new_account(fungibleFaucetTemplate); + return result; } catch (error) { console.error('Failed to call create account:', error); } @@ -166,9 +174,41 @@ } } - async function testNewTransaction(webClient) { + async function testNewTransaction( + webClient, + targetAccountId, + faucetAccountId + ) { try { - await webClient.new_transaction(); + const mintTransactionTemplate = { + type: "Mint", + target_account_id: targetAccountId, + faucet_id: faucetAccountId, + amount: "1000", + note_type: "Private", + }; + let result = await webClient.new_transaction(mintTransactionTemplate); + console.log(result); + + } catch (error) { + console.error('Failed to call new transaction:', error); + + } + } + + async function testNewConsumeTransaction( + webClient, + targetAccountId, + listOfNotes + ) { + try { + const consumeTransactionTemplate = { + type: "ConsumeNotes", + account_id: targetAccountId, + list_of_notes: listOfNotes + }; + let result = await webClient.new_transaction(consumeTransactionTemplate); + console.log(result); } catch (error) { console.error('Failed to call new transaction:', error); @@ -189,7 +229,8 @@ let webClient = await testCreateClient(); //await testStoreAndRpc(webClient); - // await testNewAccount(webClient); + // let regularAccount = await testNewRegularAccount(webClient); + // let faucetAccount = await testNewFaucetAccount(webClient); // await testGetAccounts(webClient); // await testGetAccount(webClient); // await testGetAccountStubById(webClient); @@ -200,9 +241,16 @@ // await testImportInputNote(webClient); // await testGetTransactions(webClient); - // await testNewTransaction(webClient); + let regularAccount = await testNewRegularAccount(webClient); + let faucetAccount = await testNewFaucetAccount(webClient); await testSyncState(webClient); + await testNewTransaction(webClient, regularAccount, faucetAccount); + // await testSyncState(webClient); + + // await testNewConsumeTransaction(webClient, "0x92e4bd025c6a9aa0", ["0xadc497ac1478c8ae73c7a10b6c91843124351edbe31c06634fdad4f2fb381874"]) + // await testSyncState(webClient); + \ No newline at end of file From 6c334f72ced3eeabf4256c19823bd8fcee04c0a5 Mon Sep 17 00:00:00 2001 From: Dennis Garcia Date: Wed, 15 May 2024 00:26:47 -0500 Subject: [PATCH 18/42] Added Integration Tests to test.html File to Test Different Code Paths (#16) --- wasm/js/db/accounts.js | 7 - wasm/js/db/schema.js | 15 +- wasm/js/db/sync.js | 11 +- wasm/js/db/transactions.js | 45 +- wasm/src/web_client/account.rs | 70 ++- wasm/src/web_client/mod.rs | 1 + wasm/src/web_client/models/accounts.rs | 57 ++ wasm/src/web_client/models/mod.rs | 2 + wasm/src/web_client/models/transactions.rs | 31 + wasm/src/web_client/notes.rs | 27 +- wasm/src/web_client/sync.rs | 3 +- wasm/src/web_client/transactions.rs | 31 +- wasm/test.html | 687 ++++++++++++++++++--- 13 files changed, 807 insertions(+), 180 deletions(-) create mode 100644 wasm/src/web_client/models/accounts.rs create mode 100644 wasm/src/web_client/models/mod.rs create mode 100644 wasm/src/web_client/models/transactions.rs diff --git a/wasm/js/db/accounts.js b/wasm/js/db/accounts.js index 960ebcb29..2720245d0 100644 --- a/wasm/js/db/accounts.js +++ b/wasm/js/db/accounts.js @@ -92,7 +92,6 @@ export async function getAccountStub( // The first record is the most recent one due to the sorting const mostRecentRecord = sortedRecords[0]; - console.log('Most recent record found:', mostRecentRecord); let accountSeedBase64 = null; if (mostRecentRecord.accountSeed) { @@ -133,7 +132,6 @@ export async function getAccountCode( // The first record is the only one due to the uniqueness constraint const codeRecord = allMatchingRecords[0]; - console.log('Code record found:', codeRecord); // Convert the module Blob to an ArrayBuffer const moduleArrayBuffer = await codeRecord.module.arrayBuffer(); @@ -167,7 +165,6 @@ export async function getAccountStorage( // The first record is the only one due to the uniqueness constraint const storageRecord = allMatchingRecords[0]; - console.log('Storage record found:', storageRecord); // Convert the module Blob to an ArrayBuffer const storageArrayBuffer = await storageRecord.slots.arrayBuffer(); @@ -200,7 +197,6 @@ export async function getAccountAssetVault( // The first record is the only one due to the uniqueness constraint const vaultRecord = allMatchingRecords[0]; - console.log('Vault record found:', vaultRecord); return { root: vaultRecord.root, @@ -229,7 +225,6 @@ export async function getAccountAuth( // The first record is the only one due to the uniqueness constraint const authRecord = allMatchingRecords[0]; - console.log('Auth record found:', authRecord); // Convert the authInfo Blob to an ArrayBuffer const authInfoArrayBuffer = await authRecord.authInfo.arrayBuffer(); @@ -322,9 +317,7 @@ export async function insertAccountRecord( ) { try { let accountSeedBlob = null; - console.log(account_seed); if (account_seed) { - console.log(account_seed) accountSeedBlob = new Blob([new Uint8Array(account_seed)]); } diff --git a/wasm/js/db/schema.js b/wasm/js/db/schema.js index 5ab253068..f8d5ec519 100644 --- a/wasm/js/db/schema.js +++ b/wasm/js/db/schema.js @@ -14,6 +14,19 @@ export async function openDatabase() { } } +export async function dropDatabase() { + console.log('Dropping database...') + try { + await db.delete(); + console.log("Database dropped successfully"); + return true; + } catch (err) { + console.error("Failed to drop database: ", err); + return false; + } + +} + const Table = { AccountCode: 'accountCode', AccountStorage: 'accountStorage', @@ -38,7 +51,7 @@ db.version(1).stores({ [Table.AccountVaults]: indexes('root'), [Table.AccountAuth]: indexes('accountId'), [Table.Accounts]: indexes('[id+nonce]', 'codeRoot', 'storageRoot', 'vaultRoot'), - [Table.Transactions]: indexes('id', 'scriptHash', 'blockNum', 'commitHeight'), + [Table.Transactions]: indexes('id'), [Table.TransactionScripts]: indexes('scriptHash'), [Table.InputNotes]: indexes('noteId', 'recipient', 'status'), [Table.OutputNotes]: indexes('noteId', 'recipient', 'status'), diff --git a/wasm/js/db/sync.js b/wasm/js/db/sync.js index 544ad032d..b6de497b4 100644 --- a/wasm/js/db/sync.js +++ b/wasm/js/db/sync.js @@ -224,11 +224,16 @@ async function updateCommittedTransactions( return; } - const updates = transactionIds.map(transactionId => ({ - id: transactionId, - commitHeight: blockNum + // Fetch existing records + const existingRecords = await tx.transactions.where('id').anyOf(transactionIds).toArray(); + + // Create updates by merging existing records with the new values + const updates = existingRecords.map(record => ({ + ...record, // Spread existing fields + commitHeight: blockNum // Update specific field })); + // Perform the update await tx.transactions.bulkPut(updates); } catch (err) { console.error("Failed to mark transactions as committed: ", err); diff --git a/wasm/js/db/transactions.js b/wasm/js/db/transactions.js index c766e91c9..6b22c67a6 100644 --- a/wasm/js/db/transactions.js +++ b/wasm/js/db/transactions.js @@ -19,12 +19,9 @@ export async function getTransactions( return []; } - const scriptHashes = await Promise.all(transactionRecords.map(async transactionRecord => { - const scriptHashArrayBuffer = await transactionRecord.scriptHash.arrayBuffer(); - const scriptHashArray = new Uint8Array(scriptHashArrayBuffer); - const scriptHashBase64 = uint8ArrayToBase64(scriptHashArray); - return scriptHashBase64; - })); + const scriptHashes = transactionRecords.map(transactionRecord => { + return transactionRecord.scriptHash + }); const scripts = await transactionScripts.where("scriptHash").anyOf(scriptHashes).toArray(); @@ -35,32 +32,25 @@ export async function getTransactions( }); const processedTransactions = await Promise.all(transactionRecords.map(async transactionRecord => { - let scriptHashBase64 = null; let scriptProgramBase64 = null; if (transactionRecord.scriptHash) { - let scriptHashArrayBuffer = await transactionRecord.scriptHash.arrayBuffer(); - let scriptHashArray = new Uint8Array(scriptHashArrayBuffer); - scriptHashBase64 = uint8ArrayToBase64(scriptHashArray); + const scriptProgram = scriptMap.get(transactionRecord.scriptHash); - const scriptProgram = scriptMap.get(scriptHashBase64); if (scriptProgram) { let scriptProgramArrayBuffer = await scriptProgram.arrayBuffer(); let scriptProgramArray = new Uint8Array(scriptProgramArrayBuffer); scriptProgramBase64 = uint8ArrayToBase64(scriptProgramArray); - } } - + let outputNotesArrayBuffer = await transactionRecord.outputNotes.arrayBuffer(); let outputNotesArray = new Uint8Array(outputNotesArrayBuffer); let outputNotesBase64 = uint8ArrayToBase64(outputNotesArray); - transactionRecord.scriptHash = scriptHashBase64; transactionRecord.outputNotes = outputNotesBase64; - - return { + let data = { id: transactionRecord.id, account_id: transactionRecord.accountId, init_account_state: transactionRecord.initAccountState, @@ -71,15 +61,16 @@ export async function getTransactions( script_program: scriptProgramBase64, script_inputs: transactionRecord.scriptInputs ? transactionRecord.scriptInputs : null, block_num: transactionRecord.blockNum, - commit_height: transactionRecord.commitHeight - }; + commit_height: transactionRecord.commitHeight ? transactionRecord.commitHeight : null + } + + return data; })); return processedTransactions } catch { console.error("Failed to get transactions: ", err); throw err; - } } @@ -90,6 +81,7 @@ export async function insertTransactionScript( try { // check if script hash already exists let record = await transactionScripts.where("scriptHash").equals(scriptHash).first(); + if (record !== undefined) { return; } @@ -97,11 +89,12 @@ export async function insertTransactionScript( if (scriptHash === null) { throw new Error("Script hash must be provided"); } + let scriptHashArray = new Uint8Array(scriptHash); let scriptHashBase64 = uint8ArrayToBase64(scriptHashArray); let scriptProgramBlob = null; - if (scriptProgram !== null) { + if (scriptProgram ) { scriptProgramBlob = new Blob([new Uint8Array(scriptProgram)]); } @@ -110,7 +103,6 @@ export async function insertTransactionScript( program: scriptProgramBlob } - await transactionScripts.add(data); } catch (error) { // Check if the error is because the record already exists @@ -135,10 +127,11 @@ export async function insertProvenTransactionData( committed ) { try { - let scriptHashBlob = null; + let scriptHashBase64 = null; let outputNotesBlob = new Blob([new Uint8Array(outputNotes)]); if (scriptHash !== null) { - scriptHashBlob = new Blob([new Uint8Array(scriptHash)]); + let scriptHashArray = new Uint8Array(scriptHash); + scriptHashBase64 = uint8ArrayToBase64(scriptHashArray); } const data = { @@ -148,10 +141,10 @@ export async function insertProvenTransactionData( finalAccountState: finalAccountState, inputNotes: inputNotes, outputNotes: outputNotesBlob, - scriptHash: scriptHashBlob, - scriptInputs: scriptInputs, + scriptHash: scriptHashBase64, + scriptInputs: scriptInputs ? scriptInputs : null, blockNum: blockNum, - commitHeight: committed + commitHeight: committed ? committed : null } await transactions.add(data); diff --git a/wasm/src/web_client/account.rs b/wasm/src/web_client/account.rs index 55047517e..fd049ae03 100644 --- a/wasm/src/web_client/account.rs +++ b/wasm/src/web_client/account.rs @@ -1,4 +1,5 @@ use super::WebClient; +use crate::web_client::models::accounts::SerializedAccountStub; use base64::encode; use miden_objects::{accounts::{AccountData, AccountId}, assets::TokenSymbol, notes::NoteId}; @@ -17,14 +18,21 @@ use web_sys::console; #[derive(Serialize, Deserialize)] #[serde(tag = "type")] pub enum AccountTemplate { - BasicImmutable, - BasicMutable, + BasicImmutable { + storage_mode: String // AccountStorageMode + }, + BasicMutable { + storage_mode: String // AccountStorageMode + }, FungibleFaucet { token_symbol: String, decimals: String, // u8 - max_supply: String // u64 + max_supply: String, // u64 + storage_mode: String + }, + NonFungibleFaucet { + storage_mode: String }, - NonFungibleFaucet, } // Account functions to be exposed to the JavaScript environment @@ -67,32 +75,52 @@ impl WebClient { match account_template_result { Ok(account_template) => { let client_template = match account_template { - AccountTemplate::BasicImmutable => accounts::AccountTemplate::BasicWallet { + AccountTemplate::BasicImmutable { + storage_mode + } => accounts::AccountTemplate::BasicWallet { mutable_code: false, - storage_mode: accounts::AccountStorageMode::Local, + storage_mode: match storage_mode.as_str() { + "Local" => accounts::AccountStorageMode::Local, + "OnChain" => accounts::AccountStorageMode::OnChain, + _ => panic!("Invalid storage mode") + }, }, - AccountTemplate::BasicMutable => accounts::AccountTemplate::BasicWallet { + AccountTemplate::BasicMutable { + storage_mode + } => accounts::AccountTemplate::BasicWallet { mutable_code: true, - storage_mode: accounts::AccountStorageMode::Local, + storage_mode: match storage_mode.as_str() { + "Local" => accounts::AccountStorageMode::Local, + "OnChain" => accounts::AccountStorageMode::OnChain, + _ => panic!("Invalid storage mode") + }, }, AccountTemplate::FungibleFaucet { token_symbol, decimals, max_supply, + storage_mode } => accounts::AccountTemplate::FungibleFaucet { token_symbol: TokenSymbol::new(&token_symbol).unwrap(), decimals: decimals.parse::().unwrap(), max_supply: max_supply.parse::().unwrap(), - storage_mode: accounts::AccountStorageMode::Local, + storage_mode: match storage_mode.as_str() { + "Local" => accounts::AccountStorageMode::Local, + "OnChain" => accounts::AccountStorageMode::OnChain, + _ => panic!("Invalid storage mode") + }, }, - AccountTemplate::NonFungibleFaucet => todo!(), + AccountTemplate::NonFungibleFaucet { + storage_mode + } => todo!(), }; match client.new_account(client_template).await { Ok((account, _)) => { // Create a struct or tuple to hold both values // Convert directly to JsValue - serde_wasm_bindgen::to_value(&account.id().to_string()).map_err(|e| JsValue::from_str(&e.to_string())) + serde_wasm_bindgen::to_value(&account.id().to_string()) + .map_err(|e| JsValue::from_str(&e.to_string())) }, Err(err) => { let error_message = format!("Failed to create new account: {:?}", err); @@ -115,12 +143,20 @@ impl WebClient { ) -> Result { if let Some(ref mut client) = self.get_mut_inner() { let account_tuples = client.get_accounts().await.unwrap(); - let accounts: Vec = account_tuples.into_iter().map(|(account, _)| { - format!("{}", account.id().to_string()) + let accounts: Vec = account_tuples.into_iter().map(|(account, _)| { + SerializedAccountStub::new( + account.id().to_string(), + account.nonce().to_string(), + account.vault_root().to_string(), + account.storage_root().to_string(), + account.code_root().to_string(), + ) }).collect(); - // Convert the Vec to JsValue - serde_wasm_bindgen::to_value(&accounts).map_err(|e| JsValue::from_str(&e.to_string())) + let accounts_as_js_value = serde_wasm_bindgen::to_value(&accounts) + .unwrap_or_else(|_| wasm_bindgen::throw_val(JsValue::from_str("Serialization error"))); + + Ok(accounts_as_js_value) } else { Err(JsValue::from_str("Client not initialized")) } @@ -135,8 +171,8 @@ impl WebClient { let result = client.get_account(native_account_id).await.unwrap(); - let word = result.1.map_or("No word".to_string(), |w| w[0].to_string()); - Ok(JsValue::from_str(&format!("ID: {}, Word: {}", result.0.id().to_string(), word))) + serde_wasm_bindgen::to_value(&result.0.id().to_string()) + .map_err(|e| JsValue::from_str(&e.to_string())) } else { Err(JsValue::from_str("Client not initialized")) } diff --git a/wasm/src/web_client/mod.rs b/wasm/src/web_client/mod.rs index f8950d952..45541ec25 100644 --- a/wasm/src/web_client/mod.rs +++ b/wasm/src/web_client/mod.rs @@ -12,6 +12,7 @@ pub mod transactions; pub mod sync; pub mod store; pub mod rpc; +pub mod models; use store::WebStore; use rpc::WebRpcClient; diff --git a/wasm/src/web_client/models/accounts.rs b/wasm/src/web_client/models/accounts.rs new file mode 100644 index 000000000..b8c7dd41b --- /dev/null +++ b/wasm/src/web_client/models/accounts.rs @@ -0,0 +1,57 @@ +use wasm_bindgen::prelude::*; +use serde::{Serialize, Deserialize}; +use serde_wasm_bindgen::to_value; + +#[wasm_bindgen] +#[derive(Serialize, Deserialize)] +pub struct SerializedAccountStub { + id: String, + nonce: String, + vault_root: String, + storage_root: String, + code_root: String, +} + +#[wasm_bindgen] +impl SerializedAccountStub { + pub fn new( + id: String, + nonce: String, + vault_root: String, + storage_root: String, + code_root: String + ) -> SerializedAccountStub { + SerializedAccountStub { + id, + nonce, + vault_root, + storage_root, + code_root + } + } + + #[wasm_bindgen(getter)] + pub fn id(&self) -> String { + self.id.clone() + } + + #[wasm_bindgen(getter)] + pub fn nonce(&self) -> String { + self.nonce.clone() + } + + #[wasm_bindgen(getter)] + pub fn vault_root(&self) -> String { + self.vault_root.clone() + } + + #[wasm_bindgen(getter)] + pub fn storage_root(&self) -> String { + self.storage_root.clone() + } + + #[wasm_bindgen(getter)] + pub fn code_root(&self) -> String { + self.code_root.clone() + } +} diff --git a/wasm/src/web_client/models/mod.rs b/wasm/src/web_client/models/mod.rs new file mode 100644 index 000000000..8718233fb --- /dev/null +++ b/wasm/src/web_client/models/mod.rs @@ -0,0 +1,2 @@ +pub mod accounts; +pub mod transactions; \ No newline at end of file diff --git a/wasm/src/web_client/models/transactions.rs b/wasm/src/web_client/models/transactions.rs new file mode 100644 index 000000000..61847d9bf --- /dev/null +++ b/wasm/src/web_client/models/transactions.rs @@ -0,0 +1,31 @@ +use wasm_bindgen::prelude::*; +use wasm_bindgen::JsValue; + +#[wasm_bindgen] +pub struct NewTransactionResult { + transaction_id: String, + created_note_ids: Vec, +} + +#[wasm_bindgen] +impl NewTransactionResult { + pub fn new( + transaction_id: String, + created_note_ids: Vec + ) -> NewTransactionResult { + NewTransactionResult { + transaction_id, + created_note_ids + } + } + + #[wasm_bindgen(getter)] + pub fn transaction_id(&self) -> String { + self.transaction_id.clone() + } + + #[wasm_bindgen(getter)] + pub fn created_note_ids(&self) -> JsValue { + JsValue::from_serde(&self.created_note_ids).unwrap() + } +} \ No newline at end of file diff --git a/wasm/src/web_client/notes.rs b/wasm/src/web_client/notes.rs index 50587c3af..a6035c8a5 100644 --- a/wasm/src/web_client/notes.rs +++ b/wasm/src/web_client/notes.rs @@ -1,4 +1,4 @@ -use miden_objects::{notes::NoteId, Digest}; +use miden_objects::{notes::NoteId, utils::Serializable, Digest}; use miden_tx::utils::Deserializable; use wasm_bindgen::prelude::*; use serde::{Serialize, Deserialize}; @@ -57,9 +57,7 @@ impl WebClient { .into(); let note: InputNoteRecord = client.get_input_note(note_id).await.unwrap(); - let message = format!("Note ID: {}", note.id().to_string()); - Ok(JsValue::from_str(&message)) - + serde_wasm_bindgen::to_value(¬e.id().to_string()).map_err(|e| JsValue::from_str(&e.to_string())) } else { Err(JsValue::from_str("Client not initialized")) } @@ -85,4 +83,25 @@ impl WebClient { Err(JsValue::from_str("Client not initialized")) } } + + pub async fn export_input_note( + &mut self, + note_id: &str + ) -> Result{ + if let Some(ref mut client) = self.get_mut_inner() { + + let note_id: NoteId = Digest::try_from(note_id) + .map_err(|err| format!("Failed to parse input note id: {}", err))? + .into(); + + let note: InputNoteRecord = client.get_input_note(note_id).await.unwrap(); + + let note_bytes = ¬e.to_bytes(); + + + serde_wasm_bindgen::to_value(¬e_bytes).map_err(|e| JsValue::from_str(&e.to_string())) + } else { + Err(JsValue::from_str("Client not initialized")) + } + } } \ No newline at end of file diff --git a/wasm/src/web_client/sync.rs b/wasm/src/web_client/sync.rs index ab22bdcf0..365d579fd 100644 --- a/wasm/src/web_client/sync.rs +++ b/wasm/src/web_client/sync.rs @@ -10,8 +10,7 @@ impl WebClient { if let Some(ref mut client) = self.get_mut_inner() { let block_num = client.sync_state().await.unwrap(); - let message = format!("State synced to block {}", block_num); - Ok(JsValue::from_str(&message)) + Ok(JsValue::from_f64(block_num as f64)) } else { Err(JsValue::from_str("Client not initialized")) } diff --git a/wasm/src/web_client/transactions.rs b/wasm/src/web_client/transactions.rs index 19c0a9f17..c0c35d935 100644 --- a/wasm/src/web_client/transactions.rs +++ b/wasm/src/web_client/transactions.rs @@ -8,6 +8,7 @@ use miden_objects::{ }; use super::WebClient; +use crate::web_client::models::transactions::NewTransactionResult; use crate::native_code::{ errors::NoteIdPrefixFetchError, @@ -71,22 +72,15 @@ impl WebClient { &mut self ) -> Result { if let Some(ref mut client) = self.get_mut_inner() { + let transactions = client.get_transactions(TransactionFilter::All).await.unwrap(); - let formatted_transactions: Vec> = transactions.iter().map(|transaction| { - vec![ - transaction.id.to_string(), - transaction.transaction_status.to_string(), - transaction.account_id.to_string(), - transaction.transaction_script - .as_ref() - .map(|x| x.hash().to_string()) - .unwrap_or("-".to_string()), - transaction.input_note_nullifiers.len().to_string(), - transaction.output_notes.num_notes().to_string(), - ] + + let transactionIds: Vec = transactions.iter().map(|transaction| { + transaction.id.to_string() }).collect(); - serde_wasm_bindgen::to_value(&formatted_transactions).map_err(|e| JsValue::from_str(&e.to_string())) + + serde_wasm_bindgen::to_value(&transactionIds).map_err(|e| JsValue::from_str(&e.to_string())) } else { Err(JsValue::from_str("Client not initialized")) } @@ -95,19 +89,21 @@ impl WebClient { pub async fn new_transaction( &mut self, transaction_type: JsValue - ) -> Result { + ) -> Result { if let Some(ref mut client) = self.get_mut_inner() { let transaction_type: TransactionType = from_value(transaction_type).unwrap(); let transaction_template: TransactionTemplate = build_transaction_template(client, &transaction_type).await.unwrap(); let transaction_request = client.build_transaction_request(transaction_template).await.unwrap(); let transaction_execution_result = client.new_transaction(transaction_request).await.unwrap(); - + let result = NewTransactionResult::new( + transaction_execution_result.executed_transaction().id().to_string(), + transaction_execution_result.created_notes().iter().map(|note| note.id().to_string()).collect() + ); client.submit_transaction(transaction_execution_result).await.unwrap(); - - Ok(JsValue::from_str("Transaction submitted successfully")) + Ok(result) } else { Err(JsValue::from_str("Client not initialized")) } @@ -202,6 +198,7 @@ async fn build_transaction_template( )) }, TransactionType::ConsumeNotes { account_id, list_of_notes } => { + let mut note_ids = Vec::new(); for note_id in list_of_notes.iter() { let note_record = get_note_with_id_prefix(client, note_id).await diff --git a/wasm/test.html b/wasm/test.html index d74fa4b5c..b061f1f91 100644 --- a/wasm/test.html +++ b/wasm/test.html @@ -29,7 +29,7 @@ } }); - async function testCreateClient() { + async function createMidenWebClient() { try { const webClient = new WebClient(); await webClient.create_client(); @@ -47,209 +47,690 @@ } } - // Accounts Tests + // Account Functions + /////////////////////////////////////////////////////////////////// - async function testNewRegularAccount(webClient) { - const basicMutableTemplate = { - type: "BasicMutable" + function createBasicImmutableAccountTemplate( + storageMode + ) { + return { + type: "BasicImmutable", + storage_mode: storageMode + }; + } + + function createBasicMutableAccountTemplate( + storageMode + ) { + return { + type: "BasicMutable", + storage_mode: storageMode }; - try { - let result = await webClient.new_account(basicMutableTemplate); - return result; - } catch (error) { - console.error('Failed to call create account:', error); - } } - async function testNewFaucetAccount(webClient) { - const fungibleFaucetTemplate = { + function createFungibleFaucetAccountTemplate( + tokenSymbol, + decimals, + maxSupply, + storageMode + ) { + return { type: "FungibleFaucet", - token_symbol: "TEST", - decimals: "10", - max_supply: "1000000" + token_symbol: tokenSymbol, + decimals: decimals, + max_supply: maxSupply, + storage_mode: storageMode + }; + } + + function createNonFungibleFaucetAccountTemplate( + storageMode + ) { + return { + type: "NonFungibleFaucet", + storage_mode: storageMode }; + } + + async function createNewAccount( + webClient, + accountTemplate + ) { try { - let result = await webClient.new_account(fungibleFaucetTemplate); + let result = await webClient.new_account(accountTemplate); + console.log(`Created ${accountTemplate.type} account with id ${result}`); return result; } catch (error) { console.error('Failed to call create account:', error); } } - async function testImportAccount(webClient, accountAsBytes) { + async function importAccount( + webClient, + accountAsBytes + ) { try { let result = await webClient.import_account(accountAsBytes); console.log(result); - } catch (error) { console.error('Failed to call import account:', error); } } - async function testGetAccounts(webClient) { + async function getAccounts(webClient) { try { - let result = await webClient.get_accounts(); - console.log(result); - + let accounts = await webClient.get_accounts(); + let accountIds = accounts.map(account => account.id); + console.log(accountIds) + return accountIds; } catch (error) { console.error('Failed to call get accounts:', error); - } } - async function testGetAccount(webClient) { + async function getAccount( + webClient, + accountId + ) { try { - let result = await webClient.get_account("0x9daeab54109472e8"); + let result = await webClient.get_account(accountId); console.log(result); - } catch (error) { console.error('Failed to call get account:', error); - } } - async function testGetAccountStubById(webClient) { + async function getAccountStubsById( + webClient, + accountId + ) { try { - let result = await webClient.get_account_stub_by_id("0x8d911ae1789cdb33"); + let result = await webClient.get_account_stub_by_id(accountId); console.log(result); } catch (error) { console.error('Failed to call get account stub by id:', error); - } } - async function testGetAccountAuth(webClient) { + async function getAccountAuth( + webClient, + accountId + ) { try { - let result = await webClient.get_account_auth("0x8d911ae1789cdb33"); + let result = await webClient.get_account_auth(accountId); console.log(result); - } catch (error) { console.error('Failed to call get account auth:', error); - } } - // Notes Tests + // Note Functions + /////////////////////////////////////////////////////////////////// - async function testGetInputNotes(webClient) { + async function getInputNotes( + webClient, + status = "All" + ) { try { - await webClient.get_input_notes("Pending"); - + let result = await webClient.get_input_notes(status); + console.log(result); + return result; } catch (error) { console.error('Failed to call get input notes:', error); - } } - async function testGetInputNote(webClient) { + async function getInputNote( + webClient, + noteId + ) { try { - await webClient.get_input_note("TestString"); - + let result = await webClient.get_input_note(noteId); + console.log(result); + return result; } catch (error) { console.error('Failed to call get input note:', error); - } } - async function testImportInputNote(webClient) { + async function importInputNote( + webClient, + noteAsBytes + ) { try { - await webClient.import_input_note(new Uint8Array(32)); - + await webClient.import_input_note(noteAsBytes); } catch (error) { console.error('Failed to call import input note:', error); - } } - // Transaction Tests - - async function testGetTransactions(webClient) { + async function exportInputNote( + webClient, + noteId + ) { try { - await webClient.get_transactions("All"); - + let result = await webClient.export_input_note(noteId); + console.log(result); } catch (error) { - console.error('Failed to call get transactions:', error); - + console.error('Failed to call export input note:', error); } } - async function testNewTransaction( - webClient, + // Transaction Functions + /////////////////////////////////////////////////////////////////// + + function createP2IDTransactionTemplate( + senderAccountId, + targetAccountId, + faucetId, + amount, + noteType + ) { + return { + type: "P2ID", + sender_account_id: senderAccountId, + target_account_id: targetAccountId, + faucet_id: faucetId, + amount: amount, + note_type: noteType + }; + } + + function createMintTransactionTemplate( + targetAccountId, + faucetId, + amount, + noteType + ) { + return { + type: "Mint", + target_account_id: targetAccountId, + faucet_id: faucetId, + amount: amount, + note_type: noteType + }; + } + + function createP2IDRTransactionTemplate( + senderAccountId, targetAccountId, - faucetAccountId + faucetId, + amount, + recallHeight, + noteType + ) { + return { + type: "P2IDR", + sender_account_id: senderAccountId, + target_account_id: targetAccountId, + faucet_id: faucetId, + amount: amount, + recall_height: recallHeight, + note_type: noteType + }; + } + + function createConsumeNotesTransactionTemplate( + accountId, + listOfNotes + ) { + return { + type: "ConsumeNotes", + account_id: accountId, + list_of_notes: listOfNotes + }; + } + + async function getTransactions( + webClient, + transactionFilter = "All" ) { try { - const mintTransactionTemplate = { - type: "Mint", - target_account_id: targetAccountId, - faucet_id: faucetAccountId, - amount: "1000", - note_type: "Private", - }; - let result = await webClient.new_transaction(mintTransactionTemplate); + let result = await webClient.get_transactions(transactionFilter); console.log(result); - + return result; } catch (error) { - console.error('Failed to call new transaction:', error); - + console.error('Failed to call get transactions:', error); } } - async function testNewConsumeTransaction( + async function createTransaction( webClient, - targetAccountId, - listOfNotes + transactionTemplate ) { try { - const consumeTransactionTemplate = { - type: "ConsumeNotes", - account_id: targetAccountId, - list_of_notes: listOfNotes - }; - let result = await webClient.new_transaction(consumeTransactionTemplate); - console.log(result); - + let result = await webClient.new_transaction(transactionTemplate); + console.log(`Created new transaction with id ${result.transaction_id}`); + console.log(`Output notes created: ${result.created_note_ids}`); + return result; } catch (error) { console.error('Failed to call new transaction:', error); - } } - async function testSyncState(webClient) { + // Sync Functions + /////////////////////////////////////////////////////////////////// + + async function syncState(webClient) { try { let result = await webClient.sync_state(); - console.log(result); + console.log('Synced state to block ', result); } catch (error) { console.error('Failed to call sync state:', error); - } } - let webClient = await testCreateClient(); - //await testStoreAndRpc(webClient); + // Tests + /////////////////////////////////////////////////////////////////// - // let regularAccount = await testNewRegularAccount(webClient); - // let faucetAccount = await testNewFaucetAccount(webClient); - // await testGetAccounts(webClient); - // await testGetAccount(webClient); - // await testGetAccountStubById(webClient); - // await testGetAccountAuth(webClient); + async function testCreateAllAccountTypes() { + console.log('testCreateAllAccountTypes started'); + let webClient = await createMidenWebClient(); - // await testGetInputNotes(webClient); - // await testGetInputNote(webClient); - // await testImportInputNote(webClient); + let regularAccountLocalTemplate = await createBasicMutableAccountTemplate("Local"); + await createNewAccount(webClient, regularAccountLocalTemplate); + + let regularAccountOnChainTemplate = await createBasicMutableAccountTemplate("OnChain"); + await createNewAccount(webClient, regularAccountOnChainTemplate); - // await testGetTransactions(webClient); + let immutableAccountLocalTemplate = await createBasicImmutableAccountTemplate("Local"); + await createNewAccount(webClient, immutableAccountLocalTemplate); - let regularAccount = await testNewRegularAccount(webClient); - let faucetAccount = await testNewFaucetAccount(webClient); - await testSyncState(webClient); - await testNewTransaction(webClient, regularAccount, faucetAccount); - // await testSyncState(webClient); + let immutableAccountOnChainTemplate = await createBasicImmutableAccountTemplate("OnChain"); + await createNewAccount(webClient, immutableAccountOnChainTemplate); + + let fungibleFaucetAccountLocalTemplate = await createFungibleFaucetAccountTemplate( + "DEN", + "10", + "1000000", + "Local" + ); + await createNewAccount(webClient, fungibleFaucetAccountLocalTemplate); + + let fungibleFaucetAccountOnChainTemplate = await createFungibleFaucetAccountTemplate( + "DEN", + "10", + "1000000", + "OnChain" + ); + await createNewAccount(webClient, fungibleFaucetAccountOnChainTemplate); + + await syncState(webClient); + + // let nonFungibleFaucetAccountLocalTemplate = await createNonFungibleFaucetAccountTemplate("Local"); + // await createNewAccount(webClient, nonFungibleFaucetAccountLocalTemplate); + + // let nonFungibleFaucetAccountOnChainTemplate = await createNonFungibleFaucetAccountTemplate("OnChain"); + // await createNewAccount(webClient, nonFungibleFaucetAccountOnChainTemplate); + + console.log('testCreateAllAccountTypes finished'); + } + + async function testGetAccounts() { + console.log('testGetAccounts started'); + let webClient = await createMidenWebClient(); + + let regularAccountLocalTemplate = await createBasicMutableAccountTemplate("Local"); + await createNewAccount(webClient, regularAccountLocalTemplate); + + let fungibleFaucetAccountLocalTemplate = await createFungibleFaucetAccountTemplate( + "DEN", + "10", + "1000000", + "Local" + ); + await createNewAccount(webClient, fungibleFaucetAccountLocalTemplate); + + await getAccounts(webClient) + console.log('testGetAccounts finished'); + } + + async function testMintAsset() { + console.log("testMintAsset started"); + let webClient = await createMidenWebClient(); + + // Create accounts and sync + let regularAccountTemplate = createBasicMutableAccountTemplate("Local"); + let fungibleFaucetAccountTemplate = createFungibleFaucetAccountTemplate( + "DEN", + "10", + "1000000", + "Local" + ); + let regularAccountId = await createNewAccount(webClient, regularAccountTemplate); + let faucetId = await createNewAccount(webClient, fungibleFaucetAccountTemplate); + await syncState(webClient); + await new Promise(r => setTimeout(r, 10000)); + + // Create mint transaction and sync + let transactionTemplate = createMintTransactionTemplate( + regularAccountId, + faucetId, + "1000", + "Private" + ); + let createTransactionResult = await createTransaction(webClient, transactionTemplate); + await new Promise(r => setTimeout(r, 10000)); + await syncState(webClient); + + // Create consume transaction and sync + let consumeTransactionTemplate = createConsumeNotesTransactionTemplate( + regularAccountId, + createTransactionResult.created_note_ids + ); + await createTransaction(webClient, consumeTransactionTemplate); + await new Promise(r => setTimeout(r, 10000)); + await syncState(webClient); + + console.log("testMintAsset finished"); + } + + async function testP2IDTransaction() { + console.log("testP2IDTransaction started"); + let webClient = await createMidenWebClient(); + + // Create accounts and sync + let senderAccountTemplate = createBasicMutableAccountTemplate("Local"); + let targetAccountTemplate = createBasicMutableAccountTemplate("Local"); + let faucetAccountTemplate = createFungibleFaucetAccountTemplate( + "DEN", + "10", + "1000000", + "Local" + ); + let senderAccountId = await createNewAccount(webClient, senderAccountTemplate); + let targetAccountId = await createNewAccount(webClient, targetAccountTemplate); + let faucetId = await createNewAccount(webClient, faucetAccountTemplate); + await syncState(webClient); + await new Promise(r => setTimeout(r, 10000)); + + // Create mint transaction and sync + let mintTransactionTemplate = createMintTransactionTemplate( + senderAccountId, + faucetId, + "1000", + "Private" + ); + let mintTransactionResult = await createTransaction(webClient, mintTransactionTemplate); + await new Promise(r => setTimeout(r, 10000)); + await syncState(webClient); + + // Create consume transaction and sync + let consumeMintedAssetsTransactionTemplate = createConsumeNotesTransactionTemplate( + senderAccountId, + mintTransactionResult.created_note_ids + ); + await createTransaction(webClient, consumeMintedAssetsTransactionTemplate); + await new Promise(r => setTimeout(r, 10000)); + await syncState(webClient); + + // Create P2ID transaction and sync + let p2idTransactionTemplate = createP2IDTransactionTemplate( + senderAccountId, + targetAccountId, + faucetId, + "500", + "Private" + ); + let p2idTransactionResult = await createTransaction(webClient, p2idTransactionTemplate); + await new Promise(r => setTimeout(r, 10000)); + await syncState(webClient); + + // Create consume transaction and sync + // Create consume transaction and sync + let consumeP2IDAssetsTransactionTemplate = createConsumeNotesTransactionTemplate( + targetAccountId, + p2idTransactionResult.created_note_ids + ); + await createTransaction(webClient, consumeP2IDAssetsTransactionTemplate); + await new Promise(r => setTimeout(r, 10000)); + await syncState(webClient); + + console.log("testP2IDTransaction finished"); + } + + async function testP2IDRTransaction() { + console.log("testP2IDRTransaction started"); + let webClient = await createMidenWebClient(); + + // Create accounts and sync + let senderAccountTemplate = createBasicMutableAccountTemplate("Local"); + let targetAccountTemplate = createBasicMutableAccountTemplate("Local"); + let faucetAccountTemplate = createFungibleFaucetAccountTemplate( + "DEN", + "10", + "1000000", + "Local" + ); + let senderAccountId = await createNewAccount(webClient, senderAccountTemplate); + let targetAccountId = await createNewAccount(webClient, targetAccountTemplate); + let faucetId = await createNewAccount(webClient, faucetAccountTemplate); + await syncState(webClient); + await new Promise(r => setTimeout(r, 10000)); + + // Create mint transaction and sync + let mintTransactionTemplate = createMintTransactionTemplate( + senderAccountId, + faucetId, + "1000", + "Private" + ); + let mintTransactionResult = await createTransaction(webClient, mintTransactionTemplate); + await new Promise(r => setTimeout(r, 10000)); + await syncState(webClient); + + // Create consume transaction and sync + let consumeMintedAssetsTransactionTemplate = createConsumeNotesTransactionTemplate( + senderAccountId, + mintTransactionResult.created_note_ids + ); + await createTransaction(webClient, consumeMintedAssetsTransactionTemplate); + await new Promise(r => setTimeout(r, 10000)); + await syncState(webClient); + + // Create P2ID transaction and sync + let p2idrTransactionTemplate = createP2IDRTransactionTemplate( + senderAccountId, + targetAccountId, + faucetId, + "500", + "7000", + "Private" + ); + let p2idrTransactionResult = await createTransaction(webClient, p2idrTransactionTemplate); + await new Promise(r => setTimeout(r, 10000)); + await syncState(webClient); + + // Create consume transaction and sync + let consumeP2IDRAssetsTransactionTemplate = createConsumeNotesTransactionTemplate( + senderAccountId, + p2idrTransactionResult.created_note_ids + ); + await createTransaction(webClient, consumeP2IDRAssetsTransactionTemplate); + await new Promise(r => setTimeout(r, 10000)); + await syncState(webClient); + + console.log("testP2IDRTransaction finished"); + } + + async function testGetTransactions() { + console.log("testGetTransactions started"); + let webClient = await createMidenWebClient(); + + // Create accounts and sync + let regularAccountTemplate = createBasicMutableAccountTemplate("Local"); + let fungibleFaucetAccountTemplate = createFungibleFaucetAccountTemplate( + "DEN", + "10", + "1000000", + "Local" + ); + let regularAccountId = await createNewAccount(webClient, regularAccountTemplate); + let faucetId = await createNewAccount(webClient, fungibleFaucetAccountTemplate); + await syncState(webClient); + await new Promise(r => setTimeout(r, 10000)); + + // Create mint transaction and sync + let transactionTemplate = createMintTransactionTemplate( + regularAccountId, + faucetId, + "1000", + "Private" + ); + let createTransactionResult = await createTransaction(webClient, transactionTemplate); + await new Promise(r => setTimeout(r, 20000)); + await syncState(webClient); + + // Create consume transaction and sync + let consumeTransactionTemplate = createConsumeNotesTransactionTemplate( + regularAccountId, + createTransactionResult.created_note_ids + ); + await createTransaction(webClient, consumeTransactionTemplate); + await new Promise(r => setTimeout(r, 20000)); + await syncState(webClient); + + await getTransactions(webClient); + + console.log("testGetTransactions finished"); + } + + async function testGetAccount() { + console.log("testGetAccount started"); + let webClient = await createMidenWebClient(); + + // Create account and sync + let regularAccountTemplate = createBasicMutableAccountTemplate("Local"); + let regularAccountId = await createNewAccount(webClient, regularAccountTemplate); + await syncState(webClient); + await new Promise(r => setTimeout(r, 10000)); + + await getAccount(webClient, regularAccountId); + + console.log("testGetAccount finished"); + } + + async function testGetNotes() { + console.log("testGetNotes started"); + let webClient = await createMidenWebClient(); + + // Create accounts and sync + let regularAccountTemplate = createBasicMutableAccountTemplate("Local"); + let fungibleFaucetAccountTemplate = createFungibleFaucetAccountTemplate( + "DEN", + "10", + "1000000", + "Local" + ); + let regularAccountId = await createNewAccount(webClient, regularAccountTemplate); + let faucetId = await createNewAccount(webClient, fungibleFaucetAccountTemplate); + await syncState(webClient); + await new Promise(r => setTimeout(r, 10000)); + + // Create mint transaction and sync + let transactionTemplate = createMintTransactionTemplate( + regularAccountId, + faucetId, + "1000", + "Private" + ); + let createTransactionResult = await createTransaction(webClient, transactionTemplate); + await new Promise(r => setTimeout(r, 10000)); + await syncState(webClient); + + // Create mint transaction and sync + let transactionTemplate2 = createMintTransactionTemplate( + regularAccountId, + faucetId, + "1000", + "Private" + ); + let createTransactionResult2 = await createTransaction(webClient, transactionTemplate2); + await new Promise(r => setTimeout(r, 10000)); + await syncState(webClient); + + await getInputNotes(webClient); + + console.log("testGetNotes finished"); + } + + async function testGetNote() { + console.log("testGetNote started"); + let webClient = await createMidenWebClient(); + + // Create accounts and sync + let regularAccountTemplate = createBasicMutableAccountTemplate("Local"); + let fungibleFaucetAccountTemplate = createFungibleFaucetAccountTemplate( + "DEN", + "10", + "1000000", + "Local" + ); + let regularAccountId = await createNewAccount(webClient, regularAccountTemplate); + let faucetId = await createNewAccount(webClient, fungibleFaucetAccountTemplate); + await syncState(webClient); + await new Promise(r => setTimeout(r, 10000)); + + // Create mint transaction and sync + let transactionTemplate = createMintTransactionTemplate( + regularAccountId, + faucetId, + "1000", + "Private" + ); + let createTransactionResult = await createTransaction(webClient, transactionTemplate); + await new Promise(r => setTimeout(r, 10000)); + await syncState(webClient); + + await getInputNote(webClient, createTransactionResult.created_note_ids[0]); + + console.log("testGetNote finished"); + } + + async function testExportInputNote() { + console.log("testExportInputNote started"); + let webClient = await createMidenWebClient(); + + // Create accounts and sync + let regularAccountTemplate = createBasicMutableAccountTemplate("Local"); + let fungibleFaucetAccountTemplate = createFungibleFaucetAccountTemplate( + "DEN", + "10", + "1000000", + "Local" + ); + let regularAccountId = await createNewAccount(webClient, regularAccountTemplate); + let faucetId = await createNewAccount(webClient, fungibleFaucetAccountTemplate); + await syncState(webClient); + await new Promise(r => setTimeout(r, 10000)); + + // Create mint transaction and sync + let transactionTemplate = createMintTransactionTemplate( + regularAccountId, + faucetId, + "1000", + "Private" + ); + let createTransactionResult = await createTransaction(webClient, transactionTemplate); + await new Promise(r => setTimeout(r, 10000)); + await syncState(webClient); + + await exportInputNote(webClient, createTransactionResult.created_note_ids[0]); + + console.log("testExportInputNote finished"); + } - // await testNewConsumeTransaction(webClient, "0x92e4bd025c6a9aa0", ["0xadc497ac1478c8ae73c7a10b6c91843124351edbe31c06634fdad4f2fb381874"]) - // await testSyncState(webClient); + // await testCreateAllAccountTypes(); + // await testGetAccount(); + // await testGetAccounts(); + // await testGetNotes(); + // await testGetNote(); + // await testExportInputNote(); + // await testMintAsset(); + // await testP2IDTransaction(); + // await testP2IDRTransaction(); + // await testGetTransactions(); From 9c3891eb03d6acb97d9ba347dcb03a082c21c8e1 Mon Sep 17 00:00:00 2001 From: Dennis Garcia Date: Wed, 15 May 2024 11:12:16 -0500 Subject: [PATCH 19/42] Create Web Client Now Takes Node Url as Config (#17) --- wasm/config/envoy.yaml | 2 +- wasm/src/web_client/mod.rs | 7 +++++-- wasm/src/web_client/rpc/mod.rs | 21 +++++++++------------ wasm/test.html | 4 +++- 4 files changed, 18 insertions(+), 16 deletions(-) diff --git a/wasm/config/envoy.yaml b/wasm/config/envoy.yaml index f29fdefff..2aca68ea2 100644 --- a/wasm/config/envoy.yaml +++ b/wasm/config/envoy.yaml @@ -51,6 +51,6 @@ static_resources: - endpoint: address: socket_address: - address: host.docker.internal + address: 18.203.155.106 port_value: 57291 http2_protocol_options: {} \ No newline at end of file diff --git a/wasm/src/web_client/mod.rs b/wasm/src/web_client/mod.rs index 45541ec25..c2751d1f8 100644 --- a/wasm/src/web_client/mod.rs +++ b/wasm/src/web_client/mod.rs @@ -39,10 +39,13 @@ impl WebClient { } // Exposed method to JS to create an internal client - pub async fn create_client(&mut self) -> Result { + pub async fn create_client( + &mut self, + node_url: Option + ) -> Result { let rng = get_random_coin(); let web_store: WebStore = WebStore::new().await.map_err(|_| JsValue::from_str("Failed to initialize WebStore"))?; - let web_rpc_client = WebRpcClient::new("http://localhost:57291"); + let web_rpc_client = WebRpcClient::new(&node_url.unwrap_or_else(|| "http://localhost:57291".to_string())); let executor_store = WebStore::new().await.map_err(|_| JsValue::from_str("Failed to initialize ExecutorStore"))?; self.inner = Some(Client::new(web_rpc_client, rng, web_store, executor_store)); diff --git a/wasm/src/web_client/rpc/mod.rs b/wasm/src/web_client/rpc/mod.rs index d391a714b..1ff2ee6f2 100644 --- a/wasm/src/web_client/rpc/mod.rs +++ b/wasm/src/web_client/rpc/mod.rs @@ -50,14 +50,11 @@ impl WebRpcClient { endpoint: endpoint.to_string() } } -} - -fn build_client() -> ApiClient { - // let base_url = "http://localhost:8080".to_string(); // for use with envoy proxy - let base_url = "http://localhost:57291".to_string(); // for use without envoy proxy - let wasm_client = Client::new(base_url); - ApiClient::new(wasm_client) + pub fn build_api_client(&self) -> ApiClient { + let wasm_client = Client::new(self.endpoint.clone()); + ApiClient::new(wasm_client) + } } #[async_trait(?Send)] @@ -77,7 +74,7 @@ impl NodeRpcClient for WebRpcClient { &mut self, proven_transaction: ProvenTransaction, ) -> Result<(), NodeRpcClientError> { - let mut query_client = build_client(); + let mut query_client = self.build_api_client(); let request = SubmitProvenTransactionRequest { transaction: proven_transaction.to_bytes(), @@ -97,7 +94,7 @@ impl NodeRpcClient for WebRpcClient { &mut self, block_num: Option, ) -> Result { - let mut query_client = build_client(); + let mut query_client = self.build_api_client(); let request = GetBlockHeaderByNumberRequest { block_num: block_num, @@ -124,7 +121,7 @@ impl NodeRpcClient for WebRpcClient { &mut self, note_ids: &[NoteId], ) -> Result, NodeRpcClientError> { - let mut query_client = build_client(); + let mut query_client = self.build_api_client(); let request = GetNotesByIdRequest { note_ids: note_ids.iter().map(|id| id.inner().into()).collect(), @@ -191,7 +188,7 @@ impl NodeRpcClient for WebRpcClient { note_tags: &[NoteTag], nullifiers_tags: &[u16], ) -> Result { - let mut query_client = build_client(); + let mut query_client = self.build_api_client(); let account_ids = account_ids.iter().map(|acc| (*acc).into()).collect(); let nullifiers = nullifiers_tags.iter().map(|&nullifier| nullifier as u32).collect(); @@ -229,7 +226,7 @@ impl NodeRpcClient for WebRpcClient { &mut self, account_id: AccountId ) -> Result { - let mut query_client = build_client(); + let mut query_client = self.build_api_client(); let account_id = account_id.into(); let request = GetAccountDetailsRequest { account_id: Some(account_id) }; diff --git a/wasm/test.html b/wasm/test.html index b061f1f91..674468e35 100644 --- a/wasm/test.html +++ b/wasm/test.html @@ -31,8 +31,10 @@ async function createMidenWebClient() { try { + let local_rpc_url = "http://localhost:57291" + let envoy_proxy_url = "http://localhost:8080" const webClient = new WebClient(); - await webClient.create_client(); + await webClient.create_client(local_rpc_url); return webClient; } catch (error) { console.error('Failed to create client with web store:', error); From 3471569d3c61706457334b9f5807ffb391e5d659 Mon Sep 17 00:00:00 2001 From: Dennis Garcia Date: Thu, 16 May 2024 14:23:53 -0500 Subject: [PATCH 20/42] Import/Export Code Integration Tests (#18) --- wasm/src/native_code/store/note_record/mod.rs | 8 +- wasm/test.html | 122 +++++++++++++++--- 2 files changed, 111 insertions(+), 19 deletions(-) diff --git a/wasm/src/native_code/store/note_record/mod.rs b/wasm/src/native_code/store/note_record/mod.rs index 603d8d479..7c5588f6b 100644 --- a/wasm/src/native_code/store/note_record/mod.rs +++ b/wasm/src/native_code/store/note_record/mod.rs @@ -142,12 +142,12 @@ impl NoteRecordDetails { impl Serializable for NoteRecordDetails { fn write_into(&self, target: &mut W) { let nullifier_bytes = self.nullifier.as_bytes(); - target.write_usize(nullifier_bytes.len()); + target.write_u64(nullifier_bytes.len() as u64); target.write_bytes(nullifier_bytes); self.script().write_into(target); - target.write_usize(self.inputs.len()); + target.write_u64(self.inputs.len() as u64); target.write_many(self.inputs()); self.serial_num().write_into(target); @@ -156,14 +156,14 @@ impl Serializable for NoteRecordDetails { impl Deserializable for NoteRecordDetails { fn read_from(source: &mut R) -> Result { - let nullifier_len = usize::read_from(source)?; + let nullifier_len = u64::read_from(source)? as usize; let nullifier_bytes = source.read_vec(nullifier_len)?; let nullifier = String::from_utf8(nullifier_bytes).expect("Nullifier String bytes should be readable."); let script = NoteScript::read_from(source)?; - let inputs_len = source.read_usize()?; + let inputs_len = source.read_u64()? as usize; let inputs = source.read_many::(inputs_len)?; let serial_num = Word::read_from(source)?; diff --git a/wasm/test.html b/wasm/test.html index 674468e35..3ea198db0 100644 --- a/wasm/test.html +++ b/wasm/test.html @@ -5,13 +5,20 @@ WASM Example - + + + + From e0513c597d728eebd8eeff9a17f10bfaf6072598 Mon Sep 17 00:00:00 2001 From: Dennis Garcia Date: Fri, 31 May 2024 15:44:31 -0500 Subject: [PATCH 21/42] Miden-Client 0.3.0 Update --- Cargo.toml | 59 -- rust-toolchain | 2 +- src/cli/account.rs | 391 --------- src/cli/info.rs | 20 - src/cli/init.rs | 73 -- src/cli/input_notes.rs | 446 ----------- src/cli/mod.rs | 163 ---- src/cli/sync.rs | 13 - src/cli/tags.rs | 55 -- src/cli/transactions.rs | 256 ------ src/client/accounts.rs | 318 -------- src/client/chain_data.rs | 30 - src/client/mod.rs | 94 --- src/client/note_screener.rs | 239 ------ src/client/notes.rs | 30 - src/client/rpc/mod.rs | 193 ----- src/client/rpc/tonic_client.rs | 341 -------- src/client/sync.rs | 475 ----------- .../auth_consume_notes.masm | 5 - .../transaction_scripts/auth_send_asset.masm | 12 - .../distribute_fungible_asset.masm | 13 - src/client/transactions/mod.rs | 440 ---------- .../transactions/transaction_request.rs | 170 ---- src/config.rs | 156 ---- src/errors.rs | 474 ----------- src/lib.rs | 12 - src/main.rs | 16 - src/mock.rs | 749 ------------------ src/store/data_store.rs | 186 ----- src/store/mod.rs | 327 -------- src/store/note_record/input_note_record.rs | 189 ----- src/store/note_record/mod.rs | 173 ---- src/store/note_record/output_note_record.rs | 98 --- src/store/sqlite_store/accounts.rs | 500 ------------ src/store/sqlite_store/chain_data.rs | 289 ------- src/store/sqlite_store/migrations.rs | 20 - src/store/sqlite_store/mod.rs | 291 ------- src/store/sqlite_store/notes.rs | 561 ------------- src/store/sqlite_store/store.sql | 193 ----- src/store/sqlite_store/sync.rs | 160 ---- src/store/sqlite_store/transactions.rs | 344 -------- src/tests.rs | 370 --------- wasm/Cargo.toml | 19 +- wasm/js/db/accounts.js | 45 +- wasm/js/db/greet.js | 17 - wasm/js/db/notes.js | 264 +++--- wasm/js/db/schema.js | 2 +- wasm/js/db/sync.js | 55 +- wasm/js/db/transactions.js | 22 +- wasm/src/lib.rs | 1 - wasm/src/native_code/accounts.rs | 247 ------ wasm/src/native_code/chain_data.rs | 14 - wasm/src/native_code/errors.rs | 481 ----------- wasm/src/native_code/mod.rs | 64 -- wasm/src/native_code/note_screener.rs | 239 ------ wasm/src/native_code/notes.rs | 33 - wasm/src/native_code/rpc/mod.rs | 194 ----- wasm/src/native_code/store/data_store.rs | 188 ----- wasm/src/native_code/store/mod.rs | 334 -------- .../store/note_record/input_note_record.rs | 189 ----- wasm/src/native_code/store/note_record/mod.rs | 173 ---- .../store/note_record/output_note_record.rs | 98 --- wasm/src/native_code/sync.rs | 474 ----------- .../auth_consume_notes.masm | 5 - .../transaction_scripts/auth_send_asset.masm | 12 - .../distribute_fungible_asset.masm | 13 - wasm/src/native_code/transactions/mod.rs | 434 ---------- .../transactions/transaction_request.rs | 170 ---- wasm/src/native_code/utils.rs | 100 --- wasm/src/web_client/account.rs | 143 +--- wasm/src/web_client/examples.rs | 19 - wasm/src/web_client/export.rs | 37 + wasm/src/web_client/import.rs | 65 ++ wasm/src/web_client/mod.rs | 23 +- wasm/src/web_client/new_account.rs | 88 ++ wasm/src/web_client/new_transactions.rs | 190 +++++ wasm/src/web_client/notes.rs | 61 +- wasm/src/web_client/rpc/domain/accounts.rs | 58 +- wasm/src/web_client/rpc/domain/blocks.rs | 16 +- wasm/src/web_client/rpc/domain/digest.rs | 2 +- wasm/src/web_client/rpc/domain/merkle.rs | 4 +- wasm/src/web_client/rpc/domain/mod.rs | 1 + wasm/src/web_client/rpc/domain/notes.rs | 34 + wasm/src/web_client/rpc/domain/nullifiers.rs | 3 +- wasm/src/web_client/rpc/mod.rs | 135 +++- .../web_client/rpc/proto/block_header.proto | 24 +- wasm/src/web_client/rpc/proto/note.proto | 35 +- wasm/src/web_client/rpc/proto/requests.proto | 24 +- wasm/src/web_client/rpc/proto/responses.proto | 24 +- wasm/src/web_client/rpc/proto/rpc.proto | 7 +- wasm/src/web_client/rpc/proto/smt.proto | 2 +- wasm/src/web_client/rpc/proto/store.proto | 9 +- .../web_client/store/accounts/js_bindings.rs | 8 +- wasm/src/web_client/store/accounts/mod.rs | 90 +-- wasm/src/web_client/store/accounts/utils.rs | 76 +- wasm/src/web_client/store/chain_data/mod.rs | 17 +- wasm/src/web_client/store/chain_data/utils.rs | 3 +- .../store/mock_example/js_bindings.rs | 9 - wasm/src/web_client/store/mock_example/mod.rs | 17 - wasm/src/web_client/store/mod.rs | 102 +-- .../src/web_client/store/notes/js_bindings.rs | 17 +- wasm/src/web_client/store/notes/mod.rs | 289 +++---- wasm/src/web_client/store/notes/models.rs | 6 +- wasm/src/web_client/store/notes/utils.rs | 144 +++- wasm/src/web_client/store/sync/js_bindings.rs | 7 +- wasm/src/web_client/store/sync/mod.rs | 77 +- wasm/src/web_client/store/transactions/mod.rs | 66 +- .../web_client/store/transactions/utils.rs | 10 +- wasm/src/web_client/sync.rs | 6 +- wasm/src/web_client/transactions.rs | 239 +----- 110 files changed, 1451 insertions(+), 13569 deletions(-) delete mode 100644 Cargo.toml delete mode 100644 src/cli/account.rs delete mode 100644 src/cli/info.rs delete mode 100644 src/cli/init.rs delete mode 100644 src/cli/input_notes.rs delete mode 100644 src/cli/mod.rs delete mode 100644 src/cli/sync.rs delete mode 100644 src/cli/tags.rs delete mode 100644 src/cli/transactions.rs delete mode 100644 src/client/accounts.rs delete mode 100644 src/client/chain_data.rs delete mode 100644 src/client/mod.rs delete mode 100644 src/client/note_screener.rs delete mode 100644 src/client/notes.rs delete mode 100644 src/client/rpc/mod.rs delete mode 100644 src/client/rpc/tonic_client.rs delete mode 100644 src/client/sync.rs delete mode 100644 src/client/transactions/asm/transaction_scripts/auth_consume_notes.masm delete mode 100644 src/client/transactions/asm/transaction_scripts/auth_send_asset.masm delete mode 100644 src/client/transactions/asm/transaction_scripts/distribute_fungible_asset.masm delete mode 100644 src/client/transactions/mod.rs delete mode 100644 src/client/transactions/transaction_request.rs delete mode 100644 src/config.rs delete mode 100644 src/errors.rs delete mode 100644 src/lib.rs delete mode 100644 src/main.rs delete mode 100644 src/mock.rs delete mode 100644 src/store/data_store.rs delete mode 100644 src/store/mod.rs delete mode 100644 src/store/note_record/input_note_record.rs delete mode 100644 src/store/note_record/mod.rs delete mode 100644 src/store/note_record/output_note_record.rs delete mode 100644 src/store/sqlite_store/accounts.rs delete mode 100644 src/store/sqlite_store/chain_data.rs delete mode 100644 src/store/sqlite_store/migrations.rs delete mode 100644 src/store/sqlite_store/mod.rs delete mode 100644 src/store/sqlite_store/notes.rs delete mode 100644 src/store/sqlite_store/store.sql delete mode 100644 src/store/sqlite_store/sync.rs delete mode 100644 src/store/sqlite_store/transactions.rs delete mode 100644 src/tests.rs delete mode 100644 wasm/js/db/greet.js delete mode 100644 wasm/src/native_code/accounts.rs delete mode 100644 wasm/src/native_code/chain_data.rs delete mode 100644 wasm/src/native_code/errors.rs delete mode 100644 wasm/src/native_code/mod.rs delete mode 100644 wasm/src/native_code/note_screener.rs delete mode 100644 wasm/src/native_code/notes.rs delete mode 100644 wasm/src/native_code/rpc/mod.rs delete mode 100644 wasm/src/native_code/store/data_store.rs delete mode 100644 wasm/src/native_code/store/mod.rs delete mode 100644 wasm/src/native_code/store/note_record/input_note_record.rs delete mode 100644 wasm/src/native_code/store/note_record/mod.rs delete mode 100644 wasm/src/native_code/store/note_record/output_note_record.rs delete mode 100644 wasm/src/native_code/sync.rs delete mode 100644 wasm/src/native_code/transactions/asm/transaction_scripts/auth_consume_notes.masm delete mode 100644 wasm/src/native_code/transactions/asm/transaction_scripts/auth_send_asset.masm delete mode 100644 wasm/src/native_code/transactions/asm/transaction_scripts/distribute_fungible_asset.masm delete mode 100644 wasm/src/native_code/transactions/mod.rs delete mode 100644 wasm/src/native_code/transactions/transaction_request.rs delete mode 100644 wasm/src/native_code/utils.rs delete mode 100644 wasm/src/web_client/examples.rs create mode 100644 wasm/src/web_client/export.rs create mode 100644 wasm/src/web_client/import.rs create mode 100644 wasm/src/web_client/new_account.rs create mode 100644 wasm/src/web_client/new_transactions.rs create mode 100644 wasm/src/web_client/rpc/domain/notes.rs delete mode 100644 wasm/src/web_client/store/mock_example/js_bindings.rs delete mode 100644 wasm/src/web_client/store/mock_example/mod.rs diff --git a/Cargo.toml b/Cargo.toml deleted file mode 100644 index a750aee46..000000000 --- a/Cargo.toml +++ /dev/null @@ -1,59 +0,0 @@ -[package] -name = "miden-client" -version = "0.2.0" -description = "Client library that facilitates interaction with the Miden rollup" -authors = ["miden contributors"] -readme = "README.md" -license = "MIT" -repository = "https://github.com/0xPolygonMiden/miden-client" -documentation = "https://docs.rs/miden-client/0.2.0" -keywords = ["miden", "client"] -edition = "2021" -rust-version = "1.75" -default-run = "miden-client" - -[[test]] -name = "integration" -path = "tests/integration/main.rs" -required-features = ["integration"] - -[features] -concurrent = [ - "miden-lib/concurrent", - "miden-objects/concurrent", - "miden-tx/concurrent", -] -default = ["std"] -integration = ["testing", "concurrent", "uuid"] -std = ["miden-objects/std"] -testing = ["miden-objects/testing", "miden-lib/testing"] -test_utils = ["miden-objects/testing"] - -[dependencies] -async-trait = { version = "0.1" } -clap = { version = "4.3", features = ["derive"] } -comfy-table = "7.1.0" -figment = { version = "0.10", features = ["toml", "env"] } -lazy_static = "1.4.0" -miden-lib = { version = "0.2", default-features = false } -miden-node-proto = { version = "0.2", default-features = false } -miden-tx = { version = "0.2", default-features = false } -miden-objects = { version = "0.2", features = ["serde"] } -rand = { version = "0.8.5" } -rusqlite = { version = "0.30.0", features = ["bundled"] } -rusqlite_migration = { version = "1.0" } -serde = { version = "1.0", features = ["derive"] } -serde_json = { version = "1.0", features = ["raw_value"] } -tokio = { version = "1.29", features = ["rt-multi-thread", "net", "macros"] } -tonic = { version = "0.11" } -toml = { version = "0.8" } -tracing = { version = "0.1" } -tracing-subscriber = { version = "0.3" } -uuid = { version = "1.6.1", features = ["serde", "v4"], optional = true } - -[dev-dependencies] -# needed for tests to run always with the test utils feature -miden_client = { package = "miden-client", path = ".", features = [ - "test_utils", - "uuid", -] } diff --git a/rust-toolchain b/rust-toolchain index 3245dca3d..8e95c75da 100644 --- a/rust-toolchain +++ b/rust-toolchain @@ -1 +1 @@ -1.77 +1.78 diff --git a/src/cli/account.rs b/src/cli/account.rs deleted file mode 100644 index 53ccee648..000000000 --- a/src/cli/account.rs +++ /dev/null @@ -1,391 +0,0 @@ -use std::{fs, path::PathBuf}; - -use clap::{Parser, ValueEnum}; -use comfy_table::{presets, Attribute, Cell, ContentArrangement, Table}; -use miden_client::{ - client::{accounts, rpc::NodeRpcClient, Client}, - store::Store, -}; -use miden_objects::{ - accounts::{AccountData, AccountId, AccountStorage, AccountType, StorageSlotType}, - assets::{Asset, TokenSymbol}, - crypto::{dsa::rpo_falcon512::SecretKey, rand::FeltRng}, - ZERO, -}; -use miden_tx::utils::{bytes_to_hex_string, Deserializable, Serializable}; -use tracing::info; - -use crate::cli::create_dynamic_table; - -// ACCOUNT COMMAND -// ================================================================================================ - -#[derive(Debug, Clone, Parser)] -#[clap(about = "Create accounts and inspect account details")] -pub enum AccountCmd { - /// List all accounts monitored by this client - #[clap(short_flag = 'l')] - List, - - /// Show details of the account for the specified ID - #[clap(short_flag = 's')] - Show { - // TODO: We should create a value parser for catching input parsing errors earlier (ie AccountID) once complexity grows - #[clap()] - id: String, - #[clap(short, long, default_value_t = false)] - keys: bool, - #[clap(short, long, default_value_t = false)] - vault: bool, - #[clap(short, long, default_value_t = false)] - storage: bool, - #[clap(short, long, default_value_t = false)] - code: bool, - }, - /// Create new account and store it locally - #[clap(short_flag = 'n')] - New { - #[clap(subcommand)] - template: AccountTemplate, - }, - /// Import accounts from binary files (with .mac extension) - #[clap(short_flag = 'i')] - Import { - /// Paths to the files that contains the account data - #[arg()] - filenames: Vec, - }, -} - -#[derive(Debug, Parser, Clone)] -#[clap()] -pub enum AccountTemplate { - /// Creates a basic account (Regular account with immutable code) - BasicImmutable { - #[clap(short, long, value_enum, default_value_t = AccountStorageMode::OffChain)] - storage_type: AccountStorageMode, - }, - /// Creates a basic account (Regular account with mutable code) - BasicMutable { - #[clap(short, long, value_enum, default_value_t = AccountStorageMode::OffChain)] - storage_type: AccountStorageMode, - }, - /// Creates a faucet for fungible tokens - FungibleFaucet { - #[clap(short, long)] - token_symbol: String, - #[clap(short, long)] - decimals: u8, - #[clap(short, long)] - max_supply: u64, - #[clap(short, long, value_enum, default_value_t = AccountStorageMode::OffChain)] - storage_type: AccountStorageMode, - }, - /// Creates a faucet for non-fungible tokens - NonFungibleFaucet { - #[clap(short, long, value_enum, default_value_t = AccountStorageMode::OffChain)] - storage_type: AccountStorageMode, - }, -} - -#[derive(Debug, Clone, Copy, ValueEnum)] -pub enum AccountStorageMode { - OffChain, - OnChain, -} - -impl From for accounts::AccountStorageMode { - fn from(value: AccountStorageMode) -> Self { - match value { - AccountStorageMode::OffChain => accounts::AccountStorageMode::Local, - AccountStorageMode::OnChain => accounts::AccountStorageMode::OnChain, - } - } -} - -impl From<&AccountStorageMode> for accounts::AccountStorageMode { - fn from(value: &AccountStorageMode) -> Self { - accounts::AccountStorageMode::from(*value) - } -} - -impl AccountCmd { - pub fn execute( - &self, - mut client: Client, - ) -> Result<(), String> { - match self { - AccountCmd::List => { - list_accounts(client)?; - }, - AccountCmd::New { template } => { - let client_template = match template { - AccountTemplate::BasicImmutable { storage_type: storage_mode } => { - accounts::AccountTemplate::BasicWallet { - mutable_code: false, - storage_mode: storage_mode.into(), - } - }, - AccountTemplate::BasicMutable { storage_type: storage_mode } => { - accounts::AccountTemplate::BasicWallet { - mutable_code: true, - storage_mode: storage_mode.into(), - } - }, - AccountTemplate::FungibleFaucet { - token_symbol, - decimals, - max_supply, - storage_type: storage_mode, - } => accounts::AccountTemplate::FungibleFaucet { - token_symbol: TokenSymbol::new(token_symbol) - .map_err(|err| format!("error: token symbol is invalid: {}", err))?, - decimals: *decimals, - max_supply: *max_supply, - storage_mode: storage_mode.into(), - }, - AccountTemplate::NonFungibleFaucet { storage_type: _ } => todo!(), - }; - let (_new_account, _account_seed) = client.new_account(client_template)?; - }, - AccountCmd::Show { id, keys, vault, storage, code } => { - let account_id: AccountId = AccountId::from_hex(id) - .map_err(|_| "Input number was not a valid Account Id")?; - show_account(client, account_id, *keys, *vault, *storage, *code)?; - }, - AccountCmd::Import { filenames } => { - validate_paths(filenames, "mac")?; - for filename in filenames { - import_account(&mut client, filename)?; - } - println!("Imported {} accounts.", filenames.len()); - }, - } - Ok(()) - } -} - -// LIST ACCOUNTS -// ================================================================================================ - -fn list_accounts( - client: Client, -) -> Result<(), String> { - let accounts = client.get_accounts()?; - - let mut table = create_dynamic_table(&[ - "Account ID", - "Code Root", - "Vault Root", - "Storage Root", - "Type", - "Storage mode", - "Nonce", - ]); - accounts.iter().for_each(|(acc, _acc_seed)| { - table.add_row(vec![ - acc.id().to_string(), - acc.code_root().to_string(), - acc.vault_root().to_string(), - acc.storage_root().to_string(), - account_type_display_name(&acc.id().account_type()), - storage_type_display_name(&acc.id()), - acc.nonce().as_int().to_string(), - ]); - }); - - println!("{table}"); - Ok(()) -} - -pub fn show_account( - client: Client, - account_id: AccountId, - show_keys: bool, - show_vault: bool, - show_storage: bool, - show_code: bool, -) -> Result<(), String> { - let (account, _account_seed) = client.get_account(account_id)?; - let mut table = create_dynamic_table(&[ - "Account ID", - "Account Hash", - "Type", - "Storage mode", - "Code Root", - "Vault Root", - "Storage Root", - "Nonce", - ]); - table.add_row(vec![ - account.id().to_string(), - account.hash().to_string(), - account_type_display_name(&account.account_type()), - storage_type_display_name(&account_id), - account.code().root().to_string(), - account.vault().asset_tree().root().to_string(), - account.storage().root().to_string(), - account.nonce().as_int().to_string(), - ]); - println!("{table}\n"); - - if show_vault { - let assets = account.vault().assets(); - - println!("Assets: "); - - let mut table = create_dynamic_table(&["Asset Type", "Faucet ID", "Amount"]); - for asset in assets { - let (asset_type, faucet_id, amount) = match asset { - Asset::Fungible(fungible_asset) => { - ("Fungible Asset", fungible_asset.faucet_id(), fungible_asset.amount()) - }, - Asset::NonFungible(non_fungible_asset) => { - ("Non Fungible Asset", non_fungible_asset.faucet_id(), 1) - }, - }; - table.add_row(vec![asset_type, &faucet_id.to_hex(), &amount.to_string()]); - } - - println!("{table}\n"); - } - - if show_storage { - let account_storage = account.storage(); - - println!("Storage: \n"); - - let mut table = create_dynamic_table(&[ - "Item Slot Index", - "Item Slot Type", - "Value Arity", - "Value/Commitment", - ]); - for (idx, entry) in account_storage.layout().iter().enumerate() { - let item = account_storage.get_item(idx as u8); - - // Last entry is reserved so I don't think the user cares about it Also, to keep the - // output smaller, if the [StorageSlotType] is a value and it's 0 we assume it's not - // initialized and skip it - if idx == AccountStorage::SLOT_LAYOUT_COMMITMENT_INDEX as usize { - continue; - } - if matches!(entry, StorageSlotType::Value { value_arity: _value_arity }) - && item == [ZERO; 4].into() - { - continue; - } - - let (slot_type, arity) = match entry { - StorageSlotType::Value { value_arity } => ("Value", value_arity), - StorageSlotType::Array { depth: _depth, value_arity } => ("Array", value_arity), - StorageSlotType::Map { value_arity } => ("Map", value_arity), - }; - table.add_row(vec![&idx.to_string(), slot_type, &arity.to_string(), &item.to_hex()]); - } - println!("{table}\n"); - } - - if show_keys { - let auth_info = client.get_account_auth(account_id)?; - - match auth_info { - miden_client::store::AuthInfo::RpoFalcon512(key_pair) => { - const KEY_PAIR_SIZE: usize = std::mem::size_of::(); - let auth_info: [u8; KEY_PAIR_SIZE] = key_pair - .to_bytes() - .try_into() - .expect("Array size is const and should always exactly fit SecretKey"); - - let mut table = Table::new(); - table - .load_preset(presets::UTF8_HORIZONTAL_ONLY) - .set_content_arrangement(ContentArrangement::DynamicFullWidth) - .set_header(vec![Cell::new("Key Pair").add_attribute(Attribute::Bold)]); - - table.add_row(vec![format!("0x{}\n", bytes_to_hex_string(auth_info))]); - println!("{table}\n"); - }, - }; - } - - if show_code { - let module = account.code().module(); - let procedure_digests = account.code().procedures(); - - println!("Account Code Info:"); - - let mut table = create_dynamic_table(&["Procedure Digests"]); - for digest in procedure_digests { - table.add_row(vec![digest.to_hex()]); - } - println!("{table}\n"); - - let mut code_table = create_dynamic_table(&["Code"]); - code_table.add_row(vec![&module]); - println!("{code_table}\n"); - } - - Ok(()) -} - -// IMPORT ACCOUNT -// ================================================================================================ - -fn import_account( - client: &mut Client, - filename: &PathBuf, -) -> Result<(), String> { - info!( - "Attempting to import account data from {}...", - fs::canonicalize(filename).map_err(|err| err.to_string())?.as_path().display() - ); - let account_data_file_contents = fs::read(filename).map_err(|err| err.to_string())?; - let account_data = - AccountData::read_from_bytes(&account_data_file_contents).map_err(|err| err.to_string())?; - let account_id = account_data.account.id(); - - client.import_account(account_data)?; - println!("Imported account with ID: {}", account_id); - - Ok(()) -} - -// HELPERS -// ================================================================================================ - -/// Checks that all files exist, otherwise returns an error. It also ensures that all files have a -/// specific extension -fn validate_paths(paths: &[PathBuf], expected_extension: &str) -> Result<(), String> { - let invalid_path = paths.iter().find(|path| { - !path.exists() || path.extension().map_or(false, |ext| ext != expected_extension) - }); - - if let Some(path) = invalid_path { - Err(format!( - "The path `{}` does not exist or does not have the appropiate extension", - path.to_string_lossy() - ) - .to_string()) - } else { - Ok(()) - } -} - -fn account_type_display_name(account_type: &AccountType) -> String { - match account_type { - AccountType::FungibleFaucet => "Fungible faucet", - AccountType::NonFungibleFaucet => "Non-fungible faucet", - AccountType::RegularAccountImmutableCode => "Regular", - AccountType::RegularAccountUpdatableCode => "Regular (updatable)", - } - .to_string() -} - -fn storage_type_display_name(account: &AccountId) -> String { - match account.is_on_chain() { - true => "On-chain", - false => "Off-chain", - } - .to_string() -} diff --git a/src/cli/info.rs b/src/cli/info.rs deleted file mode 100644 index 44018cbdc..000000000 --- a/src/cli/info.rs +++ /dev/null @@ -1,20 +0,0 @@ -use miden_client::{ - client::{rpc::NodeRpcClient, Client}, - store::Store, -}; -use miden_objects::crypto::rand::FeltRng; - -pub fn print_client_info( - client: &Client, -) -> Result<(), String> { - print_block_number(client) -} - -// HELPERS -// ================================================================================================ -fn print_block_number( - client: &Client, -) -> Result<(), String> { - println!("block number: {}", client.get_sync_height().map_err(|e| e.to_string())?); - Ok(()) -} diff --git a/src/cli/init.rs b/src/cli/init.rs deleted file mode 100644 index 46c5fd3e8..000000000 --- a/src/cli/init.rs +++ /dev/null @@ -1,73 +0,0 @@ -use std::{ - fs::File, - io::{self, Write}, - path::PathBuf, -}; - -use miden_client::config::{ClientConfig, Endpoint}; - -pub(crate) fn initialize_client(config_file_path: PathBuf) -> Result<(), String> { - let mut client_config = ClientConfig::default(); - - initialize_rpc_config(&mut client_config)?; - initialize_store_config(&mut client_config)?; - - let config_as_toml_string = toml::to_string_pretty(&client_config) - .map_err(|err| format!("error formatting config: {err}"))?; - - println!("Creating config file at: {:?}", config_file_path); - let mut file_handle = File::options() - .write(true) - .create_new(true) - .open(config_file_path) - .map_err(|err| format!("error opening the file: {err}"))?; - file_handle - .write(config_as_toml_string.as_bytes()) - .map_err(|err| format!("error writing to file: {err}"))?; - - Ok(()) -} - -fn initialize_rpc_config(client_config: &mut ClientConfig) -> Result<(), String> { - println!("Protocol (default: http):"); - let mut protocol: String = String::new(); - io::stdin().read_line(&mut protocol).expect("Should read line"); - protocol = protocol.trim().to_string(); - if protocol.is_empty() { - protocol = client_config.rpc.endpoint.protocol().to_string(); - } - - println!("Host (default: localhost):"); - let mut host: String = String::new(); - io::stdin().read_line(&mut host).expect("Should read line"); - host = host.trim().to_string(); - if host.is_empty() { - host = client_config.rpc.endpoint.host().to_string(); - } - - println!("Node RPC Port (default: 57291):"); - let mut port_str: String = String::new(); - io::stdin().read_line(&mut port_str).expect("Should read line"); - port_str = port_str.trim().to_string(); - let port: u16 = if !port_str.is_empty() { - port_str.parse().map_err(|err| format!("Error parsing port: {err}"))? - } else { - client_config.rpc.endpoint.port() - }; - - client_config.rpc.endpoint = Endpoint::new(protocol, host, port); - - Ok(()) -} - -fn initialize_store_config(client_config: &mut ClientConfig) -> Result<(), String> { - println!("Sqlite file path (default: ./store.sqlite3):"); - let mut database_filepath: String = String::new(); - io::stdin().read_line(&mut database_filepath).expect("Should read line"); - database_filepath = database_filepath.trim().to_string(); - if !database_filepath.is_empty() { - client_config.store.database_filepath = database_filepath; - } - - Ok(()) -} diff --git a/src/cli/input_notes.rs b/src/cli/input_notes.rs deleted file mode 100644 index 0d29219b5..000000000 --- a/src/cli/input_notes.rs +++ /dev/null @@ -1,446 +0,0 @@ -use std::{ - fs::File, - io::{Read, Write}, - path::PathBuf, -}; - -use clap::ValueEnum; -use comfy_table::{presets, Attribute, Cell, ContentArrangement, Table}; -use miden_client::{ - client::rpc::NodeRpcClient, - errors::ClientError, - store::{InputNoteRecord, NoteFilter as ClientNoteFilter, Store}, -}; -use miden_objects::{ - crypto::rand::FeltRng, - notes::{NoteId, NoteInputs}, - Digest, -}; -use miden_tx::utils::{Deserializable, Serializable}; - -use super::{Client, Parser}; -use crate::cli::{create_dynamic_table, get_note_with_id_prefix}; - -#[derive(Clone, Debug, ValueEnum)] -pub enum NoteFilter { - Pending, - Committed, - Consumed, -} - -#[derive(Debug, Parser, Clone)] -#[clap(about = "View and manage input notes")] -pub enum InputNotes { - /// List input notes - #[clap(short_flag = 'l')] - List { - /// Filter the displayed note list - #[clap(short, long)] - filter: Option, - }, - - /// Show details of the input note for the specified note ID - #[clap(short_flag = 's')] - Show { - /// Note ID of the input note to show - #[clap()] - id: String, - - /// Show note script - #[clap(short, long, default_value = "false")] - script: bool, - - /// Show note vault - #[clap(short, long, default_value = "false")] - vault: bool, - - /// Show note inputs - #[clap(short, long, default_value = "false")] - inputs: bool, - }, - - /// Export input note data to a binary file - #[clap(short_flag = 'e')] - Export { - /// Note ID of the input note to show - #[clap()] - id: String, - - /// Path to the file that will contain the input note data. If not provided, the filename will be the input note ID - #[clap()] - filename: Option, - }, - - /// Import input note data from a binary file - #[clap(short_flag = 'i')] - Import { - /// Path to the file that contains the input note data - #[clap()] - filename: PathBuf, - }, -} - -impl InputNotes { - pub fn execute( - &self, - mut client: Client, - ) -> Result<(), String> { - match self { - InputNotes::List { filter } => { - let filter = match filter { - Some(NoteFilter::Committed) => ClientNoteFilter::Committed, - Some(NoteFilter::Consumed) => ClientNoteFilter::Consumed, - Some(NoteFilter::Pending) => ClientNoteFilter::Pending, - None => ClientNoteFilter::All, - }; - - list_input_notes(client, filter)?; - }, - InputNotes::Show { id, script, vault, inputs } => { - show_input_note(client, id.to_owned(), *script, *vault, *inputs)?; - }, - InputNotes::Export { id, filename } => { - export_note(&client, id, filename.clone())?; - println!("Succesfully exported note {}", id); - }, - InputNotes::Import { filename } => { - let note_id = import_note(&mut client, filename.clone())?; - println!("Succesfully imported note {}", note_id.inner()); - }, - } - Ok(()) - } -} - -// LIST INPUT NOTES -// ================================================================================================ -fn list_input_notes( - client: Client, - filter: ClientNoteFilter, -) -> Result<(), String> { - let notes = client.get_input_notes(filter)?; - print_notes_summary(¬es)?; - Ok(()) -} - -// EXPORT INPUT NOTE -// ================================================================================================ -pub fn export_note( - client: &Client, - note_id: &str, - filename: Option, -) -> Result { - let note_id = Digest::try_from(note_id) - .map_err(|err| format!("Failed to parse input note id: {}", err))? - .into(); - let note = client.get_input_note(note_id)?; - - let file_path = filename.unwrap_or_else(|| { - let mut dir = PathBuf::new(); - dir.push(note_id.inner().to_string()); - dir - }); - - let mut file = File::create(file_path).map_err(|err| err.to_string())?; - - file.write_all(¬e.to_bytes()).map_err(|err| err.to_string())?; - - Ok(file) -} - -// IMPORT INPUT NOTE -// ================================================================================================ -pub fn import_note( - client: &mut Client, - filename: PathBuf, -) -> Result { - let mut contents = vec![]; - let mut _file = File::open(filename) - .and_then(|mut f| f.read_to_end(&mut contents)) - .map_err(|err| err.to_string()); - - // TODO: When importing a RecordedNote we want to make sure that the note actually exists in the chain (RPC call) - // and start monitoring its nullifiers (ie, update the list of relevant tags in the state sync table) - let input_note_record = - InputNoteRecord::read_from_bytes(&contents).map_err(|err| err.to_string())?; - - let note_id = input_note_record.id(); - client.import_input_note(input_note_record)?; - - Ok(note_id) -} - -// SHOW INPUT NOTE -// ================================================================================================ -fn show_input_note( - client: Client, - note_id: String, - show_script: bool, - show_vault: bool, - show_inputs: bool, -) -> Result<(), String> { - let input_note_record = - get_note_with_id_prefix(&client, ¬e_id).map_err(|err| err.to_string())?; - - // print note summary - print_notes_summary(core::iter::once(&input_note_record))?; - - let mut table = Table::new(); - table - .load_preset(presets::UTF8_HORIZONTAL_ONLY) - .set_content_arrangement(ContentArrangement::DynamicFullWidth); - - // print note script - if show_script { - let script = input_note_record.details().script(); - - table - .add_row(vec![ - Cell::new("Note Script hash").add_attribute(Attribute::Bold), - Cell::new(script.hash()), - ]) - .add_row(vec![ - Cell::new("Note Script code").add_attribute(Attribute::Bold), - Cell::new(script.code()), - ]); - }; - - // print note vault - if show_vault { - table - .add_row(vec![ - Cell::new("Note Vault hash").add_attribute(Attribute::Bold), - Cell::new(input_note_record.assets().commitment()), - ]) - .add_row(vec![Cell::new("Note Vault").add_attribute(Attribute::Bold)]); - - input_note_record.assets().iter().for_each(|asset| { - table.add_row(vec![Cell::new(format!("{:?}", asset))]); - }) - }; - - if show_inputs { - let inputs = NoteInputs::new(input_note_record.details().inputs().clone()) - .map_err(ClientError::NoteError)?; - - table - .add_row(vec![ - Cell::new("Note Inputs hash").add_attribute(Attribute::Bold), - Cell::new(inputs.commitment()), - ]) - .add_row(vec![Cell::new("Note Inputs").add_attribute(Attribute::Bold)]); - - inputs.values().iter().enumerate().for_each(|(idx, input)| { - table.add_row(vec![Cell::new(idx).add_attribute(Attribute::Bold), Cell::new(input)]); - }); - }; - - println!("{table}"); - Ok(()) -} - -// HELPERS -// ================================================================================================ -fn print_notes_summary<'a, I>(notes: I) -> Result<(), String> -where - I: IntoIterator, -{ - let mut table = create_dynamic_table(&[ - "Note ID", - "Script Hash", - "Vault Vash", - "Inputs Hash", - "Serial Num", - "Commit Height", - ]); - - for input_note_record in notes { - let commit_height = input_note_record - .inclusion_proof() - .map(|proof| proof.origin().block_num.to_string()) - .unwrap_or("-".to_string()); - - let script = input_note_record.details().script(); - - let inputs = NoteInputs::new(input_note_record.details().inputs().clone()) - .map_err(ClientError::NoteError)?; - - table.add_row(vec![ - input_note_record.id().inner().to_string(), - script.hash().to_string(), - input_note_record.assets().commitment().to_string(), - inputs.commitment().to_string(), - Digest::new(input_note_record.details().serial_num()).to_string(), - commit_height, - ]); - } - - println!("{table}"); - - Ok(()) -} - -// TESTS -// ================================================================================================ - -#[cfg(test)] -mod tests { - use std::env::temp_dir; - - use miden_client::{ - client::get_random_coin, - config::{ClientConfig, Endpoint}, - errors::NoteIdPrefixFetchError, - mock::{mock_full_chain_mmr_and_notes, mock_notes, MockClient, MockRpcApi}, - store::{sqlite_store::SqliteStore, InputNoteRecord}, - }; - use miden_lib::transaction::TransactionKernel; - use uuid::Uuid; - - use crate::cli::{ - get_note_with_id_prefix, - input_notes::{export_note, import_note}, - }; - - #[tokio::test] - async fn import_export_recorded_note() { - // generate test client - let mut path = temp_dir(); - path.push(Uuid::new_v4().to_string()); - let client_config = ClientConfig::new( - path.into_os_string().into_string().unwrap().try_into().unwrap(), - Endpoint::default().into(), - ); - - let store = SqliteStore::new((&client_config).into()).unwrap(); - let rng = get_random_coin(); - let executor_store = SqliteStore::new((&client_config).into()).unwrap(); - - let mut client = MockClient::new( - MockRpcApi::new(&Endpoint::default().to_string()), - rng, - store, - executor_store, - ) - .unwrap(); - - // generate test data - let assembler = TransactionKernel::assembler(); - let (consumed_notes, created_notes) = mock_notes(&assembler); - let (_, committed_notes, ..) = mock_full_chain_mmr_and_notes(consumed_notes); - - let committed_note: InputNoteRecord = committed_notes.first().unwrap().clone().into(); - let pending_note = InputNoteRecord::from(created_notes.first().unwrap().clone()); - - client.import_input_note(committed_note.clone()).unwrap(); - client.import_input_note(pending_note.clone()).unwrap(); - assert!(pending_note.inclusion_proof().is_none()); - assert!(committed_note.inclusion_proof().is_some()); - - let mut filename_path = temp_dir(); - filename_path.push("test_import"); - - let mut filename_path_pending = temp_dir(); - filename_path_pending.push("test_import_pending"); - - export_note(&client, &committed_note.id().inner().to_string(), Some(filename_path.clone())) - .unwrap(); - - assert!(filename_path.exists()); - - export_note( - &client, - &pending_note.id().inner().to_string(), - Some(filename_path_pending.clone()), - ) - .unwrap(); - - assert!(filename_path_pending.exists()); - - // generate test client to import notes to - let mut path = temp_dir(); - path.push(Uuid::new_v4().to_string()); - let client_config = ClientConfig::new( - path.into_os_string().into_string().unwrap().try_into().unwrap(), - Endpoint::default().into(), - ); - let store = SqliteStore::new((&client_config).into()).unwrap(); - let executor_store = SqliteStore::new((&client_config).into()).unwrap(); - - let mut client = MockClient::new( - MockRpcApi::new(&Endpoint::default().to_string()), - rng, - store, - executor_store, - ) - .unwrap(); - - import_note(&mut client, filename_path).unwrap(); - let imported_note_record: InputNoteRecord = - client.get_input_note(committed_note.id()).unwrap(); - - assert_eq!(committed_note.id(), imported_note_record.id()); - - import_note(&mut client, filename_path_pending).unwrap(); - let imported_pending_note_record = client.get_input_note(pending_note.id()).unwrap(); - - assert_eq!(imported_pending_note_record.id(), pending_note.id()); - } - - #[tokio::test] - async fn get_input_note_with_prefix() { - // generate test client - let mut path = temp_dir(); - path.push(Uuid::new_v4().to_string()); - let client_config = ClientConfig::new( - path.into_os_string().into_string().unwrap().try_into().unwrap(), - Endpoint::default().into(), - ); - - let store = SqliteStore::new((&client_config).into()).unwrap(); - let rng = get_random_coin(); - let executor_store = SqliteStore::new((&client_config).into()).unwrap(); - - let mut client = MockClient::new( - MockRpcApi::new(&Endpoint::default().to_string()), - rng, - store, - executor_store, - ) - .unwrap(); - - // Ensure we get an error if no note is found - let non_existent_note_id = "0x123456"; - assert_eq!( - get_note_with_id_prefix(&client, non_existent_note_id), - Err(NoteIdPrefixFetchError::NoMatch(non_existent_note_id.to_string())) - ); - - // generate test data - let assembler = TransactionKernel::assembler(); - let (consumed_notes, created_notes) = mock_notes(&assembler); - let (_, notes, ..) = mock_full_chain_mmr_and_notes(consumed_notes); - - let committed_note: InputNoteRecord = notes.first().unwrap().clone().into(); - let pending_note = InputNoteRecord::from(created_notes.first().unwrap().clone()); - - client.import_input_note(committed_note.clone()).unwrap(); - client.import_input_note(pending_note.clone()).unwrap(); - assert!(pending_note.inclusion_proof().is_none()); - assert!(committed_note.inclusion_proof().is_some()); - - // Check that we can fetch Both notes - let note = get_note_with_id_prefix(&client, &committed_note.id().to_hex()).unwrap(); - assert_eq!(note.id(), committed_note.id()); - - let note = get_note_with_id_prefix(&client, &pending_note.id().to_hex()).unwrap(); - assert_eq!(note.id(), pending_note.id()); - - // Check that we get an error if many match - let note_id_with_many_matches = "0x"; - assert_eq!( - get_note_with_id_prefix(&client, note_id_with_many_matches), - Err(NoteIdPrefixFetchError::MultipleMatches(note_id_with_many_matches.to_string())) - ); - } -} diff --git a/src/cli/mod.rs b/src/cli/mod.rs deleted file mode 100644 index d02ca2e3b..000000000 --- a/src/cli/mod.rs +++ /dev/null @@ -1,163 +0,0 @@ -use std::path::Path; - -use clap::Parser; -use comfy_table::{presets, Attribute, Cell, ContentArrangement, Table}; -use figment::{ - providers::{Format, Toml}, - Figment, -}; -use miden_client::{ - client::{ - get_random_coin, - rpc::{NodeRpcClient, TonicRpcClient}, - Client, - }, - config::ClientConfig, - errors::{ClientError, NoteIdPrefixFetchError}, - store::{sqlite_store::SqliteStore, InputNoteRecord, NoteFilter as ClientNoteFilter, Store}, -}; -use miden_objects::crypto::rand::FeltRng; -#[cfg(not(feature = "mock"))] -use miden_objects::crypto::rand::RpoRandomCoin; - -mod account; -mod info; -mod init; -mod input_notes; -mod sync; -mod tags; -mod transactions; - -/// Config file name -const CLIENT_CONFIG_FILE_NAME: &str = "miden-client.toml"; - -/// Root CLI struct -#[derive(Parser, Debug)] -#[clap(name = "Miden", about = "Miden client", version, rename_all = "kebab-case")] -pub struct Cli { - #[clap(subcommand)] - action: Command, -} - -/// CLI actions -#[derive(Debug, Parser)] -pub enum Command { - #[clap(subcommand)] - Account(account::AccountCmd), - Init, - #[clap(subcommand)] - InputNotes(input_notes::InputNotes), - /// Sync this client with the latest state of the Miden network. - Sync, - /// View a summary of the current client state - Info, - #[clap(subcommand)] - Tags(tags::TagsCmd), - #[clap(subcommand, name = "tx")] - #[clap(visible_alias = "transaction")] - Transaction(transactions::Transaction), -} - -/// CLI entry point -impl Cli { - pub async fn execute(&self) -> Result<(), String> { - let mut current_dir = std::env::current_dir().map_err(|err| err.to_string())?; - current_dir.push(CLIENT_CONFIG_FILE_NAME); - - // Check if it's an init command before anything else. When we run the init command for the first time we won't - // have a config file and thus creating the store would not be possible. - if matches!(&self.action, Command::Init) { - init::initialize_client(current_dir.clone())?; - return Ok(()); - } - - // Create the client - let client_config = load_config(current_dir.as_path())?; - let rpc_endpoint = client_config.rpc.endpoint.to_string(); - let store = SqliteStore::new((&client_config).into()).map_err(ClientError::StoreError)?; - let rng = get_random_coin(); - let executor_store = - miden_client::store::sqlite_store::SqliteStore::new((&client_config).into()) - .map_err(ClientError::StoreError)?; - - let client: Client = - Client::new(TonicRpcClient::new(&rpc_endpoint), rng, store, executor_store)?; - - // Execute cli command - match &self.action { - Command::Account(account) => account.execute(client), - Command::Init => Ok(()), - Command::Info => info::print_client_info(&client), - Command::InputNotes(notes) => notes.execute(client), - Command::Sync => sync::sync_state(client).await, - Command::Tags(tags) => tags.execute(client).await, - Command::Transaction(transaction) => transaction.execute(client).await, - } - } -} - -/// Loads the client configuration. -/// -/// This function will look for the configuration file at the provided path. If the path is -/// relative, searches in parent directories all the way to the root as well. -pub fn load_config(config_file: &Path) -> Result { - Figment::from(Toml::file(config_file)) - .extract() - .map_err(|err| format!("Failed to load {} config file: {err}", config_file.display())) -} - -pub fn create_dynamic_table(headers: &[&str]) -> Table { - let header_cells = headers - .iter() - .map(|header| Cell::new(header).add_attribute(Attribute::Bold)) - .collect::>(); - - let mut table = Table::new(); - table - .load_preset(presets::UTF8_FULL) - .set_content_arrangement(ContentArrangement::DynamicFullWidth) - .set_header(header_cells); - - table -} - -/// Returns all client's notes whose ID starts with `note_id_prefix` -/// -/// # Errors -/// -/// - Returns [NoteIdPrefixFetchError::NoMatch] if we were unable to find any note where -/// `note_id_prefix` is a prefix of its id. -/// - Returns [NoteIdPrefixFetchError::MultipleMatches] if there were more than one note found -/// where `note_id_prefix` is a prefix of its id. -pub(crate) fn get_note_with_id_prefix( - client: &Client, - note_id_prefix: &str, -) -> Result { - let input_note_records = client - .get_input_notes(ClientNoteFilter::All) - .map_err(|err| { - tracing::error!("Error when fetching all notes from the store: {err}"); - NoteIdPrefixFetchError::NoMatch(note_id_prefix.to_string()) - })? - .into_iter() - .filter(|note_record| note_record.id().to_hex().starts_with(note_id_prefix)) - .collect::>(); - - if input_note_records.is_empty() { - return Err(NoteIdPrefixFetchError::NoMatch(note_id_prefix.to_string())); - } - if input_note_records.len() > 1 { - let input_note_record_ids = input_note_records - .iter() - .map(|input_note_record| input_note_record.id()) - .collect::>(); - tracing::error!( - "Multiple notes found for the prefix {}: {:?}", - note_id_prefix, - input_note_record_ids - ); - return Err(NoteIdPrefixFetchError::MultipleMatches(note_id_prefix.to_string())); - } - - Ok(input_note_records[0].clone()) -} diff --git a/src/cli/sync.rs b/src/cli/sync.rs deleted file mode 100644 index 96f9d8af4..000000000 --- a/src/cli/sync.rs +++ /dev/null @@ -1,13 +0,0 @@ -use miden_client::{ - client::{rpc::NodeRpcClient, Client}, - store::Store, -}; -use miden_objects::crypto::rand::FeltRng; - -pub async fn sync_state( - mut client: Client, -) -> Result<(), String> { - let block_num = client.sync_state().await?; - println!("State synced to block {}", block_num); - Ok(()) -} diff --git a/src/cli/tags.rs b/src/cli/tags.rs deleted file mode 100644 index 6d0d0ca79..000000000 --- a/src/cli/tags.rs +++ /dev/null @@ -1,55 +0,0 @@ -use miden_client::{client::rpc::NodeRpcClient, store::Store}; -use miden_objects::crypto::rand::FeltRng; - -use super::{Client, Parser}; - -#[derive(Debug, Parser, Clone)] -#[clap(about = "View and add tags")] -pub enum TagsCmd { - /// List all tags monitored by this client - #[clap(short_flag = 'l')] - List, - - /// Add a new tag to the list of tags monitored by this client - #[clap(short_flag = 'a')] - Add { - #[clap()] - tag: u64, - }, -} - -impl TagsCmd { - pub async fn execute( - &self, - client: Client, - ) -> Result<(), String> { - match self { - TagsCmd::List => { - list_tags(client)?; - }, - TagsCmd::Add { tag } => { - add_tag(client, *tag)?; - }, - } - Ok(()) - } -} - -// HELPERS -// ================================================================================================ -fn list_tags( - client: Client, -) -> Result<(), String> { - let tags = client.get_note_tags()?; - println!("tags: {:?}", tags); - Ok(()) -} - -fn add_tag( - mut client: Client, - tag: u64, -) -> Result<(), String> { - client.add_note_tag(tag)?; - println!("tag {} added", tag); - Ok(()) -} diff --git a/src/cli/transactions.rs b/src/cli/transactions.rs deleted file mode 100644 index 05e0dd3da..000000000 --- a/src/cli/transactions.rs +++ /dev/null @@ -1,256 +0,0 @@ -use clap::ValueEnum; -use miden_client::{ - client::{ - rpc::NodeRpcClient, - transactions::{ - transaction_request::{PaymentTransactionData, TransactionTemplate}, - TransactionRecord, - }, - }, - store::{Store, TransactionFilter}, -}; -use miden_objects::{ - accounts::AccountId, - assets::FungibleAsset, - crypto::rand::FeltRng, - notes::{NoteId, NoteType as MidenNoteType}, -}; -use tracing::info; - -use super::{get_note_with_id_prefix, Client, Parser}; -use crate::cli::create_dynamic_table; - -#[derive(Debug, Clone, Copy, ValueEnum)] -pub enum NoteType { - Public, - Private, -} - -impl From<&NoteType> for MidenNoteType { - fn from(note_type: &NoteType) -> Self { - match note_type { - NoteType::Public => MidenNoteType::Public, - NoteType::Private => MidenNoteType::OffChain, - } - } -} - -#[derive(Clone, Debug, Parser)] -#[clap()] -pub enum TransactionType { - /// Create a pay-to-id transaction. - P2ID { - sender_account_id: String, - target_account_id: String, - faucet_id: String, - amount: u64, - #[clap(short, long, value_enum)] - note_type: NoteType, - }, - /// Mint `amount` tokens from the specified fungible faucet (corresponding to `faucet_id`). The created note can then be then consumed by - /// `target_account_id`. - Mint { - target_account_id: String, - faucet_id: String, - amount: u64, - #[clap(short, long, value_enum)] - note_type: NoteType, - }, - /// Create a pay-to-id with recall transaction. - P2IDR { - sender_account_id: String, - target_account_id: String, - faucet_id: String, - amount: u64, - recall_height: u32, - #[clap(short, long, value_enum)] - note_type: NoteType, - }, - /// Consume with the account corresponding to `account_id` all of the notes from `list_of_notes`. - ConsumeNotes { - account_id: String, - /// A list of note IDs or the hex prefixes of their corresponding IDs - list_of_notes: Vec, - }, -} - -#[derive(Debug, Parser, Clone)] -#[clap(about = "Execute and view transactions")] -pub enum Transaction { - /// List currently tracked transactions - #[clap(short_flag = 'l')] - List, - /// Execute a transaction, prove and submit it to the node. Once submitted, it - /// gets tracked by the client - #[clap(short_flag = 'n')] - New { - #[clap(subcommand)] - transaction_type: TransactionType, - }, -} - -impl Transaction { - pub async fn execute( - &self, - mut client: Client, - ) -> Result<(), String> { - match self { - Transaction::List => { - list_transactions(client)?; - }, - Transaction::New { transaction_type } => { - new_transaction(&mut client, transaction_type).await?; - }, - } - Ok(()) - } -} - -// NEW TRANSACTION -// ================================================================================================ -async fn new_transaction( - client: &mut Client, - transaction_type: &TransactionType, -) -> Result<(), String> { - let transaction_template: TransactionTemplate = - build_transaction_template(client, transaction_type)?; - - let transaction_request = client.build_transaction_request(transaction_template)?; - let transaction_execution_result = client.new_transaction(transaction_request)?; - - info!("Executed transaction, proving and then submitting..."); - - client.submit_transaction(transaction_execution_result).await?; - - Ok(()) -} - -/// Builds a [TransactionTemplate] based on the transaction type provided via cli args -/// -/// For [TransactionTemplate::ConsumeNotes], it'll try to find the corresponding notes by using the -/// provided IDs as prefixes -fn build_transaction_template( - client: &Client, - transaction_type: &TransactionType, -) -> Result { - match transaction_type { - TransactionType::P2ID { - sender_account_id, - target_account_id, - faucet_id, - amount, - note_type, - } => { - let faucet_id = AccountId::from_hex(faucet_id).map_err(|err| err.to_string())?; - let fungible_asset = - FungibleAsset::new(faucet_id, *amount).map_err(|err| err.to_string())?.into(); - let sender_account_id = - AccountId::from_hex(sender_account_id).map_err(|err| err.to_string())?; - let target_account_id = - AccountId::from_hex(target_account_id).map_err(|err| err.to_string())?; - - let payment_transaction = - PaymentTransactionData::new(fungible_asset, sender_account_id, target_account_id); - - Ok(TransactionTemplate::PayToId(payment_transaction, note_type.into())) - }, - TransactionType::P2IDR { - sender_account_id, - target_account_id, - faucet_id, - amount, - recall_height, - note_type, - } => { - let faucet_id = AccountId::from_hex(faucet_id).map_err(|err| err.to_string())?; - let fungible_asset = - FungibleAsset::new(faucet_id, *amount).map_err(|err| err.to_string())?.into(); - let sender_account_id = - AccountId::from_hex(sender_account_id).map_err(|err| err.to_string())?; - let target_account_id = - AccountId::from_hex(target_account_id).map_err(|err| err.to_string())?; - - let payment_transaction = - PaymentTransactionData::new(fungible_asset, sender_account_id, target_account_id); - Ok(TransactionTemplate::PayToIdWithRecall( - payment_transaction, - *recall_height, - note_type.into(), - )) - }, - TransactionType::Mint { - faucet_id, - target_account_id, - amount, - note_type, - } => { - let faucet_id = AccountId::from_hex(faucet_id).map_err(|err| err.to_string())?; - let fungible_asset = - FungibleAsset::new(faucet_id, *amount).map_err(|err| err.to_string())?; - let target_account_id = - AccountId::from_hex(target_account_id).map_err(|err| err.to_string())?; - - Ok(TransactionTemplate::MintFungibleAsset( - fungible_asset, - target_account_id, - note_type.into(), - )) - }, - TransactionType::ConsumeNotes { account_id, list_of_notes } => { - let list_of_notes = list_of_notes - .iter() - .map(|note_id| { - get_note_with_id_prefix(client, note_id) - .map(|note_record| note_record.id()) - .map_err(|err| err.to_string()) - }) - .collect::, _>>()?; - - let account_id = AccountId::from_hex(account_id).map_err(|err| err.to_string())?; - - Ok(TransactionTemplate::ConsumeNotes(account_id, list_of_notes)) - }, - } -} - -// LIST TRANSACTIONS -// ================================================================================================ -fn list_transactions( - client: Client, -) -> Result<(), String> { - let transactions = client.get_transactions(TransactionFilter::All)?; - print_transactions_summary(&transactions); - Ok(()) -} - -// HELPERS -// ================================================================================================ -fn print_transactions_summary<'a, I>(executed_transactions: I) -where - I: IntoIterator, -{ - let mut table = create_dynamic_table(&[ - "ID", - "Status", - "Account ID", - "Script Hash", - "Input Notes Count", - "Output Notes Count", - ]); - - for tx in executed_transactions { - table.add_row(vec![ - tx.id.to_string(), - tx.transaction_status.to_string(), - tx.account_id.to_string(), - tx.transaction_script - .as_ref() - .map(|x| x.hash().to_string()) - .unwrap_or("-".to_string()), - tx.input_note_nullifiers.len().to_string(), - tx.output_notes.num_notes().to_string(), - ]); - } - - println!("{table}"); -} diff --git a/src/client/accounts.rs b/src/client/accounts.rs deleted file mode 100644 index 0780a6751..000000000 --- a/src/client/accounts.rs +++ /dev/null @@ -1,318 +0,0 @@ -use miden_lib::AuthScheme; -use miden_objects::{ - accounts::{ - Account, AccountData, AccountId, AccountStorageType, AccountStub, AccountType, AuthData, - }, - assets::TokenSymbol, - crypto::{ - dsa::rpo_falcon512::SecretKey, - rand::{FeltRng, RpoRandomCoin}, - }, - Digest, Felt, Word, -}; - -use super::{rpc::NodeRpcClient, Client}; -use crate::{ - errors::ClientError, - store::{AuthInfo, Store}, -}; - -pub enum AccountTemplate { - BasicWallet { - mutable_code: bool, - storage_mode: AccountStorageMode, - }, - FungibleFaucet { - token_symbol: TokenSymbol, - decimals: u8, - max_supply: u64, - storage_mode: AccountStorageMode, - }, -} - -// TODO: Review this enum and variant names to have a consistent naming across all crates -#[derive(Debug, Clone, Copy)] -pub enum AccountStorageMode { - Local, - OnChain, -} - -impl From for AccountStorageType { - fn from(mode: AccountStorageMode) -> Self { - match mode { - AccountStorageMode::Local => AccountStorageType::OffChain, - AccountStorageMode::OnChain => AccountStorageType::OnChain, - } - } -} - -impl Client { - // ACCOUNT CREATION - // -------------------------------------------------------------------------------------------- - - /// Creates a new [Account] based on an [AccountTemplate] and saves it in the store - pub fn new_account( - &mut self, - template: AccountTemplate, - ) -> Result<(Account, Word), ClientError> { - let account_and_seed = match template { - AccountTemplate::BasicWallet { mutable_code, storage_mode } => { - self.new_basic_wallet(mutable_code, storage_mode) - }, - AccountTemplate::FungibleFaucet { - token_symbol, - decimals, - max_supply, - storage_mode, - } => self.new_fungible_faucet(token_symbol, decimals, max_supply, storage_mode), - }?; - - Ok(account_and_seed) - } - - /// Saves in the store the [Account] corresponding to `account_data`. - /// - /// # Errors - /// - /// Will return an error if trying to import a new account without providing its seed - /// - /// # Panics - /// - /// Will panic when trying to import a non-new account without a seed since this functionality - /// is not currently implemented - pub fn import_account(&mut self, account_data: AccountData) -> Result<(), ClientError> { - match account_data.auth { - AuthData::RpoFalcon512Seed(key_pair_seed) => { - // NOTE: The seed should probably come from a different format from miden-base's AccountData - let seed = Digest::try_from(&key_pair_seed)?.into(); - let mut rng = RpoRandomCoin::new(seed); - - let key_pair = SecretKey::with_rng(&mut rng); - - let account_seed = if !account_data.account.is_new() - && account_data.account_seed.is_some() - { - tracing::warn!("Imported an existing account and still provided a seed when it is not needed. It's possible that the account's file was incorrectly generated. The seed will be ignored."); - // Ignore the seed since it's not a new account - - // TODO: The alternative approach to this is to store the seed anyway, but - // ignore it at the point of executing against this transaction, but that - // approach seems a little bit more incorrect - None - } else { - account_data.account_seed - }; - - self.insert_account( - &account_data.account, - account_seed, - &AuthInfo::RpoFalcon512(key_pair), - ) - }, - } - } - - /// Creates a new regular account and saves it in the store along with its seed and auth data - fn new_basic_wallet( - &mut self, - mutable_code: bool, - account_storage_mode: AccountStorageMode, - ) -> Result<(Account, Word), ClientError> { - let key_pair = SecretKey::with_rng(&mut self.rng); - - let auth_scheme: AuthScheme = AuthScheme::RpoFalcon512 { pub_key: key_pair.public_key() }; - - // we need to use an initial seed to create the wallet account - let mut init_seed = [0u8; 32]; - self.rng.fill_bytes(&mut init_seed); - - let (account, seed) = if !mutable_code { - miden_lib::accounts::wallets::create_basic_wallet( - init_seed, - auth_scheme, - AccountType::RegularAccountImmutableCode, - account_storage_mode.into(), - ) - } else { - miden_lib::accounts::wallets::create_basic_wallet( - init_seed, - auth_scheme, - AccountType::RegularAccountUpdatableCode, - account_storage_mode.into(), - ) - }?; - - self.insert_account(&account, Some(seed), &AuthInfo::RpoFalcon512(key_pair))?; - Ok((account, seed)) - } - - fn new_fungible_faucet( - &mut self, - token_symbol: TokenSymbol, - decimals: u8, - max_supply: u64, - account_storage_mode: AccountStorageMode, - ) -> Result<(Account, Word), ClientError> { - let key_pair = SecretKey::with_rng(&mut self.rng); - - let auth_scheme: AuthScheme = AuthScheme::RpoFalcon512 { pub_key: key_pair.public_key() }; - - // we need to use an initial seed to create the wallet account - let mut init_seed = [0u8; 32]; - self.rng.fill_bytes(&mut init_seed); - - let (account, seed) = miden_lib::accounts::faucets::create_basic_fungible_faucet( - init_seed, - token_symbol, - decimals, - Felt::try_from(max_supply.to_le_bytes().as_slice()) - .expect("u64 can be safely converted to a field element"), - account_storage_mode.into(), - auth_scheme, - )?; - - self.insert_account(&account, Some(seed), &AuthInfo::RpoFalcon512(key_pair))?; - Ok((account, seed)) - } - - /// Inserts a new account into the client's store. - /// - /// # Errors - /// - /// If an account is new and no seed is provided, the function errors out because the client - /// cannot execute transactions against new accounts for which it does not know the seed. - pub fn insert_account( - &mut self, - account: &Account, - account_seed: Option, - auth_info: &AuthInfo, - ) -> Result<(), ClientError> { - if account.is_new() && account_seed.is_none() { - return Err(ClientError::ImportNewAccountWithoutSeed); - } - - self.store - .insert_account(account, account_seed, auth_info) - .map_err(ClientError::StoreError) - } - - // ACCOUNT DATA RETRIEVAL - // -------------------------------------------------------------------------------------------- - - /// Returns summary info about the accounts managed by this client. - pub fn get_accounts(&self) -> Result)>, ClientError> { - self.store.get_account_stubs().map_err(|err| err.into()) - } - - /// Returns summary info about the specified account. - pub fn get_account( - &self, - account_id: AccountId, - ) -> Result<(Account, Option), ClientError> { - self.store.get_account(account_id).map_err(|err| err.into()) - } - - /// Returns summary info about the specified account. - pub fn get_account_stub_by_id( - &self, - account_id: AccountId, - ) -> Result<(AccountStub, Option), ClientError> { - self.store.get_account_stub(account_id).map_err(|err| err.into()) - } - - /// Returns an [AuthInfo] object utilized to authenticate an account. - /// - /// # Errors - /// - /// Returns a [ClientError::StoreError] with a [StoreError::AccountDataNotFound](crate::errors::StoreError::AccountDataNotFound) if the provided ID does - /// not correspond to an existing account. - pub fn get_account_auth(&self, account_id: AccountId) -> Result { - self.store.get_account_auth(account_id).map_err(|err| err.into()) - } -} - -// TESTS -// ================================================================================================ - -#[cfg(test)] -pub mod tests { - use miden_objects::{ - accounts::{Account, AccountData, AccountId, AuthData}, - crypto::dsa::rpo_falcon512::SecretKey, - Word, - }; - - use crate::{ - mock::{ - get_account_with_default_account_code, get_new_account_with_default_account_code, - ACCOUNT_ID_FUNGIBLE_FAUCET_ON_CHAIN, ACCOUNT_ID_REGULAR, - }, - store::{sqlite_store::tests::create_test_client, AuthInfo}, - }; - - fn create_account_data(account_id: u64) -> AccountData { - let account_id = AccountId::try_from(account_id).unwrap(); - let account = get_account_with_default_account_code(account_id, Word::default(), None); - - AccountData::new( - account.clone(), - Some(Word::default()), - AuthData::RpoFalcon512Seed([0; 32]), - ) - } - - pub fn create_initial_accounts_data() -> Vec { - let account = create_account_data(ACCOUNT_ID_REGULAR); - - let faucet_account = create_account_data(ACCOUNT_ID_FUNGIBLE_FAUCET_ON_CHAIN); - - // Create Genesis state and save it to a file - let accounts = vec![account, faucet_account]; - - accounts - } - - #[test] - pub fn try_import_new_account() { - // generate test client - let mut client = create_test_client(); - - let account = get_new_account_with_default_account_code( - AccountId::try_from(ACCOUNT_ID_REGULAR).unwrap(), - Word::default(), - None, - ); - - let key_pair = SecretKey::new(); - - assert!(client - .insert_account(&account, None, &AuthInfo::RpoFalcon512(key_pair.clone())) - .is_err()); - assert!(client - .insert_account(&account, Some(Word::default()), &AuthInfo::RpoFalcon512(key_pair)) - .is_ok()); - } - - #[tokio::test] - async fn load_accounts_test() { - // generate test client - let mut client = create_test_client(); - - let created_accounts_data = create_initial_accounts_data(); - - for account_data in created_accounts_data.clone() { - client.import_account(account_data).unwrap(); - } - - let expected_accounts: Vec = created_accounts_data - .into_iter() - .map(|account_data| account_data.account) - .collect(); - let accounts = client.get_accounts().unwrap(); - - assert_eq!(accounts.len(), 2); - for (client_acc, expected_acc) in accounts.iter().zip(expected_accounts.iter()) { - assert_eq!(client_acc.0.hash(), expected_acc.hash()); - } - } -} diff --git a/src/client/chain_data.rs b/src/client/chain_data.rs deleted file mode 100644 index 8962a9173..000000000 --- a/src/client/chain_data.rs +++ /dev/null @@ -1,30 +0,0 @@ -use miden_objects::crypto::rand::FeltRng; -#[cfg(test)] -use miden_objects::BlockHeader; - -#[cfg(test)] -use crate::{ - client::{rpc::NodeRpcClient, Client}, - errors::ClientError, - store::Store, -}; - -#[cfg(test)] -impl Client { - pub fn get_block_headers_in_range( - &self, - start: u32, - finish: u32, - ) -> Result, ClientError> { - self.store - .get_block_headers(&(start..=finish).collect::>()) - .map_err(ClientError::StoreError) - } - - pub fn get_block_headers( - &self, - block_numbers: &[u32], - ) -> Result, ClientError> { - self.store.get_block_headers(block_numbers).map_err(ClientError::StoreError) - } -} diff --git a/src/client/mod.rs b/src/client/mod.rs deleted file mode 100644 index c0bd944e3..000000000 --- a/src/client/mod.rs +++ /dev/null @@ -1,94 +0,0 @@ -use miden_objects::{ - crypto::rand::{FeltRng, RpoRandomCoin}, - Felt, -}; -use miden_tx::TransactionExecutor; -use rand::Rng; - -use crate::{errors::ClientError, store::Store}; - -pub mod rpc; -use rpc::NodeRpcClient; - -pub mod accounts; -#[cfg(test)] -mod chain_data; -mod note_screener; -mod notes; -pub(crate) mod sync; -pub mod transactions; -pub(crate) use note_screener::NoteScreener; - -use crate::store::data_store::ClientDataStore; - -// MIDEN CLIENT -// ================================================================================================ - -/// A light client for connecting to the Miden rollup network. -/// -/// Miden client is responsible for managing a set of accounts. Specifically, the client: -/// - Keeps track of the current and historical states of a set of accounts and related objects -/// such as notes and transactions. -/// - Connects to one or more Miden nodes to periodically sync with the current state of the -/// network. -/// - Executes, proves, and submits transactions to the network as directed by the user. -pub struct Client { - /// The client's store, which provides a way to write and read entities to provide persistence. - store: S, - /// An instance of [FeltRng] which provides randomness tools for generating new keys, - /// serial numbers, etc. - rng: R, - /// An instance of [NodeRpcClient] which provides a way for the client to connect to the - /// Miden node. - rpc_api: N, - tx_executor: TransactionExecutor>, -} - -impl Client { - // CONSTRUCTOR - // -------------------------------------------------------------------------------------------- - - /// Returns a new instance of [Client]. - /// - /// ## Arguments - /// - /// - `api`: An instance of [NodeRpcClient] which provides a way for the client to connect to the Miden node. - /// - `store`: An instance of [Store], which provides a way to write and read entities to provide persistence. - /// - `executor_store`: An instance of [Store] that provides a way for [TransactionExecutor] to - /// retrieve relevant inputs at the moment of transaction execution. It should be the same - /// store as the one for `store`, but it doesn't have to be the **same instance** - /// - /// # Errors - /// - /// Returns an error if the client could not be instantiated. - pub fn new(api: N, rng: R, store: S, executor_store: S) -> Result { - Ok(Self { - store, - rng, - rpc_api: api, - tx_executor: TransactionExecutor::new(ClientDataStore::new(executor_store)), - }) - } - - #[cfg(any(test, feature = "test_utils"))] - pub fn rpc_api(&mut self) -> &mut N { - &mut self.rpc_api - } - - #[cfg(any(test, feature = "test_utils"))] - pub fn store(&mut self) -> &mut S { - &mut self.store - } -} - -// HELPERS -// -------------------------------------------------------------------------------------------- - -/// Gets [RpoRandomCoin] from the client -pub fn get_random_coin() -> RpoRandomCoin { - // TODO: Initialize coin status once along with the client and persist status for retrieval - let mut rng = rand::thread_rng(); - let coin_seed: [u64; 4] = rng.gen(); - - RpoRandomCoin::new(coin_seed.map(Felt::new)) -} diff --git a/src/client/note_screener.rs b/src/client/note_screener.rs deleted file mode 100644 index 676f93a4a..000000000 --- a/src/client/note_screener.rs +++ /dev/null @@ -1,239 +0,0 @@ -use std::collections::BTreeSet; - -use miden_objects::{accounts::AccountId, assets::Asset, notes::Note, Word}; - -use crate::{ - errors::{InvalidNoteInputsError, ScreenerError}, - store::Store, -}; - -// KNOWN SCRIPT ROOTS -// -------------------------------------------------------------------------------------------- -pub(crate) const P2ID_NOTE_SCRIPT_ROOT: &str = - "0xcdfd70344b952980272119bc02b837d14c07bbfc54f86a254422f39391b77b35"; -pub(crate) const P2IDR_NOTE_SCRIPT_ROOT: &str = - "0x41e5727b99a12b36066c09854d39d64dd09d9265c442a9be3626897572bf1745"; -pub(crate) const SWAP_NOTE_SCRIPT_ROOT: &str = - "0x5852920f88985b651cf7ef5e48623f898b6c292f4a2c25dd788ff8b46dd90417"; - -#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord)] -pub enum NoteRelevance { - /// The note can be consumed at any time. - Always, - /// The note can be consumed after the block with the specified number. - After(u32), -} - -pub struct NoteScreener<'a, S: Store> { - store: &'a S, -} - -impl<'a, S: Store> NoteScreener<'a, S> { - pub fn new(store: &'a S) -> Self { - Self { store } - } - - /// Returns a vector of tuples describing the relevance of the provided note to the - /// accounts monitored by this screener. - /// - /// Does a fast check for known scripts (P2ID, P2IDR, SWAP). We're currently - /// unable to execute notes that are not committed so a slow check for other scripts is currently - /// not available. - pub fn check_relevance( - &self, - note: &Note, - ) -> Result, ScreenerError> { - let account_ids = BTreeSet::from_iter(self.store.get_account_ids()?); - - let script_hash = note.script().hash().to_string(); - let note_relevance = match script_hash.as_str() { - P2ID_NOTE_SCRIPT_ROOT => Self::check_p2id_relevance(note, &account_ids)?, - P2IDR_NOTE_SCRIPT_ROOT => Self::check_p2idr_relevance(note, &account_ids)?, - SWAP_NOTE_SCRIPT_ROOT => self.check_swap_relevance(note, &account_ids)?, - _ => self.check_script_relevance(note, &account_ids)?, - }; - - Ok(note_relevance) - } - - fn check_p2id_relevance( - note: &Note, - account_ids: &BTreeSet, - ) -> Result, ScreenerError> { - let mut note_inputs_iter = note.inputs().values().iter(); - let account_id_felt = note_inputs_iter - .next() - .ok_or(InvalidNoteInputsError::NumInputsError(note.id(), 1))?; - - if note_inputs_iter.next().is_some() { - return Err(InvalidNoteInputsError::NumInputsError(note.id(), 1).into()); - } - - let account_id = AccountId::try_from(*account_id_felt) - .map_err(|err| InvalidNoteInputsError::AccountError(note.id(), err))?; - - if !account_ids.contains(&account_id) { - return Ok(vec![]); - } - Ok(vec![(account_id, NoteRelevance::Always)]) - } - - fn check_p2idr_relevance( - note: &Note, - account_ids: &BTreeSet, - ) -> Result, ScreenerError> { - let mut note_inputs_iter = note.inputs().values().iter(); - let account_id_felt = note_inputs_iter - .next() - .ok_or(InvalidNoteInputsError::NumInputsError(note.id(), 2))?; - let recall_height_felt = note_inputs_iter - .next() - .ok_or(InvalidNoteInputsError::NumInputsError(note.id(), 2))?; - - if note_inputs_iter.next().is_some() { - return Err(InvalidNoteInputsError::NumInputsError(note.id(), 2).into()); - } - - let sender = note.metadata().sender(); - let recall_height: u32 = recall_height_felt.as_int().try_into().map_err(|_err| { - InvalidNoteInputsError::BlockNumberError(note.id(), recall_height_felt.as_int()) - })?; - - let account_id = AccountId::try_from(*account_id_felt) - .map_err(|err| InvalidNoteInputsError::AccountError(note.id(), err))?; - - Ok(vec![ - (account_id, NoteRelevance::Always), - (sender, NoteRelevance::After(recall_height)), - ] - .into_iter() - .filter(|(account_id, _relevance)| account_ids.contains(account_id)) - .collect()) - } - - /// Checks if a swap note can be consumed by any account whose id is in `account_ids` - /// - /// This implementation serves as a placeholder as we're currently not able to create, execute - /// and send SWAP NOTES. Hence, it's also untested. The main logic should be the same: for each - /// account check if it has enough of the wanted asset. - /// This is also very inefficient as we're loading the full accounts. We should instead just - /// load the account's vaults, or even have a function in the `Store` to do this. - /// - /// TODO: test/revisit this in the future - fn check_swap_relevance( - &self, - note: &Note, - account_ids: &BTreeSet, - ) -> Result, ScreenerError> { - let note_inputs = note.inputs().to_vec(); - if note_inputs.len() != 9 { - return Ok(Vec::new()); - } - - // get the demanded asset from the note's inputs - let asset: Asset = - Word::from([note_inputs[4], note_inputs[5], note_inputs[6], note_inputs[7]]) - .try_into() - .map_err(|err| InvalidNoteInputsError::AssetError(note.id(), err))?; - let asset_faucet_id = AccountId::try_from(asset.vault_key()[3]) - .map_err(|err| InvalidNoteInputsError::AccountError(note.id(), err))?; - - let mut accounts_with_relevance = Vec::new(); - - for account_id in account_ids { - let (account, _) = self.store.get_account(*account_id)?; - - // Check that the account can cover the demanded asset - match asset { - Asset::NonFungible(_non_fungible_asset) - if account.vault().has_non_fungible_asset(asset).expect( - "Should be able to query has_non_fungible_asset for an Asset::NonFungible", - ) => - { - accounts_with_relevance.push((*account_id, NoteRelevance::Always)) - }, - Asset::Fungible(fungible_asset) - if account - .vault() - .get_balance(asset_faucet_id) - .expect("Should be able to query get_balance for an Asset::Fungible") - >= fungible_asset.amount() => - { - accounts_with_relevance.push((*account_id, NoteRelevance::Always)) - }, - _ => {}, - } - } - - Ok(accounts_with_relevance) - } - - fn check_script_relevance( - &self, - _note: &Note, - account_ids: &BTreeSet, - ) -> Result, ScreenerError> { - // TODO: try to execute the note script against relevant accounts; this will - // require querying data from the store - Ok(account_ids - .iter() - .map(|account_id| (*account_id, NoteRelevance::Always)) - .collect()) - } -} - -#[cfg(test)] -mod tests { - use miden_lib::notes::{create_p2id_note, create_p2idr_note, create_swap_note}; - use miden_objects::{ - accounts::{AccountId, ACCOUNT_ID_FUNGIBLE_FAUCET_OFF_CHAIN}, - assets::FungibleAsset, - crypto::rand::RpoRandomCoin, - notes::NoteType, - }; - - use crate::client::note_screener::{ - P2IDR_NOTE_SCRIPT_ROOT, P2ID_NOTE_SCRIPT_ROOT, SWAP_NOTE_SCRIPT_ROOT, - }; - - // We need to make sure the script roots we use for filters are in line with the note scripts - // coming from Miden objects - #[test] - fn ensure_correct_script_roots() { - // create dummy data for the notes - let faucet_id: AccountId = ACCOUNT_ID_FUNGIBLE_FAUCET_OFF_CHAIN.try_into().unwrap(); - let account_id: AccountId = ACCOUNT_ID_FUNGIBLE_FAUCET_OFF_CHAIN.try_into().unwrap(); - let rng = RpoRandomCoin::new(Default::default()); - - // create dummy notes to compare note script roots - let p2id_note = create_p2id_note( - account_id, - account_id, - vec![FungibleAsset::new(faucet_id, 100u64).unwrap().into()], - NoteType::OffChain, - rng, - ) - .unwrap(); - let p2idr_note = create_p2idr_note( - account_id, - account_id, - vec![FungibleAsset::new(faucet_id, 100u64).unwrap().into()], - NoteType::OffChain, - 10, - rng, - ) - .unwrap(); - let (swap_note, _serial_num) = create_swap_note( - account_id, - FungibleAsset::new(faucet_id, 100u64).unwrap().into(), - FungibleAsset::new(faucet_id, 100u64).unwrap().into(), - NoteType::OffChain, - rng, - ) - .unwrap(); - - assert_eq!(p2id_note.script().hash().to_string(), P2ID_NOTE_SCRIPT_ROOT); - assert_eq!(p2idr_note.script().hash().to_string(), P2IDR_NOTE_SCRIPT_ROOT); - assert_eq!(swap_note.script().hash().to_string(), SWAP_NOTE_SCRIPT_ROOT); - } -} diff --git a/src/client/notes.rs b/src/client/notes.rs deleted file mode 100644 index c4b2e9c5a..000000000 --- a/src/client/notes.rs +++ /dev/null @@ -1,30 +0,0 @@ -use miden_objects::{crypto::rand::FeltRng, notes::NoteId}; - -use super::{rpc::NodeRpcClient, Client}; -use crate::{ - errors::ClientError, - store::{InputNoteRecord, NoteFilter, Store}, -}; - -impl Client { - // INPUT NOTE DATA RETRIEVAL - // -------------------------------------------------------------------------------------------- - - /// Returns input notes managed by this client. - pub fn get_input_notes(&self, filter: NoteFilter) -> Result, ClientError> { - self.store.get_input_notes(filter).map_err(|err| err.into()) - } - - /// Returns the input note with the specified hash. - pub fn get_input_note(&self, note_id: NoteId) -> Result { - self.store.get_input_note(note_id).map_err(|err| err.into()) - } - - // INPUT NOTE CREATION - // -------------------------------------------------------------------------------------------- - - /// Imports a new input note into the client's store. - pub fn import_input_note(&mut self, note: InputNoteRecord) -> Result<(), ClientError> { - self.store.insert_input_note(¬e).map_err(|err| err.into()) - } -} diff --git a/src/client/rpc/mod.rs b/src/client/rpc/mod.rs deleted file mode 100644 index 98e058c41..000000000 --- a/src/client/rpc/mod.rs +++ /dev/null @@ -1,193 +0,0 @@ -use core::fmt; - -use async_trait::async_trait; -use miden_objects::{ - accounts::{Account, AccountId}, - crypto::merkle::{MerklePath, MmrDelta}, - notes::{Note, NoteId, NoteMetadata, NoteTag}, - transaction::ProvenTransaction, - BlockHeader, Digest, -}; - -use crate::errors::NodeRpcClientError; - -mod tonic_client; -pub use tonic_client::TonicRpcClient; - -// NOTE DETAILS -// ================================================================================================ - -/// Describes the possible responses from the `GetNotesById` endpoint for a single note -pub enum NoteDetails { - OffChain(NoteId, NoteMetadata, NoteInclusionDetails), - Public(Note, NoteInclusionDetails), -} - -/// Contains information related to the note inclusion, but not related to the block header -/// that contains the note -pub struct NoteInclusionDetails { - pub block_num: u32, - pub note_index: u32, - pub merkle_path: MerklePath, -} - -impl NoteInclusionDetails { - pub fn new(block_num: u32, note_index: u32, merkle_path: MerklePath) -> Self { - Self { block_num, note_index, merkle_path } - } -} - -// NODE RPC CLIENT TRAIT -// ================================================================================================ - -/// Defines the interface for communicating with the Miden node. -/// -/// The implementers are responsible for connecting to the Miden node, handling endpoint -/// requests/responses, and translating responses into domain objects relevant for each of the -/// endpoints. -#[async_trait] -pub trait NodeRpcClient { - /// Given a Proven Transaction, send it to the node for it to be included in a future block - /// using the `/SubmitProvenTransaction` rpc endpoint - async fn submit_proven_transaction( - &mut self, - proven_transaction: ProvenTransaction, - ) -> Result<(), NodeRpcClientError>; - - /// Given a block number, fetches the block header corresponding to that height from the node - /// using the `/GetBlockHeaderByNumber` endpoint - /// - /// When `None` is provided, returns info regarding the latest block - async fn get_block_header_by_number( - &mut self, - block_number: Option, - ) -> Result; - - /// Fetches note-related data for a list of [NoteId] using the `/GetNotesById` rpc endpoint - /// - /// For any NoteType::Offchain note, the return data is only the [NoteMetadata], whereas - /// for NoteType::Onchain notes, the return data includes all details. - async fn get_notes_by_id( - &mut self, - note_ids: &[NoteId], - ) -> Result, NodeRpcClientError>; - - /// Fetches info from the node necessary to perform a state sync using the - /// `/SyncState` rpc endpoint - /// - /// - `block_num` is the last block number known by the client. The returned [StateSyncInfo] - /// should contain data starting from the next block, until the first block which contains a - /// note of matching the requested tag, or the chain tip if there are no notes. - /// - `account_ids` is a list of account ids and determines the accounts the client is interested - /// in and should receive account updates of. - /// - `note_tags` is a list of tags used to filter the notes the client is interested in, which - /// serves as a "note group" filter. Notice that you can't filter by a specific note id - /// - `nullifiers_tags` similar to `note_tags`, is a list of tags used to filter the nullifiers - /// corresponding to some notes the client is interested in - async fn sync_state( - &mut self, - block_num: u32, - account_ids: &[AccountId], - note_tags: &[NoteTag], - nullifiers_tags: &[u16], - ) -> Result; - - /// Fetches the current state of an account from the node using the `/GetAccountDetails` rpc endpoint - /// - /// - `account_id` is the id of the wanted account. - async fn get_account_update( - &mut self, - account_id: AccountId, - ) -> Result; -} - -// STATE SYNC INFO -// ================================================================================================ - -/// Represents a `SyncStateResponse` with fields converted into domain types -pub struct StateSyncInfo { - /// The block number of the chain tip at the moment of the response - pub chain_tip: u32, - /// The returned block header - pub block_header: BlockHeader, - /// MMR delta that contains data for (current_block.num, incoming_block_header.num-1) - pub mmr_delta: MmrDelta, - /// Tuples of AccountId alongside their new account hashes - pub account_hash_updates: Vec<(AccountId, Digest)>, - /// List of tuples of Note ID, Note Index and Merkle Path for all new notes - pub note_inclusions: Vec, - /// List of nullifiers that identify spent notes - pub nullifiers: Vec, -} - -// COMMITTED NOTE -// ================================================================================================ - -/// Represents a committed note, returned as part of a `SyncStateResponse` -pub struct CommittedNote { - /// Note ID of the committed note - note_id: NoteId, - /// Note index for the note merkle tree - note_index: u32, - /// Merkle path for the note merkle tree up to the block's note root - merkle_path: MerklePath, - /// Note metadata - metadata: NoteMetadata, -} - -impl CommittedNote { - pub fn new( - note_id: NoteId, - note_index: u32, - merkle_path: MerklePath, - metadata: NoteMetadata, - ) -> Self { - Self { - note_id, - note_index, - merkle_path, - metadata, - } - } - - pub fn note_id(&self) -> &NoteId { - &self.note_id - } - - pub fn note_index(&self) -> u32 { - self.note_index - } - - pub fn merkle_path(&self) -> &MerklePath { - &self.merkle_path - } - - #[allow(dead_code)] - pub fn metadata(&self) -> NoteMetadata { - self.metadata - } -} - -// RPC API ENDPOINT -// ================================================================================================ -// -#[derive(Debug)] -pub enum NodeRpcClientEndpoint { - GetAccountDetails, - GetBlockHeaderByNumber, - SyncState, - SubmitProvenTx, -} - -impl fmt::Display for NodeRpcClientEndpoint { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - match self { - NodeRpcClientEndpoint::GetAccountDetails => write!(f, "get_account_details"), - NodeRpcClientEndpoint::GetBlockHeaderByNumber => { - write!(f, "get_block_header_by_number") - }, - NodeRpcClientEndpoint::SyncState => write!(f, "sync_state"), - NodeRpcClientEndpoint::SubmitProvenTx => write!(f, "submit_proven_transaction"), - } - } -} diff --git a/src/client/rpc/tonic_client.rs b/src/client/rpc/tonic_client.rs deleted file mode 100644 index 56a720d94..000000000 --- a/src/client/rpc/tonic_client.rs +++ /dev/null @@ -1,341 +0,0 @@ -use async_trait::async_trait; -use miden_node_proto::{ - errors::ConversionError, - generated::{ - requests::{ - GetAccountDetailsRequest, GetBlockHeaderByNumberRequest, GetNotesByIdRequest, - SubmitProvenTransactionRequest, SyncStateRequest, - }, - responses::SyncStateResponse, - rpc::api_client::ApiClient, - }, -}; -use miden_objects::{ - accounts::{Account, AccountId}, - notes::{Note, NoteId, NoteMetadata, NoteTag, NoteType}, - transaction::ProvenTransaction, - utils::Deserializable, - BlockHeader, Digest, Felt, -}; -use miden_tx::utils::Serializable; -use tonic::transport::Channel; - -use super::{ - CommittedNote, NodeRpcClient, NodeRpcClientEndpoint, NoteDetails, NoteInclusionDetails, - StateSyncInfo, -}; -use crate::errors::NodeRpcClientError; - -// TONIC RPC CLIENT -// ================================================================================================ - -/// Client for the Node RPC API using tonic -/// -/// Wraps the ApiClient which defers establishing a connection with a node until necessary -pub struct TonicRpcClient { - rpc_api: Option>, - endpoint: String, -} - -impl TonicRpcClient { - /// Returns a new instance of [TonicRpcClient] that'll do calls the `config_endpoint` provided - pub fn new(config_endpoint: &str) -> TonicRpcClient { - TonicRpcClient { - rpc_api: None, - endpoint: config_endpoint.to_string(), - } - } - - /// Takes care of establishing the RPC connection if not connected yet and returns a reference - /// to the inner ApiClient - async fn rpc_api(&mut self) -> Result<&mut ApiClient, NodeRpcClientError> { - if self.rpc_api.is_some() { - Ok(self.rpc_api.as_mut().unwrap()) - } else { - let rpc_api = ApiClient::connect(self.endpoint.clone()) - .await - .map_err(|err| NodeRpcClientError::ConnectionError(err.to_string()))?; - Ok(self.rpc_api.insert(rpc_api)) - } - } -} - -#[async_trait] -impl NodeRpcClient for TonicRpcClient { - async fn submit_proven_transaction( - &mut self, - proven_transaction: ProvenTransaction, - ) -> Result<(), NodeRpcClientError> { - let request = SubmitProvenTransactionRequest { - transaction: proven_transaction.to_bytes(), - }; - let rpc_api = self.rpc_api().await?; - rpc_api.submit_proven_transaction(request).await.map_err(|err| { - NodeRpcClientError::RequestError( - NodeRpcClientEndpoint::SubmitProvenTx.to_string(), - err.to_string(), - ) - })?; - - Ok(()) - } - - async fn get_block_header_by_number( - &mut self, - block_num: Option, - ) -> Result { - let request = GetBlockHeaderByNumberRequest { block_num }; - let rpc_api = self.rpc_api().await?; - let api_response = rpc_api.get_block_header_by_number(request).await.map_err(|err| { - NodeRpcClientError::RequestError( - NodeRpcClientEndpoint::GetBlockHeaderByNumber.to_string(), - err.to_string(), - ) - })?; - - api_response - .into_inner() - .block_header - .ok_or(NodeRpcClientError::ExpectedFieldMissing("BlockHeader".into()))? - .try_into() - .map_err(|err: ConversionError| NodeRpcClientError::ConversionFailure(err.to_string())) - } - - async fn get_notes_by_id( - &mut self, - note_ids: &[NoteId], - ) -> Result, NodeRpcClientError> { - let request = GetNotesByIdRequest { - note_ids: note_ids.iter().map(|id| id.inner().into()).collect(), - }; - let rpc_api = self.rpc_api().await?; - let api_response = rpc_api.get_notes_by_id(request).await.map_err(|err| { - NodeRpcClientError::RequestError( - NodeRpcClientEndpoint::GetBlockHeaderByNumber.to_string(), - err.to_string(), - ) - })?; - - let rpc_notes = api_response.into_inner().notes; - let mut response_notes = Vec::with_capacity(rpc_notes.len()); - for note in rpc_notes { - let sender_id = - note.sender.ok_or(NodeRpcClientError::ExpectedFieldMissing("Sender".into()))?; - - let inclusion_details = { - let merkle_path = note - .merkle_path - .ok_or(NodeRpcClientError::ExpectedFieldMissing("Notes.MerklePath".into()))? - .try_into()?; - - NoteInclusionDetails::new(note.block_num, note.note_index, merkle_path) - }; - - let note = match note.details { - // On-chain notes include details - Some(details) => { - let note = Note::read_from_bytes(&details)?; - - NoteDetails::Public(note, inclusion_details) - }, - // Off-chain notes do not have details - None => { - let note_tag = NoteTag::from(note.tag).validate(NoteType::OffChain)?; - let note_metadata = NoteMetadata::new( - sender_id.try_into()?, - NoteType::OffChain, - note_tag, - Felt::default(), - )?; - let note_id: miden_objects::Digest = note - .note_id - .ok_or(NodeRpcClientError::ExpectedFieldMissing("Notes.NoteId".into()))? - .try_into()?; - - NoteDetails::OffChain(NoteId::from(note_id), note_metadata, inclusion_details) - }, - }; - response_notes.push(note) - } - Ok(response_notes) - } - - /// Sends a sync state request to the Miden node, validates and converts the response - /// into a [StateSyncInfo] struct. - async fn sync_state( - &mut self, - block_num: u32, - account_ids: &[AccountId], - note_tags: &[NoteTag], - nullifiers_tags: &[u16], - ) -> Result { - let account_ids = account_ids.iter().map(|acc| (*acc).into()).collect(); - - let nullifiers = nullifiers_tags.iter().map(|&nullifier| nullifier as u32).collect(); - - let note_tags = note_tags.iter().map(|¬e_tag| note_tag.into()).collect(); - - let request = SyncStateRequest { - block_num, - account_ids, - note_tags, - nullifiers, - }; - - let rpc_api = self.rpc_api().await?; - let response = rpc_api.sync_state(request).await.map_err(|err| { - NodeRpcClientError::RequestError( - NodeRpcClientEndpoint::SyncState.to_string(), - err.to_string(), - ) - })?; - response.into_inner().try_into() - } - - /// Sends a [GetAccountDetailsRequest] to the Miden node, and extracts an [Account] from the - /// `GetAccountDetailsResponse` response. - /// - /// # Errors - /// - /// This function will return an error if: - /// - /// - The provided account is not on-chain: this is due to the fact that for offchain accounts - /// the client is responsible - /// - There was an error sending the request to the node - /// - The answer had a `None` for its account, or the account had a `None` at the `details` field. - /// - There is an error during [Account] deserialization - async fn get_account_update( - &mut self, - account_id: AccountId, - ) -> Result { - if !account_id.is_on_chain() { - return Err(NodeRpcClientError::InvalidAccountReceived( - "should only get updates for offchain accounts".to_string(), - )); - } - - let account_id = account_id.into(); - let request = GetAccountDetailsRequest { account_id: Some(account_id) }; - - let rpc_api = self.rpc_api().await?; - - let response = rpc_api.get_account_details(request).await.map_err(|err| { - NodeRpcClientError::RequestError( - NodeRpcClientEndpoint::GetAccountDetails.to_string(), - err.to_string(), - ) - })?; - let response = response.into_inner(); - let account_info = response.account.ok_or(NodeRpcClientError::ExpectedFieldMissing( - "GetAccountDetails response should have an `account`".to_string(), - ))?; - - let details_bytes = - account_info.details.ok_or(NodeRpcClientError::ExpectedFieldMissing( - "GetAccountDetails response's account should have `details`".to_string(), - ))?; - - let details = Account::read_from_bytes(&details_bytes)?; - - Ok(details) - } -} - -// STATE SYNC INFO CONVERSION -// ================================================================================================ - -impl TryFrom for StateSyncInfo { - type Error = NodeRpcClientError; - - fn try_from(value: SyncStateResponse) -> Result { - let chain_tip = value.chain_tip; - - // Validate and convert block header - let block_header = value - .block_header - .ok_or(NodeRpcClientError::ExpectedFieldMissing("BlockHeader".into()))? - .try_into()?; - - // Validate and convert MMR Delta - let mmr_delta = value - .mmr_delta - .ok_or(NodeRpcClientError::ExpectedFieldMissing("MmrDelta".into()))? - .try_into()?; - - // Validate and convert account hash updates into an (AccountId, Digest) tuple - let mut account_hash_updates = vec![]; - for update in value.accounts { - let account_id = update - .account_id - .ok_or(NodeRpcClientError::ExpectedFieldMissing( - "AccountHashUpdate.AccountId".into(), - ))? - .try_into()?; - let account_hash = update - .account_hash - .ok_or(NodeRpcClientError::ExpectedFieldMissing( - "AccountHashUpdate.AccountHash".into(), - ))? - .try_into()?; - account_hash_updates.push((account_id, account_hash)); - } - - // Validate and convert account note inclusions into an (AccountId, Digest) tuple - let mut note_inclusions = vec![]; - for note in value.notes { - let note_id: Digest = note - .note_id - .ok_or(NodeRpcClientError::ExpectedFieldMissing("Notes.Id".into()))? - .try_into()?; - - let note_id: NoteId = note_id.into(); - - let merkle_path = note - .merkle_path - .ok_or(NodeRpcClientError::ExpectedFieldMissing("Notes.MerklePath".into()))? - .try_into()?; - - let sender_account_id = note - .sender - .ok_or(NodeRpcClientError::ExpectedFieldMissing("Notes.Sender".into()))? - .try_into()?; - - let note_type = NoteType::try_from(Felt::new(note.note_type.into()))?; - let metadata = NoteMetadata::new( - sender_account_id, - note_type, - note.tag.into(), - Default::default(), - )?; - - let committed_note = - CommittedNote::new(note_id, note.note_index, merkle_path, metadata); - - note_inclusions.push(committed_note); - } - - let nullifiers = value - .nullifiers - .iter() - .map(|nul_update| { - nul_update - .clone() - .nullifier - .ok_or(NodeRpcClientError::ExpectedFieldMissing("Nullifier".into())) - .and_then(|n| { - Digest::try_from(n) - .map_err(|err| NodeRpcClientError::ConversionFailure(err.to_string())) - }) - }) - .collect::, NodeRpcClientError>>()?; - - Ok(Self { - chain_tip, - block_header, - mmr_delta, - account_hash_updates, - note_inclusions, - nullifiers, - }) - } -} diff --git a/src/client/sync.rs b/src/client/sync.rs deleted file mode 100644 index c910508eb..000000000 --- a/src/client/sync.rs +++ /dev/null @@ -1,475 +0,0 @@ -use std::collections::BTreeSet; - -use crypto::merkle::{InOrderIndex, MmrDelta, MmrPeaks, PartialMmr}; -use miden_objects::{ - accounts::{Account, AccountId, AccountStub}, - crypto::{self, rand::FeltRng}, - notes::{NoteExecutionMode, NoteId, NoteInclusionProof, NoteTag}, - transaction::{InputNote, TransactionId}, - BlockHeader, Digest, -}; -use tracing::{info, warn}; - -use super::{ - rpc::{CommittedNote, NodeRpcClient, NoteDetails}, - transactions::TransactionRecord, - Client, -}; -use crate::{ - errors::{ClientError, StoreError}, - store::{ChainMmrNodeFilter, NoteFilter, Store, TransactionFilter}, -}; - -pub enum SyncStatus { - SyncedToLastBlock(u32), - SyncedToBlock(u32), -} - -/// Contains information about new notes as consequence of a sync -pub struct SyncedNewNotes { - /// A list of public notes that have been received on sync - new_public_notes: Vec, - /// A list of note IDs alongside their inclusion proofs for locally-tracked - /// notes - new_inclusion_proofs: Vec<(NoteId, NoteInclusionProof)>, -} - -impl SyncedNewNotes { - pub fn new( - new_public_notes: Vec, - new_inclusion_proofs: Vec<(NoteId, NoteInclusionProof)>, - ) -> Self { - Self { new_public_notes, new_inclusion_proofs } - } - - pub fn new_public_notes(&self) -> &[InputNote] { - &self.new_public_notes - } - - pub fn new_inclusion_proofs(&self) -> &[(NoteId, NoteInclusionProof)] { - &self.new_inclusion_proofs - } - - /// Returns whether no new note-related information has been retrieved - pub fn is_empty(&self) -> bool { - self.new_inclusion_proofs.is_empty() && self.new_public_notes.is_empty() - } -} - -// CONSTANTS -// ================================================================================================ - -/// The number of bits to shift identifiers for in use of filters. -pub const FILTER_ID_SHIFT: u8 = 48; - -impl Client { - // SYNC STATE - // -------------------------------------------------------------------------------------------- - - /// Returns the block number of the last state sync block. - pub fn get_sync_height(&self) -> Result { - self.store.get_sync_height().map_err(|err| err.into()) - } - - /// Returns the list of note tags tracked by the client. - pub fn get_note_tags(&self) -> Result, ClientError> { - self.store.get_note_tags().map_err(|err| err.into()) - } - - /// Adds a note tag for the client to track. - pub fn add_note_tag(&mut self, tag: u64) -> Result<(), ClientError> { - match self.store.add_note_tag(tag).map_err(|err| err.into()) { - Ok(true) => Ok(()), - Ok(false) => { - warn!("Tag {} is already being tracked", tag); - Ok(()) - }, - Err(err) => Err(err), - } - } - - /// Syncs the client's state with the current state of the Miden network. - /// Before doing so, it ensures the genesis block exists in the local store. - /// - /// Returns the block number the client has been synced to. - pub async fn sync_state(&mut self) -> Result { - self.ensure_genesis_in_place().await?; - loop { - let response = self.sync_state_once().await?; - if let SyncStatus::SyncedToLastBlock(v) = response { - return Ok(v); - } - } - } - - /// Attempts to retrieve the genesis block from the store. If not found, - /// it requests it from the node and store it. - async fn ensure_genesis_in_place(&mut self) -> Result<(), ClientError> { - let genesis = self.store.get_block_header_by_num(0); - - match genesis { - Ok(_) => Ok(()), - Err(StoreError::BlockHeaderNotFound(0)) => self.retrieve_and_store_genesis().await, - Err(err) => Err(ClientError::StoreError(err)), - } - } - - /// Calls `get_block_header_by_number` requesting the genesis block and storing it - /// in the local database - async fn retrieve_and_store_genesis(&mut self) -> Result<(), ClientError> { - let genesis_block = self.rpc_api.get_block_header_by_number(Some(0)).await?; - - let blank_mmr_peaks = - MmrPeaks::new(0, vec![]).expect("Blank MmrPeaks should not fail to instantiate"); - // NOTE: If genesis block data ever includes notes in the future, the third parameter in - // this `insert_block_header` call may be `true` - self.store.insert_block_header(genesis_block, blank_mmr_peaks, false)?; - Ok(()) - } - - async fn sync_state_once(&mut self) -> Result { - let current_block_num = self.store.get_sync_height()?; - - let accounts: Vec = self - .store - .get_account_stubs()? - .into_iter() - .map(|(acc_stub, _)| acc_stub) - .collect(); - - let note_tags: Vec = accounts - .iter() - .map(|acc| NoteTag::from_account_id(acc.id(), NoteExecutionMode::Local)) - .collect::, _>>()?; - - // To receive information about added nullifiers, we reduce them to the higher 16 bits - // Note that besides filtering by nullifier prefixes, the node also filters by block number - // (it only returns nullifiers from current_block_num until response.block_header.block_num()) - let nullifiers_tags: Vec = self - .store - .get_unspent_input_note_nullifiers()? - .iter() - .map(|nullifier| (nullifier.inner()[3].as_int() >> FILTER_ID_SHIFT) as u16) - .collect(); - - // Send request - let account_ids: Vec = accounts.iter().map(|acc| acc.id()).collect(); - let response = self - .rpc_api - .sync_state(current_block_num, &account_ids, ¬e_tags, &nullifiers_tags) - .await?; - - // We don't need to continue if the chain has not advanced - if response.block_header.block_num() == current_block_num { - return Ok(SyncStatus::SyncedToLastBlock(current_block_num)); - } - - let new_note_details = - self.get_note_details(response.note_inclusions, &response.block_header).await?; - - let (onchain_accounts, offchain_accounts): (Vec<_>, Vec<_>) = - accounts.into_iter().partition(|account_stub| account_stub.id().is_on_chain()); - - let updated_onchain_accounts = self - .get_updated_onchain_accounts(&response.account_hash_updates, &onchain_accounts) - .await?; - self.validate_local_account_hashes(&response.account_hash_updates, &offchain_accounts)?; - - // Derive new nullifiers data - let new_nullifiers = self.get_new_nullifiers(response.nullifiers)?; - - // Build PartialMmr with current data and apply updates - let (new_peaks, new_authentication_nodes) = { - let current_partial_mmr = self.build_current_partial_mmr()?; - - let (current_block, has_relevant_notes) = - self.store.get_block_header_by_num(current_block_num)?; - - apply_mmr_changes( - current_partial_mmr, - response.mmr_delta, - current_block, - has_relevant_notes, - )? - }; - - let note_ids: Vec = - new_note_details.new_inclusion_proofs.iter().map(|(id, _)| (*id)).collect(); - - let uncommitted_transactions = - self.store.get_transactions(TransactionFilter::Uncomitted)?; - - let transactions_to_commit = get_transactions_to_commit( - &uncommitted_transactions, - ¬e_ids, - &new_nullifiers, - &response.account_hash_updates, - ); - - // Apply received and computed updates to the store - self.store - .apply_state_sync( - response.block_header, - new_nullifiers, - new_note_details, - &transactions_to_commit, - new_peaks, - &new_authentication_nodes, - &updated_onchain_accounts, - ) - .map_err(ClientError::StoreError)?; - - if response.chain_tip == response.block_header.block_num() { - Ok(SyncStatus::SyncedToLastBlock(response.chain_tip)) - } else { - Ok(SyncStatus::SyncedToBlock(response.block_header.block_num())) - } - } - - // HELPERS - // -------------------------------------------------------------------------------------------- - - /// Extracts information about notes that the client is interested in, creating the note inclusion - /// proof in order to correctly update store data - async fn get_note_details( - &mut self, - committed_notes: Vec, - block_header: &BlockHeader, - ) -> Result { - // We'll only pick committed notes that we are tracking as input/output notes. Since the - // sync response contains notes matching either the provided accounts or the provided tag - // we might get many notes when we only care about a few of those. - - let mut new_public_notes = vec![]; - let mut local_notes_proofs = vec![]; - - let pending_input_notes = - self.store.get_input_notes(NoteFilter::Pending)?.into_iter().map(|n| n.id()); - - let pending_output_notes = - self.store.get_output_notes(NoteFilter::Pending)?.into_iter().map(|n| n.id()); - - let mut all_pending_notes: BTreeSet = BTreeSet::new(); - - pending_input_notes.chain(pending_output_notes).for_each(|id| { - all_pending_notes.insert(id); - }); - - for committed_note in committed_notes { - if all_pending_notes.contains(committed_note.note_id()) { - // The note belongs to our locally tracked set of pending notes, build the inclusion proof - let note_with_inclusion_proof = NoteInclusionProof::new( - block_header.block_num(), - block_header.sub_hash(), - block_header.note_root(), - committed_note.note_index().into(), - committed_note.merkle_path().clone(), - ) - .map_err(ClientError::NoteError) - .map(|proof| (*committed_note.note_id(), proof))?; - - local_notes_proofs.push(note_with_inclusion_proof); - } else { - // The note is public and we are not tracking it, push to the list of IDs to query - new_public_notes.push(*committed_note.note_id()); - } - } - - // Query the node for input note data and build the entities - let new_public_notes = - self.fetch_public_note_details(&new_public_notes, block_header).await?; - - Ok(SyncedNewNotes::new(new_public_notes, local_notes_proofs)) - } - - /// Queries the node for all received notes that are not being locally tracked in the client - /// - /// The client can receive metadata for private notes that it's not tracking. In this case, - /// notes are ignored for now as they become useless until details are imported. - async fn fetch_public_note_details( - &mut self, - query_notes: &[NoteId], - block_header: &BlockHeader, - ) -> Result, ClientError> { - if query_notes.is_empty() { - return Ok(vec![]); - } - info!("Getting note details for notes that are not being tracked."); - - let notes_data = self.rpc_api.get_notes_by_id(query_notes).await?; - let mut return_notes = Vec::with_capacity(query_notes.len()); - for note_data in notes_data { - match note_data { - NoteDetails::OffChain(id, ..) => { - // TODO: Is there any benefit to not ignoring these? In any case we do not have - // the recipient which is mandatory right now. - info!("Note {} is private but the client is not tracking it, ignoring.", id); - }, - NoteDetails::Public(note, inclusion_proof) => { - info!("Retrieved details for Note ID {}.", note.id()); - let note_inclusion_proof = NoteInclusionProof::new( - block_header.block_num(), - block_header.sub_hash(), - block_header.note_root(), - inclusion_proof.note_index as u64, - inclusion_proof.merkle_path, - ) - .map_err(ClientError::NoteError)?; - - return_notes.push(InputNote::new(note, note_inclusion_proof)) - }, - } - } - Ok(return_notes) - } - - /// Builds the current view of the chain's [PartialMmr]. Because we want to add all new - /// authentication nodes that could come from applying the MMR updates, we need to track all - /// known leaves thus far. - /// - /// As part of the syncing process, we add the current block number so we don't need to - /// track it here. - pub(crate) fn build_current_partial_mmr(&self) -> Result { - let current_block_num = self.store.get_sync_height()?; - - let tracked_nodes = self.store.get_chain_mmr_nodes(ChainMmrNodeFilter::All)?; - let current_peaks = self.store.get_chain_mmr_peaks_by_block_num(current_block_num)?; - - let track_latest = if current_block_num != 0 { - match self.store.get_block_header_by_num(current_block_num - 1) { - Ok((_, previous_block_had_notes)) => Ok(previous_block_had_notes), - Err(StoreError::BlockHeaderNotFound(_)) => Ok(false), - Err(err) => Err(ClientError::StoreError(err)), - }? - } else { - false - }; - - Ok(PartialMmr::from_parts(current_peaks, tracked_nodes, track_latest)) - } - - /// Extracts information about nullifiers for unspent input notes that the client is tracking - /// from the received [SyncStateResponse] - fn get_new_nullifiers(&self, new_nullifiers: Vec) -> Result, ClientError> { - // Get current unspent nullifiers - let nullifiers = self - .store - .get_unspent_input_note_nullifiers()? - .iter() - .map(|nullifier| nullifier.inner()) - .collect::>(); - - let new_nullifiers = new_nullifiers - .into_iter() - .filter(|nullifier| nullifiers.contains(nullifier)) - .collect(); - - Ok(new_nullifiers) - } - - async fn get_updated_onchain_accounts( - &mut self, - account_updates: &[(AccountId, Digest)], - current_onchain_accounts: &[AccountStub], - ) -> Result, ClientError> { - let mut accounts_to_update: Vec = Vec::new(); - for (remote_account_id, remote_account_hash) in account_updates { - // check if this updated account is tracked by the client - let current_account = current_onchain_accounts - .iter() - .find(|acc| *remote_account_id == acc.id() && *remote_account_hash != acc.hash()); - - if let Some(tracked_account) = current_account { - info!("On-chain account hash difference detected for account with ID: {}. Fetching node for updates...", tracked_account.id()); - let account = self.rpc_api.get_account_update(tracked_account.id()).await?; - accounts_to_update.push(account); - } - } - Ok(accounts_to_update) - } - - /// Validates account hash updates and returns an error if there is a mismatch. - fn validate_local_account_hashes( - &mut self, - account_updates: &[(AccountId, Digest)], - current_offchain_accounts: &[AccountStub], - ) -> Result<(), ClientError> { - for (remote_account_id, remote_account_hash) in account_updates { - // ensure that if we track that account, it has the same hash - let mismatched_accounts = current_offchain_accounts - .iter() - .find(|acc| *remote_account_id == acc.id() && *remote_account_hash != acc.hash()); - - // OffChain accounts should always have the latest known state - if mismatched_accounts.is_some() { - return Err(StoreError::AccountHashMismatch(*remote_account_id).into()); - } - } - Ok(()) - } -} - -// UTILS -// -------------------------------------------------------------------------------------------- - -/// Applies changes to the Mmr structure, storing authentication nodes for leaves we track -/// and returns the updated [PartialMmr] -fn apply_mmr_changes( - current_partial_mmr: PartialMmr, - mmr_delta: MmrDelta, - current_block_header: BlockHeader, - current_block_has_relevant_notes: bool, -) -> Result<(MmrPeaks, Vec<(InOrderIndex, Digest)>), StoreError> { - let mut partial_mmr: PartialMmr = current_partial_mmr; - - // First, apply curent_block to the Mmr - let new_authentication_nodes = partial_mmr - .add(current_block_header.hash(), current_block_has_relevant_notes) - .into_iter(); - - // Apply the Mmr delta to bring Mmr to forest equal to chain tip - let new_authentication_nodes: Vec<(InOrderIndex, Digest)> = partial_mmr - .apply(mmr_delta) - .map_err(StoreError::MmrError)? - .into_iter() - .chain(new_authentication_nodes) - .collect(); - - Ok((partial_mmr.peaks(), new_authentication_nodes)) -} - -/// Returns the list of transactions that should be marked as committed based on the state update info -/// -/// To set an uncommitted transaction as committed three things must hold: -/// -/// - All of the transaction's output notes are committed -/// - All of the transaction's input notes are consumed, which means we got their nullifiers as -/// part of the update -/// - The account corresponding to the transaction hash matches the transaction's -// final_account_state -fn get_transactions_to_commit( - uncommitted_transactions: &[TransactionRecord], - _note_ids: &[NoteId], - nullifiers: &[Digest], - account_hash_updates: &[(AccountId, Digest)], -) -> Vec { - uncommitted_transactions - .iter() - .filter(|t| { - // TODO: based on the discussion in - // https://github.com/0xPolygonMiden/miden-client/issues/144, we should be aware - // that in the future it'll be possible to have many transactions modifying an - // account be included in a single block. If that happens, we'll need to rewrite - // this check - - // TODO: Review this. Because we receive note IDs based on account ID tags, - // we cannot base the status change on output notes alone; - t.input_note_nullifiers.iter().all(|n| nullifiers.contains(n)) - //&& t.output_notes.iter().all(|n| note_ids.contains(&n.id())) - && account_hash_updates.iter().any(|(account_id, account_hash)| { - *account_id == t.account_id && *account_hash == t.final_account_state - }) - }) - .map(|t| t.id) - .collect() -} diff --git a/src/client/transactions/asm/transaction_scripts/auth_consume_notes.masm b/src/client/transactions/asm/transaction_scripts/auth_consume_notes.masm deleted file mode 100644 index 5cf19e425..000000000 --- a/src/client/transactions/asm/transaction_scripts/auth_consume_notes.masm +++ /dev/null @@ -1,5 +0,0 @@ -use.miden::contracts::auth::basic->auth_tx - -begin - call.auth_tx::auth_tx_rpo_falcon512 -end diff --git a/src/client/transactions/asm/transaction_scripts/auth_send_asset.masm b/src/client/transactions/asm/transaction_scripts/auth_send_asset.masm deleted file mode 100644 index 540c95e5f..000000000 --- a/src/client/transactions/asm/transaction_scripts/auth_send_asset.masm +++ /dev/null @@ -1,12 +0,0 @@ -use.miden::contracts::auth::basic->auth_tx -use.miden::contracts::wallets::basic->wallet - -begin - push.{recipient} - push.{note_type} - push.{tag} - push.{asset} - call.wallet::send_asset - drop drop dropw dropw - call.auth_tx::auth_tx_rpo_falcon512 -end diff --git a/src/client/transactions/asm/transaction_scripts/distribute_fungible_asset.masm b/src/client/transactions/asm/transaction_scripts/distribute_fungible_asset.masm deleted file mode 100644 index d26a77558..000000000 --- a/src/client/transactions/asm/transaction_scripts/distribute_fungible_asset.masm +++ /dev/null @@ -1,13 +0,0 @@ -use.miden::contracts::faucets::basic_fungible->faucet -use.miden::contracts::auth::basic->auth_tx - -begin - push.{recipient} - push.{note_type} - push.{tag} - push.{amount} - call.faucet::distribute - - call.auth_tx::auth_tx_rpo_falcon512 - dropw dropw -end diff --git a/src/client/transactions/mod.rs b/src/client/transactions/mod.rs deleted file mode 100644 index a656a9306..000000000 --- a/src/client/transactions/mod.rs +++ /dev/null @@ -1,440 +0,0 @@ -use alloc::collections::{BTreeMap, BTreeSet}; - -use miden_lib::notes::{create_p2id_note, create_p2idr_note}; -use miden_objects::{ - accounts::{AccountDelta, AccountId}, - assembly::ProgramAst, - assets::FungibleAsset, - crypto::rand::RpoRandomCoin, - notes::{Note, NoteId, NoteType}, - transaction::{ - ExecutedTransaction, OutputNotes, ProvenTransaction, TransactionArgs, TransactionId, - TransactionScript, - }, - Digest, Felt, Word, -}; -use miden_tx::{ProvingOptions, ScriptTarget, TransactionProver}; -use rand::Rng; -use tracing::info; - -use self::transaction_request::{PaymentTransactionData, TransactionRequest, TransactionTemplate}; -use super::{note_screener::NoteRelevance, rpc::NodeRpcClient, Client, FeltRng}; -use crate::{ - client::NoteScreener, - errors::ClientError, - store::{AuthInfo, Store, TransactionFilter}, -}; - -pub mod transaction_request; - -// TRANSACTION RESULT -// -------------------------------------------------------------------------------------------- - -/// Represents the result of executing a transaction by the client -/// -/// It contains an [ExecutedTransaction], a list of [Note] that describe the details of the notes -/// created by the transaction execution, and a list of `usize` `relevant_notes` that contain the -/// indices of `output_notes` that are relevant to the client -pub struct TransactionResult { - executed_transaction: ExecutedTransaction, - output_notes: Vec, - relevant_notes: Option>>, -} - -impl TransactionResult { - pub fn new(executed_transaction: ExecutedTransaction, created_notes: Vec) -> Self { - Self { - executed_transaction, - output_notes: created_notes, - relevant_notes: None, - } - } - - pub fn executed_transaction(&self) -> &ExecutedTransaction { - &self.executed_transaction - } - - pub fn created_notes(&self) -> &Vec { - &self.output_notes - } - - pub fn relevant_notes(&self) -> Vec<&Note> { - if let Some(relevant_notes) = &self.relevant_notes { - relevant_notes - .keys() - .map(|note_index| &self.output_notes[*note_index]) - .collect() - } else { - self.created_notes().iter().collect() - } - } - - pub fn set_relevant_notes( - &mut self, - relevant_notes: BTreeMap>, - ) { - self.relevant_notes = Some(relevant_notes); - } - - pub fn block_num(&self) -> u32 { - self.executed_transaction.block_header().block_num() - } - - pub fn transaction_arguments(&self) -> &TransactionArgs { - self.executed_transaction.tx_args() - } - - pub fn account_delta(&self) -> &AccountDelta { - self.executed_transaction.account_delta() - } -} - -// TRANSACTION RECORD -// -------------------------------------------------------------------------------------------- - -/// Describes a transaction that has been executed and is being tracked on the Client -/// -/// Currently, the `commit_height` (and `committed` status) is set based on the height -/// at which the transaction's output notes are committed. -pub struct TransactionRecord { - pub id: TransactionId, - pub account_id: AccountId, - pub init_account_state: Digest, - pub final_account_state: Digest, - pub input_note_nullifiers: Vec, - pub output_notes: OutputNotes, - pub transaction_script: Option, - pub block_num: u32, - pub transaction_status: TransactionStatus, -} - -impl TransactionRecord { - #[allow(clippy::too_many_arguments)] - pub fn new( - id: TransactionId, - account_id: AccountId, - init_account_state: Digest, - final_account_state: Digest, - input_note_nullifiers: Vec, - output_notes: OutputNotes, - transaction_script: Option, - block_num: u32, - transaction_status: TransactionStatus, - ) -> TransactionRecord { - TransactionRecord { - id, - account_id, - init_account_state, - final_account_state, - input_note_nullifiers, - output_notes, - transaction_script, - block_num, - transaction_status, - } - } -} - -/// Represents the status of a transaction -pub enum TransactionStatus { - /// Transaction has been submitted but not yet committed - Pending, - /// Transaction has been committed and included at the specified block number - Committed(u32), -} - -impl std::fmt::Display for TransactionStatus { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - match self { - TransactionStatus::Pending => write!(f, "Pending"), - TransactionStatus::Committed(block_number) => { - write!(f, "Committed (Block: {})", block_number) - }, - } - } -} - -impl Client { - // TRANSACTION DATA RETRIEVAL - // -------------------------------------------------------------------------------------------- - - /// Retrieves tracked transactions, filtered by [TransactionFilter]. - pub fn get_transactions( - &self, - filter: TransactionFilter, - ) -> Result, ClientError> { - self.store.get_transactions(filter).map_err(|err| err.into()) - } - - // TRANSACTION - // -------------------------------------------------------------------------------------------- - - /// Compiles a [TransactionTemplate] into a [TransactionRequest] that can be then executed by the - /// client - pub fn build_transaction_request( - &mut self, - transaction_template: TransactionTemplate, - ) -> Result { - let account_id = transaction_template.account_id(); - let account_auth = self.store.get_account_auth(account_id)?; - - match transaction_template { - TransactionTemplate::ConsumeNotes(_, notes) => { - let program_ast = ProgramAst::parse(transaction_request::AUTH_CONSUME_NOTES_SCRIPT) - .expect("shipped MASM is well-formed"); - let notes = notes.iter().map(|id| (*id, None)).collect(); - - let tx_script = { - let script_inputs = vec![account_auth.into_advice_inputs()]; - self.tx_executor.compile_tx_script(program_ast, script_inputs, vec![])? - }; - Ok(TransactionRequest::new(account_id, notes, vec![], Some(tx_script))) - }, - TransactionTemplate::MintFungibleAsset(asset, target_account_id, note_type) => { - self.build_mint_tx_request(asset, account_auth, target_account_id, note_type) - }, - TransactionTemplate::PayToId(payment_data, note_type) => { - self.build_p2id_tx_request(account_auth, payment_data, None, note_type) - }, - TransactionTemplate::PayToIdWithRecall(payment_data, recall_height, note_type) => self - .build_p2id_tx_request(account_auth, payment_data, Some(recall_height), note_type), - } - } - - /// Creates and executes a transaction specified by the template, but does not change the - /// local database. - /// - /// # Errors - /// - /// - Returns [ClientError::MissingOutputNotes] if the [TransactionRequest] ouput notes are - /// not a subset of executor's output notes - /// - Returns a [ClientError::TransactionExecutionError] - pub fn new_transaction( - &mut self, - transaction_request: TransactionRequest, - ) -> Result { - let account_id = transaction_request.account_id(); - self.tx_executor - .load_account(account_id) - .map_err(ClientError::TransactionExecutionError)?; - - let block_num = self.store.get_sync_height()?; - - let note_ids = transaction_request.get_input_note_ids(); - - let output_notes = transaction_request.expected_output_notes().to_vec(); - - // Execute the transaction and get the witness - let executed_transaction = self.tx_executor.execute_transaction( - account_id, - block_num, - ¬e_ids, - transaction_request.into(), - )?; - - // Check that the expected output notes is a subset of the transaction's output notes - let tx_note_ids: BTreeSet = - executed_transaction.output_notes().iter().map(|n| n.id()).collect(); - - let missing_note_ids: Vec = output_notes - .iter() - .filter_map(|n| (!tx_note_ids.contains(&n.id())).then_some(n.id())) - .collect(); - - if !missing_note_ids.is_empty() { - return Err(ClientError::MissingOutputNotes(missing_note_ids)); - } - - Ok(TransactionResult::new(executed_transaction, output_notes)) - } - - /// Proves the specified transaction witness, submits it to the node, and stores the transaction in - /// the local database for tracking. - pub async fn submit_transaction( - &mut self, - tx_result: TransactionResult, - ) -> Result<(), ClientError> { - let transaction_prover = TransactionProver::new(ProvingOptions::default()); - - let proven_transaction = - transaction_prover.prove_transaction(tx_result.executed_transaction().clone())?; - - info!("Proved transaction, submitting to the node..."); - - self.submit_proven_transaction_request(proven_transaction.clone()).await?; - - let note_screener = NoteScreener::new(&self.store); - let mut relevant_notes = BTreeMap::new(); - - for (idx, note) in tx_result.created_notes().iter().enumerate() { - let account_relevance = note_screener.check_relevance(note)?; - if !account_relevance.is_empty() { - relevant_notes.insert(idx, account_relevance); - } - } - - let mut tx_result = tx_result; - tx_result.set_relevant_notes(relevant_notes); - - // Transaction was proven and submitted to the node correctly, persist note details and update account - self.store.apply_transaction(tx_result)?; - - Ok(()) - } - - /// Compiles the provided transaction script source and inputs into a [TransactionScript] and - /// checks (to the extent possible) that the transaction script can be executed against all - /// accounts with the specified interfaces. - pub fn compile_tx_script( - &self, - program: ProgramAst, - inputs: T, - target_account_procs: Vec, - ) -> Result - where - T: IntoIterator)>, - { - self.tx_executor - .compile_tx_script(program, inputs, target_account_procs) - .map_err(ClientError::TransactionExecutionError) - } - - async fn submit_proven_transaction_request( - &mut self, - proven_transaction: ProvenTransaction, - ) -> Result<(), ClientError> { - Ok(self.rpc_api.submit_proven_transaction(proven_transaction).await?) - } - - // HELPERS - // -------------------------------------------------------------------------------------------- - - /// Gets [RpoRandomCoin] from the client - fn get_random_coin(&self) -> RpoRandomCoin { - // TODO: Initialize coin status once along with the client and persist status for retrieval - let mut rng = rand::thread_rng(); - let coin_seed: [u64; 4] = rng.gen(); - - RpoRandomCoin::new(coin_seed.map(Felt::new)) - } - - /// Helper to build a [TransactionRequest] for P2ID-type transactions easily. - /// - /// - auth_info has to be from the executor account - /// - If recall_height is Some(), a P2IDR note will be created. Otherwise, a P2ID is created. - fn build_p2id_tx_request( - &self, - auth_info: AuthInfo, - payment_data: PaymentTransactionData, - recall_height: Option, - note_type: NoteType, - ) -> Result { - let random_coin = self.get_random_coin(); - - let created_note = if let Some(recall_height) = recall_height { - create_p2idr_note( - payment_data.account_id(), - payment_data.target_account_id(), - vec![payment_data.asset()], - note_type, - recall_height, - random_coin, - )? - } else { - create_p2id_note( - payment_data.account_id(), - payment_data.target_account_id(), - vec![payment_data.asset()], - note_type, - random_coin, - )? - }; - - let recipient = created_note - .recipient_digest() - .iter() - .map(|x| x.as_int().to_string()) - .collect::>() - .join("."); - - let note_tag = created_note.metadata().tag().inner(); - - let tx_script = ProgramAst::parse( - &transaction_request::AUTH_SEND_ASSET_SCRIPT - .replace("{recipient}", &recipient) - .replace("{note_type}", &Felt::new(note_type as u64).to_string()) - .replace("{tag}", &Felt::new(note_tag.into()).to_string()) - .replace("{asset}", &prepare_word(&payment_data.asset().into()).to_string()), - ) - .expect("shipped MASM is well-formed"); - - let tx_script = { - let script_inputs = vec![auth_info.into_advice_inputs()]; - self.tx_executor.compile_tx_script(tx_script, script_inputs, vec![])? - }; - - Ok(TransactionRequest::new( - payment_data.account_id(), - BTreeMap::new(), - vec![created_note], - Some(tx_script), - )) - } - - /// Helper to build a [TransactionRequest] for transaction to mint fungible tokens. - /// - /// - faucet_auth_info has to be from the faucet account - fn build_mint_tx_request( - &self, - asset: FungibleAsset, - faucet_auth_info: AuthInfo, - target_account_id: AccountId, - note_type: NoteType, - ) -> Result { - let random_coin = self.get_random_coin(); - let created_note = create_p2id_note( - asset.faucet_id(), - target_account_id, - vec![asset.into()], - note_type, - random_coin, - )?; - - let recipient = created_note - .recipient_digest() - .iter() - .map(|x| x.as_int().to_string()) - .collect::>() - .join("."); - - let note_tag = created_note.metadata().tag().inner(); - - let tx_script = ProgramAst::parse( - &transaction_request::DISTRIBUTE_FUNGIBLE_ASSET_SCRIPT - .replace("{recipient}", &recipient) - .replace("{note_type}", &Felt::new(note_type as u64).to_string()) - .replace("{tag}", &Felt::new(note_tag.into()).to_string()) - .replace("{amount}", &Felt::new(asset.amount()).to_string()), - ) - .expect("shipped MASM is well-formed"); - - let tx_script = { - let script_inputs = vec![faucet_auth_info.into_advice_inputs()]; - self.tx_executor.compile_tx_script(tx_script, script_inputs, vec![])? - }; - - Ok(TransactionRequest::new( - asset.faucet_id(), - BTreeMap::new(), - vec![created_note], - Some(tx_script), - )) - } -} - -// HELPERS -// ================================================================================================ - -pub(crate) fn prepare_word(word: &Word) -> String { - word.iter().map(|x| x.as_int().to_string()).collect::>().join(".") -} diff --git a/src/client/transactions/transaction_request.rs b/src/client/transactions/transaction_request.rs deleted file mode 100644 index 37b58f879..000000000 --- a/src/client/transactions/transaction_request.rs +++ /dev/null @@ -1,170 +0,0 @@ -use alloc::collections::BTreeMap; - -use miden_objects::{ - accounts::AccountId, - assets::{Asset, FungibleAsset}, - notes::{Note, NoteId, NoteType}, - transaction::{TransactionArgs, TransactionScript}, - vm::AdviceMap, - Word, -}; - -// MASM SCRIPTS -// -------------------------------------------------------------------------------------------- - -pub const AUTH_CONSUME_NOTES_SCRIPT: &str = - include_str!("asm/transaction_scripts/auth_consume_notes.masm"); -pub const DISTRIBUTE_FUNGIBLE_ASSET_SCRIPT: &str = - include_str!("asm/transaction_scripts/distribute_fungible_asset.masm"); -pub const AUTH_SEND_ASSET_SCRIPT: &str = - include_str!("asm/transaction_scripts/auth_send_asset.masm"); - -// TRANSACTION REQUEST -// -------------------------------------------------------------------------------------------- - -pub type NoteArgs = Word; - -/// Represents the most general way of defining an executable transaction -#[derive(Clone, Debug)] -pub struct TransactionRequest { - /// ID of the account against which the transactions is to be executed. - account_id: AccountId, - /// Notes to be consumed by the transaction together with their (optional) arguments. - input_notes: BTreeMap>, - /// A list of notes expected to be generated by the transactions. - expected_output_notes: Vec, - /// Optional transaction script (together with its arguments). - tx_script: Option, -} - -impl TransactionRequest { - // CONSTRUCTORS - // -------------------------------------------------------------------------------------------- - - pub fn new( - account_id: AccountId, - input_notes: BTreeMap>, - expected_output_notes: Vec, - tx_script: Option, - ) -> Self { - Self { - account_id, - input_notes, - expected_output_notes, - tx_script, - } - } - - // PUBLIC ACCESSORS - // -------------------------------------------------------------------------------------------- - - pub fn account_id(&self) -> AccountId { - self.account_id - } - - pub fn input_notes(&self) -> &BTreeMap> { - &self.input_notes - } - - pub fn get_input_note_ids(&self) -> Vec { - self.input_notes.keys().cloned().collect() - } - - pub fn get_note_args(&self) -> BTreeMap { - self.input_notes - .iter() - .filter_map(|(note, args)| args.map(|a| (*note, a))) - .collect() - } - - pub fn expected_output_notes(&self) -> &[Note] { - &self.expected_output_notes - } - - pub fn tx_script(&self) -> Option<&TransactionScript> { - self.tx_script.as_ref() - } -} - -impl From for TransactionArgs { - fn from(val: TransactionRequest) -> Self { - let note_args = val.get_note_args(); - let mut tx_args = TransactionArgs::new(val.tx_script, Some(note_args), AdviceMap::new()); - - let output_notes = val.expected_output_notes.into_iter(); - tx_args.extend_expected_output_notes(output_notes); - - tx_args - } -} - -// TRANSACTION TEMPLATE -// -------------------------------------------------------------------------------------------- - -#[derive(Clone, Debug)] -pub enum TransactionTemplate { - /// Consume the specified notes against an account. - ConsumeNotes(AccountId, Vec), - /// Mint fungible assets using a faucet account and creates a note with the specified - /// type that can be consumed by the target Account ID - MintFungibleAsset(FungibleAsset, AccountId, NoteType), - /// Creates a pay-to-id note with the specified type directed to a specific account - PayToId(PaymentTransactionData, NoteType), - /// Creates a pay-to-id note directed to a specific account, specifying a block height after - /// which the note can be recalled - PayToIdWithRecall(PaymentTransactionData, u32, NoteType), -} - -impl TransactionTemplate { - /// Returns the [AccountId] of the account which the transaction will be executed against - pub fn account_id(&self) -> AccountId { - match self { - TransactionTemplate::ConsumeNotes(account_id, _) => *account_id, - TransactionTemplate::MintFungibleAsset(asset, ..) => asset.faucet_id(), - TransactionTemplate::PayToId(payment_data, _) => payment_data.account_id(), - TransactionTemplate::PayToIdWithRecall(payment_data, ..) => payment_data.account_id(), - } - } -} - -// PAYMENT TRANSACTION DATA -// -------------------------------------------------------------------------------------------- - -#[derive(Clone, Debug)] -pub struct PaymentTransactionData { - asset: Asset, - sender_account_id: AccountId, - target_account_id: AccountId, -} - -impl PaymentTransactionData { - // CONSTRUCTORS - // -------------------------------------------------------------------------------------------- - - pub fn new( - asset: Asset, - sender_account_id: AccountId, - target_account_id: AccountId, - ) -> PaymentTransactionData { - PaymentTransactionData { - asset, - sender_account_id, - target_account_id, - } - } - - /// Returns the executor [AccountId] - pub fn account_id(&self) -> AccountId { - self.sender_account_id - } - - /// Returns the target [AccountId] - pub fn target_account_id(&self) -> AccountId { - self.target_account_id - } - - /// Returns the transaction [Asset] - pub fn asset(&self) -> Asset { - self.asset - } -} diff --git a/src/config.rs b/src/config.rs deleted file mode 100644 index be5fc26c5..000000000 --- a/src/config.rs +++ /dev/null @@ -1,156 +0,0 @@ -use core::fmt; -use std::path::PathBuf; - -use figment::{ - value::{Dict, Map}, - Metadata, Profile, Provider, -}; -use serde::{Deserialize, Serialize}; - -// CLIENT CONFIG -// ================================================================================================ - -/// Configuration options of Miden client. -#[derive(Debug, Default, Deserialize, Eq, PartialEq, Serialize)] -pub struct ClientConfig { - /// Describes settings related to the RPC endpoint - pub rpc: RpcConfig, - /// Describes settings related to the store. - pub store: StoreConfig, -} - -impl ClientConfig { - /// Returns a new instance of [ClientConfig] with the specified store path and node endpoint. - pub const fn new(store: StoreConfig, rpc: RpcConfig) -> Self { - Self { store, rpc } - } -} - -// Make `ClientConfig` a provider itself for composability. -impl Provider for ClientConfig { - fn metadata(&self) -> Metadata { - Metadata::named("Library Config") - } - - fn data(&self) -> Result, figment::Error> { - figment::providers::Serialized::defaults(ClientConfig::default()).data() - } - - fn profile(&self) -> Option { - // Optionally, a profile that's selected by default. - None - } -} - -// ENDPOINT -// ================================================================================================ - -#[derive(Clone, Debug, Deserialize, Eq, Ord, PartialEq, PartialOrd, Serialize)] -pub struct Endpoint { - protocol: String, - host: String, - port: u16, -} - -impl Endpoint { - /// Returns a new instance of [Endpoint] with the specified protocol, host, and port. - pub const fn new(protocol: String, host: String, port: u16) -> Self { - Self { protocol, host, port } - } -} - -impl Endpoint { - pub fn protocol(&self) -> &str { - &self.protocol - } - - pub fn host(&self) -> &str { - &self.host - } - - pub fn port(&self) -> u16 { - self.port - } -} - -impl fmt::Display for Endpoint { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!(f, "{}://{}:{}", self.protocol, self.host, self.port) - } -} - -impl Default for Endpoint { - fn default() -> Self { - const MIDEN_NODE_PORT: u16 = 57291; - - Self { - protocol: "http".to_string(), - host: "localhost".to_string(), - port: MIDEN_NODE_PORT, - } - } -} - -// STORE CONFIG -// ================================================================================================ - -#[derive(Debug, Deserialize, Eq, PartialEq, Serialize)] -pub struct StoreConfig { - pub database_filepath: String, -} - -impl From<&ClientConfig> for StoreConfig { - fn from(config: &ClientConfig) -> Self { - Self { - database_filepath: config.store.database_filepath.clone(), - } - } -} - -impl TryFrom<&str> for StoreConfig { - type Error = String; - fn try_from(value: &str) -> Result { - StoreConfig::try_from(value.to_string()) - } -} - -// TODO: Implement error checking for invalid paths, or make it based on Path types -impl TryFrom for StoreConfig { - type Error = String; - fn try_from(value: String) -> Result { - Ok(Self { database_filepath: value }) - } -} - -impl Default for StoreConfig { - fn default() -> Self { - const STORE_FILENAME: &str = "store.sqlite3"; - - // Get current directory - let exec_dir = PathBuf::new(); - - // Append filepath - let database_filepath = exec_dir - .join(STORE_FILENAME) - .into_os_string() - .into_string() - .expect("Creating the hardcoded store path should not panic"); - - Self { database_filepath } - } -} - -// RPC CONFIG -// ================================================================================================ - -#[derive(Debug, Default, Deserialize, Eq, PartialEq, Serialize)] -pub struct RpcConfig { - /// Address of the Miden node to connect to. - pub endpoint: Endpoint, -} - -impl From for RpcConfig { - fn from(value: Endpoint) -> Self { - Self { endpoint: value } - } -} diff --git a/src/errors.rs b/src/errors.rs deleted file mode 100644 index a89ad104b..000000000 --- a/src/errors.rs +++ /dev/null @@ -1,474 +0,0 @@ -use core::fmt; - -use miden_node_proto::errors::ConversionError; -use miden_objects::{ - accounts::AccountId, crypto::merkle::MmrError, notes::NoteId, AccountError, AssetError, - AssetVaultError, Digest, NoteError, TransactionScriptError, -}; -use miden_tx::{ - utils::{DeserializationError, HexParseError}, - DataStoreError, TransactionExecutorError, TransactionProverError, -}; - -// CLIENT ERROR -// ================================================================================================ - -#[derive(Debug)] -pub enum ClientError { - AccountError(AccountError), - AssetError(AssetError), - DataDeserializationError(DeserializationError), - HexParseError(HexParseError), - ImportNewAccountWithoutSeed, - MissingOutputNotes(Vec), - NoteError(NoteError), - NoConsumableNoteForAccount(AccountId), - NodeRpcClientError(NodeRpcClientError), - ScreenerError(ScreenerError), - StoreError(StoreError), - TransactionExecutionError(TransactionExecutorError), - TransactionProvingError(TransactionProverError), -} - -impl fmt::Display for ClientError { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - match self { - ClientError::AccountError(err) => write!(f, "account error: {err}"), - ClientError::DataDeserializationError(err) => { - write!(f, "data deserialization error: {err}") - }, - ClientError::AssetError(err) => write!(f, "asset error: {err}"), - ClientError::HexParseError(err) => write!(f, "error turning array to Digest: {err}"), - ClientError::ImportNewAccountWithoutSeed => write!( - f, - "import account error: can't import a new account without its initial seed" - ), - ClientError::MissingOutputNotes(note_ids) => { - write!( - f, - "transaction error: The transaction did not produce expected Note IDs: {}", - note_ids.iter().map(|&id| id.to_hex()).collect::>().join(", ") - ) - }, - ClientError::NoConsumableNoteForAccount(account_id) => { - write!(f, "No consumable note for account ID {}", account_id) - }, - ClientError::NoteError(err) => write!(f, "note error: {err}"), - ClientError::NodeRpcClientError(err) => write!(f, "rpc api error: {err}"), - ClientError::ScreenerError(err) => write!(f, "note screener error: {err}"), - ClientError::StoreError(err) => write!(f, "store error: {err}"), - ClientError::TransactionExecutionError(err) => { - write!(f, "transaction executor error: {err}") - }, - ClientError::TransactionProvingError(err) => { - write!(f, "transaction prover error: {err}") - }, - } - } -} - -// CONVERSIONS -// ================================================================================================ - -impl From for ClientError { - fn from(err: AccountError) -> Self { - Self::AccountError(err) - } -} - -impl From for ClientError { - fn from(err: DeserializationError) -> Self { - Self::DataDeserializationError(err) - } -} - -impl From for ClientError { - fn from(err: HexParseError) -> Self { - Self::HexParseError(err) - } -} - -impl From for ClientError { - fn from(err: NoteError) -> Self { - Self::NoteError(err) - } -} - -impl From for ClientError { - fn from(err: NodeRpcClientError) -> Self { - Self::NodeRpcClientError(err) - } -} - -impl From for ClientError { - fn from(err: StoreError) -> Self { - Self::StoreError(err) - } -} - -impl From for ClientError { - fn from(err: TransactionExecutorError) -> Self { - Self::TransactionExecutionError(err) - } -} - -impl From for ClientError { - fn from(err: TransactionProverError) -> Self { - Self::TransactionProvingError(err) - } -} - -impl From for ClientError { - fn from(err: ScreenerError) -> Self { - Self::ScreenerError(err) - } -} - -impl From for ClientError { - fn from(err: rusqlite::Error) -> Self { - Self::StoreError(StoreError::from(err)) - } -} - -impl From for String { - fn from(err: ClientError) -> String { - err.to_string() - } -} - -#[cfg(feature = "std")] -impl std::error::Error for ClientError {} - -// STORE ERROR -// ================================================================================================ - -#[derive(Debug)] -pub enum StoreError { - AssetVaultError(AssetVaultError), - AccountCodeDataNotFound(Digest), - AccountDataNotFound(AccountId), - AccountError(AccountError), - AccountHashMismatch(AccountId), - AccountStorageNotFound(Digest), - BlockHeaderNotFound(u32), - ChainMmrNodeNotFound(u64), - DatabaseError(String), - DataDeserializationError(DeserializationError), - HexParseError(HexParseError), - InputNoteNotFound(NoteId), - InputSerializationError(serde_json::Error), - JsonDataDeserializationError(serde_json::Error), - MmrError(MmrError), - NoteInclusionProofError(NoteError), - NoteTagAlreadyTracked(u64), - ParsingError(String), - QueryError(String), - RpcTypeConversionFailure(ConversionError), - TransactionScriptError(TransactionScriptError), - VaultDataNotFound(Digest), -} - -impl From for StoreError { - fn from(value: AssetVaultError) -> Self { - StoreError::AssetVaultError(value) - } -} - -impl From for StoreError { - fn from(value: AccountError) -> Self { - StoreError::AccountError(value) - } -} - -impl From for StoreError { - fn from(value: rusqlite_migration::Error) -> Self { - StoreError::DatabaseError(value.to_string()) - } -} -impl From for StoreError { - fn from(value: rusqlite::Error) -> Self { - match value { - rusqlite::Error::FromSqlConversionFailure(..) - | rusqlite::Error::IntegralValueOutOfRange(..) - | rusqlite::Error::InvalidColumnIndex(_) - | rusqlite::Error::InvalidColumnType(..) => StoreError::ParsingError(value.to_string()), - rusqlite::Error::InvalidParameterName(_) - | rusqlite::Error::InvalidColumnName(_) - | rusqlite::Error::StatementChangedRows(_) - | rusqlite::Error::ExecuteReturnedResults - | rusqlite::Error::InvalidQuery - | rusqlite::Error::MultipleStatement - | rusqlite::Error::InvalidParameterCount(..) - | rusqlite::Error::QueryReturnedNoRows => StoreError::QueryError(value.to_string()), - _ => StoreError::DatabaseError(value.to_string()), - } - } -} - -impl From for StoreError { - fn from(value: DeserializationError) -> Self { - StoreError::DataDeserializationError(value) - } -} - -impl From for StoreError { - fn from(value: HexParseError) -> Self { - StoreError::HexParseError(value) - } -} - -impl From for StoreError { - fn from(value: MmrError) -> Self { - StoreError::MmrError(value) - } -} - -impl From for StoreError { - fn from(value: NoteError) -> Self { - StoreError::NoteInclusionProofError(value) - } -} - -impl From for StoreError { - fn from(value: TransactionScriptError) -> Self { - StoreError::TransactionScriptError(value) - } -} - -impl fmt::Display for StoreError { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - use StoreError::*; - match self { - AssetVaultError(err) => { - write!(f, "asset vault with root {} not found", err) - }, - AccountCodeDataNotFound(root) => { - write!(f, "account code data with root {} not found", root) - }, - AccountDataNotFound(account_id) => { - write!(f, "Account data was not found for Account Id {account_id}") - }, - AccountError(err) => write!(f, "error instantiating Account: {err}"), - AccountHashMismatch(account_id) => { - write!(f, "account hash mismatch for account {account_id}") - }, - AccountStorageNotFound(root) => { - write!(f, "account storage data with root {} not found", root) - }, - BlockHeaderNotFound(block_number) => { - write!(f, "block header for block {} not found", block_number) - }, - ChainMmrNodeNotFound(node_index) => { - write!(f, "chain mmr node at index {} not found", node_index) - }, - DatabaseError(err) => write!(f, "database-related non-query error: {err}"), - DataDeserializationError(err) => { - write!(f, "error deserializing data from the store: {err}") - }, - HexParseError(err) => { - write!(f, "error parsing hex: {err}") - }, - InputNoteNotFound(note_id) => { - write!(f, "input note with note id {} not found", note_id.inner()) - }, - InputSerializationError(err) => { - write!(f, "error trying to serialize inputs for the store: {err}") - }, - JsonDataDeserializationError(err) => { - write!(f, "error deserializing data from JSON from the store: {err}") - }, - MmrError(err) => write!(f, "error constructing mmr: {err}"), - NoteTagAlreadyTracked(tag) => write!(f, "note tag {} is already being tracked", tag), - NoteInclusionProofError(error) => { - write!(f, "inclusion proof creation error: {}", error) - }, - ParsingError(err) => { - write!(f, "failed to parse data retrieved from the database: {err}") - }, - QueryError(err) => write!(f, "failed to retrieve data from the database: {err}"), - TransactionScriptError(err) => { - write!(f, "error instantiating transaction script: {err}") - }, - VaultDataNotFound(root) => write!(f, "account vault data for root {} not found", root), - RpcTypeConversionFailure(err) => write!(f, "failed to convert data: {err}"), - } - } -} - -impl From for DataStoreError { - fn from(value: StoreError) -> Self { - match value { - StoreError::AccountDataNotFound(account_id) => { - DataStoreError::AccountNotFound(account_id) - }, - StoreError::BlockHeaderNotFound(block_num) => DataStoreError::BlockNotFound(block_num), - StoreError::InputNoteNotFound(note_id) => DataStoreError::NoteNotFound(note_id), - err => DataStoreError::InternalError(err.to_string()), - } - } -} - -#[cfg(feature = "std")] -impl std::error::Error for StoreError {} - -// API CLIENT ERROR -// ================================================================================================ - -#[derive(Debug)] -pub enum NodeRpcClientError { - ConnectionError(String), - ConversionFailure(String), - DeserializationError(DeserializationError), - ExpectedFieldMissing(String), - InvalidAccountReceived(String), - NoteError(NoteError), - RequestError(String, String), -} - -impl fmt::Display for NodeRpcClientError { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - match self { - NodeRpcClientError::ConnectionError(err) => { - write!(f, "failed to connect to the API server: {err}") - }, - NodeRpcClientError::ConversionFailure(err) => { - write!(f, "failed to convert RPC data: {err}") - }, - NodeRpcClientError::DeserializationError(err) => { - write!(f, "failed to deserialize RPC data: {err}") - }, - NodeRpcClientError::ExpectedFieldMissing(err) => { - write!(f, "rpc API response missing an expected field: {err}") - }, - NodeRpcClientError::InvalidAccountReceived(account_error) => { - write!(f, "rpc API response contained an invalid account: {account_error}") - }, - NodeRpcClientError::NoteError(err) => { - write!(f, "rpc API note failed to validate: {err}") - }, - NodeRpcClientError::RequestError(endpoint, err) => { - write!(f, "rpc request failed for {endpoint}: {err}") - }, - } - } -} - -impl From for NodeRpcClientError { - fn from(err: AccountError) -> Self { - Self::InvalidAccountReceived(err.to_string()) - } -} - -impl From for NodeRpcClientError { - fn from(err: DeserializationError) -> Self { - Self::DeserializationError(err) - } -} - -impl From for NodeRpcClientError { - fn from(err: NoteError) -> Self { - Self::NoteError(err) - } -} - -impl From for NodeRpcClientError { - fn from(err: ConversionError) -> Self { - Self::ConversionFailure(err.to_string()) - } -} - -// NOTE ID PREFIX FETCH ERROR -// ================================================================================================ - -/// Error when Looking for a specific note ID from a partial ID -#[derive(Debug, Eq, PartialEq)] -pub enum NoteIdPrefixFetchError { - NoMatch(String), - MultipleMatches(String), -} - -impl fmt::Display for NoteIdPrefixFetchError { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - match self { - NoteIdPrefixFetchError::NoMatch(note_id) => { - write!(f, "No matches were found with the input prefix {note_id}.") - }, - NoteIdPrefixFetchError::MultipleMatches(note_id) => { - write!( - f, - "found more than one note for the provided ID {note_id} and only one match is expected." - ) - }, - } - } -} - -// NOTE SCREENER ERROR -// ================================================================================================ - -/// Error when screening notes to check relevance to a client -#[derive(Debug)] -pub enum ScreenerError { - InvalidNoteInputsError(InvalidNoteInputsError), - StoreError(StoreError), -} - -impl From for ScreenerError { - fn from(error: InvalidNoteInputsError) -> Self { - Self::InvalidNoteInputsError(error) - } -} - -impl From for ScreenerError { - fn from(error: StoreError) -> Self { - Self::StoreError(error) - } -} - -impl fmt::Display for ScreenerError { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - match self { - ScreenerError::InvalidNoteInputsError(note_inputs_err) => { - write!(f, "error while processing note inputs: {note_inputs_err}") - }, - ScreenerError::StoreError(store_error) => { - write!(f, "error while fetching data from the store: {store_error}") - }, - } - } -} - -#[derive(Debug)] -pub enum InvalidNoteInputsError { - AccountError(NoteId, AccountError), - AssetError(NoteId, AssetError), - NumInputsError(NoteId, usize), - BlockNumberError(NoteId, u64), -} - -impl fmt::Display for InvalidNoteInputsError { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - match self { - InvalidNoteInputsError::AccountError(note_id, account_error) => { - write!(f, "account error for note with ID {}: {account_error}", note_id.to_hex()) - }, - InvalidNoteInputsError::AssetError(note_id, asset_error) => { - write!(f, "asset error for note with ID {}: {asset_error}", note_id.to_hex()) - }, - InvalidNoteInputsError::NumInputsError(note_id, expected_num_inputs) => { - write!( - f, - "expected {expected_num_inputs} note inputs for note with ID {}", - note_id.to_hex() - ) - }, - InvalidNoteInputsError::BlockNumberError(note_id, read_height) => { - write!( - f, - "note input representing block with value {read_height} for note with ID {}", - note_id.to_hex() - ) - }, - } - } -} diff --git a/src/lib.rs b/src/lib.rs deleted file mode 100644 index 6c9dbf41c..000000000 --- a/src/lib.rs +++ /dev/null @@ -1,12 +0,0 @@ -extern crate alloc; - -pub mod client; -pub mod config; -pub mod errors; -pub mod store; - -#[cfg(any(test, feature = "test_utils"))] -pub mod mock; - -#[cfg(test)] -mod tests; diff --git a/src/main.rs b/src/main.rs deleted file mode 100644 index 376284811..000000000 --- a/src/main.rs +++ /dev/null @@ -1,16 +0,0 @@ -use clap::Parser; - -mod cli; -use cli::Cli; - -#[tokio::main] -async fn main() { - tracing_subscriber::fmt::init(); - // read command-line args - let cli = Cli::parse(); - - // execute cli action - if let Err(error) = cli.execute().await { - println!("{}", error); - } -} diff --git a/src/mock.rs b/src/mock.rs deleted file mode 100644 index d4af4fa3a..000000000 --- a/src/mock.rs +++ /dev/null @@ -1,749 +0,0 @@ -use alloc::collections::BTreeMap; - -use async_trait::async_trait; -use miden_lib::{transaction::TransactionKernel, AuthScheme}; -use miden_node_proto::generated::{ - account::AccountId as ProtoAccountId, - block_header::BlockHeader as NodeBlockHeader, - note::NoteSyncRecord, - requests::{GetBlockHeaderByNumberRequest, SyncStateRequest}, - responses::{NullifierUpdate, SyncStateResponse}, -}; -use miden_objects::{ - accounts::{ - get_account_seed_single, Account, AccountCode, AccountId, AccountStorage, - AccountStorageType, AccountType, SlotItem, StorageSlot, ACCOUNT_ID_OFF_CHAIN_SENDER, - }, - assembly::{Assembler, ModuleAst, ProgramAst}, - assets::{Asset, AssetVault, FungibleAsset, TokenSymbol}, - crypto::{ - dsa::rpo_falcon512::SecretKey, - merkle::{Mmr, MmrDelta, NodeIndex, SimpleSmt}, - rand::RpoRandomCoin, - }, - notes::{ - Note, NoteAssets, NoteId, NoteInclusionProof, NoteInputs, NoteMetadata, NoteRecipient, - NoteScript, NoteTag, NoteType, - }, - transaction::{InputNote, ProvenTransaction}, - BlockHeader, Felt, Word, NOTE_TREE_DEPTH, -}; -use rand::Rng; -use tonic::{Response, Status}; - -use crate::{ - client::{ - rpc::{ - NodeRpcClient, NodeRpcClientEndpoint, NoteDetails, NoteInclusionDetails, StateSyncInfo, - }, - sync::FILTER_ID_SHIFT, - transactions::{ - prepare_word, - transaction_request::{PaymentTransactionData, TransactionTemplate}, - }, - Client, - }, - errors::NodeRpcClientError, - store::{sqlite_store::SqliteStore, AuthInfo}, -}; - -pub type MockClient = Client; - -// MOCK CONSTS -// ================================================================================================ - -pub const ACCOUNT_ID_REGULAR_ACCOUNT_UPDATABLE_CODE_ON_CHAIN: u64 = 3238098370154045919; -pub const ACCOUNT_ID_REGULAR: u64 = ACCOUNT_ID_OFF_CHAIN_SENDER; -pub const ACCOUNT_ID_FUNGIBLE_FAUCET_ON_CHAIN: u64 = 0b1010011100 << 54; -pub const DEFAULT_ACCOUNT_CODE: &str = " - use.miden::contracts::wallets::basic->basic_wallet - use.miden::contracts::auth::basic->basic_eoa - - export.basic_wallet::receive_asset - export.basic_wallet::send_asset - export.basic_eoa::auth_tx_rpo_falcon512 -"; - -/// Mock RPC API -/// -/// This struct implements the RPC API used by the client to communicate with the node. It is -/// intended to be used for testing purposes only. -pub struct MockRpcApi { - pub state_sync_requests: BTreeMap, - pub genesis_block: BlockHeader, - pub notes: BTreeMap, -} - -impl Default for MockRpcApi { - fn default() -> Self { - let (genesis_block, state_sync_requests, notes) = generate_state_sync_mock_requests(); - Self { - state_sync_requests, - genesis_block, - notes, - } - } -} - -impl MockRpcApi { - pub fn new(_config_endpoint: &str) -> Self { - Self::default() - } -} - -#[async_trait] -impl NodeRpcClient for MockRpcApi { - /// Executes the specified sync state request and returns the response. - async fn sync_state( - &mut self, - block_num: u32, - _account_ids: &[AccountId], - _note_tags: &[NoteTag], - _nullifiers_tags: &[u16], - ) -> Result { - // Match request -> response through block_num - let response = - match self.state_sync_requests.iter().find(|(req, _)| req.block_num == block_num) { - Some((_req, response)) => { - let response = response.clone(); - Ok(Response::new(response)) - }, - None => Err(NodeRpcClientError::RequestError( - NodeRpcClientEndpoint::SyncState.to_string(), - Status::not_found("no response for sync state request").to_string(), - )), - }?; - - response.into_inner().try_into() - } - - /// Creates and executes a [GetBlockHeaderByNumberRequest]. - /// Only used for retrieving genesis block right now so that's the only case we need to cover. - async fn get_block_header_by_number( - &mut self, - block_num: Option, - ) -> Result { - let request = GetBlockHeaderByNumberRequest { block_num }; - - if request.block_num == Some(0) { - return Ok(self.genesis_block); - } - panic!("get_block_header_by_number is supposed to be only used for genesis block") - } - - async fn get_notes_by_id( - &mut self, - note_ids: &[NoteId], - ) -> Result, NodeRpcClientError> { - // assume all off-chain notes for now - let hit_notes = note_ids.iter().filter_map(|id| self.notes.get(id)); - let mut return_notes = vec![]; - for note in hit_notes { - if note.note().metadata().note_type() != NoteType::Public { - panic!("this function assumes all notes are offchain for now"); - } - let inclusion_details = NoteInclusionDetails::new( - note.proof().origin().block_num, - note.proof().origin().node_index.value() as u32, - note.proof().note_path().clone(), - ); - return_notes.push(NoteDetails::OffChain( - note.id(), - *note.note().metadata(), - inclusion_details, - )); - } - Ok(return_notes) - } - - async fn submit_proven_transaction( - &mut self, - _proven_transaction: ProvenTransaction, - ) -> std::result::Result<(), NodeRpcClientError> { - // TODO: add some basic validations to test error cases - Ok(()) - } - - async fn get_account_update( - &mut self, - _account_id: AccountId, - ) -> Result { - panic!("shouldn't be used for now") - } -} - -// HELPERS -// ================================================================================================ - -/// Generates genesis block header, mock sync state requests and responses -fn create_mock_sync_state_request_for_account_and_notes( - account_id: AccountId, - output_notes: &[Note], - consumed_notes: &[InputNote], - genesis_block: &BlockHeader, - mmr_delta: Option>, - tracked_block_headers: Option>, -) -> BTreeMap { - let mut requests: BTreeMap = BTreeMap::new(); - - let accounts = vec![ProtoAccountId { id: u64::from(account_id) }]; - - let nullifiers: Vec = consumed_notes - .iter() - .map(|note| (note.note().nullifier().as_elements()[3].as_int() >> FILTER_ID_SHIFT) as u32) - .collect(); - - let account = get_account_with_default_account_code(account_id, Word::default(), None); - - // This assumes the callee provides either both `tracked_block_headers` and `mmr_delta` are - // provided or not provided - let (tracked_block_headers, mmr_delta) = - if let Some(tracked_block_headers) = tracked_block_headers { - (tracked_block_headers, mmr_delta.unwrap()) - } else { - let mut mocked_tracked_headers = - vec![BlockHeader::mock(8, None, None, &[]), BlockHeader::mock(10, None, None, &[])]; - - let all_mocked_block_headers = vec![ - *genesis_block, - BlockHeader::mock(1, None, None, &[]), - BlockHeader::mock(2, None, None, &[]), - BlockHeader::mock(3, None, None, &[]), - BlockHeader::mock(4, None, None, &[]), - BlockHeader::mock(5, None, None, &[]), - BlockHeader::mock(6, None, None, &[]), - BlockHeader::mock(7, None, None, &[]), - mocked_tracked_headers[0], - BlockHeader::mock(9, None, None, &[]), - mocked_tracked_headers[1], - ]; - - let mut mmr = Mmr::default(); - let mut mocked_mmr_deltas = vec![]; - - for (block_num, block_header) in all_mocked_block_headers.iter().enumerate() { - if block_num == 8 { - mocked_mmr_deltas.push(mmr.get_delta(1, mmr.forest()).unwrap()); - } - if block_num == 10 { - // Fix mocked block chain root - mocked_tracked_headers[1] = BlockHeader::mock( - 10, - Some(mmr.peaks(mmr.forest()).unwrap().hash_peaks()), - None, - &[], - ); - mocked_mmr_deltas.push(mmr.get_delta(9, mmr.forest()).unwrap()); - } - mmr.add(block_header.hash()); - } - - (mocked_tracked_headers, mocked_mmr_deltas) - }; - - let chain_tip = tracked_block_headers.last().map(|header| header.block_num()).unwrap_or(10); - let mut deltas_iter = mmr_delta.into_iter(); - let mut created_notes_iter = output_notes.iter(); - - for (block_order, block_header) in tracked_block_headers.iter().enumerate() { - let request = SyncStateRequest { - block_num: if block_order == 0 { - 0 - } else { - tracked_block_headers[block_order - 1].block_num() - }, - account_ids: accounts.clone(), - note_tags: vec![], - nullifiers: nullifiers.clone(), - }; - - // create a state sync response - let response = SyncStateResponse { - chain_tip, - mmr_delta: deltas_iter.next().map(miden_node_proto::generated::mmr::MmrDelta::from), - block_header: Some(NodeBlockHeader::from(*block_header)), - accounts: vec![], - notes: vec![NoteSyncRecord { - note_index: 0, - note_id: Some(created_notes_iter.next().unwrap().id().into()), - sender: Some(account.id().into()), - tag: 0u32, - note_type: NoteType::OffChain as u32, - merkle_path: Some(miden_node_proto::generated::merkle::MerklePath::default()), - }], - nullifiers: vec![NullifierUpdate { - nullifier: Some(consumed_notes.first().unwrap().note().nullifier().inner().into()), - block_num: 7, - }], - }; - requests.insert(request, response); - } - - requests -} - -/// Generates mock sync state requests and responses -fn generate_state_sync_mock_requests() -> ( - BlockHeader, - BTreeMap, - BTreeMap, -) { - let account_id = AccountId::try_from(ACCOUNT_ID_REGULAR).unwrap(); - - // create sync state requests - let assembler = TransactionKernel::assembler(); - let (consumed_notes, created_notes) = mock_notes(&assembler); - let (_, input_notes, ..) = mock_full_chain_mmr_and_notes(consumed_notes); - - let genesis_block = BlockHeader::mock(0, None, None, &[]); - - let state_sync_request_responses = create_mock_sync_state_request_for_account_and_notes( - account_id, - &created_notes, - &input_notes, - &genesis_block, - None, - None, - ); - let input_notes = input_notes.iter().map(|n| (n.note().id(), n.clone())).collect(); - (genesis_block, state_sync_request_responses, input_notes) -} - -pub fn mock_full_chain_mmr_and_notes( - consumed_notes: Vec, -) -> (Mmr, Vec, Vec, Vec) { - let mut note_trees = Vec::new(); - - // TODO: Consider how to better represent note authentication data. - // we use the index for both the block number and the leaf index in the note tree - for (index, note) in consumed_notes.iter().enumerate() { - let tree_index = 2 * index; - let smt_entries = vec![ - (tree_index as u64, note.id().into()), - ((tree_index + 1) as u64, note.metadata().into()), - ]; - let smt: SimpleSmt = SimpleSmt::with_leaves(smt_entries).unwrap(); - note_trees.push(smt); - } - - let mut note_tree_iter = note_trees.iter(); - let mut mmr_deltas = Vec::new(); - - // create a dummy chain of block headers - let block_chain = vec![ - BlockHeader::mock(0, None, note_tree_iter.next().map(|x| x.root()), &[]), - BlockHeader::mock(1, None, note_tree_iter.next().map(|x| x.root()), &[]), - BlockHeader::mock(2, None, note_tree_iter.next().map(|x| x.root()), &[]), - BlockHeader::mock(3, None, note_tree_iter.next().map(|x| x.root()), &[]), - BlockHeader::mock(4, None, note_tree_iter.next().map(|x| x.root()), &[]), - BlockHeader::mock(5, None, note_tree_iter.next().map(|x| x.root()), &[]), - BlockHeader::mock(6, None, note_tree_iter.next().map(|x| x.root()), &[]), - ]; - - // instantiate and populate MMR - let mut mmr = Mmr::default(); - for (block_num, block_header) in block_chain.iter().enumerate() { - if block_num == 2 { - mmr_deltas.push(mmr.get_delta(1, mmr.forest()).unwrap()); - } - if block_num == 4 { - mmr_deltas.push(mmr.get_delta(3, mmr.forest()).unwrap()); - } - if block_num == 6 { - mmr_deltas.push(mmr.get_delta(5, mmr.forest()).unwrap()); - } - mmr.add(block_header.hash()); - } - - // set origin for consumed notes using chain and block data - let recorded_notes = consumed_notes - .into_iter() - .enumerate() - .map(|(index, note)| { - let block_header = &block_chain[index]; - let auth_index = NodeIndex::new(NOTE_TREE_DEPTH, index as u64).unwrap(); - InputNote::new( - note, - NoteInclusionProof::new( - block_header.block_num(), - block_header.sub_hash(), - block_header.note_root(), - index as u64, - note_trees[index].open(&auth_index.try_into().unwrap()).path, - ) - .unwrap(), - ) - }) - .collect::>(); - - ( - mmr, - recorded_notes, - vec![block_chain[2], block_chain[4], block_chain[6]], - mmr_deltas, - ) -} - -/// inserts mock note and account data into the client and returns the last block header of mocked -/// chain -pub async fn insert_mock_data(client: &mut MockClient) -> Vec { - // mock notes - let account = get_account_with_default_account_code( - AccountId::try_from(ACCOUNT_ID_REGULAR_ACCOUNT_UPDATABLE_CODE_ON_CHAIN).unwrap(), - Word::default(), - None, - ); - - let init_seed: [u8; 32] = [0; 32]; - let account_seed = get_account_seed_single( - init_seed, - account.account_type(), - miden_objects::accounts::AccountStorageType::OffChain, - account.code().root(), - account.storage().root(), - ) - .unwrap(); - - let assembler = TransactionKernel::assembler(); - let (consumed_notes, created_notes) = mock_notes(&assembler); - let (_mmr, consumed_notes, tracked_block_headers, mmr_deltas) = - mock_full_chain_mmr_and_notes(consumed_notes); - - // insert notes into database - for note in consumed_notes.clone() { - client.import_input_note(note.into()).unwrap(); - } - - // insert notes into database - for note in created_notes.clone() { - client.import_input_note(note.into()).unwrap(); - } - - // insert account - let key_pair = SecretKey::new(); - client - .insert_account(&account, Some(account_seed), &AuthInfo::RpoFalcon512(key_pair)) - .unwrap(); - - let genesis_block = BlockHeader::mock(0, None, None, &[]); - - client.rpc_api().state_sync_requests = create_mock_sync_state_request_for_account_and_notes( - account.id(), - &created_notes, - &consumed_notes, - &genesis_block, - Some(mmr_deltas), - Some(tracked_block_headers.clone()), - ); - - tracked_block_headers -} - -pub async fn create_mock_transaction(client: &mut MockClient) { - let key_pair = SecretKey::new(); - let auth_scheme: miden_lib::AuthScheme = - miden_lib::AuthScheme::RpoFalcon512 { pub_key: key_pair.public_key() }; - - let mut rng = rand::thread_rng(); - // we need to use an initial seed to create the wallet account - let init_seed: [u8; 32] = rand::Rng::gen(&mut rng); - - let (sender_account, seed) = miden_lib::accounts::wallets::create_basic_wallet( - init_seed, - auth_scheme, - AccountType::RegularAccountImmutableCode, - AccountStorageType::OffChain, - ) - .unwrap(); - - client - .insert_account(&sender_account, Some(seed), &AuthInfo::RpoFalcon512(key_pair)) - .unwrap(); - - let key_pair = SecretKey::new(); - let auth_scheme: miden_lib::AuthScheme = - miden_lib::AuthScheme::RpoFalcon512 { pub_key: key_pair.public_key() }; - - let mut rng = rand::thread_rng(); - // we need to use an initial seed to create the wallet account - let init_seed: [u8; 32] = rand::Rng::gen(&mut rng); - - let (target_account, seed) = miden_lib::accounts::wallets::create_basic_wallet( - init_seed, - auth_scheme, - AccountType::RegularAccountImmutableCode, - AccountStorageType::OffChain, - ) - .unwrap(); - - client - .insert_account(&target_account, Some(seed), &AuthInfo::RpoFalcon512(key_pair)) - .unwrap(); - - let key_pair = SecretKey::new(); - let auth_scheme: miden_lib::AuthScheme = - miden_lib::AuthScheme::RpoFalcon512 { pub_key: key_pair.public_key() }; - - let mut rng = rand::thread_rng(); - // we need to use an initial seed to create the wallet account - let init_seed: [u8; 32] = rand::Rng::gen(&mut rng); - - let max_supply = 10000u64.to_le_bytes(); - - let (faucet, seed) = miden_lib::accounts::faucets::create_basic_fungible_faucet( - init_seed, - miden_objects::assets::TokenSymbol::new("MOCK").unwrap(), - 4u8, - Felt::try_from(max_supply.as_slice()).unwrap(), - AccountStorageType::OffChain, - auth_scheme, - ) - .unwrap(); - - client - .insert_account(&faucet, Some(seed), &AuthInfo::RpoFalcon512(key_pair)) - .unwrap(); - - let asset: miden_objects::assets::Asset = FungibleAsset::new(faucet.id(), 5u64).unwrap().into(); - - // Insert a P2ID transaction object - - let transaction_template = TransactionTemplate::PayToId( - PaymentTransactionData::new(asset, sender_account.id(), target_account.id()), - NoteType::OffChain, - ); - - let transaction_request = client.build_transaction_request(transaction_template).unwrap(); - let transaction_execution_result = client.new_transaction(transaction_request).unwrap(); - - client.submit_transaction(transaction_execution_result).await.unwrap(); -} - -pub fn mock_fungible_faucet_account( - id: AccountId, - initial_balance: u64, - key_pair: SecretKey, -) -> Account { - let mut rng = rand::thread_rng(); - let init_seed: [u8; 32] = rng.gen(); - let auth_scheme: AuthScheme = AuthScheme::RpoFalcon512 { pub_key: key_pair.public_key() }; - - let (faucet, _seed) = miden_lib::accounts::faucets::create_basic_fungible_faucet( - init_seed, - TokenSymbol::new("TST").unwrap(), - 10u8, - Felt::try_from(initial_balance.to_le_bytes().as_slice()) - .expect("u64 can be safely converted to a field element"), - AccountStorageType::OffChain, - auth_scheme, - ) - .unwrap(); - - let faucet_storage_slot_1 = - [Felt::new(initial_balance), Felt::new(0), Felt::new(0), Felt::new(0)]; - let faucet_account_storage = AccountStorage::new(vec![ - SlotItem { - index: 0, - slot: StorageSlot::new_value(key_pair.public_key().into()), - }, - SlotItem { - index: 1, - slot: StorageSlot::new_value(faucet_storage_slot_1), - }, - ]) - .unwrap(); - - Account::new( - id, - AssetVault::new(&[]).unwrap(), - faucet_account_storage.clone(), - faucet.code().clone(), - Felt::new(10u64), - ) -} - -pub fn mock_notes(assembler: &Assembler) -> (Vec, Vec) { - const ACCOUNT_ID_FUNGIBLE_FAUCET_ON_CHAIN_1: u64 = - 0b1010010001111111010110100011011110101011010001101111110110111100u64; - const ACCOUNT_ID_FUNGIBLE_FAUCET_ON_CHAIN_2: u64 = - 0b1010000101101010101101000110111101010110100011011110100011011101u64; - const ACCOUNT_ID_FUNGIBLE_FAUCET_ON_CHAIN_3: u64 = - 0b1010011001011010101101000110111101010110100011011101000110111100u64; - // Note Assets - let faucet_id_1 = AccountId::try_from(ACCOUNT_ID_FUNGIBLE_FAUCET_ON_CHAIN_1).unwrap(); - let faucet_id_2 = AccountId::try_from(ACCOUNT_ID_FUNGIBLE_FAUCET_ON_CHAIN_2).unwrap(); - let faucet_id_3 = AccountId::try_from(ACCOUNT_ID_FUNGIBLE_FAUCET_ON_CHAIN_3).unwrap(); - let fungible_asset_1: Asset = FungibleAsset::new(faucet_id_1, 100).unwrap().into(); - let fungible_asset_2: Asset = FungibleAsset::new(faucet_id_2, 150).unwrap().into(); - let fungible_asset_3: Asset = FungibleAsset::new(faucet_id_3, 7).unwrap().into(); - - // Sender account - let sender = AccountId::try_from(ACCOUNT_ID_REGULAR).unwrap(); - - // CREATED NOTES - // -------------------------------------------------------------------------------------------- - // create note script - let note_program_ast = ProgramAst::parse("begin push.1 drop end").unwrap(); - let (note_script, _) = NoteScript::new(note_program_ast, assembler).unwrap(); - - // Created Notes - const SERIAL_NUM_4: Word = [Felt::new(13), Felt::new(14), Felt::new(15), Felt::new(16)]; - let note_metadata = - NoteMetadata::new(sender, NoteType::OffChain, 1u32.into(), Default::default()).unwrap(); - let note_assets = NoteAssets::new(vec![fungible_asset_1]).unwrap(); - let note_recipient = - NoteRecipient::new(SERIAL_NUM_4, note_script.clone(), NoteInputs::new(vec![]).unwrap()); - - let created_note_1 = Note::new(note_assets, note_metadata, note_recipient); - - const SERIAL_NUM_5: Word = [Felt::new(17), Felt::new(18), Felt::new(19), Felt::new(20)]; - let note_metadata = - NoteMetadata::new(sender, NoteType::OffChain, 2u32.into(), Default::default()).unwrap(); - let note_recipient = - NoteRecipient::new(SERIAL_NUM_5, note_script.clone(), NoteInputs::new(vec![]).unwrap()); - let note_assets = NoteAssets::new(vec![fungible_asset_2]).unwrap(); - let created_note_2 = Note::new(note_assets, note_metadata, note_recipient); - - const SERIAL_NUM_6: Word = [Felt::new(21), Felt::new(22), Felt::new(23), Felt::new(24)]; - let note_metadata = - NoteMetadata::new(sender, NoteType::OffChain, 2u32.into(), Default::default()).unwrap(); - let note_assets = NoteAssets::new(vec![fungible_asset_3]).unwrap(); - let note_recipient = - NoteRecipient::new(SERIAL_NUM_6, note_script, NoteInputs::new(vec![Felt::new(2)]).unwrap()); - let created_note_3 = Note::new(note_assets, note_metadata, note_recipient); - - let created_notes = vec![created_note_1, created_note_2, created_note_3]; - - // CONSUMED NOTES - // -------------------------------------------------------------------------------------------- - - // create note 1 script - let note_1_script_src = format!( - "\ - begin - # create note 0 - push.{created_note_0_recipient} - push.{created_note_0_tag} - push.{created_note_0_asset} - # MAST root of the `create_note` mock account procedure - # call.0xacb46cadec8d1721934827ed161b851f282f1f4b88b72391a67fed668b1a00ba - drop dropw dropw - - # create note 1 - push.{created_note_1_recipient} - push.{created_note_1_tag} - push.{created_note_1_asset} - # MAST root of the `create_note` mock account procedure - # call.0xacb46cadec8d1721934827ed161b851f282f1f4b88b72391a67fed668b1a00ba - drop dropw dropw - end - ", - created_note_0_recipient = prepare_word(&created_notes[0].recipient_digest()), - created_note_0_tag = created_notes[0].metadata().tag(), - created_note_0_asset = prepare_assets(created_notes[0].assets())[0], - created_note_1_recipient = prepare_word(&created_notes[1].recipient_digest()), - created_note_1_tag = created_notes[1].metadata().tag(), - created_note_1_asset = prepare_assets(created_notes[1].assets())[0], - ); - let note_1_script_ast = ProgramAst::parse(¬e_1_script_src).unwrap(); - let (_note_1_script, _) = NoteScript::new(note_1_script_ast, assembler).unwrap(); - - // create note 2 script - let note_2_script_src = format!( - "\ - begin - # create note 2 - push.{created_note_2_recipient} - push.{created_note_2_tag} - push.{created_note_2_asset} - # MAST root of the `create_note` mock account procedure - # call.0xacb46cadec8d1721934827ed161b851f282f1f4b88b72391a67fed668b1a00ba - drop dropw dropw - end - ", - created_note_2_recipient = prepare_word(&created_notes[2].recipient_digest()), - created_note_2_tag = created_notes[2].metadata().tag(), - created_note_2_asset = prepare_assets(created_notes[2].assets())[0], - ); - let note_2_script_ast = ProgramAst::parse(¬e_2_script_src).unwrap(); - let (note_2_script, _) = NoteScript::new(note_2_script_ast, assembler).unwrap(); - - // Consumed Notes - const SERIAL_NUM_1: Word = [Felt::new(1), Felt::new(2), Felt::new(3), Felt::new(4)]; - let note_metadata = - NoteMetadata::new(sender, NoteType::OffChain, 1u32.into(), Default::default()).unwrap(); - let note_recipient = NoteRecipient::new( - SERIAL_NUM_1, - note_2_script.clone(), - NoteInputs::new(vec![Felt::new(1)]).unwrap(), - ); - let note_assets = NoteAssets::new(vec![fungible_asset_1]).unwrap(); - let consumed_note_1 = Note::new(note_assets, note_metadata, note_recipient); - - const SERIAL_NUM_2: Word = [Felt::new(5), Felt::new(6), Felt::new(7), Felt::new(8)]; - let note_metadata = - NoteMetadata::new(sender, NoteType::OffChain, 2u32.into(), Default::default()).unwrap(); - let note_assets = NoteAssets::new(vec![fungible_asset_2, fungible_asset_3]).unwrap(); - let note_recipient = NoteRecipient::new( - SERIAL_NUM_2, - note_2_script, - NoteInputs::new(vec![Felt::new(2)]).unwrap(), - ); - - let consumed_note_2 = Note::new(note_assets, note_metadata, note_recipient); - - let consumed_notes = vec![consumed_note_1, consumed_note_2]; - - (consumed_notes, created_notes) -} - -fn get_account_with_nonce( - account_id: AccountId, - public_key: Word, - assets: Option, - nonce: u64, -) -> Account { - let account_code_src = DEFAULT_ACCOUNT_CODE; - let account_code_ast = ModuleAst::parse(account_code_src).unwrap(); - let account_assembler = TransactionKernel::assembler(); - - let account_code = AccountCode::new(account_code_ast, &account_assembler).unwrap(); - let slot_item = SlotItem { - index: 0, - slot: StorageSlot::new_value(public_key), - }; - let account_storage = AccountStorage::new(vec![slot_item]).unwrap(); - - let asset_vault = match assets { - Some(asset) => AssetVault::new(&[asset]).unwrap(), - None => AssetVault::new(&[]).unwrap(), - }; - - Account::new(account_id, asset_vault, account_storage, account_code, Felt::new(nonce)) -} - -pub fn get_account_with_default_account_code( - account_id: AccountId, - public_key: Word, - assets: Option, -) -> Account { - get_account_with_nonce(account_id, public_key, assets, 1) -} - -pub fn get_new_account_with_default_account_code( - account_id: AccountId, - public_key: Word, - assets: Option, -) -> Account { - get_account_with_nonce(account_id, public_key, assets, 0) -} - -fn prepare_assets(note_assets: &NoteAssets) -> Vec { - let mut assets = Vec::new(); - for &asset in note_assets.iter() { - let asset_word: Word = asset.into(); - let asset_str = prepare_word(&asset_word); - assets.push(asset_str); - } - assets -} diff --git a/src/store/data_store.rs b/src/store/data_store.rs deleted file mode 100644 index 76cb3480d..000000000 --- a/src/store/data_store.rs +++ /dev/null @@ -1,186 +0,0 @@ -use alloc::collections::BTreeSet; - -use miden_objects::{ - accounts::AccountId, - assembly::ModuleAst, - crypto::merkle::{InOrderIndex, MerklePath, PartialMmr}, - notes::NoteId, - transaction::{ChainMmr, InputNote, InputNotes}, - BlockHeader, -}; -use miden_tx::{DataStore, DataStoreError, TransactionInputs}; - -use super::{ChainMmrNodeFilter, NoteFilter, Store}; -use crate::errors::{ClientError, StoreError}; - -// DATA STORE -// ================================================================================================ - -pub struct ClientDataStore { - /// Local database containing information about the accounts managed by this client. - pub(crate) store: S, -} - -impl ClientDataStore { - pub fn new(store: S) -> Self { - Self { store } - } -} - -impl DataStore for ClientDataStore { - fn get_transaction_inputs( - &self, - account_id: AccountId, - block_num: u32, - notes: &[NoteId], - ) -> Result { - // First validate that no note has already been consumed - let unspent_notes = self - .store - .get_input_notes(NoteFilter::Committed)? - .iter() - .map(|note_record| note_record.id()) - .collect::>(); - - for note_id in notes { - if !unspent_notes.contains(note_id) { - return Err(DataStoreError::NoteAlreadyConsumed(*note_id)); - } - } - - // Construct Account - let (account, seed) = self.store.get_account(account_id)?; - - // Get header data - let (block_header, _had_notes) = self.store.get_block_header_by_num(block_num)?; - - let mut list_of_notes = vec![]; - - let mut notes_blocks: Vec = vec![]; - for note_id in notes { - let input_note_record = self.store.get_input_note(*note_id)?; - - let input_note: InputNote = input_note_record - .try_into() - .map_err(|err: ClientError| DataStoreError::InternalError(err.to_string()))?; - - list_of_notes.push(input_note.clone()); - - let note_block_num = input_note.proof().origin().block_num; - - if note_block_num != block_num { - notes_blocks.push(note_block_num); - } - } - - let notes_blocks: Vec = self - .store - .get_block_headers(¬es_blocks)? - .iter() - .map(|(header, _has_notes)| *header) - .collect(); - - let partial_mmr = build_partial_mmr_with_paths(&self.store, block_num, ¬es_blocks)?; - let chain_mmr = ChainMmr::new(partial_mmr, notes_blocks) - .map_err(|err| DataStoreError::InternalError(err.to_string()))?; - - let input_notes = - InputNotes::new(list_of_notes).map_err(DataStoreError::InvalidTransactionInput)?; - - TransactionInputs::new(account, seed, block_header, chain_mmr, input_notes) - .map_err(DataStoreError::InvalidTransactionInput) - } - - fn get_account_code(&self, account_id: AccountId) -> Result { - let (account, _seed) = self.store.get_account(account_id)?; - let module_ast = account.code().module().clone(); - - Ok(module_ast) - } -} - -/// Builds a [PartialMmr] with a specified forest number and a list of blocks that should be -/// authenticated. -/// -/// `authenticated_blocks` cannot contain `forest`. For authenticating the last block we have, -/// the kernel extends the MMR which is why it's not needed here. -fn build_partial_mmr_with_paths( - store: &S, - forest: u32, - authenticated_blocks: &[BlockHeader], -) -> Result { - let mut partial_mmr: PartialMmr = { - let current_peaks = store.get_chain_mmr_peaks_by_block_num(forest)?; - - PartialMmr::from_peaks(current_peaks) - }; - - let block_nums: Vec = authenticated_blocks.iter().map(|b| b.block_num()).collect(); - - let authentication_paths = - get_authentication_path_for_blocks(store, &block_nums, partial_mmr.forest())?; - - for (header, path) in authenticated_blocks.iter().zip(authentication_paths.iter()) { - partial_mmr - .track(header.block_num() as usize, header.hash(), path) - .map_err(|err| DataStoreError::InternalError(err.to_string()))?; - } - - Ok(partial_mmr) -} - -/// Retrieves all Chain MMR nodes required for authenticating the set of blocks, and then -/// constructs the path for each of them. -/// -/// This method assumes `block_nums` cannot contain `forest`. -pub fn get_authentication_path_for_blocks( - store: &S, - block_nums: &[u32], - forest: usize, -) -> Result, StoreError> { - let mut node_indices = BTreeSet::new(); - - // Calculate all needed nodes indices for generating the paths - for block_num in block_nums { - let path_depth = mmr_merkle_path_len(*block_num as usize, forest); - - let mut idx = InOrderIndex::from_leaf_pos(*block_num as usize); - - for _ in 0..path_depth { - node_indices.insert(idx.sibling()); - idx = idx.parent(); - } - } - - // Get all Mmr nodes based on collected indices - let node_indices: Vec = node_indices.into_iter().collect(); - - let filter = ChainMmrNodeFilter::List(&node_indices); - let mmr_nodes = store.get_chain_mmr_nodes(filter)?; - - // Construct authentication paths - let mut authentication_paths = vec![]; - for block_num in block_nums { - let mut merkle_nodes = vec![]; - let mut idx = InOrderIndex::from_leaf_pos(*block_num as usize); - - while let Some(node) = mmr_nodes.get(&idx.sibling()) { - merkle_nodes.push(*node); - idx = idx.parent(); - } - let path = MerklePath::new(merkle_nodes); - authentication_paths.push(path); - } - - Ok(authentication_paths) -} - -/// Calculates the merkle path length for an MMR of a specific forest and a leaf index -/// `leaf_index` is a 0-indexed leaf number and `forest` is the total amount of leaves -/// in the MMR at this point. -fn mmr_merkle_path_len(leaf_index: usize, forest: usize) -> usize { - let before = forest & leaf_index; - let after = forest ^ before; - - after.ilog2() as usize -} diff --git a/src/store/mod.rs b/src/store/mod.rs deleted file mode 100644 index 8b49b6cc0..000000000 --- a/src/store/mod.rs +++ /dev/null @@ -1,327 +0,0 @@ -use alloc::collections::BTreeMap; - -use clap::error::Result; -use miden_objects::{ - accounts::{Account, AccountId, AccountStub}, - crypto::{ - dsa::rpo_falcon512::SecretKey, - merkle::{InOrderIndex, MmrPeaks}, - }, - notes::{NoteId, Nullifier}, - transaction::TransactionId, - BlockHeader, Digest, Felt, Word, -}; -use miden_tx::utils::{ByteReader, ByteWriter, Deserializable, DeserializationError, Serializable}; - -use crate::{ - client::{ - sync::SyncedNewNotes, - transactions::{TransactionRecord, TransactionResult}, - }, - errors::StoreError, -}; - -pub mod data_store; -pub mod sqlite_store; - -mod note_record; -pub use note_record::{InputNoteRecord, NoteRecordDetails, NoteStatus, OutputNoteRecord}; - -// STORE TRAIT -// ================================================================================================ - -/// The [Store] trait exposes all methods that the client store needs in order to track the current -/// state. -/// -/// All update functions are implied to be atomic. That is, if multiple entities are meant to be -/// updated as part of any single function and an error is returned during its execution, any -/// changes that might have happened up to that point need to be rolled back and discarded. -pub trait Store { - // TRANSACTIONS - // -------------------------------------------------------------------------------------------- - - /// Retrieves stored transactions, filtered by [TransactionFilter]. - fn get_transactions( - &self, - filter: TransactionFilter, - ) -> Result, StoreError>; - - /// Applies a transaction, atomically updating the current state based on the - /// [TransactionResult] - /// - /// An update involves: - /// - Applying the resulting [AccountDelta](miden_objects::accounts::AccountDelta) and storing the new [Account] state - /// - Storing new notes as a result of the transaction execution - /// - Inserting the transaction into the store to track - fn apply_transaction(&mut self, tx_result: TransactionResult) -> Result<(), StoreError>; - - // NOTES - // -------------------------------------------------------------------------------------------- - - /// Retrieves the input notes from the store - fn get_input_notes(&self, filter: NoteFilter) -> Result, StoreError>; - - /// Retrieves the output notes from the store - fn get_output_notes(&self, filter: NoteFilter) -> Result, StoreError>; - - /// Retrieves an [InputNoteRecord] for the input note corresponding to the specified ID from - /// the store. - /// - /// # Errors - /// - /// Returns a [StoreError::InputNoteNotFound] if there is no Note with the provided ID - fn get_input_note(&self, note_id: NoteId) -> Result; - - /// Returns the nullifiers of all unspent input notes - /// - /// The default implementation of this method uses [Store::get_input_notes]. - fn get_unspent_input_note_nullifiers(&self) -> Result, StoreError> { - let nullifiers = self - .get_input_notes(NoteFilter::Committed)? - .iter() - .map(|input_note| Ok(Nullifier::from(Digest::try_from(input_note.nullifier())?))) - .collect::, _>>(); - - nullifiers - } - - /// Inserts the provided input note into the database - fn insert_input_note(&mut self, note: &InputNoteRecord) -> Result<(), StoreError>; - - // CHAIN DATA - // -------------------------------------------------------------------------------------------- - - /// Retrieves a vector of [BlockHeader]s filtered by the provided block numbers. - /// - /// The returned vector may not contain some or all of the requested block headers. It's up to - /// the callee to check whether all requested block headers were found. - /// - /// For each block header an additional boolean value is returned representing whether the block - /// contains notes relevant to the client. - fn get_block_headers( - &self, - block_numbers: &[u32], - ) -> Result, StoreError>; - - /// Retrieves a [BlockHeader] corresponding to the provided block number and a boolean value - /// that represents whether the block contains notes relevant to the client. - /// - /// The default implementation of this method uses [Store::get_block_headers]. - /// - /// # Errors - /// Returns a [StoreError::BlockHeaderNotFound] if the block was not found. - fn get_block_header_by_num( - &self, - block_number: u32, - ) -> Result<(BlockHeader, bool), StoreError> { - self.get_block_headers(&[block_number]) - .map(|block_headers_list| block_headers_list.first().cloned()) - .and_then(|block_header| { - block_header.ok_or(StoreError::BlockHeaderNotFound(block_number)) - }) - } - - /// Retrieves a list of [BlockHeader] that include relevant notes to the client. - fn get_tracked_block_headers(&self) -> Result, StoreError>; - - /// Retrieves all MMR authentication nodes based on [ChainMmrNodeFilter]. - fn get_chain_mmr_nodes( - &self, - filter: ChainMmrNodeFilter, - ) -> Result, StoreError>; - - /// Returns peaks information from the blockchain by a specific block number. - /// - /// If there is no chain MMR info stored for the provided block returns an empty [MmrPeaks] - fn get_chain_mmr_peaks_by_block_num(&self, block_num: u32) -> Result; - - /// Inserts a block header into the store, alongside peaks information at the block's height. - /// - /// `has_client_notes` describes whether the block has relevant notes to the client; this means - /// the client might want to authenticate merkle paths based on this value. - fn insert_block_header( - &self, - block_header: BlockHeader, - chain_mmr_peaks: MmrPeaks, - has_client_notes: bool, - ) -> Result<(), StoreError>; - - // ACCOUNT - // -------------------------------------------------------------------------------------------- - - /// Returns the account IDs of all accounts stored in the database - fn get_account_ids(&self) -> Result, StoreError>; - - /// Returns a list of [AccountStub] of all accounts stored in the database along with the seeds - /// used to create them. - /// - /// Said accounts' state is the state after the last performed sync. - fn get_account_stubs(&self) -> Result)>, StoreError>; - - /// Retrieves an [AccountStub] object for the specified [AccountId] along with the seed - /// used to create it. The seed will be returned if the account is new, otherwise it - /// will be `None`. - /// - /// Said account's state is the state according to the last sync performed. - /// - /// # Errors - /// Returns a `StoreError::AccountDataNotFound` if there is no account for the provided ID - fn get_account_stub( - &self, - account_id: AccountId, - ) -> Result<(AccountStub, Option), StoreError>; - - /// Retrieves a full [Account] object. The seed will be returned if the account is new, - /// otherwise it will be `None`. - /// - /// This function returns the [Account]'s latest state. If the account is new (that is, has - /// never executed a trasaction), the returned seed will be `Some(Word)`; otherwise the seed - /// will be `None` - /// - /// # Errors - /// - /// Returns a `StoreError::AccountDataNotFound` if there is no account for the provided ID - fn get_account(&self, account_id: AccountId) -> Result<(Account, Option), StoreError>; - - /// Retrieves an account's [AuthInfo], utilized to authenticate the account. - /// - /// # Errors - /// - /// Returns a `StoreError::AccountDataNotFound` if there is no account for the provided ID - fn get_account_auth(&self, account_id: AccountId) -> Result; - - /// Inserts an [Account] along with the seed used to create it and its [AuthInfo] - fn insert_account( - &mut self, - account: &Account, - account_seed: Option, - auth_info: &AuthInfo, - ) -> Result<(), StoreError>; - - // SYNC - // -------------------------------------------------------------------------------------------- - - /// Returns the note tags that the client is interested in. - fn get_note_tags(&self) -> Result, StoreError>; - - /// Adds a note tag to the list of tags that the client is interested in. - fn add_note_tag(&mut self, tag: u64) -> Result; - - /// Returns the block number of the last state sync block. - fn get_sync_height(&self) -> Result; - - /// Applies the state sync update to the store. An update involves: - /// - /// - Inserting the new block header to the store alongside new MMR peaks information - /// - Updating the notes, marking them as `committed` or `consumed` based on incoming - /// inclusion proofs and nullifiers - /// - Updating transactions in the store, marking as `committed` the ones provided with - /// `committed_transactions` - /// - Storing new MMR authentication nodes - fn apply_state_sync( - &mut self, - block_header: BlockHeader, - nullifiers: Vec, - new_note_details: SyncedNewNotes, - committed_transactions: &[TransactionId], - new_mmr_peaks: MmrPeaks, - new_authentication_nodes: &[(InOrderIndex, Digest)], - updated_onchain_accounts: &[Account], - ) -> Result<(), StoreError>; -} - -// DATABASE AUTH INFO -// ================================================================================================ - -/// Represents the types of authentication information of accounts -#[derive(Debug)] -pub enum AuthInfo { - RpoFalcon512(SecretKey), -} - -const RPO_FALCON512_AUTH: u8 = 0; - -impl AuthInfo { - /// Returns byte identifier of specific AuthInfo - const fn type_byte(&self) -> u8 { - match self { - AuthInfo::RpoFalcon512(_) => RPO_FALCON512_AUTH, - } - } - - /// Returns the authentication information as a tuple of (key, value) - /// that can be input to the advice map at the moment of transaction execution. - pub fn into_advice_inputs(self) -> (Word, Vec) { - match self { - AuthInfo::RpoFalcon512(key) => { - let pub_key: Word = key.public_key().into(); - let mut pk_sk_bytes = key.to_bytes(); - pk_sk_bytes.append(&mut pub_key.to_bytes()); - - (pub_key, pk_sk_bytes.iter().map(|a| Felt::new(*a as u64)).collect::>()) - }, - } - } -} - -impl Serializable for AuthInfo { - fn write_into(&self, target: &mut W) { - let mut bytes = vec![self.type_byte()]; - match self { - AuthInfo::RpoFalcon512(key_pair) => { - bytes.append(&mut key_pair.to_bytes()); - target.write_bytes(&bytes); - }, - } - } -} - -impl Deserializable for AuthInfo { - fn read_from(source: &mut R) -> Result { - let auth_type: u8 = source.read_u8()?; - match auth_type { - RPO_FALCON512_AUTH => { - let key_pair = SecretKey::read_from(source)?; - Ok(AuthInfo::RpoFalcon512(key_pair)) - }, - val => Err(DeserializationError::InvalidValue(val.to_string())), - } - } -} - -// CHAIN MMR NODE FILTER -// ================================================================================================ - -pub enum ChainMmrNodeFilter<'a> { - /// Return all nodes. - All, - /// Filter by the specified in-order indices. - List(&'a [InOrderIndex]), -} - -// TRANSACTION FILTERS -// ================================================================================================ - -pub enum TransactionFilter { - /// Return all transactions. - All, - /// Filter by transactions that have not yet been committed to the blockchain as per the last - /// sync. - Uncomitted, -} - -// NOTE FILTER -// ================================================================================================ - -pub enum NoteFilter { - /// Return a list of all notes ([InputNoteRecord] or [OutputNoteRecord]). - All, - /// Filter by consumed notes ([InputNoteRecord] or [OutputNoteRecord]). notes that have been used as inputs in transactions. - Consumed, - /// Return a list of committed notes ([InputNoteRecord] or [OutputNoteRecord]). These represent notes that the blockchain - /// has included in a block, and for which we are storing anchor data. - Committed, - /// Return a list of pending notes ([InputNoteRecord] or [OutputNoteRecord]). These represent notes for which the store - /// does not have anchor data. - Pending, -} diff --git a/src/store/note_record/input_note_record.rs b/src/store/note_record/input_note_record.rs deleted file mode 100644 index 8724012be..000000000 --- a/src/store/note_record/input_note_record.rs +++ /dev/null @@ -1,189 +0,0 @@ -use miden_objects::{ - notes::{ - Note, NoteAssets, NoteId, NoteInclusionProof, NoteInputs, NoteMetadata, NoteRecipient, - }, - transaction::InputNote, - utils::{ByteReader, ByteWriter, Deserializable, DeserializationError, Serializable}, - Digest, -}; - -use super::{NoteRecordDetails, NoteStatus}; -use crate::errors::ClientError; - -// INPUT NOTE RECORD -// ================================================================================================ - -/// Represents a Note of which the Store can keep track and retrieve. -/// -/// An [InputNoteRecord] contains all the information of a [Note], in addition of (optionally) the -/// [NoteInclusionProof] that identifies when the note was included in the chain. -/// -/// Once the proof is set, the [InputNoteRecord] can be transformed into an [InputNote] and used as -/// input for transactions. -/// -/// It is also possible to convert [Note] and [InputNote] into [InputNoteRecord] (we fill the -/// `metadata` and `inclusion_proof` fields if possible) -#[derive(Clone, Debug, PartialEq)] -pub struct InputNoteRecord { - assets: NoteAssets, - details: NoteRecordDetails, - id: NoteId, - inclusion_proof: Option, - metadata: Option, - recipient: Digest, - status: NoteStatus, -} - -impl InputNoteRecord { - pub fn new( - id: NoteId, - recipient: Digest, - assets: NoteAssets, - status: NoteStatus, - metadata: Option, - inclusion_proof: Option, - details: NoteRecordDetails, - ) -> InputNoteRecord { - InputNoteRecord { - id, - recipient, - assets, - status, - metadata, - inclusion_proof, - details, - } - } - - pub fn id(&self) -> NoteId { - self.id - } - - pub fn recipient(&self) -> Digest { - self.recipient - } - - pub fn assets(&self) -> &NoteAssets { - &self.assets - } - - pub fn status(&self) -> NoteStatus { - self.status - } - - pub fn metadata(&self) -> Option<&NoteMetadata> { - self.metadata.as_ref() - } - - pub fn nullifier(&self) -> &str { - &self.details.nullifier - } - - pub fn inclusion_proof(&self) -> Option<&NoteInclusionProof> { - self.inclusion_proof.as_ref() - } - - pub fn details(&self) -> &NoteRecordDetails { - &self.details - } -} - -impl Serializable for InputNoteRecord { - fn write_into(&self, target: &mut W) { - self.id().write_into(target); - self.recipient().write_into(target); - self.assets().write_into(target); - self.status().write_into(target); - self.metadata().write_into(target); - self.details().write_into(target); - self.inclusion_proof().write_into(target); - } -} - -impl Deserializable for InputNoteRecord { - fn read_from(source: &mut R) -> Result { - let id = NoteId::read_from(source)?; - let recipient = Digest::read_from(source)?; - let assets = NoteAssets::read_from(source)?; - let status = NoteStatus::read_from(source)?; - let metadata = Option::::read_from(source)?; - let details = NoteRecordDetails::read_from(source)?; - let inclusion_proof = Option::::read_from(source)?; - - Ok(InputNoteRecord { - id, - recipient, - assets, - status, - metadata, - inclusion_proof, - details, - }) - } -} - -impl From for InputNoteRecord { - fn from(note: Note) -> Self { - InputNoteRecord { - id: note.id(), - recipient: note.recipient_digest(), - assets: note.assets().clone(), - status: NoteStatus::Pending, - metadata: Some(*note.metadata()), - inclusion_proof: None, - details: NoteRecordDetails::new( - note.nullifier().to_string(), - note.script().clone(), - note.inputs().to_vec(), - note.serial_num(), - ), - } - } -} - -impl From for InputNoteRecord { - fn from(recorded_note: InputNote) -> Self { - InputNoteRecord { - id: recorded_note.note().id(), - recipient: recorded_note.note().recipient_digest(), - assets: recorded_note.note().assets().clone(), - status: NoteStatus::Pending, - metadata: Some(*recorded_note.note().metadata()), - details: NoteRecordDetails::new( - recorded_note.note().nullifier().to_string(), - recorded_note.note().script().clone(), - recorded_note.note().inputs().values().to_vec(), - recorded_note.note().serial_num(), - ), - inclusion_proof: Some(recorded_note.proof().clone()), - } - } -} - -impl TryInto for InputNoteRecord { - type Error = ClientError; - - fn try_into(self) -> Result { - match (self.inclusion_proof, self.metadata) { - (Some(proof), Some(metadata)) => { - // TODO: Write functions to get these fields more easily - let note_inputs = NoteInputs::new(self.details.inputs)?; - let note_recipient = - NoteRecipient::new(self.details.serial_num, self.details.script, note_inputs); - let note = Note::new(self.assets, metadata, note_recipient); - Ok(InputNote::new(note, proof.clone())) - }, - - (None, _) => { - Err(ClientError::NoteError(miden_objects::NoteError::invalid_origin_index( - "Input Note Record contains no inclusion proof".to_string(), - ))) - }, - (_, None) => { - Err(ClientError::NoteError(miden_objects::NoteError::invalid_origin_index( - "Input Note Record contains no metadata".to_string(), - ))) - }, - } - } -} diff --git a/src/store/note_record/mod.rs b/src/store/note_record/mod.rs deleted file mode 100644 index 603d8d479..000000000 --- a/src/store/note_record/mod.rs +++ /dev/null @@ -1,173 +0,0 @@ -use miden_objects::{ - assembly::{Assembler, ProgramAst}, - notes::NoteScript, - utils::{ByteReader, ByteWriter, Deserializable, DeserializationError, Serializable}, - Digest, Felt, Word, -}; -use serde::{Deserialize, Serialize}; - -mod input_note_record; -mod output_note_record; - -pub use input_note_record::InputNoteRecord; -pub use output_note_record::OutputNoteRecord; - -/// This module defines common structs to be used within the [Store](crate::store::Store) for notes -/// that are available to be consumed ([InputNoteRecord]) and notes that have been produced as a -/// result of executing a transaction ([OutputNoteRecord]). -/// -/// # Features -/// -/// ## Serialization / Deserialization -/// -/// We provide serialization and deserialization support via [Serializable] and [Deserializable] -/// traits implementations, and also via [Serialize] and [Deserialize] from `serde` to provide the -/// ability to serialize most fields into JSON. This is useful for example if you want to store -/// some fields as json columns like we do in -/// [SqliteStore](crate::store::sqlite_store::SqliteStore). For example, suppose we want to store -/// [InputNoteRecord]'s metadata field in a JSON column. In that case, we could do something like: -/// -/// ```ignore -/// fn insert_metadata_into_some_table(db: &mut Database, note: InputNoteRecord) { -/// let note_metadata_json = serde_json::to_string(note.metadata()).unwrap(); -/// -/// db.execute("INSERT INTO notes_metadata (note_id, note_metadata) VALUES (?, ?)", -/// note.id().to_hex(), note_metadata_json).unwrap() -/// } -/// ``` -/// -/// ## Type conversion -/// -/// We also facilitate converting from/into [InputNote](miden_objects::transaction::InputNote) / -/// [Note](miden_objects::notes::Note), although this is not always possible. Check both -/// [InputNoteRecord]'s and [OutputNoteRecord]'s documentation for more details into this - -// NOTE STATUS -// ================================================================================================ -#[derive(Clone, Copy, Debug, Serialize, Deserialize, PartialEq, Eq)] -pub enum NoteStatus { - Pending, - Committed, - Consumed, -} - -impl From for u8 { - fn from(value: NoteStatus) -> Self { - match value { - NoteStatus::Pending => 0, - NoteStatus::Committed => 1, - NoteStatus::Consumed => 2, - } - } -} - -impl TryFrom for NoteStatus { - type Error = DeserializationError; - fn try_from(value: u8) -> Result { - match value { - 0 => Ok(NoteStatus::Pending), - 1 => Ok(NoteStatus::Committed), - 2 => Ok(NoteStatus::Consumed), - _ => Err(DeserializationError::InvalidValue(value.to_string())), - } - } -} - -impl Serializable for NoteStatus { - fn write_into(&self, target: &mut W) { - target.write_bytes(&[(*self).into()]); - } -} - -impl Deserializable for NoteStatus { - fn read_from(source: &mut R) -> Result { - let enum_byte = u8::read_from(source)?; - enum_byte.try_into() - } -} - -fn default_script() -> NoteScript { - let assembler = Assembler::default(); - let note_program_ast = - ProgramAst::parse("begin end").expect("dummy script should be parseable"); - let (note_script, _) = NoteScript::new(note_program_ast, &assembler) - .expect("dummy note script should be created without issues"); - note_script -} - -// NOTE: NoteInputs does not impl Serialize which is why we use Vec here -#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] -pub struct NoteRecordDetails { - nullifier: String, - script_hash: Digest, - #[serde(skip_serializing, skip_deserializing, default = "default_script")] - script: NoteScript, - inputs: Vec, - serial_num: Word, -} - -impl NoteRecordDetails { - pub fn new(nullifier: String, script: NoteScript, inputs: Vec, serial_num: Word) -> Self { - let script_hash = script.hash(); - Self { - nullifier, - script, - script_hash, - inputs, - serial_num, - } - } - - pub fn nullifier(&self) -> &str { - &self.nullifier - } - - pub fn script_hash(&self) -> &Digest { - &self.script_hash - } - - pub fn script(&self) -> &NoteScript { - &self.script - } - - pub fn inputs(&self) -> &Vec { - &self.inputs - } - - pub fn serial_num(&self) -> Word { - self.serial_num - } -} - -impl Serializable for NoteRecordDetails { - fn write_into(&self, target: &mut W) { - let nullifier_bytes = self.nullifier.as_bytes(); - target.write_usize(nullifier_bytes.len()); - target.write_bytes(nullifier_bytes); - - self.script().write_into(target); - - target.write_usize(self.inputs.len()); - target.write_many(self.inputs()); - - self.serial_num().write_into(target); - } -} - -impl Deserializable for NoteRecordDetails { - fn read_from(source: &mut R) -> Result { - let nullifier_len = usize::read_from(source)?; - let nullifier_bytes = source.read_vec(nullifier_len)?; - let nullifier = - String::from_utf8(nullifier_bytes).expect("Nullifier String bytes should be readable."); - - let script = NoteScript::read_from(source)?; - - let inputs_len = source.read_usize()?; - let inputs = source.read_many::(inputs_len)?; - - let serial_num = Word::read_from(source)?; - - Ok(NoteRecordDetails::new(nullifier, script, inputs, serial_num)) - } -} diff --git a/src/store/note_record/output_note_record.rs b/src/store/note_record/output_note_record.rs deleted file mode 100644 index a5c2441dc..000000000 --- a/src/store/note_record/output_note_record.rs +++ /dev/null @@ -1,98 +0,0 @@ -use miden_objects::{ - notes::{Note, NoteAssets, NoteId, NoteInclusionProof, NoteMetadata}, - Digest, -}; - -use super::{NoteRecordDetails, NoteStatus}; - -// OUTPUT NOTE RECORD -// ================================================================================================ - -/// Represents a Note which was the result of executing some transaction of which the Store can -/// keep track and retrieve. -/// -/// An [OutputNoteRecord] contains all the information of a [Note] while it allows for not knowing -/// the details (nullifier, script, inputs and serial number), in addition of (optionally) the -/// [NoteInclusionProof] that identifies when the note was included in the chain. -/// -/// It is also possible to convert [Note] into [OutputNoteRecord] (we fill the `details` and -/// `inclusion_proof` fields if possible) -#[derive(Clone, Debug, PartialEq)] -pub struct OutputNoteRecord { - assets: NoteAssets, - details: Option, - id: NoteId, - inclusion_proof: Option, - metadata: NoteMetadata, - recipient: Digest, - status: NoteStatus, -} - -impl OutputNoteRecord { - pub fn new( - id: NoteId, - recipient: Digest, - assets: NoteAssets, - status: NoteStatus, - metadata: NoteMetadata, - inclusion_proof: Option, - details: Option, - ) -> OutputNoteRecord { - OutputNoteRecord { - id, - recipient, - assets, - status, - metadata, - inclusion_proof, - details, - } - } - - pub fn id(&self) -> NoteId { - self.id - } - - pub fn recipient(&self) -> Digest { - self.recipient - } - - pub fn assets(&self) -> &NoteAssets { - &self.assets - } - - pub fn status(&self) -> NoteStatus { - self.status - } - - pub fn metadata(&self) -> &NoteMetadata { - &self.metadata - } - - pub fn inclusion_proof(&self) -> Option<&NoteInclusionProof> { - self.inclusion_proof.as_ref() - } - - pub fn details(&self) -> Option<&NoteRecordDetails> { - self.details.as_ref() - } -} - -impl From for OutputNoteRecord { - fn from(note: Note) -> Self { - OutputNoteRecord { - id: note.id(), - recipient: note.recipient_digest(), - assets: note.assets().clone(), - status: NoteStatus::Pending, - metadata: *note.metadata(), - inclusion_proof: None, - details: Some(NoteRecordDetails::new( - note.nullifier().to_string(), - note.script().clone(), - note.inputs().to_vec(), - note.serial_num(), - )), - } - } -} diff --git a/src/store/sqlite_store/accounts.rs b/src/store/sqlite_store/accounts.rs deleted file mode 100644 index 109e4dbe9..000000000 --- a/src/store/sqlite_store/accounts.rs +++ /dev/null @@ -1,500 +0,0 @@ -use clap::error::Result; -use miden_lib::transaction::TransactionKernel; -use miden_objects::{ - accounts::{Account, AccountCode, AccountId, AccountStorage, AccountStub}, - assembly::{AstSerdeOptions, ModuleAst}, - assets::{Asset, AssetVault}, - Digest, Felt, Word, -}; -use miden_tx::utils::{Deserializable, Serializable}; -use rusqlite::{params, Transaction}; - -use super::SqliteStore; -use crate::{errors::StoreError, store::AuthInfo}; - -// TYPES -// ================================================================================================ -type SerializedAccountData = (i64, String, String, String, i64, bool); -type SerializedAccountsParts = (i64, i64, String, String, String, Option>); - -type SerializedAccountAuthData = (i64, Vec); -type SerializedAccountAuthParts = (i64, Vec); - -type SerializedAccountVaultData = (String, String); -type SerializedAccountVaultParts = (String, String); - -type SerializedAccountCodeData = (String, String, Vec); -type SerializedAccountCodeParts = (String, String, Vec); - -type SerializedAccountStorageData = (String, Vec); -type SerializedAccountStorageParts = (String, Vec); - -impl SqliteStore { - // ACCOUNTS - // -------------------------------------------------------------------------------------------- - - pub(super) fn get_account_ids(&self) -> Result, StoreError> { - const QUERY: &str = "SELECT DISTINCT id FROM accounts"; - - self.db - .prepare(QUERY)? - .query_map([], |row| row.get(0)) - .expect("no binding parameters used in query") - .map(|result| { - Ok(result - .map(|id: i64| AccountId::try_from(id as u64).expect("account id is valid"))?) - }) - .collect::, StoreError>>() - } - - pub(super) fn get_account_stubs(&self) -> Result)>, StoreError> { - const QUERY: &str = - "SELECT a.id, a.nonce, a.vault_root, a.storage_root, a.code_root, a.account_seed \ - FROM accounts a \ - WHERE a.nonce = (SELECT MAX(b.nonce) FROM accounts b WHERE b.id = a.id)"; - - self.db - .prepare(QUERY)? - .query_map([], parse_accounts_columns) - .expect("no binding parameters used in query") - .map(|result| Ok(result?).and_then(parse_accounts)) - .collect() - } - - pub(crate) fn get_account_stub( - &self, - account_id: AccountId, - ) -> Result<(AccountStub, Option), StoreError> { - let account_id_int: u64 = account_id.into(); - const QUERY: &str = "SELECT id, nonce, vault_root, storage_root, code_root, account_seed \ - FROM accounts WHERE id = ? \ - ORDER BY nonce DESC \ - LIMIT 1"; - self.db - .prepare(QUERY)? - .query_map(params![account_id_int as i64], parse_accounts_columns)? - .map(|result| Ok(result?).and_then(parse_accounts)) - .next() - .ok_or(StoreError::AccountDataNotFound(account_id))? - } - - // TODO: Get all parts from a single query - pub(crate) fn get_account( - &self, - account_id: AccountId, - ) -> Result<(Account, Option), StoreError> { - let (account_stub, seed) = self.get_account_stub(account_id)?; - let (_procedures, module_ast) = self.get_account_code(account_stub.code_root())?; - - let account_code = AccountCode::new(module_ast, &TransactionKernel::assembler()).unwrap(); - - let account_storage = self.get_account_storage(account_stub.storage_root())?; - - let account_vault = self.get_vault_assets(account_stub.vault_root())?; - let account_vault = AssetVault::new(&account_vault)?; - - let account = Account::new( - account_stub.id(), - account_vault, - account_storage, - account_code, - account_stub.nonce(), - ); - - Ok((account, seed)) - } - - /// Retrieve account keys data by Account Id - pub(crate) fn get_account_auth(&self, account_id: AccountId) -> Result { - let account_id_int: u64 = account_id.into(); - const QUERY: &str = "SELECT account_id, auth_info FROM account_auth WHERE account_id = ?"; - self.db - .prepare(QUERY)? - .query_map(params![account_id_int as i64], parse_account_auth_columns)? - .map(|result| Ok(result?).and_then(parse_account_auth)) - .next() - .ok_or(StoreError::AccountDataNotFound(account_id))? - } - - /// Retrieve account code-related data by code root - pub(super) fn get_account_code( - &self, - root: Digest, - ) -> Result<(Vec, ModuleAst), StoreError> { - let root_serialized = root.to_string(); - const QUERY: &str = "SELECT root, procedures, module FROM account_code WHERE root = ?"; - - self.db - .prepare(QUERY)? - .query_map(params![root_serialized], parse_account_code_columns)? - .map(|result| Ok(result?).and_then(parse_account_code)) - .next() - .ok_or(StoreError::AccountCodeDataNotFound(root))? - } - - /// Retrieve account storage data by vault root - pub(super) fn get_account_storage(&self, root: Digest) -> Result { - let root_serialized = &root.to_string(); - - const QUERY: &str = "SELECT root, slots FROM account_storage WHERE root = ?"; - self.db - .prepare(QUERY)? - .query_map(params![root_serialized], parse_account_storage_columns)? - .map(|result| Ok(result?).and_then(parse_account_storage)) - .next() - .ok_or(StoreError::AccountStorageNotFound(root))? - } - - /// Retrieve assets by vault root - pub(super) fn get_vault_assets(&self, root: Digest) -> Result, StoreError> { - let vault_root = - serde_json::to_string(&root).map_err(StoreError::InputSerializationError)?; - - const QUERY: &str = "SELECT root, assets FROM account_vaults WHERE root = ?"; - self.db - .prepare(QUERY)? - .query_map(params![vault_root], parse_account_asset_vault_columns)? - .map(|result| Ok(result?).and_then(parse_account_asset_vault)) - .next() - .ok_or(StoreError::VaultDataNotFound(root))? - } - - pub(crate) fn insert_account( - &mut self, - account: &Account, - account_seed: Option, - auth_info: &AuthInfo, - ) -> Result<(), StoreError> { - let tx = self.db.transaction()?; - - insert_account_code(&tx, account.code())?; - insert_account_storage(&tx, account.storage())?; - insert_account_asset_vault(&tx, account.vault())?; - insert_account_record(&tx, account, account_seed)?; - insert_account_auth(&tx, account.id(), auth_info)?; - - Ok(tx.commit()?) - } -} - -// HELPERS -// ================================================================================================ - -/// Update previously-existing account after a transaction execution -/// -/// Because the Client retrieves the account by account ID before applying the delta, we don't -/// need to check that it exists here. This inserts a new row into the accounts table. -/// We can later identify the proper account state by looking at the nonce. -pub(crate) fn update_account( - tx: &Transaction<'_>, - new_account_state: &Account, -) -> Result<(), StoreError> { - insert_account_storage(tx, new_account_state.storage())?; - insert_account_asset_vault(tx, new_account_state.vault())?; - insert_account_record(tx, new_account_state, None) -} - -pub(super) fn insert_account_record( - tx: &Transaction<'_>, - account: &Account, - account_seed: Option, -) -> Result<(), StoreError> { - let (id, code_root, storage_root, vault_root, nonce, committed) = serialize_account(account)?; - - let account_seed = account_seed.map(|seed| seed.to_bytes()); - - const QUERY: &str = "INSERT INTO accounts (id, code_root, storage_root, vault_root, nonce, committed, account_seed) VALUES (?, ?, ?, ?, ?, ?, ?)"; - tx.execute( - QUERY, - params![id, code_root, storage_root, vault_root, nonce, committed, account_seed], - )?; - Ok(()) -} - -/// Inserts an [AccountCode] -fn insert_account_code(tx: &Transaction<'_>, account_code: &AccountCode) -> Result<(), StoreError> { - let (code_root, code, module) = serialize_account_code(account_code)?; - const QUERY: &str = - "INSERT OR IGNORE INTO account_code (root, procedures, module) VALUES (?, ?, ?)"; - tx.execute(QUERY, params![code_root, code, module,])?; - Ok(()) -} - -/// Inserts an [AccountStorage] -pub(super) fn insert_account_storage( - tx: &Transaction<'_>, - account_storage: &AccountStorage, -) -> Result<(), StoreError> { - let (storage_root, storage_slots) = serialize_account_storage(account_storage)?; - const QUERY: &str = "INSERT OR IGNORE INTO account_storage (root, slots) VALUES (?, ?)"; - tx.execute(QUERY, params![storage_root, storage_slots])?; - Ok(()) -} - -/// Inserts an [AssetVault] -pub(super) fn insert_account_asset_vault( - tx: &Transaction<'_>, - asset_vault: &AssetVault, -) -> Result<(), StoreError> { - let (vault_root, assets) = serialize_account_asset_vault(asset_vault)?; - const QUERY: &str = "INSERT OR IGNORE INTO account_vaults (root, assets) VALUES (?, ?)"; - tx.execute(QUERY, params![vault_root, assets])?; - Ok(()) -} - -/// Inserts an [AuthInfo] for the account with id `account_id` -pub(super) fn insert_account_auth( - tx: &Transaction<'_>, - account_id: AccountId, - auth_info: &AuthInfo, -) -> Result<(), StoreError> { - let (account_id, auth_info) = serialize_account_auth(account_id, auth_info)?; - const QUERY: &str = "INSERT INTO account_auth (account_id, auth_info) VALUES (?, ?)"; - tx.execute(QUERY, params![account_id, auth_info])?; - Ok(()) -} - -/// Parse accounts colums from the provided row into native types -pub(super) fn parse_accounts_columns( - row: &rusqlite::Row<'_>, -) -> Result { - let id: i64 = row.get(0)?; - let nonce: i64 = row.get(1)?; - let vault_root: String = row.get(2)?; - let storage_root: String = row.get(3)?; - let code_root: String = row.get(4)?; - let account_seed: Option> = row.get(5)?; - Ok((id, nonce, vault_root, storage_root, code_root, account_seed)) -} - -/// Parse an account from the provided parts. -pub(super) fn parse_accounts( - serialized_account_parts: SerializedAccountsParts, -) -> Result<(AccountStub, Option), StoreError> { - let (id, nonce, vault_root, storage_root, code_root, account_seed) = serialized_account_parts; - let account_seed = account_seed.map(|seed| Word::read_from_bytes(&seed)).transpose()?; - - Ok(( - AccountStub::new( - (id as u64) - .try_into() - .expect("Conversion from stored AccountID should not panic"), - Felt::new(nonce as u64), - serde_json::from_str(&vault_root).map_err(StoreError::JsonDataDeserializationError)?, - Digest::try_from(&storage_root)?, - Digest::try_from(&code_root)?, - ), - account_seed, - )) -} - -/// Serialized the provided account into database compatible types. -fn serialize_account(account: &Account) -> Result { - let id: u64 = account.id().into(); - let code_root = account.code().root().to_string(); - let storage_root = account.storage().root().to_string(); - let vault_root = serde_json::to_string(&account.vault().commitment()) - .map_err(StoreError::InputSerializationError)?; - let committed = account.is_on_chain(); - let nonce = account.nonce().as_int() as i64; - - Ok((id as i64, code_root, storage_root, vault_root, nonce, committed)) -} - -/// Parse account_auth columns from the provided row into native types -fn parse_account_auth_columns( - row: &rusqlite::Row<'_>, -) -> Result { - let account_id: i64 = row.get(0)?; - let auth_info_bytes: Vec = row.get(1)?; - Ok((account_id, auth_info_bytes)) -} - -/// Parse an `AuthInfo` from the provided parts. -fn parse_account_auth( - serialized_account_auth_parts: SerializedAccountAuthParts, -) -> Result { - let (_, auth_info_bytes) = serialized_account_auth_parts; - let auth_info = AuthInfo::read_from_bytes(&auth_info_bytes)?; - Ok(auth_info) -} - -/// Serialized the provided account_auth into database compatible types. -fn serialize_account_auth( - account_id: AccountId, - auth_info: &AuthInfo, -) -> Result { - let account_id: u64 = account_id.into(); - let auth_info = auth_info.to_bytes(); - Ok((account_id as i64, auth_info)) -} - -/// Parse account_code columns from the provided row into native types. -fn parse_account_code_columns( - row: &rusqlite::Row<'_>, -) -> Result { - let root: String = row.get(0)?; - let procedures: String = row.get(1)?; - let module: Vec = row.get(2)?; - Ok((root, procedures, module)) -} - -/// Parse an account_code from the provided parts. -fn parse_account_code( - serialized_account_code_parts: SerializedAccountCodeParts, -) -> Result<(Vec, ModuleAst), StoreError> { - let (_, procedures, module) = serialized_account_code_parts; - - let procedures = - serde_json::from_str(&procedures).map_err(StoreError::JsonDataDeserializationError)?; - let module = ModuleAst::from_bytes(&module)?; - Ok((procedures, module)) -} - -/// Serialize the provided account_code into database compatible types. -fn serialize_account_code( - account_code: &AccountCode, -) -> Result { - let root = account_code.root().to_string(); - let procedures = serde_json::to_string(account_code.procedures()) - .map_err(StoreError::InputSerializationError)?; - let module = account_code.module().to_bytes(AstSerdeOptions { serialize_imports: true }); - - Ok((root, procedures, module)) -} - -/// Parse account_storage columns from the provided row into native types. -fn parse_account_storage_columns( - row: &rusqlite::Row<'_>, -) -> Result { - let root: String = row.get(0)?; - let storage: Vec = row.get(1)?; - Ok((root, storage)) -} - -/// Parse an account_storage from the provided parts. -fn parse_account_storage( - serialized_account_storage_parts: SerializedAccountStorageParts, -) -> Result { - let (_, storage) = serialized_account_storage_parts; - - let storage = AccountStorage::read_from_bytes(&storage)?; - Ok(storage) -} - -/// Serialize the provided account_storage into database compatible types. -fn serialize_account_storage( - account_storage: &AccountStorage, -) -> Result { - let root = account_storage.root().to_string(); - let storage = account_storage.to_bytes(); - - Ok((root, storage)) -} - -/// Parse account_vault columns from the provided row into native types. -fn parse_account_asset_vault_columns( - row: &rusqlite::Row<'_>, -) -> Result { - let root: String = row.get(0)?; - let assets: String = row.get(1)?; - Ok((root, assets)) -} - -/// Parse a vector of assets from the provided parts. -fn parse_account_asset_vault( - serialized_account_asset_vault_parts: SerializedAccountVaultParts, -) -> Result, StoreError> { - let (_, assets) = serialized_account_asset_vault_parts; - - let assets = serde_json::from_str(&assets).map_err(StoreError::JsonDataDeserializationError)?; - Ok(assets) -} - -/// Serialize the provided asset_vault into database compatible types. -fn serialize_account_asset_vault( - asset_vault: &AssetVault, -) -> Result { - let root = serde_json::to_string(&asset_vault.commitment()) - .map_err(StoreError::InputSerializationError)?; - let assets: Vec = asset_vault.assets().collect(); - let assets = serde_json::to_string(&assets).map_err(StoreError::InputSerializationError)?; - Ok((root, assets)) -} - -#[cfg(test)] -mod tests { - use miden_objects::{ - accounts::{AccountCode, AccountId}, - assembly::ModuleAst, - crypto::dsa::rpo_falcon512::SecretKey, - }; - use miden_tx::utils::{Deserializable, Serializable}; - - use super::{insert_account_auth, AuthInfo}; - use crate::{ - mock::DEFAULT_ACCOUNT_CODE, - store::sqlite_store::{accounts::insert_account_code, tests::create_test_store}, - }; - - #[test] - fn test_account_code_insertion_no_duplicates() { - let mut store = create_test_store(); - let assembler = miden_lib::transaction::TransactionKernel::assembler(); - let module_ast = ModuleAst::parse(DEFAULT_ACCOUNT_CODE).unwrap(); - let account_code = AccountCode::new(module_ast, &assembler).unwrap(); - let tx = store.db.transaction().unwrap(); - - // Table is empty at the beginning - let mut actual: usize = - tx.query_row("SELECT Count(*) FROM account_code", [], |row| row.get(0)).unwrap(); - assert_eq!(actual, 0); - - // First insertion generates a new row - insert_account_code(&tx, &account_code).unwrap(); - actual = tx.query_row("SELECT Count(*) FROM account_code", [], |row| row.get(0)).unwrap(); - assert_eq!(actual, 1); - - // Second insertion passes but does not generate a new row - assert!(insert_account_code(&tx, &account_code).is_ok()); - actual = tx.query_row("SELECT Count(*) FROM account_code", [], |row| row.get(0)).unwrap(); - assert_eq!(actual, 1); - } - - #[test] - fn test_auth_info_serialization() { - let exp_key_pair = SecretKey::new(); - let auth_info = AuthInfo::RpoFalcon512(exp_key_pair.clone()); - let bytes = auth_info.to_bytes(); - let actual = AuthInfo::read_from_bytes(&bytes).unwrap(); - match actual { - AuthInfo::RpoFalcon512(act_key_pair) => { - assert_eq!(exp_key_pair.to_bytes(), act_key_pair.to_bytes()); - assert_eq!(exp_key_pair.public_key(), act_key_pair.public_key()); - }, - } - } - - #[test] - fn test_auth_info_store() { - let exp_key_pair = SecretKey::new(); - - let mut store = create_test_store(); - - let account_id = AccountId::try_from(3238098370154045919u64).unwrap(); - { - let tx = store.db.transaction().unwrap(); - insert_account_auth(&tx, account_id, &AuthInfo::RpoFalcon512(exp_key_pair.clone())) - .unwrap(); - tx.commit().unwrap(); - } - - let account_auth = store.get_account_auth(account_id).unwrap(); - match account_auth { - AuthInfo::RpoFalcon512(act_key_pair) => { - assert_eq!(exp_key_pair.to_bytes(), act_key_pair.to_bytes()); - assert_eq!(exp_key_pair.public_key(), act_key_pair.public_key()); - }, - } - } -} diff --git a/src/store/sqlite_store/chain_data.rs b/src/store/sqlite_store/chain_data.rs deleted file mode 100644 index 4223fb6df..000000000 --- a/src/store/sqlite_store/chain_data.rs +++ /dev/null @@ -1,289 +0,0 @@ -use alloc::collections::BTreeMap; -use std::num::NonZeroUsize; - -use clap::error::Result; -use miden_objects::{ - crypto::merkle::{InOrderIndex, MmrPeaks}, - BlockHeader, Digest, -}; -use rusqlite::{params, OptionalExtension, Transaction}; - -use super::SqliteStore; -use crate::{errors::StoreError, store::ChainMmrNodeFilter}; - -type SerializedBlockHeaderData = (i64, String, String, bool); -type SerializedBlockHeaderParts = (u64, String, String, bool); - -type SerializedChainMmrNodeData = (i64, String); -type SerializedChainMmrNodeParts = (u64, String); - -// CHAIN MMR NODE FILTER -// -------------------------------------------------------------------------------------------- - -impl ChainMmrNodeFilter<'_> { - fn to_query(&self) -> String { - let base = String::from("SELECT id, node FROM chain_mmr_nodes"); - match self { - ChainMmrNodeFilter::All => base, - ChainMmrNodeFilter::List(ids) => { - let formatted_list = ids - .iter() - .map(|id| (Into::::into(*id)).to_string()) - .collect::>() - .join(","); - format!("{base} WHERE id IN ({})", formatted_list) - }, - } - } -} - -impl SqliteStore { - pub(crate) fn insert_block_header( - &self, - block_header: BlockHeader, - chain_mmr_peaks: MmrPeaks, - has_client_notes: bool, - ) -> Result<(), StoreError> { - let chain_mmr_peaks = chain_mmr_peaks.peaks().to_vec(); - let (block_num, header, chain_mmr, has_client_notes) = - serialize_block_header(block_header, chain_mmr_peaks, has_client_notes)?; - const QUERY: &str = "\ - INSERT INTO block_headers - (block_num, header, chain_mmr_peaks, has_client_notes) - VALUES (?, ?, ?, ?)"; - - self.db - .execute(QUERY, params![block_num, header, chain_mmr, has_client_notes])?; - - Ok(()) - } - - pub(crate) fn get_block_headers( - &self, - block_numbers: &[u32], - ) -> Result, StoreError> { - let formatted_block_numbers_list = block_numbers - .iter() - .map(|block_number| (*block_number as i64).to_string()) - .collect::>() - .join(","); - let query = format!( - "SELECT block_num, header, chain_mmr_peaks, has_client_notes FROM block_headers WHERE block_num IN ({})", - formatted_block_numbers_list - ); - self.db - .prepare(&query)? - .query_map(params![], parse_block_headers_columns)? - .map(|result| Ok(result?).and_then(parse_block_header)) - .collect() - } - - pub(crate) fn get_tracked_block_headers(&self) -> Result, StoreError> { - const QUERY: &str = "SELECT block_num, header, chain_mmr_peaks, has_client_notes FROM block_headers WHERE has_client_notes=true"; - self.db - .prepare(QUERY)? - .query_map(params![], parse_block_headers_columns)? - .map(|result| Ok(result?).and_then(parse_block_header).map(|(block, _)| block)) - .collect() - } - - pub(crate) fn get_chain_mmr_nodes( - &self, - filter: ChainMmrNodeFilter, - ) -> Result, StoreError> { - self.db - .prepare(&filter.to_query())? - .query_map(params![], parse_chain_mmr_nodes_columns)? - .map(|result| Ok(result?).and_then(parse_chain_mmr_nodes)) - .collect() - } - - pub(crate) fn get_chain_mmr_peaks_by_block_num( - &self, - block_num: u32, - ) -> Result { - const QUERY: &str = "SELECT chain_mmr_peaks FROM block_headers WHERE block_num = ?"; - - let mmr_peaks = self - .db - .prepare(QUERY)? - .query_row(params![block_num], |row| { - let peaks: String = row.get(0)?; - Ok(peaks) - }) - .optional()?; - - if let Some(mmr_peaks) = mmr_peaks { - return parse_mmr_peaks(block_num, mmr_peaks); - } - - Ok(MmrPeaks::new(0, vec![])?) - } - - /// Inserts a list of MMR authentication nodes to the Chain MMR nodes table. - pub(crate) fn insert_chain_mmr_nodes( - tx: &Transaction<'_>, - nodes: &[(InOrderIndex, Digest)], - ) -> Result<(), StoreError> { - for (index, node) in nodes { - insert_chain_mmr_node(tx, *index, *node)?; - } - Ok(()) - } - - /// Inserts a block header using a [rusqlite::Transaction] - pub(crate) fn insert_block_header_tx( - tx: &Transaction<'_>, - block_header: BlockHeader, - chain_mmr_peaks: MmrPeaks, - has_client_notes: bool, - ) -> Result<(), StoreError> { - let chain_mmr_peaks = chain_mmr_peaks.peaks().to_vec(); - let (block_num, header, chain_mmr, has_client_notes) = - serialize_block_header(block_header, chain_mmr_peaks, has_client_notes)?; - const QUERY: &str = "\ - INSERT INTO block_headers - (block_num, header, chain_mmr_peaks, has_client_notes) - VALUES (?, ?, ?, ?)"; - tx.execute(QUERY, params![block_num, header, chain_mmr, has_client_notes])?; - Ok(()) - } -} - -// HELPERS -// ================================================================================================ - -/// Inserts a node represented by its in-order index and the node value. -fn insert_chain_mmr_node( - tx: &Transaction<'_>, - id: InOrderIndex, - node: Digest, -) -> Result<(), StoreError> { - let (id, node) = serialize_chain_mmr_node(id, node)?; - const QUERY: &str = "INSERT INTO chain_mmr_nodes (id, node) VALUES (?, ?)"; - tx.execute(QUERY, params![id, node])?; - Ok(()) -} - -fn parse_mmr_peaks(forest: u32, peaks_nodes: String) -> Result { - let mmr_peaks_nodes: Vec = - serde_json::from_str(&peaks_nodes).map_err(StoreError::JsonDataDeserializationError)?; - - MmrPeaks::new(forest as usize, mmr_peaks_nodes).map_err(StoreError::MmrError) -} - -fn serialize_block_header( - block_header: BlockHeader, - chain_mmr_peaks: Vec, - has_client_notes: bool, -) -> Result { - let block_num = block_header.block_num(); - let header = - serde_json::to_string(&block_header).map_err(StoreError::InputSerializationError)?; - let chain_mmr_peaks = - serde_json::to_string(&chain_mmr_peaks).map_err(StoreError::InputSerializationError)?; - - Ok((block_num as i64, header, chain_mmr_peaks, has_client_notes)) -} - -fn parse_block_headers_columns( - row: &rusqlite::Row<'_>, -) -> Result { - let block_num: i64 = row.get(0)?; - let header: String = row.get(1)?; - let chain_mmr: String = row.get(2)?; - let has_client_notes: bool = row.get(3)?; - - Ok((block_num as u64, header, chain_mmr, has_client_notes)) -} - -fn parse_block_header( - serialized_block_header_parts: SerializedBlockHeaderParts, -) -> Result<(BlockHeader, bool), StoreError> { - let (_, header, _, has_client_notes) = serialized_block_header_parts; - - Ok(( - serde_json::from_str(&header).map_err(StoreError::JsonDataDeserializationError)?, - has_client_notes, - )) -} - -fn serialize_chain_mmr_node( - id: InOrderIndex, - node: Digest, -) -> Result { - let id: u64 = id.into(); - let node = serde_json::to_string(&node).map_err(StoreError::InputSerializationError)?; - Ok((id as i64, node)) -} - -fn parse_chain_mmr_nodes_columns( - row: &rusqlite::Row<'_>, -) -> Result { - let id: i64 = row.get(0)?; - let node = row.get(1)?; - Ok((id as u64, node)) -} - -fn parse_chain_mmr_nodes( - serialized_chain_mmr_node_parts: SerializedChainMmrNodeParts, -) -> Result<(InOrderIndex, Digest), StoreError> { - let (id, node) = serialized_chain_mmr_node_parts; - - let id = InOrderIndex::new(NonZeroUsize::new(id as usize).unwrap()); - let node: Digest = - serde_json::from_str(&node).map_err(StoreError::JsonDataDeserializationError)?; - Ok((id, node)) -} - -#[cfg(test)] -mod test { - use miden_objects::{crypto::merkle::MmrPeaks, BlockHeader}; - - use crate::store::{ - sqlite_store::{tests::create_test_store, SqliteStore}, - Store, - }; - - fn insert_dummy_block_headers(store: &mut SqliteStore) -> Vec { - let block_headers: Vec = - (0..5).map(|block_num| BlockHeader::mock(block_num, None, None, &[])).collect(); - let tx = store.db.transaction().unwrap(); - let dummy_peaks = MmrPeaks::new(0, Vec::new()).unwrap(); - (0..5).for_each(|block_num| { - SqliteStore::insert_block_header_tx( - &tx, - block_headers[block_num], - dummy_peaks.clone(), - false, - ) - .unwrap() - }); - tx.commit().unwrap(); - - block_headers - } - - #[test] - fn insert_and_get_block_headers_by_number() { - let mut store = create_test_store(); - let block_headers = insert_dummy_block_headers(&mut store); - - let block_header = store.get_block_header_by_num(3).unwrap(); - assert_eq!(block_headers[3], block_header.0); - } - - #[test] - fn insert_and_get_block_headers_by_list() { - let mut store = create_test_store(); - let mock_block_headers = insert_dummy_block_headers(&mut store); - - let block_headers: Vec = store - .get_block_headers(&[1, 3]) - .unwrap() - .into_iter() - .map(|(block_header, _has_notes)| block_header) - .collect(); - assert_eq!(&[mock_block_headers[1], mock_block_headers[3]], &block_headers[..]); - } -} diff --git a/src/store/sqlite_store/migrations.rs b/src/store/sqlite_store/migrations.rs deleted file mode 100644 index 0290f2d48..000000000 --- a/src/store/sqlite_store/migrations.rs +++ /dev/null @@ -1,20 +0,0 @@ -use lazy_static::lazy_static; -use rusqlite::Connection; -use rusqlite_migration::{Migrations, M}; - -use crate::errors::StoreError; - -// MIGRATIONS -// ================================================================================================ - -lazy_static! { - static ref MIGRATIONS: Migrations<'static> = - Migrations::new(vec![M::up(include_str!("store.sql")),]); -} - -// PUBLIC FUNCTIONS -// ================================================================================================ - -pub(crate) fn update_to_latest(conn: &mut Connection) -> Result<(), StoreError> { - Ok(MIGRATIONS.to_latest(conn)?) -} diff --git a/src/store/sqlite_store/mod.rs b/src/store/sqlite_store/mod.rs deleted file mode 100644 index 972818c65..000000000 --- a/src/store/sqlite_store/mod.rs +++ /dev/null @@ -1,291 +0,0 @@ -use alloc::collections::BTreeMap; - -use miden_objects::{ - accounts::{Account, AccountId, AccountStub}, - crypto::merkle::{InOrderIndex, MmrPeaks}, - notes::NoteId, - transaction::TransactionId, - BlockHeader, Digest, Word, -}; -use rusqlite::Connection; - -use super::{ - AuthInfo, ChainMmrNodeFilter, InputNoteRecord, NoteFilter, OutputNoteRecord, Store, - TransactionFilter, -}; -use crate::{ - client::{ - sync::SyncedNewNotes, - transactions::{TransactionRecord, TransactionResult}, - }, - config::StoreConfig, - errors::StoreError, -}; - -mod accounts; -mod chain_data; -mod migrations; -mod notes; -mod sync; -mod transactions; - -// SQLITE STORE -// ================================================================================================ -/// -/// Represents a connection with an sqlite database -/// -/// -/// Current table definitions can be found at `store.sql` migration file. One particular column -/// type used is JSON, for which you can look more info at [sqlite's official documentation](https://www.sqlite.org/json1.html). -/// In the case of json, some caveats must be taken: -/// -/// - To insert json values you must use sqlite's `json` function in the query alongside named -/// parameters, and the provided parameter must be a valid json. That is: -/// -/// ```sql -/// INSERT INTO SOME_TABLE -/// (some_field) -/// VALUES (json(:some_field))") -/// ``` -/// -/// ```ignore -/// let metadata = format!(r#"{{"some_inner_field": {some_field}, "some_other_inner_field": {some_other_field}}}"#); -/// ``` -/// -/// (Using raw string literals for the jsons is encouraged if possible) -/// -/// - To get data from any of the json fields you can use the `json_extract` function (in some -/// cases you'll need to do some explicit type casting to help rusqlite figure out types): -/// -/// ```sql -/// SELECT CAST(json_extract(some_json_col, '$.some_json_field') AS TEXT) from some_table -/// ``` -/// -/// - For some datatypes you'll need to do some manual serialization/deserialization. For example, -/// suppose one of your json fields is an array of digests. Then you'll need to -/// - Create the json with an array of strings representing the digests: -/// -/// ```ignore -/// let some_array_field = some_array -/// .into_iter() -/// .map(array_elem_to_string) -/// .collect::>() -/// .join(","); -/// -/// Some(format!( -/// r#"{{ -/// "some_array_field": [{some_array_field}] -/// }}"# -/// )), -/// ``` -/// -/// - When deserializing, handling the extra symbols (`[`, `]`, `,`, `"`). For that you can use -/// the `parse_json_array` function: -/// -/// ```ignore -/// let some_array = parse_json_array(some_array_field) -/// .into_iter() -/// .map(parse_json_byte_str) -/// .collect::, _>>()?; -/// ``` -/// - Thus, if needed you can create a struct representing the json values and use serde_json to -/// simplify all of the serialization/deserialization logic -pub struct SqliteStore { - pub(crate) db: Connection, -} - -impl SqliteStore { - // CONSTRUCTORS - // -------------------------------------------------------------------------------------------- - - /// Returns a new instance of [Store] instantiated with the specified configuration options. - pub fn new(config: StoreConfig) -> Result { - let mut db = Connection::open(config.database_filepath)?; - migrations::update_to_latest(&mut db)?; - - Ok(Self { db }) - } -} - -// SQLite implementation of the Store trait -// -// To simplify, all implementations rely on inner SqliteStore functions that map 1:1 by name -// This way, the actual implementations are grouped by entity types in their own sub-modules -impl Store for SqliteStore { - fn get_note_tags(&self) -> Result, StoreError> { - self.get_note_tags() - } - - fn add_note_tag(&mut self, tag: u64) -> Result { - self.add_note_tag(tag) - } - - fn get_sync_height(&self) -> Result { - self.get_sync_height() - } - - fn apply_state_sync( - &mut self, - block_header: BlockHeader, - nullifiers: Vec, - committed_notes: SyncedNewNotes, - committed_transactions: &[TransactionId], - new_mmr_peaks: MmrPeaks, - new_authentication_nodes: &[(InOrderIndex, Digest)], - updated_onchain_accounts: &[Account], - ) -> Result<(), StoreError> { - self.apply_state_sync( - block_header, - nullifiers, - committed_notes, - committed_transactions, - new_mmr_peaks, - new_authentication_nodes, - updated_onchain_accounts, - ) - } - - fn get_transactions( - &self, - transaction_filter: TransactionFilter, - ) -> Result, StoreError> { - self.get_transactions(transaction_filter) - } - - fn apply_transaction(&mut self, tx_result: TransactionResult) -> Result<(), StoreError> { - self.apply_transaction(tx_result) - } - - fn get_input_notes(&self, note_filter: NoteFilter) -> Result, StoreError> { - self.get_input_notes(note_filter) - } - - fn get_output_notes( - &self, - note_filter: NoteFilter, - ) -> Result, StoreError> { - self.get_output_notes(note_filter) - } - - fn get_input_note(&self, note_id: NoteId) -> Result { - self.get_input_note(note_id) - } - - fn insert_input_note(&mut self, note: &InputNoteRecord) -> Result<(), StoreError> { - self.insert_input_note(note) - } - - fn insert_block_header( - &self, - block_header: BlockHeader, - chain_mmr_peaks: MmrPeaks, - has_client_notes: bool, - ) -> Result<(), StoreError> { - self.insert_block_header(block_header, chain_mmr_peaks, has_client_notes) - } - - fn get_block_headers( - &self, - block_numbers: &[u32], - ) -> Result, StoreError> { - self.get_block_headers(block_numbers) - } - - fn get_tracked_block_headers(&self) -> Result, StoreError> { - self.get_tracked_block_headers() - } - - fn get_chain_mmr_nodes( - &self, - filter: ChainMmrNodeFilter, - ) -> Result, StoreError> { - self.get_chain_mmr_nodes(filter) - } - - fn get_chain_mmr_peaks_by_block_num(&self, block_num: u32) -> Result { - self.get_chain_mmr_peaks_by_block_num(block_num) - } - - fn insert_account( - &mut self, - account: &Account, - account_seed: Option, - auth_info: &AuthInfo, - ) -> Result<(), StoreError> { - self.insert_account(account, account_seed, auth_info) - } - - fn get_account_ids(&self) -> Result, StoreError> { - self.get_account_ids() - } - - fn get_account_stubs(&self) -> Result)>, StoreError> { - self.get_account_stubs() - } - - fn get_account_stub( - &self, - account_id: AccountId, - ) -> Result<(AccountStub, Option), StoreError> { - self.get_account_stub(account_id) - } - - fn get_account(&self, account_id: AccountId) -> Result<(Account, Option), StoreError> { - self.get_account(account_id) - } - - fn get_account_auth(&self, account_id: AccountId) -> Result { - self.get_account_auth(account_id) - } -} - -// TESTS -// ================================================================================================ - -#[cfg(test)] -pub mod tests { - use std::env::temp_dir; - - use rusqlite::Connection; - use uuid::Uuid; - - use super::{migrations, SqliteStore}; - use crate::{ - client::get_random_coin, - config::{ClientConfig, RpcConfig}, - mock::{MockClient, MockRpcApi}, - }; - - pub fn create_test_client() -> MockClient { - let client_config = ClientConfig { - store: create_test_store_path() - .into_os_string() - .into_string() - .unwrap() - .try_into() - .unwrap(), - rpc: RpcConfig::default(), - }; - - let rpc_endpoint = client_config.rpc.endpoint.to_string(); - let store = SqliteStore::new((&client_config).into()).unwrap(); - let rng = get_random_coin(); - let executor_store = SqliteStore::new((&client_config).into()).unwrap(); - - MockClient::new(MockRpcApi::new(&rpc_endpoint), rng, store, executor_store).unwrap() - } - - pub(crate) fn create_test_store_path() -> std::path::PathBuf { - let mut temp_file = temp_dir(); - temp_file.push(format!("{}.sqlite3", Uuid::new_v4())); - temp_file - } - - pub(crate) fn create_test_store() -> SqliteStore { - let temp_file = create_test_store_path(); - let mut db = Connection::open(temp_file).unwrap(); - migrations::update_to_latest(&mut db).unwrap(); - - SqliteStore { db } - } -} diff --git a/src/store/sqlite_store/notes.rs b/src/store/sqlite_store/notes.rs deleted file mode 100644 index ecee9f456..000000000 --- a/src/store/sqlite_store/notes.rs +++ /dev/null @@ -1,561 +0,0 @@ -use std::fmt; - -use clap::error::Result; -use miden_objects::{ - crypto::utils::{Deserializable, Serializable}, - notes::{NoteAssets, NoteId, NoteInclusionProof, NoteMetadata, NoteScript, Nullifier}, - Digest, -}; -use rusqlite::{named_params, params, Transaction}; - -use super::SqliteStore; -use crate::{ - errors::StoreError, - store::{InputNoteRecord, NoteFilter, NoteRecordDetails, NoteStatus, OutputNoteRecord}, -}; - -fn insert_note_query(table_name: NoteTable) -> String { - format!("\ - INSERT INTO {table_name} - (note_id, assets, recipient, status, metadata, details, inclusion_proof) - VALUES (:note_id, :assets, :recipient, :status, json(:metadata), json(:details), json(:inclusion_proof))") -} - -// TYPES -// ================================================================================================ - -type SerializedInputNoteData = ( - String, - Vec, - String, - String, - Option, - String, - String, - Vec, - Option, -); -type SerializedOutputNoteData = ( - String, - Vec, - String, - String, - String, - Option, - Option, - Option>, - Option, -); - -type SerializedInputNoteParts = - (Vec, String, String, String, Option, Option, Vec); -type SerializedOutputNoteParts = - (Vec, Option, String, String, String, Option, Option>); - -// NOTE TABLE -// ================================================================================================ - -/// Represents a table in the SQL DB used to store notes based on their use case -enum NoteTable { - InputNotes, - OutputNotes, -} - -impl fmt::Display for NoteTable { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - match self { - NoteTable::InputNotes => write!(f, "input_notes"), - NoteTable::OutputNotes => write!(f, "output_notes"), - } - } -} - -// NOTE FILTER -// ================================================================================================ - -impl NoteFilter { - /// Returns a [String] containing the query for this Filter - fn to_query(&self, notes_table: NoteTable) -> String { - let base = format!( - "SELECT - note.assets, - note.details, - note.recipient, - note.status, - note.metadata, - note.inclusion_proof, - script.serialized_note_script - from {notes_table} AS note - LEFT OUTER JOIN notes_scripts AS script - ON note.details IS NOT NULL AND - json_extract(note.details, '$.script_hash') = script.script_hash" - ); - - match self { - NoteFilter::All => base, - NoteFilter::Committed => format!("{base} WHERE status = 'Committed'"), - NoteFilter::Consumed => format!("{base} WHERE status = 'Consumed'"), - NoteFilter::Pending => format!("{base} WHERE status = 'Pending'"), - } - } -} - -// NOTES STORE METHODS -// -------------------------------------------------------------------------------------------- - -impl SqliteStore { - pub(crate) fn get_input_notes( - &self, - filter: NoteFilter, - ) -> Result, StoreError> { - self.db - .prepare(&filter.to_query(NoteTable::InputNotes))? - .query_map([], parse_input_note_columns) - .expect("no binding parameters used in query") - .map(|result| Ok(result?).and_then(parse_input_note)) - .collect::, _>>() - } - - /// Retrieves the output notes from the database - pub(crate) fn get_output_notes( - &self, - filter: NoteFilter, - ) -> Result, StoreError> { - self.db - .prepare(&filter.to_query(NoteTable::OutputNotes))? - .query_map([], parse_output_note_columns) - .expect("no binding parameters used in query") - .map(|result| Ok(result?).and_then(parse_output_note)) - .collect::, _>>() - } - - pub(crate) fn get_input_note(&self, note_id: NoteId) -> Result { - let query_id = ¬e_id.inner().to_string(); - - const QUERY: &str = "SELECT - note.assets, - note.details, - note.recipient, - note.status, - note.metadata, - note.inclusion_proof, - script.serialized_note_script - from input_notes AS note - LEFT OUTER JOIN notes_scripts AS script - ON note.details IS NOT NULL AND - json_extract(note.details, '$.script_hash') = script.script_hash - WHERE note.note_id = ?"; - - self.db - .prepare(QUERY)? - .query_map(params![query_id.to_string()], parse_input_note_columns)? - .map(|result| Ok(result?).and_then(parse_input_note)) - .next() - .ok_or(StoreError::InputNoteNotFound(note_id))? - } - - pub(crate) fn insert_input_note(&mut self, note: &InputNoteRecord) -> Result<(), StoreError> { - let tx = self.db.transaction()?; - - insert_input_note_tx(&tx, note)?; - - Ok(tx.commit()?) - } - - /// Returns the nullifiers of all unspent input notes - pub fn get_unspent_input_note_nullifiers(&self) -> Result, StoreError> { - const QUERY: &str = "SELECT json_extract(details, '$.nullifier') FROM input_notes WHERE status = 'Committed'"; - - self.db - .prepare(QUERY)? - .query_map([], |row| row.get(0)) - .expect("no binding parameters used in query") - .map(|result| { - result.map_err(|err| StoreError::ParsingError(err.to_string())).and_then( - |v: String| { - Digest::try_from(v).map(Nullifier::from).map_err(StoreError::HexParseError) - }, - ) - }) - .collect::, _>>() - } -} - -// HELPERS -// ================================================================================================ - -/// Inserts the provided input note into the database -pub(super) fn insert_input_note_tx( - tx: &Transaction<'_>, - note: &InputNoteRecord, -) -> Result<(), StoreError> { - let ( - note_id, - assets, - recipient, - status, - metadata, - details, - note_script_hash, - serialized_note_script, - inclusion_proof, - ) = serialize_input_note(note)?; - - tx.execute( - &insert_note_query(NoteTable::InputNotes), - named_params! { - ":note_id": note_id, - ":assets": assets, - ":recipient": recipient, - ":status": status, - ":metadata": metadata, - ":details": details, - ":inclusion_proof": inclusion_proof, - }, - ) - .map_err(|err| StoreError::QueryError(err.to_string())) - .map(|_| ())?; - - const QUERY: &str = - "INSERT OR IGNORE INTO notes_scripts (script_hash, serialized_note_script) VALUES (?, ?)"; - tx.execute(QUERY, params![note_script_hash, serialized_note_script,]) - .map_err(|err| StoreError::QueryError(err.to_string())) - .map(|_| ()) -} - -/// Inserts the provided input note into the database -pub fn insert_output_note_tx( - tx: &Transaction<'_>, - note: &OutputNoteRecord, -) -> Result<(), StoreError> { - let ( - note_id, - assets, - recipient, - status, - metadata, - details, - note_script_hash, - serialized_note_script, - inclusion_proof, - ) = serialize_output_note(note)?; - - tx.execute( - &insert_note_query(NoteTable::OutputNotes), - named_params! { - ":note_id": note_id, - ":assets": assets, - ":recipient": recipient, - ":status": status, - ":metadata": metadata, - ":details": details, - ":inclusion_proof": inclusion_proof, - }, - ) - .map_err(|err| StoreError::QueryError(err.to_string())) - .map(|_| ())?; - - const QUERY: &str = - "INSERT OR IGNORE INTO notes_scripts (script_hash, serialized_note_script) VALUES (?, ?)"; - tx.execute(QUERY, params![note_script_hash, serialized_note_script,]) - .map_err(|err| StoreError::QueryError(err.to_string())) - .map(|_| ()) -} - -/// Parse input note columns from the provided row into native types. -fn parse_input_note_columns( - row: &rusqlite::Row<'_>, -) -> Result { - let assets: Vec = row.get(0)?; - let details: String = row.get(1)?; - let recipient: String = row.get(2)?; - let status: String = row.get(3)?; - let metadata: Option = row.get(4)?; - let inclusion_proof: Option = row.get(5)?; - let serialized_note_script: Vec = row.get(6)?; - - Ok(( - assets, - details, - recipient, - status, - metadata, - inclusion_proof, - serialized_note_script, - )) -} - -/// Parse a note from the provided parts. -fn parse_input_note( - serialized_input_note_parts: SerializedInputNoteParts, -) -> Result { - let ( - note_assets, - note_details, - recipient, - status, - note_metadata, - note_inclusion_proof, - serialized_note_script, - ) = serialized_input_note_parts; - - // Merge the info that comes from the input notes table and the notes script table - let note_script = NoteScript::read_from_bytes(&serialized_note_script)?; - let note_details: NoteRecordDetails = - serde_json::from_str(¬e_details).map_err(StoreError::JsonDataDeserializationError)?; - let note_details = NoteRecordDetails::new( - note_details.nullifier().to_string(), - note_script, - note_details.inputs().clone(), - note_details.serial_num(), - ); - - let note_metadata: Option = if let Some(metadata_as_json_str) = note_metadata { - Some( - serde_json::from_str(&metadata_as_json_str) - .map_err(StoreError::JsonDataDeserializationError)?, - ) - } else { - None - }; - - let note_assets = NoteAssets::read_from_bytes(¬e_assets)?; - - let inclusion_proof = match note_inclusion_proof { - Some(note_inclusion_proof) => { - let note_inclusion_proof: NoteInclusionProof = - serde_json::from_str(¬e_inclusion_proof) - .map_err(StoreError::JsonDataDeserializationError)?; - - Some(note_inclusion_proof) - }, - _ => None, - }; - - let recipient = Digest::try_from(recipient)?; - let id = NoteId::new(recipient, note_assets.commitment()); - let status: NoteStatus = serde_json::from_str(&format!("\"{status}\"")) - .map_err(StoreError::JsonDataDeserializationError)?; - - Ok(InputNoteRecord::new( - id, - recipient, - note_assets, - status, - note_metadata, - inclusion_proof, - note_details, - )) -} - -/// Serialize the provided input note into database compatible types. -pub(crate) fn serialize_input_note( - note: &InputNoteRecord, -) -> Result { - let note_id = note.id().inner().to_string(); - let note_assets = note.assets().to_bytes(); - - let (inclusion_proof, status) = match note.inclusion_proof() { - Some(proof) => { - let block_num = proof.origin().block_num; - let node_index = proof.origin().node_index.value(); - let sub_hash = proof.sub_hash(); - let note_root = proof.note_root(); - - let inclusion_proof = serde_json::to_string(&NoteInclusionProof::new( - block_num, - sub_hash, - note_root, - node_index, - proof.note_path().clone(), - )?) - .map_err(StoreError::InputSerializationError)?; - - let status = serde_json::to_string(&NoteStatus::Committed) - .map_err(StoreError::InputSerializationError)? - .replace('\"', ""); - (Some(inclusion_proof), status) - }, - None => { - let status = serde_json::to_string(&NoteStatus::Pending) - .map_err(StoreError::InputSerializationError)? - .replace('\"', ""); - - (None, status) - }, - }; - let recipient = note.recipient().to_hex(); - - let metadata = if let Some(metadata) = note.metadata() { - Some(serde_json::to_string(metadata).map_err(StoreError::InputSerializationError)?) - } else { - None - }; - - let details = - serde_json::to_string(¬e.details()).map_err(StoreError::InputSerializationError)?; - let note_script_hash = note.details().script_hash().to_hex(); - let serialized_note_script = note.details().script().to_bytes(); - - Ok(( - note_id, - note_assets, - recipient, - status, - metadata, - details, - note_script_hash, - serialized_note_script, - inclusion_proof, - )) -} - -/// Parse input note columns from the provided row into native types. -fn parse_output_note_columns( - row: &rusqlite::Row<'_>, -) -> Result { - let assets: Vec = row.get(0)?; - let details: Option = row.get(1)?; - let recipient: String = row.get(2)?; - let status: String = row.get(3)?; - let metadata: String = row.get(4)?; - let inclusion_proof: Option = row.get(5)?; - let serialized_note_script: Option> = row.get(6)?; - - Ok(( - assets, - details, - recipient, - status, - metadata, - inclusion_proof, - serialized_note_script, - )) -} - -/// Parse a note from the provided parts. -fn parse_output_note( - serialized_output_note_parts: SerializedOutputNoteParts, -) -> Result { - let ( - note_assets, - note_details, - recipient, - status, - note_metadata, - note_inclusion_proof, - serialized_note_script, - ) = serialized_output_note_parts; - - let note_details: Option = if let Some(details_as_json_str) = note_details { - // Merge the info that comes from the input notes table and the notes script table - let serialized_note_script = serialized_note_script - .expect("Has note details so it should have the serialized script"); - let note_script = NoteScript::read_from_bytes(&serialized_note_script)?; - let note_details: NoteRecordDetails = serde_json::from_str(&details_as_json_str) - .map_err(StoreError::JsonDataDeserializationError)?; - let note_details = NoteRecordDetails::new( - note_details.nullifier().to_string(), - note_script, - note_details.inputs().clone(), - note_details.serial_num(), - ); - - Some(note_details) - } else { - None - }; - - let note_metadata: NoteMetadata = - serde_json::from_str(¬e_metadata).map_err(StoreError::JsonDataDeserializationError)?; - - let note_assets = NoteAssets::read_from_bytes(¬e_assets)?; - - let inclusion_proof = match note_inclusion_proof { - Some(note_inclusion_proof) => { - let note_inclusion_proof: NoteInclusionProof = - serde_json::from_str(¬e_inclusion_proof) - .map_err(StoreError::JsonDataDeserializationError)?; - - Some(note_inclusion_proof) - }, - _ => None, - }; - - let recipient = Digest::try_from(recipient)?; - let id = NoteId::new(recipient, note_assets.commitment()); - let status: NoteStatus = serde_json::from_str(&format!("\"{status}\"")) - .map_err(StoreError::JsonDataDeserializationError)?; - - Ok(OutputNoteRecord::new( - id, - recipient, - note_assets, - status, - note_metadata, - inclusion_proof, - note_details, - )) -} - -/// Serialize the provided output note into database compatible types. -pub(crate) fn serialize_output_note( - note: &OutputNoteRecord, -) -> Result { - let note_id = note.id().inner().to_string(); - let note_assets = note.assets().to_bytes(); - let (inclusion_proof, status) = match note.inclusion_proof() { - Some(proof) => { - let block_num = proof.origin().block_num; - let node_index = proof.origin().node_index.value(); - let sub_hash = proof.sub_hash(); - let note_root = proof.note_root(); - - let inclusion_proof = serde_json::to_string(&NoteInclusionProof::new( - block_num, - sub_hash, - note_root, - node_index, - proof.note_path().clone(), - )?) - .map_err(StoreError::InputSerializationError)?; - - let status = serde_json::to_string(&NoteStatus::Committed) - .map_err(StoreError::InputSerializationError)? - .replace('\"', ""); - - (Some(inclusion_proof), status) - }, - None => { - let status = serde_json::to_string(&NoteStatus::Pending) - .map_err(StoreError::InputSerializationError)? - .replace('\"', ""); - - (None, status) - }, - }; - let recipient = note.recipient().to_hex(); - - let metadata = - serde_json::to_string(note.metadata()).map_err(StoreError::InputSerializationError)?; - - let details = if let Some(details) = note.details() { - Some(serde_json::to_string(&details).map_err(StoreError::InputSerializationError)?) - } else { - None - }; - let note_script_hash = note.details().map(|details| details.script_hash().to_hex()); - let serialized_note_script = note.details().map(|details| details.script().to_bytes()); - - Ok(( - note_id, - note_assets, - recipient, - status, - metadata, - details, - note_script_hash, - serialized_note_script, - inclusion_proof, - )) -} diff --git a/src/store/sqlite_store/store.sql b/src/store/sqlite_store/store.sql deleted file mode 100644 index 334485b13..000000000 --- a/src/store/sqlite_store/store.sql +++ /dev/null @@ -1,193 +0,0 @@ --- Create account_code table -CREATE TABLE account_code ( - root BLOB NOT NULL, -- root of the Merkle tree for all exported procedures in account module. - procedures BLOB NOT NULL, -- serialized procedure digests for the account code. - module BLOB NOT NULL, -- serialized ModuleAst for the account code. - PRIMARY KEY (root) -); - --- Create account_storage table -CREATE TABLE account_storage ( - root BLOB NOT NULL, -- root of the account storage Merkle tree. - slots BLOB NOT NULL, -- serialized key-value pair of non-empty account slots. - PRIMARY KEY (root) -); - --- Create account_vaults table -CREATE TABLE account_vaults ( - root BLOB NOT NULL, -- root of the Merkle tree for the account asset vault. - assets BLOB NOT NULL, -- serialized account vault assets. - PRIMARY KEY (root) -); - --- Create account_auth table -CREATE TABLE account_auth ( - account_id UNSIGNED BIG INT NOT NULL, -- ID of the account - auth_info BLOB NOT NULL, -- Serialized representation of information needed for authentication - PRIMARY KEY (account_id) -); - --- Create accounts table -CREATE TABLE accounts ( - id UNSIGNED BIG INT NOT NULL, -- Account ID. - code_root BLOB NOT NULL, -- Root of the account_code - storage_root BLOB NOT NULL, -- Root of the account_storage Merkle tree. - vault_root BLOB NOT NULL, -- Root of the account_vault Merkle tree. - nonce BIGINT NOT NULL, -- Account nonce. - committed BOOLEAN NOT NULL, -- True if recorded, false if not. - account_seed BLOB NULL, -- Account seed used to generate the ID. Expected to be NULL for non-new accounts - PRIMARY KEY (id, nonce), - FOREIGN KEY (code_root) REFERENCES account_code(root), - FOREIGN KEY (storage_root) REFERENCES account_storage(root), - FOREIGN KEY (vault_root) REFERENCES account_vaults(root) - - CONSTRAINT check_seed_nonzero CHECK (NOT (nonce = 0 AND account_seed IS NULL)) -); - --- Create transactions table -CREATE TABLE transactions ( - id BLOB NOT NULL, -- Transaction ID (hash of various components) - account_id UNSIGNED BIG INT NOT NULL, -- ID of the account against which the transaction was executed. - init_account_state BLOB NOT NULL, -- Hash of the account state before the transaction was executed. - final_account_state BLOB NOT NULL, -- Hash of the account state after the transaction was executed. - input_notes BLOB, -- Serialized list of input note hashes - output_notes BLOB, -- Serialized list of output note hashes - script_hash BLOB, -- Transaction script hash - script_inputs BLOB, -- Transaction script inputs - block_num UNSIGNED BIG INT, -- Block number for the block against which the transaction was executed. - commit_height UNSIGNED BIG INT NULL, -- Block number of the block at which the transaction was included in the chain. - FOREIGN KEY (script_hash) REFERENCES transaction_scripts(script_hash), - PRIMARY KEY (id) -); - -CREATE TABLE transaction_scripts ( - script_hash BLOB NOT NULL, -- Transaction script Hash - program BLOB, -- Transaction script program, serialized - - PRIMARY KEY (script_hash) -); - --- Create input notes table -CREATE TABLE input_notes ( - note_id BLOB NOT NULL, -- the note id - recipient BLOB NOT NULL, -- the note recipient - assets BLOB NOT NULL, -- the serialized NoteAssets, including vault hash and list of assets - status TEXT CHECK( status IN ( -- the status of the note - either pending, committed or consumed - 'Pending', 'Committed', 'Consumed' - )), - - inclusion_proof JSON NULL, -- JSON consisting of the following fields: - -- block_num -- number of the block the note was included in - -- note_index -- the index of the note in the note Merkle tree of the block the note was created in. - -- sub_hash -- sub hash of the block the note was included in stored as a hex string - -- note_root -- the note root of the block the note was created in - -- note_path -- the Merkle path to the note in the note Merkle tree of the block the note was created in, stored as an array of digests - - metadata JSON NULL, -- JSON consisting of the following fields: - -- sender_id -- the account ID of the sender - -- tag -- the note tag - - details JSON NOT NULL, -- JSON consisting of the following fields: - -- nullifier -- the nullifier of the note - -- script_hash -- the note's script hash - -- inputs -- the serialized NoteInputs, including inputs hash and list of inputs - -- serial_num -- the note serial number - PRIMARY KEY (note_id) - - CONSTRAINT check_valid_inclusion_proof_json CHECK ( - inclusion_proof IS NULL OR - ( - json_extract(inclusion_proof, '$.origin.block_num') IS NOT NULL AND - json_extract(inclusion_proof, '$.origin.node_index') IS NOT NULL AND - json_extract(inclusion_proof, '$.sub_hash') IS NOT NULL AND - json_extract(inclusion_proof, '$.note_root') IS NOT NULL AND - json_extract(inclusion_proof, '$.note_path') IS NOT NULL - )) - CONSTRAINT check_valid_metadata_json CHECK (metadata IS NULL OR (json_extract(metadata, '$.sender') IS NOT NULL AND json_extract(metadata, '$.tag') IS NOT NULL)) -); - --- Create output notes table -CREATE TABLE output_notes ( - note_id BLOB NOT NULL, -- the note id - recipient BLOB NOT NULL, -- the note recipient - assets BLOB NOT NULL, -- the serialized NoteAssets, including vault hash and list of assets - status TEXT CHECK( status IN ( -- the status of the note - either pending, committed or consumed - 'Pending', 'Committed', 'Consumed' - )), - - inclusion_proof JSON NULL, -- JSON consisting of the following fields: - -- block_num -- number of the block the note was included in - -- note_index -- the index of the note in the note Merkle tree of the block the note was created in. - -- sub_hash -- sub hash of the block the note was included in stored as a hex string - -- note_root -- the note root of the block the note was created in - -- note_path -- the Merkle path to the note in the note Merkle tree of the block the note was created in, stored as an array of digests - - metadata JSON NOT NULL, -- JSON consisting of the following fields: - -- sender_id -- the account ID of the sender - -- tag -- the note tag - - details JSON NULL, -- JSON consisting of the following fields: - -- nullifier -- the nullifier of the note - -- script -- the note's script hash - -- inputs -- the serialized NoteInputs, including inputs hash and list of inputs - -- serial_num -- the note serial number - PRIMARY KEY (note_id) - - CONSTRAINT check_valid_inclusion_proof_json CHECK ( - inclusion_proof IS NULL OR - ( - json_extract(inclusion_proof, '$.origin.block_num') IS NOT NULL AND - json_extract(inclusion_proof, '$.origin.node_index') IS NOT NULL AND - json_extract(inclusion_proof, '$.sub_hash') IS NOT NULL AND - json_extract(inclusion_proof, '$.note_root') IS NOT NULL AND - json_extract(inclusion_proof, '$.note_path') IS NOT NULL - )) - CONSTRAINT check_valid_details_json CHECK ( - details IS NULL OR - ( - json_extract(details, '$.nullifier') IS NOT NULL AND - json_extract(details, '$.script_hash') IS NOT NULL AND - json_extract(details, '$.inputs') IS NOT NULL AND - json_extract(details, '$.serial_num') IS NOT NULL - )) - -); - --- Create note's scripts table, used for both input and output notes --- TODO: can't do FOREIGN KEY over json fields, sure we're ok? -CREATE TABLE notes_scripts ( - script_hash BLOB NOT NULL, -- Note script Hash - serialized_note_script BLOB, -- NoteScript, serialized - - PRIMARY KEY (script_hash) -); - --- Create state sync table -CREATE TABLE state_sync ( - block_num UNSIGNED BIG INT NOT NULL, -- the block number of the most recent state sync - tags BLOB NOT NULL, -- the serialized list of tags - PRIMARY KEY (block_num) -); - --- insert initial row into state_sync table -INSERT OR IGNORE INTO state_sync (block_num, tags) -SELECT 0, '[]' -WHERE ( - SELECT COUNT(*) FROM state_sync -) = 0; - --- Create block headers table -CREATE TABLE block_headers ( - block_num UNSIGNED BIG INT NOT NULL, -- block number - header BLOB NOT NULL, -- serialized block header - chain_mmr_peaks BLOB NOT NULL, -- serialized peaks of the chain MMR at this block - has_client_notes BOOL NOT NULL, -- whether the block has notes relevant to the client - PRIMARY KEY (block_num) -); - --- Create chain mmr nodes -CREATE TABLE chain_mmr_nodes ( - id UNSIGNED BIG INT NOT NULL, -- in-order index of the internal MMR node - node BLOB NOT NULL, -- internal node value (hash) - PRIMARY KEY (id) -) diff --git a/src/store/sqlite_store/sync.rs b/src/store/sqlite_store/sync.rs deleted file mode 100644 index f642ae25e..000000000 --- a/src/store/sqlite_store/sync.rs +++ /dev/null @@ -1,160 +0,0 @@ -use miden_objects::{ - accounts::Account, - crypto::merkle::{InOrderIndex, MmrPeaks}, - notes::NoteInclusionProof, - transaction::TransactionId, - BlockHeader, Digest, -}; -use rusqlite::{named_params, params}; - -use super::SqliteStore; -use crate::{ - client::sync::SyncedNewNotes, - errors::StoreError, - store::sqlite_store::{accounts::update_account, notes::insert_input_note_tx}, -}; - -impl SqliteStore { - pub(crate) fn get_note_tags(&self) -> Result, StoreError> { - const QUERY: &str = "SELECT tags FROM state_sync"; - - self.db - .prepare(QUERY)? - .query_map([], |row| row.get(0)) - .expect("no binding parameters used in query") - .map(|result| { - result.map_err(|err| StoreError::ParsingError(err.to_string())).and_then( - |v: String| { - serde_json::from_str(&v).map_err(StoreError::JsonDataDeserializationError) - }, - ) - }) - .next() - .expect("state sync tags exist") - } - - pub(super) fn add_note_tag(&mut self, tag: u64) -> Result { - let mut tags = self.get_note_tags()?; - if tags.contains(&tag) { - return Ok(false); - } - tags.push(tag); - let tags = serde_json::to_string(&tags).map_err(StoreError::InputSerializationError)?; - - const QUERY: &str = "UPDATE state_sync SET tags = ?"; - self.db.execute(QUERY, params![tags])?; - - Ok(true) - } - - pub(super) fn get_sync_height(&self) -> Result { - const QUERY: &str = "SELECT block_num FROM state_sync"; - - self.db - .prepare(QUERY)? - .query_map([], |row| row.get(0)) - .expect("no binding parameters used in query") - .map(|result| Ok(result?).map(|v: i64| v as u32)) - .next() - .expect("state sync block number exists") - } - - pub(super) fn apply_state_sync( - &mut self, - block_header: BlockHeader, - nullifiers: Vec, - committed_notes: SyncedNewNotes, - committed_transactions: &[TransactionId], - new_mmr_peaks: MmrPeaks, - new_authentication_nodes: &[(InOrderIndex, Digest)], - updated_onchain_accounts: &[Account], - ) -> Result<(), StoreError> { - let tx = self.db.transaction()?; - - // Update state sync block number - const BLOCK_NUMBER_QUERY: &str = "UPDATE state_sync SET block_num = ?"; - tx.execute(BLOCK_NUMBER_QUERY, params![block_header.block_num()])?; - - // Update spent notes - for nullifier in nullifiers.iter() { - const SPENT_INPUT_NOTE_QUERY: &str = - "UPDATE input_notes SET status = 'Consumed' WHERE json_extract(details, '$.nullifier') = ?"; - let nullifier = nullifier.to_hex(); - tx.execute(SPENT_INPUT_NOTE_QUERY, params![nullifier])?; - - const SPENT_OUTPUT_NOTE_QUERY: &str = - "UPDATE output_notes SET status = 'Consumed' WHERE json_extract(details, '$.nullifier') = ?"; - tx.execute(SPENT_OUTPUT_NOTE_QUERY, params![nullifier])?; - } - - // TODO: Due to the fact that notes are returned based on fuzzy matching of tags, - // this process of marking if the header has notes needs to be revisited - let block_has_relevant_notes = !committed_notes.is_empty(); - Self::insert_block_header_tx(&tx, block_header, new_mmr_peaks, block_has_relevant_notes)?; - - // Insert new authentication nodes (inner nodes of the PartialMmr) - Self::insert_chain_mmr_nodes(&tx, new_authentication_nodes)?; - - // Update tracked notes - for (note_id, inclusion_proof) in committed_notes.new_inclusion_proofs().iter() { - let block_num = inclusion_proof.origin().block_num; - let sub_hash = inclusion_proof.sub_hash(); - let note_root = inclusion_proof.note_root(); - let note_index = inclusion_proof.origin().node_index.value(); - - let inclusion_proof = serde_json::to_string(&NoteInclusionProof::new( - block_num, - sub_hash, - note_root, - note_index, - inclusion_proof.note_path().clone(), - )?) - .map_err(StoreError::InputSerializationError)?; - - const COMMITTED_INPUT_NOTES_QUERY: &str = - "UPDATE input_notes SET status = 'Committed', inclusion_proof = json(:inclusion_proof) WHERE note_id = :note_id"; - - tx.execute( - COMMITTED_INPUT_NOTES_QUERY, - named_params! { - ":inclusion_proof": inclusion_proof, - ":note_id": note_id.inner().to_hex(), - }, - )?; - - // Update output notes - const COMMITTED_OUTPUT_NOTES_QUERY: &str = - "UPDATE output_notes SET status = 'Committed', inclusion_proof = json(:inclusion_proof) WHERE note_id = :note_id"; - - tx.execute( - COMMITTED_OUTPUT_NOTES_QUERY, - named_params! { - ":inclusion_proof": inclusion_proof, - ":note_id": note_id.inner().to_hex(), - }, - )?; - } - - // Commit new public notes - for note in committed_notes.new_public_notes() { - insert_input_note_tx(&tx, ¬e.clone().into())?; - } - - // Mark transactions as committed - Self::mark_transactions_as_committed( - &tx, - block_header.block_num(), - committed_transactions, - )?; - - // Update onchain accounts on the db that have been updated onchain - for account in updated_onchain_accounts { - update_account(&tx, account)?; - } - - // Commit the updates - tx.commit()?; - - Ok(()) - } -} diff --git a/src/store/sqlite_store/transactions.rs b/src/store/sqlite_store/transactions.rs deleted file mode 100644 index 1cb5ae898..000000000 --- a/src/store/sqlite_store/transactions.rs +++ /dev/null @@ -1,344 +0,0 @@ -use alloc::collections::BTreeMap; - -use miden_objects::{ - accounts::AccountId, - assembly::{AstSerdeOptions, ProgramAst}, - crypto::utils::{Deserializable, Serializable}, - transaction::{OutputNotes, ToNullifier, TransactionId, TransactionScript}, - Digest, Felt, -}; -use rusqlite::{params, Transaction}; -use tracing::info; - -use super::{ - accounts::update_account, - notes::{insert_input_note_tx, insert_output_note_tx}, - SqliteStore, -}; -use crate::{ - client::transactions::{TransactionRecord, TransactionResult, TransactionStatus}, - errors::StoreError, - store::{InputNoteRecord, OutputNoteRecord, TransactionFilter}, -}; - -pub(crate) const INSERT_TRANSACTION_QUERY: &str = - "INSERT INTO transactions (id, account_id, init_account_state, final_account_state, \ - input_notes, output_notes, script_hash, script_inputs, block_num, commit_height) \ - VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"; - -pub(crate) const INSERT_TRANSACTION_SCRIPT_QUERY: &str = - "INSERT OR IGNORE INTO transaction_scripts (script_hash, program) \ - VALUES (?, ?)"; - -// TRANSACTIONS FILTERS -// ================================================================================================ - -impl TransactionFilter { - /// Returns a [String] containing the query for this Filter - pub fn to_query(&self) -> String { - const QUERY: &str = "SELECT tx.id, tx.account_id, tx.init_account_state, tx.final_account_state, \ - tx.input_notes, tx.output_notes, tx.script_hash, script.program, tx.script_inputs, tx.block_num, tx.commit_height \ - FROM transactions AS tx LEFT JOIN transaction_scripts AS script ON tx.script_hash = script.script_hash"; - match self { - TransactionFilter::All => QUERY.to_string(), - TransactionFilter::Uncomitted => format!("{QUERY} WHERE tx.commit_height IS NULL"), - } - } -} - -// TRANSACTIONS -// ================================================================================================ - -type SerializedTransactionData = ( - String, - i64, - String, - String, - String, - Vec, - Option>, - Option>, - Option, - u32, - Option, -); - -impl SqliteStore { - /// Retrieves tracked transactions, filtered by [TransactionFilter]. - pub fn get_transactions( - &self, - filter: TransactionFilter, - ) -> Result, StoreError> { - self.db - .prepare(&filter.to_query())? - .query_map([], parse_transaction_columns) - .expect("no binding parameters used in query") - .map(|result| Ok(result?).and_then(parse_transaction)) - .collect::, _>>() - } - - /// Inserts a transaction and updates the current state based on the `tx_result` changes - pub fn apply_transaction(&mut self, tx_result: TransactionResult) -> Result<(), StoreError> { - let account_id = tx_result.executed_transaction().account_id(); - let account_delta = tx_result.account_delta(); - - let (mut account, _seed) = self.get_account(account_id)?; - - account.apply_delta(account_delta).map_err(StoreError::AccountError)?; - - let created_input_notes = tx_result - .relevant_notes() - .into_iter() - .map(|note| InputNoteRecord::from(note.clone())) - .collect::>(); - - let created_output_notes = tx_result - .created_notes() - .iter() - .map(|note| OutputNoteRecord::from(note.clone())) - .collect::>(); - - let tx = self.db.transaction()?; - - // Transaction Data - insert_proven_transaction_data(&tx, tx_result)?; - - // Account Data - update_account(&tx, &account)?; - - // Updates for notes - - // TODO: see if we should filter the input notes we store to keep notes we can consume with - // existing accounts - for note in &created_input_notes { - insert_input_note_tx(&tx, note)?; - } - - for note in &created_output_notes { - insert_output_note_tx(&tx, note)?; - } - - tx.commit()?; - - Ok(()) - } - - /// Set the provided transactions as committed - /// - /// # Errors - /// - /// This function can return an error if any of the updates to the transactions within the - /// database transaction fail. - pub(crate) fn mark_transactions_as_committed( - tx: &Transaction<'_>, - block_num: u32, - transactions_to_commit: &[TransactionId], - ) -> Result { - let mut rows = 0; - for transaction_id in transactions_to_commit { - const QUERY: &str = "UPDATE transactions set commit_height=? where id=?"; - rows += tx.execute(QUERY, params![Some(block_num), transaction_id.to_string()])?; - } - info!("Marked {} transactions as committed", rows); - - Ok(rows) - } -} - -pub(super) fn insert_proven_transaction_data( - tx: &Transaction<'_>, - transaction_result: TransactionResult, -) -> Result<(), StoreError> { - let ( - transaction_id, - account_id, - init_account_state, - final_account_state, - input_notes, - output_notes, - script_program, - script_hash, - script_inputs, - block_num, - committed, - ) = serialize_transaction_data(transaction_result)?; - - if let Some(hash) = script_hash.clone() { - tx.execute(INSERT_TRANSACTION_SCRIPT_QUERY, params![hash, script_program])?; - } - - tx.execute( - INSERT_TRANSACTION_QUERY, - params![ - transaction_id, - account_id, - init_account_state, - final_account_state, - input_notes, - output_notes, - script_hash, - script_inputs, - block_num, - committed, - ], - )?; - - Ok(()) -} - -pub(super) fn serialize_transaction_data( - transaction_result: TransactionResult, -) -> Result { - let executed_transaction = transaction_result.executed_transaction(); - let transaction_id: String = executed_transaction.id().inner().into(); - let account_id: u64 = executed_transaction.account_id().into(); - let init_account_state = &executed_transaction.initial_account().hash().to_string(); - let final_account_state = &executed_transaction.final_account().hash().to_string(); - - // TODO: Double check if saving nullifiers as input notes is enough - let nullifiers: Vec = executed_transaction - .input_notes() - .iter() - .map(|x| x.nullifier().inner()) - .collect(); - - let input_notes = - serde_json::to_string(&nullifiers).map_err(StoreError::InputSerializationError)?; - - let output_notes = executed_transaction.output_notes(); - - info!("Transaction ID: {}", executed_transaction.id().inner()); - info!("Transaction account ID: {}", executed_transaction.account_id()); - - // TODO: Scripts should be in their own tables and only identifiers should be stored here - let transaction_args = transaction_result.transaction_arguments(); - let mut script_program = None; - let mut script_hash = None; - let mut script_inputs = None; - - if let Some(tx_script) = transaction_args.tx_script() { - script_program = - Some(tx_script.code().to_bytes(AstSerdeOptions { serialize_imports: true })); - script_hash = Some(tx_script.hash().to_bytes()); - script_inputs = Some( - serde_json::to_string(&tx_script.inputs()) - .map_err(StoreError::InputSerializationError)?, - ); - } - - Ok(( - transaction_id, - account_id as i64, - init_account_state.to_owned(), - final_account_state.to_owned(), - input_notes, - output_notes.to_bytes(), - script_program, - script_hash, - script_inputs, - transaction_result.block_num(), - None, - )) -} - -fn parse_transaction_columns( - row: &rusqlite::Row<'_>, -) -> Result { - let id: String = row.get(0)?; - let account_id: i64 = row.get(1)?; - let init_account_state: String = row.get(2)?; - let final_account_state: String = row.get(3)?; - let input_notes: String = row.get(4)?; - let output_notes: Vec = row.get(5)?; - let script_hash: Option> = row.get(6)?; - let script_program: Option> = row.get(7)?; - let script_inputs: Option = row.get(8)?; - let block_num: u32 = row.get(9)?; - let commit_height: Option = row.get(10)?; - - Ok(( - id, - account_id, - init_account_state, - final_account_state, - input_notes, - output_notes, - script_hash, - script_program, - script_inputs, - block_num, - commit_height, - )) -} - -/// Parse a transaction from the provided parts. -fn parse_transaction( - serialized_transaction: SerializedTransactionData, -) -> Result { - let ( - id, - account_id, - init_account_state, - final_account_state, - input_notes, - output_notes, - script_hash, - script_program, - script_inputs, - block_num, - commit_height, - ) = serialized_transaction; - let account_id = AccountId::try_from(account_id as u64)?; - let id: Digest = id.try_into()?; - let init_account_state: Digest = init_account_state.try_into()?; - - let final_account_state: Digest = final_account_state.try_into()?; - - let input_note_nullifiers: Vec = - serde_json::from_str(&input_notes).map_err(StoreError::JsonDataDeserializationError)?; - - let output_notes = OutputNotes::read_from_bytes(&output_notes)?; - - let transaction_script: Option = if script_hash.is_some() { - let script_hash = script_hash - .map(|hash| Digest::read_from_bytes(&hash)) - .transpose()? - .expect("Script hash should be included in the row"); - - let script_program = script_program - .map(|program| ProgramAst::from_bytes(&program)) - .transpose()? - .expect("Script program should be included in the row"); - - let script_inputs = script_inputs - .map(|hash| serde_json::from_str::>>(&hash)) - .transpose() - .map_err(StoreError::JsonDataDeserializationError)? - .expect("Script inputs should be included in the row"); - - let tx_script = TransactionScript::from_parts( - script_program, - script_hash, - script_inputs.into_iter().map(|(k, v)| (k.into(), v)), - )?; - - Some(tx_script) - } else { - None - }; - - let transaction_status = - commit_height.map_or(TransactionStatus::Pending, TransactionStatus::Committed); - - Ok(TransactionRecord { - id: id.into(), - account_id, - init_account_state, - final_account_state, - input_note_nullifiers, - output_notes, - transaction_script, - block_num, - transaction_status, - }) -} diff --git a/src/tests.rs b/src/tests.rs deleted file mode 100644 index c9e27841b..000000000 --- a/src/tests.rs +++ /dev/null @@ -1,370 +0,0 @@ -// TESTS -// ================================================================================================ -use miden_lib::transaction::TransactionKernel; -use miden_objects::{ - accounts::{AccountId, AccountStub, ACCOUNT_ID_FUNGIBLE_FAUCET_OFF_CHAIN}, - assembly::{AstSerdeOptions, ModuleAst}, - assets::{FungibleAsset, TokenSymbol}, - crypto::dsa::rpo_falcon512::SecretKey, - Word, -}; - -use crate::{ - client::{ - accounts::{AccountStorageMode, AccountTemplate}, - transactions::transaction_request::TransactionTemplate, - }, - mock::{ - get_account_with_default_account_code, mock_full_chain_mmr_and_notes, - mock_fungible_faucet_account, mock_notes, ACCOUNT_ID_REGULAR, - }, - store::{sqlite_store::tests::create_test_client, AuthInfo, InputNoteRecord, NoteFilter}, -}; - -#[tokio::test] -async fn test_input_notes_round_trip() { - // generate test client with a random store name - let mut client = create_test_client(); - - // generate test data - - let assembler = TransactionKernel::assembler(); - let (consumed_notes, _created_notes) = mock_notes(&assembler); - let (_, consumed_notes, ..) = mock_full_chain_mmr_and_notes(consumed_notes); - - // insert notes into database - for note in consumed_notes.iter().cloned() { - client.import_input_note(note.into()).unwrap(); - } - - // retrieve notes from database - let retrieved_notes = client.get_input_notes(NoteFilter::Committed).unwrap(); - assert_eq!(retrieved_notes.len(), consumed_notes.len()); - - let recorded_notes: Vec = - consumed_notes.iter().map(|n| n.clone().into()).collect(); - // compare notes - for (recorded_note, retrieved_note) in recorded_notes.iter().zip(retrieved_notes) { - assert_eq!(recorded_note.id(), retrieved_note.id()); - } -} - -#[tokio::test] -async fn test_get_input_note() { - // generate test client with a random store name - let mut client = create_test_client(); - - let assembler = TransactionKernel::assembler(); - let (_consumed_notes, created_notes) = mock_notes(&assembler); - - // insert Note into database - client.import_input_note(created_notes.first().unwrap().clone().into()).unwrap(); - - // retrieve note from database - let retrieved_note = - client.get_input_note(created_notes.first().unwrap().clone().id()).unwrap(); - - let recorded_note: InputNoteRecord = created_notes.first().unwrap().clone().into(); - assert_eq!(recorded_note.id(), retrieved_note.id()); -} - -#[tokio::test] -async fn insert_basic_account() { - // generate test client with a random store name - let mut client = create_test_client(); - - let account_template = AccountTemplate::BasicWallet { - mutable_code: true, - storage_mode: AccountStorageMode::Local, - }; - - // Insert Account - let account_insert_result = client.new_account(account_template); - assert!(account_insert_result.is_ok()); - - let (account, account_seed) = account_insert_result.unwrap(); - - // Fetch Account - let fetched_account_data = client.get_account(account.id()); - assert!(fetched_account_data.is_ok()); - - let (fetched_account, fetched_account_seed) = fetched_account_data.unwrap(); - // Validate stub has matching data - assert_eq!(account.id(), fetched_account.id()); - assert_eq!(account.nonce(), fetched_account.nonce()); - assert_eq!(account.vault(), fetched_account.vault()); - assert_eq!(account.storage().root(), fetched_account.storage().root()); - assert_eq!(account.code().root(), fetched_account.code().root()); - - // Validate seed matches - assert_eq!(account_seed, fetched_account_seed.unwrap()); -} - -#[tokio::test] -async fn insert_faucet_account() { - // generate test client with a random store name - let mut client = create_test_client(); - - let faucet_template = AccountTemplate::FungibleFaucet { - token_symbol: TokenSymbol::new("TEST").unwrap(), - decimals: 10, - max_supply: 9999999999, - storage_mode: AccountStorageMode::Local, - }; - - // Insert Account - let account_insert_result = client.new_account(faucet_template); - assert!(account_insert_result.is_ok()); - - let (account, account_seed) = account_insert_result.unwrap(); - - // Fetch Account - let fetched_account_data = client.get_account(account.id()); - assert!(fetched_account_data.is_ok()); - - let (fetched_account, fetched_account_seed) = fetched_account_data.unwrap(); - // Validate stub has matching data - assert_eq!(account.id(), fetched_account.id()); - assert_eq!(account.nonce(), fetched_account.nonce()); - assert_eq!(account.vault(), fetched_account.vault()); - assert_eq!(account.storage(), fetched_account.storage()); - assert_eq!(account.code().root(), fetched_account.code().root()); - - // Validate seed matches - assert_eq!(account_seed, fetched_account_seed.unwrap()); -} - -#[tokio::test] -async fn insert_same_account_twice_fails() { - // generate test client with a random store name - let mut client = create_test_client(); - - let account = get_account_with_default_account_code( - AccountId::try_from(ACCOUNT_ID_REGULAR).unwrap(), - Word::default(), - None, - ); - - let key_pair = SecretKey::new(); - - assert!(client - .insert_account(&account, Some(Word::default()), &AuthInfo::RpoFalcon512(key_pair.clone())) - .is_ok()); - assert!(client - .insert_account(&account, Some(Word::default()), &AuthInfo::RpoFalcon512(key_pair)) - .is_err()); -} - -#[tokio::test] -async fn test_account_code() { - // generate test client with a random store name - let mut client = create_test_client(); - - let key_pair = SecretKey::new(); - - let account = get_account_with_default_account_code( - AccountId::try_from(ACCOUNT_ID_REGULAR).unwrap(), - Word::default(), - None, - ); - - let mut account_module = account.code().module().clone(); - - // this is needed due to the reconstruction not including source locations - account_module.clear_locations(); - account_module.clear_imports(); - - let account_module_bytes = account_module.to_bytes(AstSerdeOptions { serialize_imports: true }); - let reconstructed_ast = ModuleAst::from_bytes(&account_module_bytes).unwrap(); - assert_eq!(account_module, reconstructed_ast); - - client - .insert_account(&account, Some(Word::default()), &AuthInfo::RpoFalcon512(key_pair)) - .unwrap(); - let (retrieved_acc, _) = client.get_account(account.id()).unwrap(); - - let mut account_module = account.code().module().clone(); - account_module.clear_locations(); - account_module.clear_imports(); - assert_eq!(*account_module.procs(), *retrieved_acc.code().module().procs()); -} - -#[tokio::test] -async fn test_get_account_by_id() { - // generate test client with a random store name - let mut client = create_test_client(); - - let account = get_account_with_default_account_code( - AccountId::try_from(ACCOUNT_ID_REGULAR).unwrap(), - Word::default(), - None, - ); - - let key_pair = SecretKey::new(); - - client - .insert_account(&account, Some(Word::default()), &AuthInfo::RpoFalcon512(key_pair)) - .unwrap(); - - // Retrieving an existing account should succeed - let (acc_from_db, _account_seed) = match client.get_account_stub_by_id(account.id()) { - Ok(account) => account, - Err(err) => panic!("Error retrieving account: {}", err), - }; - assert_eq!(AccountStub::from(account), acc_from_db); - - // Retrieving a non existing account should fail - let hex = format!("0x{}", "1".repeat(16)); - let invalid_id = AccountId::from_hex(&hex).unwrap(); - assert!(client.get_account_stub_by_id(invalid_id).is_err()); -} - -#[tokio::test] -async fn test_sync_state() { - // generate test client with a random store name - let mut client = create_test_client(); - - // generate test data - crate::mock::insert_mock_data(&mut client).await; - - // assert that we have no consumed nor pending notes prior to syncing state - assert_eq!(client.get_input_notes(NoteFilter::Consumed).unwrap().len(), 0); - - let pending_notes = client.get_input_notes(NoteFilter::Pending).unwrap(); - - // sync state - let block_num: u32 = client.sync_state().await.unwrap(); - - // verify that the client is synced to the latest block - assert_eq!( - block_num, - client.rpc_api().state_sync_requests.first_key_value().unwrap().1.chain_tip - ); - - // verify that we now have one consumed note after syncing state - assert_eq!(client.get_input_notes(NoteFilter::Consumed).unwrap().len(), 1); - - // verify that the pending note we had is now committed - assert_ne!(client.get_input_notes(NoteFilter::Committed).unwrap(), pending_notes); - - // verify that the latest block number has been updated - assert_eq!( - client.get_sync_height().unwrap(), - client.rpc_api().state_sync_requests.first_key_value().unwrap().1.chain_tip - ); -} - -#[tokio::test] -async fn test_sync_state_mmr_state() { - // generate test client with a random store name - let mut client = create_test_client(); - - // generate test data - let tracked_block_headers = crate::mock::insert_mock_data(&mut client).await; - - // sync state - let block_num: u32 = client.sync_state().await.unwrap(); - - // verify that the client is synced to the latest block - assert_eq!( - block_num, - client.rpc_api().state_sync_requests.first_key_value().unwrap().1.chain_tip - ); - - // verify that the latest block number has been updated - assert_eq!( - client.get_sync_height().unwrap(), - client.rpc_api().state_sync_requests.first_key_value().unwrap().1.chain_tip - ); - - // verify that we inserted the latest block into the db via the client - let latest_block = client.get_sync_height().unwrap(); - assert_eq!(block_num, latest_block); - assert_eq!( - tracked_block_headers[tracked_block_headers.len() - 1], - client.get_block_headers(&[latest_block]).unwrap()[0].0 - ); - - // Try reconstructing the chain_mmr from what's in the database - let partial_mmr = client.build_current_partial_mmr().unwrap(); - - // Since Mocked data contains three sync updates we should be "tracking" those blocks - // However, remember that we don't actually update the partial_mmr with the latest block but up - // to one block before instead. This is because the prologue will already build the - // authentication path for that block. - assert_eq!(partial_mmr.forest(), 6); - assert!(partial_mmr.open(0).unwrap().is_none()); - assert!(partial_mmr.open(1).unwrap().is_none()); - assert!(partial_mmr.open(2).unwrap().is_some()); - assert!(partial_mmr.open(3).unwrap().is_none()); - assert!(partial_mmr.open(4).unwrap().is_some()); - assert!(partial_mmr.open(5).unwrap().is_none()); - - // Ensure the proofs are valid - let mmr_proof = partial_mmr.open(2).unwrap().unwrap(); - assert!(partial_mmr.peaks().verify(tracked_block_headers[0].hash(), mmr_proof)); - - let mmr_proof = partial_mmr.open(4).unwrap().unwrap(); - assert!(partial_mmr.peaks().verify(tracked_block_headers[1].hash(), mmr_proof)); -} - -#[tokio::test] -async fn test_add_tag() { - // generate test client with a random store name - let mut client = create_test_client(); - - // assert that no tags are being tracked - assert_eq!(client.get_note_tags().unwrap().len(), 0); - - // add a tag - const TAG_VALUE_1: u64 = 1; - const TAG_VALUE_2: u64 = 2; - client.add_note_tag(TAG_VALUE_1).unwrap(); - client.add_note_tag(TAG_VALUE_2).unwrap(); - - // verify that the tag is being tracked - assert_eq!(client.get_note_tags().unwrap(), vec![TAG_VALUE_1, TAG_VALUE_2]); - - // attempt to add the same tag again - client.add_note_tag(TAG_VALUE_1).unwrap(); - - // verify that the tag is still being tracked only once - assert_eq!(client.get_note_tags().unwrap(), vec![TAG_VALUE_1, TAG_VALUE_2]); -} - -#[tokio::test] -async fn test_mint_transaction() { - const FAUCET_ID: u64 = ACCOUNT_ID_FUNGIBLE_FAUCET_OFF_CHAIN; - const INITIAL_BALANCE: u64 = 1000; - - // generate test client with a random store name - let mut client = create_test_client(); - - // Faucet account generation - let key_pair = SecretKey::new(); - - let faucet = mock_fungible_faucet_account( - AccountId::try_from(FAUCET_ID).unwrap(), - INITIAL_BALANCE, - key_pair.clone(), - ); - - client - .store() - .insert_account(&faucet, None, &AuthInfo::RpoFalcon512(key_pair)) - .unwrap(); - - client.sync_state().await.unwrap(); - - // Test submitting a mint transaction - let transaction_template = TransactionTemplate::MintFungibleAsset( - FungibleAsset::new(faucet.id(), 5u64).unwrap(), - AccountId::from_hex("0x168187d729b31a84").unwrap(), - miden_objects::notes::NoteType::OffChain, - ); - - let transaction_request = client.build_transaction_request(transaction_template).unwrap(); - - let transaction = client.new_transaction(transaction_request).unwrap(); - assert!(transaction.executed_transaction().account_delta().nonce().is_some()); -} diff --git a/wasm/Cargo.toml b/wasm/Cargo.toml index a58b01664..9e3f2d21d 100644 --- a/wasm/Cargo.toml +++ b/wasm/Cargo.toml @@ -9,14 +9,11 @@ build = "build.rs" crate-type = ["cdylib"] [features] -concurrent = [ - "miden-lib/concurrent", - "miden-objects/concurrent", - "miden-tx/concurrent", -] +concurrent = ["miden-lib/concurrent", "miden-objects/concurrent", "miden-tx/concurrent"] default = ["std"] std = ["miden-objects/std"] testing = ["miden-objects/testing", "miden-lib/testing"] +test_utils = ["miden-objects/testing"] [dependencies] async-trait = "0.1" @@ -24,21 +21,19 @@ base64 = "0.13" futures = "0.3" getrandom = { version = "0.2", features = ["js"] } hex = { version = "0.4" } -miden-lib = { path="../../demox-miden-base/miden-lib", default-features = false } -miden-objects = { path="../../demox-miden-base/objects", features = ["serde"] } -miden-tx = { path="../../demox-miden-base/miden-tx", default-features = false } -rand = { version = "0.8.5" } +miden-client = { path = "../../demox-miden-client-next", default-features = false, features = ["wasm"] } +miden-lib = { version = "0.3", default-features = false } +miden-tx = { version = "0.3", default-features = false } +miden-objects = { version = "0.3", default-features = false, features = ["serde"] } prost = { version = "0.12.3" } serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" serde-wasm-bindgen = "0.6.5" -thiserror = { version = "1.0" } tonic = { version="0.11.0", default-features = false, features=["prost","codegen"] } tonic-web-wasm-client = "0.5" -tracing = { version = "0.1" } wasm-bindgen = { version = "0.2", features = ["serde-serialize"] } wasm-bindgen-futures = "0.4" web-sys = { version = "0.3", features = ["console"] } [build-dependencies] -tonic-build = { version="0.11.0", default-features = false, features = ["prost"]} \ No newline at end of file +tonic-build = { version="0.11.0", default-features = false, features = ["prost"]} diff --git a/wasm/js/db/accounts.js b/wasm/js/db/accounts.js index 2720245d0..abc713d8d 100644 --- a/wasm/js/db/accounts.js +++ b/wasm/js/db/accounts.js @@ -235,8 +235,43 @@ export async function getAccountAuth( auth_info: authInfoBase64 }; } catch (err) { - console.error('Error fetching account auth:', error); - throw error; // Re-throw the error for further handling + console.error('Error fetching account auth:', err); + throw err; // Re-throw the error for further handling + } +} + +export async function getAccountAuthByPubKey( + pubKey +) { + try { + let pubKeyArray = new Uint8Array(pubKey); + let pubKeyBase64 = uint8ArrayToBase64(pubKeyArray); + + // Fetch all records matching the given id + const allMatchingRecords = await accountAuths + .where('pubKey') + .equals(pubKeyBase64) + .toArray(); + + if (allMatchingRecords.length === 0) { + console.log('No records found for given account ID.'); + return null; // No records found + } + + // The first record is the only one due to the uniqueness constraint + const authRecord = allMatchingRecords[0]; + + // Convert the authInfo Blob to an ArrayBuffer + const authInfoArrayBuffer = await authRecord.authInfo.arrayBuffer(); + const authInfoArray = new Uint8Array(authInfoArrayBuffer); + const authInfoBase64 = uint8ArrayToBase64(authInfoArray); + return { + id: authRecord.accountId, + auth_info: authInfoBase64 + }; + } catch (err) { + console.error('Error fetching account auth by public key:', err); + throw err; // Re-throw the error for further handling } } @@ -343,15 +378,19 @@ export async function insertAccountRecord( export async function insertAccountAuth( accountId, - authInfo + authInfo, + pubKey ) { try { let authInfoBlob = new Blob([new Uint8Array(authInfo)]); + let pubKeyArray = new Uint8Array(pubKey); + let pubKeyBase64 = uint8ArrayToBase64(pubKeyArray); // Prepare the data object to insert const data = { accountId: accountId, // Using accountId as the key authInfo: authInfoBlob, + pubKey: pubKeyBase64 }; // Perform the insert using Dexie diff --git a/wasm/js/db/greet.js b/wasm/js/db/greet.js deleted file mode 100644 index d1e738e46..000000000 --- a/wasm/js/db/greet.js +++ /dev/null @@ -1,17 +0,0 @@ -import { greets } from './schema.js'; - -export async function insertGreeting(greeting) { - try { - // Prepare the data object to insert - const data = { - greeting: greeting - }; - - // Perform the insert using Dexie - await greets.add(data); - return `Successfully inserted greeting: ${greeting}`; - } catch (error) { - console.error(`Error inserting greeting: ${greeting}:`, error); - throw error; // Rethrow the error to handle it further up the call chain if needed - } -} \ No newline at end of file diff --git a/wasm/js/db/notes.js b/wasm/js/db/notes.js index 2f895b41f..6969c19ea 100644 --- a/wasm/js/db/notes.js +++ b/wasm/js/db/notes.js @@ -3,6 +3,7 @@ import { inputNotes, outputNotes, notesScripts, + transactions } from './schema.js'; export async function getOutputNotes( @@ -18,41 +19,8 @@ export async function getOutputNotes( notes = await outputNotes.where('status').equals(status).toArray(); } - // Fetch all scripts from the scripts table for joining - const scripts = await notesScripts.toArray(); - const scriptMap = new Map(scripts.map(script => [script.scriptHash, script.serializedNoteScript])); - - // Process each note to convert 'blobField' from Blob to Uint8Array - const processedNotes = await Promise.all(notes.map(async note => { - const assetsArrayBuffer = await note.assets.arrayBuffer(); - const assetsArray = new Uint8Array(assetsArrayBuffer); - const assetsBase64 = uint8ArrayToBase64(assetsArray); - note.assets = assetsBase64; - - let serializedNoteScriptBase64 = null; - // Parse details JSON and perform a "join" - if (note.details) { - const details = JSON.parse(note.details); - if (details.script_hash) { - let serializedNoteScript = scriptMap.get(details.script_hash); - let serializedNoteScriptArrayBuffer = await serializedNoteScript.arrayBuffer(); - const serializedNoteScriptArray = new Uint8Array(serializedNoteScriptArrayBuffer); - serializedNoteScriptBase64 = uint8ArrayToBase64(serializedNoteScriptArray); - } - } - - return { - assets: note.assets, - details: note.details ? note.details : null, - recipient: note.recipient, - status: note.status, - metadata: note.metadata, - inclusion_proof: note.inclusionProof ? note.inclusionProof : null, - serialized_note_script: serializedNoteScriptBase64 - }; - })); - return processedNotes; - } catch { + return await processOutputNotes(notes); + } catch (err) { console.error("Failed to get input notes: ", err); throw err; } @@ -70,84 +38,38 @@ export async function getInputNotes( } else { notes = await inputNotes.where('status').equals(status).toArray(); } - // Fetch all scripts from the scripts table for joining - const scripts = await notesScripts.toArray(); - const scriptMap = new Map(scripts.map(script => [script.scriptHash, script.serializedNoteScript])); - - // Process each note to convert 'blobField' from Blob to Uint8Array - const processedNotes = await Promise.all(notes.map(async note => { - const assetsArrayBuffer = await note.assets.arrayBuffer(); - const assetsArray = new Uint8Array(assetsArrayBuffer); - const assetsBase64 = uint8ArrayToBase64(assetsArray); - note.assets = assetsBase64; - - let serializedNoteScriptBase64 = null; - // Parse details JSON and perform a "join" - if (note.details) { - const details = JSON.parse(note.details); - if (details.script_hash) { - let serializedNoteScript = scriptMap.get(details.script_hash); - let serializedNoteScriptArrayBuffer = await serializedNoteScript.arrayBuffer(); - const serializedNoteScriptArray = new Uint8Array(serializedNoteScriptArrayBuffer); - serializedNoteScriptBase64 = uint8ArrayToBase64(serializedNoteScriptArray); - } - } - return { - assets: note.assets, - details: note.details, - recipient: note.recipient, - status: note.status, - metadata: note.metadata ? note.metadata : null, - inclusion_proof: note.inclusionProof ? note.inclusionProof : null, - serialized_note_script: serializedNoteScriptBase64 - }; - })); - return processedNotes; - } catch { + return await processInputNotes(notes); + } catch (err) { console.error("Failed to get input notes: ", err); throw err; } } -export async function getInputNote( - noteId +export async function getInputNotesFromIds( + noteIds ) { try { - const note = await inputNotes.get(noteId); - - const assetsArrayBuffer = await note.assets.arrayBuffer(); - const assetsArray = new Uint8Array(assetsArrayBuffer); - const assetsBase64 = uint8ArrayToBase64(assetsArray); - + let notes; - let serializedNoteScriptBase64 = null; - if (note.details) { - const details = JSON.parse(note.details); - if (details.script_hash) { - let noteScriptRecord = await notesScripts.get(details.script_hash); - let serializedNoteScript = noteScriptRecord.serializedNoteScript; - let serializedNoteScriptArrayBuffer = await serializedNoteScript.arrayBuffer(); - let serializedNoteScriptArray = new Uint8Array(serializedNoteScriptArrayBuffer); - serializedNoteScriptBase64 = uint8ArrayToBase64(serializedNoteScriptArray); - } - } + // Fetch the records based on a list of IDs + notes = await inputNotes.where('noteId').anyOf(noteIds).toArray(); - note.assets = assetsBase64 + return await processInputNotes(notes); + } catch (err) { + console.error("Failed to get input notes: ", err); + throw err; + } +} - const data = { - assets: note.assets, - details: note.details, - recipient: note.recipient, - status: note.status, - metadata: note.metadata ? note.metadata : null, - inclusion_proof: note.inclusionProof ? note.inclusionProof : null, - serialized_note_script: serializedNoteScriptBase64 - } +export async function getUnspentInputNoteNullifiers() { + try { + const notes = await db.InputNotes.where('status').equals('Committed').toArray(); + const nullifiers = notes.map(note => JSON.parse(note.details).nullifier); - return data; - } catch { - console.error("Failed to get input note: ", err); + return nullifiers; + } catch (err) { + console.error("Failed to get unspent input note nullifiers: ", err); throw err; } } @@ -176,21 +98,20 @@ export async function insertInputNote( metadata: metadata ? metadata : null, details: details, inclusionProof: inclusionProof ? JSON.stringify(inclusionProof) : null, + consumerTransactionId: null }; // Perform the insert using Dexie await tx.inputNotes.add(data); - const exists = await tx.notesScripts.get(noteScriptHash); - if (!exists) { - let serializedNoteScriptBlob = new Blob([new Uint8Array(serializedNoteScript)]); + let serializedNoteScriptBlob = new Blob([new Uint8Array(serializedNoteScript)]); - const data = { - scriptHash: noteScriptHash, - serializedNoteScript: serializedNoteScriptBlob, - }; - await tx.notesScripts.add(data); - } + const noteScriptData = { + scriptHash: noteScriptHash, + serializedNoteScript: serializedNoteScriptBlob, + }; + + await tx.notesScripts.put(noteScriptData); } catch { console.error(`Error inserting note: ${noteId}:`, error); throw error; // Rethrow the error to handle it further up the call chain if needed @@ -222,6 +143,7 @@ export async function insertOutputNote( metadata: metadata, details: details ? details : null, inclusionProof: inclusionProof ? JSON.stringify(inclusionProof) : null, + consumerTransactionId: null }; // Perform the insert using Dexie @@ -247,18 +169,130 @@ export async function insertOutputNote( }); } -export async function getUnspentInputNoteNullifiers() { +export async function updateNoteConsumerTxId(noteId, consumerTxId) { try { - const notes = await db.InputNotes.where('status').equals('Committed').toArray(); - const nullifiers = notes.map(note => JSON.parse(note.details).nullifier); + // Start a transaction that covers both tables + await db.transaction('rw', inputNotes, outputNotes, async (tx) => { + // Update input_notes where note_id matches + const updatedInputNotes = await tx.inputNotes + .where('noteId') + .equals(noteId) + .modify({ consumerTransactionId: consumerTxId }); - return nullifiers; + // Update output_notes where note_id matches + const updatedOutputNotes = await tx.outputNotes + .where('noteId') + .equals(noteId) + .modify({ consumerTransactionId: consumerTxId }); + + // Log the count of updated entries in both tables (optional) + console.log(`Updated ${updatedInputNotes} input notes and ${updatedOutputNotes} output notes`); + }); } catch (err) { - console.error("Failed to get unspent input note nullifiers: ", err); + console.error("Failed to update note consumer transaction ID: ", err); throw err; } } +async function processInputNotes( + notes +) { + // Fetch all scripts from the scripts table for joining + const scripts = await notesScripts.toArray(); + const scriptMap = new Map(scripts.map(script => [script.scriptHash, script.serializedNoteScript])); + + const transactionRecords = await transactions.toArray(); + const transactionMap = new Map(transactionRecords.map(transaction => [transaction.id, transaction.accountId])); + + const processedNotes = await Promise.all(notes.map(async note => { + // Convert the assets blob to base64 + const assetsArrayBuffer = await note.assets.arrayBuffer(); + const assetsArray = new Uint8Array(assetsArrayBuffer); + const assetsBase64 = uint8ArrayToBase64(assetsArray); + note.assets = assetsBase64; + + // Convert the serialized note script blob to base64 + let serializedNoteScriptBase64 = null; + // Parse details JSON and perform a "join" + if (note.details) { + const details = JSON.parse(note.details); + if (details.script_hash) { + let serializedNoteScript = scriptMap.get(details.script_hash); + let serializedNoteScriptArrayBuffer = await serializedNoteScript.arrayBuffer(); + const serializedNoteScriptArray = new Uint8Array(serializedNoteScriptArrayBuffer); + serializedNoteScriptBase64 = uint8ArrayToBase64(serializedNoteScriptArray); + } + } + + // Perform a "join" with the transactions table + let consumerAccountId = null; + if (transactionMap.has(note.consumerTransactionId)) { + consumerAccountId = transactionMap.get(note.consumerTransactionId); + } + + return { + assets: note.assets, + details: note.details, + recipient: note.recipient, + status: note.status, + metadata: note.metadata ? note.metadata : null, + inclusion_proof: note.inclusionProof ? note.inclusionProof : null, + serialized_note_script: serializedNoteScriptBase64, + consumer_account_id: consumerAccountId + }; + })); + return processedNotes; +} + +async function processOutputNotes( + notes +) { + // Fetch all scripts from the scripts table for joining + const scripts = await notesScripts.toArray(); + const scriptMap = new Map(scripts.map(script => [script.scriptHash, script.serializedNoteScript])); + + const transactionRecords = await transactions.toArray(); + const transactionMap = new Map(transactionRecords.map(transaction => [transaction.id, transaction.accountId])); + + // Process each note to convert 'blobField' from Blob to Uint8Array + const processedNotes = await Promise.all(notes.map(async note => { + const assetsArrayBuffer = await note.assets.arrayBuffer(); + const assetsArray = new Uint8Array(assetsArrayBuffer); + const assetsBase64 = uint8ArrayToBase64(assetsArray); + note.assets = assetsBase64; + + let serializedNoteScriptBase64 = null; + // Parse details JSON and perform a "join" + if (note.details) { + const details = JSON.parse(note.details); + if (details.script_hash) { + let serializedNoteScript = scriptMap.get(details.script_hash); + let serializedNoteScriptArrayBuffer = await serializedNoteScript.arrayBuffer(); + const serializedNoteScriptArray = new Uint8Array(serializedNoteScriptArrayBuffer); + serializedNoteScriptBase64 = uint8ArrayToBase64(serializedNoteScriptArray); + } + } + + // Perform a "join" with the transactions table + let consumerAccountId = null; + if (transactionMap.has(note.consumerTransactionId)) { + consumerAccountId = transactionMap.get(note.consumerTransactionId); + } + + return { + assets: note.assets, + details: note.details ? note.details : null, + recipient: note.recipient, + status: note.status, + metadata: note.metadata, + inclusion_proof: note.inclusionProof ? note.inclusionProof : null, + serialized_note_script: serializedNoteScriptBase64, + consumer_account_id: consumerAccountId + }; + })); + return processedNotes; +} + function uint8ArrayToBase64(bytes) { const binary = bytes.reduce((acc, byte) => acc + String.fromCharCode(byte), ''); return btoa(binary); diff --git a/wasm/js/db/schema.js b/wasm/js/db/schema.js index f8d5ec519..2c1e1cd7f 100644 --- a/wasm/js/db/schema.js +++ b/wasm/js/db/schema.js @@ -49,7 +49,7 @@ db.version(1).stores({ [Table.AccountCode]: indexes('root'), [Table.AccountStorage]: indexes('root'), [Table.AccountVaults]: indexes('root'), - [Table.AccountAuth]: indexes('accountId'), + [Table.AccountAuth]: indexes('accountId', 'pubKey'), [Table.Accounts]: indexes('[id+nonce]', 'codeRoot', 'storageRoot', 'vaultRoot'), [Table.Transactions]: indexes('id'), [Table.TransactionScripts]: indexes('scriptHash'), diff --git a/wasm/js/db/sync.js b/wasm/js/db/sync.js index b6de497b4..e718f7882 100644 --- a/wasm/js/db/sync.js +++ b/wasm/js/db/sync.js @@ -58,8 +58,11 @@ export async function applyStateSync( hasClientNotes, nodeIndices, nodes, - noteIds, - inclusionProofs, + outputNoteIds, + outputNoteInclusionProofs, + inputNoteIds, + inputNoteInluclusionProofs, + inputeNoteMetadatas, transactionIds, ) { return db.transaction('rw', stateSync, inputNotes, outputNotes, transactions, blockHeaders, chainMmrNodes, async (tx) => { @@ -67,7 +70,7 @@ export async function applyStateSync( await updateSpentNotes(tx, nullifiers); await updateBlockHeader(tx, blockNum, blockHeader, chainMmrPeaks, hasClientNotes); await updateChainMmrNodes(tx, nodeIndices, nodes); - await updateCommittedNotes(tx, noteIds, inclusionProofs); + await updateCommittedNotes(tx, outputNoteIds, outputNoteInclusionProofs, inputNoteIds, inputNoteInluclusionProofs, inputeNoteMetadatas); await updateCommittedTransactions(tx, blockNum, transactionIds); }); } @@ -180,27 +183,32 @@ async function updateChainMmrNodes( async function updateCommittedNotes( tx, - noteIds, - inclusionProofs + outputNoteIds, + outputNoteInclusionProofs, + inputNoteIds, + inputNoteInclusionProofs, + inputNoteMetadatas ) { try { - if (noteIds.length !== inclusionProofs.length) { - throw new Error("Arrays noteIds and inclusionProofs must be of the same length"); + if (outputNoteIds.length === 0 || inputNoteIds.length === 0) { + return; } - if (noteIds.length === 0) { - return; + if (outputNoteIds.length !== outputNoteInclusionProofs.length) { + throw new Error("Arrays outputNoteIds and outputNoteInclusionProofs must be of the same length"); } - for (let i = 0; i < noteIds.length; i++) { - const noteId = noteIds[i]; - const inclusionProof = inclusionProofs[i]; + if ( + inputNoteIds.length !== inputNoteInclusionProofs.length && + inputNoteIds.length !== inputNoteMetadatas.length && + inputNoteInclusionProofs.length !== inputNoteMetadatas.length + ) { + throw new Error("Arrays inputNoteIds and inputNoteInclusionProofs and inputNoteMetadatas must be of the same length"); + } - // Update input notes - await tx.inputNotes.where({ noteId: noteId }).modify({ - status: 'Committed', - inclusionProof: inclusionProof - }); + for (let i = 0; i < outputNoteIds.length; i++) { + const noteId = outputNoteIds[i]; + const inclusionProof = outputNoteInclusionProofs[i]; // Update output notes await tx.outputNotes.where({ noteId: noteId }).modify({ @@ -208,6 +216,19 @@ async function updateCommittedNotes( inclusionProof: inclusionProof }); } + + for (let i = 0; i < inputNoteIds.length; i++) { + const noteId = inputNoteIds[i]; + const inclusionProof = inputNoteInclusionProofs[i]; + const metadata = inputNoteMetadatas[i]; + + // Update input notes + await tx.inputNotes.where({ noteId: noteId }).modify({ + status: 'Committed', + inclusionProof: inclusionProof, + metadata: metadata + }); + } } catch (error) { console.error("Error updating committed notes:", error); throw error; diff --git a/wasm/js/db/transactions.js b/wasm/js/db/transactions.js index 6b22c67a6..4b8b6f73b 100644 --- a/wasm/js/db/transactions.js +++ b/wasm/js/db/transactions.js @@ -82,11 +82,11 @@ export async function insertTransactionScript( // check if script hash already exists let record = await transactionScripts.where("scriptHash").equals(scriptHash).first(); - if (record !== undefined) { + if (record) { return; } - if (scriptHash === null) { + if (!scriptHash) { throw new Error("Script hash must be provided"); } @@ -159,13 +159,21 @@ export async function markTransactionsAsCommitted( transactionIds ) { try { - const updates = transactionIds.map(transactionId => ({ - id: transactionId, - commitHeight: blockNum + if (transactionIds.length === 0) { + return; + } + + // Fetch existing records + const existingRecords = await tx.transactions.where('id').anyOf(transactionIds).toArray(); + + // Create updates by merging existing records with the new values + const updates = existingRecords.map(record => ({ + ...record, // Spread existing fields + commitHeight: blockNum // Update specific field })); - const result = await transactions.bulkPut(updates); - return result.length; + // Perform the update + await tx.transactions.bulkPut(updates); } catch (err) { console.error("Failed to mark transactions as committed: ", err); throw err; diff --git a/wasm/src/lib.rs b/wasm/src/lib.rs index aae0f3b0e..2e421cf1e 100644 --- a/wasm/src/lib.rs +++ b/wasm/src/lib.rs @@ -1,6 +1,5 @@ extern crate alloc; -pub mod native_code; pub mod web_client; use wasm_bindgen::prelude::*; diff --git a/wasm/src/native_code/accounts.rs b/wasm/src/native_code/accounts.rs deleted file mode 100644 index bfa72ba21..000000000 --- a/wasm/src/native_code/accounts.rs +++ /dev/null @@ -1,247 +0,0 @@ -use web_sys::console; -use wasm_bindgen::prelude::*; - -use miden_lib::AuthScheme; -use miden_objects::{ - accounts::{ - Account, AccountData, AccountId, AccountStorageType, AccountStub, AccountType, AuthData - }, assets::TokenSymbol, crypto::{ - dsa::rpo_falcon512::SecretKey, - rand::{ - FeltRng, RpoRandomCoin - }, - }, Digest, Felt, Word -}; - -use crate::native_code::store::AuthInfo; -use crate::native_code::errors::ClientError; - -use super::{ - rpc::NodeRpcClient, - Client, - store::Store // TODO: Add AuthInfo -}; - -pub enum AccountTemplate { - BasicWallet { - mutable_code: bool, - storage_mode: AccountStorageMode, - }, - FungibleFaucet { - token_symbol: TokenSymbol, - decimals: u8, - max_supply: u64, - storage_mode: AccountStorageMode, - }, -} - -// TODO: Review this enum and variant names to have a consistent naming across all crates -#[derive(Debug, Clone, Copy)] -pub enum AccountStorageMode { - Local, - OnChain, -} - -impl From for AccountStorageType { - fn from(mode: AccountStorageMode) -> Self { - match mode { - AccountStorageMode::Local => AccountStorageType::OffChain, - AccountStorageMode::OnChain => AccountStorageType::OnChain, - } - } -} - -impl Client { - // ACCOUNT CREATION - // -------------------------------------------------------------------------------------------- - - /// Creates a new [Account] based on an [AccountTemplate] and saves it in the store - pub async fn new_account( - &mut self, - template: AccountTemplate, - ) -> Result<(Account, Word), ClientError> { - let account_and_seed = match template { - AccountTemplate::BasicWallet { - mutable_code, - storage_mode, - } => self.new_basic_wallet(mutable_code,storage_mode).await, - AccountTemplate::FungibleFaucet { - token_symbol, - decimals, - max_supply, - storage_mode, - } => { - self.new_fungible_faucet(token_symbol, decimals, max_supply, storage_mode).await - } - }?; - - Ok(account_and_seed) - } - - /// Saves in the store the [Account] corresponding to `account_data`. - /// - /// # Errors - /// - /// Will return an error if trying to import a new account without providing its seed - /// - /// # Panics - /// - /// Will panic when trying to import a non-new account without a seed since this functionality - /// is not currently implemented - pub async fn import_account( - &mut self, - account_data: AccountData - ) -> Result<(), ClientError> { - match account_data.auth { - AuthData::RpoFalcon512Seed(key_pair_seed) => { - // NOTE: The seed should probably come from a different format from miden-base's AccountData - let seed = Digest::try_from(&key_pair_seed).unwrap().into(); - let mut rng = RpoRandomCoin::new(seed); - - let key_pair = SecretKey::with_rng(&mut rng); - - let account_seed = if !account_data.account.is_new() - && account_data.account_seed.is_some() - { - tracing::warn!("Imported an existing account and still provided a seed when it is not needed. It's possible that the account's file was incorrectly generated. The seed will be ignored."); - // Ignore the seed since it's not a new account - - // TODO: The alternative approach to this is to store the seed anyway, but - // ignore it at the point of executing against this transaction, but that - // approach seems a little bit more incorrect - None - } else { - account_data.account_seed - }; - - self.insert_account( - &account_data.account, - account_seed, - &AuthInfo::RpoFalcon512(key_pair), - ).await - }, - } - } - - /// Creates a new regular account and saves it in the store along with its seed and auth data - async fn new_basic_wallet( - &mut self, - mutable_code: bool, - account_storage_mode: AccountStorageMode, - ) -> Result<(Account, Word), ClientError> { - let key_pair = SecretKey::with_rng(&mut self.rng); - - let auth_scheme: AuthScheme = AuthScheme::RpoFalcon512 { pub_key: key_pair.public_key() }; - - // we need to use an initial seed to create the wallet account - let mut init_seed = [0u8; 32]; - self.rng.fill_bytes(&mut init_seed); - - let (account, seed) = if !mutable_code { - miden_lib::accounts::wallets::create_basic_wallet( - init_seed, - auth_scheme, - AccountType::RegularAccountImmutableCode, - account_storage_mode.into(), - ) - } else { - miden_lib::accounts::wallets::create_basic_wallet( - init_seed, - auth_scheme, - AccountType::RegularAccountUpdatableCode, - account_storage_mode.into(), - ) - }?; - - self.insert_account(&account, Some(seed), &AuthInfo::RpoFalcon512(key_pair)).await?; - - Ok((account, seed)) - } - - async fn new_fungible_faucet( - &mut self, - token_symbol: TokenSymbol, - decimals: u8, - max_supply: u64, - account_storage_mode: AccountStorageMode, - ) -> Result<(Account, Word), ClientError> { - let key_pair = SecretKey::with_rng(&mut self.rng); - - let auth_scheme: AuthScheme = AuthScheme::RpoFalcon512 { pub_key: key_pair.public_key() }; - - // we need to use an initial seed to create the wallet account - let mut init_seed = [0u8; 32]; - self.rng.fill_bytes(&mut init_seed); - - let (account, seed) = miden_lib::accounts::faucets::create_basic_fungible_faucet( - init_seed, - token_symbol, - decimals, - Felt::try_from(max_supply.to_le_bytes().as_slice()) - .expect("u64 can be safely converted to a field element"), - account_storage_mode.into(), - auth_scheme, - )?; - - self.insert_account(&account, Some(seed), &AuthInfo::RpoFalcon512(key_pair)).await?; - Ok((account, seed)) - } - - /// Inserts a new account into the client's store. - /// - /// # Errors - /// - /// If an account is new and no seed is provided, the function errors out because the client - /// cannot execute transactions against new accounts for which it does not know the seed. - pub async fn insert_account( - &mut self, - account: &Account, - account_seed: Option, - auth_info: &AuthInfo, - ) -> Result<(), ClientError> { - if account.is_new() && account_seed.is_none() { - return Err(ClientError::ImportNewAccountWithoutSeed); - } - - self.store - .insert_account(account, account_seed, auth_info).await - .map_err(ClientError::StoreError) - } - - // ACCOUNT DATA RETRIEVAL - // -------------------------------------------------------------------------------------------- - - /// Returns summary info about the accounts managed by this client. - pub async fn get_accounts(&self) -> Result)>, ClientError> { - self.store.get_account_stubs().await.map_err(|err| err.into()) - } - - /// Returns summary info about the specified account. - pub async fn get_account( - &self, - account_id: AccountId - ) -> Result<(Account, Option), ClientError> { - self.store.get_account(account_id).await.map_err(|err| err.into()) - } - - /// Returns summary info about the specified account. - pub async fn get_account_stub_by_id( - &self, - account_id: AccountId, - ) -> Result<(AccountStub, Option), ClientError> { - self.store.get_account_stub(account_id).await.map_err(|err| err.into()) - } - - /// Returns an [AuthInfo] object utilized to authenticate an account. - /// - /// # Errors - /// - /// Returns a [ClientError::StoreError] with a [StoreError::AccountDataNotFound](crate::errors::StoreError::AccountDataNotFound) if the provided ID does - /// not correspond to an existing account. - pub async fn get_account_auth( - &self, - account_id: AccountId - ) -> Result { - self.store.get_account_auth(account_id).await.map_err(|err| err.into()) - } -} diff --git a/wasm/src/native_code/chain_data.rs b/wasm/src/native_code/chain_data.rs deleted file mode 100644 index dc250bb3b..000000000 --- a/wasm/src/native_code/chain_data.rs +++ /dev/null @@ -1,14 +0,0 @@ -use miden_objects::{crypto::rand::FeltRng, BlockHeader}; - -use super::{ - errors::ClientError, rpc::NodeRpcClient, store::Store, Client // TODO: Add AuthInfo -}; - -impl Client { - pub async fn get_block_headers( - &self, - block_numbers: &[u32], - ) -> Result, ClientError> { - self.store.get_block_headers(block_numbers).await.map_err(ClientError::StoreError) - } -} \ No newline at end of file diff --git a/wasm/src/native_code/errors.rs b/wasm/src/native_code/errors.rs deleted file mode 100644 index d6a1526f8..000000000 --- a/wasm/src/native_code/errors.rs +++ /dev/null @@ -1,481 +0,0 @@ -use core::fmt; - -use miden_objects::{ - accounts::AccountId, crypto::merkle::MmrError, notes::NoteId, AccountError, AssetError, - AssetVaultError, Digest, NoteError, TransactionScriptError, -}; -use miden_tx::{ - utils::{DeserializationError, HexParseError}, - DataStoreError, TransactionExecutorError, TransactionProverError, -}; - -use std::any::type_name; - -use miden_objects::crypto::merkle::{SmtLeafError, SmtProofError}; -use thiserror::Error; - -#[derive(Debug, Clone, PartialEq, Error)] -pub enum ConversionError { - #[error("Hex error: {0}")] - HexError(#[from] hex::FromHexError), - #[error("SMT leaf error: {0}")] - SmtLeafError(#[from] SmtLeafError), - #[error("SMT proof error: {0}")] - SmtProofError(#[from] SmtProofError), - #[error("Too much data, expected {expected}, got {got}")] - TooMuchData { expected: usize, got: usize }, - #[error("Not enough data, expected {expected}, got {got}")] - InsufficientData { expected: usize, got: usize }, - #[error("Value is not in the range 0..MODULUS")] - NotAValidFelt, - #[error("Field `{field_name}` required to be filled in protobuf representation of {entity}")] - MissingFieldInProtobufRepresentation { - entity: &'static str, - field_name: &'static str, - }, -} - -impl Eq for ConversionError {} - -pub trait MissingFieldHelper { - fn missing_field(field_name: &'static str) -> ConversionError; -} - -impl MissingFieldHelper for T { - fn missing_field(field_name: &'static str) -> ConversionError { - ConversionError::MissingFieldInProtobufRepresentation { - entity: type_name::(), - field_name, - } - } -} - -// CLIENT ERROR -// ================================================================================================ - -#[derive(Debug)] -pub enum ClientError { - AccountError(AccountError), - AssetError(AssetError), - DataDeserializationError(DeserializationError), - HexParseError(HexParseError), - ImportNewAccountWithoutSeed, - MissingOutputNotes(Vec), - NoteError(NoteError), - NoConsumableNoteForAccount(AccountId), - NodeRpcClientError(NodeRpcClientError), - ScreenerError(ScreenerError), - StoreError(StoreError), - TransactionExecutionError(TransactionExecutorError), - TransactionProvingError(TransactionProverError), -} - -impl fmt::Display for ClientError { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - match self { - ClientError::AccountError(err) => write!(f, "account error: {err}"), - ClientError::DataDeserializationError(err) => { - write!(f, "data deserialization error: {err}") - }, - ClientError::AssetError(err) => write!(f, "asset error: {err}"), - ClientError::HexParseError(err) => write!(f, "error turning array to Digest: {err}"), - ClientError::ImportNewAccountWithoutSeed => write!( - f, - "import account error: can't import a new account without its initial seed" - ), - ClientError::MissingOutputNotes(note_ids) => { - write!( - f, - "transaction error: The transaction did not produce expected Note IDs: {}", - note_ids.iter().map(|&id| id.to_hex()).collect::>().join(", ") - ) - }, - ClientError::NoConsumableNoteForAccount(account_id) => { - write!(f, "No consumable note for account ID {}", account_id) - }, - ClientError::NoteError(err) => write!(f, "note error: {err}"), - ClientError::NodeRpcClientError(err) => write!(f, "rpc api error: {err}"), - ClientError::ScreenerError(err) => write!(f, "note screener error: {err}"), - ClientError::StoreError(err) => write!(f, "store error: {err}"), - ClientError::TransactionExecutionError(err) => { - write!(f, "transaction executor error: {err}") - }, - ClientError::TransactionProvingError(err) => { - write!(f, "transaction prover error: {err}") - }, - } - } -} - -// CONVERSIONS -// ================================================================================================ - -impl From for ClientError { - fn from(err: AccountError) -> Self { - Self::AccountError(err) - } -} - -impl From for ClientError { - fn from(err: DeserializationError) -> Self { - Self::DataDeserializationError(err) - } -} - -impl From for ClientError { - fn from(err: HexParseError) -> Self { - Self::HexParseError(err) - } -} - -impl From for ClientError { - fn from(err: NoteError) -> Self { - Self::NoteError(err) - } -} - -impl From for ClientError { - fn from(err: NodeRpcClientError) -> Self { - Self::NodeRpcClientError(err) - } -} - -impl From for ClientError { - fn from(err: StoreError) -> Self { - Self::StoreError(err) - } -} - -impl From for ClientError { - fn from(err: TransactionExecutorError) -> Self { - Self::TransactionExecutionError(err) - } -} - -impl From for ClientError { - fn from(err: TransactionProverError) -> Self { - Self::TransactionProvingError(err) - } -} - -impl From for ClientError { - fn from(err: ScreenerError) -> Self { - Self::ScreenerError(err) - } -} - -impl From for String { - fn from(err: ClientError) -> String { - err.to_string() - } -} - -#[cfg(feature = "std")] -impl std::error::Error for ClientError {} - -// STORE ERROR -// ================================================================================================ - -#[derive(Debug)] -pub enum StoreError { - AssetVaultError(AssetVaultError), - AccountCodeDataNotFound(Digest), - AccountDataNotFound(AccountId), - AccountError(AccountError), - AccountHashMismatch(AccountId), - AccountStorageNotFound(Digest), - BlockHeaderNotFound(u32), - ChainMmrNodeNotFound(u64), - DatabaseError(String), - DataDeserializationError(DeserializationError), - HexParseError(HexParseError), - InputNoteNotFound(NoteId), - InputSerializationError(serde_json::Error), - JsonDataDeserializationError(serde_json::Error), - MmrError(MmrError), - NoteInclusionProofError(NoteError), - NoteTagAlreadyTracked(u64), - ParsingError(String), - QueryError(String), - TransactionScriptError(TransactionScriptError), - VaultDataNotFound(Digest), -} - -impl From for StoreError { - fn from(value: AssetVaultError) -> Self { - StoreError::AssetVaultError(value) - } -} - -impl From for StoreError { - fn from(value: AccountError) -> Self { - StoreError::AccountError(value) - } -} - -impl From for StoreError { - fn from(value: DeserializationError) -> Self { - StoreError::DataDeserializationError(value) - } -} - -impl From for StoreError { - fn from(value: HexParseError) -> Self { - StoreError::HexParseError(value) - } -} - -impl From for StoreError { - fn from(value: MmrError) -> Self { - StoreError::MmrError(value) - } -} - -impl From for StoreError { - fn from(value: NoteError) -> Self { - StoreError::NoteInclusionProofError(value) - } -} - -impl From for StoreError { - fn from(value: TransactionScriptError) -> Self { - StoreError::TransactionScriptError(value) - } -} - -impl fmt::Display for StoreError { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - use StoreError::*; - match self { - AssetVaultError(err) => { - write!(f, "asset vault with root {} not found", err) - }, - AccountCodeDataNotFound(root) => { - write!(f, "account code data with root {} not found", root) - }, - AccountDataNotFound(account_id) => { - write!(f, "Account data was not found for Account Id {account_id}") - }, - AccountError(err) => write!(f, "error instantiating Account: {err}"), - AccountHashMismatch(account_id) => { - write!(f, "account hash mismatch for account {account_id}") - }, - AccountStorageNotFound(root) => { - write!(f, "account storage data with root {} not found", root) - }, - BlockHeaderNotFound(block_number) => { - write!(f, "block header for block {} not found", block_number) - }, - ChainMmrNodeNotFound(node_index) => { - write!(f, "chain mmr node at index {} not found", node_index) - }, - DatabaseError(err) => write!(f, "database-related non-query error: {err}"), - DataDeserializationError(err) => { - write!(f, "error deserializing data from the store: {err}") - }, - HexParseError(err) => { - write!(f, "error parsing hex: {err}") - }, - InputNoteNotFound(note_id) => { - write!(f, "input note with note id {} not found", note_id.inner()) - }, - InputSerializationError(err) => { - write!(f, "error trying to serialize inputs for the store: {err}") - }, - JsonDataDeserializationError(err) => { - write!(f, "error deserializing data from JSON from the store: {err}") - }, - MmrError(err) => write!(f, "error constructing mmr: {err}"), - NoteTagAlreadyTracked(tag) => write!(f, "note tag {} is already being tracked", tag), - NoteInclusionProofError(error) => { - write!(f, "inclusion proof creation error: {}", error) - }, - ParsingError(err) => { - write!(f, "failed to parse data retrieved from the database: {err}") - }, - QueryError(err) => write!(f, "failed to retrieve data from the database: {err}"), - TransactionScriptError(err) => { - write!(f, "error instantiating transaction script: {err}") - }, - VaultDataNotFound(root) => write!(f, "account vault data for root {} not found", root), - } - } -} - -impl From for DataStoreError { - fn from(value: StoreError) -> Self { - match value { - StoreError::AccountDataNotFound(account_id) => { - DataStoreError::AccountNotFound(account_id) - }, - StoreError::BlockHeaderNotFound(block_num) => DataStoreError::BlockNotFound(block_num), - StoreError::InputNoteNotFound(note_id) => DataStoreError::NoteNotFound(note_id), - err => DataStoreError::InternalError(err.to_string()), - } - } -} - -#[cfg(feature = "std")] -impl std::error::Error for StoreError {} - -// API CLIENT ERROR -// ================================================================================================ - -#[derive(Debug)] -pub enum NodeRpcClientError { - ConnectionError(String), - ConversionFailure(String), - DeserializationError(DeserializationError), - ExpectedFieldMissing(String), - InvalidAccountReceived(String), - NoteError(NoteError), - RequestError(String, String), -} - -impl fmt::Display for NodeRpcClientError { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - match self { - NodeRpcClientError::ConnectionError(err) => { - write!(f, "failed to connect to the API server: {err}") - }, - NodeRpcClientError::ConversionFailure(err) => { - write!(f, "failed to convert RPC data: {err}") - }, - NodeRpcClientError::DeserializationError(err) => { - write!(f, "failed to deserialize RPC data: {err}") - }, - NodeRpcClientError::ExpectedFieldMissing(err) => { - write!(f, "rpc API response missing an expected field: {err}") - }, - NodeRpcClientError::InvalidAccountReceived(account_error) => { - write!(f, "rpc API response contained an invalid account: {account_error}") - }, - NodeRpcClientError::NoteError(err) => { - write!(f, "rpc API note failed to validate: {err}") - }, - NodeRpcClientError::RequestError(endpoint, err) => { - write!(f, "rpc request failed for {endpoint}: {err}") - }, - } - } -} - -impl From for NodeRpcClientError { - fn from(err: AccountError) -> Self { - Self::InvalidAccountReceived(err.to_string()) - } -} - -impl From for NodeRpcClientError { - fn from(err: DeserializationError) -> Self { - Self::DeserializationError(err) - } -} - -impl From for NodeRpcClientError { - fn from(err: NoteError) -> Self { - Self::NoteError(err) - } -} - -impl From for NodeRpcClientError { - fn from(err: ConversionError) -> Self { - Self::ConversionFailure(err.to_string()) - } -} - -// NOTE ID PREFIX FETCH ERROR -// ================================================================================================ - -/// Error when Looking for a specific note ID from a partial ID -#[derive(Debug, Eq, PartialEq)] -pub enum NoteIdPrefixFetchError { - NoMatch(String), - MultipleMatches(String), -} - -impl fmt::Display for NoteIdPrefixFetchError { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - match self { - NoteIdPrefixFetchError::NoMatch(note_id) => { - write!(f, "No matches were found with the input prefix {note_id}.") - }, - NoteIdPrefixFetchError::MultipleMatches(note_id) => { - write!( - f, - "found more than one note for the provided ID {note_id} and only one match is expected." - ) - }, - } - } -} - -// NOTE SCREENER ERROR -// ================================================================================================ - -/// Error when screening notes to check relevance to a client -#[derive(Debug)] -pub enum ScreenerError { - InvalidNoteInputsError(InvalidNoteInputsError), - StoreError(StoreError), -} - -impl From for ScreenerError { - fn from(error: InvalidNoteInputsError) -> Self { - Self::InvalidNoteInputsError(error) - } -} - -impl From for ScreenerError { - fn from(error: StoreError) -> Self { - Self::StoreError(error) - } -} - -impl fmt::Display for ScreenerError { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - match self { - ScreenerError::InvalidNoteInputsError(note_inputs_err) => { - write!(f, "error while processing note inputs: {note_inputs_err}") - }, - ScreenerError::StoreError(store_error) => { - write!(f, "error while fetching data from the store: {store_error}") - }, - } - } -} - -#[derive(Debug)] -pub enum InvalidNoteInputsError { - AccountError(NoteId, AccountError), - AssetError(NoteId, AssetError), - NumInputsError(NoteId, usize), - BlockNumberError(NoteId, u64), -} - -impl fmt::Display for InvalidNoteInputsError { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - match self { - InvalidNoteInputsError::AccountError(note_id, account_error) => { - write!(f, "account error for note with ID {}: {account_error}", note_id.to_hex()) - }, - InvalidNoteInputsError::AssetError(note_id, asset_error) => { - write!(f, "asset error for note with ID {}: {asset_error}", note_id.to_hex()) - }, - InvalidNoteInputsError::NumInputsError(note_id, expected_num_inputs) => { - write!( - f, - "expected {expected_num_inputs} note inputs for note with ID {}", - note_id.to_hex() - ) - }, - InvalidNoteInputsError::BlockNumberError(note_id, read_height) => { - write!( - f, - "note input representing block with value {read_height} for note with ID {}", - note_id.to_hex() - ) - }, - } - } -} diff --git a/wasm/src/native_code/mod.rs b/wasm/src/native_code/mod.rs deleted file mode 100644 index 4fdc910f8..000000000 --- a/wasm/src/native_code/mod.rs +++ /dev/null @@ -1,64 +0,0 @@ - -use miden_objects::{ - crypto::rand::{FeltRng, RpoRandomCoin}, - Felt -}; -use miden_tx::TransactionExecutor; -use rand::{rngs::StdRng, Rng, SeedableRng}; - -pub mod accounts; -pub mod notes; -pub mod transactions; -pub mod sync; -pub mod chain_data; -pub mod utils; -pub mod errors; -pub mod note_screener; - -pub mod store; -use store::Store; - -pub mod rpc; -use rpc::NodeRpcClient; - -use self::store::data_store::ClientDataStore; - -// Hoping that eventually we can use the generic store type defined in client/mod.rs. -// For now, wanted to play around with creating a client with a WebStore implementation -// (instead of a SQLite implementation) and getting an underlying store method to execute -// in the browser. - -// TODO: Remove pub from store field -// TODO: Add back generic type for NodeRpcClient and get example working in browser -// TODO: Add back generic type for DataStore and get example working in browser -pub struct Client { - pub store: S, - pub rng: R, - pub rpc_api: N, - pub tx_executor: TransactionExecutor> -} - -impl Client { - pub fn new( - api: N, - rng: R, - store: S, - executor_store: S - ) -> Self { - Self { - store: store, - rng: rng, - rpc_api: api, - tx_executor: TransactionExecutor::new(ClientDataStore::new(executor_store)) - } - } -} - -/// Gets [RpoRandomCoin] from the client -pub fn get_random_coin() -> RpoRandomCoin { - // TODO: Initialize coin status once along with the client and persist status for retrieval - let mut rng = StdRng::from_entropy(); - let coin_seed: [u64; 4] = rng.gen(); - - RpoRandomCoin::new(coin_seed.map(Felt::new)) -} \ No newline at end of file diff --git a/wasm/src/native_code/note_screener.rs b/wasm/src/native_code/note_screener.rs deleted file mode 100644 index b27ac1258..000000000 --- a/wasm/src/native_code/note_screener.rs +++ /dev/null @@ -1,239 +0,0 @@ -use std::collections::BTreeSet; - -use miden_objects::{accounts::AccountId, assets::Asset, notes::Note, Word}; - -use crate::native_code::{ - store::Store, - errors::{InvalidNoteInputsError, ScreenerError} -}; - -// KNOWN SCRIPT ROOTS -// -------------------------------------------------------------------------------------------- -pub(crate) const P2ID_NOTE_SCRIPT_ROOT: &str = - "0xcdfd70344b952980272119bc02b837d14c07bbfc54f86a254422f39391b77b35"; -pub(crate) const P2IDR_NOTE_SCRIPT_ROOT: &str = - "0x41e5727b99a12b36066c09854d39d64dd09d9265c442a9be3626897572bf1745"; -pub(crate) const SWAP_NOTE_SCRIPT_ROOT: &str = - "0x5852920f88985b651cf7ef5e48623f898b6c292f4a2c25dd788ff8b46dd90417"; - -#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord)] -pub enum NoteRelevance { - /// The note can be consumed at any time. - Always, - /// The note can be consumed after the block with the specified number. - After(u32), -} - -pub struct NoteScreener<'a, S: Store> { - store: &'a S, -} - -impl<'a, S: Store> NoteScreener<'a, S> { - pub fn new(store: &'a S) -> Self { - Self { store } - } - - /// Returns a vector of tuples describing the relevance of the provided note to the - /// accounts monitored by this screener. - /// - /// Does a fast check for known scripts (P2ID, P2IDR, SWAP). We're currently - /// unable to execute notes that are not committed so a slow check for other scripts is currently - /// not available. - pub async fn check_relevance( - &self, - note: &Note, - ) -> Result, ScreenerError> { - let account_ids = BTreeSet::from_iter(self.store.get_account_ids().await.unwrap()); - - let script_hash = note.script().hash().to_string(); - let note_relevance = match script_hash.as_str() { - P2ID_NOTE_SCRIPT_ROOT => Self::check_p2id_relevance(note, &account_ids)?, - P2IDR_NOTE_SCRIPT_ROOT => Self::check_p2idr_relevance(note, &account_ids)?, - SWAP_NOTE_SCRIPT_ROOT => self.check_swap_relevance(note, &account_ids).await.unwrap(), - _ => self.check_script_relevance(note, &account_ids)?, - }; - - Ok(note_relevance) - } - - fn check_p2id_relevance( - note: &Note, - account_ids: &BTreeSet, - ) -> Result, ScreenerError> { - let mut note_inputs_iter = note.inputs().values().iter(); - let account_id_felt = note_inputs_iter - .next() - .ok_or(InvalidNoteInputsError::NumInputsError(note.id(), 1))?; - - if note_inputs_iter.next().is_some() { - return Err(InvalidNoteInputsError::NumInputsError(note.id(), 1).into()); - } - - let account_id = AccountId::try_from(*account_id_felt) - .map_err(|err| InvalidNoteInputsError::AccountError(note.id(), err))?; - - if !account_ids.contains(&account_id) { - return Ok(vec![]); - } - Ok(vec![(account_id, NoteRelevance::Always)]) - } - - fn check_p2idr_relevance( - note: &Note, - account_ids: &BTreeSet, - ) -> Result, ScreenerError> { - let mut note_inputs_iter = note.inputs().values().iter(); - let account_id_felt = note_inputs_iter - .next() - .ok_or(InvalidNoteInputsError::NumInputsError(note.id(), 2))?; - let recall_height_felt = note_inputs_iter - .next() - .ok_or(InvalidNoteInputsError::NumInputsError(note.id(), 2))?; - - if note_inputs_iter.next().is_some() { - return Err(InvalidNoteInputsError::NumInputsError(note.id(), 2).into()); - } - - let sender = note.metadata().sender(); - let recall_height: u32 = recall_height_felt.as_int().try_into().map_err(|_err| { - InvalidNoteInputsError::BlockNumberError(note.id(), recall_height_felt.as_int()) - })?; - - let account_id = AccountId::try_from(*account_id_felt) - .map_err(|err| InvalidNoteInputsError::AccountError(note.id(), err))?; - - Ok(vec![ - (account_id, NoteRelevance::Always), - (sender, NoteRelevance::After(recall_height)), - ] - .into_iter() - .filter(|(account_id, _relevance)| account_ids.contains(account_id)) - .collect()) - } - - /// Checks if a swap note can be consumed by any account whose id is in `account_ids` - /// - /// This implementation serves as a placeholder as we're currently not able to create, execute - /// and send SWAP NOTES. Hence, it's also untested. The main logic should be the same: for each - /// account check if it has enough of the wanted asset. - /// This is also very inefficient as we're loading the full accounts. We should instead just - /// load the account's vaults, or even have a function in the `Store` to do this. - /// - /// TODO: test/revisit this in the future - async fn check_swap_relevance( - &self, - note: &Note, - account_ids: &BTreeSet, - ) -> Result, ScreenerError> { - let note_inputs = note.inputs().to_vec(); - if note_inputs.len() != 9 { - return Ok(Vec::new()); - } - - // get the demanded asset from the note's inputs - let asset: Asset = - Word::from([note_inputs[4], note_inputs[5], note_inputs[6], note_inputs[7]]) - .try_into() - .map_err(|err| InvalidNoteInputsError::AssetError(note.id(), err))?; - let asset_faucet_id = AccountId::try_from(asset.vault_key()[3]) - .map_err(|err| InvalidNoteInputsError::AccountError(note.id(), err))?; - - let mut accounts_with_relevance = Vec::new(); - - for account_id in account_ids { - let (account, _) = self.store.get_account(*account_id).await.unwrap(); - - // Check that the account can cover the demanded asset - match asset { - Asset::NonFungible(_non_fungible_asset) - if account.vault().has_non_fungible_asset(asset).expect( - "Should be able to query has_non_fungible_asset for an Asset::NonFungible", - ) => - { - accounts_with_relevance.push((*account_id, NoteRelevance::Always)) - }, - Asset::Fungible(fungible_asset) - if account - .vault() - .get_balance(asset_faucet_id) - .expect("Should be able to query get_balance for an Asset::Fungible") - >= fungible_asset.amount() => - { - accounts_with_relevance.push((*account_id, NoteRelevance::Always)) - }, - _ => {}, - } - } - - Ok(accounts_with_relevance) - } - - fn check_script_relevance( - &self, - _note: &Note, - account_ids: &BTreeSet, - ) -> Result, ScreenerError> { - // TODO: try to execute the note script against relevant accounts; this will - // require querying data from the store - Ok(account_ids - .iter() - .map(|account_id| (*account_id, NoteRelevance::Always)) - .collect()) - } -} - -// #[cfg(test)] -// mod tests { -// use miden_lib::notes::{create_p2id_note, create_p2idr_note, create_swap_note}; -// use miden_objects::{ -// accounts::{AccountId, ACCOUNT_ID_FUNGIBLE_FAUCET_OFF_CHAIN}, -// assets::FungibleAsset, -// crypto::rand::RpoRandomCoin, -// notes::NoteType, -// }; - -// use crate::native_code::note_screener::{ -// P2IDR_NOTE_SCRIPT_ROOT, P2ID_NOTE_SCRIPT_ROOT, SWAP_NOTE_SCRIPT_ROOT, -// }; - -// // We need to make sure the script roots we use for filters are in line with the note scripts -// // coming from Miden objects -// #[test] -// fn ensure_correct_script_roots() { -// // create dummy data for the notes -// let faucet_id: AccountId = ACCOUNT_ID_FUNGIBLE_FAUCET_OFF_CHAIN.try_into().unwrap(); -// let account_id: AccountId = ACCOUNT_ID_FUNGIBLE_FAUCET_OFF_CHAIN.try_into().unwrap(); -// let rng = RpoRandomCoin::new(Default::default()); - -// // create dummy notes to compare note script roots -// let p2id_note = create_p2id_note( -// account_id, -// account_id, -// vec![FungibleAsset::new(faucet_id, 100u64).unwrap().into()], -// NoteType::OffChain, -// rng, -// ) -// .unwrap(); -// let p2idr_note = create_p2idr_note( -// account_id, -// account_id, -// vec![FungibleAsset::new(faucet_id, 100u64).unwrap().into()], -// NoteType::OffChain, -// 10, -// rng, -// ) -// .unwrap(); -// let (swap_note, _serial_num) = create_swap_note( -// account_id, -// FungibleAsset::new(faucet_id, 100u64).unwrap().into(), -// FungibleAsset::new(faucet_id, 100u64).unwrap().into(), -// NoteType::OffChain, -// rng, -// ) -// .unwrap(); - -// assert_eq!(p2id_note.script().hash().to_string(), P2ID_NOTE_SCRIPT_ROOT); -// assert_eq!(p2idr_note.script().hash().to_string(), P2IDR_NOTE_SCRIPT_ROOT); -// assert_eq!(swap_note.script().hash().to_string(), SWAP_NOTE_SCRIPT_ROOT); -// } -// } diff --git a/wasm/src/native_code/notes.rs b/wasm/src/native_code/notes.rs deleted file mode 100644 index c9eef53b4..000000000 --- a/wasm/src/native_code/notes.rs +++ /dev/null @@ -1,33 +0,0 @@ -use miden_objects::{crypto::rand::FeltRng, notes::NoteId}; - -use crate::native_code::store::NoteFilter; - -use super::{ - errors::ClientError, - rpc::NodeRpcClient, - store::{note_record::InputNoteRecord, Store}, - Client -}; - -impl Client { - // INPUT NOTE DATA RETRIEVAL - // -------------------------------------------------------------------------------------------- - - /// Returns input notes managed by this client. - pub async fn get_input_notes(&self,filter: NoteFilter) -> Result, ClientError> { - self.store.get_input_notes(filter).await.map_err(|err| err.into()) - } - - /// Returns the input note with the specified hash. - pub async fn get_input_note(&self,note_id: NoteId,) -> Result { - self.store.get_input_note(note_id).await.map_err(|err| err.into()) - } - - // INPUT NOTE CREATION - // -------------------------------------------------------------------------------------------- - - /// Imports a new input note into the client's store. - pub async fn import_input_note(&mut self, note: InputNoteRecord) -> Result<(), ClientError> { - self.store.insert_input_note(¬e).await.map_err(|err| err.into()) - } -} \ No newline at end of file diff --git a/wasm/src/native_code/rpc/mod.rs b/wasm/src/native_code/rpc/mod.rs deleted file mode 100644 index e1cf98a85..000000000 --- a/wasm/src/native_code/rpc/mod.rs +++ /dev/null @@ -1,194 +0,0 @@ -use async_trait::async_trait; -use core::fmt; -use wasm_bindgen::prelude::*; - -use miden_objects::{ - accounts::{Account, AccountId}, - crypto::merkle::{MerklePath, MmrDelta}, - notes::{Note, NoteId, NoteMetadata, NoteTag}, - transaction::ProvenTransaction, - BlockHeader, Digest, -}; - -use crate::native_code::errors::NodeRpcClientError; - -// NOTE DETAILS -// ================================================================================================ - -/// Describes the possible responses from the `GetNotesById` endpoint for a single note -pub enum NoteDetails { - OffChain(NoteId, NoteMetadata, NoteInclusionDetails), - Public(Note, NoteInclusionDetails), -} - -/// Contains information related to the note inclusion, but not related to the block header -/// that contains the note -pub struct NoteInclusionDetails { - pub block_num: u32, - pub note_index: u32, - pub merkle_path: MerklePath, -} - -impl NoteInclusionDetails { - pub fn new(block_num: u32, note_index: u32, merkle_path: MerklePath) -> Self { - Self { block_num, note_index, merkle_path } - } -} - -// NODE RPC CLIENT TRAIT -// ================================================================================================ - -/// Defines the interface for communicating with the Miden node. -/// -/// The implementers are responsible for connecting to the Miden node, handling endpoint -/// requests/responses, and translating responses into domain objects relevant for each of the -/// endpoints. -#[async_trait(?Send)] -pub trait NodeRpcClient { - // Test RPC method to be implemented by the client - async fn test_rpc(&mut self) -> Result<(), JsValue>; - - /// Given a Proven Transaction, send it to the node for it to be included in a future block - /// using the `/SubmitProvenTransaction` rpc endpoint - async fn submit_proven_transaction( - &mut self, - proven_transaction: ProvenTransaction, - ) -> Result<(), NodeRpcClientError>; - - /// Given a block number, fetches the block header corresponding to that height from the node - /// using the `/GetBlockHeaderByNumber` endpoint - /// - /// When `None` is provided, returns info regarding the latest block - async fn get_block_header_by_number( - &mut self, - block_number: Option, - ) -> Result; - - /// Fetches note-related data for a list of [NoteId] using the `/GetNotesById` rpc endpoint - /// - /// For any NoteType::Offchain note, the return data is only the [NoteMetadata], whereas - /// for NoteType::Onchain notes, the return data includes all details. - async fn get_notes_by_id( - &mut self, - note_ids: &[NoteId], - ) -> Result, NodeRpcClientError>; - - /// Fetches info from the node necessary to perform a state sync using the - /// `/SyncState` rpc endpoint - /// - /// - `block_num` is the last block number known by the client. The returned [StateSyncInfo] - /// should contain data starting from the next block, until the first block which contains a - /// note of matching the requested tag, or the chain tip if there are no notes. - /// - `account_ids` is a list of account ids and determines the accounts the client is interested - /// in and should receive account updates of. - /// - `note_tags` is a list of tags used to filter the notes the client is interested in, which - /// serves as a "note group" filter. Notice that you can't filter by a specific note id - /// - `nullifiers_tags` similar to `note_tags`, is a list of tags used to filter the nullifiers - /// corresponding to some notes the client is interested in - async fn sync_state( - &mut self, - block_num: u32, - account_ids: &[AccountId], - note_tags: &[NoteTag], - nullifiers_tags: &[u16], - ) -> Result; - - /// Fetches the current state of an account from the node using the `/GetAccountDetails` rpc endpoint - /// - /// - `account_id` is the id of the wanted account. - async fn get_account_update( - &mut self, - account_id: AccountId, - ) -> Result; -} - -// STATE SYNC INFO -// ================================================================================================ - -/// Represents a `SyncStateResponse` with fields converted into domain types -pub struct StateSyncInfo { - /// The block number of the chain tip at the moment of the response - pub chain_tip: u32, - /// The returned block header - pub block_header: BlockHeader, - /// MMR delta that contains data for (current_block.num, incoming_block_header.num-1) - pub mmr_delta: MmrDelta, - /// Tuples of AccountId alongside their new account hashes - pub account_hash_updates: Vec<(AccountId, Digest)>, - /// List of tuples of Note ID, Note Index and Merkle Path for all new notes - pub note_inclusions: Vec, - /// List of nullifiers that identify spent notes - pub nullifiers: Vec, -} - -// COMMITTED NOTE -// ================================================================================================ - -/// Represents a committed note, returned as part of a `SyncStateResponse` -pub struct CommittedNote { - /// Note ID of the committed note - note_id: NoteId, - /// Note index for the note merkle tree - note_index: u32, - /// Merkle path for the note merkle tree up to the block's note root - merkle_path: MerklePath, - /// Note metadata - metadata: NoteMetadata, -} - -impl CommittedNote { - pub fn new( - note_id: NoteId, - note_index: u32, - merkle_path: MerklePath, - metadata: NoteMetadata, - ) -> Self { - Self { - note_id, - note_index, - merkle_path, - metadata, - } - } - - pub fn note_id(&self) -> &NoteId { - &self.note_id - } - - pub fn note_index(&self) -> u32 { - self.note_index - } - - pub fn merkle_path(&self) -> &MerklePath { - &self.merkle_path - } - - #[allow(dead_code)] - pub fn metadata(&self) -> NoteMetadata { - self.metadata - } -} - -// RPC API ENDPOINT -// ================================================================================================ -// -#[derive(Debug)] -pub enum NodeRpcClientEndpoint { - GetAccountDetails, - GetBlockHeaderByNumber, - SyncState, - SubmitProvenTx, -} - -impl fmt::Display for NodeRpcClientEndpoint { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - match self { - NodeRpcClientEndpoint::GetAccountDetails => write!(f, "get_account_details"), - NodeRpcClientEndpoint::GetBlockHeaderByNumber => { - write!(f, "get_block_header_by_number") - }, - NodeRpcClientEndpoint::SyncState => write!(f, "sync_state"), - NodeRpcClientEndpoint::SubmitProvenTx => write!(f, "submit_proven_transaction"), - } - } -} \ No newline at end of file diff --git a/wasm/src/native_code/store/data_store.rs b/wasm/src/native_code/store/data_store.rs deleted file mode 100644 index f188940d7..000000000 --- a/wasm/src/native_code/store/data_store.rs +++ /dev/null @@ -1,188 +0,0 @@ -use alloc::collections::BTreeSet; -use async_trait::async_trait; - -use miden_objects::{ - accounts::AccountId, - assembly::ModuleAst, - crypto::merkle::{InOrderIndex, MerklePath, PartialMmr}, - notes::NoteId, - transaction::{ChainMmr, InputNote, InputNotes}, - BlockHeader, -}; -use miden_tx::{DataStore, DataStoreError, TransactionInputs}; - -use super::{ChainMmrNodeFilter, NoteFilter, Store}; -use crate::native_code::errors::{ClientError, StoreError}; - -// DATA STORE -// ================================================================================================ - -pub struct ClientDataStore { - /// Local database containing information about the accounts managed by this client. - pub(crate) store: S, -} - -impl ClientDataStore { - pub fn new(store: S) -> Self { - Self { store } - } -} - -#[async_trait(?Send)] -impl DataStore for ClientDataStore { - async fn get_transaction_inputs( - &self, - account_id: AccountId, - block_num: u32, - notes: &[NoteId], - ) -> Result { - // First validate that no note has already been consumed - let unspent_notes = self - .store - .get_input_notes(NoteFilter::Committed).await? - .iter() - .map(|note_record| note_record.id()) - .collect::>(); - - for note_id in notes { - if !unspent_notes.contains(note_id) { - return Err(DataStoreError::NoteAlreadyConsumed(*note_id)); - } - } - - // Construct Account - let (account, seed) = self.store.get_account(account_id).await?; - - // Get header data - let (block_header, _had_notes) = self.store.get_block_header_by_num(block_num).await?; - - let mut list_of_notes = vec![]; - - let mut notes_blocks: Vec = vec![]; - for note_id in notes { - let input_note_record = self.store.get_input_note(*note_id).await?; - - let input_note: InputNote = input_note_record - .try_into() - .map_err(|err: ClientError| DataStoreError::InternalError(err.to_string()))?; - - list_of_notes.push(input_note.clone()); - - let note_block_num = input_note.proof().origin().block_num; - - if note_block_num != block_num { - notes_blocks.push(note_block_num); - } - } - - let notes_blocks: Vec = self - .store - .get_block_headers(¬es_blocks).await? - .iter() - .map(|(header, _has_notes)| *header) - .collect(); - - let partial_mmr = build_partial_mmr_with_paths(&self.store, block_num, ¬es_blocks).await?; - let chain_mmr = ChainMmr::new(partial_mmr, notes_blocks) - .map_err(|err| DataStoreError::InternalError(err.to_string()))?; - - let input_notes = - InputNotes::new(list_of_notes).map_err(DataStoreError::InvalidTransactionInput)?; - - TransactionInputs::new(account, seed, block_header, chain_mmr, input_notes) - .map_err(DataStoreError::InvalidTransactionInput) - } - - async fn get_account_code(&self, account_id: AccountId) -> Result { - let (account, _seed) = self.store.get_account(account_id).await?; - let module_ast = account.code().module().clone(); - - Ok(module_ast) - } -} - -/// Builds a [PartialMmr] with a specified forest number and a list of blocks that should be -/// authenticated. -/// -/// `authenticated_blocks` cannot contain `forest`. For authenticating the last block we have, -/// the kernel extends the MMR which is why it's not needed here. -async fn build_partial_mmr_with_paths( - store: &S, - forest: u32, - authenticated_blocks: &[BlockHeader], -) -> Result { - let mut partial_mmr: PartialMmr = { - let current_peaks = store.get_chain_mmr_peaks_by_block_num(forest).await?; - - PartialMmr::from_peaks(current_peaks) - }; - - let block_nums: Vec = authenticated_blocks.iter().map(|b| b.block_num()).collect(); - - let authentication_paths = - get_authentication_path_for_blocks(store, &block_nums, partial_mmr.forest()).await.unwrap(); - - for (header, path) in authenticated_blocks.iter().zip(authentication_paths.iter()) { - partial_mmr - .track(header.block_num() as usize, header.hash(), path) - .map_err(|err| DataStoreError::InternalError(err.to_string()))?; - } - - Ok(partial_mmr) -} - -/// Retrieves all Chain MMR nodes required for authenticating the set of blocks, and then -/// constructs the path for each of them. -/// -/// This method assumes `block_nums` cannot contain `forest`. -pub async fn get_authentication_path_for_blocks( - store: &S, - block_nums: &[u32], - forest: usize, -) -> Result, StoreError> { - let mut node_indices = BTreeSet::new(); - - // Calculate all needed nodes indices for generating the paths - for block_num in block_nums { - let path_depth = mmr_merkle_path_len(*block_num as usize, forest); - - let mut idx = InOrderIndex::from_leaf_pos(*block_num as usize); - - for _ in 0..path_depth { - node_indices.insert(idx.sibling()); - idx = idx.parent(); - } - } - - // Get all Mmr nodes based on collected indices - let node_indices: Vec = node_indices.into_iter().collect(); - - let filter = ChainMmrNodeFilter::List(&node_indices); - let mmr_nodes = store.get_chain_mmr_nodes(filter).await.unwrap(); - - // Construct authentication paths - let mut authentication_paths = vec![]; - for block_num in block_nums { - let mut merkle_nodes = vec![]; - let mut idx = InOrderIndex::from_leaf_pos(*block_num as usize); - - while let Some(node) = mmr_nodes.get(&idx.sibling()) { - merkle_nodes.push(*node); - idx = idx.parent(); - } - let path = MerklePath::new(merkle_nodes); - authentication_paths.push(path); - } - - Ok(authentication_paths) -} - -/// Calculates the merkle path length for an MMR of a specific forest and a leaf index -/// `leaf_index` is a 0-indexed leaf number and `forest` is the total amount of leaves -/// in the MMR at this point. -fn mmr_merkle_path_len(leaf_index: usize, forest: usize) -> usize { - let before = forest & leaf_index; - let after = forest ^ before; - - after.ilog2() as usize -} diff --git a/wasm/src/native_code/store/mod.rs b/wasm/src/native_code/store/mod.rs deleted file mode 100644 index 330124c8f..000000000 --- a/wasm/src/native_code/store/mod.rs +++ /dev/null @@ -1,334 +0,0 @@ -use async_trait::async_trait; -use std::collections::BTreeMap; - -use miden_objects::{ - accounts::{Account, AccountId, AccountStub}, - crypto::{ - dsa::rpo_falcon512::SecretKey, - merkle::{InOrderIndex, MmrPeaks} - }, - notes::{NoteId, Nullifier}, - transaction::TransactionId, - BlockHeader, Digest, Felt, Word -}; -use miden_tx::utils::{ByteReader, ByteWriter, Deserializable, DeserializationError, Serializable}; - -use self::note_record::{InputNoteRecord, OutputNoteRecord}; -use super::{ - errors::StoreError, - sync::SyncedNewNotes, - transactions::{TransactionRecord, TransactionResult} -}; - -pub mod data_store; -pub mod note_record; - -// STORE TRAIT -// ================================================================================================ - -/// The [Store] trait exposes all methods that the client store needs in order to track the current -/// state. -/// -/// All update functions are implied to be atomic. That is, if multiple entities are meant to be -/// updated as part of any single function and an error is returned during its execution, any -/// changes that might have happened up to that point need to be rolled back and discarded. -#[async_trait(?Send)] -pub trait Store { - // TEST - // -------------------------------------------------------------------------------------------- - - async fn insert_string( - &mut self, - data: String - ) -> Result<(), ()>; - - // TRANSACTIONS - // -------------------------------------------------------------------------------------------- - - /// Retrieves stored transactions, filtered by [TransactionFilter]. - async fn get_transactions( - &self, - filter: TransactionFilter, - ) -> Result, StoreError>; - - /// Applies a transaction, atomically updating the current state based on the - /// [TransactionResult] - /// - /// An update involves: - /// - Applying the resulting [AccountDelta](miden_objects::accounts::AccountDelta) and storing the new [Account] state - /// - Storing new notes as a result of the transaction execution - /// - Inserting the transaction into the store to track - async fn apply_transaction(&mut self, tx_result: TransactionResult) -> Result<(), StoreError>; - - // NOTES - // -------------------------------------------------------------------------------------------- - - /// Retrieves the input notes from the store - async fn get_input_notes(&self, filter: NoteFilter) -> Result, StoreError>; - - /// Retrieves the output notes from the store - async fn get_output_notes(&self, filter: NoteFilter) -> Result, StoreError>; - - /// Retrieves an [InputNoteRecord] for the input note corresponding to the specified ID from - /// the store. - /// - /// # Errors - /// - /// Returns a [StoreError::InputNoteNotFound] if there is no Note with the provided ID - async fn get_input_note(&self, note_id: NoteId) -> Result; - - /// Returns the nullifiers of all unspent input notes - /// - /// The default implementation of this method uses [Store::get_input_notes]. - async fn get_unspent_input_note_nullifiers( - &self - ) -> Result, StoreError> { - let nullifiers = self - .get_input_notes(NoteFilter::Committed).await? - .iter() - .map(|input_note| Ok(Nullifier::from(Digest::try_from(input_note.nullifier())?))) - .collect::, _>>(); - - nullifiers - } - - /// Inserts the provided input note into the database - async fn insert_input_note(&mut self, note: &InputNoteRecord) -> Result<(), StoreError>; - - // CHAIN DATA - // -------------------------------------------------------------------------------------------- - - /// Retrieves a vector of [BlockHeader]s filtered by the provided block numbers. - /// - /// The returned vector may not contain some or all of the requested block headers. It's up to - /// the callee to check whether all requested block headers were found. - /// - /// For each block header an additional boolean value is returned representing whether the block - /// contains notes relevant to the client. - async fn get_block_headers( - &self, - block_numbers: &[u32], - ) -> Result, StoreError>; - - /// Retrieves a [BlockHeader] corresponding to the provided block number and a boolean value - /// that represents whether the block contains notes relevant to the client. - /// - /// The default implementation of this method uses [Store::get_block_headers]. - /// - /// # Errors - /// Returns a [StoreError::BlockHeaderNotFound] if the block was not found. - async fn get_block_header_by_num( - &self, - block_number: u32, - ) -> Result<(BlockHeader, bool), StoreError> { - self.get_block_headers(&[block_number]).await - .map(|block_headers_list| block_headers_list.first().cloned()) - .and_then(|block_header| { - block_header.ok_or(StoreError::BlockHeaderNotFound(block_number)) - }) - } - - /// Retrieves a list of [BlockHeader] that include relevant notes to the client. - async fn get_tracked_block_headers(&self) -> Result, StoreError>; - - /// Retrieves all MMR authentication nodes based on [ChainMmrNodeFilter]. - async fn get_chain_mmr_nodes<'a>( - &self, - filter: ChainMmrNodeFilter<'a>, - ) -> Result, StoreError>; - - /// Returns peaks information from the blockchain by a specific block number. - /// - /// If there is no chain MMR info stored for the provided block returns an empty [MmrPeaks] - async fn get_chain_mmr_peaks_by_block_num(&self, block_num: u32) -> Result; - - /// Inserts a block header into the store, alongside peaks information at the block's height. - /// - /// `has_client_notes` describes whether the block has relevant notes to the client; this means - /// the client might want to authenticate merkle paths based on this value. - async fn insert_block_header( - &mut self, - block_header: BlockHeader, - chain_mmr_peaks: MmrPeaks, - has_client_notes: bool, - ) -> Result<(), StoreError>; - - // ACCOUNT - // -------------------------------------------------------------------------------------------- - - /// Returns the account IDs of all accounts stored in the database - async fn get_account_ids(&self) -> Result, StoreError>; - - /// Returns a list of [AccountStub] of all accounts stored in the database along with the seeds - /// used to create them. - /// - /// Said accounts' state is the state after the last performed sync. - async fn get_account_stubs(&self) -> Result)>, StoreError>; - - /// Retrieves an [AccountStub] object for the specified [AccountId] along with the seed - /// used to create it. The seed will be returned if the account is new, otherwise it - /// will be `None`. - /// - /// Said account's state is the state according to the last sync performed. - /// - /// # Errors - /// Returns a `StoreError::AccountDataNotFound` if there is no account for the provided ID - async fn get_account_stub( - &self, - account_id: AccountId, - ) -> Result<(AccountStub, Option), StoreError>; - - /// Retrieves a full [Account] object. The seed will be returned if the account is new, - /// otherwise it will be `None`. - /// - /// This function returns the [Account]'s latest state. If the account is new (that is, has - /// never executed a trasaction), the returned seed will be `Some(Word)`; otherwise the seed - /// will be `None` - /// - /// # Errors - /// - /// Returns a `StoreError::AccountDataNotFound` if there is no account for the provided ID - async fn get_account(&self, account_id: AccountId) -> Result<(Account, Option), StoreError>; - - /// Retrieves an account's [AuthInfo], utilized to authenticate the account. - /// - /// # Errors - /// - /// Returns a `StoreError::AccountDataNotFound` if there is no account for the provided ID - async fn get_account_auth(&self, account_id: AccountId) -> Result; - - /// Inserts an [Account] along with the seed used to create it and its [AuthInfo] - async fn insert_account( - &mut self, - account: &Account, - account_seed: Option, - auth_info: &AuthInfo, - ) -> Result<(), StoreError>; - - // SYNC - // -------------------------------------------------------------------------------------------- - - /// Returns the note tags that the client is interested in. - async fn get_note_tags(&self) -> Result, StoreError>; - - /// Adds a note tag to the list of tags that the client is interested in. - async fn add_note_tag(&mut self, tag: u64) -> Result; - - /// Returns the block number of the last state sync block. - async fn get_sync_height(&self) -> Result; - - /// Applies the state sync update to the store. An update involves: - /// - /// - Inserting the new block header to the store alongside new MMR peaks information - /// - Updating the notes, marking them as `committed` or `consumed` based on incoming - /// inclusion proofs and nullifiers - /// - Updating transactions in the store, marking as `committed` the ones provided with - /// `committed_transactions` - /// - Storing new MMR authentication nodes - async fn apply_state_sync( - &mut self, - block_header: BlockHeader, - nullifiers: Vec, - committed_notes: SyncedNewNotes, - committed_transactions: &[TransactionId], - new_mmr_peaks: MmrPeaks, - new_authentication_nodes: &[(InOrderIndex, Digest)], - updated_onchain_accounts: &[Account], - ) -> Result<(), StoreError>; -} - -// DATABASE AUTH INFO -// ================================================================================================ - -/// Represents the types of authentication information of accounts -#[derive(Debug)] -pub enum AuthInfo { - RpoFalcon512(SecretKey), -} - -const RPO_FALCON512_AUTH: u8 = 0; - -impl AuthInfo { - /// Returns byte identifier of specific AuthInfo - const fn type_byte(&self) -> u8 { - match self { - AuthInfo::RpoFalcon512(_) => RPO_FALCON512_AUTH, - } - } - - /// Returns the authentication information as a tuple of (key, value) - /// that can be input to the advice map at the moment of transaction execution. - pub fn into_advice_inputs(self) -> (Word, Vec) { - match self { - AuthInfo::RpoFalcon512(key) => { - let pub_key: Word = key.public_key().into(); - let mut pk_sk_bytes = key.to_bytes(); - pk_sk_bytes.append(&mut pub_key.to_bytes()); - - (pub_key, pk_sk_bytes.iter().map(|a| Felt::new(*a as u64)).collect::>()) - }, - } - } -} - -impl Serializable for AuthInfo { - fn write_into(&self, target: &mut W) { - let mut bytes = vec![self.type_byte()]; - match self { - AuthInfo::RpoFalcon512(key_pair) => { - bytes.append(&mut key_pair.to_bytes()); - target.write_bytes(&bytes); - }, - } - } -} - -impl Deserializable for AuthInfo { - fn read_from(source: &mut R) -> Result { - let auth_type: u8 = source.read_u8()?; - match auth_type { - RPO_FALCON512_AUTH => { - let key_pair = SecretKey::read_from(source)?; - Ok(AuthInfo::RpoFalcon512(key_pair)) - }, - val => Err(DeserializationError::InvalidValue(val.to_string())), - } - } -} - -// CHAIN MMR NODE FILTER -// ================================================================================================ - -pub enum ChainMmrNodeFilter<'a> { - /// Return all nodes. - All, - /// Filter by the specified in-order indices. - List(&'a [InOrderIndex]), -} - -// TRANSACTION FILTERS -// ================================================================================================ - -pub enum TransactionFilter { - /// Return all transactions. - All, - /// Filter by transactions that have not yet been committed to the blockchain as per the last - /// sync. - Uncomitted, -} - -// NOTE FILTER -// ================================================================================================ - -pub enum NoteFilter { - /// Return a list of all notes ([InputNoteRecord] or [OutputNoteRecord]). - All, - /// Filter by consumed notes ([InputNoteRecord] or [OutputNoteRecord]). notes that have been used as inputs in transactions. - Consumed, - /// Return a list of committed notes ([InputNoteRecord] or [OutputNoteRecord]). These represent notes that the blockchain - /// has included in a block, and for which we are storing anchor data. - Committed, - /// Return a list of pending notes ([InputNoteRecord] or [OutputNoteRecord]). These represent notes for which the store - /// does not have anchor data. - Pending, -} diff --git a/wasm/src/native_code/store/note_record/input_note_record.rs b/wasm/src/native_code/store/note_record/input_note_record.rs deleted file mode 100644 index d63f98e67..000000000 --- a/wasm/src/native_code/store/note_record/input_note_record.rs +++ /dev/null @@ -1,189 +0,0 @@ -use miden_objects::{ - notes::{ - Note, NoteAssets, NoteId, NoteInclusionProof, NoteInputs, NoteMetadata, NoteRecipient, - }, - transaction::InputNote, - utils::{ByteReader, ByteWriter, Deserializable, DeserializationError, Serializable}, - Digest, -}; - -use super::{NoteRecordDetails, NoteStatus}; -use crate::native_code::errors::ClientError; - -// INPUT NOTE RECORD -// ================================================================================================ - -/// Represents a Note of which the Store can keep track and retrieve. -/// -/// An [InputNoteRecord] contains all the information of a [Note], in addition of (optionally) the -/// [NoteInclusionProof] that identifies when the note was included in the chain. -/// -/// Once the proof is set, the [InputNoteRecord] can be transformed into an [InputNote] and used as -/// input for transactions. -/// -/// It is also possible to convert [Note] and [InputNote] into [InputNoteRecord] (we fill the -/// `metadata` and `inclusion_proof` fields if possible) -#[derive(Clone, Debug, PartialEq)] -pub struct InputNoteRecord { - assets: NoteAssets, - details: NoteRecordDetails, - id: NoteId, - inclusion_proof: Option, - metadata: Option, - recipient: Digest, - status: NoteStatus, -} - -impl InputNoteRecord { - pub fn new( - id: NoteId, - recipient: Digest, - assets: NoteAssets, - status: NoteStatus, - metadata: Option, - inclusion_proof: Option, - details: NoteRecordDetails, - ) -> InputNoteRecord { - InputNoteRecord { - id, - recipient, - assets, - status, - metadata, - inclusion_proof, - details, - } - } - - pub fn id(&self) -> NoteId { - self.id - } - - pub fn recipient(&self) -> Digest { - self.recipient - } - - pub fn assets(&self) -> &NoteAssets { - &self.assets - } - - pub fn status(&self) -> NoteStatus { - self.status - } - - pub fn metadata(&self) -> Option<&NoteMetadata> { - self.metadata.as_ref() - } - - pub fn nullifier(&self) -> &str { - &self.details.nullifier - } - - pub fn inclusion_proof(&self) -> Option<&NoteInclusionProof> { - self.inclusion_proof.as_ref() - } - - pub fn details(&self) -> &NoteRecordDetails { - &self.details - } -} - -impl Serializable for InputNoteRecord { - fn write_into(&self, target: &mut W) { - self.id().write_into(target); - self.recipient().write_into(target); - self.assets().write_into(target); - self.status().write_into(target); - self.metadata().write_into(target); - self.details().write_into(target); - self.inclusion_proof().write_into(target); - } -} - -impl Deserializable for InputNoteRecord { - fn read_from(source: &mut R) -> Result { - let id = NoteId::read_from(source)?; - let recipient = Digest::read_from(source)?; - let assets = NoteAssets::read_from(source)?; - let status = NoteStatus::read_from(source)?; - let metadata = Option::::read_from(source)?; - let details = NoteRecordDetails::read_from(source)?; - let inclusion_proof = Option::::read_from(source)?; - - Ok(InputNoteRecord { - id, - recipient, - assets, - status, - metadata, - inclusion_proof, - details, - }) - } -} - -impl From for InputNoteRecord { - fn from(note: Note) -> Self { - InputNoteRecord { - id: note.id(), - recipient: note.recipient_digest(), - assets: note.assets().clone(), - status: NoteStatus::Pending, - metadata: Some(*note.metadata()), - inclusion_proof: None, - details: NoteRecordDetails::new( - note.nullifier().to_string(), - note.script().clone(), - note.inputs().to_vec(), - note.serial_num(), - ), - } - } -} - -impl From for InputNoteRecord { - fn from(recorded_note: InputNote) -> Self { - InputNoteRecord { - id: recorded_note.note().id(), - recipient: recorded_note.note().recipient_digest(), - assets: recorded_note.note().assets().clone(), - status: NoteStatus::Pending, - metadata: Some(*recorded_note.note().metadata()), - details: NoteRecordDetails::new( - recorded_note.note().nullifier().to_string(), - recorded_note.note().script().clone(), - recorded_note.note().inputs().values().to_vec(), - recorded_note.note().serial_num(), - ), - inclusion_proof: Some(recorded_note.proof().clone()), - } - } -} - -impl TryInto for InputNoteRecord { - type Error = ClientError; - - fn try_into(self) -> Result { - match (self.inclusion_proof, self.metadata) { - (Some(proof), Some(metadata)) => { - // TODO: Write functions to get these fields more easily - let note_inputs = NoteInputs::new(self.details.inputs)?; - let note_recipient = - NoteRecipient::new(self.details.serial_num, self.details.script, note_inputs); - let note = Note::new(self.assets, metadata, note_recipient); - Ok(InputNote::new(note, proof.clone())) - }, - - (None, _) => { - Err(ClientError::NoteError(miden_objects::NoteError::invalid_origin_index( - "Input Note Record contains no inclusion proof".to_string(), - ))) - }, - (_, None) => { - Err(ClientError::NoteError(miden_objects::NoteError::invalid_origin_index( - "Input Note Record contains no metadata".to_string(), - ))) - }, - } - } -} diff --git a/wasm/src/native_code/store/note_record/mod.rs b/wasm/src/native_code/store/note_record/mod.rs deleted file mode 100644 index 7c5588f6b..000000000 --- a/wasm/src/native_code/store/note_record/mod.rs +++ /dev/null @@ -1,173 +0,0 @@ -use miden_objects::{ - assembly::{Assembler, ProgramAst}, - notes::NoteScript, - utils::{ByteReader, ByteWriter, Deserializable, DeserializationError, Serializable}, - Digest, Felt, Word, -}; -use serde::{Deserialize, Serialize}; - -mod input_note_record; -mod output_note_record; - -pub use input_note_record::InputNoteRecord; -pub use output_note_record::OutputNoteRecord; - -/// This module defines common structs to be used within the [Store](crate::store::Store) for notes -/// that are available to be consumed ([InputNoteRecord]) and notes that have been produced as a -/// result of executing a transaction ([OutputNoteRecord]). -/// -/// # Features -/// -/// ## Serialization / Deserialization -/// -/// We provide serialization and deserialization support via [Serializable] and [Deserializable] -/// traits implementations, and also via [Serialize] and [Deserialize] from `serde` to provide the -/// ability to serialize most fields into JSON. This is useful for example if you want to store -/// some fields as json columns like we do in -/// [SqliteStore](crate::store::sqlite_store::SqliteStore). For example, suppose we want to store -/// [InputNoteRecord]'s metadata field in a JSON column. In that case, we could do something like: -/// -/// ```ignore -/// fn insert_metadata_into_some_table(db: &mut Database, note: InputNoteRecord) { -/// let note_metadata_json = serde_json::to_string(note.metadata()).unwrap(); -/// -/// db.execute("INSERT INTO notes_metadata (note_id, note_metadata) VALUES (?, ?)", -/// note.id().to_hex(), note_metadata_json).unwrap() -/// } -/// ``` -/// -/// ## Type conversion -/// -/// We also facilitate converting from/into [InputNote](miden_objects::transaction::InputNote) / -/// [Note](miden_objects::notes::Note), although this is not always possible. Check both -/// [InputNoteRecord]'s and [OutputNoteRecord]'s documentation for more details into this - -// NOTE STATUS -// ================================================================================================ -#[derive(Clone, Copy, Debug, Serialize, Deserialize, PartialEq, Eq)] -pub enum NoteStatus { - Pending, - Committed, - Consumed, -} - -impl From for u8 { - fn from(value: NoteStatus) -> Self { - match value { - NoteStatus::Pending => 0, - NoteStatus::Committed => 1, - NoteStatus::Consumed => 2, - } - } -} - -impl TryFrom for NoteStatus { - type Error = DeserializationError; - fn try_from(value: u8) -> Result { - match value { - 0 => Ok(NoteStatus::Pending), - 1 => Ok(NoteStatus::Committed), - 2 => Ok(NoteStatus::Consumed), - _ => Err(DeserializationError::InvalidValue(value.to_string())), - } - } -} - -impl Serializable for NoteStatus { - fn write_into(&self, target: &mut W) { - target.write_bytes(&[(*self).into()]); - } -} - -impl Deserializable for NoteStatus { - fn read_from(source: &mut R) -> Result { - let enum_byte = u8::read_from(source)?; - enum_byte.try_into() - } -} - -fn default_script() -> NoteScript { - let assembler = Assembler::default(); - let note_program_ast = - ProgramAst::parse("begin end").expect("dummy script should be parseable"); - let (note_script, _) = NoteScript::new(note_program_ast, &assembler) - .expect("dummy note script should be created without issues"); - note_script -} - -// NOTE: NoteInputs does not impl Serialize which is why we use Vec here -#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] -pub struct NoteRecordDetails { - nullifier: String, - script_hash: Digest, - #[serde(skip_serializing, skip_deserializing, default = "default_script")] - script: NoteScript, - inputs: Vec, - serial_num: Word, -} - -impl NoteRecordDetails { - pub fn new(nullifier: String, script: NoteScript, inputs: Vec, serial_num: Word) -> Self { - let script_hash = script.hash(); - Self { - nullifier, - script, - script_hash, - inputs, - serial_num, - } - } - - pub fn nullifier(&self) -> &str { - &self.nullifier - } - - pub fn script_hash(&self) -> &Digest { - &self.script_hash - } - - pub fn script(&self) -> &NoteScript { - &self.script - } - - pub fn inputs(&self) -> &Vec { - &self.inputs - } - - pub fn serial_num(&self) -> Word { - self.serial_num - } -} - -impl Serializable for NoteRecordDetails { - fn write_into(&self, target: &mut W) { - let nullifier_bytes = self.nullifier.as_bytes(); - target.write_u64(nullifier_bytes.len() as u64); - target.write_bytes(nullifier_bytes); - - self.script().write_into(target); - - target.write_u64(self.inputs.len() as u64); - target.write_many(self.inputs()); - - self.serial_num().write_into(target); - } -} - -impl Deserializable for NoteRecordDetails { - fn read_from(source: &mut R) -> Result { - let nullifier_len = u64::read_from(source)? as usize; - let nullifier_bytes = source.read_vec(nullifier_len)?; - let nullifier = - String::from_utf8(nullifier_bytes).expect("Nullifier String bytes should be readable."); - - let script = NoteScript::read_from(source)?; - - let inputs_len = source.read_u64()? as usize; - let inputs = source.read_many::(inputs_len)?; - - let serial_num = Word::read_from(source)?; - - Ok(NoteRecordDetails::new(nullifier, script, inputs, serial_num)) - } -} diff --git a/wasm/src/native_code/store/note_record/output_note_record.rs b/wasm/src/native_code/store/note_record/output_note_record.rs deleted file mode 100644 index a5c2441dc..000000000 --- a/wasm/src/native_code/store/note_record/output_note_record.rs +++ /dev/null @@ -1,98 +0,0 @@ -use miden_objects::{ - notes::{Note, NoteAssets, NoteId, NoteInclusionProof, NoteMetadata}, - Digest, -}; - -use super::{NoteRecordDetails, NoteStatus}; - -// OUTPUT NOTE RECORD -// ================================================================================================ - -/// Represents a Note which was the result of executing some transaction of which the Store can -/// keep track and retrieve. -/// -/// An [OutputNoteRecord] contains all the information of a [Note] while it allows for not knowing -/// the details (nullifier, script, inputs and serial number), in addition of (optionally) the -/// [NoteInclusionProof] that identifies when the note was included in the chain. -/// -/// It is also possible to convert [Note] into [OutputNoteRecord] (we fill the `details` and -/// `inclusion_proof` fields if possible) -#[derive(Clone, Debug, PartialEq)] -pub struct OutputNoteRecord { - assets: NoteAssets, - details: Option, - id: NoteId, - inclusion_proof: Option, - metadata: NoteMetadata, - recipient: Digest, - status: NoteStatus, -} - -impl OutputNoteRecord { - pub fn new( - id: NoteId, - recipient: Digest, - assets: NoteAssets, - status: NoteStatus, - metadata: NoteMetadata, - inclusion_proof: Option, - details: Option, - ) -> OutputNoteRecord { - OutputNoteRecord { - id, - recipient, - assets, - status, - metadata, - inclusion_proof, - details, - } - } - - pub fn id(&self) -> NoteId { - self.id - } - - pub fn recipient(&self) -> Digest { - self.recipient - } - - pub fn assets(&self) -> &NoteAssets { - &self.assets - } - - pub fn status(&self) -> NoteStatus { - self.status - } - - pub fn metadata(&self) -> &NoteMetadata { - &self.metadata - } - - pub fn inclusion_proof(&self) -> Option<&NoteInclusionProof> { - self.inclusion_proof.as_ref() - } - - pub fn details(&self) -> Option<&NoteRecordDetails> { - self.details.as_ref() - } -} - -impl From for OutputNoteRecord { - fn from(note: Note) -> Self { - OutputNoteRecord { - id: note.id(), - recipient: note.recipient_digest(), - assets: note.assets().clone(), - status: NoteStatus::Pending, - metadata: *note.metadata(), - inclusion_proof: None, - details: Some(NoteRecordDetails::new( - note.nullifier().to_string(), - note.script().clone(), - note.inputs().to_vec(), - note.serial_num(), - )), - } - } -} diff --git a/wasm/src/native_code/sync.rs b/wasm/src/native_code/sync.rs deleted file mode 100644 index a637f1903..000000000 --- a/wasm/src/native_code/sync.rs +++ /dev/null @@ -1,474 +0,0 @@ -use std::collections::BTreeSet; - -use miden_objects::{ - accounts::{ - Account, - AccountId, - AccountStub - }, - crypto::{ - merkle::{ - InOrderIndex, - MmrDelta, - MmrPeaks, - PartialMmr - }, rand::FeltRng - }, - notes::{ - NoteExecutionMode, - NoteId, - NoteInclusionProof, - NoteTag - }, - transaction::{ - InputNote, - TransactionId - }, - BlockHeader, Digest -}; - -use super::{ - errors::{ClientError, StoreError}, rpc::{NodeRpcClient, CommittedNote, NoteDetails}, store::{ChainMmrNodeFilter, NoteFilter, Store, TransactionFilter}, transactions::TransactionRecord, Client // TODO: Add AuthInfo -}; - -pub enum SyncStatus { - SyncedToLastBlock(u32), - SyncedToBlock(u32), -} - -/// Contains information about new notes as consequence of a sync -pub struct SyncedNewNotes { - /// A list of public notes that have been received on sync - new_public_notes: Vec, - /// A list of note IDs alongside their inclusion proofs for locally-tracked - /// notes - new_inclusion_proofs: Vec<(NoteId, NoteInclusionProof)>, -} - -impl SyncedNewNotes { - pub fn new( - new_public_notes: Vec, - new_inclusion_proofs: Vec<(NoteId, NoteInclusionProof)>, - ) -> Self { - Self { new_public_notes, new_inclusion_proofs } - } - - pub fn new_public_notes(&self) -> &[InputNote] { - &self.new_public_notes - } - - pub fn new_inclusion_proofs(&self) -> &[(NoteId, NoteInclusionProof)] { - &self.new_inclusion_proofs - } - - /// Returns whether no new note-related information has been retrieved - pub fn is_empty(&self) -> bool { - self.new_inclusion_proofs.is_empty() && self.new_public_notes.is_empty() - } -} - -// CONSTANTS -// ================================================================================================ - -/// The number of bits to shift identifiers for in use of filters. -pub const FILTER_ID_SHIFT: u8 = 48; - -impl Client { - /// Returns the block number of the last state sync block. - pub async fn get_sync_height(&self) -> Result { - self.store.get_sync_height().await.map_err(|err| err.into()) - } - - /// Returns the list of note tags tracked by the client. - pub async fn get_note_tags(&self) -> Result, ClientError> { - self.store.get_note_tags().await.map_err(|err| err.into()) - } - - /// Adds a note tag for the client to track. - pub async fn add_note_tag(&mut self, tag: u64) -> Result<(), ClientError> { - match self.store.add_note_tag(tag).await.map_err(|err| err.into()) { - Ok(true) => Ok(()), - Ok(false) => { - Ok(()) - }, - Err(err) => Err(err), - } - } - - /// Syncs the client's state with the current state of the Miden network. - /// Before doing so, it ensures the genesis block exists in the local store. - /// - /// Returns the block number the client has been synced to. - pub async fn sync_state(&mut self) -> Result { - self.ensure_genesis_in_place().await?; - loop { - let response = self.sync_state_once().await?; - if let SyncStatus::SyncedToLastBlock(v) = response { - return Ok(v); - } - } - } - - /// Attempts to retrieve the genesis block from the store. If not found, - /// it requests it from the node and store it. - async fn ensure_genesis_in_place(&mut self) -> Result<(), ClientError> { - let genesis = self.store.get_block_header_by_num(0).await; - - match genesis { - Ok(_) => Ok(()), - Err(StoreError::BlockHeaderNotFound(0)) => self.retrieve_and_store_genesis().await, - Err(err) => Err(ClientError::StoreError(err)), - } - } - - async fn retrieve_and_store_genesis(&mut self) -> Result<(), ClientError> { - let genesis_block = self.rpc_api.get_block_header_by_number(Some(0)).await?; - - let blank_mmr_peaks = - MmrPeaks::new(0, vec![]).expect("Blank MmrPeaks should not fail to instantiate"); - // NOTE: If genesis block data ever includes notes in the future, the third parameter in - // this `insert_block_header` call may be `true` - self.store.insert_block_header(genesis_block, blank_mmr_peaks, false).await?; - Ok(()) - } - - async fn sync_state_once(&mut self) -> Result { - let current_block_num = self.store.get_sync_height().await?; - - let accounts: Vec = self - .store - .get_account_stubs().await.unwrap() - .into_iter() - .map(|(acc_stub, _)| acc_stub) - .collect(); - - let note_tags: Vec = accounts - .iter() - .map(|acc| NoteTag::from_account_id(acc.id(), NoteExecutionMode::Local)) - .collect::, _>>()?; - - // To receive information about added nullifiers, we reduce them to the higher 16 bits - // Note that besides filtering by nullifier prefixes, the node also filters by block number - // (it only returns nullifiers from current_block_num until response.block_header.block_num()) - let nullifiers_tags: Vec = self - .store - .get_unspent_input_note_nullifiers().await? - .iter() - .map(|nullifier| (nullifier.inner()[3].as_int() >> FILTER_ID_SHIFT) as u16) - .collect(); - - // Send request - let account_ids: Vec = accounts.iter().map(|acc| acc.id()).collect(); - let response = self - .rpc_api - .sync_state(current_block_num, &account_ids, ¬e_tags, &nullifiers_tags) - .await?; - - // We don't need to continue if the chain has not advanced - if response.block_header.block_num() == current_block_num { - return Ok(SyncStatus::SyncedToLastBlock(current_block_num)); - } - - let new_note_details = - self.get_note_details(response.note_inclusions, &response.block_header).await?; - - let (onchain_accounts, offchain_accounts): (Vec<_>, Vec<_>) = - accounts.into_iter().partition(|account_stub: &AccountStub| account_stub.id().is_on_chain()); - - let updated_onchain_accounts = self - .get_updated_onchain_accounts(&response.account_hash_updates, &onchain_accounts) - .await?; - self.validate_local_account_hashes(&response.account_hash_updates, &offchain_accounts)?; - - // Derive new nullifiers data - let new_nullifiers = self.get_new_nullifiers(response.nullifiers).await?; - - // Build PartialMmr with current data and apply updates - let (new_peaks, new_authentication_nodes) = { - let current_partial_mmr = self.build_current_partial_mmr().await?; - - let (current_block, has_relevant_notes) = - self.store.get_block_header_by_num(current_block_num).await?; - - apply_mmr_changes( - current_partial_mmr, - response.mmr_delta, - current_block, - has_relevant_notes, - )? - }; - - let note_ids: Vec = - new_note_details.new_inclusion_proofs.iter().map(|(id, _)| (*id)).collect(); - - let uncommitted_transactions = - self.store.get_transactions(TransactionFilter::Uncomitted).await?; - - let transactions_to_commit = get_transactions_to_commit( - &uncommitted_transactions, - ¬e_ids, - &new_nullifiers, - &response.account_hash_updates, - ); - - // Apply received and computed updates to the store - self.store - .apply_state_sync( - response.block_header, - new_nullifiers, - new_note_details, - &transactions_to_commit, - new_peaks, - &new_authentication_nodes, - &updated_onchain_accounts, - ).await - .map_err(ClientError::StoreError)?; - - if response.chain_tip == response.block_header.block_num() { - Ok(SyncStatus::SyncedToLastBlock(response.chain_tip)) - } else { - Ok(SyncStatus::SyncedToBlock(response.block_header.block_num())) - } - } - - // HELPERS - // -------------------------------------------------------------------------------------------- - - /// Extracts information about notes that the client is interested in, creating the note inclusion - /// proof in order to correctly update store data - async fn get_note_details( - &mut self, - committed_notes: Vec, - block_header: &BlockHeader, - ) -> Result { - // We'll only pick committed notes that we are tracking as input/output notes. Since the - // sync response contains notes matching either the provided accounts or the provided tag - // we might get many notes when we only care about a few of those. - - let mut new_public_notes = vec![]; - let mut local_notes_proofs = vec![]; - - let pending_input_notes = - self.store.get_input_notes(NoteFilter::Pending).await?.into_iter().map(|n| n.id()); - - let pending_output_notes = - self.store.get_output_notes(NoteFilter::Pending).await?.into_iter().map(|n| n.id()); - - let mut all_pending_notes: BTreeSet = BTreeSet::new(); - - pending_input_notes.chain(pending_output_notes).for_each(|id| { - all_pending_notes.insert(id); - }); - - for committed_note in committed_notes { - if all_pending_notes.contains(committed_note.note_id()) { - // The note belongs to our locally tracked set of pending notes, build the inclusion proof - let note_with_inclusion_proof = NoteInclusionProof::new( - block_header.block_num(), - block_header.sub_hash(), - block_header.note_root(), - committed_note.note_index().into(), - committed_note.merkle_path().clone(), - ) - .map_err(ClientError::NoteError) - .map(|proof| (*committed_note.note_id(), proof))?; - - local_notes_proofs.push(note_with_inclusion_proof); - } else { - // The note is public and we are not tracking it, push to the list of IDs to query - new_public_notes.push(*committed_note.note_id()); - } - } - - // Query the node for input note data and build the entities - let new_public_notes = - self.fetch_public_note_details(&new_public_notes, block_header).await?; - - Ok(SyncedNewNotes::new(new_public_notes, local_notes_proofs)) - } - - /// Queries the node for all received notes that are not being locally tracked in the client - /// - /// The client can receive metadata for private notes that it's not tracking. In this case, - /// notes are ignored for now as they become useless until details are imported. - async fn fetch_public_note_details( - &mut self, - query_notes: &[NoteId], - block_header: &BlockHeader, - ) -> Result, ClientError> { - if query_notes.is_empty() { - return Ok(vec![]); - } - let notes_data = self.rpc_api.get_notes_by_id(query_notes).await?; - let mut return_notes = Vec::with_capacity(query_notes.len()); - for note_data in notes_data { - match note_data { - NoteDetails::OffChain(id, ..) => { - // TODO: Is there any benefit to not ignoring these? In any case we do not have - // the recipient which is mandatory right now. - }, - NoteDetails::Public(note, inclusion_proof) => { - let note_inclusion_proof = NoteInclusionProof::new( - block_header.block_num(), - block_header.sub_hash(), - block_header.note_root(), - inclusion_proof.note_index as u64, - inclusion_proof.merkle_path, - ) - .map_err(ClientError::NoteError)?; - - return_notes.push(InputNote::new(note, note_inclusion_proof)) - }, - } - } - Ok(return_notes) - } - - /// Builds the current view of the chain's [PartialMmr]. Because we want to add all new - /// authentication nodes that could come from applying the MMR updates, we need to track all - /// known leaves thus far. - /// - /// As part of the syncing process, we add the current block number so we don't need to - /// track it here. - pub(crate) async fn build_current_partial_mmr(&self) -> Result { - let current_block_num = self.store.get_sync_height().await?; - let tracked_nodes = self.store.get_chain_mmr_nodes(ChainMmrNodeFilter::All).await?; - let current_peaks = self.store.get_chain_mmr_peaks_by_block_num(current_block_num).await?; - - let track_latest = if current_block_num != 0 { - match self.store.get_block_header_by_num(current_block_num - 1).await { - Ok((_, previous_block_had_notes)) => Ok(previous_block_had_notes), - Err(StoreError::BlockHeaderNotFound(_)) => Ok(false), - Err(err) => Err(ClientError::StoreError(err)), - }? - } else { - false - }; - - Ok(PartialMmr::from_parts(current_peaks, tracked_nodes, track_latest)) - } - - /// Extracts information about nullifiers for unspent input notes that the client is tracking - /// from the received [SyncStateResponse] - async fn get_new_nullifiers(&self, new_nullifiers: Vec) -> Result, ClientError> { - // Get current unspent nullifiers - let nullifiers = self - .store - .get_unspent_input_note_nullifiers().await? - .iter() - .map(|nullifier| nullifier.inner()) - .collect::>(); - - let new_nullifiers = new_nullifiers - .into_iter() - .filter(|nullifier| nullifiers.contains(nullifier)) - .collect(); - - Ok(new_nullifiers) - } - - async fn get_updated_onchain_accounts( - &mut self, - account_updates: &[(AccountId, Digest)], - current_onchain_accounts: &[AccountStub], - ) -> Result, ClientError> { - let mut accounts_to_update: Vec = Vec::new(); - for (remote_account_id, remote_account_hash) in account_updates { - // check if this updated account is tracked by the client - let current_account = current_onchain_accounts - .iter() - .find(|acc| *remote_account_id == acc.id() && *remote_account_hash != acc.hash()); - - if let Some(tracked_account) = current_account { - let account = self.rpc_api.get_account_update(tracked_account.id()).await?; - accounts_to_update.push(account); - } - } - Ok(accounts_to_update) - } - - /// Validates account hash updates and returns an error if there is a mismatch. - fn validate_local_account_hashes( - &mut self, - account_updates: &[(AccountId, Digest)], - current_offchain_accounts: &[AccountStub], - ) -> Result<(), ClientError> { - for (remote_account_id, remote_account_hash) in account_updates { - // ensure that if we track that account, it has the same hash - let mismatched_accounts = current_offchain_accounts - .iter() - .find(|acc| *remote_account_id == acc.id() && *remote_account_hash != acc.hash()); - - // OffChain accounts should always have the latest known state - if mismatched_accounts.is_some() { - return Err(StoreError::AccountHashMismatch(*remote_account_id).into()); - } - } - Ok(()) - } -} - -// UTILS -// -------------------------------------------------------------------------------------------- - -/// Applies changes to the Mmr structure, storing authentication nodes for leaves we track -/// and returns the updated [PartialMmr] -fn apply_mmr_changes( - current_partial_mmr: PartialMmr, - mmr_delta: MmrDelta, - current_block_header: BlockHeader, - current_block_has_relevant_notes: bool, -) -> Result<(MmrPeaks, Vec<(InOrderIndex, Digest)>), StoreError> { - let mut partial_mmr: PartialMmr = current_partial_mmr; - - // First, apply curent_block to the Mmr - let new_authentication_nodes = partial_mmr - .add(current_block_header.hash(), current_block_has_relevant_notes) - .into_iter(); - - // Apply the Mmr delta to bring Mmr to forest equal to chain tip - let new_authentication_nodes: Vec<(InOrderIndex, Digest)> = partial_mmr - .apply(mmr_delta) - .map_err(StoreError::MmrError)? - .into_iter() - .chain(new_authentication_nodes) - .collect(); - - Ok((partial_mmr.peaks(), new_authentication_nodes)) -} - -/// Returns the list of transactions that should be marked as committed based on the state update info -/// -/// To set an uncommitted transaction as committed three things must hold: -/// -/// - All of the transaction's output notes are committed -/// - All of the transaction's input notes are consumed, which means we got their nullifiers as -/// part of the update -/// - The account corresponding to the transaction hash matches the transaction's -// final_account_state -fn get_transactions_to_commit( - uncommitted_transactions: &[TransactionRecord], - _note_ids: &[NoteId], - nullifiers: &[Digest], - account_hash_updates: &[(AccountId, Digest)], -) -> Vec { - uncommitted_transactions - .iter() - .filter(|t| { - // TODO: based on the discussion in - // https://github.com/0xPolygonMiden/miden-client/issues/144, we should be aware - // that in the future it'll be possible to have many transactions modifying an - // account be included in a single block. If that happens, we'll need to rewrite - // this check - - // TODO: Review this. Because we receive note IDs based on account ID tags, - // we cannot base the status change on output notes alone; - t.input_note_nullifiers.iter().all(|n| nullifiers.contains(n)) - //&& t.output_notes.iter().all(|n| note_ids.contains(&n.id())) - && account_hash_updates.iter().any(|(account_id, account_hash)| { - *account_id == t.account_id && *account_hash == t.final_account_state - }) - }) - .map(|t| t.id) - .collect() -} \ No newline at end of file diff --git a/wasm/src/native_code/transactions/asm/transaction_scripts/auth_consume_notes.masm b/wasm/src/native_code/transactions/asm/transaction_scripts/auth_consume_notes.masm deleted file mode 100644 index 5cf19e425..000000000 --- a/wasm/src/native_code/transactions/asm/transaction_scripts/auth_consume_notes.masm +++ /dev/null @@ -1,5 +0,0 @@ -use.miden::contracts::auth::basic->auth_tx - -begin - call.auth_tx::auth_tx_rpo_falcon512 -end diff --git a/wasm/src/native_code/transactions/asm/transaction_scripts/auth_send_asset.masm b/wasm/src/native_code/transactions/asm/transaction_scripts/auth_send_asset.masm deleted file mode 100644 index 540c95e5f..000000000 --- a/wasm/src/native_code/transactions/asm/transaction_scripts/auth_send_asset.masm +++ /dev/null @@ -1,12 +0,0 @@ -use.miden::contracts::auth::basic->auth_tx -use.miden::contracts::wallets::basic->wallet - -begin - push.{recipient} - push.{note_type} - push.{tag} - push.{asset} - call.wallet::send_asset - drop drop dropw dropw - call.auth_tx::auth_tx_rpo_falcon512 -end diff --git a/wasm/src/native_code/transactions/asm/transaction_scripts/distribute_fungible_asset.masm b/wasm/src/native_code/transactions/asm/transaction_scripts/distribute_fungible_asset.masm deleted file mode 100644 index d26a77558..000000000 --- a/wasm/src/native_code/transactions/asm/transaction_scripts/distribute_fungible_asset.masm +++ /dev/null @@ -1,13 +0,0 @@ -use.miden::contracts::faucets::basic_fungible->faucet -use.miden::contracts::auth::basic->auth_tx - -begin - push.{recipient} - push.{note_type} - push.{tag} - push.{amount} - call.faucet::distribute - - call.auth_tx::auth_tx_rpo_falcon512 - dropw dropw -end diff --git a/wasm/src/native_code/transactions/mod.rs b/wasm/src/native_code/transactions/mod.rs deleted file mode 100644 index 40b61e212..000000000 --- a/wasm/src/native_code/transactions/mod.rs +++ /dev/null @@ -1,434 +0,0 @@ -use alloc::collections::{BTreeMap, BTreeSet}; - -use miden_lib::notes::{create_p2id_note, create_p2idr_note}; -use miden_objects::{ - accounts::{AccountDelta, AccountId}, - assembly::ProgramAst, - assets::FungibleAsset, - crypto::rand::{FeltRng, RpoRandomCoin}, - notes::{Note, NoteId, NoteType}, - transaction::{ - ExecutedTransaction, OutputNotes, ProvenTransaction, TransactionArgs, TransactionId, - TransactionScript, - }, - Digest, Felt, Word, -}; -use miden_tx::{ProvingOptions, ScriptTarget, TransactionProver}; -use rand::{rngs::StdRng, Rng, SeedableRng}; - -use self::transaction_request::{PaymentTransactionData, TransactionRequest, TransactionTemplate}; - -use super::{ - errors::ClientError, note_screener::{NoteRelevance, NoteScreener}, rpc::NodeRpcClient, store::{AuthInfo, Store, TransactionFilter}, Client -}; - -pub mod transaction_request; - -// TRANSACTION RESULT -// -------------------------------------------------------------------------------------------- - -/// Represents the result of executing a transaction by the client -/// -/// It contains an [ExecutedTransaction], a list of [Note] that describe the details of the notes -/// created by the transaction execution, and a list of `usize` `relevant_notes` that contain the -/// indices of `output_notes` that are relevant to the client -pub struct TransactionResult { - executed_transaction: ExecutedTransaction, - output_notes: Vec, - relevant_notes: Option>>, -} - -impl TransactionResult { - pub fn new(executed_transaction: ExecutedTransaction, created_notes: Vec) -> Self { - Self { - executed_transaction, - output_notes: created_notes, - relevant_notes: None, - } - } - - pub fn executed_transaction(&self) -> &ExecutedTransaction { - &self.executed_transaction - } - - pub fn created_notes(&self) -> &Vec { - &self.output_notes - } - - pub fn relevant_notes(&self) -> Vec<&Note> { - if let Some(relevant_notes) = &self.relevant_notes { - relevant_notes - .keys() - .map(|note_index| &self.output_notes[*note_index]) - .collect() - } else { - self.created_notes().iter().collect() - } - } - - pub fn set_relevant_notes( - &mut self, - relevant_notes: BTreeMap>, - ) { - self.relevant_notes = Some(relevant_notes); - } - - pub fn block_num(&self) -> u32 { - self.executed_transaction.block_header().block_num() - } - - pub fn transaction_arguments(&self) -> &TransactionArgs { - self.executed_transaction.tx_args() - } - - pub fn account_delta(&self) -> &AccountDelta { - self.executed_transaction.account_delta() - } -} - -// TRANSACTION RECORD -// -------------------------------------------------------------------------------------------- - -/// Describes a transaction that has been executed and is being tracked on the Client -/// -/// Currently, the `commit_height` (and `committed` status) is set based on the height -/// at which the transaction's output notes are committed. -pub struct TransactionRecord { - pub id: TransactionId, - pub account_id: AccountId, - pub init_account_state: Digest, - pub final_account_state: Digest, - pub input_note_nullifiers: Vec, - pub output_notes: OutputNotes, - pub transaction_script: Option, - pub block_num: u32, - pub transaction_status: TransactionStatus, -} - -impl TransactionRecord { - #[allow(clippy::too_many_arguments)] - pub fn new( - id: TransactionId, - account_id: AccountId, - init_account_state: Digest, - final_account_state: Digest, - input_note_nullifiers: Vec, - output_notes: OutputNotes, - transaction_script: Option, - block_num: u32, - transaction_status: TransactionStatus, - ) -> TransactionRecord { - TransactionRecord { - id, - account_id, - init_account_state, - final_account_state, - input_note_nullifiers, - output_notes, - transaction_script, - block_num, - transaction_status, - } - } -} - -/// Represents the status of a transaction -pub enum TransactionStatus { - /// Transaction has been submitted but not yet committed - Pending, - /// Transaction has been committed and included at the specified block number - Committed(u32), -} - -impl std::fmt::Display for TransactionStatus { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - match self { - TransactionStatus::Pending => write!(f, "Pending"), - TransactionStatus::Committed(block_number) => { - write!(f, "Committed (Block: {})", block_number) - }, - } - } -} - -impl Client { - // TRANSACTION DATA RETRIEVAL - // -------------------------------------------------------------------------------------------- - - pub async fn get_transactions( - &self, - filter: TransactionFilter, - ) -> Result, ClientError> { - self.store.get_transactions(filter).await.map_err(|err| err.into()) - } - - // TRANSACTION - // -------------------------------------------------------------------------------------------- - - /// Compiles a [TransactionTemplate] into a [TransactionRequest] that can be then executed by the - /// client - pub async fn build_transaction_request( - &mut self, - transaction_template: TransactionTemplate, - ) -> Result { - let account_id = transaction_template.account_id(); - let account_auth = self.store.get_account_auth(account_id).await.unwrap(); - - match transaction_template { - TransactionTemplate::ConsumeNotes(_, notes) => { - let program_ast = ProgramAst::parse(transaction_request::AUTH_CONSUME_NOTES_SCRIPT) - .expect("shipped MASM is well-formed"); - let notes = notes.iter().map(|id| (*id, None)).collect(); - - let tx_script = { - let script_inputs = vec![account_auth.into_advice_inputs()]; - self.tx_executor.compile_tx_script(program_ast, script_inputs, vec![])? - }; - Ok(TransactionRequest::new(account_id, notes, vec![], Some(tx_script))) - }, - TransactionTemplate::MintFungibleAsset(asset, target_account_id, note_type) => { - self.build_mint_tx_request(asset, account_auth, target_account_id, note_type) - }, - TransactionTemplate::PayToId(payment_data, note_type) => { - self.build_p2id_tx_request(account_auth, payment_data, None, note_type) - }, - TransactionTemplate::PayToIdWithRecall(payment_data, recall_height, note_type) => self - .build_p2id_tx_request(account_auth, payment_data, Some(recall_height), note_type), - } - } - - /// Creates and executes a transaction specified by the template, but does not change the - /// local database. - /// - /// # Errors - /// - /// - Returns [ClientError::MissingOutputNotes] if the [TransactionRequest] ouput notes are - /// not a subset of executor's output notes - /// - Returns a [ClientError::TransactionExecutionError] - pub async fn new_transaction( - &mut self, - transaction_request: TransactionRequest - ) -> Result { - let account_id = transaction_request.account_id(); - self.tx_executor - .load_account(account_id).await - .map_err(ClientError::TransactionExecutionError)?; - - let block_num = self.store.get_sync_height().await.unwrap(); - - let note_ids = transaction_request.get_input_note_ids(); - - let output_notes = transaction_request.expected_output_notes().to_vec(); - - // Execute the transaction and get the witness - let executed_transaction = self.tx_executor.execute_transaction( - account_id, - block_num, - ¬e_ids, - transaction_request.into(), - ).await?; - - // Check that the expected output notes is a subset of the transaction's output notes - let tx_note_ids: BTreeSet = - executed_transaction.output_notes().iter().map(|n| n.id()).collect(); - - let missing_note_ids: Vec = output_notes - .iter() - .filter_map(|n| (!tx_note_ids.contains(&n.id())).then_some(n.id())) - .collect(); - - if !missing_note_ids.is_empty() { - return Err(ClientError::MissingOutputNotes(missing_note_ids)); - } - - Ok(TransactionResult::new(executed_transaction, output_notes)) - } - - /// Proves the specified transaction witness, submits it to the node, and stores the transaction in - /// the local database for tracking. - pub async fn submit_transaction( - &mut self, - tx_result: TransactionResult - ) -> Result<(), ClientError> { - let transaction_prover = TransactionProver::new(ProvingOptions::default()); - - let proven_transaction = - transaction_prover.prove_transaction(tx_result.executed_transaction().clone())?; - - self.submit_proven_transaction_request(proven_transaction.clone()).await?; - - let note_screener = NoteScreener::new(&self.store); - let mut relevant_notes = BTreeMap::new(); - - for (idx, note) in tx_result.created_notes().iter().enumerate() { - let account_relevance = note_screener.check_relevance(note).await.unwrap(); - if !account_relevance.is_empty() { - relevant_notes.insert(idx, account_relevance); - } - } - - let mut tx_result = tx_result; - tx_result.set_relevant_notes(relevant_notes); - - // Transaction was proven and submitted to the node correctly, persist note details and update account - self.store.apply_transaction(tx_result).await.unwrap(); - - Ok(()) - } - - /// Compiles the provided transaction script source and inputs into a [TransactionScript] and - /// checks (to the extent possible) that the transaction script can be executed against all - /// accounts with the specified interfaces. - pub fn compile_tx_script( - &self, - program: ProgramAst, - inputs: T, - target_account_procs: Vec, - ) -> Result - where - T: IntoIterator)>, - { - self.tx_executor - .compile_tx_script(program, inputs, target_account_procs) - .map_err(ClientError::TransactionExecutionError) - } - - async fn submit_proven_transaction_request( - &mut self, - proven_transaction: ProvenTransaction, - ) -> Result<(), ClientError> { - Ok(self.rpc_api.submit_proven_transaction(proven_transaction).await.unwrap()) - } - - // HELPERS - // -------------------------------------------------------------------------------------------- - - /// Gets [RpoRandomCoin] from the client - fn get_random_coin(&self) -> RpoRandomCoin { - // TODO: Initialize coin status once along with the client and persist status for retrieval - let mut rng = StdRng::from_entropy(); - let coin_seed: [u64; 4] = rng.gen(); - - RpoRandomCoin::new(coin_seed.map(Felt::new)) - } - - /// Helper to build a [TransactionRequest] for P2ID-type transactions easily. - /// - /// - auth_info has to be from the executor account - /// - If recall_height is Some(), a P2IDR note will be created. Otherwise, a P2ID is created. - fn build_p2id_tx_request( - &self, - auth_info: AuthInfo, - payment_data: PaymentTransactionData, - recall_height: Option, - note_type: NoteType, - ) -> Result { - let random_coin = self.get_random_coin(); - - let created_note = if let Some(recall_height) = recall_height { - create_p2idr_note( - payment_data.account_id(), - payment_data.target_account_id(), - vec![payment_data.asset()], - note_type, - recall_height, - random_coin, - )? - } else { - create_p2id_note( - payment_data.account_id(), - payment_data.target_account_id(), - vec![payment_data.asset()], - note_type, - random_coin, - )? - }; - - let recipient = created_note - .recipient_digest() - .iter() - .map(|x| x.as_int().to_string()) - .collect::>() - .join("."); - - let note_tag = created_note.metadata().tag().inner(); - - let tx_script = ProgramAst::parse( - &transaction_request::AUTH_SEND_ASSET_SCRIPT - .replace("{recipient}", &recipient) - .replace("{note_type}", &Felt::new(note_type as u64).to_string()) - .replace("{tag}", &Felt::new(note_tag.into()).to_string()) - .replace("{asset}", &prepare_word(&payment_data.asset().into()).to_string()), - ) - .expect("shipped MASM is well-formed"); - - let tx_script = { - let script_inputs = vec![auth_info.into_advice_inputs()]; - self.tx_executor.compile_tx_script(tx_script, script_inputs, vec![])? - }; - - Ok(TransactionRequest::new( - payment_data.account_id(), - BTreeMap::new(), - vec![created_note], - Some(tx_script), - )) - } - - /// Helper to build a [TransactionRequest] for transaction to mint fungible tokens. - /// - /// - faucet_auth_info has to be from the faucet account - fn build_mint_tx_request( - &self, - asset: FungibleAsset, - faucet_auth_info: AuthInfo, - target_account_id: AccountId, - note_type: NoteType, - ) -> Result { - let random_coin = self.get_random_coin(); - let created_note = create_p2id_note( - asset.faucet_id(), - target_account_id, - vec![asset.into()], - note_type, - random_coin, - )?; - - let recipient = created_note - .recipient_digest() - .iter() - .map(|x| x.as_int().to_string()) - .collect::>() - .join("."); - - let note_tag = created_note.metadata().tag().inner(); - - let tx_script = ProgramAst::parse( - &transaction_request::DISTRIBUTE_FUNGIBLE_ASSET_SCRIPT - .replace("{recipient}", &recipient) - .replace("{note_type}", &Felt::new(note_type as u64).to_string()) - .replace("{tag}", &Felt::new(note_tag.into()).to_string()) - .replace("{amount}", &Felt::new(asset.amount()).to_string()), - ) - .expect("shipped MASM is well-formed"); - - let tx_script = { - let script_inputs = vec![faucet_auth_info.into_advice_inputs()]; - self.tx_executor.compile_tx_script(tx_script, script_inputs, vec![])? - }; - - Ok(TransactionRequest::new( - asset.faucet_id(), - BTreeMap::new(), - vec![created_note], - Some(tx_script), - )) - } -} - -// HELPERS -// ================================================================================================ - -pub fn prepare_word(word: &Word) -> String { - word.iter().map(|x| x.as_int().to_string()).collect::>().join(".") -} \ No newline at end of file diff --git a/wasm/src/native_code/transactions/transaction_request.rs b/wasm/src/native_code/transactions/transaction_request.rs deleted file mode 100644 index 37b58f879..000000000 --- a/wasm/src/native_code/transactions/transaction_request.rs +++ /dev/null @@ -1,170 +0,0 @@ -use alloc::collections::BTreeMap; - -use miden_objects::{ - accounts::AccountId, - assets::{Asset, FungibleAsset}, - notes::{Note, NoteId, NoteType}, - transaction::{TransactionArgs, TransactionScript}, - vm::AdviceMap, - Word, -}; - -// MASM SCRIPTS -// -------------------------------------------------------------------------------------------- - -pub const AUTH_CONSUME_NOTES_SCRIPT: &str = - include_str!("asm/transaction_scripts/auth_consume_notes.masm"); -pub const DISTRIBUTE_FUNGIBLE_ASSET_SCRIPT: &str = - include_str!("asm/transaction_scripts/distribute_fungible_asset.masm"); -pub const AUTH_SEND_ASSET_SCRIPT: &str = - include_str!("asm/transaction_scripts/auth_send_asset.masm"); - -// TRANSACTION REQUEST -// -------------------------------------------------------------------------------------------- - -pub type NoteArgs = Word; - -/// Represents the most general way of defining an executable transaction -#[derive(Clone, Debug)] -pub struct TransactionRequest { - /// ID of the account against which the transactions is to be executed. - account_id: AccountId, - /// Notes to be consumed by the transaction together with their (optional) arguments. - input_notes: BTreeMap>, - /// A list of notes expected to be generated by the transactions. - expected_output_notes: Vec, - /// Optional transaction script (together with its arguments). - tx_script: Option, -} - -impl TransactionRequest { - // CONSTRUCTORS - // -------------------------------------------------------------------------------------------- - - pub fn new( - account_id: AccountId, - input_notes: BTreeMap>, - expected_output_notes: Vec, - tx_script: Option, - ) -> Self { - Self { - account_id, - input_notes, - expected_output_notes, - tx_script, - } - } - - // PUBLIC ACCESSORS - // -------------------------------------------------------------------------------------------- - - pub fn account_id(&self) -> AccountId { - self.account_id - } - - pub fn input_notes(&self) -> &BTreeMap> { - &self.input_notes - } - - pub fn get_input_note_ids(&self) -> Vec { - self.input_notes.keys().cloned().collect() - } - - pub fn get_note_args(&self) -> BTreeMap { - self.input_notes - .iter() - .filter_map(|(note, args)| args.map(|a| (*note, a))) - .collect() - } - - pub fn expected_output_notes(&self) -> &[Note] { - &self.expected_output_notes - } - - pub fn tx_script(&self) -> Option<&TransactionScript> { - self.tx_script.as_ref() - } -} - -impl From for TransactionArgs { - fn from(val: TransactionRequest) -> Self { - let note_args = val.get_note_args(); - let mut tx_args = TransactionArgs::new(val.tx_script, Some(note_args), AdviceMap::new()); - - let output_notes = val.expected_output_notes.into_iter(); - tx_args.extend_expected_output_notes(output_notes); - - tx_args - } -} - -// TRANSACTION TEMPLATE -// -------------------------------------------------------------------------------------------- - -#[derive(Clone, Debug)] -pub enum TransactionTemplate { - /// Consume the specified notes against an account. - ConsumeNotes(AccountId, Vec), - /// Mint fungible assets using a faucet account and creates a note with the specified - /// type that can be consumed by the target Account ID - MintFungibleAsset(FungibleAsset, AccountId, NoteType), - /// Creates a pay-to-id note with the specified type directed to a specific account - PayToId(PaymentTransactionData, NoteType), - /// Creates a pay-to-id note directed to a specific account, specifying a block height after - /// which the note can be recalled - PayToIdWithRecall(PaymentTransactionData, u32, NoteType), -} - -impl TransactionTemplate { - /// Returns the [AccountId] of the account which the transaction will be executed against - pub fn account_id(&self) -> AccountId { - match self { - TransactionTemplate::ConsumeNotes(account_id, _) => *account_id, - TransactionTemplate::MintFungibleAsset(asset, ..) => asset.faucet_id(), - TransactionTemplate::PayToId(payment_data, _) => payment_data.account_id(), - TransactionTemplate::PayToIdWithRecall(payment_data, ..) => payment_data.account_id(), - } - } -} - -// PAYMENT TRANSACTION DATA -// -------------------------------------------------------------------------------------------- - -#[derive(Clone, Debug)] -pub struct PaymentTransactionData { - asset: Asset, - sender_account_id: AccountId, - target_account_id: AccountId, -} - -impl PaymentTransactionData { - // CONSTRUCTORS - // -------------------------------------------------------------------------------------------- - - pub fn new( - asset: Asset, - sender_account_id: AccountId, - target_account_id: AccountId, - ) -> PaymentTransactionData { - PaymentTransactionData { - asset, - sender_account_id, - target_account_id, - } - } - - /// Returns the executor [AccountId] - pub fn account_id(&self) -> AccountId { - self.sender_account_id - } - - /// Returns the target [AccountId] - pub fn target_account_id(&self) -> AccountId { - self.target_account_id - } - - /// Returns the transaction [Asset] - pub fn asset(&self) -> Asset { - self.asset - } -} diff --git a/wasm/src/native_code/utils.rs b/wasm/src/native_code/utils.rs deleted file mode 100644 index ea7205158..000000000 --- a/wasm/src/native_code/utils.rs +++ /dev/null @@ -1,100 +0,0 @@ -use super::{ - rpc::NodeRpcClient, - Client, - store::Store // TODO: Add AuthInfo -}; - -// pub fn build_transaction_template( -// client: &Client, -// transaction_type: &TransactionType, -// ) -> Result { -// match transaction_type { -// TransactionType::P2ID { -// sender_account_id, -// target_account_id, -// faucet_id, -// amount, -// } => { -// let faucet_id = AccountId::from_hex(faucet_id).map_err(|err| err.to_string())?; -// let fungible_asset = -// FungibleAsset::new(faucet_id, *amount).map_err(|err| err.to_string())?.into(); -// let sender_account_id = -// AccountId::from_hex(sender_account_id).map_err(|err| err.to_string())?; -// let target_account_id = -// AccountId::from_hex(target_account_id).map_err(|err| err.to_string())?; -// let payment_transaction = -// PaymentTransactionData::new(fungible_asset, sender_account_id, target_account_id); - -// Ok(TransactionTemplate::PayToId(payment_transaction)) -// }, -// TransactionType::P2IDR => { -// todo!() -// }, -// TransactionType::Mint { -// faucet_id, -// target_account_id, -// amount, -// } => { -// let faucet_id = AccountId::from_hex(faucet_id).map_err(|err| err.to_string())?; -// let fungible_asset = -// FungibleAsset::new(faucet_id, *amount).map_err(|err| err.to_string())?; -// let target_account_id = -// AccountId::from_hex(target_account_id).map_err(|err| err.to_string())?; - -// Ok(TransactionTemplate::MintFungibleAsset { -// asset: fungible_asset, -// target_account_id, -// }) -// }, -// TransactionType::ConsumeNotes { -// account_id, -// list_of_notes, -// } => { -// let list_of_notes = list_of_notes -// .iter() -// .map(|note_id| { -// get_note_with_id_prefix(client, note_id) -// .map(|note_record| note_record.note_id()) -// .map_err(|err| err.to_string()) -// }) -// .collect::, _>>()?; - -// let account_id = AccountId::from_hex(account_id).map_err(|err| err.to_string())?; - -// Ok(TransactionTemplate::ConsumeNotes(account_id, list_of_notes)) -// }, -// } -// } - -// pub(crate) fn get_note_with_id_prefix( -// client: &Client, -// note_id_prefix: &str, -// ) -> Result { -// let input_note_records = client -// .get_input_notes(ClientNoteFilter::All) -// .map_err(|err| { -// tracing::error!("Error when fetching all notes from the store: {err}"); -// NoteIdPrefixFetchError::NoMatch(note_id_prefix.to_string()) -// })? -// .into_iter() -// .filter(|note_record| note_record.note_id().to_hex().starts_with(note_id_prefix)) -// .collect::>(); - -// if input_note_records.is_empty() { -// return Err(NoteIdPrefixFetchError::NoMatch(note_id_prefix.to_string())); -// } -// if input_note_records.len() > 1 { -// let input_note_record_ids = input_note_records -// .iter() -// .map(|input_note_record| input_note_record.note_id()) -// .collect::>(); -// tracing::error!( -// "Multiple notes found for the prefix {}: {:?}", -// note_id_prefix, -// input_note_record_ids -// ); -// return Err(NoteIdPrefixFetchError::MultipleMatches(note_id_prefix.to_string())); -// } - -// Ok(input_note_records[0].clone()) -// } diff --git a/wasm/src/web_client/account.rs b/wasm/src/web_client/account.rs index fd049ae03..ae112d1d4 100644 --- a/wasm/src/web_client/account.rs +++ b/wasm/src/web_client/account.rs @@ -5,10 +5,9 @@ use base64::encode; use miden_objects::{accounts::{AccountData, AccountId}, assets::TokenSymbol, notes::NoteId}; use miden_tx::utils::{Deserializable, Serializable}; -use crate::native_code::accounts; -use crate::native_code::rpc::NodeRpcClient; -use crate::native_code::store::Store; -use crate::native_code::store::AuthInfo; +use miden_client::client::accounts; +use miden_client::client::rpc::NodeRpcClient; +use miden_client::store::Store; use serde::{Serialize, Deserialize}; use serde_wasm_bindgen::from_value; @@ -41,108 +40,11 @@ pub enum AccountTemplate { // RPC call. #[wasm_bindgen] impl WebClient { - pub async fn import_account( - &mut self, - account_bytes: JsValue - ) -> Result { - if let Some(ref mut client) = self.get_mut_inner() { - let account_bytes_result: Vec = from_value(account_bytes).unwrap(); - let account_data = AccountData::read_from_bytes(&account_bytes_result).map_err(|err| err.to_string())?; - let account_id = account_data.account.id().to_string(); - - match client.import_account(account_data).await { - Ok(_) => { - let message = format!("Imported account with ID: {}", account_id); - Ok(JsValue::from_str(&message)) - }, - Err(err) => { - let error_message = format!("Failed to import account: {:?}", err); - Err(JsValue::from_str(&error_message)) - - } - } - } else { - Err(JsValue::from_str("Client not initialized")) - } - } - - pub async fn new_account( - &mut self, - template: JsValue - ) -> Result { - if let Some(ref mut client) = self.get_mut_inner() { - let account_template_result: Result = from_value(template); - match account_template_result { - Ok(account_template) => { - let client_template = match account_template { - AccountTemplate::BasicImmutable { - storage_mode - } => accounts::AccountTemplate::BasicWallet { - mutable_code: false, - storage_mode: match storage_mode.as_str() { - "Local" => accounts::AccountStorageMode::Local, - "OnChain" => accounts::AccountStorageMode::OnChain, - _ => panic!("Invalid storage mode") - }, - }, - AccountTemplate::BasicMutable { - storage_mode - } => accounts::AccountTemplate::BasicWallet { - mutable_code: true, - storage_mode: match storage_mode.as_str() { - "Local" => accounts::AccountStorageMode::Local, - "OnChain" => accounts::AccountStorageMode::OnChain, - _ => panic!("Invalid storage mode") - }, - }, - AccountTemplate::FungibleFaucet { - token_symbol, - decimals, - max_supply, - storage_mode - } => accounts::AccountTemplate::FungibleFaucet { - token_symbol: TokenSymbol::new(&token_symbol).unwrap(), - decimals: decimals.parse::().unwrap(), - max_supply: max_supply.parse::().unwrap(), - storage_mode: match storage_mode.as_str() { - "Local" => accounts::AccountStorageMode::Local, - "OnChain" => accounts::AccountStorageMode::OnChain, - _ => panic!("Invalid storage mode") - }, - }, - AccountTemplate::NonFungibleFaucet { - storage_mode - } => todo!(), - }; - - match client.new_account(client_template).await { - Ok((account, _)) => { - // Create a struct or tuple to hold both values - // Convert directly to JsValue - serde_wasm_bindgen::to_value(&account.id().to_string()) - .map_err(|e| JsValue::from_str(&e.to_string())) - }, - Err(err) => { - let error_message = format!("Failed to create new account: {:?}", err); - Err(JsValue::from_str(&error_message)) - } - } - }, - Err(e) => { - let error_message = format!("Failed to parse AccountTemplate: {:?}", e); - Err(JsValue::from_str(&error_message)) - } - } - } else { - Err(JsValue::from_str("Client not initialized")) - } - } - pub async fn get_accounts( &mut self ) -> Result { - if let Some(ref mut client) = self.get_mut_inner() { - let account_tuples = client.get_accounts().await.unwrap(); + if let Some(client) = self.get_mut_inner() { + let account_tuples = client.get_account_stubs().await.unwrap(); let accounts: Vec = account_tuples.into_iter().map(|(account, _)| { SerializedAccountStub::new( account.id().to_string(), @@ -166,7 +68,7 @@ impl WebClient { &mut self, account_id: String ) -> Result { - if let Some(ref mut client) = self.get_mut_inner() { + if let Some(client) = self.get_mut_inner() { let native_account_id = AccountId::from_hex(&account_id).unwrap(); let result = client.get_account(native_account_id).await.unwrap(); @@ -177,37 +79,4 @@ impl WebClient { Err(JsValue::from_str("Client not initialized")) } } - - pub async fn get_account_stub_by_id( - &mut self, - account_id: String - ) -> Result { - if let Some(ref mut client) = self.get_mut_inner() { - let native_account_id = AccountId::from_hex(&account_id).unwrap(); - - let result = client.get_account_stub_by_id(native_account_id).await.unwrap(); - - let word = result.1.map_or("No word".to_string(), |w| w[0].to_string()); - Ok(JsValue::from_str(&format!("ID: {}, Word: {}", result.0.id().to_string(), word))) - } else { - Err(JsValue::from_str("Client not initialized")) - } - } - - pub async fn get_account_auth( - &mut self, - account_id: String - ) -> Result { - if let Some(ref mut client) = self.get_mut_inner() { - let native_account_id = AccountId::from_hex(&account_id).unwrap(); - - let result = client.get_account_auth(native_account_id).await.unwrap(); - let mut bytes = Vec::new(); - result.write_into(&mut bytes); - let base64_encoded = encode(&bytes); - Ok(JsValue::from_str(&base64_encoded)) - } else { - Err(JsValue::from_str("Client not initialized")) - } - } } \ No newline at end of file diff --git a/wasm/src/web_client/examples.rs b/wasm/src/web_client/examples.rs deleted file mode 100644 index a59b89422..000000000 --- a/wasm/src/web_client/examples.rs +++ /dev/null @@ -1,19 +0,0 @@ -use super::WebClient; -use wasm_bindgen::prelude::*; - -#[wasm_bindgen] -impl WebClient { - pub async fn test_store_and_rpc(&mut self) -> Result { - if let Some(ref mut client) = self.get_mut_inner() { - let _ = client.store.insert_string("Test string".to_string()).await - .map(|_| JsValue::from_str("Test string inserted successfully")) - .map_err(|_| JsValue::from_str("Failed to insert test string")); - - client.rpc_api.test_rpc().await // This is the new line - .map(|_| JsValue::from_str("RPC call successful")) - .map_err(|_| JsValue::from_str("RPC call failed")) - } else { - Err(JsValue::from_str("Client not initialized")) - } - } -} \ No newline at end of file diff --git a/wasm/src/web_client/export.rs b/wasm/src/web_client/export.rs new file mode 100644 index 000000000..2a9f20c4d --- /dev/null +++ b/wasm/src/web_client/export.rs @@ -0,0 +1,37 @@ +use wasm_bindgen::*; +use wasm_bindgen::prelude::*; + +use miden_client::store::{InputNoteRecord, NoteFilter}; +use miden_objects::Digest; + +use crate::web_client::WebClient; + +#[wasm_bindgen] +impl WebClient { + pub async fn export_note( + &mut self, + note_id: String + ) -> Result { + if let Some(client) = self.get_mut_inner() { + let note_id = Digest::try_from(note_id) + .map_err(|err| format!("Failed to parse input note id: {}", err))? + .into(); + + let output_note = client + .get_output_notes(NoteFilter::Unique(note_id))? + .pop() + .expect("should have an output note"); + + // Convert output note into InputNoteRecord before exporting + let input_note: InputNoteRecord = output_note + .try_into() + .map_err(|_err| format!("Can't export note with ID {}", note_id.to_hex()))?; + + let input_note_bytes = input_note.to_bytes(); + + Ok(input_note_bytes) + } else { + Err(JsValue::from_str("Client not initialized")) + } + } +} \ No newline at end of file diff --git a/wasm/src/web_client/import.rs b/wasm/src/web_client/import.rs new file mode 100644 index 000000000..9c195ef96 --- /dev/null +++ b/wasm/src/web_client/import.rs @@ -0,0 +1,65 @@ +use serde_wasm_bindgen::from_value; +use wasm_bindgen::*; +use wasm_bindgen::prelude::*; + +use miden_objects::{ + accounts::AccountData, + utils::Deserializable +}; +use miden_client::store::note_record::InputNoteRecord; + +use crate::web_client::WebClient; + +#[wasm_bindgen] +impl WebClient { + pub async fn import_account( + &mut self, + account_bytes: JsValue + ) -> Result { + if let Some(client) = self.get_mut_inner() { + let account_bytes_result: Vec = from_value(account_bytes).unwrap(); + let account_data = AccountData::read_from_bytes(&account_bytes_result).map_err(|err| err.to_string())?; + let account_id = account_data.account.id().to_string(); + + match client.import_account(account_data).await { + Ok(_) => { + let message = format!("Imported account with ID: {}", account_id); + Ok(JsValue::from_str(&message)) + }, + Err(err) => { + let error_message = format!("Failed to import account: {:?}", err); + Err(JsValue::from_str(&error_message)) + } + } + } else { + Err(JsValue::from_str("Client not initialized")) + } + } + + pub async fn import_note( + &mut self, + note_bytes: JsValue, + verify: bool + ) -> Result { + if let Some(client) = self.get_mut_inner() { + let note_bytes_result: Vec = from_value(note_bytes).unwrap(); + let input_note_record = + InputNoteRecord::read_from_bytes(¬e_bytes_result).map_err(|err| err.to_string())?; + let note_id = input_note_record.id(); + + match client.import_input_note(input_note_record, verify).await { + Ok(_) => { + let message = format!("Imported note with ID: {}", note_id); + Ok(JsValue::from_str(&message)) + }, + Err(err) => { + let error_message = format!("Failed to import note: {:?}", err); + Err(JsValue::from_str(&error_message)) + + } + } + } else { + Err(JsValue::from_str("Client not initialized")) + } + } +} \ No newline at end of file diff --git a/wasm/src/web_client/mod.rs b/wasm/src/web_client/mod.rs index c2751d1f8..7839ccc8d 100644 --- a/wasm/src/web_client/mod.rs +++ b/wasm/src/web_client/mod.rs @@ -1,15 +1,17 @@ +use alloc::rc::Rc; use wasm_bindgen::prelude::*; use miden_objects::crypto::rand::RpoRandomCoin; - -use crate::native_code::{ - Client, - get_random_coin -}; +use miden_tx::TransactionAuthenticator; +use miden_client::client::{Client, get_random_coin, store_authenticator::StoreAuthenticator}; pub mod account; +pub mod export; +pub mod import; +pub mod new_account; +pub mod new_transactions; pub mod notes; -pub mod transactions; pub mod sync; +pub mod transactions; pub mod store; pub mod rpc; pub mod models; @@ -23,7 +25,7 @@ use rpc::WebRpcClient; #[wasm_bindgen] pub struct WebClient { - inner: Option> + inner: Option>> } #[wasm_bindgen] @@ -34,7 +36,7 @@ impl WebClient { } // Getter for the inner client, used internally for operations - pub(crate) fn get_mut_inner(&mut self) -> Option<&mut Client> { + pub(crate) fn get_mut_inner(&mut self) -> Option<&mut Client>> { self.inner.as_mut() } @@ -45,10 +47,11 @@ impl WebClient { ) -> Result { let rng = get_random_coin(); let web_store: WebStore = WebStore::new().await.map_err(|_| JsValue::from_str("Failed to initialize WebStore"))?; + let web_store = Rc::new(web_store); + let authenticator: StoreAuthenticator = StoreAuthenticator::new_with_rng(web_store.clone(), rng); let web_rpc_client = WebRpcClient::new(&node_url.unwrap_or_else(|| "http://localhost:57291".to_string())); - let executor_store = WebStore::new().await.map_err(|_| JsValue::from_str("Failed to initialize ExecutorStore"))?; - self.inner = Some(Client::new(web_rpc_client, rng, web_store, executor_store)); + self.inner = Some(Client::new(web_rpc_client, rng, web_store, authenticator, false)); Ok(JsValue::from_str("Client created successfully")) } diff --git a/wasm/src/web_client/new_account.rs b/wasm/src/web_client/new_account.rs new file mode 100644 index 000000000..65726fc57 --- /dev/null +++ b/wasm/src/web_client/new_account.rs @@ -0,0 +1,88 @@ +use wasm_bindgen::*; +use wasm_bindgen::prelude::*; +use super::WebClient; + +use miden_objects::{ + accounts::AccountStorageType, + assets::TokenSymbol, +}; +use miden_client::client::accounts::{AccountTemplate, AccountStorageMode}; + +#[wasm_bindgen] +impl WebClient { + pub async fn new_wallet( + &mut self, + storage_mode: String, + mutable: bool + ) -> Result { + if let Some(client) = self.get_mut_inner() { + let client_template = AccountTemplate::BasicWallet { + mutable_code: mutable, + storage_mode: match storage_mode.as_str() { + "OffChain" => AccountStorageMode::Local, + "OnChain" => AccountStorageMode::OnChain, + _ => return Err(JsValue::from_str("Invalid storage mode")) + }, + }; + + match client.new_account(client_template).await { + Ok((account, _)) => { + // Create a struct or tuple to hold both values + // Convert directly to JsValue + serde_wasm_bindgen::to_value(&account.id().to_string()) + .map_err(|e| JsValue::from_str(&e.to_string())) + }, + Err(err) => { + let error_message = format!("Failed to create new account: {:?}", err); + Err(JsValue::from_str(&error_message)) + } + } + } else { + Err(JsValue::from_str("Client not initialized")) + } + } + + pub async fn new_faucet( + &mut self, + storage_type: String, + non_fungible: bool, + token_symbol: String, + decimals: String, + max_supply: String + ) -> Result { + if non_fungible { + return Err(JsValue::from_str("Non-fungible faucets are not supported yet")); + } + + if let Some(client) = self.get_mut_inner() { + let client_template = AccountTemplate::FungibleFaucet { + token_symbol: TokenSymbol::new(&token_symbol) + .map_err(|e| JsValue::from_str(&e.to_string()))?, + decimals: decimals.parse::() + .map_err(|e| JsValue::from_str(&e.to_string()))?, + max_supply: max_supply.parse::() + .map_err(|e| JsValue::from_str(&e.to_string()))?, + storage_mode: match storage_type.as_str() { // Note: Fixed typo in variable name + "OffChain" => AccountStorageType::OffChain, + "OnChain" => AccountStorageType::OnChain, + _ => return Err(JsValue::from_str("Invalid storage mode")), + }, + }; + + match client.new_account(client_template).await { + Ok((account, _)) => { + // Create a struct or tuple to hold both values + // Convert directly to JsValue + serde_wasm_bindgen::to_value(&account.id().to_string()) + .map_err(|e| JsValue::from_str(&e.to_string())) + }, + Err(err) => { + let error_message = format!("Failed to create new account: {:?}", err); + Err(JsValue::from_str(&error_message)) + } + } + } else { + Err(JsValue::from_str("Client not initialized")) + } + } +} \ No newline at end of file diff --git a/wasm/src/web_client/new_transactions.rs b/wasm/src/web_client/new_transactions.rs new file mode 100644 index 000000000..b0854a6de --- /dev/null +++ b/wasm/src/web_client/new_transactions.rs @@ -0,0 +1,190 @@ +use wasm_bindgen::*; +use wasm_bindgen::prelude::*; + +use miden_objects::{ + accounts::AccountId, + assets::FungibleAsset, + notes::{NoteId, NoteType as MidenNoteType} +}; +use miden_client::client::{ + get_input_note_with_id_prefix, + transactions::transaction_request::{PaymentTransactionData, SwapTransactionData, TransactionTemplate} + }; + +use super::WebClient; +use crate::web_client::models::transactions::NewTransactionResult; + +#[wasm_bindgen] +impl WebClient { + pub async fn new_mint_transaction( + &mut self, + target_account_id: String, + faucet_id: String, + note_type: String, + amount: String, + ) -> Result { + if let Some(client) = self.get_mut_inner() { + let target_account_id = AccountId::from_hex(&target_account_id).unwrap(); + let faucet_id = AccountId::from_hex(&faucet_id).unwrap(); + let amount_as_u64: u64 = amount.parse::().map_err(|err| err.to_string())?; + let fungible_asset = FungibleAsset::new(faucet_id, amount_as_u64).map_err(|err| err.to_string())?; + let note_type = match note_type.as_str() { + "Public" => MidenNoteType::Public, + "Private" => MidenNoteType::OffChain, + _ => MidenNoteType::OffChain + }; + + let mint_transaction_template = TransactionTemplate::MintFungibleAsset( + fungible_asset, + target_account_id, + note_type + ); + + let mint_transaction_request = client.build_transaction_request(mint_transaction_template.clone()).await.unwrap(); + let mint_transaction_execution_result = client.new_transaction(mint_transaction_request).await.unwrap(); + let result = NewTransactionResult::new( + mint_transaction_execution_result.executed_transaction().id().to_string(), + mint_transaction_execution_result.created_notes().iter().map(|note| note.id().to_string()).collect() + ); + + client.submit_transaction(mint_transaction_execution_result).await.unwrap(); + + Ok(result) + } else { + Err(JsValue::from_str("Client not initialized")) + } + } + + pub async fn new_send_transaction( + &mut self, + sender_account_id: String, + target_account_id: String, + faucet_id: String, + note_type: String, + amount: String, + recall_height: Option + ) -> Result { + if let Some(client) = self.get_mut_inner() { + let sender_account_id = AccountId::from_hex(&sender_account_id).unwrap(); + let target_account_id = AccountId::from_hex(&target_account_id).unwrap(); + let faucet_id = AccountId::from_hex(&faucet_id).unwrap(); + let amount_as_u64: u64 = amount.parse::().map_err(|err| err.to_string())?; + let fungible_asset = FungibleAsset::new(faucet_id, amount_as_u64).map_err(|err| err.to_string())?; + let note_type = match note_type.as_str() { + "Public" => MidenNoteType::Public, + "Private" => MidenNoteType::OffChain, + _ => MidenNoteType::OffChain + }; + let payment_transaction = PaymentTransactionData::new(fungible_asset, sender_account_id, target_account_id); + + let send_transaction_template: TransactionTemplate; + if let Some(recall_height) = recall_height { + send_transaction_template = TransactionTemplate::PayToIdWithRecall( + payment_transaction, + recall_height, + note_type, + ); + } else { + send_transaction_template = TransactionTemplate::PayToId( + payment_transaction, + note_type, + ); + } + + let send_transaction_request = client.build_transaction_request(send_transaction_template.clone()).await.unwrap(); + let send_transaction_execution_result = client.new_transaction(send_transaction_request).await.unwrap(); + let result = NewTransactionResult::new( + send_transaction_execution_result.executed_transaction().id().to_string(), + send_transaction_execution_result.created_notes().iter().map(|note| note.id().to_string()).collect() + ); + + client.submit_transaction(send_transaction_execution_result).await.unwrap(); + + Ok(result) + } else { + Err(JsValue::from_str("Client not initialized")) + } + } + + pub async fn new_consume_transaction( + &mut self, + account_id: String, + list_of_notes: Vec, + ) -> Result { + if let Some(client) = self.get_mut_inner() { + let account_id = AccountId::from_hex(&account_id).unwrap(); + let list_of_notes = list_of_notes + .iter() + .map(|note_id| { + get_input_note_with_id_prefix(client, note_id) + .map(|note_record| note_record.id()) + .map_err(|err| err.to_string()) + }) + .collect::, _>>()?; + + let consume_transaction_template = TransactionTemplate::ConsumeNotes(account_id, list_of_notes); + + let consume_transaction_request = client.build_transaction_request(consume_transaction_template.clone()).await.unwrap(); + let consume_transaction_execution_result = client.new_transaction(consume_transaction_request).await.unwrap(); + let result = NewTransactionResult::new( + consume_transaction_execution_result.executed_transaction().id().to_string(), + consume_transaction_execution_result.created_notes().iter().map(|note| note.id().to_string()).collect() + ); + + client.submit_transaction(consume_transaction_execution_result).await.unwrap(); + + Ok(result) + } else { + Err(JsValue::from_str("Client not initialized")) + } + } + + pub async fn new_swap_transaction( + &mut self, + sender_account_id: String, + offered_asset_faucet_id: String, + offered_asset_amount: String, + requested_asset_faucet_id: String, + requested_asset_amount: String, + note_type: String, + ) -> Result { + if let Some(client) = self.get_mut_inner() { + let sender_account_id = AccountId::from_hex(&sender_account_id).unwrap(); + let offered_asset_faucet_id = AccountId::from_hex(&offered_asset_faucet_id).unwrap(); + let offered_asset_amount_as_u64: u64 = offered_asset_amount.parse::().map_err(|err| err.to_string())?; + let requested_asset_faucet_id = AccountId::from_hex(&requested_asset_faucet_id).unwrap(); + let requested_asset_amount_as_u64: u64 = requested_asset_amount.parse::().map_err(|err| err.to_string())?; + let note_type = match note_type.as_str() { + "Public" => MidenNoteType::Public, + "Private" => MidenNoteType::OffChain, + _ => MidenNoteType::OffChain + }; + let offered_fungible_asset = FungibleAsset::new(offered_asset_faucet_id, offered_asset_amount_as_u64) + .map_err(|err| err.to_string())? + .into(); + let requested_fungible_asset = FungibleAsset::new(requested_asset_faucet_id, requested_asset_amount_as_u64) + .map_err(|err| err.to_string())? + .into(); + let swap_transaction = SwapTransactionData::new( + sender_account_id, + offered_fungible_asset, + requested_fungible_asset, + ); + + let swap_transaction_template = TransactionTemplate::Swap(swap_transaction, note_type); + + let swap_transaction_request = client.build_transaction_request(swap_transaction_template.clone()).await.unwrap(); + let swap_transaction_execution_result = client.new_transaction(swap_transaction_request).await.unwrap(); + let result = NewTransactionResult::new( + swap_transaction_execution_result.executed_transaction().id().to_string(), + swap_transaction_execution_result.created_notes().iter().map(|note| note.id().to_string()).collect() + ); + + client.submit_transaction(swap_transaction_execution_result).await.unwrap(); + + Ok(result) + } else { + Err(JsValue::from_str("Client not initialized")) + } + } +} \ No newline at end of file diff --git a/wasm/src/web_client/notes.rs b/wasm/src/web_client/notes.rs index a6035c8a5..07406f4cf 100644 --- a/wasm/src/web_client/notes.rs +++ b/wasm/src/web_client/notes.rs @@ -5,10 +5,8 @@ use serde::{Serialize, Deserialize}; use serde_wasm_bindgen::from_value; use web_sys::console; -use crate::native_code::store::{ - NoteFilter, - note_record::InputNoteRecord -}; +use miden_client::store::InputNoteRecord; +use miden_client::store::NoteFilter; use super::WebClient; @@ -26,7 +24,7 @@ impl WebClient { &mut self, filter: JsValue ) -> Result { - if let Some(ref mut client) = self.get_mut_inner() { + if let Some(client) = self.get_mut_inner() { let filter: WebClientNoteFilter = from_value(filter).unwrap(); let native_filter = match filter { WebClientNoteFilter::Pending => NoteFilter::Pending, @@ -51,7 +49,7 @@ impl WebClient { &mut self, note_id: String ) -> Result { - if let Some(ref mut client) = self.get_mut_inner() { + if let Some(client) = self.get_mut_inner() { let note_id: NoteId = Digest::try_from(note_id) .map_err(|err| format!("Failed to parse input note id: {}", err))? .into(); @@ -63,43 +61,42 @@ impl WebClient { } } - pub async fn import_input_note( - &mut self, - note_bytes: JsValue + pub async fn get_output_notes( + &mut self, + filter: JsValue ) -> Result { - if let Some(ref mut client) = self.get_mut_inner() { - let note_bytes_result: Vec = from_value(note_bytes).unwrap(); - let note_data = InputNoteRecord::read_from_bytes(¬e_bytes_result).map_err(|err| err.to_string())?; - let note_id_as_str = note_data.id().to_string(); + if let Some(client) = self.get_mut_inner() { + let filter: WebClientNoteFilter = from_value(filter).unwrap(); + let native_filter = match filter { + WebClientNoteFilter::Pending => NoteFilter::Pending, + WebClientNoteFilter::Committed => NoteFilter::Committed, + WebClientNoteFilter::Consumed => NoteFilter::Consumed, + WebClientNoteFilter::All => NoteFilter::All + }; - match client.import_input_note(note_data).await { - Ok(_) => { - let message = format!("Import note with ID: {}", note_id_as_str); - Ok(JsValue::from_str(&message)) - }, - Err(err) => Err(JsValue::from_str(&err.to_string())) - } + let notes: Vec = client.get_output_notes(native_filter).await.unwrap(); + let note_ids = notes.iter().map(|note| + note.id().to_string() + ).collect::>(); + + // Convert the Vec to JsValue + serde_wasm_bindgen::to_value(¬e_ids).map_err(|e| JsValue::from_str(&e.to_string())) } else { Err(JsValue::from_str("Client not initialized")) } } - pub async fn export_input_note( + pub async fn get_output_note( &mut self, - note_id: &str - ) -> Result{ - if let Some(ref mut client) = self.get_mut_inner() { - + note_id: String + ) -> Result { + if let Some(client) = self.get_mut_inner() { let note_id: NoteId = Digest::try_from(note_id) - .map_err(|err| format!("Failed to parse input note id: {}", err))? + .map_err(|err| format!("Failed to parse output note id: {}", err))? .into(); + let note: InputNoteRecord = client.get_output_note(note_id).await.unwrap(); - let note: InputNoteRecord = client.get_input_note(note_id).await.unwrap(); - - let note_bytes = ¬e.to_bytes(); - - - serde_wasm_bindgen::to_value(¬e_bytes).map_err(|e| JsValue::from_str(&e.to_string())) + serde_wasm_bindgen::to_value(¬e.id().to_string()).map_err(|e| JsValue::from_str(&e.to_string())) } else { Err(JsValue::from_str("Client not initialized")) } diff --git a/wasm/src/web_client/rpc/domain/accounts.rs b/wasm/src/web_client/rpc/domain/accounts.rs index cffc99c46..497a2eca7 100644 --- a/wasm/src/web_client/rpc/domain/accounts.rs +++ b/wasm/src/web_client/rpc/domain/accounts.rs @@ -4,22 +4,21 @@ use super::format_opt; use miden_objects::{ accounts::{Account, AccountId}, crypto::{hash::rpo::RpoDigest, merkle::MerklePath}, - transaction::AccountDetails, utils::Serializable, Digest, }; -use crate::native_code::errors::{ConversionError, MissingFieldHelper}; +use miden_client::errors::ConversionError; +// use crate::native_code::errors::{ConversionError, MissingFieldHelper}; use crate::web_client::rpc::client_grpc::{ - account::{ - AccountId as AccountIdPb, - AccountInfo as AccountInfoPb, - AccountSummary as AccountSummaryPb, - }, - requests::AccountUpdate, - responses::{AccountBlockInputRecord, AccountTransactionInputRecord}, - }; + account::{ + AccountId as AccountIdPb, + AccountInfo as AccountInfoPb, + AccountSummary as AccountSummaryPb, + }, + responses::{AccountBlockInputRecord, AccountTransactionInputRecord}, +}; // ACCOUNT ID // ================================================================================================ @@ -109,23 +108,6 @@ impl From<&AccountInfo> for AccountInfoPb { } } -#[derive(Debug, Clone, PartialEq, Eq)] -pub struct AccountUpdateDetails { - pub account_id: AccountId, - pub final_state_hash: Digest, - pub details: Option, -} - -impl From<&AccountUpdateDetails> for AccountUpdate { - fn from(update: &AccountUpdateDetails) -> Self { - Self { - account_id: Some(update.account_id.into()), - account_hash: Some(update.final_state_hash.into()), - details: update.details.as_ref().map(|details| details.to_bytes()), - } - } -} - // ACCOUNT INPUT RECORD // ================================================================================================ @@ -224,25 +206,3 @@ impl TryFrom for AccountState { Ok(Self { account_id, account_hash }) } } - -impl TryFrom for AccountState { - type Error = ConversionError; - - fn try_from(value: AccountUpdate) -> Result { - Ok(Self { - account_id: value - .account_id - .ok_or(AccountUpdate::missing_field(stringify!(account_id)))? - .try_into()?, - account_hash: value.account_hash.map(TryInto::try_into).transpose()?, - }) - } -} - -impl TryFrom<&AccountUpdate> for AccountState { - type Error = ConversionError; - - fn try_from(value: &AccountUpdate) -> Result { - value.clone().try_into() - } -} diff --git a/wasm/src/web_client/rpc/domain/blocks.rs b/wasm/src/web_client/rpc/domain/blocks.rs index 89d3b103e..297b2e6ac 100644 --- a/wasm/src/web_client/rpc/domain/blocks.rs +++ b/wasm/src/web_client/rpc/domain/blocks.rs @@ -1,6 +1,7 @@ use miden_objects::BlockHeader; +use miden_client::errors::ConversionError; -use crate::native_code::errors::{ConversionError, MissingFieldHelper}; +// use crate::native_code::errors::{ConversionError, MissingFieldHelper}; use crate::web_client::rpc::client_grpc::block_header; // BLOCK HEADER @@ -9,6 +10,7 @@ use crate::web_client::rpc::client_grpc::block_header; impl From<&BlockHeader> for block_header::BlockHeader { fn from(header: &BlockHeader) -> Self { Self { + version: header.version(), prev_hash: Some(header.prev_hash().into()), block_num: header.block_num(), chain_root: Some(header.chain_root().into()), @@ -17,10 +19,7 @@ impl From<&BlockHeader> for block_header::BlockHeader { note_root: Some(header.note_root().into()), batch_root: Some(header.batch_root().into()), proof_hash: Some(header.proof_hash().into()), - version: u64::from(header.version()) - .try_into() - .expect("Failed to convert BlockHeader.version into u32"), - timestamp: header.timestamp().into(), + timestamp: header.timestamp(), } } } @@ -44,6 +43,7 @@ impl TryFrom for BlockHeader { fn try_from(value: block_header::BlockHeader) -> Result { Ok(BlockHeader::new( + value.version, value .prev_hash .ok_or(block_header::BlockHeader::missing_field(stringify!(prev_hash)))? @@ -73,11 +73,7 @@ impl TryFrom for BlockHeader { .proof_hash .ok_or(block_header::BlockHeader::missing_field(stringify!(proof_hash)))? .try_into()?, - value.version.into(), - value - .timestamp - .try_into() - .expect("timestamp value is greater than or equal to the field modulus"), + value.timestamp, )) } } diff --git a/wasm/src/web_client/rpc/domain/digest.rs b/wasm/src/web_client/rpc/domain/digest.rs index 7483958e5..718d17cb7 100644 --- a/wasm/src/web_client/rpc/domain/digest.rs +++ b/wasm/src/web_client/rpc/domain/digest.rs @@ -3,7 +3,7 @@ use std::fmt::{Debug, Display, Formatter}; use hex::{FromHex, ToHex}; use miden_objects::{notes::NoteId, Digest, Felt, StarkField}; -use crate::native_code::errors::ConversionError; +use miden_client::errors::ConversionError; use crate::web_client::rpc::client_grpc::digest; // CONSTANTS diff --git a/wasm/src/web_client/rpc/domain/merkle.rs b/wasm/src/web_client/rpc/domain/merkle.rs index e3bf20261..c436d3c7b 100644 --- a/wasm/src/web_client/rpc/domain/merkle.rs +++ b/wasm/src/web_client/rpc/domain/merkle.rs @@ -3,9 +3,11 @@ use miden_objects::{ Digest, Word, }; +use miden_client::errors::ConversionError; + use super::{convert, try_convert}; -use crate::native_code::errors::{ConversionError, MissingFieldHelper}; +// use crate::native_code::errors::{ConversionError, MissingFieldHelper}; use crate::web_client::rpc::client_grpc; diff --git a/wasm/src/web_client/rpc/domain/mod.rs b/wasm/src/web_client/rpc/domain/mod.rs index 828fd0790..8181ba584 100644 --- a/wasm/src/web_client/rpc/domain/mod.rs +++ b/wasm/src/web_client/rpc/domain/mod.rs @@ -5,6 +5,7 @@ pub mod blocks; pub mod digest; pub mod merkle; pub mod nullifiers; +pub mod notes; // UTILITIES // ================================================================================================ diff --git a/wasm/src/web_client/rpc/domain/notes.rs b/wasm/src/web_client/rpc/domain/notes.rs new file mode 100644 index 000000000..001061085 --- /dev/null +++ b/wasm/src/web_client/rpc/domain/notes.rs @@ -0,0 +1,34 @@ +use miden_objects::{ + notes::{NoteMetadata, NoteTag, NoteType}, + Felt, +}; +use miden_client::errors::ConversionError; + +// use crate::native_code::errors::{ConversionError, MissingFieldHelper}; + +impl TryFrom for NoteMetadata { + type Error = ConversionError; + + fn try_from(value: crate::web_client::rpc::client_grpc::note::NoteMetadata) -> Result { + let sender = value + .sender + .ok_or_else(|| crate::web_client::rpc::client_grpc::note::NoteMetadata::missing_field("Sender"))? + .try_into()?; + let note_type = NoteType::try_from(value.note_type as u64)?; + let tag = NoteTag::from(value.tag); + let aux = Felt::try_from(value.aux).map_err(|_| ConversionError::NotAValidFelt)?; + + Ok(NoteMetadata::new(sender, note_type, tag, aux)?) + } +} + +impl From for crate::web_client::rpc::client_grpc::note::NoteMetadata { + fn from(val: NoteMetadata) -> Self { + let sender = Some(val.sender().into()); + let note_type = val.note_type() as u32; + let tag = val.tag().into(); + let aux = val.aux().into(); + + crate::web_client::rpc::client_grpc::note::NoteMetadata { sender, note_type, tag, aux } + } +} \ No newline at end of file diff --git a/wasm/src/web_client/rpc/domain/nullifiers.rs b/wasm/src/web_client/rpc/domain/nullifiers.rs index c39d8ff3b..10f469a23 100644 --- a/wasm/src/web_client/rpc/domain/nullifiers.rs +++ b/wasm/src/web_client/rpc/domain/nullifiers.rs @@ -2,8 +2,9 @@ use miden_objects::{ crypto::{hash::rpo::RpoDigest, merkle::SmtProof}, notes::Nullifier, }; +use miden_client::errors::ConversionError; -use crate::native_code::errors::{ConversionError, MissingFieldHelper}; +// use crate::native_code::errors::{ConversionError, MissingFieldHelper}; use crate::web_client::rpc::client_grpc::{digest::Digest, responses::NullifierBlockInputRecord}; diff --git a/wasm/src/web_client/rpc/mod.rs b/wasm/src/web_client/rpc/mod.rs index 1ff2ee6f2..da51e3bbc 100644 --- a/wasm/src/web_client/rpc/mod.rs +++ b/wasm/src/web_client/rpc/mod.rs @@ -7,6 +7,7 @@ use wasm_bindgen_futures::*; use miden_objects::{ accounts::{Account, AccountId}, + crypto::merkle::{MerklePath, MmrProof}, notes::{Note, NoteId, NoteMetadata, NoteTag, NoteType}, transaction::ProvenTransaction, utils::Deserializable, @@ -14,13 +15,17 @@ use miden_objects::{ }; use miden_tx::utils::Serializable; -use crate::native_code::{ +use miden_client::{ + client::rpc::{AccountUpdateSummary, AccountDetails, CommittedNote, NodeRpcClient, NodeRpcClientEndpoint, NoteDetails, NoteInclusionDetails, StateSyncInfo}, errors::{ConversionError, NodeRpcClientError}, - rpc::{ - CommittedNote, NodeRpcClient, NodeRpcClientEndpoint, NoteDetails, NoteInclusionDetails, - StateSyncInfo - }, }; +// use crate::native_code::{ +// errors::{ConversionError, NodeRpcClientError}, +// rpc::{ +// CommittedNote, NodeRpcClient, NodeRpcClientEndpoint, NoteDetails, NoteInclusionDetails, +// StateSyncInfo +// }, +// }; use client_grpc::{ requests::{ @@ -59,17 +64,6 @@ impl WebRpcClient { #[async_trait(?Send)] impl NodeRpcClient for WebRpcClient { - async fn test_rpc(&mut self) -> Result<(), JsValue> { - // Now correctly handling the Promise returned by test_rpc - let promise = test_rpc("https://www.google.com".to_string()); - let result = JsFuture::from(promise).await; - - match result { - Ok(_) => Ok(()), - Err(e) => Err(e), - } - } - async fn submit_proven_transaction( &mut self, proven_transaction: ProvenTransaction, @@ -93,28 +87,56 @@ impl NodeRpcClient for WebRpcClient { async fn get_block_header_by_number( &mut self, block_num: Option, + include_mmr_proof: bool, ) -> Result { let mut query_client = self.build_api_client(); let request = GetBlockHeaderByNumberRequest { - block_num: block_num, + block_num, + include_mmr_proof: Some(include_mmr_proof), }; // Attempt to send the request and process the response - let response = query_client.get_block_header_by_number(request).await.map_err(|err| { + let api_response = query_client.get_block_header_by_number(request).await.map_err(|err| { // log to console all the properties of block header NodeRpcClientError::RequestError( NodeRpcClientEndpoint::GetBlockHeaderByNumber.to_string(), err.to_string(), ) })?; + + let response = api_response.into_inner(); - response - .into_inner() + let block_header: BlockHeader = response .block_header .ok_or(NodeRpcClientError::ExpectedFieldMissing("BlockHeader".into()))? .try_into() - .map_err(|err: ConversionError| NodeRpcClientError::ConversionFailure(err.to_string())) + .map_err(|err: ConversionError| { + NodeRpcClientError::ConversionFailure(err.to_string()) + })?; + + let mmr_proof = if include_mmr_proof { + let forest = response + .chain_length + .ok_or(NodeRpcClientError::ExpectedFieldMissing("ChainLength".into()))?; + let merkle_path: MerklePath = response + .mmr_path + .ok_or(NodeRpcClientError::ExpectedFieldMissing("MmrPath".into()))? + .try_into() + .map_err(|err: ConversionError| { + NodeRpcClientError::ConversionFailure(err.to_string()) + })?; + + Some(MmrProof { + forest: forest as usize, + position: block_header.block_num() as usize, + merkle_path, + }) + } else { + None + }; + + Ok((block_header, mmr_proof)) } async fn get_notes_by_id( @@ -127,18 +149,21 @@ impl NodeRpcClient for WebRpcClient { note_ids: note_ids.iter().map(|id| id.inner().into()).collect(), }; - let response = query_client.get_notes_by_id(request).await.map_err(|err| { + let api_response = query_client.get_notes_by_id(request).await.map_err(|err| { NodeRpcClientError::RequestError( NodeRpcClientEndpoint::GetBlockHeaderByNumber.to_string(), err.to_string(), ) })?; - let rpc_notes = response.into_inner().notes; + let rpc_notes = api_response.into_inner().notes; let mut response_notes = Vec::with_capacity(rpc_notes.len()); for note in rpc_notes { - let sender_id = - note.sender.ok_or(NodeRpcClientError::ExpectedFieldMissing("Sender".into()))?; + let sender_id = note + .metadata + .clone() + .and_then(|metadata| metadata.sender) + .ok_or(NodeRpcClientError::ExpectedFieldMissing("Metadata.Sender".into()))?; let inclusion_details = { let merkle_path = note @@ -158,7 +183,11 @@ impl NodeRpcClient for WebRpcClient { }, // Off-chain notes do not have details None => { - let note_tag = NoteTag::from(note.tag).validate(NoteType::OffChain)?; + let tag = note + .metadata + .ok_or(NodeRpcClientError::ExpectedFieldMissing("Metadata".into()))? + .tag; + let note_tag = NoteTag::from(tag).validate(NoteType::OffChain)?; let note_metadata = NoteMetadata::new( sender_id.try_into()?, NoteType::OffChain, @@ -175,7 +204,6 @@ impl NodeRpcClient for WebRpcClient { }; response_notes.push(note) } - Ok(response_notes) } @@ -243,14 +271,30 @@ impl NodeRpcClient for WebRpcClient { "GetAccountDetails response should have an `account`".to_string(), ))?; - let details_bytes = - account_info.details.ok_or(NodeRpcClientError::ExpectedFieldMissing( - "GetAccountDetails response's account should have `details`".to_string(), + let account_summary = + account_info.summary.ok_or(NodeRpcClientError::ExpectedFieldMissing( + "GetAccountDetails response's account should have a `summary`".to_string(), ))?; - let details = Account::read_from_bytes(&details_bytes)?; + let hash = account_summary.account_hash.ok_or(NodeRpcClientError::ExpectedFieldMissing( + "GetAccountDetails response's account should have an `account_hash`".to_string(), + ))?; + + let hash = hash.try_into()?; + + let update_summary = AccountUpdateSummary::new(hash, account_summary.block_num); + if account_id.is_on_chain() { + let details_bytes = + account_info.details.ok_or(NodeRpcClientError::ExpectedFieldMissing( + "GetAccountDetails response's account should have `details`".to_string(), + ))?; - Ok(details) + let account = Account::read_from_bytes(&details_bytes)?; + + Ok(AccountDetails::Public(account, update_summary)) + } else { + Ok(AccountDetails::OffChain(account_id, update_summary)) + } } } @@ -309,17 +353,26 @@ impl TryFrom for StateSyncInfo { .try_into()?; let sender_account_id = note - .sender - .ok_or(NodeRpcClientError::ExpectedFieldMissing("Notes.Sender".into()))? + .metadata + .clone() + .and_then(|m| m.sender) + .ok_or(NodeRpcClientError::ExpectedFieldMissing("Notes.Metadata.Sender".into()))? .try_into()?; - let note_type = NoteType::try_from(Felt::new(note.note_type.into()))?; - let metadata = NoteMetadata::new( - sender_account_id, - note_type, - note.tag.into(), - Default::default(), - )?; + let tag = note + .metadata + .clone() + .ok_or(NodeRpcClientError::ExpectedFieldMissing("Notes.Metadata".into()))? + .tag; + + let note_type = note + .metadata + .ok_or(NodeRpcClientError::ExpectedFieldMissing("Notes.Metadata".into()))? + .note_type; + + let note_type = NoteType::try_from(note_type)?; + let metadata = + NoteMetadata::new(sender_account_id, note_type, tag.into(), Default::default())?; let committed_note = CommittedNote::new(note_id, note.note_index, merkle_path, metadata); diff --git a/wasm/src/web_client/rpc/proto/block_header.proto b/wasm/src/web_client/rpc/proto/block_header.proto index 77189108e..bd9d4ad9e 100644 --- a/wasm/src/web_client/rpc/proto/block_header.proto +++ b/wasm/src/web_client/rpc/proto/block_header.proto @@ -4,24 +4,24 @@ package block_header; import "digest.proto"; message BlockHeader { + // specifies the version of the protocol. + uint32 version = 1; // the hash of the previous blocks header. - digest.Digest prev_hash = 1; + digest.Digest prev_hash = 2; // a unique sequential number of the current block. - fixed32 block_num = 2; + fixed32 block_num = 3; // a commitment to an MMR of the entire chain where each block is a leaf. - digest.Digest chain_root = 3; + digest.Digest chain_root = 4; // a commitment to account database. - digest.Digest account_root = 4; + digest.Digest account_root = 5; // a commitment to the nullifier database. - digest.Digest nullifier_root = 5; + digest.Digest nullifier_root = 6; // a commitment to all notes created in the current block. - digest.Digest note_root = 6; + digest.Digest note_root = 7; // a commitment to a set of transaction batches executed as a part of this block. - digest.Digest batch_root = 7; + digest.Digest batch_root = 8; // a hash of a STARK proof attesting to the correct state transition. - digest.Digest proof_hash = 8; - // specifies the version of the protocol. - uint32 version = 9; + digest.Digest proof_hash = 9; // the time when the block was created. - uint64 timestamp = 10; -} + fixed32 timestamp = 10; +} \ No newline at end of file diff --git a/wasm/src/web_client/rpc/proto/note.proto b/wasm/src/web_client/rpc/proto/note.proto index b389bddb1..9139b2fa4 100644 --- a/wasm/src/web_client/rpc/proto/note.proto +++ b/wasm/src/web_client/rpc/proto/note.proto @@ -5,36 +5,27 @@ import "digest.proto"; import "merkle.proto"; import "account.proto"; +message NoteMetadata { + account.AccountId sender = 1; + uint32 note_type = 2; + fixed32 tag = 3; + fixed64 aux = 4; +} + message Note { fixed32 block_num = 1; uint32 note_index = 2; digest.Digest note_id = 3; - account.AccountId sender = 4; - fixed32 tag = 5; - uint32 note_type = 6; - merkle.MerklePath merkle_path = 7; + NoteMetadata metadata = 4; + merkle.MerklePath merkle_path = 5; // This field will be present when the note is on-chain. // details contain the `Note` in a serialized format. - optional bytes details = 8; + optional bytes details = 6; } message NoteSyncRecord { uint32 note_index = 1; digest.Digest note_id = 2; - account.AccountId sender = 3; - fixed32 tag = 4; - uint32 note_type = 5; - merkle.MerklePath merkle_path = 6; -} - -message NoteCreated { - uint32 batch_index = 1; - uint32 note_index = 2; - digest.Digest note_id = 3; - uint32 note_type = 4; - account.AccountId sender = 5; - fixed32 tag = 6; - // This field will be present when the note is on-chain. - // details contain the `Note` in a serialized format. - optional bytes details = 7; -} + NoteMetadata metadata = 3; + merkle.MerklePath merkle_path = 4; +} \ No newline at end of file diff --git a/wasm/src/web_client/rpc/proto/requests.proto b/wasm/src/web_client/rpc/proto/requests.proto index 43e8301dc..d44c04350 100644 --- a/wasm/src/web_client/rpc/proto/requests.proto +++ b/wasm/src/web_client/rpc/proto/requests.proto @@ -6,30 +6,25 @@ import "block_header.proto"; import "digest.proto"; import "note.proto"; - -message AccountUpdate { - account.AccountId account_id = 1; - digest.Digest account_hash = 2; - // Details for public (on-chain) account. - optional bytes details = 3; -} - message ApplyBlockRequest { - block_header.BlockHeader block = 1; - repeated AccountUpdate accounts = 2; - repeated digest.Digest nullifiers = 3; - repeated note.NoteCreated notes = 4; + bytes block = 1; } message CheckNullifiersRequest { repeated digest.Digest nullifiers = 1; } +// Returns the block header corresponding to the requested block number, as well as the merkle +// path and current forest which validate the block's inclusion in the chain. +// +// The Merkle path is an MMR proof for the block's leaf, based on the current chain length. message GetBlockHeaderByNumberRequest { // The block number of the target block. // // If not provided, means latest know block. optional uint32 block_num = 1; + // Whether or not to return authentication data for the block header. + optional bool include_mmr_proof = 2; } // State synchronization request. @@ -97,3 +92,8 @@ message GetAccountDetailsRequest { // Account ID to get details. account.AccountId account_id = 1; } + +message GetBlockByNumberRequest { + // The block number of the target block. + fixed32 block_num = 1; +} \ No newline at end of file diff --git a/wasm/src/web_client/rpc/proto/responses.proto b/wasm/src/web_client/rpc/proto/responses.proto index b9f548d1d..b7df73977 100644 --- a/wasm/src/web_client/rpc/proto/responses.proto +++ b/wasm/src/web_client/rpc/proto/responses.proto @@ -17,7 +17,14 @@ message CheckNullifiersResponse { } message GetBlockHeaderByNumberResponse { + // The requested block header block_header.BlockHeader block_header = 1; + + // Merkle path to verify the block's inclusion in the MMR at the returned `chain_length` + optional merkle.MerklePath mmr_path = 2; + + // Current chain length + optional fixed32 chain_length = 3; } message NullifierUpdate { @@ -26,22 +33,22 @@ message NullifierUpdate { } message SyncStateResponse { - // number of the latest block in the chain + // Number of the latest block in the chain fixed32 chain_tip = 1; - // block header of the block with the first note matching the specified criteria + // Block header of the block with the first note matching the specified criteria block_header.BlockHeader block_header = 2; - // data needed to update the partial MMR from `block_num + 1` to `block_header.block_num` + // Data needed to update the partial MMR from `block_num + 1` to `block_header.block_num` mmr.MmrDelta mmr_delta = 3; - // a list of account hashes updated after `block_num + 1` but not after `block_header.block_num` + // List of account hashes updated after `block_num + 1` but not after `block_header.block_num` repeated account.AccountSummary accounts = 5; - // a list of all notes together with the Merkle paths from `block_header.note_root` + // List of all notes together with the Merkle paths from `block_header.note_root` repeated note.NoteSyncRecord notes = 6; - // a list of nullifiers created between `block_num + 1` and `block_header.block_num` + // List of nullifiers created between `block_num + 1` and `block_header.block_num` repeated NullifierUpdate nullifiers = 7; } @@ -117,3 +124,8 @@ message GetAccountDetailsResponse { // Account info (with details for on-chain accounts) account.AccountInfo account = 1; } + +message GetBlockByNumberResponse { + // The requested `Block` data encoded using miden native format + optional bytes block = 1; +} \ No newline at end of file diff --git a/wasm/src/web_client/rpc/proto/rpc.proto b/wasm/src/web_client/rpc/proto/rpc.proto index b1caf2dc2..428336b19 100644 --- a/wasm/src/web_client/rpc/proto/rpc.proto +++ b/wasm/src/web_client/rpc/proto/rpc.proto @@ -7,9 +7,10 @@ import "responses.proto"; service Api { rpc CheckNullifiers(requests.CheckNullifiersRequest) returns (responses.CheckNullifiersResponse) {} + rpc GetAccountDetails(requests.GetAccountDetailsRequest) returns (responses.GetAccountDetailsResponse) {} + rpc GetBlockByNumber(requests.GetBlockByNumberRequest) returns (responses.GetBlockByNumberResponse) {} rpc GetBlockHeaderByNumber(requests.GetBlockHeaderByNumberRequest) returns (responses.GetBlockHeaderByNumberResponse) {} rpc GetNotesById(requests.GetNotesByIdRequest) returns (responses.GetNotesByIdResponse) {} - rpc SyncState(requests.SyncStateRequest) returns (responses.SyncStateResponse) {} rpc SubmitProvenTransaction(requests.SubmitProvenTransactionRequest) returns (responses.SubmitProvenTransactionResponse) {} - rpc GetAccountDetails(requests.GetAccountDetailsRequest) returns (responses.GetAccountDetailsResponse) {} -} + rpc SyncState(requests.SyncStateRequest) returns (responses.SyncStateResponse) {} +} \ No newline at end of file diff --git a/wasm/src/web_client/rpc/proto/smt.proto b/wasm/src/web_client/rpc/proto/smt.proto index d62634dd4..ec9522a7d 100644 --- a/wasm/src/web_client/rpc/proto/smt.proto +++ b/wasm/src/web_client/rpc/proto/smt.proto @@ -29,4 +29,4 @@ message SmtLeaf { message SmtOpening { merkle.MerklePath path = 1; SmtLeaf leaf = 2; -} +} \ No newline at end of file diff --git a/wasm/src/web_client/rpc/proto/store.proto b/wasm/src/web_client/rpc/proto/store.proto index 112e3cfe2..142729cac 100644 --- a/wasm/src/web_client/rpc/proto/store.proto +++ b/wasm/src/web_client/rpc/proto/store.proto @@ -10,13 +10,14 @@ import "responses.proto"; service Api { rpc ApplyBlock(requests.ApplyBlockRequest) returns (responses.ApplyBlockResponse) {} rpc CheckNullifiers(requests.CheckNullifiersRequest) returns (responses.CheckNullifiersResponse) {} + rpc GetAccountDetails(requests.GetAccountDetailsRequest) returns (responses.GetAccountDetailsResponse) {} + rpc GetBlockByNumber(requests.GetBlockByNumberRequest) returns (responses.GetBlockByNumberResponse) {} rpc GetBlockHeaderByNumber(requests.GetBlockHeaderByNumberRequest) returns (responses.GetBlockHeaderByNumberResponse) {} rpc GetBlockInputs(requests.GetBlockInputsRequest) returns (responses.GetBlockInputsResponse) {} rpc GetNotesById(requests.GetNotesByIdRequest) returns (responses.GetNotesByIdResponse) {} rpc GetTransactionInputs(requests.GetTransactionInputsRequest) returns (responses.GetTransactionInputsResponse) {} - rpc SyncState(requests.SyncStateRequest) returns (responses.SyncStateResponse) {} - rpc ListNullifiers(requests.ListNullifiersRequest) returns (responses.ListNullifiersResponse) {} rpc ListAccounts(requests.ListAccountsRequest) returns (responses.ListAccountsResponse) {} rpc ListNotes(requests.ListNotesRequest) returns (responses.ListNotesResponse) {} - rpc GetAccountDetails(requests.GetAccountDetailsRequest) returns (responses.GetAccountDetailsResponse) {} -} + rpc ListNullifiers(requests.ListNullifiersRequest) returns (responses.ListNullifiersResponse) {} + rpc SyncState(requests.SyncStateRequest) returns (responses.SyncStateResponse) {} +} \ No newline at end of file diff --git a/wasm/src/web_client/store/accounts/js_bindings.rs b/wasm/src/web_client/store/accounts/js_bindings.rs index 1901b7ff8..b343128bb 100644 --- a/wasm/src/web_client/store/accounts/js_bindings.rs +++ b/wasm/src/web_client/store/accounts/js_bindings.rs @@ -37,6 +37,11 @@ extern "C" { account_id: String ) -> js_sys::Promise; + #[wasm_bindgen(js_name = getAccountAuthByPubKey)] + pub fn idxdb_get_account_auth_by_pub_key( + pub_key: Vec + ) -> js_sys::Promise; + // INSERTS // ================================================================================================ @@ -73,6 +78,7 @@ extern "C" { #[wasm_bindgen(js_name = insertAccountAuth)] pub fn idxdb_insert_account_auth( id: String, - auth_info: Vec + auth_info: Vec, + pub_key: Vec ) -> js_sys::Promise; } \ No newline at end of file diff --git a/wasm/src/web_client/store/accounts/mod.rs b/wasm/src/web_client/store/accounts/mod.rs index 8a1d85983..f7c2cd84e 100644 --- a/wasm/src/web_client/store/accounts/mod.rs +++ b/wasm/src/web_client/store/accounts/mod.rs @@ -1,16 +1,20 @@ -use miden_lib::transaction::TransactionKernel; use serde::{Serialize, Deserialize}; use serde_wasm_bindgen::from_value; use wasm_bindgen_futures::*; -use web_sys::console; use wasm_bindgen::prelude::*; +use web_sys::console; +use miden_lib::transaction::TransactionKernel; use miden_objects::{ - accounts::{Account, AccountCode, AccountId, AccountStorage, AccountStub}, assembly::ModuleAst, assets::{Asset, AssetVault}, Digest, Felt, Word + accounts::{Account, AccountCode, AccountId, AccountStorage, AccountStub, AuthSecretKey}, + assembly::ModuleAst, + assets::{Asset, AssetVault}, + Digest, Felt, Word }; -use miden_objects::utils::Deserializable; +use miden_tx::utils::{Deserializable, Serializable}; +use miden_client::errors::StoreError; -use crate::native_code::{errors::StoreError, store::{AuthInfo, NoteFilter, Store}}; +// use crate::native_code::{errors::StoreError, store::{NoteFilter, Store}}; use super::WebStore; @@ -35,7 +39,7 @@ impl WebStore { AccountId::from_hex(&id).unwrap() }).collect(); - return Ok(native_account_ids); + Ok(native_account_ids) } pub(super) async fn get_account_stubs( @@ -43,25 +47,14 @@ impl WebStore { ) -> Result)>, StoreError> { let promise = idxdb_get_account_stubs(); let js_value = JsFuture::from(promise).await.unwrap(); - let account_stubs_idxdb: Vec = from_value(js_value).unwrap(); + let account_stubs_idxdb: Vec = from_value(js_value)?; - let account_stubs: Vec<(AccountStub, Option)> = account_stubs_idxdb.into_iter().map(|record| { - let native_account_id: AccountId = AccountId::from_hex(&record.id).unwrap(); - let native_nonce: u64 = record.nonce.parse::().unwrap(); - let account_seed = record.account_seed.map(|seed| Word::read_from_bytes(&seed)).transpose().unwrap(); - - let account_stub = AccountStub::new( - native_account_id, - Felt::new(native_nonce), - Digest::try_from(&record.vault_root).unwrap(), - Digest::try_from(&record.storage_root).unwrap(), - Digest::try_from(&record.code_root).unwrap(), - ); - - (account_stub, account_seed) // Adjust this as needed based on how you derive Word from your data - }).collect(); + let account_stubs: Result)>, StoreError> = account_stubs_idxdb + .into_iter() + .map(|stub| parse_account_record_idxdb_object(stub)) + .collect(); // Collect results into a single Result - Ok(account_stubs) + account_stubs } pub(crate) async fn get_account_stub( @@ -72,22 +65,9 @@ impl WebStore { let promise = idxdb_get_account_stub(account_id_str); let js_value = JsFuture::from(promise).await.unwrap(); - let account_stub_idxdb: AccountRecordIdxdbOjbect = from_value(js_value).unwrap(); - - let native_account_id: AccountId = AccountId::from_hex(&account_stub_idxdb.id).unwrap(); - let native_nonce: u64 = account_stub_idxdb.nonce.parse::().unwrap(); - let account_seed = account_stub_idxdb.account_seed.map(|seed| Word::read_from_bytes(&seed)).transpose().unwrap(); - - Ok(( - AccountStub::new( - native_account_id, - Felt::new(native_nonce), - Digest::try_from(&account_stub_idxdb.vault_root).unwrap(), - Digest::try_from(&account_stub_idxdb.storage_root).unwrap(), - Digest::try_from(&account_stub_idxdb.code_root).unwrap(), - ), - account_seed, - )) + let account_stub_idxdb: AccountRecordIdxdbOjbect = from_value(js_value)?; + + parse_account_record_idxdb_object(account_stub_idxdb) } pub(crate) async fn get_account( @@ -161,7 +141,7 @@ impl WebStore { pub(crate) async fn get_account_auth( &self, account_id: AccountId - ) -> Result { + ) -> Result { let account_id_str = account_id.to_string(); let promise = idxdb_get_account_auth(account_id_str); @@ -169,23 +149,37 @@ impl WebStore { let auth_info_idxdb: AccountAuthIdxdbObject = from_value(js_value).unwrap(); // Convert the auth_info to the appropriate AuthInfo enum variant - let auth_info = AuthInfo::read_from_bytes(&auth_info_idxdb.auth_info).unwrap(); + let auth_info = AuthSecretKey::read_from_bytes(&auth_info_idxdb.auth_info)?; Ok(auth_info) } pub(crate) async fn insert_account( - &mut self, + &self, account: &Account, account_seed: Option, - auth_info: &AuthInfo, + auth_info: &AuthSecretKey, ) -> Result<(), StoreError> { - insert_account_code(account.code()).await; - insert_account_storage(account.storage()).await; - insert_account_asset_vault(account.vault()).await; - insert_account_record(account, account_seed).await; - insert_account_auth(account.id(), auth_info).await; + insert_account_code(account.code()).await?; + insert_account_storage(account.storage()).await?; + insert_account_asset_vault(account.vault()).await?; + insert_account_record(account, account_seed).await?; + insert_account_auth(account.id(), auth_info).await?; Ok(()) } + + /// Returns an [AuthSecretKey] by a public key represented by a [Word] + pub async fn get_account_auth_by_pub_key(&self, pub_key: Word) -> Result { + let pub_key_bytes = pub_key.to_bytes(); + + let promise = idxdb_get_account_auth_by_pub_key(pub_key_bytes); + let js_value = JsFuture::from(promise).await.unwrap(); + let account_auth_idxdb: AccountAuthIdxdbObject = from_value(js_value).unwrap(); + + // Convert the auth_info to the appropriate AuthInfo enum variant + let auth_info = AuthSecretKey::read_from_bytes(&account_auth_idxdb.auth_info)?; + + Ok(auth_info) + } } \ No newline at end of file diff --git a/wasm/src/web_client/store/accounts/utils.rs b/wasm/src/web_client/store/accounts/utils.rs index f5303101c..972a8704e 100644 --- a/wasm/src/web_client/store/accounts/utils.rs +++ b/wasm/src/web_client/store/accounts/utils.rs @@ -1,13 +1,18 @@ -use web_sys::console; +use wasm_bindgen_futures::*; use wasm_bindgen::prelude::*; +use web_sys::console; -use miden_objects::{accounts::{Account, AccountCode, AccountId, AccountStorage}, assembly::AstSerdeOptions, assets::{Asset, AssetVault}, Word}; +use miden_objects::{ + accounts::{Account, AccountCode, AccountId, AccountStorage, AccountStub, AuthSecretKey}, + assembly::AstSerdeOptions, + assets::{Asset, AssetVault}, + Felt, Digest, Word +}; use miden_tx::utils::Serializable; -use wasm_bindgen_futures::*; - -use crate::native_code::store::AuthInfo; +use miden_client::errors::StoreError; use super::js_bindings::*; +use super::models::*; pub async fn insert_account_code( account_code: &AccountCode @@ -18,10 +23,8 @@ pub async fn insert_account_code( let promise = idxdb_insert_account_code(root, procedures, module); let js_value = JsFuture::from(promise).await; - match js_value { - Ok(_) => Ok(()), - Err(_) => Err(()), - } + + Ok(()) } pub async fn insert_account_storage( @@ -33,50 +36,47 @@ pub async fn insert_account_storage( let promise = idxdb_insert_account_storage(root, storage); let js_value = JsFuture::from(promise).await; - match js_value { - Ok(_) => Ok(()), - Err(_) => Err(()), - } + Ok(()) } pub async fn insert_account_asset_vault( asset_vault: &AssetVault ) -> Result<(), ()> { - let root = (&asset_vault.commitment()).to_string(); + let root = serde_json::to_string(&asset_vault.commitment()).unwrap(); let assets: Vec = asset_vault.assets().collect(); let assets_as_str = serde_json::to_string(&assets).unwrap(); let promise = idxdb_insert_account_asset_vault(root, assets_as_str); let js_value = JsFuture::from(promise).await; - match js_value { - Ok(_) => Ok(()), - Err(_) => Err(()), - } + Ok(()) } pub async fn insert_account_auth( account_id: AccountId, - auth_info: &AuthInfo, + auth_info: &AuthSecretKey, ) -> Result<(), ()> { + let pub_key = match auth_info { + AuthSecretKey::RpoFalcon512(secret) => Word::from(secret.public_key()), + } + .to_bytes(); + let account_id_str = account_id.to_string(); let auth_info = auth_info.to_bytes(); - let promise = idxdb_insert_account_auth(account_id_str, auth_info); + let promise = idxdb_insert_account_auth(account_id_str, auth_info, pub_key); let js_value = JsFuture::from(promise).await; - match js_value { - Ok(_) => Ok(()), - Err(_) => Err(()), - } + + Ok(()) } pub async fn insert_account_record( account: &Account, account_seed: Option, ) -> Result<(), ()> { - let account_id_str = AccountId::to_hex(&account.id()); + let account_id_str = account.id().to_string(); let code_root = account.code().root().to_string(); let storage_root = account.storage().root().to_string(); - let vault_root = (&account.vault().commitment()).to_string(); + let vault_root = serde_json::to_string(&account.vault().commitment()).unwrap(); let committed = account.is_on_chain(); let nonce = account.nonce().to_string(); let account_seed = account_seed.map(|seed| seed.to_bytes()); @@ -91,8 +91,24 @@ pub async fn insert_account_record( account_seed, ); let js_value = JsFuture::from(promise).await; - match js_value { - Ok(_) => Ok(()), - Err(_) => Err(()), - } + + Ok(()) +} + +pub fn parse_account_record_idxdb_object( + account_stub_idxdb: AccountRecordIdxdbOjbect +) -> Result<(AccountStub, Option), StoreError> { + let native_account_id: AccountId = AccountId::from_hex(&account_stub_idxdb.id)?; + let native_nonce: u64 = account_stub_idxdb.nonce.parse::()?; + let account_seed = account_stub_idxdb.account_seed.map(|seed| Word::read_from_bytes(&seed)).transpose()?; + + let account_stub = AccountStub::new( + native_account_id, + Felt::new(native_nonce), + serde_json::from_str(&account_stub_idxdb.vault_root)?, + Digest::try_from(&account_stub_idxdb.storage_root)?, + Digest::try_from(&account_stub_idxdb.code_root)?, + ); + + Ok((account_stub, account_seed)) } \ No newline at end of file diff --git a/wasm/src/web_client/store/chain_data/mod.rs b/wasm/src/web_client/store/chain_data/mod.rs index 7e790a81f..b4fa3055e 100644 --- a/wasm/src/web_client/store/chain_data/mod.rs +++ b/wasm/src/web_client/store/chain_data/mod.rs @@ -3,11 +3,16 @@ use std::{collections::BTreeMap, num::NonZeroUsize}; use wasm_bindgen_futures::JsFuture; use serde_wasm_bindgen::from_value; -use crate::native_code::{ - errors::StoreError, +use miden_client::{ + errors::StoreError, store::ChainMmrNodeFilter }; +// use crate::native_code::{ +// errors::StoreError, +// store::ChainMmrNodeFilter +// }; + use miden_objects::{crypto::merkle::{InOrderIndex, MmrPeaks}, BlockHeader, Digest}; use super::WebStore; @@ -23,7 +28,7 @@ use utils::*; impl WebStore { pub(crate) async fn insert_block_header( - &mut self, + &self, block_header: BlockHeader, chain_mmr_peaks: MmrPeaks, has_client_notes: bool @@ -96,9 +101,9 @@ impl WebStore { return results; } - pub(crate) async fn get_chain_mmr_nodes( - &self, - filter: ChainMmrNodeFilter<'_>, + pub(crate) async fn get_chain_mmr_nodes<'a>( + &'a self, + filter: ChainMmrNodeFilter<'a>, ) -> Result, StoreError> { match filter { ChainMmrNodeFilter::All => { diff --git a/wasm/src/web_client/store/chain_data/utils.rs b/wasm/src/web_client/store/chain_data/utils.rs index b16bfca7e..b7e4039f5 100644 --- a/wasm/src/web_client/store/chain_data/utils.rs +++ b/wasm/src/web_client/store/chain_data/utils.rs @@ -1,6 +1,7 @@ use miden_objects::{crypto::merkle::InOrderIndex, BlockHeader, Digest}; -use crate::native_code::errors::StoreError; +use miden_client::store::StoreError; +// use crate::native_code::errors::StoreError; type SerializedBlockHeaderData = (String, String, String, bool); type SerializedChainMmrNodeData = (String, String); diff --git a/wasm/src/web_client/store/mock_example/js_bindings.rs b/wasm/src/web_client/store/mock_example/js_bindings.rs deleted file mode 100644 index c098ef5de..000000000 --- a/wasm/src/web_client/store/mock_example/js_bindings.rs +++ /dev/null @@ -1,9 +0,0 @@ -use wasm_bindgen::prelude::*; -use wasm_bindgen_futures::*; - -// Example -#[wasm_bindgen(module = "/js/db/greet.js")] -extern "C" { - #[wasm_bindgen(js_name = insertGreeting)] - pub fn insert_greeting(greeting: String) -> js_sys::Promise; -} \ No newline at end of file diff --git a/wasm/src/web_client/store/mock_example/mod.rs b/wasm/src/web_client/store/mock_example/mod.rs deleted file mode 100644 index c49f546e6..000000000 --- a/wasm/src/web_client/store/mock_example/mod.rs +++ /dev/null @@ -1,17 +0,0 @@ -use wasm_bindgen_futures::*; - -use super::WebStore; -mod js_bindings; - -impl WebStore { - pub(crate) async fn insert_string( - &mut self, - data: String - ) -> Result<(), ()> { - let result = JsFuture::from(js_bindings::insert_greeting(data)).await; - match result { - Ok(_) => Ok(()), - Err(_) => Err(()), - } - } -} \ No newline at end of file diff --git a/wasm/src/web_client/store/mod.rs b/wasm/src/web_client/store/mod.rs index 81608c237..0ace2f683 100644 --- a/wasm/src/web_client/store/mod.rs +++ b/wasm/src/web_client/store/mod.rs @@ -5,21 +5,35 @@ use wasm_bindgen::prelude::*; use wasm_bindgen_futures::*; use miden_objects::{ - accounts::{Account, AccountId, AccountStub}, crypto::merkle::{InOrderIndex, MmrPeaks}, notes::{NoteId, NoteInclusionProof}, transaction::TransactionId, BlockHeader, Digest, Word + accounts::{Account, AccountId, AccountStub, AuthSecretKey}, + crypto::merkle::{InOrderIndex, MmrPeaks}, + notes::{NoteId, NoteInclusionProof, NoteTag}, + transaction::TransactionId, + BlockHeader, Digest, Word +}; +use miden_client::{ + store::{ChainMmrNodeFilter, InputNoteRecord, NoteFilter, OutputNoteRecord, Store, StoreError, TransactionFilter}, + client::{ + sync::StateSyncUpdate, + transactions::{TransactionRecord, TransactionResult} + } }; -use crate::native_code::{ - errors::{ClientError, StoreError}, store::{ - note_record::{InputNoteRecord, OutputNoteRecord}, AuthInfo, ChainMmrNodeFilter, NoteFilter, Store, TransactionFilter - }, sync::SyncedNewNotes, transactions::{TransactionRecord, TransactionResult} -}; +// use crate::native_code::{ +// errors::{ClientError, StoreError}, +// store::{ +// note_record::{InputNoteRecord, OutputNoteRecord}, +// ChainMmrNodeFilter, NoteFilter, Store, TransactionFilter +// }, +// sync::SyncedNewNotes, +// transactions::{TransactionRecord, TransactionResult} +// }; pub mod accounts; pub mod notes; pub mod transactions; pub mod sync; pub mod chain_data; -pub mod mock_example; // Initialize IndexedDB #[wasm_bindgen(module = "/js/db/schema.js")] @@ -39,30 +53,29 @@ impl WebStore { #[async_trait(?Send)] impl Store for WebStore { - // TEST FUNCTION - async fn insert_string( - &mut self, - data: String - ) -> Result<(), ()> { - self.insert_string(data).await - } - // SYNC // -------------------------------------------------------------------------------------------- async fn get_note_tags( &self - ) -> Result, StoreError> { + ) -> Result, StoreError> { self.get_note_tags().await } async fn add_note_tag( - &mut self, - tag: u64, + &self, + tag: NoteTag, ) -> Result { self.add_note_tag(tag).await } + async fn remove_note_tag( + &self, + tag: NoteTag + ) -> Result { + self.remove_note_tag(tag).await + } + async fn get_sync_height( &self ) -> Result { @@ -70,24 +83,10 @@ impl Store for WebStore { } async fn apply_state_sync( - &mut self, - block_header: BlockHeader, - nullifiers: Vec, - committed_notes: SyncedNewNotes, - committed_transactions: &[TransactionId], - new_mmr_peaks: MmrPeaks, - new_authentication_nodes: &[(InOrderIndex, Digest)], - updated_onchain_accounts: &[Account], + &self, + state_sync_update: StateSyncUpdate, ) -> Result<(), StoreError> { - self.apply_state_sync( - block_header, - nullifiers, - committed_notes, - committed_transactions, - new_mmr_peaks, - new_authentication_nodes, - updated_onchain_accounts, - ).await + self.apply_state_sync(state_sync_update).await } // TRANSACTIONS @@ -101,7 +100,7 @@ impl Store for WebStore { } async fn apply_transaction( - &mut self, + &self, tx_result: TransactionResult, ) -> Result<(), StoreError> { self.apply_transaction(tx_result).await @@ -124,15 +123,8 @@ impl Store for WebStore { self.get_output_notes(note_filter).await } - async fn get_input_note( - &self, - note_id: NoteId, - ) -> Result { - self.get_input_note(note_id).await - } - async fn insert_input_note( - &mut self, + &self, note: &InputNoteRecord, ) -> Result<(), StoreError> { self.insert_input_note(note).await @@ -142,7 +134,7 @@ impl Store for WebStore { // -------------------------------------------------------------------------------------------- async fn insert_block_header( - &mut self, + &self, block_header: BlockHeader, chain_mmr_peaks: MmrPeaks, has_client_notes: bool, @@ -170,6 +162,13 @@ impl Store for WebStore { self.get_chain_mmr_nodes(filter).await } + async fn insert_chain_mmr_nodes( + &self, + nodes: &[(InOrderIndex, Digest)] + ) -> Result<(), StoreError> { + self.insert_chain_mmr_nodes(nodes).await + } + async fn get_chain_mmr_peaks_by_block_num( &self, block_num: u32 @@ -181,10 +180,10 @@ impl Store for WebStore { // -------------------------------------------------------------------------------------------- async fn insert_account( - &mut self, + &self, account: &Account, account_seed: Option, - auth_info: &AuthInfo, + auth_info: &AuthSecretKey, ) -> Result<(), StoreError> { self.insert_account(account, account_seed, auth_info).await } @@ -218,7 +217,14 @@ impl Store for WebStore { async fn get_account_auth( &self, account_id: AccountId, - ) -> Result { + ) -> Result { self.get_account_auth(account_id).await } + + async fn get_account_auth_by_pub_key( + &self, + pub_key: Word + ) -> Result { + self.get_account_auth_by_pub_key(pub_key).await + } } \ No newline at end of file diff --git a/wasm/src/web_client/store/notes/js_bindings.rs b/wasm/src/web_client/store/notes/js_bindings.rs index 7c09b7b99..60089cda1 100644 --- a/wasm/src/web_client/store/notes/js_bindings.rs +++ b/wasm/src/web_client/store/notes/js_bindings.rs @@ -12,9 +12,9 @@ extern "C" { status: String ) -> js_sys::Promise; - #[wasm_bindgen(js_name = getInputNote)] - pub fn idxdb_get_input_note( - note_id: String + #[wasm_bindgen(js_name = getInputNotesFromIds)] + pub fn idxdb_get_input_notes_from_ids( + note_ids: Vec ) -> js_sys::Promise; #[wasm_bindgen(js_name = getOutputNotes)] @@ -22,6 +22,11 @@ extern "C" { status: String ) -> js_sys::Promise; + #[wasm_bindgen(js_name = getOutputNotesFromIds)] + pub fn idxdb_get_output_notes_from_ids( + note_ids: Vec + ) -> js_sys::Promise; + #[wasm_bindgen(js_name = getUnspentInputNoteNullifiers)] pub fn idxdb_get_unspent_input_note_nullifiers() -> js_sys::Promise; @@ -53,4 +58,10 @@ extern "C" { serialized_note_script: Option>, inclusion_proof: Option ) -> js_sys::Promise; + + #[wasm_bindgen(js_name = updateNoteConsumerTxId)] + pub fn idxdb_update_note_consumer_tx_id( + note_id: String, + consumer_tx_id: String + ) -> js_sys::Promise; } \ No newline at end of file diff --git a/wasm/src/web_client/store/notes/mod.rs b/wasm/src/web_client/store/notes/mod.rs index ccd41bab1..394ad6d1a 100644 --- a/wasm/src/web_client/store/notes/mod.rs +++ b/wasm/src/web_client/store/notes/mod.rs @@ -5,14 +5,18 @@ use serde_wasm_bindgen::from_value; use wasm_bindgen_futures::*; use super::WebStore; -use crate::native_code::errors::StoreError; -use crate::native_code::store::note_record::{ - InputNoteRecord, - NoteRecordDetails, - NoteStatus, - OutputNoteRecord +use miden_client::{ + errors::StoreError, + store::{InputNoteRecord, NoteFilter, OutputNoteRecord} }; -use crate::native_code::store::NoteFilter; +// use crate::native_code::errors::StoreError; +// use crate::native_code::store::note_record::{ +// InputNoteRecord, +// NoteRecordDetails, +// NoteStatus, +// OutputNoteRecord +// }; +// use crate::native_code::store::NoteFilter; use crate::web_client::notes::WebClientNoteFilter; mod js_bindings; @@ -29,206 +33,115 @@ impl WebStore { &self, filter: NoteFilter ) -> Result, StoreError> { - let filter_as_str = match filter { - NoteFilter::Pending => "Pending", - NoteFilter::Committed => "Committed", - NoteFilter::Consumed => "Consumed", - NoteFilter::All => "All", + let promise = match filter { + NoteFilter::All | NoteFilter::Consumed | NoteFilter::Committed | NoteFilter::Pending => { + let filter_as_str = match filter { + NoteFilter::All => "All", + NoteFilter::Consumed => "Consumed", + NoteFilter::Committed => "Committed", + NoteFilter::Pending => "Pending", + _ => unreachable!(), // Safety net, should never be reached + }; + + // Assuming `js_fetch_notes` is your JavaScript function that handles simple string filters + idxdb_get_input_notes(filter_as_str.to_string()) + }, + NoteFilter::List(ids) => { + let note_ids_as_str: Vec = ids.into_iter().map(|id| id.inner().to_string()).collect(); + idxdb_get_input_notes_from_ids(ids) + }, + NoteFilter::Unique(id) => { + let note_id_as_str = id.inner().to_string(); + let note_ids = vec![note_id_as_str]; + idxdb_get_input_notes_from_ids(note_ids) + } }; - let promise = idxdb_get_input_notes(filter_as_str.to_string()); let js_value = JsFuture::from(promise).await.unwrap(); let input_notes_idxdb: Vec = from_value(js_value).unwrap(); - - let native_input_notes: Result, StoreError> = input_notes_idxdb.into_iter().map(|note_idxdb| { - - // Merge the info that comes from the input notes table and the notes script table - let note_script = NoteScript::read_from_bytes(¬e_idxdb.serialized_note_script)?; - let note_details: NoteRecordDetails = - serde_json::from_str(¬e_idxdb.details).map_err(StoreError::JsonDataDeserializationError)?; - let note_details = NoteRecordDetails::new( - note_details.nullifier().to_string(), - note_script, - note_details.inputs().clone(), - note_details.serial_num(), - ); - - let note_metadata: Option = if let Some(metadata_as_json_str) = note_idxdb.metadata { - Some( - serde_json::from_str(&metadata_as_json_str) - .map_err(StoreError::JsonDataDeserializationError)?, - ) - } else { - None - }; - - let note_assets = NoteAssets::read_from_bytes(¬e_idxdb.assets)?; - - let inclusion_proof = match note_idxdb.inclusion_proof { - Some(note_inclusion_proof) => { - let note_inclusion_proof: NoteInclusionProof = - serde_json::from_str(¬e_inclusion_proof) - .map_err(StoreError::JsonDataDeserializationError)?; - - Some(note_inclusion_proof) - }, - _ => None, - }; - - let recipient = Digest::try_from(note_idxdb.recipient)?; - let id = NoteId::new(recipient, note_assets.commitment()); - let status: NoteStatus = serde_json::from_str(&format!("\"{0}\"", note_idxdb.status)) - .map_err(StoreError::JsonDataDeserializationError)?; - - Ok(InputNoteRecord::new( - id, - recipient, - note_assets, - status, - note_metadata, - inclusion_proof, - note_details, - )) - }).collect(); - - return native_input_notes; - } - pub(crate) async fn get_input_note( - &self, - note_id: NoteId - ) -> Result { - let note_id_str = ¬e_id.inner().to_string(); + let native_input_notes: Result, StoreError> = input_notes_idxdb + .into_iter() + .map(|note| parse_input_note_idxdb_object(note)) + .collect(); // Collect results into a single Result - let promise = idxdb_get_input_note(note_id_str.to_string()); - let js_value = JsFuture::from(promise).await.unwrap(); - let input_note_idxdb: InputNoteIdxdbObject = from_value(js_value).unwrap(); - - // Merge the info that comes from the input notes table and the notes script table - let note_script = NoteScript::read_from_bytes(&input_note_idxdb.serialized_note_script)?; - let note_details: NoteRecordDetails = - serde_json::from_str(&input_note_idxdb.details).map_err(StoreError::JsonDataDeserializationError)?; - let note_details = NoteRecordDetails::new( - note_details.nullifier().to_string(), - note_script, - note_details.inputs().clone(), - note_details.serial_num(), - ); - - let note_metadata: Option = if let Some(metadata_as_json_str) = input_note_idxdb.metadata { - Some( - serde_json::from_str(&metadata_as_json_str) - .map_err(StoreError::JsonDataDeserializationError)?, - ) - } else { - None + match filter { + NoteFilter::Unique(note_id) if native_input_notes.is_empty() => { + return Err(StoreError::NoteNotFound(note_id)); + }, + NoteFilter::List(note_ids) if note_ids.len() != native_input_notes.len() => { + let missing_note_id = note_ids + .iter() + .find(|¬e_id| !native_input_notes.iter().any(|note_record| note_record.id() == *note_id)) + .expect("should find one note id that wasn't retrieved by the db"); + return Err(StoreError::NoteNotFound(*missing_note_id)); + }, + _ => {}, + } + + native_input_notes + } + + pub(crate) async fn get_output_notes( + &self, + filter: NoteFilter + ) -> Result, StoreError> { + let promise = match filter { + NoteFilter::All | NoteFilter::Consumed | NoteFilter::Committed | NoteFilter::Pending => { + let filter_as_str = match filter { + NoteFilter::All => "All", + NoteFilter::Consumed => "Consumed", + NoteFilter::Committed => "Committed", + NoteFilter::Pending => "Pending", + _ => unreachable!(), // Safety net, should never be reached + }; + + // Assuming `js_fetch_notes` is your JavaScript function that handles simple string filters + idxdb_get_output_notes(filter_as_str.to_string()) + }, + NoteFilter::List(ids) => { + let note_ids_as_str: Vec = ids.into_iter().map(|id| id.inner().to_string()).collect(); + idxdb_get_output_notes_from_ids(ids) + }, + NoteFilter::Unique(id) => { + let note_id_as_str = id.inner().to_string(); + let note_ids = vec![note_id_as_str]; + idxdb_get_output_notes_from_ids(note_ids) + } }; - let note_assets = NoteAssets::read_from_bytes(&input_note_idxdb.assets)?; + let js_value = JsFuture::from(promise).await.unwrap(); + let output_notes_idxdb: Vec = from_value(js_value).unwrap(); - let inclusion_proof = match input_note_idxdb.inclusion_proof { - Some(note_inclusion_proof) => { - let note_inclusion_proof: NoteInclusionProof = - serde_json::from_str(¬e_inclusion_proof) - .map_err(StoreError::JsonDataDeserializationError)?; + let native_output_notes: Result, StoreError> = output_notes_idxdb + .into_iter() + .map(|note| parse_output_note_idxdb_object(note)) + .collect(); // Collect results into a single Result - Some(note_inclusion_proof) + match filter { + NoteFilter::Unique(note_id) if native_output_notes.is_empty() => { + return Err(StoreError::NoteNotFound(note_id)); }, - _ => None, - }; + NoteFilter::List(note_ids) if note_ids.len() != native_output_notes.len() => { + let missing_note_id = note_ids + .iter() + .find(|¬e_id| !native_output_notes.iter().any(|note_record| note_record.id() == *note_id)) + .expect("should find one note id that wasn't retrieved by the db"); + return Err(StoreError::NoteNotFound(*missing_note_id)); + }, + _ => {}, + } - let recipient = Digest::try_from(input_note_idxdb.recipient)?; - let id = NoteId::new(recipient, note_assets.commitment()); - let status: NoteStatus = serde_json::from_str(&format!("\"{0}\"", input_note_idxdb.status)) - .map_err(StoreError::JsonDataDeserializationError)?; - - Ok(InputNoteRecord::new( - id, - recipient, - note_assets, - status, - note_metadata, - inclusion_proof, - note_details, - )) + native_output_notes } pub(crate) async fn insert_input_note( - &mut self, + &self, note: &InputNoteRecord ) -> Result<(), StoreError> { insert_input_note_tx(note).await } - pub(crate) async fn get_output_notes( - &self, - filter: NoteFilter - ) -> Result, StoreError> { - let filter_as_str = match filter { - NoteFilter::Pending => "Pending", - NoteFilter::Committed => "Committed", - NoteFilter::Consumed => "Consumed", - NoteFilter::All => "All", - }; - - let promise = idxdb_get_output_notes(filter_as_str.to_string()); - let js_value = JsFuture::from(promise).await.unwrap(); - let output_notes_idxdb: Vec = from_value(js_value).unwrap(); - - let native_output_notes: Result, StoreError> = output_notes_idxdb.into_iter().map(|note_idxdb| { - let note_details: Option = if let Some(details_as_json_str) = note_idxdb.details { - // Merge the info that comes from the input notes table and the notes script table - let serialized_note_script = note_idxdb.serialized_note_script - .expect("Has note details so it should have the serialized script"); - let note_script = NoteScript::read_from_bytes(&serialized_note_script)?; - let note_details: NoteRecordDetails = serde_json::from_str(&details_as_json_str) - .map_err(StoreError::JsonDataDeserializationError)?; - let note_details = NoteRecordDetails::new( - note_details.nullifier().to_string(), - note_script, - note_details.inputs().clone(), - note_details.serial_num(), - ); - - Some(note_details) - } else { - None - }; - - let note_metadata: NoteMetadata = - serde_json::from_str(¬e_idxdb.metadata).map_err(StoreError::JsonDataDeserializationError)?; - let note_assets = NoteAssets::read_from_bytes(¬e_idxdb.assets)?; - - let inclusion_proof = match note_idxdb.inclusion_proof { - Some(note_inclusion_proof) => { - let note_inclusion_proof: NoteInclusionProof = - serde_json::from_str(¬e_inclusion_proof) - .map_err(StoreError::JsonDataDeserializationError)?; - - Some(note_inclusion_proof) - }, - _ => None, - }; - - let recipient = Digest::try_from(note_idxdb.recipient)?; - let id = NoteId::new(recipient, note_assets.commitment()); - let status: NoteStatus = serde_json::from_str(&format!("\"{0}\"", note_idxdb.status)) - .map_err(StoreError::JsonDataDeserializationError)?; - - Ok(OutputNoteRecord::new( - id, - recipient, - note_assets, - status, - note_metadata, - inclusion_proof, - note_details, - )) - }).collect(); // Collect into a Result, ()> - - return native_output_notes; - } - pub(crate) async fn get_unspent_input_note_nullifiers( &self ) -> Result, StoreError>{ @@ -242,4 +155,4 @@ impl WebStore { return nullifiers; } -} \ No newline at end of file +} diff --git a/wasm/src/web_client/store/notes/models.rs b/wasm/src/web_client/store/notes/models.rs index e94f7690b..b40716287 100644 --- a/wasm/src/web_client/store/notes/models.rs +++ b/wasm/src/web_client/store/notes/models.rs @@ -12,7 +12,8 @@ pub struct InputNoteIdxdbObject { pub metadata: Option, pub inclusion_proof: Option, #[serde(deserialize_with = "base64_to_vec_u8_required", default)] - pub serialized_note_script: Vec + pub serialized_note_script: Vec, + pub consumer_account_id: Option, } #[derive(Serialize, Deserialize)] @@ -25,7 +26,8 @@ pub struct OutputNoteIdxdbObject { pub metadata: String, pub inclusion_proof: Option, #[serde(deserialize_with = "base64_to_vec_u8_optional", default)] - pub serialized_note_script: Option> + pub serialized_note_script: Option>, + pub consumer_account_id: Option } fn base64_to_vec_u8_required<'de, D>(deserializer: D) -> Result, D::Error> diff --git a/wasm/src/web_client/store/notes/utils.rs b/wasm/src/web_client/store/notes/utils.rs index d459530e8..8c071e347 100644 --- a/wasm/src/web_client/store/notes/utils.rs +++ b/wasm/src/web_client/store/notes/utils.rs @@ -1,9 +1,19 @@ -use miden_objects::notes::NoteInclusionProof; +use miden_objects::{ + accounts::AccountId, + notes::{NoteAssets, NoteId, NoteInclusionProof, NoteMetadata, NoteScript}, + transaction::TransactionId, + Digest +}; use miden_tx::utils::Serializable; use wasm_bindgen_futures::*; -use crate::native_code::{errors::StoreError, store::note_record::{InputNoteRecord, NoteStatus, OutputNoteRecord}}; +use miden_client::{ + store::{NoteStatus, NoteRecordDetails, InputNoteRecord, OutputNoteRecord}, + errors::StoreError +}; +// use crate::native_code::{errors::StoreError, store::note_record::{InputNoteRecord, NoteStatus, OutputNoteRecord}}; +use crate::web_client::store::notes::{InputNoteIdxdbObject, OutputNoteIdxdbObject}; use super::js_bindings::*; // TYPES @@ -35,6 +45,19 @@ type SerializedOutputNoteData = ( // ================================================================================================ +pub(crate) async fn update_note_consumer_tx_id( + note_id: NoteId, + consumer_tx_id: TransactionId, +) -> Result<(), StoreError> { + let serialized_note_id = note_id.inner().to_string(); + let serialized_consumer_tx_id = consumer_tx_id.to_string(); + + let promise = idxdb_update_note_consumer_tx_id(serialized_note_id, serialized_consumer_tx_id); + let result = JsFuture::from(promise).await?; + + Ok(()) +} + pub(crate) fn serialize_input_note( note: &InputNoteRecord ) -> Result { @@ -218,4 +241,121 @@ pub async fn insert_output_note_tx( Ok(_) => Ok(()), Err(_) => Err(StoreError::QueryError("Failed to insert output note".to_string())), } +} + +pub fn parse_input_note_idxdb_object( + note_idxdb: InputNoteIdxdbObject +) -> Result { + // Merge the info that comes from the input notes table and the notes script table + let note_script = NoteScript::read_from_bytes(¬e_idxdb.serialized_note_script)?; + let note_details: NoteRecordDetails = + serde_json::from_str(¬e_idxdb.details).map_err(StoreError::JsonDataDeserializationError)?; + let note_details = NoteRecordDetails::new( + note_details.nullifier().to_string(), + note_script, + note_details.inputs().clone(), + note_details.serial_num(), + ); + + let note_metadata: Option = if let Some(metadata_as_json_str) = note_idxdb.metadata { + Some( + serde_json::from_str(&metadata_as_json_str) + .map_err(StoreError::JsonDataDeserializationError)?, + ) + } else { + None + }; + + let note_assets = NoteAssets::read_from_bytes(¬e_idxdb.assets)?; + + let inclusion_proof = match note_idxdb.inclusion_proof { + Some(note_inclusion_proof) => { + let note_inclusion_proof: NoteInclusionProof = + serde_json::from_str(¬e_inclusion_proof) + .map_err(StoreError::JsonDataDeserializationError)?; + + Some(note_inclusion_proof) + }, + _ => None, + }; + + let recipient = Digest::try_from(note_idxdb.recipient)?; + let id = NoteId::new(recipient, note_assets.commitment()); + let status: NoteStatus = serde_json::from_str(&format!("\"{0}\"", note_idxdb.status)) + .map_err(StoreError::JsonDataDeserializationError)?; + let consumer_account_id: Option = match note_idxdb.consumer_account_id { + Some(account_id) => Some(AccountId::from_hex(&account_id)?), + None => None, + }; + + Ok(InputNoteRecord::new( + id, + recipient, + note_assets, + status, + note_metadata, + inclusion_proof, + note_details, + consumer_account_id + )) +} + +pub fn parse_output_note_idxdb_object( + note_idxdb: OutputNoteIdxdbObject +) -> Result { + let note_details: Option = if let Some(details_as_json_str) = note_idxdb.details { + // Merge the info that comes from the input notes table and the notes script table + let serialized_note_script = note_idxdb.serialized_note_script + .expect("Has note details so it should have the serialized script"); + let note_script = NoteScript::read_from_bytes(&serialized_note_script)?; + let note_details: NoteRecordDetails = serde_json::from_str(&details_as_json_str) + .map_err(StoreError::JsonDataDeserializationError)?; + let note_details = NoteRecordDetails::new( + note_details.nullifier().to_string(), + note_script, + note_details.inputs().clone(), + note_details.serial_num(), + ); + + Some(note_details) + } else { + None + }; + + let note_metadata: NoteMetadata = + serde_json::from_str(¬e_idxdb.metadata).map_err(StoreError::JsonDataDeserializationError)?; + + let note_assets = NoteAssets::read_from_bytes(¬e_idxdb.assets)?; + + let inclusion_proof = match note_idxdb.inclusion_proof { + Some(note_inclusion_proof) => { + let note_inclusion_proof: NoteInclusionProof = + serde_json::from_str(¬e_inclusion_proof) + .map_err(StoreError::JsonDataDeserializationError)?; + + Some(note_inclusion_proof) + }, + _ => None, + }; + + let recipient = Digest::try_from(note_idxdb.recipient)?; + let id = NoteId::new(recipient, note_assets.commitment()); + let status: NoteStatus = serde_json::from_str(&format!("\"{0}\"", note_idxdb.status)) + .map_err(StoreError::JsonDataDeserializationError)?; + + let consumer_account_id: Option = match note_idxdb.consumer_account_id { + Some(account_id) => Some(AccountId::try_from(account_id as u64)?), + None => None, + }; + + Ok(OutputNoteRecord::new( + id, + recipient, + note_assets, + status, + note_metadata, + inclusion_proof, + note_details, + consumer_account_id, + )) } \ No newline at end of file diff --git a/wasm/src/web_client/store/sync/js_bindings.rs b/wasm/src/web_client/store/sync/js_bindings.rs index bcd1f84da..7a69d4fca 100644 --- a/wasm/src/web_client/store/sync/js_bindings.rs +++ b/wasm/src/web_client/store/sync/js_bindings.rs @@ -30,8 +30,11 @@ extern "C" { has_client_notes: bool, serialized_node_ids: Vec, serialized_nodes: Vec, - note_ids: Vec, - inclusion_proofs: Vec, + output_note_ids: Vec, + output_note_inclusion_proofs: Vec, + input_note_ids: Vec, + input_note_inclusion_proofs: Vec, + input_note_metadatas: Vec, transactions_to_commit: Vec, ) -> js_sys::Promise; } \ No newline at end of file diff --git a/wasm/src/web_client/store/sync/mod.rs b/wasm/src/web_client/store/sync/mod.rs index 951064839..d968d8718 100644 --- a/wasm/src/web_client/store/sync/mod.rs +++ b/wasm/src/web_client/store/sync/mod.rs @@ -3,14 +3,18 @@ use miden_objects::{ crypto::merkle::{ InOrderIndex, MmrPeaks }, - notes::NoteInclusionProof, + notes::{NoteInclusionProof, NoteTag}, transaction::TransactionId, BlockHeader, Digest }; use wasm_bindgen_futures::*; use serde_wasm_bindgen::from_value; -use crate::native_code::{errors::StoreError, sync::SyncedNewNotes}; +use miden_client::{ + client::sync::StateSyncUpdate, + errors::StoreError +}; +// use crate::native_code::{errors::StoreError, sync::SyncedNewNotes}; use super::{chain_data::utils::serialize_chain_mmr_node, notes::utils::insert_input_note_tx, transactions::utils::update_account, WebStore}; @@ -23,12 +27,12 @@ use models::*; impl WebStore { pub(crate) async fn get_note_tags( &self - ) -> Result, StoreError>{ + ) -> Result, StoreError>{ let promsie = idxdb_get_note_tags(); let js_value = JsFuture::from(promsie).await.unwrap(); let tags_idxdb: NoteTagsIdxdbObject = from_value(js_value).unwrap(); - let tags: Vec = serde_json::from_str(&tags_idxdb.tags).unwrap(); + let tags: Vec = serde_json::from_str(&tags_idxdb.tags).unwrap(); return Ok(tags); } @@ -45,7 +49,7 @@ impl WebStore { } pub(super) async fn add_note_tag( - &mut self, + &self, tag: u64 ) -> Result { let mut tags = self.get_note_tags().await.unwrap(); @@ -60,16 +64,39 @@ impl WebStore { return Ok(true); } + pub(super) async fn remove_note_tag( + &self, + tag: NoteTag + ) -> Result { + let mut tags = self.get_note_tags().await?; + if let Some(index_of_tag) = tags.iter().position(|&tag_candidate| tag_candidate == tag) { + tags.remove(index_of_tag); + + let tags = serde_json::to_string(&tags).map_err(StoreError::InputSerializationError)?; + + let promise = idxdb_add_note_tag(tags); + JsFuture::from(promise).await.unwrap(); + return Ok(true); + } + + Ok(false) + } + pub(super) async fn apply_state_sync( - &mut self, - block_header: BlockHeader, - nullifiers: Vec, - committed_notes: SyncedNewNotes, - committed_transactions: &[TransactionId], - new_mmr_peaks: MmrPeaks, - new_authentication_nodes: &[(InOrderIndex, Digest)], - updated_onchain_accounts: &[Account], + &self, + state_sync_update: StateSyncUpdate, ) -> Result<(), StoreError> { + let StateSyncUpdate { + block_header, + nullifiers, + synced_new_notes: committed_notes, + transactions_to_commit: committed_transactions, + new_mmr_peaks, + new_authentication_nodes, + updated_onchain_accounts, + block_has_relevant_notes, + } = state_sync_update; + // Serialize data for updating state sync and block header let block_num_as_str = block_header.block_num().to_string(); @@ -79,7 +106,6 @@ impl WebStore { // Serialize data for updating block header let block_header_as_str = serde_json::to_string(&block_header).map_err(StoreError::InputSerializationError)?; let new_mmr_peaks_as_str = serde_json::to_string(&new_mmr_peaks.peaks().to_vec()).map_err(StoreError::InputSerializationError)?; - let block_has_relevant_notes = !committed_notes.is_empty(); // Serialize data for updating chain MMR nodes let mut serialized_node_ids = Vec::new(); @@ -91,8 +117,8 @@ impl WebStore { }; // Serialize data for updating committed notes - let note_ids_as_str: Vec = committed_notes.new_inclusion_proofs().iter().map(|(note_id, _)| note_id.inner().to_hex()).collect(); - let inclusion_proofs_as_str: Vec = committed_notes.new_inclusion_proofs().iter().map(|(_, inclusion_proof)| { + let output_note_ids_as_str: Vec = committed_notes.updated_output_notes().iter().map(|(note_id, _)| note_id.inner().to_hex()).collect(); + let output_note_inclusion_proofs_as_str: Vec = committed_notes.updated_output_notes().iter().map(|(_, inclusion_proof)| { let block_num = inclusion_proof.origin().block_num; let sub_hash = inclusion_proof.sub_hash(); let note_root = inclusion_proof.note_root(); @@ -110,6 +136,16 @@ impl WebStore { serde_json::to_string(&proof).unwrap() }).collect(); + let input_note_ids_as_str: Vec = committed_notes.updated_input_notes().iter().map(|(input_note)| input_note.id().inner().to_hex()).collect(); + let input_note_inclusion_proofs_as_str: Vec = committed_notes.updated_input_notes().iter().map(|(input_note)| { + let inclusion_proof = input_note.proof(); + serde_json::to_string(inclusion_proof).unwrap() + }).collect(); + let input_note_metadatas_as_str: Vec = committed_notes.updated_input_notes().iter().map(|(input_note)| { + let metadata = input_note.note().metadata(); + serde_json::to_string(metadata).unwrap() + }).collect(); + // TODO: LOP INTO idxdb_apply_state_sync call // Commit new public notes for note in committed_notes.new_public_notes() { @@ -122,7 +158,7 @@ impl WebStore { // TODO: LOP INTO idxdb_apply_state_sync call // Update onchain accounts on the db that have been updated onchain for account in updated_onchain_accounts { - update_account(account.clone()).await.unwrap(); + update_account(&account.clone()).await.unwrap(); } let promise = idxdb_apply_state_sync( @@ -133,8 +169,11 @@ impl WebStore { block_has_relevant_notes, serialized_node_ids, serialized_nodes, - note_ids_as_str, - inclusion_proofs_as_str, + output_note_ids_as_str, + output_note_inclusion_proofs_as_str, + input_note_ids_as_str, + input_note_inclusion_proofs_as_str, + input_note_metadatas_as_str, transactions_to_commit_as_str, ); JsFuture::from(promise).await.unwrap(); diff --git a/wasm/src/web_client/store/transactions/mod.rs b/wasm/src/web_client/store/transactions/mod.rs index 7e7081d77..f118c8788 100644 --- a/wasm/src/web_client/store/transactions/mod.rs +++ b/wasm/src/web_client/store/transactions/mod.rs @@ -1,20 +1,26 @@ use std::collections::BTreeMap; -use crate::native_code::{ +use miden_client::{ + client::transactions::{notes_from_output, TransactionRecord, TransactionResult, TransactionStatus}, errors::StoreError, - store::{ - note_record::{ - InputNoteRecord, - OutputNoteRecord - }, TransactionFilter - }, transactions::{ - TransactionRecord, - TransactionResult, TransactionStatus -} + store::{OutputNoteRecord, TransactionFilter}, }; +// use crate::native_code::{ +// errors::StoreError, +// store::{ +// note_record::{ +// InputNoteRecord, +// OutputNoteRecord +// }, TransactionFilter +// }, transactions::{ +// TransactionRecord, +// TransactionResult, TransactionStatus +// } +// }; use crate::web_client::store::notes::utils::{ insert_input_note_tx, - insert_output_note_tx + insert_output_note_tx, + update_note_consumer_tx_id }; use miden_objects::{accounts::AccountId, assembly::ProgramAst, transaction::{OutputNotes, TransactionId, TransactionScript}, Digest, Felt}; @@ -113,9 +119,10 @@ impl WebStore { } pub async fn apply_transaction( - &mut self, + &self, tx_result: TransactionResult ) -> Result<(), StoreError> { + let transaction_id = tx_result.executed_transaction().id(); let account_id = tx_result.executed_transaction().account_id(); let account_delta = tx_result.account_delta(); @@ -123,41 +130,42 @@ impl WebStore { account.apply_delta(account_delta).map_err(StoreError::AccountError)?; - let created_input_notes = tx_result - .relevant_notes() - .into_iter() - .map(|note| InputNoteRecord::from(note.clone())) - .collect::>(); + // Save only input notes that we care for (based on the note screener assessment) + let created_input_notes = tx_result.relevant_notes().to_vec(); - let created_output_notes = tx_result - .created_notes() - .iter() - .map(|note| OutputNoteRecord::from(note.clone())) + // Save all output notes + let created_output_notes = notes_from_output(tx_result.created_notes()) + .cloned() + .map(OutputNoteRecord::from) .collect::>(); + let consumed_note_ids = + tx_result.consumed_notes().iter().map(|note| note.id()).collect::>(); + // Transaction Data insert_proven_transaction_data(tx_result).await.unwrap(); // Account Data - update_account(account).await.unwrap(); + update_account(&account).await.unwrap(); // Updates for notes - - // TODO: see if we should filter the input notes we store to keep notes we can consume with - // existing accounts - for note in &created_input_notes { - insert_input_note_tx(note).await.unwrap(); + for note in created_input_notes { + insert_input_note_tx(¬e).await?; } for note in &created_output_notes { - insert_output_note_tx(note).await.unwrap(); + insert_output_note_tx(note).await?; + } + + for note_id in consumed_note_ids { + update_note_consumer_tx_id(note_id, transaction_id).await?; } Ok(()) } pub(crate) async fn mark_transactions_as_committed( - &mut self, + &self, block_num: u32, transactions_to_commit: &[TransactionId] ) -> Result { diff --git a/wasm/src/web_client/store/transactions/utils.rs b/wasm/src/web_client/store/transactions/utils.rs index 76f67e2de..5cf5a7058 100644 --- a/wasm/src/web_client/store/transactions/utils.rs +++ b/wasm/src/web_client/store/transactions/utils.rs @@ -2,7 +2,11 @@ use miden_objects::{accounts::Account, assembly::AstSerdeOptions, transaction::T use miden_tx::utils::Serializable; use wasm_bindgen_futures::*; -use crate::native_code::{errors::StoreError, transactions::TransactionResult}; +use miden_client::{ + client::transactions::TransactionResult, + errors::StoreError +}; +// use crate::native_code::{errors::StoreError, transactions::TransactionResult}; use crate::web_client::store::accounts::utils::{ insert_account_asset_vault, @@ -124,9 +128,9 @@ pub(super) fn serialize_transaction_data( } pub async fn update_account( - new_account_state: Account, + new_account_state: &Account, ) -> Result<(), ()> { insert_account_storage(new_account_state.storage()).await; insert_account_asset_vault(new_account_state.vault()).await; - insert_account_record(&new_account_state, None).await + insert_account_record(new_account_state, None).await } \ No newline at end of file diff --git a/wasm/src/web_client/sync.rs b/wasm/src/web_client/sync.rs index 365d579fd..246ae7002 100644 --- a/wasm/src/web_client/sync.rs +++ b/wasm/src/web_client/sync.rs @@ -7,10 +7,10 @@ impl WebClient { pub async fn sync_state( &mut self ) -> Result { - if let Some(ref mut client) = self.get_mut_inner() { - let block_num = client.sync_state().await.unwrap(); + if let Some(client) = self.get_mut_inner() { + let sync_summary = client.sync_state().await.unwrap(); - Ok(JsValue::from_f64(block_num as f64)) + Ok(JsValue::from_f64(sync_summary.block_num as f64)) } else { Err(JsValue::from_str("Client not initialized")) } diff --git a/wasm/src/web_client/transactions.rs b/wasm/src/web_client/transactions.rs index c0c35d935..7346dce75 100644 --- a/wasm/src/web_client/transactions.rs +++ b/wasm/src/web_client/transactions.rs @@ -10,19 +10,24 @@ use miden_objects::{ use super::WebClient; use crate::web_client::models::transactions::NewTransactionResult; -use crate::native_code::{ - errors::NoteIdPrefixFetchError, - rpc::NodeRpcClient, - store::{ - note_record::InputNoteRecord, - NoteFilter, - Store, - TransactionFilter - }, - transactions::transaction_request::{ - PaymentTransactionData, TransactionTemplate - }, Client +use miden_client::{ + client::Client, + client::transactions::TransactionRecord, + store::TransactionFilter }; +// use crate::native_code::{ +// errors::NoteIdPrefixFetchError, +// rpc::NodeRpcClient, +// store::{ +// note_record::InputNoteRecord, +// NoteFilter, +// Store, +// TransactionFilter +// }, +// transactions::transaction_request::{ +// PaymentTransactionData, TransactionTemplate +// }, Client +// }; use serde::{Serialize, Deserialize}; use serde_wasm_bindgen::from_value; @@ -30,225 +35,25 @@ use serde_wasm_bindgen::from_value; use wasm_bindgen::prelude::*; use web_sys::console; -#[derive(Serialize, Deserialize)] -#[serde(tag = "type")] -pub enum TransactionType { - /// Create a pay-to-id transaction. - P2ID { - sender_account_id: String, - target_account_id: String, - faucet_id: String, - amount: String, - note_type: String, - }, - /// Mint `amount` tokens from the specified fungible faucet (corresponding to `faucet_id`). The created note can then be then consumed by - /// `target_account_id`. - Mint { - target_account_id: String, - faucet_id: String, - amount: String, - note_type: String, - }, - /// Create a pay-to-id with recall transaction. - P2IDR { - sender_account_id: String, - target_account_id: String, - faucet_id: String, - amount: String, - recall_height: String, - note_type: String, - }, - /// Consume with the account corresponding to `account_id` all of the notes from `list_of_notes`. - ConsumeNotes { - account_id: String, - /// A list of note IDs or the hex prefixes of their corresponding IDs - list_of_notes: Vec, - }, -} - #[wasm_bindgen] impl WebClient { pub async fn get_transactions( &mut self ) -> Result { - if let Some(ref mut client) = self.get_mut_inner() { + if let Some(client) = self.get_mut_inner() { - let transactions = client.get_transactions(TransactionFilter::All).await.unwrap(); + let transactions: Vec = client + .get_transactions(TransactionFilter::All) + .await + .map_err(|e| JsValue::from_str(&format!("Error fetching transactions: {:?}", e)))?; let transactionIds: Vec = transactions.iter().map(|transaction| { transaction.id.to_string() }).collect(); - serde_wasm_bindgen::to_value(&transactionIds).map_err(|e| JsValue::from_str(&e.to_string())) } else { Err(JsValue::from_str("Client not initialized")) } } - - pub async fn new_transaction( - &mut self, - transaction_type: JsValue - ) -> Result { - if let Some(ref mut client) = self.get_mut_inner() { - let transaction_type: TransactionType = from_value(transaction_type).unwrap(); - let transaction_template: TransactionTemplate = build_transaction_template(client, &transaction_type).await.unwrap(); - let transaction_request = client.build_transaction_request(transaction_template).await.unwrap(); - - let transaction_execution_result = client.new_transaction(transaction_request).await.unwrap(); - let result = NewTransactionResult::new( - transaction_execution_result.executed_transaction().id().to_string(), - transaction_execution_result.created_notes().iter().map(|note| note.id().to_string()).collect() - ); - - client.submit_transaction(transaction_execution_result).await.unwrap(); - - Ok(result) - } else { - Err(JsValue::from_str("Client not initialized")) - } - } -} - -fn parse_note_type( - note_type: String -) -> MidenNoteType { - match note_type.as_str() { - "Public" => MidenNoteType::Public, - "Private" => MidenNoteType::OffChain, - _ => MidenNoteType::OffChain - } -} - -async fn build_transaction_template( - client: &Client, - transaction_type: &TransactionType, -) -> Result { - match transaction_type { - TransactionType::P2ID { - sender_account_id, - target_account_id, - faucet_id, - amount, - note_type, - } => { - let note_type: MidenNoteType = parse_note_type(note_type.to_string()); - let amount_as_u64: u64 = amount.parse::().map_err(|err| err.to_string())?; - - let faucet_id = AccountId::from_hex(faucet_id).map_err(|err| err.to_string())?; - let fungible_asset = - FungibleAsset::new(faucet_id, amount_as_u64).map_err(|err| err.to_string())?.into(); - let sender_account_id = - AccountId::from_hex(sender_account_id).map_err(|err| err.to_string())?; - let target_account_id = - AccountId::from_hex(target_account_id).map_err(|err| err.to_string())?; - - let payment_transaction = - PaymentTransactionData::new(fungible_asset, sender_account_id, target_account_id); - - Ok(TransactionTemplate::PayToId(payment_transaction, note_type)) - }, - TransactionType::P2IDR { - sender_account_id, - target_account_id, - faucet_id, - amount, - recall_height, - note_type, - } => { - let note_type: MidenNoteType = parse_note_type(note_type.to_string()); - let amount_as_u64: u64 = amount.parse::().map_err(|err| err.to_string())?; - let recall_height_as_u32: u32 = recall_height.parse::().map_err(|err| err.to_string())?; - - let faucet_id = AccountId::from_hex(faucet_id).map_err(|err| err.to_string())?; - let fungible_asset = - FungibleAsset::new(faucet_id, amount_as_u64).map_err(|err| err.to_string())?.into(); - let sender_account_id = - AccountId::from_hex(sender_account_id).map_err(|err| err.to_string())?; - let target_account_id = - AccountId::from_hex(target_account_id).map_err(|err| err.to_string())?; - - let payment_transaction = - PaymentTransactionData::new(fungible_asset, sender_account_id, target_account_id); - Ok(TransactionTemplate::PayToIdWithRecall( - payment_transaction, - recall_height_as_u32, - note_type, - )) - }, - TransactionType::Mint { - faucet_id, - target_account_id, - amount, - note_type, - } => { - let note_type: MidenNoteType = parse_note_type(note_type.to_string()); - let amount_as_u64: u64 = amount.parse::().map_err(|err| err.to_string())?; - - let faucet_id = AccountId::from_hex(faucet_id).map_err(|err| err.to_string())?; - let fungible_asset = - FungibleAsset::new(faucet_id, amount_as_u64).map_err(|err| err.to_string())?; - let target_account_id = - AccountId::from_hex(target_account_id).map_err(|err| err.to_string())?; - - Ok(TransactionTemplate::MintFungibleAsset( - fungible_asset, - target_account_id, - note_type, - )) - }, - TransactionType::ConsumeNotes { account_id, list_of_notes } => { - - let mut note_ids = Vec::new(); - for note_id in list_of_notes.iter() { - let note_record = get_note_with_id_prefix(client, note_id).await - .unwrap(); - note_ids.push(note_record.id()); - } - let list_of_notes = note_ids; // now contains Vec - - let account_id = AccountId::from_hex(account_id).map_err(|err| err.to_string())?; - - Ok(TransactionTemplate::ConsumeNotes(account_id, list_of_notes)) - }, - } -} - -/// Returns all client's notes whose ID starts with `note_id_prefix` -/// -/// # Errors -/// -/// - Returns [NoteIdPrefixFetchError::NoMatch] if we were unable to find any note where -/// `note_id_prefix` is a prefix of its id. -/// - Returns [NoteIdPrefixFetchError::MultipleMatches] if there were more than one note found -/// where `note_id_prefix` is a prefix of its id. -pub(crate) async fn get_note_with_id_prefix( - client: &Client, - note_id_prefix: &str, -) -> Result { - // log the note_id_prefix - let input_note_records = client - .get_input_notes(NoteFilter::All).await - .map_err(|err| NoteIdPrefixFetchError::NoMatch(note_id_prefix.to_string()))? - .into_iter() - .filter(|note_record| note_record.id().to_hex().starts_with(note_id_prefix)) - .collect::>(); - - if input_note_records.is_empty() { - return Err(NoteIdPrefixFetchError::NoMatch(note_id_prefix.to_string())); - } - if input_note_records.len() > 1 { - let input_note_record_ids = input_note_records - .iter() - .map(|input_note_record| input_note_record.id()) - .collect::>(); - tracing::error!( - "Multiple notes found for the prefix {}: {:?}", - note_id_prefix, - input_note_record_ids - ); - return Err(NoteIdPrefixFetchError::MultipleMatches(note_id_prefix.to_string())); - } - - Ok(input_note_records[0].clone()) } \ No newline at end of file From 2eac715d95fadd66794a50b0063509d942dac495 Mon Sep 17 00:00:00 2001 From: Dennis Garcia Date: Mon, 3 Jun 2024 10:48:23 -0500 Subject: [PATCH 22/42] Debugging --- wasm/Cargo.toml | 2 +- wasm/js/db/accounts.js | 5 +- wasm/js/db/notes.js | 16 + wasm/js/db/sync.js | 5 +- wasm/rollup.config.js | 2 +- wasm/src/web_client/account.rs | 2 + wasm/src/web_client/export.rs | 15 +- wasm/src/web_client/import.rs | 2 +- wasm/src/web_client/mod.rs | 1 + wasm/src/web_client/new_account.rs | 15 +- wasm/src/web_client/new_transactions.rs | 47 +- wasm/src/web_client/notes.rs | 6 +- wasm/src/web_client/rpc/domain/accounts.rs | 4 +- wasm/src/web_client/rpc/domain/blocks.rs | 3 +- wasm/src/web_client/rpc/domain/merkle.rs | 4 +- wasm/src/web_client/rpc/domain/notes.rs | 4 +- wasm/src/web_client/rpc/domain/nullifiers.rs | 4 +- wasm/src/web_client/rpc/mod.rs | 13 +- wasm/src/web_client/store/accounts/mod.rs | 16 +- wasm/src/web_client/store/accounts/utils.rs | 7 +- wasm/src/web_client/store/chain_data/mod.rs | 1 + wasm/src/web_client/store/chain_data/utils.rs | 2 +- wasm/src/web_client/store/mod.rs | 9 +- wasm/src/web_client/store/notes/mod.rs | 70 +- wasm/src/web_client/store/notes/utils.rs | 5 +- wasm/src/web_client/store/sync/mod.rs | 6 +- wasm/src/web_client/sync.rs | 1 + wasm/src/web_client/transactions.rs | 1 + wasm/test.html | 617 +++++++++--------- 29 files changed, 455 insertions(+), 430 deletions(-) diff --git a/wasm/Cargo.toml b/wasm/Cargo.toml index 9e3f2d21d..bc4ef4f23 100644 --- a/wasm/Cargo.toml +++ b/wasm/Cargo.toml @@ -21,7 +21,7 @@ base64 = "0.13" futures = "0.3" getrandom = { version = "0.2", features = ["js"] } hex = { version = "0.4" } -miden-client = { path = "../../demox-miden-client-next", default-features = false, features = ["wasm"] } +miden-client = { path = "../../demox-miden-client-next", version = "0.3.0", default-features = false, features = ["wasm"] } miden-lib = { version = "0.3", default-features = false } miden-tx = { version = "0.3", default-features = false } miden-objects = { version = "0.3", default-features = false, features = ["serde"] } diff --git a/wasm/js/db/accounts.js b/wasm/js/db/accounts.js index abc713d8d..1d5cfbdca 100644 --- a/wasm/js/db/accounts.js +++ b/wasm/js/db/accounts.js @@ -71,6 +71,7 @@ export async function getAccountStub( accountId ) { try { + let allRecords = await accounts.toArray(); // Fetch all records matching the given id const allMatchingRecords = await accounts .where('id') @@ -159,7 +160,7 @@ export async function getAccountStorage( .toArray(); if (allMatchingRecords.length === 0) { - console.log('No records found for given code root.'); + console.log('No records found for given storage root.'); return null; // No records found } @@ -191,7 +192,7 @@ export async function getAccountAssetVault( .toArray(); if (allMatchingRecords.length === 0) { - console.log('No records found for given code root.'); + console.log('No records found for given vault root.'); return null; // No records found } diff --git a/wasm/js/db/notes.js b/wasm/js/db/notes.js index 6969c19ea..a583d44b4 100644 --- a/wasm/js/db/notes.js +++ b/wasm/js/db/notes.js @@ -62,6 +62,22 @@ export async function getInputNotesFromIds( } } +export async function getOutputNotesFromIds( + noteIds +) { + try { + let notes; + + // Fetch the records based on a list of IDs + notes = await outputNotes.where('noteId').anyOf(noteIds).toArray(); + + return await processOutputNotes(notes); + } catch (err) { + console.error("Failed to get input notes: ", err); + throw err; + } +} + export async function getUnspentInputNoteNullifiers() { try { const notes = await db.InputNotes.where('status').equals('Committed').toArray(); diff --git a/wasm/js/db/sync.js b/wasm/js/db/sync.js index e718f7882..583925537 100644 --- a/wasm/js/db/sync.js +++ b/wasm/js/db/sync.js @@ -12,7 +12,10 @@ export async function getNoteTags() { try { const record = await stateSync.get(1); // Since id is the primary key and always 1 if (record) { - return record.tags; + let data = { + tags: JSON.stringify(record.tags) + } + return data; } else { return null; } diff --git a/wasm/rollup.config.js b/wasm/rollup.config.js index 07882fad1..ebd6e6b3d 100644 --- a/wasm/rollup.config.js +++ b/wasm/rollup.config.js @@ -17,7 +17,7 @@ export default [ rust({ cargoArgs: [ // This enables multi-threading - "--features", "testing", // Add this line to include the concurrent feature + // "--features", "testing", // Add this line to include the concurrent feature "--config", `build.rustflags=["-C", "target-feature=+atomics,+bulk-memory,+mutable-globals", "-C", "link-arg=--max-memory=4294967296"]`, "--no-default-features", "-Z", "build-std=panic_abort,std", diff --git a/wasm/src/web_client/account.rs b/wasm/src/web_client/account.rs index ae112d1d4..699a0fa02 100644 --- a/wasm/src/web_client/account.rs +++ b/wasm/src/web_client/account.rs @@ -43,6 +43,7 @@ impl WebClient { pub async fn get_accounts( &mut self ) -> Result { + web_sys::console::log_1(&JsValue::from_str("new_wallet called")); if let Some(client) = self.get_mut_inner() { let account_tuples = client.get_account_stubs().await.unwrap(); let accounts: Vec = account_tuples.into_iter().map(|(account, _)| { @@ -68,6 +69,7 @@ impl WebClient { &mut self, account_id: String ) -> Result { + web_sys::console::log_1(&JsValue::from_str("get_account called")); if let Some(client) = self.get_mut_inner() { let native_account_id = AccountId::from_hex(&account_id).unwrap(); diff --git a/wasm/src/web_client/export.rs b/wasm/src/web_client/export.rs index 2a9f20c4d..4d3a194ec 100644 --- a/wasm/src/web_client/export.rs +++ b/wasm/src/web_client/export.rs @@ -2,7 +2,10 @@ use wasm_bindgen::*; use wasm_bindgen::prelude::*; use miden_client::store::{InputNoteRecord, NoteFilter}; -use miden_objects::Digest; +use miden_objects::{ + utils::Serializable, + Digest +}; use crate::web_client::WebClient; @@ -18,9 +21,8 @@ impl WebClient { .into(); let output_note = client - .get_output_notes(NoteFilter::Unique(note_id))? - .pop() - .expect("should have an output note"); + .get_output_notes(NoteFilter::Unique(note_id)).await.unwrap() + .pop().unwrap(); // Convert output note into InputNoteRecord before exporting let input_note: InputNoteRecord = output_note @@ -29,7 +31,10 @@ impl WebClient { let input_note_bytes = input_note.to_bytes(); - Ok(input_note_bytes) + let serialized_input_note_bytes = serde_wasm_bindgen::to_value(&input_note_bytes) + .unwrap_or_else(|_| wasm_bindgen::throw_val(JsValue::from_str("Serialization error"))); + + Ok(serialized_input_note_bytes) } else { Err(JsValue::from_str("Client not initialized")) } diff --git a/wasm/src/web_client/import.rs b/wasm/src/web_client/import.rs index 9c195ef96..26010a946 100644 --- a/wasm/src/web_client/import.rs +++ b/wasm/src/web_client/import.rs @@ -6,7 +6,7 @@ use miden_objects::{ accounts::AccountData, utils::Deserializable }; -use miden_client::store::note_record::InputNoteRecord; +use miden_client::store::InputNoteRecord; use crate::web_client::WebClient; diff --git a/wasm/src/web_client/mod.rs b/wasm/src/web_client/mod.rs index 7839ccc8d..abad47ee4 100644 --- a/wasm/src/web_client/mod.rs +++ b/wasm/src/web_client/mod.rs @@ -45,6 +45,7 @@ impl WebClient { &mut self, node_url: Option ) -> Result { + web_sys::console::log_1(&JsValue::from_str("create_client called")); let rng = get_random_coin(); let web_store: WebStore = WebStore::new().await.map_err(|_| JsValue::from_str("Failed to initialize WebStore"))?; let web_store = Rc::new(web_store); diff --git a/wasm/src/web_client/new_account.rs b/wasm/src/web_client/new_account.rs index 65726fc57..49b14131b 100644 --- a/wasm/src/web_client/new_account.rs +++ b/wasm/src/web_client/new_account.rs @@ -2,10 +2,7 @@ use wasm_bindgen::*; use wasm_bindgen::prelude::*; use super::WebClient; -use miden_objects::{ - accounts::AccountStorageType, - assets::TokenSymbol, -}; +use miden_objects::assets::TokenSymbol; use miden_client::client::accounts::{AccountTemplate, AccountStorageMode}; #[wasm_bindgen] @@ -15,6 +12,7 @@ impl WebClient { storage_mode: String, mutable: bool ) -> Result { + web_sys::console::log_1(&JsValue::from_str("new_wallet called")); if let Some(client) = self.get_mut_inner() { let client_template = AccountTemplate::BasicWallet { mutable_code: mutable, @@ -44,12 +42,13 @@ impl WebClient { pub async fn new_faucet( &mut self, - storage_type: String, + storage_mode: String, non_fungible: bool, token_symbol: String, decimals: String, max_supply: String ) -> Result { + web_sys::console::log_1(&JsValue::from_str("new_faucet called")); if non_fungible { return Err(JsValue::from_str("Non-fungible faucets are not supported yet")); } @@ -62,9 +61,9 @@ impl WebClient { .map_err(|e| JsValue::from_str(&e.to_string()))?, max_supply: max_supply.parse::() .map_err(|e| JsValue::from_str(&e.to_string()))?, - storage_mode: match storage_type.as_str() { // Note: Fixed typo in variable name - "OffChain" => AccountStorageType::OffChain, - "OnChain" => AccountStorageType::OnChain, + storage_mode: match storage_mode.as_str() { // Note: Fixed typo in variable name + "OffChain" => AccountStorageMode::Local, + "OnChain" => AccountStorageMode::OnChain, _ => return Err(JsValue::from_str("Invalid storage mode")), }, }; diff --git a/wasm/src/web_client/new_transactions.rs b/wasm/src/web_client/new_transactions.rs index b0854a6de..243cf8dfd 100644 --- a/wasm/src/web_client/new_transactions.rs +++ b/wasm/src/web_client/new_transactions.rs @@ -3,7 +3,10 @@ use wasm_bindgen::prelude::*; use miden_objects::{ accounts::AccountId, - assets::FungibleAsset, + assets::{ + FungibleAsset, + Asset::Fungible + }, notes::{NoteId, NoteType as MidenNoteType} }; use miden_client::client::{ @@ -23,6 +26,7 @@ impl WebClient { note_type: String, amount: String, ) -> Result { + web_sys::console::log_1(&JsValue::from_str("new_mint_transaction called")); if let Some(client) = self.get_mut_inner() { let target_account_id = AccountId::from_hex(&target_account_id).unwrap(); let faucet_id = AccountId::from_hex(&faucet_id).unwrap(); @@ -40,14 +44,19 @@ impl WebClient { note_type ); + web_sys::console::log_1(&JsValue::from_str("new_mint_transaction 2")); + let mint_transaction_request = client.build_transaction_request(mint_transaction_template.clone()).await.unwrap(); + web_sys::console::log_1(&JsValue::from_str("new_mint_transaction 3")); let mint_transaction_execution_result = client.new_transaction(mint_transaction_request).await.unwrap(); + web_sys::console::log_1(&JsValue::from_str("new_mint_transaction 4")); let result = NewTransactionResult::new( mint_transaction_execution_result.executed_transaction().id().to_string(), mint_transaction_execution_result.created_notes().iter().map(|note| note.id().to_string()).collect() ); - + web_sys::console::log_1(&JsValue::from_str("new_mint_transaction 5")); client.submit_transaction(mint_transaction_execution_result).await.unwrap(); + web_sys::console::log_1(&JsValue::from_str("new_mint_transaction 6")); Ok(result) } else { @@ -64,6 +73,7 @@ impl WebClient { amount: String, recall_height: Option ) -> Result { + web_sys::console::log_1(&JsValue::from_str("new_send_transaction called")); if let Some(client) = self.get_mut_inner() { let sender_account_id = AccountId::from_hex(&sender_account_id).unwrap(); let target_account_id = AccountId::from_hex(&target_account_id).unwrap(); @@ -75,13 +85,15 @@ impl WebClient { "Private" => MidenNoteType::OffChain, _ => MidenNoteType::OffChain }; - let payment_transaction = PaymentTransactionData::new(fungible_asset, sender_account_id, target_account_id); + let asset = Fungible(fungible_asset); + let payment_transaction = PaymentTransactionData::new(asset, sender_account_id, target_account_id); let send_transaction_template: TransactionTemplate; if let Some(recall_height) = recall_height { + let recall_height_as_u32: u32 = recall_height.parse::().map_err(|err| err.to_string())?; send_transaction_template = TransactionTemplate::PayToIdWithRecall( payment_transaction, - recall_height, + recall_height_as_u32, note_type, ); } else { @@ -111,18 +123,26 @@ impl WebClient { account_id: String, list_of_notes: Vec, ) -> Result { + web_sys::console::log_1(&JsValue::from_str("new_consume_transaction called")); if let Some(client) = self.get_mut_inner() { let account_id = AccountId::from_hex(&account_id).unwrap(); - let list_of_notes = list_of_notes - .iter() - .map(|note_id| { - get_input_note_with_id_prefix(client, note_id) - .map(|note_record| note_record.id()) - .map_err(|err| err.to_string()) - }) - .collect::, _>>()?; + let mut result = Vec::new(); + for note_id in list_of_notes { + match get_input_note_with_id_prefix(client, ¬e_id).await { + Ok(note_record) => result.push(note_record.id()), + Err(err) => return Err(JsValue::from_str(&err.to_string())), + } + } + // let list_of_notes = list_of_notes + // .iter() + // .map(|note_id| { + // get_input_note_with_id_prefix(client, note_id).await + // .map(|note_record| note_record.id()) + // .map_err(|err| err.to_string()) + // }) + // .collect::, _>>()?; - let consume_transaction_template = TransactionTemplate::ConsumeNotes(account_id, list_of_notes); + let consume_transaction_template = TransactionTemplate::ConsumeNotes(account_id, result); let consume_transaction_request = client.build_transaction_request(consume_transaction_template.clone()).await.unwrap(); let consume_transaction_execution_result = client.new_transaction(consume_transaction_request).await.unwrap(); @@ -148,6 +168,7 @@ impl WebClient { requested_asset_amount: String, note_type: String, ) -> Result { + web_sys::console::log_1(&JsValue::from_str("new_swap_transaction called")); if let Some(client) = self.get_mut_inner() { let sender_account_id = AccountId::from_hex(&sender_account_id).unwrap(); let offered_asset_faucet_id = AccountId::from_hex(&offered_asset_faucet_id).unwrap(); diff --git a/wasm/src/web_client/notes.rs b/wasm/src/web_client/notes.rs index 07406f4cf..42f528fc3 100644 --- a/wasm/src/web_client/notes.rs +++ b/wasm/src/web_client/notes.rs @@ -5,7 +5,7 @@ use serde::{Serialize, Deserialize}; use serde_wasm_bindgen::from_value; use web_sys::console; -use miden_client::store::InputNoteRecord; +use miden_client::store::{InputNoteRecord, OutputNoteRecord}; use miden_client::store::NoteFilter; use super::WebClient; @@ -74,7 +74,7 @@ impl WebClient { WebClientNoteFilter::All => NoteFilter::All }; - let notes: Vec = client.get_output_notes(native_filter).await.unwrap(); + let notes: Vec = client.get_output_notes(native_filter).await.unwrap(); let note_ids = notes.iter().map(|note| note.id().to_string() ).collect::>(); @@ -94,7 +94,7 @@ impl WebClient { let note_id: NoteId = Digest::try_from(note_id) .map_err(|err| format!("Failed to parse output note id: {}", err))? .into(); - let note: InputNoteRecord = client.get_output_note(note_id).await.unwrap(); + let note: OutputNoteRecord = client.get_output_note(note_id).await.unwrap(); serde_wasm_bindgen::to_value(¬e.id().to_string()).map_err(|e| JsValue::from_str(&e.to_string())) } else { diff --git a/wasm/src/web_client/rpc/domain/accounts.rs b/wasm/src/web_client/rpc/domain/accounts.rs index 497a2eca7..80581490b 100644 --- a/wasm/src/web_client/rpc/domain/accounts.rs +++ b/wasm/src/web_client/rpc/domain/accounts.rs @@ -8,9 +8,7 @@ use miden_objects::{ Digest, }; -use miden_client::errors::ConversionError; -// use crate::native_code::errors::{ConversionError, MissingFieldHelper}; - +use miden_client::errors::{ConversionError, MissingFieldHelper}; use crate::web_client::rpc::client_grpc::{ account::{ AccountId as AccountIdPb, diff --git a/wasm/src/web_client/rpc/domain/blocks.rs b/wasm/src/web_client/rpc/domain/blocks.rs index 297b2e6ac..f33ee8370 100644 --- a/wasm/src/web_client/rpc/domain/blocks.rs +++ b/wasm/src/web_client/rpc/domain/blocks.rs @@ -1,7 +1,6 @@ use miden_objects::BlockHeader; -use miden_client::errors::ConversionError; -// use crate::native_code::errors::{ConversionError, MissingFieldHelper}; +use miden_client::errors::{ConversionError, MissingFieldHelper}; use crate::web_client::rpc::client_grpc::block_header; // BLOCK HEADER diff --git a/wasm/src/web_client/rpc/domain/merkle.rs b/wasm/src/web_client/rpc/domain/merkle.rs index c436d3c7b..6fc8f0f9a 100644 --- a/wasm/src/web_client/rpc/domain/merkle.rs +++ b/wasm/src/web_client/rpc/domain/merkle.rs @@ -3,12 +3,10 @@ use miden_objects::{ Digest, Word, }; -use miden_client::errors::ConversionError; +use miden_client::errors::{ConversionError, MissingFieldHelper}; use super::{convert, try_convert}; -// use crate::native_code::errors::{ConversionError, MissingFieldHelper}; - use crate::web_client::rpc::client_grpc; // MERKLE PATH diff --git a/wasm/src/web_client/rpc/domain/notes.rs b/wasm/src/web_client/rpc/domain/notes.rs index 001061085..1871d2930 100644 --- a/wasm/src/web_client/rpc/domain/notes.rs +++ b/wasm/src/web_client/rpc/domain/notes.rs @@ -2,9 +2,7 @@ use miden_objects::{ notes::{NoteMetadata, NoteTag, NoteType}, Felt, }; -use miden_client::errors::ConversionError; - -// use crate::native_code::errors::{ConversionError, MissingFieldHelper}; +use miden_client::errors::{ConversionError, MissingFieldHelper}; impl TryFrom for NoteMetadata { type Error = ConversionError; diff --git a/wasm/src/web_client/rpc/domain/nullifiers.rs b/wasm/src/web_client/rpc/domain/nullifiers.rs index 10f469a23..db513fa86 100644 --- a/wasm/src/web_client/rpc/domain/nullifiers.rs +++ b/wasm/src/web_client/rpc/domain/nullifiers.rs @@ -2,9 +2,7 @@ use miden_objects::{ crypto::{hash::rpo::RpoDigest, merkle::SmtProof}, notes::Nullifier, }; -use miden_client::errors::ConversionError; - -// use crate::native_code::errors::{ConversionError, MissingFieldHelper}; +use miden_client::errors::{ConversionError, MissingFieldHelper}; use crate::web_client::rpc::client_grpc::{digest::Digest, responses::NullifierBlockInputRecord}; diff --git a/wasm/src/web_client/rpc/mod.rs b/wasm/src/web_client/rpc/mod.rs index da51e3bbc..ebb092a66 100644 --- a/wasm/src/web_client/rpc/mod.rs +++ b/wasm/src/web_client/rpc/mod.rs @@ -8,7 +8,11 @@ use wasm_bindgen_futures::*; use miden_objects::{ accounts::{Account, AccountId}, crypto::merkle::{MerklePath, MmrProof}, - notes::{Note, NoteId, NoteMetadata, NoteTag, NoteType}, + notes::{ + NoteMetadata, + NoteId, + Note, NoteTag, NoteType + }, transaction::ProvenTransaction, utils::Deserializable, BlockHeader, Digest, Felt, @@ -88,7 +92,7 @@ impl NodeRpcClient for WebRpcClient { &mut self, block_num: Option, include_mmr_proof: bool, - ) -> Result { + ) -> Result<(BlockHeader, Option), NodeRpcClientError> { let mut query_client = self.build_api_client(); let request = GetBlockHeaderByNumberRequest { @@ -253,11 +257,10 @@ impl NodeRpcClient for WebRpcClient { async fn get_account_update( &mut self, account_id: AccountId - ) -> Result { + ) -> Result { let mut query_client = self.build_api_client(); - let account_id = account_id.into(); - let request = GetAccountDetailsRequest { account_id: Some(account_id) }; + let request = GetAccountDetailsRequest { account_id: Some(account_id.into()) }; let response = query_client.get_account_details(request).await.map_err(|err| { NodeRpcClientError::RequestError( diff --git a/wasm/src/web_client/store/accounts/mod.rs b/wasm/src/web_client/store/accounts/mod.rs index f7c2cd84e..c5e76a8e8 100644 --- a/wasm/src/web_client/store/accounts/mod.rs +++ b/wasm/src/web_client/store/accounts/mod.rs @@ -47,7 +47,7 @@ impl WebStore { ) -> Result)>, StoreError> { let promise = idxdb_get_account_stubs(); let js_value = JsFuture::from(promise).await.unwrap(); - let account_stubs_idxdb: Vec = from_value(js_value)?; + let account_stubs_idxdb: Vec = from_value(js_value).unwrap(); let account_stubs: Result)>, StoreError> = account_stubs_idxdb .into_iter() @@ -65,7 +65,7 @@ impl WebStore { let promise = idxdb_get_account_stub(account_id_str); let js_value = JsFuture::from(promise).await.unwrap(); - let account_stub_idxdb: AccountRecordIdxdbOjbect = from_value(js_value)?; + let account_stub_idxdb: AccountRecordIdxdbOjbect = from_value(js_value).unwrap(); parse_account_record_idxdb_object(account_stub_idxdb) } @@ -128,7 +128,7 @@ impl WebStore { &self, root: Digest ) -> Result, StoreError> { - let root_serialized = root.to_string(); + let root_serialized = serde_json::to_string(&root.to_string()).unwrap(); let promise = idxdb_get_account_asset_vault(root_serialized); let js_value = JsFuture::from(promise).await.unwrap(); @@ -160,11 +160,11 @@ impl WebStore { account_seed: Option, auth_info: &AuthSecretKey, ) -> Result<(), StoreError> { - insert_account_code(account.code()).await?; - insert_account_storage(account.storage()).await?; - insert_account_asset_vault(account.vault()).await?; - insert_account_record(account, account_seed).await?; - insert_account_auth(account.id(), auth_info).await?; + insert_account_code(account.code()).await.unwrap(); + insert_account_storage(account.storage()).await.unwrap(); + insert_account_asset_vault(account.vault()).await.unwrap(); + insert_account_record(account, account_seed).await.unwrap(); + insert_account_auth(account.id(), auth_info).await.unwrap(); Ok(()) } diff --git a/wasm/src/web_client/store/accounts/utils.rs b/wasm/src/web_client/store/accounts/utils.rs index 972a8704e..d8bc2af48 100644 --- a/wasm/src/web_client/store/accounts/utils.rs +++ b/wasm/src/web_client/store/accounts/utils.rs @@ -6,6 +6,7 @@ use miden_objects::{ accounts::{Account, AccountCode, AccountId, AccountStorage, AccountStub, AuthSecretKey}, assembly::AstSerdeOptions, assets::{Asset, AssetVault}, + utils::Deserializable, Felt, Digest, Word }; use miden_tx::utils::Serializable; @@ -98,14 +99,14 @@ pub async fn insert_account_record( pub fn parse_account_record_idxdb_object( account_stub_idxdb: AccountRecordIdxdbOjbect ) -> Result<(AccountStub, Option), StoreError> { - let native_account_id: AccountId = AccountId::from_hex(&account_stub_idxdb.id)?; - let native_nonce: u64 = account_stub_idxdb.nonce.parse::()?; + let native_account_id: AccountId = AccountId::from_hex(&account_stub_idxdb.id).unwrap(); + let native_nonce: u64 = account_stub_idxdb.nonce.parse::().map_err(|err| StoreError::ParsingError(err.to_string()))?; let account_seed = account_stub_idxdb.account_seed.map(|seed| Word::read_from_bytes(&seed)).transpose()?; let account_stub = AccountStub::new( native_account_id, Felt::new(native_nonce), - serde_json::from_str(&account_stub_idxdb.vault_root)?, + serde_json::from_str(&account_stub_idxdb.vault_root).map_err(StoreError::InputSerializationError)?, Digest::try_from(&account_stub_idxdb.storage_root)?, Digest::try_from(&account_stub_idxdb.code_root)?, ); diff --git a/wasm/src/web_client/store/chain_data/mod.rs b/wasm/src/web_client/store/chain_data/mod.rs index b4fa3055e..0b6f46327 100644 --- a/wasm/src/web_client/store/chain_data/mod.rs +++ b/wasm/src/web_client/store/chain_data/mod.rs @@ -165,6 +165,7 @@ impl WebStore { } pub(crate) async fn insert_chain_mmr_nodes( + &self, nodes: &[(InOrderIndex, Digest)], ) -> Result<(), StoreError> { let mut serialized_node_ids = Vec::new(); diff --git a/wasm/src/web_client/store/chain_data/utils.rs b/wasm/src/web_client/store/chain_data/utils.rs index b7e4039f5..69afce7b2 100644 --- a/wasm/src/web_client/store/chain_data/utils.rs +++ b/wasm/src/web_client/store/chain_data/utils.rs @@ -1,6 +1,6 @@ use miden_objects::{crypto::merkle::InOrderIndex, BlockHeader, Digest}; -use miden_client::store::StoreError; +use miden_client::errors::StoreError; // use crate::native_code::errors::StoreError; type SerializedBlockHeaderData = (String, String, String, bool); diff --git a/wasm/src/web_client/store/mod.rs b/wasm/src/web_client/store/mod.rs index 0ace2f683..b76dad011 100644 --- a/wasm/src/web_client/store/mod.rs +++ b/wasm/src/web_client/store/mod.rs @@ -12,7 +12,8 @@ use miden_objects::{ BlockHeader, Digest, Word }; use miden_client::{ - store::{ChainMmrNodeFilter, InputNoteRecord, NoteFilter, OutputNoteRecord, Store, StoreError, TransactionFilter}, + errors::StoreError, + store::{ChainMmrNodeFilter, InputNoteRecord, NoteFilter, OutputNoteRecord, Store, TransactionFilter}, client::{ sync::StateSyncUpdate, transactions::{TransactionRecord, TransactionResult} @@ -51,7 +52,7 @@ impl WebStore { } } -#[async_trait(?Send)] +// #[async_trait(?Send)] impl Store for WebStore { // SYNC // -------------------------------------------------------------------------------------------- @@ -111,14 +112,14 @@ impl Store for WebStore { async fn get_input_notes( &self, - filter: NoteFilter, + filter: NoteFilter<'_>, ) -> Result, StoreError> { self.get_input_notes(filter).await } async fn get_output_notes( &self, - note_filter: NoteFilter, + note_filter: NoteFilter<'_>, ) -> Result, StoreError> { self.get_output_notes(note_filter).await } diff --git a/wasm/src/web_client/store/notes/mod.rs b/wasm/src/web_client/store/notes/mod.rs index 394ad6d1a..beddc61d8 100644 --- a/wasm/src/web_client/store/notes/mod.rs +++ b/wasm/src/web_client/store/notes/mod.rs @@ -31,7 +31,7 @@ use utils::*; impl WebStore { pub(crate) async fn get_input_notes( &self, - filter: NoteFilter + filter: NoteFilter<'_> ) -> Result, StoreError> { let promise = match filter { NoteFilter::All | NoteFilter::Consumed | NoteFilter::Committed | NoteFilter::Pending => { @@ -48,7 +48,7 @@ impl WebStore { }, NoteFilter::List(ids) => { let note_ids_as_str: Vec = ids.into_iter().map(|id| id.inner().to_string()).collect(); - idxdb_get_input_notes_from_ids(ids) + idxdb_get_input_notes_from_ids(note_ids_as_str) }, NoteFilter::Unique(id) => { let note_id_as_str = id.inner().to_string(); @@ -62,21 +62,24 @@ impl WebStore { let native_input_notes: Result, StoreError> = input_notes_idxdb .into_iter() - .map(|note| parse_input_note_idxdb_object(note)) - .collect(); // Collect results into a single Result - - match filter { - NoteFilter::Unique(note_id) if native_input_notes.is_empty() => { - return Err(StoreError::NoteNotFound(note_id)); - }, - NoteFilter::List(note_ids) if note_ids.len() != native_input_notes.len() => { - let missing_note_id = note_ids - .iter() - .find(|¬e_id| !native_input_notes.iter().any(|note_record| note_record.id() == *note_id)) - .expect("should find one note id that wasn't retrieved by the db"); - return Err(StoreError::NoteNotFound(*missing_note_id)); + .map(parse_input_note_idxdb_object) // Simplified closure + .collect::, _>>(); // Collect results into a single Result + + match native_input_notes { + Ok(ref notes) => match filter { + NoteFilter::Unique(note_id) if notes.is_empty() => { + return Err(StoreError::NoteNotFound(note_id)); + }, + NoteFilter::List(note_ids) if note_ids.len() != notes.len() => { + let missing_note_id = note_ids + .iter() + .find(|&¬e_id| !notes.iter().any(|note_record| note_record.id() == note_id)) + .expect("should find one note id that wasn't retrieved by the db"); + return Err(StoreError::NoteNotFound(*missing_note_id)); + }, + _ => {}, }, - _ => {}, + Err(e) => return Err(e), } native_input_notes @@ -84,7 +87,7 @@ impl WebStore { pub(crate) async fn get_output_notes( &self, - filter: NoteFilter + filter: NoteFilter<'_> ) -> Result, StoreError> { let promise = match filter { NoteFilter::All | NoteFilter::Consumed | NoteFilter::Committed | NoteFilter::Pending => { @@ -101,7 +104,7 @@ impl WebStore { }, NoteFilter::List(ids) => { let note_ids_as_str: Vec = ids.into_iter().map(|id| id.inner().to_string()).collect(); - idxdb_get_output_notes_from_ids(ids) + idxdb_get_output_notes_from_ids(note_ids_as_str) }, NoteFilter::Unique(id) => { let note_id_as_str = id.inner().to_string(); @@ -115,21 +118,24 @@ impl WebStore { let native_output_notes: Result, StoreError> = output_notes_idxdb .into_iter() - .map(|note| parse_output_note_idxdb_object(note)) - .collect(); // Collect results into a single Result - - match filter { - NoteFilter::Unique(note_id) if native_output_notes.is_empty() => { - return Err(StoreError::NoteNotFound(note_id)); - }, - NoteFilter::List(note_ids) if note_ids.len() != native_output_notes.len() => { - let missing_note_id = note_ids - .iter() - .find(|¬e_id| !native_output_notes.iter().any(|note_record| note_record.id() == *note_id)) - .expect("should find one note id that wasn't retrieved by the db"); - return Err(StoreError::NoteNotFound(*missing_note_id)); + .map(parse_output_note_idxdb_object) // Simplified closure + .collect::, _>>(); // Collect results into a single Result + + match native_output_notes { + Ok(ref notes) => match filter { + NoteFilter::Unique(note_id) if notes.is_empty() => { + return Err(StoreError::NoteNotFound(note_id)); + }, + NoteFilter::List(note_ids) if note_ids.len() != notes.len() => { + let missing_note_id = note_ids + .iter() + .find(|&¬e_id| !notes.iter().any(|note_record| note_record.id() == note_id)) + .expect("should find one note id that wasn't retrieved by the db"); + return Err(StoreError::NoteNotFound(*missing_note_id)); + }, + _ => {}, }, - _ => {}, + Err(e) => return Err(e), } native_output_notes diff --git a/wasm/src/web_client/store/notes/utils.rs b/wasm/src/web_client/store/notes/utils.rs index 8c071e347..8e425a007 100644 --- a/wasm/src/web_client/store/notes/utils.rs +++ b/wasm/src/web_client/store/notes/utils.rs @@ -2,6 +2,7 @@ use miden_objects::{ accounts::AccountId, notes::{NoteAssets, NoteId, NoteInclusionProof, NoteMetadata, NoteScript}, transaction::TransactionId, + utils::Deserializable, Digest }; use miden_tx::utils::Serializable; @@ -53,7 +54,7 @@ pub(crate) async fn update_note_consumer_tx_id( let serialized_consumer_tx_id = consumer_tx_id.to_string(); let promise = idxdb_update_note_consumer_tx_id(serialized_note_id, serialized_consumer_tx_id); - let result = JsFuture::from(promise).await?; + let result = JsFuture::from(promise).await.unwrap(); Ok(()) } @@ -344,7 +345,7 @@ pub fn parse_output_note_idxdb_object( .map_err(StoreError::JsonDataDeserializationError)?; let consumer_account_id: Option = match note_idxdb.consumer_account_id { - Some(account_id) => Some(AccountId::try_from(account_id as u64)?), + Some(account_id) => Some(AccountId::try_from(account_id.parse::().unwrap())?), None => None, }; diff --git a/wasm/src/web_client/store/sync/mod.rs b/wasm/src/web_client/store/sync/mod.rs index d968d8718..3e3b89657 100644 --- a/wasm/src/web_client/store/sync/mod.rs +++ b/wasm/src/web_client/store/sync/mod.rs @@ -28,8 +28,8 @@ impl WebStore { pub(crate) async fn get_note_tags( &self ) -> Result, StoreError>{ - let promsie = idxdb_get_note_tags(); - let js_value = JsFuture::from(promsie).await.unwrap(); + let promise = idxdb_get_note_tags(); + let js_value = JsFuture::from(promise).await.unwrap(); let tags_idxdb: NoteTagsIdxdbObject = from_value(js_value).unwrap(); let tags: Vec = serde_json::from_str(&tags_idxdb.tags).unwrap(); @@ -50,7 +50,7 @@ impl WebStore { pub(super) async fn add_note_tag( &self, - tag: u64 + tag: NoteTag ) -> Result { let mut tags = self.get_note_tags().await.unwrap(); if tags.contains(&tag) { diff --git a/wasm/src/web_client/sync.rs b/wasm/src/web_client/sync.rs index 246ae7002..8cc3e0ccc 100644 --- a/wasm/src/web_client/sync.rs +++ b/wasm/src/web_client/sync.rs @@ -7,6 +7,7 @@ impl WebClient { pub async fn sync_state( &mut self ) -> Result { + web_sys::console::log_1(&JsValue::from_str("sync_state called")); if let Some(client) = self.get_mut_inner() { let sync_summary = client.sync_state().await.unwrap(); diff --git a/wasm/src/web_client/transactions.rs b/wasm/src/web_client/transactions.rs index 7346dce75..e2d0c2126 100644 --- a/wasm/src/web_client/transactions.rs +++ b/wasm/src/web_client/transactions.rs @@ -40,6 +40,7 @@ impl WebClient { pub async fn get_transactions( &mut self ) -> Result { + web_sys::console::log_1(&JsValue::from_str("get_transactions called")); if let Some(client) = self.get_mut_inner() { let transactions: Vec = client diff --git a/wasm/test.html b/wasm/test.html index 3ea198db0..9c073da86 100644 --- a/wasm/test.html +++ b/wasm/test.html @@ -24,12 +24,12 @@ const reader = new FileReader(); reader.onload = async function(e) { + let webClient = await createMidenWebClient(); const arrayBuffer = e.target.result; const byteArray = new Uint8Array(arrayBuffer); console.log(byteArray); // Now you can work with the bytes - let result = await testImportAccount(webClient, byteArray); - console.log(result); + await testImportAccount(webClient, byteArray); }; reader.readAsArrayBuffer(file); @@ -79,55 +79,37 @@ // Account Functions /////////////////////////////////////////////////////////////////// - function createBasicImmutableAccountTemplate( - storageMode - ) { - return { - type: "BasicImmutable", - storage_mode: storageMode - }; - } - - function createBasicMutableAccountTemplate( - storageMode + async function createNewWallet( + webClient, + storageMode, + mutable ) { - return { - type: "BasicMutable", - storage_mode: storageMode - }; + try { + let result = await webClient.new_wallet(storageMode, mutable); + console.log(`Created new wallet account with id ${result}`); + return result; + } catch (error) { + console.error('Failed to call create account:', error); + } } - function createFungibleFaucetAccountTemplate( + async function createNewFaucet( + webClient, + storageMode, + nonFungible, tokenSymbol, decimals, - maxSupply, - storageMode - ) { - return { - type: "FungibleFaucet", - token_symbol: tokenSymbol, - decimals: decimals, - max_supply: maxSupply, - storage_mode: storageMode - }; - } - - function createNonFungibleFaucetAccountTemplate( - storageMode - ) { - return { - type: "NonFungibleFaucet", - storage_mode: storageMode - }; - } - - async function createNewAccount( - webClient, - accountTemplate + maxSupply ) { try { - let result = await webClient.new_account(accountTemplate); - console.log(`Created ${accountTemplate.type} account with id ${result}`); + let result = await webClient.new_faucet( + storageMode, + nonFungible, + tokenSymbol, + decimals, + maxSupply + ); + console.log(`Created new wallet account with id ${result}`); return result; } catch (error) { console.error('Failed to call create account:', error); @@ -141,6 +123,7 @@ try { let result = await webClient.import_account(accountAsBytes); console.log(result); + return result; } catch (error) { console.error('Failed to call import account:', error); } @@ -164,33 +147,106 @@ try { let result = await webClient.get_account(accountId); console.log(result); + return result; } catch (error) { console.error('Failed to call get account:', error); } } - async function getAccountStubsById( + // Transaction Functions + /////////////////////////////////////////////////////////////////// + + async function createNewMintTransaction( webClient, - accountId + targetAccountId, + faucetId, + noteType, + amount ) { try { - let result = await webClient.get_account_stub_by_id(accountId); - console.log(result); + let result = await webClient.new_mint_transaction( + targetAccountId, + faucetId, + noteType, + amount + ); + console.log(`Created new mint transaction with id ${result.transaction_id}`); + console.log(`Output notes created: ${result.created_note_ids}`); + return result; + } catch (error) { + console.error('Failed to call create new mint transaction:', error); + } + } + async function createNewConsumeTransaction( + webClient, + accountId, + listOfNotes + ) { + try { + let result = await webClient.new_consume_transaction(accountId, listOfNotes); + console.log(`Created new consume transaction with id ${result.transaction_id}`); + console.log(`Output notes created: ${result.created_note_ids}`); + return result; } catch (error) { - console.error('Failed to call get account stub by id:', error); + console.error('Failed to call create new consume transaction:', error); } } - async function getAccountAuth( + async function createNewSendTransaction( + webClient, + senderAccountId, + targetAccountId, + facuetId, + noteType, + amount, + recallHeight + ) { + try { + let result = await webClient.new_send_transaction(); + console.log(`Created new send transaction with id ${result.transaction_id}`); + console.log(`Output notes created: ${result.created_note_ids}`); + return result; + } catch (error) { + console.error('Failed to call create new send transaction:', error); + } + } + + async function createNewSwapTransaction( + webClient, + senderAccountId, + offeredAssetFaucetId, + offeredAssetAmount, + requestedAssetFaucetId, + requestedAssetAmount, + noteType + ) { + try { + let result = await webClient.new_swap_transaction( + senderAccountId, + offeredAssetFaucetId, + offeredAssetAmount, + requestedAssetFaucetId, + requestedAssetAmount, + noteType + ); + console.log(`Created new swap transaction with id ${result.transaction_id}`); + console.log(`Output notes created: ${result.created_note_ids}`); + return result; + } catch (error) { + console.error('Failed to call create new swap transaction:', error); + } + } + + async function getTransactions( webClient, - accountId ) { try { - let result = await webClient.get_account_auth(accountId); + let result = await webClient.get_transactions(); console.log(result); + return result; } catch (error) { - console.error('Failed to call get account auth:', error); + console.error('Failed to call get transactions:', error); } } @@ -246,98 +302,6 @@ } } - // Transaction Functions - /////////////////////////////////////////////////////////////////// - - function createP2IDTransactionTemplate( - senderAccountId, - targetAccountId, - faucetId, - amount, - noteType - ) { - return { - type: "P2ID", - sender_account_id: senderAccountId, - target_account_id: targetAccountId, - faucet_id: faucetId, - amount: amount, - note_type: noteType - }; - } - - function createMintTransactionTemplate( - targetAccountId, - faucetId, - amount, - noteType - ) { - return { - type: "Mint", - target_account_id: targetAccountId, - faucet_id: faucetId, - amount: amount, - note_type: noteType - }; - } - - function createP2IDRTransactionTemplate( - senderAccountId, - targetAccountId, - faucetId, - amount, - recallHeight, - noteType - ) { - return { - type: "P2IDR", - sender_account_id: senderAccountId, - target_account_id: targetAccountId, - faucet_id: faucetId, - amount: amount, - recall_height: recallHeight, - note_type: noteType - }; - } - - function createConsumeNotesTransactionTemplate( - accountId, - listOfNotes - ) { - return { - type: "ConsumeNotes", - account_id: accountId, - list_of_notes: listOfNotes - }; - } - - async function getTransactions( - webClient, - transactionFilter = "All" - ) { - try { - let result = await webClient.get_transactions(transactionFilter); - console.log(result); - return result; - } catch (error) { - console.error('Failed to call get transactions:', error); - } - } - - async function createTransaction( - webClient, - transactionTemplate - ) { - try { - let result = await webClient.new_transaction(transactionTemplate); - console.log(`Created new transaction with id ${result.transaction_id}`); - console.log(`Output notes created: ${result.created_note_ids}`); - return result; - } catch (error) { - console.error('Failed to call new transaction:', error); - } - } - // Sync Functions /////////////////////////////////////////////////////////////////// @@ -353,270 +317,281 @@ // Tests /////////////////////////////////////////////////////////////////// - async function testCreateAllAccountTypes() { - console.log('testCreateAllAccountTypes started'); + // Done + async function testCreateNewWallet() { + console.log('testCreateNewWallet started'); let webClient = await createMidenWebClient(); - let regularAccountLocalTemplate = await createBasicMutableAccountTemplate("Local"); - await createNewAccount(webClient, regularAccountLocalTemplate); - - let regularAccountOnChainTemplate = await createBasicMutableAccountTemplate("OnChain"); - await createNewAccount(webClient, regularAccountOnChainTemplate); + await createNewWallet(webClient, "OffChain", true); - let immutableAccountLocalTemplate = await createBasicImmutableAccountTemplate("Local"); - await createNewAccount(webClient, immutableAccountLocalTemplate); + console.log('testCreateNewWallet finished'); + } - let immutableAccountOnChainTemplate = await createBasicImmutableAccountTemplate("OnChain"); - await createNewAccount(webClient, immutableAccountOnChainTemplate); + async function testCreateNewFaucet() { + console.log('testCreateNewFaucet started'); + let webClient = await createMidenWebClient(); - let fungibleFaucetAccountLocalTemplate = await createFungibleFaucetAccountTemplate( + await createNewFaucet( + webClient, + "OffChain", + false, "DEN", "10", - "1000000", - "Local" + "1000000" ); - await createNewAccount(webClient, fungibleFaucetAccountLocalTemplate); - let fungibleFaucetAccountOnChainTemplate = await createFungibleFaucetAccountTemplate( - "DEN", - "10", - "1000000", - "OnChain" - ); - await createNewAccount(webClient, fungibleFaucetAccountOnChainTemplate); + console.log('testCreateNewFaucet finished'); + } - await syncState(webClient); + async function testImportAccount(webClient, accountAsBytes) { + console.log('testImportAccount started'); + await importAccount(webClient, accountAsBytes); + console.log('testImportAccount finished'); + } - // let nonFungibleFaucetAccountLocalTemplate = await createNonFungibleFaucetAccountTemplate("Local"); - // await createNewAccount(webClient, nonFungibleFaucetAccountLocalTemplate); + async function testGetAccounts(shouldCreateAccounts = true) { + console.log('testGetAccounts started'); + let webClient = await createMidenWebClient(); + if (shouldCreateAccounts) { + await createNewWallet(webClient, "OffChain", true); + } - // let nonFungibleFaucetAccountOnChainTemplate = await createNonFungibleFaucetAccountTemplate("OnChain"); - // await createNewAccount(webClient, nonFungibleFaucetAccountOnChainTemplate); + await getAccounts(webClient); - console.log('testCreateAllAccountTypes finished'); + console.log('testGetAccounts finished'); } - async function testGetAccounts() { - console.log('testGetAccounts started'); + async function testGetAccount(shouldCreateAccount = true, accountId = null) { + console.log('testGetAccount started'); let webClient = await createMidenWebClient(); + if (shouldCreateAccount) { + accountId = await createNewWallet(webClient, "OffChain", true); + } - let regularAccountLocalTemplate = await createBasicMutableAccountTemplate("Local"); - await createNewAccount(webClient, regularAccountLocalTemplate); - - let fungibleFaucetAccountLocalTemplate = await createFungibleFaucetAccountTemplate( - "DEN", - "10", - "1000000", - "Local" - ); - await createNewAccount(webClient, fungibleFaucetAccountLocalTemplate); + await getAccount(webClient, accountId); - await getAccounts(webClient) - console.log('testGetAccounts finished'); + console.log('testGetAccount finished'); } - - async function testMintAsset() { - console.log("testMintAsset started"); + + async function testNewMintTransaction(shouldCreateAccounts = true, targetAccountId = null, faucetId = null) { + console.log('testNewMintTransaction started'); let webClient = await createMidenWebClient(); + if (shouldCreateAccounts) { + targetAccountId = await createNewWallet(webClient, "OffChain", true); + faucetId = await createNewFaucet(webClient, "OffChain", false, "DEN", "10", "1000000"); + } + await syncState(webClient); + await new Promise(r => setTimeout(r, 10000)); - // Create accounts and sync - let regularAccountTemplate = createBasicMutableAccountTemplate("Local"); - let fungibleFaucetAccountTemplate = createFungibleFaucetAccountTemplate( - "DEN", - "10", - "1000000", - "Local" + let result = await createNewMintTransaction( + webClient, + targetAccountId, + faucetId, + "Private", + "1000" ); - let regularAccountId = await createNewAccount(webClient, regularAccountTemplate); - let faucetId = await createNewAccount(webClient, fungibleFaucetAccountTemplate); + await new Promise(r => setTimeout(r, 10000)); + await syncState(webClient); + console.log('testNewMintTransaction finished'); + } + + async function testNewConsumeTransaction() { + console.log('testNewConsumeTransaction started'); + let webClient = await createMidenWebClient(); + let targetAccountId = await createNewWallet(webClient, "OffChain", true); + let faucetId = await createNewFaucet(webClient, "OffChain", false, "DEN", "10", "1000000"); await syncState(webClient); await new Promise(r => setTimeout(r, 10000)); - // Create mint transaction and sync - let transactionTemplate = createMintTransactionTemplate( - regularAccountId, + let mintTransactionResult = await createNewMintTransaction( + webClient, + targetAccountId, faucetId, - "1000", - "Private" + "Private", + "1000" ); - let createTransactionResult = await createTransaction(webClient, transactionTemplate); await new Promise(r => setTimeout(r, 10000)); await syncState(webClient); - // Create consume transaction and sync - let consumeTransactionTemplate = createConsumeNotesTransactionTemplate( - regularAccountId, - createTransactionResult.created_note_ids + let consumeTransactionResult = await createNewConsumeTransaction( + webClient, + targetAccountId, + mintTransactionResult.created_note_ids ); - await createTransaction(webClient, consumeTransactionTemplate); await new Promise(r => setTimeout(r, 10000)); await syncState(webClient); - - console.log("testMintAsset finished"); + console.log('testNewMintTransaction finished'); } - async function testP2IDTransaction() { - console.log("testP2IDTransaction started"); + async function testNewSendTransaction() { + console.log('testNewSendTransaction started'); let webClient = await createMidenWebClient(); - - // Create accounts and sync - let senderAccountTemplate = createBasicMutableAccountTemplate("Local"); - let targetAccountTemplate = createBasicMutableAccountTemplate("Local"); - let faucetAccountTemplate = createFungibleFaucetAccountTemplate( - "DEN", - "10", - "1000000", - "Local" - ); - let senderAccountId = await createNewAccount(webClient, senderAccountTemplate); - let targetAccountId = await createNewAccount(webClient, targetAccountTemplate); - let faucetId = await createNewAccount(webClient, faucetAccountTemplate); + let senderAccountId = await createNewWallet(webClient, "OffChain", true); + let targetAccountId = await createNewWallet(webClient, "OffChain", true); + let faucetId = await createNewFaucet(webClient, "OffChain", false, "DEN", "10", "1000000"); await syncState(webClient); await new Promise(r => setTimeout(r, 10000)); - // Create mint transaction and sync - let mintTransactionTemplate = createMintTransactionTemplate( + let mintTransactionResult = await createNewMintTransaction( + webClient, senderAccountId, faucetId, - "1000", - "Private" + "Private", + "1000" ); - let mintTransactionResult = await createTransaction(webClient, mintTransactionTemplate); await new Promise(r => setTimeout(r, 10000)); await syncState(webClient); - // Create consume transaction and sync - let consumeMintedAssetsTransactionTemplate = createConsumeNotesTransactionTemplate( + let consumeTransactionResult = await createNewConsumeTransaction( + webClient, senderAccountId, mintTransactionResult.created_note_ids ); - await createTransaction(webClient, consumeMintedAssetsTransactionTemplate); await new Promise(r => setTimeout(r, 10000)); await syncState(webClient); - // Create P2ID transaction and sync - let p2idTransactionTemplate = createP2IDTransactionTemplate( + let sendTransactionResult = await createNewSendTransaction( + webClient, senderAccountId, targetAccountId, faucetId, - "500", - "Private" + "Private", + "500" ); - let p2idTransactionResult = await createTransaction(webClient, p2idTransactionTemplate); await new Promise(r => setTimeout(r, 10000)); await syncState(webClient); - // Create consume transaction and sync - // Create consume transaction and sync - let consumeP2IDAssetsTransactionTemplate = createConsumeNotesTransactionTemplate( + let consumeSendTransactionResult = await createNewConsumeTransaction( + webClient, targetAccountId, - p2idTransactionResult.created_note_ids + sendTransactionResult.created_note_ids ); - await createTransaction(webClient, consumeP2IDAssetsTransactionTemplate); await new Promise(r => setTimeout(r, 10000)); await syncState(webClient); - - console.log("testP2IDTransaction finished"); + console.log('testNewSendTransaction finished'); } - - async function testP2IDRTransaction() { - console.log("testP2IDRTransaction started"); - let webClient = await createMidenWebClient(); - // Create accounts and sync - let senderAccountTemplate = createBasicMutableAccountTemplate("Local"); - let targetAccountTemplate = createBasicMutableAccountTemplate("Local"); - let faucetAccountTemplate = createFungibleFaucetAccountTemplate( - "DEN", - "10", - "1000000", - "Local" - ); - let senderAccountId = await createNewAccount(webClient, senderAccountTemplate); - let targetAccountId = await createNewAccount(webClient, targetAccountTemplate); - let faucetId = await createNewAccount(webClient, faucetAccountTemplate); + async function testNewSendTransactionWithRecallHeight() { + console.log('testNewSendTransactionWithRecallHeight started'); + let webClient = await createMidenWebClient(); + let senderAccountId = await createNewWallet(webClient, "OffChain", true); + let targetAccountId = await createNewWallet(webClient, "OffChain", true); + let faucetId = await createNewFaucet(webClient, "OffChain", false, "DEN", "10", "1000000"); await syncState(webClient); await new Promise(r => setTimeout(r, 10000)); - // Create mint transaction and sync - let mintTransactionTemplate = createMintTransactionTemplate( + let mintTransactionResult = await createNewMintTransaction( + webClient, senderAccountId, faucetId, - "1000", - "Private" + "Private", + "1000" ); - let mintTransactionResult = await createTransaction(webClient, mintTransactionTemplate); await new Promise(r => setTimeout(r, 10000)); await syncState(webClient); - // Create consume transaction and sync - let consumeMintedAssetsTransactionTemplate = createConsumeNotesTransactionTemplate( + let consumeTransactionResult = await createNewConsumeTransaction( + webClient, senderAccountId, mintTransactionResult.created_note_ids ); - await createTransaction(webClient, consumeMintedAssetsTransactionTemplate); await new Promise(r => setTimeout(r, 10000)); await syncState(webClient); - // Create P2ID transaction and sync - let p2idrTransactionTemplate = createP2IDRTransactionTemplate( + let sendTransactionResult = await createNewSendTransaction( + webClient, senderAccountId, targetAccountId, faucetId, + "Private", "500", - "7000", - "Private" + "0" ); - let p2idrTransactionResult = await createTransaction(webClient, p2idrTransactionTemplate); await new Promise(r => setTimeout(r, 10000)); await syncState(webClient); - // Create consume transaction and sync - let consumeP2IDRAssetsTransactionTemplate = createConsumeNotesTransactionTemplate( + let consumeSendTransactionResult = await createNewConsumeTransaction( + webClient, senderAccountId, - p2idrTransactionResult.created_note_ids + sendTransactionResult.created_note_ids ); - await createTransaction(webClient, consumeP2IDRAssetsTransactionTemplate); await new Promise(r => setTimeout(r, 10000)); await syncState(webClient); - - console.log("testP2IDRTransaction finished"); - } + console.log('testNewSendTransactionWithRecallHeight finished'); + } + + // async function testNewSwapTransaction() { + // console.log('testNewSwapTransaction started'); + // let webClient = await createMidenWebClient(); + // let senderAccountId = await createNewWallet(webClient, "OffChain", true); + // let offeredAssetFaucetId = await createNewFaucet(webClient, "OffChain", false, "DEN", "10", "1000000"); + // let requestedAssetFaucetId = await createNewFaucet(webClient, "OffChain", false, "GAR", "10", "1000000"); + // await syncState(webClient); + // await new Promise(r => setTimeout(r, 10000)); + + // let mintTransactionResult = await createNewMintTransaction( + // webClient, + // senderAccountId, + // offeredAssetFaucetId, + // "Private", + // "1000" + // ); + // await new Promise(r => setTimeout(r, 10000)); + // await syncState(webClient); + + // let consumeTransactionResult = await createNewConsumeTransaction( + // webClient, + // senderAccountId, + // mintTransactionResult.created_note_ids + // ); + // await new Promise(r => setTimeout(r, 10000)); + // await syncState(webClient); + + // let swapTransactionResult = await createNewSwapTransaction( + // webClient, + // senderAccountId, + // offeredAssetFaucetId, + // "500", + // requestedAssetFaucetId, + // "500", + // "Private" + // ); + // await new Promise(r => setTimeout(r, 10000)); + // await syncState(webClient); + + // let consumeSwapTransactionResult = await createNewConsumeTransaction( + // webClient, + // senderAccountId, + // swapTransactionResult.created_note_ids + // ); + // await new Promise(r => setTimeout(r, 10000)); + // await syncState(webClient); + // console.log('testNewSwapTransaction finished'); + // } async function testGetTransactions() { console.log("testGetTransactions started"); let webClient = await createMidenWebClient(); - - // Create accounts and sync - let regularAccountTemplate = createBasicMutableAccountTemplate("Local"); - let fungibleFaucetAccountTemplate = createFungibleFaucetAccountTemplate( - "DEN", - "10", - "1000000", - "Local" - ); - let regularAccountId = await createNewAccount(webClient, regularAccountTemplate); - let faucetId = await createNewAccount(webClient, fungibleFaucetAccountTemplate); + let walletAccount = await createNewWallet(webClient, "OffChain", true); + let faucetAccount = await createNewFaucet(webClient, "OffChain", false, "DEN", "10", "1000000"); await syncState(webClient); await new Promise(r => setTimeout(r, 10000)); - - // Create mint transaction and sync - let transactionTemplate = createMintTransactionTemplate( - regularAccountId, - faucetId, - "1000", - "Private" + + let mintTransactionResult = await createNewMintTransaction( + webClient, + walletAccount, + faucetAccount, + "Private", + "1000" ); - let createTransactionResult = await createTransaction(webClient, transactionTemplate); await new Promise(r => setTimeout(r, 20000)); await syncState(webClient); - // Create consume transaction and sync - let consumeTransactionTemplate = createConsumeNotesTransactionTemplate( - regularAccountId, - createTransactionResult.created_note_ids + let consumeTransactionResult = await createNewConsumeTransaction( + webClient, + walletAccount, + mintTransactionResult.created_note_ids ); - await createTransaction(webClient, consumeTransactionTemplate); await new Promise(r => setTimeout(r, 20000)); await syncState(webClient); @@ -625,21 +600,6 @@ console.log("testGetTransactions finished"); } - async function testGetAccount() { - console.log("testGetAccount started"); - let webClient = await createMidenWebClient(); - - // Create account and sync - let regularAccountTemplate = createBasicMutableAccountTemplate("Local"); - let regularAccountId = await createNewAccount(webClient, regularAccountTemplate); - await syncState(webClient); - await new Promise(r => setTimeout(r, 10000)); - - await getAccount(webClient, regularAccountId); - - console.log("testGetAccount finished"); - } - async function testGetNotes() { console.log("testGetNotes started"); let webClient = await createMidenWebClient(); @@ -814,12 +774,23 @@ // await syncState(webClient); } + // await testCreateNewWallet(); + // await testCreateNewFaucet(); + // await testGetAccounts(false); + // await testGetAccount(false, "0x8add712899d6ab76"); + await testNewMintTransaction(false, "0x8add712899d6ab76", "0x248226f3436b0068"); + // await testNewConsumeTransaction(); + // await testNewSendTransaction(); + // await testNewSendTransactionWithRecallHeight(); + // await testNewSwapTransaction(); + // await testGetTransactions(); + // await testCreateAllAccountTypes(); // await testGetAccount(); // await testGetAccounts(); // await testGetNotes(); // await testGetNote(); - await testExportInputNote(); + // await testExportInputNote(); // await testMintAsset(); // await testP2IDTransaction(); // await testP2IDRTransaction(); From a12c6f2667a5b4c2cae532b189781a562d868f4d Mon Sep 17 00:00:00 2001 From: Dennis Garcia Date: Tue, 4 Jun 2024 16:44:13 -0500 Subject: [PATCH 23/42] Working until transaction authenticator gets called --- wasm/Cargo.toml | 14 ++++++++++---- wasm/rollup.config.js | 3 ++- wasm/test.html | 2 +- 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/wasm/Cargo.toml b/wasm/Cargo.toml index bc4ef4f23..9d4ef47c1 100644 --- a/wasm/Cargo.toml +++ b/wasm/Cargo.toml @@ -21,10 +21,10 @@ base64 = "0.13" futures = "0.3" getrandom = { version = "0.2", features = ["js"] } hex = { version = "0.4" } -miden-client = { path = "../../demox-miden-client-next", version = "0.3.0", default-features = false, features = ["wasm"] } -miden-lib = { version = "0.3", default-features = false } -miden-tx = { version = "0.3", default-features = false } -miden-objects = { version = "0.3", default-features = false, features = ["serde"] } +miden-client = { path = "../../demox-miden-client-next", default-features = false, features = ["wasm"] } +miden-lib = { path = "../../miden-base/miden-lib", default-features = false } +miden-tx = { path = "../../miden-base/miden-tx", default-features = false } +miden-objects = { path = "../../miden-base/objects", default-features = false, features = ["serde"] } prost = { version = "0.12.3" } serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" @@ -37,3 +37,9 @@ web-sys = { version = "0.3", features = ["console"] } [build-dependencies] tonic-build = { version="0.11.0", default-features = false, features = ["prost"]} + +[profile.release] +# Use dev settings for release +opt-level = 0 +debug = true +rpath = false diff --git a/wasm/rollup.config.js b/wasm/rollup.config.js index ebd6e6b3d..e6fda5f78 100644 --- a/wasm/rollup.config.js +++ b/wasm/rollup.config.js @@ -15,10 +15,11 @@ export default [ }, plugins: [ rust({ + debug: true, cargoArgs: [ // This enables multi-threading // "--features", "testing", // Add this line to include the concurrent feature - "--config", `build.rustflags=["-C", "target-feature=+atomics,+bulk-memory,+mutable-globals", "-C", "link-arg=--max-memory=4294967296"]`, + "--config", `build.rustflags=["-C", "target-feature=+atomics,+bulk-memory,+mutable-globals", "-C", "link-arg=--max-memory=4294967296", "-C", "debuginfo=2"]`, "--no-default-features", "-Z", "build-std=panic_abort,std", ], diff --git a/wasm/test.html b/wasm/test.html index 9c073da86..bffa9a704 100644 --- a/wasm/test.html +++ b/wasm/test.html @@ -778,7 +778,7 @@ // await testCreateNewFaucet(); // await testGetAccounts(false); // await testGetAccount(false, "0x8add712899d6ab76"); - await testNewMintTransaction(false, "0x8add712899d6ab76", "0x248226f3436b0068"); + await testNewMintTransaction(false, "0x8add712899d6ab76", "0x20421649f243d662"); // await testNewConsumeTransaction(); // await testNewSendTransaction(); // await testNewSendTransactionWithRecallHeight(); From 5cf332684648b9d832b577fa51ead8a5beb13e8f Mon Sep 17 00:00:00 2001 From: Evan Date: Tue, 4 Jun 2024 15:11:02 -0700 Subject: [PATCH 24/42] Make transaction authenticator sync --- rust-toolchain | 1 - wasm/Cargo.toml | 14 +++----- wasm/js/db/accounts.js | 32 ++++++++++++++++- wasm/rollup.config.js | 5 +-- wasm/src/web_client/account.rs | 36 +++++++++++++++++++ wasm/src/web_client/mod.rs | 23 ++++++++++-- .../web_client/store/accounts/js_bindings.rs | 5 +++ wasm/src/web_client/store/accounts/mod.rs | 19 ++++++++-- wasm/src/web_client/store/mod.rs | 4 +-- wasm/test.html | 36 +++++++++++++++++-- 10 files changed, 153 insertions(+), 22 deletions(-) delete mode 100644 rust-toolchain diff --git a/rust-toolchain b/rust-toolchain deleted file mode 100644 index 8e95c75da..000000000 --- a/rust-toolchain +++ /dev/null @@ -1 +0,0 @@ -1.78 diff --git a/wasm/Cargo.toml b/wasm/Cargo.toml index 9d4ef47c1..95b1f1f01 100644 --- a/wasm/Cargo.toml +++ b/wasm/Cargo.toml @@ -21,11 +21,12 @@ base64 = "0.13" futures = "0.3" getrandom = { version = "0.2", features = ["js"] } hex = { version = "0.4" } -miden-client = { path = "../../demox-miden-client-next", default-features = false, features = ["wasm"] } -miden-lib = { path = "../../miden-base/miden-lib", default-features = false } -miden-tx = { path = "../../miden-base/miden-tx", default-features = false } -miden-objects = { path = "../../miden-base/objects", default-features = false, features = ["serde"] } +miden-client = { path = "../../miden-client", version = "0.3.0", default-features = false, features = ["wasm"] } +miden-lib = { path="../../miden-base-new/miden-lib", default-features = false } +miden-tx = { path="../../miden-base-new/miden-tx", default-features = false, features = ["async"] } +miden-objects = { path="../../miden-base-new/objects", default-features = false, features = ["std", "serde"] } prost = { version = "0.12.3" } +rand = { version = "0.8.5" } serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" serde-wasm-bindgen = "0.6.5" @@ -38,8 +39,3 @@ web-sys = { version = "0.3", features = ["console"] } [build-dependencies] tonic-build = { version="0.11.0", default-features = false, features = ["prost"]} -[profile.release] -# Use dev settings for release -opt-level = 0 -debug = true -rpath = false diff --git a/wasm/js/db/accounts.js b/wasm/js/db/accounts.js index 1d5cfbdca..47293a5ec 100644 --- a/wasm/js/db/accounts.js +++ b/wasm/js/db/accounts.js @@ -241,7 +241,27 @@ export async function getAccountAuth( } } -export async function getAccountAuthByPubKey( +export function getAccountAuthByPubKey( + pubKey +) { + // Try to get the account auth from the cache + let pubKeyArray = new Uint8Array(pubKey); + let pubKeyBase64 = uint8ArrayToBase64(pubKeyArray); + let cachedAccountAuth = ACCOUNT_AUTH_MAP.get(pubKeyBase64); + // Print the cache for debugging + console.log('PubKey', pubKeyBase64); + console.log('ACCOUNT_AUTH_MAP', ACCOUNT_AUTH_MAP); + + // If it's not in the cache, throw an error + if (!cachedAccountAuth) { + throw new Error('Account auth not found in cache.'); + } + + return cachedAccountAuth; +} + +var ACCOUNT_AUTH_MAP = new Map(); +export async function fetchAndCacheAccountAuthByPubKey( pubKey ) { try { @@ -253,6 +273,7 @@ export async function getAccountAuthByPubKey( .where('pubKey') .equals(pubKeyBase64) .toArray(); + console.log('allMatchingRecords', allMatchingRecords); if (allMatchingRecords.length === 0) { console.log('No records found for given account ID.'); @@ -264,8 +285,17 @@ export async function getAccountAuthByPubKey( // Convert the authInfo Blob to an ArrayBuffer const authInfoArrayBuffer = await authRecord.authInfo.arrayBuffer(); + console.log('authInfoArrayBuffer', authInfoArrayBuffer); const authInfoArray = new Uint8Array(authInfoArrayBuffer); const authInfoBase64 = uint8ArrayToBase64(authInfoArray); + + // Store the auth info in the map + console.log('fetchAndCacheAccountAuthByPubKey', pubKeyBase64); + ACCOUNT_AUTH_MAP.set(pubKeyBase64, { + id: authRecord.accountId, + auth_info: authInfoBase64 + }); + return { id: authRecord.accountId, auth_info: authInfoBase64 diff --git a/wasm/rollup.config.js b/wasm/rollup.config.js index e6fda5f78..2261c6eaf 100644 --- a/wasm/rollup.config.js +++ b/wasm/rollup.config.js @@ -15,11 +15,12 @@ export default [ }, plugins: [ rust({ - debug: true, + // debug: true, cargoArgs: [ // This enables multi-threading // "--features", "testing", // Add this line to include the concurrent feature - "--config", `build.rustflags=["-C", "target-feature=+atomics,+bulk-memory,+mutable-globals", "-C", "link-arg=--max-memory=4294967296", "-C", "debuginfo=2"]`, + "--config", `build.rustflags=["-C", "target-feature=+atomics,+bulk-memory,+mutable-globals", "-C", "link-arg=--max-memory=4294967296"]`, + // "--config", `build.rustflags=["-C", "target-feature=+atomics,+bulk-memory,+mutable-globals", "-C", "link-arg=--max-memory=4294967296", "-C", "debuginfo=2"]`, "--no-default-features", "-Z", "build-std=panic_abort,std", ], diff --git a/wasm/src/web_client/account.rs b/wasm/src/web_client/account.rs index 699a0fa02..9aeffc3da 100644 --- a/wasm/src/web_client/account.rs +++ b/wasm/src/web_client/account.rs @@ -81,4 +81,40 @@ impl WebClient { Err(JsValue::from_str("Client not initialized")) } } + + pub fn get_account_auth_by_pub_key( + &mut self, + pub_key_bytes: JsValue + ) -> Result { + use miden_objects::Word; + web_sys::console::log_1(&JsValue::from_str("get_account_auth_by_pub_key called")); + if let Some(client) = self.get_mut_inner() { + let pub_key_bytes_result: Vec = from_value(pub_key_bytes).unwrap(); + let pub_key_as_word = Word::read_from_bytes(pub_key_bytes_result.as_slice()).unwrap(); + + let result = client.store().get_account_auth_by_pub_key(pub_key_as_word).unwrap(); + + Ok(JsValue::from_str("Okay, it worked")) + } else { + Err(JsValue::from_str("Client not initialized")) + } + } + + pub async fn fetch_and_cache_account_auth_by_pub_key( + &mut self, + pub_key_bytes: JsValue + ) -> Result { + use miden_objects::Word; + web_sys::console::log_1(&JsValue::from_str("fetch_and_cache_account_auth_by_pub_key called")); + if let Some(client) = self.get_mut_inner() { + let pub_key_bytes_result: Vec = from_value(pub_key_bytes).unwrap(); + let pub_key_as_word = Word::read_from_bytes(pub_key_bytes_result.as_slice()).unwrap(); + + let result = client.store().fetch_and_cache_account_auth_by_pub_key(pub_key_as_word).await.unwrap(); + + Ok(JsValue::from_str("Okay, it worked")) + } else { + Err(JsValue::from_str("Client not initialized")) + } + } } \ No newline at end of file diff --git a/wasm/src/web_client/mod.rs b/wasm/src/web_client/mod.rs index abad47ee4..080551da4 100644 --- a/wasm/src/web_client/mod.rs +++ b/wasm/src/web_client/mod.rs @@ -1,6 +1,6 @@ use alloc::rc::Rc; use wasm_bindgen::prelude::*; -use miden_objects::crypto::rand::RpoRandomCoin; +use miden_objects::{ utils::Deserializable, crypto::rand::RpoRandomCoin }; use miden_tx::TransactionAuthenticator; use miden_client::client::{Client, get_random_coin, store_authenticator::StoreAuthenticator}; @@ -25,14 +25,15 @@ use rpc::WebRpcClient; #[wasm_bindgen] pub struct WebClient { - inner: Option>> + inner: Option>>, + tx_authenticator: Option>, } #[wasm_bindgen] impl WebClient { #[wasm_bindgen(constructor)] pub fn new() -> Self { - WebClient { inner: None } + WebClient { inner: None, tx_authenticator: None } } // Getter for the inner client, used internally for operations @@ -52,8 +53,24 @@ impl WebClient { let authenticator: StoreAuthenticator = StoreAuthenticator::new_with_rng(web_store.clone(), rng); let web_rpc_client = WebRpcClient::new(&node_url.unwrap_or_else(|| "http://localhost:57291".to_string())); + // self.tx_authenticator = Some(authenticator); self.inner = Some(Client::new(web_rpc_client, rng, web_store, authenticator, false)); Ok(JsValue::from_str("Client created successfully")) } + + // pub async fn set_account_auth_by_pub_key( + // &mut self, + // pub_key: String + // ) -> Result { + // web_sys::console::log_1(&JsValue::from_str("set_account_auth_by_pub_key called")); + // if let Some(client) = self.get_mut_inner() { + // let pub_key = hex::decode(pub_key).map_err(|_| JsValue::from_str("Failed to decode public key"))?; + // let pub_key = miden_objects::Word::read_from_bytes(&pub_key).unwrap(); + // self.tx_authenticator.as_mut().unwrap().set_auth_secret_key(pub_key).await.map_err(|_| JsValue::from_str("Failed to set auth secret key"))?; + // Ok(JsValue::from_str("Auth secret key set successfully")) + // } else { + // Err(JsValue::from_str("Client not initialized")) + // } + // } } \ No newline at end of file diff --git a/wasm/src/web_client/store/accounts/js_bindings.rs b/wasm/src/web_client/store/accounts/js_bindings.rs index b343128bb..204a392fc 100644 --- a/wasm/src/web_client/store/accounts/js_bindings.rs +++ b/wasm/src/web_client/store/accounts/js_bindings.rs @@ -40,6 +40,11 @@ extern "C" { #[wasm_bindgen(js_name = getAccountAuthByPubKey)] pub fn idxdb_get_account_auth_by_pub_key( pub_key: Vec + ) -> JsValue; + + #[wasm_bindgen(js_name = fetchAndCacheAccountAuthByPubKey)] + pub fn idxdb_fetch_and_cache_account_auth_by_pub_key( + pub_key: Vec ) -> js_sys::Promise; // INSERTS diff --git a/wasm/src/web_client/store/accounts/mod.rs b/wasm/src/web_client/store/accounts/mod.rs index c5e76a8e8..88c281e15 100644 --- a/wasm/src/web_client/store/accounts/mod.rs +++ b/wasm/src/web_client/store/accounts/mod.rs @@ -170,10 +170,25 @@ impl WebStore { } /// Returns an [AuthSecretKey] by a public key represented by a [Word] - pub async fn get_account_auth_by_pub_key(&self, pub_key: Word) -> Result { + pub(crate) fn get_account_auth_by_pub_key(&self, pub_key: Word) -> Result { let pub_key_bytes = pub_key.to_bytes(); - let promise = idxdb_get_account_auth_by_pub_key(pub_key_bytes); + let js_value = idxdb_get_account_auth_by_pub_key(pub_key_bytes); + let account_auth_idxdb: AccountAuthIdxdbObject = from_value(js_value).unwrap(); + + // Convert the auth_info to the appropriate AuthInfo enum variant + let auth_info = AuthSecretKey::read_from_bytes(&account_auth_idxdb.auth_info)?; + + Ok(auth_info) + } + + /// Fetches an [AuthSecretKey] by a public key represented by a [Word] and caches it in the store + pub(crate) async fn fetch_and_cache_account_auth_by_pub_key(&self, pub_key: Word) -> Result { + // Print to console for debugging + console::log_1(&JsValue::from_str("fetch_and_cache_account_auth_by_pub_key called inner")); + let pub_key_bytes = pub_key.to_bytes(); + + let promise = idxdb_fetch_and_cache_account_auth_by_pub_key(pub_key_bytes); let js_value = JsFuture::from(promise).await.unwrap(); let account_auth_idxdb: AccountAuthIdxdbObject = from_value(js_value).unwrap(); diff --git a/wasm/src/web_client/store/mod.rs b/wasm/src/web_client/store/mod.rs index b76dad011..57224e03f 100644 --- a/wasm/src/web_client/store/mod.rs +++ b/wasm/src/web_client/store/mod.rs @@ -222,10 +222,10 @@ impl Store for WebStore { self.get_account_auth(account_id).await } - async fn get_account_auth_by_pub_key( + fn get_account_auth_by_pub_key( &self, pub_key: Word ) -> Result { - self.get_account_auth_by_pub_key(pub_key).await + self.get_account_auth_by_pub_key(pub_key) } } \ No newline at end of file diff --git a/wasm/test.html b/wasm/test.html index bffa9a704..c88dd3732 100644 --- a/wasm/test.html +++ b/wasm/test.html @@ -93,6 +93,33 @@ } } + function base64ToUint8Array(base64) { + // Decode the base64 string to a binary string + const binaryString = atob(base64); + + // Create a Uint8Array and assign the binary string's character codes to it + const len = binaryString.length; + const bytes = new Uint8Array(len); + for (let i = 0; i < len; i++) { + bytes[i] = binaryString.charCodeAt(i); + } + + return bytes; + } + + async function getAccountAuthByPubKey(pubKeyAsString) { + const webClient = await createMidenWebClient(); + try { + // create bytes from string + let pubKeyAsBytes = base64ToUint8Array(pubKeyAsString); + let result = webClient.get_account_auth_by_pub_key(pubKeyAsBytes); + console.log(result); + return result; + } catch (error) { + console.error('Failed to call get account:', error); + } + } + async function createNewFaucet( webClient, storageMode, @@ -382,7 +409,10 @@ } await syncState(webClient); await new Promise(r => setTimeout(r, 10000)); - + // Call getAccountAuthByPubKey first to set the account auth + let pubKeyAsString = "YR2+eK/dug5TsPsq/DXl3FKFuLe5MsQhXai8Zb6gC0I="; + let pubKeyAsBytes = base64ToUint8Array(pubKeyAsString); + await webClient.fetch_and_cache_account_auth_by_pub_key(pubKeyAsBytes); let result = await createNewMintTransaction( webClient, targetAccountId, @@ -774,11 +804,13 @@ // await syncState(webClient); } + // await getAccountAuthByPubKey(); + // await testCreateNewWallet(); // await testCreateNewFaucet(); // await testGetAccounts(false); // await testGetAccount(false, "0x8add712899d6ab76"); - await testNewMintTransaction(false, "0x8add712899d6ab76", "0x20421649f243d662"); + await testNewMintTransaction(false, "0x8add712899d6ab76", "0x248226f3436b0068"); // await testNewConsumeTransaction(); // await testNewSendTransaction(); // await testNewSendTransactionWithRecallHeight(); From 6a09a9385526e11541e84947a6e07568d4b79f7b Mon Sep 17 00:00:00 2001 From: Dennis Garcia Date: Wed, 12 Jun 2024 16:23:50 -0500 Subject: [PATCH 25/42] Integration testing almost done --- wasm/Cargo.toml | 8 +- wasm/js/db/accounts.js | 29 +- wasm/js/db/chainData.js | 7 + wasm/js/db/notes.js | 14 + wasm/js/db/sync.js | 37 +- wasm/src/web_client/account.rs | 6 +- wasm/src/web_client/import.rs | 15 +- wasm/src/web_client/mod.rs | 3 +- wasm/src/web_client/models/transactions.rs | 49 ++ wasm/src/web_client/new_account.rs | 20 +- wasm/src/web_client/new_transactions.rs | 81 ++- wasm/src/web_client/notes.rs | 1 + wasm/src/web_client/rpc/mod.rs | 1 - .../web_client/store/accounts/js_bindings.rs | 2 +- wasm/src/web_client/store/accounts/mod.rs | 5 +- wasm/src/web_client/store/notes/mod.rs | 10 + wasm/src/web_client/store/notes/utils.rs | 21 +- wasm/src/web_client/tags.rs | 25 + wasm/src/web_client/transactions.rs | 13 - wasm/test.html | 547 +++++++++++++----- 20 files changed, 671 insertions(+), 223 deletions(-) create mode 100644 wasm/src/web_client/tags.rs diff --git a/wasm/Cargo.toml b/wasm/Cargo.toml index 95b1f1f01..11c861d43 100644 --- a/wasm/Cargo.toml +++ b/wasm/Cargo.toml @@ -21,10 +21,10 @@ base64 = "0.13" futures = "0.3" getrandom = { version = "0.2", features = ["js"] } hex = { version = "0.4" } -miden-client = { path = "../../miden-client", version = "0.3.0", default-features = false, features = ["wasm"] } -miden-lib = { path="../../miden-base-new/miden-lib", default-features = false } -miden-tx = { path="../../miden-base-new/miden-tx", default-features = false, features = ["async"] } -miden-objects = { path="../../miden-base-new/objects", default-features = false, features = ["std", "serde"] } +miden-client = { path = "../../demox-miden-client-next", version = "0.3.0", default-features = false, features = ["wasm", "async"] } +miden-lib = { path="../../demox-miden-base/miden-lib", default-features = false, features = ["testing"] } +miden-tx = { path="../../demox-miden-base/miden-tx", default-features = false, features = ["async"] } +miden-objects = { path="../../demox-miden-base/objects", default-features = false, features = ["std", "serde", "testing"] } prost = { version = "0.12.3" } rand = { version = "0.8.5" } serde = { version = "1.0", features = ["derive"] } diff --git a/wasm/js/db/accounts.js b/wasm/js/db/accounts.js index 47293a5ec..c9559e1f9 100644 --- a/wasm/js/db/accounts.js +++ b/wasm/js/db/accounts.js @@ -213,6 +213,7 @@ export async function getAccountAuth( accountId ) { try { + console.log('called getAccountAuth'); // Fetch all records matching the given id const allMatchingRecords = await accountAuths .where('accountId') @@ -223,14 +224,18 @@ export async function getAccountAuth( console.log('No records found for given account ID.'); return null; // No records found } + console.log('allMatchingRecords', allMatchingRecords); // The first record is the only one due to the uniqueness constraint const authRecord = allMatchingRecords[0]; + console.log('authRecord', authRecord); // Convert the authInfo Blob to an ArrayBuffer const authInfoArrayBuffer = await authRecord.authInfo.arrayBuffer(); const authInfoArray = new Uint8Array(authInfoArrayBuffer); const authInfoBase64 = uint8ArrayToBase64(authInfoArray); + console.log('authInfoBase64', authInfoBase64); + console.log('authRecord.accountId', authRecord.accountId); return { id: authRecord.accountId, auth_info: authInfoBase64 @@ -244,34 +249,39 @@ export async function getAccountAuth( export function getAccountAuthByPubKey( pubKey ) { + console.log('called getAccountAuthByPubKey'); // Try to get the account auth from the cache let pubKeyArray = new Uint8Array(pubKey); let pubKeyBase64 = uint8ArrayToBase64(pubKeyArray); let cachedAccountAuth = ACCOUNT_AUTH_MAP.get(pubKeyBase64); + console.log(cachedAccountAuth) // Print the cache for debugging console.log('PubKey', pubKeyBase64); console.log('ACCOUNT_AUTH_MAP', ACCOUNT_AUTH_MAP); + console.log('account_info', cachedAccountAuth.auth_info) // If it's not in the cache, throw an error if (!cachedAccountAuth) { throw new Error('Account auth not found in cache.'); } - return cachedAccountAuth; + let data = { + id: cachedAccountAuth.id, + auth_info: cachedAccountAuth.auth_info + } + + return data; } var ACCOUNT_AUTH_MAP = new Map(); export async function fetchAndCacheAccountAuthByPubKey( - pubKey + accountId ) { try { - let pubKeyArray = new Uint8Array(pubKey); - let pubKeyBase64 = uint8ArrayToBase64(pubKeyArray); - // Fetch all records matching the given id const allMatchingRecords = await accountAuths - .where('pubKey') - .equals(pubKeyBase64) + .where('accountId') + .equals(accountId) .toArray(); console.log('allMatchingRecords', allMatchingRecords); @@ -290,12 +300,13 @@ export async function fetchAndCacheAccountAuthByPubKey( const authInfoBase64 = uint8ArrayToBase64(authInfoArray); // Store the auth info in the map - console.log('fetchAndCacheAccountAuthByPubKey', pubKeyBase64); - ACCOUNT_AUTH_MAP.set(pubKeyBase64, { + ACCOUNT_AUTH_MAP.set(authRecord.pubKey, { id: authRecord.accountId, auth_info: authInfoBase64 }); + console.log('ACCOUNT_AUTH_MAP', ACCOUNT_AUTH_MAP); + return { id: authRecord.accountId, auth_info: authInfoBase64 diff --git a/wasm/js/db/chainData.js b/wasm/js/db/chainData.js index c3efd9369..8abeeee39 100644 --- a/wasm/js/db/chainData.js +++ b/wasm/js/db/chainData.js @@ -48,12 +48,16 @@ export async function insertChainMmrNodes( export async function getBlockHeaders( blockNumbers ) { + console.log("called getBlockHeaders with blockNumbers: ", blockNumbers); try { const blockHeaderPromises = blockNumbers.map(blockNum => blockHeaders.get(blockNum) ); const results = await Promise.all(blockHeaderPromises); + + console.log("blockNum map"); + console.log(results); // replace any undefined values with null results.forEach((result, index) => { @@ -69,6 +73,9 @@ export async function getBlockHeaders( } }); + console.log("blockNum map after"); + console.log(results); + return results } catch (err) { console.error("Failed to get block headers: ", err); diff --git a/wasm/js/db/notes.js b/wasm/js/db/notes.js index a583d44b4..7104a5cd9 100644 --- a/wasm/js/db/notes.js +++ b/wasm/js/db/notes.js @@ -9,6 +9,7 @@ import { export async function getOutputNotes( status ) { + console.log("called getOutputNotes"); try { let notes; @@ -29,15 +30,19 @@ export async function getOutputNotes( export async function getInputNotes( status ) { + console.log("called getInputNotes"); try { let notes; // Fetch the records based on the filter if (status === 'All') { + console.log("fetching all notes"); notes = await inputNotes.toArray(); } else { + console.log("fetching notes with status: ", status); notes = await inputNotes.where('status').equals(status).toArray(); } + console.log("notes: ", notes); return await processInputNotes(notes); } catch (err) { @@ -49,12 +54,16 @@ export async function getInputNotes( export async function getInputNotesFromIds( noteIds ) { + console.log("called getInputNotesFromIds"); + console.log("noteIds: ", noteIds); try { let notes; // Fetch the records based on a list of IDs notes = await inputNotes.where('noteId').anyOf(noteIds).toArray(); + console.log("notes: ", notes); + return await processInputNotes(notes); } catch (err) { console.error("Failed to get input notes: ", err); @@ -146,6 +155,9 @@ export async function insertOutputNote( serializedNoteScript, inclusionProof ) { + console.log("insertOutputNote"); + console.log("noteId: ", noteId); + console.log('status', status); return db.transaction('rw', outputNotes, notesScripts, async (tx) => { try { let assetsBlob = new Blob([new Uint8Array(assets)]); @@ -257,12 +269,14 @@ async function processInputNotes( consumer_account_id: consumerAccountId }; })); + console.log("processedNotes: ", processedNotes); return processedNotes; } async function processOutputNotes( notes ) { + console.log("called processOutputNotes"); // Fetch all scripts from the scripts table for joining const scripts = await notesScripts.toArray(); const scriptMap = new Map(scripts.map(script => [script.scriptHash, script.serializedNoteScript])); diff --git a/wasm/js/db/sync.js b/wasm/js/db/sync.js index 583925537..135103675 100644 --- a/wasm/js/db/sync.js +++ b/wasm/js/db/sync.js @@ -9,12 +9,21 @@ import { } from './schema.js'; export async function getNoteTags() { + console.log('Getting note tags'); try { const record = await stateSync.get(1); // Since id is the primary key and always 1 if (record) { - let data = { - tags: JSON.stringify(record.tags) - } + let data = null; + if (record.tags.length === 0) { + data = { + tags: JSON.stringify(record.tags) + } + } else { + data = { + tags: record.tags + } + }; + console.log('Note tags: ', data.tags); return data; } else { return null; @@ -45,6 +54,7 @@ export async function getSyncHeight() { export async function addNoteTag( tags ) { + console.log('Adding note tag: ', tags); try { await stateSync.update(1, { tags: tags }); } catch { @@ -192,10 +202,16 @@ async function updateCommittedNotes( inputNoteInclusionProofs, inputNoteMetadatas ) { + console.log("Updating committed notes"); + console.log("Output note ids: ", outputNoteIds); + console.log("Output note inclusion proofs: ", outputNoteInclusionProofs); + console.log('Input note ids: ', inputNoteIds); + console.log('Input note inclusion proofs: ', inputNoteInclusionProofs); + console.log('Input note metadatas: ', inputNoteMetadatas); try { - if (outputNoteIds.length === 0 || inputNoteIds.length === 0) { - return; - } + // if (outputNoteIds.length === 0 || inputNoteIds.length === 0) { + // return; + // } if (outputNoteIds.length !== outputNoteInclusionProofs.length) { throw new Error("Arrays outputNoteIds and outputNoteInclusionProofs must be of the same length"); @@ -206,9 +222,11 @@ async function updateCommittedNotes( inputNoteIds.length !== inputNoteMetadatas.length && inputNoteInclusionProofs.length !== inputNoteMetadatas.length ) { + console.log('Errored out here'); throw new Error("Arrays inputNoteIds and inputNoteInclusionProofs and inputNoteMetadatas must be of the same length"); } + console.log('output note ids length: ', outputNoteIds.length) for (let i = 0; i < outputNoteIds.length; i++) { const noteId = outputNoteIds[i]; const inclusionProof = outputNoteInclusionProofs[i]; @@ -220,10 +238,14 @@ async function updateCommittedNotes( }); } + console.log('input note ids length: ', inputNoteIds.length); for (let i = 0; i < inputNoteIds.length; i++) { const noteId = inputNoteIds[i]; + console.log('Note id: ', noteId); const inclusionProof = inputNoteInclusionProofs[i]; + console.log('Inclusion proof: ', inclusionProof); const metadata = inputNoteMetadatas[i]; + console.log('Metadata: ', metadata); // Update input notes await tx.inputNotes.where({ noteId: noteId }).modify({ @@ -231,6 +253,9 @@ async function updateCommittedNotes( inclusionProof: inclusionProof, metadata: metadata }); + + console.log('Updated input notes'); + console.log(tx.inputNotes.toArray()); } } catch (error) { console.error("Error updating committed notes:", error); diff --git a/wasm/src/web_client/account.rs b/wasm/src/web_client/account.rs index 9aeffc3da..51fc089f2 100644 --- a/wasm/src/web_client/account.rs +++ b/wasm/src/web_client/account.rs @@ -102,15 +102,13 @@ impl WebClient { pub async fn fetch_and_cache_account_auth_by_pub_key( &mut self, - pub_key_bytes: JsValue + account_id: String ) -> Result { use miden_objects::Word; web_sys::console::log_1(&JsValue::from_str("fetch_and_cache_account_auth_by_pub_key called")); if let Some(client) = self.get_mut_inner() { - let pub_key_bytes_result: Vec = from_value(pub_key_bytes).unwrap(); - let pub_key_as_word = Word::read_from_bytes(pub_key_bytes_result.as_slice()).unwrap(); - let result = client.store().fetch_and_cache_account_auth_by_pub_key(pub_key_as_word).await.unwrap(); + let result = client.store().fetch_and_cache_account_auth_by_pub_key(account_id).await.unwrap(); Ok(JsValue::from_str("Okay, it worked")) } else { diff --git a/wasm/src/web_client/import.rs b/wasm/src/web_client/import.rs index 26010a946..28647fd84 100644 --- a/wasm/src/web_client/import.rs +++ b/wasm/src/web_client/import.rs @@ -10,6 +10,9 @@ use miden_client::store::InputNoteRecord; use crate::web_client::WebClient; +use web_sys::console; +use base64::decode; + #[wasm_bindgen] impl WebClient { pub async fn import_account( @@ -38,19 +41,23 @@ impl WebClient { pub async fn import_note( &mut self, - note_bytes: JsValue, + note_bytes: String, verify: bool ) -> Result { + web_sys::console::log_1(&JsValue::from_str("import_note called")); if let Some(client) = self.get_mut_inner() { - let note_bytes_result: Vec = from_value(note_bytes).unwrap(); + // let note_bytes_result: Vec = from_value(note_bytes).unwrap(); + let note_bytes_result = decode(note_bytes).unwrap(); + web_sys::console::log_1(&JsValue::from_str("import_note 2")); let input_note_record = InputNoteRecord::read_from_bytes(¬e_bytes_result).map_err(|err| err.to_string())?; + web_sys::console::log_1(&JsValue::from_str("import_note 3")); let note_id = input_note_record.id(); + web_sys::console::log_1(&JsValue::from_str("import_note 4")); match client.import_input_note(input_note_record, verify).await { Ok(_) => { - let message = format!("Imported note with ID: {}", note_id); - Ok(JsValue::from_str(&message)) + Ok(JsValue::from_str(note_id.to_string().as_str())) }, Err(err) => { let error_message = format!("Failed to import note: {:?}", err); diff --git a/wasm/src/web_client/mod.rs b/wasm/src/web_client/mod.rs index 080551da4..685b59cce 100644 --- a/wasm/src/web_client/mod.rs +++ b/wasm/src/web_client/mod.rs @@ -12,6 +12,7 @@ pub mod new_transactions; pub mod notes; pub mod sync; pub mod transactions; +pub mod tags; pub mod store; pub mod rpc; pub mod models; @@ -44,7 +45,7 @@ impl WebClient { // Exposed method to JS to create an internal client pub async fn create_client( &mut self, - node_url: Option + node_url: Option, ) -> Result { web_sys::console::log_1(&JsValue::from_str("create_client called")); let rng = get_random_coin(); diff --git a/wasm/src/web_client/models/transactions.rs b/wasm/src/web_client/models/transactions.rs index 61847d9bf..b26ce2f73 100644 --- a/wasm/src/web_client/models/transactions.rs +++ b/wasm/src/web_client/models/transactions.rs @@ -28,4 +28,53 @@ impl NewTransactionResult { pub fn created_note_ids(&self) -> JsValue { JsValue::from_serde(&self.created_note_ids).unwrap() } +} + +#[wasm_bindgen] +pub struct NewSwapTransactionResult { + transaction_id: String, + expected_output_note_ids: Vec, + expected_partial_note_ids: Vec, + payback_note_tag: String, +} + +#[wasm_bindgen] +impl NewSwapTransactionResult { + pub fn new( + transaction_id: String, + expected_output_note_ids: Vec, + expected_partial_note_ids: Vec, + payback_note_tag: Option, + ) -> NewSwapTransactionResult { + NewSwapTransactionResult { + transaction_id, + expected_output_note_ids, + expected_partial_note_ids, + payback_note_tag: payback_note_tag.unwrap_or_else(|| "".to_string()), // Use default value if None + } + } + + pub fn setNoteTag(&mut self, payback_note_tag: String) { + self.payback_note_tag = payback_note_tag + } + + #[wasm_bindgen(getter)] + pub fn transaction_id(&self) -> String { + self.transaction_id.clone() + } + + #[wasm_bindgen(getter)] + pub fn expected_output_note_ids(&self) -> JsValue { + JsValue::from_serde(&self.expected_output_note_ids).unwrap() + } + + #[wasm_bindgen(getter)] + pub fn expected_partial_note_ids(&self) -> JsValue { + JsValue::from_serde(&self.expected_partial_note_ids).unwrap() + } + + #[wasm_bindgen(getter)] + pub fn payback_note_tag(&self) -> String { + self.payback_note_tag.clone() + } } \ No newline at end of file diff --git a/wasm/src/web_client/new_account.rs b/wasm/src/web_client/new_account.rs index 49b14131b..846136009 100644 --- a/wasm/src/web_client/new_account.rs +++ b/wasm/src/web_client/new_account.rs @@ -2,23 +2,23 @@ use wasm_bindgen::*; use wasm_bindgen::prelude::*; use super::WebClient; -use miden_objects::assets::TokenSymbol; -use miden_client::client::accounts::{AccountTemplate, AccountStorageMode}; +use miden_objects::{accounts::AccountStorageType, assets::TokenSymbol}; +use miden_client::client::accounts::AccountTemplate; #[wasm_bindgen] impl WebClient { pub async fn new_wallet( &mut self, - storage_mode: String, + storage_type: String, mutable: bool ) -> Result { web_sys::console::log_1(&JsValue::from_str("new_wallet called")); if let Some(client) = self.get_mut_inner() { let client_template = AccountTemplate::BasicWallet { mutable_code: mutable, - storage_mode: match storage_mode.as_str() { - "OffChain" => AccountStorageMode::Local, - "OnChain" => AccountStorageMode::OnChain, + storage_type: match storage_type.as_str() { + "OffChain" => AccountStorageType::OffChain, + "OnChain" => AccountStorageType::OnChain, _ => return Err(JsValue::from_str("Invalid storage mode")) }, }; @@ -42,7 +42,7 @@ impl WebClient { pub async fn new_faucet( &mut self, - storage_mode: String, + storage_type: String, non_fungible: bool, token_symbol: String, decimals: String, @@ -61,9 +61,9 @@ impl WebClient { .map_err(|e| JsValue::from_str(&e.to_string()))?, max_supply: max_supply.parse::() .map_err(|e| JsValue::from_str(&e.to_string()))?, - storage_mode: match storage_mode.as_str() { // Note: Fixed typo in variable name - "OffChain" => AccountStorageMode::Local, - "OnChain" => AccountStorageMode::OnChain, + storage_type: match storage_type.as_str() { // Note: Fixed typo in variable name + "OffChain" => AccountStorageType::OffChain, + "OnChain" => AccountStorageType::OnChain, _ => return Err(JsValue::from_str("Invalid storage mode")), }, }; diff --git a/wasm/src/web_client/new_transactions.rs b/wasm/src/web_client/new_transactions.rs index 243cf8dfd..8a93df2bc 100644 --- a/wasm/src/web_client/new_transactions.rs +++ b/wasm/src/web_client/new_transactions.rs @@ -10,12 +10,13 @@ use miden_objects::{ notes::{NoteId, NoteType as MidenNoteType} }; use miden_client::client::{ + build_swap_tag, get_input_note_with_id_prefix, transactions::transaction_request::{PaymentTransactionData, SwapTransactionData, TransactionTemplate} }; use super::WebClient; -use crate::web_client::models::transactions::NewTransactionResult; +use crate::web_client::models::transactions::{NewTransactionResult, NewSwapTransactionResult}; #[wasm_bindgen] impl WebClient { @@ -28,6 +29,12 @@ impl WebClient { ) -> Result { web_sys::console::log_1(&JsValue::from_str("new_mint_transaction called")); if let Some(client) = self.get_mut_inner() { + // log all inputs + web_sys::console::log_1(&JsValue::from_str("new_mint_transaction 1")); + web_sys::console::log_1(&JsValue::from_str(&target_account_id)); + web_sys::console::log_1(&JsValue::from_str(&faucet_id)); + web_sys::console::log_1(&JsValue::from_str(¬e_type)); + web_sys::console::log_1(&JsValue::from_str(&amount)); let target_account_id = AccountId::from_hex(&target_account_id).unwrap(); let faucet_id = AccountId::from_hex(&faucet_id).unwrap(); let amount_as_u64: u64 = amount.parse::().map_err(|err| err.to_string())?; @@ -48,6 +55,10 @@ impl WebClient { let mint_transaction_request = client.build_transaction_request(mint_transaction_template.clone()).await.unwrap(); web_sys::console::log_1(&JsValue::from_str("new_mint_transaction 3")); + // log the mint_transaction_request account id + web_sys::console::log_1(&JsValue::from_str(&mint_transaction_request.account_id().to_string())); + // log the mint_transaction_request expected_output_notes + web_sys::console::log_1(&JsValue::from_str(&mint_transaction_request.expected_output_notes().iter().map(|note| note.id().to_string()).collect::>().join(", "))); let mint_transaction_execution_result = client.new_transaction(mint_transaction_request).await.unwrap(); web_sys::console::log_1(&JsValue::from_str("new_mint_transaction 4")); let result = NewTransactionResult::new( @@ -55,8 +66,10 @@ impl WebClient { mint_transaction_execution_result.created_notes().iter().map(|note| note.id().to_string()).collect() ); web_sys::console::log_1(&JsValue::from_str("new_mint_transaction 5")); - client.submit_transaction(mint_transaction_execution_result).await.unwrap(); + let proven_transaction = client.prove_transaction(mint_transaction_execution_result.executed_transaction().clone()).unwrap(); web_sys::console::log_1(&JsValue::from_str("new_mint_transaction 6")); + client.submit_transaction(mint_transaction_execution_result, proven_transaction).await.unwrap(); + web_sys::console::log_1(&JsValue::from_str("new_mint_transaction 7")); Ok(result) } else { @@ -77,16 +90,19 @@ impl WebClient { if let Some(client) = self.get_mut_inner() { let sender_account_id = AccountId::from_hex(&sender_account_id).unwrap(); let target_account_id = AccountId::from_hex(&target_account_id).unwrap(); + let faucet_id = AccountId::from_hex(&faucet_id).unwrap(); let amount_as_u64: u64 = amount.parse::().map_err(|err| err.to_string())?; - let fungible_asset = FungibleAsset::new(faucet_id, amount_as_u64).map_err(|err| err.to_string())?; + let fungible_asset = FungibleAsset::new(faucet_id, amount_as_u64) + .map_err(|err| err.to_string())? + .into(); + let note_type = match note_type.as_str() { "Public" => MidenNoteType::Public, "Private" => MidenNoteType::OffChain, _ => MidenNoteType::OffChain }; - let asset = Fungible(fungible_asset); - let payment_transaction = PaymentTransactionData::new(asset, sender_account_id, target_account_id); + let payment_transaction = PaymentTransactionData::new(fungible_asset, sender_account_id, target_account_id); let send_transaction_template: TransactionTemplate; if let Some(recall_height) = recall_height { @@ -110,7 +126,8 @@ impl WebClient { send_transaction_execution_result.created_notes().iter().map(|note| note.id().to_string()).collect() ); - client.submit_transaction(send_transaction_execution_result).await.unwrap(); + let proven_transaction = client.prove_transaction(send_transaction_execution_result.executed_transaction().clone()).unwrap(); + client.submit_transaction(send_transaction_execution_result, proven_transaction).await.unwrap(); Ok(result) } else { @@ -150,8 +167,8 @@ impl WebClient { consume_transaction_execution_result.executed_transaction().id().to_string(), consume_transaction_execution_result.created_notes().iter().map(|note| note.id().to_string()).collect() ); - - client.submit_transaction(consume_transaction_execution_result).await.unwrap(); + let proven_transaction = client.prove_transaction(consume_transaction_execution_result.executed_transaction().clone()).unwrap(); + client.submit_transaction(consume_transaction_execution_result, proven_transaction).await.unwrap(); Ok(result) } else { @@ -167,25 +184,29 @@ impl WebClient { requested_asset_faucet_id: String, requested_asset_amount: String, note_type: String, - ) -> Result { + ) -> Result { web_sys::console::log_1(&JsValue::from_str("new_swap_transaction called")); if let Some(client) = self.get_mut_inner() { let sender_account_id = AccountId::from_hex(&sender_account_id).unwrap(); + let offered_asset_faucet_id = AccountId::from_hex(&offered_asset_faucet_id).unwrap(); let offered_asset_amount_as_u64: u64 = offered_asset_amount.parse::().map_err(|err| err.to_string())?; + let offered_fungible_asset = FungibleAsset::new(offered_asset_faucet_id, offered_asset_amount_as_u64) + .map_err(|err| err.to_string())? + .into(); + let requested_asset_faucet_id = AccountId::from_hex(&requested_asset_faucet_id).unwrap(); let requested_asset_amount_as_u64: u64 = requested_asset_amount.parse::().map_err(|err| err.to_string())?; + let requested_fungible_asset = FungibleAsset::new(requested_asset_faucet_id, requested_asset_amount_as_u64) + .map_err(|err| err.to_string())? + .into(); + let note_type = match note_type.as_str() { "Public" => MidenNoteType::Public, "Private" => MidenNoteType::OffChain, _ => MidenNoteType::OffChain }; - let offered_fungible_asset = FungibleAsset::new(offered_asset_faucet_id, offered_asset_amount_as_u64) - .map_err(|err| err.to_string())? - .into(); - let requested_fungible_asset = FungibleAsset::new(requested_asset_faucet_id, requested_asset_amount_as_u64) - .map_err(|err| err.to_string())? - .into(); + let swap_transaction = SwapTransactionData::new( sender_account_id, offered_fungible_asset, @@ -195,13 +216,35 @@ impl WebClient { let swap_transaction_template = TransactionTemplate::Swap(swap_transaction, note_type); let swap_transaction_request = client.build_transaction_request(swap_transaction_template.clone()).await.unwrap(); - let swap_transaction_execution_result = client.new_transaction(swap_transaction_request).await.unwrap(); - let result = NewTransactionResult::new( + let swap_transaction_execution_result = client.new_transaction(swap_transaction_request.clone()).await.unwrap(); + let mut result = NewSwapTransactionResult::new( swap_transaction_execution_result.executed_transaction().id().to_string(), - swap_transaction_execution_result.created_notes().iter().map(|note| note.id().to_string()).collect() + swap_transaction_request.expected_output_notes().iter().map(|note| note.id().to_string()).collect(), + swap_transaction_request.expected_partial_notes().iter().map(|note| note.id().to_string()).collect(), + None ); + let proven_transaction = client.prove_transaction(swap_transaction_execution_result.executed_transaction().clone()).unwrap(); + client.submit_transaction(swap_transaction_execution_result, proven_transaction).await.unwrap(); - client.submit_transaction(swap_transaction_execution_result).await.unwrap(); + if let TransactionTemplate::Swap(swap_data, note_type) = swap_transaction_template { + let payback_note_tag = build_swap_tag( + note_type, + swap_data.offered_asset().faucet_id(), + swap_data.requested_asset().faucet_id(), + ) + .map_err(|err| err.to_string()).unwrap(); + + let payback_note_tag_u32: u32 = build_swap_tag( + note_type, + swap_data.offered_asset().faucet_id(), + swap_data.requested_asset().faucet_id(), + ) + .map_err(|err| err.to_string())? + .into(); + + result.setNoteTag(payback_note_tag_u32.to_string()); + // client.add_note_tag(payback_note_tag).await.unwrap(); + } Ok(result) } else { diff --git a/wasm/src/web_client/notes.rs b/wasm/src/web_client/notes.rs index 42f528fc3..f78d4a0c2 100644 --- a/wasm/src/web_client/notes.rs +++ b/wasm/src/web_client/notes.rs @@ -65,6 +65,7 @@ impl WebClient { &mut self, filter: JsValue ) -> Result { + web_sys::console::log_1(&JsValue::from_str("get_output_notes called")); if let Some(client) = self.get_mut_inner() { let filter: WebClientNoteFilter = from_value(filter).unwrap(); let native_filter = match filter { diff --git a/wasm/src/web_client/rpc/mod.rs b/wasm/src/web_client/rpc/mod.rs index ebb092a66..766212531 100644 --- a/wasm/src/web_client/rpc/mod.rs +++ b/wasm/src/web_client/rpc/mod.rs @@ -66,7 +66,6 @@ impl WebRpcClient { } } -#[async_trait(?Send)] impl NodeRpcClient for WebRpcClient { async fn submit_proven_transaction( &mut self, diff --git a/wasm/src/web_client/store/accounts/js_bindings.rs b/wasm/src/web_client/store/accounts/js_bindings.rs index 204a392fc..93264eec6 100644 --- a/wasm/src/web_client/store/accounts/js_bindings.rs +++ b/wasm/src/web_client/store/accounts/js_bindings.rs @@ -44,7 +44,7 @@ extern "C" { #[wasm_bindgen(js_name = fetchAndCacheAccountAuthByPubKey)] pub fn idxdb_fetch_and_cache_account_auth_by_pub_key( - pub_key: Vec + account_id: String ) -> js_sys::Promise; // INSERTS diff --git a/wasm/src/web_client/store/accounts/mod.rs b/wasm/src/web_client/store/accounts/mod.rs index 88c281e15..2e90c243f 100644 --- a/wasm/src/web_client/store/accounts/mod.rs +++ b/wasm/src/web_client/store/accounts/mod.rs @@ -183,12 +183,11 @@ impl WebStore { } /// Fetches an [AuthSecretKey] by a public key represented by a [Word] and caches it in the store - pub(crate) async fn fetch_and_cache_account_auth_by_pub_key(&self, pub_key: Word) -> Result { + pub(crate) async fn fetch_and_cache_account_auth_by_pub_key(&self, account_id: String) -> Result { // Print to console for debugging console::log_1(&JsValue::from_str("fetch_and_cache_account_auth_by_pub_key called inner")); - let pub_key_bytes = pub_key.to_bytes(); - let promise = idxdb_fetch_and_cache_account_auth_by_pub_key(pub_key_bytes); + let promise = idxdb_fetch_and_cache_account_auth_by_pub_key(account_id); let js_value = JsFuture::from(promise).await.unwrap(); let account_auth_idxdb: AccountAuthIdxdbObject = from_value(js_value).unwrap(); diff --git a/wasm/src/web_client/store/notes/mod.rs b/wasm/src/web_client/store/notes/mod.rs index beddc61d8..c1ff675ee 100644 --- a/wasm/src/web_client/store/notes/mod.rs +++ b/wasm/src/web_client/store/notes/mod.rs @@ -28,6 +28,9 @@ use models::*; pub(crate) mod utils; use utils::*; +use web_sys::console; +use wasm_bindgen::*; + impl WebStore { pub(crate) async fn get_input_notes( &self, @@ -89,6 +92,7 @@ impl WebStore { &self, filter: NoteFilter<'_> ) -> Result, StoreError> { + web_sys::console::log_1(&JsValue::from_str("get_output_notes called")); let promise = match filter { NoteFilter::All | NoteFilter::Consumed | NoteFilter::Committed | NoteFilter::Pending => { let filter_as_str = match filter { @@ -100,6 +104,7 @@ impl WebStore { }; // Assuming `js_fetch_notes` is your JavaScript function that handles simple string filters + web_sys::console::log_1(&JsValue::from_str("get_output_notes 2")); idxdb_get_output_notes(filter_as_str.to_string()) }, NoteFilter::List(ids) => { @@ -113,13 +118,17 @@ impl WebStore { } }; + web_sys::console::log_1(&JsValue::from_str("get_output_notes 3")); let js_value = JsFuture::from(promise).await.unwrap(); + web_sys::console::log_1(&JsValue::from_str("get_output_notes 4")); let output_notes_idxdb: Vec = from_value(js_value).unwrap(); + web_sys::console::log_1(&JsValue::from_str("get_output_notes 5")); let native_output_notes: Result, StoreError> = output_notes_idxdb .into_iter() .map(parse_output_note_idxdb_object) // Simplified closure .collect::, _>>(); // Collect results into a single Result + web_sys::console::log_1(&JsValue::from_str("get_output_notes 6")); match native_output_notes { Ok(ref notes) => match filter { @@ -137,6 +146,7 @@ impl WebStore { }, Err(e) => return Err(e), } + web_sys::console::log_1(&JsValue::from_str("get_output_notes 7")); native_output_notes } diff --git a/wasm/src/web_client/store/notes/utils.rs b/wasm/src/web_client/store/notes/utils.rs index 8e425a007..c3b31c8d0 100644 --- a/wasm/src/web_client/store/notes/utils.rs +++ b/wasm/src/web_client/store/notes/utils.rs @@ -17,6 +17,9 @@ use miden_client::{ use crate::web_client::store::notes::{InputNoteIdxdbObject, OutputNoteIdxdbObject}; use super::js_bindings::*; +use wasm_bindgen::*; +use web_sys::console; + // TYPES // ================================================================================================ @@ -304,29 +307,38 @@ pub fn parse_input_note_idxdb_object( pub fn parse_output_note_idxdb_object( note_idxdb: OutputNoteIdxdbObject ) -> Result { + web_sys::console::log_1(&JsValue::from_str("parse_output_note_idxdb_object called")); let note_details: Option = if let Some(details_as_json_str) = note_idxdb.details { + web_sys::console::log_1(&JsValue::from_str("parse_output_note_idxdb_object 1")); // Merge the info that comes from the input notes table and the notes script table let serialized_note_script = note_idxdb.serialized_note_script .expect("Has note details so it should have the serialized script"); + web_sys::console::log_1(&JsValue::from_str("parse_output_note_idxdb_object 2")); let note_script = NoteScript::read_from_bytes(&serialized_note_script)?; + web_sys::console::log_1(&JsValue::from_str("parse_output_note_idxdb_object 3")); let note_details: NoteRecordDetails = serde_json::from_str(&details_as_json_str) .map_err(StoreError::JsonDataDeserializationError)?; + web_sys::console::log_1(&JsValue::from_str("parse_output_note_idxdb_object 4")); let note_details = NoteRecordDetails::new( note_details.nullifier().to_string(), note_script, note_details.inputs().clone(), note_details.serial_num(), ); + web_sys::console::log_1(&JsValue::from_str("parse_output_note_idxdb_object 5")); Some(note_details) } else { + web_sys::console::log_1(&JsValue::from_str("parse_output_note_idxdb_object 6")); None }; - + web_sys::console::log_1(&JsValue::from_str("parse_output_note_idxdb_object 7")); let note_metadata: NoteMetadata = serde_json::from_str(¬e_idxdb.metadata).map_err(StoreError::JsonDataDeserializationError)?; + web_sys::console::log_1(&JsValue::from_str("parse_output_note_idxdb_object 8")); let note_assets = NoteAssets::read_from_bytes(¬e_idxdb.assets)?; + web_sys::console::log_1(&JsValue::from_str("parse_output_note_idxdb_object 9")); let inclusion_proof = match note_idxdb.inclusion_proof { Some(note_inclusion_proof) => { @@ -338,16 +350,21 @@ pub fn parse_output_note_idxdb_object( }, _ => None, }; + web_sys::console::log_1(&JsValue::from_str("parse_output_note_idxdb_object 10")); let recipient = Digest::try_from(note_idxdb.recipient)?; + web_sys::console::log_1(&JsValue::from_str("parse_output_note_idxdb_object 11")); let id = NoteId::new(recipient, note_assets.commitment()); + web_sys::console::log_1(&JsValue::from_str("parse_output_note_idxdb_object 12")); let status: NoteStatus = serde_json::from_str(&format!("\"{0}\"", note_idxdb.status)) .map_err(StoreError::JsonDataDeserializationError)?; + web_sys::console::log_1(&JsValue::from_str("parse_output_note_idxdb_object 13")); let consumer_account_id: Option = match note_idxdb.consumer_account_id { - Some(account_id) => Some(AccountId::try_from(account_id.parse::().unwrap())?), + Some(account_id) => Some(AccountId::from_hex(&account_id)?), None => None, }; + web_sys::console::log_1(&JsValue::from_str("parse_output_note_idxdb_object 14")); Ok(OutputNoteRecord::new( id, diff --git a/wasm/src/web_client/tags.rs b/wasm/src/web_client/tags.rs new file mode 100644 index 000000000..ebc774fc8 --- /dev/null +++ b/wasm/src/web_client/tags.rs @@ -0,0 +1,25 @@ +use super::WebClient; + +use miden_objects::notes::NoteTag; + +use wasm_bindgen::prelude::*; +use web_sys::console; + +#[wasm_bindgen] +impl WebClient { + pub async fn add_tag( + &mut self, + tag: String, + ) -> Result { + web_sys::console::log_1(&JsValue::from_str("add_tag called")); + if let Some(client) = self.get_mut_inner() { + let note_tag_as_u32 = tag.parse::().unwrap(); + let note_tag: NoteTag = note_tag_as_u32.into(); + client.add_note_tag(note_tag).await.unwrap(); + + Ok(JsValue::from_str("Okay, it worked")) + } else { + Err(JsValue::from_str("Client not initialized")) + } + } +} \ No newline at end of file diff --git a/wasm/src/web_client/transactions.rs b/wasm/src/web_client/transactions.rs index e2d0c2126..dbc29db31 100644 --- a/wasm/src/web_client/transactions.rs +++ b/wasm/src/web_client/transactions.rs @@ -15,19 +15,6 @@ use miden_client::{ client::transactions::TransactionRecord, store::TransactionFilter }; -// use crate::native_code::{ -// errors::NoteIdPrefixFetchError, -// rpc::NodeRpcClient, -// store::{ -// note_record::InputNoteRecord, -// NoteFilter, -// Store, -// TransactionFilter -// }, -// transactions::transaction_request::{ -// PaymentTransactionData, TransactionTemplate -// }, Client -// }; use serde::{Serialize, Deserialize}; use serde_wasm_bindgen::from_value; diff --git a/wasm/test.html b/wasm/test.html index c88dd3732..7b4aad2a8 100644 --- a/wasm/test.html +++ b/wasm/test.html @@ -37,31 +37,49 @@ }); function setupNoteFileInputListener(webClient) { - document.getElementById('noteFileInput').addEventListener('change', function(event) { + document.getElementById('noteFileInput').addEventListener('change', async function(event) { const file = event.target.files[0]; if (file) { + try { + const byteArray = await readFileAsByteArray(file); + console.log(byteArray); // Output the byte array to check the content + let result = await importInputNote(webClient, byteArray); + console.log(result); // Log the result of the import process + } catch (error) { + console.error("Error handling file:", error); + } + } + }); + } + + async function readFileAsByteArray(file) { + return new Promise((resolve, reject) => { const reader = new FileReader(); - reader.onload = async function(e) { - const arrayBuffer = e.target.result; + reader.onload = () => { + const arrayBuffer = reader.result; const byteArray = new Uint8Array(arrayBuffer); - console.log(byteArray); // Now you can work with the bytes + console.log("Byte array length:", byteArray.length); // Check the length + resolve(byteArray); + }; - let result = await importInputNote(webClient, byteArray); - console.log(result); + reader.onerror = () => { + console.error("File read error:", reader.error); + reject(reader.error); }; reader.readAsArrayBuffer(file); - } }); } - async function createMidenWebClient() { + async function createMidenWebClient(dbName = "MidenClientDB") { try { - let local_rpc_url = "http://localhost:57291" + let remote_rpc_url = "http://18.203.155.106:57291" + // let local_rpc_url = "http://localhost:57291" let envoy_proxy_url = "http://localhost:8080" const webClient = new WebClient(); - await webClient.create_client(local_rpc_url); + // await webClient.create_client(local_rpc_url); + await webClient.create_client(remote_rpc_url); return webClient; } catch (error) { console.error('Failed to create client with web store:', error); @@ -145,7 +163,7 @@ async function importAccount( webClient, - accountAsBytes + accountAsBytes, ) { try { let result = await webClient.import_account(accountAsBytes); @@ -230,7 +248,14 @@ recallHeight ) { try { - let result = await webClient.new_send_transaction(); + let result = await webClient.new_send_transaction( + senderAccountId, + targetAccountId, + facuetId, + noteType, + amount, + recallHeight + ); console.log(`Created new send transaction with id ${result.transaction_id}`); console.log(`Output notes created: ${result.created_note_ids}`); return result; @@ -258,7 +283,9 @@ noteType ); console.log(`Created new swap transaction with id ${result.transaction_id}`); - console.log(`Output notes created: ${result.created_note_ids}`); + console.log(`Output notes created: ${result.expected_output_note_ids}`); + console.log(`Expected Partial Notes: ${result.expected_partial_note_ids}`); + console.log(`Payback Note Tag: ${result.payback_note_tag}`); return result; } catch (error) { console.error('Failed to call create new swap transaction:', error); @@ -306,12 +333,39 @@ } } + async function getOutputNotes( + webClient, + status = "All" + ) { + try { + let result = await webClient.get_output_notes(status); + console.log(result); + return result; + } catch (error) { + console.error('Failed to call get output notes:', error); + } + } + + async function getOutputNote( + webClient, + noteId + ) { + try { + let result = await webClient.get_output_note(noteId); + console.log(result); + return result; + } catch (error) { + console.error('Failed to call get input note:', error); + } + } + async function importInputNote( webClient, - noteAsBytes + noteAsBytes, + verify ) { try { - await webClient.import_input_note(noteAsBytes); + await webClient.import_note(noteAsBytes, verify); } catch (error) { console.error('Failed to call import input note:', error); } @@ -341,6 +395,15 @@ } } + async function addTag(webClient, noteTag) { + try { + let result = await webClient.add_tag(noteTag); + console.log(result); + } catch (error) { + console.error('Failed to call add note tag:', error); + } + } + // Tests /////////////////////////////////////////////////////////////////// @@ -354,6 +417,7 @@ console.log('testCreateNewWallet finished'); } + // Done async function testCreateNewFaucet() { console.log('testCreateNewFaucet started'); let webClient = await createMidenWebClient(); @@ -376,6 +440,7 @@ console.log('testImportAccount finished'); } + // Done async function testGetAccounts(shouldCreateAccounts = true) { console.log('testGetAccounts started'); let webClient = await createMidenWebClient(); @@ -388,31 +453,30 @@ console.log('testGetAccounts finished'); } - async function testGetAccount(shouldCreateAccount = true, accountId = null) { + // Done + async function testGetAccount() { console.log('testGetAccount started'); + let webClient = await createMidenWebClient(); - if (shouldCreateAccount) { - accountId = await createNewWallet(webClient, "OffChain", true); - } + accountId = await createNewWallet(webClient, "OffChain", true); await getAccount(webClient, accountId); console.log('testGetAccount finished'); } - async function testNewMintTransaction(shouldCreateAccounts = true, targetAccountId = null, faucetId = null) { + // Done + async function testNewMintTransaction() { console.log('testNewMintTransaction started'); + let webClient = await createMidenWebClient(); - if (shouldCreateAccounts) { - targetAccountId = await createNewWallet(webClient, "OffChain", true); - faucetId = await createNewFaucet(webClient, "OffChain", false, "DEN", "10", "1000000"); - } + targetAccountId = await createNewWallet(webClient, "OffChain", true); + faucetId = await createNewFaucet(webClient, "OffChain", false, "DEN", "10", "1000000"); await syncState(webClient); await new Promise(r => setTimeout(r, 10000)); - // Call getAccountAuthByPubKey first to set the account auth - let pubKeyAsString = "YR2+eK/dug5TsPsq/DXl3FKFuLe5MsQhXai8Zb6gC0I="; - let pubKeyAsBytes = base64ToUint8Array(pubKeyAsString); - await webClient.fetch_and_cache_account_auth_by_pub_key(pubKeyAsBytes); + + await webClient.fetch_and_cache_account_auth_by_pub_key(faucetId); + let result = await createNewMintTransaction( webClient, targetAccountId, @@ -422,16 +486,21 @@ ); await new Promise(r => setTimeout(r, 10000)); await syncState(webClient); + console.log('testNewMintTransaction finished'); } + // Done async function testNewConsumeTransaction() { console.log('testNewConsumeTransaction started'); + let webClient = await createMidenWebClient(); let targetAccountId = await createNewWallet(webClient, "OffChain", true); let faucetId = await createNewFaucet(webClient, "OffChain", false, "DEN", "10", "1000000"); await syncState(webClient); - await new Promise(r => setTimeout(r, 10000)); + await new Promise(r => setTimeout(r, 20000)); + + await webClient.fetch_and_cache_account_auth_by_pub_key(faucetId); let mintTransactionResult = await createNewMintTransaction( webClient, @@ -440,21 +509,26 @@ "Private", "1000" ); - await new Promise(r => setTimeout(r, 10000)); + await new Promise(r => setTimeout(r, 20000)); await syncState(webClient); + await webClient.fetch_and_cache_account_auth_by_pub_key(targetAccountId); + let consumeTransactionResult = await createNewConsumeTransaction( webClient, targetAccountId, mintTransactionResult.created_note_ids ); - await new Promise(r => setTimeout(r, 10000)); + await new Promise(r => setTimeout(r, 20000)); await syncState(webClient); - console.log('testNewMintTransaction finished'); + + console.log('testNewConsumeTransaction finished'); } + // Done async function testNewSendTransaction() { console.log('testNewSendTransaction started'); + let webClient = await createMidenWebClient(); let senderAccountId = await createNewWallet(webClient, "OffChain", true); let targetAccountId = await createNewWallet(webClient, "OffChain", true); @@ -462,6 +536,8 @@ await syncState(webClient); await new Promise(r => setTimeout(r, 10000)); + await webClient.fetch_and_cache_account_auth_by_pub_key(faucetId); + let mintTransactionResult = await createNewMintTransaction( webClient, senderAccountId, @@ -472,6 +548,8 @@ await new Promise(r => setTimeout(r, 10000)); await syncState(webClient); + await webClient.fetch_and_cache_account_auth_by_pub_key(senderAccountId); + let consumeTransactionResult = await createNewConsumeTransaction( webClient, senderAccountId, @@ -486,11 +564,14 @@ targetAccountId, faucetId, "Private", - "500" + "500", + null ); await new Promise(r => setTimeout(r, 10000)); await syncState(webClient); + await webClient.fetch_and_cache_account_auth_by_pub_key(targetAccountId); + let consumeSendTransactionResult = await createNewConsumeTransaction( webClient, targetAccountId, @@ -498,11 +579,14 @@ ); await new Promise(r => setTimeout(r, 10000)); await syncState(webClient); + console.log('testNewSendTransaction finished'); } + // Done async function testNewSendTransactionWithRecallHeight() { console.log('testNewSendTransactionWithRecallHeight started'); + let webClient = await createMidenWebClient(); let senderAccountId = await createNewWallet(webClient, "OffChain", true); let targetAccountId = await createNewWallet(webClient, "OffChain", true); @@ -510,6 +594,8 @@ await syncState(webClient); await new Promise(r => setTimeout(r, 10000)); + await webClient.fetch_and_cache_account_auth_by_pub_key(faucetId); + let mintTransactionResult = await createNewMintTransaction( webClient, senderAccountId, @@ -520,6 +606,8 @@ await new Promise(r => setTimeout(r, 10000)); await syncState(webClient); + await webClient.fetch_and_cache_account_auth_by_pub_key(senderAccountId); + let consumeTransactionResult = await createNewConsumeTransaction( webClient, senderAccountId, @@ -547,65 +635,112 @@ ); await new Promise(r => setTimeout(r, 10000)); await syncState(webClient); + console.log('testNewSendTransactionWithRecallHeight finished'); } - // async function testNewSwapTransaction() { - // console.log('testNewSwapTransaction started'); - // let webClient = await createMidenWebClient(); - // let senderAccountId = await createNewWallet(webClient, "OffChain", true); - // let offeredAssetFaucetId = await createNewFaucet(webClient, "OffChain", false, "DEN", "10", "1000000"); - // let requestedAssetFaucetId = await createNewFaucet(webClient, "OffChain", false, "GAR", "10", "1000000"); - // await syncState(webClient); - // await new Promise(r => setTimeout(r, 10000)); - - // let mintTransactionResult = await createNewMintTransaction( - // webClient, - // senderAccountId, - // offeredAssetFaucetId, - // "Private", - // "1000" - // ); - // await new Promise(r => setTimeout(r, 10000)); - // await syncState(webClient); - - // let consumeTransactionResult = await createNewConsumeTransaction( - // webClient, - // senderAccountId, - // mintTransactionResult.created_note_ids - // ); - // await new Promise(r => setTimeout(r, 10000)); - // await syncState(webClient); - - // let swapTransactionResult = await createNewSwapTransaction( - // webClient, - // senderAccountId, - // offeredAssetFaucetId, - // "500", - // requestedAssetFaucetId, - // "500", - // "Private" - // ); - // await new Promise(r => setTimeout(r, 10000)); - // await syncState(webClient); - - // let consumeSwapTransactionResult = await createNewConsumeTransaction( - // webClient, - // senderAccountId, - // swapTransactionResult.created_note_ids - // ); - // await new Promise(r => setTimeout(r, 10000)); - // await syncState(webClient); - // console.log('testNewSwapTransaction finished'); - // } + // Done + async function testNewSwapTransaction() { + console.log('testNewSwapTransaction started'); + let webClient = await createMidenWebClient(); + + let walletAAccountId = await createNewWallet(webClient, "OffChain", true); + let walletBAccountId = await createNewWallet(webClient, "OffChain", true); + let offeredAssetFaucetId = await createNewFaucet(webClient, "OffChain", false, "DEN", "10", "1000000"); + let requestedAssetFaucetId = await createNewFaucet(webClient, "OffChain", false, "GAR", "10", "1000000"); + await syncState(webClient); + await new Promise(r => setTimeout(r, 10000)); + + await webClient.fetch_and_cache_account_auth_by_pub_key(offeredAssetFaucetId); + + let walletAMintTransactionResult = await createNewMintTransaction( + webClient, + walletAAccountId, + offeredAssetFaucetId, + "Public", + "1000" + ); + await new Promise(r => setTimeout(r, 10000)); + await syncState(webClient); + + await webClient.fetch_and_cache_account_auth_by_pub_key(requestedAssetFaucetId); + + let walletBMintTransactionResult = await createNewMintTransaction( + webClient, + walletBAccountId, + requestedAssetFaucetId, + "Public", + "1000" + ); + await new Promise(r => setTimeout(r, 10000)); + await syncState(webClient); + + await webClient.fetch_and_cache_account_auth_by_pub_key(walletAAccountId); + + let walletAConsumeTransactionResult = await createNewConsumeTransaction( + webClient, + walletAAccountId, + walletAMintTransactionResult.created_note_ids + ); + await new Promise(r => setTimeout(r, 10000)); + await syncState(webClient); + + await webClient.fetch_and_cache_account_auth_by_pub_key(walletBAccountId); + + let walletBConsumeTransactionResult = await createNewConsumeTransaction( + webClient, + walletBAccountId, + walletBMintTransactionResult.created_note_ids + ); + await new Promise(r => setTimeout(r, 10000)); + await syncState(webClient); + + let swapTransactionResult = await createNewSwapTransaction( + webClient, + walletAAccountId, + offeredAssetFaucetId, + "100", + requestedAssetFaucetId, + "900", + "Public" + ); + await new Promise(r => setTimeout(r, 20000)); + await syncState(webClient); + + await addTag(webClient, swapTransactionResult.payback_note_tag); + await new Promise(r => setTimeout(r, 20000)); + await syncState(webClient); + + let walletBConsumeSwapTransactionResult = await createNewConsumeTransaction( + webClient, + walletBAccountId, + swapTransactionResult.expected_output_note_ids // TODO CHANGE ME + ); + await new Promise(r => setTimeout(r, 20000)); + await syncState(webClient); + + let walletAConsumeSwapTransactionResult = await createNewConsumeTransaction( + webClient, + walletAAccountId, + swapTransactionResult.expected_partial_note_ids // TODO CHANGE ME + ); + await new Promise(r => setTimeout(r, 20000)); + await syncState(webClient); + + console.log('testNewSwapTransaction finished'); + } + // Done async function testGetTransactions() { console.log("testGetTransactions started"); + let webClient = await createMidenWebClient(); let walletAccount = await createNewWallet(webClient, "OffChain", true); let faucetAccount = await createNewFaucet(webClient, "OffChain", false, "DEN", "10", "1000000"); await syncState(webClient); - await new Promise(r => setTimeout(r, 10000)); + await new Promise(r => setTimeout(r, 20000)); + + await webClient.fetch_and_cache_account_auth_by_pub_key(faucetAccount); let mintTransactionResult = await createNewMintTransaction( webClient, @@ -617,6 +752,8 @@ await new Promise(r => setTimeout(r, 20000)); await syncState(webClient); + await webClient.fetch_and_cache_account_auth_by_pub_key(walletAccount); + let consumeTransactionResult = await createNewConsumeTransaction( webClient, walletAccount, @@ -630,50 +767,81 @@ console.log("testGetTransactions finished"); } - async function testGetNotes() { - console.log("testGetNotes started"); + // Done + async function testGetInputNotes() { + console.log("testGetInputNotes started"); + let webClient = await createMidenWebClient(); + let targetAccountId = await createNewWallet(webClient, "OffChain", true); + let faucetId = await createNewFaucet(webClient, "OffChain", false, "DEN", "10", "1000000"); + await syncState(webClient); + await new Promise(r => setTimeout(r, 20000)); - // Create accounts and sync - let regularAccountTemplate = createBasicMutableAccountTemplate("Local"); - let fungibleFaucetAccountTemplate = createFungibleFaucetAccountTemplate( - "DEN", - "10", - "1000000", - "Local" + await webClient.fetch_and_cache_account_auth_by_pub_key(faucetId); + + let mintTransactionResult = await createNewMintTransaction( + webClient, + targetAccountId, + faucetId, + "Private", + "1000" ); - let regularAccountId = await createNewAccount(webClient, regularAccountTemplate); - let faucetId = await createNewAccount(webClient, fungibleFaucetAccountTemplate); + await new Promise(r => setTimeout(r, 20000)); await syncState(webClient); - await new Promise(r => setTimeout(r, 10000)); - // Create mint transaction and sync - let transactionTemplate = createMintTransactionTemplate( - regularAccountId, - faucetId, - "1000", - "Private" + await webClient.fetch_and_cache_account_auth_by_pub_key(targetAccountId); + + let consumeTransactionResult = await createNewConsumeTransaction( + webClient, + targetAccountId, + mintTransactionResult.created_note_ids ); - let createTransactionResult = await createTransaction(webClient, transactionTemplate); - await new Promise(r => setTimeout(r, 10000)); + await new Promise(r => setTimeout(r, 20000)); await syncState(webClient); - // Create mint transaction and sync - let transactionTemplate2 = createMintTransactionTemplate( - regularAccountId, + await getInputNotes(webClient); + + console.log("testGetInputNotes finished"); + } + + // Done + async function testGetInputNote() { + console.log("testGetInputNote started"); + + let webClient = await createMidenWebClient(); + let targetAccountId = await createNewWallet(webClient, "OffChain", true); + let faucetId = await createNewFaucet(webClient, "OffChain", false, "DEN", "10", "1000000"); + await syncState(webClient); + await new Promise(r => setTimeout(r, 20000)); + + await webClient.fetch_and_cache_account_auth_by_pub_key(faucetId); + + let mintTransactionResult = await createNewMintTransaction( + webClient, + targetAccountId, faucetId, - "1000", - "Private" + "Private", + "1000" ); - let createTransactionResult2 = await createTransaction(webClient, transactionTemplate2); - await new Promise(r => setTimeout(r, 10000)); + await new Promise(r => setTimeout(r, 20000)); await syncState(webClient); - await getInputNotes(webClient); + await webClient.fetch_and_cache_account_auth_by_pub_key(targetAccountId); + + let consumeTransactionResult = await createNewConsumeTransaction( + webClient, + targetAccountId, + mintTransactionResult.created_note_ids + ); + await new Promise(r => setTimeout(r, 20000)); + await syncState(webClient); + + await getInputNote(webClient, mintTransactionResult.created_note_ids[0]); - console.log("testGetNotes finished"); + console.log("testGetInputNote finished"); } + // Done async function testGetNote() { console.log("testGetNote started"); let webClient = await createMidenWebClient(); @@ -707,6 +875,120 @@ console.log("testGetNote finished"); } + // Done + async function testGetOutputNotes() { + console.log("testGetOutputNotes started"); + + let webClient = await createMidenWebClient(); + let targetAccountId = await createNewWallet(webClient, "OffChain", true); + let faucetId = await createNewFaucet(webClient, "OffChain", false, "DEN", "10", "1000000"); + await syncState(webClient); + await new Promise(r => setTimeout(r, 20000)); + + await webClient.fetch_and_cache_account_auth_by_pub_key(faucetId); + + let mintTransactionResult = await createNewMintTransaction( + webClient, + targetAccountId, + faucetId, + "Private", + "1000" + ); + await new Promise(r => setTimeout(r, 20000)); + await syncState(webClient); + + await webClient.fetch_and_cache_account_auth_by_pub_key(targetAccountId); + + let consumeTransactionResult = await createNewConsumeTransaction( + webClient, + targetAccountId, + mintTransactionResult.created_note_ids + ); + await new Promise(r => setTimeout(r, 20000)); + await syncState(webClient); + + await getOutputNotes(webClient); + + console.log("testGetOutputNotes finished"); + } + + // Done + async function testGetOutputNote() { + console.log("testGetOutputNote started"); + + let webClient = await createMidenWebClient(); + let targetAccountId = await createNewWallet(webClient, "OffChain", true); + let faucetId = await createNewFaucet(webClient, "OffChain", false, "DEN", "10", "1000000"); + await syncState(webClient); + await new Promise(r => setTimeout(r, 20000)); + + await webClient.fetch_and_cache_account_auth_by_pub_key(faucetId); + + let mintTransactionResult = await createNewMintTransaction( + webClient, + targetAccountId, + faucetId, + "Private", + "1000" + ); + await new Promise(r => setTimeout(r, 20000)); + await syncState(webClient); + + await webClient.fetch_and_cache_account_auth_by_pub_key(targetAccountId); + + let consumeTransactionResult = await createNewConsumeTransaction( + webClient, + targetAccountId, + mintTransactionResult.created_note_ids + ); + await new Promise(r => setTimeout(r, 20000)); + await syncState(webClient); + + await getOutputNote(webClient, mintTransactionResult.created_note_ids[0]); + + console.log("testGetOutputNote finished"); + } + + async function testImportInputNote() { + console.log("testImportInputNote started"); + + let webClient = await createMidenWebClient(); + let walletAccount = await createNewWallet(webClient, "OffChain", true); + + function setupNoteFileInputListener(webClient, targetAccountId) { + document.getElementById('noteFileInput').addEventListener('change', async function(event) { + const file = event.target.files[0]; + if (file) { + const reader = new FileReader(); + reader.onload = async function(e) { + const arrayBuffer = e.target.result; + const byteArray = new Uint8Array(arrayBuffer); + const base64String = btoa(String.fromCharCode(byteArray)); + console.log(Array.from(byteArray)); // Converts Uint8Array to regular array and logs it + + let result = await importInputNote(webClient, base64String, false); + console.log(result); // Log the result of the import process + + await webClient.fetch_and_cache_account_auth_by_pub_key(targetAccountId); + + let consumeTransactionResult = await createNewConsumeTransaction( + webClient, + targetAccountId, + [result] + ); + await new Promise(r => setTimeout(r, 20000)); + await syncState(webClient); + + console.log("testImportInputNote finished"); + }; + reader.readAsArrayBuffer(file); + } + }); + } + + setupNoteFileInputListener(webClient, walletAccount); + } + async function testExportInputNote() { console.log("testExportInputNote started"); let webClient = await createMidenWebClient(); @@ -785,49 +1067,22 @@ // console.log("testExportInputNote finished"); } - - async function testImportInputNote() { - let webClient = await createMidenWebClient(); - - setupNoteFileInputListener(webClient); - - let regularAccountTemplate = await createBasicMutableAccountTemplate("Local"); - await createNewAccount(webClient, regularAccountTemplate); - - // Create consume transaction and sync - // let consumeTransactionTemplate = createConsumeNotesTransactionTemplate( - // "0x912ea536cab38f1b", - // ["0x8888c1474034b1aad083b58642d3547e7fea9c2b4061087d8ae128ef0a6ae3ca"] - // ); - // await createTransaction(webClient, consumeTransactionTemplate); - // await new Promise(r => setTimeout(r, 10000)); - // await syncState(webClient); - } - - // await getAccountAuthByPubKey(); // await testCreateNewWallet(); // await testCreateNewFaucet(); - // await testGetAccounts(false); - // await testGetAccount(false, "0x8add712899d6ab76"); - await testNewMintTransaction(false, "0x8add712899d6ab76", "0x248226f3436b0068"); + // await testGetAccounts(); + // await testGetAccount(); + // await testNewMintTransaction(); // await testNewConsumeTransaction(); // await testNewSendTransaction(); // await testNewSendTransactionWithRecallHeight(); // await testNewSwapTransaction(); // await testGetTransactions(); - - // await testCreateAllAccountTypes(); - // await testGetAccount(); - // await testGetAccounts(); - // await testGetNotes(); - // await testGetNote(); - // await testExportInputNote(); - // await testMintAsset(); - // await testP2IDTransaction(); - // await testP2IDRTransaction(); - // await testGetTransactions(); - // await testImportInputNote(); + // await testGetInputNotes(); + // await testGetInputNote(); + // await testGetOutputNotes(); + // await testGetOutputNote(); + await testImportInputNote(); From 0c8a01724cae7507769ecbf92aaff84106e8c1af Mon Sep 17 00:00:00 2001 From: Dennis Garcia Date: Thu, 13 Jun 2024 14:15:01 -0500 Subject: [PATCH 26/42] Testing import/export. Still not working --- wasm/Cargo.toml | 6 +-- wasm/js/index.js | 2 - wasm/js/types/index.d.ts | 6 +++ wasm/package.json | 16 ++++-- wasm/src/web_client/export.rs | 8 +++ wasm/src/web_client/import.rs | 6 +-- wasm/test.html | 92 ++++++++++++++++++++++++++++++----- 7 files changed, 112 insertions(+), 24 deletions(-) create mode 100644 wasm/js/types/index.d.ts diff --git a/wasm/Cargo.toml b/wasm/Cargo.toml index 11c861d43..223ef95cb 100644 --- a/wasm/Cargo.toml +++ b/wasm/Cargo.toml @@ -22,9 +22,9 @@ futures = "0.3" getrandom = { version = "0.2", features = ["js"] } hex = { version = "0.4" } miden-client = { path = "../../demox-miden-client-next", version = "0.3.0", default-features = false, features = ["wasm", "async"] } -miden-lib = { path="../../demox-miden-base/miden-lib", default-features = false, features = ["testing"] } -miden-tx = { path="../../demox-miden-base/miden-tx", default-features = false, features = ["async"] } -miden-objects = { path="../../demox-miden-base/objects", default-features = false, features = ["std", "serde", "testing"] } +miden-lib = { version = "0.3.1", default-features = false, features = ["testing"] } +miden-tx = { version = "0.3.1", default-features = false, features = ["async"] } +miden-objects = { version = "0.3.1", default-features = false, features = ["std", "serde", "testing"] } prost = { version = "0.12.3" } rand = { version = "0.8.5" } serde = { version = "1.0", features = ["derive"] } diff --git a/wasm/js/index.js b/wasm/js/index.js index 3bcff4d2b..8253837c2 100644 --- a/wasm/js/index.js +++ b/wasm/js/index.js @@ -1,7 +1,6 @@ import wasm from "../dist/wasm.js"; const { - greet, WebClient } = await wasm({ importHook: () => { @@ -10,6 +9,5 @@ const { }); export { - greet, WebClient, }; \ No newline at end of file diff --git a/wasm/js/types/index.d.ts b/wasm/js/types/index.d.ts new file mode 100644 index 000000000..8f8ce3c0f --- /dev/null +++ b/wasm/js/types/index.d.ts @@ -0,0 +1,6 @@ +export { + WebClient, + NewTransactionResult, + SerializedAccountStub, + NewSwapTransactionResult +} from "./crates/miden_wasm"; \ No newline at end of file diff --git a/wasm/package.json b/wasm/package.json index c79a6ba8e..cecaaf05f 100644 --- a/wasm/package.json +++ b/wasm/package.json @@ -1,7 +1,11 @@ { - "name": "miden-wasm", - "version": "1.0.0", - "description": "Wasm build for the Polygon Miden Client", + "name": "@demox-labs/miden-sdk", + "version": "0.0.2", + "description": "Polygon Miden Wasm SDK", + "collaborators": [ + "Polygon Miden", + "Demox Labs " + ], "type": "module", "main": "./dist/index.js", "browser": "./dist/index.js", @@ -9,8 +13,12 @@ "exports": { ".": "./dist/index.js" }, + "files": [ + "dist", + "../LICENSE.md" + ], "scripts": { - "build": "rimraf dist && rollup -c rollup.config.js && rimraf dist/wasm*" + "build": "rimraf dist && rollup -c rollup.config.js && cpr js/types dist && rimraf dist/wasm*" }, "devDependencies": { "@rollup/plugin-commonjs": "^25.0.7", diff --git a/wasm/src/web_client/export.rs b/wasm/src/web_client/export.rs index 4d3a194ec..b9d90758d 100644 --- a/wasm/src/web_client/export.rs +++ b/wasm/src/web_client/export.rs @@ -9,30 +9,38 @@ use miden_objects::{ use crate::web_client::WebClient; +use web_sys::console; + #[wasm_bindgen] impl WebClient { pub async fn export_note( &mut self, note_id: String ) -> Result { + web_sys::console::log_1(&JsValue::from_str("export_note called")); if let Some(client) = self.get_mut_inner() { let note_id = Digest::try_from(note_id) .map_err(|err| format!("Failed to parse input note id: {}", err))? .into(); + web_sys::console::log_1(&JsValue::from_str("export_note 1")); let output_note = client .get_output_notes(NoteFilter::Unique(note_id)).await.unwrap() .pop().unwrap(); + web_sys::console::log_1(&JsValue::from_str("export_note 2")); // Convert output note into InputNoteRecord before exporting let input_note: InputNoteRecord = output_note .try_into() .map_err(|_err| format!("Can't export note with ID {}", note_id.to_hex()))?; + web_sys::console::log_1(&JsValue::from_str("export_note 3")); let input_note_bytes = input_note.to_bytes(); + web_sys::console::log_1(&JsValue::from_str("export_note 4")); let serialized_input_note_bytes = serde_wasm_bindgen::to_value(&input_note_bytes) .unwrap_or_else(|_| wasm_bindgen::throw_val(JsValue::from_str("Serialization error"))); + web_sys::console::log_1(&JsValue::from_str("export_note 5")); Ok(serialized_input_note_bytes) } else { diff --git a/wasm/src/web_client/import.rs b/wasm/src/web_client/import.rs index 28647fd84..403bd82ed 100644 --- a/wasm/src/web_client/import.rs +++ b/wasm/src/web_client/import.rs @@ -41,13 +41,13 @@ impl WebClient { pub async fn import_note( &mut self, - note_bytes: String, + note_bytes: JsValue, verify: bool ) -> Result { web_sys::console::log_1(&JsValue::from_str("import_note called")); if let Some(client) = self.get_mut_inner() { - // let note_bytes_result: Vec = from_value(note_bytes).unwrap(); - let note_bytes_result = decode(note_bytes).unwrap(); + let note_bytes_result: Vec = from_value(note_bytes).unwrap(); + // let note_bytes_result = decode(note_bytes).unwrap(); web_sys::console::log_1(&JsValue::from_str("import_note 2")); let input_note_record = InputNoteRecord::read_from_bytes(¬e_bytes_result).map_err(|err| err.to_string())?; diff --git a/wasm/test.html b/wasm/test.html index 7b4aad2a8..39af46ebd 100644 --- a/wasm/test.html +++ b/wasm/test.html @@ -21,18 +21,36 @@ document.getElementById('accountFileInput').addEventListener('change', function(event) { const file = event.target.files[0]; if (file) { - const reader = new FileReader(); + const reader = new FileReader(); - reader.onload = async function(e) { - let webClient = await createMidenWebClient(); - const arrayBuffer = e.target.result; - const byteArray = new Uint8Array(arrayBuffer); - console.log(byteArray); // Now you can work with the bytes + reader.onload = async function(e) { + let webClient = await createMidenWebClient(); + const arrayBuffer = e.target.result; + const byteArray = new Uint8Array(arrayBuffer); + console.log(byteArray); // Now you can work with the bytes - await testImportAccount(webClient, byteArray); - }; + await testImportAccount(webClient, byteArray); + }; - reader.readAsArrayBuffer(file); + reader.readAsArrayBuffer(file); + } + }); + + document.getElementById('noteFileInput').addEventListener('change', async function(event) { + const file = event.target.files[0]; + if (file) { + const reader = new FileReader(); + + reader.onload = async function(e) { + let webClient = await createMidenWebClient(); + const arrayBuffer = e.target.result; + const byteArray = new Uint8Array(arrayBuffer); + console.log(byteArray); // Now you can work with the bytes + + await importInputNote(webClient, byteArray, true); + }; + + reader.readAsArrayBuffer(file); } }); @@ -371,13 +389,14 @@ } } - async function exportInputNote( + async function exportNote( webClient, noteId ) { try { - let result = await webClient.export_input_note(noteId); + let result = await webClient.export_note(noteId); console.log(result); + return result; } catch (error) { console.error('Failed to call export input note:', error); } @@ -949,6 +968,54 @@ console.log("testGetOutputNote finished"); } + async function testExportNote() { + console.log("testExportNote started"); + + let webClient = await createMidenWebClient(); + let senderAccountId = await createNewWallet(webClient, "OffChain", true); + let faucetId = await createNewFaucet(webClient, "OffChain", false, "DEN", "10", "1000000"); + await syncState(webClient); + await new Promise(r => setTimeout(r, 20000)); + + await webClient.fetch_and_cache_account_auth_by_pub_key(faucetId); + + let mintTransactionResult = await createNewMintTransaction( + webClient, + senderAccountId, + faucetId, + "Private", + "1000" + ); + await new Promise(r => setTimeout(r, 20000)); + await syncState(webClient); + + let result = await exportNote(webClient, mintTransactionResult.created_note_ids[0]); + + const blob = new Blob([result], {type: 'application/octet-stream'}); + + // Create a URL for the Blob + const url = URL.createObjectURL(blob); + + // Create a temporary anchor element + const a = document.createElement('a'); + a.href = url; + a.download = 'exportNoteTest.mno'; // Specify the file name + + // Append the anchor to the document + document.body.appendChild(a); + + // Programmatically click the anchor to trigger the download + a.click(); + + // Remove the anchor from the document + document.body.removeChild(a); + + // Revoke the object URL to free up resources + URL.revokeObjectURL(url); + + console.log("testExportNote finished"); + } + async function testImportInputNote() { console.log("testImportInputNote started"); @@ -1082,7 +1149,8 @@ // await testGetInputNote(); // await testGetOutputNotes(); // await testGetOutputNote(); - await testImportInputNote(); + await testExportNote(); + // await testImportInputNote(); From 73a50d2b220f581e1e58ede62279bf995efed761 Mon Sep 17 00:00:00 2001 From: JohnDonavon Date: Thu, 13 Jun 2024 14:32:08 -0700 Subject: [PATCH 27/42] cargo changes --- wasm/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wasm/Cargo.toml b/wasm/Cargo.toml index 223ef95cb..7a4bdf381 100644 --- a/wasm/Cargo.toml +++ b/wasm/Cargo.toml @@ -21,7 +21,7 @@ base64 = "0.13" futures = "0.3" getrandom = { version = "0.2", features = ["js"] } hex = { version = "0.4" } -miden-client = { path = "../../demox-miden-client-next", version = "0.3.0", default-features = false, features = ["wasm", "async"] } +miden-client = { path = "../../demox-miden-client", version = "0.3.0", default-features = false, features = ["wasm", "async"] } miden-lib = { version = "0.3.1", default-features = false, features = ["testing"] } miden-tx = { version = "0.3.1", default-features = false, features = ["async"] } miden-objects = { version = "0.3.1", default-features = false, features = ["std", "serde", "testing"] } From 69ca18864ad8678a17d2cfd38831045c65f5783f Mon Sep 17 00:00:00 2001 From: JohnDonavon Date: Thu, 13 Jun 2024 14:34:27 -0700 Subject: [PATCH 28/42] miden website 0.3 --- wasm/Cargo.toml | 7 + wasm/js/db/schema.js | 2 +- wasm/src/lib.rs | 20 + wasm/src/web_client/account.rs | 2 + wasm/yarn.lock | 108 +- website/next.config.js | 25 + website/next.config.mjs | 17 - website/package.json | 22 +- website/public/next.svg | 1 - website/public/vercel.svg | 1 - website/src/app/accounts/page.tsx | 126 +- website/src/app/greet/page.tsx | 15 +- website/src/app/layout.tsx | 73 +- website/src/app/notes/page.tsx | 8 - website/src/app/page.tsx | 6 - website/src/assets/css/globals.css | 126 + website/src/assets/css/range-slider.css | 252 ++ website/src/assets/css/scrollbar.css | 146 + website/src/assets/images/404-dark.svg | 69 + website/src/assets/images/404-light.svg | 69 + website/src/assets/images/anchor.svg | 6 + website/src/assets/images/author.jpg | Bin 0 -> 8883 bytes website/src/assets/images/avalanche.svg | 4 + website/src/assets/images/avatar/1.png | Bin 0 -> 5422 bytes website/src/assets/images/avatar/10.jpg | Bin 0 -> 7729 bytes website/src/assets/images/avatar/11.jpg | Bin 0 -> 23508 bytes website/src/assets/images/avatar/2.png | Bin 0 -> 5588 bytes website/src/assets/images/avatar/3.png | Bin 0 -> 5265 bytes website/src/assets/images/avatar/4.png | Bin 0 -> 5366 bytes website/src/assets/images/avatar/5.png | Bin 0 -> 2905 bytes website/src/assets/images/avatar/6.png | Bin 0 -> 5552 bytes website/src/assets/images/avatar/7.png | Bin 0 -> 5435 bytes website/src/assets/images/avatar/8.jpg | Bin 0 -> 23758 bytes website/src/assets/images/avatar/9.jpg | Bin 0 -> 9476 bytes website/src/assets/images/bank.svg | 3 + website/src/assets/images/cappasity.svg | 10 + website/src/assets/images/coin/binance.svg | 7 + website/src/assets/images/coin/bitcoin.svg | 3 + website/src/assets/images/coin/cardano.svg | 3 + website/src/assets/images/coin/tether.svg | 3 + website/src/assets/images/coin/usd-coin.svg | 6 + .../assets/images/collection/collection-1.jpg | Bin 0 -> 1751 bytes .../assets/images/collection/collection-2.jpg | Bin 0 -> 1668 bytes .../assets/images/collection/collection-3.jpg | Bin 0 -> 1900 bytes .../assets/images/collection/collection-4.jpg | Bin 0 -> 1923 bytes .../assets/images/collection/collection-5.jpg | Bin 0 -> 1835 bytes .../assets/images/collection/collection-6.jpg | Bin 0 -> 1917 bytes .../src/assets/images/collection/grid/1.jpg | Bin 0 -> 27408 bytes .../src/assets/images/collection/grid/2.jpg | Bin 0 -> 41615 bytes .../src/assets/images/collection/grid/3.jpg | Bin 0 -> 60096 bytes .../src/assets/images/collection/grid/4.jpg | Bin 0 -> 48026 bytes .../src/assets/images/collection/grid/5.jpg | Bin 0 -> 49851 bytes .../src/assets/images/collection/grid/6.jpg | Bin 0 -> 40310 bytes .../src/assets/images/collection/grid/7.jpg | Bin 0 -> 36550 bytes .../src/assets/images/collection/grid/8.jpg | Bin 0 -> 33798 bytes .../src/assets/images/currency/bitcoin.svg | 4 + .../src/assets/images/currency/ethereum.svg | 9 + website/src/assets/images/discord.svg | 3 + website/src/assets/images/forum.svg | 3 + website/src/assets/images/gas-station 1.svg | 10 + website/src/assets/images/icon-128.png | Bin 0 -> 35234 bytes website/src/assets/images/icon-16.png | Bin 0 -> 1525 bytes website/src/assets/images/icon-19.png | Bin 0 -> 1831 bytes website/src/assets/images/icon-38.png | Bin 0 -> 4747 bytes website/src/assets/images/lion_slug.jpeg | Bin 0 -> 251873 bytes website/src/assets/images/lion_slug2.jpeg | Bin 0 -> 315324 bytes website/src/assets/images/lion_slug3.jpeg | Bin 0 -> 296178 bytes website/src/assets/images/logo-white.svg | 13 + website/src/assets/images/logo.svg | 13 + website/src/assets/images/metamask.svg | 61 + website/src/assets/images/mirror.svg | 9 + website/src/assets/images/nft/nft-1.jpg | Bin 0 -> 37687 bytes website/src/assets/images/nft/nft-2.jpg | Bin 0 -> 35953 bytes website/src/assets/images/nft/nft-3.jpg | Bin 0 -> 40471 bytes website/src/assets/images/nft/nft-4.jpg | Bin 0 -> 37889 bytes .../src/assets/images/pages/collection.png | Bin 0 -> 270331 bytes .../src/assets/images/pages/create-nft.png | Bin 0 -> 76783 bytes .../assets/images/pages/create-proposal.png | Bin 0 -> 34952 bytes website/src/assets/images/pages/farm.png | Bin 0 -> 43485 bytes website/src/assets/images/pages/history.png | Bin 0 -> 107760 bytes website/src/assets/images/pages/home.png | Bin 0 -> 64092 bytes .../images/pages/liquidity-position.png | Bin 0 -> 24762 bytes website/src/assets/images/pages/liquidity.png | Bin 0 -> 20738 bytes .../src/assets/images/pages/nft-details.png | Bin 0 -> 100700 bytes website/src/assets/images/pages/portfolio.png | Bin 0 -> 99106 bytes website/src/assets/images/pages/proposal.png | Bin 0 -> 60940 bytes website/src/assets/images/pages/search.png | Bin 0 -> 217639 bytes website/src/assets/images/pages/swap.png | Bin 0 -> 20863 bytes website/src/assets/images/pages/vote.png | Bin 0 -> 38656 bytes website/src/assets/images/pancake-bunny.svg | 4 + .../src/assets/images/portfolio/claimable.svg | 8 + website/src/assets/images/portfolio/curve.svg | 1531 +++++++++ .../src/assets/images/portfolio/deposit.svg | 8 + website/src/assets/images/portfolio/nft.svg | 7 + .../src/assets/images/portfolio/pancake.svg | 8 + .../assets/images/portfolio/poolto-gether.svg | 10 + .../src/assets/images/portfolio/uniswap.svg | 19 + .../src/assets/images/portfolio/wallet.svg | 11 + website/src/assets/images/profile-cover.jpg | Bin 0 -> 170669 bytes .../src/assets/images/short-kings-logo.png | Bin 0 -> 122381 bytes website/src/assets/images/single-nft.jpg | Bin 0 -> 119470 bytes website/src/assets/images/slug_lion4.jpeg | Bin 0 -> 261582 bytes website/src/assets/images/user-1.png | Bin 0 -> 5130 bytes website/src/assets/images/user-2.png | Bin 0 -> 1814 bytes website/src/assets/images/user-3.png | Bin 0 -> 2318 bytes website/src/assets/images/user-4.png | Bin 0 -> 2256 bytes website/src/assets/images/vote-pool.svg | 11 + website/src/components/defaultLayout.tsx | 2 +- .../src/components/drawer-views/container.tsx | 65 + .../src/components/drawer-views/context.tsx | 17 + website/src/components/icons/check.tsx | 10 + website/src/components/icons/chevron-down.tsx | 19 + .../src/components/icons/chevron-forward.tsx | 19 + website/src/components/icons/close.tsx | 25 + website/src/components/icons/copy.tsx | 14 + website/src/components/icons/exchange.tsx | 21 + website/src/components/icons/export-icon.tsx | 19 + website/src/components/icons/farm.tsx | 35 + website/src/components/icons/home.tsx | 19 + website/src/components/icons/left-align.tsx | 25 + website/src/components/icons/moon.tsx | 24 + website/src/components/icons/option.tsx | 37 + website/src/components/icons/oven.tsx | 25 + website/src/components/icons/range-icon.tsx | 25 + website/src/components/icons/right-align.tsx | 25 + website/src/components/icons/search.tsx | 19 + website/src/components/icons/sun.tsx | 24 + website/src/components/icons/unlocked.tsx | 23 + website/src/components/sidebar.tsx | 52 - website/src/components/ui/base.tsx | 129 + .../src/components/ui/button/button-drip.tsx | 53 + .../components/ui/button/button-loader.tsx | 25 + website/src/components/ui/button/button.tsx | 174 + website/src/components/ui/button/index.ts | 2 + .../src/components/ui/collapsible-menu.tsx | 110 + website/src/components/ui/dialog.tsx | 1 + website/src/components/ui/hamburger.tsx | 48 + website/src/components/ui/image.tsx | 1 + .../src/components/ui/links/active-link.tsx | 24 + .../src/components/ui/links/anchor-link.tsx | 14 + website/src/components/ui/list-box.tsx | 81 + website/src/components/ui/loader.tsx | 85 + website/src/components/ui/logo.tsx | 29 + website/src/components/ui/menu.tsx | 1 + website/src/components/ui/radio-group.tsx | 1 + website/src/components/ui/scrollbar.tsx | 32 + website/src/components/ui/transition.tsx | 1 + website/src/context/wasm-context.tsx | 31 + website/src/layouts/_layout-menu.tsx | 253 ++ website/src/layouts/_layout.tsx | 96 + website/src/layouts/dashboard/_dashboard.tsx | 76 + website/src/layouts/dashboard/_sidebar.tsx | 112 + website/src/lib/db.ts | 92 +- website/src/lib/hooks/use-breakpoint.ts | 14 + website/src/lib/hooks/use-click-away.ts | 1 + .../src/lib/hooks/use-copy-to-clipboard.ts | 1 + website/src/lib/hooks/use-direction.ts | 7 + website/src/lib/hooks/use-is-dark-mode.ts | 9 + website/src/lib/hooks/use-is-mounted.ts | 8 + website/src/lib/hooks/use-local-storage.ts | 1 + website/src/lib/hooks/use-measure.ts | 1 + website/src/lib/hooks/use-state-callback.ts | 25 + website/src/lib/hooks/use-theme-color.ts | 17 + website/src/lib/hooks/use-window-scroll.ts | 1 + website/src/lib/polygon-worker/accounts.ts | 8 + website/src/lib/wasm.ts | 11 + website/src/workers/accounts.ts | 33 + website/tailwind.config.js | 125 + website/tailwind.config.ts | 20 - website/tsconfig.json | 29 +- website/tsconfig.worker.json | 11 + website/yarn.lock | 3055 +++++++++++++++++ 172 files changed, 8045 insertions(+), 229 deletions(-) create mode 100644 website/next.config.js delete mode 100644 website/next.config.mjs delete mode 100644 website/public/next.svg delete mode 100644 website/public/vercel.svg create mode 100644 website/src/assets/css/globals.css create mode 100644 website/src/assets/css/range-slider.css create mode 100644 website/src/assets/css/scrollbar.css create mode 100644 website/src/assets/images/404-dark.svg create mode 100644 website/src/assets/images/404-light.svg create mode 100644 website/src/assets/images/anchor.svg create mode 100644 website/src/assets/images/author.jpg create mode 100644 website/src/assets/images/avalanche.svg create mode 100644 website/src/assets/images/avatar/1.png create mode 100644 website/src/assets/images/avatar/10.jpg create mode 100644 website/src/assets/images/avatar/11.jpg create mode 100644 website/src/assets/images/avatar/2.png create mode 100644 website/src/assets/images/avatar/3.png create mode 100644 website/src/assets/images/avatar/4.png create mode 100644 website/src/assets/images/avatar/5.png create mode 100644 website/src/assets/images/avatar/6.png create mode 100644 website/src/assets/images/avatar/7.png create mode 100644 website/src/assets/images/avatar/8.jpg create mode 100644 website/src/assets/images/avatar/9.jpg create mode 100644 website/src/assets/images/bank.svg create mode 100644 website/src/assets/images/cappasity.svg create mode 100644 website/src/assets/images/coin/binance.svg create mode 100644 website/src/assets/images/coin/bitcoin.svg create mode 100644 website/src/assets/images/coin/cardano.svg create mode 100644 website/src/assets/images/coin/tether.svg create mode 100644 website/src/assets/images/coin/usd-coin.svg create mode 100644 website/src/assets/images/collection/collection-1.jpg create mode 100644 website/src/assets/images/collection/collection-2.jpg create mode 100644 website/src/assets/images/collection/collection-3.jpg create mode 100644 website/src/assets/images/collection/collection-4.jpg create mode 100644 website/src/assets/images/collection/collection-5.jpg create mode 100644 website/src/assets/images/collection/collection-6.jpg create mode 100644 website/src/assets/images/collection/grid/1.jpg create mode 100644 website/src/assets/images/collection/grid/2.jpg create mode 100644 website/src/assets/images/collection/grid/3.jpg create mode 100644 website/src/assets/images/collection/grid/4.jpg create mode 100644 website/src/assets/images/collection/grid/5.jpg create mode 100644 website/src/assets/images/collection/grid/6.jpg create mode 100644 website/src/assets/images/collection/grid/7.jpg create mode 100644 website/src/assets/images/collection/grid/8.jpg create mode 100644 website/src/assets/images/currency/bitcoin.svg create mode 100644 website/src/assets/images/currency/ethereum.svg create mode 100644 website/src/assets/images/discord.svg create mode 100644 website/src/assets/images/forum.svg create mode 100644 website/src/assets/images/gas-station 1.svg create mode 100644 website/src/assets/images/icon-128.png create mode 100644 website/src/assets/images/icon-16.png create mode 100644 website/src/assets/images/icon-19.png create mode 100644 website/src/assets/images/icon-38.png create mode 100644 website/src/assets/images/lion_slug.jpeg create mode 100644 website/src/assets/images/lion_slug2.jpeg create mode 100644 website/src/assets/images/lion_slug3.jpeg create mode 100644 website/src/assets/images/logo-white.svg create mode 100644 website/src/assets/images/logo.svg create mode 100644 website/src/assets/images/metamask.svg create mode 100644 website/src/assets/images/mirror.svg create mode 100644 website/src/assets/images/nft/nft-1.jpg create mode 100644 website/src/assets/images/nft/nft-2.jpg create mode 100644 website/src/assets/images/nft/nft-3.jpg create mode 100644 website/src/assets/images/nft/nft-4.jpg create mode 100644 website/src/assets/images/pages/collection.png create mode 100644 website/src/assets/images/pages/create-nft.png create mode 100644 website/src/assets/images/pages/create-proposal.png create mode 100644 website/src/assets/images/pages/farm.png create mode 100644 website/src/assets/images/pages/history.png create mode 100644 website/src/assets/images/pages/home.png create mode 100644 website/src/assets/images/pages/liquidity-position.png create mode 100644 website/src/assets/images/pages/liquidity.png create mode 100644 website/src/assets/images/pages/nft-details.png create mode 100644 website/src/assets/images/pages/portfolio.png create mode 100644 website/src/assets/images/pages/proposal.png create mode 100644 website/src/assets/images/pages/search.png create mode 100644 website/src/assets/images/pages/swap.png create mode 100644 website/src/assets/images/pages/vote.png create mode 100644 website/src/assets/images/pancake-bunny.svg create mode 100644 website/src/assets/images/portfolio/claimable.svg create mode 100644 website/src/assets/images/portfolio/curve.svg create mode 100644 website/src/assets/images/portfolio/deposit.svg create mode 100644 website/src/assets/images/portfolio/nft.svg create mode 100644 website/src/assets/images/portfolio/pancake.svg create mode 100644 website/src/assets/images/portfolio/poolto-gether.svg create mode 100644 website/src/assets/images/portfolio/uniswap.svg create mode 100644 website/src/assets/images/portfolio/wallet.svg create mode 100644 website/src/assets/images/profile-cover.jpg create mode 100644 website/src/assets/images/short-kings-logo.png create mode 100644 website/src/assets/images/single-nft.jpg create mode 100644 website/src/assets/images/slug_lion4.jpeg create mode 100644 website/src/assets/images/user-1.png create mode 100644 website/src/assets/images/user-2.png create mode 100644 website/src/assets/images/user-3.png create mode 100644 website/src/assets/images/user-4.png create mode 100644 website/src/assets/images/vote-pool.svg create mode 100644 website/src/components/drawer-views/container.tsx create mode 100644 website/src/components/drawer-views/context.tsx create mode 100644 website/src/components/icons/check.tsx create mode 100644 website/src/components/icons/chevron-down.tsx create mode 100644 website/src/components/icons/chevron-forward.tsx create mode 100644 website/src/components/icons/close.tsx create mode 100644 website/src/components/icons/copy.tsx create mode 100644 website/src/components/icons/exchange.tsx create mode 100644 website/src/components/icons/export-icon.tsx create mode 100644 website/src/components/icons/farm.tsx create mode 100644 website/src/components/icons/home.tsx create mode 100644 website/src/components/icons/left-align.tsx create mode 100644 website/src/components/icons/moon.tsx create mode 100644 website/src/components/icons/option.tsx create mode 100644 website/src/components/icons/oven.tsx create mode 100644 website/src/components/icons/range-icon.tsx create mode 100644 website/src/components/icons/right-align.tsx create mode 100644 website/src/components/icons/search.tsx create mode 100644 website/src/components/icons/sun.tsx create mode 100644 website/src/components/icons/unlocked.tsx delete mode 100644 website/src/components/sidebar.tsx create mode 100644 website/src/components/ui/base.tsx create mode 100644 website/src/components/ui/button/button-drip.tsx create mode 100644 website/src/components/ui/button/button-loader.tsx create mode 100644 website/src/components/ui/button/button.tsx create mode 100644 website/src/components/ui/button/index.ts create mode 100644 website/src/components/ui/collapsible-menu.tsx create mode 100644 website/src/components/ui/dialog.tsx create mode 100644 website/src/components/ui/hamburger.tsx create mode 100644 website/src/components/ui/image.tsx create mode 100644 website/src/components/ui/links/active-link.tsx create mode 100644 website/src/components/ui/links/anchor-link.tsx create mode 100644 website/src/components/ui/list-box.tsx create mode 100644 website/src/components/ui/loader.tsx create mode 100644 website/src/components/ui/logo.tsx create mode 100644 website/src/components/ui/menu.tsx create mode 100644 website/src/components/ui/radio-group.tsx create mode 100644 website/src/components/ui/scrollbar.tsx create mode 100644 website/src/components/ui/transition.tsx create mode 100644 website/src/context/wasm-context.tsx create mode 100644 website/src/layouts/_layout-menu.tsx create mode 100644 website/src/layouts/_layout.tsx create mode 100644 website/src/layouts/dashboard/_dashboard.tsx create mode 100644 website/src/layouts/dashboard/_sidebar.tsx create mode 100644 website/src/lib/hooks/use-breakpoint.ts create mode 100644 website/src/lib/hooks/use-click-away.ts create mode 100644 website/src/lib/hooks/use-copy-to-clipboard.ts create mode 100644 website/src/lib/hooks/use-direction.ts create mode 100644 website/src/lib/hooks/use-is-dark-mode.ts create mode 100644 website/src/lib/hooks/use-is-mounted.ts create mode 100644 website/src/lib/hooks/use-local-storage.ts create mode 100644 website/src/lib/hooks/use-measure.ts create mode 100644 website/src/lib/hooks/use-state-callback.ts create mode 100644 website/src/lib/hooks/use-theme-color.ts create mode 100644 website/src/lib/hooks/use-window-scroll.ts create mode 100644 website/src/lib/polygon-worker/accounts.ts create mode 100644 website/src/lib/wasm.ts create mode 100644 website/src/workers/accounts.ts create mode 100644 website/tailwind.config.js delete mode 100644 website/tailwind.config.ts create mode 100644 website/tsconfig.worker.json create mode 100644 website/yarn.lock diff --git a/wasm/Cargo.toml b/wasm/Cargo.toml index 7a4bdf381..6f222b8ec 100644 --- a/wasm/Cargo.toml +++ b/wasm/Cargo.toml @@ -22,9 +22,15 @@ futures = "0.3" getrandom = { version = "0.2", features = ["js"] } hex = { version = "0.4" } miden-client = { path = "../../demox-miden-client", version = "0.3.0", default-features = false, features = ["wasm", "async"] } +<<<<<<< HEAD miden-lib = { version = "0.3.1", default-features = false, features = ["testing"] } miden-tx = { version = "0.3.1", default-features = false, features = ["async"] } miden-objects = { version = "0.3.1", default-features = false, features = ["std", "serde", "testing"] } +======= +miden-lib = { path="../../miden-base-copy/miden-lib", default-features = false } +miden-tx = { path="../../miden-base-copy/miden-tx", default-features = false, features = ["async"] } +miden-objects = { version = "0.3.1", default-features = false, features = ["serde"] } +>>>>>>> a58f985 (miden website 0.3) prost = { version = "0.12.3" } rand = { version = "0.8.5" } serde = { version = "1.0", features = ["derive"] } @@ -35,6 +41,7 @@ tonic-web-wasm-client = "0.5" wasm-bindgen = { version = "0.2", features = ["serde-serialize"] } wasm-bindgen-futures = "0.4" web-sys = { version = "0.3", features = ["console"] } +console_error_panic_hook = "0.1.6" [build-dependencies] tonic-build = { version="0.11.0", default-features = false, features = ["prost"]} diff --git a/wasm/js/db/schema.js b/wasm/js/db/schema.js index 2c1e1cd7f..aa7ffa695 100644 --- a/wasm/js/db/schema.js +++ b/wasm/js/db/schema.js @@ -3,7 +3,7 @@ import Dexie from "dexie"; const DATABASE_NAME = 'MidenClientDB'; export async function openDatabase() { - console.log('Opening database...') + console.log('Opening database blah blah...') try { await db.open(); console.log("Database opened successfully"); diff --git a/wasm/src/lib.rs b/wasm/src/lib.rs index 2e421cf1e..83084e4a8 100644 --- a/wasm/src/lib.rs +++ b/wasm/src/lib.rs @@ -5,6 +5,26 @@ pub mod web_client; use wasm_bindgen::prelude::*; use wasm_bindgen_futures::*; use web_sys::console; +use serde_wasm_bindgen::Serializer; +use serde::Serialize; + +#[derive(Serialize)] +struct MyStruct { + large_number: u64, +} + +#[wasm_bindgen] +pub fn serialize_test() -> JsValue { + let my_struct = MyStruct { + large_number: 10426515476281968952, + }; + + // Create a new serializer with the option set + let mut serializer = Serializer::new().serialize_large_number_types_as_bigints(true); + + // Serialize the struct + my_struct.serialize(&serializer).unwrap() +} #[wasm_bindgen] extern "C" { diff --git a/wasm/src/web_client/account.rs b/wasm/src/web_client/account.rs index 51fc089f2..ec70d6fe6 100644 --- a/wasm/src/web_client/account.rs +++ b/wasm/src/web_client/account.rs @@ -13,6 +13,8 @@ use serde::{Serialize, Deserialize}; use serde_wasm_bindgen::from_value; use wasm_bindgen::prelude::*; use web_sys::console; +use std::panic; +use serde_wasm_bindgen::Serializer; #[derive(Serialize, Deserialize)] #[serde(tag = "type")] diff --git a/wasm/yarn.lock b/wasm/yarn.lock index 5109f774d..52b663416 100644 --- a/wasm/yarn.lock +++ b/wasm/yarn.lock @@ -30,9 +30,9 @@ integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== "@rollup/plugin-commonjs@^25.0.7": - version "25.0.7" - resolved "https://registry.yarnpkg.com/@rollup/plugin-commonjs/-/plugin-commonjs-25.0.7.tgz#145cec7589ad952171aeb6a585bbeabd0fd3b4cf" - integrity sha512-nEvcR+LRjEjsaSsc4x3XZfCCvZIaSMenZu/OiwOKGN2UhQpAYI7ru7czFvyWbErlpoGjnSX3D5Ch5FcMA3kRWQ== + version "25.0.8" + resolved "https://registry.yarnpkg.com/@rollup/plugin-commonjs/-/plugin-commonjs-25.0.8.tgz#c77e608ab112a666b7f2a6bea625c73224f7dd34" + integrity sha512-ZEZWTK5n6Qde0to4vS9Mr5x/0UZoqCxPVR9KRUjU4kA2sO7GEUn1fop0DAwpO6z0Nw/kJON9bDmSxdWxO/TT1A== dependencies: "@rollup/pluginutils" "^5.0.1" commondir "^1.0.1" @@ -198,9 +198,9 @@ deepmerge@^4.2.2: integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== dexie@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/dexie/-/dexie-4.0.1.tgz#0b2aa9a39f706f0bb970134047afaa326a3c923e" - integrity sha512-wSNn+TcCh+DuE2pdg058K3MhxA4g+IiZlW7yGz4cMd/t3z2rJXZcV3HDxZljbrICU2Iq0qY4UHnbolTMK/+bcA== + version "4.0.7" + resolved "https://registry.yarnpkg.com/dexie/-/dexie-4.0.7.tgz#c92e5032245fc075de58c636238a82ee3ff9fedb" + integrity sha512-M+Lo6rk4pekIfrc2T0o2tvVJwL6EAAM/B78DNfb8aaxFVoI1f8/rz5KTxuAnApkwqTSuxx7T5t0RKH7qprapGg== eastasianwidth@^0.2.0: version "0.2.0" @@ -253,15 +253,15 @@ function-bind@^1.1.2: integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== glob@^10.2.2, glob@^10.3.7: - version "10.3.10" - resolved "https://registry.yarnpkg.com/glob/-/glob-10.3.10.tgz#0351ebb809fd187fe421ab96af83d3a70715df4b" - integrity sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g== + version "10.4.1" + resolved "https://registry.yarnpkg.com/glob/-/glob-10.4.1.tgz#0cfb01ab6a6b438177bfe6a58e2576f6efe909c2" + integrity sha512-2jelhlq3E4ho74ZyVLN03oKdAZVUa6UDZzFLVH1H7dnoax+y9qyaq8zBkfDIggjniU19z0wU18y16jMB2eyVIw== dependencies: foreground-child "^3.1.0" - jackspeak "^2.3.5" - minimatch "^9.0.1" - minipass "^5.0.0 || ^6.0.2 || ^7.0.0" - path-scurry "^1.10.1" + jackspeak "^3.1.2" + minimatch "^9.0.4" + minipass "^7.1.2" + path-scurry "^1.11.1" glob@^7.1.3: version "7.2.3" @@ -352,24 +352,24 @@ isexe@^2.0.0: resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== -jackspeak@^2.3.5: - version "2.3.6" - resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-2.3.6.tgz#647ecc472238aee4b06ac0e461acc21a8c505ca8" - integrity sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ== +jackspeak@^3.1.2: + version "3.2.0" + resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-3.2.0.tgz#54e5abaa1c673bace97873d0599f3dab0e22b850" + integrity sha512-eXIwN9gutMuB1AMW241gIHSEeaSMafWnxWXb/JGYWqifway4QgqBJLl7nYlmhGrxnHQ3wNc/QYFZ95aDtHHzpA== dependencies: "@isaacs/cliui" "^8.0.2" optionalDependencies: "@pkgjs/parseargs" "^0.11.0" -"lru-cache@^9.1.1 || ^10.0.0": - version "10.2.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.2.0.tgz#0bd445ca57363465900f4d1f9bd8db343a4d95c3" - integrity sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q== +lru-cache@^10.2.0: + version "10.2.2" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.2.2.tgz#48206bc114c1252940c41b25b41af5b545aca878" + integrity sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ== magic-string@^0.30.3: - version "0.30.8" - resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.8.tgz#14e8624246d2bedba70d5462aa99ac9681844613" - integrity sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ== + version "0.30.10" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.10.tgz#123d9c41a0cb5640c892b041d4cfb3bd0aa4b39e" + integrity sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ== dependencies: "@jridgewell/sourcemap-codec" "^1.4.15" @@ -387,10 +387,10 @@ minimatch@^5.0.1: dependencies: brace-expansion "^2.0.1" -minimatch@^9.0.1: - version "9.0.3" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825" - integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== +minimatch@^9.0.4: + version "9.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.4.tgz#8e49c731d1749cbec05050ee5145147b32496a51" + integrity sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw== dependencies: brace-expansion "^2.0.1" @@ -411,10 +411,10 @@ minipass@^5.0.0: resolved "https://registry.yarnpkg.com/minipass/-/minipass-5.0.0.tgz#3e9788ffb90b694a5d0ec94479a45b5d8738133d" integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ== -"minipass@^5.0.0 || ^6.0.2 || ^7.0.0": - version "7.0.4" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.0.4.tgz#dbce03740f50a4786ba994c1fb908844d27b038c" - integrity sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ== +"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.1.2: + version "7.1.2" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707" + integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== minizlib@^2.1.1: version "2.1.2" @@ -465,12 +465,12 @@ path-parse@^1.0.7: resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== -path-scurry@^1.10.1: - version "1.10.1" - resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.10.1.tgz#9ba6bf5aa8500fe9fd67df4f0d9483b2b0bfc698" - integrity sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ== +path-scurry@^1.11.1: + version "1.11.1" + resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.11.1.tgz#7960a668888594a0720b12a911d1a742ab9f11d2" + integrity sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA== dependencies: - lru-cache "^9.1.1 || ^10.0.0" + lru-cache "^10.2.0" minipass "^5.0.0 || ^6.0.2 || ^7.0.0" picomatch@^2.3.1: @@ -495,9 +495,9 @@ rimraf@^2.5.4: glob "^7.1.3" rimraf@^5.0.0, rimraf@^5.0.1: - version "5.0.5" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-5.0.5.tgz#9be65d2d6e683447d2e9013da2bf451139a61ccf" - integrity sha512-CqDakW+hMe/Bz202FPEymy68P+G50RfMQK+Qo5YUqc9SPipvbGjCGKd0RSKEelbsfQuw3g5NZDSrlZZAJurH1A== + version "5.0.7" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-5.0.7.tgz#27bddf202e7d89cb2e0381656380d1734a854a74" + integrity sha512-nV6YcJo5wbLW77m+8KjH8aB/7/rxQy9SZ0HY5shnwULfS+9nmTtVXAJET5NdZmCzA4fPI/Hm1wo/Po/4mopOdg== dependencies: glob "^10.3.7" @@ -525,8 +525,16 @@ signal-exit@^4.0.1: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== -"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0: - name string-width-cjs +"string-width-cjs@npm:string-width@^4.2.0": + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string-width@^4.1.0: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -544,8 +552,14 @@ string-width@^5.0.1, string-width@^5.1.2: emoji-regex "^9.2.2" strip-ansi "^7.0.1" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: - name strip-ansi-cjs +"strip-ansi-cjs@npm:strip-ansi@^6.0.1": + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -572,9 +586,9 @@ supports-preserve-symlinks-flag@^1.0.0: integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== tar@^6.1.11: - version "6.2.0" - resolved "https://registry.yarnpkg.com/tar/-/tar-6.2.0.tgz#b14ce49a79cb1cd23bc9b016302dea5474493f73" - integrity sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ== + version "6.2.1" + resolved "https://registry.yarnpkg.com/tar/-/tar-6.2.1.tgz#717549c541bc3c2af15751bea94b1dd068d4b03a" + integrity sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A== dependencies: chownr "^2.0.0" fs-minipass "^2.0.0" diff --git a/website/next.config.js b/website/next.config.js new file mode 100644 index 000000000..9d9f42037 --- /dev/null +++ b/website/next.config.js @@ -0,0 +1,25 @@ +// const ThreadsPlugin = require("threads-plugin") + +/** @type {import('next').NextConfig} */ +const nextConfig = { + reactStrictMode: false, + webpack: (config, { isServer }) => { + // if (!isServer) { + // Ensures that web workers can import scripts. + // config.output.publicPath = '/_next/'; + config.experiments = { + ...config.experiments, + asyncWebAssembly: true, + syncWebAssembly: true, + topLevelAwait: true, + layers: true, + } + // config.plugins.push(new ThreadsPlugin()) + // config.output.globalObject = 'self'; + // } + + return config; + } +}; + +module.exports = nextConfig; diff --git a/website/next.config.mjs b/website/next.config.mjs deleted file mode 100644 index c9c822122..000000000 --- a/website/next.config.mjs +++ /dev/null @@ -1,17 +0,0 @@ -/** @type {import('next').NextConfig} */ -const nextConfig = { - webpack: (config, { isServer }) => { - if (!isServer) { - config.experiments = { - ...config.experiments, - asyncWebAssembly: true, - syncWebAssembly: true, - topLevelAwait: true, - layers: true, - } - } - return config; - } -}; - -export default nextConfig; diff --git a/website/package.json b/website/package.json index b9a8f8e32..a8a69b0f5 100644 --- a/website/package.json +++ b/website/package.json @@ -3,19 +3,31 @@ "version": "0.1.0", "private": true, "scripts": { - "preinstall": "rm -rf node_modules/wasm && rm yarn.lock && cd ../wasm && cargo clean && wasm-pack build --target web", + "build-wasm": "rimraf node_modules/wasm && rimraf .next && rimraf yarn.lock && cd ../wasm && rimraf pkg && wasm-pack build --dev --target web && cd ../website && yarn", + "build:workers": "tsc -p tsconfig.worker.json", + "watch:workers": "tsc -p tsconfig.worker.json -watch", "dev": "next dev", "build": "next build", "start": "next start", "lint": "next lint" }, "dependencies": { - "wasm": "file:../wasm/pkg", - "dexie": "^3.2.7", + "@demox-labs/miden-sdk": "file:../wasm/dist", + "@tailwindcss/forms": "^0.5.7", + "@tailwindcss/typography": "^0.5.13", + "classnames": "^2.5.1", "dexie-react-hooks": "^1.1.7", - "next": "14.1.4", + "framer-motion": "^11.2.0", + "jotai": "^2.8.0", + "next": "^14.2.3", + "next-themes": "^0.3.0", + "overlayscrollbars": "^2.8.0", + "overlayscrollbars-react": "^0.5.6", "react": "^18", - "react-dom": "^18" + "react-dom": "^18", + "react-use": "^17.5.0", + "swiper": "^11.1.3", + "wasm": "file:../wasm/pkg" }, "devDependencies": { "@types/node": "^20", diff --git a/website/public/next.svg b/website/public/next.svg deleted file mode 100644 index 5174b28c5..000000000 --- a/website/public/next.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/website/public/vercel.svg b/website/public/vercel.svg deleted file mode 100644 index d2f842227..000000000 --- a/website/public/vercel.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/website/src/app/accounts/page.tsx b/website/src/app/accounts/page.tsx index 2bc97edfc..82c85e49c 100644 --- a/website/src/app/accounts/page.tsx +++ b/website/src/app/accounts/page.tsx @@ -1,3 +1,125 @@ -export default function Account() { - return
This is the account page
+'use client' + +// import { testNewRegularAccount } from '../../helpers/account-helpers'; +// import { useWasm } from '@/context/wasm-context'; +import DashboardLayout from '@/layouts/dashboard/_dashboard'; +import { ReactElement, useCallback, useEffect, useLayoutEffect, useRef } from 'react'; + +import { useState } from 'react' +import Loader from '@/components/ui/loader'; +import * as wasm from '@demox-labs/miden-sdk'; + +interface Account { + id: number + nonce: string + code_root: string + storage_root: string + vault_root: string +} + +function AccountsTable({ accounts, isLoading }: { accounts: Account[], isLoading: boolean}) { + return ( +
+
+

Accounts

+
+ + + + + + + + + {isLoading + ? + : accounts.map((account) => ( + + + + + )) + } + +
IdNonce
{account.id}{account.nonce}
+ {/* */} +
+ ) +} + +export default function Accounts() { + const workerRef = useRef() + const [createAccountLoading, setCreateAccountLoading] = useState(false) + const [fetchAccountsLoading, setFetchAccountsLoading] = useState(false) + const [accounts, setAccounts] = useState([]) + // const wasm = useWasm(); + useLayoutEffect(() => { + workerRef.current = new Worker(new URL('../../workers/accounts.ts', import.meta.url), { type : "module" }); + workerRef.current.onmessage = async (event) => { + switch (event.data.type) { + case "createAccount": + console.log('create account worker finished') + // workerRef.current?.postMessage("fetchAccounts") + setCreateAccountLoading(false) + break; + case "fetchAccounts": + console.log('fetch accounts worker finished', event.data.accounts) + setFetchAccountsLoading(false) + setAccounts(event.data.accounts) + break; + default: + console.log('invalid message:', event.data); + break; + } + } + workerRef.current.onerror = (error) => { + console.error('Worker error:', error.message) + } + + // fetchAccounts(); + return () => { + workerRef.current?.terminate(); + } + }, []) + + // const fetchAccounts = () => { + // setFetchAccountsLoading(true) + + // // const webClient = new wasm.WebClient() + // // console.log('webClient', webClient) + // // await webClient.create_client(); + // // const accounts = await webClient.get_accounts(); + // workerRef.current?.postMessage("fetchAccounts") + // } + + async function createAccount() { + try { + setCreateAccountLoading(true) + workerRef.current?.postMessage("createAccount") + // await new Promise(r => setTimeout(r, 3000)); + } catch (error) { + console.error('Failed to call create account:', error); + } + } +// !wasm ?
Loading...
: + return ( +
+
+ {/* { isLoading + ? + : + } */} + +
+ +
+ ) +} + +Accounts.getLayout = function getLayout(page: ReactElement) { + return ( + + {page} + + ) } \ No newline at end of file diff --git a/website/src/app/greet/page.tsx b/website/src/app/greet/page.tsx index 93c73dfff..dcd7bbdb4 100644 --- a/website/src/app/greet/page.tsx +++ b/website/src/app/greet/page.tsx @@ -1,12 +1,21 @@ 'use client' -import init, { greet } from 'wasm'; +import { useWasm } from '@/context/wasm-context'; export default function Greet() { + const wasm = useWasm(); + if (!wasm) { + return
Loading...
; + } async function greetFromWasm() { - await init(); - greet(); + if (!wasm) { + console.error('wasm or webClient is null'); + return + } + + wasm.greet(); + console.log('serialze: ', wasm.serialize_test()) } return ( diff --git a/website/src/app/layout.tsx b/website/src/app/layout.tsx index c6f15090c..564ae5184 100644 --- a/website/src/app/layout.tsx +++ b/website/src/app/layout.tsx @@ -1,7 +1,13 @@ import type { Metadata } from "next"; import { Inter } from "next/font/google"; -import "./globals.css"; -import Sidebar from "@/components/sidebar"; +// base css file +import 'swiper/css'; +import '@/assets/css/scrollbar.css'; +import '@/assets/css/globals.css'; +import '@/assets/css/range-slider.css'; +import Sidebar from "@/layouts/dashboard/_sidebar"; +import { ThemeProvider } from "next-themes"; +import { Header } from "@/layouts/dashboard/_dashboard"; const inter = Inter({ subsets: ["latin"] }); @@ -10,26 +16,67 @@ export const metadata: Metadata = { description: "Generated by create next app", }; -export function AppLayout({ children }: {children: React.ReactNode}) { -
- -
{children}
-
-} - export default function RootLayout({ children, }: Readonly<{ children: React.ReactNode; }>) { return ( - + { -
- -
{children}
+
+ {/* */} +
+
+
+ +
+ +
+ {children} +
+ +
+
+ {/*
*/}
} ); } + +// export default function RootLayout({ +// children, +// }: Readonly<{ +// children: React.ReactNode; +// }>) { +// return ( +// +// { +//
+// +//
+// +//
+// {children} +//
+// +//
+// } +// +// ); +// } diff --git a/website/src/app/notes/page.tsx b/website/src/app/notes/page.tsx index 7d607c81a..f51f40504 100644 --- a/website/src/app/notes/page.tsx +++ b/website/src/app/notes/page.tsx @@ -1,16 +1,8 @@ 'use client' import { useEffect } from 'react'; -import init, * as wasm from 'wasm'; export default function Notes() { - useEffect(() => { - async function greet2() { - await init(); - wasm.greet2(); - } - greet2(); - }) return (
This is the notes page
diff --git a/website/src/app/page.tsx b/website/src/app/page.tsx index a5134e70f..5613ae0e9 100644 --- a/website/src/app/page.tsx +++ b/website/src/app/page.tsx @@ -1,12 +1,6 @@ 'use client' -import { useEffect } from "react"; -import { db } from "../lib/db"; export default function Home() { - useEffect(() => { - db.open() - }, []) - return (

This website will serve as a testing site and demo of the Miden WASM

diff --git a/website/src/assets/css/globals.css b/website/src/assets/css/globals.css new file mode 100644 index 000000000..0d36e4ac3 --- /dev/null +++ b/website/src/assets/css/globals.css @@ -0,0 +1,126 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; +@layer base { + :root { + --color-brand: 17 24 39; + } + html, + body { + @apply antialiased bg-body font-body dark:bg-dark dark:text-white; + } + .dynamic-html h6 { + @apply font-medium uppercase; + } + .dynamic-html p { + @apply mb-3; + } +} + +@layer utilities { + .text-case-inherit { + text-transform: inherit; + } + .letter-space-inherit { + letter-spacing: inherit; + } + .word-break-all { + word-break: break-all; + } + .animation-delay-200 { + animation-delay: 200ms; + } + .animation-delay-500 { + animation-delay: 500ms; + } + .animation-delay-700 { + animation-delay: 700ms; + } + .text-vertical { + writing-mode: tb; + text-orientation: upright; + } +} + +/* Hide spin button for input type number */ +input.spin-button-hidden::-webkit-outer-spin-button, +input.spin-button-hidden::-webkit-inner-spin-button { + -webkit-appearance: none; + margin: 0; +} + +/* html, +body { + padding: 0; + margin: 0; + font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Oxygen, + Ubuntu, Cantarell, Fira Sans, Droid Sans, Helvetica Neue, sans-serif; +} + +a { + color: inherit; + text-decoration: none; +} + +* { + box-sizing: border-box; +} */ + +/*================================================================ +Styles for Swiper slider +================================================================*/ +.swiper { + @apply flex flex-col; +} + +.swiper-wrapper { + @apply order-first; +} + +.swiper-scrollbar { + @apply relative bg-gray-200 rounded dark:bg-gray-600; +} + +.swiper-horizontal > .swiper-scrollbar { + @apply z-10 mt-4 mb-0 h-0.5 w-full sm:mt-6; +} + +.swiper-vertical > .swiper-scrollbar { + @apply absolute top-0 right-1 z-10 h-full w-0.5; +} + +.swiper-scrollbar-drag { + @apply relative bg-gray-900 rounded dark:bg-light-dark; +} + +.swiper-horizontal .swiper-scrollbar-drag { + @apply top-[-1px] left-0 h-[3px] w-full shadow-sm; +} + +.swiper-vertical .swiper-scrollbar-drag { + @apply left-[-1px] top-0 h-full w-[3px] shadow-sm; +} + +.swiper-scrollbar-cursor-drag { + @apply cursor-move; +} + +.swiper-scrollbar-lock { + @apply hidden; +} + +.transaction-table { + border-spacing: 0 12px; + margin-top: -12px; +} +.transaction-table > thead tr > th { + text-align: left; +} +.text-heading-style { + @apply text-sm font-medium tracking-wider; +} + +/* React Share button custom styles */ +.product-share .react-share__ShareButton { + @apply flex flex-col items-center justify-center; +} diff --git a/website/src/assets/css/range-slider.css b/website/src/assets/css/range-slider.css new file mode 100644 index 000000000..e096295d3 --- /dev/null +++ b/website/src/assets/css/range-slider.css @@ -0,0 +1,252 @@ +.rc-slider { + position: relative; + width: 100%; + height: 14px; + padding: 5px 0; + border-radius: 6px; + touch-action: none; + box-sizing: border-box; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); +} +.rc-slider * { + box-sizing: border-box; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); +} +.rc-slider-rail { + position: absolute; + width: 100%; + height: 4px; + border-radius: 6px; + @apply bg-gray-300; +} +.rc-slider-track { + position: absolute; + height: 4px; + border-radius: 6px; + @apply bg-brand; +} +.rc-slider-handle { + position: absolute; + width: 14px; + height: 14px; + margin-top: -5px; + @apply bg-white dark:bg-gray-700; + @apply border-2 border-solid border-gray-900 dark:border-gray-500; + border-radius: 50%; + cursor: pointer; + cursor: -webkit-grab; + cursor: grab; + touch-action: pan-x; +} +.rc-slider-handle-dragging.rc-slider-handle-dragging.rc-slider-handle-dragging { + @apply border-gray-900 dark:border-gray-500; + box-shadow: 0 0 0 5px #111827; +} +.rc-slider-handle:focus { + outline: none; + box-shadow: none; +} +.rc-slider-handle:focus-visible { + @apply border-gray-900 dark:border-gray-500; + box-shadow: 0 0 0 3px #111827; +} +.rc-slider-handle-click-focused:focus { + @apply border-gray-900 dark:border-gray-500; + box-shadow: unset; +} +.rc-slider-handle:hover { + @apply border-gray-900 dark:border-gray-500; +} +.rc-slider-handle:active { + @apply border-gray-900 dark:border-gray-500; + box-shadow: 0 0 5px #111827; + cursor: -webkit-grabbing; + cursor: grabbing; +} +.rc-slider-mark { + position: absolute; + top: 18px; + left: 0; + width: 100%; + font-size: 12px; +} +.rc-slider-mark-text { + position: absolute; + display: inline-block; + color: #999; + text-align: center; + vertical-align: middle; + cursor: pointer; +} +.rc-slider-mark-text-active { + color: #666; +} +.rc-slider-step { + position: absolute; + width: 100%; + height: 4px; + background: transparent; + pointer-events: none; +} +.rc-slider-dot { + position: absolute; + bottom: -2px; + width: 8px; + height: 8px; + vertical-align: middle; + @apply bg-white dark:bg-gray-700; + border: 2px solid #e9e9e9; + border-radius: 50%; + cursor: pointer; +} +.rc-slider-dot-active { + @apply border-gray-900 dark:border-gray-500; +} +.rc-slider-dot-reverse { + margin-right: -4px; +} +.rc-slider-disabled { + background-color: #e9e9e9; +} +.rc-slider-disabled .rc-slider-track { + background-color: #ccc; +} +.rc-slider-disabled .rc-slider-handle, +.rc-slider-disabled .rc-slider-dot { + @apply bg-white dark:bg-gray-700; + border-color: #ccc; + box-shadow: none; + cursor: not-allowed; +} +.rc-slider-disabled .rc-slider-mark-text, +.rc-slider-disabled .rc-slider-dot { + cursor: not-allowed !important; +} +.rc-slider-vertical { + width: 14px; + height: 100%; + padding: 0 5px; +} +.rc-slider-vertical .rc-slider-rail { + width: 4px; + height: 100%; +} +.rc-slider-vertical .rc-slider-track { + bottom: 0; + left: 5px; + width: 4px; +} +.rc-slider-vertical .rc-slider-handle { + margin-top: 0; + margin-left: -5px; + touch-action: pan-y; +} +.rc-slider-vertical .rc-slider-mark { + top: 0; + left: 18px; + height: 100%; +} +.rc-slider-vertical .rc-slider-step { + width: 4px; + height: 100%; +} +.rc-slider-vertical .rc-slider-dot { + margin-left: -2px; +} +.rc-slider-tooltip-zoom-down-enter, +.rc-slider-tooltip-zoom-down-appear { + display: block !important; + animation-duration: 0.3s; + animation-fill-mode: both; + animation-play-state: paused; +} +.rc-slider-tooltip-zoom-down-leave { + display: block !important; + animation-duration: 0.3s; + animation-fill-mode: both; + animation-play-state: paused; +} +.rc-slider-tooltip-zoom-down-enter.rc-slider-tooltip-zoom-down-enter-active, +.rc-slider-tooltip-zoom-down-appear.rc-slider-tooltip-zoom-down-appear-active { + animation-name: rcSliderTooltipZoomDownIn; + animation-play-state: running; +} +.rc-slider-tooltip-zoom-down-leave.rc-slider-tooltip-zoom-down-leave-active { + animation-name: rcSliderTooltipZoomDownOut; + animation-play-state: running; +} +.rc-slider-tooltip-zoom-down-enter, +.rc-slider-tooltip-zoom-down-appear { + transform: scale(0, 0); + animation-timing-function: cubic-bezier(0.23, 1, 0.32, 1); +} +.rc-slider-tooltip-zoom-down-leave { + animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06); +} +@keyframes rcSliderTooltipZoomDownIn { + 0% { + transform: scale(0, 0); + transform-origin: 50% 100%; + opacity: 0; + } + 100% { + transform: scale(1, 1); + transform-origin: 50% 100%; + } +} +@keyframes rcSliderTooltipZoomDownOut { + 0% { + transform: scale(1, 1); + transform-origin: 50% 100%; + } + 100% { + transform: scale(0, 0); + transform-origin: 50% 100%; + opacity: 0; + } +} +.rc-slider-tooltip { + position: absolute; + top: -9999px; + left: -9999px; + visibility: visible; + box-sizing: border-box; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); +} +.rc-slider-tooltip * { + box-sizing: border-box; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); +} +.rc-slider-tooltip-hidden { + display: none; +} +.rc-slider-tooltip-placement-top { + padding: 4px 0 8px 0; +} +.rc-slider-tooltip-inner { + min-width: 24px; + height: 24px; + padding: 6px 2px; + color: #fff; + font-size: 12px; + line-height: 1; + text-align: center; + text-decoration: none; + background-color: #6c6c6c; + border-radius: 6px; + box-shadow: 0 0 4px #d9d9d9; +} +.rc-slider-tooltip-arrow { + position: absolute; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} +.rc-slider-tooltip-placement-top .rc-slider-tooltip-arrow { + bottom: 4px; + left: 50%; + margin-left: -4px; + border-width: 4px 4px 0; + border-top-color: #6c6c6c; +} diff --git a/website/src/assets/css/scrollbar.css b/website/src/assets/css/scrollbar.css new file mode 100644 index 000000000..12e260798 --- /dev/null +++ b/website/src/assets/css/scrollbar.css @@ -0,0 +1,146 @@ +/* Custom scrollbar design starts from here */ +.os-theme-thin > .os-scrollbar-vertical { + bottom: 14px; + width: 14px; + padding: 6px 0; +} + +.os-theme-thin > .os-scrollbar-horizontal { + right: 14px; + height: 14px; + padding: 0px 6px; +} + +.os-theme-thin + > .os-scrollbar-horizontal + > .os-scrollbar-track + > .os-scrollbar-handle { + height: 100%; + min-width: 30px; +} + +.os-theme-thin.os-host-transition + > .os-scrollbar-horizontal + > .os-scrollbar-track + > .os-scrollbar-handle:before { + transition: height 0.3s, margin-top 0.3s, background 0.2s; +} + +.os-theme-thin + > .os-scrollbar-horizontal + > .os-scrollbar-track + > .os-scrollbar-handle:hover:before, +.os-theme-thin + > .os-scrollbar-horizontal + > .os-scrollbar-track + > .os-scrollbar-handle.active:before { + height: 4px; + margin-top: -2px; +} + +.os-theme-thin > .os-scrollbar-horizontal > .os-scrollbar-track:before, +.os-theme-thin + > .os-scrollbar-horizontal + > .os-scrollbar-track + > .os-scrollbar-handle:before { + left: 0; + right: 0; + height: 2px; + top: 50%; + margin-top: -1px; +} + +.os-theme-thin > .os-scrollbar > .os-scrollbar-track { + background: transparent; +} + +.os-theme-thin > .os-scrollbar-horizontal > .os-scrollbar-track:before, +.os-theme-thin > .os-scrollbar-vertical > .os-scrollbar-track:before { + content: ''; + display: block; + position: absolute; + @apply bg-black/10 dark:bg-gray-500; +} + +.os-theme-thin > .os-scrollbar-vertical > .os-scrollbar-track:before, +.os-theme-thin + > .os-scrollbar-vertical + > .os-scrollbar-track + > .os-scrollbar-handle:before { + top: 0; + bottom: 0; + width: 2px; + left: 50%; + margin-left: -1px; +} + +.os-theme-thin + > .os-scrollbar-vertical + > .os-scrollbar-track + > .os-scrollbar-handle { + width: 100%; + min-height: 15px; +} + +.os-theme-thin > .os-scrollbar-vertical > .os-scrollbar-track:before, +.os-theme-thin + > .os-scrollbar-vertical + > .os-scrollbar-track + > .os-scrollbar-handle:before { + top: 0; + bottom: 0; + width: 2px; + left: 50%; + margin-left: -1px; + border-radius: 15px; + @apply bg-black/10 dark:bg-gray-600; +} +.os-theme-thin + > .os-scrollbar + > .os-scrollbar-track + > .os-scrollbar-handle:before { + content: ''; + display: block; + position: absolute; + border-radius: 10px; + @apply bg-black/30 dark:bg-gray-800; +} + +.os-theme-thin + > .os-scrollbar-vertical + > .os-scrollbar-track + > .os-scrollbar-handle:hover:before, +.os-theme-thin + > .os-scrollbar-vertical + > .os-scrollbar-track + > .os-scrollbar-handle.active:before { + width: 2px; + margin-left: -1px; + background: #666; +} + +.os-theme-thin.os-host-transition + > .os-scrollbar-vertical + > .os-scrollbar-track + > .os-scrollbar-handle:before { + -webkit-transition: width 0.3s, margin-left 0.3s, background 0.2s; + transition: width 0.3s, margin-left 0.3s, background 0.2s; +} + +/* ScrollBar Height Calc */ +.cart-scrollbar { + -webkit-overflow-scrolling: touch; + max-height: calc(100vh - 160px); +} +/* .table-scrollbar { + background-color: green; +} */ +.table-scrollbar::-webkit-scrollbar { + -webkit-appearance: none; +} + +.table-scrollbar::-webkit-scrollbar-thumb { + background-color: rgba(0, 0, 0, 0.075); + border-radius: 10px; + border: 2px solid red; +} diff --git a/website/src/assets/images/404-dark.svg b/website/src/assets/images/404-dark.svg new file mode 100644 index 000000000..8e244f9a3 --- /dev/null +++ b/website/src/assets/images/404-dark.svg @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/website/src/assets/images/404-light.svg b/website/src/assets/images/404-light.svg new file mode 100644 index 000000000..9ec1518bc --- /dev/null +++ b/website/src/assets/images/404-light.svg @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/website/src/assets/images/anchor.svg b/website/src/assets/images/anchor.svg new file mode 100644 index 000000000..f873c4cfd --- /dev/null +++ b/website/src/assets/images/anchor.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/website/src/assets/images/author.jpg b/website/src/assets/images/author.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a59251643dd927b64a106ba66334c35aa7225527 GIT binary patch literal 8883 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 MB|Mu32%(Mt2e@q5!vFvP literal 0 HcmV?d00001 diff --git a/website/src/assets/images/avalanche.svg b/website/src/assets/images/avalanche.svg new file mode 100644 index 000000000..261f2f4b4 --- /dev/null +++ b/website/src/assets/images/avalanche.svg @@ -0,0 +1,4 @@ + + + + diff --git a/website/src/assets/images/avatar/1.png b/website/src/assets/images/avatar/1.png new file mode 100644 index 0000000000000000000000000000000000000000..d83a7a67f59bf3d009c3fe71a0b80e8bc315d704 GIT binary patch literal 5422 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 Y0Ze`?m!7Ka-2eap07*qoM6N<$f*=H$`~Uy| literal 0 HcmV?d00001 diff --git a/website/src/assets/images/avatar/10.jpg b/website/src/assets/images/avatar/10.jpg new file mode 100644 index 0000000000000000000000000000000000000000..df643d318bb228b06624f57c6c363f6e62038c08 GIT binary patch literal 7729 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 R=REfSOTWlfRVaVxe*gkH8MOca literal 0 HcmV?d00001 diff --git a/website/src/assets/images/avatar/11.jpg b/website/src/assets/images/avatar/11.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1c69019ed823cc60069fb7073ca65df683dbf775 GIT binary patch literal 23508 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±6t(kZp_LeT>fXUuw`ID+mK%Q?bfY~> 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 literal 0 HcmV?d00001 diff --git a/website/src/assets/images/avatar/2.png b/website/src/assets/images/avatar/2.png new file mode 100644 index 0000000000000000000000000000000000000000..b818a312ff7dca97d70b206c576cab4ea5b9c236 GIT binary patch literal 5588 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 iILY2GFpZGf6~2R9HuKnFmx<=eEbOVC+WeFa;Q3 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 XpZm`OxIR9HuKmNwKh;%{P09Mo>8jT_n6hfQf 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

^FLVW2cmj_Q+f;iNUF_fLCoViDTTeYGTE4tr zFdxvoT4LDwR?6`92W7=aJ}Wo=@MXEF_luNy=(D61K8_RcevE>i7z3}zS$GivpFkJy zMaX%fVMre8WDjnaM2HAJP!Q6K8wVF|8k`8q$+)G$aZ;5W59894U|Qt_xVgL;W|yR4 zUL*v|v3u{s2Kl|}gzX__XnTfadXlO_h24}8)h;>HcK9;Kqn*K;mxZ8 zZV%=Xw_glGdU0D74L3toq8*w`T48LW4kkuZFdfIsBJALMgB<)m#AbJd9RoX5`T}O} zn=Zk8@J_e!5A&Rc2Q_Pi!g-sNqOL!LbuYdVHyrw~r1-l}OH93ol9s^_5%9ez2|ZCe z>_fmeO5E7d9_UVa;cpSAfA&om)(Tj4MvaR|-iviX$ojV zi|@rO{RgAAY)_Pe{jnR}{Kq5@FO_)VIXu}tg3Yqh@4|Dj6WZ`RT){CAayvk9JArk( z!S42g{rc(7kH>-_$T*ThcoZ%52vCo1Px895c!=-6M|NI(P-ad(Ado$`yUkmt)B0tj zEu-4whJv^zpwD$xTk;c~bU_C~uG}mab-$<@4!sdEojDM-T<(e52HuHK**7B$?1{Qy zSCoToQ64sjI9L~O!(!P9)4U9{@ODVM?GSd^L3AAd6e0uOU$DNh|*;Iej4p^H~FT8cUlF6k}IcWLN?9FtF%%T=25QwZ6) zf-7A2xUAp(LeO}4Z^-if>mlOu-VoitTXhWW2(sBHaq>TeuHA!WU5d`lM!1_eJ2bgz zNV{l=pk##PP!0rTTn_w1M^QZM1c`M(kaY|tS*E{=WiB_f_V35B)Zy`rZFdW4Tvut< zb%yoYQm!zcv*qWSG`hSIT5@ELSt`o)AY^(9t(~#LUDUNnEPmxV#d3J3pE$Ekp)Wq^ zWBN8o&cV9{XLgy_3G;Xd%*2v*qHALjt`Wh80i!4%ieqVTq8JuIQ7npM?OB1f5Bi+; zKGkWz7<15PO6=s}6lHxSX*G6*jJg?uPMc=5`5tqAu6b1MhyqRC2u*HL?g%Y0GRK0D z-b&NR%p|Jt=B2E@Yb|fu{h-%&=m9Tva*fA+ZZXI7&T=yYQ(Vl@1eVE;!-uvbL^G-m zp~_J=9J~SOK-sTD(piKYVx9H@&S~%E9rQUbL!A^T;*i&7+0C1cU93TOGc`(^F&Er; zc~p=yLOc9o>zCJWe-D`_lp6~&?L^V^8FcZwISzC8Y^SYfnv*=%;h?^2Vdx8ujJ>yk zvG+GP=xdEmdZ-QoDqVE8#6^LM5?xf*#Zp;@rH1S*bq&?eIO$%8gFf$IsP7zh@)$$f zdT6V;n=loxGwX|H7z(wSQ6uw(k-52+ykFjI{f~Eq`F{uLDa`jq4cc_2si?EwTD+>x zX5Ly&TKA?Y;*&Cp{HBbieoWix3mJyKQthDsR_UY%N?Cd^fk9Ja5 zQ0Hj}`2)p}$4QzvL=e_J7K?d{(P&ty*A;aZ7HZQY^YgvAxjB}coDqd1hMoHr?$;~l z7f7tT7VB?uX!CjRC~eBGFX{*w4a)*%)1v{aWtU1=4@ODiXp$yRmD#DYWej~O>7=ek zSb9J~Fad?`4LDfpD(xgMQBLwK zdvbGg%?PGNtbc_2^%{0^xZK0_*XQM$Ecy8yrPU^xqEYRvLBEJM88=8)^Ufe)+ZUmT zFXA+HBF<1hg`CtSA4^~LVkzA>;Qog0T|&U05bgwNw;i@o*0(K$d4~z}W+>J#C@Lyy zE6^4s5YGJ@oaX<4`}G=zL^pHu5wb8h*QCdPVAK}GZAGJ6nPUAy4D^GF)$+Vb+73i0 z@@R;mPWznH&mNY(g3k3JTpz;q(kyiz-8)S(=p1d`Zzat;O_u9$bBlDNTC`eiG=F41 li*Uvf_$++%KY`O|{u^Px(<=QIjbQ))002ovPDHLkV1g)zUikn3 literal 0 HcmV?d00001 diff --git a/website/src/assets/images/avatar/8.jpg b/website/src/assets/images/avatar/8.jpg new file mode 100644 index 0000000000000000000000000000000000000000..258ba83f68a369a58a4d7efff99ee443309b265e GIT binary patch literal 23758 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 literal 0 HcmV?d00001 diff --git a/website/src/assets/images/avatar/9.jpg b/website/src/assets/images/avatar/9.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4d50707f80d614285b309a080193394a77d2400e GIT binary patch literal 9476 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 + + diff --git a/website/src/assets/images/cappasity.svg b/website/src/assets/images/cappasity.svg new file mode 100644 index 000000000..536dbaed5 --- /dev/null +++ b/website/src/assets/images/cappasity.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/website/src/assets/images/coin/binance.svg b/website/src/assets/images/coin/binance.svg new file mode 100644 index 000000000..ff659f126 --- /dev/null +++ b/website/src/assets/images/coin/binance.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/website/src/assets/images/coin/bitcoin.svg b/website/src/assets/images/coin/bitcoin.svg new file mode 100644 index 000000000..5d3c7fcf6 --- /dev/null +++ b/website/src/assets/images/coin/bitcoin.svg @@ -0,0 +1,3 @@ + + + diff --git a/website/src/assets/images/coin/cardano.svg b/website/src/assets/images/coin/cardano.svg new file mode 100644 index 000000000..71ca7205e --- /dev/null +++ b/website/src/assets/images/coin/cardano.svg @@ -0,0 +1,3 @@ + + + diff --git a/website/src/assets/images/coin/tether.svg b/website/src/assets/images/coin/tether.svg new file mode 100644 index 000000000..0424aa6d6 --- /dev/null +++ b/website/src/assets/images/coin/tether.svg @@ -0,0 +1,3 @@ + + + diff --git a/website/src/assets/images/coin/usd-coin.svg b/website/src/assets/images/coin/usd-coin.svg new file mode 100644 index 000000000..b51fba8b5 --- /dev/null +++ b/website/src/assets/images/coin/usd-coin.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/website/src/assets/images/collection/collection-1.jpg b/website/src/assets/images/collection/collection-1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d596b3664614731cce600fa45798e5b3542607ce GIT binary patch literal 1751 zcmbu+c~H`67zgkdfyB~^q&(8Bz&z+s5s$2#E=#8<&k9rXiag51HSIvO!?QFkvzlVl zYVlYl)Jn}n%OsDoB*ml5GbL^NAs&FxZ*|*gXZEk1?Rn?@Ux4X_ws2F#F%l|TiHKw=SaEieE8f&QKi{w{82lD) z&0?3g5P{@JKdUx(iI%pGuHh;pV-r(LvX!-s?fR|TwmaFDI@=I*g?{{gChK;U88 zk)Ys+Um{OLMV~x%?)-)Lgv6xej4M|&uVr1oaWm)cz5BnhbMx|xOG+O;dR$gs@$7l+ zi#qgdq-z)U;n`1r=eldXYrV1d}4A+DwEH;5CHk($-cw><-*RmR8S}+ zN_EzSP>Gt^NGuAy!hFu6&CaU6;hHNg;xM=^>Dk;GH9W}$TI@%EJ9i1eve!^NOZ!Xq z-(Y9|m+S}ZA6F+(MaCGKwR;df*^&j9^h896YpAX@Jd z!{Gcx)Y!Q4aKoVF61RD&RZLugG*9{*2I#fYr{YDl2XEGK{2bCVchPs+5X5|abAf8t zIjR9*hI~w0h7((5GKxOyp6?8JyjPavNHE3T(|PTwuT)M8agx;=Z5_x)+P0P%S2K=2 zIg;hg9(t$nt?n~-W+yaq$!5Z27Cy66tC)VmqqwRfMs;#DwJ7^?yoU~ojv z3vC1|FA9re+Zwk$?+dE)2o~iLCcI#PtCrLZM{{a)O3v)-NCX%SM4pw0|QETYd>wQ34cv^@~F+b+OaC{ zV<`pR%z=~d_rzvjA0$K4o8E2LGH$s%8Qg6hwuy(AorIc4yK2MBsf;%)JrezhU2`8z1~nKbE$cV$WIA3I)!MTL>@_hR!JuCU4! z_Uqq5v=qYA$|SGKMz(Qc@;q}w|3@Q8L4=$nuM7N4+BoY=ICGP1PK)xB3fCwKN7%R1 zUgq`|pIKvC=7b9pq@+xhyT7MWy$U2TPj5`$g#l`+;u{}op44b!(;adwjo8}NsBw`1 z20}U0=cWPIIyN$KwPvlBh~V6)Ye7`GlehOY3|PvM@yg?1ob!=xdj0c_NHu?vsk_WS zrz*dTN1FJilTcC*J#ccuUdoerD=Iu0TS~}`Il|f#nxd@BtD%Ez`+=C9_1Yr7{m^6KvZx@ACv~f35yH4oDDLOTY?_@W24sE%Z7Fi@urf-+ z6T>yT8tj~>zwEPPS8Jp_5(Z(vb`ZC}SzakrSmkt&xe^NXg0()`Zn(ggktOWWJy2MU zJpKuaWnGnQmq_zUKWK4w=P{d58q40Gj_1k?S)h3!`l44C1$Re+Qy&sOVm9~tTs~D@ z1$F1j7>%MBIf4g-`CCW;gaNEvR{wN0?{EIb{`@;KlpexXJn}d zYTt5;pt|)(+cnQ0Y@|>`ANWU=%tm<>v?=}0aE1PDR_r0G^k>QO8fB(9bp>w^b#z25 znB1t$jl8twTi3IyAlwV%NkTI*UKscR8w=W+zwg$+Y+$DjVo83F(R literal 0 HcmV?d00001 diff --git a/website/src/assets/images/collection/collection-2.jpg b/website/src/assets/images/collection/collection-2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a99a92789b58e31eb23433a440314e3ef8ed72fe GIT binary patch literal 1668 zcmbu+cTm%37zglQNJ3b)hAB&wp^Qp_uq#BMB@!%qA1W9{WJqNR$P!rs1{nrLB_g1x ztcVOFA{&7okrBeU0$~V(Kn4k6Bq`LMz3X4S`n>o4@!b2o-@DKI@<;j8z<#u~jWqxQ zfdHS~1@I>TtG(`$nJF9?l}N~L&Xp4S_n!w`ofg2Na|hBDHc+(B(zF7 z4bW5(=R%W&MWkg8$jYf5IjXLqsc&FtWNcz;_46;*sFOBmXBSsDcMnf5%=rs`7yT~< zgoQ^$UX6;5xsjZbnwEYuBR4Pq4zA$ty~4*OrDac^mOp#`vi4P7eM94GVq1GhXIJ<8 zp5DQsVe$xNbZneDGdnl`abfY(5}m5CH!AWM5$aa=~|90uTro0^4(e z1g`FGFdPCstScyP;Ry4+BB88zT}aY0rfESXn)E68!YL6 z$-ct=ag76FV9@U8f#CoW;N3p%I&&WnKdnEQ8-FeuxllOE-F7?!riaaN-z8R_ysV_U zP!DXFH_-xl-u_mI*&s&cDL=$GhK`L0pj1tS72)w#T%=?ByazhGWZr~B&c509O9m4e_lvOu#hknNP zas2QWw>mvIWxnH<*ig9%W&k@m7q-c>ZoUtqq9ialWfvMFU%e}|NqI^ywShRkm{$0~ zjTmPp9yvuii(uc~Z*B3ORn^@#sY#@*wDpM|6gmXXpiQOnj%9XED!v>p@#*q#oKRpn zBy=|ftZQrOtOkOGNTRa%Tlr<)rtf5AB5W z1Ps}Sf0PtQH)3 zSmAvsQ~M(ps*O$!rKnsQ3o(L;TC}>tksd-}x z`;dSD;u{r>n}7X9rE+7#agh}`GA?$+LYpgaV+$* zC=MZIsy$qcz2#~8Tni;Sbuzq;eZ1(vOz)0W>a&|KZltIQhdJjpw1yAH@d4^~QJGJ0 zJV|a`QWq*8i2*QJ=;`VL-a*dlk~|;ye7{GwB`(7@jH1X*`!w`=8_{+~7T>|NzAa$2 z(j^$fUgHBx)&1`K{2H4kv98G_&azouzg`n+H9^04Sg}2I+Md80Y8z^^m+^XBW}VBO ND|;2piAV9r{shRK?cV?Z literal 0 HcmV?d00001 diff --git a/website/src/assets/images/collection/collection-3.jpg b/website/src/assets/images/collection/collection-3.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f000fba7ace769af2bacf5beb53cce14ac304121 GIT binary patch literal 1900 zcmbu+X;jl!8VBHiHo|5hNPB+G>9oX$D(X-@mzb3fd3-}^h~d9QR_`UX&S zcXe|GKp+rsTDAb`ByeQ=^p|QoXU-;`OZqW6<@|*!nOWJSoZP(YMa3nhW#u<2s%!4l-X&A&sP~&5Fq&IhAGZC* zeEj4oi~a2R;Lz~M=-BuKcZN4RH~*IZZsEOPP55zrgI)epvOi$|b#Vb@2uSvM5Cnh&#H)g<`Q{y-KN4<~&*#qZ(M#)6z-i>ScB*na zO#2Rx^tET@OE*zAF+emdrsB@FPiK0VmHRp?WnFZQAA;-fn@uILc5x)(w7Olzy*&{I z*j^Mlq#@0PQ5md}JVAVfEAG%-P0i~_pEY7)aXHNW1GV zlO^4|gQURUtm|n9-Yo0&S>;C(vit6*MFp8f#rk6gD}6(}?*F5^0>U;J%M*=?n=`24AiW$g?p~grr8GS8J!?q{9F4W_6*&r0^>|vnmUU%el;_?-GZ<&=%!p)@el;}GYxLL1yZklwR>UVix8jvad&@e0K+dVIyy2$y>K`^oyeLL zA0*!l<6o&Q#|GPGr$qUW@`IY^PJ9yLw~m*`e-K{4O^(;kF77%;&L#W!m6#~zxmTBL z76;c1a=g>3^)4A%bGRq#2 zbCe`pRgNwkAQy#GIPiR?HzQ^EQ`9#lD~stJ8#u?A0YqO@$Hcs#3+0#0$)TA!=7*0= zRZKVGFitj-J{(u``?fyRajkj(f$;$kH0yaco4-ak_>6nALxWj%$)+;t8_KIJYeV~! zk{9rC-{q^1W4^{$j0So%J=It2&7l2EYIYDv4%7Q}ehSeT`o6Y;e*&!F-6Sg47H3ES zT!0wdqD@HI-08Lu6Dz3C7*f0wiVH`gj30@@uSv`!PNdXWiTF{?%e%hkiU`zw2H z%5mFs?a?fv2XnHK-Y7!On9`B2@O#=yRhpp6KNC4;MQ^c=72%2Q_R*+(fnP_^;IB3H o)Q2|ohN78Kd4qC8nn8y*-F( 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 J%2&Q*{0|Ciad7|u literal 0 HcmV?d00001 diff --git a/website/src/assets/images/collection/grid/1.jpg b/website/src/assets/images/collection/grid/1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..21508797b5058f5a72fb9f40a43cefa0d8611906 GIT binary patch literal 27408 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

G7|p|3;?W1Sa-H5s+S4N)U={FFaM>vjnu+> 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 T_$zeHVsIR?yOgH)?eqTu;Rfxz literal 0 HcmV?d00001 diff --git a/website/src/assets/images/collection/grid/2.jpg b/website/src/assets/images/collection/grid/2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6e7246c49cbac327abbeaf47719909b9e85ef644 GIT binary patch literal 41615 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 BAk6>( literal 0 HcmV?d00001 diff --git a/website/src/assets/images/collection/grid/3.jpg b/website/src/assets/images/collection/grid/3.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee8156c50c966c3047eaf330e04baf0fb3274cbf GIT binary patch literal 60096 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 !3XYct{4<=+$>zp^h_ghiIIAK|c8g!4j2dfEoX} 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

9VCUC-e^y1HqDj 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 YQ8sG-j9g*C0}-VF{1vx4_TS|H0i6x_m;e9( literal 0 HcmV?d00001 diff --git a/website/src/assets/images/collection/grid/5.jpg b/website/src/assets/images/collection/grid/5.jpg new file mode 100644 index 0000000000000000000000000000000000000000..273732850ffb8d5e98386270fb77011080fd184b GIT binary patch literal 49851 zcmbq)c{G&q|L=&9LWq=QDx|F0vYR%0Xc4kjDp`i?+c2e2))2}zl^7C}ER%J}PMH`C zV;O4`W6TVOF`GNz`@83N&$)lybMG@}&Y3y$JkL3=c|Onk{d&FLuV;U9e;#nu#=_bH zz{A4>xW|0~_NM_?|MTttYx~bh{=ZJ}pM&>10AhkXPkBUmdCmY1i1F}>@$7d4fB*o` z!T&lp;D2pA2YC4o@(Tza5<1M?q2Vat01q$k0Y2V?2l@E8d&hBq2k?m<6hEzXnP1}O zeStH<$F!ekeH2u~ zQqZ|Yk$ey`A|$1#yP!n<548V@?Eel}!v7Pp{|5HIap3?*czL)Nk5>!;0&pU$^|tQo z9`B#hvdN}En>(o3QPd;UBh3uP@f4OiFqvljZgg=@k4G__FIRd=xoD{@UK1!Z+fZtI z_;}ipd4j?gu@AZQFG{D^^AsIg(;53nt@dYjMXuPp10S2_V|iim<22nb_KD_aOPJFb zaKH49pgM}Ama!fUi=NO&zw~%G<8|z|m zWOL`R(A`o)Ugfkm!C2a2yA?ICxD?_ydTQK>JTP|ca+&aHC$;0SMFB%}MUCyk?)q+7 zRLwqs$@g2rBXF}j?P};714RxB%U{#xIxZ7DZtFAqWQS9eC=`*e`nDd&DK>#Qm=PLT z7VPR)FKUkcllvL}rma3mY)N*kVx}`_no4oY=sXYX(t%x=+v^VQzH@^Xz<)k^w@PNuiJZ44iP4IOAt zYh>rMoWHtXR&lkee)hFY#Q7>?Ma&Y?%d-gk5B1aGrIBdDobmF7I)l51 zg+KVnZcXm)n&s|EF5;(KJn7GBK}qV#1uuD)%Vi9Q`RAZ$$v^*~4FY|sY&r1uZ(heA zDhEy|Bs>5B60QQ`ghiTjbw8~PtswDuFJeuWH7Gi`zQIOzq_fA{K3VonwL6hDpoYxM=Cs z%-(O-4eO)zz_!Tp=9q{-BTa)7fkZo}<~X(yaSsNMH`oUxq)f9Ds1SXbp};DYkJpPT z1o*tSS;WoKMI_0V3hZMPVOE{;f45s7Ac+=9WL(g}vkKT3DTH-_@cSQ4kW%aSaSzX$ z58uiEyV7K8??2Hl8sFz73MRXndQOZiCp|urc~a+SUuLVZJm|>HC!J<@A-U62K|w?d zoAPB$AeLOl%G=$8Gy`9Ar08+f+l%!Q?bUG4R*}-zS<@>D?2kltoa$J+Jf|zNpuAQM zdn209sPBz4FCucbokrQ*FnF_?R~C$^fn5CNWbLb7(l)9+tTnjZA<(XfYL^x&B+) z>4uD;tKk3@46RJe*+^m!)s+tDABfJl!W%hj8OHv!4|d>Pj(M_444P$zzPjFE@)+9 z<{Ecy1-I<#PVJ7=w5j=!N@MS~MbePVao9!jtL7sN$SyHbHv8;8AlF6Q-d5zjDb$m; z8G&TF>nF}PW7ffswCmGeIm+Kn8odl86l|vJJDvBJ)sL*!vA?`I#GnBYp!|k=QAp0w zDj%dxShSSXk3+&YxJq*3LFLsZm}! zLl6;2X!O6wd-kGSX;J)@wk2~q_QR9iTmO3hDg+$sJFc2Ie^3Fo)o1Ga)%0Auuj)_> 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 literal 0 HcmV?d00001 diff --git a/website/src/assets/images/collection/grid/6.jpg b/website/src/assets/images/collection/grid/6.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f0493db1fe36318eb7bc6c8719d110bf31cc5e00 GIT binary patch literal 40310 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 APyhe` literal 0 HcmV?d00001 diff --git a/website/src/assets/images/collection/grid/7.jpg b/website/src/assets/images/collection/grid/7.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4aa4f0d8ed01b14b1fd44880364975ac0b8a2122 GIT binary patch literal 36550 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

c`Itv<6x7Ma&{??3 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 literal 0 HcmV?d00001 diff --git a/website/src/assets/images/currency/bitcoin.svg b/website/src/assets/images/currency/bitcoin.svg new file mode 100644 index 000000000..4473a885c --- /dev/null +++ b/website/src/assets/images/currency/bitcoin.svg @@ -0,0 +1,4 @@ + + + + diff --git a/website/src/assets/images/currency/ethereum.svg b/website/src/assets/images/currency/ethereum.svg new file mode 100644 index 000000000..b2269dc82 --- /dev/null +++ b/website/src/assets/images/currency/ethereum.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/website/src/assets/images/discord.svg b/website/src/assets/images/discord.svg new file mode 100644 index 000000000..4bbbbc9d1 --- /dev/null +++ b/website/src/assets/images/discord.svg @@ -0,0 +1,3 @@ + + + diff --git a/website/src/assets/images/forum.svg b/website/src/assets/images/forum.svg new file mode 100644 index 000000000..16903b86c --- /dev/null +++ b/website/src/assets/images/forum.svg @@ -0,0 +1,3 @@ + + + diff --git a/website/src/assets/images/gas-station 1.svg b/website/src/assets/images/gas-station 1.svg new file mode 100644 index 000000000..14b604764 --- /dev/null +++ b/website/src/assets/images/gas-station 1.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/website/src/assets/images/icon-128.png b/website/src/assets/images/icon-128.png new file mode 100644 index 0000000000000000000000000000000000000000..3bd20930ba65c990404681f51aaf479fba3bf7aa GIT binary patch literal 35234 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 literal 0 HcmV?d00001 diff --git a/website/src/assets/images/icon-16.png b/website/src/assets/images/icon-16.png new file mode 100644 index 0000000000000000000000000000000000000000..059aa6fb7105f27b9ffc7acaaad47fdc6ebffce3 GIT binary patch literal 1525 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 literal 0 HcmV?d00001 diff --git a/website/src/assets/images/icon-38.png b/website/src/assets/images/icon-38.png new file mode 100644 index 0000000000000000000000000000000000000000..e75f56fa297c3dd9e806aeb88188561b1ec20700 GIT binary patch literal 4747 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

+qm*Jc$X&ii+Ly%a`AqQwCFO9KDi>&9dcW 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

4*~Di18DAJHVX3*20rA(ll?%pbr$p1!PkL4Q%g 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%0ASfe>-M=LRW{qF_NP#HvG=0D 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

eaw>NhZig@qLuMPPrAFB2!4bD;Dywj4h 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�U7IE--j*5yhzv}k6PojD_!m# zff+q3w1#nQ4hv$l#7pd;t1IYeY8sZrAP@(BE05N-b@_m70n(kUYQQUDx$VtxnzpWG zcFE_`v7v@@cQmC>sXfKt+9x@|=hn7#SU2s?M?FPz8fvt&DP_ig8t-%)URANcuIl!u z8zV}xNgXzoZ?Q*SJ!@bPsybB*Z;=np&%HWJfr2>CwS4nVay+;1GRw+0U>?1y^@0=5 zYbMt-Fygmh0wnaSQRqb7v@Qt*OV+vlZ&dP;z^fXbq#;9(PPM>my3d)v1lM&MO_NHS zlew9#>PBaA(>0M2?`+^xCY#M-PbB)9v1Wvo7#Xi(+=%pAvNg23V(z(I{VTQ7;0S{` ztSuVQ0Ih;6rGSM47_So(QtrnT-Pw3a!00j3oTqaPkyOOHy5g+c0N6Osy>N1wTE>l} zT!Zgg0!@pI;MGV*)g8U4nq8kawQRIn7|D&lyTTU81XmZXYTy$vjpBm+{YX$R8N)Dqj|B(b-00Lzg^pTyB{ptuTx`)$1X?TDmM?MbsBU6c)=$l z9ckB^dd4!i{Aw`xnzX-p9S)jRy_~(*W8;sBe*m>_3z=^;mN%A4cND=cqP%|U?YzcG z1Bo-V#@rnJEA(P}Lg0eCf$9jaHTZ+@4@2>!QcD~n&h(7=(2Np$SKZ(<*gta+{%5&Q z7fx!`4~;%YfW+&tj^?-z99lowBy5E$axv*%zwsa8FNr=L+)ieOOWQJdo+Tt>-n_3- zzk*n04hwO&X|K4$)Qwc72AVord*0~sxbBQjF_KGlHPdOAo7I$In2(zkldVG(4#F&8 zbBuJT^t<$g@<$^dO7E0zhY48gZM7%017W};1ZJCYE0zvVC$X+}JwOStpfGMSO

a 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

-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 z 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Ɠ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

  • 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 literal 0 HcmV?d00001 diff --git a/website/src/assets/images/lion_slug3.jpeg b/website/src/assets/images/lion_slug3.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..4b94a4ef4fe075c068744f6584b095d87d63eb0d GIT binary patch literal 296178 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

    +~&<$35aNtO&q102<89}F0=AoldB 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

    5d)RpV>0Ke+izuiGN&p{{AEjcdx@5a)Toa#u>p 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 q^0_@Y!i=$YHQ5eFw7;Ban3Po+CdFJbnK8&_}Q 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 A82|tP literal 0 HcmV?d00001 diff --git a/website/src/assets/images/logo-white.svg b/website/src/assets/images/logo-white.svg new file mode 100644 index 000000000..c3184bc50 --- /dev/null +++ b/website/src/assets/images/logo-white.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/website/src/assets/images/logo.svg b/website/src/assets/images/logo.svg new file mode 100644 index 000000000..ac7e8a943 --- /dev/null +++ b/website/src/assets/images/logo.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/website/src/assets/images/metamask.svg b/website/src/assets/images/metamask.svg new file mode 100644 index 000000000..6cb41ba98 --- /dev/null +++ b/website/src/assets/images/metamask.svg @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/website/src/assets/images/mirror.svg b/website/src/assets/images/mirror.svg new file mode 100644 index 000000000..7bc88ae73 --- /dev/null +++ b/website/src/assets/images/mirror.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/website/src/assets/images/nft/nft-1.jpg b/website/src/assets/images/nft/nft-1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..14e2fb70980b0b4c57fd56f939a9073c326fc96f GIT binary patch literal 37687 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 literal 0 HcmV?d00001 diff --git a/website/src/assets/images/nft/nft-2.jpg b/website/src/assets/images/nft/nft-2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f75ea729b907df053cc81d3b8a8c756ee51ed2a8 GIT binary patch literal 35953 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 Bvj6}9 literal 0 HcmV?d00001 diff --git a/website/src/assets/images/nft/nft-3.jpg b/website/src/assets/images/nft/nft-3.jpg new file mode 100644 index 0000000000000000000000000000000000000000..af26b0c9b8ab549801018bc74b9090341a1bfa25 GIT binary patch literal 40471 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

    kpsY>E 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 z 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 lxw1+_9fS%C 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%0D`7IXYvf_;CFQ*`nM|Z8Xy>CC|FV{{A(MF> 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 literal 0 HcmV?d00001 diff --git a/website/src/assets/images/user-1.png b/website/src/assets/images/user-1.png new file mode 100644 index 0000000000000000000000000000000000000000..3014d980b2ed094b8b3af319ce58e826fa34c347 GIT binary patch literal 5130 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 literal 0 HcmV?d00001 diff --git a/website/src/assets/images/user-2.png b/website/src/assets/images/user-2.png new file mode 100644 index 0000000000000000000000000000000000000000..034c5910dd43bbd490348d22ba3f3acfc08b429a GIT binary patch literal 1814 zcmV+x2kH2UP)pLxJg7oR7gubl~+s@YZS*Ps93O~F@lP{ zp@7(92L-u`y~TopV#5-9MG&zo*t^mMVifFMVZr#InE0ZL(Fc5iH4(UXH+R`3%kF&l zcP8OJe3>mX=YRg?oY7jgZ0YUm>)WPRuU`HmM~)1dH*a3l_U+pfE?l^fR!~szproYa z)925hE53aBQd3q|W-l!*wLgFUye2PoF+*?AWnG zh7TX^KWNaPwtf2a@zy$Z>eQx3j~;$QhYk&lh=>S}jg5^Huztt&e_+jHm69i8Gjzv<`BozssUJLX1z7joKZ>JPsCShHr0X~BX8 z8PldsOG2hNl=({oaf9fWkdTncjYV|!1Nya?T#t$Ft5>h;w{G21nVFdiFvWKTfI4~d zqyoeMLQ-Ky(80SyhYp$3($fB1ym-+G1CJED zdGn@GJSQi|xZb#NL-C(FfBw7yL?d!M$XZW>)zmW2ojbQ^;>3x$p`oE^8s-#Wl8HaR z(oGe`?G$mNzd{<7o13f9Ug3knbcIYx7$KDbCamN;&xvGp>({ThVD>jcQ-TiU;E{f_>u&}UDks|fv$rJVX@nd!W{(XfPO2DP4Tm?{=!Ad7pF3h$u zOO=x*O)3ZAlScOyB*B8YRwz4p$Row2DDhOp(>TwbJu?8LpmZa(1S!y zJg^c~3kj{zn8F$WY@jAh ziWKRD#*O|i66EODuiw8Kl>S9G2NUeVX!r5s$0h5Aslwvr%a=y?Vm3yq)YMePebTK+ zVtkk4%!6WO=p@KZL|qJ-qj&G#c5V6cph0L##-&^7`r*TeMv4SfI+nsT zqmWkZ*s(*wTpc)Y!1x>&7pJ3t!#=?`R z=|W$Mim5VK43Z&<07x-8Xl`^azpY)nR+neP!^5o%SS6dZ9Dq+6EBYZ*SIWXOvzIJ< zuj58H<}1eEC@jX}jlp2=-o5{KP5O)@K&w`*a?c}*u$d7u`P z+wxJPMpd(N>ygeQAfmAt*_a#w5hh})9FY?M4;!I=#*7)&EIBi4x~O~i?z#T{{%IO7 zhE3>oj7a75?c3MH=byud4f`9a^}lP1Mil3ifR@bgwOQ0t=RxK42o z3|x3n7at#AJ!j6GpQurS_E}xJbUD18R8#%uttBL!wkS1Ab@ve{X_VymCffC^3;}gP( zXw|A!EZ3B_ZQJGmQVf%CcvB_GAj-}aD^>^_7cq5mwW50!;AU2XiD-(%DLfZT&8ZX* zZqlSlfYzc#3tvt^^XAP%IFX!qfQ~{j52__RRE{UV8GjolI++*8;>C+4&cBKHcXThs z*nII3dDrka1-bo~XBS~Rx9 z#!knz#Q7I1xs233VyT_O%gx9=69uG30Nwj~d3m+^4})}l^i_@%07*qoM6N<$ Ef^&Fw%>V!Z literal 0 HcmV?d00001 diff --git a/website/src/assets/images/user-3.png b/website/src/assets/images/user-3.png new file mode 100644 index 0000000000000000000000000000000000000000..0759fc6a71007856cfdde51fd46a6d0f72f30231 GIT binary patch literal 2318 zcmV+p3Gw!cP)pNut`KgR7gu5lX+0n*A~Y!?~U5N>O8gW z49rw(t%?RhAnbvV<(H5MA}&RNM-{}fim2>Df}jYpBeE#FD1wM6J4zCPuqkT*l~z>5 zpoFqW69OU0c{l!X=g$4-^F8Nt&c%JZ;a}^1+_HX?-j45d85Ua!KF&XJ(!=!pnsSYk zM<0=^r0vwsbb-HW(=P9G~cA;Wvw;;a~o}Bsh2S&@5APn`u3GF z_?-FSQ#(UER!?btQfOA37i+)`IrWRXGe?J}4bgUjLs|@6_v_HL@EcM4q8oBaMZ*ut z{Eq_a*nAg5@}-Bdi0)-+JAHLpNK;A#H07r@`s%ERA)o8U7G}FJ$p;~Qbg0IfU!P}M zbR!xctqpN?&}C?K;gEAS*Y{TsR5`aHhg3B5kSs*-aRikvbTec#ZFJ?kW?R+E8XNWC zeX^#%f~*;SV67gnvsHa)rLWF(V6qtzCjB6wj}O+^2(=-o6CT%ZmnWJD2bUhM=YyQb zKFv2R)>bYNQpXp%u{i`^`6Q&N#_K4W-aBM?nri{I>1OaK)f5`8n}M*v5(X-5G;f+{ zs_8a{LMp=Mv>`(^HvA`r<|SpZ<3iHB2O zqMtdB?$u8Ms%Ef~40Rc%kQYvbxKjiOb0)y~Lxym{$q<4M6Cl!s09R3Hev~mZWSPUz z1Bzx^$WSi!vKE(K*nOPuVU5jnV%<3OiNq`Y%n9WnQ@T39lzr)(M@tBHFo!c7V+gP}fY4)jNC_lB)io37 zyGPbc3+O6&A8Q2#$W)`8MI3@pBKVAIfU%_LrLBB^YOU@sGli;nG)O-^2tKL@zHAg= zXAHsi77%fe3?U8{U*Fy=eK_N^7h=8eP!dB#nk+Q$Td1m~UgnB&m@QL{aK7Ny2CxYP zm#p>C7v){H3Q3cdy0@4F_hR)S(R&Y^JG2LZPyh?*vA0A4)~EwZ@L?K*2OSSyoIMcc zrU%(bXG@N$X1vx$Igft1Vt}=PLZrCmUfKw%{H>ygI{T&FMm||*p%UdA!ENq7i1XYH zXB>Bf7p4!sOcSJtj1*D6-lrKPaHZhEjlLTKj_ih{Ks?l>lGH=@$;;Dx+WePp?aDLX z;E?n7xo6bjg*NJ>w3V{(XSJ1*pH0%_N9aTJ38d%1UhrfQ!G~=D7aXY&ei(!E2dUs? zX934;4Z)eZ7rY$zK&-dE=59Pm*;#6}_*Xr3O2Vg)etJgl#*I{w@Bj6f!hhdLA9-8H zkPMa6S}JCx~!80RD%V;Lf&!<4D~pCn7}u zVWKLCv6QvsQY3x%Xd}bbGy(b>Rk-@=X35VADYsvgv-th@?8iDv4$M}ka#k|KF?FOD z4FcU5aMsNpB0ZfUKHwxIpYwu*Ku@@M+64k!55j3@JMed7sCoVjMJ|sieUQ!?YszD` zHsw)oKhCmB!lhg=^ec=dU#`wzmo(-b;n(N7j+dvp&1G_36tU-ytD*wjG?#)-K}uvG z+`JqC#fi~SaP=Z&@PZ*O*jIBg&_fj!_`j8_p)PY-yx+zPt{mhSUSSt!b8X_TT`=~+ zc^%%(3G*`XObTW3Ze2N6RGQ)?C`$Gp&yGJUO}}(bmKGbbnv=*?m1QNWYl^OG8p?7t zb*0(r%3JBG!i;$3jRdYNEiOcwb}3*yjq4#u3_n^F6UgG8^Dy)9JhGRKqniF?aKuiZ z;p0Yij}AN8^tfZO%+54vW=op^i9jCRV^ z!96m_i<=S`UR;ow*jiC|LtIx;{6Sb-`S1BF2ru`EP)pNa!Eu%R7gt|mRW36_Z7wm$LrW*k7vF2 z&Ru8jzRd0!dpw@SV>4b@W43@5vn1f4RFH(FtV!%dsDvay2q9H#2s9}wMQs)-QshNy z)5KMkCKaBxe({s>12Mvu!Gp%*IlX;2um7LE@0|1hj-j%wtfIcW+=NzFqLQgvOIT~W z`p|}h`zgzX*F3hnCwa%@DFK-|A)@m~1a#@JUN7_L{2+(S?DIG$chdGd8(o(3348sZ z)?myM#!9uZvK*~>rp#2nW=(~mp`xM=t*%DII-}fTsc+waH163;*oI&A*l(TUofBsT zXYQ1U%pDWa#X|zRd{Dra_w(4|J`S7P&0@KJ1{vQ%I&Nl>#-XUyv|BLMq_LVx*<4YM z=#V-CVKkz0eZAajZA@)IZT`4iGbXaud_w%m80FM`T zapdxIJoRWNN6$XTQunqo#OQhgxt>O>XM&dce%546p*2-ldoM)w%7xEi;d0{gz-|ypu zsf`RXmL;%}R;TT>&(hG()|=X0Mx$!jggdhXv}^Zajym(ESpk1y{j=L z{j@_2|J=jMxead5*anKewUHn$82%I^?|d1f$G>j%-20}LyZ=p_`1q@YT>Lbl!n-jQ z4oAGO+3$rW*$WKk2L~GgtB?k(ydE6db|AGKAZmROQM1Jkx#h`b!8`XH$4@=adM5U| zsk?^1rpd`~lT_~8Bs2S$glAzqDHOg+$)%eq4bH`V@KSRCdICZ4$w9#RFj%=5GzuMH zkvD=}f1J>Eg5=!_EoyJ6SBV#PN&bZcqA+_%@Z^s0)TH63PHN_d3^n(UcIMG{X-|G4 zEv$Z?R^YcOFT4@=!`^5RGX5~gas)7;8LWI8Sj7&o>k3@z7GSk)5cKvzht>l-)cEQ_ z*_S^qa|^Fa^xUvS%ozUN#mwJZ%Pju0!=0aO=T^qs#nN3J@KI8O6EPp`Y6?Qa7Xd+T z)&X&F2uVPsP9T(C;IvKP_dW}0??%|-T?+@ameL7DU3pvaEMHKF#rI@v-tgZZc4?}M zUH++)Elg(k;%Hhb{UNEqrML=5qF&e<3_wh40$yqXmp(bDmnpvZa>XkuS-7TR%hy!r zlHoty%>0yY(T^Esc{1f*8Es=rw_7;47~$cyfB;)H8RD`ZWU&btp%oY@4YIZtqW&IO z8|sFwA>EpA3XTPuVAv;@-qVzGnu;u5QylY#e|6$BKW6Z`A5!?j_iaReEJm&V zG0MQzup3VKSs2g+SSza#6ayd#QC&$JXle(v_`9Gh)CJqZ9WWSfgX6lD!#;lXf=1>) zP_ai>73bVl#Xe*BF6o&3F5$?1A9v3FEru+NH@ga-HxZ?g5C!J~4E(~&!WKn|!Nkb%v?6zmPPz^egY>2)t#_?1d5TvU+ROR^((QL;@MzKEFbejRO` z7>!z{#v``5v551@S7EI9S%`qk0UAzv-LOYtp-1E)%1NMcUQmQ4@GGr)^W(7A8-wk> zFbsOt;&IjU_)QtVe@=AXJ15x3-{LHH3?FHA7e4WsZruqqjC~ojaKZdn6DlFKsMdDp_<2T`)t#<{m8>le6IXuFHw9`Axkey6l~)uX!lSM zbTc5jS>QY(2p*~AW2Iu86Q1^R?uR>AVtT-hjP0Rp*PqADLpxB@prH?`>e`1_?>WlU zo_(8Z7`Y@`#;?fE>Gu`v!CMmk_^3z}Uet4-&x4oJjH?u+@sdcBB{xm4x@o4s)65ee zO+ScH#B_#4$FnZmNEc#0ld+q2w^@u?LsLV!+G(w9-;UJuAHeHQA7RWRCq4GD<18|D zh{f)|;BhT%cf0aEjBBNh#)^IlEAo_Ug(h8jlEfEi0-xh>ET>|~xF4~N1nlP1zQ($K zrM@Q3)mEwos^%F~GnLEn#;VjhyRm-ReUNAVO`0 z9B!yiC#`k6vyR50Zq#-&i#f+LIFd`?=v)hdE(S?-StgNXH;F6~1Tu%=&K!a|CY(;& zEr+#n*xF#)ZLY0pH&sMbcs?-~^Axpzxv)y_==5*X? z#+;K87cvth(0PqOmUt3bq6uW)g*#^umt)d_*za2HmJ4Qc!@;_`+H7@ol~z$vj+X0Z eOWB$=75@YHH9uD8t#}du0000 + + + + + + + + + + diff --git a/website/src/components/defaultLayout.tsx b/website/src/components/defaultLayout.tsx index a8db73a2d..759f370ba 100644 --- a/website/src/components/defaultLayout.tsx +++ b/website/src/components/defaultLayout.tsx @@ -1,4 +1,4 @@ -import Sidebar from "./sidebar"; +import Sidebar from "../layouts/dashboard/_sidebar"; const DefaultLayout = ({ children }: {children: React.ReactNode}) => (

    diff --git a/website/src/workers/accounts.ts b/website/src/workers/accounts.ts index 05b63f17e..73de102ec 100644 --- a/website/src/workers/accounts.ts +++ b/website/src/workers/accounts.ts @@ -9,17 +9,11 @@ addEventListener('message', async (event) => { console.log('worker received message', event.data) const params = event.data.params switch (event.data.type) { - case "createAccount": - console.log('creating account', params) + case "createWallet": + console.log('creating wallet', params) const accountId = await webClient.new_wallet(params.storageType, params.mutable); console.log('account created', accountId); - postMessage({ type: "createAccount", accountId }); - break; - - case "fetchAccounts": - const accounts = await webClient.get_accounts(); - console.log('accounts fetched', accounts); - postMessage({ type: "fetchAccounts", accounts: accounts }); + postMessage({ type: "createWallet", accountId }); break; case "createFaucet": @@ -35,6 +29,12 @@ addEventListener('message', async (event) => { postMessage({ type: "createFaucet", faucetId }); break; + case "fetchAccounts": + const accounts = await webClient.get_accounts(); + console.log('accounts fetched', accounts); + postMessage({ type: "fetchAccounts", accounts: accounts }); + break; + case "fetchInputNotes": console.log('fetching input notes', params) const inputNotes = await webClient.get_input_notes(params.noteFilter); @@ -49,6 +49,31 @@ addEventListener('message', async (event) => { postMessage({ type: "fetchOutputNotes", outputNotes: outputNotes }); break; + case "fetchTransactions": + console.log('fetching transactions') + const transactions = await webClient.get_transactions(); + console.log('transactions fetched', transactions); + postMessage({ type: "fetchTransactions", transactions: transactions }); + break; + + case "importNote": + console.log('importing note', params) + break; + + case "exportNote": + console.log('exporting note', params) + const noteAsBytes = await webClient.export_note(params.noteId); + console.log('note exported', noteAsBytes); + postMessage({ type: "exportNote", noteAsBytes: noteAsBytes }); + break; + + case "importAccount": + console.log('importing account', params) + const result = await webClient.import_account(params.accountAsBytes); + console.log('account imported', result); + postMessage({ type: "importAccount", result }); + break; + default: console.log('invalid message:', event.data); postMessage({}); From e5c330ffe99f6e3b79bfbdac682eaa351d3f6e87 Mon Sep 17 00:00:00 2001 From: JohnDonavon Date: Mon, 1 Jul 2024 15:25:34 -0700 Subject: [PATCH 36/42] Mint done --- website/src/app/accounts/page.tsx | 2 +- website/src/app/transactions/page.tsx | 190 +++++++++++++++++++++++++- website/src/workers/accounts.ts | 22 +++ 3 files changed, 211 insertions(+), 3 deletions(-) diff --git a/website/src/app/accounts/page.tsx b/website/src/app/accounts/page.tsx index 6c31e2cf7..bbc729877 100644 --- a/website/src/app/accounts/page.tsx +++ b/website/src/app/accounts/page.tsx @@ -7,7 +7,7 @@ import { useState } from 'react' import Loader from '@/components/ui/loader'; export interface Account { - id: number + id: string nonce: string vault_root: string storage_root: string diff --git a/website/src/app/transactions/page.tsx b/website/src/app/transactions/page.tsx index 7a29c4af0..e1bed314e 100644 --- a/website/src/app/transactions/page.tsx +++ b/website/src/app/transactions/page.tsx @@ -1,10 +1,196 @@ 'use client' +import Loader from '@/components/ui/loader'; import DashboardLayout from '@/layouts/dashboard/_dashboard'; -import { ReactElement } from "react" +import { MutableRefObject, ReactElement, useLayoutEffect, useRef, useState } from "react" +import { Account } from '../accounts/page'; + +interface TransactionResult { + transactionId: string, + createdNoteIds: string[], +} + +interface MintTransactionProps { + accounts: Account[], + fetchAccountsLoading: boolean, + worker: MutableRefObject, + mintLoading: boolean, + setMintLoading: React.Dispatch>, + mintedTransaction: TransactionResult | null + consumeLoading: boolean, + setConsumeLoading: React.Dispatch>, +} + +function MintTransaction({ accounts, fetchAccountsLoading, worker, mintLoading, setMintLoading, mintedTransaction, consumeLoading, setConsumeLoading }: MintTransactionProps) { + const wallets = accounts.filter(account => account.is_regular_account) + const faucets = accounts.filter(account => account.is_faucet) + const [selectedWalletId, setSelectedWallet] = useState("Select a wallet") + const [selectedFaucetId, setSelectedFaucet] = useState("Select a faucet") + + const DoMint = async () => { + setMintLoading(true) + worker.current?.postMessage({ type: "mintTransaction", params: { + faucetId: selectedFaucetId, + walletId: selectedWalletId, + noteType: "Private", + amount: "5", + } }); + } + + const DoComsume = async () => { + setConsumeLoading(true) + worker.current?.postMessage({ type: "consumeTransaction", params: { + targetAccountId: selectedWalletId, + noteIds: mintedTransaction?.createdNoteIds + } }) + } + + return fetchAccountsLoading ?
    : ( +
    +
    +

    Mint 5 tokens

    +
    +
    +
    +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    +

    Consume Minted Note

    +
    +
    + {mintedTransaction + ?
    +

    Created Transaction Id: {mintedTransaction.transactionId}

    +

    Created Note Ids: {mintedTransaction.createdNoteIds.join(", ")}

    +
    + +
    +
    + :

    Mint a note to consume it here!

    } +
    +
    + ) +} + +function TransactionsTable({ transactions, isLoading }: { transactions: string[], isLoading: boolean }) { + return ( +
    +
    +

    Transactions

    +
    + + + + + + + + {isLoading + ? + : transactions.map((transactionId) => ( + + + + )) + } + +
    Id
    {transactionId}
    +
    + ) +} export default function Transactions() { - return
    This is the transactions page
    + const workerRef = useRef() + const [fetchTransactionsLoading, setFetchTransactionsLoading] = useState(true) + const [transactionIds, setTransactionIds] = useState([]) + const [fetchAccountsLoading, setFetchAccountsLoading] = useState(true) + const [accounts, setAccounts] = useState([]) + const [mintLoading, setMintLoading] = useState(false) + const [mintedTransaction, setMintedTransacton] = useState(null) + const [consumeLoading, setConsumeLoading] = useState(false) + + function createWorkerAndFetchTransactions() { + return new Promise((resolve, reject) => { + workerRef.current = new Worker(new URL('../../workers/accounts.ts', import.meta.url), { type : "module" }); + + workerRef.current.onmessage = function(event) { + switch (event.data.type) { + case "ready": + console.log('Worker is ready. Sending message...'); + workerRef.current?.postMessage({ type: "fetchTransactions" }); + break; + case "fetchTransactions": + console.log('fetch transaction ids worker finished', event.data.inputNotes) + setFetchTransactionsLoading(false) + setTransactionIds(event.data.transactions) + workerRef.current?.postMessage({ type: "fetchAccounts" }); + break; + case "fetchAccounts": + console.log('fetch accounts worker finished', event.data.accounts) + setFetchAccountsLoading(false) + setAccounts(event.data.accounts) + break; + case "mintTransaction": + console.log('mint transaction worker finished', event.data.mintResult.transactionId, event.data.mintResult.createdNoteIds) + setMintLoading(false) + setMintedTransacton(event.data.mintResult as TransactionResult) + workerRef.current?.postMessage({ type: "fetchTransactions" }) + break; + case "consumeTransaction": + console.log('consume transaction worker finished', event.data) + setConsumeLoading(false) + setMintedTransacton(null) + workerRef.current?.postMessage({ type: "fetchTransactions" }) + break; + default: + console.log('invalid message:', event.data); + break; + } + }; + + workerRef.current.onerror = function(error) { + reject(error); + }; + }); + } + + useLayoutEffect(() => { + createWorkerAndFetchTransactions() + + return () => { + workerRef.current?.terminate(); + } + }, []) + + return ( +
    + + +
    + ) } Transactions.getLayout = function getLayout(page: ReactElement) { diff --git a/website/src/workers/accounts.ts b/website/src/workers/accounts.ts index 73de102ec..529a5833f 100644 --- a/website/src/workers/accounts.ts +++ b/website/src/workers/accounts.ts @@ -1,4 +1,5 @@ import { WebClient } from "@demox-labs/miden-sdk"; +import { resolve } from "path"; console.log('Worker is setting up...'); const webClient = new WebClient(); @@ -74,6 +75,27 @@ addEventListener('message', async (event) => { postMessage({ type: "importAccount", result }); break; + case "mintTransaction": + console.log('doing a mint transaction', params) + await webClient.sync_state(); + await webClient.fetch_and_cache_account_auth_by_pub_key(params.faucetId); + const mintResult = await webClient.new_mint_transaction(params.walletId, params.faucetId, params.noteType, params.amount); + await new Promise(resolve => setTimeout(resolve, 2000)); + await webClient.sync_state(); + postMessage({ type: "mintTransaction", mintResult: { transactionId: mintResult.transaction_id, createdNoteIds: mintResult.created_note_ids } }); + break; + + case "consumeTransaction": + console.log('doing a consume transaction', params) + await new Promise(resolve => setTimeout(resolve, 2000)); + await webClient.sync_state(); + await webClient.fetch_and_cache_account_auth_by_pub_key(params.targetAccountId); + const consumeResult = await webClient.new_consume_transaction(params.targetAccountId, params.noteIds); + await new Promise(resolve => setTimeout(resolve, 2000)); + await webClient.sync_state(); + postMessage({ type: "consumeTransaction", consumeResult: { transactionId: consumeResult.transaction_id, createdNoteIds: consumeResult.created_note_ids } }); + break; + default: console.log('invalid message:', event.data); postMessage({}); From 36532a3fc4925da390db3ee5adfca909ca72b51c Mon Sep 17 00:00:00 2001 From: JohnDonavon Date: Mon, 1 Jul 2024 22:58:57 -0700 Subject: [PATCH 37/42] Other transaction examples --- website/src/app/transactions/page.tsx | 323 ++++++++++++++++++++++++-- website/src/workers/accounts.ts | 58 ++++- 2 files changed, 352 insertions(+), 29 deletions(-) diff --git a/website/src/app/transactions/page.tsx b/website/src/app/transactions/page.tsx index e1bed314e..097514444 100644 --- a/website/src/app/transactions/page.tsx +++ b/website/src/app/transactions/page.tsx @@ -2,14 +2,26 @@ import Loader from '@/components/ui/loader'; import DashboardLayout from '@/layouts/dashboard/_dashboard'; -import { MutableRefObject, ReactElement, useLayoutEffect, useRef, useState } from "react" +import { MutableRefObject, ReactElement, use, useLayoutEffect, useRef, useState } from "react" import { Account } from '../accounts/page'; +interface ConsumeParams { + targetAccountId: string, + listOfNotes: string[] +} + interface TransactionResult { transactionId: string, createdNoteIds: string[], } +interface SwapTransactionResult { + transactionId: string, + expectedOutputNoteIds: string[], + expectedPartialNoteIds: string[], + paybackNoteTag: string +} + interface MintTransactionProps { accounts: Account[], fetchAccountsLoading: boolean, @@ -21,6 +33,70 @@ interface MintTransactionProps { setConsumeLoading: React.Dispatch>, } +interface SendTransactionProps { + accounts: Account[], + fetchAccountsLoading: boolean, + worker: MutableRefObject, + sendLoading: boolean, + setSendLoading: React.Dispatch>, + sentTransaction: TransactionResult | null, + consumeLoading: boolean, + setConsumeLoading: React.Dispatch> +} + +interface SwapTransactionProps { + accounts: Account[], + fetchAccountsLoading: boolean, + worker: MutableRefObject, + swapLoading: boolean, + setSwapLoading: React.Dispatch>, + swappedTransaction: SwapTransactionResult | null, + consumeALoading: boolean, + setConsumeALoading: React.Dispatch>, + consumeBLoading: boolean, + setConsumeBLoading: React.Dispatch>, +} + +interface ConsumeTransactionProps { + consumeLoading: boolean, + setConsumeLoading: React.Dispatch>, + worker: MutableRefObject, + transactionId?: string, + consumeParams: ConsumeParams | null, + consumeType: string, + consumeTitle?: string +} + +function ConsumeTransaction({consumeLoading, setConsumeLoading, worker, transactionId, consumeParams, consumeType, consumeTitle="Consume Note" }: ConsumeTransactionProps) { + const DoComsume = async () => { + setConsumeLoading(true) + worker.current?.postMessage({ type: "consumeTransaction", params: { + targetAccountId: consumeParams?.targetAccountId, + noteIds: consumeParams?.listOfNotes, + consumeType: consumeType + } }) + } + + return( +
    +
    +

    {consumeTitle}

    +
    +
    + {consumeParams + ?
    +

    Created Transaction Id: {transactionId}

    +

    Created Note Ids: {consumeParams.listOfNotes.join(", ")}

    +
    + +
    +
    + :

    Create a note to consume it here!

    } +
    +
    + ) +} + function MintTransaction({ accounts, fetchAccountsLoading, worker, mintLoading, setMintLoading, mintedTransaction, consumeLoading, setConsumeLoading }: MintTransactionProps) { const wallets = accounts.filter(account => account.is_regular_account) const faucets = accounts.filter(account => account.is_faucet) @@ -37,20 +113,12 @@ function MintTransaction({ accounts, fetchAccountsLoading, worker, mintLoading, } }); } - const DoComsume = async () => { - setConsumeLoading(true) - worker.current?.postMessage({ type: "consumeTransaction", params: { - targetAccountId: selectedWalletId, - noteIds: mintedTransaction?.createdNoteIds - } }) - } - return fetchAccountsLoading ?
    : (

    Mint 5 tokens

    -
    +
    @@ -70,18 +138,163 @@ function MintTransaction({ accounts, fetchAccountsLoading, worker, mintLoading,
    -

    Consume Minted Note

    +
    -
    - {mintedTransaction - ?
    -

    Created Transaction Id: {mintedTransaction.transactionId}

    -

    Created Note Ids: {mintedTransaction.createdNoteIds.join(", ")}

    -
    - +
    + ) +} + +function SendTransaction(props: SendTransactionProps) { + const wallets = props.accounts.filter(account => account.is_regular_account) + const faucets = props.accounts.filter(account => account.is_faucet) + const [senderId, setSenderId] = useState("Select a sender") + const [receiverId, setReceiverId] = useState("Select a recipient") + const [faucetId, setFaucetId] = useState("Select a faucet") + + const parametersSelected = (): boolean => { + return senderId != "Select a sender" && receiverId != "Select a recipient" && faucetId != "Select a faucet" + } + + const DoSend = async () => { + props.setSendLoading(true) + props.worker.current?.postMessage({ type: "sendTransaction", params: { + senderAccountId: senderId, + targetAccountId: receiverId, + faucetId: faucetId, + noteType: "Private", + amount: "1", + recallHeight: null + } }); + } + + return props.fetchAccountsLoading ?
    : ( +
    +
    +

    Send 1 token

    +
    +
    +
    +
    +
    + +
    +
    + +
    +
    + +
    -
    - :

    Mint a note to consume it here!

    } + +
    +
    +
    + +
    +
    + ) +} + +function SwapTransaction(props: SwapTransactionProps) { + const wallets = props.accounts.filter(account => account.is_regular_account) + const faucets = props.accounts.filter(account => account.is_faucet) + const [walletA, setWalletA] = useState("Select wallet A") + const [faucetA, setFaucetA] = useState("Select faucet A") + const [walletB, setWalletB] = useState("Select wallet B") + const [faucetB, setFaucetB] = useState("Select faucet B") + + const parametersSelected = (): boolean => { + return walletA != "Select wallet A" && faucetA != "Select faucet A" && walletB != "Select wallet B" && faucetB != "Select faucet B" + } + + const DoSwap = async () => { + props.setSwapLoading(true) + props.worker.current?.postMessage({ type: "swapTransaction", params: { + walletA: walletA, + faucetA: faucetA, + amountOfA: "1", + faucetB: faucetB, + amountOfB: "1", + noteType: "Public" + } }); + } + + return props.fetchAccountsLoading ?
    : ( +
    +
    +

    Swap assets

    +
    +
    +
    +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + +
    +
    +
    ) @@ -120,9 +333,22 @@ export default function Transactions() { const [transactionIds, setTransactionIds] = useState([]) const [fetchAccountsLoading, setFetchAccountsLoading] = useState(true) const [accounts, setAccounts] = useState([]) + // Mint state const [mintLoading, setMintLoading] = useState(false) const [mintedTransaction, setMintedTransacton] = useState(null) - const [consumeLoading, setConsumeLoading] = useState(false) + // Send State + const [sendLoading, setSendLoading] = useState(false) + const [sentTransaction, setSentTransaction] = useState(null) + // Swap State + const [swapLoading, setSwapLoading] = useState(false) + const [swappedTransaction, setSwappedTransaction] = useState(null) + // Consume state + const [mintConsumeLoading, setMintConsumeLoading] = useState(false) + const [sendConsumeLoading, setSendConsumeLoading] = useState(false) + const [swapAConsumeLoading, setSwapAConsumeLoading] = useState(false) + const [swapBConsumeLoading, setSwapBConsumeLoading] = useState(false) + const [swapAConsumed, setSwapAConsumed] = useState(false) + const [swapBConsumed, setSwapBConsumed] = useState(false) function createWorkerAndFetchTransactions() { return new Promise((resolve, reject) => { @@ -151,10 +377,37 @@ export default function Transactions() { setMintedTransacton(event.data.mintResult as TransactionResult) workerRef.current?.postMessage({ type: "fetchTransactions" }) break; + case "sendTransaction": + console.log('send transaction worker finished', event.data) + setSendLoading(false) + setSentTransaction(event.data.sendResult as TransactionResult) + workerRef.current?.postMessage({ type: "fetchTransactions" }) + break; + case "swapTransaction": + console.log('swap transaction worker finished', event.data) + setSwapLoading(false) + setSwapAConsumed(false) + setSwapBConsumed(false) + setSwappedTransaction(event.data.swapResult as SwapTransactionResult) + workerRef.current?.postMessage({ type: "fetchTransactions" }) + break; case "consumeTransaction": console.log('consume transaction worker finished', event.data) - setConsumeLoading(false) - setMintedTransacton(null) + setMintConsumeLoading(false) + if (event.data.consumeType == "mint") setMintedTransacton(null) + if (event.data.consumeType == "send") setSentTransaction(null) + if (event.data.consumeType == "swapA") { + console.log("swapA consumed") + setSwapAConsumed(true) + setSwapAConsumeLoading(false) + } + if (event.data.consumeType == "swapB") { + console.log("swapB consumed") + setSwapBConsumed(true) + setSwapBConsumeLoading(false) + } + if (event.data.consumeType == "swapA" && swapBConsumed) setSwappedTransaction(null) + if (event.data.consumeType == "swapB" && swapAConsumed) setSwappedTransaction(null) workerRef.current?.postMessage({ type: "fetchTransactions" }) break; default: @@ -186,8 +439,28 @@ export default function Transactions() { mintLoading={mintLoading} setMintLoading={setMintLoading} mintedTransaction={mintedTransaction} - consumeLoading={consumeLoading} - setConsumeLoading={setConsumeLoading} /> + consumeLoading={mintConsumeLoading} + setConsumeLoading={setMintConsumeLoading} /> + +
    ) diff --git a/website/src/workers/accounts.ts b/website/src/workers/accounts.ts index 529a5833f..a69aef012 100644 --- a/website/src/workers/accounts.ts +++ b/website/src/workers/accounts.ts @@ -1,5 +1,4 @@ import { WebClient } from "@demox-labs/miden-sdk"; -import { resolve } from "path"; console.log('Worker is setting up...'); const webClient = new WebClient(); @@ -23,7 +22,7 @@ addEventListener('message', async (event) => { params.storageType, params.nonFungible, params.tokenSymbol, - params.decimals, + params.decimals, params.maxSupply ); console.log('faucet created', faucetId); @@ -82,9 +81,56 @@ addEventListener('message', async (event) => { const mintResult = await webClient.new_mint_transaction(params.walletId, params.faucetId, params.noteType, params.amount); await new Promise(resolve => setTimeout(resolve, 2000)); await webClient.sync_state(); - postMessage({ type: "mintTransaction", mintResult: { transactionId: mintResult.transaction_id, createdNoteIds: mintResult.created_note_ids } }); + postMessage({ + type: "mintTransaction", + mintResult: { transactionId: mintResult.transaction_id, createdNoteIds: mintResult.created_note_ids } + }); + break; + + case "sendTransaction": + console.log('doing a send transaction', params) + await webClient.sync_state(); + await webClient.fetch_and_cache_account_auth_by_pub_key(params.senderAccountId); + const sendResult = await webClient.new_send_transaction( + params.senderAccountId, + params.targetAccountId, + params.faucetId, + params.noteType, + params.amount, + params.recallHeight + ); + await new Promise(resolve => setTimeout(resolve, 2000)); + await webClient.sync_state(); + postMessage({ type: "sendTransaction", sendResult: { transactionId: sendResult.transaction_id, createdNoteIds: sendResult.created_note_ids } }); break; + case "swapTransaction": + console.log('doing a swap transaction', params) + await webClient.sync_state(); + await webClient.fetch_and_cache_account_auth_by_pub_key(params.walletA); + const swapResult = await webClient.new_swap_transaction( + params.walletA, + params.faucetA, + params.amountOfA, + params.faucetB, + params.amountOfB, + params.noteType + ); + await new Promise(resolve => setTimeout(resolve, 2000)); + await webClient.sync_state(); + + await webClient.add_tag(swapResult.payback_note_tag) + await new Promise(resolve => setTimeout(resolve, 10000)); + await webClient.sync_state(); + + postMessage({ type: "swapTransaction", swapResult: { + transactionId: swapResult.transaction_id, + expectedOutputNoteIds: swapResult.expected_output_note_ids, + expectedPartialNoteIds: swapResult.expected_partial_note_ids, + paybackNoteTag: swapResult.payback_note_tag + } }); + break; + case "consumeTransaction": console.log('doing a consume transaction', params) await new Promise(resolve => setTimeout(resolve, 2000)); @@ -93,7 +139,11 @@ addEventListener('message', async (event) => { const consumeResult = await webClient.new_consume_transaction(params.targetAccountId, params.noteIds); await new Promise(resolve => setTimeout(resolve, 2000)); await webClient.sync_state(); - postMessage({ type: "consumeTransaction", consumeResult: { transactionId: consumeResult.transaction_id, createdNoteIds: consumeResult.created_note_ids } }); + postMessage({ + type: "consumeTransaction", + consumeResult: { transactionId: consumeResult.transaction_id, createdNoteIds: consumeResult.created_note_ids }, + consumeType: params.consumeType + }); break; default: From fc2bc1d9de1f1fd7103dd24cb5011d3c7323481f Mon Sep 17 00:00:00 2001 From: JohnDonavon Date: Wed, 3 Jul 2024 18:12:08 -0700 Subject: [PATCH 38/42] Show wallet info --- wasm/js/types/index.d.ts | 6 +- wasm/src/web_client/account.rs | 42 ++++++- wasm/src/web_client/models/accounts.rs | 150 ++++++++++++++++++++++++- wasm/test.html | 2 +- 4 files changed, 191 insertions(+), 9 deletions(-) diff --git a/wasm/js/types/index.d.ts b/wasm/js/types/index.d.ts index 8f8ce3c0f..b45c840d8 100644 --- a/wasm/js/types/index.d.ts +++ b/wasm/js/types/index.d.ts @@ -1,6 +1,10 @@ export { WebClient, - NewTransactionResult, + // Account models + AssetInfo, + SerializedAccount, SerializedAccountStub, + // Transaction models + NewTransactionResult, NewSwapTransactionResult } from "./crates/miden_wasm"; \ No newline at end of file diff --git a/wasm/src/web_client/account.rs b/wasm/src/web_client/account.rs index 9c02886b0..e2c92b2a7 100644 --- a/wasm/src/web_client/account.rs +++ b/wasm/src/web_client/account.rs @@ -1,14 +1,18 @@ use super::WebClient; use crate::web_client::models::accounts::SerializedAccountStub; +use crate::web_client::models::accounts::AssetInfo; +use crate::web_client::models::accounts::SerializedAccount; use base64::encode; -use miden_objects::{accounts::{AccountData, AccountId}, assets::TokenSymbol, notes::NoteId}; +use miden_objects::{accounts::{AccountData, AccountId}, assets::{self, Asset, TokenSymbol}, notes::NoteId}; use miden_tx::utils::{Deserializable, Serializable}; use miden_client::client::accounts; use miden_client::client::rpc::NodeRpcClient; use miden_client::store::Store; +use miden_objects::accounts::AccountStub; + use serde::{Serialize, Deserialize}; use serde_wasm_bindgen::from_value; use wasm_bindgen::prelude::*; @@ -49,7 +53,6 @@ impl WebClient { console_error_panic_hook::set_once(); if let Some(client) = self.get_mut_inner() { let account_tuples = client.get_account_stubs().await.unwrap(); - web_sys::console::log_1(&format!("account_tuples {:?}", account_tuples).into()); let accounts: Vec = account_tuples.into_iter().map(|(account, _)| { SerializedAccountStub::new( account.id().to_string(), @@ -76,15 +79,42 @@ impl WebClient { pub async fn get_account( &mut self, account_id: String - ) -> Result { + ) -> Result { web_sys::console::log_1(&JsValue::from_str("get_account called")); if let Some(client) = self.get_mut_inner() { let native_account_id = AccountId::from_hex(&account_id).unwrap(); let result = client.get_account(native_account_id).await.unwrap(); - - serde_wasm_bindgen::to_value(&result.0.id().to_string()) - .map_err(|e| JsValue::from_str(&e.to_string())) + let asset_infos: Vec = result.0.vault().assets().map(|asset| { + match asset { + assets::Asset::Fungible(fungible) => AssetInfo::new( + asset.is_fungible(), + fungible.amount().to_string(), + asset.faucet_id().to_string(), + ), + assets::Asset::NonFungible(non_fungible) => AssetInfo::new( + asset.is_fungible(), + "0".to_string(), + asset.faucet_id().to_string(), + ) + } + }).collect(); + let account_stub: AccountStub = (&result.0).into(); + + Ok(SerializedAccount::new( + result.0.id().to_string(), + result.0.nonce().to_string(), + account_stub.vault_root().to_string(), + account_stub.storage_root().to_string(), + account_stub.code_root().to_string(), + format!("{:?}", result.0.id().account_type()), + result.0.id().is_faucet(), + result.0.id().is_regular_account(), + result.0.id().is_on_chain(), + asset_infos + )) + // serde_wasm_bindgen::to_value(&result.0.id().to_string()) + // .map_err(|e| JsValue::from_str(&e.to_string())) } else { Err(JsValue::from_str("Client not initialized")) } diff --git a/wasm/src/web_client/models/accounts.rs b/wasm/src/web_client/models/accounts.rs index ca5f7bd0a..6a44deed3 100644 --- a/wasm/src/web_client/models/accounts.rs +++ b/wasm/src/web_client/models/accounts.rs @@ -4,7 +4,41 @@ use serde_wasm_bindgen::to_value; #[wasm_bindgen] #[derive(Serialize, Deserialize)] -pub struct SerializedAccountStub { +pub struct AssetInfo { + is_fungible: bool, + amount: String, + faucet_id: String +} + +#[wasm_bindgen] +impl AssetInfo { + pub fn new(is_fungible: bool, amount: String, faucet_id: String) -> AssetInfo { + AssetInfo { + is_fungible, + amount, + faucet_id + } + } + + #[wasm_bindgen(getter)] + pub fn is_fungible(&self) -> bool { + self.is_fungible.clone() + } + + #[wasm_bindgen(getter)] + pub fn amount(&self) -> String { + self.amount.clone() + } + + #[wasm_bindgen(getter)] + pub fn faucet_id(&self) -> String { + self.faucet_id.clone() + } +} + +#[wasm_bindgen] +#[derive(Serialize, Deserialize)] +pub struct SerializedAccount { id: String, nonce: String, vault_root: String, @@ -14,6 +48,100 @@ pub struct SerializedAccountStub { is_faucet: bool, is_regular_account: bool, is_on_chain: bool, + assets: Vec +} + +#[wasm_bindgen] +impl SerializedAccount { + pub fn new( + id: String, + nonce: String, + vault_root: String, + storage_root: String, + code_root: String, + account_type: String, + is_faucet: bool, + is_regular_account: bool, + is_on_chain: bool, + assets: Vec + ) -> SerializedAccount { + SerializedAccount { + id, + nonce, + vault_root, + storage_root, + code_root, + account_type, + is_faucet, + is_regular_account, + is_on_chain, + assets + } + } + + #[wasm_bindgen(getter)] + pub fn id(&self) -> String { + self.id.clone() + } + + #[wasm_bindgen(getter)] + pub fn nonce(&self) -> String { + self.nonce.clone() + } + + #[wasm_bindgen(getter)] + pub fn vault_root(&self) -> String { + self.vault_root.clone() + } + + #[wasm_bindgen(getter)] + pub fn storage_root(&self) -> String { + self.storage_root.clone() + } + + #[wasm_bindgen(getter)] + pub fn code_root(&self) -> String { + self.code_root.clone() + } + + #[wasm_bindgen(getter)] + pub fn account_type(&self) -> String { + self.account_type.clone() + } + + #[wasm_bindgen(getter)] + pub fn is_faucet(&self) -> bool { + self.is_faucet.clone() + } + + #[wasm_bindgen(getter)] + pub fn is_regular_account(&self) -> bool { + self.is_regular_account.clone() + } + + #[wasm_bindgen(getter)] + pub fn is_on_chain(&self) -> bool { + self.is_on_chain.clone() + } + + #[wasm_bindgen(getter)] + pub fn assets(&self) -> JsValue { + to_value(&self.assets).unwrap() + } +} + +#[wasm_bindgen] +#[derive(Serialize, Deserialize)] +pub struct SerializedAccountStub { + id: String, + nonce: String, + vault_root: String, + storage_root: String, + code_root: String, + account_type: String, + is_faucet: bool, + is_regular_account: bool, + is_on_chain: bool } #[wasm_bindgen] @@ -66,4 +194,24 @@ impl SerializedAccountStub { pub fn code_root(&self) -> String { self.code_root.clone() } + + #[wasm_bindgen(getter)] + pub fn account_type(&self) -> String { + self.account_type.clone() + } + + #[wasm_bindgen(getter)] + pub fn is_faucet(&self) -> bool { + self.is_faucet.clone() + } + + #[wasm_bindgen(getter)] + pub fn is_regular_account(&self) -> bool { + self.is_regular_account.clone() + } + + #[wasm_bindgen(getter)] + pub fn is_on_chain(&self) -> bool { + self.is_on_chain.clone() + } } diff --git a/wasm/test.html b/wasm/test.html index ebcb6bbd1..4d8aad108 100644 --- a/wasm/test.html +++ b/wasm/test.html @@ -1136,7 +1136,7 @@ // console.log("testExportInputNote finished"); } - // await testCreateNewWallet(); + await testCreateNewWallet(); // await testCreateNewFaucet(); await testGetAccounts(false); // await testGetAccount(); From 66e42912331c0c91563d455131427fcf4906f334 Mon Sep 17 00:00:00 2001 From: JohnDonavon Date: Wed, 3 Jul 2024 18:12:19 -0700 Subject: [PATCH 39/42] get rest of changes --- website/src/app/accounts/[accountId]/page.tsx | 126 +++++ website/src/app/accounts/page.tsx | 32 +- website/src/app/faucets/page.tsx | 12 +- website/src/app/transactions/page.tsx | 29 +- website/src/workers/accounts.ts | 10 +- website/yarn.lock | 439 ++++++++++-------- 6 files changed, 443 insertions(+), 205 deletions(-) create mode 100644 website/src/app/accounts/[accountId]/page.tsx diff --git a/website/src/app/accounts/[accountId]/page.tsx b/website/src/app/accounts/[accountId]/page.tsx new file mode 100644 index 000000000..ecf9edc60 --- /dev/null +++ b/website/src/app/accounts/[accountId]/page.tsx @@ -0,0 +1,126 @@ +'use client' +import { AssetInfo, SerializedAccount } from "@demox-labs/miden-sdk"; +import { useLayoutEffect, useRef, useState } from "react"; + +export interface IJSSerializedAccount { + id: string + nonce: string + vault_root: string + storage_root: string + code_root: string + account_type: string, + is_faucet: boolean, + is_regular_account: boolean, + is_on_chain: boolean, + assets: IJSAssetInfo[] +} + +interface IJSAssetInfo { + is_fungible: boolean, + amount: string, + faucet_id: string +} + +export class JSSerializedAccount implements IJSSerializedAccount { + id: string + nonce: string + vault_root: string + storage_root: string + code_root: string + account_type: string + is_faucet: boolean + is_regular_account: boolean + is_on_chain: boolean + assets: IJSAssetInfo[] + + constructor(account: SerializedAccount) { + this.id = account.id + this.nonce = account.nonce + this.vault_root = account.vault_root + this.storage_root = account.storage_root + this.code_root = account.code_root + this.account_type = account.account_type + this.is_faucet = account.is_faucet + this.is_regular_account = account.is_regular_account + this.is_on_chain = account.is_on_chain + this.assets = account.assets.map((asset: AssetInfo) => { + return { + is_fungible: asset.is_fungible, + amount: asset.amount, + faucet_id: asset.faucet_id + } as IJSAssetInfo + }) + } + +} + +const AccountDetailsPage = ({ params }: { params: { accountId: string } }) => { + const workerRef = useRef() + const [account, setAccount] = useState(null); + + const createWorkerAndGetAccount = async () => { + return new Promise((resolve, reject) => { + workerRef.current = new Worker(new URL('../../../workers/accounts.ts', import.meta.url), { type : "module" }); + + workerRef.current.onmessage = function(event) { + switch (event.data.type) { + case "ready": + console.log('Worker is ready. Sending message...'); + workerRef.current?.postMessage({ type: "getAccount", params: { accountId: params.accountId } }); + break; + case "getAccount": + console.log('get account worker finished', event.data.account) + setAccount(event.data.account as JSSerializedAccount); + break; + default: + console.log('invalid message:', event.data); + break; + } + }; + + workerRef.current.onerror = function(error) { + reject(error); + }; + }); + } + + useLayoutEffect(() => { + createWorkerAndGetAccount() + + return () => { + workerRef.current?.terminate(); + } + }, []) + + if (!account) return
    Loading...
    ; + + return ( +
    +

    Account Details for account {params.accountId}

    +
    +

    Nonce: {account.nonce}

    +

    Vault root: {account.vault_root}

    +

    Storage root: {account.storage_root}

    +

    Code root: {account.code_root}

    +

    Account Type: {account.account_type}

    +

    Is Faucet?: {account.is_faucet.toString()}

    +

    Is regaular account?: {account.is_regular_account.toString()}

    +

    Is on chain?: {account.is_on_chain.toString()}

    +
    + +

    Assets:

    +
    + {account.assets.map((asset, idx) => +
    +

    Asset {idx}

    +

    Asset faucet Id: {asset.faucet_id}

    +

    Asset amount: {asset.amount}

    +

    Asset is fungible: {asset.is_fungible.toString()}

    +
    ) + } +
    +
    + ); +}; + +export default AccountDetailsPage; \ No newline at end of file diff --git a/website/src/app/accounts/page.tsx b/website/src/app/accounts/page.tsx index bbc729877..76fbacbca 100644 --- a/website/src/app/accounts/page.tsx +++ b/website/src/app/accounts/page.tsx @@ -1,10 +1,12 @@ 'use client' import DashboardLayout from '@/layouts/dashboard/_dashboard'; -import { ReactElement, useLayoutEffect, useRef } from 'react'; +import { MutableRefObject, ReactElement, useLayoutEffect, useRef } from 'react'; import { useState } from 'react' import Loader from '@/components/ui/loader'; +import { SerializedAccount } from '@demox-labs/miden-sdk'; +import Link from 'next/link'; export interface Account { id: string @@ -18,7 +20,11 @@ export interface Account { is_on_chain: boolean, } -function AccountsTable({ accounts, isLoading }: { accounts: Account[], isLoading: boolean }) { +function AccountsTable({ accounts, isLoading, worker }: { accounts: Account[], isLoading: boolean, worker: MutableRefObject }) { + + const getAccount = (accountId: string) => { + worker.current?.postMessage({ type: "getAccount", params: { accountId } }) + } return (
    @@ -36,8 +42,17 @@ function AccountsTable({ accounts, isLoading }: { accounts: Account[], isLoading {isLoading ?
    : accounts.map((account) => ( - - {account.id} + { getAccount(account.id) }}> + + + {account.id} + + {account.nonce} )) @@ -76,6 +91,10 @@ export default function Accounts() { setFetchAccountsLoading(false) setAccounts(event.data.accounts) break; + case "getAccount": + const account = event.data.account as SerializedAccount + console.log('get account worker finished', account) + break; default: console.log('invalid message:', event.data); break; @@ -128,7 +147,10 @@ export default function Accounts() {
    - account.is_regular_account)} isLoading={fetchAccountsLoading} /> + account.is_regular_account)} + isLoading={fetchAccountsLoading} + worker={workerRef} />
    ) } diff --git a/website/src/app/faucets/page.tsx b/website/src/app/faucets/page.tsx index 14a51b1c7..711a3570e 100644 --- a/website/src/app/faucets/page.tsx +++ b/website/src/app/faucets/page.tsx @@ -6,6 +6,7 @@ import { ReactElement, useLayoutEffect, useRef } from 'react'; import { useState } from 'react' import Loader from '@/components/ui/loader'; import { Account } from '../accounts/page'; +import Link from 'next/link'; function FaucetsTable({ accounts, isLoading }: { accounts: Account[], isLoading: boolean }) { @@ -27,7 +28,16 @@ function FaucetsTable({ accounts, isLoading }: { accounts: Account[], isLoading: ?
    : accounts.map((account) => ( - {account.id} + + + {account.id} + + {account.nonce} )) diff --git a/website/src/app/transactions/page.tsx b/website/src/app/transactions/page.tsx index 097514444..d0eece28f 100644 --- a/website/src/app/transactions/page.tsx +++ b/website/src/app/transactions/page.tsx @@ -51,6 +51,8 @@ interface SwapTransactionProps { swapLoading: boolean, setSwapLoading: React.Dispatch>, swappedTransaction: SwapTransactionResult | null, + swapANotes: string[] | null, + swapBNotes: string[] | null, consumeALoading: boolean, setConsumeALoading: React.Dispatch>, consumeBLoading: boolean, @@ -282,17 +284,17 @@ function SwapTransaction(props: SwapTransactionProps) { setConsumeLoading={props.setConsumeBLoading} worker={props.worker} transactionId={props.swappedTransaction?.transactionId} - consumeParams={props.swappedTransaction ? { targetAccountId: walletB, listOfNotes: props.swappedTransaction?.expectedOutputNoteIds } : null } + consumeParams={props.swapBNotes ? { targetAccountId: walletB, listOfNotes: props.swapBNotes } : null } consumeTitle="Consume Note for Wallet B" consumeType='swapB' />
    @@ -347,8 +349,8 @@ export default function Transactions() { const [sendConsumeLoading, setSendConsumeLoading] = useState(false) const [swapAConsumeLoading, setSwapAConsumeLoading] = useState(false) const [swapBConsumeLoading, setSwapBConsumeLoading] = useState(false) - const [swapAConsumed, setSwapAConsumed] = useState(false) - const [swapBConsumed, setSwapBConsumed] = useState(false) + const [swapANotes, setSwapANotes] = useState(null) + const [swapBNotes, setSwapBNotes] = useState(null) function createWorkerAndFetchTransactions() { return new Promise((resolve, reject) => { @@ -386,9 +388,10 @@ export default function Transactions() { case "swapTransaction": console.log('swap transaction worker finished', event.data) setSwapLoading(false) - setSwapAConsumed(false) - setSwapBConsumed(false) - setSwappedTransaction(event.data.swapResult as SwapTransactionResult) + const swapResult = event.data.swapResult as SwapTransactionResult + setSwappedTransaction(swapResult) + setSwapANotes(swapResult.expectedPartialNoteIds) + setSwapBNotes(swapResult.expectedOutputNoteIds) workerRef.current?.postMessage({ type: "fetchTransactions" }) break; case "consumeTransaction": @@ -397,17 +400,13 @@ export default function Transactions() { if (event.data.consumeType == "mint") setMintedTransacton(null) if (event.data.consumeType == "send") setSentTransaction(null) if (event.data.consumeType == "swapA") { - console.log("swapA consumed") - setSwapAConsumed(true) setSwapAConsumeLoading(false) + setSwapANotes(null) } if (event.data.consumeType == "swapB") { - console.log("swapB consumed") - setSwapBConsumed(true) setSwapBConsumeLoading(false) + setSwapBNotes(null) } - if (event.data.consumeType == "swapA" && swapBConsumed) setSwappedTransaction(null) - if (event.data.consumeType == "swapB" && swapAConsumed) setSwappedTransaction(null) workerRef.current?.postMessage({ type: "fetchTransactions" }) break; default: @@ -457,6 +456,8 @@ export default function Transactions() { swapLoading={swapLoading} setSwapLoading={setSwapLoading} swappedTransaction={swappedTransaction} + swapANotes={swapANotes} + swapBNotes={swapBNotes} consumeALoading={swapAConsumeLoading} setConsumeALoading={setSwapAConsumeLoading} consumeBLoading={swapBConsumeLoading} diff --git a/website/src/workers/accounts.ts b/website/src/workers/accounts.ts index a69aef012..0eefb3265 100644 --- a/website/src/workers/accounts.ts +++ b/website/src/workers/accounts.ts @@ -1,3 +1,4 @@ +import { JSSerializedAccount } from "@/app/accounts/[accountId]/page"; import { WebClient } from "@demox-labs/miden-sdk"; console.log('Worker is setting up...'); @@ -56,6 +57,13 @@ addEventListener('message', async (event) => { postMessage({ type: "fetchTransactions", transactions: transactions }); break; + case "getAccount": + console.log('getting account', params) + const account = await webClient.get_account(params.accountId); + console.log('account fetched', account); + postMessage({ type: "getAccount", account: new JSSerializedAccount(account) }); + break; + case "importNote": console.log('importing note', params) break; @@ -148,7 +156,7 @@ addEventListener('message', async (event) => { default: console.log('invalid message:', event.data); - postMessage({}); + postMessage({ type: 'invalid' }); break; } }) \ No newline at end of file diff --git a/website/yarn.lock b/website/yarn.lock index 79d743517..0ca4d0e31 100644 --- a/website/yarn.lock +++ b/website/yarn.lock @@ -7,7 +7,7 @@ resolved "https://registry.yarnpkg.com/@alloc/quick-lru/-/quick-lru-5.2.0.tgz#7bf68b20c0a350f936915fcae06f58e32007ce30" integrity sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw== -"@babel/runtime@^7.1.2", "@babel/runtime@^7.23.2": +"@babel/runtime@^7.1.2": version "7.24.7" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.7.tgz#f4f0d5530e8dbdf59b3451b9b3e594b6ba082e12" integrity sha512-UwgBRMjJP+xv857DCngvqXI3Iq6J4v0wXmwc6sapg+zyhbwmQX67LUEFrkK5tbyJ30jGuG3ZvWpBiB9LCy1kWw== @@ -25,9 +25,9 @@ eslint-visitor-keys "^3.3.0" "@eslint-community/regexpp@^4.6.1": - version "4.10.1" - resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.10.1.tgz#361461e5cb3845d874e61731c11cfedd664d83a0" - integrity sha512-Zm2NGpWELsQAD1xsJzGQpYfvICSsFkEpU0jxBjfdC6uNEWXcHnfs9hScFWtXVDVl+rBQJGrl4g1vcKIejpH9dA== + version "4.11.0" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.11.0.tgz#b0ffd0312b4a3fd2d6f77237e7248a5ad3a680ae" + integrity sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A== "@eslint/eslintrc@^2.1.4": version "2.1.4" @@ -112,10 +112,10 @@ "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" -"@next/env@14.2.3": - version "14.2.3" - resolved "https://registry.yarnpkg.com/@next/env/-/env-14.2.3.tgz#d6def29d1c763c0afb397343a15a82e7d92353a0" - integrity sha512-W7fd7IbkfmeeY2gXrzJYDx8D2lWKbVoTIj1o1ScPHNzvp30s1AuoEFSdr39bC5sjxJaxTtq3OTCZboNp0lNWHA== +"@next/env@14.2.4": + version "14.2.4" + resolved "https://registry.yarnpkg.com/@next/env/-/env-14.2.4.tgz#5546813dc4f809884a37d257b254a5ce1b0248d7" + integrity sha512-3EtkY5VDkuV2+lNmKlbkibIJxcO4oIHEhBWne6PaAp+76J9KoSsGvNikp6ivzAT8dhhBMYrm6op2pS1ApG0Hzg== "@next/eslint-plugin-next@14.1.4": version "14.1.4" @@ -124,50 +124,50 @@ dependencies: glob "10.3.10" -"@next/swc-darwin-arm64@14.2.3": - version "14.2.3" - resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.3.tgz#db1a05eb88c0224089b815ad10ac128ec79c2cdb" - integrity sha512-3pEYo/RaGqPP0YzwnlmPN2puaF2WMLM3apt5jLW2fFdXD9+pqcoTzRk+iZsf8ta7+quAe4Q6Ms0nR0SFGFdS1A== - -"@next/swc-darwin-x64@14.2.3": - version "14.2.3" - resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.3.tgz#a3f8af05b5f9a52ac3082e66ac29e125ab1d7b9c" - integrity sha512-6adp7waE6P1TYFSXpY366xwsOnEXM+y1kgRpjSRVI2CBDOcbRjsJ67Z6EgKIqWIue52d2q/Mx8g9MszARj8IEA== - -"@next/swc-linux-arm64-gnu@14.2.3": - version "14.2.3" - resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.3.tgz#4e63f43879285b52554bfd39e6e0cc78a9b27bbf" - integrity sha512-cuzCE/1G0ZSnTAHJPUT1rPgQx1w5tzSX7POXSLaS7w2nIUJUD+e25QoXD/hMfxbsT9rslEXugWypJMILBj/QsA== - -"@next/swc-linux-arm64-musl@14.2.3": - version "14.2.3" - resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.3.tgz#ebdaed26214448b1e6f2c3e8b3cd29bfba387990" - integrity sha512-0D4/oMM2Y9Ta3nGuCcQN8jjJjmDPYpHX9OJzqk42NZGJocU2MqhBq5tWkJrUQOQY9N+In9xOdymzapM09GeiZw== - -"@next/swc-linux-x64-gnu@14.2.3": - version "14.2.3" - resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.3.tgz#19e3bcc137c3b582a1ab867106817e5c90a20593" - integrity sha512-ENPiNnBNDInBLyUU5ii8PMQh+4XLr4pG51tOp6aJ9xqFQ2iRI6IH0Ds2yJkAzNV1CfyagcyzPfROMViS2wOZ9w== - -"@next/swc-linux-x64-musl@14.2.3": - version "14.2.3" - resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.3.tgz#794a539b98e064169cf0ff7741b2a4fb16adec7d" - integrity sha512-BTAbq0LnCbF5MtoM7I/9UeUu/8ZBY0i8SFjUMCbPDOLv+un67e2JgyN4pmgfXBwy/I+RHu8q+k+MCkDN6P9ViQ== - -"@next/swc-win32-arm64-msvc@14.2.3": - version "14.2.3" - resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.3.tgz#eda9fa0fbf1ff9113e87ac2668ee67ce9e5add5a" - integrity sha512-AEHIw/dhAMLNFJFJIJIyOFDzrzI5bAjI9J26gbO5xhAKHYTZ9Or04BesFPXiAYXDNdrwTP2dQceYA4dL1geu8A== - -"@next/swc-win32-ia32-msvc@14.2.3": - version "14.2.3" - resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.3.tgz#7c1190e3f640ab16580c6bdbd7d0e766b9920457" - integrity sha512-vga40n1q6aYb0CLrM+eEmisfKCR45ixQYXuBXxOOmmoV8sYST9k7E3US32FsY+CkkF7NtzdcebiFT4CHuMSyZw== - -"@next/swc-win32-x64-msvc@14.2.3": - version "14.2.3" - resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.3.tgz#2be4e39ee25bfbd85be78eea17c0e7751dc4323c" - integrity sha512-Q1/zm43RWynxrO7lW4ehciQVj+5ePBhOK+/K2P7pLFX3JaJ/IZVC69SHidrmZSOkqz7ECIOhhy7XhAFG4JYyHA== +"@next/swc-darwin-arm64@14.2.4": + version "14.2.4" + resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.4.tgz#da9f04c34a3d5f0b8401ed745768420e4a604036" + integrity sha512-AH3mO4JlFUqsYcwFUHb1wAKlebHU/Hv2u2kb1pAuRanDZ7pD/A/KPD98RHZmwsJpdHQwfEc/06mgpSzwrJYnNg== + +"@next/swc-darwin-x64@14.2.4": + version "14.2.4" + resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.4.tgz#46dedb29ec5503bf171a72a3ecb8aac6e738e9d6" + integrity sha512-QVadW73sWIO6E2VroyUjuAxhWLZWEpiFqHdZdoQ/AMpN9YWGuHV8t2rChr0ahy+irKX5mlDU7OY68k3n4tAZTg== + +"@next/swc-linux-arm64-gnu@14.2.4": + version "14.2.4" + resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.4.tgz#c9697ab9eb422bd1d7ffd0eb0779cc2aefa9d4a1" + integrity sha512-KT6GUrb3oyCfcfJ+WliXuJnD6pCpZiosx2X3k66HLR+DMoilRb76LpWPGb4tZprawTtcnyrv75ElD6VncVamUQ== + +"@next/swc-linux-arm64-musl@14.2.4": + version "14.2.4" + resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.4.tgz#cbbceb2008571c743b5a310a488d2e166d200a75" + integrity sha512-Alv8/XGSs/ytwQcbCHwze1HmiIkIVhDHYLjczSVrf0Wi2MvKn/blt7+S6FJitj3yTlMwMxII1gIJ9WepI4aZ/A== + +"@next/swc-linux-x64-gnu@14.2.4": + version "14.2.4" + resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.4.tgz#d79184223f857bacffb92f643cb2943a43632568" + integrity sha512-ze0ShQDBPCqxLImzw4sCdfnB3lRmN3qGMB2GWDRlq5Wqy4G36pxtNOo2usu/Nm9+V2Rh/QQnrRc2l94kYFXO6Q== + +"@next/swc-linux-x64-musl@14.2.4": + version "14.2.4" + resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.4.tgz#6b6c3e5ac02ca5e63394d280ec8ee607491902df" + integrity sha512-8dwC0UJoc6fC7PX70csdaznVMNr16hQrTDAMPvLPloazlcaWfdPogq+UpZX6Drqb1OBlwowz8iG7WR0Tzk/diQ== + +"@next/swc-win32-arm64-msvc@14.2.4": + version "14.2.4" + resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.4.tgz#dbad3906e870dba84c5883d9d4c4838472e0697f" + integrity sha512-jxyg67NbEWkDyvM+O8UDbPAyYRZqGLQDTPwvrBBeOSyVWW/jFQkQKQ70JDqDSYg1ZDdl+E3nkbFbq8xM8E9x8A== + +"@next/swc-win32-ia32-msvc@14.2.4": + version "14.2.4" + resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.4.tgz#6074529b91ba49132922ce89a2e16d25d2ec235d" + integrity sha512-twrmN753hjXRdcrZmZttb/m5xaCBFa48Dt3FbeEItpJArxriYDunWxJn+QFXdJ3hPkm4u7CKxncVvnmgQMY1ag== + +"@next/swc-win32-x64-msvc@14.2.4": + version "14.2.4" + resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.4.tgz#e65a1c6539a671f97bb86d5183d6e3a1733c29c7" + integrity sha512-tkLrjBzqFTP8DVrAAQmZelEahfR9OxWpFR++vAI9FBhCiIxtwHwBHC23SBHCTURBtwB4kc/x44imVOnkKGNVGg== "@nodelib/fs.scandir@2.1.5": version "2.1.5" @@ -241,9 +241,9 @@ integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== "@types/node@^20": - version "20.14.2" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.14.2.tgz#a5f4d2bcb4b6a87bffcaa717718c5a0f208f4a18" - integrity sha512-xyu6WAMVwv6AKFLB+e/7ySZVr/0zLCzOa7rSpq6jNwpqOrUbcACDWC+53d4n2QHOnDou0fbIsg8wZu/sxrnI4Q== + version "20.14.9" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.14.9.tgz#12e8e765ab27f8c421a1820c99f5f313a933b420" + integrity sha512-06OCtnTXtWOZBJlRApleWndH4JsRVs1pDCc8dLSQp+7PpUpX3ePdHyeNSFTeSe7FtKyQkrlPvHwJOW3SLd8Oyg== dependencies: undici-types "~5.26.4" @@ -329,9 +329,9 @@ acorn-jsx@^5.3.2: integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== acorn@^8.9.0: - version "8.11.3" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a" - integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== + version "8.12.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.12.1.tgz#71616bdccbe25e27a54439e0046e89ca76df2248" + integrity sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg== ajv@^6.12.4: version "6.12.6" @@ -388,14 +388,14 @@ argparse@^2.0.1: resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== -aria-query@^5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.3.0.tgz#650c569e41ad90b51b3d7df5e5eed1c7549c103e" - integrity sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A== +aria-query@~5.1.3: + version "5.1.3" + resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.1.3.tgz#19db27cd101152773631396f7a95a3b58c22c35e" + integrity sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ== dependencies: - dequal "^2.0.3" + deep-equal "^2.0.5" -array-buffer-byte-length@^1.0.1: +array-buffer-byte-length@^1.0.0, array-buffer-byte-length@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz#1e5583ec16763540a27ae52eed99ff899223568f" integrity sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg== @@ -474,7 +474,7 @@ array.prototype.toreversed@^1.1.2: es-abstract "^1.22.1" es-shim-unscopables "^1.0.0" -array.prototype.tosorted@^1.1.3: +array.prototype.tosorted@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz#fe954678ff53034e717ea3352a03f0b0b86f7ffc" integrity sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA== @@ -523,17 +523,17 @@ available-typed-arrays@^1.0.7: dependencies: possible-typed-array-names "^1.0.0" -axe-core@=4.7.0: - version "4.7.0" - resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.7.0.tgz#34ba5a48a8b564f67e103f0aa5768d76e15bbbbf" - integrity sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ== +axe-core@^4.9.1: + version "4.9.1" + resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.9.1.tgz#fcd0f4496dad09e0c899b44f6c4bb7848da912ae" + integrity sha512-QbUdXJVTpvUTHU7871ppZkdOLBeGUKBQWHkHrvN2V9IQWGMt61zf3B45BtzjxEJzYuj0JBjBZP/hmYS/R9pmAw== -axobject-query@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-3.2.1.tgz#39c378a6e3b06ca679f29138151e45b2b32da62a" - integrity sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg== +axobject-query@~3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-3.1.1.tgz#3b6e5c6d4e43ca7ba51c5babf99d22a9c68485e1" + integrity sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg== dependencies: - dequal "^2.0.3" + deep-equal "^2.0.5" balanced-match@^1.0.0: version "1.0.2" @@ -568,14 +568,14 @@ braces@^3.0.3, braces@~3.0.2: fill-range "^7.1.1" browserslist@^4.23.0: - version "4.23.0" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.0.tgz#8f3acc2bbe73af7213399430890f86c63a5674ab" - integrity sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ== + version "4.23.1" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.1.tgz#ce4af0534b3d37db5c1a4ca98b9080f985041e96" + integrity sha512-TUfofFo/KsK/bWZ9TWQ5O26tsWW4Uhmt8IYklbnUa70udB6P2wA7w7o4PY4muaEPBQaAX+CEnmmIA41NVHtPVw== dependencies: - caniuse-lite "^1.0.30001587" - electron-to-chromium "^1.4.668" + caniuse-lite "^1.0.30001629" + electron-to-chromium "^1.4.796" node-releases "^2.0.14" - update-browserslist-db "^1.0.13" + update-browserslist-db "^1.0.16" busboy@1.6.0: version "1.6.0" @@ -605,10 +605,10 @@ camelcase-css@^2.0.1: resolved "https://registry.yarnpkg.com/camelcase-css/-/camelcase-css-2.0.1.tgz#ee978f6947914cc30c6b44741b6ed1df7f043fd5" integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== -caniuse-lite@^1.0.30001579, caniuse-lite@^1.0.30001587, caniuse-lite@^1.0.30001599: - version "1.0.30001628" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001628.tgz#90b6cd85ddc2e9f831de0225f4ca5a130c8d8222" - integrity sha512-S3BnR4Kh26TBxbi5t5kpbcUlLJb9lhtDXISDPwOfI+JoC+ik0QksvkZtUVyikw3hjnkgkMPSJ8oIM9yMm9vflA== +caniuse-lite@^1.0.30001579, caniuse-lite@^1.0.30001599, caniuse-lite@^1.0.30001629: + version "1.0.30001640" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001640.tgz#32c467d4bf1f1a0faa63fc793c2ba81169e7652f" + integrity sha512-lA4VMpW0PSUrFnkmVuEKBUovSWKhj7puyCg8StBChgu298N1AtuF1sKWEvfDuimSEDbhlb/KqPKC3fs1HbuQUA== chalk@^4.0.0: version "4.1.2" @@ -752,6 +752,30 @@ debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: dependencies: ms "2.1.2" +deep-equal@^2.0.5: + version "2.2.3" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-2.2.3.tgz#af89dafb23a396c7da3e862abc0be27cf51d56e1" + integrity sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA== + dependencies: + array-buffer-byte-length "^1.0.0" + call-bind "^1.0.5" + es-get-iterator "^1.1.3" + get-intrinsic "^1.2.2" + is-arguments "^1.1.1" + is-array-buffer "^3.0.2" + is-date-object "^1.0.5" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.2" + isarray "^2.0.5" + object-is "^1.1.5" + object-keys "^1.1.1" + object.assign "^4.1.4" + regexp.prototype.flags "^1.5.1" + side-channel "^1.0.4" + which-boxed-primitive "^1.0.2" + which-collection "^1.0.1" + which-typed-array "^1.1.13" + deep-is@^0.1.3: version "0.1.4" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" @@ -766,7 +790,7 @@ define-data-property@^1.0.1, define-data-property@^1.1.4: es-errors "^1.3.0" gopd "^1.0.1" -define-properties@^1.2.0, define-properties@^1.2.1: +define-properties@^1.1.3, define-properties@^1.2.0, define-properties@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== @@ -775,11 +799,6 @@ define-properties@^1.2.0, define-properties@^1.2.1: has-property-descriptors "^1.0.0" object-keys "^1.1.1" -dequal@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" - integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== - dexie-react-hooks@^1.1.7: version "1.1.7" resolved "https://registry.yarnpkg.com/dexie-react-hooks/-/dexie-react-hooks-1.1.7.tgz#75bd92a609a7c3dc3643e2fd21e7db5df6df923b" @@ -826,10 +845,10 @@ eastasianwidth@^0.2.0: resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== -electron-to-chromium@^1.4.668: - version "1.4.790" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.790.tgz#2a3a5509593745c5d65d8acd66b308f2a25da041" - integrity sha512-eVGeQxpaBYbomDBa/Mehrs28MdvCXfJmEFzaMFsv8jH/MJDLIylJN81eTJ5kvx7B7p18OiPK0BkC06lydEy63A== +electron-to-chromium@^1.4.796: + version "1.4.816" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.816.tgz#3624649d1e7fde5cdbadf59d31a524245d8ee85f" + integrity sha512-EKH5X5oqC6hLmiS7/vYtZHZFTNdhsYG5NVPRN6Yn0kQHNBlT59+xSM8HBy66P5fxWpKgZbPqb+diC64ng295Jw== emoji-regex@^8.0.0: version "8.0.0" @@ -856,7 +875,7 @@ error-stack-parser@^2.0.6: dependencies: stackframe "^1.3.4" -es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23.1, es-abstract@^1.23.2, es-abstract@^1.23.3: +es-abstract@^1.17.5, es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23.1, es-abstract@^1.23.2, es-abstract@^1.23.3: version "1.23.3" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.23.3.tgz#8f0c5a35cd215312573c5a27c87dfd6c881a0aa0" integrity sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A== @@ -920,7 +939,22 @@ es-errors@^1.2.1, es-errors@^1.3.0: resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== -es-iterator-helpers@^1.0.15, es-iterator-helpers@^1.0.19: +es-get-iterator@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/es-get-iterator/-/es-get-iterator-1.1.3.tgz#3ef87523c5d464d41084b2c3c9c214f1199763d6" + integrity sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.3" + has-symbols "^1.0.3" + is-arguments "^1.1.1" + is-map "^2.0.2" + is-set "^2.0.2" + is-string "^1.0.7" + isarray "^2.0.5" + stop-iteration-iterator "^1.0.0" + +es-iterator-helpers@^1.0.19: version "1.0.19" resolved "https://registry.yarnpkg.com/es-iterator-helpers/-/es-iterator-helpers-1.0.19.tgz#117003d0e5fec237b4b5c08aded722e0c6d50ca8" integrity sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw== @@ -1050,26 +1084,26 @@ eslint-plugin-import@^2.28.1: tsconfig-paths "^3.15.0" eslint-plugin-jsx-a11y@^6.7.1: - version "6.8.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.8.0.tgz#2fa9c701d44fcd722b7c771ec322432857fcbad2" - integrity sha512-Hdh937BS3KdwwbBaKd5+PLCOmYY6U4f2h9Z2ktwtNKvIdIEu137rjYbcb9ApSbVJfWxANNuiKTD/9tOKjK9qOA== + version "6.9.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.9.0.tgz#67ab8ff460d4d3d6a0b4a570e9c1670a0a8245c8" + integrity sha512-nOFOCaJG2pYqORjK19lqPqxMO/JpvdCZdPtNdxY3kvom3jTvkAbOvQvD8wuD0G8BYR0IGAGYDlzqWJOh/ybn2g== dependencies: - "@babel/runtime" "^7.23.2" - aria-query "^5.3.0" - array-includes "^3.1.7" + aria-query "~5.1.3" + array-includes "^3.1.8" array.prototype.flatmap "^1.3.2" ast-types-flow "^0.0.8" - axe-core "=4.7.0" - axobject-query "^3.2.1" + axe-core "^4.9.1" + axobject-query "~3.1.1" damerau-levenshtein "^1.0.8" emoji-regex "^9.2.2" - es-iterator-helpers "^1.0.15" - hasown "^2.0.0" + es-iterator-helpers "^1.0.19" + hasown "^2.0.2" jsx-ast-utils "^3.3.5" language-tags "^1.0.9" minimatch "^3.1.2" - object.entries "^1.1.7" - object.fromentries "^2.0.7" + object.fromentries "^2.0.8" + safe-regex-test "^1.0.3" + string.prototype.includes "^2.0.0" "eslint-plugin-react-hooks@^4.5.0 || 5.0.0-canary-7118f5dd7-20230705": version "4.6.2" @@ -1077,15 +1111,15 @@ eslint-plugin-jsx-a11y@^6.7.1: integrity sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ== eslint-plugin-react@^7.33.2: - version "7.34.2" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.34.2.tgz#2780a1a35a51aca379d86d29b9a72adc6bfe6b66" - integrity sha512-2HCmrU+/JNigDN6tg55cRDKCQWicYAPB38JGSFDQt95jDm8rrvSUo7YPkOIm5l6ts1j1zCvysNcasvfTMQzUOw== + version "7.34.3" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.34.3.tgz#9965f27bd1250a787b5d4cfcc765e5a5d58dcb7b" + integrity sha512-aoW4MV891jkUulwDApQbPYTVZmeuSyFrudpbTAQuj5Fv8VL+o6df2xIGpw8B0hPjAaih1/Fb0om9grCdyFYemA== dependencies: array-includes "^3.1.8" array.prototype.findlast "^1.2.5" array.prototype.flatmap "^1.3.2" array.prototype.toreversed "^1.1.2" - array.prototype.tosorted "^1.1.3" + array.prototype.tosorted "^1.1.4" doctrine "^2.1.0" es-iterator-helpers "^1.0.19" estraverse "^5.3.0" @@ -1282,9 +1316,9 @@ for-each@^0.3.3: is-callable "^1.1.3" foreground-child@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.1.1.tgz#1d173e776d75d2772fed08efe4a0de1ea1b12d0d" - integrity sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg== + version "3.2.1" + resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.2.1.tgz#767004ccf3a5b30df39bed90718bab43fe0a59f7" + integrity sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA== dependencies: cross-spawn "^7.0.0" signal-exit "^4.0.1" @@ -1295,9 +1329,9 @@ fraction.js@^4.3.7: integrity sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew== framer-motion@^11.2.0: - version "11.2.10" - resolved "https://registry.yarnpkg.com/framer-motion/-/framer-motion-11.2.10.tgz#c8671e33e8f8d4abbd95efd20d3b8a888f457ed7" - integrity sha512-/gr3PLZUVFCc86a9MqCUboVrALscrdluzTb3yew+2/qKBU8CX6nzs918/SRBRCqaPbx0TZP10CB6yFgK2C5cYQ== + version "11.2.12" + resolved "https://registry.yarnpkg.com/framer-motion/-/framer-motion-11.2.12.tgz#ca5c49f8a1c70163cbadabcbd318acdcfea569fb" + integrity sha512-lCjkV4nA9rWOy2bhR4RZzkp2xpB++kFmUZ6D44V9VQaxk+JDmbDd5lq+u58DjJIIllE8AZEXp9OG/TyDN4FB/w== dependencies: tslib "^2.4.0" @@ -1331,7 +1365,7 @@ functions-have-names@^1.2.3: resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== -get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4: +get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.2, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== @@ -1384,14 +1418,15 @@ glob@10.3.10: path-scurry "^1.10.1" glob@^10.3.10: - version "10.4.1" - resolved "https://registry.yarnpkg.com/glob/-/glob-10.4.1.tgz#0cfb01ab6a6b438177bfe6a58e2576f6efe909c2" - integrity sha512-2jelhlq3E4ho74ZyVLN03oKdAZVUa6UDZzFLVH1H7dnoax+y9qyaq8zBkfDIggjniU19z0wU18y16jMB2eyVIw== + version "10.4.2" + resolved "https://registry.yarnpkg.com/glob/-/glob-10.4.2.tgz#bed6b95dade5c1f80b4434daced233aee76160e5" + integrity sha512-GwMlUF6PkPo3Gk21UxkCohOv0PLcIXVtKyLlpEI28R/cO/4eNOdmLk3CMW1wROV/WR/EsZOWAfBbBOqYvs88/w== dependencies: foreground-child "^3.1.0" jackspeak "^3.1.2" minimatch "^9.0.4" minipass "^7.1.2" + package-json-from-dist "^1.0.0" path-scurry "^1.11.1" glob@^7.1.3: @@ -1492,9 +1527,9 @@ hasown@^2.0.0, hasown@^2.0.1, hasown@^2.0.2: function-bind "^1.1.2" hyphenate-style-name@^1.0.3: - version "1.0.5" - resolved "https://registry.yarnpkg.com/hyphenate-style-name/-/hyphenate-style-name-1.0.5.tgz#70b68605ee601b7142362239a0236159a8b2dc33" - integrity sha512-fedL7PRwmeVkgyhu9hLeTBaI6wcGk7JGJswdaRsa5aUbkXI1kr1xZwTPBtaYPpwf56878iDek6VbVnuWMebJmw== + version "1.1.0" + resolved "https://registry.yarnpkg.com/hyphenate-style-name/-/hyphenate-style-name-1.1.0.tgz#1797bf50369588b47b72ca6d5e65374607cf4436" + integrity sha512-WDC/ui2VVRrz3jOVi+XtjqkDjiVjTtFaAGiW37k6b+ohyQ5wYDOGkvCZa8+H0nx3gyvv0+BST9xuOgIyGQ00gw== ignore@^5.2.0: version "5.3.1" @@ -1535,7 +1570,7 @@ inline-style-prefixer@^7.0.0: css-in-js-utils "^3.1.0" fast-loops "^1.1.3" -internal-slot@^1.0.7: +internal-slot@^1.0.4, internal-slot@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.7.tgz#c06dcca3ed874249881007b0a5523b172a190802" integrity sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g== @@ -1544,7 +1579,15 @@ internal-slot@^1.0.7: hasown "^2.0.0" side-channel "^1.0.4" -is-array-buffer@^3.0.4: +is-arguments@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" + integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-array-buffer@^3.0.2, is-array-buffer@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.4.tgz#7a1f92b3d61edd2bc65d24f130530ea93d7fae98" integrity sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw== @@ -1587,11 +1630,11 @@ is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== is-core-module@^2.11.0, is-core-module@^2.13.0, is-core-module@^2.13.1: - version "2.13.1" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384" - integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw== + version "2.14.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.14.0.tgz#43b8ef9f46a6a08888db67b1ffd4ec9e3dfd59d1" + integrity sha512-a5dFJih5ZLYlRtDc0dZWP7RiKr6xIKzmn/oAYCDvdLThadVgyJwlaoQPmRtMSpz+rk0OGAgIu+TcM9HUF0fk1A== dependencies: - hasown "^2.0.0" + hasown "^2.0.2" is-data-view@^1.0.1: version "1.0.1" @@ -1638,7 +1681,7 @@ is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: dependencies: is-extglob "^2.1.1" -is-map@^2.0.3: +is-map@^2.0.2, is-map@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.3.tgz#ede96b7fe1e270b3c4465e3a465658764926d62e" integrity sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw== @@ -1673,7 +1716,7 @@ is-regex@^1.1.4: call-bind "^1.0.2" has-tostringtag "^1.0.0" -is-set@^2.0.3: +is-set@^2.0.2, is-set@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.3.tgz#8ab209ea424608141372ded6e0cb200ef1d9d01d" integrity sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg== @@ -1766,14 +1809,14 @@ jackspeak@^3.1.2: "@pkgjs/parseargs" "^0.11.0" jiti@^1.21.0: - version "1.21.3" - resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.21.3.tgz#b2adb07489d7629b344d59082bbedb8c21c5f755" - integrity sha512-uy2bNX5zQ+tESe+TiC7ilGRz8AtRGmnJH55NC5S0nSUjvvvM2hJHmefHErugGXN4pNv4Qx7vLsnNw9qJ9mtIsw== + version "1.21.6" + resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.21.6.tgz#6c7f7398dd4b3142767f9a168af2f317a428d268" + integrity sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w== jotai@^2.8.0: - version "2.8.3" - resolved "https://registry.yarnpkg.com/jotai/-/jotai-2.8.3.tgz#21b50c89c9ee2d24e694158b925bade1f38641d7" - integrity sha512-pR4plVvdbzB6zyt7VLLHPMAkcRSKhRIvZKd+qkifQLa3CEziEo1uwZjePj4acTmQrboiISBlYSdCz3gWcr1Nkg== + version "2.8.4" + resolved "https://registry.yarnpkg.com/jotai/-/jotai-2.8.4.tgz#ea82b013d640016100e360d19d565862816c96d0" + integrity sha512-f6jwjhBJcDtpeauT2xH01gnqadKEySwwt1qNBLvAXcnojkmb76EdqRt05Ym8IamfHGAQz2qMKAwftnyjeSoHAA== js-cookie@^2.2.1: version "2.2.1" @@ -1857,9 +1900,9 @@ lilconfig@^2.1.0: integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ== lilconfig@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-3.1.1.tgz#9d8a246fa753106cfc205fd2d77042faca56e5e3" - integrity sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ== + version "3.1.2" + resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-3.1.2.tgz#e4a7c3cb549e3a606c8dcc32e5ae1005e62c05cb" + integrity sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow== lines-and-columns@^1.1.6: version "1.2.4" @@ -1896,9 +1939,9 @@ loose-envify@^1.1.0, loose-envify@^1.4.0: js-tokens "^3.0.0 || ^4.0.0" lru-cache@^10.2.0: - version "10.2.2" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.2.2.tgz#48206bc114c1252940c41b25b41af5b545aca878" - integrity sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ== + version "10.3.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.3.0.tgz#4a4aaf10c84658ab70f79a85a9a3f1e1fb11196b" + integrity sha512-CQl19J/g+Hbjbv4Y3mFNNXFEL/5t/KCg8POCuUqd4rMKjGG+j1ybER83hxV58zL+dFI1PTkt3GNFSHRt+d8qEQ== mdn-data@2.0.14: version "2.0.14" @@ -1938,9 +1981,9 @@ minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: brace-expansion "^1.1.7" minimatch@^9.0.1, minimatch@^9.0.4: - version "9.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.4.tgz#8e49c731d1749cbec05050ee5145147b32496a51" - integrity sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw== + version "9.0.5" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5" + integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== dependencies: brace-expansion "^2.0.1" @@ -2003,11 +2046,11 @@ next-themes@^0.3.0: integrity sha512-/QHIrsYpd6Kfk7xakK4svpDI5mmXP0gfvCoJdGpZQ2TOrQZmsW0QxjaiLn8wbIKjtm4BTSqLoix4lxYYOnLJ/w== next@^14.2.3: - version "14.2.3" - resolved "https://registry.yarnpkg.com/next/-/next-14.2.3.tgz#f117dd5d5f20c307e7b8e4f9c1c97d961008925d" - integrity sha512-dowFkFTR8v79NPJO4QsBUtxv0g9BrS/phluVpMAt2ku7H+cbcBJlopXjkWlwxrk/xGqMemr7JkGPGemPrLLX7A== + version "14.2.4" + resolved "https://registry.yarnpkg.com/next/-/next-14.2.4.tgz#ef66c39c71e2d8ad0a3caa0383c8933f4663e4d1" + integrity sha512-R8/V7vugY+822rsQGQCjoLhMuC9oFj9SOi4Cl4b2wjDrseD0LRZ10W7R6Czo4w9ZznVSshKjuIomsRjvm9EKJQ== dependencies: - "@next/env" "14.2.3" + "@next/env" "14.2.4" "@swc/helpers" "0.5.5" busboy "1.6.0" caniuse-lite "^1.0.30001579" @@ -2015,15 +2058,15 @@ next@^14.2.3: postcss "8.4.31" styled-jsx "5.1.1" optionalDependencies: - "@next/swc-darwin-arm64" "14.2.3" - "@next/swc-darwin-x64" "14.2.3" - "@next/swc-linux-arm64-gnu" "14.2.3" - "@next/swc-linux-arm64-musl" "14.2.3" - "@next/swc-linux-x64-gnu" "14.2.3" - "@next/swc-linux-x64-musl" "14.2.3" - "@next/swc-win32-arm64-msvc" "14.2.3" - "@next/swc-win32-ia32-msvc" "14.2.3" - "@next/swc-win32-x64-msvc" "14.2.3" + "@next/swc-darwin-arm64" "14.2.4" + "@next/swc-darwin-x64" "14.2.4" + "@next/swc-linux-arm64-gnu" "14.2.4" + "@next/swc-linux-arm64-musl" "14.2.4" + "@next/swc-linux-x64-gnu" "14.2.4" + "@next/swc-linux-x64-musl" "14.2.4" + "@next/swc-win32-arm64-msvc" "14.2.4" + "@next/swc-win32-ia32-msvc" "14.2.4" + "@next/swc-win32-x64-msvc" "14.2.4" node-releases@^2.0.14: version "2.0.14" @@ -2051,9 +2094,17 @@ object-hash@^3.0.0: integrity sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw== object-inspect@^1.13.1: - version "1.13.1" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.1.tgz#b96c6109324ccfef6b12216a956ca4dc2ff94bc2" - integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ== + version "1.13.2" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.2.tgz#dea0088467fb991e67af4058147a24824a3043ff" + integrity sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g== + +object-is@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.6.tgz#1a6a53aed2dd8f7e6775ff870bea58545956ab07" + integrity sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" object-keys@^1.1.1: version "1.1.1" @@ -2070,7 +2121,7 @@ object.assign@^4.1.4, object.assign@^4.1.5: has-symbols "^1.0.3" object-keys "^1.1.1" -object.entries@^1.1.7, object.entries@^1.1.8: +object.entries@^1.1.8: version "1.1.8" resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.8.tgz#bffe6f282e01f4d17807204a24f8edd823599c41" integrity sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ== @@ -2141,9 +2192,9 @@ overlayscrollbars-react@^0.5.6: integrity sha512-E5To04bL5brn9GVCZ36SnfGanxa2I2MDkWoa4Cjo5wol7l+diAgi4DBc983V7l2nOk/OLJ6Feg4kySspQEGDBw== overlayscrollbars@^2.8.0: - version "2.8.3" - resolved "https://registry.yarnpkg.com/overlayscrollbars/-/overlayscrollbars-2.8.3.tgz#6d2ac67a142e2186574e05a6b7dfee9976ec23b1" - integrity sha512-7JHA1oWm3Gru3RF5wwaeBdgk4keGtc56HMWEQRQi/RdLdY3pZTUDlSfUk1jyv1yQN12otr828n52rT6VNzYO4w== + version "2.9.2" + resolved "https://registry.yarnpkg.com/overlayscrollbars/-/overlayscrollbars-2.9.2.tgz#056020a3811742b58b754fab6f775d49bd109be9" + integrity sha512-iDT84r39i7oWP72diZN2mbJUsn/taCq568aQaIrc84S87PunBT7qtsVltAF2esk7ORTRjQDnfjVYoqqTzgs8QA== p-limit@^3.0.2: version "3.1.0" @@ -2159,6 +2210,11 @@ p-locate@^5.0.0: dependencies: p-limit "^3.0.2" +package-json-from-dist@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz#e501cd3094b278495eb4258d4c9f6d5ac3019f00" + integrity sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw== + parent-module@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" @@ -2286,12 +2342,12 @@ postcss@8.4.31: source-map-js "^1.0.2" postcss@^8, postcss@^8.4.23: - version "8.4.38" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.38.tgz#b387d533baf2054288e337066d81c6bee9db9e0e" - integrity sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A== + version "8.4.39" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.39.tgz#aa3c94998b61d3a9c259efa51db4b392e1bde0e3" + integrity sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw== dependencies: nanoid "^3.3.7" - picocolors "^1.0.0" + picocolors "^1.0.1" source-map-js "^1.2.0" prelude-ls@^1.2.1: @@ -2395,7 +2451,7 @@ regenerator-runtime@^0.14.0: resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== -regexp.prototype.flags@^1.5.2: +regexp.prototype.flags@^1.5.1, regexp.prototype.flags@^1.5.2: version "1.5.2" resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz#138f644a3350f981a858c44f6bb1a61ff59be334" integrity sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw== @@ -2608,6 +2664,13 @@ stacktrace-js@^2.0.2: stack-generator "^2.0.5" stacktrace-gps "^3.0.4" +stop-iteration-iterator@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz#6a60be0b4ee757d1ed5254858ec66b10c49285e4" + integrity sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ== + dependencies: + internal-slot "^1.0.4" + streamsearch@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764" @@ -2640,6 +2703,14 @@ string-width@^5.0.1, string-width@^5.1.2: emoji-regex "^9.2.2" strip-ansi "^7.0.1" +string.prototype.includes@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/string.prototype.includes/-/string.prototype.includes-2.0.0.tgz#8986d57aee66d5460c144620a6d873778ad7289f" + integrity sha512-E34CkBgyeqNDcrbU76cDjL5JLcVrtSdYq0MEh/B10r17pRP4ciHLwTgnuLV8Ay6cgEMLkcBkFCKyFZ43YldYzg== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.5" + string.prototype.matchall@^4.0.11: version "4.0.11" resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz#1092a72c59268d2abaad76582dccc687c0297e0a" @@ -2915,9 +2986,9 @@ typed-array-length@^1.0.6: possible-typed-array-names "^1.0.0" typescript@^5: - version "5.4.5" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.4.5.tgz#42ccef2c571fdbd0f6718b1d1f5e6e5ef006f611" - integrity sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ== + version "5.5.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.5.3.tgz#e1b0a3c394190838a0b168e771b0ad56a0af0faa" + integrity sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ== unbox-primitive@^1.0.2: version "1.0.2" @@ -2934,10 +3005,10 @@ undici-types@~5.26.4: resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== -update-browserslist-db@^1.0.13: - version "1.0.16" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.16.tgz#f6d489ed90fb2f07d67784eb3f53d7891f736356" - integrity sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ== +update-browserslist-db@^1.0.16: + version "1.1.0" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz#7ca61c0d8650766090728046e416a8cde682859e" + integrity sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ== dependencies: escalade "^3.1.2" picocolors "^1.0.1" @@ -2998,7 +3069,7 @@ which-collection@^1.0.1: is-weakmap "^2.0.2" is-weakset "^2.0.3" -which-typed-array@^1.1.14, which-typed-array@^1.1.15, which-typed-array@^1.1.9: +which-typed-array@^1.1.13, which-typed-array@^1.1.14, which-typed-array@^1.1.15, which-typed-array@^1.1.9: version "1.1.15" resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.15.tgz#264859e9b11a649b388bfaaf4f767df1f779b38d" integrity sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA== @@ -3045,9 +3116,9 @@ wrappy@1: integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== yaml@^2.3.4: - version "2.4.3" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.4.3.tgz#0777516b8c7880bcaa0f426a5410e8d6b0be1f3d" - integrity sha512-sntgmxj8o7DE7g/Qi60cqpLBA3HG3STcDA0kO+WfB05jEKhZMbY7umNm2rBpQvsmZ16/lPXCJGW2672dgOUkrg== + version "2.4.5" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.4.5.tgz#60630b206dd6d84df97003d33fc1ddf6296cca5e" + integrity sha512-aBx2bnqDzVOyNKfsysjA2ms5ZlnjSAW2eG3/L5G/CSujfjLJTJsEw1bGw8kCf04KodQWk1pxlGnZ56CRxiawmg== yocto-queue@^0.1.0: version "0.1.0" From 5d9398525de388658276a0252c01442ddd925c36 Mon Sep 17 00:00:00 2001 From: JohnDonavon Date: Tue, 9 Jul 2024 18:21:23 +0200 Subject: [PATCH 40/42] cleanup --- wasm/src/lib.rs | 35 +--------------- website/src/app/accounts/[accountId]/page.tsx | 42 ++++++++++--------- 2 files changed, 23 insertions(+), 54 deletions(-) diff --git a/wasm/src/lib.rs b/wasm/src/lib.rs index 83084e4a8..88baff2f1 100644 --- a/wasm/src/lib.rs +++ b/wasm/src/lib.rs @@ -6,37 +6,4 @@ use wasm_bindgen::prelude::*; use wasm_bindgen_futures::*; use web_sys::console; use serde_wasm_bindgen::Serializer; -use serde::Serialize; - -#[derive(Serialize)] -struct MyStruct { - large_number: u64, -} - -#[wasm_bindgen] -pub fn serialize_test() -> JsValue { - let my_struct = MyStruct { - large_number: 10426515476281968952, - }; - - // Create a new serializer with the option set - let mut serializer = Serializer::new().serialize_large_number_types_as_bigints(true); - - // Serialize the struct - my_struct.serialize(&serializer).unwrap() -} - -#[wasm_bindgen] -extern "C" { - fn alert(s: &str); -} - -#[wasm_bindgen] -pub fn greet() { - unsafe { alert("Hello world from WASM!") }; -} - -#[wasm_bindgen] -pub fn greet2() { - unsafe { console::log_1(&"Hello from WASM!".into()) }; -} \ No newline at end of file +use serde::Serialize; \ No newline at end of file diff --git a/website/src/app/accounts/[accountId]/page.tsx b/website/src/app/accounts/[accountId]/page.tsx index ecf9edc60..329f3829b 100644 --- a/website/src/app/accounts/[accountId]/page.tsx +++ b/website/src/app/accounts/[accountId]/page.tsx @@ -96,28 +96,30 @@ const AccountDetailsPage = ({ params }: { params: { accountId: string } }) => { return (
    -

    Account Details for account {params.accountId}

    -

    Nonce: {account.nonce}

    -

    Vault root: {account.vault_root}

    -

    Storage root: {account.storage_root}

    -

    Code root: {account.code_root}

    -

    Account Type: {account.account_type}

    -

    Is Faucet?: {account.is_faucet.toString()}

    -

    Is regaular account?: {account.is_regular_account.toString()}

    -

    Is on chain?: {account.is_on_chain.toString()}

    -
    +

    Account Details for account {params.accountId}

    +
    +

    Nonce: {account.nonce}

    +

    Vault root: {account.vault_root}

    +

    Storage root: {account.storage_root}

    +

    Code root: {account.code_root}

    +

    Account Type: {account.account_type}

    +

    Is Faucet?: {account.is_faucet.toString()}

    +

    Is regaular account?: {account.is_regular_account.toString()}

    +

    Is on chain?: {account.is_on_chain.toString()}

    +
    -

    Assets:

    -
    - {account.assets.map((asset, idx) => -
    -

    Asset {idx}

    -

    Asset faucet Id: {asset.faucet_id}

    -

    Asset amount: {asset.amount}

    -

    Asset is fungible: {asset.is_fungible.toString()}

    -
    ) - } +

    Assets:

    +
    + {account.assets.map((asset, idx) => +
    +

    Asset {idx}

    +

    Asset faucet Id: {asset.faucet_id}

    +

    Asset amount: {asset.amount}

    +

    Asset is fungible: {asset.is_fungible.toString()}

    +
    ) + } +
    ); From e3678c6fc896d69f53a724ffb619c99ef880b3f0 Mon Sep 17 00:00:00 2001 From: JohnDonavon Date: Wed, 10 Jul 2024 09:44:39 +0200 Subject: [PATCH 41/42] fix consume send bug --- website/src/app/transactions/page.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/src/app/transactions/page.tsx b/website/src/app/transactions/page.tsx index d0eece28f..ef535956b 100644 --- a/website/src/app/transactions/page.tsx +++ b/website/src/app/transactions/page.tsx @@ -211,7 +211,7 @@ function SendTransaction(props: SendTransactionProps) { setConsumeLoading={props.setConsumeLoading} worker={props.worker} transactionId={props.sentTransaction?.transactionId} - consumeParams={props.sentTransaction ? { targetAccountId: senderId, listOfNotes: props.sentTransaction?.createdNoteIds } : null } + consumeParams={props.sentTransaction ? { targetAccountId: receiverId, listOfNotes: props.sentTransaction?.createdNoteIds } : null } consumeType='send' />
    From 892141789e94855967d8b2e6b5f6ba3bcb8a6d01 Mon Sep 17 00:00:00 2001 From: JohnDonavon Date: Wed, 10 Jul 2024 18:22:36 +0200 Subject: [PATCH 42/42] add polling --- wasm/src/web_client/notes.rs | 16 +++ website/package.json | 1 - website/src/workers/accounts.ts | 13 ++ website/yarn.lock | 218 ++++++++++++++++---------------- 4 files changed, 135 insertions(+), 113 deletions(-) diff --git a/wasm/src/web_client/notes.rs b/wasm/src/web_client/notes.rs index f78d4a0c2..c143dbf3b 100644 --- a/wasm/src/web_client/notes.rs +++ b/wasm/src/web_client/notes.rs @@ -102,4 +102,20 @@ impl WebClient { Err(JsValue::from_str("Client not initialized")) } } + + pub async fn get_output_note_status( + &mut self, + note_id: String + ) -> Result { + if let Some(client) = self.get_mut_inner() { + let note_id: NoteId = Digest::try_from(note_id) + .map_err(|err| format!("Failed to parse output note id: {}", err))? + .into(); + let note: OutputNoteRecord = client.get_output_note(note_id).await.unwrap(); + + serde_wasm_bindgen::to_value(&format!("{:?}", note.status())).map_err(|e| JsValue::from_str(&e.to_string())) + } else { + Err(JsValue::from_str("Client not initialized")) + } + } } \ No newline at end of file diff --git a/website/package.json b/website/package.json index a8a69b0f5..20e4100ca 100644 --- a/website/package.json +++ b/website/package.json @@ -3,7 +3,6 @@ "version": "0.1.0", "private": true, "scripts": { - "build-wasm": "rimraf node_modules/wasm && rimraf .next && rimraf yarn.lock && cd ../wasm && rimraf pkg && wasm-pack build --dev --target web && cd ../website && yarn", "build:workers": "tsc -p tsconfig.worker.json", "watch:workers": "tsc -p tsconfig.worker.json -watch", "dev": "next dev", diff --git a/website/src/workers/accounts.ts b/website/src/workers/accounts.ts index 0eefb3265..756a08a24 100644 --- a/website/src/workers/accounts.ts +++ b/website/src/workers/accounts.ts @@ -6,6 +6,18 @@ const webClient = new WebClient(); await webClient.create_client(); postMessage({ type: "ready" }); +async function pollUntilComitted(webClient: WebClient, outputNoteId: String) { + let status; + while (status !== 'Committed') { + await webClient.sync_state(); + status = await webClient.get_output_note_status(outputNoteId); + console.log('STATUS', status) + if (status !== 'Committed') { + await new Promise(resolve => setTimeout(resolve, 1000)); + } + } +} + addEventListener('message', async (event) => { console.log('worker received message', event.data) const params = event.data.params @@ -142,6 +154,7 @@ addEventListener('message', async (event) => { case "consumeTransaction": console.log('doing a consume transaction', params) await new Promise(resolve => setTimeout(resolve, 2000)); + await pollUntilComitted(webClient, params.noteIds[0]); await webClient.sync_state(); await webClient.fetch_and_cache_account_auth_by_pub_key(params.targetAccountId); const consumeResult = await webClient.new_consume_transaction(params.targetAccountId, params.noteIds); diff --git a/website/yarn.lock b/website/yarn.lock index 0ca4d0e31..631083c95 100644 --- a/website/yarn.lock +++ b/website/yarn.lock @@ -100,9 +100,9 @@ integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== "@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.4.15": - version "1.4.15" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" - integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== + version "1.5.0" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" + integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== "@jridgewell/trace-mapping@^0.3.24": version "0.3.25" @@ -112,10 +112,10 @@ "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" -"@next/env@14.2.4": - version "14.2.4" - resolved "https://registry.yarnpkg.com/@next/env/-/env-14.2.4.tgz#5546813dc4f809884a37d257b254a5ce1b0248d7" - integrity sha512-3EtkY5VDkuV2+lNmKlbkibIJxcO4oIHEhBWne6PaAp+76J9KoSsGvNikp6ivzAT8dhhBMYrm6op2pS1ApG0Hzg== +"@next/env@14.2.5": + version "14.2.5" + resolved "https://registry.yarnpkg.com/@next/env/-/env-14.2.5.tgz#1d9328ab828711d3517d0a1d505acb55e5ef7ad0" + integrity sha512-/zZGkrTOsraVfYjGP8uM0p6r0BDT6xWpkjdVbcz66PJVSpwXX3yNiRycxAuDfBKGWBrZBXRuK/YVlkNgxHGwmA== "@next/eslint-plugin-next@14.1.4": version "14.1.4" @@ -124,50 +124,50 @@ dependencies: glob "10.3.10" -"@next/swc-darwin-arm64@14.2.4": - version "14.2.4" - resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.4.tgz#da9f04c34a3d5f0b8401ed745768420e4a604036" - integrity sha512-AH3mO4JlFUqsYcwFUHb1wAKlebHU/Hv2u2kb1pAuRanDZ7pD/A/KPD98RHZmwsJpdHQwfEc/06mgpSzwrJYnNg== - -"@next/swc-darwin-x64@14.2.4": - version "14.2.4" - resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.4.tgz#46dedb29ec5503bf171a72a3ecb8aac6e738e9d6" - integrity sha512-QVadW73sWIO6E2VroyUjuAxhWLZWEpiFqHdZdoQ/AMpN9YWGuHV8t2rChr0ahy+irKX5mlDU7OY68k3n4tAZTg== - -"@next/swc-linux-arm64-gnu@14.2.4": - version "14.2.4" - resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.4.tgz#c9697ab9eb422bd1d7ffd0eb0779cc2aefa9d4a1" - integrity sha512-KT6GUrb3oyCfcfJ+WliXuJnD6pCpZiosx2X3k66HLR+DMoilRb76LpWPGb4tZprawTtcnyrv75ElD6VncVamUQ== - -"@next/swc-linux-arm64-musl@14.2.4": - version "14.2.4" - resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.4.tgz#cbbceb2008571c743b5a310a488d2e166d200a75" - integrity sha512-Alv8/XGSs/ytwQcbCHwze1HmiIkIVhDHYLjczSVrf0Wi2MvKn/blt7+S6FJitj3yTlMwMxII1gIJ9WepI4aZ/A== - -"@next/swc-linux-x64-gnu@14.2.4": - version "14.2.4" - resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.4.tgz#d79184223f857bacffb92f643cb2943a43632568" - integrity sha512-ze0ShQDBPCqxLImzw4sCdfnB3lRmN3qGMB2GWDRlq5Wqy4G36pxtNOo2usu/Nm9+V2Rh/QQnrRc2l94kYFXO6Q== - -"@next/swc-linux-x64-musl@14.2.4": - version "14.2.4" - resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.4.tgz#6b6c3e5ac02ca5e63394d280ec8ee607491902df" - integrity sha512-8dwC0UJoc6fC7PX70csdaznVMNr16hQrTDAMPvLPloazlcaWfdPogq+UpZX6Drqb1OBlwowz8iG7WR0Tzk/diQ== - -"@next/swc-win32-arm64-msvc@14.2.4": - version "14.2.4" - resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.4.tgz#dbad3906e870dba84c5883d9d4c4838472e0697f" - integrity sha512-jxyg67NbEWkDyvM+O8UDbPAyYRZqGLQDTPwvrBBeOSyVWW/jFQkQKQ70JDqDSYg1ZDdl+E3nkbFbq8xM8E9x8A== - -"@next/swc-win32-ia32-msvc@14.2.4": - version "14.2.4" - resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.4.tgz#6074529b91ba49132922ce89a2e16d25d2ec235d" - integrity sha512-twrmN753hjXRdcrZmZttb/m5xaCBFa48Dt3FbeEItpJArxriYDunWxJn+QFXdJ3hPkm4u7CKxncVvnmgQMY1ag== - -"@next/swc-win32-x64-msvc@14.2.4": - version "14.2.4" - resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.4.tgz#e65a1c6539a671f97bb86d5183d6e3a1733c29c7" - integrity sha512-tkLrjBzqFTP8DVrAAQmZelEahfR9OxWpFR++vAI9FBhCiIxtwHwBHC23SBHCTURBtwB4kc/x44imVOnkKGNVGg== +"@next/swc-darwin-arm64@14.2.5": + version "14.2.5" + resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.5.tgz#d0a160cf78c18731c51cc0bff131c706b3e9bb05" + integrity sha512-/9zVxJ+K9lrzSGli1///ujyRfon/ZneeZ+v4ptpiPoOU+GKZnm8Wj8ELWU1Pm7GHltYRBklmXMTUqM/DqQ99FQ== + +"@next/swc-darwin-x64@14.2.5": + version "14.2.5" + resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.5.tgz#eb832a992407f6e6352eed05a073379f1ce0589c" + integrity sha512-vXHOPCwfDe9qLDuq7U1OYM2wUY+KQ4Ex6ozwsKxp26BlJ6XXbHleOUldenM67JRyBfVjv371oneEvYd3H2gNSA== + +"@next/swc-linux-arm64-gnu@14.2.5": + version "14.2.5" + resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.5.tgz#098fdab57a4664969bc905f5801ef5a89582c689" + integrity sha512-vlhB8wI+lj8q1ExFW8lbWutA4M2ZazQNvMWuEDqZcuJJc78iUnLdPPunBPX8rC4IgT6lIx/adB+Cwrl99MzNaA== + +"@next/swc-linux-arm64-musl@14.2.5": + version "14.2.5" + resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.5.tgz#243a1cc1087fb75481726dd289c7b219fa01f2b5" + integrity sha512-NpDB9NUR2t0hXzJJwQSGu1IAOYybsfeB+LxpGsXrRIb7QOrYmidJz3shzY8cM6+rO4Aojuef0N/PEaX18pi9OA== + +"@next/swc-linux-x64-gnu@14.2.5": + version "14.2.5" + resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.5.tgz#b8a2e436387ee4a52aa9719b718992e0330c4953" + integrity sha512-8XFikMSxWleYNryWIjiCX+gU201YS+erTUidKdyOVYi5qUQo/gRxv/3N1oZFCgqpesN6FPeqGM72Zve+nReVXQ== + +"@next/swc-linux-x64-musl@14.2.5": + version "14.2.5" + resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.5.tgz#cb8a9adad5fb8df86112cfbd363aab5c6d32757b" + integrity sha512-6QLwi7RaYiQDcRDSU/os40r5o06b5ue7Jsk5JgdRBGGp8l37RZEh9JsLSM8QF0YDsgcosSeHjglgqi25+m04IQ== + +"@next/swc-win32-arm64-msvc@14.2.5": + version "14.2.5" + resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.5.tgz#81f996c1c38ea0900d4e7719cc8814be8a835da0" + integrity sha512-1GpG2VhbspO+aYoMOQPQiqc/tG3LzmsdBH0LhnDS3JrtDx2QmzXe0B6mSZZiN3Bq7IOMXxv1nlsjzoS1+9mzZw== + +"@next/swc-win32-ia32-msvc@14.2.5": + version "14.2.5" + resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.5.tgz#f61c74ce823e10b2bc150e648fc192a7056422e0" + integrity sha512-Igh9ZlxwvCDsu6438FXlQTHlRno4gFpJzqPjSIBZooD22tKeI4fE/YMRoHVJHmrQ2P5YL1DoZ0qaOKkbeFWeMg== + +"@next/swc-win32-x64-msvc@14.2.5": + version "14.2.5" + resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.5.tgz#ed199a920efb510cfe941cd75ed38a7be21e756f" + integrity sha512-tEQ7oinq1/CjSG9uSTerca3v4AZ+dFa+4Yu6ihaG8Ud8ddqLQgFGcnwYls13H5X5CPDPZJdYxyeMui6muOLd4g== "@nodelib/fs.scandir@2.1.5": version "2.1.5" @@ -241,9 +241,9 @@ integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== "@types/node@^20": - version "20.14.9" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.14.9.tgz#12e8e765ab27f8c421a1820c99f5f313a933b420" - integrity sha512-06OCtnTXtWOZBJlRApleWndH4JsRVs1pDCc8dLSQp+7PpUpX3ePdHyeNSFTeSe7FtKyQkrlPvHwJOW3SLd8Oyg== + version "20.14.10" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.14.10.tgz#a1a218290f1b6428682e3af044785e5874db469a" + integrity sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ== dependencies: undici-types "~5.26.4" @@ -568,14 +568,14 @@ braces@^3.0.3, braces@~3.0.2: fill-range "^7.1.1" browserslist@^4.23.0: - version "4.23.1" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.1.tgz#ce4af0534b3d37db5c1a4ca98b9080f985041e96" - integrity sha512-TUfofFo/KsK/bWZ9TWQ5O26tsWW4Uhmt8IYklbnUa70udB6P2wA7w7o4PY4muaEPBQaAX+CEnmmIA41NVHtPVw== + version "4.23.2" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.2.tgz#244fe803641f1c19c28c48c4b6ec9736eb3d32ed" + integrity sha512-qkqSyistMYdxAcw+CzbZwlBy8AGmS/eEWs+sEV5TnLRGDOL+C5M2EnH6tlZyg0YoAxGJAFKh61En9BR941GnHA== dependencies: - caniuse-lite "^1.0.30001629" - electron-to-chromium "^1.4.796" + caniuse-lite "^1.0.30001640" + electron-to-chromium "^1.4.820" node-releases "^2.0.14" - update-browserslist-db "^1.0.16" + update-browserslist-db "^1.1.0" busboy@1.6.0: version "1.6.0" @@ -605,10 +605,10 @@ camelcase-css@^2.0.1: resolved "https://registry.yarnpkg.com/camelcase-css/-/camelcase-css-2.0.1.tgz#ee978f6947914cc30c6b44741b6ed1df7f043fd5" integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== -caniuse-lite@^1.0.30001579, caniuse-lite@^1.0.30001599, caniuse-lite@^1.0.30001629: - version "1.0.30001640" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001640.tgz#32c467d4bf1f1a0faa63fc793c2ba81169e7652f" - integrity sha512-lA4VMpW0PSUrFnkmVuEKBUovSWKhj7puyCg8StBChgu298N1AtuF1sKWEvfDuimSEDbhlb/KqPKC3fs1HbuQUA== +caniuse-lite@^1.0.30001579, caniuse-lite@^1.0.30001599, caniuse-lite@^1.0.30001640: + version "1.0.30001641" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001641.tgz#3572862cd18befae3f637f2a1101cc033c6782ac" + integrity sha512-Phv5thgl67bHYo1TtMY/MurjkHhV4EDaCosezRXgZ8jzA/Ub+wjxAvbGvjoFENStinwi5kCyOYV3mi5tOGykwA== chalk@^4.0.0: version "4.1.2" @@ -805,9 +805,9 @@ dexie-react-hooks@^1.1.7: integrity sha512-Lwv5W0Hk+uOW3kGnsU9GZoR1er1B7WQ5DSdonoNG+focTNeJbHW6vi6nBoX534VKI3/uwHebYzSw1fwY6a7mTw== dexie@^4.0.1: - version "4.0.7" - resolved "https://registry.yarnpkg.com/dexie/-/dexie-4.0.7.tgz#c92e5032245fc075de58c636238a82ee3ff9fedb" - integrity sha512-M+Lo6rk4pekIfrc2T0o2tvVJwL6EAAM/B78DNfb8aaxFVoI1f8/rz5KTxuAnApkwqTSuxx7T5t0RKH7qprapGg== + version "4.0.8" + resolved "https://registry.yarnpkg.com/dexie/-/dexie-4.0.8.tgz#21fca70686bdaa1d86fad45b6b19316f6a084a1d" + integrity sha512-1G6cJevS17KMDK847V3OHvK2zei899GwpDiqfEXHP1ASvme6eWJmAp9AU4s1son2TeGkWmC0g3y8ezOBPnalgQ== didyoumean@^1.2.2: version "1.2.2" @@ -845,10 +845,10 @@ eastasianwidth@^0.2.0: resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== -electron-to-chromium@^1.4.796: - version "1.4.816" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.816.tgz#3624649d1e7fde5cdbadf59d31a524245d8ee85f" - integrity sha512-EKH5X5oqC6hLmiS7/vYtZHZFTNdhsYG5NVPRN6Yn0kQHNBlT59+xSM8HBy66P5fxWpKgZbPqb+diC64ng295Jw== +electron-to-chromium@^1.4.820: + version "1.4.823" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.823.tgz#38587f7aa55bed14930f04091dfc65c39a3d8bd7" + integrity sha512-4h+oPeAiGQOHFyUJOqpoEcPj/xxlicxBzOErVeYVMMmAiXUXsGpsFd0QXBMaUUbnD8hhSfLf9uw+MlsoIA7j5w== emoji-regex@^8.0.0: version "8.0.0" @@ -1201,9 +1201,9 @@ espree@^9.6.0, espree@^9.6.1: eslint-visitor-keys "^3.4.1" esquery@^1.4.2: - version "1.5.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" - integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== + version "1.6.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.6.0.tgz#91419234f804d852a82dceec3e16cdc22cf9dae7" + integrity sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg== dependencies: estraverse "^5.1.0" @@ -1250,11 +1250,6 @@ fast-levenshtein@^2.0.6: resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== -fast-loops@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/fast-loops/-/fast-loops-1.1.3.tgz#ce96adb86d07e7bf9b4822ab9c6fac9964981f75" - integrity sha512-8EZzEP0eKkEEVX+drtd9mtuQ+/QrlfW/5MlwcwK5Nds6EkZ/tRzEexkzUY2mIssnAyVLT+TKHuRXmFNNXYUd6g== - fast-shallow-equal@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fast-shallow-equal/-/fast-shallow-equal-1.0.0.tgz#d4dcaf6472440dcefa6f88b98e3251e27f25628b" @@ -1329,9 +1324,9 @@ fraction.js@^4.3.7: integrity sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew== framer-motion@^11.2.0: - version "11.2.12" - resolved "https://registry.yarnpkg.com/framer-motion/-/framer-motion-11.2.12.tgz#ca5c49f8a1c70163cbadabcbd318acdcfea569fb" - integrity sha512-lCjkV4nA9rWOy2bhR4RZzkp2xpB++kFmUZ6D44V9VQaxk+JDmbDd5lq+u58DjJIIllE8AZEXp9OG/TyDN4FB/w== + version "11.3.0" + resolved "https://registry.yarnpkg.com/framer-motion/-/framer-motion-11.3.0.tgz#dd2fe041577c520b2bf1b136b3ed31f866308f54" + integrity sha512-hjYjMUQaWuqilwRr5kC0CunHZFVMtKWHy/IdL/LPRBD0C491DKTvYwQRJ5qRXEAOT+Rth7Vi4XBe4TA4bFOn3A== dependencies: tslib "^2.4.0" @@ -1418,9 +1413,9 @@ glob@10.3.10: path-scurry "^1.10.1" glob@^10.3.10: - version "10.4.2" - resolved "https://registry.yarnpkg.com/glob/-/glob-10.4.2.tgz#bed6b95dade5c1f80b4434daced233aee76160e5" - integrity sha512-GwMlUF6PkPo3Gk21UxkCohOv0PLcIXVtKyLlpEI28R/cO/4eNOdmLk3CMW1wROV/WR/EsZOWAfBbBOqYvs88/w== + version "10.4.5" + resolved "https://registry.yarnpkg.com/glob/-/glob-10.4.5.tgz#f4d9f0b90ffdbab09c9d77f5f29b4262517b0956" + integrity sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg== dependencies: foreground-child "^3.1.0" jackspeak "^3.1.2" @@ -1563,12 +1558,11 @@ inherits@2: integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== inline-style-prefixer@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/inline-style-prefixer/-/inline-style-prefixer-7.0.0.tgz#991d550735d42069f528ac1bcdacd378d1305442" - integrity sha512-I7GEdScunP1dQ6IM2mQWh6v0mOYdYmH3Bp31UecKdrcUgcURTcctSe1IECdUznSHKSmsHtjrT3CwCPI1pyxfUQ== + version "7.0.1" + resolved "https://registry.yarnpkg.com/inline-style-prefixer/-/inline-style-prefixer-7.0.1.tgz#9310f3cfa2c6f3901d1480f373981c02691781e8" + integrity sha512-lhYo5qNTQp3EvSSp3sRvXMbVQTLrvGV6DycRMJ5dm2BLMiJ30wpXKdDdgX+GmJZ5uQMucwRKHamXSst3Sj/Giw== dependencies: css-in-js-utils "^3.1.0" - fast-loops "^1.1.3" internal-slot@^1.0.4, internal-slot@^1.0.7: version "1.0.7" @@ -1800,9 +1794,9 @@ jackspeak@^2.3.5: "@pkgjs/parseargs" "^0.11.0" jackspeak@^3.1.2: - version "3.4.0" - resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-3.4.0.tgz#a75763ff36ad778ede6a156d8ee8b124de445b4a" - integrity sha512-JVYhQnN59LVPFCEcVa2C3CrEKYacvjRfqIQl+h8oi91aLYQVWRYbxjPcv1bUiUy/kLmQaANrYfNMCO3kuEDHfw== + version "3.4.3" + resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-3.4.3.tgz#8833a9d89ab4acde6188942bd1c53b6390ed5a8a" + integrity sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw== dependencies: "@isaacs/cliui" "^8.0.2" optionalDependencies: @@ -1814,9 +1808,9 @@ jiti@^1.21.0: integrity sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w== jotai@^2.8.0: - version "2.8.4" - resolved "https://registry.yarnpkg.com/jotai/-/jotai-2.8.4.tgz#ea82b013d640016100e360d19d565862816c96d0" - integrity sha512-f6jwjhBJcDtpeauT2xH01gnqadKEySwwt1qNBLvAXcnojkmb76EdqRt05Ym8IamfHGAQz2qMKAwftnyjeSoHAA== + version "2.9.0" + resolved "https://registry.yarnpkg.com/jotai/-/jotai-2.9.0.tgz#240f37fb1bb8a8d4c8d178b423575f2da677814f" + integrity sha512-MioTpMvR78IGfJ+W8EwQj3kwTkb+u0reGnTyg3oJZMWK9rK9v8NBSC9Rhrg9jrrFYA6bGZtzJa96zsuAYF6W3w== js-cookie@^2.2.1: version "2.2.1" @@ -1939,9 +1933,9 @@ loose-envify@^1.1.0, loose-envify@^1.4.0: js-tokens "^3.0.0 || ^4.0.0" lru-cache@^10.2.0: - version "10.3.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.3.0.tgz#4a4aaf10c84658ab70f79a85a9a3f1e1fb11196b" - integrity sha512-CQl19J/g+Hbjbv4Y3mFNNXFEL/5t/KCg8POCuUqd4rMKjGG+j1ybER83hxV58zL+dFI1PTkt3GNFSHRt+d8qEQ== + version "10.4.3" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.4.3.tgz#410fc8a17b70e598013df257c2446b7f3383f119" + integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ== mdn-data@2.0.14: version "2.0.14" @@ -2046,11 +2040,11 @@ next-themes@^0.3.0: integrity sha512-/QHIrsYpd6Kfk7xakK4svpDI5mmXP0gfvCoJdGpZQ2TOrQZmsW0QxjaiLn8wbIKjtm4BTSqLoix4lxYYOnLJ/w== next@^14.2.3: - version "14.2.4" - resolved "https://registry.yarnpkg.com/next/-/next-14.2.4.tgz#ef66c39c71e2d8ad0a3caa0383c8933f4663e4d1" - integrity sha512-R8/V7vugY+822rsQGQCjoLhMuC9oFj9SOi4Cl4b2wjDrseD0LRZ10W7R6Czo4w9ZznVSshKjuIomsRjvm9EKJQ== + version "14.2.5" + resolved "https://registry.yarnpkg.com/next/-/next-14.2.5.tgz#afe4022bb0b752962e2205836587a289270efbea" + integrity sha512-0f8aRfBVL+mpzfBjYfQuLWh2WyAwtJXCRfkPF4UJ5qd2YwrHczsrSzXU4tRMV0OAxR8ZJZWPFn6uhSC56UTsLA== dependencies: - "@next/env" "14.2.4" + "@next/env" "14.2.5" "@swc/helpers" "0.5.5" busboy "1.6.0" caniuse-lite "^1.0.30001579" @@ -2058,15 +2052,15 @@ next@^14.2.3: postcss "8.4.31" styled-jsx "5.1.1" optionalDependencies: - "@next/swc-darwin-arm64" "14.2.4" - "@next/swc-darwin-x64" "14.2.4" - "@next/swc-linux-arm64-gnu" "14.2.4" - "@next/swc-linux-arm64-musl" "14.2.4" - "@next/swc-linux-x64-gnu" "14.2.4" - "@next/swc-linux-x64-musl" "14.2.4" - "@next/swc-win32-arm64-msvc" "14.2.4" - "@next/swc-win32-ia32-msvc" "14.2.4" - "@next/swc-win32-x64-msvc" "14.2.4" + "@next/swc-darwin-arm64" "14.2.5" + "@next/swc-darwin-x64" "14.2.5" + "@next/swc-linux-arm64-gnu" "14.2.5" + "@next/swc-linux-arm64-musl" "14.2.5" + "@next/swc-linux-x64-gnu" "14.2.5" + "@next/swc-linux-x64-musl" "14.2.5" + "@next/swc-win32-arm64-msvc" "14.2.5" + "@next/swc-win32-ia32-msvc" "14.2.5" + "@next/swc-win32-x64-msvc" "14.2.5" node-releases@^2.0.14: version "2.0.14" @@ -3005,7 +2999,7 @@ undici-types@~5.26.4: resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== -update-browserslist-db@^1.0.16: +update-browserslist-db@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz#7ca61c0d8650766090728046e416a8cde682859e" integrity sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==
    diff --git a/website/src/components/drawer-views/container.tsx b/website/src/components/drawer-views/container.tsx new file mode 100644 index 000000000..51e7613ff --- /dev/null +++ b/website/src/components/drawer-views/container.tsx @@ -0,0 +1,65 @@ +import { Fragment, useEffect } from 'react'; +import dynamic from 'next/dynamic'; +import { useRouter } from 'next/router'; +import { Dialog } from '@/components/ui/dialog'; +import { Transition } from '@/components/ui/transition'; +import { DRAWER_VIEW, useDrawer } from '@/components/drawer-views/context'; + +const Sidebar = dynamic(() => import('@/layouts/dashboard/_sidebar')); +const DrawerMenu = dynamic(() => import('@/layouts/_layout-menu')); + +function renderDrawerContent(view: DRAWER_VIEW | string) { + switch (view) { + case 'DASHBOARD_SIDEBAR': + return ; + default: + return ; + } +} + +export default function DrawersContainer() { + const router = useRouter(); + const { view, isOpen, closeDrawer } = useDrawer(); + useEffect(() => { + // close search modal when route change + router.events.on('routeChangeStart', closeDrawer); + return () => { + router.events.off('routeChangeStart', closeDrawer); + }; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + return ( + + + + + + +
    + {view && renderDrawerContent(view)} +
    +
    +
    +
    + ); +} diff --git a/website/src/components/drawer-views/context.tsx b/website/src/components/drawer-views/context.tsx new file mode 100644 index 000000000..8da9ee00c --- /dev/null +++ b/website/src/components/drawer-views/context.tsx @@ -0,0 +1,17 @@ +'use client' +import { atom, useAtom } from 'jotai'; + +export type DRAWER_VIEW = 'DASHBOARD_SIDEBAR' | 'DRAWER_MENU' | 'DRAWER_SEARCH'; +const drawerAtom = atom({ isOpen: false, view: 'DASHBOARD_SIDEBAR' }); + +export function useDrawer() { + const [state, setState] = useAtom(drawerAtom); + const openDrawer = (view: DRAWER_VIEW) => + setState({ ...state, isOpen: true, view }); + const closeDrawer = () => setState({ ...state, isOpen: false }); + return { + ...state, + openDrawer, + closeDrawer, + }; +} diff --git a/website/src/components/icons/check.tsx b/website/src/components/icons/check.tsx new file mode 100644 index 000000000..020be2b34 --- /dev/null +++ b/website/src/components/icons/check.tsx @@ -0,0 +1,10 @@ +export const Check: React.FC> = (props) => { + return ( + + + + ); +}; diff --git a/website/src/components/icons/chevron-down.tsx b/website/src/components/icons/chevron-down.tsx new file mode 100644 index 000000000..7b33d6d4d --- /dev/null +++ b/website/src/components/icons/chevron-down.tsx @@ -0,0 +1,19 @@ +export function ChevronDown(props: React.SVGAttributes<{}>) { + return ( + + + + ); +} diff --git a/website/src/components/icons/chevron-forward.tsx b/website/src/components/icons/chevron-forward.tsx new file mode 100644 index 000000000..341c5c0b0 --- /dev/null +++ b/website/src/components/icons/chevron-forward.tsx @@ -0,0 +1,19 @@ +export const ChevronForward: React.FC> = (props) => { + return ( + + + + ); +}; diff --git a/website/src/components/icons/close.tsx b/website/src/components/icons/close.tsx new file mode 100644 index 000000000..8ee6374a5 --- /dev/null +++ b/website/src/components/icons/close.tsx @@ -0,0 +1,25 @@ +export function Close(props: React.SVGAttributes<{}>) { + return ( + + + + + ); +} diff --git a/website/src/components/icons/copy.tsx b/website/src/components/icons/copy.tsx new file mode 100644 index 000000000..303242933 --- /dev/null +++ b/website/src/components/icons/copy.tsx @@ -0,0 +1,14 @@ +export const Copy: React.FC> = (props) => { + return ( + + + + + ); +}; diff --git a/website/src/components/icons/exchange.tsx b/website/src/components/icons/exchange.tsx new file mode 100644 index 000000000..49261c4d4 --- /dev/null +++ b/website/src/components/icons/exchange.tsx @@ -0,0 +1,21 @@ +export function ExchangeIcon(props: React.SVGAttributes<{}>) { + return ( + + + + + ); +} diff --git a/website/src/components/icons/export-icon.tsx b/website/src/components/icons/export-icon.tsx new file mode 100644 index 000000000..388b52701 --- /dev/null +++ b/website/src/components/icons/export-icon.tsx @@ -0,0 +1,19 @@ +export function ExportIcon(props: React.SVGAttributes<{}>) { + return ( + + + + + ); +} diff --git a/website/src/components/icons/farm.tsx b/website/src/components/icons/farm.tsx new file mode 100644 index 000000000..9164303dc --- /dev/null +++ b/website/src/components/icons/farm.tsx @@ -0,0 +1,35 @@ +export function FarmIcon(props: React.SVGAttributes<{}>) { + return ( + + + + + + + + ); +} diff --git a/website/src/components/icons/home.tsx b/website/src/components/icons/home.tsx new file mode 100644 index 000000000..a942ee1a8 --- /dev/null +++ b/website/src/components/icons/home.tsx @@ -0,0 +1,19 @@ +export const HomeIcon: React.FC> = (props) => { + return ( + + + + ); +}; diff --git a/website/src/components/icons/left-align.tsx b/website/src/components/icons/left-align.tsx new file mode 100644 index 000000000..80df99b7a --- /dev/null +++ b/website/src/components/icons/left-align.tsx @@ -0,0 +1,25 @@ +export function LeftAlign(props: React.SVGAttributes<{}>) { + return ( + + + + + + ); +} diff --git a/website/src/components/icons/moon.tsx b/website/src/components/icons/moon.tsx new file mode 100644 index 000000000..8e3f9d6cb --- /dev/null +++ b/website/src/components/icons/moon.tsx @@ -0,0 +1,24 @@ +export function Moon(props: React.SVGAttributes<{}>) { + return ( + + + + + + + + + + + ); +} diff --git a/website/src/components/icons/option.tsx b/website/src/components/icons/option.tsx new file mode 100644 index 000000000..afe283901 --- /dev/null +++ b/website/src/components/icons/option.tsx @@ -0,0 +1,37 @@ +export function OptionIcon(props: React.SVGAttributes<{}>) { + return ( + + + + + + + + + ); +} diff --git a/website/src/components/icons/oven.tsx b/website/src/components/icons/oven.tsx new file mode 100644 index 000000000..4625e2c6a --- /dev/null +++ b/website/src/components/icons/oven.tsx @@ -0,0 +1,25 @@ +export function OvenIcon(props: React.SVGAttributes<{}>) { + return ( + + + + + + ); +} diff --git a/website/src/components/icons/range-icon.tsx b/website/src/components/icons/range-icon.tsx new file mode 100644 index 000000000..37be1db2f --- /dev/null +++ b/website/src/components/icons/range-icon.tsx @@ -0,0 +1,25 @@ +export function RangeIcon(props: React.SVGAttributes<{}>) { + return ( + + + + + ); +} diff --git a/website/src/components/icons/right-align.tsx b/website/src/components/icons/right-align.tsx new file mode 100644 index 000000000..74470237d --- /dev/null +++ b/website/src/components/icons/right-align.tsx @@ -0,0 +1,25 @@ +export function RightAlign(props: React.SVGAttributes<{}>) { + return ( + + + + + + ); +} diff --git a/website/src/components/icons/search.tsx b/website/src/components/icons/search.tsx new file mode 100644 index 000000000..a38060e1c --- /dev/null +++ b/website/src/components/icons/search.tsx @@ -0,0 +1,19 @@ +export const SearchIcon: React.FC> = (props) => { + return ( + + + + ); +}; diff --git a/website/src/components/icons/sun.tsx b/website/src/components/icons/sun.tsx new file mode 100644 index 000000000..c285332b4 --- /dev/null +++ b/website/src/components/icons/sun.tsx @@ -0,0 +1,24 @@ +export function Sun(props: React.SVGAttributes<{}>) { + return ( + + + + + + + + + + + ); +} diff --git a/website/src/components/icons/unlocked.tsx b/website/src/components/icons/unlocked.tsx new file mode 100644 index 000000000..a9b20dc3a --- /dev/null +++ b/website/src/components/icons/unlocked.tsx @@ -0,0 +1,23 @@ +export function Unlocked(props: React.SVGAttributes<{}>) { + return ( + + + + + ); +} diff --git a/website/src/components/sidebar.tsx b/website/src/components/sidebar.tsx deleted file mode 100644 index 742c606d1..000000000 --- a/website/src/components/sidebar.tsx +++ /dev/null @@ -1,52 +0,0 @@ -import Link from "next/link"; - -const routes = { - gettingStarted: '/', - greet: '/greet', - accounts: '/accounts', - notes: '/notes', - transactions: '/transactions' -}; - -const menuItems = [ - { - name: 'Getting Started', - href: routes.gettingStarted, - }, - { - name: 'Greet', - href: routes.greet, - }, - { - name: 'Accounts', - href: routes.accounts, - }, - { - name: 'Notes', - href: routes.notes, - }, - { - name: 'Transactions', - href: routes.transactions, - } -]; - -type SidebarProps = { - className?: string; -}; - -export default function Sidebar({ className }: SidebarProps) { - return ( - - ); -} \ No newline at end of file diff --git a/website/src/components/ui/base.tsx b/website/src/components/ui/base.tsx new file mode 100644 index 000000000..b4b97e78e --- /dev/null +++ b/website/src/components/ui/base.tsx @@ -0,0 +1,129 @@ +// @ts-nocheck +import { useState, useEffect } from 'react'; +import dynamic from 'next/dynamic'; +import { useRouter } from 'next/router'; +import { motion, AnimatePresence } from 'framer-motion'; +import cn from 'classnames'; +import routes from '@/config/routes'; +import ActiveLink from '@/components/ui/links/active-link'; +import AnchorLink from '@/components/ui/links/anchor-link'; +import { RangeIcon } from '@/components/icons/range-icon'; +import { ExportIcon } from '@/components/icons/export-icon'; +import { useBreakpoint } from '@/lib/hooks/use-breakpoint'; +import { useIsMounted } from '@/lib/hooks/use-is-mounted'; +import { fadeInBottom } from '@/lib/framer-motion/fade-in-bottom'; +// dynamic import +const Listbox = dynamic(() => import('@/components/ui/list-box')); + +const baseMenu = [ + { + name: 'Sign', + value: routes.sign, + }, + { + name: 'Decrypt', + value: routes.decrypt, + }, + { + name: 'Records', + value: routes.records, + }, + { + name: 'Transfer', + value: routes.transfer, + }, + { + name: 'Execute', + value: routes.execute, + }, + { + name: 'Deploy', + value: routes.deploy, + }, +]; + +function ActiveNavLink({ href, title, isActive, className }: any) { + return ( + + {title} + {isActive && ( + + )} + + ); +} + +export default function Base({ children }: React.PropsWithChildren<{}>) { + const router = useRouter(); + const isMounted = useIsMounted(); + const breakpoint = useBreakpoint(); + const currentPath = baseMenu.findIndex( + (item) => item.value === router.pathname + ); + let [selectedMenuItem, setSelectedMenuItem] = useState(baseMenu[0]); + function handleRouteOnSelect(path: string) { + router.push(path); + } + useEffect(() => { + setSelectedMenuItem(baseMenu[currentPath]); + }, [currentPath]); + return ( +
    +
    + + + + {children} + + +
    +
    + ); +} diff --git a/website/src/components/ui/button/button-drip.tsx b/website/src/components/ui/button/button-drip.tsx new file mode 100644 index 000000000..19f9a200b --- /dev/null +++ b/website/src/components/ui/button/button-drip.tsx @@ -0,0 +1,53 @@ +import { useEffect, useRef } from 'react'; +import cn from 'classnames'; + +interface ButtonDripTypes { + x: number; + y: number; + color: string; + fullWidth?: boolean; + onCompleted: () => void; +} + +export default function ButtonDrip({ + x = 0, + y = 0, + color, + fullWidth, + onCompleted, +}: ButtonDripTypes) { + const dripRef = useRef(null); + let top = Number.isNaN(+y) ? 0 : y - 10; + let left = Number.isNaN(+x) ? 0 : x - 10; + useEffect(() => { + if (!dripRef.current) return; + dripRef.current.addEventListener('animationend', onCompleted); + return () => { + if (!dripRef.current) return; + // eslint-disable-next-line react-hooks/exhaustive-deps + dripRef.current.removeEventListener('animationend', onCompleted); + }; + }); + return ( + + + + + + + + + + ); +} + +ButtonDrip.displayName = 'ButtonDrip'; diff --git a/website/src/components/ui/button/button-loader.tsx b/website/src/components/ui/button/button-loader.tsx new file mode 100644 index 000000000..421c56eec --- /dev/null +++ b/website/src/components/ui/button/button-loader.tsx @@ -0,0 +1,25 @@ +import Loader, { + LoaderSizeTypes, + LoaderVariantTypes, +} from '@/components/ui/loader'; + +export default function ButtonLoader({ + size, + variant, +}: { + size: LoaderSizeTypes; + variant: LoaderVariantTypes; +}) { + return ( + + + + ); +} + +ButtonLoader.displayName = 'ButtonLoader'; diff --git a/website/src/components/ui/button/button.tsx b/website/src/components/ui/button/button.tsx new file mode 100644 index 000000000..c934fb05a --- /dev/null +++ b/website/src/components/ui/button/button.tsx @@ -0,0 +1,174 @@ +'use client' +import { useState, useRef, forwardRef, useImperativeHandle } from 'react'; +import cn from 'classnames'; +import ButtonDrip from '@/components/ui/button/button-drip'; +import ButtonLoader from '@/components/ui/button/button-loader'; +import { LoaderSizeTypes, LoaderVariantTypes } from '@/components/ui/loader'; +type ShapeNames = 'rounded' | 'pill' | 'circle'; +type VariantNames = 'ghost' | 'solid' | 'transparent'; +type ColorNames = + | 'primary' + | 'white' + | 'gray' + | 'success' + | 'info' + | 'warning' + | 'danger'; +type SizeNames = 'large' | 'medium' | 'small' | 'mini'; + +const shapes: Record = { + rounded: ['rounded-md sm:rounded-lg'], + pill: ['rounded-full'], + circle: ['rounded-full'], +}; +const variants: Record = { + ghost: ['bg-transparent'], + solid: ['text-white'], + transparent: ['bg-transparent hover:bg-gray-50 dark:hover:bg-gray-800'], +}; +const colors: Record = { + primary: ['text-brand', 'bg-brand', 'border-brand'], + white: ['text-gray-900', 'bg-white', 'border-white'], + gray: ['text-gray-900', 'bg-gray-100', 'border-gray-100'], + success: ['text-green-500', 'bg-green-500', 'border-green-500'], + info: ['text-blue-500', 'bg-blue-500', 'border-blue-500'], + warning: ['text-yellow-500', 'bg-yellow-500', 'border-yellow-500'], + danger: ['text-red-500', 'bg-red-500', 'border-red-500'], +}; +const sizes: Record = { + large: ['px-7 sm:px-9 h-11 sm:h-13', 'w-11 h-11 sm:w-13 sm:h-13'], + medium: ['px-5 sm:px-8 h-10 sm:h-12', 'h-10 w-10 sm:w-12 sm:h-12'], + small: ['px-7 h-10', 'w-10 h-10'], + mini: ['px-4 h-8', 'w-8 h-8'], +}; + +export interface ButtonProps + extends React.ButtonHTMLAttributes { + isLoading?: boolean; + disabled?: boolean; + shape?: ShapeNames; + variant?: VariantNames; + color?: ColorNames; + size?: SizeNames; + fullWidth?: boolean; + loaderSize?: LoaderSizeTypes; + loaderVariant?: LoaderVariantTypes; + onClick?: React.MouseEventHandler; +} + +const Button = forwardRef( + ( + { + children, + className, + isLoading, + disabled, + fullWidth, + shape = 'pill', + variant = 'solid', + color = 'primary', + size = 'medium', + loaderSize = 'small', + loaderVariant = 'scaleUp', + onClick, + ...buttonProps + }, + ref: React.Ref + ) => { + let [dripShow, setDripShow] = useState(false); + let [dripX, setDripX] = useState(0); + let [dripY, setDripY] = useState(0); + const colorClassNames = colors[color]; + const sizeClassNames = sizes[size]; + const buttonRef = useRef(null); + useImperativeHandle(ref, () => buttonRef.current); + function dripCompletedHandle() { + setDripShow(false); + setDripX(0); + setDripY(0); + } + const clickHandler = (event: React.MouseEvent) => { + if (!isLoading && buttonRef.current) { + const rect = buttonRef.current.getBoundingClientRect(); + setDripShow(true); + setDripX(event.clientX - rect.left); + setDripY(event.clientY - rect.top); + } + onClick && onClick(event); + }; + + let buttonColorClassNames = ''; + let buttonDripColor = ''; + switch (variant) { + case 'ghost': + buttonColorClassNames = `border-2 border-solid ${colorClassNames[0]} ${colorClassNames[2]}`; + buttonDripColor = 'rgba(0, 0, 0, 0.1)'; + break; + + case 'transparent': + buttonColorClassNames = `${colorClassNames[0]} ${ + disabled || isLoading + ? '' + : 'hover:bg-gray-100 dark:hover:bg-gray-800 focus:bg-gray-100 dark:focus:bg-gray-800' + } `; + buttonDripColor = 'rgba(0, 0, 0, 0.1)'; + break; + + default: + buttonColorClassNames = `${colorClassNames[1]} ${colorClassNames[2]}`; + buttonDripColor = 'rgba(255, 255, 255, 0.3)'; + break; + } + + return ( + + ); + } +); + +Button.displayName = 'Button'; +export default Button; diff --git a/website/src/components/ui/button/index.ts b/website/src/components/ui/button/index.ts new file mode 100644 index 000000000..156d97121 --- /dev/null +++ b/website/src/components/ui/button/index.ts @@ -0,0 +1,2 @@ +export { default } from '@/components/ui/button/button'; +export type { ButtonProps } from '@/components/ui/button/button'; diff --git a/website/src/components/ui/collapsible-menu.tsx b/website/src/components/ui/collapsible-menu.tsx new file mode 100644 index 000000000..0af522c2c --- /dev/null +++ b/website/src/components/ui/collapsible-menu.tsx @@ -0,0 +1,110 @@ +'use client' +import { useState, useEffect } from 'react'; +import { usePathname } from 'next/navigation'; +import cn from 'classnames'; +import { motion } from 'framer-motion'; +import { useMeasure } from '@/lib/hooks/use-measure'; +import ActiveLink from '@/components/ui/links/active-link'; +import { ChevronDown } from '@/components/icons/chevron-down'; + +type MenuItemProps = { + name: string; + icon: React.ReactNode; + href: string; + dropdownItems?: DropdownItemProps[]; +}; + +type DropdownItemProps = { + name: string; + href: string; +}; + +export function MenuItem({ name, icon, href, dropdownItems }: MenuItemProps) { + let [isOpen, setIsOpen] = useState(false); + let [ref, { height }] = useMeasure(); + let pathname = usePathname(); + + let isChildrenActive = + dropdownItems && dropdownItems.some((item) => item.href === pathname); + + useEffect(() => { + if (isChildrenActive) { + setIsOpen(true); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + return ( +
    + {dropdownItems?.length ? ( + <> +
    setIsOpen(!isOpen)} + > + + {icon} + {name} + + + + + + {isChildrenActive && ( + + )} +
    + +
    +
      + {dropdownItems.map((item, index) => ( +
    • + + {item.name} + +
    • + ))} +
    +
    + + ) : ( + + {icon} + {name} + + {href === pathname && ( + + )} + + )} +
    + ); +} diff --git a/website/src/components/ui/dialog.tsx b/website/src/components/ui/dialog.tsx new file mode 100644 index 000000000..0c59af1fc --- /dev/null +++ b/website/src/components/ui/dialog.tsx @@ -0,0 +1 @@ +export { Dialog } from '@headlessui/react'; diff --git a/website/src/components/ui/hamburger.tsx b/website/src/components/ui/hamburger.tsx new file mode 100644 index 000000000..f5eb264f8 --- /dev/null +++ b/website/src/components/ui/hamburger.tsx @@ -0,0 +1,48 @@ +import Button, { ButtonProps } from '@/components/ui/button'; +interface HamburgerProps extends ButtonProps { + isOpen?: boolean; +} + +export default function Hamburger({ isOpen, ...props }: HamburgerProps) { + return ( + + ); +} diff --git a/website/src/components/ui/image.tsx b/website/src/components/ui/image.tsx new file mode 100644 index 000000000..893b13295 --- /dev/null +++ b/website/src/components/ui/image.tsx @@ -0,0 +1 @@ +export { default } from 'next/image'; diff --git a/website/src/components/ui/links/active-link.tsx b/website/src/components/ui/links/active-link.tsx new file mode 100644 index 000000000..954bfe586 --- /dev/null +++ b/website/src/components/ui/links/active-link.tsx @@ -0,0 +1,24 @@ +import type { LinkProps } from 'next/link'; +import { usePathname } from 'next/navigation'; +import cn from 'classnames'; +import AnchorLink from '@/components/ui/links/anchor-link'; + +interface ActiveLinkProps extends LinkProps { + activeClassName?: string; +} +const ActiveLink: React.FC< + ActiveLinkProps & Omit, 'href'> +> = ({ href, className, activeClassName = 'active', ...props }) => { + const pathname = usePathname(); + return ( + + ); +}; + +export default ActiveLink; diff --git a/website/src/components/ui/links/anchor-link.tsx b/website/src/components/ui/links/anchor-link.tsx new file mode 100644 index 000000000..a1c8c22cb --- /dev/null +++ b/website/src/components/ui/links/anchor-link.tsx @@ -0,0 +1,14 @@ +import type { LinkProps } from 'next/link'; +import NextLink from 'next/link'; + +const AnchorLink: React.FC< + LinkProps & Omit, 'href'> +> = ({ href, ...props }) => { + return ( + +
    + + ); +}; + +export default AnchorLink; diff --git a/website/src/components/ui/list-box.tsx b/website/src/components/ui/list-box.tsx new file mode 100644 index 000000000..45830418d --- /dev/null +++ b/website/src/components/ui/list-box.tsx @@ -0,0 +1,81 @@ +import { Fragment } from 'react'; +import { Listbox as HeadlessListbox } from '@headlessui/react'; +import cn from 'classnames'; +import { Transition } from '@/components/ui/transition'; +import { ChevronDown } from '@/components/icons/chevron-down'; + +export type ListboxOption = { + name: string; + value: string; +}; + +interface ListboxTypes { + options: ListboxOption[]; + selectedOption: ListboxOption; + onChange: React.Dispatch>; + children?: React.ReactNode; + onSelect?: (value: string) => void; + variant?: 'ghost' | 'solid' | 'transparent'; + className?: string; +} + +const listboxVariantClasses = { + ghost: + 'transition-shadow border border-gray-200 bg-white text-gray-900 hover:border-gray-900 hover:ring-1 hover:ring-gray-900 dark:border-gray-700 dark:bg-gray-800 dark:text-gray-100 dark:hover:border-gray-600 dark:hover:ring-gray-600', + solid: + 'transition-colors bg-gray-100 hover:bg-gray-200/70 dark:bg-gray-800 dark:hover:bg-gray-700', + transparent: '', +}; + +export default function Listbox({ + options, + onChange, + onSelect, + variant = 'ghost', + selectedOption, + className, + children, +}: ListboxTypes) { + return ( +
    + + +
    {selectedOption?.name}
    + +
    + + + {options.map((option) => ( + + {({ selected }) => ( +
    onSelect && onSelect(option.value)} + className={`flex cursor-pointer items-center rounded-md px-3 py-2 text-sm text-gray-900 transition dark:text-gray-100 ${ + selected + ? 'bg-gray-200/70 font-medium dark:bg-gray-600/60' + : 'hover:bg-gray-100 dark:hover:bg-gray-700/70' + }`} + > + {option.name} +
    + )} +
    + ))} + {/* any custom / external link or element */} + {children && children} +
    +
    +
    +
    + ); +} diff --git a/website/src/components/ui/loader.tsx b/website/src/components/ui/loader.tsx new file mode 100644 index 000000000..7c0960a15 --- /dev/null +++ b/website/src/components/ui/loader.tsx @@ -0,0 +1,85 @@ +import cn from 'classnames'; +export type LoaderSizeTypes = 'large' | 'medium' | 'small'; +export type LoaderVariantTypes = 'blink' | 'scaleUp' | 'moveUp'; +export interface LoaderTypes + extends React.HTMLAttributes { + tag?: 'div' | 'span'; + size?: LoaderSizeTypes; + variant?: LoaderVariantTypes; + showOnlyThreeDots?: boolean; + className?: string; +} + +const variants = { + blink: 'animate-blink', + scaleUp: 'animate-scale-up', + moveUp: 'animate-move-up', +}; +const sizes = { + small: 'w-1.5 h-1.5', + medium: 'w-2.5 h-2.5', + large: 'w-3 h-3', +}; + +function handleLoaderPosition(size: LoaderSizeTypes) { + return size === 'small' ? 'relative top-1.5' : 'relative top-3'; +} + +function handleVariantClasses( + variant: LoaderVariantTypes, + size: LoaderSizeTypes +) { + return variant === 'moveUp' && size === 'small' + ? 'animate-move-up-small' + : variants[variant]; +} + +export default function Loader({ + tag = 'div', + size = 'medium', + variant = 'moveUp', + showOnlyThreeDots, + className, +}: LoaderTypes) { + let Component = tag; + return ( + + + + + {variant === 'moveUp' && !showOnlyThreeDots ? ( + + ) : null} + + ); +} diff --git a/website/src/components/ui/logo.tsx b/website/src/components/ui/logo.tsx new file mode 100644 index 000000000..86d4f7edb --- /dev/null +++ b/website/src/components/ui/logo.tsx @@ -0,0 +1,29 @@ +import Image from '@/components/ui/image'; +import AnchorLink from '@/components/ui/links/anchor-link'; +import { useIsMounted } from '@/lib/hooks/use-is-mounted'; +import { useIsDarkMode } from '@/lib/hooks/use-is-dark-mode'; +import logo from '@/assets/images/icon-128.png'; + +const Logo: React.FC> = (props) => { + const isMounted = useIsMounted(); + const { isDarkMode } = useIsDarkMode(); + + return ( + + + {isMounted && isDarkMode && ( + Leo Wallet + )} + {isMounted && !isDarkMode && ( + Leo Wallet + )} + + + ); +}; + +export default Logo; diff --git a/website/src/components/ui/menu.tsx b/website/src/components/ui/menu.tsx new file mode 100644 index 000000000..eded8c878 --- /dev/null +++ b/website/src/components/ui/menu.tsx @@ -0,0 +1 @@ +export { Menu } from '@headlessui/react'; diff --git a/website/src/components/ui/radio-group.tsx b/website/src/components/ui/radio-group.tsx new file mode 100644 index 000000000..8c18e71aa --- /dev/null +++ b/website/src/components/ui/radio-group.tsx @@ -0,0 +1 @@ +export { RadioGroup } from '@headlessui/react'; diff --git a/website/src/components/ui/scrollbar.tsx b/website/src/components/ui/scrollbar.tsx new file mode 100644 index 000000000..e70b620bd --- /dev/null +++ b/website/src/components/ui/scrollbar.tsx @@ -0,0 +1,32 @@ +import cn from 'classnames'; +import { + OverlayScrollbarsComponent, + OverlayScrollbarsComponentProps, +} from 'overlayscrollbars-react'; +// import 'overlayscrollbars/css/OverlayScrollbars.css'; + +interface ScrollbarProps extends OverlayScrollbarsComponentProps { + style?: React.CSSProperties; + className?: string; +} + +export default function Scrollbar({ + options, + style, + className, + ...props +}: React.PropsWithChildren) { + return ( + + ); +} diff --git a/website/src/components/ui/transition.tsx b/website/src/components/ui/transition.tsx new file mode 100644 index 000000000..29419fc5a --- /dev/null +++ b/website/src/components/ui/transition.tsx @@ -0,0 +1 @@ +export { Transition } from '@headlessui/react'; diff --git a/website/src/context/wasm-context.tsx b/website/src/context/wasm-context.tsx new file mode 100644 index 000000000..bbd799194 --- /dev/null +++ b/website/src/context/wasm-context.tsx @@ -0,0 +1,31 @@ +// 'use client' +// import { createContext, useContext, useState, useEffect } from 'react'; +// import { initializeWasmAndWebClient } from '../lib/wasm'; +// import * as w from 'wasm'; + +// const WasmContext = createContext(null); + +// export function WasmProvider({ children }: { children: React.ReactNode }): React.ReactNode { +// const [wasm, setWasm] = useState(null); + +// useEffect(() => { +// (async () => { +// const wasmModule = await initializeWasmAndWebClient(); +// setWasm(wasmModule); +// })(); +// }, []); + +// return ( +// +// {children} +// +// ); +// } + +// export function useWasm() { +// const context = useContext(WasmContext); +// if (context === undefined) { +// throw new Error('useWasm must be used within a WasmProvider'); +// } +// return context; +// } diff --git a/website/src/layouts/_layout-menu.tsx b/website/src/layouts/_layout-menu.tsx new file mode 100644 index 000000000..c08e36eb7 --- /dev/null +++ b/website/src/layouts/_layout-menu.tsx @@ -0,0 +1,253 @@ +import { Fragment } from 'react'; +import Logo from '@/components/ui/logo'; +import Button from '@/components/ui/button'; +import { Menu } from '@/components/ui/menu'; +import { Transition } from '@/components/ui/transition'; +import ActiveLink from '@/components/ui/links/active-link'; +import Scrollbar from '@/components/ui/scrollbar'; +import { ChevronForward } from '@/components/icons/chevron-forward'; +import { Close } from '@/components/icons/close'; +import { useDrawer } from '@/components/drawer-views/context'; +import { ChevronDown } from '@/components/icons/chevron-down'; + +const MenuLinks = [ + { + name: 'Home', + dropDownItems: [ + { name: 'Modern', href: '/' }, + { name: 'Minimal', href: '/minimal' }, + ], + }, + { name: 'Sign', href: '/sign' }, + { name: 'Decrypt', href: '/decrypt' }, + { name: 'Records', href: '/records' }, + { name: 'Execute', href: '/execute' }, + { name: 'Deploy', href: '/deploy' }, +]; + +export function MenuItems() { + return ( +
    + {MenuLinks.map((item, index) => ( + <> + {item.dropDownItems ? ( +
    + + + {item.name} + + + + + + + + {item.dropDownItems.map((dropDownItem, index) => ( + + + {dropDownItem.name} + + + ))} + + + +
    + ) : ( + + {item.name} + + )} + + ))} +
    + ); +} + +export default function DrawerMenu() { + const { closeDrawer } = useDrawer(); + return ( +
    +
    + +
    + +
    +
    + + +
    + + {({ open }) => ( + <> + + Explore + + + + + + + Collection + + + + + Trending + + + + + Browse + + + + + + )} + + + + Feed + + + Activity + + + + {({ open }) => ( + <> + + Account + + + + + + + View profile + + + + + settings + + + + + help + + + + + Disconnect + + + + + + )} + + + + Notification + +
    +
    + +
    + +
    +
    + ); +} diff --git a/website/src/layouts/_layout.tsx b/website/src/layouts/_layout.tsx new file mode 100644 index 000000000..732f63d30 --- /dev/null +++ b/website/src/layouts/_layout.tsx @@ -0,0 +1,96 @@ +import { useWindowScroll } from '@/lib/hooks/use-window-scroll'; +import Logo from '@/components/ui/logo'; +import SearchButton from '@/components/search/button'; +import { useBreakpoint } from '@/lib/hooks/use-breakpoint'; +import { useIsMounted } from '@/lib/hooks/use-is-mounted'; +import { useDrawer } from '@/components/drawer-views/context'; +import Hamburger from '@/components/ui/hamburger'; +import { MenuItems } from '@/layouts/_layout-menu'; +import React from 'react'; +// import { WalletMultiButton } from '@demox-labs/aleo-wallet-adapter-reactui/'; + +// require('@demox-labs/aleo-wallet-adapter/dist/ui/styles.css'); + +function HeaderRightArea() { + const isMounted = useIsMounted(); + const breakpoint = useBreakpoint(); + const { openDrawer, isOpen } = useDrawer(); + return ( +
    +
    + +
    + +
    + {isMounted && ['xs', 'sm', 'md', 'lg'].indexOf(breakpoint) == -1 && ( +
    + +
    + )} + {/* */} +
    + +
    + openDrawer('DRAWER_MENU')} + color="white" + className="shadow-main dark:border dark:border-solid dark:border-gray-700 dark:bg-light-dark dark:text-white" + /> +
    +
    + ); +} + +export function Header() { + const windowScroll = useWindowScroll(); + const breakpoint = useBreakpoint(); + const isMounted = useIsMounted(); + const { openDrawer, isOpen } = useDrawer(); + + return ( + + ); +} + +interface LayoutProps {} + +export default function Layout({ + children, +}: React.PropsWithChildren) { + return ( +
    +
    +
    + {children} +
    +
    + ); +} diff --git a/website/src/layouts/dashboard/_dashboard.tsx b/website/src/layouts/dashboard/_dashboard.tsx new file mode 100644 index 000000000..77bb5c713 --- /dev/null +++ b/website/src/layouts/dashboard/_dashboard.tsx @@ -0,0 +1,76 @@ +'use client' +import { useState } from 'react'; +import cn from 'classnames'; +import { useWindowScroll } from '@/lib/hooks/use-window-scroll'; +import Hamburger from '@/components/ui/hamburger'; +import { useIsMounted } from '@/lib/hooks/use-is-mounted'; +import { useDrawer } from '@/components/drawer-views/context'; +import Sidebar from '@/layouts/dashboard/_sidebar'; +import React, { FC, useMemo } from 'react'; +// import { WalletMultiButton } from '@demox-labs/aleo-wallet-adapter-reactui'; + +// require('@demox-labs/aleo-wallet-adapter-reactui/dist/styles.css'); + +// function HeaderRightArea() { +// return ( +//
    +// +//
    +// ); +// } + +export function Header() { + const { openDrawer } = useDrawer(); + const isMounted = useIsMounted(); + let windowScroll = useWindowScroll(); + let [isOpen, setIsOpen] = useState(false); + + return ( + + ); +} + +interface DashboardLayoutProps { + contentClassName?: string; +} + +export default function Layout({ + children, + contentClassName, +}: React.PropsWithChildren) { + return ( +
    +
    + +
    + {children} +
    +
    + ); +} diff --git a/website/src/layouts/dashboard/_sidebar.tsx b/website/src/layouts/dashboard/_sidebar.tsx new file mode 100644 index 000000000..c5443a74c --- /dev/null +++ b/website/src/layouts/dashboard/_sidebar.tsx @@ -0,0 +1,112 @@ +'use client' +import cn from 'classnames'; +import { ChevronForward } from "../../components/icons/chevron-forward"; +import { useDrawer } from "../../components/drawer-views/context"; +import Logo from "../../components/ui/logo"; +import Button from "../../components/ui/button"; +import { Close } from "../../components/icons/close"; +import Scrollbar from "../../components/ui/scrollbar"; +import { MenuItem } from "../../components/ui/collapsible-menu"; + +const routes = { + gettingStarted: '/', + greet: '/greet', + accounts: '/accounts', + notes: '/notes', + transactions: '/transactions' +}; + +const menuItems = [ + { + name: 'Getting Started', + icon: , + href: routes.gettingStarted, + }, + { + name: 'Greet', + icon: , + href: routes.greet, + }, + { + name: 'Accounts', + icon: , + href: routes.accounts, + }, + { + name: 'Notes', + icon: , + href: routes.notes, + }, + { + name: 'Transactions', + icon: , + href: routes.transactions, + } +]; + +type SidebarProps = { + className?: string; +}; + +export default function Sidebar({ className }: SidebarProps) { + const { closeDrawer } = useDrawer(); + return ( + + ); +} + +// export default function Sidebar({ className }: SidebarProps) { +// return ( +// +// ); +// } \ No newline at end of file diff --git a/website/src/lib/db.ts b/website/src/lib/db.ts index d15158c27..e8a528ec0 100644 --- a/website/src/lib/db.ts +++ b/website/src/lib/db.ts @@ -1,50 +1,50 @@ -import Dexie from "dexie"; -import { IAccount, IAccountAuth, IAccountCode, IAccountStorage, IAccountVault, ITransaction, ITransactionScript, IInputNote, IOutputNote, IStateSync, IBlockHeader, IChainMmrNode } from "./dbTypes"; +// import Dexie from "dexie"; +// import { IAccount, IAccountAuth, IAccountCode, IAccountStorage, IAccountVault, ITransaction, ITransactionScript, IInputNote, IOutputNote, IStateSync, IBlockHeader, IChainMmrNode } from "./dbTypes"; -export enum Table { - AccountCode = 'accountCode', - AccountStorage = 'accountStorage', - AccountVaults = 'accountVaults', - AccountAuth = 'accountAuth', - Accounts = 'accounts', - Transactions = 'transactions', - TransactionScripts = 'transactionScripts', - InputNotes = 'inputNotes', - OutputNotes = 'outputNotes', - StateSync = 'stateSync', - BlockHeaders = 'blockHeaders', - ChainMmrNodes = 'chainMmrNodes', -} +// export enum Table { +// AccountCode = 'accountCode', +// AccountStorage = 'accountStorage', +// AccountVaults = 'accountVaults', +// AccountAuth = 'accountAuth', +// Accounts = 'accounts', +// Transactions = 'transactions', +// TransactionScripts = 'transactionScripts', +// InputNotes = 'inputNotes', +// OutputNotes = 'outputNotes', +// StateSync = 'stateSync', +// BlockHeaders = 'blockHeaders', +// ChainMmrNodes = 'chainMmrNodes', +// } -export const db = new Dexie('MidenClientDB') -db.version(1).stores({ - [Table.AccountCode]: indexes('root'), - [Table.AccountStorage]: indexes('root'), - [Table.AccountVaults]: indexes('root'), - [Table.AccountAuth]: indexes('accountId'), - [Table.Accounts]: indexes('[id+nonce]', 'id', 'committed', 'codeRoot', 'storageRoot', 'vaultRoot'), - [Table.Transactions]: indexes('id', 'scriptHash', 'blockNum', 'commitHeight'), - [Table.TransactionScripts]: indexes('scriptHash'), - [Table.InputNotes]: indexes('noteId', 'recipient', 'status'), - [Table.OutputNotes]: indexes('noteId', 'recipient', 'status'), - [Table.StateSync]: indexes('blockNum'), - [Table.BlockHeaders]: indexes('blockNum', 'hasClientNotes'), - [Table.ChainMmrNodes]: indexes('id') -}); +// export const db = new Dexie('MidenClientDB') +// db.version(1).stores({ +// [Table.AccountCode]: indexes('root'), +// [Table.AccountStorage]: indexes('root'), +// [Table.AccountVaults]: indexes('root'), +// [Table.AccountAuth]: indexes('accountId'), +// [Table.Accounts]: indexes('[id+nonce]', 'id', 'committed', 'codeRoot', 'storageRoot', 'vaultRoot'), +// [Table.Transactions]: indexes('id', 'scriptHash', 'blockNum', 'commitHeight'), +// [Table.TransactionScripts]: indexes('scriptHash'), +// [Table.InputNotes]: indexes('noteId', 'recipient', 'status'), +// [Table.OutputNotes]: indexes('noteId', 'recipient', 'status'), +// [Table.StateSync]: indexes('blockNum'), +// [Table.BlockHeaders]: indexes('blockNum', 'hasClientNotes'), +// [Table.ChainMmrNodes]: indexes('id') +// }); -function indexes(...items: string[]) { - return items.join(','); -} +// function indexes(...items: string[]) { +// return items.join(','); +// } -export const accountCodes = db.table(Table.AccountCode); -export const accountStorages = db.table(Table.AccountStorage); -export const accountVaults = db.table(Table.AccountVaults); -export const accountAuths = db.table(Table.AccountAuth); -export const accounts = db.table(Table.Accounts); -export const transactions = db.table(Table.Transactions); -export const transactionScripts = db.table(Table.TransactionScripts); -export const inputNotes = db.table(Table.InputNotes); -export const outputNotes = db.table(Table.OutputNotes); -export const stateSync = db.table(Table.StateSync); -export const blockHeaders = db.table(Table.BlockHeaders); -export const chainMmrNodes = db.table(Table.ChainMmrNodes); +// export const accountCodes = db.table(Table.AccountCode); +// export const accountStorages = db.table(Table.AccountStorage); +// export const accountVaults = db.table(Table.AccountVaults); +// export const accountAuths = db.table(Table.AccountAuth); +// export const accounts = db.table(Table.Accounts); +// export const transactions = db.table(Table.Transactions); +// export const transactionScripts = db.table(Table.TransactionScripts); +// export const inputNotes = db.table(Table.InputNotes); +// export const outputNotes = db.table(Table.OutputNotes); +// export const stateSync = db.table(Table.StateSync); +// export const blockHeaders = db.table(Table.BlockHeaders); +// export const chainMmrNodes = db.table(Table.ChainMmrNodes); diff --git a/website/src/lib/hooks/use-breakpoint.ts b/website/src/lib/hooks/use-breakpoint.ts new file mode 100644 index 000000000..79003cf00 --- /dev/null +++ b/website/src/lib/hooks/use-breakpoint.ts @@ -0,0 +1,14 @@ +import createBreakpoint from 'react-use/lib/factory/createBreakpoint'; + +const breakPoints = { + xs: 480, + sm: 640, + md: 768, + lg: 1024, + xl: 1280, + '2xl': 1440, + '3xl': 1780, + '4xl': 2160, +}; + +export const useBreakpoint = createBreakpoint(breakPoints); diff --git a/website/src/lib/hooks/use-click-away.ts b/website/src/lib/hooks/use-click-away.ts new file mode 100644 index 000000000..71070f1d3 --- /dev/null +++ b/website/src/lib/hooks/use-click-away.ts @@ -0,0 +1 @@ +export { default as useClickAway } from 'react-use/lib/useClickAway'; diff --git a/website/src/lib/hooks/use-copy-to-clipboard.ts b/website/src/lib/hooks/use-copy-to-clipboard.ts new file mode 100644 index 000000000..5c4e21531 --- /dev/null +++ b/website/src/lib/hooks/use-copy-to-clipboard.ts @@ -0,0 +1 @@ +export { default as useCopyToClipboard } from 'react-use/lib/useCopyToClipboard'; diff --git a/website/src/lib/hooks/use-direction.ts b/website/src/lib/hooks/use-direction.ts new file mode 100644 index 000000000..b69c09e04 --- /dev/null +++ b/website/src/lib/hooks/use-direction.ts @@ -0,0 +1,7 @@ +import { useEffect } from 'react'; + +export function useDirection(layout: string) { + useEffect(() => { + document.documentElement.dir = layout; + }, [layout]); +} diff --git a/website/src/lib/hooks/use-is-dark-mode.ts b/website/src/lib/hooks/use-is-dark-mode.ts new file mode 100644 index 000000000..c3b0ee600 --- /dev/null +++ b/website/src/lib/hooks/use-is-dark-mode.ts @@ -0,0 +1,9 @@ +import { useTheme } from 'next-themes'; + +export function useIsDarkMode() { + const { resolvedTheme } = useTheme(); + + return { + isDarkMode: resolvedTheme === 'dark', + }; +} diff --git a/website/src/lib/hooks/use-is-mounted.ts b/website/src/lib/hooks/use-is-mounted.ts new file mode 100644 index 000000000..abcb44ef0 --- /dev/null +++ b/website/src/lib/hooks/use-is-mounted.ts @@ -0,0 +1,8 @@ +'use client' +import { useEffect, useState } from 'react'; + +export function useIsMounted() { + const [mounted, setMounted] = useState(false); + useEffect(() => setMounted(true), []); + return mounted; +} diff --git a/website/src/lib/hooks/use-local-storage.ts b/website/src/lib/hooks/use-local-storage.ts new file mode 100644 index 000000000..a0dbcac61 --- /dev/null +++ b/website/src/lib/hooks/use-local-storage.ts @@ -0,0 +1 @@ +export { default as useLocalStorage } from 'react-use/lib/useLocalStorage'; diff --git a/website/src/lib/hooks/use-measure.ts b/website/src/lib/hooks/use-measure.ts new file mode 100644 index 000000000..acf58cda9 --- /dev/null +++ b/website/src/lib/hooks/use-measure.ts @@ -0,0 +1 @@ +export { default as useMeasure } from 'react-use/lib/useMeasure'; diff --git a/website/src/lib/hooks/use-state-callback.ts b/website/src/lib/hooks/use-state-callback.ts new file mode 100644 index 000000000..dd17eb5dc --- /dev/null +++ b/website/src/lib/hooks/use-state-callback.ts @@ -0,0 +1,25 @@ +import { useCallback, useEffect, useRef, useState } from "react"; + + +export function useStateCallback( + initialState: T +): [T, (state: T, cb?: (state: T) => void) => void] { + const [state, setState] = useState(initialState); + const cbRef = useRef<((state: T) => void) | undefined>(undefined); // init mutable ref container for callbacks + + const setStateCallback = useCallback((state: T, cb?: (state: T) => void) => { + cbRef.current = cb; // store current, passed callback in ref + setState(state); + }, []); // keep object reference stable, exactly like `useState` + + useEffect(() => { + // cb.current is `undefined` on initial render, + // so we only invoke callback on state *updates* + if (cbRef.current) { + cbRef.current(state); + cbRef.current = undefined; // reset callback after execution + } + }, [state]); + + return [state, setStateCallback]; +} \ No newline at end of file diff --git a/website/src/lib/hooks/use-theme-color.ts b/website/src/lib/hooks/use-theme-color.ts new file mode 100644 index 000000000..d2387c403 --- /dev/null +++ b/website/src/lib/hooks/use-theme-color.ts @@ -0,0 +1,17 @@ +import { useEffect } from 'react'; + +function hexToRGB(hex: string) { + const r = parseInt(hex.slice(1, 3), 16); + const g = parseInt(hex.slice(3, 5), 16); + const b = parseInt(hex.slice(5, 7), 16); + + return `${r} ${g} ${b}`; +} + +export function useThemeColor(color: string) { + useEffect(() => { + const rgbColor = hexToRGB(color); + + document.documentElement.style.setProperty('--color-brand', rgbColor); + }, [color]); +} diff --git a/website/src/lib/hooks/use-window-scroll.ts b/website/src/lib/hooks/use-window-scroll.ts new file mode 100644 index 000000000..30b6c292d --- /dev/null +++ b/website/src/lib/hooks/use-window-scroll.ts @@ -0,0 +1 @@ +export { default as useWindowScroll } from 'react-use/lib/useWindowScroll'; diff --git a/website/src/lib/polygon-worker/accounts.ts b/website/src/lib/polygon-worker/accounts.ts new file mode 100644 index 000000000..1cfebf1d0 --- /dev/null +++ b/website/src/lib/polygon-worker/accounts.ts @@ -0,0 +1,8 @@ +// import { AccountsBuilder } from '@/workers/accounts'; +// import { spawn, Thread, Worker } from 'threads'; + +export const createBasicAccount = async () => { + const worker = new Worker('src/workers/accounts.ts', { type : "module" }) + const num = worker.postMessage(2) + return num +} \ No newline at end of file diff --git a/website/src/lib/wasm.ts b/website/src/lib/wasm.ts new file mode 100644 index 000000000..4d52f5a5e --- /dev/null +++ b/website/src/lib/wasm.ts @@ -0,0 +1,11 @@ +// import init, * as wasm from 'wasm'; + +// let wasmModule: typeof wasm; + +// export async function initializeWasmAndWebClient() { +// if (!wasmModule) { +// await init(); +// wasmModule = wasm; +// } +// return wasmModule +// } diff --git a/website/src/workers/accounts.ts b/website/src/workers/accounts.ts new file mode 100644 index 000000000..f6f72444b --- /dev/null +++ b/website/src/workers/accounts.ts @@ -0,0 +1,33 @@ +import { WebClient } from "@demox-labs/miden-sdk"; + +addEventListener('message', async (event) => { + console.log('worker received message', event.data) + const webClient = new WebClient(); + await webClient.create_client(); + console.log() + switch (event.data) { + case "createAccount": + const accountId = await webClient.new_wallet("OffChain", true); + console.log('account created', accountId); + postMessage({ type: "createAccount", accountId }); + break; + // case "fetchAccounts": + // const accounts = await webClient.get_accounts(); + // console.log('accounts fetched', accounts); + // postMessage({ type: "fetchAccounts", accounts: accounts }); + // break; + default: + console.log('invalid message:', event.data); + postMessage(''); + break; + } + // await init(); + // console.log('webClient', webClient) + // await webClient.create_client(); + // const basicMutableTemplate = { + // type: "BasicMutable", + // storage_mode: "Local" + // }; + // await webClient.new_wallet("OffChain", true); + // postMessage('done') +}) \ No newline at end of file diff --git a/website/tailwind.config.js b/website/tailwind.config.js new file mode 100644 index 000000000..f08b3e259 --- /dev/null +++ b/website/tailwind.config.js @@ -0,0 +1,125 @@ +module.exports = { + content: [ + './src/app/**/*.{js,ts,jsx,tsx}', + './src/components/**/*.{js,ts,jsx,tsx}', + './src/layouts/**/*.{js,ts,jsx,tsx}', + ], + darkMode: 'class', + theme: { + screens: { + xs: '500px', + sm: '640px', + md: '768px', + lg: '1024px', + xl: '1280px', + '2xl': '1440px', + '3xl': '1780px', + '4xl': '2160px', // only need to control product grid mode in ultra 4k device + }, + extend: { + colors: { + brand: 'rgb(var(--color-brand) / )', + body: '#fcfcfc', + dark: '#0D1321', + 'light-dark': '#171e2e', + }, + spacing: { + 13: '3.375rem', + }, + margin: { + '1/2': '50%', + }, + padding: { + full: '100%', + }, + width: { + 'calc-320': 'calc(100% - 320px)', + 'calc-358': 'calc(100% - 358px)', + }, + fontFamily: { + body: ['Fira Code', 'monospace'], + }, + fontSize: { + '13px': ['13px', '18px'], + }, + borderWidth: { + 3: '3px', + }, + boxShadow: { + main: '0px 6px 18px rgba(0, 0, 0, 0.04)', + light: '0px 4px 4px rgba(0, 0, 0, 0.08)', + large: '0px 8px 16px rgba(17, 24, 39, 0.1)', + card: '0px 2px 6px rgba(0, 0, 0, 0.06)', + transaction: '0px 8px 16px rgba(17, 24, 39, 0.06)', + button: + '0px 2px 4px rgba(0, 0, 0, 0.06), 0px 4px 6px rgba(0, 0, 0, 0.1)', + }, + dropShadow: { + main: '0px 4px 8px rgba(0, 0, 0, 0.08)', + }, + backgroundImage: { + 'gradient-radial': 'radial-gradient(var(--tw-gradient-stops))', + }, + animation: { + blink: 'blink 1.4s infinite both;', + 'move-up': 'moveUp 500ms infinite alternate', + 'scale-up': 'scaleUp 500ms infinite alternate', + 'drip-expand': 'expand 500ms ease-in forwards', + 'drip-expand-large': 'expand-large 600ms ease-in forwards', + 'move-up-small': 'moveUpSmall 500ms infinite alternate', + }, + keyframes: { + blink: { + '0%': { opacity: 0.2 }, + '20%': { opacity: 1 }, + '100%': { opacity: 0.2 }, + }, + expand: { + '0%': { + opacity: 0, + transform: 'scale(1)', + }, + '30%': { + opacity: 1, + }, + '80%': { + opacity: 0.5, + }, + '100%': { + transform: 'scale(30)', + opacity: 0, + }, + }, + 'expand-large': { + '0%': { + opacity: 0, + transform: 'scale(1)', + }, + '30%': { + opacity: 1, + }, + '80%': { + opacity: 0.5, + }, + '100%': { + transform: 'scale(96)', + opacity: 0, + }, + }, + moveUp: { + '0%': { transform: 'translateY(0)' }, + '100%': { transform: 'translateY(-20px)' }, + }, + moveUpSmall: { + '0%': { transform: 'translateY(0)' }, + '100%': { transform: 'translateY(-10px)' }, + }, + scaleUp: { + '0%': { transform: 'scale(0)' }, + '100%': { transform: 'scale(1)' }, + }, + }, + }, + }, + plugins: [require('@tailwindcss/typography'), require('@tailwindcss/forms')], +}; diff --git a/website/tailwind.config.ts b/website/tailwind.config.ts deleted file mode 100644 index e9a0944e7..000000000 --- a/website/tailwind.config.ts +++ /dev/null @@ -1,20 +0,0 @@ -import type { Config } from "tailwindcss"; - -const config: Config = { - content: [ - "./src/pages/**/*.{js,ts,jsx,tsx,mdx}", - "./src/components/**/*.{js,ts,jsx,tsx,mdx}", - "./src/app/**/*.{js,ts,jsx,tsx,mdx}", - ], - theme: { - extend: { - backgroundImage: { - "gradient-radial": "radial-gradient(var(--tw-gradient-stops))", - "gradient-conic": - "conic-gradient(from 180deg at 50% 50%, var(--tw-gradient-stops))", - }, - }, - }, - plugins: [], -}; -export default config; diff --git a/website/tsconfig.json b/website/tsconfig.json index 7b2858930..e50c259b1 100644 --- a/website/tsconfig.json +++ b/website/tsconfig.json @@ -1,13 +1,20 @@ { + "presets": [ + ["@babel/preset-env", { "modules": false }] + ], "compilerOptions": { - "lib": ["dom", "dom.iterable", "esnext"], + "target": "esnext", + "lib": [ + "dom", + "dom.iterable", + "esnext" + ], "allowJs": true, "skipLibCheck": true, "strict": true, "noEmit": true, "esModuleInterop": true, "module": "esnext", - "moduleResolution": "bundler", "resolveJsonModule": true, "isolatedModules": true, "jsx": "preserve", @@ -18,9 +25,19 @@ } ], "paths": { - "@/*": ["./src/*"] - } + "@/*": [ + "./src/*" + ] + }, + "moduleResolution": "node" }, - "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], - "exclude": ["node_modules"] + "include": [ + "next-env.d.ts", + "**/*.ts", + "**/*.tsx", + ".next/types/**/*.ts" + ], + "exclude": [ + "node_modules" + ] } diff --git a/website/tsconfig.worker.json b/website/tsconfig.worker.json new file mode 100644 index 000000000..0ad4010d2 --- /dev/null +++ b/website/tsconfig.worker.json @@ -0,0 +1,11 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "./public/workers", + "module": "ES6", + "noEmit": false + }, + "include": [ + "src/workers/**/*.ts" + ] +} \ No newline at end of file diff --git a/website/yarn.lock b/website/yarn.lock new file mode 100644 index 000000000..79d743517 --- /dev/null +++ b/website/yarn.lock @@ -0,0 +1,3055 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@alloc/quick-lru@^5.2.0": + version "5.2.0" + resolved "https://registry.yarnpkg.com/@alloc/quick-lru/-/quick-lru-5.2.0.tgz#7bf68b20c0a350f936915fcae06f58e32007ce30" + integrity sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw== + +"@babel/runtime@^7.1.2", "@babel/runtime@^7.23.2": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.7.tgz#f4f0d5530e8dbdf59b3451b9b3e594b6ba082e12" + integrity sha512-UwgBRMjJP+xv857DCngvqXI3Iq6J4v0wXmwc6sapg+zyhbwmQX67LUEFrkK5tbyJ30jGuG3ZvWpBiB9LCy1kWw== + dependencies: + regenerator-runtime "^0.14.0" + +"@demox-labs/miden-sdk@file:../wasm/dist": + version "0.0.0" + +"@eslint-community/eslint-utils@^4.2.0": + version "4.4.0" + resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" + integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== + dependencies: + eslint-visitor-keys "^3.3.0" + +"@eslint-community/regexpp@^4.6.1": + version "4.10.1" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.10.1.tgz#361461e5cb3845d874e61731c11cfedd664d83a0" + integrity sha512-Zm2NGpWELsQAD1xsJzGQpYfvICSsFkEpU0jxBjfdC6uNEWXcHnfs9hScFWtXVDVl+rBQJGrl4g1vcKIejpH9dA== + +"@eslint/eslintrc@^2.1.4": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz#388a269f0f25c1b6adc317b5a2c55714894c70ad" + integrity sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ== + dependencies: + ajv "^6.12.4" + debug "^4.3.2" + espree "^9.6.0" + globals "^13.19.0" + ignore "^5.2.0" + import-fresh "^3.2.1" + js-yaml "^4.1.0" + minimatch "^3.1.2" + strip-json-comments "^3.1.1" + +"@eslint/js@8.57.0": + version "8.57.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.0.tgz#a5417ae8427873f1dd08b70b3574b453e67b5f7f" + integrity sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g== + +"@humanwhocodes/config-array@^0.11.14": + version "0.11.14" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.14.tgz#d78e481a039f7566ecc9660b4ea7fe6b1fec442b" + integrity sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg== + dependencies: + "@humanwhocodes/object-schema" "^2.0.2" + debug "^4.3.1" + minimatch "^3.0.5" + +"@humanwhocodes/module-importer@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" + integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== + +"@humanwhocodes/object-schema@^2.0.2": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz#4a2868d75d6d6963e423bcf90b7fd1be343409d3" + integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA== + +"@isaacs/cliui@^8.0.2": + version "8.0.2" + resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" + integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== + dependencies: + string-width "^5.1.2" + string-width-cjs "npm:string-width@^4.2.0" + strip-ansi "^7.0.1" + strip-ansi-cjs "npm:strip-ansi@^6.0.1" + wrap-ansi "^8.1.0" + wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" + +"@jridgewell/gen-mapping@^0.3.2": + version "0.3.5" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz#dcce6aff74bdf6dad1a95802b69b04a2fcb1fb36" + integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg== + dependencies: + "@jridgewell/set-array" "^1.2.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.24" + +"@jridgewell/resolve-uri@^3.1.0": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" + integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== + +"@jridgewell/set-array@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" + integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== + +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.4.15": + version "1.4.15" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" + integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== + +"@jridgewell/trace-mapping@^0.3.24": + version "0.3.25" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" + integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== + dependencies: + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" + +"@next/env@14.2.3": + version "14.2.3" + resolved "https://registry.yarnpkg.com/@next/env/-/env-14.2.3.tgz#d6def29d1c763c0afb397343a15a82e7d92353a0" + integrity sha512-W7fd7IbkfmeeY2gXrzJYDx8D2lWKbVoTIj1o1ScPHNzvp30s1AuoEFSdr39bC5sjxJaxTtq3OTCZboNp0lNWHA== + +"@next/eslint-plugin-next@14.1.4": + version "14.1.4" + resolved "https://registry.yarnpkg.com/@next/eslint-plugin-next/-/eslint-plugin-next-14.1.4.tgz#d7372b5ffede0e466af8af2ff534386418827fc8" + integrity sha512-n4zYNLSyCo0Ln5b7qxqQeQ34OZKXwgbdcx6kmkQbywr+0k6M3Vinft0T72R6CDAcDrne2IAgSud4uWCzFgc5HA== + dependencies: + glob "10.3.10" + +"@next/swc-darwin-arm64@14.2.3": + version "14.2.3" + resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.3.tgz#db1a05eb88c0224089b815ad10ac128ec79c2cdb" + integrity sha512-3pEYo/RaGqPP0YzwnlmPN2puaF2WMLM3apt5jLW2fFdXD9+pqcoTzRk+iZsf8ta7+quAe4Q6Ms0nR0SFGFdS1A== + +"@next/swc-darwin-x64@14.2.3": + version "14.2.3" + resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.3.tgz#a3f8af05b5f9a52ac3082e66ac29e125ab1d7b9c" + integrity sha512-6adp7waE6P1TYFSXpY366xwsOnEXM+y1kgRpjSRVI2CBDOcbRjsJ67Z6EgKIqWIue52d2q/Mx8g9MszARj8IEA== + +"@next/swc-linux-arm64-gnu@14.2.3": + version "14.2.3" + resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.3.tgz#4e63f43879285b52554bfd39e6e0cc78a9b27bbf" + integrity sha512-cuzCE/1G0ZSnTAHJPUT1rPgQx1w5tzSX7POXSLaS7w2nIUJUD+e25QoXD/hMfxbsT9rslEXugWypJMILBj/QsA== + +"@next/swc-linux-arm64-musl@14.2.3": + version "14.2.3" + resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.3.tgz#ebdaed26214448b1e6f2c3e8b3cd29bfba387990" + integrity sha512-0D4/oMM2Y9Ta3nGuCcQN8jjJjmDPYpHX9OJzqk42NZGJocU2MqhBq5tWkJrUQOQY9N+In9xOdymzapM09GeiZw== + +"@next/swc-linux-x64-gnu@14.2.3": + version "14.2.3" + resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.3.tgz#19e3bcc137c3b582a1ab867106817e5c90a20593" + integrity sha512-ENPiNnBNDInBLyUU5ii8PMQh+4XLr4pG51tOp6aJ9xqFQ2iRI6IH0Ds2yJkAzNV1CfyagcyzPfROMViS2wOZ9w== + +"@next/swc-linux-x64-musl@14.2.3": + version "14.2.3" + resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.3.tgz#794a539b98e064169cf0ff7741b2a4fb16adec7d" + integrity sha512-BTAbq0LnCbF5MtoM7I/9UeUu/8ZBY0i8SFjUMCbPDOLv+un67e2JgyN4pmgfXBwy/I+RHu8q+k+MCkDN6P9ViQ== + +"@next/swc-win32-arm64-msvc@14.2.3": + version "14.2.3" + resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.3.tgz#eda9fa0fbf1ff9113e87ac2668ee67ce9e5add5a" + integrity sha512-AEHIw/dhAMLNFJFJIJIyOFDzrzI5bAjI9J26gbO5xhAKHYTZ9Or04BesFPXiAYXDNdrwTP2dQceYA4dL1geu8A== + +"@next/swc-win32-ia32-msvc@14.2.3": + version "14.2.3" + resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.3.tgz#7c1190e3f640ab16580c6bdbd7d0e766b9920457" + integrity sha512-vga40n1q6aYb0CLrM+eEmisfKCR45ixQYXuBXxOOmmoV8sYST9k7E3US32FsY+CkkF7NtzdcebiFT4CHuMSyZw== + +"@next/swc-win32-x64-msvc@14.2.3": + version "14.2.3" + resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.3.tgz#2be4e39ee25bfbd85be78eea17c0e7751dc4323c" + integrity sha512-Q1/zm43RWynxrO7lW4ehciQVj+5ePBhOK+/K2P7pLFX3JaJ/IZVC69SHidrmZSOkqz7ECIOhhy7XhAFG4JYyHA== + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": + version "1.2.8" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@pkgjs/parseargs@^0.11.0": + version "0.11.0" + resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" + integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== + +"@rushstack/eslint-patch@^1.3.3": + version "1.10.3" + resolved "https://registry.yarnpkg.com/@rushstack/eslint-patch/-/eslint-patch-1.10.3.tgz#391d528054f758f81e53210f1a1eebcf1a8b1d20" + integrity sha512-qC/xYId4NMebE6w/V33Fh9gWxLgURiNYgVNObbJl2LZv0GUUItCcCqC5axQSwRaAgaxl2mELq1rMzlswaQ0Zxg== + +"@swc/counter@^0.1.3": + version "0.1.3" + resolved "https://registry.yarnpkg.com/@swc/counter/-/counter-0.1.3.tgz#cc7463bd02949611c6329596fccd2b0ec782b0e9" + integrity sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ== + +"@swc/helpers@0.5.5": + version "0.5.5" + resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.5.5.tgz#12689df71bfc9b21c4f4ca00ae55f2f16c8b77c0" + integrity sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A== + dependencies: + "@swc/counter" "^0.1.3" + tslib "^2.4.0" + +"@tailwindcss/forms@^0.5.7": + version "0.5.7" + resolved "https://registry.yarnpkg.com/@tailwindcss/forms/-/forms-0.5.7.tgz#db5421f062a757b5f828bc9286ba626c6685e821" + integrity sha512-QE7X69iQI+ZXwldE+rzasvbJiyV/ju1FGHH0Qn2W3FKbuYtqp8LKcy6iSw79fVUT5/Vvf+0XgLCeYVG+UV6hOw== + dependencies: + mini-svg-data-uri "^1.2.3" + +"@tailwindcss/typography@^0.5.13": + version "0.5.13" + resolved "https://registry.yarnpkg.com/@tailwindcss/typography/-/typography-0.5.13.tgz#cd788a4fa4d0ca2506e242d512f377b22c1f7932" + integrity sha512-ADGcJ8dX21dVVHIwTRgzrcunY6YY9uSlAHHGVKvkA+vLc5qLwEszvKts40lx7z0qc4clpjclwLeK5rVCV2P/uw== + dependencies: + lodash.castarray "^4.4.0" + lodash.isplainobject "^4.0.6" + lodash.merge "^4.6.2" + postcss-selector-parser "6.0.10" + +"@types/js-cookie@^2.2.6": + version "2.2.7" + resolved "https://registry.yarnpkg.com/@types/js-cookie/-/js-cookie-2.2.7.tgz#226a9e31680835a6188e887f3988e60c04d3f6a3" + integrity sha512-aLkWa0C0vO5b4Sr798E26QgOkss68Un0bLjs7u9qxzPT5CG+8DuNTffWES58YzJs3hrVAOs1wonycqEBqNJubA== + +"@types/json5@^0.0.29": + version "0.0.29" + resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" + integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== + +"@types/node@^20": + version "20.14.2" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.14.2.tgz#a5f4d2bcb4b6a87bffcaa717718c5a0f208f4a18" + integrity sha512-xyu6WAMVwv6AKFLB+e/7ySZVr/0zLCzOa7rSpq6jNwpqOrUbcACDWC+53d4n2QHOnDou0fbIsg8wZu/sxrnI4Q== + dependencies: + undici-types "~5.26.4" + +"@types/prop-types@*": + version "15.7.12" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.12.tgz#12bb1e2be27293c1406acb6af1c3f3a1481d98c6" + integrity sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q== + +"@types/react-dom@^18": + version "18.3.0" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.3.0.tgz#0cbc818755d87066ab6ca74fbedb2547d74a82b0" + integrity sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg== + dependencies: + "@types/react" "*" + +"@types/react@*", "@types/react@^18": + version "18.3.3" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.3.3.tgz#9679020895318b0915d7a3ab004d92d33375c45f" + integrity sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw== + dependencies: + "@types/prop-types" "*" + csstype "^3.0.2" + +"@typescript-eslint/parser@^5.4.2 || ^6.0.0": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-6.21.0.tgz#af8fcf66feee2edc86bc5d1cf45e33b0630bf35b" + integrity sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ== + dependencies: + "@typescript-eslint/scope-manager" "6.21.0" + "@typescript-eslint/types" "6.21.0" + "@typescript-eslint/typescript-estree" "6.21.0" + "@typescript-eslint/visitor-keys" "6.21.0" + debug "^4.3.4" + +"@typescript-eslint/scope-manager@6.21.0": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz#ea8a9bfc8f1504a6ac5d59a6df308d3a0630a2b1" + integrity sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg== + dependencies: + "@typescript-eslint/types" "6.21.0" + "@typescript-eslint/visitor-keys" "6.21.0" + +"@typescript-eslint/types@6.21.0": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-6.21.0.tgz#205724c5123a8fef7ecd195075fa6e85bac3436d" + integrity sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg== + +"@typescript-eslint/typescript-estree@6.21.0": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz#c47ae7901db3b8bddc3ecd73daff2d0895688c46" + integrity sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ== + dependencies: + "@typescript-eslint/types" "6.21.0" + "@typescript-eslint/visitor-keys" "6.21.0" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + minimatch "9.0.3" + semver "^7.5.4" + ts-api-utils "^1.0.1" + +"@typescript-eslint/visitor-keys@6.21.0": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz#87a99d077aa507e20e238b11d56cc26ade45fe47" + integrity sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A== + dependencies: + "@typescript-eslint/types" "6.21.0" + eslint-visitor-keys "^3.4.1" + +"@ungap/structured-clone@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" + integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== + +"@xobotyi/scrollbar-width@^1.9.5": + version "1.9.5" + resolved "https://registry.yarnpkg.com/@xobotyi/scrollbar-width/-/scrollbar-width-1.9.5.tgz#80224a6919272f405b87913ca13b92929bdf3c4d" + integrity sha512-N8tkAACJx2ww8vFMneJmaAgmjAG1tnVBZJRLRcx061tmsLRZHSEZSLuGWnwPtunsSLvSqXQ2wfp7Mgqg1I+2dQ== + +acorn-jsx@^5.3.2: + version "5.3.2" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + +acorn@^8.9.0: + version "8.11.3" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a" + integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== + +ajv@^6.12.4: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-regex@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" + integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +ansi-styles@^6.1.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" + integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== + +any-promise@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" + integrity sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A== + +anymatch@~3.1.2: + version "3.1.3" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +arg@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/arg/-/arg-5.0.2.tgz#c81433cc427c92c4dcf4865142dbca6f15acd59c" + integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg== + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +aria-query@^5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.3.0.tgz#650c569e41ad90b51b3d7df5e5eed1c7549c103e" + integrity sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A== + dependencies: + dequal "^2.0.3" + +array-buffer-byte-length@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz#1e5583ec16763540a27ae52eed99ff899223568f" + integrity sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg== + dependencies: + call-bind "^1.0.5" + is-array-buffer "^3.0.4" + +array-includes@^3.1.6, array-includes@^3.1.7, array-includes@^3.1.8: + version "3.1.8" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.8.tgz#5e370cbe172fdd5dd6530c1d4aadda25281ba97d" + integrity sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-object-atoms "^1.0.0" + get-intrinsic "^1.2.4" + is-string "^1.0.7" + +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + +array.prototype.findlast@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz#3e4fbcb30a15a7f5bf64cf2faae22d139c2e4904" + integrity sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + es-shim-unscopables "^1.0.2" + +array.prototype.findlastindex@^1.2.3: + version "1.2.5" + resolved "https://registry.yarnpkg.com/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz#8c35a755c72908719453f87145ca011e39334d0d" + integrity sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + es-shim-unscopables "^1.0.2" + +array.prototype.flat@^1.3.1, array.prototype.flat@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz#1476217df8cff17d72ee8f3ba06738db5b387d18" + integrity sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + es-shim-unscopables "^1.0.0" + +array.prototype.flatmap@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz#c9a7c6831db8e719d6ce639190146c24bbd3e527" + integrity sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + es-shim-unscopables "^1.0.0" + +array.prototype.toreversed@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/array.prototype.toreversed/-/array.prototype.toreversed-1.1.2.tgz#b989a6bf35c4c5051e1dc0325151bf8088954eba" + integrity sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + es-shim-unscopables "^1.0.0" + +array.prototype.tosorted@^1.1.3: + version "1.1.4" + resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz#fe954678ff53034e717ea3352a03f0b0b86f7ffc" + integrity sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.3" + es-errors "^1.3.0" + es-shim-unscopables "^1.0.2" + +arraybuffer.prototype.slice@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz#097972f4255e41bc3425e37dc3f6421cf9aefde6" + integrity sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A== + dependencies: + array-buffer-byte-length "^1.0.1" + call-bind "^1.0.5" + define-properties "^1.2.1" + es-abstract "^1.22.3" + es-errors "^1.2.1" + get-intrinsic "^1.2.3" + is-array-buffer "^3.0.4" + is-shared-array-buffer "^1.0.2" + +ast-types-flow@^0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.8.tgz#0a85e1c92695769ac13a428bb653e7538bea27d6" + integrity sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ== + +autoprefixer@^10.0.1: + version "10.4.19" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.19.tgz#ad25a856e82ee9d7898c59583c1afeb3fa65f89f" + integrity sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew== + dependencies: + browserslist "^4.23.0" + caniuse-lite "^1.0.30001599" + fraction.js "^4.3.7" + normalize-range "^0.1.2" + picocolors "^1.0.0" + postcss-value-parser "^4.2.0" + +available-typed-arrays@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846" + integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ== + dependencies: + possible-typed-array-names "^1.0.0" + +axe-core@=4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.7.0.tgz#34ba5a48a8b564f67e103f0aa5768d76e15bbbbf" + integrity sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ== + +axobject-query@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-3.2.1.tgz#39c378a6e3b06ca679f29138151e45b2b32da62a" + integrity sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg== + dependencies: + dequal "^2.0.3" + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +binary-extensions@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" + integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + +braces@^3.0.3, braces@~3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" + integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== + dependencies: + fill-range "^7.1.1" + +browserslist@^4.23.0: + version "4.23.0" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.0.tgz#8f3acc2bbe73af7213399430890f86c63a5674ab" + integrity sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ== + dependencies: + caniuse-lite "^1.0.30001587" + electron-to-chromium "^1.4.668" + node-releases "^2.0.14" + update-browserslist-db "^1.0.13" + +busboy@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/busboy/-/busboy-1.6.0.tgz#966ea36a9502e43cdb9146962523b92f531f6893" + integrity sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA== + dependencies: + streamsearch "^1.1.0" + +call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" + integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== + dependencies: + es-define-property "^1.0.0" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + set-function-length "^1.2.1" + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camelcase-css@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/camelcase-css/-/camelcase-css-2.0.1.tgz#ee978f6947914cc30c6b44741b6ed1df7f043fd5" + integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== + +caniuse-lite@^1.0.30001579, caniuse-lite@^1.0.30001587, caniuse-lite@^1.0.30001599: + version "1.0.30001628" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001628.tgz#90b6cd85ddc2e9f831de0225f4ca5a130c8d8222" + integrity sha512-S3BnR4Kh26TBxbi5t5kpbcUlLJb9lhtDXISDPwOfI+JoC+ik0QksvkZtUVyikw3hjnkgkMPSJ8oIM9yMm9vflA== + +chalk@^4.0.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chokidar@^3.5.3: + version "3.6.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" + integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +classnames@^2.5.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.5.1.tgz#ba774c614be0f016da105c858e7159eae8e7687b" + integrity sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow== + +client-only@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/client-only/-/client-only-0.0.1.tgz#38bba5d403c41ab150bff64a95c85013cf73bca1" + integrity sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA== + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +commander@^4.0.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" + integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +copy-to-clipboard@^3.3.1: + version "3.3.3" + resolved "https://registry.yarnpkg.com/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz#55ac43a1db8ae639a4bd99511c148cdd1b83a1b0" + integrity sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA== + dependencies: + toggle-selection "^1.0.6" + +cross-spawn@^7.0.0, cross-spawn@^7.0.2: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +css-in-js-utils@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/css-in-js-utils/-/css-in-js-utils-3.1.0.tgz#640ae6a33646d401fc720c54fc61c42cd76ae2bb" + integrity sha512-fJAcud6B3rRu+KHYk+Bwf+WFL2MDCJJ1XG9x137tJQ0xYxor7XziQtuGFbWNdqrvF4Tk26O3H73nfVqXt/fW1A== + dependencies: + hyphenate-style-name "^1.0.3" + +css-tree@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.1.3.tgz#eb4870fb6fd7707327ec95c2ff2ab09b5e8db91d" + integrity sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q== + dependencies: + mdn-data "2.0.14" + source-map "^0.6.1" + +cssesc@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" + integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== + +csstype@^3.0.2, csstype@^3.1.2: + version "3.1.3" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81" + integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== + +damerau-levenshtein@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz#b43d286ccbd36bc5b2f7ed41caf2d0aba1f8a6e7" + integrity sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA== + +data-view-buffer@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/data-view-buffer/-/data-view-buffer-1.0.1.tgz#8ea6326efec17a2e42620696e671d7d5a8bc66b2" + integrity sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA== + dependencies: + call-bind "^1.0.6" + es-errors "^1.3.0" + is-data-view "^1.0.1" + +data-view-byte-length@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz#90721ca95ff280677eb793749fce1011347669e2" + integrity sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ== + dependencies: + call-bind "^1.0.7" + es-errors "^1.3.0" + is-data-view "^1.0.1" + +data-view-byte-offset@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz#5e0bbfb4828ed2d1b9b400cd8a7d119bca0ff18a" + integrity sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA== + dependencies: + call-bind "^1.0.6" + es-errors "^1.3.0" + is-data-view "^1.0.1" + +debug@^3.2.7: + version "3.2.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== + dependencies: + ms "^2.1.1" + +debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: + version "4.3.5" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.5.tgz#e83444eceb9fedd4a1da56d671ae2446a01a6e1e" + integrity sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg== + dependencies: + ms "2.1.2" + +deep-is@^0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== + +define-data-property@^1.0.1, define-data-property@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" + integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== + dependencies: + es-define-property "^1.0.0" + es-errors "^1.3.0" + gopd "^1.0.1" + +define-properties@^1.2.0, define-properties@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" + integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== + dependencies: + define-data-property "^1.0.1" + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" + +dequal@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" + integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== + +dexie-react-hooks@^1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/dexie-react-hooks/-/dexie-react-hooks-1.1.7.tgz#75bd92a609a7c3dc3643e2fd21e7db5df6df923b" + integrity sha512-Lwv5W0Hk+uOW3kGnsU9GZoR1er1B7WQ5DSdonoNG+focTNeJbHW6vi6nBoX534VKI3/uwHebYzSw1fwY6a7mTw== + +dexie@^4.0.1: + version "4.0.7" + resolved "https://registry.yarnpkg.com/dexie/-/dexie-4.0.7.tgz#c92e5032245fc075de58c636238a82ee3ff9fedb" + integrity sha512-M+Lo6rk4pekIfrc2T0o2tvVJwL6EAAM/B78DNfb8aaxFVoI1f8/rz5KTxuAnApkwqTSuxx7T5t0RKH7qprapGg== + +didyoumean@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/didyoumean/-/didyoumean-1.2.2.tgz#989346ffe9e839b4555ecf5666edea0d3e8ad037" + integrity sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw== + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +dlv@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/dlv/-/dlv-1.1.3.tgz#5c198a8a11453596e751494d49874bc7732f2e79" + integrity sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA== + +doctrine@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== + dependencies: + esutils "^2.0.2" + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + +eastasianwidth@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" + integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== + +electron-to-chromium@^1.4.668: + version "1.4.790" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.790.tgz#2a3a5509593745c5d65d8acd66b308f2a25da041" + integrity sha512-eVGeQxpaBYbomDBa/Mehrs28MdvCXfJmEFzaMFsv8jH/MJDLIylJN81eTJ5kvx7B7p18OiPK0BkC06lydEy63A== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +emoji-regex@^9.2.2: + version "9.2.2" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" + integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== + +enhanced-resolve@^5.12.0: + version "5.17.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.17.0.tgz#d037603789dd9555b89aaec7eb78845c49089bc5" + integrity sha512-dwDPwZL0dmye8Txp2gzFmA6sxALaSvdRDjPH0viLcKrtlOL3tw62nWWweVD1SdILDTJrbrL6tdWVN58Wo6U3eA== + dependencies: + graceful-fs "^4.2.4" + tapable "^2.2.0" + +error-stack-parser@^2.0.6: + version "2.1.4" + resolved "https://registry.yarnpkg.com/error-stack-parser/-/error-stack-parser-2.1.4.tgz#229cb01cdbfa84440bfa91876285b94680188286" + integrity sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ== + dependencies: + stackframe "^1.3.4" + +es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23.1, es-abstract@^1.23.2, es-abstract@^1.23.3: + version "1.23.3" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.23.3.tgz#8f0c5a35cd215312573c5a27c87dfd6c881a0aa0" + integrity sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A== + dependencies: + array-buffer-byte-length "^1.0.1" + arraybuffer.prototype.slice "^1.0.3" + available-typed-arrays "^1.0.7" + call-bind "^1.0.7" + data-view-buffer "^1.0.1" + data-view-byte-length "^1.0.1" + data-view-byte-offset "^1.0.0" + es-define-property "^1.0.0" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + es-set-tostringtag "^2.0.3" + es-to-primitive "^1.2.1" + function.prototype.name "^1.1.6" + get-intrinsic "^1.2.4" + get-symbol-description "^1.0.2" + globalthis "^1.0.3" + gopd "^1.0.1" + has-property-descriptors "^1.0.2" + has-proto "^1.0.3" + has-symbols "^1.0.3" + hasown "^2.0.2" + internal-slot "^1.0.7" + is-array-buffer "^3.0.4" + is-callable "^1.2.7" + is-data-view "^1.0.1" + is-negative-zero "^2.0.3" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.3" + is-string "^1.0.7" + is-typed-array "^1.1.13" + is-weakref "^1.0.2" + object-inspect "^1.13.1" + object-keys "^1.1.1" + object.assign "^4.1.5" + regexp.prototype.flags "^1.5.2" + safe-array-concat "^1.1.2" + safe-regex-test "^1.0.3" + string.prototype.trim "^1.2.9" + string.prototype.trimend "^1.0.8" + string.prototype.trimstart "^1.0.8" + typed-array-buffer "^1.0.2" + typed-array-byte-length "^1.0.1" + typed-array-byte-offset "^1.0.2" + typed-array-length "^1.0.6" + unbox-primitive "^1.0.2" + which-typed-array "^1.1.15" + +es-define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845" + integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ== + dependencies: + get-intrinsic "^1.2.4" + +es-errors@^1.2.1, es-errors@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" + integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== + +es-iterator-helpers@^1.0.15, es-iterator-helpers@^1.0.19: + version "1.0.19" + resolved "https://registry.yarnpkg.com/es-iterator-helpers/-/es-iterator-helpers-1.0.19.tgz#117003d0e5fec237b4b5c08aded722e0c6d50ca8" + integrity sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.3" + es-errors "^1.3.0" + es-set-tostringtag "^2.0.3" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + globalthis "^1.0.3" + has-property-descriptors "^1.0.2" + has-proto "^1.0.3" + has-symbols "^1.0.3" + internal-slot "^1.0.7" + iterator.prototype "^1.1.2" + safe-array-concat "^1.1.2" + +es-object-atoms@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.0.0.tgz#ddb55cd47ac2e240701260bc2a8e31ecb643d941" + integrity sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw== + dependencies: + es-errors "^1.3.0" + +es-set-tostringtag@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz#8bb60f0a440c2e4281962428438d58545af39777" + integrity sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ== + dependencies: + get-intrinsic "^1.2.4" + has-tostringtag "^1.0.2" + hasown "^2.0.1" + +es-shim-unscopables@^1.0.0, es-shim-unscopables@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz#1f6942e71ecc7835ed1c8a83006d8771a63a3763" + integrity sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw== + dependencies: + hasown "^2.0.0" + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + +escalade@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.2.tgz#54076e9ab29ea5bf3d8f1ed62acffbb88272df27" + integrity sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA== + +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +eslint-config-next@14.1.4: + version "14.1.4" + resolved "https://registry.yarnpkg.com/eslint-config-next/-/eslint-config-next-14.1.4.tgz#22f2ba4c0993e991249d863656a64c204bae542c" + integrity sha512-cihIahbhYAWwXJwZkAaRPpUi5t9aOi/HdfWXOjZeUOqNWXHD8X22kd1KG58Dc3MVaRx3HoR/oMGk2ltcrqDn8g== + dependencies: + "@next/eslint-plugin-next" "14.1.4" + "@rushstack/eslint-patch" "^1.3.3" + "@typescript-eslint/parser" "^5.4.2 || ^6.0.0" + eslint-import-resolver-node "^0.3.6" + eslint-import-resolver-typescript "^3.5.2" + eslint-plugin-import "^2.28.1" + eslint-plugin-jsx-a11y "^6.7.1" + eslint-plugin-react "^7.33.2" + eslint-plugin-react-hooks "^4.5.0 || 5.0.0-canary-7118f5dd7-20230705" + +eslint-import-resolver-node@^0.3.6, eslint-import-resolver-node@^0.3.9: + version "0.3.9" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz#d4eaac52b8a2e7c3cd1903eb00f7e053356118ac" + integrity sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g== + dependencies: + debug "^3.2.7" + is-core-module "^2.13.0" + resolve "^1.22.4" + +eslint-import-resolver-typescript@^3.5.2: + version "3.6.1" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.1.tgz#7b983680edd3f1c5bce1a5829ae0bc2d57fe9efa" + integrity sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg== + dependencies: + debug "^4.3.4" + enhanced-resolve "^5.12.0" + eslint-module-utils "^2.7.4" + fast-glob "^3.3.1" + get-tsconfig "^4.5.0" + is-core-module "^2.11.0" + is-glob "^4.0.3" + +eslint-module-utils@^2.7.4, eslint-module-utils@^2.8.0: + version "2.8.1" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz#52f2404300c3bd33deece9d7372fb337cc1d7c34" + integrity sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q== + dependencies: + debug "^3.2.7" + +eslint-plugin-import@^2.28.1: + version "2.29.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz#d45b37b5ef5901d639c15270d74d46d161150643" + integrity sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw== + dependencies: + array-includes "^3.1.7" + array.prototype.findlastindex "^1.2.3" + array.prototype.flat "^1.3.2" + array.prototype.flatmap "^1.3.2" + debug "^3.2.7" + doctrine "^2.1.0" + eslint-import-resolver-node "^0.3.9" + eslint-module-utils "^2.8.0" + hasown "^2.0.0" + is-core-module "^2.13.1" + is-glob "^4.0.3" + minimatch "^3.1.2" + object.fromentries "^2.0.7" + object.groupby "^1.0.1" + object.values "^1.1.7" + semver "^6.3.1" + tsconfig-paths "^3.15.0" + +eslint-plugin-jsx-a11y@^6.7.1: + version "6.8.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.8.0.tgz#2fa9c701d44fcd722b7c771ec322432857fcbad2" + integrity sha512-Hdh937BS3KdwwbBaKd5+PLCOmYY6U4f2h9Z2ktwtNKvIdIEu137rjYbcb9ApSbVJfWxANNuiKTD/9tOKjK9qOA== + dependencies: + "@babel/runtime" "^7.23.2" + aria-query "^5.3.0" + array-includes "^3.1.7" + array.prototype.flatmap "^1.3.2" + ast-types-flow "^0.0.8" + axe-core "=4.7.0" + axobject-query "^3.2.1" + damerau-levenshtein "^1.0.8" + emoji-regex "^9.2.2" + es-iterator-helpers "^1.0.15" + hasown "^2.0.0" + jsx-ast-utils "^3.3.5" + language-tags "^1.0.9" + minimatch "^3.1.2" + object.entries "^1.1.7" + object.fromentries "^2.0.7" + +"eslint-plugin-react-hooks@^4.5.0 || 5.0.0-canary-7118f5dd7-20230705": + version "4.6.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz#c829eb06c0e6f484b3fbb85a97e57784f328c596" + integrity sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ== + +eslint-plugin-react@^7.33.2: + version "7.34.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.34.2.tgz#2780a1a35a51aca379d86d29b9a72adc6bfe6b66" + integrity sha512-2HCmrU+/JNigDN6tg55cRDKCQWicYAPB38JGSFDQt95jDm8rrvSUo7YPkOIm5l6ts1j1zCvysNcasvfTMQzUOw== + dependencies: + array-includes "^3.1.8" + array.prototype.findlast "^1.2.5" + array.prototype.flatmap "^1.3.2" + array.prototype.toreversed "^1.1.2" + array.prototype.tosorted "^1.1.3" + doctrine "^2.1.0" + es-iterator-helpers "^1.0.19" + estraverse "^5.3.0" + jsx-ast-utils "^2.4.1 || ^3.0.0" + minimatch "^3.1.2" + object.entries "^1.1.8" + object.fromentries "^2.0.8" + object.hasown "^1.1.4" + object.values "^1.2.0" + prop-types "^15.8.1" + resolve "^2.0.0-next.5" + semver "^6.3.1" + string.prototype.matchall "^4.0.11" + +eslint-scope@^7.2.2: + version "7.2.2" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f" + integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== + dependencies: + esrecurse "^4.3.0" + estraverse "^5.2.0" + +eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: + version "3.4.3" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" + integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== + +eslint@^8: + version "8.57.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.0.tgz#c786a6fd0e0b68941aaf624596fb987089195668" + integrity sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@eslint-community/regexpp" "^4.6.1" + "@eslint/eslintrc" "^2.1.4" + "@eslint/js" "8.57.0" + "@humanwhocodes/config-array" "^0.11.14" + "@humanwhocodes/module-importer" "^1.0.1" + "@nodelib/fs.walk" "^1.2.8" + "@ungap/structured-clone" "^1.2.0" + ajv "^6.12.4" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.3.2" + doctrine "^3.0.0" + escape-string-regexp "^4.0.0" + eslint-scope "^7.2.2" + eslint-visitor-keys "^3.4.3" + espree "^9.6.1" + esquery "^1.4.2" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" + find-up "^5.0.0" + glob-parent "^6.0.2" + globals "^13.19.0" + graphemer "^1.4.0" + ignore "^5.2.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + is-path-inside "^3.0.3" + js-yaml "^4.1.0" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.4.1" + lodash.merge "^4.6.2" + minimatch "^3.1.2" + natural-compare "^1.4.0" + optionator "^0.9.3" + strip-ansi "^6.0.1" + text-table "^0.2.0" + +espree@^9.6.0, espree@^9.6.1: + version "9.6.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" + integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== + dependencies: + acorn "^8.9.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^3.4.1" + +esquery@^1.4.2: + version "1.5.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" + integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-glob@^3.2.9, fast-glob@^3.3.0, fast-glob@^3.3.1: + version "3.3.2" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" + integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + +fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-levenshtein@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== + +fast-loops@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/fast-loops/-/fast-loops-1.1.3.tgz#ce96adb86d07e7bf9b4822ab9c6fac9964981f75" + integrity sha512-8EZzEP0eKkEEVX+drtd9mtuQ+/QrlfW/5MlwcwK5Nds6EkZ/tRzEexkzUY2mIssnAyVLT+TKHuRXmFNNXYUd6g== + +fast-shallow-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fast-shallow-equal/-/fast-shallow-equal-1.0.0.tgz#d4dcaf6472440dcefa6f88b98e3251e27f25628b" + integrity sha512-HPtaa38cPgWvaCFmRNhlc6NG7pv6NUHqjPgVAkWGoB9mQMwYB27/K0CvOM5Czy+qpT3e8XJ6Q4aPAnzpNpzNaw== + +fastest-stable-stringify@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/fastest-stable-stringify/-/fastest-stable-stringify-2.0.2.tgz#3757a6774f6ec8de40c4e86ec28ea02417214c76" + integrity sha512-bijHueCGd0LqqNK9b5oCMHc0MluJAx0cwqASgbWMvkO01lCYgIhacVRLcaDz3QnyYIRNJRDwMb41VuT6pHJ91Q== + +fastq@^1.6.0: + version "1.17.1" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.17.1.tgz#2a523f07a4e7b1e81a42b91b8bf2254107753b47" + integrity sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w== + dependencies: + reusify "^1.0.4" + +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== + dependencies: + flat-cache "^3.0.4" + +fill-range@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" + integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== + dependencies: + to-regex-range "^5.0.1" + +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +flat-cache@^3.0.4: + version "3.2.0" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.2.0.tgz#2c0c2d5040c99b1632771a9d105725c0115363ee" + integrity sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw== + dependencies: + flatted "^3.2.9" + keyv "^4.5.3" + rimraf "^3.0.2" + +flatted@^3.2.9: + version "3.3.1" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.1.tgz#21db470729a6734d4997002f439cb308987f567a" + integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw== + +for-each@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" + integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== + dependencies: + is-callable "^1.1.3" + +foreground-child@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.1.1.tgz#1d173e776d75d2772fed08efe4a0de1ea1b12d0d" + integrity sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg== + dependencies: + cross-spawn "^7.0.0" + signal-exit "^4.0.1" + +fraction.js@^4.3.7: + version "4.3.7" + resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.3.7.tgz#06ca0085157e42fda7f9e726e79fefc4068840f7" + integrity sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew== + +framer-motion@^11.2.0: + version "11.2.10" + resolved "https://registry.yarnpkg.com/framer-motion/-/framer-motion-11.2.10.tgz#c8671e33e8f8d4abbd95efd20d3b8a888f457ed7" + integrity sha512-/gr3PLZUVFCc86a9MqCUboVrALscrdluzTb3yew+2/qKBU8CX6nzs918/SRBRCqaPbx0TZP10CB6yFgK2C5cYQ== + dependencies: + tslib "^2.4.0" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +fsevents@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== + +function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== + +function.prototype.name@^1.1.5, function.prototype.name@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.6.tgz#cdf315b7d90ee77a4c6ee216c3c3362da07533fd" + integrity sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + functions-have-names "^1.2.3" + +functions-have-names@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" + integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== + +get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" + integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== + dependencies: + es-errors "^1.3.0" + function-bind "^1.1.2" + has-proto "^1.0.1" + has-symbols "^1.0.3" + hasown "^2.0.0" + +get-symbol-description@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.2.tgz#533744d5aa20aca4e079c8e5daf7fd44202821f5" + integrity sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg== + dependencies: + call-bind "^1.0.5" + es-errors "^1.3.0" + get-intrinsic "^1.2.4" + +get-tsconfig@^4.5.0: + version "4.7.5" + resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.7.5.tgz#5e012498579e9a6947511ed0cd403272c7acbbaf" + integrity sha512-ZCuZCnlqNzjb4QprAzXKdpp/gh6KTxSJuw3IBsPnV/7fV4NxC9ckB+vPTt8w7fJA0TaSD7c55BR47JD6MEDyDw== + dependencies: + resolve-pkg-maps "^1.0.0" + +glob-parent@^5.1.2, glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob-parent@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + +glob@10.3.10: + version "10.3.10" + resolved "https://registry.yarnpkg.com/glob/-/glob-10.3.10.tgz#0351ebb809fd187fe421ab96af83d3a70715df4b" + integrity sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g== + dependencies: + foreground-child "^3.1.0" + jackspeak "^2.3.5" + minimatch "^9.0.1" + minipass "^5.0.0 || ^6.0.2 || ^7.0.0" + path-scurry "^1.10.1" + +glob@^10.3.10: + version "10.4.1" + resolved "https://registry.yarnpkg.com/glob/-/glob-10.4.1.tgz#0cfb01ab6a6b438177bfe6a58e2576f6efe909c2" + integrity sha512-2jelhlq3E4ho74ZyVLN03oKdAZVUa6UDZzFLVH1H7dnoax+y9qyaq8zBkfDIggjniU19z0wU18y16jMB2eyVIw== + dependencies: + foreground-child "^3.1.0" + jackspeak "^3.1.2" + minimatch "^9.0.4" + minipass "^7.1.2" + path-scurry "^1.11.1" + +glob@^7.1.3: + version "7.2.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + +globals@^13.19.0: + version "13.24.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.24.0.tgz#8432a19d78ce0c1e833949c36adb345400bb1171" + integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ== + dependencies: + type-fest "^0.20.2" + +globalthis@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.4.tgz#7430ed3a975d97bfb59bcce41f5cabbafa651236" + integrity sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ== + dependencies: + define-properties "^1.2.1" + gopd "^1.0.1" + +globby@^11.1.0: + version "11.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" + integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.2.9" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^3.0.0" + +gopd@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" + integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== + dependencies: + get-intrinsic "^1.1.3" + +graceful-fs@^4.2.11, graceful-fs@^4.2.4: + version "4.2.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + +graphemer@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" + integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== + +has-bigints@^1.0.1, has-bigints@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" + integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" + integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== + dependencies: + es-define-property "^1.0.0" + +has-proto@^1.0.1, has-proto@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.3.tgz#b31ddfe9b0e6e9914536a6ab286426d0214f77fd" + integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q== + +has-symbols@^1.0.2, has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + +has-tostringtag@^1.0.0, has-tostringtag@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" + integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== + dependencies: + has-symbols "^1.0.3" + +hasown@^2.0.0, hasown@^2.0.1, hasown@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" + integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== + dependencies: + function-bind "^1.1.2" + +hyphenate-style-name@^1.0.3: + version "1.0.5" + resolved "https://registry.yarnpkg.com/hyphenate-style-name/-/hyphenate-style-name-1.0.5.tgz#70b68605ee601b7142362239a0236159a8b2dc33" + integrity sha512-fedL7PRwmeVkgyhu9hLeTBaI6wcGk7JGJswdaRsa5aUbkXI1kr1xZwTPBtaYPpwf56878iDek6VbVnuWMebJmw== + +ignore@^5.2.0: + version "5.3.1" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.1.tgz#5073e554cd42c5b33b394375f538b8593e34d4ef" + integrity sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw== + +import-fresh@^3.2.1: + version "3.3.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +inline-style-prefixer@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/inline-style-prefixer/-/inline-style-prefixer-7.0.0.tgz#991d550735d42069f528ac1bcdacd378d1305442" + integrity sha512-I7GEdScunP1dQ6IM2mQWh6v0mOYdYmH3Bp31UecKdrcUgcURTcctSe1IECdUznSHKSmsHtjrT3CwCPI1pyxfUQ== + dependencies: + css-in-js-utils "^3.1.0" + fast-loops "^1.1.3" + +internal-slot@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.7.tgz#c06dcca3ed874249881007b0a5523b172a190802" + integrity sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g== + dependencies: + es-errors "^1.3.0" + hasown "^2.0.0" + side-channel "^1.0.4" + +is-array-buffer@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.4.tgz#7a1f92b3d61edd2bc65d24f130530ea93d7fae98" + integrity sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.1" + +is-async-function@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-async-function/-/is-async-function-2.0.0.tgz#8e4418efd3e5d3a6ebb0164c05ef5afb69aa9646" + integrity sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA== + dependencies: + has-tostringtag "^1.0.0" + +is-bigint@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" + integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== + dependencies: + has-bigints "^1.0.1" + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-boolean-object@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" + integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" + integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== + +is-core-module@^2.11.0, is-core-module@^2.13.0, is-core-module@^2.13.1: + version "2.13.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384" + integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw== + dependencies: + hasown "^2.0.0" + +is-data-view@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-data-view/-/is-data-view-1.0.1.tgz#4b4d3a511b70f3dc26d42c03ca9ca515d847759f" + integrity sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w== + dependencies: + is-typed-array "^1.1.13" + +is-date-object@^1.0.1, is-date-object@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" + integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== + dependencies: + has-tostringtag "^1.0.0" + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-finalizationregistry@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz#c8749b65f17c133313e661b1289b95ad3dbd62e6" + integrity sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw== + dependencies: + call-bind "^1.0.2" + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-generator-function@^1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" + integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== + dependencies: + has-tostringtag "^1.0.0" + +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-map@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.3.tgz#ede96b7fe1e270b3c4465e3a465658764926d62e" + integrity sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw== + +is-negative-zero@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.3.tgz#ced903a027aca6381b777a5743069d7376a49747" + integrity sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw== + +is-number-object@^1.0.4: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" + integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== + dependencies: + has-tostringtag "^1.0.0" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-path-inside@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" + integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== + +is-regex@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" + integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-set@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.3.tgz#8ab209ea424608141372ded6e0cb200ef1d9d01d" + integrity sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg== + +is-shared-array-buffer@^1.0.2, is-shared-array-buffer@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz#1237f1cba059cdb62431d378dcc37d9680181688" + integrity sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg== + dependencies: + call-bind "^1.0.7" + +is-string@^1.0.5, is-string@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" + integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== + dependencies: + has-tostringtag "^1.0.0" + +is-symbol@^1.0.2, is-symbol@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" + integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== + dependencies: + has-symbols "^1.0.2" + +is-typed-array@^1.1.13: + version "1.1.13" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.13.tgz#d6c5ca56df62334959322d7d7dd1cca50debe229" + integrity sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw== + dependencies: + which-typed-array "^1.1.14" + +is-weakmap@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.2.tgz#bf72615d649dfe5f699079c54b83e47d1ae19cfd" + integrity sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w== + +is-weakref@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" + integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== + dependencies: + call-bind "^1.0.2" + +is-weakset@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.3.tgz#e801519df8c0c43e12ff2834eead84ec9e624007" + integrity sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ== + dependencies: + call-bind "^1.0.7" + get-intrinsic "^1.2.4" + +isarray@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" + integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +iterator.prototype@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/iterator.prototype/-/iterator.prototype-1.1.2.tgz#5e29c8924f01916cb9335f1ff80619dcff22b0c0" + integrity sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w== + dependencies: + define-properties "^1.2.1" + get-intrinsic "^1.2.1" + has-symbols "^1.0.3" + reflect.getprototypeof "^1.0.4" + set-function-name "^2.0.1" + +jackspeak@^2.3.5: + version "2.3.6" + resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-2.3.6.tgz#647ecc472238aee4b06ac0e461acc21a8c505ca8" + integrity sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ== + dependencies: + "@isaacs/cliui" "^8.0.2" + optionalDependencies: + "@pkgjs/parseargs" "^0.11.0" + +jackspeak@^3.1.2: + version "3.4.0" + resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-3.4.0.tgz#a75763ff36ad778ede6a156d8ee8b124de445b4a" + integrity sha512-JVYhQnN59LVPFCEcVa2C3CrEKYacvjRfqIQl+h8oi91aLYQVWRYbxjPcv1bUiUy/kLmQaANrYfNMCO3kuEDHfw== + dependencies: + "@isaacs/cliui" "^8.0.2" + optionalDependencies: + "@pkgjs/parseargs" "^0.11.0" + +jiti@^1.21.0: + version "1.21.3" + resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.21.3.tgz#b2adb07489d7629b344d59082bbedb8c21c5f755" + integrity sha512-uy2bNX5zQ+tESe+TiC7ilGRz8AtRGmnJH55NC5S0nSUjvvvM2hJHmefHErugGXN4pNv4Qx7vLsnNw9qJ9mtIsw== + +jotai@^2.8.0: + version "2.8.3" + resolved "https://registry.yarnpkg.com/jotai/-/jotai-2.8.3.tgz#21b50c89c9ee2d24e694158b925bade1f38641d7" + integrity sha512-pR4plVvdbzB6zyt7VLLHPMAkcRSKhRIvZKd+qkifQLa3CEziEo1uwZjePj4acTmQrboiISBlYSdCz3gWcr1Nkg== + +js-cookie@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/js-cookie/-/js-cookie-2.2.1.tgz#69e106dc5d5806894562902aa5baec3744e9b2b8" + integrity sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ== + +"js-tokens@^3.0.0 || ^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +json-buffer@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" + integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== + +json5@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" + integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== + dependencies: + minimist "^1.2.0" + +"jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.3.5: + version "3.3.5" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz#4766bd05a8e2a11af222becd19e15575e52a853a" + integrity sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ== + dependencies: + array-includes "^3.1.6" + array.prototype.flat "^1.3.1" + object.assign "^4.1.4" + object.values "^1.1.6" + +keyv@^4.5.3: + version "4.5.4" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" + integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== + dependencies: + json-buffer "3.0.1" + +language-subtag-registry@^0.3.20: + version "0.3.23" + resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz#23529e04d9e3b74679d70142df3fd2eb6ec572e7" + integrity sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ== + +language-tags@^1.0.9: + version "1.0.9" + resolved "https://registry.yarnpkg.com/language-tags/-/language-tags-1.0.9.tgz#1ffdcd0ec0fafb4b1be7f8b11f306ad0f9c08777" + integrity sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA== + dependencies: + language-subtag-registry "^0.3.20" + +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + +lilconfig@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.1.0.tgz#78e23ac89ebb7e1bfbf25b18043de756548e7f52" + integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ== + +lilconfig@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-3.1.1.tgz#9d8a246fa753106cfc205fd2d77042faca56e5e3" + integrity sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ== + +lines-and-columns@^1.1.6: + version "1.2.4" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +lodash.castarray@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.castarray/-/lodash.castarray-4.4.0.tgz#c02513515e309daddd4c24c60cfddcf5976d9115" + integrity sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q== + +lodash.isplainobject@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" + integrity sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA== + +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + +loose-envify@^1.1.0, loose-envify@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +lru-cache@^10.2.0: + version "10.2.2" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.2.2.tgz#48206bc114c1252940c41b25b41af5b545aca878" + integrity sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ== + +mdn-data@2.0.14: + version "2.0.14" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.14.tgz#7113fc4281917d63ce29b43446f701e68c25ba50" + integrity sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow== + +merge2@^1.3.0, merge2@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +micromatch@^4.0.4, micromatch@^4.0.5: + version "4.0.7" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.7.tgz#33e8190d9fe474a9895525f5618eee136d46c2e5" + integrity sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q== + dependencies: + braces "^3.0.3" + picomatch "^2.3.1" + +mini-svg-data-uri@^1.2.3: + version "1.4.4" + resolved "https://registry.yarnpkg.com/mini-svg-data-uri/-/mini-svg-data-uri-1.4.4.tgz#8ab0aabcdf8c29ad5693ca595af19dd2ead09939" + integrity sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg== + +minimatch@9.0.3: + version "9.0.3" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825" + integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== + dependencies: + brace-expansion "^2.0.1" + +minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimatch@^9.0.1, minimatch@^9.0.4: + version "9.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.4.tgz#8e49c731d1749cbec05050ee5145147b32496a51" + integrity sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw== + dependencies: + brace-expansion "^2.0.1" + +minimist@^1.2.0, minimist@^1.2.6: + version "1.2.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== + +"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.1.2: + version "7.1.2" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707" + integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +ms@^2.1.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +mz@^2.7.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" + integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== + dependencies: + any-promise "^1.0.0" + object-assign "^4.0.1" + thenify-all "^1.0.0" + +nano-css@^5.6.1: + version "5.6.1" + resolved "https://registry.yarnpkg.com/nano-css/-/nano-css-5.6.1.tgz#964120cb1af6cccaa6d0717a473ccd876b34c197" + integrity sha512-T2Mhc//CepkTa3X4pUhKgbEheJHYAxD0VptuqFhDbGMUWVV2m+lkNiW/Ieuj35wrfC8Zm0l7HvssQh7zcEttSw== + dependencies: + "@jridgewell/sourcemap-codec" "^1.4.15" + css-tree "^1.1.2" + csstype "^3.1.2" + fastest-stable-stringify "^2.0.2" + inline-style-prefixer "^7.0.0" + rtl-css-js "^1.16.1" + stacktrace-js "^2.0.2" + stylis "^4.3.0" + +nanoid@^3.3.6, nanoid@^3.3.7: + version "3.3.7" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" + integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== + +next-themes@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/next-themes/-/next-themes-0.3.0.tgz#b4d2a866137a67d42564b07f3a3e720e2ff3871a" + integrity sha512-/QHIrsYpd6Kfk7xakK4svpDI5mmXP0gfvCoJdGpZQ2TOrQZmsW0QxjaiLn8wbIKjtm4BTSqLoix4lxYYOnLJ/w== + +next@^14.2.3: + version "14.2.3" + resolved "https://registry.yarnpkg.com/next/-/next-14.2.3.tgz#f117dd5d5f20c307e7b8e4f9c1c97d961008925d" + integrity sha512-dowFkFTR8v79NPJO4QsBUtxv0g9BrS/phluVpMAt2ku7H+cbcBJlopXjkWlwxrk/xGqMemr7JkGPGemPrLLX7A== + dependencies: + "@next/env" "14.2.3" + "@swc/helpers" "0.5.5" + busboy "1.6.0" + caniuse-lite "^1.0.30001579" + graceful-fs "^4.2.11" + postcss "8.4.31" + styled-jsx "5.1.1" + optionalDependencies: + "@next/swc-darwin-arm64" "14.2.3" + "@next/swc-darwin-x64" "14.2.3" + "@next/swc-linux-arm64-gnu" "14.2.3" + "@next/swc-linux-arm64-musl" "14.2.3" + "@next/swc-linux-x64-gnu" "14.2.3" + "@next/swc-linux-x64-musl" "14.2.3" + "@next/swc-win32-arm64-msvc" "14.2.3" + "@next/swc-win32-ia32-msvc" "14.2.3" + "@next/swc-win32-x64-msvc" "14.2.3" + +node-releases@^2.0.14: + version "2.0.14" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.14.tgz#2ffb053bceb8b2be8495ece1ab6ce600c4461b0b" + integrity sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw== + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +normalize-range@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" + integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA== + +object-assign@^4.0.1, object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== + +object-hash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-3.0.0.tgz#73f97f753e7baffc0e2cc9d6e079079744ac82e9" + integrity sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw== + +object-inspect@^1.13.1: + version "1.13.1" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.1.tgz#b96c6109324ccfef6b12216a956ca4dc2ff94bc2" + integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ== + +object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object.assign@^4.1.4, object.assign@^4.1.5: + version "4.1.5" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.5.tgz#3a833f9ab7fdb80fc9e8d2300c803d216d8fdbb0" + integrity sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ== + dependencies: + call-bind "^1.0.5" + define-properties "^1.2.1" + has-symbols "^1.0.3" + object-keys "^1.1.1" + +object.entries@^1.1.7, object.entries@^1.1.8: + version "1.1.8" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.8.tgz#bffe6f282e01f4d17807204a24f8edd823599c41" + integrity sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + +object.fromentries@^2.0.7, object.fromentries@^2.0.8: + version "2.0.8" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.8.tgz#f7195d8a9b97bd95cbc1999ea939ecd1a2b00c65" + integrity sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-object-atoms "^1.0.0" + +object.groupby@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/object.groupby/-/object.groupby-1.0.3.tgz#9b125c36238129f6f7b61954a1e7176148d5002e" + integrity sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + +object.hasown@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.4.tgz#e270ae377e4c120cdcb7656ce66884a6218283dc" + integrity sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg== + dependencies: + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-object-atoms "^1.0.0" + +object.values@^1.1.6, object.values@^1.1.7, object.values@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.2.0.tgz#65405a9d92cee68ac2d303002e0b8470a4d9ab1b" + integrity sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + +once@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +optionator@^0.9.3: + version "0.9.4" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734" + integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== + dependencies: + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + word-wrap "^1.2.5" + +overlayscrollbars-react@^0.5.6: + version "0.5.6" + resolved "https://registry.yarnpkg.com/overlayscrollbars-react/-/overlayscrollbars-react-0.5.6.tgz#e9779f9fc2c1a3288570a45c83f8e42518bfb8c1" + integrity sha512-E5To04bL5brn9GVCZ36SnfGanxa2I2MDkWoa4Cjo5wol7l+diAgi4DBc983V7l2nOk/OLJ6Feg4kySspQEGDBw== + +overlayscrollbars@^2.8.0: + version "2.8.3" + resolved "https://registry.yarnpkg.com/overlayscrollbars/-/overlayscrollbars-2.8.3.tgz#6d2ac67a142e2186574e05a6b7dfee9976ec23b1" + integrity sha512-7JHA1oWm3Gru3RF5wwaeBdgk4keGtc56HMWEQRQi/RdLdY3pZTUDlSfUk1jyv1yQN12otr828n52rT6VNzYO4w== + +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + +path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +path-scurry@^1.10.1, path-scurry@^1.11.1: + version "1.11.1" + resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.11.1.tgz#7960a668888594a0720b12a911d1a742ab9f11d2" + integrity sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA== + dependencies: + lru-cache "^10.2.0" + minipass "^5.0.0 || ^6.0.2 || ^7.0.0" + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +picocolors@^1.0.0, picocolors@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.1.tgz#a8ad579b571952f0e5d25892de5445bcfe25aaa1" + integrity sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew== + +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +pify@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== + +pirates@^4.0.1: + version "4.0.6" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9" + integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== + +possible-typed-array-names@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz#89bb63c6fada2c3e90adc4a647beeeb39cc7bf8f" + integrity sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q== + +postcss-import@^15.1.0: + version "15.1.0" + resolved "https://registry.yarnpkg.com/postcss-import/-/postcss-import-15.1.0.tgz#41c64ed8cc0e23735a9698b3249ffdbf704adc70" + integrity sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew== + dependencies: + postcss-value-parser "^4.0.0" + read-cache "^1.0.0" + resolve "^1.1.7" + +postcss-js@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-js/-/postcss-js-4.0.1.tgz#61598186f3703bab052f1c4f7d805f3991bee9d2" + integrity sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw== + dependencies: + camelcase-css "^2.0.1" + +postcss-load-config@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-4.0.2.tgz#7159dcf626118d33e299f485d6afe4aff7c4a3e3" + integrity sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ== + dependencies: + lilconfig "^3.0.0" + yaml "^2.3.4" + +postcss-nested@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/postcss-nested/-/postcss-nested-6.0.1.tgz#f83dc9846ca16d2f4fa864f16e9d9f7d0961662c" + integrity sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ== + dependencies: + postcss-selector-parser "^6.0.11" + +postcss-selector-parser@6.0.10: + version "6.0.10" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz#79b61e2c0d1bfc2602d549e11d0876256f8df88d" + integrity sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w== + dependencies: + cssesc "^3.0.0" + util-deprecate "^1.0.2" + +postcss-selector-parser@^6.0.11: + version "6.1.0" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.1.0.tgz#49694cb4e7c649299fea510a29fa6577104bcf53" + integrity sha512-UMz42UD0UY0EApS0ZL9o1XnLhSTtvvvLe5Dc2H2O56fvRZi+KulDyf5ctDhhtYJBGKStV2FL1fy6253cmLgqVQ== + dependencies: + cssesc "^3.0.0" + util-deprecate "^1.0.2" + +postcss-value-parser@^4.0.0, postcss-value-parser@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" + integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== + +postcss@8.4.31: + version "8.4.31" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.31.tgz#92b451050a9f914da6755af352bdc0192508656d" + integrity sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ== + dependencies: + nanoid "^3.3.6" + picocolors "^1.0.0" + source-map-js "^1.0.2" + +postcss@^8, postcss@^8.4.23: + version "8.4.38" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.38.tgz#b387d533baf2054288e337066d81c6bee9db9e0e" + integrity sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A== + dependencies: + nanoid "^3.3.7" + picocolors "^1.0.0" + source-map-js "^1.2.0" + +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + +prop-types@^15.8.1: + version "15.8.1" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" + integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.13.1" + +punycode@^2.1.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" + integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +react-dom@^18: + version "18.3.1" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.3.1.tgz#c2265d79511b57d479b3dd3fdfa51536494c5cb4" + integrity sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw== + dependencies: + loose-envify "^1.1.0" + scheduler "^0.23.2" + +react-is@^16.13.1: + version "16.13.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + +react-universal-interface@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/react-universal-interface/-/react-universal-interface-0.6.2.tgz#5e8d438a01729a4dbbcbeeceb0b86be146fe2b3b" + integrity sha512-dg8yXdcQmvgR13RIlZbTRQOoUrDciFVoSBZILwjE2LFISxZZ8loVJKAkuzswl5js8BHda79bIb2b84ehU8IjXw== + +react-use@^17.5.0: + version "17.5.0" + resolved "https://registry.yarnpkg.com/react-use/-/react-use-17.5.0.tgz#1fae45638828a338291efa0f0c61862db7ee6442" + integrity sha512-PbfwSPMwp/hoL847rLnm/qkjg3sTRCvn6YhUZiHaUa3FA6/aNoFX79ul5Xt70O1rK+9GxSVqkY0eTwMdsR/bWg== + dependencies: + "@types/js-cookie" "^2.2.6" + "@xobotyi/scrollbar-width" "^1.9.5" + copy-to-clipboard "^3.3.1" + fast-deep-equal "^3.1.3" + fast-shallow-equal "^1.0.0" + js-cookie "^2.2.1" + nano-css "^5.6.1" + react-universal-interface "^0.6.2" + resize-observer-polyfill "^1.5.1" + screenfull "^5.1.0" + set-harmonic-interval "^1.0.1" + throttle-debounce "^3.0.1" + ts-easing "^0.2.0" + tslib "^2.1.0" + +react@^18: + version "18.3.1" + resolved "https://registry.yarnpkg.com/react/-/react-18.3.1.tgz#49ab892009c53933625bd16b2533fc754cab2891" + integrity sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ== + dependencies: + loose-envify "^1.1.0" + +read-cache@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/read-cache/-/read-cache-1.0.0.tgz#e664ef31161166c9751cdbe8dbcf86b5fb58f774" + integrity sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA== + dependencies: + pify "^2.3.0" + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +reflect.getprototypeof@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz#3ab04c32a8390b770712b7a8633972702d278859" + integrity sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.1" + es-errors "^1.3.0" + get-intrinsic "^1.2.4" + globalthis "^1.0.3" + which-builtin-type "^1.1.3" + +regenerator-runtime@^0.14.0: + version "0.14.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" + integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== + +regexp.prototype.flags@^1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz#138f644a3350f981a858c44f6bb1a61ff59be334" + integrity sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw== + dependencies: + call-bind "^1.0.6" + define-properties "^1.2.1" + es-errors "^1.3.0" + set-function-name "^2.0.1" + +resize-observer-polyfill@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz#0e9020dd3d21024458d4ebd27e23e40269810464" + integrity sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg== + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve-pkg-maps@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz#616b3dc2c57056b5588c31cdf4b3d64db133720f" + integrity sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw== + +resolve@^1.1.7, resolve@^1.22.2, resolve@^1.22.4: + version "1.22.8" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" + integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== + dependencies: + is-core-module "^2.13.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +resolve@^2.0.0-next.5: + version "2.0.0-next.5" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.5.tgz#6b0ec3107e671e52b68cd068ef327173b90dc03c" + integrity sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA== + dependencies: + is-core-module "^2.13.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +rtl-css-js@^1.16.1: + version "1.16.1" + resolved "https://registry.yarnpkg.com/rtl-css-js/-/rtl-css-js-1.16.1.tgz#4b48b4354b0ff917a30488d95100fbf7219a3e80" + integrity sha512-lRQgou1mu19e+Ya0LsTvKrVJ5TYUbqCVPAiImX3UfLTenarvPUl1QFdvu5Z3PYmHT9RCcwIfbjRQBntExyj3Zg== + dependencies: + "@babel/runtime" "^7.1.2" + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +safe-array-concat@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.2.tgz#81d77ee0c4e8b863635227c721278dd524c20edb" + integrity sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q== + dependencies: + call-bind "^1.0.7" + get-intrinsic "^1.2.4" + has-symbols "^1.0.3" + isarray "^2.0.5" + +safe-regex-test@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.3.tgz#a5b4c0f06e0ab50ea2c395c14d8371232924c377" + integrity sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw== + dependencies: + call-bind "^1.0.6" + es-errors "^1.3.0" + is-regex "^1.1.4" + +scheduler@^0.23.2: + version "0.23.2" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.2.tgz#414ba64a3b282892e944cf2108ecc078d115cdc3" + integrity sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ== + dependencies: + loose-envify "^1.1.0" + +screenfull@^5.1.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/screenfull/-/screenfull-5.2.0.tgz#6533d524d30621fc1283b9692146f3f13a93d1ba" + integrity sha512-9BakfsO2aUQN2K9Fdbj87RJIEZ82Q9IGim7FqM5OsebfoFC6ZHXgDq/KvniuLTPdeM8wY2o6Dj3WQ7KeQCj3cA== + +semver@^6.3.1: + version "6.3.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== + +semver@^7.5.4: + version "7.6.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.2.tgz#1e3b34759f896e8f14d6134732ce798aeb0c6e13" + integrity sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w== + +set-function-length@^1.2.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" + integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== + dependencies: + define-data-property "^1.1.4" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + gopd "^1.0.1" + has-property-descriptors "^1.0.2" + +set-function-name@^2.0.1, set-function-name@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.2.tgz#16a705c5a0dc2f5e638ca96d8a8cd4e1c2b90985" + integrity sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ== + dependencies: + define-data-property "^1.1.4" + es-errors "^1.3.0" + functions-have-names "^1.2.3" + has-property-descriptors "^1.0.2" + +set-harmonic-interval@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/set-harmonic-interval/-/set-harmonic-interval-1.0.1.tgz#e1773705539cdfb80ce1c3d99e7f298bb3995249" + integrity sha512-AhICkFV84tBP1aWqPwLZqFvAwqEoVA9kxNMniGEUvzOlm4vLmOFLiTT3UZ6bziJTy4bOVpzWGTfSCbmaayGx8g== + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +side-channel@^1.0.4, side-channel@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.6.tgz#abd25fb7cd24baf45466406b1096b7831c9215f2" + integrity sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA== + dependencies: + call-bind "^1.0.7" + es-errors "^1.3.0" + get-intrinsic "^1.2.4" + object-inspect "^1.13.1" + +signal-exit@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" + integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +source-map-js@^1.0.2, source-map-js@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.0.tgz#16b809c162517b5b8c3e7dcd315a2a5c2612b2af" + integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg== + +source-map@0.5.6: + version "0.5.6" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412" + integrity sha512-MjZkVp0NHr5+TPihLcadqnlVoGIoWo4IBHptutGh9wI3ttUYvCG26HkSuDi+K6lsZ25syXJXcctwgyVCt//xqA== + +source-map@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +stack-generator@^2.0.5: + version "2.0.10" + resolved "https://registry.yarnpkg.com/stack-generator/-/stack-generator-2.0.10.tgz#8ae171e985ed62287d4f1ed55a1633b3fb53bb4d" + integrity sha512-mwnua/hkqM6pF4k8SnmZ2zfETsRUpWXREfA/goT8SLCV4iOFa4bzOX2nDipWAZFPTjLvQB82f5yaodMVhK0yJQ== + dependencies: + stackframe "^1.3.4" + +stackframe@^1.3.4: + version "1.3.4" + resolved "https://registry.yarnpkg.com/stackframe/-/stackframe-1.3.4.tgz#b881a004c8c149a5e8efef37d51b16e412943310" + integrity sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw== + +stacktrace-gps@^3.0.4: + version "3.1.2" + resolved "https://registry.yarnpkg.com/stacktrace-gps/-/stacktrace-gps-3.1.2.tgz#0c40b24a9b119b20da4525c398795338966a2fb0" + integrity sha512-GcUgbO4Jsqqg6RxfyTHFiPxdPqF+3LFmQhm7MgCuYQOYuWyqxo5pwRPz5d/u6/WYJdEnWfK4r+jGbyD8TSggXQ== + dependencies: + source-map "0.5.6" + stackframe "^1.3.4" + +stacktrace-js@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/stacktrace-js/-/stacktrace-js-2.0.2.tgz#4ca93ea9f494752d55709a081d400fdaebee897b" + integrity sha512-Je5vBeY4S1r/RnLydLl0TBTi3F2qdfWmYsGvtfZgEI+SCprPppaIhQf5nGcal4gI4cGpCV/duLcAzT1np6sQqg== + dependencies: + error-stack-parser "^2.0.6" + stack-generator "^2.0.5" + stacktrace-gps "^3.0.4" + +streamsearch@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764" + integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== + +"string-width-cjs@npm:string-width@^4.2.0": + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string-width@^4.1.0: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string-width@^5.0.1, string-width@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" + integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== + dependencies: + eastasianwidth "^0.2.0" + emoji-regex "^9.2.2" + strip-ansi "^7.0.1" + +string.prototype.matchall@^4.0.11: + version "4.0.11" + resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz#1092a72c59268d2abaad76582dccc687c0297e0a" + integrity sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + get-intrinsic "^1.2.4" + gopd "^1.0.1" + has-symbols "^1.0.3" + internal-slot "^1.0.7" + regexp.prototype.flags "^1.5.2" + set-function-name "^2.0.2" + side-channel "^1.0.6" + +string.prototype.trim@^1.2.9: + version "1.2.9" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz#b6fa326d72d2c78b6df02f7759c73f8f6274faa4" + integrity sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.0" + es-object-atoms "^1.0.0" + +string.prototype.trimend@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz#3651b8513719e8a9f48de7f2f77640b26652b229" + integrity sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + +string.prototype.trimstart@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz#7ee834dda8c7c17eff3118472bb35bfedaa34dde" + integrity sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + +"strip-ansi-cjs@npm:strip-ansi@^6.0.1": + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-ansi@^7.0.1: + version "7.1.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" + integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== + dependencies: + ansi-regex "^6.0.1" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== + +strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +styled-jsx@5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/styled-jsx/-/styled-jsx-5.1.1.tgz#839a1c3aaacc4e735fed0781b8619ea5d0009d1f" + integrity sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw== + dependencies: + client-only "0.0.1" + +stylis@^4.3.0: + version "4.3.2" + resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.3.2.tgz#8f76b70777dd53eb669c6f58c997bf0a9972e444" + integrity sha512-bhtUjWd/z6ltJiQwg0dUfxEJ+W+jdqQd8TbWLWyeIJHlnsqmGLRFFd8e5mA0AZi/zx90smXRlN66YMTcaSFifg== + +sucrase@^3.32.0: + version "3.35.0" + resolved "https://registry.yarnpkg.com/sucrase/-/sucrase-3.35.0.tgz#57f17a3d7e19b36d8995f06679d121be914ae263" + integrity sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA== + dependencies: + "@jridgewell/gen-mapping" "^0.3.2" + commander "^4.0.0" + glob "^10.3.10" + lines-and-columns "^1.1.6" + mz "^2.7.0" + pirates "^4.0.1" + ts-interface-checker "^0.1.9" + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +swiper@^11.1.3: + version "11.1.4" + resolved "https://registry.yarnpkg.com/swiper/-/swiper-11.1.4.tgz#2f8e303e8bf9e5bc40a3885fc637ae60ff27996c" + integrity sha512-1n7kbYJB2dFEpUHRFszq7gys/ofIBrMNibwTiMvPHwneKND/t9kImnHt6CfGPScMHgI+dWMbGTycCKGMoOO1KA== + +tailwindcss@^3.3.0: + version "3.4.4" + resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-3.4.4.tgz#351d932273e6abfa75ce7d226b5bf3a6cb257c05" + integrity sha512-ZoyXOdJjISB7/BcLTR6SEsLgKtDStYyYZVLsUtWChO4Ps20CBad7lfJKVDiejocV4ME1hLmyY0WJE3hSDcmQ2A== + dependencies: + "@alloc/quick-lru" "^5.2.0" + arg "^5.0.2" + chokidar "^3.5.3" + didyoumean "^1.2.2" + dlv "^1.1.3" + fast-glob "^3.3.0" + glob-parent "^6.0.2" + is-glob "^4.0.3" + jiti "^1.21.0" + lilconfig "^2.1.0" + micromatch "^4.0.5" + normalize-path "^3.0.0" + object-hash "^3.0.0" + picocolors "^1.0.0" + postcss "^8.4.23" + postcss-import "^15.1.0" + postcss-js "^4.0.1" + postcss-load-config "^4.0.1" + postcss-nested "^6.0.1" + postcss-selector-parser "^6.0.11" + resolve "^1.22.2" + sucrase "^3.32.0" + +tapable@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" + integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== + +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== + +thenify-all@^1.0.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" + integrity sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA== + dependencies: + thenify ">= 3.1.0 < 4" + +"thenify@>= 3.1.0 < 4": + version "3.3.1" + resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.3.1.tgz#8932e686a4066038a016dd9e2ca46add9838a95f" + integrity sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw== + dependencies: + any-promise "^1.0.0" + +throttle-debounce@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/throttle-debounce/-/throttle-debounce-3.0.1.tgz#32f94d84dfa894f786c9a1f290e7a645b6a19abb" + integrity sha512-dTEWWNu6JmeVXY0ZYoPuH5cRIwc0MeGbJwah9KUNYSJwommQpCzTySTpEe8Gs1J23aeWEuAobe4Ag7EHVt/LOg== + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +toggle-selection@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/toggle-selection/-/toggle-selection-1.0.6.tgz#6e45b1263f2017fa0acc7d89d78b15b8bf77da32" + integrity sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ== + +ts-api-utils@^1.0.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.3.0.tgz#4b490e27129f1e8e686b45cc4ab63714dc60eea1" + integrity sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ== + +ts-easing@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/ts-easing/-/ts-easing-0.2.0.tgz#c8a8a35025105566588d87dbda05dd7fbfa5a4ec" + integrity sha512-Z86EW+fFFh/IFB1fqQ3/+7Zpf9t2ebOAxNI/V6Wo7r5gqiqtxmgTlQ1qbqQcjLKYeSHPTsEmvlJUDg/EuL0uHQ== + +ts-interface-checker@^0.1.9: + version "0.1.13" + resolved "https://registry.yarnpkg.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz#784fd3d679722bc103b1b4b8030bcddb5db2a699" + integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA== + +tsconfig-paths@^3.15.0: + version "3.15.0" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz#5299ec605e55b1abb23ec939ef15edaf483070d4" + integrity sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg== + dependencies: + "@types/json5" "^0.0.29" + json5 "^1.0.2" + minimist "^1.2.6" + strip-bom "^3.0.0" + +tslib@^2.1.0, tslib@^2.4.0: + version "2.6.3" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.3.tgz#0438f810ad7a9edcde7a241c3d80db693c8cbfe0" + integrity sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ== + +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + +typed-array-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz#1867c5d83b20fcb5ccf32649e5e2fc7424474ff3" + integrity sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ== + dependencies: + call-bind "^1.0.7" + es-errors "^1.3.0" + is-typed-array "^1.1.13" + +typed-array-byte-length@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz#d92972d3cff99a3fa2e765a28fcdc0f1d89dec67" + integrity sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw== + dependencies: + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + has-proto "^1.0.3" + is-typed-array "^1.1.13" + +typed-array-byte-offset@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz#f9ec1acb9259f395093e4567eb3c28a580d02063" + integrity sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA== + dependencies: + available-typed-arrays "^1.0.7" + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + has-proto "^1.0.3" + is-typed-array "^1.1.13" + +typed-array-length@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.6.tgz#57155207c76e64a3457482dfdc1c9d1d3c4c73a3" + integrity sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g== + dependencies: + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + has-proto "^1.0.3" + is-typed-array "^1.1.13" + possible-typed-array-names "^1.0.0" + +typescript@^5: + version "5.4.5" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.4.5.tgz#42ccef2c571fdbd0f6718b1d1f5e6e5ef006f611" + integrity sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ== + +unbox-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" + integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== + dependencies: + call-bind "^1.0.2" + has-bigints "^1.0.2" + has-symbols "^1.0.3" + which-boxed-primitive "^1.0.2" + +undici-types@~5.26.4: + version "5.26.5" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" + integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== + +update-browserslist-db@^1.0.13: + version "1.0.16" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.16.tgz#f6d489ed90fb2f07d67784eb3f53d7891f736356" + integrity sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ== + dependencies: + escalade "^3.1.2" + picocolors "^1.0.1" + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +util-deprecate@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + +"wasm@file:../wasm/pkg": + version "1.0.0" + dependencies: + dexie "^4.0.1" + +which-boxed-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" + integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== + dependencies: + is-bigint "^1.0.1" + is-boolean-object "^1.1.0" + is-number-object "^1.0.4" + is-string "^1.0.5" + is-symbol "^1.0.3" + +which-builtin-type@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/which-builtin-type/-/which-builtin-type-1.1.3.tgz#b1b8443707cc58b6e9bf98d32110ff0c2cbd029b" + integrity sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw== + dependencies: + function.prototype.name "^1.1.5" + has-tostringtag "^1.0.0" + is-async-function "^2.0.0" + is-date-object "^1.0.5" + is-finalizationregistry "^1.0.2" + is-generator-function "^1.0.10" + is-regex "^1.1.4" + is-weakref "^1.0.2" + isarray "^2.0.5" + which-boxed-primitive "^1.0.2" + which-collection "^1.0.1" + which-typed-array "^1.1.9" + +which-collection@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.2.tgz#627ef76243920a107e7ce8e96191debe4b16c2a0" + integrity sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw== + dependencies: + is-map "^2.0.3" + is-set "^2.0.3" + is-weakmap "^2.0.2" + is-weakset "^2.0.3" + +which-typed-array@^1.1.14, which-typed-array@^1.1.15, which-typed-array@^1.1.9: + version "1.1.15" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.15.tgz#264859e9b11a649b388bfaaf4f767df1f779b38d" + integrity sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA== + dependencies: + available-typed-arrays "^1.0.7" + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.2" + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +word-wrap@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" + integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== + +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrap-ansi@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" + integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== + dependencies: + ansi-styles "^6.1.0" + string-width "^5.0.1" + strip-ansi "^7.0.1" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +yaml@^2.3.4: + version "2.4.3" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.4.3.tgz#0777516b8c7880bcaa0f426a5410e8d6b0be1f3d" + integrity sha512-sntgmxj8o7DE7g/Qi60cqpLBA3HG3STcDA0kO+WfB05jEKhZMbY7umNm2rBpQvsmZ16/lPXCJGW2672dgOUkrg== + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== From d68702615264c07fa8832e442cb37e569b6ef2f9 Mon Sep 17 00:00:00 2001 From: JohnDonavon Date: Thu, 13 Jun 2024 14:36:54 -0700 Subject: [PATCH 29/42] didn't save lol --- wasm/Cargo.toml | 6 ------ 1 file changed, 6 deletions(-) diff --git a/wasm/Cargo.toml b/wasm/Cargo.toml index 6f222b8ec..f579b398e 100644 --- a/wasm/Cargo.toml +++ b/wasm/Cargo.toml @@ -22,15 +22,9 @@ futures = "0.3" getrandom = { version = "0.2", features = ["js"] } hex = { version = "0.4" } miden-client = { path = "../../demox-miden-client", version = "0.3.0", default-features = false, features = ["wasm", "async"] } -<<<<<<< HEAD miden-lib = { version = "0.3.1", default-features = false, features = ["testing"] } miden-tx = { version = "0.3.1", default-features = false, features = ["async"] } miden-objects = { version = "0.3.1", default-features = false, features = ["std", "serde", "testing"] } -======= -miden-lib = { path="../../miden-base-copy/miden-lib", default-features = false } -miden-tx = { path="../../miden-base-copy/miden-tx", default-features = false, features = ["async"] } -miden-objects = { version = "0.3.1", default-features = false, features = ["serde"] } ->>>>>>> a58f985 (miden website 0.3) prost = { version = "0.12.3" } rand = { version = "0.8.5" } serde = { version = "1.0", features = ["derive"] } From b2a5fdd8ed0cf485092b7309fa0fb4dec6b68987 Mon Sep 17 00:00:00 2001 From: JohnDonavon Date: Thu, 13 Jun 2024 15:41:54 -0700 Subject: [PATCH 30/42] Working account creation and getting --- wasm/rollup.config.js | 4 +- wasm/src/web_client/account.rs | 4 +- wasm/test.html | 5 +- website/src/app/accounts/page.tsx | 114 +++++++++++++++++++----------- website/src/workers/accounts.ts | 30 ++++---- 5 files changed, 93 insertions(+), 64 deletions(-) diff --git a/wasm/rollup.config.js b/wasm/rollup.config.js index 2261c6eaf..0c3a1bd00 100644 --- a/wasm/rollup.config.js +++ b/wasm/rollup.config.js @@ -19,8 +19,8 @@ export default [ cargoArgs: [ // This enables multi-threading // "--features", "testing", // Add this line to include the concurrent feature - "--config", `build.rustflags=["-C", "target-feature=+atomics,+bulk-memory,+mutable-globals", "-C", "link-arg=--max-memory=4294967296"]`, - // "--config", `build.rustflags=["-C", "target-feature=+atomics,+bulk-memory,+mutable-globals", "-C", "link-arg=--max-memory=4294967296", "-C", "debuginfo=2"]`, + // "--config", `build.rustflags=["-C", "target-feature=+atomics,+bulk-memory,+mutable-globals", "-C", "link-arg=--max-memory=4294967296"]`, + "--config", `build.rustflags=["-C", "target-feature=+atomics,+bulk-memory,+mutable-globals", "-C", "link-arg=--max-memory=4294967296", "-C", "debuginfo=2"]`, "--no-default-features", "-Z", "build-std=panic_abort,std", ], diff --git a/wasm/src/web_client/account.rs b/wasm/src/web_client/account.rs index ec70d6fe6..8801d4e78 100644 --- a/wasm/src/web_client/account.rs +++ b/wasm/src/web_client/account.rs @@ -15,6 +15,7 @@ use wasm_bindgen::prelude::*; use web_sys::console; use std::panic; use serde_wasm_bindgen::Serializer; +use console_error_panic_hook; #[derive(Serialize, Deserialize)] #[serde(tag = "type")] @@ -45,9 +46,10 @@ impl WebClient { pub async fn get_accounts( &mut self ) -> Result { - web_sys::console::log_1(&JsValue::from_str("new_wallet called")); + console_error_panic_hook::set_once(); if let Some(client) = self.get_mut_inner() { let account_tuples = client.get_account_stubs().await.unwrap(); + web_sys::console::log_1(&format!("account_tuples {:?}", account_tuples).into()); let accounts: Vec = account_tuples.into_iter().map(|(account, _)| { SerializedAccountStub::new( account.id().to_string(), diff --git a/wasm/test.html b/wasm/test.html index 39af46ebd..3f6122e5b 100644 --- a/wasm/test.html +++ b/wasm/test.html @@ -195,6 +195,7 @@ async function getAccounts(webClient) { try { let accounts = await webClient.get_accounts(); + console.log(accounts); let accountIds = accounts.map(account => account.id); console.log(accountIds) return accountIds; @@ -1137,7 +1138,7 @@ // await testCreateNewWallet(); // await testCreateNewFaucet(); - // await testGetAccounts(); + await testGetAccounts(false); // await testGetAccount(); // await testNewMintTransaction(); // await testNewConsumeTransaction(); @@ -1149,7 +1150,7 @@ // await testGetInputNote(); // await testGetOutputNotes(); // await testGetOutputNote(); - await testExportNote(); + // await testExportNote(); // await testImportInputNote(); diff --git a/website/src/app/accounts/page.tsx b/website/src/app/accounts/page.tsx index 82c85e49c..2caae712d 100644 --- a/website/src/app/accounts/page.tsx +++ b/website/src/app/accounts/page.tsx @@ -3,11 +3,10 @@ // import { testNewRegularAccount } from '../../helpers/account-helpers'; // import { useWasm } from '@/context/wasm-context'; import DashboardLayout from '@/layouts/dashboard/_dashboard'; -import { ReactElement, useCallback, useEffect, useLayoutEffect, useRef } from 'react'; +import { ReactElement, use, useCallback, useEffect, useLayoutEffect, useRef } from 'react'; import { useState } from 'react' import Loader from '@/components/ui/loader'; -import * as wasm from '@demox-labs/miden-sdk'; interface Account { id: number @@ -17,7 +16,8 @@ interface Account { vault_root: string } -function AccountsTable({ accounts, isLoading }: { accounts: Account[], isLoading: boolean}) { +function AccountsTable({ accounts, isLoading, fetchAccounts }: { accounts: Account[], isLoading: boolean, fetchAccounts: () => void }) { + return (
    @@ -42,7 +42,7 @@ function AccountsTable({ accounts, isLoading }: { accounts: Account[], isLoading } - {/* */} + {/* */}
    ) } @@ -52,66 +52,96 @@ export default function Accounts() { const [createAccountLoading, setCreateAccountLoading] = useState(false) const [fetchAccountsLoading, setFetchAccountsLoading] = useState(false) const [accounts, setAccounts] = useState([]) - // const wasm = useWasm(); + + function createWorkerAndSendMessage(message: string) { + return new Promise((resolve, reject) => { + workerRef.current = new Worker(new URL('../../workers/accounts.ts', import.meta.url), { type : "module" }); + + workerRef.current.onmessage = function(event) { + switch (event.data.type) { + case "ready": + console.log('Worker is ready. Sending message...'); + workerRef.current?.postMessage(message); + break; + case "createAccount": + console.log('create account worker finished') + workerRef.current?.postMessage("fetchAccounts") + setCreateAccountLoading(false) + break; + case "fetchAccounts": + console.log('fetch accounts worker finished', event.data.accounts) + setFetchAccountsLoading(false) + setAccounts(event.data.accounts) + break; + default: + console.log('invalid message:', event.data); + break; + } + }; + + workerRef.current.onerror = function(error) { + reject(error); + }; + }); + } + useLayoutEffect(() => { - workerRef.current = new Worker(new URL('../../workers/accounts.ts', import.meta.url), { type : "module" }); - workerRef.current.onmessage = async (event) => { - switch (event.data.type) { - case "createAccount": - console.log('create account worker finished') - // workerRef.current?.postMessage("fetchAccounts") - setCreateAccountLoading(false) - break; - case "fetchAccounts": - console.log('fetch accounts worker finished', event.data.accounts) - setFetchAccountsLoading(false) - setAccounts(event.data.accounts) - break; - default: - console.log('invalid message:', event.data); - break; - } - } - workerRef.current.onerror = (error) => { - console.error('Worker error:', error.message) - } + createWorkerAndSendMessage("fetchAccounts") + // workerRef.current = new Worker(new URL('../../workers/accounts.ts', import.meta.url), { type : "module" }); + // workerRef.current.onmessage = async (event) => { + // switch (event.data.type) { + // case "createAccount": + // console.log('create account worker finished') + // workerRef.current?.postMessage("fetchAccounts") + // setCreateAccountLoading(false) + // break; + // case "fetchAccounts": + // console.log('fetch accounts worker finished', event.data.accounts) + // setFetchAccountsLoading(false) + // setAccounts(event.data.accounts) + // break; + // default: + // console.log('invalid message:', event.data); + // break; + // } + // } + // workerRef.current.onerror = (error) => { + // console.error('Worker error:', error.message) + // } - // fetchAccounts(); return () => { workerRef.current?.terminate(); } }, []) - // const fetchAccounts = () => { - // setFetchAccountsLoading(true) + useEffect(() => { + fetchAccounts() + }, []) + + const fetchAccounts = () => { + console.log('fetching accounts') + setFetchAccountsLoading(true) - // // const webClient = new wasm.WebClient() - // // console.log('webClient', webClient) - // // await webClient.create_client(); - // // const accounts = await webClient.get_accounts(); - // workerRef.current?.postMessage("fetchAccounts") - // } + console.log('sending fetchAccounts to worker') + console.log('workerRef', workerRef.current) + workerRef.current?.postMessage("fetchAccounts") + } async function createAccount() { try { setCreateAccountLoading(true) workerRef.current?.postMessage("createAccount") - // await new Promise(r => setTimeout(r, 3000)); } catch (error) { console.error('Failed to call create account:', error); } } -// !wasm ?
    Loading...
    : + return (
    - {/* { isLoading - ? - : - } */}
    - +
    ) } diff --git a/website/src/workers/accounts.ts b/website/src/workers/accounts.ts index f6f72444b..727e7ba3a 100644 --- a/website/src/workers/accounts.ts +++ b/website/src/workers/accounts.ts @@ -1,9 +1,14 @@ import { WebClient } from "@demox-labs/miden-sdk"; +console.log('Worker is setting up...'); +const webClient = new WebClient(); +await webClient.create_client(); +postMessage({ type: "ready" }); + addEventListener('message', async (event) => { console.log('worker received message', event.data) - const webClient = new WebClient(); - await webClient.create_client(); + // const webClient = new WebClient(); + // await webClient.create_client(); console.log() switch (event.data) { case "createAccount": @@ -11,23 +16,14 @@ addEventListener('message', async (event) => { console.log('account created', accountId); postMessage({ type: "createAccount", accountId }); break; - // case "fetchAccounts": - // const accounts = await webClient.get_accounts(); - // console.log('accounts fetched', accounts); - // postMessage({ type: "fetchAccounts", accounts: accounts }); - // break; + case "fetchAccounts": + const accounts = await webClient.get_accounts(); + console.log('accounts fetched', accounts); + postMessage({ type: "fetchAccounts", accounts: accounts }); + break; default: console.log('invalid message:', event.data); - postMessage(''); + postMessage({}); break; } - // await init(); - // console.log('webClient', webClient) - // await webClient.create_client(); - // const basicMutableTemplate = { - // type: "BasicMutable", - // storage_mode: "Local" - // }; - // await webClient.new_wallet("OffChain", true); - // postMessage('done') }) \ No newline at end of file From baf8aaeb43adc1666745c18bf93fba085d60ea48 Mon Sep 17 00:00:00 2001 From: JohnDonavon Date: Mon, 17 Jun 2024 17:30:18 -0700 Subject: [PATCH 31/42] wasm README and website changes --- wasm/README.md | 178 +++++++++++++++++++++ wasm/js/db/schema.js | 2 +- wasm/test.html | 2 +- website/next.config.js | 22 +-- website/src/app/accounts/page.tsx | 50 ++---- website/src/app/faucets/page.tsx | 136 ++++++++++++++++ website/src/app/greet/page.tsx | 29 ---- website/src/layouts/dashboard/_sidebar.tsx | 10 +- website/src/workers/accounts.ts | 12 +- website/tsconfig.json | 3 - 10 files changed, 352 insertions(+), 92 deletions(-) create mode 100644 wasm/README.md create mode 100644 website/src/app/faucets/page.tsx delete mode 100644 website/src/app/greet/page.tsx diff --git a/wasm/README.md b/wasm/README.md new file mode 100644 index 000000000..311de2ca3 --- /dev/null +++ b/wasm/README.md @@ -0,0 +1,178 @@ +# @demox-labs/miden-sdk +The @demox-labs/miden-sdk is a toolkit designed for interacting with the Miden virtual machine. It offers essential tools and functionalities for developers aiming to integrate or utilize Miden VM capabilities in their applications. + +## Installation +To install the package via npm, run the following command: + +```javascript +npm i @demox-labs/miden-sdk +``` + +For yarn: +```javascript +yarn add @demox-labs/miden-sdk +``` + +## Usage + +```javascript +import { WebClient } from "@demox-labs/miden-sdk"; + +const webClient = new WebClient(); +await webClient.create_client(); + +// Use webclient to create accounts, notes, transactions, etc. +// This will create an mutable, offchain account and store it in indexedDb +const accountId = await webClient.new_wallet("OffChain", true); +``` + +## API Reference + +```typescript +/** + * @returns {Promise} + */ +get_accounts(): Promise; + +/** + * @param {string} account_id + * @returns {Promise} + */ +get_account(account_id: string): Promise; + +/** + * @param {any} pub_key_bytes + * @returns {any} + */ +get_account_auth_by_pub_key(pub_key_bytes: any): any; + +/** + * @param {string} account_id + * @returns {Promise} + */ +fetch_and_cache_account_auth_by_pub_key(account_id: string): Promise; + +/** + * @param {string} note_id + * @returns {Promise} + */ +export_note(note_id: string): Promise; + +/** + * @param {any} account_bytes + * @returns {Promise} + */ +import_account(account_bytes: any): Promise; + +/** + * @param {string} note_bytes + * @param {boolean} verify + * @returns {Promise} + */ +import_note(note_bytes: string, verify: boolean): Promise; + +/** + * @param {string} storage_type + * @param {boolean} mutable + * @returns {Promise} + */ +new_wallet(storage_type: string, mutable: boolean): Promise; + +/** + * @param {string} storage_type + * @param {boolean} non_fungible + * @param {string} token_symbol + * @param {string} decimals + * @param {string} max_supply + * @returns {Promise} + */ +new_faucet(storage_type: string, non_fungible: boolean, token_symbol: string, decimals: string, max_supply: string): Promise; + +/** + * @param {string} target_account_id + * @param {string} faucet_id + * @param {string} note_type + * @param {string} amount + * @returns {Promise} + */ +new_mint_transaction(target_account_id: string, faucet_id: string, note_type: string, amount: string): Promise; + +/** + * @param {string} sender_account_id + * @param {string} target_account_id + * @param {string} faucet_id + * @param {string} note_type + * @param {string} amount + * @param {string | undefined} [recall_height] + * @returns {Promise} + */ +new_send_transaction(sender_account_id: string, target_account_id: string, faucet_id: string, note_type: string, amount: string, recall_height?: string): Promise; + +/** + * @param {string} account_id + * @param {(string)[]} list_of_notes + * @returns {Promise} + */ +new_consume_transaction(account_id: string, list_of_notes: (string)[]): Promise; + +/** + * @param {string} sender_account_id + * @param {string} offered_asset_faucet_id + * @param {string} offered_asset_amount + * @param {string} requested_asset_faucet_id + * @param {string} requested_asset_amount + * @param {string} note_type + * @returns {Promise} + */ +new_swap_transaction(sender_account_id: string, offered_asset_faucet_id: string, offered_asset_amount: string, requested_asset_faucet_id: string, requested_asset_amount: string, note_type: string): Promise; + +/** + * @param {any} filter + * @returns {Promise} + */ +get_input_notes(filter: any): Promise; + +/** + * @param {string} note_id + * @returns {Promise} + */ +get_input_note(note_id: string): Promise; + +/** + * @param {any} filter + * @returns {Promise} + */ +get_output_notes(filter: any): Promise; + +/** + * @param {string} note_id + * @returns {Promise} + */ +get_output_note(note_id: string): Promise; + +/** + * @returns {Promise} + */ +sync_state(): Promise; + +/** + * @returns {Promise} + */ +get_transactions(): Promise; + +/** + * @param {string} tag + * @returns {Promise} + */ +add_tag(tag: string): Promise; + +/** + */ +constructor(); + +/** + * @param {string | undefined} [node_url] + * @returns {Promise} + */ +create_client(node_url?: string): Promise; +``` diff --git a/wasm/js/db/schema.js b/wasm/js/db/schema.js index aa7ffa695..2c1e1cd7f 100644 --- a/wasm/js/db/schema.js +++ b/wasm/js/db/schema.js @@ -3,7 +3,7 @@ import Dexie from "dexie"; const DATABASE_NAME = 'MidenClientDB'; export async function openDatabase() { - console.log('Opening database blah blah...') + console.log('Opening database...') try { await db.open(); console.log("Database opened successfully"); diff --git a/wasm/test.html b/wasm/test.html index 3f6122e5b..f86d55e69 100644 --- a/wasm/test.html +++ b/wasm/test.html @@ -1140,7 +1140,7 @@ // await testCreateNewFaucet(); await testGetAccounts(false); // await testGetAccount(); - // await testNewMintTransaction(); + await testNewMintTransaction(); // await testNewConsumeTransaction(); // await testNewSendTransaction(); // await testNewSendTransactionWithRecallHeight(); diff --git a/website/next.config.js b/website/next.config.js index 9d9f42037..f6c3100b3 100644 --- a/website/next.config.js +++ b/website/next.config.js @@ -1,22 +1,16 @@ -// const ThreadsPlugin = require("threads-plugin") - /** @type {import('next').NextConfig} */ const nextConfig = { reactStrictMode: false, webpack: (config, { isServer }) => { - // if (!isServer) { - // Ensures that web workers can import scripts. - // config.output.publicPath = '/_next/'; - config.experiments = { - ...config.experiments, - asyncWebAssembly: true, - syncWebAssembly: true, - topLevelAwait: true, - layers: true, + if (!isServer) { + config.experiments = { + ...config.experiments, + asyncWebAssembly: true, + syncWebAssembly: true, + topLevelAwait: true, + layers: true, + } } - // config.plugins.push(new ThreadsPlugin()) - // config.output.globalObject = 'self'; - // } return config; } diff --git a/website/src/app/accounts/page.tsx b/website/src/app/accounts/page.tsx index 2caae712d..0ea2408ca 100644 --- a/website/src/app/accounts/page.tsx +++ b/website/src/app/accounts/page.tsx @@ -16,7 +16,7 @@ interface Account { vault_root: string } -function AccountsTable({ accounts, isLoading, fetchAccounts }: { accounts: Account[], isLoading: boolean, fetchAccounts: () => void }) { +function AccountsTable({ accounts, isLoading }: { accounts: Account[], isLoading: boolean }) { return (
    @@ -49,11 +49,13 @@ function AccountsTable({ accounts, isLoading, fetchAccounts }: { accounts: Accou export default function Accounts() { const workerRef = useRef() + const [accountStorageType, setAccountStorageType] = useState('OffChain') + const [accountMutable, setAccountMutable] = useState(true) const [createAccountLoading, setCreateAccountLoading] = useState(false) - const [fetchAccountsLoading, setFetchAccountsLoading] = useState(false) + const [fetchAccountsLoading, setFetchAccountsLoading] = useState(true) const [accounts, setAccounts] = useState([]) - function createWorkerAndSendMessage(message: string) { + function createWorkerAndSendMessage(message: object) { return new Promise((resolve, reject) => { workerRef.current = new Worker(new URL('../../workers/accounts.ts', import.meta.url), { type : "module" }); @@ -65,7 +67,7 @@ export default function Accounts() { break; case "createAccount": console.log('create account worker finished') - workerRef.current?.postMessage("fetchAccounts") + workerRef.current?.postMessage({ type: "fetchAccounts" }) setCreateAccountLoading(false) break; case "fetchAccounts": @@ -86,51 +88,23 @@ export default function Accounts() { } useLayoutEffect(() => { - createWorkerAndSendMessage("fetchAccounts") - // workerRef.current = new Worker(new URL('../../workers/accounts.ts', import.meta.url), { type : "module" }); - // workerRef.current.onmessage = async (event) => { - // switch (event.data.type) { - // case "createAccount": - // console.log('create account worker finished') - // workerRef.current?.postMessage("fetchAccounts") - // setCreateAccountLoading(false) - // break; - // case "fetchAccounts": - // console.log('fetch accounts worker finished', event.data.accounts) - // setFetchAccountsLoading(false) - // setAccounts(event.data.accounts) - // break; - // default: - // console.log('invalid message:', event.data); - // break; - // } - // } - // workerRef.current.onerror = (error) => { - // console.error('Worker error:', error.message) - // } + createWorkerAndSendMessage({ type: "fetchAccounts" }) return () => { workerRef.current?.terminate(); } }, []) - useEffect(() => { - fetchAccounts() - }, []) - const fetchAccounts = () => { - console.log('fetching accounts') setFetchAccountsLoading(true) - console.log('sending fetchAccounts to worker') - console.log('workerRef', workerRef.current) workerRef.current?.postMessage("fetchAccounts") } async function createAccount() { try { setCreateAccountLoading(true) - workerRef.current?.postMessage("createAccount") + workerRef.current?.postMessage({ type: "createAccount", params: { storageType: accountStorageType, mutable: accountMutable } }) } catch (error) { console.error('Failed to call create account:', error); } @@ -139,6 +113,14 @@ export default function Accounts() { return (
    + +
    diff --git a/website/src/app/faucets/page.tsx b/website/src/app/faucets/page.tsx new file mode 100644 index 000000000..5029280ae --- /dev/null +++ b/website/src/app/faucets/page.tsx @@ -0,0 +1,136 @@ +'use client' + +// import { testNewRegularAccount } from '../../helpers/account-helpers'; +// import { useWasm } from '@/context/wasm-context'; +import DashboardLayout from '@/layouts/dashboard/_dashboard'; +import { ReactElement, use, useCallback, useEffect, useLayoutEffect, useRef } from 'react'; + +import { useState } from 'react' +import Loader from '@/components/ui/loader'; + +interface Account { + id: number + nonce: string + code_root: string + storage_root: string + vault_root: string +} + +function FaucetsTable({ accounts, isLoading }: { accounts: Account[], isLoading: boolean }) { + + return ( +
    +
    +

    Faucets

    +
    + + + + + + + + + {isLoading + ? + : accounts.map((account) => ( + + + + + )) + } + +
    IdNonce
    {account.id}{account.nonce}
    +
    + ) +} + +export default function Faucets() { + const workerRef = useRef() + const [accountStorageType, setAccountStorageType] = useState('OffChain') + const [accountMutable, setAccountMutable] = useState(true) + const [createAccountLoading, setCreateAccountLoading] = useState(false) + const [fetchAccountsLoading, setFetchAccountsLoading] = useState(true) + const [accounts, setAccounts] = useState([]) + + function createWorkerAndSendMessage(message: object) { + return new Promise((resolve, reject) => { + workerRef.current = new Worker(new URL('../../workers/accounts.ts', import.meta.url), { type : "module" }); + + workerRef.current.onmessage = function(event) { + switch (event.data.type) { + case "ready": + workerRef.current?.postMessage(message); + break; + case "createAccount": + workerRef.current?.postMessage({ type: "fetchAccounts" }) + setCreateAccountLoading(false) + break; + case "fetchAccounts": + setFetchAccountsLoading(false) + setAccounts(event.data.accounts) + break; + default: + console.log('invalid message:', event.data); + break; + } + }; + + workerRef.current.onerror = function(error) { + reject(error); + }; + }); + } + + useLayoutEffect(() => { + createWorkerAndSendMessage({ type: "fetchAccounts" }) + + return () => { + workerRef.current?.terminate(); + } + }, []) + + const fetchAccounts = () => { + console.log('fetching accounts') + setFetchAccountsLoading(true) + + console.log('sending fetchAccounts to worker') + console.log('workerRef', workerRef.current) + workerRef.current?.postMessage("fetchAccounts") + } + + async function createAccount() { + try { + setCreateAccountLoading(true) + workerRef.current?.postMessage({ type: "createAccount", params: { storageType: accountStorageType, mutable: accountMutable } }) + } catch (error) { + console.error('Failed to call create account:', error); + } + } + + return ( +
    +
    + + + +
    + +
    + ) +} + +Faucets.getLayout = function getLayout(page: ReactElement) { + return ( + + {page} + + ) +} \ No newline at end of file diff --git a/website/src/app/greet/page.tsx b/website/src/app/greet/page.tsx deleted file mode 100644 index dcd7bbdb4..000000000 --- a/website/src/app/greet/page.tsx +++ /dev/null @@ -1,29 +0,0 @@ -'use client' - -import { useWasm } from '@/context/wasm-context'; - -export default function Greet() { - const wasm = useWasm(); - if (!wasm) { - return
    Loading...
    ; - } - - async function greetFromWasm() { - if (!wasm) { - console.error('wasm or webClient is null'); - return - } - - wasm.greet(); - console.log('serialze: ', wasm.serialize_test()) - } - - return ( -
    -
    -
    This is the greeting page.
    - -
    -
    - ) -} \ No newline at end of file diff --git a/website/src/layouts/dashboard/_sidebar.tsx b/website/src/layouts/dashboard/_sidebar.tsx index c5443a74c..aadcbec08 100644 --- a/website/src/layouts/dashboard/_sidebar.tsx +++ b/website/src/layouts/dashboard/_sidebar.tsx @@ -10,8 +10,8 @@ import { MenuItem } from "../../components/ui/collapsible-menu"; const routes = { gettingStarted: '/', - greet: '/greet', accounts: '/accounts', + faucets: '/faucets', notes: '/notes', transactions: '/transactions' }; @@ -23,14 +23,14 @@ const menuItems = [ href: routes.gettingStarted, }, { - name: 'Greet', + name: 'Accounts', icon: , - href: routes.greet, + href: routes.accounts, }, { - name: 'Accounts', + name: 'Faucets', icon: , - href: routes.accounts, + href: routes.faucets, }, { name: 'Notes', diff --git a/website/src/workers/accounts.ts b/website/src/workers/accounts.ts index 727e7ba3a..a92e86950 100644 --- a/website/src/workers/accounts.ts +++ b/website/src/workers/accounts.ts @@ -7,20 +7,22 @@ postMessage({ type: "ready" }); addEventListener('message', async (event) => { console.log('worker received message', event.data) - // const webClient = new WebClient(); - // await webClient.create_client(); - console.log() - switch (event.data) { + switch (event.data.type) { + case "createAccount": - const accountId = await webClient.new_wallet("OffChain", true); + const params = event.data.params + console.log('creating account', params) + const accountId = await webClient.new_wallet(params.storageType, params.mutable); console.log('account created', accountId); postMessage({ type: "createAccount", accountId }); break; + case "fetchAccounts": const accounts = await webClient.get_accounts(); console.log('accounts fetched', accounts); postMessage({ type: "fetchAccounts", accounts: accounts }); break; + default: console.log('invalid message:', event.data); postMessage({}); diff --git a/website/tsconfig.json b/website/tsconfig.json index e50c259b1..956bbe5f9 100644 --- a/website/tsconfig.json +++ b/website/tsconfig.json @@ -1,7 +1,4 @@ { - "presets": [ - ["@babel/preset-env", { "modules": false }] - ], "compilerOptions": { "target": "esnext", "lib": [ From 6c0b9461bac1ae74cc7bf19723b65fce263bb52b Mon Sep 17 00:00:00 2001 From: JohnDonavon Date: Mon, 17 Jun 2024 18:08:40 -0700 Subject: [PATCH 32/42] More readme stuff --- wasm/LICENSE | 21 ++++++++++++ wasm/README.md | 77 ++++++++++++++++++++++++++++++++++++++++++-- wasm/package.json | 2 +- website/package.json | 2 +- 4 files changed, 98 insertions(+), 4 deletions(-) create mode 100644 wasm/LICENSE diff --git a/wasm/LICENSE b/wasm/LICENSE new file mode 100644 index 000000000..7e84649f0 --- /dev/null +++ b/wasm/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2024 Polygon Miden + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/wasm/README.md b/wasm/README.md index 311de2ca3..548513c67 100644 --- a/wasm/README.md +++ b/wasm/README.md @@ -15,17 +15,86 @@ yarn add @demox-labs/miden-sdk ## Usage -```javascript +```typescript import { WebClient } from "@demox-labs/miden-sdk"; const webClient = new WebClient(); await webClient.create_client(); // Use webclient to create accounts, notes, transactions, etc. -// This will create an mutable, offchain account and store it in indexedDb +// This will create a mutable, off-chain account and store it in IndexedDB const accountId = await webClient.new_wallet("OffChain", true); ``` +## Examples +### The WebClient +The WebClient is your gateway to creating and interacting with anything miden vm related. +Example: +```typescript +// Creates a new WebClient instance which can then be configured after +const webClient = new WebClient(); + +// Creates the internal client of a previously instantiated WebClient. +// Can provide `node_url` as an optional parameter. Defaults to "http://localhost:57291". +// See https://github.com/0xPolygonMiden/miden-node for setting up and running your own node locally +await webClient.create_client(); +``` +### Accounts +You can use the WebClient to create and retrieve account information. +```typescript +const webClient = new WebClient(); +await webClient.create_client(); + +/** + * Creates a new wallet account. + * + * @param storage_type String. Either "OffChain" or "OnChain". + * @param mutable Boolean. Whether the wallet code is mutable or not + * + * Returns: Wallet Id + */ +const walletId = await webClient.new_wallet("OffChain", true); + +/** + * Creates a new faucet account. + * + * @param storage_type String. Either "OffChain" or "OnChain". + * @param non_fungible Boolean. Whether the faucet is non_fungible or not. NOTE: Non-fungible faucets are not supported yet + * @param token_symbol String. Token symbol of the token the faucet creates + * @param decimals String. Decimal precision of token. + * @param max_supply String. Maximum token supply + */ +const faucetId = await webClient.new_faucet("OffChain", true, "TOK", 6, 1_000_000) + +// Returns all accounts. Both wallets and faucets. +const accounts = await webClient.get_accounts() + +// Gets a single account by id +const account = await webClient.get_account("0x9258fec00ad6d9bc"); +``` + +### Transactions +You can use the webClient to facilitate transactions between accounts. + +Let's mint some tokens for our wallet from our faucet: +```typescript +const webClient = new WebClient(); +await webClient.create_client(); +const walletId = await webClient.new_wallet("OffChain", true); +const faucetId = await webClient.new_faucet("OffChain", true, "TOK", 6, 1_000_000); + +// Syncs web client with node state. +await webClient.sync_state(); +// Caches faucet account auth. A workaround to allow for synchronicity in the transaction flow. +await webClient.fetch_and_cache_account_auth_by_pub_key(faucetId); + +// Mint 10_000 tokens for the previously created wallet via a Private Note +const newTxnResult = await webClient.new_mint_transaction(walletId, faucetId, "Private", 10_000) + +// Sync state again +await webClient.sync_state(); +``` + ## API Reference ```typescript @@ -176,3 +245,7 @@ constructor(); */ create_client(node_url?: string): Promise; ``` + +## License + +This project is licensed under the MIT License - see the LICENSE file for details. \ No newline at end of file diff --git a/wasm/package.json b/wasm/package.json index cecaaf05f..27d7a52cc 100644 --- a/wasm/package.json +++ b/wasm/package.json @@ -1,6 +1,6 @@ { "name": "@demox-labs/miden-sdk", - "version": "0.0.2", + "version": "0.0.3", "description": "Polygon Miden Wasm SDK", "collaborators": [ "Polygon Miden", diff --git a/website/package.json b/website/package.json index a8a69b0f5..d4061fd44 100644 --- a/website/package.json +++ b/website/package.json @@ -12,7 +12,7 @@ "lint": "next lint" }, "dependencies": { - "@demox-labs/miden-sdk": "file:../wasm/dist", + "@demox-labs/miden-sdk": "^.0.0.3", "@tailwindcss/forms": "^0.5.7", "@tailwindcss/typography": "^0.5.13", "classnames": "^2.5.1", From f5b03a4ac3f538a2baf161df04bbf88be9f4be40 Mon Sep 17 00:00:00 2001 From: JohnDonavon Date: Thu, 20 Jun 2024 14:58:40 -0700 Subject: [PATCH 33/42] Completed account and faucet page --- website/package.json | 2 +- website/src/app/accounts/page.tsx | 47 ++++++++++------- website/src/app/faucets/page.tsx | 86 +++++++++++++++++++++---------- website/src/workers/accounts.ts | 16 +++++- 4 files changed, 102 insertions(+), 49 deletions(-) diff --git a/website/package.json b/website/package.json index d4061fd44..a8a69b0f5 100644 --- a/website/package.json +++ b/website/package.json @@ -12,7 +12,7 @@ "lint": "next lint" }, "dependencies": { - "@demox-labs/miden-sdk": "^.0.0.3", + "@demox-labs/miden-sdk": "file:../wasm/dist", "@tailwindcss/forms": "^0.5.7", "@tailwindcss/typography": "^0.5.13", "classnames": "^2.5.1", diff --git a/website/src/app/accounts/page.tsx b/website/src/app/accounts/page.tsx index 0ea2408ca..bcb4be22a 100644 --- a/website/src/app/accounts/page.tsx +++ b/website/src/app/accounts/page.tsx @@ -1,19 +1,21 @@ 'use client' -// import { testNewRegularAccount } from '../../helpers/account-helpers'; -// import { useWasm } from '@/context/wasm-context'; import DashboardLayout from '@/layouts/dashboard/_dashboard'; -import { ReactElement, use, useCallback, useEffect, useLayoutEffect, useRef } from 'react'; +import { ReactElement, useLayoutEffect, useRef } from 'react'; import { useState } from 'react' import Loader from '@/components/ui/loader'; -interface Account { +export interface Account { id: number nonce: string - code_root: string - storage_root: string vault_root: string + storage_root: string + code_root: string + account_type: string, + is_faucet: boolean, + is_regular_account: boolean, + is_on_chain: boolean, } function AccountsTable({ accounts, isLoading }: { accounts: Account[], isLoading: boolean }) { @@ -21,7 +23,7 @@ function AccountsTable({ accounts, isLoading }: { accounts: Account[], isLoading return (
    -

    Accounts

    +

    Wallets

    @@ -42,7 +44,6 @@ function AccountsTable({ accounts, isLoading }: { accounts: Account[], isLoading }
    - {/* */}
    ) } @@ -112,18 +113,28 @@ export default function Accounts() { return (
    -
    - - +
    +
    +
    + + +
    + +
    + + +
    +
    +
    - + account.is_regular_account)} isLoading={fetchAccountsLoading} />
    ) } diff --git a/website/src/app/faucets/page.tsx b/website/src/app/faucets/page.tsx index 5029280ae..5d7447b88 100644 --- a/website/src/app/faucets/page.tsx +++ b/website/src/app/faucets/page.tsx @@ -1,20 +1,12 @@ 'use client' -// import { testNewRegularAccount } from '../../helpers/account-helpers'; -// import { useWasm } from '@/context/wasm-context'; import DashboardLayout from '@/layouts/dashboard/_dashboard'; -import { ReactElement, use, useCallback, useEffect, useLayoutEffect, useRef } from 'react'; +import { ReactElement, useLayoutEffect, useRef } from 'react'; import { useState } from 'react' import Loader from '@/components/ui/loader'; +import { Account } from '../accounts/page'; -interface Account { - id: number - nonce: string - code_root: string - storage_root: string - vault_root: string -} function FaucetsTable({ accounts, isLoading }: { accounts: Account[], isLoading: boolean }) { @@ -46,13 +38,24 @@ function FaucetsTable({ accounts, isLoading }: { accounts: Account[], isLoading: ) } +// { +// storageType: "OffChain", +// nonFungible: false, +// tokenSymbol: "TOK", +// decimals: "6", +// maxSupply: "1000000" +// } + export default function Faucets() { const workerRef = useRef() - const [accountStorageType, setAccountStorageType] = useState('OffChain') - const [accountMutable, setAccountMutable] = useState(true) + const [faucetStorageType, setFaucetStorageType] = useState('OffChain') + const [tokenSymbol, setTokenSymbol] = useState("TOK") + const [decimals, setDecimals] = useState("6") + const [maxSupply, setMaxSupply] = useState("1000000") const [createAccountLoading, setCreateAccountLoading] = useState(false) const [fetchAccountsLoading, setFetchAccountsLoading] = useState(true) const [accounts, setAccounts] = useState([]) + const [recentFaucetId, setRecentFaucetId] = useState(""); function createWorkerAndSendMessage(message: object) { return new Promise((resolve, reject) => { @@ -63,8 +66,9 @@ export default function Faucets() { case "ready": workerRef.current?.postMessage(message); break; - case "createAccount": + case "createFaucet": workerRef.current?.postMessage({ type: "fetchAccounts" }) + setRecentFaucetId(event.data.faucetId) setCreateAccountLoading(false) break; case "fetchAccounts": @@ -99,30 +103,56 @@ export default function Faucets() { console.log('workerRef', workerRef.current) workerRef.current?.postMessage("fetchAccounts") } - - async function createAccount() { + + async function createFaucet() { try { setCreateAccountLoading(true) - workerRef.current?.postMessage({ type: "createAccount", params: { storageType: accountStorageType, mutable: accountMutable } }) + workerRef.current?.postMessage({ + type: "createFaucet", + params: { + storageType: faucetStorageType, + nonFungible: false, // Only support fungible tokens for now + tokenSymbol: tokenSymbol, + decimals: decimals, + maxSupply: maxSupply + } + }) } catch (error) { console.error('Failed to call create account:', error); } } - + return (
    -
    - - - +
    +
    +
    + + +
    + +
    + + setTokenSymbol(e.target.value)} className="text-sm bg-gray-700 text-white rounded-md h-10 w-32 mr-4 cursor-pointer" /> +
    + +
    + + setDecimals(e.target.value)} className="text-sm bg-gray-700 text-white rounded-md h-10 w-32 mr-4 cursor-pointer" /> +
    + +
    + + setMaxSupply(e.target.value)} className="text-sm bg-gray-700 text-white rounded-md h-10 w-32 mr-4 cursor-pointer" /> +
    +
    + +
    - + account.is_faucet)} isLoading={fetchAccountsLoading} />
    ) } diff --git a/website/src/workers/accounts.ts b/website/src/workers/accounts.ts index a92e86950..a6feffcee 100644 --- a/website/src/workers/accounts.ts +++ b/website/src/workers/accounts.ts @@ -7,10 +7,9 @@ postMessage({ type: "ready" }); addEventListener('message', async (event) => { console.log('worker received message', event.data) + const params = event.data.params switch (event.data.type) { - case "createAccount": - const params = event.data.params console.log('creating account', params) const accountId = await webClient.new_wallet(params.storageType, params.mutable); console.log('account created', accountId); @@ -23,6 +22,19 @@ addEventListener('message', async (event) => { postMessage({ type: "fetchAccounts", accounts: accounts }); break; + case "createFaucet": + console.log('creating faucet', params) + const faucetId = await webClient.new_faucet( + params.storageType, + params.nonFungible, + params.tokenSymbol, + params.decimals, + params.maxSupply + ); + console.log('faucet created', faucetId); + postMessage({ type: "createFaucet", faucetId }); + break; + default: console.log('invalid message:', event.data); postMessage({}); From 1ef289dd0e0600fba6726e10f8259f5953a65fea Mon Sep 17 00:00:00 2001 From: JohnDonavon Date: Thu, 20 Jun 2024 16:21:55 -0700 Subject: [PATCH 34/42] Add notes page --- wasm/src/web_client/account.rs | 4 + wasm/src/web_client/models/accounts.rs | 16 +- wasm/test.html | 2 +- website/src/app/accounts/page.tsx | 26 +- website/src/app/faucets/page.tsx | 21 +- website/src/app/notes/page.tsx | 114 ++++++++- website/src/app/transactions/page.tsx | 13 + website/src/layouts/_layout-menu.tsx | 253 ------------------- website/src/layouts/dashboard/_dashboard.tsx | 11 - website/src/layouts/dashboard/_sidebar.tsx | 10 +- website/src/workers/accounts.ts | 14 + 11 files changed, 175 insertions(+), 309 deletions(-) delete mode 100644 website/src/layouts/_layout-menu.tsx diff --git a/wasm/src/web_client/account.rs b/wasm/src/web_client/account.rs index 8801d4e78..9c02886b0 100644 --- a/wasm/src/web_client/account.rs +++ b/wasm/src/web_client/account.rs @@ -57,6 +57,10 @@ impl WebClient { account.vault_root().to_string(), account.storage_root().to_string(), account.code_root().to_string(), + format!("{:?}", account.id().account_type()), + account.id().is_faucet(), + account.id().is_regular_account(), + account.id().is_on_chain() ) }).collect(); diff --git a/wasm/src/web_client/models/accounts.rs b/wasm/src/web_client/models/accounts.rs index b8c7dd41b..ca5f7bd0a 100644 --- a/wasm/src/web_client/models/accounts.rs +++ b/wasm/src/web_client/models/accounts.rs @@ -10,6 +10,10 @@ pub struct SerializedAccountStub { vault_root: String, storage_root: String, code_root: String, + account_type: String, + is_faucet: bool, + is_regular_account: bool, + is_on_chain: bool, } #[wasm_bindgen] @@ -19,14 +23,22 @@ impl SerializedAccountStub { nonce: String, vault_root: String, storage_root: String, - code_root: String + code_root: String, + account_type: String, + is_faucet: bool, + is_regular_account: bool, + is_on_chain: bool ) -> SerializedAccountStub { SerializedAccountStub { id, nonce, vault_root, storage_root, - code_root + code_root, + account_type, + is_faucet, + is_regular_account, + is_on_chain } } diff --git a/wasm/test.html b/wasm/test.html index f86d55e69..ebcb6bbd1 100644 --- a/wasm/test.html +++ b/wasm/test.html @@ -1148,7 +1148,7 @@ // await testGetTransactions(); // await testGetInputNotes(); // await testGetInputNote(); - // await testGetOutputNotes(); + await testGetOutputNotes(); // await testGetOutputNote(); // await testExportNote(); // await testImportInputNote(); diff --git a/website/src/app/accounts/page.tsx b/website/src/app/accounts/page.tsx index bcb4be22a..2f893c7ca 100644 --- a/website/src/app/accounts/page.tsx +++ b/website/src/app/accounts/page.tsx @@ -50,9 +50,9 @@ function AccountsTable({ accounts, isLoading }: { accounts: Account[], isLoading export default function Accounts() { const workerRef = useRef() - const [accountStorageType, setAccountStorageType] = useState('OffChain') - const [accountMutable, setAccountMutable] = useState(true) - const [createAccountLoading, setCreateAccountLoading] = useState(false) + const [walletStorageType, setWalletStorageType] = useState('OffChain') + const [walletMutable, setWalletMutable] = useState(true) + const [createWalletLoading, setCreateWalletLoading] = useState(false) const [fetchAccountsLoading, setFetchAccountsLoading] = useState(true) const [accounts, setAccounts] = useState([]) @@ -69,7 +69,7 @@ export default function Accounts() { case "createAccount": console.log('create account worker finished') workerRef.current?.postMessage({ type: "fetchAccounts" }) - setCreateAccountLoading(false) + setCreateWalletLoading(false) break; case "fetchAccounts": console.log('fetch accounts worker finished', event.data.accounts) @@ -96,16 +96,10 @@ export default function Accounts() { } }, []) - const fetchAccounts = () => { - setFetchAccountsLoading(true) - - workerRef.current?.postMessage("fetchAccounts") - } - async function createAccount() { try { - setCreateAccountLoading(true) - workerRef.current?.postMessage({ type: "createAccount", params: { storageType: accountStorageType, mutable: accountMutable } }) + setCreateWalletLoading(true) + workerRef.current?.postMessage({ type: "createAccount", params: { storageType: walletStorageType, mutable: walletMutable } }) } catch (error) { console.error('Failed to call create account:', error); } @@ -117,22 +111,22 @@ export default function Accounts() {
    - setWalletStorageType(event.target.value)} className="text-sm bg-gray-700 text-white rounded-md h-10 w-32 mr-4 cursor-pointer">
    - - setWalletMutable(event.target.value == 'true')} className="text-sm bg-gray-700 text-white rounded-md h-10 w-32 mr-4 cursor-pointer">
    - +
    account.is_regular_account)} isLoading={fetchAccountsLoading} />
    diff --git a/website/src/app/faucets/page.tsx b/website/src/app/faucets/page.tsx index 5d7447b88..14a51b1c7 100644 --- a/website/src/app/faucets/page.tsx +++ b/website/src/app/faucets/page.tsx @@ -38,14 +38,6 @@ function FaucetsTable({ accounts, isLoading }: { accounts: Account[], isLoading: ) } -// { -// storageType: "OffChain", -// nonFungible: false, -// tokenSymbol: "TOK", -// decimals: "6", -// maxSupply: "1000000" -// } - export default function Faucets() { const workerRef = useRef() const [faucetStorageType, setFaucetStorageType] = useState('OffChain') @@ -55,7 +47,7 @@ export default function Faucets() { const [createAccountLoading, setCreateAccountLoading] = useState(false) const [fetchAccountsLoading, setFetchAccountsLoading] = useState(true) const [accounts, setAccounts] = useState([]) - const [recentFaucetId, setRecentFaucetId] = useState(""); + const [recentFaucetId, setRecentFaucetId] = useState("") function createWorkerAndSendMessage(message: object) { return new Promise((resolve, reject) => { @@ -94,20 +86,11 @@ export default function Faucets() { workerRef.current?.terminate(); } }, []) - - const fetchAccounts = () => { - console.log('fetching accounts') - setFetchAccountsLoading(true) - - console.log('sending fetchAccounts to worker') - console.log('workerRef', workerRef.current) - workerRef.current?.postMessage("fetchAccounts") - } async function createFaucet() { try { setCreateAccountLoading(true) - workerRef.current?.postMessage({ + workerRef.current?.postMessage({ type: "createFaucet", params: { storageType: faucetStorageType, diff --git a/website/src/app/notes/page.tsx b/website/src/app/notes/page.tsx index f51f40504..8bd89ff38 100644 --- a/website/src/app/notes/page.tsx +++ b/website/src/app/notes/page.tsx @@ -1,10 +1,120 @@ 'use client' -import { useEffect } from 'react'; +import { ReactElement, useEffect, useLayoutEffect, useRef, useState } from 'react'; +import DashboardLayout from '@/layouts/dashboard/_dashboard'; +import Loader from '@/components/ui/loader'; + +function NotesTable({ inputNotes, outputNotes, inputNotesLoading, outputNotesLoading }: { inputNotes: string[], outputNotes: string[], inputNotesLoading: boolean, outputNotesLoading: boolean }) { + + return ( +
    +
    +
    +

    Input Notes

    +
    + + + + + + + + {inputNotesLoading + ? + : inputNotes.map((noteId) => ( + + + + )) + } + +
    Id
    {noteId}
    +
    +
    +
    +

    Output Notes

    +
    + + + + + + + + {outputNotesLoading + ? + : outputNotes.map((noteId) => ( + + + + )) + } + +
    Id
    {noteId}
    +
    +
    + ) +} export default function Notes() { + const workerRef = useRef() + const [inputNotes, setInputNotes] = useState([]) + const [fetchInputNotes, setFetchInputNotesLoading] = useState(true) + const [outputNotes, setOutputNotes] = useState([]) + const [fetchOutputNotes, setFetchOutputNotesLoading] = useState(true) + + function createWorkerAndFetchNotes() { + return new Promise((resolve, reject) => { + workerRef.current = new Worker(new URL('../../workers/accounts.ts', import.meta.url), { type : "module" }); + + workerRef.current.onmessage = function(event) { + switch (event.data.type) { + case "ready": + console.log('Worker is ready. Sending message...'); + workerRef.current?.postMessage({ type: "fetchInputNotes", params: { noteFilter: "All" } }); + break; + case "fetchInputNotes": + console.log('fetch input notes worker finished', event.data.inputNotes) + setFetchInputNotesLoading(false) + setInputNotes(event.data.inputNotes) + workerRef.current?.postMessage({ type: "fetchOutputNotes", params: { noteFilter: "All" } }); + break; + case "fetchOutputNotes": + console.log('fetch output notes worker finished', event.data.outputNotes) + setFetchOutputNotesLoading(false) + setOutputNotes(event.data.outputNotes) + break; + default: + console.log('invalid message:', event.data); + break; + } + }; + workerRef.current.onerror = function(error) { + reject(error); + }; + }); + } + + useLayoutEffect(() => { + createWorkerAndFetchNotes() + + return () => { + workerRef.current?.terminate(); + } + }, []) + + return ( +
    + +
    + ) +} + +Notes.getLayout = function getLayout(page: ReactElement) { return ( -
    This is the notes page
    + + {page} + ) } \ No newline at end of file diff --git a/website/src/app/transactions/page.tsx b/website/src/app/transactions/page.tsx index 75f795eca..7a29c4af0 100644 --- a/website/src/app/transactions/page.tsx +++ b/website/src/app/transactions/page.tsx @@ -1,3 +1,16 @@ +'use client' + +import DashboardLayout from '@/layouts/dashboard/_dashboard'; +import { ReactElement } from "react" + export default function Transactions() { return
    This is the transactions page
    +} + +Transactions.getLayout = function getLayout(page: ReactElement) { + return ( + + {page} + + ) } \ No newline at end of file diff --git a/website/src/layouts/_layout-menu.tsx b/website/src/layouts/_layout-menu.tsx deleted file mode 100644 index c08e36eb7..000000000 --- a/website/src/layouts/_layout-menu.tsx +++ /dev/null @@ -1,253 +0,0 @@ -import { Fragment } from 'react'; -import Logo from '@/components/ui/logo'; -import Button from '@/components/ui/button'; -import { Menu } from '@/components/ui/menu'; -import { Transition } from '@/components/ui/transition'; -import ActiveLink from '@/components/ui/links/active-link'; -import Scrollbar from '@/components/ui/scrollbar'; -import { ChevronForward } from '@/components/icons/chevron-forward'; -import { Close } from '@/components/icons/close'; -import { useDrawer } from '@/components/drawer-views/context'; -import { ChevronDown } from '@/components/icons/chevron-down'; - -const MenuLinks = [ - { - name: 'Home', - dropDownItems: [ - { name: 'Modern', href: '/' }, - { name: 'Minimal', href: '/minimal' }, - ], - }, - { name: 'Sign', href: '/sign' }, - { name: 'Decrypt', href: '/decrypt' }, - { name: 'Records', href: '/records' }, - { name: 'Execute', href: '/execute' }, - { name: 'Deploy', href: '/deploy' }, -]; - -export function MenuItems() { - return ( -
    - {MenuLinks.map((item, index) => ( - <> - {item.dropDownItems ? ( -
    - - - {item.name} - - - - - - - - {item.dropDownItems.map((dropDownItem, index) => ( - - - {dropDownItem.name} - - - ))} - - - -
    - ) : ( - - {item.name} - - )} - - ))} -
    - ); -} - -export default function DrawerMenu() { - const { closeDrawer } = useDrawer(); - return ( -
    -
    - -
    - -
    -
    - - -
    - - {({ open }) => ( - <> - - Explore - - - - - - - Collection - - - - - Trending - - - - - Browse - - - - - - )} - - - - Feed - - - Activity - - - - {({ open }) => ( - <> - - Account - - - - - - - View profile - - - - - settings - - - - - help - - - - - Disconnect - - - - - - )} - - - - Notification - -
    -
    - -
    - -
    -
    - ); -} diff --git a/website/src/layouts/dashboard/_dashboard.tsx b/website/src/layouts/dashboard/_dashboard.tsx index 77bb5c713..9fbb31e49 100644 --- a/website/src/layouts/dashboard/_dashboard.tsx +++ b/website/src/layouts/dashboard/_dashboard.tsx @@ -7,17 +7,6 @@ import { useIsMounted } from '@/lib/hooks/use-is-mounted'; import { useDrawer } from '@/components/drawer-views/context'; import Sidebar from '@/layouts/dashboard/_sidebar'; import React, { FC, useMemo } from 'react'; -// import { WalletMultiButton } from '@demox-labs/aleo-wallet-adapter-reactui'; - -// require('@demox-labs/aleo-wallet-adapter-reactui/dist/styles.css'); - -// function HeaderRightArea() { -// return ( -//
    -// -//
    -// ); -// } export function Header() { const { openDrawer } = useDrawer(); diff --git a/website/src/layouts/dashboard/_sidebar.tsx b/website/src/layouts/dashboard/_sidebar.tsx index aadcbec08..2c2621580 100644 --- a/website/src/layouts/dashboard/_sidebar.tsx +++ b/website/src/layouts/dashboard/_sidebar.tsx @@ -23,7 +23,7 @@ const menuItems = [ href: routes.gettingStarted, }, { - name: 'Accounts', + name: 'Wallets', icon: , href: routes.accounts, }, @@ -33,14 +33,14 @@ const menuItems = [ href: routes.faucets, }, { - name: 'Notes', + name: 'Transactions', icon: , - href: routes.notes, + href: routes.transactions, }, { - name: 'Transactions', + name: 'Notes', icon: , - href: routes.transactions, + href: routes.notes, } ]; diff --git a/website/src/workers/accounts.ts b/website/src/workers/accounts.ts index a6feffcee..05b63f17e 100644 --- a/website/src/workers/accounts.ts +++ b/website/src/workers/accounts.ts @@ -35,6 +35,20 @@ addEventListener('message', async (event) => { postMessage({ type: "createFaucet", faucetId }); break; + case "fetchInputNotes": + console.log('fetching input notes', params) + const inputNotes = await webClient.get_input_notes(params.noteFilter); + console.log('input notes fetched', inputNotes); + postMessage({ type: "fetchInputNotes", inputNotes: inputNotes }); + break; + + case "fetchOutputNotes": + console.log('fetching output notes', params) + const outputNotes = await webClient.get_output_notes(params.noteFilter); + console.log('output notes fetched', outputNotes); + postMessage({ type: "fetchOutputNotes", outputNotes: outputNotes }); + break; + default: console.log('invalid message:', event.data); postMessage({}); From 9d5f7cd5d01a59b370c5b8e84be140f28937f567 Mon Sep 17 00:00:00 2001 From: JohnDonavon Date: Fri, 21 Jun 2024 12:00:26 -0700 Subject: [PATCH 35/42] account -> wallet rename --- website/src/app/accounts/page.tsx | 10 +++---- website/src/workers/accounts.ts | 43 ++++++++++++++++++++++++------- 2 files changed, 39 insertions(+), 14 deletions(-) diff --git a/website/src/app/accounts/page.tsx b/website/src/app/accounts/page.tsx index 2f893c7ca..6c31e2cf7 100644 --- a/website/src/app/accounts/page.tsx +++ b/website/src/app/accounts/page.tsx @@ -66,8 +66,8 @@ export default function Accounts() { console.log('Worker is ready. Sending message...'); workerRef.current?.postMessage(message); break; - case "createAccount": - console.log('create account worker finished') + case "createWallet": + console.log('create wallet worker finished') workerRef.current?.postMessage({ type: "fetchAccounts" }) setCreateWalletLoading(false) break; @@ -96,10 +96,10 @@ export default function Accounts() { } }, []) - async function createAccount() { + async function createWallet() { try { setCreateWalletLoading(true) - workerRef.current?.postMessage({ type: "createAccount", params: { storageType: walletStorageType, mutable: walletMutable } }) + workerRef.current?.postMessage({ type: "createWallet", params: { storageType: walletStorageType, mutable: walletMutable } }) } catch (error) { console.error('Failed to call create account:', error); } @@ -126,7 +126,7 @@ export default function Accounts() {
    - +
    account.is_regular_account)} isLoading={fetchAccountsLoading} />

    LQzQfb7bQc<;XZ?lbql|2gMB03?uY0LFwX6#}I&CvWG|NM+{nX9;8^8meBWF6C&l zmh6L)DR814{uHH!5TuSaou&fvBDY{Mb^yMyY{mjunv#dGT!rPK3M%6t98c9ZRdge+ zw*@T3n%GdawgqfyNOCZIGPbCp>F_h~O2*Yid`N1erJ1l~IRgU)3$vTRwooWo z^qp-sLuG?0xAk>JxSUG%XUiUpM8mz!Dtlo9ZO7+Dnp9>11kv^YZTEz@G`q2)-3kja z7tWhz(P!#Yd&|PuDym?YIk>m7Q~y``|gYt z(zN0>cj`Q;?NlH4By2RLwr*d=pvNPwx@3wcwv07?R)9T#QY5k^C0SIlVwLI-kfvgd z7#JZn-wK2_vbvPT$%%fF0w&TOU1?2u*lh%t7A9qfHOXhB^a{!3i*a1rSj#hSxqcU( zw>tNncU#*HG>d*UcaEPuwzTth+t(agR_QV!z7Ha!h)+tpq%@7lPw<$el1g8wI?ZD1G{e?) z)8(A8Ek;Q|7=BOi@9X?;nMd^6viFLD@3WNvR>?~CF*j9<&_Vax%p4!19k>-)TkZTL z_qVxwJ9DoM_xo&zX*rlwyjzjh6YT^tnx)Kcxi9U>p#XM)2Qamrt!g{C9@_Pn9neyQ zv&`LF-qro5-Q7WGpXY9XRm@%$0xeszAopzns4(|Df|hGn+&YGu=-h6dqLwJ7j26=O z;nqURzNnUGibPJ4!4}z4bp}ym5p0&rlI0LlQHw#b-LR%rR9^J4n6XIlWR5z7>8uKr zN52syj$+?-A#$?-0TqIyoj^0s+U3974VVhrD*Vr0z-$jw?%K3~0nxo;%E)j6G`J|M zWdt~2OblHGpyNmxL!n#%5r7te8iRq8w!H;TidiJJj|#d|F-^ky>8cD57%ym0#S>`> zU>6dN0SDCLQKo2Hv=E#Erua(mczVQTsAn^xN2W8dvD?xN4<({0?sr67c227efIzs4 zQ+%y`(Ik1DYK#yMC(LgK+FuEAiDq;0U8dB5#om}YLeT#&SC!S_wL{RX41W#@gC4~ z|27LU8FN{0WPwgofh@Ctjj~pfR_6oBpbD6JZ9$Xb?6)KY&h}H*&v5Vr%50MSX=wK6VHO;BY*;wMD&;>IzmvEC= zW@|L5A*d0PbPRG72(jy6V)Qh_I;b-%0qSmDx#C3m9mSHfDq0GUv85EX@n6*;}+HoO9kT@ZQ27#Jz#wsSe;c+j~*y+Q-56kh;j^JO8^5YNc?J0-B) zWKhKb8*bs)mc&)za|c-wj9}KdwK5qfhm<(7xi8Vj($uvi*#|6IR#-J`;%3((ws$z( z*kyb0U^GfTL>y<`V2S z^ZER=6^XDLb2}gNr>Qf_y9A5bsyv%zyEpAa=HYsgtF_=4O}n=%D4-NNQ<}<%WE{%p zk(P6p;?7y+1UBF@W0ocmt`KIg5bO(KBj+lGX{elCc5uIf8LEO-RTcr_N)`kAWwL%b zHr$IwHj^7`2Ln9`E=Ojj4m~PE+_egGBf!lg=dW9d9ELUCQXm>JcBY{+01d@R$>-S4 zQsu|JrrT;)W^S1x*KcccQ&>hR-^1q{GgQ9-Bn5bBlq(IC&8jR=F9WA6#7r4H0YVCp zm&6C_nmN=8NRlBy2BHj)145-Pk$bo+`h7rF0$3$0*~i=@$n`#lVdeRN{S6arQ*#Sd zR#iT*Qaumbnp#?Daejf8mlny~D*$>=Gw<=U4`+EdSUyH*r)V&g)SH@`1pFS@){cg? zod>bE+2^~$Hj4VNbAO^eI7r%o+07z$vha5sIfY1_cN71+y}eBn6B8n2S{UeGuz3z8 z+CZ$(J(wFuYqMNU$D#&^awUc6ZiWM)W*|Ui^TY#qPC7I8=7(& zVEZ%B+Md5_w2Nfjw>!K3v;pXTNPaJnx#M$fN6cUGvdg5(mL}ReWSVUcEnkjePMsF!}v{`ZycTv!SVxygn~YO-$0h8JpUkzkUca@A`FdOq)7l z&XLIHiVE`byJ7Oq9mznK zXgh8PfCP*aT)_|()qEZmWDf?88Dm3)LltAE&e&!ab#W7-sI&&wid%x4GXunmK>uth zi?C!RE7=3EdzeQ*w3++--ong|4X)1hx#*XFIzSx_5Hxhq4==^(cfOsVSmGfqD<6PW zR8|UOg0e1q2L10t%H-@GuhBiRBvdTZVAEKblDu9YH8nQMgza`X>2O^at#8E1@AS~o zmUg-@bA#r#7I(Fno5pv5EStS51X(-3E9glv5Ye<<0Nu4p3E2^s6tMbfP^eU~puK=-+WY*QtGMZ6A=O?RT>r__?{yCi^_;MIW1F z679p!?*0_)Y2%?oG&M9V5)Te*(2aCT;;2YssT@+PP=`W1oQ`0nEMZg09@NzcC|!B`ev-+>8gH0iz})Gv@;+i~&Y1!Ab@ku+u$G`mMhm zrc<2`8X1jHIvuCK@&zCLFTYV%6dQ(@ZEbC>{0?Ad?|(n6p`n3lYHH{Zzs&K2{+&B_ zF2@R-K7E?*ht<{B%S3E`;QvuU%+DS_RQz+0<*v)lcCEi_YHNf6fPLZki`-+erLe$IE?+<789&O^%doIEKLA+7~FFy_1OC%e7EdlBx*9%lc-%rx~L?UT=so;Xew zRqDCy>Fbr4%HsWtPqp}Z?QN(A;4do^(1h4Cz$gRpV?MtG#H*T(n&ZV`cx4n3DS0~b>^S3gS$ z-sx8TCn=>M`>7`v+vZDj6z)e7M2R3*(|VCPta@Q8_*GS!&-vK1st+oT(n<$63;L5) z3dd;L{=MiJMcbNIMv&Sz*Y3TXr}bcd(DRgYvtGI~=@xElpC?`hR)1l3=9i3(d~>2Lh?273B*h)#5;=-NaDk2-JxYF`j|K(@sjsh( zF7jumc%qKSVib)=X?Av2z*S>Y6HQJ`(ER*7{p`>FEdAI2_TT6*yDzU@yC#!*6}!w} zCr+G@Og9_{6aD7qrd*3Mo&;`Ozb>GxzrSB%mr%Ooy?5U&np6SY02EOw=7U*Ih(L{N zeuQ)5YYjNvs}+I+b*HJ|ZCo2zb7d3tHL?3_Vw^gg>#4V^lM=CQ3h>1CbjKO`%C+yw zcJ&Mz0e+gO~sDSl>r^!dk4 z`geb#l0{COI!R?^L3;AZrzFmCfS(!2RA7v*Ub#ZY_&EWXzIpuy9XWQ4M)}!ksH>O4 z+9Sim)WgpJ#;J<;#Wh-5T%`HAIjUpO260#bCs8oIYljPt&~b6HWw@e}u3WlgB`AEHcZQv4Y;kW$0AzPXq5n(^6{JY?XOU#cGjCpwKB_J5<$NG*y=AgQW2fuoA#3 znV8aDv2NO|%8D`!b>pHI75wB5D=SFAn3aU9{O6jrEdvA7A^U5hwyebQM5P%k4?YHx zjRbfAy*R96VOz;~$y)82@;jahTbK~wFDsJHIv+!A>&W#T`>9DvipKH_DQjutIAn#G zRW!4%_OmCgtmT)tiy_<|eplmT_ub(rKF_puo_2qbq?0vvoTumlX`(*u zw6dsb#!#dq>xOdcrtlX zCUXEIOsbbIUZgL4{`2(etFO}MKKD5(-?F~3A>ViMWbppw%L0zNc*1}4jW?uE0CFkO zY9g8JE5c#@BAJ4{OPBkrWZc>Ng5v?7uP5zbzCou=kNaR@6uzB zJw~s+_8L9?%rg|@eF1bQcw6iT_c4zBd%yR4RKdUp&svJFEuKRBYoF!l*ciS1^2@Zq z6F>U#;wN7eFa?lU#h?!04?*moWI#4FG)U*qpQqKeHG1^XM+G<(j+O-T7miDz5769w z#R~85gGSxl=l6q5Eu`=-vgaI156a=nb)&61Bd)K@7Z&KzmQLzusiiC96ZG^We7%~o zWMjO>#wJ;e;2nu);;pydqI&)tOzLybe?p3FmkI!MKK>6(KcP6Sp7 zV3o`=Z-G*~%V|TGJoDjn?DP9x+dB8&*0smoR=BOpxw{SQZdWyQ?sE*+9=|)CdvEI~ z?2l`Yb{%&=#$MkSpJ%@Bdv3c|yN-hXIPWjxq%@1}Z!~}{Ewg)4QMK=Eun>zg1LWDF zXe>^(RRP+JY|!XzL_qrdO13CF3#;7Q%uGD~*yB{sD{V|3iDZJpp)hSnw?z(NirEv` z+dMh^kALrfqHliv8{$TKh9~kNW<7ci_o!5H?gLW6A*JxhnKJ?s-gy0WnS3zWZ!jac=88B1s2NIV!}ycq6UNWKCiq1DCR6yOx&(}tcnf#aFgyq+ZNTsyIX@M zgr~8@wTv+S!-cf zXaEsK%Z#0F&73qvUdkd*9BMfRI`^5qb8f>Aa;5D=bo3h3R&Gl#HKo(`L+->$lrl$bcopg5o6xqhRV1{H%F>zMN+k*9+ry;l20hlP|r* zY}5b)(qVe$xo2se0V!B7+%I6TLZNc1Z>XcAywK@A(kC(=a2Em?#p4Njn)jKSoS>7Z zPKm_C@e?Qc*^bHe#&yDY;2Amp#N#x~_sd~!!!D16`(&?mo)o^80nsHWUB~-Fx1<+z zU5Zd^7JFr9#AdB`nyRi~vO+M;~Vec9JypAE7?b4SmEC9 zOu{fvxL`H*vNB%T_8sn(-@p7*UV7qqJ^j!B`Zm3Iizvw!x_{u%w|Z~o@4cpw`G^e~Ho zdZ9j-m;R^E|1@oFf1kec_6F6LdFhva;XI|+kI+|t{3czR?9c5Bmnc}L%ghGC<%BW9 zM#3*XzZN}|VvNpgo<$lj;W0HTtKL|(&b$F%{FD2#Ois~Hn_tf{_d z_tbuq+5FtRxSaP}78G>Oa;Ms{i&{Re?toZEw0M?*{M+xmv+p)v{Nfks+u!~c?L2ch z!Zh7U=T9GHFzTYd)-?Suf7PV_@&B_*zL-g0eCh=Kmp3lZKmD~z`j77f>AgD&WPzq*X1KE3_8^x|#uvKY0{J}JHiwe1Z z5>}#|u=wsj{pbHgpZomh=%cn0gH^JUea!7al*&11RR-XN_#1$M-~RzmwiRdS*M8-B zI&=Dz2r3?Z^cnhp{n0mb;0gv;TcNuxVZHcs6F`CO1XufgwwDzGq@6%$uVWQ%a}ci*f?8_TI$7i?=+}$`+r0)pB$zC{-@m(uCAlXmI1o3 zF+IZ~9xhY-h)D?=ZP!>yP%-M@rIawF9or->`E0g0qtG<>ggFT-c5N?!TC8QI z_7!kteRdGI!hTD9-fBdO+t_KE&1Tt|ks4VpDfLHDTw8%I*1cZh!kj<*Z_zbp9I&vw zO0A9c)IaH>fAzZwI;y9ss@g&End|f`$366W-*VD>OHQ({?Iz!E_{oitjGrcBvC}Yq zJI5Sspw)?@9_{M0sYG>Qh2YBm4$p;V?r0m&BY&63-6wmGdn%Qr2)me3YtVGN6weOr zD(jwsEQ1V=l*6&XwQ_f(_95jmJNJ;vFf4XUp{|EwC4g13l6~CmLA+cJKv;O$O|kpt zaCf(;G5_9IzD`{o?R4?#ZHeRP9~icDi9SAtNd_R~UO?4OvfzUOF!LU^ut7lH4Q7{~ z0SH9!KG=`p$uupjw9ugjgTb&)OB<^+F|(XY`Y?B7FBG}gwEZH+3eKw#5bdLV^+9b< zHTB&a6>S3-Su&-7fz56f<^mS_{c`1@O|2LT6&%b4ize-8>mDwom9~&?TeBG$gXZQJ zsiq<%?!C7sy;SLGq!v9x+N!~ z{Z9wD4rsUNcQeN_AlSUUy`4hgFh!yoT_17S=`FNp=L!Wy_xSv7$1h?Q_5vpNaxS|j z?R_^a+GlZbQ2^G?1DZRwRjxtxxqY6x!z%S+yFslWEIUY@%%UKy4~H5hmdGJM3+}O7 zy!bfM+b!9#Ye}d46q;6an)f0=y1#u;aP>h!ip4eU`5oBK*_jzyU0GE~yBZB4^78Z8L2^KJEJAs~Z3F?%a$Vo2%hD5ej zlpT{rv;#nVfLl91j;4jt6u5xf?#hjRs;jP``nnnl_yaq%w~7yA?r{yYJ+~~joi4q* z0jvWtidnq9Nwgnl#V)}#ZLv#mk*`f67E^Fa^mCYRf_x2Rb8HZcJ?uC#6~$iUx>iB_ zM(%h@ImlFFY1-gQ6*zxL_^Jf3N>;LuyXhYRsM*ipI)l5AXqrm)VeJE6KXZ>i_P7U7 zs2V@}x3kZ_=B{5T*GG%c*`15G_Z~Yqpj~@td+bMhv~f4f9m_QLnDz^p5^*W%Rxo|G zAm&QT1=wfJVx~{@_-KbqaUaX;XjxfqGFTbqDnz>$U|L*WqQ#{}ayWG*k3;!H0uuq{ z+(!{1;D4Q>_2g7?G@43kaa!^+D*jSeF-^$Klb9xJOl%!HL!Gl^|5|ZP*xr_R!Evxi za|^3vD3x?gD<}?K994$hbgQopJ}=EMEV9pHnvhP8(-xp=^#eZ;4~0yR!zvtYsIgF4 zoHoOizby;hz35BU%wGY!5`fKwJuD^n62K~1$x8OY?O_Eq{Dri8A8VUs*=dEqBJYIR z8^G-PY@eX?z4};47MS<6#|{EypKbQsS-U%%Rmi**{<~LmxqZke0#>B$sD`lP-Zyf( zfmu4RJ2|#0_d&rg_ztkdZbNM-8Nga@@1l|kA_-zzpa+r<5|gCM-%5)!UsV8&$Wbg; zn=L(|0FkXEm1m3$n_jd48~#L!heOk4TMVmHcjQ2h9ei$I6a@wyR_vd}3gT;BH7?ET zng!HI#6-bjS?bP|Q>3@r+%NV{z@BM?DWl*LnYl4E&AZ==56Vgat7KyT<-dK6HaEBE zFaPWp==Pl<`pFyb&_DS5e~bR>?|)tNOa8CF`irDJL?)zUAKvhSblh(-cTL;%$|~I* z58giPG*Jv<_MWWv{On$U%zpbGw2}4!8`y>LY$T`cpu)`jXN6*-_V0!7uzeW1++=RE zOva8ja(&vPt-IM?n+YmaBFgH|Y#xI_fSA8`Xk>vP^^IYPE|aBsW&)T2Xcc(W$c9&@ zUA8C>LhN`lxX+|WvgHD`$4COiO~soTR-m|U#W=|b%L~O2@Mq$i92l~JwvjtFS$&cF zsG#~oVOFLMrVLcwz_}C+t<`r^@uIo=x5#~&|6R+0MlHYpL$VUUDw){y%$!iVNUuM4 z<|K`djZ-3?pvuZHxm_-%tXHVMwuVaf=g;n^Dtyj9Xl#sSMe#0FvIlB;%IY4sF90Vy z+tCi*Z|_5Cdwsaa{t620tn;T8O{V*~1I;}dA4W)|i z2eaVaV%p4{jfqPDt7H$^AnbVV>?yi+dw|ZKIYseUocw+tEiNrnSy_PmUN4pG&!;_z zQaK;i%zb|U^I(4-0AZmJXZ}O_0A}6;t##nuyZ^e!_I76qes}=$XY$^Ot` zJZVapE4QT*BCukP3O_5zd@LGQ(;in-T#`0`${`+8u}p?B$m}L6Pk!z4WP1(9rNG_4W10=Px|>6vY!sDlZRG$^Lwr6raA&rE;LvgAy5k zk?haHq#Z0PJMepC1b$%V>Z7*8f!r$yjBEyrC{KOtG5STqrA2yp1TqQb-l z(*jneRSs+CIIFC_y{?6|rNzeCz$({O)5dq)uBl?Sv_dw|v_Tpbv}OS>%`Cv9g@7#I zKC)#WhLuX?l&oYQb9)e_a{l>0|L62i{>eXisPy|^MEhs|^q+-|rz!@c848 zOP#)weRPIWGT;2>H|eF9UfOq?D_5@23opDN<)HpFX0uW`017LJCo7aPxF2R?Fl{fy zS=cYy2Y{M8VCx5UL4O!4Kz@&%f0W*Q`z?AHRsvWhE7`}~vRUJS#9_Vi$}9BFJMWZ0 z)<nThS;f!05`_IvwflqVK)> z2K~%uKSdQ`m1_Jp10evH#=2UXoSvon+G@JZAY)^5iyl9Bnr`+FQDc2Az53&~$m{dc z^G`iS9*>&_N5*Mve2U5feyXjh;(h1ng=e3jDgIZpREYtoAb2`DK1m&IE%f_e`!+rC z=ovcH-Xh0dURmYurX+I*;0GYc<9116Z%0cb)$?&-=+E%T1f4q3N0+bOlH*0Tw?$C3 zv7weh-6)+n+Dq?WyD5RH4fQqL=Q>*7*rMs#dFkWq{36v4&nMzSzZ4C_$kJ01jPf>aBqm#YROZci} zB`aCUK5{EDSS1r193H1IgQ~%iF>*Pb3|^dcgj6Ffh#d4bsFkwnAwU_ zQ)9gVBLJPcnrddCvJ5an6pJTBmj@!IDFzs@we<~hF&J_<9m4*!G9X%I5VzApHab)DK6G;Q#99c|4F(2f-K4gFnSS=-fTfW3vK zW%+J>bCW`$GD`4yFR!lAqi0Xi00Xnf&!48DkxBX}%`i$X!jhG&WF`Bkt;ArJOssZvZ?kg?0;XU!)s+l@+~nn-0S0FPLv_qz`Mh2! zk+8wwXMS;+*`yi)N!S(^E)R+zpN9cl!0#6@)78;RGqVdc!|k^=H46LH*4)UzWStfn z0D*D3Gc-nhJ%^+X><3n;wyKggBN0laGt}17BwA0^RpHz@0qmj8zQf(ZDuGc0Bc*eH zP8~fWH5a=MwbCfNA~WeMvr1*cTvaps1n^Z~TgB{EC0)95lb(C((OkO#csNh6W?=DB zskCUlz*U-Ia9PcaS7kWNAhC=YtTeNL8+7IRZ92r~dFjdxdW^x=M`;f#$Q^)ET*r*x z(&?ln4(%YPOTAXIJQlhoREXd0@+VS0178>gGK6N{4eWHfrBsG))qcyc%Q#<1H!ogj z>+WDdph|`)QB^amN_03Jnn>_uvzfdUk6jAH;gIc|E{}kH6mc^Pl%K(lqKi>pBpAHE zmOD0CjAU9EUVP+sxn+R?Rx`u*B6dUpV8c4D5^L0jCB^t)AD#bp@^N*m?i=d7fw_&x zV{#l^Gdwq{|5@&%lY+cBxYuh52H3&pn9bVfWbpCTwZVAW&EVNebDuFrxe?{Q>DC4! zH_2m%jx1a)1uDpb~~k>9Il@_e!dVgj%8R1-B@s`QYzMEL9IL8 zVg0Uin`)e-6bls!Z|VhifKokI$H~b3h%t*sqjD@Yj%uvke9a(Ng5x@QETI$*W*yIK zejJiAURYeB-%h!&OgS%HtBj13!S`}nE~;kfr{g}uLh@d(O)|1YCffLz*@s=mJ;>#s zyDZ4}yqg}Dm1G)9Rz zEG1&wG&V9t<>fxA4tr^8Y=pt?1W!~Ra(T-5^GX4xn4pdHHm$F(N#E?3G(;@ zWF)sKzP(B7OG~u2xvCVRH3dYn3=%N0;_d7Ylu@Xnl6XpF@a&)@Pp}@hPIbHph-|LY z*zh2wjWoBvwj`+?WyKmF(bO5gnB?@(u3H#Ii5QHIAQn_yt!Fz9e^CoL|l z&^Ax;EY___uB zK_0IpwKg|%dtJ1s;a8!_>n#VO#s3RbMp+I98|{FBOI!rbRtbl%S$q5 zS)RU{8f$5OX;DD$#KZ`__QUVmADi2rixt`*4 zO3?h=Bpuu~6cp6@H|P_p0g zC!Ptzp+0s{vHXmo)@@d?X`*0F9lh`m{~0~<3%^Vc!yNzkAOGWjLM1C%$v(CQKytqU z)*rv}9=(0>GOetv(8$0|O2&Ee4OWrE?W2~qHU<~V6p2L1?Q`?Q?EpU`6D!ygtSC(b zFKRGT33erK5MH)5HO*96Sw#~g12i+st{9PNtOi@wfvN>^#Ko?h3kf^CnNGNd^lH64?Fg_4@dCK2B4M#M#x=RrC36 z2pc*yaD)3jF3gWA-pec;gN00Ti?$g=m3jPh;@A-i1^qNWInJ9Il;G`~o7)+zI?3PR3hM^e zdv$qL#!46@?lBb6*ZH2BUzn%y@lm>Y>oyGy4pBox3mrXrn)}pBPd)Rrxa|8Gq=xxA zcJ*{q@9{n!%S8shPV#_p=X)c;{q}p^G{XA>2;yE@=6f4V^d zbu}d-F&Z8n;?EZOo^sN_z@RJ`o_gwueXq^M|LaahMu+iIG&H+xjj56uEB0$j{utYcC^fAP1uqm%ZJqC4gM zXxEPg((YD}$Oe%Go0+<1l}NIWZ>ljYsPB{H#lh(7Kcq+g$}f>8@X?ohE4c_uRq&)1~W zzy{6HWF@<-xnJc~HM|1XX?=B(SGEy~F<@(GsHdvxdUnZ0nf2(Ws@s)x;=~CG@q`*@ zb|=6tpQS|x6|MF3iBEl!!pyFG^Xp${urtgP@3OeSPe1aw#2_Z%X5w==daRf33=Y%q z9W~jgqP42`QbSHAt}IP*8`my}==tZKCQmlOOwj`Oe~n$rLE4-fpie#b1bzFJ1kKLQ zG3zqLK!9CvaH*vd61RAe4cr-!6+Vi!XB=tz`q#fkpZnaG=(Sf~Vdmw!jBAD-x9RKZNo*w{EZF@DZ&QY^+oR{t z(*gsf@!>IIM<*YzR>e-PEK1lzbZd+6_f0y~-9bP5^Izb@8_d{6=)!xK=<8qoDh-Wt zJIr!jzjpP&YqNOky4)95Ilm$+D5XdHtEyPf!j9@Vc_6lr3D(f;y2xa^)9vi&J&$Kn z&IzlwwLpt$7nim-D?~hIQPrEmbJ`QhX?88eoi!k}+%bwjSI5&$#lGR$G77iIcebF; zB2k)|!&ZHPZYrrmyq2M4hre%=NT2Z~7tKS0R>ya2E~sU zPb4HZ=3Z3ElgU(Wzx!p#kPL_Jv0&>SmgJQ=m?WG7*quPYci)+%J?#Mm0U&+`@hoKw zoSe)AI2n+1bobH_GX=V-AN~;&zgWZN?n@BIF4= zn@R9wy)At;n4!WLWi?f})y(2`tII_0Vn!+rW(e*fcG+d&3edp5sF*5&Fnr$tq^+;9 zYtdMi_AA)!RmJXtL_ESQ*SauO!eTI+6!3ZI+NF1ep*VT^5i$YVv^8d=R+tsJMQ6^Q zqOR^P`tmRRBK?qo3Rt8BGj^9QzD0BMv)opM)>c;-kaW;Vp4bEIBD?V3J2X5zAor>U z28-D?C(e`41q{ZWfqrVJ^3m+zWoqL68V((!Z3dWLcIbI4%cW-BAN>9wFl)2S=jULs z;1-6-$6(|jLp&8?1pT~SjQhC6OxSBb`T_O!9;GREpG6|;62sV9(*2CHGZajT!*obAjixr8a37@weVb^&k4 zHW@5Nh&_?iSl=RqLt|qTm6cV9%ciBdiCvFPRKdU(?pMB=w6w4!%u;3 z0B$S0gf|#yMK&XR?jCyX#b@Z;`BU_7{?)&hF*Y&>%gLDckZfXFj3*UA75lp#;3fC9 zRzO}^5o($$nrvFdp>_G)C@Q>c?rOEbtoTRM`Z~XO(P&oz>0B8^tMK$rgk@50p;3g# zwERX6&B$+S75Fxb8p+p0lrqys!Lm!Yw^ASypBomtrddIdS>wY?{rqXH1h7gbhRGip zbqE$mU^sx&ouN@#Rd#o_=eAo}MaG{g;AMW1CzZAqdXrajCypGJ;CL8xtfqLS-Q3(r zKYHU``t+xsXK)mkK=!`FojfTmk&j>rzD8JrKus;|M`Vw31UTnIsl*7>z2S) zfP~fcHU8P8N6(zhZ4Zqr04uZ)d5K3(9g|E*WJ)F&@ZngHrPvwZ`sTau)6)SH0srf%Ve$oBb4IK+<)njUJT2W#+ig3BysIkN}9H(Jf{u zHmIBd6OS1fF0oqr=`Vhf z-G*KC!ymlL0BwRsMsCs8Cc8;T`l*>G;HRE?imG`+{^HO6EW4`)=(Sg0k+>d>JLG4U z#m9j3r@#1@sfvM0Lsf|G_zZTZ&M<=)B6oR+$EA)ud_ol&W>1=$X=Q0m0>|ARFNK*A z@&~*JUKcP>P6lFFjJRDsVWvh#?g%4y^!Oa?-ECUx|#UJWt`Vdjt*StpJkXBH~J&uoI~ z>%w&6Ed%`inVFeou+%B{)g%L}Ff(X)#w)_rR9RC^W23_ikiDe4J(T3@gv6AF+A3bu zZOgN{wzibo;*&!{Oi9?vwV&|U)h1z##%0j zyN!g&+8b~g)}3wdv$Ku8m>nuA@N8P!nfd+Az4}9>V!ZTSU)Xy(Gz-vZWVtpEFdKj2 zf5wgjX$AF{6-LWW|;1GYm4IBQ?Vy2N{5f74h)P)HbZ5#~EO)ZEQ(q z9t;^mll;PLsIL~_1i*!tXhk?gP4%^sy$6YdCm%f{+h4tLTbK~AWH;{&N$yZDgEIgg zfG14GXfMXAb;N7bRP)P|95S(tO-xBZ@>_3TlJ77vH#O8ryX)-QxyGQTiCsj9ivhrc z7%3Q&UUmWO zcbh@il}i`M@#s?w;6vnO-~cebzOq7D2J(TRpAPr*^0n`!_piK1w{G2}xtS>%8M;N2 z%;F&6xvis@-HpfTx#ymv#~wXLZ@={>z5UKx!lI;^X}QE~8EzRjkJ0AZ3WLsVn%;h! z4)+~l09ZjAD+}ztx-Os-OY-P8gV-2@dIqHx+1dlI3j)JiTiYngEX?xaJOvpj#-b6r zb>k`>XOMsxw+sV`ZEo|~=bq>DuH*&JJZ(=;(Vg2jcx+O#xLIPCnE-PJdkJ>20Dy#< z1+1y6qq>GBc<895p@AX{u(SNXvH*jpx_Ua&*T=`GX4cA24UILl$l%f+a8o?W%v6ns zX6NSknT<-ES2ZtMwiw(D4G-~RC&KR7R&w%t1lf9S9{1;7c!|L&vr34`VsN#=3m`L_ zq6&8T_7B`+~nz{?=We8?ykgn0rQlTW+(WzjiZOyZ_cG@2=A< z0H@{NXW3mWm6>xL+D9k^JoX<3?s76=B{r{ZTF5Q z*?>^bExT-X%-rR#{AjHNuu7(k@5GMwW@_e_g_m6>*KgfnFjQw{w&YhwPd$EyS()q9 z+*rqxS6ToDUZ#a&me+3di*D5ngC^{^#h?g`7h*gRxQYo2%oP3x!?d=x!E}D303+L= zp;cX7DU&gDu96Ix@UmZLhN+fUscwFO#$pKpNXPpQOPjEam7RmnF;O_2{LmGwyuchG zr5clSB~PGWr;rl<$jKwzhFkQsBrV=@L!Li#g5JG&l~=DF;)aMa;KP0hwhgm80>CiM zeS_fWk-i>b=3p3~fBA2JhyK>D|5ctq#<=}sk}(GmfIx4!e75;z4!H~IvtqIzh^Z{X z`wOzR*i|w=HAYKw(~?m(I(mz$n|mk}3P~_HR`?lasM4u~fJ=aba(ow$36KK&VF#`z zQVDV6IPBDXqFkmD{!)SM%KZR|4X|Ih;YJ_rw<_6&U^#p~zf63a>|VtACAn{Y2Kx2PN-epUcp{F|CNCT+ zLKWl*1n9|UKE*)EN$)X$8Xg*;L1wLnMn>qug*U04C*|j#d77Sl@+o@svBwzbY|{dR zo~^AdxsL#DYWW!p2P-9T9-w=k85{&`k4?oS2I{x zU0LH%Fc{pb^RKQc=g+I@`nBs+TUW>6VTGdQWpw4*Rf$J}8^5EqgQmwusjcl0oj!G% zzWe=eF{6`}u{_*+n8D)&GkQ+$=N9!GK0;^Do~7O+-4rVGu`6_x-sMF{ZEYx_VMq_k{t=*-yn}cimzwO@zWINW4rks)ZElW_55?~>NS4nqy#kTPAn%f zbgZw7{?gBWn#vfY8K#O7I(oQ=zVXfPQlz4s{@UOC8wXw+2^Kf=aYy^IN(cOXkZDC5 z>pTA4VY#F|E0b>r5Xm=XAsUMjQt?qc;+{wa!RNh$nqukfLs>CX1wmjrAhhco$Y!s0 zuw`<5Gry7jSrI#C8!wCYOA!eQwyR*h1pdtsb zHh6MDKqx3zG`Ak283>(LX5Q1)v4)BeV-f z%WVNAQ;xMM;0mraxJkg0fq_CWF#d&F`Zlv?F3B>=GiVSJ^>|#8>b}ksLM5|UwqY^> zQ-{gdZD|5QM+;9Xj*oWX9tEQXLp%#Kjc_jLqnxi=fJ%Qh_@!RXFI=z2e)fgW%z;VRRO@+?$i5afAfF-7d+_>(jqf9gST(W#Ni2q zsIBWLHMF)*Vslqy*&bgz#K%jHh65^lJzGvh-f2aElngn2deBPudT;~ zc&}wiFg|cZsqF>V1YfI49IYA%BtG-TbN4gNJ3^D9%c|L zWS>oDx4do#vmt(V2_B;q0|mH?QoLb+T}J@oGxIaT0D%qD*_8>GTr;0K%IdeSfe@yHn?Av9+T=1SeuQF4c;~_t}GYdD;F+aWOvvUoji4xKK1FB z>Ds0D=qIne!l0FbDTBkt#un1RN* z%1jv;nt5iGn%O0Wm@EX;qp!%W#3BgeRK<)Du3bC3)8Jynw#WoUypxx&0f21z}g*&XWj6)`^tn^y2& zyG=thw~~C_3qDl~Ia9j}c-t)*k=3c_7>Fsef0qa+UEwzDSLjXDNdYWFQ+jVX=RQQN z`IUb^_sk7?k}Ey=9H%hTx&(BTuOD6zH9KqA4D zQ(NxXX2G&OH@Or9%ocpBVoI#F_Mb6L5+G9^u9A2j#2>A%F4G_U{(lzt z80L%m`UblG{_C`#{cr!s!IB)8hORg(_+ohy<7kYLplz z@X7OY3*y52+E>5MfX2^^*C24U=z&#M*2^^pQz(fI%vvolK<(ypk21pxsR+!jSct*p z3u%UGzBc1y!@@LeF`%ttmn5jRdET#z!SXb_1e44bhIsLE|S_Ya^AUf zQ{uO}C0(Fd>Hq4S^S^_Iud7#?kYMRH)|vh0&%lJuFeskp^Zeys+FwEg0Bh)#Z(9sa zK@hop@%b|!GozuF4t9gP=)>Ahs0EOkvmkcM;)DeB6u2pbW5P3P zkwk_SdzC|kMsbJi*r>vzRN8(nR z+B>N5t*Ek$h}0@Nzgo?`bZt;Yww6tS-_(?3Kx#eI$^W`&YHC6z3Il=ce10x=Gl{2= zGUCJlyNKXuun|di6=_!BEWj4-JvkB>3w(|;O4}Pe!8)03JH_tK+v19fq}OCpK!7;T z%Vc*-88am54D_<1B1chE*F-JM0s&m@J|R1rMzaTi4m8ANF^lE*d)dX#lPn|yszU6l zuN8&|?y?l0%Rz?NvM>Fmzs&BsI*Kyu_1pjcKZ<76XFl^H-M-mR?_ava?pucd2h;Yi zAX`%;)2;ErYzbyj*gyqDKuO5C$hNw2xhh&vq&UDVA+%t5b%|n$0K3}PnEhL&*_k<- z93PX<)9kv#MMAqBU5B|fhgxU}sL_@BJirVo%_T60UIxkl(_kaA5;N%#t**{Phxi!l z>|PBs6PaeW-#TqD!&z4mqR)Kt6V%0wRTDFA2my%3q6#?Wekcc=a-Uh(r%+jbr-4Pi z)j!0nUn33P8sPf?QV|ipA2oXX(bIJ8`ppBcP0sbLk;=Ce~4!#TU^l8EY{X9P;kgUuG)_83;G6g`g{sp z5fuk#X~lSpw7iQl@Bb@k*HqgCaK8&XYlFEz8@y2oV3n+7A9H&Up2u~bFvrJS46=@k z(z=n3D&=i{>$&*lR@acv+%(l3o^yc+z$twH6|z{?7rB?dnu&_&ez>US=Vn9@Qhjgc zR_D5=0$fu(>AI1LXtQ^kD&2xuG`O8S?9PowBMiV&%t*N;`!JE%q?ze)p1k|y__MQP z64wJ4;}*L%Jq+S1*mZ-<(=fZIqRf)a&df7=Q$=O$YQi-AqTiq|Zr`FniYIk5v-jW? z%z#;*xRTxweJgaDzPGJDL--#69kKzjU3*8j$P=urE?Tia`&&&zBlUmnJM`M?ualpd zw;%&T#C6TiE>p*$7Iu9eqPdxA6{{vQl%6LvL@`6f*f^=s6~vzi$O2PgSS5&ze7Zc` zO}Z(JMr3Q1e(;0u$XIOhm>JCSRWRs5oK(V02^i8fwnOxw17fX+4W``h_UDBhlUZ=D zIQ@R|Rn}63@1a7|a{b!bS<_BWRArl-x`a6p?O>6txGXzwQ9ZXiav!z4V!M6oqq2c@ zYE;3`;!D9S1*7cB-tYFdKqyQ^Pq{xs-ZuKl+`7CQP{BdD7VXWoU8nOftOT%1w#)hl zM&zMtX=$Jf7q8J1kDZ~(sTu0!RiSNoSP`5xs?_fm=Go8r4IKRTx&(fUHF^7@hkL4-~2Yc{L%}O z4GP!H+A1=&8YE5(F+WIn@G}#Fx36S~hC(zkIYrlR-Xi-2>*Pr&Tv@@uA*z@aVL%ka zWm@^!$X?V8Q-Bj(Vt5H>vK9zqfB;zlut8G0(2*711jCewZSrI}PRCB1rkV`*3-=xa z9Rxh%_f-a#0EA4{ryz6yloZXM5ar#?-^H-^w z`?JLN($~NJJ&B)k^8cQF`bp8-LJTBI9Hlble7*G?7|~7buB#6->!C!(L4JKx{)Sw{ z#ORoa=0eaEqNvdM8y+5``nsxv+aj~bb!Fs#713OGV7JV}$)Ep4S{m%9_Q#(VSKsE$ z6jin#5-^*NMP>i3g*kRDhRKE6uIzrTKX#HLJg!5p{7F$;ZXRcIb%6?_uMG2U?*_Fk z>M`bT<$R#K0!(>Vr^H|FXw!D%<&RpR6wm)W;*L>hd)4|z-~G&3-zd{XIz!7OsV_E3 zH{C&6Nm8EqvfZzgkKNj(c>fVv31F2>43YxKV(RPZqRZEB(I=jHoZfx!io8$}7&^sZ z3IOZEDU6*3;!{w9u9sG%nco^8@C5U zTMOGEsJy4UgKpg(;+1Z>#KuU5UpPc}hDPYf;U4xppt2YNE2v&-= zGNVvl9;CUsMFCilR%qo(8^x7NMxyg|zdf>W>ghSmAn82` zonL(xqp>P0>ojtPNC6;dWU3b7FSo)P_#P1??oTKyH;fc)66z{ zy-8}Suc5nHj;R$4kf$<{z_8O0e-@~&q1N)psEnVPG@t)c|83Iw8iv>v9H^r|G5-?=&g6(7Y!>vuiV<(TBO)348gF_;6iT@gM&<{ zzsRQR_kZ~Y`Gv^Z0v?CKzE|9GU_?R?2;TV#w0w`l0}u6UR@}&|sRj zHrE7PA@Ci?MI2UUJ0ehO-<-T^(DueC0 z$w^vTTVf#I!tCfaZEvhmAP{61?G`n&+Y?#5P_^G$U!h<9)&HKJWOj1DK z=tr;ph~0rses493>lWHv6$}_-@t6Xcx{4dqZ2bVKO=-~4qm6X6KSF=_mG{|=I!f(_ zsu?`KOkSrdj4ZJ{THbH<48NzQ`2D!FxI$ZzN_ykX*Qx8Ul7iy7=4wmYN

    c7GxpXXIcp49)^_wR>{Pm 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 literal 0 HcmV?d00001 diff --git a/website/src/assets/images/pages/farm.png b/website/src/assets/images/pages/farm.png new file mode 100644 index 0000000000000000000000000000000000000000..90d8229c3322fb50d1b6efdb0d84bad30c378add GIT binary patch literal 43485 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 literal 0 HcmV?d00001 diff --git a/website/src/assets/images/pages/history.png b/website/src/assets/images/pages/history.png new file mode 100644 index 0000000000000000000000000000000000000000..2707b4eb4a64bc234c6f7184f960911701dfed42 GIT binary patch literal 107760 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 @eA(4Cg_n0MQ0*OfXZeh#6>m)uy+X{i#Xho`P|h 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 E3p`X=k^lez literal 0 HcmV?d00001 diff --git a/website/src/assets/images/pages/liquidity-position.png b/website/src/assets/images/pages/liquidity-position.png new file mode 100644 index 0000000000000000000000000000000000000000..dc233b9ea1b2c2e70ff66d43fce9befc3454155e GIT binary patch literal 24762 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 UcRIWl#B?TOL$fn@eW%F(0s&j}ivR!s literal 0 HcmV?d00001 diff --git a/website/src/assets/images/pages/liquidity.png b/website/src/assets/images/pages/liquidity.png new file mode 100644 index 0000000000000000000000000000000000000000..26d15f421ef7b8e2b08d9bb7ca37d335b8b6c5d6 GIT binary patch literal 20738 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 literal 0 HcmV?d00001 diff --git a/website/src/assets/images/pages/nft-details.png b/website/src/assets/images/pages/nft-details.png new file mode 100644 index 0000000000000000000000000000000000000000..2bcf320490b930acbc70010e36b92ec108578039 GIT binary patch literal 100700 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 literal 0 HcmV?d00001 diff --git a/website/src/assets/images/pages/portfolio.png b/website/src/assets/images/pages/portfolio.png new file mode 100644 index 0000000000000000000000000000000000000000..a71777693e37e4b91e96e7d89539111317c20707 GIT binary patch literal 99106 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 BdBgw! literal 0 HcmV?d00001 diff --git a/website/src/assets/images/pages/search.png b/website/src/assets/images/pages/search.png new file mode 100644 index 0000000000000000000000000000000000000000..2bb792278f4bc0b811b9b486f0dae460dbc676a1 GIT binary patch literal 217639 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 z z)d@E#)t-Qllx-VaOuFbA3-a>?8T8Va@1_k=ue*=Th<0&4Ej`R86UON^R=C`xaPxV` zV>)_IHk{|0G1AcqOLZAEu>owb7*Ts?DSp}>66;o&K9ip7K!6ldPR78=Mg!C@5}D?c zh+X{ae07P0*Hwh(2j|#0dP(I^OG}5xAA^_7l`HH)WZaBm&kE)jv#TR0n`#t-H9N?v zRpPHJc>XLRb&%(#vHl_GiLiT!G^y<-M2YCAf_~w9l|hs2@W_ZDN0A7b@w93TIY&`Y zS^}4Ij8rN=O>zM-@v<5vLv}XxvGY3Zie02)@oW6x@MeC$&0-b#viNgedLJL(M17hk zXB{aXDw6!8S{2NNSs3$L@YWFxsa!O1y9S7yg`pmG#Y4PjIe8{hZY0zWTDml(qDe#~ zV^S%)h%BC)7(SL|0;$#L;O!ei zR{J0Zt*yvt??7i;C)zmO1+_`<(rh#~HDl$HYSfYfQNLjoKI48?;lD5LMrEC+@govsk3r%^KNc;AEfM~cG zw!41;Vd`h+JKIoMU5&Rt{20d%pF&At9-e;sF+mDUMDB-4CB3D?1moZcJoki)l%WYU zH#ehh#focQ19<-G?&-pZAG|F53=KLH47|Ca@x}orXWpRaiPTiDT!w++Az>yD(U><| zOhTREQZh{LhDL@&K06M07@HU;MX^_uiDB|K=5mQmn2zR?ii&dKT<;+@iy2aLQzI!@ z86wJ<$4NVpJCn&w>U05&)F0e_FYH9<#!g+p)+!^u^yqdRJbwXNgIw{2qkiqSOqxRm z`Hslem?=JD-D8 z4%gTiG8`FV$IHGRJdtxWq3{b~{|!>#^)%7*j@KU@hlrBF63sYDy^-Lsbzj&6MR*{5*++&Lmk7Q}RB+_CjhTC6=p z*c?PELh!$DgOB<~ED#ZfUZdFrKM^r5o#Xa+5%33Pll?8=V|694VwGkIVWhu@O!)=E z>Aa%6GFi`;#}AJ=>5_%_;`0@a<3k7E#-|@E09RR~(Fr3Ftq+g2;Dw#Xkz1TcV_2g5 zA4EQ^KeNx%{UqL29*Z71`E;-Mgg~mLOeQxLC zq9P3R4U)~v6m&D=0-q-GxP>%|-Uk8v4PXjF7vG)}|b zL1fwsh=9i}30&-V!r-N~8`#36AKZz=p5tW?CRV}MpY}Sn4EEC~@!zV~m zb0z=gn|=2k8(}1gP{C|4+X*FhMUvIn)FK|sm(`+wU{VDGa#h?rq6qw6wLOsi_T1s>)GbR)V+R-GPT6ya(@p_z9NQ zR*8wgN$Lk5@8O5;#g32n&_todecSKE%>a`EPN2uQQZeyF&al{3#;-=bNF1=}i|A?5 zvXtZ@+|-XKnf_XvJ7A*))Ip}PF;cG5vmJ2K&!VCg!pF*Lv5Sd-ceN5vaMYi)afewZ zT0C*`ZktVhOsaSR(Cf6aTMSLO9x@;DdD%f;6oaM-I!670$(n)GE-x*btco!)LZhPNYIVrW&w+|a;9&O!X*DD0^`LKX5ZX{wZo5V33wJHxKDVx}058A)Lp=TLZy`T7Kc4(DEEGjn zmMbeOlkZPd=HPjX>w>nox1+oLJaVj~uLC-M8#!cR)N6Cm)!ivlnP@l= zi(colSZvzupljfMzyym4A)6I>{PXX;IpcsCb}i7*JfI!9Pep{lYR2M-^|SAXGonqc)f zbody4=Qn;CHw#Q8Uwr9x+L>FiZQCZ)R$s2~C48_ZeX$lZME)q1BqphdFNooD7oelX zF%k;Em`SJdb8iZ=lNv5K_!hF$QOs9s1M&c$xIU%1&%E!*?ac5a}bY<|)l*7n5 z)A2Yhx}3qCCsHO*tXMIb;)z_SS!C|9)7WRzVkoX?aUo(hP4fCLn;EsVgEm1$yXx5B zFve*?usU)R@nV=?Bi-a?WV%9fDaB;5swl#jjEGiecQ3;2t)hGl7vmL?d6KLW^jlO| zRa-5{m6@YRMUmi`P#f7vdcqw*n!`rNA=0dkp?_#tC?A|>Z^AQyJ~BHtw={{(Rb^E* z^%J8g-p&4bauNkO8ZH=SbFnUYWjZp)YPtFdDQJcHnS!vfIg0Z^@whFv=tND`Tiik@ zz{!6f-d2r|-u@TF)HX5Je7+ELh8)~^|6`;C1>hzVox_oa5gHeq-XItV;mF53X{|kj z$`TXSSCE1 zFqnn^B)1oDrZ{4d{VI8_XliaElcOH#j&vf$Rx~u6k;g1;ia64c=Ln8GG{+2KU_6A1)2FefZyX(UB^aOZibz!rEA0_CY-WdWHkWq; ze3#-j??hB7<{8wV9aanOU#COY@BuXJ-H(7*4RtJl2iKR7daJ{1F(-oMrQPu;nFhv4 z5$WjYp#~hq%4OA4-oxsF+wBtzTu)Cw&Na4T`<)x{$(}>PDXyd_AB`>TBs=D#Zg~xE zXNcsDxIRkBORv0vuYCD=e2+-h`yYIa&l5>Xg;>Vo<}oJ4>{l}#KmFOOc;?AR@XmWX zNU7Y6J$nxzGcz3r4;>W*i*qCG*?$;C1^MFr+%MA8({M9TTvQ--J-pMdVaMq!;A-j> z<9fEud?G?7z*xN4w}vJuBPj=Iw1`D%x9XvB$SE0?R8`Sf9T64fEu=2ET^{lM^lFWG zj`JeLL}~_)Z0e&4QbY#E^M-NC1}02AiE8LGoEynayWI&g_xS>Tp@bM{0*`RS8kr>6 zbivQF9|xxeVDiN(3ae!7G|$)M9CeBuZZ?Y<=bFx-dZh&_y)~ZqX#Pk}++z{9Hspva zRs&vpZI`SbK?ffv%QbNJZHRnE`lVH{8Ei1w^wc-J2uCBrZ^lXOdGO##k@WJ&;V3q4 zT#dW#ScS(Qx|7-`O|<=?qepP~_z@!R5z&rpe&TTyiJMfJm@_^0Q}eZ*`QK1!H=}mx zy=0mVig}->7fBrv{Y$6e1)B&UnXbHkw;&bLJP4SJ0c@7$4C(jZQ7h)%sK}PD#mLA6 zK6vf#Xbh1V-C)5u5nd~qTqm5}$aJVsS)7hl)rC-NnG|bi(-Xp*I~%a?LO=8cB_g;X zo7ASZmNpu1v_=!D;xU{^O6v2{y^eatE#~p)AOgka!tUN4n1nk7yAMQ=k(MUN7uOtR zg2lP+*i|Co9uO1h8OG@OG~s{AeM2NlB_)f=6q^gVFSz5!$jr&XuxlKBjtuDBub;lG5-CCG=(K*76=o-&m)!$Gm<#4au=qx^ zDT)0zvPr?>vKrA#*s9o^z%rqWObJ3hq{gulV_dUp8O{^o$|7Y%ubVwfyj7sOPB!LB zB0pOnb4$`6rL?pJ zfB1X9j&tW5v3zMYwrpBY1nVFXCZ|~?P z6XzYUQ{QZB?;^8iG3J6rkq3*(&j=|G{iDcTRf`ECH-#(Kz&+Fqvnq^HGQn}uKu%c5 z`KhAeh#*LA+Cf^05U~;wLO}RtnCZT8ZYg2zqxNG{AMZwa0_EN6C=oPYJU7N~%X%db)^AT$1NN z&zU1As@p=ldbN_L~DZxi=ciHjF4$KBAW+Q5}BFE)Wl-F+v5`Riq)z||KI?+Iyl(D zkKXYK+2?W5h3?J{i70S6QM5{!T{E-HxF>6gh%|J&ClJhy!lVzg_p@e zFcQOmy!8oAb`u%U+Ys>idl?J}t4d~8mRKWv@xYZlGVQUNJx-ffzIgr|n;4mt@#md1&RHR2g3hiQ**V!z zi=Y{uSaV8?ijlUW4tv|WQGKBurG|94&$YvR@+733Oc>P5MH#24Dz02fm#{C~0E0s! z>-$_zGbe(@9m7jZI7pM~$SASov2ijFmQHyO53nUwWwcW^2|~u@HpC8w9zI_HS)_n) zl0t*xw{_i!NL58y^7k#9)`_1PM2y61M7|gs)~`vv=h27mz33R_r7}Tbn|uOWw``d5 zp0d(O)9|AY--nwCCU!s(<_n7@kie0Xg>Kpr#z=zanL#ZXprZ|q(=~+byds!rXKS$7 z5RnFH{guSn<>;>vEv9T1;9V^5etGicvD--`nKNv2t{p#-AR{SG1%-uzaIxyed2_4| z**QKlGeZ!#L^T4Qfb(d_I!^P#xN}TQzU*Aj=7lI7zpu9!Zl6~ah~{(-Ty}>iX`{`E zOn(sWfhJfAD%fiW3a$ZU0*p#(xnvNv;rR=@QC;$BEGb_p`o!sm)97mHM4BZ_gx=d} zbHoeg`KAl7Sk1!Eh8M|An>L`ANHvqIqleGoFaGXZ!YusBTQ5=@>1ZxU$72s{7iw2~ z?+~ddKAbvvN;pU-<}y|xBmN z4h*80v-;l#kgfWOY<2N`Pn?g5{uxN!Gp1>UGN_WIWKKK8>*d8_LF_(y4rhBvqqJFQ zW0Xc?D@tR^E0dkkQ86Bwz%5_CT$t-RJ3DEkd|u?hvXc3p6P9v&a}7^6{imhb#kp9m z8llfOH8zQ8LQW*i8!p~lnP|=^EiFYC=T_qgVwwlo{KyfC>@aUMaQ>}fp?Z&yI?XAF z^2oBm=V1lhOz#QgWZ)bfC!5IF!08iEk=*HO9mN0qr#JD3zwszthe6h@5*CIysS-aH z3HP28!CF>ZiT18uVfriJVwAKyEh@~N@*cL)=45Az->WK0lh1Elze@aM1x103+2p}e zaAOb^yTAqBHZoHr2yTyHNfLULs5q?UYq)28hXi z7aR~^GMdPgFev!l1(}|*&r>(I;#mI&JkF$NdeWF zlr$vQ05ZH0+416Bj|+oi9{j>rzY43_E+Qv6!R*SqRb;MPi5FjZ1LaFd%^n#Pi>{5# zK_(*3ogM8cq0N#;Ea;riOs?0+D#mc%ASqU@s9s)0?Jtqy6vD<08=*UKLiC&7-jGOo z$!4P}GDVA8dF;0ZIbh=KxpUZh#|G**>B7h7lU=(}Ua?$66XxcyYe7sz)QyjHA(oqc zTO?1GlN`r?2U18>N{&9HDk+oZGA>cI?^HV?x=b=5S`qLDgtE*9*!j~ot4(Z_y1Ke# z|41T3tVnU@{jSbVF<#l6$EJF&=AeQLW3(CK_p+sl`$OHTI-x*E=0^j%CkSjx+UtAUls z;h@`xy$2id&;zT4kr2`}^Pn`DcXpv;P6TV^@*43_Fh5YM6mqptG1K%JHyb<=scF}n zURH{hlgHp{I3j9{Y1xrIDi>+yayRVfVbmLilFU(oBO}A`1pOH7?L%RH0Sb$Y#Dc1) ziC0b-8Wbdpl`YPd!%{z+Gk7=4<^+*5i<6DgWX(Bo_25lEF4pdF~LsMX$}~TW}!5iO|sK7N3!|6K@rHp5oEkr z4-AZoh_agHrFi9~H}Sv!{@eJaFF%Lh`08`QwDj%=9|?auwn#KIGzc=jdE+KQ!u#n_ zQc^0a<#e?53iFYg>-oeb3HI3$32NEd*%!d=gsZuST>QGsE__5>8rxl{-d2x^(Q!H2 zncmBa5=Rb>I!DD=(}*Z9b5fk`&^Gfr4+r;VE& zVK^?-vk{s@I2xHZbQA2uMPvWt(;Zkm-tzIcAe24&!bK!H`&=kD z672URMI~CeR0vEABh#u8Wl`84f)hf<;`wUWx57K&MsG_y&K^H0CNWO(ShZw{tWpu7 z;_u9fBw6`j2WU1^u>9|(ou@jUK$J-rACr$QR4Ie()5oe5FQA+=iFebS=SWWzuZWbT z_w#4jbioNp*#zkmMP#GM%*jN4VV)?tGv*wIZ`>`S;Z(7hLanX=YI7P^koiC4^Ps1D z07HW=y!!LkvGbGN=N*a#WO+(SnvwDxzKFM&eRCoTYp3?)_*u zdq$KQVz-#)=0Q>>!{{W-MOW`AUjF&V@Dr&EM}xR)`!?Kv|Gn6}VGHV(uOfw`2=BkY zL-=lO-Et?HhAbE)6>Mmrj})s+EM-NL%)uXh_@OXgv%0}aYzN$7K?D?B837+zJ*;Go zi$sMV6pvjdLWPAzFi_j&7ZnOp&Et=&HVD5sjjS*yh!y)mYG_>Y=7vp+Tq=qcCLfWZ z5gLa9+7R(Zj5k#|v=P#iNiRsIK%d_$#(FoYV;(a3a%uyvL&{~Tn2-kpLF#LLLJi|6 zM)v=jaE%Maj3W?p=s6~IO!}B~u@c6WCfMyjWl4u~nC66-?7J6B*;_59c|b`tx`4nn z(iXfK>Ndq8%?A<*`*0G#ECe#EK_X?!!#Zc)P$8CaWGM zvq_wn%?8@IS&|hko^aVVA|J;k6cEm(#1V+4?2Jvv?&}>P1+7e&LS!i0kgK7OlnRZ_ zf(>=cuqLSHGLfVR1yNa5LBuF32-eV$Q?yHh#Kc75Y!&iybLo+X!f_|MdU`QB>J(~Z zd1VnEd-N`3>@$c)fSu z9_nk$MB8#!fA$q)!p#9r{5~#rZ!$SVMB4GbZkgaK5e`=br+LWC${@lz1Otr`PLaU1 z1zC0C@y5g@hs^voQj0loVT}5QoDxG$9L!OEOput|vQO2>;1JrHTZn+`XdD)xkBCqP zy~j&qn#VXRn@q~HNWt=WJW2nq;doTC2w0)xo5>W&${C-_O@xYx8!Mx%hz$%32x7(? zH8vS?|6--nO~g9dNPWtvhe;wO&CcpM2Sh}tDnW4tD_QV6Hvi>w<_ikJT0odxsT>72 z0*l3bD?B$yj&eH(QCyHOTwz(VXS+<8YX;I}HbADD%E~I*r3MAb5)of2h{T^3TA0~K z%TGJYG+Ka}RPp4;lVDUNmQ;x%uPpC}LvlDhS0IQ8r+7ISAWUQ~Y78SnyI@wgB6OZ1 zHczmbVvNlc+|Q$8Viv_{xu`6?k9XQCk(Yf_ zYM;L05!`*x-9%6X+eR&^L`<@~yV{8uji8ta&axFN(9+t9j*d>@XTwP+Irzvs;Sofa zl?RRlGgBWJ9vMVq;~C@^6yotGwxb|BU1V(EvS|bA*RBWq(l6p1S>EqUYep@>{yK`q6yb; zC?;YViCnTwkVpFmq0cpn)EB&Q;&x+Yn9XvWah>zjaRN{dOyM!bj_mvzk7qX9u_>N& z)wQ;?kO{X$6pLonnSCPJPmX=6!g2Qkjxe^J z!!fumL`n8r|?Pihb;n7u=N^om??yNpbLYgVtr@e?O;^!RZiKcp-Kyh5SuYwi_3 zb7r$$++~Nu4m&AHtRk4rt3-d%a{r*dph=|Jh$fQdPZr3Q|1XJUPfj{HME%Z7{cnO6 zR0_!!Nbm&` zdk}THpvj4dsti27n6xm#W%C~2?}U$J|3JS`szhEp`kT`=u-_y{08h}|kV(oly8*DT zq?+2hgf?4Tor6g-6D9`{s}b5Lh2w>!nVe;2XQ7n(6{}?&D8YVT2CYu4CnH3lvT1JN zV>5|^C>rk;b2ld^)jFNxclHlsKP)ygTC5JT;RH}ok|_dlctVMinx$sTP9lmhu3Sm+ z$N(l!V`G7MT3g78bm{$Cn&QLs`LGm&3OA=tgF>(t6y~;o@FX}1nG8&=pEpSmxcF`Y z>g4C7B#BU^DmE$aRi%Dz3gJkcPjl(>rCeL$b6he*eF-b0f*uAaqp z@?oEe!}Vv@C5tnu77e&G|r;Cmq?f5?Ss zS&a}96)&hXVcTiKA~qkK zdnyV}mR?Az6PsT-v1Cb6F`AlMi8Q5&paxErkwc`4!}U31yH+dL6pV>-I=m@U3m=$C z_B%D2jfX@m`AkANkQG#sxRH*Pot-1+6O!c3ja;`^UL|>N6eaS_M2r;VzUH>RQZ+~=V7@95|dn_hk{vB`IdM8k452hMrMrPVkU14kip zsT?NT6K!so*eRaIY)Nr3nUqHbvEmJwiEEY;d1GHsJon#TOsCi#CBOk*_VaJZVAMSWTD!*et^}yO0C~0Ayvr|&!mRe$0m~t z$mW`uDDKP~A@=Fv6anIG^u0`^gx0UD#;R2swl~A&4xp)}4ZF^?AnF}Mc2*9Smlwfq z;`9#@+$Q-*r$Ch?vl?vMwgPA0X%UKXgqVmw;1gtulf;gZNnS4!3)6-v5TbpJ7h^%E z&^pyLuqVi@7mG^bzUzgb7MTl)sB!eLmCVEJfUcvl%_&(pRYQPGkNjMJZ=dkCs!@Yn@pIJ6=ql+7&BT&NRyxb$iWzeAB{?>hA%glD5g*zq%DHQ35~j(JO+`#*cn29I^BzYGa$oH4 zY(X}C=PmX1sJnA3mQ)myT1AVRT3$$b!V|K5JP}}GxsAprt4K;bbwV-JX|$*-w_sIy zsjN!T&a|H<>XYXias2FgG!6B`Pm8U|Xct-CIoD2x(;Cg<+}o;h@L)m20Ko*zz#n)tz06?Dw$Y>Ttt1c2~e*yq5b3;7>K*LM~7jiKC^ZEYUC7T67k3)vI89H zXn~7JIoBQJR2>>l?V#pTTe8}v=QJ#&BF54kf?Ts&#-pEouGn`ozzN3#ocGQrtI)KO z;<4)-9TWYC{Xoq+(o`cpQqc9tN;kn^bX{;vy2qW@C;@WT)ma*C>9r z^FwT3xeTSng>rwwd?O~#6=9N31aG0$8(~hHX4Ig-DxqPJOsX86Nn_P!H^SG|4~-`X z9Vt9(Y1flUZK2IBW{DdQ-*p!XDof;1NcZ}o&|0+h_Tcd826U3Su4CMdCL&`T8Omv2 zSY^~1jZm8n!k>#xhwMMg(ZQThn171WTdbr~TWdI?l;#@_h{+-ouUV@`rbCZnM*%9! zON8476a7Gt>lu6T`a5qRza)r2D1hoBJ*rDfQCgl$+XxAUh-|7pda4HxKlvME_RNVB zp{utxo4>i7TdL>Yk|lLw{$dqvXkZuz_r8le>&b+vSI>LJ4uxPXASk{C3m1#W`$wYP zqZ=-d3rm-jK_k*31d>keCJ|8>6VKVxjDm~>gTh7#6)l!euU~`B>pn*&q%7Ig$I(Ny zOAK(`Gg7X?(XcS_Na8#}F~f5?4o>aBIkRL7(G2>rP{5Gzl9tz6dLlnP4S)RQ=keeE z@3-O9N@S|g3MW<8ZEiGV%UNo?Qc7s}4MIdEyY8w(z|hD9PIvYasUq@8<{%9zeKy*C z-%(eGv~)X+^mlP#j$D!^t}t>Wo|^8X&S8QL2IS>u(Bh(E{fibZdXHMBx~u|ldW~Q# zBFYv8eR5h2jz;6?Q!c+k{}X8em?!D^9T8+q=CYy3RMCQDtq;Vnf z3722^`tk8t-*S;;Vzrrxcp2z(dSR9_8uTKXF&TL;#e;TKYGLkDtAt~i=q^mQc)OEf zb70lRd+^Tw{ivVtV(qdDXkzmF~m|?-ff>0dEe71G-5*+x^ zE+U|run)RXs&T?ZCjBrgIu;GG%r-bfZsZWz9Z`jl&1HyGs<;YG?MVtxO=&Tfm6ZsS zU;pq3TH4#u*FS{z@esy2FCIq|Q@aM_9z$eGEplpc&OO=BH7W-dQ9H3aK?RNF0y0PE zXJwMP(Tuj%R*oOXEwXl-prKTWoLJf2vYtodlt<%P9}cD_$N^%yEDN>Z*Rp?+LE zIk68|UvIyNCLAX-785o0!CARt8L1$-yun6AVKF{DcZL)YbKE)l#z&9E;z|oI9qcF` z^#y4GC(`2&;>LjPKFL1qokKX#)BzWrR%bK8o|B8b%q-+`5nYW+Hp|H?Lh_TUcy@Fa zUc>yla9)qm_ZY|cgb&U!HzfKV5o!xIf3u=#&=_e^Hqpb34Em|hOcOcD40;`mq=uoi*yPJ)1LSj6{Jv=aF`d)^0H4?ES|wTN<=M4=jP1coI;>~aEN}6 z!%d{jk)9z;nL6qd+|S%DGIbK+=e%784x1Cll7#P2W=1B~ZrqF$#}5df!TKd7bM}`M z=1f{#51;9Vlv9Hze(_P^&%{YF7aG_cA0_g+qJ|XA+*9c9@nMybHaejo%yc7MqzLKA zR0b}-9*{8P8iAv}T2xAqqrBxZJtE<3R8|0Wq(BzYhN&hY$j7-KJBhKWWR*W1U+PmQrXl~{B-91zQyFLm4tPL{;^^bp=+mmr}j)>MSd=} z-Twrc;7Ub3Hq#9&OfTU`V+#&7_rdPS!Lnr~$j-GxOA8=ToVeN(z39Hg;^W-q_F%ZD z4}Be7Xs5^c&^RKbf^h+61DTM%^t-=C?O1}A=4Lp12ju)kED;G4G990Ym!1>Nj*)WK z-XY2w*~!f0mm;te3F0WTg6tgViIC|8d7pH67i(WMUb;BxI4=ovo82mBitjvs0Y0}E zo&9~JYUGpZkwNElij4B?2RKNiiyfso87>ohR!dkxWv6Lz4wd{}vpH2jX)W3YyRmA? zOu`{zm^6w`DyWD*!-V6#>**do@xVPIVz`6mfH5+W`KV8G9xU!NTw;gkIx7(rAC1dS zYImza2QxkIB~p@2?amvpqP%>V?3Q@caWt-KGg2c;CkYm(!!a4m7#$czOH&J(tljAD z??FjX5tzR8boEl(mmn@{#})2)KjN8$+8{eejSt^@1NN)}8V9+kC@B$}MLiL_(k@Zy`}*Rf@OQ&}buy^3CWtaT;m#9kwjXq77cNh-zF~Kzd|MC-!chbe^ z2y3%YTeT4@mlum{^)$CJ(_ zR5@9xpbo9OaTArOy%#_4oQ{){OKYKm9g5kkQdyKoyS*S{^w8107e<``;OQMgI7nun z!CvIpvQUy~#g`s6K0c55UhgY0{BSkXA`7N zWu{5bLF@4-N%yv-gLEwUxCD`w*u2DTp`k@Kgg{_eLNNdfj8Og!c?Y?&VM9fEFSqL9IDwoMg%nGkB~`DhZ36}zxWHEM`=lsa1u`}u%R2I zWOxH%>^jwss^zPQIFyir6!$WUM`ns7jB%&&#Esz^em&hiw2SY?;hp)7O`QP z?~SA)@$o!T2>qThEXgTB`RbK;^0SW!6%2^`SjC;%nN(?_lBg~aAa&tqKY9VGK@Yk* z+YlmUBwJ&_D3RFq=n3Hu)}{5Ms0b?!%JTNdw&y@+~Dq%|$3P+Sn zEIFX{jLNB6M0u4fL5kP4R3%NoiQ>T;`n$Q;g`B0^uxj<1q;vnwJbrFGL^=!_vmCLT zpBcgOs%-4r(TIX{1DYm=MGeSxMU`kC>_Lc>uCNP7Jr;-uvs2lgngA75D#>A2R7x zW7(2yoIBr!=Cf@??w8XH5=CR<1q}DKAx%Gq^~>^wUzZ&GDhF3cQmq&xDsfb<6hU*j zj?O_g_h48>O8O{m8iP<9f%YK{R;~LiN{aJE8XGyC2;#ZhW`{WutQTH-3)M@?g$aUD zx2&3W6B)_Zd60ed$$k{%W+6Spfjp9VT@$o}rkxd=25PG-aK5os-mMnp<8}u}$y^T; zp(ulK69_KL#$KB66W>XaZu~Bgoo&POFg3;&ffp9vT9)afWcpE)YNw$|EavheHr|7; zKKm4wR#(zQX~qjb{TV4!U8tflmu8i{N_eNnJ6BD7EVI+{sZ*zD=j)+OR0hsAofQ&( zg#CF;dQ5o6MFL39w#?>1v&krLKBwI3$tPm*h_%u25h7!0xaZz&cve!gv@6-r0mp`6_RSeV<-|=1t%9DMug^#&aO_OCI*R=)l}Dt z1d&x6>hQ>>ZDbP3!jJy>TcjQgqa;5E#!Nfzz3)CTZrQM6cmvER*sZ#dvbo<)o9 zi3mRR;M#@Bs4fXfY_2#Rr<;_&6?d${1KT$sgOtK={lhnCta?#MCO>Oo4mRGo6$b7@ zY6<1bYjNMFpTz#3y@Mc|zoVph)7qR%WXejaHyHsj;O2@Aq)-tV(^5N*(|ya(SrHud z;N-`O-4Y1iPsH!MKZ{Hva3v%eSL1D912o{n)GV_g_ z8=W{cFV0QDJe+oMWO0|oF4OEFDZYOg(IF>l^0V<9WC}{>#Y&Ph=a*F!VASapk%N*- zc1{h^uJywCR;;XB1t*zp&Ye4t_da+ZnVFeHtY|UJup`akpuaPOyuPGr2^>U}v|35_ zPm_?WXBSU;Bjc>wHxu3?m+v5~j!b?gD@GHOaCAzO#Q7J&Jl9d@pnn7#^N@=3| zt`7!LYa$ln@*0dC};lf2s zFpm&MMtykegM+ADxd9tDtR&@$Oz)%!+idCZjr5}@pu1&$d8;2Jx6as7ZKipQ70+g4r=#YglN+?!Q@I~B@;1=gaJf+VGOqR0QJk_ zW?&hzz!*b-$oL1ZyafZPV79Cr^v4E~MeVt1#cHvE>v505F)@LHtW2z}-j20(Yq9^p zVOj_WNJYw;)|V!8t{DsxN{iEJ&d`ZTCL+xGVIqj?xRRE#<_H%>S*_%G#v2Raz=_EJLu7}`Wjy%sgIK<-R#vt& zTA>sOGm1tdqRRNVVcv(TVo4(kFR1Jc%mi&^-E!eLn;=^~J>5hCYUm1Ol}tp2vA)QW zaw1=noJpLW>p6$dIPH2L*<6PmCoW(l%3=C)!mU_r_Vh|(-wq;#-qA7C7ndQ&YQ*;E zo<$Wc>U{3F#2HK^s6lz-{msDc0iO@pD4!zl= zQ1E@}pf=vHejTzhGKEv`1tMFVfxCph>tK%?COF_CrAySGy#>HwT6r_~v zi%N2ugG^Ea@7{a|Y@|-Q-D7g`VKzIdCGj1?v_?o|ChqO-63*{+^nG{i+e@1TBJuIo zmg1^}6jKS#)z;aI(GfBW5^2A8(^7gtn`+J0PMPOvde`>zW7@rBYEQ8oO7wL zs1Q#){;0_5wHO2}zS~|>op$Uzfv2DNyeMbGfdS`Q&x#Zpc~zxwjRuH-S~1w$kJ#E3 zLRpd^C#mHKP<@pe&wk}|_|NZsUzo!~d0ifKclMy^LL(~6 z%3vbWKCYJ6El4S}hUXhD=%+wwK@jF^Y?_FA7#jY|tg)e<+vE5vNwEt4vIMK^ zmO;Udi&Q&zzEQ~T2ag=PsRWDbTd}G!N`#M{6?c=VAuY{@vXWw)IC+M4=0oDKWz)Kw zUI=?p_z=eAqN^;euP)BRlaJgZ#-Mw`g?;} zS<-IQp`OeK@}wEB^(ag)a#@>LIFeXCF>V@kZ+ev=&pmWX|j%lq=fk zeQNy%eDSl-itA^;lTh5BC+>11D_J)ge2-SIsK!~kM|*dFgq8K{L=;wXDWmJ;!r3;R zU0m<^v*%D-Q-jQm4D<~Q;DdMH!>YQK*t~HAcD?-}28M@)&(%iSsfXDac#5A3M1RPu zt;ARV?Dydranc5?1QB&qBs7isLc-L~#g}<5ua|hveh7&R2}WhIEW6yx*T>OZDy^FO zLOzz))(XYMN@ho^%>Y?bP>BdaRyVnhCFjY~kZEWa5v%Nn9}=k`Lu~bqISh6*V`)(anI`4+L)0}*IM}B^O42S#Y(g${4Po8(r-ifp^xnjOJM4>R!!Jo8 zyz#+tJaqSy$R&ljsk0Lwe((XdZQY8^n>OH`_E*tM3TKo|pWE_s64m+y1i7Z0#YsT( zYb)@zum2Gu-T;con#2StQ2<^|ZOHAy=IPb3RV08tlAI5soc&*l2Mfe+W@}q3%vKX} zGV)MaQ2{>@zWj`ALFOXD*HIf0aTU%&q%4jw(0)D%+U^X2gCn7pH9xxJ*cBzbIJL^%aR zZ%>adtU5zu%%?MII<*@$wfQU@e8nO4x zS)96Xj?AGW7#bc#Yx4zC*GH2@z%P$U->2(|gc*=%FY0Q`a92$+T8|&V+0$o8#bHxn zM9>D=cqS_nBcmh8wx(lnU=YnstthW5Lk%r(oS)2SG{R!BAlG1l$2lf{3wD|p3X_~% zft$*r*CU-&j3V0P@M5e90sHnH!!y75U+}$G-=g<(UNl+CO!N?T7-wf_(H&Irg_f?J zqs3IR)_{Ust~u8)D<_hy0-hr!aeA*N~i>C2}$KDRpAtgM&jiZT>(GdJ<$Pc&0Q$0 zTzXlup3q{aglmYpcUW-X;EWNcTO{;sX=@>sxL0gYYv>_SU$$AzFp^5^Fqq-w8lovC zG?7q)qfn`VINeGvSq}BwL41f&i;T)mn}teOEUsK zPrTe#3ZY89_p&!Z@)3V3{);MpmblJKZ^&`jG2C_zoh?n6aIxcmFIrj}Md}ri0wx)Z zGu6B}A5hXXEFjz{Gt??F-MsVeN3_e?h?|KcM^B36gG{P83v~68N)eID=F8QqRtloU zGWYfJO}iFcuKv8wGb;vKs5$Qb=Rbm7Mxd}`^UeXu&nOS&hO9rVgquBk{P82M!p~b6|){}rB zFdTr8X19w1&L@wb#OAy1#Nh+`X>qlPyOnLSA;kI5YVmm_8ElD}Kht}-@$(`Gs)k?G8it<&<#O9jGV&c2UQbuwzN`+1T zk{)mE+=q`2pM=S*!E=v1Ktzh8!V`0GeB8(HpV#Zb=~Jh$cI{fMSg}Hw8rh_snVyd3 z#ujnRXiUzR#y)}#=Ud>R&0WwR6On)1?mWMimsa59>0_e);H)#!$imCb?2bUgo2`_SW;P!%&cso2FqkiC8uoRxp9t#E){~cfN-OPJkDqH)DsWk zW@GJ|I`LrKf6txC=kMKqhxp0SW(x(2B>^laXADqB3UL`6S|pZKFA)WuMNTqJybv=@ z8eBt6XE6&$Z&sOv=S=MK>P=xzCVu;upGQ~E05+{(o0QaJu^HwxqrR=y(d1^fh>6u~ zl5-i=*DuF=KmT_!a~YsF%BeJXPSdC*G4Yy=dRiQPkaFY7#5{}zXcgNR_KUqWRMBQP6UM}HBh0taFuwfUE z5dOjuZGTs*JK{Dc4w}d&VhcHg0~9EC9Kf4HSa4fS|fgejhhA z#X!obWgoK}kK4%rt)T_YNekfdwhlbV8OPbg5(tQek89F(c6A7%!je4iY$K$2^wQ#z zlbd(N`@|-`Kl;tD#GOeKj^lp z#BmuLpC2xh3W0v7FqOuuhFlS0QY`c;1HSm^y`sJ$M`XzfKDj;R_KL-%q+-eoEUOkw zzp`_(kx)iC(mbHj%jqYhDq+eo(X~AH*cRdBF2%xfyOW9#3H#wCQdm@4j`H#>B6)FN z9DW}kPZd|sn6D=&W+mf#4MWLS}IvtX=! z3_(u-zOat^s)UgfoS-v=`ujc&EHHw__hU_c4fY;9f+rq*oJ?*(vIJDf=1=OgQ8KlM zCjxNN2Fu+)Oy&zY^S>O5aCuNuz-H3p%cNMQr#a$;Hg?$$vA= zH1x2DcL-Mm>U$h*sN>27r10}RXVlMr;!z0J0)lYpye>}e(oIQ}$@T6;X^Rxx=sAeJmiL+#R9L2y)JH>VVqRkj-Vno>8L&ZXky7EGRO%ndD0DrLUF%}`6J8n92<+9 z|D@!ZWtB`W*TGVnD(Tmw5_Qq!{FFC`vP)BbBb9*2NLfh%N=x$bplTI7q*%Or;2iu! zU>rm!^l7r+8ZTsP*R8?HkM_dncBApkd91vDi*Ra}rXKj>b8^=1;vy6ml?Y!e**SfZ zRLgIYgB#>Tv$BGrjwky}L_La=sMPU~$ahssM6sg0BzXbCFHclo(1`5*OlqU?h49LE zM8cJ%EWQ?NWDMW`_P=5M=IyAdSqhKGgVvT-G&eUB88o1O*ok{q=EJ13B0Iw-n@X8b z5UJyY22n{%o0o-F>KWqx*hp0k2i&VBb7VF;+>+bv=k-9#YiNM1!j^Ze=1~^G(m>tBXF+0rL{G(=b+fZ#DwXX z6>C44m<fs4}>rH-g5k!VS{4@}ac$P_oz*+3y!3kcUs!Qy&KqC^eHHs3%o zORl;;**n?4ip>O9cO;%4i2W@shQ@g)ZL&D>V9AS=(UA#fUl(>9Jc`dhvW<3y6J$cl z5I3Z_s2C$dPT}C`=h~M`hzdPrV`2L^`8yo4DOtQ7GAGnty=m0iT*sghS^nM7UT zY@DIIrE?HL6Pb6S;Ttl=Cj62v1>rp;O_Hvg54i|7UroZVq%AE#%qVMZuJT|0cZS9WftWj zD>n-h-2);LkW0m|KbBrQbsmmMlXo{)d8^$Ie>feJGXR+z0nXCN394(y^R@I~{Slzgx=a)^j^TWc$_a_CcPF9*JmQqwgY#RtMTO4m8dMr71ap19a)*?d&a~+VWMPk)G*i4y5yY{m+@~+u?kOC0E`H{Gf7wx- z=bD&wWhTSd@ArB!JkkTZ!$|M<<3>YD9rp7Cgd;>|>KCqaw~Z zZC5PjIePu2PfnmUW)gHyt{5*tn!}EhKdXvJVzJ?>60QlCNOb8B_(Xbx2obt)BpA>2 zL<=k}PGL!2g!sNiBss6nLdeT@Iq<#NP+Nr)hYt%swgmLtA2M?h)0>6Ea>(ZwO2#;S z|Ld22BHx?i88aqcK@~GN|>iWH=Dg$bPs%5A}O5*8_H6mP|-7%xRp7V@NVN9Ub?< zZg&WOO6hWhO~_Xg4jldjTQ}8C7B!#pxHiZwuR@qphtT&P9GyTLsd)VZqcr9N2t{NQ za5TPkj>IHU8<9&0aUe%fC1?JhD-;vq0>T0x$G0^Wi<5gQBD81>N@o0g_fdTM-c9iY zkCMou9EpaY)2Y$l=f;8k2eJL`yW*dUCf!kG%<~SOCf%_yrzr1XvY0Qa5Qv>GnRYyC zBUJW`_;Z-@^IC?An4;OaKg#XshuS%e=kDJw9C#ySGwJK^LvK$XT1Q9GKRhn3Ehi^i z; zS%M6Qofentr_RdtC?$0E_MspvOBgIMMFX59SPWmlPp0Y$6lB`u1#r$LA}N`cKqSGH zm8g`7DZvq()T{yzs4mMKBPB!LabhzFIAzsyq!1 z=T2dHZ4IeHIz&SeQYz`*XXj#|w-@6*WP+>MAm>cGO7hg%j5YE8_(I0%5n4ODuwqF? zGRN3uJ^&w$wPh=+k)3IYe-?A7+7R~@q*fmBxUhTQAePi^7QTmEhN*jS5U$p7vLE+C zBSl3iKTZ?DDrQ!e9#s_%p;XVu+@}z%1%&8zaP-;n@g6j{wBnJ6?n7Zg9&R^yJYKx; z(rd6QLB<1PgKA>o^M`t(_> zSiT(Dv;d}j8uNpxemU&xQeVFsoiy>*EUlUHHdYCvalf2EAQWF*=L2jbi@-bKfp@S2 zfBnb5gLTVSB^|M)*lO{vFq1lu8(tz+=^2^Ae`MeOBlzaaZ$eiX&x12h6Yuo|6NhEA zsJ*)9kRTVF%{wQjfXGV-k&z+cl-_jw4C*#+K#UezQQr^qkK{s2^BU*pTD7z~u18#^ zVL5kOI3kpM@!6P^Vq!@+yI)(UkfwY>)U)Pp-%YotAuT-vEXqY3pWHY%V-64wK@B8>YoIZOVt84Q`$u3B9+k7ZC zsRe}j&f@;(fAx2?J0HO6`jz;@KluxcyC!fufeX|A;xGS>$P2@M0KffT{uHwX`vfgM zsO0*383p*mZ~g>(&$hx%JH;`V8^a@`@R6B}%ct;8_wb>kh+T(ecG599?#N6(CTPOf z8I59x$t99v@#!}#io*|!@)@M!LrTj>qVPomQAjE7)>j9cPFRx*bq?Z}Hm%3Me*NoM zQN0{oA0%NWip4Kaqtn3dNJCy>Azhz=Oj=fKzh@hA(rm(KB__Wc(gI&>ISHs%6UF^& zm*M2$V`Sze;!31KuQ8y&Y)6j8hT*|s{OCL16A5P%rHf>LocZ}~oZIT?kt0M{Cxlse zWN0XEdX^?15|Vk;VsSsWP$2GrEi+$C=DNCe$R@|h?<0B*{k`L4H-h;a@bs_z58QR{ zlPJh7qEl&*om-5I+(H~X(}-QW_TbI$eFqy$au&4D-E`=TT0F459*2(~Mwk>hub<5S zY6Ef%CgeCAv>puNCqMX4Ig(p600&5@L|w?aeorPX9$~b)VBzpV$X*YB2S$XHXZEg(W*Q=og zt85wm_KgG3PK;uS#)GW%bohNfQKybGRga8}V|2uc3^L73j}5z4@I>nz8-vwq7ZW095l5ODV9vInw4yAzJHONB5Wu^ld!!+*7cVx;bAmEhn~R6{@VPT$GrJL{(U` zwqBG-si`az3hGqlB$lL6!60W@Pqgto-)nZTCsn1ZcNpdCHTd}}KZIti9d=T2d6VI# z>*hR6>}a2E*5lq~*`gr*Tvd!42l;-bSxxxj(|6+3nPxPQIev6}1O}}QUE{;FuTa4~ zJc^%v8<#n%k3ei?IsDNrX*C3nE04s%xv!MyBb?($dS8olyy577#_^ z=i2UEA2CcDh2kO`T02@{&oZHaHcY&klP)@RO2i|*777K?cD@1mX*#hrz19fI>EL@Z zCxZ3Xdmke=JBtR98EqY1xc9EjQ(o^M7)CDHJsG`ygS4<+esS+5GLWAqXM*kM>_JI! zLGn4?<#I<~2sP=hC+6D>#eOWT;&8|9=<3Gjo_iLR6{Wac;C6d)?8NEh-&`VubHU68 zi#Y&+4J~T59%kC92aG0!ht9)pvy(|=LevoBs3K16c;e(qY~Q{unfnNr4ZOcHcp~cQ z>%~MWUxY_;@Wa{15ONeBXZ;r?Dh;8^~U(-ko{|Pv^liFOlltQWczx0 z;r9m6OKRG8UVZ^4+5yYOYNsB1F@UqaZ>lTCL`V-KnZC|^a!h>3;xq@cOco6FkK@hn zzlg`a_61~QI7CVZVKSVBe2~b#)Y8%_A_3W{dU$k9EO5Qu-9+d;$f0vExlaVOrh*rw z2(`T`9`$-X?lT8iJh!u3S?&2JnNZnRPY4MG!;z?vxqW?vc{?(zx)nUj`KOUFphDBk_yOL+LJU!d_|C1R2?-c#&!GZ}5-lQcli zHk^T#%#stNkdLH|BR4+}!!)-H`u)fy6Rb7eewo1|Cm7Y~wV0JdyCf^4B8W!{3pH-d z(qi~dccA5T3^tt+DxF!F{`vG=PK@V2lhs0&4I?@_x@jH=p{un4104tP*qux1piK6t z?WK4*^;zTsH_Cu;b{-vw~nXkYsD4PEcHshauW!^A2gnvTEFF zP|foq{%3#u+xV^D`!o2dgRfa#hu{6JU%~AL?rXpIhyPtf&9I7RFf6=m%-0)<07#L6 zI~Wk-j>nkZU=+K@ULr#|Ie9pLfs4g%fL14)Xym$u;t1mNNvq8jz%Tdr52K{0f)pwz z>enn4dd-5u9 zrHPoM0GU`xQEif-X-ExI+X~S*7{H%@>xW!UPt?Z~MQDlaAsP|qGSDP%p!>r<91{pb zpIt!Db3)3Lkp0E9*3x&-@by!BySeRYho49DY&sEbUWojzAcoHO;iupD4nFtWze4R` zi7!;RW<=ustZHcu4j(%TKPdtRiwTF197SDiEo@|dwVDi^13{=sF==}As05$KO=g_y zLt^DzPimxP*kRAG$qGe8PRF35z7Q3;up(kiNO5QQMb+3zu<<)0mnEWp>yCIKk;%Bi zngJVE%qA7fLmQgT?jHQ?-@k{?{Ms+VX0^(udMPyr7N%r-zZ?<{>Gi8uQ@bA%igADx zsRM@&V$F&=aZbC@Eb60P^7HhV2>QiFCm~*5%UzFfE->!RQ7&*TM^I{FTHIY%hS8xh z47R?5AiZu98RFIOgrn&8c;O935f=5LApHMI3M^QCS1rwXJTJ&;B4pD!lD}Uo=0vcV zFzwoNNT^MmxbSjFC$f~trp;=X&*v8x%Qjjs*=n=1GB8ZU$u;3YIbfnqD zX9`HZ&Lg75$LQ$pU8MdnR|oI-=F<NkurQjUANI#EqTh|8+T&Y_o|WD@aU8dA$dSUs_* z!M+jU>tMDx$OK3#S;J`8L~37MJ+<{sYHk#{p2};=K`(?HmjhIm|Cb-F`DEj zTw^p}NVHQmK&>}JMZ`i+-&y27N-+U&Xm(^^Y@ zT~4pOxckC*c2hMn9X7enq7=LS2`+B{Xt8OF zNl2uF@rm45qoO|P@|uiUDW{sKN+iM^_XRM}HwrB=^o&fqNIjG0u)@KmkGNr@a^R1g zKExr5V2@-o)fVa@!!?)wRt8yE3p@w6T#Yd;5affGl(=KP_U z+?D1yF0m6B8p76!O5FR*V;vd0HNBBc#YXyWs+4cQl3IM~m0j*d#&OwX zB8m&gWF;&Xo#(~=dLzC98Z|NWIVWIL*+|XxB8^NVyinMQa28}{p=)RWP4DjI)aO{S zbpx3YGsI%Us+21Jb)(Z(U2Zq-OX5D#{poCN!)v4t+B{*DWo6T%PA0#mUhL_75$UWD z5?_7uTmOmY|L`}3g<^sTJey@zYB@qMolLhjZ8yw%6{g1Z&(Hmq`FoVsnlb8YE`%kU z2!6>ol6i_Y?_n;9BgF|ol4LD%n#E>U&Vv_@iIfFauHZoZ*+%VOoRfoY=P*vbz5`Jb zJL)&BN2b{-)ZK`bnx-LT69gpl<%x(rdRHU+_1qjb#p|**CG-8YSPJJv zu!L`v#Y_{bOZfXt$EFk_v~BZR@iQ|cO*mS!sb=H4$=6xMV$`jux#%;DHAKiboN{?> z)fLsU#f-(hUs}AF$$$|H>muh^obO0)GQl(Kg_d*V(Bv}ebka`G0KYdVCXtb0r%+N= zYB`&`*+i(tAQj8{C9`yDPpt!J5go^X#ig&j* zs{?JF?by9%FY?Lk&ksI+Ze9Tzn_6)C^ci}u9^Ok7m!4FUE)C%_JkOqTChERYMIhJHpd1~Kcg;F>c|wgEja4I&i8lV$fJ#+^FTi(Ti2F+zmHr0T_29^D3;K`We^ zr8ub;`brFl-2yW*t5|;8NO8V5Pt*@duYoTRKrj$Sj?oS)ZGu=$YHD@3?lqWo5n{@%0WW1QK21nz+`n5jKObk8pIv?EPN^Gqaw zB{@anUXBh7W8aQX@c0u?5V=Ydq=k>mg`H3AI)p=SeTe#%pC^S`ea$s94jyTRFItMb zA9z$)xmcB5S+`cW8w~V!;qZIkAR%XY$|vF>6=L%-SsIMZ>0-Pmhq(NTMl*YwG$(@f z%o7h_HsFZE*?_-j!fF0i1V=4#$p8fl57#3{*^P#f^l4%<7>x10rV(oK(C{$QZ0WSy z^TF-*pt-3P?ujw1Sg}lyB9Ul;CTgR}9N)!GodOeOkWU;xMQYbM7Jty++ehX{Gac71 z7UbUE9u(x|Vw853xw(15JjjtlufFy=K1+*jdV0F>k7@7hhL$E>OT>U-dR+tKlx1!v z*_ETDl2sO!V#lseFfvZ6IVlq>R@Pw1Gl8?`S`nqiW6DN3=~^|_sXw&{@nQz|T~;c` zM#qq)vXfGjPRhj)?6lB%-2pPsjf#ah&zb=hnN=F!--FS{c9?Az7_C-3_57#h4D5ta zGUJWYJuNIMf`c~2T+i@>pTCK*(``^q1hJxg39OPzq}<@X!izTN8}g7kVJC&uK(DnQ zJc)g|IoPyybKLAI3CHM7$xqIGiyvGW=x=~t4a`|IaaMzBh#uz zx`Ep{GUZ&c`4!G?D#XT!%g)y^`o^5Fl1k+z(lyGP9;*R4dQ$RC2Aq0pCkD>9 zlA33LEjt~Lf9h!nnn|0jp}|3#8{DKY7s6(D5J@Lh>SwPa(AWz#^`Vue6|h1NKPf?4 zwFV)2ook8mrp!X;bEu8D@W~+@$;rcdQp#eoEtdM^5I+9-dpO_Ujh?YVRHbo*_sju+-(pykT=1BL%C|WvBH>q>l!9TBMn6oNKWBpet;%9E?eSejelzVbJ4)9y1P%}$meQnBLFx1HpA zo)mckW$fCuix$!$bar*3ZsiJ8RFua35E2v6Bt!syK!Lxs7iYvC8pXlG$Hm0tbdI5* zphzgq{r!U?$bwa*0h**WDm6MfI)r1fk)AV=dhqsJ@8apFpTfAyOC+s<#(@fHv3Ad3{M?3`?IRFVYo(MLOpTy?-kN|nxNfjS&Qn8=*h7Z7Ah zvgr^Y(^2Q>04nGj(lXOAFffDzKYLr$!Q8xgGe%wG_~Ac%2az!^vdtOP_O^H=S#xum2*C{~kakT(r6=@wvBDTqlSsO@Ux26Y%1 zcELbn%RfVtd?0MmJ zQEYx`-3pO}^hbaHZ-{sT$fP#6nT^*zylCuh+ft3b!PBtj(RR#iKqyG&U(YGT$UL~N z%0}nYiReO+rb9#~FDAPK^(YoU_*_qiiNUNWP%!Uy%nQ%G} zb~IM2(~*{zj?T^=bPJ!XGHj$>XGVIWY)#@GiS(ePJ_PZ`8}AZnqg^XKEHs%0LqWLu z$1y>>=e&YK@i&_c`+GW&Pm?t#6XmEO_k|_@D043$6&=a{2k4?ZIC4z4v;+Lk62S3D3v{Ukr z&0sR4_cN(K+t`CKQfkPW{G5iWU1$wvUaAQaPhxQZUDckz+6mVwFXt z{-amkL~%(e0@S}kZoimDOf&~MGB}UswcPbsyjG`U^7jND32w^eZmhRdez9mS6+V)8FcPDw`{oN>k7eI zK;UGSGc^%TDpyF71a=B$zlvxyQ9w7QkgF6V?h~t3B3rPW_+|?Ex~!0O3(U468##TC z;o%_!JYFJ9R!q2QhpW=UOy(Od0?ZM2vI&uPw_yq4KnQ2fG@`F>5ZktG5=jKvWRO^b zBGDk;e)~O|n0*L@{Qp0De*q?0nqCLOCzv@RnX{OonPHemGtvmHm1W6ZSza$`*S}Y* z-;zNVSYUx=ktL0!8EG`sGaBlihH9uT=wi&wN@faX+Vg%lA~UKgt17dgJF6<*ezG$w z;>Nu;Hrx!C^x~Xi4HM5m1IH zNk~@t{=QNC{+GW2eUr5k%73NlZt(B*Z*Hf9Ok_9WSu6C3lqv~ib$O*m34DC+2BXFl zO0bc$WWqe>qE24}8towPjU&nSFSj-;Fp}du^U62AjWe&liFRiLCZh}Rdwt5sDMpsi z%r^#zTkX;20cs0me358k$rK zrj@dy1 z=W*=F5lo%={!&REUG<~2zwZ%~ntFTpZpYlQ85oi!Rc}w&B|U+(%jH(jRibsHY-2Cm zE6g_O4zy^XI2=Q4l2WoyE1@MmSKt5YKjQ3x!)$jS7UMBAP;M5+DkkN4xIt0DFggp; z^9!6~Z8*xl;UuWjXZZen63?_46{~#e%t@r#PO~$Ma1(s#4Ar@J4gPjztt`)>!>2Je zJi_~#M!ejPfBCO}oszf0LzQ_5-HLU5(4JSPViSvjV)rGf41CzH|MW+`m2K9Vy%#+-rX7C=E z^lh_I@_QN3^5lLT`21I~Ezk%X=ZKw6?J6KaIVeeKl~RE_d^r}G{QCFs(;GG^R`TnA{db6+8-kk>TWo$2eoDfHOb%(M9#biT zrTJ+zQT8tq%sjhg8w53V%(!uKaSmZ_#H^tpUL~`cSeV58p`+LvXeSFsMw1&VXM?>W z)2|`HEE_7q&DpC552Cx(h>7V%Y~A;qdfgxLsAx!O-9_Hlm;U_s5Y0poa=XdUm$7GG z7rVUfiUL99CDvlK_b|(i;|HF9YDI7*w(1qV4yx8}wa;udU`rhK)*?g6Iji)!oL;Z5 zI_Bw@UavRXvMuF_tmy8`ES9e3^_A^*=O}wmj9<@4HXs+zqse1OB9&Dy3$rDCPXNA? z3#vpG3LPP@+ug!)#T9t>dc8Px>NFQVqsoFV2}$30{S75ONX{%t>MG9E1tq=eRL1b> z>1kE$bzy#%EQ+1XSr|cw8Ji#3ixa0$V?2^T$!J58fbYW}H4xeW#;@=bqYv@x^eZPGt%PGFwJt0SnP6 z#-@*>P?ktWQfnnMOa?0@W}8Yo;`flX@Om&ZF$Iq>r*1p`pPzn!-yw(Z|NZ~UYnRBD zco6il&y{l!=(aMPT7w+9-mS7}@CO1gJLNl}+TyST5n46GQN|cHz>cB+eauQ!!he4q=-DN}^tCHL46h?{r(y z*hHvgXh1G~9Dn<#|0g$zZD^GO16b1+tsK)Sq2 zjUwfRJOoz}f}w0CjlcW*zgNw2C$i5KXI&lsYb5Tx|K7lwmalRkD4K7Mi1Xk3Vq$Hupk~bP3 zrLts&FA_LeaISv_Z4GYhXs~f{P7y$k!D^o%(2HVcJK4It1GYIE&#hAtZ$^ng*Vp=9 z-D5^jA`bly0_#PBpzy*prsH#Df}GgY*rvL_utwtkYcLaxiL)LVAtww3VJ5bF2LJGd zFDhxN7>|&>;B#f$kAxQqaP(-f_{eDKRLK)z#?1Wq!t4~xO${p5gM~75ucrwoCWjDn zC%Cwm&>Cz&c5Z<{xX5$p5Mn=TX$#`12OmV43v`)iIFT%1Di&8&K?KC7QnSdUCn!Z_ z2mlKN=NWEFlUyu;p_v>mj+Zbsv5399yOg7QSuZ|alKj@D9QsZCe$(S-f-y%Wm`rzt z$JIU7`ij}p!A;ihT&^F+R0i{5f)bY%n;To%Ei|_Qt3~qM8I+HbiDSsh2}0P+L^_Rs z`0Fnq$IV!Ij$@o`r_OH12*H((;Jn34d6^7&qL7EnWP)8l`T}J|0$mfOKMADiA$xpk z`V!h4K0N7hqMXj)VmOU*XA_EKuKGqs&{%3gigK=veWj@GTMxr3nnK(VX6Cann=DCr_MdBfZ=j*^9q;la%|N}y7_J&3%_fjRP05_AAj{lT)fz?cJnt22kv#N5$qHj^|6nxEoSEl7G&|KfAd-`CHbW3xK3fT}!SQ#B3~2?DMKmzJcJ zR(}~??S3u_W}NGr<@ZYwWVyK@m{dci2=4kWg<)u*OjOd!!f5sH%1h5l?4Fw6B$GFv zO>4T>bbUKh^y9DiSGEb7tx{Nlb8wrAFiMn#yZ3yYj2(ryC&Q72$=~5L9 z79?kxH;8yPiS_{d%v>0ajUj>{_8p4@o14g7ku9^DHD`4Jy}}MQd;Pe$Fol%rM?1=JMmp(KK-o~x@+7%!M!0NNY-$QEIi5=Dfh1YdSxV1RR6M#EnRI1%p~Bqa4eTH@Dp@O@>m&K@+mI3;zuWmMP2Fv zSlB=GT!fsebeW5?-7EqGU?DD;5;Yc~#5f<15v=GjI5Unee=|Ikcm=H4ik3>*lah+` zk_2XwIs1|B&6r_-kXm?Q_PGW!XwAL=;*{+C9xn=3o#uF~obF4Nd)M%ew$|!YS`8cL z)UMW6^t85V0f6$JfG@JHfBuhO!%QSbDcYcwNK(%15-mt}Yc_#>J0GA_tk-~)dLnmO z`J*+Mf;b!tE=v8GYzn8wN3gM}1wOM&`AaUOBLvtkGFWC*irle&4h&2|jUPocvf;yhthS^us4ttuYWAQb~a`6FGMu|NQvm|Y|T znPwmI;+f7)M964Qj>jzS2b-L=+CBSCz*L_o() zpNpiV+Y!`!Y?Z5wL47AZ+1suTm-63(syuM}7RJ-(E>eniqrI(p<@>wdhpTyloTjm9Nx{Dvc8)d)3g`hN>A$DsPf-Pl$iL$WC_3;8c6MP(#kB%D@ICk z-$+iYv9USjk2N+vrWQ6QB|}MtAYoEaq%=1#Q!dj z903Ue5>04EH6NJ3u_EaYBNwS`Izc>AMwo4tMnUDS+TPZK0GWy$+06~XR`tA#JeRqs zuWb6N4mEnkk_c^JC4<@#YDAoEADI|d?PB9OyaqQ~{6WmR$Zi=7%lb%_aV}#iRfmkk z<%9~$=^WHS?6V(y(vNZ6R*Pxv(up*t`o^PPF|eB$3Ngud9kV|yj&QrWwh>I zTMCNQX{BULd^Qd{H$D=$Vlb(7A}j5lOao320kd7J6Ijxc2A9}YlE$Nu&8T*tk1cR~ zQT`+IySIB2EXAUlGrLrfh?YjhL`hc_{FeM@rE;ZJwEBJyw!78iN5W*qz|_tUhUIar=Hh@)& zKC28?sdVq6{5x%mdQ~|!Dp4xeSj=z6&!?7Y6o#c<&v5l7EK0uOki8m^bvK*7lIACw zOJR3MkbSLy+1Utzk)8dspmJQfxyxOk>@q_}s=!54WWQ80#f6DKaie-h5+NjDDNFW2 zm|0<`T-?D;O-(9rH8($}iaU#=yU2)Ah9{LwD4EDeiEd$Gfk4iuLYqDOoE(#)1UWW7 zj^5rLl`l)~r?J70P|%CP`54|B<2^Sm;{7{9NM@&TVR8UxVr0U6n_=>W)FNvt8VCmT zDl2%dSXpwH7SQUVsqL(jS+XF;1~n-Q8*(kb+Iy)t$afV`TO>g4;9?+!xFu_Uw_hq_ z6wwsao}(~-Rk2Kdr+Ivy%!kL}MmC>Cm<(lCs0kh35ZYV;)mA#M32`o%da}F%+R6&% zYW`RzqiJbQDp#U+C2&DLk#)p5WDD`E@ZUyWf#PumkvRSly1L*NK zpoMIf02moN(R5rz{MszmB~>-UF>T>mWPld^yX1yJX4%J$n3T#3TAesCdI?TpPzm}z z@ag^7y0sHWPF=*gb7zsGOueDqgV^u@zIbW~fyN*n*tZMq&6452(snv6H=%(*OG+#0 zs;Z4*h4dQ8;^rwD&!TtpE-kXYT=h@Bvd!0SQk1@bU`UlAx|Xei!78ax&y`FDPE%uO z>EGg4A*C?tcBPe)YamjAI78$CFgRAGRgR7gfYP(#|XHA$E<6T@TC(m2YWs*o= zID;pC?1MOe`Wzyu6oHHj^YilrSRp0pNjVi^mKNsbRpekgozbKh_Dz`v0*wuD%W<)= z%5RnC4pC-S!A`l<2VrBC- zG&F<;E{=*3Q%O)MQ(D|Wuooxu8611-G@j`Kp6d2u4|k#ilSgoJfB??bfsCK$5(cZJ z%~@J$7v(Vqpt`_oV0u29qH5SskwkR3FGdX?hglN45*S-35r*7em9xqaXvEyy9Q*-4 z+sCNQPnC?<`Mk{Mvk3F|Cdx{~lL>6>=;C5(fw`ntAUV(HY~+F+BRkZjQekLdN65l( zJc?$CPF#xAEvuxK(O3iyzgK}Vk(}Fk4_Ur`K01w0cD`S225Q`6Zsw~h2lw`7KRTKM zDoefiVU;DVs6Iofva;;e0JD45%G^jDyfB0>OeOII+q~K3L741gD>peav(u`Uq#7qn zsZh8+lAVBD>tv(yBm|HLp_@yG_vTcHrFkA-ww50R+7TGFoPW zTy1xKjmTmi!O6qe z-;u)Bt`78{86em(DwawBjYRu3kb$z=tt#QI!E8dFlc=8yVI-bV;J;YZp^ZDqsp(0T zCnv*&SHPCAU6NZ%I-#&xa=y;4E>(wYVNt7d7ooHyfK24VJm& zzK~ZbA%xXx;?DZgrAx3X<~e%(+D5y| z62uAK8U!}1M+WYIP02X7LNF+JSOrngvd-%& z#gEkM`a<=srBB?eCi405sSL8APK+!fsAV1HN$&r_alP;D-`;7nwo zgB~v?=O-{8TSNz?W2f1sv_|o-6TsR(KM5xRa(5sIeX+d65=Y2ZHv~eOOM*!6mCcpB z?UiDF6|cN$K}Tyhe7*qZp(J0g`jF|DLRIvoqDGtQT?hs#6B}}>AC#9iUbp5D(Ac2W zMGgjh*F5G14AwF`vXW&v5x#Tc6gG5sslhuzJ@QKXUw;0dQA<6pk`M|2JAa{HB_90L zCq9Djy!bL+f8%Z33ufoSl*#0-A*GgUoX~G?bYHc7>gh9X&a}3;@jw#>=dMiEPyvuB z?p7bRN1!7kwg6$>z+Mf~B(s)2R-8Vc-Hb+s5&5FDKpx4|;=? zymASIlM7^L?3HP@y0~jhm7%B=p&f{NU}?5iqHgaO*9V=-)GxWqELIa4JPX>3OsVrc)4ZwHVxki7Phh5FW zTKn=n2(n}YUu2&jolU_UFk`%P1Co^B9`-quOeid|;E%M5>a65|)AU#Mc@t^G7Ox*R zsm@T+3SvuD$A!ou$Cw8$i|z8AJ^!|uCAU}wptBJdDIwZ;oY`PhuPK0*D{<2n!wlP5 z5)y2CX1B`Zu9s9SHKi16W+R?>>@n=wxd(5){w9V72hq{#L0f}K$;k24G{(cD*wP*1 z=W*6@*$q~Vs(;V5kC>gAQxorj*WX(4{fWtG zJoEJ9>TlVtiXb`SUUg24;cogn7(;T>qC{r42n>mhBV>g+HBF4ssVdr8Ok3^LJleHr6Nd%xo4$2s9 zq;!y>G@yW$z7h~nE~)n=e^#6_z@n;KXjJ7@Tm)-MA|$INpOIvxDsgTFlu9OXIVKv5 zDYi=zl?n@%ulQ<-ZX0+O}47ct@p#ok*}J|7StSUHJj1U z-6onXGGr2T6CB+aIxh!j%T-rlX+d@f7ogKSxqb*zetRa*-NDqr#6WluqO zt*3LZSy`2lxi}p`)X@%WfU?|T45y5GyJRtzFv&$B7LRtGG4;}U3FjK-kn`F1t7 zBglRw?cUVUp-K9cM%Mn*L^}yAx9b56qkAH~N zzY8D#=m)TM%f_pYkzMh?z>xY*!f?It&F|n|v;BK_D@!VCZSUG()2s&fntkKqu%^B?`mU#dm+um0vs=pPtVq4w{! z)k@FT@*xzftvgkDWyRx`Zc%H{s2b=Jf<9QtHPhxU0qvR*~ei9W$*oWCj94{T3 z!jX6o_6oJH+5O|UC}Y&jg|kQy{Nz(l;NZ+4F3e3Te;BD9sK!jG;$B|Xd~8Mj4Y|C? z=?SjMd=+&?gbGV|xoJ+uN~SYNn^vW|vXZ7F(J(v~E8CY$2EpIR z#LSZ0g#JphVGV1dro1fwT>hs1>Ysbmgtbd8$_TT>*Lq<^`b zj%zANw^ZzTfQ$9lUikLXzXRgrc!ho8i(gssvw!o&FXLXZ?|koN_50G`(8>o~!H`_f zk$Nqqa;oRM>LORz->?mS@+Us0@*e%p@BJ};`lo&r-~R5)n4Md|gZuZWiS+2P6QpAw zQpb;uPvFxZ|1jP>c!X{0R2#|#7k~~?GkW~D*vXsgTg)(B?t-1-SOa`sWSc1SiNw6R6XxIFK#0j2E zmPm?n58}He8N-ED3xyg~U$Qzlv6d_tl*lBbxu%J#F03{fYz726cM&9P!4P-0r>Dcf z$bu^N?9~%Mn(~-R+9`|eg)8V&`Eja=8P-tw>@Kxxzt*XM1-qoE;1tu^+Jc==K8e{Q zr&S%ga)O|g&wpv5VB1^mHkDLX@|zi`v8Zx8D)e1ryd(?0@j zccMo%HG;^FUIOx|*gV=PH-!lBOLZ3hwwXMCiQGL$d2lK=1-sj=m`1&)0TUZGpksPQ zNy1ju?wREzzLH~%?IKR^!dywDuzpE;D=RlAl{0I}D!~htKXnzBYb7a8rE-v(eFS>b znHUyr& zP>c}Nag$*3;wS#e^XTDRQ)SeaSy26|k`~{{OdJowzz>g3;GzAyS3KsH0M?mv7s*_G zaOvN%b--NQ-F9at7}*ud?o}8Hqm&}xz$z85Ek{a+l+4T`-OSG~UN`#DSXn5|9CVL7 zydS4dox^&tj`mh136+XvY~0X;TeZ6-gM&^bR3xh)B~FG;;KPlRX!SZdeVO3)+OgA- z!PHb4gXa&Zxu#I?DS#6Zxlkg^$Seua5+4bX3B;F5B*b7Kq-4X%$w}p(C4EUn1xkIv zY)Z|9MKV#6D@!qkd|(TUVa1H;c}}T1FT2`;1mIJ;a8n+T1zUWAM3R*L)7aFcq(Vu6 zC_qg)!MhxAt1R+)SR5tPmSa}F7P=fauM*c}20qP*w$Wm0y#j6sy)eRqLWA@hrLVT&BBARG&&0iK;SdC>qf2 z3gD%)ClJ`Vi;Ja1quEv8(d+N!7I}9pPtZI*6U7KzDv56*nn2ENQ^3jn@Pjz}H-Cq0 zB985?Z3y~bQRzvBYItXLO;Cwn<%$*8^2>#lrGm># zNn?4Qo=_8BI&~DDEjy7XsCRoSiGXVZ>z2AeX&JmJZi;zx(@tihuDl{{&r~!c4t} zAN|~?@ue?+L;d{VXFiT69@m(xa~JwlLD#9N89eyF9-KLI0Ux78Eb?GGcgF7bn7tAk z9vR1Hf8gVstPMDG_B?j(*mlihR}*v~j<@UI%4$KCDJga79XwV(izZ()iiVu#W1(`= z7~si-5h1ABVl81T=}>+*DKb-%tzMFj8cY>AfPg7aW=hzlAa|M)2`EnR0*GXCjmM*8 znt})u2+6KjvPDa#^b}=BDZRr36l+>0m|s{3!|(UNNoGr!DHE?F&h;W2%DE-YgGiMV zX(%Nn7;BUne0{kSh+G$ z-}CEuS%FM>G6Q4N=-srb;%jA4vYy*vftwqt#9R!ie1`3+SK3?^90^b_8gwclrHl>EqKb+p1C&mdhX@?H%E zDJk$=R_u0;2t^VTXUkB9(~CN_jZw{$qRc!Wi=s2oq{d#6{XjPEc7sI&;AIWSB*=7I zIG-5R{8<^jZ2Ru!c3hYkhmQTJy`y2pR$peEsLBsbUf?3Msl-BxF-oyetLo56hheFB7K`e#4&V@v<;?)qW%yS1emk3Xu( zf}I_0OYi^qk9=n7?;rZ?Czk%MN{HLGY*IgB%^a}eizl{s_saff?}dqcc{@#|E->8w zwz*xVZ6eF6VDapDKX#YT;pts2_?;!B4N@j0&G)T1H!w%sV?l%yrh{^w(bXKFP%-8w|U{uE4w0K2`a!2;7WTyNYJi>GUYq z&bUi|>T6!ANgS$Qp0=0&(p~=1d)joWuAeZ`r^dqgp+`3=20=%ORAsL(Yi=D2nR76b zy^=`Ka)qJLBG8KH8yP|~0dTflz~tgQx>{OP0!f8m+31mc8ZiPe`HVz=CX)$moKyf- zvBFr%+$JE+tk>kFVukezn8<{>{fIeDX!JPl1JHZtOk;gCrdDct9**SU-MR%iQI_~- zQ(G$^Jlm|4LY8B4Dw9MrB}1t>DX*&%jL_u&(V0nAJ2FZ6e~}Dzw>w1Ht?JPZL<$)s ziaG7V1Y{DtB6R`FMw1$+s@@+YNR{Kepi>3ErESG$Pgr)p#RZ4ei)@P(Zl@Ofu$ED& zU&?h=(GY7kS5>R3E-U#*)m8?$lXk-uqrw8h=k=g&H)p|6P&Kyh3jdKStvLZ8 z)I^C+QZ7h28B^DrnE^`>Yj=GC-aG3%B$qn@p7!lggKr!uQI>e6ze6@qzn_;K?`eER5YVOeOAlY zqe%}c8&g@4Rs3H;0Wpo$Dpj6NSvl&;e??U)M{~NqU(8fA;?#*jJo5N6>Y1u}XenKR z0lix`B2ms_E)gU1lv93E`l2THj)mvZNNHH2KZTVPro*U(iy<#1a(Id;SrIn@u!=C% zX(EoxF701&L8wHS*-d6R%o1%#pry2%qDqfqaoLa{K->LL7tG?)rLRg(bz7}TYsxdz z(q~A>uNmKXdl1&nJ&?f9xI~KDIM$OH#pqjPlhe_I`D{$p2hDKPq@n~l)+P7d$l@GY z2&x5e=R}&<8&w;MJSgBu0QRCJ4Yj#cHOblg zDDryk1ZZLGd8~_ls$5~0s(q#+H!85Gzxtvl7yO)gL~ zZI0kamx*!FbihhRO0A385MFm#0Va{~MD`PBS8?W-I)1W4 zbf|?=E0ZMvOISQ9<|@fRCDnpOh5TF8!YeYOU>6g2s$l{#0crx+Bq`}E*{LL%E^)G! z`i7D{T0mP=5{UAi)o*A?hb6b3=7(e8^_>cYDb_`=<+mx<%#7tLp25|x;u^2s`v9w& z*!XP!D6Gv5=5V9 z$?KK>mE<@Quv=jNX>x1jOT=}`{hjr(Ps(>Zr_H8rEmoY> z`MHEXj}4oemA`2D@(%Qju*OdsX?3Fz9{nQ%&;CFuwqod=?$t_X0 zD{YCm)I;sWd%8PRy*EI28OU16ipA0zQ#I7>-Lmx)4J^*KRD;&F7gwJVm&OgTUjPbLhM8u@t#0alLEf{l~7NPN=E7Z>KaQ}rpS zPaNBIln?`cuPP|4)#og$$U*^d0<6mFH7Gx@f)t@9n`N;Y$*gF(ZOTi|a_V0-PeON} zNPgEhRr*+0R(?-qvVEs64kBDM;r$OjK(;B1sljQCUA&0J={Y1487vHrp_dZTbFDp? zh|Y8F(ZgLf!^#Cim;eu-|9o64eI^TQPpB2?3i>he8i_&{0lORKWzTkK^&TrStqRju zH>T>-Nve(|ftGD4jHs9Lpxtg^J3CZ(f1So(tLYSjt$Yf}R(|bZKaP|w(0jdVEzxsL zi6&BLX>CC&5?9i{kBW*E?DW3>eHi-QchMM+!R67z=<}-lQ7)rZ%>~jDCW5A(P&2X> zoFqUlMR`z4EmdnqDo(UiTxI_vpkx9>sUzRXtm71T@?o;!#X!M0(<6LEQQ2sCJ zRkfH~s|EYs^c#oWj;6+jYrcO?fVEtkty1TQBPA3JaDwzz@(L|y53eT?*G#wMV5_VA zXgP$mAKhg#;Yyw9cF9ontnN3qwGQU>2zCUBoMZC@Hc6GJPsVgQpM{4qjsUj|WxsMk%Z@C5 zP{GC!<)9=S+}#@IOsWWUNwPr`TuCi3afZ(mV2Qt<1UX1L2l<>hzUFyeDe!BwI22Py%TellN{qR$y* ziW#IM>}zJD${b%3P-ZowEKctP(fUfXW0k!s*KyYBtgJbB4^Kw$=dX`pwzUIhj?rv1 zjQCVowX?T5r1I6Nq`@3Oxk64kzGwVKTp7Kagd!dWigvipd}=2;lNu%eTc>~*cuAp z!rTvVb8Pc-RJ^ZzSXe7ZFDs#+*ITad-v#D(0X*wZY*e4?0! zLuXWbl*)j+`CC-(KRzrF9Doo-#}>f|;BRdI!PH z%mU`9I(2mQz~Xhn;B!z$q}-p$Q{wYrV#h|j5sspLegPf6G^Qd8*dmEJ%bG`&u+m|I zZoN%&1<$RxeDy~L#!=qE}Y}AXd9+_=nKq*mX%6URfrhIWsQZ0!U!DnSL6*i`>6ZXk z?fX}nIR4rU7Tl}}{j2K5RU&$XO^}7NRMw{0x}{^)^_K3lBHyX+q&bin4VC-U>C|`4=L<{4n&lkgCsZnG z-$_oen!G#jwIHtLZ-R34E-J92M?5l*9_Ip{eR4l#!V)6UIL1b2;EvCuI6DMv-VH~= zg2tc~U%8mYZchSRnrs-DDDK;zZm!gd5lETp?ZNU}*Ctugho$oAn;^jaU+?H#8YMu{ttMuboTeQ-8 zwqhlEN^=_5``S437{b5!ARGFr+EV zSiG1d$Zh0e`)JEXylx%Cz``tInVh5=Vt3Q4FagQQ1hPJll-02)KQDcu46Dhe3W*1LTOet1r3zvdB-g>!HB3FAqFT69 zIRjoeGJt=aPD0nc1sTe`&DL(DVrlrBn~^q!VWk{j@cS_{GmG|SKQfZdU;L(QX0pdo zG<9|&?eb#e3tz*gFlFORQWgGIzEYfzQv_J^1Xww?Z)Z~rjFK^3w>`7GRL^=3IpN(vA}n79vNQ+N z%L@zFNt4U17CSA2s%3fbdMuTSoVo>*Lc2>?fjdP37u85G0XbT&!?Fgf_-`$Thzjdc zi(WNxoPZo@V}oLCH1Jcdd`=u&b(O#6SVQH4dIe?(pbQ%LHt1`vr*hty)xGH|TKp0l z#A|EUE2-;f4$WFoVFi@*h9$>XxpwtFi+bJCy@~UsN|a})?5cIzy~*{K?^9oSPy1Vb z1PB%jtLwmbDo5FBOy(Qe>2W?qfj}yqiNX|{z;-T}5AN861Sic4hfku}7{_k=B0553 zrW*WsIT|5DVMTY*fZ2i+XBJsdhtZidiY_y@lks|GDu!q{hQ{V5WTlQ^x`1dThN{#f zV?IfyN?-BElrk3uF20?e9hC?}odQh)?wUhBB=ZE=1ke(hBoToExQi8lE{^YN6G4V5 z!h6f>bE=;hE5N)V)S$A#%ljf{h!mBM6CArjNSbt71e>lJ1-O!n`)XI@yMNMB&`SB= zfs0xWhfbVDKLPiH&pwWY*bK+bHU-FKY@{g5SdBIu9US5!+lE*+hN0dD^q1z7b|u9HgUf~_nXdgCI#BhFE>&T29b8>);u1hs5QYdwW;6Jk z@1Mm;%TA()2wr0!>YjCCYrWYJaO6Nr1O1@tKUvAfOfyRR7f1B+IN-yUaDdUzVCYT-9^bx`tir zb1MOm%dS`R`sLSHK4K*dbNP3wJ-5E*-d4EJnj5{=eac_L2Cc^KRF1OiTV=el+hjO< zmMHDS=SH!yrG!WJZ%~fR=lcg?T^z!*fh3w-MVLi`F$k%Ugp+_NZD_&3^c)&=DFl6H zq_R2K8$AfmW^tZ7(~hle7#b;IVqy{&$^b3R?T9Q!)M6+g$7-{ys6ic{o5f&)(`v^I z!Bm11wbf!#%!XnY37n>9W?-~BRN0&bPSR2qBb81m5G^3e;jr^_DcDtBD=matP1*!r zT4s17Sy4{V+%=af0Uy(4Ghz)PekWZeOXxM8(tWcaR~R^*UIhlce(E9?B5{1=BOgQd z$N>ypx`chrU5X_Vs3T$bG0L=(UrbVFSnXEj6m7MZaeR0lj?%cwsD5^49A>`P9%w}4 zV-F&|Ba7F+{ww2c%27N=+lcrco6#8(A`%yzP3^Jr}ksStj(MC&z(rmIs}R~t7-g>o8)j*a5) zri%zS@8%dYz-e@9{)rshCZ7wwrbgv1Ff}-W*6uC>t&)=ZTH3p?DC06)LOjj+fsC}r zAHev~5WE~?(cL>JF^?d1@(dn#Sm5ONO_GT$Rw8*t%FD3b!;wWa6F7}g((m?!kdSkc z1(QB0es@v!gCH4EnHQ`UZDT7ciHzq2+3#*j(tTvxRHUN5q#WxttN7vJ?l9RD#`t`U z#@1^dbHhZVwaL1cfdXp6rRzZJa?`Ci*{{aGN^<_(E%om1H+%ONaM>+Nv0^SeoFEgE zm(bzU<5SOXhSzPw#Nr~x54{a*co>b1+;wIpx0Qn%T(c@jBhI32mMji)GMyYx;qhK0 zJXReBCv?brC;*B;b-&L#Qg8;EF+rw6B4NA^17>FR7#<KcRgwtbFXzpx5OE7>`nSj^iL8CE+T^qI{OR3gwDidIr5xF#k zHk}PoKI3qdOcmS5CcaNPvjWUkhZ*)T*(tjV9)cgqsrK9lo+el};LR_68}o@IqU>)X z>u1S|P6n~v7uU-BiV$AO9PooGR=Se)+tN`cS66T6<%)o zY=shLBMVp@pHV=iu&}67D0ui;$uF0b4Gn>;CFntpOm}lbBY~3*Q*4_Y+bhb=l;mw0 zo1R61a-M|%`%G&BrO9z@l00`j&StWbnaY4YMFpVD$6`ou6P0Dd<{c$WCn)zx$_8?o ze*T_LMd2s#HmG9SynoIQmu4qmw>hy`wjw()iXpcfzw-7l9(L&PsXaYt^?9|;mf`Y> zlq!OR&zf2nU{`aG%A^5n)-4$98r_M6fl71rplo;)OsWo`R043aJ*y(ucz9m<3L43dPf)^+r3$LX z=_QV9_wK!j2D|X;i9XCuPovxGB&c7GUKD$;dO-F5WgOdln_#qDUH(n*$H?dec5dgU z*RygitW^W7TDuZd{QWJje0lrw}L2EH(2+_#@?9s^|QpKmH4~Ym#Ebue@>qt*y-} z(&Zcf_&s!Wb*OS5?+w6O8>p%^B}1(-QmqcKZp~H;u%vITB~`;(0ag`kXn*Tf!qCk0 zS?u59$1_iC;iP3nGM7d)p2OT5FTq!i;lk`9{C-L}1YIt_U4_7Rdi7fEJ&A%RJ2VmZ z!sE+hk(-=w$%2mF5VEm6BI6TyWK$C!Xmz7K$O+bGgqb_e{>41?90N8r5=a?c+;zHC z!E6CYjST_JO356jQzb5x2}XdF+;>ALfJii^gCsRl_dibHI;jJkyhbGdqEi^FtV(Enx2+PGYtca*N}L%uI38mZ&DHR%xu_ zx>2b^eA&;Puy+Gsl`9!Hl>;yr!>RcMUcYb=`H&mCAKXQml|V+C%A`~2I$T~aTowEn=d3j6$$-Uy zBIk=m9y`PhK$87TCWHlUu6!l~B7PqXAATQ@OjCM}VJ@%7e8G;l&d(t}KT1Z{$9pwt z&hwRVbTjMet=MV+mRMs$5T5JQ-n}V+Rcpc|{rtcFH#l|rEV?>7(A(2>)iLLYgr$_m z_HCPS;Pr!Q*DDbWn>KI2_g;Ec0Ve@eN&e(AIgE^tqlX~r{DnSj?Cs`f-r~ZNz(!7N zX0rw&E)9)fhO$E=wc{b~=)|G+Ax;D%qhomT@keks+RdZ_SPQ^<=foMDJ$Dfc9GtD3 zIIm?{f?q==a&NUJQDAo?z*{ZAlEHT87%XwrFISi=vPYBx?5Rt5aCFHOYzeeAI}hMhAifLFX^b zpd94{Y9R~EukNNi&7mOOw7XN zBh?>^qDbH+=@TTxKSLHnqDn<>ltn^VD`A^5oY>7qvnsceQJLDg+jTgVuT6||fY2Xi+o;>JpCvd8XHvINCSb4gYs>F^5E#u zDBN6V%Uslgp+*I)-#YOQrUgt<4os($Xz%P)DuS5|LO!oUl6~1u`m)96Ci@Ys z!xsnwTx1#plnf>5WSni^>gVDI%+* zXZwi~$_Nn5mzSi&_tq=xP690DFK5(z&-6rE7l#(`yRTouTL_@wYb8+fD$=&GyB(3S z83H1=>IWP+2(l08xGowzc0{IUkmgz|0NLVoA-oVqiGMfx0_+QB_8X2TuZJ?Nm5ioe zrAHBfmM5cZ;&@Jx=}M7{Dsr4A$&M{r2&T7nDMxgDcY^{`={!O5;)2RyCFhjHq;ZK7 z=Y7xRVh9)=?2it_CC?r=TOk6F!P!~pb3B%PYjpEQWC-YzsTi-9R+~pSxiRCK)R!{h z!10R+6YMpRZL@JrDd|g!!|g%K*z_F=L92D!}KT{KV%JBXy;X zjZLWR&cZ59bC5?O+D`YxsWYUZJJHtKf)~I48Xn;;>5aDzsma#KfhEk5t$^a`99<(OD3p?qydM#tG!cAP%jr_vwD z0(&>vswF}NuvS07*UDg3TfM|~v1f+y$&WvZ5EoOAi<1n;R3PY8K%_8y4!fH4WUXA# zIfaq(VVpbA5*MRZZy6q;*in%gDY=X%^4uXh;o@ZW&V^BqBRl*78`%dJQsE>QJu_L2 z4Bna7qvUKrM|v3B8u%>uTn1-S7!p=BKz1yXQhqcpdkIp3M-oM*xoB2{5Olg~WLa5d zhL;VKgJW3wiLg{6F}j=%%u${Q1OjT4l}@G5)YPmbMqvm`#aZlbr+R59X}NXE+I~Jj z0NLd#qwmrr(xwoMAs;$7wqtis5ZUk)#zrHsaWN?_g^t(wj^g&)od#I)YzyRxj-MOC zg}E5EKe_`OH*}&}Zbk!Ox(Xl%yj+L|E{&j(%+=uN5YBV+nU&<8oO8W?57_`SKKA|( zV#mJSaJGcdv3DogPd>{g3$g((a;-l2wsunf%VUxY;rWXfu&JXNI{($A1TV zIuPh=#ZIaft=l$Wj?zw?^La_txhvt^`~=*b+r{@vSWZbKIyO6_7z`_=s7ujVIJmfO zcwiT{J+zmsEamORX-K$!S4R&T8-x65L^FZJR4j&rr~Al;q!98*&Lm@{fcJZ2cM@Q! zQ>x^?I(+Tm8GLElf~ei6K$S>rqHYu@!RJ*VfF53sp)}PU>ELlP!FJBUjt-7@vqATs z04({jdN+{4a^KW>IFApKWPLg)u%_B<5?{}f(%{SbC; z+r)p5VfT(LYH~Ps;+%?9+O_@e0=MD|q(r$&Nf@z}268%+RnEbyF_qtolg^L-+V5QZ zn96SfEm}x3ugyuWFn9>2V z*sPmnyIXL6B8R?GfV;>HHaKF~?2sxBb__1etK3DcRzD6*+Ay2*p(sfRDNWi5o+P7u zPHm(DN&*yVFw2F(#Qvk_;@sKMj-$tpW7CEnBqA?SBl_MyBsiZ z5ipd=;D~dtR!vqtu|%qHjuTG#Lh*1 zaY-s$`ab1KwGI9ZjZO;hpweNy`PO0V+q45yi!*5D96LKUjt@TmG<IW8e+V>qA96|r-^XNNs zUa?Kmmlwz^I&)eynUiyp92?E1@XW3U@cL9gKK0{2gbp%R*?bm9H5EHY-=shn195|EaMUzI^l|7CSeS849rvku8d+P-35MA~PACUmz2hhKt04fDtq0 zSpiOQvddx4=l%eJa#xGWbrs?B(j~KGifk|z^=dOF%p|y($`Pan$cD$sbcswK5dTSn z*_;HXumg4U^swy>7^WocAY}XmEGL170-{UOv8ANvfHe`K`Dv(QOHE2=F%DGT`o@w@9OJ2)`nBw=e zkT|h&qv4(%#%K35U{|*v7JjxUC3`rx3A1&(ty;rVeyiM!65-tPJUqefn*w+@j3T^K z_Rs@+QMb#jx+vTUd+w=6@r5tFfL%Mc5h&dJU&Dw(Q(LGMB<^wzf3lZZ-35 zmp?fXal9IJS{9+~A}6ruFh22tM=)@n@<@0dZcbtw>_s#?b+B`!8Yq`ZF0g2vvQAeQ z*`P7FxzHqdo>xy!;E|19xEjqhn|xV)t!VZUh-7s*F`2|CcXJ1B(o*V-EoPB7S@DsM zB;1xfcdZV*IhI4*wHq^+&Y__=hbMOgRPHg6E*+F4W){=%wxtlY`BAj#kk6J?(#QgL zv`MmD7M?G|9kgr|=D8pQDdC$4!19z8as;VmPC1!ug8j!qiC^+^W#B0clgU^>h_Z)7 zK$Xi{uB&vah+`vjXbZW~6|ll-uwsunjL8#+FmDNAl3>!+(TXPSw14>do%r(i&jG=W zuv?vXSyh9wDs(K2!U4+o7LJ!^KKvn-=0d{Q6_`;|b;Td08apYHSy2OB9i7cMeE1!; zVcolZJArE>nFv1P**Q#(PvYFUb1L*fSiWOt&!|PyN*2N08dA(+mW+liUcloIKBAKH z8g-S0U$^YdW~cxe;m(W-&H=r>UCJ%wF*4(l-%6rN=Vs<{?&N81UUFEZ3Ss6sJl)%{ z_x&HnKFcQ+GbZZRao$s?B}kSthSs(QwWu!xI&Hj3dVp=*#BJe*Zi+zho5xS0fxz#9 zEnSqGq-LT>NJZRLR@RtE=rW3vOr^^ByVuX-O;Zq#o_z#NVc5CZ@HIC|rd>65#ujEM z#aZAgT9KMrKyPas=iU*OiowQ>t&A%_c)bBE-z;^u0!e*%s~7F%=#`^GHJ5G2iR=|$1JiITP%A-fx4wzrhlYHe#}n@*^x z6&{cx? zWX+T0$tF{k{3u_M|MT(?o2nY3l8nDs3|8H)Hp#28+Ju&CWw5H}pW=>H9P_^L_b=f6 z&pmNS)2o<)WM7=FBO?k%<#nu)#%8^lmsx&sV=wQ{ERZ>TtE{D7VVw!J^u9U}t;Uo%~ z0w%)+d}y1Wl8lw?jrh%Ed3;4C{E6V_{+#W_J$BLI!7NGWbLf z@1?^{s)l5~-3Dcj&`m17^%^$T?fkytxH0eg7oF z`VcIxU?t2Mx7}`y!MZZuQK!b`DM~p5lyr7IvL8)kB6JmpBLO(V)-1d2mn&QsD&=JK z>Xh=dCFtkvw-2Eq&_v)X{ngAin^NV5MlKC2dCBYdAw;}d?slE7e~koufv7#+&t23u!fdqj?p;<))O2@Ub0noD>p%u z_axWcjJg37(20E{8o_!u4oF0eDSyf_tiI3IrDY98z&G1tipQUnP&X>_l;50ck z35#TWpARD^tfI}NeC!(S4l?NMl^pvCekTFna-UL30|arB5H;ZUBUQ|4wMV0rIfGtx zPaHPuQ`tf zk6HOH7>bgaKZha@Pv?1UPO=7F8W~P*<1sxhjAu#z=T#)p04LbapheN`OD)1{%*Dz` zIy=!=S|EV4s>#)4AjqQZx2KcrWRMG5riizPix}3qFna6+ie#c3loKtS1h=$_>|;`# zMJy}@V>xLD&Dh}4qtj5twq}rB$|6m0U^gTYnajZ!2=RGk6*D3`VF?E><|NJZ0z8&k z>};lV5$VThDyk&D2mA%HHTSQx@B2#>AFjDYk4Wlf4Sya zYFJCFDJMC*1P}}3Dy)|5{>3jx6%r@Ya{SaWxGDJ!jSQo$txfsTE@fsYYm8}aami}v zzTBbH=|R`VP9<%>ee4(+R1^IC-WvG3b3p6Xe6V!N*`EgrzQDPGY5d05kKlx@9qEp4 zGEEi&iVQ;1{+w$f;+#%aDoxhO%5m>*X~5#dG;;G1WRjHNs2YTMyvT*(TH>XYrat3jYAfLH<*1cXU4QAsZ9ql}nS zZDLRv+Vw8GD)t^HLkY58u|!{~p>%}|n``pnk zuVgEMtNYDX3$WIjqijVdcaiF`JH+5H>cV zO*f;$to@vI8=VC-xB#1>fNZLO*9MIUr}g+?dx;C)3@2dj7L7JVAf$L5i@~gzjz}t@ z*rf(HL7H07i!iB6{LsTlClhEU`zLI~Nis#fn>JuN zya)pqyP3%uvWcCl@b2=nsR)qQxpp-Fxd_D7Dd@_E7xymR~*ySYK79g*zv8+v=R z1q#b;q=BWYzAdm+7MijnCFSOxc3hYk!%*KSx>_4mmU`gMM4a6Uz!KjzLz!%KK8-*4 z@*#Y+KaJv+oiH{vp@nj8k-$Szp13@2<*(?XgqtPEDf78F2_$12dy=xiO$IVa`AnEV z2?R?{&cfH$3^T!xq-O9Cc$p{-n*`ig2|U|cFf~4*K#PX}TjqQV=Zi%$Trz@+Cdo}^ zRv=9_YIc`PWDAuXRA7r#SV$6Fl{oeSWE(RCc%qoZBT?8qPNc$Q?!pN&$X0#_vR{E9 zvb<06zm&}VvBfZ&w)ZNzx)33_BC9IjLB6Ye)=J>yX$-0Wh?I&r*4TF`7B8us#1BwF zm#?`&RR+lmYe(>QY$ie$a{%p}_k!Gz7E8wEEbzC5xUN*u;4g!t8#bq3Jqrt;p9FVl zKh{eAPOJLc%6qlN_?=QIwuciYDoS;LwT?_CpLY{r)ot|vYpprTt_E1zl9ZhsL4#!m z4{U6PFVl~w+H>d(fS`gqy|S=NLI zUC+tMVuahNSNV`M?y9IHz3L*AptLufuq$VEv$3*#>a>Oa^h^>*V@@(vX*}Cgg57R} z1bl@vl$-4)?o3M<7*F76e*|xz9;Xb&YuPMl@>$jWY5p=gq`A|aP2_OmVib`)!DBX# zx%o-X(^1S0U7%!`A^SH@=^_aaC!JijgcCy%^maDj*^N$^i*so9N&-|#Ct;+lq=Ubm zJ992ZIemuLv0`L!9*bos!CD$FheeC0(^Xgwy~g55Hu(;>1-@bev*9>eB&u#=iuY|% zX$@3f9bLt-7&mXX0^ zBuQIy1YAO7OO&7FwaQ21D7$Q`gp~jqVVSJdSp{^tDKSRLFqya^^85TMlGNdLsifZ$ zaVU|RGDo?jY?YLyB6ty}d1`pD^8Kt{lftBbNHS6ZJCX(@Oi(V2x{3EGnc@ral=^N- z0x5SWfLto89O@+js!r0fa9+wKQ&?PFR5D>M98;+v#1TIgi78+xe!o($RF%@nbcs-EyfiKXAO81NDFT2#ys!$jiVP3;d@<8ezIB14A$)e*zydlzKvwi z{MXNW$z%0oQ+2bm&_$!rPfbBb3A7Hd){)(5iLh>0+iC%pWF?v5y8ja39AP$b@vEb>3D>jFxyKFF9 zrEseOUMG(y_$iY0iAGaAIs*@PwN|eK@pv8q0+^NthxUxhT2j+AC-$Qk7BQRR&blaB z-^qA!0d%T)>Rn z@z2J%fY>~ImI+P5DjRNk(Y+afB_!MgckJIjaSr~T4tU8>v@|rp&qdG9-SCn$he}a$ ztj?~y2kqZw_$e8UPmU@_b6H@|oIZu^TeqtW;K&!@As`9Q&S6waqV)8toK>n6k8*5Z zIvZ})$~w)TO8mM2@qhE?Si2^}*GZ-&vlUINwV)^AOp% z14oaeK-R7?WdOSO3}8u_n>?lZKY8I0{`_JV(NHhO=N8~_x?$(o%u_Bc5?~2y zWOmvxO(3F^B%7Q+Qn4f@IX7an++4(?YD3{7`{VR^)b|OI@f2n$MnEO$H!K{#0-$A{ zO2r6T*!J?>B{8sM^OtrINiM?cmpQ*k9Z`8d(A0opeFN{$rpCd`$YOpv^vQj#F&Bmyj{k7*>J)L97-n}aHGZ9baB-1wBrp=I(mVSpR2 z6K967Eog_A?7B*+Q>C(Q+Lk3kdti%_2(N1bsHUfp`kTK&=B1Zl>h9+AGT_~=UR$^8 zm=wFM+xoOyiSSfTky0CO`T|)ZvP0oPyswuOvqYqGLY$tDV*dlX;FD;sf*uzZGZ9%9P^@1T1e|oWl#Ro+FHq2&7`g5xRD-jwOjl7BveQQ4@beZV>q-LZ<1p zQOXI94uq!r@O-BZR=t2sEqbppWW$d>PXIs`$mP&c8uVi#nZ*bf;|wP^vlR2y)%f1< z?_5@VJH+YPK*=Ye7R#Q99S)3v^P8XnKEYL z2~NCaE*_0k1s!U)3$p{}yiZG53L6)&6q@*qL~qj4FUW1@l>AgE=_zGcku%znDRQUF zXY)k65t|Zy=y4aZ#T7>9g zGl){MO-Qm`0xU_mYGGf_#?#zTcqyZ&$w)etkCXr&NMs$E$T(#vVSOAyABr4T@$p#& zJS1I;_}YoTn}DfYF^`Fv8CV;AD0{Uc>jJnN3GOA~uXH_eJU2)VL!N7(zaMFWF-HTL zHOhxBDW{`1D!EXAWpitb+Els4L7hNLN6^%`Z6gf4cPURNBteO6yZ|MU|KenGoRt6c zod3%FF0QsF72TK@2mHn+wDMUrb+p1A@FBApRoUj-ySr4*HLJ&^e8>!u6ntdb7RdZ& z#Rn}TMd%%{61uJP){O$>yIWq<=$l`L}z|~vL(Yh+gD%ZSp4F*eORRYN( zfmS)4Mu}}CZVhz?YaN;D=(mu`Jzpqkkv|-GYU0*Gy;dw}Idt->REg%OD%slACpmC4 z*}Uo`GGHZ{s0vLjYAG4iIr2qqK`SqRPOgztpM&~bf!9+}hrE_V5K8wJon3Q=)vlqy z0FPDI(`(n0dxDC9s@|s-#dziQRJjMaH)!`J5mT~|NHW9P?^pXdxrd^vm$!VM`77>I zMXl)WT&Wx-N0sx)j-9|yZH!>zQXd}gG{H?asUS{}oVunWNi=r!V0vl>O)ed#%ar-b zNwjdMIy##{j+3pC3{!y=`6C-0*t@Awl`GNwwX5DOIt6gF)v*R>5p0YX+|b9TkmJJr zc2r7`q_NdFiOn5Ou1zM@AM{w>={xOaZ0&Jjd#8Y#Bu@25`F-@N%t-_9uQTLQQD!Re zfeT2AtMiGzIi$Im1%htuZqs4!hM@AD5>C~_$+xl9L)t&1cHwD04-1(vuCj=x$||a; zIpjbCnK_3^65R3`#LH;uY=z%tP|nasN-E9#dd*UaM}1FdeMO?mC_4;}#W4{DhQ?+w zOzCriyXyHw8CwE&M5iWTZfv70Mg}2cMv1bEv3&Ea##$IGVaulGB6w$P4$pqzNf@je z)2R7#Shd`DB5CO=%$2-dGpXMQY+M&B@|;av#H9XXfj%}D6A4h_cN&^>J3&&t* zTRRyvo92*Sk?6`bj=pQPsv0PgpYrME_ZZ^>KR7&yU3+#A>|H>pp#`121QHfg<@;)^ zYq@#?^~JAqjTOGMJa2=@>I4+N<~B?djGs7nf&GzygX~9HMRhJaCf|&$p25;?UaB*^ z-8YJ_j2aN+2FghAW8|1A6$&biNpfxx=75_FZ2~rz6ET7Zx5tYKGJP(W8=+tjnL-X$ zGB_5_Ju;_=ubPX%NRop}lwDjBJ`(_mZ;+HeO7UDNsq@LX!XMzhQquRgHY%Scr^QC* zQmeY4E2&)yrSt_#@st*QE+t7yK!THuRfc_5*d+_E9gRfQTHqw$iIRo2kX1714Ju8C zq!4lX+?4YiN}`nH)e~c5WW5|niX2JV(?_;zA)P>wKq^%bP-aAi_iYsaNsi?>*)EBQ z^m=_-^eI7PlJ86D9tjMXpPyF&FCwAK_p6zfqfhKyXD_Luai;xW!79=(Wt;IG%J3 zV?(2aP#Z8fG6z$OAD)1NTvM{S~GUka&uI$ndVDX zWi6CLvV49cfA)Mx6y- zn+v07`_a0$9dm=jXywkftBHVGwKtzzIj<1Gi3?o3$6_Q3^vIZE=<01$PQt@O3y2L* z)2Yv`ejd19x-U&|E23vZCx(VcaQZA6q|IAZ2>(m3y@Ch#?o+kv zs!Cc}(sA4(yI1vhDpi1DU;iacL}syh>o%Ofa2_3LNbZG_-OH3QZ`4*-xN}M#HQwygjnRJI3YfF1avk67Xe8|wr_kPteoUs%`Mz~ z>Cg~pK!y{6ClG|5pUFhxs%Gfi*c94!ZBfa9g-tSWPDm15=_~FO5``+!f?j?ukxp^k zr}-UhSeTpTJWS?LKw&%%Zzx0-H4PsnL=*2_$IXz{?;;4yQ)2X~MAnkGOHxvVFO5Sl ztef4YHqGLe(GqIlcQh!!F$V#n6ooDk$jR(22}!d#vPCm}c9 zV<5+bL*om`>8)_(N(d61Jie^~MuH@L*{ns*E!8Y6t8@+XX<#~8K!Fpkm7{rYhaIH~ z&Q>hBF^3j1Vp(e=dW`ef+9bXdTDbgW@pQV&_jtOBKg{5C7U5``biD<3*>%S=oE&`^ z%(cM8v3GvqA|9|>2)ry9nof~*bEzo4QaQm%*U1Stg-Py2qbVsZXU0M}gTrr+0A!?w z21e0f)KM1UWS`G+SI+mNWWoGa#o8szSqx0($bdL8$sPMSN(e1(BYK+(@LROB0XByP z;aCwJWWa*F_P)KF;P&Y-(iuc{a1y6y5_seMEdJ^9Tk)-taqQ^q!i5V*Vd{BEmUS#U ztla_Q!gcuc5Vk$G3s$>f2|MU2o*6Qchk^}C^3bX{+?nZE+EPlANeKR-qleMi-ie(L z@5G7I7YLTi*i9)>@*qJYd6pviN^4k@s#ZA`S>y5VwuzEReig@<@AH<8_dL18mcn`eh!rJA>n=nnX zHsP;cJ&vIynWO1BO|IvdjwKRgf;@0Z?MRMGDMw~=YmWJmp(*%V$T$*crMc-?B*;k+ zd=&}IiV`_o%u!ZrR2kTfm9#k`{oAZ2j13GzPo~b-5JGryk*tdwegYR^5`~FM5Maq? zB?G*#sX;MalC~i_I;Z@c7SqG9w*-~6Cl2qj2{xLI>UlNrcquF`ESRpczA9fVN}Tfp zBk++;N+mL6+Y<14oCuP6)7h*DbhUF+SAvn!qly2H&MrV_GQ*H9lO=P*K$c6F(jny0 zGSj8N+{^R>MXZK zB9t;Bv1ok7I)q}!PM*Vq`*x~O?-yTrOJx9eljb{i;wgg{IOeFMJO^ zuUpkFJkHNao{cJK8lRlO+Ni0huwy|*;Inhx|936YOBwK zm0z<&__a6RM0R=%pKWG;_c|~#6+>?u@gbOxL@0|{(d;p)jLEIsg>G)OV?)S- z_+*6Inia|D0z!T#Cq2#AD4r?e(t;7Eqh=hQGGQXad!uCF3Au4-S~Rm9&qt=KB;QAq zT!Y*(2aR!bg>;IRFY7Ol)lw08;bB0rrAhZA%&!0$SG0)v}G|wG2k>9qCM&6emT|pOY+}#Hq zI!M|sD?!)fbPQgD1y+Kke7T?`3zyBPWS*IvLrD@_dmZTLvSTcs!{N~^blh1t*^O{f zQtaxmauF$EWH^q&foYsM*N5Y$Cn<}O@hau;(B=-bk}+@?(-=H=9*?(WaV8odtLi1w zP+qem>J25r>3$_o49!epmalEx+N(m$HPc@XE_7Pon&-kG^;YkMyHM5fT^6La_BPB? za=CbE7+ZF3;6i7^+4Fs55Mu~>xgZ-&(Dv>nwTWGekSd=M_U+uoew-m&rL%B>=H?(m zCS~i^&AgVSk}s%S@i(jeS=;xi`o=6ShS5JTp!`=mJ3G{(Clv%bIve=5S%uU48e4Gq z^*1Srcd3qkvk_*il?X*jKXGXiU!LGS%KF87vva*GlOZxvWpFi0UBG#DtVH&STf@S_ zJXzf)oEzqMFbX)4az$j1Qe;OY8=Xja5|Jkk=OQf!S{iw7H_U9e#d(qYa%wC~ z8VAW)B}~3BQc*Hj#-i4{-0Wx3@oCsdc9>jtHLor3vm)O~3Wqe;W0lLQ!H@abIoQZt zr^%Ydc@Ief9Z$d~N$9w4hgE$BBUseFHVwwXBOyIVr4E~)%TS)Xh?sm^1S@^O52zP3gM7NcatMNX8BNs=2g zUBIcb+)ol@=C~gFkU`zkSzZs@5`eFl2q)rY?+R{a|(R}L-=Pu`9mwdUk#fSR4nz}qz2xZ zbN#BsN`enDnNB0g29(aw+0jC<)QmR{zC+r)MIl5fCM;HxQZ1z9WT&FzVlXl`fla+# zxK~WCdl$A>b-O7u=-19J7K^0H=PzN)o*<$zDU4jCd?h|*60K*z>A^Ji^ftrCU07s3 zi|Obbwh_RXxiGZuZos_wCK#G=DPqB5)`)PyfVhr}h7><;0(N+fn2#55awJRYJPe!B zilEB~lSNo~P5C_k$s{WEyGFGWef$ZHoc&xxwt z-vPTR56R9D@|h@8l=1%NJa^9nuy>eMao6xWY03#aO^$Nlf)2eUj^!>NL5=uuL^wee zx$89`m83L4z{JfsER-ReJN@Wt6ZzA@Yv#$qWf0-*OeIRllwC?fEk_bK6)6%N*zt*{ zH(+u$ivvd|F?lA3olRx55r8&tZ^5n(?)Hsl=&VIZ9b7+U=^W<_heaS%9(I18=X$x| z5`cbVHj1*p6P0w~xUDA40;P*17l!fdXFkGlZM^If)fT7%Es^#OT%=SkBGa8>vGf}I z$$Q(hX#*9EC{CR?Nmio;Tla6r@ZcpJIQAyYdLy=O+KhmJEvfaUiXB!e99-uy39y7j&R|+g7}F@;n|T!>QA)Kug?4i&Fmj{P9V+ckDrqV@lE#%u{6vy1Zms zyb2(Q?}m6_N;-p#q-c!kul5jx6^J{<2f=tul`MBhf4(1Egfwfza`}pE9?C9 z=orU(3VyOtIs!AvLN5}cFxOIFQ3_Q@cr7Oh5{KLuF@TW(Px5$$2l?6PG)I0(IpW8N z5%Q$sgsC%9W)E!Yg5T*znPf|1ehv=qBa^%*GsjWEW>)oG{efn(U{QQ)IE80-CAn9% zE8w|S26Lq@FKm_kT%`QHbNdz&L1*#)XCEgs+}bWlJ=?GOzJU+?-1z}j z$a8@R*ue?bOO|Sy9jY-DRJl2%!$=K0aVCxs@ivnt73r_5qjiay5hUM63N=pJQ0TZ# z8@d!IlgI@J8?V;4=WaBa0Pl1jtSiIEb@w@_TP=gN)*NNRV14yxoaEC4U|%0GV|^&v-FX@F1+?WMVfddF+8s z2N@I#IszWbV^$1|rjUp^Vdtj9q$^+~Md>_gt3$fGHs?Rq8bS~!l`>9opKl`kie<^nC{ zJ4iO8yVFI6&P2A_t}?s3okqCbHspw|teh+@WH=O{;Qh>!@#@PtaWUn?bUB0t@$<0x z2@oAB%FSXT@bqM`wUulg$NHu=?v}Z0Ju_FriLnHxvjwCHWC}$|YHA?ZOrs!vT9j&% z>6`+%(~EIz?{M>5+i+}x-`?L2DWtsC5paD5D}&<9NgO^mh_+q3)XrXanbY{?tW8z! zm9!j_Q&W^!ytq?V+sDNzy0x{1&n1D27YDTd*%su&-l!t}Wbv3;oaKU?=Ei`Fqd4MM z)#REV<+Dc+d+fwanUy&DR%JcC1HP)~ox@Dk)V*oyaMPvoPV5@zyCZp0?+(;jBX@uIf{9a~5qHiHOFBzpU>u3Qag^8z&0M5C z`!*_?_5Rh2O3b@e#Pj{0Gz0rBJZRw8HZ`<;Yu-%+M&}!L0!V-DGY`4uTc0Doh_s=`b*n!l}V5 zLZ&Qw137fKtz^$6%X?AzWvGbGvTn)2U7~g7VgyQ@?8|v6#M+2_B90$@#DP}7mn;}1 z&dCKXm@YLx2{6;k3c`~GLryHj=CGTR{dbOy;Nsu{?3`qdU$CO{ajRm{Jaz&9nzLz; z6r6;8mk7p22re(h?TA_IXe1NW8>HMHGI26(QGiyGlE$+hNC`8}mHbReJx8-$k6k-m z*tV4$wZ#x8Tgq&41Ey1)T)7~H7bv^(dKR;TpEV*eIEo*AwnLFI77G_InY_zVNLlWw zfZJvwwPr0Cjc4#&Yp{|cKx^~mEKir4j6HFF?r3k*qUr90PPl@}^X=|zK}&N8LxUrj znqI^t+t_S25D)|jf}JWUe^x(5aV#!Tj6HO@frtD-hHe`FA!N zft74ud~#NeM=R%K$;fYJzbHyzhn*}B+edt%oLn#E>xt?k;3!3a<*BTV9-~b$O9Gh0 zX?;PmpgXwH35CciO~ApiEcFScc3_gsP=QRbx2H?hi!?|sF0w#UY*~m7N$(=*Wr_qe zpk!y_2FB`l^Eth;sA(hN)f&p!QJ?^>8gt&rmw#rbZ=4JyO7(YgSW3v--DWlFuu~ z*MLAUNR~_dJQK>7(BX3^62@xw5TGXUW_$tfi{}s&2JJQ!2H#G(TU4}DXD)CoxbeZ~ zpICa&enmatdKBS0vYU~iR%`M1+av-)yR)`e&JF_KRoQz{@Gi5tp`7*7iq>_bd zG<{`2TV2yFQmj~Uinhhw-P%HNDemqTJh+!qym)bUf_rec;=zNvyUR_V_q)HspK#9E zIeYe+H8X3yo&c)Wo1&a0RVr*HLRY2x=SQIR>JbJrcun#|g9tyeE3>)7@a1|xC7?4X zH|d_Ggo4lSwJ2rH;`83v;i~VwJN0JPY>2lVvvlQeH|j-rU(~?M1iNz@d>nLy#jAYpqr_gT5_&eG@}d7RSLY*(*L&I!IoHMmK(?+A>k1kgoqW zU1pDWq4`LEAcMa*#Hd$Qzh14f#J4jD zo!BqceWQw9b2r6=fgP&a(YE%I$&)`6}{ zzn5?PW)m;VFNiTDAVUSSsm1ql1mcpYnCOEeV@(s^8&5G*wslSQb%NMY(4kg(5QP4C zeYjin{f4(wx?kqAUNM+_-zx56^%Kow4Wj|`WPX1T)}-FsZEXO?Cu8+2r8s|HU;_iM z9Cbaj_It3zrob^V>H83lbhQ`hjpXgi`*&!e>pQ2^?^k}z5af@t)?~|b$#6=(mvv!@ z`YVmQwNIacBn=>LYG$a)k|~9?Z}F1y^85^WKZ1)9wkZ&cbDj_aH}GSj-59C2M|`u2 z4_VCyGjuwH7(O*W_LsBECmF@Qwr>y0KeGpLehcIcZjx#70~LpUYI7C)~>?~eu??j{90 zTd?H`%@&@SDOv&yA7^*ZFN9Dg_t@8GI$58<?6Q5^mB>b1>KILj{kNcA9l2m`ky?uRD%X4wR^VZcin*uGdmRcPAL+mWKtI}nf zK9lCjrU1AQH^(cq_(Y82zIsHb`_=vhj zk|;H;wJOP(gdJq|RsH?E$J1agjug=mYCXaE`QMFRESe?wk?s`2C=En8S9OoVvilP) zFNF*K{rZUF?@uZV-F>1zk!$KA5V_1IhEfSIeKgD?qb1J1H{wZQlMf)k&mLo7#-2}7 zW_G*8h!h8$*K3s}%0mpxwo1Jl2ZFDVsNhwSm^+`2@V)q48D)gBm`waQ!sX09yiEXl zdwH#G3RevxJw2V#Y|-0BMJoONXuajF(B#n`1IJwEyu0sO-+3|SM`;}7+{}z|Vk=cL z;<0!?0U-0a{vi6Y2l(4|#4BPcAQx>n5yt*L)j&*kU)Z9C;mraiHB-wQ0P!!Ye6zpZ zPr@5!xj|`yiJL+j$_e+Q=^q=1(5q$flH+l_5sF`M`x2Z?)Q@ydBMjD=mZBgRpBlG(@l| ztp9gBF_R{s8g~r`V*$;_?ny|M8jk8wZKrT(C(f*pqWA7uHkRz-jcAFhj(G}ER)woD zX2e_p@wdvYvbf>n_cyi`@B#?w@~NDHDM}gqO{xgYReygDNak#EY-|~B)XH9jJq!(p zFx(fS;U|&}wbMstgJUBJXavJFxQV;NFL<2&GKt@Rsj7y*q<&`>Pa9Gi(VFaB@q^D| z#3OU9LqM8D&!H4&&taybQIcT}epaw1$oXCCGjo#s{7|g*J-U+nO*bKBz`#eI)s4Y$ zyT04u#5Wlbw4(avFG$qCVy1{Xo)orc_=I^YaKnMplS)(d8<%HyRF9Bz>l3m!TJ{Ue zW%+snb6Zy!56C|We#d3hq>ub1Px%p1mfOJTa^?&Zmj0dsnrj64{uY5IO*@OL!-WBc z&F9osVN;nWr+V@7FxYY{UVHR}N4O;tOV8sGSF+(bL(UsaXJo#n#`2+V#ApM}YpGR@5xAjWgc_OOe!B^q#zWSlrn;H$ z(Qv&ajzv@ct5eZlk)v``bR(mGQma<4BbHr|$3&Uv07xd&L&jV7Dv^Y#yI{;BbbZwY zqbPEQQ=UN9$NPU80ak-9?44Z=^Jh$NL+rru)9u0fqddZew=&XV5AIb zbgV)g^SQoFx+lYSm{|&KF=H?1Ao0-CxnI0l2$|jC)6A!Z&!j9!%{91;3XNLKc&kk#i zUb7Y1xdgt5e#Wm$vh{tK%jr0DOq7EsqukwDEKz#Q!7~|rrP+ub zb9tXMfv3yis+Qwy&|WsQTL=%_bLyezOt zy<7M_EBz^3(uS00+p0AK85wkQ(|v4reMAx{6CwQ}_Pir#pumU}c*W#v#t#kn?uAV2 z2X30~+E((Qr7Deits1dpf-(pxea`cwaJ%ndFkhjm2QW|J-b`JL!7g{irZben=8Kmh z{Il>*X9{(}8$KFjzH~3_s}yQkJF(iH8dt;quWxC=GUnk90Q77yRTQ+1!qr3i@^F;o z7ZZ`Av0$)u8Kv0SZ){e+9K$dnS1av>WU^u!t9l- z>TfjPuVj;Y4P%)5Q&=Qx>i3%BCQV=>y5EpOCGE6EV-sCUh7rnmLbn%TvRBX(=qsxE zJE?*M<&wgT3gC77!6oat6pg7>%L0S%aiM_EVUnf73Zq9fK5zI08cP-QCF*Trk#nG2xVdpHjF@q}Heh>3LR*}}ocr~uqaaJw!d9qTr zecn!cZ-Fudr_m#lUDk|pz%rI}67w$$<6C|iiwVPgGTN~vwYN`%OxyL;%*$^UmVAcM zGG+P7k^Ej!w>gHUSi^%B-im40As7hHrmo-JEp103Rz=e``Ga2(vQMn>0Kvx z3d>N~_9vrSi7D9LxAoG#ccd9K@kDjRi0e7rpeGrU)^7c%FqIzjVS+>=klEA2f`T=a zTyc27T-HMuXs6*>Nr=kqe!NmLrKmMeE1HZVV_;}z9u}7nWtL(a7qMwT{l$2W`tA2m z)LbeB#_2~e2k~xG)o_7J*%H>9Z=s2+we^@z6@0Yt({Iv65)8~UT`u3dIyiiq&ky=+ zF(KDU6!nv1ZaGTs63yxhaY`OLHnAAcK%SNrEF6wxO8c}UJb7#%P9jB4D6BeE;~{@)9~oI{W);`!1DZZxMBc`7Ypy$Dem>2dR63$TetW6<_UGot7rCDKUg+@x z`ZFW0+E;rdN0|!BuGxHe&^u%*ER9^W(PhU(fdEcPu^S$!>7Q1vL)12 zg**YPFhuGOYM)ri(r~za>?u9rtZ5i-VXP+|F<0}GO}wo(8K&BXW|zI;#W8}=bi=OV zmTLe~$8lS$CaYRZF?2HSSFw+MMd$tK&h20TzT}_O?TnMHM*t+^53_; z9g-aiM-my~)z|U^%M#x+>m`-zs8@FB+kIVFk-NS<@kqQSp)6zUEal=Vs})MgD~DZE z7kbdpUf#lMGn8@7!^7TJF<`<{S$6u?&FSpSDbdo@0!UFw=0SRz&L6QpiPrkG_=RB6 zzd(PFvgK$sUbU8K%2{>VWtijXv9i@od=Zutx+5N`eNktbFI|cPy%Zm4G`2vFU#gf= z=oMIJAWwUhm$g32_QqATMHW>}#C_4nX&OF;pC|ePjqh3ky_*bm+^F@f>KsTsQ8#pXDN zV)3yCW>#4n5k>UvnJDPKeI)$~pSYlV!Op|;#;8#jChqa;Z<;rUWP{ukoU~v7Aws21 zc)-D&wGC=+TRqbBbZryqUyo2CM}p@M>qTMk3As|r!+%%tMpwbc?%Yz^(Ek>~UVkxh z?O=FL1Hnj676%Y~yikuhE^@iYvwBLK?X?%EZ?;B@*6mz}X`l%Rgo)h+i*+`3JlhkDy(IhJCo@L%Jw3G!>-lxeFFABXt-e054uqf+ zB^jiprgl5L-Z+@D(2k$|`{O+0)JN+1F~aaE_dr!0J+uebndP-#pq^2==&w;Dm(0pi ze|=cl(OwFqBqr|Eb!aPixT1VLr!4a$h>}zXM?^(MK{bzAO)uvBj^}2GTQX(9nSySz zQ4zK&by5%m&uxNoNJTmob?t-0%Z|ea<;yx{l0p2;8~-aQ|NO;DK=RUc07Ullk^Vx` z9BrH{MB4qYCfvtZ5pt})>R>iSdZ)UisTos(5{DV_Q^!4fT?rB#n=6IUoWSjRbtG*O3 zCpkH}$IXJ}`C-S)Vd<8ng9F<#fDcxWI$s#~(@%3^)a)>L0iK7%kNu5zk74HzlL`qhFS+~{@0rR1#rC` zPsy*iuTNR8E>F9#56G^WN^;*8c=fsB;r7|&qC6kkagkVAY|^G!geUgYBi8yxr~Mk_ zQ1VS{@!P}C(NN0A`GGS!{|maiSeSlSL4)sR6yL<+Vz~Q?CkiPaKrJhtw>ULjcX6$G zH?zn8x$;%LzAG&IENb@1^ige#LPXCd}|C~tOw{hI}#HEyNsO{xG>s5fl za|`EbKIZw)L!_S4L-+mV?)l4Y2j%Og{}XoNtIT49jp6fwCgic>O0MHa)}!(C3LEXXR)6sp!&9Q+Jwg5YU31o>0MhULhRv(1I+7U91~Yk)^Ip8Sk>h{= z<}^2JLyCnx&OZ2U(D{9Z-_5#D$x;rf+a`X$^t#>gM8q>NLQMFb#aDdsyS%~cw&9C8 zgiiFjL`k1V3YFpGrVj5{&K*97mGVW!3Z~Pcw&z)g=cI%9&CN}lvDo%IOaB|oQl%lD zL!f=xz-}cKSk<$tcX)j+aE6<37x`@Li;+cc1YVhb1a10#w>rk(G6%9xaDea38)AN^ z1Y|-^$aIQXnn)Qm!QeMcqhqXVAr8Kj4wM2pHP9PF5|v$?Y#vU*iuqoL4p%rT(|EaE z5vp(b&0Hj8Bt4!rFuN@;lyzx*wvL;IhbOQ4!@$wBYCJl{HN)pJ{{lkZ1t|JjaYNut zZv5ep#PZx+(dRh!<{ElP4W)CdS`5)@RYe6Wj}u^_#=P(F{@L$nsZr@T+B`QsC1o-^ z0PjfntP^p*-j+z10`$E?zNThk7@^&AoWczoTjc6@YWB8{Gv$SL%GGOM#~qQ4({Gs; z*r2FyOzF@TbGC8?i;$Ui{x*0p=p$`>3p23_{*7OCJe|_UzxAqaYAS|v0HLAA0+V>- zEI*+a%oxRolqcojer7(V9RRw!m)%%7I2fLLA>_X4l{Lh5q?yBCBai5t+1)Byw3rI* z&4(6b{g{Rzh+TqJrVR-TR1(2O}hy z6e(qC1js*}Je$=hE3cIYEt2uzf?(hOm4BJr|^@dPhS#tAS=goc5<1ZMd!W5?$I^>UaY# z31Lb^pZvf@#b6i8t&Li0Twnii4;dhsdlO*J*+xMhk0wi4w6LJfQ;qgJ_HbB&_LjPG z#J1-1+shAY+k>%GHeV9P!_XXYet$yGgVoJaB+6*f|5RaKcp6ujnGp5M(dujeHiu7^ zQ6cm;{y!ajU%VIS@F`5yRG{_M zPS|d&Qg;@s`Gv|J-}e=Gbv+GgW0ZMtHHBp}51LeyPQVRA;HhZ=DrSgFK~K@h-Bu8Uxz)xK3ubC}4il6)i&^!3A0yJL1l8py>*~i8@pxXtIa+CVlfgfhQJJwOW`#YwPn);nr$QR50`x{XdY(qeTw84mke$#AakO0W;0G zsyzKO2*8vk{i|`hHwy$V)4z8^dTQKpcRD!w#{82?w)@D=_M5jZ*FnRJyxC6PfKpyr zEzD6&73t@4IJuCg#x@eZ)ZVc!Z}+BlhqdB~C7ydA)qrANK>^Okj?<(i{oLlhWOand zgX8x0|CUOoBwZ+_GzY5?u=2KV%AP5as)T`JrGwNIZ#tcM-1u=PiqSk|%ehu(^cM~8 z+4<>uH5!4wfG9`7MJ#4aWEpNAG{c_VNjWi26&)QXh?|PS*AW|ci2DKM=OLVJ#$w7P zQMLa#7Qxm>Yb6-PQiw}E(l7NHNE^SMyWbh|0u#jZM5HaUtcn?+6!3ZrXv9-266Yw< zz0a%zKRxgDJgTL}Zx)Sjq|lvYEvvZ4lYcBu0w#0#?buOLcslZ7;W_fWd1llGeu`Cr z7u$@Vo^N-s7wSn3QIWwsvKbtU3M&eQZqdrZFaEr68tb)__A0Oax@px$AqD&@9Nj zR)DA7{Ib<_Npf^_tV|&`pu&;Aw7(@9qnX-H^l41y=%Z2Uhu?7$i%KFl?<_2KVvDKs zV16EqQ?L}Ry&$&&uWYc~u<>^600TxJy9evFaOPNLOzLDn73VKT@nRU0zG|T}Xs`yz zeNN*3JIg|fpZBqZT|#I6>yAwV#w_qeYk;l@CWSwCqp_v_!dkqTZb^?Li#gsE%W-|$ z0#fqc%4yppB@UW9rq#MBF0LCY(T1F;NU7&)tKaw{*d|X`gwLHWG!rEMht9N6f-<+gJv6($6A9>SC1jfWU+D6zvJrFPxYbYJRVpO= zGEw&)JLMH^`C;dg&5KOHAVg>Nk2xSz00rqwW&FG}pau8-mBhgDB+rAwozXvK}GGh%m3Z~S`w#R-!b$Q(Bn7AZ>ZBLBA3xcTWfCBa`SzwMQK_|PEmu~U-wOJXGmQK<$ zL?p|LqTGAw;QsfCQd#5Uv-PPq1#>J@p~ddmT01$v-^H@}X%Uxp>&=5P!IzKU0tqPzm9YpQ9e&(_XA}2u*#tDBQb%NmqStrF9WVzE?8wiz zj{;i$bRk-vBq*F6o{6sXV~tWuR>y=9eUNCGPuZVh=gkMg#wU)J(`}Rl3U7or(nX}t zSSn?nyN61wuN!CR@k3v@yP{^;6Xv!WTUo)b_wLpi+Zm;xYE4+8{~rwzb(FOC#%WPk zD{>7aK2U8x^0RD(XiIbU3rl9LOT15)A!O4}dO5ctg3rJ3XrMpc=g&qm+wZ0&=B%q1#E{> zQ=5{#`@X6c$`ZW0J~n^67_o~01bNu>Q>FL*a;%m7w?^|C&(TpF`b#b);fJ-UM=Ddi z(qET^4OtSCzY;zoW%czY?`7awo>gOuMpXJA(hzXaspzSSOMg?Sm%SQoscwlg_}|0n zwn1@&A$;tS*{h-7C&s@4ze1A1Q~C3!crl{cHe+tUy6l4HFDx||RLW|gzX~>8K<{+D zi3k$!FBbBDFyJ-6j>zQyeKwNp$ruSPpmU6`-CaDMXtrnUU7FhY^6?{%ZOBM80npmc zPNm*Da#U5EzBs)+EtMqU#L#v_FGJcUmKoe&|MBy*;dMKHDAqmVU_RGDJqxLKqSPzg zdpQOY``p&O55JNGe>(fT7OcA=R{$LFjsHhI9IrI$np8a+j~r~WAb-^ z=2nM30v!fWzi5K~vi+D`nl5?Ei+)M3%%OhiDI%?m<+o9dQvD7Krep|6+?DD~nAAmUbRapFbSal4oTqY5{p1{#46-zBew~)j7(Ul!M>0z_xpe{`y((JGqc~l>yzH+%qIv~KznGg@=%`h!U ztxY3FneCbt_ZC@$_}tp=1?T{r=Sdy7A2ab;(e<>q9;8Vbt?!$?!qRWB(C_z3cLM zGV6)pCC2}9gx~Lg+3&gWubj==8XOG{5`twU60s{+*9rA{i_xSutoV@^zrj;|r6+TBF}>M;VZkJgd|HIasXc_4)M)MLqdUOhfcFqT}hX zcHc)~qV62#1arTZM~KNk;y&I2sr zx^t)o&f0e~yLS{w9iQ&@M^=P9cgSu|Rst*iH-*xLL#sSZ*}S|2&mYo4D+FWe^yTF6 zcyEB4QvQ3>9vhRPYHutVQ~D`i7j`*BgkoAil-`%ec^+qhBE#5DCN>W>w+7zNA1LM< zNh>?tPzR#3y2tF(*3VlUPrkmY?+$IdFuFV@DUhBoDEZBW7Q*TIuM>Z$;ddKueL`Q zeOTW;e{xYWnS%|XX6c%N{WCGF+U&->Y6UxWq;3G6={8-K@VahB*DHSp#p#B)k5}q3 zfuRc33Xmrgw$?N9^p5$Mj)z0Gu57-w+R~x=^bCkS;v|w%vhr#zV99IfSi*=N%UsWeD_@z z`uTVqnzor_+TZY#3asmu{!9Qj?~e)Xdw1w;sP9G|<#zxaMI$LD<`=y^((m$l^Zs}4 zugGGL(_+!%J`Z^wHz{-p*kgMz*Mie!zXbt30Nuj_3XH4NUN|`>2OT(AyUV!LSc_x- z`&p;69#Hwd;~@RWhpq|$<4B7;G*6#*U(X^+p<>tP*z2*OH+jt^@RL?wIaKRu+daB1 z{C4{^Asv0I8c)Z)fclDIlHPHnXp!A1!jA$D8dW);;0C$J8Mm z-;(sHQWs-L9_p!mnN&RVze2_|pl`_6m*8jF5;<35iLV9O!|Ib}=iavhsRIm+1hI2f zdjAtc$aXiWmJH;R#QzQy5TLB)A+9>Q+#~ehl);f8<|~XtW>85UTbJ(oA@*LuSc0?6 ze_QGM%b1~|dW55+2btxVz8>Vh$a3d58@`5*Qo7&(ZJ}f1l2=)j*8d%^tN;CACuSvN z>HKh`N*m)f0Qqa+huM|z)su+Nnq%Ux8$^`|S};aJ(pHYEJC?ZpdCK;UY%MVbx#q|2 zyv=xz>%ZcqV=$Ks#WffrRR1)#J)YTj=%aAKK`!irU{UM2FH$1jL>y-1XeED-FKv9f zpW>M~w+$2L4{876w?ka>bmYY;p3z?Vzq}39bx_tXSTmJjR%Icn%uT|PF!~86!q_yF zl#7>cC2T8TD5t<=T;2O-Na`%=)WuR3r4rW4aZM@h=U$nc=_FDK57uk3prjBTI2 zZMpnYjcRq&Rx(`$LGw8#IlnS1fCke_YwBu9y>p5C2XOy)@-}#Z?UjGT&GncxbOI`+ z6rttN5)}c)QkKLY>#q;|2K)j+wcikLc$SPJB&!yzCHHpy2_AOETnsH-J78P_b*Xgz zq}N$zn`QT+tf4kTs(gRWkXdQtqlnd9IBl5}&dSnF=Ip0Yvl?PDlD`-OR1h38}2x}9Uk zY3HER)^L=YPUNeO zZtL~Vd^mW!kd;`Ef`?wt`>0kmo|A20Pmy~h|AlJ zvzU>qs>0lCQ9}I}8`p0`=86##6UG^D-@jQ6bU)L8SV+N4IeoCb+|=J~^`tlJkub zhqyM5^*l-+3z(GX-Z@uz{Q)WQSJt$F!YC*sUtE=bw~>Am|KMCpg6cKYW+S+8dVl?T z*@wJJhyiET-W-gFYYc+WEqaf@$fQ}=Q`UHaSF?a+TRklB<m)79Tet?MGdmUr!-ZU2!~2t^qYPa?@B% z{=bbhYts0piucMj7l!ci)uM6SqiK}e;V)N%0ViO30-~H+2V|WWy3R#4SQ|P!3z}U< z*Z&U)V+R}sFw6jpP)HS$e%Q^`9l^?!0~>Z2in~iyfBi|fGqUK&7n~G+(=5#X-FXy( zc9OH0s{Jp#fp^RQu~60@a~j3;gWmE*Wd#DBI&wNFi77I~1&zgn#UhHb(nA4T9oen- z?yQJfFmym15lf%xxq%}uKW4O)geh&w`3@#)U0WI_urcv^6T2Bcgn^vIRY|AHuy>6- z+-H$LWqqA0kt&#hRmaP>0jLWacByS>C`mLu9IJHiP#+kGnqPsfs_wt?^|Z#)$=rVs z09YiuUED<>imI<2^Yb^}Zp>2Hj-K?ubgKz*%OI&-P9J0}VT5Q6*v#JXPV#lF3PB4O zQ-_gYa&j@(=d_ohwZ7oIbjZxr4%dV@$ahWLI zP?k!v;VEVrZ9+LY9TPbf>?Z!V=@xAkpCvUazcodVI?|cblc(uuN{Chjmu!9J$O`T` z`YdQ2E8DM0&WhuLeYzSP4U@Nj;!YepV-LzVd&|J7jZpEUInFy%x2cu=5>`^v0$IFh zt=BD`4+eWr%)k2)?7s>U0@u@;B%XRQ-K+ki$QEl-OCEKewG1lRYHpL%m!5U*L8X;* z|K2&$dYI707>s_4SA#>o%;;)0pQCtD3f+lDZ5XgK%O0M;mL>yQqM5(Kke}acW=3g6 zJ{+SAR@(UP`PvIq`fN3>^5`hUuZaOi(2n=Ykfi;n7MA#E4n*WPnXATl*;94RhqTKz z=_$y=C4=~$WiM}4 zqM6~xko$uX3*DN-a==uBSV-5T0o#pFn(X#WM90b!Z5m3o*W~Ks$iG0g2*UTS;DX_w z6a3B+V6@4=>raz)stKZwz_lIZUKP^ct9MF9H4mptIzP(l>rWIl#Tn*Y;{JyR#x+v0 zVgKV)_a6fYziMEz6QX)`T#62t#CR)e*^t@@7|}2x?%bH`kr~V?yXEjh?24q`T>FX!J6L8(5$$h)LUQ+%fj~1pW1wY0+4>abtEt^%sJKSscCN z`37b3S3pCoM3}5!t*v%axg2z0Ysanxs+2LX;PQOepWG2tON6pU+i7EiQL>iAndY^$ z<4$P?Erz0pbgOKcL1!)0cVs&ueG$oL*Zy~m$UmjlTm&W-XT$Z{QEP{Otz=@kErS5hqM0?Fa?6*%wq+@E5}#Vt1-WY<8vUb6hWo)Zso=&N{LmTzo|s8m!8lL%){jO~b@udT*hPw|Yzy80-5n&Y|_w30nA zx{R>Mgr-*@a?DHGy-rW2NV+2Eih!r83QOQn2+FQzb4=$OEy1b3+YGQ992Nqa@7WRj z*!t;;AZ`@Pjd(;4$jZ!419rSU`&CTuRR~ox3_@W{j8nS&Vg)62}Md^b;zG6r-zjkUr+wCfQOYFwX}k<~NPU((f` z;NyQ&JJ~C`v*~-NRv+5&JcaHE&akovd`(?dei~l69o=loQrPNh4nbXlM#{5Bg*LdG z0-On_sh;&b|2i&^;s=yActbF}5I@YP?m0z>VOoWO$t+h>8hnVn)j&qCqb3EaXd z@){Y3&pvH{RLFZ+Ul?C4qE^4EAkXBi{dJ-FKIEkxhc(faxX}jU2&k1oA*yT){BRJO z2}OUw8y9(`Zt>=$m-3?eqG50NCnaOE+nUZO^n&HziG>MV(astmHbYX_JzR z@5441goYpa=+v8ws9G&Dvl$GTKM-H#q~OkJD9)IOQ*FuuaAjoLcL`+;;$CtAI&cv~ z#i4;1W)b7Tl)iqH!y&ktzN@NMHrA?Gr?QOY*6!An+7bl{uq>=9r$~;acnY}&b%YD+ zV%0Cx0qAGoTbQC!3o+@7@jr<#B~NWSD{MZK0RvVhFi{>y2Ir|I2k0i3AUO}Qdde%w zAvHG6lr_Iw^c1geVJR0QA)n!3UVRA~yus}{iaXPQJ-pMDl z&+0K3reqV}1DUFl(DuanTws$G{B0pQMtH>}!1>Gv`E;rF~qSGmFEe zT?YjZY+?PTr0l#3$*cNvY{+UQ_?QWTN(f0f3VM^%7&~IB*@u@kn z{LiTpTL^Ec>{YcH#9K{Cl;}2+yKkV^3H8vEz;biRLc?{h$BlvE$Yy6{2uBUwnXAX&k?4%06FKGZ@ znhF4>aDQo+-B3GDpGlssA|bpOj4EgwD*Yb(p24uuKH%-Vi{@K0xdPfyum42pzqea zRY{Sh5nNYb<9>zMDdK6@H`vs7?tVp+@ zRwkRyY#S+zlH&e@0nb9Xvz=~DXP#xBuiI`#4#?zLbpQv`?UUEC4Wlkc(jplwg@v9c z13_H3GQnG0fArei>3yaSH@-Joj0!y@oXv)4RlVHbHM>i=p8sTM2YeKX>A358{W)+8 z=xZ3r`ZkOUa{@&tnr!fTh;*~FRp8eyzk^9i_{JW$ql!C|_`j^aycrj6BG=9Gpu|OX zXoH?2=rVQ2RkH%G=CywinGTL(tVO^G+PewW$BE`w>-;E+nn}>!u{EgiQLq7);9e8z zOEpmcE$^}k?Bdj#(CiHMLz7-U6@$nhLw0l9{7jA9nCxp+bccGuwgZxP;-an2K5xV$ z1i0h9*mRl)f%U~%Eo{&>^Qoko`IE(JGzwXvRX;H0^!X{#YsLRKLD!fqH9L!ZILGftn(uBJ!+BcuM@4 z(yc5NFf?aF7?`&cVS@ z=3E=BCD*&Rmu=f@DqLztzN!0_DMuyp8{P9C$ z8c0Ud;TF6E&;+wFVZnebX}Lkf83o6A7pKWFTp6PXBpGvZ->(PhXhW|2USjN@yAKJZYWS>v^lJubY7shA1+12Bv8@PMBr(6$RztsIp zcK=Ju{=HudpdE}-@=mv~Go3;(!-RGg>EXXlS`fgt`X6UYTLOpCSWwnu@k=ff6HFv~Zs;;FMQh^55%(UqoSdCyp>U^9 zRG@#~`(6{}FNzY1ul5uiA>=XcQ;mGHs;q^)Vzlix$IRpRfg#KAmf?Ys#f-B2I6=h1 zB3k8Np_8kx1a_+{U*BcvwnSG`?+#L_Pf(GueHj1yH87hy>wG;>L<|EwmtUc)kz(wc zxSKtuch9@%DQjc-T_sG*&D?i;#r5ER`!1x1i;Mqh(QtDTMUP&cqO?W)`a7Fa!N;s* zhjLaRDadlfa$^2rE&MdG7EL1hIjWRR(>wtaGNS1>V#=y67`RRgP{{lnb{Svg@W{XX zMJ#eV$m^>oL@L>flu=32_p1n<%u}j76(M?FHAnA2Zd=)6hS)dX`j{jprSwyRfY=mv z&U1!8QrK&;&)y&GHIk^?kndYlC;NU+Iu&z9zS?B6t;){o9S6EjD_8l2hU4SLr# z{ZyY>+*R#YmxNYE_;X8#B zkj=J5`zqm;OS|CrW7y}-XruBSzgTor?*pHvJh+|X=r31?(%~aGtldEe;tZ>iQWQ^Q zkw9xo0VlUsO(`e0NCW@Y?Uem4LBq+twFe@p z6Bq3Lgms`Z9s%E=FOLmrlv~l~<}8G_x6iG)prF<)8f^q2Q_;0JyK%roMHA69HK%Cl z6>U^D0plmoDj_?P7kXPffSc3r)jkAxRYtVN5rxj*UAOJmtCPgcFy?~R9-bN9YAQfC zlaiQn+tuMv^6{r{)gOCDZ(*yqJYB_nLqnb`-BTj!mNFtqBSMMa;f)T`X?PY6AkT;D z%IhACL3~Ot0u3isYDwD%)2$ktt&OkT2OCq5e)*wud(p~!r*B{funAUYv)B3#XT6;e!356?TK#u- zGu>@fO#zp?1_RUJMS|?ohBm>PtCfcH>m$X;+gSk0Sh@$=4W*% z51V^(0!9$85GmhP@nUQZ*JNUSgXU)I6o*SQ##^#W6-2I-@C_lu*S9T;qp+S~8Q)~* z$>M%6S^73LhoDvvv;&D;M97#|d+iqG-CJ(QR@;HZnd+LMX-%E7op#1Ef6rDTbxKHb zy#WK{;|^ibg!_xodGL?`oO!5=TU4$D*=y(s0*YiDI8t1# z9OTx|g#3fhi5k}Lcl}T`isTejYSQ9y#lG5U$tN->0^3?SVnz_-7qVxEoVOK6hQ&bn z!!QXfmp6!rMH5pq<&20Jm>FNBba62a7$lkFa{@c=g)c$qqgaGQqd-EGs-r&_ zMMfklrhzHl{KdA3^>a-q8uDQcXTue$l?Z6V1fR3xEkV=86tR|}C~RwMU2HiZ9{8d@ zJ(@X2Y~VIpW4ZS!;VNU3j?Lx81!+sFDWL!A0%HLvv>3G~bgzDLp<8vkuhebq^m!8z z)uUEh9Z|`F+geKw@Ux@s&4_uAvrSx$j)l3sX~*EMhh9@c1dRAnzy6)RYe>u$zquM za?V)rOY{~_`x~B-8QzF7cBtCOD3vwI1QE2X3`!IWR$*-D*O-_(^U*8FaO-sB8OxwXQsRAxyvK3 z5S3k04gZZ(xu>USP^Y?M{>r8`8RC%`|CYHAWh z(1;?@GsLR-qf!lXkB_6|MXC_GY3jQ0^ugEsq_r--c9=OQCFU0{**=^FBNLaHuuuV> zLb)L<=i?xg9#>(@LbCx4*{|L7djzT)@M<+ptRmR<4Oyv~Ya0{&c-GnV)bW+&FEk8- zwi1k)y?4EDx{L|qdo1Z~G0#`x=VwemSXIpil$Ew-D;%VnsicGk7C@gaKE0fz0MNc$ z`D+rvmK9*lLSNQ5X6v-EPC>WP%!%c{d3okRq9)QwMpWE46j60Abhh^>ikUYw`tq5< z(gN$BMQ9rS9*f#Z=!aG@)FmT2Xu7G^`7a>%^8`g0>+b~{jjYfE zyeU4^1Uc<`nTT2_9UWclP(BBbbGZC9d-{nmuRAHf;r|2uKmxy+FCXtZZM?&yCkAo)0L~c#T={_J-WNN4CT%# zX-LQaZQICQZF~e@{qlc>i3_sGeTldcpZ@fZb1vl0w5&}5vdhd7(0u93e~e9SX#|6k zG|{9buT|Kxd>K%w`u50Vna-BrakgqZ*qU!E;BS$OYB68r`Fxa?LA zwUIx&Fs~#+uiv9&NmaREV2B`UksCpmYR`dzvlyQ|&-pY?0LXhPWO%)zDk$yumeJH; zRxBB6HcD5G_p%1gFSGY(ykF1i0Bc>@`lC4OrrAxUb||mTbKq7@^Pw`KD)<;pHO|c( z;&!JF+udX=%JZCm!kC}qf~GH_dUvr{jLc90V?%>z3M`NTb5^``#b2wmv?E=b@318F zARI|!VZo1$TX!SJ-KxcGt}qi&ej#p;4+9tbc)cQ0g%n0dMsVijx45G%tI4*MDRQzl zqoP9<;3qO6*^R9)oD>UHh=Uj6{q(~NoL zdVeSGO(Sk}YP=gN?DLi5-R03^yHD7mlp5~?gATT3QDd9=-{K;{4%OBRr;m}D&cWy4 zm@Nr-GH4(S<;yk)%lm>Nrf1^FX1lOq>qau1_2cDqtE)a~}$P1T{oyJJ`KN>`#mU1evdQ#(|^Zp~wCst;|QTh#kbhXZfD`8|w} zzD!!)r7`(R3Mkb~+?Sii(v+|`U&aSN_%rY{H4;!2DvMs#&j!jlePVnNuOD~;Ap$9r z$%tK>?cBK*6eCzFRrmQi1*){2FwbD9I%)$Ng{HgKm%i%7_jZ!KLL{nuy*shkDshI) zo=C;z+8lVYL{t{^=LN^lzWh|Nu-G1RP{v4?EttFL_ruJAeR*w|cgUdPn{^@{!^ z@=o7u3=e($=g{D=Ru;g@qO8+Zz>@gw4Z?ilBz$DWd=?9Kk|8tcG{3v5$X6_B0IqtS zvbIudj7)iHjlJy=xOc+V%Xrr>jdx?EEn}DuPrx7SRL@$*`zx<}4T;DR^tL)H?S@Lg z%H>z6n$`v-L>4Xh+~rv~-q~2ZK)~6MVCEPt$JMHLI6i->PQQA8p z$}exe^&)qT2IVtl)EnTixZw4bv>eB;}HfitI1Drebc9|&!?oJ=G! zI(Yy)cDT{r;w1fVC0kZf@?oh|uGC@^sR}n?b;ftus;r*aa)eg7D&g>XZ*LFc`0Fo< z@T(k?1?)l|FYw^j?TYsP!!wO|u)=*S!Db$R#}lbKSi ziA<8d(rCKN0Q$8}54XRFFTe1o=(~7ciY#6cq+lQb3nP{~ip^V`Xlr($F+izVUoGQS zUaGx#za(z1Gg#}$^!H1zy9@2^D9Bn_Ox2%cm*NFXPM2Y~wIh|CMRP+LevbvIXdZ4? zlL9q*i2{@WGt&8XlR<@iYknF!XrcYwrIyV~b}AD8FDyopPH{6Jc^M26{!MV^^q{M~ z3r4aj;t($ryOHlrPmcY6?EMFrW#@Grh^}*Uj+Jxj?yAliITDFEQ=~|VvZ!Rq*4Sgu zJkOi4#^226NzZXK9$T^`TU26>Ac%|x8ja35SI)U^&hf4NpL?sTK>%#zD&TIg*xgmP zZaDw>|GoBFJK*_e{u=GANgmB^6pV(7#8WBKF2A-bubOfQtDkF)EO^uBE$fv_>n!); zJva67C0X2v#c%>c3rQ5*%_v6ZaC?srZo3tsSR4*-C;6wMl3yifE}!Gt*nvDjwxN=2 zCCSvqO7VfAl!atK%`Jto6i?{6h-Nb~*&>{tAnIG`y-gzNN#0f&7P9d3qocU|!b`Y+ zpo70Jz0&misoHo!2k|%d)9WSwm)DShHG3_q?suI(nq85EavL1hCdAUy+>;i#9Y%uP zEPRyiWWO6VU53}PDcGD`17n_h$D%)-05i&V<&stH_k5vD`Jb|Kn)|#^()WAOihw_W zj+S=b9Y$2EN(|iClcU%0(xJabZ?8ZxGxxi8(|%Vyx?T@Wmv3}!`ylQ28o*jdR-09| zer;o{Oy%&>^m6H|m!kOf-}vY7`h$o@llZ&8{g?3Wk!ms{?tA1e^%w)$hf=P9iHVcw z?6WBOM=##4&|ShbQ3{xy%OjKX^YDBCUESMYvD%Q$XX#MQa68?4z7D}!CY8q2)Cfkd zpF%h?g05a^zhL516)N(8dV`hcE#6dZ_jW$Fe&~L93Hef40Fn_&0-&caFW_^({s-{- zya@Y47H438e@$CZUe-0_M1`UU4blF6k|2u;A*5CBvOz1|eEz+j?S$-TQewSxJS z8BLq^qjz^7*$*o+lDurSz-u=t$C~HAv#AtjCdRNhbP@Jk7zei0^B$3YNCaxDjYcbh zN~!#dzVlUfgNv)#>zjTNH3f!Bm>etP8^8VE!e(<|Zhi?r`N{u@-8=orCWGj|dxw$^ zrPW3ulVjj@9-FsXu(m~uezCdsT(8M#0%JoHHgEbU+S)h4XfY$3&B9@^!s+xV*0L;( zg$cUH$FE^@=nT^7No*c4RvK$bU{-|}hDyOtQO}$D5bgIGz*5sR%LNh&KEUs7GRGyHodvq;roi4k-H^+7j+lprLp zP^x36hvtz>=k@#?Is=p6gU+scy`=-Nnjo!PC4#L+yH(t%-T3=@76;e7&6~gZuD+;V zE`RdkB>HyV1+(OH@_LFhOk|2EyP&BCm8D8=Duun2 z*}OJVl2ZMJ|&;cx46GRu&N>6M|9_{!$cvrxANQ>d9RM>Bx)7 z6f+nan?x~DRO>FS8axDZy`3$pl5uU$TzPF~QT3hxs>yz9`e@y3HIcZi{=0ORpmxuf z6w55D==XR~$ZCpdZmRD_Lvth7DTjPY!%u(oS7`3ge^)E()w%i<2!r|>x*o%hJzv50 zUAKt}$n{PzKwCyClfqPV5zC9q-0MjKbnf@UBD}5~>g%Nij7hcd$d@$C49%dB)7!Pk z+39SoLraUd(w5`ZOjT7U-kAISjjRT+){&WNN$%^`Oy-TWHYNn>U6`A@g4m%Yv{Swl zaAUKlNF3RbFUM3QnWfBg=$UVmRk%*t-&{#O*2ip^d7{Pnf0?8Kp5{By)z^#Xp8l_x zpC2M9N)fP0E`=FRUlDeT2_Bn~PMyzSkZMMsp7UJRTPK}5I);gFU4(~BR+Ows%4kQZ zvkCWoG=rTxTPvmBP;7{ftIU;iH>ZCb4Xbf>)ywKl46CKu)v6+_3zLtrHe>I-P%|`D zUT;7n9ogvQAWkP@sB3H@qqvNEyIx&tD}-R>TRfNNFZN~VQKNQYBssKpTI}UAemYrn*f|R z_5zuSA^5#k9&!bJRE`{CLF)1ar~=)^oMX6a&&zw$Xe|YA#3NxVszW?|$n4Hhx^S}Mi z@UQ>iA0X(m5tNgSber+f2M(aEw?!33s2*wMH4+o5juSY0ZUoPL_b{4s;)HVum~BWl zH)HdT0X+V~B_wio#n`K)dOG4}K6fuccP5=B@Xu57O2gr>!(q3RIfjy#R*NTUsT6BW zA1T$`E=@rr$QD)@SY1@3lQwPfLpth5qVr0wd*Q_&!{uLs-E2`KYqV0OI+LpxikI;8 z&rTp2vg6nP@fY#0{_r27&SOH743*~f;g0*Zqov!f!*6N(Q7%{5sESqYpL6F&F#POw z?svY1mPWv0M540}+XlAb)UgR<@?NrRmHlok!Q&!WZw``CEvkU8kkbhMz_r(O!l9&3 zd01t#HrRfz0jzao8%u`zaM?zaZw*TJF*3?5BH(eT?-UIsHD1SIOJMZ+C5$rS-PA|N zDGfm7=fx5V(hZ$V#tT0=4(sV@)RApE_LqN(?Njq)Knj?%GQ$1FCsZ$^%hzTYIs0HW zljU-{^axZ{FcsBcSjh_-8wuefU;7GtJn)UAH4@PbR)(*l!1vX?^$vXTOTWtq*`o5a zGT9skhcDvd#gnM3tApRy1e?W$<R$ai18ii7TEpNuR|Mt5`UK~Tw z;lgu&`F~^69M_!;$-Je69l!l67+hLGj)1r^=qHO|gVQDrN%fhLdH!iM6_8ICaAtTM zAOF4Igssxdc6m95)XXd#1`FIf?!;}M{VkZydPB)H8MX1tr}5O)tMCWv;PceM;xS@e zB*>W+AibiJ=X+WM==57E`9j9py04nP_Oi#VCRul*8bhO|21>)u(hBCMCNVL6277k+ zxDN|zy$am#MT7J`E8wZWc@crpC=3oCUj7gN7Ww3XKhqQ1(~IAIETfhlscqrl!=;J{fg#qrkrr(g>REZ2=S3kNHTJK>Dj9oyf}k0 znWH?}tboCREdx7{62MgNMq)<~(qt`ShAg^w?83PAEB9(?TA9_6cYmT<0=`$VW|7Ypc<`$OJd^fk( zjsBK^l3e=RgZSaket=fH!{deGFzxoIYSp!n>3=Y3=3i+97ERWB^>}-SGPBt_z zvSk4!24?#Y-jCaFdq5xazPjHJs{Jm5k<#f5e)i)(hR2hs^y=7H`@QDT*O5tIpxUII z^=YLIG{#7!JCl{TaxH={fAyck!f5jR*&~>qegb_R0UlIVq;uCu^Sc!VfBDiF4(xpZ z58UO#55DtV*gSsR{op}-GlA~EwS8(suPnq`tpm6S~YCyX~7WL5^XAi zrdSI0Xc(>#f!e7P*#6)hC?^xReC{kRU%iZjx8DK3H&8ig^$yZ9G`5r%mL-P(-^;l( z7bs5>^hyhevH|a9PiKGKR=7N^ubB%}Dr8YyxV8!s-b<6dVpryuuvl=Tqh|nKkB?ID zRn)tRs?2_IX$hl~ONfyH8XcQN|GtA<8#C%#>M=Ss!E5fo2-p4i;nR5Wi5GD0l~ZVH zXhv6iC+6c3ERhupc6Xp|*8uEX&(Yx@z+~w}UvoXK4~@Z9*Nw@Uag2_R;`qxa;B=bN z)769vKRtxI%hZetA36e&CJ4~+NYp#1fm%_sID|qisQ@MAOGnDr% zJ!tRjgPRQ0#q+25=L*j(8zP|yCdcOB^>^dy<#BxU;m^ZDcBrl?fT{T@O2>9gTp7mU zS5DyY)6Ww;okDYa8+sZ#uoMX+w7i1${!Q=<^di{XfzgpC$t05*>+o@pr_fN>i>aw; zOpJ~((0Tz4^)B?ZHR1Y?4#PMfM{6Plb9f0(24-h2U%=i6ZbxK#79)dKaq-GUJo?B- zVI}(|>t3pqvF37IcQTx^-y7>1apLH4o=+w<gHb$dSu`((6B9f6N{Jr1&Z(ueXQ6#Hz;pz`@?>#*@b9x3Z{OCN|my@tO8pQaE z=kblN{=RZiBZGtJ?Ig4D7vF(-Ig6~ZtOmAfWWfI7|M&l3|L)yzS!`r9O4xnxooH+8 z#Is~71l-tdL1Z(MP+iZ%mlEL2d7K*zVe7zNl(Gd}n_9*rfB0K?=KuQ7JR8lb)0SB? z!W@cX{@P{Sd-p+vA`58kpc6QM4t)d&(%VNmOiL5XqsLyx@P%i|idp&jl4$9a77$LA z#Jm0nX1o_hNhYUZWW|bK{k3nvXfl(*SVlf{9<7~w@spQN<6A#CgtkNheGlx#mE&je z$QQqaTsnmjG8C+J6Z?Wa?wi1XrrOX)z?zsoWsx*CaWCN1lHc@#)KOI_xkO)3|#;2UlfP z{Z^?i!-v@T`6Y+VV%Uz){K{{r_8ig3GG>!wE$ZYQ2A3!oai1Cr*m>Q4auG{b9IWmck=2qPEJHLvPfBIeI$TFKtm2o<=vxv`3 z;$g0PUdy1ltqT{= zT2w{T#ix&RVs+1&8xN$dv=&$Fv$VyR82|^Wqq{N zFX>tN;V_M$x|BgEt09$0!(h(i#EH{LCJmU0$8hx8C^jA3g3_V0!1Jfk?sa34EJBFP z)c$?@(7$ynaw{>M{@W)MYRPiV4MhW4s}=m$zxftE_r=fCq3Ts!c9#`y0$Ye`Mrjjao{n)YNFqy0fg@kR+qjUFmWR6@!{`s?LA`3W4sXm=aWB>mB=-;*# z$>j*n{rC_p1VKfq3T8kyH#v>}@^^nrw(Frv#i+>h7Py^O^lttwoIZ0Nm(EVXU@KvK zB8-<`zKCD_@>g)r{r6(W&LkGdkPi%Op=>z=4?(z<47tT*;u&hd@X{Q*$%v`_zJDKn z_>=EoF?^B%Re>yZ0mVWNexC)~2lPSKrLtSiJv3B%qM??9RkOEbwY-A$Y8xe&*1$v3 z$EYuxnTN~agM}>5ZTs)RmcB0h^*8^F5@9QyV=GpA(}?C5kTaW<3~<|Rw<%`I?Q-Mu zU;7Hq9XW-mkuj9XUWwdkv$=8k$`u?rbA}9p8EGEsl4G7X5_q}{aM#&UpK6CYz=$?G zg$M3+u$4@(IE~o1e;c0t(N8dO{-TkRC zwx(3|8Gl<<9EoQy8MIZuYFN$LFx0>mB)z@J^)?__rW|9i^BP-m&)p9pw6!1K{;&T5 z1yc|KX8^P9A%x2rqzIBCxioeY^h(Knfb0H+-}oxd9X*NA>>`Sk_dtMcbNX@i#W#P07C7&1ORF*pFsHfIMQSv z?H+<-K1YsAIygRs`am7mJdHBFX9I!L-EAJqnK={;&Q*GAlJ z|9VqEmoDMwkt?y#)`XIu*PaI@DWokqrn^iKlJJ5)1BBMq-8O_}9 zZ5h@7PT%ilmEbHO-05oA+V&0Y;NPA54cGup3sesk0M%H*Zzajf@w}7mI2@^JApz`ft7mcbdS=pf`U81APyZ8TI89Y+6$y&A_8-8G+kEgfc=4o`M`N8C?Mq*fADoxbsC`Kl{N}iyG`Yu#KLi0x;BiLUOJ4qsScbvdKuHB zE0|iGL1#;g5^58%2zG4WPR4`aEu4bQ>qMna4R(i4-UL^yTR8C&CZ&#(``-gZAWzk4pPqU(-K7#Lk_m3#! z8M%(qsMUjmw><>2%K}%h2|p>u(cbMrPg^_sTRO-htBxwj=5u7bOnBh8ze1+T1HX+d zqtyxoqbHU6gIyFj*`}M`LP^SxZABCT8X^bm2N?^W(^6b8t}Fx&MK?kWVLY=GsLpoVkMV z_n(K0fGol5BFf!LcO!QF`e(>UWYN~vijmQA{O&*bpYVI1{Q}~L55rZ+B24DPOxe$F zlK#(SEaYr3Qvz!5ZiC-z$F*x$@%z8~JGgl9Fm~=Y!DZ7F!?HRmZEY8vT7S_srm2&o ztI>^?W}gBx;viGeIR2Nv{3|qe^incTBT`7i=L%vgnJo*M1<9+DF-Ic#wKg?jVtyLO zkDZbkz^WyNo2_uj>OAc?bsml3`)jFos9ra}=b1jaT7g$tYJvHQy(M}e|aePbgA zDI5OUAO83F!!P~{A}<_*laCFNnzRsx+05dGO$gDuTeogPYex@kb{B#5B!2hzzKW+$ zp1^1B*aJId#2b^6Zg^6?*?;+_?|qm}-|r=~HapRx26W3et(aR}!p|Q6D>O7WBat>E zMeti{vS8DeK3Kg@f+{mXbA(Kl8_r-o0uC<*FG;(O5;B=A0?qZfi)^Hf$$91MNu(}~ zfS4IJu4RfK&Q1ihyc9#_%YAxnpw(-`qeix8`HPcG82 z7O=B_2cG%q(>Qbdw5rle7qdtvWAOXkWH4r6s1IN$GK1ZGP6-U83w&x~28+`(xb5Hp zT)ui0vt+uKr$adZ5}(Hw zwH@^C|HcFmMYqtUX?^vHg9SuKhUvRTb2 z#^R_8II$FoQO-*utGRjI88F%@uM-4i$aEgqxew3&_$iEBAE`8-&8v#oL?VW0Bm!dt z_xtD^wi=`bOj(V+Y7UY42(CQ-BzhgP?hY)N$(Hgp9RzMo z1kG^(W}K? z>$Bm;Ia^C|f0b3Ef3CmuK$FIkiFg7tysle&yD@(F3Vv{P79Ot~`BDK>wjA!d?;hND z$L*?3!tej1KfwR{pZ*i-8=By+_al|a;q=+d@EV-32OP*y`j!4hJ9ln_$3t0(_s?u} z3A=XeAWIg-*$Y(5txz)O=XiuWF0>rfltgw^{TCzR8%hXt<8s?$}S@a}3|36lydC=I%J z@A!j0%tuzRckf;-kuf`Q@*G+Smb*WFAL6kDG7B?kGUgB(%)wta;WG7IZ+|b&U%Z6# z=dPlY>weoE2Y4S`#-k73hbyBo%FUh+)PAo4taW5HiE#az^ugN5YhyH)=(F;eBh|kv zlEcE|hcQ6sYM!1&p3H#^dbJXC0|Zca-gg@cE?qi}QfdsF z|K6wgm<(PydYLhH87H264pTELjEq5fA_JGxM;SAPELkq;P;OXFaK2${gV>rMzS(qe zRpEOq!UkBeaA63$!%58i^eOaZ;&4pIke@LiOvcjv;7&vnQT*ibpJ4|<(q=lrJMX@e z?B*gS7oUd9@*u1PRFcz`PNuj%E_C&8#=-mVR6UC<1n-NdR#au$%JMSm2(%x5Xg@ys z$w#1(`Mq%A7^S9ZZ27HEktK`ash3Vtru5;^u``&STUPS)UIKNe%cYo$L_Aen)VFCS zsZk*7ynJ>LJCkXIo<4@{!fcLDP^dK`Y^7{>*H+A|%;SeY{vmd3-+?WZZ1>&18z$Qd zX6FyVXL}enmsjOtmWu_rT@JKuAHe?mZddzVWX7d)VWd-ORl(Ta+K5LVb>WduKFkA0 z!?`nuU@j-n_d5?GozCL<7f-9PSWh21hMBn#9BzlIc($1BDz7d<3A?-|;qHU5-)jJC z9hq^1$xt6AGa5JcRw42` zs==cqs+$o+fBWajWLV*J2I+XqFq<^h4=0|^sNOZ2(V!aTO2X>*zyE!*VqV;T@7s@PyKqEsxc z&BUmsUj0(j2l7_a)eMw>ec=S$lzq%;sW;>bNTNB{Kf`Ojw`%|fvKkJ*9mh|creiL{ zLjY7NI^nW;u@W-C;qa=&bNWqHp%{%P)eK&Feqq6uLm~X&d*4SxV{d>u%7SYw+3Nt0GLN0?)IEs9sSQ(d7Le1Wql`UMC zR0JJ~BJ8}5PO?$uqKum|!bCPH-sHrA-T_%m*sV4OJI7#@IffP|*WLpUnW*Ju{+=rU z%^ZW(Y*GW*BMf}>v4@&Uke^>zz<0m*Jv28psr`QS+BH?=AeD&w_dKFxKABZ0!-M3krBPKb7AXfwGQH%lt;!dgK~Kl#K`$dv zjHW!cZtFs4cNbrl6svxsCG872I~$ZmvTb&HQ&Fxd1Pvp-Yova9Aig znk-}_Qp({bQgK|md=+)|4Fp&9WF0e*l`zsF3#8Jk{mRNA>xBxMs&Ledc}k3%v1wBe zS*IJl4MO-=?X+UkCn1)1Ts@4fpVoLu(=*Gno9 zn<)#PK6@6scJ4qb8AW4r0~VJkC)%uJmqT2$G8t<-7M2#dRz<|4VO-*Vmrnon4MC)M zKM07f?oEBnQDp;{4XVw8(ZsXIoX5WX{pcU)Q7pFXcag8>=jQY?qSA-ugR_iu6KSo>HFP>Od;ZG=zOt+(C&TA*@8nLej{h4rG(j#t1b` z*(XjK--Wq_S>B^bxE*FRHa0-&eI}-+@ci>HAr@Z2*8YA31AZRHCNf+lN=kWExFJl0 zh~Gn3j=<+@Cje_#V~N%6&O2fN-}qmG@dSTL)W8F@MT>774M_*5w5$x3&CKs-kG2G zoIx|GVb3K>PZkr`T{WHc(&^@qtCaQE7WJ)~hBL2>qA^)kW2TB+S50ADGM8M>LK_+B z{;i0tgz0WfiY1o*c`}JAMwxDTF~+qqVR3nmdpQTU+lGevdZaSKFoy8VvoEULE@{o+ zcGwk=l6@;+Nz-)pRPM5C7oTUKwhjJ3o$Aw8lo*vi&*cP+ksY^^O(P}RSlII0a)x#gtJMsx3`nFw;>jaqsd`KXe9!# z&xb6f1e=qQZ9I;-`2~K>sT_+dmk04r{>eWENh?YXWW$VR717QuEa4R8#H&0ZM~6oc zud72{T>y5wb(OV}1GgwSTiVYE#CDMt=~78T!i1QqWfY}LcOj!XyBEoL6^mKLYIrO* z9{I< zlAp6&_r>L9%r7pGmB>)uHQ^8c;qR$+*C^RqOjgxvX>NG|$4;C=I-9`7OBZ-Qb)Y^N zQ1_HbM}nQ@zRU414&zf;n!lZraGR9l!eX(CPp1@^r!1ILxjY5cFNvU!>z=6rtha2k z*94}_FJ#cjfXCu?BTnhHt+j=K#*F#dCEf$=2raF^?r@^O{br*qAB)AX#C4BEB1k6F zl=&?9Z~w`E!*$52d@EUZBSH8)_xqt2UqUI9!sUw>$!xb1fKf_zIaKbYRvC4Z;lg`t zKgG&Y7JN*wl=j+ji3tdSR#3H#l@1m#z=OHXl`ekYot7%js0|oKW^I z9?mJ!_pPn1s*K)bGhl3D9{>CQ^{*M3w&I`vvwwmnI@OOpavwJLw&A50kHJPyJT^Mc zpEseYsY&Hj$d^WmDpCA6tR|lVR3(+jQC2`InM~lZ#~vXlGbmtp_1ZAfaY~UZF@!_X z8p5_(8CSDgvy!H}C`m>)*1K`{?%NRXd(^t0K6etK@o}Uhd3c;|gt+b=j~f#cQ>uZa z*XLCdU{_bWVjm5>??;Ab@xT4={|0?q`td*fcYlbwhB`dp;6uw2 zRom=(Fk1syHG4;`)}>+n+D2U)VSOYh%;buUSPd}naC6#Ss+Wz|>*IkbBP+_3=?ZF0 z&fKDOQy*86X(E|am4f{P{g|DZSIpAv^b{^$8^<9!)!+E?=P|IQPxagB+tdxG%Y)~i zJ%YyOW~@*;nj;G$)t8#4kFy!rc1ML#D`9SS9xE#|usfx}WiPIiA@c|8;9@l0-rSDH zJps(lHeqJrIK2LLym~}NZL7S#$$HB*E|4wCkR=Kl;}mET1j+SE`fcQz$D(P>Wg@&U zGQ7TSOwqYb%}$}MtqpO4T$js<&71njN{%X)X?ki7XD*N6<3j*kfDBaUzPCBle)oC(YQKk8l6o^y zzaJyxqhzV)RS+fpu9_N~(9_$C$?++&OgT(VP2%jO5uCj;jNkq07hwzd)IjMSyS5UX z1##%mQ8e&(rWusYEi5QtEi9!#q^&#e(V1ty_SDoA0d)vY0{N!;Zk#!B9<5w=lfjHF zn>G`id2#is38B~wnjHZ(`|zfZhK*@8fVGZnqcyYqFxf_08&#e!#W(~$SFg?D#EDTl zw;;au)vu7Ycax1Pks+Yd<)7QP@5J@%6YBSt>C`62#(3cMse!z5;5wZyjE;`MYO#|| zimI_1X6ie!ND`wwoCo?lFgLe?=MTMt0|)lv)1P@%jXpVc>;!z297S>%92`_th0O$B zk^>YDM-=G#&2Rjss$9zQuz&vf=h55Qq)yUe$)NzP42hkZg_Oam#;H})YE;%6n#_zp zb?y?LJb4|7oC*KySN>ZCo>7wF&5M-hOxPm>m!I0PeQ z<4H1F;^?xOyvotC5Ckno6MXy_8d|*=pIX2xM^57Q+xFoLpMH$MY6;K1@Dc)KHAA5g z*L_H}bZDnMCDnur1YcIlzJKuhzsL7b<~Iu2Ff}*LAjpZ4k!c(|c@Fp8b0IL3&eqR8;{X4%U*o*9CitGLY+FOF^^@_y;8SXNrYCo1@<0@}#Z7%Xg z-tRSlwT^6~jAQvQ+D2NN)%*p`grkSY85J%gPN4JG-+Y3HT7Ytp6+3tCL6D3?HX|j} z4propPG+&GZxatn8^(CZinDV%rNS&jXFH8_CPwC=Ny!T03}Jgd`~Qj0-%h`HFXEK@5;5LeWWKInNHz%{@g_j z4Gp2Ov60}bQ?==q1nLx};)2{lKA$wzJt$w?sJr=T!@sTC}u6t-G@ZAwf%7` zR*-?;lxiF{3p_5rVhuYxyT}+VJhX zP;z2jeUOag3bd7&>RIHWbT~3LjZy)M)s*6e(`T+JNy^UG>+b0!pf2Iu$*a%^rh2*t z)OtJYZn7YY$YmqE?=);3*i4|VPX~xb;`q*YzKdTa!zwPdNV$3`T~tj<%e8(Dw`|f! z%t_E}DNy#;Op5t!@9aS&Hiu`Pd6qjUkG*^LQ7YEu+g!Fp@D<>?nbE@i8jHsi2$J?I zO-+pqkXHDp7+eHh9;coAeU@Nc@+qwfpi3wIVxdUzWG6uHMlM&xvE%2t)*8AxER-Ub z2;v5}Bl^`$oA@RN5Bv%GQYa1V))Bx5x zvRbgVer;o|js9jA=To@%&d1P85F_&irFv^@Y(zEwlQAg4I-defUY}njo7${a6mxl1 zE?p|!ON>$SE&@iRIIcyo&iqC)UBe*u$#RGX6hhIL7IOWFu2lo;rX*hc16q*{^ zRr`fZHci=a1p@>9s^fQ0cN;7sJxz^KS{#5`+D%IWJPe8*} zZRXk)ea587jZNPXgnm~QHUw^6MIu-1`D6`{#glL*(N<@3c2)T%+B))k9p(B0lhna_$uGLD|! zKG)VW7y9eMSi)Ahw@cE85eBq0aLA8|RJuJPog#EDcKzF(Ah(wlE#iI1ZQd|@dcVWgP z8(TW$i@X5!eKKxjUL?UfnM}g(_wn&2EhQ;$y$J$+VFfUV|sZ#DrdMMnM0u`IUq z^^!rdBbHgj-o3kdjZ3P3mE_SaE-&KX!P}wnewKC&W~&L2Xh`MHOj8;~68kxgA_udPqC!uoj>`tRv_t}LkW+?^RWgHS^ zU0HW4*Sou?UG4V+`*&jh{_O~oaWryo|7LfG-Z=KA{Z7DU4JsCDd1YQnz^Z$HS#KM9 z{_J@bbV=I}GZCNajmP`JYBj6Y9#U8#Ihw_yk@ty_4ArZ=7E&RPH0BGkC8MIl&wma=GSef6>Iz zX=)5fk=N7X_EFmPAeD+!hV`nsZ+>r3Rf%1^a#@Wrk{mmgXO~IRp>~n698fJuWF3TA z5*b-KuM0Sm^-|Zok{e}^77mr}>?LVprCQe-V1-HjDULH(r?0y(WZ7J%(u~rm#-a$| z%aJW9mh!4qhvbAw^`U_Mp}A%J%?oF-sl|`Z1~&qAbp+XDHA=kQhgu6^uhf3$Ue_x7 zy_3Q>oKdy5Ad{>eX7yK9`~z>2s#3CZqBiS-o?=+z;IQ7BW{J z{{GzDg6f-f^rZ>@ejS2AjqlsZv)8C3$&HvGPy<*stJ$sC02D#%zJ|yJDX$)U0f8#b=lGJS!QYBL{nHE5BM=$-bp2 zd1M%&FX8azX*ir^G`E|`bTmTVj{Y9XA3DdYRl3MZ&ntaMuKc^eYn4TY4y}QVkcS8; z9F9`f3)5No$SjPhia@W&g9q=wU$KQE6&YlW8-10 zoE}B9$BKdWfNJYtGE|@8!^~q=_q##mER`jXlEBz+3cyEj93dmQytGUvIEdkqF|tKA z_!*@<_Q)e#UZ(CH{S2kJI`#g>cG5Q-S5Rp zw|D5}t^(8z`e-CMui9E=zo!%kTU?mKm5a+{+OlZtbfU37r~*BGzn6ZYb<29R8o*jd zR+9+VuNBwf+Gs+Xmn+PHI=EyYg#p=&rrI#fFNWdqMAeKjk>BJvwV16~DXpNtf0Nz} zvcf>fv@n%>r9YecPPy{mFXW$<4L6OnSpBy8-pz65+7fF`A4aG5M5+K*apKj3yNt^G zva&7-8Oe0W=pFe|$7W#b`wJHxmG5;zbiia$svej3$Eu(Rz1$-Ax%P z&sAM7HNd-60aL5ReAUkU)vo%6HSnf#N32N`jp@ZXEUYZ4gm+nU$-9hd5mi(m`A`*zT-om>HL}XEx*~6OziY1oIb}8Pa`pXI z_IpXEJ@ub!m613VwO8Nos5GTDlW7mAFZq>C-Q5U9A`Ar0xP0Y2u3nS|#tw9J1<8); z!QiV+u=;x1?lpk5j!X{1nypVWuRDoQ2UgM}S@IubCfv+antw|2umkx*nH2kgDvg(Z zGy%U)b#7id_WwtpiD!QzmpvKBys;p26rIr{eOA7`A z4|R#2tH-qtmUKX+s={tcrO^k$R*ytO9QpGW@@mi9GoM*rxW%a^{iX7}3{F>7 zxZyA*c7BDzl;8^tMjBOd!P@<9sO+vcv)?6OO4ePNF=?;h@p$lB`(2o+QU!DCYkp(D z>p-ir-wowgeNx3^s{Jn2%aW(JZ{I=mZ{EqXCXNfIk097&KyP=WN`Y9<1xPiIzK%@j z@>&|!`ZTG!d4HRYmR0VGIsz#NsJ-EFY;4(X+=FYN{8Ok+)V$h@nFxW3MJ*VjaD_k&`eM#O$i+?hXSr3yS{0tVO&KgMm44tvZ<0ANVso8(xfNhlO z$_l2Hm4j6-udELSu6A6fzym#}OJ+mrU$T}tf~t5ThO5`FsoxdA8?jmy8yZ@$t1&3D zPei6HN>M{ea!c*1W4}xVaPqxK-!;j#GMOukmb8_qIOK8>m3el$X{-9Nj`tME_POEK z+-Pik5GP)F1(VOcjK}V~12zjk(>pYq6V$vk>SqcKd4k*!EtVYmC>b~K@>&Z$OS zNK&%6CTSkI`gSGn!Jw%r_HuwK>5Z<@>2NBB0SYt~$bO{MaNi7R5E-~D%!6u?K*ySw z5`G?VW>WP|q8DirDmgrX#(He+>mp0yR^Nkqego2}6akbA`c>0gEC@KuF^W#a6Nu44 zOQquc_&64pLh#TDNJ6``XOKi@hs&lUBB!1Iw%W+Rq}6*88PHpamS3F(BJCtfMI&B$ zX$*Vss8h{U4I7-%FjNBm0-e?DQXH2CCoz}Gz+fdfb=0AClMDM>niY7`Dmf|Q^zs(LbfYi$RbI$OOl=Aae`rk`fauDC24j=lMe27f_1x{ zY=z5>U|SRRY}>BdDoCDZ$MG3B6T{L;0Hmtb|+l_Sp) z@JarciI0^$K=~5zZRYdFq6xBO8P#7)lC|~xEmU&PbXIK7-h()I;S#?8+$;FZ1Gm8? zJ)Yh+rJ+k*lKXdhcn-$4UD)~2PpKf{y)s#^B7w^CQUo&-GTO$vrTd;GWPZgjDP|{Qml~FY&wL2Z^O~~5Ix=SD?EV-~<@f5!jag1KS zP6jHg&V~@>Yxz?GEU(9*dZIabPnZeHB9Vj&09_s%+%9J&XRDfkpx^0x_w2{%vsN5^ zc^Z2U*7NKja9fA_y#}z>k<|u0uU~tA*(;5#5pd?r5b|jcC7C9&RV`?0lCJDd7{zl+ z61luj0q8f9-G@7 zs*|^kfW~C0+&`3jB^f$TNzPo6V@g#vRls`1yK9E3u%m-)bA^qxOJ$i=V<15JxY4KH z=l&g(c2#LVL3f^jK9N*%XDpGxCEjy(f`6U8EUEjuNDx>o=q)^S*3+!_L=%>T0ASay z-8gr?fS1l($78o|zr_%BRi}Op)3BUK;lyYP4}9kDqk+Ie_P;Q<9PUW3y`hGW*jH^MQR@T=@D)uBTV0mRpt-pX2Gxu1M%(L{v ztE=7yV^R`ewUtU zCIX}CK9l=EZV98=pz=Lkl%iY8b?V+og`%(nlc|f*Ga?5N(57r(@Lh3j?DociZWcav93-v z7M15n6SREi+Yu}-F5>vhXLtznFr$-|e>>ee6D8%=c}hg{luBfvZ+m+iBC#lz!(sUR zUd1v!{J?!{-qel5er>gv>Ksncw6Gi^&3{rI!cEOB1PlRHA}&eUxnhO~s0F>f9k8g% zGow0`7Z&Epf+WeLPb5qZ3cg>XH*Swn+l=kB^*1#^S-wzIL>C zwDJNL*NhA*R`O|XWKUIdouvEv#fz7bn4U*uY5}tg3uyB09jmU=*n3|nc0Hdj)0W0}5>YMl{nThS4o6){? z6IxmuZ(?~@ix?CiR#wFqB?5zm#U&&c!Q_Ds zqg8jNOMLtiKT8ZzbuUUuzllIy@pYP>W^c2Y(A?6A$n>}#2;CBsp#!XPh3(R+3<>{C zr3-j*IF2v<=6^#5#j(1l-mCkGsvJ%por2%jhtBR6u6w%<5=Q8v7#Wpqy+ zCB`~6N=f9)0{6SkX2O<%9vPVdq0eM)rF4Q9@a&xqOy17BliY6{9>seVa#jSE)IpCSuY$YFGJSS8s{j7=g~YJkCP zL?XIEslbPa?zs-k9_j&byJCTEy(dA?4q+EG5~@65<4N3+7Qc2)fd| zz%!Fm7#^KQucr>LoWF*pR20`uXW*e^_?!Rq8!87(tjc7e`Y*oc0^i@c)2H!+Z+;tY zGLiF3ymuTfZ1OQ+$h(kOAW*kEab(+8UM2*+3b(xv5Fbyc9q$tp;9AK8X{v znoDR8IP^jZ4Zn26PHC0p14!^G>B?->;3HVOI?&BO^tE^YwaUU1Rn689Es`pe2&xs`lXflg5naMFwn^6_L$QMsI13^;=Zr+DNyd^Vn1ncW@_dO5e+{H7BH46m&ysb-UZfsCr zGLSw^*4-w}NpWMpt9zf1Gg~Mv`zradH3q9@Z)CMugzMLghWCfPQVG8@ORlGlOizP; z*jB!Ob56LPr*P@gB_*2}c!Krzbl~FoOXwfihMhaMsx}TH>1fqD`zqVT)3t9?H+p(I zDMOyawQJLgu@kyqq=tG*3DTEF4sDT~q}PsAB1*1Tdt0+=D%jWCLjY&d<;h>-jjmt2 z#@FhBQKRHzw<}P$WA_dv1GKldD3IiGTh+n7I5)2b1shGe94PPKtyncw%Dc-twV>%8 z;xAn}LqOry5B&|CgC#7LH2mDOne0%VkINWBD3C)kzt0e2SW-96T*U$g< zyEuIKC>$jV7RZ$3DIs|XlE)(p$dZVZ94%p7dU|@OC>k*}Hjb|D&Wbc&QeEeLYRGs6 zx>X7QI7FfqQY8VxV=`J`gAf%jX6?2@#0Dde-NL9Mj^aM_ODY$Qd$AGMH7O-G;`- zS4G1*-6KPI4;t{LkC|(mcZf37tY})WH-L?)z4x7o*jxc5y`Kyz7d0iLkKq4 zLpj>=jq-jST$OoX7YN4kxOnLm_?z+sXkI;`9~; zegG_>u{nqfXRo8HvmZ7`C77!0^Xk4&Wzv-0X3@a?AuQjLwCW%` z`N>Z{29L|7D*0s0)k-9S#>#$Qd3 z4}R-w1cZ9dXMoI>)8@n^?_VjPdCmQz3%rKz*xEZ$pQ)B_S0hK4H1xK)F*Y%SZ~fqLJb3?oWW~DB+1;vKs6@{4 z3x={jPNM|;(h4qpKAFb%rRi*!>_1eag9f5UO#l<}&Wv+lLolJc6ya-v+P8yDDqx zW&D!lZ6^D;N&P)aXDZczA9>&b#R?2wAEY!hLw2zb`*-cd#j!AqW-FPfpaNLBbJQ!d z#7uSz?*8OM(1H%+!U^o%w-51h4g*`ZsN`tLK@^FyKxQM6iYwVCNI>s#x-c19Qq3>d z-c!P?$zWhJ*{^+E$K5-3Q(}@TP<>32Q3^BoK4gSWHyKnZbDSYi8yy?NJ-6M4i)5uF z=rk%p&#+nrE8sE~PviXg3rNMnxOZnS+8h0P)68=Db?-s-X^H5TqcK?Od$9N5U90C;MWf`)a9(s`L zZq#M^`MCv*jEs?~+NM{d{=%#1pIfgo)%UxHV9xFE;L5cj{OF12@ad0#6x(`R)GSK5 z9x8`R6;zaN5K6bO--R91yE5p%CF61a?f?BBF*-4a&V~TC{Nq1R&pSOijV-*FhY75! z4by}Wl@=kQ?nqu`ESggDEW?pSvU~vqC<~X%Qti4vp-c^6ts~pe5qHhr9jnM-PNy0B zZtK7+#~!Byv=!U8?cyOT{f^2?4uopH09BPUGCqzy1N~~SsyNZBgV!-MIE=gQyqk$vl%Zu|11oaDE8h~ z50^t2jGU?@{2-V>i#p13pSsV7#}6Nduel4Gw{GV(ELOT$;YQ{)FaNb`*YVhc52;S= zFCBh`^6Cukzw0hEv^3-5@l#k%$E7J1!BLWqFTc7bRlZ3;SyOjAKHK>vm1iSPSGr}V zQ)x=g7qMkaHvyGb8g0Sj_M@dSpg@Z-VSxq$oYlz!x}83G63y*xWXIab#&lwt@>_k- zv)Vmgs@$HZY}nY?fF0X5E5|J|XFL|e=;)YUR6_QuC~Zb4jnB`|sg@vR%9F?V`C8mY zeCF=0a5$_gjb18FtCI-Un(9(t2}YKp2@K9>arYM=dEKDN_^rX=`s z`PR~tOu~9`fBmoj=fA@fFP+2S*cATi-~9{K;-QRNEgsN8Rh2AI06HtfzNM3gKKxmv zz%PICQ#f|)6dr!?UiJ8JD5Th`aCk-ijtFmh9=c;Ure^1nCzz6C{K<)F7%gSx zm^JCuBMnaZryRJ2QksAug-u&2E!1}@7DjcCuH>i*@GKeh_61sb*wfFUbNdbg7m-j*>T$-3lp+q-Qq*vgV5+C5mp{p)UNwL;V4$-X)5bF@ zS=i^$b5>-SZ?OX4s}irFP|`75RSqXu{gc1^9{#sK{w5xKEn3HH|Hb18V5*!q&y#Y zZfp)wb1OdbrC*2BBf^}DYaE)#PHA$;TsRE4n2-@aF|M&*j6c=LY8 zYwq_F*|U}9WtB&ztb)r*CB2$d=OTfB@_S#y_@j4YDHK*~*xKBz8W&5#z)E--X#zdj z?}4zhtvMm@g- z1fWz4Ddi{#^5~fLaa1~gityW7YR_gT0)41*6 zZRjLxB_nR+cbra#l7B8s?)6B}MB!y@2_J zdCE~y^}d3XRPA=>ds<1ny5D)vcXR{^tV)!8k5dk}P&VIBFxsFbSgXUL@*-tlN7D)9 z3V95)b>bx1L+KY*R-=nC)<)z5mBYk?Z}a9Rbat08di^ZUUU-Fvj+@_i zqfTbc6%1rNrYX;~t7KP~!=XyLNeNQb~h#dQz;CCV7iD zGz2LF#o_m@%_)L%2oGVoOaM{F5&?qrD-zSlN?p8m z1@U}ZHEmp`^s~9Y7nO9oH#CiF@X*}{l-%6a-Jw@^2}`KuZ~St(Dl%#cAl-BKT?*&g zN><)$Cg`2zH3I&kqGn1JVAjj$`=9>lZ^G?1Q#L9n*-O^FEID3euv&voeBz!Rs*pjz zkjnhw`zfqyqgCGOmwgDzOlcE-mEcN1d$FY7i$9~?da&+hWFC+f$j$G4Fk4qZ&5wEE?<9zV1yvCU?=eN!|iutWMm2p zp*if>x&z60Tvh9doGz7y7PAqz2C<-WBYV5ZigOL5*X*0w@A~K+jiA5bMj8UIwX|4K z``z!qX{n^iv6!rZkuN3_Bcxr1FKEQholV^D5>#2#{UYrk^om7&6n(jx^j>A`*C|U~ z16b?G-v4ndHG6$qA8WHV$3^~TwNU=q(V(h;!r=tz`9;jlPGNG$jBkA7@2TE31^!G} zEdgbhFI~a*?OSnc6Or}T^11A!KJ0Jl3W!4!W~F-I%AWx`gvp7J@G`IYJIW!O^kiz8 z)?y-~B~n?5jF&#pw+f_gBHKdzBJssyPMai3v-lN z=B1(R;sVak&EYq{@pZ^-@**9UNzsi4?AWyn(-*E|GP;a`#i;7yFA~x(^Giiu`5@Vn zFMfjHL=8MQtjf>g>dF;qTJ<3ln57oRKwhz^BN~VgqqyxEfkU-#O-$9u>~5SY(r$$*v=@REG8f`H*y?RTwmuc>NUtqSZb*JmB> z_Zq-jNA`a8TB_MExAiLDR);l9bzQK|g?f>OHd%1#$~fj0mle2?Bf7o4m4|X3{hK%4 zBDi|@Os=I29)5jONgIs3&1zPij7ZV6TRHHxSN+RSiF)4(G+f{4Oz#IpheJTp+)#&R z%6@wX3^;UV2s3l@=xl9JJ+9 zmT+^*Uln9k??w5asgiK6UcbULDS3KL&Q!GuO{=^Ko#B+KGczLLC_$nHZ`_Z+`o{HM zS+8d@DyU3(^3b7|@P%LbHN`|f+;C)wVhA9cU}k8$P5PgHAyGPx@09p$u|D7*6g zIMiT2zLE*+A-hMbvV~;&>Ki?1Y6zgb#e&o4hLOzXRi&xS4wNRTB?84A45mu&bAKo+ z<-SlT_xcYIR=!YDk4vS}WaaF*HG8f7UV4k$_TAa>vwGo zr78fFABeHag z($LglsQ`s?`NlE0CLu;S_VO=^8D;I(vqyA?U)FQFq=BO3VM}`UIv%f}RU|VdBUS!= zaBBxnoIZ|@)<@}Bt$Mx_e->#;&=HJa0Gm6#j|8Mjf+KsO4)hn?&^KA|N zCHGVD#=ll&TlIM8a<0c#k%<*^SyXb8o<6&mp%{a&s>-_2VZapdTW_|#*cKqixd*X+@OuGRLw?{~?|tIGecWh&Q9stsi> zC7DK#!@OGLp?bzLXn0rFxdyP-k*(vi{6lXWXKl)=ACcKq zMkKO`P-F!y!De03(aN{fdHLP8T&_@=i}u>4Rpcf)OovA=QF5?XShtEy^bRkEFfekI z7kQ25=Ca79OlWI2!D_}jw;Sx7R!OLm;mS*k(@4Z~aJl6JC?O9;e&6nOAUeH(3?;>- zXP88TfhtM|hjUDuoD48F$Oc=cmmZ33D!k$eewsxhR_YiX;0Q{OY_-WwL?%oj*|b zUP*5db<;I@e|ezSGkw219TrSYk3g=K$K}V30*3c@zblYS7FrsOzMiR}O`XUdogE3M~5WU;~l?NHM(RSS*_9N`n8QV#z^A39lP4` z!i&fGFY~$qh?4g*zpw}!*@OxQ^O`11hLq(`%wB>oP&sh5clxls!Hk4rIh?mx@NCl&jeK5ac~cwf9`O#7pwX*n~d-|d}`+7(X(eTJ~{%;Y(P8_s}u{| z8hm)OAftK-rJJ|I;jA$9r8Su|RhU)Dup+=385t$(8iB{-Sp{I_H6ZN9bN}-75u)_t zcW%ZfZ|lUTZtp{z$4v|({ozbXQZiH$v#YNn{~t}~aD8G9mxiYi&E&BWa$^NxZ|QHq z3oo2fOw9VYb;~LbQ1-jym+W_`(jFNbL^v_Qvq5h|p}h*=zTNkN3b2x3ZEh)rtJjUV z^X@-D@1{>sl8(JAnG-dSzK%@hztwDgnp6>PB$IQ*<1-=>AH_IN)o!|nYu8B{zw zy8@@vqdTtGk*FkJ=)(0g*u1l)0sxA5XRN~dNU6Rdhg>O#h2;X0=}q|h-}~q2>fVNn zmoM=BIhAy<5n1I9p9h8Ll4{6WHGva(qlx!KGlF&kmuwLcGFgsFPpo&xDz%;TT(iqz zxP3n8BX9JcNV>FJg<3ku$x=Q}MHcX}d-mx4y)?axf7RKp{kqlnpcs-$@LJY%S*Ysj z%c~f#s05?Yg(QA{b_x0RJAuA?@q?oy*a*k6T#u$U2ZkojU_QE18L0%kzr}UJ2pTXs zxeS-br|0Uu&il!bPP#aB8vQ%lQ3XTqjOqKm%>7={a_at?p3lQ#y&Yfw&HoYpU@HcP zuXDe&T2X25a5gMqC@IINY|q9#1~^Q~dTDbdy^@e!&8IM6&z?PGDaOeZ^{bz~dTg~+iAj~4-{*!!YQ^6{2Pe-hl}VG6bVB)h z`0D!5y?H14`*vb>Y6xdeJ_DP5l0f9GRZXr3D{E#P+}V%kUU*S8jr4gvWD%^*ZQfqTPjGFqzHHqcbKi}MY zRlse{>y=TJ&B&xiqPRSrpLHk++7%1ZyP!C=I`y?b!&>NvJ;@6;TkBAF*Ac^j85UBITkEj$!& zwQA?qO|IAQ;HYXOI5Rs3x66h4`npO`D|t939=4KHD%FHH5~-CmKp&7VIiDip1p+a z+czWNsfX8225EL4J`0(Si&t>;=@)S4CqANPxoMR((B2`6Q^ub}qY(mZD~x6vCMTwF z&+Ypau+iTkDw)P>$`R>m1z4Mnm1b00`9@_TZUhFmeid-j?>uQwM;Z9@qh+KO#+6G~(YJZCT5B&^)P{z7mCNRE+7J#$_5NunROH?p z`&}@VG#QoZN9~v7)xBBE@^~2@1|E6%pCQjEV|4mFPMvxZuN?X=ni>*lZ55f=a--1r z9bV=dz*c(I5TMzd+5_ zg{e-s8-a@c5Sk>pznQg>2!3Y#d8`MMgQlU$$LN-SGbb>3eHsJ(yAfJmrgT&!yX1b` z44q;=c*;sUiz}C}!tW0t9#0}eM=ryHTUy%`i#0#HfR#`f3-j|T=TIVD!>e*?!r>I2 zKXe!!JtjK6cQ6Lz>20x*!C1Tihc$ubMl;zGnP>Lq9Js%3D_ow|*Suz>LKek^YwLpX zko&c>r3tNdPF$G|!-*p1W)`pzkHc-Upvzy6b4QNDWHF<;x2uw;^!Cr6>8UC8JWb6l zYJjw~+{lqV7!oJy_o_ycuXXK24h)52NQ4&A6m;T7mi{}#VCs2ZB{lebWbizO&cBFu zTMV0}b)3(DCQAzL!ZP~n2~xUz=xg`GY$~mSE2F<1CRgw^-+Mln!ou_`SP!O;p$WoQ z&w$;W#MR5Q*t&HGCGct0YfAF&-u7!$_Io;=!SKi!gCURF@2PBt`#q~bmM~>=WK2Wh z2>1Jf!nZ!3=cejRVNK`fV>o)^2m?XKJL~_rZZ=m5Q&XoA@aD@`uUahvmSxMR3JaveK1ZF)!gt|@t`q_=>G#S*x5 z^%_o`KBvHz%i&QV?%K6UHSR;4cqE+Q&q`Qah~v_QL45MlkHKQqpGnL}1|ykS=Al-H zw`B^|TS4hrI zq4M}Lu-aQ`V+FpF%x|&S_?1UNi(qD94&7bd?}$QD-S0AYaCs$+vllPnFoC)NX#sEf zY=J@CB-9)L%KR(KQFZa>X2ZCCZ5)q0c0X>k!P6=Q21%X`!lb`FNTRy_Yk5RdITVd1 zczG|jw%A}QSNCrDE$sKV@qSRVbz?H_q-N{WJ}7G=4#w&*;Lzd2Fqp8Kdj7Vok|#4X zG=iV~^ykQ=dBDYzlpnK5WioI$9gJ>c1X^W+swFs`E+i8PB_B*o%;KphpHq2ZRl7jh zrmNSg^0eNriIbFZ(DMs^9^gBWjFq6=w^prGdK0W9A6g(l%;h&2*rwAdAxoAek9;YE zmihpJl|faOu0$i03|Dac@n>;uY(y1nT8eM}evsb~nXf>n6TCDT@;)PgVAN`Ir92FSW8>n|a~FMLhe=^GGMN2uBkP ziZV#0)9`p)WTC?lc(Jgss4Dd0WKEp}Ul-0_!7DExUn9qrar(?F=-J}po_za_=VWGQ zGF#@^(~VT39i^O!SD+dcy_x+^07*7Y#`P46Z~eZj0jzaoZ`9qoX78_kP}W8cHizAU zvC#>YNd8)h2h~9)I=@q$`S#j}j66!@(37Xn;^o7yz#j-Aoz0_-lAxE;V=9?IG!jt} zZ;Z|?9#1H$y`jEA4WagU+?bi3#pL9adbU)GlE(GpXl$p~r(eYKatJxY&9LH)AjaB(yRybF|KutBm;dqqz~#Sr64px# zIQ*Z!jir|^;HUrgPx0M<`TyW&|MgpBsmdz(S?-(aT_yL%{Oqh6?CWvZ^jExzJ$Q#e zZKc`nw|;&MKR6Y__fM_hLdb}T`4t7aq@lMoNf+lTEk!oGroijzcH43F>Yy5(^XmPs zLAzKJq^AR9 zO!N7iN(s1n%P^HJz9%;r6>f4U^HL17?9( zhF{$8uXDjxuS|}g;mS~i=Yk7w)oK819a*gp*7~&%%-Yb2*d1ncb~IynXzCY#EcAc5 zA`nT>pz_)#j5nJCS3JCqpE-vY4!wXpY4}Jiir%gcf~Sn?7B0>#L69YRH~D-Xb%8qA z%vR(m*<~_m`21cpwlw4V(6Ey74jq0Ty<6((2lM*C<~L&o0!ALFAQKUa7jS*7jQQn0 z^!9udXHGqj(9+9vHn!IlpS0HiUDEwqQ<|2EKv2USxBo7|UpF?4Y2vi<@bmgFF0Q~{ z@*+iGtN1$tSgF!%rjxAKtSDZa!H@s!uW{<^d6+!ALn6AWpU-yX*64$=r+4CdiD}74GpPrJCgLCCyONah|A?v zz0sn)C#_m}bxg`zsUCbillwIiOW~CZ!;}HZt_+^Wfp$9{8fZXUV>7DhR>sQL8?~^P;`7)WT%DoXr!b_*w($s=hvRTUnTLH3Ll4L8n8v?eZn$Th~^UH#X@o9uZ zISdY8BTI#sdZ$vQ90|^Hew&F z*E6$`Kq#9=BM-xLI;EWNjW#f4WYQV@>3{w!vQSyv^S}X>lcEp()e~d|Aj!Qda?+va zpI1GEL=ucgDF>|194n)-sY&(3>Fn%6ePaVc(Xf(Qvvlw-mra##r}#diOEF3XN&M&s zKSysLqeWv;^~{MzQ*`vh{QXvRch}>W9h4Fgiwa`ax)56$Lu%z2Z0WH;Gr9Dpi-sx- z`RW6+8oleHXo<{>$V15#Fgq8A)830m9{nQPI=aU5%oi{dUO-!YGh7}!(z6l#*}wW@eElE( z9(*1T3Y3N}oIH!cQx}m-=J{T7m9`CUea}_rOG*N}Vn&oSSVVV^4=vq(^?eK3PE(}` zZn-KqX=}2SJ^=Bq99vR}o1?5}*361wG8oOPQlWg>NF<6s`O|O0Mb@#Yt?n1@Z`toM zx@v4}92d`>SIO+Hymvw?A+lpGbvDQ_XQ>dJnwljj=|x>bJyxP2#awA74PL*KXM>%4 zDxqF4LiX~>Ck~-+N0Zv`k}I~b5W%&pQ|Re!M_YRUZz#}evSLLf5=HpkJ25qMjQ86d z270Y9n4IeK>F)Hk1H+s4yWDM(lNT>xZa#@R{|a1!??ot5Iiiyb;Qv261G4=wQ zS{P+Z)5?;tB!)GQe)SWm0WL~T2{U{>b!GiL%Q^l%4=0%tQDmfb?DXQi0yN6GI(^DT<++FI+xXcW?PzIgM0;b^$-ngqzOo^&kHz7a6ebABGVrrSrGe=D zG(kf~F_c9H2f8d)Qq^qLSN))934)_676XHoWi$m_FgiM=z-xKUet+e}X(@r=es`ju z`(3~>D*IhH7zwPdT^+%bPd-m(s2RN-y$COd6$9xe;1(vckpYzWFA1iWmzNaFX_hGt z+*8*EM+k*14C;ymKV}8iJZ>+}T{sH2*P^cj{|kq67`ZO{eO498yy1Q?%OE8SCZ|>~ zc=ZJ3$+HaN7)%)~WX#OK8|9K!_B+D|EQL}yd1?;B!%m)y`|$bC{m=N!7k&qI&Gi+j zPzPae)oKjZIH`n39^VhLs&sJD9J>RCt!)I}R8C|XQ z2uIU6^x|yF7BU%O1RL#e`hn1Lno*=1v(q8W z%`Tz2)&Ityi%ueuC}aDMUQA3R=~PY1!7{$a%?GXSQpF@ex5x_;4&@2x9N4t^BiQ{b zo6*+U$q3k_KXz5A(mRc3$n3ov-S6K`bCYfA?&(70)F^^pvPNVPEkxQgWUm5bo|>H= zI<&F^O*R7Rk)>H!%{G-7?~G=#I5CIL{$2&vq^Ld?j^L+%`(3z}2(IXd&yNmae{Y{+ zolLx!>M1uy2-HsT`!l?bc`tEwang?X`pvdfTyk-JNDhdd!i19pLzjb`{Z3~ zMz@sLJd6HXAB^L;q<~T~9Yg@zQ`YQSL7uNde_?swVWF*4RN4og};2&0`O<*R8KWHVWn^Y!xKmyk(j z6sU?*Qts{UA#?3elA^FrEp2_cbUF@q&G`pU;Mc`4ucJuJFupy#B|k%#_Te z4A`}66UHZ#dhn+d!D`juT9Bo$X0fE-zf1F33LAK_R;0i|4lhh#dT z4$QNs&th(73Y#`{^YHWH=_j9p-R@WU6m`J>52>t*hO@bhYC0%Dw4=R4CAzk?we$OV zbto?_FXF%Zr~eo>{@#E3lRwA&;v7cCmSN=2wr<&n3=cKC%}GaF#<`P=@CBR%NMyJ2 zc{O<1?+dPuuc;iBC`tEmNy1l&)^rv*GqQ0LS{O}FO&TlJbJ@zUXuV^!p6YR9KAkw& zrEmf^^PTw0*MF5!w?)tX(y9k@mCrCBvJl4izxS_k`+bjLbN`*#NM^TKDeE-B_&@{3 zj-NxFS;hgC&|&kUj!cB`vyy+5C4jVP7PPwS$$HtarO|;&G8E&(W9S&zL^X%3*5U$w z{$Ib11VMJ$=D~6#iT>6euB{adu_%g^q>9;`7dtFhtwi~0d-PjFw?4+@6Cp)%nyV)_DG`4M9JB@8Lw)^FM&pF>8 zuzs0qU31Mb$20CbY}hF3F$8(*^*JfIf(R%k(5aYnOjV&i<1=+qD@6e>pk7i~cFMAm zVVy#v2{RNn$t-@=f1)`GD!v}S)@Fw$xLOPN_sjUGJE3>)X1nKYou@+{uov{JeLjMw^ zsCJ*`|GlMY>16DD=#t_!7#}r5=}`#Ku;EN43h0=S9_(mfO7jf3x%VCUy}vWfx5(e6 zltGJ_%*7WEd&8>LZ%w_tE9+JrbNEA{Rs?te#(4{kiM{Bgz z6FJz~=|`{-!|>{;vA(jlu++5kZ+X4i9bcTP(H_MZz9A|6;tn55F_W0WOhz;qF5c`K z#XfF#(Hp|_qNb+vV@NF>W7CfCOen7SJCUpufD^Z^% zq{P?C(VRLsjLhcquWKae#8C6fr<|)T9yG!ivBd=0oK_4>g84O^tzcL`vvst0ywmD_JUjT4MSsC(r3qR+Ow~w#=Ka`|=N9lM zuHuAy$?QNY81VJFBR~WSMWdjm4)1Bv%|>x$j#dw$MMdlsicVv&_i+1=A>_a1AM+HDLmnjLTA#N3{d`<~Y|G!jT!8ct}@$SJr5Y2bUJn@-#v{({S=t7S-)USN2WWzm&@lcuqX6P*WP{S1rrTC_v_5%F%U{@q{6kNCS7cVRK2ftv#UWsAv!^axBLg<2PL~gEzn>)M@eQf#y$wALXg`G~U znQ`Z&lypGFGag1F9{wdcwS;D^+la_`vI49-wLWOEk>k1W<;bvOD`|{K`~JN3Hb_#f zZf2?&PQ_$Gw*SvR))#M=e--q)ys_7s?FN1kKeMg7ujQ1_#MMFrVw7)Y>-m$r+~L@LwB6R-uUS&w=m2-eEcZv*Yzz1R`;i{wGK2cE?Nj4AP z5BJGdn29XpDUKaRXM?rJBH>xm?;=!?!P0i7uJ z!daIbCq&7~z0WdBZay2+cEPuQZW4ostOt+Of`xu#Rg3mkQ-9zXU>^L@c18Q?s)|krTkSozh zw(V>wgGob}#GzAtz?d}~6Kh`L*p*FKkMR2N%>eD*jFW@HwADSo@V)`vQQGz?4B11X~6;%lij%Toyj;mbu#-k~>|6*Hy!y>zi zlM_x}uoeXwwQcSJS>{79OJqk21B> zKAN>&LaAU&k#h3$SJJ~4nP|PNE-Wpved!nuuz&}zKaGk$7W4#QUi$>SZiIGRtj-)w zBoP-yF0IDZjma+8R}hyd7=(nJx$3i&8ZamxcD8lJZhqITYrgg#E+y;4>zkvQ&R;_- zd^=O;2|h4EBi^`AZXC13KiAtLy3}9$s}Bvh6`xcfykh8iQBOH$u3)Yq%wOLSTh#qv zf;xnQW8My<2#C2r5&Sh*D4XCgXZ=40>enw~%@y?U2}m&;fs{qWY>M^%B&|uNE_j5* zL&a12r$1NQTxjCaUG1orG1BM+9L&w>TG;;#OqVtYTeM2yh>m~ot#x3HqHEd3R=o zgdAU%5p=Q+Y2Q)t4JD%U_BW&^$OAnm&g7xUY2C&)tYEXcS2OBNeB7!xRlbXUq~Fjm z0#BQhAtU{28l10EOmap(x2wEJLQO5O8hkHs^(4s06@D zc3rY{8IWh8n)=J!>8dsr7Yp)oM2C;ro2F4Y-fwc}$^M)ate<0PUTi57b5E0o)5yF@ z?TtUQf4h2Pz4yLZ1z-FQLs_(=<}Mgu1S@;PTXxwem=rg&bAeLugq4#9--1ERd%hnT zZBDUMVd(LaW9|pE0mULcinGiZS_CM72J;5ZZ*HH|4_>c{*JeCQ{SL8{sL3>0I4v^{ zddZ$2Tr}bizT0l5J#4~_me9pk=>k+|YfVs!{7&$)@?U{5YgpXqJpZ1q_oDMtjbxmQ zHE8i=2m<4b)H3a54EbUfqH`|{Ahk~_nuV1>1B3gG7)3LFY7FVk14NLlY1kq+=IPCdfPUY+wmPOSGic`by{?;j3!<{ zn8ZD{r^tqwqhR$Z21du8qrXJQwl>Q1Q2a=zD&^$um5Vx`4vSy9yI#pQLr2|Dx{kMX z;+tGc)%yJnGw)hs@&1Ngh^38SjP+^wmo;K*P-u7yuGW8LResUFQ;P)%KBoO}W`69g zcw@t(XtY0a;O5>x#jL7|-G%KPTwE=?JCYk9CeS767emRx|*<(XDaf}uNU#j_T6L5=u~iA`6tiIQw| zwtmMX?W!TxDkl#zUxWC!8j`llI(6VE5$?eb463VfGrlJc(2!Qy{4XxC@kA8d*+Yl+ z72_xLSg8v~T=-NgtHsOTHe?9rA8#_H;*)EUbsx`%|D1h2wz4gl)FIuY*)FcUsmM+a z0E6F>6l61dbz}*$W8V}NkPFK8Y1ocKhj5ju1fa!^5Ta8tm1Sape7n-NyIljg!F0!( zOUkNK*7>|Gx?bJqmn)UtrqT+gv^cdJ|)w_|0nnZkmE} zg24)m^^_ASl5dpm6MHW7#S)*lJd_l7+oB%ZQ6rz(vo-f#>E@eT!zZF#uNR)CgoAnl zgjmAUkaA0^sV;2If-1)He+ytR#u9z;Lq~1+yDpp&`y+bnvzLFNnr<3ML&dgcw3ZmD z_wW#BR72Zw%kQxl8*jLQIpAwVZUDru_uYb4M|T2T=3hh2#CAWMEv?T~%1S}gCDgbq zw}?S`75FEBKg$GMJ>Pcz+V<=*rAH%Gdop|ZF>ySM9k`c9K`x|V)^hO4npf?Rt$SRC zM2hcv9t?dm@jb)3`~`EiZlc;2JhTfkdEWP>O{+>tWqSEi+JdRS^hIOJ+WjlF+BIDN zcqV;L>akpTl}t(_X2Vcqg5NF#|Lvsm!ga@IQ9+TwUwBhiZO}CgKNo`@Ty=XiU3OY; zM4IRP4a2osb|Tgl%D<5fG1d9Jd&*BsTRV@fMzps^^P|kN-L=4~R1I4uEM5(ZnC}I{ zzN3LyBPOWk9}$?7dCEe_Wt3>7ig1(n8ifi@G|si z52~FEsDc@!xVS^;GPuDB<-Iocl##p*>_O+%3c;!|CP|0n43;#G_22>N8AjHST4-`+ zWs*xv%RxO){6rv;Io|tv2-dC*sHhyduJCtkaaB-j)edSXOwjDJ+n= z4#CLu-Gm%7D2P#t@G^&e>(lq^&d7W7(otoe+e7fG_My0_vMB!HlGx^aE6~Iat;Dil zm!2`Q{)PuukeNim)kZb0K#Eq+(3di~y#G3L zXA`{7ki2?QG!!;%P;AnCy8CobKeuV?eIwZYKq{y14_SiSAuUaPx2N&JqNr%Xi2j`@ zXDKP!Vba*)!>g|1L($g}+h2C5kizgqYdV`cc()QnI88sVCx65mIB(H~t$N_5JW@``}sia1VFvx4eGqF!F_H@1A;)NMc@T zZspnF9oo43qIE|9>G|G6dL8#Q!2judz`Cbn!@Ti|f3ES1b_+XFa@E0G#U>o=dCtVp zXCpFm;S5KPSJmMT61q#ZsThyM*dI~56xPRt{;&Yf_jrfTX+I^+>EaB3-G2lkMfG!% z^O3gOZ)>y5^Na$O6i1P6o3h86LMw5?WLsH9#nkN%c+$>$$&Axc^Ue_TGh~_vD;`r= zz90dezKj|PiGAnUB3IOKM&WF=0S4;*-8y^x=?R*8#A0?!DDYw0{i9l&s&qEc$dW1QmlU@3o`3l)p{F zP^sye_V$vxU>c8Zr5QY{{wbkvDL&$FD=hGkWx&9+YUFA`zhmr`9h;Mw-NL`R+GMG; zdeeR`(9;$wi&U+y9al-Vw^jx2TD;tyKkl45a!u>=gbiV3pt&Tza!t+rqJ?@im&V{Dsd&BlkdGfkQ7M+N@_FGUME~?vl zP4z{tKu2w7>*zfbp!J&8YMTCaI#1J4eS%t^!i<{`>vaElHwR zs#!3DfG{QBgby3D0FByCu)kcje$*6u5DON)y{CN~K{-XOLkg}j1^5=!AAtn2G{UB0?b_Mu~M zj88Vo@_2}c(Hf4cheMxRz1581s|%9tImOdz{(d|VFb1_;W}sO}<0XH7U;J9xhSBoS zg&IAFka&zboJ)wWfss+S;y z;KU4}=dVANUA!WIkmze*J^d0d?r9h->Fd0YgbADNRzmTFOr^~C4`gdQ7=b@3YYF)m z4s}|2=H5eEKI(C<)kqW#^@eFstt(#jD`I~pzTX~GBw$SHm54ndt@82K2K9CQB_1c?PP~ zt+5$1$!V~GfN=cKQ+CNv^U%V8N*{ZB{HpWso#9^GjDS-qLrMHZa-=0AO6f1=VQDtA zr0PY{65yX?qS(^ZMihBvG<-X?Vf%4=iLhf#R;h`g2^eo6<&ouUE~Drc;WQ|9Fhlnv8x zSt6x5)S7w(O`>DbzYL`2#mA0#HZF%#O$vJ^z0Sy%0E|-$cOo{me!4q49 zZmXU&P3>#0&T#tgWRizIFfltKjSi>nC)d=f=v8(kZolLd;&&%A=1VIa2Ejja`!)>D z*1ZCwjnImsfxoC@c-e6K86;p-p{_nhEL_m@AF<}F4l&2J)g_*O-; zi_vK(!v9`|_RZ7j5ok6@Q{E^3}EVz{uM%ar@#kGBW2o$l~fT zb(H(gA4TG`2oUzq%@0UXv6UlQJ9_F!YpAT;i5wQ$Z?JRxE;RZ{-GGz+bkL-QZL_dQ z|D7N<9pSsI&e|!4HIVg9q2<&hXL^4Yt26{yJT{sESyK^|=bHgG=0*=ok_$a8qG~hf zWc>|{Cj!;!m3ML;5LT6HVy;%=sIO$~yC_hT(-P!MT-t7dkwdT%?|KAM6jb%!)V({$ zg)p*}|9J5%Y#0W5h?MXI@GP|D%i|Td`J#MWFuhS?^*tsiaUT4FZQ3e=5GhlER8pz3 zd^p<-F??NJG9s&eS@Z}ff7vSY0_ouQctTcp+1GS!X$EL;?%f=ajlYuk z**+NkZAO7UopO9>&_a-`^~#f^T25QAXQr1pKix)}*3VS)5y%v8Zft9V7TO zF=uWB;|r3y#DbIIN^abNNy=EqM!)1!onHQ+5jf+{5xZ_zf2MEl*-JaA79tbm!iYM- zS;Z|DY}1CVp*_zXJp;{Ex^*s(D7=PM{T`jG>}m`x<^NPd%ui;S4ciok3!yY46!HQj z1$vkZIHPU+kJM+>P6pR!jRsP_e*H9MId){9w#k_3Uqp_W(2x5+k4}uH&0oQ;f2JjB zSG(Rr>bxB`_HU1z#i4CEha@uot{=0sDoy_tCMXBbkWR5+MPlI6c9p*|;Z}<2>#HOS zhYKSUVnN0%d7GP&boIe5$G%9B5oZ#r#mBQ}CHJJU3q&VasMe;-*Ah%dLyQfn&Q5AT z15@?+Lm8pc*DgAc)yFQX>NRWb+ZJ5Z4|-8Y1-r466bYujGr+jw=SK_ zif(ku;o%~v7p{(qM&VytVA{42N|5_Y@C_d0WV)Nf6sKt@JN zErk)~`h4(QJQ6{=k#zS^`=JReCM^8V!M%C2^oYwL(>ciHntQhzN5aR9<7D&vhGLqQ z#oBrI?FXLZe8Zqx63aY(ORK(P#*Jky&zz{$s5Es!SqC<8*Lkb68(P4<$JS6cG1Ri) zENaJ4@t62XMi);yTZ+nwgcFvmRjp(kPfmS7PE{S z$7>iAZE9QyeXoSma{UbkQ`)>NcR# z+G8!5Ihhe7hr?mA7Ksd!b!Huk(y0q|><3Guw9GXMHna>6b#*J@CAq$k&w3f)deQs2 zuVE&mz$DM7MEg6pr6j9`6~Mw6@dAJUecdNxyuzHL115>SA9({V1{}%mo}Ck=hwj40-#CG-+o1|}k@L<=_&1eeZ1esoO$SR^}=r!2!9@5?^O3X-td6osPy{BWmN`;G!t40v6 z>NVb*W3SGna%#=US0Nwt)RKg4BL@bO5 zi!D}P51m;l-OqcQCXTLX&1kG7%DW_}m;Po52DCML`=+WHejg|w&=l|=f7$!f`D2}X zR;W?q#D_BWXDmPk32SLw#Nw%}CIEZpeWit^tyQ?JMgd*3;`Z=l5-6ChHzP$3$xK`# z6%mGr!dWh>bAk>_Jej(LL*E%4uU3(_ftK{$cNZo2dSbp{d2In1H3R#z`x$>LO1ami ztHDlLs=fTrnay))rn-8vGD|;$8;_{<(MBXN2Y6NWP9eP@lC)v}P@U z_!>p)>pEVpmj}kuzmye+O+;Zyndmo5+Ud+RFl#;}UZ-8)I<*sE5Mob@gJ0I8ExJi3 zhx$zx6GZ)Kf9n#Z4xJtaVo4XEPQ^_{GBHw2_|al#gHsEPm!G`K=pW$5QfwqpJ|(xb=U=0azWARbUl_81xE7Pn)i@CLqkAfn zF+%C*zN@qtc1HL=ZTMy)6v9}*X0W7s>(8O_x8E}4X-=%Lq6b8nCHnLX5{i_<#y=~Q zb3%y|MW(OSFx+`fJ0_xB6%Lc|cdlPb1$DMvd1wEC;Z<|s*yd`-r@Xlo24!$*^5`x6 zEagS(z_@42_xMP*gr$_FS!#P)Wt(@N0@mxw^f?;N7jf$xv?bU@VnDVNrzgOH7=#eG zMCPBOXfTQ^FOG%~ZmoJ@L!5X)1*vR0n{fwuMj-)wm8cOUn=$Eet4HG_sjL+sd%B>Y zZAUaE^uu1K%&70$tlGhbupd}T8KCe`iKLuHFOUCXM`l`@5og_^#4nakI;oY<@?8bn zdRAMK=XHO}oX#9AcIs6G(WuZZj%Blc%dAmBWNe7KmGbAV%Y-j@n7TesgzFI4(}U3b zGL=4Ur2hE&QcuuZu03VnH+dK*`9PqyClqq(D9G0nEL}xnl`-)NpwMsFaINls;pIT% z5KooKHekmo2v!q=!jCFGH2;+5QlWCwA{VOStJmk`?bAqC8w)OqZ6_CoB!f-DlBP-V6-gCJz6Q5rnMvsueA}CFB3TUc;G`YdRJ= z6h#pa_HCxk3zT7nIVj9Q`#mBVbObM}2#$bNnTSlKwGe-b(cKfyA>iCH}Q^ zMVEEuQe2*SjVN2I_jgg^(q<*^UJU#3zzzWb^+~eEluVE!j7@4&6==54 zE&E1orM50F3sW5S->a5%cK&zGql@A^&MLCuq^+k)t_K~l9v;5K|KXsJ%%~Y0T~I(! zB5;~Wn>f+1P0a?1XbiGHT1#=;gsr+l59B4;E};0m8^zII>#dd~)7_Tf!H+$vJ&-?k z#J#R7aE=RyHw?1%Zaem#f}~MImhC>b?*p)QQ;VHJiS;GvRKSp2ij!m;BvchN)u35@ zS~214d(LvwX92U6_L*b;Z`tn`crsj0&PWJIwvFWm;7QiKqwL3;Gs;i*?is1cHXGUd zlW36S_VdGIs{d|~RTaE@ezX42;*>-a=OHDDE0bDOI!UDH9i!Y*4BJ+do+mi8INGM6 zC@xRp#{tmrUyN$CeOK5wlgJ@D%q;X+QEuj~-L?Heu1)TfpU^%l_=kU<&jB=%yhrfy zc4ftXbscfSh>UoAC<`-~HUJ++(dv4EffPk_I?78uW(oX??V9XnFm|n65k6 z+(&q<&pj)KTc!q#0iTjwtqpBL5@Y8^na6#+WS^90Gg%*UH@s!GK&cWQuRH3=v9!d% zGpJRB1T&<{xKElY1;X^5RY7b zQ74$rs%)EDib3Zr5*79jqgY6po^p^7(SJ}Y|6TedD^pwSu2hM3rXyB?Un7dcpj!KO z*_*Ib;DrqU+k)Qls=J}A8_&_Fde2?Js zJhMtkvaVXPr(wmeQ%)@DutA?;0dC925~0@}oQcmK*gzGGQ zW-p&^AV?l`E3ywH|AJ{Qx5|?TnA;==1;@%skBk9>kfKG24-bCee-00NX6ZUoS&Ok_ z&Nui2U8TRj9)8c#6GDGS>g+D5iQTgpVcwpb;SXPorLd)A|hTh9-7_7%|q07Uw{M#v+0V35-sM!Ww)iKnXi6l~j$5 zLr_B8$zhbYB*gODj>Fs-fNHVDLmL5)&E@9@CRGbH?|%jF5Wm3?& zQ-ZnG<;c*~0*WRRRaFLF0f-?Ju~EJFO2*%zgnktu=;aAue(El37jCNS^kQtqr3p5X zY@6>`AoOJr)+PSf1n8O@Uq)I%Mn>N4zFd1>hQA!I9`aJ8W$eZkyVcUT%5I+G}@MmtLoH(3j8Zg?(VIKEOf-et7^=^smCTco{CQYutEmLN>Edb zJxijt3BlkazBW%9lErGlgfmNBN7$1}F3(I%FcFj?Q%=zt_Lrtj-|50`tjU=r5;Xp! zp%9hDNEWkn%qG1GWeyhIim>;(0inxDYDMoEnv1t10PS;f=07`Lt=meL~n1O}}L?hi(dTR2TLD9-_Pk(1(RDDQFq@^ZlY)fgS zUu&5#QYT42aaD<1L!(o|NIO7G#ygkc=@u)cT998U#bc#`NRr=-xtnnA7}MZcu*8W< zEn1br*r8hC1jScWdK04BQ4n9Y)x(9{qNl6lB6)>bH}qz{0~pGNe@RGb_ua{01-vv^ z(80CzY93LV0Sovol$;enDn^2a!|YV~D!ix+5DG!IrXX8&8Y*66;n1PuYYvm!AYweZ zaAUIL@#6ZFeh&dJZcub$&}bRZEyssrAs_Sm2qB z0wO)8-{cd)m@Si6RE4jSRGM29jk{!_y!>i;Aft=v*MmFCq%duM%~g`5g>)g&cc}Jd zM2Ve(o%qL`y|LrLk3=7@SBPL{@R-IgI2RWeDGM+XD0_57_3HD=3BWym>!Y%xOZ}9p zozia*^@n)~r5*=^8zBp3h|}89v8pO%`o!Q@LXYW@3)asg0aL09I_&Wkl_0Pqk=b}O zQ!XxN#J3vCxOC)1WM+-W7dW3!uJ3<))*7_cTY_3DKm6`?kv{gySO9B}eP?&&o2rx# zUP?M>S5ImP-Hj$c^~#@|;UDUyIdU3rm2ldO%pH-U!mz~-alF1*V7-z8g0jFSnR8Y9 zW^_D~s+<}WYDvl-)RF)yc2`kQ#vB;@V{okl%S>R=Zb7tcmsh3Tn?rOu{Q zpXoZRa?U~SLT=XeUG*Tm~Bf!5U z;Pfde66MU5n|0N+J>q*9#?HXDvr2&SP|dl}LOSErh-M&63LUnzoeE{97$t@XS&B$) z1#;#{_+higAO`F5>f^SSCq8D$^!9^4O(v}k;;l+`+p4Cv_Ku>d_NsoeqrW3`K|bZ1 zJu}JcvEbKvj)r}FGR}X5mbR_ z4FP}XW%DNv7TV(L*NXd;xGb~Kqp_x zHzw946Sfq;T#&lROaI)SASYcm9=W>zYaKfcfY6Mx2$y<=9S`ria8ZD%&tV=j^r>b(BiY zTJMPs$JK%6*c!T|R>bp-{r@5XGVx0hW$do|4H86MBz<#eQ7<_jrQPh*Q%JbPguYbj zJ1LXHv`{Sdjh2z$zbBQ`ggNX#%HneXC~#utd3=OFNJv6N)t}7v5ZJ-e#YM(>a#M-< zogh_li3+qS6&ZGlZ}SI4s5#A(JhIoMO*dZs{CRQ77&s@%_~sPE34Q5P6p|6vg=gD| zAz4Pkm1Pb3#FHvr=}}=u^;s-uypd6LRE>p_S4IJRZ=1hQ+tg(Japui<+YCY)ZdVxiSwuBs{ntm zXZ_%xc@<+I{R}?{>Iw_vp>7r+Z+?+mNd_^S?Z?*wQ-gyNn2i$w3y}YaOKi2RUALnK zXy&$7gEt>E)a~foOb*;uxo^6-Ac(2zCt-;W{e^OF`s@8ri8?L(%f}kprKZBeufhhh1Xx*S zmrHPJww9!Uvbf~5yta6*n_+!@PIuVmPLGQ?o`qU>4= z=~g!8*wQwrYo+qH9)lT`O?{w|2j4i5*F=@z4H<&!n`pRFU30Bz4eLolatB1d<5Vd)+qmwJ1CQi_1JLj4AzH#=;$DSos$lL@+J10jm zkh+6~1RTcq8RZkXccu-u)&0WP;-I>;JTc<`-V*RRZm@Rwd(24E*B-xNA_m?f>B<_X zx`>##4;H2s5g-vZneO^JlYEkVA|-&6_zQEEQ6oD8Up!E*Z0TgsM6isg%^a|eY4`-# z3LySCg$sb0&v0pV7;!&4>@sJmQIA=Yk^Z(n6wst6!I}B`{?_D`4bO-6a49^E77+yY zUfk1s-LPsbjqVFSq^6YdQu~Tx@>NzQwZ_4A_-6Mvy_j^7C<|QR$_aie-d!XkEu*tH z8Fazg_jEhM?MgQ$*-gmtN4g=o&bVD5D8_ zOS85`HBR#eCOG;Wi&~YpLpEAGJ}8}HJ0jzYVqmJ}*or)fUIM%E@g4R$?r44wSMTe1 z{R4*WG1dR)wS1lp4Xwku$S`G!{!BjIdj2gg6J%AvU>+MBa)w}Y(e}MG!Aon@SZ*fX zx53+SxS_y}Lm#A6GijsD=Y=%DlRBcILzVV8w55y&4Mlp(xJckq$VepghaT&%#lW+3 zktXH+`J+|S-X5bm$-?`+=x$#vC8=+QVnO8Vd;_$+$e=1hN&;D%HfTAQ9{Ud?-${%a zd4WkolJed?A_8gNpe3cLc@fgiwU;rqDb9hho{dBL4B6p8smet|-LXZ)%Ado3?;a&nL$`tHp%Zg+h9aO4LA_ zX2%nSIkzi1c`ZJO&%GccZ^7P8iVNuv*Apv0chL7N@9p~bx%t&_Qth(8n5OB}Y@WuR zN>sHo;u_mhIIJDL_g^w#2+g!y66;Zde$K_`Um+5--0$r$`y#rh$zIkB&RFcV6LZ%R zcKI~-XoT8zY{4|**YoN&*(^#RT%SBl==OoXKr2xqm^qr~Y35sR#j=zp6 zxKoXdNIo4L>=C~DIQ}ak=^x!kTStPup$4ROI!qgOlsm(8^*1|q$%3)<*gpD6Paaoe zKit#x`j+$_eVK;3t`Rret5z;mbo$@f0U3P>)g`Q!CxL!OsFUV|*#?9v$^YipJ#don z&0C-}3`zhYX_d8V0FR%qEn+zJZ8b4xP3Y#vwaz@P2=?{BjMKHu#NWVgr8TM|>b7)Z z>UE{%QD$AxXl2UWondK3`LvfUT7Yox;9|%bNT?-l`P8|QZ7Dp(hOH_*CuL7eU%#6D z6YZ(mtFGraK}%@4x(qL@X9J*T<9aJ-FGE{vaQp@`q>kLSTOu~~uVZeIQ7qW0Vo5$w zO9%J0tJ{j%Hhx>z`~Cm!CsQCsTC6XjdqIM#R;t?SpEI&fh%}~lqg*JYm-qB#3c{e8 zZiqT1qP}5RD)eM^6s*sfk1}yDL>gTF0rn?xGzIQ_@VSCM)7Hvfgf&Tg#aJXL(flWp zsxQ@V9hT8OXy27WP^5wyeIFRu1-_lQf`uGK6C3n`m%05R?TXCI9MX+`8yg#^@wL$s zF;z~aDaaA?tmrGx!nRUUs3s&6K8`Nn7%6Q3U>VQKrqe(>SgJ}XJSKkd%w<5hnL@Xg zY}dB0Zifm>^Eb2`XR@6*$p>%NlRr`WC3P?O8BU%GB#T;~HiNq7O&;y{_?hdqAQY*% zBLkGVHQ&5^jiG#I2K(u@+m`_I00Hjtq~bSwlw+M@B@bhYz8KfeiS@)qy7k$t+5Ci2v|{tsA0kEt!W-yk0{jMyBFSIueCA5DeR)xjq3g`4 zyg~;O3;-%zobUJCJlv?N{4hNUB6&rF4b`BeN5RU^j?+S=`DHz}r*J2J)YTMJWfoUW ztp<#QhjyEv48Zw8I^X6lFZBuEC9w0nZFj?%TTX&pjk> zV<#RZ(y3p$1}bx9^h${_3$2&pB? zs7Vf0q9}W%Z`fmDDM0z~r&Ya?9F~C1L5?bcs&mBWO|MhQhfkD4$W93_o4m3a~(F`ZgL|e&VrqegX8mN zZu=!pZ+SVH$~%`F%PVA#>0|uHa)V0@fqICw;A-YlO4>CDn+X5c@7t<@$z39pU%U(? zh6m$!_N#^2%iUFLbrvHEwr!?DydHO^l!T%a0(?dnwvydZHh&YNRnkra+^=`VZO_lC zlv>o_IYJD`s9grCG~5#0?%Yg`{-IQ>LKp++Ss~2z{+7-DHu2W=b%WNhO3A`5PBz;i za9`lsk?}-<@*wFgF#KTjZn5thvPt{n$Kd7L)uj*Z+8)-v{GoE?qs zMnm?y0E>}*vyqw}xg2|B^AY~pALgdaX>}V3*X@Ao#e*3jJXNfY?>*5KX}n;0uuD@{ zKxFmm3R!0!5v!LNsfYMiV}V{-cN@F@X`HNHFlb|W7+OcITYLNkqb=8r6cp3j)+=+N zF`}}Ln57GtmM2y8n?9lU?q4*%!~Hiq!PZ^zthq2a9Snj)M1qMyfXc;_Gx@U#JAx9N zrbU9>rAu2@lyb{-#ljAAjOTScu7&vxb+G7JT%COD2c6^Ho%j>4u2G>}dP=C;2Z^HX zIKRO{4Lv@ndfjU%cx>B(hZgfjfY*C3Ve08Qc}>S|K_DlmX?ft-Z`Wo>w8Es;(5t1EbPM9%XXB_Y)~6z*1vm9Ux=iBvgeL!!$Zkd^S%E-&#;EY>RUp%xN?%%rIv$ z>&MZmRb+8LxBm&R9+3Lm>*NSSNXmo^$$SKd%_&KlzXIJA=+a@U4Lhw`?}w==TR`TB zC@O!b>d_3T6h6&>kC^$u!SPSo&cl*w1F@}UK{@70uv6CT;$}4>+Mz`8+}29WhYv}h zv@{#l5FnLdsyg;QwyhAqZbl3;|F({mCqomMU+{n+SDs2 z1}wNmUJLx5unrSojQX(QABa?zQKL9K|C?<4j+7t)qm@TJ*jGF5dtn8K&2pCq!wp}v zk*y;Z?sTq533H&pMvm)#X1l?uj&18Ai8VQe8V#Gl-fxpgj<-V9hSU;sqrynzTEls9=n5zXwV$>t$U5%Qlof}7e@epLL!*c50)S1=Aqo^!1vh4BK7 z?C^sWv^|9=m2{l}{@lRP-HV?0KjM!P=QU4Zz7uvN{^Kc?GCX324W|7lUqLN^8l7ml(KODV2=yB7h#`=kVi@8Ft z(ppvG{&+!Xp@l=hVnSRZFKTjtyk_J>zk`*PCrF^0gUJ!0i(hTF7rbH)2KUx?WF6{xvZ8Voy|p~Y*QR~xW~SmTq`{M}EB0UK1D`cQ!u z4vE*)q1K2lyNbrFf&m{UA*i~XcH%uNg@S35a=cY z*00ZW9x7m?X``oF8(!?SFPZ}+PzDR1gzr_@%KfdKVXAqPKmdj$tVnGulrsRDn6X@wk^YV%Y!gCcE6wmhmbO z6KBK`Rr}w#+8oBPhZ;F!g@L#=cU^J?)5wj6u-Ac5_O ztS^*v zhEDaAOx==YD1c@8NEPd3epc!9v`{lb;<|Eb*S3X6jGfZlwV|2cH}UX;h0KbXl{);g zR-u;_MP1ll29Ij|)&GyHZ;Xz+`@(HwV`AGA+vWsKW81cq#`0>+Wx}=A56-KKpDx4OUQk-NSrCe+JXiX~Q{8*v$J^4v_HAkj~E27We$m_09_J z9w_^7V!d1ITPYxmani5$LK#@Nn|B_3F1`RNw^RY#2O@U&ALR+sumbdS+5tksqMkAG zhB-H1C|3I^r1b;W&qbweFbZ6=7*dicUe^|uVYx-!N?K4pHxTJJAa{($jpGt5hRNv+ z*`;dC;Vr2xAsupJ`DeAmO0K2O0Oy(~S?&^=ZvJjsQfIG8gcW7>DyT3Leuqe{5ZCz4 zqldsVy4J$MS=9}0RaY0JO?CBUIcaq=7h5=CNcDZSdOm%`|lD%9OXhYM_O5ef{=r zTaGmVc)7S+TXCx>WoSmXt*B2z_1*bLq6lAGZ4mIWxZqnoOa47dCG^suPH+O3~T?o zH*C(mfP5%=QgKeMT?`aR20ce2Ej<-7DNlnc9ok9C&us2N@}zQd;Oh3@jHW9BKwQpmQ(mM-@x*{UQA2K&kx^>h~vBr zrZ0wG%ZDy$z(YT0@J9yX+5`U%DM6}sRM}CNTM`D%0OhC=PY;g?VvuPq8TtG-?z zsSHCpkpy2EI!CmfgQW4V9pH3Lx2wysqKGvMFFI?|m!E0~>X_?R9%bru5S5cqx7cIL z2VOg5J`&d2pWAh{FDu`N)+~L}4d!V$2j?try~@f!<|GzovuosZWdRTc&X;hj%<3MQGC1rM)umC zV3%Q=0cwt}v+`sG(RK8@wEzSVJ{~S2o&HN>?3$p~`?Wnw`B;B}mY&4=y2@ZAaSHpZ z)`vR_KYNGLjLB9p>?|%`aZa>kMJ5cKk25UdUap#G6O{s4`P%Z0ik*u4v#HhB$Gju& zZ)dY?sNK{jE)?t|GK)0Pyq?eOyib%Z<*~qw6!qx4?=W15p2i0Zu%2uH4KI~BZV+G< z(G>qDWk(JjEh#mxIyG^~n2bEH8ZS?im~yNs9X0#wW)j~|J*Z&#`mfK8C|5u82 zD1%Kj$jkr8(k~qJ#>+-><8dX@o5@riWTe1v=)S(9OO4_am2&U{f5As=km+ld=h@ET z3GDPsOa?{n(ltJx`Rdu2)sFI`)^E}GCXG}$u~A_#A;s<=yaM^$9g6tmU}e3Ev+MOZ z!QH$ZbaectHFR8DFs5_bzcFTWCtAs%3*e~TJVj!R%+9ZareYQIPy|$_2kdM6Y2w_b zTv8nb1oiJVUh6NnUT--+RrdGFUKZb`PY>)rmR4^;RPv1m;nV-A{xL4yS-s{HJPTMV zPdv-%7>G9+VeS|0y`bV*X5QxSxo|)eeItY-VC{gMKmW=Ua z<#t5tmy!mzXk`y{X$nWmrU7O3Sa_SjTZuL$=w8#YFNb2RP`JNkwoEfbGtM4cF>|5* zpiNWG%D}r@8Ht`>G9?;~J&ol}v%n>ZjLUwfZ_|t-YQR@Jtj__lDax)C>wa}$%Q11J znCm*w9iOSM`)S;I^QuDO2s)hip2pcWPdkc)f@z#>ixe)84VUF(7!Ty?r*l-h~ z^wf-Mq-ayM`poY7%PI(+H-_-%WvnZ$eNYm|=S0kg4sY$nO5q<5l1Z!+8Aw9mDI%cX z`4ni@mX=?_3%>m%M|EnDtdUFkG4s_(a|BYE{u_dTq222|ogKlbKioPN)i0-)&Octh zqQclE7HY)tcb(RxJRDcGDN#dUKrTZYM5LJNqLDa>R)z*d1h`_)+F>?dMu=hHDsv)I zk&;qeVlxjsuO`I=St>1q-a%E2c@c78N<6ol+f}bZAsDSqOOBFlZ@@m`cP4=Rv*wms zd<8q6=|0G^%!3Z*dlvtlVqaAYMD2Jg{mhSN7X5Zt=m{=l55ZS-XnTC^Q`*C})EE{2 ztknfgWXXQ+X6y7-h`}->>OP7@plkQTPQ^9w9F@^_e_$ld=3>qa_ zlx$;=nR31*dx~-#}VMOC{apKy$ z#&5f#`r;(B?BWE^^*)D_)^!n)JJ;t@-=oU!;V1-~J{34yOHR3k{xET$R|oPMWkUqv znYw75YiOpuNJTAo5YBX#8arc%%3csr`cK^G=_62D$WL30L}qo))T5ERSz-LCH@MK+ zawjB7e=*@@#P&dAjI!soCtmethMM5;;bPH*wO_h3q>+FhU%VcfQQ9%Jq`~%XCZpl5 z)b0yXs%-B>LrjzV&bFWY={JDj+t_wxJFxf%HawNpUgh`0RcO0*IoWOW#OxX<>otVM zFah{+1M6I;F``0# z{6p5JY#cXctyVfi{iWm067BrEmvVoaxem_13uwU(fqNxiO1qn*_=yLvbUScc7w95C zppYid{7LSn;{LOmskKn{JyI`g0<(_LcBEnn+xPGgPq`0B#l-}oY2F_R%|ffD(dUn{ z;!TTxzoV)1o2NFF(7LKU`$h=61lgcoMA3n=6f082VFXlGzIMOZio`MSSF8L{uSh!@ zX?;B}e4p%j)(v|N#z7B4Co@W?reR5!<&?E-IKs;6*@n96G(N>ngY!K6PHU+noxoTb z!I+1BXe|Qi8?AeCOvHuW6(^W>8xcFv<@uCMBI^92=zA>9Y@`o#4?o0~41Eq2?uPO# z(M64(P~syz(!Rw?&@guwj$155zkQ~XgaVh3R}DPH7Kq#0u3#MnWF*GeIN_ zjVgbf#NSqvA_a$pDsDRcueR zHx|}OZc>0M9I6eea=k^L($Uvz>cOBON##h|(+;fzC7Jnpw4`q<2&$puaWH%bFvsR< zk70VhIM4wVqy{3AuC_6gI-dseBJ*A7(e6cFny zm2-6<2FyX{c2AY;f=Xukl&k47_c3hZX)SGqbdv8wI@a$`vgOnS&_p`~s2W_M9DW%E zd0_|ZcMEiG;0U?AgWDx zrz>=EUAI`gu^O^pziqTNSc2S1nVQFcuioOGok(j2`FIo{^EcbhW`09~56jZE=Uvha z;r7qbh9PUohuYyJ(@4z7$#)jY!}4haRpu)=3$$`+FhnBRJS?|w`8B5&l%AP<9GySC ztJKiXo&g}XHvpZ>-d4+nhMZZ;KC*DVIQj-*FM0W5#wtDK4LL&-1s#<*SXj}?&Ah@O z#5k|`#+^)zRl1Rg=h()zr!GsjIG)?`ClTspj`V@fiON!g%GzlzNnm830QJ&HbX33X zSZjT>c(wqX*TIU9<{t_FexWTKYg+ijg0DjYprzuy`{AG>`ySnwp-$aP_mNL)PpYlr ziM3ntnlTwQPDx_<0wUM?17pC+9(-Xp^-DS+V$xK@q+B?c{}DWqvG=zGnewY#C$H}a zVYYgi?39pXj7e)u%RW-0rcJuaq23o~rMAgRI)5EaN=>0da#%+iClA~#ZS#1#f41Ve+UO3`=DbZRRqPN} zM4K-jE$b~M@`z=1EsrN-l*sApy}m{S3&8d>-UwspXa(k0S(ol5d@quCHvVe$WfaPx zTD2*vtnuNm2_n)K@l)d()e@0K?MaNVmPa@6boPPQ9T5@xIcBW=i_utEd$V>KQ`Jfp z(}7egId{(?$E~1u9qDOIWL0lAMYNn0B^*mn@I#1Drrgz$d`&GHX}o}uM+DJsVm9?{ zht$Kx*Mgzm-Vz<{v_=HBn-G%JYzO6sp-TX#T@h&@bq#!T8d{A&iT6Yg+0^pQxPmY_ zcOO#|ou)^HU8@cvFiirld>Gd0;g!^S9Im>BvZRXM7YsD82pq4jcFz&=LkKRANlG9QbXA47R>eeK zqIYS?39DW%6P>3f=QhVE*AARW-7GEczFMoWrWrCOi&2s{yxfAcyp->E->5RTtGTx^ zUlzDCK?YRa1AvRJ2Ne3eu*AYZgvE!K zM8Y%iEHlglZNvID8p8@%POshqgeh3qrSJQc!KLZ2`+v+4%R{LcB`PUVxMojHlX#~rloK;3h90Ek@vg?%>g5s9`T=Iy zz*UrK+@p}p8)JNI(9h9Fm4Xx;)6HB#J1@rw&&sO^V%6l%`D4-0n)|&S&pT)f zP@Y1sUW_Hp$IcVoT)y^5=WEr_W)t<5QnSs^Yz3`2ImjWwM!B(*6f;tFG$DTW=Tq)O-S0&)GaT||K;nLI3+tWnPRPtt6#j1+@ z$=*U4!4kNbl#S{TlBVg~-JAiy3!2i)eA53ZDRWw6Kl7xmuRXWw)#s?0EbEo5P)A#~ zv6FU$^94OA*+lef8^O~-^-QMR=QcXYgJB{i>Lyq%Yk%c+>#HXHI+E(c-OJK<$Lb-8J1`Nf#l zpenjZ0qby#JJ4!o8>gN znuXUVlNW*qMANL^f>JZW{naw7E)Uf%l!K5?=z}CTHLc(Cftut@%jvq@vl)u?@Z(Lm z(KNr9)%B9xo>mH^xAy%)e~we2vVft!b;Y2{EN}h$oe^gpB`~guCh;(+%BVx4u{IhI zC$2Pr3Og1apQp`{M+asNx4#L=V26HDJ7}m}Jj9}6qMSHMvB@|zz!z(jb9OMfI5|6r zX+FKKB~<8*##1g6FYq2RHK3@Yl;al;tmz^{*nLHKjg5Nncy;Qd)r5gL6$wq9-{iJL z=gSC&^gT(X1Hy(iy331~XtMKeFmekh$2og7wU%;89u$MdI?1?e9;Q(iD1?wT%c7J2 zx{hV~H2Esu);>{!Zj!Y%zd#Ik{>%`tDjqIL)nuhxFcvGd<#Pzp&(|}{+&I$drdPA%YqR)6>(MgubZdJwO^Wt4fsJMEx4>Ovp)4u8L>m*3+g7Y!~>^5E{)L zB?<3+OoJG~Ybw0o{di~kY>%LBcM$`_PW{;9=#1py_lkn2ID-#xYjgeVV$_ zqw&y&Lo+?oR{(*5yyiBrWdR-ilAau1;y|d^S6?AsO~Nd}hPhab)REeNhIu54Fnf*g zZ1&k;ZCEvuKU6mb;;eH;#NS!p<(R(UFD9E-_QI%JJ>~LLy>1Dm+Gpiza^u7)JzNc+ zSgh4DOB~5MBVMQ~JDPE(b5C_`gFJ_6VA?6ic=5SvYbZ+{osaq`TowPCPi57JYv{%e z!bX9sPYyBEkiT0bA8v9u4wt8Sy^o-Zh)A^-jRpQ~OxgN91ch^r(P5i zZ`%W6d4{*7*}l8akUCP7_k=I&k;$PM!3t(x1Em%sbNYn!6xSBXKx9TSYY3tJl;pmk z2nolb{x}mLPfnbq)wd7o=wMCQ&j?-oI;+(B;?cE>Ao^GDj-M2RmuHtIsP;+q`DPVU z%4B_(i^p==#Rw5y=>9o}Z$Es>Et6r0M&iNEKa3`Gj#Ld$J-U zVKSu|w>CN)iP?g3Ow9U}Oan2Ipnwobq~oJsvrOFPWKhpv^;Jt_1VY11iPS15fu;BZ zB^J$VyRm6(UBY;a?OL7BPHS8PJm+vQaMSA67(v57z14mnuurO1$$o(wRmf5qv7jz- zb;q<2yC0orW*;E9Sx|sDI!vzH2pL#GB7uMyW;{hr83>H?)oAErAe(k}KGZ8uJRl#tLnn7yB@>nd^363n}1FjV(_- zM&=Tzt)U`lB&2&oQ`0ZiBsNVMmY|^ybPP#;;?cGwz@Gc=9`t#At=%ctY739~vBg2B ziC`_|nJx!S7#H$h6OO*9M<=M7Z23j8HpAxq?iw@g?*kbVRJ>gk5BlJQFRhj^#;8`F z#4W9)vOao6G%6P>8DZteFdMx*#*XHd;k8>ddyp2t;sxGhA`&9q{#o}IV8KJZF#b|z z81TJqfZasD1pmV7NSRoMlq?ondH59 zaOzH|69Zp0Q(TM5Y7JR^$m>_=*6*PBFiPQA59B4wU1Gnwz);#eL=H`?&UH%7F<9M2 zh>e|_>1Tjay0TWHTuhQ_$H|NlLO>UvBRuvxbB-VHsJ2vaP{eDIkhUxq?#9mky3~3q z#7&u9S0TDR@x7SwIv2VdJLOAB2SFX(-7o&hxoE8iC+{rW8@_6(0s1eZ1PF; z+W0#-oK3#|1v4ZCIEK8)+?*Xg9*@RQZs6NI0RvIqMouqQ8&yB8 z2rr;Z3{Utb0HAk=l4Az0Vr7}}s~<$B-}t^5)_`F>;~*DnA~t->2piqp47Hckv?fbC zNfLIHQ?kj%0EyT^Bf3b`7v`ZH&G6{*j7;Qo>iK_o#nL4{6l`Ry zinEd~83x<=gQGl$U9CBbSt9bSk5TuH9Q@JE7mCP2K*wLJI)H=)9dmoJvuD z)S@w-#M-U_p*S~)XJ`1z9;$*b0O585u{ER2@KMj_yt9~-9m#KbPIEw{{#qKLf}RUm)vq!FzJy|Jl@&S~d# zA7g)|-fRNPntkTlU)jpQ^BLL}@3)m4VSdz zqg_m!8U-Pc*?bx2ALq3V!LFR7TcI#XvRQeal2FS{4%#S1wLPzoAN9Hb=c9C3Aib>_S!_-vAmJrS<)Mdq+3UwR`M8?$%q?GZLYKyT z!4}oucFyBQ%JrdeY3lQaGkGvjO}T&hId50b5xW)Hvy*Guai}k>V<8LF1Xysxz%SiT zljjfyhy`Up8u)raoJ{8hgBIUM%<#uPiDAxLcG&R+o#cu}Zkk3elvv}djxQyyX$HlzY%J}NQwJmK-kw`Pu_e@h(fT8hoQEhvU zMoZ%Ydb0!bV=TH&ie||%J1aW48Z;Kg!{$K*T2;BN{rdyVQN~Ok-wUrPc)+_3nzk<5V@c1RW>EH^zmxwm99L7}|*oNCJ1jYWRuq|}s5Y3zC|9UV7(En>?~+VDDW{@VQBT3`t9VPRzr?c4Qd9N5|At>`e( zYtl%!(bp613&L(w;82^xE=^1DbaQRQ9GEaoYjBGOrt$NKy93yE+BIIQp=|zmc|Fx$ z4F!Wr@9a~3(5ru+36)ky)Hv z2SyF19pXJ{|JqjxZ3dk+7vwOUeI7l{#m4uLiY$K3#x787qNN)NWUP2q16e>FhrHhA ziBMGxra&zX1B}Hxwq_)}k8H>9aZXNCY#Ks3OV>6FdaaZV$ijVpGb|nU(WI)a=b4B| z=1@*E^oUpU>R%QOH5OCX4ylE*`$%5r<>pCgSC51wNOsw$8boJN%eg8}cTNBBpQ@{j zP#BMTRegSnSVDvNtr)@?5c>$9#7B(kXGo8ANEktZ9rYV{8EPx#!&cw#*Q6?$(`HD9 zgFUT3coA63hZaXrdTkDu7T5>-?KD@C$K?bTw<~2NdeNT}1_mv5sOerpMimbx=WMQC z3Nb$c>8Lk>RCASF{a_5pED<7?5?@5L0u#QJzwr%MgnW}|6oFR@TekCS3PB!JoPFZZ zs$omdGLu#BD=ZAAHm9w0AKi{>qo!!4Y<;d?ZfRr|l?VSOOu0Ppbp%g=jEub#zCp%F ztCAO++w_us`pT#pyC^^i-Q~!nBVqW}S36InqQKm(OmK8fP?aOd*aT|-VJcp!RaVQw z$Q@pETEKV=mduRUNG9+B*BS(*)DB|CU+@JgKD#51nZP4*d6_d-*Aph2I?y;b&?z^` zX*ZJ*NA@%PQHzWHPF1^*SJBj~cv)H>M3hSz9uK8+V;!z>?BX`M={^!k^gUZh5wEvb=OO$#ghjpD;G2sa`I!f7fXF;8PYf{dj+ zp~~4msTe*^R*9SSYP{yeMdD`yumrUYd+j+DoL($OD7YlmD=xL*W8#H0iSULG7|E84 z(X^g)8uc>2HFoNt4C=b_e*6`e?t_oT2cS%gExqoOi*Vxrh$lv#+p(&Zf|0Wb$kocn z#k3#icb#n59UOW~*fV8?o)a{Z&W*>RZu!$`EK)nKKgV{-dv&=OWXAQv(xesBja%@3 zE>Wc?rM$%P?22w5I=a?cUG9#eHJI&1*1HTd#KY~JDIE_z>sE|*+}(@6TF^>t_i3>L zSZ1+99KtB08;b|^dWw&A0l6Vd(5RY&$ndfV36|SAeD{n`GwKDZh6jg@5VI3DSUN>J zJihnr{>lu_aT@rk44_b)HLt+a{svBzza@WG+1yo#d{$ViVZt;aBZS-hMM#}gBhOmX zEZ$h5a1PBCQIv}p5sH3Zw|;j;-2&ta15KEMOX_}&5EPa|+GD>Z(;OK3=#JrFu`+h_ z%AGN_YypYt^D0XXJL?*t#8pR?MI&$*nP4En22b_?!eX@y+Q|v;CQkRXR%GSYv~H}c zT3ql(V;A6)=5e$aX(jC@C|V?MlweAiX(}6|zke^5q0EfYo*oGBCkvgoD5#ig0W$D>6F&&EsF1d4fN(Ro~@8rU%D_~YWUoT&E zHSlu4G?y;sftB5I5=MLMezOaV_1@ZdOqZ|?W&ROsZA{^5o}wutu*r>t|17;$Xd zH(}PM)!a&v8U%zgYdf2foh!sz&r}*CtSq8ZbMSNC{5e1I_gfNDnB-WUFpi-#OqxZ) zX&jX*PhH4)rDy(*lc_VG58l`7eZi=P*j3CtYdp}PWfeo-d|OhQ_VvwYxeL(QSudV{ z&f7=HY>#zUpJ z53G`e-NG0T$W@2AFr-meG}IboNQz3{nD>1#kcLRxaLm>B37goH(@r+gl1PC5Fz)^Y zGl;O$c%C!*n$D!ZK!7{{Llz*A+Ph!A+Ij$jmdF*J3Q(YdbOdwG2ZWeEByW4OJv*o%ex zF40KPQ$Ku_#N-Z#N*FXxe9D9p<_%wE$8kHtuoIouEx1QBHegfE0O-JQ#z%h+Qfkws zwu2SQ{mYpCz)*ntY$dpVE+Zc9X z9h7w@@aPB^kMFBa!-W5JG`cHz$d4X>inYDyeM3DTz^-eYG3fl>aG$X)hRD6O`eSLS zaYYql|JJ+O|A69gKT-N(&Oahey~Kkfwc-&`+YSlwHoBl*q5D>vs{Uf718an7dd$t$ zB^%OZH0`UTyeg#gdFX-n)Ks}{1{vv zjQ)nb+d#8UC&`z-3*z4@hctrxH7BUz!NK0!W#ep~Z%n$l%d1_%>n)bkG-|ZdVDY@chLHZlMf4D3u+#{$C#v^JLeM%k#n<+s@`~7j#F^;h zIpizq7xb|DdMU|Z{MZnuZ&vgzht`)0w#FkJ04j#YG|hhrgH3h3_I8NS#!mO4N)0I1 zsf9)(DQ;EDJG$4;P@u@&2sbgI%T;(5?MDMb2D|M@<>@0hU-Ng}Krwg-Ytu*4TGX_C zp~V~&%K6pKde$HfVkG4johFTuH8j_Po*t#=90WsCW?JhlGCYu*5HCEn-CDTu|nT>o^))Ma^Biun;rdYSM+5Piyn}2$TpFxi@sw z0OaE1g1=edL`hxQ8z4bt9jZGQAlUnt(4Z~u^lbx|o$ zk7Vpy{eo3d?B*6#a3vubyFb;g+3Z7PU4g5-Wr<$j2~pwHP-85!q?1NaKP`tjH(HN+ zCYzD)t=|tgk<3`Zr!-z?I*qRrs;YjILD&`YZNqha@W_yC@#hLY&|^2%4p~Y}CW;6f z_s^iH20wNK)`q;$02jrZxcFrI;^ADF@m9E%pgmm_A zgq!qXg;+*JG%+#BYVC0!KF|?1JGme6Ev`F}+^{v}MP!$d)Lx)g4o#|SO;V@cXI7Xl zEvRUCKgdF^Q;4B$m2EpZz2S?e$`(wwgdZ1&=jZz6y)WN2Hp|)sQwC@CS;s3ka?e*& zM^p3H7>zu{@mbqMu zr}91-SsAKW`DS=B!^N5zYH@Bkhjyk&t@)}3&uAkvO~?=AwMD2(MTE|%&xY$}yb@{e z*8)s1X3C}Q-mb$+dC*i^x3c!6mHmY2*)j={8;9jf z!@HFP&BdcY=2Kgd<}Sn1@2~o)X3e1{qmhj>Ar9dBTj^+pw9J~mX22QFD4zqhlPy{3z^N=e8JjlfjX-aI9SqE-*J{V|B8FOAcQCpuD{@LXz>rB~aJ_8g`zQD>i=8wtX+H{F!OIv^Al8>mGAf)}w`&d|tkF-@v+ zjAG*8eLl``-Wr?3^h-hUVAOJ>u5}!s{g|fKjMR!7U!P_^irPIwa^)p0N5H>_d|zc! z!J5>gv&j0WW5K7Oijp1;5{0n?6~X5CT5HP7PagO9fkn7DHNl>yc|9wKx|Mwe(dnp7 zh`S-go@`l&@!F8Ctg(7!o54n7v(qjd=J2_VsxF4_jK0L?;ZS>f)ckfd@()-4jKNI1 zv7ck;S~c&*;a3!#X`y&_DrM`8p25|+0(~nS(p4mPEg6I{8mk}UaOlp-hB!Sj22R0`$Qhjudgo@rE_X{i=e$ygSx%g!455*nZYoW|ACh;V(=~q;i3`sq7 zGP7C4qAKNN^hc8DTGXz-NApHyi4O@?6;!*JQ(+wPPHs3HIax^t0Cc_b8!&j)^?Chs z2zP3uaCI}K13Vge?N13FB}V+Ag6x)4gFC#Zaf8eZuPzKZ_wKRr?a(V9E20NgG zP^&Iz%4KZSZxAx=K5ZJ#eLL7XZHX$?c~RtX+8b;iK06=oy5B@yZ^bCa`4QO1*K2sx9!K5z z`nrx4{d(ciQ;}L@;CHWf_wZ1?mC^k)#Jra%O)OfcIml4c8Dz> zB@#R0##=da0~>G!>-n&1;dGqqvDe~%+TwWG^=Lhy6V&A8f6E=9B0NKId3V>irAb3g z-N@=pp7?7=?(6Up6FWOQ81bOL&E>cehwRkTi68t$ucjRQF+d>D-xoyY&Tou5&A)F9 z{GZK`P*DC%{p}A$Y!_yH9Wr=@?tVRFJ_X}W&4E1sl$E#&zu)(~FF%b+3l*Fm#kPVm z2?*dBja{muc9F;(xGxO;&ZVd1IQQ^MJ^Sh#d^~=UrjF{dj*tH=(lmoPMkHJ|;YS=%~ZXM92V+ zfi|VgIO)ocYfdJf?zNH#`|FNm)Ld^IXnxF+yd~zv6Pm=`UtQJObGIaK@3yh?^H-$y z=sYD0KV$g5of=3R806bi2v782H+YE!ihUl=`YvCmFMqo& z@G(CLb`Kw3wYR&TB-yi%WIiIq_1V;P6(3{GK*llDDEP;1Q#}cdJjH)J#os&VXA9so zJ8V~@2EOKAwp^eS5v4~ry&r$P=3k#X1nA5VT%5Yh2$qZ-qJCVVUjHtP->WcqE6)Sh zkD?L4ce-ztiTCpVFRb~gB5E6WRXmbSNHBjBc6T?gbgIxI$sr^Ec^$#@ku^T~IF$YbYa`$K5Ub07KjIsc<=YcSyQ z(H~X#?`*s)QK!`n^^}_0JIgt9fd_e9@ecy#a_gep#lmuctqPp*rrr5BA{T;M}jgUtGRd$Dzlg z!!y=2VSB#4&oRFx2~l3(`a0M-sU#H<@w@+aI`-zdcuj|jo;cvS<~w?x-`=iy#HF{Q z6eF|&P{;Y$*m5~+RX(B#30&tK+)v+zp~_YH3~JY+9e4Y^qgfty zijz?P6Qs2$wU^sdP!1_Q4>mo;N@+Aoc?-*>Y}eG@;GriNRAaCXiuuoz7I)@DpN6uH z5IYmUDi~jxiBNc1L5l}LolJ3WtC9~8u%?TG*MwUQfhk^TP*q7L%#-2}IelX9C0_Ww zwH$2&+kRwsAe<9zp6xqefPgQ3N~BN3?;b-SKc>weCZh+uW4rB{gCQKQka%9RtzjS^ z!=Za_7l`0} zCGIJi)-m4@nKE17+n)E6A3)gOoDr`lw{QQp<>O&{_*nSEi%MDG5&lAW>r|9(8W^r!dF}UK5&;b0yr{Pt@8FbBiRy}A^E1=Zt<3Zk63Zcmu3Pb{x2;7 zIxX?2Ndl@F;=P5%w%b7V)1ot|cvG3<

    {SEI|1*9xfr7zU3`a#P5%epEo)mCvERAZ_ktU`;PFiPLuGbcVn9!X3>rr}H!2A$B@a2@{7- z+S4?_Iym;YxVW7R8`aqs=)}TK*!fQ@;u)FQBXiC~;qkeHnGHBj+ncbC_IF9{X&1H* z1AB99QHKEUj*b*xvwE$&vCGb}n_=G%K@US)V?cHotdo;1VNTW8ikcelmOj|{wou89 zI)`+6#oK5QfQO;g(+VQkPY_>*GjeIS_xB2vaa}~r=_m7$6e0lNeH7Be#MfBc;`^q@ zqd(DOyx)O;PLHRozKek}^VrT(|8618^;o4cMe>T*90D<5sQF3m}LX+Js|Afe%_Apt)R z6Q+3%SDsBbeA@ZZQD9OH!v{VO78v=(3j6m6s>JRqf?5j&BN?;9B)d40`yA9<$27aH z#t9rJR;c%sd2&z~Q-5u*$42NrzV7;c7tH*%J)eoitHA@g8aS05hIaLg7QY4^;&Hwb zcIXPT9;!N2pzP{qTge1R!j-{>3{D36WabUibH4+|T4v#8k51V5j^We+@pNzp93J#` zl<5_!^?(&4sKgqQ8i==Pe_wg}3CM zS)ebO_b)BzZ)@xXqMCPZd1N^SCFzY5rS7z(Y28$9hVu+T5Rht<%h1J@0legi<_x?@#~G)hRyPsJmyp6n-hh zVHFT4?Fl%&rg6MkSZ(pOxAw+1cwXaXb+>}BkB1Gop1Rz-4-QvOKNkov!W0jFdzy7& zu3{S5Ir=ecn|;tKWejd3bv~TC_|)@y@38y&JZls8LJ%JJy`@Aa{krP%RpbR^zuo>E zHFK5oyoI53%2rMM$bQUZsrFHl??s#~6=vw@;#9alEqB(bPD5Q%caE>NY~c5%aQArs zo2~mPwddFAWacrC zC1dL~`>U5sB|nJl!(#8_K)*Hb!`^p6X9|CHho$&{4?5fpKF`0a$4!6!=KGzTYL1!L zc*gr3^4JqTa>o(mEF_M<=GKum%;OlZ8@(FkvF&HfIzcG1If$x9S<;(4(CNr@`^5^WnKEI51z854qwS2m1 zW%vAW_;@uiy1?INeY)PwiFvNuFLAom^XN3&kS)LLb`gG`|9B~J?kaJ5==Afi)i_*y zS~C!cqdCkv)`W%h_dGOspN@L(++ttF!rjpR7bG_%sAuLP_isky;1!KD0??1L9Mc1;gV>sRAm&$?O`#b1_Lf#PI9%Vy_%w6TyMSj}ZDZeqEayz~B>jRAEolhs(|Tw8MBL)RTMSXbB@no4$kpnDZyg@;v=+ zu5&FP-x>#r#p#m5N}Eac)|U$7%h-rTZlGue_kk#xHn=)#7N(ZC1~y*6_XBGJZWQBe za+0uEaupx+InnPFHwlSNLsa(Q>}Z0iA+k&+>}b#5KYXaZtsSJF zYrw$%b=$zR^_W<3z+xl9c?tL8RApZxM?)&@A9AwTH+WYNOO+Wk-B@oj^3)*@>=qKQ zcHpvi-QbP8y^U@?u7>2hXeZPf{HEDCnYq`>er&y5eJ=KM!<*@f%$CvEStur6$;$eh z;Dsn<0V|OQSCj>cMz-!tm!KX?YnvxCujcZt zG-LfIO{<~*=O*yp|NF<#X(^|Jagv$*~9J$!Diyl!0jz zp1e!fhJQEs?*m+NU0lNa_q?AUAUgCb?P?6|+X+ZcyJoYTdb<9(PQo9>%9s8p?!Vo9 z+#eZL4NbKhB6DH?yOGiG<~J7E3-E~+*k*wL|4sr;Sot5y|D6=4f&aWEOM%{9PU2pg z)HwSO{oYk1>=!LKF^3k86fE(F;K{wQw3^hTTmG6#qO#z>NaV?sg9!qa|9j(OH=*9< z@{e|Vk$bjQw?3z;MeDyWO{&P?aWtC6p%{8GNoL@6`JdWQRo!Dq8w_+9rFJ-d7~qH2 z1dn3YHnCO(27{jv0~hSwv46a$16&pbr1n+CdmuELZ#Wo$<=OvMcE|5q8~T55)!X|W zIyv~CO|(GZ)~0E%uRpaW;@h-lhMBOAp%KpuesQpR8v5T7ej@PSLTWUpP_yAA6n27{ zn6O%~!ESF~tMgl@etHu!VcrU}j0J0pLy;I3ZW~o$p?O=xw(ERQ@gpYxuEO;{Mi437 z`gSTv&D;`nHZF&vB>Vzk$`Ojb^nZkn7$I-Hz2L8V?DhA(sS8I(f|38;75fYS5v*Ly z2tCp(lJEzX8&)n!UkuuVZ`Q z>4_&Q6LXr_8!LQ^CkV&DOGS8K)zXHQ`~MJi4(yR_U9|3wZQDu5>6jfG9oy>Ic2coz zcg%`y+qP}<=A850d;dT^Pu1GB=bU4_W3JASzyh=lhPJyE;`hg=;o1~kEkQoruF_5Kt98-U}n>a-NeP{6VtEydYtM;OGmf+ z-a}KhdZ=l!rdrcXGw_~Znf}!tME)ln_|9H$%+o+jK7&I5NwkV{8|i#?-JX!wKDWfS zu7a-$iV#UMhYfxtifaDscv-h^_75$={@bUr(r$=5kwqv%g~rc_)Rh2s_IknPOW6KY z+J@2Bi?|k9R2Gov(;G|7M^yVg)4F5({9UJs#>-G4ADs^*Z%gf*irK}vM#+Db6yH(yss24s@yS7iB zPX}d(PGhkBaSQD=K2N)PeT9?zisR_6KGJ{2hru$8oUFm|JpfwTe+>P7! z?9tmBtq=NVGk;MExF0XOr%{U-rxwGt_!xHig0)v0!`9EyJmLz(%(*Hn?0z{NfDm{c z=|n`yY<;vMQk5J!BSRW{*4B*4kb>INYx9fGHN?^gxKHHJkK*E-^ftp9 zVqu>pPa^bmZS}(a_u6WS$$w1So8VWWSKYpM|4o-@cbIjKm6_3f#!fJJ)j;>>^iP21 z1`XP%I2$N49VtrrEha-QvCps99vZ=@Ao7@t!R_55fTQu(o#WudCN#zKr%wYeS;9WL z>`~c#0p=C-e@o$EQG|D=sdTtq(Y|*gx~v0L1GZ8fFcbfJoy13%^4>e+XnSa)`~Ws; zyxP8;iHu8VBK4D^An0p7bbq%t#U8EUjSMnA#B_4mIl7)DH20qektiQL7huaA(DrDA zNkzVSokK*nKIJ!kWW#^V%Ru#G<#fe+R5YC=MS|*S>jz4B@n$oS zkpAT%ZE*1L0D%lNvcqGChu`YyX95zVa*!NCCp#Vb@d|cO7^PwYY|*byJKr26cQz2T zGtVV6LhK8|j+@<{8}s@i4u#Hps6YgvqzX_5C=2iKN~7nQmNvs-4R^nqYtJKnTETyu zLX(1l7_DXzKk`f+0 zn7y|GJn8U_JI_rAwhJhzScM96pyn5<3vT%!Z2%;wTPb;Z|De&y7ZFc9UOv>B{p%*D zPf+FaiQ6P5F8`W@pW=KEqkp{}8+`E_Jm7m>;@#L~(JW2KU_J%%%V0z)lE%(S*f}0) zgCenA`wMHS`{Ys6;x@y?cEMn$ALQeupy#af7)NVjG2hEj=F4;0U}j&SdEA%R@TE9I zK-fS!6#i3N$V4x};Zh{i_Dr+Y0%VIIzY^e^?%Qx#znDWs`jpmJT1`(&MI4-Kyvwcf-99>|jiZChAunvR=oA z6;?+>r`zXax607W1fuh1$=mhS#b7i^fLPrc|F-_*s}O>J4J=v=|BP^7X>EvZ^LA5B z(MV;dfUQkBkD-_{P25GP>V*!|0k7S!Mj+rcF!d{%RgJI~p$-58{X-MekPx|W+Gd9f zzWV_9I-CGR!v8+%OT}0Wu12@4vWBw+`9doHDM^I%|4k3S?bI%5d+vL{77!`NnsBi^ zIrPSi{{4eAdK^x1>0m{)RS@YtTz0j|)(o<2D=luL^=($RZas^h47$|2`--N(*l8}Ka=K~v>gvz7 zD8oPN8IW-c*dyBxER*eoi}@1`9R!YjhK!7A|N9|0!l(Az`MTME-SSwg|4Fd#MWL84 zR-ON-BlBc6XKmueFt2RsxHP{~E`n%+04?wD#Az}^`l;GjTB8O_zu>FE9NVRD*M4cG zEs12btd;ccpO0N_!z1mndKo~|ai4aHE=m6OYts`C7klC$*G$PgB{N${Rkuo}O~HQ$rszuzB(2~?BmeQaZ9_4S8x zzTNsfh1Yy^C9b*|O7*W&>$7`6S_@qrDH|PC7(j=|&mNsz){F3$iZPZ2ON@Z zJGZEGy3|gSsE*#k+76ctHSmAoTJXHVnl$x;vk|4;75{aWeyc?fky!SE2@^83dMx<; z3~z~@FkcrBPR9sWm~S0zC)<8ZVR>E&!jnX5M9yEXj7-YF8E0|v-2hwd-Zs6^1MT4p zG?0NgV$qHJf7Fvt18csq;22BG7EUj2!kf-IX({*628Z@7_U+qQ{k|?^{Vh3}^XmXT zPr2*q2psNmh1_PrYJS>S-^~tV-VrA=-DO1e-27f6R43V}gycnM8%d$DCI*CJAV!9c zXmL66Y5`fe7rH4eeU0%r7NU_#Iu#C_=D$W%8-NmcpyAD$@b_e0Zazs=#=}w zQm9U$eCPA+akH1ua~m41f5+cxo^C?F-E{T(At12caP(kGr66jUnR2_hT+jOr1TQcm zA{p1ojVznPU0Nr363x80FsY837m&wYkrqQxssXQg-UfXrB}A*bxrfz)Bf?YH3^_fA zl`-np#0jYLn7?6#8{Jv}{MS$~La0<1gQ!&;bbrZcGy)|*qow&G6BFSM4ot4+5I^vk zBqhhi#?VO||vAExh(Jow^W z<^VX-)F0P+_V>}>HacG^l2jz0(mP*J&5bK4PO#=r(sIC6UDVQ4ObOd6!ev+an)5R;Q4j|#&>Uv>Aup= z7FxIA78;e_SIq%RhZ9O%pOAFVwf_i(5(*YY$Q?R7EFnL=_VBV1xU{g{Q*dnjHoEzW zIz~&k`}z3m14Y!GWPCY*V)JDEx5Ld^<<=X}(Af+edsDQxr)OC{0rO{Z65Zd43=yI7 zMSJ-KTA((s0iwyF$rifEC{2SNTeishJl7ig@mtKkl7+JLA%?QC6L*PH^A@Tb>j70y zDZ0L%ZCUTXFjd!Xvs;BdAC;}bJ53dX!Khy+fESW4G-|_pte^-9CRo|fR+EhBEc(zS z%%c`YWfVp0byje9U=+6;g;^@O_wP|?2^z%9>voO?IYXqJ^mbsfj#AHjbz1vNC6LMk zl~!he?-ysd&$G`5Wx@#SKkvT9YOiA5Ga4z=hW5a8b!R{571b7aGSsrhu7!?;^ODE~ zV=sVF%(KCtN*B^NHUj1%CpQKQ!P1j?>QW_t;UD&+oAWg?8nm3U{f-Ec3i#8mP?fH@ zCJNz8Zl9U92v&Zx%3}2i0w&f7&jsM}c!43D`0V4MPDffIQVa5;d1|5@cs*-9JQ>!> z83j&fM>09oVd<5VPXQ2(j1m79TFbsy*Ls!iY35oE=i^`7MFcAmYI6Zm&O|IzKa#ZG zZ{S)B3ue=v3naD{j9>dFS~aAatoNG7=#54$G0U9V?DnXl+PuNCpHn;Y5{Wi=>{N8B zx({!+Dm@JIKeHM1M-TMhTt3H5kzv8-P#jq{B!dzcj-?w-Zg_k! zNwzJQWRh?vU{uIbvbngUC0WTlj^>T$X*exU;B##lsSkaT!o!ee;W@0VD$K+{xScN0 zdal9Z-bwAL-i}~iZ9ndXmae;mBpXn9*P-qJOkT%eCmT8dFA3VPcbub(?wwTVrugqh z;owjH&~r5+eK>VE`0ldps&V!Iq&DZLGpB%+3p7KRHBis*SSR8=tj@?Pc|r`*!Lxsx zalfpCe}y}}ohn>h;r<#+4@-N_z-~W2p64PT0HllP^k%I@IXf{He3^PdYibDQGE6DX3?66XWQs|{;>qAi&l=d>eBIu7Ik8wvTon8HuA*P9xS_5&>hc6- z&}S_X2N>~%_1qfM&j)1X4%#02dDJ@wE(A~~+CEK{J$=v&Za+e9-v(9BUiR67;KJM=FaZI5 zDtnZFjQ9CNyqB?r&D51-szC91l|F^ZOPi;czZhEPS@8kkb`3R@{xX136=-ZVq2C{{ z+b_0{uc6mIcK~l*S-2br0m1%10LJ>ULZ*^_(XEEzghjIfPj2_nXWOT1Zo2kq<@1@`(FVKEE4xJ( zs*ge~5AB%)deojJeU8N}!Z<#qz5thD)qfFls1Bk{o9-tOjY3pI|-&-TX2g z9{wcd^L&|G(T?i#sQYg5HevJTv=>b{*oc@t*x0&yt@<&j+m%G8eWk{yWmer5@9*RV z7OtTPYCJZ{u-mWN8NI%Way3*ID2YuBz2R`{KozDj!+qAPjW`f1nHZ}vMoa*6+{k*E z)<|V41f`C>Zx65ga>M*I5znyO`T5!z@%msHD3@f2nO?WmW^jvRvz&H&sMz#5t=ltn zrBa-1%zEch2c^EGQ2$C3ftswN zhIGU=jo1EQLtcpQXmP``@7!q7+lwEKn|-LdAJh-)Zv0BAU%JdEasz@(?!J4&S!Vsn z{5XGyTK6aeZ!oWi!4+FZipEg5_K{$5Zzy2tHv^v=ME1*^Ec6RK?N}lbw8+_>LvW_$ zrY-vKs+Oyj?%S^=Gr_heeVlKRo!6W^?u$`{D+_8BBpLnOIKN3u2PMAH*GZk<`u0>!lv zT0s_91%QZoujMx`TKlh%SZsx?&F$@}leEm7pv8V;OU= z7K0)w94l19)}CA5FrR%onWJ~Y??pL&-`aB1jHUhgMdI$U#y?i`!=4oTUf_adPIsmk%YnbTS-u{nAC?juH{9epy!Qt+V5I)N1_=v|}(+*ni4!=(7 zcDCkIv=qSf+MC47U9Ck8&B+lw>2*;g(q9~6z!C&|I5>q-p|`q#5b}+fjcOq#;((Q->6YHL)S+(sak3iKu{lClRcUU>8|SwHYd4nRwveWrMdmeP;jW6D9d-6L&0{J{>42y zI}&v!&#!9r^mcq~us|H@hc%7CTc%zNGj)1bnGMozR}ZPm5SXLF`ny6<9mwZ&2%xM$qB^Jc!=H^gf~7Ms{{|!#!63Q>lFdNt>^K7qosj zTlaCZi{$>DOyse%C(m;`!d`8qi1nO^W50}o<3yZb4Y|@vf^~B0yI9XAUb(9`Bvx2d z6nMv(9y*+KpukE?$!2xZ+t;t&*Allx0v5cYBAF1A(YL~82NiIEf~90yBZ9|!0~4p+ zzSPd{AKN`%1Fx)}p!;F9rLEOn#x|JSj!xL*f-0Mp-WR|5N&0Lrd@dHu9WCvx1mXa> zg4(;(eEQ8lmMnw55osEPf^uSaXqvqrr#!DpTdA`#T^9e*h;9L#AuMx@a$pOZF(xTPem^cS1_rFMxP&iMDb7{w%<#Ay+;k|% zR=~COA}ld$YC8c5A)U8|fr?LKzY$mB?OxB49$x~f9w{FT9e)NdX1PQBkYAFWV90NH zr&sU9bd_3Zm#=~2!}{;An!L}TC!DPC<0ccY2atinI{{C7rk@BcT(7KK+R!thE}J?i ztc{D|?XMR~I}QSK6~P4VQ0M38FW%~w1wdHS>vckJe3x_CuzAc`9Lcf*BK-05p0u@O zm60~EhvQIkM=~L2F#+gOV;A@i^KaLB`1jq`Z^4(5xm7el0?=0u%^W5x1U<*eQK4Rx zQn5MhEL;Jt&elD;A5zg~%K*_{a=b|4D(~jPcnm__?7(A7S0^DCtJ6N&WolWiVx=-c z3LYqkM>9#)-0Fya2cIZMdD@@Av^O334is4)XR&X5Ho~;57_Dn+%E_hsC>RqNqR~`o zxB2-{gK<Q0u+f*%W+S5zk^! zbl|;ztP7FaUwK(>sZml&tshH)gm^rDx^GLMT(zoZ@fn}2z|>Z*wyV~YtHK(N__Tn0 zA>*gG~aVDmXsI|4wS|#7QRPhFWUk9 zI+$6cqvh=Z9f$2!)WHocIWB!PA}Hx<%*ZF)$I<8~qH_dUDmJ~*An6VO_xcZ1=J^+( z!z3)o2gXw&I@Qphg05Uzv{-d518THhPz$4rRkroJ5VOPMVjyfXnB5$`3EObrp?Oc` z+Ka2t*}fZJo&RUn4E2js1@oonsJ^;Pddr0uMJ$n>Gdrf?j}jy_aT#xn*F&_s&%>_kD%09x_S1=ceIuS-v&@$g{;z(=Z z{p|F#|9G}2R+!OaB(m@bF62)WxqIxSWM>YJrN$ot z3$I*$F$H|&R&DjzBbmxIY$r;21H%H;eqhR{r=$AMU(<8zC+AFtpEvd@cfCiiS1cN| zFYrsCi3U?uq*_9F%g?Rlv3E0%2+Q`aoU+wYWOw&K*>vJM%Q^1dIf&OPuc0sD= z`E_S250oh(n+u+iQ7h2_!F03xK@mT3f`TE014BARnyE3u%}-;#X(K}C#PzqKb4Rbv z1D4E8V=DKMF@7dzJB)BqLy34%sY*dTi(I=IN}dVlFdqmnsZaTKwA&zY zi)5<(sLF|{-GYC0B*YV}?y#c@VBYrFI+5ryZB|A#3kg$tbl)-=B>+<+9KYUnX0`2)i zyd{s7F6PCG0w^DshDHwI7(5Gp_xpo)?gypS55hOYOL=O$b)nt$-VK9Ch&^cYDG$P+ zy+pS<&2Kd88)u)q&a-u1FA&bmhg-a_%E-zbJ*@?LTf(A}lzbJAxIuTKRYeu+q+Ax3 zXTmA$w)Sf#IP;w~V!Y7K{El`e3yCKaw5F5Zc;C|g964`+v3zvP%l{wyxDn-#BJ?(g zmkDx-0SEzflr^+(VkzXhwoB-^@?f(AX0_L%tTO%rO3D7daR!$Y47c+Izpf2oC8Ttk zu9{X?H)-(I4Uqk-Q(dgTGAT_Epu!X2Pbf@_;XOFyPY5UnWA}04Hb-%#ndic&_%`z4 zjMk6h{&8BBt1tm$C%N6-?7RkK_KOv8>pbfcxrBNXL^xLub5hQxzQJdp352n82!F4; zS_#K`84{CsdagdYlbB*4PJ&tiD^vb8TzT)U?WVTav%;mC99>XPG2CA7$X&2eW4+!$ zySS6)o?t{fVu(3K5CyY*ZQ)GN?AAp$vLFf3A0}nF!bdw!M}!rbLqaw}185{N3WdQm zMO-+gtz7xNAKK?*;;aI#s*I5!O_rcHZSB;o;P6 zCZy-s;g1D=as=w(qqaUej%edWw?%zL**onaC$Me{aI{gC(4M>C0Oa=-VZ63AQI-z77Ed&{!_i)rA?xIf6gAJ8K&-PF|dV8hC0RU~cT4JtI zuT&m1_pze`l7wHPp)8^&pA%g4^{0{psSkf+;R{hNGDJf}_>o$n<*^)j(a+n}}(dF|o{ILHZ z<-j$i?i+Ik(&`W{^ss58A#u7O8AjrHwUq?Kgi)T%snPx2{hypX_yp}?5*h)=+_t}~ zig8_M(1GU+=YdQ*Kfz1Ji6MVo~jt$x=^g0F`^UHyKwcx zuve5XTP35LS>J+Q;>76=^_;%^5)sB^YCXkIjnT^G9!OVRkez*=8d1eA`{i18cN`u&de6e3KJ`uT7sGmc_8O z)jV2Sx8rl#n(F?l$m`67R4*lZSE(+_I7Ob@sx5RSUP=5;nw;Q7f`&6V?gOWdlq2ad z<)$^oY0r~=F9>$O3Y;Y;XJaM)c7DxKTFd;G)z-snNNUTb81t!nU!bJtpd4nn+`tUz zTOHG{u^yV53J&K6bJQ%-S{w82ixL;BX_vv}Y5j8;nI%?3^F4VnzghWvHWD1M=vym& zn3Cw61WLq3mbK&XQVkjCFvKlTZKZcmbmhivg371^eO)U%!YQbh5m%X(p8lj+1f+@_ z4-mmwT;rY*;@m$?HNaTEH`w{!gD2`9y#ti{Hte@NwbB4Cb)0a3Z>d>JNf(k1c{tXb;M93 z1T8#%pbui_req(iPiLjUiiU!cQa+wvW`>o#uX0Q$pk~4s>~OY7mY8ZpFO*|~ zkUR44YCxcBw1J!p{O41ZH$pN7hVd^vNw%k$I5 ziFlSGoryc8q<)ZhMT*J{zy4in0VNe0Do|D0hl9;k8C6NbFp?8@hD8$X-^uswYAzqVZx<%#9`{R^P3pg=yhi1sm3YyTT+uLjEi$$Vo zfBYbR>LYM;ZQ}}<0~V$hrYIZi_Vr0? zoo*9;R3pnq>rYyIzBdp)`zk7ZgLk(~WZ}RmJnYQw&ew1T1HD%auyy2$nyf#li2>+~ zG$O!r&osk*%z874tdC{Y3FWIl6OnQuGh1CbU!f3ZYi}LC%j9o(O8rK&g)-*w3M)`y zya~hQUA-;JH#+I%0l&x(ZlKKEwzgjxi64yW=z^}Be|X*&RXf8-o1211rW~fED7$X_}1QIt=F6$*A3!V7Le=HeGe1orMZQ6UrGy8O8$$rD1$~LwcRe2ZWF5Rsa$(1>3%t+g(s(Jg?oBqqW}>1 zI#{^=@WY7pm542kS)8G&RbSo0Bn}5_4a>S6!s4stBjO0Sc!#h`YkhdwK1$yd<+rI^VXUx5ZSPm8ZQ=`<&7R-a8LFI4d&G)$QSPOSU{MA z92JtOIxuzzmo#gp4T1iXVxX*Gu2_nQuGGGtB%}O5wk$+q;tNL{qXFI!V@MIzx0Ro2 zB8Nv;)nY7cZRJpK4H__cP^1>)&=@eA**lg*1f9Wtt(o(rz(L*bIvqrej@V9@>kLT+ z!cx(W5wWuc6>rXt)!6C8zP6desH@(?)>&7&lY2zDwia8~79oYW3&T@~IcbWCK0J@= zzC~l<@`h?6*h?3$kvT_&knH-CFC6R*GmF#F4smV?XheC)DA7cD==xNxxW)cff@Tdx z9cFYmD;7j4FzI)W^3hTH;k`lmH|_H$p?tXN(O+1pUt<3K>J_=RYMs5%7?xq$adwA& z;2J^R*{Tkml7VgXy$q-4*aR_#>HRZjN9LKpM^_@HX$98O0!!A-Y4eYXdaIbTG!xv? z%GB;4|NqgYkWQ!=nrD=RYY{fy*Dk{Q%l>LSmFV*{%7g^3C6gzpE^P6lEGP>(5(Pu& z4?9m5Hd|ZWgt=w#PfzQsTSg#JJpI{(+5Mfbv&p}s;c^TTnHm{`|4C+Ymm`Ykw^sz;`k_Cyn|AxkGggrMhmN5Ye*6C)0Um^o%Pts80IJnbDDi=f7` zEXnJ}c0LYJmv4N+G3AsUH4V#iujVjrMdE&_UV(PPkyWYHNe{{YV_bwyZl#>tqUO z8!FOdd%}{jL9{cRLKT_E!--*cca>f$9i@wtY`9seQY|EYr(mwGOmnXO1F$Y@>2j=g zvlO?dx`$Uj+L>XdmXs~cMfy-nCD+k{LgVdC9xrb%Tho7=%lkzdYR60l3-c<@P>doB zyB%C}IC;go!hz-?Oia+{Dx3ip2?Hxs*lZp2F(<7)obS08-`f1TJ^t^!dY^C_H{aLC z_IxI{mOI>&XpTV-ZB!B{;`v(E3G4C)YJ*>T?mN&@i|_Bjz_vp&;|zWmC4o2ziu1CS zJ%9|Ki!-o_&kHLuN&sMlZ70tro5>L>a_AqEA3`ky7XmjDsP%o>T_q6`V(2Stt4u{v zRMfWvZSl=`G%-a@GD9R~)Hv|1zfKs`W1i_U?3pjJ(0zJ(LtoRo2Jwxr;%{@|j7TEj z{q#wrrWUp~4=!=XD#U06i{n?6&u#GR&>aH5w2;hC#3#Y=Fx4p5?kP7#<+6HP1+bFZ z-wA{s4T#6?xTR>K=a2a8+)te@ws5pX!4j4?!KmeOgy$&Win4*0Y*h^hQ(L}CZ6UB` zML5bBtnuS%^9X1l!i>$obZLtf`j>NgE;aitI8DeT-uT1<4x#CG%c&AYus?H{!~E5J zjpbi?YP1@uOcH~5Yh&EB$&B8jM$cy!#MGAy$%&to;tXQH(Pz1$awGCkIp;PGr`c@S zHL%JFrNQy3{ioe{{&uQ{Dl_wAN>x(^gXZu4z;cH)FxXa(k(E1v>y8xAGwgT}Vq9#%!zU7geg&@4oH=8`SID-%;*G(Tp|A0OEeaMj^3dI)RZi2oixus48K zIpe{7PM1uaKth!YcH^kifgt}q`(il59bj@fRc)z=Q{p*N=_;rBBU|w%Nt%L*5(dME zGS^_LFis>e!Y{Gv{_!r)>XEOFg)b1)RCHR=u~%JN@ajl47AAP=acOb|xZq}N|Ej@J z{+QHpOHXPa=~F?dTx`dI^joJ=Qo%XHHq#wMK*&A@2|~*K+z|_=fVJV4DlaYzfni8eMDThHjA3q55Oal=7}Zjx zjQ(Lyp*ZRZ6PXdtZY{1TW+~evBShlq??7-vD~WpWXLrGnx>D^Mf^>eD@SnpfT(sg+ z^>e$AW+c4B*cE%j%h=>MWG=MV0-79I5jk2ZVs>V5eiPo@kds|{puHL0|6~gwGa*+c zJFE)cx$52Pd8H&jtz*j$2CfAUqJ^MF9Bi^gx^E;IVY}#HAm-^;xXW#XMZ)^Yu=$r) z0FuHkF6f^A;&qXo`#c?s`JE}IX>sshx>h1i9N$^iY@Rkt#o{>cu9s3;rI`n#4+O0-PWlliT^cr*geDHmB!Dl3m#w$a(KXrEF^+ z7wVcw>^>?q87*6WL&8tG>Gj3acT;bZGAGa+v z&3O%D!?eCV%@9aI{{FiY;F`LFj=m&jyyvwDqK* zOba!=-xL_2uMA(JCU1p9h}-)Ni^=l6qpC`-15>D#N)=DhJ4%uQn(0${USh!a5CJ-- zm6Ow-(@g_cY64Ruv@X7a!tWOL$Ki8~S=@C;cFSA}>Lg7NT$<{~u$wNPV!w~?6&@n@Vc;^VWI6KF zIWJp@z5_&@6n;r=x=NHw2F6-*5p8Pz#KhWULV;R3R#^(U#Ser5CN4J7OCkbuyQwL4Duhd!>;9Ar2dAlD^Ysj_g~P6H zg?Q~Zf$2iG=`9E!T_Mt-L90lewsDLyIi?&f;U&JMxfKt}$Rm3RY}ykstD~f6jQ)MQ zVHBY->%if$lc0SloiG$DlfI{QJP(}42IR4r(@_Pld&H6bNR$X)AH9J^Pj>_|==WAW zO?0X+1k_It1&beXN+rG{NE~=sN0(NUX^&0k!JdPR0a1P%X-B(q6o|I}c!I+ysXFv^7+^(>pQJ@_If0z7_!{1UHW%va-Gc?u(a zIN`JX62l;FtBVD}0ZR2&*1cnQETSdWAve?0vjvxS55%C%5~!f$Rs`PBv)2+a#Y$sg zFa2yZS`^XvG~UcpH9PD9U$Ri`iiayzxx^BgB^glZpt!*{{bybTdTIzh{HT3Kp665G z-{uq$M;Ub3MU;C!vTBbfPI>YDDN-``>Q2b`pUwo0QiCh{=yzUmYi(*Be94gM{d{M* z*k9q#h&Xa`k$!&ypVDY>;u+e_ZU<_H6U^bph3+`xpKj~xU(XC4uXn>j`9l_JVgkm` zNmPwaB?^fZj@jwnI0V{{V@I?65j!B|GopkQEAH9*=NIr2jXTT%1)C*xAc ze+<+Ukty;9l#0VniEP14^@`zDSXwv#P}>i>)2SzZjmPTK zZBz`V9-*au0GGJjFfg$LE2fZ|r9WlE^z*O~3KaCSABM=&z-uWS{!x@V&h!}8iWI$U zbj=@B-5a>K#o8hY{l4Q|lC+OqeJ}2c-3FCd=`suxlX(<>%R3o@tXBIU>eg%-g;v#d zcSd1e z*0r_82jYu|Qda6mXqAyjLz^o8jF?Jzsy&8X+9gqT<7is$NDIo8B`3Zudxrv20P69( z=~hwY?n2S#@&m3+^?y&dm)z_6ql{5Go-;S|C5QK`v(ig-ZypO}nDE?o6WHKfV4z*F z)2H+Tdei`4CBrw9+5R+7d3BBM`xv?3xPe0RYAzTx8jOYi&s!7mG?;NNF{P-Kr7ZN( z5ToGif;4^jNQjSKY;RgTT@6}Ev+m+ zHt77~3vi!=>Ld1|R8U}}70##Z5yzcg(*o&AjF{vi+&H(zp&|wGqj~Fay*n2vR4UUl zzpYc_9silRE~8B@3r$s97y`p{qfM67mcWYzd zI@^1K1mx)`q#6P1gWiN!gpajkyN4UZ^QeK3dLjeSMk}+Hlfw7F4QYd-it4ujR*4HNXQh4P-7#i@xb_-;!U`trk)!VVr+m%3Zi5XXfILl)^wFi)dPw@xN zAWfHte2UZBQwJ=2<7y`Tf2n=n3d6dAS-P-=gohU8elL&U>-oij{ts-yW$lH&>kum8 zjN`$u6*3JaYZmdE#|$w3dNaTu`Sv{bJ|1dr-NIZEYKcEEdA2d%m>B7yIP=fd;`k+$ z0Wj#v>5`!@eK=Bq8Kt_?d9n-zEX$dzG3YeKRDSVqAz?U+gE&%_C^F!H`=&c?0~%nv zBx73NmQd?efZ{EOgBe`s-Ei>q6~|V^Hq3P>SgCxGf$=1(mYTH06+xV_3L`h^s=95@ zb_uLR#2)#$!FE+A1={m6~M zI;SPb7{sJ9cVigY$P8ah5)z%89GZB;tiFHMa@*1lPkN&6hL~Y<(!+gAf^dgh zDCli3RLfxcJMd0b=5O4H3b_(Sy02^yJH`y_y#nLjyt6zv#xz zWESW6=U$Bv4z|o+onXkbDdsh`)~0zn=SL4=E#wfbxHjz2r1=%)ti@t} zIAQ0k7ehAEvX<+6C@eeBK_Sd>gj~~}pb}S~q3-`D5=xWL5?R@P@PH1B-~^p}iSqR3 zq-KdH6~38nv;jhU+<*j+R2HD8gQ+~}FbkWaq1JPEM~g8LO+wS)QCEgPpGReF@BMY# zX-A?U66fpmwt?$UMJzZr`v0+fd0Q$$wG!1>J1g8PNa#Cyfvdu)_J-~z8fVSmKZ_Aj&OQ{)=~V~JhDXOz zl77L|Xz!NR)Z1Cht5q_T0HJi-t4Q{#<=83cZw0=vv$wNDQ`DmqdaouEbrDeCot8MY zaLKy3oxI7F+6_A9q#g1ESy1Z318M@1JrGCSq?M!1Np8!i6XQ@SBnt{9DPgDRhp!RP z%a&@LXdX5ni7wVUK_##midHWmmx+LZ>riWz^UnK@6EA7O$Oos_MRXX0;-9|WSzzTV zHMZ6!Fje@!{73~$73Y5z5y0rf!U`M+`IarurZeMge2ShzKwSR2Z9)w)CB%bkSx%2&-g)s;!AWf*mj=!=PV;e5*#Vm7U-#7Z61;ombJl~xY zr+BRdxO;M3J~LiIzU!tAYe5HlF~nc`$x_TbtCgn|8)IxQ@^%$?h-@{PO9G%lw$qc6 zW4LHC3@??MfPhxSw!v!#a9_NWe;FEO5;+^0a7^;Aq=at5%pMIVG)X96*6g?%aymGJ z4r024?cB6|q~4ZTjEFKJ#uXa9XLBqsBH#a#^ko# zA>7x3=-*ejMA3Y%&Gtq^wAl=6ibza`l(g(it1WCWw`eHT=G}aLz;(E%8SiNZ>!fMJ z=N5YbS{NbCPrfA-$L~JLeWj5^mc1LCM~wSKtuNVL61#)`+rZ=N5I}ayp{!heHTAxF z)%)v(nA(rb6Bhl6equYSNllm>QqT`+=i2$N1vs2&TuRmce3AncvBD}mZQ0fUZ)?ML z2k&Y<$!p-X#B=J*kH`FDm>L60=y(H4{rZqUFm?wywW&o1sP`eyoU*{!u=}((dH@Bo zsHrJrkVoq@<>$|4Zv#&dNav`daz2deJxiGe83DdS!Brpvf?Ij5tL#BXcNK=~eTlWTgf#iOq0fcMa^khD7|r z3vtQl2Jl(%i-Tf`~aXSN)DpGn7@QQhN4aFL%TCZs(o4{1ZeS1kPlBS~0-* zSs%o6ywnVZJKDZtVd|dAFKbkJ!U_L9%(V%397FC61~=mpRq#pfbD(NB`+d^~DqC$v znb;e>pqsGGz5iXem6D5m=S7wY^nZwk?`$*EMJ0T&Rkqb8TZneRIR|H2@4LY{K-=22 z52r>L*&ZVQPxXP)x?f<1nlm&ZN&C6^dtF}0sD7Cf9GkxGx7P;C?u~KHvm~~C>ZDp4 z@lcq4Hm-6%rIHm+-nxA8geBn=I<>fKj=0biDzQ90&Wiaq!Vjqei^U0T96Q_=li*Sk zG9~zBUyHAT&Xu9YAwFTODjXd3JH}U(+xERD6~)S`+4@M`E_!0 zEjY30w$KJ6twEQa8Kyo#siwm$wt8R)S9B=Sq+ka<%wi22`9;K>EsdGx+DuSP+1d<; z^Lo2n!#Gewb!=V|D!R9#r_QoBX) z$0~*7>O;3akI#0UY*)4VBjm5$S^?vUn%kL_r%kE^)R=oI$1-X++hGkh!wh% zTGSC~bV$V2(!$8XLDirtb0&&NK{;S|vm_v|u99YWh|xM1o!ZPS$d<(9;`dO1=+&NC zY#L?@i{0!HE+?*=ez0m+v2PAqL_elae<|Q$kNWcRuuKkt2fb#lrjru5skxvccJ@OJ zedhFb*{N)0B~Ak|QhAofcmj$}|5BX&qiFNV0_*rlp19_ucqGK_JkFrz({wVkSGD7Y z_3jZqd`1~vkZcsqe|mYA^lxpDBL$uC54ypV5d_Gn1D{0_wT#TCNE>glB*kRAn?E3L z{!0@!)|{cy-fv&~k?Jk3HItrGQd1i}Xm{RGqt1SsA+)k3qqq>~_58#aT){O+jT+)? z|J>lNcKV}+UhmgI|NjrqdLISeVq58EXPWXNmmZQ}V>NiN(;X^(wI@YQeV}IsZDipop@`9VG$)-_F0ORX2@2eH|tm?9A?zK|td80<=$e(crG;Cy3FBt^V5{%K5 zaa6GS_E5_jL-dACrdZsUEuh&iYm{mGhzk&EQbN|_)?yXRNZDQ|!9&rLh9;h(G%l1{ ze6(muP7iA2i(SuWa1EBPnoAw|;RpHJpXM??c)2l4Tx&t7MT556cPume+9AS%O|Bnp zF|`u3as=J)F7QM=M|%6;kWTnsZr(5n;r(O@GAnY_ET^NU=Xe41dTp`@=X zIyHHAY{Og>oY^w#dU((sq$geiXsR`(#kUV$sU+Uh?~Xdk55fY=5UuVy$Z-DF6}f*o zmfVlg0mD%qlO5xd8l+B#-Dv|d(B@l`8PG|rh-1ElS%5R;OFCZ3aibF%w_{xJu| zOo}Da4*Gf`k9ndzc|=ucc-@%n9I918iYI>}X922gb)wAS`g}1RF6aZ#@q$P@JnixR za{BnJSGH`n60NWPcY$4&N%JOF94hN4@F1lHfHc=%mjm#zn*Qh+z4Ey>*xb1{4&Wth z?g1+^W5c?s*Ynfj#@Ky{a`{`HGyDg(S;3}DxLL4tcIMMa>iS+ zUvcTnC{FB79vsaq;tYjiY<3-bb3&x8jd+b+T}X}IYmEk%#~Ms^_!6hmFfoUqDIn_L zi8y!igkWt1O=7Ihf5TrHGkH1YzZOTy$yT=oO^Ptdt<*Rmp&rr$ij9UVw|t~RccMPM zBM8;wXkg51?%R)P;yhRqrscU$IsgtL7P{gS6wOQ)!-MlTtes9rR=_FCZrkK%D=kJi zBqM1EkLe#7uKCS{Aq#{deLNL^aMUe_ujW9gB+Cu*h%Tr`|N6BgSjP){_?ZUjs_t3bJ+w667e;&_^!U$tpGZ)_a*NR9(TR1!P8y~3^*oU@ON+jg^0a5G zU3`uqdXAoE=>aVUdi)s$7bI}g>*(Y0YW0ctMUc1O?GviaM>touBu#Ad?&OIx}n$18BZZ5Gz51*ko8~`V)FVbIo+zl9v zw~U~FJ%t?uLXHyHDS^R@_+YVyrG& z&$p@$Z3_CZvd?SH_E-$HAN%Ua;tyRGT+tX6%d(8DI1^aj^K-Lt{o206fZzVF15v%! zO!0+_WvsSAC#e9fpd4_y(M<6CK-~LaC=f-a7z@g>kM!dF^U|fnTo+A7l+xi74`kj6 z`bX3g&+mCQOS9Bstt>H@m36W8wDe?ZfvQ^uEINi#Y?$ zEfkKv$$M}AL~w!P+OEbQ1VKzTNxHoB3fZ+wC%((4x;f+ZPj+s^+PER7ge#3U9uZ$y zxwvBdF1m}##l#km>=v8r=a~*=l4j-)!c0oMBXd9YTsI`_jP^WH(BsLw-7wws&Z$i_x=0-%Ox%2I^hlRcw0Q7 z)p{4hZ`J&DnFf6+%0j{M@#x?S(!rc2t?QfLkTQg>Ry*?s178udh!RotARNwOrz6Xk zfA23_lr6144EVhY?H9JuTD5Q}TIP!E4|ayd%e0GgnNciC^7&XtfqwDSla(sC@fUa7ml*d;T@KKPoAl)%)_|>;6lsthnH{Kf`3aljO zmki*HoC4dH>Ne@lRoih{QY1Oh`>QMQMt={p(H!;H@@jdNg_t~0%?qWVKl`UF{Tjhr z$s$gZgBiPLF$K3O-W(j2WEk}y2|s^5+nSHgNZK7=5+3Py)@&ou4viEz_%R}oUOo4K&)7q0#`dhA$hur6=wuqfRQ3b`R)oS(Zir$xg*tf&2 zXRAkAXz6b@%OX9IcWQYZ>_!`3z*BQtR`=TrWzphyv2#^=ef{k=ID(#+xH7%)Rg_jN zP3linl`r_u%SVGxvc!htNrgf(HhChP0^fCV+nhIrVD07y zezBM*G`+OwsMlXy7*fksuM{L%f68)~f;e$#g^%<+bC5pW1;rXYI=yXHbdA!iPmF*J ze6B{Z{zZTyHi?I1qVv}hxTkY9N@`8hB&ZopEq!5E^fe(~o$LzaP*h3e|Ck36f0RdV z5MWfpDtO!<6$Ng3L%m;{GN?zx8^iil>Oa;ZBB3CU;jc7^8@iPV&eL;SaCULRj zPqfcPItjm0yzS>G?>?@uKRy-w3tN`vMADyv^raV z%F8q@BV4@;M`A%=1qUHVc3C_k_XZW~E|<2$6^pe=mmxs;u1@}k!0Xyq1A+!9M~f_w zXw4j`C8)LhWPcyrwp&?Q2x_vJv+VSF{6Y$46g@i-B2y|FJ%wgx_5q(3$$J`tv7hp zYA=BqY&UflhrR3AS~>sQom8N^yT;0gklKOJ{3*}kgYwQ=Cl%PJZ&h81W%B5X3S=ET z5y?56`4!qps@>x|C?Dr;#m7;95?9}eTspIKR2 z30eS|WCv){VI1m>$EVE>dQGn?^^8B^4AYRu0^P{A?`(63r7NfA*OCztJRMiU3ZC{U zWlGqVDPt&z;}@b~Pt|VsDTP!Oex5Rw$BiBY?tV_#)zgcdA&9Fn)Y1oO-G^$rDPYeJ z*&|Iki|gI3|Byq|C7U`A=U<7nck`)I2?FK~K=D=ai7)FbYq5QOLe<}=E%#&PV?o`F zlt2vl2V@hAFpWS7_n+>ButUq|=^4Li`IB$SA( zNhCNup>WEpUs->kB1wx41Oh?TU9TifJUu_2$X-r^YUJWOG{*aE^)*wfnmAqvo%!5h z#ab{khK8ugU%UP(<|puT#}%#!wYPoBAU0F|Y=^T?FNU2bIxidJm<&yIoId8P)zf;h z*bc%@pE7;sbG?&lEpoZ)n>mvUTgliW^7y+_}_tuhYPXKRK<9~BN8*% zz2>_FM;X!uAtLp%AT&_Q^Y?{_&iuDFah?cQLx{70?a@Njj(j|4Pm8M~G(;e2abl#X z>8Lmq#9bxmsXoC$7QviG?>1#?SK-7l)~8&5&+C4Vb86 z;pziM6Kv%OL^^kHnEZ|G%2(Da`s@HHBb;&sY znm#V)O4!=Au}m~8M$WCB3FOr9w={x#o{0Qr7Q$Xac~>?-*yHj0QJ*Cd&8zDZ-xnH>3oZ&&IaAi{H2b@ z1=QBS8S3~k@llKaPV|s+%~!21x#-{4^G&-)agf+~&=H=w9?qBz{Rw#NZs8LQ(O~LFL@FK}jCZ6&a zfq?AFM7?}`Dhnbv9^6cs;wq*s^ad{Z?TP08SikZtz3|M7Nw{ei2lxH${Xde*8Y*LW zsgca$*yqylW0udoCCH+RRp>OC&$*7d!hYzbO1b^V$0Zsb$I$oT#lf@(1p!?L+s3bd z*Mby;DZNVFj+6?W>PS2y4Gwoc4mE|R>)|$^pY*D4#(h3wT4Cp2LM3&&2bV4Pi5b6$ z)rkFMX?ECX|94fV*`+hGT4&fuquexCW*!yTSULO0x8C zpsfvj3&a23-kQ)%u|VZtW&B$orp`@2=ZjS9&h5L}imS8nb+oGhpo?VM)W#E?6r6;M zi?>7tW7O1{13IzhRKTW>`&GZ|9cjUav=Oak6eNi#(n05-{SEOh4=1H1l-?D{-FMI9 z3UnP}!_Cl2oZ43bY7R+t=+_tGXmY-f08HsmbQWw{0PPEX6$ID8laKumMz9iH?i^>Z z^~BGARtTU*z^MCss{EI}hVk+)!vx)^MV$8ye~y#M@yqIlvuwHIyoCqatpIehbR%`8 zS}D5fPazM#$apQTtc%j^GzgwyZ-zi`QvpthNv1lVA>>w(p_9S3|Gt>o*#iYl@#HyK zS`9O)pwu*v-n|X&3^|5K^Eu~FwIsf980&tupD;7v*Z;KXxO=&q`UGMPJ#qN^g}IMy zEuN(Iw;0j56v1SUo#QbpBKMs(@t0Q_Y-?1OjB~Nf#~JYd%VAX8j14hvF|&zE)~dJl zK5RpgxjU1f;4L$8bMeIr*C&l1M>QqSaI|XDUAnxxrR|u1zm15dKI-fI!fzic2WExTOOJxG964g+{^sO2T*B;^!hlwY-ZS?6?&j{lrUki>rwYRi+5Wb&v*V)5_|^dnp@waY1~yg`uuf*T#mZ8EcgoH0kLMQ-^}7g|*`%2wc3YO+U2sK$l&AVL z#Rdn%sMF(g-t@C)Qe*M50G}@`%l+4HoOQ1LV(bbFUjsZHPQ(QOnyw-YiRW%rx*wTZ zP@uubAA%j8l*Gt2PdAekT3YF=4>8nj@A0oZZvTGZ7Az=hd)AP|x>}1n6GZvfL=n}} zb$G_j9B@eZ)TG&sP8s$(y%zOELUGtjOXujS=o)qO2gvCXeUoG09pH*-_xF*YE7Z5$ zgV3u7cdmzFDA!qE_{W6}bX(&fBpRXUL`6aY$Ou1yKYH(^;cX{8s^W%!Ig2Y)oUc;M z+t3DxU55+5Fw@0aSUzM2ALguA<$fk@VK1HflA$ANpkBVxM$pkb!|&MqjZp`eeIZL< zsiSHj&Rx;w;9cN$ShCZFDT=W}C^X>tvI(V%D-GMh9Jn9aaQ5#XLY>`%qXfu=YHbhN z%od7NpJHNkVTXN3_{b0L!n_z1ehp>bo>&LSna&=>Qcp}x#qw#1QsiU8>Oh?U#Qo2r z1kBTa?R7(Llr^IAmM*pGlRra``L#o)1-MZ4H+>nT1b)1`RrAS+U#~G(v!m#5AI+i| zy;b`4Tu#LGTF}v@>7^&G+=5(7cH@+TsbG!BOu}0qjKd^$jKmBR?!Vf%@guCX+e_Ds zaSX@%ioWyz2I?>m5m}P0xLjYOB*h)9hm72~V!P!lZDr{NW_6zx>kx0jeq2 zVr0-iqwd)E9ivy;&YKfa=XW{NU=2GQu<$c0dAdWn%CKH6_BuZD5J(Ak;t-i_kd&jc zmA;LXh-hegh6Ons7D}}ZUo4JUms3iuZdm2;xAhc_Z$NNbkf{yT=X^gnTgu*wE9p-b zu#Sp3ys3$Q()(Km*+AvF$QY(gv>okMF=_bWY2j?f0##-~g$$*VtysLc_Vu4*K3yk8 zw%8e})}IW3X))x#xD^>y4fILys~weIoxk5$_+L1^YiKwD>7}YmA0Uz)OBNWms))RX zR>}pML%jz## z+EZ+1=kahACQ3qrgN2-@1GB213~U!nPles>tvu*1EzvN$k6}81MEHHy0bu@GrpLL` ziUG3kRs62&$n*$n!V!W6WSl5u$dL5X!e2=Px~>2PT>Vj=l9Tf~E;pB6viBn9)_wB9 z_t|ToduPo`8-1UlsP|*XScdY8Kc`E7l@y??)6mdM76 z19y%lM~g+?zGoA?L<6ZlGNXa^}dX7#$||^Ka&ug3q@N zo>rmYv9B-B%&%HutA4$>X>q?~9qt&QOwIq75bT%g?y46ltENd(NhJg^wGu4@ti}B} zD3l*a=YK;og?(U*ULS(O3f`T9NL;`p+3J6g?WS}`<~kREtF0buo}HdoUy#MjlV_mqhvt83>(Zi5kcwz5-746q- zVhMFA6ueWW?k|oka<3*!zx4n`TkKbQmWJ}}qw*H8oVFVh9GYT1K%G14sQd}*eW^f> zK|;$Re=-Prn7Ap1=Kpn6!xB&TXq8R3f(>+8-)}N%br(Bw-~9bdgu?UqAB;^*V1oYO z2{TeH#>E~n?VPnid8nR0OH1{v5}Kn0$0WR_>@DOA_%A!fbCj(HrSh>+<_M4V8s?kq zypP(#sOBch_q5kKX1=fe5$*IM>VCL!@qds;Xd?7uC{5^s(RWSsH-(E3gYh=ci4o($ ztF&lcYd6QsD0Q=3KwRRL<8=w|mVBrSQ_2v^bazzSAKp|dYn({<>)C=wy1=_L3>P`X zr2q`U?{9D2kcBSB4tD)&T}h~~02(aCit~1+)GVponb!p3RQ}L!r{9(S*r)Q5bmcaG zGwf}d(eG?MTXV?SVPOtPwv$3qJ1%x2puH#shOb5AZ<Oxgt`g8`EVsW>^HRkkVGzZG8?qB-x63|qpdn}_hZ@?8& zl6f@x1%_MKnO)!S8)BTp$Z|N~Q81n1h3-Z(W)9KMHX|Yv*U&yjg#Y*252JMIX%^}m zX4fllZd(ppkeIk~2aw|H@Syiqt16bmbM|$FJ<9iytkl|i+76Hj>;Ko)Zsw2`Vc8wC z=c-5v$xkk=1xH^kNg%mRS_}oAg;C2%?Of?}`nwRKldE*wqHXcqMLs^g|8Xi}n2qSv z)(RH+pp@{f5L_pi{gFu!2D^uEFz?(lTD6&|Dp_kM?@5;0=4d zzXpiZzuQv9B!R*aQ$6rq#*UUW_OxEPfG_x{=amYVNr8M9t&l?0#@7Y6sb1SYOVa-2 z7;Z8vgbs)K?Mmlm{V2!~$kSt>sNWolySV>I-T78cd-cc2PhIawAEV18F)!Dk?{owO zs!qB0!b}+1c45#1xLQPu)&D5%zNw`uytK1iXms_@?wfbzLZTY*LyPwUmvF)Ibib(} zh96+_ndiz>@z^D#8#k$oS9OV>bx|*C2ohB+dd8G2k=LfsRqwl*GIw*5IaW7&tBua~ ziAPFOqm1IKvvBj57MBCf^F0ff_A*@1O?(RIG8~d^Ye(sFntyirclrU4R%P_$$ zP}>W9wu4)p=c4ULmY4Bu`2Tbfby$RNH3(D;z$|0gnOJH-Cd3jecBoE`uGavoh-zDE zka1jfJ#L9Kh_GCK4)8t2`AOh$Vme^)kkGUX$OMe4=17>-;~Lnzt`NKF#QZgDg#k() zGm-ZqYwyIuCh@558A|@(m{5Y#Xrl}#`IF~iU6h!VxG(Qv-6F#T)Abu8-qmZZ|L58Q z-r#fjwHaQ_u9_RfAHiltpIa|Cm3P|k@+HBUk^-riL+1Q9E7((pd{79#XBD%lqraoRYnN-D>>i?MN=bc!BXg0^jGpp&O1*pBy!h3CRX{nzn2yT-fMrg zrz7)IN!RuSYRirdmbg%x{WO+2@0kV1;$t%KG~~{r!&0dSCz2VxjxSw9dTwHm0f5Cs z2f{9n66mms{2*KxEx+>Uv1@G~S$E<9Iq+sSVFzJapt`tD5HM7;!Ozl=47l+EcoaN4 zBqVqopj1{Yt_J+yCF#Ex7#5@l&pJe2A_$4cPyVx!GgJ5#DO@a{idx+X@p5uK?WA6+ z3gv-NL6T6qAIzqK?n+UBD@N69D9nj8c!@wHa#=>5S6gEKkK69{4maytKe;srUu` z^2(nP*@-nz;nbb?!zPN^MzXbqEy~y`K_U*jxrtwUremp9tFf<_e|O{+&C|Dkz55jI zkESgAm$IsAzlp6=7=K2mqQR|UG!|}sVXg>+h5?kxguHWdevx#!j~OeS_5(-WF;~z} zX};2CA4)l0qjW`IoT1y_Mr>KxG;rhDWc*_wEoX1!Kl%fWNkMG{>3T?ohJMx$$z)xmdSHXPxGUAM*MT4kH~0w>7=o6 zDxcvf2$9RX%%T-jr_;78))uXQ<4Kj#f=;9?UE#Z4KUxcJk@33YPY0fN90P`IO7yWi zW+=IFXpu_*0%FM_KMUy)J%EZeU#Qj3t%br1=`=(WFssB!9-5wZGDQCUtE>gNd4GV& z6L?!7d6dE_{%ix;>~vfb$!;7U1JTL&A`aGx({D`t-?ZLXJ&BJ8W`05Y?2|g?2WmKT z>~nM)3_M={IG6<9fr0it9~34BDvpEKJuk2C1`l>~qjdnMcz!!$#c2iW-PauH={?AF zXPB|m2q)@Z<#gMc`~t_L@qgb+Z?WS#I_^)2BMyWMJs-@KN~(|#7KhO#bovkyzk5Lz)$fV9K3HUwE6u*rADHKKncY&Zl%}+Jwsjv zAq6HVYw2_SV8~CvixAk2d7YHGd1`9!Q4YDG1Qzx@&%0S&!od-Xf3xn2T?kyKX-kLL z;3nblar#dyI%9CdyF}j8ICoEEb*SSc)+ym;aDIN^9V)8xuMn;aMm!Ynn>C}p^4rpx zv?yz)-|5w?KGWqfxn}2m?P$HxnP@E=`NK!1lckBIr3=4NZfdonJb<`bl`}i8<89lx zaCEVs?cGwR_h^NlkihReqN4Ma5h!?5MgR)_c#$s@#ntA_4Tj#saT?~4Dnj#C_P-o191#~_e#6xV)!k8rO?X7?e1ly4>(|u? zX%IdZ<<@T(uBRqfk=%N z(`QN{dx3}bSSWK5dx)O8qLeOusB=nzF~*euAn(GP2dKvuvGkF3yOJvr@ZBRnTWd$E zB^C(d1*ecCaZO;yWb(PdjA^6pc#AE}MU=_s{v1dDa7uut=6q=I_W{mA7{L{kNu?LKsEeKw-#cJKJ} z-?N(UiDhC)c9`PJ(~T6EU1Bz zs+Ng7BQKQUmgW$T?bvuM*bqa^2dRe1s$noGZ~LP4M0*3>CF5Cws7761YT06`Y}aLX zLM+``TSrHfElUM%{OB+J69`#SqXLSCgFqN`f85WP*V13x+SzHL%#a6GPG5dYijFBA zIZr>JN}99)ceVlx&?pFFt2Grde8WdIZNWitu;_5>SW&=oal zzzQa^b6(0xV_)1E=Y)QDfl|ym_)!Ne^}N9s_jKcFNIo?9kyb<0`>f&JQCe0bzWZ)h z%i$Jn`4MxC{jAMDD;sy=Nz4)eKN9zRsZ9~F67B<)#d!;==fogBeiW-e@fC<& z$WF#OWL6C~f5WxYlI$0qY%8k3x$iBv4l7UyniM4z44`DPTylAW@lo=kE!t_0Awh&dvnj!qkHhouBD0C&c=bk ztj^g|U+6GC2-WKMz>w?l5(^1MT3=eJHazp%#4(L%ND`pVvbE~`mxkPqd-Q}s!bV~J z9Zz7O-`gDTD3MFPF_OA012$IqXs3;hT0yY+T@NWrS{)X*T!5Q5p7gLqrtmK6ua>@k zKe&XK3Kr`J;}rDeH#w{8y?6}EIR;Rpmji~?}#d$VW{uC@>p|{?=%c4+Swk1yRv@2#q(AP26E4Wn!oEv~M)a%g;CW?Bm`!^FiU zji{WVo80$1?JCsGUVmFGy!2l#S7%=tQCEoUq?`JPD}_|cOy$B}#B3Y2*vD+xTclGK z52g#};usCO@Xs!!`gA0#wLfrHC?Uni6#(U-QrwT2kj0(Qs+Z6Z*`?jy#9R(F> ziGbBYD=$oBnU~{SfO(R?V6+2Y>g{7lHQm;pB2yXw8>VJR9rDdXv%Jf}GIaEp(GDdV zz#MYVbK%9|>B-qPr;4csiAgL-lc59$zNW`-X3wpc_0IbsbFfbHxauzb2m{@xSP8By z`#IuDfZLw0??LVr3NHqV4LyiXxK9PYd_Eb#SfN3+jYYm-c<2v?&wkNM1)u-`kxK8AY|{(N z?!rFB(Epe3310iDfgUP%suK`Mj!`R&-ZR2@B7qdT(@L-RvFmm6!`{qp4p*#8A+WFB z@T-i7Te)jf>NJQSATFL-s5s_m;3=3rLv?Ff9cKNd3?_EV(h(z}0N2*Qjda{ox7ZqX0!62|wh9VQ-yL_P&%j*a1f-dcVxnzZT9{#qlY&jAU|;@)~;{HB-J-`*7@~&k1l0Q9iKSj6-b9tIX@_mX!3+F`$+KK z#)xTn@y~BCj$JlV@}m3(pIon=yGGfo8eZRVJfre$HaDk}Yr%7)Nd2dg%FyJcQkW?E z*R#okAuSM}F98by>H36OUmGR=9L~0!QZTn<=GNTHXFiGVIq@S8h_7q&N%vA z(~UnhmQnV@eH2A=^NlBTj_<>Prst}wQE&ZC)?Cs{2G*Z7p<5y{k&=1pKy8`rHv-o3 z)v=)8^-|DZEwItPi=2}LcKIez)*)?rzK)!(z8s7r=!;BxnnO|*P`JR=BEnZ~3)$_3V zYdMob1L$O%AH@mkzr}0K1nH!?a@d7|ZTWBOt*IL>DO2{cBGYun%IIWVhs}LRkK^w> z^*fzKNA+}srPmS(REqFM=4omc&i0?JInb>N(T2J^t_H#xA6FSrKyt9cEwm8@Yn@?? zSyrmNuN31elKVV!GbXf?f1Xb4Ijs+Sm|ktLPM;cCfZ!i(Ce_MNTX@0$*{*8ODb%Rcxd8LaCYC~dVVC_AA-%C zKa_3?#HlPZQqfd=I_-Z#X}#=zmYBSY3CHi1KNEbsoi$rN>Wb=U9=o7wuy*TInUbE8O4OuZm4rKYOp2==eF{s zw|LNBK;A=?5V(&;yzKR1TKKtBSK&2)74@&TMz!2z{!ju_{@~(HYvR{*gVuFe$qdSS ztXTQ>E*J?h(VVmD3Vrl#F60hkX^qoEtE=lU?Eo>6T^I76dOy(utsGW%th}%=UhVZ; zXxxgLEL=>m|Zn=r$Rs|ev{3M}k zKT_czWN8U6{xNjaMXJ0igI7;K!pMF=+rN&PN>l|uI^>p-?3l~Z-e4?+t9B; zd>k`~dHYF~LCeFoyL)=mjo~Y*)LLUtVdVIeHY_+k9-5AELA zRrKhzGaCfA2(kxW+QI0w^^Kdkg_Uw#Bd`jl-}FxlM(vM~X3f|eUo7@HcHd(9g%|*3 zJ_@lky&jcbBaUqHBf%nc8y=QBZw$*S8v2`Dh-2QRKC!yC>Jee0(j13dtTn2^lw)#B z)Kpoip1a=%1%yaj?~4+B!gbT1f1de2fLjTYY@MRffE{hUMs=xeJN|1I(3bjf|LHxCEoSO(DMQf_LmCL z%E{v?DHprAn7~2A&|9xp?|+%344=utAta2uh9a$Z1(E4b9{d4{i+nDqUbA?^mxZf9 zoFExK^0Jye9Hqd)@5jgwfZymcusv@=bk&CTS2%thai=VWLKk^DfjpzN56Tm2YywTP ztZHTjUrzei8ABGZy~DRrLi`K<{B+AT`$0WoC>p;oj>|#2_PU#U}wWB&4lkd;1r!qqgmK<7V!;etUK+&`w#+V;*lop1rLWlHgI=& z@5&$@S=wrUUEJ>zsre?qI25GXr$!TblrXV(P{Jc->Sh#y6aarI{GUe3d!6V-4czF) z7N46ZJ+?;syod7~UV;~rx!O*Um+@<`{qyd(iZ9F+u)7Y`*tke_LQRj$6hqW~vkU4l zRhBqYiOUX(?IGz4&0J#}j?0~v-!whoBMr!+eRvOW8WH+sr1n5RQgfbkC%;%5G`j=+ zVDWP&4-$|6q7Pm*ye5FYq%ZWpurb9=nFTr`t*pmjmM35Jws#&4kUR*5Nnh}PXfAT( z7%OCS=XI*o{EA~ml7CBk1zB^&KeLursA`w`8AG`T;oGY{DLa)2|Gw;DA1bakFd%YJ zo@oW1E~HcA%|jZUp4DVXljr;KV(+JyQ=zI5_JH7@?Zhd-QCysR?hs>o?sL$Qi**73 zOx{L+5+qRWrC!34U42;x@|o-Hf)Q~uaNSoN3FOmb3pX;E@vu_*vaoiK76`T18z8t$ zD3S00(l7w1l@r-p@*YfKb_xD11NzRTjKryolfeeFzv1=Mq1Y%kUDp}^b$t8d|Gdrv z^<3_iN7?p4hW3r(KE2GidWx_Xl>2*~9)lNMc%@ST1PfzG>%1HkqRcfF;SkTI{maZ| zv8-v}PxkbgEE7(LLWYsza!gjkByaGp*TBlSm93_a_D4qECS4%t=imB>HU6vpYi^gV z#XOMud=p|tpr<0-<$}%wqwk@$Dlfem%u`EPA$QbHH-5x(WRoxd`A|$50cyG76w@5D zZ<=xA{rOElHy5!YLlwolCXLdro5APhR7{BCs2K(BAd?ZPoAtmLr7(8#9v*04iXv&S zzaJzdpe~tbs-&Tbh+Ar0|K;oFB}fUIudiQt>lEZcKzAqa6{QHwGM*;z+f_+hEE88p zAT?a*pwk2?QVF**%>r9ql3dFobfrEb0PDvYw~ER&gV& zsT!pCSsP}p2nV(C*MU;Tcn@%bI()rw`O^Bvl2~ z4lOw2coDcf?so?VdDuYucNmREqBYp@mbh6(8n1IT^#>m^Bss^6sHt<$Xz3u$dPJO! zI0;%Qje=*TpdZQ$wJnRd8@+XBYM<(z4x-IkTl_H%uD=j6rLUJ&coW?FVKFj_KB94r zoL)V3{!?75Xs}Xi?*bXO=jtBhvcm=l^#Di@&1dg#5k+stT$kk{w~p*~oMlkb*@7yE z1H%mYqjP1?M1w{hJ3iN~-OQky*Yn<1x3{;?(8%GZY_9S1ne)r>6(vSr=cp*n26Ce~sD-LkHa@jvQz zaNP3o3JsMfetFE_hoW*+KBy_zMADuN>?&r8(N=+$I+$EZBd%SQx)5|~Z@2W4lkPC= zpC>=}Ey@ozyTHT72Dc`AIsEUiZQ{6|Mln5{U!GVz@)N8p6z@W^4mfn<+{eTdPf^Oh{_P)~U4Q6jHJcP2(*L1ujyNYUPS; z!VhJdhLDvkoyj=Ub9z$#*Zf3gnrf|Z>p3NJMaFm^4!~Tx1n|69CnlF#W^MZN_Vhun z{zv!|9MxJfUue?!ikht~N^*O4gL@WGdG}X?k`08t0OF!Sx_R<}ua*b7IxEz9n^4O5 zGyrPJMgMPLLsYJzROtk!DYpwu!eb^S9g*{AXZwTf+Qe6()C|Eoo!ARio`@27mPQJnIXiE%_g(`4W zda^vDxr)Ie=~_wi^H>HJNZ%gIoMkGfL0E$~$_pxE#pL>j>92tAeLA7Jd86x<)>IXe z3OY5xDPJFTG-OFUvk)OW*7tkOcb&64>Y^2!|KO_Kewj=c&A+Gab4Pav_aXf6Boe1S znwN88-);@8<7w%PV*XKEcnr3(;vM3u=JMXy)NpM&IpM8Q1Lz`Y06yT! z>#X}sYpRZ|U)FnRy;tqIRsU@Xbo^*tee=sqw=&fn6WLkPZ`;Eep6*%tpK~BvsQu5F zjtBIys2V^ayX)m+ z&zUiPIdbDFC(q~p;BI2-DrSXHpZV3TLpz)NYxA?tx?Z@!1*tY4qK{$}`qxi$? zQD*=``_Cas*%)n^)B`;2=O66P?v}Kb58OF!-`Whc^(DR#tM5)Y!Z+gBJcSRzpPe1g zcUD+)fY!5QuXVtkGf(KQq~JEUFPLh(#X}0W&3OtpnoQ~QuKTCOvZ7CpDpRym z0*#DE5FPFNx0Y=dn2GIlXkPUHEZFk|`dp&|Vi6#PnkZ&L{uu56S#LgRm2s=29A$F4 z3aK&!*sJlFRZ~)=z|BIf(&N%D9P`WdaK$5L6RwUB&($9QDsi#g^_^wgOChW3zIGg4 zn=UD$(LYi~RV1s2EgEW~X=%T*=A1z%uGSPUF=aqQaywEQ)>y%@y>SJmjFi7|FISNJ zGC|qrBzaf+voW|!j7DpCLNO7!xl-qMXyJ1}Xpq0%<=PakbP)G0)fM!K?`rhkGgsGj zJA4SU`O*WznsK|lgn3{siKv>p;!-y1DgeSwqSM$Hpv%ZgIS`SVmvfq7zIQ_2@kY%o zP;IINQssKoT3@xBzvu|ZHdSj2S5`EnGGDb`lcJuK@ z00q16+`V#D1&fF_Z<^eQ@mrCu!x+dTb&-mzd~>@F2U(|GSLfo8;~feg=Ox$ixMr1Y zbuH;^-n@=9*CWb(TBz_@us&4In%{47UNW$*O5M@t3GTUD#ywk}i@i?@^!{kbSi%y^ zMa>nU%Ka-HnFkE$HAtdfpH&@-2BZE$!BGWnfG|~ITyw`uk}{(DkfIfW?%gpq#Ka)$w1lXB*QkG`79eJY6zyi4B8W?0*og zf^$2tWZ8lSR1^cpdl$pyR>Zb2J<%A?qPT{rvy*s&Z7_Sz*EG0V%mZXH>KxTb8dx~0 z9a@=2Ox&qX^Q+RA_YzJu-bCy>_^%!x`7&@oJ!LOFbg6^DP;YJxN^5>Q5e(N&16ZQDy}F4?&v%NAaBr3|<0(RC(v9n&i2Jdc5ml@)4+@0rYl z0xmI3v_15D)_zH(kksglSW7mYgRL={J?C8yLniz3P(_gNtUp#O{WmxsQgQJ%%lO`sX4!?EOs5wP4m8;PVmfXIS`nw@a z&qkKe?n|*KA2}uT_>wj*Zre7p<4n&Zb0j8B--BTri;;dr4+5@=4#$c?MfX;CwA?LD zTZv$lqTeG;-SL^rvs}xb%cwmR6PR+Cne80MUS!+D0`?io^&Oi4DJ$8}b&vcn>xRygvd+LENb@lrA z+h`r2Qb>2x{o^;E2zo;_I?n$WQ=>jl4-FM~yr7^m8*q{I!!c`W)pmBAN9#y-C3#k_ zGo_a?k$;TxZYbn-ka;Sx(5^HlDlhwaOjul4CjaL<7dK}<)^a0Toz(N${coalSZJV= zNH$bvww5>{t7yzLOrudESszOe*Mq}e9h$4b<3LlaQ)8}~>9YX3V9Kds?uvaZQe@d} zi*J>b=i-Rb^Wls(HVg?A{4g6=h3_M?v!=gOUl&$y%{<9yC?4DO@ZDm?Ymh9vL-13L zeo$0^r0v=8UsQ>y6PbYSXkV?Uvypa!lo#6N&oUicv0SRpmWKvDFB4*j$N zc&GI0Qtt4{@t1lqpsn(#J7sw?aI$=)yra$kmy#7aMlcE*0cLWE0x*>%`;8qg)o<4BiRoUdl?j;V;QR>)Ogdfwri#`_w}Z{yTH>? zq*4k4;(c`ufp2MH0aD=Uuj#C$-$dZe-uJ2|zQbG{j_bomGMp~-&adQ>OX3GRtTL;&1P#_g?4qWub*0E{Qq+4$yX(MUy;O!VLq~7s0L5V-)m4N(Mir zO2-HxZ3L`L)8t7n?rKcg7>=>wE0o&J$6%X1e#a=Cnjs^AXGS`oX4=urIq6E>=U(Lm zHAWgt#I$01$CC-0!LJ}$Rd8D_JLNm=e1{!9!k-!Ehya(b{yU2K+P#P>>2Px^Ty&OK z$j9WeU%FgY{u7n{dq395CVp=Xan`%u#HAFCMqG{x*Av&1pQzsgk!@M*(cb7Ox~An7 zE?d(d^dW&KSL(CegLD^#njru`ZA*L=%T~BrfwT9LN!koIHe(p;XpCZ$1)|8;5SJCj zOodxbO+6pXX)%B7Y&|D{EYVwEs?=r1W-SWDOYHb;xNlsd&NVxK$CDXjQD&+n)P~{W zPA5&V0CA))j=VC_hpbl1@_d@|WsxW5#Eqw)(htX4HzieNijNJK-}1cIA$;1M6?(t) zp<4MBhJM+Hj#z)vDA-stMRU2G<}9~6TKht4dwJ@s-mhuf^>*I`ho?SAh4rusz9#u2 zoMyG{6F{)(rf^Om)JuikTVqRyjLkSdwp#D`TTRpUz=x)aHW1HGbp8*t-mNDBKU|L# zl~$K*;|tM;ib@?B<^oJl0L$R6QloL0a)=kFT(}MPY`Qwa!ttCUL>Jw4m9i zo0L7fo(9LK#~((tHnKwX?b- zs#h5%(qb)N$&50X&wdnp#S;DVF-RYw3wt)JDjuGcs1v2D;~f9xlYcO zyzVRe$#lagWBzF05vDv@Y2N=f zdTvY>t%^FZ2u+w=p9F!aD#-xllyzPXi~b(XmkCf2h1I5lk4s{v;DTC5naIlT(>(i*5dfah!sAdq| z%lg=NgWiRsRyHaS$WZM9YrcGKHAi;Q^t4>s$e^)z%D0(lFmDuAC}+4}{bLY-)>qnz zl?PeOz@9)5Q;cUCw8QYXbk!Sec@^B^^x`!$)*IWGRW_&{m-1sSf30>Lat%h~k^56%00&PY zmuqa-DGvLYKZDDHwq#Ph3uG^r8zHuLcR0nBIRvogl+_f6d&7U#@8EmF);) zxlySrna^-<|CN;Fw8`sTF~(S(F@2bMRKB&aM7`sTZaWAU$li-Y&pWJw=bvjtG8<4* z%6IRuoHRAkj5})Vd&$sCR6grF`cs7Ph-x^^FAJ(|UY=vIw+3TcrhODW3UNAOUk#v9MGEkM6nu zF~^|WlPC4fYCS&Tk|J3JAX4b3^zAmT;iKrAc*zk@t^-2Dj;H`QE2`aht}&iuRc~G) z;pox9+`dTs1y}!14uz|cQG=1*UD5dMPZ%-e>7Wmi%i~S?M6-b%>e=kguGa73tVbeM zGq9tsDbE5vnFD(r|h;1Zj_MWvu zXfqwo9wasONNjVaE6=@q&(C`CpM(Vk1%p@tG9s0-{W>p-e^aiprusLmKAqk6Gd(Pm z3)k$?*;>05vRy^)NZxUus5h%KWPu^|{r+sa4QCOd)xZ)R;%#^X<)H{3EH^F1_H~pK zFfNWYwsg3I1N`Rxo!J%raWW_Bs}~LT{pC#rF^Ze2O5a`T;SAdLl+gu{k)G_&JuvBz z`yCv;0B)qUwVN; z4O2+aCPKsCY31@-(nGfL&Fr)qCmO9g4`m z01$XmNAT}TYRU00zW=DKPdX=y31Vd>C?$|qRU}tJ{;k(CLS%*CnUrBM5 z&9$Rh=aFYha;%WiYSHYdV&&a!@y7IdG_UxV&afA6Tf?!$%5a9F3H$*P1-!t@_`3c) z!~|k1F)saT@9VWzI6z$wGhKx#ER-HVuh$TE|J`R}o#NPLk1%%2oEV*!Xu>K`S+ktYbf5aR ztU{ z{j=9^WaCfE@$i}4*SGCKx43k8#~S&+hO8{?F*RJ&{3UUn&4@YUeF*9m;m_MLz_s1p z&wzbetWjS@o2~HW`E9h#2R`Lk*F#o^hawknEl?vKL2BBefuF_CC4t6P#aYHP&zF+h zeSgSaTjq$&__DxP3`J#awd=h@OREj7ce7(EQT~A>bg5#LM0x#_VyI}^J6>2T^c#Ox zRF5i*F^q$iqnBbwbx~c=iTN1Zi*-2)&a@*pF%6U6P)x$oZ+Q3S<1N|md*u43VE+R9KpiOf2e^lzXZ8)Sz`;NOP{;QO5Y*5lP*+KS}O-#Est$ z+8&YnhrZ4`fZ)eDt$#7z1ulzJGtbB+taZxBgv~WK8NTwRXqDxVq$$v^A~gFK>+p}4 zunJNMUnAp&Z-k11J)*h=$lb){?>GQNgy_@++2-M*cE0**@|?0p=uW#VX{-aJGnjW! zjZ>cfk6dFBhI65ztQhIHk$1^RV;ZYU((*<3GsXyg)M+etj&98 zCnUhyK9s==S&&SDqZy1;Ql=4C+I6@(W@=8cKtW{g&hxu|r=-rxk)5y!ZL%#;?;rEj z$!dMXICLTssKVD#dvoYh$U1tT<6Qqb>8-GEstS`N{&E`SOMo*jOkT+m*7oK}ZV?h+ zR9OyXv>*|hIKG}r7<4U>jC~dl>kKjLdU|(Ehxuf{$x@f>Ipw4qNOkl@6}X61G99PjJfDl1HU+RSZ>OrD{ZhWx&~M~d)L&B zq}}5Ww#9r-?)#Lb{o!twnl?)y`Qk?Fgu=k_)|K_UJp0cO#c8h(h*-!C2{)~D1mWNH zJXl(grNlBiZkFhtb3)g*ONv>WBIeQ>jX&u>2>xoN>RFLGXGC63YGD}%Z!-&3FnlLS zo9NVO0vN8*OL93$p@<*B1^F7E50m^PnEI%At=Udj~JLlP5%S;no{_gWJ?$%2Y)8|J35t z;u2|+PwqNg699oSRfR^!0vm1G8ZPu<+NzRn0n8@5`D<)CSoDr8Mc z2p3xBxQ6?Xo7^@3wc>r0;Jjn@5m#Fq5+95x#?M4x8a7~o{*ZQ!Z<=w5?A43UG!3b5zTT*rS1y0=o_p}8Sb-jxj zl;5pYaXMg+Gy#H|@SR|al3M+}*ts*8X(H&)T#Ea~Uv2D$0f|$wts*Xyp50lr<5Ok_ zA#sTsk;C}UhlZK^k}6wmaQ#*P7od-L=$0m&&e{F!!?%L?fj5~nn#(wGik~IO5!QJ( zE~2D0@3W?ZSMu2xmhb*i!?`E9_g!Dh%sI@)eT{S~)g$vW`*YUqq$?8SmPN)MZSHP7 zdsO?;g~sV_GeT&C@_sq9~3FLU;QM(h)`v+t3URschlJ-i7UphFv{sh)h&0EV>*My98Q6A}%^7;2^Mcu>7Q?%a*i zQT*H>+`WHYY)s1{^+Xc1P44{dm^IpHy~RX&)PMO85DN1GG@6t}4&2)-#BrDWaHf_a zYdXc%Jt#X5Bx0)(RUF^G920Jfiln(cV#xr7F)s9j{F-E4npy8ntQ5@t8p1U?t5gQ^_VM= z+uaDH29gur%x`RV9=v9WD`qz}5U8Gs(q%c)LL6FHr5sP%Z}sWmr?`=4r${ZdWoN9c zGjm|$;z#RgM(auvb>W@#WzP3KrU<`J)z}_mB7fJr4RGwPX%SWM`4yOBYLfL&C@TGP zWg+#1wM7ghHCKX89}0QOZgM5+J}Hl*j75WdVVIDz5k-diH=vpTlPLdJ)j+kE^~+-# z_}qwY4Ty}MH^}81tu#XmFoqf@EWUyPinAwWXxQ(hl19Yv_YFG-)mh>|u~rj zdftlkkR(p2;u_AGOrD%t*`n|yce_+0v6@g{NoKY9h-K#kS6#Zx1~R-~CNmpdg z^b;(Gp(trbDa*-e?Y5o|z?%po;D3lhUx`AcIip%0UM<2yUg4mrx5NTezT^Gj?HeNEJoM4myu48M>MGr~wa=pG(rq89%$=$Ij#O37}Oli)w= zcK-^5dtyr0P>DM@nWl9zukA!u)7c3uFzw#!@l%Ui0A}j*QWo|&oHcs}nYCv30y)Fb zZvsTo8*eRoK2iCIC)0Yd*$9e?qh(lZp97oUn;K^?_sM;iTadqk6{$n^b%Yw;AKs0= zjQR&MYeK(fg$U+$8cJ3OLvh2^@QEr~Yf-PRbfEo|R{J;X5z@wRu_^`;sh9X%a-{CBsgER_Gx|UyyhAbFL8WEsW7v0y zGXtWM;`_$mBx;%(yjq4M@1hf!5fuM8vze+CgE*Dna!Dp`>h)E!lQBl8z1>jG6fTG# zbaYPJY`k1zpbzt-sgydQBqmxhBpqxa&JaJls$NES(i;Iq9S2 z*s65RsdLR2Q{5qp#@~_+@U0O4Jhar^c8lbdB_0y7^jv1dvNoxyDN~R1)Vcl98;tOu zl<$!XsCf5H-s|X<^1$80YCHb04Xh`pWF(JrCB;hSImt@kO#KpEW3$wmSF;)Z*+lRCw;4`{9y5Pu*nJMA;?F%2}3FEjhgqA{)jf*?9s84)5p zS~6suC47Mhr<@a^Ym<~u<{o~!IA1yy7t;t~Dnq3*Fkz!7*^b0W%yA$c_Uw%aPkV{? z3)6!0=T`P{5^!Go{c?@P(swqU94`aAjJC7p`!fakC>VZ3VCY>r5Vot`q9=@m;^_!b z#sH_>am5dZcHZ*wrz=V7%RE0eyb3`VR(8_T>G9u|eDS<7HS7I+H~EZL$za8s;t#QZ z+t)Pd%gg3@`F14&+CA9)xvsJ67 zCwcZl=is4??%oxi;lCFKgQiJUlrLc`%dkehE5_?0kPa$+3Y{|0K{!hAT1w<4wcYw+@tv;Q z{Bz?c5jE{i#7~w-sr=>UP{2tgYm}?Jn^RA_LOEB(X7ZP@pkgsvXOA%}C=tgQKAOQD*g86VD17E>xDV%=b%#_`~ z8lb<-`4~(vhcvxn!_dhS?Z9PZoWaR^jlk)QTHNU0@Y-*^mYenw;(f0X&=h^ z1Iqf-IrWCmn$TR}u9tMv$y88kExyh|&9@V4NFFP6Rxfmi9tqv{m6U22nNkgp!@)IN zb4DNiiSh&^!L(JmPPK#VoqzFz^D z=~aZsxA=wG+c;M`y;1w}!`1_tmXga0X`jJBuHcPxzZBSB5b+`0yQP0vQ+@q_)lu5! zLZN?RhNe*TRN|8cz8Wj%cHk&IL)0*sieKVL`2+gS3rvvEso%Z`lVi|j(40P+DAa14vH){meyiPx$-w#dw-R&=)7(wk(CU8w3Z~OD7~oJ2-6hg?n+@Py%+m!L90wwOp|G zH9KI`N2z`6JjXP^BExWWe@A9a=7RWXDVAZ$%Y%?StDv(pk!WkoX9l{xtk_G_RIZd? zssSb3?`#<{+%%TpAD8@K~&QNFrm$N)%m>jQA1NLKN zXET-s2(&AmVI`k(aASh|YttuLdkx#L3m>wxjH>tK6HS2>sNYfb@8Y6t5u&|=I)Mqr zB$u=SPABh-3=<@SCNqFPnM*f>UIBrB$(_2pe_~|k(28Aut|huWGNM=&F9hcN=1&cH zW*SCifvL%vDt;YXSX(PV&eQ)!76hl+yQ#bYv4rNDgfM}0Q|903*>YwnID65gug5!w zkHkwWIL2L*IB9lC2S4;PE$M@4C1HhpK z0doH4z;y~^c93yYbaWlL9-&tw=++p{l_rY+Ad)W(mZ6<(L__kVt$ACrma@EEJ=FZLp2_k zp?$tRinRg>9xXPU++g4ZP9LMJ;=tYo*Nzbx-gKqs9b7nz+Q`R({&wO(AWEHXx8pFW^n6Zs|KEcVs5Pjt!rl6t@A_%?ylHN)eg=Z|Rzih_2(`qt z0@=uu?@B=0xmUu(EDDre@=A+8{-Fy}Lgq(qYa?G85;X;nlwv9OAUh`ZmRd&^p=QQPZ-{jKG+@W349T^C^Hy~^ zpb&_?m`W!gcJLWj@^GhOL$zSp#6g$CP+cQ;(jc#pF`P9pTvT{NDHn>A7yY6f)@U9) zk`7nXaa&X7nA|L3C&MoTc(L&wxCP9<6!~ZzQiO{MQ%~vBj7mxUkhvgLnOOyb&SqV;!^`K2gqg3%q9M^X7rj zswS5i-7s%l;x0{!khUywU%z?$Ye%fwIjz%@SYeDF?~e}33sq227yd1R{~j+vu`-;p z%4=n0`}B1NRK3~i^n@ZX6y@y1oeTzWp|Z0mTO>1WZ3YqTDoyPxjySRqVr`{ng$TJ( zd|4C%n2=3W2q$r=jC1hdY5H$?eNTVyMoS7sEJ4G(n%mdKv*dMl-_1UI z`H9Txi8Je1bgG7PzYdedu2FGsoIBsTs0~kG$;T>eY{fg{2R5TC{nTlUZV9KvQ!6H* zIo}MG_TzAFPo8t`FFc%1q|+dKL{wXQFloqALJ@(**?B>76ja4SHI! zuEU(gcQF;s_(IiyO3n4s@ylCdX9_DTxaVgi5S}!S5pANWNB%Aro=hEKFAHrD#?--P zgGMmqDd>Xg9dUo#^FZ6HFrIiOnasG$LJH&kRVyfd0}s$nS%i92K9JSI_&~AM#t2-_ zZUdRCu2EB{o(=Cx+%YK|{2)tqqmMz#Pt$rz>DPEv3UXByfAs+?Xfv3G2HM8a(yBt_ zGhLusnldy6!_|VtL^uuUEk*fz<(HDi07I*7pUqmoH%F03a#mOuxV+p%CA@!Pc(mCK_yozO!1W#z%|upfeDq)>f&;vHxWOeYvg&$Mk<;iX zP13e;At$hDXy)RszM`Jl7oIH<(DDhRBz4puS6_xW>!}2fOQ!cpQ57yy*riR;#={A$ z`;K{7bLwrSi1s@^qsi?t2Q;5MG2c#MR7L`pr0>xPe_jwctMWhbk z4RL@En>epLse^!~yJFgqhNCSYO{Zg>8o+@|L<367$PJULeZW8z*(x{5+Z0As6qEK1 z==_8|fc+l)zhI@0JYw~7&H^ubTvMoluOr8ygp4bCU~oucxQRn1&k7u$>3)aZ>)V)i!Hu@^M7hLqn$Yps9hqlq6Bc_9!$)y; zOw-I}i->k=d!iEJ%`baiu6PcpiINR}S;$sjQ|3L6tece!nX`#QCQ0TgbDL?EtsDY^ zp0yAs6i`g7sD^Kw8JO0;TKbqZLke6eZ!dncj;`?T|;#q9;U6vY4;=u;@!SA!Oq zmK5dX#+`s@yUP=W#D`rYM=I7#h=eQP1VuGfo|;`&=vW`N>N6`u1FI<{`UOCpbx44nF4cj>D9NF4H!h z+0gdE57JwNFqw#%u-&W4qEf$dN~bn7xfkf`b!Wt&1g}`+1_=n#7RfN!PH(-SPE-&6 z_KA>upo9@jB+u%B6Jmjk^?UXZKI@T{2Jt(Y!tT!{83E2T&~LILps~@3^pR1HS$}Yw zL{uaQpl{@xKh+l>S#Z0vzL=OoKI(h$0guYaX+`AOf7=?RO_vxBj+$wu2a>h5I{0k&}dRyQPOo%NSm$-Nk%`Up%7;OUn zqrx6lJn#c4dO5chgY-4gL(B&Tv6IiThv9MYvmqDv9M2_xz{@DLW!Xt(*f>x{X}}50 z)t$A-o+9ZD{YMmzXM7V3R1o3^GCTm(l*-hJen9Soy@<#S7x#;|NORQkHHqq5S~ad5 ztJ$?iL`8~4u}L{nV&qDVBL#kjf7{+cM8!{eJGxUHklS&1fqQ?(KR;a{ELp#}w%xY_ zpyIE!F55fz-pMYe6Rn@rcRK*A10f#KNQ$)AhPy1ql-4#mvicwvq%l?nxf$bhE6~?#57}_9ANPiDQ5YN4;m(+*=YbyFmHlJ`glus zj-TJQ;jh&Q0GC1T^O)}Nblgbgna}E;VnT7rw>|vm!&lkBg6_vVCKyiW4u=%TUF+K@ z>ggQdHGeO%U%hTDP?Xj(w)jzaCCSy&Gc`SbRT)yA=+c$?34-6N=_O$P+pXlidBd9W zh>Hco7PDwczXSQznTv+;GO4@J?fRAyjb`$}u`*R*j6Y=K5)`zm zu4W!@C0{M;xR1>>iDfcm)ffwT9$0xJI&%$p`8wt&Pr4oP3%|psE{X}q+{X0T!L=fq zqE*J+Y*ZG?S?tH|vr0M{aycWqg@!V3ht8dT-~N%+dDoZhGA9xgxYEv|aj`RixWtuc z%#`n5>j8pQ1kPgTS_@D5)QtHzD5EaqWuBR9T5XBr#?cOBkR>uMwFKq$PTd<*eXn_6 zk9^GZhyjA?<;qotW4>+(2&c2%K+$@g3t2B)DxrlV;hd)v=nvyuJNZU@@olxKY%MsK z^(1wK-?%;)Ir^G(${4n_b-+2` zpSjB(_}C2`M>(R3gbLT76lGAI)F{i*QZPUcI-6&N2sMed5 z*&LZkams-nlq$0KQjugg z1em8lGK8gEq;Q6ZTmMX9XiVA;cgih0SrjpZQE74|kG&Ji{M}Ifu_%$XLT8lTsWw2L zseYN{j@*Y2KZ}>3ry6;GTdGY_IrldcL4*Nr|D>q}Xl-Ei-_A(xou8T;%uKnuqoURc^^n zxLXP4C^e@HR%|;H~-_ecW@TN8}tmDU?OoMjh_`Y7*!-Irv()He6%V4|^~ zAp{jbBG~m_lyX}@Jo)p?L*1WS=i$FW{*62EaF}+Q>v}%>e1&ce5hP)b5%^nSH>v+s zgi-l;gi24wl4W{bB(%7Esh5I{*2kZx^J3cmVIb03N72k_9x_zjyK3C`H&qqYE2DO= z5^qNs1+jLF=ex0g-4*uXpdU+uw57)LPZ*Edi^s-3`V*ubitNZ04Y6;gy-SCcSmo=KH=U`ANr~2_-UT3 zuOsANR9S4EohC8F$N0)QCxyicduJ&;thAv1?QA97i;rBn$RDVb!k`9$&)>V@cG^(~ z()<-%v;O(IlSzO7-tjo(O6#D$LX!6+inUkP%H+Imy^( z)_1iro)o5uBl57Vd^wqSB_&{s>G61+=^rUb^xT<3m3U1=EjDehyeb?oj+m6 z4v6aC+wi&tnp@9ifW3a{j$eGo`t8xikD2&>o#~FKmW6|YMxv?T(bGN8QW#y6vu9(u z;C=?p&PYYFf_qq}K~KBI5E&vlY+b1%XXAu@J`*L@^@c2--K%oqk4!fz{;w|e0_HOO z;*%-X*=G}0E-NOdfZD7$B!P>LddkR^BvGn&LXqIlLYt$W3%wV_Y=+u)a4)a@;`Wq*N{7m#4pyWOL$II?Wut$5@wlL=8ZEliDSD5^K%=3e0A*ue(M^v z=vHfs;dIr$-PhvKlA?GeM=3z{od62sLZo2o!0Wx$L-`UJL>^|4*MBK#5dbBK!;l> z=T+X&3Yra5iQF;d%fteu{A9w)m>Ga|hIUx0lcL1y#=8&7VI0#&4(=87+kV$mv-0%E z(Lh4KjtlUMKWiI&LYBvU7xVagCTRWJjo2BE-C&5caUZ=?vTlu`OP1ZboQffBFi7GpP zh1p9OjFgMrvmwokL>LI|m}c&;)O)Lf`am)1Qh2=i756?b*Q}uG9h}nkF$Zf?nt?h; z>=e|1IBuRjY|laN>pvmVOoI>vCtIE0o`Bqjp?$8QMSA|cOKDI>1=WhE`V)A`9K`Gu zf35DN3Q*}|n-iXpz*?+PnnToJ&h1YVx0UM2h)WZ?+%|*A*`pH@o9?fqjiFY11FzmP z6P{}`9g^6OE}k!7D}oQ*CED&~wAgPNAw060CPu|`&sG{DZ3cbN?+LNtXrdm(%FHL( zU7=3>FMqjjr#N=|AWc_1W6`Dkl(TonuwQ|X?{#K#QGlO4%oGc}?TXspIW;x4OzU3+ z(6u^!J;sc#y{$*HkD0gq;9mn(~}cle9!$ zwQBSq`hriPC|}h_S!v_GCXFNIzFLNYaJhJji8MvvF|Ix18%ysCwW|tc|9mIM`>J-q z2->= zJxVsCRyy=hgNO`;v9qbu7-cQ!@EPq(49$2pq0u*P#78wP5CzXkz&$|p$ngkCqmlOO zEgS|)yQRd;N@7E}kwziE;4=v>!xZ$m>{c5H6!j?dNZvVwD4GLin_n?>`#Q za0cXk3)s}|CqU!!zrX1H+8@ix^>B!Vs8%JMAR~(A-A^+~t8o=Wx7H+m1n+X8#RB@c zQyYQnk2Z*^zYsI=U&9)YCl?f{f_y5mJ`$FLbs4R!Niv!W+4^f4JocsAZlcwB4wJc< z$dX1{vN>@PkxivwEQc>1=5>9JxY}MGqE!U-(85rxif*;^qA}W@Qy{+2FHCcn>>CRz zLBq!L(7uCNw27u3-?K`JG$uc0fTVDS&Zf763uZEvYiAi5%|hjUk4!Pu%vr6;to}6K zQOvc_Z7sY}#k4Sfn}$#^?U#?*()p)qs3_&vkh>nmiG$lQp+NWP=e(&T75*W3rGteV z--TN1;A9ZO^eMGV|IAln%J(K;m4WrvblG6Q#32w=nKRIaFKxH-zp0epYTuv1s{%5+ ze**{mznQkH;i>Oa&*57o^Did9QGGN(`ET_8M;Un|`aItLzv%rBwEs$uXaB!%Fvk9G z%*B58f27l|Hm*nGTG1d`u79B9RA}pP|s_B`~2lg@4obtA14ownIBii=qAtK zEgsj3+l!2@xc$73rjHNBJb{?DlerxirfsVObbmMLwv5*A=d=d>?+;2pZv0QvEM94Q z#9L?o*|}?PkNMdIwD|h**%CH*doZzVzUw^R1^)PDoS8ohXN^PTqR52VrpW1@un?){qTcIEk6xbw3z8y`xgEnYfGHagu0f{(wI zKZf0O{0fXxDqLuA%s@i9eXkd7&o4%Kw)cZh_euPqW@dvtkJCH|bFZ6KpX~(kQ?2FU zBOM47Bb9o4^6&BFSwPoKfc^v{Do=6keaFpO*&1;Hacn>M%5zb_a`VXSsrAsp_lNph zM7QsLjt}yPALo_y;}7X)JAzB;!9l5OzAMRO;D-LQBpO6!t?Q$7dV2aQ)j zkhAjnquViCslugQjGb(v+mCk{9}S%@|8zb5dDc+ui6&-oT@SoL1n!8i9n9X+21_*I zf4uFz-Io4qb-dO=C6$Ly_xMw}rna_VEyI>A44gY(m?#yaQXGOGbQbCm_w4veE2I=+ zo9m|pX(unB!izjltNNfgUPv<}GHeWUBcBdD-%@$8*l5%4cSKKh&i!c3Q_n|gtY<)85 zy3S!GTxLWFvnE}XX?@ppjpN@xMepB=+7u9|PZ)IhWxbC@`VOS%DJ(2p363T!`e6?t zG^P~z_-A>2U|}KC!HBW1*nrb?u@YLrK!Jmtzd2nk3rQzvD9c|;(h4NLU>r0wGSbBg zffEu@?0V4~*H(@0>dezyt6#T#xZ}S*SuTCqN>G*exR@8-yV;#DA31XscvWWBUn>1* zuSi|w@YvTE<{yYI*S#Y`1Po_YsZNvOn5QQQc@yU9=!pG`bV%UO?VxnR-JPEhS^AZK zpwMfd*F5yf1qxW_xZ!d!$0O8>pWwiY&jfa_>F8H#f6Z#)R^2g$sSGI2=-e4jaE!p> z+T!YtIWA=fBxw`NJh16g_{9A#iWp4sC4VQ0&3y|+pS>Mfxtl4KD&8x3SU;Df!Lydw zl^PfvBwcKM`uitYjk$^dIY{@>IKFMn3^(3Kp#DD&QsvQ28NaxA840yEox)~|=K&F| z@5YO23tIOxxTZ3cx1g$hfXC!o??^rwg8Q$F6HfhmWFp*=DI_W)J;leb_whXC?sc zH^^+`CYc#-(G0ka`!TuM2kpgexyq_emgl8o^yHCyu72h!b+-F$W#sv+td{yQAxyHm zRw570Hw+|}EPc_>W;EGymL$e~xCdpNYHwV;uEdc}w0_44e`hlQc{78Y)#Z)qf> zNQt!I9^x53hn;7*RlWVv{3};{ra4b6 zknCp7gXMWG)cTsjWW%5C`JGlzB!Mp69* zzV~+-6z^}!oC=Z&);`Wx7_1I$JgnGwm1BjL4W10>PIkgyHY9Py`!HL_m9h-Z_@1mc zVYhsc^}_I7KY7dHj!Mi9ATtw-Jmr!tIi^XM4*xv$i^A&xcR0g_Oc_#LDH zC945#Q~vv|5BXs;c0@*t5?w6K>aW5rG0|^+X%7b6w`8O;=#?VruUherS8?Ot;=6c~ z=Es#KA%O-lk*zb=i^eZfi0$j4PFJQPBs!NCye#aQS(Jk#{%CEs%zRzV1$(2F2bf;% zEV)tow5$1Av{MKjxKm79F`?Olt|GoHs|H;2l!BvWz{^mdUhxp%q^S4kcRlaMR7hgVs z|K(SH6aV^ie}t2#Uc*25%)|J^-~Ide+BY7@Kl<(8RfQ`5;s5hbq4Cba(()?)`M>y_ z8qe=H?*HVU{VO%@)oK<0$N%+@x!q?}@z|^J*w?>}U;p3#Pc`l@A3ufP`1EJ-$^Z4& z)wuuGKl&ZD&1XLQkD;NV@%F><@WT)PHZ(Leeki(K^P2Logy1-x-@n!8w;z872lnq# z)!fI@qZl1cUU~2A`HQOMjr5n3s_uOTTxp$BZ!~e};Jz!{t*vK}&lmCGpS&M8-FO6h zcF#b1t^Ciw@DTp{BVSXM!6g9y%*Q?gjq8j4wp}bumcJK5kbcm(fBC;ZhJE{H@yhX6 zara%ftG<&vIDYc9YR4q|Uzod$nW;%EudZWqd<^N-$d&D+FQv?f5B!{mHetB_W(9AJ|4;wPd$q}Zo3&>v-@4g5Rxy2F2A3m o>f#*PzjqcspAQ-u8gD=T2Za!L6~GtH&j0`b07*qoM6N<$g5}nf!TvHbgbN2q!4pUK*#={}Q0f9hxvN95?AkY)-#~0Q!;GK4h+N3UQ!SW*xkFRuK;9fz$4n*0q~%TcI#Ql2gJMGJ1w z(R0Z*$Wd1>fH% zD=IEe9MDqu&*j4&#ji7Xw{+CNr~xFex>#3mxL+xH$=u`GOA{L#o6GlBTgU1Av#g>b z!t3x_KZLLvxbh?=mYnKa@gR_YtgBrmPAIcqYlpNvO&i;P`!QNZdbCDYiyf(BRsOdl zp_DPvK3nMMA@Qqg|JJiF3vj&lR-XVUlIu9@N)2fEiD^0&+^-9;XXieX zsh0Lk@1DQqzj(&qFt_22dv%hU&=}HuIxh%Y$BI#H?KP|}~#%THFBx|Y`UuxJO z+Z)XWeQzoyA9&^EVj@b>Px0HQayY9B1mYy{3S~L&$!KsQVtVd<4V8aV?S4kXVbai-&s>%Fv zzBereTc`Lw`UH@&>;l3SU$EU$6C{hN#(bcU>ei;n=3DLDp4lNxz9LR&n8O4CPoonM zkd=a&4RHA0Va6xiaruotZ~EHhan(IF<}R{&K2#1RWKUKw^2KNi-7LnFPdBGRh#3tVdL|~>a-C|KO{{K^zwg<9WY2?#Eg@gCa#&g} z4w9rPZ*sihaHDFYG*%h}0)Y}G8zdOE)H!=;a%L*w7tPOS8yhNmS+=rB%Hnq;WMSRg+HerFBFpSM@l)MVFdK*o_6>d^YR?u>}kKMX!Rh%{MuzPW1f zyJsvaE=sKCCPMWL^JgD)Gwj_T_)*pTOC$R`Ii-q7M!X~ZD|(&X0qx7Wj^Nqi9Uu|A z!@ioFdk`1B!KZppRP*+#x8p&^8cx0yoLB-I<7j2by1vAu=cSiiK5sOPpqg7*6POz!K_UpGHV`uH>?R1hE`{KK@33b@sW`1tx}=H}(QfiDL4`M0`}9a{N{DRicaN7p4S_OCd`#bgSC z187n{IJS!L^6&wbH*f=~nM*B$>?Zvc7GztetF!BCkuSWT}b=f{)b zed)nZY?b4a8l!uudlW5I%+{8fnhYuL zk?A?1!fl}bTcyAW4Xx3n6z=>~9NjSewr|8sBjd)%D=B9S#dxIesr*R;RqI2mB7cQJ zvy7o$OE&yRApeN-Nq|cKRTSysR8H^niG8Y#+ol@xk!F72{?N`}h4)5Luw{AfA`fJy zj576@F4iDp0!u+&yqJiG4I#7Mvw^@xw}1I%)sPEOp~>?bvD<-=ysTuC_P&QpMxi@c zUSh=nx1aB)_KQHOAx-Xs%dM>YuTovA3ZL>n`954`9jLmLS)3tKEVCLC%R48n6vcUW z;|9)$NQR6Iy%i~aZb`518#>-bZe#bRQ62Tdp@S{=`zXq#{A7un1!Z6L_M2{_!D!$6 z9~qaZB4zJFI7-h>n_bWSAkH$=h)Mjo9AcM5b+`G-bDb7nHq{d?0_PMqcvV9`8!X7f zDJV2x&^JcwT$!L*4FdfqBQ0IHCY6Ty;th1n_u37zWo+MREc1+;M4!t2FkOdBJ1vJS zrd+RMBJ+a(oc_AzaQ-+Rl^aDVLKCQ=u1#$!MKYvfppr9DlmEQI{=tNaZ>@Gbh>U_y zf%{*U*K1>=GZM8g8f*h$vT?Do7DBE2>C}puWX)&yi@#SzU!8u&9H}%#_D#;djJ?uI z74>lxl|5)xjx36+tE-b;EqtT=hQg8rvi(jB^apEK1kHfui=zb=M^*G5%N+(s+p4eT zO)mUh*KQ6r#1DT3^>EY2(OfN&U4?EP3fT+nSpIhq8|32T9?Qq=mM+8S{&*n@ z-!7UGaRS9JW|cw@x*xDH0u9RWyh7vJ+xyz@Lbtl9Zu)3=Pg}KXb@nTKuPQStsqVP- zWzwDjUGOs%a0Qt?3c9mgT!DrZ=BbbIZD8KwvX#+DN|)e*Q;0$qpU(X`xe>H#lQ1&5%!t%(%qe1^+wg< zLbq4j#%Lg^)Q~WlMpA{!T@LjOWP2>~eKMFme|4j{;xzlMagz+^Yo3mm%-WCWhK8o3 z;v?6*G2i&buFqMv+V!>X9RMkwu|0uCT;2t-fc%Bdi2SdMna^KPlkmLqj`?KQIFs8c znsn;plMNuH&ELcT_B+%0L{_-Svy60P>YDzT?(yOg_*JY)5aEK>*^`aIY{t=s+^m2uS%3B4o4eC-PmM6_z!JHIIp`B&5a_-AI6Yz4Oz@PJ zywLKC+P@#iARv&xHvg`_WFuK~XS-XVfdYVz8`GSfD+SLU?l7^zCCZE=r?^kWYpnt7 ziT(y#yKQOz!s13hh%lLvq1=Ggv6T-5^6093GAjTlat$eTuAd^R?{V)$TyXHW0?pB* zI|f}d8iOn+KtuIwK!*HlOC>KoJ;=vJbhN$QTO*h8w<>3^p9gC*V}d~VM}9CC00tWK z+2W@|==9H+m%^}*A|5S{gsBt$XRa{=mzBg!gzw0W%tHaSn~)(HHWevMS0VcLC}toTuARu&S!+ z+Zs#7cx){NXxHzzO^8_=`cB(|Pa`CjaBWmOnZHY9a+?;yA)DVr`_={SL-*2@l)ooxRey8G2xqlCQ$>?lZ}fZd#by@^s>T)xT(DDn~|9G zblaQdRZcX-)s7MLx${HxJp$7VR#K8z$Z3@6=a`4>q;|k(Guv*05ftM5EAvwb|YHM(RE?el%e_1;BC#y;GyNrTM~gRm`4 z`(6))!;`RqP1n5cBpaRGIf_CLJ3c-+DS<1{7bt4BomJa<_~aZcv}nzi=`u#&@6V~~ zXwY)BRU4|t#eHa+4yZr;?{+c{( znA7sNEssW(4tIg9vvb5xKD6T%q<7lwZova>q~ZvJO79XFpnHlED(Ls;0c6954PT#NM=_ifDJ(2=+U{6Qh;aKg>1W9V|TcV_8At8{p8BzL!a zSX@S;RVWU4?it~?@CY1OWTf7(!?F?+Gjq&E$Aw{0c~PvaMe@<8ko|kK5<`BT?nrYk z=Ux|~pYyg)=1%goh6t5KSlm}UOUf*Wh_{AzH{TA7j#iIxFfr+Af!CZh#4zvI;h<{$W{EDRp26U-M6)>%kF-CS5!iU*OQyXt{JFP8weYOG?wnWo?> zCpp$K>8V1>5L0T(m{zd2Xt3Yl5a%Y|OK z_-g3ev?%zx1oj2z=JRIE!V*bP{d{ z0{>xE8GHCt(%trDro=MT@w##`a~P4yzZeX*6Vtoxzg%luZ(9+bWbBJSE5?g=m|w`y{J`t32cRot$8%zMe;$;nx_Resq1{vxFjm6*=kqzK~}*+U1hJO7C1 z$LLAATgWI1*T$6?X6*?$&i)s-c!o&e$P!I1&%YIrG&MW5(WuU@m747P8Nc;KEtj^F zW6x@U%S|CxeP$Y!?4CzdnbW7VD7#r8CzqF(*Hdpg-bW?WtQ}yXoR?iSfGVDJ!y+Z! z+thFrMfI=S8K|NAzxw-<_iN`7vv$U(qKT)!dbCEWq}LImy7Ws*({f<(2(zv22r+s! zu1Phs35}Y(`to+TZ|rIDKA9TKIu1QFYTlXcWg_;o7zPK{4K*|18^=&78HLV}s|qzN|1)SPr${S!lH8V!zO z0#NIEz!Fbke_GxPq@>bDyEcW}UUI?~-3>$0TtmuH-iY`)rDKN8YbhlZw*E8w{6O&3 zuc0TeD%UMya~fR&Zmt+eg#>=etbeu#XE=MN?7rY9cfw$qw4h-xMg(NmrsfrV<5O|f zEPG2-+W!x96m^(LdEhtJB+O|vt>Ssf#byBd``e_>>PPFI)wl4cr81Y{tN9g#qj~bM zzqmxKfAe?EYx(RK*p06D`SY5ar9yr;7RuZoQ;9P3uXuo?DFi`3h{Va>{`~Pmb%J7* z*61R$gy`;>r$C#|3$Gt4JI0>gnWSI!{KSJM9uCj@Hz8D)l?h2%i5vZcg9&1yDEXFK zA`N>9(;qLZjOV3aq3#8_p3dLgI^k)N{0`*P{$UbJQMv-Tz!%bIGT6QApZHfB0(u$$ zOhlsalk9~)1kS>GPV$R=&X{)|BVEY0>vur#Ji&{PD`+g!B_@ZpO!2T4q*vO(YRwpX zW4q@NUy6Wf>KhR^eW+25Hs$>U2TX76vN|CVI)r}@x7?tw6WsewwXz}iK!GQ$-U#lq z)A`_6&%?(%lzN_Kw$Zxa)O`Chov9)wFM_21&?l5mj9)rm|NW;-KhL`1R8dLh66@UI zpsuS^i$!FU<=UsFjb{3jt|1#bZWeJV5+WH#llF9B4d&CG(S!{T)2Xy=Pkk$rG-U;a zT7+de&zL&`u16=@$-!^XpB`xn|2k67e7km_o-wO_CPmCW1fZV%K=DMJrVBxuTk9Yl zo>6oC4(ghk3#a?3x(lXHuGsijsEdjQo_GxWV$qh}rn?! zIrT`$D#}7@w(I2h*ZdmY5DOgqh7Iaa)>QkF@RC_@!s4|c6Yuw_7ZoXUsQEC07U;oc zRSx~w(=iNZOWCigzp=IP;>@1>5_D}=02X1rvx=^2_W8ttLcr~_+u^EB*9@9~-WT%# z%{q`F_bv`JBzWuZ)6Sk8c^D@qZdI`jr9}mGZkb-D$G*;VpsfscBpL&REPlUqYGkWKN|Jo5`T6lkThsDbb@$ciF2HIRW$H zubxdgUbfu63RPy7mV*vJCms0SEe&>%Q&NJON02PWG`T;}+|+62@d)=`c-bqzNAoxw zE~<9DvD2yF8Z3t=vFjRlEgXgVx%wKET~Qc#!i4qMhKA1$aVQ$S@!;=1e~2iu`r%qX zKV34euBJxY(=!EITJxMQN4>;(hH#ikt*cnlpyuM5G+Vn5yrXpV$eyZTP<~_oL^Ffp zSvsfPPl}T?0R)bKNq|Ci(J-s-2ae^Ov8QF;gtk1kZ0TZCDf?3PtC_cET>*_Ar zVkonyJ&HjoQ;bVEx)8k64Vnm-SQ6@dWd7bEnmhqZYHY z0#DDZ)aXRm6hR!MXJ3LEFI_km$2e*9ODl4)TDA>S;OF)pH&GcU?pe2tj$PerH~IRm zuqQXj-xcT<4xXFuKL34kFK9qlO@jTGE8|ajd~s+AwU}~m3eIa!oR6#ko5F&a{%|D= zaoOE7YQOd*1&7RqSi3k@c_SWtl}?AlaWnQ%Yan*11-)Q)&*=iW}!wQJJ#tEg9s zJ(RH+zg09lq~_?QvBw9MP>gOyzvzumAy}O+X}+SxFB=5qIlV0D8d{J@#j^p0AD$e- z_Y+<3`*!Uv2-@BWcmCf3eq<5j{rI$EgRxj4$f6=*Pre*5)?OZyN5dv)Ea}Gq`hfwk zu{|u;@qP;6kRQ93=~{J7{&{WnT5vuEE7m$urR~YfDS*m#sS5niSkWkzd3ll&ZhN+g zM0KEx$j!Y9oX8Fj&P4nB7NCTj5r6!BfvSQ4%Imd7 z6e;y;=&8b8wX}sxu=>FQ`f1C(K<=4@&RYFDHYKA`LrQVx!%pja|Rs7iUMnT#m zE$Gr?X_Q74fsK+Bw**Jni}H zwJIRnVW3y;a>%-8x;s`hM&GJ9qHg@=-#$or-jcS?ce=*Wve+ zUnP4`abCMni{ljMtFe&*QOk(tcE(D$+a7$kr?$pSKlx z6>$4s@bihC^_HVK#_v$xAC708POlJKqhH4yYTB=j(UQn~DqrGW!d+giKmhNiDjN9e zd{Mn1&`}W0Sf|%ktn|Uv-NhP*(Zlte`QdU?^|y()3$<49W@ctGCMMafw&{3EQ2>sW$Co!1}oGaGZg`!8kU(`u-3+^4!+e z<*01rVx9bWS)0f^fC-}Tn2hNe805g~%yNSCt36s}ffc#0GU%l%ZN#h?{ZG*tR zV^YQxWO@x!#z9tG=N86m?bk$w%r2Lm#|DN|xWTUSB?g%IlnIX=Nzk=;MXE$!_pTXU z-g1CQYWcWTY4a!VL-JR!-sNpR#Ao774ONn4PWHDjdDw|Zx91t#Y-L$i~< zb$@kj+=;uW0Fx7Pt{KJ)`MfmqZO5H@_E_tH`R8mGx?tB(Ge~@<6G9{G@BWFzqyi5B zn8q)l5%U;&!JgVjnFbJi89Sx==^1{x^fgASq9RoTHI{{x6gO2bMR3M&GM~=6NXrFf zEvB?WhVYlT-`g5{u0n1IZa-Wm6yG14$0M3R%)URg9e0{hx(-AxbJadovL~aBY>};cwn2VvTsJ`cwyKN z4)@1w{(d5>ET0$@yrOo2DnU``YqZ{(&qBAvQ4=u;~5!=O#X8(EA{^>PYHXdn;k~h+l}Ku z2gk@~T!rvx+hqObklssds(?_bHJSyk7#bR>-y!UaP6W`Z+KOC!LINFHYj3R5;W?gS zoC!*uQRT}T<1^Yv>cHX&M_ls&Q4)6Y;Qk-LRMIQQavb}Fbu|a9=wD&srKhz41J<*9+Jvu9y zwP$!;0ZoKvgsm(tG1g>F9n#U60%CkLm3{|!3wUe=k;*B=*Q4A96qJ)DPimY7gIKbf z*7hd3xtbe4vRf`iGisX|dxmoFc91c<`QPSH3ag_h18d!^ z?C$Q6!BVEEkFK1&Jh(EI%RIdGq79k&SfmO>&x^_(W|o&(*X~gbdB1;uZa)ggs`ULl&9hwN&*K|TG;sC1A{6m%)4;DHP;jmo5nYr2)JL4b7a3IQ;esxVq`ZlOx z-Z)XHTfJNI&hf9}PRG{s!$m+MmEnOnZwY*v2P zqI=)$tG}1zv`e@&a+>t;{}sFV4zoQ2Fxau@XWcF`9Ts zPeqDL^Ln2D)8C{Gs&h1#PW#zfUirGZlbLC6x#y=1e4n1BriJ%=yCGjt%DA~v-H=1H zyx(Sw=Z5wzso}>zPOqY!1^UY#f@QGfL`4Q_eapo&f3sHmthBh8EQK2qvg~$xez#n4 z!{t9O`Nt{N_}x2DD-A(qt)A!Ks`!GfzhUvHYRa&MIh2vF3pP#Z#GDv=XYUo}z zN|141mFzg@NYGZe8cjA7Q#=E=(MH-iFJg5pOH4X0KF;ilH=+e;aj3F3ZZ>BX$-UHf zwb`Xs$zEgf`EF%TJUXQ%$#!*V{Xbl^RaX3IN&9wjp1MSgLgmeWccjZtz3cZ}4b^Ma*XwScg(Hd+bbhZkF0 z=jPWdMNx6Y)+B0h*`v-Vmv*0yg@jn72>662BqR*1qDyb(6UmzcPtncsAND_~q3_*& zW~~BQVwNHLqXB|vZ@oFus@RtkMJDxm%4--kJ=!Kvj2o(q22=s_od(-zssfVS^66R=P{_O$$V`Acahqi*LW z9?@z}Vk)h)vP`v4MSqM`jj3i#5{uzX+g9Y=V7iSz&RYIXwu=6a8_-x+Xi9{>c}k0$ z#wTPH#W2P9W;rhn#Hj+TJa+lZ!ehmJ0<|d0&nFgQs;VATueP=xIa>b<+%I`=ZBabH zzGj|PPfye7HQ^+yIXjnZ?L<~f&(m?+M~G;8#N8WYi8^aS^#zRhIz~YmdXeHIvn%>)|+0=ds)3dYkPH1Sjt6Zi2y!NBdApzXCjzKIQQ$MZZ!MIN{ zF)`59y-ySvYPa0}b5tus(M zYN+s_^p$-Xn*Q@Q_1kZGto*h1-jJ6~{$yva#B9}PZ@$rS9cwsQVEFA=-%PavAB<3Y z3iuB&U}Kp*bmnlGUK633DOymAr$r2Aux+!Y9A;;Q{wJ*=QaS9Ci?h9EevOO9WRcc2 z$|8j@??_$_VtyVnivA|?pj|~RG#SA$WUN#UfT!`?UqJ`ICs|c`oL|CK7gX7D;%Z>U zznkLXy{|Obu{8d`Ok}clOHV{UkX%a@OD|t8&<0}8)J_j*&E18j7YeZ*%Z3qr1IM=} zyt%sN_2Y=IVZ;J?jQm0;&ff1bxKsgEyl>rOT%xSnU}mTJR9Fo4GraJ* znps&xTwfe7t=-S^ZKiWuMwRL}sWK=eQ>*1G#NOU|L++-F)G!XUOnf^$n*^Tdk3M5f zk|1VB-0>E4X8bm4_^#3xK*C$cKh!%3cJt{< zM<(Ru#B92Bq@<)LnHR0nhQ3$ko+ks0u>M$Dx3tAY-K(oHKRb?xEk?0djq>vHX|`*w zAC&;P^B<$UIULods;0H(+QLVv+?MuHfU@Q1Gk6|#V!~>&?n;ffYLl~9 z2M5Vcg$82IYF|S#+L7iKx$;1RZoZaM8yJi`;ns-DNHMXmC@)H?oqkPNtb1@>;#FK! z)^Ilg;@IOimJDSP@qw@TQL`B7&^B_WHP|Hu{gr6i3$ej`t^;6fjzPr%=y0w=kxf|* z9L!*zD`V|doIoXDWuKM6TW+IA@kGDPs}At9b%;3(Z7W(1o8h^?e*K{oAU-Zq_8C0b z#aN&rHSvhW%;D5H^|}?=&AC z#~U4bv6Xv0NYl6dr$vGq?BMOdD+)Da4F0H3!v}ieMIQYZQCZB16Tw$;F)!`Oe_EL5 zFX6Pg1URwch{~Lvp6mxi8}W?j%1vdqM<^S42S(D`|LBu8tA# zl+|O3LTj0NVIbvXe${eoD?2_ei%ZTf%_p=Ka=r2dnZjA$2(J!dA+kqzzZBv03aee+ zz&Q#>+cCD{#0pLZ^9rxTua5C!vSe<&@R*;R&{`w}>A$!xt3Z{0JvV4e6@=jo^vfij zPSh2$UuaBrcb8Ha>}{7Tq<9<>auwJyo5vpIlFqO=<(>QMrCy0keFES^Oikvw8+4m;OG3;{~-&bS| zdQzq2PFY)!M%m?86#Wy-FU0i2;Cl2wo(}O05dPn0G_i>>{ak~qrhQ5>*-hz5NsL2K*0|hUiPPwJIt)s0IEWH8HeCZrUp-HW zEHvuGb+I&|i-P^b`i#Hsjuri%=D=TMG{60~4HN&LXD)=PaggQmP=$x%0ZW9r!S-h2 z+-yik(V9KV$@N+*6bNT3W_qF|k82AZX4Z~=;ZPOH{(S5T}3JwP=zj~n+ z>xy-=%Gd8C0pu4xXGMs(bDX^~3{=^9w&&$#$-)f#8>Y6>fa?YSsq(w0a5~|2)7ME4 zfO{ZxZ#APcrzNuxnr(5K5Qqu^0ic~6@+S9Wx>~V`1Zdl%QXak;(fYNnq5fLi;K~3v z6D<21$%4Io{gK+tUGQuz7*%!Bx7R_Gb$7Ae5b55%v_H}3b$IGJPn*27gif%7&+&`0 z$)EvmzAv%?b87eWeCcNIUq}NOX}eqUaJ`7WvGa0YpFn|199i%n@$al!6w|NqCzWS= zGwpQtQYtcA1a$7`qIctb-Tlx`8$krWz?V3*+|hP(X=k9hx!!f2%IaQQFm8nNPGqSG z3fki@_Wf)XMb%vl2vnG#!E-vueGJaeCk7i0cBYrh$E36TKJPfs^&R&}Wn+Iufmyz`B`}NL4+AdC^OLz>%Xe8ulxK+Q#`0%bn$qkd| zeP>8tzfC%SO*y!4c#rWacKtQ>m+NOQUua%GxgKqquQ|NxnZg7faOZOBe+Ker1eVrZqP;>R->q>r{_Cqp zWx?*jG)1wu0bnXu1oYTE?y%?Do#8>H{pNVM&+%S_RP+H!q0{?a2|ef_+M|xwsIEl! zT0*Plj8%W6x&iC=)wOLmr%I#hM$WJQ#RblEgC@{uxX|v0Q{=3^Syz+VOc&Y?j1InZ zAy+62&kt3tp`-zU4ksPIJ9`|wu_X=YkJ&IX)TO_{f0H<6ZfOQb8Hnh<+$~yuTG31&BDdU{K_MMaW0C(iVM ztFXUMKB8g@#Wuf+ONnI{0CESSK;~``FeYtxt*z~#_p>Jvt{Y0dA8l(^n$Xc8sugXh z#b1YWlapM#{8fmhhO7&>yH&sre*z*YZVB^pKWAjfHdYH^}(*-}0o{o<9rAbwGO z`6_#Zic|BlW)G+|3T%vcKQ9-`X08ce*~ag0zMF zX3X^HatlBXk#t;2UQHK>(kCV+p0uppjjmQyRehoK+1i`$1E6Y?SNopC zXU$iL-5*CU@s~(b`Ao0cZ*&DaZ4Z+|va}36C3~Z(H~%<3q#=@XmwmCz7d$L*%xu%Rv_iJ_z6hw^A0Y36z=`= zRi?12KFav(Yp;Rf;RFm^Vi`bHFS7v8SAKfLOjLT}&_nZ8ry({~eSKCylBqF5{}UXp zUJ=5DWYz`By{VamW-I3MU{OzI&dvV0WXa66$Zrnmc6Yx{S^J2D?HnZj#l+f7DzD7} zjEF_k<&F(VdCi3E0n3p2^5sj%g=Lkc{`1(6d45@5?_c9AW^`rWXS}M^mtfI8K7PvD zn52e=``?Qv#Oxu5{zSf65l>6+-S#uRw#OGUUlIbbxoR5}1*J$A?Yu`N$$i}VY(NAt-92>jWv6Rt=;M)3USE1k!D z1w4x%=$jsch&hQu!k@{1?#BsCge=wKgO<0^Bxm8qg4;|i1G&e{?2eF@_$EBwWZ^h=BjCBt3b%P3&vtk8m3Ksll(w-HIK=22Hj!kX- z$Ni-K^}d!j*N9~7N-VChkD(B{STIuXHH=b7Foo`(^ki0be2c>Y6^0B92z_zfoTySQ~8_D8VYt1j@ zTs!zuCm)O*DUPSboOz`ML_`gXNSmgLlt}li4Aio{$Tj~k^L1`M7M}L<3VUJ8w4R9V zbI&yl=Qg6+-e_{La(6ZnYe!ZbKQLPaeThs$q1*&4a1C>Q*i3*SwEw52V7(cd;kOf zpWRpc6dgp(CwyG6V?H%Yakr`jD1U=1N8xzneEsDHEe9|yBOeX7gL#u1^1W(-MVJpK zP*2xfb%s!B{Px5khlojTOL|5jU~}t4j7tV|zAPhqdCJVfV!kt)@mR`bm6el>ZZ}Cz zU>trrlzz94EefM6?rUt1LazDk<#By?3t#$lew?DBBB1-ewfDPOf?0~)q!_RYRwqO~ zE2Vn4?5hUsw-jN|YF7Qm@n@BKc1@BXV>)2WLhg&nr;Y|SF2`34jor9B#;~28rJl@l z{WuE_)Z|vsUB9S}UjZKWL9eBA$+E@6W2ag52Es zk9kDzM7S)M8y(#;x*knScJ}%ua|?^Xx;aCZG0~gSt*tZtfATC}$$ImZGMM!m>=J>A z6l~DX1eiR@fa{$83KH>X5CW`RR#u7NPucQ#{-;oaxl$cdk_4#(-4?g9G8uNm)_L~( zvU>Y9yPe%CVj8J{DKHsOXns3a?ry!{&%q~N_V*8t*!cVe>T4)=9cpQIko>vnxY_2~ zTNrrOxjBKQ0H#~AI3+i#B%tJ^|LV>(;WmI>p;< z)O9Zd;2brUdLvu~bX1uu?B^NC`M^nlVY*O*tfXV08(auyW)jmQI>eYEeI~Dzw1hYl zO+ruQ0WM73eWOmP`KQ?aTiosPo3PU!SxpP6tfd5KW~`%WI2}KuUN4a60j6@^r^$PH z6=PfarhKsbxdnsC_^!UQ;{3$AxRJw{Tlj9wHi@o~q>;OBbX3oZW0&uyoT6fOpj2fuSu5V^VwHIfo90F0OKQZF7l@=N{9~U9( zl|{x^Tejwj3U9>n`w#=NvH&Wz=ZGdXn0LLK9w2OCm$sWTB=AzzJr38d{?@L~UQ2-G z(OINcV7udr7%jKKv(~z(GVL1#+;{Vd-;!=@pAB#Z<_*773?@dBC8Y_fWj{KhOQoW*P zsWy$dxw+HX?w3b|SNO6epcwct!&c`+(`;%7NM z-Cy|+maZ~mt$9Y5Udv+3IV1e7II|fIh8zuR-et>PQ%+5Yd>iw{1lfS>DI=_P3`V8& z%I|VXBagrva@ZtY-f}3|qLdv%>4QEAH}u-0C(m^mNXIg$IeK&yD}2vOL@3pg#sTzL zADwNmyygXGgXqi&J}N{8Q0WRG&y(DuOvZ&gw@1zGMwpD89OE!I@(t|}6OaWkKwab! zu^Df|Jr>3SNZe+y8;{|w8o|Dx1j4PVbh<7QCGSvMqX<9#_kE7!Y8>7c$ z^4!`kH%`2G*u^Y9B)SL0yZQ)0OU9nWfRS4GlAa zILEw0o_N&6TMgE-%)PGhBTDFCXAgl6djVu1{a1z;=eSppsG7k=%7$H5ld|;J-$72* z*xGgkSjqlG%6|eNKvnu*4a&3pgOk$n-p`Wo=sqV7PfJmxh5AR?w@zMw(gQ;tBmzz< zLX^8dOg!c}o%XA;FH_T8OZCVe5No-I@mUGu$Nx|^{~PxJnmsT*v%3)0X&H)@6C4PY zQ1s_#Y>U=xRls2JI7oKk;gRWAuYC|DX*M#Hs&q$gr1(D!}$A3hyXBDJG;srhMgom=k=Fi+qe@iIWRaP8*;DFxSmb8 zOh`xwQE*tR1{a8|RXJCPaI%^4&6*lYV=Te8;T5qzYt{9(_xt;Q1;7}5qo|*PjDuX2 zU6A03t|pW|#6V+adQlY!n@7<3sn;8lwkxZ~C7VeBxg(MA@vMGIQV@u?tYV_`92nNg zybC>m1%^fqL69BNnZ9;;21%X+Gq`}*SYe|FSZES+!jo>d{(5*8K)97&`2O-=J#7OY zZX^$4YE^w3bVmWGbg4CH~A zKHj(Hgz#sT0CoGkJ(9)EK5V{&~*ogTsP(b_DyCAYp@srM&46lk&w zQ{grw@@^IvFLG(oO4_Sr4SmfsezLR2f$xpR-DjX0x^w5?oa>jz z{}8D`C7NZ`M67ta9S?U%Fa}Fc>#ImgkwxGRB8+Z7AGRPx$)P+vL_|aj{`t5cl{1B# z;Et{$osW?xn7zv@O9MJD0F5{u%)f^SgyCG9i-%^@`uqSD1TXRII&3se(bOJ)3uv-C zEZqaYm@&R15}@j znNf{QA+Ll}Y^+?cj1AjjEZut08iKfnG_U*)cBUgvOw3B8?NeGXlKKBwI^Yqx15!2N znfx3QN;+@G0fYR-nI|Xz)q&-`4B;S8^4?tVpj7eX7 zAcB-I5Z^l#;K{8RcCb89pe%Azz3g(QD)i5A$67Is>x-P+kRk?)PMjhUd~0Be3o^?? z*i}uZnZYS0E~yczFW?7#o)|K`l`Da^9PW?7Pi?&Mb(h6>50ar|^k29MMrqp({t#e^ z!RmPJWdILl+4UwI4M}Jy{Jy-;{O;4O3un?VPmx0;!_P*Ffl65xnv%itgt<=Bp-!Mx2^Y@%#XWl9IUm)v7XQPSIv(XIB*| zS?43(c=gTCmB~o!s3AgP3Uf$AcWIHHDHiyu4Am>wpQ%>@d`7TA`l4&HGOq_;WDh12 zT;iT|A@d(@Rwz2L0h>XP93@akXeU*fy#<5^Ex4e&Z`|($U!R<}Tsohb{_P3w76WMQ z=TD~*|ENDdu3$_PcLU0kTGZ9aq`I+R5-{VlCWHG5sI=pg7={I*>lY2`QSByHgsRX^ zG|tK9K+RB!6F6z{s8-MZ;aG2SLc}-^zTt6+(Vd*{Wj7Tnd1`!o+&F0{EMI=7)Tm?C zu)L_KYG_@e9*F?-neyAQhui2j<=XFZD3AlqZ}SN_%15ry9aLc$`O2t_?cVvbb= z!cr8=mLLdV{Revdf!}go-kUe~yWgF8bMH4(te;$Fv?phjI@v|$c2vP)#NEdy{bs1c z0My9NfH?38GX?VU9;v2ziI)AeMp1I@gDV^JS$jWDj<0lw^+Q9_D(NyLUV~}Z zE}G$AR#MX)ymM#WKzsgRt8KBc!2JHDLwvO#%{76-1C)NR8}6Z8#+_ zq2Sn%5?tJ!p$b`)30Q*Y^>w%5P!xcg0PXimB~W`<#|#IamYxhf64+j{^B9(w467GZ@dJ(I+yL8i85ty^t>dHCQ;@f1Kv&%@ z+(~d82l}a=FTohcN5+Gm7Sz4BXE56Q($ehevkdin+D9Hf)HiY{cE@-cZo0+p=P#6K z@aodahW129_nN?Taw=x3$$y>1Vc8!y&3@hc?!b8C?eeACB~#sRyrMb-ueaewtN15k zM<<+gF=@q@#UMzg@EXn>Jg|K`yL6 z%GoSthchZx-8CH#~qZe$nM=0)LO0fW+0qV_pZ%vNsVV} z?S(A9pVmTqQ>^3=KyV{Pnb)AfDBauVZF4U4)`7wPzUO5zO?nQxZ`I8nvNguJLLr-Op&NS=edyNhIf#q(@I!8ROJ9*utCIu0-6vg%eRXwyaBXMY01M}2GIS^s$3%~UTem$p&H^kX+wK0V zWM*vaWPIE+5Q}9OUtb$v+4{&-{mn>qpWVR+=L!o~-knpb{2~~f58IeDVOy;^9jX)> zP^E}3-((ng4b`6#z&yttMao#08r(NrV`)zTih=gZr7r-_WA<@y?1LL*DV*l6e6j!Q zJa11HSJlFqM&2>@^Hw}9(Ga_XeW<)b4K*_}ll5KoVsjFh6(2i5j>U!MTC(@cj%b_S z$>2*~kX3ykL{!5(fTDm#91*WizY zJ9}wwiMXS9=TByotfy(|qJWQ{yy-PuRRUXNG76mZ!^7dH5(}+- ziB^Ye#(^Exj%e3&{5@pDH>(xzmi>)B$>r8MqDNuq_!cEUi7*p(Hf;ebsEBdK8A)C(IBsR39ohQn*KS*oC+Yp{S?cQU|6GVJ*Cc1|T#l zjS=Vf3@JIb_#QTf84gj#1m%5!-~Y8f=(L^u#UfjS7*(udF0?6If(%C73KRm$iqXv< zZ1F>Z+Q44T^TFy!Wl0U5NN)9(^%&G>$JVmuPKLqgnWTYA%P76NfI9T%5|V7w0*e(RFHyo~A13&XCbh{h{xot4i{lXb=#jDX z9uWFNm*7ca46LrPMhyeI;BMO!3Mwkt51!FNOqu<|VtPRM>>$B0TM(5K-kkN?EMI3s m__K{v;)CL|8$bT1UVWt6(_@CKnzCPpkq(eYp=?<6f?iQ8?Y3T+5iKRoNI~S0A$M5g` zW3SzvYj$?7nKS3y&;7Zd2z6CCEDREi7cX95DacD}zIcJC_wR*<0&MBDN?!rq(4FP= zU0=Mw#Q*m~c#)Y+1Z+fb)s*}2qI!aCANcapT2e*w#f!Q)%m*{%7cWv%6r?4!JrRyq zQBBDP7EyldcHB5BG+8XVobsQf*m*O$CBC3WFUG|~3!+3sr@K=Ba9SF|HL%)pv!-3O z=5uB_$+?2p_)4es^}oU-qCEbf6q(ul@T|cRiD6K~i`)YgB8`(D#pOh>E&#=jNf+ z*UQUUyHg}csmOI^_|&+#`tfrJa{hB~c_BD{Np}+V_AHM+8X8;}QHrm*eA5>t^5fl+=c4&7{a{53B9Jjp2DKJJX z3oRmi?;DIuj}O93YM8|@g)#COD@NtkY?Dy*VK}L*qGpK0u^pkS?Jtl(~yx?yTRQC2Q#1-F7K4&mkh?vHQqP|k_SJ`%1RYgb#IVuS~O<`W@yNBVf zn1fID_RHIPG4(%dPXA(FpNNzNc+@rz?O?IEaqcr`f5*|Sn12Wy%Jn3~!os>Oj|oQ` zikf`JG|tUsTV79!A8?64uG@KEBrSb~Z%&^1I9+!fZ9Hjl zK|z8P-)r0{wNk&9;1swmi*D)YM3sOMri2M)a!T6f4_89>LoN!x2V1>NTDhXL{kJS< z4fgDEY8k82dNqmLVmD%uD?bn)Hctbj6};#XeLL!olD1o(<2-sgSINAmr;h!=%Tt?N z(4RX&?f(8^ieoHSU_6?giOjEo$Zm#rVWBMc_&SF_jyx`M074lM#7NCEow@;rt6m_Jr@ zF;H^IXO<)eJCSz4HaHkpL*RMia#uNRH?j#apCG$YC0S2BCTz->uSFr`rOLVCpGDk@ z3JdWrcgH_iS`wuCJ<$64o~;V{Z(SR?B|U#4z^R?BEf%a#zK6(RNQ5Izew3 zBQ^(8HAtHtD5H$Ud>NvAdvadBfJV%)D@4OuuB ziC>W({Ioe;jyTIoE7x_|IM5dqR!>fMi)wBzFTfoH|hwXnS!BgXc@$ z=7a?0S5Mqt@5;iChzR+$O-5Om-%CqdU{|Q3$iyqcB~;F)~J!PiFlqOEUslHKt8WTzSl zmXc=jQb1QXh3DbQT|rP$X{>ws)IXGVsL-uoZ&R%^wDscR!e`~}*ij(8bxTC%63Jst z@l0eSGYI8-Sd!FoAblOIr}MI51G~a~JnwmjqgHdnZtiO2v!e(h0i;Xxp%}wqBAv&T zxs7K3yAw*&v+d#%v4q{%s0z$N^G&diiV8njJ~t7ZK4#W-|QoG>6)+vu zo0&->J=9-NT&zq$^x;dY!CFrb#VTk$D)z<-wKA)^{UhUi2qdn;E)gG?G80VHLoM?H zLZT~=_{S8t%ZtCiYQLeJ>(T|yQ;E?kJ&W4*>UC7pz<3uryQXgI5aQ?&^)`)zz zKJ{uSHQ$^wVzVYAQ(xw#y6OpU*>NUuq&psK;`i8LhwiG0oZ;eow>a<3+(rVsyB_zba4Q-6I9*l#?I(K% zYq}3%r%3}YrQbDH?(liBdFvm@L*?)&=fnEJTL{t)tuwCunij0mwIa&n!9)3PXpOgnCxMp*6Rv4Db>MgA8X=ZIyOR4weZEzV@j#i zj(Z%O-wWq9dYP!F&$R3Y-l~vY)02!)vXRwb`Q^GCa%&D6nnFsG`?DFc`b^WBNSd8k zk9T27vM>^JlBIkR1M+|cElI@>L+3%{@VEdI>83pNnPUS4_a?34m*W4lE`SCzY zq2lAE*`PdNG<^F7dSMq}Xm13nYQvyEo}XVdf6()*H*hM_*ifvMYecSV`jjU4?;0qi zbB2++2FvIc9Jt-^iG39syDGWffHnm9L;@OX_`OY&DJAQ_9l?wiU_$wySXS2F(bv|L zBqa?)hj#ZqB;Sc@S%=>fjRAuYd@v5TbfQ1}vuSrdl>-eO4UN*3xo*6Fq@-Mof9xwg!v3!+q0-XQ zgc<_}Yz;`M6eW$-#yDAOI|*r!R}D^1*2bXGU@LSgU^p0awp;W%!~E)-Ekc)hRJcs1 z7iQ6DXlM?ee`4#s(iO8l>D=TM0*-|g^2M(dUl-{ zuXYKiVm+5)w@@euD?HZTFRcA*c({$}9;o|((`0JoHOx#X!;DmCmBK%ucH^HWl17q> zL(<7YCox230pzOKN?<5*YgJP<1sD#u5&mm(m_HB?(~***y*C5YDb@>q9EpcB+8tIs z-SukfRfkpH$=MjRwbR75=#cj%fr#}ZO3bBa<_4C=)WLf;c~EHx;|R1 zsj;^ygCr#t8SkE#>A_n%!*veFCpr2v8%bf0ehDcl$dr_)Nn`zcmebSRXU8}8VEml8 zW`QP$#Rx#WI`5rvf!BRoT3UWb)pW{y`4Z9jIK!bsMdyijeJb(Fhk(f*YXAG_Xl1*z zp{a?x!U>eLq;M4S?`l57%YtE=9Uoj<>KhxUHcbCU!kDzpcDg%5hKGl{Tj~;s_(c&B zf`SB3SG;Pq#uU^W>gT|$ekSPexnImKDiPA~@Q}9O91RWQZronC^QCi{W2~&MIRBBx zbL`kRu&~H7GD4}rT{qaK--gK;u@EHaLJ8Ru^ zUB(*LK0(IOUY+$p`3^zxqy=e<_26%vYVyOclarH8A6mE;0)BJ)FZ>{wDOKqub@B`R zO&ydj=JVAcfIl@ifM5LSie<%pZ1U{7opOKlBNW4$x<^v4#T45+ia-n)fI$Vz+ll-t zA&d~p+UCZAHp-@QMO8NbDkF%Ih&wH_Fv&9i=RUd9j=137PnD~+CH&K@uL)k) zwEg+?<6=pqtgKQqXj(_Yu?+fYU~r(1X(u)fxMR|(RYNMF!c^tYi_6P2Y-0HP`$A=G zEQ3#eJ{vYOfn(OOJ&kE5fv&r%{iz)qXs@t9;~v*%SI+Y)VcxSS1UA8lNVTpv;xICg zH$g#9Eq@2?)wMrHJHwP)-1dc-O;h$~4(sb1xU8<2R-^Sw5a(C)dCs;kPMtTVUBP@T z-Rn3~!H66C`vuLDJw3P+s;XyN<3ZE2MED+vPj(sg^)3$DJx*6;xPoPwFK{YKhYAX) zp)O!~zDuDV{jd&0$2M#THhEw22tLTtjvbIoKs}bcHitQ37(ChevEVu7Af1=M+q3O( z=rpobC3JkOJ|aFmysWDMT2mun|K_J6CDkI$&lsi zvfh;~ZC5Qo4Hxw%_ zu+dH@NnA-#zhFZ@l$^^H94qDX8dsm)U)H1AW7D*tHFEo8Cphtsrsw@#0Szrh-@}T! zxpX!#NHX&c3inEKvLO-VEapKUrsR_%O}Lu3N_&_3n6> zL5=W({QQ^wEPCr*{c@yyLwU~L(g|sIFZz$#Iz(?Nf+I)m7M5DO*G92>f)L88tHh2e z^UKPL$4}qc5)-kK5Q{Ezf)o}xV#0@AGTQEHJ*Rcz6d9^^36dL*di$gjGIHXek#?TQ zDCVbwAC5+uzuG%9k#)%Bk4&Icv&W*LV@sQTQONSw)kIKIRGrD`pW&%jH!`Y%n8(8* zuh2h)C=P5Bq%lD@#j1YMe6bF@|V{VZ66iA+4G07Rl8P z4=JZ-dROx`D~{43du3ziAas9bu%P&R<+gum0A^GqD5V1L3nL!9OS3AT=aHMc9>nA- z>mStCQHTiC2j0J@gQ7#C-TR&XJpyrgFmiZhFwBwnI&(=_O!GclA74Y;Ah>ncC|rqf zJQR{dK=Sbcmx8bus!rgY&4{jE#iBQ%I^pc*92f!#q4;8if&s5#z`kYsj?p8)^yXwnR^eO+42tYT2AblIY(;(b8GD2Ga(zjbFo&}ng|-U@+_ z2w|wa?LY|0|2wo|Mq+n(Fze!;Z*`Grr(UokiR?^6Q~wcsa7({neVt69TdVA6UTKKc zPW86jYNUjZyi8T6N|}Il#(VFLJxeEN1h6az8^>UpV#woVDkD@pX1uII#V2P)in`Vg zf!;3GC$&>sn9K?A9%w*-eFtW80dKNe1Km1hiRM@0kxkYC zV8TkGdg1yV@qIocnW}OrBgRW%{x0zn+je6dZ1JT*~uBFF>g^w85^0(g|X6b8-DafY&u?;nLf42Cl#}!Bb>;? zI-md+eO@H~xS3fU>w^4>d`>;2P~~ff*sp^q{J7Wgucn!`_`x2va}0i627)3&Zu*id zt*+lr94JXhBFRPE_vX)^9`C=bdF}2~OYi*52=TkWHk&Qe05phA>$(z0M`-&=8|G=} zJ-cJqqx+A`2@$|c8Td00Rp$-2TXCCF@jM@R%Vj?Jiq){`RZmY(3$W`_Hd|I=VsOCo z{krFNif(*DLQtBCKXF1rLd$W}^3`2ZV&Yjh5>EI0eDk(=Uci%()kJp0(vm@ce?OI& z7o&TdZ9UYzNT%~@?#VCuUH2Lvz09se) zE=LXp4r;y0sz2t5_FL|}MU!RnBL`K|H*E*@eChW_Bd$##R3$?mNLqZSI_Z|~qlt5mrMmC`pbPU1-qQUpGn+bI8*+Y6j;L`#bxc%7NtZFFpGc}1;yY+_>Y zWVIcBis#nkxQfBS!Ev0!kW557hU zi2+JVN(ot6m;wR<ZNbnf6PS<~_m4w_8bSSCcO5M(yq!(@Gq$ z!+5yDEekulqbp^3c$GmTMpIK$%T}V2DaYn;`R=cb&7ru>x*>|b$D8#y>s&7sO1~>y zKIWonx5h?x9~W_%mZbY*pw%W*}JJT{h02r(ewng1pM zV`|l7JtjY&%19$IonA%N&AzPR=~jM7FhQ! zN=vW;R;~l`22_%gPDUxr+6MT$omaff%jU5ywoj;deHd}Rl7D*6zvI-0kZ zbJw1tpKvQbXAW5!K3!gN@^@E^`{j_63+L3!LzSkp84DDe6f#ld;wY-5qP6qsX1|}H z(ihj$jVbXIXvc3^Q=7?Vp3vRO-zGZsPj@MXhJ}IkARn`Ha=?K}Rd;otJ?ygv(?4P6{8|!Oj@#^Ua^Fy{%y!s*eK5vJ$Mia4Qxuoi7}!V%Stv+N6{BIXg}FmzCd| zac;OoLf~)$?%B;HOp-xR@HM+#4yk}sUuDLOwzF$+PL9~lL`FoFp$8Qc=le%TOb^gV zbs4n3AKe^gZfQCl`o-ICw)qyc8vN>Nr1D;xF~~+bkkNtcSe+z*NCgX?vo`Lx_2#8d zYjAiO2OS-Q`SlSo(=f-cJgt3V{o#?3f%K^aLC-TLUq3%i|05evP>tk5?Jxct6$KSJ zV}D5q*ve|#bi7T)^Q-;zmf|+WX8YO`S`I=ob(v3Kkg4L1grD$V3U&+A|<7BeXhp_Ul0qs zY&rM$5B4oiq1zH?grng|fj?sbeh%ohvgRQ(-{Ifdh*}@Lo_eZm=5P1Hhw*Efjn+(+ z*~M?xUR0E#7){l?xa*p*3FBx0BRxUG{dj49=jJL2;oZA;jeYf1w5rw!6K|@e>+Lj; z96Cy!>90>DW-nZ;F}w<2j6YW4B_@hgCPfdG*-8q6RBuMa4=+fQiW=^&bt2nFd1rMi zTzsUkD%DX9<6gi=Pl;+Rs8%Ns4ZUPao^%!e$_|f=J6*PGA570Qs29!URXHXNC5e;h zACOi*e5_P_Kt`5fo8R6d{QkhY9&OpKIn6Ugevw{&AgwFY9y`68g&)&^33cDmMNkJY)WrkibKa z5iqdw01j3cnNZNF8Vvo1N z@3dT%x(W>m6HR^fwq8kWqM&F>US~c0hFq|4o-L%+QFnc~vqB!G!F>XM$x9 z%3sS##hs61;>o)W;9YUDsMwihx_cv(?8md2nmY4IgboS!a(GE`(<3QkNpVFWr~rzH ze0Q3Vkg@8LwX)ltz~t88oi>@TIfObV34ONNU(5N6E5H$v1lgDV@GpI>G z{7_>Lelr9JcsUN4|Ec>j#!jw&Ln&VUw5HMa&iWX~5Zp~qGd9TZ0kgN<#d~mK0tJjU z$A-{5GeW@?&|WT5@k=Gd2y629;bsh&nU_t>DFK^wb4dCi#6-tE_k>4)mAA!GU+4u2 z%56DSYC!$8Mo@o0Zzv>;iuvxP%dBKG{Ne-R%5b>zV}siVuq!w$DT#Jv_2b6DpU}HD zZ*nw-=$Kh+qL^s385qA1ru@X~i>r(G^3Lj6;L#q>ohya#7&Y|*4s@kSqhF=MyBizT zP3CBTx9(;`#z*rpZ)2;xI&GKE>=z8C|M^C}L%GbLOB=Jp;s-0dCazf*vdbkZ`X&|| zn@KxJv&lqwYxJ(^bSbWa-7s>p)3}^cDwAdFsPy~QtJ%NzePex69oK3gC(G3&#@MMx z5H@*KaE*8Feuh38@$>^3eHmM>gc5{^alhYC2f-Td>E#usS6rPo)TBEpdG{@vM2O4_ zIjjwxUh`N$Vtq&4BMW4c6i9!gq!TnUIgh%wmMa`Ry6&NE@v_hyU)#CjL&DNcpYuU0 zHWqPVunB_$NIuQa^U9Mo81gdr;hvyKFN|;hEq=xIeW4c*++I$#+ym?`+gcO-^>bM9 ztTuq;v{Au}jCikCXP;6d&1}wIXUi*2_5AGXQ#l>_Kp;G6B#M*AW)cyxDO>KB7BiL5 zCn+KBrGg`Sa^jeOVum~xTpL!qTkPtscCV)39FGLwAC`n^`E?IVYC<`Kp8VOy-Ks`{ zj8unGj}t-KjxjaS(5RxET$@t`MRU(~O7Inb zJ({l)xjyI$3jJ2k4a?Ryh{c1~gnlTOW}qwG!_ag4iEdPv_~QHNFOB~4U$k9g`Udm| z;u_3MW9ue&{ad?l_Y*Wf&I)6b34i_di%PrV_h#V-NBi>wq0-`#!!s6y`M+E1(w-Gv z2@a5ukR0rA&3#fXU#4Ej*S&^NdcD--6u2?m4bO6TdG@*Xv8pkODvR}y~( z17AkVUpK#$k_Gx1JcW`7#<#C=;n+wzaz`PSl7f+*rwTJ^SJa7CH0A2E6;A1zQ;B{o zl8Wq2%>7II3R%RJfUo4l2`~bos9%IfdyX&B)ut&&DS*;nqLTu(5^#XkpM6%r^BeyP ziBNQWPQN?1f8~~=qazv`T6Y`x&>1LMscC7E%FD|I?~fWbwztDz6}p>qhE4$#a`;0Eb%R8CDc%>Eslbn21+gQbH{t z@Yc-CES=jjvXf0vkf^S1{F0H);5*vd+FIL8mUi9FL{5}S7C$u$ixPx$pO)4vN_hbl z00A~sd*}M0J~t;aZf?AeEgLATCY>MS&bb4ge91FEefs2 zhd8an)^LJ1ak+~E{ID03W40N`om(b?jgiE0DyiXLSYl|X0Zrr&Cl+CGX_IOmg50<= zf)aBnnPL!NLjh)4znGb1I<;`3sipTO9&W;R0!Lp=i0Lob$sb#L!cbS-CQFiL#kCf0 z6Ur`PAl5Dt8PB;tz zAq%x1X5M+tj4HeV_^%gHrSMRo%p>A@H(-$D)mnU#MCto^1l-~fgn!8qOCBOz+^N9s zKubx_Ocvl{_kSP1lKuN=D&Nh_Qu7i{@oj_}xPe68euNvT$3E~g#6~z=Pc*;^vYb`H z?Si6*KlxGwDI@CFTCR)?U@<>c>$>8eta%X8_Ck7xhA;sjC+I1NvCE#jY?X1`er^7< z40m{RA`H@A(a+iP%5oYPVPRGoczf=!)z6qS#!@iSs-RTUdUG-(x*_UF%RqoXgZ zt%p)~K8T3;5d5rsoqr;-z{kt$QicK?10f$c#)rh0!L1FYX0SH4G7T6DD(XG|*zo7x zP$ZO}SEhZou<`Cl@DUCa+HQM~%*GY%a$c z{AKVfWfPS!1NIYwzg~xT2sD4L5ZZ=8adINBtT=VETx-U&va;%CBAEoFUe4g>vQF}s zE!mPRjJEQ5AA~mg1_uo!c6y35+G+}tlFY|06w3GI<&}d%I*<-X4>YP%U3Hp=pu3y< z8?nHj16oLHc|Ue*mRAs}Sj*eoT!ZEz_sNAMR(9Z%e14Z*;iRO30n9m|NW+z9s!j;3s-(7-b z<1xI4w29L5DYT&N40wan+RhpLUZQq~S$zwDfW2$#-_kBFwL0MWvh8LppleO{t@tpI z8lhZ(&NG@+49}g})1oYpo?2~dhrm=BkQ<tw8cmdlL8^65pvjX9d zmX^EwyYaahG1Jp7qnnagKnl9!QE#iGohNv^0_uoEL7@!m;W2ekhLDFrLlCLLP* z5Gb!7$!OHzIu{OC5KJg_)x!4ztMHMKkh+<^V`UvYd4w!gE{}|$BO?zSD8Q@7^(X{5 zy3V#H$E~k0$_Z1FQ}?I#$w1Btqgne2mCKDS)UGP@jeQa}0`>A>EUas<^|Ui@XpfWb`HVMjw}4uc7t zvG%%Oy>C27515*Eb>m6nZU4O7iP;B&l_-F|i;9(K&K5&Ipu&kOHq4|F3Yp(y?oR5c zIPeLlk4P@e((UbU1pU3V+7BdLiefl^4^w6^{}Dq;imq#I{fd;NFtcgJ4Q5#nEnZw+ zJYe8Ke}z{$I>u5b2eK?ySTzEfT8M15vH=pyDeq+#?U1>fR$5X~h;f%gk@l{);)i7I z3Q_GO!yF7{F=(`E* zhRIB*6e#IVEqC1p^q2_M@%<24?V@lCRiB6C9+B}TKD|_yqP6br`2S17PLkGpj*>zy`(Y&(D*Wga|#cVd~{>Pke7Nl(?Em|=C zym^Fz$8%P(=*TCnbNR^G z*^h`+q-PD?-J3)eD#(G~^(L%{ynXZLMUkOe)og&v9JLxV70rQIQ@2}x1K?S_`psmH z_uu+GSAj8C-2nmE+tNil?2l zPe;~@U-lK{Tz#~%Q@!=GnHbvU!W8X$qog2ufF6`RAA-6QHF7YcqTsWn@7@s)voQ7d ze<@mGr8O5xNz*m^x9$uN%esA}NoCCr1EPNU)zuVzA0Slh)cSFrV*gTgR!6}AV&vt# zVm2Mw>gNVWD1X_gVb=TmH_YZ}%Yh@qQA!v;EmgOBZOwRceP?GU(l%*`S{9jIg3_rm zS`0-bS4RH-f3A?4h;C{RqKD?IgX$xduCh(5^bHNET`UCuMct@e-Q9nsRCt5Sq0peb z8iAFMM!$#s4QtKtH*AT;w2^Re;kg8AL8sa^6EvbOtSBS48EyLPIhuc zkvNij?4aLc7uORB#755-)(IiDwN!kK;5MNYRjx1=;)X~dH5%uuTESX?L?|`)&LOFu ziVV4#4G;%mAwhTmutTYs-~#j?u}$()V&H%PJD^6)Jz|^w8w$679O9hxXlTZUCJ+8u zk!W&X82_mNPwD3WWgtk1fUV(t_ay%U189Ie3C(GZu%Rlis6m}F9RL)?0V&CQX`SC_xSvfQ>kCKd>+;C1qUq7Oz^A3ZH>t7n|y^9Mszr#WxF0E|3 zSoi*1m0_LzJp1E_Q$ZH}psP1NX|RQJrHSVSk>yw7Mx3fQmxmf4_(O;ALl% zoxvhg0O2Dk-TrPFaHv98eQ@$iOHt@cECKQ@tD_V9g)6!%wPaKsE)C9k29`v)`G5 zbagj#Jl1*^>de9NZNGyt&qi5legnE37W5u*{^9Q>m&NdF(Z{Qqmc7ELv!6VZd)vwv zmzQ;3msSsd-gf;;N|3nvB?ZW7jLyev!=D*Es5|lR;Q*sC9Z96Wt26fAr!Oup-UBN! zC9H3op!-cqJpaJ{lEk3WyVPi3=dj4#QFVTPF3c(4f(cX#KBpbuLXsS2a>aaJ6B9=O zd}sgl!qT!+R}7nB)9;7N$@!j(#(CqJ0x86yET_(Lrz~+l;aCbWXaJ><3tf}bdaTGv z3lbpZz1K&~6^L>~z3PRXvoqgnHyO^oqjm>Kly|_W%f;nj3@MymOw0(<{`{~j5grpW z@ZEOi%H`sQiH$8RE)K`oa|7AWIf?TgAUx*loql&n`iS)p9l;?X32ABH^49O*hj3xX zwta?S>bYPv8R2OLVR zJny!{?Ppe3tHy;zXHWBdulay7^aJbtmQw!!+>>S(^5E9a` zu~m(`;9(p4!9jir>QkB80~TVMGD$JAsrY-_M{23hSoRLfdVOrn`u%lLyuH- z8gvC1U~rpTU@D-on#_%1%=6Vm{YlJY_4}ZrW{xr%PiKqY3%iQ1%*uZ8ZM_LSt7^8O zhSNDsMo(6!2FEvr$ zqZ_UJ-H=oGU1^ZdDQ_qvmc0~SbOP$sR_vhCuDpmN7W8Pm;B7CZ+QdiI)S=Oz484~V z#^EUy0qQl4G}`4HDuAuhSC)Va<<2Q#)|NZ~Z-oBNfB$Hy#4P9NIG!>em6jWIs#`T9 zv1_pllp$D7KN^%l0%OaST}_?XHJ#_3P}6UF;5Tmwi#~S5h7~2zrn2TjZbRu-z(ZBH zV@Pr3V8^}Mm}*CMXYIJpcfGn$X0rq0U=;D0N}AOUU_r8kzI6kE$8FQfoopNwn%um} zP%Esr0$ET$2~jmOa5#G%^JO0`Gf?leGG8_? zJGQHsEUnKGqibRkvi?dT{j1)2v*uIhvaPuKgMOK{*nok6xcmTZaV|26@&V7CPG0_X z8vqvF-Y34ES&G1CbPG=yitl!LgwG#xUfyoT0nFbi;NI{DfQE(76g-mxJ?4!(_V4HB z=9+#|Uiagx?LoEfUoeghyQXwA#L=g)+X|<=wuBCkJSBBA^$frHYGICBmQf}_@ zcL>hGvVm^V*12WY$&X9b$M%P06*y7NwJKvE6LENV0z3A5jW8 z@?ukp#TFFwpivS=zJX_|P7dqzh!>B$+=;EaK@I+t8jB3jm(r2hdFJkNKr8 z!jIY6U)CuDLb!_Lpvxp*##7RMLsXUx=UVM2{Z}iA@bE%+^SqRw*EU+qhLVTomh)rn z8zwSKGbwO_QP{QA502VqjFi1$(ziS9c?Fd}5J$>0gLs--`5ezpjDB9l=t{wTLc7^T_x2f?zm{%F5S&viHS55meBA7it zJ+@^yUhPe_jnbqrqbqAxEq=GfXHZVhulS%Tlo$vG`2WGZ|MjAE8#nE^k7h;^6+Q(; zH486Z^3xea;`_TEK(Osujkr#V=|ZH?HR}D#59C4n06Ly05JC68_)*+ThwyWLUKjOk zxu-&S5?E=^u+7ajE09*g#C4pnjfQDM0jhriBy+Jy`IS$37IRx&cMo=Y8zzL6YUH4f zc>Y`G#ftRLik`_B>Dmhx#OOcpBD^nHNXqM>@Q{i7jLx0bxNrVB^9s38v#gDC1 zmczuy`wa+X6R(8gC8Iu}>({)5Nikwn=c!;JVGD(lcUTD!^QCyg{9UAzZjo}>Bd(p;KbP{c zZz7XlU*Hn?RK_$0aiTPmjEsI^t5iH{iGSCT3qE9Mi;&m;@8jp(5l<3k!v1WqKZ($pWK5 zp_a|(7wr9oGNi#yGXp$l@yZ=gYtFUL=fb##!d?lZlC9tY^V-CNy?jsyy|G$>x z*L2PbHYGjfQ$NM^W}ipWB)MKctsVEJh_aMX8 zEC7ueo8-_I>68qpDAQiI!;Dgl&+qgbj(-V<#|)3Ngyz*ShO30mHUeOs=rMv<1yA8E zt`7?9ft&$^Wi@Ve2}rHg=^|7}LW*~ua9s#xjetrDPm?59sOT?gb21ifZ@8%wYWvTFWYf`EN2|ypk*$z+@^=D@4P%lG4%1Wj`FfA}!x1MnlI4 zZM1^|bfdqw)!OW)Qwp%8VBbESF8REEo87Js;U#VuS=^uH752HN9856h67)D1EiSg~ z9+|@B`F0b>^EcezPQ{yy^(*T^z|V4Hf{M+UqL3nruh0f7>COu_v~NUv#Ket@V`Jp( z6BFJ)$A4$RUkiN_#M7Jx=v*Lm&=WA1$QVmfi;As+%Py|3`|HXUROeTV zmo|_d{ov`JlLq5Za5E+&X>+tBEJi`rcI0FvB*Dv0t%UAI(Xe4adIOkqGMbb$0`Ti; z1-f3)mz11coxKNxu||PF!tp&eMOaov!&50Pep>#JV^X)$xXmA1iks9o_4*-m|2_Dj$B?|Wodn+BM8FQcxLF!cLQUH zV6h%;t!dO4{}pOQ2BM|2$4BC8xp&F#2SSGaK<@=Gd^;jD*J~ET(-)*IthV>+zAlYT zj5z%j;$gY@ewYYOFD|zF-dbJOB3-h%rWW>Tp9DBME*90C15Gi4@>go1)hpW$Z#YM$ zgqFuob|%)r?1oae7BR+}_s=XdY0?APza*TN+EDES7Gl3gvs&!#Z2p?E*@A9Q^E7DG zWQOoNF2>x3zDZ6^F@N4*^2;+H+I&smgD7Js_JuL=3jm=|Xs}1*q>&UngjU=a4$0oI z=r;F9tH%`?HwV!shvgCut}l$g<}soomyc%Z>$%B9-QKu)bEm`G$2xx@se6>@BG}8v zOK@v*UO0P%H8g0Yjd}Tab&u4wQpN!N6}g91`&(PBDJd`@brDn%6@>vJIJ>@nZyK0K z0a_lLFVZ ze89hzUFkm zFW??^?+OTEgV`fA5h^O?&1(?nVvSHY4iAeyB(Z$j#1mOD*4GcC9r^@DuF&}W-d~c7 z?C98SVAN!lgGJ;m!c*s+hyL6Mkf2a@GB=M&oaPq8`6z1@n_H`!8|qe=1eOkke4?_m z*%H)~=5^LH%$gTkSRKcj6nn&Zh5l-`Yq?^xe@5*I=#a@M3%I$u>h24;$FJ_Zpy8b* zT{e>5;Z9*^D(I0sJ98fT8e_Pzdl)muE{>DL7&Ej}B{G%vueH+9>4)rOOxp&eDxJ@j z#PP=yGx>LRV{hy`O)oFxKY#FHm++~fm9sN5&*$T`-&@qEDPDxjv72 z8Yz-XSZ&!>SUwWpv%H>qPh&z-RW<3Gp1=WfiFXmZq1M}`IKd0-{oX3#FcQ; z79WTPPY52N3yraJcE3de1&DW~gqMlYO3a8q>|w5+Ztn`1pwfDIdHw0`F()DrLR=K` zLPI+n%6j%e3FtVb5EK?NJr7>oW2p})HU)YVzu`Kzbxnp^+m{lWK4Y6m&Pwp{^JWs%7e@`Bo;-?7 z&+s_k+Ps-Cs(+31yeV9uL|#YMo%Oel>yzVg(&s6#V# zR#!zR3nP(Y3;-0Eh;aDE6_q4~Cr13yR|o?$$}B=wHgvOE#AyZ@A{%lp3nhyv)th@MYfVv~e$@ z{)SR8I(e4&$5n5aByakH-c24ybk+U!Q~HLYb5rD#f|bcTHkQK+clWzGD$%Igdw$0? ztEr7qi}fH{DiVj=3|XX%D@KXcaO!`pO@^dTLTwd43h^E#S8ZkQfllJ5-D^X&fL>%4 zfRz;_Xl=iq>NXoFu(o-o2m=+61t8I(VX(<+WbaM{&~7kaa!6IZS~L=`nVFC@O!pfHeb!|Cuq+XkzMltDfyM z(aZmh7>ATF7-!9&*yHKKilF`oZW@@7fSbETuL`ck@v#wWy`|Q1yfi z73gq^%IV|%4leytyY)(}H9JDt%KH(lyT@h4ph5=e@3&yp=cbg4l{vH(1frO+?E$Wk zT;?JGr!ES$-uZJsZ-<^2ZJeG$eBmksMtDIp6tY!Hm=EiOk@8=cf(Og zT?b{n??Wcl4U7v=?^v}@rwj;$Eh72Ua0GxgiYN_jmqJesrI$d#q=-ZXA3G!bVAkWtW z)cI&Yg3UT%Qiqc6oN;NQqSbuYUrbI{)mR)Lg+-nFb2LEs>~F{%EFH(7Fi0LTSO~EA z>O7xV`=K|v(d?aH4pr&Cm73q5JOXN?R}!qwq5FKD0^rKScdq=OSF4_?`l~xougF?a zXW!ObMYHNH>(O@As{2t#O}TE7$jFwaoqe*mMgqvTMLCB%H$!S@M)54~kqF=pOr}&K z=Dw^M4(F^iZk7SX*VkJ0>5yp#sUhm9ji(DEpla9N`H$mxi*LZQn#~_ekJGtr$=u8Q zD9bwa99PLX{eGnmE{U1hbjZr1tl zJ*of;mK$#7MYel75j2D;yjUHKz$E3-3!G zUs@q!@tr21F1p`KfLfs+q!&0FRTTb@sk4lVs(r(~f`TB8AdR4a0@Bi2;7)vt=uhF#G= zOL}io6LF+ZBUH@g?s5F>vy{xoKPzh-#PGaLVNm*(9p`y2YyD}$L5J_7Olprmuu0vh!pX4?F}1R;h>-nrXABjkkrTLy zS!L`1Ha1RsnSL88tro_cg~Mqtyg3)jPjnMl=g&gi#JM8X9VnQ0x3V$kl$(C8y(u7_ zuDXo0He6~tVjJbC;AehGiL$}`_Ihfn`)Le4PUF}tD(bBxb=qyafq3{6DaDD2ceeR~ z)?^~i&)|MEAHIWUgZt+;TKJB}&h9U*^-xu_%|mcVReQ)J{WxUCMBe&Zn;*5>W%B$- z>Y~f3|97H4z*!uLUyK~HEAT+(g8Nt-@N`SnF+S2Uc;6l#3II<&uDEWr_EP2+G<7s3RCFPk9D@_z0!a}(+{}tSi_opZv z(o2O)YOH(uoE9@MGpq3A5Mp!Z#-x}olfO=#m%o=yh+b1PH0;q7su9@=&g$XB|F5Hd=SE{J+sDq{>WBd*){Iqsd5o6pblxpJ>$TzTx(X zFEcOE(SU)PSZF7`C`c%zrxg@@Y6tgFu?WWUeJ|4w?he%`V7?*kg-)pOnc%30-CSfI zCfg`1JU3!bYMsiO;V{o|xb#<^GEbY2v4^p+aR6;{2jkC49SX;gl@&b-i zR_)>H{(J>9NI5?l`fA;GK9F(E98QnZE-P-Nzh0@aY0BlLbLmn%^h}&#!PzlbWoWFc zi@3@O`g+y0G!JWZs6|`ktt#-Wy4!ZO&PZNizs(y0Q5)mo0mI3Gm#LSR-<-@t3v*-E zbl%|-j>G%Bz+?;^m!OFF(E%)35)poavD{F$>)!6C;`Ju9ZtnGlr&sK7T|(f7e$Hc5cP`R%`ib=D zIIv?!-~wnxz}KV@I7mAkdA`)zHH*fXtME7Sy$|KzSwm{zpR%Z@at1Id)O`Ty9kel% z^J?uIr}Vrc_8^8Zpdh}UMX?X)_0INt(=8KWD0#$oZz&H0Gd4I~pO%6jKpV0Pk zed4co$@Bdc84HakCB>iIfV(>h=M;H@Ol|$x)b|c0O6$^+g0{swDO*AQ<~}FjslVi8 zlDcQU=gxOJ6miA!i|TKc&r8tRr=Si+cISL2TKE2qIH`v|p?06OrE~XMuc)k&Xp(hH zjp_}t8b2^5`W37w*9H$0h>VL0plrY~m`W3?Hy|X6dEg=7vA*$~mZ9`hm6>LZU|wiH zMN`VW37hGv93N!@qdGEehBihcg*cEm-G?9pNB-#%&x?wSR#pxtcQ`aO>YiZZ_(#Mu zh>D@C9BrXi0sA!7Dd@0lSnmq%-ZnHvzQGt=MNe1T`d+tce%X{;SwiO1m;HGKaieRr zT@$Bb#z!y}Fy2+C-Yn<%##nv}b*^`tOXIE);GNzpr}6be`2>Mrzmeygp6gHx;4s69 z$xZ+EfV#=jT{65xN5Z$DXOT##U`hdu(9Ioyn^CPBT5bi2Ny z;&X%w>oqtL!?EJY7Tnc<$=IN9SU72AMmnKF&xk`#77FUY8EN_qm(@w=9u`#FVZfS= ze}u`-miy0aoRFVKF@7uqo${Aql%qFK*!f~({u^P9DmkS%IVV{OLr$L$J;u@5yK0W5)`eia?-*SRrI)RN-jPQwVHz~534?MqA4HqF=c z%{PYvujuL9$HoXjdFtNw_R3B!nHxJo82%bWn3i{UF-1gLxc9D)eC|V5R}Df**ipK} zDLcN{GzDCrZFOkL$jG>^1U$E0@4>%QKjj@oI|8NcuXUgh2j1Vi6_mIX8-!=PHPoD) zxq;1e-1%I0drKdF2h?Mvr^E)TNYkL5s?+5DPPIt=dr=W{D5U_g5KY9*tVJm@st9y( zQ-?Wf#4);-ZQElLt?oY7mZEeE2!tpQn>=tadaDH#he5w>du#p|Ys)RcJ?N9!0s-CE z+da&kqJa~)@^nQ?H-BnYeP6_uglOZ})%sbf9jKqfW=Vh6EZ&eXsoA{O^7M6If-fJq zh_sL7lZ28J{$NP=#vjX5=!&xvfPFs>bBUvQ!$(BO@W<=G2i}RfKjR^NNhItph<5!r zAoyqa#8Il+lBaG{Ni?v(*(_%(2n(mI-|H)3NQ(bCP`o|K>nmSvc=rScr#&!iZh3z_ zxOmP*UuFHtCkG!ocD%re9ZPQs$|?9kj;|cRrgXdC*3A1NlcS)j z$S*EK0=g-xeRr=MwcU4eNI1V@$$tFkWE(rRvV^$cK|0v(Dh3$QFQvlA_2tv{L=Yzt z+(R4JTj^5|m8+F6I&O|yaKWFZB_omIFEt9(2}VA>7k$+T;1AnW;$TEo3^X@4^II-> z-yFE!9Mqij=^_Yl1&<#DVv%OCBJE$`9+uWPz|VK4fu{oM+Q;(_Lsf3~JxkJvYT$n2 zA`MHV+gxvxcAFai_Dinc)VnFI-1432}=p( zWQ)hqL&1{>bePwY+Y#ZdEiFE%JsqE%1ctx~o{^G%A8NV95pX_i(?xjlNQQ-OmxX_1 z<)glLKXnuL$5oD~(s_H2&B$12yCbpXhn6<^t4LYIMSb_rB~OFaX#Lvr#Jq-^A|1-% z{2QcO41QyusA<`Cn#ITb8;?;GF2HRs?tQ2&8bmRVOTqi?@l)bI1(=CFDtH9K>$F6L zlgR8Wr4G_Or-Z*^TkyJEsE5+iym|dvT5ZN(W!fLu@4`3xoOfqxx?U4sy-qi=o<8-9 zkDux#aEifELta?TcOW4m?&&Eg8AdjtFOXwiW49)$qN0N2Cp0)8jLr!=ZhvYL0mdWSv%I|URGwgG=UZ{sG>8Pk=*Eo%2Nw@;H>x-zW2WXVmHfuBL6I{HC z?KPa8o7;0@(XLlPm&K42_0{_D;o;^$a-N^s%^lMmY{&{yNHE2|T^TSQn1-`V80w6`3(4^h1%ui?NJQ2&I`<2PaaK{09J=}p zgD6$u%6k0Mx^(}yZi@#sA4SL05$6m|L(WHw#Wf!o-A1t*%qJMNKX3`L)`fYyV}JEF z!@?l-<(-h@aXJ;B@D#=Y3dqV?X|pn9p!#Ts1Ge~6t&ft=UMr&bwITXH3+=C1q@4Vp z-!V}gISyNxz;wXf#r-37l0`}Fqrxf6;hLQ6oVBMgbxson$iw|d^r6&+jLN?#C(AvC z9vW?I(!AvS7|=?e;&LGh25)?>V<#T1DlG*bIlnj0dRn5Vm)!0NorZr*rIy2Z@iHzn ztEP7mD$jLYSq4RHWb&-)4|;1@zkCT~CUgiii==1b3;tNu?U%|K{0!fL90VRS!qtskj+7FdB9BSdBLe|ksnQDu^xVOl(JI=GwXT*4T z8Gb)4e`_&J&=qjVM88lFRV7S5Zb!hx;p*Q zY?b5yDUW#FtUrI?c$_+Uqn#v}vr8}US>bhBD#$uhQ{n0EUXQ~? zaP`VIu|4dEzouDM>>UewD>9Y?f>_WJJ(=3rjhD2v=g!i@v0JoW{YD}KDSVY;)bHH1 zuICa5|130nHI$^ueNaup*(hIk0lojciPXv`hN}wOn>-jxqf4@1FMv?di0GG- zmXrK@%%(lUPeqxR45u%A5tka17gsaUCIkI6=durx_o1SM>q$s;|9X?GW2hTl zzv7iqx73AM42}E0rul`2c0JmTdbr&BZDPdiQrw}|9B~;GHuqkrQp`)4{~e0u)Ib0Q zYakk}nXI64Ex~6c!&)+RGBUmvMr@r_w4w{Ipd=}-4f344Bmo?rwDJxQLqc-xAEwL8 zKSsC`5|!G_$0y=B*;7{)QrV9zMFZ7o$v*K8zs5GuZidgPmMi!yU!I=+E%k9CXKAWk zd*JU}?aXjb**Kt^`*kvxKBYP_(l3-?CvZyfe{hU;hZ2DKjwI7 zA#mob)=-)GUEY5I0?`h$YPg`GdyCpsGp{dU%qNxb_l2CKBzIRh)kA7lR{y|9`s&+wUjNEK3LjG?BVE9O?B~QD zhwh!A_w8#)fNTKBiUQ2WgpsvG=)e@!9bafv#u$j|$8jjwB z7fx9C4BykgqIYV3UuZiqJ`PLqvzM)W%R6l9(z9o_T04RqbAj%fpPxT!_=c}wPhJ`K zV9`hVoncUBZZ)wC^oLDb3hA`Na{l4-*8}wxDSoMxjSx;)dA>TcsxGlyS47y~~LL)62P-!C{MCE6c3qLB7*EW($HuDOhT`y=elvaT|`n=~QpaYTN&lIzQ*)IMl}q{1|w_+=qkI&`<7xPfQpX zuyCm{85m3!+O#Fj<8di=)=T2e>-dKsdno(| z9Pqh=n6GQDX=`|@k}e+mEB|^kM(R7D|4$R0sjg=z&wB4F^JNE@?fRNB$aBMMk~B#p z264EKLHB5UN5kL#*aoqg=_5e;OirXPr%t;GcFsE9|13q02I{7cwilCQUpVHS9D~>Q zO+p+sKqx3R^F#k8a{9_HBv%Z0e0OgpDzbb*aO8JjFm`%Ya8klwsO2O?;g=%u z`Z7oP)wTl#Wfr2~LzQzvy?Bbu2YviS?@L2ax=?M|vVcge&;8nCb02?l$9KFb(0AO~ z%V%S(^W|k{7yWXzZ5k9XzjLF5rpboAx$`wKG-vy`*F~6`NL@;B<}D{m!%;g0zSM}dwJQ?F685h$3PHm zx3q-#j(*sHuKV_$synNE8T_Yz!+fJ>Z9^RmttAN#^^f*{6MIo=pMue;;PFuN zoGeyjBcq*vG5wv4gi9u0zrM8pYYXOzy)!*Nk_2{~I7r?Ev)dY%Zjq~*L;0a2KZS!Z zUJf)vf+&{*rg3xf=+CY$@fKgB~iqI?@_Ckmg zG&ah>P@_s?9gfL+|99~&2#=fjnU@4gTz>$gy#4c(8udG^2vCmEa=MnN-RLSj*?(G^ z$?A35iOHmCPUa&U}zIo5=-~$6^%*&^j`ReRjB*;prsaLTp$%^Oz#h9 zIYFP7=fUamvSg!Y+!N5%)EJCRwrF0ze&3{T4g&CDEBcwc$sbb~)M1ms5lH8I9+8{-Bc-+uEL1B z^N+7zGj>HwIN04)skKUj8*Ll(9XTGKJ?~-tnyTmRj=d4I8_`)T;uoLC0RJp2%a6Ee zsc|&9kV1Hu9=cr2`{=6Olzc#MTBiB1ZK3PaKsJ^u=iic!>+N&Y0j~Kzr-TC>oU!33 znuiuQgLlC{6al-oE_ZD1@=)Zbq*GZ6yA=vf0rywP*!L#c&CIs%$g&`?E1X*G9Ub3G zxY0pXIxVJ$X@Y;sw@xc{*d0s%sSkR$*`Ja%yNZ5DY7B#6*T)FHP$_7daL6k!%RL@At_&JOezkvb%wZh!2h_Il ziOIsBkS1Zs3xA#FzZN%+| z0`|<9tc_Pmoqqwt?ry7d$F|(6U%r?&V52nXvg_1f|#||4sYS(c%2c&Tv-iXju=J)uxo?Xlr-( z=MTazeOGZ3-Y|Tn%O27-aX%tZ`dmrz@RI6sNfb2mrRrBy@IXu))X>@+JtBUa5E4Xn zMF^NgwugKnwo{ZfZ8I|k8{XdDi>~`oH+DM#TOELN=5h~@=e^v2%zLj@m9|Wy?v9vw zku~_Pt?}Ehgp}MNw);0d!?^aJAzz(Yye;j!Jl(%myCVwfAFnM(t!cA-(b2*9O_%po zZ!f%QyTl9R#0En_zHfARxF_13dZyVB7lCMPnyxu|!P0P!B6QaUki-5%&FT*oadFo- zh_=o6oR5UQ;Sr^PjEm->$MUkiTrxk#4Gx8<+&o5q5+CKY`L#u99hOY*8~0lZ+TEUc zgxVYcR|Cmqbq+#~_iP=P@4l>{9G|c|Y?3A;Kl{;P2@8pU`>Rmr!N|H}Zdh1|W{|MW9!+j0E#e^Zbl zlQS>nbrGwkvaPgh>>A?RPLK_K0A_?@R2^wsyud)Lw%mh;b0_xlAFtoM6;sfma^Hm) zva|sZrC|W3rt!u`aQMezG5UcdVN!G)>h3?iYvnFW`s>hd8|&NOQax~?!vdI~8*Dze zcOEOba7~WOEi%J~J&un~X4RLXPp0E>=G9oja@U5?-UAVn1cBjgXV`{ht_f*D^L~o7 z^yJdJt)ay4@k>_^E*BjHE(%%2enBAWY+KAE2c{|%fw)gc?qw&6^8Y*=V^AE9*xA`B zk&2CH)%gxJr^^(R)Jhk2LJ56AluyqE%}{xW>!K#!ozj~9!%(F&|5G~6TjdSu2Qk<9 zp!X#Y|8srqMk7o^1Zo44=9=`f|Ngl*>P}kE=b|pGV;JJO(8@pxC81XT#+9eS$T>eh zUU=^9HgYK<(rp&D{=*Op1A{nYwmWw;l>wst%JhmV5z6`TseE2!?Hz#t;#nLV zY-_Z!UOgLUAjG0n1dZ*TA$l1YWVm;soxpF5!ZDkAt$(B!@tLTd86(JaySdy@as_eY zjqbw3qfT3(7504?K(aF2$k}=J`;lOut-4yzdF|UXUnWb0ZKl) zc`PUKx}!3wN+k&LD2>>;mv#UB`>eLM{?ELLsp%7~iKC9dz}24e*F?=wM+W}qY9{+L zE)Sw!1{zB1y$||Y^{bFaudR^}%+!*a?r1Dcu5X$Vn;t~}0;?@;G&OUDUv>_LQ~pEu zwJ51q(GBjYIL@Xd>qi^c@E;X?{oAqcoZ&7i^v9~+l1NPxYk~tYSTk{V?n*L5--5?nS>mS(|ybgnvH`MWPE*9ea!4N}UQ(vEy%J3tYInq-yS-5oP8M0dX zU?ggv5VRL({7>Kh7zh9!y_j(NhQsW+hI}6QXCu*s&IE7ts~BuFFBD(WR>)zgrW*GC z^|ghj43?Wqh#S>ikuKCx=lFscam4yK78dSPFiu~Z#mmd|{Vf}&+5UK{IbH2QO)pPk ztmH6#^6|Y?E)PrJ5O|;7@c_T{5i0;*28~oe{r5dtqZMcpqG!Q>x|N#agZR3ETUJ@s zmfy3|!}{8{GKMfEl@gyQ^&4HtSA(rIKWJh<8C}lCYo=21p2!D}3PYsjhyMQXe>S0I z^pus=Wqpf?#^CBx72=VQP#GrdYjS3rqz zb*neraeJzyqJ_ev_WaI6^m7vbH_bMXUH|aVoAJ|QTGkf4?~H7Gd{wFR#zx`^I+II7 zx5oPbPi$cnxKflVD$0%~&3agwRcV+Wft<9;i?i>ksg&S+3v=e>ou*NG+)xg!Fn(hMLit6?yw7QX zcd7@~E3aCK^?o-~>Cbq*HdB}}P6`<4x+lAeNNn*L{X0X@Ki;M0opF%5GfzP4=A!E)DgV^*=A{r;SN)4 z4-sEn=@o@;IKB?0eE(I*osnCOhKw|W%ry#+iyE_TIl)lNIT|=+fiPu=6qS!;z@~U8 z301g-O(WqJkh9ah>O=$f3}B`1lv14r@INwEllNCKLo^8S3aXcOcer21Z{DHKIUi1x zf}*24esay>`}LlctJT6I+v6Uk_00`KBk`+(yv)TsYVX^}I-VO=q0~HRHZAw%-fxSq zys^KgzQcCheahJVRxlv1SObsTBCs$Gm^59#)O3D;9xlc1Q$L)~_8{0xGL z3Y5>*-=BcW*+7?)*0?A) z6A1+k&(fv~vaWE-xlA`EUc_knbL8;U@oc>VBg7mb@c>9LvMA{)oO^e zqGET`>c5gyP$w=NMD;Q z#X&;YXORE|%k#e(g%t}p7urI6UrPNx*%rH`dH1%dBa#Q;$r1!i=z&53*z3f}HAkX= z+vS}e8vLY#?<28ZXN|>q(W|xYFjajU_vC|^%R?{@WiN)Dkd#pA`rb_*G&I0SKltGy zgHkt4=b?`hh?rEDYg+CO%;E){_Y+Ds6L1jp1W=^QiTjs85^zk>9Wc0yWg?@FY2pV( z->a=T^;XzFh(~PzxFtXrzKEL}gvVIm#CE{Lz82R6BS#{RaZS)@;I!MTJm0Qeb~f;(Lz8G zz}y17K4dDv{bnu(8t*>^QX-IhDHp{>MvA@eF8Ssp2k}6ytgpAQic z{emNg8js1$p>y0nz7)QVva)k_9@SOp3i~1Mxc?(=j?Q!fx|i;{Zxc*H71(gteDo*c zi#8+oQA^@)*5T&9kIRN9z@oBLVD?YIry>9v`>Xt;mW zLW9d5eG?Kb%s(tGk@wEbAciqgE4zL?$v*~^kx6ld&LgeqL0}bGg-7y_DLK~P)6Bj2 z^`c<2NUQEM4kCsZ>Q*VQI+!v8e>BC%{ar=xowpa0Eusi+*cg;%%^SjDN+l&6D7$_I1q35i7 z+>qGWOCQrFY|-YXIVW~PQ8oAagM;)I%P%IsN+;(W>kneS&BCkn;7uz=-CvbO*d3&g z<8G|xYw^L|QHWkK4U0o372YrhTlO+?KXSPgGIeJ?&!zr!Gew#h^s>$cInSA!?=9;s zHTf;Q?<%m*FYU3gKo)vsXPU`my39;XLDRx?*|2pt7_{Nad?$!eiIwiVhW@nqJuG~A zi1D;N`=dB2hDlyV8*K*T09b`e5z2mmdqne2h!7m(O#sUUd0TPRt-=)cZWac` z$Zz{?gg@Sp2$(;@p%BIa5DF|@^1#swj_H}1-NE?8#2LUQ5oEr1#s;lg48XckZ?O~D z97@HZre@`OSA|^%$U(tEQNcM|ETXE;ELz&yY+Oc9g17sp#ijj7b?=D%^EfZ%?7=K3 zXoHV(>&fo6st&M~v}~=o!a8aEZ1Rb`l1Fn%Nt!~w4qz1&SddnNqMU}K`0!zKPao^P z<32^=u2@%EMNQ?{m?ap|z6bYr(2J7w|BqR+FU%k%#jL?b4%(ObMNmlqi%j$DpPG9L z7CM}Bc;HfqfkSO58EN=xGzX|@y$7}hSg0oHU$4_e^;BgAc{|TG+5Dq%512A`7wvq< zkcqd{thk{+C~%PNQ{EF+Y#n4$Z+zlielD}KBM-X)MbRqQg5X~77wqi`1CNfkOlN*5 zAe0*H(eA5$(wDYEQWEUVe{jP^fKC4&;07I6`86BuK3eSs;t#I{o+(+W-q> zCC3@2+v5K_X0|IQ0U5BodX**+jkOv67DQdaa*yn&)OjgdQR6sGCBm6g>oyiYL`3MEt1 z^$`F+p6^Ov4k%x}dFQ$X+hVgh$w79_ny3kR9k0?Dmo;6qe1UlwBuPw99SWD@20`qI|c z)h}BRZI`qhVrJ(UZy%Bo*a8_SGA$~g+3{w`rWLFK(e!RXR*h^1HLlpDBV*W{<|tdb zff}}5(0#El5X_L~j<2TUji2v=r0x770`X653Zc{x+r0~+p2306WE&rUYHl0lUvYv$ zPLmuENZtPGnf@zs2xZJyex`{OGYgBtq{m*6v+1KU^8vK%JQMxdSPYWvytXIxhmujeK<9$q9QIy?^O4f#|3i!z}5kcB1e&;H!)o=TQWWcgq53<(~iVP zD}T0ISLdp*KaEU?^|gc@frl?3EJpnv+5VVZy$_Hl-HtKa!^3)>b+-cIoquT<`Bfn> ztq)Bdy=iZy<*g_|3-kRzf9k%5a7v8w7#PH{`V0fgGTV+}u!kdhW7E^wNf<*~ozRk! zE;T0As#}(UZyc2p-`y1%UcFi=B2~sK#<>MsFi5!jYY}Sn1yGGoNl&&06EhiAV;o`s z1_rPlOoq0{a1ITQn#F?EhLl1ng+2?F6k;Z#!;Sz*5c1261upCUm3Xpvsi@FpR4}QK zF~DNdW>ohAEUlrfE%ef3QMj1LM=sASEDTDe91>t-=h3@EDB|vNMl%0u!W_82T=uG6 zzNG`A|N6ejPKE+1H2`+b6B1{aw!Fa>C+D^<-?pVQhZvtGZs{WbPk(#uP4NuDoQWNl zLQ>U0K%hKK{ft<{;EYabsbW=yk1H5y16USm$R3r@Bg|ItCVq zrgU9$s20E*QHr#{+>MM)#59GYqm|hV{@OOe;SFH-0HDPU@E2N+T`ZKA#iA6S%w` zle@WORQj-SIjs>Ao>uQACUDpA48qEveHDG~dtl$?oP||yC z?|9{fv!uYDQ6O5gO1!{^&;V0 zZtK}VZI25O0SD=h1;@2_()$dl`#-!fH^bM{;^KZFySYonv)?cbrD&KK)O1A*cf~20 zqm@V5WdhRiJA&Fw-|Uuy%QY%3vDl}ixIhVVVCz~q6rck0P_ko}{rK-Z(-{-bM(nWp3ud3^bu-PQdap%QeCTxG#^|0|WJ@n#H!62o|*_ zw%$ufJOQCTS3MizV{y42X_lz?A+le9V3KSZutWq`y+DTBT z#rxE?_rHn7)ygar+~oU7P0y=%mb&+LN2&Lhs;I>Me)yvb%yII>QbdHSK@u5>3?yIh zb3f$poirul7rxu|n0Fm8<|U>?H!+b4h3NW+f@B-63nV8>k0zZbK!T2hPY?^)iPRv; zz8;hhU`@h(M5P#qcMT@2|Pqxuw@-H$1u)=Ek`1)}kspkK)* z7a&iHuS=gs#V)9&mIlm>56(Km6#M(^-j+kTXEQF#Pj)Blq@YGp;Zl3uasM=Ke;5HK z2?1DiD%unIf-=j9y4R%q)@yztDR1Nr6!LVU>Sb7AB2q*QP9k^7 z{^)yD7b8*h0st;u%PZi=jJ%KicjXYh%K9$e{6b^yVxNtW;}xFx9qI4f$4HTWYkT_} z;u`}iV1=;Uj@SGL`)6rzEjY}!-T^QqT%g-0DQ^tF=n@9+R#K7%ss;uM)XY(_DL?bl zJ#unzztKgF#WRFb`++@Ls_8l6z~GtdO@)hGfFl(+{z@k-yVB+*kOPY0b{+_XAvNh0 zmH*c1p@Ms|KFD_bPqcewSwshb6L`p}Z3wy0?|(46V(g*nolr+-0J_^%1b-(j_L9NF zS`kh6ms>qa1*mMqq#V3`juW>){E?nGfF|pmTjjquE%FQuVnkS)Kz{uo{98V~*FKsU zRrL!Jh-ZTD{K`gshV_)5TRRvOfO_Kfu2a6&{`a+l!&YloT5s)*Xwl?Z`8hhLe*z6fT;NN_#|-LVQwEOo1s9tq;G|BvMdpn1VqT_D~A)OR*C@L9C9 ze(ZVxs+^v0vwREXa{b>2W#ya4jK~j^TH<43{C@uY8JE5hot|D=%6Vs9U;O9KpE0K% z7+AjZwna@lUMuD+m1rB7Q1P2!iLD%7ZFWSDG>}UB=0Qmg(jsjtbZq-IIweYGO>-Y9cD!`fmF=8sBX zZryOeZDeHhf}I^72n?-axI+HlzCCz^hPKM;a~%RNE9%IWiLnK2?46Oosp2m|0D)Fj z^pceo7ug*E7`nV82K1eSxf;WEe+;%Mu=(Zqpk`^csB&<$g#oCpV8DBVi#w%nvo~36 zYiBoN=-$gsCG1Jk5rk_~323{tmWz#~&d$!rHBTeIrR+c(rU?fF6{*L?R}Kk(5s9c- zbblJJWiON59o-6!LHS1lpoGD_C*pm}TWvKL_@7d82v*{zm+r4kPpdas+1nNt7f(d2 z?d?59M@QeEt$JG8c#2t4x0%F^+WgPq3bZi7gM*)3-P{<0R5|}&w8xKE05Q>h2Bedl z?!oTk^QG6XUS)3}?3*l0?g+EAQq))#A~;w@gf9KKK6qkD72h+S_O68GwvEBzT6El9I9vZ1(MK(O4OR=&|wW z)MG~g+w9>9gURmCR#G=O9|cv0aHe@7Ao~kGc;PtVt};R;HSR*WCPuV^mZr&0mf#Gm zh}ddT|6|Ld<90v^(;VoSS}N%>fC+r?p~t|%^ulCPA3y4S=mIuP@%zu)_q~OG^F)%j zj@bY`oLQqn+-LY>Ya+;O!ymAiI`{xkUgk04=4j6r*?np4?nVbHGzjd!Fu>#^2&|{g zJo>?q1_Fa1rwBkJ$h}Q)Jyyu8g7H7PEzArrX+^HrWB5rL;k$+Wcrvaxpq`U27PONL z2YZqH`dAv|MB<9nP+EcP54~(d%AJK@4rGEOVX{>UzWqLkv-CJUSQoj?vMxw-2tTtTGtn>H=i$lF;{|pUrpKsjy0AuzIkcxvO%0~!UUSHz9m6_ z&{t3+7m_s%(M`)p$80f)Jaua(;HFcTxr(teS5y-mKZ~;>KIQQQ+sRHITg3KR-GUvdH!Fu3!~qL9bMw$)6TJ}Od4?x1y2H2m!b89E!(@UPnA zDP*({$D9pQZ#1PUXV9AQ8#y_NuoZT^}LMuQ>P=^nI#c| zgyU0IXD89>e}IY>_wsNRnD%TqE{$dz5K&Ns0+``8W`BiopW_3t2@HszP%*t5zgEy? z2|)HRdhvliH`&+gJU2IIIGBPYoDIk1wj(iW-O(@H2KlzOp`n6@0F!uv6zMvgdoQG0 zV~xSl%c*nlT>bOA=nJn8+eSkeIe z0N9c^qxffSvUldOII_i;4gTyHq69y)Md^mrda8SdKI6xFy`A7L;7@9%t69P+`1G&( zsT<<7(w|SG<z^0pl~#y0-15jrVtx`?DvA>-6UeH?^PXQrWDz08Qn?I1wP0 zU9P|P27SR@zYG#~1Al}X&XxW0J-`S$CPZb}PC(SED1znJU$E%QLivzFHBoNB)8_`K z>&Ra;Sf7)9ROCbwg=db2ToRe_-Du+lP&)S*W9I4G6hwcjjJ#Twp2)uAU-u^9ex=@H zDB~Kn8|nWL17A_(?vGB8igLCngWP}_YvVDBb>oSoHoL5%;?W=6D6>=p02g)lpd0T! z{d^bo?ahEb(ksF769eHFq{lM#_IsX?vU0A z4zYTlJiVi!!;>MBf$E)JMju2$Q;NEuHOk#r(`PEdO=Vtl2?hF(_4G(LX;-jdWES_H zMdz-9vYW1m52)LmMt$(}EbxfG3UV!^K+(waDMtFREF83TYOF4V!*CVZZ$FurzkG&<@>U3 zOz*$5jh8PGGg<%DE(3or7b6!wsUPRYuwK_<(0C~kQM?|2Vt{=CZJ}=nM~0`Ld=dD< zRgjC3h!9n{8|>-vt*Lnq>`+i<4jXwH1ehm;;o&&oK`m-;j@A`M^#gE<^hfFcub;K8%vkEw8R;d~4`;2l&lhG3H= zC4uK;;Lo3oe;IPw^zajV=k3aZ(P*3D1xrtHaQ=eidBkp#rmJgh8=xj&W5eQQ=nPY2k$RT%#4z{W-W)S(VuVC|1mKR z4}%>)eE_DQj|(=LcfTpkA2)pZ`N-}O*fYLM$iY_12Q}}<>=OUwSx@Vl%y0NxhF;4dkpysxcFq0uo^VwtvfM*Y|aq}eu5AMDDz6}W_ABxw` zfJ+>WpeG3nuM7L)&9X8Duj4a}AH7$7=|^q8b(|lBx-p3X9vp-8^)$ujcZmWXXteDe z=SQFAD=MnH?(gn&kjQ>nRlo~AY+U>Lx0``R>CQ41BtXDK+DUzQO%zTM(wp-GVwfpv{J_NZos@qqXB3ljQ7=8n(oh<`pDWFb*nTvsL?8{qCwwjGgnhy^Fe7n8wxpol9m&3-@ zKJ3;{FnVga_df3F|My)9Gb98Q`~yo>i~d^i++#t0L0&5j_#tV=0CAmFUybG^ktCk; z!+LG=p!R(AEUFNyy0VgawX}C+Ft%yMuXT|VmRyZgGF|VAac%cqv5Ja{&S8Bm+5sV~ zg6QJ{{}apI-HBKJO^~xWpGz0%UXy~OKP2Oyq=5mWsIT9r-1fMjWTw#7&DAWZq1h9# zyy+dGYU|Px?oks=HZRs84B2mvY9G#K?r%{mzbYsby_HJw zxDY+h0R^KM^ehjTJX?sf-n63M?jWz7Yj|gm@~9=tx!;sqN;s2~IG(5h z%o0!`-xb7EiOsa|H#72^5CGg}Eg54fBdWG~=C23e?mKy0E?G?wab<~IkZR=8#GeT1 z1B&$R=jH}M3_0k$uS-0uXd%!Smdec2HU!<%Er3Ah3`4W#WxXCo}m()hX-hCKsn0{}G znX>KBYywy4#Ij<&h3$qqVC=~4WB017=yna@^dSL%e=!0~q)tQSO0T)C@>4l>CG^YF z$N2_R{5N&1Sm7SZS&t6`WFo&&m1*v<)z`&LoW>CMzk z)+<;9wXqS=(G@HBEb13AuNx4L!klv+iNuUvhFjo@c)5d2dnj1Ax;ioAAz%{aijD5p z6Z~|rXU0Qu@=AlcNAtC`Vg|iMAfvCVt8|QI9Y>cclo5p@2wA^6_}rr1*8%HPM`%o-j&I`_;Gl&N>^v#& zTxyQQ+_@hRKWCrbMRZLO&h9*DYtu=ms~$a?sgjI3o!y4@Z_otgZFC6Hz%;h=iVil- zg<-Uu->!iQFg4An%BR23J=m>n$cbjF#qCm~@m~^hbitt$sP8aH-Zhtc{jZgo;oEJ1ww!IDD!**xidGC`hog3CK^?n;`%%#&vMNuq=1630^s`m>BSE;!!c#G!w77 z%m+<~UfX18!y^Bn4x;1R)%B-2&A+K0ylN-wrti|fpU%AgE8&Tp&}!BzAlc7SLAHX_ zOnP@HX>U|&+oe3D{Cqzz7<+_WRLh>Z5Hp%E7pARB95hX!XlX9R&fit&VKphj&xFq z6_iiomAv_ZX{4M{T3VoeN2F^+tKx|R8ufpfeVTP#_=ct|Xb9;a%IrGlv6{dh!q!Zm zXmrjT9|N$`c-1VnJQ1s5J3n){GXn#GYJdN|h-f0zKhwqscwz=ab zpUlnibLu|Wr5-lGVwEvfwz@4uJ$LB&@D04 z%kh_vgvC=Sv0J92ckR$fhu-d$(t5&NwE+oh;6lsTd!F&*2?I6#cP*h)e4S%k+CP+~ zsC^h?#UJRvSmH-sk4V}B`8Fn_0Rf&FUwd4Xfm4;?8no_nptlJx@MY_I?`Gx~6{&SE zN-$y2fP-x0)pc_9)w(398zRLDePN_y#@h7uTtZnf+2Q>8C@BeO1O0hq0=;Akz$l~f zD_()JAfk@J$w3*FPm+*Yy}cOV5?vf_9lP4jZ|8dlRCS4ouPFkem-9-`s=S=shIWcK zDsGWvR#$zudhfn?O5%sB384~Fs_vlw$ih%4a}61F9}8=xQ#P#$}tY$wpR)1)me> LlgFq>f-?UJ^auD5 literal 0 HcmV?d00001 diff --git a/website/src/assets/images/pancake-bunny.svg b/website/src/assets/images/pancake-bunny.svg new file mode 100644 index 000000000..c13dd09b5 --- /dev/null +++ b/website/src/assets/images/pancake-bunny.svg @@ -0,0 +1,4 @@ + + + + diff --git a/website/src/assets/images/portfolio/claimable.svg b/website/src/assets/images/portfolio/claimable.svg new file mode 100644 index 000000000..8aa36e2de --- /dev/null +++ b/website/src/assets/images/portfolio/claimable.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/website/src/assets/images/portfolio/curve.svg b/website/src/assets/images/portfolio/curve.svg new file mode 100644 index 000000000..ace729fe5 --- /dev/null +++ b/website/src/assets/images/portfolio/curve.svg @@ -0,0 +1,1531 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/website/src/assets/images/portfolio/deposit.svg b/website/src/assets/images/portfolio/deposit.svg new file mode 100644 index 000000000..ad10aaef6 --- /dev/null +++ b/website/src/assets/images/portfolio/deposit.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/website/src/assets/images/portfolio/nft.svg b/website/src/assets/images/portfolio/nft.svg new file mode 100644 index 000000000..13fc340b9 --- /dev/null +++ b/website/src/assets/images/portfolio/nft.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/website/src/assets/images/portfolio/pancake.svg b/website/src/assets/images/portfolio/pancake.svg new file mode 100644 index 000000000..0ae8b52c6 --- /dev/null +++ b/website/src/assets/images/portfolio/pancake.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/website/src/assets/images/portfolio/poolto-gether.svg b/website/src/assets/images/portfolio/poolto-gether.svg new file mode 100644 index 000000000..f517f8f34 --- /dev/null +++ b/website/src/assets/images/portfolio/poolto-gether.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/website/src/assets/images/portfolio/uniswap.svg b/website/src/assets/images/portfolio/uniswap.svg new file mode 100644 index 000000000..3416c2987 --- /dev/null +++ b/website/src/assets/images/portfolio/uniswap.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/website/src/assets/images/portfolio/wallet.svg b/website/src/assets/images/portfolio/wallet.svg new file mode 100644 index 000000000..c2dfc0275 --- /dev/null +++ b/website/src/assets/images/portfolio/wallet.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/website/src/assets/images/profile-cover.jpg b/website/src/assets/images/profile-cover.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a0145691a3b7b922eddd1792d31ff04a1b8bbd57 GIT binary patch literal 170669 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

    =4JY{-kff@1PqPw+3D`e(5nAXVk@@_Hs# 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­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≺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 z