diff --git a/Cargo.toml b/Cargo.toml index 966da90..47293e8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,5 +1,5 @@ [workspace] -members = ["crates/cli", "crates/core"] +members = ["crates/cli", "crates/core", "crates/program_wasm"] resolver = "2" [workspace.package] diff --git a/askeladd-dvm-marketplace/.env.example b/askeladd-dvm-marketplace/.env.example new file mode 100644 index 0000000..cda9e27 --- /dev/null +++ b/askeladd-dvm-marketplace/.env.example @@ -0,0 +1,2 @@ +DEFAULT_NOSTR_USER_SK=9f...f4 +NEXT_PUBLIC_DEFAULT_NOSTR_USER_SK=9f...f4 # We can generate Nostr private key for user after diff --git a/askeladd-dvm-marketplace/.gitignore b/askeladd-dvm-marketplace/.gitignore index fd3dbb5..6aae113 100644 --- a/askeladd-dvm-marketplace/.gitignore +++ b/askeladd-dvm-marketplace/.gitignore @@ -27,6 +27,8 @@ yarn-error.log* # local env files .env*.local +.env*.develop +.env # vercel .vercel diff --git a/askeladd-dvm-marketplace/next.config.mjs b/askeladd-dvm-marketplace/next.config.mjs index 876a069..2abb9c8 100644 --- a/askeladd-dvm-marketplace/next.config.mjs +++ b/askeladd-dvm-marketplace/next.config.mjs @@ -1,6 +1,8 @@ /** @type {import('next').NextConfig} */ const nextConfig = { + webpack: (config, { isServer }) => { + const wasmExtensionRegExp = /\.wasm$/; if (!isServer) { config.resolve.fallback = { ...config.resolve.fallback, @@ -8,7 +10,34 @@ const nextConfig = { net: false, tls: false, }; + config.resolve.extensions.push(".wasm"); + config.experiments = { + asyncWebAssembly: true, + syncWebAssembly: true, + layers: true // for using `import { ... } from 'rust-nostr/nostr-sdk'` syntax + }; } + config.resolve.extensions.push(".wasm"); + // config.module.rules.forEach((rule) => { + // (rule.oneOf || []).forEach((oneOf) => { + // if (oneOf.type === "asset/resource") { + // oneOf.exclude.push(wasmExtensionRegExp); + // } + // }); + // }); + // // Add wasm-loader + // config.module.rules.push({ + // test: /\.wasm$/, + // type: 'javascript/auto', + // use: { + // loader: 'wasm-loader', + // } + // }); + config.experiments = { + asyncWebAssembly: true, + syncWebAssembly: true, + layers: true // for using `import { ... } from 'rust-nostr/nostr-sdk'` syntax + }; return config; }, }; diff --git a/askeladd-dvm-marketplace/package-lock.json b/askeladd-dvm-marketplace/package-lock.json index b1629e7..f6bfbb4 100644 --- a/askeladd-dvm-marketplace/package-lock.json +++ b/askeladd-dvm-marketplace/package-lock.json @@ -8,7 +8,9 @@ "name": "askeladd-dvm-marketplace", "version": "0.1.0", "dependencies": { + "@nostr-dev-kit/ndk": "^2.8.2", "@rust-nostr/nostr-sdk": "^0.33.0", + "dotenv": "^16.4.5", "next": "14.2.5", "react": "^18", "react-dom": "^18" @@ -233,66 +235,6 @@ "glob": "10.3.10" } }, - "node_modules/@next/swc-darwin-arm64": { - "version": "14.2.5", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.5.tgz", - "integrity": "sha512-/9zVxJ+K9lrzSGli1///ujyRfon/ZneeZ+v4ptpiPoOU+GKZnm8Wj8ELWU1Pm7GHltYRBklmXMTUqM/DqQ99FQ==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-darwin-x64": { - "version": "14.2.5", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.5.tgz", - "integrity": "sha512-vXHOPCwfDe9qLDuq7U1OYM2wUY+KQ4Ex6ozwsKxp26BlJ6XXbHleOUldenM67JRyBfVjv371oneEvYd3H2gNSA==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-arm64-gnu": { - "version": "14.2.5", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.5.tgz", - "integrity": "sha512-vlhB8wI+lj8q1ExFW8lbWutA4M2ZazQNvMWuEDqZcuJJc78iUnLdPPunBPX8rC4IgT6lIx/adB+Cwrl99MzNaA==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-arm64-musl": { - "version": "14.2.5", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.5.tgz", - "integrity": "sha512-NpDB9NUR2t0hXzJJwQSGu1IAOYybsfeB+LxpGsXrRIb7QOrYmidJz3shzY8cM6+rO4Aojuef0N/PEaX18pi9OA==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, "node_modules/@next/swc-linux-x64-gnu": { "version": "14.2.5", "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.5.tgz", @@ -323,49 +265,42 @@ "node": ">= 10" } }, - "node_modules/@next/swc-win32-arm64-msvc": { - "version": "14.2.5", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.5.tgz", - "integrity": "sha512-1GpG2VhbspO+aYoMOQPQiqc/tG3LzmsdBH0LhnDS3JrtDx2QmzXe0B6mSZZiN3Bq7IOMXxv1nlsjzoS1+9mzZw==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" + "node_modules/@noble/ciphers": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-0.2.0.tgz", + "integrity": "sha512-6YBxJDAapHSdd3bLDv6x2wRPwq4QFMUaB3HvljNBUTThDd12eSm7/3F+2lnfzx2jvM+S6Nsy0jEt9QbPqSwqRw==", + "funding": { + "url": "https://paulmillr.com/funding/" } }, - "node_modules/@next/swc-win32-ia32-msvc": { - "version": "14.2.5", - "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.5.tgz", - "integrity": "sha512-Igh9ZlxwvCDsu6438FXlQTHlRno4gFpJzqPjSIBZooD22tKeI4fE/YMRoHVJHmrQ2P5YL1DoZ0qaOKkbeFWeMg==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" + "node_modules/@noble/curves": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.4.2.tgz", + "integrity": "sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==", + "dependencies": { + "@noble/hashes": "1.4.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" } }, - "node_modules/@next/swc-win32-x64-msvc": { - "version": "14.2.5", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.5.tgz", - "integrity": "sha512-tEQ7oinq1/CjSG9uSTerca3v4AZ+dFa+4Yu6ihaG8Ud8ddqLQgFGcnwYls13H5X5CPDPZJdYxyeMui6muOLd4g==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "win32" - ], + "node_modules/@noble/hashes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", + "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", "engines": { - "node": ">= 10" + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@noble/secp256k1": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-2.1.0.tgz", + "integrity": "sha512-XLEQQNdablO0XZOIniFQimiXsZDNwaYgL96dZwC54Q30imSbAOFf3NKtepc+cXyuZf5Q1HCgbqgZ2UFFuHVcEw==", + "funding": { + "url": "https://paulmillr.com/funding/" } }, "node_modules/@nodelib/fs.scandir": { @@ -403,6 +338,25 @@ "node": ">= 8" } }, + "node_modules/@nostr-dev-kit/ndk": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/@nostr-dev-kit/ndk/-/ndk-2.8.2.tgz", + "integrity": "sha512-+dOEyuYvO5/MoI5iTi8C5HifmvfeEvpybNesluVYyu+o+koFdfc+WSYH050V8+9KlOgx8nOZAaqXnHz0KY1gBA==", + "dependencies": { + "@noble/curves": "^1.4.0", + "@noble/hashes": "^1.3.1", + "@noble/secp256k1": "^2.0.0", + "@scure/base": "^1.1.1", + "debug": "^4.3.4", + "light-bolt11-decoder": "^3.0.0", + "node-fetch": "^3.3.1", + "nostr-tools": "^1.15.0", + "tseep": "^1.1.1", + "typescript-lru-cache": "^2.0.0", + "utf8-buffer": "^1.0.0", + "websocket-polyfill": "^0.0.3" + } + }, "node_modules/@pkgjs/parseargs": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", @@ -436,6 +390,83 @@ "node": ">= 10" } }, + "node_modules/@scure/base": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.7.tgz", + "integrity": "sha512-PPNYBslrLNNUQ/Yad37MHYsNQtK67EhWb6WtSvNLLPo7SdVZgkUjD6Dg+5On7zNwmskf8OX7I7Nx5oN+MIWE0g==", + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip32": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.3.1.tgz", + "integrity": "sha512-osvveYtyzdEVbt3OfwwXFr4P2iVBL5u1Q3q4ONBfDY/UpOuXmOlbgwc1xECEboY8wIays8Yt6onaWMUdUbfl0A==", + "dependencies": { + "@noble/curves": "~1.1.0", + "@noble/hashes": "~1.3.1", + "@scure/base": "~1.1.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip32/node_modules/@noble/curves": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.1.0.tgz", + "integrity": "sha512-091oBExgENk/kGj3AZmtBDMpxQPDtxQABR2B9lb1JbVTs6ytdzZNwvhxQ4MWasRNEzlbEH8jCWFCwhF/Obj5AA==", + "dependencies": { + "@noble/hashes": "1.3.1" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip32/node_modules/@noble/curves/node_modules/@noble/hashes": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.1.tgz", + "integrity": "sha512-EbqwksQwz9xDRGfDST86whPBgM65E0OH/pCgqW0GBVzO22bNE+NuIbeTb714+IfSjU3aRk47EUvXIb5bTsenKA==", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip32/node_modules/@noble/hashes": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.3.tgz", + "integrity": "sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA==", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip39": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.2.1.tgz", + "integrity": "sha512-Z3/Fsz1yr904dduJD0NpiyRHhRYHdcnyh73FZWiV+/qhWi83wNJ3NWolYqCEN+ZWsUz2TWwajJggcRE9r1zUYg==", + "dependencies": { + "@noble/hashes": "~1.3.0", + "@scure/base": "~1.1.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip39/node_modules/@noble/hashes": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.3.tgz", + "integrity": "sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA==", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/@swc/counter": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", @@ -962,6 +993,18 @@ "node": ">=8" } }, + "node_modules/bufferutil": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.8.tgz", + "integrity": "sha512-4T53u4PdgsXqKaIctwF8ifXlRTTmEPJ8iEPWFdGZvcf7sbwYo6FKFEX9eNNAnzFZ7EzJAQ3CJeOtCRA4rDp7Pw==", + "hasInstallScript": true, + "dependencies": { + "node-gyp-build": "^4.3.0" + }, + "engines": { + "node": ">=6.14.2" + } + }, "node_modules/busboy": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", @@ -1151,12 +1194,32 @@ "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", "dev": true }, + "node_modules/d": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.2.tgz", + "integrity": "sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==", + "dependencies": { + "es5-ext": "^0.10.64", + "type": "^2.7.2" + }, + "engines": { + "node": ">=0.12" + } + }, "node_modules/damerau-levenshtein": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", "dev": true }, + "node_modules/data-uri-to-buffer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", + "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", + "engines": { + "node": ">= 12" + } + }, "node_modules/data-view-buffer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", @@ -1212,7 +1275,6 @@ "version": "4.3.6", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", - "dev": true, "dependencies": { "ms": "2.1.2" }, @@ -1333,6 +1395,17 @@ "node": ">=6.0.0" } }, + "node_modules/dotenv": { + "version": "16.4.5", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", + "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, "node_modules/eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", @@ -1536,6 +1609,43 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/es5-ext": { + "version": "0.10.64", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.64.tgz", + "integrity": "sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==", + "hasInstallScript": true, + "dependencies": { + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.3", + "esniff": "^2.0.1", + "next-tick": "^1.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", + "dependencies": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/es6-symbol": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.4.tgz", + "integrity": "sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==", + "dependencies": { + "d": "^1.0.2", + "ext": "^1.7.0" + }, + "engines": { + "node": ">=0.12" + } + }, "node_modules/escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", @@ -1901,6 +2011,20 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/esniff": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/esniff/-/esniff-2.0.1.tgz", + "integrity": "sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==", + "dependencies": { + "d": "^1.0.1", + "es5-ext": "^0.10.62", + "event-emitter": "^0.3.5", + "type": "^2.7.2" + }, + "engines": { + "node": ">=0.10" + } + }, "node_modules/espree": { "version": "9.6.1", "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", @@ -1960,6 +2084,23 @@ "node": ">=0.10.0" } }, + "node_modules/event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==", + "dependencies": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, + "node_modules/ext": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", + "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", + "dependencies": { + "type": "^2.7.2" + } + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -2015,6 +2156,28 @@ "reusify": "^1.0.4" } }, + "node_modules/fetch-blob": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", + "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "paypal", + "url": "https://paypal.me/jimmywarting" + } + ], + "dependencies": { + "node-domexception": "^1.0.0", + "web-streams-polyfill": "^3.0.3" + }, + "engines": { + "node": "^12.20 || >= 14.13" + } + }, "node_modules/file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", @@ -2100,26 +2263,23 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/formdata-polyfill": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", + "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", + "dependencies": { + "fetch-blob": "^3.1.2" + }, + "engines": { + "node": ">=12.20.0" + } + }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "dev": true }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, "node_modules/function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", @@ -2828,6 +2988,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" + }, "node_modules/is-weakmap": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", @@ -3022,6 +3187,25 @@ "node": ">= 0.8.0" } }, + "node_modules/light-bolt11-decoder": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/light-bolt11-decoder/-/light-bolt11-decoder-3.1.1.tgz", + "integrity": "sha512-sLg/KCwYkgsHWkefWd6KqpCHrLFWWaXTOX3cf6yD2hAzL0SLpX+lFcaFK2spkjbgzG6hhijKfORDc9WoUHwX0A==", + "dependencies": { + "@scure/base": "1.1.1" + } + }, + "node_modules/light-bolt11-decoder/node_modules/@scure/base": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.1.tgz", + "integrity": "sha512-ZxOhsSyxYwLJj3pLZCefNitxsj093tb2vq90mp2txoYeBqbcjDjqFhyM8eUjq/uFm6zJ+mUuqxlS2FkuSY1MTA==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ] + }, "node_modules/lilconfig": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", @@ -3130,8 +3314,7 @@ "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/mz": { "version": "2.7.0", @@ -3216,6 +3399,11 @@ } } }, + "node_modules/next-tick": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==" + }, "node_modules/next/node_modules/postcss": { "version": "8.4.31", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", @@ -3243,6 +3431,51 @@ "node": "^10 || ^12 || >=14" } }, + "node_modules/node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], + "engines": { + "node": ">=10.5.0" + } + }, + "node_modules/node-fetch": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", + "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", + "dependencies": { + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/node-fetch" + } + }, + "node_modules/node-gyp-build": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.1.tgz", + "integrity": "sha512-OSs33Z9yWr148JZcbZd5WiAXhh/n9z8TxQcdMhIOlpN9AhWpLfvVFO73+m77bBABQMaY9XSvIa+qk0jlI7Gcaw==", + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -3252,6 +3485,60 @@ "node": ">=0.10.0" } }, + "node_modules/nostr-tools": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/nostr-tools/-/nostr-tools-1.17.0.tgz", + "integrity": "sha512-LZmR8GEWKZeElbFV5Xte75dOeE9EFUW/QLI1Ncn3JKn0kFddDKEfBbFN8Mu4TMs+L4HR/WTPha2l+PPuRnJcMw==", + "dependencies": { + "@noble/ciphers": "0.2.0", + "@noble/curves": "1.1.0", + "@noble/hashes": "1.3.1", + "@scure/base": "1.1.1", + "@scure/bip32": "1.3.1", + "@scure/bip39": "1.2.1" + }, + "peerDependencies": { + "typescript": ">=5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/nostr-tools/node_modules/@noble/curves": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.1.0.tgz", + "integrity": "sha512-091oBExgENk/kGj3AZmtBDMpxQPDtxQABR2B9lb1JbVTs6ytdzZNwvhxQ4MWasRNEzlbEH8jCWFCwhF/Obj5AA==", + "dependencies": { + "@noble/hashes": "1.3.1" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/nostr-tools/node_modules/@noble/hashes": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.1.tgz", + "integrity": "sha512-EbqwksQwz9xDRGfDST86whPBgM65E0OH/pCgqW0GBVzO22bNE+NuIbeTb714+IfSjU3aRk47EUvXIb5bTsenKA==", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/nostr-tools/node_modules/@scure/base": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.1.tgz", + "integrity": "sha512-ZxOhsSyxYwLJj3pLZCefNitxsj093tb2vq90mp2txoYeBqbcjDjqFhyM8eUjq/uFm6zJ+mUuqxlS2FkuSY1MTA==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ] + }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -4520,11 +4807,26 @@ "strip-bom": "^3.0.0" } }, + "node_modules/tseep": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tseep/-/tseep-1.2.2.tgz", + "integrity": "sha512-GgPFuNx+08UaYBYmJQmuI86ykYa2PUUtfXAYb4MLRHGunSCp8k9N+dbsR4PK1yk4/zV9q4e4PrNg8ymXqGYaYA==" + }, "node_modules/tslib": { "version": "2.6.3", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" }, + "node_modules/tstl": { + "version": "2.5.16", + "resolved": "https://registry.npmjs.org/tstl/-/tstl-2.5.16.tgz", + "integrity": "sha512-+O2ybLVLKcBwKm4HymCEwZIT0PpwS3gCYnxfSDEjJEKADvIFruaQjd3m7CAKNU1c7N3X3WjVz87re7TA2A5FUw==" + }, + "node_modules/type": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/type/-/type-2.7.3.tgz", + "integrity": "sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==" + }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -4622,11 +4924,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, "node_modules/typescript": { "version": "5.5.4", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==", - "dev": true, + "devOptional": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -4635,6 +4945,11 @@ "node": ">=14.17" } }, + "node_modules/typescript-lru-cache": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/typescript-lru-cache/-/typescript-lru-cache-2.0.0.tgz", + "integrity": "sha512-Jp57Qyy8wXeMkdNuZiglE6v2Cypg13eDA1chHwDG6kq51X7gk4K7P7HaDdzZKCxkegXkVHNcPD0n5aW6OZH3aA==" + }, "node_modules/unbox-primitive": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", @@ -4665,12 +4980,78 @@ "punycode": "^2.1.0" } }, + "node_modules/utf-8-validate": { + "version": "5.0.10", + "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.10.tgz", + "integrity": "sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==", + "hasInstallScript": true, + "dependencies": { + "node-gyp-build": "^4.3.0" + }, + "engines": { + "node": ">=6.14.2" + } + }, + "node_modules/utf8-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/utf8-buffer/-/utf8-buffer-1.0.0.tgz", + "integrity": "sha512-ueuhzvWnp5JU5CiGSY4WdKbiN/PO2AZ/lpeLiz2l38qwdLy/cW40XobgyuIWucNyum0B33bVB0owjFCeGBSLqg==", + "engines": { + "node": ">=8" + } + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "dev": true }, + "node_modules/web-streams-polyfill": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", + "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/websocket": { + "version": "1.0.35", + "resolved": "https://registry.npmjs.org/websocket/-/websocket-1.0.35.tgz", + "integrity": "sha512-/REy6amwPZl44DDzvRCkaI1q1bIiQB0mEFQLUrhz3z2EK91cp3n72rAjUlrTP0zV22HJIUOVHQGPxhFRjxjt+Q==", + "dependencies": { + "bufferutil": "^4.0.1", + "debug": "^2.2.0", + "es5-ext": "^0.10.63", + "typedarray-to-buffer": "^3.1.5", + "utf-8-validate": "^5.0.2", + "yaeti": "^0.0.6" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/websocket-polyfill": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/websocket-polyfill/-/websocket-polyfill-0.0.3.tgz", + "integrity": "sha512-pF3kR8Uaoau78MpUmFfzbIRxXj9PeQrCuPepGE6JIsfsJ/o/iXr07Q2iQNzKSSblQJ0FiGWlS64N4pVSm+O3Dg==", + "dependencies": { + "tstl": "^2.0.7", + "websocket": "^1.0.28" + } + }, + "node_modules/websocket/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/websocket/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -4894,6 +5275,14 @@ } } }, + "node_modules/yaeti": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/yaeti/-/yaeti-0.0.6.tgz", + "integrity": "sha512-MvQa//+KcZCUkBTIC9blM+CU9J2GzuTytsOUwf2lidtvkx/6gnEp1QvJv34t9vdjhFmha/mUiNDbN0D0mJWdug==", + "engines": { + "node": ">=0.10.32" + } + }, "node_modules/yaml": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.5.0.tgz", @@ -4917,6 +5306,111 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } + }, + "node_modules/@next/swc-darwin-arm64": { + "version": "14.2.5", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.5.tgz", + "integrity": "sha512-/9zVxJ+K9lrzSGli1///ujyRfon/ZneeZ+v4ptpiPoOU+GKZnm8Wj8ELWU1Pm7GHltYRBklmXMTUqM/DqQ99FQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-darwin-x64": { + "version": "14.2.5", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.5.tgz", + "integrity": "sha512-vXHOPCwfDe9qLDuq7U1OYM2wUY+KQ4Ex6ozwsKxp26BlJ6XXbHleOUldenM67JRyBfVjv371oneEvYd3H2gNSA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-gnu": { + "version": "14.2.5", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.5.tgz", + "integrity": "sha512-vlhB8wI+lj8q1ExFW8lbWutA4M2ZazQNvMWuEDqZcuJJc78iUnLdPPunBPX8rC4IgT6lIx/adB+Cwrl99MzNaA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-musl": { + "version": "14.2.5", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.5.tgz", + "integrity": "sha512-NpDB9NUR2t0hXzJJwQSGu1IAOYybsfeB+LxpGsXrRIb7QOrYmidJz3shzY8cM6+rO4Aojuef0N/PEaX18pi9OA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-arm64-msvc": { + "version": "14.2.5", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.5.tgz", + "integrity": "sha512-1GpG2VhbspO+aYoMOQPQiqc/tG3LzmsdBH0LhnDS3JrtDx2QmzXe0B6mSZZiN3Bq7IOMXxv1nlsjzoS1+9mzZw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-ia32-msvc": { + "version": "14.2.5", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.5.tgz", + "integrity": "sha512-Igh9ZlxwvCDsu6438FXlQTHlRno4gFpJzqPjSIBZooD22tKeI4fE/YMRoHVJHmrQ2P5YL1DoZ0qaOKkbeFWeMg==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-x64-msvc": { + "version": "14.2.5", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.5.tgz", + "integrity": "sha512-tEQ7oinq1/CjSG9uSTerca3v4AZ+dFa+4Yu6ihaG8Ud8ddqLQgFGcnwYls13H5X5CPDPZJdYxyeMui6muOLd4g==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } } } } diff --git a/askeladd-dvm-marketplace/package.json b/askeladd-dvm-marketplace/package.json index bb133b5..929bfc8 100644 --- a/askeladd-dvm-marketplace/package.json +++ b/askeladd-dvm-marketplace/package.json @@ -9,7 +9,9 @@ "lint": "next lint" }, "dependencies": { + "@nostr-dev-kit/ndk": "^2.8.2", "@rust-nostr/nostr-sdk": "^0.33.0", + "dotenv": "^16.4.5", "next": "14.2.5", "react": "^18", "react-dom": "^18" diff --git a/askeladd-dvm-marketplace/src/app/layout.tsx b/askeladd-dvm-marketplace/src/app/layout.tsx index ac36310..bcbd364 100644 --- a/askeladd-dvm-marketplace/src/app/layout.tsx +++ b/askeladd-dvm-marketplace/src/app/layout.tsx @@ -1,3 +1,4 @@ +import { NostrProvider } from "@/context/NostrContext"; import "./globals.css"; import { Inter } from "next/font/google"; @@ -15,7 +16,10 @@ export default function RootLayout({ }) { return ( - {children} + + {children} + + ); } diff --git a/askeladd-dvm-marketplace/src/app/page.tsx b/askeladd-dvm-marketplace/src/app/page.tsx index fa2878a..29d7e48 100644 --- a/askeladd-dvm-marketplace/src/app/page.tsx +++ b/askeladd-dvm-marketplace/src/app/page.tsx @@ -1,26 +1,51 @@ "use client"; import { useState, useEffect } from "react"; -import { verifyProof } from "../lib/stwo"; +import { NDKEvent, NDKKind, NDKPrivateKeySigner } from '@nostr-dev-kit/ndk'; +import { useNostrContext } from "@/context/NostrContext"; +import { useSendNote } from "@/hooks/useSendNote"; +import { JobResultProver, StarkProof } from "@/types"; +import init, { run_fibonacci_example, run_fibonacci_verify_exemple } from "../pkg/program_wasm"; +import { useFetchEvents } from "@/hooks/useFetchEvents"; export default function Home() { const [logSize, setLogSize] = useState(5); const [claim, setClaim] = useState(443693538); const [jobId, setJobId] = useState(null); + const [error, setError] = useState() + const [starkProof, setStarkProof] = useState() + // const [starkProof, setStarkProof] = useState() + + const [events, setEvents] = useState([]) + const [selectedEvent, setSelectedEvent] = useState() const [proofStatus, setProofStatus] = useState< "idle" | "pending" | "received" | "verified" >("idle"); const [proof, setProof] = useState(null); const [isLoading, setIsLoading] = useState(false); + const [isInitialized, setIsInitialized] = useState(false); + const [isFetchJob, setIsFetchJob] = useState(false); + const [timestampJob, setTimestampJob] = useState(); + const { ndk } = useNostrContext() + const { fetchEvents } = useFetchEvents() + const { sendNote } = useSendNote() useEffect(() => { - const initNostr = async () => { - // TODO: load the wasm module - //await (window as any).loadWasmAsync(); - }; - initNostr(); + init() + .then(() => setIsInitialized(true)) + .catch((error) => { + console.error("Failed to initialize WASM module:", error); + + }); }, []); + useEffect(() => { + + if (jobId && !isFetchJob) { + waitingForJobResult() + } + }, [jobId, isFetchJob]) + const submitJob = async () => { setIsLoading(true); setProofStatus("pending"); @@ -29,24 +54,120 @@ export default function Home() { const eventId = Math.random().toString(36).substring(7); setJobId(eventId); - // Simulate waiting for job result + const tags = [ + ['param', 'log_size', logSize.toString()], + ['param', 'claim', claim.toString()], + ['output', 'text/json'] + ]; + + const content = JSON.stringify({ + request: { + log_size: logSize.toString(), + claim: claim.toString() + } + + }) + + // Define the timestamp before which you want to fetch events + setTimestampJob(new Date().getTime()) + /** Use Nostr extension to send event */ + if (typeof window !== "undefined" && window.nostr) { + const pubkey = await window.nostr.getPublicKey(); + const event = await window.nostr.signEvent({ pubkey: pubkey, created_at: new Date().getTime(), kind: 5600, tags: tags, content: content }) // takes an event object, adds `id`, `pubkey` and `sig` and returns it + if (event?.sig) { + setJobId(event?.sig); + } + } + /** NDK event + * Generate or import private key after + */ + let { result, event } = await sendNote({ content, tags, kind: 5600 }) + console.log("event", event) + if (event?.sig) { + setJobId(event?.sig); + } + + }; + + // Fetch Job result from the Prover + const fetchEventsProof = async () => { + + setIsFetchJob(false) + + const { events } = await fetchEvents() + if (!events) return; + console.log("events", events); + setEvents(events) + /** @TODO fetch the correct event + * - Tags: By reply of the event_id of the job request? + * - By author + * - Timestamp since/until (doesn't work as expected for me) + */ + let lastEvent = events[events?.length - 1] + // let lastEvent= events.find((e) => e?.id == "48b273cee7d08538604f1797c92685a4638d53a8fea56ff9fe48a436ad4a2e73") + if(!lastEvent) return; + setSelectedEvent(lastEvent) + setProof(lastEvent?.content) + + const jobProofSerialize: JobResultProver = JSON.parse(lastEvent?.content) + console.log('jobProofSerialize serialize', jobProofSerialize); + + const proofSerialize = jobProofSerialize?.response?.proof; + console.log('proof serialize', proofSerialize); + setStarkProof(proofSerialize); + setProofStatus("received"); + } + + const waitingForJobResult = async () => { setTimeout(() => { - const mockProof = { - proof: "mocked_proof_data", - public_inputs: [logSize, claim], - }; - setProof(JSON.stringify(mockProof)); - setProofStatus("received"); + console.log("waiting timeout") + fetchEventsProof() setIsLoading(false); + }, 5000); - }; + } const verifyProofHandler = async () => { - if (proof) { - setIsLoading(true); - const isValid = await verifyProof(proof); - setProofStatus(isValid ? "verified" : "idle"); + try { + if (proof) { + setIsLoading(true); + const prove_result = run_fibonacci_example(logSize, claim); + console.log("prove_result", prove_result); + const verify_result = run_fibonacci_verify_exemple(logSize, claim, JSON.stringify(starkProof)); + console.log("verify result", verify_result); + console.log("verify message", verify_result.message); + console.log("verify success", verify_result.success); + + if (verify_result?.success) { + console.log("is success verify result") + setProofStatus("verified"); + } else { + setError(verify_result?.message) + } + + /** @TODO fix ERROR verify loop between all stark proof*/ + for (let event of events) { + const jobProofSerialize: JobResultProver = JSON.parse(event?.content) + const proofSerialize = jobProofSerialize?.response?.proof; + const verify_result = run_fibonacci_verify_exemple(logSize, claim, JSON.stringify(proofSerialize)); + console.log("loop verify result", verify_result.message); + console.log("loop verify success", verify_result.success); + if (verify_result?.success) { + console.log("is success verify result") + setProofStatus("verified"); + } else { + setError(verify_result?.message) + } + } + setIsLoading(false); + setIsFetchJob(true) + } + } catch (e) { + console.log("Verify error", e); + } finally { setIsLoading(false); + setIsFetchJob(true) + } }; @@ -80,9 +201,8 @@ export default function Home() { @@ -93,18 +213,26 @@ export default function Home() {

