From be7bbeebb9ad62027beb80cbb393028e4a0f6223 Mon Sep 17 00:00:00 2001 From: "zapaz.eth" Date: Tue, 24 Dec 2024 18:04:40 +0100 Subject: [PATCH] initial version v0.1.0 --- .envrc | 13 + package.json | 23 +- pnpm-lock.yaml | 1065 +++---- src/app.pcss | 33 + src/lib/config.ts | 52 - src/lib/deployments.json | 2606 +---------------- src/lib/scaffold.config.ts | 46 - src/lib/test/Counter.svelte.ts | 33 + src/lib/wagmi/classes/Account.svelte.ts | 47 + src/lib/wagmi/classes/Address.svelte.ts | 131 + src/lib/wagmi/classes/Client.svelte.ts | 19 + src/lib/wagmi/classes/Events.svelte.ts | 110 + src/lib/wagmi/classes/Network.svelte.ts | 114 + src/lib/wagmi/classes/SmartContract.svelte.ts | 172 ++ src/lib/wagmi/classes/Wagmi.svelte.ts | 84 + src/lib/wagmi/classes/Watcher.svelte.ts | 34 + src/lib/wagmi/classes/index.ts | 8 + .../wagmi/components/BaseNotification.svelte | 63 + src/lib/wagmi/components/Connect.svelte | 124 + src/lib/wagmi/components/Events.svelte | 21 + src/lib/wagmi/components/Link.svelte | 9 + src/lib/wagmi/components/LinkAddress.svelte | 12 + src/lib/wagmi/components/LinkTx.svelte | 25 + src/lib/wagmi/components/ViewEvents.svelte | 43 + src/lib/wagmi/components/index.ts | 7 + src/lib/wagmi/config.ts | 49 + src/lib/wagmi/ts/clickOutside.ts | 16 + src/lib/wagmi/ts/createBurnerConnector.ts | 178 ++ src/lib/wagmi/ts/getContractEvents.ts | 31 + src/lib/wagmi/ts/index.ts | 8 + src/lib/wagmi/ts/notification.ts | 58 + src/lib/wagmi/ts/readDeployments.ts | 85 + src/lib/wagmi/ts/types.ts | 12 + src/lib/wagmi/ts/utils.ts | 22 + src/lib/wagmi/ts/utils2.ts | 52 + src/routes/+layout.svelte | 51 +- src/routes/+page.svelte | 11 +- src/routes/counter/+page.svelte | 18 + static/_redirects | 1 + static/apple-touch-icon-precomposed.png | 1 + static/apple-touch-icon.png | 1 + static/burnerWallet.svg | 33 + static/coinbaseWallet.svg | 4 + static/favicon.ico | 1 + static/favicon.png | Bin 1571 -> 5745 bytes static/injected.svg | 6 + static/metaMask.svg | 1 + static/rabby.svg | 47 + static/safe.svg | 13 + static/thumbnail.jpg | Bin 0 -> 19855 bytes static/walletConnect.svg | 1 + tailwind.config.cjs | 96 + tailwind.config.ts | 11 - 53 files changed, 2358 insertions(+), 3343 deletions(-) create mode 100644 .envrc create mode 100644 src/app.pcss delete mode 100644 src/lib/config.ts delete mode 100644 src/lib/scaffold.config.ts create mode 100644 src/lib/test/Counter.svelte.ts create mode 100644 src/lib/wagmi/classes/Account.svelte.ts create mode 100644 src/lib/wagmi/classes/Address.svelte.ts create mode 100644 src/lib/wagmi/classes/Client.svelte.ts create mode 100644 src/lib/wagmi/classes/Events.svelte.ts create mode 100644 src/lib/wagmi/classes/Network.svelte.ts create mode 100644 src/lib/wagmi/classes/SmartContract.svelte.ts create mode 100644 src/lib/wagmi/classes/Wagmi.svelte.ts create mode 100644 src/lib/wagmi/classes/Watcher.svelte.ts create mode 100644 src/lib/wagmi/classes/index.ts create mode 100644 src/lib/wagmi/components/BaseNotification.svelte create mode 100644 src/lib/wagmi/components/Connect.svelte create mode 100644 src/lib/wagmi/components/Events.svelte create mode 100644 src/lib/wagmi/components/Link.svelte create mode 100644 src/lib/wagmi/components/LinkAddress.svelte create mode 100644 src/lib/wagmi/components/LinkTx.svelte create mode 100644 src/lib/wagmi/components/ViewEvents.svelte create mode 100644 src/lib/wagmi/components/index.ts create mode 100644 src/lib/wagmi/config.ts create mode 100644 src/lib/wagmi/ts/clickOutside.ts create mode 100644 src/lib/wagmi/ts/createBurnerConnector.ts create mode 100644 src/lib/wagmi/ts/getContractEvents.ts create mode 100644 src/lib/wagmi/ts/index.ts create mode 100644 src/lib/wagmi/ts/notification.ts create mode 100644 src/lib/wagmi/ts/readDeployments.ts create mode 100644 src/lib/wagmi/ts/types.ts create mode 100644 src/lib/wagmi/ts/utils.ts create mode 100644 src/lib/wagmi/ts/utils2.ts create mode 100644 src/routes/counter/+page.svelte create mode 100644 static/_redirects create mode 120000 static/apple-touch-icon-precomposed.png create mode 120000 static/apple-touch-icon.png create mode 100644 static/burnerWallet.svg create mode 100644 static/coinbaseWallet.svg create mode 120000 static/favicon.ico create mode 100644 static/injected.svg create mode 100644 static/metaMask.svg create mode 100644 static/rabby.svg create mode 100644 static/safe.svg create mode 100644 static/thumbnail.jpg create mode 100644 static/walletConnect.svg create mode 100644 tailwind.config.cjs delete mode 100644 tailwind.config.ts diff --git a/.envrc b/.envrc new file mode 100644 index 0000000..9580819 --- /dev/null +++ b/.envrc @@ -0,0 +1,13 @@ +keys=( + ALCHEMY_API_KEY + ETHERSCAN_API_KEY + PUBLIC_WALLET_CONNECT_PROJECT_ID +) + +for key in "${keys[@]}"; do + export $key=$(getSecret $key) +done + +export PUBLIC_ALCHEMY_API_KEY=$ALCHEMY_API_KEY +export PUBLIC_BURNER_WALLET_KEY=0x8b3a350cf5c34c9194ca85829a2df0ec3153be0318b5e2d3348e872092edffba + diff --git a/package.json b/package.json index 1d905b1..4234605 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "wagmi-svelte5", "private": true, - "version": "0.0.1", + "version": "0.1.0", "type": "module", "scripts": { "dev": "vite dev", @@ -19,27 +19,28 @@ "@eslint/compat": "^1.2.4", "@playwright/test": "^1.49.1", "@sveltejs/adapter-auto": "^3.3.1", - "@sveltejs/kit": "^2.12.1", - "@sveltejs/vite-plugin-svelte": "^5.0.2", - "@wagmi/connectors": "^5.7.0", - "@wagmi/core": "^2.16.0", + "@sveltejs/kit": "^2.15.0", + "@sveltejs/vite-plugin-svelte": "^4.0.4", + "@wagmi/connectors": "^5.7.3", + "@wagmi/core": "^2.16.3", "autoprefixer": "^10.4.20", + "daisyui": "^4.12.22", "eslint": "^9.17.0", "eslint-config-prettier": "^9.1.0", "eslint-plugin-svelte": "^2.46.1", - "globals": "^15.13.0", + "globals": "^15.14.0", "prettier": "^3.4.2", "prettier-plugin-svelte": "^3.3.2", "prettier-plugin-tailwindcss": "^0.6.9", - "svelte": "^5.14.2", + "svelte": "^5.15.0", "svelte-check": "^4.1.1", "svelte-hero-icons": "^5.2.0", "svelte-hot-french-toast": "^1.0.0", - "tailwindcss": "^3.4.16", + "tailwindcss": "^3.4.17", "typescript": "^5.7.2", - "typescript-eslint": "^8.18.1", - "viem": "^2.21.55", - "vite": "^6.0.3", + "typescript-eslint": "^8.18.2", + "viem": "^2.21.57", + "vite": "^5.4.11", "vitest": "^2.1.8" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e9497e3..8ee2d53 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,76 +10,79 @@ importers: devDependencies: '@eslint/compat': specifier: ^1.2.4 - version: 1.2.4(eslint@9.17.0(jiti@2.4.1)) + version: 1.2.4(eslint@9.17.0(jiti@2.4.2)) '@playwright/test': specifier: ^1.49.1 version: 1.49.1 '@sveltejs/adapter-auto': specifier: ^3.3.1 - version: 3.3.1(@sveltejs/kit@2.12.1(@sveltejs/vite-plugin-svelte@5.0.2(svelte@5.14.2)(vite@6.0.3(jiti@2.4.1)(yaml@2.6.1)))(svelte@5.14.2)(vite@6.0.3(jiti@2.4.1)(yaml@2.6.1))) + version: 3.3.1(@sveltejs/kit@2.15.0(@sveltejs/vite-plugin-svelte@4.0.4(svelte@5.15.0)(vite@5.4.11))(svelte@5.15.0)(vite@5.4.11)) '@sveltejs/kit': - specifier: ^2.12.1 - version: 2.12.1(@sveltejs/vite-plugin-svelte@5.0.2(svelte@5.14.2)(vite@6.0.3(jiti@2.4.1)(yaml@2.6.1)))(svelte@5.14.2)(vite@6.0.3(jiti@2.4.1)(yaml@2.6.1)) + specifier: ^2.15.0 + version: 2.15.0(@sveltejs/vite-plugin-svelte@4.0.4(svelte@5.15.0)(vite@5.4.11))(svelte@5.15.0)(vite@5.4.11) '@sveltejs/vite-plugin-svelte': - specifier: ^5.0.2 - version: 5.0.2(svelte@5.14.2)(vite@6.0.3(jiti@2.4.1)(yaml@2.6.1)) + specifier: ^4.0.4 + version: 4.0.4(svelte@5.15.0)(vite@5.4.11) '@wagmi/connectors': - specifier: ^5.7.0 - version: 5.7.0(@wagmi/core@2.16.0(react@18.3.1)(typescript@5.7.2)(use-sync-external-store@1.2.0(react@18.3.1))(viem@2.21.55(bufferutil@4.0.8)(typescript@5.7.2)(utf-8-validate@5.0.10)))(bufferutil@4.0.8)(react@18.3.1)(typescript@5.7.2)(utf-8-validate@5.0.10)(viem@2.21.55(bufferutil@4.0.8)(typescript@5.7.2)(utf-8-validate@5.0.10)) + specifier: ^5.7.3 + version: 5.7.3(@wagmi/core@2.16.3(react@18.3.1)(typescript@5.7.2)(use-sync-external-store@1.2.0(react@18.3.1))(viem@2.21.57(bufferutil@4.0.8)(typescript@5.7.2)(utf-8-validate@5.0.10)))(bufferutil@4.0.8)(react@18.3.1)(typescript@5.7.2)(utf-8-validate@5.0.10)(viem@2.21.57(bufferutil@4.0.8)(typescript@5.7.2)(utf-8-validate@5.0.10)) '@wagmi/core': - specifier: ^2.16.0 - version: 2.16.0(react@18.3.1)(typescript@5.7.2)(use-sync-external-store@1.2.0(react@18.3.1))(viem@2.21.55(bufferutil@4.0.8)(typescript@5.7.2)(utf-8-validate@5.0.10)) + specifier: ^2.16.3 + version: 2.16.3(react@18.3.1)(typescript@5.7.2)(use-sync-external-store@1.2.0(react@18.3.1))(viem@2.21.57(bufferutil@4.0.8)(typescript@5.7.2)(utf-8-validate@5.0.10)) autoprefixer: specifier: ^10.4.20 version: 10.4.20(postcss@8.4.49) + daisyui: + specifier: ^4.12.22 + version: 4.12.22(postcss@8.4.49) eslint: specifier: ^9.17.0 - version: 9.17.0(jiti@2.4.1) + version: 9.17.0(jiti@2.4.2) eslint-config-prettier: specifier: ^9.1.0 - version: 9.1.0(eslint@9.17.0(jiti@2.4.1)) + version: 9.1.0(eslint@9.17.0(jiti@2.4.2)) eslint-plugin-svelte: specifier: ^2.46.1 - version: 2.46.1(eslint@9.17.0(jiti@2.4.1))(svelte@5.14.2) + version: 2.46.1(eslint@9.17.0(jiti@2.4.2))(svelte@5.15.0) globals: - specifier: ^15.13.0 - version: 15.13.0 + specifier: ^15.14.0 + version: 15.14.0 prettier: specifier: ^3.4.2 version: 3.4.2 prettier-plugin-svelte: specifier: ^3.3.2 - version: 3.3.2(prettier@3.4.2)(svelte@5.14.2) + version: 3.3.2(prettier@3.4.2)(svelte@5.15.0) prettier-plugin-tailwindcss: specifier: ^0.6.9 - version: 0.6.9(prettier-plugin-svelte@3.3.2(prettier@3.4.2)(svelte@5.14.2))(prettier@3.4.2) + version: 0.6.9(prettier-plugin-svelte@3.3.2(prettier@3.4.2)(svelte@5.15.0))(prettier@3.4.2) svelte: - specifier: ^5.14.2 - version: 5.14.2 + specifier: ^5.15.0 + version: 5.15.0 svelte-check: specifier: ^4.1.1 - version: 4.1.1(svelte@5.14.2)(typescript@5.7.2) + version: 4.1.1(svelte@5.15.0)(typescript@5.7.2) svelte-hero-icons: specifier: ^5.2.0 - version: 5.2.0(svelte@5.14.2) + version: 5.2.0(svelte@5.15.0) svelte-hot-french-toast: specifier: ^1.0.0 - version: 1.0.0(svelte@5.14.2) + version: 1.0.0(svelte@5.15.0) tailwindcss: - specifier: ^3.4.16 - version: 3.4.16 + specifier: ^3.4.17 + version: 3.4.17 typescript: specifier: ^5.7.2 version: 5.7.2 typescript-eslint: - specifier: ^8.18.1 - version: 8.18.1(eslint@9.17.0(jiti@2.4.1))(typescript@5.7.2) + specifier: ^8.18.2 + version: 8.18.2(eslint@9.17.0(jiti@2.4.2))(typescript@5.7.2) viem: - specifier: ^2.21.55 - version: 2.21.55(bufferutil@4.0.8)(typescript@5.7.2)(utf-8-validate@5.0.10) + specifier: ^2.21.57 + version: 2.21.57(bufferutil@4.0.8)(typescript@5.7.2)(utf-8-validate@5.0.10) vite: - specifier: ^6.0.3 - version: 6.0.3(jiti@2.4.1)(yaml@2.6.1) + specifier: ^5.4.11 + version: 5.4.11 vitest: specifier: ^2.1.8 version: 2.1.8 @@ -119,282 +122,138 @@ packages: cpu: [ppc64] os: [aix] - '@esbuild/aix-ppc64@0.24.0': - resolution: {integrity: sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [aix] - '@esbuild/android-arm64@0.21.5': resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} engines: {node: '>=12'} cpu: [arm64] os: [android] - '@esbuild/android-arm64@0.24.0': - resolution: {integrity: sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w==} - engines: {node: '>=18'} - cpu: [arm64] - os: [android] - '@esbuild/android-arm@0.21.5': resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} engines: {node: '>=12'} cpu: [arm] os: [android] - '@esbuild/android-arm@0.24.0': - resolution: {integrity: sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew==} - engines: {node: '>=18'} - cpu: [arm] - os: [android] - '@esbuild/android-x64@0.21.5': resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} engines: {node: '>=12'} cpu: [x64] os: [android] - '@esbuild/android-x64@0.24.0': - resolution: {integrity: sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [android] - '@esbuild/darwin-arm64@0.21.5': resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} engines: {node: '>=12'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-arm64@0.24.0': - resolution: {integrity: sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw==} - engines: {node: '>=18'} - cpu: [arm64] - os: [darwin] - '@esbuild/darwin-x64@0.21.5': resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} engines: {node: '>=12'} cpu: [x64] os: [darwin] - '@esbuild/darwin-x64@0.24.0': - resolution: {integrity: sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA==} - engines: {node: '>=18'} - cpu: [x64] - os: [darwin] - '@esbuild/freebsd-arm64@0.21.5': resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} engines: {node: '>=12'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-arm64@0.24.0': - resolution: {integrity: sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA==} - engines: {node: '>=18'} - cpu: [arm64] - os: [freebsd] - '@esbuild/freebsd-x64@0.21.5': resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} engines: {node: '>=12'} cpu: [x64] os: [freebsd] - '@esbuild/freebsd-x64@0.24.0': - resolution: {integrity: sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [freebsd] - '@esbuild/linux-arm64@0.21.5': resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} engines: {node: '>=12'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm64@0.24.0': - resolution: {integrity: sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g==} - engines: {node: '>=18'} - cpu: [arm64] - os: [linux] - '@esbuild/linux-arm@0.21.5': resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} engines: {node: '>=12'} cpu: [arm] os: [linux] - '@esbuild/linux-arm@0.24.0': - resolution: {integrity: sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw==} - engines: {node: '>=18'} - cpu: [arm] - os: [linux] - '@esbuild/linux-ia32@0.21.5': resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} engines: {node: '>=12'} cpu: [ia32] os: [linux] - '@esbuild/linux-ia32@0.24.0': - resolution: {integrity: sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA==} - engines: {node: '>=18'} - cpu: [ia32] - os: [linux] - '@esbuild/linux-loong64@0.21.5': resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} engines: {node: '>=12'} cpu: [loong64] os: [linux] - '@esbuild/linux-loong64@0.24.0': - resolution: {integrity: sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g==} - engines: {node: '>=18'} - cpu: [loong64] - os: [linux] - '@esbuild/linux-mips64el@0.21.5': resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} engines: {node: '>=12'} cpu: [mips64el] os: [linux] - '@esbuild/linux-mips64el@0.24.0': - resolution: {integrity: sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA==} - engines: {node: '>=18'} - cpu: [mips64el] - os: [linux] - '@esbuild/linux-ppc64@0.21.5': resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} engines: {node: '>=12'} cpu: [ppc64] os: [linux] - '@esbuild/linux-ppc64@0.24.0': - resolution: {integrity: sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [linux] - '@esbuild/linux-riscv64@0.21.5': resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} engines: {node: '>=12'} cpu: [riscv64] os: [linux] - '@esbuild/linux-riscv64@0.24.0': - resolution: {integrity: sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw==} - engines: {node: '>=18'} - cpu: [riscv64] - os: [linux] - '@esbuild/linux-s390x@0.21.5': resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} engines: {node: '>=12'} cpu: [s390x] os: [linux] - '@esbuild/linux-s390x@0.24.0': - resolution: {integrity: sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g==} - engines: {node: '>=18'} - cpu: [s390x] - os: [linux] - '@esbuild/linux-x64@0.21.5': resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} engines: {node: '>=12'} cpu: [x64] os: [linux] - '@esbuild/linux-x64@0.24.0': - resolution: {integrity: sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA==} - engines: {node: '>=18'} - cpu: [x64] - os: [linux] - '@esbuild/netbsd-x64@0.21.5': resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] - '@esbuild/netbsd-x64@0.24.0': - resolution: {integrity: sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg==} - engines: {node: '>=18'} - cpu: [x64] - os: [netbsd] - - '@esbuild/openbsd-arm64@0.24.0': - resolution: {integrity: sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openbsd] - '@esbuild/openbsd-x64@0.21.5': resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} engines: {node: '>=12'} cpu: [x64] os: [openbsd] - '@esbuild/openbsd-x64@0.24.0': - resolution: {integrity: sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q==} - engines: {node: '>=18'} - cpu: [x64] - os: [openbsd] - '@esbuild/sunos-x64@0.21.5': resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} engines: {node: '>=12'} cpu: [x64] os: [sunos] - '@esbuild/sunos-x64@0.24.0': - resolution: {integrity: sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA==} - engines: {node: '>=18'} - cpu: [x64] - os: [sunos] - '@esbuild/win32-arm64@0.21.5': resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} engines: {node: '>=12'} cpu: [arm64] os: [win32] - '@esbuild/win32-arm64@0.24.0': - resolution: {integrity: sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA==} - engines: {node: '>=18'} - cpu: [arm64] - os: [win32] - '@esbuild/win32-ia32@0.21.5': resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} engines: {node: '>=12'} cpu: [ia32] os: [win32] - '@esbuild/win32-ia32@0.24.0': - resolution: {integrity: sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw==} - engines: {node: '>=18'} - cpu: [ia32] - os: [win32] - '@esbuild/win32-x64@0.21.5': resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} engines: {node: '>=12'} cpu: [x64] os: [win32] - '@esbuild/win32-x64@0.24.0': - resolution: {integrity: sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA==} - engines: {node: '>=18'} - cpu: [x64] - os: [win32] - '@eslint-community/eslint-utils@4.4.1': resolution: {integrity: sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -552,8 +411,8 @@ packages: '@metamask/sdk-install-modal-web@0.31.2': resolution: {integrity: sha512-KPv36kQjmTwErU8g2neuHHSgkD5+1hp4D6ERfk5Kc2r73aOYNCdG9wDGRUmFmcY2MKkeK1EuDyZfJ4FPU30fxQ==} - '@metamask/sdk@0.31.2': - resolution: {integrity: sha512-6MWON2g1j7XwAHWam4trusGxeyhQweNLEHPsfuIxSwcsXoEm08Jj80OglJxQI4KwjcDnjSWBkQGG3mmK6ug/cA==} + '@metamask/sdk@0.31.4': + resolution: {integrity: sha512-HLUN4IZGdyiy5YeebXmXi+ndpmrl6zslCQLdR2QHplIy4JmUL/eDyKNFiK7eBLVKXVVIDYFIb6g1iSEb+i8Kew==} '@metamask/superstruct@3.1.0': resolution: {integrity: sha512-N08M56HdOgBfRKkrgCMZvQppkZGcArEop3kixNEtVbJKm6P9Cfg0YkI6X0s1g78sNrj2fWUwvJADdZuzJgFttA==} @@ -734,98 +593,98 @@ packages: '@polka/url@1.0.0-next.28': resolution: {integrity: sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==} - '@rollup/rollup-android-arm-eabi@4.28.1': - resolution: {integrity: sha512-2aZp8AES04KI2dy3Ss6/MDjXbwBzj+i0GqKtWXgw2/Ma6E4jJvujryO6gJAghIRVz7Vwr9Gtl/8na3nDUKpraQ==} + '@rollup/rollup-android-arm-eabi@4.29.1': + resolution: {integrity: sha512-ssKhA8RNltTZLpG6/QNkCSge+7mBQGUqJRisZ2MDQcEGaK93QESEgWK2iOpIDZ7k9zPVkG5AS3ksvD5ZWxmItw==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.28.1': - resolution: {integrity: sha512-EbkK285O+1YMrg57xVA+Dp0tDBRB93/BZKph9XhMjezf6F4TpYjaUSuPt5J0fZXlSag0LmZAsTmdGGqPp4pQFA==} + '@rollup/rollup-android-arm64@4.29.1': + resolution: {integrity: sha512-CaRfrV0cd+NIIcVVN/jx+hVLN+VRqnuzLRmfmlzpOzB87ajixsN/+9L5xNmkaUUvEbI5BmIKS+XTwXsHEb65Ew==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.28.1': - resolution: {integrity: sha512-prduvrMKU6NzMq6nxzQw445zXgaDBbMQvmKSJaxpaZ5R1QDM8w+eGxo6Y/jhT/cLoCvnZI42oEqf9KQNYz1fqQ==} + '@rollup/rollup-darwin-arm64@4.29.1': + resolution: {integrity: sha512-2ORr7T31Y0Mnk6qNuwtyNmy14MunTAMx06VAPI6/Ju52W10zk1i7i5U3vlDRWjhOI5quBcrvhkCHyF76bI7kEw==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.28.1': - resolution: {integrity: sha512-WsvbOunsUk0wccO/TV4o7IKgloJ942hVFK1CLatwv6TJspcCZb9umQkPdvB7FihmdxgaKR5JyxDjWpCOp4uZlQ==} + '@rollup/rollup-darwin-x64@4.29.1': + resolution: {integrity: sha512-j/Ej1oanzPjmN0tirRd5K2/nncAhS9W6ICzgxV+9Y5ZsP0hiGhHJXZ2JQ53iSSjj8m6cRY6oB1GMzNn2EUt6Ng==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.28.1': - resolution: {integrity: sha512-HTDPdY1caUcU4qK23FeeGxCdJF64cKkqajU0iBnTVxS8F7H/7BewvYoG+va1KPSL63kQ1PGNyiwKOfReavzvNA==} + '@rollup/rollup-freebsd-arm64@4.29.1': + resolution: {integrity: sha512-91C//G6Dm/cv724tpt7nTyP+JdN12iqeXGFM1SqnljCmi5yTXriH7B1r8AD9dAZByHpKAumqP1Qy2vVNIdLZqw==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.28.1': - resolution: {integrity: sha512-m/uYasxkUevcFTeRSM9TeLyPe2QDuqtjkeoTpP9SW0XxUWfcYrGDMkO/m2tTw+4NMAF9P2fU3Mw4ahNvo7QmsQ==} + '@rollup/rollup-freebsd-x64@4.29.1': + resolution: {integrity: sha512-hEioiEQ9Dec2nIRoeHUP6hr1PSkXzQaCUyqBDQ9I9ik4gCXQZjJMIVzoNLBRGet+hIUb3CISMh9KXuCcWVW/8w==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.28.1': - resolution: {integrity: sha512-QAg11ZIt6mcmzpNE6JZBpKfJaKkqTm1A9+y9O+frdZJEuhQxiugM05gnCWiANHj4RmbgeVJpTdmKRmH/a+0QbA==} + '@rollup/rollup-linux-arm-gnueabihf@4.29.1': + resolution: {integrity: sha512-Py5vFd5HWYN9zxBv3WMrLAXY3yYJ6Q/aVERoeUFwiDGiMOWsMs7FokXihSOaT/PMWUty/Pj60XDQndK3eAfE6A==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.28.1': - resolution: {integrity: sha512-dRP9PEBfolq1dmMcFqbEPSd9VlRuVWEGSmbxVEfiq2cs2jlZAl0YNxFzAQS2OrQmsLBLAATDMb3Z6MFv5vOcXg==} + '@rollup/rollup-linux-arm-musleabihf@4.29.1': + resolution: {integrity: sha512-RiWpGgbayf7LUcuSNIbahr0ys2YnEERD4gYdISA06wa0i8RALrnzflh9Wxii7zQJEB2/Eh74dX4y/sHKLWp5uQ==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.28.1': - resolution: {integrity: sha512-uGr8khxO+CKT4XU8ZUH1TTEUtlktK6Kgtv0+6bIFSeiSlnGJHG1tSFSjm41uQ9sAO/5ULx9mWOz70jYLyv1QkA==} + '@rollup/rollup-linux-arm64-gnu@4.29.1': + resolution: {integrity: sha512-Z80O+taYxTQITWMjm/YqNoe9d10OX6kDh8X5/rFCMuPqsKsSyDilvfg+vd3iXIqtfmp+cnfL1UrYirkaF8SBZA==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.28.1': - resolution: {integrity: sha512-QF54q8MYGAqMLrX2t7tNpi01nvq5RI59UBNx+3+37zoKX5KViPo/gk2QLhsuqok05sSCRluj0D00LzCwBikb0A==} + '@rollup/rollup-linux-arm64-musl@4.29.1': + resolution: {integrity: sha512-fOHRtF9gahwJk3QVp01a/GqS4hBEZCV1oKglVVq13kcK3NeVlS4BwIFzOHDbmKzt3i0OuHG4zfRP0YoG5OF/rA==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-loongarch64-gnu@4.28.1': - resolution: {integrity: sha512-vPul4uodvWvLhRco2w0GcyZcdyBfpfDRgNKU+p35AWEbJ/HPs1tOUrkSueVbBS0RQHAf/A+nNtDpvw95PeVKOA==} + '@rollup/rollup-linux-loongarch64-gnu@4.29.1': + resolution: {integrity: sha512-5a7q3tnlbcg0OodyxcAdrrCxFi0DgXJSoOuidFUzHZ2GixZXQs6Tc3CHmlvqKAmOs5eRde+JJxeIf9DonkmYkw==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-powerpc64le-gnu@4.28.1': - resolution: {integrity: sha512-pTnTdBuC2+pt1Rmm2SV7JWRqzhYpEILML4PKODqLz+C7Ou2apEV52h19CR7es+u04KlqplggmN9sqZlekg3R1A==} + '@rollup/rollup-linux-powerpc64le-gnu@4.29.1': + resolution: {integrity: sha512-9b4Mg5Yfz6mRnlSPIdROcfw1BU22FQxmfjlp/CShWwO3LilKQuMISMTtAu/bxmmrE6A902W2cZJuzx8+gJ8e9w==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.28.1': - resolution: {integrity: sha512-vWXy1Nfg7TPBSuAncfInmAI/WZDd5vOklyLJDdIRKABcZWojNDY0NJwruY2AcnCLnRJKSaBgf/GiJfauu8cQZA==} + '@rollup/rollup-linux-riscv64-gnu@4.29.1': + resolution: {integrity: sha512-G5pn0NChlbRM8OJWpJFMX4/i8OEU538uiSv0P6roZcbpe/WfhEO+AT8SHVKfp8qhDQzaz7Q+1/ixMy7hBRidnQ==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.28.1': - resolution: {integrity: sha512-/yqC2Y53oZjb0yz8PVuGOQQNOTwxcizudunl/tFs1aLvObTclTwZ0JhXF2XcPT/zuaymemCDSuuUPXJJyqeDOg==} + '@rollup/rollup-linux-s390x-gnu@4.29.1': + resolution: {integrity: sha512-WM9lIkNdkhVwiArmLxFXpWndFGuOka4oJOZh8EP3Vb8q5lzdSCBuhjavJsw68Q9AKDGeOOIHYzYm4ZFvmWez5g==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.28.1': - resolution: {integrity: sha512-fzgeABz7rrAlKYB0y2kSEiURrI0691CSL0+KXwKwhxvj92VULEDQLpBYLHpF49MSiPG4sq5CK3qHMnb9tlCjBw==} + '@rollup/rollup-linux-x64-gnu@4.29.1': + resolution: {integrity: sha512-87xYCwb0cPGZFoGiErT1eDcssByaLX4fc0z2nRM6eMtV9njAfEE6OW3UniAoDhX4Iq5xQVpE6qO9aJbCFumKYQ==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.28.1': - resolution: {integrity: sha512-xQTDVzSGiMlSshpJCtudbWyRfLaNiVPXt1WgdWTwWz9n0U12cI2ZVtWe/Jgwyv/6wjL7b66uu61Vg0POWVfz4g==} + '@rollup/rollup-linux-x64-musl@4.29.1': + resolution: {integrity: sha512-xufkSNppNOdVRCEC4WKvlR1FBDyqCSCpQeMMgv9ZyXqqtKBfkw1yfGMTUTs9Qsl6WQbJnsGboWCp7pJGkeMhKA==} cpu: [x64] os: [linux] - '@rollup/rollup-win32-arm64-msvc@4.28.1': - resolution: {integrity: sha512-wSXmDRVupJstFP7elGMgv+2HqXelQhuNf+IS4V+nUpNVi/GUiBgDmfwD0UGN3pcAnWsgKG3I52wMOBnk1VHr/A==} + '@rollup/rollup-win32-arm64-msvc@4.29.1': + resolution: {integrity: sha512-F2OiJ42m77lSkizZQLuC+jiZ2cgueWQL5YC9tjo3AgaEw+KJmVxHGSyQfDUoYR9cci0lAywv2Clmckzulcq6ig==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.28.1': - resolution: {integrity: sha512-ZkyTJ/9vkgrE/Rk9vhMXhf8l9D+eAhbAVbsGsXKy2ohmJaWg0LPQLnIxRdRp/bKyr8tXuPlXhIoGlEB5XpJnGA==} + '@rollup/rollup-win32-ia32-msvc@4.29.1': + resolution: {integrity: sha512-rYRe5S0FcjlOBZQHgbTKNrqxCBUmgDJem/VQTCcTnA2KCabYSWQDrytOzX7avb79cAAweNmMUb/Zw18RNd4mng==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.28.1': - resolution: {integrity: sha512-ZvK2jBafvttJjoIdKm/Q/Bh7IJ1Ose9IBOwpOXcOvW3ikGTQGmKDgxTC6oCAzW6PynbkKP8+um1du81XJHZ0JA==} + '@rollup/rollup-win32-x64-msvc@4.29.1': + resolution: {integrity: sha512-+10CMg9vt1MoHj6x1pxyjPSMjHTIlqs8/tBztXvPAx24SKs9jwVnKqHJumlH/IzhaPUaj3T6T6wfZr8okdXaIg==} cpu: [x64] os: [win32] @@ -922,8 +781,8 @@ packages: peerDependencies: '@sveltejs/kit': ^2.0.0 - '@sveltejs/kit@2.12.1': - resolution: {integrity: sha512-M3rPijGImeOkI0DBJSwjqz+YFX2DyOf6NzWgHVk3mqpT06dlYCpcv5xh1q4rYEqB58yQlk4QA1Y35PUqnUiFKw==} + '@sveltejs/kit@2.15.0': + resolution: {integrity: sha512-FI1bhfhFNGI2sKg+BhiRyM4eaOvX+KZqRYSQqL5PK3ZZREX2xufZ6MzZAw79N846OnIxYNqcz/3VOUq+FPDd3w==} engines: {node: '>=18.13'} hasBin: true peerDependencies: @@ -931,20 +790,20 @@ packages: svelte: ^4.0.0 || ^5.0.0-next.0 vite: ^5.0.3 || ^6.0.0 - '@sveltejs/vite-plugin-svelte-inspector@4.0.1': - resolution: {integrity: sha512-J/Nmb2Q2y7mck2hyCX4ckVHcR5tu2J+MtBEQqpDrrgELZ2uvraQcK/ioCV61AqkdXFgriksOKIceDcQmqnGhVw==} + '@sveltejs/vite-plugin-svelte-inspector@3.0.1': + resolution: {integrity: sha512-2CKypmj1sM4GE7HjllT7UKmo4Q6L5xFRd7VMGEWhYnZ+wc6AUVU01IBd7yUi6WnFndEwWoMNOd6e8UjoN0nbvQ==} engines: {node: ^18.0.0 || ^20.0.0 || >=22} peerDependencies: - '@sveltejs/vite-plugin-svelte': ^5.0.0 - svelte: ^5.0.0 - vite: ^6.0.0 + '@sveltejs/vite-plugin-svelte': ^4.0.0-next.0||^4.0.0 + svelte: ^5.0.0-next.96 || ^5.0.0 + vite: ^5.0.0 - '@sveltejs/vite-plugin-svelte@5.0.2': - resolution: {integrity: sha512-GElAxQMlznx1pRdodtkmiyBZcjlaJntJ8APa2hBhnbUAJqKAFGdmwjRPJhh+2DMxwARRLBzQIs/iZ5EbR4X/og==} + '@sveltejs/vite-plugin-svelte@4.0.4': + resolution: {integrity: sha512-0ba1RQ/PHen5FGpdSrW7Y3fAMQjrXantECALeOiOdBdzR5+5vPP6HVZRLmZaQL+W8m++o+haIAKq5qT+MiZ7VA==} engines: {node: ^18.0.0 || ^20.0.0 || >=22} peerDependencies: - svelte: ^5.0.0 - vite: ^6.0.0 + svelte: ^5.0.0-next.96 || ^5.0.0 + vite: ^5.0.0 '@types/cookie@0.6.0': resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==} @@ -964,51 +823,51 @@ packages: '@types/trusted-types@2.0.7': resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} - '@typescript-eslint/eslint-plugin@8.18.1': - resolution: {integrity: sha512-Ncvsq5CT3Gvh+uJG0Lwlho6suwDfUXH0HztslDf5I+F2wAFAZMRwYLEorumpKLzmO2suAXZ/td1tBg4NZIi9CQ==} + '@typescript-eslint/eslint-plugin@8.18.2': + resolution: {integrity: sha512-adig4SzPLjeQ0Tm+jvsozSGiCliI2ajeURDGHjZ2llnA+A67HihCQ+a3amtPhUakd1GlwHxSRvzOZktbEvhPPg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/parser@8.18.1': - resolution: {integrity: sha512-rBnTWHCdbYM2lh7hjyXqxk70wvon3p2FyaniZuey5TrcGBpfhVp0OxOa6gxr9Q9YhZFKyfbEnxc24ZnVbbUkCA==} + '@typescript-eslint/parser@8.18.2': + resolution: {integrity: sha512-y7tcq4StgxQD4mDr9+Jb26dZ+HTZ/SkfqpXSiqeUXZHxOUyjWDKsmwKhJ0/tApR08DgOhrFAoAhyB80/p3ViuA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/scope-manager@8.18.1': - resolution: {integrity: sha512-HxfHo2b090M5s2+/9Z3gkBhI6xBH8OJCFjH9MhQ+nnoZqxU3wNxkLT+VWXWSFWc3UF3Z+CfPAyqdCTdoXtDPCQ==} + '@typescript-eslint/scope-manager@8.18.2': + resolution: {integrity: sha512-YJFSfbd0CJjy14r/EvWapYgV4R5CHzptssoag2M7y3Ra7XNta6GPAJPPP5KGB9j14viYXyrzRO5GkX7CRfo8/g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/type-utils@8.18.1': - resolution: {integrity: sha512-jAhTdK/Qx2NJPNOTxXpMwlOiSymtR2j283TtPqXkKBdH8OAMmhiUfP0kJjc/qSE51Xrq02Gj9NY7MwK+UxVwHQ==} + '@typescript-eslint/type-utils@8.18.2': + resolution: {integrity: sha512-AB/Wr1Lz31bzHfGm/jgbFR0VB0SML/hd2P1yxzKDM48YmP7vbyJNHRExUE/wZsQj2wUCvbWH8poNHFuxLqCTnA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/types@8.18.1': - resolution: {integrity: sha512-7uoAUsCj66qdNQNpH2G8MyTFlgerum8ubf21s3TSM3XmKXuIn+H2Sifh/ES2nPOPiYSRJWAk0fDkW0APBWcpfw==} + '@typescript-eslint/types@8.18.2': + resolution: {integrity: sha512-Z/zblEPp8cIvmEn6+tPDIHUbRu/0z5lqZ+NvolL5SvXWT5rQy7+Nch83M0++XzO0XrWRFWECgOAyE8bsJTl1GQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.18.1': - resolution: {integrity: sha512-z8U21WI5txzl2XYOW7i9hJhxoKKNG1kcU4RzyNvKrdZDmbjkmLBo8bgeiOJmA06kizLI76/CCBAAGlTlEeUfyg==} + '@typescript-eslint/typescript-estree@8.18.2': + resolution: {integrity: sha512-WXAVt595HjpmlfH4crSdM/1bcsqh+1weFRWIa9XMTx/XHZ9TCKMcr725tLYqWOgzKdeDrqVHxFotrvWcEsk2Tg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/utils@8.18.1': - resolution: {integrity: sha512-8vikiIj2ebrC4WRdcAdDcmnu9Q/MXXwg+STf40BVfT8exDqBCUPdypvzcUPxEqRGKg9ALagZ0UWcYCtn+4W2iQ==} + '@typescript-eslint/utils@8.18.2': + resolution: {integrity: sha512-Cr4A0H7DtVIPkauj4sTSXVl+VBWewE9/o40KcF3TV9aqDEOWoXF3/+oRXNby3DYzZeCATvbdksYsGZzplwnK/Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/visitor-keys@8.18.1': - resolution: {integrity: sha512-Vj0WLm5/ZsD013YeUKn+K0y8p1M0jPpxOkKdbD1wB0ns53a5piVY02zjf072TblEweAbcYiFiPoSMF3kp+VhhQ==} + '@typescript-eslint/visitor-keys@8.18.2': + resolution: {integrity: sha512-zORcwn4C3trOWiCqFQP1x6G3xTRyZ1LYydnj51cRnJ6hxBlr/cKPckk+PKPUw/fXmvfKTcw7bwY3w9izgx5jZw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@vitest/expect@2.1.8': @@ -1040,18 +899,18 @@ packages: '@vitest/utils@2.1.8': resolution: {integrity: sha512-dwSoui6djdwbfFmIgbIjX2ZhIoG7Ex/+xpxyiEgIGzjliY8xGkcpITKTlp6B4MgtGkF2ilvm97cPM96XZaAgcA==} - '@wagmi/connectors@5.7.0': - resolution: {integrity: sha512-cPMmHBGw28fll7VQJC9iF6ngdQ17STTzspqRIjlTkz44zhjwMTf7shw+JJUmqw+0uK7DqRbf/xUHlZE2IVd2mg==} + '@wagmi/connectors@5.7.3': + resolution: {integrity: sha512-i7Gk5M/Fc9gMvkVHbqw2kGtXvY8POsSY798/9I5npyglVjBddxoVk3xTYmcYTB1VIa4Fi0T2gLTHpQnpLrq1CQ==} peerDependencies: - '@wagmi/core': 2.16.0 + '@wagmi/core': 2.16.3 typescript: '>=5.0.4' viem: 2.x peerDependenciesMeta: typescript: optional: true - '@wagmi/core@2.16.0': - resolution: {integrity: sha512-sy4n7Jv6YCbT2jp4zQ/9H6l0A8StsN7P8mm2BRuODgW2w6Fj4j6h2xgYJD2tIjJHkLU/nvPJ7audZ55X7XQU/g==} + '@wagmi/core@2.16.3': + resolution: {integrity: sha512-SVovoWHaQ2AIkmGf+ucNijT6AHXcTMffFcLmcFF6++y21x+ge7Gkh3UoJiU91SDDv8n08eTQ9jbyia3GEgU5jQ==} peerDependencies: '@tanstack/query-core': '>=5.0.0' typescript: '>=5.0.4' @@ -1303,8 +1162,8 @@ packages: resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} engines: {node: '>=6'} - caniuse-lite@1.0.30001689: - resolution: {integrity: sha512-CmeR2VBycfa+5/jOfnp/NpWPGd06nf1XYiefUvhXFfZE4GkRc9jv+eGPS4nT558WS/8lYCzV8SlANCIPvbWP1g==} + caniuse-lite@1.0.30001690: + resolution: {integrity: sha512-5ExiE3qQN6oF8Clf8ifIDcMRCRE/dMGcETG/XGMD8/XiXm6HXQgQTh1yZYLXXpSOsEUlJm1Xr7kGULZTuGtP/w==} chai@5.1.2: resolution: {integrity: sha512-aGtmf24DW6MLHHG5gCx4zaI3uBq3KRtxeVs0DjFH6Z0rDNbsvTxFASFvdj79pxjxZ8/5u3PIiN3IwEIQkiiuPw==} @@ -1322,8 +1181,8 @@ packages: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} - chokidar@4.0.2: - resolution: {integrity: sha512-/b57FK+bblSU+dfewfFe0rT1YjVDfOmeLQwCAuC+vwvgLkXboATqqmy+Ipux6JrF6L5joe5CBnFOw+gLWH6yKg==} + chokidar@4.0.3: + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} engines: {node: '>= 14.16.0'} citty@0.1.6: @@ -1357,8 +1216,8 @@ packages: confbox@0.1.8: resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} - consola@3.2.3: - resolution: {integrity: sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==} + consola@3.3.1: + resolution: {integrity: sha512-GyKnPG3/I+a4RtJxgHquJXWr70g9I3c4NT3dvqh0LPHQP2nZFQBOBszb7a5u/pGzqr40AKplQA6UxM1BSynSXg==} engines: {node: ^14.18.0 || >=16.10.0} cookie-es@1.2.2: @@ -1376,11 +1235,11 @@ packages: engines: {node: '>=0.8'} hasBin: true - cross-fetch@3.1.8: - resolution: {integrity: sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==} + cross-fetch@3.2.0: + resolution: {integrity: sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q==} - cross-fetch@4.0.0: - resolution: {integrity: sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==} + cross-fetch@4.1.0: + resolution: {integrity: sha512-uKm5PU+MHTootlWEY+mZ4vvXoCn4fLQxT9dSc1sXVMSFkINTJVN8cAQROpwcKm8bJ/c7rgZVIBWzH5T78sNZZw==} cross-spawn@7.0.6: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} @@ -1389,11 +1248,22 @@ packages: crossws@0.3.1: resolution: {integrity: sha512-HsZgeVYaG+b5zA+9PbIPGq4+J/CJynJuearykPsXx4V/eMhyQ5EDVg3Ak2FBZtVXCiOLu/U7IiwDHTr9MA+IKw==} + css-selector-tokenizer@0.8.0: + resolution: {integrity: sha512-Jd6Ig3/pe62/qe5SBPTN8h8LeUg/pT4lLgtavPf7updwwHpvFzxvOQBHYj2LZDMjUnBzgvIUSjRcf6oT5HzHFg==} + cssesc@3.0.0: resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} engines: {node: '>=4'} hasBin: true + culori@3.3.0: + resolution: {integrity: sha512-pHJg+jbuFsCjz9iclQBqyL3B2HLCBF71BwVNujUYEvCeQMvV97R59MNK3R2+jgJ3a1fcZgI9B3vYgz8lzr/BFQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + daisyui@4.12.22: + resolution: {integrity: sha512-HDLWbmTnXxhE1MrMgSWjVgdRt+bVYHvfNbW3GTsyIokRSqTHonUTrxV3RhpPDjGIWaHt+ELtDCTYCtUFgL2/Nw==} + engines: {node: '>=16.9.0'} + date-fns@2.30.0: resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} engines: {node: '>=0.11'} @@ -1475,12 +1345,12 @@ packages: eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - eciesjs@0.4.12: - resolution: {integrity: sha512-DGejvMCihsRAmKRFQiL6KZDE34vWVd0gvXlykFq1aEzJy/rD65AVyAIUZKZOvgvaP9ATQRcHGEZV5DfgrgjA4w==} + eciesjs@0.4.13: + resolution: {integrity: sha512-zBdtR4K+wbj10bWPpIOF9DW+eFYQu8miU5ypunh0t4Bvt83ZPlEWgT5Dq/0G6uwEXumZKjfb5BZxYUZQ2Hzn/Q==} engines: {bun: '>=1', deno: '>=2', node: '>=16'} - electron-to-chromium@1.5.74: - resolution: {integrity: sha512-ck3//9RC+6oss/1Bh9tiAVFy5vfSKbRHAFh7Z3/eTRkEqJeWgymloShB17Vg3Z4nmDNp35vAd1BZ6CMW4Wt6Iw==} + electron-to-chromium@1.5.76: + resolution: {integrity: sha512-CjVQyG7n7Sr+eBXE86HIulnL5N8xZY1sgmOPGuq/F0Rr0FJq63lg0kEtOIDfZBk44FnDLf6FUJ+dsJcuiUDdDQ==} elliptic@6.6.1: resolution: {integrity: sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==} @@ -1524,11 +1394,6 @@ packages: engines: {node: '>=12'} hasBin: true - esbuild@0.24.0: - resolution: {integrity: sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ==} - engines: {node: '>=18'} - hasBin: true - escalade@3.2.0: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} @@ -1600,8 +1465,8 @@ packages: resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} engines: {node: '>=0.10'} - esrap@1.2.3: - resolution: {integrity: sha512-ZlQmCCK+n7SGoqo7DnfKaP1sJZa49P01/dXzmjCASSo04p72w8EksT2NMK8CEX8DhKsfJXANioIw8VyHNsBfvQ==} + esrap@1.3.2: + resolution: {integrity: sha512-C4PXusxYhFT98GjLSmb20k9PREuUdporer50dhzGuJu9IJXktbMddVCMLAERl5dAHyAi73GWWCE4FVHGP1794g==} esrecurse@4.3.0: resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} @@ -1677,8 +1542,11 @@ packages: fast-safe-stringify@2.1.1: resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} - fastq@1.17.1: - resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + fastparse@1.1.2: + resolution: {integrity: sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==} + + fastq@1.18.0: + resolution: {integrity: sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==} fdir@6.4.2: resolution: {integrity: sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ==} @@ -1769,8 +1637,8 @@ packages: resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} engines: {node: '>=18'} - globals@15.13.0: - resolution: {integrity: sha512-49TewVEz0UxZjr1WYYsWpPrhyC/B/pA8Bq0fUmet2n+eR7yn0IvNzNaoBwnK6mdkzcN+se7Ez9zUgULTz2QH4g==} + globals@15.14.0: + resolution: {integrity: sha512-OkToC372DtlQeje9/zHIo5CT8lRP/FUgEOKBEhU4e0abL7J7CD24fD9ohiLN5hagG/kWCYj4K5oaxxtj2Z0Dig==} engines: {node: '>=18'} globalyzer@0.1.0: @@ -1864,8 +1732,8 @@ packages: resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} engines: {node: '>= 0.4'} - is-core-module@2.16.0: - resolution: {integrity: sha512-urTSINYfAYgcbLb0yDQ6egFm6h3Mo1DcF9EkyXSRjjzdHbsulg01qhwWuXdOoUBuTkbQ80KDboXa0vFJ+BDH+g==} + is-core-module@2.16.1: + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} engines: {node: '>= 0.4'} is-docker@3.0.0: @@ -1909,8 +1777,8 @@ packages: resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - is-typed-array@1.1.13: - resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} + is-typed-array@1.1.15: + resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} engines: {node: '>= 0.4'} is-wsl@3.1.0: @@ -1935,12 +1803,12 @@ packages: jackspeak@3.4.3: resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} - jiti@1.21.6: - resolution: {integrity: sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==} + jiti@1.21.7: + resolution: {integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==} hasBin: true - jiti@2.4.1: - resolution: {integrity: sha512-yPBThwecp1wS9DmoA4x4KR2h3QoslacnDR8ypuFM962kI4/456Iy1oHx2RAgh4jfZNdn0bctsdadceiBUgpU1g==} + jiti@2.4.2: + resolution: {integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==} hasBin: true js-tokens@4.0.0: @@ -2041,8 +1909,8 @@ packages: magic-string@0.30.17: resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} - math-intrinsics@1.0.0: - resolution: {integrity: sha512-4MqMiKP90ybymYvsut0CH2g4XWbfLtmlCkXmtmdcDCxNB+mQcu1w/1+L/VD7vi/PSv7X2JYV7SCcR+jiPXnQtA==} + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} engines: {node: '>= 0.4'} merge-stream@2.0.0: @@ -2380,8 +2248,8 @@ packages: resolution: {integrity: sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==} engines: {node: ^10 || ^12 || >=14} - preact@10.25.2: - resolution: {integrity: sha512-GEts1EH3oMnqdOIeXhlbBSddZ9nrINd070WBOiPO2ous1orrKGUM4SMDbwyjSWD1iMS2dBvaDjAa5qUhz3TXqw==} + preact@10.25.3: + resolution: {integrity: sha512-dzQmIFtM970z+fP9ziQ3yG4e3ULIbwZzJ734vaMVUTaKQ2+Ru1Ou/gjshOYVHCcd1rpAelC6ngjvjDXph98unQ==} prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} @@ -2527,16 +2395,17 @@ packages: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} - resolve@1.22.9: - resolution: {integrity: sha512-QxrmX1DzraFIi9PxdG5VkRfRwIgjwyud+z/iBwfRRrVmHc+P9Q7u2lSSpQ6bjr2gy5lrqIiU9vb6iAeGf2400A==} + resolve@1.22.10: + resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} + engines: {node: '>= 0.4'} hasBin: true reusify@1.0.4: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - rollup@4.28.1: - resolution: {integrity: sha512-61fXYl/qNVinKmGSTHAZ6Yy8I3YIJC/r2m9feHo6SwVAVcLT5MPwOUFe7EuURA/4m0NR8lXG4BBXuo/IZEsjMg==} + rollup@4.29.1: + resolution: {integrity: sha512-RaJ45M/kmJUzSWDs1Nnd5DdV4eerC98idtUOVr6FfKcgxqvjwHmxc5upLF9qZU9EpsVzzhleFahrT3shLuJzIw==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -2706,16 +2575,16 @@ packages: peerDependencies: svelte: '>= 5' - svelte@5.14.2: - resolution: {integrity: sha512-OxNh82bYjbutXNSZSPQspZzzmVzlRyNbiz0a6KrpOWvQ9LBUUZifXyeKhfl73LgyQC9UbsnVS9M55nQzqekMTA==} + svelte@5.15.0: + resolution: {integrity: sha512-YWl8rAd4hSjERLtLvP6h2pflGtmrJwv+L12BgrOtHYJCpvLS9WKp/YNAdyolw3FymXtcYZqhSWvWlu5O1X7tgQ==} engines: {node: '>=18'} system-architecture@0.1.0: resolution: {integrity: sha512-ulAk51I9UVUyJgxlv9M6lFot2WP3e7t8Kz9+IS6D4rVba1tR9kON+Ey69f+1R4Q8cd45Lod6a4IcJIxnzGc/zA==} engines: {node: '>=18'} - tailwindcss@3.4.16: - resolution: {integrity: sha512-TI4Cyx7gDiZ6r44ewaJmt0o6BrMCT5aK5e0rmJ/G9Xq3w7CX/5VXl/zIPEJZFUK5VEqwByyhqNPycPlvcK4ZNw==} + tailwindcss@3.4.17: + resolution: {integrity: sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==} engines: {node: '>=14.0.0'} hasBin: true @@ -2780,8 +2649,8 @@ packages: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} - typescript-eslint@8.18.1: - resolution: {integrity: sha512-Mlaw6yxuaDEPQvb/2Qwu3/TfgeBHy9iTJ3mTwe7OvpPmF6KPQjVOfGyEJpPv6Ez2C34OODChhXrzYw/9phI0MQ==} + typescript-eslint@8.18.2: + resolution: {integrity: sha512-KuXezG6jHkvC3MvizeXgupZzaG5wjhU3yE8E7e6viOvAvD9xAWYp8/vy0WULTGe9DYDWcQu7aW03YIV3mSitrQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -2804,22 +2673,27 @@ packages: unenv@1.10.0: resolution: {integrity: sha512-wY5bskBQFL9n3Eca5XnhH6KbUo/tfvkwm9OpcdCvLaeA7piBNbavbOKJySEwQ1V0RH6HvNlSAFRTpvTqgKRQXQ==} - unstorage@1.13.1: - resolution: {integrity: sha512-ELexQHUrG05QVIM/iUeQNdl9FXDZhqLJ4yP59fnmn2jGUh0TEulwOgov1ubOb3Gt2ZGK/VMchJwPDNVEGWQpRg==} + unstorage@1.14.1: + resolution: {integrity: sha512-0MBKpoVhNLL/Ixvue9lIsrHkwwWW9/f3TRftsYu1R7nZJJyHSdgPMBDjny2op07nirnS3OX6H3u+YDFGld+1Bg==} peerDependencies: - '@azure/app-configuration': ^1.7.0 - '@azure/cosmos': ^4.1.1 - '@azure/data-tables': ^13.2.2 + '@azure/app-configuration': ^1.8.0 + '@azure/cosmos': ^4.2.0 + '@azure/data-tables': ^13.3.0 '@azure/identity': ^4.5.0 '@azure/keyvault-secrets': ^4.9.0 - '@azure/storage-blob': ^12.25.0 - '@capacitor/preferences': ^6.0.2 + '@azure/storage-blob': ^12.26.0 + '@capacitor/preferences': ^6.0.3 + '@deno/kv': '>=0.8.4' '@netlify/blobs': ^6.5.0 || ^7.0.0 || ^8.1.0 '@planetscale/database': ^1.19.0 '@upstash/redis': ^1.34.3 + '@vercel/blob': '>=0.27.0' '@vercel/kv': ^1.0.1 + aws4fetch: ^1.0.20 + db0: '>=0.2.1' idb-keyval: ^6.2.1 ioredis: ^5.4.1 + uploadthing: ^7.4.1 peerDependenciesMeta: '@azure/app-configuration': optional: true @@ -2835,18 +2709,28 @@ packages: optional: true '@capacitor/preferences': optional: true + '@deno/kv': + optional: true '@netlify/blobs': optional: true '@planetscale/database': optional: true '@upstash/redis': optional: true + '@vercel/blob': + optional: true '@vercel/kv': optional: true + aws4fetch: + optional: true + db0: + optional: true idb-keyval: optional: true ioredis: optional: true + uploadthing: + optional: true untun@0.1.3: resolution: {integrity: sha512-4luGP9LMYszMRZwsvyUd9MrxgEGZdZuZgpVQHEEX0lCYFESasVRvZd0EYpCkOIbJKHMuv0LskpXc/8Un+MJzEQ==} @@ -2899,8 +2783,8 @@ packages: react: optional: true - viem@2.21.55: - resolution: {integrity: sha512-PgXew7C11cAuEtOSgRyQx2kJxEOPUwIwZA9dMglRByqJuFVA7wSGZZOOo/93iylAA8E15bEdqy9xulU3oKZ70Q==} + viem@2.21.57: + resolution: {integrity: sha512-Mw4f4Dw0+Y/wSHdynVmP4uh+Cw15HEoj8BOKvKH5nGA6oFZYRxSy9Ruu7ZG8jexeAVCZ57aIuXb0gNg6Vb1x0g==} peerDependencies: typescript: '>=5.0.4' peerDependenciesMeta: @@ -2943,46 +2827,6 @@ packages: terser: optional: true - vite@6.0.3: - resolution: {integrity: sha512-Cmuo5P0ENTN6HxLSo6IHsjCLn/81Vgrp81oaiFFMRa8gGDj5xEjIcEpf2ZymZtZR8oU0P2JX5WuUp/rlXcHkAw==} - engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} - hasBin: true - peerDependencies: - '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 - jiti: '>=1.21.0' - less: '*' - lightningcss: ^1.21.0 - sass: '*' - sass-embedded: '*' - stylus: '*' - sugarss: '*' - terser: ^5.16.0 - tsx: ^4.8.1 - yaml: ^2.4.2 - peerDependenciesMeta: - '@types/node': - optional: true - jiti: - optional: true - less: - optional: true - lightningcss: - optional: true - sass: - optional: true - sass-embedded: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - tsx: - optional: true - yaml: - optional: true - vitefu@1.0.4: resolution: {integrity: sha512-y6zEE3PQf6uu/Mt6DTJ9ih+kyJLr4XcSgHR2zUkM8SWDhuixEJxfJ6CZGMHh1Ec3vPLoEA0IHU5oWzVqw8ulow==} peerDependencies: @@ -3031,8 +2875,8 @@ packages: which-module@2.0.1: resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} - which-typed-array@1.1.16: - resolution: {integrity: sha512-g+N+GAWiRj66DngFwHvISJd+ITsyphZvD1vChfVg6cEdnzy53GzB3oy0fUNlvhz7H7+MiqhYr26qxQShCpKTTQ==} + which-typed-array@1.1.18: + resolution: {integrity: sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA==} engines: {node: '>= 0.4'} which@2.0.2: @@ -3177,7 +3021,7 @@ snapshots: eth-json-rpc-filters: 6.0.1 eventemitter3: 5.0.1 keccak: 3.0.4 - preact: 10.25.2 + preact: 10.25.3 sha.js: 2.4.11 transitivePeerDependencies: - supports-color @@ -3187,7 +3031,7 @@ snapshots: '@noble/hashes': 1.6.1 clsx: 1.2.1 eventemitter3: 5.0.1 - preact: 10.25.2 + preact: 10.25.3 '@ecies/ciphers@0.2.2(@noble/ciphers@1.1.3)': dependencies: @@ -3196,154 +3040,82 @@ snapshots: '@esbuild/aix-ppc64@0.21.5': optional: true - '@esbuild/aix-ppc64@0.24.0': - optional: true - '@esbuild/android-arm64@0.21.5': optional: true - '@esbuild/android-arm64@0.24.0': - optional: true - '@esbuild/android-arm@0.21.5': optional: true - '@esbuild/android-arm@0.24.0': - optional: true - '@esbuild/android-x64@0.21.5': optional: true - '@esbuild/android-x64@0.24.0': - optional: true - '@esbuild/darwin-arm64@0.21.5': optional: true - '@esbuild/darwin-arm64@0.24.0': - optional: true - '@esbuild/darwin-x64@0.21.5': optional: true - '@esbuild/darwin-x64@0.24.0': - optional: true - '@esbuild/freebsd-arm64@0.21.5': optional: true - '@esbuild/freebsd-arm64@0.24.0': - optional: true - '@esbuild/freebsd-x64@0.21.5': optional: true - '@esbuild/freebsd-x64@0.24.0': - optional: true - '@esbuild/linux-arm64@0.21.5': optional: true - '@esbuild/linux-arm64@0.24.0': - optional: true - '@esbuild/linux-arm@0.21.5': optional: true - '@esbuild/linux-arm@0.24.0': - optional: true - '@esbuild/linux-ia32@0.21.5': optional: true - '@esbuild/linux-ia32@0.24.0': - optional: true - '@esbuild/linux-loong64@0.21.5': optional: true - '@esbuild/linux-loong64@0.24.0': - optional: true - '@esbuild/linux-mips64el@0.21.5': optional: true - '@esbuild/linux-mips64el@0.24.0': - optional: true - '@esbuild/linux-ppc64@0.21.5': optional: true - '@esbuild/linux-ppc64@0.24.0': - optional: true - '@esbuild/linux-riscv64@0.21.5': optional: true - '@esbuild/linux-riscv64@0.24.0': - optional: true - '@esbuild/linux-s390x@0.21.5': optional: true - '@esbuild/linux-s390x@0.24.0': - optional: true - '@esbuild/linux-x64@0.21.5': optional: true - '@esbuild/linux-x64@0.24.0': - optional: true - '@esbuild/netbsd-x64@0.21.5': optional: true - '@esbuild/netbsd-x64@0.24.0': - optional: true - - '@esbuild/openbsd-arm64@0.24.0': - optional: true - '@esbuild/openbsd-x64@0.21.5': optional: true - '@esbuild/openbsd-x64@0.24.0': - optional: true - '@esbuild/sunos-x64@0.21.5': optional: true - '@esbuild/sunos-x64@0.24.0': - optional: true - '@esbuild/win32-arm64@0.21.5': optional: true - '@esbuild/win32-arm64@0.24.0': - optional: true - '@esbuild/win32-ia32@0.21.5': optional: true - '@esbuild/win32-ia32@0.24.0': - optional: true - '@esbuild/win32-x64@0.21.5': optional: true - '@esbuild/win32-x64@0.24.0': - optional: true - - '@eslint-community/eslint-utils@4.4.1(eslint@9.17.0(jiti@2.4.1))': + '@eslint-community/eslint-utils@4.4.1(eslint@9.17.0(jiti@2.4.2))': dependencies: - eslint: 9.17.0(jiti@2.4.1) + eslint: 9.17.0(jiti@2.4.2) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.1': {} - '@eslint/compat@1.2.4(eslint@9.17.0(jiti@2.4.1))': + '@eslint/compat@1.2.4(eslint@9.17.0(jiti@2.4.2))': optionalDependencies: - eslint: 9.17.0(jiti@2.4.1) + eslint: 9.17.0(jiti@2.4.2) '@eslint/config-array@0.19.1': dependencies: @@ -3514,13 +3286,13 @@ snapshots: '@metamask/safe-event-emitter@3.1.2': {} - '@metamask/sdk-communication-layer@0.31.0(cross-fetch@4.0.0)(eciesjs@0.4.12)(eventemitter2@6.4.9)(readable-stream@3.6.2)(socket.io-client@4.8.1(bufferutil@4.0.8)(utf-8-validate@5.0.10))': + '@metamask/sdk-communication-layer@0.31.0(cross-fetch@4.1.0)(eciesjs@0.4.13)(eventemitter2@6.4.9)(readable-stream@3.6.2)(socket.io-client@4.8.1(bufferutil@4.0.8)(utf-8-validate@5.0.10))': dependencies: bufferutil: 4.0.8 - cross-fetch: 4.0.0 + cross-fetch: 4.1.0 date-fns: 2.30.0 debug: 4.4.0 - eciesjs: 0.4.12 + eciesjs: 0.4.13 eventemitter2: 6.4.9 readable-stream: 3.6.2 socket.io-client: 4.8.1(bufferutil@4.0.8)(utf-8-validate@5.0.10) @@ -3533,18 +3305,18 @@ snapshots: dependencies: '@paulmillr/qr': 0.2.1 - '@metamask/sdk@0.31.2(bufferutil@4.0.8)(utf-8-validate@5.0.10)': + '@metamask/sdk@0.31.4(bufferutil@4.0.8)(utf-8-validate@5.0.10)': dependencies: '@babel/runtime': 7.26.0 '@metamask/onboarding': 1.0.1 '@metamask/providers': 16.1.0 - '@metamask/sdk-communication-layer': 0.31.0(cross-fetch@4.0.0)(eciesjs@0.4.12)(eventemitter2@6.4.9)(readable-stream@3.6.2)(socket.io-client@4.8.1(bufferutil@4.0.8)(utf-8-validate@5.0.10)) + '@metamask/sdk-communication-layer': 0.31.0(cross-fetch@4.1.0)(eciesjs@0.4.13)(eventemitter2@6.4.9)(readable-stream@3.6.2)(socket.io-client@4.8.1(bufferutil@4.0.8)(utf-8-validate@5.0.10)) '@metamask/sdk-install-modal-web': 0.31.2 '@paulmillr/qr': 0.2.1 bowser: 2.11.0 - cross-fetch: 4.0.0 + cross-fetch: 4.1.0 debug: 4.4.0 - eciesjs: 0.4.12 + eciesjs: 0.4.13 eth-rpc-errors: 4.0.3 eventemitter2: 6.4.9 obj-multiplex: 1.0.0 @@ -3671,7 +3443,7 @@ snapshots: '@nodelib/fs.walk@1.2.8': dependencies: '@nodelib/fs.scandir': 2.1.5 - fastq: 1.17.1 + fastq: 1.18.0 '@parcel/watcher-android-arm64@2.5.0': optional: true @@ -3749,61 +3521,61 @@ snapshots: '@polka/url@1.0.0-next.28': {} - '@rollup/rollup-android-arm-eabi@4.28.1': + '@rollup/rollup-android-arm-eabi@4.29.1': optional: true - '@rollup/rollup-android-arm64@4.28.1': + '@rollup/rollup-android-arm64@4.29.1': optional: true - '@rollup/rollup-darwin-arm64@4.28.1': + '@rollup/rollup-darwin-arm64@4.29.1': optional: true - '@rollup/rollup-darwin-x64@4.28.1': + '@rollup/rollup-darwin-x64@4.29.1': optional: true - '@rollup/rollup-freebsd-arm64@4.28.1': + '@rollup/rollup-freebsd-arm64@4.29.1': optional: true - '@rollup/rollup-freebsd-x64@4.28.1': + '@rollup/rollup-freebsd-x64@4.29.1': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.28.1': + '@rollup/rollup-linux-arm-gnueabihf@4.29.1': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.28.1': + '@rollup/rollup-linux-arm-musleabihf@4.29.1': optional: true - '@rollup/rollup-linux-arm64-gnu@4.28.1': + '@rollup/rollup-linux-arm64-gnu@4.29.1': optional: true - '@rollup/rollup-linux-arm64-musl@4.28.1': + '@rollup/rollup-linux-arm64-musl@4.29.1': optional: true - '@rollup/rollup-linux-loongarch64-gnu@4.28.1': + '@rollup/rollup-linux-loongarch64-gnu@4.29.1': optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.28.1': + '@rollup/rollup-linux-powerpc64le-gnu@4.29.1': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.28.1': + '@rollup/rollup-linux-riscv64-gnu@4.29.1': optional: true - '@rollup/rollup-linux-s390x-gnu@4.28.1': + '@rollup/rollup-linux-s390x-gnu@4.29.1': optional: true - '@rollup/rollup-linux-x64-gnu@4.28.1': + '@rollup/rollup-linux-x64-gnu@4.29.1': optional: true - '@rollup/rollup-linux-x64-musl@4.28.1': + '@rollup/rollup-linux-x64-musl@4.29.1': optional: true - '@rollup/rollup-win32-arm64-msvc@4.28.1': + '@rollup/rollup-win32-arm64-msvc@4.29.1': optional: true - '@rollup/rollup-win32-ia32-msvc@4.28.1': + '@rollup/rollup-win32-ia32-msvc@4.29.1': optional: true - '@rollup/rollup-win32-x64-msvc@4.28.1': + '@rollup/rollup-win32-x64-msvc@4.29.1': optional: true '@safe-global/safe-apps-provider@0.18.5(bufferutil@4.0.8)(typescript@5.7.2)(utf-8-validate@5.0.10)': @@ -3819,7 +3591,7 @@ snapshots: '@safe-global/safe-apps-sdk@9.1.0(bufferutil@4.0.8)(typescript@5.7.2)(utf-8-validate@5.0.10)': dependencies: '@safe-global/safe-gateway-typescript-sdk': 3.22.4 - viem: 2.21.55(bufferutil@4.0.8)(typescript@5.7.2)(utf-8-validate@5.0.10) + viem: 2.21.57(bufferutil@4.0.8)(typescript@5.7.2)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - typescript @@ -3938,14 +3710,14 @@ snapshots: '@steeze-ui/heroicons@2.4.2': {} - '@sveltejs/adapter-auto@3.3.1(@sveltejs/kit@2.12.1(@sveltejs/vite-plugin-svelte@5.0.2(svelte@5.14.2)(vite@6.0.3(jiti@2.4.1)(yaml@2.6.1)))(svelte@5.14.2)(vite@6.0.3(jiti@2.4.1)(yaml@2.6.1)))': + '@sveltejs/adapter-auto@3.3.1(@sveltejs/kit@2.15.0(@sveltejs/vite-plugin-svelte@4.0.4(svelte@5.15.0)(vite@5.4.11))(svelte@5.15.0)(vite@5.4.11))': dependencies: - '@sveltejs/kit': 2.12.1(@sveltejs/vite-plugin-svelte@5.0.2(svelte@5.14.2)(vite@6.0.3(jiti@2.4.1)(yaml@2.6.1)))(svelte@5.14.2)(vite@6.0.3(jiti@2.4.1)(yaml@2.6.1)) + '@sveltejs/kit': 2.15.0(@sveltejs/vite-plugin-svelte@4.0.4(svelte@5.15.0)(vite@5.4.11))(svelte@5.15.0)(vite@5.4.11) import-meta-resolve: 4.1.0 - '@sveltejs/kit@2.12.1(@sveltejs/vite-plugin-svelte@5.0.2(svelte@5.14.2)(vite@6.0.3(jiti@2.4.1)(yaml@2.6.1)))(svelte@5.14.2)(vite@6.0.3(jiti@2.4.1)(yaml@2.6.1))': + '@sveltejs/kit@2.15.0(@sveltejs/vite-plugin-svelte@4.0.4(svelte@5.15.0)(vite@5.4.11))(svelte@5.15.0)(vite@5.4.11)': dependencies: - '@sveltejs/vite-plugin-svelte': 5.0.2(svelte@5.14.2)(vite@6.0.3(jiti@2.4.1)(yaml@2.6.1)) + '@sveltejs/vite-plugin-svelte': 4.0.4(svelte@5.15.0)(vite@5.4.11) '@types/cookie': 0.6.0 cookie: 0.6.0 devalue: 5.1.1 @@ -3957,29 +3729,29 @@ snapshots: sade: 1.8.1 set-cookie-parser: 2.7.1 sirv: 3.0.0 - svelte: 5.14.2 + svelte: 5.15.0 tiny-glob: 0.2.9 - vite: 6.0.3(jiti@2.4.1)(yaml@2.6.1) + vite: 5.4.11 - '@sveltejs/vite-plugin-svelte-inspector@4.0.1(@sveltejs/vite-plugin-svelte@5.0.2(svelte@5.14.2)(vite@6.0.3(jiti@2.4.1)(yaml@2.6.1)))(svelte@5.14.2)(vite@6.0.3(jiti@2.4.1)(yaml@2.6.1))': + '@sveltejs/vite-plugin-svelte-inspector@3.0.1(@sveltejs/vite-plugin-svelte@4.0.4(svelte@5.15.0)(vite@5.4.11))(svelte@5.15.0)(vite@5.4.11)': dependencies: - '@sveltejs/vite-plugin-svelte': 5.0.2(svelte@5.14.2)(vite@6.0.3(jiti@2.4.1)(yaml@2.6.1)) + '@sveltejs/vite-plugin-svelte': 4.0.4(svelte@5.15.0)(vite@5.4.11) debug: 4.4.0 - svelte: 5.14.2 - vite: 6.0.3(jiti@2.4.1)(yaml@2.6.1) + svelte: 5.15.0 + vite: 5.4.11 transitivePeerDependencies: - supports-color - '@sveltejs/vite-plugin-svelte@5.0.2(svelte@5.14.2)(vite@6.0.3(jiti@2.4.1)(yaml@2.6.1))': + '@sveltejs/vite-plugin-svelte@4.0.4(svelte@5.15.0)(vite@5.4.11)': dependencies: - '@sveltejs/vite-plugin-svelte-inspector': 4.0.1(@sveltejs/vite-plugin-svelte@5.0.2(svelte@5.14.2)(vite@6.0.3(jiti@2.4.1)(yaml@2.6.1)))(svelte@5.14.2)(vite@6.0.3(jiti@2.4.1)(yaml@2.6.1)) + '@sveltejs/vite-plugin-svelte-inspector': 3.0.1(@sveltejs/vite-plugin-svelte@4.0.4(svelte@5.15.0)(vite@5.4.11))(svelte@5.15.0)(vite@5.4.11) debug: 4.4.0 deepmerge: 4.3.1 kleur: 4.1.5 magic-string: 0.30.17 - svelte: 5.14.2 - vite: 6.0.3(jiti@2.4.1)(yaml@2.6.1) - vitefu: 1.0.4(vite@6.0.3(jiti@2.4.1)(yaml@2.6.1)) + svelte: 5.15.0 + vite: 5.4.11 + vitefu: 1.0.4(vite@5.4.11) transitivePeerDependencies: - supports-color @@ -3997,15 +3769,15 @@ snapshots: '@types/trusted-types@2.0.7': {} - '@typescript-eslint/eslint-plugin@8.18.1(@typescript-eslint/parser@8.18.1(eslint@9.17.0(jiti@2.4.1))(typescript@5.7.2))(eslint@9.17.0(jiti@2.4.1))(typescript@5.7.2)': + '@typescript-eslint/eslint-plugin@8.18.2(@typescript-eslint/parser@8.18.2(eslint@9.17.0(jiti@2.4.2))(typescript@5.7.2))(eslint@9.17.0(jiti@2.4.2))(typescript@5.7.2)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.18.1(eslint@9.17.0(jiti@2.4.1))(typescript@5.7.2) - '@typescript-eslint/scope-manager': 8.18.1 - '@typescript-eslint/type-utils': 8.18.1(eslint@9.17.0(jiti@2.4.1))(typescript@5.7.2) - '@typescript-eslint/utils': 8.18.1(eslint@9.17.0(jiti@2.4.1))(typescript@5.7.2) - '@typescript-eslint/visitor-keys': 8.18.1 - eslint: 9.17.0(jiti@2.4.1) + '@typescript-eslint/parser': 8.18.2(eslint@9.17.0(jiti@2.4.2))(typescript@5.7.2) + '@typescript-eslint/scope-manager': 8.18.2 + '@typescript-eslint/type-utils': 8.18.2(eslint@9.17.0(jiti@2.4.2))(typescript@5.7.2) + '@typescript-eslint/utils': 8.18.2(eslint@9.17.0(jiti@2.4.2))(typescript@5.7.2) + '@typescript-eslint/visitor-keys': 8.18.2 + eslint: 9.17.0(jiti@2.4.2) graphemer: 1.4.0 ignore: 5.3.2 natural-compare: 1.4.0 @@ -4014,40 +3786,40 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.18.1(eslint@9.17.0(jiti@2.4.1))(typescript@5.7.2)': + '@typescript-eslint/parser@8.18.2(eslint@9.17.0(jiti@2.4.2))(typescript@5.7.2)': dependencies: - '@typescript-eslint/scope-manager': 8.18.1 - '@typescript-eslint/types': 8.18.1 - '@typescript-eslint/typescript-estree': 8.18.1(typescript@5.7.2) - '@typescript-eslint/visitor-keys': 8.18.1 + '@typescript-eslint/scope-manager': 8.18.2 + '@typescript-eslint/types': 8.18.2 + '@typescript-eslint/typescript-estree': 8.18.2(typescript@5.7.2) + '@typescript-eslint/visitor-keys': 8.18.2 debug: 4.4.0 - eslint: 9.17.0(jiti@2.4.1) + eslint: 9.17.0(jiti@2.4.2) typescript: 5.7.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.18.1': + '@typescript-eslint/scope-manager@8.18.2': dependencies: - '@typescript-eslint/types': 8.18.1 - '@typescript-eslint/visitor-keys': 8.18.1 + '@typescript-eslint/types': 8.18.2 + '@typescript-eslint/visitor-keys': 8.18.2 - '@typescript-eslint/type-utils@8.18.1(eslint@9.17.0(jiti@2.4.1))(typescript@5.7.2)': + '@typescript-eslint/type-utils@8.18.2(eslint@9.17.0(jiti@2.4.2))(typescript@5.7.2)': dependencies: - '@typescript-eslint/typescript-estree': 8.18.1(typescript@5.7.2) - '@typescript-eslint/utils': 8.18.1(eslint@9.17.0(jiti@2.4.1))(typescript@5.7.2) + '@typescript-eslint/typescript-estree': 8.18.2(typescript@5.7.2) + '@typescript-eslint/utils': 8.18.2(eslint@9.17.0(jiti@2.4.2))(typescript@5.7.2) debug: 4.4.0 - eslint: 9.17.0(jiti@2.4.1) + eslint: 9.17.0(jiti@2.4.2) ts-api-utils: 1.4.3(typescript@5.7.2) typescript: 5.7.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.18.1': {} + '@typescript-eslint/types@8.18.2': {} - '@typescript-eslint/typescript-estree@8.18.1(typescript@5.7.2)': + '@typescript-eslint/typescript-estree@8.18.2(typescript@5.7.2)': dependencies: - '@typescript-eslint/types': 8.18.1 - '@typescript-eslint/visitor-keys': 8.18.1 + '@typescript-eslint/types': 8.18.2 + '@typescript-eslint/visitor-keys': 8.18.2 debug: 4.4.0 fast-glob: 3.3.2 is-glob: 4.0.3 @@ -4058,20 +3830,20 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.18.1(eslint@9.17.0(jiti@2.4.1))(typescript@5.7.2)': + '@typescript-eslint/utils@8.18.2(eslint@9.17.0(jiti@2.4.2))(typescript@5.7.2)': dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@9.17.0(jiti@2.4.1)) - '@typescript-eslint/scope-manager': 8.18.1 - '@typescript-eslint/types': 8.18.1 - '@typescript-eslint/typescript-estree': 8.18.1(typescript@5.7.2) - eslint: 9.17.0(jiti@2.4.1) + '@eslint-community/eslint-utils': 4.4.1(eslint@9.17.0(jiti@2.4.2)) + '@typescript-eslint/scope-manager': 8.18.2 + '@typescript-eslint/types': 8.18.2 + '@typescript-eslint/typescript-estree': 8.18.2(typescript@5.7.2) + eslint: 9.17.0(jiti@2.4.2) typescript: 5.7.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.18.1': + '@typescript-eslint/visitor-keys@8.18.2': dependencies: - '@typescript-eslint/types': 8.18.1 + '@typescript-eslint/types': 8.18.2 eslint-visitor-keys: 4.2.0 '@vitest/expect@2.1.8': @@ -4114,16 +3886,16 @@ snapshots: loupe: 3.1.2 tinyrainbow: 1.2.0 - '@wagmi/connectors@5.7.0(@wagmi/core@2.16.0(react@18.3.1)(typescript@5.7.2)(use-sync-external-store@1.2.0(react@18.3.1))(viem@2.21.55(bufferutil@4.0.8)(typescript@5.7.2)(utf-8-validate@5.0.10)))(bufferutil@4.0.8)(react@18.3.1)(typescript@5.7.2)(utf-8-validate@5.0.10)(viem@2.21.55(bufferutil@4.0.8)(typescript@5.7.2)(utf-8-validate@5.0.10))': + '@wagmi/connectors@5.7.3(@wagmi/core@2.16.3(react@18.3.1)(typescript@5.7.2)(use-sync-external-store@1.2.0(react@18.3.1))(viem@2.21.57(bufferutil@4.0.8)(typescript@5.7.2)(utf-8-validate@5.0.10)))(bufferutil@4.0.8)(react@18.3.1)(typescript@5.7.2)(utf-8-validate@5.0.10)(viem@2.21.57(bufferutil@4.0.8)(typescript@5.7.2)(utf-8-validate@5.0.10))': dependencies: '@coinbase/wallet-sdk': 4.2.3 - '@metamask/sdk': 0.31.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@metamask/sdk': 0.31.4(bufferutil@4.0.8)(utf-8-validate@5.0.10) '@safe-global/safe-apps-provider': 0.18.5(bufferutil@4.0.8)(typescript@5.7.2)(utf-8-validate@5.0.10) '@safe-global/safe-apps-sdk': 9.1.0(bufferutil@4.0.8)(typescript@5.7.2)(utf-8-validate@5.0.10) - '@wagmi/core': 2.16.0(react@18.3.1)(typescript@5.7.2)(use-sync-external-store@1.2.0(react@18.3.1))(viem@2.21.55(bufferutil@4.0.8)(typescript@5.7.2)(utf-8-validate@5.0.10)) + '@wagmi/core': 2.16.3(react@18.3.1)(typescript@5.7.2)(use-sync-external-store@1.2.0(react@18.3.1))(viem@2.21.57(bufferutil@4.0.8)(typescript@5.7.2)(utf-8-validate@5.0.10)) '@walletconnect/ethereum-provider': 2.17.0(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@5.0.10) cbw-sdk: '@coinbase/wallet-sdk@3.9.3' - viem: 2.21.55(bufferutil@4.0.8)(typescript@5.7.2)(utf-8-validate@5.0.10) + viem: 2.21.57(bufferutil@4.0.8)(typescript@5.7.2)(utf-8-validate@5.0.10) optionalDependencies: typescript: 5.7.2 transitivePeerDependencies: @@ -4134,25 +3906,30 @@ snapshots: - '@azure/keyvault-secrets' - '@azure/storage-blob' - '@capacitor/preferences' + - '@deno/kv' - '@netlify/blobs' - '@planetscale/database' - '@react-native-async-storage/async-storage' - '@types/react' - '@upstash/redis' + - '@vercel/blob' - '@vercel/kv' + - aws4fetch - bufferutil + - db0 - encoding - ioredis - react - supports-color + - uploadthing - utf-8-validate - zod - '@wagmi/core@2.16.0(react@18.3.1)(typescript@5.7.2)(use-sync-external-store@1.2.0(react@18.3.1))(viem@2.21.55(bufferutil@4.0.8)(typescript@5.7.2)(utf-8-validate@5.0.10))': + '@wagmi/core@2.16.3(react@18.3.1)(typescript@5.7.2)(use-sync-external-store@1.2.0(react@18.3.1))(viem@2.21.57(bufferutil@4.0.8)(typescript@5.7.2)(utf-8-validate@5.0.10))': dependencies: eventemitter3: 5.0.1 mipd: 0.0.7(typescript@5.7.2) - viem: 2.21.55(bufferutil@4.0.8)(typescript@5.7.2)(utf-8-validate@5.0.10) + viem: 2.21.57(bufferutil@4.0.8)(typescript@5.7.2)(utf-8-validate@5.0.10) zustand: 5.0.0(react@18.3.1)(use-sync-external-store@1.2.0(react@18.3.1)) optionalDependencies: typescript: 5.7.2 @@ -4188,13 +3965,18 @@ snapshots: - '@azure/keyvault-secrets' - '@azure/storage-blob' - '@capacitor/preferences' + - '@deno/kv' - '@netlify/blobs' - '@planetscale/database' - '@react-native-async-storage/async-storage' - '@upstash/redis' + - '@vercel/blob' - '@vercel/kv' + - aws4fetch - bufferutil + - db0 - ioredis + - uploadthing - utf-8-validate '@walletconnect/environment@1.0.1': @@ -4221,16 +4003,21 @@ snapshots: - '@azure/keyvault-secrets' - '@azure/storage-blob' - '@capacitor/preferences' + - '@deno/kv' - '@netlify/blobs' - '@planetscale/database' - '@react-native-async-storage/async-storage' - '@types/react' - '@upstash/redis' + - '@vercel/blob' - '@vercel/kv' + - aws4fetch - bufferutil + - db0 - encoding - ioredis - react + - uploadthing - utf-8-validate '@walletconnect/events@1.0.1': @@ -4248,7 +4035,7 @@ snapshots: dependencies: '@walletconnect/jsonrpc-utils': 1.0.8 '@walletconnect/safe-json': 1.0.2 - cross-fetch: 3.1.8 + cross-fetch: 3.2.0 events: 3.3.0 transitivePeerDependencies: - encoding @@ -4284,7 +4071,7 @@ snapshots: dependencies: '@walletconnect/safe-json': 1.0.2 idb-keyval: 6.2.1 - unstorage: 1.13.1(idb-keyval@6.2.1) + unstorage: 1.14.1(idb-keyval@6.2.1) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -4293,11 +4080,16 @@ snapshots: - '@azure/keyvault-secrets' - '@azure/storage-blob' - '@capacitor/preferences' + - '@deno/kv' - '@netlify/blobs' - '@planetscale/database' - '@upstash/redis' + - '@vercel/blob' - '@vercel/kv' + - aws4fetch + - db0 - ioredis + - uploadthing '@walletconnect/logger@2.1.2': dependencies: @@ -4365,13 +4157,18 @@ snapshots: - '@azure/keyvault-secrets' - '@azure/storage-blob' - '@capacitor/preferences' + - '@deno/kv' - '@netlify/blobs' - '@planetscale/database' - '@react-native-async-storage/async-storage' - '@upstash/redis' + - '@vercel/blob' - '@vercel/kv' + - aws4fetch - bufferutil + - db0 - ioredis + - uploadthing - utf-8-validate '@walletconnect/time@1.0.2': @@ -4394,12 +4191,17 @@ snapshots: - '@azure/keyvault-secrets' - '@azure/storage-blob' - '@capacitor/preferences' + - '@deno/kv' - '@netlify/blobs' - '@planetscale/database' - '@react-native-async-storage/async-storage' - '@upstash/redis' + - '@vercel/blob' - '@vercel/kv' + - aws4fetch + - db0 - ioredis + - uploadthing '@walletconnect/universal-provider@2.17.0(bufferutil@4.0.8)(utf-8-validate@5.0.10)': dependencies: @@ -4420,14 +4222,19 @@ snapshots: - '@azure/keyvault-secrets' - '@azure/storage-blob' - '@capacitor/preferences' + - '@deno/kv' - '@netlify/blobs' - '@planetscale/database' - '@react-native-async-storage/async-storage' - '@upstash/redis' + - '@vercel/blob' - '@vercel/kv' + - aws4fetch - bufferutil + - db0 - encoding - ioredis + - uploadthing - utf-8-validate '@walletconnect/utils@2.17.0': @@ -4456,12 +4263,17 @@ snapshots: - '@azure/keyvault-secrets' - '@azure/storage-blob' - '@capacitor/preferences' + - '@deno/kv' - '@netlify/blobs' - '@planetscale/database' - '@react-native-async-storage/async-storage' - '@upstash/redis' + - '@vercel/blob' - '@vercel/kv' + - aws4fetch + - db0 - ioredis + - uploadthing '@walletconnect/window-getters@1.0.1': dependencies: @@ -4527,7 +4339,7 @@ snapshots: autoprefixer@10.4.20(postcss@8.4.49): dependencies: browserslist: 4.24.3 - caniuse-lite: 1.0.30001689 + caniuse-lite: 1.0.30001690 fraction.js: 4.3.7 normalize-range: 0.1.2 picocolors: 1.1.1 @@ -4569,8 +4381,8 @@ snapshots: browserslist@4.24.3: dependencies: - caniuse-lite: 1.0.30001689 - electron-to-chromium: 1.5.74 + caniuse-lite: 1.0.30001690 + electron-to-chromium: 1.5.76 node-releases: 2.0.19 update-browserslist-db: 1.1.1(browserslist@4.24.3) @@ -4608,7 +4420,7 @@ snapshots: camelcase@5.3.1: {} - caniuse-lite@1.0.30001689: {} + caniuse-lite@1.0.30001690: {} chai@5.1.2: dependencies: @@ -4637,13 +4449,13 @@ snapshots: optionalDependencies: fsevents: 2.3.3 - chokidar@4.0.2: + chokidar@4.0.3: dependencies: readdirp: 4.0.2 citty@0.1.6: dependencies: - consola: 3.2.3 + consola: 3.3.1 clipboardy@4.0.0: dependencies: @@ -4671,7 +4483,7 @@ snapshots: confbox@0.1.8: {} - consola@3.2.3: {} + consola@3.3.1: {} cookie-es@1.2.2: {} @@ -4681,13 +4493,13 @@ snapshots: crc-32@1.2.2: {} - cross-fetch@3.1.8: + cross-fetch@3.2.0: dependencies: node-fetch: 2.7.0 transitivePeerDependencies: - encoding - cross-fetch@4.0.0: + cross-fetch@4.1.0: dependencies: node-fetch: 2.7.0 transitivePeerDependencies: @@ -4703,8 +4515,24 @@ snapshots: dependencies: uncrypto: 0.1.3 + css-selector-tokenizer@0.8.0: + dependencies: + cssesc: 3.0.0 + fastparse: 1.1.2 + cssesc@3.0.0: {} + culori@3.3.0: {} + + daisyui@4.12.22(postcss@8.4.49): + dependencies: + css-selector-tokenizer: 0.8.0 + culori: 3.3.0 + picocolors: 1.1.1 + postcss-js: 4.0.1(postcss@8.4.49) + transitivePeerDependencies: + - postcss + date-fns@2.30.0: dependencies: '@babel/runtime': 7.26.0 @@ -4764,14 +4592,14 @@ snapshots: eastasianwidth@0.2.0: {} - eciesjs@0.4.12: + eciesjs@0.4.13: dependencies: '@ecies/ciphers': 0.2.2(@noble/ciphers@1.1.3) '@noble/ciphers': 1.1.3 '@noble/curves': 1.7.0 '@noble/hashes': 1.6.1 - electron-to-chromium@1.5.74: {} + electron-to-chromium@1.5.76: {} elliptic@6.6.1: dependencies: @@ -4843,52 +4671,25 @@ snapshots: '@esbuild/win32-ia32': 0.21.5 '@esbuild/win32-x64': 0.21.5 - esbuild@0.24.0: - optionalDependencies: - '@esbuild/aix-ppc64': 0.24.0 - '@esbuild/android-arm': 0.24.0 - '@esbuild/android-arm64': 0.24.0 - '@esbuild/android-x64': 0.24.0 - '@esbuild/darwin-arm64': 0.24.0 - '@esbuild/darwin-x64': 0.24.0 - '@esbuild/freebsd-arm64': 0.24.0 - '@esbuild/freebsd-x64': 0.24.0 - '@esbuild/linux-arm': 0.24.0 - '@esbuild/linux-arm64': 0.24.0 - '@esbuild/linux-ia32': 0.24.0 - '@esbuild/linux-loong64': 0.24.0 - '@esbuild/linux-mips64el': 0.24.0 - '@esbuild/linux-ppc64': 0.24.0 - '@esbuild/linux-riscv64': 0.24.0 - '@esbuild/linux-s390x': 0.24.0 - '@esbuild/linux-x64': 0.24.0 - '@esbuild/netbsd-x64': 0.24.0 - '@esbuild/openbsd-arm64': 0.24.0 - '@esbuild/openbsd-x64': 0.24.0 - '@esbuild/sunos-x64': 0.24.0 - '@esbuild/win32-arm64': 0.24.0 - '@esbuild/win32-ia32': 0.24.0 - '@esbuild/win32-x64': 0.24.0 - escalade@3.2.0: {} escape-string-regexp@4.0.0: {} - eslint-compat-utils@0.5.1(eslint@9.17.0(jiti@2.4.1)): + eslint-compat-utils@0.5.1(eslint@9.17.0(jiti@2.4.2)): dependencies: - eslint: 9.17.0(jiti@2.4.1) + eslint: 9.17.0(jiti@2.4.2) semver: 7.6.3 - eslint-config-prettier@9.1.0(eslint@9.17.0(jiti@2.4.1)): + eslint-config-prettier@9.1.0(eslint@9.17.0(jiti@2.4.2)): dependencies: - eslint: 9.17.0(jiti@2.4.1) + eslint: 9.17.0(jiti@2.4.2) - eslint-plugin-svelte@2.46.1(eslint@9.17.0(jiti@2.4.1))(svelte@5.14.2): + eslint-plugin-svelte@2.46.1(eslint@9.17.0(jiti@2.4.2))(svelte@5.15.0): dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@9.17.0(jiti@2.4.1)) + '@eslint-community/eslint-utils': 4.4.1(eslint@9.17.0(jiti@2.4.2)) '@jridgewell/sourcemap-codec': 1.5.0 - eslint: 9.17.0(jiti@2.4.1) - eslint-compat-utils: 0.5.1(eslint@9.17.0(jiti@2.4.1)) + eslint: 9.17.0(jiti@2.4.2) + eslint-compat-utils: 0.5.1(eslint@9.17.0(jiti@2.4.2)) esutils: 2.0.3 known-css-properties: 0.35.0 postcss: 8.4.49 @@ -4896,9 +4697,9 @@ snapshots: postcss-safe-parser: 6.0.0(postcss@8.4.49) postcss-selector-parser: 6.1.2 semver: 7.6.3 - svelte-eslint-parser: 0.43.0(svelte@5.14.2) + svelte-eslint-parser: 0.43.0(svelte@5.15.0) optionalDependencies: - svelte: 5.14.2 + svelte: 5.15.0 transitivePeerDependencies: - ts-node @@ -4916,9 +4717,9 @@ snapshots: eslint-visitor-keys@4.2.0: {} - eslint@9.17.0(jiti@2.4.1): + eslint@9.17.0(jiti@2.4.2): dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@9.17.0(jiti@2.4.1)) + '@eslint-community/eslint-utils': 4.4.1(eslint@9.17.0(jiti@2.4.2)) '@eslint-community/regexpp': 4.12.1 '@eslint/config-array': 0.19.1 '@eslint/core': 0.9.1 @@ -4953,7 +4754,7 @@ snapshots: natural-compare: 1.4.0 optionator: 0.9.4 optionalDependencies: - jiti: 2.4.1 + jiti: 2.4.2 transitivePeerDependencies: - supports-color @@ -4975,10 +4776,9 @@ snapshots: dependencies: estraverse: 5.3.0 - esrap@1.2.3: + esrap@1.3.2: dependencies: '@jridgewell/sourcemap-codec': 1.5.0 - '@types/estree': 1.0.6 esrecurse@4.3.0: dependencies: @@ -5069,7 +4869,9 @@ snapshots: fast-safe-stringify@2.1.1: {} - fastq@1.17.1: + fastparse@1.1.2: {} + + fastq@1.18.0: dependencies: reusify: 1.0.4 @@ -5134,7 +4936,7 @@ snapshots: gopd: 1.2.0 has-symbols: 1.1.0 hasown: 2.0.2 - math-intrinsics: 1.0.0 + math-intrinsics: 1.1.0 get-port-please@3.1.2: {} @@ -5159,7 +4961,7 @@ snapshots: globals@14.0.0: {} - globals@15.13.0: {} + globals@15.14.0: {} globalyzer@0.1.0: {} @@ -5245,7 +5047,7 @@ snapshots: is-callable@1.2.7: {} - is-core-module@2.16.0: + is-core-module@2.16.1: dependencies: hasown: 2.0.2 @@ -5277,9 +5079,9 @@ snapshots: is-stream@3.0.0: {} - is-typed-array@1.1.13: + is-typed-array@1.1.15: dependencies: - which-typed-array: 1.1.16 + which-typed-array: 1.1.18 is-wsl@3.1.0: dependencies: @@ -5303,9 +5105,9 @@ snapshots: optionalDependencies: '@pkgjs/parseargs': 0.11.0 - jiti@1.21.6: {} + jiti@1.21.7: {} - jiti@2.4.1: {} + jiti@2.4.2: {} js-tokens@4.0.0: {} @@ -5359,13 +5161,13 @@ snapshots: '@parcel/watcher-wasm': 2.5.0 citty: 0.1.6 clipboardy: 4.0.0 - consola: 3.2.3 + consola: 3.3.1 crossws: 0.3.1 defu: 6.1.4 get-port-please: 3.1.2 h3: 1.13.0 http-shutdown: 1.2.2 - jiti: 2.4.1 + jiti: 2.4.2 mlly: 1.7.3 node-forge: 1.3.1 pathe: 1.1.2 @@ -5416,7 +5218,7 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.5.0 - math-intrinsics@1.0.0: {} + math-intrinsics@1.1.0: {} merge-stream@2.0.0: {} @@ -5659,7 +5461,7 @@ snapshots: postcss: 8.4.49 postcss-value-parser: 4.2.0 read-cache: 1.0.0 - resolve: 1.22.9 + resolve: 1.22.10 postcss-js@4.0.1(postcss@8.4.49): dependencies: @@ -5706,20 +5508,20 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 - preact@10.25.2: {} + preact@10.25.3: {} prelude-ls@1.2.1: {} - prettier-plugin-svelte@3.3.2(prettier@3.4.2)(svelte@5.14.2): + prettier-plugin-svelte@3.3.2(prettier@3.4.2)(svelte@5.15.0): dependencies: prettier: 3.4.2 - svelte: 5.14.2 + svelte: 5.15.0 - prettier-plugin-tailwindcss@0.6.9(prettier-plugin-svelte@3.3.2(prettier@3.4.2)(svelte@5.14.2))(prettier@3.4.2): + prettier-plugin-tailwindcss@0.6.9(prettier-plugin-svelte@3.3.2(prettier@3.4.2)(svelte@5.15.0))(prettier@3.4.2): dependencies: prettier: 3.4.2 optionalDependencies: - prettier-plugin-svelte: 3.3.2(prettier@3.4.2)(svelte@5.14.2) + prettier-plugin-svelte: 3.3.2(prettier@3.4.2)(svelte@5.15.0) prettier@3.4.2: {} @@ -5796,37 +5598,37 @@ snapshots: resolve-from@4.0.0: {} - resolve@1.22.9: + resolve@1.22.10: dependencies: - is-core-module: 2.16.0 + is-core-module: 2.16.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 reusify@1.0.4: {} - rollup@4.28.1: + rollup@4.29.1: dependencies: '@types/estree': 1.0.6 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.28.1 - '@rollup/rollup-android-arm64': 4.28.1 - '@rollup/rollup-darwin-arm64': 4.28.1 - '@rollup/rollup-darwin-x64': 4.28.1 - '@rollup/rollup-freebsd-arm64': 4.28.1 - '@rollup/rollup-freebsd-x64': 4.28.1 - '@rollup/rollup-linux-arm-gnueabihf': 4.28.1 - '@rollup/rollup-linux-arm-musleabihf': 4.28.1 - '@rollup/rollup-linux-arm64-gnu': 4.28.1 - '@rollup/rollup-linux-arm64-musl': 4.28.1 - '@rollup/rollup-linux-loongarch64-gnu': 4.28.1 - '@rollup/rollup-linux-powerpc64le-gnu': 4.28.1 - '@rollup/rollup-linux-riscv64-gnu': 4.28.1 - '@rollup/rollup-linux-s390x-gnu': 4.28.1 - '@rollup/rollup-linux-x64-gnu': 4.28.1 - '@rollup/rollup-linux-x64-musl': 4.28.1 - '@rollup/rollup-win32-arm64-msvc': 4.28.1 - '@rollup/rollup-win32-ia32-msvc': 4.28.1 - '@rollup/rollup-win32-x64-msvc': 4.28.1 + '@rollup/rollup-android-arm-eabi': 4.29.1 + '@rollup/rollup-android-arm64': 4.29.1 + '@rollup/rollup-darwin-arm64': 4.29.1 + '@rollup/rollup-darwin-x64': 4.29.1 + '@rollup/rollup-freebsd-arm64': 4.29.1 + '@rollup/rollup-freebsd-x64': 4.29.1 + '@rollup/rollup-linux-arm-gnueabihf': 4.29.1 + '@rollup/rollup-linux-arm-musleabihf': 4.29.1 + '@rollup/rollup-linux-arm64-gnu': 4.29.1 + '@rollup/rollup-linux-arm64-musl': 4.29.1 + '@rollup/rollup-linux-loongarch64-gnu': 4.29.1 + '@rollup/rollup-linux-powerpc64le-gnu': 4.29.1 + '@rollup/rollup-linux-riscv64-gnu': 4.29.1 + '@rollup/rollup-linux-s390x-gnu': 4.29.1 + '@rollup/rollup-linux-x64-gnu': 4.29.1 + '@rollup/rollup-linux-x64-musl': 4.29.1 + '@rollup/rollup-win32-arm64-msvc': 4.29.1 + '@rollup/rollup-win32-ia32-msvc': 4.29.1 + '@rollup/rollup-win32-x64-msvc': 4.29.1 fsevents: 2.3.3 run-parallel@1.2.0: @@ -5965,19 +5767,19 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} - svelte-check@4.1.1(svelte@5.14.2)(typescript@5.7.2): + svelte-check@4.1.1(svelte@5.15.0)(typescript@5.7.2): dependencies: '@jridgewell/trace-mapping': 0.3.25 - chokidar: 4.0.2 + chokidar: 4.0.3 fdir: 6.4.2 picocolors: 1.1.1 sade: 1.8.1 - svelte: 5.14.2 + svelte: 5.15.0 typescript: 5.7.2 transitivePeerDependencies: - picomatch - svelte-eslint-parser@0.43.0(svelte@5.14.2): + svelte-eslint-parser@0.43.0(svelte@5.15.0): dependencies: eslint-scope: 7.2.2 eslint-visitor-keys: 3.4.3 @@ -5985,18 +5787,18 @@ snapshots: postcss: 8.4.49 postcss-scss: 4.0.9(postcss@8.4.49) optionalDependencies: - svelte: 5.14.2 + svelte: 5.15.0 - svelte-hero-icons@5.2.0(svelte@5.14.2): + svelte-hero-icons@5.2.0(svelte@5.15.0): dependencies: '@steeze-ui/heroicons': 2.4.2 - svelte: 5.14.2 + svelte: 5.15.0 - svelte-hot-french-toast@1.0.0(svelte@5.14.2): + svelte-hot-french-toast@1.0.0(svelte@5.15.0): dependencies: - svelte: 5.14.2 + svelte: 5.15.0 - svelte@5.14.2: + svelte@5.15.0: dependencies: '@ampproject/remapping': 2.3.0 '@jridgewell/sourcemap-codec': 1.5.0 @@ -6006,7 +5808,7 @@ snapshots: aria-query: 5.3.2 axobject-query: 4.1.0 esm-env: 1.2.1 - esrap: 1.2.3 + esrap: 1.3.2 is-reference: 3.0.3 locate-character: 3.0.0 magic-string: 0.30.17 @@ -6014,7 +5816,7 @@ snapshots: system-architecture@0.1.0: {} - tailwindcss@3.4.16: + tailwindcss@3.4.17: dependencies: '@alloc/quick-lru': 5.2.0 arg: 5.0.2 @@ -6024,7 +5826,7 @@ snapshots: fast-glob: 3.3.2 glob-parent: 6.0.2 is-glob: 4.0.3 - jiti: 1.21.6 + jiti: 1.21.7 lilconfig: 3.1.3 micromatch: 4.0.8 normalize-path: 3.0.0 @@ -6036,7 +5838,7 @@ snapshots: postcss-load-config: 4.0.2(postcss@8.4.49) postcss-nested: 6.2.0(postcss@8.4.49) postcss-selector-parser: 6.1.2 - resolve: 1.22.9 + resolve: 1.22.10 sucrase: 3.35.0 transitivePeerDependencies: - ts-node @@ -6090,12 +5892,12 @@ snapshots: dependencies: prelude-ls: 1.2.1 - typescript-eslint@8.18.1(eslint@9.17.0(jiti@2.4.1))(typescript@5.7.2): + typescript-eslint@8.18.2(eslint@9.17.0(jiti@2.4.2))(typescript@5.7.2): dependencies: - '@typescript-eslint/eslint-plugin': 8.18.1(@typescript-eslint/parser@8.18.1(eslint@9.17.0(jiti@2.4.1))(typescript@5.7.2))(eslint@9.17.0(jiti@2.4.1))(typescript@5.7.2) - '@typescript-eslint/parser': 8.18.1(eslint@9.17.0(jiti@2.4.1))(typescript@5.7.2) - '@typescript-eslint/utils': 8.18.1(eslint@9.17.0(jiti@2.4.1))(typescript@5.7.2) - eslint: 9.17.0(jiti@2.4.1) + '@typescript-eslint/eslint-plugin': 8.18.2(@typescript-eslint/parser@8.18.2(eslint@9.17.0(jiti@2.4.2))(typescript@5.7.2))(eslint@9.17.0(jiti@2.4.2))(typescript@5.7.2) + '@typescript-eslint/parser': 8.18.2(eslint@9.17.0(jiti@2.4.2))(typescript@5.7.2) + '@typescript-eslint/utils': 8.18.2(eslint@9.17.0(jiti@2.4.2))(typescript@5.7.2) + eslint: 9.17.0(jiti@2.4.2) typescript: 5.7.2 transitivePeerDependencies: - supports-color @@ -6112,13 +5914,13 @@ snapshots: unenv@1.10.0: dependencies: - consola: 3.2.3 + consola: 3.3.1 defu: 6.1.4 mime: 3.0.0 node-fetch-native: 1.6.4 pathe: 1.1.2 - unstorage@1.13.1(idb-keyval@6.2.1): + unstorage@1.14.1(idb-keyval@6.2.1): dependencies: anymatch: 3.1.3 chokidar: 3.6.0 @@ -6136,7 +5938,7 @@ snapshots: untun@0.1.3: dependencies: citty: 0.1.6 - consola: 3.2.3 + consola: 3.3.1 pathe: 1.1.2 update-browserslist-db@1.1.1(browserslist@4.24.3): @@ -6166,8 +5968,8 @@ snapshots: inherits: 2.0.4 is-arguments: 1.2.0 is-generator-function: 1.0.10 - is-typed-array: 1.1.13 - which-typed-array: 1.1.16 + is-typed-array: 1.1.15 + which-typed-array: 1.1.18 uuid@8.3.2: {} @@ -6180,7 +5982,7 @@ snapshots: optionalDependencies: react: 18.3.1 - viem@2.21.55(bufferutil@4.0.8)(typescript@5.7.2)(utf-8-validate@5.0.10): + viem@2.21.57(bufferutil@4.0.8)(typescript@5.7.2)(utf-8-validate@5.0.10): dependencies: '@noble/curves': 1.7.0 '@noble/hashes': 1.6.1 @@ -6220,23 +6022,13 @@ snapshots: dependencies: esbuild: 0.21.5 postcss: 8.4.49 - rollup: 4.28.1 + rollup: 4.29.1 optionalDependencies: fsevents: 2.3.3 - vite@6.0.3(jiti@2.4.1)(yaml@2.6.1): - dependencies: - esbuild: 0.24.0 - postcss: 8.4.49 - rollup: 4.28.1 + vitefu@1.0.4(vite@5.4.11): optionalDependencies: - fsevents: 2.3.3 - jiti: 2.4.1 - yaml: 2.6.1 - - vitefu@1.0.4(vite@6.0.3(jiti@2.4.1)(yaml@2.6.1)): - optionalDependencies: - vite: 6.0.3(jiti@2.4.1)(yaml@2.6.1) + vite: 5.4.11 vitest@2.1.8: dependencies: @@ -6287,10 +6079,11 @@ snapshots: which-module@2.0.1: {} - which-typed-array@1.1.16: + which-typed-array@1.1.18: dependencies: available-typed-arrays: 1.0.7 call-bind: 1.0.8 + call-bound: 1.0.3 for-each: 0.3.3 gopd: 1.2.0 has-tostringtag: 1.0.2 diff --git a/src/app.pcss b/src/app.pcss new file mode 100644 index 0000000..bff2484 --- /dev/null +++ b/src/app.pcss @@ -0,0 +1,33 @@ +/* Write your global styles here, in PostCSS syntax */ +@tailwind base; +@tailwind components; +@tailwind utilities; + +:root, +[data-theme] { + background: oklch(var(--b2)); +} + +body { + min-height: 100vh; +} + +h1, +h2, +h3, +h4 { + margin-bottom: 0.5rem; + line-height: 1; +} + +p { + margin: 1rem 0; +} + +.btn { + @apply shadow-md; +} + +.btn.btn-ghost { + @apply shadow-none; +} diff --git a/src/lib/config.ts b/src/lib/config.ts deleted file mode 100644 index 7a3f170..0000000 --- a/src/lib/config.ts +++ /dev/null @@ -1,52 +0,0 @@ -import * as envir from '$env/static/public'; -import { http, webSocket } from 'viem'; - -const env = envir as Record; - -// import { replacer, isAddress, isEns } from "$lib/scaffold-eth/ts"; -// import { targetNetwork, type TargetNetworkId } from "$lib/scaffold-eth/classes"; -// import { getAlchemyTransport, shorten0xString, notification } from "$lib/scaffold-eth/ts"; -// const localStorageContractKey = "scaffoldEth2.contractSelected"; -// import { readDeployment, type DeploymentContractName, type DeploymentsChainId } from "@onchain-ai/common"; - -// redefine constants here or take them from environment -const NETWORKS = (env.PUBLIC_NETWORKS || 'anvil,baseSepolia').split(','); -const POLLING_INTERVAL = Number(env.PUBLIC_POLLING_INTERVAL || 5000); -const ALCHEMY_API_KEY = String(env.PUBLIC_ALCHEMY_API_KEY || ''); -const WALLET_CONNECT_PROJECT_ID = String(env.PUBLIC_WALLET_CONNECT_PROJECT_ID || ''); -const BURNER_WALLET_KEY = String(env.PUBLIC_BURNER_WALLET_KEY || ''); - -const RPC_ALCHEMY_NAMES: Record = { - 1: 'eth-mainnet', - 11155111: 'eth-sepolia', - 17000: 'eth-holesky', - 10: 'opt-mainnet', - 11155420: 'opt-sepolia', - 42161: 'arb-mainnet', - 421614: 'arb-sepolia', - 8453: 'base-mainnet', - 84532: 'base-sepolia', - 137: 'polygon-mainnet', - 80002: 'polygon-amoy' -}; - -const ALCHEMY_URL = (chainId: number, protocol: 'https' | 'wss' = 'https') => { - return RPC_ALCHEMY_NAMES[chainId] - ? `${protocol}://${RPC_ALCHEMY_NAMES[chainId]}.g.alchemy.com/v2/${ALCHEMY_API_KEY}` - : undefined; -}; - -const ALCHEMY_TRANSPORT = (chainId: number, protocol: 'https' | 'wss' = 'https') => { - const fnProtocol = protocol === 'https' ? http : webSocket; - return fnProtocol(ALCHEMY_URL(chainId, protocol)); -}; - -export { - NETWORKS, - POLLING_INTERVAL, - ALCHEMY_API_KEY, - WALLET_CONNECT_PROJECT_ID, - BURNER_WALLET_KEY, - ALCHEMY_URL, - ALCHEMY_TRANSPORT -}; diff --git a/src/lib/deployments.json b/src/lib/deployments.json index fa65a1e..dee3e71 100644 --- a/src/lib/deployments.json +++ b/src/lib/deployments.json @@ -1,124 +1,37 @@ { - "8453": { - "OnChainAIv1": { - "address": "0x5095f726C40D0AE7360c6307B7cE57620ae8594c", + "31337": { + "Counter": { + "address": "0x0116686E2291dbd5e317F47faDBFb43B599786Ef", "abi": [ - { - "type": "constructor", - "inputs": [ - { - "name": "router", - "type": "address", - "internalType": "address" - }, - { - "name": "javascript_", - "type": "string", - "internalType": "string" - }, - { - "name": "subscriptionId_", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "gasLimit_", - "type": "uint32", - "internalType": "uint32" - }, - { - "name": "donId_", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "price_", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "acceptOwnership", - "inputs": [], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "handleOracleFulfillment", - "inputs": [ - { - "name": "requestId", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "response", - "type": "bytes", - "internalType": "bytes" - }, - { - "name": "err", - "type": "bytes", - "internalType": "bytes" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, { "type": "function", - "name": "lastInteraction", + "name": "balanceOf", "inputs": [ { - "name": "", + "name": "account", "type": "address", "internalType": "address" } ], "outputs": [ { - "name": "requestId", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "sender", - "type": "address", - "internalType": "address" - }, - { - "name": "prompt", - "type": "string", - "internalType": "string" - }, - { - "name": "response", - "type": "string", - "internalType": "string" + "name": "", + "type": "uint256", + "internalType": "uint256" } ], "stateMutability": "view" }, { "type": "function", - "name": "owner", + "name": "increment", "inputs": [], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address" - } - ], - "stateMutability": "view" + "outputs": [], + "stateMutability": "nonpayable" }, { "type": "function", - "name": "price", + "name": "number", "inputs": [], "outputs": [ { @@ -131,81 +44,10 @@ }, { "type": "function", - "name": "sendRequest", - "inputs": [ - { - "name": "userPrompt", - "type": "string", - "internalType": "string" - } - ], - "outputs": [ - { - "name": "requestId", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "stateMutability": "payable" - }, - { - "type": "function", - "name": "setDonHostedSecretsVersion", - "inputs": [ - { - "name": "donHostedSecretsVersion_", - "type": "uint64", - "internalType": "uint64" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "setDonID", - "inputs": [ - { - "name": "donId_", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "setGasLimit", - "inputs": [ - { - "name": "gasLimit_", - "type": "uint32", - "internalType": "uint32" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "setJavascript", - "inputs": [ - { - "name": "javascript_", - "type": "string", - "internalType": "string" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "setPrice", + "name": "setNumber", "inputs": [ { - "name": "price_", + "name": "newNumber", "type": "uint256", "internalType": "uint256" } @@ -215,2435 +57,35 @@ }, { "type": "function", - "name": "setSubscriptionId", - "inputs": [ - { - "name": "subscriptionId_", - "type": "uint64", - "internalType": "uint64" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "transferOwnership", - "inputs": [ - { - "name": "to", - "type": "address", - "internalType": "address" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "withdraw", - "inputs": [], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "event", - "name": "InteractionLog", - "inputs": [ - { - "name": "requestId", - "type": "bytes32", - "indexed": true, - "internalType": "bytes32" - }, - { - "name": "sender", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "isResponse", - "type": "bool", - "indexed": true, - "internalType": "bool" - }, - { - "name": "prompt", - "type": "string", - "indexed": false, - "internalType": "string" - }, - { - "name": "response", - "type": "string", - "indexed": false, - "internalType": "string" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "JavascriptLog", - "inputs": [ - { - "name": "javascript", - "type": "string", - "indexed": false, - "internalType": "string" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "OwnershipTransferRequested", - "inputs": [ - { - "name": "from", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "to", - "type": "address", - "indexed": true, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "OwnershipTransferred", - "inputs": [ - { - "name": "from", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "to", - "type": "address", - "indexed": true, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "PriceLog", + "name": "square", "inputs": [ { - "name": "price", + "name": "num", "type": "uint256", - "indexed": true, "internalType": "uint256" } ], - "anonymous": false - }, - { - "type": "event", - "name": "RequestFulfilled", - "inputs": [ - { - "name": "id", - "type": "bytes32", - "indexed": true, - "internalType": "bytes32" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "RequestSent", - "inputs": [ - { - "name": "id", - "type": "bytes32", - "indexed": true, - "internalType": "bytes32" - } - ], - "anonymous": false - }, - { - "type": "error", - "name": "EmptyArgs", - "inputs": [] - }, - { - "type": "error", - "name": "EmptySource", - "inputs": [] - }, - { - "type": "error", - "name": "NoEmptyPrompt", - "inputs": [] - }, - { - "type": "error", - "name": "NoInlineSecrets", - "inputs": [] - }, - { - "type": "error", - "name": "NoValidSecrets", - "inputs": [] - }, - { - "type": "error", - "name": "OnlyRouterCanFulfill", - "inputs": [] - }, - { - "type": "error", - "name": "PaymentRequired", - "inputs": [ - { - "name": "expected", - "type": "uint256", - "internalType": "uint256" - }, + "outputs": [ { - "name": "actual", + "name": "", "type": "uint256", "internalType": "uint256" } - ] - }, - { - "type": "error", - "name": "UnexpectedFullfillRequest", - "inputs": [ - { - "name": "expected", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "response", - "type": "string", - "internalType": "string" - }, - { - "name": "err", - "type": "string", - "internalType": "string" - } - ] + ], + "stateMutability": "pure" }, { - "type": "error", - "name": "WithdrawFailed", + "type": "event", + "name": "NumberChanged", "inputs": [ { - "name": "receiver", - "type": "address", - "internalType": "address" - }, - { - "name": "balance", + "name": "newNumber", "type": "uint256", + "indexed": false, "internalType": "uint256" } - ] - } - ] - } - }, - "31337": { - "Counter": { - "address": "0x0116686E2291dbd5e317F47faDBFb43B599786Ef", - "abi": [ - { - "type": "function", - "name": "balanceOf", - "inputs": [ - { - "name": "account", - "type": "address", - "internalType": "address" - } - ], - "outputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "increment", - "inputs": [], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "number", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "setNumber", - "inputs": [ - { - "name": "newNumber", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "square", - "inputs": [ - { - "name": "num", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "pure" - }, - { - "type": "event", - "name": "NumberChanged", - "inputs": [ - { - "name": "newNumber", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - } - ], - "anonymous": false - } - ] - }, - "Faucet": { - "address": "0x9bAaB117304f7D6517048e371025dB8f89a8DbE5", - "abi": [ - { - "type": "constructor", - "inputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "receive", - "stateMutability": "payable" - }, - { - "type": "function", - "name": "allowedRequester", - "inputs": [ - { - "name": "", - "type": "address", - "internalType": "address" - } - ], - "outputs": [ - { - "name": "", - "type": "bool", - "internalType": "bool" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "owner", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "requestSomeEther", - "inputs": [ - { - "name": "receiver", - "type": "address", - "internalType": "address" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "setAllowedRequester", - "inputs": [ - { - "name": "requester", - "type": "address", - "internalType": "address" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "setAmount", - "inputs": [ - { - "name": "amount", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "someAmount", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "withdraw", - "inputs": [], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "error", - "name": "FailedToSendEther", - "inputs": [ - { - "name": "balance", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "someAmount", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "result", - "type": "bytes", - "internalType": "bytes" - } - ] - }, - { - "type": "error", - "name": "FailedToWithdrawEther", - "inputs": [ - { - "name": "balance", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "result", - "type": "bytes", - "internalType": "bytes" - } - ] - }, - { - "type": "error", - "name": "NotAllowedRequester", - "inputs": [ - { - "name": "sender", - "type": "address", - "internalType": "address" - } - ] - }, - { - "type": "error", - "name": "NotEnoughBalance", - "inputs": [ - { - "name": "balance", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "someAmount", - "type": "uint256", - "internalType": "uint256" - } - ] - }, - { - "type": "error", - "name": "NotForZeroAddress", - "inputs": [] - }, - { - "type": "error", - "name": "NotOwner", - "inputs": [ - { - "name": "sender", - "type": "address", - "internalType": "address" - }, - { - "name": "owner", - "type": "address", - "internalType": "address" - } - ] - } - ] - }, - "MockRouter": { - "address": "0x31A65C6d4EB07ad51E7afc890aC3b7bE84dF2Ead", - "abi": [ - { - "type": "function", - "name": "addConsumer", - "inputs": [ - { - "name": "subscriptionId", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "consumer", - "type": "address", - "internalType": "address" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "counter", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "fulfillRequest", - "inputs": [ - { - "name": "requestId", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "response", - "type": "bytes", - "internalType": "bytes" - }, - { - "name": "err", - "type": "bytes", - "internalType": "bytes" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "getConsumer", - "inputs": [ - { - "name": "consumer", - "type": "address", - "internalType": "address" - }, - { - "name": "subscriptionId", - "type": "uint64", - "internalType": "uint64" - } - ], - "outputs": [ - { - "name": "", - "type": "tuple", - "internalType": "struct IMockRouter.Consumer", - "components": [ - { - "name": "allowed", - "type": "bool", - "internalType": "bool" - }, - { - "name": "initiatedRequests", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "completedRequests", - "type": "uint64", - "internalType": "uint64" - } - ] - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "onChainAI", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "removeConsumer", - "inputs": [ - { - "name": "subscriptionId", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "consumer", - "type": "address", - "internalType": "address" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "sendRequest", - "inputs": [ - { - "name": "subscriptionId", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "data", - "type": "bytes", - "internalType": "bytes" - }, - { - "name": "dataVersion", - "type": "uint16", - "internalType": "uint16" - }, - { - "name": "callbackGasLimit", - "type": "uint32", - "internalType": "uint32" - }, - { - "name": "donId", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "outputs": [ - { - "name": "requestId", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "setOnChainAI", - "inputs": [ - { - "name": "onChainAI_", - "type": "address", - "internalType": "address" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "event", - "name": "ConsumerEvent", - "inputs": [ - { - "name": "consumer", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "subscriptionId", - "type": "uint64", - "indexed": true, - "internalType": "uint64" - }, - { - "name": "allowed", - "type": "bool", - "indexed": true, - "internalType": "bool" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "RequestEvent", - "inputs": [ - { - "name": "requestId", - "type": "bytes32", - "indexed": true, - "internalType": "bytes32" - }, - { - "name": "data", - "type": "bytes", - "indexed": false, - "internalType": "bytes" - }, - { - "name": "subscriptionId", - "type": "uint64", - "indexed": true, - "internalType": "uint64" - }, - { - "name": "donId", - "type": "bytes32", - "indexed": true, - "internalType": "bytes32" - }, - { - "name": "dataVersion", - "type": "uint16", - "indexed": false, - "internalType": "uint16" - }, - { - "name": "callbackGasLimit", - "type": "uint32", - "indexed": false, - "internalType": "uint32" - } - ], - "anonymous": false - } - ] - }, - "OnChainAIv1": { - "address": "0x2706A171ECb68E0038378D40Dd1d136361d0cB7d", - "abi": [ - { - "type": "constructor", - "inputs": [ - { - "name": "router", - "type": "address", - "internalType": "address" - }, - { - "name": "javascript_", - "type": "string", - "internalType": "string" - }, - { - "name": "subscriptionId_", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "gasLimit_", - "type": "uint32", - "internalType": "uint32" - }, - { - "name": "donId_", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "price_", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "acceptOwnership", - "inputs": [], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "handleOracleFulfillment", - "inputs": [ - { - "name": "requestId", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "response", - "type": "bytes", - "internalType": "bytes" - }, - { - "name": "err", - "type": "bytes", - "internalType": "bytes" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "lastInteraction", - "inputs": [ - { - "name": "", - "type": "address", - "internalType": "address" - } - ], - "outputs": [ - { - "name": "requestId", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "sender", - "type": "address", - "internalType": "address" - }, - { - "name": "prompt", - "type": "string", - "internalType": "string" - }, - { - "name": "response", - "type": "string", - "internalType": "string" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "owner", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "price", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "sendRequest", - "inputs": [ - { - "name": "userPrompt", - "type": "string", - "internalType": "string" - } - ], - "outputs": [ - { - "name": "requestId", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "stateMutability": "payable" - }, - { - "type": "function", - "name": "setDonHostedSecretsVersion", - "inputs": [ - { - "name": "donHostedSecretsVersion_", - "type": "uint64", - "internalType": "uint64" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "setDonID", - "inputs": [ - { - "name": "donId_", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "setGasLimit", - "inputs": [ - { - "name": "gasLimit_", - "type": "uint32", - "internalType": "uint32" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "setJavascript", - "inputs": [ - { - "name": "javascript_", - "type": "string", - "internalType": "string" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "setPrice", - "inputs": [ - { - "name": "price_", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "setSubscriptionId", - "inputs": [ - { - "name": "subscriptionId_", - "type": "uint64", - "internalType": "uint64" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "transferOwnership", - "inputs": [ - { - "name": "to", - "type": "address", - "internalType": "address" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "withdraw", - "inputs": [], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "event", - "name": "InteractionLog", - "inputs": [ - { - "name": "requestId", - "type": "bytes32", - "indexed": true, - "internalType": "bytes32" - }, - { - "name": "sender", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "isResponse", - "type": "bool", - "indexed": true, - "internalType": "bool" - }, - { - "name": "prompt", - "type": "string", - "indexed": false, - "internalType": "string" - }, - { - "name": "response", - "type": "string", - "indexed": false, - "internalType": "string" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "JavascriptLog", - "inputs": [ - { - "name": "javascript", - "type": "string", - "indexed": false, - "internalType": "string" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "OwnershipTransferRequested", - "inputs": [ - { - "name": "from", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "to", - "type": "address", - "indexed": true, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "OwnershipTransferred", - "inputs": [ - { - "name": "from", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "to", - "type": "address", - "indexed": true, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "PriceLog", - "inputs": [ - { - "name": "price", - "type": "uint256", - "indexed": true, - "internalType": "uint256" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "RequestFulfilled", - "inputs": [ - { - "name": "id", - "type": "bytes32", - "indexed": true, - "internalType": "bytes32" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "RequestSent", - "inputs": [ - { - "name": "id", - "type": "bytes32", - "indexed": true, - "internalType": "bytes32" - } - ], - "anonymous": false - }, - { - "type": "error", - "name": "EmptyArgs", - "inputs": [] - }, - { - "type": "error", - "name": "EmptySource", - "inputs": [] - }, - { - "type": "error", - "name": "NoEmptyPrompt", - "inputs": [] - }, - { - "type": "error", - "name": "NoInlineSecrets", - "inputs": [] - }, - { - "type": "error", - "name": "NoValidSecrets", - "inputs": [] - }, - { - "type": "error", - "name": "OnlyRouterCanFulfill", - "inputs": [] - }, - { - "type": "error", - "name": "PaymentRequired", - "inputs": [ - { - "name": "expected", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "actual", - "type": "uint256", - "internalType": "uint256" - } - ] - }, - { - "type": "error", - "name": "UnexpectedFullfillRequest", - "inputs": [ - { - "name": "expected", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "response", - "type": "string", - "internalType": "string" - }, - { - "name": "err", - "type": "string", - "internalType": "string" - } - ] - }, - { - "type": "error", - "name": "WithdrawFailed", - "inputs": [ - { - "name": "receiver", - "type": "address", - "internalType": "address" - }, - { - "name": "balance", - "type": "uint256", - "internalType": "uint256" - } - ] - } - ] - } - }, - "84532": { - "Counter": { - "address": "0xb1eC295A306436560C7A27616f51B5d76D6aDCa8", - "abi": [ - { - "type": "function", - "name": "balanceOf", - "inputs": [ - { - "name": "account", - "type": "address", - "internalType": "address" - } - ], - "outputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "increment", - "inputs": [], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "number", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "setNumber", - "inputs": [ - { - "name": "newNumber", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "square", - "inputs": [ - { - "name": "num", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "pure" - }, - { - "type": "event", - "name": "NumberChanged", - "inputs": [ - { - "name": "newNumber", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - } - ], - "anonymous": false - } - ] - }, - "Faucet": { - "address": "0xafdB96b80590042c2B557D38Ea4a4b9EceAf262b", - "abi": [ - { - "type": "constructor", - "inputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "receive", - "stateMutability": "payable" - }, - { - "type": "function", - "name": "allowedRequester", - "inputs": [ - { - "name": "", - "type": "address", - "internalType": "address" - } - ], - "outputs": [ - { - "name": "", - "type": "bool", - "internalType": "bool" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "owner", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "requestSomeEther", - "inputs": [ - { - "name": "receiver", - "type": "address", - "internalType": "address" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "setAllowedRequester", - "inputs": [ - { - "name": "requester", - "type": "address", - "internalType": "address" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "setAmount", - "inputs": [ - { - "name": "amount", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "someAmount", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "withdraw", - "inputs": [], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "error", - "name": "FailedToSendEther", - "inputs": [ - { - "name": "balance", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "someAmount", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "result", - "type": "bytes", - "internalType": "bytes" - } - ] - }, - { - "type": "error", - "name": "FailedToWithdrawEther", - "inputs": [ - { - "name": "balance", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "result", - "type": "bytes", - "internalType": "bytes" - } - ] - }, - { - "type": "error", - "name": "NotAllowedRequester", - "inputs": [ - { - "name": "sender", - "type": "address", - "internalType": "address" - } - ] - }, - { - "type": "error", - "name": "NotEnoughBalance", - "inputs": [ - { - "name": "balance", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "someAmount", - "type": "uint256", - "internalType": "uint256" - } - ] - }, - { - "type": "error", - "name": "NotForZeroAddress", - "inputs": [] - }, - { - "type": "error", - "name": "NotOwner", - "inputs": [ - { - "name": "sender", - "type": "address", - "internalType": "address" - }, - { - "name": "owner", - "type": "address", - "internalType": "address" - } - ] - } - ] - }, - "OnChainAIv1": { - "address": "0xc308300b222bf2C6B0C81D8C1a64909D0a32b5Ec", - "abi": [ - { - "type": "constructor", - "inputs": [ - { - "name": "router", - "type": "address", - "internalType": "address" - }, - { - "name": "javascript_", - "type": "string", - "internalType": "string" - }, - { - "name": "subscriptionId_", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "gasLimit_", - "type": "uint32", - "internalType": "uint32" - }, - { - "name": "donId_", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "price_", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "acceptOwnership", - "inputs": [], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "handleOracleFulfillment", - "inputs": [ - { - "name": "requestId", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "response", - "type": "bytes", - "internalType": "bytes" - }, - { - "name": "err", - "type": "bytes", - "internalType": "bytes" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "lastInteraction", - "inputs": [ - { - "name": "", - "type": "address", - "internalType": "address" - } - ], - "outputs": [ - { - "name": "requestId", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "sender", - "type": "address", - "internalType": "address" - }, - { - "name": "prompt", - "type": "string", - "internalType": "string" - }, - { - "name": "response", - "type": "string", - "internalType": "string" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "owner", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "price", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "sendRequest", - "inputs": [ - { - "name": "userPrompt", - "type": "string", - "internalType": "string" - } - ], - "outputs": [ - { - "name": "requestId", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "stateMutability": "payable" - }, - { - "type": "function", - "name": "setDonHostedSecretsVersion", - "inputs": [ - { - "name": "donHostedSecretsVersion_", - "type": "uint64", - "internalType": "uint64" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "setDonID", - "inputs": [ - { - "name": "donId_", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "setGasLimit", - "inputs": [ - { - "name": "gasLimit_", - "type": "uint32", - "internalType": "uint32" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "setJavascript", - "inputs": [ - { - "name": "javascript_", - "type": "string", - "internalType": "string" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "setPrice", - "inputs": [ - { - "name": "price_", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "setSubscriptionId", - "inputs": [ - { - "name": "subscriptionId_", - "type": "uint64", - "internalType": "uint64" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "transferOwnership", - "inputs": [ - { - "name": "to", - "type": "address", - "internalType": "address" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "withdraw", - "inputs": [], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "event", - "name": "InteractionLog", - "inputs": [ - { - "name": "requestId", - "type": "bytes32", - "indexed": true, - "internalType": "bytes32" - }, - { - "name": "sender", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "isResponse", - "type": "bool", - "indexed": true, - "internalType": "bool" - }, - { - "name": "prompt", - "type": "string", - "indexed": false, - "internalType": "string" - }, - { - "name": "response", - "type": "string", - "indexed": false, - "internalType": "string" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "JavascriptLog", - "inputs": [ - { - "name": "javascript", - "type": "string", - "indexed": false, - "internalType": "string" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "OwnershipTransferRequested", - "inputs": [ - { - "name": "from", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "to", - "type": "address", - "indexed": true, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "OwnershipTransferred", - "inputs": [ - { - "name": "from", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "to", - "type": "address", - "indexed": true, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "PriceLog", - "inputs": [ - { - "name": "price", - "type": "uint256", - "indexed": true, - "internalType": "uint256" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "RequestFulfilled", - "inputs": [ - { - "name": "id", - "type": "bytes32", - "indexed": true, - "internalType": "bytes32" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "RequestSent", - "inputs": [ - { - "name": "id", - "type": "bytes32", - "indexed": true, - "internalType": "bytes32" - } - ], - "anonymous": false - }, - { - "type": "error", - "name": "EmptyArgs", - "inputs": [] - }, - { - "type": "error", - "name": "EmptySource", - "inputs": [] - }, - { - "type": "error", - "name": "NoEmptyPrompt", - "inputs": [] - }, - { - "type": "error", - "name": "NoInlineSecrets", - "inputs": [] - }, - { - "type": "error", - "name": "NoValidSecrets", - "inputs": [] - }, - { - "type": "error", - "name": "OnlyRouterCanFulfill", - "inputs": [] - }, - { - "type": "error", - "name": "PaymentRequired", - "inputs": [ - { - "name": "expected", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "actual", - "type": "uint256", - "internalType": "uint256" - } - ] - }, - { - "type": "error", - "name": "UnexpectedFullfillRequest", - "inputs": [ - { - "name": "expected", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "response", - "type": "string", - "internalType": "string" - }, - { - "name": "err", - "type": "string", - "internalType": "string" - } - ] - }, - { - "type": "error", - "name": "WithdrawFailed", - "inputs": [ - { - "name": "receiver", - "type": "address", - "internalType": "address" - }, - { - "name": "balance", - "type": "uint256", - "internalType": "uint256" - } - ] - } - ] - } - }, - "11155420": { - "OnChainAIv1": { - "address": "0x879ae6BC9a6173A14111FE204ec0E14DCB619e9E", - "abi": [ - { - "type": "constructor", - "inputs": [ - { - "name": "router", - "type": "address", - "internalType": "address" - }, - { - "name": "javascript_", - "type": "string", - "internalType": "string" - }, - { - "name": "subscriptionId_", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "gasLimit_", - "type": "uint32", - "internalType": "uint32" - }, - { - "name": "donId_", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "price_", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "acceptOwnership", - "inputs": [], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "handleOracleFulfillment", - "inputs": [ - { - "name": "requestId", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "response", - "type": "bytes", - "internalType": "bytes" - }, - { - "name": "err", - "type": "bytes", - "internalType": "bytes" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "lastInteraction", - "inputs": [ - { - "name": "", - "type": "address", - "internalType": "address" - } - ], - "outputs": [ - { - "name": "requestId", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "sender", - "type": "address", - "internalType": "address" - }, - { - "name": "prompt", - "type": "string", - "internalType": "string" - }, - { - "name": "response", - "type": "string", - "internalType": "string" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "owner", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "price", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "sendRequest", - "inputs": [ - { - "name": "userPrompt", - "type": "string", - "internalType": "string" - } - ], - "outputs": [ - { - "name": "requestId", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "stateMutability": "payable" - }, - { - "type": "function", - "name": "setDonHostedSecretsVersion", - "inputs": [ - { - "name": "donHostedSecretsVersion_", - "type": "uint64", - "internalType": "uint64" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "setDonID", - "inputs": [ - { - "name": "donId_", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "setGasLimit", - "inputs": [ - { - "name": "gasLimit_", - "type": "uint32", - "internalType": "uint32" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "setJavascript", - "inputs": [ - { - "name": "javascript_", - "type": "string", - "internalType": "string" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "setPrice", - "inputs": [ - { - "name": "price_", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "setSubscriptionId", - "inputs": [ - { - "name": "subscriptionId_", - "type": "uint64", - "internalType": "uint64" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "transferOwnership", - "inputs": [ - { - "name": "to", - "type": "address", - "internalType": "address" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "withdraw", - "inputs": [], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "event", - "name": "InteractionLog", - "inputs": [ - { - "name": "requestId", - "type": "bytes32", - "indexed": true, - "internalType": "bytes32" - }, - { - "name": "sender", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "isResponse", - "type": "bool", - "indexed": true, - "internalType": "bool" - }, - { - "name": "prompt", - "type": "string", - "indexed": false, - "internalType": "string" - }, - { - "name": "response", - "type": "string", - "indexed": false, - "internalType": "string" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "JavascriptLog", - "inputs": [ - { - "name": "javascript", - "type": "string", - "indexed": false, - "internalType": "string" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "OwnershipTransferRequested", - "inputs": [ - { - "name": "from", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "to", - "type": "address", - "indexed": true, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "OwnershipTransferred", - "inputs": [ - { - "name": "from", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "to", - "type": "address", - "indexed": true, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "PriceLog", - "inputs": [ - { - "name": "price", - "type": "uint256", - "indexed": true, - "internalType": "uint256" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "RequestFulfilled", - "inputs": [ - { - "name": "id", - "type": "bytes32", - "indexed": true, - "internalType": "bytes32" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "RequestSent", - "inputs": [ - { - "name": "id", - "type": "bytes32", - "indexed": true, - "internalType": "bytes32" - } ], "anonymous": false - }, - { - "type": "error", - "name": "EmptyArgs", - "inputs": [] - }, - { - "type": "error", - "name": "EmptySource", - "inputs": [] - }, - { - "type": "error", - "name": "NoEmptyPrompt", - "inputs": [] - }, - { - "type": "error", - "name": "NoInlineSecrets", - "inputs": [] - }, - { - "type": "error", - "name": "NoValidSecrets", - "inputs": [] - }, - { - "type": "error", - "name": "OnlyRouterCanFulfill", - "inputs": [] - }, - { - "type": "error", - "name": "PaymentRequired", - "inputs": [ - { - "name": "expected", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "actual", - "type": "uint256", - "internalType": "uint256" - } - ] - }, - { - "type": "error", - "name": "UnexpectedFullfillRequest", - "inputs": [ - { - "name": "expected", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "response", - "type": "string", - "internalType": "string" - }, - { - "name": "err", - "type": "string", - "internalType": "string" - } - ] - }, - { - "type": "error", - "name": "WithdrawFailed", - "inputs": [ - { - "name": "receiver", - "type": "address", - "internalType": "address" - }, - { - "name": "balance", - "type": "uint256", - "internalType": "uint256" - } - ] } ] } diff --git a/src/lib/scaffold.config.ts b/src/lib/scaffold.config.ts deleted file mode 100644 index 15d3588..0000000 --- a/src/lib/scaffold.config.ts +++ /dev/null @@ -1,46 +0,0 @@ -import * as env from '$env/static/public'; -import * as chains from 'viem/chains'; - -export type ScaffoldConfig = { - targetNetworks: readonly chains.Chain[]; - pollingInterval: number; - alchemyApiKey: string; - walletConnectProjectId: string; - onlyLocalBurnerWallet: boolean; - burnetWalletKey: string; -}; - -const { PUBLIC_ALCHEMY_API_KEY, PUBLIC_WALLET_CONNECT_PROJECT_ID, PUBLIC_BURNER_WALLET_KEY } = - env as { - PUBLIC_ALCHEMY_API_KEY?: string; - PUBLIC_WALLET_CONNECT_PROJECT_ID?: string; - PUBLIC_BURNER_WALLET_KEY?: string; - }; - -const scaffoldConfig = { - // The networks on which your DApp is live - targetNetworks: [chains.base, chains.baseSepolia, chains.optimismSepolia, chains.anvil], - - // The interval at which your front-end polls the RPC servers for new data - // it has no effect if you only target the local network (default is 4000) - pollingInterval: 4000, - - // This is ours Alchemy's default API key. - // You can get your own at https://dashboard.alchemyapi.io - // It's recommended to store it in an env variable: - // .env.local for local testing, and in the Vercel/system env config for live apps. - alchemyApiKey: PUBLIC_ALCHEMY_API_KEY || '', - - // This is ours WalletConnect's default project ID. - // You can get your own at https://cloud.walletconnect.com - // It's recommended to store it in an env variable: - // .env.local for local testing, and in the Vercel/system env config for live apps. - walletConnectProjectId: PUBLIC_WALLET_CONNECT_PROJECT_ID || '', - - // Only show the Burner Wallet when running on local network - onlyLocalBurnerWallet: false, - - burnetWalletKey: PUBLIC_BURNER_WALLET_KEY || '' -} as const satisfies ScaffoldConfig; - -export default scaffoldConfig; diff --git a/src/lib/test/Counter.svelte.ts b/src/lib/test/Counter.svelte.ts new file mode 100644 index 0000000..f76ee3f --- /dev/null +++ b/src/lib/test/Counter.svelte.ts @@ -0,0 +1,33 @@ +import { SmartContract } from "$lib/wagmi/classes"; +import type { Address } from "viem"; +import { isAddress } from "$lib/wagmi/ts"; + +class Counter extends SmartContract { + get number() { + return this.call("number") as bigint; + } + increment = async () => { + await this.sendAndWait("increment"); + await this.callAsync("number"); + }; + setNumber = async (num: number) => { + await this.sendAndWait("setNumber", [num]); + await this.callAsync("number"); + }; + square(num: number) { + return this.call("square", [num]) as bigint; + } + balanceOf(address: Address) { + if (!isAddress(address)) return; + + const balance = this.call("balanceOf", [address]) as bigint; + + return balance; + } + + constructor() { + super("Counter"); + } +} + +export { Counter }; diff --git a/src/lib/wagmi/classes/Account.svelte.ts b/src/lib/wagmi/classes/Account.svelte.ts new file mode 100644 index 0000000..f8772ac --- /dev/null +++ b/src/lib/wagmi/classes/Account.svelte.ts @@ -0,0 +1,47 @@ +import { type Address as AddressType } from "viem"; +import { getAccount, watchAccount } from "@wagmi/core"; +import { Address, wagmiConfig } from "$lib/wagmi/classes"; +import type { Nullable } from "../ts"; + +type AccountType = ReturnType; + +// Account => account & chain & chainId & isConnected & connectorId +// Address => address & balance & symbol & decimals & ensName & ensAvatar +class Account extends Address { + #account = $state>(); + + get chain() { + return this.#account?.chain; + } + get chainId() { + return this.#account?.chainId; + } + get isConnected() { + return this.#account?.isConnected; + } + get connectorId() { + return this.#account?.connector?.id; + } + + watch = () => + watchAccount(wagmiConfig, { + onChange: (newAccount: AccountType) => { + console.log("watchAccount Change:", newAccount); + this.#account = newAccount; + super.address = newAccount.address; + } + }); + + constructor({ ens = false, watchBalance = false } = {}) { + const account = getAccount(wagmiConfig); + super(account.address, { ens, watchBalance }); + + this.#account = account; + + this.watch(); + // $inspect("Account account", this.account); + // $inspect("Account", this.chainId, this.address, this.connectorId); + } +} + +export { Account }; diff --git a/src/lib/wagmi/classes/Address.svelte.ts b/src/lib/wagmi/classes/Address.svelte.ts new file mode 100644 index 0000000..a6ecd20 --- /dev/null +++ b/src/lib/wagmi/classes/Address.svelte.ts @@ -0,0 +1,131 @@ +import { type Address as AddressType, checksumAddress } from "viem"; +import { deepEqual, getBalance as getBalanceWagmi, getChainId, type GetBalanceReturnType } from "@wagmi/core"; + +import { isAddress, isEns } from "$lib/wagmi/ts"; +import type { Nullable } from "$lib/wagmi/ts"; +import { wagmi, wagmiConfig, Watcher } from "$lib/wagmi/classes"; +import { getEnsAddress, getEnsAvatar, getEnsName } from "@wagmi/core"; +import { mainnet } from "viem/chains"; +import { untrack } from "svelte"; + +class Address { + watcher: Nullable; + #address = $state>(); + #balance = $state>(); + #ensName = $state(); + #ensAvatar = $state(); + + #watchBalance = false; + #ens = false; + + #reset = () => { + this.watcher?.stop(); + this.#address = null; + this.#balance = null; + this.#ensName = undefined; + this.#ensAvatar = undefined; + }; + + #getAndWatchBalance = () => { + this.getBalance(); + if (this.#watchBalance) { + this.watcher ??= new Watcher(); + this.watcher.restart(this.getBalance); + } + }; + getBalance = async () => { + if (!(this.address && isAddress(this.address))) return; + + const balance = await getBalanceWagmi(wagmiConfig, { address: this.address }); + if (!deepEqual($state.snapshot(this.#balance), balance)) this.#balance = balance; + }; + + #setAddressPlus = async (address: AddressType) => { + this.#address = address; + if (this.#ens) { + const ensName = address + ? ((await getEnsName(wagmiConfig, { chainId: mainnet.id, address })) as string) + : undefined; + this.#ensName = ensName; + this.#ensAvatar = ensName + ? ((await getEnsAvatar(wagmiConfig, { chainId: mainnet.id, name: ensName })) as string) + : undefined; + } else { + this.#ensName = undefined; + this.#ensAvatar = undefined; + } + }; + #setEnsNamePlus = async (ensName: string) => { + this.#ensName = ensName; + if (this.#ens) { + this.#ensAvatar = (await getEnsAvatar(wagmiConfig, { chainId: mainnet.id, name: ensName })) as string; + this.#address = await getEnsAddress(wagmiConfig, { chainId: mainnet.id, name: ensName }); + } + }; + + setAddressOrName = (addressOrName: Nullable) => { + if (isAddress(addressOrName)) { + this.address = addressOrName; + } else if (isEns(addressOrName)) { + this.ensName = addressOrName as string; + } else { + this.#reset(); + } + }; + set address(addr: Nullable) { + const checkSumAddr = isAddress(addr) ? checksumAddress(addr as AddressType) : addr; + + if (!isAddress(checkSumAddr)) this.#reset(); + + this.getBalance(); + this.#setAddressPlus(checkSumAddr!); + } + set ensName(ensName: string) { + if (this.#ensName === ensName) return; + if (!isEns(ensName)) this.#reset(); + + this.#setEnsNamePlus(ensName!); + } + + get address(): Nullable { + return this.#address; + } + get ensName(): string | undefined { + return this.#ensName; + } + get ensAvatar(): string | undefined { + return this.#ensAvatar; + } + get balance() { + return this.#balance?.value; + } + get decimals() { + return this.#balance?.decimals; + } + get symbol() { + return this.#balance?.symbol; + } + + constructor(addressOrName: Nullable, { watchBalance = false, ens = false } = {}) { + // console.log("
{ + if (!this.address) return; + wagmi.chainId; + // getChainId(wagmiConfig); + + this.address; + untrack(() => this.#getAndWatchBalance()); + }); + + // $inspect(" { + this.unsubscribe?.(); + return watchPublicClient(wagmiConfig, { onChange: this.onChange }); + }); +} + +export { Client }; diff --git a/src/lib/wagmi/classes/Events.svelte.ts b/src/lib/wagmi/classes/Events.svelte.ts new file mode 100644 index 0000000..f862d8f --- /dev/null +++ b/src/lib/wagmi/classes/Events.svelte.ts @@ -0,0 +1,110 @@ +import { type Address as AddressType, type ContractEventName, type Log } from "viem"; + +import { type DeploymentContractName } from "$lib/wagmi/ts"; + +import { SmartContract, wagmi, wagmiConfig } from "$lib/wagmi/classes"; +import { getContractEvents, type LogWithArgs } from "$lib/wagmi/ts"; +import { watchContractEvent, getBlockNumber, getChainId } from "@wagmi/core"; + +type EventsFilter = { eventName?: ContractEventName; args?: Record }; +type EventsSortOrder = "DESC" | "ASC" | undefined; + +class Events extends SmartContract { + limit: number = $state(0); + sort: EventsSortOrder = $state("DESC"); + filter: EventsFilter = $state({}); + raw: boolean = $state(true); + + // listAll is sorted from the oldest event (oldest block and oldest index inside block) to newest + listAll = $state([]); + + // list is sorted with this.sort order then sliced and optionnaly mapped to only return the args + list = $derived.by(() => { + const list = (this.sort === "DESC" ? this.listAll.toReversed() : this.listAll).slice(0, this.limit); + return this.raw ? list : list.map((event) => event.args); + }); + + get last() { + return this.list[0]; + } + get count() { + return this.list.length; + } + get max() { + return this.listAll.length; + } + + refresher = 0; + refresh = () => this.refresher++; + + watch = async () => { + if (!(this.address && this.abi)) return; + + const params = { address: this.address, abi: this.abi, ...this.filter }; + // console.log("EVENTS watchContractEvent", params); + + try { + watchContractEvent(wagmiConfig, { + ...params, + onLogs: (logs: Log[]) => { + // console.log(`EVENTS watchContractEvent: ${logs.length} new log`); + this.listAll.push(...(logs as unknown as LogWithArgs[])); + } + }); + } catch (error) { + console.error("EVENTS Failed to watch logs:", error); + } + }; + + fetch = async (watch = false) => { + if (!(this.address && this.abi)) return; + + try { + const toBlock = await getBlockNumber(wagmiConfig); + const maxBlock = 100_000n; + const fromBlock = 0n; //toBlock > maxBlock ? toBlock - maxBlock : 0n; + + const params = { fromBlock, toBlock, address: this.address, abi: this.abi, ...this.filter }; + + this.listAll = ((await getContractEvents(wagmiConfig, params)) as LogWithArgs[]).toSorted((a, b) => { + const blockDelta = (Number(a.blockNumber) || 0) - (Number(b.blockNumber) || 0); + const indexDelta = (Number(a.transactionIndex) || 0) - (b.transactionIndex || 0); + return blockDelta > 0 ? 1 : blockDelta < 0 ? -1 : indexDelta; + }); + console.log("EVENTS fetch", this.listAll.length, params, $state.snapshot(this.listAll)); + } catch (error) { + console.error("EVENTS Failed to fetch logs:", error); + } + + if (watch) this.watch(); + }; + + constructor( + nameOrAddress: DeploymentContractName | AddressType, + { + filter = {}, + limit = 3, + sort = "DESC", + watch = true, + raw = true + }: { filter?: EventsFilter; limit?: number; sort?: EventsSortOrder; watch?: boolean; raw?: boolean } = {} + ) { + super(nameOrAddress); + + this.filter = filter; + this.limit = limit; + this.sort = sort; + this.raw = raw; + + $effect(() => { + wagmi.chainId; + console.log("EVENTS $effect ~ chainId :", wagmi.chainId); + this.fetch(watch); + }); + + // $inspect("list", list); + } +} + +export { Events }; +export type { EventsFilter, EventsSortOrder }; diff --git a/src/lib/wagmi/classes/Network.svelte.ts b/src/lib/wagmi/classes/Network.svelte.ts new file mode 100644 index 0000000..bc02eb4 --- /dev/null +++ b/src/lib/wagmi/classes/Network.svelte.ts @@ -0,0 +1,114 @@ +import { + type WatchBlockNumberReturnType, + getBlockNumber as getBlockNumberWagmi, + switchChain, + watchBlockNumber as watchBlockNumberWagmi, + disconnect as disconnectWagmi, + getChainId +} from "@wagmi/core"; +import { Account, wagmi, wagmiConfig } from "$lib/wagmi/classes"; +import * as chains from "viem/chains"; +import type { Chain } from "viem/chains"; +import { untrack } from "svelte"; + +let id = 0; + +// Network Class, reactive on chainId +class Network { + static findChain = (chainId: number | undefined): Chain | undefined => + chainId ? Object.values(chains).find((chain) => chain.id === chainId) : undefined; + static getExplorer = (chainId: number) => Network.findChain(chainId)?.blockExplorers?.default.url || ""; + + static chainIdLocal = 31337 as const; + + #id = ++id; + + #chainId: number = $state(31337); + chainIdDefault: number = Network.chainIdLocal; + get chainId() { + console.log("Network $effect getchainId ~ chainId:", this.#chainId); + return this.#chainId; + } + get chain() { + return Network.findChain(this.chainId) || Network.findChain(this.chainIdDefault) || chains.mainnet; + } + set chain(chain: Chain) { + this.#chainId = chain.id; + } + + get explorer() { + return Network.getExplorer(this.chainId); + } + get name() { + return this.chain.name; + } + get nativeCurrency() { + return this.chain.nativeCurrency; + } + + blockNumber: number | undefined = $state(); + getBlockNumber = async () => { + const blockNumber = Number(await getBlockNumberWagmi(wagmiConfig)); + + if (this.blockNumber !== blockNumber) this.blockNumber = blockNumber; + + return blockNumber; + }; + + watchingBlockNumber = $state(false); + unwatchBlockNumber: WatchBlockNumberReturnType | undefined; + watchBlockNumber = () => { + if (this.watchingBlockNumber) return; + + this.watchingBlockNumber = true; + const stop = watchBlockNumberWagmi(wagmiConfig, { + emitOnBegin: false, + onBlockNumber: (blockNumber) => (this.blockNumber = Number(blockNumber)) + }); + + this.unwatchBlockNumber = () => { + this.watchingBlockNumber = false; + stop?.(); + }; + }; + + switch = async (chainId: number | undefined) => { + if (!chainId) return; + + this.#chainId = chainId; + + if (chainId !== wagmi.chainId) await switchChain(wagmiConfig, { chainId }); + + console.log("", wagmi.chainId); + this.getBlockNumber(); + }; + + disconnect = async () => { + await disconnectWagmi(wagmiConfig); + }; + + constructor(chainId?: number) { + this.#chainId = chainId || this.chainIdDefault; + + const account = new Account(); + + $effect(() => { + if (!account.chainId) return; + if (!Network.findChain(account.chainId)) return; + + untrack(() => { + console.log("Network $effect:", this.#id, this.chainId, "=>", account.chainId, wagmi.chainId); + + if (account.chainId == this.chainId) return; + console.log("Network $effect switch:"); + this.switch(account.chainId); + + console.log("Network $effect:", this.#id, this.chainId, "==", account.chainId, wagmi.chainId); + }); + }); + + // $inspect("BLOCKCHAIN", this.chainId, this.blockNumber); + } +} + +export { Network }; diff --git a/src/lib/wagmi/classes/SmartContract.svelte.ts b/src/lib/wagmi/classes/SmartContract.svelte.ts new file mode 100644 index 0000000..c6e140b --- /dev/null +++ b/src/lib/wagmi/classes/SmartContract.svelte.ts @@ -0,0 +1,172 @@ +import { type Abi, type AbiFunction, type Address as AddressType } from "viem"; +import { SvelteMap } from "svelte/reactivity"; +import { + type ReadContractReturnType, + deepEqual, + getChainId, + readContract, + waitForTransactionReceipt, + writeContract +} from "@wagmi/core"; +import { wagmi, wagmiConfig } from "$lib/wagmi/classes"; +import { isAddress, shorten0xString, type DeploymentsChainId } from "$lib/wagmi/ts"; +import { readDeployment, type DeploymentContractName } from "$lib/wagmi/ts"; +import { untrack } from "svelte"; +import { notification } from "$lib/wagmi/ts"; +import { LinkTx } from "../components"; + +let counter = 0; + +class SmartContract { + id = 0; + chainId = $derived(wagmi.chainId as DeploymentsChainId); + + name: string | undefined; + #nameOrAddress: DeploymentContractName | AddressType | undefined; + + get address(): AddressType | undefined { + const { address } = readDeployment(this.chainId, this.#nameOrAddress!) ?? {}; + return address; + } + + get abi(): Abi | undefined { + const { abi } = readDeployment(this.chainId, this.#nameOrAddress!) ?? {}; + return abi; + } + + #setNameOrAddress(nameOrAddress: DeploymentContractName | AddressType) { + this.#nameOrAddress = nameOrAddress; + this.name = isAddress(nameOrAddress) + ? "Contract @" + shorten0xString(this.#nameOrAddress as `0x$string`) + : ((nameOrAddress as string) ?? ""); + } + + #getParamsOnCurrentChain = (functionName: string, args: unknown[]) => { + const chainId = this.chainId; + + const { address, abi } = readDeployment(chainId, this.#nameOrAddress!) ?? {}; + if (!(address && abi)) return; + + const dataKey = JSON.stringify({ chainId, address, functionName, args }); + + return { chainId, address, abi, dataKey }; + }; + + #call = async (chainId: number, address: AddressType, abi: Abi, functionName: string = "", args: unknown[] = []) => { + // console.log("SMARTCONTRACT READ", functionName, args, chainId, deployment.address, `#${this.id}`); + // console.log("SMARTCONTRACT READ", deployment.abi); + const abiFunction = (abi as unknown as AbiFunction[]).find( + (f) => f.type === "function" && f.name === functionName && f.inputs.length === args.length + ); + if (!abiFunction) throw new Error(`Function call to ${functionName} with ${args.length} args not found`); + + let data: ReadContractReturnType; + try { + data = await readContract(wagmiConfig, { address, abi, functionName, args }); + } catch (e: unknown) { + const newChainId = this.chainId; + if (newChainId === chainId) { + console.error(`SMARTCONTRACT READ '${functionName}' error on chain '${chainId}'`, e); + } else { + console.warn( + `SMARTCONTRACT READ '${functionName}' aborted`, + `while changing chain '${chainId}' => '${newChainId}'` + ); + } + } + + return data; + }; + + isFetching = $state(false); + #datas: SvelteMap = new SvelteMap(); + callAsync = async (functionName: string = "", args: unknown[] = []): Promise => { + const { chainId, address, abi, dataKey } = this.#getParamsOnCurrentChain(functionName, args) || {}; + if (!(chainId && address && abi && dataKey)) return; + + this.isFetching = true; + const newData = await this.#call(chainId, address, abi, functionName, args); + this.isFetching = false; + + const prevData = $state.snapshot(this.#datas.get(dataKey)); + if (!deepEqual(prevData, newData)) { + this.#datas.set(dataKey, newData); + console.info(`get ${this.name}#${this.id}`, functionName, args, "=>", newData); + } + }; + + call = (functionName: string = "", args: unknown[] = [], onStart = true): unknown | undefined => { + const { dataKey } = this.#getParamsOnCurrentChain(functionName, args) || {}; + if (!dataKey) return; + + // console.info(`call ${this.name}#${this.id}`, functionName, args,); + + if (this.#datas.has(dataKey!)) return this.#datas.get(dataKey!); + + if (onStart) untrack(() => this.callAsync(functionName, args)); + }; + + // Write SmartContract : send and wait + sendId = $state(""); + sending = $state(false); + waiting = $state(false); + notifs = new Map(); + send = async (functionName: string = "", args: unknown[] = [], value = 0n) => { + if (this.sending) return; + const { address, abi } = readDeployment(this.chainId, this.#nameOrAddress!) ?? {}; + if (!(address && abi)) return; + + let hash: `0x${string}` | undefined; + try { + this.sending = true; + + this.sendId = notification.loading("Sending transaction..."); + + hash = await writeContract(wagmiConfig, { address, abi, functionName, args, value }); + + const idHash = notification.info(LinkTx as any, { props: { hash, message: "Transaction sent!" } }); + this.notifs.set(hash, idHash); + } catch (e: unknown) { + notification.error(LinkTx as any, { props: { hash, message: "Transaction call failed!" } }); + throw new Error(`writeContract error: ${e}`); + } finally { + this.sending = false; + notification.remove(this.sendId); + } + + if (!hash) { + notification.error(`Transaction failed, no hash!`); + throw new Error("writeContract no hash"); + } + return hash; + }; + wait = async (hash: `0x${string}`) => { + this.waiting = true; + let receipt = await waitForTransactionReceipt(wagmiConfig, { hash }); + + notification.remove(this.notifs.get(hash)); + notification.success(LinkTx as any, { + props: { hash, message: "Transaction validated!" } + }); + + this.waiting = false; + return receipt; + }; + sendAndWait = async (functionName: string = "", args: unknown[] = [], value = 0n) => { + const hash = await this.send(functionName, args, value); + if (hash) await this.wait(hash); + return hash; + }; + + constructor(nameOrAddress: DeploymentContractName | AddressType) { + if (!nameOrAddress) throw new Error("SmartContract nameOrAddress required"); + + this.id = ++counter; + this.#setNameOrAddress(nameOrAddress); + + // $inspect("SMARTCONTRACT INSPECT", this.chainId, "|", this.nameOrAddress, this.id); + // $inspect("SMARTCONTRACT SEND ID ING", this.sendId, this.sending); + } +} + +export { SmartContract }; diff --git a/src/lib/wagmi/classes/Wagmi.svelte.ts b/src/lib/wagmi/classes/Wagmi.svelte.ts new file mode 100644 index 0000000..baa76c9 --- /dev/null +++ b/src/lib/wagmi/classes/Wagmi.svelte.ts @@ -0,0 +1,84 @@ +import { createClient } from "viem"; +import * as chains from "viem/chains"; +import { type Chain, mainnet } from "viem/chains"; +import { createConfig, getChainId, reconnect, watchChainId, type Config } from "@wagmi/core"; +import { coinbaseWallet, injected, metaMask, walletConnect } from "@wagmi/connectors"; +import { createBurnerConnector } from "$lib/wagmi/ts"; +import { Network } from "$lib/wagmi/classes"; +import { ALCHEMY_TRANSPORT, POLLING_INTERVAL, CHAINS, WALLET_CONNECT_PROJECT_ID } from "$lib/wagmi/config"; + + +class Wagmi { + #connectors = [ + injected(), + metaMask(), + walletConnect({ + projectId: WALLET_CONNECT_PROJECT_ID, + showQrModal: true + }), + coinbaseWallet({ + appName: "Wagmi-Svelte-5", + preference: "all" + }), + createBurnerConnector() + ]; + + #getChains = () => { + const selectedChains: Chain[] = []; + CHAINS.forEach(chainName => (chainName in chains) && selectedChains.push(chains[chainName as keyof typeof chains])); + selectedChains.push(mainnet); + return selectedChains; + } + + #chains = this.#getChains() as [Chain, ...Chain[]]; + + config = $state( + createConfig({ + chains: this.#chains, + connectors: this.#connectors, + syncConnectedChain: true, + client({ chain }) { + const client = createClient({ chain, transport: ALCHEMY_TRANSPORT(chain.id, "wss") }); + // console.log("WAGMI client created:", chain.id, client); + + if (chain.id === Network.chainIdLocal) client.pollingInterval = POLLING_INTERVAL; + return client; + } + }) + ); + + #chainId = $state(getChainId(this.config)); + get chainId() { + return this.#chainId; + } + watch = () => + watchChainId(this.config, { + onChange: (chainId: number) => { + console.log("watchChainId Change:", chainId); + this.#chainId = chainId; + } + }); + + recentConnectorId = $state(); + + reconnect = async () => { + this.recentConnectorId = await this.config.storage?.getItem("recentConnectorId"); + if (this.recentConnectorId) reconnect(this.config); + }; + + constructor() { + this.reconnect(); + this.watch(); + + $inspect("WAGMI", this.#chainId); + } +} + +let wagmi: Wagmi; +let wagmiConfig: Config; +const newWagmi = () => { + wagmi ||= new Wagmi(); + wagmiConfig = wagmi.config; +}; + +export { Wagmi, newWagmi, wagmi, wagmiConfig }; diff --git a/src/lib/wagmi/classes/Watcher.svelte.ts b/src/lib/wagmi/classes/Watcher.svelte.ts new file mode 100644 index 0000000..2558156 --- /dev/null +++ b/src/lib/wagmi/classes/Watcher.svelte.ts @@ -0,0 +1,34 @@ +import { POLLING_INTERVAL } from "$lib/wagmi/config"; + +class Watcher { + id = $state(0); + + start = (fn: () => unknown, onStart = false) => { + if (this.id) return; + + if (onStart) fn(); + + this.id = setInterval(fn, POLLING_INTERVAL) as unknown as number; + // console.info("WATCHER START", this.id); + }; + stop = () => { + if (!this.id) return; + + clearInterval(this.id); + // console.info("WATCHER STOP", this.id); + + this.id = 0; + }; + restart = (fn: () => unknown, onStart = false) => { + this.stop(); + this.start(fn, onStart); + }; + + constructor(fn?: () => unknown) { + if (fn) this.start(fn); + + // $inspect("WATCHER ", this.id); + } +} + +export { Watcher }; diff --git a/src/lib/wagmi/classes/index.ts b/src/lib/wagmi/classes/index.ts new file mode 100644 index 0000000..88cbda5 --- /dev/null +++ b/src/lib/wagmi/classes/index.ts @@ -0,0 +1,8 @@ +export * from "./SmartContract.svelte"; +export * from "./Address.svelte"; +export * from "./Account.svelte"; +export * from "./Network.svelte"; +export * from "./Wagmi.svelte"; +export * from "./Client.svelte"; +export * from "./Events.svelte"; +export * from "./Watcher.svelte"; diff --git a/src/lib/wagmi/components/BaseNotification.svelte b/src/lib/wagmi/components/BaseNotification.svelte new file mode 100644 index 0000000..6a11b87 --- /dev/null +++ b/src/lib/wagmi/components/BaseNotification.svelte @@ -0,0 +1,63 @@ + + +
toast_.dismiss(id)} + class="notification-{status} relative flex max-w-sm transform-gpu flex-row items-start justify-between space-x-2 rounded-xl bg-base-200 p-4 shadow-center shadow-accent transition-all duration-500 ease-in-out {position!.substring( + 0, + 3 + ) == 'top' + ? `hover:translate-y-1 ${visible ? 'top-0' : '-top-96'}` + : `hover:-translate-y-1 ${visible ? 'bottom-0' : '-bottom-96'}`}" +> +
+ {#if icon} + + {:else if status === "success"} + + {:else if status === "loading"} + + {:else if status === "error"} + + {:else if status === "info"} + + {:else if status === "warning"} + + {/if} +
+
+ {#if typeof Content === "string"} + {Content} + {:else} + {#key Content} + + {/key} + {/if} +
+ + +
diff --git a/src/lib/wagmi/components/Connect.svelte b/src/lib/wagmi/components/Connect.svelte new file mode 100644 index 0000000..9eedade --- /dev/null +++ b/src/lib/wagmi/components/Connect.svelte @@ -0,0 +1,124 @@ + + + + +{#if modalDisplay} +
+
+

Connect Wallet

+ +
    + {#if injected} + {@render connectSnippet("injected")} + {@render connectSnippet("metaMask")} + {/if} + {@render connectSnippet("coinbaseWallet")} + {@render connectSnippet("walletConnect")} + {#if !BURNER_WALLET_ONLY_LOCAL || network.chainId === Network.chainIdLocal} + {@render connectSnippet("burnerWallet")} + {/if} +
+
+
+{/if} + +{#snippet connectSnippet(type: string)} + {@const { connector, slug, name } = findConnector(type)} + {#if connector} +
  • + {name} + +
  • + {/if} +{/snippet} diff --git a/src/lib/wagmi/components/Events.svelte b/src/lib/wagmi/components/Events.svelte new file mode 100644 index 0000000..1585b19 --- /dev/null +++ b/src/lib/wagmi/components/Events.svelte @@ -0,0 +1,21 @@ + + +
    +
    +
    + {#each events.list as event, i (i)} +
    {JSON.stringify(event, replacer, 2)}
    + {:else} +

    No Events found on '{contractName}' !

    + {/each} +
    +
    +
    diff --git a/src/lib/wagmi/components/Link.svelte b/src/lib/wagmi/components/Link.svelte new file mode 100644 index 0000000..7cb5a74 --- /dev/null +++ b/src/lib/wagmi/components/Link.svelte @@ -0,0 +1,9 @@ + + +{#if href} + {description} +{:else} + {description} +{/if} diff --git a/src/lib/wagmi/components/LinkAddress.svelte b/src/lib/wagmi/components/LinkAddress.svelte new file mode 100644 index 0000000..77f5898 --- /dev/null +++ b/src/lib/wagmi/components/LinkAddress.svelte @@ -0,0 +1,12 @@ + + + diff --git a/src/lib/wagmi/components/LinkTx.svelte b/src/lib/wagmi/components/LinkTx.svelte new file mode 100644 index 0000000..6a5c22f --- /dev/null +++ b/src/lib/wagmi/components/LinkTx.svelte @@ -0,0 +1,25 @@ + + +{#if message} +
    +
    {message}
    +
    + +
    +
    +{:else} + +{/if} diff --git a/src/lib/wagmi/components/ViewEvents.svelte b/src/lib/wagmi/components/ViewEvents.svelte new file mode 100644 index 0000000..6fd2363 --- /dev/null +++ b/src/lib/wagmi/components/ViewEvents.svelte @@ -0,0 +1,43 @@ + + +
    +
    + {#each contractsName as contractName} + + {:else} +

    No contracts found!

    + {/each} +
    + {#if contractSelected} + + {/if} +
    diff --git a/src/lib/wagmi/components/index.ts b/src/lib/wagmi/components/index.ts new file mode 100644 index 0000000..027e9c1 --- /dev/null +++ b/src/lib/wagmi/components/index.ts @@ -0,0 +1,7 @@ +export { default as BaseNotification } from "./BaseNotification.svelte"; +export { default as Connect } from "./Connect.svelte"; +export { default as Events } from "./Events.svelte"; +export { default as Link } from "./Link.svelte"; +export { default as LinkAddress } from "./LinkAddress.svelte"; +export { default as LinkTx } from "./LinkTx.svelte"; +export { default as ViewEvents } from "./ViewEvents.svelte"; diff --git a/src/lib/wagmi/config.ts b/src/lib/wagmi/config.ts new file mode 100644 index 0000000..e9a72ca --- /dev/null +++ b/src/lib/wagmi/config.ts @@ -0,0 +1,49 @@ +import * as envir from '$env/static/public'; +import { http, webSocket } from 'viem'; + +const env = envir as Record; + +// redefine constants here or take them from environment +const CHAINS = (env.PUBLIC_CHAINS || 'anvil,baseSepolia').split(','); +const POLLING_INTERVAL = Number(env.PUBLIC_POLLING_INTERVAL || 5000); +const ALCHEMY_API_KEY = String(env.PUBLIC_ALCHEMY_API_KEY || ''); +const WALLET_CONNECT_PROJECT_ID = String(env.PUBLIC_WALLET_CONNECT_PROJECT_ID || ''); +const BURNER_WALLET_ONLY_LOCAL = String(env.PUBLIC_BURNER_WALLET_ONLY_LOCAL || ""); +const BURNER_WALLET_KEY = String(env.PUBLIC_BURNER_WALLET_KEY || ''); + + +const RPC_ALCHEMY_NAMES: Record = { + 1: 'eth-mainnet', + 11155111: 'eth-sepolia', + 17000: 'eth-holesky', + 10: 'opt-mainnet', + 11155420: 'opt-sepolia', + 42161: 'arb-mainnet', + 421614: 'arb-sepolia', + 8453: 'base-mainnet', + 84532: 'base-sepolia', + 137: 'polygon-mainnet', + 80002: 'polygon-amoy' +}; + +const ALCHEMY_URL = (chainId: number, protocol: 'https' | 'wss' = 'https') => { + return RPC_ALCHEMY_NAMES[chainId] + ? `${protocol}://${RPC_ALCHEMY_NAMES[chainId]}.g.alchemy.com/v2/${ALCHEMY_API_KEY}` + : undefined; +}; + +const ALCHEMY_TRANSPORT = (chainId: number, protocol: 'https' | 'wss' = 'https') => { + const fnProtocol = protocol === 'https' ? http : webSocket; + return fnProtocol(ALCHEMY_URL(chainId, protocol)); +}; + +export { + CHAINS, + POLLING_INTERVAL, + ALCHEMY_API_KEY, + WALLET_CONNECT_PROJECT_ID, + BURNER_WALLET_ONLY_LOCAL, + BURNER_WALLET_KEY, + ALCHEMY_URL, + ALCHEMY_TRANSPORT +}; diff --git a/src/lib/wagmi/ts/clickOutside.ts b/src/lib/wagmi/ts/clickOutside.ts new file mode 100644 index 0000000..879ebff --- /dev/null +++ b/src/lib/wagmi/ts/clickOutside.ts @@ -0,0 +1,16 @@ +// clickOutside.ts +export function clickOutside(node: HTMLElement, handler: () => void): { destroy: () => void } { + const handleClick = (event: MouseEvent) => { + if (node && !node.contains(event.target as Node)) { + handler(); + } + }; + + document.addEventListener("mousedown", handleClick, true); + + return { + destroy() { + document.removeEventListener("mousedown", handleClick, true); + } + }; +} diff --git a/src/lib/wagmi/ts/createBurnerConnector.ts b/src/lib/wagmi/ts/createBurnerConnector.ts new file mode 100644 index 0000000..88d359c --- /dev/null +++ b/src/lib/wagmi/ts/createBurnerConnector.ts @@ -0,0 +1,178 @@ +import { loadBurnerSK } from "./utils2"; +import { BaseError, createConnector as createWagmiConnector } from "@wagmi/core"; +import { + type EIP1193RequestFn, + type Hex, + RpcRequestError, + SwitchChainError, + type Transport, + type WalletRpcSchema, + createWalletClient, + custom, + fromHex, + getAddress, + http +} from "viem"; +import { privateKeyToAccount } from "viem/accounts"; +import { anvil } from "viem/chains"; +import { getHttpRpcClient, hexToBigInt, numberToHex } from "viem/utils"; +import type { SendTransactionParameters } from "viem/zksync"; +import { BURNER_WALLET_ONLY_LOCAL } from "$lib/wagmi/config"; + +export class ConnectorNotConnectedError extends BaseError { + override name = "ConnectorNotConnectedError"; + constructor() { + super("Connector not connected."); + } +} + +export class ChainNotConfiguredError extends BaseError { + override name = "ChainNotConfiguredError"; + constructor() { + super("Chain not configured."); + } +} + +const localStoreSetChainId = (chainId: number) => { + window?.localStorage?.setItem("wagmiSvelte5.burnerWallet.chainId", String(chainId)); +}; +const localStoreGetChainId = (): number => { + return Number(window?.localStorage?.getItem("wagmiSvelte5.burnerWallet.chainId")); +}; + +type Provider = ReturnType, EIP1193RequestFn>>; + +export const createBurnerConnector = () => { + let connected = true; + let connectedChainId: number; + + return createWagmiConnector((config) => ({ + id: "burnerWallet", + type: "burnerWallet", + name: "Burner Wallet", + + async connect({ chainId } = {}) { + const provider = await this.getProvider({ chainId }); + const accounts = await provider.request({ + method: "eth_accounts" + }); + let currentChainId = await this.getChainId(); + if (chainId && currentChainId !== chainId && this.switchChain) { + const chain = await this.switchChain({ chainId }); + currentChainId = chain.id; + } + connected = true; + localStoreSetChainId(currentChainId); + + return { accounts, chainId: currentChainId }; + }, + + async getProvider({ chainId } = {}) { + const chainDefault = config.chains[0]; + const chainIdLocal = anvil.id; + const chainIdLocalStorage = localStoreGetChainId(); + + chainId = BURNER_WALLET_ONLY_LOCAL ? chainIdLocal : chainIdLocalStorage || chainDefault.id; + + const chain = config.chains.find((ch) => ch.id === chainId) ?? chainDefault; + + const url = chain.rpcUrls.default.http[0]; + const burnerAccount = privateKeyToAccount(loadBurnerSK()); + const client = createWalletClient({ + chain: chain, + account: burnerAccount, + transport: http() + }); + + const request: EIP1193RequestFn = async ({ method, params }) => { + if (method === "eth_sendTransaction") { + const actualParams = (params as SendTransactionParameters[])[0]; + const value = actualParams.value ? hexToBigInt(actualParams.value as unknown as Hex) : undefined; + const hash = await client.sendTransaction({ + ...(params as SendTransactionParameters[])[0], + value + }); + return hash; + } + + if (method === "eth_accounts") { + return [burnerAccount.address]; + } + + if (method === "wallet_switchEthereumChain") { + type Params = [{ chainId: Hex }]; + connectedChainId = fromHex((params as Params)[0].chainId, "number"); + this.onChainChanged(connectedChainId.toString()); + return; + } + + const body = { method, params }; + const httpClient = getHttpRpcClient(url); + const { error, result } = await httpClient.request({ body }); + if (error) throw new RpcRequestError({ body, error, url }); + + return result; + }; + + return custom({ request })({ retryCount: 0 }); + }, + + onChainChanged(chain) { + const chainId = Number(chain); + config.emitter.emit("change", { chainId }); + }, + + async getAccounts() { + if (!connected) throw new ConnectorNotConnectedError(); + const provider = await this.getProvider(); + const accounts = await provider.request({ method: "eth_accounts" }); + return [accounts.map((x) => getAddress(x))[0]]; + }, + + async onDisconnect() { + config.emitter.emit("disconnect"); + connected = false; + }, + + async getChainId() { + const provider = await this.getProvider(); + const hexChainId = await provider.request({ method: "eth_chainId" }); + const chainId = fromHex(hexChainId, "number"); + return chainId; + }, + + async isAuthorized() { + if (!connected) return false; + const accounts = await this.getAccounts(); + return !!accounts.length; + }, + + onAccountsChanged(accounts) { + if (accounts.length === 0) this.onDisconnect(); + else + config.emitter.emit("change", { + accounts: accounts.map((x) => getAddress(x)) + }); + }, + + async switchChain({ chainId }) { + console.log("createBurnerConnector switchChain", chainId); + const provider = await this.getProvider(); + const chain = config.chains.find((x) => x.id === chainId); + if (!chain) throw new SwitchChainError(new ChainNotConfiguredError()); + + await provider.request({ + method: "wallet_switchEthereumChain", + params: [{ chainId: numberToHex(chainId) }] + }); + + localStoreSetChainId(chainId); + return chain; + }, + + disconnect() { + connected = false; + return Promise.resolve(); + } + })); +}; diff --git a/src/lib/wagmi/ts/getContractEvents.ts b/src/lib/wagmi/ts/getContractEvents.ts new file mode 100644 index 0000000..5d6a3d3 --- /dev/null +++ b/src/lib/wagmi/ts/getContractEvents.ts @@ -0,0 +1,31 @@ +import type { + Abi, + Address, + BlockNumber, + BlockTag, + ContractEventName, + GetContractEventsReturnType, + GetContractEventsParameters as GetContractEventsParametersViem, + ContractEventArgs +} from "viem"; +import { getContractEvents as getContractEventsViem } from "viem/actions"; + +import type { Config } from "@wagmi/core"; + +type GetContractEventsParameters = { + abi: Abi; + address?: Address | Address[]; + eventName?: ContractEventName; + args?: ContractEventArgs; + fromBlock?: BlockNumber | BlockTag; + toBlock?: BlockNumber | BlockTag; +}; + +// missing function in Wagmi ?! +const getContractEvents = async ( + config: Config, + parameters: GetContractEventsParameters +): Promise => + getContractEventsViem(config.getClient(), parameters as GetContractEventsParametersViem); + +export { getContractEvents }; diff --git a/src/lib/wagmi/ts/index.ts b/src/lib/wagmi/ts/index.ts new file mode 100644 index 0000000..50919a1 --- /dev/null +++ b/src/lib/wagmi/ts/index.ts @@ -0,0 +1,8 @@ +export * from "./createBurnerConnector"; +export * from "./clickOutside"; +export * from "./types"; +export * from "./getContractEvents"; +export * from "./notification"; +export * from "./readDeployments"; +export * from "./utils"; +export * from "./utils2"; diff --git a/src/lib/wagmi/ts/notification.ts b/src/lib/wagmi/ts/notification.ts new file mode 100644 index 0000000..7d81234 --- /dev/null +++ b/src/lib/wagmi/ts/notification.ts @@ -0,0 +1,58 @@ +import { BaseNotification } from "$lib/wagmi/components"; +import toast, { type Renderable, type ToastPosition } from "svelte-hot-french-toast"; + +type NotificationProps = { + Content: Renderable; + status: "success" | "info" | "loading" | "error" | "warning"; + duration?: number; + icon?: string; + position?: ToastPosition; + props?: Record; +}; + +type NotificationOptions = { + duration?: number; + icon?: string; + position?: ToastPosition; + props?: Record; +}; + +const DEFAULT_DURATION = 3000; +const DEFAULT_POSITION: ToastPosition = "top-center"; + +const Notification = ({ + Content, + status, + duration = DEFAULT_DURATION, + icon, + position = DEFAULT_POSITION, + props +}: NotificationProps) => { + return toast.custom(BaseNotification as any, { + duration: status === "loading" ? Infinity : duration, + position, + props: { ...props, Content, status }, + icon + }); +}; + +export const notification = { + success: (Content: Renderable, options?: NotificationOptions) => { + return Notification({ Content, status: "success", ...options }); + }, + info: (Content: Renderable, options?: NotificationOptions) => { + return Notification({ Content, status: "info", ...options }); + }, + warning: (Content: Renderable, options?: NotificationOptions) => { + return Notification({ Content, status: "warning", ...options }); + }, + error: (Content: Renderable, options?: NotificationOptions) => { + return Notification({ Content, status: "error", ...options }); + }, + loading: (Content: Renderable, options?: NotificationOptions) => { + return Notification({ Content, status: "loading", ...options }); + }, + remove: (toastId: string) => { + toast.remove(toastId); + } +}; diff --git a/src/lib/wagmi/ts/readDeployments.ts b/src/lib/wagmi/ts/readDeployments.ts new file mode 100644 index 0000000..cb350e2 --- /dev/null +++ b/src/lib/wagmi/ts/readDeployments.ts @@ -0,0 +1,85 @@ +import jsonDeployments from "$lib/deployments.json"; +import { type Abi, type Address } from "viem"; +import { isAddress } from "$lib/wagmi/ts"; + +type KeysOfUnion = ObjectType extends unknown ? keyof ObjectType : never; + +type DeploymentsChains = typeof jsonDeployments; +type DeploymentsChainIdString = keyof DeploymentsChains; +type DeploymentsChainIdStrict = DeploymentsChainIdString extends `${infer N extends number}` ? N : never; +type DeploymentsChainId = DeploymentsChainIdStrict | 1; +type DeploymentsChain = DeploymentsChains[DeploymentsChainIdStrict]; +type DeploymentContractName = KeysOfUnion; +type DeploymentContractKey = keyof DeploymentsChain; + +const isDeploymentsChainId = (chainId: string | number): boolean => String(chainId) in jsonDeployments; + +const isDeploymentChainId = (chainId: DeploymentsChainId, contractName: DeploymentContractName): boolean => + isDeploymentsChainId(chainId) && contractName in readDeploymentsChain(chainId); + +const readDeploymentsChain = (chainId: DeploymentsChainId): DeploymentsChain => { + if (!isDeploymentsChainId(chainId)) throw new Error(`No Deployments for chainId ${chainId}!`); + + return jsonDeployments[String(chainId) as DeploymentsChainIdString]; +}; + +type DeploymentType = { address: Address; abi: Abi; name?: string }; + +const readDeploymentContractsName = (chainId: DeploymentsChainId): DeploymentContractName[] => { + const chainDeployment = readDeploymentsChain(chainId); + + return Object.keys(chainDeployment) as DeploymentContractName[]; +}; + +const readDeploymentByAddress = (chainId: DeploymentsChainId, address: string): DeploymentType | undefined => { + const deployments = readDeploymentsChain(chainId); + + const [name, dep] = Object.entries(deployments).find(([, dep]) => (dep as DeploymentType).address === address) || []; + if (!(name && dep)) return; + + const deployment = dep as DeploymentType; + deployment.name = name; + return deployment; +}; + +const readDeploymentByName = ( + chainId: DeploymentsChainId, + contractName: DeploymentContractName +): DeploymentType | undefined => { + const chainDeployment = readDeploymentsChain(chainId); + + if (!(contractName in chainDeployment)) return; + + const deployment = chainDeployment[contractName as DeploymentContractKey] as DeploymentType; + deployment.name = contractName; + return deployment; +}; + +const readDeployment = ( + chainId: DeploymentsChainId, + param: DeploymentContractName | Address +): DeploymentType | undefined => { + if (!(chainId && param)) return; + + return isAddress(param) + ? readDeploymentByAddress(chainId, param as Address) + : readDeploymentByName(chainId, param as DeploymentContractName); +}; + +export { + isDeploymentChainId, + isDeploymentsChainId, + readDeploymentContractsName, + readDeploymentsChain, + readDeploymentByAddress, + readDeploymentByName, + readDeployment +}; +export type { + DeploymentsChains, + DeploymentsChainId, + DeploymentsChain, + DeploymentType, + DeploymentContractName, + DeploymentContractKey +}; diff --git a/src/lib/wagmi/ts/types.ts b/src/lib/wagmi/ts/types.ts new file mode 100644 index 0000000..dd2256b --- /dev/null +++ b/src/lib/wagmi/ts/types.ts @@ -0,0 +1,12 @@ +import type { Address, Log } from "viem"; + +export type Nullable = T | null | undefined; + +export type LogWithArgs = Log & { args: []; index: number }; + +export type LogsParamsType = { + address: Address; + abi: any; + eventName?: string; + args?: unknown[]; +}; diff --git a/src/lib/wagmi/ts/utils.ts b/src/lib/wagmi/ts/utils.ts new file mode 100644 index 0000000..8c37230 --- /dev/null +++ b/src/lib/wagmi/ts/utils.ts @@ -0,0 +1,22 @@ +import { type Address, isAddress as isAddressViem } from "viem"; + +const isEns = (ensName: string | null | undefined) => { + if (!ensName) return false; + + // Treat .eth string as potential ENS name + return /.+\.eth/.test(ensName); +}; + +const isAddress = (address: Address | string | null | undefined): address is Address => { + if (!address) return false; + + return isAddressViem(address as string); +}; + +const shorten0xString = (addr: `0x${string}`) => addr?.slice(0, 8) + "..." + addr?.slice(-6); + +// To be used in JSON.stringify when a field might be bigint +// https://wagmi.sh/react/faq#bigint-serialization +const replacer = (_key: string, value: unknown) => (typeof value === "bigint" ? value.toString() : value); + +export { isEns, isAddress, shorten0xString, replacer }; diff --git a/src/lib/wagmi/ts/utils2.ts b/src/lib/wagmi/ts/utils2.ts new file mode 100644 index 0000000..73f1639 --- /dev/null +++ b/src/lib/wagmi/ts/utils2.ts @@ -0,0 +1,52 @@ +import { dev } from "$app/environment"; +import type { Hex } from "viem"; +import { generatePrivateKey } from "viem/accounts"; +import { BURNER_WALLET_KEY } from "$lib/wagmi/config"; + +const burnerLocalStorageKey = "wagmiSvelte5.burnerWallet.sk"; +let currentSk: Hex = "0x"; + +/** + * Checks if the private key is valid + */ +const isValidSk = (pk: Hex | string | undefined | null): boolean => { + return pk?.length === 64 || pk?.length === 66; +}; + +/** + * If no burner is found in localstorage or environment, generate a random private key + */ +const generatedPrivateKey = generatePrivateKey(); + +/** + * Save the current burner private key to local storage + */ +export const saveBurnerSK = (privateKey: Hex): void => { + if (typeof window != "undefined" && window != null) { + window?.localStorage?.setItem(burnerLocalStorageKey, privateKey); + } +}; + +/** + * Gets the current burner private key from local storage + */ +export const loadBurnerSK = (): Hex => { + if (isValidSk(currentSk)) return currentSk; + + // search for Key in local storage + const localStorageKey = (window?.localStorage?.getItem?.(burnerLocalStorageKey)?.replaceAll('"', "") ?? "0x") as Hex; + + // search for Key in environnement (dev mode only) + const envStorageKey = ((dev && BURNER_WALLET_KEY) || "0x") as Hex; + + // set the current key to the first valid key found + currentSk = isValidSk(localStorageKey) + ? localStorageKey + : isValidSk(envStorageKey) + ? envStorageKey + : generatedPrivateKey; + + // save the current key to local storage and return it + if (dev) saveBurnerSK(currentSk); + return currentSk; +}; diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte index 9b776b7..5ba4b66 100644 --- a/src/routes/+layout.svelte +++ b/src/routes/+layout.svelte @@ -1,6 +1,51 @@ -{@render children()} +
    +
    +

    + Tests +

    + +
    + {#if account.address} + {account.address} ({account.chainId}) + + + + {#each chains as chain (chain.id)} + + + + {/each} +
    + {:else} + + {/if} +
    + +
    {@render children()}
    +
    +
    diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte index cc88df0..c44f22f 100644 --- a/src/routes/+page.svelte +++ b/src/routes/+page.svelte @@ -1,2 +1,9 @@ -

    Welcome to SvelteKit

    -

    Visit svelte.dev/docs/kit to read the documentation

    + + +{#snippet pageTest(pageName: string)} +
  • {pageName}
  • +{/snippet} + +
      + {@render pageTest("counter")} +
    diff --git a/src/routes/counter/+page.svelte b/src/routes/counter/+page.svelte new file mode 100644 index 0000000..d21b24c --- /dev/null +++ b/src/routes/counter/+page.svelte @@ -0,0 +1,18 @@ + + +
    + + +
    + +
    + +
    diff --git a/static/_redirects b/static/_redirects new file mode 100644 index 0000000..84c7f6d --- /dev/null +++ b/static/_redirects @@ -0,0 +1 @@ +/debug /index.html 200 diff --git a/static/apple-touch-icon-precomposed.png b/static/apple-touch-icon-precomposed.png new file mode 120000 index 0000000..00ac143 --- /dev/null +++ b/static/apple-touch-icon-precomposed.png @@ -0,0 +1 @@ +favicon.png \ No newline at end of file diff --git a/static/apple-touch-icon.png b/static/apple-touch-icon.png new file mode 120000 index 0000000..00ac143 --- /dev/null +++ b/static/apple-touch-icon.png @@ -0,0 +1 @@ +favicon.png \ No newline at end of file diff --git a/static/burnerWallet.svg b/static/burnerWallet.svg new file mode 100644 index 0000000..4f20756 --- /dev/null +++ b/static/burnerWallet.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/coinbaseWallet.svg b/static/coinbaseWallet.svg new file mode 100644 index 0000000..c47fdf9 --- /dev/null +++ b/static/coinbaseWallet.svg @@ -0,0 +1,4 @@ + + + + diff --git a/static/favicon.ico b/static/favicon.ico new file mode 120000 index 0000000..00ac143 --- /dev/null +++ b/static/favicon.ico @@ -0,0 +1 @@ +favicon.png \ No newline at end of file diff --git a/static/favicon.png b/static/favicon.png index 825b9e65af7c104cfb07089bb28659393b4f2097..4bef7f2fc1276ceebd1f5ebccd4c300956bd0acc 100644 GIT binary patch literal 5745 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 V{iMsSpyn`8Q+}XSbkFji{{X0;k0Jm7 literal 1571 zcmV+;2Hg3HP)Px)-AP12RCwC$UE6KzI1p6{F2N z1VK2vi|pOpn{~#djwYcWXTI_im_u^TJgMZ4JMOsSj!0ma>B?-(Hr@X&W@|R-$}W@Z zgj#$x=!~7LGqHW?IO8+*oE1MyDp!G=L0#^lUx?;!fXv@l^6SvTnf^ac{5OurzC#ZMYc20lI%HhX816AYVs1T3heS1*WaWH z%;x>)-J}YB5#CLzU@GBR6sXYrD>Vw(Fmt#|JP;+}<#6b63Ike{Fuo!?M{yEffez;| zp!PfsuaC)>h>-AdbnwN13g*1LowNjT5?+lFVd#9$!8Z9HA|$*6dQ8EHLu}U|obW6f z2%uGv?vr=KNq7YYa2Roj;|zooo<)lf=&2yxM@e`kM$CmCR#x>gI>I|*Ubr({5Y^rb zghxQU22N}F51}^yfDSt786oMTc!W&V;d?76)9KXX1 z+6Okem(d}YXmmOiZq$!IPk5t8nnS{%?+vDFz3BevmFNgpIod~R{>@#@5x9zJKEHLHv!gHeK~n)Ld!M8DB|Kfe%~123&Hz1Z(86nU7*G5chmyDe ziV7$pB7pJ=96hpxHv9rCR29%bLOXlKU<_13_M8x)6;P8E1Kz6G<&P?$P^%c!M5`2` zfY2zg;VK5~^>TJGQzc+33-n~gKt{{of8GzUkWmU110IgI0DLxRIM>0US|TsM=L|@F z0Bun8U!cRB7-2apz=y-7*UxOxz@Z0)@QM)9wSGki1AZ38ceG7Q72z5`i;i=J`ILzL z@iUO?SBBG-0cQuo+an4TsLy-g-x;8P4UVwk|D8{W@U1Zi z!M)+jqy@nQ$p?5tsHp-6J304Q={v-B>66$P0IDx&YT(`IcZ~bZfmn11#rXd7<5s}y zBi9eim&zQc0Dk|2>$bs0PnLmDfMP5lcXRY&cvJ=zKxI^f0%-d$tD!`LBf9^jMSYUA zI8U?CWdY@}cRq6{5~y+)#h1!*-HcGW@+gZ4B};0OnC~`xQOyH19z*TA!!BJ%9s0V3F?CAJ{hTd#*tf+ur-W9MOURF-@B77_-OshsY}6 zOXRY=5%C^*26z?l)1=$bz30!so5tfABdSYzO+H=CpV~aaUefmjvfZ3Ttu9W&W3Iu6 zROlh0MFA5h;my}8lB0tAV-Rvc2Zs_CCSJnx@d`**$idgy-iMob4dJWWw|21b4NB=LfsYp0Aeh{Ov)yztQi;eL4y5 zMi>8^SzKqk8~k?UiQK^^-5d8c%bV?$F8%X~czyiaKCI2=UH + + + + + \ No newline at end of file diff --git a/static/metaMask.svg b/static/metaMask.svg new file mode 100644 index 0000000..a6cffef --- /dev/null +++ b/static/metaMask.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/rabby.svg b/static/rabby.svg new file mode 100644 index 0000000..cb58606 --- /dev/null +++ b/static/rabby.svg @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/safe.svg b/static/safe.svg new file mode 100644 index 0000000..1ad019b --- /dev/null +++ b/static/safe.svg @@ -0,0 +1,13 @@ + + + + + + + diff --git a/static/thumbnail.jpg b/static/thumbnail.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a3bf231f3c81004c80066e17242637f0c2d019b0 GIT binary patch literal 19855 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 \ No newline at end of file diff --git a/tailwind.config.cjs b/tailwind.config.cjs new file mode 100644 index 0000000..b7273c9 --- /dev/null +++ b/tailwind.config.cjs @@ -0,0 +1,96 @@ +import daisyui from "daisyui"; + +/** @type {import('tailwindcss').Config}*/ +const config = { + content: ["./src/**/*.{html,js,svelte,ts}"], + + theme: { + extend: { + boxShadow: { + center: "0 0 12px -2px rgb(0 0 0 / 0.05)" + } + } + }, + + daisyui: { + themes: [ + { + light: { + primary: "#93BBFB", + "primary-content": "#212638", + secondary: "#DAE8FF", + "secondary-content": "#212638", + accent: "#93BBFB", + "accent-content": "#212638", + neutral: "#212638", + "neutral-content": "#ffffff", + "base-100": "#ffffff", + "base-200": "#f4f8ff", + "base-300": "#DAE8FF", + "base-content": "#212638", + info: "#93BBFB", + success: "#34EEB6", + warning: "#FFCF72", + error: "#FF8863", + + "--rounded-btn": "9999rem", + + ".tooltip": { + "--tooltip-tail": "6px" + }, + ".link": { + textUnderlineOffset: "2px" + }, + ".link:hover": { + opacity: "80%" + }, + + ".bg-green-ai": { + "background-color": "#DDFAE4" + } + } + }, + { + dark: { + primary: "#212638", + "primary-content": "#F9FBFF", + secondary: "#323f61", + "secondary-content": "#F9FBFF", + accent: "#4969A6", + "accent-content": "#F9FBFF", + neutral: "#F9FBFF", + "neutral-content": "#385183", + "base-100": "#385183", + "base-200": "#2A3655", + "base-300": "#212638", + "base-content": "#F9FBFF", + info: "#385183", + success: "#34EEB6", + warning: "#FFCF72", + error: "#FF8863", + + "--rounded-btn": "9999rem", + + ".tooltip": { + "--tooltip-tail": "6px", + "--tooltip-color": "oklch(var(--p))" + }, + ".link": { + textUnderlineOffset: "2px" + }, + ".link:hover": { + opacity: "80%" + }, + + ".bg-green-ai": { + "background-color": "#7ACA7A" + } + } + } + ] + }, + + plugins: [daisyui] +}; + +export default config; diff --git a/tailwind.config.ts b/tailwind.config.ts deleted file mode 100644 index aa4bc77..0000000 --- a/tailwind.config.ts +++ /dev/null @@ -1,11 +0,0 @@ -import type { Config } from 'tailwindcss'; - -export default { - content: ['./src/**/*.{html,js,svelte,ts}'], - - theme: { - extend: {} - }, - - plugins: [] -} satisfies Config;