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 825b9e6..4bef7f2 100644 Binary files a/static/favicon.png and b/static/favicon.png differ diff --git a/static/injected.svg b/static/injected.svg new file mode 100644 index 0000000..a15fc46 --- /dev/null +++ b/static/injected.svg @@ -0,0 +1,6 @@ + + + + + + \ 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 0000000..a3bf231 Binary files /dev/null and b/static/thumbnail.jpg differ diff --git a/static/walletConnect.svg b/static/walletConnect.svg new file mode 100644 index 0000000..d90457a --- /dev/null +++ b/static/walletConnect.svg @@ -0,0 +1 @@ + \ 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;