diff --git a/.changeset/stupid-bulldogs-wash.md b/.changeset/stupid-bulldogs-wash.md new file mode 100644 index 00000000..36d96f34 --- /dev/null +++ b/.changeset/stupid-bulldogs-wash.md @@ -0,0 +1,5 @@ +--- +'@wagmi/connectors': minor +--- + +Added `VenlyConnector` \ No newline at end of file diff --git a/packages/connectors/.gitignore b/packages/connectors/.gitignore index a2ffdde1..17cd69b5 100644 --- a/packages/connectors/.gitignore +++ b/packages/connectors/.gitignore @@ -5,5 +5,6 @@ ledger/** metaMask/** mock/** safe/** +venly/** walletConnect/** walletConnectLegacy/** \ No newline at end of file diff --git a/packages/connectors/README.md b/packages/connectors/README.md index 660c70d7..ffce274d 100644 --- a/packages/connectors/README.md +++ b/packages/connectors/README.md @@ -40,6 +40,7 @@ const config = createConfig({ - [`MockConnector`](/packages/connectors/src/mock.ts) - [`SafeConnector`](/packages/connectors/src/safe.ts) - [`WalletConnectConnector`](/packages/connectors/src/walletConnect.ts) +- [`VenlyConnector`](/packages/connectors/src/venly.ts) ## Contributing diff --git a/packages/connectors/package.json b/packages/connectors/package.json index 8b754cec..2d0920ad 100644 --- a/packages/connectors/package.json +++ b/packages/connectors/package.json @@ -25,6 +25,7 @@ "@ledgerhq/connect-kit-loader": "^1.1.0", "@safe-global/safe-apps-provider": "^0.17.1", "@safe-global/safe-apps-sdk": "^8.0.0", + "@venly/web3-provider": "^3.2.3", "@walletconnect/ethereum-provider": "2.9.2", "@walletconnect/utils": "2.9.2", "@walletconnect/legacy-provider": "^2.0.0", @@ -68,6 +69,10 @@ "types": "./dist/safe.d.ts", "default": "./dist/safe.js" }, + "./venly": { + "types": "./dist/venly.d.ts", + "default": "./dist/venly.js" + }, "./walletConnect": { "types": "./dist/walletConnect.d.ts", "default": "./dist/walletConnect.js" @@ -85,6 +90,7 @@ "/metaMask", "/mock", "/safe", + "/venly", "/walletConnect", "/walletConnectLegacy", "/dist" diff --git a/packages/connectors/src/venly.test.ts b/packages/connectors/src/venly.test.ts new file mode 100644 index 00000000..344d87ac --- /dev/null +++ b/packages/connectors/src/venly.test.ts @@ -0,0 +1,16 @@ +import { describe, expect, it } from 'vitest' + +import { testChains } from '../test' +import { VenlyConnector } from './venly' + +describe('VenlyConnector', () => { + it('inits', () => { + const connector = new VenlyConnector({ + chains: testChains, + options: { + clientId: 'wagmi', + }, + }) + expect(connector.name).toEqual('Venly') + }) +}) diff --git a/packages/connectors/src/venly.ts b/packages/connectors/src/venly.ts new file mode 100644 index 00000000..5fa49221 --- /dev/null +++ b/packages/connectors/src/venly.ts @@ -0,0 +1,185 @@ +import { VenlyProvider, VenlyProviderOptions } from '@venly/web3-provider' +import type { Chain } from '@wagmi/chains' +import { + SwitchChainError, + UserRejectedRequestError, + createWalletClient, + custom, + getAddress, + numberToHex, +} from 'viem' + +import { Connector } from './base' +import { ChainNotConfiguredForConnectorError } from './errors' +import type { WalletClient } from './types' +import { normalizeChainId } from './utils/normalizeChainId' + +type Options = Omit & { + /** + * Fallback Ethereum JSON RPC URL + * @default "" + */ + jsonRpcUrl?: string + /** + * Fallback Ethereum Chain ID + * @default 1 + */ + chainId?: number + /** + * Whether or not to reload dapp automatically after disconnect. + */ + reloadOnDisconnect?: boolean +} + +export class VenlyConnector extends Connector { + readonly id = 'venly' + readonly name = 'Venly' + readonly ready = true + + client: VenlyProvider = new VenlyProvider() + // client?: VenlyProvider + provider: any + + constructor({ chains, options }: { chains?: Chain[]; options: Options }) { + super({ + chains, + options, + }) + } + + async connect({ chainId }: { chainId?: number } = {}) { + try { + if (!this.provider) + this.provider = await this.client.createProvider(this.options) + + this.provider.on('accountsChanged', this.onAccountsChanged) + this.provider.on('chainChanged', this.onChainChanged) + this.provider.on('disconnect', this.onDisconnect) + + this.emit('message', { type: 'connecting' }) + + // Switch to chain if provided + let id = await this.getChainId() + let unsupported = this.isChainUnsupported(id) + chainId = chainId ?? this.chains[0]?.id + if (chainId && id !== chainId) { + const chain = await this.switchChain(chainId) + id = chain.id + unsupported = this.isChainUnsupported(id) + } + const account = await this.getAccount() + + return { + account, + chain: { id, unsupported }, + } + } catch (error) { + if ( + /(user closed modal|accounts received is empty)/i.test( + (error as Error).message, + ) + ) + throw new UserRejectedRequestError(error as Error) + throw error + } + } + + async disconnect() { + if (!this.provider) return + + await this.client.logout() + this.provider.removeListener('accountsChanged', this.onAccountsChanged) + this.provider.removeListener('chainChanged', this.onChainChanged) + this.provider.removeListener('disconnect', this.onDisconnect) + + this.provider = null + } + + async getAccount() { + const accounts = await this.provider.request({ + method: 'eth_accounts', + }) + // return checksum address + return getAddress(accounts[0] as string) + } + + async getChainId() { + const chainId = await this.provider.request({ + method: 'eth_chainId', + }) + return normalizeChainId(chainId) + } + + getProvider() { + return this.provider + } + + async getWalletClient({ chainId }: { chainId?: number } = {}): Promise { + const provider = this.getProvider() + const account = await this.getAccount() + const chain = this.chains.find((x) => x.id === chainId) + if (!provider) throw new Error('provider is required.') + return createWalletClient({ + account, + chain, + transport: custom(provider), + }) + } + + async isAuthorized() { + try { + this.provider = await this.client.createProvider({ + ...this.options, + skipAuthentication: true, + }) + const authResult = await this.client.checkAuthenticated() + return authResult.isAuthenticated + } catch { + return false + } + } + + async switchChain(chainId: number) { + const id = numberToHex(chainId) + + try { + await this.provider.request({ + method: 'wallet_switchEthereumChain', + params: [{ chainId: id }], + }) + return ( + this.chains.find((x) => x.id === chainId) ?? { + id: chainId, + name: `Chain ${id}`, + network: `${id}`, + nativeCurrency: { name: 'Ether', decimals: 18, symbol: 'ETH' }, + rpcUrls: { default: { http: [''] }, public: { http: [''] } }, + } + ) + } catch (error) { + const chain = this.chains.find((x) => x.id === chainId) + if (!chain) + throw new ChainNotConfiguredForConnectorError({ + chainId, + connectorId: this.id, + }) + + throw new SwitchChainError(error as Error) + } + } + + protected onAccountsChanged = (accounts: string[]) => { + if (accounts.length === 0) this.emit('disconnect') + else this.emit('change', { account: getAddress(accounts[0] as string) }) + } + + protected onChainChanged = (chainId: number | string) => { + const id = normalizeChainId(chainId) + const unsupported = this.isChainUnsupported(id) + this.emit('change', { chain: { id, unsupported } }) + } + + protected onDisconnect = () => { + this.emit('disconnect') + } +} diff --git a/packages/connectors/tsup.config.ts b/packages/connectors/tsup.config.ts index 9c173193..78ce9763 100644 --- a/packages/connectors/tsup.config.ts +++ b/packages/connectors/tsup.config.ts @@ -14,6 +14,7 @@ export default defineConfig( 'src/metaMask.ts', 'src/mock/index.ts', 'src/safe.ts', + 'src/venly.ts', 'src/walletConnect.ts', 'src/walletConnectLegacy.ts', ], diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1b0ca557..436d56e9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -95,6 +95,9 @@ importers: '@safe-global/safe-apps-sdk': specifier: ^8.0.0 version: 8.0.0(typescript@5.0.4) + '@venly/web3-provider': + specifier: ^3.2.3 + version: 3.2.3 '@walletconnect/ethereum-provider': specifier: 2.9.2 version: 2.9.2(@walletconnect/modal@2.6.1)(lokijs@1.5.12) @@ -409,6 +412,56 @@ packages: dev: true optional: true + /@ethereumjs/common@3.2.0: + resolution: {integrity: sha512-pksvzI0VyLgmuEF2FA/JR/4/y6hcPq8OUail3/AvycBaW1d5VSauOZzqGvJ3RTmR4MU35lWE8KseKOsEhrFRBA==} + dependencies: + '@ethereumjs/util': 8.1.0 + crc-32: 1.2.2 + dev: false + + /@ethereumjs/rlp@4.0.1: + resolution: {integrity: sha512-tqsQiBQDQdmPWE1xkkBq4rlSW5QZpLOUJ5RJh2/9fug+q9tnUhuZoVLk7s0scUIKTOzEtR72DFBXI4WiZcMpvw==} + engines: {node: '>=14'} + hasBin: true + dev: false + + /@ethereumjs/tx@4.2.0: + resolution: {integrity: sha512-1nc6VO4jtFd172BbSnTnDQVr9IYBFl1y4xPzZdtkrkKIncBCkdbgfdRV+MiTkJYAtTxvV12GRZLqBFT1PNK6Yw==} + engines: {node: '>=14'} + dependencies: + '@ethereumjs/common': 3.2.0 + '@ethereumjs/rlp': 4.0.1 + '@ethereumjs/util': 8.1.0 + ethereum-cryptography: 2.1.2 + dev: false + + /@ethereumjs/util@8.1.0: + resolution: {integrity: sha512-zQ0IqbdX8FZ9aw11vP+dZkKDkS+kgIvQPHnSAXzP9pLu+Rfu3D3XEeLbicvoXJTYnhZiPmsZUxgdzXwNKxRPbA==} + engines: {node: '>=14'} + dependencies: + '@ethereumjs/rlp': 4.0.1 + ethereum-cryptography: 2.1.2 + micro-ftch: 0.3.1 + dev: false + + /@ethersproject/bignumber@5.7.0: + resolution: {integrity: sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==} + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + bn.js: 5.2.1 + dev: false + + /@ethersproject/bytes@5.7.0: + resolution: {integrity: sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==} + dependencies: + '@ethersproject/logger': 5.7.0 + dev: false + + /@ethersproject/logger@5.7.0: + resolution: {integrity: sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==} + dev: false + /@istanbuljs/schema@0.1.3: resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} engines: {node: '>=8'} @@ -464,10 +517,52 @@ packages: read-yaml-file: 1.1.0 dev: true + /@metamask/eth-json-rpc-middleware@11.0.1: + resolution: {integrity: sha512-Gti6rquLvbb3BSVNT2rLX8TS/fB+senPn6pEDGxCxYI7JheWYTZn3gZoRY8u1KxKIbkylc/id9+aAc0sFnc4Rw==} + engines: {node: '>=14.0.0'} + dependencies: + '@metamask/eth-json-rpc-provider': 1.0.0 + '@metamask/eth-sig-util': 5.1.0 + '@metamask/utils': 5.0.2 + clone: 2.1.2 + eth-block-tracker: 7.1.0 + eth-rpc-errors: 4.0.3 + json-rpc-engine: 6.1.0 + pify: 3.0.0 + safe-stable-stringify: 2.4.1 + transitivePeerDependencies: + - supports-color + dev: false + + /@metamask/eth-json-rpc-provider@1.0.0: + resolution: {integrity: sha512-Bl9FbSNctgh1FRjUX0Gpoo4BwFXBKplcZ198y9/gysUhgOBD4MKqe3V4XzaYXuvB7VhVA9TNH0ZsaK1MnolpWg==} + engines: {node: '>=14.0.0'} + dependencies: + '@metamask/safe-event-emitter': 2.0.0 + json-rpc-engine: 6.1.0 + dev: false + + /@metamask/eth-sig-util@5.1.0: + resolution: {integrity: sha512-mlgziIHYlA9pi/XZerChqg4NocdOgBPB9NmxgXWQO2U2hH8RGOJQrz6j/AIKkYxgCMIE2PY000+joOwXfzeTDQ==} + engines: {node: '>=14.0.0'} + dependencies: + '@ethereumjs/util': 8.1.0 + bn.js: 4.12.0 + ethereum-cryptography: 2.1.2 + ethjs-util: 0.1.6 + tweetnacl: 1.0.3 + tweetnacl-util: 0.15.1 + dev: false + /@metamask/safe-event-emitter@2.0.0: resolution: {integrity: sha512-/kSXhY692qiV1MXu6EeOZvg5nECLclxNXcKCxJ3cXQgYuRymRHpdx/t7JXfsK+JLjwA1e1c1/SBrlQYpusC29Q==} dev: false + /@metamask/safe-event-emitter@3.0.0: + resolution: {integrity: sha512-j6Z47VOmVyGMlnKXZmL0fyvWfEYtKWCA9yGZkU3FCsGZUT5lHGmvaV9JA5F2Y+010y7+ROtR3WMXIkvl/nVzqQ==} + engines: {node: '>=12.0.0'} + dev: false + /@metamask/utils@3.6.0: resolution: {integrity: sha512-9cIRrfkWvHblSiNDVXsjivqa9Ak0RYo/1H6tqTqTbAx+oBK2Sva0lWDHxGchOqA7bySGUJKAWSNJvH6gdHZ0gQ==} engines: {node: '>=14.0.0'} @@ -480,6 +575,19 @@ packages: - supports-color dev: false + /@metamask/utils@5.0.2: + resolution: {integrity: sha512-yfmE79bRQtnMzarnKfX7AEJBwFTxvTyw3nBQlu/5rmGXrjAeAMltoGxO62TFurxrQAFMNa/fEjIHNvungZp0+g==} + engines: {node: '>=14.0.0'} + dependencies: + '@ethereumjs/tx': 4.2.0 + '@types/debug': 4.1.7 + debug: 4.3.4 + semver: 7.3.8 + superstruct: 1.0.3 + transitivePeerDependencies: + - supports-color + dev: false + /@motionone/animation@10.15.1: resolution: {integrity: sha512-mZcJxLjHor+bhcPuIFErMDNyrdb2vJur8lSfMCsuCB4UyV8ILZLvK+t+pg56erv8ud9xQGK/1OGPt10agPrCyQ==} dependencies: @@ -570,6 +678,12 @@ packages: dependencies: '@noble/hashes': 1.3.0 + /@noble/curves@1.1.0: + resolution: {integrity: sha512-091oBExgENk/kGj3AZmtBDMpxQPDtxQABR2B9lb1JbVTs6ytdzZNwvhxQ4MWasRNEzlbEH8jCWFCwhF/Obj5AA==} + dependencies: + '@noble/hashes': 1.3.1 + dev: false + /@noble/ed25519@1.7.3: resolution: {integrity: sha512-iR8GBkDt0Q3GyaVcIu7mSsVIqnFbkbRzGLWlvhwunacoLwt4J3swfKhfaM6rN6WY+TBGoYT1GtT1mIh2/jGbRQ==} dev: false @@ -577,6 +691,11 @@ packages: /@noble/hashes@1.3.0: resolution: {integrity: sha512-ilHEACi9DwqJB0pw7kv+Apvh50jiiSyR/cQ3y4W7lOR5mhvn/50FLUfsnfJz0BDZtl/RR16kXvptiv6q1msYZg==} + /@noble/hashes@1.3.1: + resolution: {integrity: sha512-EbqwksQwz9xDRGfDST86whPBgM65E0OH/pCgqW0GBVzO22bNE+NuIbeTb714+IfSjU3aRk47EUvXIb5bTsenKA==} + engines: {node: '>= 16'} + dev: false + /@noble/secp256k1@1.7.1: resolution: {integrity: sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw==} dev: false @@ -702,12 +821,27 @@ packages: '@noble/hashes': 1.3.0 '@scure/base': 1.1.1 + /@scure/bip32@1.3.1: + resolution: {integrity: sha512-osvveYtyzdEVbt3OfwwXFr4P2iVBL5u1Q3q4ONBfDY/UpOuXmOlbgwc1xECEboY8wIays8Yt6onaWMUdUbfl0A==} + dependencies: + '@noble/curves': 1.1.0 + '@noble/hashes': 1.3.1 + '@scure/base': 1.1.1 + dev: false + /@scure/bip39@1.2.0: resolution: {integrity: sha512-SX/uKq52cuxm4YFXWFaVByaSHJh2w3BnokVSeUJVCv6K7WulT9u2BuNRBhuFl8vAuYnzx9bEu9WgpcNYTrYieg==} dependencies: '@noble/hashes': 1.3.0 '@scure/base': 1.1.1 + /@scure/bip39@1.2.1: + resolution: {integrity: sha512-Z3/Fsz1yr904dduJD0NpiyRHhRYHdcnyh73FZWiV+/qhWi83wNJ3NWolYqCEN+ZWsUz2TWwajJggcRE9r1zUYg==} + dependencies: + '@noble/hashes': 1.3.1 + '@scure/base': 1.1.1 + dev: false + /@solana/buffer-layout@4.0.0: resolution: {integrity: sha512-lR0EMP2HC3+Mxwd4YcnZb0smnaDw7Bl2IQWZiTevRH5ZZBZn6VRWn3/92E3qdU4SSImJkA6IDHawOHAnx/qUvQ==} engines: {node: '>=5.10'} @@ -948,6 +1082,28 @@ packages: '@types/node': 18.11.18 dev: false + /@venly/connect@2.2.1: + resolution: {integrity: sha512-4U5TFtTuwsA2stK2Q6D0p0WyfLy6CFp1z+XsiilBTRZ4JKgHuLkhumeDm2UW0r46Fl92h0TAWepGWlFLfb0TqQ==} + dependencies: + '@types/node': 12.20.55 + es6-promise: 4.2.8 + keycloak-js: 11.0.2 + dev: false + + /@venly/web3-provider@3.2.3: + resolution: {integrity: sha512-/poFuMlznWXAn9LlrSqtBCDAnmKHtt/NhibKSO8LAh5M3pUpAaIvjRHQtekoFLvxnjUExM/cccmw00yCB8JUFw==} + dependencies: + '@ethersproject/bignumber': 5.7.0 + '@metamask/eth-json-rpc-middleware': 11.0.1 + '@metamask/eth-json-rpc-provider': 1.0.0 + '@venly/connect': 2.2.1 + eth-block-tracker: 7.1.0 + eth-json-rpc-filters: 6.0.0 + json-rpc-engine: 6.1.0 + transitivePeerDependencies: + - supports-color + dev: false + /@vitest/coverage-c8@0.25.8(@vitest/ui@0.25.8)(jsdom@20.0.3): resolution: {integrity: sha512-fWgzQoK2KNzTTNnDcLCyibfO9/pbcpPOMtZ9Yvq/Eggpi2X8lewx/OcKZkO5ba5q9dl6+BBn6d5hTcS1709rZw==} dependencies: @@ -1552,6 +1708,10 @@ packages: safe-buffer: 5.2.1 dev: false + /base64-js@1.3.1: + resolution: {integrity: sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==} + dev: false + /base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} @@ -1593,6 +1753,10 @@ packages: readable-stream: 3.6.0 dev: true + /bn.js@4.12.0: + resolution: {integrity: sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==} + dev: false + /bn.js@5.2.1: resolution: {integrity: sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==} dev: false @@ -1816,6 +1980,11 @@ packages: engines: {node: '>=0.8'} dev: true + /clone@2.1.2: + resolution: {integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==} + engines: {node: '>=0.8'} + dev: false + /clsx@1.2.1: resolution: {integrity: sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==} engines: {node: '>=6'} @@ -1875,6 +2044,12 @@ packages: toggle-selection: 1.0.6 dev: false + /crc-32@1.2.2: + resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} + engines: {node: '>=0.8'} + hasBin: true + dev: false + /cross-fetch@3.1.5: resolution: {integrity: sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==} dependencies: @@ -2425,6 +2600,19 @@ packages: - supports-color dev: false + /eth-block-tracker@7.1.0: + resolution: {integrity: sha512-8YdplnuE1IK4xfqpf4iU7oBxnOYAc35934o083G8ao+8WM8QQtt/mVlAY6yIAdY1eMeLqg4Z//PZjJGmWGPMRg==} + engines: {node: '>=14.0.0'} + dependencies: + '@metamask/eth-json-rpc-provider': 1.0.0 + '@metamask/safe-event-emitter': 3.0.0 + '@metamask/utils': 5.0.2 + json-rpc-random-id: 1.0.1 + pify: 3.0.0 + transitivePeerDependencies: + - supports-color + dev: false + /eth-json-rpc-filters@5.1.0: resolution: {integrity: sha512-fos+9xmoa1A2Ytsc9eYof17r81BjdJOUcGcgZn4K/tKdCCTb+a8ytEtwlu1op5qsXFDlgGmstTELFrDEc89qEQ==} engines: {node: '>=14.0.0'} @@ -2436,6 +2624,17 @@ packages: pify: 5.0.0 dev: false + /eth-json-rpc-filters@6.0.0: + resolution: {integrity: sha512-7jm1Qm+uAdcYS2PDPuIMj6BM9kmLVCnRVRTvc5ZsUU+rMBRUg1vZ1qqtKa54AwMna7n7x3ZmUbFPGDUlqDN1AQ==} + engines: {node: '>=14.0.0'} + dependencies: + '@metamask/safe-event-emitter': 2.0.0 + async-mutex: 0.2.6 + eth-query: 2.1.2 + json-rpc-engine: 6.1.0 + pify: 5.0.0 + dev: false + /eth-query@2.1.2: resolution: {integrity: sha512-srES0ZcvwkR/wd5OQBRA1bIJMww1skfGS0s8wlwK3/oNP4+wnds60krvu5R1QbpRQjMmpG5OMIWro5s7gvDPsA==} dependencies: @@ -2449,6 +2648,29 @@ packages: fast-safe-stringify: 2.1.1 dev: false + /eth-rpc-errors@4.0.3: + resolution: {integrity: sha512-Z3ymjopaoft7JDoxZcEb3pwdGh7yiYMhOwm2doUt6ASXlMavpNlK6Cre0+IMl2VSGyEU9rkiperQhp5iRxn5Pg==} + dependencies: + fast-safe-stringify: 2.1.1 + dev: false + + /ethereum-cryptography@2.1.2: + resolution: {integrity: sha512-Z5Ba0T0ImZ8fqXrJbpHcbpAvIswRte2wGNR/KePnu8GbbvgJ47lMxT/ZZPG6i9Jaht4azPDop4HaM00J0J59ug==} + dependencies: + '@noble/curves': 1.1.0 + '@noble/hashes': 1.3.1 + '@scure/bip32': 1.3.1 + '@scure/bip39': 1.2.1 + dev: false + + /ethjs-util@0.1.6: + resolution: {integrity: sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==} + engines: {node: '>=6.5.0', npm: '>=3'} + dependencies: + is-hex-prefixed: 1.0.0 + strip-hex-prefix: 1.0.0 + dev: false + /eventemitter3@4.0.7: resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} dev: false @@ -3006,6 +3228,11 @@ packages: is-extglob: 2.1.1 dev: true + /is-hex-prefixed@1.0.0: + resolution: {integrity: sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA==} + engines: {node: '>=6.5.0', npm: '>=3'} + dev: false + /is-interactive@1.0.0: resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} engines: {node: '>=8'} @@ -3190,6 +3417,10 @@ packages: engines: {node: '>=0.10.0'} dev: true + /js-sha256@0.9.0: + resolution: {integrity: sha512-sga3MHh9sgQN2+pJ9VYZ+1LPwXOxuBJBA5nrR5/ofPfuiJBE2hnjsaN8se8JznOmGLN2p49Pe5U/ttafcs/apA==} + dev: false + /js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -3291,6 +3522,13 @@ packages: readable-stream: 3.6.0 dev: false + /keycloak-js@11.0.2: + resolution: {integrity: sha512-dnvzgTetovu3eTjJtvBQQhxRN4jqvd/DaA2wFaE4aWIFXhwRcoPpZT8ZJ7MwlICDPdCgzbCsOsBjpL8CbYOZsg==} + dependencies: + base64-js: 1.3.1 + js-sha256: 0.9.0 + dev: false + /keyvaluestorage-interface@1.0.0: resolution: {integrity: sha512-8t6Q3TclQ4uZynJY9IGr2+SsIGwK9JHcO6ootkHCGA0CrQCRy+VkouYNO2xicET6b9al7QKzpebNow+gkpCL8g==} dev: false @@ -3473,6 +3711,10 @@ packages: engines: {node: '>= 8'} dev: true + /micro-ftch@0.3.1: + resolution: {integrity: sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg==} + dev: false + /micromatch@4.0.5: resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} engines: {node: '>=8.6'} @@ -4511,6 +4753,13 @@ packages: engines: {node: '>=12'} dev: true + /strip-hex-prefix@1.0.0: + resolution: {integrity: sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A==} + engines: {node: '>=6.5.0', npm: '>=3'} + dependencies: + is-hex-prefixed: 1.0.0 + dev: false + /strip-indent@3.0.0: resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} engines: {node: '>=8'} @@ -4743,6 +4992,14 @@ packages: yargs: 17.6.0 dev: true + /tweetnacl-util@0.15.1: + resolution: {integrity: sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw==} + dev: false + + /tweetnacl@1.0.3: + resolution: {integrity: sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==} + dev: false + /type-check@0.3.2: resolution: {integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==} engines: {node: '>= 0.8.0'}