diff --git a/package.json b/package.json index 57b9f698..cbf03bd9 100644 --- a/package.json +++ b/package.json @@ -24,8 +24,9 @@ "@tanstack/react-query": "^5.99.0", "@vercel/analytics": "^1.6.1", "@vercel/speed-insights": "^1.3.1", + "@wagmi/core": "0.0.0-canary-20260421205751", "abitype": "^1.2.3", - "accounts": "^0.6.5", + "accounts": "^0.7.1", "cva": "1.0.0-beta.4", "mermaid": "^11.14.0", "monaco-editor": "^0.55.1", @@ -41,9 +42,9 @@ "tailwindcss": "^4.2.2", "unplugin-auto-import": "^21.0.0", "unplugin-icons": "^23.0.1", - "viem": "2.48.0", + "viem": "^2.48.4", "vocs": "https://pkg.pr.new/wevm/vocs@2fb25c2", - "wagmi": "^3.6.1", + "wagmi": "0.0.0-canary-20260421205751", "waku": "1.0.0-alpha.4", "zod": "^4.3.6" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 089255c9..3fbeca99 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -39,12 +39,15 @@ importers: '@vercel/speed-insights': specifier: ^1.3.1 version: 1.3.1(react@19.2.5) + '@wagmi/core': + specifier: 0.0.0-canary-20260421205751 + version: 0.0.0-canary-20260421205751(@tanstack/query-core@5.99.0)(@types/react@19.2.14)(accounts@0.7.2)(react@19.2.5)(typescript@5.9.3)(use-sync-external-store@1.6.0(react@19.2.5))(viem@2.48.4(typescript@5.9.3)(zod@4.3.6)) abitype: specifier: ^1.2.3 version: 1.2.3(typescript@5.9.3)(zod@4.3.6) accounts: - specifier: ^0.6.5 - version: 0.6.7(@modelcontextprotocol/sdk@1.29.0(@cfworker/json-schema@4.1.1)(zod@4.3.6))(@types/react@19.2.14)(@wagmi/core@3.4.2(@tanstack/query-core@5.99.0)(@types/react@19.2.14)(ox@0.14.20(typescript@5.9.3)(zod@4.3.6))(react@19.2.5)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.5))(viem@2.48.0(typescript@5.9.3)(zod@4.3.6)))(express@5.2.1)(react@19.2.5)(typescript@5.9.3)(use-sync-external-store@1.6.0(react@19.2.5))(viem@2.48.0(typescript@5.9.3)(zod@4.3.6)) + specifier: ^0.7.1 + version: 0.7.2(@modelcontextprotocol/sdk@1.29.0(@cfworker/json-schema@4.1.1)(zod@4.3.6))(@types/react@19.2.14)(@wagmi/core@0.0.0-canary-20260421205751)(express@5.2.1)(react@19.2.5)(typescript@5.9.3)(use-sync-external-store@1.6.0(react@19.2.5))(viem@2.48.4(typescript@5.9.3)(zod@4.3.6))(wagmi@0.0.0-canary-20260421205751) cva: specifier: 1.0.0-beta.4 version: 1.0.0-beta.4(typescript@5.9.3) @@ -91,17 +94,17 @@ importers: specifier: ^23.0.1 version: 23.0.1(@svgr/core@8.1.0(typescript@5.9.3)) viem: - specifier: 2.48.0 - version: 2.48.0(typescript@5.9.3)(zod@4.3.6) + specifier: ^2.48.4 + version: 2.48.4(typescript@5.9.3)(zod@4.3.6) vocs: specifier: https://pkg.pr.new/wevm/vocs@2fb25c2 - version: https://pkg.pr.new/wevm/vocs@2fb25c2(@cfworker/json-schema@4.1.1)(@types/react@19.2.14)(mermaid@11.14.0)(react-dom@19.2.5(react@19.2.5))(react-server-dom-webpack@19.2.3(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(webpack@5.104.1))(react@19.2.5)(rollup@4.60.1)(typescript@5.9.3)(vite@7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(waku@1.0.0-alpha.4(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(react-dom@19.2.5(react@19.2.5))(react-server-dom-webpack@19.2.3(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(webpack@5.104.1))(react@19.2.5)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) + version: https://pkg.pr.new/wevm/vocs@2fb25c2(@cfworker/json-schema@4.1.1)(@types/react@19.2.14)(mermaid@11.14.0)(react-dom@19.2.5(react@19.2.5))(react-server-dom-webpack@19.2.3(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(webpack@5.104.1))(react@19.2.5)(rollup@4.60.1)(typescript@5.9.3)(vite@7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.2)(tsx@4.21.0)(yaml@2.8.3))(waku@1.0.0-alpha.4(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(react-dom@19.2.5(react@19.2.5))(react-server-dom-webpack@19.2.3(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(webpack@5.104.1))(react@19.2.5)(terser@5.46.2)(tsx@4.21.0)(yaml@2.8.3)) wagmi: - specifier: ^3.6.1 - version: 3.6.1(@tanstack/query-core@5.99.0)(@tanstack/react-query@5.99.0(react@19.2.5))(@types/react@19.2.14)(ox@0.14.20(typescript@5.9.3)(zod@4.3.6))(react@19.2.5)(typescript@5.9.3)(viem@2.48.0(typescript@5.9.3)(zod@4.3.6)) + specifier: 0.0.0-canary-20260421205751 + version: 0.0.0-canary-20260421205751(@tanstack/query-core@5.99.0)(@tanstack/react-query@5.99.0(react@19.2.5))(@types/react@19.2.14)(accounts@0.7.2)(react@19.2.5)(typescript@5.9.3)(viem@2.48.4(typescript@5.9.3)(zod@4.3.6)) waku: specifier: 1.0.0-alpha.4 - version: 1.0.0-alpha.4(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(react-dom@19.2.5(react@19.2.5))(react-server-dom-webpack@19.2.3(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(webpack@5.104.1))(react@19.2.5)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3) + version: 1.0.0-alpha.4(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(react-dom@19.2.5(react@19.2.5))(react-server-dom-webpack@19.2.3(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(webpack@5.104.1))(react@19.2.5)(terser@5.46.2)(tsx@4.21.0)(yaml@2.8.3) zod: specifier: ^4.3.6 version: 4.3.6 @@ -126,7 +129,7 @@ importers: version: 7.0.0-dev.20260122.3 '@vitejs/plugin-react': specifier: ^5.2.0 - version: 5.2.0(vite@7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) + version: 5.2.0(vite@7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.2)(tsx@4.21.0)(yaml@2.8.3)) anser: specifier: ^2.3.5 version: 2.3.5 @@ -144,10 +147,10 @@ importers: version: 1.6.0(react@19.2.5) vite: specifier: ^7.3.2 - version: 7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3) + version: 7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.2)(tsx@4.21.0)(yaml@2.8.3) vite-plugin-mkcert: specifier: ^1.17.12 - version: 1.17.12(vite@7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) + version: 1.17.12(vite@7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.2)(tsx@4.21.0)(yaml@2.8.3)) packages: @@ -1533,16 +1536,17 @@ packages: react-server-dom-webpack: optional: true - '@wagmi/connectors@8.0.1': - resolution: {integrity: sha512-Rga0EDdcdUBlKtlUUPdBPAIlaFIkO8q0xcNObN/Q/CloM1zaruSFht1q3IaJKrytIDkncQa9uhHU6/imzysvpQ==} + '@wagmi/connectors@0.0.0-canary-20260421205751': + resolution: {integrity: sha512-jxZAMcSExry1+7X/B9nUbkw22x5bB/4mcNGKamkUx5HoXqftpQnf1ikKX2MizgkDni2Mr4P+j/NOlK+5d/qZgQ==} peerDependencies: '@base-org/account': ^2.5.1 '@coinbase/wallet-sdk': ^4.3.6 '@metamask/connect-evm': ~0.9.0 '@safe-global/safe-apps-provider': ~0.18.6 '@safe-global/safe-apps-sdk': ^9.1.0 - '@wagmi/core': 3.4.2 + '@wagmi/core': 0.0.0-canary-20260421205751 '@walletconnect/ethereum-provider': ^2.21.1 + accounts: ~0.6.7 porto: ~0.2.35 typescript: '>=5.7.3' viem: 2.x @@ -1559,22 +1563,24 @@ packages: optional: true '@walletconnect/ethereum-provider': optional: true + accounts: + optional: true porto: optional: true typescript: optional: true - '@wagmi/core@3.4.2': - resolution: {integrity: sha512-01i0ILBe74G8eairY2AIKC4Atrd00xw7EckZ5luU1ARl/6789UH79wXHwJDkHyktXtjn6QoSoBRW2brtlS8SWg==} + '@wagmi/core@0.0.0-canary-20260421205751': + resolution: {integrity: sha512-ZKjCkCBY2TcbNFyhl0G/0QNIhPcBDwb1tiVEb3cq3Nq7ig0hHy3YOjL+bREJwUMfzEglqiNRQ/L+OhwCfGNb0Q==} peerDependencies: '@tanstack/query-core': '>=5.0.0' - ox: '>=0.11.1' + accounts: ~0.6.7 typescript: '>=5.7.3' viem: 2.x peerDependenciesMeta: '@tanstack/query-core': optional: true - ox: + accounts: optional: true typescript: optional: true @@ -1645,15 +1651,16 @@ packages: resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==} engines: {node: '>= 0.6'} - accounts@0.6.7: - resolution: {integrity: sha512-bXTyx3AFoe98dnlavPsxp7Uoho+QXNdOeHNdsvzC5pzQ2idgK50yUiBTKXtI7+E8kSvvfzGQR8ZdwfgJS5bJHg==} + accounts@0.7.2: + resolution: {integrity: sha512-oMsrbfGxMd1mjfLF0j4d9cUYR/N5vadHvh0kwAI9nKchBJjKJde6m/rF8wbeLM5FwYEUnrwrkkwtAP7J7Oxc/w==} peerDependencies: '@react-native-async-storage/async-storage': ^3.0.2 - '@wagmi/core': '>=2' + '@wagmi/core': '>=3.4.3' expo-secure-store: ^55.0.12 expo-web-browser: ^55.0.13 react: '>=18' viem: '>=2.43.3' + wagmi: '>=0.0.0' peerDependenciesMeta: '@react-native-async-storage/async-storage': optional: true @@ -1667,6 +1674,8 @@ packages: optional: true viem: optional: true + wagmi: + optional: true acorn-import-phases@1.0.4: resolution: {integrity: sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==} @@ -2946,8 +2955,8 @@ packages: moo@0.5.3: resolution: {integrity: sha512-m2fmM2dDm7GZQsY7KK2cme8agi+AAljILjQnof7p1ZMDe6dQ4bdnSMx0cPppudoeNv5hEFQirN6u+O4fDE0IWA==} - mppx@0.5.12: - resolution: {integrity: sha512-pr6epOYJd8Q6D+MRMc27G48IMh0naAGMMyY1cZYrxMXVwH8PPn1ZaqUwv31svcjOV+UpSrSAe/MP2hRWJ0KQ7A==} + mppx@0.5.11: + resolution: {integrity: sha512-jV3G7RKGp0ANk7UBcfAeIRgqKDtJUDOCdwtqQKQi6dft9hTOLo5+jfLG7NRIE/1lncbIhxsX+zXhfbi34lgcxA==} hasBin: true peerDependencies: '@modelcontextprotocol/sdk': '>=1.25.0' @@ -3138,24 +3147,16 @@ packages: outvariant@1.4.0: resolution: {integrity: sha512-AlWY719RF02ujitly7Kk/0QlV+pXGFDHrHf9O2OKqyqgBieaPOIeuSkL8sRK6j2WK+/ZAURq2kZsY0d8JapUiw==} - ox@0.14.10: - resolution: {integrity: sha512-PYsqEnSP7CrcxISS3uVBtw9yPy2gATAnWNptTI0pMnlrXLTiw0Xw/IIivJVHDFgGvKuRAtBSafhVjs+jis3CVA==} - peerDependencies: - typescript: '>=5.4.0' - peerDependenciesMeta: - typescript: - optional: true - - ox@0.14.17: - resolution: {integrity: sha512-jOzNb2Wlfzsr8z/GoCtd1bf6OSRuWuysvbhnHGD+7fV1WRbcBR6B0RYoe3xWnUedF7zp4l5APmS7CzAhUok/lA==} + ox@0.14.20: + resolution: {integrity: sha512-rby38C3nDn8eQkf29Zgw4hkCZJ64Qqi0zRPWL8ENUQ7JVuoITqrVtwWQgM/He19SCMUEc7hS/Sjw0jIOSLJhOw==} peerDependencies: typescript: '>=5.4.0' peerDependenciesMeta: typescript: optional: true - ox@0.14.20: - resolution: {integrity: sha512-rby38C3nDn8eQkf29Zgw4hkCZJ64Qqi0zRPWL8ENUQ7JVuoITqrVtwWQgM/He19SCMUEc7hS/Sjw0jIOSLJhOw==} + ox@0.14.7: + resolution: {integrity: sha512-zSQ/cfBdolj7U4++NAvH7sI+VG0T3pEohITCgcQj8KlawvTDY4vGVhDT64Atsm0d6adWfIYHDpu88iUBMMp+AQ==} peerDependencies: typescript: '>=5.4.0' peerDependenciesMeta: @@ -3607,6 +3608,10 @@ packages: resolution: {integrity: sha512-1MOpMXuhGzGL5TTCZFItxCc0AARf1EZFQkGqMm7ERKj8+Hgr5oLvJOVFcC+lRmR8hCe2S3jC4T5D7Vg/d7/fhA==} engines: {node: '>=6'} + tapable@2.3.3: + resolution: {integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==} + engines: {node: '>=6'} + tar@7.5.13: resolution: {integrity: sha512-tOG/7GyXpFevhXVh8jOPJrmtRpOTsYqUIkVdVooZYJS/z8WhfQUX8RJILmeuJNinGAMSu1veBr4asSHFt5/hng==} engines: {node: '>=18'} @@ -3627,8 +3632,8 @@ packages: uglify-js: optional: true - terser@5.46.1: - resolution: {integrity: sha512-vzCjQO/rgUuK9sf8VJZvjqiqiHFaZLnOiimmUuOKODxWL8mm/xua7viT7aqX7dgPY60otQjUotzFMmCB4VdmqQ==} + terser@5.46.2: + resolution: {integrity: sha512-uxfo9fPcSgLDYob/w1FuL0c99MWiJDnv+5qXSQc5+Ki5NjVNsYi66INnMFBjf6uFz6OnX12piJQPF4IpjJTNTw==} engines: {node: '>=10'} hasBin: true @@ -3836,8 +3841,8 @@ packages: vfile@6.0.3: resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} - viem@2.48.0: - resolution: {integrity: sha512-0uLzTAUNKPpY9Cf3OBCPdwClXx9CEHAkoVYnxMPdHt7cRI1DobMso+pHZvU7itD+hFwE4htmp9QfP+5lb+kn0g==} + viem@2.48.4: + resolution: {integrity: sha512-mReP/rgY2P+WeeRSG4sUvccCLKfyAW1C73Y3KkobAqgzYmVna9qyUMNE44xIUkDtfvRuC33r24UhF4baBYovsg==} peerDependencies: typescript: '>=5.0.4' peerDependenciesMeta: @@ -3950,8 +3955,8 @@ packages: w3c-keyname@2.2.8: resolution: {integrity: sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==} - wagmi@3.6.1: - resolution: {integrity: sha512-GhOm/1FIhsendD+VmBknX+zCxYZCcysbraj/A7L7Lszm8+HgTdHj7eF6DrknKVG12NTXYdmM4vni+jHHrdBuaQ==} + wagmi@0.0.0-canary-20260421205751: + resolution: {integrity: sha512-y2TJVluIRMgFSwGMv77WfiLe66ya0kbuxBmlJAIgptqqdzidSQXxB/x0NqDh0gxqvZR/0Sa0H2GpXbVM7+atMA==} peerDependencies: '@tanstack/react-query': '>=5.0.0' react: '>=18' @@ -3980,8 +3985,8 @@ packages: webauthx@0.1.1: resolution: {integrity: sha512-3jiskZl0jiTUoO8r3ySUYItdXNDBpfzxnxPx7XM0giF2dIY7S4KqHVbH04Qglz98nP8RaSV1/+3eDCx1s3WDiQ==} - webpack-sources@3.3.4: - resolution: {integrity: sha512-7tP1PdV4vF+lYPnkMR0jMY5/la2ub5Fc/8VQrrU+lXkiM6C4TjVfGw7iKfyhnTQOsD+6Q/iKw0eFciziRgD58Q==} + webpack-sources@3.4.0: + resolution: {integrity: sha512-gHwIe1cgBvvfLeu1Yz/dcFpmHfKDVxxyqI+kzqmuxZED81z2ChxpyqPaWcNqigPywhaEke7AjSGga+kxY55gjQ==} engines: {node: '>=10.13.0'} webpack-virtual-modules@0.6.2: @@ -5083,12 +5088,12 @@ snapshots: '@tailwindcss/oxide-win32-arm64-msvc': 4.2.2 '@tailwindcss/oxide-win32-x64-msvc': 4.2.2 - '@tailwindcss/vite@4.2.2(vite@7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))': + '@tailwindcss/vite@4.2.2(vite@7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.2)(tsx@4.21.0)(yaml@2.8.3))': dependencies: '@tailwindcss/node': 4.2.2 '@tailwindcss/oxide': 4.2.2 tailwindcss: 4.2.2 - vite: 7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3) + vite: 7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.2)(tsx@4.21.0)(yaml@2.8.3) '@takumi-rs/core-darwin-arm64@0.62.8': optional: true @@ -5390,7 +5395,7 @@ snapshots: optionalDependencies: react: 19.2.5 - '@vitejs/plugin-react@5.1.2(vite@7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))': + '@vitejs/plugin-react@5.1.2(vite@7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.2)(tsx@4.21.0)(yaml@2.8.3))': dependencies: '@babel/core': 7.29.0 '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.29.0) @@ -5398,11 +5403,11 @@ snapshots: '@rolldown/pluginutils': 1.0.0-beta.53 '@types/babel__core': 7.20.5 react-refresh: 0.18.0 - vite: 7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3) + vite: 7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.2)(tsx@4.21.0)(yaml@2.8.3) transitivePeerDependencies: - supports-color - '@vitejs/plugin-react@5.2.0(vite@7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))': + '@vitejs/plugin-react@5.2.0(vite@7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.2)(tsx@4.21.0)(yaml@2.8.3))': dependencies: '@babel/core': 7.29.0 '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.29.0) @@ -5410,11 +5415,11 @@ snapshots: '@rolldown/pluginutils': 1.0.0-rc.3 '@types/babel__core': 7.20.5 react-refresh: 0.18.0 - vite: 7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3) + vite: 7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.2)(tsx@4.21.0)(yaml@2.8.3) transitivePeerDependencies: - supports-color - '@vitejs/plugin-rsc@0.5.23(react-dom@19.2.5(react@19.2.5))(react-server-dom-webpack@19.2.3(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(webpack@5.104.1))(react@19.2.5)(vite@7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))': + '@vitejs/plugin-rsc@0.5.23(react-dom@19.2.5(react@19.2.5))(react-server-dom-webpack@19.2.3(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(webpack@5.104.1))(react@19.2.5)(vite@7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.2)(tsx@4.21.0)(yaml@2.8.3))': dependencies: '@rolldown/pluginutils': 1.0.0-rc.13 es-module-lexer: 2.0.0 @@ -5425,27 +5430,44 @@ snapshots: srvx: 0.11.15 strip-literal: 3.1.0 turbo-stream: 3.2.0 - vite: 7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3) - vitefu: 1.1.3(vite@7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) + vite: 7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.2)(tsx@4.21.0)(yaml@2.8.3) + vitefu: 1.1.3(vite@7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.2)(tsx@4.21.0)(yaml@2.8.3)) optionalDependencies: react-server-dom-webpack: 19.2.3(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(webpack@5.104.1) - '@wagmi/connectors@8.0.1(@wagmi/core@3.4.2(@tanstack/query-core@5.99.0)(@types/react@19.2.14)(ox@0.14.20(typescript@5.9.3)(zod@4.3.6))(react@19.2.5)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.5))(viem@2.48.0(typescript@5.9.3)(zod@4.3.6)))(typescript@5.9.3)(viem@2.48.0(typescript@5.9.3)(zod@4.3.6))': + '@wagmi/connectors@0.0.0-canary-20260421205751(@wagmi/core@0.0.0-canary-20260421205751)(accounts@0.7.2)(typescript@5.9.3)(viem@2.48.4(typescript@5.9.3)(zod@4.3.6))': + dependencies: + '@wagmi/core': 0.0.0-canary-20260421205751(@tanstack/query-core@5.99.0)(@types/react@19.2.14)(accounts@0.7.2)(react@19.2.5)(typescript@5.9.3)(use-sync-external-store@1.6.0(react@19.2.5))(viem@2.48.4(typescript@5.9.3)(zod@4.3.6)) + viem: 2.48.4(typescript@5.9.3)(zod@4.3.6) + optionalDependencies: + accounts: 0.7.2(@modelcontextprotocol/sdk@1.29.0(@cfworker/json-schema@4.1.1)(zod@4.3.6))(@types/react@19.2.14)(@wagmi/core@0.0.0-canary-20260421205751)(express@5.2.1)(react@19.2.5)(typescript@5.9.3)(use-sync-external-store@1.6.0(react@19.2.5))(viem@2.48.4(typescript@5.9.3)(zod@4.3.6))(wagmi@0.0.0-canary-20260421205751) + typescript: 5.9.3 + + '@wagmi/core@0.0.0-canary-20260421205751(@tanstack/query-core@5.99.0)(@types/react@19.2.14)(accounts@0.7.2)(react@19.2.5)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.5))(viem@2.48.4(typescript@5.9.3)(zod@4.3.6))': dependencies: - '@wagmi/core': 3.4.2(@tanstack/query-core@5.99.0)(@types/react@19.2.14)(ox@0.14.20(typescript@5.9.3)(zod@4.3.6))(react@19.2.5)(typescript@5.9.3)(use-sync-external-store@1.6.0(react@19.2.5))(viem@2.48.0(typescript@5.9.3)(zod@4.3.6)) - viem: 2.48.0(typescript@5.9.3)(zod@4.3.6) + eventemitter3: 5.0.1 + mipd: 0.0.7(typescript@5.9.3) + viem: 2.48.4(typescript@5.9.3)(zod@4.3.6) + zustand: 5.0.0(@types/react@19.2.14)(react@19.2.5)(use-sync-external-store@1.4.0(react@19.2.5)) optionalDependencies: + '@tanstack/query-core': 5.99.0 + accounts: 0.7.2(@modelcontextprotocol/sdk@1.29.0(@cfworker/json-schema@4.1.1)(zod@4.3.6))(@types/react@19.2.14)(@wagmi/core@0.0.0-canary-20260421205751)(express@5.2.1)(react@19.2.5)(typescript@5.9.3)(use-sync-external-store@1.6.0(react@19.2.5))(viem@2.48.4(typescript@5.9.3)(zod@4.3.6))(wagmi@0.0.0-canary-20260421205751) typescript: 5.9.3 + transitivePeerDependencies: + - '@types/react' + - immer + - react + - use-sync-external-store - '@wagmi/core@3.4.2(@tanstack/query-core@5.99.0)(@types/react@19.2.14)(ox@0.14.20(typescript@5.9.3)(zod@4.3.6))(react@19.2.5)(typescript@5.9.3)(use-sync-external-store@1.6.0(react@19.2.5))(viem@2.48.0(typescript@5.9.3)(zod@4.3.6))': + '@wagmi/core@0.0.0-canary-20260421205751(@tanstack/query-core@5.99.0)(@types/react@19.2.14)(accounts@0.7.2)(react@19.2.5)(typescript@5.9.3)(use-sync-external-store@1.6.0(react@19.2.5))(viem@2.48.4(typescript@5.9.3)(zod@4.3.6))': dependencies: eventemitter3: 5.0.1 mipd: 0.0.7(typescript@5.9.3) - viem: 2.48.0(typescript@5.9.3)(zod@4.3.6) + viem: 2.48.4(typescript@5.9.3)(zod@4.3.6) zustand: 5.0.0(@types/react@19.2.14)(react@19.2.5)(use-sync-external-store@1.6.0(react@19.2.5)) optionalDependencies: '@tanstack/query-core': 5.99.0 - ox: 0.14.20(typescript@5.9.3)(zod@4.3.6) + accounts: 0.7.2(@modelcontextprotocol/sdk@1.29.0(@cfworker/json-schema@4.1.1)(zod@4.3.6))(@types/react@19.2.14)(@wagmi/core@0.0.0-canary-20260421205751)(express@5.2.1)(react@19.2.5)(typescript@5.9.3)(use-sync-external-store@1.6.0(react@19.2.5))(viem@2.48.4(typescript@5.9.3)(zod@4.3.6))(wagmi@0.0.0-canary-20260421205751) typescript: 5.9.3 transitivePeerDependencies: - '@types/react' @@ -5543,20 +5565,21 @@ snapshots: mime-types: 3.0.2 negotiator: 1.0.0 - accounts@0.6.7(@modelcontextprotocol/sdk@1.29.0(@cfworker/json-schema@4.1.1)(zod@4.3.6))(@types/react@19.2.14)(@wagmi/core@3.4.2(@tanstack/query-core@5.99.0)(@types/react@19.2.14)(ox@0.14.20(typescript@5.9.3)(zod@4.3.6))(react@19.2.5)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.5))(viem@2.48.0(typescript@5.9.3)(zod@4.3.6)))(express@5.2.1)(react@19.2.5)(typescript@5.9.3)(use-sync-external-store@1.6.0(react@19.2.5))(viem@2.48.0(typescript@5.9.3)(zod@4.3.6)): + accounts@0.7.2(@modelcontextprotocol/sdk@1.29.0(@cfworker/json-schema@4.1.1)(zod@4.3.6))(@types/react@19.2.14)(@wagmi/core@0.0.0-canary-20260421205751)(express@5.2.1)(react@19.2.5)(typescript@5.9.3)(use-sync-external-store@1.6.0(react@19.2.5))(viem@2.48.4(typescript@5.9.3)(zod@4.3.6))(wagmi@0.0.0-canary-20260421205751): dependencies: hono: 4.12.12 idb-keyval: 6.2.2 mipd: 0.0.7(typescript@5.9.3) - mppx: 0.5.12(@modelcontextprotocol/sdk@1.29.0(@cfworker/json-schema@4.1.1)(zod@4.3.6))(express@5.2.1)(hono@4.12.12)(typescript@5.9.3)(viem@2.48.0(typescript@5.9.3)(zod@4.3.6)) + mppx: 0.5.11(@modelcontextprotocol/sdk@1.29.0(@cfworker/json-schema@4.1.1)(zod@4.3.6))(express@5.2.1)(hono@4.12.12)(typescript@5.9.3)(viem@2.48.4(typescript@5.9.3)(zod@4.3.6)) ox: 0.14.20(typescript@5.9.3)(zod@4.3.6) webauthx: 0.1.1(typescript@5.9.3)(zod@4.3.6) zod: 4.3.6 zustand: 5.0.12(@types/react@19.2.14)(react@19.2.5)(use-sync-external-store@1.6.0(react@19.2.5)) optionalDependencies: - '@wagmi/core': 3.4.2(@tanstack/query-core@5.99.0)(@types/react@19.2.14)(ox@0.14.20(typescript@5.9.3)(zod@4.3.6))(react@19.2.5)(typescript@5.9.3)(use-sync-external-store@1.6.0(react@19.2.5))(viem@2.48.0(typescript@5.9.3)(zod@4.3.6)) + '@wagmi/core': 0.0.0-canary-20260421205751(@tanstack/query-core@5.99.0)(@types/react@19.2.14)(accounts@0.7.2)(react@19.2.5)(typescript@5.9.3)(use-sync-external-store@1.6.0(react@19.2.5))(viem@2.48.4(typescript@5.9.3)(zod@4.3.6)) react: 19.2.5 - viem: 2.48.0(typescript@5.9.3)(zod@4.3.6) + viem: 2.48.4(typescript@5.9.3)(zod@4.3.6) + wagmi: 0.0.0-canary-20260421205751(@tanstack/query-core@5.99.0)(@tanstack/react-query@5.99.0(react@19.2.5))(@types/react@19.2.14)(accounts@0.7.2)(react@19.2.5)(typescript@5.9.3)(viem@2.48.4(typescript@5.9.3)(zod@4.3.6)) transitivePeerDependencies: - '@modelcontextprotocol/sdk' - '@types/react' @@ -7166,11 +7189,11 @@ snapshots: moo@0.5.3: {} - mppx@0.5.12(@modelcontextprotocol/sdk@1.29.0(@cfworker/json-schema@4.1.1)(zod@4.3.6))(express@5.2.1)(hono@4.12.12)(typescript@5.9.3)(viem@2.48.0(typescript@5.9.3)(zod@4.3.6)): + mppx@0.5.11(@modelcontextprotocol/sdk@1.29.0(@cfworker/json-schema@4.1.1)(zod@4.3.6))(express@5.2.1)(hono@4.12.12)(typescript@5.9.3)(viem@2.48.4(typescript@5.9.3)(zod@4.3.6)): dependencies: incur: 0.3.25 - ox: 0.14.10(typescript@5.9.3)(zod@4.3.6) - viem: 2.48.0(typescript@5.9.3)(zod@4.3.6) + ox: 0.14.7(typescript@5.9.3)(zod@4.3.6) + viem: 2.48.4(typescript@5.9.3)(zod@4.3.6) zod: 4.3.6 optionalDependencies: '@modelcontextprotocol/sdk': 1.29.0(@cfworker/json-schema@4.1.1)(zod@4.3.6) @@ -7245,22 +7268,7 @@ snapshots: outvariant@1.4.0: {} - ox@0.14.10(typescript@5.9.3)(zod@4.3.6): - dependencies: - '@adraffy/ens-normalize': 1.11.1 - '@noble/ciphers': 1.3.0 - '@noble/curves': 1.9.1 - '@noble/hashes': 1.8.0 - '@scure/bip32': 1.7.0 - '@scure/bip39': 1.6.0 - abitype: 1.2.3(typescript@5.9.3)(zod@4.3.6) - eventemitter3: 5.0.1 - optionalDependencies: - typescript: 5.9.3 - transitivePeerDependencies: - - zod - - ox@0.14.17(typescript@5.9.3)(zod@4.3.6): + ox@0.14.20(typescript@5.9.3)(zod@4.3.6): dependencies: '@adraffy/ens-normalize': 1.11.1 '@noble/ciphers': 1.3.0 @@ -7275,7 +7283,7 @@ snapshots: transitivePeerDependencies: - zod - ox@0.14.20(typescript@5.9.3)(zod@4.3.6): + ox@0.14.7(typescript@5.9.3)(zod@4.3.6): dependencies: '@adraffy/ens-normalize': 1.11.1 '@noble/ciphers': 1.3.0 @@ -7477,7 +7485,7 @@ snapshots: react: 19.2.5 react-dom: 19.2.5(react@19.2.5) webpack: 5.104.1 - webpack-sources: 3.3.4 + webpack-sources: 3.4.0 react@19.2.5: {} @@ -7868,6 +7876,8 @@ snapshots: tapable@2.3.2: {} + tapable@2.3.3: {} + tar@7.5.13: dependencies: '@isaacs/fs-minipass': 4.0.1 @@ -7881,10 +7891,10 @@ snapshots: '@jridgewell/trace-mapping': 0.3.31 jest-worker: 27.5.1 schema-utils: 4.3.3 - terser: 5.46.1 + terser: 5.46.2 webpack: 5.104.1 - terser@5.46.1: + terser@5.46.2: dependencies: '@jridgewell/source-map': 0.3.11 acorn: 8.16.0 @@ -8096,7 +8106,7 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.3 - viem@2.48.0(typescript@5.9.3)(zod@4.3.6): + viem@2.48.4(typescript@5.9.3)(zod@4.3.6): dependencies: '@noble/curves': 1.9.1 '@noble/hashes': 1.8.0 @@ -8104,7 +8114,7 @@ snapshots: '@scure/bip39': 1.6.0 abitype: 1.2.3(typescript@5.9.3)(zod@4.3.6) isows: 1.0.7(ws@8.18.3) - ox: 0.14.17(typescript@5.9.3)(zod@4.3.6) + ox: 0.14.20(typescript@5.9.3)(zod@4.3.6) ws: 8.18.3 optionalDependencies: typescript: 5.9.3 @@ -8115,19 +8125,19 @@ snapshots: vite-plugin-arraybuffer@0.1.4: {} - vite-plugin-mkcert@1.17.12(vite@7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)): + vite-plugin-mkcert@1.17.12(vite@7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.2)(tsx@4.21.0)(yaml@2.8.3)): dependencies: debug: 4.4.3 picocolors: 1.1.1 - vite: 7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3) + vite: 7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.2)(tsx@4.21.0)(yaml@2.8.3) transitivePeerDependencies: - supports-color - vite-plugin-wasm@3.6.0(vite@7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)): + vite-plugin-wasm@3.6.0(vite@7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.2)(tsx@4.21.0)(yaml@2.8.3)): dependencies: - vite: 7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3) + vite: 7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.2)(tsx@4.21.0)(yaml@2.8.3) - vite@7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3): + vite@7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.2)(tsx@4.21.0)(yaml@2.8.3): dependencies: esbuild: 0.27.7 fdir: 6.5.0(picomatch@4.0.4) @@ -8140,15 +8150,15 @@ snapshots: fsevents: 2.3.3 jiti: 2.6.1 lightningcss: 1.32.0 - terser: 5.46.1 + terser: 5.46.2 tsx: 4.21.0 yaml: 2.8.3 - vitefu@1.1.3(vite@7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)): + vitefu@1.1.3(vite@7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.2)(tsx@4.21.0)(yaml@2.8.3)): optionalDependencies: - vite: 7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3) + vite: 7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.2)(tsx@4.21.0)(yaml@2.8.3) - vocs@https://pkg.pr.new/wevm/vocs@2fb25c2(@cfworker/json-schema@4.1.1)(@types/react@19.2.14)(mermaid@11.14.0)(react-dom@19.2.5(react@19.2.5))(react-server-dom-webpack@19.2.3(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(webpack@5.104.1))(react@19.2.5)(rollup@4.60.1)(typescript@5.9.3)(vite@7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(waku@1.0.0-alpha.4(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(react-dom@19.2.5(react@19.2.5))(react-server-dom-webpack@19.2.3(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(webpack@5.104.1))(react@19.2.5)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)): + vocs@https://pkg.pr.new/wevm/vocs@2fb25c2(@cfworker/json-schema@4.1.1)(@types/react@19.2.14)(mermaid@11.14.0)(react-dom@19.2.5(react@19.2.5))(react-server-dom-webpack@19.2.3(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(webpack@5.104.1))(react@19.2.5)(rollup@4.60.1)(typescript@5.9.3)(vite@7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.2)(tsx@4.21.0)(yaml@2.8.3))(waku@1.0.0-alpha.4(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(react-dom@19.2.5(react@19.2.5))(react-server-dom-webpack@19.2.3(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(webpack@5.104.1))(react@19.2.5)(terser@5.46.2)(tsx@4.21.0)(yaml@2.8.3)): dependencies: '@base-ui/react': 1.3.0(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@codesandbox/sandpack-react': 2.20.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5) @@ -8168,11 +8178,11 @@ snapshots: '@shikijs/types': 3.23.0 '@svgr/core': 8.1.0(typescript@5.9.3) '@svgr/plugin-jsx': 8.1.0(@svgr/core@8.1.0(typescript@5.9.3)) - '@tailwindcss/vite': 4.2.2(vite@7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) + '@tailwindcss/vite': 4.2.2(vite@7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.2)(tsx@4.21.0)(yaml@2.8.3)) '@takumi-rs/image-response': 0.62.8 '@takumi-rs/wasm': 0.62.8 - '@vitejs/plugin-react': 5.1.2(vite@7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) - '@vitejs/plugin-rsc': 0.5.23(react-dom@19.2.5(react@19.2.5))(react-server-dom-webpack@19.2.3(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(webpack@5.104.1))(react@19.2.5)(vite@7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) + '@vitejs/plugin-react': 5.1.2(vite@7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.2)(tsx@4.21.0)(yaml@2.8.3)) + '@vitejs/plugin-rsc': 0.5.23(react-dom@19.2.5(react@19.2.5))(react-server-dom-webpack@19.2.3(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(webpack@5.104.1))(react@19.2.5)(vite@7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.2)(tsx@4.21.0)(yaml@2.8.3)) cac: 6.7.14 cva: class-variance-authority@0.7.1 debug: 4.4.3 @@ -8218,13 +8228,13 @@ snapshots: urlpattern-polyfill: 10.1.0 vfile: 6.0.3 vite-plugin-arraybuffer: 0.1.4 - vite-plugin-wasm: 3.6.0(vite@7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) + vite-plugin-wasm: 3.6.0(vite@7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.2)(tsx@4.21.0)(yaml@2.8.3)) yaml: 2.8.3 zod: 4.3.6 optionalDependencies: mermaid: 11.14.0 - vite: 7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3) - waku: 1.0.0-alpha.4(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(react-dom@19.2.5(react@19.2.5))(react-server-dom-webpack@19.2.3(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(webpack@5.104.1))(react@19.2.5)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3) + vite: 7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.2)(tsx@4.21.0)(yaml@2.8.3) + waku: 1.0.0-alpha.4(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(react-dom@19.2.5(react@19.2.5))(react-server-dom-webpack@19.2.3(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(webpack@5.104.1))(react@19.2.5)(terser@5.46.2)(tsx@4.21.0)(yaml@2.8.3) transitivePeerDependencies: - '@cfworker/json-schema' - '@remix-run/react' @@ -8262,14 +8272,14 @@ snapshots: w3c-keyname@2.2.8: {} - wagmi@3.6.1(@tanstack/query-core@5.99.0)(@tanstack/react-query@5.99.0(react@19.2.5))(@types/react@19.2.14)(ox@0.14.20(typescript@5.9.3)(zod@4.3.6))(react@19.2.5)(typescript@5.9.3)(viem@2.48.0(typescript@5.9.3)(zod@4.3.6)): + wagmi@0.0.0-canary-20260421205751(@tanstack/query-core@5.99.0)(@tanstack/react-query@5.99.0(react@19.2.5))(@types/react@19.2.14)(accounts@0.7.2)(react@19.2.5)(typescript@5.9.3)(viem@2.48.4(typescript@5.9.3)(zod@4.3.6)): dependencies: '@tanstack/react-query': 5.99.0(react@19.2.5) - '@wagmi/connectors': 8.0.1(@wagmi/core@3.4.2(@tanstack/query-core@5.99.0)(@types/react@19.2.14)(ox@0.14.20(typescript@5.9.3)(zod@4.3.6))(react@19.2.5)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.5))(viem@2.48.0(typescript@5.9.3)(zod@4.3.6)))(typescript@5.9.3)(viem@2.48.0(typescript@5.9.3)(zod@4.3.6)) - '@wagmi/core': 3.4.2(@tanstack/query-core@5.99.0)(@types/react@19.2.14)(ox@0.14.20(typescript@5.9.3)(zod@4.3.6))(react@19.2.5)(typescript@5.9.3)(use-sync-external-store@1.6.0(react@19.2.5))(viem@2.48.0(typescript@5.9.3)(zod@4.3.6)) + '@wagmi/connectors': 0.0.0-canary-20260421205751(@wagmi/core@0.0.0-canary-20260421205751)(accounts@0.7.2)(typescript@5.9.3)(viem@2.48.4(typescript@5.9.3)(zod@4.3.6)) + '@wagmi/core': 0.0.0-canary-20260421205751(@tanstack/query-core@5.99.0)(@types/react@19.2.14)(accounts@0.7.2)(react@19.2.5)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.5))(viem@2.48.4(typescript@5.9.3)(zod@4.3.6)) react: 19.2.5 use-sync-external-store: 1.4.0(react@19.2.5) - viem: 2.48.0(typescript@5.9.3)(zod@4.3.6) + viem: 2.48.4(typescript@5.9.3)(zod@4.3.6) optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: @@ -8281,15 +8291,15 @@ snapshots: - '@tanstack/query-core' - '@types/react' - '@walletconnect/ethereum-provider' + - accounts - immer - - ox - porto - waku@1.0.0-alpha.4(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(react-dom@19.2.5(react@19.2.5))(react-server-dom-webpack@19.2.3(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(webpack@5.104.1))(react@19.2.5)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3): + waku@1.0.0-alpha.4(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(react-dom@19.2.5(react@19.2.5))(react-server-dom-webpack@19.2.3(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(webpack@5.104.1))(react@19.2.5)(terser@5.46.2)(tsx@4.21.0)(yaml@2.8.3): dependencies: '@hono/node-server': 1.19.13(hono@4.12.12) - '@vitejs/plugin-react': 5.2.0(vite@7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) - '@vitejs/plugin-rsc': 0.5.23(react-dom@19.2.5(react@19.2.5))(react-server-dom-webpack@19.2.3(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(webpack@5.104.1))(react@19.2.5)(vite@7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) + '@vitejs/plugin-react': 5.2.0(vite@7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.2)(tsx@4.21.0)(yaml@2.8.3)) + '@vitejs/plugin-rsc': 0.5.23(react-dom@19.2.5(react@19.2.5))(react-server-dom-webpack@19.2.3(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(webpack@5.104.1))(react@19.2.5)(vite@7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.2)(tsx@4.21.0)(yaml@2.8.3)) dotenv: 17.4.1 hono: 4.12.12 magic-string: 0.30.21 @@ -8298,7 +8308,7 @@ snapshots: react-dom: 19.2.5(react@19.2.5) react-server-dom-webpack: 19.2.3(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(webpack@5.104.1) rsc-html-stream: 0.0.7 - vite: 7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3) + vite: 7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.2)(tsx@4.21.0)(yaml@2.8.3) transitivePeerDependencies: - '@types/node' - jiti @@ -8327,7 +8337,7 @@ snapshots: - typescript - zod - webpack-sources@3.3.4: {} + webpack-sources@3.4.0: {} webpack-virtual-modules@0.6.2: {} @@ -8354,10 +8364,10 @@ snapshots: mime-types: 2.1.35 neo-async: 2.6.2 schema-utils: 4.3.3 - tapable: 2.3.2 + tapable: 2.3.3 terser-webpack-plugin: 5.4.0(webpack@5.104.1) watchpack: 2.5.1 - webpack-sources: 3.3.4 + webpack-sources: 3.4.0 transitivePeerDependencies: - '@swc/core' - esbuild @@ -8385,6 +8395,12 @@ snapshots: zod@4.3.6: {} + zustand@5.0.0(@types/react@19.2.14)(react@19.2.5)(use-sync-external-store@1.4.0(react@19.2.5)): + optionalDependencies: + '@types/react': 19.2.14 + react: 19.2.5 + use-sync-external-store: 1.4.0(react@19.2.5) + zustand@5.0.0(@types/react@19.2.14)(react@19.2.5)(use-sync-external-store@1.6.0(react@19.2.5)): optionalDependencies: '@types/react': 19.2.14 diff --git a/src/components/guides/AccountsSignIn.tsx b/src/components/guides/AccountsSignIn.tsx index 5c0e9682..b870d15a 100644 --- a/src/components/guides/AccountsSignIn.tsx +++ b/src/components/guides/AccountsSignIn.tsx @@ -37,5 +37,5 @@ export function AccountsSignIn() { function useTempoWalletConnector() { const connectors = useConnectors() - return connectors.find((c) => c.id === 'xyz.tempo') + return connectors.find((c: { id: string }) => c.id === 'xyz.tempo') } diff --git a/src/components/guides/VirtualAddressesLiveDemo.tsx b/src/components/guides/VirtualAddressesLiveDemo.tsx index fff6a53a..024ff0f3 100644 --- a/src/components/guides/VirtualAddressesLiveDemo.tsx +++ b/src/components/guides/VirtualAddressesLiveDemo.tsx @@ -121,13 +121,7 @@ function PasskeyLogin() { className="font-normal text-[14px] -tracking-[2%]" onClick={async () => { await disconnect.disconnectAsync().catch(() => {}) - connect.connect({ - connector, - capabilities: { - label: 'Tempo Docs', - type: 'sign-up', - }, - }) + connect.connect({ connector }) }} type="button" > diff --git a/src/pages/guide/use-accounts/authorize-access-keys.mdx b/src/pages/guide/use-accounts/authorize-access-keys.mdx new file mode 100644 index 00000000..186bddae --- /dev/null +++ b/src/pages/guide/use-accounts/authorize-access-keys.mdx @@ -0,0 +1,840 @@ +--- +title: Authorize access keys +description: Authorize access keys on Tempo. Use a secondary signing key to send transactions without repeated passkey prompts, with spending limits and expiry for security. +interactive: true +--- + +import * as Demo from '../../../components/guides/Demo.tsx' +import { Connect } from '../../../components/guides/steps/auth/Connect.tsx' +import { AddFunds } from '../../../components/guides/steps/payments/AddFunds.tsx' +import { SendPayment } from '../../../components/guides/steps/payments/SendPayment.tsx' +import { Cards, Card } from 'vocs' +import { Tabs, Tab } from 'vocs' + +# Authorize access keys + +Send stablecoin payments using an access key: a secondary signing key that lets you transact without repeated passkey prompts. Access keys can be scoped with spending limits and expiry for security. + +## Demo + +By the end of this guide you will be able to send payments on Tempo using an access key. Notice that no passkey prompt appears when sending a payment. + + + + + + + +## Steps + +::::steps + +### Set up Wagmi & integrate accounts + +Ensure that you have set up your project with Wagmi and integrated accounts by following either of the guides: + +- [Embed Tempo Wallet](/guide/use-accounts/embed-tempo-wallet) +- [Embed domain-bound Passkeys](/guide/use-accounts/embed-passkeys) + +### Authorize an access key + +Configure your connector to authorize an access key when the user connects. The access key will be used to sign subsequent transactions without passkey prompts. + + + + + ```ts twoslash [wagmi.config.ts] + // @noErrors + import { createConfig, http } from 'wagmi' + import { tempo } from 'wagmi/chains' + import { parseUnits } from 'viem' + import { Expiry } from 'accounts' + import { tempoWallet } from 'accounts/wagmi' + + export const config = createConfig({ + chains: [tempo], + connectors: [ + tempoWallet({ + authorizeAccessKey: () => ({ // [!code hl] + // When the key expires // [!code hl] + expiry: Expiry.days(7), // [!code hl] + // Max spend per token // [!code hl] + limits: [{ // [!code hl] + token: '0x20c0000000000000000000000000000000000001', // [!code hl] + limit: parseUnits('100', 6), // 100 AlphaUSD // [!code hl] + }], // [!code hl] + // Tokens & functions the key can call // [!code hl] + scopes: [{ // [!code hl] + target: '0x20c0000000000000000000000000000000000001', // AlphaUSD // [!code hl] + selector: 'transfer(address,uint256)', // [!code hl] + }], // [!code hl] + }), // [!code hl] + }), + ], + transports: { [tempo.id]: http() }, + }) + ``` + + + + + + ```ts twoslash [wagmi.config.ts] + // @noErrors + import { createConfig, http } from 'wagmi' + import { tempo } from 'wagmi/chains' + import { parseUnits } from 'viem' + import { Expiry } from 'accounts' + import { webAuthn } from 'accounts/wagmi' + + export const config = createConfig({ + chains: [tempo], + connectors: [ + webAuthn({ + authUrl: '/auth', + authorizeAccessKey: () => ({ // [!code hl] + // When the key expires // [!code hl] + expiry: Expiry.days(7), // [!code hl] + // Max spend per token // [!code hl] + limits: [{ // [!code hl] + token: '0x20c0000000000000000000000000000000000001', // [!code hl] + limit: parseUnits('100', 6), // 100 AlphaUSD // [!code hl] + }], // [!code hl] + // Tokens & functions the key can call // [!code hl] + scopes: [{ // [!code hl] + target: '0x20c0000000000000000000000000000000000001', // AlphaUSD // [!code hl] + selector: 'transfer(address,uint256)', // [!code hl] + }], // [!code hl] + }), // [!code hl] + }), + ], + transports: { [tempo.id]: http() }, + }) + ``` + + + + +When the user connects, the connector will authorize an access key with: +- **7-day expiry**: the key automatically becomes invalid after 7 days +- **Scopes**: the key can only call `transfer` on the AlphaUSD token +- **100 AlphaUSD spending limit**: the key can spend up to 100 AlphaUSD + +### Add testnet funds + +Before you can send a payment, you need to fund your account with `AlphaUSD` (`0x20c000…0001`). + +```tsx twoslash [AddFunds.tsx] +// @noErrors +import { Hooks } from 'wagmi/tempo' +import { useConnection } from 'wagmi' + +function AddFunds() { + const { address } = useConnection() + const { mutate, isPending } = Hooks.faucet.useFundSync() + + return ( + + ) +} +``` + +:::warning +The `addFunds` Hook only works on testnets as a convenience feature to get +started quickly. For production, you will need to onramp & fund your account manually. +::: + +### Send a payment + +Now send a payment using `useTransferSync`. Because you authorized an access key in step 2, this transaction will be signed automatically: no passkey prompt. + +```tsx twoslash [SendPayment.tsx] +// @noErrors +import { Hooks } from 'wagmi/tempo' +import { parseUnits } from 'viem' + +function SendPayment() { + const transfer = Hooks.token.useTransferSync() // [!code hl] + + return ( +
{ + event.preventDefault() + const formData = new FormData(event.target as HTMLFormElement) + const recipient = formData.get('recipient') as `0x${string}` + + transfer.mutate({ // [!code hl] + amount: parseUnits('100', 6), // [!code hl] + to: recipient, // [!code hl] + token: '0x20c0000000000000000000000000000000000001', // [!code hl] + }) // [!code hl] + } + }> + + + +
+ ) +} +``` + +### Display receipt + +Display the transaction receipt on success. + +```tsx twoslash [SendPayment.tsx] +// @noErrors +import { Hooks } from 'wagmi/tempo' +import { parseUnits } from 'viem' + +function SendPayment() { + const sendPayment = Hooks.token.useTransferSync() + + return ( + <> + {/* ... your payment form ... */} + {sendPayment.data && ( // [!code hl] + {/* [!code hl] */} + View receipt {/* [!code hl] */} + {/* [!code hl] */} + )} {/* [!code hl] */} + + ) +} +``` + +### Next steps + +Now that you can send payments with access keys: +- Learn about the [Account Keychain specification](/protocol/transactions/AccountKeychain) +- Send a payment [with a specific fee token](/guide/payments/pay-fees-in-any-stablecoin) + +:::: + +## SDKs + +### Basic transfer with access key + +Send a payment using an access key across different SDKs: + + + + + :::code-group + + ```ts twoslash [example.ts] + // @noErrors + import { parseUnits } from 'viem' + import { generatePrivateKey } from 'viem/accounts' + import { Account, Actions, Expiry } from 'viem/tempo' + import { client } from './viem.config' + + // 1. Create an access key. // [!code hl] + const accessKey = Account.fromP256(generatePrivateKey(), { // [!code hl] + access: client.account, // [!code hl] + }) // [!code hl] + + // 2. Sign a key authorization. // [!code hl] + const keyAuthorization = await Actions.accessKey.signAuthorization(client, { // [!code hl] + accessKey, // [!code hl] + expiry: Expiry.days(7), // [!code hl] + limits: [{ // [!code hl] + token: '0x20c0000000000000000000000000000000000001', // [!code hl] + limit: parseUnits('100', 6), // [!code hl] + }], // [!code hl] + }) // [!code hl] + + // 3. Send a transfer with the key authorization. // [!code hl] + const { receipt } = await client.token.transferSync({ + amount: parseUnits('100', 6), + to: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb', + token: '0x20c0000000000000000000000000000000000001', + keyAuthorization, // [!code hl] + }) + ``` + + ```ts twoslash [viem.config.ts] + // [!include ~/snippets/viem.config.ts:setup] + ``` + + ::: + +
+ + :::info + Once you have broadcasted the transaction with `keyAuthorization`, you can reuse the same access key to sign subsequent transactions without the need to pass the key authorization again. + ::: + + + + + + :::code-group + + ```tsx twoslash [example.tsx] + // @noErrors + import { Hooks } from 'wagmi/tempo' + import { parseUnits } from 'viem' + + function SendPayment() { + const { mutate, isPending } = Hooks.token.useTransferSync() // [!code hl] + + return ( + + ) + } + ``` + + ```ts twoslash [wagmi.config.ts] + // @noErrors + import { createConfig, http } from 'wagmi' + import { tempo } from 'wagmi/chains' + import { parseUnits } from 'viem' + import { Expiry } from 'accounts' + import { tempoWallet } from 'accounts/wagmi' + + export const config = createConfig({ + chains: [tempo], + connectors: [ + tempoWallet({ + authorizeAccessKey: () => ({ // [!code hl] + // When the key expires // [!code hl] + expiry: Expiry.days(7), // [!code hl] + // Max spend per token // [!code hl] + limits: [{ // [!code hl] + token: '0x20c0000000000000000000000000000000000001', // [!code hl] + limit: parseUnits('100', 6), // 100 AlphaUSD // [!code hl] + }], // [!code hl] + // Tokens & functions the key can call // [!code hl] + scopes: [{ // [!code hl] + target: '0x20c0000000000000000000000000000000000001', // AlphaUSD // [!code hl] + selector: 'transfer(address,uint256)', // [!code hl] + }], // [!code hl] + }), // [!code hl] + }), + ], + transports: { [tempo.id]: http() }, + }) + ``` + + ::: + + + + + + :::code-group + + ```tsx twoslash [example.tsx] + // @noErrors + import { Hooks } from 'wagmi/tempo' + import { parseUnits } from 'viem' + + // Same API: the connector handles access key signing automatically + function SendPayment() { + const { mutate, isPending } = Hooks.token.useTransferSync() // [!code hl] + + return ( + + ) + } + ``` + + ```ts twoslash [wagmi.config.ts] + // @noErrors + import { createConfig, http } from 'wagmi' + import { tempo } from 'wagmi/chains' + import { parseUnits } from 'viem' + import { Expiry } from 'accounts' + import { webAuthn } from 'accounts/wagmi' + + export const config = createConfig({ + chains: [tempo], + connectors: [ + webAuthn({ + authUrl: '/auth', + authorizeAccessKey: () => ({ // [!code hl] + // When the key expires // [!code hl] + expiry: Expiry.days(7), // [!code hl] + // Max spend per token // [!code hl] + limits: [{ // [!code hl] + token: '0x20c0000000000000000000000000000000000001', // [!code hl] + limit: parseUnits('100', 6), // 100 AlphaUSD // [!code hl] + }], // [!code hl] + // Tokens & functions the key can call // [!code hl] + scopes: [{ // [!code hl] + target: '0x20c0000000000000000000000000000000000001', // AlphaUSD // [!code hl] + selector: 'transfer(address,uint256)', // [!code hl] + }], // [!code hl] + }), // [!code hl] + }), + ], + transports: { [tempo.id]: http() }, + }) + ``` + + ::: + + + + + + :::code-group + + ```rust [example.rs] + use alloy::primitives::{address, U256}; + use alloy::providers::Provider; + use alloy::signers::{SignerSync, local::PrivateKeySigner}; + use alloy::sol_types::SolCall; + use tempo_alloy::contracts::precompiles::ITIP20; + use tempo_alloy::primitives::transaction::key_authorization::{ + KeyAuthorization, SignedKeyAuthorization, TokenLimit, + }; + use tempo_alloy::primitives::transaction::tt_signature::{ + KeychainSignature, PrimitiveSignature, SignatureType, TempoSignature, + }; + use tempo_alloy::rpc::TempoTransactionRequest; + + mod provider; + + #[tokio::main] + async fn main() -> Result<(), Box> { + let provider = provider::get_provider().await?; + let root: PrivateKeySigner = std::env::var("PRIVATE_KEY")?.parse()?; + + let token = address!("0x20c0000000000000000000000000000000000001"); + let recipient = address!("0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb"); + let amount = U256::from(100_000_000u64); // 100 AlphaUSD (6 decimals) + let chain_id = provider.get_chain_id().await?; + + // 1. Create an access key. // [!code hl] + let access_key = PrivateKeySigner::random(); // [!code hl] + + // 2. Sign a key authorization with the root account. // [!code hl] + let expiry = std::time::SystemTime::now() // [!code hl] + .duration_since(std::time::UNIX_EPOCH)? // [!code hl] + .as_secs() + 7 * 24 * 60 * 60; // 7 days // [!code hl] + + let authorization = KeyAuthorization { // [!code hl] + chain_id, // [!code hl] + key_type: SignatureType::Secp256k1, // [!code hl] + key_id: access_key.address(), // [!code hl] + expiry: Some(expiry), // [!code hl] + limits: Some(vec![TokenLimit { // [!code hl] + token, // [!code hl] + limit: amount, // [!code hl] + period: 0, // [!code hl] + }]), // [!code hl] + ..Default::default() // [!code hl] + }; // [!code hl] + + let sig = root.sign_hash_sync(&authorization.signature_hash())?; // [!code hl] + let key_authorization = SignedKeyAuthorization { // [!code hl] + authorization, // [!code hl] + signature: sig.into(), // [!code hl] + }; // [!code hl] + + // 3. Send a transfer with the key authorization. // [!code hl] + let call_data = ITIP20::transferCall { // [!code hl] + to: recipient, // [!code hl] + amount, // [!code hl] + }.abi_encode(); // [!code hl] + + let tx = TempoTransactionRequest { // [!code hl] + key_authorization: Some(key_authorization), // [!code hl] + ..Default::default() // [!code hl] + } // [!code hl] + .with_to(token) // [!code hl] + .with_input(call_data.into()); // [!code hl] + + let receipt = provider // [!code hl] + .send_transaction(tx) // [!code hl] + .await? // [!code hl] + .get_receipt() // [!code hl] + .await?; // [!code hl] + + println!("Transfer successful: {:?}", receipt.transaction_hash); + + Ok(()) + } + ``` + + ```rust [provider.rs] + // [!include ~/snippets/rust-signer-provider.rs:setup] + ``` + + ::: + + + + + + ```bash + # 1. Generate an access key. + $ cast wallet new + # Address: 0x9f3a7b2c1d4e5f6a8b0c9d2e3f4a5b6c7d8e9f0a + # Private key: 0x4c0883a69102937d6231471b5dbb6204fe512961708279f22a3c36f1e24b8e10 + + # 2. Authorize the access key on-chain with expiry and limits. + $ cast keychain auth \ + $ACCESS_KEY_ADDRESS \ + secp256k1 \ + $(date -v+7d +%s) \ # 7-day expiry + --limit 0x20c0000000000000000000000000000000000001:100000000 \ + --rpc-url $TEMPO_RPC_URL \ + --private-key $ROOT_PRIVATE_KEY + + # 3. Send a transfer with the access key. + $ cast send \ + 0x20c0000000000000000000000000000000000001 \ + "transfer(address,uint256)" \ + 0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb \ + 100000000 \ + --rpc-url $TEMPO_RPC_URL \ + --tempo.access-key $ACCESS_KEY_PRIVATE_KEY \ + --tempo.root-account $ROOT_ADDRESS + ``` + + + + +### Periodical payments + +Use `period` in spending limits to cap how much an access key can spend per time window. The limit resets automatically after each period, making it ideal for subscriptions and recurring billing. + + + + + :::code-group + + ```ts twoslash [client.ts] + // @noErrors + import { parseUnits } from 'viem' + import { Actions, Expiry } from 'viem/tempo' + import { client } from './viem.config' + + // Sign a key authorization with a periodic spending limit. + const keyAuthorization = await Actions.accessKey.signAuthorization(client, { + accessKey, + expiry: Expiry.days(30), + limits: [{ + token: '0x20c0000000000000000000000000000000000001', + limit: parseUnits('10', 6), // 10 AlphaUSD // [!code hl] + period: 60 * 60 * 24 * 7, // resets every 7 days // [!code hl] + }], + }) + ``` + + ```ts twoslash [server.ts] + // @noErrors + import { parseUnits } from 'viem' + import { client } from './viem.config' + + // Charge the user weekly from the server. + const { receipt } = await client.token.transferSync({ + account: accessKey, + amount: parseUnits('10', 6), + to: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb', + token: '0x20c0000000000000000000000000000000000001', + keyAuthorization, + }) + ``` + + ```ts twoslash [viem.config.ts] + // [!include ~/snippets/viem.config.ts:setup] + ``` + + ::: + + + + + + :::code-group + + ```tsx twoslash [client.tsx] + // @noErrors + import { parseUnits } from 'viem' + import { useConnectorClient } from 'wagmi' + import { Expiry } from 'accounts' + + function Subscribe() { + const { data: client } = useConnectorClient() + + async function handleSubscribe() { + await client.request({ // [!code hl] + method: 'wallet_authorizeAccessKey', // [!code hl] + params: [{ // [!code hl] + expiry: Expiry.days(30), // [!code hl] + limits: [{ // [!code hl] + token: '0x20c0000000000000000000000000000000000001', // [!code hl] + limit: parseUnits('10', 6), // 10 AlphaUSD // [!code hl] + period: 60 * 60 * 24 * 7, // resets every 7 days // [!code hl] + }], // [!code hl] + scopes: [{ // [!code hl] + target: '0x20c0000000000000000000000000000000000001', // [!code hl] + selector: 'transfer(address,uint256)', // [!code hl] + }], // [!code hl] + }], // [!code hl] + }) // [!code hl] + } + + return ( + + ) + } + ``` + + ```ts twoslash [server.ts] + // @noErrors + import { parseUnits } from 'viem' + import { Actions } from 'wagmi/tempo' + import { config } from './wagmi.config' + + // Charge the user weekly from the server. + const { receipt } = await Actions.token.transferSync(config, { + amount: parseUnits('10', 6), + to: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb', + token: '0x20c0000000000000000000000000000000000001', + }) + ``` + + ```ts twoslash [wagmi.config.ts] + // @noErrors + import { createConfig, http } from 'wagmi' + import { tempo } from 'wagmi/chains' + import { tempoWallet } from 'accounts/wagmi' + + export const config = createConfig({ + chains: [tempo], + connectors: [tempoWallet()], + transports: { [tempo.id]: http() }, + }) + ``` + + ::: + + + + + + :::code-group + + ```tsx twoslash [client.tsx] + // @noErrors + import { parseUnits } from 'viem' + import { useConnectorClient } from 'wagmi' + import { Expiry } from 'accounts' + + function Subscribe() { + const { data: client } = useConnectorClient() + + async function handleSubscribe() { + await client.request({ // [!code hl] + method: 'wallet_authorizeAccessKey', // [!code hl] + params: [{ // [!code hl] + expiry: Expiry.days(30), // [!code hl] + limits: [{ // [!code hl] + token: '0x20c0000000000000000000000000000000000001', // [!code hl] + limit: parseUnits('10', 6), // 10 AlphaUSD // [!code hl] + period: 60 * 60 * 24 * 7, // resets every 7 days // [!code hl] + }], // [!code hl] + }], // [!code hl] + }) // [!code hl] + } + + return ( + + ) + } + ``` + + ```ts twoslash [server.ts] + // @noErrors + import { parseUnits } from 'viem' + import { Actions } from 'wagmi/tempo' + import { config } from './wagmi.config' + + // Charge the user weekly from the server. + const { receipt } = await Actions.token.transferSync(config, { + amount: parseUnits('10', 6), + to: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb', + token: '0x20c0000000000000000000000000000000000001', + }) + ``` + + ```ts twoslash [wagmi.config.ts] + // @noErrors + import { createConfig, http } from 'wagmi' + import { tempo } from 'wagmi/chains' + import { webAuthn } from 'accounts/wagmi' + + export const config = createConfig({ + chains: [tempo], + connectors: [webAuthn({ authUrl: '/auth' })], + transports: { [tempo.id]: http() }, + }) + ``` + + ::: + + + + +### Authorize arbitrary public keys + +You can also directly authorize a public key: + + + + + :::code-group + + ```ts twoslash [example.ts] + // @noErrors + import { parseUnits } from 'viem' + import { Account, Actions, Expiry } from 'viem/tempo' + import { client } from './viem.config' + + // Sign authorization by public key + const keyAuthorization = await Actions.accessKey.signAuthorization(client, { + accessKey: { // [!code hl] + publicKey: '0x...', // [!code hl] + // address: '0x...', // or address // [!code hl] + type: 'p256', // [!code hl] + }, // [!code hl] + expiry: Expiry.days(7), + limits: [{ + token: '0x20c0000000000000000000000000000000000001', + limit: parseUnits('100', 6), + }], + }) + ``` + + ```ts twoslash [viem.config.ts] + // [!include ~/snippets/viem.config.ts:setup] + ``` + + ::: + + + + + + ```ts twoslash [wagmi.config.ts] + // @noErrors + import { createConfig, http } from 'wagmi' + import { tempo } from 'wagmi/chains' + import { parseUnits } from 'viem' + import { Expiry } from 'accounts' + import { tempoWallet } from 'accounts/wagmi' + + export const config = createConfig({ + chains: [tempo], + connectors: [ + tempoWallet({ + authorizeAccessKey: () => ({ + publicKey: '0x...', // [!code hl] + // address: '0x...', // or address // [!code hl] + expiry: Expiry.days(7), + limits: [{ + token: '0x20c0000000000000000000000000000000000001', + limit: parseUnits('100', 6), + }], + scopes: [{ + target: '0x20c0000000000000000000000000000000000001', + selector: 'transfer(address,uint256)', + }], + }), + }), + ], + transports: { [tempo.id]: http() }, + }) + ``` + + + + + + ```ts twoslash [wagmi.config.ts] + // @noErrors + import { createConfig, http } from 'wagmi' + import { tempo } from 'wagmi/chains' + import { parseUnits } from 'viem' + import { Expiry } from 'accounts' + import { webAuthn } from 'accounts/wagmi' + + export const config = createConfig({ + chains: [tempo], + connectors: [ + webAuthn({ + authUrl: '/auth', + authorizeAccessKey: () => ({ + publicKey: '0x...', // [!code hl] + // address: '0x...', // or address // [!code hl] + expiry: Expiry.days(7), + limits: [{ + token: '0x20c0000000000000000000000000000000000001', + limit: parseUnits('100', 6), + }], + }), + }), + ], + transports: { [tempo.id]: http() }, + }) + ``` + + + + +## Best practices + +### Scope to specific tokens and functions +Always define `scopes` to restrict which tokens and functions the access key can call. A key scoped to `transfer` on a specific token cannot be used to call other tokens or functions, even if compromised. + +### Set appropriate expiry +Access keys should have a reasonable expiry window. Use `Expiry.days(7)` for interactive sessions or `Expiry.hours(1)` for short-lived operations. + +### Use spending limits +Combine scopes with per-token spending limits for defense in depth. Spending limits cap the total amount a key can transfer, while scopes restrict which tokens it can interact with. + +## Learning resources + + + + diff --git a/src/wagmi.config.ts b/src/wagmi.config.ts index d9dffbfd..01aed794 100644 --- a/src/wagmi.config.ts +++ b/src/wagmi.config.ts @@ -1,6 +1,5 @@ import { QueryClient } from '@tanstack/react-query' import { Expiry } from 'accounts' -import { tempoWallet, webAuthn as webAuthnAccounts } from 'accounts/wagmi' import * as React from 'react' import { parseUnits } from 'viem' import { tempoDevnet, tempoLocalnet, tempoModerato } from 'viem/chains' @@ -14,7 +13,7 @@ import { useConnectors, webSocket, } from 'wagmi' -import { KeyManager, webAuthn } from 'wagmi/tempo' +import { tempoWallet, webAuthn } from 'wagmi/tempo' import { alphaUsd, betaUsd, pathUsd, thetaUsd } from './components/guides/tokens' import { feeToken, moderatoZones } from './lib/private-zones.ts' @@ -51,33 +50,27 @@ export function getConfig(options: getConfig.Options = {}) { chains: [chain], connectors: [ ...(import.meta.env.VITE_E2E === 'true' - ? [ - webAuthnAccounts({ - rdns: 'webAuthn', - }), - ] - : [ - tempoWallet({ - authorizeAccessKey: () => ({ - expiry: Expiry.days(1), - limits: [ - { token: pathUsd, limit: parseUnits('500', 6) }, - { token: alphaUsd, limit: parseUnits('500', 6) }, - { token: betaUsd, limit: parseUnits('500', 6) }, - { token: thetaUsd, limit: parseUnits('500', 6) }, - ], - }), - feePayer: { - precedence: 'user-first', - url: 'https://sponsor.moderato.tempo.xyz', - }, - }), - webAuthn({ - grantAccessKey: true, - keyManager: KeyManager.http('https://keys.tempo.xyz'), - rpId, - }), - ]), + ? [ + webAuthn(), + ] + : [ + tempoWallet({ + authorizeAccessKey: () => ({ + expiry: Expiry.days(1), + limits: [ + { token: pathUsd, limit: parseUnits('500', 6) }, + { token: alphaUsd, limit: parseUnits('500', 6) }, + { token: betaUsd, limit: parseUnits('500', 6) }, + { token: thetaUsd, limit: parseUnits('500', 6) }, + ], + }), + feePayer: { + precedence: 'user-first', + url: 'https://sponsor.moderato.tempo.xyz', + }, + }), + webAuthn(), + ]), ], multiInjectedProviderDiscovery, storage: createStorage({ @@ -124,7 +117,7 @@ export function useTempoWalletConnector() { const connectors = useConnectors() return React.useMemo( // biome-ignore lint/style/noNonNullAssertion: _ - () => connectors.find((connector) => connector.id === 'xyz.tempo')!, + () => connectors.find((c: { id: string }) => c.id === 'xyz.tempo')!, [connectors], ) } @@ -133,7 +126,7 @@ export function useWebAuthnConnector() { const connectors = useConnectors() return React.useMemo( // biome-ignore lint/style/noNonNullAssertion: _ - () => connectors.find((connector) => connector.id === 'webAuthn')!, + () => connectors.find((c: { id: string }) => c.id === 'webAuthn')!, [connectors], ) } diff --git a/vocs.config.ts b/vocs.config.ts index aac70dc6..a32d4335 100644 --- a/vocs.config.ts +++ b/vocs.config.ts @@ -100,6 +100,10 @@ export default defineConfig({ text: 'Embed domain-bound Passkeys', link: '/guide/use-accounts/embed-passkeys', }, + { + text: 'Authorize access keys', + link: '/guide/use-accounts/authorize-access-keys', + }, { text: 'Connect to other wallets', link: '/guide/use-accounts/connect-to-wallets',