Job ID: {jobId}

Status: {proofStatus}

{isLoading &&
} + + {error &&

Error: {error}

} {proof && (

Proof received:

                 {proof}
               
+ {starkProof && + + <> +

Proof of work nonce: {starkProof?.commitment_scheme_proof?.proof_of_work?.nonce}

+ + + } diff --git a/askeladd-dvm-marketplace/src/constants/relay.ts b/askeladd-dvm-marketplace/src/constants/relay.ts new file mode 100644 index 0000000..39d9846 --- /dev/null +++ b/askeladd-dvm-marketplace/src/constants/relay.ts @@ -0,0 +1,5 @@ +export const ASKELADD_RELAY= [ + // DVM service prover deployed need to subscribed to this relays + "ws://127.0.0.1:8080", // run in local + "wss://relay.nostr.net", +] diff --git a/askeladd-dvm-marketplace/src/context/NostrContext.tsx b/askeladd-dvm-marketplace/src/context/NostrContext.tsx new file mode 100644 index 0000000..b66fcc9 --- /dev/null +++ b/askeladd-dvm-marketplace/src/context/NostrContext.tsx @@ -0,0 +1,46 @@ +"use client"; + +import { ASKELADD_RELAY } from '@/constants/relay'; +import NDK, {NDKPrivateKeySigner} from '@nostr-dev-kit/ndk'; +import {createContext, useContext, useEffect, useState} from 'react'; +import dotenv from "dotenv"; +dotenv.config(); + +export type NostrContextType = { + ndk: NDK; +}; + +export const NostrContext = createContext(null); + +export const NostrProvider: React.FC = ({children}) => { + const [privateKey, setPrivateKey] = useState(process.env.NEXT_PUBLIC_DEFAULT_NOSTR_USER_SK) + + const [ndk, setNdk] = useState( + new NDK({ + explicitRelayUrls: ASKELADD_RELAY, + }), + ); + + useEffect(() => { + const newNdk = new NDK({ + explicitRelayUrls: ASKELADD_RELAY, + signer: privateKey ? new NDKPrivateKeySigner(privateKey) : undefined, + }); + + newNdk.connect().then(() => { + setNdk(newNdk); + }); + }, [privateKey, process.env.DEFAULT_NOSTR_USER_SK]); + + return {children}; +}; + +export const useNostrContext = () => { + const nostr = useContext(NostrContext); + + if (!nostr) { + throw new Error('NostrContext must be used within a NostrProvider'); + } + + return nostr; +}; diff --git a/askeladd-dvm-marketplace/src/hooks/useFetchEvents.ts b/askeladd-dvm-marketplace/src/hooks/useFetchEvents.ts new file mode 100644 index 0000000..9c9b8d3 --- /dev/null +++ b/askeladd-dvm-marketplace/src/hooks/useFetchEvents.ts @@ -0,0 +1,28 @@ +import { useNostrContext } from '@/context/NostrContext'; +import { NDKEvent, NDKKind } from '@nostr-dev-kit/ndk'; + +export const useFetchEvents = () => { + const { ndk } = useNostrContext(); + const fetchEvents = async (kind?: NDKKind | number, limit?:number) => { + try { + if (!ndk?.signer) return { result: undefined, events: undefined }; + let eventsResult = await ndk.fetchEvents({ + kinds: [kind ?? 6600 as NDKKind], + limit: limit ?? 50, + }); + const events = Array.from(eventsResult?.values()) + console.log("events", events); + + return { + result:undefined, + events:events + }; + } catch (e) { + return { + result:undefined, + events:[] + }; + } + } + return { fetchEvents } +}; diff --git a/askeladd-dvm-marketplace/src/hooks/useSendNote.ts b/askeladd-dvm-marketplace/src/hooks/useSendNote.ts new file mode 100644 index 0000000..cd491b0 --- /dev/null +++ b/askeladd-dvm-marketplace/src/hooks/useSendNote.ts @@ -0,0 +1,24 @@ +import { useNostrContext } from '@/context/NostrContext'; +import { NDKEvent, NDKKind } from '@nostr-dev-kit/ndk'; + +export const useSendNote = () => { + const { ndk } = useNostrContext(); + const sendNote = async (data: { content: string; tags?: string[][], kind?: NDKKind | number }) => { + try { + if (!ndk?.signer) return { result: undefined, event: undefined }; + const event = new NDKEvent(ndk); + event.kind = data?.kind; + event.content = data.content; + event.tags = data.tags ?? []; + + let result = await event.publish(); + return { result: result, event }; + } catch (e) { + return { + result: undefined, + event: undefined + } + } + } + return { sendNote } +}; diff --git a/askeladd-dvm-marketplace/src/hooks/useWasmNostrSDK.ts b/askeladd-dvm-marketplace/src/hooks/useWasmNostrSDK.ts new file mode 100644 index 0000000..5f53a8d --- /dev/null +++ b/askeladd-dvm-marketplace/src/hooks/useWasmNostrSDK.ts @@ -0,0 +1,44 @@ +import { useEffect, useState } from 'react'; + +type NostrSDKModule = typeof import('@rust-nostr/nostr-sdk'); + +/** @TODO fix WASM import => using nostr-dev-kit at this moment */ +export function useWasmNostrSDK() { + const [nostrSDK, setNostrSDK] = useState(null); + const [error, setError] = useState(null); + const [isLoading, setIsLoading] = useState(true); + + useEffect(() => { + let isMounted = true; + + async function loadWasmModule() { + try { + setIsLoading(true); + // const { Client, Event, Keys, NostrSigner, Tag, Output, EventId , } = await import('@rust-nostr/nostr-sdk'); + const sdkModule: NostrSDKModule = await import('@rust-nostr/nostr-sdk'); + + const NostrSDK = await import('@rust-nostr/nostr-sdk'); + if (isMounted) { + setNostrSDK(sdkModule); + setIsLoading(false); + } + } catch (err) { + if (isMounted) { + setError(err as Error); + setIsLoading(false); + } + } + } + + // Ensure this is only run on the client + if (typeof window !== 'undefined') { + loadWasmModule(); + } + + return () => { + isMounted = false; + }; + }, []); + + return { nostrSDK, error, isLoading }; +} diff --git a/askeladd-dvm-marketplace/src/pkg/package.json b/askeladd-dvm-marketplace/src/pkg/package.json new file mode 100644 index 0000000..16bb310 --- /dev/null +++ b/askeladd-dvm-marketplace/src/pkg/package.json @@ -0,0 +1,15 @@ +{ + "name": "program_wasm", + "type": "module", + "version": "0.1.0", + "files": [ + "program_wasm_bg.wasm", + "program_wasm.js", + "program_wasm.d.ts" + ], + "main": "program_wasm.js", + "types": "program_wasm.d.ts", + "sideEffects": [ + "./snippets/*" + ] +} \ No newline at end of file diff --git a/askeladd-dvm-marketplace/src/pkg/program_wasm.d.ts b/askeladd-dvm-marketplace/src/pkg/program_wasm.d.ts new file mode 100644 index 0000000..a110ee1 --- /dev/null +++ b/askeladd-dvm-marketplace/src/pkg/program_wasm.d.ts @@ -0,0 +1,62 @@ +/* tslint:disable */ +/* eslint-disable */ +/** +* @param {number} log_size +* @param {number} claim +* @returns {FibonacciResult} +*/ +export function run_fibonacci_example(log_size: number, claim: number): FibonacciResult; +/** +* @param {number} log_size +* @param {number} claim +* @param {string} stark_proof_str +* @returns {FibonacciResult} +*/ +export function run_fibonacci_verify_exemple(log_size: number, claim: number, stark_proof_str: string): FibonacciResult; +/** +*/ +export class FibonacciResult { + free(): void; +/** +*/ + readonly message: string; +/** +*/ + readonly success: boolean; +} + +export type InitInput = RequestInfo | URL | Response | BufferSource | WebAssembly.Module; + +export interface InitOutput { + readonly memory: WebAssembly.Memory; + readonly __wbg_fibonacciresult_free: (a: number) => void; + readonly fibonacciresult_success: (a: number) => number; + readonly fibonacciresult_message: (a: number, b: number) => void; + readonly run_fibonacci_example: (a: number, b: number) => number; + readonly run_fibonacci_verify_exemple: (a: number, b: number, c: number, d: number) => number; + readonly __wbindgen_add_to_stack_pointer: (a: number) => number; + readonly __wbindgen_free: (a: number, b: number, c: number) => void; + readonly __wbindgen_malloc: (a: number, b: number) => number; + readonly __wbindgen_realloc: (a: number, b: number, c: number, d: number) => number; +} + +export type SyncInitInput = BufferSource | WebAssembly.Module; +/** +* Instantiates the given `module`, which can either be bytes or +* a precompiled `WebAssembly.Module`. +* +* @param {SyncInitInput} module +* +* @returns {InitOutput} +*/ +export function initSync(module: SyncInitInput): InitOutput; + +/** +* If `module_or_path` is {RequestInfo} or {URL}, makes a request and +* for everything else, calls `WebAssembly.instantiate` directly. +* +* @param {InitInput | Promise} module_or_path +* +* @returns {Promise} +*/ +export default function __wbg_init (module_or_path?: InitInput | Promise): Promise; diff --git a/askeladd-dvm-marketplace/src/pkg/program_wasm.js b/askeladd-dvm-marketplace/src/pkg/program_wasm.js new file mode 100644 index 0000000..b4cc831 --- /dev/null +++ b/askeladd-dvm-marketplace/src/pkg/program_wasm.js @@ -0,0 +1,252 @@ +let wasm; + +const cachedTextDecoder = (typeof TextDecoder !== 'undefined' ? new TextDecoder('utf-8', { ignoreBOM: true, fatal: true }) : { decode: () => { throw Error('TextDecoder not available') } } ); + +if (typeof TextDecoder !== 'undefined') { cachedTextDecoder.decode(); }; + +let cachedUint8Memory0 = null; + +function getUint8Memory0() { + if (cachedUint8Memory0 === null || cachedUint8Memory0.byteLength === 0) { + cachedUint8Memory0 = new Uint8Array(wasm.memory.buffer); + } + return cachedUint8Memory0; +} + +function getStringFromWasm0(ptr, len) { + ptr = ptr >>> 0; + return cachedTextDecoder.decode(getUint8Memory0().subarray(ptr, ptr + len)); +} + +let cachedInt32Memory0 = null; + +function getInt32Memory0() { + if (cachedInt32Memory0 === null || cachedInt32Memory0.byteLength === 0) { + cachedInt32Memory0 = new Int32Array(wasm.memory.buffer); + } + return cachedInt32Memory0; +} +/** +* @param {number} log_size +* @param {number} claim +* @returns {FibonacciResult} +*/ +export function run_fibonacci_example(log_size, claim) { + const ret = wasm.run_fibonacci_example(log_size, claim); + return FibonacciResult.__wrap(ret); +} + +let WASM_VECTOR_LEN = 0; + +const cachedTextEncoder = (typeof TextEncoder !== 'undefined' ? new TextEncoder('utf-8') : { encode: () => { throw Error('TextEncoder not available') } } ); + +const encodeString = (typeof cachedTextEncoder.encodeInto === 'function' + ? function (arg, view) { + return cachedTextEncoder.encodeInto(arg, view); +} + : function (arg, view) { + const buf = cachedTextEncoder.encode(arg); + view.set(buf); + return { + read: arg.length, + written: buf.length + }; +}); + +function passStringToWasm0(arg, malloc, realloc) { + + if (realloc === undefined) { + const buf = cachedTextEncoder.encode(arg); + const ptr = malloc(buf.length, 1) >>> 0; + getUint8Memory0().subarray(ptr, ptr + buf.length).set(buf); + WASM_VECTOR_LEN = buf.length; + return ptr; + } + + let len = arg.length; + let ptr = malloc(len, 1) >>> 0; + + const mem = getUint8Memory0(); + + let offset = 0; + + for (; offset < len; offset++) { + const code = arg.charCodeAt(offset); + if (code > 0x7F) break; + mem[ptr + offset] = code; + } + + if (offset !== len) { + if (offset !== 0) { + arg = arg.slice(offset); + } + ptr = realloc(ptr, len, len = offset + arg.length * 3, 1) >>> 0; + const view = getUint8Memory0().subarray(ptr + offset, ptr + len); + const ret = encodeString(arg, view); + + offset += ret.written; + ptr = realloc(ptr, len, offset, 1) >>> 0; + } + + WASM_VECTOR_LEN = offset; + return ptr; +} +/** +* @param {number} log_size +* @param {number} claim +* @param {string} stark_proof_str +* @returns {FibonacciResult} +*/ +export function run_fibonacci_verify_exemple(log_size, claim, stark_proof_str) { + const ptr0 = passStringToWasm0(stark_proof_str, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len0 = WASM_VECTOR_LEN; + const ret = wasm.run_fibonacci_verify_exemple(log_size, claim, ptr0, len0); + return FibonacciResult.__wrap(ret); +} + +const FibonacciResultFinalization = (typeof FinalizationRegistry === 'undefined') + ? { register: () => {}, unregister: () => {} } + : new FinalizationRegistry(ptr => wasm.__wbg_fibonacciresult_free(ptr >>> 0)); +/** +*/ +export class FibonacciResult { + + static __wrap(ptr) { + ptr = ptr >>> 0; + const obj = Object.create(FibonacciResult.prototype); + obj.__wbg_ptr = ptr; + FibonacciResultFinalization.register(obj, obj.__wbg_ptr, obj); + return obj; + } + + __destroy_into_raw() { + const ptr = this.__wbg_ptr; + this.__wbg_ptr = 0; + FibonacciResultFinalization.unregister(this); + return ptr; + } + + free() { + const ptr = this.__destroy_into_raw(); + wasm.__wbg_fibonacciresult_free(ptr); + } + /** + * @returns {boolean} + */ + get success() { + const ret = wasm.fibonacciresult_success(this.__wbg_ptr); + return ret !== 0; + } + /** + * @returns {string} + */ + get message() { + let deferred1_0; + let deferred1_1; + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.fibonacciresult_message(retptr, this.__wbg_ptr); + var r0 = getInt32Memory0()[retptr / 4 + 0]; + var r1 = getInt32Memory0()[retptr / 4 + 1]; + deferred1_0 = r0; + deferred1_1 = r1; + return getStringFromWasm0(r0, r1); + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + wasm.__wbindgen_free(deferred1_0, deferred1_1, 1); + } + } +} + +async function __wbg_load(module, imports) { + if (typeof Response === 'function' && module instanceof Response) { + if (typeof WebAssembly.instantiateStreaming === 'function') { + try { + return await WebAssembly.instantiateStreaming(module, imports); + + } catch (e) { + if (module.headers.get('Content-Type') != 'application/wasm') { + console.warn("`WebAssembly.instantiateStreaming` failed because your server does not serve wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\n", e); + + } else { + throw e; + } + } + } + + const bytes = await module.arrayBuffer(); + return await WebAssembly.instantiate(bytes, imports); + + } else { + const instance = await WebAssembly.instantiate(module, imports); + + if (instance instanceof WebAssembly.Instance) { + return { instance, module }; + + } else { + return instance; + } + } +} + +function __wbg_get_imports() { + const imports = {}; + imports.wbg = {}; + imports.wbg.__wbindgen_throw = function(arg0, arg1) { + throw new Error(getStringFromWasm0(arg0, arg1)); + }; + + return imports; +} + +function __wbg_init_memory(imports, maybe_memory) { + +} + +function __wbg_finalize_init(instance, module) { + wasm = instance.exports; + __wbg_init.__wbindgen_wasm_module = module; + cachedInt32Memory0 = null; + cachedUint8Memory0 = null; + + + return wasm; +} + +function initSync(module) { + if (wasm !== undefined) return wasm; + + const imports = __wbg_get_imports(); + + __wbg_init_memory(imports); + + if (!(module instanceof WebAssembly.Module)) { + module = new WebAssembly.Module(module); + } + + const instance = new WebAssembly.Instance(module, imports); + + return __wbg_finalize_init(instance, module); +} + +async function __wbg_init(input) { + if (wasm !== undefined) return wasm; + + if (typeof input === 'undefined') { + input = new URL('program_wasm_bg.wasm', import.meta.url); + } + const imports = __wbg_get_imports(); + + if (typeof input === 'string' || (typeof Request === 'function' && input instanceof Request) || (typeof URL === 'function' && input instanceof URL)) { + input = fetch(input); + } + + __wbg_init_memory(imports); + + const { instance, module } = await __wbg_load(await input, imports); + + return __wbg_finalize_init(instance, module); +} + +export { initSync } +export default __wbg_init; diff --git a/askeladd-dvm-marketplace/src/pkg/program_wasm_bg.wasm b/askeladd-dvm-marketplace/src/pkg/program_wasm_bg.wasm new file mode 100644 index 0000000..e99d2ed Binary files /dev/null and b/askeladd-dvm-marketplace/src/pkg/program_wasm_bg.wasm differ diff --git a/askeladd-dvm-marketplace/src/pkg/program_wasm_bg.wasm.d.ts b/askeladd-dvm-marketplace/src/pkg/program_wasm_bg.wasm.d.ts new file mode 100644 index 0000000..d6129db --- /dev/null +++ b/askeladd-dvm-marketplace/src/pkg/program_wasm_bg.wasm.d.ts @@ -0,0 +1,12 @@ +/* tslint:disable */ +/* eslint-disable */ +export const memory: WebAssembly.Memory; +export function __wbg_fibonacciresult_free(a: number): void; +export function fibonacciresult_success(a: number): number; +export function fibonacciresult_message(a: number, b: number): void; +export function run_fibonacci_example(a: number, b: number): number; +export function run_fibonacci_verify_exemple(a: number, b: number, c: number, d: number): number; +export function __wbindgen_add_to_stack_pointer(a: number): number; +export function __wbindgen_free(a: number, b: number, c: number): void; +export function __wbindgen_malloc(a: number, b: number): number; +export function __wbindgen_realloc(a: number, b: number, c: number, d: number): number; diff --git a/askeladd-dvm-marketplace/src/types/index.ts b/askeladd-dvm-marketplace/src/types/index.ts new file mode 100644 index 0000000..5d9baaf --- /dev/null +++ b/askeladd-dvm-marketplace/src/types/index.ts @@ -0,0 +1,32 @@ +export interface JobResultProver { + job_id:string; + response: { + // params in a JSON object + + // proof + proof:any + // proof:StarkProof + } +} + +export interface StarkProof { + commitments:string[]; + lookup_values:Map; + commitment_scheme_proof:CommitmentSchemeProof +} + +/** @TODO finish to implement correctly */ +export interface CommitmentSchemeProof { + sampled_values:string[]; + decommitments:string[]; + queried_values:string[]; + proof_of_work:{ + nonce:string + }; + fri_proof:{ + inner_layers:{evals_subset:number[][][], }[] + decommitment:{ + hash_witness:number[][] + } + }; +} diff --git a/askeladd-dvm-marketplace/tsconfig.json b/askeladd-dvm-marketplace/tsconfig.json index 7b28589..ed4e6db 100644 --- a/askeladd-dvm-marketplace/tsconfig.json +++ b/askeladd-dvm-marketplace/tsconfig.json @@ -1,5 +1,6 @@ { "compilerOptions": { + "target": "ESNext", "lib": ["dom", "dom.iterable", "esnext"], "allowJs": true, "skipLibCheck": true, @@ -21,6 +22,6 @@ "@/*": ["./src/*"] } }, - "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], + "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts", "**/*wasm"], "exclude": ["node_modules"] } diff --git a/config/default.toml b/config/default.toml index b8292aa..c02200f 100644 --- a/config/default.toml +++ b/config/default.toml @@ -3,3 +3,4 @@ proving_req_sub_id = "askeladd.proving.request" proving_resp_sub_id = "askeladd.proving.response" user_bech32_sk = "nsec1tsaxyqcxp8atqup4facwp0as52f2c0evj4cxpw6yaqetusu7sg8qqzkr3k" prover_agent_sk = "nsec18s6wcqlkglhjmfz3tnjkh0qscf6cqen96ecp5k5k73ktew3l97tstuvy2x" +prover_agent_pk = "npub1w0an6lqax8pa32x38tf7lufn50fzv3cwx6nrjjxtm9yfkl94rleqxrvdxc" diff --git a/crates/program_wasm/Cargo.toml b/crates/program_wasm/Cargo.toml new file mode 100644 index 0000000..b891715 --- /dev/null +++ b/crates/program_wasm/Cargo.toml @@ -0,0 +1,19 @@ +[package] +name = "program_wasm" +version = "0.1.0" +edition = "2021" + +[lib] +crate-type = ["cdylib"] + +[dependencies] +stwo-prover = { git = "https://github.com/starkware-libs/stwo.git" } +wasm-bindgen = "0.2.84" +serde_json = "1.0.121" +getrandom = { version = "0.2", features = ["js"] } + +[dev-dependencies] +wasm-bindgen-test = "0.3.34" + +[package.metadata.wasm-pack.profile.release] +wasm-opt = false diff --git a/crates/program_wasm/src/fibonacci.rs b/crates/program_wasm/src/fibonacci.rs new file mode 100644 index 0000000..7c1b70b --- /dev/null +++ b/crates/program_wasm/src/fibonacci.rs @@ -0,0 +1,68 @@ +use serde_json; +use stwo_prover::core::fields::m31::BaseField; +use stwo_prover::core::prover::StarkProof; +use stwo_prover::examples::fibonacci::Fibonacci; +use wasm_bindgen::prelude::*; + +#[wasm_bindgen] +pub struct FibonacciResult { + success: bool, + message: String, +} + +#[wasm_bindgen] +impl FibonacciResult { + #[wasm_bindgen(getter)] + pub fn success(&self) -> bool { + self.success + } + + #[wasm_bindgen(getter)] + pub fn message(&self) -> String { + self.message.clone() + } +} + +#[wasm_bindgen] +pub fn run_fibonacci_example(log_size: u32, claim: u32) -> FibonacciResult { + let fib = Fibonacci::new(log_size, BaseField::from(claim)); + + match fib.prove() { + Ok(proof) => match fib.verify(proof) { + Ok(_) => FibonacciResult { + success: true, + message: "Proof generated and verified successfully".to_string(), + }, + Err(e) => FibonacciResult { + success: false, + message: format!("Proof verification failed: {:?}", e), + }, + }, + Err(e) => FibonacciResult { + success: false, + message: format!("Proof generation failed: {:?}", e), + }, + } +} + +#[wasm_bindgen] +pub fn run_fibonacci_verify_exemple( + log_size: u32, + claim: u32, + stark_proof_str: &str, +) -> FibonacciResult { + let fib = Fibonacci::new(log_size, BaseField::from(claim)); + + let stark_proof: StarkProof = serde_json::from_str(stark_proof_str).unwrap(); + + match fib.verify(stark_proof) { + Ok(()) => FibonacciResult { + success: true, + message: "Proof generated and verified successfully".to_string(), + }, + Err(e) => FibonacciResult { + success: false, + message: format!("Proof generation failed: {:?}", e), + }, + } +} diff --git a/crates/program_wasm/src/lib.rs b/crates/program_wasm/src/lib.rs new file mode 100644 index 0000000..834a3d0 --- /dev/null +++ b/crates/program_wasm/src/lib.rs @@ -0,0 +1 @@ +pub mod fibonacci;