From dcd9d92117faaa8e6f5b3f9a2fa7161b73fb8436 Mon Sep 17 00:00:00 2001 From: Bruno Menezes Date: Thu, 8 Oct 2026 14:55:09 +0100 Subject: [PATCH 01/10] chore: Add RainbowKit, wagmi, viem and react-query. --- package.json | 6 +- pnpm-lock.yaml | 4426 +++++++++++++++++++++++++++++++++++++------ pnpm-workspace.yaml | 5 + 3 files changed, 3808 insertions(+), 629 deletions(-) diff --git a/package.json b/package.json index 04143bb0..c4ec0d6b 100644 --- a/package.json +++ b/package.json @@ -39,9 +39,11 @@ "@ethersproject/providers": "5.8.0", "@ethersproject/units": "^5.8.0", "@libsql/client": "^0.18.0", + "@rainbow-me/rainbowkit": "^2.2.11", "@safe-global/safe-apps-provider": "^0.18.6", "@safe-global/safe-apps-sdk": "^9.1.0", "@supercharge/promise-pool": "3.3.0", + "@tanstack/react-query": "^5.104.0", "@vercel/speed-insights": "^2.0.0", "@web3-onboard/coinbase": "^2.4.2", "@web3-onboard/common": "^2.4.2", @@ -74,7 +76,9 @@ "react-is": "^19.3.0", "react-jazzicon": "^1.0.4", "recharts": "^3.10.1", - "rxjs": "^7.8.2" + "rxjs": "^7.8.2", + "viem": "^2.57.2", + "wagmi": "^2.19.5" }, "devDependencies": { "@babel/core": "^8.0.5", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 79f648fe..a5fb7938 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,6 +9,7 @@ overrides: pbkdf2: ^3.1.5 form-data: ^4.0.4 ethereumjs-abi: ^0.6.8 + qr: ~0.5.5 importers: @@ -53,6 +54,9 @@ importers: '@libsql/client': specifier: ^0.18.0 version: 0.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@rainbow-me/rainbowkit': + specifier: ^2.2.11 + version: 2.2.11(@tanstack/react-query@5.104.0(react@19.3.0))(@types/react@19.3.0)(babel-plugin-macros@3.1.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(typescript@6.0.3)(viem@2.57.2(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76))(wagmi@2.19.5(@tanstack/query-core@5.104.0)(@tanstack/react-query@5.104.0(react@19.3.0))(@types/react@19.3.0)(bufferutil@4.0.9)(debug@4.4.3(supports-color@4.4.0))(encoding@0.1.13)(immer@11.1.18)(react@19.3.0)(supports-color@4.4.0)(typescript@6.0.3)(utf-8-validate@5.0.10)(viem@2.57.2(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76)) '@safe-global/safe-apps-provider': specifier: ^0.18.6 version: 0.18.6(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76) @@ -62,6 +66,9 @@ importers: '@supercharge/promise-pool': specifier: 3.3.0 version: 3.3.0 + '@tanstack/react-query': + specifier: ^5.104.0 + version: 5.104.0(react@19.3.0) '@vercel/speed-insights': specifier: ^2.0.0 version: 2.0.0(next@16.3.5(@babel/core@8.0.5)(@types/node@24.13.4)(babel-plugin-macros@3.1.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(react@19.3.0)(svelte@3.55.0) @@ -161,6 +168,12 @@ importers: rxjs: specifier: ^7.8.2 version: 7.8.2 + viem: + specifier: ^2.57.2 + version: 2.57.2(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76) + wagmi: + specifier: ^2.19.5 + version: 2.19.5(@tanstack/query-core@5.104.0)(@tanstack/react-query@5.104.0(react@19.3.0))(@types/react@19.3.0)(bufferutil@4.0.9)(debug@4.4.3(supports-color@4.4.0))(encoding@0.1.13)(immer@11.1.18)(react@19.3.0)(supports-color@4.4.0)(typescript@6.0.3)(utf-8-validate@5.0.10)(viem@2.57.2(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76) devDependencies: '@babel/core': specifier: ^8.0.5 @@ -631,6 +644,9 @@ packages: resolution: {integrity: sha512-eVdMqi3ej5aHhyQ2Si6yD2cAWeV8FJK9UrhK5aL0Sd8hu5GhT+YswhVNbVheOGVYMg8kuGuMaUpkB3stjj4z8A==} engines: {node: ^22.18.0 || >=24.11.0} + '@base-org/account@2.4.0': + resolution: {integrity: sha512-A4Umpi8B9/pqR78D1Yoze4xHyQaujioVRqqO3d6xuDFw9VRtjg6tK3bPlwE0aW+nVH/ntllCpPa2PbI8Rnjcug==} + '@bcoe/v8-coverage@0.2.3': resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} @@ -692,9 +708,32 @@ packages: resolution: {integrity: sha512-zccHj2z2oCCO4yrDiRSlFOxWerGqRiysP7a5jPK6uoI9URKAquwY42Dd/iUP8JWHxEzdRe4TlbvZCo8z1/mhrw==} engines: {node: '>= 20.12.0'} + '@coinbase/cdp-sdk@1.57.1': + resolution: {integrity: sha512-p47gw/5WNJ2Js+MMSQ1U1ocUY0UNnVvrjAxcrYt6YEcmVAUuz56L7Sg025tdutzH1BP+yU/jG9lDr/0AkTVvNw==} + peerDependencies: + '@x402/core': ^2.25.0 + '@x402/evm': ^2.25.0 + '@x402/extensions': ^2.25.0 + '@x402/svm': ^2.25.0 + peerDependenciesMeta: + '@x402/core': + optional: true + '@x402/evm': + optional: true + '@x402/extensions': + optional: true + '@x402/svm': + optional: true + + '@coinbase/wallet-sdk@3.9.3': + resolution: {integrity: sha512-N/A2DRIf0Y3PHc1XAMvbBUu4zisna6qAdqABMZwBMNEfWrXpAwx16pZGkYCLGE+Rvv1edbcB2LYDRnACNcmCiw==} + '@coinbase/wallet-sdk@4.3.0': resolution: {integrity: sha512-T3+SNmiCw4HzDm4we9wCHCxlP0pqCiwKe4sOwPH3YAK2KSKjxPRydKu6UQJrdONFVLG7ujXvbd/6ZqmvJb8rkw==} + '@coinbase/wallet-sdk@4.3.6': + resolution: {integrity: sha512-4q8BNG1ViL4mSAAvPAtpwlOs1gpC+67eQtgIwNvT3xyeyFFd+guwkc8bcX5rTmQhXpqnhzC4f0obACbP9CqMSA==} + '@csstools/color-helpers@5.1.0': resolution: {integrity: sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==} engines: {node: '>=18'} @@ -726,6 +765,12 @@ packages: '@drizzle-team/brocli@0.10.2': resolution: {integrity: sha512-z33Il7l5dKjUgGULTqBsQBQwckHh5AbIuxhdsIxDDiZAzBOrZO6q9ogcWC65kU382AfynTfgNumVcNIjuIua6w==} + '@ecies/ciphers@0.2.6': + resolution: {integrity: sha512-patgsRPKGkhhoBjETV4XxD0En4ui5fbX0hzayqI3M8tvNMGUoUvmyYAIWwlxBc1KX5cturfqByYdj5bYGRpN9g==} + engines: {bun: '>=1', deno: '>=2.7.10', node: '>=16'} + peerDependencies: + '@noble/ciphers': ^1.0.0 + '@emnapi/core@1.10.0': resolution: {integrity: sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==} @@ -1646,6 +1691,9 @@ packages: '@ethereumjs/common@2.6.5': resolution: {integrity: sha512-lRyVQOeCDaIVtgfbowla32pzeDv2Obr8oR8Put5RdUBNRGr1VGPGQNGP6elWIpgK3YdpzqTOh4GyUGOureVeeA==} + '@ethereumjs/common@3.2.0': + resolution: {integrity: sha512-pksvzI0VyLgmuEF2FA/JR/4/y6hcPq8OUail3/AvycBaW1d5VSauOZzqGvJ3RTmR4MU35lWE8KseKOsEhrFRBA==} + '@ethereumjs/rlp@4.0.1': resolution: {integrity: sha512-tqsQiBQDQdmPWE1xkkBq4rlSW5QZpLOUJ5RJh2/9fug+q9tnUhuZoVLk7s0scUIKTOzEtR72DFBXI4WiZcMpvw==} engines: {node: '>=14'} @@ -1657,6 +1705,10 @@ packages: '@ethereumjs/tx@3.5.2': resolution: {integrity: sha512-gQDNJWKrSDGu2w7w0PzVXVBNMzb7wwdDOmOqczmhNjqFxFuIbhVJDwiGEnxFNC2/b8ifcZzY7MLcluizohRzNw==} + '@ethereumjs/tx@4.2.0': + resolution: {integrity: sha512-1nc6VO4jtFd172BbSnTnDQVr9IYBFl1y4xPzZdtkrkKIncBCkdbgfdRV+MiTkJYAtTxvV12GRZLqBFT1PNK6Yw==} + engines: {node: '>=14'} + '@ethereumjs/util@8.1.0': resolution: {integrity: sha512-zQ0IqbdX8FZ9aw11vP+dZkKDkS+kgIvQPHnSAXzP9pLu+Rfu3D3XEeLbicvoXJTYnhZiPmsZUxgdzXwNKxRPbA==} engines: {node: '>=14'} @@ -1788,6 +1840,11 @@ packages: '@formatjs/intl-localematcher@0.5.10': resolution: {integrity: sha512-af3qATX+m4Rnd9+wHcjJ4w2ijq+rAVP3CCinJQvFv1kgSu1W6jypUmvleJxcewdxmutM8dmIRZFxO/IQBZmP2Q==} + '@gemini-wallet/core@0.3.2': + resolution: {integrity: sha512-Z4aHi3ECFf5oWYWM3F1rW83GJfB9OvhBYPTmb5q+VyK3uvzvS48lwo+jwh2eOoCRWEuT/crpb9Vwp2QaS5JqgQ==} + peerDependencies: + viem: '>=2.0.0' + '@graphql-typed-document-node/core@3.2.0': resolution: {integrity: sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ==} peerDependencies: @@ -2225,9 +2282,15 @@ packages: '@lit-labs/ssr-dom-shim@1.1.1': resolution: {integrity: sha512-kXOeFbfCm4fFf2A3WwVEeQj55tMZa8c8/f9AKHMobQMkzNUfUj+antR3fRPaZJawsa1aZiP/Da3ndpZrwEe4rQ==} + '@lit-labs/ssr-dom-shim@1.6.0': + resolution: {integrity: sha512-VHb0ALPMTlgKjM6yIxxoQNnpKyUKLD04VzeQdsiXkMqkvYlAHxq9glGLmgbb889/1GsohSOAjvQYoiBppXFqrQ==} + '@lit/reactive-element@1.6.2': resolution: {integrity: sha512-rDfl+QnCYjuIGf5xI2sVJWdYIi56CTCwWa+nidKYX6oIuBYwUbT/vX4qbUDlHiZKJ/3FRNQ/tWJui44p6/stSA==} + '@lit/reactive-element@2.1.2': + resolution: {integrity: sha512-pbCDiVMnne1lYUIaYNN5wrwQXDtHaYtg7YEFPeW+hws6U47WeFvISGUWekPGKWOP1ygrs0ef0o1VJMk1exos5A==} + '@ljharb/resumer@0.0.1': resolution: {integrity: sha512-skQiAOrCfO7vRTq53cxznMpks7wS1va95UCidALlOVWqvBAzwPVErwizDwoMqNVMEn1mDq0utxZd02eIrvF1lw==} engines: {node: '>= 0.4'} @@ -2236,10 +2299,98 @@ packages: resolution: {integrity: sha512-/gKJun8NNiWGZJkGzI/Ragc53cOdcLNdzjLaIa+GEjguQs0ulsurx8WN0jijdK9yPqDvziX995sMRLyLt1uZMQ==} engines: {node: '>= 0.4'} + '@metamask/eth-json-rpc-provider@1.0.1': + resolution: {integrity: sha512-whiUMPlAOrVGmX8aKYVPvlKyG4CpQXiNNyt74vE1xb5sPvmx5oA7B/kOi/JdBvhGQq97U1/AVdXEdk2zkP8qyA==} + engines: {node: '>=14.0.0'} + '@metamask/eth-sig-util@4.0.1': resolution: {integrity: sha512-tghyZKLHZjcdlDqCA3gNZmLeR0XvOE9U1qoQO9ohyAZT6Pya+H9vkBPcsyXytmYLNgVoin7CKCmweo/R43V+tQ==} engines: {node: '>=12.0.0'} + '@metamask/json-rpc-engine@7.3.3': + resolution: {integrity: sha512-dwZPq8wx9yV3IX2caLi9q9xZBw2XeIoYqdyihDDDpuHVCEiqadJLwqM3zy+uwf6F1QYQ65A8aOMQg1Uw7LMLNg==} + engines: {node: '>=16.0.0'} + + '@metamask/json-rpc-engine@8.0.2': + resolution: {integrity: sha512-IoQPmql8q7ABLruW7i4EYVHWUbF74yrp63bRuXV5Zf9BQwcn5H9Ww1eLtROYvI1bUXwOiHZ6qT5CWTrDc/t/AA==} + engines: {node: '>=16.0.0'} + + '@metamask/json-rpc-middleware-stream@7.0.2': + resolution: {integrity: sha512-yUdzsJK04Ev98Ck4D7lmRNQ8FPioXYhEUZOMS01LXW8qTvPGiRVXmVltj2p4wrLkh0vW7u6nv0mNl5xzC5Qmfg==} + engines: {node: '>=16.0.0'} + + '@metamask/object-multiplex@2.1.0': + resolution: {integrity: sha512-4vKIiv0DQxljcXwfpnbsXcfa5glMj5Zg9mqn4xpIWqkv6uJ2ma5/GtUfLFSxhlxnR8asRMv8dDmWya1Tc1sDFA==} + engines: {node: ^16.20 || ^18.16 || >=20} + + '@metamask/onboarding@1.0.1': + resolution: {integrity: sha512-FqHhAsCI+Vacx2qa5mAFcWNSrTcVGMNjzxVgaX8ECSny/BJ9/vgXP9V7WF/8vb9DltPeQkxr+Fnfmm6GHfmdTQ==} + + '@metamask/providers@16.1.0': + resolution: {integrity: sha512-znVCvux30+3SaUwcUGaSf+pUckzT5ukPRpcBmy+muBLC0yaWnBcvDqGfcsw6CBIenUdFrVoAFa8B6jsuCY/a+g==} + engines: {node: ^18.18 || >=20} + + '@metamask/rpc-errors@6.4.0': + resolution: {integrity: sha512-1ugFO1UoirU2esS3juZanS/Fo8C8XYocCuBpfZI5N7ECtoG+zu0wF+uWZASik6CkO6w9n/Iebt4iI4pT0vptpg==} + engines: {node: '>=16.0.0'} + + '@metamask/rpc-errors@7.0.2': + resolution: {integrity: sha512-YYYHsVYd46XwY2QZzpGeU4PSdRhHdxnzkB8piWGvJW2xbikZ3R+epAYEL4q/K8bh9JPTucsUdwRFnACor1aOYw==} + engines: {node: ^18.20 || ^20.17 || >=22} + + '@metamask/safe-event-emitter@2.0.0': + resolution: {integrity: sha512-/kSXhY692qiV1MXu6EeOZvg5nECLclxNXcKCxJ3cXQgYuRymRHpdx/t7JXfsK+JLjwA1e1c1/SBrlQYpusC29Q==} + + '@metamask/safe-event-emitter@3.1.3': + resolution: {integrity: sha512-Pnl74ukgoOkSItBRmZ9nnhdBbRtBI1ZvpeYjKNgxjVzDWa/AtruKZc+7LjfZ0iO8iYqh7Ts3bPs2Gu7M2hSf7g==} + engines: {node: '>=12.0.0'} + + '@metamask/scure-bip39@2.1.1': + resolution: {integrity: sha512-1K8aBsAqr6+8jWhguVl06n8e+zjV9sUnys+5PLyVU4mb8LbulQ60F6cq7iQys3xX/yCwKt1+7c7j2nuTEpW+ZQ==} + engines: {node: ^16.20 || ^18.16 || >=20} + + '@metamask/sdk-analytics@0.0.5': + resolution: {integrity: sha512-fDah+keS1RjSUlC8GmYXvx6Y26s3Ax1U9hGpWb6GSY5SAdmTSIqp2CvYy6yW0WgLhnYhW+6xERuD0eVqV63QIQ==} + deprecated: No longer maintained, superseded by @metamask/connect-analytics + + '@metamask/sdk-communication-layer@0.33.1': + resolution: {integrity: sha512-0bI9hkysxcfbZ/lk0T2+aKVo1j0ynQVTuB3sJ5ssPWlz+Z3VwveCkP1O7EVu1tsVVCb0YV5WxK9zmURu2FIiaA==} + deprecated: No longer maintained, superseded by https://docs.metamask.io/metamask-connect + peerDependencies: + cross-fetch: ^4.0.0 + eciesjs: '*' + eventemitter2: ^6.4.9 + readable-stream: ^3.6.2 + socket.io-client: ^4.5.1 + + '@metamask/sdk-install-modal-web@0.32.1': + resolution: {integrity: sha512-MGmAo6qSjf1tuYXhCu2EZLftq+DSt5Z7fsIKr2P+lDgdTPWgLfZB1tJKzNcwKKOdf6q9Qmmxn7lJuI/gq5LrKw==} + deprecated: No longer maintained, superseded by https://docs.metamask.io/metamask-connect + + '@metamask/sdk@0.33.1': + resolution: {integrity: sha512-1mcOQVGr9rSrVcbKPNVzbZ8eCl1K0FATsYH3WJ/MH4WcZDWGECWrXJPNMZoEAkLxWiMe8jOQBumg2pmcDa9zpQ==} + deprecated: No longer maintained, superseded by https://docs.metamask.io/metamask-connect + + '@metamask/superstruct@3.4.1': + resolution: {integrity: sha512-caTaaBUcwBGbUNf3r0uT48upX4nECRbKhQ9pPOfW4sIkfcIUUDV4S9DZxq/5fuNPVt5KWpyd5xIIz0sP+iWLlg==} + engines: {node: '>=16.0.0'} + + '@metamask/utils@11.12.1': + resolution: {integrity: sha512-X97J5AEcaKDTIAfKb4X93ZTLfvOahzDVadlveQW+7OZ7yhXjMxXoFmhX2d9UKv48iS2Dxq9kbGJ1lUfphu9ebQ==} + engines: {node: ^18.18 || ^20.14 || >=22} + + '@metamask/utils@5.0.2': + resolution: {integrity: sha512-yfmE79bRQtnMzarnKfX7AEJBwFTxvTyw3nBQlu/5rmGXrjAeAMltoGxO62TFurxrQAFMNa/fEjIHNvungZp0+g==} + engines: {node: '>=14.0.0'} + + '@metamask/utils@8.5.0': + resolution: {integrity: sha512-I6bkduevXb72TIM9q2LRO63JSsF9EXduh3sBr9oybNX2hNNpr/j1tEjXrsG0Uabm4MJ1xkGAQEMwifvKZIkyxQ==} + engines: {node: '>=16.0.0'} + + '@metamask/utils@9.3.0': + resolution: {integrity: sha512-w8CVbdkDrVXFJbfBSlDfafDR6BAkpDmv1bC1UJVCoVny5tW2RKAdn9i68Xf7asYT4TnUhl/hN4zfUiKQq9II4g==} + engines: {node: '>=16.0.0'} + '@motionone/animation@10.15.1': resolution: {integrity: sha512-mZcJxLjHor+bhcPuIFErMDNyrdb2vJur8lSfMCsuCB4UyV8ILZLvK+t+pg56erv8ud9xQGK/1OGPt10agPrCyQ==} @@ -2333,20 +2484,36 @@ packages: cpu: [x64] os: [win32] + '@noble/ciphers@1.2.1': + resolution: {integrity: sha512-rONPWMC7PeExE077uLE4oqWrZ1IvAfz3oH9LibVAcVCopJiA9R62uavnbEzdkVmJYI6M6Zgkbeb07+tWjlq2XA==} + engines: {node: ^14.21.3 || >=16} + + '@noble/ciphers@1.3.0': + resolution: {integrity: sha512-2I0gnIVPtfnMw9ee9h1dJG7tp81+8Ob3OJb3Mv37rx5L40/b0i7djjCVvGOVqc9AEIQyvyu1i6ypKdFw8R8gQw==} + engines: {node: ^14.21.3 || >=16} + '@noble/curves@1.2.0': resolution: {integrity: sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==} '@noble/curves@1.4.2': resolution: {integrity: sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==} - '@noble/curves@1.7.0': - resolution: {integrity: sha512-UTMhXK9SeDhFJVrHeUJ5uZlI6ajXg10O6Ddocf9S6GjbSBVZsJo88HzKwXznNfGpMTRDyJkqMjNDPYgf0qFWnw==} - engines: {node: ^14.21.3 || >=16} - '@noble/curves@1.8.0': resolution: {integrity: sha512-j84kjAbzEnQHaSIhRPUmB3/eVXu2k3dKPl2LOrR8fSOIL+89U+7lV117EWHtq/GHM3ReGHM46iRBdZfpc4HRUQ==} engines: {node: ^14.21.3 || >=16} + '@noble/curves@1.8.1': + resolution: {integrity: sha512-warwspo+UYUPep0Q+vtdVB4Ugn8GGQj8iyB3gnRWsztmUHTI3S1nhdiWNsPUGL0vud7JlRRk1XEu7Lq1KGTnMQ==} + engines: {node: ^14.21.3 || >=16} + + '@noble/curves@1.9.1': + resolution: {integrity: sha512-k11yZxZg+t+gWvBbIswW0yoJlu8cHOC7dhunwOzoWH/mXGBiYyR4YY6hAEK/3EUs4UpB8la1RfdRpeGsFHkWsA==} + engines: {node: ^14.21.3 || >=16} + + '@noble/curves@1.9.7': + resolution: {integrity: sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==} + engines: {node: ^14.21.3 || >=16} + '@noble/hashes@1.2.0': resolution: {integrity: sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ==} @@ -2362,16 +2529,16 @@ packages: resolution: {integrity: sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==} engines: {node: '>= 16'} - '@noble/hashes@1.6.0': - resolution: {integrity: sha512-YUULf0Uk4/mAA89w+k3+yUYh6NrEvxZa5T6SY3wlMvE2chHkxFUUIDI8/XW1QSC357iA5pSnqt7XEhvFOqmDyQ==} + '@noble/hashes@1.7.0': + resolution: {integrity: sha512-HXydb0DgzTpDPwbVeDGCG1gIu7X6+AuU6Zl6av/E/KG8LMsvPntvq+w17CHRpKBmN6Ybdrt1eP3k4cj8DJa78w==} engines: {node: ^14.21.3 || >=16} - '@noble/hashes@1.6.1': - resolution: {integrity: sha512-pq5D8h10hHBjyqX+cfBm0i8JUXJ0UhczFc4r74zbuT9XgewFo2E3J1cOaGtdZynILNmQ685YWGzGE1Zv6io50w==} + '@noble/hashes@1.7.1': + resolution: {integrity: sha512-B8XBPsn4vT/KJAGqDzbwztd+6Yte3P4V7iafm24bxgDe/mlRuK6xmWPuCNrKt2vDafZ8MfJLlchDG/vYafQEjQ==} engines: {node: ^14.21.3 || >=16} - '@noble/hashes@1.7.0': - resolution: {integrity: sha512-HXydb0DgzTpDPwbVeDGCG1gIu7X6+AuU6Zl6av/E/KG8LMsvPntvq+w17CHRpKBmN6Ybdrt1eP3k4cj8DJa78w==} + '@noble/hashes@1.8.0': + resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} engines: {node: ^14.21.3 || >=16} '@noble/secp256k1@1.7.1': @@ -2859,6 +3026,10 @@ packages: resolution: {integrity: sha512-7FNeNl8NCE7aINx7WXiKQrPYZWC/hvrTsmk6zmxbI7LTXE7hVek/n8AfVgpe2y82zl3w0HvCHN0bVKMBoJcC0w==} engines: {node: '>= 10.0.0'} + '@paulmillr/qr@0.2.1': + resolution: {integrity: sha512-IHnV6A+zxU7XwmKFinmYjUcwlyK9+xkG3/s9KcQhI9BjQKycrJ1JRO+FbNYPwZiPKW3je/DR0k7w8/gLa5eaxQ==} + deprecated: 'Switch to "qr" (new package name) for security updates: npm install qr' + '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} @@ -2867,6 +3038,16 @@ packages: resolution: {integrity: sha512-SEeaJLb3qBNF/OaXnaR1NmmBbFYk1zC0ZH/52fATcRPLFg/p791YrcyFFy44Bo9sLaGuSuLp5Q6axbb/O+v/RA==} engines: {node: ^14.18.0 || >=16.0.0} + '@rainbow-me/rainbowkit@2.2.11': + resolution: {integrity: sha512-FHPsRHMBpuHHhuyKktAR13O9agmsUUunDnVEP4hG1dSZ2JojXLUSWyLG28VbGIJakHYylkNguiLFnqM/BM8ERA==} + engines: {node: '>=12.4'} + peerDependencies: + '@tanstack/react-query': '>=5.0.0' + react: '>=18' + react-dom: '>=18' + viem: 2.x + wagmi: ^2.9.0 + '@reduxjs/toolkit@2.9.0': resolution: {integrity: sha512-fSfQlSRu9Z5yBkvsNhYF2rPS8cGXn/TZVrlwN1948QyZ8xMZ0JvP50S2acZNaf+o63u6aEeMjipFyksjIcWrog==} peerDependencies: @@ -2878,6 +3059,35 @@ packages: react-redux: optional: true + '@reown/appkit-common@1.7.8': + resolution: {integrity: sha512-ridIhc/x6JOp7KbDdwGKY4zwf8/iK8EYBl+HtWrruutSLwZyVi5P8WaZa+8iajL6LcDcDF7LoyLwMTym7SRuwQ==} + + '@reown/appkit-controllers@1.7.8': + resolution: {integrity: sha512-IdXlJlivrlj6m63VsGLsjtPHHsTWvKGVzWIP1fXZHVqmK+rZCBDjCi9j267Rb9/nYRGHWBtlFQhO8dK35WfeDA==} + + '@reown/appkit-pay@1.7.8': + resolution: {integrity: sha512-OSGQ+QJkXx0FEEjlpQqIhT8zGJKOoHzVnyy/0QFrl3WrQTjCzg0L6+i91Ad5Iy1zb6V5JjqtfIFpRVRWN4M3pw==} + + '@reown/appkit-polyfills@1.7.8': + resolution: {integrity: sha512-W/kq786dcHHAuJ3IV2prRLEgD/2iOey4ueMHf1sIFjhhCGMynMkhsOhQMUH0tzodPqUgAC494z4bpIDYjwWXaA==} + + '@reown/appkit-scaffold-ui@1.7.8': + resolution: {integrity: sha512-RCeHhAwOrIgcvHwYlNWMcIDibdI91waaoEYBGw71inE0kDB8uZbE7tE6DAXJmDkvl0qPh+DqlC4QbJLF1FVYdQ==} + + '@reown/appkit-ui@1.7.8': + resolution: {integrity: sha512-1hjCKjf6FLMFzrulhl0Y9Vb9Fu4royE+SXCPSWh4VhZhWqlzUFc7kutnZKx8XZFVQH4pbBvY62SpRC93gqoHow==} + + '@reown/appkit-utils@1.7.8': + resolution: {integrity: sha512-8X7UvmE8GiaoitCwNoB86pttHgQtzy4ryHZM9kQpvjQ0ULpiER44t1qpVLXNM4X35O0v18W0Dk60DnYRMH2WRw==} + peerDependencies: + valtio: 1.13.2 + + '@reown/appkit-wallet@1.7.8': + resolution: {integrity: sha512-kspz32EwHIOT/eg/ZQbFPxgXq0B/olDOj3YMu7gvLEFz4xyOFd/wgzxxAXkp5LbG4Cp++s/elh79rVNmVFdB9A==} + + '@reown/appkit@1.7.8': + resolution: {integrity: sha512-51kTleozhA618T1UvMghkhKfaPcc9JlKwLJ5uV+riHyvSoWPKPRIa5A6M1Wano5puNyW0s3fwywhyqTHSilkaA==} + '@resolver-engine/core@0.3.3': resolution: {integrity: sha512-eB8nEbKDJJBi5p5SrvrvILn4a0h42bKtbCTri3ZxCGt6UvoQyp7HnGOfki944bUjBSHKK3RvgfViHn+kqdXtnQ==} @@ -3139,6 +3349,9 @@ packages: '@scure/base@1.2.1': resolution: {integrity: sha512-DGmGtC8Tt63J5GfHgfl5CuAXh96VF/LD8K9Hr/Gv0J2lAoRGlPOMpqMpMbCTOoOJMZCk2Xt+DskdDyn6dEFdzQ==} + '@scure/base@1.2.6': + resolution: {integrity: sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg==} + '@scure/bip32@1.1.5': resolution: {integrity: sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw==} @@ -3148,12 +3361,15 @@ packages: '@scure/bip32@1.4.0': resolution: {integrity: sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg==} - '@scure/bip32@1.6.0': - resolution: {integrity: sha512-82q1QfklrUUdXJzjuRU7iG7D7XiFx5PHYVS0+oeNKhyDLT7WPqs6pBcM2W5ZdwOwKCwoE1Vy1se+DHjcXwCYnA==} - '@scure/bip32@1.6.1': resolution: {integrity: sha512-jSO+5Ud1E588Y+LFo8TaB8JVPNAZw/lGGao+1SepHDeTs2dFLurdNIAgUuDlwezqEjRjElkCJajVrtrZaBxvaQ==} + '@scure/bip32@1.6.2': + resolution: {integrity: sha512-t96EPDMbtGgtb7onKKqxRLfE5g05k7uHnHRM2xdE6BP/ZmxaLtPek4J4KfVn/90IQNrU1IOAqMgiDtUdtbe3nw==} + + '@scure/bip32@1.7.0': + resolution: {integrity: sha512-E4FFX/N3f4B80AKWp5dP6ow+flD1LQZo/w8UnLGYZO674jS6YnYeepycOOksv+vLPSpgN35wgKgy+ybfTb2SMw==} + '@scure/bip39@1.1.1': resolution: {integrity: sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg==} @@ -3163,12 +3379,15 @@ packages: '@scure/bip39@1.3.0': resolution: {integrity: sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ==} - '@scure/bip39@1.5.0': - resolution: {integrity: sha512-Dop+ASYhnrwm9+HA/HwXg7j2ZqM6yk2fyLWb5znexjctFY3+E+eU8cIWI0Pql0Qx4hPZCijlGq4OL71g+Uz30A==} - '@scure/bip39@1.5.1': resolution: {integrity: sha512-GnlufVSP9UdAo/H2Patfv22VTtpNTyfi+I3qCKpvuB5l1KWzEYx+l2TNpBy9Ksh4xTs3Rn06tBlpWCi/1Vz8gw==} + '@scure/bip39@1.5.4': + resolution: {integrity: sha512-TFM4ni0vKvCfBpohoh+/lY05i9gRbSwXWngAsF4CABQxoaOHijxuaZ2R6cStDQ5CHtHO9aGJTr4ksVJASRRyMA==} + + '@scure/bip39@1.6.0': + resolution: {integrity: sha512-+lF0BbLiJNwVlev4eKelw1WWLaiKXw7sSl8T6FvBlWkdX+94aGJ4o8XjUdlyhTCjd8c+B3KT3JfS8P0bLRNU6A==} + '@sentry/core@5.30.0': resolution: {integrity: sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg==} engines: {node: '>=6'} @@ -3227,433 +3446,809 @@ packages: '@sinonjs/fake-timers@15.4.0': resolution: {integrity: sha512-DsG+8/LscQIQg68J6Ef3dv10u6nVyetYn923s3/sus5eaGfTo1of5WMZSLf0UJc9KDuKPilPH0UDJCjvNbDNCA==} - '@stablelib/aead@1.0.1': - resolution: {integrity: sha512-q39ik6sxGHewqtO0nP4BuSe3db5G1fEJE8ukvngS2gLkBXyy6E7pLubhbYgnkDFv6V8cWaxcE4Xn0t6LWcJkyg==} - - '@stablelib/binary@1.0.1': - resolution: {integrity: sha512-ClJWvmL6UBM/wjkvv/7m5VP3GMr9t0osr4yVgLZsLCOz4hGN9gIAFEqnJ0TsSMAN+n840nf2cHZnA5/KFqHC7Q==} - - '@stablelib/bytes@1.0.1': - resolution: {integrity: sha512-Kre4Y4kdwuqL8BR2E9hV/R5sOrUj6NanZaZis0V6lX5yzqC3hBuVSDXUIBqQv/sCpmuWRiHLwqiT1pqqjuBXoQ==} - - '@stablelib/chacha20poly1305@1.0.1': - resolution: {integrity: sha512-MmViqnqHd1ymwjOQfghRKw2R/jMIGT3wySN7cthjXCBdO+qErNPUBnRzqNpnvIwg7JBCg3LdeCZZO4de/yEhVA==} - - '@stablelib/chacha@1.0.1': - resolution: {integrity: sha512-Pmlrswzr0pBzDofdFuVe1q7KdsHKhhU24e8gkEwnTGOmlC7PADzLVxGdn2PoNVBBabdg0l/IfLKg6sHAbTQugg==} - - '@stablelib/constant-time@1.0.1': - resolution: {integrity: sha512-tNOs3uD0vSJcK6z1fvef4Y+buN7DXhzHDPqRLSXUel1UfqMB1PWNsnnAezrKfEwTLpN0cGH2p9NNjs6IqeD0eg==} - - '@stablelib/ed25519@1.0.3': - resolution: {integrity: sha512-puIMWaX9QlRsbhxfDc5i+mNPMY+0TmQEskunY1rZEBPi1acBCVQAhnsk/1Hk50DGPtVsZtAWQg4NHGlVaO9Hqg==} - - '@stablelib/hash@1.0.1': - resolution: {integrity: sha512-eTPJc/stDkdtOcrNMZ6mcMK1e6yBbqRBaNW55XA1jU8w/7QdnCF0CmMmOD1m7VSkBR44PWrMHU2l6r8YEQHMgg==} - - '@stablelib/hkdf@1.0.1': - resolution: {integrity: sha512-SBEHYE16ZXlHuaW5RcGk533YlBj4grMeg5TooN80W3NpcHRtLZLLXvKyX0qcRFxf+BGDobJLnwkvgEwHIDBR6g==} - - '@stablelib/hmac@1.0.1': - resolution: {integrity: sha512-V2APD9NSnhVpV/QMYgCVMIYKiYG6LSqw1S65wxVoirhU/51ACio6D4yDVSwMzuTJXWZoVHbDdINioBwKy5kVmA==} - - '@stablelib/int@1.0.1': - resolution: {integrity: sha512-byr69X/sDtDiIjIV6m4roLVWnNNlRGzsvxw+agj8CIEazqWGOQp2dTYgQhtyVXV9wpO6WyXRQUzLV/JRNumT2w==} - - '@stablelib/keyagreement@1.0.1': - resolution: {integrity: sha512-VKL6xBwgJnI6l1jKrBAfn265cspaWBPAPEc62VBQrWHLqVgNRE09gQ/AnOEyKUWrrqfD+xSQ3u42gJjLDdMDQg==} + '@socket.io/component-emitter@3.1.2': + resolution: {integrity: sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==} - '@stablelib/poly1305@1.0.1': - resolution: {integrity: sha512-1HlG3oTSuQDOhSnLwJRKeTRSAdFNVB/1djy2ZbS35rBSJ/PFqx9cf9qatinWghC2UbfOYD8AcrtbUQl8WoxabA==} + '@solana-program/system@0.10.0': + resolution: {integrity: sha512-Go+LOEZmqmNlfr+Gjy5ZWAdY5HbYzk2RBewD9QinEU/bBSzpFfzqDRT55JjFRBGJUvMgf3C2vfXEGT4i8DSI4g==} + peerDependencies: + '@solana/kit': ^5.0 - '@stablelib/random@1.0.2': - resolution: {integrity: sha512-rIsE83Xpb7clHPVRlBj8qNe5L8ISQOzjghYQm/dZ7VaM2KHYwMW5adjQjrzTZCchFnNCNhkwtnOBa9HTMJCI8w==} + '@solana-program/token@0.9.0': + resolution: {integrity: sha512-vnZxndd4ED4Fc56sw93cWZ2djEeeOFxtaPS8SPf5+a+JZjKA/EnKqzbE1y04FuMhIVrLERQ8uR8H2h72eZzlsA==} + peerDependencies: + '@solana/kit': ^5.0 - '@stablelib/sha256@1.0.1': - resolution: {integrity: sha512-GIIH3e6KH+91FqGV42Kcj71Uefd/QEe7Dy42sBTeqppXV95ggCcxLTk39bEr+lZfJmp+ghsR07J++ORkRELsBQ==} + '@solana/accounts@5.5.1': + resolution: {integrity: sha512-TfOY9xixg5rizABuLVuZ9XI2x2tmWUC/OoN556xwfDlhBHBjKfszicYYOyD6nbFmwTGYarCmyGIdteXxTXIdhQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true - '@stablelib/sha512@1.0.1': - resolution: {integrity: sha512-13gl/iawHV9zvDKciLo1fQ8Bgn2Pvf7OV6amaRVKiq3pjQ3UmEpXxWiAfV8tYjUpeZroBxtyrwtdooQT/i3hzw==} + '@solana/addresses@5.5.1': + resolution: {integrity: sha512-5xoah3Q9G30HQghu/9BiHLb5pzlPKRC3zydQDmE3O9H//WfayxTFppsUDCL6FjYUHqj/wzK6CWHySglc2RkpdA==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true - '@stablelib/wipe@1.0.1': - resolution: {integrity: sha512-WfqfX/eXGiAd3RJe4VU2snh/ZPwtSjLG4ynQ/vYzvghTh7dHFcI1wl+nrkWG6lGhukOxOsUHfv8dUXr58D0ayg==} + '@solana/assertions@5.5.1': + resolution: {integrity: sha512-YTCSWAlGwSlVPnWtWLm3ukz81wH4j2YaCveK+TjpvUU88hTy6fmUqxi0+hvAMAe4zKXpJyj3Az7BrLJRxbIm4Q==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true - '@stablelib/x25519@1.0.3': - resolution: {integrity: sha512-KnTbKmUhPhHavzobclVJQG5kuivH+qDLpe84iRqX3CLrKp881cF160JvXJ+hjn1aMyCwYOKeIZefIH/P5cJoRw==} + '@solana/codecs-core@5.5.1': + resolution: {integrity: sha512-TgBt//bbKBct0t6/MpA8ElaOA3sa8eYVvR7LGslCZ84WiAwwjCY0lW/lOYsFHJQzwREMdUyuEyy5YWBKtdh8Rw==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true - '@standard-schema/spec@1.0.0': - resolution: {integrity: sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==} + '@solana/codecs-data-structures@5.5.1': + resolution: {integrity: sha512-97bJWGyUY9WvBz3mX1UV3YPWGDTez6btCfD0ip3UVEXJbItVuUiOkzcO5iFDUtQT5riKT6xC+Mzl+0nO76gd0w==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true - '@standard-schema/utils@0.3.0': - resolution: {integrity: sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==} + '@solana/codecs-numbers@5.5.1': + resolution: {integrity: sha512-rllMIZAHqmtvC0HO/dc/21wDuWaD0B8Ryv8o+YtsICQBuiL/0U4AGwH7Pi5GNFySYk0/crSuwfIqQFtmxNSPFw==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true - '@storybook/addon-links@10.6.0': - resolution: {integrity: sha512-kbGLPiA0yJ0pb/YM/K8O4N4aI7iQmCOoaOdpjLFJgCA2lVXKVIdZA49DaaNifWWr1dniwAw5eJdyLkVaqJO0Ag==} + '@solana/codecs-strings@5.5.1': + resolution: {integrity: sha512-7klX4AhfHYA+uKKC/nxRGP2MntbYQCR3N6+v7bk1W/rSxYuhNmt+FN8aoThSZtWIKwN6BEyR1167ka8Co1+E7A==} + engines: {node: '>=20.18.0'} peerDependencies: - '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - storybook: ^10.6.0 + fastestsmallesttextencoderdecoder: ^1.0.22 + typescript: ^5.0.0 peerDependenciesMeta: - '@types/react': + fastestsmallesttextencoderdecoder: optional: true - react: + typescript: optional: true - '@storybook/builder-vite@10.6.0': - resolution: {integrity: sha512-7zt8tYB6dnSO8fbjUz91MHexGDpf9HrLlA3FAmlVb+2ZL3eWUs499L3I6BDUymcWu7oW5WCBJlB8ERj8ZLLzig==} + '@solana/codecs@5.5.1': + resolution: {integrity: sha512-Vea29nJub/bXjfzEV7ZZQ/PWr1pYLZo3z0qW0LQL37uKKVzVFRQlwetd7INk3YtTD3xm9WUYr7bCvYUk3uKy2g==} + engines: {node: '>=20.18.0'} peerDependencies: - storybook: ^10.6.0 - vite: ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 - - '@storybook/global@5.0.0': - resolution: {integrity: sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ==} + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true - '@storybook/icons@2.1.0': - resolution: {integrity: sha512-Fxh9vYpX9bQqFeHRiY8h2ApeRGDzRSMLwJwNZ/AIRqnyOKHxRKL+yFe+ctEkVJmuptRE9u1Hrn8ZZNHyfDKKNg==} + '@solana/errors@5.5.1': + resolution: {integrity: sha512-vFO3p+S7HoyyrcAectnXbdsMfwUzY2zYFUc2DEe5BwpiE9J1IAxPBGjOWO6hL1bbYdBrlmjNx8DXCslqS+Kcmg==} + engines: {node: '>=20.18.0'} + hasBin: true peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true - '@storybook/nextjs-vite@10.6.0': - resolution: {integrity: sha512-TTXZsOUAXyezvZt+ICuIpYjzOkUXfEidUCbd/nnzczHaoxLWvVqwTzVHt9To7zsXWSfZFOxHQV9F4Uuzh74aKw==} + '@solana/fast-stable-stringify@5.5.1': + resolution: {integrity: sha512-Ni7s2FN33zTzhTFgRjEbOVFO+UAmK8qi3Iu0/GRFYK4jN696OjKHnboSQH/EacQ+yGqS54bfxf409wU5dsLLCw==} + engines: {node: '>=20.18.0'} peerDependencies: - '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - '@types/react-dom': ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - next: ^14.1.0 || ^15.0.0 || ^16.0.0 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - storybook: ^10.6.0 - typescript: '*' - vite: ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: ^5.0.0 peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': + typescript: optional: true + + '@solana/functional@5.5.1': + resolution: {integrity: sha512-tTHoJcEQq3gQx5qsdsDJ0LEJeFzwNpXD80xApW9o/PPoCNimI3SALkZl+zNW8VnxRrV3l3yYvfHWBKe/X3WG3w==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: typescript: optional: true - '@storybook/react-dom-shim@10.6.0': - resolution: {integrity: sha512-ZE0l4xL6d00rKFeJhRDuh0t3r+/2ffhx47lIyaSWrTD5kuM3nDjKDxCIWwX4E3gLV+oNX8E1prXRMuEWJUJwJg==} + '@solana/instruction-plans@5.5.1': + resolution: {integrity: sha512-7z3CB7YMcFKuVvgcnNY8bY6IsZ8LG61Iytbz7HpNVGX2u1RthOs1tRW8luTzSG1MPL0Ox7afyAVMYeFqSPHnaQ==} + engines: {node: '>=20.18.0'} peerDependencies: - '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - '@types/react-dom': ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - storybook: ^10.6.0 + typescript: ^5.0.0 peerDependenciesMeta: - '@types/react': + typescript: optional: true - '@types/react-dom': + + '@solana/instructions@5.5.1': + resolution: {integrity: sha512-h0G1CG6S+gUUSt0eo6rOtsaXRBwCq1+Js2a+Ps9Bzk9q7YHNFA75/X0NWugWLgC92waRp66hrjMTiYYnLBoWOQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: optional: true - '@storybook/react-vite@10.6.0': - resolution: {integrity: sha512-nc1dqnmjGOcDJvPCkAn4Hmu1gi7dNHHoibNmlBp0d1adosejELZxuNjHBkPl/KxZjbzP3jljQHnHB/guxd8e2g==} + '@solana/keys@5.5.1': + resolution: {integrity: sha512-KRD61cL7CRL+b4r/eB9dEoVxIf/2EJ1Pm1DmRYhtSUAJD2dJ5Xw8QFuehobOGm9URqQ7gaQl+Fkc1qvDlsWqKg==} + engines: {node: '>=20.18.0'} peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - storybook: ^10.6.0 - typescript: '>= 4.9.x' - vite: ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: ^5.0.0 peerDependenciesMeta: typescript: optional: true - '@storybook/react@10.6.0': - resolution: {integrity: sha512-0xfYYPRHcr5ta1hmXJCSezH4JGuUHJ+xVF9f1j+Y/MWEMOQE4wnaKWKsk/HLrDjZkT5hKfvmogt9b0yduP6zEQ==} + '@solana/kit@5.5.1': + resolution: {integrity: sha512-irKUGiV2yRoyf+4eGQ/ZeCRxa43yjFEL1DUI5B0DkcfZw3cr0VJtVJnrG8OtVF01vT0OUfYOcUn6zJW5TROHvQ==} + engines: {node: '>=20.18.0'} peerDependencies: - '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - '@types/react-dom': ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - storybook: ^10.6.0 - typescript: '>= 4.9.x' + typescript: ^5.0.0 peerDependenciesMeta: - '@types/react': + typescript: optional: true - '@types/react-dom': + + '@solana/nominal-types@5.5.1': + resolution: {integrity: sha512-I1ImR+kfrLFxN5z22UDiTWLdRZeKtU0J/pkWkO8qm/8WxveiwdIv4hooi8pb6JnlR4mSrWhq0pCIOxDYrL9GIQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: optional: true + + '@solana/offchain-messages@5.5.1': + resolution: {integrity: sha512-g+xHH95prTU+KujtbOzj8wn+C7ZNoiLhf3hj6nYq3MTyxOXtBEysguc97jJveUZG0K97aIKG6xVUlMutg5yxhw==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: typescript: optional: true - '@supercharge/promise-pool@3.3.0': - resolution: {integrity: sha512-qGzCltMN05ohRRQAXB8TPWt+0Coz9Va266gr9nYN1qc/f/EIaup3VRg7b59mtRaeKTRcxreF20l/udCM/gOqNg==} - engines: {node: '>=8'} - - '@swc/helpers@0.5.23': - resolution: {integrity: sha512-5lSsMOTXURePglDfvuAQUqkGek9Hg2kksOYay2m0+XR++b2NWYL/4sWyuvVBIs8oKnJaxkdi9whaL/sqN13afw==} + '@solana/options@5.5.1': + resolution: {integrity: sha512-eo971c9iLNLmk+yOFyo7yKIJzJ/zou6uKpy6mBuyb/thKtS/haiKIc3VLhyTXty3OH2PW8yOlORJnv4DexJB8A==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true - '@szmarczak/http-timer@1.1.2': - resolution: {integrity: sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==} - engines: {node: '>=6'} + '@solana/plugin-core@5.5.1': + resolution: {integrity: sha512-VUZl30lDQFJeiSyNfzU1EjYt2QZvoBFKEwjn1lilUJw7KgqD5z7mbV7diJhT+dLFs36i0OsjXvq5kSygn8YJ3A==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true - '@szmarczak/http-timer@4.0.6': - resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==} - engines: {node: '>=10'} + '@solana/programs@5.5.1': + resolution: {integrity: sha512-7U9kn0Jsx1NuBLn5HRTFYh78MV4XN145Yc3WP/q5BlqAVNlMoU9coG5IUTJIG847TUqC1lRto3Dnpwm6T4YRpA==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true - '@szmarczak/http-timer@5.0.1': - resolution: {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==} - engines: {node: '>=14.16'} + '@solana/promises@5.5.1': + resolution: {integrity: sha512-T9lfuUYkGykJmppEcssNiCf6yiYQxJkhiLPP+pyAc2z84/7r3UVIb2tNJk4A9sucS66pzJnVHZKcZVGUUp6wzA==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true - '@testing-library/dom@10.4.2': - resolution: {integrity: sha512-yzr2S9HyAIdhz2/6qHgbs665Q7PKVcDF05vsOlHPxG1mo36gKVesdYVeDLnXgfjJ03CrKRk08knc6+E/9m8v2Q==} - engines: {node: '>=18'} + '@solana/rpc-api@5.5.1': + resolution: {integrity: sha512-XWOQQPhKl06Vj0xi3RYHAc6oEQd8B82okYJ04K7N0Vvy3J4PN2cxeK7klwkjgavdcN9EVkYCChm2ADAtnztKnA==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true - '@testing-library/jest-dom@6.9.1': - resolution: {integrity: sha512-zIcONa+hVtVSSep9UT3jZ5rizo2BsxgyDYU7WFD5eICBE7no3881HGeb/QkGfsJs6JTkY1aQhT7rIPC7e+0nnA==} - engines: {node: '>=14', npm: '>=6', yarn: '>=1'} + '@solana/rpc-parsed-types@5.5.1': + resolution: {integrity: sha512-HEi3G2nZqGEsa3vX6U0FrXLaqnUCg4SKIUrOe8CezD+cSFbRTOn3rCLrUmJrhVyXlHoQVaRO9mmeovk31jWxJg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true - '@testing-library/jest-dom@7.0.1': - resolution: {integrity: sha512-oMDTC3oA+6CXSO2JZnvOI7CA6oVub6kij5ggk9ohwye5slmkwxYDXcPOVxgMw/RQlticjtO0C1RZkR97HgrWMw==} - engines: {node: '>=22', npm: '>=6', yarn: '>=1'} + '@solana/rpc-spec-types@5.5.1': + resolution: {integrity: sha512-6OFKtRpIEJQs8Jb2C4OO8KyP2h2Hy1MFhatMAoXA+0Ik8S3H+CicIuMZvGZ91mIu/tXicuOOsNNLu3HAkrakrw==} + engines: {node: '>=20.18.0'} peerDependencies: - '@testing-library/dom': '>=10 <11' - vitest: '>= 0.32' + typescript: ^5.0.0 peerDependenciesMeta: - vitest: + typescript: optional: true - '@testing-library/react@16.3.3': - resolution: {integrity: sha512-Uo193NgQbPMz6lrrhtRQQFcMC6Re/ELLFbbuVL30WDlZxlpZf9/lMHTAVxPRLw1q1iu9OJmR1c2BLiENRstdBg==} - engines: {node: '>=18'} + '@solana/rpc-spec@5.5.1': + resolution: {integrity: sha512-m3LX2bChm3E3by4mQrH4YwCAFY57QBzuUSWqlUw7ChuZ+oLLOq7b2czi4i6L4Vna67j3eCmB3e+4tqy1j5wy7Q==} + engines: {node: '>=20.18.0'} peerDependencies: - '@testing-library/dom': ^10.0.0 - '@types/react': ^18.0.0 || ^19.0.0 - '@types/react-dom': ^18.0.0 || ^19.0.0 - react: ^18.0.0 || ^19.0.0 - react-dom: ^18.0.0 || ^19.0.0 + typescript: ^5.0.0 peerDependenciesMeta: - '@types/react': + typescript: optional: true - '@types/react-dom': + + '@solana/rpc-subscriptions-api@5.5.1': + resolution: {integrity: sha512-5Oi7k+GdeS8xR2ly1iuSFkAv6CZqwG0Z6b1QZKbEgxadE1XGSDrhM2cn59l+bqCozUWCqh4c/A2znU/qQjROlw==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: optional: true - '@testing-library/user-event@14.6.7': - resolution: {integrity: sha512-MPCpX8bxe8zS+JmmTwLp8jd0dy1rAm60Te/SL8JrQM3qvQJcBOs1d7IefJMyZzqM3EWBrDn/LWDt1BCGu4ASfg==} - engines: {node: '>=12', npm: '>=6'} + '@solana/rpc-subscriptions-channel-websocket@5.5.1': + resolution: {integrity: sha512-7tGfBBrYY8TrngOyxSHoCU5shy86iA9SRMRrPSyBhEaZRAk6dnbdpmUTez7gtdVo0BCvh9nzQtUycKWSS7PnFQ==} + engines: {node: '>=20.18.0'} peerDependencies: - '@testing-library/dom': '>=7.21.4' + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true - '@truffle/abi-utils@1.0.3': - resolution: {integrity: sha512-AWhs01HCShaVKjml7Z4AbVREr/u4oiWxCcoR7Cktm0mEvtT04pvnxW5xB/cI4znRkrbPdFQlFt67kgrAjesYkw==} - engines: {node: ^16.20 || ^18.16 || >=20} - deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + '@solana/rpc-subscriptions-spec@5.5.1': + resolution: {integrity: sha512-iq+rGq5fMKP3/mKHPNB6MC8IbVW41KGZg83Us/+LE3AWOTWV1WT20KT2iH1F1ik9roi42COv/TpoZZvhKj45XQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true - '@truffle/blockchain-utils@0.1.9': - resolution: {integrity: sha512-RHfumgbIVo68Rv9ofDYfynjnYZIfP/f1vZy4RoqkfYAO+fqfc58PDRzB1WAGq2U6GPuOnipOJxQhnqNnffORZg==} - engines: {node: ^16.20 || ^18.16 || >=20} - deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + '@solana/rpc-subscriptions@5.5.1': + resolution: {integrity: sha512-CTMy5bt/6mDh4tc6vUJms9EcuZj3xvK0/xq8IQ90rhkpYvate91RjBP+egvjgSayUg9yucU9vNuUpEjz4spM7w==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true - '@truffle/codec@0.17.3': - resolution: {integrity: sha512-Ko/+dsnntNyrJa57jUD9u4qx9nQby+H4GsUO6yjiCPSX0TQnEHK08XWqBSg0WdmCH2+h0y1nr2CXSx8gbZapxg==} - engines: {node: ^16.20 || ^18.16 || >=20} - deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + '@solana/rpc-transformers@5.5.1': + resolution: {integrity: sha512-OsWqLCQdcrRJKvHiMmwFhp9noNZ4FARuMkHT5us3ustDLXaxOjF0gfqZLnMkulSLcKt7TGXqMhBV+HCo7z5M8Q==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true - '@truffle/compile-common@0.9.8': - resolution: {integrity: sha512-DTpiyo32t/YhLI1spn84D3MHYHrnoVqO+Gp7ZHrYNwDs86mAxtNiH5lsVzSb8cPgiqlvNsRCU9nm9R0YmKMTBQ==} - engines: {node: ^16.20 || ^18.16 || >=20} - deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + '@solana/rpc-transport-http@5.5.1': + resolution: {integrity: sha512-yv8GoVSHqEV0kUJEIhkdOVkR2SvJ6yoWC51cJn2rSV7plr6huLGe0JgujCmB7uZhhaLbcbP3zxXxu9sOjsi7Fg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true - '@truffle/contract-schema@3.4.16': - resolution: {integrity: sha512-g0WNYR/J327DqtJPI70ubS19K1Fth/1wxt2jFqLsPmz5cGZVjCwuhiie+LfBde4/Mc9QR8G+L3wtmT5cyoBxAg==} - engines: {node: ^16.20 || ^18.16 || >=20} - deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + '@solana/rpc-types@5.5.1': + resolution: {integrity: sha512-bibTFQ7PbHJJjGJPmfYC2I+/5CRFS4O2p9WwbFraX1Keeel+nRrt/NBXIy8veP5AEn2sVJIyJPpWBRpCx1oATA==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true - '@truffle/debug-utils@6.0.57': - resolution: {integrity: sha512-Q6oI7zLaeNLB69ixjwZk2UZEWBY6b2OD1sjLMGDKBGR7GaHYiw96GLR2PFgPH1uwEeLmV4N78LYaQCrDsHbNeA==} - engines: {node: ^16.20 || ^18.16 || >=20} - deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + '@solana/rpc@5.5.1': + resolution: {integrity: sha512-ku8zTUMrkCWci66PRIBC+1mXepEnZH/q1f3ck0kJZ95a06bOTl5KU7HeXWtskkyefzARJ5zvCs54AD5nxjQJ+A==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true - '@truffle/error@0.1.1': - resolution: {integrity: sha512-sE7c9IHIGdbK4YayH4BC8i8qMjoAOeg6nUXUDZZp8wlU21/EMpaG+CLx+KqcIPyR+GSWIW3Dm0PXkr2nlggFDA==} - deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + '@solana/signers@5.5.1': + resolution: {integrity: sha512-FY0IVaBT2kCAze55vEieR6hag4coqcuJ31Aw3hqRH7mv6sV8oqwuJmUrx+uFwOp1gwd5OEAzlv6N4hOOple4sQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true - '@truffle/error@0.2.2': - resolution: {integrity: sha512-TqbzJ0O8DHh34cu8gDujnYl4dUl6o2DE4PR6iokbybvnIm/L2xl6+Gv1VC+YJS45xfH83Yo3/Zyg/9Oq8/xZWg==} - engines: {node: ^16.20 || ^18.16 || >=20} - deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + '@solana/subscribable@5.5.1': + resolution: {integrity: sha512-9K0PsynFq0CsmK1CDi5Y2vUIJpCqkgSS5yfDN0eKPgHqEptLEaia09Kaxc90cSZDZU5mKY/zv1NBmB6Aro9zQQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true - '@truffle/interface-adapter@0.5.37': - resolution: {integrity: sha512-lPH9MDgU+7sNDlJSClwyOwPCfuOimqsCx0HfGkznL3mcFRymc1pukAR1k17zn7ErHqBwJjiKAZ6Ri72KkS+IWw==} - engines: {node: ^16.20 || ^18.16 || >=20} - deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + '@solana/sysvars@5.5.1': + resolution: {integrity: sha512-k3Quq87Mm+geGUu1GWv6knPk0ALsfY6EKSJGw9xUJDHzY/RkYSBnh0RiOrUhtFm2TDNjOailg8/m0VHmi3reFA==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true - '@trufflesuite/chromafi@3.0.0': - resolution: {integrity: sha512-oqWcOqn8nT1bwlPPfidfzS55vqcIDdpfzo3HbU9EnUmcSTX+I8z0UyUFI3tZQjByVJulbzxHxUGS3ZJPwK/GPQ==} + '@solana/transaction-confirmation@5.5.1': + resolution: {integrity: sha512-j4mKlYPHEyu+OD7MBt3jRoX4ScFgkhZC6H65on4Fux6LMScgivPJlwnKoZMnsgxFgWds0pl+BYzSiALDsXlYtw==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true - '@tybys/wasm-util@0.10.4': - resolution: {integrity: sha512-W3c4gRigFS0T/Ma4qIYF3GDAc5AQdHb1yL5znJT1Zv1YaD9Kitx656wBjvr19qbiosmZT8lWDM5BEMynUqX65A==} + '@solana/transaction-messages@5.5.1': + resolution: {integrity: sha512-aXyhMCEaAp3M/4fP0akwBBQkFPr4pfwoC5CLDq999r/FUwDax2RE/h4Ic7h2Xk+JdcUwsb+rLq85Y52hq84XvQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true - '@typechain/ethers-v5@2.0.0': - resolution: {integrity: sha512-0xdCkyGOzdqh4h5JSf+zoWx85IusEjDcPIwNEHP8mrWSnCae4rvrqB+/gtpdNfX7zjlFlZiMeePn2r63EI3Lrw==} + '@solana/transactions@5.5.1': + resolution: {integrity: sha512-8hHtDxtqalZ157pnx6p8k10D7J/KY/biLzfgh9R09VNLLY3Fqi7kJvJCr7M2ik3oRll56pxhraAGCC9yIT6eOA==} + engines: {node: '>=20.18.0'} peerDependencies: - ethers: ^5.0.0 - typechain: ^3.0.0 + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true - '@types/aria-query@5.0.1': - resolution: {integrity: sha512-XTIieEY+gvJ39ChLcB4If5zHtPxt3Syj5rgZR+e1ctpmK8NjPf0zFqsz4JpLJT0xla9GFDKjy8Cpu331nrmE1Q==} + '@stablelib/aead@1.0.1': + resolution: {integrity: sha512-q39ik6sxGHewqtO0nP4BuSe3db5G1fEJE8ukvngS2gLkBXyy6E7pLubhbYgnkDFv6V8cWaxcE4Xn0t6LWcJkyg==} - '@types/babel__core@7.20.5': - resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + '@stablelib/binary@1.0.1': + resolution: {integrity: sha512-ClJWvmL6UBM/wjkvv/7m5VP3GMr9t0osr4yVgLZsLCOz4hGN9gIAFEqnJ0TsSMAN+n840nf2cHZnA5/KFqHC7Q==} - '@types/babel__generator@7.27.0': - resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==} + '@stablelib/bytes@1.0.1': + resolution: {integrity: sha512-Kre4Y4kdwuqL8BR2E9hV/R5sOrUj6NanZaZis0V6lX5yzqC3hBuVSDXUIBqQv/sCpmuWRiHLwqiT1pqqjuBXoQ==} - '@types/babel__template@7.4.4': - resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + '@stablelib/chacha20poly1305@1.0.1': + resolution: {integrity: sha512-MmViqnqHd1ymwjOQfghRKw2R/jMIGT3wySN7cthjXCBdO+qErNPUBnRzqNpnvIwg7JBCg3LdeCZZO4de/yEhVA==} - '@types/babel__traverse@7.28.0': - resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==} + '@stablelib/chacha@1.0.1': + resolution: {integrity: sha512-Pmlrswzr0pBzDofdFuVe1q7KdsHKhhU24e8gkEwnTGOmlC7PADzLVxGdn2PoNVBBabdg0l/IfLKg6sHAbTQugg==} - '@types/bn.js@4.11.6': - resolution: {integrity: sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==} + '@stablelib/constant-time@1.0.1': + resolution: {integrity: sha512-tNOs3uD0vSJcK6z1fvef4Y+buN7DXhzHDPqRLSXUel1UfqMB1PWNsnnAezrKfEwTLpN0cGH2p9NNjs6IqeD0eg==} - '@types/bn.js@5.1.6': - resolution: {integrity: sha512-Xh8vSwUeMKeYYrj3cX4lGQgFSF/N03r+tv4AiLl1SucqV+uTQpxRcnM8AkXKHwYP9ZPXOYXRr2KPXpVlIvqh9w==} + '@stablelib/ed25519@1.0.3': + resolution: {integrity: sha512-puIMWaX9QlRsbhxfDc5i+mNPMY+0TmQEskunY1rZEBPi1acBCVQAhnsk/1Hk50DGPtVsZtAWQg4NHGlVaO9Hqg==} - '@types/cacheable-request@6.0.3': - resolution: {integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==} + '@stablelib/hash@1.0.1': + resolution: {integrity: sha512-eTPJc/stDkdtOcrNMZ6mcMK1e6yBbqRBaNW55XA1jU8w/7QdnCF0CmMmOD1m7VSkBR44PWrMHU2l6r8YEQHMgg==} - '@types/chai@4.3.20': - resolution: {integrity: sha512-/pC9HAB5I/xMlc5FP77qjCnI16ChlJfW0tGa0IUcFn38VJrTV6DeZ60NU5KZBtaOZqjdpwTWohz5HU1RrhiYxQ==} + '@stablelib/hkdf@1.0.1': + resolution: {integrity: sha512-SBEHYE16ZXlHuaW5RcGk533YlBj4grMeg5TooN80W3NpcHRtLZLLXvKyX0qcRFxf+BGDobJLnwkvgEwHIDBR6g==} - '@types/chai@5.2.3': - resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} + '@stablelib/hmac@1.0.1': + resolution: {integrity: sha512-V2APD9NSnhVpV/QMYgCVMIYKiYG6LSqw1S65wxVoirhU/51ACio6D4yDVSwMzuTJXWZoVHbDdINioBwKy5kVmA==} - '@types/cli-table@0.3.4': - resolution: {integrity: sha512-GsALrTL69mlwbAw/MHF1IPTadSLZQnsxe7a80G8l4inN/iEXCOcVeT/S7aRc6hbhqzL9qZ314kHPDQnQ3ev+HA==} + '@stablelib/int@1.0.1': + resolution: {integrity: sha512-byr69X/sDtDiIjIV6m4roLVWnNNlRGzsvxw+agj8CIEazqWGOQp2dTYgQhtyVXV9wpO6WyXRQUzLV/JRNumT2w==} - '@types/d3-array@3.2.1': - resolution: {integrity: sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==} + '@stablelib/keyagreement@1.0.1': + resolution: {integrity: sha512-VKL6xBwgJnI6l1jKrBAfn265cspaWBPAPEc62VBQrWHLqVgNRE09gQ/AnOEyKUWrrqfD+xSQ3u42gJjLDdMDQg==} - '@types/d3-color@3.1.0': - resolution: {integrity: sha512-HKuicPHJuvPgCD+np6Se9MQvS6OCbJmOjGvylzMJRlDwUXjKTTXs6Pwgk79O09Vj/ho3u1ofXnhFOaEWWPrlwA==} + '@stablelib/poly1305@1.0.1': + resolution: {integrity: sha512-1HlG3oTSuQDOhSnLwJRKeTRSAdFNVB/1djy2ZbS35rBSJ/PFqx9cf9qatinWghC2UbfOYD8AcrtbUQl8WoxabA==} - '@types/d3-ease@3.0.2': - resolution: {integrity: sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==} + '@stablelib/random@1.0.2': + resolution: {integrity: sha512-rIsE83Xpb7clHPVRlBj8qNe5L8ISQOzjghYQm/dZ7VaM2KHYwMW5adjQjrzTZCchFnNCNhkwtnOBa9HTMJCI8w==} - '@types/d3-interpolate@3.0.4': - resolution: {integrity: sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==} + '@stablelib/sha256@1.0.1': + resolution: {integrity: sha512-GIIH3e6KH+91FqGV42Kcj71Uefd/QEe7Dy42sBTeqppXV95ggCcxLTk39bEr+lZfJmp+ghsR07J++ORkRELsBQ==} - '@types/d3-path@3.0.0': - resolution: {integrity: sha512-0g/A+mZXgFkQxN3HniRDbXMN79K3CdTpLsevj+PXiTcb2hVyvkZUBg37StmgCQkaD84cUJ4uaDAWq7UJOQy2Tg==} + '@stablelib/sha512@1.0.1': + resolution: {integrity: sha512-13gl/iawHV9zvDKciLo1fQ8Bgn2Pvf7OV6amaRVKiq3pjQ3UmEpXxWiAfV8tYjUpeZroBxtyrwtdooQT/i3hzw==} - '@types/d3-scale@4.0.9': - resolution: {integrity: sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==} + '@stablelib/wipe@1.0.1': + resolution: {integrity: sha512-WfqfX/eXGiAd3RJe4VU2snh/ZPwtSjLG4ynQ/vYzvghTh7dHFcI1wl+nrkWG6lGhukOxOsUHfv8dUXr58D0ayg==} - '@types/d3-shape@3.1.7': - resolution: {integrity: sha512-VLvUQ33C+3J+8p+Daf+nYSOsjB4GXp19/S/aGo60m9h1v6XaxjiT82lKVWJCfzhtuZ3yD7i/TPeC/fuKLLOSmg==} + '@stablelib/x25519@1.0.3': + resolution: {integrity: sha512-KnTbKmUhPhHavzobclVJQG5kuivH+qDLpe84iRqX3CLrKp881cF160JvXJ+hjn1aMyCwYOKeIZefIH/P5cJoRw==} - '@types/d3-time@3.0.4': - resolution: {integrity: sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==} + '@standard-schema/spec@1.0.0': + resolution: {integrity: sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==} - '@types/d3-timer@3.0.2': - resolution: {integrity: sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==} + '@standard-schema/utils@0.3.0': + resolution: {integrity: sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==} - '@types/debug@4.1.12': - resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + '@storybook/addon-links@10.6.0': + resolution: {integrity: sha512-kbGLPiA0yJ0pb/YM/K8O4N4aI7iQmCOoaOdpjLFJgCA2lVXKVIdZA49DaaNifWWr1dniwAw5eJdyLkVaqJO0Ag==} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + storybook: ^10.6.0 + peerDependenciesMeta: + '@types/react': + optional: true + react: + optional: true - '@types/deep-eql@4.0.2': - resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} + '@storybook/builder-vite@10.6.0': + resolution: {integrity: sha512-7zt8tYB6dnSO8fbjUz91MHexGDpf9HrLlA3FAmlVb+2ZL3eWUs499L3I6BDUymcWu7oW5WCBJlB8ERj8ZLLzig==} + peerDependencies: + storybook: ^10.6.0 + vite: ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 - '@types/doctrine@0.0.9': - resolution: {integrity: sha512-eOIHzCUSH7SMfonMG1LsC2f8vxBFtho6NGBznK41R84YzPuvSBzrhEps33IsQiOW9+VL6NQ9DbjQJznk/S4uRA==} + '@storybook/global@5.0.0': + resolution: {integrity: sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ==} - '@types/eslint@9.6.1': - resolution: {integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==} + '@storybook/icons@2.1.0': + resolution: {integrity: sha512-Fxh9vYpX9bQqFeHRiY8h2ApeRGDzRSMLwJwNZ/AIRqnyOKHxRKL+yFe+ctEkVJmuptRE9u1Hrn8ZZNHyfDKKNg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - '@types/esrecurse@4.3.1': - resolution: {integrity: sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==} + '@storybook/nextjs-vite@10.6.0': + resolution: {integrity: sha512-TTXZsOUAXyezvZt+ICuIpYjzOkUXfEidUCbd/nnzczHaoxLWvVqwTzVHt9To7zsXWSfZFOxHQV9F4Uuzh74aKw==} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + '@types/react-dom': ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + next: ^14.1.0 || ^15.0.0 || ^16.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + storybook: ^10.6.0 + typescript: '*' + vite: ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + typescript: + optional: true - '@types/estree@1.0.8': - resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + '@storybook/react-dom-shim@10.6.0': + resolution: {integrity: sha512-ZE0l4xL6d00rKFeJhRDuh0t3r+/2ffhx47lIyaSWrTD5kuM3nDjKDxCIWwX4E3gLV+oNX8E1prXRMuEWJUJwJg==} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + '@types/react-dom': ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + storybook: ^10.6.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true - '@types/gensync@1.0.5': - resolution: {integrity: sha512-MbsRCT7mTikHwKZ0X+LVUTLRrZZRLipTuXEO9qOYO+zmjMVk81axyClMROf6uoPD9MRVu46bx8zoR0Ad9q3NAg==} + '@storybook/react-vite@10.6.0': + resolution: {integrity: sha512-nc1dqnmjGOcDJvPCkAn4Hmu1gi7dNHHoibNmlBp0d1adosejELZxuNjHBkPl/KxZjbzP3jljQHnHB/guxd8e2g==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + storybook: ^10.6.0 + typescript: '>= 4.9.x' + vite: ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + typescript: + optional: true - '@types/http-cache-semantics@4.0.4': - resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==} + '@storybook/react@10.6.0': + resolution: {integrity: sha512-0xfYYPRHcr5ta1hmXJCSezH4JGuUHJ+xVF9f1j+Y/MWEMOQE4wnaKWKsk/HLrDjZkT5hKfvmogt9b0yduP6zEQ==} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + '@types/react-dom': ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + storybook: ^10.6.0 + typescript: '>= 4.9.x' + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + typescript: + optional: true - '@types/humanize-duration@3.27.4': - resolution: {integrity: sha512-yaf7kan2Sq0goxpbcwTQ+8E9RP6HutFBPv74T/IA/ojcHKhuKVlk2YFYyHhWZeLvZPzzLE3aatuQB4h0iqyyUA==} + '@supercharge/promise-pool@3.3.0': + resolution: {integrity: sha512-qGzCltMN05ohRRQAXB8TPWt+0Coz9Va266gr9nYN1qc/f/EIaup3VRg7b59mtRaeKTRcxreF20l/udCM/gOqNg==} + engines: {node: '>=8'} - '@types/istanbul-lib-coverage@2.0.6': - resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} + '@swc/helpers@0.5.23': + resolution: {integrity: sha512-5lSsMOTXURePglDfvuAQUqkGek9Hg2kksOYay2m0+XR++b2NWYL/4sWyuvVBIs8oKnJaxkdi9whaL/sqN13afw==} - '@types/istanbul-lib-report@3.0.3': - resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} + '@szmarczak/http-timer@1.1.2': + resolution: {integrity: sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==} + engines: {node: '>=6'} - '@types/istanbul-reports@3.0.4': - resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} + '@szmarczak/http-timer@4.0.6': + resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==} + engines: {node: '>=10'} - '@types/jest@30.0.0': - resolution: {integrity: sha512-XTYugzhuwqWjws0CVz8QpM36+T+Dz5mTEBKhNs/esGLnCIlGdRy+Dq78NRjd7ls7r8BC8ZRMOrKlkO1hU0JOwA==} + '@szmarczak/http-timer@5.0.1': + resolution: {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==} + engines: {node: '>=14.16'} - '@types/jsdom@21.1.7': - resolution: {integrity: sha512-yOriVnggzrnQ3a9OKOCxaVuSug3w3/SbOj5i7VwXWZEyUNl3bLF9V3MfxGbZKuwqJOQyRfqXyROBB1CoZLFWzA==} + '@tanstack/query-core@5.104.0': + resolution: {integrity: sha512-JrC2r/JQlXt7khBSdUpsgxNvybzOg+aITa+ARRMlP2AFo93Y8vIqz077rp+e61mJetSZ0T6AJbwW1JHer1vrPQ==} - '@types/jsesc@2.5.1': - resolution: {integrity: sha512-9VN+6yxLOPLOav+7PwjZbxiID2bVaeq0ED4qSQmdQTdjnXJSaCVKTR58t15oqH1H5t8Ng2ZX1SabJVoN9Q34bw==} + '@tanstack/react-query@5.104.0': + resolution: {integrity: sha512-e1TZmDCQnWIfiDVryIHeA6Idj+Lfx1hORLOhXS/l5wcgvtVD4yYqbTDl378sGQKIi2cSgb0TEMC9cKK8GGoJEw==} + peerDependencies: + react: ^18 || ^19 - '@types/json-schema@7.0.15': - resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + '@testing-library/dom@10.4.2': + resolution: {integrity: sha512-yzr2S9HyAIdhz2/6qHgbs665Q7PKVcDF05vsOlHPxG1mo36gKVesdYVeDLnXgfjJ03CrKRk08knc6+E/9m8v2Q==} + engines: {node: '>=18'} - '@types/json5@0.0.29': - resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} + '@testing-library/jest-dom@6.9.1': + resolution: {integrity: sha512-zIcONa+hVtVSSep9UT3jZ5rizo2BsxgyDYU7WFD5eICBE7no3881HGeb/QkGfsJs6JTkY1aQhT7rIPC7e+0nnA==} + engines: {node: '>=14', npm: '>=6', yarn: '>=1'} - '@types/keyv@3.1.4': - resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} + '@testing-library/jest-dom@7.0.1': + resolution: {integrity: sha512-oMDTC3oA+6CXSO2JZnvOI7CA6oVub6kij5ggk9ohwye5slmkwxYDXcPOVxgMw/RQlticjtO0C1RZkR97HgrWMw==} + engines: {node: '>=22', npm: '>=6', yarn: '>=1'} + peerDependencies: + '@testing-library/dom': '>=10 <11' + vitest: '>= 0.32' + peerDependenciesMeta: + vitest: + optional: true - '@types/lodash@4.17.25': - resolution: {integrity: sha512-+K1NIO8I+F9/wNulfVvu23QYd0Pe9/OCqRrim4NoYIf1VoEDL90Ve4ClzpyqBLc7NpGGWRvYNCKZ1BE/Jpf8dQ==} + '@testing-library/react@16.3.3': + resolution: {integrity: sha512-Uo193NgQbPMz6lrrhtRQQFcMC6Re/ELLFbbuVL30WDlZxlpZf9/lMHTAVxPRLw1q1iu9OJmR1c2BLiENRstdBg==} + engines: {node: '>=18'} + peerDependencies: + '@testing-library/dom': ^10.0.0 + '@types/react': ^18.0.0 || ^19.0.0 + '@types/react-dom': ^18.0.0 || ^19.0.0 + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true - '@types/lru-cache@5.1.1': - resolution: {integrity: sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw==} + '@testing-library/user-event@14.6.7': + resolution: {integrity: sha512-MPCpX8bxe8zS+JmmTwLp8jd0dy1rAm60Te/SL8JrQM3qvQJcBOs1d7IefJMyZzqM3EWBrDn/LWDt1BCGu4ASfg==} + engines: {node: '>=12', npm: '>=6'} + peerDependencies: + '@testing-library/dom': '>=7.21.4' - '@types/mkdirp@0.5.2': - resolution: {integrity: sha512-U5icWpv7YnZYGsN4/cmh3WD2onMY0aJIiTE6+51TwJCttdHvtCYmkBNOobHlXwrJRL0nkH9jH4kD+1FAdMN4Tg==} + '@truffle/abi-utils@1.0.3': + resolution: {integrity: sha512-AWhs01HCShaVKjml7Z4AbVREr/u4oiWxCcoR7Cktm0mEvtT04pvnxW5xB/cI4znRkrbPdFQlFt67kgrAjesYkw==} + engines: {node: ^16.20 || ^18.16 || >=20} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. - '@types/ms@2.1.0': - resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} + '@truffle/blockchain-utils@0.1.9': + resolution: {integrity: sha512-RHfumgbIVo68Rv9ofDYfynjnYZIfP/f1vZy4RoqkfYAO+fqfc58PDRzB1WAGq2U6GPuOnipOJxQhnqNnffORZg==} + engines: {node: ^16.20 || ^18.16 || >=20} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. - '@types/node-fetch@2.6.12': - resolution: {integrity: sha512-8nneRWKCg3rMtF69nLQJnOYUcbafYeFSjqkw3jCRLsqkWFlHaoQrr5mXmofFGOx3DKn7UfmBMyov8ySvLRVldA==} + '@truffle/codec@0.17.3': + resolution: {integrity: sha512-Ko/+dsnntNyrJa57jUD9u4qx9nQby+H4GsUO6yjiCPSX0TQnEHK08XWqBSg0WdmCH2+h0y1nr2CXSx8gbZapxg==} + engines: {node: ^16.20 || ^18.16 || >=20} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. - '@types/node@12.20.55': - resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} + '@truffle/compile-common@0.9.8': + resolution: {integrity: sha512-DTpiyo32t/YhLI1spn84D3MHYHrnoVqO+Gp7ZHrYNwDs86mAxtNiH5lsVzSb8cPgiqlvNsRCU9nm9R0YmKMTBQ==} + engines: {node: ^16.20 || ^18.16 || >=20} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. - '@types/node@24.13.4': - resolution: {integrity: sha512-YJ7EqCstVTzIr0fMr7qul/977en+pQHrfmuKIo6Zr9i75Be21dr3MovcfvGtyvi2HAUrRerWps5sMO9I7WaxDw==} + '@truffle/contract-schema@3.4.16': + resolution: {integrity: sha512-g0WNYR/J327DqtJPI70ubS19K1Fth/1wxt2jFqLsPmz5cGZVjCwuhiie+LfBde4/Mc9QR8G+L3wtmT5cyoBxAg==} + engines: {node: ^16.20 || ^18.16 || >=20} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. - '@types/parse-json@4.0.0': - resolution: {integrity: sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==} + '@truffle/debug-utils@6.0.57': + resolution: {integrity: sha512-Q6oI7zLaeNLB69ixjwZk2UZEWBY6b2OD1sjLMGDKBGR7GaHYiw96GLR2PFgPH1uwEeLmV4N78LYaQCrDsHbNeA==} + engines: {node: ^16.20 || ^18.16 || >=20} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. - '@types/pbkdf2@3.1.2': - resolution: {integrity: sha512-uRwJqmiXmh9++aSu1VNEn3iIxWOhd8AHXNSdlaLfdAAdSTY9jYVeGWnzejM3dvrkbqE3/hyQkQQ29IFATEGlew==} + '@truffle/error@0.1.1': + resolution: {integrity: sha512-sE7c9IHIGdbK4YayH4BC8i8qMjoAOeg6nUXUDZZp8wlU21/EMpaG+CLx+KqcIPyR+GSWIW3Dm0PXkr2nlggFDA==} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. - '@types/prettier@2.7.2': - resolution: {integrity: sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg==} + '@truffle/error@0.2.2': + resolution: {integrity: sha512-TqbzJ0O8DHh34cu8gDujnYl4dUl6o2DE4PR6iokbybvnIm/L2xl6+Gv1VC+YJS45xfH83Yo3/Zyg/9Oq8/xZWg==} + engines: {node: ^16.20 || ^18.16 || >=20} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. - '@types/react-dom@19.3.0': - resolution: {integrity: sha512-ZI7bU42mZXXKHn/qNLEw2IrbiINU7X5+vfgdixBHkCNpYWXjKgfQ/P+uyGb5CjOLB9UcnTeg3rylQtV2hym44Q==} - peerDependencies: - '@types/react': ^19.3.0 + '@truffle/interface-adapter@0.5.37': + resolution: {integrity: sha512-lPH9MDgU+7sNDlJSClwyOwPCfuOimqsCx0HfGkznL3mcFRymc1pukAR1k17zn7ErHqBwJjiKAZ6Ri72KkS+IWw==} + engines: {node: ^16.20 || ^18.16 || >=20} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. - '@types/react-gtm-module@2.0.4': - resolution: {integrity: sha512-5wPMWsUE5AI6O0B0K1/zbs0rFHBKu+7NWXQwDXhqvA12ooLD6W1AYiWZqR4UiOd7ixZDV1H5Ys301zEsqyIfNg==} + '@trufflesuite/chromafi@3.0.0': + resolution: {integrity: sha512-oqWcOqn8nT1bwlPPfidfzS55vqcIDdpfzo3HbU9EnUmcSTX+I8z0UyUFI3tZQjByVJulbzxHxUGS3ZJPwK/GPQ==} - '@types/react@19.3.0': - resolution: {integrity: sha512-N0rFCuH9YoxG9/m61l9MfpJKfmLOVU0em7ipIz6TRgSSkvReLB9vL85GB+yr8Bs5leqpvg96JSwF4ZS1s4viQg==} + '@tybys/wasm-util@0.10.4': + resolution: {integrity: sha512-W3c4gRigFS0T/Ma4qIYF3GDAc5AQdHb1yL5znJT1Zv1YaD9Kitx656wBjvr19qbiosmZT8lWDM5BEMynUqX65A==} - '@types/resolve@0.0.8': - resolution: {integrity: sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ==} + '@typechain/ethers-v5@2.0.0': + resolution: {integrity: sha512-0xdCkyGOzdqh4h5JSf+zoWx85IusEjDcPIwNEHP8mrWSnCae4rvrqB+/gtpdNfX7zjlFlZiMeePn2r63EI3Lrw==} + peerDependencies: + ethers: ^5.0.0 + typechain: ^3.0.0 - '@types/resolve@1.20.6': - resolution: {integrity: sha512-A4STmOXPhMUtHH+S6ymgE2GiBSMqf4oTvcQZMcHzokuTLVYzXTB8ttjcgxOVaAp2lGwEdzZ0J+cRbbeevQj1UQ==} + '@types/aria-query@5.0.1': + resolution: {integrity: sha512-XTIieEY+gvJ39ChLcB4If5zHtPxt3Syj5rgZR+e1ctpmK8NjPf0zFqsz4JpLJT0xla9GFDKjy8Cpu331nrmE1Q==} - '@types/responselike@1.0.3': - resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==} + '@types/babel__core@7.20.5': + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} - '@types/secp256k1@4.0.6': + '@types/babel__generator@7.27.0': + resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==} + + '@types/babel__template@7.4.4': + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + + '@types/babel__traverse@7.28.0': + resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==} + + '@types/bn.js@4.11.6': + resolution: {integrity: sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==} + + '@types/bn.js@5.1.6': + resolution: {integrity: sha512-Xh8vSwUeMKeYYrj3cX4lGQgFSF/N03r+tv4AiLl1SucqV+uTQpxRcnM8AkXKHwYP9ZPXOYXRr2KPXpVlIvqh9w==} + + '@types/cacheable-request@6.0.3': + resolution: {integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==} + + '@types/chai@4.3.20': + resolution: {integrity: sha512-/pC9HAB5I/xMlc5FP77qjCnI16ChlJfW0tGa0IUcFn38VJrTV6DeZ60NU5KZBtaOZqjdpwTWohz5HU1RrhiYxQ==} + + '@types/chai@5.2.3': + resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} + + '@types/cli-table@0.3.4': + resolution: {integrity: sha512-GsALrTL69mlwbAw/MHF1IPTadSLZQnsxe7a80G8l4inN/iEXCOcVeT/S7aRc6hbhqzL9qZ314kHPDQnQ3ev+HA==} + + '@types/d3-array@3.2.1': + resolution: {integrity: sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==} + + '@types/d3-color@3.1.0': + resolution: {integrity: sha512-HKuicPHJuvPgCD+np6Se9MQvS6OCbJmOjGvylzMJRlDwUXjKTTXs6Pwgk79O09Vj/ho3u1ofXnhFOaEWWPrlwA==} + + '@types/d3-ease@3.0.2': + resolution: {integrity: sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==} + + '@types/d3-interpolate@3.0.4': + resolution: {integrity: sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==} + + '@types/d3-path@3.0.0': + resolution: {integrity: sha512-0g/A+mZXgFkQxN3HniRDbXMN79K3CdTpLsevj+PXiTcb2hVyvkZUBg37StmgCQkaD84cUJ4uaDAWq7UJOQy2Tg==} + + '@types/d3-scale@4.0.9': + resolution: {integrity: sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==} + + '@types/d3-shape@3.1.7': + resolution: {integrity: sha512-VLvUQ33C+3J+8p+Daf+nYSOsjB4GXp19/S/aGo60m9h1v6XaxjiT82lKVWJCfzhtuZ3yD7i/TPeC/fuKLLOSmg==} + + '@types/d3-time@3.0.4': + resolution: {integrity: sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==} + + '@types/d3-timer@3.0.2': + resolution: {integrity: sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==} + + '@types/debug@4.1.12': + resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + + '@types/deep-eql@4.0.2': + resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} + + '@types/doctrine@0.0.9': + resolution: {integrity: sha512-eOIHzCUSH7SMfonMG1LsC2f8vxBFtho6NGBznK41R84YzPuvSBzrhEps33IsQiOW9+VL6NQ9DbjQJznk/S4uRA==} + + '@types/eslint@9.6.1': + resolution: {integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==} + + '@types/esrecurse@4.3.1': + resolution: {integrity: sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==} + + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + + '@types/gensync@1.0.5': + resolution: {integrity: sha512-MbsRCT7mTikHwKZ0X+LVUTLRrZZRLipTuXEO9qOYO+zmjMVk81axyClMROf6uoPD9MRVu46bx8zoR0Ad9q3NAg==} + + '@types/http-cache-semantics@4.0.4': + resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==} + + '@types/humanize-duration@3.27.4': + resolution: {integrity: sha512-yaf7kan2Sq0goxpbcwTQ+8E9RP6HutFBPv74T/IA/ojcHKhuKVlk2YFYyHhWZeLvZPzzLE3aatuQB4h0iqyyUA==} + + '@types/istanbul-lib-coverage@2.0.6': + resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} + + '@types/istanbul-lib-report@3.0.3': + resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} + + '@types/istanbul-reports@3.0.4': + resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} + + '@types/jest@30.0.0': + resolution: {integrity: sha512-XTYugzhuwqWjws0CVz8QpM36+T+Dz5mTEBKhNs/esGLnCIlGdRy+Dq78NRjd7ls7r8BC8ZRMOrKlkO1hU0JOwA==} + + '@types/jsdom@21.1.7': + resolution: {integrity: sha512-yOriVnggzrnQ3a9OKOCxaVuSug3w3/SbOj5i7VwXWZEyUNl3bLF9V3MfxGbZKuwqJOQyRfqXyROBB1CoZLFWzA==} + + '@types/jsesc@2.5.1': + resolution: {integrity: sha512-9VN+6yxLOPLOav+7PwjZbxiID2bVaeq0ED4qSQmdQTdjnXJSaCVKTR58t15oqH1H5t8Ng2ZX1SabJVoN9Q34bw==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/json5@0.0.29': + resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} + + '@types/keyv@3.1.4': + resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} + + '@types/lodash@4.17.25': + resolution: {integrity: sha512-+K1NIO8I+F9/wNulfVvu23QYd0Pe9/OCqRrim4NoYIf1VoEDL90Ve4ClzpyqBLc7NpGGWRvYNCKZ1BE/Jpf8dQ==} + + '@types/lru-cache@5.1.1': + resolution: {integrity: sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw==} + + '@types/mkdirp@0.5.2': + resolution: {integrity: sha512-U5icWpv7YnZYGsN4/cmh3WD2onMY0aJIiTE6+51TwJCttdHvtCYmkBNOobHlXwrJRL0nkH9jH4kD+1FAdMN4Tg==} + + '@types/ms@2.1.0': + resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} + + '@types/node-fetch@2.6.12': + resolution: {integrity: sha512-8nneRWKCg3rMtF69nLQJnOYUcbafYeFSjqkw3jCRLsqkWFlHaoQrr5mXmofFGOx3DKn7UfmBMyov8ySvLRVldA==} + + '@types/node@12.20.55': + resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} + + '@types/node@24.13.4': + resolution: {integrity: sha512-YJ7EqCstVTzIr0fMr7qul/977en+pQHrfmuKIo6Zr9i75Be21dr3MovcfvGtyvi2HAUrRerWps5sMO9I7WaxDw==} + + '@types/parse-json@4.0.0': + resolution: {integrity: sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==} + + '@types/pbkdf2@3.1.2': + resolution: {integrity: sha512-uRwJqmiXmh9++aSu1VNEn3iIxWOhd8AHXNSdlaLfdAAdSTY9jYVeGWnzejM3dvrkbqE3/hyQkQQ29IFATEGlew==} + + '@types/prettier@2.7.2': + resolution: {integrity: sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg==} + + '@types/react-dom@19.3.0': + resolution: {integrity: sha512-ZI7bU42mZXXKHn/qNLEw2IrbiINU7X5+vfgdixBHkCNpYWXjKgfQ/P+uyGb5CjOLB9UcnTeg3rylQtV2hym44Q==} + peerDependencies: + '@types/react': ^19.3.0 + + '@types/react-gtm-module@2.0.4': + resolution: {integrity: sha512-5wPMWsUE5AI6O0B0K1/zbs0rFHBKu+7NWXQwDXhqvA12ooLD6W1AYiWZqR4UiOd7ixZDV1H5Ys301zEsqyIfNg==} + + '@types/react@19.3.0': + resolution: {integrity: sha512-N0rFCuH9YoxG9/m61l9MfpJKfmLOVU0em7ipIz6TRgSSkvReLB9vL85GB+yr8Bs5leqpvg96JSwF4ZS1s4viQg==} + + '@types/resolve@0.0.8': + resolution: {integrity: sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ==} + + '@types/resolve@1.20.6': + resolution: {integrity: sha512-A4STmOXPhMUtHH+S6ymgE2GiBSMqf4oTvcQZMcHzokuTLVYzXTB8ttjcgxOVaAp2lGwEdzZ0J+cRbbeevQj1UQ==} + + '@types/responselike@1.0.3': + resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==} + + '@types/secp256k1@4.0.6': resolution: {integrity: sha512-hHxJU6PAEUn0TP4S/ZOzuTUvJWuZ6eIKeNKb5RBpODvSl6hp1Wrw4s7ATY50rklRCScUDpHzVA/DQdSjJ3UoYQ==} '@types/sinon-chai@3.2.12': @@ -3869,6 +4464,20 @@ packages: cpu: [x64] os: [win32] + '@vanilla-extract/css@1.20.1': + resolution: {integrity: sha512-5I9RNo5uZW9tsBnqrWzJqELegOqTHBrZyDFnES0gR9gJJHBB9dom1N0bwITM9tKwBcfKrTX4a6DHVeQdJ2ubQA==} + + '@vanilla-extract/dynamic@2.1.5': + resolution: {integrity: sha512-QGIFGb1qyXQkbzx6X6i3+3LMc/iv/ZMBttMBL+Wm/DetQd36KsKsFg5CtH3qy+1hCA/5w93mEIIAiL4fkM8ycw==} + + '@vanilla-extract/private@1.0.9': + resolution: {integrity: sha512-gT2jbfZuaaCLrAxwXbRgIhGhcXbRZCG3v4TTUnjw0EJ7ArdBRxkq4msNJkbuRkCgfIK5ATmprB5t9ljvLeFDEA==} + + '@vanilla-extract/sprinkles@1.6.5': + resolution: {integrity: sha512-HOYidLONR/SeGk8NBAeI64I4gYdsMX9vJmniL13ZcLVwawyK0s2GUENEAcGA+GYLIoeyQB61UqmhqPodJry7zA==} + peerDependencies: + '@vanilla-extract/css': ^1.0.0 + '@vercel/speed-insights@2.0.0': resolution: {integrity: sha512-jwkNcrTeafWxjmWq4AHBaptSqZiJkYU5adLC9QBSqeim0GcqDMgN5Ievh8OG1rJ6W3A4l1oiP7qr9CWxGuzu3w==} peerDependencies: @@ -3912,10 +4521,40 @@ packages: '@vitest/utils@3.2.4': resolution: {integrity: sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==} + '@wagmi/connectors@6.2.0': + resolution: {integrity: sha512-2NfkbqhNWdjfibb4abRMrn7u6rPjEGolMfApXss6HCDVt9AW2oVC6k8Q5FouzpJezElxLJSagWz9FW1zaRlanA==} + peerDependencies: + '@wagmi/core': 2.22.1 + typescript: '>=5.0.4' + viem: 2.x + peerDependenciesMeta: + typescript: + optional: true + + '@wagmi/core@2.22.1': + resolution: {integrity: sha512-cG/xwQWsBEcKgRTkQVhH29cbpbs/TdcUJVFXCyri3ZknxhMyGv0YEjTcrNpRgt2SaswL1KrvslSNYKKo+5YEAg==} + peerDependencies: + '@tanstack/query-core': '>=5.0.0' + typescript: '>=5.0.4' + viem: 2.x + peerDependenciesMeta: + '@tanstack/query-core': + optional: true + typescript: + optional: true + '@walletconnect/core@2.17.3': resolution: {integrity: sha512-57uv0FW4L6H/tmkb1kS2nG41MDguyDgZbGR58nkDUd1TO/HydyiTByVOhFzIxgN331cnY/1G1rMaKqncgdnOFA==} engines: {node: '>=18'} + '@walletconnect/core@2.21.0': + resolution: {integrity: sha512-o6R7Ua4myxR8aRUAJ1z3gT9nM+jd2B2mfamu6arzy1Cc6vi10fIwFWb6vg3bC8xJ6o9H3n/cN5TOW3aA9Y1XVw==} + engines: {node: '>=18'} + + '@walletconnect/core@2.21.1': + resolution: {integrity: sha512-Tp4MHJYcdWD846PH//2r+Mu4wz1/ZU/fr9av1UWFiaYQ2t2TPLDiZxjLw54AAEpMqlEHemwCgiRiAmjR1NDdTQ==} + engines: {node: '>=18'} + '@walletconnect/environment@1.0.1': resolution: {integrity: sha512-T426LLZtHj8e8rYnKfzsw1aG6+M0BT1ZxayMdv/p8yM0MU+eJDISqNY3/bccxRr4LrF9csq02Rhqt08Ibl0VRg==} @@ -3923,6 +4562,10 @@ packages: resolution: {integrity: sha512-fgoT+dT9M1P6IIUtBl66ddD+4IJYqdhdAYkW+wa6jbctxKlHYSXf9HsgF/Vvv9lMnxHdAIz0W9VN4D/m20MamA==} deprecated: 'Reliability and performance improvements. See: https://github.com/WalletConnect/walletconnect-monorepo/releases' + '@walletconnect/ethereum-provider@2.21.1': + resolution: {integrity: sha512-SSlIG6QEVxClgl1s0LMk4xr2wg4eT3Zn/Hb81IocyqNSGfXpjtawWxKxiC5/9Z95f1INyBD6MctJbL/R1oBwIw==} + deprecated: 'Reliability and performance improvements. See: https://github.com/WalletConnect/walletconnect-monorepo/releases' + '@walletconnect/events@1.0.1': resolution: {integrity: sha512-NPTqaoi0oPBVNuLv7qPaJazmGHs5JGyO8eEAk5VGKmJzDR7AHzD4k6ilox5kxk1iwiOnFopBOOMLs86Oa76HpQ==} @@ -3971,6 +4614,9 @@ packages: '@walletconnect/relay-auth@1.0.4': resolution: {integrity: sha512-kKJcS6+WxYq5kshpPaxGHdwf5y98ZwbfuS4EE/NkQzqrDFm5Cj+dP8LofzWvjrrLkZq7Afy7WrQMXdLy8Sx7HQ==} + '@walletconnect/relay-auth@1.1.0': + resolution: {integrity: sha512-qFw+a9uRz26jRCDgL7Q5TA9qYIgcNY8jpJzI1zAWNZ8i7mQjaijRnWFKsCHAU9CyGjvt6RKrRXyFtFOpWTVmCQ==} + '@walletconnect/safe-json@1.0.2': resolution: {integrity: sha512-Ogb7I27kZ3LPC3ibn8ldyUr5544t3/STow9+lzz7Sfo808YD7SBWk7SAsdBFlYgP2zDRy2hS3sKRcuSRM0OTmA==} @@ -3978,19 +4624,47 @@ packages: resolution: {integrity: sha512-OzOWxRTfVGCHU3OOF6ibPkgPfDpivFJjuknfcOUt9PYWpTAv6YKOmT4cyfBPhc7llruyHpV44fYbykMcLIvEcg==} deprecated: 'Reliability and performance improvements. See: https://github.com/WalletConnect/walletconnect-monorepo/releases' + '@walletconnect/sign-client@2.21.0': + resolution: {integrity: sha512-z7h+PeLa5Au2R591d/8ZlziE0stJvdzP9jNFzFolf2RG/OiXulgFKum8PrIyXy+Rg2q95U9nRVUF9fWcn78yBA==} + deprecated: 'Reliability and performance improvements. See: https://github.com/WalletConnect/walletconnect-monorepo/releases' + + '@walletconnect/sign-client@2.21.1': + resolution: {integrity: sha512-QaXzmPsMnKGV6tc4UcdnQVNOz4zyXgarvdIQibJ4L3EmLat73r5ZVl4c0cCOcoaV7rgM9Wbphgu5E/7jNcd3Zg==} + deprecated: 'Reliability and performance improvements. See: https://github.com/WalletConnect/walletconnect-monorepo/releases' + '@walletconnect/time@1.0.2': resolution: {integrity: sha512-uzdd9woDcJ1AaBZRhqy5rNC9laqWGErfc4dxA9a87mPdKOgWMD85mcFo9dIYIts/Jwocfwn07EC6EzclKubk/g==} '@walletconnect/types@2.17.3': resolution: {integrity: sha512-5eFxnbZGJJx0IQyCS99qz+OvozpLJJYfVG96dEHGgbzZMd+C9V1eitYqVClx26uX6V+WQVqVwjpD2Dyzie++Wg==} + '@walletconnect/types@2.21.0': + resolution: {integrity: sha512-ll+9upzqt95ZBWcfkOszXZkfnpbJJ2CmxMfGgE5GmhdxxxCcO5bGhXkI+x8OpiS555RJ/v/sXJYMSOLkmu4fFw==} + + '@walletconnect/types@2.21.1': + resolution: {integrity: sha512-UeefNadqP6IyfwWC1Yi7ux+ljbP2R66PLfDrDm8izmvlPmYlqRerJWJvYO4t0Vvr9wrG4Ko7E0c4M7FaPKT/sQ==} + '@walletconnect/universal-provider@2.17.3': resolution: {integrity: sha512-Aen8h+vWTN57sv792i96vaTpN06WnpFUWhACY5gHrpL2XgRKmoXUgW7793p252QdgyofNAOol7wJEs1gX8FjgQ==} deprecated: 'Reliability and performance improvements. See: https://github.com/WalletConnect/walletconnect-monorepo/releases' + '@walletconnect/universal-provider@2.21.0': + resolution: {integrity: sha512-mtUQvewt+X0VBQay/xOJBvxsB3Xsm1lTwFjZ6WUwSOTR1X+FNb71hSApnV5kbsdDIpYPXeQUbGt2se1n5E5UBg==} + deprecated: 'Reliability and performance improvements. See: https://github.com/WalletConnect/walletconnect-monorepo/releases' + + '@walletconnect/universal-provider@2.21.1': + resolution: {integrity: sha512-Wjx9G8gUHVMnYfxtasC9poGm8QMiPCpXpbbLFT+iPoQskDDly8BwueWnqKs4Mx2SdIAWAwuXeZ5ojk5qQOxJJg==} + deprecated: 'Reliability and performance improvements. See: https://github.com/WalletConnect/walletconnect-monorepo/releases' + '@walletconnect/utils@2.17.3': resolution: {integrity: sha512-tG77UpZNeLYgeOwViwWnifpyBatkPlpKSSayhN0gcjY1lZAUNqtYslpm4AdTxlrA3pL61MnyybXgWYT5eZjarw==} + '@walletconnect/utils@2.21.0': + resolution: {integrity: sha512-zfHLiUoBrQ8rP57HTPXW7rQMnYxYI4gT9yTACxVW6LhIFROTF6/ytm5SKNoIvi4a5nX5dfXG4D9XwQUCu8Ilig==} + + '@walletconnect/utils@2.21.1': + resolution: {integrity: sha512-VPZvTcrNQCkbGOjFRbC24mm/pzbRMUq2DSQoiHlhh0X1U7ZhuIrzVtAoKsrzu6rqjz0EEtGxCr3K1TGRqDG4NA==} + '@walletconnect/window-getters@1.0.1': resolution: {integrity: sha512-vHp+HqzGxORPAN8gY03qnbTMnhqIwjeRJNOMOAzePRg4xVEEE2WvYsI9G2NMjOknA8hnuYbU3/hwLcKbjhc8+Q==} @@ -4302,8 +4976,8 @@ packages: zod: optional: true - abitype@1.0.7: - resolution: {integrity: sha512-ZfYYSktDQUwc2eduYu8C4wOs+RDPmnRYMh7zNfzeMtGGgb0U+6tLGjixUic6mXf5xKKCcgT5Qp6cv39tOARVFw==} + abitype@1.0.6: + resolution: {integrity: sha512-MMSqYh4+C/aVqI2RQaWqbvI4Kxo5cQV40WQ4QFtDnNzCkqChm8MuENhElmynZlO0qUy/ObkEUaXtKqYnx1Kp3A==} peerDependencies: typescript: '>=5.0.4' zod: ^3 >=3.22.0 @@ -4324,6 +4998,28 @@ packages: zod: optional: true + abitype@1.2.3: + resolution: {integrity: sha512-Ofer5QUnuUdTFsBRwARMoWKOH1ND5ehwYhJ3OJ/BQO+StkwQjHw0XyVh4vDttzHB7QOFhPHa/o413PJ82gU/Tg==} + peerDependencies: + typescript: '>=5.0.4' + zod: ^3.22.0 || ^4.0.0 + peerDependenciesMeta: + typescript: + optional: true + zod: + optional: true + + abitype@1.3.0: + resolution: {integrity: sha512-fk6Te+bojIFrMvMZrnOO+SxCB+RUksTGOzq/60ZRvs1L+BVzvi2bqt9L3W/17ZLdZsyM1FuYf65P5nlmoiH1Bg==} + peerDependencies: + typescript: '>=5.0.4' + zod: ^3.22.0 || ^4.0.0 + peerDependenciesMeta: + typescript: + optional: true + zod: + optional: true + abortcontroller-polyfill@1.7.8: resolution: {integrity: sha512-9f1iZ2uWh92VcrU9Y8x+LdM4DLj75VE0MJB8zuF1iUnroEptStw+DQ8EQPMUdfe5k+PkB1uUfDQfWbhstH8LrQ==} @@ -4563,6 +5259,9 @@ packages: async-limiter@1.0.1: resolution: {integrity: sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==} + async-mutex@0.2.6: + resolution: {integrity: sha512-Hs4R+4SPgamu6rSGW8C7cV9gaWUKEHykfzCCvIRuaVv636Ju10ZdeUbvb4TBEW0INuq2DHZqXbK4Nd3yG4RaRw==} + async@1.5.2: resolution: {integrity: sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==} @@ -4598,6 +5297,14 @@ packages: aws4@1.11.0: resolution: {integrity: sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==} + axios-retry@4.5.0: + resolution: {integrity: sha512-aR99oXhpEDGo0UuAlYcn2iGRds30k366Zfa05XWScR9QaQD4JYiP3/1Qt1u7YlefUOK+cn0CcwoL1oefavQUlQ==} + peerDependencies: + axios: 0.x || 1.x + + axios@1.20.0: + resolution: {integrity: sha512-r8aOh8j9cGKpgQAqpzrUHnSIc6a59Y3Xf/cv8sy1DrHCkZHzQGEuoq1tARk6qSyDdtQGSDgpb9kFlruzPvrgwg==} + babel-code-frame@6.26.0: resolution: {integrity: sha512-XqYMR2dfdGMW+hd0IUZ2PwK+fGeFkOxZJ0wY+JaQAHzt1Zx8LcvpiZD2NiGkEG8qx0CfkAOr5xt76d1e8vG90g==} @@ -4804,6 +5511,9 @@ packages: base-x@3.0.11: resolution: {integrity: sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA==} + base-x@5.0.1: + resolution: {integrity: sha512-M7uio8Zt++eg3jPj+rHMfCC+IuygQHHCOU+IYsVtik6FWjuYpVt/+MRKcgsAMHh8mMFAwnB+Bs+mTrFiXjMzKg==} + base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} @@ -4945,6 +5655,9 @@ packages: bs58@4.0.1: resolution: {integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==} + bs58@6.0.0: + resolution: {integrity: sha512-PD0wEnEYg6ijszw/u8s+iI3H17cTymlrwkKhDhPZq+Sokl3AU4htyBFTjAeNAlCCmg0f53g6ih3jATyCKftTfw==} + bs58check@2.1.2: resolution: {integrity: sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==} @@ -5078,6 +5791,10 @@ packages: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} + chalk@5.6.2: + resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + change-case@3.0.2: resolution: {integrity: sha512-Mww+SLF6MZ0U6kdg11algyKd5BARbyM4TbFBepwowYSR5ClfQGCGtxNXgykpN0uF/bstWeaGDT4JWaDh8zWAHA==} @@ -5085,6 +5802,9 @@ packages: resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} engines: {node: '>=10'} + charenc@0.0.2: + resolution: {integrity: sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==} + chart.js@4.5.1: resolution: {integrity: sha512-GIjfiT9dbmHRiYi6Nl2yFCq7kkwdkp1W/lp2J99rX0yo9tgJGn3lKQATztIjb5tVtevcBtIdICNWqlq5+E8/Pw==} engines: {pnpm: '>=8'} @@ -5266,6 +5986,10 @@ packages: resolution: {integrity: sha512-aUdPvQRAyBvQd2n7jXcsMDz68ckBJELXNzBybCHOibUWEg0mWTnaYCSRU8h9R+aNRSvDihJtssSRCiDRpLaezA==} hasBin: true + commander@14.0.2: + resolution: {integrity: sha512-TywoWNNRbhoD0BXs1P3ZEScW8W5iKrnbithIl0YH+uCmBd0QpPOA8yc82DS3BIE5Ma6FnBVUsJ7wVUDz4dvOWQ==} + engines: {node: '>=20'} + commander@14.0.3: resolution: {integrity: sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==} engines: {node: '>=20'} @@ -5407,6 +6131,9 @@ packages: crossws@0.3.1: resolution: {integrity: sha512-HsZgeVYaG+b5zA+9PbIPGq4+J/CJynJuearykPsXx4V/eMhyQ5EDVg3Ak2FBZtVXCiOLu/U7IiwDHTr9MA+IKw==} + crypt@0.0.2: + resolution: {integrity: sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==} + crypto-addr-codec@0.1.8: resolution: {integrity: sha512-GqAK90iLLgP3FvhNmHbpT3wR6dEdaM8hZyZtLX29SPardh3OA13RFLHDR6sntGCgRWOfiHqW6sIyohpNqOtV/g==} @@ -5436,6 +6163,16 @@ packages: csstype@3.2.3: resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} + cuer@0.0.3: + resolution: {integrity: sha512-f/UNxRMRCYtfLEGECAViByA3JNflZImOk11G9hwSd+44jvzrc99J35u5l+fbdQ2+ZG441GvOpaeGYBmWquZsbQ==} + peerDependencies: + react: '>=18' + react-dom: '>=18' + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + d3-array@3.2.4: resolution: {integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==} engines: {node: '>=12'} @@ -5503,9 +6240,16 @@ packages: resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} engines: {node: '>= 0.4'} + date-fns@2.30.0: + resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} + engines: {node: '>=0.11'} + date-fns@4.4.0: resolution: {integrity: sha512-+1UMbeh68lH1SegH83CGWwpb6OHHbpSgr3+s5Eww5M4CAgswBpoWS0AjTOfEJ33HiYKz1hdj/KTFprzXHmq/6w==} + dayjs@1.11.13: + resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==} + debug@2.6.9: resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} peerDependencies: @@ -5539,6 +6283,15 @@ packages: supports-color: optional: true + debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + debug@4.4.3: resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} engines: {node: '>=6.0'} @@ -5597,6 +6350,9 @@ packages: deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + deep-object-diff@1.1.9: + resolution: {integrity: sha512-Rn+RuwkmkDwCi2/oXOFS9Gsr5lJZu/yTGpK7wAaAIE75CC+LCGEZHpY6VQJa/RoJcrmaA/docWJZvYohlNkWPA==} + deepmerge@4.3.1: resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} engines: {node: '>=0.10.0'} @@ -5667,6 +6423,11 @@ packages: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} + derive-valtio@0.1.0: + resolution: {integrity: sha512-OCg2UsLbXK7GmmpzMXhYkdO64vhJ1ROUUGaTFyHjVwEdMEcTTRj7W1TxLbSBxdY8QLBPCcp66MTyaSy0RpO17A==} + peerDependencies: + valtio: '*' + des.js@1.0.1: resolution: {integrity: sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==} @@ -5680,6 +6441,9 @@ packages: detect-browser@5.3.0: resolution: {integrity: sha512-53rsFbGdwMwlF7qvCt0ypLM5V5/Mbl0szB7GPN8y9NCcbknYOeVVXdrXEq+90IwAfrrzt6Hd+u2E2ntakICU8w==} + detect-europe-js@0.1.2: + resolution: {integrity: sha512-lgdERlL3u0aUdHocoouzT10d9I89VVhk0qNRmll7mXdGfJT1/wqZ2ZLA4oJAjeACPY5fT1wsbq2AT+GkuInsow==} + detect-indent@4.0.0: resolution: {integrity: sha512-BDKtmHlOzwI7iRuEkhzsnPoi5ypEhWAJB5RvHWe1kMr06js3uK5B3734i3ui5Yd+wOJV1cpE4JnivPD283GU/A==} engines: {node: '>=0.10.0'} @@ -5700,6 +6464,9 @@ packages: resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} engines: {node: '>=8'} + detect-node-es@1.1.0: + resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} + diff@3.3.1: resolution: {integrity: sha512-MKPHZDMB0o6yHyDryUOScqZibp914ksXwAMYMTHj6KO8UeKsRYNJD3oNCKjTqZon+V488P7N/HzXF8t7ZR95ww==} engines: {node: '>=0.3.1'} @@ -5887,6 +6654,10 @@ packages: ecc-jsbn@0.1.2: resolution: {integrity: sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==} + eciesjs@0.4.18: + resolution: {integrity: sha512-wG99Zcfcys9fZux7Cft8BAX/YrOJLJSZ3jyYPfhZHqN2E+Ffx+QXBDsv3gubEgPtV6dTzJMSQUwk1H98/t/0wQ==} + engines: {bun: '>=1', deno: '>=2', node: '>=16'} + ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} @@ -5935,6 +6706,13 @@ packages: end-of-stream@1.4.4: resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + engine.io-client@6.6.7: + resolution: {integrity: sha512-GyAvmPA7gnRCpDQbYACAy79Lg4ewevrmaPzySZz0OVvgyZc3gEfLLqPTYk8wVBScjOEpM9ZO4KryyFpVItjGEA==} + + engine.io-parser@5.2.3: + resolution: {integrity: sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==} + engines: {node: '>=10.0.0'} + enquirer@2.4.1: resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} engines: {node: '>=8.6'} @@ -5999,6 +6777,9 @@ packages: resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} engines: {node: '>= 0.4'} + es-toolkit@1.33.0: + resolution: {integrity: sha512-X13Q/ZSc+vsO1q600bvNK4bxgXMkHcf//RxCmYDaRY5DAcT+eoXjY5hoAPGMdRnWQjvyLEcyauG3b6hz76LNqg==} + es-toolkit@1.39.10: resolution: {integrity: sha512-E0iGnTtbDhkeczB0T+mxmoVlT4YNweEKBLq7oaU4p11mecdsZpNWOglI4895Vh4usbQ+LsJiuLuI2L0Vdmfm2w==} @@ -6199,12 +6980,20 @@ packages: eth-block-tracker@3.0.1: resolution: {integrity: sha512-WUVxWLuhMmsfenfZvFO5sbl1qFY2IqUlw/FPVmjjdElpqLsZtSG+wPe9Dz7W/sB6e80HgFKknOmKk2eNlznHug==} + eth-block-tracker@7.1.0: + resolution: {integrity: sha512-8YdplnuE1IK4xfqpf4iU7oBxnOYAc35934o083G8ao+8WM8QQtt/mVlAY6yIAdY1eMeLqg4Z//PZjJGmWGPMRg==} + engines: {node: '>=14.0.0'} + eth-chains@2.0.0: resolution: {integrity: sha512-TSfA9sYwEenQF+8/+T9DAnhCGB3yy7/Rl9J2QpibD9Bax8Btu3uTOW5mGIp7kh4gYyeozDxK7zHKBiB5upWU1w==} eth-ens-namehash@2.0.8: resolution: {integrity: sha512-VWEI1+KJfz4Km//dadyvBBoBeSQ0MHTXPvr8UIXiLW6IanxvAV+DmlZAijZwAyggqGUfwQBeHf7tc9wzc1piSw==} + eth-json-rpc-filters@6.0.1: + resolution: {integrity: sha512-ITJTvqoCw6OVMLs7pI8f4gG92n/St6x80ACtHodeS+IXmO0w+t1T5OOzfSt7KLSMLRkVUoexV7tztLgDxg+iig==} + engines: {node: '>=14.0.0'} + eth-json-rpc-infura@3.2.1: resolution: {integrity: sha512-W7zR4DZvyTn23Bxc0EWsq4XGDdD63+XPUCEhV2zQvQGavDVC4ZpFDK4k99qN7bd7/fjj37+rxmuBOBeIqCA5Mw==} deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. @@ -6343,6 +7132,9 @@ packages: event-emitter@0.3.5: resolution: {integrity: sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==} + eventemitter2@6.4.9: + resolution: {integrity: sha512-JEPTiaOt9f04oa6NOkc4aH+nVp5I3wEjpHbIPqfgCdD5v5bUzy7xQqwcVO2aDQgOWhI28da57HksMrzK9HlRxg==} + eventemitter3@4.0.4: resolution: {integrity: sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==} @@ -6409,7 +7201,11 @@ packages: extend@3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} - extglob@0.3.2: + extension-port-stream@3.0.0: + resolution: {integrity: sha512-an2S5quJMiy5bnZKEf6AkfH/7r8CzHvhchU40gxN+OM6HPhe7Z9T1FUychcf2M9PpPOO0Hf7BAEfJkw2TDIBDw==} + engines: {node: '>=12.0.0'} + + extglob@0.3.2: resolution: {integrity: sha512-1FOj1LOwn42TMrruOHGt18HemVnbwAmAak7krWk+wa93KXxGbK+2jpezm+ytJYDaBX0/SPLZFHKM7m+tKobWGg==} engines: {node: '>=0.10.0'} @@ -6566,6 +7362,15 @@ packages: debug: optional: true + follow-redirects@1.16.1: + resolution: {integrity: sha512-FNvFGzoMLWmE6Yj9spb/zjd7yiNCHiAW9/Tg9CXrQ8wuu32HtlJOwWO11OJafl5FfY3DxTdQ0vj42zU1kvv5jg==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + for-each@0.3.5: resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} engines: {node: '>= 0.4'} @@ -6690,6 +7495,10 @@ packages: resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} engines: {node: '>= 0.4'} + get-nonce@1.0.1: + resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} + engines: {node: '>=6'} + get-package-type@0.1.0: resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} engines: {node: '>=8.0.0'} @@ -6963,6 +7772,10 @@ packages: resolution: {integrity: sha512-ycURW7oUxE2sNiPVw1HVEFsW+ecOpJ5zaj7eC0RlwhibhRBod20muUN8qu/gzx956YrLolVvs1MTXwKgC2rVEg==} engines: {node: '>=0.10.0'} + hono@4.13.12: + resolution: {integrity: sha512-6E2QDAc9Ick9Sq77ZrGS/dk2WUYni91aufTw6LJKpV7w8kW5/GxVUc650FOADOmlwg3K+f7Pun6XlV+pYmW6gw==} + engines: {node: '>=16.9.0'} + hookified@1.15.1: resolution: {integrity: sha512-MvG/clsADq1GPM2KGo2nyfaWVyn9naPiXrqIe4jYjXNZQt238kWyOGrsyc/DmRAQ+Re6yeo6yX/yoNCG5KAEVg==} @@ -7356,6 +8169,10 @@ packages: resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} engines: {node: '>= 0.4'} + is-retry-allowed@2.2.0: + resolution: {integrity: sha512-XVm7LOeLpTW4jV19QSH38vkswxoLud8sQ57YwJVTPWdiaI9I8keEhGFpBlslyVsgdQy4Opg8QOLb8YRgsyZiQg==} + engines: {node: '>=10'} + is-set@2.0.3: resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} engines: {node: '>= 0.4'} @@ -7364,6 +8181,9 @@ packages: resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} engines: {node: '>= 0.4'} + is-standalone-pwa@0.1.1: + resolution: {integrity: sha512-9Cbovsa52vNQCjdXOzeQq5CnCbAcRk05aU62K20WO372NrTv0NxibLFCK6lQ4/iZEFdEA3p3t2VNOn8AJ53F5g==} + is-stream@1.1.0: resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==} engines: {node: '>=0.10.0'} @@ -7458,6 +8278,11 @@ packages: peerDependencies: ws: '*' + isows@1.0.7: + resolution: {integrity: sha512-I1fSfDCZL5P0v33sVqeTDSpcstAg/N+wF5HS033mogOVIp4B+oHC7oOCsA3axAbBSGTJ8QubbNmnIRN/h8U7hg==} + peerDependencies: + ws: '*' + isstream@0.1.2: resolution: {integrity: sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==} @@ -7653,6 +8478,9 @@ packages: joi@17.9.1: resolution: {integrity: sha512-FariIi9j6QODKATGBrEX7HZcja8Bsh3rfdGYy/Sb65sGlZWK/QWesU1ghk7aJWDj95knjXlQfSmzFSPPkLVsfw==} + jose@6.2.12: + resolution: {integrity: sha512-9NiFmJEex0sy2Dk58j2UGBSHgUs2ypF9eZSu4L6vjOX3Dp96Sw1F3uL+H+D1sx02jZZdzUT0HgvCy59CuvXcWw==} + jotai@3.0.0: resolution: {integrity: sha512-KxhbmsJUp/tmrv6aZgO+nzB3H9K8C0xmk5i3aGkwy/EANg73DVBkggv3zVHaAi5PlNlQgTgP4uiVepo+JC+wSA==} engines: {node: '>=22.12.0'} @@ -7736,6 +8564,10 @@ packages: json-rpc-engine@3.8.0: resolution: {integrity: sha512-6QNcvm2gFuuK4TKU1uwfH0Qd/cOSb9c1lls0gbnIhciktIUQJwz6NQNAW4B1KiGPenv7IKu97V222Yo1bNhGuA==} + json-rpc-engine@6.1.0: + resolution: {integrity: sha512-NEdLrtrq1jUZyfjkr9OCz9EzCNhnRyWtt1PAnvnhwy6e8XETS0Dtc+ZNCO2gvuAoKsIn2+vCSowXTYE4CkgnAQ==} + engines: {node: '>=10.0.0'} + json-rpc-error@2.0.0: resolution: {integrity: sha512-EwUeWP+KgAZ/xqFpaP6YDAXMtCJi+o/QQpCQFIYyxr01AdADi2y413eM8hSqJcoQym9WMePAJWoaODEJufC4Ug==} @@ -8001,12 +8833,21 @@ packages: lit-element@3.3.2: resolution: {integrity: sha512-xXAeVWKGr4/njq0rGC9dethMnYCq5hpKYrgQZYTzawt9YQhMiXfD+T1RgrdY3NamOxwq2aXlb0vOI6e29CKgVQ==} + lit-element@4.2.2: + resolution: {integrity: sha512-aFKhNToWxoyhkNDmWZwEva2SlQia+jfG0fjIWV//YeTaWrVnOxD89dPKfigCUspXFmjzOEUQpOkejH5Ly6sG0w==} + lit-html@2.8.0: resolution: {integrity: sha512-o9t+MQM3P4y7M7yNzqAyjp7z+mQGa4NS4CxiyLqFPyFWyc4O+nodLrkrxSaCTrla6M5YOLaT3RpbbqjszB5g3Q==} + lit-html@3.3.3: + resolution: {integrity: sha512-el8M6jK2o3RXBnrSHX3ZKrsN8zEV63pSExTO1wYJz7QndGYZ8353e2a5PPX+qHe2aGayfnchQmkAojaWAREOIA==} + lit@2.8.0: resolution: {integrity: sha512-4Sc3OFX9QHOJaHbmTMk28SYgVxLN3ePDjg7hofEft2zWlehFL3LiAuapWc4U/kYwMYJSh2hTCPZ6/LIC7ii0MA==} + lit@3.3.0: + resolution: {integrity: sha512-DGVsqsOIHBww2DqnuZzW7QsuCdahp50ojuDaBPC7jUDRpYoH0z7kHBBYZewRzer75FwtrkmkKk7iOAwSaWdBmw==} + load-json-file@1.1.0: resolution: {integrity: sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==} engines: {node: '>=0.10.0'} @@ -8152,6 +8993,12 @@ packages: md5.js@1.3.5: resolution: {integrity: sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==} + md5@2.3.0: + resolution: {integrity: sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==} + + media-query-parser@2.0.2: + resolution: {integrity: sha512-1N4qp+jE0pL5Xv4uEcwVUhIkwdUO3S/9gML90nqKA7v7FcOS5vUtatfzok9S9U1EJU8dHWlcv95WLnKmmxZI9w==} + media-typer@0.3.0: resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} engines: {node: '>= 0.6'} @@ -8303,6 +9150,14 @@ packages: minizlib@1.3.3: resolution: {integrity: sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==} + mipd@0.0.7: + resolution: {integrity: sha512-aAPZPNDQ3uMTdKbuO2YmAw2TxLHO0moa4YKAyETM/DTj5FloZo+a+8tU+iv4GmW+sOxKLSRwcSFuczk+Cpt6fg==} + peerDependencies: + typescript: '>=5.0.4' + peerDependenciesMeta: + typescript: + optional: true + mixin-deep@1.3.2: resolution: {integrity: sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==} engines: {node: '>=0.10.0'} @@ -8346,6 +9201,9 @@ packages: resolution: {integrity: sha512-2emPTb1reeLLYwHxyVx993iYyCHEiRRO+y8NFXFPL5kl5q14sgTK76cXyEKkeKCHeRw35SfdkUJ10Q1KfHuiIQ==} engines: {node: '>= 0.4'} + modern-ahocorasick@1.1.0: + resolution: {integrity: sha512-sEKPVl2rM+MNVkGQt3ChdmD8YsigmXdn5NifZn6jiwn9LRJpWm8F3guhaqrJT/JOat6pwpbXEk6kv+b9DMIjsQ==} + module-alias@2.2.3: resolution: {integrity: sha512-23g5BFj4zdQL/b6tor7Ji+QY4pEfNH784BMslY9Qb0UnJWRAt+lQGLYmRaM0KDBwIG23ffEBELhZDP2rhi9f/Q==} @@ -8368,6 +9226,9 @@ packages: ms@2.0.0: resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} @@ -8581,6 +9442,9 @@ packages: oauth-sign@0.9.0: resolution: {integrity: sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==} + obj-multiplex@1.0.0: + resolution: {integrity: sha512-0GNJAOsHoBHeNTvl5Vt6IWnpUEcc3uSRxzBri7EDyIcMgYvnY2JL2qdeV5zTMjWQX5OHcD5amcW2HFfDh0gjIA==} + object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} @@ -8684,6 +9548,12 @@ packages: resolution: {integrity: sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==} engines: {node: '>=8'} + openapi-fetch@0.13.8: + resolution: {integrity: sha512-yJ4QKRyNxE44baQ9mY5+r/kAzZ8yXMemtNAOFwOzRXJscdjSxxzWSNlyBAr+o5JjkUw9Lc3W7OIoca0cY3PYnQ==} + + openapi-typescript-helpers@0.0.15: + resolution: {integrity: sha512-opyTPaunsklCBpTK8JGef6mfPhLSnyy5a0IN9vKtx3+4aExf+KxEqYwIy3hqkedXIB97u357uLMJsOnm3GVjsw==} + optimism@0.18.1: resolution: {integrity: sha512-mLXNwWPa9dgFyDqkNi54sjDyNJ9/fTI6WGBLgnXku1vdKY/jovHfZT5r+aiVeFFLOz+foPNOm5YJ4mqgld2GBQ==} @@ -8711,8 +9581,32 @@ packages: resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} engines: {node: '>= 0.4'} - ox@0.6.0: - resolution: {integrity: sha512-blUzTLidvUlshv0O02CnLFqBLidNzPoAZdIth894avUAotTuWziznv6IENv5idRuOSSP3dH8WzcYw84zVdu0Aw==} + ox@0.14.45: + resolution: {integrity: sha512-jpsQ+p0JZh9mKCxxzxz0d5qFHZZg2/O9xW18IpEC/dNXXPVqmDJ0c//9RMz0CILkbSGPA42+cbU0fC/ghwJ03w==} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + ox@0.6.7: + resolution: {integrity: sha512-17Gk/eFsFRAZ80p5eKqv89a57uXjd3NgIf1CaXojATPBuujVc/fQSVhBeAU9JCRB+k7J50WQAyWTxK19T9GgbA==} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + ox@0.6.9: + resolution: {integrity: sha512-wi5ShvzE4eOcTwQVsIPdFr+8ycyX+5le/96iAJutaZAvCes1J0+RvpEPg5QDPDiaR0XQQAvZVl7AwqQcINuUug==} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + ox@0.9.17: + resolution: {integrity: sha512-rKAnhzhRU3Xh3hiko+i1ZxywZ55eWQzeS/Q4HRKLx2PqfHOolisZHErSsJVipGlmQKHW5qwOED/GighEw9dbLg==} peerDependencies: typescript: '>=5.4.0' peerDependenciesMeta: @@ -8946,6 +9840,14 @@ packages: resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} engines: {node: '>=0.10.0'} + pify@3.0.0: + resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} + engines: {node: '>=4'} + + pify@5.0.0: + resolution: {integrity: sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==} + engines: {node: '>=10'} + pinkie-promise@2.0.1: resolution: {integrity: sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==} engines: {node: '>=0.10.0'} @@ -8976,6 +9878,42 @@ packages: resolution: {integrity: sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==} engines: {node: '>=10.13.0'} + pony-cause@2.1.11: + resolution: {integrity: sha512-M7LhCsdNbNgiLYiP4WjsfLUuFmCfnjdF6jKe2R9NKl4WFN+HZPGHJZ9lnLP7f9ZnKe3U9nuWD0szirmj+migUg==} + engines: {node: '>=12.0.0'} + + porto@0.2.35: + resolution: {integrity: sha512-gu9FfjjvvYBgQXUHWTp6n3wkTxVtEcqFotM7i3GEZeoQbvLGbssAicCz6hFZ8+xggrJWwi/RLmbwNra50SMmUQ==} + hasBin: true + peerDependencies: + '@tanstack/react-query': '>=5.59.0' + '@wagmi/core': '>=2.16.3' + expo-auth-session: '>=7.0.8' + expo-crypto: '>=15.0.7' + expo-web-browser: '>=15.0.8' + react: '>=18' + react-native: '>=0.81.4' + typescript: '>=5.4.0' + viem: '>=2.37.0' + wagmi: '>=2.0.0' + peerDependenciesMeta: + '@tanstack/react-query': + optional: true + expo-auth-session: + optional: true + expo-crypto: + optional: true + expo-web-browser: + optional: true + react: + optional: true + react-native: + optional: true + typescript: + optional: true + wagmi: + optional: true + posix-character-classes@0.1.1: resolution: {integrity: sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==} engines: {node: '>=0.10.0'} @@ -8995,6 +9933,9 @@ packages: postinstall-postinstall@2.1.0: resolution: {integrity: sha512-7hQX6ZlZXIoRiWNrbMQaLzUUfH+sSx39u8EJ9HYuDc1kLo9IXKWjM5RSquZN1ad5GnH8CGFM78fsAAQi3OKEEQ==} + preact@10.24.2: + resolution: {integrity: sha512-1cSoF0aCC8uaARATfrlz4VCBqE8LwZwRfLgkxJOQwAlQt6ayTmi0D9OF7nXid1POI5SZidFuG9CnlXbDfLqY/Q==} + preact@10.27.2: resolution: {integrity: sha512-5SYSgFKSyhCbk6SrXyMpqjb5+MQBgfvEKE/OC+PujcY34sOpqtr+0AZQtPYx5IA6VxynQ7rUPCtKzyovpj9Bpg==} @@ -9079,9 +10020,16 @@ packages: proxy-compare@2.5.1: resolution: {integrity: sha512-oyfc0Tx87Cpwva5ZXezSp5V9vht1c7dZBhvuV/y3ctkgMVUmiAGDVeeB0dKhGSyT0v1ZTEQYpe/RXlBVBNuCLA==} + proxy-compare@2.6.0: + resolution: {integrity: sha512-8xuCeM3l8yqdmbPoYeLbrAXCBWu19XEYc5/F28f5qOaoAIMyfmBUkl5axiK+x9olUvRlcekvnm98AP9RDngOIw==} + proxy-compare@3.0.1: resolution: {integrity: sha512-V9plBAt3qjMlS1+nC8771KNf6oJ12gExvaxnNzN/9yVRLdTv/lc+oJlnSzrdYDAvBfTStPCoiaCOTmTs0adv7Q==} + proxy-from-env@2.1.0: + resolution: {integrity: sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==} + engines: {node: '>=10'} + proxy-memoize@3.0.1: resolution: {integrity: sha512-VDdG/VYtOgdGkWJx7y0o7p+zArSf2383Isci8C+BP3YXgMYDoPd3cCBjw0JdWb6YBb9sFiOPbAADDVTPJnh+9g==} @@ -9142,6 +10090,10 @@ packages: resolution: {integrity: sha512-+Owyggi9IxT1ePKGafcI87ubSmxol6smwJ+RAHDQlx9+9cPwFWDiKFFCPuWhr9ignlGpZ9vDQLw67N4dcTVFEA==} engines: {node: '>=20'} + qr@0.5.5: + resolution: {integrity: sha512-iQBvKj7MRKO+co+MY0IZpyLO+ezvttxsmV86WywrgPuAmgBkv0pytyi03wourniSoPgzffeBW6cBgIkpqcvjTg==} + engines: {node: '>= 20.19.0'} + qrcode-terminal@0.12.0: resolution: {integrity: sha512-EXtzRZmC+YGmGlDFbXKxQiMZNwCLEO6BANKXG4iCtSIM0yqc/pappSx3RIKr4r0uh5JsBckOXeKrB3Iz7mdQpQ==} hasBin: true @@ -9273,6 +10225,36 @@ packages: redux: optional: true + react-remove-scroll-bar@2.3.8: + resolution: {integrity: sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + react-remove-scroll@2.7.2: + resolution: {integrity: sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + react-style-singleton@2.2.3: + resolution: {integrity: sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + react@19.3.0: resolution: {integrity: sha512-E8LUcbtBWt20bbl2YoHfx4ZDBdxVTfOKtCZn9cDSJ4l6/nuoApcpIBcj47t2wZoVX8g2ZHuMHbiShgCR1T5Sog==} engines: {node: '>=0.10.0'} @@ -9757,6 +10739,14 @@ packages: resolution: {integrity: sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==} engines: {node: '>=0.10.0'} + socket.io-client@4.8.4: + resolution: {integrity: sha512-7wjKAvVXYOJsbmUgkWbnhPD4bFpkqrUR0++XOjpGFmqDqsqV1CI93VTraeExLxpjxEqrWgFoSRZu1ihjLWfkAA==} + engines: {node: '>=10.0.0'} + + socket.io-parser@4.2.7: + resolution: {integrity: sha512-IH/iSeO9T6gz1KkFleGDWkG9N3dl4jXVYUtMhIqH10Md0ttMer8nUNWiP1DKuNrybD2xBrixLJdCC9J6ECoYkg==} + engines: {node: '>=10.0.0'} + sol-digger@0.0.2: resolution: {integrity: sha512-oqrw1E/X2WWYUYCzKDM5INDDH2nWOWos4p2Cw2OF52qoZcTDzlKMJQ5pJFXKOCADCg6KggBO5WYE/vNb+kJ0Hg==} @@ -10029,6 +11019,10 @@ packages: stylis@4.2.0: resolution: {integrity: sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==} + superstruct@1.0.4: + resolution: {integrity: sha512-7JpaAoX2NGyoFlI9NBh66BQXGONc+uE+MRS5i2iOBKuS4e+ccgMDjATgZldkah+33DakBxDHiss9kvUcGAO8UQ==} + engines: {node: '>=14.0.0'} + supports-color@2.0.0: resolution: {integrity: sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==} engines: {node: '>=0.8.0'} @@ -10362,6 +11356,13 @@ packages: typical@2.6.1: resolution: {integrity: sha512-ofhi8kjIje6npGozTip9Fr8iecmYfEbS06i0JnIg+rh51KakryWF4+jX8lLKZVhy6N+ID45WYSFCxPOdTWCzNg==} + ua-is-frozen@0.1.2: + resolution: {integrity: sha512-RwKDW2p3iyWn4UbaxpP2+VxwqXh0jpvdxsYpZ5j/MLLiQOfbsV5shpgQiw93+KMYQPcteeMQ289MaAFzs3G9pw==} + + ua-parser-js@2.0.10: + resolution: {integrity: sha512-t+3Ktbq0Ies2vaSezfOaWiolH4OigQIO1dk+1xDpOydB1COVPocVYOrEV5rqZ0kFY9XYG1v9LutCyMgYBpABcw==} + hasBin: true + ufo@1.5.4: resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==} @@ -10390,6 +11391,9 @@ packages: undici-types@7.18.2: resolution: {integrity: sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==} + undici-types@7.30.0: + resolution: {integrity: sha512-7QjA5O+GhM27do7Id6hQZpnYEd7WzHbs7/XIS9A1k+Gat/ZVF7Jmpzt68zL/205f65FYwDNLSjQemHPS8ReM/A==} + undici@5.28.5: resolution: {integrity: sha512-zICwjrDrcrUE0pyyJc1I2QzBkLM8FINsgOrt6WjA+BgajVq9Nxu2PbFFXUrAggLfDXlZGZBVZYw7WNV5KiBiBA==} engines: {node: '>=14.0'} @@ -10527,6 +11531,26 @@ packages: url@0.11.0: resolution: {integrity: sha512-kbailJa29QrtXnxgq+DdCEGlbTeYM2eJUxsz6vjZavrCYPMIFHMKQmSKYAIuUK2i7hgPm28a8piX5NTUtM/LKQ==} + use-callback-ref@1.3.3: + resolution: {integrity: sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + use-sidecar@1.1.3: + resolution: {integrity: sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + use-sync-external-store@1.0.0: resolution: {integrity: sha512-AFVsxg5GkFg8GDcxnl+Z0lMAz9rE8DGJCc28qnBuQF7lac57B5smLcT37aXpXIIPz75rW4g3eXHPjhHwdGskOw==} peerDependencies: @@ -10537,6 +11561,11 @@ packages: peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 + use-sync-external-store@1.4.0: + resolution: {integrity: sha512-9WXSPC5fMv61vaupRkCKCxsPxBocVnwakBEkMIHHpkTTg6icbJtg6jzgtLDm4bl3cSHAca52rYWih0k4K3PfHw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + use-sync-external-store@1.6.0: resolution: {integrity: sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==} peerDependencies: @@ -10610,6 +11639,18 @@ packages: react: optional: true + valtio@1.13.2: + resolution: {integrity: sha512-Qik0o+DSy741TmkqmRfjq+0xpZBXi/Y6+fXZLn0xNF1z/waFMbE3rkivv5Zcf9RrMUp6zswf2J7sbh2KBlba5A==} + engines: {node: '>=12.20.0'} + peerDependencies: + '@types/react': '>=16.8' + react: '>=16.8' + peerDependenciesMeta: + '@types/react': + optional: true + react: + optional: true + varint@5.0.2: resolution: {integrity: sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow==} @@ -10636,8 +11677,16 @@ packages: typescript: optional: true - viem@2.22.8: - resolution: {integrity: sha512-iB3PW/a/qzpYbpjo3R662u6a/zo6piZHez/N/bOC25C79FYXBCs8mQDqwiHk3FYErUhS4KVZLabKV9zGMd+EgQ==} + viem@2.23.2: + resolution: {integrity: sha512-NVmW/E0c5crMOtbEAqMF0e3NmvQykFXhLOc/CkLIXOlzHSA6KXVz3CYVmaKqBF8/xtjsjHAGjdJN3Ru1kFJLaA==} + peerDependencies: + typescript: '>=5.0.4' + peerDependenciesMeta: + typescript: + optional: true + + viem@2.57.2: + resolution: {integrity: sha512-ZbPvu+5fvRsbFh+OymDz0GyEySsSco8GWrEAiHM4ckhEY1vJTPy0tcLVkn0cs70dPiUOjLxkQBnfVyt9YkJ7cA==} peerDependencies: typescript: '>=5.0.4' peerDependenciesMeta: @@ -10706,6 +11755,17 @@ packages: resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} engines: {node: '>=18'} + wagmi@2.19.5: + resolution: {integrity: sha512-RQUfKMv6U+EcSNNGiPbdkDtJwtuFxZWLmvDiQmjjBgkuPulUwDJsKhi7gjynzJdsx2yDqhHCXkKsbbfbIsHfcQ==} + peerDependencies: + '@tanstack/react-query': '>=5.0.0' + react: '>=18' + typescript: '>=5.0.4' + viem: 2.x + peerDependenciesMeta: + typescript: + optional: true + web3-bzz@1.10.0: resolution: {integrity: sha512-o9IR59io3pDUsXTsps5pO5hW1D5zBmg46iNc2t4j2DkaYHNdDLwk2IP9ukoM2wg47QILfPEJYzhTfkS/CcX0KA==} engines: {node: '>=8.0.0'} @@ -10962,8 +12022,8 @@ packages: resolution: {integrity: sha512-mjQ8HeU41G6hgOYm1pmeH0mRAeNKJGnJEUzDMoerkpw7QUQT4exVREgF1MYPvL/z6vAshOXei25LE/t/Bxl8yQ==} engines: {node: '>=8.0.0'} - webauthn-p256@0.0.10: - resolution: {integrity: sha512-EeYD+gmIT80YkSIDb2iWq0lq2zbHo1CxHlQTeJ+KkCILWpVy3zASH3ByD4bopzfk0uCwXxLqKGLqp2W4O28VFA==} + webextension-polyfill@0.10.0: + resolution: {integrity: sha512-c5s35LgVa5tFaHhrZDnr3FpQpjj1BB+RXhLTYUxGqBVN460HkbM8TBtEqdXWbpTKfzwCcjAZVF7zXCYSKtcp9g==} webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} @@ -11132,8 +12192,8 @@ packages: utf-8-validate: optional: true - ws@8.20.0: - resolution: {integrity: sha512-sAt8BhgNbzCtgGbt2OxmpuryO63ZoDk/sqaB/znQm94T4fCEsy/yV+7CdC1kJhOU9lboAEU7R3kquuycDoibVA==} + ws@8.21.0: + resolution: {integrity: sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 @@ -11179,6 +12239,10 @@ packages: xmlchars@2.2.0: resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} + xmlhttprequest-ssl@2.1.2: + resolution: {integrity: sha512-TEU+nJVUUnA4CYJFLvK5X9AOeH4KvDvhIfm0vV1GaQRtchnG0hgK5p8hw/xjv8cunWYCsiPCSDzObPyhEwq3KQ==} + engines: {node: '>=0.4.0'} + xmlhttprequest@1.8.0: resolution: {integrity: sha512-58Im/U0mlVBLM38NdZjHyhuMtCqa61469k2YP/AaPbvCoV9aQGUpbJBj1QRm2ytRiVQBD/fsw7L2bJGDVQswBA==} engines: {node: '>=0.4.0'} @@ -11266,9 +12330,69 @@ packages: peerDependencies: zod: ^3.25.0 || ^4.0.0 + zod@3.22.4: + resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} + zod@3.25.76: resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} + zod@4.6.5: + resolution: {integrity: sha512-v5l/aFXZQeai4awLbOpSoHecE9UiMrnfx75tEXLjNonXVARxQ5mOeipTjROUchszUNCqnE+hqAMujRsRHsut2Q==} + + zustand@5.0.0: + resolution: {integrity: sha512-LE+VcmbartOPM+auOjCCLQOsQ05zUTp8RkgwRzefUk+2jISdMMFnxvyTjA4YNWr5ZGXYbVsEMZosttuxUBkojQ==} + engines: {node: '>=12.20.0'} + peerDependencies: + '@types/react': '>=18.0.0' + immer: '>=9.0.6' + react: '>=18.0.0' + use-sync-external-store: '>=1.2.0' + peerDependenciesMeta: + '@types/react': + optional: true + immer: + optional: true + react: + optional: true + use-sync-external-store: + optional: true + + zustand@5.0.15: + resolution: {integrity: sha512-MpSEjRiBkA9crSYeOUH32rJC7SVqAbm0Fqcqge/bUi2PPoLcBWKOsG+C8mevmpr8TwXHBVkChbbJiyvkE+i/3A==} + engines: {node: '>=12.20.0'} + peerDependencies: + '@types/react': '>=18.0.0' + immer: '>=9.0.6' + react: '>=18.0.0' + use-sync-external-store: '>=1.2.0' + peerDependenciesMeta: + '@types/react': + optional: true + immer: + optional: true + react: + optional: true + use-sync-external-store: + optional: true + + zustand@5.0.3: + resolution: {integrity: sha512-14fwWQtU3pH4dE0dOpdMiWjddcH+QzKIgk1cl8epwSE7yag43k/AD/m4L6+K7DytAOr9gGBe3/EXj9g7cdostg==} + engines: {node: '>=12.20.0'} + peerDependencies: + '@types/react': '>=18.0.0' + immer: '>=9.0.6' + react: '>=18.0.0' + use-sync-external-store: '>=1.2.0' + peerDependenciesMeta: + '@types/react': + optional: true + immer: + optional: true + react: + optional: true + use-sync-external-store: + optional: true + snapshots: '@adobe/css-tools@4.4.4': {} @@ -11830,6 +12954,34 @@ snapshots: '@babel/helper-string-parser': 8.0.0 '@babel/helper-validator-identifier': 8.0.4 + '@base-org/account@2.4.0(@types/react@19.3.0)(bufferutil@4.0.9)(debug@4.4.3(supports-color@4.4.0))(immer@11.1.18)(react@19.3.0)(supports-color@4.4.0)(typescript@6.0.3)(use-sync-external-store@1.4.0(react@19.3.0))(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + '@coinbase/cdp-sdk': 1.57.1(bufferutil@4.0.9)(debug@4.4.3(supports-color@4.4.0))(supports-color@4.4.0)(typescript@6.0.3)(utf-8-validate@5.0.10) + '@noble/hashes': 1.4.0 + clsx: 1.2.1 + eventemitter3: 5.0.1 + idb-keyval: 6.2.1 + ox: 0.6.9(typescript@6.0.3)(zod@3.25.76) + preact: 10.24.2 + viem: 2.57.2(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76) + zustand: 5.0.3(@types/react@19.3.0)(immer@11.1.18)(react@19.3.0)(use-sync-external-store@1.4.0(react@19.3.0)) + transitivePeerDependencies: + - '@types/react' + - '@x402/core' + - '@x402/evm' + - '@x402/extensions' + - '@x402/svm' + - bufferutil + - debug + - fastestsmallesttextencoderdecoder + - immer + - react + - supports-color + - typescript + - use-sync-external-store + - utf-8-validate + - zod + '@bcoe/v8-coverage@0.2.3': {} '@cacheable/memory@2.2.0': @@ -11973,6 +13125,42 @@ snapshots: fast-wrap-ansi: 0.2.2 sisteransi: 1.0.5 + '@coinbase/cdp-sdk@1.57.1(bufferutil@4.0.9)(debug@4.4.3(supports-color@4.4.0))(supports-color@4.4.0)(typescript@6.0.3)(utf-8-validate@5.0.10)': + dependencies: + '@solana-program/system': 0.10.0(@solana/kit@5.5.1(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)) + '@solana-program/token': 0.9.0(@solana/kit@5.5.1(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)) + '@solana/kit': 5.5.1(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10) + abitype: 1.0.6(typescript@6.0.3)(zod@3.25.76) + axios: 1.20.0(debug@4.4.3(supports-color@4.4.0))(supports-color@4.4.0) + axios-retry: 4.5.0(axios@1.20.0(debug@4.4.3(supports-color@4.4.0))(supports-color@4.4.0)) + bs58: 6.0.0 + jose: 6.2.12 + md5: 2.3.0 + uncrypto: 0.1.3 + viem: 2.57.2(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76) + zod: 3.25.76 + transitivePeerDependencies: + - bufferutil + - debug + - fastestsmallesttextencoderdecoder + - supports-color + - typescript + - utf-8-validate + + '@coinbase/wallet-sdk@3.9.3(supports-color@4.4.0)': + dependencies: + bn.js: 5.2.1 + buffer: 6.0.3 + clsx: 1.2.1 + eth-block-tracker: 7.1.0(supports-color@4.4.0) + eth-json-rpc-filters: 6.0.1 + eventemitter3: 5.0.1 + keccak: 3.0.4 + preact: 10.27.2 + sha.js: 2.4.12 + transitivePeerDependencies: + - supports-color + '@coinbase/wallet-sdk@4.3.0': dependencies: '@noble/hashes': 1.7.0 @@ -11980,6 +13168,26 @@ snapshots: eventemitter3: 5.0.1 preact: 10.27.2 + '@coinbase/wallet-sdk@4.3.6(@types/react@19.3.0)(bufferutil@4.0.9)(immer@11.1.18)(react@19.3.0)(typescript@6.0.3)(use-sync-external-store@1.4.0(react@19.3.0))(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + '@noble/hashes': 1.4.0 + clsx: 1.2.1 + eventemitter3: 5.0.1 + idb-keyval: 6.2.1 + ox: 0.6.9(typescript@6.0.3)(zod@3.25.76) + preact: 10.24.2 + viem: 2.57.2(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76) + zustand: 5.0.3(@types/react@19.3.0)(immer@11.1.18)(react@19.3.0)(use-sync-external-store@1.4.0(react@19.3.0)) + transitivePeerDependencies: + - '@types/react' + - bufferutil + - immer + - react + - typescript + - use-sync-external-store + - utf-8-validate + - zod + '@csstools/color-helpers@5.1.0': {} '@csstools/css-calc@2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': @@ -12002,6 +13210,10 @@ snapshots: '@drizzle-team/brocli@0.10.2': {} + '@ecies/ciphers@0.2.6(@noble/ciphers@1.3.0)': + dependencies: + '@noble/ciphers': 1.3.0 + '@emnapi/core@1.10.0': dependencies: '@emnapi/wasi-threads': 1.2.1 @@ -12122,7 +13334,7 @@ snapshots: dependencies: bech32: 1.1.4 blakejs: 1.2.1 - bn.js: 4.12.1 + bn.js: 4.12.3 bs58: 4.0.1 crypto-addr-codec: 0.1.8 nano-base32: 1.0.1 @@ -12692,6 +13904,11 @@ snapshots: crc-32: 1.2.2 ethereumjs-util: 7.1.5 + '@ethereumjs/common@3.2.0': + dependencies: + '@ethereumjs/util': 8.1.0 + crc-32: 1.2.2 + '@ethereumjs/rlp@4.0.1': {} '@ethereumjs/tx@3.3.2': @@ -12704,13 +13921,20 @@ snapshots: '@ethereumjs/common': 2.6.5 ethereumjs-util: 7.1.5 - '@ethereumjs/util@8.1.0': + '@ethereumjs/tx@4.2.0': dependencies: + '@ethereumjs/common': 3.2.0 '@ethereumjs/rlp': 4.0.1 + '@ethereumjs/util': 8.1.0 ethereum-cryptography: 2.2.1 - micro-ftch: 0.3.1 - '@ethersproject/abi@5.0.0-beta.153': + '@ethereumjs/util@8.1.0': + dependencies: + '@ethereumjs/rlp': 4.0.1 + ethereum-cryptography: 2.2.1 + micro-ftch: 0.3.1 + + '@ethersproject/abi@5.0.0-beta.153': dependencies: '@ethersproject/address': 5.8.0 '@ethersproject/bignumber': 5.8.0 @@ -13041,6 +14265,14 @@ snapshots: dependencies: tslib: 2.8.1 + '@gemini-wallet/core@0.3.2(supports-color@4.4.0)(viem@2.57.2(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76))': + dependencies: + '@metamask/rpc-errors': 7.0.2(supports-color@4.4.0) + eventemitter3: 5.0.1 + viem: 2.57.2(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76) + transitivePeerDependencies: + - supports-color + '@graphql-typed-document-node/core@3.2.0(graphql@17.0.2)': dependencies: graphql: 17.0.2 @@ -13499,7 +14731,7 @@ snapshots: '@libsql/isomorphic-ws@0.1.5(bufferutil@4.0.9)(utf-8-validate@5.0.10)': dependencies: '@types/ws': 8.18.1 - ws: 8.20.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + ws: 8.21.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - utf-8-validate @@ -13527,10 +14759,16 @@ snapshots: '@lit-labs/ssr-dom-shim@1.1.1': {} + '@lit-labs/ssr-dom-shim@1.6.0': {} + '@lit/reactive-element@1.6.2': dependencies: '@lit-labs/ssr-dom-shim': 1.1.1 + '@lit/reactive-element@2.1.2': + dependencies: + '@lit-labs/ssr-dom-shim': 1.6.0 + '@ljharb/resumer@0.0.1': dependencies: '@ljharb/through': 2.3.13 @@ -13539,6 +14777,14 @@ snapshots: dependencies: call-bind: 1.0.8 + '@metamask/eth-json-rpc-provider@1.0.1(supports-color@4.4.0)': + dependencies: + '@metamask/json-rpc-engine': 7.3.3(supports-color@4.4.0) + '@metamask/safe-event-emitter': 3.1.3 + '@metamask/utils': 5.0.2(supports-color@4.4.0) + transitivePeerDependencies: + - supports-color + '@metamask/eth-sig-util@4.0.1': dependencies: ethereumjs-abi: 0.6.8 @@ -13547,6 +14793,189 @@ snapshots: tweetnacl: 1.0.3 tweetnacl-util: 0.15.1 + '@metamask/json-rpc-engine@7.3.3(supports-color@4.4.0)': + dependencies: + '@metamask/rpc-errors': 6.4.0(supports-color@4.4.0) + '@metamask/safe-event-emitter': 3.1.3 + '@metamask/utils': 8.5.0(supports-color@4.4.0) + transitivePeerDependencies: + - supports-color + + '@metamask/json-rpc-engine@8.0.2(supports-color@4.4.0)': + dependencies: + '@metamask/rpc-errors': 6.4.0(supports-color@4.4.0) + '@metamask/safe-event-emitter': 3.1.3 + '@metamask/utils': 8.5.0(supports-color@4.4.0) + transitivePeerDependencies: + - supports-color + + '@metamask/json-rpc-middleware-stream@7.0.2(supports-color@4.4.0)': + dependencies: + '@metamask/json-rpc-engine': 8.0.2(supports-color@4.4.0) + '@metamask/safe-event-emitter': 3.1.3 + '@metamask/utils': 8.5.0(supports-color@4.4.0) + readable-stream: 3.6.2 + transitivePeerDependencies: + - supports-color + + '@metamask/object-multiplex@2.1.0': + dependencies: + once: 1.4.0 + readable-stream: 3.6.2 + + '@metamask/onboarding@1.0.1': + dependencies: + bowser: 2.11.0 + + '@metamask/providers@16.1.0(supports-color@4.4.0)': + dependencies: + '@metamask/json-rpc-engine': 8.0.2(supports-color@4.4.0) + '@metamask/json-rpc-middleware-stream': 7.0.2(supports-color@4.4.0) + '@metamask/object-multiplex': 2.1.0 + '@metamask/rpc-errors': 6.4.0(supports-color@4.4.0) + '@metamask/safe-event-emitter': 3.1.3 + '@metamask/utils': 8.5.0(supports-color@4.4.0) + detect-browser: 5.3.0 + extension-port-stream: 3.0.0 + fast-deep-equal: 3.1.3 + is-stream: 2.0.1 + readable-stream: 3.6.2 + webextension-polyfill: 0.10.0 + transitivePeerDependencies: + - supports-color + + '@metamask/rpc-errors@6.4.0(supports-color@4.4.0)': + dependencies: + '@metamask/utils': 9.3.0(supports-color@4.4.0) + fast-safe-stringify: 2.1.1 + transitivePeerDependencies: + - supports-color + + '@metamask/rpc-errors@7.0.2(supports-color@4.4.0)': + dependencies: + '@metamask/utils': 11.12.1(supports-color@4.4.0) + fast-safe-stringify: 2.1.1 + transitivePeerDependencies: + - supports-color + + '@metamask/safe-event-emitter@2.0.0': {} + + '@metamask/safe-event-emitter@3.1.3': {} + + '@metamask/scure-bip39@2.1.1': + dependencies: + '@noble/hashes': 1.3.3 + '@scure/base': 1.1.9 + + '@metamask/sdk-analytics@0.0.5': + dependencies: + openapi-fetch: 0.13.8 + + '@metamask/sdk-communication-layer@0.33.1(cross-fetch@4.1.0(encoding@0.1.13))(eciesjs@0.4.18)(eventemitter2@6.4.9)(readable-stream@3.6.2)(socket.io-client@4.8.4(bufferutil@4.0.9)(supports-color@4.4.0)(utf-8-validate@5.0.10))(supports-color@4.4.0)': + dependencies: + '@metamask/sdk-analytics': 0.0.5 + bufferutil: 4.0.9 + cross-fetch: 4.1.0(encoding@0.1.13) + date-fns: 2.30.0 + debug: 4.3.4(supports-color@4.4.0) + eciesjs: 0.4.18 + eventemitter2: 6.4.9 + readable-stream: 3.6.2 + socket.io-client: 4.8.4(bufferutil@4.0.9)(supports-color@4.4.0)(utf-8-validate@5.0.10) + utf-8-validate: 5.0.10 + uuid: 8.3.2 + transitivePeerDependencies: + - supports-color + + '@metamask/sdk-install-modal-web@0.32.1': + dependencies: + '@paulmillr/qr': 0.2.1 + + '@metamask/sdk@0.33.1(bufferutil@4.0.9)(encoding@0.1.13)(supports-color@4.4.0)(utf-8-validate@5.0.10)': + dependencies: + '@babel/runtime': 7.29.2 + '@metamask/onboarding': 1.0.1 + '@metamask/providers': 16.1.0(supports-color@4.4.0) + '@metamask/sdk-analytics': 0.0.5 + '@metamask/sdk-communication-layer': 0.33.1(cross-fetch@4.1.0(encoding@0.1.13))(eciesjs@0.4.18)(eventemitter2@6.4.9)(readable-stream@3.6.2)(socket.io-client@4.8.4(bufferutil@4.0.9)(supports-color@4.4.0)(utf-8-validate@5.0.10))(supports-color@4.4.0) + '@metamask/sdk-install-modal-web': 0.32.1 + '@paulmillr/qr': 0.2.1 + bowser: 2.11.0 + cross-fetch: 4.1.0(encoding@0.1.13) + debug: 4.3.4(supports-color@4.4.0) + eciesjs: 0.4.18 + eth-rpc-errors: 4.0.3 + eventemitter2: 6.4.9 + obj-multiplex: 1.0.0 + pump: 3.0.0 + readable-stream: 3.6.2 + socket.io-client: 4.8.4(bufferutil@4.0.9)(supports-color@4.4.0)(utf-8-validate@5.0.10) + tslib: 2.8.1 + util: 0.12.5 + uuid: 8.3.2 + transitivePeerDependencies: + - bufferutil + - encoding + - supports-color + - utf-8-validate + + '@metamask/superstruct@3.4.1': {} + + '@metamask/utils@11.12.1(supports-color@4.4.0)': + dependencies: + '@ethereumjs/tx': 4.2.0 + '@metamask/scure-bip39': 2.1.1 + '@metamask/superstruct': 3.4.1 + '@noble/hashes': 1.7.0 + '@scure/base': 1.2.1 + '@types/debug': 4.1.12 + '@types/lodash': 4.17.25 + debug: 4.4.3(supports-color@4.4.0) + lodash: 4.18.1 + pony-cause: 2.1.11 + semver: 7.8.5 + uuid: 9.0.1 + transitivePeerDependencies: + - supports-color + + '@metamask/utils@5.0.2(supports-color@4.4.0)': + dependencies: + '@ethereumjs/tx': 4.2.0 + '@types/debug': 4.1.12 + debug: 4.4.3(supports-color@4.4.0) + semver: 7.8.5 + superstruct: 1.0.4 + transitivePeerDependencies: + - supports-color + + '@metamask/utils@8.5.0(supports-color@4.4.0)': + dependencies: + '@ethereumjs/tx': 4.2.0 + '@metamask/superstruct': 3.4.1 + '@noble/hashes': 1.7.0 + '@scure/base': 1.2.1 + '@types/debug': 4.1.12 + debug: 4.4.3(supports-color@4.4.0) + pony-cause: 2.1.11 + semver: 7.8.5 + uuid: 9.0.1 + transitivePeerDependencies: + - supports-color + + '@metamask/utils@9.3.0(supports-color@4.4.0)': + dependencies: + '@ethereumjs/tx': 4.2.0 + '@metamask/superstruct': 3.4.1 + '@noble/hashes': 1.7.0 + '@scure/base': 1.2.1 + '@types/debug': 4.1.12 + debug: 4.4.3(supports-color@4.4.0) + pony-cause: 2.1.11 + semver: 7.8.5 + uuid: 9.0.1 + transitivePeerDependencies: + - supports-color + '@motionone/animation@10.15.1': dependencies: '@motionone/easing': 10.15.1 @@ -13643,6 +15072,10 @@ snapshots: '@next/swc-win32-x64-msvc@16.3.5': optional: true + '@noble/ciphers@1.2.1': {} + + '@noble/ciphers@1.3.0': {} + '@noble/curves@1.2.0': dependencies: '@noble/hashes': 1.3.2 @@ -13651,14 +15084,22 @@ snapshots: dependencies: '@noble/hashes': 1.4.0 - '@noble/curves@1.7.0': - dependencies: - '@noble/hashes': 1.6.0 - '@noble/curves@1.8.0': dependencies: '@noble/hashes': 1.7.0 + '@noble/curves@1.8.1': + dependencies: + '@noble/hashes': 1.7.1 + + '@noble/curves@1.9.1': + dependencies: + '@noble/hashes': 1.8.0 + + '@noble/curves@1.9.7': + dependencies: + '@noble/hashes': 1.8.0 + '@noble/hashes@1.2.0': {} '@noble/hashes@1.3.2': {} @@ -13667,11 +15108,11 @@ snapshots: '@noble/hashes@1.4.0': {} - '@noble/hashes@1.6.0': {} + '@noble/hashes@1.7.0': {} - '@noble/hashes@1.6.1': {} + '@noble/hashes@1.7.1': {} - '@noble/hashes@1.7.0': {} + '@noble/hashes@1.8.0': {} '@noble/secp256k1@1.7.1': {} @@ -14024,11 +15465,32 @@ snapshots: '@parcel/watcher-win32-arm64': 2.6.0 '@parcel/watcher-win32-x64': 2.6.0 + '@paulmillr/qr@0.2.1': {} + '@pkgjs/parseargs@0.11.0': optional: true '@pkgr/core@0.3.6': {} + '@rainbow-me/rainbowkit@2.2.11(@tanstack/react-query@5.104.0(react@19.3.0))(@types/react@19.3.0)(babel-plugin-macros@3.1.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(typescript@6.0.3)(viem@2.57.2(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76))(wagmi@2.19.5(@tanstack/query-core@5.104.0)(@tanstack/react-query@5.104.0(react@19.3.0))(@types/react@19.3.0)(bufferutil@4.0.9)(debug@4.4.3(supports-color@4.4.0))(encoding@0.1.13)(immer@11.1.18)(react@19.3.0)(supports-color@4.4.0)(typescript@6.0.3)(utf-8-validate@5.0.10)(viem@2.57.2(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76))': + dependencies: + '@tanstack/react-query': 5.104.0(react@19.3.0) + '@vanilla-extract/css': 1.20.1(babel-plugin-macros@3.1.0) + '@vanilla-extract/dynamic': 2.1.5 + '@vanilla-extract/sprinkles': 1.6.5(@vanilla-extract/css@1.20.1(babel-plugin-macros@3.1.0)) + clsx: 2.1.1 + cuer: 0.0.3(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(typescript@6.0.3) + react: 19.3.0 + react-dom: 19.3.0(react@19.3.0) + react-remove-scroll: 2.7.2(@types/react@19.3.0)(react@19.3.0) + ua-parser-js: 2.0.10 + viem: 2.57.2(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76) + wagmi: 2.19.5(@tanstack/query-core@5.104.0)(@tanstack/react-query@5.104.0(react@19.3.0))(@types/react@19.3.0)(bufferutil@4.0.9)(debug@4.4.3(supports-color@4.4.0))(encoding@0.1.13)(immer@11.1.18)(react@19.3.0)(supports-color@4.4.0)(typescript@6.0.3)(utf-8-validate@5.0.10)(viem@2.57.2(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76) + transitivePeerDependencies: + - '@types/react' + - babel-plugin-macros + - typescript + '@reduxjs/toolkit@2.9.0(react-redux@9.2.0(@types/react@19.3.0)(react@19.3.0)(redux@5.0.1))(react@19.3.0)': dependencies: '@standard-schema/spec': 1.0.0 @@ -14041,59 +15503,314 @@ snapshots: react: 19.3.0 react-redux: 9.2.0(@types/react@19.3.0)(react@19.3.0)(redux@5.0.1) - '@resolver-engine/core@0.3.3(supports-color@4.4.0)': + '@reown/appkit-common@1.7.8(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.22.4)': dependencies: - debug: 3.2.7(supports-color@4.4.0) - is-url: 1.2.4 - request: 2.88.2 + big.js: 6.2.2 + dayjs: 1.11.13 + viem: 2.57.2(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.22.4) transitivePeerDependencies: - - supports-color + - bufferutil + - typescript + - utf-8-validate + - zod - '@resolver-engine/fs@0.3.3(supports-color@4.4.0)': + '@reown/appkit-common@1.7.8(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: - '@resolver-engine/core': 0.3.3(supports-color@4.4.0) - debug: 3.2.7(supports-color@4.4.0) + big.js: 6.2.2 + dayjs: 1.11.13 + viem: 2.57.2(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76) transitivePeerDependencies: - - supports-color + - bufferutil + - typescript + - utf-8-validate + - zod - '@resolver-engine/imports-fs@0.3.3(supports-color@4.4.0)': + '@reown/appkit-controllers@1.7.8(@types/react@19.3.0)(bufferutil@4.0.9)(encoding@0.1.13)(react@19.3.0)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: - '@resolver-engine/fs': 0.3.3(supports-color@4.4.0) - '@resolver-engine/imports': 0.3.3(supports-color@4.4.0) - debug: 3.2.7(supports-color@4.4.0) + '@reown/appkit-common': 1.7.8(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-wallet': 1.7.8(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10) + '@walletconnect/universal-provider': 2.21.0(bufferutil@4.0.9)(encoding@0.1.13)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76) + valtio: 1.13.2(@types/react@19.3.0)(react@19.3.0) + viem: 2.57.2(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76) transitivePeerDependencies: - - supports-color + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@types/react' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - encoding + - ioredis + - react + - typescript + - uploadthing + - utf-8-validate + - zod - '@resolver-engine/imports@0.3.3(supports-color@4.4.0)': + '@reown/appkit-pay@1.7.8(@types/react@19.3.0)(bufferutil@4.0.9)(encoding@0.1.13)(react@19.3.0)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: - '@resolver-engine/core': 0.3.3(supports-color@4.4.0) - debug: 3.2.7(supports-color@4.4.0) - hosted-git-info: 2.8.9 - path-browserify: 1.0.1 - url: 0.11.0 + '@reown/appkit-common': 1.7.8(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-controllers': 1.7.8(@types/react@19.3.0)(bufferutil@4.0.9)(encoding@0.1.13)(react@19.3.0)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-ui': 1.7.8(@types/react@19.3.0)(bufferutil@4.0.9)(encoding@0.1.13)(react@19.3.0)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-utils': 1.7.8(@types/react@19.3.0)(bufferutil@4.0.9)(encoding@0.1.13)(react@19.3.0)(typescript@6.0.3)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@19.3.0)(react@19.3.0))(zod@3.25.76) + lit: 3.3.0 + valtio: 1.13.2(@types/react@19.3.0)(react@19.3.0) transitivePeerDependencies: - - supports-color - - '@rolldown/binding-android-arm-eabi@1.2.8': - optional: true - - '@rolldown/binding-android-arm64@1.2.8': - optional: true - - '@rolldown/binding-darwin-arm64@1.2.8': - optional: true - - '@rolldown/binding-darwin-x64@1.2.8': - optional: true - - '@rolldown/binding-freebsd-x64@1.2.8': - optional: true - - '@rolldown/binding-linux-arm-gnueabihf@1.2.8': - optional: true + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@types/react' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - encoding + - ioredis + - react + - typescript + - uploadthing + - utf-8-validate + - zod - '@rolldown/binding-linux-arm64-gnu@1.2.8': - optional: true + '@reown/appkit-polyfills@1.7.8': + dependencies: + buffer: 6.0.3 + + '@reown/appkit-scaffold-ui@1.7.8(@types/react@19.3.0)(bufferutil@4.0.9)(encoding@0.1.13)(react@19.3.0)(typescript@6.0.3)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@19.3.0)(react@19.3.0))(zod@3.25.76)': + dependencies: + '@reown/appkit-common': 1.7.8(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-controllers': 1.7.8(@types/react@19.3.0)(bufferutil@4.0.9)(encoding@0.1.13)(react@19.3.0)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-ui': 1.7.8(@types/react@19.3.0)(bufferutil@4.0.9)(encoding@0.1.13)(react@19.3.0)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-utils': 1.7.8(@types/react@19.3.0)(bufferutil@4.0.9)(encoding@0.1.13)(react@19.3.0)(typescript@6.0.3)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@19.3.0)(react@19.3.0))(zod@3.25.76) + '@reown/appkit-wallet': 1.7.8(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10) + lit: 3.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@types/react' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - encoding + - ioredis + - react + - typescript + - uploadthing + - utf-8-validate + - valtio + - zod + + '@reown/appkit-ui@1.7.8(@types/react@19.3.0)(bufferutil@4.0.9)(encoding@0.1.13)(react@19.3.0)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + '@reown/appkit-common': 1.7.8(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-controllers': 1.7.8(@types/react@19.3.0)(bufferutil@4.0.9)(encoding@0.1.13)(react@19.3.0)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-wallet': 1.7.8(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10) + lit: 3.3.0 + qrcode: 1.5.3 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@types/react' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - encoding + - ioredis + - react + - typescript + - uploadthing + - utf-8-validate + - zod + + '@reown/appkit-utils@1.7.8(@types/react@19.3.0)(bufferutil@4.0.9)(encoding@0.1.13)(react@19.3.0)(typescript@6.0.3)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@19.3.0)(react@19.3.0))(zod@3.25.76)': + dependencies: + '@reown/appkit-common': 1.7.8(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-controllers': 1.7.8(@types/react@19.3.0)(bufferutil@4.0.9)(encoding@0.1.13)(react@19.3.0)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-polyfills': 1.7.8 + '@reown/appkit-wallet': 1.7.8(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10) + '@walletconnect/logger': 2.1.2 + '@walletconnect/universal-provider': 2.21.0(bufferutil@4.0.9)(encoding@0.1.13)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76) + valtio: 1.13.2(@types/react@19.3.0)(react@19.3.0) + viem: 2.57.2(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76) + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@types/react' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - encoding + - ioredis + - react + - typescript + - uploadthing + - utf-8-validate + - zod + + '@reown/appkit-wallet@1.7.8(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)': + dependencies: + '@reown/appkit-common': 1.7.8(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.22.4) + '@reown/appkit-polyfills': 1.7.8 + '@walletconnect/logger': 2.1.2 + zod: 3.22.4 + transitivePeerDependencies: + - bufferutil + - typescript + - utf-8-validate + + '@reown/appkit@1.7.8(@types/react@19.3.0)(bufferutil@4.0.9)(encoding@0.1.13)(react@19.3.0)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + '@reown/appkit-common': 1.7.8(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-controllers': 1.7.8(@types/react@19.3.0)(bufferutil@4.0.9)(encoding@0.1.13)(react@19.3.0)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-pay': 1.7.8(@types/react@19.3.0)(bufferutil@4.0.9)(encoding@0.1.13)(react@19.3.0)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-polyfills': 1.7.8 + '@reown/appkit-scaffold-ui': 1.7.8(@types/react@19.3.0)(bufferutil@4.0.9)(encoding@0.1.13)(react@19.3.0)(typescript@6.0.3)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@19.3.0)(react@19.3.0))(zod@3.25.76) + '@reown/appkit-ui': 1.7.8(@types/react@19.3.0)(bufferutil@4.0.9)(encoding@0.1.13)(react@19.3.0)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-utils': 1.7.8(@types/react@19.3.0)(bufferutil@4.0.9)(encoding@0.1.13)(react@19.3.0)(typescript@6.0.3)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@19.3.0)(react@19.3.0))(zod@3.25.76) + '@reown/appkit-wallet': 1.7.8(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10) + '@walletconnect/types': 2.21.0 + '@walletconnect/universal-provider': 2.21.0(bufferutil@4.0.9)(encoding@0.1.13)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76) + bs58: 6.0.0 + valtio: 1.13.2(@types/react@19.3.0)(react@19.3.0) + viem: 2.57.2(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76) + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@types/react' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - encoding + - ioredis + - react + - typescript + - uploadthing + - utf-8-validate + - zod + + '@resolver-engine/core@0.3.3(supports-color@4.4.0)': + dependencies: + debug: 3.2.7(supports-color@4.4.0) + is-url: 1.2.4 + request: 2.88.2 + transitivePeerDependencies: + - supports-color + + '@resolver-engine/fs@0.3.3(supports-color@4.4.0)': + dependencies: + '@resolver-engine/core': 0.3.3(supports-color@4.4.0) + debug: 3.2.7(supports-color@4.4.0) + transitivePeerDependencies: + - supports-color + + '@resolver-engine/imports-fs@0.3.3(supports-color@4.4.0)': + dependencies: + '@resolver-engine/fs': 0.3.3(supports-color@4.4.0) + '@resolver-engine/imports': 0.3.3(supports-color@4.4.0) + debug: 3.2.7(supports-color@4.4.0) + transitivePeerDependencies: + - supports-color + + '@resolver-engine/imports@0.3.3(supports-color@4.4.0)': + dependencies: + '@resolver-engine/core': 0.3.3(supports-color@4.4.0) + debug: 3.2.7(supports-color@4.4.0) + hosted-git-info: 2.8.9 + path-browserify: 1.0.1 + url: 0.11.0 + transitivePeerDependencies: + - supports-color + + '@rolldown/binding-android-arm-eabi@1.2.8': + optional: true + + '@rolldown/binding-android-arm64@1.2.8': + optional: true + + '@rolldown/binding-darwin-arm64@1.2.8': + optional: true + + '@rolldown/binding-darwin-x64@1.2.8': + optional: true + + '@rolldown/binding-freebsd-x64@1.2.8': + optional: true + + '@rolldown/binding-linux-arm-gnueabihf@1.2.8': + optional: true + + '@rolldown/binding-linux-arm64-gnu@1.2.8': + optional: true '@rolldown/binding-linux-arm64-musl@1.2.8': optional: true @@ -14210,7 +15927,7 @@ snapshots: '@safe-global/safe-apps-sdk@9.1.0(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: '@safe-global/safe-gateway-typescript-sdk': 3.22.4 - viem: 2.22.8(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76) + viem: 2.57.2(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76) transitivePeerDependencies: - bufferutil - typescript @@ -14223,6 +15940,8 @@ snapshots: '@scure/base@1.2.1': {} + '@scure/base@1.2.6': {} + '@scure/bip32@1.1.5': dependencies: '@noble/hashes': 1.2.0 @@ -14241,18 +15960,24 @@ snapshots: '@noble/hashes': 1.4.0 '@scure/base': 1.1.9 - '@scure/bip32@1.6.0': - dependencies: - '@noble/curves': 1.7.0 - '@noble/hashes': 1.6.1 - '@scure/base': 1.2.1 - '@scure/bip32@1.6.1': dependencies: '@noble/curves': 1.8.0 '@noble/hashes': 1.7.0 '@scure/base': 1.2.1 + '@scure/bip32@1.6.2': + dependencies: + '@noble/curves': 1.8.1 + '@noble/hashes': 1.7.1 + '@scure/base': 1.2.6 + + '@scure/bip32@1.7.0': + dependencies: + '@noble/curves': 1.9.1 + '@noble/hashes': 1.8.0 + '@scure/base': 1.2.6 + '@scure/bip39@1.1.1': dependencies: '@noble/hashes': 1.2.0 @@ -14268,16 +15993,21 @@ snapshots: '@noble/hashes': 1.4.0 '@scure/base': 1.1.9 - '@scure/bip39@1.5.0': - dependencies: - '@noble/hashes': 1.6.1 - '@scure/base': 1.2.1 - '@scure/bip39@1.5.1': dependencies: '@noble/hashes': 1.7.0 '@scure/base': 1.2.1 + '@scure/bip39@1.5.4': + dependencies: + '@noble/hashes': 1.7.1 + '@scure/base': 1.2.6 + + '@scure/bip39@1.6.0': + dependencies: + '@noble/hashes': 1.8.0 + '@scure/base': 1.2.6 + '@sentry/core@5.30.0': dependencies: '@sentry/hub': 5.30.0 @@ -14352,76 +16082,510 @@ snapshots: dependencies: '@sinonjs/commons': 3.0.1 - '@stablelib/aead@1.0.1': {} + '@socket.io/component-emitter@3.1.2': {} - '@stablelib/binary@1.0.1': + '@solana-program/system@0.10.0(@solana/kit@5.5.1(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10))': dependencies: - '@stablelib/int': 1.0.1 + '@solana/kit': 5.5.1(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10) - '@stablelib/bytes@1.0.1': {} - - '@stablelib/chacha20poly1305@1.0.1': + '@solana-program/token@0.9.0(@solana/kit@5.5.1(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10))': dependencies: - '@stablelib/aead': 1.0.1 - '@stablelib/binary': 1.0.1 - '@stablelib/chacha': 1.0.1 - '@stablelib/constant-time': 1.0.1 - '@stablelib/poly1305': 1.0.1 - '@stablelib/wipe': 1.0.1 + '@solana/kit': 5.5.1(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10) - '@stablelib/chacha@1.0.1': + '@solana/accounts@5.5.1(typescript@6.0.3)': dependencies: - '@stablelib/binary': 1.0.1 - '@stablelib/wipe': 1.0.1 - - '@stablelib/constant-time@1.0.1': {} + '@solana/addresses': 5.5.1(typescript@6.0.3) + '@solana/codecs-core': 5.5.1(typescript@6.0.3) + '@solana/codecs-strings': 5.5.1(typescript@6.0.3) + '@solana/errors': 5.5.1(typescript@6.0.3) + '@solana/rpc-spec': 5.5.1(typescript@6.0.3) + '@solana/rpc-types': 5.5.1(typescript@6.0.3) + optionalDependencies: + typescript: 6.0.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder - '@stablelib/ed25519@1.0.3': + '@solana/addresses@5.5.1(typescript@6.0.3)': dependencies: - '@stablelib/random': 1.0.2 - '@stablelib/sha512': 1.0.1 - '@stablelib/wipe': 1.0.1 - - '@stablelib/hash@1.0.1': {} + '@solana/assertions': 5.5.1(typescript@6.0.3) + '@solana/codecs-core': 5.5.1(typescript@6.0.3) + '@solana/codecs-strings': 5.5.1(typescript@6.0.3) + '@solana/errors': 5.5.1(typescript@6.0.3) + '@solana/nominal-types': 5.5.1(typescript@6.0.3) + optionalDependencies: + typescript: 6.0.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder - '@stablelib/hkdf@1.0.1': + '@solana/assertions@5.5.1(typescript@6.0.3)': dependencies: - '@stablelib/hash': 1.0.1 - '@stablelib/hmac': 1.0.1 - '@stablelib/wipe': 1.0.1 + '@solana/errors': 5.5.1(typescript@6.0.3) + optionalDependencies: + typescript: 6.0.3 - '@stablelib/hmac@1.0.1': + '@solana/codecs-core@5.5.1(typescript@6.0.3)': dependencies: - '@stablelib/constant-time': 1.0.1 - '@stablelib/hash': 1.0.1 - '@stablelib/wipe': 1.0.1 - - '@stablelib/int@1.0.1': {} + '@solana/errors': 5.5.1(typescript@6.0.3) + optionalDependencies: + typescript: 6.0.3 - '@stablelib/keyagreement@1.0.1': + '@solana/codecs-data-structures@5.5.1(typescript@6.0.3)': dependencies: - '@stablelib/bytes': 1.0.1 + '@solana/codecs-core': 5.5.1(typescript@6.0.3) + '@solana/codecs-numbers': 5.5.1(typescript@6.0.3) + '@solana/errors': 5.5.1(typescript@6.0.3) + optionalDependencies: + typescript: 6.0.3 - '@stablelib/poly1305@1.0.1': + '@solana/codecs-numbers@5.5.1(typescript@6.0.3)': dependencies: - '@stablelib/constant-time': 1.0.1 - '@stablelib/wipe': 1.0.1 + '@solana/codecs-core': 5.5.1(typescript@6.0.3) + '@solana/errors': 5.5.1(typescript@6.0.3) + optionalDependencies: + typescript: 6.0.3 - '@stablelib/random@1.0.2': + '@solana/codecs-strings@5.5.1(typescript@6.0.3)': dependencies: - '@stablelib/binary': 1.0.1 - '@stablelib/wipe': 1.0.1 + '@solana/codecs-core': 5.5.1(typescript@6.0.3) + '@solana/codecs-numbers': 5.5.1(typescript@6.0.3) + '@solana/errors': 5.5.1(typescript@6.0.3) + optionalDependencies: + typescript: 6.0.3 - '@stablelib/sha256@1.0.1': + '@solana/codecs@5.5.1(typescript@6.0.3)': dependencies: - '@stablelib/binary': 1.0.1 - '@stablelib/hash': 1.0.1 - '@stablelib/wipe': 1.0.1 + '@solana/codecs-core': 5.5.1(typescript@6.0.3) + '@solana/codecs-data-structures': 5.5.1(typescript@6.0.3) + '@solana/codecs-numbers': 5.5.1(typescript@6.0.3) + '@solana/codecs-strings': 5.5.1(typescript@6.0.3) + '@solana/options': 5.5.1(typescript@6.0.3) + optionalDependencies: + typescript: 6.0.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder - '@stablelib/sha512@1.0.1': + '@solana/errors@5.5.1(typescript@6.0.3)': dependencies: - '@stablelib/binary': 1.0.1 - '@stablelib/hash': 1.0.1 + chalk: 5.6.2 + commander: 14.0.2 + optionalDependencies: + typescript: 6.0.3 + + '@solana/fast-stable-stringify@5.5.1(typescript@6.0.3)': + optionalDependencies: + typescript: 6.0.3 + + '@solana/functional@5.5.1(typescript@6.0.3)': + optionalDependencies: + typescript: 6.0.3 + + '@solana/instruction-plans@5.5.1(typescript@6.0.3)': + dependencies: + '@solana/errors': 5.5.1(typescript@6.0.3) + '@solana/instructions': 5.5.1(typescript@6.0.3) + '@solana/keys': 5.5.1(typescript@6.0.3) + '@solana/promises': 5.5.1(typescript@6.0.3) + '@solana/transaction-messages': 5.5.1(typescript@6.0.3) + '@solana/transactions': 5.5.1(typescript@6.0.3) + optionalDependencies: + typescript: 6.0.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/instructions@5.5.1(typescript@6.0.3)': + dependencies: + '@solana/codecs-core': 5.5.1(typescript@6.0.3) + '@solana/errors': 5.5.1(typescript@6.0.3) + optionalDependencies: + typescript: 6.0.3 + + '@solana/keys@5.5.1(typescript@6.0.3)': + dependencies: + '@solana/assertions': 5.5.1(typescript@6.0.3) + '@solana/codecs-core': 5.5.1(typescript@6.0.3) + '@solana/codecs-strings': 5.5.1(typescript@6.0.3) + '@solana/errors': 5.5.1(typescript@6.0.3) + '@solana/nominal-types': 5.5.1(typescript@6.0.3) + optionalDependencies: + typescript: 6.0.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/kit@5.5.1(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)': + dependencies: + '@solana/accounts': 5.5.1(typescript@6.0.3) + '@solana/addresses': 5.5.1(typescript@6.0.3) + '@solana/codecs': 5.5.1(typescript@6.0.3) + '@solana/errors': 5.5.1(typescript@6.0.3) + '@solana/functional': 5.5.1(typescript@6.0.3) + '@solana/instruction-plans': 5.5.1(typescript@6.0.3) + '@solana/instructions': 5.5.1(typescript@6.0.3) + '@solana/keys': 5.5.1(typescript@6.0.3) + '@solana/offchain-messages': 5.5.1(typescript@6.0.3) + '@solana/plugin-core': 5.5.1(typescript@6.0.3) + '@solana/programs': 5.5.1(typescript@6.0.3) + '@solana/rpc': 5.5.1(typescript@6.0.3) + '@solana/rpc-api': 5.5.1(typescript@6.0.3) + '@solana/rpc-parsed-types': 5.5.1(typescript@6.0.3) + '@solana/rpc-spec-types': 5.5.1(typescript@6.0.3) + '@solana/rpc-subscriptions': 5.5.1(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10) + '@solana/rpc-types': 5.5.1(typescript@6.0.3) + '@solana/signers': 5.5.1(typescript@6.0.3) + '@solana/sysvars': 5.5.1(typescript@6.0.3) + '@solana/transaction-confirmation': 5.5.1(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10) + '@solana/transaction-messages': 5.5.1(typescript@6.0.3) + '@solana/transactions': 5.5.1(typescript@6.0.3) + optionalDependencies: + typescript: 6.0.3 + transitivePeerDependencies: + - bufferutil + - fastestsmallesttextencoderdecoder + - utf-8-validate + + '@solana/nominal-types@5.5.1(typescript@6.0.3)': + optionalDependencies: + typescript: 6.0.3 + + '@solana/offchain-messages@5.5.1(typescript@6.0.3)': + dependencies: + '@solana/addresses': 5.5.1(typescript@6.0.3) + '@solana/codecs-core': 5.5.1(typescript@6.0.3) + '@solana/codecs-data-structures': 5.5.1(typescript@6.0.3) + '@solana/codecs-numbers': 5.5.1(typescript@6.0.3) + '@solana/codecs-strings': 5.5.1(typescript@6.0.3) + '@solana/errors': 5.5.1(typescript@6.0.3) + '@solana/keys': 5.5.1(typescript@6.0.3) + '@solana/nominal-types': 5.5.1(typescript@6.0.3) + optionalDependencies: + typescript: 6.0.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/options@5.5.1(typescript@6.0.3)': + dependencies: + '@solana/codecs-core': 5.5.1(typescript@6.0.3) + '@solana/codecs-data-structures': 5.5.1(typescript@6.0.3) + '@solana/codecs-numbers': 5.5.1(typescript@6.0.3) + '@solana/codecs-strings': 5.5.1(typescript@6.0.3) + '@solana/errors': 5.5.1(typescript@6.0.3) + optionalDependencies: + typescript: 6.0.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/plugin-core@5.5.1(typescript@6.0.3)': + optionalDependencies: + typescript: 6.0.3 + + '@solana/programs@5.5.1(typescript@6.0.3)': + dependencies: + '@solana/addresses': 5.5.1(typescript@6.0.3) + '@solana/errors': 5.5.1(typescript@6.0.3) + optionalDependencies: + typescript: 6.0.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/promises@5.5.1(typescript@6.0.3)': + optionalDependencies: + typescript: 6.0.3 + + '@solana/rpc-api@5.5.1(typescript@6.0.3)': + dependencies: + '@solana/addresses': 5.5.1(typescript@6.0.3) + '@solana/codecs-core': 5.5.1(typescript@6.0.3) + '@solana/codecs-strings': 5.5.1(typescript@6.0.3) + '@solana/errors': 5.5.1(typescript@6.0.3) + '@solana/keys': 5.5.1(typescript@6.0.3) + '@solana/rpc-parsed-types': 5.5.1(typescript@6.0.3) + '@solana/rpc-spec': 5.5.1(typescript@6.0.3) + '@solana/rpc-transformers': 5.5.1(typescript@6.0.3) + '@solana/rpc-types': 5.5.1(typescript@6.0.3) + '@solana/transaction-messages': 5.5.1(typescript@6.0.3) + '@solana/transactions': 5.5.1(typescript@6.0.3) + optionalDependencies: + typescript: 6.0.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/rpc-parsed-types@5.5.1(typescript@6.0.3)': + optionalDependencies: + typescript: 6.0.3 + + '@solana/rpc-spec-types@5.5.1(typescript@6.0.3)': + optionalDependencies: + typescript: 6.0.3 + + '@solana/rpc-spec@5.5.1(typescript@6.0.3)': + dependencies: + '@solana/errors': 5.5.1(typescript@6.0.3) + '@solana/rpc-spec-types': 5.5.1(typescript@6.0.3) + optionalDependencies: + typescript: 6.0.3 + + '@solana/rpc-subscriptions-api@5.5.1(typescript@6.0.3)': + dependencies: + '@solana/addresses': 5.5.1(typescript@6.0.3) + '@solana/keys': 5.5.1(typescript@6.0.3) + '@solana/rpc-subscriptions-spec': 5.5.1(typescript@6.0.3) + '@solana/rpc-transformers': 5.5.1(typescript@6.0.3) + '@solana/rpc-types': 5.5.1(typescript@6.0.3) + '@solana/transaction-messages': 5.5.1(typescript@6.0.3) + '@solana/transactions': 5.5.1(typescript@6.0.3) + optionalDependencies: + typescript: 6.0.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/rpc-subscriptions-channel-websocket@5.5.1(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)': + dependencies: + '@solana/errors': 5.5.1(typescript@6.0.3) + '@solana/functional': 5.5.1(typescript@6.0.3) + '@solana/rpc-subscriptions-spec': 5.5.1(typescript@6.0.3) + '@solana/subscribable': 5.5.1(typescript@6.0.3) + ws: 8.21.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) + optionalDependencies: + typescript: 6.0.3 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + '@solana/rpc-subscriptions-spec@5.5.1(typescript@6.0.3)': + dependencies: + '@solana/errors': 5.5.1(typescript@6.0.3) + '@solana/promises': 5.5.1(typescript@6.0.3) + '@solana/rpc-spec-types': 5.5.1(typescript@6.0.3) + '@solana/subscribable': 5.5.1(typescript@6.0.3) + optionalDependencies: + typescript: 6.0.3 + + '@solana/rpc-subscriptions@5.5.1(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)': + dependencies: + '@solana/errors': 5.5.1(typescript@6.0.3) + '@solana/fast-stable-stringify': 5.5.1(typescript@6.0.3) + '@solana/functional': 5.5.1(typescript@6.0.3) + '@solana/promises': 5.5.1(typescript@6.0.3) + '@solana/rpc-spec-types': 5.5.1(typescript@6.0.3) + '@solana/rpc-subscriptions-api': 5.5.1(typescript@6.0.3) + '@solana/rpc-subscriptions-channel-websocket': 5.5.1(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10) + '@solana/rpc-subscriptions-spec': 5.5.1(typescript@6.0.3) + '@solana/rpc-transformers': 5.5.1(typescript@6.0.3) + '@solana/rpc-types': 5.5.1(typescript@6.0.3) + '@solana/subscribable': 5.5.1(typescript@6.0.3) + optionalDependencies: + typescript: 6.0.3 + transitivePeerDependencies: + - bufferutil + - fastestsmallesttextencoderdecoder + - utf-8-validate + + '@solana/rpc-transformers@5.5.1(typescript@6.0.3)': + dependencies: + '@solana/errors': 5.5.1(typescript@6.0.3) + '@solana/functional': 5.5.1(typescript@6.0.3) + '@solana/nominal-types': 5.5.1(typescript@6.0.3) + '@solana/rpc-spec-types': 5.5.1(typescript@6.0.3) + '@solana/rpc-types': 5.5.1(typescript@6.0.3) + optionalDependencies: + typescript: 6.0.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/rpc-transport-http@5.5.1(typescript@6.0.3)': + dependencies: + '@solana/errors': 5.5.1(typescript@6.0.3) + '@solana/rpc-spec': 5.5.1(typescript@6.0.3) + '@solana/rpc-spec-types': 5.5.1(typescript@6.0.3) + undici-types: 7.30.0 + optionalDependencies: + typescript: 6.0.3 + + '@solana/rpc-types@5.5.1(typescript@6.0.3)': + dependencies: + '@solana/addresses': 5.5.1(typescript@6.0.3) + '@solana/codecs-core': 5.5.1(typescript@6.0.3) + '@solana/codecs-numbers': 5.5.1(typescript@6.0.3) + '@solana/codecs-strings': 5.5.1(typescript@6.0.3) + '@solana/errors': 5.5.1(typescript@6.0.3) + '@solana/nominal-types': 5.5.1(typescript@6.0.3) + optionalDependencies: + typescript: 6.0.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/rpc@5.5.1(typescript@6.0.3)': + dependencies: + '@solana/errors': 5.5.1(typescript@6.0.3) + '@solana/fast-stable-stringify': 5.5.1(typescript@6.0.3) + '@solana/functional': 5.5.1(typescript@6.0.3) + '@solana/rpc-api': 5.5.1(typescript@6.0.3) + '@solana/rpc-spec': 5.5.1(typescript@6.0.3) + '@solana/rpc-spec-types': 5.5.1(typescript@6.0.3) + '@solana/rpc-transformers': 5.5.1(typescript@6.0.3) + '@solana/rpc-transport-http': 5.5.1(typescript@6.0.3) + '@solana/rpc-types': 5.5.1(typescript@6.0.3) + optionalDependencies: + typescript: 6.0.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/signers@5.5.1(typescript@6.0.3)': + dependencies: + '@solana/addresses': 5.5.1(typescript@6.0.3) + '@solana/codecs-core': 5.5.1(typescript@6.0.3) + '@solana/errors': 5.5.1(typescript@6.0.3) + '@solana/instructions': 5.5.1(typescript@6.0.3) + '@solana/keys': 5.5.1(typescript@6.0.3) + '@solana/nominal-types': 5.5.1(typescript@6.0.3) + '@solana/offchain-messages': 5.5.1(typescript@6.0.3) + '@solana/transaction-messages': 5.5.1(typescript@6.0.3) + '@solana/transactions': 5.5.1(typescript@6.0.3) + optionalDependencies: + typescript: 6.0.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/subscribable@5.5.1(typescript@6.0.3)': + dependencies: + '@solana/errors': 5.5.1(typescript@6.0.3) + optionalDependencies: + typescript: 6.0.3 + + '@solana/sysvars@5.5.1(typescript@6.0.3)': + dependencies: + '@solana/accounts': 5.5.1(typescript@6.0.3) + '@solana/codecs': 5.5.1(typescript@6.0.3) + '@solana/errors': 5.5.1(typescript@6.0.3) + '@solana/rpc-types': 5.5.1(typescript@6.0.3) + optionalDependencies: + typescript: 6.0.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/transaction-confirmation@5.5.1(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)': + dependencies: + '@solana/addresses': 5.5.1(typescript@6.0.3) + '@solana/codecs-strings': 5.5.1(typescript@6.0.3) + '@solana/errors': 5.5.1(typescript@6.0.3) + '@solana/keys': 5.5.1(typescript@6.0.3) + '@solana/promises': 5.5.1(typescript@6.0.3) + '@solana/rpc': 5.5.1(typescript@6.0.3) + '@solana/rpc-subscriptions': 5.5.1(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10) + '@solana/rpc-types': 5.5.1(typescript@6.0.3) + '@solana/transaction-messages': 5.5.1(typescript@6.0.3) + '@solana/transactions': 5.5.1(typescript@6.0.3) + optionalDependencies: + typescript: 6.0.3 + transitivePeerDependencies: + - bufferutil + - fastestsmallesttextencoderdecoder + - utf-8-validate + + '@solana/transaction-messages@5.5.1(typescript@6.0.3)': + dependencies: + '@solana/addresses': 5.5.1(typescript@6.0.3) + '@solana/codecs-core': 5.5.1(typescript@6.0.3) + '@solana/codecs-data-structures': 5.5.1(typescript@6.0.3) + '@solana/codecs-numbers': 5.5.1(typescript@6.0.3) + '@solana/errors': 5.5.1(typescript@6.0.3) + '@solana/functional': 5.5.1(typescript@6.0.3) + '@solana/instructions': 5.5.1(typescript@6.0.3) + '@solana/nominal-types': 5.5.1(typescript@6.0.3) + '@solana/rpc-types': 5.5.1(typescript@6.0.3) + optionalDependencies: + typescript: 6.0.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/transactions@5.5.1(typescript@6.0.3)': + dependencies: + '@solana/addresses': 5.5.1(typescript@6.0.3) + '@solana/codecs-core': 5.5.1(typescript@6.0.3) + '@solana/codecs-data-structures': 5.5.1(typescript@6.0.3) + '@solana/codecs-numbers': 5.5.1(typescript@6.0.3) + '@solana/codecs-strings': 5.5.1(typescript@6.0.3) + '@solana/errors': 5.5.1(typescript@6.0.3) + '@solana/functional': 5.5.1(typescript@6.0.3) + '@solana/instructions': 5.5.1(typescript@6.0.3) + '@solana/keys': 5.5.1(typescript@6.0.3) + '@solana/nominal-types': 5.5.1(typescript@6.0.3) + '@solana/rpc-types': 5.5.1(typescript@6.0.3) + '@solana/transaction-messages': 5.5.1(typescript@6.0.3) + optionalDependencies: + typescript: 6.0.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@stablelib/aead@1.0.1': {} + + '@stablelib/binary@1.0.1': + dependencies: + '@stablelib/int': 1.0.1 + + '@stablelib/bytes@1.0.1': {} + + '@stablelib/chacha20poly1305@1.0.1': + dependencies: + '@stablelib/aead': 1.0.1 + '@stablelib/binary': 1.0.1 + '@stablelib/chacha': 1.0.1 + '@stablelib/constant-time': 1.0.1 + '@stablelib/poly1305': 1.0.1 + '@stablelib/wipe': 1.0.1 + + '@stablelib/chacha@1.0.1': + dependencies: + '@stablelib/binary': 1.0.1 + '@stablelib/wipe': 1.0.1 + + '@stablelib/constant-time@1.0.1': {} + + '@stablelib/ed25519@1.0.3': + dependencies: + '@stablelib/random': 1.0.2 + '@stablelib/sha512': 1.0.1 + '@stablelib/wipe': 1.0.1 + + '@stablelib/hash@1.0.1': {} + + '@stablelib/hkdf@1.0.1': + dependencies: + '@stablelib/hash': 1.0.1 + '@stablelib/hmac': 1.0.1 + '@stablelib/wipe': 1.0.1 + + '@stablelib/hmac@1.0.1': + dependencies: + '@stablelib/constant-time': 1.0.1 + '@stablelib/hash': 1.0.1 + '@stablelib/wipe': 1.0.1 + + '@stablelib/int@1.0.1': {} + + '@stablelib/keyagreement@1.0.1': + dependencies: + '@stablelib/bytes': 1.0.1 + + '@stablelib/poly1305@1.0.1': + dependencies: + '@stablelib/constant-time': 1.0.1 + '@stablelib/wipe': 1.0.1 + + '@stablelib/random@1.0.2': + dependencies: + '@stablelib/binary': 1.0.1 + '@stablelib/wipe': 1.0.1 + + '@stablelib/sha256@1.0.1': + dependencies: + '@stablelib/binary': 1.0.1 + '@stablelib/hash': 1.0.1 + '@stablelib/wipe': 1.0.1 + + '@stablelib/sha512@1.0.1': + dependencies: + '@stablelib/binary': 1.0.1 + '@stablelib/hash': 1.0.1 '@stablelib/wipe': 1.0.1 '@stablelib/wipe@1.0.1': {} @@ -14545,6 +16709,13 @@ snapshots: dependencies: defer-to-connect: 2.0.1 + '@tanstack/query-core@5.104.0': {} + + '@tanstack/react-query@5.104.0(react@19.3.0)': + dependencies: + '@tanstack/query-core': 5.104.0 + react: 19.3.0 + '@testing-library/dom@10.4.2': dependencies: '@babel/code-frame': 7.27.1 @@ -15042,6 +17213,32 @@ snapshots: '@unrs/resolver-binding-win32-x64-msvc@1.12.2': optional: true + '@vanilla-extract/css@1.20.1(babel-plugin-macros@3.1.0)': + dependencies: + '@emotion/hash': 0.9.2 + '@vanilla-extract/private': 1.0.9 + css-what: 6.1.0 + csstype: 3.2.3 + dedent: 1.7.2(babel-plugin-macros@3.1.0) + deep-object-diff: 1.1.9 + deepmerge: 4.3.1 + lru-cache: 10.4.3 + media-query-parser: 2.0.2 + modern-ahocorasick: 1.1.0 + picocolors: 1.1.1 + transitivePeerDependencies: + - babel-plugin-macros + + '@vanilla-extract/dynamic@2.1.5': + dependencies: + '@vanilla-extract/private': 1.0.9 + + '@vanilla-extract/private@1.0.9': {} + + '@vanilla-extract/sprinkles@1.6.5(@vanilla-extract/css@1.20.1(babel-plugin-macros@3.1.0))': + dependencies: + '@vanilla-extract/css': 1.20.1(babel-plugin-macros@3.1.0) + '@vercel/speed-insights@2.0.0(next@16.3.5(@babel/core@8.0.5)(@types/node@24.13.4)(babel-plugin-macros@3.1.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(react@19.3.0)(svelte@3.55.0)': optionalDependencies: next: 16.3.5(@babel/core@8.0.5)(@types/node@24.13.4)(babel-plugin-macros@3.1.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) @@ -15072,25 +17269,583 @@ snapshots: loupe: 3.2.1 tinyrainbow: 2.0.0 - '@walletconnect/core@2.17.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)': + '@wagmi/connectors@6.2.0(@tanstack/react-query@5.104.0(react@19.3.0))(@types/react@19.3.0)(@wagmi/core@2.22.1(@tanstack/query-core@5.104.0)(@types/react@19.3.0)(immer@11.1.18)(react@19.3.0)(typescript@6.0.3)(use-sync-external-store@1.4.0(react@19.3.0))(viem@2.57.2(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76)))(bufferutil@4.0.9)(debug@4.4.3(supports-color@4.4.0))(encoding@0.1.13)(immer@11.1.18)(react@19.3.0)(supports-color@4.4.0)(typescript@6.0.3)(use-sync-external-store@1.4.0(react@19.3.0))(utf-8-validate@5.0.10)(viem@2.57.2(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76))(wagmi@2.19.5(@tanstack/query-core@5.104.0)(@tanstack/react-query@5.104.0(react@19.3.0))(@types/react@19.3.0)(bufferutil@4.0.9)(debug@4.4.3(supports-color@4.4.0))(encoding@0.1.13)(immer@11.1.18)(react@19.3.0)(supports-color@4.4.0)(typescript@6.0.3)(utf-8-validate@5.0.10)(viem@2.57.2(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76))(zod@3.25.76)': 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(bufferutil@4.0.9)(utf-8-validate@5.0.10) - '@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 + '@base-org/account': 2.4.0(@types/react@19.3.0)(bufferutil@4.0.9)(debug@4.4.3(supports-color@4.4.0))(immer@11.1.18)(react@19.3.0)(supports-color@4.4.0)(typescript@6.0.3)(use-sync-external-store@1.4.0(react@19.3.0))(utf-8-validate@5.0.10)(zod@3.25.76) + '@coinbase/wallet-sdk': 4.3.6(@types/react@19.3.0)(bufferutil@4.0.9)(immer@11.1.18)(react@19.3.0)(typescript@6.0.3)(use-sync-external-store@1.4.0(react@19.3.0))(utf-8-validate@5.0.10)(zod@3.25.76) + '@gemini-wallet/core': 0.3.2(supports-color@4.4.0)(viem@2.57.2(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76)) + '@metamask/sdk': 0.33.1(bufferutil@4.0.9)(encoding@0.1.13)(supports-color@4.4.0)(utf-8-validate@5.0.10) + '@safe-global/safe-apps-provider': 0.18.6(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@safe-global/safe-apps-sdk': 9.1.0(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@wagmi/core': 2.22.1(@tanstack/query-core@5.104.0)(@types/react@19.3.0)(immer@11.1.18)(react@19.3.0)(typescript@6.0.3)(use-sync-external-store@1.4.0(react@19.3.0))(viem@2.57.2(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76)) + '@walletconnect/ethereum-provider': 2.21.1(@types/react@19.3.0)(bufferutil@4.0.9)(encoding@0.1.13)(react@19.3.0)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76) + cbw-sdk: '@coinbase/wallet-sdk@3.9.3(supports-color@4.4.0)' + porto: 0.2.35(@tanstack/react-query@5.104.0(react@19.3.0))(@types/react@19.3.0)(@wagmi/core@2.22.1(@tanstack/query-core@5.104.0)(@types/react@19.3.0)(immer@11.1.18)(react@19.3.0)(typescript@6.0.3)(use-sync-external-store@1.4.0(react@19.3.0))(viem@2.57.2(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76)))(immer@11.1.18)(react@19.3.0)(typescript@6.0.3)(use-sync-external-store@1.4.0(react@19.3.0))(viem@2.57.2(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76))(wagmi@2.19.5(@tanstack/query-core@5.104.0)(@tanstack/react-query@5.104.0(react@19.3.0))(@types/react@19.3.0)(bufferutil@4.0.9)(debug@4.4.3(supports-color@4.4.0))(encoding@0.1.13)(immer@11.1.18)(react@19.3.0)(supports-color@4.4.0)(typescript@6.0.3)(utf-8-validate@5.0.10)(viem@2.57.2(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76)) + viem: 2.57.2(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76) + optionalDependencies: + typescript: 6.0.3 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@tanstack/react-query' + - '@types/react' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/kv' + - '@x402/core' + - '@x402/evm' + - '@x402/extensions' + - '@x402/svm' + - aws4fetch + - bufferutil + - db0 + - debug + - encoding + - expo-auth-session + - expo-crypto + - expo-web-browser + - fastestsmallesttextencoderdecoder + - immer + - ioredis + - react + - react-native + - supports-color + - uploadthing + - use-sync-external-store + - utf-8-validate + - wagmi + - zod + + '@wagmi/core@2.22.1(@tanstack/query-core@5.104.0)(@types/react@19.3.0)(immer@11.1.18)(react@19.3.0)(typescript@6.0.3)(use-sync-external-store@1.4.0(react@19.3.0))(viem@2.57.2(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76))': + dependencies: + eventemitter3: 5.0.1 + mipd: 0.0.7(typescript@6.0.3) + viem: 2.57.2(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76) + zustand: 5.0.0(@types/react@19.3.0)(immer@11.1.18)(react@19.3.0)(use-sync-external-store@1.4.0(react@19.3.0)) + optionalDependencies: + '@tanstack/query-core': 5.104.0 + typescript: 6.0.3 + transitivePeerDependencies: + - '@types/react' + - immer + - react + - use-sync-external-store + + '@walletconnect/core@2.17.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)': + 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(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@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 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - ioredis + - uploadthing + - utf-8-validate + + '@walletconnect/core@2.21.0(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + 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(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@walletconnect/keyvaluestorage': 1.1.1 + '@walletconnect/logger': 2.1.2 + '@walletconnect/relay-api': 1.0.11 + '@walletconnect/relay-auth': 1.1.0 + '@walletconnect/safe-json': 1.0.2 + '@walletconnect/time': 1.0.2 + '@walletconnect/types': 2.21.0 + '@walletconnect/utils': 2.21.0(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/window-getters': 1.0.1 + es-toolkit: 1.33.0 + events: 3.3.0 + uint8arrays: 3.1.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - ioredis + - typescript + - uploadthing + - utf-8-validate + - zod + + '@walletconnect/core@2.21.1(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + 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(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@walletconnect/keyvaluestorage': 1.1.1 + '@walletconnect/logger': 2.1.2 + '@walletconnect/relay-api': 1.0.11 + '@walletconnect/relay-auth': 1.1.0 + '@walletconnect/safe-json': 1.0.2 + '@walletconnect/time': 1.0.2 + '@walletconnect/types': 2.21.1 + '@walletconnect/utils': 2.21.1(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/window-getters': 1.0.1 + es-toolkit: 1.33.0 + events: 3.3.0 + uint8arrays: 3.1.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - ioredis + - typescript + - uploadthing + - utf-8-validate + - zod + + '@walletconnect/environment@1.0.1': + dependencies: + tslib: 1.14.1 + + '@walletconnect/ethereum-provider@2.17.3(@types/react@19.3.0)(bufferutil@4.0.9)(encoding@0.1.13)(react@19.3.0)(utf-8-validate@5.0.10)': + dependencies: + '@walletconnect/jsonrpc-http-connection': 1.0.8(encoding@0.1.13) + '@walletconnect/jsonrpc-provider': 1.0.14 + '@walletconnect/jsonrpc-types': 1.0.4 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/keyvaluestorage': 1.1.1 + '@walletconnect/modal': 2.7.0(@types/react@19.3.0)(react@19.3.0) + '@walletconnect/sign-client': 2.17.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@walletconnect/types': 2.17.3 + '@walletconnect/universal-provider': 2.17.3(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10) + '@walletconnect/utils': 2.17.3 + events: 3.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@types/react' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - encoding + - ioredis + - react + - uploadthing + - utf-8-validate + + '@walletconnect/ethereum-provider@2.21.1(@types/react@19.3.0)(bufferutil@4.0.9)(encoding@0.1.13)(react@19.3.0)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + '@reown/appkit': 1.7.8(@types/react@19.3.0)(bufferutil@4.0.9)(encoding@0.1.13)(react@19.3.0)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/jsonrpc-http-connection': 1.0.8(encoding@0.1.13) + '@walletconnect/jsonrpc-provider': 1.0.14 + '@walletconnect/jsonrpc-types': 1.0.4 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/keyvaluestorage': 1.1.1 + '@walletconnect/sign-client': 2.21.1(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/types': 2.21.1 + '@walletconnect/universal-provider': 2.21.1(bufferutil@4.0.9)(encoding@0.1.13)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/utils': 2.21.1(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76) + events: 3.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@types/react' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - encoding + - ioredis + - react + - typescript + - uploadthing + - utf-8-validate + - zod + + '@walletconnect/events@1.0.1': + dependencies: + keyvaluestorage-interface: 1.0.0 + tslib: 1.14.1 + + '@walletconnect/heartbeat@1.2.2': + dependencies: + '@walletconnect/events': 1.0.1 + '@walletconnect/time': 1.0.2 + events: 3.3.0 + + '@walletconnect/jsonrpc-http-connection@1.0.8(encoding@0.1.13)': + dependencies: + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/safe-json': 1.0.2 + cross-fetch: 3.1.5(encoding@0.1.13) + events: 3.3.0 + transitivePeerDependencies: + - encoding + + '@walletconnect/jsonrpc-provider@1.0.14': + dependencies: + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/safe-json': 1.0.2 + events: 3.3.0 + + '@walletconnect/jsonrpc-types@1.0.4': + dependencies: + events: 3.3.0 + keyvaluestorage-interface: 1.0.0 + + '@walletconnect/jsonrpc-utils@1.0.8': + dependencies: + '@walletconnect/environment': 1.0.1 + '@walletconnect/jsonrpc-types': 1.0.4 + tslib: 1.14.1 + + '@walletconnect/jsonrpc-ws-connection@1.0.16(bufferutil@4.0.9)(utf-8-validate@5.0.10)': + dependencies: + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/safe-json': 1.0.2 + events: 3.3.0 + ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + '@walletconnect/keyvaluestorage@1.1.1': + dependencies: + '@walletconnect/safe-json': 1.0.2 + idb-keyval: 6.2.1 + unstorage: 1.14.4(idb-keyval@6.2.1) + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/kv' + - aws4fetch + - db0 + - ioredis + - uploadthing + + '@walletconnect/logger@2.1.2': + dependencies: + '@walletconnect/safe-json': 1.0.2 + pino: 7.11.0 + + '@walletconnect/modal-core@2.7.0(@types/react@19.3.0)(react@19.3.0)': + dependencies: + valtio: 1.11.2(@types/react@19.3.0)(react@19.3.0) + transitivePeerDependencies: + - '@types/react' + - react + + '@walletconnect/modal-ui@2.7.0(@types/react@19.3.0)(react@19.3.0)': + dependencies: + '@walletconnect/modal-core': 2.7.0(@types/react@19.3.0)(react@19.3.0) + lit: 2.8.0 + motion: 10.16.2 + qrcode: 1.5.3 + transitivePeerDependencies: + - '@types/react' + - react + + '@walletconnect/modal@2.7.0(@types/react@19.3.0)(react@19.3.0)': + dependencies: + '@walletconnect/modal-core': 2.7.0(@types/react@19.3.0)(react@19.3.0) + '@walletconnect/modal-ui': 2.7.0(@types/react@19.3.0)(react@19.3.0) + transitivePeerDependencies: + - '@types/react' + - react + + '@walletconnect/relay-api@1.0.11': + dependencies: + '@walletconnect/jsonrpc-types': 1.0.4 + + '@walletconnect/relay-auth@1.0.4': + dependencies: + '@stablelib/ed25519': 1.0.3 + '@stablelib/random': 1.0.2 + '@walletconnect/safe-json': 1.0.2 + '@walletconnect/time': 1.0.2 + tslib: 1.14.1 + uint8arrays: 3.1.1 + + '@walletconnect/relay-auth@1.1.0': + dependencies: + '@noble/curves': 1.8.0 + '@noble/hashes': 1.7.0 + '@walletconnect/safe-json': 1.0.2 + '@walletconnect/time': 1.0.2 + uint8arrays: 3.1.1 + + '@walletconnect/safe-json@1.0.2': + dependencies: + tslib: 1.14.1 + + '@walletconnect/sign-client@2.17.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)': + dependencies: + '@walletconnect/core': 2.17.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@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 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - ioredis + - uploadthing + - utf-8-validate + + '@walletconnect/sign-client@2.21.0(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + '@walletconnect/core': 2.21.0(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@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.21.0 + '@walletconnect/utils': 2.21.0(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76) + events: 3.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - ioredis + - typescript + - uploadthing + - utf-8-validate + - zod + + '@walletconnect/sign-client@2.21.1(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + '@walletconnect/core': 2.21.1(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@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.21.1 + '@walletconnect/utils': 2.21.1(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76) + events: 3.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - ioredis + - typescript + - uploadthing + - utf-8-validate + - zod + + '@walletconnect/time@1.0.2': + dependencies: + tslib: 1.14.1 + + '@walletconnect/types@2.17.3': + 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 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/kv' + - aws4fetch + - db0 + - ioredis + - uploadthing + + '@walletconnect/types@2.21.0': + 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 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/kv' + - aws4fetch + - db0 + - ioredis + - uploadthing + + '@walletconnect/types@2.21.1': + 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 - lodash.isequal: 4.5.0 - uint8arrays: 3.1.0 transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -15107,29 +17862,24 @@ snapshots: - '@vercel/blob' - '@vercel/kv' - aws4fetch - - bufferutil - db0 - ioredis - uploadthing - - utf-8-validate - - '@walletconnect/environment@1.0.1': - dependencies: - tslib: 1.14.1 - '@walletconnect/ethereum-provider@2.17.3(@types/react@19.3.0)(bufferutil@4.0.9)(encoding@0.1.13)(react@19.3.0)(utf-8-validate@5.0.10)': + '@walletconnect/universal-provider@2.17.3(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10)': dependencies: + '@walletconnect/events': 1.0.1 '@walletconnect/jsonrpc-http-connection': 1.0.8(encoding@0.1.13) '@walletconnect/jsonrpc-provider': 1.0.14 '@walletconnect/jsonrpc-types': 1.0.4 '@walletconnect/jsonrpc-utils': 1.0.8 '@walletconnect/keyvaluestorage': 1.1.1 - '@walletconnect/modal': 2.7.0(@types/react@19.3.0)(react@19.3.0) + '@walletconnect/logger': 2.1.2 '@walletconnect/sign-client': 2.17.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) '@walletconnect/types': 2.17.3 - '@walletconnect/universal-provider': 2.17.3(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10) '@walletconnect/utils': 2.17.3 events: 3.3.0 + lodash: 4.17.21 transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -15142,7 +17892,6 @@ snapshots: - '@netlify/blobs' - '@planetscale/database' - '@react-native-async-storage/async-storage' - - '@types/react' - '@upstash/redis' - '@vercel/blob' - '@vercel/kv' @@ -15151,62 +17900,23 @@ snapshots: - db0 - encoding - ioredis - - react - uploadthing - utf-8-validate - '@walletconnect/events@1.0.1': - dependencies: - keyvaluestorage-interface: 1.0.0 - tslib: 1.14.1 - - '@walletconnect/heartbeat@1.2.2': + '@walletconnect/universal-provider@2.21.0(bufferutil@4.0.9)(encoding@0.1.13)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: '@walletconnect/events': 1.0.1 - '@walletconnect/time': 1.0.2 - events: 3.3.0 - - '@walletconnect/jsonrpc-http-connection@1.0.8(encoding@0.1.13)': - dependencies: - '@walletconnect/jsonrpc-utils': 1.0.8 - '@walletconnect/safe-json': 1.0.2 - cross-fetch: 3.1.5(encoding@0.1.13) - events: 3.3.0 - transitivePeerDependencies: - - encoding - - '@walletconnect/jsonrpc-provider@1.0.14': - dependencies: - '@walletconnect/jsonrpc-utils': 1.0.8 - '@walletconnect/safe-json': 1.0.2 - events: 3.3.0 - - '@walletconnect/jsonrpc-types@1.0.4': - dependencies: - events: 3.3.0 - keyvaluestorage-interface: 1.0.0 - - '@walletconnect/jsonrpc-utils@1.0.8': - dependencies: - '@walletconnect/environment': 1.0.1 + '@walletconnect/jsonrpc-http-connection': 1.0.8(encoding@0.1.13) + '@walletconnect/jsonrpc-provider': 1.0.14 '@walletconnect/jsonrpc-types': 1.0.4 - tslib: 1.14.1 - - '@walletconnect/jsonrpc-ws-connection@1.0.16(bufferutil@4.0.9)(utf-8-validate@5.0.10)': - dependencies: '@walletconnect/jsonrpc-utils': 1.0.8 - '@walletconnect/safe-json': 1.0.2 + '@walletconnect/keyvaluestorage': 1.1.1 + '@walletconnect/logger': 2.1.2 + '@walletconnect/sign-client': 2.21.0(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/types': 2.21.0 + '@walletconnect/utils': 2.21.0(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76) + es-toolkit: 1.33.0 events: 3.3.0 - ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10) - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - '@walletconnect/keyvaluestorage@1.1.1': - dependencies: - '@walletconnect/safe-json': 1.0.2 - idb-keyval: 6.2.1 - unstorage: 1.14.4(idb-keyval@6.2.1) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -15218,71 +17928,33 @@ snapshots: - '@deno/kv' - '@netlify/blobs' - '@planetscale/database' + - '@react-native-async-storage/async-storage' - '@upstash/redis' - '@vercel/blob' - '@vercel/kv' - aws4fetch + - bufferutil - db0 + - encoding - ioredis + - typescript - uploadthing + - utf-8-validate + - zod - '@walletconnect/logger@2.1.2': - dependencies: - '@walletconnect/safe-json': 1.0.2 - pino: 7.11.0 - - '@walletconnect/modal-core@2.7.0(@types/react@19.3.0)(react@19.3.0)': - dependencies: - valtio: 1.11.2(@types/react@19.3.0)(react@19.3.0) - transitivePeerDependencies: - - '@types/react' - - react - - '@walletconnect/modal-ui@2.7.0(@types/react@19.3.0)(react@19.3.0)': - dependencies: - '@walletconnect/modal-core': 2.7.0(@types/react@19.3.0)(react@19.3.0) - lit: 2.8.0 - motion: 10.16.2 - qrcode: 1.5.3 - transitivePeerDependencies: - - '@types/react' - - react - - '@walletconnect/modal@2.7.0(@types/react@19.3.0)(react@19.3.0)': - dependencies: - '@walletconnect/modal-core': 2.7.0(@types/react@19.3.0)(react@19.3.0) - '@walletconnect/modal-ui': 2.7.0(@types/react@19.3.0)(react@19.3.0) - transitivePeerDependencies: - - '@types/react' - - react - - '@walletconnect/relay-api@1.0.11': - dependencies: - '@walletconnect/jsonrpc-types': 1.0.4 - - '@walletconnect/relay-auth@1.0.4': - dependencies: - '@stablelib/ed25519': 1.0.3 - '@stablelib/random': 1.0.2 - '@walletconnect/safe-json': 1.0.2 - '@walletconnect/time': 1.0.2 - tslib: 1.14.1 - uint8arrays: 3.1.1 - - '@walletconnect/safe-json@1.0.2': - dependencies: - tslib: 1.14.1 - - '@walletconnect/sign-client@2.17.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)': + '@walletconnect/universal-provider@2.21.1(bufferutil@4.0.9)(encoding@0.1.13)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: - '@walletconnect/core': 2.17.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) '@walletconnect/events': 1.0.1 - '@walletconnect/heartbeat': 1.2.2 + '@walletconnect/jsonrpc-http-connection': 1.0.8(encoding@0.1.13) + '@walletconnect/jsonrpc-provider': 1.0.14 + '@walletconnect/jsonrpc-types': 1.0.4 '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/keyvaluestorage': 1.1.1 '@walletconnect/logger': 2.1.2 - '@walletconnect/time': 1.0.2 - '@walletconnect/types': 2.17.3 - '@walletconnect/utils': 2.17.3 + '@walletconnect/sign-client': 2.21.1(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/types': 2.21.1 + '@walletconnect/utils': 2.21.1(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76) + es-toolkit: 1.33.0 events: 3.3.0 transitivePeerDependencies: - '@azure/app-configuration' @@ -15302,22 +17974,35 @@ snapshots: - aws4fetch - bufferutil - db0 + - encoding - ioredis + - typescript - uploadthing - utf-8-validate + - zod - '@walletconnect/time@1.0.2': - dependencies: - tslib: 1.14.1 - - '@walletconnect/types@2.17.3': + '@walletconnect/utils@2.17.3': dependencies: - '@walletconnect/events': 1.0.1 - '@walletconnect/heartbeat': 1.2.2 - '@walletconnect/jsonrpc-types': 1.0.4 + '@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/logger': 2.1.2 - events: 3.3.0 + '@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 transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -15338,20 +18023,25 @@ snapshots: - ioredis - uploadthing - '@walletconnect/universal-provider@2.17.3(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10)': + '@walletconnect/utils@2.21.0(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: - '@walletconnect/events': 1.0.1 - '@walletconnect/jsonrpc-http-connection': 1.0.8(encoding@0.1.13) - '@walletconnect/jsonrpc-provider': 1.0.14 - '@walletconnect/jsonrpc-types': 1.0.4 + '@noble/ciphers': 1.2.1 + '@noble/curves': 1.8.1 + '@noble/hashes': 1.7.1 '@walletconnect/jsonrpc-utils': 1.0.8 '@walletconnect/keyvaluestorage': 1.1.1 - '@walletconnect/logger': 2.1.2 - '@walletconnect/sign-client': 2.17.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) - '@walletconnect/types': 2.17.3 - '@walletconnect/utils': 2.17.3 - events: 3.3.0 - lodash: 4.17.21 + '@walletconnect/relay-api': 1.0.11 + '@walletconnect/relay-auth': 1.1.0 + '@walletconnect/safe-json': 1.0.2 + '@walletconnect/time': 1.0.2 + '@walletconnect/types': 2.21.0 + '@walletconnect/window-getters': 1.0.1 + '@walletconnect/window-metadata': 1.0.1 + bs58: 6.0.0 + detect-browser: 5.3.0 + query-string: 7.1.3 + uint8arrays: 3.1.0 + viem: 2.23.2(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -15370,33 +18060,31 @@ snapshots: - aws4fetch - bufferutil - db0 - - encoding - ioredis + - typescript - uploadthing - utf-8-validate + - zod - '@walletconnect/utils@2.17.3': + '@walletconnect/utils@2.21.1(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76)': 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 + '@noble/ciphers': 1.2.1 + '@noble/curves': 1.8.1 + '@noble/hashes': 1.7.1 '@walletconnect/jsonrpc-utils': 1.0.8 '@walletconnect/keyvaluestorage': 1.1.1 '@walletconnect/relay-api': 1.0.11 - '@walletconnect/relay-auth': 1.0.4 + '@walletconnect/relay-auth': 1.1.0 '@walletconnect/safe-json': 1.0.2 '@walletconnect/time': 1.0.2 - '@walletconnect/types': 2.17.3 + '@walletconnect/types': 2.21.1 '@walletconnect/window-getters': 1.0.1 '@walletconnect/window-metadata': 1.0.1 + bs58: 6.0.0 detect-browser: 5.3.0 - elliptic: 6.6.1 query-string: 7.1.3 uint8arrays: 3.1.0 + viem: 2.23.2(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -15413,9 +18101,13 @@ snapshots: - '@vercel/blob' - '@vercel/kv' - aws4fetch + - bufferutil - db0 - ioredis + - typescript - uploadthing + - utf-8-validate + - zod '@walletconnect/window-getters@1.0.1': dependencies: @@ -16155,7 +18847,7 @@ snapshots: typescript: 6.0.3 zod: 3.25.76 - abitype@1.0.7(typescript@6.0.3)(zod@3.25.76): + abitype@1.0.6(typescript@6.0.3)(zod@3.25.76): optionalDependencies: typescript: 6.0.3 zod: 3.25.76 @@ -16165,6 +18857,21 @@ snapshots: typescript: 6.0.3 zod: 3.25.76 + abitype@1.2.3(typescript@6.0.3)(zod@3.22.4): + optionalDependencies: + typescript: 6.0.3 + zod: 3.22.4 + + abitype@1.2.3(typescript@6.0.3)(zod@3.25.76): + optionalDependencies: + typescript: 6.0.3 + zod: 3.25.76 + + abitype@1.3.0(typescript@6.0.3)(zod@4.6.5): + optionalDependencies: + typescript: 6.0.3 + zod: 4.6.5 + abortcontroller-polyfill@1.7.8: {} abstract-leveldown@2.6.3: @@ -16387,7 +19094,7 @@ snapshots: asn1.js@5.4.1: dependencies: - bn.js: 4.12.1 + bn.js: 4.12.3 inherits: 2.0.4 minimalistic-assert: 1.0.1 safer-buffer: 2.1.2 @@ -16417,6 +19124,10 @@ snapshots: async-limiter@1.0.1: {} + async-mutex@0.2.6: + dependencies: + tslib: 2.8.1 + async@1.5.2: {} async@2.6.2: @@ -16443,6 +19154,21 @@ snapshots: aws4@1.11.0: {} + axios-retry@4.5.0(axios@1.20.0(debug@4.4.3(supports-color@4.4.0))(supports-color@4.4.0)): + dependencies: + axios: 1.20.0(debug@4.4.3(supports-color@4.4.0))(supports-color@4.4.0) + is-retry-allowed: 2.2.0 + + axios@1.20.0(debug@4.4.3(supports-color@4.4.0))(supports-color@4.4.0): + dependencies: + follow-redirects: 1.16.1(debug@4.4.3(supports-color@4.4.0)) + form-data: 4.0.4 + https-proxy-agent: 5.0.1(supports-color@4.4.0) + proxy-from-env: 2.1.0 + transitivePeerDependencies: + - debug + - supports-color + babel-code-frame@6.26.0: dependencies: chalk: 1.1.3 @@ -16960,6 +19686,8 @@ snapshots: dependencies: safe-buffer: 5.2.1 + base-x@5.0.1: {} + base64-js@1.5.1: {} base@0.11.2: @@ -17165,6 +19893,10 @@ snapshots: dependencies: base-x: 3.0.11 + bs58@6.0.0: + dependencies: + base-x: 5.0.1 + bs58check@2.1.2: dependencies: bs58: 4.0.1 @@ -17342,6 +20074,8 @@ snapshots: ansi-styles: 4.3.0 supports-color: 7.2.0 + chalk@5.6.2: {} + change-case@3.0.2: dependencies: camel-case: 3.0.0 @@ -17365,6 +20099,8 @@ snapshots: char-regex@1.0.2: {} + charenc@0.0.2: {} + chart.js@4.5.1: dependencies: '@kurkle/color': 0.3.4 @@ -17570,6 +20306,8 @@ snapshots: find-replace: 1.0.3 typical: 2.6.1 + commander@14.0.2: {} + commander@14.0.3: {} commander@2.11.0: {} @@ -17656,7 +20394,7 @@ snapshots: create-ecdh@4.0.4: dependencies: - bn.js: 4.12.1 + bn.js: 4.12.3 elliptic: 6.6.1 optional: true @@ -17726,6 +20464,8 @@ snapshots: dependencies: uncrypto: 0.1.3 + crypt@0.0.2: {} + crypto-addr-codec@0.1.8: dependencies: base-x: 3.0.11 @@ -17774,6 +20514,14 @@ snapshots: csstype@3.2.3: {} + cuer@0.0.3(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(typescript@6.0.3): + dependencies: + qr: 0.5.5 + react: 19.3.0 + react-dom: 19.3.0(react@19.3.0) + optionalDependencies: + typescript: 6.0.3 + d3-array@3.2.4: dependencies: internmap: 2.0.3 @@ -17844,8 +20592,14 @@ snapshots: es-errors: 1.3.0 is-data-view: 1.0.2 + date-fns@2.30.0: + dependencies: + '@babel/runtime': 7.29.2 + date-fns@4.4.0: {} + dayjs@1.11.13: {} + debug@2.6.9(supports-color@4.4.0): dependencies: ms: 2.0.0 @@ -17870,6 +20624,12 @@ snapshots: optionalDependencies: supports-color: 4.4.0 + debug@4.3.4(supports-color@4.4.0): + dependencies: + ms: 2.1.2 + optionalDependencies: + supports-color: 4.4.0 + debug@4.4.3(supports-color@4.4.0): dependencies: ms: 2.1.3 @@ -17921,6 +20681,8 @@ snapshots: deep-is@0.1.4: {} + deep-object-diff@1.1.9: {} + deepmerge@4.3.1: {} default-browser-id@5.0.1: {} @@ -17981,6 +20743,10 @@ snapshots: dequal@2.0.3: {} + derive-valtio@0.1.0(valtio@1.13.2(@types/react@19.3.0)(react@19.3.0)): + dependencies: + valtio: 1.13.2(@types/react@19.3.0)(react@19.3.0) + des.js@1.0.1: dependencies: inherits: 2.0.4 @@ -17993,6 +20759,8 @@ snapshots: detect-browser@5.3.0: {} + detect-europe-js@0.1.2: {} + detect-indent@4.0.0: dependencies: repeating: 2.0.1 @@ -18005,6 +20773,8 @@ snapshots: detect-newline@3.1.0: {} + detect-node-es@1.1.0: {} + diff@3.3.1: {} diff@3.5.0: {} @@ -18013,7 +20783,7 @@ snapshots: diffie-hellman@5.0.3: dependencies: - bn.js: 4.12.1 + bn.js: 4.12.3 miller-rabin: 4.0.1 randombytes: 2.1.0 optional: true @@ -18113,6 +20883,13 @@ snapshots: jsbn: 0.1.1 safer-buffer: 2.1.2 + eciesjs@0.4.18: + dependencies: + '@ecies/ciphers': 0.2.6(@noble/ciphers@1.3.0) + '@noble/ciphers': 1.3.0 + '@noble/curves': 1.9.7 + '@noble/hashes': 1.8.0 + ee-first@1.1.1: {} electron-to-chromium@1.5.232: {} @@ -18162,6 +20939,20 @@ snapshots: dependencies: once: 1.4.0 + engine.io-client@6.6.7(bufferutil@4.0.9)(supports-color@4.4.0)(utf-8-validate@5.0.10): + dependencies: + '@socket.io/component-emitter': 3.1.2 + debug: 4.4.3(supports-color@4.4.0) + engine.io-parser: 5.2.3 + ws: 8.21.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) + xmlhttprequest-ssl: 2.1.2 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + engine.io-parser@5.2.3: {} + enquirer@2.4.1: dependencies: ansi-colors: 4.1.3 @@ -18288,6 +21079,8 @@ snapshots: is-date-object: 1.1.0 is-symbol: 1.1.1 + es-toolkit@1.33.0: {} + es-toolkit@1.39.10: {} es5-ext@0.10.64: @@ -18665,6 +21458,16 @@ snapshots: transitivePeerDependencies: - supports-color + eth-block-tracker@7.1.0(supports-color@4.4.0): + dependencies: + '@metamask/eth-json-rpc-provider': 1.0.1(supports-color@4.4.0) + '@metamask/safe-event-emitter': 3.1.3 + '@metamask/utils': 5.0.2(supports-color@4.4.0) + json-rpc-random-id: 1.0.1 + pify: 3.0.0 + transitivePeerDependencies: + - supports-color + eth-chains@2.0.0: {} eth-ens-namehash@2.0.8: @@ -18672,6 +21475,14 @@ snapshots: idna-uts46-hx: 2.3.1 js-sha3: 0.5.7 + eth-json-rpc-filters@6.0.1: + dependencies: + '@metamask/safe-event-emitter': 3.1.3 + async-mutex: 0.2.6 + eth-query: 2.1.2 + json-rpc-engine: 6.1.0 + pify: 5.0.0 + eth-json-rpc-infura@3.2.1(encoding@0.1.13)(supports-color@4.4.0): dependencies: cross-fetch: 2.2.6(encoding@0.1.13) @@ -18892,7 +21703,7 @@ snapshots: ethereumjs-util@5.2.1: dependencies: - bn.js: 4.12.1 + bn.js: 4.12.3 create-hash: 1.2.0 elliptic: 6.6.1 ethereum-cryptography: 0.1.3 @@ -18966,7 +21777,7 @@ snapshots: ethers@4.0.49: dependencies: aes-js: 3.0.0 - bn.js: 4.12.1 + bn.js: 4.12.3 elliptic: 6.6.1 hash.js: 1.1.3 js-sha3: 0.5.7 @@ -19026,6 +21837,8 @@ snapshots: d: 1.0.1 es5-ext: 0.10.64 + eventemitter2@6.4.9: {} + eventemitter3@4.0.4: {} eventemitter3@4.0.7: {} @@ -19152,6 +21965,11 @@ snapshots: extend@3.0.2: {} + extension-port-stream@3.0.0: + dependencies: + readable-stream: 3.6.2 + webextension-polyfill: 0.10.0 + extglob@0.3.2: dependencies: is-extglob: 1.0.0 @@ -19328,6 +22146,10 @@ snapshots: optionalDependencies: debug: 4.4.3(supports-color@4.4.0) + follow-redirects@1.16.1(debug@4.4.3(supports-color@4.4.0)): + optionalDependencies: + debug: 4.4.3(supports-color@4.4.0) + for-each@0.3.5: dependencies: is-callable: 1.2.7 @@ -19492,6 +22314,8 @@ snapshots: hasown: 2.0.2 math-intrinsics: 1.1.0 + get-nonce@1.0.1: {} + get-package-type@0.1.0: {} get-proto@1.0.1: @@ -19863,6 +22687,8 @@ snapshots: os-homedir: 1.0.2 os-tmpdir: 1.0.2 + hono@4.13.12: {} + hookified@1.15.1: {} hookified@2.2.0: {} @@ -20223,12 +23049,16 @@ snapshots: has-tostringtag: 1.0.2 hasown: 2.0.2 + is-retry-allowed@2.2.0: {} + is-set@2.0.3: {} is-shared-array-buffer@1.0.4: dependencies: call-bound: 1.0.4 + is-standalone-pwa@0.1.1: {} + is-stream@1.1.0: {} is-stream@2.0.1: {} @@ -20305,6 +23135,10 @@ snapshots: dependencies: ws: 8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + isows@1.0.7(ws@8.21.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)): + dependencies: + ws: 8.21.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + isstream@0.1.2: {} istanbul-lib-coverage@3.2.2: {} @@ -20736,6 +23570,8 @@ snapshots: '@sideway/formula': 3.0.1 '@sideway/pinpoint': 2.0.0 + jose@6.2.12: {} + jotai@3.0.0(@types/react@19.3.0)(react@19.3.0): optionalDependencies: '@types/react': 19.3.0 @@ -20786,7 +23622,7 @@ snapshots: whatwg-encoding: 3.1.1 whatwg-mimetype: 4.0.0 whatwg-url: 14.2.0 - ws: 8.20.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + ws: 8.21.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) xml-name-validator: 5.0.0 transitivePeerDependencies: - bufferutil @@ -20819,6 +23655,11 @@ snapshots: transitivePeerDependencies: - supports-color + json-rpc-engine@6.1.0: + dependencies: + '@metamask/safe-event-emitter': 2.0.0 + eth-rpc-errors: 4.0.3 + json-rpc-error@2.0.0: dependencies: inherits: 2.0.4 @@ -21099,16 +23940,32 @@ snapshots: '@lit/reactive-element': 1.6.2 lit-html: 2.8.0 + lit-element@4.2.2: + dependencies: + '@lit-labs/ssr-dom-shim': 1.6.0 + '@lit/reactive-element': 2.1.2 + lit-html: 3.3.3 + lit-html@2.8.0: dependencies: '@types/trusted-types': 2.0.3 + lit-html@3.3.3: + dependencies: + '@types/trusted-types': 2.0.3 + lit@2.8.0: dependencies: '@lit/reactive-element': 1.6.2 lit-element: 3.3.2 lit-html: 2.8.0 + lit@3.3.0: + dependencies: + '@lit/reactive-element': 2.1.2 + lit-element: 4.2.2 + lit-html: 3.3.3 + load-json-file@1.1.0: dependencies: graceful-fs: 4.2.11 @@ -21239,6 +24096,16 @@ snapshots: inherits: 2.0.4 safe-buffer: 5.2.1 + md5@2.3.0: + dependencies: + charenc: 0.0.2 + crypt: 0.0.2 + is-buffer: 1.1.6 + + media-query-parser@2.0.2: + dependencies: + '@babel/runtime': 7.29.2 + media-typer@0.3.0: {} mem@1.1.0: @@ -21350,7 +24217,7 @@ snapshots: miller-rabin@4.0.1: dependencies: - bn.js: 4.12.1 + bn.js: 4.12.3 brorand: 1.1.0 mime-db@1.52.0: {} @@ -21418,6 +24285,10 @@ snapshots: dependencies: minipass: 2.9.0 + mipd@0.0.7(typescript@6.0.3): + optionalDependencies: + typescript: 6.0.3 + mixin-deep@1.3.2: dependencies: for-in: 1.0.2 @@ -21488,6 +24359,8 @@ snapshots: hasown: 2.0.2 isarray: 2.0.5 + modern-ahocorasick@1.1.0: {} + module-alias@2.2.3: {} moo-color@1.0.3: @@ -21513,6 +24386,8 @@ snapshots: ms@2.0.0: {} + ms@2.1.2: {} + ms@2.1.3: {} multibase@0.6.1: @@ -21736,6 +24611,12 @@ snapshots: oauth-sign@0.9.0: {} + obj-multiplex@1.0.0: + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + readable-stream: 2.3.8 + object-assign@4.1.1: {} object-copy@0.1.0: @@ -21863,6 +24744,12 @@ snapshots: is-docker: 2.2.1 is-wsl: 2.2.0 + openapi-fetch@0.13.8: + dependencies: + openapi-typescript-helpers: 0.0.15 + + openapi-typescript-helpers@0.0.15: {} + optimism@0.18.1: dependencies: '@wry/caches': 1.0.1 @@ -21899,7 +24786,51 @@ snapshots: object-keys: 1.1.1 safe-push-apply: 1.0.0 - ox@0.6.0(typescript@6.0.3)(zod@3.25.76): + ox@0.14.45(typescript@6.0.3)(zod@3.22.4): + dependencies: + '@adraffy/ens-normalize': 1.11.0 + '@noble/ciphers': 1.3.0 + '@noble/curves': 1.9.1 + '@noble/hashes': 1.8.0 + '@scure/bip32': 1.7.0 + '@scure/bip39': 1.6.0 + abitype: 1.2.3(typescript@6.0.3)(zod@3.22.4) + eventemitter3: 5.0.1 + optionalDependencies: + typescript: 6.0.3 + transitivePeerDependencies: + - zod + + ox@0.14.45(typescript@6.0.3)(zod@3.25.76): + dependencies: + '@adraffy/ens-normalize': 1.11.0 + '@noble/ciphers': 1.3.0 + '@noble/curves': 1.9.1 + '@noble/hashes': 1.8.0 + '@scure/bip32': 1.7.0 + '@scure/bip39': 1.6.0 + abitype: 1.2.3(typescript@6.0.3)(zod@3.25.76) + eventemitter3: 5.0.1 + optionalDependencies: + typescript: 6.0.3 + transitivePeerDependencies: + - zod + + ox@0.6.7(typescript@6.0.3)(zod@3.25.76): + dependencies: + '@adraffy/ens-normalize': 1.11.0 + '@noble/curves': 1.8.0 + '@noble/hashes': 1.7.0 + '@scure/bip32': 1.6.1 + '@scure/bip39': 1.5.1 + abitype: 1.0.8(typescript@6.0.3)(zod@3.25.76) + eventemitter3: 5.0.1 + optionalDependencies: + typescript: 6.0.3 + transitivePeerDependencies: + - zod + + ox@0.6.9(typescript@6.0.3)(zod@3.25.76): dependencies: '@adraffy/ens-normalize': 1.11.0 '@noble/curves': 1.8.0 @@ -21913,6 +24844,21 @@ snapshots: transitivePeerDependencies: - zod + ox@0.9.17(typescript@6.0.3)(zod@4.6.5): + dependencies: + '@adraffy/ens-normalize': 1.11.0 + '@noble/ciphers': 1.3.0 + '@noble/curves': 1.9.1 + '@noble/hashes': 1.8.0 + '@scure/bip32': 1.7.0 + '@scure/bip39': 1.6.0 + abitype: 1.3.0(typescript@6.0.3)(zod@4.6.5) + eventemitter3: 5.0.1 + optionalDependencies: + typescript: 6.0.3 + transitivePeerDependencies: + - zod + oxc-parser@0.127.0: dependencies: '@oxc-project/types': 0.127.0 @@ -22177,6 +25123,10 @@ snapshots: pify@2.3.0: {} + pify@3.0.0: {} + + pify@5.0.0: {} + pinkie-promise@2.0.1: dependencies: pinkie: 2.0.4 @@ -22212,6 +25162,28 @@ snapshots: pngjs@5.0.0: {} + pony-cause@2.1.11: {} + + porto@0.2.35(@tanstack/react-query@5.104.0(react@19.3.0))(@types/react@19.3.0)(@wagmi/core@2.22.1(@tanstack/query-core@5.104.0)(@types/react@19.3.0)(immer@11.1.18)(react@19.3.0)(typescript@6.0.3)(use-sync-external-store@1.4.0(react@19.3.0))(viem@2.57.2(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76)))(immer@11.1.18)(react@19.3.0)(typescript@6.0.3)(use-sync-external-store@1.4.0(react@19.3.0))(viem@2.57.2(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76))(wagmi@2.19.5(@tanstack/query-core@5.104.0)(@tanstack/react-query@5.104.0(react@19.3.0))(@types/react@19.3.0)(bufferutil@4.0.9)(debug@4.4.3(supports-color@4.4.0))(encoding@0.1.13)(immer@11.1.18)(react@19.3.0)(supports-color@4.4.0)(typescript@6.0.3)(utf-8-validate@5.0.10)(viem@2.57.2(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76)): + dependencies: + '@wagmi/core': 2.22.1(@tanstack/query-core@5.104.0)(@types/react@19.3.0)(immer@11.1.18)(react@19.3.0)(typescript@6.0.3)(use-sync-external-store@1.4.0(react@19.3.0))(viem@2.57.2(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76)) + hono: 4.13.12 + idb-keyval: 6.2.1 + mipd: 0.0.7(typescript@6.0.3) + ox: 0.9.17(typescript@6.0.3)(zod@4.6.5) + viem: 2.57.2(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76) + zod: 4.6.5 + zustand: 5.0.15(@types/react@19.3.0)(immer@11.1.18)(react@19.3.0)(use-sync-external-store@1.4.0(react@19.3.0)) + optionalDependencies: + '@tanstack/react-query': 5.104.0(react@19.3.0) + react: 19.3.0 + typescript: 6.0.3 + wagmi: 2.19.5(@tanstack/query-core@5.104.0)(@tanstack/react-query@5.104.0(react@19.3.0))(@types/react@19.3.0)(bufferutil@4.0.9)(debug@4.4.3(supports-color@4.4.0))(encoding@0.1.13)(immer@11.1.18)(react@19.3.0)(supports-color@4.4.0)(typescript@6.0.3)(utf-8-validate@5.0.10)(viem@2.57.2(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76) + transitivePeerDependencies: + - '@types/react' + - immer + - use-sync-external-store + posix-character-classes@0.1.1: {} possible-typed-array-names@1.0.0: {} @@ -22230,6 +25202,8 @@ snapshots: postinstall-postinstall@2.1.0: {} + preact@10.24.2: {} + preact@10.27.2: {} precond@0.2.3: {} @@ -22306,8 +25280,12 @@ snapshots: proxy-compare@2.5.1: {} + proxy-compare@2.6.0: {} + proxy-compare@3.0.1: {} + proxy-from-env@2.1.0: {} + proxy-memoize@3.0.1: dependencies: proxy-compare: 3.0.1 @@ -22320,7 +25298,7 @@ snapshots: public-encrypt@4.0.3: dependencies: - bn.js: 4.12.1 + bn.js: 4.12.3 browserify-rsa: 4.1.0 create-hash: 1.2.0 parse-asn1: 5.1.6 @@ -22374,6 +25352,8 @@ snapshots: dependencies: hookified: 2.2.0 + qr@0.5.5: {} + qrcode-terminal@0.12.0: {} qrcode@1.5.3: @@ -22503,6 +25483,33 @@ snapshots: '@types/react': 19.3.0 redux: 5.0.1 + react-remove-scroll-bar@2.3.8(@types/react@19.3.0)(react@19.3.0): + dependencies: + react: 19.3.0 + react-style-singleton: 2.2.3(@types/react@19.3.0)(react@19.3.0) + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.3.0 + + react-remove-scroll@2.7.2(@types/react@19.3.0)(react@19.3.0): + dependencies: + react: 19.3.0 + react-remove-scroll-bar: 2.3.8(@types/react@19.3.0)(react@19.3.0) + react-style-singleton: 2.2.3(@types/react@19.3.0)(react@19.3.0) + tslib: 2.8.1 + use-callback-ref: 1.3.3(@types/react@19.3.0)(react@19.3.0) + use-sidecar: 1.1.3(@types/react@19.3.0)(react@19.3.0) + optionalDependencies: + '@types/react': 19.3.0 + + react-style-singleton@2.2.3(@types/react@19.3.0)(react@19.3.0): + dependencies: + get-nonce: 1.0.1 + react: 19.3.0 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.3.0 + react@19.3.0: {} read-package-json-fast@6.0.0: @@ -23128,6 +26135,24 @@ snapshots: transitivePeerDependencies: - supports-color + socket.io-client@4.8.4(bufferutil@4.0.9)(supports-color@4.4.0)(utf-8-validate@5.0.10): + dependencies: + '@socket.io/component-emitter': 3.1.2 + debug: 4.4.3(supports-color@4.4.0) + engine.io-client: 6.6.7(bufferutil@4.0.9)(supports-color@4.4.0)(utf-8-validate@5.0.10) + socket.io-parser: 4.2.7(supports-color@4.4.0) + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + socket.io-parser@4.2.7(supports-color@4.4.0): + dependencies: + '@socket.io/component-emitter': 3.1.2 + debug: 4.4.3(supports-color@4.4.0) + transitivePeerDependencies: + - supports-color + sol-digger@0.0.2: {} sol-explore@1.6.1: {} @@ -23463,6 +26488,8 @@ snapshots: stylis@4.2.0: {} + superstruct@1.0.4: {} + supports-color@2.0.0: {} supports-color@4.4.0: @@ -23838,6 +26865,14 @@ snapshots: typical@2.6.1: {} + ua-is-frozen@0.1.2: {} + + ua-parser-js@2.0.10: + dependencies: + detect-europe-js: 0.1.2 + is-standalone-pwa: 0.1.1 + ua-is-frozen: 0.1.2 + ufo@1.5.4: {} uint8arrays@3.1.0: @@ -23866,6 +26901,8 @@ snapshots: undici-types@7.18.2: {} + undici-types@7.30.0: {} + undici@5.28.5: dependencies: '@fastify/busboy': 2.1.1 @@ -23976,6 +27013,21 @@ snapshots: punycode: 1.3.2 querystring: 0.2.0 + use-callback-ref@1.3.3(@types/react@19.3.0)(react@19.3.0): + dependencies: + react: 19.3.0 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.3.0 + + use-sidecar@1.1.3(@types/react@19.3.0)(react@19.3.0): + dependencies: + detect-node-es: 1.1.0 + react: 19.3.0 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.3.0 + use-sync-external-store@1.0.0(react@19.3.0): dependencies: react: 19.3.0 @@ -23984,6 +27036,10 @@ snapshots: dependencies: react: 19.3.0 + use-sync-external-store@1.4.0(react@19.3.0): + dependencies: + react: 19.3.0 + use-sync-external-store@1.6.0(react@19.3.0): dependencies: react: 19.3.0 @@ -24053,6 +27109,15 @@ snapshots: '@types/react': 19.3.0 react: 19.3.0 + valtio@1.13.2(@types/react@19.3.0)(react@19.3.0): + dependencies: + derive-valtio: 0.1.0(valtio@1.13.2(@types/react@19.3.0)(react@19.3.0)) + proxy-compare: 2.6.0 + use-sync-external-store: 1.2.0(react@19.3.0) + optionalDependencies: + '@types/react': 19.3.0 + react: 19.3.0 + varint@5.0.2: {} vary@1.1.2: {} @@ -24099,16 +27164,15 @@ snapshots: - utf-8-validate - zod - viem@2.22.8(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76): + viem@2.23.2(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76): dependencies: - '@noble/curves': 1.7.0 - '@noble/hashes': 1.6.1 - '@scure/bip32': 1.6.0 - '@scure/bip39': 1.5.0 - abitype: 1.0.7(typescript@6.0.3)(zod@3.25.76) + '@noble/curves': 1.8.1 + '@noble/hashes': 1.7.1 + '@scure/bip32': 1.6.2 + '@scure/bip39': 1.5.4 + abitype: 1.0.8(typescript@6.0.3)(zod@3.25.76) isows: 1.0.6(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) - ox: 0.6.0(typescript@6.0.3)(zod@3.25.76) - webauthn-p256: 0.0.10 + ox: 0.6.7(typescript@6.0.3)(zod@3.25.76) ws: 8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) optionalDependencies: typescript: 6.0.3 @@ -24117,6 +27181,40 @@ snapshots: - utf-8-validate - zod + viem@2.57.2(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.22.4): + dependencies: + '@noble/curves': 1.9.1 + '@noble/hashes': 1.8.0 + '@scure/bip32': 1.7.0 + '@scure/bip39': 1.6.0 + abitype: 1.2.3(typescript@6.0.3)(zod@3.22.4) + isows: 1.0.7(ws@8.21.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + ox: 0.14.45(typescript@6.0.3)(zod@3.22.4) + ws: 8.21.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + optionalDependencies: + typescript: 6.0.3 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + - zod + + viem@2.57.2(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76): + dependencies: + '@noble/curves': 1.9.1 + '@noble/hashes': 1.8.0 + '@scure/bip32': 1.7.0 + '@scure/bip39': 1.6.0 + abitype: 1.2.3(typescript@6.0.3)(zod@3.25.76) + isows: 1.0.7(ws@8.21.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + ox: 0.14.45(typescript@6.0.3)(zod@3.25.76) + ws: 8.21.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + optionalDependencies: + typescript: 6.0.3 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + - zod + vite-plugin-storybook-nextjs@10.6.0(next@16.3.5(@babel/core@8.0.5)(@types/node@24.13.4)(babel-plugin-macros@3.1.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(rollup@4.52.4)(storybook@10.6.0(@types/react@19.3.0)(bufferutil@4.0.9)(prettier@3.9.6)(react@19.3.0)(utf-8-validate@5.0.10))(supports-color@4.4.0)(typescript@6.0.3)(vite@8.3.0(@types/node@24.13.4)(esbuild@0.28.2)(terser@5.46.1)(tsx@4.21.0)): dependencies: '@next/env': 16.3.5 @@ -24165,6 +27263,54 @@ snapshots: dependencies: xml-name-validator: 5.0.0 + wagmi@2.19.5(@tanstack/query-core@5.104.0)(@tanstack/react-query@5.104.0(react@19.3.0))(@types/react@19.3.0)(bufferutil@4.0.9)(debug@4.4.3(supports-color@4.4.0))(encoding@0.1.13)(immer@11.1.18)(react@19.3.0)(supports-color@4.4.0)(typescript@6.0.3)(utf-8-validate@5.0.10)(viem@2.57.2(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76): + dependencies: + '@tanstack/react-query': 5.104.0(react@19.3.0) + '@wagmi/connectors': 6.2.0(@tanstack/react-query@5.104.0(react@19.3.0))(@types/react@19.3.0)(@wagmi/core@2.22.1(@tanstack/query-core@5.104.0)(@types/react@19.3.0)(immer@11.1.18)(react@19.3.0)(typescript@6.0.3)(use-sync-external-store@1.4.0(react@19.3.0))(viem@2.57.2(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76)))(bufferutil@4.0.9)(debug@4.4.3(supports-color@4.4.0))(encoding@0.1.13)(immer@11.1.18)(react@19.3.0)(supports-color@4.4.0)(typescript@6.0.3)(use-sync-external-store@1.4.0(react@19.3.0))(utf-8-validate@5.0.10)(viem@2.57.2(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76))(wagmi@2.19.5(@tanstack/query-core@5.104.0)(@tanstack/react-query@5.104.0(react@19.3.0))(@types/react@19.3.0)(bufferutil@4.0.9)(debug@4.4.3(supports-color@4.4.0))(encoding@0.1.13)(immer@11.1.18)(react@19.3.0)(supports-color@4.4.0)(typescript@6.0.3)(utf-8-validate@5.0.10)(viem@2.57.2(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76))(zod@3.25.76) + '@wagmi/core': 2.22.1(@tanstack/query-core@5.104.0)(@types/react@19.3.0)(immer@11.1.18)(react@19.3.0)(typescript@6.0.3)(use-sync-external-store@1.4.0(react@19.3.0))(viem@2.57.2(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76)) + react: 19.3.0 + use-sync-external-store: 1.4.0(react@19.3.0) + viem: 2.57.2(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76) + optionalDependencies: + typescript: 6.0.3 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@tanstack/query-core' + - '@types/react' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/kv' + - '@x402/core' + - '@x402/evm' + - '@x402/extensions' + - '@x402/svm' + - aws4fetch + - bufferutil + - db0 + - debug + - encoding + - expo-auth-session + - expo-crypto + - expo-web-browser + - fastestsmallesttextencoderdecoder + - immer + - ioredis + - react-native + - supports-color + - uploadthing + - utf-8-validate + - zod + web3-bzz@1.10.0(bufferutil@4.0.9)(supports-color@4.4.0)(utf-8-validate@5.0.10): dependencies: '@types/node': 12.20.55 @@ -24506,7 +27652,7 @@ snapshots: web3-eth-iban@1.2.11: dependencies: - bn.js: 4.12.1 + bn.js: 4.12.3 web3-utils: 1.2.11 optional: true @@ -24776,7 +27922,7 @@ snapshots: web3-utils@1.2.11: dependencies: - bn.js: 4.12.1 + bn.js: 4.12.3 eth-lib: 0.2.8 ethereum-bloom-filters: 1.2.0 ethjs-unit: 0.1.6 @@ -24831,10 +27977,7 @@ snapshots: - utf-8-validate optional: true - webauthn-p256@0.0.10: - dependencies: - '@noble/curves': 1.8.0 - '@noble/hashes': 1.7.0 + webextension-polyfill@0.10.0: {} webidl-conversions@3.0.1: {} @@ -25008,7 +28151,7 @@ snapshots: bufferutil: 4.0.9 utf-8-validate: 5.0.10 - ws@8.20.0(bufferutil@4.0.9)(utf-8-validate@5.0.10): + ws@8.21.0(bufferutil@4.0.9)(utf-8-validate@5.0.10): optionalDependencies: bufferutil: 4.0.9 utf-8-validate: 5.0.10 @@ -25052,6 +28195,8 @@ snapshots: xmlchars@2.2.0: {} + xmlhttprequest-ssl@2.1.2: {} + xmlhttprequest@1.8.0: {} xtend@2.1.2: @@ -25171,4 +28316,29 @@ snapshots: dependencies: zod: 3.25.76 + zod@3.22.4: {} + zod@3.25.76: {} + + zod@4.6.5: {} + + zustand@5.0.0(@types/react@19.3.0)(immer@11.1.18)(react@19.3.0)(use-sync-external-store@1.4.0(react@19.3.0)): + optionalDependencies: + '@types/react': 19.3.0 + immer: 11.1.18 + react: 19.3.0 + use-sync-external-store: 1.4.0(react@19.3.0) + + zustand@5.0.15(@types/react@19.3.0)(immer@11.1.18)(react@19.3.0)(use-sync-external-store@1.4.0(react@19.3.0)): + optionalDependencies: + '@types/react': 19.3.0 + immer: 11.1.18 + react: 19.3.0 + use-sync-external-store: 1.4.0(react@19.3.0) + + zustand@5.0.3(@types/react@19.3.0)(immer@11.1.18)(react@19.3.0)(use-sync-external-store@1.4.0(react@19.3.0)): + optionalDependencies: + '@types/react': 19.3.0 + immer: 11.1.18 + react: 19.3.0 + use-sync-external-store: 1.4.0(react@19.3.0) diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 36ae2d66..f3edb916 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -30,3 +30,8 @@ overrides: # eth-sig-util@1.4.2 declares ethereumjs-abi as an unpinned git URL, which # blockExoticSubdeps rejects. Pin the equivalent registry release instead. 'ethereumjs-abi': '^0.6.8' + # RainbowKit pins cuer@0.0.3, which calls qr's encodeQR with border: 0; + # qr >=0.6 rejects that (RangeError: invalid border=0) and breaks the + # WalletConnect QR screen. cuer@0.0.4 fixes it; drop this once RainbowKit + # ships that version. + 'qr': '~0.5.5' From d26f59d1d64b2a4db8e82592eb5e95370df89bf1 Mon Sep 17 00:00:00 2001 From: Bruno Menezes Date: Thu, 8 Oct 2026 15:06:13 +0100 Subject: [PATCH 02/10] refactor(wallet): Replace web3-onboard with RainbowKit and wagmi. --- .gitignore | 3 + .storybook/preview.tsx | 12 +- .../components/wallet/ethersAdapter.test.ts | 57 +++ .../components/wallet/useOnboard.test.tsx | 369 ------------------ .../components/wallet/useWagmiWallet.test.tsx | 278 +++++++++++++ __tests__/contexts/wallet/helpers.tsx | 2 - __tests__/contexts/wallet/mocks.ts | 12 +- ...{useOnboard.test.tsx => provider.test.tsx} | 20 +- jest.setup.js | 11 + next.config.js | 5 +- public/images/cartesi-logo.png | Bin 0 -> 3382 bytes src/components/Web3Container.tsx | 61 ++- src/components/header/Chain.tsx | 20 +- src/components/header/menu/WalletMenu.tsx | 15 +- .../header/modals/WalletMobileModal.tsx | 44 +-- .../wallet/cartesi-images-as-string.ts | 26 -- src/components/wallet/chains.ts | 26 ++ src/components/wallet/config.ts | 102 +++++ src/components/wallet/definitions.tsx | 10 +- src/components/wallet/ethersAdapter.ts | 55 +++ src/components/wallet/provider.tsx | 22 +- src/components/wallet/useOnboard.tsx | 356 ----------------- src/components/wallet/useWagmiWallet.ts | 144 +++++++ src/styles/onboard.ts | 48 --- src/styles/onboardTheme.ts | 48 --- src/styles/theme.ts | 4 - 26 files changed, 777 insertions(+), 973 deletions(-) create mode 100644 __tests__/components/wallet/ethersAdapter.test.ts delete mode 100644 __tests__/components/wallet/useOnboard.test.tsx create mode 100644 __tests__/components/wallet/useWagmiWallet.test.tsx rename __tests__/contexts/wallet/{useOnboard.test.tsx => provider.test.tsx} (87%) create mode 100644 public/images/cartesi-logo.png delete mode 100644 src/components/wallet/cartesi-images-as-string.ts create mode 100644 src/components/wallet/chains.ts create mode 100644 src/components/wallet/config.ts create mode 100644 src/components/wallet/ethersAdapter.ts delete mode 100644 src/components/wallet/useOnboard.tsx create mode 100644 src/components/wallet/useWagmiWallet.ts delete mode 100644 src/styles/onboard.ts delete mode 100644 src/styles/onboardTheme.ts diff --git a/.gitignore b/.gitignore index bb9804c2..6f7641ed 100644 --- a/.gitignore +++ b/.gitignore @@ -46,3 +46,6 @@ yarn-error.log* # pnpm .pnpm-store/ + +# typescript +tsconfig.tsbuildinfo diff --git a/.storybook/preview.tsx b/.storybook/preview.tsx index adf899d6..d9dafc18 100644 --- a/.storybook/preview.tsx +++ b/.storybook/preview.tsx @@ -7,10 +7,20 @@ import { FC } from 'react'; import { Fonts } from '../src/components/Fonts'; import { SelectedChain } from '../src/components/header'; import { ColorModeProvider } from '../src/components/ui/color-mode'; +import { mock } from 'wagmi/connectors'; import Web3Container from '../src/components/Web3Container'; +import { createWagmiConfig } from '../src/components/wallet/config'; import theme from '../src/styles/theme'; import ColorMode from './ColorMode'; +// A mock connector keeps Storybook and Chromatic from instantiating WalletConnect. +const storybookWagmiConfig = createWagmiConfig([ + mock({ + accounts: ['0x491604c0FDF08347Dd1fa4Ee062a822A5DD06B5D'], + features: { reconnect: false }, + }), +]); + const withChakra = (Story: FC, context: StoryContext) => { console.info(`withChakra`); const colorModeValue = context.globals.backgrounds?.value ?? 'dark'; @@ -21,7 +31,7 @@ const withChakra = (Story: FC, context: StoryContext) => { - + diff --git a/__tests__/components/wallet/ethersAdapter.test.ts b/__tests__/components/wallet/ethersAdapter.test.ts new file mode 100644 index 00000000..ef3fe75e --- /dev/null +++ b/__tests__/components/wallet/ethersAdapter.test.ts @@ -0,0 +1,57 @@ +import { Web3Provider } from '@ethersproject/providers'; +import { renderHook, waitFor } from '@testing-library/react'; +import { + toWeb3Provider, + useEthersLibrary, +} from '../../../src/components/wallet/ethersAdapter'; + +const buildConnector = (uid: string) => + ({ + uid, + getProvider: jest.fn().mockResolvedValue({ request: jest.fn() }), + }) as any; + +describe('ethers adapter', () => { + it('wraps an EIP-1193 provider with the "any" network', () => { + const provider = toWeb3Provider({ request: jest.fn() }); + expect(provider).toBeInstanceOf(Web3Provider); + expect(provider.anyNetwork).toBe(true); + }); + + it('builds one Web3Provider per connector and keeps it across re-renders', async () => { + const connector = buildConnector('a'); + const { result, rerender } = renderHook( + ({ c }) => useEthersLibrary(c), + { initialProps: { c: connector } }, + ); + + await waitFor(() => + expect(result.current).toBeInstanceOf(Web3Provider), + ); + const first = result.current; + + rerender({ c: connector }); + await waitFor(() => expect(result.current).toBe(first)); + expect(connector.getProvider).toHaveBeenCalledTimes(1); + }); + + it('swaps the provider when the connector changes and clears it on disconnect', async () => { + const first = buildConnector('a'); + const second = buildConnector('b'); + const { result, rerender } = renderHook( + ({ c }) => useEthersLibrary(c), + { initialProps: { c: first } }, + ); + await waitFor(() => + expect(result.current).toBeInstanceOf(Web3Provider), + ); + const initial = result.current; + + rerender({ c: second }); + await waitFor(() => expect(result.current).not.toBe(initial)); + expect(result.current).toBeInstanceOf(Web3Provider); + + rerender({ c: undefined }); + await waitFor(() => expect(result.current).toBeUndefined()); + }); +}); diff --git a/__tests__/components/wallet/useOnboard.test.tsx b/__tests__/components/wallet/useOnboard.test.tsx deleted file mode 100644 index 4036f841..00000000 --- a/__tests__/components/wallet/useOnboard.test.tsx +++ /dev/null @@ -1,369 +0,0 @@ -// Copyright (C) 2025 Cartesi Pte. Ltd. - -// This program is free software: you can redistribute it and/or modify it under -// the terms of the GNU General Public License as published by the Free Software -// Foundation, either version 3 of the License, or (at your option) any later -// version. - -// This program is distributed in the hope that it will be useful, but WITHOUT ANY -// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A -// PARTICULAR PURPOSE. See the GNU General Public License for more details. - -import { cleanup, renderHook, waitFor } from '@testing-library/react'; -import Onboard, { - EIP1193Provider, - OnboardAPI, - WalletState, -} from '@web3-onboard/core'; -import { ConnectedChain } from '@web3-onboard/core/dist/types'; -import { act } from 'react'; -import { WalletType } from '../../../src/components/wallet/definitions'; -import { UnsupportedNetworkError } from '../../../src/components/wallet/errors/UnsupportedNetworkError'; -import { - buildConfig, - checkNetwork, - convertToHex, - getWalletType, - handlerBuilder, - useOnboard, -} from '../../../src/components/wallet/useOnboard'; -import { Network, networks } from '../../../src/utils/networks'; - -jest.mock('ethers'); - -jest.mock('@web3-onboard/core', () => { - const originalModule = jest.requireActual('@web3-onboard/core'); - return { - __esModule: true, - ...originalModule, - default: jest.fn(), - }; -}); - -const defaultChainIds = Object.keys(networks).map( - (key) => `0x${Number(key).toString(16)}`, -); -const defaultAppMetadata: Record = { - name: 'Cartesi Explorer App', - description: 'A place where you can stake CTSI and much more...', -}; - -const chain = { - id: `0x${convertToHex(Network.SEPOLIA)}`, - namespace: 'ETH', -} as unknown as ConnectedChain; - -const account = { - address: '0x907eA0e65Ecf3af503007B382E1280Aeb46104ad', - ens: null, - balance: null, -}; - -const wallet = { - provider: 'Some provider' as unknown as EIP1193Provider, - label: 'metamask', - chains: [chain], - accounts: [account], -} as WalletState; - -const mockedOnboard = Onboard as jest.MockedFunction; - -describe('useOnBoard', () => { - afterEach(() => { - jest.clearAllMocks(); - cleanup(); - }); - - it('should build config with correct chains', () => { - const chainIds = Object.keys(networks) - .slice(0, 2) - .map((key) => `0x${Number(key).toString(16)}`); - const config = buildConfig(false, chainIds); - - expect(config.chains.length).toBe(chainIds.length); - config.chains.forEach((chain) => { - expect(chainIds.includes(chain.id.toString(16))).toBe(true); - }); - }); - - it('should build config with correct appMetadata', () => { - const config = buildConfig(false, defaultChainIds, defaultAppMetadata); - - expect(config.appMetadata?.name).toBe(defaultAppMetadata.name); - Object.keys(defaultAppMetadata).forEach((appMetadataKey) => { - expect( - (config.appMetadata as unknown as Record)?.[ - appMetadataKey - ], - ).toBe(defaultAppMetadata[appMetadataKey]); - }); - }); - - it('should build config with correct accountCenter', () => { - const config = buildConfig(false, defaultChainIds, defaultAppMetadata); - - expect(config.accountCenter?.desktop.enabled).toBe(false); - expect(config.accountCenter?.mobile.enabled).toBe(false); - }); - - it('should build config with correct number of wallets', () => { - const config = buildConfig(false, defaultChainIds, defaultAppMetadata); - expect(config.wallets.length).toBe(4); - }); - - it('should generate error when unsupported network is selected', () => { - const [firstNetwork] = Object.keys(networks).map(Number); - const chainIds = Object.keys(networks).slice(1, 3).map(Number); - const error = checkNetwork(firstNetwork, chainIds); - - expect(error instanceof UnsupportedNetworkError).toBe(true); - }); - - it('should not generate error when supported network is selected', () => { - const [firstNetwork] = Object.keys(networks).map(Number); - const chainIds = Object.keys(networks).slice(0, 2).map(Number); - const error = checkNetwork(firstNetwork, chainIds); - - expect(error).toBe(null); - }); - - it('should correctly convert number to hex string', () => { - const prefix = '0x'; - expect(`${prefix}${convertToHex(Network.MAINNET)}`).toBe(`${prefix}1`); - }); - - it('should get correct wallet type', () => { - const injectedWallets = new Set(['metamask', 'coinbase']); - for (const value of injectedWallets) { - expect(getWalletType(value)).toBe(WalletType.INJECTED); - } - - const sdkWallets = new Set(['gnosis safe', 'safe']); - for (const value of sdkWallets) { - expect(getWalletType(value)).toBe(WalletType.SDK); - } - }); - - it('should correctly check if network is supported', () => { - const chainIdsAsNumbers = defaultChainIds.map((id) => parseInt(id, 16)); - const chainId = parseInt(defaultChainIds[0]); - - expect(checkNetwork(chainId, chainIdsAsNumbers)).toBe(null); - - expect( - checkNetwork(10, chainIdsAsNumbers) - ?.toString() - .includes('UnsupportedNetworkError'), - ).toBe(true); - }); - - it('should correctly build state when wallets are defined', () => { - let expectedState = null; - const callback = (state: any) => { - expectedState = state(); - return undefined; - }; - const handler = handlerBuilder(callback, defaultChainIds); - const wallets: WalletState[] = [wallet]; - - handler(wallets); - expect(expectedState).toStrictEqual({ - error: null, - account: account.address?.toLowerCase(), - chainId: parseInt(chain.id), - isHardwareWallet: false, - isGnosisSafe: false, - walletType: WalletType.INJECTED, - walletLabel: wallet.label, - }); - }); - - it('should correctly build state when wallets are undefined', () => { - let expectedState = null; - const callback = (state: any) => { - expectedState = state(); - return undefined; - }; - const handler = handlerBuilder(callback, defaultChainIds); - - handler([]); - expect(expectedState).toStrictEqual({}); - }); - - it('should subscribe wallets after setting valid onboard', async () => { - const wallets: WalletState[] = [wallet]; - let isSubscribed = false; - const onboard = { - connectWallet: () => Promise.resolve(wallets), - disconnectWallet: () => Promise.resolve(wallets), - setChain: jest.fn(), - state: { - get: () => ({ - wallets, - }), - select: (type: any) => { - if (type === 'wallets') { - return { - subscribe: () => { - isSubscribed = true; - return { - unsubscribe: jest.fn(), - }; - }, - }; - } - }, - }, - } as unknown as OnboardAPI; - mockedOnboard.mockReturnValue(onboard); - - renderHook(() => - useOnboard({ - chainIds: defaultChainIds, - appMetaData: defaultAppMetadata, - }), - ); - - await waitFor(() => { - expect(isSubscribed).toBe(true); - }); - }); - - it('should correctly disconnect wallet', async () => { - const wallets: WalletState[] = [wallet]; - let isDisconnectWalletCalled = false; - const onboard = { - connectWallet: () => Promise.resolve(wallets), - disconnectWallet: () => { - isDisconnectWalletCalled = true; - return Promise.resolve(wallets); - }, - setChain: jest.fn(), - state: { - get: () => ({ - wallets, - }), - select: (type: any) => { - if (type === 'wallets') { - return { - subscribe: () => ({ - unsubscribe: jest.fn(), - }), - }; - } - }, - }, - } as unknown as OnboardAPI; - mockedOnboard.mockReturnValue(onboard); - - const { result } = renderHook(() => - useOnboard({ - chainIds: defaultChainIds, - appMetaData: defaultAppMetadata, - }), - ); - - await act(async () => { - await result.current.disconnectWallet(); - }); - - await waitFor(() => { - expect(isDisconnectWalletCalled).toBe(true); - }); - }); - - it('should correctly connect wallet', async () => { - const wallets: WalletState[] = [wallet]; - let isConnectWalledCalled = false; - const onboard = { - connectWallet: () => { - isConnectWalledCalled = true; - return Promise.resolve(wallets); - }, - disconnectWallet: () => Promise.resolve(wallets), - setChain: jest.fn(), - state: { - get: () => ({ - wallets, - }), - select: (type: any) => { - if (type === 'wallets') { - return { - subscribe: () => ({ - unsubscribe: jest.fn(), - }), - }; - } - }, - }, - } as unknown as OnboardAPI; - mockedOnboard.mockReturnValue(onboard); - - const { result } = renderHook(() => - useOnboard({ - chainIds: defaultChainIds, - appMetaData: defaultAppMetadata, - }), - ); - - await act(async () => { - await result.current.connectWallet(); - }); - - await waitFor(() => { - expect(isConnectWalledCalled).toBe(true); - }); - }); - - it('should correctly set chain to MainNet', async () => { - const current_env = { ...process.env }; - process.env = { - ...current_env, - NODE_ENV: 'production', - }; - - const wallets: WalletState[] = [wallet]; - const mockedSetChain = jest.fn(); - const onboard = { - connectWallet: () => Promise.resolve(wallets), - disconnectWallet: () => Promise.resolve(wallets), - setChain: mockedSetChain, - state: { - get: () => ({ - wallets, - }), - select: (type: any) => { - if (type === 'wallets') { - return { - subscribe: () => ({ - unsubscribe: jest.fn(), - }), - }; - } - }, - }, - } as unknown as OnboardAPI; - mockedOnboard.mockReturnValue(onboard); - - const { result } = renderHook(() => - useOnboard({ - chainIds: defaultChainIds, - appMetaData: defaultAppMetadata, - }), - ); - - await act(async () => { - await result.current.connectWallet(); - }); - - await waitFor(() => { - expect(mockedSetChain).toHaveBeenCalledWith({ - chainId: `0x${convertToHex(Network.MAINNET)}`, - }); - }); - - process.env = { - ...current_env, - }; - }); -}); diff --git a/__tests__/components/wallet/useWagmiWallet.test.tsx b/__tests__/components/wallet/useWagmiWallet.test.tsx new file mode 100644 index 00000000..3ee598ee --- /dev/null +++ b/__tests__/components/wallet/useWagmiWallet.test.tsx @@ -0,0 +1,278 @@ +import { act, renderHook } from '@testing-library/react'; +import { useConnectModal } from '@rainbow-me/rainbowkit'; +import { + useAccount, + useAccountEffect, + useDisconnect, + usePublicClient, + useSwitchChain, + useWalletClient, +} from 'wagmi'; +import { WalletType } from '../../../src/components/wallet/definitions'; +import { UnsupportedNetworkError } from '../../../src/components/wallet/errors/UnsupportedNetworkError'; +import { useEthersLibrary } from '../../../src/components/wallet/ethersAdapter'; +import { + checkNetwork, + getWalletType, + shouldSwitchToMainnet, + useWagmiWallet, +} from '../../../src/components/wallet/useWagmiWallet'; +import { Network, networks } from '../../../src/utils/networks'; + +jest.unmock('../../../src/components/wallet/useWagmiWallet'); + +jest.mock('wagmi', () => ({ + useAccount: jest.fn(), + useAccountEffect: jest.fn(), + useDisconnect: jest.fn(), + usePublicClient: jest.fn(), + useSwitchChain: jest.fn(), + useWalletClient: jest.fn(), +})); + +jest.mock('@rainbow-me/rainbowkit', () => ({ + useConnectModal: jest.fn(), +})); + +jest.mock('../../../src/components/wallet/ethersAdapter', () => ({ + useEthersLibrary: jest.fn(), +})); + +const useAccountMock = useAccount as jest.MockedFunction; +const useAccountEffectMock = useAccountEffect as jest.MockedFunction< + typeof useAccountEffect +>; +const useDisconnectMock = useDisconnect as jest.MockedFunction< + typeof useDisconnect +>; +const usePublicClientMock = usePublicClient as jest.MockedFunction< + typeof usePublicClient +>; +const useSwitchChainMock = useSwitchChain as jest.MockedFunction< + typeof useSwitchChain +>; +const useWalletClientMock = useWalletClient as jest.MockedFunction< + typeof useWalletClient +>; +const useConnectModalMock = useConnectModal as jest.MockedFunction< + typeof useConnectModal +>; +const useEthersLibraryMock = useEthersLibrary as jest.MockedFunction< + typeof useEthersLibrary +>; + +const supported = Object.keys(networks).map(Number); +const address = '0x907eA0e65Ecf3af503007B382E1280Aeb46104ad'; +const metaMask = { + id: 'io.metamask', + name: 'MetaMask', + type: 'injected', +} as any; +const safe = { id: 'safe', name: 'Safe', type: 'safe' } as any; + +const library = { getSigner: jest.fn() } as any; +const publicClient = { chain: { id: 1 } } as any; +const walletClient = { account: { address } } as any; + +const disconnect = jest.fn(); +const switchChainAsync = jest.fn(); +const openConnectModal = jest.fn(); + +const connected = (overrides: Partial> = {}) => + ({ + address, + chainId: Network.MAINNET, + connector: metaMask, + status: 'connected', + isConnected: true, + ...overrides, + }) as any; + +const disconnected = () => + ({ + address: undefined, + chainId: undefined, + connector: undefined, + status: 'disconnected', + isConnected: false, + }) as any; + +describe('checkNetwork', () => { + it('returns undefined when the chain id is not set yet', () => { + expect(checkNetwork(undefined, supported)).toBeUndefined(); + }); + + it('returns null for a supported chain', () => { + expect(checkNetwork(Network.SEPOLIA, supported)).toBeNull(); + }); + + it('returns an UnsupportedNetworkError otherwise', () => { + const error = checkNetwork(10, supported); + expect(error).toBeInstanceOf(UnsupportedNetworkError); + expect(error.message).toEqual( + `Network id 10 is not supported. Supported network ids are ${supported.join( + ', ', + )}`, + ); + }); + + it('uses the explorer supported chains by default', () => { + expect(checkNetwork(Network.LOCAL)).toBeNull(); + expect(checkNetwork(5)).toBeInstanceOf(UnsupportedNetworkError); + }); +}); + +describe('getWalletType', () => { + it('maps the safe connector to the sdk type', () => { + expect(getWalletType(safe)).toEqual(WalletType.SDK); + }); + + it('maps injected wallets and the MetaMask SDK to the injected type', () => { + expect(getWalletType(metaMask)).toEqual(WalletType.INJECTED); + expect(getWalletType({ id: 'metaMaskSDK', type: 'metaMask' })).toEqual( + WalletType.INJECTED, + ); + }); + + it('has no type for other connectors', () => { + expect( + getWalletType({ id: 'walletConnect', type: 'walletConnect' }), + ).toBeUndefined(); + expect(getWalletType(undefined)).toBeUndefined(); + }); +}); + +describe('shouldSwitchToMainnet', () => { + it('never switches in development', () => { + expect(shouldSwitchToMainnet(Network.SEPOLIA, 'development')).toBe( + false, + ); + }); + + it('switches outside development when not on mainnet', () => { + expect(shouldSwitchToMainnet(Network.SEPOLIA, 'production')).toBe(true); + expect(shouldSwitchToMainnet(undefined, 'production')).toBe(true); + }); + + it('does nothing when already on mainnet', () => { + expect(shouldSwitchToMainnet(Network.MAINNET, 'production')).toBe( + false, + ); + }); +}); + +describe('useWagmiWallet', () => { + beforeEach(() => { + useConnectModalMock.mockReturnValue({ openConnectModal } as any); + useDisconnectMock.mockReturnValue({ disconnect } as any); + useSwitchChainMock.mockReturnValue({ switchChainAsync } as any); + usePublicClientMock.mockReturnValue(publicClient); + useWalletClientMock.mockReturnValue({ data: walletClient } as any); + useEthersLibraryMock.mockReturnValue(library); + useAccountEffectMock.mockImplementation(() => undefined); + switchChainAsync.mockResolvedValue(undefined); + }); + + afterEach(() => { + jest.clearAllMocks(); + }); + + it('is inactive while disconnected and opens the connect modal on activate', async () => { + useAccountMock.mockReturnValue(disconnected()); + useEthersLibraryMock.mockReturnValue(undefined); + + const { result } = renderHook(() => useWagmiWallet()); + + expect(result.current.active).toBe(false); + expect(result.current.account).toBeUndefined(); + expect(result.current.error).toBeUndefined(); + + await act(() => result.current.connectWallet()); + expect(openConnectModal).toHaveBeenCalledTimes(1); + }); + + it('exposes a lowercase account, the clients and the wallet name once connected', () => { + useAccountMock.mockReturnValue(connected()); + + const { result } = renderHook(() => useWagmiWallet()); + + expect(result.current.active).toBe(true); + expect(result.current.account).toEqual(address.toLowerCase()); + expect(result.current.chainId).toEqual(Network.MAINNET); + expect(result.current.library).toBe(library); + expect(result.current.publicClient).toBe(publicClient); + expect(result.current.walletClient).toBe(walletClient); + expect(result.current.walletName).toEqual('MetaMask'); + expect(result.current.walletType).toEqual(WalletType.INJECTED); + expect(result.current.isGnosisSafe).toBe(false); + expect(result.current.error).toBeNull(); + expect(usePublicClientMock).toHaveBeenCalledWith({ + chainId: Network.MAINNET, + }); + }); + + it('flags an unsupported network and stays inactive', () => { + useAccountMock.mockReturnValue(connected({ chainId: 10 })); + + const { result } = renderHook(() => useWagmiWallet()); + + expect(result.current.error).toBeInstanceOf(UnsupportedNetworkError); + expect(result.current.active).toBe(false); + expect(usePublicClientMock).toHaveBeenCalledWith({ + chainId: undefined, + }); + }); + + it('recognises a Safe connection', () => { + useAccountMock.mockReturnValue(connected({ connector: safe })); + + const { result } = renderHook(() => useWagmiWallet()); + + expect(result.current.isGnosisSafe).toBe(true); + expect(result.current.walletType).toEqual(WalletType.SDK); + expect(result.current.walletName).toEqual('Safe'); + }); + + it('stays inactive until the ethers provider is ready', () => { + useAccountMock.mockReturnValue(connected()); + useEthersLibraryMock.mockReturnValue(undefined); + + const { result } = renderHook(() => useWagmiWallet()); + + expect(result.current.active).toBe(false); + }); + + it('asks the wallet to switch to mainnet after connecting elsewhere', () => { + useAccountMock.mockReturnValue(connected({ chainId: Network.SEPOLIA })); + + renderHook(() => useWagmiWallet()); + + const { onConnect } = useAccountEffectMock.mock.calls[0][0]; + onConnect({ chainId: Network.SEPOLIA } as any); + expect(switchChainAsync).toHaveBeenCalledWith({ + chainId: Network.MAINNET, + }); + + switchChainAsync.mockClear(); + onConnect({ chainId: Network.MAINNET } as any); + expect(switchChainAsync).not.toHaveBeenCalled(); + }); + + it('disconnects through wagmi', () => { + useAccountMock.mockReturnValue(connected()); + + const { result } = renderHook(() => useWagmiWallet()); + act(() => result.current.disconnectWallet()); + + expect(disconnect).toHaveBeenCalledTimes(1); + }); + + it('removes the wallet selection left behind by the previous library', () => { + useAccountMock.mockReturnValue(disconnected()); + window.localStorage.setItem('SELECTED_WALLETS_V2', 'MetaMask'); + + renderHook(() => useWagmiWallet()); + + expect(window.localStorage.getItem('SELECTED_WALLETS_V2')).toBeNull(); + }); +}); diff --git a/__tests__/contexts/wallet/helpers.tsx b/__tests__/contexts/wallet/helpers.tsx index 58b3ed24..52a5472d 100644 --- a/__tests__/contexts/wallet/helpers.tsx +++ b/__tests__/contexts/wallet/helpers.tsx @@ -10,7 +10,6 @@ export const TestComponent = () => { active, activate, deactivate, - isHardwareWallet, isGnosisSafe, walletType, account, @@ -34,7 +33,6 @@ export const TestComponent = () => { Connect Wallet )} - {isHardwareWallet && Wallet is hardware type} {isGnosisSafe && Wallet is Gnosis Safe} {account && account is: {account}} {chainId && chainId is: {chainId}} diff --git a/__tests__/contexts/wallet/mocks.ts b/__tests__/contexts/wallet/mocks.ts index f82e253b..e6e7a622 100644 --- a/__tests__/contexts/wallet/mocks.ts +++ b/__tests__/contexts/wallet/mocks.ts @@ -1,15 +1,15 @@ import { mock } from 'jest-mock-extended'; -import { useOnboard } from '../../../src/components/wallet/useOnboard'; +import { useWagmiWallet } from '../../../src/components/wallet/useWagmiWallet'; import { ReturnOf } from '../../test-utilities'; -type UseOnboardV2Return = ReturnOf; +type UseWagmiWalletReturn = ReturnOf; -const buildUseOnboardV2Ret = () => mock(); +const buildUseWagmiWalletRet = () => mock(); -function buildMockUseOnboardV2Return() { - const mock = buildUseOnboardV2Ret(); +function buildMockUseWagmiWalletReturn() { + const mock = buildUseWagmiWalletRet(); mock.active = false; return mock; } -export { buildMockUseOnboardV2Return }; +export { buildMockUseWagmiWalletReturn }; diff --git a/__tests__/contexts/wallet/useOnboard.test.tsx b/__tests__/contexts/wallet/provider.test.tsx similarity index 87% rename from __tests__/contexts/wallet/useOnboard.test.tsx rename to __tests__/contexts/wallet/provider.test.tsx index 274a5268..f8013418 100644 --- a/__tests__/contexts/wallet/useOnboard.test.tsx +++ b/__tests__/contexts/wallet/provider.test.tsx @@ -11,11 +11,11 @@ import { fireEvent, render, screen } from '@testing-library/react'; import { WalletConnectionProvider } from '../../../src/components/wallet/provider'; -import { useOnboard } from '../../../src/components/wallet/useOnboard'; +import { useWagmiWallet } from '../../../src/components/wallet/useWagmiWallet'; import { useWallet } from '../../../src/components/wallet/useWallet'; -import { Network, networks } from '../../../src/utils/networks'; +import { Network } from '../../../src/utils/networks'; import { TestComponent } from './helpers'; -import { buildMockUseOnboardV2Return } from './mocks'; +import { buildMockUseWagmiWalletReturn } from './mocks'; const walletMod = '../../../src/components/wallet/useWallet'; @@ -28,10 +28,12 @@ jest.mock(walletMod, () => { }; }); -jest.mock('../../../src/components/wallet/useOnboard'); +jest.mock('../../../src/components/wallet/useWagmiWallet'); jest.mock('@chakra-ui/react'); -const useOnboardStub = useOnboard as jest.MockedFunction; +const useWagmiWalletStub = useWagmiWallet as jest.MockedFunction< + typeof useWagmiWallet +>; const mockUseWallet = useWallet as jest.MockedFunction; const account = '0x907eA0e65Ecf3af503007B382E1280Aeb46104ad'; @@ -43,19 +45,15 @@ const walletMock = { chainId: Network.MAINNET, }; -const chainIds = Object.keys(networks).map( - (key) => `0x${Number(key).toString(16)}`, -); - describe('Wallet Provider', () => { const Component = () => ( - + ); beforeEach(() => { - useOnboardStub.mockReturnValue(buildMockUseOnboardV2Return()); + useWagmiWalletStub.mockReturnValue(buildMockUseWagmiWalletReturn()); mockUseWallet.mockReturnValue(walletMock); }); diff --git a/jest.setup.js b/jest.setup.js index df0de727..0c030d69 100644 --- a/jest.setup.js +++ b/jest.setup.js @@ -21,6 +21,17 @@ jest.mock('./src/services/ens', () => { }; }); +// The wallet hook is the only module importing wagmi and RainbowKit (ESM-only, +// heavy). Stub it everywhere; tests that exercise it unmock the module. +jest.mock('./src/components/wallet/useWagmiWallet', () => ({ + __esModule: true, + useWagmiWallet: jest.fn(() => ({ + active: false, + connectWallet: jest.fn(), + disconnectWallet: jest.fn(), + })), +})); + Object.defineProperty(window, 'matchMedia', { writable: true, value: jest.fn().mockImplementation((query) => ({ diff --git a/next.config.js b/next.config.js index a5a5781e..e49fde56 100644 --- a/next.config.js +++ b/next.config.js @@ -11,6 +11,9 @@ module.exports = { reactStrictMode: true, // Do not generate the AGENTS.md / CLAUDE.md files next writes on "next dev". agentRules: false, + // cdp-sdk (via wagmi's Base connector) imports optional @x402/* peers that + // are not installed; keep it out of the server bundle. + serverExternalPackages: ['@coinbase/cdp-sdk'], async headers() { return [ { @@ -20,7 +23,7 @@ module.exports = { key: 'Content-Security-Policy', value: ContentSecurityPolicy.replace( /\s{2,}/g, - ' ' + ' ', ).trim(), }, ], diff --git a/public/images/cartesi-logo.png b/public/images/cartesi-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..0c78b48d596dcb583707010523e03a3b40ed8e71 GIT binary patch literal 3382 zcmbW4`8(9z8^_OQ<|8v>MCeJ@k)1*$WgSbFvSlf2mJ~H8qzL1Kh)}5z2}zH2Mj|`& zv6QDsmTXyu7E8iJiW>ROb6wv*;Cp?4IOla;_jS&Fz2E2jaNl>5t+g31L4*JR;I%L} zvEvZ^cj2~icDr$ZZVsRjJ2N9d?-82^fXK2iF?0w!wfHcqeCUk$%L?p`mxsmL9}C%& zcHJ3hP4x0PZ7F}wLL;PVpYOn%neMYbhpVhc`w#jC^sJd~JacULJRV$CE$3x&Amf!# zpZfe66(+xR5F#BUBKF=Ua&DTX`*!(vGjo|4rMH#)yM@90-9UdE!sOFcjT(tyk=FAu z@k+gBfDoEHMs_*BhEcWghM|_N>eDZM^HPT&sxA{A! z_4MZf9O9bTHMZ%m?&#gX?tsrmL1WBB3~^iu^pqa1IS`yRH)1M z1{l4*snY(Ia+~k^_6iH&*0mtbcDyxainI#4U2$b!h0!x`WPDx`axC+vQ!=Q#GjwHr z!+Rv%9!Bf$Nd23(K436b7xF*DyPKMesRkMJkj%VhyacpZ2!};!QV(lJl2I|`^ zv%JL<1a^_YzTpsFjtJ#IJXzLbX?ix<>og8W7HsnvjUEp|d!k+%DujBEf&;Sbrfs`d zT~&Y;PxQ{1H>#M`9<}YpNrGK)e$w=;qG!j2aB$!-J92+{LjGQmEx~aK=a*qN?;>&W zY@8;;&YftqTb^t&T~W^X9f4{NCmGwWpz6T9b-H(0H5apI7>}6CamV2h?2ZXlLoiNx zAO7OYuvD2x5^-Zn(YEX$RGj|LG;+HL&7h&<1L6mn-A{02a}Q&P)mVhQkR;Ss`BQcv zw}+yB2~1U*ZJuC{o<=)QuG9MR2k~S-ji_AAPXiD+bE8-1b%O+i3&>Lifh}B4p%HTv zJ|1uPftKz!N6x;ASjiiO_v(!;-VAKoUAMS>BfB!{=$uEY2A{(U>H7XEG>RE@|fbDimY|V1Um8cI6p3LY^AB|IUba#&kuG6H%f6QdME^c+*!Q1NcsGM{|-weVfJui6kFXxjFwdoTwR6@|Kf3{LjV zBNF+#Iy;3G!|$-hcR?&!Rz@aLzk0Poh0C*F#`8PUG%(-`RWvI}N{0CO;Mma96&|#i zc}p>X{azqsfz+$Ns_Kl>&FiZ@a_qp$T%iF7;|&hs?T0@J?gEUB=bd$7PA*jje4p_M z_i;YeaHb8?WiZy*R(>}oI<&5glDEOQB!2Pj`Mkz&wU3O$_6#%H#_76{RC zkCRz-`MvdeSIi*um0@a+-uWM2!ZN9x$NJ~1NFlzX*#MlNP6qA8sMfCKp(RzAU3v~T z!Fop2yt?O`Uz3g}_HqyDh5Mz*vH7-y>b?Xsb#PTJXPMh|R``Go>JLuwk1h`$B)sJa~r$+X{Tw&`}xp& zRDxfqqnwfiuxi+L&gy);i+aT+P|DOVrea$M;=l+&86Omp`h$F|g>-PXLZ@=DM$@CL zvLMh61RHQwzr0V~w3shKPWWQ-ZP81`L-zuuGRp0>0ncBU=&+%8CAq6%nEU@I;R9+Z zHbqxM7XqC4+`{MX_`~6eHwLr_P39CJHO98fV8_^Y zE?x^?TA1*v;Wb%C&#fRW7z^iHtI_8EmfGALKnq?pH|}?D47_!C(|y70&163`btf6o zWE|}x&_-&Y^mkRXw2Zc2fifbBC#<-UcXUISNA9q_-M|s?Bjh`xN`2;i2cS8bj2{E$ zbffTv;g|~AmjI8o#fyWx&ZM(1;tXAY|N6d*)8Roh8a1`@m!s)?yW_g+n#@cCU2%e< z^if6xA7RCVj11?CM<9QoN0&e(eB7IUt6{~xQ*z_=cF#E(`KUr}CHDhbVse;Bo1N!!Y`;Mb7Z)x80szanVn& zZSi?#uSl$BW6juuwre+-j{y&eUuh;J+v)iv3&iLgS6CjblB~P{4N&`6>d8#(S0IVT_GY<#v_J@9Q*i2+y%1 z29NOAthek>N_Q9^EBJ$l-ZFLg!%jTnRGJ;5n2U*vLu=gWmq-2y#UaYB_E_?YU^)Fq z?l)~1eG*ED|9Ekh>*o$5aS?NH zFLrSIt#AS>i!qd&gvB8)&rG&76Q{L;?*QRf8Nx7;QJD;*P7M-*#;4+hsmk1VBt6ny zF8XKS)Ze0!<&mGViHzqjVbrBfg=bx#OPDI(vjfPhUv}z{2SkR(Fb>gB#2TV3ozN6; zC_SXjn{ERoFza18%~fFlPhhlQ7&BtR!E=3L?vU3`%+!&gnj`Kx7$QR}6NhM>V>*xg z1rnHL#xPpel)Zld{`9g9&PEshsIX!?W*J&)4UCI^N8*anKxje*h8$psY7<6QhZ{!Z0TG z&ElMBHZQF$l9&H|Y?nS>_fH5l!q{)3@trhC5^g>CL4gcD%=MHeaVW4qHlX7;0y_F0 zItp?q;|-4`J_bAk6K=9sbfcF)-=oQh9bFhdZQ4 zOvSixWU&cn%^e)>F@2hPh%*BmYN$HDheMMTPthPD5(v8FJ7~h;|0V$40+rQKn--s* RYjFl4U~$CSgl^;+`ycQ@5q1Co literal 0 HcmV?d00001 diff --git a/src/components/Web3Container.tsx b/src/components/Web3Container.tsx index a20645ce..7655c2b0 100644 --- a/src/components/Web3Container.tsx +++ b/src/components/Web3Container.tsx @@ -9,28 +9,63 @@ // WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A // PARTICULAR PURPOSE. See the GNU General Public License for more details. -import { networks } from '../utils/networks'; +import '@rainbow-me/rainbowkit/styles.css'; + +import { + darkTheme, + lightTheme, + RainbowKitProvider, +} from '@rainbow-me/rainbowkit'; +import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; +import { FC, ReactNode, useMemo, useState } from 'react'; +import { type Config, WagmiProvider } from 'wagmi'; +import theme from '../styles/theme'; +import { useColorMode } from './ui/color-mode'; import { WalletConnectionProvider } from './wallet'; -import { FC, ReactNode } from 'react'; +import { appMetadata, getWagmiConfig } from './wallet/config'; interface Web3ContainerProps { children: ReactNode; + /** Override the wagmi config (e.g. a mock connector in Storybook). */ + config?: Config; } -const Web3Container: FC = ({ children }) => { - const chainIds = Object.keys(networks).map( - (key) => `0x${Number(key).toString(16)}`, +const Web3Container: FC = ({ children, config }) => { + const { colorMode } = useColorMode(); + const [wagmiConfig] = useState(() => config ?? getWagmiConfig()); + const [queryClient] = useState(() => new QueryClient()); + const rainbowKitTheme = useMemo( + () => + colorMode === 'dark' + ? darkTheme({ + accentColor: theme.token('colors.dark.primary'), + accentColorForeground: theme.token('colors.header'), + borderRadius: 'medium', + fontStack: 'system', + }) + : lightTheme({ + accentColor: theme.token('colors.light.primary'), + accentColorForeground: theme.token('colors.white'), + borderRadius: 'medium', + fontStack: 'system', + }), + [colorMode], ); - const appMetaData = { - name: 'Cartesi Blockchain Explorer', - description: 'A place where you can stake your CTSI and much more.', - explore: 'https://explorer.cartesi.io', - }; return ( - - {children} - + + + + + {children} + + + + ); }; diff --git a/src/components/header/Chain.tsx b/src/components/header/Chain.tsx index 3915380a..5fc3c070 100644 --- a/src/components/header/Chain.tsx +++ b/src/components/header/Chain.tsx @@ -10,8 +10,8 @@ // PARTICULAR PURPOSE. See the GNU General Public License for more details. import { Tag, TagRootProps } from '@chakra-ui/react'; -import { chains } from 'eth-chains'; import { FC } from 'react'; +import { chainNames } from '../wallet/chains'; const colorSchemes: { [k: number]: string } = { 1: 'teal', // mainnet @@ -19,21 +19,9 @@ const colorSchemes: { [k: number]: string } = { 31337: 'gray', //localhost }; -type CustomChains = { - [k: number]: { name: string }; -}; - -// eth-chains don't have the info on this chain-ids yet, so we curate the output. -const customChains: CustomChains = { - 31337: { name: 'Local' }, -}; - -const getChainInfo = (chainId: number) => { - const chain = customChains[chainId] || chains.get(chainId); - return { - name: chain?.name, - }; -}; +const getChainInfo = (chainId: number) => ({ + name: chainNames[chainId] ?? `Chain ${chainId}`, +}); export interface ChainProps extends TagRootProps { chainId?: number; diff --git a/src/components/header/menu/WalletMenu.tsx b/src/components/header/menu/WalletMenu.tsx index 6eb00063..086d96b3 100644 --- a/src/components/header/menu/WalletMenu.tsx +++ b/src/components/header/menu/WalletMenu.tsx @@ -20,7 +20,7 @@ import { } from '@chakra-ui/react'; import React, { FC, useMemo } from 'react'; import { useENS } from '../../../services/ens'; -import { CopyIcon, DisconnectIcon, SwitchIcon } from '../../Icons'; +import { CopyIcon, DisconnectIcon } from '../../Icons'; import { useWallet } from '../../wallet/useWallet'; import { useColorModeValue } from '../../ui/color-mode'; import theme from '../../../styles/theme'; @@ -93,8 +93,7 @@ const WalletMenuActionItem: FC = ({ ); const WalletMenu: FC = () => { - const { account, library, isHardwareWallet, selectAccount, deactivate } = - useWallet(); + const { account, library, deactivate } = useWallet(); const ens = useENS(account ?? ''); const clipboard = useClipboard({ value: account ?? '' }); const color = useColorModeValue('light.gray.primary', 'white'); @@ -112,16 +111,8 @@ const WalletMenu: FC = () => { }); } - if (account && library && selectAccount && isHardwareWallet) { - items.push({ - title: 'Switch account', - Icon: SwitchIcon, - onClick: selectAccount, - }); - } - return items; - }, [account, library, isHardwareWallet, deactivate, selectAccount]); + }, [account, library, deactivate]); return ( <> diff --git a/src/components/header/modals/WalletMobileModal.tsx b/src/components/header/modals/WalletMobileModal.tsx index a3d6ad83..649b5357 100644 --- a/src/components/header/modals/WalletMobileModal.tsx +++ b/src/components/header/modals/WalletMobileModal.tsx @@ -21,7 +21,7 @@ import { } from '@chakra-ui/react'; import { flow } from 'lodash/fp'; import { useENS } from '../../../services/ens'; -import { CopyIcon, DisconnectIcon, SwitchIcon } from '../../Icons'; +import { CopyIcon, DisconnectIcon } from '../../Icons'; import { useWallet } from '../../wallet/useWallet'; import CloseButton from '../../CloseButton'; @@ -34,12 +34,9 @@ export const WalletMobileModal = ({ isOpen, onClose, }: IWalletMobileModalProps) => { - const { account, library, isHardwareWallet, selectAccount, deactivate } = - useWallet(); + const { account, library, deactivate } = useWallet(); const ens = useENS(account ?? ''); const clipboard = useClipboard({ value: account ?? '' }); - const showModalBody = - account && library && selectAccount && isHardwareWallet; const disconnect = flow([deactivate, onClose]); return ( @@ -140,43 +137,6 @@ export const WalletMobileModal = ({ )} - - {showModalBody && ( - - - - - - - Switch account - - - - - - - - - - )} diff --git a/src/components/wallet/cartesi-images-as-string.ts b/src/components/wallet/cartesi-images-as-string.ts deleted file mode 100644 index b9f986d8..00000000 --- a/src/components/wallet/cartesi-images-as-string.ts +++ /dev/null @@ -1,26 +0,0 @@ -export const CartesiIcon = ``; -export const CartesiLogo = ``; diff --git a/src/components/wallet/chains.ts b/src/components/wallet/chains.ts new file mode 100644 index 00000000..ba4b8fd3 --- /dev/null +++ b/src/components/wallet/chains.ts @@ -0,0 +1,26 @@ +// Copyright (C) 2026 Cartesi Pte. Ltd. + +// This program is free software: you can redistribute it and/or modify it under +// the terms of the GNU General Public License as published by the Free Software +// Foundation, either version 3 of the License, or (at your option) any later +// version. + +// This program is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A +// PARTICULAR PURPOSE. See the GNU General Public License for more details. + +import type { Chain } from 'viem'; +import { hardhat, mainnet, sepolia } from 'viem/chains'; + +/** Supported chains; free of wagmi/RainbowKit imports so UI components can use it. */ +export const local = { ...hardhat, name: 'Local' } as const satisfies Chain; // id 31337 + +export const chains = [mainnet, sepolia, local] as const; + +export const supportedChainIds: readonly number[] = chains.map( + (chain) => chain.id, +); + +export const chainNames: Record = Object.fromEntries( + chains.map((chain) => [chain.id, chain.name]), +); diff --git a/src/components/wallet/config.ts b/src/components/wallet/config.ts new file mode 100644 index 00000000..05163c88 --- /dev/null +++ b/src/components/wallet/config.ts @@ -0,0 +1,102 @@ +// Copyright (C) 2026 Cartesi Pte. Ltd. + +// This program is free software: you can redistribute it and/or modify it under +// the terms of the GNU General Public License as published by the Free Software +// Foundation, either version 3 of the License, or (at your option) any later +// version. + +// This program is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A +// PARTICULAR PURPOSE. See the GNU General Public License for more details. + +import { connectorsForWallets } from '@rainbow-me/rainbowkit'; +import { + base, + ledgerWallet, + metaMaskWallet, + rainbowWallet, + safeWallet, + trustWallet, + walletConnectWallet, +} from '@rainbow-me/rainbowkit/wallets'; +import { mainnet, sepolia } from 'viem/chains'; +import { createConfig, http, type Config, type CreateConnectorFn } from 'wagmi'; +import { Network } from '../../utils/networks'; +import { chains, local } from './chains'; + +const dappUrl = process.env.NEXT_PUBLIC_DAPP_URL; +const ankrEnabled = process.env.NEXT_PUBLIC_FLAG_ANKR_ENABLED === 'true'; + +export const appMetadata = { + name: 'Cartesi Blockchain Explorer', + description: 'A place where you can stake your CTSI and much more.', + url: dappUrl, + icon: `${dappUrl}/images/cartesi-logo.png`, +} as const; + +export const rpcUrls: Record = { + [Network.MAINNET]: ankrEnabled + ? 'https://rpc.ankr.com/eth' + : process.env.NEXT_PUBLIC_RPC_URL_1 || 'https://rpc.ankr.com/eth', + [Network.SEPOLIA]: + process.env.NEXT_PUBLIC_RPC_URL_11155111 || + 'https://rpc.ankr.com/eth_sepolia', + [Network.LOCAL]: + process.env.NEXT_PUBLIC_RPC_URL_31337 || 'http://localhost:8545', +}; + +/** + * RainbowKit shows exactly this list (also on mobile). Safe only appears + * inside the Safe web interface and connects automatically. + */ +export const createConnectors = (): CreateConnectorFn[] => + connectorsForWallets( + [ + { + groupName: 'Recommended', + wallets: [ + metaMaskWallet, + walletConnectWallet, + safeWallet, + base, + ], + }, + { + groupName: 'More', + wallets: [ledgerWallet, rainbowWallet, trustWallet], + }, + ], + { + appName: appMetadata.name, + appDescription: appMetadata.description, + appUrl: appMetadata.url, + appIcon: appMetadata.icon, + projectId: process.env.NEXT_PUBLIC_WALLETCONNECT_PROJECT_ID, + }, + ); + +export const createWagmiConfig = ( + connectors: CreateConnectorFn[] = createConnectors(), +): Config => + createConfig({ + chains, + transports: { + [mainnet.id]: http(rpcUrls[Network.MAINNET]), + [sepolia.id]: http(rpcUrls[Network.SEPOLIA]), + [local.id]: http(rpcUrls[Network.LOCAL]), + }, + connectors, + // Web3Container is rendered client-side only (next/dynamic with ssr: false). + ssr: false, + }); + +let wagmiConfig: Config | undefined; + +/** Connectors set themselves up at creation, so one config per page load. */ +export const getWagmiConfig = (): Config => { + if (!wagmiConfig) { + console.info(`dapp-url: ${dappUrl}`); + wagmiConfig = createWagmiConfig(); + } + return wagmiConfig; +}; diff --git a/src/components/wallet/definitions.tsx b/src/components/wallet/definitions.tsx index f4d6ae28..c11cf382 100644 --- a/src/components/wallet/definitions.tsx +++ b/src/components/wallet/definitions.tsx @@ -9,10 +9,10 @@ // WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A // PARTICULAR PURPOSE. See the GNU General Public License for more details. -import { Web3Provider } from '@ethersproject/providers'; +import type { Web3Provider } from '@ethersproject/providers'; +import type { PublicClient, WalletClient } from 'viem'; export enum WalletType { - HARDWARE = 'hardware', SDK = 'sdk', INJECTED = 'injected', } @@ -20,14 +20,14 @@ export type { Web3Provider }; export interface WalletConnectionContextProps { account?: string; chainId?: number; + /** @deprecated transitional ethers v5 provider; use publicClient/walletClient. */ library?: Web3Provider; + publicClient?: PublicClient; + walletClient?: WalletClient; error?: Error; active: boolean; activate: (...a: any) => Promise; deactivate: () => void; - selectAccount?: () => void; - tried?: boolean; - isHardwareWallet?: boolean; isGnosisSafe?: boolean; walletName?: string; walletType?: `${WalletType}`; diff --git a/src/components/wallet/ethersAdapter.ts b/src/components/wallet/ethersAdapter.ts new file mode 100644 index 00000000..a16bb60b --- /dev/null +++ b/src/components/wallet/ethersAdapter.ts @@ -0,0 +1,55 @@ +// Copyright (C) 2026 Cartesi Pte. Ltd. + +// This program is free software: you can redistribute it and/or modify it under +// the terms of the GNU General Public License as published by the Free Software +// Foundation, either version 3 of the License, or (at your option) any later +// version. + +// This program is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A +// PARTICULAR PURPOSE. See the GNU General Public License for more details. + +import { ExternalProvider, Web3Provider } from '@ethersproject/providers'; +import { useEffect, useState } from 'react'; +import type { Connector } from 'wagmi'; + +/** + * Transitional bridge kept while the services layer still speaks ethers v5. + * Wraps the connector's EIP-1193 provider once per connection, with the 'any' + * network so ethers follows chain changes without a new instance (the contract + * hooks re-instantiate whenever `library` changes). Removed once every + * consumer is on viem. + */ +export const toWeb3Provider = (provider: ExternalProvider): Web3Provider => + new Web3Provider(provider, 'any'); + +export const useEthersLibrary = ( + connector?: Connector, +): Web3Provider | undefined => { + const [library, setLibrary] = useState(); + const connectorUid = connector?.uid; + + useEffect(() => { + if (!connector) { + setLibrary(undefined); + return; + } + let cancelled = false; + connector + .getProvider() + .then((provider) => { + if (!cancelled && provider) { + setLibrary(toWeb3Provider(provider as ExternalProvider)); + } + }) + .catch(() => { + if (!cancelled) setLibrary(undefined); + }); + return () => { + cancelled = true; + }; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [connectorUid]); + + return library; +}; diff --git a/src/components/wallet/provider.tsx b/src/components/wallet/provider.tsx index fb5fcb49..b650f792 100644 --- a/src/components/wallet/provider.tsx +++ b/src/components/wallet/provider.tsx @@ -11,7 +11,7 @@ import { createContext, FC, PropsWithChildren } from 'react'; import { WalletConnectionContextProps } from './definitions'; -import { useOnboard, UseOnboardProps } from './useOnboard'; +import { useWagmiWallet } from './useWagmiWallet'; const initialContextState = { active: false, @@ -22,27 +22,23 @@ const initialContextState = { export const WalletConnectionContext = createContext(initialContextState); -export interface WalletConnectionProviderProps - extends PropsWithChildren, UseOnboardProps {} - -export const WalletConnectionProvider: FC = ( - props, -) => { - const { children, chainIds, appMetaData } = props; +export const WalletConnectionProvider: FC = ({ + children, +}) => { const { library, + publicClient, + walletClient, account, chainId, error, active, - isHardwareWallet, isGnosisSafe, walletName, walletType, connectWallet, disconnectWallet, - selectAccount, - } = useOnboard({ chainIds, appMetaData }); + } = useWagmiWallet(); const activate = async () => { await connectWallet(); @@ -56,10 +52,10 @@ export const WalletConnectionProvider: FC = ( const value = active ? { library, + publicClient, + walletClient, account, chainId, - selectAccount, - isHardwareWallet, isGnosisSafe, walletName, walletType, diff --git a/src/components/wallet/useOnboard.tsx b/src/components/wallet/useOnboard.tsx deleted file mode 100644 index 6b2bd261..00000000 --- a/src/components/wallet/useOnboard.tsx +++ /dev/null @@ -1,356 +0,0 @@ -// Copyright (C) 2021 Cartesi Pte. Ltd. - -// This program is free software: you can redistribute it and/or modify it under -// the terms of the GNU General Public License as published by the Free Software -// Foundation, either version 3 of the License, or (at your option) any later -// version. - -// This program is distributed in the hope that it will be useful, but WITHOUT ANY -// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A -// PARTICULAR PURPOSE. See the GNU General Public License for more details. - -import { Web3Provider } from '@ethersproject/providers'; -import coinbaseWalletModule from '@web3-onboard/coinbase'; -import { AppMetadata, Chain } from '@web3-onboard/common'; -import Onboard, { - ConnectOptions, - InitOptions, - OnboardAPI, - WalletState, -} from '@web3-onboard/core'; -import { ConnectOptionsString } from '@web3-onboard/core/dist/types'; -import gnosisModule from '@web3-onboard/gnosis'; -import injectedModule from '@web3-onboard/injected-wallets'; -import walletConnectModule from '@web3-onboard/walletconnect'; -import { WalletConnectOptions } from '@web3-onboard/walletconnect/dist/types'; -import { ethers } from 'ethers'; -import { contains, debounce, pick } from 'lodash/fp'; -import { Dispatch, SetStateAction, useEffect, useState } from 'react'; -import useFlag from '../../hooks/useFlag'; -import { Network } from '../../utils/networks'; -import { CartesiIcon, CartesiLogo } from './cartesi-images-as-string'; -import { WalletType } from './definitions'; -import { UnsupportedNetworkError } from './errors/UnsupportedNetworkError'; - -type NetworkName = keyof typeof Network; - -const SELECTED_WALLETS = 'SELECTED_WALLETS_V2'; -const dappUrl = process.env.NEXT_PUBLIC_DAPP_URL; -const WC_PROJECT_ID = process.env - .NEXT_PUBLIC_WALLETCONNECT_PROJECT_ID as string; - -const rpcs = { - MAINNET: process.env.NEXT_PUBLIC_RPC_URL_1 || 'https://rpc.ankr.com/eth', - SEPOLIA: - process.env.NEXT_PUBLIC_RPC_URL_11155111 || - 'https://rpc.ankr.com/eth_sepolia', - LOCAL: process.env.NEXT_PUBLIC_RPC_URL_31337 || 'http://localhost:8545', -} as const; - -const getRPC = (networkName: NetworkName): string => rpcs[networkName]; - -console.info(`dapp-url: ${dappUrl}`); - -const gnosisSafeLabels = ['gnosis safe', 'safe']; -const sdkWallets = new Set([...gnosisSafeLabels]); -const injectedWallets = new Set(['metamask', 'coinbase']); - -const wcOptions: WalletConnectOptions = { - projectId: WC_PROJECT_ID, - requiredChains: [Network.MAINNET], - dappUrl, -}; - -const injectedWallet = injectedModule(); -const walletConnect = walletConnectModule(wcOptions); -const coinbase = coinbaseWalletModule({ darkMode: true }); -const gnosis = gnosisModule(); - -export const convertToHex = (num: number): string => num.toString(16); - -export const buildConfig = ( - ankrEnabled: boolean, - chainIds: string[], - appMetaData: Partial = {}, -): InitOptions => { - const chains: Chain[] = [ - { - id: `0x${convertToHex(Network.MAINNET)}`, - token: 'ETH', - label: 'Ethereum Mainnet', - rpcUrl: ankrEnabled - ? 'https://rpc.ankr.com/eth' - : getRPC('MAINNET'), - }, - { - id: `0x${convertToHex(Network.LOCAL)}`, - token: 'ETH', - label: 'localhost', - rpcUrl: getRPC('LOCAL'), - }, - { - id: `0x${convertToHex(Network.SEPOLIA)}`, - token: 'ETH', - label: 'Sepolia Testnet', - rpcUrl: getRPC('SEPOLIA'), - }, - ].filter((c) => chainIds.includes(c.id)); - - return { - connect: { - removeWhereIsMyWalletWarning: true, - }, - accountCenter: { - desktop: { - enabled: false, - }, - mobile: { - enabled: false, - }, - }, - wallets: [injectedWallet, coinbase, walletConnect, gnosis], - chains, - appMetadata: { - name: 'Cartesi Blockchain Explorer', - logo: CartesiLogo, - icon: CartesiIcon, - ...appMetaData, - }, - }; -}; - -/** - * Check what type of wallet is based on its label e.g. Safe - */ -export const getWalletType = (label = ''): WalletType | null => { - const name = label.toLocaleLowerCase(); - return injectedWallets.has(name) - ? WalletType.INJECTED - : sdkWallets.has(name) - ? WalletType.SDK - : null; -}; - -export const checkNetwork = ( - chainId: number, - supportedNetworks: number[], -): Error | null | undefined => { - let error; - - if (chainId) { - const isSupported = contains(chainId, supportedNetworks); - error = !isSupported - ? new UnsupportedNetworkError(chainId, supportedNetworks) - : null; - } - return error; -}; - -export const handlerBuilder = - (stateUpdateCb: Dispatch>, chainIds: string[]) => - (wallets: WalletState[]) => { - const [connectedWallet] = wallets; - if (connectedWallet?.provider) { - const { label, chains, accounts } = connectedWallet; - const chainId = parseInt(chains[0]?.id); - // Keep account info as lowercase to match - // how that is indexed on the-graph. - const account = accounts[0]?.address?.toLowerCase(); - - const walletType = getWalletType(label); - const isHardwareWallet = WalletType.HARDWARE === walletType; - const isGnosisSafe = - WalletType.SDK === walletType && - contains(label.toLowerCase(), gnosisSafeLabels); - - const chainIdsAsNumbers = chainIds.map((id) => parseInt(id, 16)); - const error = checkNetwork(chainId, chainIdsAsNumbers); - - console.info( - `Account: ${account}\nChain id: ${chainId}\nWallet Label: ${label}`, - ); - - stateUpdateCb( - (state) => - ({ - ...state, - error, - account, - chainId, - isHardwareWallet, - isGnosisSafe, - walletType, - walletLabel: label, - }) as PropState, - ); - } else { - console.info( - `No provider for wallet label ${ - connectedWallet?.label || 'no_label_defined' - }.`, - ); - stateUpdateCb((state) => ({ - ...pick(['onboard'], state), - })); - } - }; - -interface PropState { - account?: string; - library?: Web3Provider; - chainId?: number; - error?: Error; - isHardwareWallet?: boolean; - isGnosisSafe?: boolean; - walletLabel?: string; - walletType?: `${WalletType}`; - selectAccount?: () => void; - onboard?: OnboardAPI; -} - -export interface UseOnboardProps { - chainIds: string[]; - appMetaData?: Partial; -} - -export const useOnboard = ({ chainIds, appMetaData }: UseOnboardProps) => { - const [state, setState] = useState({}); - const ankrEnabled = useFlag('ankrEnabled'); - const [isFirstNetworkChange, setFirstNetworkChange] = - useState(true); - const { - account, - library, - chainId, - error, - isHardwareWallet, - isGnosisSafe, - walletLabel, - walletType, - onboard, - } = state; - - const active = - library !== undefined && - account !== undefined && - chainId !== undefined && - !error; - - const connectWallet = async ( - options?: ConnectOptions | ConnectOptionsString, - ) => { - const wallets = await onboard?.connectWallet(options); - const [connectedWallet] = wallets ?? []; - const mainNetId = `0x${convertToHex(Network.MAINNET)}`; - - if (connectedWallet) { - window.localStorage.setItem( - SELECTED_WALLETS, - connectedWallet.label, - ); - - // Check if MainNet is supported and this is prod/staging, then prompt the user to switch to MainNet - if ( - chainIds.includes(mainNetId) && - process.env.NODE_ENV !== 'development' - ) { - onboard?.setChain({ chainId: mainNetId }); - } - } - - if (connectedWallet?.provider) { - // Instantiate the web3provider only once. - // with "any" the provider will handle the network change. - const library = new ethers.providers.Web3Provider( - connectedWallet.provider, - 'any', - ); - setState((state) => ({ ...state, library }) as PropState); - } - - return wallets; - }; - - const disconnectWallet = async () => { - const [connectedWallet] = onboard?.state.get().wallets ?? []; - const wallets = await onboard?.disconnectWallet({ - label: connectedWallet?.label, - }); - setFirstNetworkChange(true); - window.localStorage.removeItem(SELECTED_WALLETS); - return wallets; - }; - - const selectAccount = () => { - if (isHardwareWallet && walletLabel) { - connectWallet({ autoSelect: walletLabel }); - } - }; - - useEffect(() => { - const onboard = Onboard( - buildConfig(ankrEnabled, chainIds, appMetaData), - ); - setState((state) => ({ ...state, onboard })); - }, []); - - useEffect(() => { - if (onboard) { - const wallets$ = onboard.state.select('wallets'); - const debouncedHandler = debounce( - 500, - handlerBuilder(setState, chainIds), - ); - const subscription = wallets$.subscribe(debouncedHandler); - const previousWalletSelected = - window.localStorage.getItem(SELECTED_WALLETS); - - if (previousWalletSelected) - connectWallet({ autoSelect: previousWalletSelected }); - - return () => { - console.info(`Unsubscribing update events (onboard V2)`); - subscription?.unsubscribe(); - }; - } - }, [onboard, setState]); - - useEffect(() => { - if (chainId !== undefined) { - const selectedWallet = - window.localStorage.getItem(SELECTED_WALLETS); - if (selectedWallet?.toLowerCase() === 'walletconnect') { - console.log(`Network changed using ${selectedWallet}`); - if (!isFirstNetworkChange) { - // Just in case the network is changed, - // The provider will come clean when is the WalletConnect protocol. - window.location.reload(); - } else { - console.info( - 'Skipping reload because it was the first network change', - ); - setFirstNetworkChange(false); - } - } else { - console.log( - `Skipping the page reload since is not WalletConnect. The selected one is ${selectedWallet}`, - ); - } - } - }, [chainId]); - - return { - error, - chainId, - account, - library, - active, - isHardwareWallet, - isGnosisSafe, - walletName: walletLabel, - walletType, - connectWallet, - disconnectWallet, - selectAccount, - }; -}; diff --git a/src/components/wallet/useWagmiWallet.ts b/src/components/wallet/useWagmiWallet.ts new file mode 100644 index 00000000..542ebae2 --- /dev/null +++ b/src/components/wallet/useWagmiWallet.ts @@ -0,0 +1,144 @@ +// Copyright (C) 2026 Cartesi Pte. Ltd. + +// This program is free software: you can redistribute it and/or modify it under +// the terms of the GNU General Public License as published by the Free Software +// Foundation, either version 3 of the License, or (at your option) any later +// version. + +// This program is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A +// PARTICULAR PURPOSE. See the GNU General Public License for more details. + +import type { Web3Provider } from '@ethersproject/providers'; +import { useConnectModal } from '@rainbow-me/rainbowkit'; +import { useCallback, useEffect, useMemo } from 'react'; +import type { PublicClient, WalletClient } from 'viem'; +import { + useAccount, + useAccountEffect, + useDisconnect, + usePublicClient, + useSwitchChain, + useWalletClient, +} from 'wagmi'; +import { Network } from '../../utils/networks'; +import { supportedChainIds } from './chains'; +import { WalletType } from './definitions'; +import { UnsupportedNetworkError } from './errors/UnsupportedNetworkError'; +import { useEthersLibrary } from './ethersAdapter'; + +/** Key used by the previous wallet library to remember the selected wallet. */ +const LEGACY_SELECTED_WALLETS = 'SELECTED_WALLETS_V2'; + +export const checkNetwork = ( + chainId: number | undefined, + supportedNetworks: readonly number[] = supportedChainIds, +): Error | null | undefined => { + if (chainId === undefined || chainId === null) return undefined; + return supportedNetworks.includes(chainId) + ? null + : new UnsupportedNetworkError(chainId, supportedNetworks); +}; + +export const getWalletType = (connector?: { + id: string; + type: string; +}): `${WalletType}` | undefined => { + if (!connector) return undefined; + if (connector.id === 'safe') return WalletType.SDK; + if (connector.type === 'injected' || connector.id === 'metaMaskSDK') + return WalletType.INJECTED; + return undefined; +}; + +export const shouldSwitchToMainnet = ( + chainId: number | undefined, + env: string | undefined = process.env.NODE_ENV, +): boolean => + env !== 'development' && + supportedChainIds.includes(Network.MAINNET) && + chainId !== Network.MAINNET; + +export interface WagmiWallet { + error?: Error | null; + chainId?: number; + account?: string; + /** @deprecated transitional ethers v5 provider; use publicClient/walletClient. */ + library?: Web3Provider; + publicClient?: PublicClient; + walletClient?: WalletClient; + active: boolean; + isGnosisSafe: boolean; + walletName?: string; + walletType?: `${WalletType}`; + connectWallet: () => Promise; + disconnectWallet: () => void; +} + +/** + * The only place that talks to wagmi and RainbowKit. Everything else consumes + * the WalletConnectionContext through useWallet(). + */ +export const useWagmiWallet = (): WagmiWallet => { + const { address, chainId, connector, status } = useAccount(); + const { openConnectModal } = useConnectModal(); + const { disconnect } = useDisconnect(); + const { switchChainAsync } = useSwitchChain(); + const isSupported = + chainId !== undefined && supportedChainIds.includes(chainId); + const publicClient = usePublicClient({ + chainId: isSupported ? chainId : undefined, + }); + const { data: walletClient } = useWalletClient(); + const library = useEthersLibrary(connector); + + // Keep account info as lowercase to match how that is indexed on the-graph. + const account = address?.toLowerCase(); + const error = useMemo(() => checkNetwork(chainId), [chainId]); + const isGnosisSafe = connector?.id === 'safe'; + const walletName = connector?.name; + const walletType = getWalletType(connector); + const active = + status === 'connected' && + library !== undefined && + account !== undefined && + chainId !== undefined && + !error; + + useAccountEffect({ + onConnect: ({ chainId: connectedChainId }) => { + if (shouldSwitchToMainnet(connectedChainId)) { + switchChainAsync({ chainId: Network.MAINNET }).catch( + () => undefined, + ); + } + }, + }); + + useEffect(() => { + window.localStorage.removeItem(LEGACY_SELECTED_WALLETS); + }, []); + + const connectWallet = useCallback(async () => { + openConnectModal?.(); + }, [openConnectModal]); + + const disconnectWallet = useCallback(() => { + disconnect(); + }, [disconnect]); + + return { + error, + chainId, + account, + library, + publicClient, + walletClient, + active, + isGnosisSafe, + walletName, + walletType, + connectWallet, + disconnectWallet, + }; +}; diff --git a/src/styles/onboard.ts b/src/styles/onboard.ts deleted file mode 100644 index 7ffcd85b..00000000 --- a/src/styles/onboard.ts +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright (C) 2022 Cartesi Pte. Ltd. - -// This program is free software: you can redistribute it and/or modify it under -// the terms of the GNU General Public License as published by the Free Software -// Foundation, either version 3 of the License, or (at your option) any later -// version. - -// This program is distributed in the hope that it will be useful, but WITHOUT ANY -// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A -// PARTICULAR PURPOSE. See the GNU General Public License for more details. - -import { colors } from './foundations/colors'; -import { zIndices } from './foundations/zIndices'; - -const grayColour = colors.dark.gray.quaternary.value; -const white = colors.white.value; - -const LEDGER_MODAL = '.ledger-ck-modal > #ModalWrapper'; - -export const onboardTheme = { - [LEDGER_MODAL]: { - zIndex: zIndices.xxl.value, - }, - ':root': { - '--onboard-font-family-normal': 'var(--chakra-fonts-body)', - '--onboard-font-family-semibold': 'var(--chakra-fonts-body)', - '--onboard-font-family-light': 'var(--chakra-fonts-body)', - '--onboard-modal-z-index': zIndices.xxl.value, - '--onboard-account-select-modal-z-index': zIndices.xxl.value, - '--onboard-link-color': colors.light.primary.value, - '--wcm-z-index': `${1060} !important`, - '--w3m-z-index': `${1060} !important`, - }, - ':root.dark': { - '--onboard-connect-sidebar-background': grayColour, - '--onboard-connect-sidebar-color': white, - '--onboard-connect-sidebar-progress-background': white, - '--onboard-connect-sidebar-progress-color': grayColour, - '--onboard-connect-header-background': grayColour, - '--onboard-connect-header-color': white, - '--onboard-close-button-background': grayColour, - '--onboard-close-button-color': white, - '--onboard-wallet-button-background-hover': colors.gray1.value, - // Color pallet - '--onboard-black': white, - '--onboard-link-color': colors.dark.primary.value, - }, -}; diff --git a/src/styles/onboardTheme.ts b/src/styles/onboardTheme.ts deleted file mode 100644 index bca426e6..00000000 --- a/src/styles/onboardTheme.ts +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright (C) 2022 Cartesi Pte. Ltd. - -// This program is free software: you can redistribute it and/or modify it under -// the terms of the GNU General Public License as published by the Free Software -// Foundation, either version 3 of the License, or (at your option) any later -// version. - -// This program is distributed in the hope that it will be useful, but WITHOUT ANY -// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A -// PARTICULAR PURPOSE. See the GNU General Public License for more details. - -import { colors } from './foundations/colors'; -import { fonts } from './foundations/fonts'; -import { zIndices } from './foundations/zIndices'; - -const CUSTOM_CLASS = '.bn-onboard-custom'; -const MODAL = `${CUSTOM_CLASS}.bn-onboard-modal`; -const MODAL_CONTENT = `${CUSTOM_CLASS}.bn-onboard-modal-content`; -const DARK_MODE = '.bn-onboard-dark-mode'; -const ACCOUNT_SELECT = `${CUSTOM_CLASS}.bn-onboard-account-select`; -const ACCOUNT_SELECT_LOAD_MORE = `${ACCOUNT_SELECT} + button`; -const WALLET_CHECK_SECTION = `${CUSTOM_CLASS}.bn-onboard-wallet-check-section`; -const WALLET_CHECK_SECTION_WRAPPER = `${WALLET_CHECK_SECTION} > div`; - -export const onboardTheme = { - [MODAL]: { - fontFamily: fonts.body.value, - zIndex: zIndices.lg.value, - }, - [`${MODAL_CONTENT}${DARK_MODE}`]: { - background: colors.gray[800].value, - }, - [WALLET_CHECK_SECTION_WRAPPER]: { - width: '100%', - }, - [ACCOUNT_SELECT]: { - maxWidth: '81%', - backgroundColor: { - base: 'white', - _dark: 'gray.800', - }, - }, - [ACCOUNT_SELECT_LOAD_MORE]: { - display: 'inline-block !important', - flexGrow: 1, - height: '2.5rem !important', - }, -}; diff --git a/src/styles/theme.ts b/src/styles/theme.ts index 6606eb07..5c31e793 100644 --- a/src/styles/theme.ts +++ b/src/styles/theme.ts @@ -11,8 +11,6 @@ import { createSystem, defaultConfig } from '@chakra-ui/react'; import { formsTheme } from './formsTheme'; -import { onboardTheme } from './onboard'; -import { onboardTheme as onboardThemeV1 } from './onboardTheme'; import { colors } from './foundations/colors'; import { fonts } from './foundations/fonts'; import { zIndices } from './foundations/zIndices'; @@ -36,8 +34,6 @@ const theme = createSystem(defaultConfig, { _dark: 'white', }, }, - ...onboardThemeV1, - ...onboardTheme, ...formsTheme, }, theme: { From 0110c1be1f1b7fbd266b40d75c7eb52354bf9178 Mon Sep 17 00:00:00 2001 From: Bruno Menezes Date: Thu, 8 Oct 2026 15:07:00 +0100 Subject: [PATCH 03/10] chore: Remove web3-onboard and eth-chains. --- package.json | 8 - pnpm-lock.yaml | 1464 +----------------------------------------------- 2 files changed, 28 insertions(+), 1444 deletions(-) diff --git a/package.json b/package.json index c4ec0d6b..2d41257b 100644 --- a/package.json +++ b/package.json @@ -45,17 +45,9 @@ "@supercharge/promise-pool": "3.3.0", "@tanstack/react-query": "^5.104.0", "@vercel/speed-insights": "^2.0.0", - "@web3-onboard/coinbase": "^2.4.2", - "@web3-onboard/common": "^2.4.2", - "@web3-onboard/core": "^2.24.1", - "@web3-onboard/gnosis": "^2.3.2", - "@web3-onboard/injected-wallets": "^2.11.3", - "@web3-onboard/react": "^2.11.0", - "@web3-onboard/walletconnect": "^2.6.2", "chart.js": "^4.5.1", "date-fns": "^4.4.0", "drizzle-orm": "^0.45.2", - "eth-chains": "^2.0.0", "eth-rpc-errors": "^4.0.3", "ethers": "^5.8.0", "framer-motion": "^13.3.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a5fb7938..1c25726a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -72,27 +72,6 @@ importers: '@vercel/speed-insights': specifier: ^2.0.0 version: 2.0.0(next@16.3.5(@babel/core@8.0.5)(@types/node@24.13.4)(babel-plugin-macros@3.1.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(react@19.3.0)(svelte@3.55.0) - '@web3-onboard/coinbase': - specifier: ^2.4.2 - version: 2.4.2(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76) - '@web3-onboard/common': - specifier: ^2.4.2 - version: 2.4.2(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76) - '@web3-onboard/core': - specifier: ^2.24.1 - version: 2.24.1(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76) - '@web3-onboard/gnosis': - specifier: ^2.3.2 - version: 2.3.2(@safe-global/safe-apps-provider@0.18.6(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76))(@safe-global/safe-apps-sdk@9.1.0(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76))(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76) - '@web3-onboard/injected-wallets': - specifier: ^2.11.3 - version: 2.11.3(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76) - '@web3-onboard/react': - specifier: ^2.11.0 - version: 2.11.0(bufferutil@4.0.9)(react@19.3.0)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76) - '@web3-onboard/walletconnect': - specifier: ^2.6.2 - version: 2.6.2(@types/react@19.3.0)(bufferutil@4.0.9)(encoding@0.1.13)(react@19.3.0)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76) chart.js: specifier: ^4.5.1 version: 4.5.1 @@ -102,9 +81,6 @@ importers: drizzle-orm: specifier: ^0.45.2 version: 0.45.2(@libsql/client@0.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) - eth-chains: - specifier: ^2.0.0 - version: 2.0.0 eth-rpc-errors: specifier: ^4.0.3 version: 4.0.3 @@ -307,9 +283,6 @@ packages: '@adobe/css-tools@4.4.4': resolution: {integrity: sha512-Elp+iwUx5rN5+Y8xLt5/GRoG20WGoDCQ/1Fb+1LiGtvwbDavuSk0jhD/eZdckHAuzcDzccnkv+rEjyWfRx18gg==} - '@adraffy/ens-normalize@1.10.0': - resolution: {integrity: sha512-nA9XHtlAkYfJxY7bce8DcN7eKxWWCWkU+1GR9d+U6MbNpfwQp8TI7vqOsBsMcHoT4mBu2kypKoSKnghEzOOq5Q==} - '@adraffy/ens-normalize@1.11.0': resolution: {integrity: sha512-/3DDPKHqqIqxUULp8yP4zODUY1i+2xvVWsv8A79xGWdCAG+8sb0hRh0Rk2QyOJUnnbyPUAZYcpBuRe3nS2OIUg==} @@ -728,9 +701,6 @@ packages: '@coinbase/wallet-sdk@3.9.3': resolution: {integrity: sha512-N/A2DRIf0Y3PHc1XAMvbBUu4zisna6qAdqABMZwBMNEfWrXpAwx16pZGkYCLGE+Rvv1edbcB2LYDRnACNcmCiw==} - '@coinbase/wallet-sdk@4.3.0': - resolution: {integrity: sha512-T3+SNmiCw4HzDm4we9wCHCxlP0pqCiwKe4sOwPH3YAK2KSKjxPRydKu6UQJrdONFVLG7ujXvbd/6ZqmvJb8rkw==} - '@coinbase/wallet-sdk@4.3.6': resolution: {integrity: sha512-4q8BNG1ViL4mSAAvPAtpwlOs1gpC+67eQtgIwNvT3xyeyFFd+guwkc8bcX5rTmQhXpqnhzC4f0obACbP9CqMSA==} @@ -879,12 +849,6 @@ packages: resolution: {integrity: sha512-FxEMIkJKnodyA1OaCUoEvbYRkoZlLZ4d/eXFu9Fh8CbBBgP5EmZxrfTRyN0qpXZ4vOvqnE5YdRdcrmUUXuU+dA==} deprecated: 'Merged into tsx: https://tsx.hirok.io' - '@esbuild/aix-ppc64@0.19.12': - resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [aix] - '@esbuild/aix-ppc64@0.25.12': resolution: {integrity: sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==} engines: {node: '>=18'} @@ -909,12 +873,6 @@ packages: cpu: [arm64] os: [android] - '@esbuild/android-arm64@0.19.12': - resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - '@esbuild/android-arm64@0.25.12': resolution: {integrity: sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==} engines: {node: '>=18'} @@ -939,12 +897,6 @@ packages: cpu: [arm] os: [android] - '@esbuild/android-arm@0.19.12': - resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==} - engines: {node: '>=12'} - cpu: [arm] - os: [android] - '@esbuild/android-arm@0.25.12': resolution: {integrity: sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==} engines: {node: '>=18'} @@ -969,12 +921,6 @@ packages: cpu: [x64] os: [android] - '@esbuild/android-x64@0.19.12': - resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - '@esbuild/android-x64@0.25.12': resolution: {integrity: sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==} engines: {node: '>=18'} @@ -999,12 +945,6 @@ packages: cpu: [arm64] os: [darwin] - '@esbuild/darwin-arm64@0.19.12': - resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - '@esbuild/darwin-arm64@0.25.12': resolution: {integrity: sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==} engines: {node: '>=18'} @@ -1029,12 +969,6 @@ packages: cpu: [x64] os: [darwin] - '@esbuild/darwin-x64@0.19.12': - resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - '@esbuild/darwin-x64@0.25.12': resolution: {integrity: sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==} engines: {node: '>=18'} @@ -1059,12 +993,6 @@ packages: cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-arm64@0.19.12': - resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - '@esbuild/freebsd-arm64@0.25.12': resolution: {integrity: sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==} engines: {node: '>=18'} @@ -1089,12 +1017,6 @@ packages: cpu: [x64] os: [freebsd] - '@esbuild/freebsd-x64@0.19.12': - resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - '@esbuild/freebsd-x64@0.25.12': resolution: {integrity: sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==} engines: {node: '>=18'} @@ -1119,12 +1041,6 @@ packages: cpu: [arm64] os: [linux] - '@esbuild/linux-arm64@0.19.12': - resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - '@esbuild/linux-arm64@0.25.12': resolution: {integrity: sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==} engines: {node: '>=18'} @@ -1149,12 +1065,6 @@ packages: cpu: [arm] os: [linux] - '@esbuild/linux-arm@0.19.12': - resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - '@esbuild/linux-arm@0.25.12': resolution: {integrity: sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==} engines: {node: '>=18'} @@ -1179,12 +1089,6 @@ packages: cpu: [ia32] os: [linux] - '@esbuild/linux-ia32@0.19.12': - resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==} - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] - '@esbuild/linux-ia32@0.25.12': resolution: {integrity: sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==} engines: {node: '>=18'} @@ -1209,12 +1113,6 @@ packages: cpu: [loong64] os: [linux] - '@esbuild/linux-loong64@0.19.12': - resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==} - engines: {node: '>=12'} - cpu: [loong64] - os: [linux] - '@esbuild/linux-loong64@0.25.12': resolution: {integrity: sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==} engines: {node: '>=18'} @@ -1239,12 +1137,6 @@ packages: cpu: [mips64el] os: [linux] - '@esbuild/linux-mips64el@0.19.12': - resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==} - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] - '@esbuild/linux-mips64el@0.25.12': resolution: {integrity: sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==} engines: {node: '>=18'} @@ -1269,12 +1161,6 @@ packages: cpu: [ppc64] os: [linux] - '@esbuild/linux-ppc64@0.19.12': - resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] - '@esbuild/linux-ppc64@0.25.12': resolution: {integrity: sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==} engines: {node: '>=18'} @@ -1299,12 +1185,6 @@ packages: cpu: [riscv64] os: [linux] - '@esbuild/linux-riscv64@0.19.12': - resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==} - engines: {node: '>=12'} - cpu: [riscv64] - os: [linux] - '@esbuild/linux-riscv64@0.25.12': resolution: {integrity: sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==} engines: {node: '>=18'} @@ -1329,12 +1209,6 @@ packages: cpu: [s390x] os: [linux] - '@esbuild/linux-s390x@0.19.12': - resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==} - engines: {node: '>=12'} - cpu: [s390x] - os: [linux] - '@esbuild/linux-s390x@0.25.12': resolution: {integrity: sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==} engines: {node: '>=18'} @@ -1359,12 +1233,6 @@ packages: cpu: [x64] os: [linux] - '@esbuild/linux-x64@0.19.12': - resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==} - engines: {node: '>=12'} - cpu: [x64] - os: [linux] - '@esbuild/linux-x64@0.25.12': resolution: {integrity: sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==} engines: {node: '>=18'} @@ -1407,12 +1275,6 @@ packages: cpu: [x64] os: [netbsd] - '@esbuild/netbsd-x64@0.19.12': - resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==} - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] - '@esbuild/netbsd-x64@0.25.12': resolution: {integrity: sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==} engines: {node: '>=18'} @@ -1455,12 +1317,6 @@ packages: cpu: [x64] os: [openbsd] - '@esbuild/openbsd-x64@0.19.12': - resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==} - engines: {node: '>=12'} - cpu: [x64] - os: [openbsd] - '@esbuild/openbsd-x64@0.25.12': resolution: {integrity: sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==} engines: {node: '>=18'} @@ -1503,12 +1359,6 @@ packages: cpu: [x64] os: [sunos] - '@esbuild/sunos-x64@0.19.12': - resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==} - engines: {node: '>=12'} - cpu: [x64] - os: [sunos] - '@esbuild/sunos-x64@0.25.12': resolution: {integrity: sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==} engines: {node: '>=18'} @@ -1533,12 +1383,6 @@ packages: cpu: [arm64] os: [win32] - '@esbuild/win32-arm64@0.19.12': - resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==} - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] - '@esbuild/win32-arm64@0.25.12': resolution: {integrity: sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==} engines: {node: '>=18'} @@ -1563,12 +1407,6 @@ packages: cpu: [ia32] os: [win32] - '@esbuild/win32-ia32@0.19.12': - resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==} - engines: {node: '>=12'} - cpu: [ia32] - os: [win32] - '@esbuild/win32-ia32@0.25.12': resolution: {integrity: sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==} engines: {node: '>=18'} @@ -1593,12 +1431,6 @@ packages: cpu: [x64] os: [win32] - '@esbuild/win32-x64@0.19.12': - resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==} - engines: {node: '>=12'} - cpu: [x64] - os: [win32] - '@esbuild/win32-x64@0.25.12': resolution: {integrity: sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==} engines: {node: '>=18'} @@ -1746,9 +1578,6 @@ packages: '@ethersproject/contracts@5.8.0': resolution: {integrity: sha512-0eFjGz9GtuAi6MZwhb4uvUM216F38xiuR0yYCjKJpNfSEy4HUM8hvqqBj9Jmm0IUz8l0xKEhWwLIhPgxNY0yvQ==} - '@ethersproject/hash@5.7.0': - resolution: {integrity: sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==} - '@ethersproject/hash@5.8.0': resolution: {integrity: sha512-ac/lBcTbEWW/VGJij0CNSw/wPcw9bSRgCB0AIBz8CvED/jfvDoV9hsIIiWfvWmFEi8RcXtlNwp2jv6ozWOsooA==} @@ -1794,9 +1623,6 @@ packages: '@ethersproject/strings@5.8.0': resolution: {integrity: sha512-qWEAk0MAvl0LszjdfnZ2uC8xbR2wdv4cDabyHiBh3Cldq/T8dPH3V4BbBsAYJUeonwD+8afVXld274Ls+Y1xXg==} - '@ethersproject/transactions@5.7.0': - resolution: {integrity: sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ==} - '@ethersproject/transactions@5.8.0': resolution: {integrity: sha512-UglxSDjByHG0TuU17bDfCemZ3AnKO2vYrL5/2n2oXvKzvb7Cz+W9gOWXKARjp2URVwcWlQlPOEQyAviKwT4AHg==} @@ -1825,21 +1651,6 @@ packages: '@floating-ui/utils@0.2.12': resolution: {integrity: sha512-HpCo8tmWzLVad5s2d19EhAz5zqrrQ6s69qd6moPMQvkOuSwDT1YgRfWSVuc4ennqrgv3OHppiOGMQ7oC13yIww==} - '@formatjs/ecma402-abstract@2.3.2': - resolution: {integrity: sha512-6sE5nyvDloULiyOMbOTJEEgWL32w+VHkZQs8S02Lnn8Y/O5aQhjOEXwWzvR7SsBE/exxlSpY2EsWZgqHbtLatg==} - - '@formatjs/fast-memoize@2.2.6': - resolution: {integrity: sha512-luIXeE2LJbQnnzotY1f2U2m7xuQNj2DA8Vq4ce1BY9ebRZaoPB1+8eZ6nXpLzsxuW5spQxr7LdCg+CApZwkqkw==} - - '@formatjs/icu-messageformat-parser@2.9.8': - resolution: {integrity: sha512-hZlLNI3+Lev8IAXuwehLoN7QTKqbx3XXwFW1jh0AdIA9XJdzn9Uzr+2LLBspPm/PX0+NLIfykj/8IKxQqHUcUQ==} - - '@formatjs/icu-skeleton-parser@1.8.12': - resolution: {integrity: sha512-QRAY2jC1BomFQHYDMcZtClqHR55EEnB96V7Xbk/UiBodsuFc5kujybzt87+qj1KqmJozFhk6n4KiT1HKwAkcfg==} - - '@formatjs/intl-localematcher@0.5.10': - resolution: {integrity: sha512-af3qATX+m4Rnd9+wHcjJ4w2ijq+rAVP3CCinJQvFv1kgSu1W6jypUmvleJxcewdxmutM8dmIRZFxO/IQBZmP2Q==} - '@gemini-wallet/core@0.3.2': resolution: {integrity: sha512-Z4aHi3ECFf5oWYWM3F1rW83GJfB9OvhBYPTmb5q+VyK3uvzvS48lwo+jwh2eOoCRWEuT/crpb9Vwp2QaS5JqgQ==} peerDependencies: @@ -1850,12 +1661,6 @@ packages: peerDependencies: graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - '@hapi/hoek@9.3.0': - resolution: {integrity: sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==} - - '@hapi/topo@5.1.0': - resolution: {integrity: sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==} - '@humanfs/core@0.19.1': resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} engines: {node: '>=18.18.0'} @@ -2279,15 +2084,9 @@ packages: cpu: [x64] os: [win32] - '@lit-labs/ssr-dom-shim@1.1.1': - resolution: {integrity: sha512-kXOeFbfCm4fFf2A3WwVEeQj55tMZa8c8/f9AKHMobQMkzNUfUj+antR3fRPaZJawsa1aZiP/Da3ndpZrwEe4rQ==} - '@lit-labs/ssr-dom-shim@1.6.0': resolution: {integrity: sha512-VHb0ALPMTlgKjM6yIxxoQNnpKyUKLD04VzeQdsiXkMqkvYlAHxq9glGLmgbb889/1GsohSOAjvQYoiBppXFqrQ==} - '@lit/reactive-element@1.6.2': - resolution: {integrity: sha512-rDfl+QnCYjuIGf5xI2sVJWdYIi56CTCwWa+nidKYX6oIuBYwUbT/vX4qbUDlHiZKJ/3FRNQ/tWJui44p6/stSA==} - '@lit/reactive-element@2.1.2': resolution: {integrity: sha512-pbCDiVMnne1lYUIaYNN5wrwQXDtHaYtg7YEFPeW+hws6U47WeFvISGUWekPGKWOP1ygrs0ef0o1VJMk1exos5A==} @@ -2391,31 +2190,6 @@ packages: resolution: {integrity: sha512-w8CVbdkDrVXFJbfBSlDfafDR6BAkpDmv1bC1UJVCoVny5tW2RKAdn9i68Xf7asYT4TnUhl/hN4zfUiKQq9II4g==} engines: {node: '>=16.0.0'} - '@motionone/animation@10.15.1': - resolution: {integrity: sha512-mZcJxLjHor+bhcPuIFErMDNyrdb2vJur8lSfMCsuCB4UyV8ILZLvK+t+pg56erv8ud9xQGK/1OGPt10agPrCyQ==} - - '@motionone/dom@10.16.2': - resolution: {integrity: sha512-bnuHdNbge1FutZXv+k7xub9oPWcF0hsu8y1HTH/qg6av58YI0VufZ3ngfC7p2xhMJMnoh0LXFma2EGTgPeCkeg==} - - '@motionone/easing@10.15.1': - resolution: {integrity: sha512-6hIHBSV+ZVehf9dcKZLT7p5PEKHGhDwky2k8RKkmOvUoYP3S+dXsKupyZpqx5apjd9f+php4vXk4LuS+ADsrWw==} - - '@motionone/generators@10.15.1': - resolution: {integrity: sha512-67HLsvHJbw6cIbLA/o+gsm7h+6D4Sn7AUrB/GPxvujse1cGZ38F5H7DzoH7PhX+sjvtDnt2IhFYF2Zp1QTMKWQ==} - - '@motionone/svelte@10.16.2': - resolution: {integrity: sha512-38xsroKrfK+aHYhuQlE6eFcGy0EwrB43Q7RGjF73j/kRUTcLNu/LAaKiLLsN5lyqVzCgTBVt4TMT/ShWbTbc5Q==} - - '@motionone/types@10.15.1': - resolution: {integrity: sha512-iIUd/EgUsRZGrvW0jqdst8st7zKTzS9EsKkP+6c6n4MPZoQHwiHuVtTQLD6Kp0bsBLhNzKIBlHXponn/SDT4hA==} - - '@motionone/utils@10.15.1': - resolution: {integrity: sha512-p0YncgU+iklvYr/Dq4NobTRdAPv9PveRDUXabPEeOjBLSO/1FNB2phNTZxOxpi1/GZwYpAoECEa0Wam+nsmhSw==} - - '@motionone/vue@10.16.2': - resolution: {integrity: sha512-7/dEK/nWQXOkJ70bqb2KyNfSWbNvWqKKq1C8juj+0Mg/AorgD8O5wE3naddK0G+aXuNMqRuc4jlsYHHWHtIzVw==} - deprecated: Motion One for Vue is deprecated. Use Oku Motion instead https://oku-ui.com/motion - '@napi-rs/wasm-runtime@1.2.4': resolution: {integrity: sha512-AJxoUD2/15ESHbvpcyjU274nsAPLuOtPHCk0vKJM5pj//Fg/B1FXNWjPnXTT9PymCYYiHo4zPj0ZomXBKhoy7g==} engines: {node: ^20.19.0 || ^22.13.0 || >=23.5.0} @@ -2492,9 +2266,6 @@ packages: resolution: {integrity: sha512-2I0gnIVPtfnMw9ee9h1dJG7tp81+8Ob3OJb3Mv37rx5L40/b0i7djjCVvGOVqc9AEIQyvyu1i6ypKdFw8R8gQw==} engines: {node: ^14.21.3 || >=16} - '@noble/curves@1.2.0': - resolution: {integrity: sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==} - '@noble/curves@1.4.2': resolution: {integrity: sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==} @@ -2517,10 +2288,6 @@ packages: '@noble/hashes@1.2.0': resolution: {integrity: sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ==} - '@noble/hashes@1.3.2': - resolution: {integrity: sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==} - engines: {node: '>= 16'} - '@noble/hashes@1.3.3': resolution: {integrity: sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA==} engines: {node: '>= 16'} @@ -3355,9 +3122,6 @@ packages: '@scure/bip32@1.1.5': resolution: {integrity: sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw==} - '@scure/bip32@1.3.2': - resolution: {integrity: sha512-N1ZhksgwD3OBlwTv3R6KFEcPojl/W4ElJOeCZdi+vuI5QmTFwLq3OFf2zd2ROpKvxFdgZ6hUpb0dx9bVNEwYCA==} - '@scure/bip32@1.4.0': resolution: {integrity: sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg==} @@ -3373,9 +3137,6 @@ packages: '@scure/bip39@1.1.1': resolution: {integrity: sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg==} - '@scure/bip39@1.2.1': - resolution: {integrity: sha512-Z3/Fsz1yr904dduJD0NpiyRHhRYHdcnyh73FZWiV+/qhWi83wNJ3NWolYqCEN+ZWsUz2TWwajJggcRE9r1zUYg==} - '@scure/bip39@1.3.0': resolution: {integrity: sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ==} @@ -3416,15 +3177,6 @@ packages: resolution: {integrity: sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww==} engines: {node: '>=6'} - '@sideway/address@4.1.4': - resolution: {integrity: sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==} - - '@sideway/formula@3.0.1': - resolution: {integrity: sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==} - - '@sideway/pinpoint@2.0.0': - resolution: {integrity: sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==} - '@sinclair/typebox@0.34.41': resolution: {integrity: sha512-6gS8pZzSXdyRHTIqoqSVknxolr1kzfy4/CeDnrzsVz8TTIWUbOBr6gnzOmTYJ3eXQNh4IYHIGi5aIL7sOZ2G/g==} @@ -3814,60 +3566,6 @@ packages: typescript: optional: true - '@stablelib/aead@1.0.1': - resolution: {integrity: sha512-q39ik6sxGHewqtO0nP4BuSe3db5G1fEJE8ukvngS2gLkBXyy6E7pLubhbYgnkDFv6V8cWaxcE4Xn0t6LWcJkyg==} - - '@stablelib/binary@1.0.1': - resolution: {integrity: sha512-ClJWvmL6UBM/wjkvv/7m5VP3GMr9t0osr4yVgLZsLCOz4hGN9gIAFEqnJ0TsSMAN+n840nf2cHZnA5/KFqHC7Q==} - - '@stablelib/bytes@1.0.1': - resolution: {integrity: sha512-Kre4Y4kdwuqL8BR2E9hV/R5sOrUj6NanZaZis0V6lX5yzqC3hBuVSDXUIBqQv/sCpmuWRiHLwqiT1pqqjuBXoQ==} - - '@stablelib/chacha20poly1305@1.0.1': - resolution: {integrity: sha512-MmViqnqHd1ymwjOQfghRKw2R/jMIGT3wySN7cthjXCBdO+qErNPUBnRzqNpnvIwg7JBCg3LdeCZZO4de/yEhVA==} - - '@stablelib/chacha@1.0.1': - resolution: {integrity: sha512-Pmlrswzr0pBzDofdFuVe1q7KdsHKhhU24e8gkEwnTGOmlC7PADzLVxGdn2PoNVBBabdg0l/IfLKg6sHAbTQugg==} - - '@stablelib/constant-time@1.0.1': - resolution: {integrity: sha512-tNOs3uD0vSJcK6z1fvef4Y+buN7DXhzHDPqRLSXUel1UfqMB1PWNsnnAezrKfEwTLpN0cGH2p9NNjs6IqeD0eg==} - - '@stablelib/ed25519@1.0.3': - resolution: {integrity: sha512-puIMWaX9QlRsbhxfDc5i+mNPMY+0TmQEskunY1rZEBPi1acBCVQAhnsk/1Hk50DGPtVsZtAWQg4NHGlVaO9Hqg==} - - '@stablelib/hash@1.0.1': - resolution: {integrity: sha512-eTPJc/stDkdtOcrNMZ6mcMK1e6yBbqRBaNW55XA1jU8w/7QdnCF0CmMmOD1m7VSkBR44PWrMHU2l6r8YEQHMgg==} - - '@stablelib/hkdf@1.0.1': - resolution: {integrity: sha512-SBEHYE16ZXlHuaW5RcGk533YlBj4grMeg5TooN80W3NpcHRtLZLLXvKyX0qcRFxf+BGDobJLnwkvgEwHIDBR6g==} - - '@stablelib/hmac@1.0.1': - resolution: {integrity: sha512-V2APD9NSnhVpV/QMYgCVMIYKiYG6LSqw1S65wxVoirhU/51ACio6D4yDVSwMzuTJXWZoVHbDdINioBwKy5kVmA==} - - '@stablelib/int@1.0.1': - resolution: {integrity: sha512-byr69X/sDtDiIjIV6m4roLVWnNNlRGzsvxw+agj8CIEazqWGOQp2dTYgQhtyVXV9wpO6WyXRQUzLV/JRNumT2w==} - - '@stablelib/keyagreement@1.0.1': - resolution: {integrity: sha512-VKL6xBwgJnI6l1jKrBAfn265cspaWBPAPEc62VBQrWHLqVgNRE09gQ/AnOEyKUWrrqfD+xSQ3u42gJjLDdMDQg==} - - '@stablelib/poly1305@1.0.1': - resolution: {integrity: sha512-1HlG3oTSuQDOhSnLwJRKeTRSAdFNVB/1djy2ZbS35rBSJ/PFqx9cf9qatinWghC2UbfOYD8AcrtbUQl8WoxabA==} - - '@stablelib/random@1.0.2': - resolution: {integrity: sha512-rIsE83Xpb7clHPVRlBj8qNe5L8ISQOzjghYQm/dZ7VaM2KHYwMW5adjQjrzTZCchFnNCNhkwtnOBa9HTMJCI8w==} - - '@stablelib/sha256@1.0.1': - resolution: {integrity: sha512-GIIH3e6KH+91FqGV42Kcj71Uefd/QEe7Dy42sBTeqppXV95ggCcxLTk39bEr+lZfJmp+ghsR07J++ORkRELsBQ==} - - '@stablelib/sha512@1.0.1': - resolution: {integrity: sha512-13gl/iawHV9zvDKciLo1fQ8Bgn2Pvf7OV6amaRVKiq3pjQ3UmEpXxWiAfV8tYjUpeZroBxtyrwtdooQT/i3hzw==} - - '@stablelib/wipe@1.0.1': - resolution: {integrity: sha512-WfqfX/eXGiAd3RJe4VU2snh/ZPwtSjLG4ynQ/vYzvghTh7dHFcI1wl+nrkWG6lGhukOxOsUHfv8dUXr58D0ayg==} - - '@stablelib/x25519@1.0.3': - resolution: {integrity: sha512-KnTbKmUhPhHavzobclVJQG5kuivH+qDLpe84iRqX3CLrKp881cF160JvXJ+hjn1aMyCwYOKeIZefIH/P5cJoRw==} - '@standard-schema/spec@1.0.0': resolution: {integrity: sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==} @@ -4543,10 +4241,6 @@ packages: typescript: optional: true - '@walletconnect/core@2.17.3': - resolution: {integrity: sha512-57uv0FW4L6H/tmkb1kS2nG41MDguyDgZbGR58nkDUd1TO/HydyiTByVOhFzIxgN331cnY/1G1rMaKqncgdnOFA==} - engines: {node: '>=18'} - '@walletconnect/core@2.21.0': resolution: {integrity: sha512-o6R7Ua4myxR8aRUAJ1z3gT9nM+jd2B2mfamu6arzy1Cc6vi10fIwFWb6vg3bC8xJ6o9H3n/cN5TOW3aA9Y1XVw==} engines: {node: '>=18'} @@ -4558,10 +4252,6 @@ packages: '@walletconnect/environment@1.0.1': resolution: {integrity: sha512-T426LLZtHj8e8rYnKfzsw1aG6+M0BT1ZxayMdv/p8yM0MU+eJDISqNY3/bccxRr4LrF9csq02Rhqt08Ibl0VRg==} - '@walletconnect/ethereum-provider@2.17.3': - resolution: {integrity: sha512-fgoT+dT9M1P6IIUtBl66ddD+4IJYqdhdAYkW+wa6jbctxKlHYSXf9HsgF/Vvv9lMnxHdAIz0W9VN4D/m20MamA==} - deprecated: 'Reliability and performance improvements. See: https://github.com/WalletConnect/walletconnect-monorepo/releases' - '@walletconnect/ethereum-provider@2.21.1': resolution: {integrity: sha512-SSlIG6QEVxClgl1s0LMk4xr2wg4eT3Zn/Hb81IocyqNSGfXpjtawWxKxiC5/9Z95f1INyBD6MctJbL/R1oBwIw==} deprecated: 'Reliability and performance improvements. See: https://github.com/WalletConnect/walletconnect-monorepo/releases' @@ -4598,32 +4288,15 @@ packages: '@walletconnect/logger@2.1.2': resolution: {integrity: sha512-aAb28I3S6pYXZHQm5ESB+V6rDqIYfsnHaQyzFbwUUBFY4H0OXx/YtTl8lvhUNhMMfb9UxbwEBS253TlXUYJWSw==} - '@walletconnect/modal-core@2.7.0': - resolution: {integrity: sha512-oyMIfdlNdpyKF2kTJowTixZSo0PGlCJRdssUN/EZdA6H6v03hZnf09JnwpljZNfir2M65Dvjm/15nGrDQnlxSA==} - - '@walletconnect/modal-ui@2.7.0': - resolution: {integrity: sha512-gERYvU7D7K1ANCN/8vUgsE0d2hnRemfAFZ2novm9aZBg7TEd/4EgB+AqbJ+1dc7GhOL6dazckVq78TgccHb7mQ==} - - '@walletconnect/modal@2.7.0': - resolution: {integrity: sha512-RQVt58oJ+rwqnPcIvRFeMGKuXb9qkgSmwz4noF8JZGUym3gUAzVs+uW2NQ1Owm9XOJAV+sANrtJ+VoVq1ftElw==} - deprecated: Please follow the migration guide on https://docs.reown.com/appkit/upgrade/wcm - '@walletconnect/relay-api@1.0.11': resolution: {integrity: sha512-tLPErkze/HmC9aCmdZOhtVmYZq1wKfWTJtygQHoWtgg722Jd4homo54Cs4ak2RUFUZIGO2RsOpIcWipaua5D5Q==} - '@walletconnect/relay-auth@1.0.4': - resolution: {integrity: sha512-kKJcS6+WxYq5kshpPaxGHdwf5y98ZwbfuS4EE/NkQzqrDFm5Cj+dP8LofzWvjrrLkZq7Afy7WrQMXdLy8Sx7HQ==} - '@walletconnect/relay-auth@1.1.0': resolution: {integrity: sha512-qFw+a9uRz26jRCDgL7Q5TA9qYIgcNY8jpJzI1zAWNZ8i7mQjaijRnWFKsCHAU9CyGjvt6RKrRXyFtFOpWTVmCQ==} '@walletconnect/safe-json@1.0.2': resolution: {integrity: sha512-Ogb7I27kZ3LPC3ibn8ldyUr5544t3/STow9+lzz7Sfo808YD7SBWk7SAsdBFlYgP2zDRy2hS3sKRcuSRM0OTmA==} - '@walletconnect/sign-client@2.17.3': - resolution: {integrity: sha512-OzOWxRTfVGCHU3OOF6ibPkgPfDpivFJjuknfcOUt9PYWpTAv6YKOmT4cyfBPhc7llruyHpV44fYbykMcLIvEcg==} - deprecated: 'Reliability and performance improvements. See: https://github.com/WalletConnect/walletconnect-monorepo/releases' - '@walletconnect/sign-client@2.21.0': resolution: {integrity: sha512-z7h+PeLa5Au2R591d/8ZlziE0stJvdzP9jNFzFolf2RG/OiXulgFKum8PrIyXy+Rg2q95U9nRVUF9fWcn78yBA==} deprecated: 'Reliability and performance improvements. See: https://github.com/WalletConnect/walletconnect-monorepo/releases' @@ -4635,19 +4308,12 @@ packages: '@walletconnect/time@1.0.2': resolution: {integrity: sha512-uzdd9woDcJ1AaBZRhqy5rNC9laqWGErfc4dxA9a87mPdKOgWMD85mcFo9dIYIts/Jwocfwn07EC6EzclKubk/g==} - '@walletconnect/types@2.17.3': - resolution: {integrity: sha512-5eFxnbZGJJx0IQyCS99qz+OvozpLJJYfVG96dEHGgbzZMd+C9V1eitYqVClx26uX6V+WQVqVwjpD2Dyzie++Wg==} - '@walletconnect/types@2.21.0': resolution: {integrity: sha512-ll+9upzqt95ZBWcfkOszXZkfnpbJJ2CmxMfGgE5GmhdxxxCcO5bGhXkI+x8OpiS555RJ/v/sXJYMSOLkmu4fFw==} '@walletconnect/types@2.21.1': resolution: {integrity: sha512-UeefNadqP6IyfwWC1Yi7ux+ljbP2R66PLfDrDm8izmvlPmYlqRerJWJvYO4t0Vvr9wrG4Ko7E0c4M7FaPKT/sQ==} - '@walletconnect/universal-provider@2.17.3': - resolution: {integrity: sha512-Aen8h+vWTN57sv792i96vaTpN06WnpFUWhACY5gHrpL2XgRKmoXUgW7793p252QdgyofNAOol7wJEs1gX8FjgQ==} - deprecated: 'Reliability and performance improvements. See: https://github.com/WalletConnect/walletconnect-monorepo/releases' - '@walletconnect/universal-provider@2.21.0': resolution: {integrity: sha512-mtUQvewt+X0VBQay/xOJBvxsB3Xsm1lTwFjZ6WUwSOTR1X+FNb71hSApnV5kbsdDIpYPXeQUbGt2se1n5E5UBg==} deprecated: 'Reliability and performance improvements. See: https://github.com/WalletConnect/walletconnect-monorepo/releases' @@ -4656,9 +4322,6 @@ packages: resolution: {integrity: sha512-Wjx9G8gUHVMnYfxtasC9poGm8QMiPCpXpbbLFT+iPoQskDDly8BwueWnqKs4Mx2SdIAWAwuXeZ5ojk5qQOxJJg==} deprecated: 'Reliability and performance improvements. See: https://github.com/WalletConnect/walletconnect-monorepo/releases' - '@walletconnect/utils@2.17.3': - resolution: {integrity: sha512-tG77UpZNeLYgeOwViwWnifpyBatkPlpKSSayhN0gcjY1lZAUNqtYslpm4AdTxlrA3pL61MnyybXgWYT5eZjarw==} - '@walletconnect/utils@2.21.0': resolution: {integrity: sha512-zfHLiUoBrQ8rP57HTPXW7rQMnYxYI4gT9yTACxVW6LhIFROTF6/ytm5SKNoIvi4a5nX5dfXG4D9XwQUCu8Ilig==} @@ -4671,38 +4334,6 @@ packages: '@walletconnect/window-metadata@1.0.1': resolution: {integrity: sha512-9koTqyGrM2cqFRW517BPY/iEtUDx2r1+Pwwu5m7sJ7ka79wi3EyqhqcICk/yDmv6jAS1rjKgTKXlEhanYjijcA==} - '@web3-onboard/coinbase@2.4.2': - resolution: {integrity: sha512-XmxfM55dB/XFI173KPcvHBhXvOY5ygXxwDzdjFvIp/MhwoG6U/8xn4KVg0wavtpX9y9H7jz8jf/ur6AIAi1nmA==} - - '@web3-onboard/common@2.4.2': - resolution: {integrity: sha512-3+zkBru5W2jBYFBPPQsnqZ7tuN1GUyM5PzD9/MmhvjCLNhmjFtMQ0MkLzG4Yshodb4UW/DmZpjUVrpjdhEhj/Q==} - - '@web3-onboard/core@2.24.0': - resolution: {integrity: sha512-aFfao9ln5DMW9QSTzXHP4ymuFoJslBs3TrYR+z+5B6/lPMK1CUSe5wmPeFVaqTXs4gIGkyWByuznb9LUq/Vong==} - engines: {node: '>=16.15.1'} - - '@web3-onboard/core@2.24.1': - resolution: {integrity: sha512-IhiWF0M4BfnayLdmPoNpckjStlZ4G2N8JylJ92pf6+uWbnvhje8Svka9Oq6nfmfuU7Nbbqx3BVyivEN0kL6dyA==} - engines: {node: '>=16.15.1'} - - '@web3-onboard/gnosis@2.3.2': - resolution: {integrity: sha512-gLo/Hjli4Ymg3hBz8URAD1ffKF0H/HmyPSiGVpuqiYEGCO39m1Ol9MVscIGAtOKV3QROnkKKf6wgckiKcAupIg==} - peerDependencies: - '@safe-global/safe-apps-provider': ^0.18.2 - '@safe-global/safe-apps-sdk': ^8.0.0 - - '@web3-onboard/injected-wallets@2.11.3': - resolution: {integrity: sha512-DSfcJRwe7KgXHSosXSz8QUMpoSTd6ltrb3qb8xhDjwLdpYlSlcmhaH5blP/gvNeB38imiJ9xCQpnI5tpaLKneQ==} - - '@web3-onboard/react@2.11.0': - resolution: {integrity: sha512-aKwkVX3Xt0FshAerq1j15FYZnanEfrcNRl7SjziH8Zh/v82chixBqdPOKG7uh4lYKutIY7OAuyubPPRr/J7mzw==} - engines: {node: '>=16.15.1'} - peerDependencies: - react: '>=16.8' - - '@web3-onboard/walletconnect@2.6.2': - resolution: {integrity: sha512-eecRCcwgOHbWw2thf03EbbyFnnUsf4G2mcIhLfiWG51Vf0oGSK/QcaINlBEZpY6SK2xH5nnXJtQomLDvfbAM2A==} - '@webcontainer/env@1.1.1': resolution: {integrity: sha512-6aN99yL695Hi9SuIk1oC88l9o0gmxL1nGWWQ/kNy81HigJ0FoaoTXpytCj6ItzgyCEwA9kF1wixsTuv5cjsgng==} @@ -4965,17 +4596,6 @@ packages: '@zag-js/utils@1.43.3': resolution: {integrity: sha512-9P9fvFFxuiDcLqX0BYgGNkf0/a/id32nHvQpwgv/Xv3b9n5yeyw2U8nKefpWr+1VfFsrpf2XMXiA2CDSWZgt2g==} - abitype@1.0.0: - resolution: {integrity: sha512-NMeMah//6bJ56H5XRj8QCV4AwuW6hB6zqz2LnhhLdcWVQOsXki6/Pn3APeqxCma62nXIcmZWdu1DlHWS74umVQ==} - peerDependencies: - typescript: '>=5.0.4' - zod: ^3 >=3.22.0 - peerDependenciesMeta: - typescript: - optional: true - zod: - optional: true - abitype@1.0.6: resolution: {integrity: sha512-MMSqYh4+C/aVqI2RQaWqbvI4Kxo5cQV40WQ4QFtDnNzCkqChm8MuENhElmynZlO0qUy/ObkEUaXtKqYnx1Kp3A==} peerDependencies: @@ -5577,9 +5197,6 @@ packages: bn.js@5.2.1: resolution: {integrity: sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==} - bnc-sdk@4.6.7: - resolution: {integrity: sha512-jIQ6cmeRBgvH/YDLuYRr2+kxDGcAAi0SOvjlO5nQ5cWdbslw+ASWftd1HmxiVLNCiwEH5bSc/t8a0agZ5njTUQ==} - body-parser@1.20.3: resolution: {integrity: sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} @@ -5897,10 +5514,6 @@ packages: resolution: {integrity: sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==} engines: {node: '>=6'} - cli-color@2.0.3: - resolution: {integrity: sha512-OkoZnxyC4ERN3zLzZaY9Emb7f/MhBOIpePv0Ycok0fJYT+Ouo00UBEIwsVsr0yoow++n5YWlSUgST9GKhNHiRQ==} - engines: {node: '>=0.10'} - cli-table@0.3.11: resolution: {integrity: sha512-IqLQi4lO0nIB4tcdTpN4LCB9FI3uqrJZK7RC515EnhZ6qBaglkIgICb1wjeAqpdoOabm1+SuQtkXIPdYC93jhQ==} engines: {node: '>= 0.2.0'} @@ -6140,9 +5753,6 @@ packages: crypto-browserify@3.12.0: resolution: {integrity: sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==} - crypto-es@1.2.7: - resolution: {integrity: sha512-UUqiVJ2gUuZFmbFsKmud3uuLcNP2+Opt+5ysmljycFCyhA0+T16XJmo1ev/t5kMChMqWh7IEvURNCqsg+SjZGQ==} - css-select@5.1.0: resolution: {integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==} @@ -6796,9 +6406,6 @@ packages: es6-symbol@3.1.3: resolution: {integrity: sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==} - es6-weak-map@2.0.3: - resolution: {integrity: sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==} - esbuild-register@3.6.0: resolution: {integrity: sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg==} peerDependencies: @@ -6809,11 +6416,6 @@ packages: engines: {node: '>=12'} hasBin: true - esbuild@0.19.12: - resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==} - engines: {node: '>=12'} - hasBin: true - esbuild@0.25.12: resolution: {integrity: sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==} engines: {node: '>=18'} @@ -6984,9 +6586,6 @@ packages: resolution: {integrity: sha512-8YdplnuE1IK4xfqpf4iU7oBxnOYAc35934o083G8ao+8WM8QQtt/mVlAY6yIAdY1eMeLqg4Z//PZjJGmWGPMRg==} engines: {node: '>=14.0.0'} - eth-chains@2.0.0: - resolution: {integrity: sha512-TSfA9sYwEenQF+8/+T9DAnhCGB3yy7/Rl9J2QpibD9Bax8Btu3uTOW5mGIp7kh4gYyeozDxK7zHKBiB5upWU1w==} - eth-ens-namehash@2.0.8: resolution: {integrity: sha512-VWEI1+KJfz4Km//dadyvBBoBeSQ0MHTXPvr8UIXiLW6IanxvAV+DmlZAijZwAyggqGUfwQBeHf7tc9wzc1piSw==} @@ -7138,9 +6737,6 @@ packages: eventemitter3@4.0.4: resolution: {integrity: sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==} - eventemitter3@4.0.7: - resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} - eventemitter3@5.0.1: resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} @@ -7588,9 +7184,6 @@ packages: resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} engines: {node: '>= 0.4'} - globalyzer@0.1.0: - resolution: {integrity: sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==} - globby@16.2.0: resolution: {integrity: sha512-QrJia2qDf5BB/V6HYlDTs0I0lBahyjLzpGQg3KT7FnCdTonAyPy2RtY802m2k4ALx6Dp752f82WsOczEVr3l6Q==} engines: {node: '>=20'} @@ -7753,9 +7346,6 @@ packages: hermes-parser@0.25.1: resolution: {integrity: sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==} - hey-listen@1.0.8: - resolution: {integrity: sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q==} - highlight.js@10.7.3: resolution: {integrity: sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==} @@ -7916,9 +7506,6 @@ packages: resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} engines: {node: '>=12'} - intl-messageformat@10.7.11: - resolution: {integrity: sha512-IB2N1tmI24k2EFH3PWjU7ivJsnWyLwOWOva0jnXFa29WzB6fb0JZ5EMQGu+XN5lDtjHYFo0/UooP67zBwUg7rQ==} - invariant@2.2.4: resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} @@ -8158,9 +7745,6 @@ packages: resolution: {integrity: sha512-N3w1tFaRfk3UrPfqeRyD+GYDASU3W5VinKhlORy8EWVf/sIdDL9GAcew85XmktCfH+ngG7SRXEVDoO18WMdB/Q==} engines: {node: '>=0.10.0'} - is-promise@2.2.2: - resolution: {integrity: sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==} - is-regex@1.1.4: resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} engines: {node: '>= 0.4'} @@ -8268,11 +7852,6 @@ packages: resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} engines: {node: '>=0.10.0'} - isows@1.0.4: - resolution: {integrity: sha512-hEzjY+x9u9hPmBom9IIAqdJCwNLax+xrPb51vEPpERoFlIxgmZcHzsT5jKG06nvInKOBGvReAVz80Umed5CczQ==} - peerDependencies: - ws: '*' - isows@1.0.6: resolution: {integrity: sha512-lPHCayd40oW98/I0uvgaHKWCSvkzY27LjWLbtzOm64yQ+G3Q5npjjbdppU65iZXkK1Zt+kH9pfegli0AYfwYYw==} peerDependencies: @@ -8475,9 +8054,6 @@ packages: node-notifier: optional: true - joi@17.9.1: - resolution: {integrity: sha512-FariIi9j6QODKATGBrEX7HZcja8Bsh3rfdGYy/Sb65sGlZWK/QWesU1ghk7aJWDj95knjXlQfSmzFSPPkLVsfw==} - jose@6.2.12: resolution: {integrity: sha512-9NiFmJEex0sy2Dk58j2UGBSHgUs2ypF9eZSu4L6vjOX3Dp96Sw1F3uL+H+D1sx02jZZdzUT0HgvCy59CuvXcWw==} @@ -8830,21 +8406,12 @@ packages: lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - lit-element@3.3.2: - resolution: {integrity: sha512-xXAeVWKGr4/njq0rGC9dethMnYCq5hpKYrgQZYTzawt9YQhMiXfD+T1RgrdY3NamOxwq2aXlb0vOI6e29CKgVQ==} - lit-element@4.2.2: resolution: {integrity: sha512-aFKhNToWxoyhkNDmWZwEva2SlQia+jfG0fjIWV//YeTaWrVnOxD89dPKfigCUspXFmjzOEUQpOkejH5Ly6sG0w==} - lit-html@2.8.0: - resolution: {integrity: sha512-o9t+MQM3P4y7M7yNzqAyjp7z+mQGa4NS4CxiyLqFPyFWyc4O+nodLrkrxSaCTrla6M5YOLaT3RpbbqjszB5g3Q==} - lit-html@3.3.3: resolution: {integrity: sha512-el8M6jK2o3RXBnrSHX3ZKrsN8zEV63pSExTO1wYJz7QndGYZ8353e2a5PPX+qHe2aGayfnchQmkAojaWAREOIA==} - lit@2.8.0: - resolution: {integrity: sha512-4Sc3OFX9QHOJaHbmTMk28SYgVxLN3ePDjg7hofEft2zWlehFL3LiAuapWc4U/kYwMYJSh2hTCPZ6/LIC7ii0MA==} - lit@3.3.0: resolution: {integrity: sha512-DGVsqsOIHBww2DqnuZzW7QsuCdahp50ojuDaBPC7jUDRpYoH0z7kHBBYZewRzer75FwtrkmkKk7iOAwSaWdBmw==} @@ -8867,9 +8434,6 @@ packages: lodash.assign@4.2.0: resolution: {integrity: sha512-hFuH8TY+Yji7Eja3mGiuAxBqLagejScbG8GbG0j6o9vzn0YL14My+ktnqtZgFTosKymC9/44wP6s7xyuLfnClw==} - lodash.defaults@4.2.0: - resolution: {integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==} - lodash.isequal@4.5.0: resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} deprecated: This package is deprecated. Use require('node:util').isDeepStrictEqual instead. @@ -8877,18 +8441,9 @@ packages: lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - lodash.partition@4.6.0: - resolution: {integrity: sha512-35L3dSF3Q6V1w5j6V3NhNlQjzsRDC/pYKCTdYTmwqSib+Q8ponkAmt/PwEOq3EmI38DSCl+SkIVwLd+uSlVdrg==} - - lodash.uniqby@4.7.0: - resolution: {integrity: sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww==} - lodash@4.17.20: resolution: {integrity: sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==} - lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - lodash@4.18.1: resolution: {integrity: sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==} @@ -8949,9 +8504,6 @@ packages: lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} - lru-queue@0.1.0: - resolution: {integrity: sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==} - lru_map@0.3.3: resolution: {integrity: sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ==} @@ -9016,9 +8568,6 @@ packages: engines: {node: '>=6'} deprecated: Superseded by memory-level (https://github.com/Level/community#faq) - memoizee@0.4.15: - resolution: {integrity: sha512-UBWmJpLZd5STPm7PMUlOw/TSy972M+z8gcyQ5veOnSDRREz/0bmpyTfKt3/51DhEBqCZQn1udM/5flcSPYhkdQ==} - memorystream@0.3.1: resolution: {integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==} engines: {node: '>= 0.10.0'} @@ -9216,13 +8765,6 @@ packages: motion-utils@13.3.0: resolution: {integrity: sha512-sgSschQp7EseHInIlR7hBbMuvet3RA0bs28KPZAXJcGKGdxHGvh1ogpYDilY3bOMtl73EqPNmp75sAKHYPU5sg==} - motion@10.16.2: - resolution: {integrity: sha512-p+PurYqfUdcJZvtnmAqu5fJgV2kR0uLFQuBKtLeFVTrYEVllI99tiOTSefVNYuip9ELTEkepIIDftNdze76NAQ==} - - mri@1.2.0: - resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} - engines: {node: '>=4'} - ms@2.0.0: resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} @@ -9266,21 +8808,11 @@ packages: nano-json-stream-parser@0.1.2: resolution: {integrity: sha512-9MqxMH/BSJC7dnLsEMPyfN5Dvoo49IsPFYMcHw3Bcfc2kN0lpHRBSzlMSVx4HGyJ7s9B31CyBTVehWJoQ8Ctew==} - nanoid@3.3.11: - resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - nanoid@3.3.19: resolution: {integrity: sha512-Y2tUNy4ouw6tq5oDSKeQYGOyhkUBhNOcGV/02KC+6kd9eDGqdZd++mjMiIDilrBYvjEnCYvVtsuHCuP+okSfug==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - nanoid@4.0.0: - resolution: {integrity: sha512-IgBP8piMxe/gf73RTQx7hmnhwz0aaEXYakvqZyE302IXW3HyVNhdNGC+O2MwMAVhLEnvXlvKtGbtJf6wvHihCg==} - engines: {node: ^14 || ^16 || >=18} - hasBin: true - nanomatch@1.2.13: resolution: {integrity: sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==} engines: {node: '>=0.10.0'} @@ -10017,9 +9549,6 @@ packages: resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} engines: {node: '>= 0.10'} - proxy-compare@2.5.1: - resolution: {integrity: sha512-oyfc0Tx87Cpwva5ZXezSp5V9vht1c7dZBhvuV/y3ctkgMVUmiAGDVeeB0dKhGSyT0v1ZTEQYpe/RXlBVBNuCLA==} - proxy-compare@2.6.0: resolution: {integrity: sha512-8xuCeM3l8yqdmbPoYeLbrAXCBWu19XEYc5/F28f5qOaoAIMyfmBUkl5axiK+x9olUvRlcekvnm98AP9RDngOIw==} @@ -10495,17 +10024,9 @@ packages: rustbn.js@0.2.0: resolution: {integrity: sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA==} - rxjs@6.6.7: - resolution: {integrity: sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==} - engines: {npm: '>=2.0.0'} - rxjs@7.8.2: resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==} - sade@1.8.1: - resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} - engines: {node: '>=6'} - safe-array-concat@1.1.3: resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} engines: {node: '>=0.4'} @@ -11000,9 +10521,6 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} - sturdy-websocket@0.1.12: - resolution: {integrity: sha512-PA7h8LdjaMoIlC5HAwLVzae4raGWgyroscV4oUpEiTtEFINcNa47/CKYT3e98o+FfsJgrclI2pYpaJrz0aaoew==} - styled-jsx@5.1.6: resolution: {integrity: sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==} engines: {node: '>= 12.0.0'} @@ -11047,13 +10565,6 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} - svelte-i18n@4.0.1: - resolution: {integrity: sha512-jaykGlGT5PUaaq04JWbJREvivlCnALtT+m87Kbm0fxyYHynkQaxQMnIKHLm2WeIuBRoljzwgyvz0Z6/CMwfdmQ==} - engines: {node: '>= 16'} - hasBin: true - peerDependencies: - svelte: ^3 || ^4 || ^5 - svelte@3.55.0: resolution: {integrity: sha512-uGu2FVMlOuey4JoKHKrpZFkoYyj0VLjJdz47zX5+gVK5odxHM40RVhar9/iK2YFRVxvfg9FkhfVlR0sjeIrOiA==} engines: {node: '>= 8'} @@ -11111,12 +10622,6 @@ packages: resolution: {integrity: sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA==} engines: {node: '>=0.10.0'} - timers-ext@0.1.7: - resolution: {integrity: sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==} - - tiny-glob@0.2.9: - resolution: {integrity: sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==} - tiny-invariant@1.3.3: resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} @@ -11551,11 +11056,6 @@ packages: '@types/react': optional: true - use-sync-external-store@1.0.0: - resolution: {integrity: sha512-AFVsxg5GkFg8GDcxnl+Z0lMAz9rE8DGJCc28qnBuQF7lac57B5smLcT37aXpXIIPz75rW4g3eXHPjhHwdGskOw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0-rc - use-sync-external-store@1.2.0: resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==} peerDependencies: @@ -11627,18 +11127,6 @@ packages: validate-npm-package-license@3.0.4: resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} - valtio@1.11.2: - resolution: {integrity: sha512-1XfIxnUXzyswPAPXo1P3Pdx2mq/pIqZICkWN60Hby0d9Iqb+MEIpqgYVlbflvHdrp2YR/q3jyKWRPJJ100yxaw==} - engines: {node: '>=12.20.0'} - peerDependencies: - '@types/react': '>=16.8' - react: '>=16.8' - peerDependenciesMeta: - '@types/react': - optional: true - react: - optional: true - valtio@1.13.2: resolution: {integrity: sha512-Qik0o+DSy741TmkqmRfjq+0xpZBXi/Y6+fXZLn0xNF1z/waFMbE3rkivv5Zcf9RrMUp6zswf2J7sbh2KBlba5A==} engines: {node: '>=12.20.0'} @@ -11669,14 +11157,6 @@ packages: victory-vendor@37.3.6: resolution: {integrity: sha512-SbPDPdDBYp+5MJHhBCAyI7wKM3d5ivekigc2Dk2s7pgbZ9wIgIBYGVw4zGHBml/qTFbexrofXW6Gu4noGxrOwQ==} - viem@2.12.0: - resolution: {integrity: sha512-XBvORspE4x2/gfy7idH6IVFwkJiXirygFCU3lxUH6fttsj8zufLtgiokfvZF/LAZUEDvdxSgL08whSYgffM2fw==} - peerDependencies: - typescript: '>=5.0.4' - peerDependenciesMeta: - typescript: - optional: true - viem@2.23.2: resolution: {integrity: sha512-NVmW/E0c5crMOtbEAqMF0e3NmvQykFXhLOc/CkLIXOlzHSA6KXVz3CYVmaKqBF8/xtjsjHAGjdJN3Ru1kFJLaA==} peerDependencies: @@ -12168,18 +11648,6 @@ packages: utf-8-validate: optional: true - ws@8.13.0: - resolution: {integrity: sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==} - 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 - ws@8.18.0: resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} engines: {node: '>=10.0.0'} @@ -12397,8 +11865,6 @@ snapshots: '@adobe/css-tools@4.4.4': {} - '@adraffy/ens-normalize@1.10.0': {} - '@adraffy/ens-normalize@1.11.0': {} '@apollo/client@4.3.0(graphql@17.0.2)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(rxjs@7.8.2)': @@ -13161,13 +12627,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@coinbase/wallet-sdk@4.3.0': - dependencies: - '@noble/hashes': 1.7.0 - clsx: 1.2.1 - eventemitter3: 5.0.1 - preact: 10.27.2 - '@coinbase/wallet-sdk@4.3.6(@types/react@19.3.0)(bufferutil@4.0.9)(immer@11.1.18)(react@19.3.0)(typescript@6.0.3)(use-sync-external-store@1.4.0(react@19.3.0))(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: '@noble/hashes': 1.4.0 @@ -13425,10 +12884,7 @@ snapshots: '@esbuild-kit/core-utils': 3.3.2 get-tsconfig: 4.13.7 - '@esbuild/aix-ppc64@0.19.12': - optional: true - - '@esbuild/aix-ppc64@0.25.12': + '@esbuild/aix-ppc64@0.25.12': optional: true '@esbuild/aix-ppc64@0.27.4': @@ -13440,9 +12896,6 @@ snapshots: '@esbuild/android-arm64@0.18.20': optional: true - '@esbuild/android-arm64@0.19.12': - optional: true - '@esbuild/android-arm64@0.25.12': optional: true @@ -13455,9 +12908,6 @@ snapshots: '@esbuild/android-arm@0.18.20': optional: true - '@esbuild/android-arm@0.19.12': - optional: true - '@esbuild/android-arm@0.25.12': optional: true @@ -13470,9 +12920,6 @@ snapshots: '@esbuild/android-x64@0.18.20': optional: true - '@esbuild/android-x64@0.19.12': - optional: true - '@esbuild/android-x64@0.25.12': optional: true @@ -13485,9 +12932,6 @@ snapshots: '@esbuild/darwin-arm64@0.18.20': optional: true - '@esbuild/darwin-arm64@0.19.12': - optional: true - '@esbuild/darwin-arm64@0.25.12': optional: true @@ -13500,9 +12944,6 @@ snapshots: '@esbuild/darwin-x64@0.18.20': optional: true - '@esbuild/darwin-x64@0.19.12': - optional: true - '@esbuild/darwin-x64@0.25.12': optional: true @@ -13515,9 +12956,6 @@ snapshots: '@esbuild/freebsd-arm64@0.18.20': optional: true - '@esbuild/freebsd-arm64@0.19.12': - optional: true - '@esbuild/freebsd-arm64@0.25.12': optional: true @@ -13530,9 +12968,6 @@ snapshots: '@esbuild/freebsd-x64@0.18.20': optional: true - '@esbuild/freebsd-x64@0.19.12': - optional: true - '@esbuild/freebsd-x64@0.25.12': optional: true @@ -13545,9 +12980,6 @@ snapshots: '@esbuild/linux-arm64@0.18.20': optional: true - '@esbuild/linux-arm64@0.19.12': - optional: true - '@esbuild/linux-arm64@0.25.12': optional: true @@ -13560,9 +12992,6 @@ snapshots: '@esbuild/linux-arm@0.18.20': optional: true - '@esbuild/linux-arm@0.19.12': - optional: true - '@esbuild/linux-arm@0.25.12': optional: true @@ -13575,9 +13004,6 @@ snapshots: '@esbuild/linux-ia32@0.18.20': optional: true - '@esbuild/linux-ia32@0.19.12': - optional: true - '@esbuild/linux-ia32@0.25.12': optional: true @@ -13590,9 +13016,6 @@ snapshots: '@esbuild/linux-loong64@0.18.20': optional: true - '@esbuild/linux-loong64@0.19.12': - optional: true - '@esbuild/linux-loong64@0.25.12': optional: true @@ -13605,9 +13028,6 @@ snapshots: '@esbuild/linux-mips64el@0.18.20': optional: true - '@esbuild/linux-mips64el@0.19.12': - optional: true - '@esbuild/linux-mips64el@0.25.12': optional: true @@ -13620,9 +13040,6 @@ snapshots: '@esbuild/linux-ppc64@0.18.20': optional: true - '@esbuild/linux-ppc64@0.19.12': - optional: true - '@esbuild/linux-ppc64@0.25.12': optional: true @@ -13635,9 +13052,6 @@ snapshots: '@esbuild/linux-riscv64@0.18.20': optional: true - '@esbuild/linux-riscv64@0.19.12': - optional: true - '@esbuild/linux-riscv64@0.25.12': optional: true @@ -13650,9 +13064,6 @@ snapshots: '@esbuild/linux-s390x@0.18.20': optional: true - '@esbuild/linux-s390x@0.19.12': - optional: true - '@esbuild/linux-s390x@0.25.12': optional: true @@ -13665,9 +13076,6 @@ snapshots: '@esbuild/linux-x64@0.18.20': optional: true - '@esbuild/linux-x64@0.19.12': - optional: true - '@esbuild/linux-x64@0.25.12': optional: true @@ -13689,9 +13097,6 @@ snapshots: '@esbuild/netbsd-x64@0.18.20': optional: true - '@esbuild/netbsd-x64@0.19.12': - optional: true - '@esbuild/netbsd-x64@0.25.12': optional: true @@ -13713,9 +13118,6 @@ snapshots: '@esbuild/openbsd-x64@0.18.20': optional: true - '@esbuild/openbsd-x64@0.19.12': - optional: true - '@esbuild/openbsd-x64@0.25.12': optional: true @@ -13737,9 +13139,6 @@ snapshots: '@esbuild/sunos-x64@0.18.20': optional: true - '@esbuild/sunos-x64@0.19.12': - optional: true - '@esbuild/sunos-x64@0.25.12': optional: true @@ -13752,9 +13151,6 @@ snapshots: '@esbuild/win32-arm64@0.18.20': optional: true - '@esbuild/win32-arm64@0.19.12': - optional: true - '@esbuild/win32-arm64@0.25.12': optional: true @@ -13767,9 +13163,6 @@ snapshots: '@esbuild/win32-ia32@0.18.20': optional: true - '@esbuild/win32-ia32@0.19.12': - optional: true - '@esbuild/win32-ia32@0.25.12': optional: true @@ -13782,9 +13175,6 @@ snapshots: '@esbuild/win32-x64@0.18.20': optional: true - '@esbuild/win32-x64@0.19.12': - optional: true - '@esbuild/win32-x64@0.25.12': optional: true @@ -14021,18 +13411,6 @@ snapshots: '@ethersproject/properties': 5.8.0 '@ethersproject/transactions': 5.8.0 - '@ethersproject/hash@5.7.0': - dependencies: - '@ethersproject/abstract-signer': 5.8.0 - '@ethersproject/address': 5.8.0 - '@ethersproject/base64': 5.8.0 - '@ethersproject/bignumber': 5.8.0 - '@ethersproject/bytes': 5.8.0 - '@ethersproject/keccak256': 5.8.0 - '@ethersproject/logger': 5.8.0 - '@ethersproject/properties': 5.8.0 - '@ethersproject/strings': 5.8.0 - '@ethersproject/hash@5.8.0': dependencies: '@ethersproject/abstract-signer': 5.8.0 @@ -14162,18 +13540,6 @@ snapshots: '@ethersproject/constants': 5.8.0 '@ethersproject/logger': 5.8.0 - '@ethersproject/transactions@5.7.0': - dependencies: - '@ethersproject/address': 5.8.0 - '@ethersproject/bignumber': 5.8.0 - '@ethersproject/bytes': 5.8.0 - '@ethersproject/constants': 5.8.0 - '@ethersproject/keccak256': 5.8.0 - '@ethersproject/logger': 5.8.0 - '@ethersproject/properties': 5.8.0 - '@ethersproject/rlp': 5.8.0 - '@ethersproject/signing-key': 5.8.0 - '@ethersproject/transactions@5.8.0': dependencies: '@ethersproject/address': 5.8.0 @@ -14239,32 +13605,6 @@ snapshots: '@floating-ui/utils@0.2.12': {} - '@formatjs/ecma402-abstract@2.3.2': - dependencies: - '@formatjs/fast-memoize': 2.2.6 - '@formatjs/intl-localematcher': 0.5.10 - decimal.js: 10.6.0 - tslib: 2.8.1 - - '@formatjs/fast-memoize@2.2.6': - dependencies: - tslib: 2.8.1 - - '@formatjs/icu-messageformat-parser@2.9.8': - dependencies: - '@formatjs/ecma402-abstract': 2.3.2 - '@formatjs/icu-skeleton-parser': 1.8.12 - tslib: 2.8.1 - - '@formatjs/icu-skeleton-parser@1.8.12': - dependencies: - '@formatjs/ecma402-abstract': 2.3.2 - tslib: 2.8.1 - - '@formatjs/intl-localematcher@0.5.10': - dependencies: - tslib: 2.8.1 - '@gemini-wallet/core@0.3.2(supports-color@4.4.0)(viem@2.57.2(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76))': dependencies: '@metamask/rpc-errors': 7.0.2(supports-color@4.4.0) @@ -14277,12 +13617,6 @@ snapshots: dependencies: graphql: 17.0.2 - '@hapi/hoek@9.3.0': {} - - '@hapi/topo@5.1.0': - dependencies: - '@hapi/hoek': 9.3.0 - '@humanfs/core@0.19.1': {} '@humanfs/node@0.16.6': @@ -14757,14 +14091,8 @@ snapshots: '@libsql/win32-x64-msvc@0.5.28': optional: true - '@lit-labs/ssr-dom-shim@1.1.1': {} - '@lit-labs/ssr-dom-shim@1.6.0': {} - '@lit/reactive-element@1.6.2': - dependencies: - '@lit-labs/ssr-dom-shim': 1.1.1 - '@lit/reactive-element@2.1.2': dependencies: '@lit-labs/ssr-dom-shim': 1.6.0 @@ -14976,51 +14304,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@motionone/animation@10.15.1': - dependencies: - '@motionone/easing': 10.15.1 - '@motionone/types': 10.15.1 - '@motionone/utils': 10.15.1 - tslib: 2.8.1 - - '@motionone/dom@10.16.2': - dependencies: - '@motionone/animation': 10.15.1 - '@motionone/generators': 10.15.1 - '@motionone/types': 10.15.1 - '@motionone/utils': 10.15.1 - hey-listen: 1.0.8 - tslib: 2.8.1 - - '@motionone/easing@10.15.1': - dependencies: - '@motionone/utils': 10.15.1 - tslib: 2.8.1 - - '@motionone/generators@10.15.1': - dependencies: - '@motionone/types': 10.15.1 - '@motionone/utils': 10.15.1 - tslib: 2.8.1 - - '@motionone/svelte@10.16.2': - dependencies: - '@motionone/dom': 10.16.2 - tslib: 2.8.1 - - '@motionone/types@10.15.1': {} - - '@motionone/utils@10.15.1': - dependencies: - '@motionone/types': 10.15.1 - hey-listen: 1.0.8 - tslib: 2.8.1 - - '@motionone/vue@10.16.2': - dependencies: - '@motionone/dom': 10.16.2 - tslib: 2.8.1 - '@napi-rs/wasm-runtime@1.2.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': dependencies: '@emnapi/core': 1.10.0 @@ -15076,10 +14359,6 @@ snapshots: '@noble/ciphers@1.3.0': {} - '@noble/curves@1.2.0': - dependencies: - '@noble/hashes': 1.3.2 - '@noble/curves@1.4.2': dependencies: '@noble/hashes': 1.4.0 @@ -15102,8 +14381,6 @@ snapshots: '@noble/hashes@1.2.0': {} - '@noble/hashes@1.3.2': {} - '@noble/hashes@1.3.3': {} '@noble/hashes@1.4.0': {} @@ -15948,12 +15225,6 @@ snapshots: '@noble/secp256k1': 1.7.1 '@scure/base': 1.1.9 - '@scure/bip32@1.3.2': - dependencies: - '@noble/curves': 1.2.0 - '@noble/hashes': 1.3.3 - '@scure/base': 1.1.9 - '@scure/bip32@1.4.0': dependencies: '@noble/curves': 1.4.2 @@ -15983,11 +15254,6 @@ snapshots: '@noble/hashes': 1.2.0 '@scure/base': 1.1.9 - '@scure/bip39@1.2.1': - dependencies: - '@noble/hashes': 1.3.3 - '@scure/base': 1.1.9 - '@scure/bip39@1.3.0': dependencies: '@noble/hashes': 1.4.0 @@ -16057,14 +15323,6 @@ snapshots: '@sentry/types': 5.30.0 tslib: 1.14.1 - '@sideway/address@4.1.4': - dependencies: - '@hapi/hoek': 9.3.0 - - '@sideway/formula@3.0.1': {} - - '@sideway/pinpoint@2.0.0': {} - '@sinclair/typebox@0.34.41': {} '@sindresorhus/is@0.14.0': @@ -16516,86 +15774,6 @@ snapshots: transitivePeerDependencies: - fastestsmallesttextencoderdecoder - '@stablelib/aead@1.0.1': {} - - '@stablelib/binary@1.0.1': - dependencies: - '@stablelib/int': 1.0.1 - - '@stablelib/bytes@1.0.1': {} - - '@stablelib/chacha20poly1305@1.0.1': - dependencies: - '@stablelib/aead': 1.0.1 - '@stablelib/binary': 1.0.1 - '@stablelib/chacha': 1.0.1 - '@stablelib/constant-time': 1.0.1 - '@stablelib/poly1305': 1.0.1 - '@stablelib/wipe': 1.0.1 - - '@stablelib/chacha@1.0.1': - dependencies: - '@stablelib/binary': 1.0.1 - '@stablelib/wipe': 1.0.1 - - '@stablelib/constant-time@1.0.1': {} - - '@stablelib/ed25519@1.0.3': - dependencies: - '@stablelib/random': 1.0.2 - '@stablelib/sha512': 1.0.1 - '@stablelib/wipe': 1.0.1 - - '@stablelib/hash@1.0.1': {} - - '@stablelib/hkdf@1.0.1': - dependencies: - '@stablelib/hash': 1.0.1 - '@stablelib/hmac': 1.0.1 - '@stablelib/wipe': 1.0.1 - - '@stablelib/hmac@1.0.1': - dependencies: - '@stablelib/constant-time': 1.0.1 - '@stablelib/hash': 1.0.1 - '@stablelib/wipe': 1.0.1 - - '@stablelib/int@1.0.1': {} - - '@stablelib/keyagreement@1.0.1': - dependencies: - '@stablelib/bytes': 1.0.1 - - '@stablelib/poly1305@1.0.1': - dependencies: - '@stablelib/constant-time': 1.0.1 - '@stablelib/wipe': 1.0.1 - - '@stablelib/random@1.0.2': - dependencies: - '@stablelib/binary': 1.0.1 - '@stablelib/wipe': 1.0.1 - - '@stablelib/sha256@1.0.1': - dependencies: - '@stablelib/binary': 1.0.1 - '@stablelib/hash': 1.0.1 - '@stablelib/wipe': 1.0.1 - - '@stablelib/sha512@1.0.1': - dependencies: - '@stablelib/binary': 1.0.1 - '@stablelib/hash': 1.0.1 - '@stablelib/wipe': 1.0.1 - - '@stablelib/wipe@1.0.1': {} - - '@stablelib/x25519@1.0.3': - dependencies: - '@stablelib/keyagreement': 1.0.1 - '@stablelib/random': 1.0.2 - '@stablelib/wipe': 1.0.1 - '@standard-schema/spec@1.0.0': {} '@standard-schema/utils@0.3.0': {} @@ -17340,47 +16518,6 @@ snapshots: - react - use-sync-external-store - '@walletconnect/core@2.17.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)': - 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(bufferutil@4.0.9)(utf-8-validate@5.0.10) - '@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 - transitivePeerDependencies: - - '@azure/app-configuration' - - '@azure/cosmos' - - '@azure/data-tables' - - '@azure/identity' - - '@azure/keyvault-secrets' - - '@azure/storage-blob' - - '@capacitor/preferences' - - '@deno/kv' - - '@netlify/blobs' - - '@planetscale/database' - - '@react-native-async-storage/async-storage' - - '@upstash/redis' - - '@vercel/blob' - - '@vercel/kv' - - aws4fetch - - bufferutil - - db0 - - ioredis - - uploadthing - - utf-8-validate - '@walletconnect/core@2.21.0(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: '@walletconnect/heartbeat': 1.2.2 @@ -17471,44 +16608,6 @@ snapshots: dependencies: tslib: 1.14.1 - '@walletconnect/ethereum-provider@2.17.3(@types/react@19.3.0)(bufferutil@4.0.9)(encoding@0.1.13)(react@19.3.0)(utf-8-validate@5.0.10)': - dependencies: - '@walletconnect/jsonrpc-http-connection': 1.0.8(encoding@0.1.13) - '@walletconnect/jsonrpc-provider': 1.0.14 - '@walletconnect/jsonrpc-types': 1.0.4 - '@walletconnect/jsonrpc-utils': 1.0.8 - '@walletconnect/keyvaluestorage': 1.1.1 - '@walletconnect/modal': 2.7.0(@types/react@19.3.0)(react@19.3.0) - '@walletconnect/sign-client': 2.17.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) - '@walletconnect/types': 2.17.3 - '@walletconnect/universal-provider': 2.17.3(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10) - '@walletconnect/utils': 2.17.3 - events: 3.3.0 - transitivePeerDependencies: - - '@azure/app-configuration' - - '@azure/cosmos' - - '@azure/data-tables' - - '@azure/identity' - - '@azure/keyvault-secrets' - - '@azure/storage-blob' - - '@capacitor/preferences' - - '@deno/kv' - - '@netlify/blobs' - - '@planetscale/database' - - '@react-native-async-storage/async-storage' - - '@types/react' - - '@upstash/redis' - - '@vercel/blob' - - '@vercel/kv' - - aws4fetch - - bufferutil - - db0 - - encoding - - ioredis - - react - - uploadthing - - utf-8-validate - '@walletconnect/ethereum-provider@2.21.1(@types/react@19.3.0)(bufferutil@4.0.9)(encoding@0.1.13)(react@19.3.0)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: '@reown/appkit': 1.7.8(@types/react@19.3.0)(bufferutil@4.0.9)(encoding@0.1.13)(react@19.3.0)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76) @@ -17625,44 +16724,10 @@ snapshots: '@walletconnect/safe-json': 1.0.2 pino: 7.11.0 - '@walletconnect/modal-core@2.7.0(@types/react@19.3.0)(react@19.3.0)': - dependencies: - valtio: 1.11.2(@types/react@19.3.0)(react@19.3.0) - transitivePeerDependencies: - - '@types/react' - - react - - '@walletconnect/modal-ui@2.7.0(@types/react@19.3.0)(react@19.3.0)': - dependencies: - '@walletconnect/modal-core': 2.7.0(@types/react@19.3.0)(react@19.3.0) - lit: 2.8.0 - motion: 10.16.2 - qrcode: 1.5.3 - transitivePeerDependencies: - - '@types/react' - - react - - '@walletconnect/modal@2.7.0(@types/react@19.3.0)(react@19.3.0)': - dependencies: - '@walletconnect/modal-core': 2.7.0(@types/react@19.3.0)(react@19.3.0) - '@walletconnect/modal-ui': 2.7.0(@types/react@19.3.0)(react@19.3.0) - transitivePeerDependencies: - - '@types/react' - - react - '@walletconnect/relay-api@1.0.11': dependencies: '@walletconnect/jsonrpc-types': 1.0.4 - '@walletconnect/relay-auth@1.0.4': - dependencies: - '@stablelib/ed25519': 1.0.3 - '@stablelib/random': 1.0.2 - '@walletconnect/safe-json': 1.0.2 - '@walletconnect/time': 1.0.2 - tslib: 1.14.1 - uint8arrays: 3.1.1 - '@walletconnect/relay-auth@1.1.0': dependencies: '@noble/curves': 1.8.0 @@ -17675,120 +16740,16 @@ snapshots: dependencies: tslib: 1.14.1 - '@walletconnect/sign-client@2.17.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)': - dependencies: - '@walletconnect/core': 2.17.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) - '@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 - transitivePeerDependencies: - - '@azure/app-configuration' - - '@azure/cosmos' - - '@azure/data-tables' - - '@azure/identity' - - '@azure/keyvault-secrets' - - '@azure/storage-blob' - - '@capacitor/preferences' - - '@deno/kv' - - '@netlify/blobs' - - '@planetscale/database' - - '@react-native-async-storage/async-storage' - - '@upstash/redis' - - '@vercel/blob' - - '@vercel/kv' - - aws4fetch - - bufferutil - - db0 - - ioredis - - uploadthing - - utf-8-validate - '@walletconnect/sign-client@2.21.0(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: '@walletconnect/core': 2.21.0(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76) '@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.21.0 - '@walletconnect/utils': 2.21.0(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76) - events: 3.3.0 - transitivePeerDependencies: - - '@azure/app-configuration' - - '@azure/cosmos' - - '@azure/data-tables' - - '@azure/identity' - - '@azure/keyvault-secrets' - - '@azure/storage-blob' - - '@capacitor/preferences' - - '@deno/kv' - - '@netlify/blobs' - - '@planetscale/database' - - '@react-native-async-storage/async-storage' - - '@upstash/redis' - - '@vercel/blob' - - '@vercel/kv' - - aws4fetch - - bufferutil - - db0 - - ioredis - - typescript - - uploadthing - - utf-8-validate - - zod - - '@walletconnect/sign-client@2.21.1(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76)': - dependencies: - '@walletconnect/core': 2.21.1(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76) - '@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.21.1 - '@walletconnect/utils': 2.21.1(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76) - events: 3.3.0 - transitivePeerDependencies: - - '@azure/app-configuration' - - '@azure/cosmos' - - '@azure/data-tables' - - '@azure/identity' - - '@azure/keyvault-secrets' - - '@azure/storage-blob' - - '@capacitor/preferences' - - '@deno/kv' - - '@netlify/blobs' - - '@planetscale/database' - - '@react-native-async-storage/async-storage' - - '@upstash/redis' - - '@vercel/blob' - - '@vercel/kv' - - aws4fetch - - bufferutil - - db0 - - ioredis - - typescript - - uploadthing - - utf-8-validate - - zod - - '@walletconnect/time@1.0.2': - dependencies: - tslib: 1.14.1 - - '@walletconnect/types@2.17.3': - dependencies: - '@walletconnect/events': 1.0.1 - '@walletconnect/heartbeat': 1.2.2 - '@walletconnect/jsonrpc-types': 1.0.4 - '@walletconnect/keyvaluestorage': 1.1.1 + '@walletconnect/jsonrpc-utils': 1.0.8 '@walletconnect/logger': 2.1.2 + '@walletconnect/time': 1.0.2 + '@walletconnect/types': 2.21.0 + '@walletconnect/utils': 2.21.0(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76) events: 3.3.0 transitivePeerDependencies: - '@azure/app-configuration' @@ -17806,17 +16767,24 @@ snapshots: - '@vercel/blob' - '@vercel/kv' - aws4fetch + - bufferutil - db0 - ioredis + - typescript - uploadthing + - utf-8-validate + - zod - '@walletconnect/types@2.21.0': + '@walletconnect/sign-client@2.21.1(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: + '@walletconnect/core': 2.21.1(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76) '@walletconnect/events': 1.0.1 '@walletconnect/heartbeat': 1.2.2 - '@walletconnect/jsonrpc-types': 1.0.4 - '@walletconnect/keyvaluestorage': 1.1.1 + '@walletconnect/jsonrpc-utils': 1.0.8 '@walletconnect/logger': 2.1.2 + '@walletconnect/time': 1.0.2 + '@walletconnect/types': 2.21.1 + '@walletconnect/utils': 2.21.1(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76) events: 3.3.0 transitivePeerDependencies: - '@azure/app-configuration' @@ -17834,11 +16802,19 @@ snapshots: - '@vercel/blob' - '@vercel/kv' - aws4fetch + - bufferutil - db0 - ioredis + - typescript - uploadthing + - utf-8-validate + - zod - '@walletconnect/types@2.21.1': + '@walletconnect/time@1.0.2': + dependencies: + tslib: 1.14.1 + + '@walletconnect/types@2.21.0': dependencies: '@walletconnect/events': 1.0.1 '@walletconnect/heartbeat': 1.2.2 @@ -17866,20 +16842,14 @@ snapshots: - ioredis - uploadthing - '@walletconnect/universal-provider@2.17.3(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10)': + '@walletconnect/types@2.21.1': dependencies: '@walletconnect/events': 1.0.1 - '@walletconnect/jsonrpc-http-connection': 1.0.8(encoding@0.1.13) - '@walletconnect/jsonrpc-provider': 1.0.14 + '@walletconnect/heartbeat': 1.2.2 '@walletconnect/jsonrpc-types': 1.0.4 - '@walletconnect/jsonrpc-utils': 1.0.8 '@walletconnect/keyvaluestorage': 1.1.1 '@walletconnect/logger': 2.1.2 - '@walletconnect/sign-client': 2.17.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) - '@walletconnect/types': 2.17.3 - '@walletconnect/utils': 2.17.3 events: 3.3.0 - lodash: 4.17.21 transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -17896,12 +16866,9 @@ snapshots: - '@vercel/blob' - '@vercel/kv' - aws4fetch - - bufferutil - db0 - - encoding - ioredis - uploadthing - - utf-8-validate '@walletconnect/universal-provider@2.21.0(bufferutil@4.0.9)(encoding@0.1.13)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: @@ -17981,48 +16948,6 @@ snapshots: - utf-8-validate - zod - '@walletconnect/utils@2.17.3': - 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 - transitivePeerDependencies: - - '@azure/app-configuration' - - '@azure/cosmos' - - '@azure/data-tables' - - '@azure/identity' - - '@azure/keyvault-secrets' - - '@azure/storage-blob' - - '@capacitor/preferences' - - '@deno/kv' - - '@netlify/blobs' - - '@planetscale/database' - - '@react-native-async-storage/async-storage' - - '@upstash/redis' - - '@vercel/blob' - - '@vercel/kv' - - aws4fetch - - db0 - - ioredis - - uploadthing - '@walletconnect/utils@2.21.0(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: '@noble/ciphers': 1.2.1 @@ -18118,133 +17043,6 @@ snapshots: '@walletconnect/window-getters': 1.0.1 tslib: 1.14.1 - '@web3-onboard/coinbase@2.4.2(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76)': - dependencies: - '@coinbase/wallet-sdk': 4.3.0 - '@web3-onboard/common': 2.4.2(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76) - transitivePeerDependencies: - - bufferutil - - typescript - - utf-8-validate - - zod - - '@web3-onboard/common@2.4.2(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76)': - dependencies: - joi: 17.9.1 - viem: 2.12.0(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76) - transitivePeerDependencies: - - bufferutil - - typescript - - utf-8-validate - - zod - - '@web3-onboard/core@2.24.0(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76)': - dependencies: - '@web3-onboard/common': 2.4.2(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76) - bnc-sdk: 4.6.7 - bowser: 2.11.0 - eventemitter3: 4.0.7 - joi: 17.9.1 - lodash.merge: 4.6.2 - lodash.partition: 4.6.0 - nanoid: 4.0.0 - rxjs: 7.8.2 - svelte: 3.55.0 - svelte-i18n: 4.0.1(svelte@3.55.0) - viem: 2.12.0(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76) - transitivePeerDependencies: - - bufferutil - - typescript - - utf-8-validate - - zod - - '@web3-onboard/core@2.24.1(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76)': - dependencies: - '@web3-onboard/common': 2.4.2(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76) - bnc-sdk: 4.6.7 - bowser: 2.11.0 - eventemitter3: 4.0.7 - joi: 17.9.1 - lodash.merge: 4.6.2 - lodash.partition: 4.6.0 - nanoid: 4.0.0 - rxjs: 7.8.2 - svelte: 3.55.0 - svelte-i18n: 4.0.1(svelte@3.55.0) - viem: 2.12.0(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76) - transitivePeerDependencies: - - bufferutil - - typescript - - utf-8-validate - - zod - - '@web3-onboard/gnosis@2.3.2(@safe-global/safe-apps-provider@0.18.6(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76))(@safe-global/safe-apps-sdk@9.1.0(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76))(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76)': - dependencies: - '@safe-global/safe-apps-provider': 0.18.6(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76) - '@safe-global/safe-apps-sdk': 9.1.0(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76) - '@web3-onboard/common': 2.4.2(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76) - transitivePeerDependencies: - - bufferutil - - typescript - - utf-8-validate - - zod - - '@web3-onboard/injected-wallets@2.11.3(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76)': - dependencies: - '@web3-onboard/common': 2.4.2(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76) - joi: 17.9.1 - lodash.uniqby: 4.7.0 - transitivePeerDependencies: - - bufferutil - - typescript - - utf-8-validate - - zod - - '@web3-onboard/react@2.11.0(bufferutil@4.0.9)(react@19.3.0)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76)': - dependencies: - '@web3-onboard/common': 2.4.2(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76) - '@web3-onboard/core': 2.24.0(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76) - react: 19.3.0 - use-sync-external-store: 1.0.0(react@19.3.0) - transitivePeerDependencies: - - bufferutil - - typescript - - utf-8-validate - - zod - - '@web3-onboard/walletconnect@2.6.2(@types/react@19.3.0)(bufferutil@4.0.9)(encoding@0.1.13)(react@19.3.0)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76)': - dependencies: - '@walletconnect/ethereum-provider': 2.17.3(@types/react@19.3.0)(bufferutil@4.0.9)(encoding@0.1.13)(react@19.3.0)(utf-8-validate@5.0.10) - '@web3-onboard/common': 2.4.2(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76) - joi: 17.9.1 - rxjs: 7.8.2 - transitivePeerDependencies: - - '@azure/app-configuration' - - '@azure/cosmos' - - '@azure/data-tables' - - '@azure/identity' - - '@azure/keyvault-secrets' - - '@azure/storage-blob' - - '@capacitor/preferences' - - '@deno/kv' - - '@netlify/blobs' - - '@planetscale/database' - - '@react-native-async-storage/async-storage' - - '@types/react' - - '@upstash/redis' - - '@vercel/blob' - - '@vercel/kv' - - aws4fetch - - bufferutil - - db0 - - encoding - - ioredis - - react - - typescript - - uploadthing - - utf-8-validate - - zod - '@webcontainer/env@1.1.1': {} '@wry/caches@1.0.1': @@ -18842,11 +17640,6 @@ snapshots: '@zag-js/utils@1.43.3': {} - abitype@1.0.0(typescript@6.0.3)(zod@3.25.76): - optionalDependencies: - typescript: 6.0.3 - zod: 3.25.76 - abitype@1.0.6(typescript@6.0.3)(zod@3.25.76): optionalDependencies: typescript: 6.0.3 @@ -19745,13 +18538,6 @@ snapshots: bn.js@5.2.1: {} - bnc-sdk@4.6.7: - dependencies: - crypto-es: 1.2.7 - nanoid: 3.3.11 - rxjs: 6.6.7 - sturdy-websocket: 0.1.12 - body-parser@1.20.3(supports-color@4.4.0): dependencies: bytes: 3.1.2 @@ -20213,14 +18999,6 @@ snapshots: cli-boxes@2.2.1: {} - cli-color@2.0.3: - dependencies: - d: 1.0.1 - es5-ext: 0.10.64 - es6-iterator: 2.0.3 - memoizee: 0.4.15 - timers-ext: 0.1.7 - cli-table@0.3.11: dependencies: colors: 1.0.3 @@ -20491,8 +19269,6 @@ snapshots: randomfill: 1.0.4 optional: true - crypto-es@1.2.7: {} - css-select@5.1.0: dependencies: boolbase: 1.0.0 @@ -21103,13 +19879,6 @@ snapshots: d: 1.0.1 ext: 1.7.0 - es6-weak-map@2.0.3: - dependencies: - d: 1.0.1 - es5-ext: 0.10.64 - es6-iterator: 2.0.3 - es6-symbol: 3.1.3 - esbuild-register@3.6.0(esbuild@0.28.2)(supports-color@4.4.0): dependencies: debug: 4.4.3(supports-color@4.4.0) @@ -21143,32 +19912,6 @@ snapshots: '@esbuild/win32-ia32': 0.18.20 '@esbuild/win32-x64': 0.18.20 - esbuild@0.19.12: - optionalDependencies: - '@esbuild/aix-ppc64': 0.19.12 - '@esbuild/android-arm': 0.19.12 - '@esbuild/android-arm64': 0.19.12 - '@esbuild/android-x64': 0.19.12 - '@esbuild/darwin-arm64': 0.19.12 - '@esbuild/darwin-x64': 0.19.12 - '@esbuild/freebsd-arm64': 0.19.12 - '@esbuild/freebsd-x64': 0.19.12 - '@esbuild/linux-arm': 0.19.12 - '@esbuild/linux-arm64': 0.19.12 - '@esbuild/linux-ia32': 0.19.12 - '@esbuild/linux-loong64': 0.19.12 - '@esbuild/linux-mips64el': 0.19.12 - '@esbuild/linux-ppc64': 0.19.12 - '@esbuild/linux-riscv64': 0.19.12 - '@esbuild/linux-s390x': 0.19.12 - '@esbuild/linux-x64': 0.19.12 - '@esbuild/netbsd-x64': 0.19.12 - '@esbuild/openbsd-x64': 0.19.12 - '@esbuild/sunos-x64': 0.19.12 - '@esbuild/win32-arm64': 0.19.12 - '@esbuild/win32-ia32': 0.19.12 - '@esbuild/win32-x64': 0.19.12 - esbuild@0.25.12: optionalDependencies: '@esbuild/aix-ppc64': 0.25.12 @@ -21468,8 +20211,6 @@ snapshots: transitivePeerDependencies: - supports-color - eth-chains@2.0.0: {} - eth-ens-namehash@2.0.8: dependencies: idna-uts46-hx: 2.3.1 @@ -21841,8 +20582,6 @@ snapshots: eventemitter3@4.0.4: {} - eventemitter3@4.0.7: {} - eventemitter3@5.0.1: {} events@3.3.0: {} @@ -22426,8 +21165,6 @@ snapshots: define-properties: 1.2.1 gopd: 1.2.0 - globalyzer@0.1.0: {} - globby@16.2.0: dependencies: '@sindresorhus/merge-streams': 4.0.0 @@ -22666,8 +21403,6 @@ snapshots: dependencies: hermes-estree: 0.25.1 - hey-listen@1.0.8: {} - highlight.js@10.7.3: {} highlightjs-solidity@2.0.6: {} @@ -22826,13 +21561,6 @@ snapshots: internmap@2.0.3: {} - intl-messageformat@10.7.11: - dependencies: - '@formatjs/ecma402-abstract': 2.3.2 - '@formatjs/fast-memoize': 2.2.6 - '@formatjs/icu-messageformat-parser': 2.9.8 - tslib: 2.8.1 - invariant@2.2.4: dependencies: loose-envify: 1.4.0 @@ -23035,8 +21763,6 @@ snapshots: is-primitive@2.0.0: {} - is-promise@2.2.2: {} - is-regex@1.1.4: dependencies: call-bind: 1.0.8 @@ -23127,10 +21853,6 @@ snapshots: isobject@3.0.1: {} - isows@1.0.4(ws@8.13.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)): - dependencies: - ws: 8.13.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - isows@1.0.6(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)): dependencies: ws: 8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) @@ -23562,14 +22284,6 @@ snapshots: - supports-color - ts-node - joi@17.9.1: - dependencies: - '@hapi/hoek': 9.3.0 - '@hapi/topo': 5.1.0 - '@sideway/address': 4.1.4 - '@sideway/formula': 3.0.1 - '@sideway/pinpoint': 2.0.0 - jose@6.2.12: {} jotai@3.0.0(@types/react@19.3.0)(react@19.3.0): @@ -23934,32 +22648,16 @@ snapshots: lines-and-columns@1.2.4: {} - lit-element@3.3.2: - dependencies: - '@lit-labs/ssr-dom-shim': 1.1.1 - '@lit/reactive-element': 1.6.2 - lit-html: 2.8.0 - lit-element@4.2.2: dependencies: '@lit-labs/ssr-dom-shim': 1.6.0 '@lit/reactive-element': 2.1.2 lit-html: 3.3.3 - lit-html@2.8.0: - dependencies: - '@types/trusted-types': 2.0.3 - lit-html@3.3.3: dependencies: '@types/trusted-types': 2.0.3 - lit@2.8.0: - dependencies: - '@lit/reactive-element': 1.6.2 - lit-element: 3.3.2 - lit-html: 2.8.0 - lit@3.3.0: dependencies: '@lit/reactive-element': 2.1.2 @@ -23989,20 +22687,12 @@ snapshots: lodash.assign@4.2.0: {} - lodash.defaults@4.2.0: {} - lodash.isequal@4.5.0: {} lodash.merge@4.6.2: {} - lodash.partition@4.6.0: {} - - lodash.uniqby@4.7.0: {} - lodash@4.17.20: {} - lodash@4.17.21: {} - lodash@4.18.1: {} log-symbols@4.1.0: @@ -24056,10 +22746,6 @@ snapshots: dependencies: yallist: 3.1.1 - lru-queue@0.1.0: - dependencies: - es5-ext: 0.10.64 - lru_map@0.3.3: {} ltgt@2.1.3: {} @@ -24130,17 +22816,6 @@ snapshots: ltgt: 2.2.1 safe-buffer: 5.1.2 - memoizee@0.4.15: - dependencies: - d: 1.0.1 - es5-ext: 0.10.64 - es6-weak-map: 2.0.3 - event-emitter: 0.3.5 - is-promise: 2.2.2 - lru-queue: 0.1.0 - next-tick: 1.1.0 - timers-ext: 0.1.7 - memorystream@0.3.1: {} merge-descriptors@1.0.3: {} @@ -24373,17 +23048,6 @@ snapshots: motion-utils@13.3.0: {} - motion@10.16.2: - dependencies: - '@motionone/animation': 10.15.1 - '@motionone/dom': 10.16.2 - '@motionone/svelte': 10.16.2 - '@motionone/types': 10.15.1 - '@motionone/utils': 10.15.1 - '@motionone/vue': 10.16.2 - - mri@1.2.0: {} - ms@2.0.0: {} ms@2.1.2: {} @@ -24448,12 +23112,8 @@ snapshots: nano-json-stream-parser@0.1.2: {} - nanoid@3.3.11: {} - nanoid@3.3.19: {} - nanoid@4.0.0: {} - nanomatch@1.2.13(supports-color@4.4.0): dependencies: arr-diff: 4.0.0 @@ -25278,8 +23938,6 @@ snapshots: forwarded: 0.2.0 ipaddr.js: 1.9.1 - proxy-compare@2.5.1: {} - proxy-compare@2.6.0: {} proxy-compare@3.0.1: {} @@ -25831,18 +24489,10 @@ snapshots: rustbn.js@0.2.0: {} - rxjs@6.6.7: - dependencies: - tslib: 1.14.1 - rxjs@7.8.2: dependencies: tslib: 2.8.1 - sade@1.8.1: - dependencies: - mri: 1.2.0 - safe-array-concat@1.1.3: dependencies: call-bind: 1.0.8 @@ -26474,10 +25124,6 @@ snapshots: strip-json-comments@3.1.1: {} - sturdy-websocket@0.1.12: - dependencies: - lodash.defaults: 4.2.0 - styled-jsx@5.1.6(@babel/core@8.0.5)(babel-plugin-macros@3.1.0)(react@19.3.0): dependencies: client-only: 0.0.1 @@ -26510,18 +25156,8 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} - svelte-i18n@4.0.1(svelte@3.55.0): - dependencies: - cli-color: 2.0.3 - deepmerge: 4.3.1 - esbuild: 0.19.12 - estree-walker: 2.0.2 - intl-messageformat: 10.7.11 - sade: 1.8.1 - svelte: 3.55.0 - tiny-glob: 0.2.9 - - svelte@3.55.0: {} + svelte@3.55.0: + optional: true swap-case@1.1.2: dependencies: @@ -26615,16 +25251,6 @@ snapshots: timed-out@4.0.1: {} - timers-ext@0.1.7: - dependencies: - es5-ext: 0.10.64 - next-tick: 1.1.0 - - tiny-glob@0.2.9: - dependencies: - globalyzer: 0.1.0 - globrex: 0.1.2 - tiny-invariant@1.3.3: {} tinyglobby@0.2.15: @@ -27028,10 +25654,6 @@ snapshots: optionalDependencies: '@types/react': 19.3.0 - use-sync-external-store@1.0.0(react@19.3.0): - dependencies: - react: 19.3.0 - use-sync-external-store@1.2.0(react@19.3.0): dependencies: react: 19.3.0 @@ -27101,14 +25723,6 @@ snapshots: spdx-correct: 3.1.1 spdx-expression-parse: 3.0.1 - valtio@1.11.2(@types/react@19.3.0)(react@19.3.0): - dependencies: - proxy-compare: 2.5.1 - use-sync-external-store: 1.2.0(react@19.3.0) - optionalDependencies: - '@types/react': 19.3.0 - react: 19.3.0 - valtio@1.13.2(@types/react@19.3.0)(react@19.3.0): dependencies: derive-valtio: 0.1.0(valtio@1.13.2(@types/react@19.3.0)(react@19.3.0)) @@ -27147,23 +25761,6 @@ snapshots: d3-time: 3.1.0 d3-timer: 3.0.1 - viem@2.12.0(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76): - dependencies: - '@adraffy/ens-normalize': 1.10.0 - '@noble/curves': 1.2.0 - '@noble/hashes': 1.3.2 - '@scure/bip32': 1.3.2 - '@scure/bip39': 1.2.1 - abitype: 1.0.0(typescript@6.0.3)(zod@3.25.76) - isows: 1.0.4(ws@8.13.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) - ws: 8.13.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - optionalDependencies: - typescript: 6.0.3 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - zod - viem@2.23.2(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76): dependencies: '@noble/curves': 1.8.1 @@ -28141,11 +26738,6 @@ snapshots: bufferutil: 4.0.9 utf-8-validate: 5.0.10 - ws@8.13.0(bufferutil@4.0.9)(utf-8-validate@5.0.10): - optionalDependencies: - bufferutil: 4.0.9 - utf-8-validate: 5.0.10 - ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10): optionalDependencies: bufferutil: 4.0.9 From bb9f01b56f23cbfffaf07116b13d271e2bb0a562 Mon Sep 17 00:00:00 2001 From: Bruno Menezes Date: Thu, 8 Oct 2026 15:11:04 +0100 Subject: [PATCH 04/10] test: Add characterization tests for reward, token and pool balance maths. --- __tests__/graphql/hooks/poolBalances.test.ts | 115 +++++++++++ __tests__/utils/reward.test.ts | 204 +++++++++++++++++++ 2 files changed, 319 insertions(+) create mode 100644 __tests__/graphql/hooks/poolBalances.test.ts create mode 100644 __tests__/utils/reward.test.ts diff --git a/__tests__/graphql/hooks/poolBalances.test.ts b/__tests__/graphql/hooks/poolBalances.test.ts new file mode 100644 index 00000000..420e1e80 --- /dev/null +++ b/__tests__/graphql/hooks/poolBalances.test.ts @@ -0,0 +1,115 @@ +// Copyright (C) 2026 Cartesi Pte. Ltd. + +// This program is free software: you can redistribute it and/or modify it under +// the terms of the GNU General Public License as published by the Free Software +// Foundation, either version 3 of the License, or (at your option) any later +// version. + +// This program is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A +// PARTICULAR PURPOSE. See the GNU General Public License for more details. + +import { useQuery } from '@apollo/client/react'; +import { renderHook, waitFor } from '@testing-library/react'; +import { userShare } from '../../../src/graphql/hooks/usePoolBalances'; +import useTotalPoolBalance from '../../../src/graphql/hooks/useTotalPoolBalance'; +import { PoolBalance } from '../../../src/graphql/models'; + +// Baselines captured from the FixedNumber implementation. Amounts are compared +// in CTSI with a tolerance: FixedNumber truncated the share ratio to 18 decimals. +jest.mock('@apollo/client/react', () => { + const original = jest.requireActual('@apollo/client/react'); + return { __esModule: true, ...original, useQuery: jest.fn() }; +}); + +const mockedUseQuery = useQuery as jest.MockedFunction; + +const balance = ( + shares: string, + poolShares: string, + poolAmount: string, +): PoolBalance => + ({ + id: `${shares}/${poolShares}`, + shares, + balance: '0', + stakeTimestamp: 0, + user: { id: '0xabc' }, + pool: { id: '0xpool', shares: poolShares, amount: poolAmount }, + }) as unknown as PoolBalance; + +const asCTSI = (wei: unknown): number => Number(String(wei)) / 1e18; + +describe('pool balance maths (characterization)', () => { + describe('userShare', () => { + it('returns the user share of the pool as a fraction', () => { + expect( + userShare( + balance( + '250000000000000000000', + '1000000000000000000000', + '0', + ), + ), + ).toBe(0.25); + expect(userShare(balance('1', '3', '0'))).toBeCloseTo( + 0.3333333333333333, + 15, + ); + }); + + it('returns zero when the pool has no shares', () => { + expect(userShare(balance('5', '0', '0'))).toBe(0); + }); + }); + + describe('useTotalPoolBalance', () => { + afterEach(() => { + jest.clearAllMocks(); + }); + + it('sums the user amount across pools, skipping pools without shares', async () => { + mockedUseQuery.mockReturnValue({ + data: { + poolBalances: [ + // 25% of a 4,000 CTSI pool + balance( + '250000000000000000000', + '1000000000000000000000', + '4000000000000000000000', + ), + // a third of a 10 CTSI pool + balance( + '1000000000000000000', + '3000000000000000000', + '10000000000000000000', + ), + // pool without shares contributes nothing + balance('7', '0', '100'), + ], + }, + refetch: jest.fn(), + } as any); + + const { result } = renderHook(() => useTotalPoolBalance('0xabc')); + + await waitFor(() => expect(asCTSI(result.current)).not.toBe(0)); + expect(asCTSI(result.current)).toBeCloseTo(1003.3333333333333, 9); + }); + + it('starts at zero and queries the zero address without a user', () => { + mockedUseQuery.mockReturnValue({ data: undefined } as any); + + const { result } = renderHook(() => useTotalPoolBalance(undefined)); + + expect(asCTSI(result.current)).toBe(0); + expect(mockedUseQuery.mock.calls[0][1]).toMatchObject({ + variables: { + where: { + user: '0x0000000000000000000000000000000000000000', + }, + }, + }); + }); + }); +}); diff --git a/__tests__/utils/reward.test.ts b/__tests__/utils/reward.test.ts new file mode 100644 index 00000000..528e3870 --- /dev/null +++ b/__tests__/utils/reward.test.ts @@ -0,0 +1,204 @@ +// Copyright (C) 2026 Cartesi Pte. Ltd. + +// This program is free software: you can redistribute it and/or modify it under +// the terms of the GNU General Public License as published by the Free Software +// Foundation, either version 3 of the License, or (at your option) any later +// version. + +// This program is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A +// PARTICULAR PURPOSE. See the GNU General Public License for more details. + +import { BigNumber } from 'ethers'; +import { Block } from '../../src/graphql/models'; +import { getEstimatedRewardRate, getRewardRate } from '../../src/utils/reward'; + +/** + * Characterization tests: the expected values below were captured from the + * ethers v5 (BigNumber / FixedNumber) implementation and pin its behaviour so + * the bigint port must reproduce the same numbers. Results are compared as + * plain numbers and decimal strings so the assertions do not depend on the + * numeric library in use. + */ +const asNumber = (value: unknown): number => + typeof value === 'number' ? value : Number(String(value)); + +const asString = (value: unknown): string => String(value); + +const block = ( + protocol: 1 | 2, + chainNumber: number, + targetInterval: number, + difficulty: string, + reward: string, +): Block => + ({ + id: `${protocol}-${chainNumber}-${difficulty}`, + number: 1, + timestamp: 1700000000, + reward, + difficulty, + commission: '0', + gasPrice: 1, + gasLimit: 1, + producer: undefined, + node: undefined, + chain: { + id: `${protocol}-${chainNumber}`, + number: chainNumber, + totalBlocks: 1, + totalReward: '0', + start: '0', + targetInterval, + protocol: { + id: `${protocol}`, + version: protocol, + address: '0x0000000000000000000000000000000000000000', + timestamp: 0, + totalChains: 1, + }, + }, + }) as unknown as Block; + +// protocol 2: targetInterval in blocks, difficulty scaled by 1e-6 +const v2Blocks = [ + block(2, 0, 138, '34500000000000000000000', '2900000000000000000000'), + block(2, 0, 138, '36000000000000000000000', '2900000000000000000000'), + block(2, 0, 138, '33000000000000000000000', '2800000000000000000000'), +]; + +// protocol 1: targetInterval in seconds +const v1Blocks = [ + block( + 1, + 3, + 1800, + '450000000000000000000000000000', + '1700000000000000000000', + ), + block( + 1, + 3, + 1800, + '468000000000000000000000000000', + '1700000000000000000000', + ), +]; + +const circulatingSupply = 700_000_000; +const stake = '5000000000000000000000000'; // 5,000,000 CTSI in wei +const totalStaked = 250_000_000; // CTSI +const period = 30; // days + +/** Relative comparison: ratios are decimal strings today and floats after the port. */ +const expectRatio = (actual: unknown, expected: number | string) => + Number(expected) === 0 + ? expect(asNumber(actual)).toBe(0) + : expect(asNumber(actual) / Number(expected)).toBeCloseTo(1, 9); + +/** The stake parameter is an ethers BigNumber today and a bigint after the port. */ +const toStake = (wei: string) => BigNumber.from(wei); + +describe('reward utils (characterization)', () => { + describe('getRewardRate', () => { + it('returns zero rates without blocks or supply', () => { + expectRatio(getRewardRate([], circulatingSupply).yearReturn, 0); + expectRatio( + getRewardRate([], circulatingSupply).participationRate, + 0, + ); + expectRatio(getRewardRate(v2Blocks, 0).participationRate, 0); + expectRatio(getRewardRate(v2Blocks, 0).yearReturn, 0); + }); + + it('computes participation and yearly return for a protocol 2 chain', () => { + const { participationRate, yearReturn } = getRewardRate( + v2Blocks, + circulatingSupply, + ); + expectRatio(participationRate, '0.357142857142857142'); + expectRatio(yearReturn, '0.201561066666666666'); + }); + + it('computes participation and yearly return for a protocol 1 chain', () => { + const { participationRate, yearReturn } = getRewardRate( + v1Blocks, + circulatingSupply, + ); + expectRatio(participationRate, '0.364285714285714285'); + expectRatio(yearReturn, 0.1168); + }); + + it('averages participation and sums returns across chains', () => { + const { participationRate, yearReturn } = getRewardRate( + [...v2Blocks, ...v1Blocks], + circulatingSupply, + ); + expectRatio(participationRate, '0.360714285714285713'); + expectRatio(yearReturn, '0.318361066666666666'); + }); + }); + + describe('getEstimatedRewardRate', () => { + it('estimates reward, apr and active stake for a protocol 2 chain', () => { + const { reward, apr, activeStake } = getEstimatedRewardRate( + v2Blocks, + toStake(stake), + totalStaked, + period, + ); + expect(asString(reward)).toBe('80266666666666666666648'); + expectRatio(apr, '0.197226666666666666'); + expect(asString(activeStake)).toBe('250000000000000000000000000'); + }); + + it('sums rewards and aprs and averages active stake across chains', () => { + const { reward, apr, activeStake } = getEstimatedRewardRate( + [...v2Blocks, ...v1Blocks], + toStake(stake), + totalStaked, + period, + ); + expect(asString(reward)).toBe('127866666666666666666648'); + expectRatio(apr, '0.313846666666666666'); + expect(asString(activeStake)).toBe('252500000000000000000000000'); + }); + + it('yields no reward and a zero apr without a stake', () => { + const { reward, apr, activeStake } = getEstimatedRewardRate( + v2Blocks, + toStake('0'), + totalStaked, + period, + ); + expect(asString(reward)).toBe('0'); + expectRatio(apr, 0); + expect(asString(activeStake)).toBe('250000000000000000000000000'); + }); + + it('still reports the active stake for the stats endpoint call shape', () => { + // app/api/[chain]/stats/route.ts calls it with a 1 wei stake and no period + const { reward, apr, activeStake } = getEstimatedRewardRate( + v2Blocks, + toStake('1'), + 0, + 0, + ); + expect(asString(reward)).toBe('0'); + expectRatio(apr, '50390266666666666666654948'); + expect(asString(activeStake)).toBe('250000000000000000000000000'); + }); + + it('returns zeros without blocks', () => { + const { reward, apr, activeStake } = getEstimatedRewardRate( + [], + toStake(stake), + totalStaked, + period, + ); + expect(asString(reward)).toBe('0'); + expectRatio(apr, 0); + expect(asString(activeStake)).toBe('0'); + }); + }); +}); From daf29ff1864e438c13874160c301e70bfcf93c4b Mon Sep 17 00:00:00 2001 From: Bruno Menezes Date: Thu, 8 Oct 2026 15:14:23 +0100 Subject: [PATCH 05/10] chore: Generate viem ABIs with @wagmi/cli and group the generators under a codegen script. --- .github/workflows/build.yml | 4 +- .github/workflows/chromatic.yml | 3 + .gitignore | 3 + .prettierignore | 2 + eslint.config.mjs | 2 + jest.config.js | 1 + package.json | 13 +- pnpm-lock.yaml | 225 ++++++++++++++++++++++++-------- wagmi.config.ts | 137 +++++++++++++++++++ 9 files changed, 330 insertions(+), 60 deletions(-) create mode 100644 wagmi.config.ts diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 7cc74535..cea67f9a 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -21,8 +21,8 @@ jobs: - name: Install Dependencies run: pnpm install --frozen-lockfile - - name: Install chakra-ui types - run: pnpm run chakra-types + - name: Generate chakra-ui types and contract ABIs + run: pnpm codegen - name: Code format check run: pnpm format:check diff --git a/.github/workflows/chromatic.yml b/.github/workflows/chromatic.yml index 2daab06c..e75d9287 100644 --- a/.github/workflows/chromatic.yml +++ b/.github/workflows/chromatic.yml @@ -20,6 +20,9 @@ jobs: - name: Install Dependencies run: pnpm install --frozen-lockfile + - name: Generate chakra-ui types and contract ABIs + run: pnpm codegen + - name: Build Storybook run: pnpm build-storybook diff --git a/.gitignore b/.gitignore index 6f7641ed..58e00c80 100644 --- a/.gitignore +++ b/.gitignore @@ -49,3 +49,6 @@ yarn-error.log* # typescript tsconfig.tsbuildinfo + +# generated by `pnpm gen:abi` (wagmi cli) +src/services/contracts/generated.ts diff --git a/.prettierignore b/.prettierignore index 123f9b52..d8ebf5fa 100644 --- a/.prettierignore +++ b/.prettierignore @@ -5,3 +5,5 @@ coverage .vscode # regenerated by next on every build, and marked "should not be edited" next-env.d.ts +# generated by `pnpm gen:abi` (wagmi cli) +src/services/contracts/generated.ts diff --git a/eslint.config.mjs b/eslint.config.mjs index 00c76c0f..7787fd76 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -10,6 +10,8 @@ import storybook from 'eslint-plugin-storybook'; import { globalIgnores } from 'eslint/config'; export default [ + // build artifact written by `pnpm gen:abi` (wagmi cli), see wagmi.config.ts + globalIgnores(['src/services/contracts/generated.ts']), js.configs.recommended, tseslint.configs['flat/eslint-recommended'], ...tseslint.configs['flat/recommended'], diff --git a/jest.config.js b/jest.config.js index fa78864c..6cc9f72e 100644 --- a/jest.config.js +++ b/jest.config.js @@ -8,6 +8,7 @@ module.exports = { '!/src/app/**', '!/src/types/**', '!/src/graphql/queries/**', + '!/src/services/contracts/generated.ts', '!**/*.d.ts', '!**/node_modules/**', ], diff --git a/package.json b/package.json index 2d41257b..03158d6a 100644 --- a/package.json +++ b/package.json @@ -4,11 +4,11 @@ "private": true, "scripts": { "clean": "rm -rf node_modules && rm -rf .next", - "dev": "run-s db:dev:migrate next:dev", - "build": "run-s db:prod:migrate next:build", + "dev": "run-s db:dev:migrate codegen next:dev", + "build": "run-s db:prod:migrate codegen next:build", "start": "next start", - "next:build": "npm run chakra-types && next build", - "next:dev": "npm run chakra-types && next dev", + "next:build": "next build", + "next:dev": "next dev", "test": "dotenv -c test -- jest", "test:ci": "dotenv -c test -- jest --runInBand --coverage", "db:generate": "drizzle-kit generate", @@ -23,7 +23,9 @@ "chromatic": "chromatic --exit-zero-on-changes", "storybook": "storybook dev -p 6006", "build-storybook": "storybook build", - "chakra-types": "chakra typegen ./src/styles/theme.ts" + "chakra-types": "chakra typegen ./src/styles/theme.ts", + "gen:abi": "wagmi generate", + "codegen": "run-p chakra-types gen:abi" }, "dependencies": { "@apollo/client": "4.3.0", @@ -94,6 +96,7 @@ "@types/react-gtm-module": "^2.0.4", "@typescript-eslint/eslint-plugin": "^8.70.0", "@typescript-eslint/parser": "^8.70.0", + "@wagmi/cli": "^2.10.0", "babel-jest": "^30.5.1", "chromatic": "^18.8.1", "dotenv-cli": "11.0.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1c25726a..578ff7ae 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -71,7 +71,7 @@ importers: version: 5.104.0(react@19.3.0) '@vercel/speed-insights': specifier: ^2.0.0 - version: 2.0.0(next@16.3.5(@babel/core@8.0.5)(@types/node@24.13.4)(babel-plugin-macros@3.1.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(react@19.3.0)(svelte@3.55.0) + version: 2.0.0(next@16.3.5(@babel/core@8.0.5)(@types/node@24.13.4)(babel-plugin-macros@3.1.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(react@19.3.0) chart.js: specifier: ^4.5.1 version: 4.5.1 @@ -214,6 +214,9 @@ importers: '@typescript-eslint/parser': specifier: ^8.70.0 version: 8.70.0(eslint@10.10.0(supports-color@4.4.0))(supports-color@4.4.0)(typescript@6.0.3) + '@wagmi/cli': + specifier: ^2.10.0 + version: 2.10.0(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10) babel-jest: specifier: ^30.5.1 version: 30.5.1(@babel/core@8.0.5)(supports-color@4.4.0) @@ -252,7 +255,7 @@ importers: version: 3.0.0 jest: specifier: ^30.5.1 - version: 30.5.1(@types/node@24.13.4)(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.28.2)(supports-color@4.4.0))(supports-color@4.4.0) + version: 30.5.1(@types/node@24.13.4)(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.25.12)(supports-color@4.4.0))(supports-color@4.4.0) jest-canvas-mock: specifier: ^2.5.8 version: 2.5.8 @@ -261,7 +264,7 @@ importers: version: 30.5.1(bufferutil@4.0.9)(supports-color@4.4.0)(utf-8-validate@5.0.10) jest-mock-extended: specifier: 4.0.1 - version: 4.0.1(@jest/globals@30.5.1(supports-color@4.4.0))(jest@30.5.1(@types/node@24.13.4)(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.28.2)(supports-color@4.4.0))(supports-color@4.4.0))(typescript@6.0.3) + version: 4.0.1(@jest/globals@30.5.1(supports-color@4.4.0))(jest@30.5.1(@types/node@24.13.4)(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.25.12)(supports-color@4.4.0))(supports-color@4.4.0))(typescript@6.0.3) npm-run-all2: specifier: ^9.0.3 version: 9.0.3 @@ -4219,6 +4222,15 @@ packages: '@vitest/utils@3.2.4': resolution: {integrity: sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==} + '@wagmi/cli@2.10.0': + resolution: {integrity: sha512-2tYt6Bp1q26mWexH+XE6dMpPB5/Gp/3OVtE2SeeJ/gNHKLZmVF/TuoZR75mpJKTpofyvpz/fnuMCkUxzbc/kRw==} + hasBin: true + peerDependencies: + typescript: '>=5.7.3' + peerDependenciesMeta: + typescript: + optional: true + '@wagmi/connectors@6.2.0': resolution: {integrity: sha512-2NfkbqhNWdjfibb4abRMrn7u6rPjEGolMfApXss6HCDVt9AW2oVC6k8Q5FouzpJezElxLJSagWz9FW1zaRlanA==} peerDependencies: @@ -5307,6 +5319,12 @@ packages: resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} engines: {node: '>=18'} + bundle-require@5.1.0: + resolution: {integrity: sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + peerDependencies: + esbuild: '>=0.18' + bytes@3.1.2: resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} engines: {node: '>= 0.8'} @@ -5317,6 +5335,10 @@ packages: bytewise@1.1.0: resolution: {integrity: sha512-rHuuseJ9iQ0na6UDhnrRVDh8YnWVlU6xM3VH6q/+yHDeUH2zIhUzP+2/h3LIrhLDBtTqzWpE3p3tP/boefskKQ==} + cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + cache-base@1.0.1: resolution: {integrity: sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==} engines: {node: '>=0.10.0'} @@ -5415,6 +5437,9 @@ packages: change-case@3.0.2: resolution: {integrity: sha512-Mww+SLF6MZ0U6kdg11algyKd5BARbyM4TbFBepwowYSR5ClfQGCGtxNXgykpN0uF/bstWeaGDT4JWaDh8zWAHA==} + change-case@5.4.4: + resolution: {integrity: sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w==} + char-regex@1.0.2: resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} engines: {node: '>=10'} @@ -5450,6 +5475,10 @@ packages: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} + chokidar@4.0.1: + resolution: {integrity: sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==} + engines: {node: '>= 14.16.0'} + chokidar@4.0.3: resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} engines: {node: '>= 14.16.0'} @@ -5937,6 +5966,9 @@ packages: resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} engines: {node: '>=10'} + dedent@0.7.0: + resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==} + dedent@1.7.2: resolution: {integrity: sha512-WzMx3mW98SN+zn3hgemf4OzdmyNhhhKz5Ay0pUfQiMQ3e1g+xmTJWp/pKdwKVXhdSkAEGIIzqeuWrL3mV/AXbA==} peerDependencies: @@ -6136,6 +6168,10 @@ packages: resolution: {integrity: sha512-r5pA8idbk7GFWuHEU7trSTflWcdBpQEK+Aw17UrSHjS6CReuhrrPcyC3zcQBPQvhArRHnBo/h6eLH1fkCvNlww==} hasBin: true + dotenv-expand@10.0.0: + resolution: {integrity: sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A==} + engines: {node: '>=12'} + dotenv-expand@12.0.3: resolution: {integrity: sha512-uc47g4b+4k/M/SeaW1y4OApx+mtLWl92l5LMPP0GNXctZqELk+YGgOPIIC5elYmUH4OuoK3JLhuRUYegeySiFA==} engines: {node: '>=12'} @@ -6949,15 +6985,6 @@ packages: flow-stoplight@1.0.0: resolution: {integrity: sha512-rDjbZUKpN8OYhB0IE/vY/I8UWO/602IIJEU/76Tv4LvYnwHCk0BCsvz4eRr9n+FQcri7L5cyaXOo0+/Kh4HisA==} - follow-redirects@1.15.9: - resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==} - engines: {node: '>=4.0'} - peerDependencies: - debug: '*' - peerDependenciesMeta: - debug: - optional: true - follow-redirects@1.16.1: resolution: {integrity: sha512-FNvFGzoMLWmE6Yj9spb/zjd7yiNCHiAW9/Tg9CXrQ8wuu32HtlJOwWO11OJafl5FfY3DxTdQ0vj42zU1kvv5jg==} engines: {node: '>=4.0'} @@ -8419,6 +8446,10 @@ packages: resolution: {integrity: sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==} engines: {node: '>=0.10.0'} + load-tsconfig@0.2.5: + resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + locate-path@2.0.0: resolution: {integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==} engines: {node: '>=4'} @@ -8817,6 +8848,9 @@ packages: resolution: {integrity: sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==} engines: {node: '>=0.10.0'} + nanospinner@1.2.2: + resolution: {integrity: sha512-Zt/AmG6qRU3e+WnzGGLuMCEAO/dAu45stNbHY223tUxldaDAeE+FxSPsd9Q+j+paejmm0ZbrNVs5Sraqy3dRxA==} + napi-postinstall@0.3.4: resolution: {integrity: sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} @@ -9355,6 +9389,10 @@ packages: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} + picomatch@3.0.2: + resolution: {integrity: sha512-cfDHL6LStTEKlNilboNtobT/kEa30PtAf2Q1OgszfrG/rpVl1xaFWT9ktfkS306GmHgmnad1Sw4wabhlvFtsTw==} + engines: {node: '>=10'} + picomatch@4.0.4: resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} engines: {node: '>=12'} @@ -10565,10 +10603,6 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} - svelte@3.55.0: - resolution: {integrity: sha512-uGu2FVMlOuey4JoKHKrpZFkoYyj0VLjJdz47zX5+gVK5odxHM40RVhar9/iK2YFRVxvfg9FkhfVlR0sjeIrOiA==} - engines: {node: '>= 8'} - swap-case@1.1.2: resolution: {integrity: sha512-BAmWG6/bx8syfc6qXPprof3Mn5vQgf5dwdUNJhsNqU9WdPt5P+ES/wQ5bxfijy8zwZgZZHslC3iAsxsuQMCzJQ==} @@ -13773,7 +13807,7 @@ snapshots: jest-util: 30.5.1 slash: 3.0.0 - '@jest/core@30.5.1(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.28.2)(supports-color@4.4.0))(supports-color@4.4.0)': + '@jest/core@30.5.1(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.25.12)(supports-color@4.4.0))(supports-color@4.4.0)': dependencies: '@jest/console': 30.5.1 '@jest/pattern': 30.5.0 @@ -13789,7 +13823,7 @@ snapshots: fast-json-stable-stringify: 2.1.0 graceful-fs: 4.2.11 jest-changed-files: 30.5.1 - jest-config: 30.5.1(@types/node@24.13.4)(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.28.2)(supports-color@4.4.0))(supports-color@4.4.0) + jest-config: 30.5.1(@types/node@24.13.4)(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.25.12)(supports-color@4.4.0))(supports-color@4.4.0) jest-haste-map: 30.5.1 jest-message-util: 30.5.1 jest-regex-util: 30.5.0 @@ -14727,7 +14761,7 @@ snapshots: detect-libc: 2.1.2 is-glob: 4.0.3 node-addon-api: 7.1.1 - picomatch: 4.0.4 + picomatch: 4.0.7 optionalDependencies: '@parcel/watcher-android-arm64': 2.6.0 '@parcel/watcher-darwin-arm64': 2.6.0 @@ -15119,7 +15153,7 @@ snapshots: dependencies: '@types/estree': 1.0.8 estree-walker: 2.0.2 - picomatch: 4.0.4 + picomatch: 4.0.7 optionalDependencies: rollup: 4.52.4 @@ -16417,11 +16451,10 @@ snapshots: dependencies: '@vanilla-extract/css': 1.20.1(babel-plugin-macros@3.1.0) - '@vercel/speed-insights@2.0.0(next@16.3.5(@babel/core@8.0.5)(@types/node@24.13.4)(babel-plugin-macros@3.1.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(react@19.3.0)(svelte@3.55.0)': + '@vercel/speed-insights@2.0.0(next@16.3.5(@babel/core@8.0.5)(@types/node@24.13.4)(babel-plugin-macros@3.1.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(react@19.3.0)': optionalDependencies: next: 16.3.5(@babel/core@8.0.5)(@types/node@24.13.4)(babel-plugin-macros@3.1.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) react: 19.3.0 - svelte: 3.55.0 '@visulima/boxen@2.0.10': {} @@ -16447,6 +16480,32 @@ snapshots: loupe: 3.2.1 tinyrainbow: 2.0.0 + '@wagmi/cli@2.10.0(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)': + dependencies: + abitype: 1.3.0(typescript@6.0.3)(zod@4.6.5) + bundle-require: 5.1.0(esbuild@0.25.12) + cac: 6.7.14 + change-case: 5.4.4 + chokidar: 4.0.1 + dedent: 0.7.0 + dotenv: 16.6.1 + dotenv-expand: 10.0.0 + esbuild: 0.25.12 + escalade: 3.2.0 + fdir: 6.5.0(picomatch@3.0.2) + nanospinner: 1.2.2 + pathe: 1.1.2 + picocolors: 1.1.1 + picomatch: 3.0.2 + prettier: 3.9.6 + viem: 2.57.2(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@4.6.5) + zod: 4.6.5 + optionalDependencies: + typescript: 6.0.3 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + '@wagmi/connectors@6.2.0(@tanstack/react-query@5.104.0(react@19.3.0))(@types/react@19.3.0)(@wagmi/core@2.22.1(@tanstack/query-core@5.104.0)(@types/react@19.3.0)(immer@11.1.18)(react@19.3.0)(typescript@6.0.3)(use-sync-external-store@1.4.0(react@19.3.0))(viem@2.57.2(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76)))(bufferutil@4.0.9)(debug@4.4.3(supports-color@4.4.0))(encoding@0.1.13)(immer@11.1.18)(react@19.3.0)(supports-color@4.4.0)(typescript@6.0.3)(use-sync-external-store@1.4.0(react@19.3.0))(utf-8-validate@5.0.10)(viem@2.57.2(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76))(wagmi@2.19.5(@tanstack/query-core@5.104.0)(@tanstack/react-query@5.104.0(react@19.3.0))(@types/react@19.3.0)(bufferutil@4.0.9)(debug@4.4.3(supports-color@4.4.0))(encoding@0.1.13)(immer@11.1.18)(react@19.3.0)(supports-color@4.4.0)(typescript@6.0.3)(utf-8-validate@5.0.10)(viem@2.57.2(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76))(zod@3.25.76)': dependencies: '@base-org/account': 2.4.0(@types/react@19.3.0)(bufferutil@4.0.9)(debug@4.4.3(supports-color@4.4.0))(immer@11.1.18)(react@19.3.0)(supports-color@4.4.0)(typescript@6.0.3)(use-sync-external-store@1.4.0(react@19.3.0))(utf-8-validate@5.0.10)(zod@3.25.76) @@ -17660,6 +17719,16 @@ snapshots: typescript: 6.0.3 zod: 3.25.76 + abitype@1.2.3(typescript@6.0.3)(zod@4.6.5): + optionalDependencies: + typescript: 6.0.3 + zod: 4.6.5 + + abitype@1.3.0(typescript@6.0.3)(zod@3.25.76): + optionalDependencies: + typescript: 6.0.3 + zod: 3.25.76 + abitype@1.3.0(typescript@6.0.3)(zod@4.6.5): optionalDependencies: typescript: 6.0.3 @@ -18721,6 +18790,11 @@ snapshots: dependencies: run-applescript: 7.1.0 + bundle-require@5.1.0(esbuild@0.25.12): + dependencies: + esbuild: 0.25.12 + load-tsconfig: 0.2.5 + bytes@3.1.2: {} bytewise-core@1.2.3: @@ -18732,6 +18806,8 @@ snapshots: bytewise-core: 1.2.3 typewise: 1.0.3 + cac@6.7.14: {} + cache-base@1.0.1: dependencies: collection-visit: 1.0.0 @@ -18883,6 +18959,8 @@ snapshots: upper-case: 1.1.3 upper-case-first: 1.1.2 + change-case@5.4.4: {} + char-regex@1.0.2: {} charenc@0.0.2: {} @@ -18951,6 +19029,10 @@ snapshots: optionalDependencies: fsevents: 2.3.3 + chokidar@4.0.1: + dependencies: + readdirp: 4.1.1 + chokidar@4.0.3: dependencies: readdirp: 4.1.1 @@ -19436,6 +19518,8 @@ snapshots: dependencies: mimic-response: 3.1.0 + dedent@0.7.0: {} + dedent@1.7.2(babel-plugin-macros@3.1.0): optionalDependencies: babel-plugin-macros: 3.1.0 @@ -19613,6 +19697,8 @@ snapshots: dotenv-expand: 12.0.3 minimist: 1.2.8 + dotenv-expand@10.0.0: {} + dotenv-expand@12.0.3: dependencies: dotenv: 16.6.1 @@ -19879,10 +19965,10 @@ snapshots: d: 1.0.1 ext: 1.7.0 - esbuild-register@3.6.0(esbuild@0.28.2)(supports-color@4.4.0): + esbuild-register@3.6.0(esbuild@0.25.12)(supports-color@4.4.0): dependencies: debug: 4.4.3(supports-color@4.4.0) - esbuild: 0.28.2 + esbuild: 0.25.12 transitivePeerDependencies: - supports-color optional: true @@ -20316,7 +20402,7 @@ snapshots: ethereum-bloom-filters@1.2.0: dependencies: - '@noble/hashes': 1.7.0 + '@noble/hashes': 1.8.0 ethereum-common@0.0.18: {} @@ -20778,9 +20864,9 @@ snapshots: dependencies: bser: 2.1.1 - fdir@6.5.0(picomatch@4.0.4): + fdir@6.5.0(picomatch@3.0.2): optionalDependencies: - picomatch: 4.0.4 + picomatch: 3.0.2 fdir@6.5.0(picomatch@4.0.7): optionalDependencies: @@ -20881,10 +20967,6 @@ snapshots: flow-stoplight@1.0.0: {} - follow-redirects@1.15.9(debug@4.4.3(supports-color@4.4.0)): - optionalDependencies: - debug: 4.4.3(supports-color@4.4.0) - follow-redirects@1.16.1(debug@4.4.3(supports-color@4.4.0)): optionalDependencies: debug: 4.4.3(supports-color@4.4.0) @@ -21946,15 +22028,15 @@ snapshots: - babel-plugin-macros - supports-color - jest-cli@30.5.1(@types/node@24.13.4)(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.28.2)(supports-color@4.4.0))(supports-color@4.4.0): + jest-cli@30.5.1(@types/node@24.13.4)(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.25.12)(supports-color@4.4.0))(supports-color@4.4.0): dependencies: - '@jest/core': 30.5.1(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.28.2)(supports-color@4.4.0))(supports-color@4.4.0) + '@jest/core': 30.5.1(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.25.12)(supports-color@4.4.0))(supports-color@4.4.0) '@jest/test-result': 30.5.1 '@jest/types': 30.5.1 chalk: 4.1.2 exit-x: 0.2.2 import-local: 3.2.0 - jest-config: 30.5.1(@types/node@24.13.4)(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.28.2)(supports-color@4.4.0))(supports-color@4.4.0) + jest-config: 30.5.1(@types/node@24.13.4)(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.25.12)(supports-color@4.4.0))(supports-color@4.4.0) jest-util: 30.5.1 jest-validate: 30.5.1 yargs: 17.7.2 @@ -21965,7 +22047,7 @@ snapshots: - supports-color - ts-node - jest-config@30.5.1(@types/node@24.13.4)(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.28.2)(supports-color@4.4.0))(supports-color@4.4.0): + jest-config@30.5.1(@types/node@24.13.4)(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.25.12)(supports-color@4.4.0))(supports-color@4.4.0): dependencies: '@babel/core': 7.28.4(supports-color@4.4.0) '@jest/get-type': 30.5.0 @@ -21992,7 +22074,7 @@ snapshots: strip-json-comments: 3.1.1 optionalDependencies: '@types/node': 24.13.4 - esbuild-register: 3.6.0(esbuild@0.28.2)(supports-color@4.4.0) + esbuild-register: 3.6.0(esbuild@0.25.12)(supports-color@4.4.0) transitivePeerDependencies: - babel-plugin-macros - supports-color @@ -22051,12 +22133,12 @@ snapshots: '@types/node': 24.13.4 anymatch: 3.1.3 fb-watchman: 2.0.2 - fdir: 6.5.0(picomatch@4.0.4) + fdir: 6.5.0(picomatch@4.0.7) graceful-fs: 4.2.11 jest-regex-util: 30.5.0 jest-util: 30.5.1 jest-worker: 30.5.1 - picomatch: 4.0.4 + picomatch: 4.0.7 jest-leak-detector@30.5.1: dependencies: @@ -22097,15 +22179,15 @@ snapshots: chalk: 4.1.2 graceful-fs: 4.2.11 jest-util: 30.5.1 - picomatch: 4.0.4 + picomatch: 4.0.7 pretty-format: 30.5.1 slash: 3.0.0 stack-utils: 2.0.6 - jest-mock-extended@4.0.1(@jest/globals@30.5.1(supports-color@4.4.0))(jest@30.5.1(@types/node@24.13.4)(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.28.2)(supports-color@4.4.0))(supports-color@4.4.0))(typescript@6.0.3): + jest-mock-extended@4.0.1(@jest/globals@30.5.1(supports-color@4.4.0))(jest@30.5.1(@types/node@24.13.4)(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.25.12)(supports-color@4.4.0))(supports-color@4.4.0))(typescript@6.0.3): dependencies: '@jest/globals': 30.5.1(supports-color@4.4.0) - jest: 30.5.1(@types/node@24.13.4)(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.28.2)(supports-color@4.4.0))(supports-color@4.4.0) + jest: 30.5.1(@types/node@24.13.4)(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.25.12)(supports-color@4.4.0))(supports-color@4.4.0) lodash.isequal: 4.5.0 ts-essentials: 10.1.1(typescript@6.0.3) typescript: 6.0.3 @@ -22232,7 +22314,7 @@ snapshots: chalk: 4.1.2 ci-info: 4.3.0 graceful-fs: 4.2.11 - picomatch: 4.0.4 + picomatch: 4.0.7 jest-util@30.5.1: dependencies: @@ -22271,12 +22353,12 @@ snapshots: merge-stream: 2.0.0 supports-color: 8.1.1 - jest@30.5.1(@types/node@24.13.4)(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.28.2)(supports-color@4.4.0))(supports-color@4.4.0): + jest@30.5.1(@types/node@24.13.4)(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.25.12)(supports-color@4.4.0))(supports-color@4.4.0): dependencies: - '@jest/core': 30.5.1(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.28.2)(supports-color@4.4.0))(supports-color@4.4.0) + '@jest/core': 30.5.1(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.25.12)(supports-color@4.4.0))(supports-color@4.4.0) '@jest/types': 30.5.1 import-local: 3.2.0 - jest-cli: 30.5.1(@types/node@24.13.4)(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.28.2)(supports-color@4.4.0))(supports-color@4.4.0) + jest-cli: 30.5.1(@types/node@24.13.4)(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.25.12)(supports-color@4.4.0))(supports-color@4.4.0) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -22672,6 +22754,8 @@ snapshots: pinkie-promise: 2.0.1 strip-bom: 2.0.0 + load-tsconfig@0.2.5: {} + locate-path@2.0.0: dependencies: p-locate: 2.0.0 @@ -23130,6 +23214,10 @@ snapshots: transitivePeerDependencies: - supports-color + nanospinner@1.2.2: + dependencies: + picocolors: 1.1.1 + napi-postinstall@0.3.4: {} natural-compare@1.4.0: {} @@ -23476,6 +23564,21 @@ snapshots: transitivePeerDependencies: - zod + ox@0.14.45(typescript@6.0.3)(zod@4.6.5): + dependencies: + '@adraffy/ens-normalize': 1.11.0 + '@noble/ciphers': 1.3.0 + '@noble/curves': 1.9.1 + '@noble/hashes': 1.8.0 + '@scure/bip32': 1.7.0 + '@scure/bip39': 1.6.0 + abitype: 1.2.3(typescript@6.0.3)(zod@4.6.5) + eventemitter3: 5.0.1 + optionalDependencies: + typescript: 6.0.3 + transitivePeerDependencies: + - zod + ox@0.6.7(typescript@6.0.3)(zod@3.25.76): dependencies: '@adraffy/ens-normalize': 1.11.0 @@ -23483,7 +23586,7 @@ snapshots: '@noble/hashes': 1.7.0 '@scure/bip32': 1.6.1 '@scure/bip39': 1.5.1 - abitype: 1.0.8(typescript@6.0.3)(zod@3.25.76) + abitype: 1.3.0(typescript@6.0.3)(zod@3.25.76) eventemitter3: 5.0.1 optionalDependencies: typescript: 6.0.3 @@ -23497,7 +23600,7 @@ snapshots: '@noble/hashes': 1.7.0 '@scure/bip32': 1.6.1 '@scure/bip39': 1.5.1 - abitype: 1.0.8(typescript@6.0.3)(zod@3.25.76) + abitype: 1.3.0(typescript@6.0.3)(zod@3.25.76) eventemitter3: 5.0.1 optionalDependencies: typescript: 6.0.3 @@ -23775,6 +23878,8 @@ snapshots: picomatch@2.3.1: {} + picomatch@3.0.2: {} + picomatch@4.0.4: {} picomatch@4.0.7: {} @@ -24830,7 +24935,7 @@ snapshots: dependencies: command-exists: 1.2.9 commander: 8.3.0 - follow-redirects: 1.15.9(debug@4.4.3(supports-color@4.4.0)) + follow-redirects: 1.16.1(debug@4.4.3(supports-color@4.4.0)) js-sha3: 0.8.0 memorystream: 0.3.1 semver: 5.7.2 @@ -25156,9 +25261,6 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} - svelte@3.55.0: - optional: true - swap-case@1.1.2: dependencies: lower-case: 1.1.4 @@ -25255,8 +25357,8 @@ snapshots: tinyglobby@0.2.15: dependencies: - fdir: 6.5.0(picomatch@4.0.4) - picomatch: 4.0.4 + fdir: 6.5.0(picomatch@4.0.7) + picomatch: 4.0.7 tinyglobby@0.2.17: dependencies: @@ -25812,6 +25914,23 @@ snapshots: - utf-8-validate - zod + viem@2.57.2(bufferutil@4.0.9)(typescript@6.0.3)(utf-8-validate@5.0.10)(zod@4.6.5): + dependencies: + '@noble/curves': 1.9.1 + '@noble/hashes': 1.8.0 + '@scure/bip32': 1.7.0 + '@scure/bip39': 1.6.0 + abitype: 1.2.3(typescript@6.0.3)(zod@4.6.5) + isows: 1.0.7(ws@8.21.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + ox: 0.14.45(typescript@6.0.3)(zod@4.6.5) + ws: 8.21.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + optionalDependencies: + typescript: 6.0.3 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + - zod + vite-plugin-storybook-nextjs@10.6.0(next@16.3.5(@babel/core@8.0.5)(@types/node@24.13.4)(babel-plugin-macros@3.1.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(rollup@4.52.4)(storybook@10.6.0(@types/react@19.3.0)(bufferutil@4.0.9)(prettier@3.9.6)(react@19.3.0)(utf-8-validate@5.0.10))(supports-color@4.4.0)(typescript@6.0.3)(vite@8.3.0(@types/node@24.13.4)(esbuild@0.28.2)(terser@5.46.1)(tsx@4.21.0)): dependencies: '@next/env': 16.3.5 diff --git a/wagmi.config.ts b/wagmi.config.ts new file mode 100644 index 00000000..e0d12775 --- /dev/null +++ b/wagmi.config.ts @@ -0,0 +1,137 @@ +// Copyright (C) 2026 Cartesi Pte. Ltd. + +// This program is free software: you can redistribute it and/or modify it under +// the terms of the GNU General Public License as published by the Free Software +// Foundation, either version 3 of the License, or (at your option) any later +// version. + +// This program is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A +// PARTICULAR PURPOSE. See the GNU General Public License for more details. + +/** + * `pnpm gen:abi` (part of `pnpm codegen`) writes src/services/contracts/generated.ts + * (gitignored) from the @cartesi packages: `as const` ABIs plus per-chain addresses. + * Those packages and ethers are devDependencies used only here; the per-pool + * contracts (Fee, FlatRateCommission) ship their ABI only in the typechain factories. + */ +import type { Config, ContractConfig } from '@wagmi/cli'; +import type { Abi, Address } from 'viem'; + +import { + PoS__factory, + PoSV2FactoryImpl__factory, + StakingImpl__factory, +} from '@cartesi/pos'; +import { + Fee__factory, + FlatRateCommission__factory, + StakingPoolFactoryImpl__factory, + StakingPoolImpl__factory, +} from '@cartesi/staking-pool'; +import { CartesiToken__factory, SimpleFaucet__factory } from '@cartesi/token'; +import { WorkerManagerAuthManagerImpl__factory } from '@cartesi/util'; + +import posMainnet from '@cartesi/pos/export/abi/mainnet.json' with { type: 'json' }; +import posSepolia from '@cartesi/pos/export/abi/sepolia.json' with { type: 'json' }; +import posV1Mainnet from '@cartesi/pos-1.0/export/abi/mainnet.json' with { type: 'json' }; +import poolMainnet from '@cartesi/staking-pool/export/abi/mainnet.json' with { type: 'json' }; +import poolSepolia from '@cartesi/staking-pool/export/abi/sepolia.json' with { type: 'json' }; +import tokenMainnet from '@cartesi/token/export/abi/mainnet.json' with { type: 'json' }; +import tokenSepolia from '@cartesi/token/export/abi/sepolia.json' with { type: 'json' }; +import utilMainnet from '@cartesi/util/export/abi/mainnet.json' with { type: 'json' }; +import utilSepolia from '@cartesi/util/export/abi/sepolia.json' with { type: 'json' }; +import localhost from './src/services/contracts/localhost.json' with { type: 'json' }; + +type Deployment = { contracts: Record }; +type Deployments = Partial>; + +const addresses = (deploymentName: string, deployments: Deployments) => + Object.fromEntries( + Object.entries(deployments).flatMap(([chainId, deployment]) => { + const contract = deployment?.contracts[deploymentName]; + return contract ? [[Number(chainId), contract.address]] : []; + }), + ) as Record; + +const contract = ( + name: string, + abi: unknown, + deployed?: { as: string; on: Deployments }, +): ContractConfig => ({ + name, + abi: abi as Abi, + ...(deployed ? { address: addresses(deployed.as, deployed.on) } : {}), +}); + +const tokenDeployments: Deployments = { + 1: tokenMainnet, + 11155111: tokenSepolia, + 31337: localhost, +}; +const utilDeployments: Deployments = { + 1: utilMainnet, + 11155111: utilSepolia, + 31337: localhost, +}; +const posDeployments: Deployments = { + 1: posMainnet, + 11155111: posSepolia, + 31337: localhost, +}; +const posV1Deployments: Deployments = { 1: posV1Mainnet, 31337: localhost }; +const poolDeployments: Deployments = { + 1: poolMainnet, + 11155111: poolSepolia, + 31337: localhost, +}; + +// Explicitly typed: next build's type check (declaration: true) rejects the +// inferred type of defineConfig's return value as non-portable. +const config: Config = { + out: 'src/services/contracts/generated.ts', + plugins: [], + contracts: [ + // @cartesi/token + contract('CartesiToken', CartesiToken__factory.abi, { + as: 'CartesiToken', + on: tokenDeployments, + }), + contract('SimpleFaucet', SimpleFaucet__factory.abi, { + as: 'SimpleFaucet', + on: tokenDeployments, + }), + // @cartesi/util + contract( + 'WorkerManagerAuthManager', + WorkerManagerAuthManagerImpl__factory.abi, + { as: 'WorkerManagerAuthManagerImpl', on: utilDeployments }, + ), + // @cartesi/pos (protocol v2; PosV2Factory is behind the posV2Enabled flag) + contract('Staking', StakingImpl__factory.abi, { + as: 'StakingImpl', + on: posDeployments, + }), + contract('Pos', PoS__factory.abi, { as: 'PoS', on: posDeployments }), + contract('PosV2Factory', PoSV2FactoryImpl__factory.abi, { + as: 'PoSV2FactoryImpl', + on: posDeployments, + }), + // @cartesi/pos-1.0 (protocol v1; its typechain output predates static ABIs) + contract('PosV1', posV1Mainnet.contracts.PoS.abi, { + as: 'PoS', + on: posV1Deployments, + }), + // @cartesi/staking-pool + contract('StakingPoolFactory', StakingPoolFactoryImpl__factory.abi, { + as: 'StakingPoolFactoryImpl', + on: poolDeployments, + }), + // deployed per pool, addresses resolved at runtime + contract('StakingPool', StakingPoolImpl__factory.abi), + contract('Fee', Fee__factory.abi), + contract('FlatRateCommission', FlatRateCommission__factory.abi), + ], +}; + +export default config; From 81ebf26ff80f75541f32970f3b7c705cd56f0328 Mon Sep 17 00:00:00 2001 From: Bruno Menezes Date: Thu, 8 Oct 2026 15:40:29 +0100 Subject: [PATCH 06/10] refactor: Move contracts, services, utils, components, stories and tests from ethers to viem. --- __tests__/components/Layout.test.tsx | 16 +- .../components/TransactionFeedback.test.tsx | 10 +- .../node/NodeAllowanceSection.test.tsx | 3 +- .../components/node/NodeInfoSection.test.tsx | 5 +- .../node/NodeMaturingSection.test.tsx | 5 +- .../node/NodeReleasingSection.test.tsx | 5 +- .../node/NodeStakedBalanceSection.test.tsx | 3 +- __tests__/components/node/mocks.ts | 28 +- __tests__/components/pools/Rebalance.test.tsx | 16 +- __tests__/components/pools/mocks.ts | 3 +- .../components/pools/staking/CTSI.test.tsx | 6 +- .../pools/steps/CommissionModel.test.tsx | 1 + __tests__/components/pools/steps/ENS.test.tsx | 1 + .../components/pools/steps/HireNode.test.tsx | 3 + .../components/stake/PoolSetting.test.tsx | 5 +- __tests__/components/stake/Staking.test.tsx | 14 +- .../stake/StakingDashboard.test.tsx | 7 +- .../stake/TransactionInfoBanner.test.tsx | 10 +- .../components/AllowanceSection.test.tsx | 7 +- .../stake/components/DepositSection.test.tsx | 33 +- .../components/PoolBalanceSection.test.tsx | 21 +- .../stake/components/PoolsOverview.test.tsx | 3 +- .../components/StakedBalanceSection.test.tsx | 11 +- .../components/WalletBalanceSection.test.tsx | 19 +- .../stake/modals/StakingDepositModal.test.tsx | 17 +- .../modals/StakingPoolAllowanceModal.test.tsx | 5 +- .../stake/modals/StakingStakeModal.test.tsx | 10 +- .../stake/modals/StakingUnstakeModal.test.tsx | 5 +- .../modals/StakingWithdrawModal.test.tsx | 3 +- .../stake/stats/EffectiveBalanceStat.test.tsx | 21 +- .../stake/stats/PoolBalanceStat.test.tsx | 3 +- .../stake/stats/StakedBalanceStat.test.tsx | 5 +- __tests__/services/eth.test.ts | 62 ++-- __tests__/services/mocks.ts | 17 +- __tests__/services/node.test.ts | 126 ++++---- __tests__/services/pool.test.ts | 213 +++++++------ __tests__/services/poolFactory.test.ts | 80 ++++- __tests__/services/staking.test.ts | 76 +++-- __tests__/services/token.test.ts | 46 +-- __tests__/services/transaction.test.ts | 190 +++++++++--- __tests__/utils/numberParser.test.ts | 8 +- __tests__/utils/reward.test.ts | 13 +- __tests__/utils/token.test.ts | 13 +- src/app/api/[chain]/ens/[address]/route.ts | 4 +- src/app/api/[chain]/stats/route.ts | 20 +- src/app/stake/[pool]/commissions/page.tsx | 6 +- src/app/stake/[pool]/page.tsx | 6 +- src/app/stake/[pool]/stake/page.tsx | 6 +- src/app/stake/[pool]/users/page.tsx | 6 +- src/components/BigNumberText.tsx | 23 +- src/components/BigNumberTextV2.tsx | 23 +- src/components/CTSIText.tsx | 23 +- src/components/TransactionFeedback.tsx | 2 +- src/components/home/Header.tsx | 2 +- src/components/home/Stats.tsx | 15 +- src/components/node/NodeAllowanceSection.tsx | 3 +- src/components/node/NodeHireNodeSection.tsx | 3 +- src/components/node/NodeInfoSection.tsx | 13 +- src/components/node/NodeManage.tsx | 12 +- src/components/node/NodeMaturingSection.tsx | 9 +- src/components/node/NodeReleasingSection.tsx | 11 +- .../node/NodeStakedBalanceSection.tsx | 3 +- src/components/node/NodeStakingDashboard.tsx | 9 +- .../node/inputs/InitialFundsInput.tsx | 2 +- .../node/modals/NodeAllowanceModal.tsx | 12 +- .../node/modals/NodeBalanceModal.tsx | 22 +- src/components/node/modals/NodeStakeModal.tsx | 15 +- .../node/modals/NodeUnstakeModal.tsx | 15 +- src/components/pools/Rebalance.tsx | 17 +- src/components/pools/staking/CTSI.tsx | 8 +- .../steps/CommissionModel/CommissionModel.tsx | 1 + src/components/stake/CTSINumberInput.tsx | 5 +- src/components/stake/PoolSetting.tsx | 9 +- src/components/stake/PoolStatsPanel.tsx | 22 +- src/components/stake/Stake.tsx | 4 +- src/components/stake/StakePool.tsx | 5 +- src/components/stake/StakePoolStake.tsx | 3 +- src/components/stake/Staking.tsx | 25 +- src/components/stake/StakingDashboard.tsx | 9 +- .../stake/TransactionInfoBanner.tsx | 2 +- .../stake/components/AllowanceSection.tsx | 3 +- .../stake/components/DepositSection.tsx | 11 +- .../stake/components/PoolBalanceSection.tsx | 9 +- .../stake/components/PoolsOverview.tsx | 3 +- .../stake/components/StakedBalanceSection.tsx | 5 +- .../stake/components/WalletBalanceSection.tsx | 7 +- .../stake/modals/StakingDepositModal.tsx | 31 +- .../modals/StakingPoolAllowanceModal.tsx | 12 +- .../stake/modals/StakingStakeModal.tsx | 28 +- .../stake/modals/StakingUnstakeModal.tsx | 15 +- .../stake/modals/StakingWithdrawModal.tsx | 17 +- .../stake/stats/EffectiveBalanceStat.tsx | 26 +- .../stake/stats/PoolBalanceStat.tsx | 3 +- .../stake/stats/StakedBalanceStat.tsx | 3 +- src/components/stake/tables/UsersTableRow.tsx | 12 +- src/components/wallet/definitions.tsx | 12 +- src/components/wallet/useWagmiWallet.ts | 12 +- src/containers/pool/FlatRateContainer.tsx | 6 +- src/containers/stake/FlatRateContainer.tsx | 8 +- src/graphql/hooks/useNodes.ts | 6 +- src/graphql/hooks/usePoolBalances.ts | 30 +- src/graphql/hooks/useTotalPoolBalance.ts | 39 +-- src/services/contracts/index.ts | 281 ++++++++---------- src/services/contracts/pool.ts | 91 +++--- src/services/contracts/pos-1.0.ts | 18 +- src/services/contracts/pos.ts | 48 ++- src/services/ens.tsx | 4 +- src/services/eth.tsx | 40 +-- src/services/node.ts | 70 +++-- src/services/pool.ts | 176 ++++++----- src/services/poolFactory.ts | 32 +- src/services/staking.ts | 54 ++-- src/services/token.ts | 31 +- src/services/transaction.ts | 80 +++-- src/stories/BigNumberText.stories.tsx | 2 +- src/stories/CTSIText.stories.tsx | 6 +- src/stories/TransactionFeedback.stories.tsx | 30 +- src/stories/node/NodeInfoSection.stories.tsx | 6 +- .../node/NodeMaturingSection.stories.tsx | 6 +- .../node/NodeReleasingSection.stories.tsx | 6 +- .../node/NodeStakedBalanceSection.stories.tsx | 4 +- src/stories/pools/Rebalance.stories.tsx | 4 +- src/stories/stake/PoolStatsPanel.stories.tsx | 19 +- src/stories/stake/Staking.stories.tsx | 17 +- .../stake/StakingDashboard.stories.tsx | 9 +- .../stake/TransactionInfoBanner.stories.tsx | 4 +- .../components/AllowanceSection.stories.tsx | 5 +- .../components/DepositSection.stories.tsx | 23 +- .../components/PoolBalanceSection.stories.tsx | 7 +- .../components/PoolsOverview.stories.tsx | 3 +- .../StakedBalanceSection.stories.tsx | 7 +- .../StakingInstructions.stories.tsx | 5 +- .../WalletBalanceSection.stories.tsx | 15 +- .../modals/StakingDepositModal.stories.tsx | 9 +- .../StakingPoolAllowanceModal.stories.tsx | 7 +- .../modals/StakingStakeModal.stories.tsx | 7 +- .../modals/StakingUnstakeModal.stories.tsx | 5 +- .../modals/StakingWithdrawModal.stories.tsx | 5 +- .../EffectiveBalanceStatProps.stories.tsx | 23 +- .../stake/stats/PoolBalanceStat.stories.tsx | 5 +- .../stake/stats/StakedBalanceStat.stories.tsx | 3 +- src/utils/bigint.ts | 42 +++ src/utils/numberFormatter.ts | 24 +- src/utils/numberParser.ts | 11 +- src/utils/reward.ts | 215 ++++++-------- src/utils/token.ts | 15 +- 146 files changed, 1627 insertions(+), 1668 deletions(-) create mode 100644 src/utils/bigint.ts diff --git a/__tests__/components/Layout.test.tsx b/__tests__/components/Layout.test.tsx index dc26bdfe..7694c127 100644 --- a/__tests__/components/Layout.test.tsx +++ b/__tests__/components/Layout.test.tsx @@ -9,10 +9,6 @@ // WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A // PARTICULAR PURPOSE. See the GNU General Public License for more details. -import { PoS, StakingImpl } from '@cartesi/pos'; -import { StakingPoolFactoryImpl } from '@cartesi/staking-pool'; -import { CartesiToken, SimpleFaucet } from '@cartesi/token'; -import { WorkerManagerAuthManagerImpl } from '@cartesi/util'; import { render, screen } from '@testing-library/react'; import Layout, { footerLinks, headerLinks } from '../../src/components/Layout'; import useMeta from '../../src/graphql/hooks/useMeta'; @@ -80,22 +76,22 @@ describe('Layout component', () => { beforeEach(() => { mockedUsePoSContract.mockReturnValue({ address, - } as unknown as PoS); + } as unknown as ReturnType); mockedUseCartesiTokenContract.mockReturnValue({ address, - } as unknown as CartesiToken); + } as unknown as ReturnType); mockedUseSimpleFaucetContract.mockReturnValue({ address, - } as unknown as SimpleFaucet); + } as unknown as ReturnType); mockedUseStakingContract.mockReturnValue({ address, - } as unknown as StakingImpl); + } as unknown as ReturnType); mockedUseStakingPoolFactoryContract.mockReturnValue({ address, - } as unknown as StakingPoolFactoryImpl); + } as unknown as ReturnType); mockedUseWorkerManagerContract.mockReturnValue({ address, - } as unknown as WorkerManagerAuthManagerImpl); + } as unknown as ReturnType); mockedUseMeta.mockReturnValue(undefined); }); diff --git a/__tests__/components/TransactionFeedback.test.tsx b/__tests__/components/TransactionFeedback.test.tsx index 05f34123..b1935abd 100644 --- a/__tests__/components/TransactionFeedback.test.tsx +++ b/__tests__/components/TransactionFeedback.test.tsx @@ -11,15 +11,18 @@ import { render, screen, fireEvent } from '@testing-library/react'; import TransactionFeedback from '../../src/components/TransactionFeedback'; -import { Transaction } from '../../src/services/transaction'; +import { + SubmittedTransaction, + Transaction, +} from '../../src/services/transaction'; import { withChakraTheme } from '../test-utilities'; -import { ContractTransaction } from 'ethers'; const Component = withChakraTheme(TransactionFeedback); const props = { transaction: { submitting: false, acknowledged: false, + confirmations: 0, set: jest.fn(), ack: jest.fn(), } as Transaction, @@ -65,7 +68,8 @@ describe('TransactionFeedback component', () => { ...props.transaction, transaction: { hash: '0x6200d8606aab695a7f730a3f7c60e399eb3bd10f', - } as ContractTransaction, + chainId: 1, + } satisfies SubmittedTransaction, }; render(); diff --git a/__tests__/components/node/NodeAllowanceSection.test.tsx b/__tests__/components/node/NodeAllowanceSection.test.tsx index ab023066..4869d468 100644 --- a/__tests__/components/node/NodeAllowanceSection.test.tsx +++ b/__tests__/components/node/NodeAllowanceSection.test.tsx @@ -10,7 +10,6 @@ // PARTICULAR PURPOSE. See the GNU General Public License for more details. import { fireEvent, render } from '@testing-library/react'; -import { BigNumber } from 'ethers'; import { NodeAllowanceSection } from '../../../src/components/node/NodeAllowanceSection'; import { withChakraTheme } from '../../test-utilities'; @@ -21,7 +20,7 @@ describe('NodeAllowanceSection component', () => { const mockedOnAllowanceClick = jest.fn(); const { container } = render( , ); diff --git a/__tests__/components/node/NodeInfoSection.test.tsx b/__tests__/components/node/NodeInfoSection.test.tsx index f45bc00b..aec182d7 100644 --- a/__tests__/components/node/NodeInfoSection.test.tsx +++ b/__tests__/components/node/NodeInfoSection.test.tsx @@ -10,7 +10,6 @@ // PARTICULAR PURPOSE. See the GNU General Public License for more details. import { useMediaQuery } from '@chakra-ui/react'; import { render, screen } from '@testing-library/react'; -import { BigNumber } from 'ethers'; import { NodeInfoSection } from '../../../src/components/node/NodeInfoSection'; import { useUserNodes } from '../../../src/graphql/hooks/useNodes'; import { truncateString } from '../../../src/utils/stringUtils'; @@ -23,8 +22,8 @@ const NODE_BALANCE_ETH = '0.1868'; const defaultProps = { account: '0xabe5271e041df23c9f7c0461df5d340a0c1c36f4', address: '0xb00299b573a9deee20e6a242416188d1033e325f', - userBalance: BigNumber.from('0x029799b68c5fbbd4'), - nodeBalance: BigNumber.from('0x029799b68c5fbbd4'), + userBalance: BigInt('0x029799b68c5fbbd4'), + nodeBalance: BigInt('0x029799b68c5fbbd4'), onRetire: null, onHire: null, onDeposit: null, diff --git a/__tests__/components/node/NodeMaturingSection.test.tsx b/__tests__/components/node/NodeMaturingSection.test.tsx index d6fdefcc..bc2e4220 100644 --- a/__tests__/components/node/NodeMaturingSection.test.tsx +++ b/__tests__/components/node/NodeMaturingSection.test.tsx @@ -9,19 +9,18 @@ // WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A // PARTICULAR PURPOSE. See the GNU General Public License for more details. import { render, screen } from '@testing-library/react'; -import { BigNumber } from 'ethers'; import { NodeMaturingSection } from '../../../src/components/node/NodeMaturingSection'; import { withChakraTheme } from '../../test-utilities'; const Component = withChakraTheme(NodeMaturingSection); -const TEST_MATURING_BALANCE = BigNumber.from('0x04b75e170de2fc0000'); +const TEST_MATURING_BALANCE = BigInt('0x04b75e170de2fc0000'); const TEST_MATURING_BALANCE_CTSI = '87'; const TEST_MATURING_TIME = '1 hour, 20 minutes'; describe('NodeMaturingSection component', () => { it('Should be with 0 CTSI, 6 hours', () => { - render(); + render(); expect( screen.getByText( diff --git a/__tests__/components/node/NodeReleasingSection.test.tsx b/__tests__/components/node/NodeReleasingSection.test.tsx index 2f88068d..9cae2c34 100644 --- a/__tests__/components/node/NodeReleasingSection.test.tsx +++ b/__tests__/components/node/NodeReleasingSection.test.tsx @@ -9,13 +9,12 @@ // WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A // PARTICULAR PURPOSE. See the GNU General Public License for more details. import { render, screen } from '@testing-library/react'; -import { BigNumber } from 'ethers'; import { NodeReleasingSection } from '../../../src/components/node/NodeReleasingSection'; import { withChakraTheme } from '../../test-utilities'; const Component = withChakraTheme(NodeReleasingSection); -const TEST_RELEASING_BALANCE = BigNumber.from('0x04b75e170de2fc0000'); +const TEST_RELEASING_BALANCE = BigInt('0x04b75e170de2fc0000'); const TEST_RELEASING_BALANCE_CTSI = '87'; const TEST_RELEASING_TIME = '1 hour, 20 minutes'; const TEST_WITHDRAW_BUTTON = `WITHDRAW (${TEST_RELEASING_TIME})`; @@ -66,7 +65,7 @@ describe('NodeReleasingSection component', () => { it(`Should be 'Released' with 0 CTSI, no Withdraw button`, () => { render( , diff --git a/__tests__/components/node/NodeStakedBalanceSection.test.tsx b/__tests__/components/node/NodeStakedBalanceSection.test.tsx index a0410094..899b47a0 100644 --- a/__tests__/components/node/NodeStakedBalanceSection.test.tsx +++ b/__tests__/components/node/NodeStakedBalanceSection.test.tsx @@ -9,13 +9,12 @@ // WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A // PARTICULAR PURPOSE. See the GNU General Public License for more details. import { render, screen } from '@testing-library/react'; -import { BigNumber } from 'ethers'; import { NodeStakedBalanceSection } from '../../../src/components/node/NodeStakedBalanceSection'; import { withChakraTheme } from '../../test-utilities'; const Component = withChakraTheme(NodeStakedBalanceSection); -const TEST_BALANCE = BigNumber.from('0x04b75e170de2fc0000'); +const TEST_BALANCE = BigInt('0x04b75e170de2fc0000'); const TEST_BALANCE_CTSI = '87'; describe('NodeStakedBalanceSection component', () => { diff --git a/__tests__/components/node/mocks.ts b/__tests__/components/node/mocks.ts index 5babb5ae..7812dfdb 100644 --- a/__tests__/components/node/mocks.ts +++ b/__tests__/components/node/mocks.ts @@ -10,36 +10,34 @@ // WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A // PARTICULAR PURPOSE. See the GNU General Public License for more details. -import { ContractReceipt } from 'ethers/lib'; import { mock } from 'jest-mock-extended'; import { cloneDeep, cond, constant, isEqual, stubTrue } from 'lodash/fp'; +import { TransactionReceipt } from 'viem'; import { Node, NodeStatus } from '../../../src/services/node'; import { useStaking } from '../../../src/services/staking'; import { useCartesiToken } from '../../../src/services/token'; import { Transaction } from '../../../src/services/transaction'; -import { toBigNumber } from '../../../src/utils/numberParser'; import { ReturnOf } from '../../test-utilities'; /** * Don't use this directly. Use the build function exported below + * (cast because viem's Log type only resolves `topics` with strictNullChecks) */ -const stubReceipt: ContractReceipt = { +const stubReceipt = { blockHash: '0x8a179bc6cb299f936c4fd614995e62d597ec6108b579c23034fb220967ceaa94', - blockNumber: 12598244, - byzantium: true, - confirmations: 2083037, + blockNumber: 12598244n, contractAddress: '0x733aF852514e910E2f8af40d61E00530377889E9', - cumulativeGasUsed: toBigNumber('12102324'), - effectiveGasPrice: toBigNumber('10100000000'), + cumulativeGasUsed: 12102324n, + effectiveGasPrice: 10100000000n, from: '0x8ba1f109551bD432803012645Ac136ddd64DBA72', - gasUsed: toBigNumber('443560'), + gasUsed: 443560n, logs: [ { address: '0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e', blockHash: '0x8a179bc6cb299f936c4fd614995e62d597ec6108b579c23034fb220967ceaa94', - blockNumber: 12598244, + blockNumber: 12598244n, data: '0x000000000000000000000000084b1c3c81545d370f3634392de611caabff8148', logIndex: 160, topics: [ @@ -56,7 +54,7 @@ const stubReceipt: ContractReceipt = { address: '0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e', blockHash: '0x8a179bc6cb299f936c4fd614995e62d597ec6108b579c23034fb220967ceaa94', - blockNumber: 12598244, + blockNumber: 12598244n, data: '0x000000000000000000000000a2c122be93b0074270ebee7f6b7292c7deb45047', logIndex: 161, topics: [ @@ -69,16 +67,15 @@ const stubReceipt: ContractReceipt = { removed: false, }, ], - events: [], logsBloom: '0x00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000004000000000000010000000000000020000000000000000000040000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000040000000000000000100004000000000000008000040000000000000000000000000000000000005000000000041000000000000000000000000000000000000000000000000100000000000000001000000000000000000000', - status: 1, + status: 'success', to: null, transactionHash: '0x5b73e239c55d790e3c9c3bbb84092652db01bb8dbf49ccc9e4a318470419d9a0', transactionIndex: 315, - type: 0, -}; + type: 'legacy', +} as unknown as TransactionReceipt; const initialNodeState: Node = { address: undefined, @@ -144,6 +141,7 @@ function buildTransaction(): Transaction { result: undefined, set: jest.fn(), submitting: false, + confirmations: 0, transaction: undefined, isOngoing: false, state: 'acknowledged', diff --git a/__tests__/components/pools/Rebalance.test.tsx b/__tests__/components/pools/Rebalance.test.tsx index e0ecd33a..24824d5a 100644 --- a/__tests__/components/pools/Rebalance.test.tsx +++ b/__tests__/components/pools/Rebalance.test.tsx @@ -10,16 +10,15 @@ // PARTICULAR PURPOSE. See the GNU General Public License for more details. import { fireEvent, render, screen } from '@testing-library/react'; -import { BigNumber } from 'ethers'; import Rebalance from '../../../src/components/pools/Rebalance'; import { formatCTSI } from '../../../src/utils/token'; import { withChakraTheme } from '../../test-utilities'; const Component = withChakraTheme(Rebalance); const props = { - stake: BigNumber.from('10000000000000000000'), - unstake: BigNumber.from('10000000000000000000'), - withdraw: BigNumber.from('10000000000000000000'), + stake: 10000000000000000000n, + unstake: 10000000000000000000n, + withdraw: 10000000000000000000n, onRebalance: jest.fn(), }; @@ -56,14 +55,7 @@ describe('Rebalance component', () => { }); it('should display CTSI to withdraw label when unstake is greater than zero', () => { - render( - , - ); + render(); expect(screen.getByText('No need to rebalance')).toBeInTheDocument(); }); }); diff --git a/__tests__/components/pools/mocks.ts b/__tests__/components/pools/mocks.ts index f8a0238d..0ee87b62 100644 --- a/__tests__/components/pools/mocks.ts +++ b/__tests__/components/pools/mocks.ts @@ -1,4 +1,3 @@ -import { BigNumber } from 'ethers'; import { mock } from 'jest-mock-extended'; import { useStakingPool } from '../../../src/services/pool'; import { useStakingPoolFactory } from '../../../src/services/poolFactory'; @@ -24,7 +23,7 @@ function buildUseStakingPoolReturn() { const mock = buildMockStakingPool(); mock.paused = false; mock.transaction = buildTransaction(); - mock.amount = BigNumber.from(0); + mock.amount = 0n; return mock; } diff --git a/__tests__/components/pools/staking/CTSI.test.tsx b/__tests__/components/pools/staking/CTSI.test.tsx index c4646dc9..f836cddc 100644 --- a/__tests__/components/pools/staking/CTSI.test.tsx +++ b/__tests__/components/pools/staking/CTSI.test.tsx @@ -14,7 +14,7 @@ import CTSI, { numberFormat, } from '../../../../src/components/pools/staking/CTSI'; import { withChakraTheme } from '../../../test-utilities'; -import { formatUnits } from 'ethers/lib/utils'; +import { formatUnits } from 'viem'; const Component = withChakraTheme(CTSI); const props = { @@ -27,7 +27,9 @@ describe('CTSI component', () => { expect( screen.getByText( - numberFormat.format(parseFloat(formatUnits(props.value, 18))), + numberFormat.format( + parseFloat(formatUnits(BigInt(props.value), 18)), + ), ), ).toBeInTheDocument(); }); diff --git a/__tests__/components/pools/steps/CommissionModel.test.tsx b/__tests__/components/pools/steps/CommissionModel.test.tsx index e06d7dec..6dd53b7f 100644 --- a/__tests__/components/pools/steps/CommissionModel.test.tsx +++ b/__tests__/components/pools/steps/CommissionModel.test.tsx @@ -359,6 +359,7 @@ describe('CommissionModel step component', () => { const poolFactory = buildUseStakingPoolFactoryReturn(); poolFactory.transaction.acknowledged = false; poolFactory.transaction.receipt = buildContractReceipt(); + poolFactory.transaction.confirmations = 1; poolFactory.transaction.result = '0xE656584736b1EFC14b4b6c785AA9C23BAc8f41AA'; mockUseStakingPoolFactory.mockReturnValue(poolFactory); diff --git a/__tests__/components/pools/steps/ENS.test.tsx b/__tests__/components/pools/steps/ENS.test.tsx index c4fe1d46..f50dfdc6 100644 --- a/__tests__/components/pools/steps/ENS.test.tsx +++ b/__tests__/components/pools/steps/ENS.test.tsx @@ -351,6 +351,7 @@ describe('Pool ENS step', () => { // setting to have the contract transaction fulfilled pool.transaction.acknowledged = false; pool.transaction.receipt = buildContractReceipt(); + pool.transaction.confirmations = 1; pool.transaction.state = 'confirmed'; rerender(); diff --git a/__tests__/components/pools/steps/HireNode.test.tsx b/__tests__/components/pools/steps/HireNode.test.tsx index 6729a94a..bdc40443 100644 --- a/__tests__/components/pools/steps/HireNode.test.tsx +++ b/__tests__/components/pools/steps/HireNode.test.tsx @@ -313,6 +313,7 @@ describe('HireNode Step', () => { pool.transaction.acknowledged = false; pool.transaction.submitting = false; pool.transaction.receipt = buildContractReceipt(); + pool.transaction.confirmations = 1; rerender(); const alert = screen.getByRole('alert'); @@ -420,6 +421,7 @@ describe('HireNode Step', () => { pool.transaction.acknowledged = false; pool.transaction.submitting = false; pool.transaction.receipt = buildContractReceipt(); + pool.transaction.confirmations = 1; rerender(); const alert = screen.getByRole('alert'); @@ -547,6 +549,7 @@ describe('HireNode Step', () => { // emulating transaction state change; pool.transaction.acknowledged = false; pool.transaction.receipt = buildContractReceipt(); + pool.transaction.confirmations = 1; rerender(); const alert = screen.getByRole('alert'); diff --git a/__tests__/components/stake/PoolSetting.test.tsx b/__tests__/components/stake/PoolSetting.test.tsx index 596dece5..3de61a6b 100644 --- a/__tests__/components/stake/PoolSetting.test.tsx +++ b/__tests__/components/stake/PoolSetting.test.tsx @@ -18,7 +18,6 @@ import { } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import useFlag from '../../../src/hooks/useFlag'; -import { BigNumber } from 'ethers'; import { PoolSetting } from '../../../src/components/stake/PoolSetting'; import { useWallet } from '../../../src/components/wallet/useWallet'; import useStakingPoolQuery from '../../../src/graphql/hooks/useStakingPool'; @@ -105,9 +104,7 @@ describe('PoolSetting', () => { buildUseStakingPoolFactoryReturn(), ); - mockUseTotalPoolBalance.mockReturnValue( - BigNumber.from(totalPoolBalance), - ); + mockUseTotalPoolBalance.mockReturnValue(BigInt(totalPoolBalance)); mockUseStakingPoolQuery.mockReturnValue({ id: '1231', diff --git a/__tests__/components/stake/Staking.test.tsx b/__tests__/components/stake/Staking.test.tsx index 2b53e34f..a582cd72 100644 --- a/__tests__/components/stake/Staking.test.tsx +++ b/__tests__/components/stake/Staking.test.tsx @@ -10,7 +10,6 @@ // PARTICULAR PURPOSE. See the GNU General Public License for more details. import { render, screen } from '@testing-library/react'; -import { BigNumber, ContractTransaction } from 'ethers'; import { Staking, StakingProps } from '../../../src/components/stake/Staking'; import { Transaction } from '../../../src/services/transaction'; import { withChakraTheme } from '../../test-utilities'; @@ -25,18 +24,19 @@ const defaultTransaction: Transaction = { result: undefined, set: jest.fn(), submitting: false, + confirmations: 0, transaction: { hash: '0x6200d8606aab695a7f730a3f7c60e399eb3bd10f', chainId: 1823981, - } as ContractTransaction, + }, }; const defaultProps = { - userWalletBalance: BigNumber.from(defaultValue), - allowance: BigNumber.from(defaultValue), - userPoolBalance: BigNumber.from(defaultValue), - userETHBalance: BigNumber.from(defaultValue), - stakedBalance: BigNumber.from(defaultValue), + userWalletBalance: BigInt(defaultValue), + allowance: BigInt(defaultValue), + userPoolBalance: BigInt(defaultValue), + userETHBalance: BigInt(defaultValue), + stakedBalance: BigInt(defaultValue), depositTimestamp: new Date(), lockTime: 1000, onApprove: () => undefined, diff --git a/__tests__/components/stake/StakingDashboard.test.tsx b/__tests__/components/stake/StakingDashboard.test.tsx index 67f7bf60..3aea087e 100644 --- a/__tests__/components/stake/StakingDashboard.test.tsx +++ b/__tests__/components/stake/StakingDashboard.test.tsx @@ -15,14 +15,13 @@ import { StakingDashboardProps, } from '../../../src/components/stake/StakingDashboard'; import { withChakraTheme } from '../../test-utilities'; -import { BigNumber } from 'ethers'; const defaultValue = '10000000000000000000000'; const defaultProps = { - balance: BigNumber.from(defaultValue), - allowance: BigNumber.from(defaultValue), - userETHBalance: BigNumber.from(defaultValue), + balance: BigInt(defaultValue), + allowance: BigInt(defaultValue), + userETHBalance: BigInt(defaultValue), onApprove: () => undefined, }; diff --git a/__tests__/components/stake/TransactionInfoBanner.test.tsx b/__tests__/components/stake/TransactionInfoBanner.test.tsx index a669e173..94defcd2 100644 --- a/__tests__/components/stake/TransactionInfoBanner.test.tsx +++ b/__tests__/components/stake/TransactionInfoBanner.test.tsx @@ -13,7 +13,7 @@ import { render, screen } from '@testing-library/react'; import { TransactionInfoBanner } from '../../../src/components/stake/TransactionInfoBanner'; import { withChakraTheme } from '../../test-utilities'; import { Transaction } from '../../../src/services/transaction'; -import { ContractReceipt, ContractTransaction } from 'ethers'; +import { TransactionReceipt } from 'viem'; const defaultTransaction: Transaction = { ack: jest.fn(), @@ -23,17 +23,17 @@ const defaultTransaction: Transaction = { result: undefined, set: jest.fn(), submitting: false, + confirmations: 0, transaction: { hash: '0x6200d8606aab695a7f730a3f7c60e399eb3bd10f', chainId: 1823981, - } as ContractTransaction, + }, }; const successTransaction: Transaction = { ...defaultTransaction, - receipt: { - confirmations: 1, - } as ContractReceipt, + confirmations: 1, + receipt: { status: 'success', logs: [] } as unknown as TransactionReceipt, }; const errorTransaction = { diff --git a/__tests__/components/stake/components/AllowanceSection.test.tsx b/__tests__/components/stake/components/AllowanceSection.test.tsx index 81f38945..13fb526d 100644 --- a/__tests__/components/stake/components/AllowanceSection.test.tsx +++ b/__tests__/components/stake/components/AllowanceSection.test.tsx @@ -10,7 +10,6 @@ // PARTICULAR PURPOSE. See the GNU General Public License for more details. import { render, screen, fireEvent } from '@testing-library/react'; -import { BigNumber } from 'ethers'; import { AllowanceSection, IAllowanceSectionProps, @@ -28,7 +27,7 @@ describe('Allowance Section', () => { const renderComponent = () => render( { console.log('onAllowanceClick::'); }} @@ -44,7 +43,7 @@ describe('Allowance Section', () => { renderComponent(); expect(screen.getByRole('ctsi-text')).toHaveTextContent( - parseCtsiValue(BigNumber.from(defaultValue)), + parseCtsiValue(BigInt(defaultValue)), ); }); @@ -52,7 +51,7 @@ describe('Allowance Section', () => { const mockOnClick = jest.fn(); const { getByRole } = render( , ); diff --git a/__tests__/components/stake/components/DepositSection.test.tsx b/__tests__/components/stake/components/DepositSection.test.tsx index ca0ff862..6edee023 100644 --- a/__tests__/components/stake/components/DepositSection.test.tsx +++ b/__tests__/components/stake/components/DepositSection.test.tsx @@ -10,7 +10,6 @@ // PARTICULAR PURPOSE. See the GNU General Public License for more details. import { fireEvent, render, screen } from '@testing-library/react'; -import { BigNumber } from 'ethers'; import { DepositSection, IDepositSection, @@ -32,8 +31,8 @@ describe('Deposit Section', () => { const renderComponent = () => render( , ); @@ -72,8 +71,8 @@ describe('Deposit Section', () => { it('Should display add CTSI to deposit label', () => { render( , ); @@ -86,8 +85,8 @@ describe('Deposit Section', () => { it('Should display add CTSI to deposit label', () => { render( , ); @@ -102,8 +101,8 @@ describe('Deposit Section', () => { it('Should disable deposit button when userWalletBalance is zero', () => { const { getByText } = render( , ); @@ -114,8 +113,8 @@ describe('Deposit Section', () => { it('Should disable deposit button when userETHBalance is zero', () => { const { getByText } = render( , ); @@ -127,8 +126,8 @@ describe('Deposit Section', () => { useWalletMock.mockReturnValue({ ...dummyWallet, isGnosisSafe: true }); render( , ); @@ -139,8 +138,8 @@ describe('Deposit Section', () => { it('Should enable deposit button when userWalletBalance and userETHBalance are above zero', () => { const { getByText } = render( , ); @@ -152,8 +151,8 @@ describe('Deposit Section', () => { const mockOnClick = jest.fn(); const { getByText } = render( , ); diff --git a/__tests__/components/stake/components/PoolBalanceSection.test.tsx b/__tests__/components/stake/components/PoolBalanceSection.test.tsx index 5abc335a..8f35fab8 100644 --- a/__tests__/components/stake/components/PoolBalanceSection.test.tsx +++ b/__tests__/components/stake/components/PoolBalanceSection.test.tsx @@ -10,7 +10,6 @@ // PARTICULAR PURPOSE. See the GNU General Public License for more details. import { render, screen, fireEvent } from '@testing-library/react'; -import { BigNumber } from 'ethers'; import { IPoolBalanceSectionProps, PoolBalanceSection, @@ -30,7 +29,7 @@ describe('Deposit Section', () => { const renderComponent = () => render( { it('Should display currently locked pool balance label', () => { render( { renderComponent(); expect(screen.getByRole('ctsi-text')).toHaveTextContent( - parseCtsiValue(BigNumber.from(defaultValue)), + parseCtsiValue(BigInt(defaultValue)), ); }); it('Should disable stake button when pool balance is locked', () => { const { getByText } = render( { it('Should disable stake button when userPoolBalance is zero', () => { const { getByText } = render( { it('Should disable withdraw button when userPoolBalance is zero', () => { const { getByText } = render( { it('Should enable stake button when userPoolBalance and userETHBalance are above zero', () => { const { getByText } = render( { it('Should enable withdraw button when userPoolBalance is above zero', () => { const { getByText } = render( { const mockOnClick = jest.fn(); const { getByText } = render( { const mockOnClick = jest.fn(); const { getByText } = render( { const renderComponent = () => render( , ); @@ -43,14 +42,14 @@ describe('Staked Balance Section', () => { renderComponent(); expect(screen.getByRole('ctsi-text')).toHaveTextContent( - parseCtsiValue(BigNumber.from(defaultValue)), + parseCtsiValue(BigInt(defaultValue)), ); }); it('Should disable unstake button when stakedBalance is zero', () => { const { getByText } = render( , ); @@ -61,7 +60,7 @@ describe('Staked Balance Section', () => { it('Should enable unstake button when stakedBalance is above zero', () => { const { getByText } = render( , ); @@ -73,7 +72,7 @@ describe('Staked Balance Section', () => { const mockOnClick = jest.fn(); const { getByText } = render( , ); diff --git a/__tests__/components/stake/components/WalletBalanceSection.test.tsx b/__tests__/components/stake/components/WalletBalanceSection.test.tsx index 9f99a60c..4d239fd0 100644 --- a/__tests__/components/stake/components/WalletBalanceSection.test.tsx +++ b/__tests__/components/stake/components/WalletBalanceSection.test.tsx @@ -10,7 +10,6 @@ // PARTICULAR PURPOSE. See the GNU General Public License for more details. import { render, screen } from '@testing-library/react'; -import { BigNumber } from 'ethers'; import { parseCtsiValue } from '../../../../src/components/pools/staking/CTSI'; import { IWalletBalanceSectionProps, @@ -33,8 +32,8 @@ describe('Wallet Balance Section', () => { const renderComponent = () => render( , ); @@ -60,8 +59,8 @@ describe('Wallet Balance Section', () => { it('Should display not enough ETH when userETHBalance is zero', () => { const { getByText } = render( , ); @@ -80,8 +79,8 @@ describe('Wallet Balance Section', () => { render( , ); @@ -95,8 +94,8 @@ describe('Wallet Balance Section', () => { it('Should not display not enough ETH when userETHBalance is above zero', () => { const { getByText } = render( , ); @@ -111,7 +110,7 @@ describe('Wallet Balance Section', () => { renderComponent(); expect(screen.getByRole('ctsi-text')).toHaveTextContent( - parseCtsiValue(BigNumber.from(defaultValue)), + parseCtsiValue(BigInt(defaultValue)), ); }); }); diff --git a/__tests__/components/stake/modals/StakingDepositModal.test.tsx b/__tests__/components/stake/modals/StakingDepositModal.test.tsx index a24be478..b6aa07c8 100644 --- a/__tests__/components/stake/modals/StakingDepositModal.test.tsx +++ b/__tests__/components/stake/modals/StakingDepositModal.test.tsx @@ -15,13 +15,12 @@ import { IStakingDepositModalProps, } from '../../../../src/components/stake/modals/StakingDepositModal'; import { withChakraTheme } from '../../../test-utilities'; -import { BigNumber } from 'ethers'; const defaultValue = '100000000000000000000000'; const defaultProps = { - allowance: BigNumber.from(defaultValue), - balance: BigNumber.from(defaultValue), + allowance: BigInt(defaultValue), + balance: BigInt(defaultValue), disclosure: { onClose: () => undefined, }, @@ -39,12 +38,7 @@ describe('Staking Deposit Modal', () => { render(); it('Should display allowance label when allowance is zero', () => { - render( - , - ); + render(); expect( screen.getByText( @@ -100,10 +94,7 @@ describe('Staking Deposit Modal', () => { it('Should disable deposit button when deposit is zero', () => { const { getByRole } = render( - , + , ); expect(getByRole('deposit-button')).toBeDisabled(); diff --git a/__tests__/components/stake/modals/StakingPoolAllowanceModal.test.tsx b/__tests__/components/stake/modals/StakingPoolAllowanceModal.test.tsx index 542dbad2..ff710aa4 100644 --- a/__tests__/components/stake/modals/StakingPoolAllowanceModal.test.tsx +++ b/__tests__/components/stake/modals/StakingPoolAllowanceModal.test.tsx @@ -15,13 +15,12 @@ import { IStakingPoolAllowanceModalProps, } from '../../../../src/components/stake/modals/StakingPoolAllowanceModal'; import { withChakraTheme } from '../../../test-utilities'; -import { BigNumber } from 'ethers'; const defaultValue = '100000000000000000000000'; const defaultProps = { - allowance: BigNumber.from(defaultValue), - balance: BigNumber.from(defaultValue), + allowance: BigInt(defaultValue), + balance: BigInt(defaultValue), disclosure: { onClose: () => undefined, }, diff --git a/__tests__/components/stake/modals/StakingStakeModal.test.tsx b/__tests__/components/stake/modals/StakingStakeModal.test.tsx index dabfdb2f..538a26dd 100644 --- a/__tests__/components/stake/modals/StakingStakeModal.test.tsx +++ b/__tests__/components/stake/modals/StakingStakeModal.test.tsx @@ -15,13 +15,12 @@ import { IStakingStakeModalProps, } from '../../../../src/components/stake/modals/StakingStakeModal'; import { withChakraTheme } from '../../../test-utilities'; -import { BigNumber } from 'ethers'; const defaultValue = '100000000000000000000000'; const defaultProps = { - balance: BigNumber.from(defaultValue), - userBalance: BigNumber.from(defaultValue), + balance: BigInt(defaultValue), + userBalance: BigInt(defaultValue), disclosure: { onClose: () => undefined, }, @@ -90,10 +89,7 @@ describe('Staking Stake Modal', () => { it('Should disable stake button when stake is zero', () => { const { getByTestId } = render( - , + , ); expect(getByTestId('stake-button')).toBeDisabled(); diff --git a/__tests__/components/stake/modals/StakingUnstakeModal.test.tsx b/__tests__/components/stake/modals/StakingUnstakeModal.test.tsx index ce4ce535..21757354 100644 --- a/__tests__/components/stake/modals/StakingUnstakeModal.test.tsx +++ b/__tests__/components/stake/modals/StakingUnstakeModal.test.tsx @@ -10,8 +10,7 @@ // PARTICULAR PURPOSE. See the GNU General Public License for more details. import { fireEvent, render, screen, waitFor } from '@testing-library/react'; -import { BigNumber } from 'ethers'; -import { parseUnits } from 'ethers/lib/utils'; +import { parseUnits } from 'viem'; import { IStakingUnstakeModalProps, StakingUnstakeModal, @@ -22,7 +21,7 @@ import userEvent from '@testing-library/user-event'; const defaultValue = '100000000000000000000000'; const defaultProps = { - stakedBalance: BigNumber.from(defaultValue), + stakedBalance: BigInt(defaultValue), disclosure: { onClose: () => undefined, }, diff --git a/__tests__/components/stake/modals/StakingWithdrawModal.test.tsx b/__tests__/components/stake/modals/StakingWithdrawModal.test.tsx index 3ea23a38..10ca3519 100644 --- a/__tests__/components/stake/modals/StakingWithdrawModal.test.tsx +++ b/__tests__/components/stake/modals/StakingWithdrawModal.test.tsx @@ -15,12 +15,11 @@ import { IStakingWithdrawModalProps, } from '../../../../src/components/stake/modals/StakingWithdrawModal'; import { withChakraTheme } from '../../../test-utilities'; -import { BigNumber } from 'ethers'; const defaultValue = '100000000000000000000000'; const defaultProps = { - userBalance: BigNumber.from(defaultValue), + userBalance: BigInt(defaultValue), disclosure: { onClose: () => undefined, }, diff --git a/__tests__/components/stake/stats/EffectiveBalanceStat.test.tsx b/__tests__/components/stake/stats/EffectiveBalanceStat.test.tsx index d8ff4622..2d089e8e 100644 --- a/__tests__/components/stake/stats/EffectiveBalanceStat.test.tsx +++ b/__tests__/components/stake/stats/EffectiveBalanceStat.test.tsx @@ -11,7 +11,6 @@ import { act, render, screen } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; -import { BigNumber } from 'ethers'; import EffectiveBalanceStat, { EffectiveBalanceStatProps, } from '../../../../src/components/stake/stats/EffectiveBalanceStat'; @@ -19,13 +18,13 @@ import { withChakraTheme } from '../../../test-utilities'; const defaultValue = '10000000000000000000000000000'; const defaultProps = { - stake: BigNumber.from(defaultValue), - unstake: BigNumber.from(defaultValue), - withdraw: BigNumber.from(defaultValue), - stakingMature: BigNumber.from(defaultValue), - stakingMaturing: BigNumber.from(defaultValue), - stakingReleasing: BigNumber.from(defaultValue), - stakingReleased: BigNumber.from(defaultValue), + stake: BigInt(defaultValue), + unstake: BigInt(defaultValue), + withdraw: BigInt(defaultValue), + stakingMature: BigInt(defaultValue), + stakingMaturing: BigInt(defaultValue), + stakingReleasing: BigInt(defaultValue), + stakingReleased: BigInt(defaultValue), stakingMaturingTimestamp: new Date(), stakingReleasingTimestamp: new Date(), hideZeros: false, @@ -49,9 +48,9 @@ describe('Effective Balance Stat', () => { render( , ); diff --git a/__tests__/components/stake/stats/PoolBalanceStat.test.tsx b/__tests__/components/stake/stats/PoolBalanceStat.test.tsx index 05e4a942..254968fd 100644 --- a/__tests__/components/stake/stats/PoolBalanceStat.test.tsx +++ b/__tests__/components/stake/stats/PoolBalanceStat.test.tsx @@ -11,7 +11,6 @@ import { act, render, screen } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; -import { BigNumber } from 'ethers'; import PoolBalanceStat, { PoolBalanceStatProps, } from '../../../../src/components/stake/stats/PoolBalanceStat'; @@ -24,7 +23,7 @@ const EPoolBalanceStat = withChakraTheme(PoolBalanceStat); describe('Pool Balance Stat', () => { // a default configured component const renderComponent = () => - render(); + render(); it('Should display pool balance label', () => { renderComponent(); diff --git a/__tests__/components/stake/stats/StakedBalanceStat.test.tsx b/__tests__/components/stake/stats/StakedBalanceStat.test.tsx index 820992dd..e7aa6f3b 100644 --- a/__tests__/components/stake/stats/StakedBalanceStat.test.tsx +++ b/__tests__/components/stake/stats/StakedBalanceStat.test.tsx @@ -11,7 +11,6 @@ import { act, render, screen } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; -import { BigNumber } from 'ethers'; import StakedBalanceStat, { StakedBalanceStatProps, } from '../../../../src/components/stake/stats/StakedBalanceStat'; @@ -25,9 +24,7 @@ const EStakedBalanceStat = describe('Staked Balance Stat', () => { // a default configured component const renderComponent = () => - render( - , - ); + render(); it('Should display staked balance label', () => { renderComponent(); diff --git a/__tests__/services/eth.test.ts b/__tests__/services/eth.test.ts index 2a33fa3c..ec379e71 100644 --- a/__tests__/services/eth.test.ts +++ b/__tests__/services/eth.test.ts @@ -9,34 +9,21 @@ // WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A // PARTICULAR PURPOSE. See the GNU General Public License for more details. -import { isAddress } from '@ethersproject/address'; -import { Web3Provider } from '@ethersproject/providers'; import { renderHook, waitFor } from '@testing-library/react'; -import { BigNumber } from 'ethers'; import { WalletConnectionContextProps } from '../../src/components/wallet/definitions'; import { useWallet } from '../../src/components/wallet/useWallet'; import { useBalance, useBlockNumber } from '../../src/services/eth'; jest.mock('../../src/components/wallet/useWallet'); -jest.mock('@ethersproject/address', () => { - const originalModule = jest.requireActual('@ethersproject/address'); - return { - __esModule: true, - ...originalModule, - isAddress: jest.fn(), - }; -}); const address = '0x51937974a767da96dc1c3f9a7b07742e256f0ffe'; const mockUseWallet = useWallet as jest.MockedFunction; -const mockedIsAddress = isAddress as jest.MockedFunction; const walletData = { - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore - library: { - getSigner: jest.fn(), - } as unknown as Web3Provider, + publicClient: { + getBalance: jest.fn(), + watchBlockNumber: jest.fn(), + }, account: address, active: true, activate: jest.fn(), @@ -62,7 +49,7 @@ describe('eth service', () => { it('should return undefined balance if library is not defined', async () => { mockUseWallet.mockReturnValue({ ...walletData, - library: undefined, + publicClient: undefined, } as unknown as WalletConnectionContextProps); const { result } = renderHook(() => useBalance(address)); @@ -75,8 +62,9 @@ describe('eth service', () => { mockUseWallet.mockReturnValue( walletData as unknown as WalletConnectionContextProps, ); - mockedIsAddress.mockReturnValue(false); - const { result } = renderHook(() => useBalance(address)); + const { result } = renderHook(() => useBalance('not-an-address')); + + expect(walletData.publicClient.getBalance).not.toHaveBeenCalled(); await waitFor(() => { expect(result.current).toBe(undefined); @@ -84,21 +72,19 @@ describe('eth service', () => { }); it('should return correct balance if address is valid', async () => { - const balance = BigNumber.from('10000000000'); + const balance = 10000000000n; + const getBalance = jest.fn().mockResolvedValue(balance); mockUseWallet.mockReturnValue({ ...walletData, - library: { - ...walletData.library, - getBalance: () => Promise.resolve(balance), - }, + publicClient: { ...walletData.publicClient, getBalance }, } as unknown as WalletConnectionContextProps); - mockedIsAddress.mockReturnValue(true); const { result } = renderHook(() => useBalance(address)); await waitFor(() => { - expect(result.current).toStrictEqual(balance); + expect(result.current).toBe(balance); }); + expect(getBalance).toHaveBeenCalledWith({ address }); }); }); @@ -106,7 +92,7 @@ describe('eth service', () => { it('should return zero block number if library is not defined', async () => { mockUseWallet.mockReturnValue({ ...walletData, - library: undefined, + publicClient: undefined, } as unknown as WalletConnectionContextProps); const { result } = renderHook(() => useBlockNumber()); @@ -117,20 +103,26 @@ describe('eth service', () => { it('should return correct block number if library is defined', async () => { const blockNumber = 10; + const unwatch = jest.fn(); + const watchBlockNumber = jest.fn(({ onBlockNumber }) => { + onBlockNumber(BigInt(blockNumber)); + return unwatch; + }); mockUseWallet.mockReturnValue({ ...walletData, - library: { - ...walletData.library, - getBlockNumber: () => Promise.resolve(blockNumber), - on: jest.fn(), - removeListener: jest.fn(), - }, + publicClient: { ...walletData.publicClient, watchBlockNumber }, } as unknown as WalletConnectionContextProps); - const { result } = renderHook(() => useBlockNumber()); + const { result, unmount } = renderHook(() => useBlockNumber()); await waitFor(() => { expect(result.current).toStrictEqual(blockNumber); }); + expect(watchBlockNumber).toHaveBeenCalledWith( + expect.objectContaining({ emitOnBegin: true }), + ); + + unmount(); + expect(unwatch).toHaveBeenCalled(); }); }); }); diff --git a/__tests__/services/mocks.ts b/__tests__/services/mocks.ts index 40ad9b1d..a07ec65c 100644 --- a/__tests__/services/mocks.ts +++ b/__tests__/services/mocks.ts @@ -9,19 +9,10 @@ // WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A // PARTICULAR PURPOSE. See the GNU General Public License for more details. -import { ContractTransaction, Event } from 'ethers'; -import { mock } from 'jest-mock-extended'; +import { Hash } from 'viem'; import { buildContractReceipt } from '../components/node/mocks'; -const contractTransactionFactory = () => mock(); -const receiptEventFactory = () => mock(); +const buildTransactionHash = (): Hash => + '0x5b73e239c55d790e3c9c3bbb84092652db01bb8dbf49ccc9e4a318470419d9a0'; -const buildContractTransaction = () => contractTransactionFactory(); - -const buildContractReceiptEvent = () => receiptEventFactory(); - -export { - buildContractReceipt, - buildContractTransaction, - buildContractReceiptEvent, -}; +export { buildContractReceipt, buildTransactionHash }; diff --git a/__tests__/services/node.test.ts b/__tests__/services/node.test.ts index b4ef999b..ecf91eb3 100644 --- a/__tests__/services/node.test.ts +++ b/__tests__/services/node.test.ts @@ -9,13 +9,7 @@ // WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A // PARTICULAR PURPOSE. See the GNU General Public License for more details. -import { PoS } from '@cartesi/pos'; -import { PoS as PoS1 } from '@cartesi/pos-1.0'; -import { WorkerManagerAuthManagerImpl } from '@cartesi/util'; -import { isAddress } from '@ethersproject/address'; -import { Web3Provider } from '@ethersproject/providers'; import { renderHook, waitFor } from '@testing-library/react'; -import { BigNumber } from 'ethers'; import { act } from 'react'; import { WalletConnectionContextProps } from '../../src/components/wallet/definitions'; import { useWallet } from '../../src/components/wallet/useWallet'; @@ -29,16 +23,9 @@ import { useNode } from '../../src/services/node'; import { Transaction, useTransaction } from '../../src/services/transaction'; jest.mock('../../src/components/wallet/useWallet'); -jest.mock('@ethersproject/address', () => { - const originalModule = jest.requireActual('@ethersproject/address'); - return { - __esModule: true, - ...originalModule, - isAddress: jest.fn(), - }; -}); jest.mock('../../src/services/contracts', () => ({ + ...jest.requireActual('../../src/services/contracts'), useWorkerManagerContract: jest.fn(), usePoSContract: jest.fn(), usePoS1Contract: jest.fn(), @@ -64,7 +51,6 @@ jest.mock('../../src/services/eth', () => { const address = '0x51937974a767da96dc1c3f9a7b07742e256f0ffe'; const account = '0x907eA0e65Ecf3af503007B382E1280Aeb46104ad'; const mockUseWallet = useWallet as jest.MockedFunction; -const mockedIsAddress = isAddress as jest.MockedFunction; const mockedUseTransaction = useTransaction as jest.MockedFunction< typeof useTransaction >; @@ -82,14 +68,12 @@ const mockedUsePoS1Contract = usePoS1Contract as jest.MockedFunction< const mockedUseBalance = useBalance as jest.MockedFunction; const walletData = { - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore - library: { - getSigner: jest.fn(), - getBlockNumber: () => Promise.resolve(), - on: jest.fn(), - removeListener: jest.fn(), - } as unknown as Web3Provider, + publicClient: { + watchBlockNumber: jest.fn(() => jest.fn()), + }, + walletClient: { + sendTransaction: jest.fn(), + }, account: address, active: true, activate: jest.fn(), @@ -100,17 +84,24 @@ const walletData = { }, }; +type WorkerManager = ReturnType; + const workerManager = { - getUser: () => Promise.resolve(), - isAvailable: () => Promise.resolve(), - isPending: () => Promise.resolve(), - isOwned: () => Promise.resolve(), - isRetired: () => Promise.resolve(), - isAuthorized: () => Promise.resolve(), - authorize: jest.fn(), - hireAndAuthorize: jest.fn(), - cancelHire: jest.fn(), - retire: jest.fn(), + address, + read: { + getUser: () => Promise.resolve(), + isAvailable: () => Promise.resolve(), + isPending: () => Promise.resolve(), + isOwned: () => Promise.resolve(), + isRetired: () => Promise.resolve(), + isAuthorized: () => Promise.resolve(), + }, + write: { + authorize: jest.fn(), + hireAndAuthorize: jest.fn(), + cancelHire: jest.fn(), + retire: jest.fn(), + }, }; const pos = { @@ -123,19 +114,22 @@ const pos1 = { describe('node service', () => { beforeEach(() => { - mockedIsAddress.mockReturnValue(true); mockUseWallet.mockReturnValue( walletData as unknown as WalletConnectionContextProps, ); mockedUseWorkerManagerContract.mockReturnValue( - workerManager as unknown as WorkerManagerAuthManagerImpl, + workerManager as unknown as WorkerManager, ); mockedUseTransaction.mockReturnValue({ set: jest.fn(), } as unknown as Transaction); - mockedUsePoSContract.mockReturnValue(pos as PoS); - mockedUsePoS1Contract.mockReturnValue(pos1 as PoS1); - mockedUseBalance.mockReturnValue(BigNumber.from('10000')); + mockedUsePoSContract.mockReturnValue( + pos as ReturnType, + ); + mockedUsePoS1Contract.mockReturnValue( + pos1 as ReturnType, + ); + mockedUseBalance.mockReturnValue(10000n); }); afterEach(() => { @@ -147,12 +141,7 @@ describe('node service', () => { const mockedSendTransaction = jest.fn(); mockUseWallet.mockReturnValue({ ...walletData, - library: { - ...walletData.library, - getSigner: () => ({ - sendTransaction: mockedSendTransaction, - }), - } as unknown as Web3Provider, + walletClient: { sendTransaction: mockedSendTransaction }, } as unknown as WalletConnectionContextProps); const mockedSet = jest.fn(); @@ -163,7 +152,7 @@ describe('node service', () => { const { result } = renderHook(() => useNode(address)); await act(async () => { - result.current.transfer(1000); + result.current.transfer(1000n); }); expect(mockedSendTransaction).toHaveBeenCalled(); @@ -173,9 +162,9 @@ describe('node service', () => { it('should trigger retire function', async () => { const mockedRetire = jest.fn(); mockedUseWorkerManagerContract.mockReturnValue({ - ...walletData, - retire: mockedRetire, - } as unknown as WorkerManagerAuthManagerImpl); + ...workerManager, + write: { ...workerManager.write, retire: mockedRetire }, + } as unknown as WorkerManager); const mockedSet = jest.fn(); mockedUseTransaction.mockReturnValue({ @@ -195,9 +184,9 @@ describe('node service', () => { it('should trigger cancelHire function', async () => { const mockedCancelHire = jest.fn(); mockedUseWorkerManagerContract.mockReturnValue({ - ...walletData, - cancelHire: mockedCancelHire, - } as unknown as WorkerManagerAuthManagerImpl); + ...workerManager, + write: { ...workerManager.write, cancelHire: mockedCancelHire }, + } as unknown as WorkerManager); const mockedSet = jest.fn(); mockedUseTransaction.mockReturnValue({ @@ -217,9 +206,12 @@ describe('node service', () => { it('should trigger hire function', async () => { const mockedHireAndAuthorize = jest.fn(); mockedUseWorkerManagerContract.mockReturnValue({ - ...walletData, - hireAndAuthorize: mockedHireAndAuthorize, - } as unknown as WorkerManagerAuthManagerImpl); + ...workerManager, + write: { + ...workerManager.write, + hireAndAuthorize: mockedHireAndAuthorize, + }, + } as unknown as WorkerManager); const mockedSet = jest.fn(); mockedUseTransaction.mockReturnValue({ @@ -229,7 +221,7 @@ describe('node service', () => { const { result } = renderHook(() => useNode(address)); await act(async () => { - result.current.hire(10000); + result.current.hire(10000n); }); expect(mockedSet).toHaveBeenCalled(); @@ -239,9 +231,9 @@ describe('node service', () => { it('should trigger authorize function', async () => { const mockedAuthorize = jest.fn(); mockedUseWorkerManagerContract.mockReturnValue({ - ...walletData, - authorize: mockedAuthorize, - } as unknown as WorkerManagerAuthManagerImpl); + ...workerManager, + write: { ...workerManager.write, authorize: mockedAuthorize }, + } as unknown as WorkerManager); const mockedSet = jest.fn(); mockedUseTransaction.mockReturnValue({ @@ -265,14 +257,16 @@ describe('node service', () => { const retired = false; const authorized = true; mockedUseWorkerManagerContract.mockReturnValue({ - ...walletData, - getUser: () => Promise.resolve(account), - isAvailable: () => Promise.resolve(available), - isPending: () => Promise.resolve(pending), - isOwned: () => Promise.resolve(owned), - isRetired: () => Promise.resolve(retired), - isAuthorized: () => Promise.resolve(authorized), - } as unknown as WorkerManagerAuthManagerImpl); + ...workerManager, + read: { + getUser: () => Promise.resolve(account), + isAvailable: () => Promise.resolve(available), + isPending: () => Promise.resolve(pending), + isOwned: () => Promise.resolve(owned), + isRetired: () => Promise.resolve(retired), + isAuthorized: () => Promise.resolve(authorized), + }, + } as unknown as WorkerManager); const { result } = renderHook(() => useNode(address)); diff --git a/__tests__/services/pool.test.ts b/__tests__/services/pool.test.ts index 006b06c7..2b2db7bb 100644 --- a/__tests__/services/pool.test.ts +++ b/__tests__/services/pool.test.ts @@ -9,13 +9,7 @@ // WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A // PARTICULAR PURPOSE. See the GNU General Public License for more details. -import { - Fee, - FlatRateCommission, - StakingPoolImpl, -} from '@cartesi/staking-pool'; import { renderHook, waitFor } from '@testing-library/react'; -import { BigNumber, FixedNumber } from 'ethers'; import { act } from 'react'; import { useFeeContract, @@ -40,6 +34,7 @@ jest.mock('../../src/services/eth', () => ({ })); jest.mock('../../src/services/contracts', () => ({ + ...jest.requireActual('../../src/services/contracts'), useFlatRateCommissionContract: jest.fn(), useFeeContract: jest.fn(), useStakingPoolContract: jest.fn(), @@ -64,40 +59,55 @@ const mockUseFeeContract = useFeeContract as jest.MockedFunction< typeof useFeeContract >; +type Fee = ReturnType; +type FlatRateCommission = ReturnType; +type StakingPoolImpl = ReturnType; + const flatRateCommissionContract = { - setRate: jest.fn(), - rate: () => Promise.resolve(), - feeRaiseTimeout: () => Promise.resolve(), - maxRaise: () => Promise.resolve(), - timeoutTimestamp: () => Promise.resolve(BigNumber.from('10000')), + read: { + rate: () => Promise.resolve(), + feeRaiseTimeout: () => Promise.resolve(), + maxRaise: () => Promise.resolve(), + timeoutTimestamp: () => Promise.resolve(10000n), + }, + write: { + setRate: jest.fn(), + }, }; const balance = { - shares: BigNumber.from('1000000'), - depositTimestamp: BigNumber.from('1000000'), - balance: BigNumber.from('1000000'), + shares: 1000000n, + depositTimestamp: 1000000n, + balance: 1000000n, }; +// userBalance() returns [balance, shares, depositTimestamp] +const userBalance = [balance.balance, balance.shares, balance.depositTimestamp]; + const stakingPoolContract = { - shares: () => Promise.resolve(), - amount: () => Promise.resolve(), - pos: () => Promise.resolve(), - userBalance: () => Promise.resolve(balance), - lockTime: () => Promise.resolve(BigNumber.from('10000')), - getWithdrawBalance: () => Promise.resolve(), - paused: () => Promise.resolve(), - amounts: () => Promise.resolve(), - deposit: jest.fn(), - stake: jest.fn(), - unstake: jest.fn(), - withdraw: jest.fn(), - setName: jest.fn(), - pause: jest.fn(), - unpause: jest.fn(), - hire: jest.fn(), - retire: jest.fn(), - rebalance: jest.fn(), - update: jest.fn(), + read: { + shares: () => Promise.resolve(), + amount: () => Promise.resolve(), + pos: () => Promise.resolve(), + userBalance: () => Promise.resolve(userBalance), + lockTime: () => Promise.resolve(10000n), + getWithdrawBalance: () => Promise.resolve(), + paused: () => Promise.resolve(), + amounts: () => Promise.resolve([0n, 0n, 0n]), + }, + write: { + deposit: jest.fn(), + stake: jest.fn(), + unstake: jest.fn(), + withdraw: jest.fn(), + setName: jest.fn(), + pause: jest.fn(), + unpause: jest.fn(), + hire: jest.fn(), + retire: jest.fn(), + rebalance: jest.fn(), + update: jest.fn(), + }, }; describe('pool service', () => { @@ -129,26 +139,28 @@ describe('pool service', () => { }); it('should set correct values when fee is defined', async () => { - const rate = BigNumber.from('1000'); - const raiseTimeout = BigNumber.from('10000000'); - const maxRaise = BigNumber.from('1000000000'); - const timeoutTimestamp = BigNumber.from('10000'); + const rate = 1000n; + const raiseTimeout = 10000000n; + const maxRaise = 1000000000n; + const timeoutTimestamp = 10000n; mockedUseFlatRateCommissionContract.mockReturnValue({ - setRate: jest.fn(), - rate: () => Promise.resolve(rate), - feeRaiseTimeout: () => Promise.resolve(raiseTimeout), - maxRaise: () => Promise.resolve(maxRaise), - timeoutTimestamp: () => Promise.resolve(timeoutTimestamp), + ...flatRateCommissionContract, + read: { + rate: () => Promise.resolve(rate), + feeRaiseTimeout: () => Promise.resolve(raiseTimeout), + maxRaise: () => Promise.resolve(maxRaise), + timeoutTimestamp: () => Promise.resolve(timeoutTimestamp), + }, } as unknown as FlatRateCommission); const { result } = renderHook(() => useFlatRateCommission(address)); await waitFor(() => { - expect(result.current.rate).toStrictEqual(rate); - expect(result.current.raiseTimeout).toStrictEqual(raiseTimeout); - expect(result.current.maxRaise).toStrictEqual(maxRaise); + expect(result.current.rate).toBe(rate); + expect(result.current.raiseTimeout).toBe(raiseTimeout); + expect(result.current.maxRaise).toBe(maxRaise); expect(result.current.timeoutTimestamp).toStrictEqual( - new Date(timeoutTimestamp.toNumber() * 1000), + new Date(Number(timeoutTimestamp) * 1000), ); }); }); @@ -158,7 +170,7 @@ describe('pool service', () => { it('should return default initial values when fee is undefined', () => { mockUseFeeContract.mockReturnValue(undefined); - const reward = BigNumber.from('1000000'); + const reward = 1000000n; const { result } = renderHook(() => useStakingPoolCommission(address, reward), ); @@ -168,24 +180,22 @@ describe('pool service', () => { }); it('should return correct values when fee is defined', async () => { - const commission = BigNumber.from('1000000'); + const commission = 250000n; + const getCommission = jest.fn().mockResolvedValue(commission); mockUseFeeContract.mockReturnValue({ - getCommission: () => Promise.resolve(commission), + read: { getCommission }, } as unknown as Fee); - const reward = BigNumber.from('1000000'); + const reward = 1000000n; const { result } = renderHook(() => useStakingPoolCommission(address, reward), ); await waitFor(() => { - expect(result.current.value).toStrictEqual( - FixedNumber.from(commission) - .divUnsafe(FixedNumber.from(reward)) - .toUnsafeFloat(), - ); + expect(result.current.value).toStrictEqual(0.25); expect(result.current.loading).toBe(false); }); + expect(getCommission).toHaveBeenCalledWith([0n, reward]); }); }); @@ -194,7 +204,7 @@ describe('pool service', () => { const mockedUpdate = jest.fn(); mockedUseStakingPoolContract.mockReturnValue({ ...stakingPoolContract, - update: mockedUpdate, + write: { ...stakingPoolContract.write, update: mockedUpdate }, } as unknown as StakingPoolImpl); const mockedSet = jest.fn(); @@ -218,7 +228,10 @@ describe('pool service', () => { const mockedRebalance = jest.fn(); mockedUseStakingPoolContract.mockReturnValue({ ...stakingPoolContract, - rebalance: mockedRebalance, + write: { + ...stakingPoolContract.write, + rebalance: mockedRebalance, + }, } as unknown as StakingPoolImpl); const mockedSet = jest.fn(); @@ -242,7 +255,7 @@ describe('pool service', () => { const mockedRetire = jest.fn(); mockedUseStakingPoolContract.mockReturnValue({ ...stakingPoolContract, - retire: mockedRetire, + write: { ...stakingPoolContract.write, retire: mockedRetire }, } as unknown as StakingPoolImpl); const mockedSet = jest.fn(); @@ -266,7 +279,7 @@ describe('pool service', () => { const mockedHire = jest.fn(); mockedUseStakingPoolContract.mockReturnValue({ ...stakingPoolContract, - hire: mockedHire, + write: { ...stakingPoolContract.write, hire: mockedHire }, } as unknown as StakingPoolImpl); const mockedSet = jest.fn(); @@ -279,7 +292,7 @@ describe('pool service', () => { ); await act(async () => { - result.current.hire('worker-abc', BigNumber.from('10000')); + result.current.hire('worker-abc', 10000n); }); expect(mockedSet).toHaveBeenCalled(); @@ -290,7 +303,7 @@ describe('pool service', () => { const mockedUnpause = jest.fn(); mockedUseStakingPoolContract.mockReturnValue({ ...stakingPoolContract, - unpause: mockedUnpause, + write: { ...stakingPoolContract.write, unpause: mockedUnpause }, } as unknown as StakingPoolImpl); const mockedSet = jest.fn(); @@ -314,7 +327,7 @@ describe('pool service', () => { const mockedPause = jest.fn(); mockedUseStakingPoolContract.mockReturnValue({ ...stakingPoolContract, - pause: mockedPause, + write: { ...stakingPoolContract.write, pause: mockedPause }, } as unknown as StakingPoolImpl); const mockedSet = jest.fn(); @@ -338,7 +351,7 @@ describe('pool service', () => { const mockedSetName = jest.fn(); mockedUseStakingPoolContract.mockReturnValue({ ...stakingPoolContract, - setName: mockedSetName, + write: { ...stakingPoolContract.write, setName: mockedSetName }, } as unknown as StakingPoolImpl); const mockedSet = jest.fn(); @@ -362,7 +375,10 @@ describe('pool service', () => { const mockedWithdraw = jest.fn(); mockedUseStakingPoolContract.mockReturnValue({ ...stakingPoolContract, - withdraw: mockedWithdraw, + write: { + ...stakingPoolContract.write, + withdraw: mockedWithdraw, + }, } as unknown as StakingPoolImpl); const mockedSet = jest.fn(); @@ -375,7 +391,7 @@ describe('pool service', () => { ); await act(async () => { - result.current.withdraw(BigNumber.from('10000')); + result.current.withdraw(10000n); }); expect(mockedSet).toHaveBeenCalled(); @@ -386,7 +402,7 @@ describe('pool service', () => { const mockedUnstake = jest.fn(); mockedUseStakingPoolContract.mockReturnValue({ ...stakingPoolContract, - unstake: mockedUnstake, + write: { ...stakingPoolContract.write, unstake: mockedUnstake }, } as unknown as StakingPoolImpl); const mockedSet = jest.fn(); @@ -399,7 +415,7 @@ describe('pool service', () => { ); await act(async () => { - result.current.unstake(BigNumber.from('10000')); + result.current.unstake(10000n); }); expect(mockedSet).toHaveBeenCalled(); @@ -410,7 +426,7 @@ describe('pool service', () => { const mockedStake = jest.fn(); mockedUseStakingPoolContract.mockReturnValue({ ...stakingPoolContract, - stake: mockedStake, + write: { ...stakingPoolContract.write, stake: mockedStake }, } as unknown as StakingPoolImpl); const mockedSet = jest.fn(); @@ -423,7 +439,7 @@ describe('pool service', () => { ); await act(async () => { - result.current.stake(BigNumber.from('10000')); + result.current.stake(10000n); }); expect(mockedSet).toHaveBeenCalled(); @@ -434,7 +450,7 @@ describe('pool service', () => { const mockedDeposit = jest.fn(); mockedUseStakingPoolContract.mockReturnValue({ ...stakingPoolContract, - deposit: mockedDeposit, + write: { ...stakingPoolContract.write, deposit: mockedDeposit }, } as unknown as StakingPoolImpl); const mockedSet = jest.fn(); @@ -447,7 +463,7 @@ describe('pool service', () => { ); await act(async () => { - result.current.deposit(BigNumber.from('10000')); + result.current.deposit(10000n); }); expect(mockedSet).toHaveBeenCalled(); @@ -455,27 +471,34 @@ describe('pool service', () => { }); it('should set correct values when pool and account exist', async () => { - const shares = BigNumber.from('10000'); - const amount = BigNumber.from('100000'); + const shares = 10000n; + const amount = 100000n; const pos = 'pos-abc'; - const lockTime = BigNumber.from('10000'); + const lockTime = 10000n; const paused = false; - const withdrawBalance = BigNumber.from('1000000'); + const withdrawBalance = 1000000n; const amounts = { - stake: BigNumber.from('10000'), - unstake: BigNumber.from('10000'), - withdraw: BigNumber.from('10000'), + stake: 10000n, + unstake: 10000n, + withdraw: 10000n, }; mockedUseStakingPoolContract.mockReturnValue({ ...stakingPoolContract, - shares: () => Promise.resolve(shares), - amount: () => Promise.resolve(amount), - pos: () => Promise.resolve(pos), - userBalance: () => Promise.resolve(balance), - lockTime: () => Promise.resolve(lockTime), - getWithdrawBalance: () => Promise.resolve(withdrawBalance), - paused: () => Promise.resolve(paused), - amounts: () => Promise.resolve(amounts), + read: { + shares: () => Promise.resolve(shares), + amount: () => Promise.resolve(amount), + pos: () => Promise.resolve(pos), + userBalance: () => Promise.resolve(userBalance), + lockTime: () => Promise.resolve(lockTime), + getWithdrawBalance: () => Promise.resolve(withdrawBalance), + paused: () => Promise.resolve(paused), + amounts: () => + Promise.resolve([ + amounts.stake, + amounts.unstake, + amounts.withdraw, + ]), + }, } as unknown as StakingPoolImpl); const { result } = renderHook(() => @@ -483,23 +506,21 @@ describe('pool service', () => { ); await waitFor(() => { - expect(result.current.shares).toStrictEqual(shares); - expect(result.current.amount).toStrictEqual(amount); + expect(result.current.shares).toBe(shares); + expect(result.current.amount).toBe(amount); expect(result.current.pos).toStrictEqual(pos); expect(result.current.depositTimestamp).toStrictEqual( - new Date(balance.depositTimestamp.toNumber() * 1000), - ); - expect(result.current.withdrawBalance).toStrictEqual( - withdrawBalance, + new Date(Number(balance.depositTimestamp) * 1000), ); - expect(result.current.lockTime).toStrictEqual(lockTime); + expect(result.current.withdrawBalance).toBe(withdrawBalance); + expect(result.current.lockTime).toBe(lockTime); expect(result.current.stakeTimestamp).toStrictEqual( new Date( - balance.depositTimestamp.add(lockTime).toNumber() * - 1000, + Number(balance.depositTimestamp + lockTime) * 1000, ), ); - expect(result.current.balance).toStrictEqual(balance.balance); + expect(result.current.balance).toBe(balance.balance); + expect(result.current.stakedShares).toBe(balance.shares); expect(result.current.paused).toBe(paused); expect(result.current.amounts).toStrictEqual(amounts); }); diff --git a/__tests__/services/poolFactory.test.ts b/__tests__/services/poolFactory.test.ts index 29bf4a56..5fc953ea 100644 --- a/__tests__/services/poolFactory.test.ts +++ b/__tests__/services/poolFactory.test.ts @@ -9,15 +9,22 @@ // WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A // PARTICULAR PURPOSE. See the GNU General Public License for more details. -import { StakingPoolFactoryImpl } from '@cartesi/staking-pool'; -import { Web3Provider } from '@ethersproject/providers'; import { cleanup, renderHook, waitFor } from '@testing-library/react'; import { act } from 'react'; +import { + encodeAbiParameters, + encodeEventTopics, + getAddress, + parseEther, + TransactionReceipt, +} from 'viem'; import { WalletConnectionContextProps } from '../../src/components/wallet/definitions'; import { useWallet } from '../../src/components/wallet/useWallet'; import { useStakingPoolFactoryContract } from '../../src/services/contracts'; +import { stakingPoolFactoryAbi } from '../../src/services/contracts/generated'; import { useStakingPoolFactory } from '../../src/services/poolFactory'; import { Transaction, useTransaction } from '../../src/services/transaction'; +import { buildContractReceipt } from './mocks'; jest.mock('../../src/components/wallet/useWallet'); @@ -30,6 +37,7 @@ jest.mock('../../src/services/eth', () => ({ })); jest.mock('../../src/services/contracts', () => ({ + ...jest.requireActual('../../src/services/contracts'), useStakingPoolFactoryContract: jest.fn(), })); @@ -44,11 +52,6 @@ const mockedUseStakingPoolFactoryContract = >; const walletData = { - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore - library: { - getSigner: jest.fn(), - } as unknown as Web3Provider, account: address, active: true, activate: jest.fn(), @@ -59,11 +62,35 @@ const walletData = { }, }; +type StakingPoolFactoryImpl = ReturnType; + const stakingPoolFactoryContract = { - createFlatRateCommission: jest.fn(), - paused: () => Promise.resolve(), - referencePool: () => Promise.resolve(), - pos: () => Promise.resolve(), + read: { + paused: () => Promise.resolve(), + referencePool: () => Promise.resolve(), + pos: () => Promise.resolve(), + }, + write: { + createFlatRateCommission: jest.fn(), + }, +}; + +/** A receipt carrying the NewFlatRateCommissionStakingPool event. */ +const buildPoolCreatedReceipt = ( + pool: `0x${string}`, + fee: `0x${string}`, +): TransactionReceipt => { + const receipt = buildContractReceipt(); + const log = { + ...receipt.logs[0], + topics: encodeEventTopics({ + abi: stakingPoolFactoryAbi, + eventName: 'NewFlatRateCommissionStakingPool', + args: { pool }, + }), + data: encodeAbiParameters([{ type: 'address' }], [fee]), + } as unknown as TransactionReceipt['logs'][number]; + return { ...receipt, logs: [log] }; }; describe('poolFactory service', () => { @@ -90,7 +117,7 @@ describe('poolFactory service', () => { const mockedCreateFlatRateCommission = jest.fn(); mockedUseStakingPoolFactoryContract.mockReturnValue({ ...stakingPoolFactoryContract, - createFlatRateCommission: mockedCreateFlatRateCommission, + write: { createFlatRateCommission: mockedCreateFlatRateCommission }, } as unknown as StakingPoolFactoryImpl); const { result } = renderHook(() => useStakingPoolFactory()); @@ -99,7 +126,27 @@ describe('poolFactory service', () => { }); expect(mockedSet).toHaveBeenCalled(); - expect(mockedCreateFlatRateCommission).toHaveBeenCalled(); + expect(mockedCreateFlatRateCommission).toHaveBeenCalledWith([1000n], { + value: parseEther('0.001'), + }); + }); + + it('should resolve the created pool address from the transaction receipt', () => { + mockedUseTransaction.mockReturnValue({ + set: jest.fn(), + } as unknown as Transaction); + const pool = '0xe656584736b1efc14b4b6c785aa9c23bac8f41aa'; + const fee = '0x51937974a767da96dc1c3f9a7b07742e256f0ffe'; + + renderHook(() => useStakingPoolFactory()); + const [resultResolver] = mockedUseTransaction.mock.calls[0]; + + expect(resultResolver(buildPoolCreatedReceipt(pool, fee))).toBe( + getAddress(pool), + ); + expect( + resultResolver({ ...buildContractReceipt(), logs: [] }), + ).toBeUndefined(); }); it('should not set pos when poolFactory and account are undefined', () => { @@ -112,8 +159,11 @@ describe('poolFactory service', () => { const paused = true; mockedUseStakingPoolFactoryContract.mockReturnValue({ ...stakingPoolFactoryContract, - paused: () => Promise.resolve(paused), - referencePool: () => Promise.resolve(address), + read: { + ...stakingPoolFactoryContract.read, + paused: () => Promise.resolve(paused), + referencePool: () => Promise.resolve(address), + }, } as unknown as StakingPoolFactoryImpl); const { result } = renderHook(() => useStakingPoolFactory()); diff --git a/__tests__/services/staking.test.ts b/__tests__/services/staking.test.ts index 9266a0f6..d1ce5884 100644 --- a/__tests__/services/staking.test.ts +++ b/__tests__/services/staking.test.ts @@ -9,9 +9,7 @@ // WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A // PARTICULAR PURPOSE. See the GNU General Public License for more details. -import { StakingImpl } from '@cartesi/pos'; import { renderHook, waitFor } from '@testing-library/react'; -import { BigNumber, constants } from 'ethers'; import { act } from 'react'; import { useStakingContract } from '../../src/services/contracts'; import { useStaking } from '../../src/services/staking'; @@ -43,15 +41,21 @@ const mockedUseTransaction = useTransaction as jest.MockedFunction< typeof useTransaction >; +type StakingImpl = ReturnType; + const stakingContractData = { - stake: jest.fn(), - unstake: jest.fn(), - withdraw: jest.fn(), - getStakedBalance: () => Promise.resolve(BigNumber.from(0)), - getMaturingTimestamp: () => Promise.resolve(BigNumber.from(0)), - getReleasingTimestamp: () => Promise.resolve(BigNumber.from(0)), - getMaturingBalance: () => Promise.resolve(BigNumber.from(0)), - getReleasingBalance: () => Promise.resolve(BigNumber.from(0)), + read: { + getStakedBalance: () => Promise.resolve(0n), + getMaturingTimestamp: () => Promise.resolve(0n), + getReleasingTimestamp: () => Promise.resolve(0n), + getMaturingBalance: () => Promise.resolve(0n), + getReleasingBalance: () => Promise.resolve(0n), + }, + write: { + stake: jest.fn(), + unstake: jest.fn(), + withdraw: jest.fn(), + }, }; describe('staking service', () => { @@ -67,7 +71,7 @@ describe('staking service', () => { it('should correctly set stake amount', async () => { const mockedSet = jest.fn(); - const stakeAmount = BigNumber.from('100000000000'); + const stakeAmount = 100000000000n; mockedUseTransaction.mockReturnValue({ set: mockedSet, } as unknown as Transaction); @@ -82,7 +86,7 @@ describe('staking service', () => { it('should correctly set unstake amount', async () => { const mockedSet = jest.fn(); - const stakeAmount = BigNumber.from('100000000000'); + const stakeAmount = 100000000000n; mockedUseTransaction.mockReturnValue({ set: mockedSet, } as unknown as Transaction); @@ -97,7 +101,7 @@ describe('staking service', () => { it('should correctly set withdraw amount', async () => { const mockedSet = jest.fn(); - const stakeAmount = BigNumber.from('100000000000'); + const stakeAmount = 100000000000n; mockedUseTransaction.mockReturnValue({ set: mockedSet, } as unknown as Transaction); @@ -115,45 +119,39 @@ describe('staking service', () => { const { result } = renderHook(() => useStaking(undefined)); await waitFor(() => { - expect(result.current.stakedBalance).toStrictEqual(constants.Zero); - expect(result.current.releasingBalance).toStrictEqual( - constants.Zero, - ); - expect(result.current.maturingBalance).toStrictEqual( - constants.Zero, - ); + expect(result.current.stakedBalance).toBe(0n); + expect(result.current.releasingBalance).toBe(0n); + expect(result.current.maturingBalance).toBe(0n); }); }); it('should set correct balances when staking and user are defined', async () => { - const stakedBalance = BigNumber.from('1000000000'); - const maturingBalance = BigNumber.from('100000000000000'); - const releasingBalance = BigNumber.from('1000000000000000000'); - const maturingValue = BigNumber.from('1000000000'); - const releasingValue = BigNumber.from('1000000000'); + const stakedBalance = 1000000000n; + const maturingBalance = 100000000000000n; + const releasingBalance = 1000000000000000000n; + const maturingValue = 1000000000n; + const releasingValue = 1000000000n; mockedUseStakingContract.mockReturnValue({ ...stakingContractData, - getStakedBalance: () => Promise.resolve(stakedBalance), - getMaturingBalance: () => Promise.resolve(maturingBalance), - getReleasingBalance: () => Promise.resolve(releasingBalance), - getMaturingTimestamp: () => Promise.resolve(maturingValue), - getReleasingTimestamp: () => Promise.resolve(releasingValue), + read: { + getStakedBalance: () => Promise.resolve(stakedBalance), + getMaturingBalance: () => Promise.resolve(maturingBalance), + getReleasingBalance: () => Promise.resolve(releasingBalance), + getMaturingTimestamp: () => Promise.resolve(maturingValue), + getReleasingTimestamp: () => Promise.resolve(releasingValue), + }, } as unknown as StakingImpl); const { result } = renderHook(() => useStaking(account)); await waitFor(() => { - expect(result.current.stakedBalance).toStrictEqual(stakedBalance); - expect(result.current.maturingBalance).toStrictEqual( - maturingBalance, - ); - expect(result.current.releasingBalance).toStrictEqual( - releasingBalance, - ); + expect(result.current.stakedBalance).toBe(stakedBalance); + expect(result.current.maturingBalance).toBe(maturingBalance); + expect(result.current.releasingBalance).toBe(releasingBalance); expect(result.current.maturingTimestamp).toStrictEqual( - new Date(maturingValue.toNumber() * 1000), + new Date(Number(maturingValue) * 1000), ); expect(result.current.releasingTimestamp).toStrictEqual( - new Date(releasingValue.toNumber() * 1000), + new Date(Number(releasingValue) * 1000), ); }); }); diff --git a/__tests__/services/token.test.ts b/__tests__/services/token.test.ts index 922f6c3e..359814ba 100644 --- a/__tests__/services/token.test.ts +++ b/__tests__/services/token.test.ts @@ -9,11 +9,9 @@ // WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A // PARTICULAR PURPOSE. See the GNU General Public License for more details. -import { CartesiToken } from '@cartesi/token'; -import { formatUnits, parseUnits } from '@ethersproject/units'; import { renderHook, waitFor } from '@testing-library/react'; -import { BigNumber } from 'ethers'; import { act } from 'react'; +import { formatUnits, parseUnits } from 'viem'; import { useCartesiTokenContract } from '../../src/services/contracts'; import { useCartesiToken } from '../../src/services/token'; import { Transaction, useTransaction } from '../../src/services/transaction'; @@ -40,10 +38,16 @@ const mockedUseCartesiTokenContract = typeof useCartesiTokenContract >; +type CartesiToken = ReturnType; + const cartesiTokenData = { - balanceOf: () => Promise.resolve(BigNumber.from(0)), - allowance: () => Promise.resolve(BigNumber.from(0)), - approve: jest.fn(), + read: { + balanceOf: () => Promise.resolve(0n), + allowance: () => Promise.resolve(0n), + }, + write: { + approve: jest.fn(), + }, } as unknown as CartesiToken; describe('token service', () => { @@ -63,7 +67,7 @@ describe('token service', () => { const { result } = renderHook(() => useCartesiToken()); await act(async () => { - await result.current.approve('spender', BigNumber.from('100000')); + await result.current.approve('spender', 100000n); }); expect(mockedSet).toHaveBeenCalled(); @@ -72,25 +76,27 @@ describe('token service', () => { it('should set balance and allowance to zero when token and account are not defined', () => { const { result } = renderHook(() => useCartesiToken()); - expect(result.current.balance).toStrictEqual(BigNumber.from(0)); - expect(result.current.allowance).toStrictEqual(BigNumber.from(0)); + expect(result.current.balance).toBe(0n); + expect(result.current.allowance).toBe(0n); }); it('should correctly set balance and allowance when token and account are defined', async () => { - const balance = BigNumber.from('10000000'); - const allowance = BigNumber.from('10000000000'); + const balance = 10000000n; + const allowance = 10000000000n; const account = '0x51937974a767da96dc1c3f9a7b07742e256f0ffe'; const spender = '0x907eA0e65Ecf3af503007B382E1280Aeb46104ad'; mockedUseCartesiTokenContract.mockReturnValue({ ...cartesiTokenData, - balanceOf: () => Promise.resolve(balance), - allowance: () => Promise.resolve(allowance), + read: { + balanceOf: () => Promise.resolve(balance), + allowance: () => Promise.resolve(allowance), + }, } as unknown as CartesiToken); const { result } = renderHook(() => useCartesiToken(account, spender)); await waitFor(() => { - expect(result.current.balance).toStrictEqual(balance); - expect(result.current.allowance).toStrictEqual(allowance); + expect(result.current.balance).toBe(balance); + expect(result.current.allowance).toBe(allowance); }); }); @@ -98,7 +104,7 @@ describe('token service', () => { const { result } = renderHook(() => useCartesiToken()); const amount = 100000; - expect(result.current.parseCTSI(amount)).toStrictEqual( + expect(result.current.parseCTSI(amount)).toBe( parseUnits((amount * 1000).toString(), 15), ); }); @@ -106,7 +112,7 @@ describe('token service', () => { it('should correctly convert to CTSI', () => { const { result } = renderHook(() => useCartesiToken()); - const amount = BigNumber.from('10000'); + const amount = 10000n; expect(result.current.toCTSI(amount)).toStrictEqual( parseInt(formatUnits(amount, 18)), ); @@ -115,9 +121,9 @@ describe('token service', () => { it('should correctly convert to big CTSI', () => { const { result } = renderHook(() => useCartesiToken()); - const amount = BigNumber.from('10000'); - expect(result.current.toBigCTSI(amount)).toStrictEqual( - BigNumber.from(result.current.toCTSI(amount)), + const amount = 10000n; + expect(result.current.toBigCTSI(amount)).toBe( + BigInt(result.current.toCTSI(amount)), ); }); }); diff --git a/__tests__/services/transaction.test.ts b/__tests__/services/transaction.test.ts index 3c3b7fba..6f0c0f23 100644 --- a/__tests__/services/transaction.test.ts +++ b/__tests__/services/transaction.test.ts @@ -10,15 +10,22 @@ // PARTICULAR PURPOSE. See the GNU General Public License for more details. import { act, renderHook, waitFor } from '@testing-library/react'; -import { ContractTransaction } from 'ethers'; +import { + BaseError, + ContractFunctionRevertedError, + encodeErrorResult, + Hash, + TransactionReceipt, + UserRejectedRequestError, +} from 'viem'; import { useWallet } from '../../src/components/wallet/useWallet'; -import { Transaction, useTransaction } from '../../src/services/transaction'; -import { confirmations, Network } from '../../src/utils/networks'; import { - buildContractReceipt, - buildContractReceiptEvent, - buildContractTransaction, -} from './mocks'; + extractErrorMessage, + Transaction, + useTransaction, +} from '../../src/services/transaction'; +import { confirmations, Network } from '../../src/utils/networks'; +import { buildContractReceipt, buildTransactionHash } from './mocks'; const walletMod = '../../src/components/wallet/useWallet'; @@ -35,6 +42,11 @@ const mockUseWallet = useWallet as jest.MockedFunction; describe('Transaction service', () => { const account = '0x907eA0e65Ecf3af503007B382E1280Aeb46104ad'; + const waitForTransactionReceipt = jest.fn< + Promise, + [{ hash: Hash; confirmations: number }] + >(); + beforeEach(() => { // Partial filled Happy returns mockUseWallet.mockReturnValue({ @@ -43,7 +55,8 @@ describe('Transaction service', () => { activate: jest.fn(), deactivate: jest.fn(), chainId: 1, - }); + publicClient: { waitForTransactionReceipt }, + } as any); }); afterEach(() => { @@ -60,6 +73,7 @@ describe('Transaction service', () => { error: undefined, isOngoing: false, receipt: undefined, + confirmations: 0, result: undefined, state: 'acknowledged', submitting: false, @@ -78,7 +92,7 @@ describe('Transaction service', () => { act(() => { result.current.set( //to be resolved promise. - new Promise(() => null), + new Promise(() => null), ); }); @@ -89,15 +103,18 @@ describe('Transaction service', () => { }); it('should change state to waiting_confirmation when contract-transaction resolve (i.e. user signed the transaction)', async () => { - const contractTransaction = buildContractTransaction(); - contractTransaction.confirmations = 0; + const hash = buildTransactionHash(); + // receipt never arrives + waitForTransactionReceipt.mockReturnValue( + new Promise(() => null), + ); const { result } = renderHook(() => useTransaction()); expect(result.current).toHaveProperty('state', 'acknowledged'); expect(result.current).toHaveProperty('isOngoing', false); - const promise = new Promise((resolve) => - act(() => resolve(contractTransaction)), + const promise = new Promise((resolve) => + act(() => resolve(hash)), ); act(() => { @@ -117,18 +134,18 @@ describe('Transaction service', () => { ); expect(result.current.isOngoing).toBe(true); expect(result.current.submitting).toBe(false); - expect(result.current.transaction).toBeDefined(); + expect(result.current.transaction).toEqual({ hash, chainId: 1 }); + expect(result.current.confirmations).toBe(0); }); it('should change state to confirmed when contract-transaction reaches the expected confirmation number based on network', async () => { - const contractTransaction = buildContractTransaction(); - contractTransaction.confirmations = confirmations[Network.MAINNET]; + const hash = buildTransactionHash(); // A closer to real dummy contract receipt - contractTransaction.wait.mockResolvedValue(buildContractReceipt()); + waitForTransactionReceipt.mockResolvedValue(buildContractReceipt()); const { result } = renderHook(() => useTransaction()); - const promise = new Promise((resolve) => - act(() => resolve(contractTransaction)), + const promise = new Promise((resolve) => + act(() => resolve(hash)), ); act(() => { @@ -141,6 +158,13 @@ describe('Transaction service', () => { expect(result.current.isOngoing).toBe(false); expect(result.current.transaction).toBeDefined(); expect(result.current.receipt).toBeDefined(); + expect(result.current.confirmations).toBe( + confirmations[Network.MAINNET], + ); + expect(waitForTransactionReceipt).toHaveBeenCalledWith({ + hash, + confirmations: confirmations[Network.MAINNET], + }); }); }); @@ -164,6 +188,19 @@ describe('Transaction service', () => { expect(result.current.error).toEqual('Metamask error goes here'); }); + it('should use the short message when the wallet rejects the request', async () => { + const { result } = renderHook(() => useTransaction()); + const promise = Promise.reject( + new UserRejectedRequestError(new Error('denied')), + ); + + act(() => result.current.set(promise)); + + await waitFor(() => expect(result.current.state).toBe('errored')); + + expect(result.current.error).toEqual('User rejected the request.'); + }); + it('should be able to acknowledge the transaction after an errored state', async () => { const { result } = renderHook(() => useTransaction()); const promise = Promise.reject(new Error('Random error')); @@ -179,14 +216,14 @@ describe('Transaction service', () => { }); it('should handle transaction failures when trying to wait for confirmations', async () => { - const contractTransaction = buildContractTransaction(); - contractTransaction.wait.mockRejectedValue( + const hash = buildTransactionHash(); + waitForTransactionReceipt.mockRejectedValue( new Error('Network failure'), ); const { result } = renderHook(() => useTransaction()); - const promise = new Promise((resolve) => - act(() => resolve(contractTransaction)), + const promise = new Promise((resolve) => + act(() => resolve(hash)), ); act(() => { @@ -203,24 +240,49 @@ describe('Transaction service', () => { expect(result.current.receipt).not.toBeDefined(); }); + it('should change its state to errored when the transaction is reverted', async () => { + const hash = buildTransactionHash(); + waitForTransactionReceipt.mockResolvedValue({ + ...buildContractReceipt(), + status: 'reverted', + }); + const { result } = renderHook(() => useTransaction()); + + const promise = new Promise((resolve) => + act(() => resolve(hash)), + ); + + act(() => { + result.current.set(promise); + }); + + await waitFor(() => expect(result.current.state).toBe('errored')); + + expect(result.current.error).toEqual('Transaction reverted'); + expect(result.current.receipt).not.toBeDefined(); + expect(result.current.confirmations).toBe(0); + }); + it('should handle exceptions coming from the result resolver', async () => { - const contractTransaction = buildContractTransaction(); - contractTransaction.confirmations = confirmations[Network.MAINNET]; - // A closer to real dummy contract receipt but without any events. - contractTransaction.wait.mockResolvedValue(buildContractReceipt()); + const hash = buildTransactionHash(); + // A closer to real dummy contract receipt but without the expected log. + waitForTransactionReceipt.mockResolvedValue({ + ...buildContractReceipt(), + logs: [], + }); const { result } = renderHook(() => useTransaction((receipt) => { // naive resolver - const event = receipt.events.find( - ({ event }) => event == 'DummyEvent', + const log = receipt.logs.find( + ({ logIndex }) => logIndex == 160, ); - return event.args[0]; + return log.data; }), ); - const promise = new Promise((resolve) => - act(() => resolve(contractTransaction)), + const promise = new Promise((resolve) => + act(() => resolve(hash)), ); act(() => { @@ -231,7 +293,7 @@ describe('Transaction service', () => { expect(result.current.state).toEqual('errored'); expect(result.current.error).toEqual( - `Cannot read properties of undefined (reading 'args')`, + `Cannot read properties of undefined (reading 'data')`, ); expect(result.current.result).not.toBeDefined(); }); @@ -239,29 +301,22 @@ describe('Transaction service', () => { describe('Result resolver', () => { it('should be able to extract a result from a confirmed transaction', async () => { - const contractTransaction = buildContractTransaction(); - contractTransaction.confirmations = confirmations[Network.MAINNET]; + const hash = buildTransactionHash(); // A closer to real dummy contract receipt const receipt = buildContractReceipt(); - const receiptEvt = buildContractReceiptEvent(); - receiptEvt.event = 'DummyEvent'; - receiptEvt.args = ['my-result-goes-here']; - receipt.events = [receiptEvt]; - contractTransaction.wait.mockResolvedValue(receipt); + waitForTransactionReceipt.mockResolvedValue(receipt); const { result } = renderHook(() => useTransaction((receipt) => { - if (receipt.events) { - const event = receipt.events.find( - ({ event }) => event == 'DummyEvent', - ); + const log = receipt.logs.find( + ({ logIndex }) => logIndex == 160, + ); - return event.args[0]; - } + return log?.data; }), ); - const promise = new Promise((resolve) => - act(() => resolve(contractTransaction)), + const promise = new Promise((resolve) => + act(() => resolve(hash)), ); act(() => { @@ -271,7 +326,44 @@ describe('Transaction service', () => { await waitFor(() => expect(result.current.state).toBe('confirmed')); expect(result.current).toHaveProperty('state', 'confirmed'); - expect(result.current.result).toEqual('my-result-goes-here'); + expect(result.current.result).toEqual(receipt.logs[0].data); + }); + }); + + describe('extractErrorMessage', () => { + it('should use the message of plain errors', () => { + expect(extractErrorMessage(new Error('plain'))).toBe('plain'); + expect(extractErrorMessage('text')).toBe('text'); + }); + + it('should use the short message of viem errors', () => { + expect( + extractErrorMessage( + new UserRejectedRequestError(new Error('denied')), + ), + ).toBe('User rejected the request.'); + }); + + it('should use the revert reason when the contract call reverted', () => { + const reverted = new ContractFunctionRevertedError({ + abi: [], + functionName: 'stake', + // revert data of a require(..., "Not enough balance") + data: encodeErrorResult({ + abi: [ + { + type: 'error', + name: 'Error', + inputs: [{ name: 'message', type: 'string' }], + }, + ], + errorName: 'Error', + args: ['Not enough balance'], + }), + }); + const error = new BaseError('Call failed', { cause: reverted }); + + expect(extractErrorMessage(error)).toBe('Not enough balance'); }); }); }); diff --git a/__tests__/utils/numberParser.test.ts b/__tests__/utils/numberParser.test.ts index 96e72df9..7de21a88 100644 --- a/__tests__/utils/numberParser.test.ts +++ b/__tests__/utils/numberParser.test.ts @@ -7,22 +7,20 @@ // This program is distributed in the hope that it will be useful, but WITHOUT ANY // WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A // PARTICULAR PURPOSE. See the GNU General Public License for more details. -import { ethers } from 'ethers'; +import { parseUnits } from 'viem'; import { toBigNumber } from '../../src/utils/numberParser'; describe('NumberParser functions', () => { it('should parse a number as string to ethers BigNumber', () => { const numberAsString = '3999999'; expect(toBigNumber(numberAsString)).toEqual( - ethers.utils.parseUnits(numberAsString, 18), + parseUnits(numberAsString, 18), ); }); it('should parse a number to ethers BigNumber equivalent', () => { const number = 1000.5; - expect(toBigNumber(number)).toEqual( - ethers.utils.parseUnits(number.toString(), 18), - ); + expect(toBigNumber(number)).toEqual(parseUnits(number.toString(), 18)); }); it('should throw an error when passing wrong type as value', () => { diff --git a/__tests__/utils/reward.test.ts b/__tests__/utils/reward.test.ts index 528e3870..bb755e9a 100644 --- a/__tests__/utils/reward.test.ts +++ b/__tests__/utils/reward.test.ts @@ -9,17 +9,11 @@ // WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A // PARTICULAR PURPOSE. See the GNU General Public License for more details. -import { BigNumber } from 'ethers'; import { Block } from '../../src/graphql/models'; import { getEstimatedRewardRate, getRewardRate } from '../../src/utils/reward'; -/** - * Characterization tests: the expected values below were captured from the - * ethers v5 (BigNumber / FixedNumber) implementation and pin its behaviour so - * the bigint port must reproduce the same numbers. Results are compared as - * plain numbers and decimal strings so the assertions do not depend on the - * numeric library in use. - */ +// Baselines captured from the ethers v5 implementation, compared as plain numbers +// and decimal strings so the bigint port must reproduce them. const asNumber = (value: unknown): number => typeof value === 'number' ? value : Number(String(value)); @@ -96,8 +90,7 @@ const expectRatio = (actual: unknown, expected: number | string) => ? expect(asNumber(actual)).toBe(0) : expect(asNumber(actual) / Number(expected)).toBeCloseTo(1, 9); -/** The stake parameter is an ethers BigNumber today and a bigint after the port. */ -const toStake = (wei: string) => BigNumber.from(wei); +const toStake = (wei: string) => BigInt(wei); describe('reward utils (characterization)', () => { describe('getRewardRate', () => { diff --git a/__tests__/utils/token.test.ts b/__tests__/utils/token.test.ts index 908e3a8e..8e093fe3 100644 --- a/__tests__/utils/token.test.ts +++ b/__tests__/utils/token.test.ts @@ -10,12 +10,11 @@ // PARTICULAR PURPOSE. See the GNU General Public License for more details. import { formatCTSI, toCTSI, toBigNumber } from '../../src/utils/token'; -import { formatUnits, parseUnits } from 'ethers/lib/utils'; -import { BigNumber, FixedNumber } from 'ethers'; +import { formatUnits, parseUnits } from 'viem'; describe('token util', () => { it('should correctly format CTSI', () => { - const amount = BigNumber.from('100000000000000000'); + const amount = 100000000000000000n; const decimals = 10; const numberFormat = new Intl.NumberFormat('en-US', { maximumFractionDigits: decimals, @@ -27,17 +26,15 @@ describe('token util', () => { }); it('should correctly convert to CTSI', () => { - const amount = BigNumber.from('100000000000000000'); - expect(toCTSI(amount)).toStrictEqual( - FixedNumber.from(formatUnits(amount, 18)), - ); + const amount = 100000000000000000n; + expect(toCTSI(amount)).toBe(Number(formatUnits(amount, 18))); }); it('should correct convert to BigNumber', () => { const amount = 100000; const decimals = 10; - expect(toBigNumber(amount, decimals)).toStrictEqual( + expect(toBigNumber(amount, decimals)).toBe( parseUnits(amount.toString(), decimals), ); }); diff --git a/src/app/api/[chain]/ens/[address]/route.ts b/src/app/api/[chain]/ens/[address]/route.ts index 768ef2ce..26027cc4 100644 --- a/src/app/api/[chain]/ens/[address]/route.ts +++ b/src/app/api/[chain]/ens/[address]/route.ts @@ -9,7 +9,7 @@ // WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A // PARTICULAR PURPOSE. See the GNU General Public License for more details. -import { ethers } from 'ethers'; +import { isAddress } from 'viem'; import { NextRequest, NextResponse } from 'next/server'; import AddressENSService from '../../../../../services/server/ens/AddressENSService'; import handleResponse from '../../../../../services/server/handleResponse'; @@ -23,7 +23,7 @@ const handler = async ({ params }: Response) => { const chainName = (await params).chain; const address = (await params).address; - if (!ethers.utils.isAddress(address)) { + if (!isAddress(address, { strict: false })) { return NextResponse.json( { message: `${address} is not a valid address format.` }, { status: 422 }, diff --git a/src/app/api/[chain]/stats/route.ts b/src/app/api/[chain]/stats/route.ts index 6b84f59a..fd6998d9 100644 --- a/src/app/api/[chain]/stats/route.ts +++ b/src/app/api/[chain]/stats/route.ts @@ -9,8 +9,6 @@ // WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A // PARTICULAR PURPOSE. See the GNU General Public License for more details. -import { constants, FixedNumber } from 'ethers'; - import { getEstimatedRewardRate, getRewardRate, @@ -68,25 +66,21 @@ const handler = async ({ params }: Response) => { if (blocks && blocks.length > 0 && circulatingSupply && summary) { const { yearReturn } = getRewardRate(blocks, circulatingSupply); - participationRate = toCTSI(summary.totalStaked) - .divUnsafe(FixedNumber.from(circulatingSupply)) - .mulUnsafe(FixedNumber.from(100)) - .toUnsafeFloat(); + participationRate = + (toCTSI(summary.totalStaked) / circulatingSupply) * 100; - projectedAnnualEarnings = yearReturn - .mulUnsafe(FixedNumber.from(100)) - .toUnsafeFloat(); + projectedAnnualEarnings = yearReturn * 100; } - const { activeStake } = getEstimatedRewardRate(blocks, constants.One, 0, 0); + const { activeStake } = getEstimatedRewardRate(blocks, 1n, 0, 0); return NextResponse.json({ price: +marketData.market_data.current_price.usd.toFixed(4), circulatingSupply, - totalStaked: toCTSI(summary.totalStaked).toUnsafeFloat(), + totalStaked: toCTSI(summary.totalStaked), totalUsers: summary.totalUsers, totalStakers: summary.totalStakers, - effectiveTotalStaked: toCTSI(activeStake).toUnsafeFloat(), + effectiveTotalStaked: toCTSI(activeStake), hiredNodes: summary.totalNodes, projectedAnnualEarnings, participationRate, @@ -96,7 +90,7 @@ const handler = async ({ params }: Response) => { id: blocks[0].id, number: blocks[0].number, timestamp: blocks[0].timestamp, - reward: toCTSI(blocks[0].reward).toUnsafeFloat(), + reward: toCTSI(blocks[0].reward), difficulty: blocks[0].difficulty, chainNumber: blocks[0].chain.number, } diff --git a/src/app/stake/[pool]/commissions/page.tsx b/src/app/stake/[pool]/commissions/page.tsx index 39d5404b..c6965816 100644 --- a/src/app/stake/[pool]/commissions/page.tsx +++ b/src/app/stake/[pool]/commissions/page.tsx @@ -1,7 +1,7 @@ import { FC } from 'react'; import { notFound } from 'next/navigation'; import StakePoolCommissions from '../../../../components/stake/StakePoolCommissions'; -import { ethers } from 'ethers'; +import { isAddress } from 'viem'; import { getFormattedEnsName } from '../../../../services/server/utils'; interface StakePoolPageProps { @@ -12,7 +12,7 @@ export async function generateMetadata(props: StakePoolPageProps) { const params = await props.params; const address = params.pool; - if (!ethers.utils.isAddress(address)) { + if (!isAddress(address, { strict: false })) { notFound(); } @@ -27,7 +27,7 @@ export async function generateMetadata(props: StakePoolPageProps) { const StakePoolCommissionsPage: FC = async (props) => { const params = await props.params; - if (!ethers.utils.isAddress(params.pool)) { + if (!isAddress(params.pool, { strict: false })) { notFound(); } diff --git a/src/app/stake/[pool]/page.tsx b/src/app/stake/[pool]/page.tsx index 12f5459f..227e1ff2 100644 --- a/src/app/stake/[pool]/page.tsx +++ b/src/app/stake/[pool]/page.tsx @@ -1,7 +1,7 @@ import { FC } from 'react'; import StakePool from '../../../components/stake/StakePool'; import { notFound } from 'next/navigation'; -import { ethers } from 'ethers'; +import { isAddress } from 'viem'; import { getFormattedEnsName } from '../../../services/server/utils'; interface StakePoolPageProps { @@ -12,7 +12,7 @@ export async function generateMetadata(props: StakePoolPageProps) { const params = await props.params; const address = params.pool; - if (!ethers.utils.isAddress(address)) { + if (!isAddress(address, { strict: false })) { notFound(); } @@ -27,7 +27,7 @@ export async function generateMetadata(props: StakePoolPageProps) { const StakePoolPage: FC = async (props) => { const params = await props.params; - if (!ethers.utils.isAddress(params.pool)) { + if (!isAddress(params.pool, { strict: false })) { notFound(); } diff --git a/src/app/stake/[pool]/stake/page.tsx b/src/app/stake/[pool]/stake/page.tsx index 30d0fa9d..55805ea6 100644 --- a/src/app/stake/[pool]/stake/page.tsx +++ b/src/app/stake/[pool]/stake/page.tsx @@ -1,7 +1,7 @@ import { FC } from 'react'; import { notFound } from 'next/navigation'; import StakePoolStake from '../../../../components/stake/StakePoolStake'; -import { ethers } from 'ethers'; +import { isAddress } from 'viem'; import { getFormattedEnsName } from '../../../../services/server/utils'; interface StakePoolPageProps { @@ -12,7 +12,7 @@ export async function generateMetadata(props: StakePoolPageProps) { const params = await props.params; const address = params.pool; - if (!ethers.utils.isAddress(address)) { + if (!isAddress(address, { strict: false })) { notFound(); } @@ -27,7 +27,7 @@ export async function generateMetadata(props: StakePoolPageProps) { const StakePoolStakePage: FC = async (props) => { const params = await props.params; - if (!ethers.utils.isAddress(params.pool)) { + if (!isAddress(params.pool, { strict: false })) { notFound(); } diff --git a/src/app/stake/[pool]/users/page.tsx b/src/app/stake/[pool]/users/page.tsx index 6da8e82a..90f63c6b 100644 --- a/src/app/stake/[pool]/users/page.tsx +++ b/src/app/stake/[pool]/users/page.tsx @@ -1,7 +1,7 @@ import { FC } from 'react'; import { notFound } from 'next/navigation'; import StakePoolUsers from '../../../../components/stake/StakePoolUsers'; -import { ethers } from 'ethers'; +import { isAddress } from 'viem'; import { getFormattedEnsName } from '../../../../services/server/utils'; interface StakePoolPageProps { @@ -12,7 +12,7 @@ export async function generateMetadata(props: StakePoolPageProps) { const params = await props.params; const address = params.pool; - if (!ethers.utils.isAddress(address)) { + if (!isAddress(address, { strict: false })) { notFound(); } @@ -27,7 +27,7 @@ export async function generateMetadata(props: StakePoolPageProps) { const StakePoolUsersPage: FC = async (props) => { const params = await props.params; - if (!ethers.utils.isAddress(params.pool)) { + if (!isAddress(params.pool, { strict: false })) { notFound(); } diff --git a/src/components/BigNumberText.tsx b/src/components/BigNumberText.tsx index 811cddf8..df14196d 100644 --- a/src/components/BigNumberText.tsx +++ b/src/components/BigNumberText.tsx @@ -17,11 +17,11 @@ import { Text, Icon, } from '@chakra-ui/react'; -import { BigNumber, BigNumberish } from 'ethers'; -import { formatUnits } from 'ethers/lib/utils'; +import { formatUnits } from 'viem'; import humanizeDuration from 'humanize-duration'; import { FC } from 'react'; import { IconType } from 'react-icons'; +import { Numeric, toBigInt } from '../utils/bigint'; type Unit = 'eth' | 'ctsi' | 'percent' | 'usd' | 'duration' | 'number'; type Countdown = { @@ -44,10 +44,7 @@ const formatPercentNumber = ( return formatter.format(value * 100); }; -const formatPercent = ( - value: BigNumberish, - options?: Intl.NumberFormatOptions, -) => { +const formatPercent = (value: Numeric, options?: Intl.NumberFormatOptions) => { if (typeof value === 'number') { return formatPercentNumber(value, options); } else { @@ -56,7 +53,7 @@ const formatPercent = ( }; const format = ( - value: BigNumberish, + value: Numeric, unit: Unit, options: Intl.NumberFormatOptions, ): string[] => { @@ -64,12 +61,16 @@ const format = ( switch (unit) { case 'eth': return [ - numberFormat.format(parseFloat(formatUnits(value, 18))), + numberFormat.format( + parseFloat(formatUnits(toBigInt(value), 18)), + ), 'ETH', ]; case 'ctsi': return [ - numberFormat.format(parseFloat(formatUnits(value, 18))), + numberFormat.format( + parseFloat(formatUnits(toBigInt(value), 18)), + ), 'CTSI', ]; case 'percent': @@ -79,13 +80,13 @@ const format = ( case 'duration': return formatDuration(parseFloat(value.toString())); default: - return [numberFormat.format(BigNumber.from(value).toNumber()), '']; + return [numberFormat.format(Number(toBigInt(value))), '']; } }; export interface BigNumberTextProps extends FlexProps { icon?: IconType; - value: BigNumberish; + value: Numeric; nullLabel?: string; direction?: SystemStyleObject['flexDirection']; fontSize?: SystemStyleObject['fontSize']; diff --git a/src/components/BigNumberTextV2.tsx b/src/components/BigNumberTextV2.tsx index 6847a5db..20611963 100644 --- a/src/components/BigNumberTextV2.tsx +++ b/src/components/BigNumberTextV2.tsx @@ -11,10 +11,10 @@ import React, { FC } from 'react'; import { Flex, FlexProps, Heading, HStack, Text, Icon } from '@chakra-ui/react'; -import { BigNumber, BigNumberish } from 'ethers'; -import { formatUnits } from 'ethers/lib/utils'; +import { formatUnits } from 'viem'; import { IconType } from 'react-icons'; import humanizeDuration from 'humanize-duration'; +import { Numeric, toBigInt } from '../utils/bigint'; type Unit = 'eth' | 'ctsi' | 'percent' | 'usd' | 'duration'; type Countdown = { @@ -37,10 +37,7 @@ const formatPercentNumber = ( return formatter.format(value * 100); }; -const formatPercent = ( - value: BigNumberish, - options?: Intl.NumberFormatOptions, -) => { +const formatPercent = (value: Numeric, options?: Intl.NumberFormatOptions) => { if (typeof value === 'number') { return formatPercentNumber(value, options); } else { @@ -49,7 +46,7 @@ const formatPercent = ( }; const format = ( - value: BigNumberish, + value: Numeric, unit: Unit, options: Intl.NumberFormatOptions, ): string[] => { @@ -57,12 +54,16 @@ const format = ( switch (unit) { case 'eth': return [ - numberFormat.format(parseFloat(formatUnits(value, 18))), + numberFormat.format( + parseFloat(formatUnits(toBigInt(value), 18)), + ), 'ETH', ]; case 'ctsi': return [ - numberFormat.format(parseFloat(formatUnits(value, 18))), + numberFormat.format( + parseFloat(formatUnits(toBigInt(value), 18)), + ), 'CTSI', ]; case 'percent': @@ -72,13 +73,13 @@ const format = ( case 'duration': return formatDuration(parseFloat(value.toString())); default: - return [numberFormat.format(BigNumber.from(value).toNumber()), '']; + return [numberFormat.format(Number(toBigInt(value))), '']; } }; export interface BigNumberTextV2Props extends FlexProps { icon?: IconType; - value: BigNumberish; + value: Numeric; nullLabel?: string; unit?: Unit; options?: Intl.NumberFormatOptions; diff --git a/src/components/CTSIText.tsx b/src/components/CTSIText.tsx index baf1e8a0..6b07ef86 100644 --- a/src/components/CTSIText.tsx +++ b/src/components/CTSIText.tsx @@ -17,9 +17,9 @@ import { SystemStyleObject, Text, } from '@chakra-ui/react'; -import { BigNumber, BigNumberish } from 'ethers'; -import { formatUnits } from 'ethers/lib/utils'; +import { formatUnits } from 'viem'; import humanizeDuration from 'humanize-duration'; +import { Numeric, toBigInt } from '../utils/bigint'; type Unit = 'eth' | 'ctsi' | 'percent' | 'usd' | 'duration' | 'number'; type Countdown = { @@ -42,10 +42,7 @@ const formatPercentNumber = ( return formatter.format(value * 100); }; -const formatPercent = ( - value: BigNumberish, - options?: Intl.NumberFormatOptions, -) => { +const formatPercent = (value: Numeric, options?: Intl.NumberFormatOptions) => { if (typeof value === 'number') { return formatPercentNumber(value, options); } else { @@ -54,7 +51,7 @@ const formatPercent = ( }; const format = ( - value: BigNumberish, + value: Numeric, unit: Unit, options: Intl.NumberFormatOptions, ): string[] => { @@ -62,12 +59,16 @@ const format = ( switch (unit) { case 'eth': return [ - numberFormat.format(parseFloat(formatUnits(value, 18))), + numberFormat.format( + parseFloat(formatUnits(toBigInt(value), 18)), + ), 'ETH', ]; case 'ctsi': return [ - numberFormat.format(parseFloat(formatUnits(value, 18))), + numberFormat.format( + parseFloat(formatUnits(toBigInt(value), 18)), + ), 'CTSI', ]; case 'percent': @@ -77,13 +78,13 @@ const format = ( case 'duration': return formatDuration(parseFloat(value.toString())); default: - return [numberFormat.format(BigNumber.from(value).toNumber()), '']; + return [numberFormat.format(Number(toBigInt(value))), '']; } }; export interface BigNumberTextProps extends FlexProps { icon?: ReactNode; - value: BigNumberish; + value: Numeric; nullLabel?: string; direction?: SystemStyleObject['flexDirection']; fontSize?: SystemStyleObject['fontSize']; diff --git a/src/components/TransactionFeedback.tsx b/src/components/TransactionFeedback.tsx index 9ff924df..914feb28 100644 --- a/src/components/TransactionFeedback.tsx +++ b/src/components/TransactionFeedback.tsx @@ -27,7 +27,7 @@ const TransactionFeedback = ( // TODO: take into account a higher number of confirmations // and calculate a percentage - const progress = transaction?.receipt?.confirmations || 0; + const progress = transaction?.confirmations || 0; const status = transaction?.error ? 'error' diff --git a/src/components/home/Header.tsx b/src/components/home/Header.tsx index 76d06b19..0eaab3ba 100644 --- a/src/components/home/Header.tsx +++ b/src/components/home/Header.tsx @@ -72,7 +72,7 @@ const HomeHeader = () => { diff --git a/src/components/home/Stats.tsx b/src/components/home/Stats.tsx index 5b37d8aa..34ed4c7d 100644 --- a/src/components/home/Stats.tsx +++ b/src/components/home/Stats.tsx @@ -10,7 +10,6 @@ // PARTICULAR PURPOSE. See the GNU General Public License for more details. import { Box, Flex, Icon, Text } from '@chakra-ui/react'; -import { FixedNumber } from 'ethers'; import useBlocks from '../../graphql/hooks/useBlocks'; import useSummary from '../../graphql/hooks/useSummary'; import { useMarketInformation } from '../../services/market'; @@ -45,9 +44,9 @@ const HomeStats = () => { blocks, marketInformation.circulatingSupply, ); - const participationRate = toCTSI(summary?.totalStaked || 0).divUnsafe( - FixedNumber.from(marketInformation?.circulatingSupply || 1), - ); + const participationRate = + toCTSI(summary?.totalStaked || 0) / + (marketInformation?.circulatingSupply || 1); const bannerIconColor = useColorModeValue('light.primary', 'dark.primary'); @@ -252,9 +251,7 @@ const HomeStats = () => { {formatNumberValue( - toCTSI( - summary?.totalStaked || 0, - ).toUnsafeFloat(), + toCTSI(summary?.totalStaked || 0), )} @@ -295,7 +292,7 @@ const HomeStats = () => { {formatNumberValue( - yearReturn.toUnsafeFloat(), + yearReturn, 1, 'percent', ).replace('%', '')} @@ -338,7 +335,7 @@ const HomeStats = () => { {formatNumberValue( - participationRate.toUnsafeFloat(), + participationRate, 1, 'percent', ).replace('%', '')} diff --git a/src/components/node/NodeAllowanceSection.tsx b/src/components/node/NodeAllowanceSection.tsx index 86504c20..02d77986 100644 --- a/src/components/node/NodeAllowanceSection.tsx +++ b/src/components/node/NodeAllowanceSection.tsx @@ -22,13 +22,12 @@ import { VStack, } from '@chakra-ui/react'; import { Tooltip } from '../Tooltip'; -import { BigNumber } from 'ethers'; import { FC } from 'react'; import CTSI from '../pools/staking/CTSI'; import { useColorModeValue } from '../ui/color-mode'; interface INodeAllowanceSectionProps { - allowance: BigNumber; + allowance: bigint; onAllowanceClick: () => void; } diff --git a/src/components/node/NodeHireNodeSection.tsx b/src/components/node/NodeHireNodeSection.tsx index 5959852f..53925185 100644 --- a/src/components/node/NodeHireNodeSection.tsx +++ b/src/components/node/NodeHireNodeSection.tsx @@ -10,7 +10,6 @@ // PARTICULAR PURPOSE. See the GNU General Public License for more details. import { Box, Button, Flex, Stack, Text } from '@chakra-ui/react'; -import { BigNumber } from 'ethers'; import { isEmpty, omit } from 'lodash/fp'; import { FC, useState } from 'react'; import { useNode } from '../../services/node'; @@ -26,7 +25,7 @@ type Errors = Partial>; export interface NodeHireNodeSectionProps { isHiring?: boolean; - onHire: (nodeAddress: string, funds: BigNumber) => void; + onHire: (nodeAddress: string, funds: bigint) => void; } export const NodeHireNodeSection: FC = (props) => { diff --git a/src/components/node/NodeInfoSection.tsx b/src/components/node/NodeInfoSection.tsx index fff2dc7d..c9072f0f 100644 --- a/src/components/node/NodeInfoSection.tsx +++ b/src/components/node/NodeInfoSection.tsx @@ -25,8 +25,7 @@ import { import { Tooltip } from '../Tooltip'; import { useColorModeValue } from '../ui/color-mode'; -import { BigNumber } from 'ethers'; -import { formatUnits } from 'ethers/lib/utils'; +import { formatUnits } from 'viem'; import { isEmpty } from 'lodash'; import { FC } from 'react'; import { truncateString } from '../../utils/stringUtils'; @@ -38,16 +37,16 @@ import { NodeRetireModal } from './modals/NodeRetireModal'; export interface INodeInfoSection { ownerAccount?: string; address: string; - userBalance: BigNumber; - nodeBalance: BigNumber; + userBalance: bigint; + nodeBalance: bigint; isHiring?: boolean; isRetired?: boolean; isRetiring?: boolean; isAuthorizing?: boolean; isAuthorized?: boolean; onRetire: (nodeAddress: string) => void; - onDeposit: (funds: BigNumber) => void; - onHire: (nodeAddress: string, funds: BigNumber) => void; + onDeposit: (funds: bigint) => void; + onHire: (nodeAddress: string, funds: bigint) => void; onAuthorize?: () => void; } @@ -81,7 +80,7 @@ export const NodeInfoSection: FC = ({ ? address : truncateString(address); - const toETH = (value: BigNumber) => { + const toETH = (value: bigint) => { const options: Intl.NumberFormatOptions = { minimumFractionDigits: 0, maximumFractionDigits: 4, diff --git a/src/components/node/NodeManage.tsx b/src/components/node/NodeManage.tsx index 821ace89..6569055a 100644 --- a/src/components/node/NodeManage.tsx +++ b/src/components/node/NodeManage.tsx @@ -24,7 +24,6 @@ import { useDisclosure, VStack, } from '@chakra-ui/react'; -import { BigNumber } from 'ethers'; import NextLink from 'next/link'; import { useRouter } from 'next/navigation'; import { FC, useEffect, useRef, useState } from 'react'; @@ -93,9 +92,7 @@ const ManageNode: FC = () => { // use a state variable for the typed node address const [worker, setWorker] = useState(); - const [hiringFunds, setHiringFunds] = useState( - BigNumber.from(0), - ); + const [hiringFunds, setHiringFunds] = useState(0n); // priority is the typed address (at state variable) const activeWorker = worker || existingNode || ''; @@ -147,12 +144,9 @@ const ManageNode: FC = () => { }, [hiredNewNode, activeWorker]); useEffect(() => { - if ( - hiringFunds.gt(BigNumber.from(0)) && - currentTransaction === 'hire' - ) { + if (hiringFunds > 0n && currentTransaction === 'hire') { node.hire(hiringFunds); - setHiringFunds(BigNumber.from(0)); + setHiringFunds(0n); } }, [node, hiringFunds, currentTransaction]); diff --git a/src/components/node/NodeMaturingSection.tsx b/src/components/node/NodeMaturingSection.tsx index f615fb13..f1d0c52e 100644 --- a/src/components/node/NodeMaturingSection.tsx +++ b/src/components/node/NodeMaturingSection.tsx @@ -20,14 +20,13 @@ import { Icon, } from '@chakra-ui/react'; -import { BigNumber } from 'ethers'; import { FC } from 'react'; import { TimeIcon } from '../Icons'; import CTSI from '../pools/staking/CTSI'; import { useColorModeValue } from '../ui/color-mode'; export interface INodeMaturingSection { - maturingBalance: BigNumber; + maturingBalance: bigint; maturingLeft?: string; } @@ -44,9 +43,7 @@ export const NodeMaturingSection: FC = ({ 'dark.secondary', 'dark.primary', ); - const iconColor = maturingBalance.isZero() - ? 'gray.450' - : iconColorModeColor; + const iconColor = maturingBalance === 0n ? 'gray.450' : iconColorModeColor; return ( = ({ gap={4} alignItems="center" > - {maturingBalance.gt(0) && maturingLeft && ( + {maturingBalance > 0n && maturingLeft && ( )} - {releasingBalance.gt(0) && !releasingLeftShort && ( + {releasingBalance > 0n && !releasingLeftShort && ( @@ -71,7 +70,7 @@ export const DepositSection: FC = ({ fontSize="xs" textAlign={{ base: 'left', md: 'right' }} > - {userWalletBalance.isZero() ? ( + {userWalletBalance === 0n ? ( <> void; onWithdrawClick: () => void; @@ -102,9 +101,7 @@ export const PoolBalanceSection: FC = ({ ml="auto" onClick={onStakeClick} colorPalette={colorScheme} - disabled={ - isPoolBalanceLocked || userPoolBalance.isZero() - } + disabled={isPoolBalanceLocked || userPoolBalance === 0n} > Stake @@ -114,7 +111,7 @@ export const PoolBalanceSection: FC = ({ width="173px" ml="auto" onClick={onWithdrawClick} - disabled={userPoolBalance.isZero()} + disabled={userPoolBalance === 0n} > Withdraw diff --git a/src/components/stake/components/PoolsOverview.tsx b/src/components/stake/components/PoolsOverview.tsx index cef22b71..2004d53a 100644 --- a/src/components/stake/components/PoolsOverview.tsx +++ b/src/components/stake/components/PoolsOverview.tsx @@ -1,5 +1,4 @@ import { HStack, Icon, Stack, Text } from '@chakra-ui/react'; -import { BigNumber } from 'ethers'; import { FC } from 'react'; import { Summary } from '../../../graphql/models'; import Banner from '../../Banner'; @@ -10,7 +9,7 @@ import { Tooltip } from '../../Tooltip'; import { TbHelp } from 'react-icons/tb'; export interface PoolsOverviewProps { - balance: BigNumber; + balance: bigint; summary: Summary; poolBalancesCount: number; } diff --git a/src/components/stake/components/StakedBalanceSection.tsx b/src/components/stake/components/StakedBalanceSection.tsx index f6ec5e4a..2b60e2ba 100644 --- a/src/components/stake/components/StakedBalanceSection.tsx +++ b/src/components/stake/components/StakedBalanceSection.tsx @@ -22,13 +22,12 @@ import { } from '@chakra-ui/react'; import { useColorModeValue } from '../../ui/color-mode'; -import { BigNumber } from 'ethers'; import { FC } from 'react'; import { StakedBalanceIcon } from '../../Icons'; import CTSI from '../../pools/staking/CTSI'; export interface IStakedBalanceSection { - stakedBalance: BigNumber; + stakedBalance: bigint; onUnstakeClick: () => void; } @@ -96,7 +95,7 @@ export const StakedBalanceSection: FC = ({ ml="auto" onClick={onUnstakeClick} colorPalette="gray" - disabled={stakedBalance.isZero()} + disabled={stakedBalance === 0n} > Unstake diff --git a/src/components/stake/components/WalletBalanceSection.tsx b/src/components/stake/components/WalletBalanceSection.tsx index 8758ee4c..6da01f0b 100644 --- a/src/components/stake/components/WalletBalanceSection.tsx +++ b/src/components/stake/components/WalletBalanceSection.tsx @@ -19,7 +19,6 @@ import { Text, VStack, } from '@chakra-ui/react'; -import { BigNumber } from 'ethers'; import { FC } from 'react'; import { useMessages } from '../../../utils/messages'; import { WalletIcon } from '../../Icons'; @@ -29,8 +28,8 @@ import { useColorModeValue } from '../../ui/color-mode'; import { Tooltip } from '../../Tooltip'; export interface IWalletBalanceSectionProps { - userCTSIBalance: BigNumber; - userETHBalance: BigNumber; + userCTSIBalance: bigint; + userETHBalance: bigint; } export const WalletBalanceSection: FC = ({ @@ -87,7 +86,7 @@ export const WalletBalanceSection: FC = ({ - {userETHBalance?.isZero() && !isGnosisSafe && ( + {userETHBalance === 0n && !isGnosisSafe && ( void; - onSave: (amount: BigNumber, where: string) => void; + onSave: (amount: bigint, where: string) => void; } export const StakingDepositModal: FC = ({ @@ -54,20 +53,17 @@ export const StakingDepositModal: FC = ({ onClose, onSave, }) => { - const formatBigNumber = (value: BigNumber) => + const formatBigNumber = (value: bigint) => parseFloat(formatUnits(value, 18)); const allowanceFormatted = parseFloat(formatUnits(allowance, 18)); const balanceFormatted = parseFloat(formatUnits(balance, 18)); - const [outputAllowance, setOutputAllowance] = - useState(allowance); + const [outputAllowance, setOutputAllowance] = useState(allowance); const [allowanceStep, setAllowanceStep] = useState(false); - const [outputDeposit, setOutputDeposit] = useState( - constants.Zero, - ); + const [outputDeposit, setOutputDeposit] = useState(0n); const formattedDepositValue = formatBigNumber(outputDeposit); const color = useColorModeValue('black', 'white'); @@ -83,7 +79,7 @@ export const StakingDepositModal: FC = ({ useEffect(() => { if (!isOpen) { - setOutputDeposit(BigNumber.from(0)); + setOutputDeposit(0n); } }, [isOpen]); @@ -102,7 +98,7 @@ export const StakingDepositModal: FC = ({ - {allowance.isZero() || allowanceStep ? ( + {allowance === 0n || allowanceStep ? ( <> @@ -396,9 +392,10 @@ export const StakingDepositModal: FC = ({ textTransform="uppercase" p={0} role="max-deposit-button" - disabled={outputDeposit.eq( - balance && allowance, - )} + disabled={ + outputDeposit === + allowance + } onClick={() => { setOutputDeposit( balanceFormatted < @@ -445,7 +442,7 @@ export const StakingDepositModal: FC = ({