From 81d88d3e1ea8ec95a8c10107ff7b4aafea0ee1f2 Mon Sep 17 00:00:00 2001 From: Petar Todorovic Date: Fri, 23 Jan 2026 13:43:18 +0100 Subject: [PATCH 1/2] feat: ledger live support --- .gitignore | 3 + ledger-manifest/manifest.dev.json | 38 +++ package.json | 1 + pnpm-lock.yaml | 193 +++++++++++++++ src/atoms/actions-atoms.ts | 56 ++--- src/atoms/orders-pending-actions-atom.ts | 9 +- src/atoms/portfolio-atoms.ts | 121 ++++----- src/atoms/position-pending-actions-atom.ts | 8 +- src/atoms/tokens-atoms.ts | 4 +- src/atoms/wallet-atom.ts | 66 ++--- .../modules/Account/Deposit/index.tsx | 14 +- .../modules/Account/Deposit/state.tsx | 116 +++++---- .../modules/Account/Withdraw/state.tsx | 11 +- src/components/modules/Account/balance.tsx | 4 +- .../modules/Home/Positions/index.tsx | 10 +- src/components/modules/Home/index.tsx | 14 +- .../Order/Overview/leverage-dialog.tsx | 2 +- .../Order/Overview/limit-price-dialog.tsx | 2 +- .../Order/Overview/order-type-dialog.tsx | 27 +- .../modules/Order/Overview/state.tsx | 10 +- .../modules/PositionDetails/Close/index.tsx | 2 +- .../modules/PositionDetails/Close/state.tsx | 17 +- .../PositionDetails/Overview/Orders/index.tsx | 8 +- .../Overview/Position/index.tsx | 6 +- .../PositionDetails/Overview/index.tsx | 4 +- src/components/modules/Root/PreloadAtoms.tsx | 6 +- .../molecules/account-value-display.tsx | 2 +- src/components/molecules/address-switcher.tsx | 212 ++++++++++++++-- src/components/molecules/tp-sl-dialog.tsx | 2 +- src/context/appkit.tsx | 2 +- src/domain/chains/evm.ts | 25 +- src/domain/chains/ledger.ts | 54 ++++ src/domain/transactions.ts | 32 ++- src/domain/wallet.ts | 37 +-- src/lib/utils.ts | 4 + src/services/config.ts | 4 +- src/services/runtime.ts | 19 +- src/services/wallet/browser-signer.ts | 212 ++++++++++++++++ src/services/wallet/ledger-signer/index.ts | 174 +++++++++++++ src/services/wallet/ledger-signer/utils.ts | 183 ++++++++++++++ src/services/wallet/signer.ts | 39 +++ src/services/{ => wallet}/wallet-service.ts | 234 ++++++------------ 42 files changed, 1497 insertions(+), 490 deletions(-) create mode 100644 ledger-manifest/manifest.dev.json create mode 100644 src/domain/chains/ledger.ts create mode 100644 src/services/wallet/browser-signer.ts create mode 100644 src/services/wallet/ledger-signer/index.ts create mode 100644 src/services/wallet/ledger-signer/utils.ts create mode 100644 src/services/wallet/signer.ts rename src/services/{ => wallet}/wallet-service.ts (60%) diff --git a/.gitignore b/.gitignore index 1f7f561..feb03c5 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,6 @@ dist-ssr .nitro .tanstack .wrangler + +# opensrc - source code for packages +opensrc/ diff --git a/ledger-manifest/manifest.dev.json b/ledger-manifest/manifest.dev.json new file mode 100644 index 0000000..4132eff --- /dev/null +++ b/ledger-manifest/manifest.dev.json @@ -0,0 +1,38 @@ +{ + "id": "stakekit", + "name": "Yield.xyz", + "url": "http://localhost:3000/?embed=true", + "homepageUrl": "https://yield.xyz/", + "platform": ["all"], + "apiVersion": "^2.0.0", + "manifestVersion": "2", + "branch": "stable", + "icon": "https://raw.githubusercontent.com/stakekit/assets/main/stakekit/sk-icon_320x320.png", + "categories": ["staking", "defi"], + "currencies": "*", + "content": { + "shortDescription": { + "en": "Start earning yield on your crypto in just 3 clicks. Enjoy staking, liquid staking, yield vaults, and lending pools covering more than 40 blockchain networks and 400+ yield opportunities all in one place." + }, + "description": { + "en": "Yield.xyz is the world's most powerful self-custodial yield platform. Covering more than 40 blockchain networks and 400+ yield opportunities, Yield.xyz aggregates all yields across all chains and across all major DeFi providers in one place: be it staking, liquid staking, yield vaults, or lending protocols" + } + }, + "permissions": [ + "account.list", + "account.receive", + "account.request", + "currency.list", + "device.close", + "device.exchange", + "device.transport", + "message.sign", + "transaction.sign", + "transaction.signAndBroadcast", + "wallet.capabilities", + "wallet.info", + "wallet.userId" + ], + "domains": ["http://*", "https://*"], + "visibility": "complete" +} diff --git a/package.json b/package.json index 12b64ec..b1c9780 100644 --- a/package.json +++ b/package.json @@ -17,6 +17,7 @@ "@effect/experimental": "^0.58.0", "@effect/platform": "^0.94.1", "@effect/platform-node": "^0.104.0", + "@ledgerhq/wallet-api-client": "^1.12.6", "@lucas-barake/effect-form-react": "^0.14.0", "@reown/appkit": "^1.8.16", "@reown/appkit-adapter-wagmi": "^1.8.16", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ccfd3ad..3e5cba2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -28,6 +28,9 @@ importers: '@effect/platform-node': specifier: ^0.104.0 version: 0.104.0(@effect/cluster@0.56.1(@effect/platform@0.94.1(effect@3.19.14))(@effect/rpc@0.73.0(@effect/platform@0.94.1(effect@3.19.14))(effect@3.19.14))(@effect/sql@0.49.0(@effect/experimental@0.58.0(@effect/platform@0.94.1(effect@3.19.14))(effect@3.19.14))(@effect/platform@0.94.1(effect@3.19.14))(effect@3.19.14))(@effect/workflow@0.16.0(@effect/experimental@0.58.0(@effect/platform@0.94.1(effect@3.19.14))(effect@3.19.14))(@effect/platform@0.94.1(effect@3.19.14))(@effect/rpc@0.73.0(@effect/platform@0.94.1(effect@3.19.14))(effect@3.19.14))(effect@3.19.14))(effect@3.19.14))(@effect/platform@0.94.1(effect@3.19.14))(@effect/rpc@0.73.0(@effect/platform@0.94.1(effect@3.19.14))(effect@3.19.14))(@effect/sql@0.49.0(@effect/experimental@0.58.0(@effect/platform@0.94.1(effect@3.19.14))(effect@3.19.14))(@effect/platform@0.94.1(effect@3.19.14))(effect@3.19.14))(bufferutil@4.1.0)(effect@3.19.14)(utf-8-validate@5.0.10) + '@ledgerhq/wallet-api-client': + specifier: ^1.12.6 + version: 1.12.6(@ton/crypto@3.3.0) '@lucas-barake/effect-form-react': specifier: ^0.14.0 version: 0.14.0(@effect-atom/atom-react@0.4.4(@effect/experimental@0.58.0(@effect/platform@0.94.1(effect@3.19.14))(effect@3.19.14))(@effect/platform@0.94.1(effect@3.19.14))(@effect/rpc@0.73.0(@effect/platform@0.94.1(effect@3.19.14))(effect@3.19.14))(effect@3.19.14)(react@19.2.3)(scheduler@0.27.0))(@effect-atom/atom@0.4.11(@effect/experimental@0.58.0(@effect/platform@0.94.1(effect@3.19.14))(effect@3.19.14))(@effect/platform@0.94.1(effect@3.19.14))(@effect/rpc@0.73.0(@effect/platform@0.94.1(effect@3.19.14))(effect@3.19.14))(effect@3.19.14))(effect@3.19.14)(react@19.2.3) @@ -776,6 +779,24 @@ packages: '@jridgewell/trace-mapping@0.3.31': resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + '@ledgerhq/devices@8.10.0': + resolution: {integrity: sha512-ytT66KI8MizFX6dGJKthOzPDw5uNRmmg+RaMta62jbFePKYqfXtYTp6Wc0ErTXaL8nFS3IujHENwKthPmsj6jw==} + + '@ledgerhq/errors@6.29.0': + resolution: {integrity: sha512-mmDsGN662zd0XGKyjzSKkg+5o1/l9pvV1HkVHtbzaydvHAtRypghmVoWMY9XAQDLXiUBXGIsLal84NgmGeuKWA==} + + '@ledgerhq/hw-transport@6.32.0': + resolution: {integrity: sha512-bf2nxzDQ21DV/bsmExfWI0tatoVeoqhu/ePWalD/nPgPnTn/ZIDq7VBU+TY5p0JZaE87NQwmRUAjm6C1Exe61A==} + + '@ledgerhq/logs@6.14.0': + resolution: {integrity: sha512-kJFu1+asWQmU9XlfR1RM3lYR76wuEoPyZvkI/CNjpft78BQr3+MMf3Nu77ABzcKFnhIcmAkOLlDQ6B8L6hDXHA==} + + '@ledgerhq/wallet-api-client@1.12.6': + resolution: {integrity: sha512-qp5t/uLP6xi3paw9j1p9ITtfISmnnJKkCVer86elYxWftDsGm3xDsihEhQRijw8wDoGVIAJt/16ZU7o2tt3zxQ==} + + '@ledgerhq/wallet-api-core@1.27.0': + resolution: {integrity: sha512-2arGTtqK/YtleQBV6H2a3AC4a9GJeZAbQaeGn+3un8Pbe8aGSuHLd3F7/v4sDAA0/QHCtcb+CvIJj+OR4ONyxg==} + '@lit-labs/ssr-dom-shim@1.5.1': resolution: {integrity: sha512-Aou5UdlSpr5whQe8AA/bZG0jMj96CoJIWbGfZ91qieWu5AWUMKw8VR/pAkQkJYvBNhmCcWnZlyyk5oze8JIqYA==} @@ -851,6 +872,9 @@ packages: resolution: {integrity: sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==} engines: {node: ^14.21.3 || >=16} + '@noble/hashes@1.1.5': + resolution: {integrity: sha512-LTMZiiLc+V4v1Yi16TD6aX2gmtKszNye0pQgbaLqkvhIqP7nVsSaJsWloGQjJfJ8offaoP5GtX3yY5swbcJxxQ==} + '@noble/hashes@1.4.0': resolution: {integrity: sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==} engines: {node: '>= 16'} @@ -863,6 +887,9 @@ packages: resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} engines: {node: ^14.21.3 || >=16} + '@noble/secp256k1@1.7.1': + resolution: {integrity: sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw==} + '@parcel/watcher-android-arm64@2.5.1': resolution: {integrity: sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==} engines: {node: '>= 10.0.0'} @@ -1457,6 +1484,15 @@ packages: peerDependencies: solid-js: ^1.6.12 + '@stacks/common@6.16.0': + resolution: {integrity: sha512-PnzvhrdGRMVZvxTulitlYafSK4l02gPCBBoI9QEoTqgSnv62oaOXhYAUUkTMFKxdHW1seVEwZsrahuXiZPIAwg==} + + '@stacks/network@6.17.0': + resolution: {integrity: sha512-numHbfKjwco/rbkGPOEz8+FcJ2nBnS/tdJ8R422Q70h3SiA9eqk9RjSzB8p4JP8yW1SZvW+eihADHfMpBuZyfw==} + + '@stacks/transactions@6.17.0': + resolution: {integrity: sha512-FUah2BRgV66ApLcEXGNGhwyFTRXqX5Zco3LpiM3essw8PF0NQlHwwdPgtDko5RfrJl3LhGXXe/30nwsfNnB3+g==} + '@stakekit/common@0.0.61': resolution: {integrity: sha512-NHaJ9Yq5ykjryWB/EIACcHvq5mUrqU5eNfMIcv9Ovadq0TOqfKAJSs8FcFQu6/p2zAHcFywJQUbNOunOsTR8xg==} @@ -1723,6 +1759,17 @@ packages: resolution: {integrity: sha512-yn/4Tp6Or5JA2/VNPLKtm9ib17PZxmJGyEq+vtcmAch5qG2PAJLvuzuoAwYRBMN9GR8Cb/W5qO6eIHg0AdYL0Q==} hasBin: true + '@ton/core@0.62.1': + resolution: {integrity: sha512-RaEGBo9gCf6ZHyS8SKq1K53pswvYW9E5A6vwUuzFBTRX14g4qMDlB9F+fq4aBE5kN7XyVr8ScQtOJfQj41usCw==} + peerDependencies: + '@ton/crypto': '>=3.2.0' + + '@ton/crypto-primitives@2.1.0': + resolution: {integrity: sha512-PQesoyPgqyI6vzYtCXw4/ZzevePc4VGcJtFwf08v10OevVJHVfW238KBdpj1kEDQkxWLeuNHEpTECNFKnP6tow==} + + '@ton/crypto@3.3.0': + resolution: {integrity: sha512-/A6CYGgA/H36OZ9BbTaGerKtzWp50rg67ZCH2oIjV1NcrBaCK9Z343M+CxedvM7Haf3f/Ee9EhxyeTp0GKMUpA==} + '@types/aria-query@5.0.4': resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} @@ -1738,6 +1785,9 @@ packages: '@types/babel__traverse@7.28.0': resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==} + '@types/bn.js@5.2.0': + resolution: {integrity: sha512-DLbJ1BPqxvQhIGbeu8VbUC1DiAiahHtAYvA0ZEAa4P31F7IaArc8z3C3BRQdWX4mtLQuABG4yzp76ZrS02Ui1Q==} + '@types/chai@5.2.3': resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} @@ -1753,6 +1803,9 @@ packages: '@types/node@12.20.55': resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} + '@types/node@18.19.130': + resolution: {integrity: sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg==} + '@types/node@22.19.3': resolution: {integrity: sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA==} @@ -2042,6 +2095,9 @@ packages: base-x@3.0.11: resolution: {integrity: sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA==} + base-x@4.0.1: + resolution: {integrity: sha512-uAZ8x6r6S3aUM9rbHGVOIsR15U/ZSc82b3ymnCPsT45Gk1DDvhDPdIgB5MrhirZWt+5K0EEPQH985kNqZgNPFw==} + base-x@5.0.1: resolution: {integrity: sha512-M7uio8Zt++eg3jPj+rHMfCC+IuygQHHCOU+IYsVtik6FWjuYpVt/+MRKcgsAMHh8mMFAwnB+Bs+mTrFiXjMzKg==} @@ -2058,6 +2114,9 @@ packages: big.js@6.2.2: resolution: {integrity: sha512-y/ie+Faknx7sZA5MfGA2xKlu0GDv8RWrXGsmlteyJQ2lvoKv9GBK/fpRMc2qlSoBAgNxrixICFCBefIq8WCQpQ==} + bignumber.js@9.3.1: + resolution: {integrity: sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==} + binary-extensions@2.3.0: resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} engines: {node: '>=8'} @@ -2131,6 +2190,10 @@ packages: builtin-status-codes@3.0.0: resolution: {integrity: sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==} + c32check@2.0.0: + resolution: {integrity: sha512-rpwfAcS/CMqo0oCqDf3r9eeLgScRE3l/xHDCXhM3UyrfvIn7PrLq63uHh7yYbv8NzaZn5MVsVhIRpQ+5GZ5HyA==} + engines: {node: '>=8'} + cac@6.7.14: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} @@ -2759,6 +2822,9 @@ packages: engines: {node: '>=6'} hasBin: true + jssha@3.2.0: + resolution: {integrity: sha512-QuruyBENDWdN4tZwJbQq7/eAK85FqrI4oDbXjy5IBhYD+2pTJyBUWZe8ctWaCkrV0gy6AaelgOZZBMeswEa/6Q==} + keyvaluestorage-interface@1.0.0: resolution: {integrity: sha512-8t6Q3TclQ4uZynJY9IGr2+SsIGwK9JHcO6ootkHCGA0CrQCRy+VkouYNO2xicET6b9al7QKzpebNow+gkpCL8g==} @@ -2855,6 +2921,9 @@ packages: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} + lodash.clonedeep@4.5.0: + resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==} + loupe@3.2.1: resolution: {integrity: sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==} @@ -3273,6 +3342,9 @@ packages: rpc-websockets@9.3.2: resolution: {integrity: sha512-VuW2xJDnl1k8n8kjbdRSWawPRkwaVqUQNjE1TdeTawf0y0abGhtVJFTXCLfgpgGDBkO/Fj6kny8Dc/nvOW78MA==} + rxjs@7.8.2: + resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==} + safe-buffer@5.1.2: resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} @@ -3550,6 +3622,9 @@ packages: tw-animate-css@1.4.0: resolution: {integrity: sha512-7bziOlRqH0hJx80h/3mbicLW7o8qLsH5+RaLR2t+OHM3D0JlWGODQKQ4cxbK7WlvmUxpcj6Kgu6EKqjrGFe3QQ==} + tweetnacl@1.0.3: + resolution: {integrity: sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==} + typed-array-buffer@1.0.3: resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} engines: {node: '>= 0.4'} @@ -3574,6 +3649,9 @@ packages: uncrypto@0.1.3: resolution: {integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==} + undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + undici-types@6.21.0: resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} @@ -3688,6 +3766,10 @@ packages: resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} hasBin: true + uuid@9.0.1: + resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} + hasBin: true + valtio@2.1.7: resolution: {integrity: sha512-DwJhCDpujuQuKdJ2H84VbTjEJJteaSmqsuUltsfbfdbotVfNeTE4K/qc/Wi57I9x8/2ed4JNdjEna7O6PfavRg==} engines: {node: '>=12.20.0'} @@ -4540,6 +4622,45 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.5 + '@ledgerhq/devices@8.10.0': + dependencies: + '@ledgerhq/errors': 6.29.0 + '@ledgerhq/logs': 6.14.0 + rxjs: 7.8.2 + semver: 7.7.3 + + '@ledgerhq/errors@6.29.0': {} + + '@ledgerhq/hw-transport@6.32.0': + dependencies: + '@ledgerhq/devices': 8.10.0 + '@ledgerhq/errors': 6.29.0 + '@ledgerhq/logs': 6.14.0 + events: 3.3.0 + + '@ledgerhq/logs@6.14.0': {} + + '@ledgerhq/wallet-api-client@1.12.6(@ton/crypto@3.3.0)': + dependencies: + '@ledgerhq/hw-transport': 6.32.0 + '@ledgerhq/wallet-api-core': 1.27.0(@ton/crypto@3.3.0) + bignumber.js: 9.3.1 + transitivePeerDependencies: + - '@ton/crypto' + - encoding + + '@ledgerhq/wallet-api-core@1.27.0(@ton/crypto@3.3.0)': + dependencies: + '@ledgerhq/errors': 6.29.0 + '@stacks/transactions': 6.17.0 + '@ton/core': 0.62.1(@ton/crypto@3.3.0) + bignumber.js: 9.3.1 + uuid: 9.0.1 + zod: 3.25.76 + transitivePeerDependencies: + - '@ton/crypto' + - encoding + '@lit-labs/ssr-dom-shim@1.5.1': {} '@lit/react@1.0.8(@types/react@19.2.7)': @@ -4598,6 +4719,8 @@ snapshots: dependencies: '@noble/hashes': 1.8.0 + '@noble/hashes@1.1.5': {} + '@noble/hashes@1.4.0': optional: true @@ -4605,6 +4728,8 @@ snapshots: '@noble/hashes@1.8.0': {} + '@noble/secp256k1@1.7.1': {} + '@parcel/watcher-android-arm64@2.5.1': optional: true @@ -5670,6 +5795,29 @@ snapshots: dependencies: solid-js: 1.9.10 + '@stacks/common@6.16.0': + dependencies: + '@types/bn.js': 5.2.0 + '@types/node': 18.19.130 + + '@stacks/network@6.17.0': + dependencies: + '@stacks/common': 6.16.0 + cross-fetch: 3.2.0 + transitivePeerDependencies: + - encoding + + '@stacks/transactions@6.17.0': + dependencies: + '@noble/hashes': 1.1.5 + '@noble/secp256k1': 1.7.1 + '@stacks/common': 6.16.0 + '@stacks/network': 6.17.0 + c32check: 2.0.0 + lodash.clonedeep: 4.5.0 + transitivePeerDependencies: + - encoding + '@stakekit/common@0.0.61': {} '@standard-schema/spec@1.1.0': {} @@ -5964,6 +6112,20 @@ snapshots: dependencies: yaml: 2.8.2 + '@ton/core@0.62.1(@ton/crypto@3.3.0)': + dependencies: + '@ton/crypto': 3.3.0 + + '@ton/crypto-primitives@2.1.0': + dependencies: + jssha: 3.2.0 + + '@ton/crypto@3.3.0': + dependencies: + '@ton/crypto-primitives': 2.1.0 + jssha: 3.2.0 + tweetnacl: 1.0.3 + '@types/aria-query@5.0.4': {} '@types/babel__core@7.20.5': @@ -5987,6 +6149,10 @@ snapshots: dependencies: '@babel/types': 7.28.5 + '@types/bn.js@5.2.0': + dependencies: + '@types/node': 22.19.3 + '@types/chai@5.2.3': dependencies: '@types/deep-eql': 4.0.2 @@ -6004,6 +6170,10 @@ snapshots: '@types/node@12.20.55': optional: true + '@types/node@18.19.130': + dependencies: + undici-types: 5.26.5 + '@types/node@22.19.3': dependencies: undici-types: 6.21.0 @@ -6535,6 +6705,8 @@ snapshots: safe-buffer: 5.2.1 optional: true + base-x@4.0.1: {} + base-x@5.0.1: {} base64-js@1.5.1: {} @@ -6547,6 +6719,8 @@ snapshots: big.js@6.2.2: {} + bignumber.js@9.3.1: {} + binary-extensions@2.3.0: {} blakejs@1.2.1: {} @@ -6652,6 +6826,11 @@ snapshots: builtin-status-codes@3.0.0: {} + c32check@2.0.0: + dependencies: + '@noble/hashes': 1.8.0 + base-x: 4.0.1 + cac@6.7.14: {} call-bind-apply-helpers@1.0.2: @@ -7350,6 +7529,8 @@ snapshots: json5@2.2.3: {} + jssha@3.2.0: {} + keyvaluestorage-interface@1.0.0: {} kubernetes-types@1.30.0: {} @@ -7432,6 +7613,8 @@ snapshots: dependencies: p-locate: 5.0.0 + lodash.clonedeep@4.5.0: {} + loupe@3.2.1: {} lru-cache@10.4.3: {} @@ -7934,6 +8117,10 @@ snapshots: utf-8-validate: 5.0.10 optional: true + rxjs@7.8.2: + dependencies: + tslib: 2.8.1 + safe-buffer@5.1.2: {} safe-buffer@5.2.1: {} @@ -8216,6 +8403,8 @@ snapshots: tw-animate-css@1.4.0: {} + tweetnacl@1.0.3: {} + typed-array-buffer@1.0.3: dependencies: call-bound: 1.0.4 @@ -8245,6 +8434,8 @@ snapshots: uncrypto@0.1.3: {} + undici-types@5.26.5: {} + undici-types@6.21.0: {} undici-types@7.18.2: @@ -8311,6 +8502,8 @@ snapshots: uuid@8.3.2: optional: true + uuid@9.0.1: {} + valtio@2.1.7(@types/react@19.2.7)(react@19.2.3): dependencies: proxy-compare: 3.0.1 diff --git a/src/atoms/actions-atoms.ts b/src/atoms/actions-atoms.ts index 5dfddd2..e0dc0a5 100644 --- a/src/atoms/actions-atoms.ts +++ b/src/atoms/actions-atoms.ts @@ -1,9 +1,7 @@ import { Reactivity } from "@effect/experimental/Reactivity"; -import { Atom, Result } from "@effect-atom/atom-react"; +import { Atom } from "@effect-atom/atom-react"; import { Effect, Stream } from "effect"; import { portfolioReactivityKeysArray } from "@/atoms/portfolio-atoms"; -import { providersReactivityKeysArray } from "@/atoms/providers-atoms"; -import { tokensReactivityKeysArray } from "@/atoms/tokens-atoms"; import type { WalletConnected } from "@/domain/wallet"; import type { ActionDto } from "@/services/api-client/api-schemas"; import { runtimeAtom } from "@/services/runtime"; @@ -25,47 +23,29 @@ const getActionAtom = Atom.make( export const signActionAtoms = Atom.family( (signTransactions: WalletConnected["signTransactions"]) => { - const machineAtom = runtimeAtom.atom( - Effect.fn(function* (ctx) { - const action = yield* ctx.result(getActionAtom); - - return yield* signTransactions(action); - }), + const machineAtom = runtimeAtom.atom((ctx) => + ctx + .result(getActionAtom) + .pipe(Effect.andThen((action) => signTransactions(action))), ); - const machineStreamAtom = runtimeAtom.atom( - Effect.fn(function* (ctx) { - const { state, stream, startMachine } = yield* ctx.result(machineAtom); - - const reactivity = yield* Reactivity; - - startMachine.pipe(Effect.runFork); - - stream.pipe( - Stream.takeUntil((v) => v.isDone), - Stream.onDone(() => - reactivity.invalidate([ - ...portfolioReactivityKeysArray, - ...providersReactivityKeysArray, - ...tokensReactivityKeysArray, - ]), + const machineStreamAtom = runtimeAtom.atom((ctx) => + ctx.result(machineAtom).pipe( + Effect.map((val) => val.stream), + Stream.unwrap, + Stream.takeUntil((v) => v.isDone), + Stream.onDone(() => + Reactivity.pipe( + Effect.andThen((reactivity) => + reactivity.invalidate(portfolioReactivityKeysArray), + ), ), - Stream.runForEach((val) => - Effect.sync(() => ctx.setSelf(Result.success(val))), - ), - Effect.runFork, - ); - - return state; - }), + ), + ), ); const retryMachineAtom = runtimeAtom.fn((_, ctx) => - Effect.gen(function* () { - const { startMachine } = yield* ctx.result(machineAtom); - - return yield* startMachine; - }), + ctx.result(machineAtom).pipe(Effect.andThen((val) => val.retry)), ); return { diff --git a/src/atoms/orders-pending-actions-atom.ts b/src/atoms/orders-pending-actions-atom.ts index 1018c38..9976f69 100644 --- a/src/atoms/orders-pending-actions-atom.ts +++ b/src/atoms/orders-pending-actions-atom.ts @@ -2,13 +2,16 @@ import { Atom, Registry, Result } from "@effect-atom/atom-react"; import { Effect } from "effect"; import { actionAtom } from "@/atoms/actions-atoms"; import { selectedProviderAtom } from "@/atoms/providers-atoms"; -import type { WalletConnected } from "@/domain/wallet"; +import type { WalletAccount } from "@/domain/wallet"; import { ApiClientService } from "@/services/api-client"; import { runtimeAtom } from "@/services/runtime"; export const cancelOrderAtom = Atom.family((orderId: string) => runtimeAtom.fn( - Effect.fn(function* (args: { wallet: WalletConnected; marketId: string }) { + Effect.fn(function* (args: { + walletAddress: WalletAccount["address"]; + marketId: string; + }) { const client = yield* ApiClientService; const registry = yield* Registry.AtomRegistry; @@ -22,7 +25,7 @@ export const cancelOrderAtom = Atom.family((orderId: string) => const action = yield* client.ActionsControllerExecuteAction({ providerId: selectedProvider.id, - address: args.wallet.currentAccount.address, + address: args.walletAddress, action: "cancelOrder", args: { orderId, diff --git a/src/atoms/portfolio-atoms.ts b/src/atoms/portfolio-atoms.ts index 5c84e6a..4e8b6fb 100644 --- a/src/atoms/portfolio-atoms.ts +++ b/src/atoms/portfolio-atoms.ts @@ -2,7 +2,7 @@ import { Atom } from "@effect-atom/atom-react"; import { Duration, Effect } from "effect"; import { providersAtom, selectedProviderAtom } from "@/atoms/providers-atoms"; import { withRefreshAfter } from "@/atoms/utils"; -import type { WalletConnected } from "@/domain/wallet"; +import type { WalletAccount } from "@/domain/wallet"; import { ApiClientService } from "@/services/api-client"; import { runtimeAtom, withReactivity } from "@/services/runtime"; @@ -17,73 +17,76 @@ export const portfolioReactivityKeysArray = Object.values( portfolioReactivityKeys, ); -export const positionsAtom = Atom.family((wallet: WalletConnected) => - runtimeAtom - .atom( - Effect.fn(function* (ctx) { - const client = yield* ApiClientService; - const selectedProvider = yield* ctx.result(selectedProviderAtom); +export const positionsAtom = Atom.family( + (walletAddress: WalletAccount["address"]) => + runtimeAtom + .atom( + Effect.fn(function* (ctx) { + const client = yield* ApiClientService; + const selectedProvider = yield* ctx.result(selectedProviderAtom); - return yield* client.PortfolioControllerGetPositions({ - address: wallet.currentAccount.address, - providerId: selectedProvider.id, - }); - }), - ) - .pipe( - withReactivity([portfolioReactivityKeys.positions]), - withRefreshAfter(Duration.minutes(1)), - Atom.keepAlive, - ), + return yield* client.PortfolioControllerGetPositions({ + address: walletAddress, + providerId: selectedProvider.id, + }); + }), + ) + .pipe( + withReactivity([portfolioReactivityKeys.positions]), + withRefreshAfter(Duration.minutes(1)), + Atom.keepAlive, + ), ); -export const ordersAtom = Atom.family((wallet: WalletConnected) => - runtimeAtom - .atom( - Effect.fn(function* (ctx) { - const client = yield* ApiClientService; - const selectedProvider = yield* ctx.result(selectedProviderAtom); +export const ordersAtom = Atom.family( + (walletAddress: WalletAccount["address"]) => + runtimeAtom + .atom( + Effect.fn(function* (ctx) { + const client = yield* ApiClientService; + const selectedProvider = yield* ctx.result(selectedProviderAtom); - return yield* client.PortfolioControllerGetOrders({ - address: wallet.currentAccount.address, - providerId: selectedProvider.id, - }); - }), - ) - .pipe( - withReactivity([portfolioReactivityKeys.orders]), - withRefreshAfter(Duration.minutes(1)), - Atom.keepAlive, - ), + return yield* client.PortfolioControllerGetOrders({ + address: walletAddress, + providerId: selectedProvider.id, + }); + }), + ) + .pipe( + withReactivity([portfolioReactivityKeys.orders]), + withRefreshAfter(Duration.minutes(1)), + Atom.keepAlive, + ), ); -export const providersBalancesAtom = Atom.family((wallet: WalletConnected) => - runtimeAtom - .atom( - Effect.fnUntraced(function* (get) { - const providers = yield* get.result(providersAtom); - const client = yield* ApiClientService; +export const providersBalancesAtom = Atom.family( + (walletAddress: WalletAccount["address"]) => + runtimeAtom + .atom( + Effect.fnUntraced(function* (get) { + const providers = yield* get.result(providersAtom); + const client = yield* ApiClientService; - return yield* Effect.allSuccesses( - providers.map((provider) => - client.PortfolioControllerGetBalances({ - address: wallet.currentAccount.address, - providerId: provider.id, - }), - ), - { concurrency: "unbounded" }, - ); - }), - ) - .pipe( - withReactivity([portfolioReactivityKeys.providersBalances]), - withRefreshAfter(Duration.minutes(1)), - Atom.keepAlive, - ), + return yield* Effect.allSuccesses( + providers.map((provider) => + client.PortfolioControllerGetBalances({ + address: walletAddress, + providerId: provider.id, + }), + ), + { concurrency: "unbounded" }, + ); + }), + ) + .pipe( + withReactivity([portfolioReactivityKeys.providersBalances]), + withRefreshAfter(Duration.minutes(1)), + Atom.keepAlive, + ), ); export const selectedProviderBalancesAtom = Atom.family( - (wallet: WalletConnected) => + (walletAddress: WalletAccount["address"]) => runtimeAtom .atom( Effect.fn(function* (ctx) { @@ -91,7 +94,7 @@ export const selectedProviderBalancesAtom = Atom.family( const client = yield* ApiClientService; return yield* client.PortfolioControllerGetBalances({ - address: wallet.currentAccount.address, + address: walletAddress, providerId: selectedProvider.id, }); }), diff --git a/src/atoms/position-pending-actions-atom.ts b/src/atoms/position-pending-actions-atom.ts index ab124dd..58fdf59 100644 --- a/src/atoms/position-pending-actions-atom.ts +++ b/src/atoms/position-pending-actions-atom.ts @@ -6,7 +6,7 @@ import type { TPOrSLOption, TPOrSLSettings, } from "@/components/molecules/tp-sl-dialog"; -import type { WalletConnected } from "@/domain/wallet"; +import type { WalletAccount, WalletConnected } from "@/domain/wallet"; import { ApiClientService } from "@/services/api-client"; import type { ArgumentsDto, @@ -17,12 +17,12 @@ import { runtimeAtom } from "@/services/runtime"; export const editSLOrTPAtom = runtimeAtom.fn( Effect.fn(function* ({ position, - wallet, + walletAddress, tpOrSLSettings, actionType, }: { position: PositionDto; - wallet: WalletConnected; + walletAddress: WalletAccount["address"]; tpOrSLSettings: TPOrSLSettings; actionType: TPOrSLOption; }) { @@ -51,7 +51,7 @@ export const editSLOrTPAtom = runtimeAtom.fn( const action = yield* client.ActionsControllerExecuteAction({ providerId: selectedProvider.id, - address: wallet.currentAccount.address, + address: walletAddress, action: actionType, args: { marketId: position.marketId, diff --git a/src/atoms/tokens-atoms.ts b/src/atoms/tokens-atoms.ts index 739941a..e24bd52 100644 --- a/src/atoms/tokens-atoms.ts +++ b/src/atoms/tokens-atoms.ts @@ -3,7 +3,7 @@ import { Atom } from "@effect-atom/atom-react"; import { EvmNetworks } from "@stakekit/common"; import { Array as _Array, Effect, Option, pipe, Record, Schema } from "effect"; import type { TokenBalance } from "@/domain/types"; -import type { WalletConnected } from "@/domain/wallet"; +import type { WalletAccount } from "@/domain/wallet"; import { ConfigService } from "@/services/config"; import { HttpClientService } from "@/services/http-client"; import { runtimeAtom, withReactivity } from "@/services/runtime"; @@ -68,7 +68,7 @@ export type TokenBalances = Record< >; export const moralisTokenBalancesAtom = Atom.family( - (address: WalletConnected["currentAccount"]["address"]) => + (address: WalletAccount["address"]) => runtimeAtom .atom( Effect.gen(function* () { diff --git a/src/atoms/wallet-atom.ts b/src/atoms/wallet-atom.ts index 4444aa2..d3a9fb3 100644 --- a/src/atoms/wallet-atom.ts +++ b/src/atoms/wallet-atom.ts @@ -1,49 +1,27 @@ -import { Result } from "@effect-atom/atom-react"; -import { Data, Effect, Stream } from "effect"; +import { Atom } from "@effect-atom/atom-react"; +import { Effect, Stream } from "effect"; +import type { WalletConnected } from "@/domain/wallet"; import { runtimeAtom } from "@/services/runtime"; -import { WalletService } from "@/services/wallet-service"; +import { WalletService } from "@/services/wallet/wallet-service"; export const walletAtom = runtimeAtom.atom( - Effect.fn(function* (ctx) { - const { walletStream } = yield* WalletService; - - const broadcasted = yield* Stream.broadcastDynamic(walletStream, { - capacity: "unbounded", - }); - - const broadcastedWithChanges = broadcasted.pipe( - Stream.changesWith((a, b) => { - if (a.status !== b.status) { - return false; - } - - if (a.status === "connected" && b.status === "connected") { - const addressChange = - a.currentAccount.address === b.currentAccount.address; - - return addressChange; - } - - return true; - }), - ); - - broadcastedWithChanges.pipe( - Stream.runForEach((val) => - Effect.sync(() => ctx.setSelf(Result.success(val))), - ), - Effect.runFork, - ); - - return yield* broadcastedWithChanges.pipe( - Stream.take(1), - Stream.runHead, - Effect.flatten, - Effect.orDie, - ); - }), + WalletService.pipe( + Effect.andThen((ws) => ws.walletStream), + Stream.unwrap, + Stream.changesWith((a, b) => { + if (a.status !== b.status) { + return false; + } + + if (a.status === "connected" && b.status === "connected") { + return a.currentAccount.id === b.currentAccount.id; + } + + return true; + }), + ), ); -export class InvalidAddressError extends Data.TaggedError( - "InvalidAddressError", -) {} +export const switchAccountAtom = Atom.family((wallet: WalletConnected) => + runtimeAtom.fn(wallet.switchAccount), +); diff --git a/src/components/modules/Account/Deposit/index.tsx b/src/components/modules/Account/Deposit/index.tsx index c75b70b..117d17b 100644 --- a/src/components/modules/Account/Deposit/index.tsx +++ b/src/components/modules/Account/Deposit/index.tsx @@ -37,11 +37,15 @@ function AccountDepositContent({ setSelectedProvider: (provider: ProviderDto) => void; setSelectedTokenBalance: (tokenBalance: TokenBalance) => void; }) { - const { tokenAmountValue } = useTokenAmountValue(wallet); + const { tokenAmountValue } = useTokenAmountValue( + wallet.currentAccount.address, + ); - const { tokenBalances } = useTokenBalances(wallet); + const { tokenBalances } = useTokenBalances(wallet.currentAccount.address); - const { percentage, handlePercentageChange } = useDepositPercentage(wallet); + const { percentage, handlePercentageChange } = useDepositPercentage( + wallet.currentAccount.address, + ); return (
@@ -113,9 +117,9 @@ export function AccountDepositWithWallet({ wallet: WalletConnected; }) { const { providers } = useProviders(); - const { tokenBalances } = useTokenBalances(wallet); + const { tokenBalances } = useTokenBalances(wallet.currentAccount.address); const { selectedTokenBalance, handleSelectTokenBalance } = - useSelectedTokenBalance(wallet); + useSelectedTokenBalance(wallet.currentAccount.address); const { selectedProvider, setSelectedProvider } = useSelectedProvider(); const { submit, submitResult } = useDepositForm(); diff --git a/src/components/modules/Account/Deposit/state.tsx b/src/components/modules/Account/Deposit/state.tsx index 728d2c0..89feb57 100644 --- a/src/components/modules/Account/Deposit/state.tsx +++ b/src/components/modules/Account/Deposit/state.tsx @@ -23,21 +23,26 @@ import { import { walletAtom } from "@/atoms/wallet-atom"; import { AmountField } from "@/components/molecules/forms"; import type { TokenBalance } from "@/domain/types"; -import { isWalletConnected, type WalletConnected } from "@/domain/wallet"; -import { formatTokenAmount } from "@/lib/utils"; +import { + isWalletConnected, + type WalletAccount, + type WalletConnected, +} from "@/domain/wallet"; +import { formatTokenAmount, truncateNumber } from "@/lib/utils"; import { ApiClientService } from "@/services/api-client"; import type { ProviderDto } from "@/services/api-client/api-schemas"; import { runtimeAtom } from "@/services/runtime"; -const selectedTokenBalanceAtom = Atom.family((wallet: WalletConnected) => - Atom.writable( - (ctx) => - ctx.get(moralisTokenBalancesAtom(wallet.currentAccount.address)).pipe( - Result.map((res) => _Array.head(res.ethereum)), - Result.map(Option.getOrNull), - ), - (ctx, value: TokenBalance) => ctx.setSelf(Result.success(value)), - ), +const selectedTokenBalanceAtom = Atom.family( + (walletAddress: WalletAccount["address"]) => + Atom.writable( + (ctx) => + ctx.get(moralisTokenBalancesAtom(walletAddress)).pipe( + Result.map((res) => _Array.head(res.ethereum)), + Result.map(Option.getOrNull), + ), + (ctx, value: TokenBalance) => ctx.setSelf(Result.success(value)), + ), ); const selectedProviderAtom = Atom.writable( @@ -58,9 +63,9 @@ export const useProviders = () => { }; }; -export const useTokenBalances = (wallet: WalletConnected) => { +export const useTokenBalances = (walletAddress: WalletAccount["address"]) => { const tokenBalances = useAtomValue( - moralisTokenBalancesAtom(wallet.currentAccount.address), + moralisTokenBalancesAtom(walletAddress), ).pipe(Result.getOrElse(() => Record.empty() as TokenBalances)); return { @@ -78,11 +83,15 @@ export const useDepositForm = () => { }; }; -export const useSelectedTokenBalance = (wallet: WalletConnected) => { +export const useSelectedTokenBalance = ( + walletAddress: WalletAccount["address"], +) => { const selectedTokenBalance = useAtomValue( - selectedTokenBalanceAtom(wallet), + selectedTokenBalanceAtom(walletAddress), ).pipe(Result.getOrElse(() => null)); - const setSelectedTokenBalance = useAtomSet(selectedTokenBalanceAtom(wallet)); + const setSelectedTokenBalance = useAtomSet( + selectedTokenBalanceAtom(walletAddress), + ); const setAmount = useAtomSet(setAmountFieldAtom); const handleSelectTokenBalance = (tokenBalance: TokenBalance) => { @@ -129,7 +138,7 @@ export const depositFormBuilder = FormBuilder.empty } const tokenBalance = registry - .get(selectedTokenBalanceAtom(wallet)) + .get(selectedTokenBalanceAtom(wallet.currentAccount.address)) .pipe(Result.getOrElse(() => null)); if (!tokenBalance) { @@ -157,7 +166,7 @@ export const DepositForm = FormReact.make(depositFormBuilder, { const registry = yield* Registry.AtomRegistry; const selectedTokenBalance = registry - .get(selectedTokenBalanceAtom(wallet)) + .get(selectedTokenBalanceAtom(wallet.currentAccount.address)) .pipe(Result.getOrElse(() => null)); if (!selectedTokenBalance) { @@ -197,7 +206,9 @@ export const DepositForm = FormReact.make(depositFormBuilder, { const amountAtom = DepositForm.getFieldAtom(DepositForm.fields.Amount); const setAmountFieldAtom = DepositForm.setValue(DepositForm.fields.Amount); -export const useDepositPercentage = (wallet: WalletConnected) => { +export const useDepositPercentage = ( + walletAddress: WalletAccount["address"], +) => { const amount = useAtomValue(amountAtom).pipe( Option.map(Number), Option.filter((v) => !Number.isNaN(v)), @@ -206,9 +217,9 @@ export const useDepositPercentage = (wallet: WalletConnected) => { const setAmount = useAtomSet(setAmountFieldAtom); - const tokenBalance = useAtomValue(selectedTokenBalanceAtom(wallet)).pipe( - Result.getOrElse(() => null), - ); + const tokenBalance = useAtomValue( + selectedTokenBalanceAtom(walletAddress), + ).pipe(Result.getOrElse(() => null)); const availableBalanceUsd = tokenBalance ? Number(tokenBalance.amount) * tokenBalance.price @@ -220,7 +231,7 @@ export const useDepositPercentage = (wallet: WalletConnected) => { const handlePercentageChange = (newPercentage: number) => { const amount = (availableBalanceUsd * newPercentage) / 100; - setAmount(parseFloat(amount.toFixed(2)).toString()); + setAmount(truncateNumber(amount).toString()); }; return { @@ -229,35 +240,40 @@ export const useDepositPercentage = (wallet: WalletConnected) => { }; }; -const tokenAmountValueAtom = Atom.family((wallet: WalletConnected) => - runtimeAtom.atom((ctx) => - Effect.gen(function* () { - const tokenBalance = yield* ctx.result(selectedTokenBalanceAtom(wallet)); - - ctx.subscribe(amountAtom, () => {}); - - const amount = ctx.get(amountAtom).pipe( - Option.map(parseFloat), - Option.filter((v) => !Number.isNaN(v)), - Option.getOrElse(() => 0), - ); - - if (!tokenBalance) { - return ""; - } - - return formatTokenAmount({ - amount: amount / tokenBalance.price, - symbol: tokenBalance.token.symbol, - }); - }), - ), +const tokenAmountValueAtom = Atom.family( + (walletAddress: WalletAccount["address"]) => + runtimeAtom.atom((ctx) => + Effect.gen(function* () { + const tokenBalance = yield* ctx.result( + selectedTokenBalanceAtom(walletAddress), + ); + + ctx.subscribe(amountAtom, () => {}); + + const amount = ctx.get(amountAtom).pipe( + Option.map(parseFloat), + Option.filter((v) => !Number.isNaN(v)), + Option.getOrElse(() => 0), + ); + + if (!tokenBalance) { + return ""; + } + + return formatTokenAmount({ + amount: amount / tokenBalance.price, + symbol: tokenBalance.token.symbol, + }); + }), + ), ); -export const useTokenAmountValue = (wallet: WalletConnected) => { - const tokenAmountValue = useAtomValue(tokenAmountValueAtom(wallet)).pipe( - Result.getOrElse(() => null), - ); +export const useTokenAmountValue = ( + walletAddress: WalletAccount["address"], +) => { + const tokenAmountValue = useAtomValue( + tokenAmountValueAtom(walletAddress), + ).pipe(Result.getOrElse(() => null)); return { tokenAmountValue, diff --git a/src/components/modules/Account/Withdraw/state.tsx b/src/components/modules/Account/Withdraw/state.tsx index 6af0ac9..e289fb7 100644 --- a/src/components/modules/Account/Withdraw/state.tsx +++ b/src/components/modules/Account/Withdraw/state.tsx @@ -19,6 +19,7 @@ import { providersAtom } from "@/atoms/providers-atoms"; import { walletAtom } from "@/atoms/wallet-atom"; import { AmountField } from "@/components/molecules/forms"; import { isWalletConnected, type WalletConnected } from "@/domain/wallet"; +import { truncateNumber } from "@/lib/utils"; import { ApiClientService } from "@/services/api-client"; import type { ProviderDto } from "@/services/api-client/api-schemas"; import { runtimeAtom } from "@/services/runtime"; @@ -55,7 +56,7 @@ export const useSelectedProvider = () => { export const useProviderBalance = (wallet: WalletConnected) => { const providerBalance = useAtomValue( - selectedProviderBalancesAtom(wallet), + selectedProviderBalancesAtom(wallet.currentAccount.address), ).pipe(Result.getOrElse(() => null)); return { @@ -93,7 +94,7 @@ export const withdrawFormBuilder = FormBuilder.empty } const providerBalance = registry - .get(selectedProviderBalancesAtom(wallet)) + .get(selectedProviderBalancesAtom(wallet.currentAccount.address)) .pipe(Result.getOrElse(() => null)); if (!providerBalance) { @@ -133,7 +134,7 @@ export const WithdrawForm = FormReact.make(withdrawFormBuilder, { } const providerBalance = registry - .get(selectedProviderBalancesAtom(wallet)) + .get(selectedProviderBalancesAtom(wallet.currentAccount.address)) .pipe(Result.getOrElse(() => null)); if (!providerBalance) { @@ -174,14 +175,14 @@ export const useWithdrawPercentage = (wallet: WalletConnected) => { const setAmount = useAtomSet(setAmountFieldAtom); const providerBalance = useAtomValue( - selectedProviderBalancesAtom(wallet), + selectedProviderBalancesAtom(wallet.currentAccount.address), ).pipe(Result.getOrElse(() => null)); const availableBalance = providerBalance?.availableBalance ?? 0; const handlePercentageChange = (newPercentage: number) => { const amount = (availableBalance * newPercentage) / 100; - setAmount(amount.toFixed(2)); + setAmount(truncateNumber(amount).toString()); }; const percentage = _Number.clamp({ minimum: 0, maximum: 100 })( diff --git a/src/components/modules/Account/balance.tsx b/src/components/modules/Account/balance.tsx index c6c9d41..ffa5d5a 100644 --- a/src/components/modules/Account/balance.tsx +++ b/src/components/modules/Account/balance.tsx @@ -19,7 +19,9 @@ export function AccountBalancesWithWallet({ const navigate = useNavigate(); const providers = useAtomValue(providersAtom); - const providersBalances = useAtomValue(providersBalancesAtom(wallet)); + const providersBalances = useAtomValue( + providersBalancesAtom(wallet.currentAccount.address), + ); const data = Result.all({ providersBalances, providers }).pipe( Result.map((val) => ({ diff --git a/src/components/modules/Home/Positions/index.tsx b/src/components/modules/Home/Positions/index.tsx index c557f03..a2fa436 100644 --- a/src/components/modules/Home/Positions/index.tsx +++ b/src/components/modules/Home/Positions/index.tsx @@ -20,10 +20,14 @@ function PositionsWithWallet({ wallet }: { wallet: WalletConnected }) { "positions", ); - const positionsResult = useAtomValue(positionsAtom(wallet)); - const ordersResult = useAtomValue(ordersAtom(wallet)); + const positionsResult = useAtomValue( + positionsAtom(wallet.currentAccount.address), + ); + const ordersResult = useAtomValue(ordersAtom(wallet.currentAccount.address)); const marketsMapResult = useAtomValue(marketsAtom); - const balancesResult = useAtomValue(selectedProviderBalancesAtom(wallet)); + const balancesResult = useAtomValue( + selectedProviderBalancesAtom(wallet.currentAccount.address), + ); const marketsMap = marketsMapResult.pipe(Result.getOrElse(Record.empty)); diff --git a/src/components/modules/Home/index.tsx b/src/components/modules/Home/index.tsx index e2f6f96..174e35f 100644 --- a/src/components/modules/Home/index.tsx +++ b/src/components/modules/Home/index.tsx @@ -18,13 +18,17 @@ import { AddressSwitcher } from "@/components/molecules/address-switcher"; import { ProviderSelect } from "@/components/molecules/provider-select"; import { Button } from "@/components/ui/button"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; -import { isWalletConnected, type WalletConnected } from "@/domain/wallet"; +import { + isBrowserWallet, + isWalletConnected, + type WalletConnected, +} from "@/domain/wallet"; import { cn, formatAmount } from "@/lib/utils"; import type { ProviderDto } from "@/services/api-client/api-schemas"; const ProviderBalancesDisplay = ({ wallet }: { wallet: WalletConnected }) => { const selectedProviderBalances = useAtomValue( - selectedProviderBalancesAtom(wallet), + selectedProviderBalancesAtom(wallet.currentAccount.address), ); if (Result.isSuccess(selectedProviderBalances)) { @@ -49,7 +53,9 @@ export const Home = () => { const [activeTab, setActiveTab] = useState<"trade" | "positions">("trade"); const wallet = useAtomValue(walletAtom).pipe(Result.getOrElse(() => null)); + const browserWallet = isBrowserWallet(wallet); const walletConnected = isWalletConnected(wallet); + const showAddressSwitcher = walletConnected; const providers = useAtomValue(providersAtom).pipe( Result.getOrElse(() => [] as ReadonlyArray), @@ -63,7 +69,7 @@ export const Home = () => {
{/* Address Switcher */} - {walletConnected && } + {showAddressSwitcher && } {/* Header */}
@@ -128,7 +134,7 @@ export const Home = () => {
- {!walletConnected && } + {!walletConnected && browserWallet && }
); }; diff --git a/src/components/modules/Order/Overview/leverage-dialog.tsx b/src/components/modules/Order/Overview/leverage-dialog.tsx index 4d0f568..7f5d053 100644 --- a/src/components/modules/Order/Overview/leverage-dialog.tsx +++ b/src/components/modules/Order/Overview/leverage-dialog.tsx @@ -33,7 +33,7 @@ export const LeverageDialog = (props: LeverageDialogProps) => { return ( - + {props.children} diff --git a/src/components/modules/Order/Overview/limit-price-dialog.tsx b/src/components/modules/Order/Overview/limit-price-dialog.tsx index c5a5e80..93ad1a3 100644 --- a/src/components/modules/Order/Overview/limit-price-dialog.tsx +++ b/src/components/modules/Order/Overview/limit-price-dialog.tsx @@ -27,7 +27,7 @@ export const LimitPriceDialog = (props: LimitPriceDialogProps) => { return ( - + {props.children} diff --git a/src/components/modules/Order/Overview/order-type-dialog.tsx b/src/components/modules/Order/Overview/order-type-dialog.tsx index 2aeda8b..c0e3104 100644 --- a/src/components/modules/Order/Overview/order-type-dialog.tsx +++ b/src/components/modules/Order/Overview/order-type-dialog.tsx @@ -42,18 +42,21 @@ export function OrderTypeDialog({ return ( - - - + ( + + )} + /> diff --git a/src/components/modules/Order/Overview/state.tsx b/src/components/modules/Order/Overview/state.tsx index 0dfa2e9..684147c 100644 --- a/src/components/modules/Order/Overview/state.tsx +++ b/src/components/modules/Order/Overview/state.tsx @@ -20,6 +20,7 @@ import { MIN_LEVERAGE, } from "@/domain/position"; import { isWalletConnected, type WalletConnected } from "@/domain/wallet"; +import { truncateNumber } from "@/lib/utils"; import { ApiClientService } from "@/services/api-client"; import { type ArgumentsDto, @@ -120,7 +121,7 @@ export const useLimitPrice = () => { export const useProviderBalance = (wallet: WalletConnected) => { const providerBalance = useAtomValue( - selectedProviderBalancesAtom(wallet), + selectedProviderBalancesAtom(wallet.currentAccount.address), ).pipe(Result.getOrElse(() => null)); return { @@ -150,7 +151,7 @@ export const formAtom = Atom.family( } const providerBalance = registry - .get(selectedProviderBalancesAtom(wallet)) + .get(selectedProviderBalancesAtom(wallet.currentAccount.address)) .pipe(Result.getOrElse(() => null)); if (!providerBalance) { @@ -267,7 +268,8 @@ export const formAtom = Atom.family( const marginToUse = (clampedValue / 100) * providerBalance.availableBalance; const positionSize = marginToUse * leverage; - setAmount(parseFloat(positionSize.toFixed(2)).toString()); + + setAmount(truncateNumber(positionSize).toString()); }, }; }; @@ -295,7 +297,7 @@ export const formAtom = Atom.family( const { leverage } = useLeverage(leverageRanges); const providerBalance = useAtomValue( - selectedProviderBalancesAtom(wallet), + selectedProviderBalancesAtom(wallet.currentAccount.address), ).pipe(Result.getOrElse(() => null)); if (!providerBalance) { diff --git a/src/components/modules/PositionDetails/Close/index.tsx b/src/components/modules/PositionDetails/Close/index.tsx index 4c2b9fa..95e62fe 100644 --- a/src/components/modules/PositionDetails/Close/index.tsx +++ b/src/components/modules/PositionDetails/Close/index.tsx @@ -200,7 +200,7 @@ const ClosePositionRouteWithWallet = ({ const { marketId } = useParams({ from: "/position-details/$marketId/close", }); - const position = usePosition(wallet, marketId); + const position = usePosition(wallet.currentAccount.address, marketId); if (Result.isInitial(position)) { return ; diff --git a/src/components/modules/PositionDetails/Close/state.tsx b/src/components/modules/PositionDetails/Close/state.tsx index 2476516..263723b 100644 --- a/src/components/modules/PositionDetails/Close/state.tsx +++ b/src/components/modules/PositionDetails/Close/state.tsx @@ -10,7 +10,7 @@ import { actionAtom } from "@/atoms/actions-atoms"; import { positionsAtom } from "@/atoms/portfolio-atoms"; import { selectedProviderAtom } from "@/atoms/providers-atoms"; import { getCloseCalculations } from "@/domain/position"; -import type { WalletConnected } from "@/domain/wallet"; +import type { WalletAccount, WalletConnected } from "@/domain/wallet"; import { ApiClientService } from "@/services/api-client"; import type { PositionDto } from "@/services/api-client/client-factory"; import { runtimeAtom } from "@/services/runtime"; @@ -34,10 +34,10 @@ export const useClosePercentage = () => { }; const closePositionAtom = Atom.family( - (args: { wallet: WalletConnected; marketId: string }) => + (args: { walletAddress: WalletAccount["address"]; marketId: string }) => runtimeAtom.atom( Effect.fn(function* (ctx) { - const positions = yield* ctx.result(positionsAtom(args.wallet)); + const positions = yield* ctx.result(positionsAtom(args.walletAddress)); const position = positions.find((p) => p.marketId === args.marketId); @@ -50,8 +50,13 @@ const closePositionAtom = Atom.family( ), ); -export const usePosition = (wallet: WalletConnected, marketId: string) => { - return useAtomValue(closePositionAtom(Data.struct({ wallet, marketId }))); +export const usePosition = ( + walletAddress: WalletAccount["address"], + marketId: string, +) => { + return useAtomValue( + closePositionAtom(Data.struct({ walletAddress, marketId })), + ); }; export const useCloseCalculations = (position: PositionDto) => { @@ -79,7 +84,7 @@ const submitCloseAtom = runtimeAtom.fn( const closePercentage = registry.get(closePercentageAtom); const closeCalculations = closePercentage === 100 - ? null // + ? null : getCloseCalculations(args.position, closePercentage); const action = yield* client.ActionsControllerExecuteAction({ diff --git a/src/components/modules/PositionDetails/Overview/Orders/index.tsx b/src/components/modules/PositionDetails/Overview/Orders/index.tsx index aa758e3..5e224e3 100644 --- a/src/components/modules/PositionDetails/Overview/Orders/index.tsx +++ b/src/components/modules/PositionDetails/Overview/Orders/index.tsx @@ -110,7 +110,11 @@ const CancelOrder = ({ const cancelOrderResult = useAtomValue(cancelOrderAtom(cancelOrderId)); const submitCancelOrder = useAtomSet(cancelOrderAtom(cancelOrderId)); - const handleCancelOrder = () => submitCancelOrder({ marketId, wallet }); + const handleCancelOrder = () => + submitCancelOrder({ + marketId, + walletAddress: wallet.currentAccount.address, + }); return ( <> @@ -144,7 +148,7 @@ function OrdersTabContentWithWallet({ wallet: WalletConnected; market: MarketDto; }) { - const ordersResult = useAtomValue(ordersAtom(wallet)); + const ordersResult = useAtomValue(ordersAtom(wallet.currentAccount.address)); if (Result.isInitial(ordersResult)) { return ( diff --git a/src/components/modules/PositionDetails/Overview/Position/index.tsx b/src/components/modules/PositionDetails/Overview/Position/index.tsx index eeb1d0f..26a6bf8 100644 --- a/src/components/modules/PositionDetails/Overview/Position/index.tsx +++ b/src/components/modules/PositionDetails/Overview/Position/index.tsx @@ -282,8 +282,10 @@ function PositionTabContentWithWallet({ wallet: WalletConnected; market: MarketDto; }) { - const positionsResult = useAtomValue(positionsAtom(wallet)); - const ordersResult = useAtomValue(ordersAtom(wallet)); + const positionsResult = useAtomValue( + positionsAtom(wallet.currentAccount.address), + ); + const ordersResult = useAtomValue(ordersAtom(wallet.currentAccount.address)); if (Result.isInitial(positionsResult) || Result.isInitial(ordersResult)) { return ( diff --git a/src/components/modules/PositionDetails/Overview/index.tsx b/src/components/modules/PositionDetails/Overview/index.tsx index ba83473..4b2555a 100644 --- a/src/components/modules/PositionDetails/Overview/index.tsx +++ b/src/components/modules/PositionDetails/Overview/index.tsx @@ -35,7 +35,9 @@ function BottomButtonsWithWallet({ wallet: WalletConnected; market: MarketDto; }) { - const positionsResult = useAtomValue(positionsAtom(wallet)); + const positionsResult = useAtomValue( + positionsAtom(wallet.currentAccount.address), + ); const position = positionsResult.pipe( Result.map((positions) => positions.find((p) => p.marketId === market.id)), diff --git a/src/components/modules/Root/PreloadAtoms.tsx b/src/components/modules/Root/PreloadAtoms.tsx index 31c7b20..49bba95 100644 --- a/src/components/modules/Root/PreloadAtoms.tsx +++ b/src/components/modules/Root/PreloadAtoms.tsx @@ -16,9 +16,9 @@ const PreloadWalletConnectedAtoms = ({ wallet: WalletConnected; }) => { useAtomMount(moralisTokenBalancesAtom(wallet.currentAccount.address)); - useAtomMount(providersBalancesAtom(wallet)); - useAtomMount(positionsAtom(wallet)); - useAtomMount(ordersAtom(wallet)); + useAtomMount(providersBalancesAtom(wallet.currentAccount.address)); + useAtomMount(positionsAtom(wallet.currentAccount.address)); + useAtomMount(ordersAtom(wallet.currentAccount.address)); return null; }; diff --git a/src/components/molecules/account-value-display.tsx b/src/components/molecules/account-value-display.tsx index 35d9104..be6948f 100644 --- a/src/components/molecules/account-value-display.tsx +++ b/src/components/molecules/account-value-display.tsx @@ -6,7 +6,7 @@ import { cn, formatAmount, getTokenLogo } from "@/lib/utils"; export function AccountValueDisplay({ wallet }: { wallet: WalletConnected }) { const selectedProviderBalances = useAtomValue( - selectedProviderBalancesAtom(wallet), + selectedProviderBalancesAtom(wallet.currentAccount.address), ); if (Result.isSuccess(selectedProviderBalances)) { diff --git a/src/components/molecules/address-switcher.tsx b/src/components/molecules/address-switcher.tsx index a8fa72b..cdeb364 100644 --- a/src/components/molecules/address-switcher.tsx +++ b/src/components/molecules/address-switcher.tsx @@ -1,27 +1,201 @@ -import { useAppKit } from "@reown/appkit/react"; -import { ChevronDown, Wallet } from "lucide-react"; +import { useAtomSet } from "@effect-atom/atom-react"; +import { useDisconnect } from "@reown/appkit/react"; +import { Check, ChevronDown, Copy, LogOut, Wallet } from "lucide-react"; +import { useEffect, useRef, useState } from "react"; +import { switchAccountAtom } from "@/atoms/wallet-atom"; import { Button } from "@/components/ui/button"; -import type { WalletConnected } from "@/domain/wallet"; -import { truncateAddress } from "@/lib/utils"; +import { Dialog } from "@/components/ui/dialog"; +import { isBrowserWallet, type WalletConnected } from "@/domain/wallet"; +import { cn, truncateAddress } from "@/lib/utils"; export const AddressSwitcher = ({ wallet }: { wallet: WalletConnected }) => { - const { open } = useAppKit(); + const [open, setOpen] = useState(false); + const switchAccount = useAtomSet(switchAccountAtom(wallet)); + const handleAccountSwitch = (account: (typeof wallet.accounts)[number]) => { + switchAccount({ account }); + setOpen(false); + }; + + return ( + + ( + + )} + /> + + + + + + + Switch Account + + +
+ {wallet.accounts.map((account) => { + const isCurrentAccount = + account.address === wallet.currentAccount.address && + account.id === wallet.currentAccount.id; + + return ( + + ); + })} +
+ + setOpen(false)} + /> +
+
+
+
+ ); +}; + +const CopyButton = ({ + copied, + onCopy, +}: { + copied: boolean; + onCopy: () => void; +}) => { return ( -
- {/* Address Switcher */} - -
+ + {copied ? "Copied!" : "Copy Address"} + + + + {/* Ripple effect */} + + + ); +}; + +const WalletActions = ({ + address, + onDisconnect, + wallet, +}: { + wallet: WalletConnected; + address: string; + onDisconnect: () => void; +}) => { + const [copied, setCopied] = useState(false); + const timeoutRef = useRef(null); + + const handleCopyAddress = () => { + navigator.clipboard.writeText(address); + + if (copied) return; + + setCopied(true); + timeoutRef.current = setTimeout(() => setCopied(false), 2000); + }; + + useEffect(() => { + return () => { + if (timeoutRef.current) { + clearTimeout(timeoutRef.current); + } + }; + }, []); + + return ( + + + + {isBrowserWallet(wallet) && ( + + )} + + ); +}; + +const DisconnectButton = ({ onDisconnect }: { onDisconnect: () => void }) => { + const { disconnect } = useDisconnect(); + + const handleDisconnect = () => { + disconnect(); + onDisconnect(); + }; + + return ( + ); }; diff --git a/src/components/molecules/tp-sl-dialog.tsx b/src/components/molecules/tp-sl-dialog.tsx index 7f4c2fa..4af2536 100644 --- a/src/components/molecules/tp-sl-dialog.tsx +++ b/src/components/molecules/tp-sl-dialog.tsx @@ -47,7 +47,7 @@ export const TPOrSLDialog = (props: TPOrSLDialogProps) => { return ( - + {props.children} diff --git a/src/context/appkit.tsx b/src/context/appkit.tsx index 94e5d5e..488247d 100644 --- a/src/context/appkit.tsx +++ b/src/context/appkit.tsx @@ -15,7 +15,7 @@ export const AppKit = ({ children }: { children: React.ReactNode }) => { wallet, }); - if (Result.isSuccess(result)) { + if (Result.isSuccess(result) && result.value.wallet.type === "browser") { return ( {children} diff --git a/src/domain/chains/evm.ts b/src/domain/chains/evm.ts index cc261d6..ae3be01 100644 --- a/src/domain/chains/evm.ts +++ b/src/domain/chains/evm.ts @@ -1,33 +1,14 @@ import { EvmNetworks } from "@stakekit/common"; const supportedEVMChains = [ - EvmNetworks.AvalancheC, - EvmNetworks.Arbitrum, - EvmNetworks.Binance, - EvmNetworks.Celo, EvmNetworks.Ethereum, - EvmNetworks.EthereumGoerli, - EvmNetworks.Harmony, - EvmNetworks.Optimism, - EvmNetworks.Polygon, - EvmNetworks.Viction, - EvmNetworks.EthereumHoodi, EvmNetworks.Base, - EvmNetworks.Linea, - EvmNetworks.Core, - EvmNetworks.Sonic, - EvmNetworks.EthereumSepolia, - EvmNetworks.Unichain, - EvmNetworks.Katana, - EvmNetworks.Gnosis, - EvmNetworks.HyperEVM, - EvmNetworks.Plasma, + EvmNetworks.Arbitrum, + EvmNetworks.Optimism, EvmNetworks.Monad, - EvmNetworks.MonadTestnet, + EvmNetworks.HyperEVM, ] as const; -export const supportedEVMChainsSet = new Set(supportedEVMChains); - export type SupportedEvmChain = (typeof supportedEVMChains)[number]; export type EvmChainsMap = { diff --git a/src/domain/chains/ledger.ts b/src/domain/chains/ledger.ts new file mode 100644 index 0000000..cfb98e9 --- /dev/null +++ b/src/domain/chains/ledger.ts @@ -0,0 +1,54 @@ +import type { Currency, Families } from "@ledgerhq/wallet-api-client"; +import { EvmNetworks } from "@stakekit/common"; +import type { SupportedSKChains } from "@/domain/chains"; + +export type SupportedLedgerLiveFamilies = Extract; + +export const supportedLedgerFamiliesWithCurrency = { + ethereum: { + ethereum: { + currencyId: "ethereum", + family: "ethereum", + skChainName: EvmNetworks.Ethereum, + }, + base: { + currencyId: "base", + family: "ethereum", + skChainName: EvmNetworks.Base, + }, + arbitrum: { + currencyId: "arbitrum", + family: "ethereum", + skChainName: EvmNetworks.Arbitrum, + }, + optimism: { + currencyId: "optimism", + family: "ethereum", + skChainName: EvmNetworks.Optimism, + }, + monad: { + currencyId: "monad", + family: "ethereum", + skChainName: EvmNetworks.Monad, + }, + hyperevm: { + currencyId: "hyperevm", + family: "ethereum", + skChainName: EvmNetworks.HyperEVM, + }, + }, +} as const satisfies SupportedLedgerFamiliesWithCurrency; + +export type SupportedLedgerFamiliesWithCurrency = Record< + SupportedLedgerLiveFamilies, + Partial< + Record< + (Currency["id"] & {}) | "*", + { + family: SupportedLedgerLiveFamilies; + currencyId: Currency["id"]; + skChainName: SupportedSKChains; + } + > + > +>; diff --git a/src/domain/transactions.ts b/src/domain/transactions.ts index 885bea0..7e99e93 100644 --- a/src/domain/transactions.ts +++ b/src/domain/transactions.ts @@ -1,14 +1,20 @@ import { Schema } from "effect"; -const EvmTxSchema = Schema.Struct( - { chainId: Schema.Number }, - { - key: Schema.String, - value: Schema.Unknown, - }, -); +const HexString = Schema.TemplateLiteral(Schema.Literal("0x"), Schema.String); + +export const EvmTx = Schema.Struct({ + from: Schema.String, + to: HexString, + data: HexString, + value: Schema.optional(Schema.BigInt), + maxFeePerGas: Schema.optional(Schema.BigInt), + maxPriorityFeePerGas: Schema.optional(Schema.BigInt), + gasLimit: Schema.BigInt, + nonce: Schema.Number, + chainId: Schema.Number, +}); -export const EIP712TxSchema = Schema.Struct({ +export const EIP712Tx = Schema.Struct({ domain: Schema.Struct( { chainId: Schema.Number }, { @@ -21,4 +27,12 @@ export const EIP712TxSchema = Schema.Struct({ primaryType: Schema.String, }); -export const TransactionSchema = Schema.Union(EvmTxSchema, EIP712TxSchema); +export const Transaction = Schema.Union(EvmTx, EIP712Tx); + +export type Transaction = typeof Transaction.Type; + +export const TransactionHash = Schema.String.pipe( + Schema.brand("TransactionHash"), +); + +export type TransactionHash = typeof TransactionHash.Type; diff --git a/src/domain/wallet.ts b/src/domain/wallet.ts index c99336f..60035d2 100644 --- a/src/domain/wallet.ts +++ b/src/domain/wallet.ts @@ -1,10 +1,7 @@ import type { HttpClientError } from "@effect/platform"; -import type { AppKitNetwork } from "@reown/appkit/networks"; import type { WagmiAdapter } from "@reown/appkit-adapter-wagmi"; -import { Data, type Effect, type Stream } from "effect"; -import type { NonEmptyArray } from "effect/Array"; +import { Data, type Effect, Schema, type Stream } from "effect"; import type { ParseError } from "effect/ParseResult"; -import type { SupportedSKChains } from "@/domain/chains"; import type { ActionDto, TransactionDto, @@ -45,15 +42,17 @@ export type SignTransactionsState = { } ); -export type WalletAccount = { - id: string; - address: string; -}; +export const WalletAccount = Schema.Struct({ + id: Schema.String, + address: Schema.String.pipe(Schema.brand("WalletAccountAddress")), +}); -type WalletBase = { - networks: NonEmptyArray; - wagmiAdapter: WagmiAdapter; -}; +export type WalletAccount = typeof WalletAccount.Type; + +type BrowserWallet = { type: "browser"; wagmiAdapter: WagmiAdapter }; +type LedgerWallet = { type: "ledger" }; + +type WalletBase = BrowserWallet | LedgerWallet; export type WalletDisconnected = WalletBase & { status: "disconnected"; @@ -63,11 +62,13 @@ export type WalletConnected = WalletBase & { status: "connected"; currentAccount: WalletAccount; accounts: WalletAccount[]; + switchAccount: (args: { + account: WalletAccount; + }) => Effect.Effect; signTransactions: (action: ActionDto) => Effect.Effect< { stream: Stream.Stream; - startMachine: Effect.Effect; - state: SignTransactionsState; + retry: Effect.Effect; }, never, never @@ -98,6 +99,14 @@ export class SwitchChainError extends Data.TaggedError("SwitchChainError")<{ cause: unknown; }> {} +export class SwitchAccountError extends Data.TaggedError("SwitchAccountError")<{ + cause: unknown; +}> {} + export const isWalletConnected = ( wallet: Wallet | null, ): wallet is WalletConnected => wallet?.status === "connected"; + +export const isBrowserWallet = ( + wallet: Wallet | null, +): wallet is WalletConnected & BrowserWallet => wallet?.type === "browser"; diff --git a/src/lib/utils.ts b/src/lib/utils.ts index 686f6cc..f504794 100644 --- a/src/lib/utils.ts +++ b/src/lib/utils.ts @@ -120,3 +120,7 @@ export const formatDate = (timestamp: number): string => { hour12: true, }); }; + +export const truncateNumber = (number: number, precision: number = 2) => { + return Math.floor(number * 10 ** precision) / 10 ** precision; +}; diff --git a/src/services/config.ts b/src/services/config.ts index bdac7de..651749d 100644 --- a/src/services/config.ts +++ b/src/services/config.ts @@ -1,4 +1,4 @@ -import { ConfigProvider, Effect, Schema } from "effect"; +import { Config, ConfigProvider, Effect, Schema } from "effect"; export class ConfigService extends Effect.Service()( "perps/services/config-service/ConfigService", @@ -16,7 +16,7 @@ export class ConfigService extends Effect.Service()( const reownProjectId = yield* Schema.Config( "VITE_REOWN_PROJECT_ID", Schema.NonEmptyString, - ); + ).pipe(Config.option); const moralisApiKey = yield* Schema.Config( "VITE_MORALIS_API_KEY", diff --git a/src/services/runtime.ts b/src/services/runtime.ts index 81066d3..fe41631 100644 --- a/src/services/runtime.ts +++ b/src/services/runtime.ts @@ -3,14 +3,22 @@ import { Cause, Effect, Layer, Logger } from "effect"; import { ApiClientService } from "@/services/api-client"; import { ConfigService } from "@/services/config"; import { HttpClientService } from "@/services/http-client"; -import { WalletService } from "@/services/wallet-service"; +import { BrowserSignerLayer } from "@/services/wallet/browser-signer"; +import { LedgerSignerLayer } from "@/services/wallet/ledger-signer"; +import { isLedgerDappBrowserProvider } from "@/services/wallet/ledger-signer/utils"; +import { WalletService } from "@/services/wallet/wallet-service"; + +const Signer = isLedgerDappBrowserProvider + ? LedgerSignerLayer.pipe(Layer.orDie) + : BrowserSignerLayer.pipe(Layer.provide(ConfigService.Default)).pipe( + Layer.orDie, + ); const layer = Layer.mergeAll( - WalletService.Default.pipe( - Layer.provideMerge(ApiClientService.Default), - Layer.provideMerge(ConfigService.Default), - ), + WalletService.Default.pipe(Layer.provide(Signer)), + ApiClientService.Default, HttpClientService.Default, + ConfigService.Default, Registry.layer, Logger.pretty, ).pipe( @@ -19,6 +27,7 @@ const layer = Layer.mergeAll( console.error(Cause.pretty(cause)); }), ), + Layer.orDie, ); const memoMap = Layer.makeMemoMap.pipe(Effect.runSync); diff --git a/src/services/wallet/browser-signer.ts b/src/services/wallet/browser-signer.ts new file mode 100644 index 0000000..6619175 --- /dev/null +++ b/src/services/wallet/browser-signer.ts @@ -0,0 +1,212 @@ +import type { AppKitNetwork } from "@reown/appkit/networks"; +import { createAppKit } from "@reown/appkit/react"; +import { WagmiAdapter } from "@reown/appkit-adapter-wagmi"; +import { EvmNetworks } from "@stakekit/common"; +import { + Array as _Array, + Effect, + identity, + Layer, + Option, + Record, + Schema, + SubscriptionRef, +} from "effect"; +import type { NonEmptyArray } from "effect/Array"; +import { ChainNotFoundError, defineChain } from "viem"; +import { arbitrum, base, mainnet, monad, optimism } from "viem/chains"; +import { + sendTransaction, + signTypedData, + switchConnection, + switchChain as wagmiSwitchChain, +} from "wagmi/actions"; +import type { SupportedSKChains } from "@/domain/chains"; +import { + EIP712Tx, + type Transaction, + TransactionHash, +} from "@/domain/transactions"; +import { + SignTransactionError, + SwitchAccountError, + SwitchChainError, + WalletAccount, +} from "@/domain/wallet"; +import { ConfigService } from "@/services/config"; +import { type AccountsState, Signer } from "@/services/wallet/signer"; + +const hyperLiquidL1 = defineChain({ + id: 1337, + caipNetworkId: "eip155:1337", + chainNamespace: "eip155", + name: "Hyperliquid L1", + nativeCurrency: { name: "HYPE", symbol: "HYPE", decimals: 18 }, + rpcUrls: { + default: { http: ["https://api.hyperliquid.xyz/evm"] }, + }, + blockExplorers: { + default: { name: "Hyperliquid", url: "https://app.hyperliquid.xyz" }, + }, +}); + +export const BrowserSignerLayer = Effect.gen(function* () { + const projectId = yield* ConfigService.pipe( + Effect.andThen((config) => config.reownProjectId), + ); + + const networks: NonEmptyArray< + AppKitNetwork & { skChainName: SupportedSKChains } + > = [ + { ...mainnet, skChainName: EvmNetworks.Ethereum }, + { ...base, skChainName: EvmNetworks.Base }, + { ...arbitrum, skChainName: EvmNetworks.Arbitrum }, + { ...optimism, skChainName: EvmNetworks.Optimism }, + { ...monad, skChainName: EvmNetworks.Monad }, + { ...hyperLiquidL1, skChainName: EvmNetworks.HyperEVM }, + ]; + + const chainsMap = Record.fromIterableBy(networks, (network) => + network.id.toString(), + ); + + const wagmiAdapter = new WagmiAdapter({ + networks, + projectId, + multiInjectedProviderDiscovery: true, + }); + + createAppKit({ + networks, + projectId, + themeVariables: { + "--apkt-font-family": "var(--font-family)", + }, + enableNetworkSwitch: false, + adapters: [wagmiAdapter], + }); + + const switchChain = (chainId: AppKitNetwork["id"]) => + Effect.gen(function* () { + const chain = yield* Record.get(chainsMap, chainId.toString()).pipe( + Effect.mapError(() => new ChainNotFoundError()), + ); + + yield* Effect.tryPromise({ + try: () => + wagmiSwitchChain(wagmiAdapter.wagmiConfig, { + chainId: typeof chain.id === "number" ? chain.id : Number(chain.id), + }), + catch: (e) => new SwitchChainError({ cause: e }), + }); + }); + + const signTransaction = Effect.fn(function* ({ + transaction, + }: { + transaction: Transaction; + }) { + const chainId = Schema.is(EIP712Tx)(transaction) + ? transaction.domain.chainId + : transaction.chainId; + + if (chainId !== wagmiAdapter.wagmiConfig.state.chainId) { + yield* switchChain(chainId).pipe(Effect.orDie); + } + + return yield* Effect.tryPromise({ + try: () => + Schema.is(EIP712Tx)(transaction) + ? signTypedData(wagmiAdapter.wagmiConfig, { + primaryType: transaction.primaryType, + message: transaction.message, + types: transaction.types, + domain: transaction.domain, + }) + : sendTransaction(wagmiAdapter.wagmiConfig, transaction), + catch: (e) => new SignTransactionError({ cause: e }), + }).pipe(Effect.andThen(Schema.decodeSync(TransactionHash))); + }); + + const accountsStateRef = yield* SubscriptionRef.make({ + status: "disconnected", + }); + + yield* Effect.acquireRelease( + Effect.sync(() => + wagmiAdapter.wagmiConfig.subscribe(identity, (nextState) => { + nextState.status; + const currentConnectionId = nextState.current; + + SubscriptionRef.update( + accountsStateRef, + (prevWallet): AccountsState => { + const connection = Option.fromNullable(currentConnectionId).pipe( + Option.flatMapNullable((connectionId) => + nextState.connections.get(connectionId), + ), + ); + + if (Option.isNone(connection)) { + return { status: "disconnected" }; + } + + const currentAccount = Option.some(prevWallet).pipe( + Option.filter((accounts) => accounts?.status === "connected"), + Option.map((wallet) => wallet.currentAccount), + Option.flatMapNullable((prevAcc) => + connection.value.accounts.find( + (acc) => acc === prevAcc.address, + ), + ), + Option.orElse(() => _Array.head(connection.value.accounts)), + ); + + if (Option.isNone(currentAccount)) { + return { status: "disconnected" }; + } + + return { + status: "connected", + currentAccount: Schema.decodeSync(WalletAccount)({ + id: currentAccount.value, + address: currentAccount.value, + }), + accounts: connection.value.accounts.map((acc) => + Schema.decodeSync(WalletAccount)({ + id: acc, + address: acc, + }), + ), + }; + }, + ).pipe(Effect.runSync); + }), + ), + (unsubscribe) => Effect.sync(() => unsubscribe()), + ); + + const switchAccount = Effect.fn( + function* ({ account }: { account: WalletAccount }) { + const connection = yield* Option.fromNullable( + wagmiAdapter.wagmiConfig.state.connections.get(account.id), + ); + + yield* Effect.tryPromise(() => + switchConnection(wagmiAdapter.wagmiConfig, { + connector: connection.connector, + }), + ); + }, + Effect.mapError((e) => new SwitchAccountError({ cause: e })), + ); + + return Signer.of({ + type: "browser", + signTransaction, + switchAccount, + wagmiAdapter, + accountsStream: accountsStateRef.changes, + getAccountState: accountsStateRef.get, + }); +}).pipe(Layer.scoped(Signer)); diff --git a/src/services/wallet/ledger-signer/index.ts b/src/services/wallet/ledger-signer/index.ts new file mode 100644 index 0000000..4a0ce5d --- /dev/null +++ b/src/services/wallet/ledger-signer/index.ts @@ -0,0 +1,174 @@ +import { + deserializeTransaction, + WalletAPIClient, + WindowMessageTransport, +} from "@ledgerhq/wallet-api-client"; +import { + Array as _Array, + Effect, + Layer, + pipe, + Schema, + SubscriptionRef, +} from "effect"; +import { evmChainsMap } from "@/domain/chains/evm"; +import type { SupportedLedgerLiveFamilies } from "@/domain/chains/ledger"; +import { + EIP712Tx, + EvmTx, + type Transaction, + TransactionHash, +} from "@/domain/transactions"; +import { + SignTransactionError, + SwitchAccountError, + WalletAccount, +} from "@/domain/wallet"; +import { + getFilteredSupportedLedgerFamiliesWithCurrency, + getLedgerAccounts, + getLedgerCurrencies, + NoAccountsFoundError, +} from "@/services/wallet/ledger-signer/utils"; +import { type AccountsState, Signer } from "@/services/wallet/signer"; + +export const LedgerSignerLayer = Effect.gen(function* () { + const transport = new WindowMessageTransport(); + transport.connect(); + const walletApiClient = new WalletAPIClient(transport); + + /** + * Create Map + * then use TokenCurrency parent to get CryptoCurrency family + * and add to map TokenCurrency['id'] => CryptoCurrency['family'] + */ + const ledgerCurrencies = yield* getLedgerCurrencies(walletApiClient); + const parentAccounts = yield* getLedgerAccounts(walletApiClient).pipe( + Effect.map((allAccounts) => allAccounts.filter((a) => !a.parentAccountId)), + ); + + const filteredSupportedLedgerFamiliesWithCurrency = + getFilteredSupportedLedgerFamiliesWithCurrency({ + ledgerCurrencies, + accounts: parentAccounts, + enabledChainsMap: { evm: evmChainsMap }, + }); + + const uniqueByAddressAccounts = pipe( + parentAccounts.reduce((acc, next) => { + const family = ledgerCurrencies.get(next.currency); + + if (!family) return acc; + + const itemMap = filteredSupportedLedgerFamiliesWithCurrency.get( + family as SupportedLedgerLiveFamilies, + ); + + if (!family || !itemMap) return acc; + + const chainItem = itemMap.get("*") || itemMap.get(next.currency); + + if (chainItem) { + acc.push( + Schema.decodeSync(WalletAccount)({ + address: next.address, + id: next.id, + }), + ); + } + + return acc; + }, []), + (val) => [...new Map(val.map((a) => [a.address, a])).values()], + ); + + const accountWithChain = yield* _Array + .head(uniqueByAddressAccounts) + .pipe(Effect.mapError(() => new NoAccountsFoundError())); + + const accountsStateRef = yield* SubscriptionRef.make({ + status: "connected", + currentAccount: accountWithChain, + accounts: uniqueByAddressAccounts, + }); + + const signMessage = ({ + account, + transaction, + }: { + account: WalletAccount; + transaction: typeof EIP712Tx.Type; + }) => + Effect.try(() => Buffer.from(JSON.stringify(transaction))).pipe( + Effect.andThen((buffer) => + walletApiClient.message.sign(account.id, buffer), + ), + Effect.andThen((buffer) => + Schema.decodeSync(TransactionHash)(buffer.toString("hex")), + ), + Effect.mapError((error) => new SignTransactionError({ cause: error })), + ); + + const signEVMTransaction = ({ + account, + transaction, + }: { + account: WalletAccount; + transaction: typeof EvmTx.Type; + }) => + Schema.encode(EvmTx)(transaction).pipe( + Effect.andThen((tx) => + Effect.try(() => + deserializeTransaction({ + ...tx, + family: "ethereum", + amount: tx.value ?? "0", + recipient: tx.to, + data: tx.data.slice(2), + }), + ), + ), + Effect.andThen((tx) => + Effect.tryPromise(() => + walletApiClient.transaction.signAndBroadcast(account.id, tx), + ), + ), + Effect.andThen(Schema.decodeSync(TransactionHash)), + Effect.mapError((error) => new SignTransactionError({ cause: error })), + ); + + const signTransaction = Effect.fn(function* ({ + account, + transaction, + }: { + transaction: Transaction; + account: WalletAccount; + }) { + return yield* Schema.is(EIP712Tx)(transaction) + ? signMessage({ account, transaction }) + : signEVMTransaction({ account, transaction }); + }); + + const switchAccount = Effect.fn( + function* ({ account }: { account: WalletAccount }) { + const newAccount = yield* _Array.findFirst( + uniqueByAddressAccounts, + (a) => a.id === account.id, + ); + + yield* SubscriptionRef.update(accountsStateRef, (state) => ({ + ...state, + currentAccount: newAccount, + })); + }, + Effect.mapError((e) => new SwitchAccountError({ cause: e })), + ); + + return Layer.succeed(Signer, { + type: "ledger", + signTransaction, + switchAccount, + accountsStream: accountsStateRef.changes, + getAccountState: accountsStateRef.get, + }); +}).pipe(Layer.unwrapEffect); diff --git a/src/services/wallet/ledger-signer/utils.ts b/src/services/wallet/ledger-signer/utils.ts new file mode 100644 index 0000000..50f0f01 --- /dev/null +++ b/src/services/wallet/ledger-signer/utils.ts @@ -0,0 +1,183 @@ +import type { + Account, + CryptoCurrency, + Currency, + ERC20TokenCurrency, + WalletAPIClient, +} from "@ledgerhq/wallet-api-client"; +import { Data, Effect, Option, Record } from "effect"; +import type { SupportedSKChains } from "@/domain/chains"; +import type { EvmChainsMap } from "@/domain/chains/evm"; +import { + type SupportedLedgerLiveFamilies, + supportedLedgerFamiliesWithCurrency, +} from "@/domain/chains/ledger"; + +export const getFilteredSupportedLedgerFamiliesWithCurrency = ({ + accounts, + ledgerCurrencies, + enabledChainsMap, +}: { + accounts: Account[]; + ledgerCurrencies: Effect.Effect.Success< + ReturnType + >; + enabledChainsMap: { evm: Partial }; +}) => { + const { accountsFamilies, accountsCurrencies } = accounts.reduce( + (acc, next) => { + const family = ledgerCurrencies.get(next.currency); + + if (family) { + acc.accountsFamilies.add(family); + acc.accountsCurrencies.add(next.currency); + } + + return acc; + }, + { accountsFamilies: new Set(), accountsCurrencies: new Set() }, + ); + + const v = Record.map( + supportedLedgerFamiliesWithCurrency, + Record.filter((s, key) => { + const chain = enabledChainsMap.evm[s.skChainName]?.skChainName; + + if (!chain) return false; + + if ( + accountsFamilies.has(s.family) && + ((key as typeof key | "*") === "*" || + accountsCurrencies.has(s.currencyId)) + ) { + return true; + } + + return false; + }), + ); + + type V = typeof v; + type Key = keyof V; + + return Object.keys(v).reduce( + (acc, key) => { + const subItem = v[key as Key]; + + type SubItemKey = keyof typeof subItem; + + const subItemMap = Object.keys(subItem).reduce((acc, subKey) => { + acc.set(subKey as SubItemKey, subItem[subKey as keyof typeof subItem]); + + return acc; + }, new Map()); + + acc.set(key as Key, subItemMap); + + return acc; + }, + new Map< + Key, + Map< + "*" | (string & {}), + { + currencyId: string; + family: SupportedLedgerLiveFamilies; + skChainName: SupportedSKChains; + } + > + >(), + ); +}; + +export const getLedgerCurrencies = (walletApiClient: WalletAPIClient) => + Effect.tryPromise({ + try: () => + walletApiClient.currency.list({ + currencyIds: Object.values(supportedLedgerFamiliesWithCurrency).flatMap( + (chain) => + Object.values(chain).map((currency) => currency.currencyId), + ), + }), + catch: (error) => new GetCurrenciesError({ cause: error }), + }).pipe( + Effect.map((val) => + val.reduce( + (acc, next) => { + if (next.type === "CryptoCurrency") { + acc.cryptoCurrency.set(next.id, next.family); + } else { + acc.tokenCurrency.push(next); + } + + return acc; + }, + { cryptoCurrency: new Map(), tokenCurrency: [] } as { + cryptoCurrency: Map; + tokenCurrency: ERC20TokenCurrency[]; + }, + ), + ), + Effect.map((val) => { + val.tokenCurrency.forEach((t) => { + const parentCryptoCurrencyFamily = val.cryptoCurrency.get(t.parent); + + if (parentCryptoCurrencyFamily) { + val.cryptoCurrency.set(t.id, parentCryptoCurrencyFamily); + } + }); + + return val.cryptoCurrency; + }), + ); + +export const getLedgerAccounts = (walletApiClient: WalletAPIClient) => + Effect.tryPromise({ + try: () => walletApiClient.account.list(), + catch: (error) => new GetAccountsError({ cause: error }), + }).pipe( + Effect.map((val) => ({ + accounts: val, + accountsMap: new Map(val.map((v) => [v.id, v])), + })), + Effect.map((val) => + val.accounts.map((acc) => { + if (!acc.parentAccountId) return acc; + + return Option.fromNullable( + val.accountsMap.get(acc.parentAccountId), + ).pipe( + Option.map((parentAcc) => ({ + ...acc, + currency: parentAcc.currency, + })), + Option.getOrElse(() => acc), + ); + }), + ), + ); + +export class GetAccountsError extends Data.TaggedError("GetAccountsError")<{ + cause: unknown; +}> {} + +export class GetCurrenciesError extends Data.TaggedError("GetCurrenciesError")<{ + cause: unknown; +}> {} + +export class NoAccountsFoundError extends Data.TaggedError( + "NoAccountsFoundError", +) {} + +export const isLedgerDappBrowserProvider = Option.fromNullable(window).pipe( + Option.map((w) => { + try { + const params = new URLSearchParams(w.self.location.search); + + return !!params.get("embed"); + } catch (_error) { + return false; + } + }), + Option.getOrElse(() => false), +); diff --git a/src/services/wallet/signer.ts b/src/services/wallet/signer.ts new file mode 100644 index 0000000..d61ae74 --- /dev/null +++ b/src/services/wallet/signer.ts @@ -0,0 +1,39 @@ +import type { WagmiAdapter } from "@reown/appkit-adapter-wagmi"; +import { Context, type Effect, type Stream } from "effect"; +import type { Transaction, TransactionHash } from "@/domain/transactions"; +import type { + SignTransactionError, + SwitchAccountError, + WalletAccount, +} from "@/domain/wallet"; + +export type AccountsState = + | { status: "disconnected" } + | { + status: "connected"; + currentAccount: WalletAccount; + accounts: WalletAccount[]; + }; + +export class Signer extends Context.Tag("Signer")< + Signer, + { + signTransaction: (args: { + transaction: Transaction; + account: WalletAccount; + }) => Effect.Effect; + switchAccount: (args: { + account: WalletAccount; + }) => Effect.Effect; + accountsStream: Stream.Stream; + getAccountState: Effect.Effect; + } & ( + | { + type: "browser"; + wagmiAdapter: WagmiAdapter; + } + | { + type: "ledger"; + } + ) +>() {} diff --git a/src/services/wallet-service.ts b/src/services/wallet/wallet-service.ts similarity index 60% rename from src/services/wallet-service.ts rename to src/services/wallet/wallet-service.ts index bca1b33..80c8bfd 100644 --- a/src/services/wallet-service.ts +++ b/src/services/wallet/wallet-service.ts @@ -1,92 +1,32 @@ -import { - type AppKitNetwork, - arbitrum, - base, - defineChain, - mainnet, - monad, - optimism, -} from "@reown/appkit/networks"; -import { createAppKit } from "@reown/appkit/react"; -import { WagmiAdapter } from "@reown/appkit-adapter-wagmi"; -import { EvmNetworks } from "@stakekit/common"; import { Array as _Array, Data, Duration, Effect, - identity, Match, - Option, - Record, Schedule, Schema, + Stream, SubscriptionRef, } from "effect"; +import { Transaction } from "@/domain/transactions"; import { - sendTransaction, - signTypedData, - switchChain as wagmiSwitchChain, -} from "wagmi/actions"; -import { EIP712TxSchema, TransactionSchema } from "@/domain/transactions"; -import { - ChainNotFoundError, - isWalletConnected, - SignTransactionError, type SignTransactionsState, - SwitchChainError, TransactionFailedError, TransactionNotConfirmedError, type Wallet, } from "@/domain/wallet"; import { ApiClientService } from "@/services/api-client"; import type { ActionDto } from "@/services/api-client/api-schemas"; -import { ConfigService } from "@/services/config"; - -const hyperLiquidL1 = defineChain({ - id: 1337, - caipNetworkId: "eip155:1337", - chainNamespace: "eip155", - name: "Hyperliquid L1", - nativeCurrency: { name: "HYPE", symbol: "HYPE", decimals: 18 }, - rpcUrls: { - default: { http: ["https://api.hyperliquid.xyz/evm"] }, - }, - blockExplorers: { - default: { name: "Hyperliquid", url: "https://app.hyperliquid.xyz" }, - }, -}); +import { type AccountsState, Signer } from "@/services/wallet/signer"; export class WalletService extends Effect.Service()( "perps/services/wallet-service/WalletService", { + dependencies: [ApiClientService.Default], scoped: Effect.gen(function* () { - const { reownProjectId } = yield* ConfigService; const apiClient = yield* ApiClientService; - - const networks: Wallet["networks"] = [ - { ...mainnet, skChainName: EvmNetworks.Ethereum }, - { ...base, skChainName: EvmNetworks.Base }, - { ...arbitrum, skChainName: EvmNetworks.Arbitrum }, - { ...optimism, skChainName: EvmNetworks.Optimism }, - { ...monad, skChainName: EvmNetworks.Monad }, - { ...hyperLiquidL1, skChainName: EvmNetworks.HyperEVM }, - ]; - const chainsMap = Record.fromIterableBy(networks, (network) => - network.id.toString(), - ); - - const wagmiAdapter = new WagmiAdapter({ - networks, - projectId: reownProjectId, - multiInjectedProviderDiscovery: true, - }); - - const walletRef = yield* SubscriptionRef.make({ - networks, - wagmiAdapter, - status: "disconnected", - }); + const signer = yield* Signer; type SignAction = Data.TaggedEnum<{ MachineStart: {}; @@ -102,22 +42,6 @@ export class WalletService extends Effect.Service()( }>; const SignAction = Data.taggedEnum(); - const switchChain = (chainId: AppKitNetwork["id"]) => - Effect.gen(function* () { - const chain = yield* Record.get(chainsMap, chainId.toString()).pipe( - Effect.mapError(() => new ChainNotFoundError()), - ); - - yield* Effect.tryPromise({ - try: () => - wagmiSwitchChain(wagmiAdapter.wagmiConfig, { - chainId: - typeof chain.id === "number" ? chain.id : Number(chain.id), - }), - catch: (e) => new SwitchChainError({ cause: e }), - }); - }); - const signTransactions = (action: ActionDto) => Effect.gen(function* () { const ref = yield* SubscriptionRef.make({ @@ -135,31 +59,37 @@ export class WalletService extends Effect.Service()( SignAction.$match(action, { MachineStart: () => ({ ...state, + error: null, txHash: null, step: "sign" as const, }), SignStart: () => ({ ...state, + error: null, txHash: null, step: "sign" as const, }), SignDone: (val) => ({ ...state, + error: null, txHash: val.txHash, step: "submit" as const, }), SubmitStart: () => ({ ...state, + error: null, txHash: state.txHash as string, step: "submit" as const, }), SubmitDone: () => ({ ...state, + error: null, txHash: state.txHash as string, step: "check" as const, }), CheckStart: () => ({ ...state, + error: null, txHash: state.txHash as string, step: "check" as const, }), @@ -204,9 +134,9 @@ export class WalletService extends Effect.Service()( .get(state.transactions, state.currentTxIndex) .pipe(Effect.orDie); - const wallet = yield* SubscriptionRef.get(walletRef); + const accountState = yield* signer.getAccountState; - if (wallet.status === "disconnected") { + if (accountState.status === "disconnected") { return yield* Effect.dieMessage("Wallet is disconnected"); } @@ -218,18 +148,10 @@ export class WalletService extends Effect.Service()( ); } - const decodedTx = yield* Schema.decodeUnknown(TransactionSchema)( + const decodedTx = yield* Schema.decodeUnknown(Transaction)( signablePayload, ).pipe(Effect.orDie); - const txChainId = Schema.is(EIP712TxSchema)(decodedTx) - ? decodedTx.domain.chainId - : decodedTx.chainId; - - if (txChainId !== wagmiAdapter.wagmiConfig.state.chainId) { - yield* switchChain(txChainId).pipe(Effect.orDie); - } - yield* Match.value(state.step).pipe( Match.when(null, () => updateState(SignAction.MachineStart())), Match.when( @@ -237,17 +159,9 @@ export class WalletService extends Effect.Service()( Effect.fn(function* () { yield* updateState(SignAction.SignStart()); - const txHash = yield* Effect.tryPromise({ - try: () => - Schema.is(EIP712TxSchema)(decodedTx) - ? signTypedData(wagmiAdapter.wagmiConfig, { - primaryType: decodedTx.primaryType, - message: decodedTx.message, - types: decodedTx.types, - domain: decodedTx.domain, - }) - : sendTransaction(wagmiAdapter.wagmiConfig, decodedTx), - catch: (e) => new SignTransactionError({ cause: e }), + const txHash = yield* signer.signTransaction({ + transaction: decodedTx, + account: accountState.currentAccount, }); yield* updateState(SignAction.SignDone({ txHash })); @@ -343,84 +257,74 @@ export class WalletService extends Effect.Service()( Effect.ignore, ); - return { - stream: ref.changes, - startMachine, - state: yield* SubscriptionRef.get(ref), - }; - }); + startMachine.pipe(Effect.runFork); - yield* Effect.acquireRelease( - Effect.sync(() => - wagmiAdapter.wagmiConfig.subscribe(identity, (nextState) => { - nextState.status; - const currentConnectionId = nextState.current; + const retry = startMachine; + const stream = ref.changes; - SubscriptionRef.update(walletRef, (prevWallet): Wallet => { - const connection = Option.fromNullable(currentConnectionId).pipe( - Option.flatMapNullable((connectionId) => - nextState.connections.get(connectionId), - ), - ); + return { stream, retry }; + }); - if (Option.isNone(connection)) { + const getWalletState = Match.type<{ + signer: Signer["Type"]; + accountsState: AccountsState; + }>().pipe( + Match.withReturnType(), + Match.when( + { signer: { type: "browser" } }, + ({ signer, accountsState }) => + Match.value(accountsState).pipe( + Match.withReturnType(), + Match.when({ status: "connected" }, (connectedState) => { return { - status: "disconnected", - wagmiAdapter, - networks, + type: "browser", + wagmiAdapter: signer.wagmiAdapter, + status: "connected", + accounts: connectedState.accounts, + currentAccount: connectedState.currentAccount, + signTransactions, + switchAccount: signer.switchAccount, }; - } - - const currentAccount = Option.some(prevWallet).pipe( - Option.filter(isWalletConnected), - Option.map((wallet) => wallet.currentAccount), - Option.flatMapNullable((prevAcc) => - connection.value.accounts.find( - (acc) => acc === prevAcc.address, - ), - ), - Option.orElse(() => _Array.head(connection.value.accounts)), - ); - - if (Option.isNone(currentAccount)) { + }), + Match.orElse(() => { return { + type: "browser", + wagmiAdapter: signer.wagmiAdapter, status: "disconnected", - wagmiAdapter, - networks, }; - } - + }), + ), + ), + Match.orElse(({ accountsState }) => + Match.value(accountsState).pipe( + Match.withReturnType(), + Match.when({ status: "connected" }, (connectedState) => { return { + type: "ledger", status: "connected", - wagmiAdapter, - networks, - accounts: connection.value.accounts.map((acc) => ({ - id: acc, - address: acc, - })), - currentAccount: { - id: currentAccount.value, - address: currentAccount.value, - }, + accounts: connectedState.accounts, + currentAccount: connectedState.currentAccount, signTransactions, + switchAccount: signer.switchAccount, }; - }).pipe(Effect.runSync); - }), + }), + Match.orElse(() => { + return { + type: "ledger", + status: "disconnected", + }; + }), + ), ), - (unsubscribe) => Effect.sync(() => unsubscribe()), ); - createAppKit({ - networks, - projectId: reownProjectId, - themeVariables: { - "--apkt-font-family": "var(--font-family)", - }, - enableNetworkSwitch: false, - adapters: [wagmiAdapter], - }); + const walletStream = signer.accountsStream.pipe( + Stream.map((accountsState) => + getWalletState({ signer, accountsState }), + ), + ); - return { walletStream: walletRef.changes }; + return { walletStream }; }), }, ) {} From d1f555f53e364d6004d36f21a38050f61316d39f Mon Sep 17 00:00:00 2001 From: Petar Todorovic Date: Sun, 25 Jan 2026 17:32:04 +0100 Subject: [PATCH 2/2] test: init --- .github/workflows/ci.yml | 11 +- package.json | 50 +- pnpm-lock.yaml | 2875 +++++++++-------- src/{index.tsx => app.tsx} | 22 +- .../Order/Overview/leverage-dialog.tsx | 12 +- .../Order/Overview/limit-price-dialog.tsx | 102 +- src/components/molecules/tp-sl-dialog.tsx | 16 +- src/context/index.tsx | 17 + src/main.tsx | 2 +- src/routeTree.gen.ts | 30 +- tests/components/leverage-dialog.test.tsx | 491 +++ tests/components/limit-price-dialog.test.tsx | 392 +++ tests/components/order-type-dialog.test.tsx | 261 ++ tests/components/tp-sl-dialog.test.tsx | 398 +++ tests/components/wrapper.tsx | 12 + tsconfig.json | 2 +- vite.config.ts | 26 + 17 files changed, 3348 insertions(+), 1371 deletions(-) rename src/{index.tsx => app.tsx} (69%) create mode 100644 src/context/index.tsx create mode 100644 tests/components/leverage-dialog.test.tsx create mode 100644 tests/components/limit-price-dialog.test.tsx create mode 100644 tests/components/order-type-dialog.test.tsx create mode 100644 tests/components/tp-sl-dialog.test.tsx create mode 100644 tests/components/wrapper.tsx diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1ed8d96..25b081d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -19,8 +19,13 @@ jobs: - uses: jdx/mise-action@v2 - - run: mise x -- pnpm install --frozen-lockfile + - run: pnpm install --frozen-lockfile - - run: mise x -- pnpm run lint + - name: Install Playwright Browsers + run: pnpm dlx playwright install --with-deps --only-shell - - run: mise x -- pnpm run build + - run: pnpm run lint + + - run: pnpm run build + + - run: pnpm run test diff --git a/package.json b/package.json index b1c9780..1f5a517 100644 --- a/package.json +++ b/package.json @@ -12,55 +12,57 @@ "generate-client-factory": "tsx --env-file .env scripts/generate-client-factory.ts" }, "dependencies": { - "@base-ui/react": "^1.0.0", - "@effect-atom/atom-react": "^0.4.4", + "@base-ui/react": "^1.1.0", + "@effect-atom/atom-react": "^0.4.6", "@effect/experimental": "^0.58.0", - "@effect/platform": "^0.94.1", - "@effect/platform-node": "^0.104.0", + "@effect/platform": "^0.94.2", + "@effect/platform-node": "^0.104.1", "@ledgerhq/wallet-api-client": "^1.12.6", "@lucas-barake/effect-form-react": "^0.14.0", - "@reown/appkit": "^1.8.16", - "@reown/appkit-adapter-wagmi": "^1.8.16", + "@reown/appkit": "^1.8.17", + "@reown/appkit-adapter-wagmi": "^1.8.17", "@stakekit/common": "^0.0.61", "@tailwindcss/vite": "^4.0.6", - "@tanstack/react-devtools": "^0.7.0", - "@tanstack/react-query": "^5.90.16", - "@tanstack/react-router": "^1.132.0", - "@tanstack/react-router-devtools": "^1.132.0", + "@tanstack/react-devtools": "^0.9.2", + "@tanstack/react-query": "^5.90.20", + "@tanstack/react-router": "^1.157.8", + "@tanstack/react-router-devtools": "^1.157.8", "@tanstack/react-virtual": "^3.13.18", - "@tanstack/router-plugin": "^1.132.0", + "@tanstack/router-plugin": "^1.157.8", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", - "effect": "^3.19.14", - "lucide-react": "^0.544.0", + "effect": "^3.19.15", + "lucide-react": "^0.563.0", "react": "^19.2.0", "react-dom": "^19.2.0", "sonner": "^2.0.7", "tailwind-merge": "^3.0.2", "tailwindcss": "^4.0.6", "tw-animate-css": "^1.3.6", - "viem": "^2.44.1", - "wagmi": "^3.3.2" + "viem": "^2.45.0", + "wagmi": "^3.4.1" }, "devDependencies": { - "@biomejs/biome": "2.3.11", - "@effect/language-service": "^0.64.1", - "@tanstack/devtools-vite": "^0.3.11", + "@biomejs/biome": "2.3.12", + "@effect/language-service": "^0.72.0", + "@tanstack/devtools-vite": "^0.4.1", "@testing-library/dom": "^10.4.0", - "@testing-library/react": "^16.2.0", + "@testing-library/react": "^16.3.2", "@tim-smart/openapi-gen": "^0.4.13", - "@types/node": "^22.10.2", - "@types/react": "^19.2.0", + "@types/node": "^25.0.10", + "@types/react": "^19.2.9", "@types/react-dom": "^19.2.0", "@vite-pwa/assets-generator": "^1.0.2", "@vitejs/plugin-react": "^5.0.4", + "@vitest/browser-playwright": "^4.0.18", "babel-plugin-react-compiler": "^1.0.0", "jsdom": "^27.0.0", "openapi-filter": "^3.2.3", "tsx": "^4.21.0", "typescript": "^5.7.2", - "vite": "^7.1.7", - "vite-plugin-node-polyfills": "^0.24.0", - "vitest": "^3.0.5" + "vite": "^7.3.1", + "vite-plugin-node-polyfills": "^0.25.0", + "vitest": "^4.0.18", + "vitest-browser-react": "^2.0.4" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3e5cba2..bd3fd7b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -14,56 +14,56 @@ importers: .: dependencies: '@base-ui/react': - specifier: ^1.0.0 - version: 1.0.0(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + specifier: ^1.1.0 + version: 1.1.0(@types/react@19.2.9)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) '@effect-atom/atom-react': - specifier: ^0.4.4 - version: 0.4.4(@effect/experimental@0.58.0(@effect/platform@0.94.1(effect@3.19.14))(effect@3.19.14))(@effect/platform@0.94.1(effect@3.19.14))(@effect/rpc@0.73.0(@effect/platform@0.94.1(effect@3.19.14))(effect@3.19.14))(effect@3.19.14)(react@19.2.3)(scheduler@0.27.0) + specifier: ^0.4.6 + version: 0.4.6(@effect/experimental@0.58.0(@effect/platform@0.94.2(effect@3.19.15))(effect@3.19.15))(@effect/platform@0.94.2(effect@3.19.15))(@effect/rpc@0.73.0(@effect/platform@0.94.2(effect@3.19.15))(effect@3.19.15))(effect@3.19.15)(react@19.2.3)(scheduler@0.27.0) '@effect/experimental': specifier: ^0.58.0 - version: 0.58.0(@effect/platform@0.94.1(effect@3.19.14))(effect@3.19.14) + version: 0.58.0(@effect/platform@0.94.2(effect@3.19.15))(effect@3.19.15) '@effect/platform': - specifier: ^0.94.1 - version: 0.94.1(effect@3.19.14) + specifier: ^0.94.2 + version: 0.94.2(effect@3.19.15) '@effect/platform-node': - specifier: ^0.104.0 - version: 0.104.0(@effect/cluster@0.56.1(@effect/platform@0.94.1(effect@3.19.14))(@effect/rpc@0.73.0(@effect/platform@0.94.1(effect@3.19.14))(effect@3.19.14))(@effect/sql@0.49.0(@effect/experimental@0.58.0(@effect/platform@0.94.1(effect@3.19.14))(effect@3.19.14))(@effect/platform@0.94.1(effect@3.19.14))(effect@3.19.14))(@effect/workflow@0.16.0(@effect/experimental@0.58.0(@effect/platform@0.94.1(effect@3.19.14))(effect@3.19.14))(@effect/platform@0.94.1(effect@3.19.14))(@effect/rpc@0.73.0(@effect/platform@0.94.1(effect@3.19.14))(effect@3.19.14))(effect@3.19.14))(effect@3.19.14))(@effect/platform@0.94.1(effect@3.19.14))(@effect/rpc@0.73.0(@effect/platform@0.94.1(effect@3.19.14))(effect@3.19.14))(@effect/sql@0.49.0(@effect/experimental@0.58.0(@effect/platform@0.94.1(effect@3.19.14))(effect@3.19.14))(@effect/platform@0.94.1(effect@3.19.14))(effect@3.19.14))(bufferutil@4.1.0)(effect@3.19.14)(utf-8-validate@5.0.10) + specifier: ^0.104.1 + version: 0.104.1(@effect/cluster@0.56.1(@effect/platform@0.94.2(effect@3.19.15))(@effect/rpc@0.73.0(@effect/platform@0.94.2(effect@3.19.15))(effect@3.19.15))(@effect/sql@0.49.0(@effect/experimental@0.58.0(@effect/platform@0.94.2(effect@3.19.15))(effect@3.19.15))(@effect/platform@0.94.2(effect@3.19.15))(effect@3.19.15))(@effect/workflow@0.16.0(@effect/experimental@0.58.0(@effect/platform@0.94.2(effect@3.19.15))(effect@3.19.15))(@effect/platform@0.94.2(effect@3.19.15))(@effect/rpc@0.73.0(@effect/platform@0.94.2(effect@3.19.15))(effect@3.19.15))(effect@3.19.15))(effect@3.19.15))(@effect/platform@0.94.2(effect@3.19.15))(@effect/rpc@0.73.0(@effect/platform@0.94.2(effect@3.19.15))(effect@3.19.15))(@effect/sql@0.49.0(@effect/experimental@0.58.0(@effect/platform@0.94.2(effect@3.19.15))(effect@3.19.15))(@effect/platform@0.94.2(effect@3.19.15))(effect@3.19.15))(bufferutil@4.1.0)(effect@3.19.15)(utf-8-validate@5.0.10) '@ledgerhq/wallet-api-client': specifier: ^1.12.6 version: 1.12.6(@ton/crypto@3.3.0) '@lucas-barake/effect-form-react': specifier: ^0.14.0 - version: 0.14.0(@effect-atom/atom-react@0.4.4(@effect/experimental@0.58.0(@effect/platform@0.94.1(effect@3.19.14))(effect@3.19.14))(@effect/platform@0.94.1(effect@3.19.14))(@effect/rpc@0.73.0(@effect/platform@0.94.1(effect@3.19.14))(effect@3.19.14))(effect@3.19.14)(react@19.2.3)(scheduler@0.27.0))(@effect-atom/atom@0.4.11(@effect/experimental@0.58.0(@effect/platform@0.94.1(effect@3.19.14))(effect@3.19.14))(@effect/platform@0.94.1(effect@3.19.14))(@effect/rpc@0.73.0(@effect/platform@0.94.1(effect@3.19.14))(effect@3.19.14))(effect@3.19.14))(effect@3.19.14)(react@19.2.3) + version: 0.14.0(@effect-atom/atom-react@0.4.6(@effect/experimental@0.58.0(@effect/platform@0.94.2(effect@3.19.15))(effect@3.19.15))(@effect/platform@0.94.2(effect@3.19.15))(@effect/rpc@0.73.0(@effect/platform@0.94.2(effect@3.19.15))(effect@3.19.15))(effect@3.19.15)(react@19.2.3)(scheduler@0.27.0))(@effect-atom/atom@0.4.13(@effect/experimental@0.58.0(@effect/platform@0.94.2(effect@3.19.15))(effect@3.19.15))(@effect/platform@0.94.2(effect@3.19.15))(@effect/rpc@0.73.0(@effect/platform@0.94.2(effect@3.19.15))(effect@3.19.15))(effect@3.19.15))(effect@3.19.15)(react@19.2.3) '@reown/appkit': - specifier: ^1.8.16 - version: 1.8.16(@types/react@19.2.7)(bufferutil@4.1.0)(react@19.2.3)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.3))(utf-8-validate@5.0.10)(zod@3.25.76) + specifier: ^1.8.17 + version: 1.8.17(@types/react@19.2.9)(bufferutil@4.1.0)(react@19.2.3)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.3))(utf-8-validate@5.0.10)(zod@3.25.76) '@reown/appkit-adapter-wagmi': - specifier: ^1.8.16 - version: 1.8.16(22bafcac38b3afe7108ad8937e20dfd4) + specifier: ^1.8.17 + version: 1.8.17(ddefe6db690784ffc0b4049c81f77f80) '@stakekit/common': specifier: ^0.0.61 version: 0.0.61 '@tailwindcss/vite': specifier: ^4.0.6 - version: 4.1.18(vite@7.3.0(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2)) + version: 4.1.18(vite@7.3.1(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2)) '@tanstack/react-devtools': - specifier: ^0.7.0 - version: 0.7.11(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(bufferutil@4.1.0)(csstype@3.2.3)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(solid-js@1.9.10)(utf-8-validate@5.0.10) + specifier: ^0.9.2 + version: 0.9.2(@types/react-dom@19.2.3(@types/react@19.2.9))(@types/react@19.2.9)(bufferutil@4.1.0)(csstype@3.2.3)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(solid-js@1.9.10)(utf-8-validate@5.0.10) '@tanstack/react-query': - specifier: ^5.90.16 - version: 5.90.16(react@19.2.3) + specifier: ^5.90.20 + version: 5.90.20(react@19.2.3) '@tanstack/react-router': - specifier: ^1.132.0 - version: 1.145.7(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + specifier: ^1.157.8 + version: 1.157.8(react-dom@19.2.3(react@19.2.3))(react@19.2.3) '@tanstack/react-router-devtools': - specifier: ^1.132.0 - version: 1.145.7(@tanstack/react-router@1.145.7(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@tanstack/router-core@1.145.7)(csstype@3.2.3)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(solid-js@1.9.10) + specifier: ^1.157.8 + version: 1.157.8(@tanstack/react-router@1.157.8(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@tanstack/router-core@1.157.8)(csstype@3.2.3)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) '@tanstack/react-virtual': specifier: ^3.13.18 version: 3.13.18(react-dom@19.2.3(react@19.2.3))(react@19.2.3) '@tanstack/router-plugin': - specifier: ^1.132.0 - version: 1.145.7(@tanstack/react-router@1.145.7(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(vite@7.3.0(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2)) + specifier: ^1.157.8 + version: 1.157.8(@tanstack/react-router@1.157.8(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(vite@7.3.1(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2)) class-variance-authority: specifier: ^0.7.1 version: 0.7.1 @@ -71,11 +71,11 @@ importers: specifier: ^2.1.1 version: 2.1.1 effect: - specifier: ^3.19.14 - version: 3.19.14 + specifier: ^3.19.15 + version: 3.19.15 lucide-react: - specifier: ^0.544.0 - version: 0.544.0(react@19.2.3) + specifier: ^0.563.0 + version: 0.563.0(react@19.2.3) react: specifier: ^19.2.0 version: 19.2.3 @@ -95,45 +95,48 @@ importers: specifier: ^1.3.6 version: 1.4.0 viem: - specifier: ^2.44.1 - version: 2.44.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + specifier: ^2.45.0 + version: 2.45.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) wagmi: - specifier: ^3.3.2 - version: 3.3.2(@safe-global/safe-apps-provider@0.18.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(@safe-global/safe-apps-sdk@9.1.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(@tanstack/query-core@5.90.16)(@tanstack/react-query@5.90.16(react@19.2.3))(@types/react@19.2.7)(ox@0.11.3(typescript@5.9.3)(zod@3.25.76))(react@19.2.3)(typescript@5.9.3)(viem@2.44.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)) + specifier: ^3.4.1 + version: 3.4.1(@safe-global/safe-apps-provider@0.18.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(@safe-global/safe-apps-sdk@9.1.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(@tanstack/query-core@5.90.20)(@tanstack/react-query@5.90.20(react@19.2.3))(@types/react@19.2.9)(ox@0.11.3(typescript@5.9.3)(zod@3.25.76))(react@19.2.3)(typescript@5.9.3)(viem@2.45.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)) devDependencies: '@biomejs/biome': - specifier: 2.3.11 - version: 2.3.11 + specifier: 2.3.12 + version: 2.3.12 '@effect/language-service': - specifier: ^0.64.1 - version: 0.64.1 + specifier: ^0.72.0 + version: 0.72.0 '@tanstack/devtools-vite': - specifier: ^0.3.11 - version: 0.3.12(bufferutil@4.1.0)(utf-8-validate@5.0.10)(vite@7.3.0(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2)) + specifier: ^0.4.1 + version: 0.4.1(bufferutil@4.1.0)(utf-8-validate@5.0.10)(vite@7.3.1(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2)) '@testing-library/dom': specifier: ^10.4.0 version: 10.4.1 '@testing-library/react': - specifier: ^16.2.0 - version: 16.3.1(@testing-library/dom@10.4.1)(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + specifier: ^16.3.2 + version: 16.3.2(@testing-library/dom@10.4.1)(@types/react-dom@19.2.3(@types/react@19.2.9))(@types/react@19.2.9)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) '@tim-smart/openapi-gen': specifier: ^0.4.13 version: 0.4.13(patch_hash=36720013d0f70c201ce8f233e38a7b93fc9fce74a17f9bc4293c3cf891b4fdc6) '@types/node': - specifier: ^22.10.2 - version: 22.19.3 + specifier: ^25.0.10 + version: 25.0.10 '@types/react': - specifier: ^19.2.0 - version: 19.2.7 + specifier: ^19.2.9 + version: 19.2.9 '@types/react-dom': specifier: ^19.2.0 - version: 19.2.3(@types/react@19.2.7) + version: 19.2.3(@types/react@19.2.9) '@vite-pwa/assets-generator': specifier: ^1.0.2 version: 1.0.2 '@vitejs/plugin-react': specifier: ^5.0.4 - version: 5.1.2(vite@7.3.0(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2)) + version: 5.1.2(vite@7.3.1(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2)) + '@vitest/browser-playwright': + specifier: ^4.0.18 + version: 4.0.18(bufferutil@4.1.0)(playwright@1.58.0)(utf-8-validate@5.0.10)(vite@7.3.1(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2))(vitest@4.0.18) babel-plugin-react-compiler: specifier: ^1.0.0 version: 1.0.0 @@ -150,14 +153,17 @@ importers: specifier: ^5.7.2 version: 5.9.3 vite: - specifier: ^7.1.7 - version: 7.3.0(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2) + specifier: ^7.3.1 + version: 7.3.1(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2) vite-plugin-node-polyfills: - specifier: ^0.24.0 - version: 0.24.0(rollup@4.55.1)(vite@7.3.0(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2)) + specifier: ^0.25.0 + version: 0.25.0(rollup@4.56.0)(vite@7.3.1(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2)) vitest: - specifier: ^3.0.5 - version: 3.2.4(@types/node@22.19.3)(jiti@2.6.1)(jsdom@27.4.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2) + specifier: ^4.0.18 + version: 4.0.18(@types/node@25.0.10)(@vitest/browser-playwright@4.0.18)(jiti@2.6.1)(jsdom@27.4.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2) + vitest-browser-react: + specifier: ^2.0.4 + version: 2.0.4(@types/react-dom@19.2.3(@types/react@19.2.9))(@types/react@19.2.9)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(vitest@4.0.18) packages: @@ -180,22 +186,42 @@ packages: resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} engines: {node: '>=6.9.0'} + '@babel/code-frame@7.28.6': + resolution: {integrity: sha512-JYgintcMjRiCvS8mMECzaEn+m3PfoQiyqukOMCCVQtoJGYJw8j/8LBJEiqkHLkfwCcs74E3pbAUFNg7d9VNJ+Q==} + engines: {node: '>=6.9.0'} + '@babel/compat-data@7.28.5': resolution: {integrity: sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==} engines: {node: '>=6.9.0'} + '@babel/compat-data@7.28.6': + resolution: {integrity: sha512-2lfu57JtzctfIrcGMz992hyLlByuzgIk58+hhGCxjKZ3rWI82NnVLjXcaTqkI2NvlcvOskZaiZ5kjUALo3Lpxg==} + engines: {node: '>=6.9.0'} + '@babel/core@7.28.5': resolution: {integrity: sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==} engines: {node: '>=6.9.0'} + '@babel/core@7.28.6': + resolution: {integrity: sha512-H3mcG6ZDLTlYfaSNi0iOKkigqMFvkTKlGUYlD8GW7nNOYRrevuA46iTypPyv+06V3fEmvvazfntkBU34L0azAw==} + engines: {node: '>=6.9.0'} + '@babel/generator@7.28.5': resolution: {integrity: sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==} engines: {node: '>=6.9.0'} + '@babel/generator@7.28.6': + resolution: {integrity: sha512-lOoVRwADj8hjf7al89tvQ2a1lf53Z+7tiXMgpZJL3maQPDxh0DgLMN62B2MKUOFcoodBHLMbDM6WAbKgNy5Suw==} + engines: {node: '>=6.9.0'} + '@babel/helper-compilation-targets@7.27.2': resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} engines: {node: '>=6.9.0'} + '@babel/helper-compilation-targets@7.28.6': + resolution: {integrity: sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==} + engines: {node: '>=6.9.0'} + '@babel/helper-globals@7.28.0': resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} engines: {node: '>=6.9.0'} @@ -204,16 +230,30 @@ packages: resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} engines: {node: '>=6.9.0'} + '@babel/helper-module-imports@7.28.6': + resolution: {integrity: sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==} + engines: {node: '>=6.9.0'} + '@babel/helper-module-transforms@7.28.3': resolution: {integrity: sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 + '@babel/helper-module-transforms@7.28.6': + resolution: {integrity: sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + '@babel/helper-plugin-utils@7.27.1': resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==} engines: {node: '>=6.9.0'} + '@babel/helper-plugin-utils@7.28.6': + resolution: {integrity: sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==} + engines: {node: '>=6.9.0'} + '@babel/helper-string-parser@7.27.1': resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} engines: {node: '>=6.9.0'} @@ -230,19 +270,28 @@ packages: resolution: {integrity: sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==} engines: {node: '>=6.9.0'} + '@babel/helpers@7.28.6': + resolution: {integrity: sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==} + engines: {node: '>=6.9.0'} + '@babel/parser@7.28.5': resolution: {integrity: sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==} engines: {node: '>=6.0.0'} hasBin: true - '@babel/plugin-syntax-jsx@7.27.1': - resolution: {integrity: sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==} + '@babel/parser@7.28.6': + resolution: {integrity: sha512-TeR9zWR18BvbfPmGbLampPMW+uW1NZnJlRuuHso8i87QZNq2JRF9i6RgxRqtEq+wQGsS19NNTWr2duhnE49mfQ==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/plugin-syntax-jsx@7.28.6': + resolution: {integrity: sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-typescript@7.27.1': - resolution: {integrity: sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==} + '@babel/plugin-syntax-typescript@7.28.6': + resolution: {integrity: sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -263,23 +312,39 @@ packages: resolution: {integrity: sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==} engines: {node: '>=6.9.0'} + '@babel/runtime@7.28.6': + resolution: {integrity: sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==} + engines: {node: '>=6.9.0'} + '@babel/template@7.27.2': resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} engines: {node: '>=6.9.0'} + '@babel/template@7.28.6': + resolution: {integrity: sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==} + engines: {node: '>=6.9.0'} + '@babel/traverse@7.28.5': resolution: {integrity: sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==} engines: {node: '>=6.9.0'} + '@babel/traverse@7.28.6': + resolution: {integrity: sha512-fgWX62k02qtjqdSNTAGxmKYY/7FSL9WAS1o2Hu5+I5m9T0yxZzr4cnrfXQ/MX0rIifthCSs6FKTlzYbJcPtMNg==} + engines: {node: '>=6.9.0'} + '@babel/types@7.28.5': resolution: {integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==} engines: {node: '>=6.9.0'} + '@babel/types@7.28.6': + resolution: {integrity: sha512-0ZrskXVEHSWIqZM/sQZ4EV3jZJXRkio/WCxaqKZP1g//CEWEPSfeZFcms4XeKBCHU0ZKnIkdJeU/kF+eRp5lBg==} + engines: {node: '>=6.9.0'} + '@base-org/account@2.4.0': resolution: {integrity: sha512-A4Umpi8B9/pqR78D1Yoze4xHyQaujioVRqqO3d6xuDFw9VRtjg6tK3bPlwE0aW+nVH/ntllCpPa2PbI8Rnjcug==} - '@base-ui/react@1.0.0': - resolution: {integrity: sha512-4USBWz++DUSLTuIYpbYkSgy1F9ZmNG9S/lXvlUN6qMK0P0RlW+6eQmDUB4DgZ7HVvtXl4pvi4z5J2fv6Z3+9hg==} + '@base-ui/react@1.1.0': + resolution: {integrity: sha512-ikcJRNj1mOiF2HZ5jQHrXoVoHcNHdBU5ejJljcBl+VTLoYXR6FidjTN86GjO6hyshi6TZFuNvv0dEOgaOFv6Lw==} engines: {node: '>=14.0.0'} peerDependencies: '@types/react': ^17 || ^18 || ^19 @@ -289,8 +354,8 @@ packages: '@types/react': optional: true - '@base-ui/utils@0.2.3': - resolution: {integrity: sha512-/CguQ2PDaOzeVOkllQR8nocJ0FFIDqsWIcURsVmm53QGo8NhFNpePjNlyPIB41luxfOqnG7PU0xicMEw3ls7XQ==} + '@base-ui/utils@0.2.4': + resolution: {integrity: sha512-smZwpMhjO29v+jrZusBSc5T+IJ3vBb9cjIiBjtKcvWmRj9Z4DWGVR3efr1eHR56/bqY5a4qyY9ElkOY5ljo3ng==} peerDependencies: '@types/react': ^17 || ^18 || ^19 react: ^17 || ^18 || ^19 @@ -299,55 +364,55 @@ packages: '@types/react': optional: true - '@biomejs/biome@2.3.11': - resolution: {integrity: sha512-/zt+6qazBWguPG6+eWmiELqO+9jRsMZ/DBU3lfuU2ngtIQYzymocHhKiZRyrbra4aCOoyTg/BmY+6WH5mv9xmQ==} + '@biomejs/biome@2.3.12': + resolution: {integrity: sha512-AR7h4aSlAvXj7TAajW/V12BOw2EiS0AqZWV5dGozf4nlLoUF/ifvD0+YgKSskT0ylA6dY1A8AwgP8kZ6yaCQnA==} engines: {node: '>=14.21.3'} hasBin: true - '@biomejs/cli-darwin-arm64@2.3.11': - resolution: {integrity: sha512-/uXXkBcPKVQY7rc9Ys2CrlirBJYbpESEDme7RKiBD6MmqR2w3j0+ZZXRIL2xiaNPsIMMNhP1YnA+jRRxoOAFrA==} + '@biomejs/cli-darwin-arm64@2.3.12': + resolution: {integrity: sha512-cO6fn+KiMBemva6EARDLQBxeyvLzgidaFRJi8G7OeRqz54kWK0E+uSjgFaiHlc3DZYoa0+1UFE8mDxozpc9ieg==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [darwin] - '@biomejs/cli-darwin-x64@2.3.11': - resolution: {integrity: sha512-fh7nnvbweDPm2xEmFjfmq7zSUiox88plgdHF9OIW4i99WnXrAC3o2P3ag9judoUMv8FCSUnlwJCM1B64nO5Fbg==} + '@biomejs/cli-darwin-x64@2.3.12': + resolution: {integrity: sha512-/fiF/qmudKwSdvmSrSe/gOTkW77mHHkH8Iy7YC2rmpLuk27kbaUOPa7kPiH5l+3lJzTUfU/t6x1OuIq/7SGtxg==} engines: {node: '>=14.21.3'} cpu: [x64] os: [darwin] - '@biomejs/cli-linux-arm64-musl@2.3.11': - resolution: {integrity: sha512-XPSQ+XIPZMLaZ6zveQdwNjbX+QdROEd1zPgMwD47zvHV+tCGB88VH+aynyGxAHdzL+Tm/+DtKST5SECs4iwCLg==} + '@biomejs/cli-linux-arm64-musl@2.3.12': + resolution: {integrity: sha512-aqkeSf7IH+wkzFpKeDVPSXy9uDjxtLpYA6yzkYsY+tVjwFFirSuajHDI3ul8en90XNs1NA0n8kgBrjwRi5JeyA==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [linux] - '@biomejs/cli-linux-arm64@2.3.11': - resolution: {integrity: sha512-l4xkGa9E7Uc0/05qU2lMYfN1H+fzzkHgaJoy98wO+b/7Gl78srbCRRgwYSW+BTLixTBrM6Ede5NSBwt7rd/i6g==} + '@biomejs/cli-linux-arm64@2.3.12': + resolution: {integrity: sha512-nbOsuQROa3DLla5vvsTZg+T5WVPGi9/vYxETm9BOuLHBJN3oWQIg3MIkE2OfL18df1ZtNkqXkH6Yg9mdTPem7A==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [linux] - '@biomejs/cli-linux-x64-musl@2.3.11': - resolution: {integrity: sha512-vU7a8wLs5C9yJ4CB8a44r12aXYb8yYgBn+WeyzbMjaCMklzCv1oXr8x+VEyWodgJt9bDmhiaW/I0RHbn7rsNmw==} + '@biomejs/cli-linux-x64-musl@2.3.12': + resolution: {integrity: sha512-kVGWtupRRsOjvw47YFkk5mLiAdpCPMWBo1jOwAzh+juDpUb2sWarIp+iq+CPL1Wt0LLZnYtP7hH5kD6fskcxmg==} engines: {node: '>=14.21.3'} cpu: [x64] os: [linux] - '@biomejs/cli-linux-x64@2.3.11': - resolution: {integrity: sha512-/1s9V/H3cSe0r0Mv/Z8JryF5x9ywRxywomqZVLHAoa/uN0eY7F8gEngWKNS5vbbN/BsfpCG5yeBT5ENh50Frxg==} + '@biomejs/cli-linux-x64@2.3.12': + resolution: {integrity: sha512-CQtqrJ+qEEI8tgRSTjjzk6wJAwfH3wQlkIGsM5dlecfRZaoT+XCms/mf7G4kWNexrke6mnkRzNy6w8ebV177ow==} engines: {node: '>=14.21.3'} cpu: [x64] os: [linux] - '@biomejs/cli-win32-arm64@2.3.11': - resolution: {integrity: sha512-PZQ6ElCOnkYapSsysiTy0+fYX+agXPlWugh6+eQ6uPKI3vKAqNp6TnMhoM3oY2NltSB89hz59o8xIfOdyhi9Iw==} + '@biomejs/cli-win32-arm64@2.3.12': + resolution: {integrity: sha512-Re4I7UnOoyE4kHMqpgtG6UvSBGBbbtvsOvBROgCCoH7EgANN6plSQhvo2W7OCITvTp7gD6oZOyZy72lUdXjqZg==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [win32] - '@biomejs/cli-win32-x64@2.3.11': - resolution: {integrity: sha512-43VrG813EW+b5+YbDbz31uUsheX+qFKCpXeY9kfdAx+ww3naKxeVkTD9zLIWxUPfJquANMHrmW3wbe/037G0Qg==} + '@biomejs/cli-win32-x64@2.3.12': + resolution: {integrity: sha512-qqGVWqNNek0KikwPZlOIoxtXgsNGsX+rgdEzgw82Re8nF02W+E2WokaQhpF5TdBh/D/RQ3TLppH+otp6ztN0lw==} engines: {node: '>=14.21.3'} cpu: [x64] os: [win32] @@ -355,8 +420,8 @@ packages: '@canvas/image-data@1.1.0': resolution: {integrity: sha512-QdObRRjRbcXGmM1tmJ+MrHcaz1MftF2+W7YI+MsphnsCrmtyfS0d5qJbk0MeSbUeyM/jCb0hmnkXPsy026L7dA==} - '@coinbase/cdp-sdk@1.43.0': - resolution: {integrity: sha512-Fre1tvoIi4HAoC8/PgBoLsuZ9mt7K0R50EEC6i+6FaipW7oO3MABCx+vGAcM7EpcbVa7E6hTFe2/a0UdoajvYQ==} + '@coinbase/cdp-sdk@1.43.1': + resolution: {integrity: sha512-3eXP24p5q68agRgu8grGlF+ASidf3xYSDQtdRuDOFCMZafbqANsjl/JxLwYDmUenRodhxBBJgYJ65nOALP58tA==} '@csstools/color-helpers@5.1.0': resolution: {integrity: sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==} @@ -390,15 +455,15 @@ packages: resolution: {integrity: sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==} engines: {node: '>=18'} - '@effect-atom/atom-react@0.4.4': - resolution: {integrity: sha512-EWT9WpB67GNCecxQXJdAZNVMhuk3VxpdDfojxg1wOgWmR5TPaGiXA74Jqa2Y9AEjSB0hMMAk7RNve2CoIikg2w==} + '@effect-atom/atom-react@0.4.6': + resolution: {integrity: sha512-ZvncuSQsCcUrsddD00JcKDMraPge0AiDMGiJqKc7ProvagCVrxB+Emy5uHM0l0SLGUx4X56bFE0d1tp9Z/Bf+g==} peerDependencies: effect: ^3.19 react: '>=18 <20' scheduler: '*' - '@effect-atom/atom@0.4.11': - resolution: {integrity: sha512-bahWNw2xQ349HXkqshpls/t4wUu5fbMfjT6/7FhDj1uPjP9BArUAwL1Js5b7EG0ZPonS+G1O9LftpxVWAxr86g==} + '@effect-atom/atom@0.4.13': + resolution: {integrity: sha512-wYCPDg/vN2IWTqxho7kTTSivh//V2TSAcdkQvLXMJWww8YzhcCGmCiDpT6cefyNXvHj+qZrqYB54mrUqG6EYCA==} peerDependencies: '@effect/experimental': ^0.57.0 '@effect/platform': ^0.93.0 @@ -427,32 +492,32 @@ packages: lmdb: optional: true - '@effect/language-service@0.64.1': - resolution: {integrity: sha512-1S7Xr2t9mygR6QyiIdCQUvPwSvcf5EBpnWmKa/8rC4P0btFfw/RiWRI8bvFI2AW+U4KStMUHYxPu4QEsk4y8bg==} + '@effect/language-service@0.72.0': + resolution: {integrity: sha512-MWkyTPCXSs5Q3OIBWR3q24SA+ipkdWW7EBJBt6EPUzlzZxjJLXtLBhXpMoCFheSEM0FTWOHT4BRLh5lufsmjVw==} hasBin: true - '@effect/platform-node-shared@0.57.0': - resolution: {integrity: sha512-QXuvmLNlABCQLcTl+lN1YPhKosR6KqArPYjC2reU0fb5lroCo3YRb/aGpXIgLthHzQL8cLU5XMGA3Cu5hKY2Tw==} + '@effect/platform-node-shared@0.57.1': + resolution: {integrity: sha512-oX/bApMdoKsyrDiNdJxo7U9Rz1RXsjRv+ecfAPp1qGlSdGIo32wVRvJ2XCHqYj0sqaYJS0pU0/GCulRfVGuJag==} peerDependencies: - '@effect/cluster': ^0.56.0 - '@effect/platform': ^0.94.0 + '@effect/cluster': ^0.56.1 + '@effect/platform': ^0.94.2 '@effect/rpc': ^0.73.0 '@effect/sql': ^0.49.0 - effect: ^3.19.13 + effect: ^3.19.15 - '@effect/platform-node@0.104.0': - resolution: {integrity: sha512-2ZkUDDTxLD95ARdYIKBx4tdIIgqA3cwb3jlnVVBxmHUf0Pg5N2HdMuD0Q+CXQ7Q94FDwnLW3ZvaSfxDh6FvrNw==} + '@effect/platform-node@0.104.1': + resolution: {integrity: sha512-jT1a/z98niK6fnEU8pWHPPCdJMVDRCIdB65lolcOjse5rsTwVbczMjvKkhVQpF63mNWoOnol7OTRNkw5L54llg==} peerDependencies: - '@effect/cluster': ^0.56.0 - '@effect/platform': ^0.94.0 + '@effect/cluster': ^0.56.1 + '@effect/platform': ^0.94.2 '@effect/rpc': ^0.73.0 '@effect/sql': ^0.49.0 - effect: ^3.19.13 + effect: ^3.19.15 - '@effect/platform@0.94.1': - resolution: {integrity: sha512-SlL8OMTogHmMNnFLnPAHHo3ua1yrB1LNQOVQMiZsqYu9g3216xjr0gn5WoDgCxUyOdZcseegMjWJ7dhm/2vnfg==} + '@effect/platform@0.94.2': + resolution: {integrity: sha512-85vdwpnK4oH/rJ3EuX/Gi2Hkt+K4HvXWr9bxCuqvty9hxyEcRxkJcqTesYrcVoQB6aULb1Za2B0MKoTbvffB3Q==} peerDependencies: - effect: ^3.19.14 + effect: ^3.19.15 '@effect/rpc@0.73.0': resolution: {integrity: sha512-iMPf6tTriz8sK0l5x4koFId8Hz5nFptHYg8WqyjHGIIVLTpZxuiSqhmXZG7FnAs5N2n6uCEws4wWGcIgXNUrFg==} @@ -890,129 +955,132 @@ packages: '@noble/secp256k1@1.7.1': resolution: {integrity: sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw==} - '@parcel/watcher-android-arm64@2.5.1': - resolution: {integrity: sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==} + '@parcel/watcher-android-arm64@2.5.6': + resolution: {integrity: sha512-YQxSS34tPF/6ZG7r/Ih9xy+kP/WwediEUsqmtf0cuCV5TPPKw/PQHRhueUo6JdeFJaqV3pyjm0GdYjZotbRt/A==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [android] - '@parcel/watcher-darwin-arm64@2.5.1': - resolution: {integrity: sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==} + '@parcel/watcher-darwin-arm64@2.5.6': + resolution: {integrity: sha512-Z2ZdrnwyXvvvdtRHLmM4knydIdU9adO3D4n/0cVipF3rRiwP+3/sfzpAwA/qKFL6i1ModaabkU7IbpeMBgiVEA==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [darwin] - '@parcel/watcher-darwin-x64@2.5.1': - resolution: {integrity: sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==} + '@parcel/watcher-darwin-x64@2.5.6': + resolution: {integrity: sha512-HgvOf3W9dhithcwOWX9uDZyn1lW9R+7tPZ4sug+NGrGIo4Rk1hAXLEbcH1TQSqxts0NYXXlOWqVpvS1SFS4fRg==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [darwin] - '@parcel/watcher-freebsd-x64@2.5.1': - resolution: {integrity: sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==} + '@parcel/watcher-freebsd-x64@2.5.6': + resolution: {integrity: sha512-vJVi8yd/qzJxEKHkeemh7w3YAn6RJCtYlE4HPMoVnCpIXEzSrxErBW5SJBgKLbXU3WdIpkjBTeUNtyBVn8TRng==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [freebsd] - '@parcel/watcher-linux-arm-glibc@2.5.1': - resolution: {integrity: sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==} + '@parcel/watcher-linux-arm-glibc@2.5.6': + resolution: {integrity: sha512-9JiYfB6h6BgV50CCfasfLf/uvOcJskMSwcdH1PHH9rvS1IrNy8zad6IUVPVUfmXr+u+Km9IxcfMLzgdOudz9EQ==} engines: {node: '>= 10.0.0'} cpu: [arm] os: [linux] - '@parcel/watcher-linux-arm-musl@2.5.1': - resolution: {integrity: sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==} + '@parcel/watcher-linux-arm-musl@2.5.6': + resolution: {integrity: sha512-Ve3gUCG57nuUUSyjBq/MAM0CzArtuIOxsBdQ+ftz6ho8n7s1i9E1Nmk/xmP323r2YL0SONs1EuwqBp2u1k5fxg==} engines: {node: '>= 10.0.0'} cpu: [arm] os: [linux] - '@parcel/watcher-linux-arm64-glibc@2.5.1': - resolution: {integrity: sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==} + '@parcel/watcher-linux-arm64-glibc@2.5.6': + resolution: {integrity: sha512-f2g/DT3NhGPdBmMWYoxixqYr3v/UXcmLOYy16Bx0TM20Tchduwr4EaCbmxh1321TABqPGDpS8D/ggOTaljijOA==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [linux] - '@parcel/watcher-linux-arm64-musl@2.5.1': - resolution: {integrity: sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==} + '@parcel/watcher-linux-arm64-musl@2.5.6': + resolution: {integrity: sha512-qb6naMDGlbCwdhLj6hgoVKJl2odL34z2sqkC7Z6kzir8b5W65WYDpLB6R06KabvZdgoHI/zxke4b3zR0wAbDTA==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [linux] - '@parcel/watcher-linux-x64-glibc@2.5.1': - resolution: {integrity: sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==} + '@parcel/watcher-linux-x64-glibc@2.5.6': + resolution: {integrity: sha512-kbT5wvNQlx7NaGjzPFu8nVIW1rWqV780O7ZtkjuWaPUgpv2NMFpjYERVi0UYj1msZNyCzGlaCWEtzc+exjMGbQ==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [linux] - '@parcel/watcher-linux-x64-musl@2.5.1': - resolution: {integrity: sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==} + '@parcel/watcher-linux-x64-musl@2.5.6': + resolution: {integrity: sha512-1JRFeC+h7RdXwldHzTsmdtYR/Ku8SylLgTU/reMuqdVD7CtLwf0VR1FqeprZ0eHQkO0vqsbvFLXUmYm/uNKJBg==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [linux] - '@parcel/watcher-win32-arm64@2.5.1': - resolution: {integrity: sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==} + '@parcel/watcher-win32-arm64@2.5.6': + resolution: {integrity: sha512-3ukyebjc6eGlw9yRt678DxVF7rjXatWiHvTXqphZLvo7aC5NdEgFufVwjFfY51ijYEWpXbqF5jtrK275z52D4Q==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [win32] - '@parcel/watcher-win32-ia32@2.5.1': - resolution: {integrity: sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==} + '@parcel/watcher-win32-ia32@2.5.6': + resolution: {integrity: sha512-k35yLp1ZMwwee3Ez/pxBi5cf4AoBKYXj00CZ80jUz5h8prpiaQsiRPKQMxoLstNuqe2vR4RNPEAEcjEFzhEz/g==} engines: {node: '>= 10.0.0'} cpu: [ia32] os: [win32] - '@parcel/watcher-win32-x64@2.5.1': - resolution: {integrity: sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==} + '@parcel/watcher-win32-x64@2.5.6': + resolution: {integrity: sha512-hbQlYcCq5dlAX9Qx+kFb0FHue6vbjlf0FrNzSKdYK2APUf7tGfGxQCk2ihEREmbR6ZMc0MVAD5RIX/41gpUzTw==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [win32] - '@parcel/watcher@2.5.1': - resolution: {integrity: sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==} + '@parcel/watcher@2.5.6': + resolution: {integrity: sha512-tmmZ3lQxAe/k/+rNnXQRawJ4NjxO2hqiOLTHvWchtGZULp4RyFeh6aU4XdOYBFe2KE1oShQTv4AblOs2iOrNnQ==} engines: {node: '>= 10.0.0'} '@phosphor-icons/webcomponents@2.1.5': resolution: {integrity: sha512-JcvQkZxvcX2jK+QCclm8+e8HXqtdFW9xV4/kk2aL9Y3dJA2oQVt+pzbv1orkumz3rfx4K9mn9fDoMr1He1yr7Q==} + '@polka/url@1.0.0-next.29': + resolution: {integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==} + '@quansync/fs@1.0.0': resolution: {integrity: sha512-4TJ3DFtlf1L5LDMaM6CanJ/0lckGNtJcMjQ1NAV6zDmA0tEHKZtxNKin8EgPaVX1YzljbxckyT2tJrpQKAtngQ==} - '@reown/appkit-adapter-wagmi@1.8.16': - resolution: {integrity: sha512-9dMjmhpaTZU2xiM4Lq+K6s8AxMoaHT2iOh6P0A8g8p3ed2optK5qXwoVbibRa3kMwVvI5V5ERvJjeZLgwqqOHQ==} + '@reown/appkit-adapter-wagmi@1.8.17': + resolution: {integrity: sha512-yQo0o6AZqx/D6uHzQL85sxcH6dnReiWXLIvlo5VMi9ZwcBvRvz+rgihGOLEgI7/X3CJnaYO/mSedtJLaJOBVxA==} peerDependencies: '@wagmi/core': '>=2.21.2' - viem: '>=2.37.9' - wagmi: '>=2.17.5' + viem: '>=2.44.2' + wagmi: '>=2.19.5' - '@reown/appkit-common@1.8.16': - resolution: {integrity: sha512-og7EkTEI+mxTEEK3cRoX2PJqgij/5t9CJeN/2dnOef8mEiNh0vAPmdzZPXw9v4oVeBsu14jb8n/Y7vIbTOwl6Q==} + '@reown/appkit-common@1.8.17': + resolution: {integrity: sha512-sccDeSyzP+Bttyp63Wir8Ark/BPi+eenw8/SY2KFkmKh4D/s3MLVTQMLi+zxZYQG2eFlOF1LcGJf2uYFvTXcgA==} - '@reown/appkit-controllers@1.8.16': - resolution: {integrity: sha512-GzhC+/AAYoyLYs/jJd7/D/tv7WCoB4wfv6VkpYcS+3NjL1orGqYnPIXiieiDEGwbfM8h08lmlCsEwOrEoIrchA==} + '@reown/appkit-controllers@1.8.17': + resolution: {integrity: sha512-cUZitQRj/jmFKMxWoPnLPT2ki2SAyYMp4xSmPRKu6XO/OGKSbGa3qKkghDBJ+dJJSDXDywn6Vs98RG0o+V48UA==} - '@reown/appkit-pay@1.8.16': - resolution: {integrity: sha512-V5M9SZnV00ogMeuQDwd0xY6Fa4+yU9NhmWISt0iiAGpNNtKdF+NWybWFbi2GkGjg4IvlJJBBgBlIZtmlZRq8SQ==} + '@reown/appkit-pay@1.8.17': + resolution: {integrity: sha512-+8XEysiNQqB4SVkCHCcoS2raUVPRMGbNMERTbbJLWY7mA/XzaX0PPSGoRm1omqQH5oUYhNwYFnHyEsM8K2t5KA==} - '@reown/appkit-polyfills@1.8.16': - resolution: {integrity: sha512-6ArFDoIbI/DHHCdOCSnh7THP4OvhG5XKKgXbCKSNOuj3/RPl3OmmoFJwwf+LvZJ4ggaz7I6qoXFHf8fEEx1FcQ==} + '@reown/appkit-polyfills@1.8.17': + resolution: {integrity: sha512-m46ybIDewkGN+1V+po4+OfxnMkzmBOOch58k8Xo0RuWzfAvDZp7XvXClJvdX4kHpW3Olsq1EgRJYoaW5zCDetQ==} - '@reown/appkit-scaffold-ui@1.8.16': - resolution: {integrity: sha512-OzTtxwLkE2RcJh4ai87DpXz1zM7twZOpFA6OKWVXPCe2BASLzXWtKmpW8XA6gpA54oEmG4PtoBW9ogv/Qd2e8Q==} + '@reown/appkit-scaffold-ui@1.8.17': + resolution: {integrity: sha512-+P+G1uo5k6psLp/U/JFijPRSgw6duECrvIVYS820+RcZvUg7qPa7Pq22sPfqp09oCXnzqO43ac1quM+paklZBA==} - '@reown/appkit-ui@1.8.16': - resolution: {integrity: sha512-yd9BtyRUk6zAVQcc8W2t5qqXVHJUweiZ7y/tIeuaGDuG8zRWlWQTX6Q2ivBeLI2fZNix7Or90IpnlcdaOCo2Lw==} + '@reown/appkit-ui@1.8.17': + resolution: {integrity: sha512-F8rcebyN0GQaUIKwpzziS0sFb4IARPVHZiRHugFkXAgZRop9LgvJ/4VvT70UJQCrwTbdZNVjmscR2tk98s1eDA==} - '@reown/appkit-utils@1.8.16': - resolution: {integrity: sha512-tCi2ZEOoOIGiddRAy9lJ1jnYj0zMnqEojIk095sWvnMdlNfn/lZdsLt62AGqk5khnlsyg2Zo0vszPBcXLH8/ww==} + '@reown/appkit-utils@1.8.17': + resolution: {integrity: sha512-Gmi5EjqB0VpvjMQSTsBcM9me+yADQap1OC8Hxhz353hgwti2PKDmmh0qQDUnKr1RMDljD6AHrqOd7U5hTPUi2g==} peerDependencies: valtio: 2.1.7 - '@reown/appkit-wallet@1.8.16': - resolution: {integrity: sha512-UARNgRtzTVojDv2wgILy7RKiYAXpFX9UE7qkficV4oB+IQX7yCPpa0eXN2mDXZBVSz2hSu4rLTa7WNXzZPal/A==} + '@reown/appkit-wallet@1.8.17': + resolution: {integrity: sha512-khuQqHGtCyKSTUlcCnB1Evy1ZLmrU5cUXjP6/zrFYW3m+THnNfr+w6Tp49OfnW1wYsoe53GHzlgTuGASwXYloQ==} - '@reown/appkit@1.8.16': - resolution: {integrity: sha512-EleChIVOXa8qylNCcllByP+AYIoktDmPGfavi3Fn4eWWXoc4wlfL58NEiETbCyi1ZgUtaZUfIUiMvwgjJ4+mwQ==} + '@reown/appkit@1.8.17': + resolution: {integrity: sha512-svov4ShvEi4YboVe+kXT8xGQvDrYsgQBrBmccOel9nT7/lOEDUimFu5Irna8g/8Zji9/XbRrYi49cLPJrzd45Q==} '@rolldown/pluginutils@1.0.0-beta.53': resolution: {integrity: sha512-vENRlFU4YbrwVqNDZ7fLvy+JR1CRkyr01jhSiDpE1u6py3OMzQfztQU2jxykW3ALNxO4kSlqIDeYyD0Y9RcQeQ==} @@ -1035,128 +1103,128 @@ packages: rollup: optional: true - '@rollup/rollup-android-arm-eabi@4.55.1': - resolution: {integrity: sha512-9R0DM/ykwfGIlNu6+2U09ga0WXeZ9MRC2Ter8jnz8415VbuIykVuc6bhdrbORFZANDmTDvq26mJrEVTl8TdnDg==} + '@rollup/rollup-android-arm-eabi@4.56.0': + resolution: {integrity: sha512-LNKIPA5k8PF1+jAFomGe3qN3bbIgJe/IlpDBwuVjrDKrJhVWywgnJvflMt/zkbVNLFtF1+94SljYQS6e99klnw==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.55.1': - resolution: {integrity: sha512-eFZCb1YUqhTysgW3sj/55du5cG57S7UTNtdMjCW7LwVcj3dTTcowCsC8p7uBdzKsZYa8J7IDE8lhMI+HX1vQvg==} + '@rollup/rollup-android-arm64@4.56.0': + resolution: {integrity: sha512-lfbVUbelYqXlYiU/HApNMJzT1E87UPGvzveGg2h0ktUNlOCxKlWuJ9jtfvs1sKHdwU4fzY7Pl8sAl49/XaEk6Q==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.55.1': - resolution: {integrity: sha512-p3grE2PHcQm2e8PSGZdzIhCKbMCw/xi9XvMPErPhwO17vxtvCN5FEA2mSLgmKlCjHGMQTP6phuQTYWUnKewwGg==} + '@rollup/rollup-darwin-arm64@4.56.0': + resolution: {integrity: sha512-EgxD1ocWfhoD6xSOeEEwyE7tDvwTgZc8Bss7wCWe+uc7wO8G34HHCUH+Q6cHqJubxIAnQzAsyUsClt0yFLu06w==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.55.1': - resolution: {integrity: sha512-rDUjG25C9qoTm+e02Esi+aqTKSBYwVTaoS1wxcN47/Luqef57Vgp96xNANwt5npq9GDxsH7kXxNkJVEsWEOEaQ==} + '@rollup/rollup-darwin-x64@4.56.0': + resolution: {integrity: sha512-1vXe1vcMOssb/hOF8iv52A7feWW2xnu+c8BV4t1F//m9QVLTfNVpEdja5ia762j/UEJe2Z1jAmEqZAK42tVW3g==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.55.1': - resolution: {integrity: sha512-+JiU7Jbp5cdxekIgdte0jfcu5oqw4GCKr6i3PJTlXTCU5H5Fvtkpbs4XJHRmWNXF+hKmn4v7ogI5OQPaupJgOg==} + '@rollup/rollup-freebsd-arm64@4.56.0': + resolution: {integrity: sha512-bof7fbIlvqsyv/DtaXSck4VYQ9lPtoWNFCB/JY4snlFuJREXfZnm+Ej6yaCHfQvofJDXLDMTVxWscVSuQvVWUQ==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.55.1': - resolution: {integrity: sha512-V5xC1tOVWtLLmr3YUk2f6EJK4qksksOYiz/TCsFHu/R+woubcLWdC9nZQmwjOAbmExBIVKsm1/wKmEy4z4u4Bw==} + '@rollup/rollup-freebsd-x64@4.56.0': + resolution: {integrity: sha512-KNa6lYHloW+7lTEkYGa37fpvPq+NKG/EHKM8+G/g9WDU7ls4sMqbVRV78J6LdNuVaeeK5WB9/9VAFbKxcbXKYg==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.55.1': - resolution: {integrity: sha512-Rn3n+FUk2J5VWx+ywrG/HGPTD9jXNbicRtTM11e/uorplArnXZYsVifnPPqNNP5BsO3roI4n8332ukpY/zN7rQ==} + '@rollup/rollup-linux-arm-gnueabihf@4.56.0': + resolution: {integrity: sha512-E8jKK87uOvLrrLN28jnAAAChNq5LeCd2mGgZF+fGF5D507WlG/Noct3lP/QzQ6MrqJ5BCKNwI9ipADB6jyiq2A==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.55.1': - resolution: {integrity: sha512-grPNWydeKtc1aEdrJDWk4opD7nFtQbMmV7769hiAaYyUKCT1faPRm2av8CX1YJsZ4TLAZcg9gTR1KvEzoLjXkg==} + '@rollup/rollup-linux-arm-musleabihf@4.56.0': + resolution: {integrity: sha512-jQosa5FMYF5Z6prEpTCCmzCXz6eKr/tCBssSmQGEeozA9tkRUty/5Vx06ibaOP9RCrW1Pvb8yp3gvZhHwTDsJw==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.55.1': - resolution: {integrity: sha512-a59mwd1k6x8tXKcUxSyISiquLwB5pX+fJW9TkWU46lCqD/GRDe9uDN31jrMmVP3feI3mhAdvcCClhV8V5MhJFQ==} + '@rollup/rollup-linux-arm64-gnu@4.56.0': + resolution: {integrity: sha512-uQVoKkrC1KGEV6udrdVahASIsaF8h7iLG0U0W+Xn14ucFwi6uS539PsAr24IEF9/FoDtzMeeJXJIBo5RkbNWvQ==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.55.1': - resolution: {integrity: sha512-puS1MEgWX5GsHSoiAsF0TYrpomdvkaXm0CofIMG5uVkP6IBV+ZO9xhC5YEN49nsgYo1DuuMquF9+7EDBVYu4uA==} + '@rollup/rollup-linux-arm64-musl@4.56.0': + resolution: {integrity: sha512-vLZ1yJKLxhQLFKTs42RwTwa6zkGln+bnXc8ueFGMYmBTLfNu58sl5/eXyxRa2RarTkJbXl8TKPgfS6V5ijNqEA==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-loong64-gnu@4.55.1': - resolution: {integrity: sha512-r3Wv40in+lTsULSb6nnoudVbARdOwb2u5fpeoOAZjFLznp6tDU8kd+GTHmJoqZ9lt6/Sys33KdIHUaQihFcu7g==} + '@rollup/rollup-linux-loong64-gnu@4.56.0': + resolution: {integrity: sha512-FWfHOCub564kSE3xJQLLIC/hbKqHSVxy8vY75/YHHzWvbJL7aYJkdgwD/xGfUlL5UV2SB7otapLrcCj2xnF1dg==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-loong64-musl@4.55.1': - resolution: {integrity: sha512-MR8c0+UxAlB22Fq4R+aQSPBayvYa3+9DrwG/i1TKQXFYEaoW3B5b/rkSRIypcZDdWjWnpcvxbNaAJDcSbJU3Lw==} + '@rollup/rollup-linux-loong64-musl@4.56.0': + resolution: {integrity: sha512-z1EkujxIh7nbrKL1lmIpqFTc/sr0u8Uk0zK/qIEFldbt6EDKWFk/pxFq3gYj4Bjn3aa9eEhYRlL3H8ZbPT1xvA==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-ppc64-gnu@4.55.1': - resolution: {integrity: sha512-3KhoECe1BRlSYpMTeVrD4sh2Pw2xgt4jzNSZIIPLFEsnQn9gAnZagW9+VqDqAHgm1Xc77LzJOo2LdigS5qZ+gw==} + '@rollup/rollup-linux-ppc64-gnu@4.56.0': + resolution: {integrity: sha512-iNFTluqgdoQC7AIE8Q34R3AuPrJGJirj5wMUErxj22deOcY7XwZRaqYmB6ZKFHoVGqRcRd0mqO+845jAibKCkw==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-ppc64-musl@4.55.1': - resolution: {integrity: sha512-ziR1OuZx0vdYZZ30vueNZTg73alF59DicYrPViG0NEgDVN8/Jl87zkAPu4u6VjZST2llgEUjaiNl9JM6HH1Vdw==} + '@rollup/rollup-linux-ppc64-musl@4.56.0': + resolution: {integrity: sha512-MtMeFVlD2LIKjp2sE2xM2slq3Zxf9zwVuw0jemsxvh1QOpHSsSzfNOTH9uYW9i1MXFxUSMmLpeVeUzoNOKBaWg==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.55.1': - resolution: {integrity: sha512-uW0Y12ih2XJRERZ4jAfKamTyIHVMPQnTZcQjme2HMVDAHY4amf5u414OqNYC+x+LzRdRcnIG1YodLrrtA8xsxw==} + '@rollup/rollup-linux-riscv64-gnu@4.56.0': + resolution: {integrity: sha512-in+v6wiHdzzVhYKXIk5U74dEZHdKN9KH0Q4ANHOTvyXPG41bajYRsy7a8TPKbYPl34hU7PP7hMVHRvv/5aCSew==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-riscv64-musl@4.55.1': - resolution: {integrity: sha512-u9yZ0jUkOED1BFrqu3BwMQoixvGHGZ+JhJNkNKY/hyoEgOwlqKb62qu+7UjbPSHYjiVy8kKJHvXKv5coH4wDeg==} + '@rollup/rollup-linux-riscv64-musl@4.56.0': + resolution: {integrity: sha512-yni2raKHB8m9NQpI9fPVwN754mn6dHQSbDTwxdr9SE0ks38DTjLMMBjrwvB5+mXrX+C0npX0CVeCUcvvvD8CNQ==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.55.1': - resolution: {integrity: sha512-/0PenBCmqM4ZUd0190j7J0UsQ/1nsi735iPRakO8iPciE7BQ495Y6msPzaOmvx0/pn+eJVVlZrNrSh4WSYLxNg==} + '@rollup/rollup-linux-s390x-gnu@4.56.0': + resolution: {integrity: sha512-zhLLJx9nQPu7wezbxt2ut+CI4YlXi68ndEve16tPc/iwoylWS9B3FxpLS2PkmfYgDQtosah07Mj9E0khc3Y+vQ==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.55.1': - resolution: {integrity: sha512-a8G4wiQxQG2BAvo+gU6XrReRRqj+pLS2NGXKm8io19goR+K8lw269eTrPkSdDTALwMmJp4th2Uh0D8J9bEV1vg==} + '@rollup/rollup-linux-x64-gnu@4.56.0': + resolution: {integrity: sha512-MVC6UDp16ZSH7x4rtuJPAEoE1RwS8N4oK9DLHy3FTEdFoUTCFVzMfJl/BVJ330C+hx8FfprA5Wqx4FhZXkj2Kw==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.55.1': - resolution: {integrity: sha512-bD+zjpFrMpP/hqkfEcnjXWHMw5BIghGisOKPj+2NaNDuVT+8Ds4mPf3XcPHuat1tz89WRL+1wbcxKY3WSbiT7w==} + '@rollup/rollup-linux-x64-musl@4.56.0': + resolution: {integrity: sha512-ZhGH1eA4Qv0lxaV00azCIS1ChedK0V32952Md3FtnxSqZTBTd6tgil4nZT5cU8B+SIw3PFYkvyR4FKo2oyZIHA==} cpu: [x64] os: [linux] - '@rollup/rollup-openbsd-x64@4.55.1': - resolution: {integrity: sha512-eLXw0dOiqE4QmvikfQ6yjgkg/xDM+MdU9YJuP4ySTibXU0oAvnEWXt7UDJmD4UkYialMfOGFPJnIHSe/kdzPxg==} + '@rollup/rollup-openbsd-x64@4.56.0': + resolution: {integrity: sha512-O16XcmyDeFI9879pEcmtWvD/2nyxR9mF7Gs44lf1vGGx8Vg2DRNx11aVXBEqOQhWb92WN4z7fW/q4+2NYzCbBA==} cpu: [x64] os: [openbsd] - '@rollup/rollup-openharmony-arm64@4.55.1': - resolution: {integrity: sha512-xzm44KgEP11te3S2HCSyYf5zIzWmx3n8HDCc7EE59+lTcswEWNpvMLfd9uJvVX8LCg9QWG67Xt75AuHn4vgsXw==} + '@rollup/rollup-openharmony-arm64@4.56.0': + resolution: {integrity: sha512-LhN/Reh+7F3RCgQIRbgw8ZMwUwyqJM+8pXNT6IIJAqm2IdKkzpCh/V9EdgOMBKuebIrzswqy4ATlrDgiOwbRcQ==} cpu: [arm64] os: [openharmony] - '@rollup/rollup-win32-arm64-msvc@4.55.1': - resolution: {integrity: sha512-yR6Bl3tMC/gBok5cz/Qi0xYnVbIxGx5Fcf/ca0eB6/6JwOY+SRUcJfI0OpeTpPls7f194as62thCt/2BjxYN8g==} + '@rollup/rollup-win32-arm64-msvc@4.56.0': + resolution: {integrity: sha512-kbFsOObXp3LBULg1d3JIUQMa9Kv4UitDmpS+k0tinPBz3watcUiV2/LUDMMucA6pZO3WGE27P7DsfaN54l9ing==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.55.1': - resolution: {integrity: sha512-3fZBidchE0eY0oFZBnekYCfg+5wAB0mbpCBuofh5mZuzIU/4jIVkbESmd2dOsFNS78b53CYv3OAtwqkZZmU5nA==} + '@rollup/rollup-win32-ia32-msvc@4.56.0': + resolution: {integrity: sha512-vSSgny54D6P4vf2izbtFm/TcWYedw7f8eBrOiGGecyHyQB9q4Kqentjaj8hToe+995nob/Wv48pDqL5a62EWtg==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-gnu@4.55.1': - resolution: {integrity: sha512-xGGY5pXj69IxKb4yv/POoocPy/qmEGhimy/FoTpTSVju3FYXUQQMFCaZZXJVidsmGxRioZAwpThl/4zX41gRKg==} + '@rollup/rollup-win32-x64-gnu@4.56.0': + resolution: {integrity: sha512-FeCnkPCTHQJFbiGG49KjV5YGW/8b9rrXAM2Mz2kiIoktq2qsJxRD5giEMEOD2lPdgs72upzefaUvS+nc8E3UzQ==} cpu: [x64] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.55.1': - resolution: {integrity: sha512-SPEpaL6DX4rmcXtnhdrQYgzQ5W2uW3SCJch88lB2zImhJRhIIK44fkUrgIV/Q8yUNfw5oyZ5vkeQsZLhCb06lw==} + '@rollup/rollup-win32-x64-msvc@4.56.0': + resolution: {integrity: sha512-H8AE9Ur/t0+1VXujj90w0HrSOuv0Nq9r1vSZF2t5km20NTfosQsGGUXDaKdQZzwuLts7IyL1fYT4hM95TI9c4g==} cpu: [x64] os: [win32] @@ -1189,23 +1257,32 @@ packages: peerDependencies: '@solana/kit': ^5.0 - '@solana/accounts@5.3.0': - resolution: {integrity: sha512-KyK6kBIQgoj4r93HFUnqjrCu+3l6NN3SRkwDHLb5S1iSzHDEtNtSM6l4XgRAPS4jyeY0n4RlHThRuvG5CbbhJw==} + '@solana/accounts@5.4.0': + resolution: {integrity: sha512-qHtAtwCcCFTXcya6JOOG1nzYicivivN/JkcYNHr10qOp9b4MVRkfW1ZAAG1CNzjMe5+mwtEl60RwdsY9jXNb+Q==} engines: {node: '>=20.18.0'} peerDependencies: - typescript: '>=5.9.3' + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true - '@solana/addresses@5.3.0': - resolution: {integrity: sha512-HFrtIpdgkf+2yUT63E6DrYjVu/l4TGy8HDjkCjTHwl7YVoqDasgFADmd9cQ3YVXKrNnvwMLS4pYQsQdgcwXiZw==} + '@solana/addresses@5.4.0': + resolution: {integrity: sha512-YRHiH30S8qDV4bZ+mtEk589PGfBuXHzD/fK2Z+YI5f/+s+yi/5le/fVw7PN6LxnnmVQKiRCDUiNF+WmFFKi6QQ==} engines: {node: '>=20.18.0'} peerDependencies: - typescript: '>=5.9.3' + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true - '@solana/assertions@5.3.0': - resolution: {integrity: sha512-SiZ0pOvNmOa9i7hn7EG4QUnxoq6+YBKmjsIK/9p5VQD0s45WlKp0Xelks4BPDEb+/lmkl8zmoAsOv7sV75mc+g==} + '@solana/assertions@5.4.0': + resolution: {integrity: sha512-8EP7mkdnrPc9y67FqWeAPzdWq2qAOkxsuo+ZBIXNWtIixDtXIdHrgjZ/wqbWxLgSTtXEfBCjpZU55Xw2Qfbwyg==} engines: {node: '>=20.18.0'} peerDependencies: - typescript: '>=5.9.3' + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true '@solana/buffer-layout@4.0.1': resolution: {integrity: sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA==} @@ -1217,17 +1294,23 @@ packages: peerDependencies: typescript: '>=5.3.3' - '@solana/codecs-core@5.3.0': - resolution: {integrity: sha512-wqpiKtej8GePdraHk3YnoJY1N/Hutn4w0CD/45hNKiXPG5F3mlasaBWq8m86K7WUdjQVAsGTgiSgoZo64Aw17w==} + '@solana/codecs-core@5.4.0': + resolution: {integrity: sha512-rQ5jXgiDe2vIU+mYCHDjgwMd9WdzZfh4sc5H6JgYleAUjeTUX6mx8hTV2+pcXvvn27LPrgrt9jfxswbDb8O8ww==} engines: {node: '>=20.18.0'} peerDependencies: - typescript: '>=5.9.3' + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true - '@solana/codecs-data-structures@5.3.0': - resolution: {integrity: sha512-MdJTYdBF0OwyMuZOTrccHtfl1Sfcp1/l/7AQjxqOWk+Enbg2Kkx8OP8eKqVipdqvYdk9LcC132fXfyemWdB88g==} + '@solana/codecs-data-structures@5.4.0': + resolution: {integrity: sha512-LVssbdQ1GfY6upnxW3mufYsNfvTWKnHNk5Hx2gHuOYJhm3HZlp+Y8zvuoY65G1d1xAXkPz5YVGxaSeVIRWLGWg==} engines: {node: '>=20.18.0'} peerDependencies: - typescript: '>=5.9.3' + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true '@solana/codecs-numbers@2.3.0': resolution: {integrity: sha512-jFvvwKJKffvG7Iz9dmN51OGB7JBcy2CJ6Xf3NqD/VP90xak66m/Lg48T01u5IQ/hc15mChVHiBm+HHuOFDUrQg==} @@ -1235,27 +1318,35 @@ packages: peerDependencies: typescript: '>=5.3.3' - '@solana/codecs-numbers@5.3.0': - resolution: {integrity: sha512-NLsRSKpRzGT5h5UL4jEShE5C49S2E/oM3YAltdbsFyxuTKo0u4JA+GzBLD1UxEG5177WMY/wtVVTe5qWCDdyzA==} + '@solana/codecs-numbers@5.4.0': + resolution: {integrity: sha512-z6LMkY+kXWx1alrvIDSAxexY5QLhsso638CjM7XI1u6dB7drTLWKhifyjnm1vOQc1VPVFmbYxTgKKpds8TY8tg==} engines: {node: '>=20.18.0'} peerDependencies: - typescript: '>=5.9.3' + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true - '@solana/codecs-strings@5.3.0': - resolution: {integrity: sha512-hnTYlxGCcQcqZr0lHqSW/dbEWAnH+4Ery+FSv9Rd2fEI/qcDxA5by0IxDIm+imFGLsnXZwLSnYBuF57YOoMzhQ==} + '@solana/codecs-strings@5.4.0': + resolution: {integrity: sha512-w0trrjfQDhkCVz7O1GTmHBk9m+MkljKx2uNBbQAD3/yW2Qn9dYiTrZ1/jDVq0/+lPPAUkbT3s3Yo7HUZ2QFmHw==} engines: {node: '>=20.18.0'} peerDependencies: fastestsmallesttextencoderdecoder: ^1.0.22 - typescript: '>=5.9.3' + typescript: ^5.0.0 peerDependenciesMeta: fastestsmallesttextencoderdecoder: optional: true + typescript: + optional: true - '@solana/codecs@5.3.0': - resolution: {integrity: sha512-zuBpLSMBoZzWNCNNNMTKJSk9OAqkV4SYO+g4zuz/RTiMHu3B1j0KfSJ0S4k/Aa0YBgK/Ukc0GxsT8QE+GB3Snw==} + '@solana/codecs@5.4.0': + resolution: {integrity: sha512-IbDCUvNX0MrkQahxiXj9rHzkd/fYfp1F2nTJkHGH8v+vPfD+YPjl007ZBM38EnCeXj/Xn+hxqBBivPvIHP29dA==} engines: {node: '>=20.18.0'} peerDependencies: - typescript: '>=5.9.3' + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true '@solana/errors@2.3.0': resolution: {integrity: sha512-66RI9MAbwYV0UtP7kGcTBVLxJgUxoZGm8Fbc0ah+lGiAw17Gugco6+9GrJCV83VyF2mDWyYnYM9qdI3yjgpnaQ==} @@ -1264,192 +1355,285 @@ packages: peerDependencies: typescript: '>=5.3.3' - '@solana/errors@5.3.0': - resolution: {integrity: sha512-oeTwCQG4JBNI6dd1XxA04sX18HPiiWts10FokXrdjaMH2sCJRxecpUTzCvCsPlb8FAVswRu1bi4HuN9uVHTBNQ==} + '@solana/errors@5.4.0': + resolution: {integrity: sha512-hNoAOmlZAszaVBrAy1Jf7amHJ8wnUnTU0BqhNQXknbSvirvsYr81yEud2iq18YiCqhyJ9SuQ5kWrSAT0x7S0oA==} engines: {node: '>=20.18.0'} hasBin: true peerDependencies: - typescript: '>=5.9.3' + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true - '@solana/fast-stable-stringify@5.3.0': - resolution: {integrity: sha512-wyTp8j9wFfFj+1QxUBBC0aZTm84FDdnJZ/Lr4Nhk/2qiQRP1RwMaDCo3ubdkRox+RoNtVdeHrvMBer7U1fyhJA==} + '@solana/fast-stable-stringify@5.4.0': + resolution: {integrity: sha512-KB7PUL7yalPvbWCezzyUDVRDp39eHLPH7OJ6S8VFT8YNIFUANwwj5ctui50Fim76kvSYDdYJOclXV45O2gfQ8Q==} engines: {node: '>=20.18.0'} peerDependencies: - typescript: '>=5.9.3' + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true - '@solana/functional@5.3.0': - resolution: {integrity: sha512-f/oONHHBxaKjCvCXp1waZEUsdnAiQYtX1iDejKp9iNW6YG5v5PxTHzf+EMxBXeyV2UhSjO8V3wjBMPFqgqzRZQ==} + '@solana/functional@5.4.0': + resolution: {integrity: sha512-32ghHO0bg6GgX/7++0/7Lps6RgeXD2gKF1okiuyEGuVfKENIapgaQdcGhUwb3q6D6fv6MRAVn/Yve4jopGVNMQ==} engines: {node: '>=20.18.0'} peerDependencies: - typescript: '>=5.9.3' + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true - '@solana/instruction-plans@5.3.0': - resolution: {integrity: sha512-wC+SFPc5izs0ZoPmJ4lyAZzV2Ieyj5OWQGZgRjETHkz3vBYI5K/3pwA/3T40OwMX4D8YfXAIy9qq0ExROuUmqg==} + '@solana/instruction-plans@5.4.0': + resolution: {integrity: sha512-5xbJ+I/pP2aWECmK75bEM1zCnIITlohAK83dVN+t5X2vBFrr6M9gifo8r4Opdnibsgo6QVVkKPxRo5zow5j0ig==} engines: {node: '>=20.18.0'} peerDependencies: - typescript: '>=5.9.3' + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true - '@solana/instructions@5.3.0': - resolution: {integrity: sha512-jYA+fdi9h3wF/CQLoa6LooXAsvBriyc51ySXzXDDC/0aIzT9hUo9gMvqIxmTRQSTmy9O7ay2tfPYeAopaFfubg==} + '@solana/instructions@5.4.0': + resolution: {integrity: sha512-//a7jpHbNoAgTqy3YyqG1X6QhItJLKzJa6zuYJGCwaAAJye7BxS9pxJBgb2mUt7CGidhUksf+U8pmLlxCNWYyg==} engines: {node: '>=20.18.0'} peerDependencies: - typescript: '>=5.9.3' + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true - '@solana/keys@5.3.0': - resolution: {integrity: sha512-0F1eMibq2OIXIozFrrDxJtXJoo9ef1JUCFjQ4FkhRAoXYWLPczAFHNLq/YUORvKDOBwoS0q1DfvY5FjqPhlDSQ==} + '@solana/keys@5.4.0': + resolution: {integrity: sha512-zQVbAwdoXorgXjlhlVTZaymFG6N8n1zn2NT+xI6S8HtbrKIB/42xPdXFh+zIihGzRw+9k8jzU7Axki/IPm6qWQ==} engines: {node: '>=20.18.0'} peerDependencies: - typescript: '>=5.9.3' + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true - '@solana/kit@5.3.0': - resolution: {integrity: sha512-5QoEZCnEz4VCzgbXhEOaU2Hg9Rug3w43iNkLg0wUaGkqKTVasAJ1Sd5l5SpPjGEGc70vNVnrFNb7e9GTmRFeXg==} + '@solana/kit@5.4.0': + resolution: {integrity: sha512-aVjN26jOEzJA6UBYxSTQciZPXgTxWnO/WysHrw+yeBL/5AaTZnXEgb4j5xV6cUFzOlVxhJBrx51xtoxSqJ0u3g==} engines: {node: '>=20.18.0'} peerDependencies: - typescript: '>=5.9.3' + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true - '@solana/nominal-types@5.3.0': - resolution: {integrity: sha512-fuPBOM/zZNTNqMPu2LYtdA47OQ2A/IwziEUOXyW3+tO3Qluzh0fKQ/xqOtbl1HsZd7Inip1N062xbltr3DwD+A==} + '@solana/nominal-types@5.4.0': + resolution: {integrity: sha512-h4dTRQwTerzksE5B1WmObN6TvLo8dYUd7kpUUynGd8WJjK0zz3zkDhq0MkA3aF6A1C2C82BSGqSsN9EN0E6Exg==} engines: {node: '>=20.18.0'} peerDependencies: - typescript: '>=5.9.3' + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true - '@solana/offchain-messages@5.3.0': - resolution: {integrity: sha512-jdb5XvIBRsdBLu4aemXVWmZc8jkI6nXYayHE/S5Yq5W4hBcqxJvdENxh0MZYCPVo5x+8NwtS3Yug3vGoERGIzA==} + '@solana/offchain-messages@5.4.0': + resolution: {integrity: sha512-DjdlYJCcKfgh4dkdk+owH1bP+Q4BRqCs55mgWWp9PTwm/HHy/a5vcMtCi1GyIQXfhtNNvKBLbXrUE0Fxej8qlg==} engines: {node: '>=20.18.0'} peerDependencies: - typescript: '>=5.9.3' + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true - '@solana/options@5.3.0': - resolution: {integrity: sha512-vByKXs7jgEvyHGkj30sskxHhfXAzVZC/vDoW8EyJW+95VeydGJXoxgfzLgnDlEeFt66d8i/+wxiD/8napMdgZg==} + '@solana/options@5.4.0': + resolution: {integrity: sha512-h4vTWRChEXPhaHo9i1pCyQBWWs+NqYPQRXSAApqpUYvHb9Kct/C6KbHjfyaRMyqNQnDHLcJCX7oW9tk0iRDzIg==} engines: {node: '>=20.18.0'} peerDependencies: - typescript: '>=5.9.3' + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true - '@solana/plugin-core@5.3.0': - resolution: {integrity: sha512-UKIeW2gxLY9z9bzSJYAzRS/JG4I7D6y8cBBo1QUHNOUEDI1Fd4+pK3neLgw+VQKttzJgA184KFwyCO16m8wd/w==} + '@solana/plugin-core@5.4.0': + resolution: {integrity: sha512-e1aLGLldW7C5113qTOjFYSGq95a4QC9TWb77iq+8l6h085DcNj+195r4E2zKaINrevQjQTwvxo00oUyHP7hSJA==} engines: {node: '>=20.18.0'} peerDependencies: - typescript: '>=5.3.3' + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true - '@solana/programs@5.3.0': - resolution: {integrity: sha512-GtA3xeUkYMBLDRLRtaodPyJu+Eey0jnpwJnd9/05fofZyinQ09k+a0kaGZ1R829HGBnJTnhq/qGnPN5zqSi0qA==} + '@solana/programs@5.4.0': + resolution: {integrity: sha512-Sc90WK9ZZ7MghOflIvkrIm08JwsFC99yqSJy28/K+hDP2tcx+1x+H6OFP9cumW9eUA1+JVRDeKAhA8ak7e/kUA==} engines: {node: '>=20.18.0'} peerDependencies: - typescript: '>=5.9.3' + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true - '@solana/promises@5.3.0': - resolution: {integrity: sha512-DzFBtUeNOheBvDLHXDPQ5nUGTdwaFYEhA+3vAOs66vC41/kdcWVllDQVj32HOePDoXlxGGczd8VpOt+dzw94MA==} + '@solana/promises@5.4.0': + resolution: {integrity: sha512-23mfgNBbuP6Q+4vsixGy+GkyZ7wBLrxTBNXqrG/XWrJhjuuSkjEUGaK4Fx5o7LIrBi6KGqPknKxmTlvqnJhy2Q==} engines: {node: '>=20.18.0'} peerDependencies: - typescript: '>=5.9.3' + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true - '@solana/rpc-api@5.3.0': - resolution: {integrity: sha512-dBkjKa4scDjcNDq+YQ1xePwinkTMqMm3HcZM9pupfBV8owoqLG9ZcZ6ZXp9/sIEIX+xWxVmW2vj4L/EwtbrC5A==} + '@solana/rpc-api@5.4.0': + resolution: {integrity: sha512-FJL6KaAsQ4DhfhLKKMcqbTpToNFwHlABCemIpOunE3OSqJFDrmc/NbsEaLIoeHyIg3d1Imo49GIUOn2TEouFUA==} engines: {node: '>=20.18.0'} peerDependencies: - typescript: '>=5.9.3' + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true - '@solana/rpc-parsed-types@5.3.0': - resolution: {integrity: sha512-D5lLmgWb3O1WapSypnFWS9eJSklDJs8LDsJbzvwNwXpDAi/6e804NphiYnuWqpd5en8LyRb7E2XoP14F292bbw==} + '@solana/rpc-parsed-types@5.4.0': + resolution: {integrity: sha512-IRQuSzx+Sj1A3XGiIzguNZlMjMMybXTTjV/RnTwBgnJQPd/H4us4pfPD94r+/yolWDVfGjJRm04hnKVMjJU8Rg==} engines: {node: '>=20.18.0'} peerDependencies: - typescript: '>=5.9.3' + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true - '@solana/rpc-spec-types@5.3.0': - resolution: {integrity: sha512-6U7WYnuZ6HTYxyapwvPeam/wNP22uKxVH4afB5hHaYJ5PgNGF4GsZhVOgIO7CwgP2ChNq3F4X1tF/7Ly4xEOQw==} + '@solana/rpc-spec-types@5.4.0': + resolution: {integrity: sha512-JU9hC5/iyJx30ym17gpoXDtT9rCbO6hLpB6UDhSFFoNeirxtTVb4OdnKtsjJDfXAiXsynJRsZRwfj3vGxRLgQw==} engines: {node: '>=20.18.0'} peerDependencies: - typescript: '>=5.9.3' + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true - '@solana/rpc-spec@5.3.0': - resolution: {integrity: sha512-w316DNQXi738wvhQtY38hb9/TRU0KoIJkPh4QrmBPGwb3Gi3fI0GyeLNb7RQ+LciNX8/WSmRfXygxSTFYcD+3A==} + '@solana/rpc-spec@5.4.0': + resolution: {integrity: sha512-XMhxBb1GuZ3Kaeu5WNHB5KteCQ/aVuMByZmUKPqaanD+gs5MQZr0g62CvN7iwRlFU7GC18Q73ROWR3/JjzbXTA==} engines: {node: '>=20.18.0'} peerDependencies: - typescript: '>=5.9.3' + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true - '@solana/rpc-subscriptions-api@5.3.0': - resolution: {integrity: sha512-aNd1LGgsIYtxiStwxvGtcZQUj79UeHX1fPYV9cj/VxyAsmFDiMhsY78/p5F4xLT2JxQUSzLRLLbNFOeYvt6LiQ==} + '@solana/rpc-subscriptions-api@5.4.0': + resolution: {integrity: sha512-euAFIG6ruEsqK+MsrL1tGSMbbOumm8UAyGzlD/kmXsAqqhcVsSeZdv5+BMIHIBsQ93GHcloA8UYw1BTPhpgl9w==} engines: {node: '>=20.18.0'} peerDependencies: - typescript: '>=5.9.3' + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true - '@solana/rpc-subscriptions-channel-websocket@5.3.0': - resolution: {integrity: sha512-l+e7gBFujFyOVztJfQ6uS8mnzDCji+uk/Ff0FbhTPYBuaKNm7LYR0H0WqAugmRbKd7Lc2RoIqR9XnAnN4qbPcQ==} + '@solana/rpc-subscriptions-channel-websocket@5.4.0': + resolution: {integrity: sha512-kWCmlW65MccxqXwKsIz+LkXUYQizgvBrrgYOkyclJHPa+zx4gqJjam87+wzvO9cfbDZRer3wtJBaRm61gTHNbw==} engines: {node: '>=20.18.0'} peerDependencies: - typescript: '>=5.9.3' + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true - '@solana/rpc-subscriptions-spec@5.3.0': - resolution: {integrity: sha512-tkpFBtwjCQhrtvr1oTVn1q1Fgsr258uz6fOiOfkSfpG7i/zCRhU2V+XFdZlli6vh7iFaejHxIKOAykn3a0yjyg==} + '@solana/rpc-subscriptions-spec@5.4.0': + resolution: {integrity: sha512-ELaV9Z39GtKyUO0++he00ymWleb07QXYJhSfA0e1N5Q9hXu/Y366kgXHDcbZ/oUJkT3ylNgTupkrsdtiy8Ryow==} engines: {node: '>=20.18.0'} peerDependencies: - typescript: '>=5.9.3' + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true - '@solana/rpc-subscriptions@5.3.0': - resolution: {integrity: sha512-T0py1fn3asCUeeRh1L9w+FhaHQEq+TBCZ9o7LBONEbQTgdwH8AIcUhyR8HDyDce2wo7bWpADXJCdyk3eUlFUZA==} + '@solana/rpc-subscriptions@5.4.0': + resolution: {integrity: sha512-051t1CEjjAzM9ohjj2zb3ED70yeS3ZY8J5wSytL6tthTGImw/JB2a0D9DWMOKriFKt496n95IC+IdpJ35CpBWA==} engines: {node: '>=20.18.0'} peerDependencies: - typescript: '>=5.9.3' + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true - '@solana/rpc-transformers@5.3.0': - resolution: {integrity: sha512-N9Au1uu2sI9U+tAxWpWn8oJZwtTDzZ1CDhXr0DWahQoaWjiMKxzoMNA2UCF0Nn1ose8x87yzMXUK91xXAvpYfw==} + '@solana/rpc-transformers@5.4.0': + resolution: {integrity: sha512-dZ8keYloLW+eRAwAPb471uWCFs58yHloLoI+QH0FulYpsSJ7F2BNWYcdnjSS/WiggsNcU6DhpWzYAzlEY66lGQ==} engines: {node: '>=20.18.0'} peerDependencies: - typescript: '>=5.9.3' + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true - '@solana/rpc-transport-http@5.3.0': - resolution: {integrity: sha512-Z+0l90HkL/Sj8onQKcWQXYYORppCf81b76oN0gdjpOGJdFpT64aVwB47CV+NUxnSb/MTp62i3wmNOtPsCTz0Yg==} + '@solana/rpc-transport-http@5.4.0': + resolution: {integrity: sha512-vidA+Qtqrnqp3QSVumWHdWJ/986yCr5+qX3fbc9KPm9Ofoto88OMWB/oLJvi2Tfges1UBu/jl+lJdsVckCM1bA==} engines: {node: '>=20.18.0'} peerDependencies: - typescript: '>=5.9.3' + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true - '@solana/rpc-types@5.3.0': - resolution: {integrity: sha512-L9qMvr5wDk+rZ1qiWHtYl8Ec7M7AkhB9uYQef21pZb7fkeksLoO7DZHrLMTiOYbMWHjGBO2rXYef+SXBxd206g==} + '@solana/rpc-types@5.4.0': + resolution: {integrity: sha512-+C4N4/5AYzBdt3Y2yzkScknScy/jTx6wfvuJIY9XjOXtdDyZ8TmrnMwdPMTZPGLdLuHplJwlwy1acu/4hqmrBQ==} engines: {node: '>=20.18.0'} peerDependencies: - typescript: '>=5.9.3' + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true - '@solana/rpc@5.3.0': - resolution: {integrity: sha512-7jrOAej8Jk5F4EU3i5/91Z5Kg4e20KtWzOUZkU7zDSCImLeAi+1fUDa+vMNBMrDfKqWksFj/wJwGeRPk43P+Bg==} + '@solana/rpc@5.4.0': + resolution: {integrity: sha512-S6GRG+usnubDs0JSpgc0ZWEh9IPL5KPWMuBoD8ggGVOIVWntp53FpvhYslNzbxWBXlTvJecr2todBipGVM/AqQ==} engines: {node: '>=20.18.0'} peerDependencies: - typescript: '>=5.9.3' + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true - '@solana/signers@5.3.0': - resolution: {integrity: sha512-npihqbS1/rL8RSUv0RFlo1xakJdZGNyBrzGBMSxDBIYuYMwjuk4FNq70ka547yFdjTCd9mBzvZpAR2vh4fjmwg==} + '@solana/signers@5.4.0': + resolution: {integrity: sha512-s+fZxpi6UPr6XNk2pH/R84WjNRoSktrgG8AGNfsj/V8MJ++eKX7hhIf4JsHZtnnQXXrHmS3ozB2oHlc8yEJvCQ==} engines: {node: '>=20.18.0'} peerDependencies: - typescript: '>=5.9.3' + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true - '@solana/subscribable@5.3.0': - resolution: {integrity: sha512-tn6DnIR5xRspiO2untzznr0KpUZRm71cMNgJlNh3H6t3zph7P800EbFYMkPvPcCDWZf3S+ALiLAeNyrNPgSPsg==} + '@solana/subscribable@5.4.0': + resolution: {integrity: sha512-72LmfNX7UENgA24sn/xjlWpPAOsrxkWb9DQhuPZxly/gq8rl/rvr7Xu9qBkvFF2po9XpdUrKlccqY4awvfpltA==} engines: {node: '>=20.18.0'} peerDependencies: - typescript: '>=5.9.3' + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true - '@solana/sysvars@5.3.0': - resolution: {integrity: sha512-hkXnOaGPRWC0/79Br+sjENrPtYunlXZ5o0sC/ZEBlguKv+/yP/cZeoHYKoFzF8X3YHFp9dawNhtroEj1/B+hWQ==} + '@solana/sysvars@5.4.0': + resolution: {integrity: sha512-A5NES7sOlFmpnsiEts5vgyL3NXrt/tGGVSEjlEGvsgwl5EDZNv+xWnNA400uMDqd9O3a5PmH7p/6NsgR+kUzSg==} engines: {node: '>=20.18.0'} peerDependencies: - typescript: '>=5.9.3' + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true - '@solana/transaction-confirmation@5.3.0': - resolution: {integrity: sha512-tVJw87q691FibuRmqkU+sOjcV3hl1yI4ATVLbS6cewPlZZ2XI/uAzKHwZt08N/llbFHKeLHY3pKUMve3fSYJPw==} + '@solana/transaction-confirmation@5.4.0': + resolution: {integrity: sha512-EdSDgxs84/4gkjQw2r7N+Kgus8x9U+NFo0ufVG+48V8Hzy2t0rlBuXgIxwx0zZwUuTIgaKhpIutJgVncwZ5koA==} engines: {node: '>=20.18.0'} peerDependencies: - typescript: '>=5.9.3' + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true - '@solana/transaction-messages@5.3.0': - resolution: {integrity: sha512-36O2ccWYdDIq1HwzSExTwQFryY1M21Zw1AUpxJozHv79b6FAE5/hrsM/NOEEVipVvsNCUPC7xDs6nv3DEC8oWg==} + '@solana/transaction-messages@5.4.0': + resolution: {integrity: sha512-qd/3kZDaPiHM0amhn3vXnupfcsFTVz6CYuHXvq9HFv/fq32+5Kp1FMLnmHwoSxQxdTMDghPdOhC4vhNhuWmuVQ==} engines: {node: '>=20.18.0'} peerDependencies: - typescript: '>=5.9.3' + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true - '@solana/transactions@5.3.0': - resolution: {integrity: sha512-dxbKRxMTV7BM0hFHCmsBi5/bfRNjH8TPqicR4K6YhL9u0T5eAnDsTZXCX3pGFbOxx7sHs9CFoy12M58+9xVrJw==} + '@solana/transactions@5.4.0': + resolution: {integrity: sha512-OuY4M4x/xna8KZQIrz8tSrI9EEul9Od97XejqFmGGkEjbRsUOfJW8705TveTW8jU3bd5RGecFYscPgS2F+m7jQ==} engines: {node: '>=20.18.0'} peerDependencies: - typescript: '>=5.9.3' + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true '@solana/web3.js@1.98.4': resolution: {integrity: sha512-vv9lfnvjUsRiq//+j5pBdXig0IQdtzA0BRZ3bXEP4KaIyF1CcaydWqgyzQgfZMNIsWNWmG+AUHwPy4AHOD6gpw==} @@ -1592,20 +1776,12 @@ packages: peerDependencies: vite: ^5.2.0 || ^6 || ^7 - '@tanstack/devtools-client@0.0.3': - resolution: {integrity: sha512-kl0r6N5iIL3t9gGDRAv55VRM3UIyMKVH83esRGq7xBjYsRLe/BeCIN2HqrlJkObUXQMKhy7i8ejuGOn+bDqDBw==} - engines: {node: '>=18'} - '@tanstack/devtools-client@0.0.5': resolution: {integrity: sha512-hsNDE3iu4frt9cC2ppn1mNRnLKo2uc1/1hXAyY9z4UYb+o40M2clFAhiFoo4HngjfGJDV3x18KVVIq7W4Un+zA==} engines: {node: '>=18'} - '@tanstack/devtools-event-bus@0.3.3': - resolution: {integrity: sha512-lWl88uLAz7ZhwNdLH6A3tBOSEuBCrvnY9Fzr5JPdzJRFdM5ZFdyNWz1Bf5l/F3GU57VodrN0KCFi9OA26H5Kpg==} - engines: {node: '>=18'} - - '@tanstack/devtools-event-client@0.3.5': - resolution: {integrity: sha512-RL1f5ZlfZMpghrCIdzl6mLOFLTuhqmPNblZgBaeKfdtk5rfbjykurv+VfYydOFXj0vxVIoA2d/zT7xfD7Ph8fw==} + '@tanstack/devtools-event-bus@0.4.0': + resolution: {integrity: sha512-1t+/csFuDzi+miDxAOh6Xv7VDE80gJEItkTcAZLjV5MRulbO/W8ocjHLI2Do/p2r2/FBU0eKCRTpdqvXaYoHpQ==} engines: {node: '>=18'} '@tanstack/devtools-event-client@0.4.0': @@ -1618,27 +1794,27 @@ packages: peerDependencies: solid-js: '>=1.9.7' - '@tanstack/devtools-vite@0.3.12': - resolution: {integrity: sha512-fGJgu4xUhKmGk+a+/aHD8l5HKVk6+ObA+6D3YC3xCXbai/YmaGhztqcZf1tKUqjZyYyQLHsjqmKzvJgVpQP1jw==} + '@tanstack/devtools-vite@0.4.1': + resolution: {integrity: sha512-PkMOomcWnl/pUkCqIjqL/csjPHtkMVBirDpJVOZR7XJZDxo5CuD7B+3KsujFCF4Dsn6QYlae97gCZvxi/CB76Q==} engines: {node: '>=18'} peerDependencies: vite: ^6.0.0 || ^7.0.0 - '@tanstack/devtools@0.7.0': - resolution: {integrity: sha512-AlAoCqJhWLg9GBEaoV1g/j+X/WA1aJSWOsekxeuZpYeS2hdVuKAjj04KQLUMJhtLfNl2s2E+TCj7ZRtWyY3U4w==} + '@tanstack/devtools@0.10.3': + resolution: {integrity: sha512-M2HnKtaNf3Z8JDTNDq+X7/1gwOqSwTnCyC0GR+TYiRZM9mkY9GpvTqp6p6bx3DT8onu2URJiVxgHD9WK2e3MNQ==} engines: {node: '>=18'} peerDependencies: solid-js: '>=1.9.7' - '@tanstack/history@1.145.7': - resolution: {integrity: sha512-gMo/ReTUp0a3IOcZoI3hH6PLDC2R/5ELQ7P2yu9F6aEkA0wSQh+Q4qzMrtcKvF2ut0oE+16xWCGDo/TdYd6cEQ==} + '@tanstack/history@1.154.14': + resolution: {integrity: sha512-xyIfof8eHBuub1CkBnbKNKQXeRZC4dClhmzePHVOEel4G7lk/dW+TQ16da7CFdeNLv6u6Owf5VoBQxoo6DFTSA==} engines: {node: '>=12'} - '@tanstack/query-core@5.90.16': - resolution: {integrity: sha512-MvtWckSVufs/ja463/K4PyJeqT+HMlJWtw6PrCpywznd2NSgO3m4KwO9RqbFqGg6iDE8vVMFWMeQI4Io3eEYww==} + '@tanstack/query-core@5.90.20': + resolution: {integrity: sha512-OMD2HLpNouXEfZJWcKeVKUgQ5n+n3A2JFmBaScpNDUqSrQSjiveC7dKMe53uJUg1nDG16ttFPz2xfilz6i2uVg==} - '@tanstack/react-devtools@0.7.11': - resolution: {integrity: sha512-a2Lmz8x+JoDrsU6f7uKRcyyY+k8mA/n5mb9h7XJ3Fz/y3+sPV9t7vAW1s5lyNkQyyDt6V1Oim99faLthoJSxMw==} + '@tanstack/react-devtools@0.9.2': + resolution: {integrity: sha512-JNXvBO3jgq16GzTVm7p65n5zHNfMhnqF6Bm7CawjoqZrjEakxbM6Yvy63aKSIpbrdf+Wun2Xn8P0qD+vp56e1g==} engines: {node: '>=18'} peerDependencies: '@types/react': '>=16.8' @@ -1646,25 +1822,25 @@ packages: react: '>=16.8' react-dom: '>=16.8' - '@tanstack/react-query@5.90.16': - resolution: {integrity: sha512-bpMGOmV4OPmif7TNMteU/Ehf/hoC0Kf98PDc0F4BZkFrEapRMEqI/V6YS0lyzwSV6PQpY1y4xxArUIfBW5LVxQ==} + '@tanstack/react-query@5.90.20': + resolution: {integrity: sha512-vXBxa+qeyveVO7OA0jX1z+DeyCA4JKnThKv411jd5SORpBKgkcVnYKCiBgECvADvniBX7tobwBmg01qq9JmMJw==} peerDependencies: react: ^18 || ^19 - '@tanstack/react-router-devtools@1.145.7': - resolution: {integrity: sha512-crzHSQ/rcGX7RfuYsmm1XG5quurNMDTIApU7jfwDx5J9HnUxCOSJrbFX0L3w0o0VRCw5xhrL2EdCnW78Ic86hg==} + '@tanstack/react-router-devtools@1.157.8': + resolution: {integrity: sha512-cD7pJ+IpNBWsHv91bLamdUf5/jByy/He7nSveC/LCvc7mK2sssTQeblhg5km3GeNmBqW7kI6Ah/Rh+LmBBZvgA==} engines: {node: '>=12'} peerDependencies: - '@tanstack/react-router': ^1.145.7 - '@tanstack/router-core': ^1.145.7 + '@tanstack/react-router': ^1.157.8 + '@tanstack/router-core': ^1.157.8 react: '>=18.0.0 || >=19.0.0' react-dom: '>=18.0.0 || >=19.0.0' peerDependenciesMeta: '@tanstack/router-core': optional: true - '@tanstack/react-router@1.145.7': - resolution: {integrity: sha512-0O+a4TjJSPXd2BsvDPwDPBKRQKYqNIBg5TAg9NzCteqJ0NXRxwohyqCksHqCEEtJe/uItwqmHoqkK4q5MDhEsA==} + '@tanstack/react-router@1.157.8': + resolution: {integrity: sha512-kl95/8/wQz6bajOg/+HVbQcIDmv0K+M2EflYmulUThyUSWh2ME4OLKDMpTjPpUMQcwsSV/3/Fp9AiUps3Bh+fw==} engines: {node: '>=12'} peerDependencies: react: '>=18.0.0 || >=19.0.0' @@ -1682,31 +1858,30 @@ packages: 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 - '@tanstack/router-core@1.145.7': - resolution: {integrity: sha512-v6jx6JqVUBM0/FcBq1tX22xiPq8Ufc0PDEP582/4deYoq2/RYd+bZstANp3mGSsqdxE/luhoLYuuSQiwi/j1wA==} + '@tanstack/router-core@1.157.8': + resolution: {integrity: sha512-2fxuhHIZ3yBXN9rxcDOgCsezuwk1VoWvprIDMe+HDi6FBdpWgEREMp0CWEYn33Lxla44iwaTpwvVcFDk8QC/rA==} engines: {node: '>=12'} - '@tanstack/router-devtools-core@1.145.7': - resolution: {integrity: sha512-oKeq/6QvN49THCh++FJyPv1X65i20qGS4aJHQTNsl4cu1piW1zWUhab2L3DZVr3G8C40FW3xb6hVw92N/fzZbQ==} + '@tanstack/router-devtools-core@1.157.8': + resolution: {integrity: sha512-sFVaw7nPQu/U1/y6jEkoMuO9GJ/8OEaDpAnD5zeXHSlZpuhwtwuPnyI02XA75JSrLp4hZUj46BvF5E4uW3ZA+w==} engines: {node: '>=12'} peerDependencies: - '@tanstack/router-core': ^1.145.7 + '@tanstack/router-core': ^1.157.8 csstype: ^3.0.10 - solid-js: '>=1.9.5' peerDependenciesMeta: csstype: optional: true - '@tanstack/router-generator@1.145.7': - resolution: {integrity: sha512-xg71c1WTku0ro0rgpJWh3Dt+ognV9qWe2KJHAPzrqfOYdUYu9sGq7Ri4jo8Rk0luXWZrWsrFdBP+9Jx6JH6zWA==} + '@tanstack/router-generator@1.157.8': + resolution: {integrity: sha512-P0uvoFkhqrkmn/npgJJ02aGGsw2CMtoEAWQkiJGg00aXyA+026Ny1G/4FPuYsGK11c6yMsOl6FHk/sipNY+2YA==} engines: {node: '>=12'} - '@tanstack/router-plugin@1.145.7': - resolution: {integrity: sha512-Rimo0NragYKHwjoYX9JBLS8VkZD4D/LqzzLIlX9yz93lmWFRu/DbuS7fDZNqX1Ea8naNvo18DlySszYLzC8XDg==} + '@tanstack/router-plugin@1.157.8': + resolution: {integrity: sha512-k3pMbV4DGBAf9rjZL5bdPUAPiFypV4ys6UB8JAK/9EO6zdaF0BksD8KxWgJypuxaaeCMJL/RspOUqCmwbwAXVA==} engines: {node: '>=12'} peerDependencies: '@rsbuild/core': '>=1.0.2' - '@tanstack/react-router': ^1.145.7 + '@tanstack/react-router': ^1.157.8 vite: '>=5.0.0 || >=6.0.0 || >=7.0.0' vite-plugin-solid: ^2.11.10 webpack: '>=5.92.0' @@ -1722,8 +1897,8 @@ packages: webpack: optional: true - '@tanstack/router-utils@1.143.11': - resolution: {integrity: sha512-N24G4LpfyK8dOlnP8BvNdkuxg1xQljkyl6PcrdiPSA301pOjatRT1y8wuCCJZKVVD8gkd0MpCZ0VEjRMGILOtA==} + '@tanstack/router-utils@1.154.7': + resolution: {integrity: sha512-61bGx32tMKuEpVRseu2sh1KQe8CfB7793Mch/kyQt0EP3tD7X0sXmimCl3truRiDGUtI0CaSoQV1NPjAII1RBA==} engines: {node: '>=12'} '@tanstack/store@0.8.0': @@ -1732,16 +1907,16 @@ packages: '@tanstack/virtual-core@3.13.18': resolution: {integrity: sha512-Mx86Hqu1k39icq2Zusq+Ey2J6dDWTjDvEv43PJtRCoEYTLyfaPnxIQ6iy7YAOK0NV/qOEmZQ/uCufrppZxTgcg==} - '@tanstack/virtual-file-routes@1.145.4': - resolution: {integrity: sha512-CI75JrfqSluhdGwLssgVeQBaCphgfkMQpi8MCY3UJX1hoGzXa8kHYJcUuIFMOLs1q7zqHy++EVVtMK03osR5wQ==} + '@tanstack/virtual-file-routes@1.154.7': + resolution: {integrity: sha512-cHHDnewHozgjpI+MIVp9tcib6lYEQK5MyUr0ChHpHFGBl8Xei55rohFK0I0ve/GKoHeioaK42Smd8OixPp6CTg==} engines: {node: '>=12'} '@testing-library/dom@10.4.1': resolution: {integrity: sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==} engines: {node: '>=18'} - '@testing-library/react@16.3.1': - resolution: {integrity: sha512-gr4KtAWqIOQoucWYD/f6ki+j5chXfcPc74Col/6poTyqTmn7zRmodWahWRCp8tYd+GMqBonw6hstNzqjbs6gjw==} + '@testing-library/react@16.3.2': + resolution: {integrity: sha512-XU5/SytQM+ykqMnAnvB2umaJNIOsLF3PVv//1Ew4CTcpz0/BRyy/af40qqrt7SjKpDdT1saBMc42CUok5gaw+g==} engines: {node: '>=18'} peerDependencies: '@testing-library/dom': ^10.0.0 @@ -1806,16 +1981,16 @@ packages: '@types/node@18.19.130': resolution: {integrity: sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg==} - '@types/node@22.19.3': - resolution: {integrity: sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA==} + '@types/node@25.0.10': + resolution: {integrity: sha512-zWW5KPngR/yvakJgGOmZ5vTBemDoSqF3AcV/LrO5u5wTWyEAVVh+IT39G4gtyAkh3CtTZs8aX/yRM82OfzHJRg==} '@types/react-dom@19.2.3': resolution: {integrity: sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==} peerDependencies: '@types/react': ^19.2.0 - '@types/react@19.2.7': - resolution: {integrity: sha512-MWtvHrGZLFttgeEj28VXHxpmwYbor/ATPYbBfSFZEIRK0ecCFLl2Qo55z52Hss+UV9CRN7trSeq1zbgx7YDWWg==} + '@types/react@19.2.9': + resolution: {integrity: sha512-Lpo8kgb/igvMIPeNV2rsYKTgaORYdO1XGVZ4Qz3akwOj0ySGYMPlQWa8BaLn0G63D1aSaAQ5ldR06wCpChQCjA==} '@types/trusted-types@2.0.7': resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} @@ -1840,37 +2015,48 @@ packages: peerDependencies: vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 - '@vitest/expect@3.2.4': - resolution: {integrity: sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==} + '@vitest/browser-playwright@4.0.18': + resolution: {integrity: sha512-gfajTHVCiwpxRj1qh0Sh/5bbGLG4F/ZH/V9xvFVoFddpITfMta9YGow0W6ZpTTORv2vdJuz9TnrNSmjKvpOf4g==} + peerDependencies: + playwright: '*' + vitest: 4.0.18 - '@vitest/mocker@3.2.4': - resolution: {integrity: sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==} + '@vitest/browser@4.0.18': + resolution: {integrity: sha512-gVQqh7paBz3gC+ZdcCmNSWJMk70IUjDeVqi+5m5vYpEHsIwRgw3Y545jljtajhkekIpIp5Gg8oK7bctgY0E2Ng==} + peerDependencies: + vitest: 4.0.18 + + '@vitest/expect@4.0.18': + resolution: {integrity: sha512-8sCWUyckXXYvx4opfzVY03EOiYVxyNrHS5QxX3DAIi5dpJAAkyJezHCP77VMX4HKA2LDT/Jpfo8i2r5BE3GnQQ==} + + '@vitest/mocker@4.0.18': + resolution: {integrity: sha512-HhVd0MDnzzsgevnOWCBj5Otnzobjy5wLBe4EdeeFGv8luMsGcYqDuFRMcttKWZA5vVO8RFjexVovXvAM4JoJDQ==} peerDependencies: msw: ^2.4.9 - vite: ^5.0.0 || ^6.0.0 || ^7.0.0-0 + vite: ^6.0.0 || ^7.0.0-0 peerDependenciesMeta: msw: optional: true vite: optional: true - '@vitest/pretty-format@3.2.4': - resolution: {integrity: sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==} + '@vitest/pretty-format@4.0.18': + resolution: {integrity: sha512-P24GK3GulZWC5tz87ux0m8OADrQIUVDPIjjj65vBXYG17ZeU3qD7r+MNZ1RNv4l8CGU2vtTRqixrOi9fYk/yKw==} - '@vitest/runner@3.2.4': - resolution: {integrity: sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==} + '@vitest/runner@4.0.18': + resolution: {integrity: sha512-rpk9y12PGa22Jg6g5M3UVVnTS7+zycIGk9ZNGN+m6tZHKQb7jrP7/77WfZy13Y/EUDd52NDsLRQhYKtv7XfPQw==} - '@vitest/snapshot@3.2.4': - resolution: {integrity: sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==} + '@vitest/snapshot@4.0.18': + resolution: {integrity: sha512-PCiV0rcl7jKQjbgYqjtakly6T1uwv/5BQ9SwBLekVg/EaYeQFPiXcgrC2Y7vDMA8dM1SUEAEV82kgSQIlXNMvA==} - '@vitest/spy@3.2.4': - resolution: {integrity: sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==} + '@vitest/spy@4.0.18': + resolution: {integrity: sha512-cbQt3PTSD7P2OARdVW3qWER5EGq7PHlvE+QfzSC0lbwO+xnt7+XH06ZzFjFRgzUX//JmpxrCu92VdwvEPlWSNw==} - '@vitest/utils@3.2.4': - resolution: {integrity: sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==} + '@vitest/utils@4.0.18': + resolution: {integrity: sha512-msMRKLMVLWygpK3u2Hybgi4MNjcYJvwTb0Ru09+fOyCXIgT5raYP041DRRdiJiI3k/2U6SEbAETB3YtBrUkCFA==} - '@wagmi/connectors@7.1.2': - resolution: {integrity: sha512-L5ATHwEjJCWOm/tRWAyQ42hFpe4UrrReqQT8pMEsM+A29CkJxEm0n7/C2Ki7O1hiZ2D/n5emp0s4MfCFe9pdwQ==} + '@wagmi/connectors@7.1.5': + resolution: {integrity: sha512-+hrb4RJywjGtUsDZNLSc4eOF+jD6pVkCZ/KFi24p993u0ymsm/kGTLXjhYx5r8Rf/cxFHEiaQaRnEfB9qyDJyw==} peerDependencies: '@base-org/account': ^2.5.1 '@coinbase/wallet-sdk': ^4.3.6 @@ -1878,7 +2064,7 @@ packages: '@metamask/sdk': ~0.33.1 '@safe-global/safe-apps-provider': ~0.18.6 '@safe-global/safe-apps-sdk': ^9.1.0 - '@wagmi/core': 3.2.2 + '@wagmi/core': 3.3.1 '@walletconnect/ethereum-provider': ^2.21.1 porto: ~0.2.35 typescript: '>=5.7.3' @@ -1903,8 +2089,8 @@ packages: typescript: optional: true - '@wagmi/core@3.2.2': - resolution: {integrity: sha512-nCCza85tmE/lNorZemv0ah0OwOewMRiNJbSkIkGPr/mSH6mAy+/D/GbP8Gb3j2Nw85LuF5wxgG1fFiU6mB3CyQ==} + '@wagmi/core@3.3.1': + resolution: {integrity: sha512-0Q8VYnVNPHe/gZsvj+Zddt8VpmKoMHXoVd887svL21QGKXEIVYiV/8R3qMv0SyC7q+GbQ5x9xezB56u3S8bWAQ==} peerDependencies: '@tanstack/query-core': '>=5.0.0' ox: '>=0.11.1' @@ -1926,8 +2112,8 @@ packages: resolution: {integrity: sha512-Gt8TnSlDZpAl+RWOOAB/kuvC7RpcdWAlFbHNoi4gsXsfaWa1QCT6LBcfIYTPdOZC9OVZUDwqGuGAcqZejDmHjg==} engines: {node: '>=16'} - '@walletconnect/core@2.23.1': - resolution: {integrity: sha512-fW48PIw41Q/LJW+q0msFogD/OcelkrrDONQMcpGw4C4Y6w+IvFKGEg+7dxGLKWx1g8QuHk/p6C9VEIV/tDsm5A==} + '@walletconnect/core@2.23.2': + resolution: {integrity: sha512-KkaTELRu8t/mt3J9doCQ1fBGCbYsCNfpo2JpKdCwKQR7PVjVKeVpYQK/blVkA5m6uLPpBtVRbOMKjnHW1m7JLw==} engines: {node: '>=18.20.8'} '@walletconnect/environment@1.0.1': @@ -1962,8 +2148,8 @@ packages: '@react-native-async-storage/async-storage': optional: true - '@walletconnect/logger@3.0.1': - resolution: {integrity: sha512-O8lXGMZO1+e5NtHhBSjsAih/I9KC+1BxNhGNGD+SIWTqWd0zsbT5wJtNnJ+LnSXTRE7XZRxFUlvZgkER3vlhFA==} + '@walletconnect/logger@3.0.2': + resolution: {integrity: sha512-7wR3wAwJTOmX4gbcUZcFMov8fjftY05+5cO/d4cpDD8wDzJ+cIlKdYOXaXfxHLSYeDazMXIsxMYjHYVDfkx+nA==} '@walletconnect/relay-api@1.0.11': resolution: {integrity: sha512-tLPErkze/HmC9aCmdZOhtVmYZq1wKfWTJtygQHoWtgg722Jd4homo54Cs4ak2RUFUZIGO2RsOpIcWipaua5D5Q==} @@ -1974,20 +2160,20 @@ packages: '@walletconnect/safe-json@1.0.2': resolution: {integrity: sha512-Ogb7I27kZ3LPC3ibn8ldyUr5544t3/STow9+lzz7Sfo808YD7SBWk7SAsdBFlYgP2zDRy2hS3sKRcuSRM0OTmA==} - '@walletconnect/sign-client@2.23.1': - resolution: {integrity: sha512-x0sG8ZuuaOi3G/gYWLppf7nmNItWlV8Yga9Bltb46/Ve6G20nCBis6gcTVVeJOpnmqQ85FISwExqOYPmJ0FQlw==} + '@walletconnect/sign-client@2.23.2': + resolution: {integrity: sha512-LL5KgmJHvY5NqQn+ZHQJLia1p6fpUWXHtiG97S5rNfyuPx6gT/Jkkwqc2LwdmAjFkr61t8zTagHC9ETq203mNA==} '@walletconnect/time@1.0.2': resolution: {integrity: sha512-uzdd9woDcJ1AaBZRhqy5rNC9laqWGErfc4dxA9a87mPdKOgWMD85mcFo9dIYIts/Jwocfwn07EC6EzclKubk/g==} - '@walletconnect/types@2.23.1': - resolution: {integrity: sha512-sbWOM9oCuzSbz/187rKWnSB3sy7FCFcbTQYeIJMc9+HTMTG2TUPftPCn8NnkfvmXbIeyLw00Y0KNvXoCV/eIeQ==} + '@walletconnect/types@2.23.2': + resolution: {integrity: sha512-5dxBCdUM+4Dqe1/A7uqkm2tWPXce4UUGSr+ImfI0YjwEExQS8+TzdOlhMt3n32ncnBCllU5paG+fsndT06R0iw==} - '@walletconnect/universal-provider@2.23.1': - resolution: {integrity: sha512-XlvG1clsL7Ds+g28Oz5dXsPA+5ERtQGYvd+L8cskMaTvtphGhipVGgX8WNAhp7p1gfNcDg4tCiTHlj131jctwA==} + '@walletconnect/universal-provider@2.23.2': + resolution: {integrity: sha512-vs9iorPUAiVesFJ95O6XvLjmRgF+B2TspxJNL90ZULbrkRw4JFsmaRdb965PZKc+s182k1MkS/MQ0o964xRcEw==} - '@walletconnect/utils@2.23.1': - resolution: {integrity: sha512-J12DadZHIL0KvsUoQuK0rag9jDUy8qu1zwz47xEHl03LrMcgrotQiXvdTQ3uHwAVA4yKLTQB/LEI2JiTIt7X8Q==} + '@walletconnect/utils@2.23.2': + resolution: {integrity: sha512-ReSjU3kX+3i3tYJQZbVfetY5SSUL+iM6uiIVVD1PJalePa/5A40VgLVRTF7sDCJTIFfpf3Mt4bFjeaYuoxWtIw==} '@walletconnect/window-getters@1.0.1': resolution: {integrity: sha512-vHp+HqzGxORPAN8gY03qnbTMnhqIwjeRJNOMOAzePRg4xVEEE2WvYsI9G2NMjOknA8hnuYbU3/hwLcKbjhc8+Q==} @@ -2083,11 +2269,11 @@ packages: peerDependencies: axios: 0.x || 1.x - axios@1.13.2: - resolution: {integrity: sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==} + axios@1.13.3: + resolution: {integrity: sha512-ERT8kdX7DZjtUm7IitEyV7InTHAF42iJuMArIiDIV5YtPanJkgw4hw5Dyg9fh0mihdWNn1GKaeIWErfe56UQ1g==} - babel-dead-code-elimination@1.0.11: - resolution: {integrity: sha512-mwq3W3e/pKSI6TG8lXMiDWvEi1VXYlSBlJlB3l+I0bAb5u1RNUl88udos85eOPNK3m5EXK9uO7d2g08pesTySQ==} + babel-dead-code-elimination@1.0.12: + resolution: {integrity: sha512-GERT7L2TiYcYDtYk1IpD+ASAYXjKbLTDPhBtYj7X1NuRMDTMtAx9kyBenub1Ev41lo91OHCKdmP+egTDmfQ7Ig==} babel-plugin-react-compiler@1.0.0: resolution: {integrity: sha512-Ixm8tFfoKKIPYdCCKYTsqv+Fd4IJ0DQqMyEimo+pxUOMUR9cVPlwTrFt9Avu+3cb6Zp3mAzl+t1MrG2fxxKsxw==} @@ -2217,8 +2403,8 @@ packages: caniuse-lite@1.0.30001762: resolution: {integrity: sha512-PxZwGNvH7Ak8WX5iXzoK1KPZttBXNPuaOvI2ZYU7NrlM+d9Ov+TUvlLOBNGzVXAntMSMMlJPd+jY6ovrVjSmUw==} - chai@5.3.3: - resolution: {integrity: sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==} + chai@6.2.2: + resolution: {integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==} engines: {node: '>=18'} chalk@5.6.2: @@ -2228,17 +2414,13 @@ packages: charenc@0.0.2: resolution: {integrity: sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==} - check-error@2.1.3: - resolution: {integrity: sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA==} - engines: {node: '>= 16'} - chokidar@3.6.0: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} - chokidar@4.0.3: - resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} - engines: {node: '>= 14.16.0'} + chokidar@5.0.0: + resolution: {integrity: sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==} + engines: {node: '>= 20.19.0'} cipher-base@1.0.7: resolution: {integrity: sha512-Mz9QMT5fJe7bKI7MH31UilT5cEK5EHHRCccw/YRFsRY47AuNgaV6HY3rscp0/I4Q+tTW/5zoqpSeRRI54TkDWA==} @@ -2379,10 +2561,6 @@ packages: resolution: {integrity: sha512-69NZfbKIzux1vBOd31al3XnMnH+2mqDhEgLdpygErm4d60N+UwA5Sq5WFjmEDQzumgB9fElojGwWG0vybVfFmA==} engines: {node: '>=8.6'} - deep-eql@5.0.2: - resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} - engines: {node: '>=6'} - define-data-property@1.1.4: resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} engines: {node: '>= 0.4'} @@ -2415,17 +2593,12 @@ packages: detect-browser@5.3.0: resolution: {integrity: sha512-53rsFbGdwMwlF7qvCt0ypLM5V5/Mbl0szB7GPN8y9NCcbknYOeVVXdrXEq+90IwAfrrzt6Hd+u2E2ntakICU8w==} - detect-libc@1.0.3: - resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==} - engines: {node: '>=0.10'} - hasBin: true - detect-libc@2.1.2: resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} - diff@8.0.2: - resolution: {integrity: sha512-sSuxWU5j5SR9QQji/o2qMvqRNYRDOcBTgsJ/DeCf4iSN4gW+gNMXM7wFIP+fdXZxoNiAnHUTGjCr+TSWXdRDKg==} + diff@8.0.3: + resolution: {integrity: sha512-qejHi7bcSD4hQAZE0tNAawRK1ZtafHDmMTMkrrIGgSLl7hTnQHmKCeB45xAcbfTqK2zowkM3j3bHt/4b/ARbYQ==} engines: {node: '>=0.3.1'} diffie-hellman@5.0.3: @@ -2445,8 +2618,8 @@ packages: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} - effect@3.19.14: - resolution: {integrity: sha512-3vwdq0zlvQOxXzXNKRIPKTqZNMyGCdaFUBfMPqpsyzZDre67kgC1EEHDV4EoQTovJ4w5fmJW756f86kkuz7WFA==} + effect@3.19.15: + resolution: {integrity: sha512-vzMmgfZKLcojmUjBdlQx+uaKryO7yULlRxjpDnHdnvcp1NPHxJyoM6IOXBLlzz2I/uPtZpGKavt5hBv7IvGZkA==} electron-to-chromium@1.5.267: resolution: {integrity: sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==} @@ -2582,6 +2755,11 @@ packages: resolution: {integrity: sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==} engines: {node: '>= 6'} + fsevents@2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -2629,8 +2807,8 @@ packages: graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - h3@1.15.4: - resolution: {integrity: sha512-z5cFQWDffyOe4vQ9xIqNfCZdV4p//vy6fBnr8Q1AWnVZ0teurKMG66rLj++TKwKPUP3u7iMUvrvKaEUiQw2QWQ==} + h3@1.15.5: + resolution: {integrity: sha512-xEyq3rSl+dhGX2Lm0+eFQIAzlDN6Fs0EcC4f7BNUmzaRX/PTzeuM+Tr2lHB8FoXggsQIeXLj8EDVgs5ywxyxmg==} has-property-descriptors@1.0.2: resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} @@ -2764,8 +2942,8 @@ packages: isarray@2.0.5: resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} - isbot@5.1.32: - resolution: {integrity: sha512-VNfjM73zz2IBZmdShMfAUg10prm6t7HFUQmNAEOAVS4YH92ZrZcvkMcGX6cIgBJAzWDzPent/EeAtYEHNPNPBQ==} + isbot@5.1.33: + resolution: {integrity: sha512-P4Hgb5NqswjkI0J1CM6XKXon/sxKY1SuowE7Qx2hrBhIwICFyXy54mfgB5eMHXsbe/eStzzpbIGNOvGmz+dlKg==} engines: {node: '>=18'} isomorphic-timers-promises@1.0.1: @@ -2797,9 +2975,6 @@ packages: js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - js-tokens@9.0.1: - resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} - jsdom@27.4.0: resolution: {integrity: sha512-mjzqwWRD9Y1J1KUi7W97Gja1bwOOM5Ug0EZ6UDK3xS7j7mndrkwozHtSblfomlzyB4NepioNt+B2sOSzczVgtQ==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} @@ -2924,12 +3099,6 @@ packages: lodash.clonedeep@4.5.0: resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==} - loupe@3.2.1: - resolution: {integrity: sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==} - - lru-cache@10.4.3: - resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} - lru-cache@11.2.4: resolution: {integrity: sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==} engines: {node: 20 || >=22} @@ -2937,8 +3106,8 @@ packages: lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} - lucide-react@0.544.0: - resolution: {integrity: sha512-t5tS44bqd825zAW45UQxpG2CvcC4urOwn2TrwSH8u+MjeE+1NnWl6QqeQ/6NdjMqdOygyiT9p3Ev0p1NJykxjw==} + lucide-react@0.563.0: + resolution: {integrity: sha512-8dXPB2GI4dI8jV4MgUDGBeLdGk8ekfqVZ0BdLcrRzocGgG75ltNEmWS+gE7uokKF/0oSUuczNDT+g9hFJ23FkA==} peerDependencies: react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0 @@ -2962,10 +3131,6 @@ packages: mdn-data@2.12.2: resolution: {integrity: sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==} - micromatch@4.0.8: - resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} - engines: {node: '>=8.6'} - miller-rabin@4.0.1: resolution: {integrity: sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==} hasBin: true @@ -2997,6 +3162,10 @@ packages: typescript: optional: true + mrmime@2.0.1: + resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==} + engines: {node: '>=10'} + ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} @@ -3071,6 +3240,9 @@ packages: resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} engines: {node: '>= 0.4'} + obug@2.1.1: + resolution: {integrity: sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==} + ofetch@1.5.1: resolution: {integrity: sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA==} @@ -3152,10 +3324,6 @@ packages: pathe@2.0.3: resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} - pathval@2.0.1: - resolution: {integrity: sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==} - engines: {node: '>= 14.16'} - pbkdf2@3.1.5: resolution: {integrity: sha512-Q3CG/cYvCO1ye4QKkuH7EXxs3VC/rI1/trd+qX2+PolbaKG0H+bgcZzrTt96mMyRtejk+JMCiLUn3y29W8qmFQ==} engines: {node: '>= 0.10'} @@ -3174,21 +3342,39 @@ packages: pino-abstract-transport@2.0.0: resolution: {integrity: sha512-F63x5tizV6WCh4R6RHyi2Ml+M70DNRXt/+HANowMflpgGFMAym/VKm6G7ZOQRjqN7XbGxK1Lg9t6ZrtzOaivMw==} - pino-std-serializers@7.0.0: - resolution: {integrity: sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA==} + pino-std-serializers@7.1.0: + resolution: {integrity: sha512-BndPH67/JxGExRgiX1dX0w1FvZck5Wa4aal9198SrRhZjH3GxKQUKIBnYJTdj2HDN3UQAS06HlfcSbQj2OHmaw==} pino@10.0.0: resolution: {integrity: sha512-eI9pKwWEix40kfvSzqEP6ldqOoBIN7dwD/o91TY5z8vQI12sAffpR/pOqAD1IVVwIVHDpHjkq0joBPdJD0rafA==} hasBin: true + pixelmatch@7.1.0: + resolution: {integrity: sha512-1wrVzJ2STrpmONHKBy228LM1b84msXDUoAzVEl0R8Mz4Ce6EPr+IVtxm8+yvrqLYMHswREkjYFaMxnyGnaY3Ng==} + hasBin: true + pkg-dir@5.0.0: resolution: {integrity: sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==} engines: {node: '>=10'} + playwright-core@1.58.0: + resolution: {integrity: sha512-aaoB1RWrdNi3//rOeKuMiS65UCcgOVljU46At6eFcOFPFHWtd2weHRRow6z/n+Lec0Lvu0k9ZPKJSjPugikirw==} + engines: {node: '>=18'} + hasBin: true + + playwright@1.58.0: + resolution: {integrity: sha512-2SVA0sbPktiIY/MCOPX8e86ehA/e+tDNq+e5Y8qjKYti2Z/JG7xnronT/TXTIkKbYGWlCbuucZ6dziEgkoEjQQ==} + engines: {node: '>=18'} + hasBin: true + pngjs@5.0.0: resolution: {integrity: sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==} engines: {node: '>=10.13.0'} + pngjs@7.0.0: + resolution: {integrity: sha512-LKWqWJRhstyYo9pGvgor/ivk2w94eSjE3RGVuzLGlr3NmD8bf7RcYGze1mNdEHRP6TRP6rMuDHk5t44hnTRyow==} + engines: {node: '>=14.19.0'} + possible-typed-array-names@1.1.0: resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} engines: {node: '>= 0.4'} @@ -3200,8 +3386,8 @@ packages: preact@10.24.2: resolution: {integrity: sha512-1cSoF0aCC8uaARATfrlz4VCBqE8LwZwRfLgkxJOQwAlQt6ayTmi0D9OF7nXid1POI5SZidFuG9CnlXbDfLqY/Q==} - prettier@3.7.4: - resolution: {integrity: sha512-v6UNi1+3hSlVvv8fSaoUbggEM5VErKmmpGA7Pl3HF8V6uKY7rvClBOJlH6yNwQtfTueNkGVpOv/mtWL9L4bgRA==} + prettier@3.8.1: + resolution: {integrity: sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==} engines: {node: '>=14'} hasBin: true @@ -3293,9 +3479,9 @@ packages: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} - readdirp@4.1.2: - resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} - engines: {node: '>= 14.18.0'} + readdirp@5.0.0: + resolution: {integrity: sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==} + engines: {node: '>= 20.19.0'} real-require@0.2.0: resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==} @@ -3334,13 +3520,13 @@ packages: resolution: {integrity: sha512-5Di9UC0+8h1L6ZD2d7awM7E/T4uA1fJRlx6zk/NvdCCVEoAnFqvHmCuNeIKoCeIixBX/q8uM+6ycDvF8woqosA==} engines: {node: '>= 0.8'} - rollup@4.55.1: - resolution: {integrity: sha512-wDv/Ht1BNHB4upNbK74s9usvl7hObDnvVzknxqY/E/O3X6rW1U1rV1aENEfJ54eFZDTNo7zv1f5N4edCluH7+A==} + rollup@4.56.0: + resolution: {integrity: sha512-9FwVqlgUHzbXtDg9RCMgodF3Ua4Na6Gau+Sdt9vyCN4RhHfVKX2DCHy3BjMLTDd47ITDhYAnTwGulWTblJSDLg==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true - rpc-websockets@9.3.2: - resolution: {integrity: sha512-VuW2xJDnl1k8n8kjbdRSWawPRkwaVqUQNjE1TdeTawf0y0abGhtVJFTXCLfgpgGDBkO/Fj6kny8Dc/nvOW78MA==} + rpc-websockets@9.3.3: + resolution: {integrity: sha512-OkCsBBzrwxX4DoSv4Zlf9DgXKRB0MzVfCFg5MC+fNnf9ktr4SMWjsri0VNZQlDbCnGcImT6KNEv4ZoxktQhdpA==} rxjs@7.8.2: resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==} @@ -3386,8 +3572,8 @@ packages: peerDependencies: seroval: ^1.0 - seroval-plugins@1.4.2: - resolution: {integrity: sha512-X7p4MEDTi+60o2sXZ4bnDBhgsUYDSkQEvzYZuJyFqWg9jcoPsHts5nrg5O956py2wyt28lUrBxk0M0/wU8URpA==} + seroval-plugins@1.5.0: + resolution: {integrity: sha512-EAHqADIQondwRZIdeW2I636zgsODzoBDwb3PT/+7TLDWyw1Dy/Xv7iGUIEXXav7usHDE9HVhOU61irI3EnyyHA==} engines: {node: '>=10'} peerDependencies: seroval: ^1.0 @@ -3396,8 +3582,8 @@ packages: resolution: {integrity: sha512-RbcPH1n5cfwKrru7v7+zrZvjLurgHhGyso3HTyGtRivGWgYjbOmGuivCQaORNELjNONoK35nj28EoWul9sb1zQ==} engines: {node: '>=10'} - seroval@1.4.2: - resolution: {integrity: sha512-N3HEHRCZYn3cQbsC4B5ldj9j+tHdf4JZoYPlcI4rRYu0Xy4qN8MQf1Z08EibzB0WpgRG5BGK08FTrmM66eSzKQ==} + seroval@1.5.0: + resolution: {integrity: sha512-OE4cvmJ1uSPrKorFIH9/w/Qwuvi/IMcGbv5RKgcJ/zjA/IohDLU6SVaxFN9FwajbP7nsX0dQqMDes1whk3y+yw==} engines: {node: '>=10'} set-blocking@2.0.0: @@ -3448,6 +3634,10 @@ packages: simple-swizzle@0.2.4: resolution: {integrity: sha512-nAu1WFPQSMNr2Zn9PGSZK9AGn4t/y97lEm+MXTtUDwfP0ksAIX4nO+6ruD9Jwut4C49SB1Ws+fbXsm/yScWOHw==} + sirv@3.0.2: + resolution: {integrity: sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==} + engines: {node: '>=18'} + slow-redact@0.3.2: resolution: {integrity: sha512-MseHyi2+E/hBRqdOi5COy6wZ7j7DxXRz9NkseavNYSvvWC06D8a5cidVZX3tcG5eCW3NIyVU4zT63hw0Q486jw==} @@ -3511,9 +3701,6 @@ packages: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} - strip-literal@3.1.0: - resolution: {integrity: sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==} - superstruct@2.0.2: resolution: {integrity: sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A==} engines: {node: '>=14.0.0'} @@ -3557,23 +3744,16 @@ packages: tinybench@2.9.0: resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} - tinyexec@0.3.2: - resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} + tinyexec@1.0.2: + resolution: {integrity: sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==} + engines: {node: '>=18'} tinyglobby@0.2.15: resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} engines: {node: '>=12.0.0'} - tinypool@1.1.1: - resolution: {integrity: sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==} - engines: {node: ^18.0.0 || >=20.0.0} - - tinyrainbow@2.0.0: - resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} - engines: {node: '>=14.0.0'} - - tinyspy@4.0.4: - resolution: {integrity: sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q==} + tinyrainbow@3.0.3: + resolution: {integrity: sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==} engines: {node: '>=14.0.0'} tldts-core@7.0.19: @@ -3594,6 +3774,10 @@ packages: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} + totalist@3.0.1: + resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} + engines: {node: '>=6'} + tough-cookie@6.0.0: resolution: {integrity: sha512-kXuRi1mtaKMrsLUxz3sQYvVl37B0Ns6MzfrtV5DvJceE9bPyspOqk9xxv7XbZWcfLWbFmm997vl83qUWVJA64w==} engines: {node: '>=16'} @@ -3634,8 +3818,8 @@ packages: engines: {node: '>=14.17'} hasBin: true - ufo@1.6.2: - resolution: {integrity: sha512-heMioaxBcG9+Znsda5Q8sQbWnLJSl98AFDXTO80wELWEzX3hordXsTdxrIfMQoO9IY1MEnoGoPjpoKpMj+Yx0Q==} + ufo@1.6.3: + resolution: {integrity: sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==} uint8arrays@3.1.1: resolution: {integrity: sha512-+QJa8QRnbdXVpHYjLoTpJIdCTiw9Ir62nocClWuXIq2JIh4Uta0cQsTSpFL678p2CN8B+XSApwcU+pQEqVpKWg==} @@ -3652,22 +3836,22 @@ packages: undici-types@5.26.5: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} - undici-types@6.21.0: - resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + undici-types@7.16.0: + resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} - undici-types@7.18.2: - resolution: {integrity: sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==} + undici-types@7.19.1: + resolution: {integrity: sha512-z2f4eae6/P3L9bogRUfLEZfRRxyrH4ssRq8s2/NOOgXEwwM5w0hsaj+mtDJPN7sBXQQNlagCzYUfjHywUiTETw==} - undici@7.18.2: - resolution: {integrity: sha512-y+8YjDFzWdQlSE9N5nzKMT3g4a5UBX1HKowfdXh0uvAnTaqqwqB92Jt4UXBAeKekDs5IaDKyJFR4X1gYVCgXcw==} + undici@7.19.1: + resolution: {integrity: sha512-Gpq0iNm5M6cQWlyHQv9MV+uOj1jWk7LpkoE5vSp/7zjb4zMdAcUD+VL5y0nH4p9EbUklq00eVIIX/XcDHzu5xg==} engines: {node: '>=20.18.1'} unplugin@2.3.11: resolution: {integrity: sha512-5uKD0nqiYVzlmCRs01Fhs2BdkEgBS3SAVP6ndrBsuK42iC2+JHyxM05Rm9G8+5mkmRtzMZGY8Ct5+mliZxU/Ww==} engines: {node: '>=18.12.0'} - unstorage@1.17.3: - resolution: {integrity: sha512-i+JYyy0DoKmQ3FximTHbGadmIYb8JEpq7lxUjnjeB702bCPum0vzo6oy5Mfu0lpqISw7hCyMW2yj4nWC8bqJ3Q==} + unstorage@1.17.4: + resolution: {integrity: sha512-fHK0yNg38tBiJKp/Vgsq4j0JEsCmgqH58HAn707S7zGkArbZsVr/CwINoi+nh3h98BRCwKvx1K3Xg9u3VV83sw==} peerDependencies: '@azure/app-configuration': ^1.8.0 '@azure/cosmos': ^4.2.0 @@ -3675,14 +3859,14 @@ packages: '@azure/identity': ^4.6.0 '@azure/keyvault-secrets': ^4.9.0 '@azure/storage-blob': ^12.26.0 - '@capacitor/preferences': ^6.0.3 || ^7.0.0 + '@capacitor/preferences': ^6 || ^7 || ^8 '@deno/kv': '>=0.9.0' '@netlify/blobs': ^6.5.0 || ^7.0.0 || ^8.1.0 || ^9.0.0 || ^10.0.0 '@planetscale/database': ^1.19.0 '@upstash/redis': ^1.34.3 '@vercel/blob': '>=0.27.1' '@vercel/functions': ^2.2.12 || ^3.0.0 - '@vercel/kv': ^1.0.1 + '@vercel/kv': ^1 || ^2 || ^3 aws4fetch: ^1.0.20 db0: '>=0.2.1' idb-keyval: ^6.2.1 @@ -3782,26 +3966,21 @@ packages: react: optional: true - viem@2.44.1: - resolution: {integrity: sha512-wfQda7PIJeF9hWiGKV628AfBwyYxyoc89OcgF4s4/chs2PY8ibUA7IG+DWdU4oAkjhHm9w47w1m2dwwOPBU+ng==} + viem@2.45.0: + resolution: {integrity: sha512-iVA9qrAgRdtpWa80lCZ6Jri6XzmLOwwA1wagX2HnKejKeliFLpON0KOdyfqvcy+gUpBVP59LBxP2aKiL3aj8fg==} peerDependencies: typescript: '>=5.0.4' peerDependenciesMeta: typescript: optional: true - vite-node@3.2.4: - resolution: {integrity: sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==} - engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} - hasBin: true - - vite-plugin-node-polyfills@0.24.0: - resolution: {integrity: sha512-GA9QKLH+vIM8NPaGA+o2t8PDfFUl32J8rUp1zQfMKVJQiNkOX4unE51tR6ppl6iKw5yOrDAdSH7r/UIFLCVhLw==} + vite-plugin-node-polyfills@0.25.0: + resolution: {integrity: sha512-rHZ324W3LhfGPxWwQb2N048TThB6nVvnipsqBUJEzh3R9xeK9KI3si+GMQxCuAcpPJBVf0LpDtJ+beYzB3/chg==} peerDependencies: vite: ^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 - vite@7.3.0: - resolution: {integrity: sha512-dZwN5L1VlUBewiP6H9s2+B3e3Jg96D0vzN+Ry73sOefebhYr9f94wwkMNN/9ouoU8pV1BqA1d1zGk8928cx0rg==} + vite@7.3.1: + resolution: {integrity: sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: @@ -3840,26 +4019,46 @@ packages: yaml: optional: true - vitest@3.2.4: - resolution: {integrity: sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==} - engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + vitest-browser-react@2.0.4: + resolution: {integrity: sha512-FQq2z519Bwp/rANaQXU+ox7M4d0q/bTQkF2pgwRAehE+pqJ6myYOLp+P2Dy2kuk+K4IQJHMyijMCSQ1da/xW8w==} + peerDependencies: + '@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 + vitest: ^4.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + vitest@4.0.18: + resolution: {integrity: sha512-hOQuK7h0FGKgBAas7v0mSAsnvrIgAvWmRFjmzpJ7SwFHH3g1k2u37JtYwOwmEKhK6ZO3v9ggDBBm0La1LCK4uQ==} + engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' - '@types/debug': ^4.1.12 - '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 - '@vitest/browser': 3.2.4 - '@vitest/ui': 3.2.4 + '@opentelemetry/api': ^1.9.0 + '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0 + '@vitest/browser-playwright': 4.0.18 + '@vitest/browser-preview': 4.0.18 + '@vitest/browser-webdriverio': 4.0.18 + '@vitest/ui': 4.0.18 happy-dom: '*' jsdom: '*' peerDependenciesMeta: '@edge-runtime/vm': optional: true - '@types/debug': + '@opentelemetry/api': optional: true '@types/node': optional: true - '@vitest/browser': + '@vitest/browser-playwright': + optional: true + '@vitest/browser-preview': + optional: true + '@vitest/browser-webdriverio': optional: true '@vitest/ui': optional: true @@ -3875,8 +4074,8 @@ packages: resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} engines: {node: '>=18'} - wagmi@3.3.2: - resolution: {integrity: sha512-WPHuWnEOWpOTko+P9f5pR22y7Ozjq6nJse79uBOk3j6ke4ipbGCzJtXfdh/QGQzYHQTU+Iv5HXjiYeabdjdvaQ==} + wagmi@3.4.1: + resolution: {integrity: sha512-v6svxWxfIqV82lXNclOMn+h0SYCtXtxf0HWCwyjIJPZH1SR7yRqyQguWUDQtzvNSefFQEoCk+MVOX9nTR5d4Zw==} peerDependencies: '@tanstack/react-query': '>=5.0.0' react: '>=18' @@ -3910,8 +4109,8 @@ packages: which-module@2.0.1: resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} - which-typed-array@1.1.19: - resolution: {integrity: sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==} + which-typed-array@1.1.20: + resolution: {integrity: sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==} engines: {node: '>= 0.4'} why-is-node-running@2.3.0: @@ -4085,8 +4284,16 @@ snapshots: js-tokens: 4.0.0 picocolors: 1.1.1 + '@babel/code-frame@7.28.6': + dependencies: + '@babel/helper-validator-identifier': 7.28.5 + js-tokens: 4.0.0 + picocolors: 1.1.1 + '@babel/compat-data@7.28.5': {} + '@babel/compat-data@7.28.6': {} + '@babel/core@7.28.5': dependencies: '@babel/code-frame': 7.27.1 @@ -4107,6 +4314,26 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/core@7.28.6': + dependencies: + '@babel/code-frame': 7.28.6 + '@babel/generator': 7.28.6 + '@babel/helper-compilation-targets': 7.28.6 + '@babel/helper-module-transforms': 7.28.6(@babel/core@7.28.6) + '@babel/helpers': 7.28.6 + '@babel/parser': 7.28.6 + '@babel/template': 7.28.6 + '@babel/traverse': 7.28.6 + '@babel/types': 7.28.6 + '@jridgewell/remapping': 2.3.5 + convert-source-map: 2.0.0 + debug: 4.4.3 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + '@babel/generator@7.28.5': dependencies: '@babel/parser': 7.28.5 @@ -4115,6 +4342,14 @@ snapshots: '@jridgewell/trace-mapping': 0.3.31 jsesc: 3.1.0 + '@babel/generator@7.28.6': + dependencies: + '@babel/parser': 7.28.6 + '@babel/types': 7.28.6 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + jsesc: 3.1.0 + '@babel/helper-compilation-targets@7.27.2': dependencies: '@babel/compat-data': 7.28.5 @@ -4123,6 +4358,14 @@ snapshots: lru-cache: 5.1.1 semver: 6.3.1 + '@babel/helper-compilation-targets@7.28.6': + dependencies: + '@babel/compat-data': 7.28.6 + '@babel/helper-validator-option': 7.27.1 + browserslist: 4.28.1 + lru-cache: 5.1.1 + semver: 6.3.1 + '@babel/helper-globals@7.28.0': {} '@babel/helper-module-imports@7.27.1': @@ -4132,6 +4375,13 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/helper-module-imports@7.28.6': + dependencies: + '@babel/traverse': 7.28.6 + '@babel/types': 7.28.6 + transitivePeerDependencies: + - supports-color + '@babel/helper-module-transforms@7.28.3(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 @@ -4141,8 +4391,19 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/helper-module-transforms@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-module-imports': 7.28.6 + '@babel/helper-validator-identifier': 7.28.5 + '@babel/traverse': 7.28.6 + transitivePeerDependencies: + - supports-color + '@babel/helper-plugin-utils@7.27.1': {} + '@babel/helper-plugin-utils@7.28.6': {} + '@babel/helper-string-parser@7.27.1': {} '@babel/helper-validator-identifier@7.28.5': {} @@ -4154,19 +4415,28 @@ snapshots: '@babel/template': 7.27.2 '@babel/types': 7.28.5 + '@babel/helpers@7.28.6': + dependencies: + '@babel/template': 7.28.6 + '@babel/types': 7.28.6 + '@babel/parser@7.28.5': dependencies: '@babel/types': 7.28.5 - '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.28.5)': + '@babel/parser@7.28.6': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/types': 7.28.6 - '@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.28.5)': + '@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-syntax-typescript@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-react-jsx-self@7.27.1(@babel/core@7.28.5)': dependencies: @@ -4180,12 +4450,20 @@ snapshots: '@babel/runtime@7.28.4': {} + '@babel/runtime@7.28.6': {} + '@babel/template@7.27.2': dependencies: '@babel/code-frame': 7.27.1 '@babel/parser': 7.28.5 '@babel/types': 7.28.5 + '@babel/template@7.28.6': + dependencies: + '@babel/code-frame': 7.28.6 + '@babel/parser': 7.28.6 + '@babel/types': 7.28.6 + '@babel/traverse@7.28.5': dependencies: '@babel/code-frame': 7.27.1 @@ -4198,22 +4476,39 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/traverse@7.28.6': + dependencies: + '@babel/code-frame': 7.28.6 + '@babel/generator': 7.28.6 + '@babel/helper-globals': 7.28.0 + '@babel/parser': 7.28.6 + '@babel/template': 7.28.6 + '@babel/types': 7.28.6 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + '@babel/types@7.28.5': dependencies: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.28.5 - '@base-org/account@2.4.0(@types/react@19.2.7)(bufferutil@4.1.0)(react@19.2.3)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.3))(utf-8-validate@5.0.10)(zod@3.25.76)': + '@babel/types@7.28.6': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 + + '@base-org/account@2.4.0(@types/react@19.2.9)(bufferutil@4.1.0)(react@19.2.3)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.3))(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: - '@coinbase/cdp-sdk': 1.43.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) + '@coinbase/cdp-sdk': 1.43.1(bufferutil@4.1.0)(typescript@5.9.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@5.9.3)(zod@3.25.76) preact: 10.24.2 - viem: 2.44.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - zustand: 5.0.3(@types/react@19.2.7)(react@19.2.3)(use-sync-external-store@1.4.0(react@19.2.3)) + viem: 2.45.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + zustand: 5.0.3(@types/react@19.2.9)(react@19.2.3)(use-sync-external-store@1.4.0(react@19.2.3)) transitivePeerDependencies: - '@types/react' - bufferutil @@ -4228,10 +4523,10 @@ snapshots: - zod optional: true - '@base-ui/react@1.0.0(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + '@base-ui/react@1.1.0(@types/react@19.2.9)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': dependencies: - '@babel/runtime': 7.28.4 - '@base-ui/utils': 0.2.3(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@babel/runtime': 7.28.6 + '@base-ui/utils': 0.2.4(@types/react@19.2.9)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) '@floating-ui/react-dom': 2.1.6(react-dom@19.2.3(react@19.2.3))(react@19.2.3) '@floating-ui/utils': 0.2.10 react: 19.2.3 @@ -4240,69 +4535,69 @@ snapshots: tabbable: 6.4.0 use-sync-external-store: 1.6.0(react@19.2.3) optionalDependencies: - '@types/react': 19.2.7 + '@types/react': 19.2.9 - '@base-ui/utils@0.2.3(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + '@base-ui/utils@0.2.4(@types/react@19.2.9)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': dependencies: - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.28.6 '@floating-ui/utils': 0.2.10 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) reselect: 5.1.1 use-sync-external-store: 1.6.0(react@19.2.3) optionalDependencies: - '@types/react': 19.2.7 + '@types/react': 19.2.9 - '@biomejs/biome@2.3.11': + '@biomejs/biome@2.3.12': optionalDependencies: - '@biomejs/cli-darwin-arm64': 2.3.11 - '@biomejs/cli-darwin-x64': 2.3.11 - '@biomejs/cli-linux-arm64': 2.3.11 - '@biomejs/cli-linux-arm64-musl': 2.3.11 - '@biomejs/cli-linux-x64': 2.3.11 - '@biomejs/cli-linux-x64-musl': 2.3.11 - '@biomejs/cli-win32-arm64': 2.3.11 - '@biomejs/cli-win32-x64': 2.3.11 + '@biomejs/cli-darwin-arm64': 2.3.12 + '@biomejs/cli-darwin-x64': 2.3.12 + '@biomejs/cli-linux-arm64': 2.3.12 + '@biomejs/cli-linux-arm64-musl': 2.3.12 + '@biomejs/cli-linux-x64': 2.3.12 + '@biomejs/cli-linux-x64-musl': 2.3.12 + '@biomejs/cli-win32-arm64': 2.3.12 + '@biomejs/cli-win32-x64': 2.3.12 - '@biomejs/cli-darwin-arm64@2.3.11': + '@biomejs/cli-darwin-arm64@2.3.12': optional: true - '@biomejs/cli-darwin-x64@2.3.11': + '@biomejs/cli-darwin-x64@2.3.12': optional: true - '@biomejs/cli-linux-arm64-musl@2.3.11': + '@biomejs/cli-linux-arm64-musl@2.3.12': optional: true - '@biomejs/cli-linux-arm64@2.3.11': + '@biomejs/cli-linux-arm64@2.3.12': optional: true - '@biomejs/cli-linux-x64-musl@2.3.11': + '@biomejs/cli-linux-x64-musl@2.3.12': optional: true - '@biomejs/cli-linux-x64@2.3.11': + '@biomejs/cli-linux-x64@2.3.12': optional: true - '@biomejs/cli-win32-arm64@2.3.11': + '@biomejs/cli-win32-arm64@2.3.12': optional: true - '@biomejs/cli-win32-x64@2.3.11': + '@biomejs/cli-win32-x64@2.3.12': optional: true '@canvas/image-data@1.1.0': {} - '@coinbase/cdp-sdk@1.43.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)': + '@coinbase/cdp-sdk@1.43.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)': dependencies: - '@solana-program/system': 0.10.0(@solana/kit@5.3.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)) - '@solana-program/token': 0.9.0(@solana/kit@5.3.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)) - '@solana/kit': 5.3.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) + '@solana-program/system': 0.10.0(@solana/kit@5.4.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)) + '@solana-program/token': 0.9.0(@solana/kit@5.4.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)) + '@solana/kit': 5.4.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) abitype: 1.0.6(typescript@5.9.3)(zod@3.25.76) - axios: 1.13.2 - axios-retry: 4.5.0(axios@1.13.2) + axios: 1.13.3 + axios-retry: 4.5.0(axios@1.13.3) jose: 6.1.3 md5: 2.3.0 uncrypto: 0.1.3 - viem: 2.44.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + viem: 2.45.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) zod: 3.25.76 transitivePeerDependencies: - bufferutil @@ -4335,10 +4630,10 @@ snapshots: '@csstools/css-tokenizer@3.0.4': {} - '@effect-atom/atom-react@0.4.4(@effect/experimental@0.58.0(@effect/platform@0.94.1(effect@3.19.14))(effect@3.19.14))(@effect/platform@0.94.1(effect@3.19.14))(@effect/rpc@0.73.0(@effect/platform@0.94.1(effect@3.19.14))(effect@3.19.14))(effect@3.19.14)(react@19.2.3)(scheduler@0.27.0)': + '@effect-atom/atom-react@0.4.6(@effect/experimental@0.58.0(@effect/platform@0.94.2(effect@3.19.15))(effect@3.19.15))(@effect/platform@0.94.2(effect@3.19.15))(@effect/rpc@0.73.0(@effect/platform@0.94.2(effect@3.19.15))(effect@3.19.15))(effect@3.19.15)(react@19.2.3)(scheduler@0.27.0)': dependencies: - '@effect-atom/atom': 0.4.11(@effect/experimental@0.58.0(@effect/platform@0.94.1(effect@3.19.14))(effect@3.19.14))(@effect/platform@0.94.1(effect@3.19.14))(@effect/rpc@0.73.0(@effect/platform@0.94.1(effect@3.19.14))(effect@3.19.14))(effect@3.19.14) - effect: 3.19.14 + '@effect-atom/atom': 0.4.13(@effect/experimental@0.58.0(@effect/platform@0.94.2(effect@3.19.15))(effect@3.19.15))(@effect/platform@0.94.2(effect@3.19.15))(@effect/rpc@0.73.0(@effect/platform@0.94.2(effect@3.19.15))(effect@3.19.15))(effect@3.19.15) + effect: 3.19.15 react: 19.2.3 scheduler: 0.27.0 transitivePeerDependencies: @@ -4346,85 +4641,85 @@ snapshots: - '@effect/platform' - '@effect/rpc' - '@effect-atom/atom@0.4.11(@effect/experimental@0.58.0(@effect/platform@0.94.1(effect@3.19.14))(effect@3.19.14))(@effect/platform@0.94.1(effect@3.19.14))(@effect/rpc@0.73.0(@effect/platform@0.94.1(effect@3.19.14))(effect@3.19.14))(effect@3.19.14)': + '@effect-atom/atom@0.4.13(@effect/experimental@0.58.0(@effect/platform@0.94.2(effect@3.19.15))(effect@3.19.15))(@effect/platform@0.94.2(effect@3.19.15))(@effect/rpc@0.73.0(@effect/platform@0.94.2(effect@3.19.15))(effect@3.19.15))(effect@3.19.15)': dependencies: - '@effect/experimental': 0.58.0(@effect/platform@0.94.1(effect@3.19.14))(effect@3.19.14) - '@effect/platform': 0.94.1(effect@3.19.14) - '@effect/rpc': 0.73.0(@effect/platform@0.94.1(effect@3.19.14))(effect@3.19.14) - effect: 3.19.14 + '@effect/experimental': 0.58.0(@effect/platform@0.94.2(effect@3.19.15))(effect@3.19.15) + '@effect/platform': 0.94.2(effect@3.19.15) + '@effect/rpc': 0.73.0(@effect/platform@0.94.2(effect@3.19.15))(effect@3.19.15) + effect: 3.19.15 - '@effect/cluster@0.56.1(@effect/platform@0.94.1(effect@3.19.14))(@effect/rpc@0.73.0(@effect/platform@0.94.1(effect@3.19.14))(effect@3.19.14))(@effect/sql@0.49.0(@effect/experimental@0.58.0(@effect/platform@0.94.1(effect@3.19.14))(effect@3.19.14))(@effect/platform@0.94.1(effect@3.19.14))(effect@3.19.14))(@effect/workflow@0.16.0(@effect/experimental@0.58.0(@effect/platform@0.94.1(effect@3.19.14))(effect@3.19.14))(@effect/platform@0.94.1(effect@3.19.14))(@effect/rpc@0.73.0(@effect/platform@0.94.1(effect@3.19.14))(effect@3.19.14))(effect@3.19.14))(effect@3.19.14)': + '@effect/cluster@0.56.1(@effect/platform@0.94.2(effect@3.19.15))(@effect/rpc@0.73.0(@effect/platform@0.94.2(effect@3.19.15))(effect@3.19.15))(@effect/sql@0.49.0(@effect/experimental@0.58.0(@effect/platform@0.94.2(effect@3.19.15))(effect@3.19.15))(@effect/platform@0.94.2(effect@3.19.15))(effect@3.19.15))(@effect/workflow@0.16.0(@effect/experimental@0.58.0(@effect/platform@0.94.2(effect@3.19.15))(effect@3.19.15))(@effect/platform@0.94.2(effect@3.19.15))(@effect/rpc@0.73.0(@effect/platform@0.94.2(effect@3.19.15))(effect@3.19.15))(effect@3.19.15))(effect@3.19.15)': dependencies: - '@effect/platform': 0.94.1(effect@3.19.14) - '@effect/rpc': 0.73.0(@effect/platform@0.94.1(effect@3.19.14))(effect@3.19.14) - '@effect/sql': 0.49.0(@effect/experimental@0.58.0(@effect/platform@0.94.1(effect@3.19.14))(effect@3.19.14))(@effect/platform@0.94.1(effect@3.19.14))(effect@3.19.14) - '@effect/workflow': 0.16.0(@effect/experimental@0.58.0(@effect/platform@0.94.1(effect@3.19.14))(effect@3.19.14))(@effect/platform@0.94.1(effect@3.19.14))(@effect/rpc@0.73.0(@effect/platform@0.94.1(effect@3.19.14))(effect@3.19.14))(effect@3.19.14) - effect: 3.19.14 + '@effect/platform': 0.94.2(effect@3.19.15) + '@effect/rpc': 0.73.0(@effect/platform@0.94.2(effect@3.19.15))(effect@3.19.15) + '@effect/sql': 0.49.0(@effect/experimental@0.58.0(@effect/platform@0.94.2(effect@3.19.15))(effect@3.19.15))(@effect/platform@0.94.2(effect@3.19.15))(effect@3.19.15) + '@effect/workflow': 0.16.0(@effect/experimental@0.58.0(@effect/platform@0.94.2(effect@3.19.15))(effect@3.19.15))(@effect/platform@0.94.2(effect@3.19.15))(@effect/rpc@0.73.0(@effect/platform@0.94.2(effect@3.19.15))(effect@3.19.15))(effect@3.19.15) + effect: 3.19.15 kubernetes-types: 1.30.0 - '@effect/experimental@0.58.0(@effect/platform@0.94.1(effect@3.19.14))(effect@3.19.14)': + '@effect/experimental@0.58.0(@effect/platform@0.94.2(effect@3.19.15))(effect@3.19.15)': dependencies: - '@effect/platform': 0.94.1(effect@3.19.14) - effect: 3.19.14 + '@effect/platform': 0.94.2(effect@3.19.15) + effect: 3.19.15 uuid: 11.1.0 - '@effect/language-service@0.64.1': {} + '@effect/language-service@0.72.0': {} - '@effect/platform-node-shared@0.57.0(@effect/cluster@0.56.1(@effect/platform@0.94.1(effect@3.19.14))(@effect/rpc@0.73.0(@effect/platform@0.94.1(effect@3.19.14))(effect@3.19.14))(@effect/sql@0.49.0(@effect/experimental@0.58.0(@effect/platform@0.94.1(effect@3.19.14))(effect@3.19.14))(@effect/platform@0.94.1(effect@3.19.14))(effect@3.19.14))(@effect/workflow@0.16.0(@effect/experimental@0.58.0(@effect/platform@0.94.1(effect@3.19.14))(effect@3.19.14))(@effect/platform@0.94.1(effect@3.19.14))(@effect/rpc@0.73.0(@effect/platform@0.94.1(effect@3.19.14))(effect@3.19.14))(effect@3.19.14))(effect@3.19.14))(@effect/platform@0.94.1(effect@3.19.14))(@effect/rpc@0.73.0(@effect/platform@0.94.1(effect@3.19.14))(effect@3.19.14))(@effect/sql@0.49.0(@effect/experimental@0.58.0(@effect/platform@0.94.1(effect@3.19.14))(effect@3.19.14))(@effect/platform@0.94.1(effect@3.19.14))(effect@3.19.14))(bufferutil@4.1.0)(effect@3.19.14)(utf-8-validate@5.0.10)': + '@effect/platform-node-shared@0.57.1(@effect/cluster@0.56.1(@effect/platform@0.94.2(effect@3.19.15))(@effect/rpc@0.73.0(@effect/platform@0.94.2(effect@3.19.15))(effect@3.19.15))(@effect/sql@0.49.0(@effect/experimental@0.58.0(@effect/platform@0.94.2(effect@3.19.15))(effect@3.19.15))(@effect/platform@0.94.2(effect@3.19.15))(effect@3.19.15))(@effect/workflow@0.16.0(@effect/experimental@0.58.0(@effect/platform@0.94.2(effect@3.19.15))(effect@3.19.15))(@effect/platform@0.94.2(effect@3.19.15))(@effect/rpc@0.73.0(@effect/platform@0.94.2(effect@3.19.15))(effect@3.19.15))(effect@3.19.15))(effect@3.19.15))(@effect/platform@0.94.2(effect@3.19.15))(@effect/rpc@0.73.0(@effect/platform@0.94.2(effect@3.19.15))(effect@3.19.15))(@effect/sql@0.49.0(@effect/experimental@0.58.0(@effect/platform@0.94.2(effect@3.19.15))(effect@3.19.15))(@effect/platform@0.94.2(effect@3.19.15))(effect@3.19.15))(bufferutil@4.1.0)(effect@3.19.15)(utf-8-validate@5.0.10)': dependencies: - '@effect/cluster': 0.56.1(@effect/platform@0.94.1(effect@3.19.14))(@effect/rpc@0.73.0(@effect/platform@0.94.1(effect@3.19.14))(effect@3.19.14))(@effect/sql@0.49.0(@effect/experimental@0.58.0(@effect/platform@0.94.1(effect@3.19.14))(effect@3.19.14))(@effect/platform@0.94.1(effect@3.19.14))(effect@3.19.14))(@effect/workflow@0.16.0(@effect/experimental@0.58.0(@effect/platform@0.94.1(effect@3.19.14))(effect@3.19.14))(@effect/platform@0.94.1(effect@3.19.14))(@effect/rpc@0.73.0(@effect/platform@0.94.1(effect@3.19.14))(effect@3.19.14))(effect@3.19.14))(effect@3.19.14) - '@effect/platform': 0.94.1(effect@3.19.14) - '@effect/rpc': 0.73.0(@effect/platform@0.94.1(effect@3.19.14))(effect@3.19.14) - '@effect/sql': 0.49.0(@effect/experimental@0.58.0(@effect/platform@0.94.1(effect@3.19.14))(effect@3.19.14))(@effect/platform@0.94.1(effect@3.19.14))(effect@3.19.14) - '@parcel/watcher': 2.5.1 - effect: 3.19.14 + '@effect/cluster': 0.56.1(@effect/platform@0.94.2(effect@3.19.15))(@effect/rpc@0.73.0(@effect/platform@0.94.2(effect@3.19.15))(effect@3.19.15))(@effect/sql@0.49.0(@effect/experimental@0.58.0(@effect/platform@0.94.2(effect@3.19.15))(effect@3.19.15))(@effect/platform@0.94.2(effect@3.19.15))(effect@3.19.15))(@effect/workflow@0.16.0(@effect/experimental@0.58.0(@effect/platform@0.94.2(effect@3.19.15))(effect@3.19.15))(@effect/platform@0.94.2(effect@3.19.15))(@effect/rpc@0.73.0(@effect/platform@0.94.2(effect@3.19.15))(effect@3.19.15))(effect@3.19.15))(effect@3.19.15) + '@effect/platform': 0.94.2(effect@3.19.15) + '@effect/rpc': 0.73.0(@effect/platform@0.94.2(effect@3.19.15))(effect@3.19.15) + '@effect/sql': 0.49.0(@effect/experimental@0.58.0(@effect/platform@0.94.2(effect@3.19.15))(effect@3.19.15))(@effect/platform@0.94.2(effect@3.19.15))(effect@3.19.15) + '@parcel/watcher': 2.5.6 + effect: 3.19.15 multipasta: 0.2.7 ws: 8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - utf-8-validate - '@effect/platform-node@0.104.0(@effect/cluster@0.56.1(@effect/platform@0.94.1(effect@3.19.14))(@effect/rpc@0.73.0(@effect/platform@0.94.1(effect@3.19.14))(effect@3.19.14))(@effect/sql@0.49.0(@effect/experimental@0.58.0(@effect/platform@0.94.1(effect@3.19.14))(effect@3.19.14))(@effect/platform@0.94.1(effect@3.19.14))(effect@3.19.14))(@effect/workflow@0.16.0(@effect/experimental@0.58.0(@effect/platform@0.94.1(effect@3.19.14))(effect@3.19.14))(@effect/platform@0.94.1(effect@3.19.14))(@effect/rpc@0.73.0(@effect/platform@0.94.1(effect@3.19.14))(effect@3.19.14))(effect@3.19.14))(effect@3.19.14))(@effect/platform@0.94.1(effect@3.19.14))(@effect/rpc@0.73.0(@effect/platform@0.94.1(effect@3.19.14))(effect@3.19.14))(@effect/sql@0.49.0(@effect/experimental@0.58.0(@effect/platform@0.94.1(effect@3.19.14))(effect@3.19.14))(@effect/platform@0.94.1(effect@3.19.14))(effect@3.19.14))(bufferutil@4.1.0)(effect@3.19.14)(utf-8-validate@5.0.10)': + '@effect/platform-node@0.104.1(@effect/cluster@0.56.1(@effect/platform@0.94.2(effect@3.19.15))(@effect/rpc@0.73.0(@effect/platform@0.94.2(effect@3.19.15))(effect@3.19.15))(@effect/sql@0.49.0(@effect/experimental@0.58.0(@effect/platform@0.94.2(effect@3.19.15))(effect@3.19.15))(@effect/platform@0.94.2(effect@3.19.15))(effect@3.19.15))(@effect/workflow@0.16.0(@effect/experimental@0.58.0(@effect/platform@0.94.2(effect@3.19.15))(effect@3.19.15))(@effect/platform@0.94.2(effect@3.19.15))(@effect/rpc@0.73.0(@effect/platform@0.94.2(effect@3.19.15))(effect@3.19.15))(effect@3.19.15))(effect@3.19.15))(@effect/platform@0.94.2(effect@3.19.15))(@effect/rpc@0.73.0(@effect/platform@0.94.2(effect@3.19.15))(effect@3.19.15))(@effect/sql@0.49.0(@effect/experimental@0.58.0(@effect/platform@0.94.2(effect@3.19.15))(effect@3.19.15))(@effect/platform@0.94.2(effect@3.19.15))(effect@3.19.15))(bufferutil@4.1.0)(effect@3.19.15)(utf-8-validate@5.0.10)': dependencies: - '@effect/cluster': 0.56.1(@effect/platform@0.94.1(effect@3.19.14))(@effect/rpc@0.73.0(@effect/platform@0.94.1(effect@3.19.14))(effect@3.19.14))(@effect/sql@0.49.0(@effect/experimental@0.58.0(@effect/platform@0.94.1(effect@3.19.14))(effect@3.19.14))(@effect/platform@0.94.1(effect@3.19.14))(effect@3.19.14))(@effect/workflow@0.16.0(@effect/experimental@0.58.0(@effect/platform@0.94.1(effect@3.19.14))(effect@3.19.14))(@effect/platform@0.94.1(effect@3.19.14))(@effect/rpc@0.73.0(@effect/platform@0.94.1(effect@3.19.14))(effect@3.19.14))(effect@3.19.14))(effect@3.19.14) - '@effect/platform': 0.94.1(effect@3.19.14) - '@effect/platform-node-shared': 0.57.0(@effect/cluster@0.56.1(@effect/platform@0.94.1(effect@3.19.14))(@effect/rpc@0.73.0(@effect/platform@0.94.1(effect@3.19.14))(effect@3.19.14))(@effect/sql@0.49.0(@effect/experimental@0.58.0(@effect/platform@0.94.1(effect@3.19.14))(effect@3.19.14))(@effect/platform@0.94.1(effect@3.19.14))(effect@3.19.14))(@effect/workflow@0.16.0(@effect/experimental@0.58.0(@effect/platform@0.94.1(effect@3.19.14))(effect@3.19.14))(@effect/platform@0.94.1(effect@3.19.14))(@effect/rpc@0.73.0(@effect/platform@0.94.1(effect@3.19.14))(effect@3.19.14))(effect@3.19.14))(effect@3.19.14))(@effect/platform@0.94.1(effect@3.19.14))(@effect/rpc@0.73.0(@effect/platform@0.94.1(effect@3.19.14))(effect@3.19.14))(@effect/sql@0.49.0(@effect/experimental@0.58.0(@effect/platform@0.94.1(effect@3.19.14))(effect@3.19.14))(@effect/platform@0.94.1(effect@3.19.14))(effect@3.19.14))(bufferutil@4.1.0)(effect@3.19.14)(utf-8-validate@5.0.10) - '@effect/rpc': 0.73.0(@effect/platform@0.94.1(effect@3.19.14))(effect@3.19.14) - '@effect/sql': 0.49.0(@effect/experimental@0.58.0(@effect/platform@0.94.1(effect@3.19.14))(effect@3.19.14))(@effect/platform@0.94.1(effect@3.19.14))(effect@3.19.14) - effect: 3.19.14 + '@effect/cluster': 0.56.1(@effect/platform@0.94.2(effect@3.19.15))(@effect/rpc@0.73.0(@effect/platform@0.94.2(effect@3.19.15))(effect@3.19.15))(@effect/sql@0.49.0(@effect/experimental@0.58.0(@effect/platform@0.94.2(effect@3.19.15))(effect@3.19.15))(@effect/platform@0.94.2(effect@3.19.15))(effect@3.19.15))(@effect/workflow@0.16.0(@effect/experimental@0.58.0(@effect/platform@0.94.2(effect@3.19.15))(effect@3.19.15))(@effect/platform@0.94.2(effect@3.19.15))(@effect/rpc@0.73.0(@effect/platform@0.94.2(effect@3.19.15))(effect@3.19.15))(effect@3.19.15))(effect@3.19.15) + '@effect/platform': 0.94.2(effect@3.19.15) + '@effect/platform-node-shared': 0.57.1(@effect/cluster@0.56.1(@effect/platform@0.94.2(effect@3.19.15))(@effect/rpc@0.73.0(@effect/platform@0.94.2(effect@3.19.15))(effect@3.19.15))(@effect/sql@0.49.0(@effect/experimental@0.58.0(@effect/platform@0.94.2(effect@3.19.15))(effect@3.19.15))(@effect/platform@0.94.2(effect@3.19.15))(effect@3.19.15))(@effect/workflow@0.16.0(@effect/experimental@0.58.0(@effect/platform@0.94.2(effect@3.19.15))(effect@3.19.15))(@effect/platform@0.94.2(effect@3.19.15))(@effect/rpc@0.73.0(@effect/platform@0.94.2(effect@3.19.15))(effect@3.19.15))(effect@3.19.15))(effect@3.19.15))(@effect/platform@0.94.2(effect@3.19.15))(@effect/rpc@0.73.0(@effect/platform@0.94.2(effect@3.19.15))(effect@3.19.15))(@effect/sql@0.49.0(@effect/experimental@0.58.0(@effect/platform@0.94.2(effect@3.19.15))(effect@3.19.15))(@effect/platform@0.94.2(effect@3.19.15))(effect@3.19.15))(bufferutil@4.1.0)(effect@3.19.15)(utf-8-validate@5.0.10) + '@effect/rpc': 0.73.0(@effect/platform@0.94.2(effect@3.19.15))(effect@3.19.15) + '@effect/sql': 0.49.0(@effect/experimental@0.58.0(@effect/platform@0.94.2(effect@3.19.15))(effect@3.19.15))(@effect/platform@0.94.2(effect@3.19.15))(effect@3.19.15) + effect: 3.19.15 mime: 3.0.0 - undici: 7.18.2 + undici: 7.19.1 ws: 8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - utf-8-validate - '@effect/platform@0.94.1(effect@3.19.14)': + '@effect/platform@0.94.2(effect@3.19.15)': dependencies: - effect: 3.19.14 + effect: 3.19.15 find-my-way-ts: 0.1.6 msgpackr: 1.11.8 multipasta: 0.2.7 - '@effect/rpc@0.73.0(@effect/platform@0.94.1(effect@3.19.14))(effect@3.19.14)': + '@effect/rpc@0.73.0(@effect/platform@0.94.2(effect@3.19.15))(effect@3.19.15)': dependencies: - '@effect/platform': 0.94.1(effect@3.19.14) - effect: 3.19.14 + '@effect/platform': 0.94.2(effect@3.19.15) + effect: 3.19.15 msgpackr: 1.11.8 - '@effect/sql@0.49.0(@effect/experimental@0.58.0(@effect/platform@0.94.1(effect@3.19.14))(effect@3.19.14))(@effect/platform@0.94.1(effect@3.19.14))(effect@3.19.14)': + '@effect/sql@0.49.0(@effect/experimental@0.58.0(@effect/platform@0.94.2(effect@3.19.15))(effect@3.19.15))(@effect/platform@0.94.2(effect@3.19.15))(effect@3.19.15)': dependencies: - '@effect/experimental': 0.58.0(@effect/platform@0.94.1(effect@3.19.14))(effect@3.19.14) - '@effect/platform': 0.94.1(effect@3.19.14) - effect: 3.19.14 + '@effect/experimental': 0.58.0(@effect/platform@0.94.2(effect@3.19.15))(effect@3.19.15) + '@effect/platform': 0.94.2(effect@3.19.15) + effect: 3.19.15 uuid: 11.1.0 - '@effect/workflow@0.16.0(@effect/experimental@0.58.0(@effect/platform@0.94.1(effect@3.19.14))(effect@3.19.14))(@effect/platform@0.94.1(effect@3.19.14))(@effect/rpc@0.73.0(@effect/platform@0.94.1(effect@3.19.14))(effect@3.19.14))(effect@3.19.14)': + '@effect/workflow@0.16.0(@effect/experimental@0.58.0(@effect/platform@0.94.2(effect@3.19.15))(effect@3.19.15))(@effect/platform@0.94.2(effect@3.19.15))(@effect/rpc@0.73.0(@effect/platform@0.94.2(effect@3.19.15))(effect@3.19.15))(effect@3.19.15)': dependencies: - '@effect/experimental': 0.58.0(@effect/platform@0.94.1(effect@3.19.14))(effect@3.19.14) - '@effect/platform': 0.94.1(effect@3.19.14) - '@effect/rpc': 0.73.0(@effect/platform@0.94.1(effect@3.19.14))(effect@3.19.14) - effect: 3.19.14 + '@effect/experimental': 0.58.0(@effect/platform@0.94.2(effect@3.19.15))(effect@3.19.15) + '@effect/platform': 0.94.2(effect@3.19.15) + '@effect/rpc': 0.73.0(@effect/platform@0.94.2(effect@3.19.15))(effect@3.19.15) + effect: 3.19.15 '@emnapi/runtime@1.8.1': dependencies: @@ -4663,27 +4958,27 @@ snapshots: '@lit-labs/ssr-dom-shim@1.5.1': {} - '@lit/react@1.0.8(@types/react@19.2.7)': + '@lit/react@1.0.8(@types/react@19.2.9)': dependencies: - '@types/react': 19.2.7 + '@types/react': 19.2.9 optional: true '@lit/reactive-element@2.1.2': dependencies: '@lit-labs/ssr-dom-shim': 1.5.1 - '@lucas-barake/effect-form-react@0.14.0(@effect-atom/atom-react@0.4.4(@effect/experimental@0.58.0(@effect/platform@0.94.1(effect@3.19.14))(effect@3.19.14))(@effect/platform@0.94.1(effect@3.19.14))(@effect/rpc@0.73.0(@effect/platform@0.94.1(effect@3.19.14))(effect@3.19.14))(effect@3.19.14)(react@19.2.3)(scheduler@0.27.0))(@effect-atom/atom@0.4.11(@effect/experimental@0.58.0(@effect/platform@0.94.1(effect@3.19.14))(effect@3.19.14))(@effect/platform@0.94.1(effect@3.19.14))(@effect/rpc@0.73.0(@effect/platform@0.94.1(effect@3.19.14))(effect@3.19.14))(effect@3.19.14))(effect@3.19.14)(react@19.2.3)': + '@lucas-barake/effect-form-react@0.14.0(@effect-atom/atom-react@0.4.6(@effect/experimental@0.58.0(@effect/platform@0.94.2(effect@3.19.15))(effect@3.19.15))(@effect/platform@0.94.2(effect@3.19.15))(@effect/rpc@0.73.0(@effect/platform@0.94.2(effect@3.19.15))(effect@3.19.15))(effect@3.19.15)(react@19.2.3)(scheduler@0.27.0))(@effect-atom/atom@0.4.13(@effect/experimental@0.58.0(@effect/platform@0.94.2(effect@3.19.15))(effect@3.19.15))(@effect/platform@0.94.2(effect@3.19.15))(@effect/rpc@0.73.0(@effect/platform@0.94.2(effect@3.19.15))(effect@3.19.15))(effect@3.19.15))(effect@3.19.15)(react@19.2.3)': dependencies: - '@effect-atom/atom': 0.4.11(@effect/experimental@0.58.0(@effect/platform@0.94.1(effect@3.19.14))(effect@3.19.14))(@effect/platform@0.94.1(effect@3.19.14))(@effect/rpc@0.73.0(@effect/platform@0.94.1(effect@3.19.14))(effect@3.19.14))(effect@3.19.14) - '@effect-atom/atom-react': 0.4.4(@effect/experimental@0.58.0(@effect/platform@0.94.1(effect@3.19.14))(effect@3.19.14))(@effect/platform@0.94.1(effect@3.19.14))(@effect/rpc@0.73.0(@effect/platform@0.94.1(effect@3.19.14))(effect@3.19.14))(effect@3.19.14)(react@19.2.3)(scheduler@0.27.0) - '@lucas-barake/effect-form': 0.14.0(@effect-atom/atom@0.4.11(@effect/experimental@0.58.0(@effect/platform@0.94.1(effect@3.19.14))(effect@3.19.14))(@effect/platform@0.94.1(effect@3.19.14))(@effect/rpc@0.73.0(@effect/platform@0.94.1(effect@3.19.14))(effect@3.19.14))(effect@3.19.14))(effect@3.19.14) - effect: 3.19.14 + '@effect-atom/atom': 0.4.13(@effect/experimental@0.58.0(@effect/platform@0.94.2(effect@3.19.15))(effect@3.19.15))(@effect/platform@0.94.2(effect@3.19.15))(@effect/rpc@0.73.0(@effect/platform@0.94.2(effect@3.19.15))(effect@3.19.15))(effect@3.19.15) + '@effect-atom/atom-react': 0.4.6(@effect/experimental@0.58.0(@effect/platform@0.94.2(effect@3.19.15))(effect@3.19.15))(@effect/platform@0.94.2(effect@3.19.15))(@effect/rpc@0.73.0(@effect/platform@0.94.2(effect@3.19.15))(effect@3.19.15))(effect@3.19.15)(react@19.2.3)(scheduler@0.27.0) + '@lucas-barake/effect-form': 0.14.0(@effect-atom/atom@0.4.13(@effect/experimental@0.58.0(@effect/platform@0.94.2(effect@3.19.15))(effect@3.19.15))(@effect/platform@0.94.2(effect@3.19.15))(@effect/rpc@0.73.0(@effect/platform@0.94.2(effect@3.19.15))(effect@3.19.15))(effect@3.19.15))(effect@3.19.15) + effect: 3.19.15 react: 19.2.3 - '@lucas-barake/effect-form@0.14.0(@effect-atom/atom@0.4.11(@effect/experimental@0.58.0(@effect/platform@0.94.1(effect@3.19.14))(effect@3.19.14))(@effect/platform@0.94.1(effect@3.19.14))(@effect/rpc@0.73.0(@effect/platform@0.94.1(effect@3.19.14))(effect@3.19.14))(effect@3.19.14))(effect@3.19.14)': + '@lucas-barake/effect-form@0.14.0(@effect-atom/atom@0.4.13(@effect/experimental@0.58.0(@effect/platform@0.94.2(effect@3.19.15))(effect@3.19.15))(@effect/platform@0.94.2(effect@3.19.15))(@effect/rpc@0.73.0(@effect/platform@0.94.2(effect@3.19.15))(effect@3.19.15))(effect@3.19.15))(effect@3.19.15)': dependencies: - '@effect-atom/atom': 0.4.11(@effect/experimental@0.58.0(@effect/platform@0.94.1(effect@3.19.14))(effect@3.19.14))(@effect/platform@0.94.1(effect@3.19.14))(@effect/rpc@0.73.0(@effect/platform@0.94.1(effect@3.19.14))(effect@3.19.14))(effect@3.19.14) - effect: 3.19.14 + '@effect-atom/atom': 0.4.13(@effect/experimental@0.58.0(@effect/platform@0.94.2(effect@3.19.15))(effect@3.19.15))(@effect/platform@0.94.2(effect@3.19.15))(@effect/rpc@0.73.0(@effect/platform@0.94.2(effect@3.19.15))(effect@3.19.15))(effect@3.19.15) + effect: 3.19.15 '@msgpack/msgpack@3.1.2': {} @@ -4730,90 +5025,92 @@ snapshots: '@noble/secp256k1@1.7.1': {} - '@parcel/watcher-android-arm64@2.5.1': + '@parcel/watcher-android-arm64@2.5.6': optional: true - '@parcel/watcher-darwin-arm64@2.5.1': + '@parcel/watcher-darwin-arm64@2.5.6': optional: true - '@parcel/watcher-darwin-x64@2.5.1': + '@parcel/watcher-darwin-x64@2.5.6': optional: true - '@parcel/watcher-freebsd-x64@2.5.1': + '@parcel/watcher-freebsd-x64@2.5.6': optional: true - '@parcel/watcher-linux-arm-glibc@2.5.1': + '@parcel/watcher-linux-arm-glibc@2.5.6': optional: true - '@parcel/watcher-linux-arm-musl@2.5.1': + '@parcel/watcher-linux-arm-musl@2.5.6': optional: true - '@parcel/watcher-linux-arm64-glibc@2.5.1': + '@parcel/watcher-linux-arm64-glibc@2.5.6': optional: true - '@parcel/watcher-linux-arm64-musl@2.5.1': + '@parcel/watcher-linux-arm64-musl@2.5.6': optional: true - '@parcel/watcher-linux-x64-glibc@2.5.1': + '@parcel/watcher-linux-x64-glibc@2.5.6': optional: true - '@parcel/watcher-linux-x64-musl@2.5.1': + '@parcel/watcher-linux-x64-musl@2.5.6': optional: true - '@parcel/watcher-win32-arm64@2.5.1': + '@parcel/watcher-win32-arm64@2.5.6': optional: true - '@parcel/watcher-win32-ia32@2.5.1': + '@parcel/watcher-win32-ia32@2.5.6': optional: true - '@parcel/watcher-win32-x64@2.5.1': + '@parcel/watcher-win32-x64@2.5.6': optional: true - '@parcel/watcher@2.5.1': + '@parcel/watcher@2.5.6': dependencies: - detect-libc: 1.0.3 + detect-libc: 2.1.2 is-glob: 4.0.3 - micromatch: 4.0.8 node-addon-api: 7.1.1 + picomatch: 4.0.3 optionalDependencies: - '@parcel/watcher-android-arm64': 2.5.1 - '@parcel/watcher-darwin-arm64': 2.5.1 - '@parcel/watcher-darwin-x64': 2.5.1 - '@parcel/watcher-freebsd-x64': 2.5.1 - '@parcel/watcher-linux-arm-glibc': 2.5.1 - '@parcel/watcher-linux-arm-musl': 2.5.1 - '@parcel/watcher-linux-arm64-glibc': 2.5.1 - '@parcel/watcher-linux-arm64-musl': 2.5.1 - '@parcel/watcher-linux-x64-glibc': 2.5.1 - '@parcel/watcher-linux-x64-musl': 2.5.1 - '@parcel/watcher-win32-arm64': 2.5.1 - '@parcel/watcher-win32-ia32': 2.5.1 - '@parcel/watcher-win32-x64': 2.5.1 + '@parcel/watcher-android-arm64': 2.5.6 + '@parcel/watcher-darwin-arm64': 2.5.6 + '@parcel/watcher-darwin-x64': 2.5.6 + '@parcel/watcher-freebsd-x64': 2.5.6 + '@parcel/watcher-linux-arm-glibc': 2.5.6 + '@parcel/watcher-linux-arm-musl': 2.5.6 + '@parcel/watcher-linux-arm64-glibc': 2.5.6 + '@parcel/watcher-linux-arm64-musl': 2.5.6 + '@parcel/watcher-linux-x64-glibc': 2.5.6 + '@parcel/watcher-linux-x64-musl': 2.5.6 + '@parcel/watcher-win32-arm64': 2.5.6 + '@parcel/watcher-win32-ia32': 2.5.6 + '@parcel/watcher-win32-x64': 2.5.6 '@phosphor-icons/webcomponents@2.1.5': dependencies: lit: 3.3.0 + '@polka/url@1.0.0-next.29': {} + '@quansync/fs@1.0.0': dependencies: quansync: 1.0.0 - '@reown/appkit-adapter-wagmi@1.8.16(22bafcac38b3afe7108ad8937e20dfd4)': - dependencies: - '@reown/appkit': 1.8.16(@types/react@19.2.7)(bufferutil@4.1.0)(react@19.2.3)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.3))(utf-8-validate@5.0.10)(zod@3.25.76) - '@reown/appkit-common': 1.8.16(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - '@reown/appkit-controllers': 1.8.16(@types/react@19.2.7)(bufferutil@4.1.0)(react@19.2.3)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - '@reown/appkit-polyfills': 1.8.16 - '@reown/appkit-scaffold-ui': 1.8.16(@types/react@19.2.7)(bufferutil@4.1.0)(react@19.2.3)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.3))(utf-8-validate@5.0.10)(valtio@2.1.7(@types/react@19.2.7)(react@19.2.3))(zod@3.25.76) - '@reown/appkit-utils': 1.8.16(@types/react@19.2.7)(bufferutil@4.1.0)(react@19.2.3)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.3))(utf-8-validate@5.0.10)(valtio@2.1.7(@types/react@19.2.7)(react@19.2.3))(zod@3.25.76) - '@reown/appkit-wallet': 1.8.16(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) - '@wagmi/core': 3.2.2(@tanstack/query-core@5.90.16)(@types/react@19.2.7)(ox@0.11.3(typescript@5.9.3)(zod@3.25.76))(react@19.2.3)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.3))(viem@2.44.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)) - '@walletconnect/universal-provider': 2.23.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - valtio: 2.1.7(@types/react@19.2.7)(react@19.2.3) - viem: 2.44.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - wagmi: 3.3.2(@safe-global/safe-apps-provider@0.18.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(@safe-global/safe-apps-sdk@9.1.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(@tanstack/query-core@5.90.16)(@tanstack/react-query@5.90.16(react@19.2.3))(@types/react@19.2.7)(ox@0.11.3(typescript@5.9.3)(zod@3.25.76))(react@19.2.3)(typescript@5.9.3)(viem@2.44.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)) + '@reown/appkit-adapter-wagmi@1.8.17(ddefe6db690784ffc0b4049c81f77f80)': + dependencies: + '@reown/appkit': 1.8.17(@types/react@19.2.9)(bufferutil@4.1.0)(react@19.2.3)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.3))(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-common': 1.8.17(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-controllers': 1.8.17(@types/react@19.2.9)(bufferutil@4.1.0)(react@19.2.3)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-polyfills': 1.8.17 + '@reown/appkit-scaffold-ui': 1.8.17(@types/react@19.2.9)(bufferutil@4.1.0)(react@19.2.3)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.3))(utf-8-validate@5.0.10)(valtio@2.1.7(@types/react@19.2.9)(react@19.2.3))(zod@3.25.76) + '@reown/appkit-utils': 1.8.17(@types/react@19.2.9)(bufferutil@4.1.0)(react@19.2.3)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.3))(utf-8-validate@5.0.10)(valtio@2.1.7(@types/react@19.2.9)(react@19.2.3))(zod@3.25.76) + '@reown/appkit-wallet': 1.8.17(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) + '@wagmi/core': 3.3.1(@tanstack/query-core@5.90.20)(@types/react@19.2.9)(ox@0.11.3(typescript@5.9.3)(zod@3.25.76))(react@19.2.3)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.3))(viem@2.45.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)) + '@walletconnect/universal-provider': 2.23.2(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + valtio: 2.1.7(@types/react@19.2.9)(react@19.2.3) + viem: 2.45.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + wagmi: 3.4.1(@safe-global/safe-apps-provider@0.18.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(@safe-global/safe-apps-sdk@9.1.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(@tanstack/query-core@5.90.20)(@tanstack/react-query@5.90.20(react@19.2.3))(@types/react@19.2.9)(ox@0.11.3(typescript@5.9.3)(zod@3.25.76))(react@19.2.3)(typescript@5.9.3)(viem@2.45.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)) optionalDependencies: - '@wagmi/connectors': 7.1.2(@safe-global/safe-apps-provider@0.18.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(@safe-global/safe-apps-sdk@9.1.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(@wagmi/core@3.2.2(@tanstack/query-core@5.90.16)(@types/react@19.2.7)(ox@0.11.3(typescript@5.9.3)(zod@3.25.76))(react@19.2.3)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.3))(viem@2.44.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)))(typescript@5.9.3)(viem@2.44.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)) + '@wagmi/connectors': 7.1.5(@safe-global/safe-apps-provider@0.18.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(@safe-global/safe-apps-sdk@9.1.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(@wagmi/core@3.3.1(@tanstack/query-core@5.90.20)(@types/react@19.2.9)(ox@0.11.3(typescript@5.9.3)(zod@3.25.76))(react@19.2.3)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.3))(viem@2.45.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)))(typescript@5.9.3)(viem@2.45.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -4854,35 +5151,35 @@ snapshots: - utf-8-validate - zod - '@reown/appkit-common@1.8.16(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.22.4)': + '@reown/appkit-common@1.8.17(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.22.4)': dependencies: big.js: 6.2.2 dayjs: 1.11.13 - viem: 2.44.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.22.4) + viem: 2.45.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.22.4) transitivePeerDependencies: - bufferutil - typescript - utf-8-validate - zod - '@reown/appkit-common@1.8.16(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + '@reown/appkit-common@1.8.17(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: big.js: 6.2.2 dayjs: 1.11.13 - viem: 2.44.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + viem: 2.45.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) transitivePeerDependencies: - bufferutil - typescript - utf-8-validate - zod - '@reown/appkit-controllers@1.8.16(@types/react@19.2.7)(bufferutil@4.1.0)(react@19.2.3)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + '@reown/appkit-controllers@1.8.17(@types/react@19.2.9)(bufferutil@4.1.0)(react@19.2.3)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: - '@reown/appkit-common': 1.8.16(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - '@reown/appkit-wallet': 1.8.16(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) - '@walletconnect/universal-provider': 2.23.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - valtio: 2.1.7(@types/react@19.2.7)(react@19.2.3) - viem: 2.44.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-common': 1.8.17(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-wallet': 1.8.17(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) + '@walletconnect/universal-provider': 2.23.2(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + valtio: 2.1.7(@types/react@19.2.9)(react@19.2.3) + viem: 2.45.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -4911,14 +5208,14 @@ snapshots: - utf-8-validate - zod - '@reown/appkit-pay@1.8.16(@types/react@19.2.7)(bufferutil@4.1.0)(react@19.2.3)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.3))(utf-8-validate@5.0.10)(zod@3.25.76)': + '@reown/appkit-pay@1.8.17(@types/react@19.2.9)(bufferutil@4.1.0)(react@19.2.3)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.3))(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: - '@reown/appkit-common': 1.8.16(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - '@reown/appkit-controllers': 1.8.16(@types/react@19.2.7)(bufferutil@4.1.0)(react@19.2.3)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - '@reown/appkit-ui': 1.8.16(@types/react@19.2.7)(bufferutil@4.1.0)(react@19.2.3)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - '@reown/appkit-utils': 1.8.16(@types/react@19.2.7)(bufferutil@4.1.0)(react@19.2.3)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.3))(utf-8-validate@5.0.10)(valtio@2.1.7(@types/react@19.2.7)(react@19.2.3))(zod@3.25.76) + '@reown/appkit-common': 1.8.17(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-controllers': 1.8.17(@types/react@19.2.9)(bufferutil@4.1.0)(react@19.2.3)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-ui': 1.8.17(@types/react@19.2.9)(bufferutil@4.1.0)(react@19.2.3)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-utils': 1.8.17(@types/react@19.2.9)(bufferutil@4.1.0)(react@19.2.3)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.3))(utf-8-validate@5.0.10)(valtio@2.1.7(@types/react@19.2.9)(react@19.2.3))(zod@3.25.76) lit: 3.3.0 - valtio: 2.1.7(@types/react@19.2.7)(react@19.2.3) + valtio: 2.1.7(@types/react@19.2.9)(react@19.2.3) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -4951,18 +5248,18 @@ snapshots: - utf-8-validate - zod - '@reown/appkit-polyfills@1.8.16': + '@reown/appkit-polyfills@1.8.17': dependencies: buffer: 6.0.3 - '@reown/appkit-scaffold-ui@1.8.16(@types/react@19.2.7)(bufferutil@4.1.0)(react@19.2.3)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.3))(utf-8-validate@5.0.10)(valtio@2.1.7(@types/react@19.2.7)(react@19.2.3))(zod@3.25.76)': + '@reown/appkit-scaffold-ui@1.8.17(@types/react@19.2.9)(bufferutil@4.1.0)(react@19.2.3)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.3))(utf-8-validate@5.0.10)(valtio@2.1.7(@types/react@19.2.9)(react@19.2.3))(zod@3.25.76)': dependencies: - '@reown/appkit-common': 1.8.16(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - '@reown/appkit-controllers': 1.8.16(@types/react@19.2.7)(bufferutil@4.1.0)(react@19.2.3)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - '@reown/appkit-pay': 1.8.16(@types/react@19.2.7)(bufferutil@4.1.0)(react@19.2.3)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.3))(utf-8-validate@5.0.10)(zod@3.25.76) - '@reown/appkit-ui': 1.8.16(@types/react@19.2.7)(bufferutil@4.1.0)(react@19.2.3)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - '@reown/appkit-utils': 1.8.16(@types/react@19.2.7)(bufferutil@4.1.0)(react@19.2.3)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.3))(utf-8-validate@5.0.10)(valtio@2.1.7(@types/react@19.2.7)(react@19.2.3))(zod@3.25.76) - '@reown/appkit-wallet': 1.8.16(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) + '@reown/appkit-common': 1.8.17(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-controllers': 1.8.17(@types/react@19.2.9)(bufferutil@4.1.0)(react@19.2.3)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-pay': 1.8.17(@types/react@19.2.9)(bufferutil@4.1.0)(react@19.2.3)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.3))(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-ui': 1.8.17(@types/react@19.2.9)(bufferutil@4.1.0)(react@19.2.3)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-utils': 1.8.17(@types/react@19.2.9)(bufferutil@4.1.0)(react@19.2.3)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.3))(utf-8-validate@5.0.10)(valtio@2.1.7(@types/react@19.2.9)(react@19.2.3))(zod@3.25.76) + '@reown/appkit-wallet': 1.8.17(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) lit: 3.3.0 transitivePeerDependencies: - '@azure/app-configuration' @@ -4997,12 +5294,12 @@ snapshots: - valtio - zod - '@reown/appkit-ui@1.8.16(@types/react@19.2.7)(bufferutil@4.1.0)(react@19.2.3)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + '@reown/appkit-ui@1.8.17(@types/react@19.2.9)(bufferutil@4.1.0)(react@19.2.3)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: '@phosphor-icons/webcomponents': 2.1.5 - '@reown/appkit-common': 1.8.16(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - '@reown/appkit-controllers': 1.8.16(@types/react@19.2.7)(bufferutil@4.1.0)(react@19.2.3)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - '@reown/appkit-wallet': 1.8.16(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) + '@reown/appkit-common': 1.8.17(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-controllers': 1.8.17(@types/react@19.2.9)(bufferutil@4.1.0)(react@19.2.3)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-wallet': 1.8.17(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) lit: 3.3.0 qrcode: 1.5.3 transitivePeerDependencies: @@ -5033,19 +5330,19 @@ snapshots: - utf-8-validate - zod - '@reown/appkit-utils@1.8.16(@types/react@19.2.7)(bufferutil@4.1.0)(react@19.2.3)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.3))(utf-8-validate@5.0.10)(valtio@2.1.7(@types/react@19.2.7)(react@19.2.3))(zod@3.25.76)': + '@reown/appkit-utils@1.8.17(@types/react@19.2.9)(bufferutil@4.1.0)(react@19.2.3)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.3))(utf-8-validate@5.0.10)(valtio@2.1.7(@types/react@19.2.9)(react@19.2.3))(zod@3.25.76)': dependencies: - '@reown/appkit-common': 1.8.16(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - '@reown/appkit-controllers': 1.8.16(@types/react@19.2.7)(bufferutil@4.1.0)(react@19.2.3)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - '@reown/appkit-polyfills': 1.8.16 - '@reown/appkit-wallet': 1.8.16(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) + '@reown/appkit-common': 1.8.17(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-controllers': 1.8.17(@types/react@19.2.9)(bufferutil@4.1.0)(react@19.2.3)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-polyfills': 1.8.17 + '@reown/appkit-wallet': 1.8.17(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) '@wallet-standard/wallet': 1.1.0 - '@walletconnect/logger': 3.0.1 - '@walletconnect/universal-provider': 2.23.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - valtio: 2.1.7(@types/react@19.2.7)(react@19.2.3) - viem: 2.44.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/logger': 3.0.2 + '@walletconnect/universal-provider': 2.23.2(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + valtio: 2.1.7(@types/react@19.2.9)(react@19.2.3) + viem: 2.45.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) optionalDependencies: - '@base-org/account': 2.4.0(@types/react@19.2.7)(bufferutil@4.1.0)(react@19.2.3)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.3))(utf-8-validate@5.0.10)(zod@3.25.76) + '@base-org/account': 2.4.0(@types/react@19.2.9)(bufferutil@4.1.0)(react@19.2.3)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.3))(utf-8-validate@5.0.10)(zod@3.25.76) '@safe-global/safe-apps-provider': 0.18.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) '@safe-global/safe-apps-sdk': 9.1.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) transitivePeerDependencies: @@ -5080,34 +5377,34 @@ snapshots: - utf-8-validate - zod - '@reown/appkit-wallet@1.8.16(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)': + '@reown/appkit-wallet@1.8.17(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)': dependencies: - '@reown/appkit-common': 1.8.16(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.22.4) - '@reown/appkit-polyfills': 1.8.16 - '@walletconnect/logger': 3.0.1 + '@reown/appkit-common': 1.8.17(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.22.4) + '@reown/appkit-polyfills': 1.8.17 + '@walletconnect/logger': 3.0.2 zod: 3.22.4 transitivePeerDependencies: - bufferutil - typescript - utf-8-validate - '@reown/appkit@1.8.16(@types/react@19.2.7)(bufferutil@4.1.0)(react@19.2.3)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.3))(utf-8-validate@5.0.10)(zod@3.25.76)': - dependencies: - '@reown/appkit-common': 1.8.16(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - '@reown/appkit-controllers': 1.8.16(@types/react@19.2.7)(bufferutil@4.1.0)(react@19.2.3)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - '@reown/appkit-pay': 1.8.16(@types/react@19.2.7)(bufferutil@4.1.0)(react@19.2.3)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.3))(utf-8-validate@5.0.10)(zod@3.25.76) - '@reown/appkit-polyfills': 1.8.16 - '@reown/appkit-scaffold-ui': 1.8.16(@types/react@19.2.7)(bufferutil@4.1.0)(react@19.2.3)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.3))(utf-8-validate@5.0.10)(valtio@2.1.7(@types/react@19.2.7)(react@19.2.3))(zod@3.25.76) - '@reown/appkit-ui': 1.8.16(@types/react@19.2.7)(bufferutil@4.1.0)(react@19.2.3)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - '@reown/appkit-utils': 1.8.16(@types/react@19.2.7)(bufferutil@4.1.0)(react@19.2.3)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.3))(utf-8-validate@5.0.10)(valtio@2.1.7(@types/react@19.2.7)(react@19.2.3))(zod@3.25.76) - '@reown/appkit-wallet': 1.8.16(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) - '@walletconnect/universal-provider': 2.23.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit@1.8.17(@types/react@19.2.9)(bufferutil@4.1.0)(react@19.2.3)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.3))(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + '@reown/appkit-common': 1.8.17(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-controllers': 1.8.17(@types/react@19.2.9)(bufferutil@4.1.0)(react@19.2.3)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-pay': 1.8.17(@types/react@19.2.9)(bufferutil@4.1.0)(react@19.2.3)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.3))(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-polyfills': 1.8.17 + '@reown/appkit-scaffold-ui': 1.8.17(@types/react@19.2.9)(bufferutil@4.1.0)(react@19.2.3)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.3))(utf-8-validate@5.0.10)(valtio@2.1.7(@types/react@19.2.9)(react@19.2.3))(zod@3.25.76) + '@reown/appkit-ui': 1.8.17(@types/react@19.2.9)(bufferutil@4.1.0)(react@19.2.3)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-utils': 1.8.17(@types/react@19.2.9)(bufferutil@4.1.0)(react@19.2.3)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.3))(utf-8-validate@5.0.10)(valtio@2.1.7(@types/react@19.2.9)(react@19.2.3))(zod@3.25.76) + '@reown/appkit-wallet': 1.8.17(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) + '@walletconnect/universal-provider': 2.23.2(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) bs58: 6.0.0 semver: 7.7.2 - valtio: 2.1.7(@types/react@19.2.7)(react@19.2.3) - viem: 2.44.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + valtio: 2.1.7(@types/react@19.2.9)(react@19.2.3) + viem: 2.45.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) optionalDependencies: - '@lit/react': 1.0.8(@types/react@19.2.7) + '@lit/react': 1.0.8(@types/react@19.2.9) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -5142,95 +5439,95 @@ snapshots: '@rolldown/pluginutils@1.0.0-beta.53': {} - '@rollup/plugin-inject@5.0.5(rollup@4.55.1)': + '@rollup/plugin-inject@5.0.5(rollup@4.56.0)': dependencies: - '@rollup/pluginutils': 5.3.0(rollup@4.55.1) + '@rollup/pluginutils': 5.3.0(rollup@4.56.0) estree-walker: 2.0.2 magic-string: 0.30.21 optionalDependencies: - rollup: 4.55.1 + rollup: 4.56.0 - '@rollup/pluginutils@5.3.0(rollup@4.55.1)': + '@rollup/pluginutils@5.3.0(rollup@4.56.0)': dependencies: '@types/estree': 1.0.8 estree-walker: 2.0.2 picomatch: 4.0.3 optionalDependencies: - rollup: 4.55.1 + rollup: 4.56.0 - '@rollup/rollup-android-arm-eabi@4.55.1': + '@rollup/rollup-android-arm-eabi@4.56.0': optional: true - '@rollup/rollup-android-arm64@4.55.1': + '@rollup/rollup-android-arm64@4.56.0': optional: true - '@rollup/rollup-darwin-arm64@4.55.1': + '@rollup/rollup-darwin-arm64@4.56.0': optional: true - '@rollup/rollup-darwin-x64@4.55.1': + '@rollup/rollup-darwin-x64@4.56.0': optional: true - '@rollup/rollup-freebsd-arm64@4.55.1': + '@rollup/rollup-freebsd-arm64@4.56.0': optional: true - '@rollup/rollup-freebsd-x64@4.55.1': + '@rollup/rollup-freebsd-x64@4.56.0': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.55.1': + '@rollup/rollup-linux-arm-gnueabihf@4.56.0': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.55.1': + '@rollup/rollup-linux-arm-musleabihf@4.56.0': optional: true - '@rollup/rollup-linux-arm64-gnu@4.55.1': + '@rollup/rollup-linux-arm64-gnu@4.56.0': optional: true - '@rollup/rollup-linux-arm64-musl@4.55.1': + '@rollup/rollup-linux-arm64-musl@4.56.0': optional: true - '@rollup/rollup-linux-loong64-gnu@4.55.1': + '@rollup/rollup-linux-loong64-gnu@4.56.0': optional: true - '@rollup/rollup-linux-loong64-musl@4.55.1': + '@rollup/rollup-linux-loong64-musl@4.56.0': optional: true - '@rollup/rollup-linux-ppc64-gnu@4.55.1': + '@rollup/rollup-linux-ppc64-gnu@4.56.0': optional: true - '@rollup/rollup-linux-ppc64-musl@4.55.1': + '@rollup/rollup-linux-ppc64-musl@4.56.0': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.55.1': + '@rollup/rollup-linux-riscv64-gnu@4.56.0': optional: true - '@rollup/rollup-linux-riscv64-musl@4.55.1': + '@rollup/rollup-linux-riscv64-musl@4.56.0': optional: true - '@rollup/rollup-linux-s390x-gnu@4.55.1': + '@rollup/rollup-linux-s390x-gnu@4.56.0': optional: true - '@rollup/rollup-linux-x64-gnu@4.55.1': + '@rollup/rollup-linux-x64-gnu@4.56.0': optional: true - '@rollup/rollup-linux-x64-musl@4.55.1': + '@rollup/rollup-linux-x64-musl@4.56.0': optional: true - '@rollup/rollup-openbsd-x64@4.55.1': + '@rollup/rollup-openbsd-x64@4.56.0': optional: true - '@rollup/rollup-openharmony-arm64@4.55.1': + '@rollup/rollup-openharmony-arm64@4.56.0': optional: true - '@rollup/rollup-win32-arm64-msvc@4.55.1': + '@rollup/rollup-win32-arm64-msvc@4.56.0': optional: true - '@rollup/rollup-win32-ia32-msvc@4.55.1': + '@rollup/rollup-win32-ia32-msvc@4.56.0': optional: true - '@rollup/rollup-win32-x64-gnu@4.55.1': + '@rollup/rollup-win32-x64-gnu@4.56.0': optional: true - '@rollup/rollup-win32-x64-msvc@4.55.1': + '@rollup/rollup-win32-x64-msvc@4.56.0': optional: true '@safe-global/safe-apps-provider@0.18.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': @@ -5247,7 +5544,7 @@ snapshots: '@safe-global/safe-apps-sdk@9.1.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: '@safe-global/safe-gateway-typescript-sdk': 3.23.1 - viem: 2.44.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + viem: 2.45.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) transitivePeerDependencies: - bufferutil - typescript @@ -5271,44 +5568,47 @@ snapshots: '@noble/hashes': 1.8.0 '@scure/base': 1.2.6 - '@solana-program/system@0.10.0(@solana/kit@5.3.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10))': + '@solana-program/system@0.10.0(@solana/kit@5.4.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10))': dependencies: - '@solana/kit': 5.3.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) + '@solana/kit': 5.4.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) optional: true - '@solana-program/token@0.9.0(@solana/kit@5.3.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10))': + '@solana-program/token@0.9.0(@solana/kit@5.4.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10))': dependencies: - '@solana/kit': 5.3.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) + '@solana/kit': 5.4.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) optional: true - '@solana/accounts@5.3.0(typescript@5.9.3)': + '@solana/accounts@5.4.0(typescript@5.9.3)': dependencies: - '@solana/addresses': 5.3.0(typescript@5.9.3) - '@solana/codecs-core': 5.3.0(typescript@5.9.3) - '@solana/codecs-strings': 5.3.0(typescript@5.9.3) - '@solana/errors': 5.3.0(typescript@5.9.3) - '@solana/rpc-spec': 5.3.0(typescript@5.9.3) - '@solana/rpc-types': 5.3.0(typescript@5.9.3) + '@solana/addresses': 5.4.0(typescript@5.9.3) + '@solana/codecs-core': 5.4.0(typescript@5.9.3) + '@solana/codecs-strings': 5.4.0(typescript@5.9.3) + '@solana/errors': 5.4.0(typescript@5.9.3) + '@solana/rpc-spec': 5.4.0(typescript@5.9.3) + '@solana/rpc-types': 5.4.0(typescript@5.9.3) + optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: - fastestsmallesttextencoderdecoder optional: true - '@solana/addresses@5.3.0(typescript@5.9.3)': + '@solana/addresses@5.4.0(typescript@5.9.3)': dependencies: - '@solana/assertions': 5.3.0(typescript@5.9.3) - '@solana/codecs-core': 5.3.0(typescript@5.9.3) - '@solana/codecs-strings': 5.3.0(typescript@5.9.3) - '@solana/errors': 5.3.0(typescript@5.9.3) - '@solana/nominal-types': 5.3.0(typescript@5.9.3) + '@solana/assertions': 5.4.0(typescript@5.9.3) + '@solana/codecs-core': 5.4.0(typescript@5.9.3) + '@solana/codecs-strings': 5.4.0(typescript@5.9.3) + '@solana/errors': 5.4.0(typescript@5.9.3) + '@solana/nominal-types': 5.4.0(typescript@5.9.3) + optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: - fastestsmallesttextencoderdecoder optional: true - '@solana/assertions@5.3.0(typescript@5.9.3)': + '@solana/assertions@5.4.0(typescript@5.9.3)': dependencies: - '@solana/errors': 5.3.0(typescript@5.9.3) + '@solana/errors': 5.4.0(typescript@5.9.3) + optionalDependencies: typescript: 5.9.3 optional: true @@ -5323,17 +5623,19 @@ snapshots: typescript: 5.9.3 optional: true - '@solana/codecs-core@5.3.0(typescript@5.9.3)': + '@solana/codecs-core@5.4.0(typescript@5.9.3)': dependencies: - '@solana/errors': 5.3.0(typescript@5.9.3) + '@solana/errors': 5.4.0(typescript@5.9.3) + optionalDependencies: typescript: 5.9.3 optional: true - '@solana/codecs-data-structures@5.3.0(typescript@5.9.3)': + '@solana/codecs-data-structures@5.4.0(typescript@5.9.3)': dependencies: - '@solana/codecs-core': 5.3.0(typescript@5.9.3) - '@solana/codecs-numbers': 5.3.0(typescript@5.9.3) - '@solana/errors': 5.3.0(typescript@5.9.3) + '@solana/codecs-core': 5.4.0(typescript@5.9.3) + '@solana/codecs-numbers': 5.4.0(typescript@5.9.3) + '@solana/errors': 5.4.0(typescript@5.9.3) + optionalDependencies: typescript: 5.9.3 optional: true @@ -5344,28 +5646,31 @@ snapshots: typescript: 5.9.3 optional: true - '@solana/codecs-numbers@5.3.0(typescript@5.9.3)': + '@solana/codecs-numbers@5.4.0(typescript@5.9.3)': dependencies: - '@solana/codecs-core': 5.3.0(typescript@5.9.3) - '@solana/errors': 5.3.0(typescript@5.9.3) + '@solana/codecs-core': 5.4.0(typescript@5.9.3) + '@solana/errors': 5.4.0(typescript@5.9.3) + optionalDependencies: typescript: 5.9.3 optional: true - '@solana/codecs-strings@5.3.0(typescript@5.9.3)': + '@solana/codecs-strings@5.4.0(typescript@5.9.3)': dependencies: - '@solana/codecs-core': 5.3.0(typescript@5.9.3) - '@solana/codecs-numbers': 5.3.0(typescript@5.9.3) - '@solana/errors': 5.3.0(typescript@5.9.3) + '@solana/codecs-core': 5.4.0(typescript@5.9.3) + '@solana/codecs-numbers': 5.4.0(typescript@5.9.3) + '@solana/errors': 5.4.0(typescript@5.9.3) + optionalDependencies: typescript: 5.9.3 optional: true - '@solana/codecs@5.3.0(typescript@5.9.3)': + '@solana/codecs@5.4.0(typescript@5.9.3)': dependencies: - '@solana/codecs-core': 5.3.0(typescript@5.9.3) - '@solana/codecs-data-structures': 5.3.0(typescript@5.9.3) - '@solana/codecs-numbers': 5.3.0(typescript@5.9.3) - '@solana/codecs-strings': 5.3.0(typescript@5.9.3) - '@solana/options': 5.3.0(typescript@5.9.3) + '@solana/codecs-core': 5.4.0(typescript@5.9.3) + '@solana/codecs-data-structures': 5.4.0(typescript@5.9.3) + '@solana/codecs-numbers': 5.4.0(typescript@5.9.3) + '@solana/codecs-strings': 5.4.0(typescript@5.9.3) + '@solana/options': 5.4.0(typescript@5.9.3) + optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: - fastestsmallesttextencoderdecoder @@ -5378,79 +5683,84 @@ snapshots: typescript: 5.9.3 optional: true - '@solana/errors@5.3.0(typescript@5.9.3)': + '@solana/errors@5.4.0(typescript@5.9.3)': dependencies: chalk: 5.6.2 commander: 14.0.2 + optionalDependencies: typescript: 5.9.3 optional: true - '@solana/fast-stable-stringify@5.3.0(typescript@5.9.3)': - dependencies: + '@solana/fast-stable-stringify@5.4.0(typescript@5.9.3)': + optionalDependencies: typescript: 5.9.3 optional: true - '@solana/functional@5.3.0(typescript@5.9.3)': - dependencies: + '@solana/functional@5.4.0(typescript@5.9.3)': + optionalDependencies: typescript: 5.9.3 optional: true - '@solana/instruction-plans@5.3.0(typescript@5.9.3)': + '@solana/instruction-plans@5.4.0(typescript@5.9.3)': dependencies: - '@solana/errors': 5.3.0(typescript@5.9.3) - '@solana/instructions': 5.3.0(typescript@5.9.3) - '@solana/keys': 5.3.0(typescript@5.9.3) - '@solana/promises': 5.3.0(typescript@5.9.3) - '@solana/transaction-messages': 5.3.0(typescript@5.9.3) - '@solana/transactions': 5.3.0(typescript@5.9.3) + '@solana/errors': 5.4.0(typescript@5.9.3) + '@solana/instructions': 5.4.0(typescript@5.9.3) + '@solana/keys': 5.4.0(typescript@5.9.3) + '@solana/promises': 5.4.0(typescript@5.9.3) + '@solana/transaction-messages': 5.4.0(typescript@5.9.3) + '@solana/transactions': 5.4.0(typescript@5.9.3) + optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: - fastestsmallesttextencoderdecoder optional: true - '@solana/instructions@5.3.0(typescript@5.9.3)': + '@solana/instructions@5.4.0(typescript@5.9.3)': dependencies: - '@solana/codecs-core': 5.3.0(typescript@5.9.3) - '@solana/errors': 5.3.0(typescript@5.9.3) + '@solana/codecs-core': 5.4.0(typescript@5.9.3) + '@solana/errors': 5.4.0(typescript@5.9.3) + optionalDependencies: typescript: 5.9.3 optional: true - '@solana/keys@5.3.0(typescript@5.9.3)': + '@solana/keys@5.4.0(typescript@5.9.3)': dependencies: - '@solana/assertions': 5.3.0(typescript@5.9.3) - '@solana/codecs-core': 5.3.0(typescript@5.9.3) - '@solana/codecs-strings': 5.3.0(typescript@5.9.3) - '@solana/errors': 5.3.0(typescript@5.9.3) - '@solana/nominal-types': 5.3.0(typescript@5.9.3) + '@solana/assertions': 5.4.0(typescript@5.9.3) + '@solana/codecs-core': 5.4.0(typescript@5.9.3) + '@solana/codecs-strings': 5.4.0(typescript@5.9.3) + '@solana/errors': 5.4.0(typescript@5.9.3) + '@solana/nominal-types': 5.4.0(typescript@5.9.3) + optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: - fastestsmallesttextencoderdecoder optional: true - '@solana/kit@5.3.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)': - dependencies: - '@solana/accounts': 5.3.0(typescript@5.9.3) - '@solana/addresses': 5.3.0(typescript@5.9.3) - '@solana/codecs': 5.3.0(typescript@5.9.3) - '@solana/errors': 5.3.0(typescript@5.9.3) - '@solana/functional': 5.3.0(typescript@5.9.3) - '@solana/instruction-plans': 5.3.0(typescript@5.9.3) - '@solana/instructions': 5.3.0(typescript@5.9.3) - '@solana/keys': 5.3.0(typescript@5.9.3) - '@solana/offchain-messages': 5.3.0(typescript@5.9.3) - '@solana/plugin-core': 5.3.0(typescript@5.9.3) - '@solana/programs': 5.3.0(typescript@5.9.3) - '@solana/rpc': 5.3.0(typescript@5.9.3) - '@solana/rpc-api': 5.3.0(typescript@5.9.3) - '@solana/rpc-parsed-types': 5.3.0(typescript@5.9.3) - '@solana/rpc-spec-types': 5.3.0(typescript@5.9.3) - '@solana/rpc-subscriptions': 5.3.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) - '@solana/rpc-types': 5.3.0(typescript@5.9.3) - '@solana/signers': 5.3.0(typescript@5.9.3) - '@solana/sysvars': 5.3.0(typescript@5.9.3) - '@solana/transaction-confirmation': 5.3.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) - '@solana/transaction-messages': 5.3.0(typescript@5.9.3) - '@solana/transactions': 5.3.0(typescript@5.9.3) + '@solana/kit@5.4.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)': + dependencies: + '@solana/accounts': 5.4.0(typescript@5.9.3) + '@solana/addresses': 5.4.0(typescript@5.9.3) + '@solana/codecs': 5.4.0(typescript@5.9.3) + '@solana/errors': 5.4.0(typescript@5.9.3) + '@solana/functional': 5.4.0(typescript@5.9.3) + '@solana/instruction-plans': 5.4.0(typescript@5.9.3) + '@solana/instructions': 5.4.0(typescript@5.9.3) + '@solana/keys': 5.4.0(typescript@5.9.3) + '@solana/offchain-messages': 5.4.0(typescript@5.9.3) + '@solana/plugin-core': 5.4.0(typescript@5.9.3) + '@solana/programs': 5.4.0(typescript@5.9.3) + '@solana/rpc': 5.4.0(typescript@5.9.3) + '@solana/rpc-api': 5.4.0(typescript@5.9.3) + '@solana/rpc-parsed-types': 5.4.0(typescript@5.9.3) + '@solana/rpc-spec-types': 5.4.0(typescript@5.9.3) + '@solana/rpc-subscriptions': 5.4.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) + '@solana/rpc-types': 5.4.0(typescript@5.9.3) + '@solana/signers': 5.4.0(typescript@5.9.3) + '@solana/sysvars': 5.4.0(typescript@5.9.3) + '@solana/transaction-confirmation': 5.4.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) + '@solana/transaction-messages': 5.4.0(typescript@5.9.3) + '@solana/transactions': 5.4.0(typescript@5.9.3) + optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: - bufferutil @@ -5458,141 +5768,150 @@ snapshots: - utf-8-validate optional: true - '@solana/nominal-types@5.3.0(typescript@5.9.3)': - dependencies: + '@solana/nominal-types@5.4.0(typescript@5.9.3)': + optionalDependencies: typescript: 5.9.3 optional: true - '@solana/offchain-messages@5.3.0(typescript@5.9.3)': + '@solana/offchain-messages@5.4.0(typescript@5.9.3)': dependencies: - '@solana/addresses': 5.3.0(typescript@5.9.3) - '@solana/codecs-core': 5.3.0(typescript@5.9.3) - '@solana/codecs-data-structures': 5.3.0(typescript@5.9.3) - '@solana/codecs-numbers': 5.3.0(typescript@5.9.3) - '@solana/codecs-strings': 5.3.0(typescript@5.9.3) - '@solana/errors': 5.3.0(typescript@5.9.3) - '@solana/keys': 5.3.0(typescript@5.9.3) - '@solana/nominal-types': 5.3.0(typescript@5.9.3) + '@solana/addresses': 5.4.0(typescript@5.9.3) + '@solana/codecs-core': 5.4.0(typescript@5.9.3) + '@solana/codecs-data-structures': 5.4.0(typescript@5.9.3) + '@solana/codecs-numbers': 5.4.0(typescript@5.9.3) + '@solana/codecs-strings': 5.4.0(typescript@5.9.3) + '@solana/errors': 5.4.0(typescript@5.9.3) + '@solana/keys': 5.4.0(typescript@5.9.3) + '@solana/nominal-types': 5.4.0(typescript@5.9.3) + optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: - fastestsmallesttextencoderdecoder optional: true - '@solana/options@5.3.0(typescript@5.9.3)': + '@solana/options@5.4.0(typescript@5.9.3)': dependencies: - '@solana/codecs-core': 5.3.0(typescript@5.9.3) - '@solana/codecs-data-structures': 5.3.0(typescript@5.9.3) - '@solana/codecs-numbers': 5.3.0(typescript@5.9.3) - '@solana/codecs-strings': 5.3.0(typescript@5.9.3) - '@solana/errors': 5.3.0(typescript@5.9.3) + '@solana/codecs-core': 5.4.0(typescript@5.9.3) + '@solana/codecs-data-structures': 5.4.0(typescript@5.9.3) + '@solana/codecs-numbers': 5.4.0(typescript@5.9.3) + '@solana/codecs-strings': 5.4.0(typescript@5.9.3) + '@solana/errors': 5.4.0(typescript@5.9.3) + optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: - fastestsmallesttextencoderdecoder optional: true - '@solana/plugin-core@5.3.0(typescript@5.9.3)': - dependencies: + '@solana/plugin-core@5.4.0(typescript@5.9.3)': + optionalDependencies: typescript: 5.9.3 optional: true - '@solana/programs@5.3.0(typescript@5.9.3)': + '@solana/programs@5.4.0(typescript@5.9.3)': dependencies: - '@solana/addresses': 5.3.0(typescript@5.9.3) - '@solana/errors': 5.3.0(typescript@5.9.3) + '@solana/addresses': 5.4.0(typescript@5.9.3) + '@solana/errors': 5.4.0(typescript@5.9.3) + optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: - fastestsmallesttextencoderdecoder optional: true - '@solana/promises@5.3.0(typescript@5.9.3)': - dependencies: + '@solana/promises@5.4.0(typescript@5.9.3)': + optionalDependencies: typescript: 5.9.3 optional: true - '@solana/rpc-api@5.3.0(typescript@5.9.3)': + '@solana/rpc-api@5.4.0(typescript@5.9.3)': dependencies: - '@solana/addresses': 5.3.0(typescript@5.9.3) - '@solana/codecs-core': 5.3.0(typescript@5.9.3) - '@solana/codecs-strings': 5.3.0(typescript@5.9.3) - '@solana/errors': 5.3.0(typescript@5.9.3) - '@solana/keys': 5.3.0(typescript@5.9.3) - '@solana/rpc-parsed-types': 5.3.0(typescript@5.9.3) - '@solana/rpc-spec': 5.3.0(typescript@5.9.3) - '@solana/rpc-transformers': 5.3.0(typescript@5.9.3) - '@solana/rpc-types': 5.3.0(typescript@5.9.3) - '@solana/transaction-messages': 5.3.0(typescript@5.9.3) - '@solana/transactions': 5.3.0(typescript@5.9.3) + '@solana/addresses': 5.4.0(typescript@5.9.3) + '@solana/codecs-core': 5.4.0(typescript@5.9.3) + '@solana/codecs-strings': 5.4.0(typescript@5.9.3) + '@solana/errors': 5.4.0(typescript@5.9.3) + '@solana/keys': 5.4.0(typescript@5.9.3) + '@solana/rpc-parsed-types': 5.4.0(typescript@5.9.3) + '@solana/rpc-spec': 5.4.0(typescript@5.9.3) + '@solana/rpc-transformers': 5.4.0(typescript@5.9.3) + '@solana/rpc-types': 5.4.0(typescript@5.9.3) + '@solana/transaction-messages': 5.4.0(typescript@5.9.3) + '@solana/transactions': 5.4.0(typescript@5.9.3) + optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: - fastestsmallesttextencoderdecoder optional: true - '@solana/rpc-parsed-types@5.3.0(typescript@5.9.3)': - dependencies: + '@solana/rpc-parsed-types@5.4.0(typescript@5.9.3)': + optionalDependencies: typescript: 5.9.3 optional: true - '@solana/rpc-spec-types@5.3.0(typescript@5.9.3)': - dependencies: + '@solana/rpc-spec-types@5.4.0(typescript@5.9.3)': + optionalDependencies: typescript: 5.9.3 optional: true - '@solana/rpc-spec@5.3.0(typescript@5.9.3)': + '@solana/rpc-spec@5.4.0(typescript@5.9.3)': dependencies: - '@solana/errors': 5.3.0(typescript@5.9.3) - '@solana/rpc-spec-types': 5.3.0(typescript@5.9.3) + '@solana/errors': 5.4.0(typescript@5.9.3) + '@solana/rpc-spec-types': 5.4.0(typescript@5.9.3) + optionalDependencies: typescript: 5.9.3 optional: true - '@solana/rpc-subscriptions-api@5.3.0(typescript@5.9.3)': + '@solana/rpc-subscriptions-api@5.4.0(typescript@5.9.3)': dependencies: - '@solana/addresses': 5.3.0(typescript@5.9.3) - '@solana/keys': 5.3.0(typescript@5.9.3) - '@solana/rpc-subscriptions-spec': 5.3.0(typescript@5.9.3) - '@solana/rpc-transformers': 5.3.0(typescript@5.9.3) - '@solana/rpc-types': 5.3.0(typescript@5.9.3) - '@solana/transaction-messages': 5.3.0(typescript@5.9.3) - '@solana/transactions': 5.3.0(typescript@5.9.3) + '@solana/addresses': 5.4.0(typescript@5.9.3) + '@solana/keys': 5.4.0(typescript@5.9.3) + '@solana/rpc-subscriptions-spec': 5.4.0(typescript@5.9.3) + '@solana/rpc-transformers': 5.4.0(typescript@5.9.3) + '@solana/rpc-types': 5.4.0(typescript@5.9.3) + '@solana/transaction-messages': 5.4.0(typescript@5.9.3) + '@solana/transactions': 5.4.0(typescript@5.9.3) + optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: - fastestsmallesttextencoderdecoder optional: true - '@solana/rpc-subscriptions-channel-websocket@5.3.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)': + '@solana/rpc-subscriptions-channel-websocket@5.4.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)': dependencies: - '@solana/errors': 5.3.0(typescript@5.9.3) - '@solana/functional': 5.3.0(typescript@5.9.3) - '@solana/rpc-subscriptions-spec': 5.3.0(typescript@5.9.3) - '@solana/subscribable': 5.3.0(typescript@5.9.3) - typescript: 5.9.3 + '@solana/errors': 5.4.0(typescript@5.9.3) + '@solana/functional': 5.4.0(typescript@5.9.3) + '@solana/rpc-subscriptions-spec': 5.4.0(typescript@5.9.3) + '@solana/subscribable': 5.4.0(typescript@5.9.3) ws: 8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) + optionalDependencies: + typescript: 5.9.3 transitivePeerDependencies: - bufferutil - utf-8-validate optional: true - '@solana/rpc-subscriptions-spec@5.3.0(typescript@5.9.3)': + '@solana/rpc-subscriptions-spec@5.4.0(typescript@5.9.3)': dependencies: - '@solana/errors': 5.3.0(typescript@5.9.3) - '@solana/promises': 5.3.0(typescript@5.9.3) - '@solana/rpc-spec-types': 5.3.0(typescript@5.9.3) - '@solana/subscribable': 5.3.0(typescript@5.9.3) + '@solana/errors': 5.4.0(typescript@5.9.3) + '@solana/promises': 5.4.0(typescript@5.9.3) + '@solana/rpc-spec-types': 5.4.0(typescript@5.9.3) + '@solana/subscribable': 5.4.0(typescript@5.9.3) + optionalDependencies: typescript: 5.9.3 optional: true - '@solana/rpc-subscriptions@5.3.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)': + '@solana/rpc-subscriptions@5.4.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)': dependencies: - '@solana/errors': 5.3.0(typescript@5.9.3) - '@solana/fast-stable-stringify': 5.3.0(typescript@5.9.3) - '@solana/functional': 5.3.0(typescript@5.9.3) - '@solana/promises': 5.3.0(typescript@5.9.3) - '@solana/rpc-spec-types': 5.3.0(typescript@5.9.3) - '@solana/rpc-subscriptions-api': 5.3.0(typescript@5.9.3) - '@solana/rpc-subscriptions-channel-websocket': 5.3.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) - '@solana/rpc-subscriptions-spec': 5.3.0(typescript@5.9.3) - '@solana/rpc-transformers': 5.3.0(typescript@5.9.3) - '@solana/rpc-types': 5.3.0(typescript@5.9.3) - '@solana/subscribable': 5.3.0(typescript@5.9.3) + '@solana/errors': 5.4.0(typescript@5.9.3) + '@solana/fast-stable-stringify': 5.4.0(typescript@5.9.3) + '@solana/functional': 5.4.0(typescript@5.9.3) + '@solana/promises': 5.4.0(typescript@5.9.3) + '@solana/rpc-spec-types': 5.4.0(typescript@5.9.3) + '@solana/rpc-subscriptions-api': 5.4.0(typescript@5.9.3) + '@solana/rpc-subscriptions-channel-websocket': 5.4.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) + '@solana/rpc-subscriptions-spec': 5.4.0(typescript@5.9.3) + '@solana/rpc-transformers': 5.4.0(typescript@5.9.3) + '@solana/rpc-types': 5.4.0(typescript@5.9.3) + '@solana/subscribable': 5.4.0(typescript@5.9.3) + optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: - bufferutil @@ -5600,101 +5919,109 @@ snapshots: - utf-8-validate optional: true - '@solana/rpc-transformers@5.3.0(typescript@5.9.3)': + '@solana/rpc-transformers@5.4.0(typescript@5.9.3)': dependencies: - '@solana/errors': 5.3.0(typescript@5.9.3) - '@solana/functional': 5.3.0(typescript@5.9.3) - '@solana/nominal-types': 5.3.0(typescript@5.9.3) - '@solana/rpc-spec-types': 5.3.0(typescript@5.9.3) - '@solana/rpc-types': 5.3.0(typescript@5.9.3) + '@solana/errors': 5.4.0(typescript@5.9.3) + '@solana/functional': 5.4.0(typescript@5.9.3) + '@solana/nominal-types': 5.4.0(typescript@5.9.3) + '@solana/rpc-spec-types': 5.4.0(typescript@5.9.3) + '@solana/rpc-types': 5.4.0(typescript@5.9.3) + optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: - fastestsmallesttextencoderdecoder optional: true - '@solana/rpc-transport-http@5.3.0(typescript@5.9.3)': + '@solana/rpc-transport-http@5.4.0(typescript@5.9.3)': dependencies: - '@solana/errors': 5.3.0(typescript@5.9.3) - '@solana/rpc-spec': 5.3.0(typescript@5.9.3) - '@solana/rpc-spec-types': 5.3.0(typescript@5.9.3) + '@solana/errors': 5.4.0(typescript@5.9.3) + '@solana/rpc-spec': 5.4.0(typescript@5.9.3) + '@solana/rpc-spec-types': 5.4.0(typescript@5.9.3) + undici-types: 7.19.1 + optionalDependencies: typescript: 5.9.3 - undici-types: 7.18.2 optional: true - '@solana/rpc-types@5.3.0(typescript@5.9.3)': + '@solana/rpc-types@5.4.0(typescript@5.9.3)': dependencies: - '@solana/addresses': 5.3.0(typescript@5.9.3) - '@solana/codecs-core': 5.3.0(typescript@5.9.3) - '@solana/codecs-numbers': 5.3.0(typescript@5.9.3) - '@solana/codecs-strings': 5.3.0(typescript@5.9.3) - '@solana/errors': 5.3.0(typescript@5.9.3) - '@solana/nominal-types': 5.3.0(typescript@5.9.3) + '@solana/addresses': 5.4.0(typescript@5.9.3) + '@solana/codecs-core': 5.4.0(typescript@5.9.3) + '@solana/codecs-numbers': 5.4.0(typescript@5.9.3) + '@solana/codecs-strings': 5.4.0(typescript@5.9.3) + '@solana/errors': 5.4.0(typescript@5.9.3) + '@solana/nominal-types': 5.4.0(typescript@5.9.3) + optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: - fastestsmallesttextencoderdecoder optional: true - '@solana/rpc@5.3.0(typescript@5.9.3)': + '@solana/rpc@5.4.0(typescript@5.9.3)': dependencies: - '@solana/errors': 5.3.0(typescript@5.9.3) - '@solana/fast-stable-stringify': 5.3.0(typescript@5.9.3) - '@solana/functional': 5.3.0(typescript@5.9.3) - '@solana/rpc-api': 5.3.0(typescript@5.9.3) - '@solana/rpc-spec': 5.3.0(typescript@5.9.3) - '@solana/rpc-spec-types': 5.3.0(typescript@5.9.3) - '@solana/rpc-transformers': 5.3.0(typescript@5.9.3) - '@solana/rpc-transport-http': 5.3.0(typescript@5.9.3) - '@solana/rpc-types': 5.3.0(typescript@5.9.3) + '@solana/errors': 5.4.0(typescript@5.9.3) + '@solana/fast-stable-stringify': 5.4.0(typescript@5.9.3) + '@solana/functional': 5.4.0(typescript@5.9.3) + '@solana/rpc-api': 5.4.0(typescript@5.9.3) + '@solana/rpc-spec': 5.4.0(typescript@5.9.3) + '@solana/rpc-spec-types': 5.4.0(typescript@5.9.3) + '@solana/rpc-transformers': 5.4.0(typescript@5.9.3) + '@solana/rpc-transport-http': 5.4.0(typescript@5.9.3) + '@solana/rpc-types': 5.4.0(typescript@5.9.3) + optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: - fastestsmallesttextencoderdecoder optional: true - '@solana/signers@5.3.0(typescript@5.9.3)': + '@solana/signers@5.4.0(typescript@5.9.3)': dependencies: - '@solana/addresses': 5.3.0(typescript@5.9.3) - '@solana/codecs-core': 5.3.0(typescript@5.9.3) - '@solana/errors': 5.3.0(typescript@5.9.3) - '@solana/instructions': 5.3.0(typescript@5.9.3) - '@solana/keys': 5.3.0(typescript@5.9.3) - '@solana/nominal-types': 5.3.0(typescript@5.9.3) - '@solana/offchain-messages': 5.3.0(typescript@5.9.3) - '@solana/transaction-messages': 5.3.0(typescript@5.9.3) - '@solana/transactions': 5.3.0(typescript@5.9.3) + '@solana/addresses': 5.4.0(typescript@5.9.3) + '@solana/codecs-core': 5.4.0(typescript@5.9.3) + '@solana/errors': 5.4.0(typescript@5.9.3) + '@solana/instructions': 5.4.0(typescript@5.9.3) + '@solana/keys': 5.4.0(typescript@5.9.3) + '@solana/nominal-types': 5.4.0(typescript@5.9.3) + '@solana/offchain-messages': 5.4.0(typescript@5.9.3) + '@solana/transaction-messages': 5.4.0(typescript@5.9.3) + '@solana/transactions': 5.4.0(typescript@5.9.3) + optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: - fastestsmallesttextencoderdecoder optional: true - '@solana/subscribable@5.3.0(typescript@5.9.3)': + '@solana/subscribable@5.4.0(typescript@5.9.3)': dependencies: - '@solana/errors': 5.3.0(typescript@5.9.3) + '@solana/errors': 5.4.0(typescript@5.9.3) + optionalDependencies: typescript: 5.9.3 optional: true - '@solana/sysvars@5.3.0(typescript@5.9.3)': + '@solana/sysvars@5.4.0(typescript@5.9.3)': dependencies: - '@solana/accounts': 5.3.0(typescript@5.9.3) - '@solana/codecs': 5.3.0(typescript@5.9.3) - '@solana/errors': 5.3.0(typescript@5.9.3) - '@solana/rpc-types': 5.3.0(typescript@5.9.3) + '@solana/accounts': 5.4.0(typescript@5.9.3) + '@solana/codecs': 5.4.0(typescript@5.9.3) + '@solana/errors': 5.4.0(typescript@5.9.3) + '@solana/rpc-types': 5.4.0(typescript@5.9.3) + optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: - fastestsmallesttextencoderdecoder optional: true - '@solana/transaction-confirmation@5.3.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)': + '@solana/transaction-confirmation@5.4.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)': dependencies: - '@solana/addresses': 5.3.0(typescript@5.9.3) - '@solana/codecs-strings': 5.3.0(typescript@5.9.3) - '@solana/errors': 5.3.0(typescript@5.9.3) - '@solana/keys': 5.3.0(typescript@5.9.3) - '@solana/promises': 5.3.0(typescript@5.9.3) - '@solana/rpc': 5.3.0(typescript@5.9.3) - '@solana/rpc-subscriptions': 5.3.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) - '@solana/rpc-types': 5.3.0(typescript@5.9.3) - '@solana/transaction-messages': 5.3.0(typescript@5.9.3) - '@solana/transactions': 5.3.0(typescript@5.9.3) + '@solana/addresses': 5.4.0(typescript@5.9.3) + '@solana/codecs-strings': 5.4.0(typescript@5.9.3) + '@solana/errors': 5.4.0(typescript@5.9.3) + '@solana/keys': 5.4.0(typescript@5.9.3) + '@solana/promises': 5.4.0(typescript@5.9.3) + '@solana/rpc': 5.4.0(typescript@5.9.3) + '@solana/rpc-subscriptions': 5.4.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) + '@solana/rpc-types': 5.4.0(typescript@5.9.3) + '@solana/transaction-messages': 5.4.0(typescript@5.9.3) + '@solana/transactions': 5.4.0(typescript@5.9.3) + optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: - bufferutil @@ -5702,36 +6029,38 @@ snapshots: - utf-8-validate optional: true - '@solana/transaction-messages@5.3.0(typescript@5.9.3)': + '@solana/transaction-messages@5.4.0(typescript@5.9.3)': dependencies: - '@solana/addresses': 5.3.0(typescript@5.9.3) - '@solana/codecs-core': 5.3.0(typescript@5.9.3) - '@solana/codecs-data-structures': 5.3.0(typescript@5.9.3) - '@solana/codecs-numbers': 5.3.0(typescript@5.9.3) - '@solana/errors': 5.3.0(typescript@5.9.3) - '@solana/functional': 5.3.0(typescript@5.9.3) - '@solana/instructions': 5.3.0(typescript@5.9.3) - '@solana/nominal-types': 5.3.0(typescript@5.9.3) - '@solana/rpc-types': 5.3.0(typescript@5.9.3) + '@solana/addresses': 5.4.0(typescript@5.9.3) + '@solana/codecs-core': 5.4.0(typescript@5.9.3) + '@solana/codecs-data-structures': 5.4.0(typescript@5.9.3) + '@solana/codecs-numbers': 5.4.0(typescript@5.9.3) + '@solana/errors': 5.4.0(typescript@5.9.3) + '@solana/functional': 5.4.0(typescript@5.9.3) + '@solana/instructions': 5.4.0(typescript@5.9.3) + '@solana/nominal-types': 5.4.0(typescript@5.9.3) + '@solana/rpc-types': 5.4.0(typescript@5.9.3) + optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: - fastestsmallesttextencoderdecoder optional: true - '@solana/transactions@5.3.0(typescript@5.9.3)': - dependencies: - '@solana/addresses': 5.3.0(typescript@5.9.3) - '@solana/codecs-core': 5.3.0(typescript@5.9.3) - '@solana/codecs-data-structures': 5.3.0(typescript@5.9.3) - '@solana/codecs-numbers': 5.3.0(typescript@5.9.3) - '@solana/codecs-strings': 5.3.0(typescript@5.9.3) - '@solana/errors': 5.3.0(typescript@5.9.3) - '@solana/functional': 5.3.0(typescript@5.9.3) - '@solana/instructions': 5.3.0(typescript@5.9.3) - '@solana/keys': 5.3.0(typescript@5.9.3) - '@solana/nominal-types': 5.3.0(typescript@5.9.3) - '@solana/rpc-types': 5.3.0(typescript@5.9.3) - '@solana/transaction-messages': 5.3.0(typescript@5.9.3) + '@solana/transactions@5.4.0(typescript@5.9.3)': + dependencies: + '@solana/addresses': 5.4.0(typescript@5.9.3) + '@solana/codecs-core': 5.4.0(typescript@5.9.3) + '@solana/codecs-data-structures': 5.4.0(typescript@5.9.3) + '@solana/codecs-numbers': 5.4.0(typescript@5.9.3) + '@solana/codecs-strings': 5.4.0(typescript@5.9.3) + '@solana/errors': 5.4.0(typescript@5.9.3) + '@solana/functional': 5.4.0(typescript@5.9.3) + '@solana/instructions': 5.4.0(typescript@5.9.3) + '@solana/keys': 5.4.0(typescript@5.9.3) + '@solana/nominal-types': 5.4.0(typescript@5.9.3) + '@solana/rpc-types': 5.4.0(typescript@5.9.3) + '@solana/transaction-messages': 5.4.0(typescript@5.9.3) + optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: - fastestsmallesttextencoderdecoder @@ -5739,7 +6068,7 @@ snapshots: '@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)': dependencies: - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.28.6 '@noble/curves': 1.9.7 '@noble/hashes': 1.4.0 '@solana/buffer-layout': 4.0.1 @@ -5752,7 +6081,7 @@ snapshots: fast-stable-stringify: 1.0.0 jayson: 4.3.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) node-fetch: 2.7.0 - rpc-websockets: 9.3.2 + rpc-websockets: 9.3.3 superstruct: 2.0.2 transitivePeerDependencies: - bufferutil @@ -5888,30 +6217,24 @@ snapshots: '@tailwindcss/oxide-win32-arm64-msvc': 4.1.18 '@tailwindcss/oxide-win32-x64-msvc': 4.1.18 - '@tailwindcss/vite@4.1.18(vite@7.3.0(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2))': + '@tailwindcss/vite@4.1.18(vite@7.3.1(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2))': dependencies: '@tailwindcss/node': 4.1.18 '@tailwindcss/oxide': 4.1.18 tailwindcss: 4.1.18 - vite: 7.3.0(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2) - - '@tanstack/devtools-client@0.0.3': - dependencies: - '@tanstack/devtools-event-client': 0.3.5 + vite: 7.3.1(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2) '@tanstack/devtools-client@0.0.5': dependencies: '@tanstack/devtools-event-client': 0.4.0 - '@tanstack/devtools-event-bus@0.3.3(bufferutil@4.1.0)(utf-8-validate@5.0.10)': + '@tanstack/devtools-event-bus@0.4.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)': dependencies: ws: 8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - utf-8-validate - '@tanstack/devtools-event-client@0.3.5': {} - '@tanstack/devtools-event-client@0.4.0': {} '@tanstack/devtools-ui@0.4.4(csstype@3.2.3)(solid-js@1.9.10)': @@ -5922,31 +6245,31 @@ snapshots: transitivePeerDependencies: - csstype - '@tanstack/devtools-vite@0.3.12(bufferutil@4.1.0)(utf-8-validate@5.0.10)(vite@7.3.0(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2))': + '@tanstack/devtools-vite@0.4.1(bufferutil@4.1.0)(utf-8-validate@5.0.10)(vite@7.3.1(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2))': dependencies: - '@babel/core': 7.28.5 - '@babel/generator': 7.28.5 - '@babel/parser': 7.28.5 - '@babel/traverse': 7.28.5 - '@babel/types': 7.28.5 + '@babel/core': 7.28.6 + '@babel/generator': 7.28.6 + '@babel/parser': 7.28.6 + '@babel/traverse': 7.28.6 + '@babel/types': 7.28.6 '@tanstack/devtools-client': 0.0.5 - '@tanstack/devtools-event-bus': 0.3.3(bufferutil@4.1.0)(utf-8-validate@5.0.10) + '@tanstack/devtools-event-bus': 0.4.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) chalk: 5.6.2 launch-editor: 2.12.0 picomatch: 4.0.3 - vite: 7.3.0(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2) + vite: 7.3.1(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2) transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - '@tanstack/devtools@0.7.0(bufferutil@4.1.0)(csstype@3.2.3)(solid-js@1.9.10)(utf-8-validate@5.0.10)': + '@tanstack/devtools@0.10.3(bufferutil@4.1.0)(csstype@3.2.3)(solid-js@1.9.10)(utf-8-validate@5.0.10)': dependencies: '@solid-primitives/event-listener': 2.4.3(solid-js@1.9.10) '@solid-primitives/keyboard': 1.3.3(solid-js@1.9.10) '@solid-primitives/resize-observer': 2.1.3(solid-js@1.9.10) - '@tanstack/devtools-client': 0.0.3 - '@tanstack/devtools-event-bus': 0.3.3(bufferutil@4.1.0)(utf-8-validate@5.0.10) + '@tanstack/devtools-client': 0.0.5 + '@tanstack/devtools-event-bus': 0.4.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) '@tanstack/devtools-ui': 0.4.4(csstype@3.2.3)(solid-js@1.9.10) clsx: 2.1.1 goober: 2.1.18(csstype@3.2.3) @@ -5956,15 +6279,15 @@ snapshots: - csstype - utf-8-validate - '@tanstack/history@1.145.7': {} + '@tanstack/history@1.154.14': {} - '@tanstack/query-core@5.90.16': {} + '@tanstack/query-core@5.90.20': {} - '@tanstack/react-devtools@0.7.11(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(bufferutil@4.1.0)(csstype@3.2.3)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(solid-js@1.9.10)(utf-8-validate@5.0.10)': + '@tanstack/react-devtools@0.9.2(@types/react-dom@19.2.3(@types/react@19.2.9))(@types/react@19.2.9)(bufferutil@4.1.0)(csstype@3.2.3)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(solid-js@1.9.10)(utf-8-validate@5.0.10)': dependencies: - '@tanstack/devtools': 0.7.0(bufferutil@4.1.0)(csstype@3.2.3)(solid-js@1.9.10)(utf-8-validate@5.0.10) - '@types/react': 19.2.7 - '@types/react-dom': 19.2.3(@types/react@19.2.7) + '@tanstack/devtools': 0.10.3(bufferutil@4.1.0)(csstype@3.2.3)(solid-js@1.9.10)(utf-8-validate@5.0.10) + '@types/react': 19.2.9 + '@types/react-dom': 19.2.3(@types/react@19.2.9) react: 19.2.3 react-dom: 19.2.3(react@19.2.3) transitivePeerDependencies: @@ -5973,29 +6296,28 @@ snapshots: - solid-js - utf-8-validate - '@tanstack/react-query@5.90.16(react@19.2.3)': + '@tanstack/react-query@5.90.20(react@19.2.3)': dependencies: - '@tanstack/query-core': 5.90.16 + '@tanstack/query-core': 5.90.20 react: 19.2.3 - '@tanstack/react-router-devtools@1.145.7(@tanstack/react-router@1.145.7(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@tanstack/router-core@1.145.7)(csstype@3.2.3)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(solid-js@1.9.10)': + '@tanstack/react-router-devtools@1.157.8(@tanstack/react-router@1.157.8(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@tanstack/router-core@1.157.8)(csstype@3.2.3)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': dependencies: - '@tanstack/react-router': 1.145.7(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@tanstack/router-devtools-core': 1.145.7(@tanstack/router-core@1.145.7)(csstype@3.2.3)(solid-js@1.9.10) + '@tanstack/react-router': 1.157.8(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@tanstack/router-devtools-core': 1.157.8(@tanstack/router-core@1.157.8)(csstype@3.2.3) react: 19.2.3 react-dom: 19.2.3(react@19.2.3) optionalDependencies: - '@tanstack/router-core': 1.145.7 + '@tanstack/router-core': 1.157.8 transitivePeerDependencies: - csstype - - solid-js - '@tanstack/react-router@1.145.7(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + '@tanstack/react-router@1.157.8(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': dependencies: - '@tanstack/history': 1.145.7 + '@tanstack/history': 1.154.14 '@tanstack/react-store': 0.8.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@tanstack/router-core': 1.145.7 - isbot: 5.1.32 + '@tanstack/router-core': 1.157.8 + isbot: 5.1.33 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) tiny-invariant: 1.3.3 @@ -6014,32 +6336,31 @@ snapshots: react: 19.2.3 react-dom: 19.2.3(react@19.2.3) - '@tanstack/router-core@1.145.7': + '@tanstack/router-core@1.157.8': dependencies: - '@tanstack/history': 1.145.7 + '@tanstack/history': 1.154.14 '@tanstack/store': 0.8.0 cookie-es: 2.0.0 - seroval: 1.4.2 - seroval-plugins: 1.4.2(seroval@1.4.2) + seroval: 1.5.0 + seroval-plugins: 1.5.0(seroval@1.5.0) tiny-invariant: 1.3.3 tiny-warning: 1.0.3 - '@tanstack/router-devtools-core@1.145.7(@tanstack/router-core@1.145.7)(csstype@3.2.3)(solid-js@1.9.10)': + '@tanstack/router-devtools-core@1.157.8(@tanstack/router-core@1.157.8)(csstype@3.2.3)': dependencies: - '@tanstack/router-core': 1.145.7 + '@tanstack/router-core': 1.157.8 clsx: 2.1.1 goober: 2.1.18(csstype@3.2.3) - solid-js: 1.9.10 tiny-invariant: 1.3.3 optionalDependencies: csstype: 3.2.3 - '@tanstack/router-generator@1.145.7': + '@tanstack/router-generator@1.157.8': dependencies: - '@tanstack/router-core': 1.145.7 - '@tanstack/router-utils': 1.143.11 - '@tanstack/virtual-file-routes': 1.145.4 - prettier: 3.7.4 + '@tanstack/router-core': 1.157.8 + '@tanstack/router-utils': 1.154.7 + '@tanstack/virtual-file-routes': 1.154.7 + prettier: 3.8.1 recast: 0.23.11 source-map: 0.7.6 tsx: 4.21.0 @@ -6047,35 +6368,35 @@ snapshots: transitivePeerDependencies: - supports-color - '@tanstack/router-plugin@1.145.7(@tanstack/react-router@1.145.7(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(vite@7.3.0(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2))': - dependencies: - '@babel/core': 7.28.5 - '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.5) - '@babel/template': 7.27.2 - '@babel/traverse': 7.28.5 - '@babel/types': 7.28.5 - '@tanstack/router-core': 1.145.7 - '@tanstack/router-generator': 1.145.7 - '@tanstack/router-utils': 1.143.11 - '@tanstack/virtual-file-routes': 1.145.4 - babel-dead-code-elimination: 1.0.11 + '@tanstack/router-plugin@1.157.8(@tanstack/react-router@1.157.8(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(vite@7.3.1(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2))': + dependencies: + '@babel/core': 7.28.6 + '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-syntax-typescript': 7.28.6(@babel/core@7.28.6) + '@babel/template': 7.28.6 + '@babel/traverse': 7.28.6 + '@babel/types': 7.28.6 + '@tanstack/router-core': 1.157.8 + '@tanstack/router-generator': 1.157.8 + '@tanstack/router-utils': 1.154.7 + '@tanstack/virtual-file-routes': 1.154.7 + babel-dead-code-elimination: 1.0.12 chokidar: 3.6.0 unplugin: 2.3.11 zod: 3.25.76 optionalDependencies: - '@tanstack/react-router': 1.145.7(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - vite: 7.3.0(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2) + '@tanstack/react-router': 1.157.8(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + vite: 7.3.1(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2) transitivePeerDependencies: - supports-color - '@tanstack/router-utils@1.143.11': + '@tanstack/router-utils@1.154.7': dependencies: - '@babel/core': 7.28.5 - '@babel/generator': 7.28.5 - '@babel/parser': 7.28.5 + '@babel/core': 7.28.6 + '@babel/generator': 7.28.6 + '@babel/parser': 7.28.6 ansis: 4.2.0 - diff: 8.0.2 + diff: 8.0.3 pathe: 2.0.3 tinyglobby: 0.2.15 transitivePeerDependencies: @@ -6085,7 +6406,7 @@ snapshots: '@tanstack/virtual-core@3.13.18': {} - '@tanstack/virtual-file-routes@1.145.4': {} + '@tanstack/virtual-file-routes@1.154.7': {} '@testing-library/dom@10.4.1': dependencies: @@ -6098,15 +6419,15 @@ snapshots: picocolors: 1.1.1 pretty-format: 27.5.1 - '@testing-library/react@16.3.1(@testing-library/dom@10.4.1)(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + '@testing-library/react@16.3.2(@testing-library/dom@10.4.1)(@types/react-dom@19.2.3(@types/react@19.2.9))(@types/react@19.2.9)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': dependencies: - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.28.6 '@testing-library/dom': 10.4.1 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) optionalDependencies: - '@types/react': 19.2.7 - '@types/react-dom': 19.2.3(@types/react@19.2.7) + '@types/react': 19.2.9 + '@types/react-dom': 19.2.3(@types/react@19.2.9) '@tim-smart/openapi-gen@0.4.13(patch_hash=36720013d0f70c201ce8f233e38a7b93fc9fce74a17f9bc4293c3cf891b4fdc6)': dependencies: @@ -6151,7 +6472,7 @@ snapshots: '@types/bn.js@5.2.0': dependencies: - '@types/node': 22.19.3 + '@types/node': 25.0.10 '@types/chai@5.2.3': dependencies: @@ -6160,7 +6481,7 @@ snapshots: '@types/connect@3.4.38': dependencies: - '@types/node': 22.19.3 + '@types/node': 25.0.10 optional: true '@types/deep-eql@4.0.2': {} @@ -6174,15 +6495,15 @@ snapshots: dependencies: undici-types: 5.26.5 - '@types/node@22.19.3': + '@types/node@25.0.10': dependencies: - undici-types: 6.21.0 + undici-types: 7.16.0 - '@types/react-dom@19.2.3(@types/react@19.2.7)': + '@types/react-dom@19.2.3(@types/react@19.2.9)': dependencies: - '@types/react': 19.2.7 + '@types/react': 19.2.9 - '@types/react@19.2.7': + '@types/react@19.2.9': dependencies: csstype: 3.2.3 @@ -6193,12 +6514,12 @@ snapshots: '@types/ws@7.4.7': dependencies: - '@types/node': 22.19.3 + '@types/node': 25.0.10 optional: true '@types/ws@8.18.1': dependencies: - '@types/node': 22.19.3 + '@types/node': 25.0.10 optional: true '@vite-pwa/assets-generator@1.0.2': @@ -6210,7 +6531,7 @@ snapshots: sharp-ico: 0.1.5 unconfig: 7.4.2 - '@vitejs/plugin-react@5.1.2(vite@7.3.0(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2))': + '@vitejs/plugin-react@5.1.2(vite@7.3.1(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2))': dependencies: '@babel/core': 7.28.5 '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.5) @@ -6218,69 +6539,96 @@ snapshots: '@rolldown/pluginutils': 1.0.0-beta.53 '@types/babel__core': 7.20.5 react-refresh: 0.18.0 - vite: 7.3.0(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2) + vite: 7.3.1(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2) transitivePeerDependencies: - supports-color - '@vitest/expect@3.2.4': + '@vitest/browser-playwright@4.0.18(bufferutil@4.1.0)(playwright@1.58.0)(utf-8-validate@5.0.10)(vite@7.3.1(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2))(vitest@4.0.18)': + dependencies: + '@vitest/browser': 4.0.18(bufferutil@4.1.0)(utf-8-validate@5.0.10)(vite@7.3.1(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2))(vitest@4.0.18) + '@vitest/mocker': 4.0.18(vite@7.3.1(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2)) + playwright: 1.58.0 + tinyrainbow: 3.0.3 + vitest: 4.0.18(@types/node@25.0.10)(@vitest/browser-playwright@4.0.18)(jiti@2.6.1)(jsdom@27.4.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2) + transitivePeerDependencies: + - bufferutil + - msw + - utf-8-validate + - vite + + '@vitest/browser@4.0.18(bufferutil@4.1.0)(utf-8-validate@5.0.10)(vite@7.3.1(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2))(vitest@4.0.18)': + dependencies: + '@vitest/mocker': 4.0.18(vite@7.3.1(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2)) + '@vitest/utils': 4.0.18 + magic-string: 0.30.21 + pixelmatch: 7.1.0 + pngjs: 7.0.0 + sirv: 3.0.2 + tinyrainbow: 3.0.3 + vitest: 4.0.18(@types/node@25.0.10)(@vitest/browser-playwright@4.0.18)(jiti@2.6.1)(jsdom@27.4.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2) + ws: 8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - bufferutil + - msw + - utf-8-validate + - vite + + '@vitest/expect@4.0.18': dependencies: + '@standard-schema/spec': 1.1.0 '@types/chai': 5.2.3 - '@vitest/spy': 3.2.4 - '@vitest/utils': 3.2.4 - chai: 5.3.3 - tinyrainbow: 2.0.0 + '@vitest/spy': 4.0.18 + '@vitest/utils': 4.0.18 + chai: 6.2.2 + tinyrainbow: 3.0.3 - '@vitest/mocker@3.2.4(vite@7.3.0(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2))': + '@vitest/mocker@4.0.18(vite@7.3.1(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2))': dependencies: - '@vitest/spy': 3.2.4 + '@vitest/spy': 4.0.18 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 7.3.0(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2) + vite: 7.3.1(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2) - '@vitest/pretty-format@3.2.4': + '@vitest/pretty-format@4.0.18': dependencies: - tinyrainbow: 2.0.0 + tinyrainbow: 3.0.3 - '@vitest/runner@3.2.4': + '@vitest/runner@4.0.18': dependencies: - '@vitest/utils': 3.2.4 + '@vitest/utils': 4.0.18 pathe: 2.0.3 - strip-literal: 3.1.0 - '@vitest/snapshot@3.2.4': + '@vitest/snapshot@4.0.18': dependencies: - '@vitest/pretty-format': 3.2.4 + '@vitest/pretty-format': 4.0.18 magic-string: 0.30.21 pathe: 2.0.3 - '@vitest/spy@3.2.4': - dependencies: - tinyspy: 4.0.4 + '@vitest/spy@4.0.18': {} - '@vitest/utils@3.2.4': + '@vitest/utils@4.0.18': dependencies: - '@vitest/pretty-format': 3.2.4 - loupe: 3.2.1 - tinyrainbow: 2.0.0 + '@vitest/pretty-format': 4.0.18 + tinyrainbow: 3.0.3 - '@wagmi/connectors@7.1.2(@safe-global/safe-apps-provider@0.18.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(@safe-global/safe-apps-sdk@9.1.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(@wagmi/core@3.2.2(@tanstack/query-core@5.90.16)(@types/react@19.2.7)(ox@0.11.3(typescript@5.9.3)(zod@3.25.76))(react@19.2.3)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.3))(viem@2.44.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)))(typescript@5.9.3)(viem@2.44.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))': + '@wagmi/connectors@7.1.5(@safe-global/safe-apps-provider@0.18.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(@safe-global/safe-apps-sdk@9.1.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(@wagmi/core@3.3.1(@tanstack/query-core@5.90.20)(@types/react@19.2.9)(ox@0.11.3(typescript@5.9.3)(zod@3.25.76))(react@19.2.3)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.3))(viem@2.45.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)))(typescript@5.9.3)(viem@2.45.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))': dependencies: - '@wagmi/core': 3.2.2(@tanstack/query-core@5.90.16)(@types/react@19.2.7)(ox@0.11.3(typescript@5.9.3)(zod@3.25.76))(react@19.2.3)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.3))(viem@2.44.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)) - viem: 2.44.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@wagmi/core': 3.3.1(@tanstack/query-core@5.90.20)(@types/react@19.2.9)(ox@0.11.3(typescript@5.9.3)(zod@3.25.76))(react@19.2.3)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.3))(viem@2.45.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)) + viem: 2.45.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) optionalDependencies: '@safe-global/safe-apps-provider': 0.18.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) '@safe-global/safe-apps-sdk': 9.1.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) typescript: 5.9.3 - '@wagmi/core@3.2.2(@tanstack/query-core@5.90.16)(@types/react@19.2.7)(ox@0.11.3(typescript@5.9.3)(zod@3.25.76))(react@19.2.3)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.3))(viem@2.44.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))': + '@wagmi/core@3.3.1(@tanstack/query-core@5.90.20)(@types/react@19.2.9)(ox@0.11.3(typescript@5.9.3)(zod@3.25.76))(react@19.2.3)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.3))(viem@2.45.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))': dependencies: eventemitter3: 5.0.1 mipd: 0.0.7(typescript@5.9.3) - viem: 2.44.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - zustand: 5.0.0(@types/react@19.2.7)(react@19.2.3)(use-sync-external-store@1.4.0(react@19.2.3)) + viem: 2.45.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + zustand: 5.0.0(@types/react@19.2.9)(react@19.2.3)(use-sync-external-store@1.4.0(react@19.2.3)) optionalDependencies: - '@tanstack/query-core': 5.90.16 + '@tanstack/query-core': 5.90.20 ox: 0.11.3(typescript@5.9.3)(zod@3.25.76) typescript: 5.9.3 transitivePeerDependencies: @@ -6295,7 +6643,7 @@ snapshots: dependencies: '@wallet-standard/base': 1.1.0 - '@walletconnect/core@2.23.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + '@walletconnect/core@2.23.2(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: '@walletconnect/heartbeat': 1.2.2 '@walletconnect/jsonrpc-provider': 1.0.14 @@ -6303,13 +6651,13 @@ snapshots: '@walletconnect/jsonrpc-utils': 1.0.8 '@walletconnect/jsonrpc-ws-connection': 1.0.16(bufferutil@4.1.0)(utf-8-validate@5.0.10) '@walletconnect/keyvaluestorage': 1.1.1 - '@walletconnect/logger': 3.0.1 + '@walletconnect/logger': 3.0.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.23.1 - '@walletconnect/utils': 2.23.1(typescript@5.9.3)(zod@3.25.76) + '@walletconnect/types': 2.23.2 + '@walletconnect/utils': 2.23.2(typescript@5.9.3)(zod@3.25.76) '@walletconnect/window-getters': 1.0.1 es-toolkit: 1.39.3 events: 3.3.0 @@ -6394,7 +6742,7 @@ snapshots: dependencies: '@walletconnect/safe-json': 1.0.2 idb-keyval: 6.2.2 - unstorage: 1.17.3(idb-keyval@6.2.2) + unstorage: 1.17.4(idb-keyval@6.2.2) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -6415,7 +6763,7 @@ snapshots: - ioredis - uploadthing - '@walletconnect/logger@3.0.1': + '@walletconnect/logger@3.0.2': dependencies: '@walletconnect/safe-json': 1.0.2 pino: 10.0.0 @@ -6436,16 +6784,16 @@ snapshots: dependencies: tslib: 1.14.1 - '@walletconnect/sign-client@2.23.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + '@walletconnect/sign-client@2.23.2(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: - '@walletconnect/core': 2.23.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/core': 2.23.2(bufferutil@4.1.0)(typescript@5.9.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': 3.0.1 + '@walletconnect/logger': 3.0.2 '@walletconnect/time': 1.0.2 - '@walletconnect/types': 2.23.1 - '@walletconnect/utils': 2.23.1(typescript@5.9.3)(zod@3.25.76) + '@walletconnect/types': 2.23.2 + '@walletconnect/utils': 2.23.2(typescript@5.9.3)(zod@3.25.76) events: 3.3.0 transitivePeerDependencies: - '@azure/app-configuration' @@ -6476,13 +6824,13 @@ snapshots: dependencies: tslib: 1.14.1 - '@walletconnect/types@2.23.1': + '@walletconnect/types@2.23.2': dependencies: '@walletconnect/events': 1.0.1 '@walletconnect/heartbeat': 1.2.2 '@walletconnect/jsonrpc-types': 1.0.4 '@walletconnect/keyvaluestorage': 1.1.1 - '@walletconnect/logger': 3.0.1 + '@walletconnect/logger': 3.0.2 events: 3.3.0 transitivePeerDependencies: - '@azure/app-configuration' @@ -6505,7 +6853,7 @@ snapshots: - ioredis - uploadthing - '@walletconnect/universal-provider@2.23.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + '@walletconnect/universal-provider@2.23.2(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: '@walletconnect/events': 1.0.1 '@walletconnect/jsonrpc-http-connection': 1.0.8 @@ -6513,10 +6861,10 @@ snapshots: '@walletconnect/jsonrpc-types': 1.0.4 '@walletconnect/jsonrpc-utils': 1.0.8 '@walletconnect/keyvaluestorage': 1.1.1 - '@walletconnect/logger': 3.0.1 - '@walletconnect/sign-client': 2.23.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - '@walletconnect/types': 2.23.1 - '@walletconnect/utils': 2.23.1(typescript@5.9.3)(zod@3.25.76) + '@walletconnect/logger': 3.0.2 + '@walletconnect/sign-client': 2.23.2(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/types': 2.23.2 + '@walletconnect/utils': 2.23.2(typescript@5.9.3)(zod@3.25.76) es-toolkit: 1.39.3 events: 3.3.0 transitivePeerDependencies: @@ -6545,7 +6893,7 @@ snapshots: - utf-8-validate - zod - '@walletconnect/utils@2.23.1(typescript@5.9.3)(zod@3.25.76)': + '@walletconnect/utils@2.23.2(typescript@5.9.3)(zod@3.25.76)': dependencies: '@msgpack/msgpack': 3.1.2 '@noble/ciphers': 1.3.0 @@ -6554,12 +6902,12 @@ snapshots: '@scure/base': 1.2.6 '@walletconnect/jsonrpc-utils': 1.0.8 '@walletconnect/keyvaluestorage': 1.1.1 - '@walletconnect/logger': 3.0.1 + '@walletconnect/logger': 3.0.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.23.1 + '@walletconnect/types': 2.23.2 '@walletconnect/window-getters': 1.0.1 '@walletconnect/window-metadata': 1.0.1 blakejs: 1.2.1 @@ -6672,13 +7020,13 @@ snapshots: dependencies: possible-typed-array-names: 1.1.0 - axios-retry@4.5.0(axios@1.13.2): + axios-retry@4.5.0(axios@1.13.3): dependencies: - axios: 1.13.2 + axios: 1.13.3 is-retry-allowed: 2.2.0 optional: true - axios@1.13.2: + axios@1.13.3: dependencies: follow-redirects: 1.15.11 form-data: 4.0.5 @@ -6687,12 +7035,12 @@ snapshots: - debug optional: true - babel-dead-code-elimination@1.0.11: + babel-dead-code-elimination@1.0.12: dependencies: - '@babel/core': 7.28.5 - '@babel/parser': 7.28.5 - '@babel/traverse': 7.28.5 - '@babel/types': 7.28.5 + '@babel/core': 7.28.6 + '@babel/parser': 7.28.6 + '@babel/traverse': 7.28.6 + '@babel/types': 7.28.6 transitivePeerDependencies: - supports-color @@ -6854,21 +7202,13 @@ snapshots: caniuse-lite@1.0.30001762: {} - chai@5.3.3: - dependencies: - assertion-error: 2.0.1 - check-error: 2.1.3 - deep-eql: 5.0.2 - loupe: 3.2.1 - pathval: 2.0.1 + chai@6.2.2: {} chalk@5.6.2: {} charenc@0.0.2: optional: true - check-error@2.1.3: {} - chokidar@3.6.0: dependencies: anymatch: 3.1.3 @@ -6881,9 +7221,9 @@ snapshots: optionalDependencies: fsevents: 2.3.3 - chokidar@4.0.3: + chokidar@5.0.0: dependencies: - readdirp: 4.1.2 + readdirp: 5.0.0 cipher-base@1.0.7: dependencies: @@ -7047,8 +7387,6 @@ snapshots: decode-bmp: 0.2.1 to-data-view: 1.1.0 - deep-eql@5.0.2: {} - define-data-property@1.1.4: dependencies: es-define-property: 1.0.1 @@ -7080,11 +7418,9 @@ snapshots: detect-browser@5.3.0: {} - detect-libc@1.0.3: {} - detect-libc@2.1.2: {} - diff@8.0.2: {} + diff@8.0.3: {} diffie-hellman@5.0.3: dependencies: @@ -7104,7 +7440,7 @@ snapshots: es-errors: 1.3.0 gopd: 1.2.0 - effect@3.19.14: + effect@3.19.15: dependencies: '@standard-schema/spec': 1.1.0 fast-check: 3.23.2 @@ -7256,6 +7592,9 @@ snapshots: mime-types: 2.1.35 optional: true + fsevents@2.3.2: + optional: true + fsevents@2.3.3: optional: true @@ -7301,7 +7640,7 @@ snapshots: graceful-fs@4.2.11: {} - h3@1.15.4: + h3@1.15.5: dependencies: cookie-es: 1.2.2 crossws: 0.3.5 @@ -7310,7 +7649,7 @@ snapshots: iron-webcrypto: 1.2.1 node-mock-http: 1.0.4 radix3: 1.1.2 - ufo: 1.6.2 + ufo: 1.6.3 uncrypto: 0.1.3 has-property-descriptors@1.0.2: @@ -7447,13 +7786,13 @@ snapshots: is-typed-array@1.1.15: dependencies: - which-typed-array: 1.1.19 + which-typed-array: 1.1.20 isarray@1.0.0: {} isarray@2.0.5: {} - isbot@5.1.32: {} + isbot@5.1.33: {} isomorphic-timers-promises@1.0.1: {} @@ -7492,8 +7831,6 @@ snapshots: js-tokens@4.0.0: {} - js-tokens@9.0.1: {} - jsdom@27.4.0(bufferutil@4.1.0)(utf-8-validate@5.0.10): dependencies: '@acemir/cssom': 0.9.30 @@ -7615,17 +7952,13 @@ snapshots: lodash.clonedeep@4.5.0: {} - loupe@3.2.1: {} - - lru-cache@10.4.3: {} - lru-cache@11.2.4: {} lru-cache@5.1.1: dependencies: yallist: 3.1.1 - lucide-react@0.544.0(react@19.2.3): + lucide-react@0.563.0(react@19.2.3): dependencies: react: 19.2.3 @@ -7652,11 +7985,6 @@ snapshots: mdn-data@2.12.2: {} - micromatch@4.0.8: - dependencies: - braces: 3.0.3 - picomatch: 2.3.1 - miller-rabin@4.0.1: dependencies: bn.js: 4.12.2 @@ -7680,6 +8008,8 @@ snapshots: optionalDependencies: typescript: 5.9.3 + mrmime@2.0.1: {} + ms@2.1.3: {} msgpackr-extract@3.0.3: @@ -7774,11 +8104,13 @@ snapshots: has-symbols: 1.1.0 object-keys: 1.1.1 + obug@2.1.1: {} + ofetch@1.5.1: dependencies: destr: 2.0.5 node-fetch-native: 1.6.7 - ufo: 1.6.2 + ufo: 1.6.3 on-exit-leak-free@2.1.2: {} @@ -7890,8 +8222,6 @@ snapshots: pathe@2.0.3: {} - pathval@2.0.1: {} - pbkdf2@3.1.5: dependencies: create-hash: 1.2.0 @@ -7911,14 +8241,14 @@ snapshots: dependencies: split2: 4.2.0 - pino-std-serializers@7.0.0: {} + pino-std-serializers@7.1.0: {} pino@10.0.0: dependencies: atomic-sleep: 1.0.0 on-exit-leak-free: 2.1.2 pino-abstract-transport: 2.0.0 - pino-std-serializers: 7.0.0 + pino-std-serializers: 7.1.0 process-warning: 5.0.0 quick-format-unescaped: 4.0.4 real-require: 0.2.0 @@ -7927,12 +8257,26 @@ snapshots: sonic-boom: 4.2.0 thread-stream: 3.1.0 + pixelmatch@7.1.0: + dependencies: + pngjs: 7.0.0 + pkg-dir@5.0.0: dependencies: find-up: 5.0.0 + playwright-core@1.58.0: {} + + playwright@1.58.0: + dependencies: + playwright-core: 1.58.0 + optionalDependencies: + fsevents: 2.3.2 + pngjs@5.0.0: {} + pngjs@7.0.0: {} + possible-typed-array-names@1.1.0: {} postcss@8.5.6: @@ -7944,7 +8288,7 @@ snapshots: preact@10.24.2: optional: true - prettier@3.7.4: {} + prettier@3.8.1: {} pretty-format@27.5.1: dependencies: @@ -8037,7 +8381,7 @@ snapshots: dependencies: picomatch: 2.3.1 - readdirp@4.1.2: {} + readdirp@5.0.0: {} real-require@0.2.0: {} @@ -8072,38 +8416,38 @@ snapshots: hash-base: 3.1.2 inherits: 2.0.4 - rollup@4.55.1: + rollup@4.56.0: dependencies: '@types/estree': 1.0.8 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.55.1 - '@rollup/rollup-android-arm64': 4.55.1 - '@rollup/rollup-darwin-arm64': 4.55.1 - '@rollup/rollup-darwin-x64': 4.55.1 - '@rollup/rollup-freebsd-arm64': 4.55.1 - '@rollup/rollup-freebsd-x64': 4.55.1 - '@rollup/rollup-linux-arm-gnueabihf': 4.55.1 - '@rollup/rollup-linux-arm-musleabihf': 4.55.1 - '@rollup/rollup-linux-arm64-gnu': 4.55.1 - '@rollup/rollup-linux-arm64-musl': 4.55.1 - '@rollup/rollup-linux-loong64-gnu': 4.55.1 - '@rollup/rollup-linux-loong64-musl': 4.55.1 - '@rollup/rollup-linux-ppc64-gnu': 4.55.1 - '@rollup/rollup-linux-ppc64-musl': 4.55.1 - '@rollup/rollup-linux-riscv64-gnu': 4.55.1 - '@rollup/rollup-linux-riscv64-musl': 4.55.1 - '@rollup/rollup-linux-s390x-gnu': 4.55.1 - '@rollup/rollup-linux-x64-gnu': 4.55.1 - '@rollup/rollup-linux-x64-musl': 4.55.1 - '@rollup/rollup-openbsd-x64': 4.55.1 - '@rollup/rollup-openharmony-arm64': 4.55.1 - '@rollup/rollup-win32-arm64-msvc': 4.55.1 - '@rollup/rollup-win32-ia32-msvc': 4.55.1 - '@rollup/rollup-win32-x64-gnu': 4.55.1 - '@rollup/rollup-win32-x64-msvc': 4.55.1 + '@rollup/rollup-android-arm-eabi': 4.56.0 + '@rollup/rollup-android-arm64': 4.56.0 + '@rollup/rollup-darwin-arm64': 4.56.0 + '@rollup/rollup-darwin-x64': 4.56.0 + '@rollup/rollup-freebsd-arm64': 4.56.0 + '@rollup/rollup-freebsd-x64': 4.56.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.56.0 + '@rollup/rollup-linux-arm-musleabihf': 4.56.0 + '@rollup/rollup-linux-arm64-gnu': 4.56.0 + '@rollup/rollup-linux-arm64-musl': 4.56.0 + '@rollup/rollup-linux-loong64-gnu': 4.56.0 + '@rollup/rollup-linux-loong64-musl': 4.56.0 + '@rollup/rollup-linux-ppc64-gnu': 4.56.0 + '@rollup/rollup-linux-ppc64-musl': 4.56.0 + '@rollup/rollup-linux-riscv64-gnu': 4.56.0 + '@rollup/rollup-linux-riscv64-musl': 4.56.0 + '@rollup/rollup-linux-s390x-gnu': 4.56.0 + '@rollup/rollup-linux-x64-gnu': 4.56.0 + '@rollup/rollup-linux-x64-musl': 4.56.0 + '@rollup/rollup-openbsd-x64': 4.56.0 + '@rollup/rollup-openharmony-arm64': 4.56.0 + '@rollup/rollup-win32-arm64-msvc': 4.56.0 + '@rollup/rollup-win32-ia32-msvc': 4.56.0 + '@rollup/rollup-win32-x64-gnu': 4.56.0 + '@rollup/rollup-win32-x64-msvc': 4.56.0 fsevents: 2.3.3 - rpc-websockets@9.3.2: + rpc-websockets@9.3.3: dependencies: '@swc/helpers': 0.5.18 '@types/uuid': 8.3.4 @@ -8149,13 +8493,13 @@ snapshots: dependencies: seroval: 1.3.2 - seroval-plugins@1.4.2(seroval@1.4.2): + seroval-plugins@1.5.0(seroval@1.5.0): dependencies: - seroval: 1.4.2 + seroval: 1.5.0 seroval@1.3.2: {} - seroval@1.4.2: {} + seroval@1.5.0: {} set-blocking@2.0.0: {} @@ -8244,6 +8588,12 @@ snapshots: dependencies: is-arrayish: 0.3.4 + sirv@3.0.2: + dependencies: + '@polka/url': 1.0.0-next.29 + mrmime: 2.0.1 + totalist: 3.0.1 + slow-redact@0.3.2: {} solid-js@1.9.10: @@ -8311,10 +8661,6 @@ snapshots: dependencies: ansi-regex: 5.0.1 - strip-literal@3.1.0: - dependencies: - js-tokens: 9.0.1 - superstruct@2.0.2: optional: true @@ -8347,18 +8693,14 @@ snapshots: tinybench@2.9.0: {} - tinyexec@0.3.2: {} + tinyexec@1.0.2: {} tinyglobby@0.2.15: dependencies: fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 - tinypool@1.1.1: {} - - tinyrainbow@2.0.0: {} - - tinyspy@4.0.4: {} + tinyrainbow@3.0.3: {} tldts-core@7.0.19: {} @@ -8378,6 +8720,8 @@ snapshots: dependencies: is-number: 7.0.0 + totalist@3.0.1: {} + tough-cookie@6.0.0: dependencies: tldts: 7.0.19 @@ -8413,7 +8757,7 @@ snapshots: typescript@5.9.3: {} - ufo@1.6.2: {} + ufo@1.6.3: {} uint8arrays@3.1.1: dependencies: @@ -8436,12 +8780,12 @@ snapshots: undici-types@5.26.5: {} - undici-types@6.21.0: {} + undici-types@7.16.0: {} - undici-types@7.18.2: + undici-types@7.19.1: optional: true - undici@7.18.2: {} + undici@7.19.1: {} unplugin@2.3.11: dependencies: @@ -8450,16 +8794,16 @@ snapshots: picomatch: 4.0.3 webpack-virtual-modules: 0.6.2 - unstorage@1.17.3(idb-keyval@6.2.2): + unstorage@1.17.4(idb-keyval@6.2.2): dependencies: anymatch: 3.1.3 - chokidar: 4.0.3 + chokidar: 5.0.0 destr: 2.0.5 - h3: 1.15.4 - lru-cache: 10.4.3 + h3: 1.15.5 + lru-cache: 11.2.4 node-fetch-native: 1.6.7 ofetch: 1.5.1 - ufo: 1.6.2 + ufo: 1.6.3 optionalDependencies: idb-keyval: 6.2.2 @@ -8495,7 +8839,7 @@ snapshots: is-arguments: 1.2.0 is-generator-function: 1.1.2 is-typed-array: 1.1.15 - which-typed-array: 1.1.19 + which-typed-array: 1.1.20 uuid@11.1.0: {} @@ -8504,14 +8848,14 @@ snapshots: uuid@9.0.1: {} - valtio@2.1.7(@types/react@19.2.7)(react@19.2.3): + valtio@2.1.7(@types/react@19.2.9)(react@19.2.3): dependencies: proxy-compare: 3.0.1 optionalDependencies: - '@types/react': 19.2.7 + '@types/react': 19.2.9 react: 19.2.3 - viem@2.44.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.22.4): + viem@2.45.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.22.4): dependencies: '@noble/curves': 1.9.1 '@noble/hashes': 1.8.0 @@ -8528,7 +8872,7 @@ snapshots: - utf-8-validate - zod - viem@2.44.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76): + viem@2.45.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76): dependencies: '@noble/curves': 1.9.1 '@noble/hashes': 1.8.0 @@ -8545,78 +8889,64 @@ snapshots: - utf-8-validate - zod - vite-node@3.2.4(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2): - dependencies: - cac: 6.7.14 - debug: 4.4.3 - es-module-lexer: 1.7.0 - pathe: 2.0.3 - vite: 7.3.0(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2) - transitivePeerDependencies: - - '@types/node' - - jiti - - less - - lightningcss - - sass - - sass-embedded - - stylus - - sugarss - - supports-color - - terser - - tsx - - yaml - - vite-plugin-node-polyfills@0.24.0(rollup@4.55.1)(vite@7.3.0(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2)): + vite-plugin-node-polyfills@0.25.0(rollup@4.56.0)(vite@7.3.1(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2)): dependencies: - '@rollup/plugin-inject': 5.0.5(rollup@4.55.1) + '@rollup/plugin-inject': 5.0.5(rollup@4.56.0) node-stdlib-browser: 1.3.1 - vite: 7.3.0(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2) + vite: 7.3.1(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2) transitivePeerDependencies: - rollup - vite@7.3.0(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2): + vite@7.3.1(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2): dependencies: esbuild: 0.27.2 fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 postcss: 8.5.6 - rollup: 4.55.1 + rollup: 4.56.0 tinyglobby: 0.2.15 optionalDependencies: - '@types/node': 22.19.3 + '@types/node': 25.0.10 fsevents: 2.3.3 jiti: 2.6.1 lightningcss: 1.30.2 tsx: 4.21.0 yaml: 2.8.2 - vitest@3.2.4(@types/node@22.19.3)(jiti@2.6.1)(jsdom@27.4.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2): + vitest-browser-react@2.0.4(@types/react-dom@19.2.3(@types/react@19.2.9))(@types/react@19.2.9)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(vitest@4.0.18): dependencies: - '@types/chai': 5.2.3 - '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@7.3.0(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2)) - '@vitest/pretty-format': 3.2.4 - '@vitest/runner': 3.2.4 - '@vitest/snapshot': 3.2.4 - '@vitest/spy': 3.2.4 - '@vitest/utils': 3.2.4 - chai: 5.3.3 - debug: 4.4.3 + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + vitest: 4.0.18(@types/node@25.0.10)(@vitest/browser-playwright@4.0.18)(jiti@2.6.1)(jsdom@27.4.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2) + optionalDependencies: + '@types/react': 19.2.9 + '@types/react-dom': 19.2.3(@types/react@19.2.9) + + vitest@4.0.18(@types/node@25.0.10)(@vitest/browser-playwright@4.0.18)(jiti@2.6.1)(jsdom@27.4.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2): + dependencies: + '@vitest/expect': 4.0.18 + '@vitest/mocker': 4.0.18(vite@7.3.1(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2)) + '@vitest/pretty-format': 4.0.18 + '@vitest/runner': 4.0.18 + '@vitest/snapshot': 4.0.18 + '@vitest/spy': 4.0.18 + '@vitest/utils': 4.0.18 + es-module-lexer: 1.7.0 expect-type: 1.3.0 magic-string: 0.30.21 + obug: 2.1.1 pathe: 2.0.3 picomatch: 4.0.3 std-env: 3.10.0 tinybench: 2.9.0 - tinyexec: 0.3.2 + tinyexec: 1.0.2 tinyglobby: 0.2.15 - tinypool: 1.1.1 - tinyrainbow: 2.0.0 - vite: 7.3.0(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2) - vite-node: 3.2.4(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2) + tinyrainbow: 3.0.3 + vite: 7.3.1(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 22.19.3 + '@types/node': 25.0.10 + '@vitest/browser-playwright': 4.0.18(bufferutil@4.1.0)(playwright@1.58.0)(utf-8-validate@5.0.10)(vite@7.3.1(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2))(vitest@4.0.18) jsdom: 27.4.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) transitivePeerDependencies: - jiti @@ -8627,7 +8957,6 @@ snapshots: - sass-embedded - stylus - sugarss - - supports-color - terser - tsx - yaml @@ -8638,14 +8967,14 @@ snapshots: dependencies: xml-name-validator: 5.0.0 - wagmi@3.3.2(@safe-global/safe-apps-provider@0.18.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(@safe-global/safe-apps-sdk@9.1.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(@tanstack/query-core@5.90.16)(@tanstack/react-query@5.90.16(react@19.2.3))(@types/react@19.2.7)(ox@0.11.3(typescript@5.9.3)(zod@3.25.76))(react@19.2.3)(typescript@5.9.3)(viem@2.44.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)): + wagmi@3.4.1(@safe-global/safe-apps-provider@0.18.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(@safe-global/safe-apps-sdk@9.1.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(@tanstack/query-core@5.90.20)(@tanstack/react-query@5.90.20(react@19.2.3))(@types/react@19.2.9)(ox@0.11.3(typescript@5.9.3)(zod@3.25.76))(react@19.2.3)(typescript@5.9.3)(viem@2.45.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)): dependencies: - '@tanstack/react-query': 5.90.16(react@19.2.3) - '@wagmi/connectors': 7.1.2(@safe-global/safe-apps-provider@0.18.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(@safe-global/safe-apps-sdk@9.1.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(@wagmi/core@3.2.2(@tanstack/query-core@5.90.16)(@types/react@19.2.7)(ox@0.11.3(typescript@5.9.3)(zod@3.25.76))(react@19.2.3)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.3))(viem@2.44.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)))(typescript@5.9.3)(viem@2.44.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)) - '@wagmi/core': 3.2.2(@tanstack/query-core@5.90.16)(@types/react@19.2.7)(ox@0.11.3(typescript@5.9.3)(zod@3.25.76))(react@19.2.3)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.3))(viem@2.44.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)) + '@tanstack/react-query': 5.90.20(react@19.2.3) + '@wagmi/connectors': 7.1.5(@safe-global/safe-apps-provider@0.18.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(@safe-global/safe-apps-sdk@9.1.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(@wagmi/core@3.3.1(@tanstack/query-core@5.90.20)(@types/react@19.2.9)(ox@0.11.3(typescript@5.9.3)(zod@3.25.76))(react@19.2.3)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.3))(viem@2.45.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)))(typescript@5.9.3)(viem@2.45.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)) + '@wagmi/core': 3.3.1(@tanstack/query-core@5.90.20)(@types/react@19.2.9)(ox@0.11.3(typescript@5.9.3)(zod@3.25.76))(react@19.2.3)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.3))(viem@2.45.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)) react: 19.2.3 use-sync-external-store: 1.4.0(react@19.2.3) - viem: 2.44.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + viem: 2.45.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: @@ -8682,7 +9011,7 @@ snapshots: which-module@2.0.1: {} - which-typed-array@1.1.19: + which-typed-array@1.1.20: dependencies: available-typed-arrays: 1.0.7 call-bind: 1.0.8 @@ -8777,15 +9106,15 @@ snapshots: zod@3.25.76: {} - zustand@5.0.0(@types/react@19.2.7)(react@19.2.3)(use-sync-external-store@1.4.0(react@19.2.3)): + zustand@5.0.0(@types/react@19.2.9)(react@19.2.3)(use-sync-external-store@1.4.0(react@19.2.3)): optionalDependencies: - '@types/react': 19.2.7 + '@types/react': 19.2.9 react: 19.2.3 use-sync-external-store: 1.4.0(react@19.2.3) - zustand@5.0.3(@types/react@19.2.7)(react@19.2.3)(use-sync-external-store@1.4.0(react@19.2.3)): + zustand@5.0.3(@types/react@19.2.9)(react@19.2.3)(use-sync-external-store@1.4.0(react@19.2.3)): optionalDependencies: - '@types/react': 19.2.7 + '@types/react': 19.2.9 react: 19.2.3 use-sync-external-store: 1.4.0(react@19.2.3) optional: true diff --git a/src/index.tsx b/src/app.tsx similarity index 69% rename from src/index.tsx rename to src/app.tsx index 68fdc2a..bd82f6a 100644 --- a/src/index.tsx +++ b/src/app.tsx @@ -3,15 +3,10 @@ import { createRouter, RouterProvider, } from "@tanstack/react-router"; -import { StrictMode } from "react"; -import { Toaster } from "@/components/ui/toaster.tsx"; -import { - RootContainerProvider, - useRootContainer, -} from "@/context/root-container.tsx"; +import { useRootContainer } from "@/context/root-container.tsx"; import "./styles.css"; import { PreloadAtoms } from "@/components/modules/Root/PreloadAtoms.tsx"; -import { AppKit } from "@/context/appkit.tsx"; +import { Providers } from "@/context/index.tsx"; import { routeTree } from "./routeTree.gen.ts"; // const history = createMemoryHistory(); @@ -47,15 +42,10 @@ const App = () => { const AppWithProviders = () => { return ( - - - - - - - - - + + + + ); }; diff --git a/src/components/modules/Order/Overview/leverage-dialog.tsx b/src/components/modules/Order/Overview/leverage-dialog.tsx index 7f5d053..cd16af0 100644 --- a/src/components/modules/Order/Overview/leverage-dialog.tsx +++ b/src/components/modules/Order/Overview/leverage-dialog.tsx @@ -105,7 +105,10 @@ export function LeverageDialogContent({
{/* Header */}
- + Leverage
@@ -195,6 +201,7 @@ export function LeverageDialogContent({ + {PRICE_QUICK_ADJUSTMENTS.map((percent) => (
@@ -144,3 +141,50 @@ function LimitPriceDialogContent({
); } + +const limitPriceFormBuilder = FormBuilder.empty.addField( + "Amount", + Schema.Union( + Schema.transform(Schema.Literal(""), Schema.Null, { + strict: true, + decode: () => null, + encode: () => "" as const, + }), + Schema.NumberFromString.pipe( + Schema.annotations({ message: () => "Invalid amount" }), + ), + ), +); + +const LimitPriceForm = FormReact.make(limitPriceFormBuilder, { + fields: { + Amount: ({ field }) => ( +
+ field.onChange(e.target.value)} + onBlur={field.onBlur} + placeholder="Enter value" + className={clsx( + "flex-1 h-full bg-transparent px-4 text-white text-sm font-normal placeholder:text-gray-2 focus:outline-none", + )} + /> + + USD +
+ ), + }, + onSubmit: ( + args: { onSubmit: (limitPrice: number | null) => void }, + { decoded }, + ) => args.onSubmit(decoded.Amount), +}); diff --git a/src/components/molecules/tp-sl-dialog.tsx b/src/components/molecules/tp-sl-dialog.tsx index 4af2536..f8e41f3 100644 --- a/src/components/molecules/tp-sl-dialog.tsx +++ b/src/components/molecules/tp-sl-dialog.tsx @@ -1,4 +1,5 @@ import type { DialogRootActions } from "@base-ui/react/dialog"; +import { Match } from "effect"; import { X } from "lucide-react"; import { useRef, useState } from "react"; import { Button } from "@/components/ui/button"; @@ -87,12 +88,13 @@ function TPOrSLDialogContent({ }: TPOrSLDialogContentProps) { const [localSettings, setLocalSettings] = useState(settings); + const dialogTitle = Match.value(mode).pipe( + Match.when("takeProfit", () => "Take profit"), + Match.when("stopLoss", () => "Stop loss"), + Match.orElse(() => "Take profit and stop loss"), + ); + const isSingleMode = mode !== undefined; - const dialogTitle = isSingleMode - ? mode === "takeProfit" - ? "Take profit" - : "Stop loss" - : "Take profit and stop loss"; const calculateTriggerPrice = ( option: TPOrSLPercentageOption, @@ -392,7 +394,7 @@ function TPOrSLInputFields({ onTriggerPriceChange(e.target.value)} placeholder="Trigger price" className="w-full h-full bg-transparent text-white text-sm font-normal tracking-[-0.42px] pl-4 pr-10 outline-none placeholder:text-gray-2" @@ -405,7 +407,7 @@ function TPOrSLInputFields({ onPercentChange(e.target.value)} placeholder={percentPlaceholder} className="w-full h-full bg-transparent text-white text-sm font-normal tracking-[-0.42px] pl-4 pr-8 outline-none placeholder:text-gray-2" diff --git a/src/context/index.tsx b/src/context/index.tsx new file mode 100644 index 0000000..b6ef508 --- /dev/null +++ b/src/context/index.tsx @@ -0,0 +1,17 @@ +import { StrictMode } from "react"; +import { Toaster } from "@/components/ui/toaster"; +import { AppKit } from "@/context/appkit"; +import { RootContainerProvider } from "@/context/root-container"; + +export const Providers = ({ children }: { children: React.ReactNode }) => { + return ( + + + + + {children} + + + + ); +}; diff --git a/src/main.tsx b/src/main.tsx index 9ecc2df..fcdc99a 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -1,6 +1,6 @@ import ReactDOM from "react-dom/client"; import "./main.css"; -import App from "@/index.tsx"; +import App from "@/app"; const rootElement = document.getElementById("app"); if (rootElement && !rootElement.innerHTML) { diff --git a/src/routeTree.gen.ts b/src/routeTree.gen.ts index 37a2275..8304fd6 100644 --- a/src/routeTree.gen.ts +++ b/src/routeTree.gen.ts @@ -112,18 +112,18 @@ export interface FileRoutesByFullPath { '/': typeof IndexRoute '/account/deposit': typeof AccountDepositRoute '/account/withdraw': typeof AccountWithdrawRoute - '/account': typeof AccountIndexRoute + '/account/': typeof AccountIndexRoute '/account/deposit/sign': typeof AccountDepositSignRoute '/account/withdraw/sign': typeof AccountWithdrawSignRoute '/position-details/$marketId/close': typeof PositionDetailsMarketIdCloseRoute - '/position-details/$marketId': typeof PositionDetailsMarketIdIndexRoute + '/position-details/$marketId/': typeof PositionDetailsMarketIdIndexRoute '/order/$marketId/$side/sign': typeof OrderMarketIdSideSignRoute '/position-details/$marketId/cancel-order/sign': typeof PositionDetailsMarketIdCancelOrderSignRoute '/position-details/$marketId/close/sign': typeof PositionDetailsMarketIdCloseSignRoute '/position-details/$marketId/edit-sl-tp/sign': typeof PositionDetailsMarketIdEditSlTpSignRoute - '/order/$marketId/$side': typeof OrderMarketIdSideIndexRoute - '/position-details/$marketId/edit-leverage': typeof PositionDetailsMarketIdEditLeverageIndexRoute - '/order/$marketId/$side/increase': typeof OrderMarketIdSideIncreaseIndexRoute + '/order/$marketId/$side/': typeof OrderMarketIdSideIndexRoute + '/position-details/$marketId/edit-leverage/': typeof PositionDetailsMarketIdEditLeverageIndexRoute + '/order/$marketId/$side/increase/': typeof OrderMarketIdSideIncreaseIndexRoute } export interface FileRoutesByTo { '/': typeof IndexRoute @@ -166,18 +166,18 @@ export interface FileRouteTypes { | '/' | '/account/deposit' | '/account/withdraw' - | '/account' + | '/account/' | '/account/deposit/sign' | '/account/withdraw/sign' | '/position-details/$marketId/close' - | '/position-details/$marketId' + | '/position-details/$marketId/' | '/order/$marketId/$side/sign' | '/position-details/$marketId/cancel-order/sign' | '/position-details/$marketId/close/sign' | '/position-details/$marketId/edit-sl-tp/sign' - | '/order/$marketId/$side' - | '/position-details/$marketId/edit-leverage' - | '/order/$marketId/$side/increase' + | '/order/$marketId/$side/' + | '/position-details/$marketId/edit-leverage/' + | '/order/$marketId/$side/increase/' fileRoutesByTo: FileRoutesByTo to: | '/' @@ -244,7 +244,7 @@ declare module '@tanstack/react-router' { '/account/': { id: '/account/' path: '/account' - fullPath: '/account' + fullPath: '/account/' preLoaderRoute: typeof AccountIndexRouteImport parentRoute: typeof rootRouteImport } @@ -265,7 +265,7 @@ declare module '@tanstack/react-router' { '/position-details/$marketId/': { id: '/position-details/$marketId/' path: '/position-details/$marketId' - fullPath: '/position-details/$marketId' + fullPath: '/position-details/$marketId/' preLoaderRoute: typeof PositionDetailsMarketIdIndexRouteImport parentRoute: typeof rootRouteImport } @@ -293,14 +293,14 @@ declare module '@tanstack/react-router' { '/position-details/$marketId/edit-leverage_/': { id: '/position-details/$marketId/edit-leverage_/' path: '/position-details/$marketId/edit-leverage' - fullPath: '/position-details/$marketId/edit-leverage' + fullPath: '/position-details/$marketId/edit-leverage/' preLoaderRoute: typeof PositionDetailsMarketIdEditLeverageIndexRouteImport parentRoute: typeof rootRouteImport } '/order/$marketId/$side/': { id: '/order/$marketId/$side/' path: '/order/$marketId/$side' - fullPath: '/order/$marketId/$side' + fullPath: '/order/$marketId/$side/' preLoaderRoute: typeof OrderMarketIdSideIndexRouteImport parentRoute: typeof rootRouteImport } @@ -335,7 +335,7 @@ declare module '@tanstack/react-router' { '/order/$marketId/$side/increase_/': { id: '/order/$marketId/$side/increase_/' path: '/order/$marketId/$side/increase' - fullPath: '/order/$marketId/$side/increase' + fullPath: '/order/$marketId/$side/increase/' preLoaderRoute: typeof OrderMarketIdSideIncreaseIndexRouteImport parentRoute: typeof rootRouteImport } diff --git a/tests/components/leverage-dialog.test.tsx b/tests/components/leverage-dialog.test.tsx new file mode 100644 index 0000000..a702a4c --- /dev/null +++ b/tests/components/leverage-dialog.test.tsx @@ -0,0 +1,491 @@ +import { beforeEach, describe, expect, test, vi } from "vitest"; +import { userEvent } from "vitest/browser"; +import { render } from "vitest-browser-react"; +import { + LeverageDialog, + LeverageDialogContent, +} from "@/components/modules/Order/Overview/leverage-dialog"; +import { TestWrapper } from "./wrapper"; + +const defaultProps = { + leverage: 10, + onLeverageChange: vi.fn(), + currentPrice: 50000, + maxLeverage: 40, + side: "long" as const, +}; + +describe("LeverageDialog", () => { + beforeEach(() => { + vi.clearAllMocks(); + }); + + test("renders trigger button", async () => { + const screen = await render( + + Set Leverage + , + { wrapper: TestWrapper }, + ); + + await expect.element(screen.getByText("Set Leverage")).toBeVisible(); + }); + + test("opens dialog when trigger is clicked", async () => { + const screen = await render( + + Set Leverage + , + { wrapper: TestWrapper }, + ); + + await userEvent.click(screen.getByText("Set Leverage")); + + await expect.element(screen.getByTestId("leverage-title")).toBeVisible(); + }); + + test("displays current leverage value", async () => { + const screen = await render( + + Set Leverage + , + { wrapper: TestWrapper }, + ); + + await userEvent.click(screen.getByText("Set Leverage")); + + await expect + .element(screen.getByTestId("leverage-display")) + .toHaveTextContent("15x"); + }); + + test("displays warning banner for long position", async () => { + const screen = await render( + + Set Leverage + , + { wrapper: TestWrapper }, + ); + + await userEvent.click(screen.getByText("Set Leverage")); + + await expect + .element(screen.getByText(/You will be liquidated if price drops by/)) + .toBeVisible(); + }); + + test("displays warning banner for short position", async () => { + const screen = await render( + + Set Leverage + , + { wrapper: TestWrapper }, + ); + + await userEvent.click(screen.getByText("Set Leverage")); + + await expect + .element(screen.getByText(/You will be liquidated if price rises by/)) + .toBeVisible(); + }); + + test("displays estimated liquidation price", async () => { + const screen = await render( + + Set Leverage + , + { wrapper: TestWrapper }, + ); + + await userEvent.click(screen.getByText("Set Leverage")); + + await expect + .element(screen.getByText("Est. Liquidation Price")) + .toBeVisible(); + }); + + test("displays current price", async () => { + const screen = await render( + + Set Leverage + , + { wrapper: TestWrapper }, + ); + + await userEvent.click(screen.getByText("Set Leverage")); + + await expect.element(screen.getByText("Current price")).toBeVisible(); + await expect.element(screen.getByText("50,000")).toBeVisible(); + }); + + test("displays leverage buttons for maxLeverage 40", async () => { + const screen = await render( + + Set Leverage + , + { wrapper: TestWrapper }, + ); + + await userEvent.click(screen.getByText("Set Leverage")); + + // generateLeverageButtons(40) returns [2, 5, 10, 20, 40] + await expect.element(screen.getByTestId("leverage-button-2")).toBeVisible(); + await expect.element(screen.getByTestId("leverage-button-5")).toBeVisible(); + await expect + .element(screen.getByTestId("leverage-button-10")) + .toBeVisible(); + await expect + .element(screen.getByTestId("leverage-button-20")) + .toBeVisible(); + await expect + .element(screen.getByTestId("leverage-button-40")) + .toBeVisible(); + }); + + test("displays leverage stop labels", async () => { + const screen = await render( + + Set Leverage + , + { wrapper: TestWrapper }, + ); + + await userEvent.click(screen.getByText("Set Leverage")); + + // leverageStops = [MIN_LEVERAGE, maxLeverage/2, maxLeverage] = [1, 20, 40] + await expect.element(screen.getByTestId("leverage-stop-1")).toBeVisible(); + await expect.element(screen.getByTestId("leverage-stop-20")).toBeVisible(); + await expect.element(screen.getByTestId("leverage-stop-40")).toBeVisible(); + }); + + test("displays confirm button with correct leverage", async () => { + const screen = await render( + + Set Leverage + , + { wrapper: TestWrapper }, + ); + + await userEvent.click(screen.getByText("Set Leverage")); + + await expect.element(screen.getByText("Set 10x")).toBeVisible(); + }); + + test("clicking leverage button updates display", async () => { + const screen = await render( + + Set Leverage + , + { wrapper: TestWrapper }, + ); + + await userEvent.click(screen.getByText("Set Leverage")); + + // Click the 20x button + await userEvent.click(screen.getByTestId("leverage-button-20")); + + // Large display should update + await expect + .element(screen.getByTestId("leverage-display")) + .toHaveTextContent("20x"); + // Confirm button should update + await expect.element(screen.getByText("Set 20x")).toBeVisible(); + }); + + test("clicking stop label updates leverage", async () => { + const screen = await render( + + Set Leverage + , + { wrapper: TestWrapper }, + ); + + await userEvent.click(screen.getByText("Set Leverage")); + + // Click the 1x stop label (first stop) + await userEvent.click(screen.getByTestId("leverage-stop-1")); + + await expect.element(screen.getByText("Set 1x")).toBeVisible(); + }); + + test("confirm button calls onLeverageChange with selected leverage", async () => { + const onLeverageChange = vi.fn(); + const screen = await render( + + Set Leverage + , + { wrapper: TestWrapper }, + ); + + await userEvent.click(screen.getByText("Set Leverage")); + await userEvent.click(screen.getByTestId("leverage-button-20")); + await userEvent.click(screen.getByText("Set 20x")); + + expect(onLeverageChange).toHaveBeenCalledWith(20); + }); + + test("closes dialog when X button is clicked", async () => { + const screen = await render( + + Set Leverage + , + { wrapper: TestWrapper }, + ); + + await userEvent.click(screen.getByText("Set Leverage")); + await expect.element(screen.getByTestId("leverage-title")).toBeVisible(); + + // Click the close button + const closeButton = screen.getByRole("button", { name: "" }).nth(0); + await userEvent.click(closeButton); + + await expect + .element(screen.getByTestId("leverage-title")) + .not.toBeInTheDocument(); + }); + + test("closes dialog after confirmation", async () => { + const screen = await render( + + Set Leverage + , + { wrapper: TestWrapper }, + ); + + await userEvent.click(screen.getByText("Set Leverage")); + await expect.element(screen.getByTestId("leverage-title")).toBeVisible(); + + await userEvent.click(screen.getByText("Set 10x")); + + await expect + .element(screen.getByTestId("leverage-title")) + .not.toBeInTheDocument(); + }); + + test("selected leverage button is highlighted", async () => { + const screen = await render( + + Set Leverage + , + { wrapper: TestWrapper }, + ); + + await userEvent.click(screen.getByText("Set Leverage")); + + // The 10x button should have the selected style (bg-white text-black) + const selectedButton = screen.getByTestId("leverage-button-10"); + await expect.element(selectedButton).toHaveClass("bg-white"); + await expect.element(selectedButton).toHaveClass("text-black"); + }); + + test("different max leverage generates correct buttons", async () => { + const screen = await render( + + Set Leverage + , + { wrapper: TestWrapper }, + ); + + await userEvent.click(screen.getByText("Set Leverage")); + + // generateLeverageButtons(20) returns [2, 5, 10, 20] + await expect.element(screen.getByTestId("leverage-button-2")).toBeVisible(); + await expect.element(screen.getByTestId("leverage-button-5")).toBeVisible(); + await expect + .element(screen.getByTestId("leverage-button-10")) + .toBeVisible(); + await expect + .element(screen.getByTestId("leverage-button-20")) + .toBeVisible(); + }); + + test("low max leverage shows limited buttons", async () => { + const screen = await render( + + Set Leverage + , + { wrapper: TestWrapper }, + ); + + await userEvent.click(screen.getByText("Set Leverage")); + + // generateLeverageButtons(5) returns [2, 5] + await expect.element(screen.getByTestId("leverage-button-2")).toBeVisible(); + await expect.element(screen.getByTestId("leverage-button-5")).toBeVisible(); + }); + + test("calculates correct liquidation price for long position", async () => { + // For long: liquidationPrice = currentPrice * (1 - 1/leverage) + // currentPrice = 50000, leverage = 10 + // liquidationPrice = 50000 * (1 - 1/10) = 50000 * 0.9 = 45000 + const screen = await render( + + Set Leverage + , + { wrapper: TestWrapper }, + ); + + await userEvent.click(screen.getByText("Set Leverage")); + + await expect.element(screen.getByText("45,000")).toBeVisible(); + }); + + test("calculates correct liquidation price for short position", async () => { + // For short: liquidationPrice = currentPrice * (1 + 1/leverage) + // currentPrice = 50000, leverage = 10 + // liquidationPrice = 50000 * (1 + 1/10) = 50000 * 1.1 = 55000 + const screen = await render( + + Set Leverage + , + { wrapper: TestWrapper }, + ); + + await userEvent.click(screen.getByText("Set Leverage")); + + await expect.element(screen.getByText("55,000")).toBeVisible(); + }); + + test("updates liquidation price when leverage changes", async () => { + const screen = await render( + + Set Leverage + , + { wrapper: TestWrapper }, + ); + + await userEvent.click(screen.getByText("Set Leverage")); + + // Initial: 50000 * (1 - 1/10) = 45000 + await expect.element(screen.getByText("45,000")).toBeVisible(); + + // Change to 20x leverage + await userEvent.click(screen.getByTestId("leverage-button-20")); + + // New: 50000 * (1 - 1/20) = 50000 * 0.95 = 47500 + await expect.element(screen.getByText("47,500")).toBeVisible(); + }); + + test("multiple leverage selections before confirm only submits final value", async () => { + const onLeverageChange = vi.fn(); + const screen = await render( + + Set Leverage + , + { wrapper: TestWrapper }, + ); + + await userEvent.click(screen.getByText("Set Leverage")); + + // Click multiple leverage buttons + await userEvent.click(screen.getByTestId("leverage-button-5")); + await userEvent.click(screen.getByTestId("leverage-button-20")); + await userEvent.click(screen.getByTestId("leverage-button-2")); + + // Confirm + await userEvent.click(screen.getByText("Set 2x")); + + // Should only be called once with the final value + expect(onLeverageChange).toHaveBeenCalledTimes(1); + expect(onLeverageChange).toHaveBeenCalledWith(2); + }); +}); + +describe("LeverageDialogContent", () => { + const defaultContentProps = { + onClose: vi.fn(), + leverage: 10, + onLeverageChange: vi.fn(), + currentPrice: 50000, + maxLeverage: 40, + side: "long" as const, + }; + + beforeEach(() => { + vi.clearAllMocks(); + }); + + test("renders all UI elements", async () => { + const screen = await render( + , + { wrapper: TestWrapper }, + ); + + await expect.element(screen.getByTestId("leverage-title")).toBeVisible(); + await expect + .element(screen.getByTestId("leverage-display")) + .toHaveTextContent("10x"); + await expect + .element(screen.getByText("Est. Liquidation Price")) + .toBeVisible(); + await expect.element(screen.getByText("Current price")).toBeVisible(); + await expect.element(screen.getByText("Set 10x")).toBeVisible(); + }); + + test("onClose is called when X button is clicked", async () => { + const onClose = vi.fn(); + const screen = await render( + , + { wrapper: TestWrapper }, + ); + + const closeButton = screen.getByRole("button", { name: "" }).nth(0); + await userEvent.click(closeButton); + + expect(onClose).toHaveBeenCalledTimes(1); + }); + + test("onLeverageChange and onClose are called when confirm is clicked", async () => { + const onClose = vi.fn(); + const onLeverageChange = vi.fn(); + const screen = await render( + , + { wrapper: TestWrapper }, + ); + + await userEvent.click(screen.getByText("Set 10x")); + + expect(onLeverageChange).toHaveBeenCalledWith(10); + expect(onClose).toHaveBeenCalledTimes(1); + }); + + test("leverage stop labels include min, mid, and max values", async () => { + const screen = await render( + , + { wrapper: TestWrapper }, + ); + + // MIN_LEVERAGE = 1, maxLeverage/2 = 20, maxLeverage = 40 + await expect.element(screen.getByTestId("leverage-stop-1")).toBeVisible(); + await expect.element(screen.getByTestId("leverage-stop-20")).toBeVisible(); + await expect.element(screen.getByTestId("leverage-stop-40")).toBeVisible(); + }); +}); diff --git a/tests/components/limit-price-dialog.test.tsx b/tests/components/limit-price-dialog.test.tsx new file mode 100644 index 0000000..ceb9334 --- /dev/null +++ b/tests/components/limit-price-dialog.test.tsx @@ -0,0 +1,392 @@ +import { beforeEach, describe, expect, test, vi } from "vitest"; +import { userEvent } from "vitest/browser"; +import { render } from "vitest-browser-react"; +import { LimitPriceDialog } from "@/components/modules/Order/Overview/limit-price-dialog"; +import { TestWrapper } from "./wrapper"; + +const defaultProps = { + limitPrice: null as number | null, + onLimitPriceChange: vi.fn(), + currentPrice: 100, +}; + +describe("LimitPriceDialog", () => { + beforeEach(() => { + vi.clearAllMocks(); + }); + + test("renders trigger button", async () => { + const screen = await render( + + Set Limit Price + , + { wrapper: TestWrapper }, + ); + + await expect.element(screen.getByText("Set Limit Price")).toBeVisible(); + }); + + test("opens dialog when trigger is clicked", async () => { + const screen = await render( + + Set Limit Price + , + { wrapper: TestWrapper }, + ); + + await userEvent.click(screen.getByText("Set Limit Price")); + + await expect + .element(screen.getByText("Set limit price", { exact: true })) + .toBeVisible(); + }); + + test("displays quick adjustment buttons", async () => { + const screen = await render( + + Set Limit Price + , + { wrapper: TestWrapper }, + ); + + await userEvent.click(screen.getByText("Set Limit Price")); + + await expect.element(screen.getByText("Unset")).toBeVisible(); + await expect.element(screen.getByText("-1%")).toBeVisible(); + await expect.element(screen.getByText("-2%")).toBeVisible(); + await expect.element(screen.getByText("-5%")).toBeVisible(); + await expect.element(screen.getByText("-10%")).toBeVisible(); + }); + + test("displays input field with placeholder", async () => { + const screen = await render( + + Set Limit Price + , + { wrapper: TestWrapper }, + ); + + await userEvent.click(screen.getByText("Set Limit Price")); + + await expect.element(screen.getByPlaceholder("Enter value")).toBeVisible(); + await expect.element(screen.getByText("USD")).toBeVisible(); + }); + + test("displays Done button", async () => { + const screen = await render( + + Set Limit Price + , + { wrapper: TestWrapper }, + ); + + await userEvent.click(screen.getByText("Set Limit Price")); + + await expect.element(screen.getByText("Done")).toBeVisible(); + }); + + test("initializes input with existing limit price", async () => { + const screen = await render( + + Set Limit Price + , + { wrapper: TestWrapper }, + ); + + await userEvent.click(screen.getByText("Set Limit Price")); + + const input = screen.getByPlaceholder("Enter value"); + await expect.element(input).toHaveValue("95"); + }); + + test("quick adjust -1% calculates correct price", async () => { + const onLimitPriceChange = vi.fn(); + const screen = await render( + + Set Limit Price + , + { wrapper: TestWrapper }, + ); + + await userEvent.click(screen.getByText("Set Limit Price")); + await userEvent.click(screen.getByText("-1%")); + await userEvent.click(screen.getByText("Done")); + + expect(onLimitPriceChange).toHaveBeenCalledWith(99); + }); + + test("quick adjust -2% calculates correct price", async () => { + const onLimitPriceChange = vi.fn(); + const screen = await render( + + Set Limit Price + , + { wrapper: TestWrapper }, + ); + + await userEvent.click(screen.getByText("Set Limit Price")); + await userEvent.click(screen.getByText("-2%")); + await userEvent.click(screen.getByText("Done")); + + expect(onLimitPriceChange).toHaveBeenCalledWith(98); + }); + + test("quick adjust -5% calculates correct price", async () => { + const onLimitPriceChange = vi.fn(); + const screen = await render( + + Set Limit Price + , + { wrapper: TestWrapper }, + ); + + await userEvent.click(screen.getByText("Set Limit Price")); + await userEvent.click(screen.getByText("-5%")); + await userEvent.click(screen.getByText("Done")); + + expect(onLimitPriceChange).toHaveBeenCalledWith(95); + }); + + test("quick adjust -10% calculates correct price", async () => { + const onLimitPriceChange = vi.fn(); + const screen = await render( + + Set Limit Price + , + { wrapper: TestWrapper }, + ); + + await userEvent.click(screen.getByText("Set Limit Price")); + await userEvent.click(screen.getByText("-10%")); + await userEvent.click(screen.getByText("Done")); + + expect(onLimitPriceChange).toHaveBeenCalledWith(90); + }); + + test("Unset button clears the input and submits null", async () => { + const onLimitPriceChange = vi.fn(); + const screen = await render( + + Set Limit Price + , + { wrapper: TestWrapper }, + ); + + await userEvent.click(screen.getByText("Set Limit Price")); + await userEvent.click(screen.getByText("Unset")); + await userEvent.click(screen.getByText("Done")); + + expect(onLimitPriceChange).toHaveBeenCalledWith(null); + }); + + test("manual input submits entered value", async () => { + const onLimitPriceChange = vi.fn(); + const screen = await render( + + Set Limit Price + , + { wrapper: TestWrapper }, + ); + + await userEvent.click(screen.getByText("Set Limit Price")); + const input = screen.getByPlaceholder("Enter value"); + await userEvent.type(input, "85.5"); + await userEvent.click(screen.getByText("Done")); + + expect(onLimitPriceChange).toHaveBeenCalledWith(85.5); + }); + + test("closes dialog when X button is clicked", async () => { + const screen = await render( + + Set Limit Price + , + { wrapper: TestWrapper }, + ); + + await userEvent.click(screen.getByText("Set Limit Price")); + await expect + .element(screen.getByText("Set limit price", { exact: true })) + .toBeVisible(); + + // Click the close button (first button with no accessible name) + const closeButton = screen.getByRole("button", { name: "" }).nth(0); + await userEvent.click(closeButton); + + await expect + .element(screen.getByText("Set limit price", { exact: true })) + .not.toBeInTheDocument(); + }); + + test("closes dialog when Done is clicked after submitting", async () => { + const screen = await render( + + Set Limit Price + , + { wrapper: TestWrapper }, + ); + + await userEvent.click(screen.getByText("Set Limit Price")); + await expect + .element(screen.getByText("Set limit price", { exact: true })) + .toBeVisible(); + + await userEvent.click(screen.getByText("Done")); + + await expect + .element(screen.getByText("Set limit price", { exact: true })) + .not.toBeInTheDocument(); + }); + + test("quick adjustment works with different current price", async () => { + const onLimitPriceChange = vi.fn(); + const screen = await render( + + Set Limit Price + , + { wrapper: TestWrapper }, + ); + + await userEvent.click(screen.getByText("Set Limit Price")); + await userEvent.click(screen.getByText("-10%")); + await userEvent.click(screen.getByText("Done")); + + // 250 - 10% = 250 - 25 = 225 + expect(onLimitPriceChange).toHaveBeenCalledWith(225); + }); + + test("quick adjustment updates input value visually", async () => { + const screen = await render( + + Set Limit Price + , + { wrapper: TestWrapper }, + ); + + await userEvent.click(screen.getByText("Set Limit Price")); + await userEvent.click(screen.getByText("-5%")); + + const input = screen.getByPlaceholder("Enter value"); + await expect.element(input).toHaveValue("95"); + }); + + test("empty input submits null", async () => { + const onLimitPriceChange = vi.fn(); + const screen = await render( + + Set Limit Price + , + { wrapper: TestWrapper }, + ); + + await userEvent.click(screen.getByText("Set Limit Price")); + // Input is already empty by default + await userEvent.click(screen.getByText("Done")); + + expect(onLimitPriceChange).toHaveBeenCalledWith(null); + }); + + test("can clear existing value and submit null", async () => { + const onLimitPriceChange = vi.fn(); + const screen = await render( + + Set Limit Price + , + { wrapper: TestWrapper }, + ); + + await userEvent.click(screen.getByText("Set Limit Price")); + const input = screen.getByPlaceholder("Enter value"); + await userEvent.clear(input); + await userEvent.click(screen.getByText("Done")); + + expect(onLimitPriceChange).toHaveBeenCalledWith(null); + }); + + test("displays Set price label", async () => { + const screen = await render( + + Set Limit Price + , + { wrapper: TestWrapper }, + ); + + await userEvent.click(screen.getByText("Set Limit Price")); + + await expect.element(screen.getByText("Set price")).toBeVisible(); + }); + + test("multiple quick adjustments update input correctly", async () => { + const screen = await render( + + Set Limit Price + , + { wrapper: TestWrapper }, + ); + + await userEvent.click(screen.getByText("Set Limit Price")); + + // First click -5% + await userEvent.click(screen.getByText("-5%")); + const input = screen.getByPlaceholder("Enter value"); + await expect.element(input).toHaveValue("95"); + + // Then click -10% (should use currentPrice, not the input value) + await userEvent.click(screen.getByText("-10%")); + await expect.element(input).toHaveValue("90"); + }); + + test("decimal values in input are submitted correctly", async () => { + const onLimitPriceChange = vi.fn(); + const screen = await render( + + Set Limit Price + , + { wrapper: TestWrapper }, + ); + + await userEvent.click(screen.getByText("Set Limit Price")); + const input = screen.getByPlaceholder("Enter value"); + await userEvent.type(input, "99.99"); + await userEvent.click(screen.getByText("Done")); + + expect(onLimitPriceChange).toHaveBeenCalledWith(99.99); + }); +}); diff --git a/tests/components/order-type-dialog.test.tsx b/tests/components/order-type-dialog.test.tsx new file mode 100644 index 0000000..ba08cc0 --- /dev/null +++ b/tests/components/order-type-dialog.test.tsx @@ -0,0 +1,261 @@ +import { beforeEach, describe, expect, test, vi } from "vitest"; +import { userEvent } from "vitest/browser"; +import { render } from "vitest-browser-react"; +import { + ORDER_TYPE_OPTIONS, + OrderTypeDialog, +} from "@/components/modules/Order/Overview/order-type-dialog"; +import { TestWrapper } from "./wrapper"; + +const defaultProps = { + selectedType: "market" as const, + onTypeSelect: vi.fn(), +}; + +describe("OrderTypeDialog", () => { + beforeEach(() => { + vi.clearAllMocks(); + }); + + test("renders trigger button with Market label when market is selected", async () => { + const screen = await render(, { + wrapper: TestWrapper, + }); + + await expect.element(screen.getByText("Market")).toBeVisible(); + }); + + test("renders trigger button with Limit label when limit is selected", async () => { + const screen = await render( + , + { wrapper: TestWrapper }, + ); + + await expect.element(screen.getByText("Limit")).toBeVisible(); + }); + + test("opens dialog when trigger is clicked", async () => { + const screen = await render(, { + wrapper: TestWrapper, + }); + + await userEvent.click(screen.getByText("Market")); + + await expect.element(screen.getByText("Order type")).toBeVisible(); + }); + + test("displays all order type options in dialog", async () => { + const screen = await render(, { + wrapper: TestWrapper, + }); + + await userEvent.click(screen.getByText("Market")); + + // Check Market option + await expect + .element(screen.getByText("Execute immediately at current market price")) + .toBeVisible(); + + // Check Limit option + await expect.element(screen.getByText("Limit")).toBeVisible(); + await expect + .element( + screen.getByText("Execute only at your specified price or better"), + ) + .toBeVisible(); + }); + + test("calls onTypeSelect with 'limit' when Limit option is clicked", async () => { + const onTypeSelect = vi.fn(); + const screen = await render( + , + { wrapper: TestWrapper }, + ); + + await userEvent.click(screen.getByText("Market")); + // Click the Limit option button (the one with the description) + await userEvent.click( + screen.getByText("Execute only at your specified price or better"), + ); + + expect(onTypeSelect).toHaveBeenCalledWith("limit"); + }); + + test("calls onTypeSelect with 'market' when Market option is clicked", async () => { + const onTypeSelect = vi.fn(); + const screen = await render( + , + { wrapper: TestWrapper }, + ); + + await userEvent.click(screen.getByText("Limit")); + // Click the Market option button (the one with the description) + await userEvent.click( + screen.getByText("Execute immediately at current market price"), + ); + + expect(onTypeSelect).toHaveBeenCalledWith("market"); + }); + + test("closes dialog after selecting an option", async () => { + const screen = await render(, { + wrapper: TestWrapper, + }); + + await userEvent.click(screen.getByText("Market")); + await expect.element(screen.getByText("Order type")).toBeVisible(); + + await userEvent.click( + screen.getByText("Execute only at your specified price or better"), + ); + + await expect + .element(screen.getByText("Order type")) + .not.toBeInTheDocument(); + }); + + test("shows checkmark for selected Market option", async () => { + const screen = await render( + , + { wrapper: TestWrapper }, + ); + + await userEvent.click(screen.getByText("Market")); + + // The selected option should have a checkmark + // We verify by checking the Market button contains content indicating selection + const dialogContent = screen.getByText("Order type"); + await expect.element(dialogContent).toBeVisible(); + + // Both options should be visible, market is selected + await expect + .element(screen.getByText("Execute immediately at current market price")) + .toBeVisible(); + }); + + test("shows checkmark for selected Limit option", async () => { + const screen = await render( + , + { wrapper: TestWrapper }, + ); + + await userEvent.click(screen.getByText("Limit")); + + // The selected option should have a checkmark + const dialogContent = screen.getByText("Order type"); + await expect.element(dialogContent).toBeVisible(); + + // Both options should be visible, limit is selected + await expect + .element( + screen.getByText("Execute only at your specified price or better"), + ) + .toBeVisible(); + }); + + test("displays both order options when dialog is open", async () => { + const screen = await render( + , + { wrapper: TestWrapper }, + ); + + await userEvent.click(screen.getByText("Market")); + + // Both options should be visible + await expect + .element(screen.getByText("Execute immediately at current market price")) + .toBeVisible(); + await expect + .element( + screen.getByText("Execute only at your specified price or better"), + ) + .toBeVisible(); + }); + + test("ORDER_TYPE_OPTIONS exports correct values", () => { + expect(ORDER_TYPE_OPTIONS).toHaveLength(2); + + expect(ORDER_TYPE_OPTIONS[0]).toEqual({ + value: "market", + label: "Market", + description: "Execute immediately at current market price", + }); + + expect(ORDER_TYPE_OPTIONS[1]).toEqual({ + value: "limit", + label: "Limit", + description: "Execute only at your specified price or better", + }); + }); + + test("trigger button has correct styling classes", async () => { + const screen = await render(, { + wrapper: TestWrapper, + }); + + const triggerButton = screen.getByRole("button", { name: /Market/i }); + await expect.element(triggerButton).toBeVisible(); + }); + + test("selecting same type as currently selected still calls onTypeSelect", async () => { + const onTypeSelect = vi.fn(); + const screen = await render( + , + { wrapper: TestWrapper }, + ); + + await userEvent.click(screen.getByText("Market")); + await userEvent.click( + screen.getByText("Execute immediately at current market price"), + ); + + expect(onTypeSelect).toHaveBeenCalledWith("market"); + }); + + test("dialog shows correct title", async () => { + const screen = await render(, { + wrapper: TestWrapper, + }); + + await userEvent.click(screen.getByText("Market")); + + await expect.element(screen.getByText("Order type")).toBeVisible(); + }); + + test("can switch from market to limit and back", async () => { + const onTypeSelect = vi.fn(); + const result = await render( + , + { wrapper: TestWrapper }, + ); + + // Open and select Limit + await userEvent.click(result.getByRole("button", { name: "Market" })); + await userEvent.click( + result.getByText("Execute only at your specified price or better"), + ); + expect(onTypeSelect).toHaveBeenCalledWith("limit"); + + // Rerender with limit selected + await result.rerender( + , + ); + + // Open and select Market - use the first button which is the trigger + await userEvent.click( + result.getByRole("button", { name: "Limit" }).first(), + ); + await userEvent.click( + result.getByText("Execute immediately at current market price"), + ); + expect(onTypeSelect).toHaveBeenCalledWith("market"); + }); +}); diff --git a/tests/components/tp-sl-dialog.test.tsx b/tests/components/tp-sl-dialog.test.tsx new file mode 100644 index 0000000..4e601fe --- /dev/null +++ b/tests/components/tp-sl-dialog.test.tsx @@ -0,0 +1,398 @@ +import { beforeEach, describe, expect, test, vi } from "vitest"; +import { userEvent } from "vitest/browser"; +import { render } from "vitest-browser-react"; +import { + getTPOrSLConfigurationFromPosition, + TPOrSLDialog, + type TPOrSLSettings, +} from "@/components/molecules/tp-sl-dialog"; +import { TestWrapper } from "./wrapper"; + +const defaultSettings: TPOrSLSettings = { + takeProfit: { + option: null, + triggerPrice: null, + percentage: null, + }, + stopLoss: { + option: null, + triggerPrice: null, + percentage: null, + }, +}; + +const defaultProps = { + settings: defaultSettings, + onSettingsChange: vi.fn(), + entryPrice: 100, + currentPrice: 105, + liquidationPrice: 80, +}; + +describe("TPOrSLDialog", () => { + beforeEach(() => { + vi.clearAllMocks(); + }); + + test("renders trigger button", async () => { + const screen = await render( + + Open Dialog + , + { wrapper: TestWrapper }, + ); + + await expect.element(screen.getByText("Open Dialog")).toBeVisible(); + }); + + test("opens dialog when trigger is clicked", async () => { + const screen = await render( + + Open Dialog + , + { wrapper: TestWrapper }, + ); + + await userEvent.click(screen.getByText("Open Dialog")); + + await expect + .element(screen.getByText("Take profit and stop loss")) + .toBeVisible(); + }); + + test("displays entry price, current price, and liquidation price", async () => { + const screen = await render( + + Open Dialog + , + { wrapper: TestWrapper }, + ); + + await userEvent.click(screen.getByText("Open Dialog")); + + await expect.element(screen.getByText("Entry price")).toBeVisible(); + await expect.element(screen.getByText("Current price")).toBeVisible(); + await expect.element(screen.getByText("Liquidation price")).toBeVisible(); + await expect.element(screen.getByText("$100")).toBeVisible(); + await expect.element(screen.getByText("$105")).toBeVisible(); + await expect.element(screen.getByText("$80")).toBeVisible(); + }); + + test('shows "Est. liquidation price" when isLiquidationPriceEstimate is true', async () => { + const screen = await render( + + Open Dialog + , + { wrapper: TestWrapper }, + ); + + await userEvent.click(screen.getByText("Open Dialog")); + + await expect + .element(screen.getByText("Est. liquidation price")) + .toBeVisible(); + }); + + test("renders take profit section with option buttons", async () => { + const screen = await render( + + Open Dialog + , + { wrapper: TestWrapper }, + ); + + await userEvent.click(screen.getByText("Open Dialog")); + + // Dialog title contains both "Take profit" and "Stop loss" + await expect + .element(screen.getByText("Take profit and stop loss")) + .toBeVisible(); + // Check for take profit options + await expect.element(screen.getByText("Off").first()).toBeVisible(); + await expect.element(screen.getByText("+10%")).toBeVisible(); + await expect.element(screen.getByText("+25%")).toBeVisible(); + await expect.element(screen.getByText("+50%")).toBeVisible(); + await expect.element(screen.getByText("+100%")).toBeVisible(); + }); + + test("renders stop loss section with option buttons", async () => { + const screen = await render( + + Open Dialog + , + { wrapper: TestWrapper }, + ); + + await userEvent.click(screen.getByText("Open Dialog")); + + // Dialog title contains both "Take profit" and "Stop loss" + await expect + .element(screen.getByText("Take profit and stop loss")) + .toBeVisible(); + // Check for stop loss options + await expect.element(screen.getByText("-10%")).toBeVisible(); + await expect.element(screen.getByText("-25%")).toBeVisible(); + await expect.element(screen.getByText("-50%")).toBeVisible(); + await expect.element(screen.getByText("-100%")).toBeVisible(); + }); + + test("selects take profit percentage option and calculates trigger price", async () => { + const onSettingsChange = vi.fn(); + const screen = await render( + + Open Dialog + , + { wrapper: TestWrapper }, + ); + + await userEvent.click(screen.getByText("Open Dialog")); + await userEvent.click(screen.getByText("+25%")); + await userEvent.click(screen.getByText("Done")); + + expect(onSettingsChange).toHaveBeenCalledWith( + expect.objectContaining({ + takeProfit: { + option: 25, + triggerPrice: 125, + percentage: 25, + }, + }), + ); + }); + + test("selects stop loss percentage option and calculates trigger price", async () => { + const onSettingsChange = vi.fn(); + const screen = await render( + + Open Dialog + , + { wrapper: TestWrapper }, + ); + + await userEvent.click(screen.getByText("Open Dialog")); + await userEvent.click(screen.getByText("-25%")); + await userEvent.click(screen.getByText("Done")); + + expect(onSettingsChange).toHaveBeenCalledWith( + expect.objectContaining({ + stopLoss: { + option: 25, + triggerPrice: 75, + percentage: 25, + }, + }), + ); + }); + + test('selects "Off" option to clear configuration', async () => { + const onSettingsChange = vi.fn(); + const settingsWithTakeProfit: TPOrSLSettings = { + ...defaultSettings, + takeProfit: { + option: 25, + triggerPrice: 125, + percentage: 25, + }, + }; + const screen = await render( + + Open Dialog + , + { wrapper: TestWrapper }, + ); + + await userEvent.click(screen.getByText("Open Dialog")); + // Click the first "Off" button (take profit section) + const offButton = screen.getByText("Off").first(); + await userEvent.click(offButton); + await userEvent.click(screen.getByText("Done")); + + expect(onSettingsChange).toHaveBeenCalledWith( + expect.objectContaining({ + takeProfit: { + option: 0, + triggerPrice: null, + percentage: null, + }, + }), + ); + }); + + test("renders only take profit section in takeProfit mode", async () => { + const screen = await render( + + Open Dialog + , + { wrapper: TestWrapper }, + ); + + await userEvent.click(screen.getByText("Open Dialog")); + + // In takeProfit mode, there are two "Take profit" elements: title and section label + await expect.element(screen.getByText("Take profit").first()).toBeVisible(); + // Check that stop loss section is not present (no stop loss options) + await expect.element(screen.getByText("-10%")).not.toBeInTheDocument(); + }); + + test("renders only stop loss section in stopLoss mode", async () => { + const screen = await render( + + Open Dialog + , + { wrapper: TestWrapper }, + ); + + await userEvent.click(screen.getByText("Open Dialog")); + + // In stopLoss mode, there are two "Stop loss" elements: title and section label + await expect.element(screen.getByText("Stop loss").first()).toBeVisible(); + // Check that take profit section is not present (no take profit options) + await expect.element(screen.getByText("+10%")).not.toBeInTheDocument(); + }); + + test("shows correct dialog title for takeProfit mode", async () => { + const screen = await render( + + Open Dialog + , + { wrapper: TestWrapper }, + ); + + await userEvent.click(screen.getByText("Open Dialog")); + + // In takeProfit mode, title should be just "Take profit" (first element is the title) + const titleElement = screen.getByText("Take profit").first(); + await expect.element(titleElement).toBeVisible(); + // Verify it's not the combined title + await expect + .element(screen.getByText("Take profit and stop loss")) + .not.toBeInTheDocument(); + }); + + test("shows correct dialog title for stopLoss mode", async () => { + const screen = await render( + + Open Dialog + , + { wrapper: TestWrapper }, + ); + + await userEvent.click(screen.getByText("Open Dialog")); + + // In stopLoss mode, title should be just "Stop loss" (first element is the title) + const titleElement = screen.getByText("Stop loss").first(); + await expect.element(titleElement).toBeVisible(); + // Verify it's not the combined title + await expect + .element(screen.getByText("Take profit and stop loss")) + .not.toBeInTheDocument(); + }); + + test("closes dialog when X button is clicked", async () => { + const screen = await render( + + Open Dialog + , + { wrapper: TestWrapper }, + ); + + await userEvent.click(screen.getByText("Open Dialog")); + await expect + .element(screen.getByText("Take profit and stop loss")) + .toBeVisible(); + + // Click the close button + const closeButton = screen.getByRole("button", { name: "" }).nth(0); + await userEvent.click(closeButton); + + await expect + .element(screen.getByText("Take profit and stop loss")) + .not.toBeInTheDocument(); + }); + + test("closes dialog when Done is clicked", async () => { + const screen = await render( + + Open Dialog + , + { wrapper: TestWrapper }, + ); + + await userEvent.click(screen.getByText("Open Dialog")); + await expect + .element(screen.getByText("Take profit and stop loss")) + .toBeVisible(); + + await userEvent.click(screen.getByText("Done")); + + await expect + .element(screen.getByText("Take profit and stop loss")) + .not.toBeInTheDocument(); + }); +}); + +describe("getTPOrSLConfigurationFromPosition", () => { + test("returns empty configuration when amount is undefined", () => { + const result = getTPOrSLConfigurationFromPosition({ + entryPrice: 100, + amount: undefined, + tpOrSl: "takeProfit", + }); + + expect(result).toEqual({ + option: null, + triggerPrice: null, + percentage: null, + }); + }); + + test("calculates take profit configuration correctly", () => { + const result = getTPOrSLConfigurationFromPosition({ + entryPrice: 100, + amount: 125, + tpOrSl: "takeProfit", + }); + + expect(result.triggerPrice).toBe(125); + expect(result.percentage).toBe(25); + expect(result.option).toBe(25); + }); + + test("calculates stop loss configuration correctly", () => { + const result = getTPOrSLConfigurationFromPosition({ + entryPrice: 100, + amount: 75, + tpOrSl: "stopLoss", + }); + + expect(result.triggerPrice).toBe(75); + expect(result.percentage).toBe(25); + expect(result.option).toBe(25); + }); + + test("returns null option for non-matching percentage", () => { + const result = getTPOrSLConfigurationFromPosition({ + entryPrice: 100, + amount: 115, + tpOrSl: "takeProfit", + }); + + expect(result.triggerPrice).toBe(115); + expect(result.percentage).toBe(15); + expect(result.option).toBeNull(); + }); + + test("matches option when percentage is within 0.5 tolerance", () => { + const result = getTPOrSLConfigurationFromPosition({ + entryPrice: 100, + amount: 110.4, // 10.4% is within 0.5 of 10 + tpOrSl: "takeProfit", + }); + + expect(result.option).toBe(10); + }); +}); diff --git a/tests/components/wrapper.tsx b/tests/components/wrapper.tsx new file mode 100644 index 0000000..f2e12a0 --- /dev/null +++ b/tests/components/wrapper.tsx @@ -0,0 +1,12 @@ +import "../../src/styles.css"; +import { Toaster } from "@/components/ui/toaster"; +import { RootContainerProvider } from "@/context/root-container"; + +export const TestWrapper = ({ children }: { children: React.ReactNode }) => { + return ( + + + {children} + + ); +}; diff --git a/tsconfig.json b/tsconfig.json index 9a281e8..691e07a 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,5 +1,5 @@ { - "include": ["src", "scripts"], + "include": ["src", "scripts", "tests"], "compilerOptions": { "target": "ES2022", "jsx": "react-jsx", diff --git a/vite.config.ts b/vite.config.ts index 58d896d..586af8b 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -3,8 +3,16 @@ import tailwindcss from "@tailwindcss/vite"; import { devtools } from "@tanstack/devtools-vite"; import { tanstackRouter } from "@tanstack/router-plugin/vite"; import viteReact from "@vitejs/plugin-react"; +import { playwright } from "@vitest/browser-playwright"; import { defineConfig } from "vite"; import { nodePolyfills } from "vite-plugin-node-polyfills"; +import type { InlineConfig } from "vitest/node"; + +declare module "vite" { + interface UserConfig { + test?: InlineConfig; + } +} // https://vitejs.dev/config/ export default defineConfig({ @@ -27,4 +35,22 @@ export default defineConfig({ "@": fileURLToPath(new URL("./src", import.meta.url)), }, }, + test: { + browser: { + screenshotFailures: false, + headless: true, + enabled: true, + provider: playwright(), + // https://vitest.dev/config/browser/playwright + instances: [{ browser: "chromium" }], + }, + include: ["./tests/**/*.test.{ts,tsx}"], + }, + optimizeDeps: { + include: [ + "vite-plugin-node-polyfills/shims/buffer", + "vite-plugin-node-polyfills/shims/global", + "vite-plugin-node-polyfills/shims/process", + ], + }, });