From e1d5156e6c1c6b6e274915794499d84b6e42c079 Mon Sep 17 00:00:00 2001 From: erick Date: Wed, 30 Jul 2025 17:01:22 -0300 Subject: [PATCH] embedded wallet research & episode 13 --- .../002_youtube_midnight_sessions.mdx | 11 +- package-lock.json | 324 +++++++++++++++++- package.json | 9 +- packages/mesh-midnight-wallet/package.json | 3 +- .../src/embedded/embedded-wallet.ts | 58 ++++ .../src/embedded/index.ts | 2 + packages/mesh-midnight-wallet/src/index.ts | 3 +- 7 files changed, 402 insertions(+), 8 deletions(-) create mode 100644 packages/mesh-midnight-wallet/src/embedded/embedded-wallet.ts create mode 100644 packages/mesh-midnight-wallet/src/embedded/index.ts diff --git a/apps/docs/src/pages/en/wiki/training/002_youtube_midnight_sessions.mdx b/apps/docs/src/pages/en/wiki/training/002_youtube_midnight_sessions.mdx index 8f575a7..51035de 100644 --- a/apps/docs/src/pages/en/wiki/training/002_youtube_midnight_sessions.mdx +++ b/apps/docs/src/pages/en/wiki/training/002_youtube_midnight_sessions.mdx @@ -116,4 +116,13 @@ This week’s highlights center on three core areas: Explore, Code, and Q&A. Und #### Duration: 1 hour - [Version in English](https://youtu.be/br5jDHWovbg) - [Versión en español](https://youtu.be/o3Tl7cMsHN8) -- [Versão em português](https://youtu.be/JF5UjIWflrg) \ No newline at end of file +- [Versão em português](https://youtu.be/JF5UjIWflrg) + +## 📺 Midnight Session #13 +#### Description: +In this video, we break down the main types of zero‑knowledge proof systems and the core mechanics behind ZKPs, then show where to put them to work through online and in‑person hackathons. We also review OpenZeppelin’s token smart‑contract primitives—fungible tokens, modular extensions, and utilities—and walk through initiating, debugging, and understanding the Midnight transaction lifecycle in Testnet mode, wrapping up with a concise Q&A. + +#### Duration: 1 hour +- [Version in English](https://youtu.be/2A4S5TOHLJg) +- [Versión en español](https://youtu.be/TW8Yu5jY3Q8) +- [Versão em português](https://youtu.be/YgJVqExXrkY) \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 1b6de9f..4fe8ce9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,6 +11,7 @@ "packages/*" ], "dependencies": { + "@bitcoin-js/tiny-secp256k1-asmjs": "^2.2.4", "@midnight-ntwrk/compact-runtime": "0.8.1", "@midnight-ntwrk/dapp-connector-api": "3.0.0", "@midnight-ntwrk/ledger": "4.0.0", @@ -23,13 +24,19 @@ "@midnight-ntwrk/midnight-js-types": "2.0.2", "@midnight-ntwrk/wallet": "5.0.0", "@midnight-ntwrk/wallet-api": "5.0.0", + "@midnight-ntwrk/wallet-sdk-hd": "^2.0.0", "@midnight-ntwrk/zswap": "4.0.0", + "@scure/bip32": "^1.7.0", + "@scure/bip39": "^1.6.0", + "bip32": "^5.0.0-rc.0", + "bip39": "^3.1.0", "fp-ts": "^2.16.1", "io-ts": "^2.2.20", "pino": "^8.16.0", "pino-pretty": "^10.2.3", "punycode": "^2.3.1", - "rxjs": "^7.8.1" + "rxjs": "^7.8.1", + "ts-node": "^10.9.2" }, "devDependencies": { "is-path-inside": "^4.0.0", @@ -706,6 +713,27 @@ "node": ">=6.9.0" } }, + "node_modules/@bitcoin-js/tiny-secp256k1-asmjs": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/@bitcoin-js/tiny-secp256k1-asmjs/-/tiny-secp256k1-asmjs-2.2.4.tgz", + "integrity": "sha512-Lo62disBIDwPrYAmMsSjEmqak41yb0OFGQVLdktXmcQLgtC1BI5Sd1eHSxNREKZmxMUXevtsgEhGB1DvvatRmQ==", + "license": "MIT", + "dependencies": { + "uint8array-tools": "0.0.7" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@bitcoin-js/tiny-secp256k1-asmjs/node_modules/uint8array-tools": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/uint8array-tools/-/uint8array-tools-0.0.7.tgz", + "integrity": "sha512-vrrNZJiusLWoFWBqz5Y5KMCgP9W9hnjZHzZiZRT8oNAkq3d5Z5Oe76jAvVVSRh4U8GGR90N2X1dWtrhvx6L8UQ==", + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/@braintree/sanitize-url": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-7.1.1.tgz", @@ -751,6 +779,28 @@ "integrity": "sha512-YslZMgtJUyuMbZ+aKvfF3x1f5liK4mWNxghFRv7jqRR9C3R3fAOGTTKvxXDa2Y1s9zSbcpuO0cAxDYsc9SrXoQ==", "license": "Apache-2.0" }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, "node_modules/@dao-xyz/borsh": { "version": "5.2.3", "resolved": "https://registry.npmjs.org/@dao-xyz/borsh/-/borsh-5.2.3.tgz", @@ -2413,6 +2463,17 @@ "@midnight-ntwrk/zswap": "4.0.0" } }, + "node_modules/@midnight-ntwrk/wallet-sdk-hd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@midnight-ntwrk/wallet-sdk-hd/-/wallet-sdk-hd-2.0.0.tgz", + "integrity": "sha512-PZOjSjDU6yLUt4fASWMZOKlvjlY35EwfZWvAtOiCx4Bnx0AfS4PUyVWmh6k39WG4guoJDHGJUepusStljTA84Q==", + "license": "Apache-2.0", + "dependencies": { + "@scure/base": "^1.1.9", + "@scure/bip32": "^1.6.2", + "@scure/bip39": "^1.5.4" + } + }, "node_modules/@midnight-ntwrk/zswap": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@midnight-ntwrk/zswap/-/zswap-4.0.0.tgz", @@ -2886,6 +2947,33 @@ "node": ">= 10" } }, + "node_modules/@noble/curves": { + "version": "1.9.6", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.6.tgz", + "integrity": "sha512-GIKz/j99FRthB8icyJQA51E8Uk5hXmdyThjgQXRKiv9h0zeRlzSCLIzFw6K1LotZ3XuB7yzlf76qk7uBmTdFqA==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "1.8.0" + }, + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@noble/hashes": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", + "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", + "license": "MIT", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -4001,6 +4089,33 @@ "url": "https://paulmillr.com/funding/" } }, + "node_modules/@scure/bip32": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.7.0.tgz", + "integrity": "sha512-E4FFX/N3f4B80AKWp5dP6ow+flD1LQZo/w8UnLGYZO674jS6YnYeepycOOksv+vLPSpgN35wgKgy+ybfTb2SMw==", + "license": "MIT", + "dependencies": { + "@noble/curves": "~1.9.0", + "@noble/hashes": "~1.8.0", + "@scure/base": "~1.2.5" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip39": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.6.0.tgz", + "integrity": "sha512-+lF0BbLiJNwVlev4eKelw1WWLaiKXw7sSl8T6FvBlWkdX+94aGJ4o8XjUdlyhTCjd8c+B3KT3JfS8P0bLRNU6A==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "~1.8.0", + "@scure/base": "~1.2.5" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/@shikijs/core": { "version": "1.29.2", "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-1.29.2.tgz", @@ -4281,7 +4396,7 @@ "version": "1.13.3", "resolved": "https://registry.npmjs.org/@swc/wasm/-/wasm-1.13.3.tgz", "integrity": "sha512-ZhQfKxqFvrifksN8znSzes/oyfr8Q4mpKP0T8tYS/AaUzm/7v5OK22VlcTHR1gXHEtp16dlR8w+vYTFDCaUmnw==", - "dev": true, + "devOptional": true, "license": "Apache-2.0" }, "node_modules/@tailwindcss/node": { @@ -4627,6 +4742,30 @@ "unist-util-visit": "^5.0.0" } }, + "node_modules/@tsconfig/node10": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", + "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", + "license": "MIT" + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "license": "MIT" + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "license": "MIT" + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "license": "MIT" + }, "node_modules/@tybys/wasm-util": { "version": "0.10.0", "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.0.tgz", @@ -5028,7 +5167,6 @@ "version": "20.19.9", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.9.tgz", "integrity": "sha512-cuVNgarYWZqxRJDQHEB58GEONhOK79QVR/qYx4S7kcUObQvUwvFnYxJuuHUKm2aieN9X3yZB4LZsuYNU1Qphsw==", - "devOptional": true, "license": "MIT", "dependencies": { "undici-types": "~6.21.0" @@ -5825,6 +5963,18 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, + "node_modules/acorn-walk": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", + "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", + "license": "MIT", + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -6238,6 +6388,12 @@ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "license": "MIT" }, + "node_modules/base-x": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-5.0.1.tgz", + "integrity": "sha512-M7uio8Zt++eg3jPj+rHMfCC+IuygQHHCOU+IYsVtik6FWjuYpVt/+MRKcgsAMHh8mMFAwnB+Bs+mTrFiXjMzKg==", + "license": "MIT" + }, "node_modules/base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", @@ -6282,6 +6438,31 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/bip32": { + "version": "5.0.0-rc.0", + "resolved": "https://registry.npmjs.org/bip32/-/bip32-5.0.0-rc.0.tgz", + "integrity": "sha512-5hVFGrdCnF8GB1Lj2eEo4PRE7+jp+3xBLnfNjydivOkMvKmUKeJ9GG8uOy8prmWl3Oh154uzgfudR1FRkNBudA==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "^1.2.0", + "@scure/base": "^1.1.1", + "uint8array-tools": "^0.0.8", + "valibot": "^0.37.0", + "wif": "^5.0.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/bip39": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bip39/-/bip39-3.1.0.tgz", + "integrity": "sha512-c9kiwdk45Do5GL0vJMe7tS95VjCii65mYAH7DfWl3uW8AVzXKQVUm64i3hzVybBDMp9r7j9iNxR85+ul8MdN/A==", + "license": "ISC", + "dependencies": { + "@noble/hashes": "^1.2.0" + } + }, "node_modules/brace-expansion": { "version": "1.1.12", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", @@ -6347,6 +6528,25 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, + "node_modules/bs58": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-6.0.0.tgz", + "integrity": "sha512-PD0wEnEYg6ijszw/u8s+iI3H17cTymlrwkKhDhPZq+Sokl3AU4htyBFTjAeNAlCCmg0f53g6ih3jATyCKftTfw==", + "license": "MIT", + "dependencies": { + "base-x": "^5.0.0" + } + }, + "node_modules/bs58check": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-4.0.0.tgz", + "integrity": "sha512-FsGDOnFg9aVI9erdriULkd/JjEWONV/lQE5aYziB5PoBsXRind56lh8doIZIc9X4HoxT5x4bLjMWN1/NB8Zp5g==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "^1.2.0", + "bs58": "^6.0.0" + } + }, "node_modules/buffer": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", @@ -6959,6 +7159,12 @@ } } }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "license": "MIT" + }, "node_modules/cross-fetch": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.1.0.tgz", @@ -7775,6 +7981,15 @@ "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", "license": "Apache-2.0" }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, "node_modules/dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -11767,6 +11982,12 @@ "@jridgewell/sourcemap-codec": "^1.5.0" } }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "license": "ISC" + }, "node_modules/markdown-extensions": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/markdown-extensions/-/markdown-extensions-2.0.0.tgz", @@ -16590,6 +16811,55 @@ "node": ">=8" } }, + "node_modules/ts-node": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", + "license": "MIT", + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/ts-node/node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "license": "MIT" + }, "node_modules/tsconfig-paths": { "version": "3.15.0", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", @@ -17094,6 +17364,15 @@ "integrity": "sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==", "license": "MIT" }, + "node_modules/uint8array-tools": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/uint8array-tools/-/uint8array-tools-0.0.8.tgz", + "integrity": "sha512-xS6+s8e0Xbx++5/0L+yyexukU7pz//Yg6IHg3BKhXotg1JcYtgxVcUctQ0HxLByiJzpAkNFawz1Nz5Xadzo82g==", + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/unbox-primitive": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", @@ -17117,7 +17396,6 @@ "version": "6.21.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", - "devOptional": true, "license": "MIT" }, "node_modules/unified": { @@ -17480,6 +17758,26 @@ "uuid": "dist/esm/bin/uuid" } }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "license": "MIT" + }, + "node_modules/valibot": { + "version": "0.37.0", + "resolved": "https://registry.npmjs.org/valibot/-/valibot-0.37.0.tgz", + "integrity": "sha512-FQz52I8RXgFgOHym3XHYSREbNtkgSjF9prvMFH1nBsRyfL6SfCzoT1GuSDTlbsuPubM7/6Kbw0ZMQb8A+V+VsQ==", + "license": "MIT", + "peerDependencies": { + "typescript": ">=5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, "node_modules/vfile": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", @@ -17974,6 +18272,15 @@ "integrity": "sha512-Gd9+TUn5nXdwj/hFsPVx5cuHHiF5Bwuc30jZ4+ronF1qHK5O7HD0sgmXWSEgwKquT3ClLoKPVbO6qGwVwLzvAw==", "license": "MIT" }, + "node_modules/wif": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/wif/-/wif-5.0.0.tgz", + "integrity": "sha512-iFzrC/9ne740qFbNjTZ2FciSRJlHIXoxqk/Y5EnE08QOXu1WjJyCCswwDTYbohAOEnlCtLaAAQBhyaLRFh2hMA==", + "license": "MIT", + "dependencies": { + "bs58check": "^4.0.0" + } + }, "node_modules/word-wrap": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", @@ -18202,6 +18509,15 @@ "node": ">=8" } }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", diff --git a/package.json b/package.json index ef253d5..3fff0d2 100644 --- a/package.json +++ b/package.json @@ -15,6 +15,7 @@ "sh:version": "bash scripts/bump-version.sh" }, "dependencies": { + "@bitcoin-js/tiny-secp256k1-asmjs": "^2.2.4", "@midnight-ntwrk/compact-runtime": "0.8.1", "@midnight-ntwrk/dapp-connector-api": "3.0.0", "@midnight-ntwrk/ledger": "4.0.0", @@ -27,13 +28,19 @@ "@midnight-ntwrk/midnight-js-types": "2.0.2", "@midnight-ntwrk/wallet": "5.0.0", "@midnight-ntwrk/wallet-api": "5.0.0", + "@midnight-ntwrk/wallet-sdk-hd": "^2.0.0", "@midnight-ntwrk/zswap": "4.0.0", + "@scure/bip32": "^1.7.0", + "@scure/bip39": "^1.6.0", + "bip32": "^5.0.0-rc.0", + "bip39": "^3.1.0", "fp-ts": "^2.16.1", "io-ts": "^2.2.20", "pino": "^8.16.0", "pino-pretty": "^10.2.3", "punycode": "^2.3.1", - "rxjs": "^7.8.1" + "rxjs": "^7.8.1", + "ts-node": "^10.9.2" }, "devDependencies": { "is-path-inside": "^4.0.0", diff --git a/packages/mesh-midnight-wallet/package.json b/packages/mesh-midnight-wallet/package.json index 924da15..807e40d 100644 --- a/packages/mesh-midnight-wallet/package.json +++ b/packages/mesh-midnight-wallet/package.json @@ -26,7 +26,8 @@ "lint": "eslint", "pack": "npm pack --pack-destination=./dist", "test": "jest", - "prepack:all": "npm run clean && npm install && npm run build && npm run pack" + "prepack:all": "npm run clean && npm install && npm run build && npm run pack", + "embedded-wallet": "node --experimental-specifier-resolution=node --loader ts-node/esm ./src/embedded/embedded-wallet.ts" }, "devDependencies": { "@meshsdk/configs": "*", diff --git a/packages/mesh-midnight-wallet/src/embedded/embedded-wallet.ts b/packages/mesh-midnight-wallet/src/embedded/embedded-wallet.ts new file mode 100644 index 0000000..908c2c7 --- /dev/null +++ b/packages/mesh-midnight-wallet/src/embedded/embedded-wallet.ts @@ -0,0 +1,58 @@ +import { mnemonicToSeedSync } from 'bip39'; +import { BIP32Factory } from 'bip32'; +import * as ecc from '@bitcoin-js/tiny-secp256k1-asmjs'; + +import * as bip39 from '@scure/bip39'; +import { wordlist as english } from '@scure/bip39/wordlists/english'; +import { HDKey } from '@scure/bip32'; +import { generateRandomSeed, HDWallet, Roles } from '@midnight-ntwrk/wallet-sdk-hd'; + +export const mnemonicToWords: (mnemonic: string) => string[] = (mnemonic: string) => mnemonic.split(' '); + +export const generateMnemonicWords: (strength?: number) => string[] = (strength = 256) => + mnemonicToWords(bip39.generateMnemonic(english, strength)); + +export const validateMnemonic = (mnemonic: string): boolean => bip39.validateMnemonic(mnemonic, english); + +const mnemonicWords = generateMnemonicWords().join(' '); +const seedDerived = mnemonicToSeedSync(mnemonicWords); // 64 bytes + +const seddDerivedHex = Buffer.from(seedDerived).toString('hex'); // 64 bytes +// This is the seed that will be used to generate the wallet since the wallet implementation expects 32 bytes hex string. +const seedDerivedHex32 = Buffer.from(seedDerived).subarray(0, 32).toString('hex'); // 32 bytes +// Optionally generate a random seed +const seedGenerated = generateRandomSeed(); //32 bytes + +// The following code is for reference only, Midnight provides a HDWallet abstraction using the HdKey from scure/bip32 implementation +const rootKey = HDKey.fromMasterSeed(seedDerived); +// How to calculate the path +// const path = `m/${PURPOSE}'/${COIN_TYPE}'/${this.account}'/${this.role}/${index}`; +// const derivedKey = rootKey.derive(path); + +// This is for reference only, another way to create a root key using BIP32 +const bip32 = BIP32Factory(ecc); +const root = bip32.fromSeed(seedDerived); + +console.log({ mnemonicWords: mnemonicWords }); +console.log({ seedDerived }); +console.log({ seddDerivedHex }); +console.log({ seedDerivedHex32 }); +console.log({ seedGenerated }); +console.log({ rootKey }); +console.log({ root }); +console.log({ validateMnemonic: validateMnemonic(mnemonicWords) }); + +const generatedWallet = HDWallet.fromSeed(seedDerived); //seed could be 32 bytes or 64 bytes + +if (generatedWallet.type == 'seedOk') { + const zswapKey = generatedWallet.hdWallet.selectAccount(0).selectRole(Roles.Zswap).deriveKeyAt(0); + if (zswapKey.type === 'keyDerived') { + console.log('success', zswapKey.key); + } else { + console.error('Error deriving key'); + } +} else { + console.error('Error generating HDWallet'); +} + + diff --git a/packages/mesh-midnight-wallet/src/embedded/index.ts b/packages/mesh-midnight-wallet/src/embedded/index.ts new file mode 100644 index 0000000..7ca6d40 --- /dev/null +++ b/packages/mesh-midnight-wallet/src/embedded/index.ts @@ -0,0 +1,2 @@ +export * from "./embedded-wallet"; + diff --git a/packages/mesh-midnight-wallet/src/index.ts b/packages/mesh-midnight-wallet/src/index.ts index 66c1b2d..c70c523 100644 --- a/packages/mesh-midnight-wallet/src/index.ts +++ b/packages/mesh-midnight-wallet/src/index.ts @@ -1 +1,2 @@ -export * from "./browser"; \ No newline at end of file +export * from "./browser"; +export * from "./embedded"; \ No newline at end of file