From d737893a2adb507763bf387253ec76f28e0675e1 Mon Sep 17 00:00:00 2001 From: Luchi5544 Date: Wed, 24 Jun 2026 14:48:31 +0100 Subject: [PATCH] feat(i18n): implement internationalization framework and spanish translation support --- .npmrc | 1 + package.json | 3 + pnpm-lock.yaml | 382 ++++++++++++++++++------------ pnpm-workspace.yaml | 15 ++ src/components/CkbReceive.tsx | 51 ++-- src/components/CkbSend.tsx | 57 ++--- src/components/CopyButton.tsx | 4 +- src/components/Header.tsx | 16 +- src/components/HorizenReceive.tsx | 59 ++--- src/components/HorizenSend.tsx | 65 ++--- src/components/LocaleSwitcher.tsx | 42 ++++ src/components/SolanaReceive.tsx | 55 +++-- src/components/SolanaSend.tsx | 49 ++-- src/components/StellarReceive.tsx | 63 ++--- src/components/StellarSend.tsx | 57 +++-- src/components/WalletConnect.tsx | 10 +- src/i18n/en.json | 139 +++++++++++ src/i18n/es.json | 139 +++++++++++ src/i18n/index.ts | 28 +++ src/main.tsx | 1 + 20 files changed, 871 insertions(+), 365 deletions(-) create mode 100644 .npmrc create mode 100644 pnpm-workspace.yaml create mode 100644 src/components/LocaleSwitcher.tsx create mode 100644 src/i18n/en.json create mode 100644 src/i18n/es.json create mode 100644 src/i18n/index.ts diff --git a/.npmrc b/.npmrc new file mode 100644 index 0000000..42ad5d6 --- /dev/null +++ b/.npmrc @@ -0,0 +1 @@ +only-built-dependencies=bufferutil,esbuild,keccak,utf-8-validate diff --git a/package.json b/package.json index 886cfb3..135382b 100644 --- a/package.json +++ b/package.json @@ -28,8 +28,11 @@ "@wraith-protocol/sdk": "^1.4.5", "bs58": "^6.0.0", "buffer": "^6.0.3", + "i18next": "^24.2.3", + "i18next-browser-languagedetector": "^8.0.5", "react": "^19.0.0", "react-dom": "^19.0.0", + "react-i18next": "^15.5.1", "react-router-dom": "^7.6.0", "viem": "^2.23.0", "wagmi": "^2.14.0" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e3b5c05..e0cfac0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,10 +10,10 @@ importers: dependencies: '@ckb-ccc/ccc': specifier: ^1.1.25 - version: 1.1.25(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6) + version: 1.1.25(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76) '@ckb-ccc/connector-react': specifier: ^1.0.34 - version: 1.0.34(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6) + version: 1.0.34(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76) '@noble/curves': specifier: ^1.9.7 version: 1.9.7 @@ -22,7 +22,7 @@ importers: version: 1.8.0 '@rainbow-me/rainbowkit': specifier: ^2.2.0 - version: 2.2.10(@tanstack/react-query@5.99.0(react@19.2.5))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(typescript@5.9.3)(viem@2.47.17(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6))(wagmi@2.19.5(@react-native-async-storage/async-storage@1.24.0(react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6)))(@tanstack/query-core@5.99.0)(@tanstack/react-query@5.99.0(react@19.2.5))(@types/react@19.2.14)(bufferutil@4.1.0)(react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6))(react@19.2.5)(typescript@5.9.3)(utf-8-validate@6.0.6)(viem@2.47.17(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6))(zod@4.3.6)) + version: 2.2.10(@tanstack/react-query@5.99.0(react@19.2.5))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(typescript@5.9.3)(viem@2.47.17(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6))(wagmi@2.19.5(@react-native-async-storage/async-storage@1.24.0(react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6)))(@tanstack/query-core@5.99.0)(@tanstack/react-query@5.99.0(react@19.2.5))(@types/react@19.2.14)(bufferutil@4.1.0)(react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6))(react@19.2.5)(typescript@5.9.3)(utf-8-validate@6.0.6)(viem@2.47.17(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6))(zod@3.25.76)) '@solana/wallet-adapter-base': specifier: ^0.9.27 version: 0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)) @@ -49,19 +49,28 @@ importers: version: 5.99.0(react@19.2.5) '@wraith-protocol/sdk': specifier: ^1.4.5 - version: 1.4.5(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6))(@stellar/stellar-sdk@13.3.0)(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6) + version: 1.4.5(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6))(@stellar/stellar-sdk@13.3.0)(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76) bs58: specifier: ^6.0.0 version: 6.0.0 buffer: specifier: ^6.0.3 version: 6.0.3 + i18next: + specifier: ^24.2.3 + version: 24.2.3(typescript@5.9.3) + i18next-browser-languagedetector: + specifier: ^8.0.5 + version: 8.2.1 react: specifier: ^19.0.0 version: 19.2.5 react-dom: specifier: ^19.0.0 version: 19.2.5(react@19.2.5) + react-i18next: + specifier: ^15.5.1 + version: 15.7.4(i18next@24.2.3(typescript@5.9.3))(react-dom@19.2.5(react@19.2.5))(react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6))(react@19.2.5)(typescript@5.9.3) react-router-dom: specifier: ^7.6.0 version: 7.14.1(react-dom@19.2.5(react@19.2.5))(react@19.2.5) @@ -70,7 +79,7 @@ importers: version: 2.47.17(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6) wagmi: specifier: ^2.14.0 - version: 2.19.5(@react-native-async-storage/async-storage@1.24.0(react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6)))(@tanstack/query-core@5.99.0)(@tanstack/react-query@5.99.0(react@19.2.5))(@types/react@19.2.14)(bufferutil@4.1.0)(react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6))(react@19.2.5)(typescript@5.9.3)(utf-8-validate@6.0.6)(viem@2.47.17(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6))(zod@4.3.6) + version: 2.19.5(@react-native-async-storage/async-storage@1.24.0(react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6)))(@tanstack/query-core@5.99.0)(@tanstack/react-query@5.99.0(react@19.2.5))(@types/react@19.2.14)(bufferutil@4.1.0)(react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6))(react@19.2.5)(typescript@5.9.3)(utf-8-validate@6.0.6)(viem@2.47.17(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6))(zod@3.25.76) devDependencies: '@commitlint/cli': specifier: ^19.0.0 @@ -730,7 +739,7 @@ packages: '@paulmillr/qr@0.2.1': resolution: {integrity: sha512-IHnV6A+zxU7XwmKFinmYjUcwlyK9+xkG3/s9KcQhI9BjQKycrJ1JRO+FbNYPwZiPKW3je/DR0k7w8/gLa5eaxQ==} - deprecated: 'The package is now available as "qr": npm install qr' + deprecated: 'Switch to "qr" (new package name) for security updates: npm install qr' '@rainbow-me/rainbowkit@2.2.10': resolution: {integrity: sha512-8+E4die1A2ovN9t3lWxWnwqTGEdFqThXDQRj+E4eDKuUKyymYD+66Gzm6S9yfg8E95c6hmGlavGUfYPtl1EagA==} @@ -982,6 +991,7 @@ packages: '@safe-global/safe-gateway-typescript-sdk@3.23.1': resolution: {integrity: sha512-6ORQfwtEJYpalCeVO21L4XXGSdbEMfyp2hEv6cP82afKXSwvse6d3sdelgaPWUxHIsFRkWvHDdzh8IyyKHZKxw==} engines: {node: '>=16'} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. '@scure/base@1.1.9': resolution: {integrity: sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg==} @@ -1532,6 +1542,7 @@ packages: '@stellar/stellar-base@13.1.0': resolution: {integrity: sha512-90EArG+eCCEzDGj3OJNoCtwpWDwxjv+rs/RNPhvg4bulpjN/CSRj+Ys/SalRcfM4/WRC5/qAfjzmJBAuquWhkA==} engines: {node: '>=18.0.0'} + deprecated: This package is now rolled into @stellar/stellar-sdk. Please use @stellar/stellar-sdk to continue receiving updates and support. '@stellar/stellar-sdk@13.3.0': resolution: {integrity: sha512-8+GHcZLp+mdin8gSjcgfb/Lb6sSMYRX6Nf/0LcSJxvjLQR0XHpjGzOiRbYb2jSXo51EnA6kAV5j+4Pzh5OUKUg==} @@ -2697,6 +2708,9 @@ packages: resolution: {integrity: sha512-p1JfQMKaceuCbpJKAPKVqyqviZdS0eUxH9v82oWo1kb9xjQ5wA6iP3FNVAPDFlz5/p7d45lO+BpSk1tuSZMF4Q==} engines: {node: '>=16.9.0'} + html-parse-stringify@3.0.1: + resolution: {integrity: sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg==} + http-errors@2.0.1: resolution: {integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==} engines: {node: '>= 0.8'} @@ -2713,6 +2727,17 @@ packages: engines: {node: '>=18'} hasBin: true + i18next-browser-languagedetector@8.2.1: + resolution: {integrity: sha512-bZg8+4bdmaOiApD7N7BPT9W8MLZG+nPTOFlLiJiT8uzKXFjhxw4v2ierCXOwB5sFDMtuA5G4kgYZ0AznZxQ/cw==} + + i18next@24.2.3: + resolution: {integrity: sha512-lfbf80OzkocvX7nmZtu7nSTNbrTYR52sLWxPtlXX1zAhVw8WEnFk4puUkCR4B1dNQwbSpEHHHemcZu//7EcB7A==} + peerDependencies: + typescript: ^5 + peerDependenciesMeta: + typescript: + optional: true + idb-keyval@6.2.1: resolution: {integrity: sha512-8Sb3veuYCyrZL+VBt9LJfZjLUPWVvqn8tG28VqYNFCo43KHcKuq+b4EiXGeuaLAQWL2YmyDgMp2aSpH9JHsEQg==} @@ -3560,6 +3585,22 @@ packages: peerDependencies: react: ^19.2.5 + react-i18next@15.7.4: + resolution: {integrity: sha512-nyU8iKNrI5uDJch0z9+Y5XEr34b0wkyYj3Rp+tfbahxtlswxSCjcUL9H0nqXo9IR3/t5Y5PKIA3fx3MfUyR9Xw==} + peerDependencies: + i18next: '>= 23.4.0' + react: '>= 16.8.0' + react-dom: '*' + react-native: '*' + typescript: ^5 + peerDependenciesMeta: + react-dom: + optional: true + react-native: + optional: true + typescript: + optional: true + react-is@18.3.1: resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} @@ -4128,10 +4169,12 @@ packages: uuid@8.3.2: resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + deprecated: uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028). hasBin: true uuid@9.0.1: resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} + deprecated: uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028). hasBin: true valibot@1.3.1: @@ -4213,6 +4256,10 @@ packages: vlq@1.0.1: resolution: {integrity: sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w==} + void-elements@3.1.0: + resolution: {integrity: sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==} + engines: {node: '>=0.10.0'} + wagmi@2.19.5: resolution: {integrity: sha512-RQUfKMv6U+EcSNNGiPbdkDtJwtuFxZWLmvDiQmjjBgkuPulUwDJsKhi7gjynzJdsx2yDqhHCXkKsbbfbIsHfcQ==} peerDependencies: @@ -4559,7 +4606,7 @@ snapshots: idb-keyval: 6.2.1 ox: 0.6.9(typescript@5.9.3)(zod@4.3.6) preact: 10.24.2 - viem: 2.47.17(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6) + viem: 2.47.17(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76) zustand: 5.0.3(@types/react@19.2.14)(react@19.2.5)(use-sync-external-store@1.4.0(react@19.2.5)) transitivePeerDependencies: - '@types/react' @@ -4573,17 +4620,17 @@ snapshots: - utf-8-validate - zod - '@ckb-ccc/ccc@1.1.25(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6)': + '@ckb-ccc/ccc@1.1.25(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76)': dependencies: - '@ckb-ccc/eip6963': 1.0.32(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6) - '@ckb-ccc/joy-id': 1.0.32(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6) - '@ckb-ccc/nip07': 1.0.32(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6) - '@ckb-ccc/okx': 1.0.32(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6) - '@ckb-ccc/rei': 1.0.32(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6) - '@ckb-ccc/shell': 1.1.25(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6) - '@ckb-ccc/uni-sat': 1.0.32(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6) - '@ckb-ccc/utxo-global': 1.0.32(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6) - '@ckb-ccc/xverse': 1.0.32(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6) + '@ckb-ccc/eip6963': 1.0.32(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76) + '@ckb-ccc/joy-id': 1.0.32(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76) + '@ckb-ccc/nip07': 1.0.32(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76) + '@ckb-ccc/okx': 1.0.32(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76) + '@ckb-ccc/rei': 1.0.32(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76) + '@ckb-ccc/shell': 1.1.25(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76) + '@ckb-ccc/uni-sat': 1.0.32(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76) + '@ckb-ccc/utxo-global': 1.0.32(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76) + '@ckb-ccc/xverse': 1.0.32(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76) transitivePeerDependencies: - bufferutil - debug @@ -4592,9 +4639,9 @@ snapshots: - utf-8-validate - zod - '@ckb-ccc/connector-react@1.0.34(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6)': + '@ckb-ccc/connector-react@1.0.34(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76)': dependencies: - '@ckb-ccc/connector': 1.0.33(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6) + '@ckb-ccc/connector': 1.0.33(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76) '@lit/react': 1.0.8(@types/react@19.2.14) react: 19.2.5 transitivePeerDependencies: @@ -4606,9 +4653,9 @@ snapshots: - utf-8-validate - zod - '@ckb-ccc/connector@1.0.33(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6)': + '@ckb-ccc/connector@1.0.33(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76)': dependencies: - '@ckb-ccc/ccc': 1.1.25(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6) + '@ckb-ccc/ccc': 1.1.25(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76) lit: 3.3.2 transitivePeerDependencies: - bufferutil @@ -4618,9 +4665,9 @@ snapshots: - utf-8-validate - zod - '@ckb-ccc/core@1.12.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6)': + '@ckb-ccc/core@1.12.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76)': dependencies: - '@joyid/ckb': 1.1.4(typescript@5.9.3)(zod@4.3.6) + '@joyid/ckb': 1.1.4(typescript@5.9.3)(zod@3.25.76) '@noble/ciphers': 0.5.3 '@noble/curves': 1.9.7 '@noble/hashes': 1.8.0 @@ -4637,9 +4684,9 @@ snapshots: - utf-8-validate - zod - '@ckb-ccc/eip6963@1.0.32(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6)': + '@ckb-ccc/eip6963@1.0.32(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76)': dependencies: - '@ckb-ccc/core': 1.12.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6) + '@ckb-ccc/core': 1.12.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76) transitivePeerDependencies: - bufferutil - encoding @@ -4647,11 +4694,11 @@ snapshots: - utf-8-validate - zod - '@ckb-ccc/joy-id@1.0.32(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6)': + '@ckb-ccc/joy-id@1.0.32(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76)': dependencies: - '@ckb-ccc/core': 1.12.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6) - '@joyid/ckb': 1.1.4(typescript@5.9.3)(zod@4.3.6) - '@joyid/common': 0.2.2(typescript@5.9.3)(zod@4.3.6) + '@ckb-ccc/core': 1.12.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76) + '@joyid/ckb': 1.1.4(typescript@5.9.3)(zod@3.25.76) + '@joyid/common': 0.2.2(typescript@5.9.3)(zod@3.25.76) transitivePeerDependencies: - bufferutil - encoding @@ -4659,9 +4706,9 @@ snapshots: - utf-8-validate - zod - '@ckb-ccc/nip07@1.0.32(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6)': + '@ckb-ccc/nip07@1.0.32(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76)': dependencies: - '@ckb-ccc/core': 1.12.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6) + '@ckb-ccc/core': 1.12.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76) transitivePeerDependencies: - bufferutil - encoding @@ -4669,11 +4716,11 @@ snapshots: - utf-8-validate - zod - '@ckb-ccc/okx@1.0.32(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6)': + '@ckb-ccc/okx@1.0.32(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76)': dependencies: - '@ckb-ccc/core': 1.12.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6) - '@ckb-ccc/nip07': 1.0.32(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6) - '@ckb-ccc/uni-sat': 1.0.32(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6) + '@ckb-ccc/core': 1.12.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76) + '@ckb-ccc/nip07': 1.0.32(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76) + '@ckb-ccc/uni-sat': 1.0.32(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76) transitivePeerDependencies: - bufferutil - encoding @@ -4681,9 +4728,9 @@ snapshots: - utf-8-validate - zod - '@ckb-ccc/rei@1.0.32(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6)': + '@ckb-ccc/rei@1.0.32(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76)': dependencies: - '@ckb-ccc/core': 1.12.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6) + '@ckb-ccc/core': 1.12.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76) transitivePeerDependencies: - bufferutil - encoding @@ -4691,12 +4738,12 @@ snapshots: - utf-8-validate - zod - '@ckb-ccc/shell@1.1.25(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6)': + '@ckb-ccc/shell@1.1.25(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76)': dependencies: - '@ckb-ccc/core': 1.12.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6) - '@ckb-ccc/spore': 1.5.17(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6) - '@ckb-ccc/ssri': 0.2.22(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6) - '@ckb-ccc/udt': 0.1.24(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6) + '@ckb-ccc/core': 1.12.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76) + '@ckb-ccc/spore': 1.5.17(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76) + '@ckb-ccc/ssri': 0.2.22(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76) + '@ckb-ccc/udt': 0.1.24(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76) transitivePeerDependencies: - bufferutil - debug @@ -4705,9 +4752,9 @@ snapshots: - utf-8-validate - zod - '@ckb-ccc/spore@1.5.17(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6)': + '@ckb-ccc/spore@1.5.17(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76)': dependencies: - '@ckb-ccc/core': 1.12.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6) + '@ckb-ccc/core': 1.12.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76) axios: 1.15.0 transitivePeerDependencies: - bufferutil @@ -4717,9 +4764,9 @@ snapshots: - utf-8-validate - zod - '@ckb-ccc/ssri@0.2.22(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6)': + '@ckb-ccc/ssri@0.2.22(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76)': dependencies: - '@ckb-ccc/core': 1.12.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6) + '@ckb-ccc/core': 1.12.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76) transitivePeerDependencies: - bufferutil - encoding @@ -4727,10 +4774,10 @@ snapshots: - utf-8-validate - zod - '@ckb-ccc/udt@0.1.24(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6)': + '@ckb-ccc/udt@0.1.24(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76)': dependencies: - '@ckb-ccc/core': 1.12.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6) - '@ckb-ccc/ssri': 0.2.22(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6) + '@ckb-ccc/core': 1.12.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76) + '@ckb-ccc/ssri': 0.2.22(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76) transitivePeerDependencies: - bufferutil - encoding @@ -4738,9 +4785,9 @@ snapshots: - utf-8-validate - zod - '@ckb-ccc/uni-sat@1.0.32(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6)': + '@ckb-ccc/uni-sat@1.0.32(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76)': dependencies: - '@ckb-ccc/core': 1.12.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6) + '@ckb-ccc/core': 1.12.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76) transitivePeerDependencies: - bufferutil - encoding @@ -4748,9 +4795,9 @@ snapshots: - utf-8-validate - zod - '@ckb-ccc/utxo-global@1.0.32(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6)': + '@ckb-ccc/utxo-global@1.0.32(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76)': dependencies: - '@ckb-ccc/core': 1.12.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6) + '@ckb-ccc/core': 1.12.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76) transitivePeerDependencies: - bufferutil - encoding @@ -4758,9 +4805,9 @@ snapshots: - utf-8-validate - zod - '@ckb-ccc/xverse@1.0.32(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6)': + '@ckb-ccc/xverse@1.0.32(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76)': dependencies: - '@ckb-ccc/core': 1.12.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6) + '@ckb-ccc/core': 1.12.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76) valibot: 1.3.1(typescript@5.9.3) transitivePeerDependencies: - bufferutil @@ -4803,15 +4850,15 @@ snapshots: transitivePeerDependencies: - supports-color - '@coinbase/wallet-sdk@4.3.6(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.5))(utf-8-validate@6.0.6)(zod@4.3.6)': + '@coinbase/wallet-sdk@4.3.6(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.5))(utf-8-validate@6.0.6)(zod@3.25.76)': dependencies: '@noble/hashes': 1.4.0 clsx: 1.2.1 eventemitter3: 5.0.1 idb-keyval: 6.2.1 - ox: 0.6.9(typescript@5.9.3)(zod@4.3.6) + ox: 0.6.9(typescript@5.9.3)(zod@3.25.76) preact: 10.24.2 - viem: 2.47.17(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6) + viem: 2.47.17(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76) zustand: 5.0.3(@types/react@19.2.14)(react@19.2.5)(use-sync-external-store@1.4.0(react@19.2.5)) transitivePeerDependencies: - '@types/react' @@ -5060,9 +5107,9 @@ snapshots: '@types/yargs': 17.0.35 chalk: 4.1.2 - '@joyid/ckb@1.1.4(typescript@5.9.3)(zod@4.3.6)': + '@joyid/ckb@1.1.4(typescript@5.9.3)(zod@3.25.76)': dependencies: - '@joyid/common': 0.2.2(typescript@5.9.3)(zod@4.3.6) + '@joyid/common': 0.2.2(typescript@5.9.3)(zod@3.25.76) '@nervosnetwork/ckb-sdk-utils': 0.109.5 cross-fetch: 4.0.0 uncrypto: 0.1.3 @@ -5071,9 +5118,9 @@ snapshots: - typescript - zod - '@joyid/common@0.2.2(typescript@5.9.3)(zod@4.3.6)': + '@joyid/common@0.2.2(typescript@5.9.3)(zod@3.25.76)': dependencies: - abitype: 0.8.7(typescript@5.9.3)(zod@4.3.6) + abitype: 0.8.7(typescript@5.9.3)(zod@3.25.76) type-fest: 4.6.0 transitivePeerDependencies: - typescript @@ -5362,7 +5409,7 @@ snapshots: '@paulmillr/qr@0.2.1': {} - '@rainbow-me/rainbowkit@2.2.10(@tanstack/react-query@5.99.0(react@19.2.5))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(typescript@5.9.3)(viem@2.47.17(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6))(wagmi@2.19.5(@react-native-async-storage/async-storage@1.24.0(react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6)))(@tanstack/query-core@5.99.0)(@tanstack/react-query@5.99.0(react@19.2.5))(@types/react@19.2.14)(bufferutil@4.1.0)(react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6))(react@19.2.5)(typescript@5.9.3)(utf-8-validate@6.0.6)(viem@2.47.17(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6))(zod@4.3.6))': + '@rainbow-me/rainbowkit@2.2.10(@tanstack/react-query@5.99.0(react@19.2.5))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(typescript@5.9.3)(viem@2.47.17(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6))(wagmi@2.19.5(@react-native-async-storage/async-storage@1.24.0(react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6)))(@tanstack/query-core@5.99.0)(@tanstack/react-query@5.99.0(react@19.2.5))(@types/react@19.2.14)(bufferutil@4.1.0)(react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6))(react@19.2.5)(typescript@5.9.3)(utf-8-validate@6.0.6)(viem@2.47.17(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6))(zod@3.25.76))': dependencies: '@tanstack/react-query': 5.99.0(react@19.2.5) '@vanilla-extract/css': 1.17.3 @@ -5375,7 +5422,7 @@ snapshots: react-remove-scroll: 2.6.2(@types/react@19.2.14)(react@19.2.5) ua-parser-js: 1.0.41 viem: 2.47.17(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6) - wagmi: 2.19.5(@react-native-async-storage/async-storage@1.24.0(react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6)))(@tanstack/query-core@5.99.0)(@tanstack/react-query@5.99.0(react@19.2.5))(@types/react@19.2.14)(bufferutil@4.1.0)(react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6))(react@19.2.5)(typescript@5.9.3)(utf-8-validate@6.0.6)(viem@2.47.17(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6))(zod@4.3.6) + wagmi: 2.19.5(@react-native-async-storage/async-storage@1.24.0(react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6)))(@tanstack/query-core@5.99.0)(@tanstack/react-query@5.99.0(react@19.2.5))(@types/react@19.2.14)(bufferutil@4.1.0)(react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6))(react@19.2.5)(typescript@5.9.3)(utf-8-validate@6.0.6)(viem@2.47.17(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6))(zod@3.25.76) transitivePeerDependencies: - '@types/react' - babel-plugin-macros @@ -5468,24 +5515,24 @@ snapshots: - utf-8-validate - zod - '@reown/appkit-common@1.7.8(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6)': + '@reown/appkit-common@1.7.8(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76)': dependencies: big.js: 6.2.2 dayjs: 1.11.13 - viem: 2.47.17(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6) + viem: 2.47.17(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76) transitivePeerDependencies: - bufferutil - typescript - utf-8-validate - zod - '@reown/appkit-controllers@1.7.8(@react-native-async-storage/async-storage@1.24.0(react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6)))(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6)': + '@reown/appkit-controllers@1.7.8(@react-native-async-storage/async-storage@1.24.0(react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6)))(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76)': dependencies: - '@reown/appkit-common': 1.7.8(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6) + '@reown/appkit-common': 1.7.8(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76) '@reown/appkit-wallet': 1.7.8(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6) - '@walletconnect/universal-provider': 2.21.0(@react-native-async-storage/async-storage@1.24.0(react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6)))(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6) + '@walletconnect/universal-provider': 2.21.0(@react-native-async-storage/async-storage@1.24.0(react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6)))(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76) valtio: 1.13.2(@types/react@19.2.14)(react@19.2.5) - viem: 2.47.17(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6) + viem: 2.47.17(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -5514,12 +5561,12 @@ snapshots: - utf-8-validate - zod - '@reown/appkit-pay@1.7.8(@react-native-async-storage/async-storage@1.24.0(react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6)))(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6)': + '@reown/appkit-pay@1.7.8(@react-native-async-storage/async-storage@1.24.0(react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6)))(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76)': dependencies: - '@reown/appkit-common': 1.7.8(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6) - '@reown/appkit-controllers': 1.7.8(@react-native-async-storage/async-storage@1.24.0(react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6)))(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6) - '@reown/appkit-ui': 1.7.8(@react-native-async-storage/async-storage@1.24.0(react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6)))(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6) - '@reown/appkit-utils': 1.7.8(@react-native-async-storage/async-storage@1.24.0(react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6)))(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(typescript@5.9.3)(utf-8-validate@6.0.6)(valtio@1.13.2(@types/react@19.2.14)(react@19.2.5))(zod@4.3.6) + '@reown/appkit-common': 1.7.8(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76) + '@reown/appkit-controllers': 1.7.8(@react-native-async-storage/async-storage@1.24.0(react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6)))(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76) + '@reown/appkit-ui': 1.7.8(@react-native-async-storage/async-storage@1.24.0(react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6)))(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76) + '@reown/appkit-utils': 1.7.8(@react-native-async-storage/async-storage@1.24.0(react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6)))(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(typescript@5.9.3)(utf-8-validate@6.0.6)(valtio@1.13.2(@types/react@19.2.14)(react@19.2.5))(zod@3.25.76) lit: 3.3.0 valtio: 1.13.2(@types/react@19.2.14)(react@19.2.5) transitivePeerDependencies: @@ -5554,12 +5601,12 @@ snapshots: dependencies: buffer: 6.0.3 - '@reown/appkit-scaffold-ui@1.7.8(@react-native-async-storage/async-storage@1.24.0(react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6)))(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(typescript@5.9.3)(utf-8-validate@6.0.6)(valtio@1.13.2(@types/react@19.2.14)(react@19.2.5))(zod@4.3.6)': + '@reown/appkit-scaffold-ui@1.7.8(@react-native-async-storage/async-storage@1.24.0(react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6)))(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(typescript@5.9.3)(utf-8-validate@6.0.6)(valtio@1.13.2(@types/react@19.2.14)(react@19.2.5))(zod@3.25.76)': dependencies: - '@reown/appkit-common': 1.7.8(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6) - '@reown/appkit-controllers': 1.7.8(@react-native-async-storage/async-storage@1.24.0(react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6)))(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6) - '@reown/appkit-ui': 1.7.8(@react-native-async-storage/async-storage@1.24.0(react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6)))(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6) - '@reown/appkit-utils': 1.7.8(@react-native-async-storage/async-storage@1.24.0(react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6)))(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(typescript@5.9.3)(utf-8-validate@6.0.6)(valtio@1.13.2(@types/react@19.2.14)(react@19.2.5))(zod@4.3.6) + '@reown/appkit-common': 1.7.8(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76) + '@reown/appkit-controllers': 1.7.8(@react-native-async-storage/async-storage@1.24.0(react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6)))(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76) + '@reown/appkit-ui': 1.7.8(@react-native-async-storage/async-storage@1.24.0(react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6)))(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76) + '@reown/appkit-utils': 1.7.8(@react-native-async-storage/async-storage@1.24.0(react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6)))(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(typescript@5.9.3)(utf-8-validate@6.0.6)(valtio@1.13.2(@types/react@19.2.14)(react@19.2.5))(zod@3.25.76) '@reown/appkit-wallet': 1.7.8(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6) lit: 3.3.0 transitivePeerDependencies: @@ -5591,10 +5638,10 @@ snapshots: - valtio - zod - '@reown/appkit-ui@1.7.8(@react-native-async-storage/async-storage@1.24.0(react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6)))(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6)': + '@reown/appkit-ui@1.7.8(@react-native-async-storage/async-storage@1.24.0(react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6)))(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76)': dependencies: - '@reown/appkit-common': 1.7.8(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6) - '@reown/appkit-controllers': 1.7.8(@react-native-async-storage/async-storage@1.24.0(react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6)))(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6) + '@reown/appkit-common': 1.7.8(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76) + '@reown/appkit-controllers': 1.7.8(@react-native-async-storage/async-storage@1.24.0(react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6)))(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76) '@reown/appkit-wallet': 1.7.8(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6) lit: 3.3.0 qrcode: 1.5.3 @@ -5626,16 +5673,16 @@ snapshots: - utf-8-validate - zod - '@reown/appkit-utils@1.7.8(@react-native-async-storage/async-storage@1.24.0(react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6)))(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(typescript@5.9.3)(utf-8-validate@6.0.6)(valtio@1.13.2(@types/react@19.2.14)(react@19.2.5))(zod@4.3.6)': + '@reown/appkit-utils@1.7.8(@react-native-async-storage/async-storage@1.24.0(react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6)))(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(typescript@5.9.3)(utf-8-validate@6.0.6)(valtio@1.13.2(@types/react@19.2.14)(react@19.2.5))(zod@3.25.76)': dependencies: - '@reown/appkit-common': 1.7.8(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6) - '@reown/appkit-controllers': 1.7.8(@react-native-async-storage/async-storage@1.24.0(react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6)))(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6) + '@reown/appkit-common': 1.7.8(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76) + '@reown/appkit-controllers': 1.7.8(@react-native-async-storage/async-storage@1.24.0(react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6)))(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76) '@reown/appkit-polyfills': 1.7.8 '@reown/appkit-wallet': 1.7.8(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6) '@walletconnect/logger': 2.1.2 - '@walletconnect/universal-provider': 2.21.0(@react-native-async-storage/async-storage@1.24.0(react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6)))(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6) + '@walletconnect/universal-provider': 2.21.0(@react-native-async-storage/async-storage@1.24.0(react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6)))(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76) valtio: 1.13.2(@types/react@19.2.14)(react@19.2.5) - viem: 2.47.17(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6) + viem: 2.47.17(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -5675,21 +5722,21 @@ snapshots: - typescript - utf-8-validate - '@reown/appkit@1.7.8(@react-native-async-storage/async-storage@1.24.0(react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6)))(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6)': + '@reown/appkit@1.7.8(@react-native-async-storage/async-storage@1.24.0(react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6)))(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76)': dependencies: - '@reown/appkit-common': 1.7.8(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6) - '@reown/appkit-controllers': 1.7.8(@react-native-async-storage/async-storage@1.24.0(react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6)))(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6) - '@reown/appkit-pay': 1.7.8(@react-native-async-storage/async-storage@1.24.0(react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6)))(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6) + '@reown/appkit-common': 1.7.8(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76) + '@reown/appkit-controllers': 1.7.8(@react-native-async-storage/async-storage@1.24.0(react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6)))(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76) + '@reown/appkit-pay': 1.7.8(@react-native-async-storage/async-storage@1.24.0(react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6)))(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76) '@reown/appkit-polyfills': 1.7.8 - '@reown/appkit-scaffold-ui': 1.7.8(@react-native-async-storage/async-storage@1.24.0(react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6)))(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(typescript@5.9.3)(utf-8-validate@6.0.6)(valtio@1.13.2(@types/react@19.2.14)(react@19.2.5))(zod@4.3.6) - '@reown/appkit-ui': 1.7.8(@react-native-async-storage/async-storage@1.24.0(react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6)))(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6) - '@reown/appkit-utils': 1.7.8(@react-native-async-storage/async-storage@1.24.0(react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6)))(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(typescript@5.9.3)(utf-8-validate@6.0.6)(valtio@1.13.2(@types/react@19.2.14)(react@19.2.5))(zod@4.3.6) + '@reown/appkit-scaffold-ui': 1.7.8(@react-native-async-storage/async-storage@1.24.0(react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6)))(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(typescript@5.9.3)(utf-8-validate@6.0.6)(valtio@1.13.2(@types/react@19.2.14)(react@19.2.5))(zod@3.25.76) + '@reown/appkit-ui': 1.7.8(@react-native-async-storage/async-storage@1.24.0(react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6)))(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76) + '@reown/appkit-utils': 1.7.8(@react-native-async-storage/async-storage@1.24.0(react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6)))(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(typescript@5.9.3)(utf-8-validate@6.0.6)(valtio@1.13.2(@types/react@19.2.14)(react@19.2.5))(zod@3.25.76) '@reown/appkit-wallet': 1.7.8(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6) '@walletconnect/types': 2.21.0(@react-native-async-storage/async-storage@1.24.0(react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6))) - '@walletconnect/universal-provider': 2.21.0(@react-native-async-storage/async-storage@1.24.0(react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6)))(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6) + '@walletconnect/universal-provider': 2.21.0(@react-native-async-storage/async-storage@1.24.0(react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6)))(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76) bs58: 6.0.0 valtio: 1.13.2(@types/react@19.2.14)(react@19.2.5) - viem: 2.47.17(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6) + viem: 2.47.17(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -5795,9 +5842,9 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.60.1': optional: true - '@safe-global/safe-apps-provider@0.18.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6)': + '@safe-global/safe-apps-provider@0.18.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76)': dependencies: - '@safe-global/safe-apps-sdk': 9.1.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6) + '@safe-global/safe-apps-sdk': 9.1.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76) events: 3.3.0 transitivePeerDependencies: - bufferutil @@ -5805,10 +5852,10 @@ snapshots: - utf-8-validate - zod - '@safe-global/safe-apps-sdk@9.1.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6)': + '@safe-global/safe-apps-sdk@9.1.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76)': dependencies: '@safe-global/safe-gateway-typescript-sdk': 3.23.1 - viem: 2.47.17(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6) + viem: 2.47.17(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76) transitivePeerDependencies: - bufferutil - typescript @@ -6682,18 +6729,18 @@ snapshots: transitivePeerDependencies: - supports-color - '@wagmi/connectors@6.2.0(91d423540852604c41b9ade092e98f9b)': + '@wagmi/connectors@6.2.0(d32fac3895882b0645754e2e858c70dd)': dependencies: '@base-org/account': 2.4.0(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.5))(utf-8-validate@6.0.6)(zod@4.3.6) - '@coinbase/wallet-sdk': 4.3.6(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.5))(utf-8-validate@6.0.6)(zod@4.3.6) + '@coinbase/wallet-sdk': 4.3.6(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.5))(utf-8-validate@6.0.6)(zod@3.25.76) '@gemini-wallet/core': 0.3.2(viem@2.47.17(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6)) '@metamask/sdk': 0.33.1(bufferutil@4.1.0)(utf-8-validate@6.0.6) - '@safe-global/safe-apps-provider': 0.18.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6) - '@safe-global/safe-apps-sdk': 9.1.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6) + '@safe-global/safe-apps-provider': 0.18.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76) + '@safe-global/safe-apps-sdk': 9.1.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76) '@wagmi/core': 2.22.1(@tanstack/query-core@5.99.0)(@types/react@19.2.14)(react@19.2.5)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.5))(viem@2.47.17(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6)) - '@walletconnect/ethereum-provider': 2.21.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6)))(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6) + '@walletconnect/ethereum-provider': 2.21.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6)))(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76) cbw-sdk: '@coinbase/wallet-sdk@3.9.3' - porto: 0.2.35(6cc396be3f806549626ab5030c279c62) + porto: 0.2.35(de3b9b5ab3c2ce8d2e8c6952073a517f) viem: 2.47.17(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6) optionalDependencies: typescript: 5.9.3 @@ -6777,7 +6824,7 @@ snapshots: dependencies: '@wallet-standard/base': 1.1.0 - '@walletconnect/core@2.21.0(@react-native-async-storage/async-storage@1.24.0(react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6)))(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6)': + '@walletconnect/core@2.21.0(@react-native-async-storage/async-storage@1.24.0(react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6)))(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76)': dependencies: '@walletconnect/heartbeat': 1.2.2 '@walletconnect/jsonrpc-provider': 1.0.14 @@ -6791,7 +6838,7 @@ snapshots: '@walletconnect/safe-json': 1.0.2 '@walletconnect/time': 1.0.2 '@walletconnect/types': 2.21.0(@react-native-async-storage/async-storage@1.24.0(react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6))) - '@walletconnect/utils': 2.21.0(@react-native-async-storage/async-storage@1.24.0(react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6)))(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6) + '@walletconnect/utils': 2.21.0(@react-native-async-storage/async-storage@1.24.0(react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6)))(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76) '@walletconnect/window-getters': 1.0.1 es-toolkit: 1.33.0 events: 3.3.0 @@ -6821,7 +6868,7 @@ snapshots: - utf-8-validate - zod - '@walletconnect/core@2.21.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6)))(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6)': + '@walletconnect/core@2.21.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6)))(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76)': dependencies: '@walletconnect/heartbeat': 1.2.2 '@walletconnect/jsonrpc-provider': 1.0.14 @@ -6835,7 +6882,7 @@ snapshots: '@walletconnect/safe-json': 1.0.2 '@walletconnect/time': 1.0.2 '@walletconnect/types': 2.21.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6))) - '@walletconnect/utils': 2.21.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6)))(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6) + '@walletconnect/utils': 2.21.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6)))(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76) '@walletconnect/window-getters': 1.0.1 es-toolkit: 1.33.0 events: 3.3.0 @@ -6869,18 +6916,18 @@ snapshots: dependencies: tslib: 1.14.1 - '@walletconnect/ethereum-provider@2.21.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6)))(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6)': + '@walletconnect/ethereum-provider@2.21.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6)))(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76)': dependencies: - '@reown/appkit': 1.7.8(@react-native-async-storage/async-storage@1.24.0(react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6)))(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6) + '@reown/appkit': 1.7.8(@react-native-async-storage/async-storage@1.24.0(react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6)))(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76) '@walletconnect/jsonrpc-http-connection': 1.0.8 '@walletconnect/jsonrpc-provider': 1.0.14 '@walletconnect/jsonrpc-types': 1.0.4 '@walletconnect/jsonrpc-utils': 1.0.8 '@walletconnect/keyvaluestorage': 1.1.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6))) - '@walletconnect/sign-client': 2.21.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6)))(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6) + '@walletconnect/sign-client': 2.21.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6)))(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76) '@walletconnect/types': 2.21.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6))) - '@walletconnect/universal-provider': 2.21.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6)))(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6) - '@walletconnect/utils': 2.21.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6)))(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6) + '@walletconnect/universal-provider': 2.21.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6)))(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76) + '@walletconnect/utils': 2.21.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6)))(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76) events: 3.3.0 transitivePeerDependencies: - '@azure/app-configuration' @@ -7005,16 +7052,16 @@ snapshots: dependencies: tslib: 1.14.1 - '@walletconnect/sign-client@2.21.0(@react-native-async-storage/async-storage@1.24.0(react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6)))(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6)': + '@walletconnect/sign-client@2.21.0(@react-native-async-storage/async-storage@1.24.0(react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6)))(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76)': dependencies: - '@walletconnect/core': 2.21.0(@react-native-async-storage/async-storage@1.24.0(react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6)))(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6) + '@walletconnect/core': 2.21.0(@react-native-async-storage/async-storage@1.24.0(react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6)))(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76) '@walletconnect/events': 1.0.1 '@walletconnect/heartbeat': 1.2.2 '@walletconnect/jsonrpc-utils': 1.0.8 '@walletconnect/logger': 2.1.2 '@walletconnect/time': 1.0.2 '@walletconnect/types': 2.21.0(@react-native-async-storage/async-storage@1.24.0(react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6))) - '@walletconnect/utils': 2.21.0(@react-native-async-storage/async-storage@1.24.0(react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6)))(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6) + '@walletconnect/utils': 2.21.0(@react-native-async-storage/async-storage@1.24.0(react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6)))(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76) events: 3.3.0 transitivePeerDependencies: - '@azure/app-configuration' @@ -7041,16 +7088,16 @@ snapshots: - utf-8-validate - zod - '@walletconnect/sign-client@2.21.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6)))(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6)': + '@walletconnect/sign-client@2.21.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6)))(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76)': dependencies: - '@walletconnect/core': 2.21.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6)))(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6) + '@walletconnect/core': 2.21.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6)))(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76) '@walletconnect/events': 1.0.1 '@walletconnect/heartbeat': 1.2.2 '@walletconnect/jsonrpc-utils': 1.0.8 '@walletconnect/logger': 2.1.2 '@walletconnect/time': 1.0.2 '@walletconnect/types': 2.21.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6))) - '@walletconnect/utils': 2.21.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6)))(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6) + '@walletconnect/utils': 2.21.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6)))(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76) events: 3.3.0 transitivePeerDependencies: - '@azure/app-configuration' @@ -7139,7 +7186,7 @@ snapshots: - ioredis - uploadthing - '@walletconnect/universal-provider@2.21.0(@react-native-async-storage/async-storage@1.24.0(react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6)))(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6)': + '@walletconnect/universal-provider@2.21.0(@react-native-async-storage/async-storage@1.24.0(react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6)))(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76)': dependencies: '@walletconnect/events': 1.0.1 '@walletconnect/jsonrpc-http-connection': 1.0.8 @@ -7148,9 +7195,9 @@ snapshots: '@walletconnect/jsonrpc-utils': 1.0.8 '@walletconnect/keyvaluestorage': 1.1.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6))) '@walletconnect/logger': 2.1.2 - '@walletconnect/sign-client': 2.21.0(@react-native-async-storage/async-storage@1.24.0(react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6)))(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6) + '@walletconnect/sign-client': 2.21.0(@react-native-async-storage/async-storage@1.24.0(react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6)))(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76) '@walletconnect/types': 2.21.0(@react-native-async-storage/async-storage@1.24.0(react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6))) - '@walletconnect/utils': 2.21.0(@react-native-async-storage/async-storage@1.24.0(react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6)))(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6) + '@walletconnect/utils': 2.21.0(@react-native-async-storage/async-storage@1.24.0(react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6)))(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76) es-toolkit: 1.33.0 events: 3.3.0 transitivePeerDependencies: @@ -7179,7 +7226,7 @@ snapshots: - utf-8-validate - zod - '@walletconnect/universal-provider@2.21.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6)))(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6)': + '@walletconnect/universal-provider@2.21.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6)))(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76)': dependencies: '@walletconnect/events': 1.0.1 '@walletconnect/jsonrpc-http-connection': 1.0.8 @@ -7188,9 +7235,9 @@ snapshots: '@walletconnect/jsonrpc-utils': 1.0.8 '@walletconnect/keyvaluestorage': 1.1.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6))) '@walletconnect/logger': 2.1.2 - '@walletconnect/sign-client': 2.21.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6)))(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6) + '@walletconnect/sign-client': 2.21.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6)))(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76) '@walletconnect/types': 2.21.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6))) - '@walletconnect/utils': 2.21.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6)))(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6) + '@walletconnect/utils': 2.21.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6)))(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76) es-toolkit: 1.33.0 events: 3.3.0 transitivePeerDependencies: @@ -7219,7 +7266,7 @@ snapshots: - utf-8-validate - zod - '@walletconnect/utils@2.21.0(@react-native-async-storage/async-storage@1.24.0(react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6)))(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6)': + '@walletconnect/utils@2.21.0(@react-native-async-storage/async-storage@1.24.0(react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6)))(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76)': dependencies: '@noble/ciphers': 1.2.1 '@noble/curves': 1.8.1 @@ -7237,7 +7284,7 @@ snapshots: detect-browser: 5.3.0 query-string: 7.1.3 uint8arrays: 3.1.0 - viem: 2.23.2(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6) + viem: 2.23.2(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -7263,7 +7310,7 @@ snapshots: - utf-8-validate - zod - '@walletconnect/utils@2.21.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6)))(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6)': + '@walletconnect/utils@2.21.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6)))(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76)': dependencies: '@noble/ciphers': 1.2.1 '@noble/curves': 1.8.1 @@ -7281,7 +7328,7 @@ snapshots: detect-browser: 5.3.0 query-string: 7.1.3 uint8arrays: 3.1.0 - viem: 2.23.2(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6) + viem: 2.23.2(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -7316,11 +7363,11 @@ snapshots: '@walletconnect/window-getters': 1.0.1 tslib: 1.14.1 - '@wraith-protocol/sdk@1.4.5(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6))(@stellar/stellar-sdk@13.3.0)(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6)': + '@wraith-protocol/sdk@1.4.5(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6))(@stellar/stellar-sdk@13.3.0)(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76)': dependencies: '@noble/curves': 1.9.7 '@noble/hashes': 1.8.0 - viem: 2.47.17(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6) + viem: 2.47.17(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76) optionalDependencies: '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6) '@stellar/stellar-sdk': 13.3.0 @@ -7335,21 +7382,21 @@ snapshots: jsonparse: 1.3.1 through: 2.3.8 - abitype@0.8.7(typescript@5.9.3)(zod@4.3.6): + abitype@0.8.7(typescript@5.9.3)(zod@3.25.76): dependencies: typescript: 5.9.3 optionalDependencies: - zod: 4.3.6 + zod: 3.25.76 abitype@1.0.6(typescript@5.9.3)(zod@3.25.76): optionalDependencies: typescript: 5.9.3 zod: 3.25.76 - abitype@1.0.8(typescript@5.9.3)(zod@4.3.6): + abitype@1.0.8(typescript@5.9.3)(zod@3.25.76): optionalDependencies: typescript: 5.9.3 - zod: 4.3.6 + zod: 3.25.76 abitype@1.2.3(typescript@5.9.3)(zod@3.22.4): optionalDependencies: @@ -8220,6 +8267,10 @@ snapshots: hono@4.12.12: {} + html-parse-stringify@3.0.1: + dependencies: + void-elements: 3.1.0 + http-errors@2.0.1: dependencies: depd: 2.0.0 @@ -8241,6 +8292,16 @@ snapshots: husky@9.1.7: {} + i18next-browser-languagedetector@8.2.1: + dependencies: + '@babel/runtime': 7.29.2 + + i18next@24.2.3(typescript@5.9.3): + dependencies: + '@babel/runtime': 7.29.2 + optionalDependencies: + typescript: 5.9.3 + idb-keyval@6.2.1: {} idb-keyval@6.2.2: {} @@ -8895,14 +8956,28 @@ snapshots: transitivePeerDependencies: - zod - ox@0.6.7(typescript@5.9.3)(zod@4.3.6): + ox@0.6.7(typescript@5.9.3)(zod@3.25.76): dependencies: '@adraffy/ens-normalize': 1.11.1 '@noble/curves': 1.9.7 '@noble/hashes': 1.8.0 '@scure/bip32': 1.6.2 '@scure/bip39': 1.5.4 - abitype: 1.0.8(typescript@5.9.3)(zod@4.3.6) + abitype: 1.0.8(typescript@5.9.3)(zod@3.25.76) + eventemitter3: 5.0.1 + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - zod + + ox@0.6.9(typescript@5.9.3)(zod@3.25.76): + dependencies: + '@adraffy/ens-normalize': 1.11.1 + '@noble/curves': 1.9.7 + '@noble/hashes': 1.8.0 + '@scure/bip32': 1.7.0 + '@scure/bip39': 1.6.0 + abitype: 1.2.3(typescript@5.9.3)(zod@3.25.76) eventemitter3: 5.0.1 optionalDependencies: typescript: 5.9.3 @@ -9016,7 +9091,7 @@ snapshots: pony-cause@2.1.11: {} - porto@0.2.35(6cc396be3f806549626ab5030c279c62): + porto@0.2.35(de3b9b5ab3c2ce8d2e8c6952073a517f): dependencies: '@wagmi/core': 2.22.1(@tanstack/query-core@5.99.0)(@types/react@19.2.14)(react@19.2.5)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.5))(viem@2.47.17(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6)) hono: 4.12.12 @@ -9031,7 +9106,7 @@ snapshots: react: 19.2.5 react-native: 0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6) typescript: 5.9.3 - wagmi: 2.19.5(@react-native-async-storage/async-storage@1.24.0(react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6)))(@tanstack/query-core@5.99.0)(@tanstack/react-query@5.99.0(react@19.2.5))(@types/react@19.2.14)(bufferutil@4.1.0)(react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6))(react@19.2.5)(typescript@5.9.3)(utf-8-validate@6.0.6)(viem@2.47.17(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6))(zod@4.3.6) + wagmi: 2.19.5(@react-native-async-storage/async-storage@1.24.0(react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6)))(@tanstack/query-core@5.99.0)(@tanstack/react-query@5.99.0(react@19.2.5))(@types/react@19.2.14)(bufferutil@4.1.0)(react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6))(react@19.2.5)(typescript@5.9.3)(utf-8-validate@6.0.6)(viem@2.47.17(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6))(zod@3.25.76) transitivePeerDependencies: - '@types/react' - immer @@ -9159,6 +9234,17 @@ snapshots: react: 19.2.5 scheduler: 0.27.0 + react-i18next@15.7.4(i18next@24.2.3(typescript@5.9.3))(react-dom@19.2.5(react@19.2.5))(react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6))(react@19.2.5)(typescript@5.9.3): + dependencies: + '@babel/runtime': 7.29.2 + html-parse-stringify: 3.0.1 + i18next: 24.2.3(typescript@5.9.3) + react: 19.2.5 + optionalDependencies: + react-dom: 19.2.5(react@19.2.5) + react-native: 0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6) + typescript: 5.9.3 + react-is@18.3.1: {} react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6): @@ -9747,15 +9833,15 @@ snapshots: '@types/react': 19.2.14 react: 19.2.5 - viem@2.23.2(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6): + viem@2.23.2(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76): dependencies: '@noble/curves': 1.8.1 '@noble/hashes': 1.7.1 '@scure/bip32': 1.6.2 '@scure/bip39': 1.5.4 - abitype: 1.0.8(typescript@5.9.3)(zod@4.3.6) + abitype: 1.0.8(typescript@5.9.3)(zod@3.25.76) isows: 1.0.6(ws@8.18.0(bufferutil@4.1.0)(utf-8-validate@6.0.6)) - ox: 0.6.7(typescript@5.9.3)(zod@4.3.6) + ox: 0.6.7(typescript@5.9.3)(zod@3.25.76) ws: 8.18.0(bufferutil@4.1.0)(utf-8-validate@6.0.6) optionalDependencies: typescript: 5.9.3 @@ -9832,10 +9918,12 @@ snapshots: vlq@1.0.1: {} - wagmi@2.19.5(@react-native-async-storage/async-storage@1.24.0(react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6)))(@tanstack/query-core@5.99.0)(@tanstack/react-query@5.99.0(react@19.2.5))(@types/react@19.2.14)(bufferutil@4.1.0)(react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6))(react@19.2.5)(typescript@5.9.3)(utf-8-validate@6.0.6)(viem@2.47.17(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6))(zod@4.3.6): + void-elements@3.1.0: {} + + wagmi@2.19.5(@react-native-async-storage/async-storage@1.24.0(react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6)))(@tanstack/query-core@5.99.0)(@tanstack/react-query@5.99.0(react@19.2.5))(@types/react@19.2.14)(bufferutil@4.1.0)(react-native@0.85.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.5)(utf-8-validate@6.0.6))(react@19.2.5)(typescript@5.9.3)(utf-8-validate@6.0.6)(viem@2.47.17(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6))(zod@3.25.76): dependencies: '@tanstack/react-query': 5.99.0(react@19.2.5) - '@wagmi/connectors': 6.2.0(91d423540852604c41b9ade092e98f9b) + '@wagmi/connectors': 6.2.0(d32fac3895882b0645754e2e858c70dd) '@wagmi/core': 2.22.1(@tanstack/query-core@5.99.0)(@types/react@19.2.14)(react@19.2.5)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.5))(viem@2.47.17(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6)) react: 19.2.5 use-sync-external-store: 1.4.0(react@19.2.5) diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml new file mode 100644 index 0000000..46e7a2a --- /dev/null +++ b/pnpm-workspace.yaml @@ -0,0 +1,15 @@ +onlyBuiltDependencies: + - bufferutil + - esbuild + - keccak + - utf-8-validate + - utf-8-validate@5.0.10 + - utf-8-validate@6.0.6 + +allowBuilds: + bufferutil: true + esbuild: true + keccak: true + utf-8-validate: true + +dangerouslyAllowAllBuilds: true diff --git a/src/components/CkbReceive.tsx b/src/components/CkbReceive.tsx index 183571e..3ff067f 100644 --- a/src/components/CkbReceive.tsx +++ b/src/components/CkbReceive.tsx @@ -9,10 +9,12 @@ import { type MatchedStealthCell, type HexString, } from '@wraith-protocol/sdk/chains/ckb'; +import { useTranslation } from 'react-i18next'; import { useStealthKeys } from '@/context/StealthKeysContext'; import { CopyButton } from '@/components/CopyButton'; function CkbStealthRow({ match }: { match: MatchedStealthCell }) { + const { t } = useTranslation(); const [showKey, setShowKey] = useState(false); const keyHex = match.stealthPrivateKey.slice(2); const capacityCkb = (Number(match.capacity) / 1e8).toFixed(4); @@ -22,7 +24,7 @@ function CkbStealthRow({ match }: { match: MatchedStealthCell }) {
- Stealth Hash + {t('ckb.stealthHash')}

{match.stealthPubKeyHash}

@@ -36,7 +38,9 @@ function CkbStealthRow({ match }: { match: MatchedStealthCell }) {
- Cell + + {t('ckb.cell')} +

{match.txHash}:{match.index}

@@ -44,10 +48,10 @@ function CkbStealthRow({ match }: { match: MatchedStealthCell }) {

- Withdraw + {t('ckb.withdraw')}

- Use the private key below to sign a CKB transaction consuming this Cell. + {t('ckb.withdrawInstruction')}

@@ -57,13 +61,13 @@ function CkbStealthRow({ match }: { match: MatchedStealthCell }) { onClick={() => setShowKey(true)} className="font-mono text-[10px] uppercase tracking-widest text-outline transition-colors hover:text-primary" > - Reveal private key + {t('common.revealPrivateKey')} ) : (
- Stealth Key + {t('common.stealthKey')}
@@ -76,6 +80,7 @@ function CkbStealthRow({ match }: { match: MatchedStealthCell }) { } export function CkbReceive() { + const { t } = useTranslation(); const { wallet } = ccc.useCcc(); const signer = ccc.useSigner(); const { ckbKeys, ckbMetaAddress, setCkbKeys, setCkbMetaAddress } = useStealthKeys(); @@ -88,7 +93,7 @@ export function CkbReceive() { const deriveKeys = useCallback(async () => { if (!signer) { - setError('Connect your CKB wallet first'); + setError(t('ckb.connectWalletFirst')); return; } setIsDerivingKeys(true); @@ -109,11 +114,11 @@ export function CkbReceive() { const meta = encodeStealthMetaAddress(derived.spendingPubKey, derived.viewingPubKey); setCkbMetaAddress(meta); } catch (err) { - setError(err instanceof Error ? err.message : 'Key derivation failed'); + setError(err instanceof Error ? err.message : t('common.keyDerivationFailed')); } finally { setIsDerivingKeys(false); } - }, [signer, setCkbKeys, setCkbMetaAddress]); + }, [signer, setCkbKeys, setCkbMetaAddress, t]); const scanPayments = useCallback(async () => { if (!ckbKeys) return; @@ -130,23 +135,23 @@ export function CkbReceive() { setMatched(results); setHasScanned(true); } catch (err) { - setError(err instanceof Error ? err.message : 'Scan failed'); + setError(err instanceof Error ? err.message : t('common.scanFailed')); } finally { setIsScanning(false); } - }, [ckbKeys]); + }, [ckbKeys, t]); if (!wallet) { return (
- CKB Testnet / CKB + {t('ckb.network')}

- Receive + {t('ckb.receiveTitle')}

- Connect your CKB wallet to scan for stealth payments. + {t('ckb.receiveConnectPrompt')}

); @@ -156,13 +161,13 @@ export function CkbReceive() {
- CKB Testnet / CKB + {t('ckb.network')}

- Receive + {t('ckb.receiveTitle')}

- Derive your stealth keys, then scan for stealth Cells on CKB Testnet. + {t('ckb.receiveDescription')}

@@ -173,7 +178,7 @@ export function CkbReceive() { disabled={isDerivingKeys} className="h-12 w-full bg-primary font-heading text-[13px] font-semibold uppercase tracking-widest text-surface transition-colors hover:brightness-110 disabled:opacity-30" > - {isDerivingKeys ? 'Sign in wallet...' : 'Derive Stealth Keys'} + {isDerivingKeys ? t('common.signingInWallet') : t('ckb.deriveStealthKeys')} {error &&

{error}

}
@@ -184,7 +189,7 @@ export function CkbReceive() {
- Your Stealth Meta-Address + {t('common.yourStealthMetaAddress')}
@@ -199,11 +204,11 @@ export function CkbReceive() { disabled={isScanning} className="h-12 bg-primary px-6 font-heading text-[13px] font-semibold uppercase tracking-widest text-surface transition-colors hover:brightness-110 disabled:opacity-30" > - {isScanning ? 'Scanning...' : 'Scan for Cells'} + {isScanning ? t('ckb.scanning') : t('ckb.scanForCells')} {hasScanned && ( - {matched.length} cell{matched.length !== 1 ? 's' : ''} found + {t('ckb.cellsFound', { count: matched.length })} )}
@@ -221,10 +226,10 @@ export function CkbReceive() { {hasScanned && matched.length === 0 && (

- No cells found + {t('ckb.noCellsFound')}

- No stealth Cells matched your keys. + {t('ckb.noCellsMatchedKeys')}

)} diff --git a/src/components/CkbSend.tsx b/src/components/CkbSend.tsx index ae5261c..4539e11 100644 --- a/src/components/CkbSend.tsx +++ b/src/components/CkbSend.tsx @@ -5,11 +5,13 @@ import { decodeStealthMetaAddress, getDeployment, } from '@wraith-protocol/sdk/chains/ckb'; +import { useTranslation } from 'react-i18next'; import { CopyButton } from '@/components/CopyButton'; const STEALTH_LOCK_CODE_HASH = getDeployment('ckb').contracts.stealthLockCodeHash; export function CkbSend() { + const { t } = useTranslation(); const { wallet } = ccc.useCcc(); const signer = ccc.useSigner(); const [recipient, setRecipient] = useState(''); @@ -24,7 +26,7 @@ export function CkbSend() { const handleSend = useCallback(async () => { if (!signer) { - setError('Connect your CKB wallet first'); + setError(t('ckb.connectWalletFirst')); return; } @@ -33,16 +35,14 @@ export function CkbSend() { try { if (!recipient.startsWith('st:ckb:')) { - setError('Enter a valid CKB meta-address (st:ckb:...)'); + setError(t('ckb.validMetaAddressError')); setIsPending(false); return; } const parsed = parseFloat(amount); if (parsed < 95) { - setError( - 'Minimum amount is 95 CKB. Stealth cells require at least ~94.5 CKB for cell capacity.', - ); + setError(t('ckb.minAmountError')); setIsPending(false); return; } @@ -73,11 +73,11 @@ export function CkbSend() { const hash = await signer.sendTransaction(tx); setTxHash(hash); } catch (err) { - setError(err instanceof Error ? err.message : 'Transaction failed'); + setError(err instanceof Error ? err.message : t('common.transactionFailed')); } finally { setIsPending(false); } - }, [signer, recipient, amount]); + }, [signer, recipient, amount, t]); const reset = () => { setRecipient(''); @@ -102,13 +102,13 @@ export function CkbSend() { return (
- CKB Testnet / CKB + {t('ckb.network')}

- Send + {t('ckb.sendTitle')}

- Connect your CKB wallet to send stealth payments. + {t('ckb.sendConnectPrompt')}

); @@ -118,14 +118,13 @@ export function CkbSend() {
- CKB Testnet / CKB + {t('ckb.network')}

- Send + {t('ckb.sendTitle')}

- Send CKB privately using stealth addresses. The recipient gets funds at a fresh Cell only - they can unlock. + {t('ckb.sendDescription')}

@@ -133,28 +132,28 @@ export function CkbSend() {
setRecipient(e.target.value)} - placeholder="st:ckb:..." + placeholder={t('ckb.recipientPlaceholder')} className="h-12 w-full border border-outline-variant bg-surface px-4 pr-20 font-mono text-sm text-primary placeholder:text-outline focus:border-primary" />
- Network fee + {t('common.networkFee')} + + + {t('ckb.networkFeeAmount')} - ~1000 shannons
- Min cell capacity + {t('ckb.minCellCapacity')} + + + {t('ckb.minCellCapacityValue')} - ~94.5 CKB
@@ -192,7 +195,7 @@ export function CkbSend() { disabled={!recipient || !amount || isPending} className="h-12 w-full bg-primary font-heading text-[13px] font-semibold uppercase tracking-widest text-surface transition-colors hover:brightness-110 disabled:opacity-30" > - {isPending ? 'Confirm in wallet...' : 'Send Privately'} + {isPending ? t('common.confirmInWallet') : t('common.sendPrivately')}
)} @@ -202,14 +205,14 @@ export function CkbSend() {
- Transfer Complete + {t('common.transferComplete')}
- Stealth Public Key + {t('ckb.stealthPublicKey')}

@@ -221,7 +224,7 @@ export function CkbSend() {

- Transaction Hash + {t('common.transactionHash')} )} diff --git a/src/components/CopyButton.tsx b/src/components/CopyButton.tsx index 0c784a9..59dfd19 100644 --- a/src/components/CopyButton.tsx +++ b/src/components/CopyButton.tsx @@ -1,6 +1,8 @@ import { useState } from 'react'; +import { useTranslation } from 'react-i18next'; export function CopyButton({ text }: { text: string }) { + const { t } = useTranslation(); const [copied, setCopied] = useState(false); return ( ); } diff --git a/src/components/Header.tsx b/src/components/Header.tsx index 4ea4696..18c16f4 100644 --- a/src/components/Header.tsx +++ b/src/components/Header.tsx @@ -1,17 +1,20 @@ import { useState } from 'react'; import { Link, useLocation } from 'react-router-dom'; +import { useTranslation } from 'react-i18next'; import { ChainSwitcher } from './ChainSwitcher'; import { WalletConnect } from './WalletConnect'; - -const navLinks = [ - { to: '/send', label: 'Send' }, - { to: '/receive', label: 'Receive' }, -]; +import { LocaleSwitcher } from './LocaleSwitcher'; export function Header() { const location = useLocation(); + const { t } = useTranslation(); const [mobileMenuOpen, setMobileMenuOpen] = useState(false); + const navLinks = [ + { to: '/send', label: t('nav.send') }, + { to: '/receive', label: t('nav.receive') }, + ]; + return (
@@ -44,12 +47,13 @@ export function Header() {
+
@@ -158,7 +160,7 @@ function StealthRow({
- Withdrawn —{' '} + {t('common.withdrawn')} —{' '} setShowKey(true)} className="font-mono text-[10px] uppercase tracking-widest text-outline transition-colors hover:text-primary" > - Reveal private key + {t('common.revealPrivateKey')} ) : (
- Stealth Key + {t('common.stealthKey')}
@@ -198,6 +200,7 @@ function StealthRow({ } export function HorizenReceive() { + const { t } = useTranslation(); const { isConnected, address } = useAccount(); const { signMessageAsync } = useSignMessage(); const { evmKeys, evmMetaAddress, setEvmKeys, setEvmMetaAddress } = useStealthKeys(); @@ -247,7 +250,7 @@ export function HorizenReceive() { const meta = encodeStealthMetaAddress(derived.spendingPubKey, derived.viewingPubKey); setEvmMetaAddress(meta); } catch (err) { - setError(err instanceof Error ? err.message : 'Key derivation failed'); + setError(err instanceof Error ? err.message : t('common.keyDerivationFailed')); } finally { setIsDerivingKeys(false); } @@ -279,7 +282,7 @@ export function HorizenReceive() { setMatched(results); setHasScanned(true); } catch (err) { - setError(err instanceof Error ? err.message : 'Scan failed'); + setError(err instanceof Error ? err.message : t('common.scanFailed')); } finally { setIsScanning(false); } @@ -289,13 +292,13 @@ export function HorizenReceive() { return (
- Horizen Testnet / ETH + {t('horizen.network')}

- Receive + {t('horizen.receiveTitle')}

- Connect your wallet to scan for incoming stealth transfers on Horizen. + {t('horizen.receiveConnectPrompt')}

); @@ -305,13 +308,13 @@ export function HorizenReceive() {
- Horizen Testnet / ETH + {t('horizen.network')}

- Receive + {t('horizen.receiveTitle')}

- Derive your stealth keys, register on-chain, then scan for payments. + {t('horizen.receiveDescription')}

@@ -322,7 +325,7 @@ export function HorizenReceive() { disabled={isDerivingKeys} className="h-12 w-full bg-primary font-heading text-[13px] font-semibold uppercase tracking-widest text-surface transition-colors hover:brightness-110 disabled:opacity-30" > - {isDerivingKeys ? 'Sign in wallet...' : 'Derive Keys'} + {isDerivingKeys ? t('common.signingInWallet') : t('common.deriveKeys')} {error &&

{error}

}
@@ -333,7 +336,7 @@ export function HorizenReceive() {
- Your Stealth Meta-Address + {t('common.yourStealthMetaAddress')}
@@ -344,13 +347,13 @@ export function HorizenReceive() {
- On-Chain Registration + {t('common.onChainRegistration')} {registered ? (
- Meta-address registered on-chain + {t('common.metaAddressRegistered')} {regHash && ( <> {' — '} @@ -369,7 +372,7 @@ export function HorizenReceive() { ) : (

- Register your meta-address so senders can look you up by wallet address. + {t('common.registerMetaAddressHint')}

)} @@ -392,11 +395,11 @@ export function HorizenReceive() { disabled={isScanning} className="h-12 bg-primary px-6 font-heading text-[13px] font-semibold uppercase tracking-widest text-surface transition-colors hover:brightness-110 disabled:opacity-30" > - {isScanning ? 'Scanning...' : 'Scan for Payments'} + {isScanning ? t('common.scanning') : t('common.scanForPayments')} {hasScanned && ( - {matched.length} transfer{matched.length !== 1 ? 's' : ''} found + {t('common.transfersFound', { count: matched.length })} )}
@@ -414,10 +417,10 @@ export function HorizenReceive() { {hasScanned && matched.length === 0 && (

- No transfers found + {t('common.noTransfersFound')}

- No stealth transfers matched your keys. + {t('common.noTransfersMatchedKeys')}

)} diff --git a/src/components/HorizenSend.tsx b/src/components/HorizenSend.tsx index b05e81a..8e72914 100644 --- a/src/components/HorizenSend.tsx +++ b/src/components/HorizenSend.tsx @@ -2,11 +2,13 @@ import { useState } from 'react'; import { useAccount, useBalance, useSendTransaction, useWaitForTransactionReceipt } from 'wagmi'; import { buildSendStealth, buildResolveName } from '@wraith-protocol/sdk/chains/evm'; import type { HexString, BuildSendStealthResult } from '@wraith-protocol/sdk/chains/evm'; +import { useTranslation } from 'react-i18next'; import { horizenTxUrl, horizenAddrUrl } from '@/lib/explorer'; import { horizenTestnet } from '@/config'; import { CopyButton } from '@/components/CopyButton'; export function HorizenSend() { + const { t } = useTranslation(); const { isConnected, address } = useAccount(); const { data: balanceData } = useBalance({ address }); @@ -42,7 +44,7 @@ export function HorizenSend() { }); const json = await response.json(); if (!json.result || json.result === '0x' || json.result.length <= 66) { - setError('Name not found'); + setError(t('common.nameNotFound')); return; } const metaBytes = ('0x' + json.result.slice(130).replace(/0+$/, '')) as HexString; @@ -68,7 +70,7 @@ export function HorizenSend() { value: result.transaction.value, }); } catch (err) { - setError(err instanceof Error ? err.message : 'Transaction failed'); + setError(err instanceof Error ? err.message : t('common.transactionFailed')); } }; @@ -100,13 +102,13 @@ export function HorizenSend() { return (
- Horizen Testnet / ETH + {t('horizen.network')}

- Send + {t('horizen.sendTitle')}

- Connect your wallet to send stealth payments on Horizen. + {t('horizen.sendConnectPrompt')}

); @@ -116,14 +118,13 @@ export function HorizenSend() {
- Horizen Testnet / ETH + {t('horizen.network')}

- Send + {t('horizen.sendTitle')}

- Send ETH privately using stealth addresses. The recipient gets funds at a fresh address - only they can control. + {t('horizen.sendDescription')}

@@ -131,21 +132,21 @@ export function HorizenSend() {
setRecipient(e.target.value)} - placeholder="st:eth:0x... or name.wraith" + placeholder={t('horizen.recipientPlaceholder')} className="h-12 w-full border border-outline-variant bg-surface px-4 pr-20 font-mono text-sm text-primary placeholder:text-outline focus:border-primary" />
{isWraithName && ( @@ -157,7 +158,7 @@ export function HorizenSend() {
- Max + {t('common.max')} ETH
{balanceData && ( - Balance: {parseFloat(balanceData.formatted).toFixed(6)} ETH + {t('common.balance')}: {parseFloat(balanceData.formatted).toFixed(6)} ETH )}
@@ -187,21 +188,27 @@ export function HorizenSend() {
- Network fee + {t('common.networkFee')} + + + {t('common.paidBySender')} - Paid by sender
- Announcer contract + {t('common.announcerContract')} + + + {t('horizen.announcerContractName')} - WraithSender
- Expected confirmation + {t('common.expectedConfirmation')} + + + {t('common.seconds_approx')} - ~5 seconds
@@ -212,7 +219,7 @@ export function HorizenSend() { disabled={!recipient || !amount || isPending} className="h-12 w-full bg-primary font-heading text-[13px] font-semibold uppercase tracking-widest text-surface transition-colors hover:brightness-110 disabled:opacity-30" > - {isPending ? 'Confirm in wallet...' : 'Send Privately'} + {isPending ? t('common.confirmInWallet') : t('common.sendPrivately')}
)} @@ -226,14 +233,18 @@ export function HorizenSend() { )} - {isConfirming ? 'Confirming...' : isSuccess ? 'Transfer Complete' : 'Pending'} + {isConfirming + ? t('common.confirming') + : isSuccess + ? t('common.transferComplete') + : t('common.pending')}
- Stealth Address + {t('common.stealthAddress')}
- Transaction Hash + {t('common.transactionHash')} diff --git a/src/components/LocaleSwitcher.tsx b/src/components/LocaleSwitcher.tsx new file mode 100644 index 0000000..1230af0 --- /dev/null +++ b/src/components/LocaleSwitcher.tsx @@ -0,0 +1,42 @@ +import { useTranslation } from 'react-i18next'; + +const LOCALES: { code: string; label: string }[] = [ + { code: 'en', label: 'EN' }, + { code: 'es', label: 'ES' }, +]; + +export function LocaleSwitcher() { + const { i18n, t } = useTranslation(); + const current = i18n.resolvedLanguage ?? i18n.language; + + const handleChange = (e: React.ChangeEvent) => { + const lang = e.target.value; + i18n.changeLanguage(lang); + // Persist preference — LanguageDetector writes to localStorage automatically, + // but we also set it explicitly so it survives cache clears. + localStorage.setItem('wraith-locale', lang); + }; + + return ( +
+ +
+ + + +
+
+ ); +} diff --git a/src/components/SolanaReceive.tsx b/src/components/SolanaReceive.tsx index 8856fa2..9c9e6c8 100644 --- a/src/components/SolanaReceive.tsx +++ b/src/components/SolanaReceive.tsx @@ -10,6 +10,7 @@ import { STEALTH_SIGNING_MESSAGE, } from '@wraith-protocol/sdk/chains/solana'; import type { MatchedAnnouncement } from '@wraith-protocol/sdk/chains/solana'; +import { useTranslation } from 'react-i18next'; import { useStealthKeys } from '@/context/StealthKeysContext'; import { CopyButton } from '@/components/CopyButton'; import { solanaTxUrl, solanaAddrUrl } from '@/lib/explorer'; @@ -22,6 +23,7 @@ function SolanaStealthRow({ match: MatchedAnnouncement; onWithdrawn: () => void; }) { + const { t } = useTranslation(); const [balance, setBalance] = useState(null); const [loadingBal, setLoadingBal] = useState(true); const [dest, setDest] = useState(''); @@ -94,7 +96,7 @@ function SolanaStealthRow({ setWithdrawHash(txId); onWithdrawn(); } catch (err) { - setError(err instanceof Error ? err.message : 'Withdraw failed'); + setError(err instanceof Error ? err.message : t('common.transactionFailed')); } finally { setWithdrawing(false); } @@ -105,7 +107,7 @@ function SolanaStealthRow({
@@ -136,14 +138,14 @@ function SolanaStealthRow({ {!withdrawHash && balance && parseFloat(balance) > 0 && (
setDest(e.target.value)} - placeholder="Destination address (base58)" + placeholder={t('solana.destinationPlaceholder')} className="h-10 flex-1 border border-outline-variant bg-surface px-3 font-mono text-xs text-primary placeholder:text-outline focus:border-primary" />
@@ -163,7 +165,7 @@ function SolanaStealthRow({
- Withdrawn —{' '} + {t('common.withdrawn')} —{' '} setShowKey(true)} className="font-mono text-[10px] uppercase tracking-widest text-outline transition-colors hover:text-primary" > - Reveal secret key + {t('common.revealSecretKey')} ) : (
- Stealth Key + {t('common.stealthKey')}
@@ -201,6 +203,7 @@ function SolanaStealthRow({ } export function SolanaReceive() { + const { t } = useTranslation(); const { connected, signMessage } = useWallet(); const { solanaKeys, solanaMetaAddress, setSolanaKeys, setSolanaMetaAddress } = useStealthKeys(); @@ -212,7 +215,7 @@ export function SolanaReceive() { const deriveKeys = useCallback(async () => { if (!signMessage) { - setError('Wallet does not support message signing'); + setError(t('solana.walletSigningNotSupported')); return; } setIsDerivingKeys(true); @@ -225,11 +228,11 @@ export function SolanaReceive() { const meta = encodeStealthMetaAddress(derived.spendingPubKey, derived.viewingPubKey); setSolanaMetaAddress(meta); } catch (err) { - setError(err instanceof Error ? err.message : 'Key derivation failed'); + setError(err instanceof Error ? err.message : t('common.keyDerivationFailed')); } finally { setIsDerivingKeys(false); } - }, [signMessage, setSolanaKeys, setSolanaMetaAddress]); + }, [signMessage, setSolanaKeys, setSolanaMetaAddress, t]); const scanPayments = useCallback(async () => { if (!solanaKeys) return; @@ -246,23 +249,23 @@ export function SolanaReceive() { setMatched(results); setHasScanned(true); } catch (err) { - setError(err instanceof Error ? err.message : 'Scan failed'); + setError(err instanceof Error ? err.message : t('common.scanFailed')); } finally { setIsScanning(false); } - }, [solanaKeys]); + }, [solanaKeys, t]); if (!connected) { return (
- Solana Devnet / SOL + {t('solana.network')}

- Receive + {t('solana.receiveTitle')}

- Connect your Solana wallet to scan for stealth payments. + {t('solana.receiveConnectPrompt')}

); @@ -272,13 +275,13 @@ export function SolanaReceive() {
- Solana Devnet / SOL + {t('solana.network')}

- Receive + {t('solana.receiveTitle')}

- Derive your stealth keys, then scan for payments on Solana Devnet. + {t('solana.receiveDescription')}

@@ -289,7 +292,7 @@ export function SolanaReceive() { disabled={isDerivingKeys} className="h-12 w-full bg-primary font-heading text-[13px] font-semibold uppercase tracking-widest text-surface transition-colors hover:brightness-110 disabled:opacity-30" > - {isDerivingKeys ? 'Sign in wallet...' : 'Derive Keys'} + {isDerivingKeys ? t('common.signingInWallet') : t('common.deriveKeys')} {error &&

{error}

}
@@ -300,7 +303,7 @@ export function SolanaReceive() {
- Your Stealth Meta-Address + {t('common.yourStealthMetaAddress')}
@@ -315,11 +318,11 @@ export function SolanaReceive() { disabled={isScanning} className="h-12 bg-primary px-6 font-heading text-[13px] font-semibold uppercase tracking-widest text-surface transition-colors hover:brightness-110 disabled:opacity-30" > - {isScanning ? 'Scanning...' : 'Scan for Payments'} + {isScanning ? t('common.scanning') : t('common.scanForPayments')} {hasScanned && ( - {matched.length} transfer{matched.length !== 1 ? 's' : ''} found + {t('common.transfersFound', { count: matched.length })} )}
@@ -337,10 +340,10 @@ export function SolanaReceive() { {hasScanned && matched.length === 0 && (

- No transfers found + {t('common.noTransfersFound')}

- No stealth transfers matched your keys. + {t('common.noTransfersMatchedKeys')}

)} diff --git a/src/components/SolanaSend.tsx b/src/components/SolanaSend.tsx index 2fea1bd..5679468 100644 --- a/src/components/SolanaSend.tsx +++ b/src/components/SolanaSend.tsx @@ -8,11 +8,13 @@ import { } from '@solana/web3.js'; import { useWallet } from '@solana/wallet-adapter-react'; import { buildSendSol, bytesToHex } from '@wraith-protocol/sdk/chains/solana'; +import { useTranslation } from 'react-i18next'; import { solanaTxUrl, solanaAddrUrl } from '@/lib/explorer'; import { SOLANA_NETWORK } from '@/config'; import { CopyButton } from '@/components/CopyButton'; export function SolanaSend() { + const { t } = useTranslation(); const { publicKey, connected, sendTransaction } = useWallet(); const [recipient, setRecipient] = useState(''); const [amount, setAmount] = useState(''); @@ -28,7 +30,7 @@ export function SolanaSend() { const handleSend = useCallback(async () => { if (!connected || !publicKey) { - setError('Wallet not connected'); + setError(t('common.walletNotConnected')); return; } @@ -37,7 +39,7 @@ export function SolanaSend() { try { if (!recipient.startsWith('st:sol:')) { - setError('Enter a valid Solana meta-address (st:sol:...)'); + setError(t('solana.validMetaAddressError')); setIsPending(false); return; } @@ -74,11 +76,11 @@ export function SolanaSend() { await connection.confirmTransaction(signature, 'confirmed'); setIsSuccess(true); } catch (err) { - setError(err instanceof Error ? err.message : 'Transaction failed'); + setError(err instanceof Error ? err.message : t('common.transactionFailed')); } finally { setIsPending(false); } - }, [connected, publicKey, sendTransaction, recipient, amount]); + }, [connected, publicKey, sendTransaction, recipient, amount, t]); const reset = () => { setRecipient(''); @@ -102,13 +104,13 @@ export function SolanaSend() { return (
- Solana Devnet / SOL + {t('solana.network')}

- Send + {t('solana.sendTitle')}

- Connect your Solana wallet to send stealth payments. + {t('solana.sendConnectPrompt')}

); @@ -118,14 +120,13 @@ export function SolanaSend() {
- Solana Devnet / SOL + {t('solana.network')}

- Send + {t('solana.sendTitle')}

- Send SOL privately using stealth addresses. The recipient gets funds at a fresh address - only they can control. + {t('solana.sendDescription')}

@@ -133,28 +134,28 @@ export function SolanaSend() {
setRecipient(e.target.value)} - placeholder="st:sol:..." + placeholder={t('solana.recipientPlaceholder')} className="h-12 w-full border border-outline-variant bg-surface px-4 pr-20 font-mono text-sm text-primary placeholder:text-outline focus:border-primary" />
- Network fee + {t('common.networkFee')} + + + {t('solana.networkFeeAmount')} - ~5000 lamports
@@ -186,7 +189,7 @@ export function SolanaSend() { disabled={!recipient || !amount || isPending} className="h-12 w-full bg-primary font-heading text-[13px] font-semibold uppercase tracking-widest text-surface transition-colors hover:brightness-110 disabled:opacity-30" > - {isPending ? 'Confirm in wallet...' : 'Send Privately'} + {isPending ? t('common.confirmInWallet') : t('common.sendPrivately')}
)} @@ -200,14 +203,14 @@ export function SolanaSend() { )} - {isSuccess ? 'Transfer Complete' : 'Pending'} + {isSuccess ? t('common.transferComplete') : t('common.pending')}
- Stealth Address + {t('common.stealthAddress')}
- Ephemeral Public Key + {t('common.ephemeralPublicKey')}

{bytesToHex(stealthResult.ephemeralPubKey)} @@ -234,7 +237,7 @@ export function SolanaSend() { {txHash && (

- Transaction Hash + {t('common.transactionHash')} diff --git a/src/components/StellarReceive.tsx b/src/components/StellarReceive.tsx index d279a52..1fbb8d3 100644 --- a/src/components/StellarReceive.tsx +++ b/src/components/StellarReceive.tsx @@ -19,6 +19,7 @@ import { SCHEME_ID, } from '@wraith-protocol/sdk/chains/stellar'; import type { Announcement, MatchedAnnouncement } from '@wraith-protocol/sdk/chains/stellar'; +import { useTranslation } from 'react-i18next'; import { useStealthKeys } from '@/context/StealthKeysContext'; import { useStellarWallet } from '@/context/StellarWalletContext'; import { CopyButton } from '@/components/CopyButton'; @@ -144,6 +145,7 @@ function StellarStealthRow({ match: MatchedAnnouncement; onWithdrawn: () => void; }) { + const { t } = useTranslation(); const [balance, setBalance] = useState(null); const [loadingBal, setLoadingBal] = useState(true); const [dest, setDest] = useState(''); @@ -222,14 +224,16 @@ function StellarStealthRow({ const submitData = await submitRes.json(); if (!submitRes.ok) { throw new Error( - submitData.extras?.result_codes?.transaction || submitData.title || 'Transaction failed', + submitData.extras?.result_codes?.transaction || + submitData.title || + t('common.transactionFailed'), ); } setWithdrawHash(submitData.hash); onWithdrawn(); } catch (err) { - setError(err instanceof Error ? err.message : 'Withdraw failed'); + setError(err instanceof Error ? err.message : t('common.transactionFailed')); } finally { setWithdrawing(false); } @@ -240,7 +244,7 @@ function StellarStealthRow({
@@ -271,7 +275,7 @@ function StellarStealthRow({ {!withdrawHash && balance && parseFloat(balance) > 0 && (
- {withdrawing ? '...' : 'Withdraw'} + {withdrawing ? '...' : t('common.withdraw')}
@@ -298,7 +302,7 @@ function StellarStealthRow({
- Withdrawn —{' '} + {t('common.withdrawn')} —{' '} setShowKey(true)} className="font-mono text-[10px] uppercase tracking-widest text-outline transition-colors hover:text-primary" > - Reveal secret key + {t('common.revealSecretKey')} ) : (
- Stealth Key + {t('common.stealthKey')}
@@ -336,6 +340,7 @@ function StellarStealthRow({ } export function StellarReceive() { + const { t } = useTranslation(); const { address, isConnected, signMessage, signTransaction } = useStellarWallet(); const { stellarKeys, stellarMetaAddress, setStellarKeys, setStellarMetaAddress } = useStealthKeys(); @@ -400,11 +405,11 @@ export function StellarReceive() { const meta = encodeStealthMetaAddress(derived.spendingPubKey, derived.viewingPubKey); setStellarMetaAddress(meta); } catch (err) { - setError(err instanceof Error ? err.message : 'Key derivation failed'); + setError(err instanceof Error ? err.message : t('common.keyDerivationFailed')); } finally { setIsDerivingKeys(false); } - }, [signMessage, setStellarKeys, setStellarMetaAddress]); + }, [signMessage, setStellarKeys, setStellarMetaAddress, t]); const registerOnChain = useCallback(async () => { if (!stellarKeys || !address) return; @@ -502,23 +507,23 @@ export function StellarReceive() { setMatched(results); setHasScanned(true); } catch (err) { - setError(err instanceof Error ? err.message : 'Scan failed'); + setError(err instanceof Error ? err.message : t('common.scanFailed')); } finally { setIsScanning(false); } - }, [stellarKeys]); + }, [stellarKeys, t]); if (!isConnected) { return (
- Stellar Testnet / XLM + {t('stellar.network')}

- Receive + {t('stellar.receiveTitle')}

- Connect your Freighter wallet to scan for incoming stealth transfers on Stellar. + {t('stellar.receiveConnectPrompt')}

); @@ -528,13 +533,13 @@ export function StellarReceive() {
- Stellar Testnet / XLM + {t('stellar.network')}

- Receive + {t('stellar.receiveTitle')}

- Derive your stealth keys, register on-chain, then scan for payments. + {t('stellar.receiveDescription')}

@@ -545,7 +550,7 @@ export function StellarReceive() { disabled={isDerivingKeys} className="h-12 w-full bg-primary font-heading text-[13px] font-semibold uppercase tracking-widest text-surface transition-colors hover:brightness-110 disabled:opacity-30" > - {isDerivingKeys ? 'Sign in wallet...' : 'Derive Keys'} + {isDerivingKeys ? t('common.signingInWallet') : t('common.deriveKeys')} {error &&

{error}

}
@@ -556,7 +561,7 @@ export function StellarReceive() {
- Your Stealth Meta-Address + {t('common.yourStealthMetaAddress')}
@@ -567,13 +572,13 @@ export function StellarReceive() {
- On-Chain Registration + {t('common.onChainRegistration')} {registered ? (
- Meta-address registered on-chain + {t('common.metaAddressRegistered')} {regHash && ( <> {' — '} @@ -592,14 +597,14 @@ export function StellarReceive() { ) : (

- Register your meta-address so senders can look you up by wallet address. + {t('common.registerMetaAddressHint')}

)} @@ -611,11 +616,11 @@ export function StellarReceive() { disabled={isScanning} className="h-12 bg-primary px-6 font-heading text-[13px] font-semibold uppercase tracking-widest text-surface transition-colors hover:brightness-110 disabled:opacity-30" > - {isScanning ? 'Scanning...' : 'Scan for Payments'} + {isScanning ? t('common.scanning') : t('common.scanForPayments')} {hasScanned && ( - {matched.length} transfer{matched.length !== 1 ? 's' : ''} found + {t('common.transfersFound', { count: matched.length })} )}
@@ -633,10 +638,10 @@ export function StellarReceive() { {hasScanned && matched.length === 0 && (

- No transfers found + {t('common.noTransfersFound')}

- No stealth transfers matched your keys. + {t('common.noTransfersMatchedKeys')}

)} diff --git a/src/components/StellarSend.tsx b/src/components/StellarSend.tsx index 6626d1f..5bda5be 100644 --- a/src/components/StellarSend.tsx +++ b/src/components/StellarSend.tsx @@ -14,6 +14,7 @@ import { decodeStealthMetaAddress, SCHEME_ID, } from '@wraith-protocol/sdk/chains/stellar'; +import { useTranslation } from 'react-i18next'; import { useStellarWallet } from '@/context/StellarWalletContext'; import { stellarTxUrl, stellarAddrUrl } from '@/lib/explorer'; import { STELLAR_NETWORK } from '@/config'; @@ -22,6 +23,7 @@ import { CopyButton } from '@/components/CopyButton'; const ANNOUNCER_CONTRACT = 'CCJLJ2QRBJAAKIG6ELNQVXLLWMKKWVN5O2FKWUETHZGMPAD4MHK7WVWL'; export function StellarSend() { + const { t } = useTranslation(); const { address, isConnected, signTransaction } = useStellarWallet(); const [recipient, setRecipient] = useState(''); const [amount, setAmount] = useState(''); @@ -37,7 +39,7 @@ export function StellarSend() { const handleSend = useCallback(async () => { if (!address) { - setError('Wallet not connected'); + setError(t('common.walletNotConnected')); return; } @@ -47,7 +49,7 @@ export function StellarSend() { try { const metaAddress = recipient; if (!metaAddress.startsWith('st:xlm:')) { - setError('Enter a valid Stellar meta-address (st:xlm:...)'); + setError(t('stellar.validMetaAddressError')); setIsPending(false); return; } @@ -103,7 +105,9 @@ export function StellarSend() { const submitData = await submitRes.json(); if (!submitRes.ok) { throw new Error( - submitData.extras?.result_codes?.transaction || submitData.title || 'Transaction failed', + submitData.extras?.result_codes?.transaction || + submitData.title || + t('common.transactionFailed'), ); } @@ -152,11 +156,11 @@ export function StellarSend() { setIsSuccess(true); } catch (err) { - setError(err instanceof Error ? err.message : 'Transaction failed'); + setError(err instanceof Error ? err.message : t('common.transactionFailed')); } finally { setIsPending(false); } - }, [address, recipient, amount, signTransaction]); + }, [address, recipient, amount, signTransaction, t]); const reset = () => { setRecipient(''); @@ -180,13 +184,13 @@ export function StellarSend() { return (
- Stellar Testnet / XLM + {t('stellar.network')}

- Send + {t('stellar.sendTitle')}

- Connect your Freighter wallet to send stealth payments on Stellar. + {t('stellar.sendConnectPrompt')}

); @@ -196,14 +200,13 @@ export function StellarSend() {
- Stellar Testnet / XLM + {t('stellar.network')}

- Send + {t('stellar.sendTitle')}

- Send XLM privately using stealth addresses. The recipient gets funds at a fresh address - only they can control. + {t('stellar.sendDescription')}

@@ -211,28 +214,28 @@ export function StellarSend() {
setRecipient(e.target.value)} - placeholder="st:xlm:..." + placeholder={t('stellar.recipientPlaceholder')} className="h-12 w-full border border-outline-variant bg-surface px-4 pr-20 font-mono text-sm text-primary placeholder:text-outline focus:border-primary" />
- Network fee + {t('common.networkFee')} + + + {t('stellar.networkFeeAmount')} - 100 stroops
- Announcer contract + {t('common.announcerContract')} + + + {t('stellar.announcerContractName')} - Soroban
@@ -270,7 +277,7 @@ export function StellarSend() { disabled={!recipient || !amount || isPending} className="h-12 w-full bg-primary font-heading text-[13px] font-semibold uppercase tracking-widest text-surface transition-colors hover:brightness-110 disabled:opacity-30" > - {isPending ? 'Confirm in wallet...' : 'Send Privately'} + {isPending ? t('common.confirmInWallet') : t('common.sendPrivately')}
)} @@ -284,14 +291,14 @@ export function StellarSend() { )} - {isSuccess ? 'Transfer Complete' : 'Pending'} + {isSuccess ? t('common.transferComplete') : t('common.pending')}
- Stealth Address + {t('common.stealthAddress')}
- Transaction Hash + {t('common.transactionHash')} diff --git a/src/components/WalletConnect.tsx b/src/components/WalletConnect.tsx index 807db1c..c771de4 100644 --- a/src/components/WalletConnect.tsx +++ b/src/components/WalletConnect.tsx @@ -3,6 +3,7 @@ import { ConnectButton } from '@rainbow-me/rainbowkit'; import { useWallet } from '@solana/wallet-adapter-react'; import { WalletMultiButton } from '@solana/wallet-adapter-react-ui'; import { ccc } from '@ckb-ccc/connector-react'; +import { useTranslation } from 'react-i18next'; import { useChain } from '@/context/ChainContext'; import { useStellarWallet } from '@/context/StellarWalletContext'; @@ -12,6 +13,7 @@ const btnConnected = 'bg-transparent border border-outline-variant px-3 py-1.5 font-mono text-[10px] text-primary transition-colors hover:bg-surface-bright sm:px-4 sm:py-2 sm:text-xs h-8 sm:h-9'; function HorizenButton() { + const { t } = useTranslation(); return ( {({ account, chain, openConnectModal, openAccountModal, mounted }) => { @@ -25,7 +27,7 @@ function HorizenButton() { > {!connected ? ( ) : ( ); } @@ -73,6 +76,7 @@ function SolanaButton() { } function CkbButton() { + const { t } = useTranslation(); const { open, wallet } = ccc.useCcc(); const signer = ccc.useSigner(); const [address, setAddress] = useState(''); @@ -95,7 +99,7 @@ function CkbButton() { return ( ); } diff --git a/src/i18n/en.json b/src/i18n/en.json new file mode 100644 index 0000000..8d22e4c --- /dev/null +++ b/src/i18n/en.json @@ -0,0 +1,139 @@ +{ + "nav": { + "send": "Send", + "receive": "Receive" + }, + "header": { + "menuLabel": "Menu" + }, + "walletConnect": { + "connectWallet": "Connect Wallet", + "connectFreighter": "Connect Freighter" + }, + "copyButton": { + "copy": "Copy", + "copied": "Copied" + }, + "localeSwitcher": { + "label": "Language" + }, + "common": { + "send": "Send", + "receive": "Receive", + "amount": "Amount", + "recipientMetaAddress": "Recipient Meta-Address", + "networkFee": "Network fee", + "announcerContract": "Announcer contract", + "stealthAddress": "Stealth Address", + "transactionHash": "Transaction Hash", + "ephemeralPublicKey": "Ephemeral Public Key", + "stealthKey": "Stealth Key", + "newTransfer": "New Transfer", + "transferComplete": "Transfer Complete", + "pending": "Pending", + "confirming": "Confirming...", + "confirmInWallet": "Confirm in wallet...", + "sendPrivately": "Send Privately", + "paste": "Paste", + "max": "Max", + "paidBySender": "Paid by sender", + "nameNotFound": "Name not found", + "walletNotConnected": "Wallet not connected", + "transactionFailed": "Transaction failed", + "withdrawn": "Withdrawn", + "withdrawTo": "Withdraw to", + "withdraw": "Withdraw", + "revealPrivateKey": "Reveal private key", + "revealSecretKey": "Reveal secret key", + "empty": "Empty", + "yourStealthMetaAddress": "Your Stealth Meta-Address", + "onChainRegistration": "On-Chain Registration", + "metaAddressRegistered": "Meta-address registered on-chain", + "registerMetaAddressHint": "Register your meta-address so senders can look you up by wallet address.", + "registerOnChain": "Register On-Chain", + "registering": "Registering...", + "scanForPayments": "Scan for Payments", + "scanning": "Scanning...", + "transfersFound_one": "{{count}} transfer found", + "transfersFound_other": "{{count}} transfers found", + "noTransfersFound": "No transfers found", + "noTransfersMatchedKeys": "No stealth transfers matched your keys.", + "deriveKeys": "Derive Keys", + "deriveKeysTitle": "Derive Stealth Keys", + "signingInWallet": "Sign in wallet...", + "keyDerivationFailed": "Key derivation failed", + "scanFailed": "Scan failed", + "expectedConfirmation": "Expected confirmation", + "seconds_approx": "~5 seconds", + "balance": "Balance" + }, + "horizen": { + "network": "Horizen Testnet / ETH", + "sendTitle": "Send", + "receiveTitle": "Receive", + "sendConnectPrompt": "Connect your wallet to send stealth payments on Horizen.", + "receiveConnectPrompt": "Connect your wallet to scan for incoming stealth transfers on Horizen.", + "sendDescription": "Send ETH privately using stealth addresses. The recipient gets funds at a fresh address only they can control.", + "receiveDescription": "Derive your stealth keys, register on-chain, then scan for payments.", + "announcerContractName": "WraithSender", + "recipientPlaceholder": "st:eth:0x... or name.wraith" + }, + "stellar": { + "network": "Stellar Testnet / XLM", + "sendTitle": "Send", + "receiveTitle": "Receive", + "sendConnectPrompt": "Connect your Freighter wallet to send stealth payments on Stellar.", + "receiveConnectPrompt": "Connect your Freighter wallet to scan for incoming stealth transfers on Stellar.", + "sendDescription": "Send XLM privately using stealth addresses. The recipient gets funds at a fresh address only they can control.", + "receiveDescription": "Derive your stealth keys, register on-chain, then scan for payments.", + "announcerContractName": "Soroban", + "networkFeeAmount": "100 stroops", + "recipientPlaceholder": "st:xlm:...", + "validMetaAddressError": "Enter a valid Stellar meta-address (st:xlm:...)" + }, + "solana": { + "network": "Solana Devnet / SOL", + "sendTitle": "Send", + "receiveTitle": "Receive", + "sendConnectPrompt": "Connect your Solana wallet to send stealth payments.", + "receiveConnectPrompt": "Connect your Solana wallet to scan for stealth payments.", + "sendDescription": "Send SOL privately using stealth addresses. The recipient gets funds at a fresh address only they can control.", + "receiveDescription": "Derive your stealth keys, then scan for payments on Solana Devnet.", + "networkFeeAmount": "~5000 lamports", + "recipientPlaceholder": "st:sol:...", + "validMetaAddressError": "Enter a valid Solana meta-address (st:sol:...)", + "walletSigningNotSupported": "Wallet does not support message signing", + "destinationPlaceholder": "Destination address (base58)", + "cellsFound_one": "{{count}} cell found", + "cellsFound_other": "{{count}} cells found" + }, + "ckb": { + "network": "CKB Testnet / CKB", + "sendTitle": "Send", + "receiveTitle": "Receive", + "sendConnectPrompt": "Connect your CKB wallet to send stealth payments.", + "receiveConnectPrompt": "Connect your CKB wallet to scan for stealth payments.", + "sendDescription": "Send CKB privately using stealth addresses. The recipient gets funds at a fresh Cell only they can unlock.", + "receiveDescription": "Derive your stealth keys, then scan for stealth Cells on CKB Testnet.", + "amountLabel": "Amount (min 95)", + "networkFeeAmount": "~1000 shannons", + "minCellCapacity": "Min cell capacity", + "minCellCapacityValue": "~94.5 CKB", + "validMetaAddressError": "Enter a valid CKB meta-address (st:ckb:...)", + "minAmountError": "Minimum amount is 95 CKB. Stealth cells require at least ~94.5 CKB for cell capacity.", + "connectWalletFirst": "Connect your CKB wallet first", + "recipientPlaceholder": "st:ckb:...", + "stealthHash": "Stealth Hash", + "stealthPublicKey": "Stealth Public Key", + "cell": "Cell", + "withdraw": "Withdraw", + "withdrawInstruction": "Use the private key below to sign a CKB transaction consuming this Cell.", + "scanForCells": "Scan for Cells", + "scanning": "Scanning...", + "noCellsFound": "No cells found", + "noCellsMatchedKeys": "No stealth Cells matched your keys.", + "deriveStealthKeys": "Derive Stealth Keys", + "cellsFound_one": "{{count}} cell found", + "cellsFound_other": "{{count}} cells found" + } +} diff --git a/src/i18n/es.json b/src/i18n/es.json new file mode 100644 index 0000000..00aa9e7 --- /dev/null +++ b/src/i18n/es.json @@ -0,0 +1,139 @@ +{ + "nav": { + "send": "Enviar", + "receive": "Recibir" + }, + "header": { + "menuLabel": "Menú" + }, + "walletConnect": { + "connectWallet": "Conectar billetera", + "connectFreighter": "Conectar Freighter" + }, + "copyButton": { + "copy": "Copiar", + "copied": "Copiado" + }, + "localeSwitcher": { + "label": "Idioma" + }, + "common": { + "send": "Enviar", + "receive": "Recibir", + "amount": "Monto", + "recipientMetaAddress": "Meta-dirección del destinatario", + "networkFee": "Tarifa de red", + "announcerContract": "Contrato anunciador", + "stealthAddress": "Dirección sigilosa", + "transactionHash": "Hash de transacción", + "ephemeralPublicKey": "Clave pública efímera", + "stealthKey": "Clave sigilosa", + "newTransfer": "Nueva transferencia", + "transferComplete": "Transferencia completada", + "pending": "Pendiente", + "confirming": "Confirmando...", + "confirmInWallet": "Confirmar en la billetera...", + "sendPrivately": "Enviar de forma privada", + "paste": "Pegar", + "max": "Máx", + "paidBySender": "Pagado por el remitente", + "nameNotFound": "Nombre no encontrado", + "walletNotConnected": "Billetera no conectada", + "transactionFailed": "Transacción fallida", + "withdrawn": "Retirado", + "withdrawTo": "Retirar a", + "withdraw": "Retirar", + "revealPrivateKey": "Revelar clave privada", + "revealSecretKey": "Revelar clave secreta", + "empty": "Vacío", + "yourStealthMetaAddress": "Tu meta-dirección sigilosa", + "onChainRegistration": "Registro en cadena", + "metaAddressRegistered": "Meta-dirección registrada en cadena", + "registerMetaAddressHint": "Registra tu meta-dirección para que los remitentes puedan encontrarte por tu dirección de billetera.", + "registerOnChain": "Registrar en cadena", + "registering": "Registrando...", + "scanForPayments": "Buscar pagos", + "scanning": "Buscando...", + "transfersFound_one": "{{count}} transferencia encontrada", + "transfersFound_other": "{{count}} transferencias encontradas", + "noTransfersFound": "No se encontraron transferencias", + "noTransfersMatchedKeys": "Ninguna transferencia sigilosa coincidió con tus claves.", + "deriveKeys": "Derivar claves", + "deriveKeysTitle": "Derivar claves sigilosas", + "signingInWallet": "Firmando en la billetera...", + "keyDerivationFailed": "Error al derivar claves", + "scanFailed": "Error al escanear", + "expectedConfirmation": "Confirmación esperada", + "seconds_approx": "~5 segundos", + "balance": "Saldo" + }, + "horizen": { + "network": "Horizen Testnet / ETH", + "sendTitle": "Enviar", + "receiveTitle": "Recibir", + "sendConnectPrompt": "Conecta tu billetera para enviar pagos sigilosos en Horizen.", + "receiveConnectPrompt": "Conecta tu billetera para buscar transferencias sigilosas entrantes en Horizen.", + "sendDescription": "Envía ETH de forma privada usando direcciones sigilosas. El destinatario recibe fondos en una dirección nueva que solo él puede controlar.", + "receiveDescription": "Deriva tus claves sigilosas, regístrate en cadena y luego busca pagos.", + "announcerContractName": "WraithSender", + "recipientPlaceholder": "st:eth:0x... o nombre.wraith" + }, + "stellar": { + "network": "Stellar Testnet / XLM", + "sendTitle": "Enviar", + "receiveTitle": "Recibir", + "sendConnectPrompt": "Conecta tu billetera Freighter para enviar pagos sigilosos en Stellar.", + "receiveConnectPrompt": "Conecta tu billetera Freighter para buscar transferencias sigilosas entrantes en Stellar.", + "sendDescription": "Envía XLM de forma privada usando direcciones sigilosas. El destinatario recibe fondos en una dirección nueva que solo él puede controlar.", + "receiveDescription": "Deriva tus claves sigilosas, regístrate en cadena y luego busca pagos.", + "announcerContractName": "Soroban", + "networkFeeAmount": "100 stroops", + "recipientPlaceholder": "st:xlm:...", + "validMetaAddressError": "Ingresa una meta-dirección Stellar válida (st:xlm:...)" + }, + "solana": { + "network": "Solana Devnet / SOL", + "sendTitle": "Enviar", + "receiveTitle": "Recibir", + "sendConnectPrompt": "Conecta tu billetera Solana para enviar pagos sigilosos.", + "receiveConnectPrompt": "Conecta tu billetera Solana para buscar pagos sigilosos.", + "sendDescription": "Envía SOL de forma privada usando direcciones sigilosas. El destinatario recibe fondos en una dirección nueva que solo él puede controlar.", + "receiveDescription": "Deriva tus claves sigilosas y luego busca pagos en Solana Devnet.", + "networkFeeAmount": "~5000 lamports", + "recipientPlaceholder": "st:sol:...", + "validMetaAddressError": "Ingresa una meta-dirección Solana válida (st:sol:...)", + "walletSigningNotSupported": "La billetera no admite firma de mensajes", + "destinationPlaceholder": "Dirección destino (base58)", + "cellsFound_one": "{{count}} celda encontrada", + "cellsFound_other": "{{count}} celdas encontradas" + }, + "ckb": { + "network": "CKB Testnet / CKB", + "sendTitle": "Enviar", + "receiveTitle": "Recibir", + "sendConnectPrompt": "Conecta tu billetera CKB para enviar pagos sigilosos.", + "receiveConnectPrompt": "Conecta tu billetera CKB para buscar pagos sigilosos.", + "sendDescription": "Envía CKB de forma privada usando direcciones sigilosas. El destinatario recibe fondos en una nueva celda que solo él puede desbloquear.", + "receiveDescription": "Deriva tus claves sigilosas y luego busca celdas sigilosas en CKB Testnet.", + "amountLabel": "Monto (mín. 95)", + "networkFeeAmount": "~1000 shannons", + "minCellCapacity": "Capacidad mínima de celda", + "minCellCapacityValue": "~94.5 CKB", + "validMetaAddressError": "Ingresa una meta-dirección CKB válida (st:ckb:...)", + "minAmountError": "El monto mínimo es 95 CKB. Las celdas sigilosas requieren al menos ~94.5 CKB de capacidad.", + "connectWalletFirst": "Primero conecta tu billetera CKB", + "recipientPlaceholder": "st:ckb:...", + "stealthHash": "Hash sigiloso", + "stealthPublicKey": "Clave pública sigilosa", + "cell": "Celda", + "withdraw": "Retirar", + "withdrawInstruction": "Usa la clave privada a continuación para firmar una transacción CKB que consuma esta celda.", + "scanForCells": "Buscar celdas", + "scanning": "Buscando...", + "noCellsFound": "No se encontraron celdas", + "noCellsMatchedKeys": "Ninguna celda sigilosa coincidió con tus claves.", + "deriveStealthKeys": "Derivar claves sigilosas", + "cellsFound_one": "{{count}} celda encontrada", + "cellsFound_other": "{{count}} celdas encontradas" + } +} diff --git a/src/i18n/index.ts b/src/i18n/index.ts new file mode 100644 index 0000000..cafa831 --- /dev/null +++ b/src/i18n/index.ts @@ -0,0 +1,28 @@ +import i18n from 'i18next'; +import { initReactI18next } from 'react-i18next'; +import LanguageDetector from 'i18next-browser-languagedetector'; +import en from './en.json'; +import es from './es.json'; + +i18n + .use(LanguageDetector) + .use(initReactI18next) + .init({ + resources: { + en: { translation: en }, + es: { translation: es }, + }, + fallbackLng: 'en', + supportedLngs: ['en', 'es'], + interpolation: { + escapeValue: false, + }, + detection: { + // Check localStorage first, then navigator.language + order: ['localStorage', 'navigator'], + caches: ['localStorage'], + lookupLocalStorage: 'wraith-locale', + }, + }); + +export default i18n; diff --git a/src/main.tsx b/src/main.tsx index ee2c8c6..bb96434 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -1,6 +1,7 @@ import { Buffer } from 'buffer'; (window as unknown as Record).Buffer = Buffer; +import '@/i18n'; import { StrictMode, useState, useMemo, type CSSProperties } from 'react'; import { createRoot } from 'react-dom/client'; import { BrowserRouter } from 'react-router-dom';