diff --git a/config-overrides.js b/config-overrides.js index 3a5f58bc2..3cf3ce1e7 100644 --- a/config-overrides.js +++ b/config-overrides.js @@ -9,6 +9,7 @@ const webpack = require('webpack'); const LavaMoatPlugin = require('@lavamoat/webpack') const path = require('path'); const stdLibBrowser = require('node-stdlib-browser'); +const { NodeProtocolUrlPlugin } = require('node-stdlib-browser/helpers/webpack/plugin'); module.exports = function override(config, env) { // Enable source maps for better debugging @@ -34,7 +35,9 @@ module.exports = function override(config, env) { fallback: { buffer: require.resolve('buffer/'), assert: stdLibBrowser.assert, - crypto: stdLibBrowser.crypto, + // Custom shim that wraps crypto-browserify and adds the `webcrypto` + // export required by the Web3Auth SDK. See src/web3auth-crypto-shim.js. + crypto: path.resolve(__dirname, 'src/web3auth-crypto-shim.js'), path: stdLibBrowser.path, process: stdLibBrowser.process, stream: stdLibBrowser.stream, @@ -136,7 +139,12 @@ module.exports = function override(config, env) { new webpack.ProvidePlugin({ Buffer: ['buffer', 'Buffer'], process: stdLibBrowser.process - }) + }), + // Strip the `node:` scheme prefix from imports (e.g. `node:crypto` -> + // `crypto`) so the existing browser fallbacks above resolve. + // Required by the Web3Auth SDK (see sagas/web3auth.js) which uses the + // `node:` scheme for Node.js built-ins. + NodeProtocolUrlPlugin() ]; // Only add LavaMoat in production because LavaMoat does not work with the diff --git a/lavamoat/webpack/policy.json b/lavamoat/webpack/policy.json index 77651a9f5..8b1c97c47 100644 --- a/lavamoat/webpack/policy.json +++ b/lavamoat/webpack/policy.json @@ -1,5 +1,18 @@ { "resources": { + "@web3auth/base>@web3auth/auth>@ethereumjs/util>@ethereumjs/rlp": { + "globals": { + "TextEncoder": true + } + }, + "@web3auth/base>@web3auth/auth>@ethereumjs/util": { + "packages": { + "react-redux>@babel/runtime": true, + "@web3auth/base>@web3auth/auth>@ethereumjs/util>@ethereumjs/rlp": true, + "@web3auth/base>@web3auth/auth>@ethereumjs/util>ethereum-cryptography": true, + "@walletconnect/core>events": true + } + }, "@walletconnect/utils>@ethersproject/hash>@ethersproject/address": { "packages": { "@walletconnect/utils>@ethersproject/hash>@ethersproject/bignumber": true, @@ -93,6 +106,7 @@ "setTimeout": true }, "packages": { + "$root$": true, "react-redux>@babel/runtime": true, "node-stdlib-browser>assert": true, "axios": true, @@ -100,7 +114,6 @@ "@hathor/wallet-lib>bitcore-mnemonic": true, "node-stdlib-browser>browserify-zlib": true, "buffer": true, - "node-stdlib-browser>crypto-browserify": true, "@hathor/wallet-lib>crypto-js": true, "@walletconnect/core>events": true, "@hathor/wallet-lib>isomorphic-ws": true, @@ -124,6 +137,7 @@ "setTimeout": true }, "packages": { + "$root$": true, "react-redux>@babel/runtime": true, "node-stdlib-browser>assert": true, "axios": true, @@ -131,7 +145,6 @@ "@hathor/wallet-lib>bitcore-mnemonic": true, "node-stdlib-browser>browserify-zlib": true, "buffer": true, - "node-stdlib-browser>crypto-browserify": true, "@hathor/wallet-lib>crypto-js": true, "@walletconnect/core>events": true, "@hathor/wallet-lib>isomorphic-ws": true, @@ -141,6 +154,28 @@ "@hathor/wallet-lib>zod": true } }, + "@web3auth/base>@web3auth/auth>@ethereumjs/util>ethereum-cryptography>@noble/curves": { + "globals": { + "TextEncoder": true + }, + "packages": { + "react-redux>@babel/runtime": true, + "@web3auth/base>@web3auth/auth>@ethereumjs/util>ethereum-cryptography>@noble/curves>@noble/hashes": true + } + }, + "@web3auth/base>@web3auth/auth>@ethereumjs/util>ethereum-cryptography>@noble/curves>@noble/hashes": { + "globals": { + "TextEncoder": true + }, + "packages": { + "$root$": true + } + }, + "@web3auth/base>@web3auth/auth>@ethereumjs/util>ethereum-cryptography>@noble/hashes": { + "globals": { + "TextEncoder": true + } + }, "redux-saga>@redux-saga/core": { "globals": { "console.error": true, @@ -559,6 +594,344 @@ "@walletconnect/utils>@stablelib/hkdf>@stablelib/wipe": true } }, + "@web3auth/base>@toruslabs/base-controllers": { + "packages": { + "react-redux>@babel/runtime": true, + "@web3auth/base>@web3auth/auth": true + } + }, + "@web3auth/no-modal>@web3auth/base-provider>@toruslabs/base-controllers": { + "globals": { + "Buffer.from": true, + "Response": true, + "URL": true, + "URLSearchParams": true, + "clearInterval": true, + "clearTimeout": true, + "close": true, + "document.documentElement.clientHeight": true, + "document.documentElement.clientWidth": true, + "fetch": true, + "innerHeight": true, + "innerWidth": true, + "location": true, + "navigator": true, + "open": true, + "screen.height": true, + "screen.width": true, + "screenLeft": true, + "screenTop": true, + "screenX": true, + "screenY": true, + "setInterval": true, + "setTimeout": true, + "structuredClone": true + }, + "packages": { + "react-redux>@babel/runtime": true, + "@web3auth/base>@web3auth/auth>@ethereumjs/util": true, + "@web3auth/no-modal>@web3auth/base-provider>@toruslabs/base-controllers>@toruslabs/broadcast-channel": true, + "@web3auth/no-modal>@web3auth/base>@toruslabs/http-helpers": true, + "@web3auth/no-modal>@toruslabs/openlogin-jrpc": true, + "@web3auth/no-modal>@toruslabs/openlogin-utils": true, + "@web3auth/base>@toruslabs/base-controllers>bignumber.js": true, + "@web3auth/base>@web3auth/auth>bowser": true, + "buffer": true, + "@web3auth/base>jwt-decode": true, + "@web3auth/base>loglevel": true + } + }, + "@web3auth/no-modal>@toruslabs/openlogin>@toruslabs/openlogin-session-manager>@toruslabs/base-session-manager": { + "packages": { + "react-redux>@babel/runtime": true, + "@web3auth/no-modal>@toruslabs/openlogin>@toruslabs/openlogin-session-manager>@toruslabs/base-session-manager>@toruslabs/http-helpers": true + } + }, + "@web3auth/no-modal>@web3auth/base-provider>@toruslabs/base-controllers>@toruslabs/broadcast-channel": { + "globals": { + "BroadcastChannel": true, + "Buffer.from": true, + "IDBKeyRange.bound": true, + "addEventListener": true, + "dispatchEvent": true, + "document": true, + "fetch": true, + "indexedDB": true, + "localStorage": true, + "mozIndexedDB": true, + "msIndexedDB": true, + "navigator.userAgent.toLowerCase": true, + "removeEventListener": true, + "setTimeout": true, + "webkitIndexedDB": true + }, + "packages": { + "@web3auth/no-modal>@web3auth/base-provider>@toruslabs/base-controllers>@toruslabs/broadcast-channel>@toruslabs/eccrypto": true, + "@web3auth/no-modal>@web3auth/base-provider>@toruslabs/base-controllers>@toruslabs/broadcast-channel>@toruslabs/metadata-helpers": true, + "buffer": true, + "@web3auth/base>loglevel": true, + "@web3auth/base>@toruslabs/base-controllers>@toruslabs/broadcast-channel>oblivious-set": true, + "@web3auth/base>@web3auth/auth>@toruslabs/secure-pub-sub>socket.io-client": true + } + }, + "@web3auth/no-modal>@web3auth/base-provider>@toruslabs/base-controllers>@toruslabs/broadcast-channel>@toruslabs/eccrypto": { + "globals": { + "Buffer.alloc": true, + "Buffer.concat": true, + "Buffer.from": true, + "Buffer.isBuffer": true, + "crypto": true, + "msCrypto": true + }, + "packages": { + "$root$": true, + "buffer": true, + "@walletconnect/utils>elliptic": true + } + }, + "@web3auth/no-modal>@toruslabs/openlogin>@toruslabs/openlogin-session-manager>@toruslabs/eccrypto": { + "globals": { + "Buffer.alloc": true, + "Buffer.concat": true, + "Buffer.from": true, + "Buffer.isBuffer": true, + "crypto": true, + "msCrypto": true + }, + "packages": { + "$root$": true, + "buffer": true, + "@walletconnect/utils>elliptic": true + } + }, + "@web3auth/no-modal>@toruslabs/openlogin>@toruslabs/eccrypto": { + "globals": { + "Buffer.alloc": true, + "Buffer.concat": true, + "Buffer.from": true, + "Buffer.isBuffer": true, + "crypto": true, + "msCrypto": true + }, + "packages": { + "$root$": true, + "buffer": true, + "@walletconnect/utils>elliptic": true + } + }, + "@web3auth/no-modal>@toruslabs/openlogin>@toruslabs/openlogin-session-manager>@toruslabs/base-session-manager>@toruslabs/http-helpers": { + "globals": { + "URL": true, + "clearTimeout": true, + "fetch": true, + "setTimeout": true + }, + "packages": { + "react-redux>@babel/runtime": true, + "@web3auth/no-modal>lodash.merge": true, + "@web3auth/base>loglevel": true + } + }, + "@web3auth/no-modal>@toruslabs/openlogin>@toruslabs/openlogin-session-manager>@toruslabs/metadata-helpers>@toruslabs/http-helpers": { + "globals": { + "URL": true, + "clearTimeout": true, + "fetch": true, + "setTimeout": true + }, + "packages": { + "react-redux>@babel/runtime": true, + "@web3auth/no-modal>lodash.merge": true, + "@web3auth/base>loglevel": true + } + }, + "@web3auth/no-modal>@toruslabs/openlogin>@toruslabs/secure-pub-sub>@toruslabs/http-helpers": { + "globals": { + "URL": true, + "clearTimeout": true, + "fetch": true, + "setTimeout": true + }, + "packages": { + "react-redux>@babel/runtime": true, + "@web3auth/no-modal>lodash.merge": true, + "@web3auth/base>loglevel": true + } + }, + "@web3auth/no-modal>@web3auth/base>@toruslabs/http-helpers": { + "globals": { + "URL": true, + "clearTimeout": true, + "fetch": true, + "setTimeout": true + }, + "packages": { + "react-redux>@babel/runtime": true, + "@web3auth/no-modal>lodash.merge": true, + "@web3auth/base>loglevel": true + } + }, + "@web3auth/openlogin-adapter>@web3auth/base>@toruslabs/http-helpers": { + "globals": { + "URL": true, + "clearTimeout": true, + "fetch": true, + "setTimeout": true + }, + "packages": { + "react-redux>@babel/runtime": true, + "@web3auth/no-modal>lodash.merge": true, + "@web3auth/base>loglevel": true + } + }, + "@web3auth/no-modal>@web3auth/base-provider>@toruslabs/base-controllers>@toruslabs/broadcast-channel>@toruslabs/metadata-helpers": { + "globals": { + "Buffer.from": true + }, + "packages": { + "react-redux>@babel/runtime": true, + "@web3auth/no-modal>@web3auth/base-provider>@toruslabs/base-controllers>@toruslabs/broadcast-channel>@toruslabs/eccrypto": true, + "@web3auth/no-modal>@web3auth/base>@toruslabs/http-helpers": true, + "buffer": true, + "@walletconnect/utils>elliptic": true, + "@web3auth/base>@web3auth/auth>@ethereumjs/util>ethereum-cryptography": true, + "@lavamoat/webpack>json-stable-stringify": true + } + }, + "@web3auth/no-modal>@toruslabs/openlogin>@toruslabs/openlogin-session-manager>@toruslabs/metadata-helpers": { + "globals": { + "Buffer.from": true + }, + "packages": { + "react-redux>@babel/runtime": true, + "@web3auth/no-modal>@toruslabs/openlogin>@toruslabs/openlogin-session-manager>@toruslabs/eccrypto": true, + "@web3auth/no-modal>@toruslabs/openlogin>@toruslabs/openlogin-session-manager>@toruslabs/metadata-helpers>@toruslabs/http-helpers": true, + "buffer": true, + "@walletconnect/utils>elliptic": true, + "@web3auth/base>@web3auth/auth>@ethereumjs/util>ethereum-cryptography": true, + "@lavamoat/webpack>json-stable-stringify": true + } + }, + "@web3auth/no-modal>@toruslabs/openlogin>@toruslabs/metadata-helpers": { + "globals": { + "Buffer.from": true + }, + "packages": { + "react-redux>@babel/runtime": true, + "@web3auth/no-modal>@toruslabs/openlogin>@toruslabs/eccrypto": true, + "@web3auth/no-modal>@toruslabs/openlogin>@toruslabs/secure-pub-sub>@toruslabs/http-helpers": true, + "buffer": true, + "@walletconnect/utils>elliptic": true, + "@web3auth/base>@web3auth/auth>@ethereumjs/util>ethereum-cryptography": true, + "@lavamoat/webpack>json-stable-stringify": true + } + }, + "@web3auth/no-modal>@toruslabs/openlogin-jrpc": { + "globals": { + "addEventListener": true, + "console.error": true, + "console.warn": true, + "location.origin": true, + "removeEventListener": true, + "setTimeout": true + }, + "packages": { + "react-redux>@babel/runtime": true, + "@web3auth/base>@web3auth/auth>end-of-stream": true, + "@walletconnect/core>events": true, + "@web3auth/base>@web3auth/auth>fast-safe-stringify": true, + "@web3auth/base>@web3auth/auth>once": true, + "@web3auth/base>@web3auth/auth>pump": true, + "@web3auth/no-modal>@toruslabs/openlogin-jrpc>readable-stream": true + } + }, + "@web3auth/no-modal>@toruslabs/openlogin>@toruslabs/openlogin-session-manager": { + "globals": { + "Buffer.from": true, + "URL": true + }, + "packages": { + "react-redux>@babel/runtime": true, + "@web3auth/no-modal>@toruslabs/openlogin>@toruslabs/openlogin-session-manager>@toruslabs/base-session-manager": true, + "@web3auth/no-modal>@toruslabs/openlogin>@toruslabs/openlogin-session-manager>@toruslabs/eccrypto": true, + "@web3auth/no-modal>@toruslabs/openlogin>@toruslabs/openlogin-session-manager>@toruslabs/metadata-helpers": true, + "buffer": true + } + }, + "@web3auth/no-modal>@toruslabs/openlogin-utils": { + "globals": { + "localStorage": true, + "sessionStorage": true + }, + "packages": { + "react-redux>@babel/runtime": true, + "@web3auth/no-modal>@toruslabs/openlogin-utils>@toruslabs/constants": true, + "@web3auth/base>@web3auth/auth>base64url": true, + "@web3auth/base>@web3auth/auth>color": true + } + }, + "@web3auth/no-modal>@toruslabs/openlogin": { + "globals": { + "Buffer.from": true, + "URL": true, + "URLSearchParams": true, + "clearInterval": true, + "console.log": true, + "document.documentElement.clientHeight": true, + "document.documentElement.clientWidth": true, + "history.replaceState": true, + "history.state": true, + "innerHeight": true, + "innerWidth": true, + "location.hash.substring": true, + "location.host": true, + "location.href": true, + "location.origin": true, + "location.pathname": true, + "location.protocol": true, + "location.replace": true, + "location.search.slice": true, + "navigator.userAgent": true, + "open": true, + "screen.height": true, + "screen.width": true, + "screenLeft": true, + "screenTop": true, + "screenX": true, + "screenY": true, + "setInterval": true, + "setTimeout": true + }, + "packages": { + "react-redux>@babel/runtime": true, + "@web3auth/no-modal>@toruslabs/openlogin>@toruslabs/constants": true, + "@web3auth/no-modal>@toruslabs/openlogin>@toruslabs/eccrypto": true, + "@web3auth/no-modal>@toruslabs/openlogin>@toruslabs/metadata-helpers": true, + "@web3auth/no-modal>@toruslabs/openlogin>@toruslabs/openlogin-session-manager": true, + "@web3auth/no-modal>@toruslabs/openlogin-utils": true, + "@web3auth/no-modal>@toruslabs/openlogin>@toruslabs/secure-pub-sub": true, + "@web3auth/base>@web3auth/auth>bowser": true, + "buffer": true, + "@walletconnect/core>events": true, + "@web3auth/base>loglevel": true, + "@web3auth/base>ts-custom-error": true + } + }, + "@web3auth/no-modal>@toruslabs/openlogin>@toruslabs/secure-pub-sub": { + "globals": { + "Buffer.from": true, + "document": true + }, + "packages": { + "react-redux>@babel/runtime": true, + "@web3auth/no-modal>@toruslabs/openlogin>@toruslabs/eccrypto": true, + "@web3auth/no-modal>@toruslabs/openlogin>@toruslabs/secure-pub-sub>@toruslabs/http-helpers": true, + "@web3auth/no-modal>@toruslabs/openlogin>@toruslabs/metadata-helpers": true, + "buffer": true, + "@web3auth/base>loglevel": true, + "@web3auth/base>@web3auth/auth>@toruslabs/secure-pub-sub>socket.io-client": true + } + }, "@walletconnect/core": { "globals": { "AbortController": true, @@ -764,6 +1137,97 @@ "@walletconnect/core>@walletconnect/window-getters": true } }, + "@web3auth/base>@web3auth/auth": { + "globals": { + "setTimeout": true + }, + "packages": { + "react-redux>@babel/runtime": true, + "@walletconnect/core>events": true, + "@lavamoat/webpack>json-stable-stringify": true, + "@web3auth/base>loglevel": true, + "@web3auth/base>@web3auth/auth>readable-stream": true + } + }, + "@web3auth/base": { + "packages": { + "react-redux>@babel/runtime": true, + "@web3auth/base>ts-custom-error": true + } + }, + "@web3auth/base-provider": { + "packages": { + "react-redux>@babel/runtime": true, + "@web3auth/base>@toruslabs/base-controllers": true, + "@web3auth/base>@web3auth/auth": true, + "@web3auth/base": true + } + }, + "@web3auth/no-modal>@web3auth/base-provider": { + "packages": { + "react-redux>@babel/runtime": true, + "@web3auth/no-modal>@web3auth/base-provider>@toruslabs/base-controllers": true, + "@web3auth/no-modal>@toruslabs/openlogin-jrpc": true, + "@web3auth/no-modal>@web3auth/base": true, + "@web3auth/base-provider>json-rpc-random-id": true + } + }, + "@web3auth/no-modal>@web3auth/base": { + "globals": { + "URL": true, + "localStorage.getItem": true, + "localStorage.removeItem": true, + "localStorage.setItem": true + }, + "packages": { + "react-redux>@babel/runtime": true, + "@web3auth/no-modal>@web3auth/base>@toruslabs/constants": true, + "@web3auth/no-modal>@web3auth/base>@toruslabs/http-helpers": true, + "@web3auth/no-modal>@toruslabs/openlogin-jrpc": true, + "@web3auth/no-modal>@toruslabs/openlogin-utils": true, + "@web3auth/base>jwt-decode": true, + "@web3auth/base>loglevel": true, + "@web3auth/base>ts-custom-error": true + } + }, + "@web3auth/openlogin-adapter>@web3auth/base": { + "globals": { + "URL": true, + "localStorage.getItem": true, + "localStorage.removeItem": true, + "localStorage.setItem": true + }, + "packages": { + "react-redux>@babel/runtime": true, + "@web3auth/openlogin-adapter>@web3auth/base>@toruslabs/constants": true, + "@web3auth/openlogin-adapter>@web3auth/base>@toruslabs/http-helpers": true, + "@web3auth/no-modal>@toruslabs/openlogin-jrpc": true, + "@web3auth/no-modal>@toruslabs/openlogin-utils": true, + "@web3auth/base>jwt-decode": true, + "@web3auth/base>loglevel": true, + "@web3auth/base>ts-custom-error": true + } + }, + "@web3auth/no-modal": { + "packages": { + "react-redux>@babel/runtime": true, + "@web3auth/no-modal>@toruslabs/openlogin-jrpc": true, + "@web3auth/no-modal>@web3auth/base-provider": true, + "@web3auth/no-modal>@web3auth/base": true, + "@web3auth/openlogin-adapter": true, + "@web3auth/no-modal>lodash.clonedeep": true, + "@web3auth/no-modal>lodash.merge": true + } + }, + "@web3auth/openlogin-adapter": { + "packages": { + "react-redux>@babel/runtime": true, + "@web3auth/no-modal>@toruslabs/openlogin-utils": true, + "@web3auth/no-modal>@toruslabs/openlogin": true, + "@web3auth/openlogin-adapter>@web3auth/base": true, + "@web3auth/no-modal>lodash.merge": true + } + }, "node-stdlib-browser>crypto-browserify>public-encrypt>parse-asn1>asn1.js": { "packages": { "@hathor/wallet-lib>bitcore-lib>bn.js": true, @@ -824,6 +1288,21 @@ "cypress>@cypress/request>safe-buffer": true } }, + "@web3auth/base>@web3auth/auth>base64url": { + "globals": { + "Buffer.alloc": true, + "Buffer.from": true, + "Buffer.isBuffer": true + }, + "packages": { + "buffer": true + } + }, + "@web3auth/base>@toruslabs/base-controllers>bignumber.js": { + "globals": { + "crypto": true + } + }, "@hathor/wallet-lib>bitcore-lib": { "globals": { "Buffer": true, @@ -835,13 +1314,13 @@ "process.browser": true }, "packages": { + "$root$": true, "node-stdlib-browser>assert": true, "@hathor/wallet-lib>bitcore-lib>bech32": true, "@hathor/wallet-lib>bitcore-lib>bn.js": true, "@hathor/wallet-lib>bitcore-lib>bs58": true, "buffer": true, "@hathor/wallet-lib>bitcore-lib>buffer-compare": true, - "node-stdlib-browser>crypto-browserify": true, "@walletconnect/utils>elliptic": true, "@hathor/wallet-lib>bitcore-lib>inherits": true, "cypress>lodash": true, @@ -856,9 +1335,9 @@ "Buffer.isBuffer": true }, "packages": { + "$root$": true, "@hathor/wallet-lib>bitcore-lib": true, "buffer": true, - "node-stdlib-browser>crypto-browserify": true, "@hathor/wallet-lib>bitcore-mnemonic>unorm": true } }, @@ -912,6 +1391,11 @@ "popper.js": true } }, + "@web3auth/base>@web3auth/auth>bowser": { + "globals": { + "define": true + } + }, "@walletconnect/utils>elliptic>brorand": { "globals": { "crypto": true, @@ -953,7 +1437,7 @@ "packages": { "node-stdlib-browser>crypto-browserify>public-encrypt>browserify-rsa>bn.js": true, "buffer": true, - "node-stdlib-browser>crypto-browserify>randombytes": true + "ttag-cli>serialize-javascript>randombytes": true } }, "node-stdlib-browser>crypto-browserify>browserify-sign": { @@ -1019,6 +1503,12 @@ "npm-run-all>string.prototype.padend>call-bind>set-function-length": true } }, + "@lavamoat/webpack>json-stable-stringify>call-bound": { + "packages": { + "npm-run-all>string.prototype.padend>call-bind>call-bind-apply-helpers": true, + "eslint-plugin-react>array-includes>get-intrinsic": true + } + }, "node-stdlib-browser>crypto-browserify>create-hash>cipher-base": { "packages": { "@hathor/wallet-lib>bitcore-lib>inherits": true, @@ -1089,7 +1579,7 @@ "node-stdlib-browser>crypto-browserify>diffie-hellman": true, "node-stdlib-browser>crypto-browserify>pbkdf2": true, "node-stdlib-browser>crypto-browserify>public-encrypt": true, - "node-stdlib-browser>crypto-browserify>randombytes": true, + "ttag-cli>serialize-javascript>randombytes": true, "node-stdlib-browser>crypto-browserify>randomfill": true } }, @@ -1100,6 +1590,19 @@ "msCrypto": true } }, + "cypress>debug": { + "globals": { + "console": true, + "document": true, + "localStorage": true, + "navigator": true, + "process": true + }, + "packages": { + "cypress>debug>ms": true, + "process": true + } + }, "npm-run-all>string.prototype.padend>define-properties>define-data-property": { "packages": { "npm-run-all>string.prototype.padend>call-bind>es-define-property": true, @@ -1146,7 +1649,7 @@ "@hathor/wallet-lib>bitcore-lib>bn.js": true, "buffer": true, "node-stdlib-browser>crypto-browserify>diffie-hellman>miller-rabin": true, - "node-stdlib-browser>crypto-browserify>randombytes": true + "ttag-cli>serialize-javascript>randombytes": true } }, "eslint-plugin-react>array-includes>get-intrinsic>get-proto>dunder-proto": { @@ -1166,6 +1669,53 @@ "@walletconnect/utils>elliptic>minimalistic-crypto-utils": true } }, + "@web3auth/base>@web3auth/auth>end-of-stream": { + "globals": { + "process.nextTick": true + }, + "packages": { + "@web3auth/base>@web3auth/auth>once": true, + "process": true + } + }, + "@web3auth/base>@web3auth/auth>@toruslabs/secure-pub-sub>socket.io-client>engine.io-client": { + "globals": { + "Headers": true, + "WebTransport": true, + "XMLHttpRequest": true, + "addEventListener": true, + "attachEvent": true, + "document": true, + "fetch": true, + "location": true, + "navigator": true, + "removeEventListener": true + }, + "packages": { + "@web3auth/base>@web3auth/auth>@toruslabs/secure-pub-sub>socket.io-client>@socket.io/component-emitter": true, + "cypress>debug": true, + "@web3auth/base>@web3auth/auth>@toruslabs/secure-pub-sub>socket.io-client>engine.io-client>engine.io-parser": true + } + }, + "@web3auth/base>@web3auth/auth>@toruslabs/secure-pub-sub>socket.io-client>engine.io-client>engine.io-parser": { + "globals": { + "Blob": true, + "FileReader": true, + "TextDecoder": true, + "TextEncoder": true, + "TransformStream": true + } + }, + "@web3auth/base>@web3auth/auth>@ethereumjs/util>ethereum-cryptography": { + "globals": { + "TextDecoder": true, + "crypto": true, + "module": true + }, + "packages": { + "@web3auth/base>@web3auth/auth>@ethereumjs/util>ethereum-cryptography>@noble/hashes": true + } + }, "@walletconnect/core>events": { "globals": { "console": true @@ -1213,7 +1763,7 @@ "npm-run-all>string.prototype.padend>call-bind>es-define-property": true } }, - "eslint-plugin-react>array-includes>is-string>has-tostringtag": { + "ttag-cli>koa>is-generator-function>has-tostringtag": { "packages": { "eslint-plugin-react>es-iterator-helpers>has-symbols": true } @@ -1264,7 +1814,7 @@ "node-stdlib-browser>util>is-arguments": { "packages": { "npm-run-all>string.prototype.padend>call-bind": true, - "eslint-plugin-react>array-includes>is-string>has-tostringtag": true + "ttag-cli>koa>is-generator-function>has-tostringtag": true } }, "npm-run-all>string.prototype.padend>es-abstract>is-callable": { @@ -1272,9 +1822,9 @@ "document": true } }, - "node-stdlib-browser>util>is-generator-function": { + "ttag-cli>koa>is-generator-function": { "packages": { - "eslint-plugin-react>array-includes>is-string>has-tostringtag": true + "ttag-cli>koa>is-generator-function>has-tostringtag": true } }, "node-stdlib-browser>assert>is-nan": { @@ -1289,7 +1839,7 @@ "npm-run-all>string.prototype.padend>call-bind": true, "node-stdlib-browser>util>is-typed-array>for-each": true, "eslint-plugin-react>object.hasown>es-abstract>gopd": true, - "eslint-plugin-react>array-includes>is-string>has-tostringtag": true + "ttag-cli>koa>is-generator-function>has-tostringtag": true } }, "@hathor/wallet-lib>isomorphic-ws": { @@ -1312,11 +1862,35 @@ "process": true } }, + "@lavamoat/webpack>json-stable-stringify": { + "packages": { + "npm-run-all>string.prototype.padend>call-bind": true, + "@lavamoat/webpack>json-stable-stringify>call-bound": true, + "@lavamoat/webpack>json-stable-stringify>isarray": true, + "@lavamoat/webpack>json-stable-stringify>jsonify": true, + "@lavamoat/webpack>json-stable-stringify>object-keys": true + } + }, + "@web3auth/base>jwt-decode": { + "globals": { + "atob": true + } + }, "cypress>lodash": { "globals": { "define": true } }, + "@web3auth/base>loglevel": { + "globals": { + "console": true, + "define": true, + "document.cookie": true, + "localStorage": true, + "log": "write", + "navigator": true + } + }, "node-stdlib-browser>crypto-browserify>create-hash>md5.js": { "packages": { "node-stdlib-browser>crypto-browserify>browserify-sign>hash-base": true, @@ -1360,6 +1934,19 @@ "@lavamoat/webpack>json-stable-stringify>object-keys": true } }, + "@web3auth/base>@toruslabs/base-controllers>@toruslabs/broadcast-channel>oblivious-set": { + "globals": { + "setTimeout": true + }, + "packages": { + "react-redux>@babel/runtime": true + } + }, + "@web3auth/base>@web3auth/auth>once": { + "packages": { + "@web3auth/base>@web3auth/auth>once>wrappy": true + } + }, "node-stdlib-browser>crypto-browserify>public-encrypt>parse-asn1": { "packages": { "node-stdlib-browser>crypto-browserify>public-encrypt>parse-asn1>asn1.js": true, @@ -1434,10 +2021,20 @@ "node-stdlib-browser>crypto-browserify>public-encrypt>browserify-rsa": true, "node-stdlib-browser>crypto-browserify>create-hash": true, "node-stdlib-browser>crypto-browserify>public-encrypt>parse-asn1": true, - "node-stdlib-browser>crypto-browserify>randombytes": true, + "ttag-cli>serialize-javascript>randombytes": true, "cypress>@cypress/request>safe-buffer": true } }, + "@web3auth/base>@web3auth/auth>pump": { + "globals": { + "process": true + }, + "packages": { + "@web3auth/base>@web3auth/auth>end-of-stream": true, + "@web3auth/base>@web3auth/auth>once": true, + "process": true + } + }, "node-stdlib-browser>url>punycode": { "globals": { "define": true @@ -1471,7 +2068,7 @@ "setTimeout": true } }, - "node-stdlib-browser>crypto-browserify>randombytes": { + "ttag-cli>serialize-javascript>randombytes": { "globals": { "crypto": true, "msCrypto": true, @@ -1491,7 +2088,7 @@ }, "packages": { "process": true, - "node-stdlib-browser>crypto-browserify>randombytes": true, + "ttag-cli>serialize-javascript>randombytes": true, "cypress>@cypress/request>safe-buffer": true } }, @@ -1605,6 +2202,40 @@ "react": true } }, + "@web3auth/no-modal>@toruslabs/openlogin-jrpc>readable-stream": { + "globals": { + "AbortController": true, + "AbortSignal": true, + "AggregateError": true, + "Blob": true, + "queueMicrotask": true + }, + "packages": { + "react-redux>@babel/runtime": true, + "ttag-cli>gettext-parser>readable-stream>abort-controller": true, + "buffer": true, + "@walletconnect/core>events": true, + "process": true, + "@web3auth/no-modal>@toruslabs/openlogin-jrpc>readable-stream>string_decoder": true + } + }, + "@web3auth/base>@web3auth/auth>readable-stream": { + "globals": { + "AbortController": true, + "AbortSignal": true, + "AggregateError": true, + "Blob": true, + "queueMicrotask": true + }, + "packages": { + "react-redux>@babel/runtime": true, + "ttag-cli>gettext-parser>readable-stream>abort-controller": true, + "buffer": true, + "@walletconnect/core>events": true, + "process": true, + "@web3auth/base>@web3auth/auth>readable-stream>string_decoder": true + } + }, "node-stdlib-browser>crypto-browserify>browserify-sign>readable-stream": { "globals": { "process.browser": true, @@ -1730,6 +2361,27 @@ "npm-run-all>string.prototype.padend>es-abstract>object-inspect": true } }, + "@web3auth/base>@web3auth/auth>@toruslabs/secure-pub-sub>socket.io-client": { + "globals": { + "location": true + }, + "packages": { + "@web3auth/base>@web3auth/auth>@toruslabs/secure-pub-sub>socket.io-client>@socket.io/component-emitter": true, + "cypress>debug": true, + "@web3auth/base>@web3auth/auth>@toruslabs/secure-pub-sub>socket.io-client>engine.io-client": true, + "@web3auth/base>@web3auth/auth>@toruslabs/secure-pub-sub>socket.io-client>socket.io-parser": true + } + }, + "@web3auth/base>@web3auth/auth>@toruslabs/secure-pub-sub>socket.io-client>socket.io-parser": { + "globals": { + "Blob": true, + "File": true + }, + "packages": { + "@web3auth/base>@web3auth/auth>@toruslabs/secure-pub-sub>socket.io-client>@socket.io/component-emitter": true, + "cypress>debug": true + } + }, "node-stdlib-browser>stream-browserify": { "packages": { "@walletconnect/core>events": true, @@ -1742,6 +2394,16 @@ "node-stdlib-browser>string_decoder>safe-buffer": true } }, + "@web3auth/no-modal>@toruslabs/openlogin-jrpc>readable-stream>string_decoder": { + "packages": { + "cypress>@cypress/request>safe-buffer": true + } + }, + "@web3auth/base>@web3auth/auth>readable-stream>string_decoder": { + "packages": { + "cypress>@cypress/request>safe-buffer": true + } + }, "react-copy-to-clipboard>copy-to-clipboard>toggle-selection": { "globals": { "document.activeElement": true, @@ -1849,7 +2511,7 @@ "packages": { "node-stdlib-browser>util>inherits": true, "node-stdlib-browser>util>is-arguments": true, - "node-stdlib-browser>util>is-generator-function": true, + "ttag-cli>koa>is-generator-function": true, "node-stdlib-browser>util>is-typed-array": true, "process": true, "node-stdlib-browser>util>which-typed-array": true @@ -1914,7 +2576,7 @@ "npm-run-all>string.prototype.padend>call-bind": true, "node-stdlib-browser>util>is-typed-array>for-each": true, "eslint-plugin-react>object.hasown>es-abstract>gopd": true, - "eslint-plugin-react>array-includes>is-string>has-tostringtag": true, + "ttag-cli>koa>is-generator-function>has-tostringtag": true, "node-stdlib-browser>util>is-typed-array": true } }, diff --git a/locale/texts.pot b/locale/texts.pot index 14c2f7715..ea5899803 100644 --- a/locale/texts.pot +++ b/locale/texts.pot @@ -29,12 +29,12 @@ msgstr "" #: src/components/PinPad.js:65 #: src/components/nano-contract/ModalSelectAddressToSignData.js:83 #: src/screens/ChoosePassphrase.js:76 -#: src/screens/LockedWallet.js:66 +#: src/screens/LockedWallet.js:68 msgid "Invalid PIN" msgstr "" #: src/screens/ChoosePassphrase.js:83 -#: src/screens/Settings.js:389 +#: src/screens/Settings.js:394 #. Everything is fine, so show confirm modal msgid "Set a passphrase" msgstr "" @@ -63,7 +63,7 @@ msgstr "" #: src/components/NetworkSettingsForm.js:167 #: src/screens/ChoosePassphrase.js:157 -#: src/screens/LockedWallet.js:116 +#: src/screens/LockedWallet.js:124 msgid "PIN" msgstr "" @@ -89,7 +89,7 @@ msgid "" "passphrase, you will never have access to your tokens again." msgstr "" -#: src/components/ModalTokenImport.js:375 +#: src/components/ModalTokenImport.js:388 #: src/components/nano-contract/ModalChangeAddress.js:106 #: src/screens/ChoosePassphrase.js:174 #: src/screens/SentryPermission.js:89 @@ -371,7 +371,7 @@ msgstr "" msgid "Create an NFT" msgstr "" -#: src/components/ModalTokenImport.js:297 +#: src/components/ModalTokenImport.js:310 #: src/screens/CustomTokens.js:90 msgid "Register a token" msgstr "" @@ -389,12 +389,12 @@ msgid "Words separated by single space" msgstr "" #: src/components/BackButton.js:29 -#: src/components/ModalTokenImport.js:413 +#: src/components/ModalTokenImport.js:426 #: src/components/PinPasswordWrapper.js:60 #: src/screens/LoadWallet.js:147 #: src/screens/NewWallet.js:149 #: src/screens/NewWallet.js:162 -#: src/screens/Signin.js:45 +#: src/screens/Signin.js:115 #: src/screens/SoftwareWalletWarning.js:55 #: src/screens/StartHardwareWallet.js:181 msgid "Back" @@ -410,7 +410,7 @@ msgstr "" #: src/components/ModalUnhandledError.js:99 #: src/screens/LoadWalletFailed.js:72 -#: src/screens/Settings.js:391 +#: src/screens/Settings.js:411 msgid "Reset wallet" msgstr "" @@ -442,17 +442,17 @@ msgstr "" msgid "**Transactions found:** ${ transactionsFound }" msgstr "" -#: src/screens/LockedWallet.js:114 +#: src/screens/LockedWallet.js:122 msgid "Your wallet is locked. Please write down your PIN to unlock it." msgstr "" #: src/components/ModalConfirmClearStorage.js:58 #: src/components/ModalResetAllData.js:137 -#: src/screens/LockedWallet.js:120 +#: src/screens/LockedWallet.js:128 msgid "Reset all data" msgstr "" -#: src/screens/LockedWallet.js:130 +#: src/screens/LockedWallet.js:138 msgid "Unlock" msgstr "" @@ -669,7 +669,7 @@ msgstr "" #: src/components/ModalLedgerResetTokenSignatures.js:122 #: src/components/ModalLedgerSignToken.js:243 #: src/components/ModalSendSuccess.js:87 -#: src/components/ModalTokenImport.js:531 +#: src/components/ModalTokenImport.js:535 #: src/components/Reown/ErrorDetailModal.js:121 #: src/components/Reown/FeedbackModal.js:96 #: src/components/Reown/GenericErrorFeedbackModal.js:58 @@ -787,81 +787,81 @@ msgstr "" msgid "I allow Hathor Wallet to report error information to Hathor team." msgstr "" -#: src/screens/Settings.js:97 +#: src/screens/Settings.js:102 msgid "Complete action on your hardware wallet" msgstr "" -#: src/screens/Settings.js:100 +#: src/screens/Settings.js:105 msgid "You can set your passphrase directly on your hardware wallet." msgstr "" -#: src/screens/Settings.js:102 +#: src/screens/Settings.js:107 msgid "|fn:More info| about this on Ledger." msgstr "" -#: src/screens/Settings.js:167 +#: src/screens/Settings.js:172 msgid "Turn notifications off" msgstr "" -#: src/screens/Settings.js:168 +#: src/screens/Settings.js:173 msgid "Are you sure you don't want to receive wallet notifications?" msgstr "" -#: src/screens/Settings.js:170 +#: src/screens/Settings.js:175 msgid "Turn notifications on" msgstr "" -#: src/screens/Settings.js:171 +#: src/screens/Settings.js:176 msgid "Are you sure you want to receive wallet notifications?" msgstr "" -#: src/screens/Settings.js:192 +#: src/screens/Settings.js:197 msgid "Show zero-balance tokens" msgstr "" -#: src/screens/Settings.js:193 +#: src/screens/Settings.js:198 msgid "Are you sure you want to show all tokens, including those with zero balance?" msgstr "" -#: src/screens/Settings.js:195 +#: src/screens/Settings.js:200 msgid "Hide zero-balance tokens" msgstr "" -#: src/screens/Settings.js:196 +#: src/screens/Settings.js:201 msgid "Are you sure you want to hide tokens with zero balance?" msgstr "" #: src/components/ModalError.js:35 -#: src/screens/Settings.js:319 +#: src/screens/Settings.js:324 msgid "Error" msgstr "" -#: src/screens/Settings.js:320 +#: src/screens/Settings.js:325 msgid "Failed to change address mode. Please try again." msgstr "" -#: src/screens/Settings.js:337 +#: src/screens/Settings.js:342 msgid "General Settings" msgstr "" -#: src/screens/Settings.js:340 +#: src/screens/Settings.js:345 msgid "Network:" msgstr "" -#: src/screens/Settings.js:341 +#: src/screens/Settings.js:346 msgid "Connected to" msgstr "" #: src/components/TokenGeneralInfo.js:154 -#: src/screens/Settings.js:345 #: src/screens/Settings.js:350 -#: src/screens/Settings.js:361 -#: src/screens/Settings.js:369 -#: src/screens/Settings.js:376 +#: src/screens/Settings.js:355 +#: src/screens/Settings.js:366 +#: src/screens/Settings.js:374 +#: src/screens/Settings.js:381 msgid "Change" msgstr "" -#: src/screens/Settings.js:348 +#: src/screens/Settings.js:353 msgid "Allow notifications:" msgstr "" @@ -870,9 +870,9 @@ msgstr "" #: src/components/Reown/modals/BaseNanoContractModal.js:85 #: src/components/Reown/modals/GetUtxosModal.js:157 #: src/components/TokenGeneralInfo.js:151 -#: src/screens/Settings.js:349 -#: src/screens/Settings.js:360 -#: src/screens/Settings.js:368 +#: src/screens/Settings.js:354 +#: src/screens/Settings.js:365 +#: src/screens/Settings.js:373 msgid "Yes" msgstr "" @@ -881,102 +881,116 @@ msgstr "" #: src/components/Reown/modals/BaseNanoContractModal.js:85 #: src/components/Reown/modals/GetUtxosModal.js:157 #: src/components/TokenGeneralInfo.js:152 -#: src/screens/Settings.js:349 -#: src/screens/Settings.js:360 -#: src/screens/Settings.js:368 +#: src/screens/Settings.js:354 +#: src/screens/Settings.js:365 +#: src/screens/Settings.js:373 msgid "No" msgstr "" -#: src/screens/Settings.js:356 +#: src/screens/Settings.js:361 msgid "Advanced Settings" msgstr "" -#: src/screens/Settings.js:359 +#: src/screens/Settings.js:364 msgid "Hide zero-balance tokens:" msgstr "" -#: src/screens/Settings.js:363 +#: src/screens/Settings.js:368 msgid "" "When selected, any tokens with a balance of zero will not be displayed " "anywhere in the wallet." msgstr "" -#: src/screens/Settings.js:367 +#: src/screens/Settings.js:372 msgid "Automatically report bugs to Hathor:" msgstr "" -#: src/screens/Settings.js:373 +#: src/screens/Settings.js:378 msgid "Address Mode:" msgstr "" -#: src/screens/Settings.js:374 +#: src/screens/Settings.js:379 msgid "Single address" msgstr "" -#: src/screens/Settings.js:374 +#: src/screens/Settings.js:379 msgid "Multi address" msgstr "" -#: src/screens/Settings.js:382 +#: src/screens/Settings.js:387 msgid "Reown:" msgstr "" -#: src/screens/Settings.js:383 +#: src/screens/Settings.js:388 #, javascript-format msgid "Connected Sessions: ${ connectedSessionsCount }" msgstr "" -#: src/screens/Settings.js:384 +#: src/screens/Settings.js:389 msgid "Manage sessions" msgstr "" -#: src/components/ModalTokenImport.js:419 -#: src/screens/Settings.js:387 +#: src/components/ModalTokenImport.js:432 +#: src/screens/Settings.js:392 msgid "Import tokens" msgstr "" -#: src/screens/Settings.js:388 +#: src/screens/Settings.js:393 msgid "Export registered tokens" msgstr "" -#: src/screens/Settings.js:390 +#: src/screens/Settings.js:395 msgid "Untrust all tokens on Ledger" msgstr "" -#: src/screens/Settings.js:399 +#: src/screens/Settings.js:403 msgid "Unique identifier:" msgstr "" #: src/components/ModalAddressQRCode.js:101 #: src/components/Reown/CreateTokenRequestData.js:64 #: src/components/TokenGeneralInfo.js:177 -#: src/components/WalletAddress.js:180 -#: src/screens/Settings.js:399 +#: src/components/WalletAddress.js:184 +#: src/screens/Settings.js:403 #: src/screens/atomic-swap/EditSwap.js:97 #: src/screens/atomic-swap/EditSwap.js:111 msgid "Copy to clipboard" msgstr "" -#: src/screens/Settings.js:402 +#: src/screens/Settings.js:406 msgid "Date and time:" msgstr "" +#: src/screens/Settings.js:411 +#, javascript-format +msgid "Sign out of your Hathor account ${ displayEmail }" +msgstr "" + +#: src/screens/Settings.js:416 +msgid "Terms of Service" +msgstr "" + +#: src/screens/Settings.js:417 +msgid "Privacy Policy" +msgstr "" + #: src/components/TxData.js:1114 -#: src/components/WalletAddress.js:200 -#: src/screens/Settings.js:410 +#: src/components/WalletAddress.js:204 +#: src/screens/Settings.js:420 #: src/screens/atomic-swap/EditSwap.js:596 msgid "Copied to clipboard!" msgstr "" -#: src/screens/Signin.js:43 +#: src/screens/Signin.js:113 msgid "You can start a new wallet or import data from a wallet that already exists." msgstr "" -#: src/screens/Signin.js:46 +#: src/screens/Signin.js:116 +#: src/screens/Web3AuthLogin.js:119 msgid "New wallet" msgstr "" -#: src/screens/Signin.js:47 +#: src/screens/Signin.js:117 msgid "Import wallet" msgstr "" @@ -991,6 +1005,7 @@ msgstr "" #: src/components/ModalLedgerResetTokenSignatures.js:121 #: src/components/ModalTransactionOverview.js:353 +#: src/components/Web3AuthErrorDialog.js:93 #: src/screens/StartHardwareWallet.js:153 #: src/screens/TransactionDetail.js:161 #: src/screens/VersionError.js:58 @@ -1116,11 +1131,11 @@ msgstr "" msgid "try again" msgstr "" -#: src/screens/WalletType.js:76 +#: src/screens/WalletType.js:87 msgid "Hathor Wallet supports two types of wallet: software and hardware." msgstr "" -#: src/screens/WalletType.js:78 +#: src/screens/WalletType.js:89 msgid "" "|bold:Hardware wallets| are dedicated external devices that store your " "private information. We currently support the Ledger hardware wallet and " @@ -1128,21 +1143,25 @@ msgid "" "about how to use the ledger app with Hathor Wallet check out |fn:this page|." msgstr "" -#: src/screens/WalletType.js:85 +#: src/screens/WalletType.js:96 msgid "" "**Software wallets**, on the other hand, store the information on your " "computer." msgstr "" -#: src/screens/WalletType.js:87 +#: src/screens/WalletType.js:98 msgid "Hardware wallet" msgstr "" -#: src/screens/WalletType.js:88 +#: src/screens/WalletType.js:99 msgid "Software wallet" msgstr "" -#: src/screens/WalletType.js:100 +#: src/screens/WalletType.js:103 +msgid "Sign in with social" +msgstr "" + +#: src/screens/WalletType.js:116 msgid "Ledger disconnected! Either the app was closed or the connection was lost!" msgstr "" @@ -1185,6 +1204,48 @@ msgstr "" msgid "Backup done with success!" msgstr "" +#: src/screens/Web3AuthLogin.js:75 +msgid "Sign in to Hathor" +msgstr "" + +#: src/screens/Web3AuthLogin.js:85 +msgid "Continue with Google" +msgstr "" + +#: src/screens/Web3AuthLogin.js:93 +msgid "Apple sign-in coming soon" +msgstr "" + +#: src/screens/Web3AuthLogin.js:96 +msgid "Continue with Apple" +msgstr "" + +#: src/screens/Web3AuthLogin.js:103 +msgid "Email sign-in coming soon" +msgstr "" + +#: src/screens/Web3AuthLogin.js:106 +msgid "Continue with Email" +msgstr "" + +#: src/screens/Web3AuthLogin.js:111 +msgid "OR" +msgstr "" + +#: src/screens/Web3AuthLogin.js:116 +msgid "Import with seed words" +msgstr "" + +#: src/screens/Web3AuthRecovery.js:25 +msgid "Recovery" +msgstr "" + +#: src/screens/Web3AuthRecovery.js:26 +msgid "" +"Web3Auth recovery is managed through the Web3Auth-hosted recovery portal. A " +"direct link from this screen will be added in a follow-up." +msgstr "" + #: src/screens/Welcome.js:76 msgid "Welcome to Hathor Wallet!" msgstr "" @@ -1557,24 +1618,24 @@ msgstr "" msgid "Error getting nano contract state." msgstr "" -#: src/sagas/networkSettings.js:61 +#: src/sagas/networkSettings.js:69 msgid "Invalid node." msgstr "" -#: src/sagas/networkSettings.js:142 +#: src/sagas/networkSettings.js:174 msgid "Error updating network settings." msgstr "" -#: src/sagas/reown.js:510 +#: src/sagas/reown.js:514 msgid "Insufficient funds to complete the transaction." msgstr "" -#: src/sagas/reown.js:1137 +#: src/sagas/reown.js:1141 #. Show error modal to user msgid "Network Mismatch" msgstr "" -#: src/sagas/reown.js:1138 +#: src/sagas/reown.js:1142 #. Show error modal to user #, javascript-format msgid "" @@ -1582,7 +1643,7 @@ msgid "" "wallet is connected to ${ walletNetwork }." msgstr "" -#: src/sagas/tokens.js:415 +#: src/sagas/tokens.js:424 msgid "An error occurred while fetching this token data" msgstr "" @@ -1769,57 +1830,57 @@ msgstr "" msgid "Configuration string" msgstr "" -#: src/components/ModalAddressMode.js:62 +#: src/components/ModalAddressMode.js:64 msgid "Address Mode" msgstr "" -#: src/components/ModalAddressMode.js:69 +#: src/components/ModalAddressMode.js:71 msgid "You can set your wallet to " msgstr "" -#: src/components/ModalAddressMode.js:69 +#: src/components/ModalAddressMode.js:71 msgid "single or multi address mode" msgstr "" -#: src/components/ModalAddressMode.js:71 +#: src/components/ModalAddressMode.js:73 msgid "You can switch anytime in the settings." msgstr "" -#: src/components/ModalAddressMode.js:87 +#: src/components/ModalAddressMode.js:89 msgid "Single Address" msgstr "" -#: src/components/ModalAddressMode.js:90 +#: src/components/ModalAddressMode.js:92 msgid "Your wallet will use only one address (index 0)." msgstr "" -#: src/components/ModalAddressMode.js:92 +#: src/components/ModalAddressMode.js:94 msgid "Easier to manage and compatible with all dApps." msgstr "" -#: src/components/ModalAddressMode.js:108 +#: src/components/ModalAddressMode.js:110 msgid "Multi Address" msgstr "" -#: src/components/ModalAddressMode.js:111 +#: src/components/ModalAddressMode.js:113 msgid "Your wallet will let you generate multiple addresses." msgstr "" -#: src/components/ModalAddressMode.js:113 +#: src/components/ModalAddressMode.js:115 msgid "Useful for advanced users." msgstr "" -#: src/components/ModalAddressMode.js:121 +#: src/components/ModalAddressMode.js:123 msgid "" "You can't switch to single address mode because other addresses in your " "wallet are already in use." msgstr "" -#: src/components/ModalAddressMode.js:123 +#: src/components/ModalAddressMode.js:125 msgid "Learn more" msgstr "" -#: src/components/ModalAddressMode.js:137 +#: src/components/ModalAddressMode.js:139 msgid "Save preferences" msgstr "" @@ -1829,7 +1890,7 @@ msgid "Address copied to clipboard!" msgstr "" #: src/components/ModalAddressQRCode.js:91 -#: src/components/WalletAddress.js:154 +#: src/components/WalletAddress.js:158 msgid "Address to receive tokens" msgstr "" @@ -2115,88 +2176,92 @@ msgstr "" msgid "Ok" msgstr "" -#: src/components/ModalTokenImport.js:201 +#: src/components/ModalTokenImport.js:219 msgid "Unknown error" msgstr "" -#: src/components/ModalTokenImport.js:264 +#: src/components/ModalTokenImport.js:277 msgid "" "Some tokens are hidden because \"hide zero-balance tokens\" is enabled. You " "can change this on settings." msgstr "" -#: src/components/ModalTokenImport.js:274 +#: src/components/ModalTokenImport.js:287 #. -- Render helpers ------------------------------------------------------- msgid "Loading token details..." msgstr "" -#: src/components/ModalTokenImport.js:281 +#: src/components/ModalTokenImport.js:294 msgid "We didn't find any unregistered tokens linked to your wallet." msgstr "" -#: src/components/ModalTokenImport.js:284 +#: src/components/ModalTokenImport.js:297 msgid "You can register a new one manually." msgstr "" -#: src/components/ModalTokenImport.js:346 +#: src/components/ModalTokenImport.js:359 msgid "Select the tokens you want to add to your wallet." msgstr "" -#: src/components/ModalTokenImport.js:350 +#: src/components/ModalTokenImport.js:363 #, javascript-format msgid "" "Could not load details for ${ fetchErrorCount } token(s). They are shown " "with partial information but can still be imported." msgstr "" -#: src/components/ModalTokenImport.js:359 -#: src/components/ModalTokenImport.js:362 +#: src/components/ModalTokenImport.js:372 +#: src/components/ModalTokenImport.js:375 msgid "Deselect all" msgstr "" -#: src/components/ModalTokenImport.js:359 -#: src/components/ModalTokenImport.js:362 +#: src/components/ModalTokenImport.js:372 +#: src/components/ModalTokenImport.js:375 msgid "Select all" msgstr "" -#: src/components/ModalTokenImport.js:384 +#: src/components/ModalTokenImport.js:397 msgid "You are about to add these tokens to your wallet:" msgstr "" -#: src/components/ModalTokenImport.js:406 +#: src/components/ModalTokenImport.js:419 msgid "Only add tokens you recognize." msgstr "" -#: src/components/ModalTokenImport.js:430 +#: src/components/ModalTokenImport.js:441 msgid "Registering selected tokens..." msgstr "" -#: src/components/ModalTokenImport.js:444 +#: src/components/ModalTokenImport.js:448 msgid "New tokens added!" msgstr "" -#: src/components/ModalTokenImport.js:453 +#: src/components/ModalTokenImport.js:457 msgid "Some tokens failed to register:" msgstr "" -#: src/components/ModalTokenImport.js:475 +#: src/components/ModalTokenImport.js:479 #: src/components/Reown/FeedbackModal.js:81 msgid "Retry" msgstr "" -#: src/components/ModalTokenImport.js:518 +#: src/components/ModalTokenImport.js:522 msgid "No tokens available to import" msgstr "" -#: src/components/ModalTokenImport.js:519 +#: src/components/ModalTokenImport.js:523 msgid "Confirm Import" msgstr "" -#: src/components/ModalTokenImport.js:520 +#: src/components/ModalTokenImport.js:524 msgid "Tokens added" msgstr "" #: src/components/ModalTokenImport.js:525 +msgid "Registering tokens" +msgstr "" + +#: src/components/ModalTokenImport.js:529 msgid "Tokens found" msgstr "" @@ -2332,31 +2397,31 @@ msgstr "" msgid "Register token" msgstr "" -#: src/components/Navigation.js:58 +#: src/components/Navigation.js:62 msgid "Wallet" msgstr "" -#: src/components/Navigation.js:61 +#: src/components/Navigation.js:65 msgid "Send tokens" msgstr "" -#: src/components/Navigation.js:64 +#: src/components/Navigation.js:68 msgid "Custom tokens" msgstr "" -#: src/components/Navigation.js:67 +#: src/components/Navigation.js:71 msgid "NFTs" msgstr "" -#: src/components/Navigation.js:70 +#: src/components/Navigation.js:74 msgid "Atomic Swap" msgstr "" -#: src/components/Navigation.js:73 +#: src/components/Navigation.js:77 msgid "Public Explorer" msgstr "" -#: src/components/Navigation.js:76 +#: src/components/Navigation.js:80 msgid "Nano Contract" msgstr "" @@ -3026,43 +3091,43 @@ msgstr "" msgid "Software Wallet" msgstr "" -#: src/components/WalletAddress.js:93 +#: src/components/WalletAddress.js:95 msgid "Validate address on Ledger" msgstr "" -#: src/components/WalletAddress.js:141 +#: src/components/WalletAddress.js:143 msgid "Validate that the address below is the same presented on the Ledger screen." msgstr "" -#: src/components/WalletAddress.js:142 +#: src/components/WalletAddress.js:144 msgid "Press both buttons on your Ledger in case the address is valid." msgstr "" -#: src/components/WalletAddress.js:158 +#: src/components/WalletAddress.js:162 msgid "Generate new address" msgstr "" -#: src/components/WalletAddress.js:158 +#: src/components/WalletAddress.js:162 msgid "Get new address" msgstr "" -#: src/components/WalletAddress.js:163 +#: src/components/WalletAddress.js:167 msgid "QR Code" msgstr "" -#: src/components/WalletAddress.js:163 +#: src/components/WalletAddress.js:167 msgid "Get qrcode" msgstr "" -#: src/components/WalletAddress.js:168 +#: src/components/WalletAddress.js:172 msgid "See all addresses" msgstr "" -#: src/components/WalletAddress.js:190 +#: src/components/WalletAddress.js:194 msgid "Show full address" msgstr "" -#: src/components/WalletAddress.js:201 +#: src/components/WalletAddress.js:205 msgid "You must use an old address before generating new ones" msgstr "" @@ -3084,6 +3149,100 @@ msgstr "" msgid "Transaction history" msgstr "" +#: src/components/Web3AuthErrorDialog.js:20 +#. * +#. * Copy + observability tag for each Web3Auth error variant. USER_CANCELLED is +#. * intentionally absent: the saga swallows it silently before reaching this +#. * component, so any errorType reaching us is a real failure worth surfacing. +#. +msgid "Connection problem" +msgstr "" + +#: src/components/Web3AuthErrorDialog.js:21 +#. * +#. * Copy + observability tag for each Web3Auth error variant. USER_CANCELLED is +#. * intentionally absent: the saga swallows it silently before reaching this +#. * component, so any errorType reaching us is a real failure worth surfacing. +#. +msgid "Could not reach Web3Auth. Check your internet connection and try again." +msgstr "" + +#: src/components/Web3AuthErrorDialog.js:25 +#. * +#. * Copy + observability tag for each Web3Auth error variant. USER_CANCELLED is +#. * intentionally absent: the saga swallows it silently before reaching this +#. * component, so any errorType reaching us is a real failure worth surfacing. +#. +msgid "Sign-in temporarily unavailable" +msgstr "" + +#: src/components/Web3AuthErrorDialog.js:26 +#. * +#. * Copy + observability tag for each Web3Auth error variant. USER_CANCELLED is +#. * intentionally absent: the saga swallows it silently before reaching this +#. * component, so any errorType reaching us is a real failure worth surfacing. +#. +msgid "" +"There is a configuration issue with Web3Auth. The Hathor team has been " +"notified." +msgstr "" + +#: src/components/Web3AuthErrorDialog.js:30 +#. * +#. * Copy + observability tag for each Web3Auth error variant. USER_CANCELLED is +#. * intentionally absent: the saga swallows it silently before reaching this +#. * component, so any errorType reaching us is a real failure worth surfacing. +#. +msgid "Set up a recovery factor" +msgstr "" + +#: src/components/Web3AuthErrorDialog.js:31 +#. * +#. * Copy + observability tag for each Web3Auth error variant. USER_CANCELLED is +#. * intentionally absent: the saga swallows it silently before reaching this +#. * component, so any errorType reaching us is a real failure worth surfacing. +#. +msgid "" +"Hathor wallets require a recovery factor to protect your funds. You can " +"configure it in the next step." +msgstr "" + +#: src/components/Web3AuthErrorDialog.js:35 +#. * +#. * Copy + observability tag for each Web3Auth error variant. USER_CANCELLED is +#. * intentionally absent: the saga swallows it silently before reaching this +#. * component, so any errorType reaching us is a real failure worth surfacing. +#. +msgid "Could not derive your wallet" +msgstr "" + +#: src/components/Web3AuthErrorDialog.js:36 +#. * +#. * Copy + observability tag for each Web3Auth error variant. USER_CANCELLED is +#. * intentionally absent: the saga swallows it silently before reaching this +#. * component, so any errorType reaching us is a real failure worth surfacing. +#. +msgid "Something went wrong while preparing your wallet. Please contact support." +msgstr "" + +#: src/components/Web3AuthErrorDialog.js:40 +#. * +#. * Copy + observability tag for each Web3Auth error variant. USER_CANCELLED is +#. * intentionally absent: the saga swallows it silently before reaching this +#. * component, so any errorType reaching us is a real failure worth surfacing. +#. +msgid "Sign-in failed" +msgstr "" + +#: src/components/Web3AuthErrorDialog.js:41 +#. * +#. * Copy + observability tag for each Web3Auth error variant. USER_CANCELLED is +#. * intentionally absent: the saga swallows it silently before reaching this +#. * component, so any errorType reaching us is a real failure worth surfacing. +#. +msgid "Something unexpected happened. Please try again." +msgstr "" + #: src/components/tokens/TokenDelegate.js:47 #: src/components/tokens/TokenDelegate.js:74 #: src/components/tokens/TokenDelegate.js:102 @@ -3767,21 +3926,21 @@ msgid "Register Nano Contract" msgstr "" #: src/components/Reown/modals/BaseNanoContractModal.js:233 -#: src/components/Reown/modals/CreateNanoContractCreateTokenTxModal.js:71 -#: src/components/Reown/modals/SendNanoContractTxModal.js:37 +#: src/components/Reown/modals/CreateNanoContractCreateTokenTxModal.js:74 +#: src/components/Reown/modals/SendNanoContractTxModal.js:41 #: src/components/Reown/modals/SendTransactionModal.js:247 msgid "Accept Transaction" msgstr "" #: src/components/Reown/modals/BaseNanoContractModal.js:234 #: src/components/Reown/modals/ConnectModal.js:37 -#: src/components/Reown/modals/CreateNanoContractCreateTokenTxModal.js:72 +#: src/components/Reown/modals/CreateNanoContractCreateTokenTxModal.js:75 #: src/components/Reown/modals/CreateTokenModal.js:56 #: src/components/Reown/modals/GetAddressClientModal.js:95 #: src/components/Reown/modals/GetAddressModal.js:53 #: src/components/Reown/modals/GetBalanceModal.js:66 #: src/components/Reown/modals/GetUtxosModal.js:187 -#: src/components/Reown/modals/SendNanoContractTxModal.js:38 +#: src/components/Reown/modals/SendNanoContractTxModal.js:42 #: src/components/Reown/modals/SendTransactionModal.js:246 #: src/components/Reown/modals/SignMessageModal.js:27 #: src/components/Reown/modals/SignOracleDataModal.js:40 @@ -3817,14 +3976,14 @@ msgstr "" msgid "This dApp would like to:" msgstr "" -#: src/components/Reown/modals/CreateNanoContractCreateTokenTxModal.js:19 +#: src/components/Reown/modals/CreateNanoContractCreateTokenTxModal.js:21 #. * #. * Component for Token Data Card #. msgid "Create Token Data" msgstr "" -#: src/components/Reown/modals/CreateNanoContractCreateTokenTxModal.js:70 +#: src/components/Reown/modals/CreateNanoContractCreateTokenTxModal.js:73 msgid "CREATE NANO CONTRACT & TOKEN" msgstr "" @@ -3963,7 +4122,7 @@ msgstr "" msgid "Share UTXOs Information" msgstr "" -#: src/components/Reown/modals/SendNanoContractTxModal.js:36 +#: src/components/Reown/modals/SendNanoContractTxModal.js:40 msgid "NEW NANO CONTRACT TRANSACTION" msgstr "" diff --git a/package-lock.json b/package-lock.json index 2e376fbb4..b7d5ed1c5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,13 +10,17 @@ "hasInstallScript": true, "dependencies": { "@hathor/hathor-rpc-handler": "4.4.0", - "@hathor/wallet-lib": "3.1.1", + "@hathor/wallet-lib": "file:.yalc/@hathor/wallet-lib", "@ledgerhq/hw-transport-node-hid": "6.28.1", "@reduxjs/toolkit": "2.2.3", "@reown/walletkit": "1.1.2", "@sentry/electron": "3.0.7", "@walletconnect/core": "2.17.3", "@walletconnect/utils": "2.17.3", + "@web3auth/auth-adapter": "^9.7.0", + "@web3auth/base": "^9.7.0", + "@web3auth/base-provider": "^9.7.0", + "@web3auth/no-modal": "^8.12.4", "axios": "1.7.7", "babel-polyfill": "6.26.0", "bootstrap": "4.6.1", @@ -73,6 +77,47 @@ "npm": ">=10.0.0" } }, + ".yalc/@hathor/wallet-lib": { + "version": "3.1.1", + "license": "MIT", + "dependencies": { + "axios": "1.7.7", + "bitcore-lib": "8.25.10", + "bitcore-mnemonic": "8.25.10", + "buffer": "6.0.3", + "crypto-js": "4.2.0", + "isomorphic-ws": "5.0.0", + "lodash": "4.17.21", + "queue-microtask": "1.2.3", + "ws": "8.17.1", + "zod": "3.23.8" + }, + "engines": { + "node": ">=22.0.0", + "npm": ">=10.0.0" + } + }, + ".yalc/@hathor/wallet-lib/node_modules/ws": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", + "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/@aashutoshrathi/word-wrap": { "version": "1.2.6", "license": "MIT", @@ -2853,6 +2898,31 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, + "node_modules/@ethereumjs/rlp": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@ethereumjs/rlp/-/rlp-5.0.2.tgz", + "integrity": "sha512-DziebCdg4JpGlEqEdGgXmjqcFoJi+JGulUXwEjsZGAscAQ7MyD/7LE/GVCP29vEQxKc7AAwjT3A2ywHp2xfoCA==", + "license": "MPL-2.0", + "bin": { + "rlp": "bin/rlp.cjs" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@ethereumjs/util": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/@ethereumjs/util/-/util-9.1.0.tgz", + "integrity": "sha512-XBEKsYqLGXLah9PNJbgdkigthkG7TAGvlD/sH12beMXEyHDyigfcbdvHhmLyDWgDyOJn4QwiQUaF7yeuhnjdog==", + "license": "MPL-2.0", + "dependencies": { + "@ethereumjs/rlp": "^5.0.2", + "ethereum-cryptography": "^2.2.1" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/@ethersproject/abstract-provider": { "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz", @@ -3292,47 +3362,8 @@ } }, "node_modules/@hathor/wallet-lib": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@hathor/wallet-lib/-/wallet-lib-3.1.1.tgz", - "integrity": "sha512-D1ZC7IxVd9DtycgqSnVNByGnQiTJLNoUlgk8sBlCKmVMO3AehNo3t6PVkyXEUA2DOjW/rACqPVbYBPiprbPR0g==", - "license": "MIT", - "dependencies": { - "axios": "1.7.7", - "bitcore-lib": "8.25.10", - "bitcore-mnemonic": "8.25.10", - "buffer": "6.0.3", - "crypto-js": "4.2.0", - "isomorphic-ws": "5.0.0", - "lodash": "4.17.21", - "queue-microtask": "1.2.3", - "ws": "8.17.1", - "zod": "3.23.8" - }, - "engines": { - "node": ">=22.0.0", - "npm": ">=10.0.0" - } - }, - "node_modules/@hathor/wallet-lib/node_modules/ws": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", - "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", - "license": "MIT", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } + "resolved": ".yalc/@hathor/wallet-lib", + "link": true }, "node_modules/@humanwhocodes/config-array": { "version": "0.11.14", @@ -4453,6 +4484,42 @@ "eslint-scope": "5.1.1" } }, + "node_modules/@noble/curves": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.4.2.tgz", + "integrity": "sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "1.4.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@noble/curves/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==", + "license": "MIT", + "engines": { + "node": ">= 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", "license": "MIT", @@ -4482,6 +4549,22 @@ "node": ">= 8" } }, + "node_modules/@nx/nx-linux-x64-gnu": { + "version": "20.8.4", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-20.8.4.tgz", + "integrity": "sha512-MSu+xVNdR95tuuO+eL/a/ZeMlhfrZ627On5xaCZXnJ+lFxNg/S4nlKZQk0Eq5hYALCd/GKgFGasRdlRdOtvGPg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, "node_modules/@pkgjs/parseargs": { "version": "0.11.0", "license": "MIT", @@ -4686,10 +4769,83 @@ "version": "1.0.1", "license": "MIT" }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.60.4.tgz", + "integrity": "sha512-Boiz5+MsaROEWDf+GGEwF8VMHGhlUoQMtIPjOgA5fv4osupqTVnJteQNKJwUcnUog2G55jYXH7KZFFiJe0TEzQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, "node_modules/@rushstack/eslint-patch": { "version": "1.10.3", "license": "MIT" }, + "node_modules/@scure/base": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.9.tgz", + "integrity": "sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg==", + "license": "MIT", + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip32": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.4.0.tgz", + "integrity": "sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg==", + "license": "MIT", + "dependencies": { + "@noble/curves": "~1.4.0", + "@noble/hashes": "~1.4.0", + "@scure/base": "~1.1.6" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip32/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==", + "license": "MIT", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip39": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.3.0.tgz", + "integrity": "sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "~1.4.0", + "@scure/base": "~1.1.6" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip39/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==", + "license": "MIT", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/@sentry-internal/feedback": { "version": "7.99.0", "dev": true, @@ -5203,6 +5359,12 @@ "@sinonjs/commons": "^1.7.0" } }, + "node_modules/@socket.io/component-emitter": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", + "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==", + "license": "MIT" + }, "node_modules/@stablelib/aead": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@stablelib/aead/-/aead-1.0.1.tgz", @@ -5876,444 +6038,1146 @@ "node": ">= 10" } }, - "node_modules/@trysound/sax": { - "version": "0.2.0", + "node_modules/@toruslabs/base-controllers": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@toruslabs/base-controllers/-/base-controllers-7.4.0.tgz", + "integrity": "sha512-Qu6ov8fbKsF+PX8K6wSLBpT6pyBpDO+kGFc7pIbFP1zZU6JCyaD9c8ddfsWRr0ZOIWHzznjrYSbP/UZ0r3fZDA==", "license": "ISC", + "dependencies": { + "@ethereumjs/util": "^9.1.0", + "@toruslabs/broadcast-channel": "^11.0.0", + "@toruslabs/http-helpers": "^7.0.0", + "@web3auth/auth": "^9.6.4", + "async-mutex": "^0.5.0", + "bignumber.js": "^9.1.2", + "bowser": "^2.11.0", + "jwt-decode": "^4.0.0", + "loglevel": "^1.9.2" + }, "engines": { - "node": ">=10.13.0" + "node": ">=18.x", + "npm": ">=9.x" + }, + "peerDependencies": { + "@babel/runtime": "7.x" } }, - "node_modules/@types/aria-query": { - "version": "5.0.4", - "dev": true, - "license": "MIT" + "node_modules/@toruslabs/base-controllers/node_modules/@sentry/core": { + "version": "8.55.2", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-8.55.2.tgz", + "integrity": "sha512-YlEBwybUcOQ/KjMHDmof1vwweVnBtBxYlQp7DE3fOdtW4pqqdHWTnTntQs4VgYfxzjJYgtkd9LHlGtg8qy+JVQ==", + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=14.18" + } }, - "node_modules/@types/babel__core": { - "version": "7.20.5", + "node_modules/@toruslabs/base-controllers/node_modules/@sentry/types": { + "version": "8.55.2", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-8.55.2.tgz", + "integrity": "sha512-6MH7sKopaAY1XAIoOirjkkhHZfH3TBuIyErtUH29jvHcdHQFQPk42vX82jBL6csGB8wbsHCWjrBh6y2KqtaknA==", "license": "MIT", + "optional": true, + "peer": true, "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" + "@sentry/core": "8.55.2" + }, + "engines": { + "node": ">=14.18" } }, - "node_modules/@types/babel__generator": { - "version": "7.6.8", + "node_modules/@toruslabs/base-controllers/node_modules/@toruslabs/http-helpers": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@toruslabs/http-helpers/-/http-helpers-7.0.1.tgz", + "integrity": "sha512-9LqvgH/JfMtgZSzRqSutDfXZ5gw6+hziByYgzOzLGTO3WcqALAKCcO+icvcNI/NCw8HW4xpTM2xZIEkkEcFYPg==", "license": "MIT", "dependencies": { - "@babel/types": "^7.0.0" + "deepmerge": "^4.3.1", + "loglevel": "^1.9.2" + }, + "engines": { + "node": ">=20.x", + "npm": ">=9.x" + }, + "peerDependencies": { + "@babel/runtime": "^7.x", + "@sentry/types": "^8.x" + }, + "peerDependenciesMeta": { + "@sentry/types": { + "optional": true + } } }, - "node_modules/@types/babel__template": { - "version": "7.4.4", - "license": "MIT", + "node_modules/@toruslabs/base-session-manager": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@toruslabs/base-session-manager/-/base-session-manager-3.1.1.tgz", + "integrity": "sha512-/awg0VbJcfcdJTB2zYdnoFkNGOioODvBc7i3vfxR6lRpFvVwndYPwbD870bgRiSUt9hSee8pSfokejnjDZGpew==", + "license": "ISC", "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" + "@toruslabs/http-helpers": "^6.1.0" + }, + "engines": { + "node": ">=18.x", + "npm": ">=9.x" + }, + "peerDependencies": { + "@babel/runtime": "7.x" } }, - "node_modules/@types/babel__traverse": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.7.tgz", - "integrity": "sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==", + "node_modules/@toruslabs/base-session-manager/node_modules/@sentry/types": { + "version": "7.120.4", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.120.4.tgz", + "integrity": "sha512-cUq2hSSe6/qrU6oZsEP4InMI5VVdD86aypE+ENrQ6eZEVLTCYm1w6XhW1NvIu3UuWh7gZec4a9J7AFpYxki88Q==", "license": "MIT", - "dependencies": { - "@babel/types": "^7.20.7" + "optional": true, + "peer": true, + "engines": { + "node": ">=8" } }, - "node_modules/@types/body-parser": { - "version": "1.19.5", + "node_modules/@toruslabs/base-session-manager/node_modules/@toruslabs/http-helpers": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/@toruslabs/http-helpers/-/http-helpers-6.1.1.tgz", + "integrity": "sha512-bJYOaltRzklzObhRdutT1wau17vXyrCCBKJOeN46F1t99MUXi5udQNeErFOcr9qBsvrq2q67eVBkU5XOeBMX5A==", "license": "MIT", "dependencies": { - "@types/connect": "*", - "@types/node": "*" + "lodash.merge": "^4.6.2", + "loglevel": "^1.9.1" + }, + "engines": { + "node": ">=18.x", + "npm": ">=9.x" + }, + "peerDependencies": { + "@babel/runtime": "^7.x", + "@sentry/types": "^7.x" + }, + "peerDependenciesMeta": { + "@sentry/types": { + "optional": true + } } }, - "node_modules/@types/bonjour": { - "version": "3.5.13", + "node_modules/@toruslabs/broadcast-channel": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@toruslabs/broadcast-channel/-/broadcast-channel-11.0.0.tgz", + "integrity": "sha512-nnM5yjQGzmCiie37G4Ks+5VsPjMrcY/81tga5ASb/u5TbZhSPQUw0CSW42Q9uBtR8sZbsHU06cPZ8j0z6LeAUg==", "license": "MIT", "dependencies": { - "@types/node": "*" + "@babel/runtime": "^7.24.7", + "@toruslabs/eccrypto": "^5.0.0", + "@toruslabs/metadata-helpers": "^6.0.0", + "loglevel": "^1.9.1", + "oblivious-set": "1.4.0", + "socket.io-client": "^4.7.5", + "unload": "^2.4.1" + }, + "engines": { + "node": ">=18.x", + "npm": ">=9.x" } }, - "node_modules/@types/cacheable-request": { - "version": "6.0.3", - "dev": true, + "node_modules/@toruslabs/constants": { + "version": "14.2.0", + "resolved": "https://registry.npmjs.org/@toruslabs/constants/-/constants-14.2.0.tgz", + "integrity": "sha512-Mb5EfYNSPyvvw5s1JXnpZwritCgp4NmLni1imTqrSKGV3yikYhUn1ufyLMAHGnBBgv4AuMIXBIe3EpJJ+SpA0g==", "license": "MIT", + "engines": { + "node": ">=18.x", + "npm": ">=9.x" + }, + "peerDependencies": { + "@babel/runtime": "7.x" + } + }, + "node_modules/@toruslabs/eccrypto": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@toruslabs/eccrypto/-/eccrypto-5.0.4.tgz", + "integrity": "sha512-5PrSe2sn5Ed0u/2oRFtKaGOYpXJS+rJQXlYqxzy7Tbe2wLPCJh5/hZ3yStLfZmrYjHlWYwUx3AIpL/pUOOSU4w==", + "license": "CC0-1.0", "dependencies": { - "@types/http-cache-semantics": "*", - "@types/keyv": "^3.1.4", - "@types/node": "*", - "@types/responselike": "^1.0.0" + "elliptic": "^6.5.5" + }, + "engines": { + "node": ">=18.x", + "npm": ">=9.x" } }, - "node_modules/@types/connect": { - "version": "3.4.38", + "node_modules/@toruslabs/ffjavascript": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@toruslabs/ffjavascript/-/ffjavascript-4.0.0.tgz", + "integrity": "sha512-sGPKK0xZ7KDLOsVc8/rCb83iCT1xD12+yfl3eoVNppr4vMcPJcXGwqpw4r1nP3Ln10UHvTCduxjUr3axdoxOSw==", + "license": "GPL-3.0", + "engines": { + "node": ">=18.x", + "npm": ">=9.x" + } + }, + "node_modules/@toruslabs/metadata-helpers": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@toruslabs/metadata-helpers/-/metadata-helpers-6.0.0.tgz", + "integrity": "sha512-WHmCpvmZHJtkhiAi13GVeLgpfh6dTm7Z1ugCwRmtTq60rSVYO/euVJxzLRgEnWFMlyM1KFOPJXvd68dWuiYXTA==", "license": "MIT", "dependencies": { - "@types/node": "*" + "@toruslabs/eccrypto": "^5.0.0", + "@toruslabs/http-helpers": "^7.0.0", + "elliptic": "^6.5.5", + "ethereum-cryptography": "^2.2.0", + "json-stable-stringify": "^1.1.1" + }, + "engines": { + "node": ">=18.x", + "npm": ">=9.x" + }, + "peerDependencies": { + "@babel/runtime": "7.x" } }, - "node_modules/@types/connect-history-api-fallback": { - "version": "1.5.4", + "node_modules/@toruslabs/metadata-helpers/node_modules/@sentry/core": { + "version": "8.55.2", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-8.55.2.tgz", + "integrity": "sha512-YlEBwybUcOQ/KjMHDmof1vwweVnBtBxYlQp7DE3fOdtW4pqqdHWTnTntQs4VgYfxzjJYgtkd9LHlGtg8qy+JVQ==", "license": "MIT", - "dependencies": { - "@types/express-serve-static-core": "*", - "@types/node": "*" + "optional": true, + "peer": true, + "engines": { + "node": ">=14.18" } }, - "node_modules/@types/debug": { - "version": "4.1.10", - "dev": true, + "node_modules/@toruslabs/metadata-helpers/node_modules/@sentry/types": { + "version": "8.55.2", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-8.55.2.tgz", + "integrity": "sha512-6MH7sKopaAY1XAIoOirjkkhHZfH3TBuIyErtUH29jvHcdHQFQPk42vX82jBL6csGB8wbsHCWjrBh6y2KqtaknA==", "license": "MIT", + "optional": true, + "peer": true, "dependencies": { - "@types/ms": "*" + "@sentry/core": "8.55.2" + }, + "engines": { + "node": ">=14.18" } }, - "node_modules/@types/eslint": { - "version": "8.56.10", + "node_modules/@toruslabs/metadata-helpers/node_modules/@toruslabs/http-helpers": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@toruslabs/http-helpers/-/http-helpers-7.0.1.tgz", + "integrity": "sha512-9LqvgH/JfMtgZSzRqSutDfXZ5gw6+hziByYgzOzLGTO3WcqALAKCcO+icvcNI/NCw8HW4xpTM2xZIEkkEcFYPg==", "license": "MIT", "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" + "deepmerge": "^4.3.1", + "loglevel": "^1.9.2" + }, + "engines": { + "node": ">=20.x", + "npm": ">=9.x" + }, + "peerDependencies": { + "@babel/runtime": "^7.x", + "@sentry/types": "^8.x" + }, + "peerDependenciesMeta": { + "@sentry/types": { + "optional": true + } } }, - "node_modules/@types/eslint-scope": { - "version": "3.7.7", - "license": "MIT", + "node_modules/@toruslabs/openlogin": { + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/@toruslabs/openlogin/-/openlogin-8.2.1.tgz", + "integrity": "sha512-2X1s6dg8PhF/eXjKChkEHhKNO27gx7pjdUD7moMwu+YNm3+SJWJtt+bJWNbHIvWKHcCsms7nC8Pn3RZ8arOEQg==", + "license": "ISC", "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" + "@toruslabs/constants": "^13.2.0", + "@toruslabs/eccrypto": "^4.0.0", + "@toruslabs/metadata-helpers": "^5.1.0", + "@toruslabs/openlogin-session-manager": "^3.1.1", + "@toruslabs/openlogin-utils": "^8.2.1", + "@toruslabs/secure-pub-sub": "^0.2.0", + "bowser": "^2.11.0", + "events": "^3.3.0", + "loglevel": "^1.9.1", + "ts-custom-error": "^3.3.1" + }, + "engines": { + "node": ">=18.x", + "npm": ">=9.x" + }, + "peerDependencies": { + "@babel/runtime": "7.x" } }, - "node_modules/@types/estree": { - "version": "1.0.5", - "license": "MIT" + "node_modules/@toruslabs/openlogin-jrpc": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/@toruslabs/openlogin-jrpc/-/openlogin-jrpc-8.3.0.tgz", + "integrity": "sha512-1OdSkUXGXJobkkMIJHuf+XzwmUB4ROy6uQfPEJ3NXvNj84+N4hNpvC4JPg7VoWBHdfCba9cv6QnQsVArlwai4A==", + "license": "ISC", + "dependencies": { + "end-of-stream": "^1.4.4", + "events": "^3.3.0", + "fast-safe-stringify": "^2.1.1", + "once": "^1.4.0", + "pump": "^3.0.0", + "readable-stream": "^4.5.2" + }, + "engines": { + "node": ">=18.x", + "npm": ">=9.x" + }, + "peerDependencies": { + "@babel/runtime": "7.x" + } }, - "node_modules/@types/express": { - "version": "4.17.21", + "node_modules/@toruslabs/openlogin-jrpc/node_modules/readable-stream": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", + "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", "license": "MIT", "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.33", - "@types/qs": "*", - "@types/serve-static": "*" + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/@types/express-serve-static-core": { - "version": "4.19.5", + "node_modules/@toruslabs/openlogin-jrpc/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "license": "MIT", "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" + "safe-buffer": "~5.2.0" } }, - "node_modules/@types/formidable": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@types/formidable/-/formidable-1.2.8.tgz", - "integrity": "sha512-6psvrUy5VDYb+yaPJReF1WrRsz+FBwyJutK9Twz1Efa27tm07bARNIkK2B8ZPWq80dXqpKfrxTO96xrtPp+AuA==", - "dev": true, - "license": "MIT", + "node_modules/@toruslabs/openlogin-session-manager": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@toruslabs/openlogin-session-manager/-/openlogin-session-manager-3.1.1.tgz", + "integrity": "sha512-hikBX7CdiWCTNNfsiacPM9O+2Ysf6ULcn9E4og9BVSt4brduUQoa9ioNY6G5m0eH/xQCzRsLpSRGNuOPTBJm3w==", + "license": "ISC", "dependencies": { - "@types/node": "*" + "@toruslabs/base-session-manager": "^3.1.1", + "@toruslabs/eccrypto": "^4.0.0", + "@toruslabs/metadata-helpers": "5.1.0" + }, + "engines": { + "node": ">=18.x", + "npm": ">=9.x" + }, + "peerDependencies": { + "@babel/runtime": "7.x" } }, - "node_modules/@types/fs-extra": { - "version": "9.0.13", - "dev": true, + "node_modules/@toruslabs/openlogin-session-manager/node_modules/@sentry/types": { + "version": "7.120.4", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.120.4.tgz", + "integrity": "sha512-cUq2hSSe6/qrU6oZsEP4InMI5VVdD86aypE+ENrQ6eZEVLTCYm1w6XhW1NvIu3UuWh7gZec4a9J7AFpYxki88Q==", "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@toruslabs/openlogin-session-manager/node_modules/@toruslabs/eccrypto": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@toruslabs/eccrypto/-/eccrypto-4.0.0.tgz", + "integrity": "sha512-Z3EINkbsgJx1t6jCDVIJjLSUEGUtNIeDjhMWmeDGOWcP/+v/yQ1hEvd1wfxEz4q5WqIHhevacmPiVxiJ4DljGQ==", + "license": "CC0-1.0", "dependencies": { - "@types/node": "*" + "elliptic": "^6.5.4" + }, + "engines": { + "node": ">=18.x", + "npm": ">=9.x" } }, - "node_modules/@types/graceful-fs": { - "version": "4.1.9", + "node_modules/@toruslabs/openlogin-session-manager/node_modules/@toruslabs/http-helpers": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/@toruslabs/http-helpers/-/http-helpers-6.1.1.tgz", + "integrity": "sha512-bJYOaltRzklzObhRdutT1wau17vXyrCCBKJOeN46F1t99MUXi5udQNeErFOcr9qBsvrq2q67eVBkU5XOeBMX5A==", "license": "MIT", "dependencies": { - "@types/node": "*" + "lodash.merge": "^4.6.2", + "loglevel": "^1.9.1" + }, + "engines": { + "node": ">=18.x", + "npm": ">=9.x" + }, + "peerDependencies": { + "@babel/runtime": "^7.x", + "@sentry/types": "^7.x" + }, + "peerDependenciesMeta": { + "@sentry/types": { + "optional": true + } } }, - "node_modules/@types/hoist-non-react-statics": { - "version": "3.3.1", + "node_modules/@toruslabs/openlogin-session-manager/node_modules/@toruslabs/metadata-helpers": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@toruslabs/metadata-helpers/-/metadata-helpers-5.1.0.tgz", + "integrity": "sha512-7fdqKuWUaJT/ng+PlqrA4XKkn8Dij4JJozfv/4gHTi0f/6JFncpzIces09jTV70hCf0JIsTCvIDlzKOdJ+aeZg==", "license": "MIT", "dependencies": { - "@types/react": "*", - "hoist-non-react-statics": "^3.3.0" + "@toruslabs/eccrypto": "^4.0.0", + "@toruslabs/http-helpers": "^6.1.0", + "elliptic": "^6.5.5", + "ethereum-cryptography": "^2.1.3", + "json-stable-stringify": "^1.1.1" + }, + "engines": { + "node": ">=18.x", + "npm": ">=9.x" + }, + "peerDependencies": { + "@babel/runtime": "7.x" } }, - "node_modules/@types/html-minifier-terser": { - "version": "6.1.0", - "license": "MIT" - }, - "node_modules/@types/http-cache-semantics": { - "version": "4.0.4", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/http-errors": { - "version": "2.0.4", - "license": "MIT" + "node_modules/@toruslabs/openlogin-utils": { + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/@toruslabs/openlogin-utils/-/openlogin-utils-8.2.1.tgz", + "integrity": "sha512-NSOtj61NZe7w9qbd92cYwMlE/1UwPGtDH02NfUjoEEc3p1yD5U2cLZjdSwsnAgjGNgRqVomXpND4hii12lI/ew==", + "license": "ISC", + "dependencies": { + "@toruslabs/constants": "^13.2.0", + "base64url": "^3.0.1", + "color": "^4.2.3" + }, + "engines": { + "node": ">=18.x", + "npm": ">=9.x" + }, + "peerDependencies": { + "@babel/runtime": "7.x" + } }, - "node_modules/@types/http-proxy": { - "version": "1.17.14", + "node_modules/@toruslabs/openlogin-utils/node_modules/@toruslabs/constants": { + "version": "13.4.0", + "resolved": "https://registry.npmjs.org/@toruslabs/constants/-/constants-13.4.0.tgz", + "integrity": "sha512-CjmnMQ5Oj0bqSBGkhv7Xm3LciGJDHwe4AJ1LF6mijlP+QcCnUM5I6kVp60j7zZ/r0DT7nIEiuHHHczGpCZor0A==", "license": "MIT", - "dependencies": { - "@types/node": "*" + "engines": { + "node": ">=18.x", + "npm": ">=9.x" + }, + "peerDependencies": { + "@babel/runtime": "7.x" } }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.6", - "license": "MIT" + "node_modules/@toruslabs/openlogin/node_modules/@sentry/types": { + "version": "7.120.4", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.120.4.tgz", + "integrity": "sha512-cUq2hSSe6/qrU6oZsEP4InMI5VVdD86aypE+ENrQ6eZEVLTCYm1w6XhW1NvIu3UuWh7gZec4a9J7AFpYxki88Q==", + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=8" + } }, - "node_modules/@types/istanbul-lib-report": { - "version": "3.0.3", + "node_modules/@toruslabs/openlogin/node_modules/@toruslabs/constants": { + "version": "13.4.0", + "resolved": "https://registry.npmjs.org/@toruslabs/constants/-/constants-13.4.0.tgz", + "integrity": "sha512-CjmnMQ5Oj0bqSBGkhv7Xm3LciGJDHwe4AJ1LF6mijlP+QcCnUM5I6kVp60j7zZ/r0DT7nIEiuHHHczGpCZor0A==", "license": "MIT", + "engines": { + "node": ">=18.x", + "npm": ">=9.x" + }, + "peerDependencies": { + "@babel/runtime": "7.x" + } + }, + "node_modules/@toruslabs/openlogin/node_modules/@toruslabs/eccrypto": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@toruslabs/eccrypto/-/eccrypto-4.0.0.tgz", + "integrity": "sha512-Z3EINkbsgJx1t6jCDVIJjLSUEGUtNIeDjhMWmeDGOWcP/+v/yQ1hEvd1wfxEz4q5WqIHhevacmPiVxiJ4DljGQ==", + "license": "CC0-1.0", "dependencies": { - "@types/istanbul-lib-coverage": "*" + "elliptic": "^6.5.4" + }, + "engines": { + "node": ">=18.x", + "npm": ">=9.x" } }, - "node_modules/@types/istanbul-reports": { - "version": "3.0.4", + "node_modules/@toruslabs/openlogin/node_modules/@toruslabs/http-helpers": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/@toruslabs/http-helpers/-/http-helpers-6.1.1.tgz", + "integrity": "sha512-bJYOaltRzklzObhRdutT1wau17vXyrCCBKJOeN46F1t99MUXi5udQNeErFOcr9qBsvrq2q67eVBkU5XOeBMX5A==", "license": "MIT", "dependencies": { - "@types/istanbul-lib-report": "*" + "lodash.merge": "^4.6.2", + "loglevel": "^1.9.1" + }, + "engines": { + "node": ">=18.x", + "npm": ">=9.x" + }, + "peerDependencies": { + "@babel/runtime": "^7.x", + "@sentry/types": "^7.x" + }, + "peerDependenciesMeta": { + "@sentry/types": { + "optional": true + } } }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "license": "MIT" - }, - "node_modules/@types/json5": { - "version": "0.0.29", - "license": "MIT" - }, - "node_modules/@types/keyv": { - "version": "3.1.4", - "dev": true, + "node_modules/@toruslabs/openlogin/node_modules/@toruslabs/metadata-helpers": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@toruslabs/metadata-helpers/-/metadata-helpers-5.1.0.tgz", + "integrity": "sha512-7fdqKuWUaJT/ng+PlqrA4XKkn8Dij4JJozfv/4gHTi0f/6JFncpzIces09jTV70hCf0JIsTCvIDlzKOdJ+aeZg==", "license": "MIT", "dependencies": { - "@types/node": "*" + "@toruslabs/eccrypto": "^4.0.0", + "@toruslabs/http-helpers": "^6.1.0", + "elliptic": "^6.5.5", + "ethereum-cryptography": "^2.1.3", + "json-stable-stringify": "^1.1.1" + }, + "engines": { + "node": ">=18.x", + "npm": ">=9.x" + }, + "peerDependencies": { + "@babel/runtime": "7.x" } }, - "node_modules/@types/linkify-it": { - "version": "5.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/markdown-it": { - "version": "12.2.3", - "dev": true, + "node_modules/@toruslabs/openlogin/node_modules/@toruslabs/secure-pub-sub": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@toruslabs/secure-pub-sub/-/secure-pub-sub-0.2.0.tgz", + "integrity": "sha512-pkpEbeJaGHYUFj7M3lVYfzUFSX+54Vfb4M+IB+RagNpWviTp/rUQ+hy+vcFKkuuwsxZ5NDnucHzb7+XJmdLTmA==", "license": "MIT", "dependencies": { - "@types/linkify-it": "*", - "@types/mdurl": "*" + "@toruslabs/eccrypto": "^4.0.0", + "@toruslabs/http-helpers": "^6.1.0", + "@toruslabs/metadata-helpers": "^5.1.0", + "loglevel": "^1.9.1", + "socket.io-client": "^4.7.4" + }, + "engines": { + "node": ">=18.x", + "npm": ">=9.x" + }, + "peerDependencies": { + "@babel/runtime": "7.x" } }, - "node_modules/@types/mdurl": { - "version": "2.0.0", - "dev": true, - "license": "MIT" + "node_modules/@toruslabs/secure-pub-sub": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@toruslabs/secure-pub-sub/-/secure-pub-sub-1.1.0.tgz", + "integrity": "sha512-OFN0Zsa37+c9aStHd4wzau+IYPY+gve9fBPDuPSIuS06cz/bov39DvCP0LaTQUKxK4eQMZENcPu6PeyBvQYQQA==", + "license": "MIT", + "dependencies": { + "@toruslabs/constants": "^14.1.1", + "@toruslabs/eccrypto": "^5.0.0", + "@toruslabs/http-helpers": "^7.0.0", + "@toruslabs/metadata-helpers": "^6.0.0", + "loglevel": "^1.9.1", + "socket.io-client": "^4.7.5" + }, + "engines": { + "node": ">=18.x", + "npm": ">=9.x" + }, + "peerDependencies": { + "@babel/runtime": "7.x" + } }, - "node_modules/@types/mime": { - "version": "1.3.5", - "license": "MIT" + "node_modules/@toruslabs/secure-pub-sub/node_modules/@sentry/core": { + "version": "8.55.2", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-8.55.2.tgz", + "integrity": "sha512-YlEBwybUcOQ/KjMHDmof1vwweVnBtBxYlQp7DE3fOdtW4pqqdHWTnTntQs4VgYfxzjJYgtkd9LHlGtg8qy+JVQ==", + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=14.18" + } }, - "node_modules/@types/ms": { - "version": "0.7.33", - "dev": true, - "license": "MIT" + "node_modules/@toruslabs/secure-pub-sub/node_modules/@sentry/types": { + "version": "8.55.2", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-8.55.2.tgz", + "integrity": "sha512-6MH7sKopaAY1XAIoOirjkkhHZfH3TBuIyErtUH29jvHcdHQFQPk42vX82jBL6csGB8wbsHCWjrBh6y2KqtaknA==", + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@sentry/core": "8.55.2" + }, + "engines": { + "node": ">=14.18" + } }, - "node_modules/@types/node": { - "version": "17.0.39", - "license": "MIT" + "node_modules/@toruslabs/secure-pub-sub/node_modules/@toruslabs/http-helpers": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@toruslabs/http-helpers/-/http-helpers-7.0.1.tgz", + "integrity": "sha512-9LqvgH/JfMtgZSzRqSutDfXZ5gw6+hziByYgzOzLGTO3WcqALAKCcO+icvcNI/NCw8HW4xpTM2xZIEkkEcFYPg==", + "license": "MIT", + "dependencies": { + "deepmerge": "^4.3.1", + "loglevel": "^1.9.2" + }, + "engines": { + "node": ">=20.x", + "npm": ">=9.x" + }, + "peerDependencies": { + "@babel/runtime": "^7.x", + "@sentry/types": "^8.x" + }, + "peerDependenciesMeta": { + "@sentry/types": { + "optional": true + } + } }, - "node_modules/@types/node-forge": { - "version": "1.3.11", + "node_modules/@toruslabs/session-manager": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@toruslabs/session-manager/-/session-manager-3.2.0.tgz", + "integrity": "sha512-t+EGFZhn8pxZ5Gjhxr99qNmK20zZD/RYEMRROBuwsETyy/QU17H6dKhqIb306GjmwUPkz2VKKTtJcOg9Ifijuw==", "license": "MIT", "dependencies": { - "@types/node": "*" + "@toruslabs/constants": "^14.1.1", + "@toruslabs/eccrypto": "^5.0.4", + "@toruslabs/http-helpers": "^7.0.0", + "@toruslabs/metadata-helpers": "^6.0.0" + }, + "engines": { + "node": ">=18.x", + "npm": ">=9.x" + }, + "optionalDependencies": { + "@rollup/rollup-linux-x64-gnu": "^4.24.4" } }, - "node_modules/@types/parse-json": { - "version": "4.0.0", - "license": "MIT" + "node_modules/@toruslabs/session-manager/node_modules/@sentry/core": { + "version": "8.55.2", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-8.55.2.tgz", + "integrity": "sha512-YlEBwybUcOQ/KjMHDmof1vwweVnBtBxYlQp7DE3fOdtW4pqqdHWTnTntQs4VgYfxzjJYgtkd9LHlGtg8qy+JVQ==", + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=14.18" + } }, - "node_modules/@types/plist": { - "version": "3.0.4", - "dev": true, + "node_modules/@toruslabs/session-manager/node_modules/@sentry/types": { + "version": "8.55.2", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-8.55.2.tgz", + "integrity": "sha512-6MH7sKopaAY1XAIoOirjkkhHZfH3TBuIyErtUH29jvHcdHQFQPk42vX82jBL6csGB8wbsHCWjrBh6y2KqtaknA==", "license": "MIT", "optional": true, + "peer": true, "dependencies": { - "@types/node": "*", - "xmlbuilder": ">=11.0.1" + "@sentry/core": "8.55.2" + }, + "engines": { + "node": ">=14.18" } }, - "node_modules/@types/prettier": { - "version": "2.7.3", - "license": "MIT" + "node_modules/@toruslabs/session-manager/node_modules/@toruslabs/http-helpers": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@toruslabs/http-helpers/-/http-helpers-7.0.1.tgz", + "integrity": "sha512-9LqvgH/JfMtgZSzRqSutDfXZ5gw6+hziByYgzOzLGTO3WcqALAKCcO+icvcNI/NCw8HW4xpTM2xZIEkkEcFYPg==", + "license": "MIT", + "dependencies": { + "deepmerge": "^4.3.1", + "loglevel": "^1.9.2" + }, + "engines": { + "node": ">=20.x", + "npm": ">=9.x" + }, + "peerDependencies": { + "@babel/runtime": "^7.x", + "@sentry/types": "^8.x" + }, + "peerDependenciesMeta": { + "@sentry/types": { + "optional": true + } + } }, - "node_modules/@types/prop-types": { - "version": "15.7.5", - "license": "MIT" + "node_modules/@toruslabs/starkware-crypto": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@toruslabs/starkware-crypto/-/starkware-crypto-4.0.1.tgz", + "integrity": "sha512-AhnXUscFN2+oLeQuOEbi8vvrQnxUKnE0USWpg7eFHmqUBV8kg6+PAFiWsvJ01+GMQPTMKhKZHyMysxW5AFHc6Q==", + "license": "MIT", + "dependencies": { + "assert": "^2.1.0", + "bip39": "^3.1.0", + "bn.js": "^5.2.1", + "elliptic": "^6.6.1", + "enc-utils": "^3.0.0", + "ethereum-cryptography": "^2.2.1", + "hash.js": "^1.1.7" + }, + "engines": { + "node": ">=18.x", + "npm": ">=9.x" + }, + "peerDependencies": { + "@babel/runtime": "7.x" + } }, - "node_modules/@types/q": { - "version": "1.5.8", + "node_modules/@toruslabs/starkware-crypto/node_modules/bn.js": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.3.tgz", + "integrity": "sha512-EAcmnPkxpntVL+DS7bO1zhcZNvCkxqtkd0ZY53h06GNQ3DEkkGZ/gKgmDv6DdZQGj9BgfSPKtJJ7Dp1GPP8f7w==", "license": "MIT" }, - "node_modules/@types/qs": { - "version": "6.9.15", - "license": "MIT" + "node_modules/@toruslabs/tweetnacl-js": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@toruslabs/tweetnacl-js/-/tweetnacl-js-1.0.4.tgz", + "integrity": "sha512-h8fVemW5pstsKbm/fTx+y61dZkh5Pepy/92lsyKp83KErf96jT+w4LGx4nEgeAVrdYQDTLg2tO7vu/boEb23Iw==", + "license": "Unlicense" }, - "node_modules/@types/range-parser": { - "version": "1.2.7", + "node_modules/@trysound/sax": { + "version": "0.2.0", + "license": "ISC", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/@types/aria-query": { + "version": "5.0.4", + "dev": true, "license": "MIT" }, - "node_modules/@types/react": { - "version": "18.3.18", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.18.tgz", - "integrity": "sha512-t4yC+vtgnkYjNSKlFx1jkAhH8LgTo2N/7Qvi83kdEaUtMDiwpbLAktKDaAMlRcJ5eSxZkH74eEGt1ky31d7kfQ==", + "node_modules/@types/babel__core": { + "version": "7.20.5", "license": "MIT", "dependencies": { - "@types/prop-types": "*", - "csstype": "^3.0.2" + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" } }, - "node_modules/@types/react-dom": { - "version": "18.2.17", - "dev": true, + "node_modules/@types/babel__generator": { + "version": "7.6.8", "license": "MIT", "dependencies": { - "@types/react": "*" + "@babel/types": "^7.0.0" } }, - "node_modules/@types/react-redux": { - "version": "7.1.24", + "node_modules/@types/babel__template": { + "version": "7.4.4", "license": "MIT", "dependencies": { - "@types/hoist-non-react-statics": "^3.3.0", - "@types/react": "*", - "hoist-non-react-statics": "^3.3.0", - "redux": "^4.0.0" + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" } }, - "node_modules/@types/resolve": { - "version": "1.17.1", + "node_modules/@types/babel__traverse": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.7.tgz", + "integrity": "sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==", "license": "MIT", "dependencies": { - "@types/node": "*" + "@babel/types": "^7.20.7" } }, - "node_modules/@types/responselike": { - "version": "1.0.3", - "dev": true, + "node_modules/@types/body-parser": { + "version": "1.19.5", "license": "MIT", "dependencies": { + "@types/connect": "*", "@types/node": "*" } }, - "node_modules/@types/retry": { - "version": "0.12.0", - "license": "MIT" - }, - "node_modules/@types/semver": { - "version": "7.5.8", - "license": "MIT" - }, - "node_modules/@types/send": { - "version": "0.17.4", + "node_modules/@types/bonjour": { + "version": "3.5.13", "license": "MIT", "dependencies": { - "@types/mime": "^1", "@types/node": "*" } }, - "node_modules/@types/serve-index": { - "version": "1.9.4", + "node_modules/@types/cacheable-request": { + "version": "6.0.3", + "dev": true, "license": "MIT", "dependencies": { - "@types/express": "*" + "@types/http-cache-semantics": "*", + "@types/keyv": "^3.1.4", + "@types/node": "*", + "@types/responselike": "^1.0.0" } }, - "node_modules/@types/serve-static": { - "version": "1.15.7", + "node_modules/@types/connect": { + "version": "3.4.38", "license": "MIT", "dependencies": { - "@types/http-errors": "*", - "@types/node": "*", - "@types/send": "*" + "@types/node": "*" } }, - "node_modules/@types/sinonjs__fake-timers": { - "version": "8.1.1", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/sizzle": { - "version": "2.3.9", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/sockjs": { - "version": "0.3.36", + "node_modules/@types/connect-history-api-fallback": { + "version": "1.5.4", "license": "MIT", "dependencies": { + "@types/express-serve-static-core": "*", "@types/node": "*" } }, - "node_modules/@types/stack-utils": { - "version": "2.0.3", - "license": "MIT" - }, - "node_modules/@types/trusted-types": { - "version": "2.0.7", - "license": "MIT" - }, - "node_modules/@types/verror": { - "version": "1.10.8", + "node_modules/@types/debug": { + "version": "4.1.10", "dev": true, "license": "MIT", - "optional": true - }, - "node_modules/@types/w3c-web-usb": { - "version": "1.0.10", - "license": "MIT" + "dependencies": { + "@types/ms": "*" + } }, - "node_modules/@types/ws": { - "version": "8.5.10", + "node_modules/@types/eslint": { + "version": "8.56.10", "license": "MIT", "dependencies": { - "@types/node": "*" + "@types/estree": "*", + "@types/json-schema": "*" } }, - "node_modules/@types/yargs": { - "version": "16.0.9", + "node_modules/@types/eslint-scope": { + "version": "3.7.7", "license": "MIT", "dependencies": { - "@types/yargs-parser": "*" + "@types/eslint": "*", + "@types/estree": "*" } }, - "node_modules/@types/yargs-parser": { - "version": "21.0.3", + "node_modules/@types/estree": { + "version": "1.0.5", "license": "MIT" }, - "node_modules/@types/yauzl": { - "version": "2.10.0", - "dev": true, + "node_modules/@types/express": { + "version": "4.17.21", "license": "MIT", - "optional": true, "dependencies": { - "@types/node": "*" + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" } }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.62.0", + "node_modules/@types/express-serve-static-core": { + "version": "4.19.5", "license": "MIT", "dependencies": { - "@eslint-community/regexpp": "^4.4.0", + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/formidable": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@types/formidable/-/formidable-1.2.8.tgz", + "integrity": "sha512-6psvrUy5VDYb+yaPJReF1WrRsz+FBwyJutK9Twz1Efa27tm07bARNIkK2B8ZPWq80dXqpKfrxTO96xrtPp+AuA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/fs-extra": { + "version": "9.0.13", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.9", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/hoist-non-react-statics": { + "version": "3.3.1", + "license": "MIT", + "dependencies": { + "@types/react": "*", + "hoist-non-react-statics": "^3.3.0" + } + }, + "node_modules/@types/html-minifier-terser": { + "version": "6.1.0", + "license": "MIT" + }, + "node_modules/@types/http-cache-semantics": { + "version": "4.0.4", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/http-errors": { + "version": "2.0.4", + "license": "MIT" + }, + "node_modules/@types/http-proxy": { + "version": "1.17.14", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "license": "MIT" + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "license": "MIT" + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "license": "MIT" + }, + "node_modules/@types/keyv": { + "version": "3.1.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/linkify-it": { + "version": "5.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/markdown-it": { + "version": "12.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/linkify-it": "*", + "@types/mdurl": "*" + } + }, + "node_modules/@types/mdurl": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/mime": { + "version": "1.3.5", + "license": "MIT" + }, + "node_modules/@types/ms": { + "version": "0.7.33", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "17.0.39", + "license": "MIT" + }, + "node_modules/@types/node-forge": { + "version": "1.3.11", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/parse-json": { + "version": "4.0.0", + "license": "MIT" + }, + "node_modules/@types/plist": { + "version": "3.0.4", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@types/node": "*", + "xmlbuilder": ">=11.0.1" + } + }, + "node_modules/@types/prettier": { + "version": "2.7.3", + "license": "MIT" + }, + "node_modules/@types/prop-types": { + "version": "15.7.5", + "license": "MIT" + }, + "node_modules/@types/q": { + "version": "1.5.8", + "license": "MIT" + }, + "node_modules/@types/qs": { + "version": "6.9.15", + "license": "MIT" + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "18.3.18", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.18.tgz", + "integrity": "sha512-t4yC+vtgnkYjNSKlFx1jkAhH8LgTo2N/7Qvi83kdEaUtMDiwpbLAktKDaAMlRcJ5eSxZkH74eEGt1ky31d7kfQ==", + "license": "MIT", + "dependencies": { + "@types/prop-types": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.2.17", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/react-redux": { + "version": "7.1.24", + "license": "MIT", + "dependencies": { + "@types/hoist-non-react-statics": "^3.3.0", + "@types/react": "*", + "hoist-non-react-statics": "^3.3.0", + "redux": "^4.0.0" + } + }, + "node_modules/@types/resolve": { + "version": "1.17.1", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/responselike": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/retry": { + "version": "0.12.0", + "license": "MIT" + }, + "node_modules/@types/semver": { + "version": "7.5.8", + "license": "MIT" + }, + "node_modules/@types/send": { + "version": "0.17.4", + "license": "MIT", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/serve-index": { + "version": "1.9.4", + "license": "MIT", + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.7", + "license": "MIT", + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*", + "@types/send": "*" + } + }, + "node_modules/@types/sinonjs__fake-timers": { + "version": "8.1.1", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/sizzle": { + "version": "2.3.9", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/sockjs": { + "version": "0.3.36", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/stack-utils": { + "version": "2.0.3", + "license": "MIT" + }, + "node_modules/@types/trusted-types": { + "version": "2.0.7", + "license": "MIT" + }, + "node_modules/@types/verror": { + "version": "1.10.8", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/@types/w3c-web-usb": { + "version": "1.0.10", + "license": "MIT" + }, + "node_modules/@types/ws": { + "version": "8.5.10", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/yargs": { + "version": "16.0.9", + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "license": "MIT" + }, + "node_modules/@types/yauzl": { + "version": "2.10.0", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "5.62.0", + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.4.0", "@typescript-eslint/scope-manager": "5.62.0", "@typescript-eslint/type-utils": "5.62.0", "@typescript-eslint/utils": "5.62.0", @@ -6375,387 +7239,974 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "5.62.0", + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "5.62.0", + "license": "MIT", + "dependencies": { + "@typescript-eslint/typescript-estree": "5.62.0", + "@typescript-eslint/utils": "5.62.0", + "debug": "^4.3.4", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "5.62.0", + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "5.62.0", + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "5.62.0", + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "eslint-scope": "^5.1.1", + "semver": "^7.3.7" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "5.62.0", + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "license": "ISC" + }, + "node_modules/@walletconnect/core": { + "version": "2.17.3", + "resolved": "https://registry.npmjs.org/@walletconnect/core/-/core-2.17.3.tgz", + "integrity": "sha512-57uv0FW4L6H/tmkb1kS2nG41MDguyDgZbGR58nkDUd1TO/HydyiTByVOhFzIxgN331cnY/1G1rMaKqncgdnOFA==", + "license": "Apache-2.0", + "dependencies": { + "@walletconnect/heartbeat": "1.2.2", + "@walletconnect/jsonrpc-provider": "1.0.14", + "@walletconnect/jsonrpc-types": "1.0.4", + "@walletconnect/jsonrpc-utils": "1.0.8", + "@walletconnect/jsonrpc-ws-connection": "1.0.16", + "@walletconnect/keyvaluestorage": "1.1.1", + "@walletconnect/logger": "2.1.2", + "@walletconnect/relay-api": "1.0.11", + "@walletconnect/relay-auth": "1.0.4", + "@walletconnect/safe-json": "1.0.2", + "@walletconnect/time": "1.0.2", + "@walletconnect/types": "2.17.3", + "@walletconnect/utils": "2.17.3", + "@walletconnect/window-getters": "1.0.1", + "events": "3.3.0", + "lodash.isequal": "4.5.0", + "uint8arrays": "3.1.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@walletconnect/core/node_modules/uint8arrays": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-3.1.0.tgz", + "integrity": "sha512-ei5rfKtoRO8OyOIor2Rz5fhzjThwIHJZ3uyDPnDHTXbP0aMQ1RN/6AI5B5d9dBxJOU+BvOAk7ZQ1xphsX8Lrog==", + "license": "MIT", + "dependencies": { + "multiformats": "^9.4.2" + } + }, + "node_modules/@walletconnect/environment": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@walletconnect/environment/-/environment-1.0.1.tgz", + "integrity": "sha512-T426LLZtHj8e8rYnKfzsw1aG6+M0BT1ZxayMdv/p8yM0MU+eJDISqNY3/bccxRr4LrF9csq02Rhqt08Ibl0VRg==", + "dependencies": { + "tslib": "1.14.1" + } + }, + "node_modules/@walletconnect/events": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@walletconnect/events/-/events-1.0.1.tgz", + "integrity": "sha512-NPTqaoi0oPBVNuLv7qPaJazmGHs5JGyO8eEAk5VGKmJzDR7AHzD4k6ilox5kxk1iwiOnFopBOOMLs86Oa76HpQ==", + "dependencies": { + "keyvaluestorage-interface": "^1.0.0", + "tslib": "1.14.1" + } + }, + "node_modules/@walletconnect/heartbeat": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@walletconnect/heartbeat/-/heartbeat-1.2.2.tgz", + "integrity": "sha512-uASiRmC5MwhuRuf05vq4AT48Pq8RMi876zV8rr8cV969uTOzWdB/k+Lj5yI2PBtB1bGQisGen7MM1GcZlQTBXw==", + "license": "MIT", + "dependencies": { + "@walletconnect/events": "^1.0.1", + "@walletconnect/time": "^1.0.2", + "events": "^3.3.0" + } + }, + "node_modules/@walletconnect/jsonrpc-provider": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/@walletconnect/jsonrpc-provider/-/jsonrpc-provider-1.0.14.tgz", + "integrity": "sha512-rtsNY1XqHvWj0EtITNeuf8PHMvlCLiS3EjQL+WOkxEOA4KPxsohFnBDeyPYiNm4ZvkQdLnece36opYidmtbmow==", + "license": "MIT", + "dependencies": { + "@walletconnect/jsonrpc-utils": "^1.0.8", + "@walletconnect/safe-json": "^1.0.2", + "events": "^3.3.0" + } + }, + "node_modules/@walletconnect/jsonrpc-types": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@walletconnect/jsonrpc-types/-/jsonrpc-types-1.0.4.tgz", + "integrity": "sha512-P6679fG/M+wuWg9TY8mh6xFSdYnFyFjwFelxyISxMDrlbXokorEVXYOxiqEbrU3x1BmBoCAJJ+vtEaEoMlpCBQ==", + "license": "MIT", + "dependencies": { + "events": "^3.3.0", + "keyvaluestorage-interface": "^1.0.0" + } + }, + "node_modules/@walletconnect/jsonrpc-utils": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@walletconnect/jsonrpc-utils/-/jsonrpc-utils-1.0.8.tgz", + "integrity": "sha512-vdeb03bD8VzJUL6ZtzRYsFMq1eZQcM3EAzT0a3st59dyLfJ0wq+tKMpmGH7HlB7waD858UWgfIcudbPFsbzVdw==", + "dependencies": { + "@walletconnect/environment": "^1.0.1", + "@walletconnect/jsonrpc-types": "^1.0.3", + "tslib": "1.14.1" + } + }, + "node_modules/@walletconnect/jsonrpc-ws-connection": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/@walletconnect/jsonrpc-ws-connection/-/jsonrpc-ws-connection-1.0.16.tgz", + "integrity": "sha512-G81JmsMqh5nJheE1mPst1W0WfVv0SG3N7JggwLLGnI7iuDZJq8cRJvQwLGKHn5H1WTW7DEPCo00zz5w62AbL3Q==", + "license": "MIT", + "dependencies": { + "@walletconnect/jsonrpc-utils": "^1.0.6", + "@walletconnect/safe-json": "^1.0.2", + "events": "^3.3.0", + "ws": "^7.5.1" + } + }, + "node_modules/@walletconnect/keyvaluestorage": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@walletconnect/keyvaluestorage/-/keyvaluestorage-1.1.1.tgz", + "integrity": "sha512-V7ZQq2+mSxAq7MrRqDxanTzu2RcElfK1PfNYiaVnJgJ7Q7G7hTVwF8voIBx92qsRyGHZihrwNPHuZd1aKkd0rA==", + "dependencies": { + "@walletconnect/safe-json": "^1.0.1", + "idb-keyval": "^6.2.1", + "unstorage": "^1.9.0" + }, + "peerDependencies": { + "@react-native-async-storage/async-storage": "1.x" }, "peerDependenciesMeta": { - "typescript": { + "@react-native-async-storage/async-storage": { "optional": true } } }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "5.62.0", - "license": "MIT", + "node_modules/@walletconnect/logger": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@walletconnect/logger/-/logger-2.1.2.tgz", + "integrity": "sha512-aAb28I3S6pYXZHQm5ESB+V6rDqIYfsnHaQyzFbwUUBFY4H0OXx/YtTl8lvhUNhMMfb9UxbwEBS253TlXUYJWSw==", "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "@walletconnect/safe-json": "^1.0.2", + "pino": "7.11.0" } }, - "node_modules/@typescript-eslint/type-utils": { - "version": "5.62.0", - "license": "MIT", + "node_modules/@walletconnect/relay-api": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@walletconnect/relay-api/-/relay-api-1.0.11.tgz", + "integrity": "sha512-tLPErkze/HmC9aCmdZOhtVmYZq1wKfWTJtygQHoWtgg722Jd4homo54Cs4ak2RUFUZIGO2RsOpIcWipaua5D5Q==", "dependencies": { - "@typescript-eslint/typescript-estree": "5.62.0", - "@typescript-eslint/utils": "5.62.0", - "debug": "^4.3.4", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "*" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "@walletconnect/jsonrpc-types": "^1.0.2" } }, - "node_modules/@typescript-eslint/types": { - "version": "5.62.0", - "license": "MIT", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node_modules/@walletconnect/relay-auth": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@walletconnect/relay-auth/-/relay-auth-1.0.4.tgz", + "integrity": "sha512-kKJcS6+WxYq5kshpPaxGHdwf5y98ZwbfuS4EE/NkQzqrDFm5Cj+dP8LofzWvjrrLkZq7Afy7WrQMXdLy8Sx7HQ==", + "dependencies": { + "@stablelib/ed25519": "^1.0.2", + "@stablelib/random": "^1.0.1", + "@walletconnect/safe-json": "^1.0.1", + "@walletconnect/time": "^1.0.2", + "tslib": "1.14.1", + "uint8arrays": "^3.0.0" } }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.62.0", - "license": "BSD-2-Clause", + "node_modules/@walletconnect/safe-json": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@walletconnect/safe-json/-/safe-json-1.0.2.tgz", + "integrity": "sha512-Ogb7I27kZ3LPC3ibn8ldyUr5544t3/STow9+lzz7Sfo808YD7SBWk7SAsdBFlYgP2zDRy2hS3sKRcuSRM0OTmA==", "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "tslib": "1.14.1" } }, - "node_modules/@typescript-eslint/utils": { - "version": "5.62.0", - "license": "MIT", + "node_modules/@walletconnect/sign-client": { + "version": "2.17.3", + "resolved": "https://registry.npmjs.org/@walletconnect/sign-client/-/sign-client-2.17.3.tgz", + "integrity": "sha512-OzOWxRTfVGCHU3OOF6ibPkgPfDpivFJjuknfcOUt9PYWpTAv6YKOmT4cyfBPhc7llruyHpV44fYbykMcLIvEcg==", "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@types/json-schema": "^7.0.9", - "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/typescript-estree": "5.62.0", - "eslint-scope": "^5.1.1", - "semver": "^7.3.7" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "@walletconnect/core": "2.17.3", + "@walletconnect/events": "1.0.1", + "@walletconnect/heartbeat": "1.2.2", + "@walletconnect/jsonrpc-utils": "1.0.8", + "@walletconnect/logger": "2.1.2", + "@walletconnect/time": "1.0.2", + "@walletconnect/types": "2.17.3", + "@walletconnect/utils": "2.17.3", + "events": "3.3.0" } }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.62.0", - "license": "MIT", + "node_modules/@walletconnect/time": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@walletconnect/time/-/time-1.0.2.tgz", + "integrity": "sha512-uzdd9woDcJ1AaBZRhqy5rNC9laqWGErfc4dxA9a87mPdKOgWMD85mcFo9dIYIts/Jwocfwn07EC6EzclKubk/g==", "dependencies": { - "@typescript-eslint/types": "5.62.0", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "tslib": "1.14.1" } }, - "node_modules/@ungap/structured-clone": { - "version": "1.2.0", - "license": "ISC" - }, - "node_modules/@walletconnect/core": { + "node_modules/@walletconnect/types": { "version": "2.17.3", - "resolved": "https://registry.npmjs.org/@walletconnect/core/-/core-2.17.3.tgz", - "integrity": "sha512-57uv0FW4L6H/tmkb1kS2nG41MDguyDgZbGR58nkDUd1TO/HydyiTByVOhFzIxgN331cnY/1G1rMaKqncgdnOFA==", + "resolved": "https://registry.npmjs.org/@walletconnect/types/-/types-2.17.3.tgz", + "integrity": "sha512-5eFxnbZGJJx0IQyCS99qz+OvozpLJJYfVG96dEHGgbzZMd+C9V1eitYqVClx26uX6V+WQVqVwjpD2Dyzie++Wg==", "license": "Apache-2.0", "dependencies": { + "@walletconnect/events": "1.0.1", "@walletconnect/heartbeat": "1.2.2", - "@walletconnect/jsonrpc-provider": "1.0.14", "@walletconnect/jsonrpc-types": "1.0.4", - "@walletconnect/jsonrpc-utils": "1.0.8", - "@walletconnect/jsonrpc-ws-connection": "1.0.16", "@walletconnect/keyvaluestorage": "1.1.1", "@walletconnect/logger": "2.1.2", + "events": "3.3.0" + } + }, + "node_modules/@walletconnect/utils": { + "version": "2.17.3", + "resolved": "https://registry.npmjs.org/@walletconnect/utils/-/utils-2.17.3.tgz", + "integrity": "sha512-tG77UpZNeLYgeOwViwWnifpyBatkPlpKSSayhN0gcjY1lZAUNqtYslpm4AdTxlrA3pL61MnyybXgWYT5eZjarw==", + "license": "Apache-2.0", + "dependencies": { + "@ethersproject/hash": "5.7.0", + "@ethersproject/transactions": "5.7.0", + "@stablelib/chacha20poly1305": "1.0.1", + "@stablelib/hkdf": "1.0.1", + "@stablelib/random": "1.0.2", + "@stablelib/sha256": "1.0.1", + "@stablelib/x25519": "1.0.3", + "@walletconnect/jsonrpc-utils": "1.0.8", + "@walletconnect/keyvaluestorage": "1.1.1", "@walletconnect/relay-api": "1.0.11", "@walletconnect/relay-auth": "1.0.4", "@walletconnect/safe-json": "1.0.2", "@walletconnect/time": "1.0.2", "@walletconnect/types": "2.17.3", - "@walletconnect/utils": "2.17.3", "@walletconnect/window-getters": "1.0.1", - "events": "3.3.0", - "lodash.isequal": "4.5.0", + "@walletconnect/window-metadata": "1.0.1", + "detect-browser": "5.3.0", + "elliptic": "6.6.1", + "query-string": "7.1.3", "uint8arrays": "3.1.0" + } + }, + "node_modules/@walletconnect/utils/node_modules/uint8arrays": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-3.1.0.tgz", + "integrity": "sha512-ei5rfKtoRO8OyOIor2Rz5fhzjThwIHJZ3uyDPnDHTXbP0aMQ1RN/6AI5B5d9dBxJOU+BvOAk7ZQ1xphsX8Lrog==", + "license": "MIT", + "dependencies": { + "multiformats": "^9.4.2" + } + }, + "node_modules/@walletconnect/window-getters": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@walletconnect/window-getters/-/window-getters-1.0.1.tgz", + "integrity": "sha512-vHp+HqzGxORPAN8gY03qnbTMnhqIwjeRJNOMOAzePRg4xVEEE2WvYsI9G2NMjOknA8hnuYbU3/hwLcKbjhc8+Q==", + "dependencies": { + "tslib": "1.14.1" + } + }, + "node_modules/@walletconnect/window-metadata": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@walletconnect/window-metadata/-/window-metadata-1.0.1.tgz", + "integrity": "sha512-9koTqyGrM2cqFRW517BPY/iEtUDx2r1+Pwwu5m7sJ7ka79wi3EyqhqcICk/yDmv6jAS1rjKgTKXlEhanYjijcA==", + "dependencies": { + "@walletconnect/window-getters": "^1.0.1", + "tslib": "1.14.1" + } + }, + "node_modules/@web3auth/auth": { + "version": "9.6.4", + "resolved": "https://registry.npmjs.org/@web3auth/auth/-/auth-9.6.4.tgz", + "integrity": "sha512-Y1Swyg8mWCuSt93AY3AZIAwCC/WoaxTD6dYOW/A8j6srUOqiHtM2Dr/EvnhPoqOF1QYlA+0nzrwA/Vr/HYD0aw==", + "license": "MIT", + "dependencies": { + "@ethereumjs/util": "^9.1.0", + "@toruslabs/constants": "^14.2.0", + "@toruslabs/ffjavascript": "^4.0.0", + "@toruslabs/metadata-helpers": "^6.0.0", + "@toruslabs/secure-pub-sub": "^1.1.0", + "@toruslabs/session-manager": "^3.2.0", + "@toruslabs/starkware-crypto": "^4.0.1", + "@toruslabs/tweetnacl-js": "^1.0.4", + "base64url": "^3.0.1", + "bip39": "^3.1.0", + "bn.js": "^5.2.1", + "bowser": "^2.11.0", + "color": "^4.2.3", + "enc-utils": "^3.0.0", + "end-of-stream": "^1.4.4", + "events": "^3.3.0", + "fast-safe-stringify": "^2.1.1", + "json-stable-stringify": "^1.1.1", + "loglevel": "^1.9.2", + "once": "^1.4.0", + "pump": "^3.0.2", + "readable-stream": "^4.5.2", + "ts-custom-error": "^3.3.1", + "typed-emitter": "^2.1.0" + }, + "engines": { + "node": ">=18.x", + "npm": ">=9.x" + }, + "optionalDependencies": { + "@nx/nx-linux-x64-gnu": "^20.2.2", + "@rollup/rollup-linux-x64-gnu": "^4.28.1" + }, + "peerDependencies": { + "@babel/runtime": "7.x" + } + }, + "node_modules/@web3auth/auth-adapter": { + "version": "9.7.0", + "resolved": "https://registry.npmjs.org/@web3auth/auth-adapter/-/auth-adapter-9.7.0.tgz", + "integrity": "sha512-pjjaTZcn593avmpBvF4sKWEaxpr/eTQjuGqq6/o0RKi67IfD5HTsSREqgiBU1eM+ytPaKglKdPbKwXRgy7oHyQ==", + "license": "ISC", + "dependencies": { + "@web3auth/auth": "^9.6.4", + "@web3auth/base": "^9.7.0", + "@web3auth/base-provider": "^9.7.0", + "deepmerge": "^4.3.1" + }, + "engines": { + "node": ">=18.x", + "npm": ">=9.x" + }, + "peerDependencies": { + "@babel/runtime": "^7.x" + } + }, + "node_modules/@web3auth/auth/node_modules/bn.js": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.3.tgz", + "integrity": "sha512-EAcmnPkxpntVL+DS7bO1zhcZNvCkxqtkd0ZY53h06GNQ3DEkkGZ/gKgmDv6DdZQGj9BgfSPKtJJ7Dp1GPP8f7w==", + "license": "MIT" + }, + "node_modules/@web3auth/auth/node_modules/readable-stream": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", + "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", + "license": "MIT", + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@web3auth/auth/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/@web3auth/base": { + "version": "9.7.0", + "resolved": "https://registry.npmjs.org/@web3auth/base/-/base-9.7.0.tgz", + "integrity": "sha512-lfKnszNhNQNP2Kwd363Hj28d5MxA7pa6zjS1sDR1XLkC0rrzd8psfNQu056y8Q7ZP9FGRGdhPyz5PVE89xtL4w==", + "license": "ISC", + "dependencies": { + "@toruslabs/base-controllers": "^7.2.1", + "@toruslabs/constants": "^14.2.0", + "@toruslabs/http-helpers": "^7.0.0", + "@web3auth/auth": "^9.6.4", + "jwt-decode": "^4.0.0", + "loglevel": "^1.9.2", + "ts-custom-error": "^3.3.1" }, "engines": { - "node": ">=18" + "node": ">=18.x", + "npm": ">=9.x" + }, + "peerDependencies": { + "@babel/runtime": "^7.x" } }, - "node_modules/@walletconnect/core/node_modules/uint8arrays": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-3.1.0.tgz", - "integrity": "sha512-ei5rfKtoRO8OyOIor2Rz5fhzjThwIHJZ3uyDPnDHTXbP0aMQ1RN/6AI5B5d9dBxJOU+BvOAk7ZQ1xphsX8Lrog==", - "license": "MIT", + "node_modules/@web3auth/base-provider": { + "version": "9.7.0", + "resolved": "https://registry.npmjs.org/@web3auth/base-provider/-/base-provider-9.7.0.tgz", + "integrity": "sha512-UqtdbtEU8zf4NJhQjfB0fdCsNu/ZdDZ8ntT7vDKciDNTg/+53z4CmWbI9q6NChZMDwg89tWngoqPF1Q0XsIlzw==", + "license": "ISC", "dependencies": { - "multiformats": "^9.4.2" + "@toruslabs/base-controllers": "^7.2.1", + "@web3auth/auth": "^9.6.4", + "@web3auth/base": "^9.7.0", + "json-rpc-random-id": "^1.0.1" + }, + "engines": { + "node": ">=18.x", + "npm": ">=9.x" + }, + "peerDependencies": { + "@babel/runtime": "7.x" } }, - "node_modules/@walletconnect/environment": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@walletconnect/environment/-/environment-1.0.1.tgz", - "integrity": "sha512-T426LLZtHj8e8rYnKfzsw1aG6+M0BT1ZxayMdv/p8yM0MU+eJDISqNY3/bccxRr4LrF9csq02Rhqt08Ibl0VRg==", - "dependencies": { - "tslib": "1.14.1" + "node_modules/@web3auth/base/node_modules/@sentry/core": { + "version": "8.55.2", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-8.55.2.tgz", + "integrity": "sha512-YlEBwybUcOQ/KjMHDmof1vwweVnBtBxYlQp7DE3fOdtW4pqqdHWTnTntQs4VgYfxzjJYgtkd9LHlGtg8qy+JVQ==", + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=14.18" } }, - "node_modules/@walletconnect/events": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@walletconnect/events/-/events-1.0.1.tgz", - "integrity": "sha512-NPTqaoi0oPBVNuLv7qPaJazmGHs5JGyO8eEAk5VGKmJzDR7AHzD4k6ilox5kxk1iwiOnFopBOOMLs86Oa76HpQ==", + "node_modules/@web3auth/base/node_modules/@sentry/types": { + "version": "8.55.2", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-8.55.2.tgz", + "integrity": "sha512-6MH7sKopaAY1XAIoOirjkkhHZfH3TBuIyErtUH29jvHcdHQFQPk42vX82jBL6csGB8wbsHCWjrBh6y2KqtaknA==", + "license": "MIT", + "optional": true, + "peer": true, "dependencies": { - "keyvaluestorage-interface": "^1.0.0", - "tslib": "1.14.1" + "@sentry/core": "8.55.2" + }, + "engines": { + "node": ">=14.18" } }, - "node_modules/@walletconnect/heartbeat": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@walletconnect/heartbeat/-/heartbeat-1.2.2.tgz", - "integrity": "sha512-uASiRmC5MwhuRuf05vq4AT48Pq8RMi876zV8rr8cV969uTOzWdB/k+Lj5yI2PBtB1bGQisGen7MM1GcZlQTBXw==", + "node_modules/@web3auth/base/node_modules/@toruslabs/http-helpers": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@toruslabs/http-helpers/-/http-helpers-7.0.1.tgz", + "integrity": "sha512-9LqvgH/JfMtgZSzRqSutDfXZ5gw6+hziByYgzOzLGTO3WcqALAKCcO+icvcNI/NCw8HW4xpTM2xZIEkkEcFYPg==", "license": "MIT", "dependencies": { - "@walletconnect/events": "^1.0.1", - "@walletconnect/time": "^1.0.2", - "events": "^3.3.0" + "deepmerge": "^4.3.1", + "loglevel": "^1.9.2" + }, + "engines": { + "node": ">=20.x", + "npm": ">=9.x" + }, + "peerDependencies": { + "@babel/runtime": "^7.x", + "@sentry/types": "^8.x" + }, + "peerDependenciesMeta": { + "@sentry/types": { + "optional": true + } } }, - "node_modules/@walletconnect/jsonrpc-provider": { - "version": "1.0.14", - "resolved": "https://registry.npmjs.org/@walletconnect/jsonrpc-provider/-/jsonrpc-provider-1.0.14.tgz", - "integrity": "sha512-rtsNY1XqHvWj0EtITNeuf8PHMvlCLiS3EjQL+WOkxEOA4KPxsohFnBDeyPYiNm4ZvkQdLnece36opYidmtbmow==", - "license": "MIT", + "node_modules/@web3auth/no-modal": { + "version": "8.12.4", + "resolved": "https://registry.npmjs.org/@web3auth/no-modal/-/no-modal-8.12.4.tgz", + "integrity": "sha512-iJj3qXGB1exnOSaJ+8iSNbvfsvubefu+1G+vt1iiiinX0zKX0OGJM1zR5XQsdtwPpgzZHYiA57RLxiSGxKtB1g==", + "deprecated": "Not supported. Pls upgrade", + "license": "ISC", "dependencies": { - "@walletconnect/jsonrpc-utils": "^1.0.8", - "@walletconnect/safe-json": "^1.0.2", - "events": "^3.3.0" + "@toruslabs/openlogin": "^8.2.1", + "@toruslabs/openlogin-jrpc": "^8.3.0", + "@toruslabs/openlogin-utils": "^8.2.1", + "@web3auth/base": "^8.12.4", + "@web3auth/base-provider": "^8.12.4", + "lodash.clonedeep": "^4.5.0", + "lodash.merge": "^4.6.2" + }, + "engines": { + "node": ">=18.x", + "npm": ">=9.x" + }, + "peerDependencies": { + "@babel/runtime": "^7.x", + "@web3auth/openlogin-adapter": "^8.x", + "@web3auth/wallet-connect-v2-adapter": "^8.x" + }, + "peerDependenciesMeta": { + "@web3auth/openlogin-adapter": { + "optional": true + }, + "@web3auth/wallet-connect-v2-adapter": { + "optional": true + } } }, - "node_modules/@walletconnect/jsonrpc-types": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@walletconnect/jsonrpc-types/-/jsonrpc-types-1.0.4.tgz", - "integrity": "sha512-P6679fG/M+wuWg9TY8mh6xFSdYnFyFjwFelxyISxMDrlbXokorEVXYOxiqEbrU3x1BmBoCAJJ+vtEaEoMlpCBQ==", + "node_modules/@web3auth/no-modal/node_modules/@sentry/types": { + "version": "7.120.4", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.120.4.tgz", + "integrity": "sha512-cUq2hSSe6/qrU6oZsEP4InMI5VVdD86aypE+ENrQ6eZEVLTCYm1w6XhW1NvIu3UuWh7gZec4a9J7AFpYxki88Q==", "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@web3auth/no-modal/node_modules/@toruslabs/base-controllers": { + "version": "5.11.0", + "resolved": "https://registry.npmjs.org/@toruslabs/base-controllers/-/base-controllers-5.11.0.tgz", + "integrity": "sha512-5AsGOlpf3DRIsd6PzEemBoRq+o2OhgSFXj5LZD6gXcBlfe0OpF+ydJb7Q8rIt5wwpQLNJCs8psBUbqIv7ukD2w==", + "license": "ISC", "dependencies": { - "events": "^3.3.0", - "keyvaluestorage-interface": "^1.0.0" + "@ethereumjs/util": "^9.0.3", + "@toruslabs/broadcast-channel": "^10.0.2", + "@toruslabs/http-helpers": "^6.1.1", + "@toruslabs/openlogin-jrpc": "^8.3.0", + "@toruslabs/openlogin-utils": "^8.2.1", + "async-mutex": "^0.5.0", + "bignumber.js": "^9.1.2", + "bowser": "^2.11.0", + "jwt-decode": "^4.0.0", + "loglevel": "^1.9.1" + }, + "engines": { + "node": ">=18.x", + "npm": ">=9.x" + }, + "peerDependencies": { + "@babel/runtime": "7.x" } }, - "node_modules/@walletconnect/jsonrpc-utils": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@walletconnect/jsonrpc-utils/-/jsonrpc-utils-1.0.8.tgz", - "integrity": "sha512-vdeb03bD8VzJUL6ZtzRYsFMq1eZQcM3EAzT0a3st59dyLfJ0wq+tKMpmGH7HlB7waD858UWgfIcudbPFsbzVdw==", + "node_modules/@web3auth/no-modal/node_modules/@toruslabs/broadcast-channel": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/@toruslabs/broadcast-channel/-/broadcast-channel-10.0.2.tgz", + "integrity": "sha512-aZbKNgV/OhiTKSdxBTGO86xRdeR7Ct1vkB8yeyXRX32moARhZ69uJQL49jKh4cWKV3VeijrL9XvKdn5bzgHQZg==", + "license": "MIT", "dependencies": { - "@walletconnect/environment": "^1.0.1", - "@walletconnect/jsonrpc-types": "^1.0.3", - "tslib": "1.14.1" + "@babel/runtime": "^7.24.0", + "@toruslabs/eccrypto": "^4.0.0", + "@toruslabs/metadata-helpers": "^5.1.0", + "loglevel": "^1.9.1", + "oblivious-set": "1.4.0", + "socket.io-client": "^4.7.5", + "unload": "^2.4.1" + }, + "engines": { + "node": ">=18.x", + "npm": ">=9.x" } }, - "node_modules/@walletconnect/jsonrpc-ws-connection": { - "version": "1.0.16", - "resolved": "https://registry.npmjs.org/@walletconnect/jsonrpc-ws-connection/-/jsonrpc-ws-connection-1.0.16.tgz", - "integrity": "sha512-G81JmsMqh5nJheE1mPst1W0WfVv0SG3N7JggwLLGnI7iuDZJq8cRJvQwLGKHn5H1WTW7DEPCo00zz5w62AbL3Q==", + "node_modules/@web3auth/no-modal/node_modules/@toruslabs/constants": { + "version": "13.4.0", + "resolved": "https://registry.npmjs.org/@toruslabs/constants/-/constants-13.4.0.tgz", + "integrity": "sha512-CjmnMQ5Oj0bqSBGkhv7Xm3LciGJDHwe4AJ1LF6mijlP+QcCnUM5I6kVp60j7zZ/r0DT7nIEiuHHHczGpCZor0A==", "license": "MIT", + "engines": { + "node": ">=18.x", + "npm": ">=9.x" + }, + "peerDependencies": { + "@babel/runtime": "7.x" + } + }, + "node_modules/@web3auth/no-modal/node_modules/@toruslabs/eccrypto": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@toruslabs/eccrypto/-/eccrypto-4.0.0.tgz", + "integrity": "sha512-Z3EINkbsgJx1t6jCDVIJjLSUEGUtNIeDjhMWmeDGOWcP/+v/yQ1hEvd1wfxEz4q5WqIHhevacmPiVxiJ4DljGQ==", + "license": "CC0-1.0", "dependencies": { - "@walletconnect/jsonrpc-utils": "^1.0.6", - "@walletconnect/safe-json": "^1.0.2", - "events": "^3.3.0", - "ws": "^7.5.1" + "elliptic": "^6.5.4" + }, + "engines": { + "node": ">=18.x", + "npm": ">=9.x" } }, - "node_modules/@walletconnect/keyvaluestorage": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@walletconnect/keyvaluestorage/-/keyvaluestorage-1.1.1.tgz", - "integrity": "sha512-V7ZQq2+mSxAq7MrRqDxanTzu2RcElfK1PfNYiaVnJgJ7Q7G7hTVwF8voIBx92qsRyGHZihrwNPHuZd1aKkd0rA==", + "node_modules/@web3auth/no-modal/node_modules/@toruslabs/http-helpers": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/@toruslabs/http-helpers/-/http-helpers-6.1.1.tgz", + "integrity": "sha512-bJYOaltRzklzObhRdutT1wau17vXyrCCBKJOeN46F1t99MUXi5udQNeErFOcr9qBsvrq2q67eVBkU5XOeBMX5A==", + "license": "MIT", "dependencies": { - "@walletconnect/safe-json": "^1.0.1", - "idb-keyval": "^6.2.1", - "unstorage": "^1.9.0" + "lodash.merge": "^4.6.2", + "loglevel": "^1.9.1" + }, + "engines": { + "node": ">=18.x", + "npm": ">=9.x" }, "peerDependencies": { - "@react-native-async-storage/async-storage": "1.x" + "@babel/runtime": "^7.x", + "@sentry/types": "^7.x" }, "peerDependenciesMeta": { - "@react-native-async-storage/async-storage": { + "@sentry/types": { "optional": true } } }, - "node_modules/@walletconnect/logger": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@walletconnect/logger/-/logger-2.1.2.tgz", - "integrity": "sha512-aAb28I3S6pYXZHQm5ESB+V6rDqIYfsnHaQyzFbwUUBFY4H0OXx/YtTl8lvhUNhMMfb9UxbwEBS253TlXUYJWSw==", + "node_modules/@web3auth/no-modal/node_modules/@toruslabs/metadata-helpers": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@toruslabs/metadata-helpers/-/metadata-helpers-5.1.0.tgz", + "integrity": "sha512-7fdqKuWUaJT/ng+PlqrA4XKkn8Dij4JJozfv/4gHTi0f/6JFncpzIces09jTV70hCf0JIsTCvIDlzKOdJ+aeZg==", + "license": "MIT", "dependencies": { - "@walletconnect/safe-json": "^1.0.2", - "pino": "7.11.0" + "@toruslabs/eccrypto": "^4.0.0", + "@toruslabs/http-helpers": "^6.1.0", + "elliptic": "^6.5.5", + "ethereum-cryptography": "^2.1.3", + "json-stable-stringify": "^1.1.1" + }, + "engines": { + "node": ">=18.x", + "npm": ">=9.x" + }, + "peerDependencies": { + "@babel/runtime": "7.x" } }, - "node_modules/@walletconnect/relay-api": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@walletconnect/relay-api/-/relay-api-1.0.11.tgz", - "integrity": "sha512-tLPErkze/HmC9aCmdZOhtVmYZq1wKfWTJtygQHoWtgg722Jd4homo54Cs4ak2RUFUZIGO2RsOpIcWipaua5D5Q==", + "node_modules/@web3auth/no-modal/node_modules/@web3auth/base": { + "version": "8.12.4", + "resolved": "https://registry.npmjs.org/@web3auth/base/-/base-8.12.4.tgz", + "integrity": "sha512-RyHF3KZ0SwTglj1CSPo1tp3s9dZKqaDwvmCN48wgJsC288tAFGvZyqFTqeM10WX56OwUcLBrRl4w7oHpYJ8uXg==", + "deprecated": "Not supported. Pls upgrade", + "license": "ISC", "dependencies": { - "@walletconnect/jsonrpc-types": "^1.0.2" + "@toruslabs/constants": "^13.4.0", + "@toruslabs/http-helpers": "^6.1.1", + "@toruslabs/openlogin": "^8.2.1", + "@toruslabs/openlogin-jrpc": "^8.3.0", + "@toruslabs/openlogin-utils": "^8.2.1", + "jwt-decode": "^4.0.0", + "loglevel": "^1.9.1", + "ts-custom-error": "^3.3.1" + }, + "engines": { + "node": ">=18.x", + "npm": ">=9.x" + }, + "peerDependencies": { + "@babel/runtime": "^7.x" } }, - "node_modules/@walletconnect/relay-auth": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@walletconnect/relay-auth/-/relay-auth-1.0.4.tgz", - "integrity": "sha512-kKJcS6+WxYq5kshpPaxGHdwf5y98ZwbfuS4EE/NkQzqrDFm5Cj+dP8LofzWvjrrLkZq7Afy7WrQMXdLy8Sx7HQ==", + "node_modules/@web3auth/no-modal/node_modules/@web3auth/base-provider": { + "version": "8.12.4", + "resolved": "https://registry.npmjs.org/@web3auth/base-provider/-/base-provider-8.12.4.tgz", + "integrity": "sha512-LXhc0h/EG9FWGg86+CiLOi2XyZl9rm/fzJmuX8aP7bQbGz+TfbtSIX+0hZvYTAXJnj7vcHCMUj+hwh8hKn6W0A==", + "license": "ISC", "dependencies": { - "@stablelib/ed25519": "^1.0.2", - "@stablelib/random": "^1.0.1", - "@walletconnect/safe-json": "^1.0.1", - "@walletconnect/time": "^1.0.2", - "tslib": "1.14.1", - "uint8arrays": "^3.0.0" + "@toruslabs/base-controllers": "^5.10.0", + "@toruslabs/openlogin-jrpc": "^8.3.0", + "@web3auth/base": "^8.12.4", + "json-rpc-random-id": "^1.0.1" + }, + "engines": { + "node": ">=18.x", + "npm": ">=9.x" + }, + "peerDependencies": { + "@babel/runtime": "7.x" } }, - "node_modules/@walletconnect/safe-json": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@walletconnect/safe-json/-/safe-json-1.0.2.tgz", - "integrity": "sha512-Ogb7I27kZ3LPC3ibn8ldyUr5544t3/STow9+lzz7Sfo808YD7SBWk7SAsdBFlYgP2zDRy2hS3sKRcuSRM0OTmA==", + "node_modules/@web3auth/openlogin-adapter": { + "version": "8.12.4", + "resolved": "https://registry.npmjs.org/@web3auth/openlogin-adapter/-/openlogin-adapter-8.12.4.tgz", + "integrity": "sha512-bxvq6hwzbgkaYOXxzJPJmhPrBoQTxBhVdgMqPLGkvQT2Izg8IV+uic+xOfjp4Ng663N3l2HV4yx0qCqdYCHj/w==", + "license": "ISC", + "optional": true, + "peer": true, "dependencies": { - "tslib": "1.14.1" + "@toruslabs/openlogin": "^8.2.1", + "@toruslabs/openlogin-utils": "^8.2.1", + "@web3auth/base": "^8.12.4", + "@web3auth/base-provider": "^8.12.4", + "lodash.merge": "^4.6.2" + }, + "engines": { + "node": ">=18.x", + "npm": ">=9.x" + }, + "peerDependencies": { + "@babel/runtime": "^7.x" } }, - "node_modules/@walletconnect/sign-client": { - "version": "2.17.3", - "resolved": "https://registry.npmjs.org/@walletconnect/sign-client/-/sign-client-2.17.3.tgz", - "integrity": "sha512-OzOWxRTfVGCHU3OOF6ibPkgPfDpivFJjuknfcOUt9PYWpTAv6YKOmT4cyfBPhc7llruyHpV44fYbykMcLIvEcg==", + "node_modules/@web3auth/openlogin-adapter/node_modules/@sentry/types": { + "version": "7.120.4", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.120.4.tgz", + "integrity": "sha512-cUq2hSSe6/qrU6oZsEP4InMI5VVdD86aypE+ENrQ6eZEVLTCYm1w6XhW1NvIu3UuWh7gZec4a9J7AFpYxki88Q==", + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@web3auth/openlogin-adapter/node_modules/@toruslabs/base-controllers": { + "version": "5.11.0", + "resolved": "https://registry.npmjs.org/@toruslabs/base-controllers/-/base-controllers-5.11.0.tgz", + "integrity": "sha512-5AsGOlpf3DRIsd6PzEemBoRq+o2OhgSFXj5LZD6gXcBlfe0OpF+ydJb7Q8rIt5wwpQLNJCs8psBUbqIv7ukD2w==", + "license": "ISC", + "optional": true, + "peer": true, "dependencies": { - "@walletconnect/core": "2.17.3", - "@walletconnect/events": "1.0.1", - "@walletconnect/heartbeat": "1.2.2", - "@walletconnect/jsonrpc-utils": "1.0.8", - "@walletconnect/logger": "2.1.2", - "@walletconnect/time": "1.0.2", - "@walletconnect/types": "2.17.3", - "@walletconnect/utils": "2.17.3", - "events": "3.3.0" + "@ethereumjs/util": "^9.0.3", + "@toruslabs/broadcast-channel": "^10.0.2", + "@toruslabs/http-helpers": "^6.1.1", + "@toruslabs/openlogin-jrpc": "^8.3.0", + "@toruslabs/openlogin-utils": "^8.2.1", + "async-mutex": "^0.5.0", + "bignumber.js": "^9.1.2", + "bowser": "^2.11.0", + "jwt-decode": "^4.0.0", + "loglevel": "^1.9.1" + }, + "engines": { + "node": ">=18.x", + "npm": ">=9.x" + }, + "peerDependencies": { + "@babel/runtime": "7.x" } }, - "node_modules/@walletconnect/time": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@walletconnect/time/-/time-1.0.2.tgz", - "integrity": "sha512-uzdd9woDcJ1AaBZRhqy5rNC9laqWGErfc4dxA9a87mPdKOgWMD85mcFo9dIYIts/Jwocfwn07EC6EzclKubk/g==", + "node_modules/@web3auth/openlogin-adapter/node_modules/@toruslabs/broadcast-channel": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/@toruslabs/broadcast-channel/-/broadcast-channel-10.0.2.tgz", + "integrity": "sha512-aZbKNgV/OhiTKSdxBTGO86xRdeR7Ct1vkB8yeyXRX32moARhZ69uJQL49jKh4cWKV3VeijrL9XvKdn5bzgHQZg==", + "license": "MIT", + "optional": true, + "peer": true, "dependencies": { - "tslib": "1.14.1" + "@babel/runtime": "^7.24.0", + "@toruslabs/eccrypto": "^4.0.0", + "@toruslabs/metadata-helpers": "^5.1.0", + "loglevel": "^1.9.1", + "oblivious-set": "1.4.0", + "socket.io-client": "^4.7.5", + "unload": "^2.4.1" + }, + "engines": { + "node": ">=18.x", + "npm": ">=9.x" } }, - "node_modules/@walletconnect/types": { - "version": "2.17.3", - "resolved": "https://registry.npmjs.org/@walletconnect/types/-/types-2.17.3.tgz", - "integrity": "sha512-5eFxnbZGJJx0IQyCS99qz+OvozpLJJYfVG96dEHGgbzZMd+C9V1eitYqVClx26uX6V+WQVqVwjpD2Dyzie++Wg==", - "license": "Apache-2.0", + "node_modules/@web3auth/openlogin-adapter/node_modules/@toruslabs/constants": { + "version": "13.4.0", + "resolved": "https://registry.npmjs.org/@toruslabs/constants/-/constants-13.4.0.tgz", + "integrity": "sha512-CjmnMQ5Oj0bqSBGkhv7Xm3LciGJDHwe4AJ1LF6mijlP+QcCnUM5I6kVp60j7zZ/r0DT7nIEiuHHHczGpCZor0A==", + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=18.x", + "npm": ">=9.x" + }, + "peerDependencies": { + "@babel/runtime": "7.x" + } + }, + "node_modules/@web3auth/openlogin-adapter/node_modules/@toruslabs/eccrypto": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@toruslabs/eccrypto/-/eccrypto-4.0.0.tgz", + "integrity": "sha512-Z3EINkbsgJx1t6jCDVIJjLSUEGUtNIeDjhMWmeDGOWcP/+v/yQ1hEvd1wfxEz4q5WqIHhevacmPiVxiJ4DljGQ==", + "license": "CC0-1.0", + "optional": true, + "peer": true, "dependencies": { - "@walletconnect/events": "1.0.1", - "@walletconnect/heartbeat": "1.2.2", - "@walletconnect/jsonrpc-types": "1.0.4", - "@walletconnect/keyvaluestorage": "1.1.1", - "@walletconnect/logger": "2.1.2", - "events": "3.3.0" + "elliptic": "^6.5.4" + }, + "engines": { + "node": ">=18.x", + "npm": ">=9.x" } }, - "node_modules/@walletconnect/utils": { - "version": "2.17.3", - "resolved": "https://registry.npmjs.org/@walletconnect/utils/-/utils-2.17.3.tgz", - "integrity": "sha512-tG77UpZNeLYgeOwViwWnifpyBatkPlpKSSayhN0gcjY1lZAUNqtYslpm4AdTxlrA3pL61MnyybXgWYT5eZjarw==", - "license": "Apache-2.0", + "node_modules/@web3auth/openlogin-adapter/node_modules/@toruslabs/http-helpers": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/@toruslabs/http-helpers/-/http-helpers-6.1.1.tgz", + "integrity": "sha512-bJYOaltRzklzObhRdutT1wau17vXyrCCBKJOeN46F1t99MUXi5udQNeErFOcr9qBsvrq2q67eVBkU5XOeBMX5A==", + "license": "MIT", + "optional": true, + "peer": true, "dependencies": { - "@ethersproject/hash": "5.7.0", - "@ethersproject/transactions": "5.7.0", - "@stablelib/chacha20poly1305": "1.0.1", - "@stablelib/hkdf": "1.0.1", - "@stablelib/random": "1.0.2", - "@stablelib/sha256": "1.0.1", - "@stablelib/x25519": "1.0.3", - "@walletconnect/jsonrpc-utils": "1.0.8", - "@walletconnect/keyvaluestorage": "1.1.1", - "@walletconnect/relay-api": "1.0.11", - "@walletconnect/relay-auth": "1.0.4", - "@walletconnect/safe-json": "1.0.2", - "@walletconnect/time": "1.0.2", - "@walletconnect/types": "2.17.3", - "@walletconnect/window-getters": "1.0.1", - "@walletconnect/window-metadata": "1.0.1", - "detect-browser": "5.3.0", - "elliptic": "6.6.1", - "query-string": "7.1.3", - "uint8arrays": "3.1.0" + "lodash.merge": "^4.6.2", + "loglevel": "^1.9.1" + }, + "engines": { + "node": ">=18.x", + "npm": ">=9.x" + }, + "peerDependencies": { + "@babel/runtime": "^7.x", + "@sentry/types": "^7.x" + }, + "peerDependenciesMeta": { + "@sentry/types": { + "optional": true + } } }, - "node_modules/@walletconnect/utils/node_modules/uint8arrays": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-3.1.0.tgz", - "integrity": "sha512-ei5rfKtoRO8OyOIor2Rz5fhzjThwIHJZ3uyDPnDHTXbP0aMQ1RN/6AI5B5d9dBxJOU+BvOAk7ZQ1xphsX8Lrog==", + "node_modules/@web3auth/openlogin-adapter/node_modules/@toruslabs/metadata-helpers": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@toruslabs/metadata-helpers/-/metadata-helpers-5.1.0.tgz", + "integrity": "sha512-7fdqKuWUaJT/ng+PlqrA4XKkn8Dij4JJozfv/4gHTi0f/6JFncpzIces09jTV70hCf0JIsTCvIDlzKOdJ+aeZg==", "license": "MIT", + "optional": true, + "peer": true, "dependencies": { - "multiformats": "^9.4.2" + "@toruslabs/eccrypto": "^4.0.0", + "@toruslabs/http-helpers": "^6.1.0", + "elliptic": "^6.5.5", + "ethereum-cryptography": "^2.1.3", + "json-stable-stringify": "^1.1.1" + }, + "engines": { + "node": ">=18.x", + "npm": ">=9.x" + }, + "peerDependencies": { + "@babel/runtime": "7.x" } }, - "node_modules/@walletconnect/window-getters": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@walletconnect/window-getters/-/window-getters-1.0.1.tgz", - "integrity": "sha512-vHp+HqzGxORPAN8gY03qnbTMnhqIwjeRJNOMOAzePRg4xVEEE2WvYsI9G2NMjOknA8hnuYbU3/hwLcKbjhc8+Q==", + "node_modules/@web3auth/openlogin-adapter/node_modules/@web3auth/base": { + "version": "8.12.4", + "resolved": "https://registry.npmjs.org/@web3auth/base/-/base-8.12.4.tgz", + "integrity": "sha512-RyHF3KZ0SwTglj1CSPo1tp3s9dZKqaDwvmCN48wgJsC288tAFGvZyqFTqeM10WX56OwUcLBrRl4w7oHpYJ8uXg==", + "deprecated": "Not supported. Pls upgrade", + "license": "ISC", + "optional": true, + "peer": true, "dependencies": { - "tslib": "1.14.1" + "@toruslabs/constants": "^13.4.0", + "@toruslabs/http-helpers": "^6.1.1", + "@toruslabs/openlogin": "^8.2.1", + "@toruslabs/openlogin-jrpc": "^8.3.0", + "@toruslabs/openlogin-utils": "^8.2.1", + "jwt-decode": "^4.0.0", + "loglevel": "^1.9.1", + "ts-custom-error": "^3.3.1" + }, + "engines": { + "node": ">=18.x", + "npm": ">=9.x" + }, + "peerDependencies": { + "@babel/runtime": "^7.x" } }, - "node_modules/@walletconnect/window-metadata": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@walletconnect/window-metadata/-/window-metadata-1.0.1.tgz", - "integrity": "sha512-9koTqyGrM2cqFRW517BPY/iEtUDx2r1+Pwwu5m7sJ7ka79wi3EyqhqcICk/yDmv6jAS1rjKgTKXlEhanYjijcA==", + "node_modules/@web3auth/openlogin-adapter/node_modules/@web3auth/base-provider": { + "version": "8.12.4", + "resolved": "https://registry.npmjs.org/@web3auth/base-provider/-/base-provider-8.12.4.tgz", + "integrity": "sha512-LXhc0h/EG9FWGg86+CiLOi2XyZl9rm/fzJmuX8aP7bQbGz+TfbtSIX+0hZvYTAXJnj7vcHCMUj+hwh8hKn6W0A==", + "license": "ISC", + "optional": true, + "peer": true, "dependencies": { - "@walletconnect/window-getters": "^1.0.1", - "tslib": "1.14.1" + "@toruslabs/base-controllers": "^5.10.0", + "@toruslabs/openlogin-jrpc": "^8.3.0", + "@web3auth/base": "^8.12.4", + "json-rpc-random-id": "^1.0.1" + }, + "engines": { + "node": ">=18.x", + "npm": ">=9.x" + }, + "peerDependencies": { + "@babel/runtime": "7.x" } }, "node_modules/@webassemblyjs/ast": { @@ -6907,7 +8358,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", - "dev": true, "license": "MIT", "dependencies": { "event-target-shim": "^5.0.0" @@ -8616,7 +10066,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/assert/-/assert-2.1.0.tgz", "integrity": "sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==", - "dev": true, "dependencies": { "call-bind": "^1.0.2", "is-nan": "^1.3.2", @@ -8657,6 +10106,21 @@ "node": ">=0.12.0" } }, + "node_modules/async-mutex": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/async-mutex/-/async-mutex-0.5.0.tgz", + "integrity": "sha512-1A94B18jkJ3DYq284ohPxoXbfTA5HsQ7/Mf4DEhcyLx3Bz27Rh59iScbB6EPiP+B+joue6YCxcMXSbFC1tZKwA==", + "license": "MIT", + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/async-mutex/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, "node_modules/asynciterator.prototype": { "version": "1.0.0", "license": "MIT", @@ -9260,6 +10724,15 @@ ], "license": "MIT" }, + "node_modules/base64url": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/base64url/-/base64url-3.0.1.tgz", + "integrity": "sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/batch": { "version": "0.6.1", "license": "MIT" @@ -9299,6 +10772,15 @@ "node": "*" } }, + "node_modules/bignumber.js": { + "version": "9.3.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.3.1.tgz", + "integrity": "sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==", + "license": "MIT", + "engines": { + "node": "*" + } + }, "node_modules/binary-extensions": { "version": "2.2.0", "license": "MIT", @@ -9313,6 +10795,15 @@ "file-uri-to-path": "1.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/bitcore-lib": { "version": "8.25.10", "resolved": "https://registry.npmjs.org/bitcore-lib/-/bitcore-lib-8.25.10.tgz", @@ -9488,6 +10979,12 @@ "popper.js": "^1.16.1" } }, + "node_modules/bowser": { + "version": "2.14.1", + "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.14.1.tgz", + "integrity": "sha512-tzPjzCxygAKWFOJP011oxFHs57HzIhOEracIgAePE4pqB3LikALKnSzUyU4MGs9/iCEUuHlAJTjTc5M+u7YEGg==", + "license": "MIT" + }, "node_modules/brace-expansion": { "version": "1.1.11", "license": "MIT", @@ -10043,7 +11540,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", - "dev": true, "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.2", @@ -10448,6 +11944,19 @@ "version": "1.0.2", "license": "MIT" }, + "node_modules/color": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", + "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1", + "color-string": "^1.9.0" + }, + "engines": { + "node": ">=12.5.0" + } + }, "node_modules/color-convert": { "version": "1.9.3", "license": "MIT", @@ -10459,6 +11968,34 @@ "version": "1.1.3", "license": "MIT" }, + "node_modules/color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "license": "MIT", + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "node_modules/color/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, "node_modules/colord": { "version": "2.9.3", "license": "MIT" @@ -11564,7 +13101,9 @@ "license": "MIT" }, "node_modules/debug": { - "version": "4.4.0", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -11627,7 +13166,9 @@ "license": "MIT" }, "node_modules/deepmerge": { - "version": "4.2.2", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -12565,6 +14106,16 @@ "node": ">= 4" } }, + "node_modules/enc-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/enc-utils/-/enc-utils-3.0.0.tgz", + "integrity": "sha512-e57t/Z2HzWOLwOp7DZcV0VMEY8t7ptWwsxyp6kM2b2zrk6JqIpXxzkruHAMiBsy5wg9jp/183GdiRXCvBtzsYg==", + "license": "MIT", + "dependencies": { + "is-typedarray": "1.0.0", + "typedarray-to-buffer": "3.1.5" + } + }, "node_modules/encodeurl": { "version": "1.0.2", "license": "MIT", @@ -12598,6 +14149,49 @@ "once": "^1.4.0" } }, + "node_modules/engine.io-client": { + "version": "6.6.5", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.6.5.tgz", + "integrity": "sha512-QCwxUDULPlXv8F6tqMMKx5dNkTe6OaBYRMPYeXKBlyOoKvAmE0ac6pW7fFhSscJ/5SI7666/U/B+MElbsrJlIg==", + "license": "MIT", + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.4.1", + "engine.io-parser": "~5.2.1", + "ws": "~8.20.1", + "xmlhttprequest-ssl": "~2.1.1" + } + }, + "node_modules/engine.io-client/node_modules/ws": { + "version": "8.20.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.20.1.tgz", + "integrity": "sha512-It4dO0K5v//JtTXuPkfEOaI3uUN87iYPnqo/ZzqCoG3g8uhA66QUMs/SrM0YK7/NAu+r4LMh/9dq2A7k+rHs+w==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/engine.io-parser": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz", + "integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/enhanced-resolve": { "version": "5.17.0", "license": "MIT", @@ -13882,11 +15476,34 @@ "node": ">= 0.6" } }, + "node_modules/ethereum-cryptography": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-2.2.1.tgz", + "integrity": "sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg==", + "license": "MIT", + "dependencies": { + "@noble/curves": "1.4.2", + "@noble/hashes": "1.4.0", + "@scure/bip32": "1.4.0", + "@scure/bip39": "1.3.0" + } + }, + "node_modules/ethereum-cryptography/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==", + "license": "MIT", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/event-target-shim": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", - "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -14205,6 +15822,12 @@ "node": ">=6" } }, + "node_modules/fast-safe-stringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", + "license": "MIT" + }, "node_modules/fastq": { "version": "1.17.1", "license": "ISC", @@ -15955,7 +17578,6 @@ }, "node_modules/is-arguments": { "version": "1.1.1", - "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.2", @@ -16193,7 +17815,6 @@ "version": "1.3.2", "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz", "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==", - "dev": true, "dependencies": { "call-bind": "^1.0.0", "define-properties": "^1.1.3" @@ -18775,6 +20396,12 @@ "version": "2.3.1", "license": "MIT" }, + "node_modules/json-rpc-random-id": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-rpc-random-id/-/json-rpc-random-id-1.0.1.tgz", + "integrity": "sha512-RJ9YYNCkhVDBuP4zN5BBtYAzEl03yq/jIIsyif0JY9qyJuQQZNeDK7anAPKKlyEtLSj2s8h6hNh2F8zO5q7ScA==", + "license": "ISC" + }, "node_modules/json-schema": { "version": "0.4.0", "license": "(AFL-2.1 OR BSD-3-Clause)" @@ -18787,7 +20414,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.3.0.tgz", "integrity": "sha512-qtYiSSFlwot9XHtF9bD9c7rwKjr+RecWT//ZnPvSmEjpV5mmPOCN4j8UjY5hbjNkOwZ/jQv3J6R1/pL7RwgMsg==", - "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.8", @@ -18811,7 +20437,6 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true, "license": "MIT" }, "node_modules/json-stringify-safe": { @@ -18840,7 +20465,6 @@ "version": "0.0.1", "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.1.tgz", "integrity": "sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==", - "dev": true, "license": "Public Domain", "funding": { "url": "https://github.com/sponsors/ljharb" @@ -18914,6 +20538,15 @@ "setimmediate": "^1.0.5" } }, + "node_modules/jwt-decode": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jwt-decode/-/jwt-decode-4.0.0.tgz", + "integrity": "sha512-+KJGIyHgkGuIq3IEBNftfhW/LfWhXUIY6OmyVWjliu5KH1y0fw7VQ8YndE2O4qZdMSd9SqbnC8GOcZEy0Om7sA==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, "node_modules/keygrip": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/keygrip/-/keygrip-1.1.0.tgz", @@ -19364,6 +20997,12 @@ "version": "4.17.21", "license": "MIT" }, + "node_modules/lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==", + "license": "MIT" + }, "node_modules/lodash.debounce": { "version": "4.0.8", "license": "MIT" @@ -19530,6 +21169,19 @@ "node": ">=8" } }, + "node_modules/loglevel": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.9.2.tgz", + "integrity": "sha512-HgMmCqIJSAKqo68l0rS2AanEWfkxaZ5wNiEFb5ggm08lDs9Xl2KxBlX3PTcaD2chBM1gXAYf491/M2Rv8Jwayg==", + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + }, + "funding": { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/loglevel" + } + }, "node_modules/loose-envify": { "version": "1.4.0", "license": "MIT", @@ -20519,7 +22171,6 @@ }, "node_modules/object-is": { "version": "1.1.5", - "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.2", @@ -21583,6 +23234,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/oblivious-set": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/oblivious-set/-/oblivious-set-1.4.0.tgz", + "integrity": "sha512-szyd0ou0T8nsAqHtprRcP3WidfsN1TnAR5yWXf2mFCEr5ek3LEOkT6EZ/92Xfs74HIdyhG5WkGxIssMU0jBaeg==", + "license": "MIT", + "engines": { + "node": ">=16" + } + }, "node_modules/obuf": { "version": "1.1.2", "license": "MIT" @@ -23490,7 +25150,6 @@ }, "node_modules/process": { "version": "0.11.10", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.6.0" @@ -23604,7 +25263,9 @@ } }, "node_modules/pump": { - "version": "3.0.0", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.4.tgz", + "integrity": "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==", "license": "MIT", "dependencies": { "end-of-stream": "^1.1.0", @@ -25739,6 +27400,21 @@ ], "license": "MIT" }, + "node_modules/simple-swizzle": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.4.tgz", + "integrity": "sha512-nAu1WFPQSMNr2Zn9PGSZK9AGn4t/y97lEm+MXTtUDwfP0ksAIX4nO+6ruD9Jwut4C49SB1Ws+fbXsm/yScWOHw==", + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, + "node_modules/simple-swizzle/node_modules/is-arrayish": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.4.tgz", + "integrity": "sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA==", + "license": "MIT" + }, "node_modules/simple-update-notifier": { "version": "2.0.0", "dev": true, @@ -25817,6 +27493,34 @@ "npm": ">= 3.0.0" } }, + "node_modules/socket.io-client": { + "version": "4.8.3", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.8.3.tgz", + "integrity": "sha512-uP0bpjWrjQmUt5DTHq9RuoCBdFJF10cdX9X+a368j/Ft0wmaVgxlrjvK3kjvgCODOMMOz9lcaRzxmso0bTWZ/g==", + "license": "MIT", + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.4.1", + "engine.io-client": "~6.6.1", + "socket.io-parser": "~4.2.4" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/socket.io-parser": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.6.tgz", + "integrity": "sha512-asJqbVBDsBCJx0pTqw3WfesSY0iRX+2xzWEWzrpcH7L6fLzrhyF8WPI8UaeM4YCuDfpwA/cgsdugMsmtz8EJeg==", + "license": "MIT", + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.4.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/sockjs": { "version": "0.3.24", "license": "MIT", @@ -27435,6 +29139,15 @@ "version": "1.0.1", "license": "MIT" }, + "node_modules/ts-custom-error": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/ts-custom-error/-/ts-custom-error-3.3.1.tgz", + "integrity": "sha512-5OX1tzOjxWEgsr/YEUWSuPrQ00deKLh6D7OTWcvNHm12/7QPyRh8SYpyWvA4IZv8H/+GQWQEh/kwo95Q9OVW1A==", + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/ts-interface-checker": { "version": "0.1.13", "license": "Apache-2.0" @@ -27920,6 +29633,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/typed-emitter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/typed-emitter/-/typed-emitter-2.1.0.tgz", + "integrity": "sha512-g/KzbYKbH5C2vPkaXGu8DJlHrGKHLsM25Zg9WuC9pMGfuvT+X25tZQWo5fK1BjBm8+UrVE9LDCvaY0CQk+fXDA==", + "license": "MIT", + "optionalDependencies": { + "rxjs": "*" + } + }, "node_modules/typedarray-to-buffer": { "version": "3.1.5", "license": "MIT", @@ -28106,6 +29828,15 @@ "uuid": "dist/bin/uuid" } }, + "node_modules/unload": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/unload/-/unload-2.4.1.tgz", + "integrity": "sha512-IViSAm8Z3sRBYA+9wc0fLQmU9Nrxb16rcDmIiR6Y9LJSZzI7QY5QsDhqPpKOjAn0O9/kfK1TfNEMMAGPTIraPw==", + "license": "Apache-2.0", + "funding": { + "url": "https://github.com/sponsors/pubkey" + } + }, "node_modules/unorm": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/unorm/-/unorm-1.6.0.tgz", @@ -28336,7 +30067,6 @@ "version": "0.12.5", "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", - "dev": true, "dependencies": { "inherits": "^2.0.3", "is-arguments": "^1.0.4", @@ -28365,8 +30095,7 @@ "node_modules/util/node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "node_modules/utila": { "version": "0.4.0", @@ -29416,6 +31145,14 @@ "dev": true, "license": "Apache-2.0" }, + "node_modules/xmlhttprequest-ssl": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.1.2.tgz", + "integrity": "sha512-TEU+nJVUUnA4CYJFLvK5X9AOeH4KvDvhIfm0vV1GaQRtchnG0hgK5p8hw/xjv8cunWYCsiPCSDzObPyhEwq3KQ==", + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/xtend": { "version": "4.0.2", "dev": true, diff --git a/package.json b/package.json index 2bb43a288..3451ad07c 100644 --- a/package.json +++ b/package.json @@ -38,13 +38,17 @@ }, "dependencies": { "@hathor/hathor-rpc-handler": "4.4.0", - "@hathor/wallet-lib": "3.1.1", + "@hathor/wallet-lib": "file:.yalc/@hathor/wallet-lib", "@ledgerhq/hw-transport-node-hid": "6.28.1", "@reduxjs/toolkit": "2.2.3", "@reown/walletkit": "1.1.2", "@sentry/electron": "3.0.7", "@walletconnect/core": "2.17.3", "@walletconnect/utils": "2.17.3", + "@web3auth/auth-adapter": "^9.7.0", + "@web3auth/base": "^9.7.0", + "@web3auth/base-provider": "^9.7.0", + "@web3auth/no-modal": "^8.12.4", "axios": "1.7.7", "babel-polyfill": "6.26.0", "bootstrap": "4.6.1", diff --git a/public/electron.js b/public/electron.js index d29e68da7..088cfd65e 100644 --- a/public/electron.js +++ b/public/electron.js @@ -71,6 +71,33 @@ function createWindow () { // Adding wallet version to user agent, so we can get in all request headers mainWindow.webContents.setUserAgent(mainWindow.webContents.getUserAgent() + ' HathorWallet/' + constants.versionNumber); + mainWindow.webContents.setWindowOpenHandler(({ url }) => { + // Allow the Web3Auth OAuth popup (and follow-up provider redirects). + const isAuthHost = ( + url.startsWith('https://auth.web3auth.io/') + || url.startsWith('https://accounts.google.com/') + || url.startsWith('https://appleid.apple.com/') + ); + if (!isAuthHost) { + return { action: 'deny' }; + } + return { + action: 'allow', + overrideBrowserWindowOptions: { + width: 480, + height: 720, + frame: true, + autoHideMenuBar: true, + webPreferences: { + nodeIntegration: false, + contextIsolation: true, + sandbox: true, + partition: 'persist:web3auth', + }, + }, + }; + }); + mainWindow.once('ready-to-show', () => { mainWindow.show() }) diff --git a/qa/QA.md b/qa/QA.md new file mode 100644 index 000000000..cc921dada --- /dev/null +++ b/qa/QA.md @@ -0,0 +1,98 @@ +# Hathor Desktop Wallet — QA + +This document captures manual QA scenarios required before releasing the desktop wallet. +Run all scenarios on the target platforms before sign-off. + +## Web3Auth Social Login + +Run on testnet first. Mainnet scenarios are gated on the Web3Auth Mainnet project +provisioning. + +### Setup + +- Toggle `web3auth-desktop.rollout` ON in Unleash (or use the local fallback by + editing `FEATURE_TOGGLE_DEFAULTS` in `src/constants.js` and rebuilding). +- Sign out of any existing wallet so the Welcome → WalletType flow is reachable. + +### Scenario 1 — Happy path: first-time login + +1. Click `Sign in with social`. +2. Click `Continue with Google`. +3. Complete Google OAuth in the popup BrowserWindow. +4. Complete MFA setup (mandatory) in the Web3Auth-hosted webview. +5. Set a PIN and password. +6. Verify the wallet dashboard loads. +7. Receive 1 HTR on testnet from a faucet. +8. Send 0.5 HTR back to the faucet. + +Expected: each step completes without errors. Sentry receives no error events. + +### Scenario 2 — Restart and unlock with PIN + +1. Quit the app (Cmd+Q). +2. Relaunch. +3. Verify the LockedWallet screen appears (PIN prompt, no seed words). +4. Enter PIN. +5. Verify the dashboard reappears with the same balance as before. + +### Scenario 3 — Sign out and back in + +1. From Settings, click `Sign out of your Hathor account `. +2. Confirm. +3. From Welcome → WalletType, click `Sign in with social` → `Continue with Google`. + (MFA is NOT prompted this time.) +4. Set a new PIN. +5. Verify the same Hathor address as before is shown in `Receive`. + +### Scenario 4 — Cancel OAuth popup + +1. Click `Continue with Google`, close the popup without authenticating. +2. Expected: silent return to the social login screen, no error dialog. + +### Scenario 5 — Offline + +1. Disable the network. +2. Click `Continue with Google`. +3. Expected: `Web3AuthErrorDialog` with "Connection problem" copy and a Try again + button. + +### Scenario 6 — Abort MFA setup + +1. Click `Continue with Google`, complete Google OAuth, then close the MFA webview + without configuring a factor. +2. Expected: `Web3AuthErrorDialog` with "Set up a recovery factor" copy. + +### Scenario 7 — Feature toggle off (with existing wallet) + +1. With a Web3Auth wallet active, sign out. +2. Disable `web3auth-desktop.rollout`. +3. Open the app — the WalletType screen is reachable, and the `Sign in with social` + button is NOT shown. +4. Sign in with social again is not possible. But if the user had NOT signed out, the + LockedWallet screen would still be reachable and the wallet could be unlocked with + PIN. (Verify by retesting with a wallet that was not signed out.) + +### Scenario 8 — Cross-platform key portability + +1. Sign in via Web3Auth on the desktop wallet (testnet). +2. Note the address shown in `Receive`. +3. Sign in via the mobile wallet using the same Google account on testnet. +4. Verify the same address is displayed. + +### Scenario 9 — Mainnet (when provisioned) + +1. Switch the Hathor network to mainnet in Settings. +2. Attempt social login. +3. Until provisioned: `Web3AuthErrorDialog` shows "Sign-in temporarily unavailable". +4. Once provisioned: same as Scenario 1 but on mainnet. + +### Scenario 10 — Single-key UI invariants + +1. Sign in via Web3Auth. +2. Verify the following menu entries are NOT visible: + - Reown / WalletConnect (in Settings) + - Atomic Swap (in top navigation) + - Nano Contract (in top navigation) +3. Open the `Receive` screen — verify the "Generate new address" button is NOT shown. +4. Settings → reset row label reads "Sign out of your Hathor account <email>", + not "Reset wallet". diff --git a/src/App.js b/src/App.js index b12672169..2568491dd 100644 --- a/src/App.js +++ b/src/App.js @@ -57,6 +57,9 @@ import LOCAL_STORE from './storage'; import { getGlobalWallet } from "./modules/wallet"; import ReownConnect from './screens/ReownConnect'; import NetworkSettingsRecovery from './screens/NetworkSettingsRecovery'; +import Web3AuthLogin from './screens/Web3AuthLogin'; +import Web3AuthRecovery from './screens/Web3AuthRecovery'; +import { restoreWeb3AuthState } from './sagas/web3auth'; function Root() { const { @@ -85,6 +88,13 @@ function Root() { } }, [ledgerClosed]); + // Restore Web3Auth identity (walletType + email) from localStorage on boot + // so the rest of the app can branch on walletType without waiting on saga + // hydration. See sagas/web3auth.js#restoreWeb3AuthState. + useEffect(() => { + restoreWeb3AuthState(dispatch); + }, [dispatch]); + /** * Initializes the application, including: * - LocalStorage migration @@ -215,6 +225,8 @@ function Root() { } />} /> } loaded={false} />} /> } loaded={false} />} /> + } /> + } /> } loaded={false} />} /> } />} /> } /> diff --git a/src/actions/index.js b/src/actions/index.js index ffcf449a1..503d811e5 100644 --- a/src/actions/index.js +++ b/src/actions/index.js @@ -52,6 +52,8 @@ export const types = { FEATURE_TOGGLE_INITIALIZED: 'FEATURE_TOGGLE_INITIALIZED', SET_FEATURE_TOGGLES: 'SET_FEATURE_TOGGLES', SET_UNLEASH_CLIENT: 'SET_UNLEASH_CLIENT', + SET_WALLET_TYPE: 'SET_WALLET_TYPE', + SET_WEB3AUTH_EMAIL: 'SET_WEB3AUTH_EMAIL', UPDATE_TX_HISTORY: 'UPDATE_TX_HISTORY', SET_NATIVE_TOKEN_DATA: 'SET_NATIVE_TOKEN_DATA', ADD_REGISTERED_TOKENS: 'ADD_REGISTERED_TOKENS', @@ -1094,3 +1096,26 @@ export const newUnknownTokensFound = (tokenUids) => ({ type: types.NEW_UNKNOWN_TOKENS_FOUND, payload: { tokenUids }, }); + +/** + * Set the active wallet type — software (seed), hardware (Ledger), or web3auth. + * The value is also persisted to localStorage by the Web3Auth flow (see + * src/sagas/web3auth.js) so the app can restore it on startup. + * + * @param {'software'|'hardware'|'web3auth'|null} walletType + */ +export const setWalletType = (walletType) => ({ + type: types.SET_WALLET_TYPE, + payload: walletType, +}); + +/** + * Set the email address of the user signed in via Web3Auth. Persisted alongside + * walletType in localStorage; null when the wallet is not a Web3Auth wallet. + * + * @param {string|null} email + */ +export const setWeb3authEmail = (email) => ({ + type: types.SET_WEB3AUTH_EMAIL, + payload: email, +}); diff --git a/src/assets/web3auth-providers/apple.svg b/src/assets/web3auth-providers/apple.svg new file mode 100644 index 000000000..b2f290c21 --- /dev/null +++ b/src/assets/web3auth-providers/apple.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/web3auth-providers/email.svg b/src/assets/web3auth-providers/email.svg new file mode 100644 index 000000000..f8f9cec06 --- /dev/null +++ b/src/assets/web3auth-providers/email.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/web3auth-providers/google.svg b/src/assets/web3auth-providers/google.svg new file mode 100644 index 000000000..8e0558efa --- /dev/null +++ b/src/assets/web3auth-providers/google.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/components/Navigation.js b/src/components/Navigation.js index 00462fab7..91a2bb423 100644 --- a/src/components/Navigation.js +++ b/src/components/Navigation.js @@ -15,6 +15,7 @@ import helpers from '../utils/helpers'; import { useSelector } from 'react-redux'; import { FEATURE_TOGGLE_DEFAULTS, NANO_CONTRACTS_FEATURE_TOGGLE } from '../constants'; import { get } from 'lodash'; +import { isSingleKeyWallet } from '../reducers'; /** * Component that shows a navigation bar with the menu options @@ -24,12 +25,15 @@ import { get } from 'lodash'; function Navigation() { const useAtomicSwap = useSelector(state => state.useAtomicSwap); const featureToggles = useSelector(state => state.featureToggles); + const isWeb3Auth = useSelector(isSingleKeyWallet); const nanoEnabledDefault = get(FEATURE_TOGGLE_DEFAULTS, NANO_CONTRACTS_FEATURE_TOGGLE, false) const nanoEnabledFeatureToggle = get(featureToggles, NANO_CONTRACTS_FEATURE_TOGGLE, nanoEnabledDefault); const fullNodeNanoEnabled = useSelector(state => state.serverInfo.nanoContractsEnabled); // To enable nano contract navigation, the unleash feature toggle must - // be enabled and the full node must support it as well - const nanoEnabled = nanoEnabledFeatureToggle && fullNodeNanoEnabled; + // be enabled and the full node must support it as well. Single-key (web3auth) + // wallets cannot derive the additional addresses these features require. + const nanoEnabled = nanoEnabledFeatureToggle && fullNodeNanoEnabled && !isWeb3Auth; + const atomicSwapEnabled = useAtomicSwap && !isWeb3Auth; /** * Method called when user clicked on Explorer menu @@ -66,7 +70,7 @@ function Navigation() {
  • {t`NFTs`}
  • - {useAtomicSwap &&
  • + {atomicSwapEnabled &&
  • {t`Atomic Swap`}
  • }
  • diff --git a/src/components/WalletAddress.js b/src/components/WalletAddress.js index 5e16ccf4f..3a42ca9d6 100644 --- a/src/components/WalletAddress.js +++ b/src/components/WalletAddress.js @@ -16,6 +16,7 @@ import { sharedAddressUpdate } from '../actions/index'; import { GlobalModalContext, MODAL_TYPES } from './GlobalModal'; import LOCAL_STORE from '../storage'; import { getGlobalWallet } from '../modules/wallet'; +import { isSingleKeyWallet } from '../reducers'; const mapDispatchToProps = dispatch => { return { @@ -28,6 +29,7 @@ const mapStateToProps = (state) => { lastSharedAddress: state.lastSharedAddress, lastSharedIndex: state.lastSharedIndex, addressMode: state.addressMode, + isWeb3Auth: isSingleKeyWallet(state), }; }; @@ -148,23 +150,25 @@ export class WalletAddress extends React.Component { render() { const renderAddress = () => { const isSingleAddress = this.props.addressMode === ADDRESS_MODE.SINGLE; + const { isWeb3Auth } = this.props; + const showGenerateNewAddress = !isSingleAddress && !isWeb3Auth; return (

    {t`Address to receive tokens`}

    {showAddressString()}
    - {!isSingleAddress && ( + {showGenerateNewAddress && ( this.generateNewAddress(e)} href="true">{t`Generate new address`} )} {(!LOCAL_STORE.isHardwareWallet()) &&
    - {!isSingleAddress && |} + {showGenerateNewAddress && |} this.showQRCode(e)}>{t`QR Code`}
    }
    - {(!LOCAL_STORE.isHardwareWallet() && !isSingleAddress) && + {(!LOCAL_STORE.isHardwareWallet() && !isSingleAddress && !isWeb3Auth) && {t`See all addresses`} }
    diff --git a/src/components/Web3AuthErrorDialog.js b/src/components/Web3AuthErrorDialog.js new file mode 100644 index 000000000..f565efd5d --- /dev/null +++ b/src/components/Web3AuthErrorDialog.js @@ -0,0 +1,124 @@ +/** + * Copyright (c) Hathor Labs and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +import React, { useEffect, useRef } from 'react'; +import { t } from 'ttag'; +import { WEB3AUTH_ERROR_TYPES } from '../sagas/web3auth'; +import { useGlobalModalContext, MODAL_TYPES } from './GlobalModal'; + +/** + * Copy + observability tag for each Web3Auth error variant. USER_CANCELLED is + * intentionally absent: the saga swallows it silently before reaching this + * component, so any errorType reaching us is a real failure worth surfacing. + */ +const COPY = { + [WEB3AUTH_ERROR_TYPES.NETWORK]: { + title: () => t`Connection problem`, + body: () => t`Could not reach Web3Auth. Check your internet connection and try again.`, + sentryTag: 'network', + }, + [WEB3AUTH_ERROR_TYPES.VERIFIER_CONFIG]: { + title: () => t`Sign-in temporarily unavailable`, + body: () => t`There is a configuration issue with Web3Auth. The Hathor team has been notified.`, + sentryTag: 'config', + }, + [WEB3AUTH_ERROR_TYPES.MFA_REQUIRED]: { + title: () => t`Set up a recovery factor`, + body: () => t`Hathor wallets require a recovery factor to protect your funds. You can configure it in the next step.`, + sentryTag: 'mfa', + }, + [WEB3AUTH_ERROR_TYPES.KEY_DERIVATION]: { + title: () => t`Could not derive your wallet`, + body: () => t`Something went wrong while preparing your wallet. Please contact support.`, + sentryTag: 'key', + }, + [WEB3AUTH_ERROR_TYPES.UNKNOWN]: { + title: () => t`Sign-in failed`, + body: () => t`Something unexpected happened. Please try again.`, + sentryTag: 'unknown', + }, +}; + +/** + * Web3Auth error dialog. + * + * Built on top of the project's GlobalModal (MODAL_TYPES.ALERT → ModalAlert). + * Each error type maps to a copy pair (title + body) and an observability tag. + * Logs the error context on mount so the team has telemetry even when the + * user dismisses without action. + * + * Behavior: + * - Mount: show the alert modal with retry button. + * - Click "Try again": call onRetry, then close the modal. + * - Dismiss any other way (Bootstrap "hidden.bs.modal" hook): call onCancel. + * - Unmount: ensure the modal is hidden. + * + * Because GlobalModal auto-injects an onClose handler that fires on every + * Bootstrap "hidden.bs.modal" event (including the one triggered by the + * primary button), we use a ref flag to ensure onRetry and onCancel are + * mutually exclusive. + * + * @param {object} props + * @param {string} props.errorType One of WEB3AUTH_ERROR_TYPES values + * @param {Function} [props.onRetry] Called when the user taps "Try again" + * @param {Function} [props.onCancel] Called when the user dismisses the dialog + */ +function Web3AuthErrorDialog({ errorType, onRetry, onCancel }) { + const { showModal, hideModal } = useGlobalModalContext(); + const copy = COPY[errorType] || COPY[WEB3AUTH_ERROR_TYPES.UNKNOWN]; + // Latch flag: when the user clicks "Try again" we route through onRetry and + // suppress the auto-injected onClose (which would otherwise fire onCancel + // too because the primary button calls $.modal('hide') internally). + const retriedRef = useRef(false); + + useEffect(() => { + retriedRef.current = false; + + // Observability hook. Sentry forwarding is left to the existing logger + // (sentry breadcrumbs); we just emit a tagged log here. + // eslint-disable-next-line no-console + console.warn('[web3auth] error dialog shown', { + errorType, + category: copy.sentryTag, + }); + + showModal(MODAL_TYPES.ALERT, { + id: 'web3authErrorModal', + title: copy.title(), + body:

    {copy.body()}

    , + buttonName: t`Try again`, + handleButton: () => { + retriedRef.current = true; + hideModal(); + if (typeof onRetry === 'function') { + onRetry(); + } + }, + // ModalAlert wires the GlobalModal-injected onClose to Bootstrap's + // hidden.bs.modal event, so this fires on backdrop click, ESC, or after + // the primary button hides the modal. Skip the cancel path if a retry + // already happened. + onClose: () => { + if (retriedRef.current) { + retriedRef.current = false; + return; + } + if (typeof onCancel === 'function') { + onCancel(); + } + }, + }); + + return () => { + hideModal(); + }; + }, [errorType]); + + return null; +} + +export default Web3AuthErrorDialog; diff --git a/src/constants.js b/src/constants.js index 6d7cf6ab2..588e17e16 100644 --- a/src/constants.js +++ b/src/constants.js @@ -229,6 +229,7 @@ export const NANO_CONTRACTS_FEATURE_TOGGLE = 'nano-contracts-desktop.rollout'; export const REOWN_FEATURE_TOGGLE = 'wallet-desktop-reown.rollout'; export const FEE_TOKEN_FEATURE_TOGGLE = 'fee-based-tokens-desktop.rollout'; export const SINGLE_ADDRESS_FEATURE_TOGGLE = 'single-address-desktop.rollout'; +export const WEB3AUTH_FEATURE_TOGGLE = 'web3auth-desktop.rollout'; export const FEATURE_TOGGLE_DEFAULTS = { [WALLET_SERVICE_FEATURE_TOGGLE]: false, @@ -237,8 +238,43 @@ export const FEATURE_TOGGLE_DEFAULTS = { [REOWN_FEATURE_TOGGLE]: false, [FEE_TOKEN_FEATURE_TOGGLE]: false, [SINGLE_ADDRESS_FEATURE_TOGGLE]: false, + [WEB3AUTH_FEATURE_TOGGLE]: false, }; +/** + * Web3Auth project configuration per Hathor network. + * + * The verifier is Hathor-owned and shared with the mobile wallet so the same + * Google account derives the same Hathor address on both platforms. The + * googleClientId is the Hathor-owned Google OAuth client registered in the + * Web3Auth dashboard under the `hathor-google` custom verifier. + * + * Mainnet entries are placeholders; getWeb3AuthConfig throws a controlled + * error if a user tries to log in on mainnet before the dashboard is set up. + */ +export const WEB3AUTH_CONFIG = { + testnet: { + clientId: 'BLQbTFHmFa4TpQwAKEnBsf9ZArKB8R_hP3gKjBdSrF48fSmzo3ES-KpoaAvX7JMaa1PvefbD5yEXgRrgsiQiauQ', + network: 'sapphire_devnet', + verifier: 'hathor-google', + googleClientId: '206408356798-lmqb7i1n1vr6e761479q146sfqgnvue8.apps.googleusercontent.com', + appleVerifier: 'hathor-apple', + appleClientId: null, + }, + mainnet: { + clientId: null, + network: 'sapphire_mainnet', + verifier: 'hathor-google', + googleClientId: null, + appleVerifier: 'hathor-apple', + appleClientId: null, + }, +}; + +// Storage keys are registered in src/storage.js storageKeys array in T4. +export const WEB3AUTH_WALLET_TYPE_KEY = 'localstorage:web3auth:walletType'; +export const WEB3AUTH_EMAIL_KEY = 'localstorage:web3auth:email'; + /** * This property filters the full exported scss properties and exposes only the ones * relevant to the javascript context. diff --git a/src/index.module.scss b/src/index.module.scss index f24893f29..9bde3eb33 100644 --- a/src/index.module.scss +++ b/src/index.module.scss @@ -1319,3 +1319,5 @@ div .nc-token-balance:not(:last-child) { } } } + +@import 'styles/web3auth'; diff --git a/src/reducers/index.js b/src/reducers/index.js index ac3d5de73..2455c7248 100644 --- a/src/reducers/index.js +++ b/src/reducers/index.js @@ -123,6 +123,10 @@ const initialState = { useWalletService: false, // Address mode: ADDRESS_MODE.SINGLE or ADDRESS_MODE.MULTI addressMode: null, + // Active wallet type: 'software' | 'hardware' | 'web3auth' | null + walletType: null, + // Email of the user signed in via Web3Auth; null when not a Web3Auth wallet + web3authEmail: null, // Promise to be resolved when the user inputs his PIN correctly on the LockedWallet screen lockWalletPromise: null, // Track if the Ledger device app was closed while the wallet was loaded. @@ -500,6 +504,11 @@ const rootReducer = (state = initialState, action) => { return onUnregisteredTokensClean(state); case types.SET_ADDRESS_MODE: return { ...state, addressMode: action.payload }; + case types.SET_WALLET_TYPE: + return { ...state, walletType: action.payload }; + + case types.SET_WEB3AUTH_EMAIL: + return { ...state, web3authEmail: action.payload }; case types.TOKEN_REGISTER_REQUESTED: return onTokenRegisterRequested(state, action); case types.TOKEN_REGISTER_SUCCESS: @@ -1680,4 +1689,12 @@ export const onTokenRegisterFailed = (state, { payload }) => { }; }; +/** + * Returns true when the loaded wallet is a Web3Auth single-key wallet. + * + * Use to gate UI features that don't make sense for single-key wallets + * (e.g., "generate new address", NanoContract menus, Reown — until PR2). + */ +export const isSingleKeyWallet = (state) => state.walletType === 'web3auth'; + export default rootReducer; diff --git a/src/sagas/reown.js b/src/sagas/reown.js index 2f5cf39c2..231bd251e 100644 --- a/src/sagas/reown.js +++ b/src/sagas/reown.js @@ -119,6 +119,10 @@ function extractErrorDetails(error) { * @returns {boolean} True if the Reown feature is enabled, false otherwise */ function* isReownEnabled() { + const walletType = yield select((state) => state.walletType); + if (walletType === 'web3auth') { + return false; // Reown is enabled for Web3Auth wallets in PR2. + } const reownEnabled = yield call(checkForFeatureFlag, REOWN_FEATURE_TOGGLE); return reownEnabled; } diff --git a/src/sagas/wallet.js b/src/sagas/wallet.js index 54c2f1e69..3c71baebd 100644 --- a/src/sagas/wallet.js +++ b/src/sagas/wallet.js @@ -67,6 +67,8 @@ import { setAddressMode, setFeatureToggles, newUnknownTokensFound, + setWalletType, + setWeb3authEmail, } from '../actions'; import { specificTypeAndPayload, @@ -76,6 +78,7 @@ import { } from './helpers'; import { fetchTokenData, restoreTokensForNetwork } from './tokens'; import { updateUnleashClientContext } from './featureToggle'; +import { web3authLogout } from './web3auth'; import walletUtils from '../utils/wallet'; import tokensUtils from '../utils/tokens'; import nanoUtils from '../utils/nanoContracts'; @@ -154,12 +157,35 @@ export function* startWallet(action) { password, xpub, hardware, + privateKey, + publicKey, + walletType, } = action.payload; let xpriv = null; yield put(loadingAddresses(true)); - if (hardware) { + // Web3Auth branch: bypass wallet-service and force single-address policy. + // Read access data here (when storage is already initialized) to detect + // restore mode where no privateKey is in payload but the persisted access + // data has `singleKeyMode === true`. + const earlyStorage = LOCAL_STORE.getStorage(); + const earlyAccessData = earlyStorage + ? yield call([earlyStorage, 'getAccessData']) + : null; + const isWeb3AuthFirstLogin = Boolean(privateKey); + const isWeb3AuthRestore = ( + !privateKey + && !words + && !xpub + && earlyAccessData?.singleKeyMode === true + ); + const isWeb3Auth = isWeb3AuthFirstLogin || isWeb3AuthRestore; + + if (isWeb3Auth) { + // Storage was set up by Signin via initWeb3AuthStorage on first login, + // or persisted from a previous session on restore. Do not re-init. + } else if (hardware) { // We need to ensure that the hardware wallet storage is always generated here since we may be // starting the wallet with a second device and so we cannot trust the xpub saved on storage. yield LOCAL_STORE.initHWStorage(xpub); @@ -177,20 +203,32 @@ export function* startWallet(action) { // we sync after wallet.start. Persistence of the address mode to // localStorage is therefore deferred to after the connection. const network = yield select((state) => state.networkSettings.data.network); - const singleAddressFeatureEnabled = yield call(checkForFeatureFlag, SINGLE_ADDRESS_FEATURE_TOGGLE); - const storedAddressMode = walletUtils.getAddressMode(network); - const attemptedAddressMode = decideAddressMode({ singleAddressFeatureEnabled, storedAddressMode }); + let scanPolicy; + let attemptedAddressMode; + if (isWeb3Auth) { + // Web3Auth single-key wallets are single-address by construction. + scanPolicy = { policy: SCANNING_POLICY.SINGLE_ADDRESS }; + attemptedAddressMode = ADDRESS_MODE.SINGLE; + } else { + const singleAddressFeatureEnabled = yield call(checkForFeatureFlag, SINGLE_ADDRESS_FEATURE_TOGGLE); + const storedAddressMode = walletUtils.getAddressMode(network); + + attemptedAddressMode = decideAddressMode({ singleAddressFeatureEnabled, storedAddressMode }); - const scanPolicy = attemptedAddressMode === ADDRESS_MODE.SINGLE - ? { policy: SCANNING_POLICY.SINGLE_ADDRESS } - : { policy: SCANNING_POLICY.GAP_LIMIT, gapLimit: hathorLibConstants.GAP_LIMIT }; + scanPolicy = attemptedAddressMode === ADDRESS_MODE.SINGLE + ? { policy: SCANNING_POLICY.SINGLE_ADDRESS } + : { policy: SCANNING_POLICY.GAP_LIMIT, gapLimit: hathorLibConstants.GAP_LIMIT }; + } // We are offline, the connection object is yet to be created yield put(isOnlineUpdate({ isOnline: false })); - // For now, the wallet service does not support hardware wallet, so default to the old facade - const useWalletService = hardware ? false : yield call(isWalletServiceEnabled); + // For now, the wallet service does not support hardware wallet, so default to the old facade. + // Web3Auth single-key wallets are also not supported by wallet-service yet (RFC #46 §1.9 defers). + const useWalletService = (isWeb3Auth || hardware) + ? false + : yield call(isWalletServiceEnabled); const enableAtomicSwap = yield call(isAtomicSwapEnabled); let customTokens = []; @@ -250,23 +288,57 @@ export function* startWallet(action) { dispatch(reloadingWallet()); }; - if (!(words || xpub)) { - const accessData = yield storage.getAccessData(); - xpriv = cryptoUtils.decryptData(accessData.mainKey, pin); - } - - const walletConfig = { - seed: words, - xpriv, - xpub, - passphrase, - connection, - beforeReloadCallback, - storage, - scanPolicy, - }; + if (isWeb3Auth) { + // First-login: privateKey + publicKey come from action.payload. + // Restore: decrypt the persisted singleKeyPrivateKey using the pin and + // pass it back to the HathorWallet constructor — the constructor + // requires exactly one of seed/xpriv/xpub/privateKey, so we cannot + // construct without it even when storage already has the access data. + let restoredPrivateKey; + let restoredPublicKey; + if (isWeb3AuthRestore) { + restoredPrivateKey = yield call([storage, 'getSingleKeyPrivateKey'], pin); + // earlyAccessData was read above; singleKeyPublicKey holds the + // persisted DER-hex public key set by generateAccessDataFromPrivateKey. + // It is optional — the HathorWallet constructor derives it from + // privateKey when omitted — but passing it lets the constructor + // validate the pair. + restoredPublicKey = earlyAccessData?.singleKeyPublicKey; + } + const walletConfig = { + privateKey: isWeb3AuthFirstLogin ? privateKey : restoredPrivateKey, + publicKey: isWeb3AuthFirstLogin ? publicKey : restoredPublicKey, + connection, + beforeReloadCallback, + storage, + scanPolicy, + }; + wallet = new HathorWallet(walletConfig); + // Register the unified getSignatureForTx as the external signer. + // It detects `singleKeyMode` internally and routes to single-key signing + // via buildSigningKeyResolver; for HD wallets it derives from xpriv. + wallet.setExternalTxSigningMethod(async (tx, walletStorage, pinCode) => ( + transactionUtils.getSignatureForTx(tx, walletStorage, pinCode) + )); + } else { + if (!(words || xpub)) { + const accessData = yield storage.getAccessData(); + xpriv = cryptoUtils.decryptData(accessData.mainKey, pin); + } - wallet = new HathorWallet(walletConfig); + const walletConfig = { + seed: words, + xpriv, + xpub, + passphrase, + connection, + beforeReloadCallback, + storage, + scanPolicy, + }; + + wallet = new HathorWallet(walletConfig); + } } setGlobalWallet(wallet); @@ -837,6 +909,17 @@ export function* refreshSharedAddress() { export function* onWalletReset() { const wallet = getGlobalWallet(); + // Web3Auth cleanup: terminate the SDK session and clear the Redux + // identity (walletType + email). Idempotent: safe to call for non-web3auth + // wallets (logout is a no-op when no SDK session exists, and the action + // dispatches just overwrite already-null state). The persisted + // WEB3AUTH_WALLET_TYPE_KEY / WEB3AUTH_EMAIL_KEY entries are erased by the + // LOCAL_STORE.resetStorage() call below, since both keys are registered in + // the storage layer's storageKeys list. + yield call(web3authLogout); + yield put(setWalletType(null)); + yield put(setWeb3authEmail(null)); + localStorage.removeItem(IGNORE_WS_TOGGLE_FLAG); // Clear per-network address mode preferences. LOCAL_STORE.resetStorage() // only removes keys in its static storageKeys list, but addressMode keys diff --git a/src/sagas/web3auth.js b/src/sagas/web3auth.js new file mode 100644 index 000000000..d5d1fb5c0 --- /dev/null +++ b/src/sagas/web3auth.js @@ -0,0 +1,257 @@ +/** + * Copyright (c) Hathor Labs and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +import { Web3AuthNoModal } from '@web3auth/no-modal'; +import { CHAIN_NAMESPACES, WALLET_ADAPTERS } from '@web3auth/base'; +import { CommonPrivateKeyProvider } from '@web3auth/base-provider'; +import { AuthAdapter } from '@web3auth/auth-adapter'; +import { PrivateKey } from 'bitcore-lib'; +import { + WEB3AUTH_CONFIG, + WEB3AUTH_WALLET_TYPE_KEY, + WEB3AUTH_EMAIL_KEY, +} from '../constants'; +import { setWalletType, setWeb3authEmail } from '../actions'; +import LOCAL_STORE from '../storage'; + +let web3authInstance = null; + +export const WEB3AUTH_ERROR_TYPES = Object.freeze({ + USER_CANCELLED: 'user_cancelled', + NETWORK: 'network', + VERIFIER_CONFIG: 'verifier_config', + MFA_REQUIRED: 'mfa_required', + KEY_DERIVATION: 'key_derivation', + UNKNOWN: 'unknown', +}); + +/** + * Map a Web3Auth SDK error to one of the WEB3AUTH_ERROR_TYPES values. + * + * The SDK does not expose a stable error enum; we string-match on message + * patterns we have observed in practice. Unknown patterns fall back to UNKNOWN + * so the observability layer can surface new cases. + */ +export function classifyWeb3AuthError(err) { + if (!err) return WEB3AUTH_ERROR_TYPES.UNKNOWN; + const msg = String(err.message || err).toLowerCase(); + + if ( + msg.includes('user closed') + || msg.includes('user_cancelled') + || msg.includes('user cancelled') + ) { + return WEB3AUTH_ERROR_TYPES.USER_CANCELLED; + } + if (msg.includes('network') || msg.includes('timeout') || msg.includes('fetch')) { + return WEB3AUTH_ERROR_TYPES.NETWORK; + } + if ( + msg.includes('verifier') + || msg.includes('jwt') + || msg.includes('invalid_token') + || msg.includes('not configured for') + ) { + return WEB3AUTH_ERROR_TYPES.VERIFIER_CONFIG; + } + if (msg.includes('mfa') || msg.includes('factor')) { + return WEB3AUTH_ERROR_TYPES.MFA_REQUIRED; + } + if (msg.includes('invalid') && msg.includes('key')) { + return WEB3AUTH_ERROR_TYPES.KEY_DERIVATION; + } + return WEB3AUTH_ERROR_TYPES.UNKNOWN; +} + +/** + * Select the Web3Auth config matching the current Hathor network. + * + * Throws a controlled error if the matching entry is incomplete (e.g., mainnet + * has not been provisioned in the dashboard yet). Callers surface the error to + * the user instead of silently logging into the wrong project. + * + * @param {'testnet'|'mainnet'} hathorNetwork + */ +export function getWeb3AuthConfig(hathorNetwork) { + const cfg = WEB3AUTH_CONFIG[hathorNetwork]; + if (!cfg) { + throw new Error(`Unknown Hathor network: ${hathorNetwork}`); + } + if (!cfg.clientId || !cfg.googleClientId) { + throw new Error( + `Web3Auth is not configured for ${hathorNetwork} yet. ` + + 'Please contact support.' + ); + } + return cfg; +} + +/** + * Lazy singleton: build the Web3Auth SDK on first use. + * + * Top-level SDK construction must be avoided because it touches crypto + * primitives that may not yet be initialized when the module is first + * imported. Subsequent calls return the cached instance. + * + * @param {'testnet'|'mainnet'} hathorNetwork + * @returns {Promise} + */ +async function getWeb3AuthInstance(hathorNetwork) { + if (web3authInstance) return web3authInstance; + + const cfg = getWeb3AuthConfig(hathorNetwork); + + const privateKeyProvider = new CommonPrivateKeyProvider({ + config: { + chainConfig: { + chainNamespace: CHAIN_NAMESPACES.OTHER, + chainId: '0x1', + rpcTarget: 'https://node1.mainnet.hathor.network/v1a/', + displayName: 'Hathor Network', + ticker: 'HTR', + tickerName: 'Hathor', + }, + }, + }); + + web3authInstance = new Web3AuthNoModal({ + clientId: cfg.clientId, + web3AuthNetwork: cfg.network, + privateKeyProvider, + }); + + const authAdapter = new AuthAdapter({ + adapterSettings: { + uxMode: 'popup', + loginConfig: { + google: { + verifier: cfg.verifier, + typeOfLogin: 'google', + clientId: cfg.googleClientId, + }, + ...(cfg.appleClientId + ? { + apple: { + verifier: cfg.appleVerifier, + typeOfLogin: 'apple', + clientId: cfg.appleClientId, + }, + } + : {}), + }, + mfaLevel: 'mandatory', + }, + privateKeyProvider, + }); + web3authInstance.configureAdapter(authAdapter); + + await web3authInstance.init(); + return web3authInstance; +} + +/** + * Perform social login via Web3Auth. + * + * Triggers the OAuth popup, requires MFA setup on first login, and returns the + * raw secp256k1 private key plus the user's email. Throws when the user + * cancels, the network is unreachable, or the verifier rejects the JWT. + * + * @param {'google'|'apple'} provider + * @param {'testnet'|'mainnet'} hathorNetwork + * @returns {Promise<{ privateKey: string, email: string }>} + */ +export async function web3authLogin(provider, hathorNetwork) { + const web3auth = await getWeb3AuthInstance(hathorNetwork); + await web3auth.connectTo(WALLET_ADAPTERS.AUTH, { + loginProvider: provider, + curve: 'secp256k1', + mfaLevel: 'mandatory', + }); + + const userInfo = await web3auth.getUserInfo(); + const email = userInfo?.email || userInfo?.name || ''; + const privateKey = await web3auth.provider.request({ method: 'private_key' }); + + return { privateKey, email }; +} + +/** + * Derive the 33-byte compressed public key hex from a raw private key hex. + * + * The wallet-lib will also derive this internally; we precompute it so the + * caller can pass both privateKey + publicKey into HathorWallet and into + * initWeb3AuthStorage, matching the API the wallet-lib's + * generateAccessDataFromPrivateKey expects. + * + * @param {string} privateKeyHex + * @returns {string} compressed public key hex + */ +export function derivePublicKey(privateKeyHex) { + return new PrivateKey(privateKeyHex).toPublicKey().toString(); +} + +/** + * Persist Web3Auth identity to localStorage and Redux. + * + * Called immediately after a successful login so a subsequent app restart + * restores the walletType + email and lets the user unlock with PIN alone. + * + * @param {Function} dispatch Redux dispatch + * @param {'web3auth'} walletType + * @param {string} email + */ +export function persistWeb3AuthState(dispatch, walletType, email) { + LOCAL_STORE.setItem(WEB3AUTH_WALLET_TYPE_KEY, walletType); + if (email) { + LOCAL_STORE.setItem(WEB3AUTH_EMAIL_KEY, email); + } + dispatch(setWalletType(walletType)); + dispatch(setWeb3authEmail(email)); +} + +/** + * Restore walletType + email from localStorage into Redux on app startup. + * + * @param {Function} dispatch Redux dispatch + */ +export function restoreWeb3AuthState(dispatch) { + const walletType = LOCAL_STORE.getItem(WEB3AUTH_WALLET_TYPE_KEY); + const email = LOCAL_STORE.getItem(WEB3AUTH_EMAIL_KEY); + if (walletType) dispatch(setWalletType(walletType)); + if (email) dispatch(setWeb3authEmail(email)); +} + +/** + * Log out of Web3Auth: clears the SDK session and drops the singleton. + * + * Idempotent: calling when no session exists is a no-op. Errors are swallowed + * (logged) because logout failures must not prevent the wallet-side reset + * from completing. + */ +export async function web3authLogout() { + try { + if (web3authInstance) { + await web3authInstance.logout(); + } + } catch (err) { + // eslint-disable-next-line no-console + console.warn('[web3auth] logout error', err); + } + web3authInstance = null; +} + +/** + * Remove walletType + email from localStorage and reset Redux state. + * + * @param {Function} dispatch Redux dispatch + */ +export function cleanWeb3AuthState(dispatch) { + LOCAL_STORE.removeItem(WEB3AUTH_WALLET_TYPE_KEY); + LOCAL_STORE.removeItem(WEB3AUTH_EMAIL_KEY); + dispatch(setWalletType(null)); + dispatch(setWeb3authEmail(null)); +} diff --git a/src/screens/LockedWallet.js b/src/screens/LockedWallet.js index a48823214..736572020 100644 --- a/src/screens/LockedWallet.js +++ b/src/screens/LockedWallet.js @@ -15,6 +15,7 @@ import { GlobalModalContext, MODAL_TYPES } from '../components/GlobalModal'; import { resolveLockWalletPromise, startWalletRequested, walletReset } from '../actions'; import { colors } from '../constants'; import LOCAL_STORE from '../storage'; +import { isSingleKeyWallet } from '../reducers'; /** * When wallet is locked show this screen and ask for PIN to unlock the wallet @@ -32,6 +33,7 @@ function LockedWallet() { const formRef = useRef(null); const context = useContext(GlobalModalContext); const lockWalletPromise = useSelector(state => state.lockWalletPromise); + const isWeb3Auth = useSelector(isSingleKeyWallet); const dispatch = useDispatch(); const navigate = useNavigate(); @@ -83,7 +85,13 @@ function LockedWallet() { setLoading(true); - dispatch(startWalletRequested({ pin })); + if (isWeb3Auth) { + // Web3Auth single-key wallet: the saga's restore branch decrypts the + // persisted singleKeyPrivateKey using the PIN — no seed/xpub needed. + dispatch(startWalletRequested({ pin })); + } else { + dispatch(startWalletRequested({ pin })); + } } /** diff --git a/src/screens/Settings.js b/src/screens/Settings.js index 4bfaf5a24..3fe80df1b 100644 --- a/src/screens/Settings.js +++ b/src/screens/Settings.js @@ -23,6 +23,7 @@ import { PRIVACY_POLICY_URL, TERMS_OF_SERVICE_URL, REOWN_FEATURE_TOGGLE, SINGLE_ import { walletReset, reloadWalletRequested } from '../actions'; import { getGlobalWallet } from '../modules/wallet'; import LOCAL_STORE from '../storage'; +import { isSingleKeyWallet } from '../reducers'; /** * Settings screen @@ -54,6 +55,9 @@ function Settings() { const singleAddressEnabled = useSelector(state => state.featureToggles[SINGLE_ADDRESS_FEATURE_TOGGLE]); const addressMode = useSelector(state => state.addressMode); const network = useSelector(state => state.networkSettings.data.network); + const isWeb3Auth = useSelector(isSingleKeyWallet); + const web3authEmail = useSelector((state) => state.web3authEmail); + const displayEmail = web3authEmail || ''; const connectedSessionsCount = Object.keys(reownSessions).length; const isHardwareWallet = LOCAL_STORE.isHardwareWallet(); @@ -378,7 +382,7 @@ function Settings() {

    )} - {!useWalletService && reownEnabled && ( + {!useWalletService && reownEnabled && !isWeb3Auth && (

    {t`Reown:`}{' '} {t`Connected Sessions: ${connectedSessionsCount}`} @@ -402,7 +406,11 @@ function Settings() {

    setShowTimestamp(!showTimestamp)}>{t`Date and time:`} {showTimestamp ? hathorLib.dateFormatter.dateToTimestamp(now) : now.toString()}

    - {!isHardwareWallet && } + {!isHardwareWallet && ( + + )}
    diff --git a/src/screens/Signin.js b/src/screens/Signin.js index 7ae904eb9..59e757765 100644 --- a/src/screens/Signin.js +++ b/src/screens/Signin.js @@ -5,21 +5,37 @@ * LICENSE file in the root directory of this source tree. */ -import React from 'react'; +import React, { useState } from 'react'; import { t } from 'ttag' +import { useDispatch } from 'react-redux'; +import { useLocation, useNavigate } from 'react-router-dom'; import logo from '../assets/images/hathor-logo.png'; import InitialImages from '../components/InitialImages'; -import { useNavigate } from 'react-router-dom'; +import ChoosePassword from '../components/ChoosePassword'; +import ChoosePin from '../components/ChoosePin'; +import LOCAL_STORE from '../storage'; +import { startWalletRequested } from '../actions'; /** - * Screen used to select between create a new wallet or import an old one + * Screen used to select between create a new wallet or import an old one. + * + * When reached from the Web3Auth flow, `location.state.walletType === 'web3auth'` + * triggers a PIN + password mini-flow that bootstraps a single-key wallet from + * the social-login private key, instead of showing the menu options. * * @memberof Screens */ function Signin() { const navigate = useNavigate(); + const dispatch = useDispatch(); + const location = useLocation(); + const web3authState = location.state || {}; + const isWeb3AuthFlow = web3authState.walletType === 'web3auth'; + + const [askPIN, setAskPIN] = useState(false); + const [password, setPassword] = useState(''); /** * Go to the new wallet screen @@ -35,17 +51,81 @@ function Signin() { navigate('/load_wallet/'); } + /** + * User succeeded on choosing a password in the Web3Auth flow, advance to PIN. + * @param {string} newPassword New password, already validated + */ + const passwordSuccess = (newPassword) => { + setPassword(newPassword); + setAskPIN(true); + } + + /** + * Going back from the Choose PIN component to Choose Password. + */ + const pinBack = () => { + setAskPIN(false); + } + + /** + * Going back from the Choose Password component returns to the Web3Auth + * provider picker so the user can pick a different login method. + */ + const passwordBack = () => { + navigate('/web3auth_login/'); + } + + /** + * After choosing a PIN, persist the Web3Auth single-key storage, dispatch + * the wallet start, and forward to the loading screen. `replace: true` + * drops the navigation state so a subsequent navigate(-1) cannot leak the + * privateKey back into the URL history. + * @param {string} newPin New pin, already validated + */ + const pinSuccess = async (newPin) => { + const { privateKey, publicKey } = web3authState; + LOCAL_STORE.unlock(); + await LOCAL_STORE.initWeb3AuthStorage(privateKey, publicKey, newPin, password); + LOCAL_STORE.markBackupDone(); + LOCAL_STORE.open(); + dispatch(startWalletRequested({ + privateKey, + publicKey, + pin: newPin, + password, + walletType: 'web3auth', + })); + // Clear sensitive in-memory copy of the password. + setPassword(''); + navigate('/loading_addresses/', { replace: true }); + } + + const renderWeb3AuthFlow = () => { + if (askPIN) { + return ; + } + return ; + } + + const renderMenu = () => { + return ( + <> +

    {t`You can start a new wallet or import data from a wallet that already exists.`}

    +
    + + + +
    + + ); + } + return (
    -

    {t`You can start a new wallet or import data from a wallet that already exists.`}

    -
    - - - -
    + {isWeb3AuthFlow ? renderWeb3AuthFlow() : renderMenu()}
    diff --git a/src/screens/WalletType.js b/src/screens/WalletType.js index 395cf7098..c747f2428 100644 --- a/src/screens/WalletType.js +++ b/src/screens/WalletType.js @@ -18,7 +18,7 @@ import { useDispatch, useSelector } from 'react-redux'; import { updateLedgerClosed } from '../actions/index'; import LOCAL_STORE from '../storage'; import { useNavigate } from 'react-router-dom'; -import { LEDGER_GUIDE_URL } from '../constants'; +import { LEDGER_GUIDE_URL, WEB3AUTH_FEATURE_TOGGLE } from '../constants'; import helpers from '../utils/helpers'; /** @@ -30,6 +30,9 @@ function WalletType() { const navigate = useNavigate(); const dispatch = useDispatch(); const ledgerClosed = useSelector((state) => state.ledgerWasClosed); + const web3authEnabled = useSelector( + (state) => state.featureToggles?.[WEB3AUTH_FEATURE_TOGGLE] || false + ); useEffect(() => { // Update Sentry when user started wallet now @@ -55,6 +58,14 @@ function WalletType() { navigate('/hardware_wallet/'); } + /** + * Go to the Web3Auth login screen (Sign in with social). + */ + const goToWeb3AuthLogin = () => { + LOCAL_STORE.setHardwareWallet(false); + navigate('/web3auth_login/'); + } + /** * Method called to open ledger guide * @@ -87,6 +98,11 @@ function WalletType() {
    + {web3authEnabled && ( +
    + +
    + )}
    diff --git a/src/screens/Web3AuthLogin.js b/src/screens/Web3AuthLogin.js new file mode 100644 index 000000000..a095befa0 --- /dev/null +++ b/src/screens/Web3AuthLogin.js @@ -0,0 +1,146 @@ +/** + * Copyright (c) Hathor Labs and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +import React, { useState } from 'react'; +import { useDispatch } from 'react-redux'; +import { useNavigate } from 'react-router-dom'; +import { t } from 'ttag'; +import { + web3authLogin, + derivePublicKey, + persistWeb3AuthState, + classifyWeb3AuthError, + WEB3AUTH_ERROR_TYPES, +} from '../sagas/web3auth'; +import { WEB3AUTH_CONFIG } from '../constants'; +import LOCAL_STORE from '../storage'; +import Web3AuthErrorDialog from '../components/Web3AuthErrorDialog'; +import logo from '../assets/images/hathor-logo.png'; +import googleLogo from '../assets/web3auth-providers/google.svg'; +import appleLogo from '../assets/web3auth-providers/apple.svg'; +import emailIcon from '../assets/web3auth-providers/email.svg'; + +/** + * Choose a social provider to sign in via Web3Auth. + * + * Renders three provider cards — Google (active), Apple (active when + * configured), Email (inert, wired in PR3) — followed by a divider and the + * existing seed-words / new-wallet entry points. + * + * @memberof Screens + */ +function Web3AuthLogin() { + const dispatch = useDispatch(); + const navigate = useNavigate(); + // Read network straight from LOCAL_STORE — the Redux network slice is only + // hydrated from localStorage after a wallet starts (App.js#loadStorageState), + // so before login it still holds the mainnet default regardless of the user's + // selection in NetworkSettingsRecovery. + const persistedNetwork = LOCAL_STORE.getNetworkSettings()?.network || 'mainnet'; + const network = persistedNetwork; + const cfg = WEB3AUTH_CONFIG[network] || WEB3AUTH_CONFIG.testnet; + const appleEnabled = Boolean(cfg.appleClientId); + + const [errorType, setErrorType] = useState(null); + const [loading, setLoading] = useState(false); + + const handleSocialLogin = async (provider) => { + if (loading) return; + setLoading(true); + try { + const { privateKey, email } = await web3authLogin(provider, network); + const publicKey = derivePublicKey(privateKey); + persistWeb3AuthState(dispatch, 'web3auth', email); + navigate('/signin/', { + state: { privateKey, publicKey, email, walletType: 'web3auth' }, + }); + } catch (err) { + const type = classifyWeb3AuthError(err); + // eslint-disable-next-line no-console + console.error('[web3auth] login failed', { provider, network, type, err }); + if (type === WEB3AUTH_ERROR_TYPES.USER_CANCELLED) { + // Silent: user closed the OAuth popup intentionally. + return; + } + setErrorType(type); + } finally { + setLoading(false); + } + }; + + const goToSeedImport = () => navigate('/wallet_type/'); + const goToNewWallet = () => navigate('/new_wallet/'); + + return ( +
    +
    +
    + +

    {t`Sign in to Hathor`}

    + +
    + + + + + +
    + +
    + {t`OR`} +
    + +
    + + +
    +
    +
    + + {errorType && ( + { + setErrorType(null); + }} + onCancel={() => setErrorType(null)} + /> + )} +
    + ); +} + +export default Web3AuthLogin; diff --git a/src/screens/Web3AuthRecovery.js b/src/screens/Web3AuthRecovery.js new file mode 100644 index 000000000..00ad2ea41 --- /dev/null +++ b/src/screens/Web3AuthRecovery.js @@ -0,0 +1,33 @@ +/** + * Copyright (c) Hathor Labs and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +import React from 'react'; +import { t } from 'ttag'; + +/** + * Placeholder for the Web3Auth recovery flow. + * + * The actual recovery copy and link to the Web3Auth-hosted factor management + * webview is deferred to a follow-up. PR1 just registers the route so links + * pointing here from Settings (when added later) don't 404. + * + * @memberof Screens + */ +function Web3AuthRecovery() { + return ( +
    +
    +
    +

    {t`Recovery`}

    +

    {t`Web3Auth recovery is managed through the Web3Auth-hosted recovery portal. A direct link from this screen will be added in a follow-up.`}

    +
    +
    +
    + ); +} + +export default Web3AuthRecovery; diff --git a/src/storage.js b/src/storage.js index 0b713130a..10814dbe4 100644 --- a/src/storage.js +++ b/src/storage.js @@ -7,7 +7,11 @@ import CryptoJS from 'crypto-js'; import { MemoryStore, Storage, walletUtils, config, cryptoUtils, WalletType } from "@hathor/wallet-lib"; -import { VERSION } from "./constants"; +import { + VERSION, + WEB3AUTH_WALLET_TYPE_KEY, + WEB3AUTH_EMAIL_KEY, +} from "./constants"; export const WALLET_VERSION_KEY = 'localstorage:version'; // This key holds the storage version to indicate the migration strategy @@ -44,6 +48,8 @@ export const storageKeys = [ REGISTERED_TOKENS_KEY, REGISTERED_NANOCONTRACTS_KEY, NETWORK_TOKENS_KEY, + WEB3AUTH_WALLET_TYPE_KEY, + WEB3AUTH_EMAIL_KEY, ]; class HybridStore extends MemoryStore { @@ -325,6 +331,63 @@ export class LocalStorageStore { return storage; } + /** + * Initialize the local storage for a Web3Auth single-key wallet. + * + * Generates access data containing the encrypted privateKey via + * walletUtils.generateAccessDataFromPrivateKey, persists it through the + * HybridStore (which also saves to localStorage), and marks the wallet as + * non-hardware and started. Mirrors the seed-based initStorage flow so the + * rest of the app sees a normally-initialized wallet, except access data + * carries `singleKeyMode: true` and `singleKeyPrivateKey` instead of `mainKey`. + * + * @param {string} privateKey 32-byte hex private key from Web3Auth + * @param {string} publicKey 33-byte compressed public key hex + * @param {string} pin User PIN, used to encrypt the privateKey at rest + * @param {string} password User password (kept for API parity with + * initStorage; currently unused by generateAccessDataFromPrivateKey). + * @returns {Promise} the initialized storage instance + */ + async initWeb3AuthStorage(privateKey, publicKey, pin, password) { + this._storage = null; + this.setHardwareWallet(false); + const accessData = walletUtils.generateAccessDataFromPrivateKey( + privateKey, + publicKey, + { pin, password } + ); + this.setItem(ACCESS_DATA_KEY, accessData); + const storage = this.getStorage(); + await storage.saveAccessData(accessData); + this._storage = storage; + this.markWalletAsStarted(); + this.updateStorageVersion(); + return storage; + } + + /** + * Decrypt and return the raw Web3Auth private key from access data. + * Thin wrapper over the wallet-lib's storage.getSingleKeyPrivateKey. + * + * @param {string} pin User PIN + * @returns {Promise} 32-byte hex private key + */ + async getWeb3AuthPrivateKey(pin) { + const storage = this.getStorage(); + return storage.getSingleKeyPrivateKey(pin); + } + + /** + * Return the cached Web3Auth public key from access data. + * + * @returns {Promise} 33-byte compressed public key hex + */ + async getWeb3AuthPublicKey() { + const storage = this.getStorage(); + const accessData = await storage.getAccessData(); + return accessData?.singleKeyPublicKey; + } + /** * Get a Storage instance for the loaded wallet. * @returns {Storage|null} Storage instance if the wallet is loaded. diff --git a/src/styles/web3auth.scss b/src/styles/web3auth.scss new file mode 100644 index 000000000..dee436ec6 --- /dev/null +++ b/src/styles/web3auth.scss @@ -0,0 +1,77 @@ +/** + * Web3Auth social login screen styles. + * + * Expects the following variables to be defined by the importing file: + * $purpleHathor, $purpleHathorHover + */ + +.web3auth-login { + display: flex; + flex-direction: column; + align-items: center; + width: 100%; + + &__cards { + display: flex; + flex-direction: row; + justify-content: space-between; + gap: 1rem; + width: 100%; + margin-top: 2rem; + } + + &__card { + flex: 1 1 0; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + padding: 1.5rem 1rem; + border: 1px solid $purpleHathor; + border-radius: 0.5rem; + background-color: white; + transition: box-shadow 0.15s ease-in-out; + cursor: pointer; + + &:hover:not(:disabled) { + box-shadow: 0 0.25rem 0.75rem rgba(0, 0, 0, 0.08); + } + + &:disabled { + opacity: 0.4; + cursor: not-allowed; + } + } + + &__card-logo { + width: 2.5rem; + height: 2.5rem; + margin-bottom: 0.75rem; + } + + &__divider { + width: 100%; + text-align: center; + margin: 1.5rem 0; + position: relative; + color: #6c757d; + + &::before { + content: ''; + position: absolute; + top: 50%; + left: 0; + right: 0; + height: 1px; + background-color: #ddd; + z-index: 0; + } + + span { + position: relative; + background-color: white; + padding: 0 0.75rem; + z-index: 1; + } + } +} diff --git a/src/web3auth-crypto-shim.js b/src/web3auth-crypto-shim.js new file mode 100644 index 000000000..9fef8b5cc --- /dev/null +++ b/src/web3auth-crypto-shim.js @@ -0,0 +1,74 @@ +/** + * Copyright (c) Hathor Labs and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +/** + * Crypto shim for the Web3Auth SDK in the renderer. + * + * Webpack's `node:` scheme plugin (see config-overrides.js) rewrites + * `node:crypto` to `crypto`, which webpack resolves to this shim via the + * `fallback.crypto` alias. The shim re-exports every symbol crypto-browserify + * provides and additionally exposes: + * - `webcrypto`: the browser's WebCrypto API (globalThis.crypto), needed by + * newer @web3auth modules. + * - a default export pointing at the whole module, needed by nested older + * `@toruslabs/eccrypto` builds that do `import nodeCrypto from 'crypto'`. + * + * Other consumers (bitcore-lib, etc.) keep working because every + * crypto-browserify named export is re-exported unchanged. + */ +import cryptoBrowserify from 'crypto-browserify'; + +const webcrypto = typeof globalThis !== 'undefined' && globalThis.crypto + ? globalThis.crypto + : undefined; + +export const { + randomBytes, + rng, + pseudoRandomBytes, + prng, + createHash, + Hash, + createHmac, + Hmac, + getHashes, + pbkdf2, + pbkdf2Sync, + Cipher, + createCipher, + Cipheriv, + createCipheriv, + Decipher, + createDecipher, + Decipheriv, + createDecipheriv, + getCiphers, + listCiphers, + DiffieHellmanGroup, + createDiffieHellmanGroup, + getDiffieHellman, + createDiffieHellman, + DiffieHellman, + createSign, + Sign, + createVerify, + Verify, + createECDH, + publicEncrypt, + privateEncrypt, + publicDecrypt, + privateDecrypt, + randomFill, + randomFillSync, +} = cryptoBrowserify; + +export { webcrypto }; + +export default { + ...cryptoBrowserify, + webcrypto, +};