diff --git a/SECURITY_VULNERABILITIES_ANALYSIS.md b/SECURITY_VULNERABILITIES_ANALYSIS.md deleted file mode 100644 index 50e8546f..00000000 --- a/SECURITY_VULNERABILITIES_ANALYSIS.md +++ /dev/null @@ -1,205 +0,0 @@ -# Security Vulnerabilities Analysis - -## Overview -This document traces the origin of all security vulnerabilities identified in the project's dependency tree. - -## Vulnerability Summary -- **Total Vulnerabilities**: 14 (1 low, 13 high) -- **Fixed**: 9 vulnerabilities (reduced from 23) -- **Remaining**: 14 vulnerabilities - ---- - -## 1. `ip` Package Vulnerability (High Severity) - -### Vulnerability Details -- **CVE**: SSRF improper categorization in `isPublic` function -- **Affected Version**: `ip@2.0.1` -- **Risk**: Server-Side Request Forgery (SSRF) attacks possible - -### Dependency Chain -``` -Root Project -└── @meshsdk/react@1.9.0-beta.87 - └── @fabianbormann/cardano-peer-connect@1.2.18 - └── @fabianbormann/meerkat@1.0.18 - └── webtorrent@2.8.5 - ├── bittorrent-tracker@11.2.2 - │ └── ip@2.0.1 ⚠️ VULNERABLE - └── load-ip-set@3.0.1 - └── ip-set@2.2.0 - └── ip@2.0.1 ⚠️ VULNERABLE -``` - -### Root Cause -The `ip` package is pulled in by **WebTorrent**, which is used for peer-to-peer (P2P) connectivity in Cardano wallet connections. This is a transitive dependency from: -- `@fabianbormann/cardano-peer-connect` → Used by MeshSDK for P2P wallet connections -- `webtorrent` → BitTorrent protocol implementation for P2P networking -- `bittorrent-tracker` → Tracker client that uses `ip` for IP address validation - -### Impact Assessment -- **Usage**: Only used when P2P wallet connection features are active -- **Risk Level**: Medium-Low (only affects P2P connectivity features) -- **Attack Vector**: Requires attacker to control IP addresses in P2P network context - -### Mitigation Options -1. **Wait for upstream fix**: Monitor `@fabianbormann/cardano-peer-connect` for updates -2. **Use npm overrides**: Force a patched version of `ip` (risky, may break functionality) -3. **Disable P2P features**: If not needed, consider removing MeshSDK P2P functionality -4. **Contact maintainers**: Report to MeshSDK team about dependency updates - ---- - -## 2. `brace-expansion` Vulnerability (ReDoS) - -### Vulnerability Details -- **CVE**: Regular Expression Denial of Service (ReDoS) -- **Affected Versions**: `1.0.0 - 1.1.11 || 2.0.0 - 2.0.1` -- **Risk**: CPU exhaustion through malicious regex patterns - -### Dependency Chain -``` -Root Project -└── @meshsdk/core-cst@1.9.0-beta.87 - └── @cardano-sdk/crypto@0.2.3 - └── npm@9.9.4 ⚠️ BUNDLED DEPENDENCY - ├── minimatch@9.0.3 - │ └── brace-expansion@2.0.1 ⚠️ VULNERABLE - └── node-gyp@9.4.1 - ├── glob@7.2.3 - │ └── minimatch@3.1.2 - │ └── brace-expansion@1.1.11 ⚠️ VULNERABLE - └── cacache@16.1.3 - └── glob@8.1.0 - └── minimatch@5.1.6 - └── brace-expansion@2.0.1 ⚠️ VULNERABLE -``` - -### Root Cause -**Critical Finding**: `@cardano-sdk/crypto@0.2.3` includes `npm@^9.3.0` as a **production dependency**. This is highly unusual and problematic because: - -1. **npm should not be a dependency**: npm is a package manager, not a library -2. **Bundled vulnerabilities**: npm@9.9.4 bundles vulnerable versions of `brace-expansion` and `glob` -3. **Cannot be fixed via project dependencies**: These are bundled inside npm itself - -### Why npm is a dependency -The `@cardano-sdk/crypto` package likely uses npm for: -- Build tooling or scripts -- Package management utilities -- Development tooling (incorrectly marked as production dependency) - -**This is a bug/misconfiguration in the Cardano SDK package.** - -### Impact Assessment -- **Usage**: Likely only used during build/development, not runtime -- **Risk Level**: Low-Medium (ReDoS requires specific attack patterns) -- **Attack Vector**: Requires attacker to provide malicious input to brace expansion functions - -### Mitigation Options -1. **Update npm globally**: `npm install -g npm@latest` (fixes bundled dependencies) -2. **Report to Cardano SDK**: This is a packaging issue that should be fixed upstream -3. **Use npm overrides**: Force newer versions (may break npm functionality) -4. **Consider alternative**: Evaluate if `@cardano-sdk/crypto` is necessary or if there's an alternative - ---- - -## 3. `glob` Vulnerability (High Severity) - -### Vulnerability Details -- **CVE**: Command injection via `-c/--cmd` executes matches with `shell:true` -- **Affected Versions**: `glob@10.2.0 - 10.4.5` -- **Risk**: Command injection attacks - -### Dependency Chain -``` -Root Project -└── @meshsdk/core-cst@1.9.0-beta.87 - └── @cardano-sdk/crypto@0.2.3 - └── npm@9.9.4 ⚠️ BUNDLED DEPENDENCY - ├── glob@10.3.10 ⚠️ VULNERABLE - └── node-gyp@9.4.1 - └── (uses older glob versions) -``` - -### Root Cause -Same as `brace-expansion` - bundled in npm@9.9.4 which is incorrectly included as a dependency of `@cardano-sdk/crypto`. - -### Impact Assessment -- **Usage**: Only if npm CLI features are used at runtime (unlikely) -- **Risk Level**: Low (requires CLI usage with malicious input) -- **Attack Vector**: Command injection through glob CLI usage - -### Mitigation Options -Same as `brace-expansion` - update npm globally or report to Cardano SDK maintainers. - ---- - -## 4. Previously Fixed Vulnerabilities - -### ✅ `axios` (Fixed) -- **Was**: Vulnerable versions in `@cardano-sdk/util-dev` -- **Fixed**: Updated MeshSDK packages to `1.9.0-beta.87` -- **Status**: Resolved - -### ✅ `tar-fs` (Fixed) -- **Was**: Vulnerable versions in `dockerode` -- **Fixed**: Updated MeshSDK packages -- **Status**: Resolved - ---- - -## Recommendations - -### Immediate Actions -1. ✅ **Update MeshSDK packages** - Already completed (all at `1.9.0-beta.87`) -2. ⚠️ **Update npm globally**: `npm install -g npm@latest` -3. 📝 **Report to Cardano SDK**: File issue about npm being a production dependency - -### Long-term Actions -1. **Monitor dependencies**: Set up automated dependency scanning -2. **Evaluate alternatives**: Consider if Cardano SDK crypto package is necessary -3. **Review P2P features**: Assess if `cardano-peer-connect` is required for your use case -4. **Use npm overrides**: If needed, add overrides for critical vulnerabilities (with caution) - -### npm Overrides Example (Use with Caution) -```json -{ - "overrides": { - "ip": "^2.0.2", - "brace-expansion": "^2.0.2", - "glob": "^10.4.6" - } -} -``` - ---- - -## Dependency Tree Visualization - -### Critical Paths -``` -Root → @meshsdk/react → @fabianbormann/cardano-peer-connect → webtorrent → ip ⚠️ -Root → @meshsdk/core-cst → @cardano-sdk/crypto → npm → brace-expansion/glob ⚠️ -``` - -### Key Packages -- **@meshsdk/react**: Main MeshSDK React integration -- **@fabianbormann/cardano-peer-connect**: P2P wallet connectivity -- **@cardano-sdk/crypto**: Cryptographic utilities (incorrectly includes npm) -- **webtorrent**: BitTorrent protocol for P2P -- **npm**: Package manager (should not be a dependency!) - ---- - -## Conclusion - -The security vulnerabilities stem from: -1. **Transitive dependencies** in MeshSDK's P2P connectivity features (`ip` vulnerability) -2. **Packaging error** in Cardano SDK (`npm` as production dependency causing `brace-expansion`/`glob` issues) - -Most vulnerabilities are low-risk for production use, but should be addressed through: -- Updating npm globally -- Reporting issues to upstream maintainers -- Monitoring for package updates - - diff --git a/next.config.js b/next.config.js index fb1ecbde..9cf2d1d5 100644 --- a/next.config.js +++ b/next.config.js @@ -19,7 +19,7 @@ const config = { locales: ["en"], defaultLocale: "en", }, - transpilePackages: ["geist"], + transpilePackages: ["geist", "@meshsdk/react"], typescript: { // Warning: This allows production builds to successfully complete even if // your project has type errors. @@ -44,6 +44,8 @@ const config = { hostname: "gateway.pinata.cloud", }, ], + // Allow unoptimized images for local proxy API routes + unoptimized: false, }, // Turbopack configuration (Next.js 16+) // Empty config silences the warning about webpack/turbopack conflict @@ -56,8 +58,35 @@ const config = { asyncWebAssembly: true, layers: true, }; + + // Optimize tree-shaking by ensuring proper module resolution + config.optimization = { + ...config.optimization, + usedExports: true, + sideEffects: false, + }; + + // Handle CommonJS modules that don't support named exports + config.resolve = { + ...config.resolve, + extensionAlias: { + ".js": [".js", ".ts", ".tsx"], + }, + }; + return config; }, + + // External packages for server components to avoid bundling issues + serverExternalPackages: ["@fabianbormann/cardano-peer-connect"], }; -export default config; +// Bundle analyzer - only enable when ANALYZE env var is set +/** @type {(config: import("next").NextConfig) => import("next").NextConfig} */ +const withBundleAnalyzer = process.env.ANALYZE === 'true' + ? require('@next/bundle-analyzer')({ + enabled: true, + }) + : (config) => config; + +export default withBundleAnalyzer(config); diff --git a/package-lock.json b/package-lock.json index 8032921e..5e789569 100644 --- a/package-lock.json +++ b/package-lock.json @@ -54,7 +54,7 @@ "jsonld": "^8.3.3", "jsonwebtoken": "^9.0.2", "lucide-react": "^0.439.0", - "next": "^16.0.8", + "next": "^16.0.7", "next-auth": "^4.24.7", "papaparse": "^5.5.3", "react": "^18.3.1", @@ -79,6 +79,9 @@ "@eslint/compat": "^2.0.0", "@eslint/eslintrc": "^3.3.3", "@jest/globals": "^30.1.2", + "@next/bundle-analyzer": "^16.0.10", + "@react-three/drei": "^9.122.0", + "@react-three/fiber": "^8.17.7", "@types/busboy": "^1.5.4", "@types/cors": "^2.8.18", "@types/eslint": "^8.56.10", @@ -88,14 +91,14 @@ "@types/jsonwebtoken": "^9.0.9", "@types/node": "^20.14.10", "@types/papaparse": "^5.3.16", - "@types/react": "^18.3.3", - "@types/react-dom": "^18.3.0", + "@types/react": "^19.2.1", + "@types/react-dom": "^19.2.1", "@types/swagger-jsdoc": "^6.0.4", "@types/swagger-ui-react": "^5.18.0", "@typescript-eslint/eslint-plugin": "^8.1.0", "@typescript-eslint/parser": "^8.1.0", "eslint": "^9.39.1", - "eslint-config-next": "^16.0.8", + "eslint-config-next": "^16.0.7", "jest": "^30.1.3", "postcss": "^8.4.39", "prettier": "^3.3.2", @@ -162,6 +165,95 @@ "openapi-types": ">=7" } }, + "node_modules/@auth/core": { + "version": "0.34.3", + "resolved": "https://registry.npmjs.org/@auth/core/-/core-0.34.3.tgz", + "integrity": "sha512-jMjY/S0doZnWYNV90x0jmU3B+UcrsfGYnukxYrRbj0CVvGI/MX3JbHsxSrx2d4mbnXaUsqJmAcDfoQWA6r0lOw==", + "license": "ISC", + "optional": true, + "peer": true, + "dependencies": { + "@panva/hkdf": "^1.1.1", + "@types/cookie": "0.6.0", + "cookie": "0.6.0", + "jose": "^5.1.3", + "oauth4webapi": "^2.10.4", + "preact": "10.11.3", + "preact-render-to-string": "5.2.3" + }, + "peerDependencies": { + "@simplewebauthn/browser": "^9.0.1", + "@simplewebauthn/server": "^9.0.2", + "nodemailer": "^7" + }, + "peerDependenciesMeta": { + "@simplewebauthn/browser": { + "optional": true + }, + "@simplewebauthn/server": { + "optional": true + }, + "nodemailer": { + "optional": true + } + } + }, + "node_modules/@auth/core/node_modules/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@auth/core/node_modules/jose": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/jose/-/jose-5.10.0.tgz", + "integrity": "sha512-s+3Al/p9g32Iq+oqXxkW//7jk2Vig6FF1CFqzVXoTUXt2qz89YWbL+OwS17NFYEvxC35n0FKeGO2LGYSxeM2Gg==", + "license": "MIT", + "optional": true, + "peer": true, + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, + "node_modules/@auth/core/node_modules/preact": { + "version": "10.11.3", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.11.3.tgz", + "integrity": "sha512-eY93IVpod/zG3uMF22Unl8h9KkrcKIRs2EGar8hwLZZDU1lkjph303V9HZBwufh2s736U6VXuhD109LYqPoffg==", + "license": "MIT", + "optional": true, + "peer": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/preact" + } + }, + "node_modules/@auth/core/node_modules/preact-render-to-string": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/preact-render-to-string/-/preact-render-to-string-5.2.3.tgz", + "integrity": "sha512-aPDxUn5o3GhWdtJtW0svRC2SS/l8D9MAgo2+AWml+BhDImb27ALf04Q2d+AHqUUOc6RdSXFIBVa2gxzgMKgtZA==", + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "pretty-format": "^3.8.0" + }, + "peerDependencies": { + "preact": ">=10" + } + }, + "node_modules/@auth/core/node_modules/pretty-format": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-3.8.0.tgz", + "integrity": "sha512-WuxUnVtlWL1OfZFQFuqvnvs6MiAGk9UNsBostyBOB0Is9wb5uRESevA6rnl/rkksXaGX3GzZhPup5d6Vp1nFew==", + "license": "MIT", + "optional": true, + "peer": true + }, "node_modules/@auth/prisma-adapter": { "version": "2.11.1", "resolved": "https://registry.npmjs.org/@auth/prisma-adapter/-/prisma-adapter-2.11.1.tgz", @@ -794,6 +886,49 @@ "integrity": "sha512-wJ8ReQbHxsAfXhrf9ixl0aYbZorRuOWpBNzm8pL8ftmSxQx/wnJD5Eg861NwJU/czy2VXFIebCeZnZrI9rktIQ==", "license": "(Apache-2.0 AND BSD-3-Clause)" }, + "node_modules/@cardananium/cardano-peer-connect": { + "version": "1.2.19", + "resolved": "https://registry.npmjs.org/@cardananium/cardano-peer-connect/-/cardano-peer-connect-1.2.19.tgz", + "integrity": "sha512-LiRHceU7MG2mEww5StYC3H4Pv2GMcKHMiYjqi/Kz7EQ2/msk/C0njhckjAiJZQ72n03QaMIVc/S+LzE/xCyCwA==", + "license": "Apache-2.0", + "dependencies": { + "@cardananium/marble-identicons": "^0.1.2", + "@cardananium/meerkat": "^1.0.18", + "qrcode-svg": "^1.1.0" + } + }, + "node_modules/@cardananium/commonjs": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/@cardananium/commonjs/-/commonjs-1.2.11.tgz", + "integrity": "sha512-yNr9AVjrwUZAV0QBhqjNSXNbL9JlhqaJ/1OAcIHQcik69WztPzvKzR8wFip6EI4m2crF7rHykuAIkVd/JsQGHg==", + "license": "MIT" + }, + "node_modules/@cardananium/marble-identicons": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@cardananium/marble-identicons/-/marble-identicons-0.1.2.tgz", + "integrity": "sha512-VtRf+YEWYPbyuZhdgc5WOqoqiM0eT9FrOV25WmnytTsqD+tKVDQML1y7BOGygOrK7YrklB572YTzHK8ECBL0OA==", + "license": "MIT", + "dependencies": { + "@cardananium/commonjs": "^1.2.11", + "seed-random": "^2.2.0" + } + }, + "node_modules/@cardananium/meerkat": { + "version": "1.0.18", + "resolved": "https://registry.npmjs.org/@cardananium/meerkat/-/meerkat-1.0.18.tgz", + "integrity": "sha512-8nrXyOiVG5Nlz2O3cNlGRX1ttvSxt87ijaW/j0Zi6KF9TCyeqKY3EuCsKb3TJXX+Z/Bi/kW9wdz8unQCFTwrdQ==", + "license": "Apache-2.0", + "dependencies": { + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@rvagg/ripemd160": "^2.2.4", + "@webpod/ip": "^0.6.1", + "bs58": "^6.0.0", + "bs58check": "^4.0.0", + "tweetnacl": "^1.0.3", + "vm-browserify": "^1.1.2", + "webtorrent": "^2.8.4" + } + }, "node_modules/@cardano-ogmios/client": { "version": "6.9.0", "resolved": "https://registry.npmjs.org/@cardano-ogmios/client/-/client-6.9.0.tgz", @@ -1297,8 +1432,19 @@ "version": "0.12.0", "resolved": "https://registry.npmjs.org/@dimforge/rapier3d-compat/-/rapier3d-compat-0.12.0.tgz", "integrity": "sha512-uekIGetywIgopfD97oDL5PfeezkFpNhwlzlaEYNOA0N6ghdsOvh/HYjSMek5Q2O1PYvRSDFcqFVJl4r4ZBwOow==", + "dev": true, "license": "Apache-2.0" }, + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/@emnapi/core": { "version": "1.7.1", "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.7.1.tgz", @@ -1388,19 +1534,6 @@ } } }, - "node_modules/@eslint/compat/node_modules/@eslint/core": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-1.0.0.tgz", - "integrity": "sha512-PRfWP+8FOldvbApr6xL7mNCw4cJcSTq4GA7tYbgq15mRb0kWKO/wEB2jr+uwjFH3sZvEZneZyCUGTxsv4Sahyw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@types/json-schema": "^7.0.15" - }, - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - } - }, "node_modules/@eslint/config-array": { "version": "0.21.1", "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz", @@ -1416,30 +1549,6 @@ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@eslint/config-array/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@eslint/config-array/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, "node_modules/@eslint/config-helpers": { "version": "0.4.2", "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", @@ -1453,7 +1562,7 @@ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@eslint/core": { + "node_modules/@eslint/config-helpers/node_modules/@eslint/core": { "version": "0.17.0", "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", @@ -1466,6 +1575,19 @@ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, + "node_modules/@eslint/core": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-1.0.0.tgz", + "integrity": "sha512-PRfWP+8FOldvbApr6xL7mNCw4cJcSTq4GA7tYbgq15mRb0kWKO/wEB2jr+uwjFH3sZvEZneZyCUGTxsv4Sahyw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, "node_modules/@eslint/eslintrc": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.3.tgz", @@ -1490,44 +1612,10 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@eslint/eslintrc/node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/@eslint/eslintrc/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, "node_modules/@eslint/js": { - "version": "9.39.1", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.1.tgz", - "integrity": "sha512-S26Stp4zCy88tH94QbBv3XCuzRQiZ9yXofEILmglYTh/Ug/a9/umqvgFtYBAo3Lp0nsI/5/qH1CCrbdK3AP1Tw==", + "version": "9.39.2", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.2.tgz", + "integrity": "sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==", "dev": true, "license": "MIT", "engines": { @@ -1561,6 +1649,19 @@ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, + "node_modules/@eslint/plugin-kit/node_modules/@eslint/core": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", + "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, "node_modules/@fabianbormann/cardano-peer-connect": { "version": "1.2.18", "resolved": "https://registry.npmjs.org/@fabianbormann/cardano-peer-connect/-/cardano-peer-connect-1.2.18.tgz", @@ -1675,15 +1776,14 @@ } }, "node_modules/@harmoniclabs/cbor": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@harmoniclabs/cbor/-/cbor-1.3.0.tgz", - "integrity": "sha512-gzRqqcJL8sulc2/6iqRXZdWUCEeK3A+jwJ88sbVNzgk4IeMFQLSFg4Ck8ZBETu/W/q1zdknjNfJYyH1OxVriQA==", - "deprecated": "update to 1.6.0", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@harmoniclabs/cbor/-/cbor-1.6.0.tgz", + "integrity": "sha512-KI25p8pHI1rmFZC9NYSxATwlCZ+KJdjydpptKebHcw03Iy7M+E8mF+hSnN5dTbS45xw5ZyKUgPLRgLo1sTuIoQ==", "license": "Apache-2.0", "dependencies": { "@harmoniclabs/bytestring": "^1.0.0", "@harmoniclabs/obj-utils": "^1.0.0", - "@harmoniclabs/uint8array-utils": "^1.0.0" + "@harmoniclabs/uint8array-utils": "^1.0.3" }, "funding": { "url": "https://github.com/sponsors/HarmonicLabs" @@ -2857,12 +2957,13 @@ "version": "0.10.17", "resolved": "https://registry.npmjs.org/@mediapipe/tasks-vision/-/tasks-vision-0.10.17.tgz", "integrity": "sha512-CZWV/q6TTe8ta61cZXjfnnHsfWIdFhms03M9T7Cnd5y2mdpylJM0rF1qRq+wsQVRMLz1OYPVEBU9ph2Bx8cxrg==", + "dev": true, "license": "Apache-2.0" }, "node_modules/@meshsdk/bitcoin": { - "version": "1.9.0-beta.87", - "resolved": "https://registry.npmjs.org/@meshsdk/bitcoin/-/bitcoin-1.9.0-beta.87.tgz", - "integrity": "sha512-PWo5wJBJYH6PV6wUluq9VVt8F4aV/Kug23is2pyloRRhf20aNndY+0INg7XsrEYyw0dyYr/1qsjUxE3JTZnDxQ==", + "version": "1.9.0-beta.90", + "resolved": "https://registry.npmjs.org/@meshsdk/bitcoin/-/bitcoin-1.9.0-beta.90.tgz", + "integrity": "sha512-oUgBnVmc8Qc0swBemJcExgWL3P/Wf4IxDYCW1EcdrxyadiUbSUGdw3+FHYRetAEieeIR7MvFZNMT6ut8KoiUNg==", "dependencies": { "@bitcoin-js/tiny-secp256k1-asmjs": "^2.2.3", "bip174": "^3.0.0", @@ -2873,9 +2974,9 @@ } }, "node_modules/@meshsdk/common": { - "version": "1.9.0-beta.87", - "resolved": "https://registry.npmjs.org/@meshsdk/common/-/common-1.9.0-beta.87.tgz", - "integrity": "sha512-Q4WrlDGhQGxhekLP1j3h+Juftjx+LG90yg0RjRTkjqi83MMa/pfCtX+ZeueR2VuIY/7a/QiY6uZ3++QbnPWqGQ==", + "version": "1.9.0-beta.90", + "resolved": "https://registry.npmjs.org/@meshsdk/common/-/common-1.9.0-beta.90.tgz", + "integrity": "sha512-2KKgGxXXLGzlBfklyr7Zvsm94+p8TqAsZPzZpi8UC0Fqt5MSgWmATghivB+nFyW2xHT/LfTt9Ts+MB1YdUkCTA==", "license": "Apache-2.0", "dependencies": { "bech32": "^2.0.0", @@ -2885,26 +2986,26 @@ } }, "node_modules/@meshsdk/core": { - "version": "1.9.0-beta.87", - "resolved": "https://registry.npmjs.org/@meshsdk/core/-/core-1.9.0-beta.87.tgz", - "integrity": "sha512-StmDtBuw+hHYhwjxiZhCq1y1KUD/Xei0/lkHmgeDEPbuMGZRKlgCTDpbvsa0G7i6C79E60+QxF/Bm6WGnSeOvA==", + "version": "1.9.0-beta.90", + "resolved": "https://registry.npmjs.org/@meshsdk/core/-/core-1.9.0-beta.90.tgz", + "integrity": "sha512-V2K3WDSx1ILM067BqGWvFZZtC5xf3F2dK/EL4m70MtFqCRfPI7RKbYp/CdlxYuns/X6gCdaR1IN2S2V5wHnJiw==", "license": "Apache-2.0", "dependencies": { - "@meshsdk/common": "1.9.0-beta.87", - "@meshsdk/core-cst": "1.9.0-beta.87", - "@meshsdk/provider": "1.9.0-beta.87", - "@meshsdk/react": "1.9.0-beta.87", - "@meshsdk/transaction": "1.9.0-beta.87", - "@meshsdk/wallet": "1.9.0-beta.87" + "@meshsdk/common": "1.9.0-beta.90", + "@meshsdk/core-cst": "1.9.0-beta.90", + "@meshsdk/provider": "1.9.0-beta.90", + "@meshsdk/react": "1.9.0-beta.90", + "@meshsdk/transaction": "1.9.0-beta.90", + "@meshsdk/wallet": "1.9.0-beta.90" } }, "node_modules/@meshsdk/core-csl": { - "version": "1.9.0-beta.87", - "resolved": "https://registry.npmjs.org/@meshsdk/core-csl/-/core-csl-1.9.0-beta.87.tgz", - "integrity": "sha512-wW5/MOd9Bu1b3I6hLdBjPypXKm5d+Zwalel/WA/ZQt2Gbg/VuzM04/VEnOWuZBz87Uz23Gy642Z7a8o7wThT/g==", + "version": "1.9.0-beta.90", + "resolved": "https://registry.npmjs.org/@meshsdk/core-csl/-/core-csl-1.9.0-beta.90.tgz", + "integrity": "sha512-GTRlr1SBbUDWcSdTj70a23r/hC3TawJFMgeS98y/5L2pWb2zMZdlpHHzB75+I+7p8lvjGgJH/LsFqFxHURqspQ==", "license": "Apache-2.0", "dependencies": { - "@meshsdk/common": "1.9.0-beta.87", + "@meshsdk/common": "1.9.0-beta.90", "@sidan-lab/whisky-js-browser": "^1.0.11", "@sidan-lab/whisky-js-nodejs": "^1.0.11", "@types/base32-encoding": "^1.0.2", @@ -2914,20 +3015,20 @@ } }, "node_modules/@meshsdk/core-cst": { - "version": "1.9.0-beta.87", - "resolved": "https://registry.npmjs.org/@meshsdk/core-cst/-/core-cst-1.9.0-beta.87.tgz", - "integrity": "sha512-28eNgKHDg8yfPblH+fSQX47Hutvp+4TZONALu6XMXQ/yvk8D4BuB8bhvcTgQTVBr1Bf9yxCXGc/+ZHRR1WY1QA==", + "version": "1.9.0-beta.90", + "resolved": "https://registry.npmjs.org/@meshsdk/core-cst/-/core-cst-1.9.0-beta.90.tgz", + "integrity": "sha512-kVd9T+LMBZyEGjQaqpBoq34PaHxDipIm4ErPc2cc6EulSUfHhrZD0WkvYwfL5Fao/YfiTESPu8I3sKXaP07hLw==", "license": "Apache-2.0", "dependencies": { "@cardano-sdk/core": "^0.45.5", "@cardano-sdk/crypto": "^0.2.2", "@cardano-sdk/input-selection": "^0.13.33", "@cardano-sdk/util": "^0.15.5", - "@harmoniclabs/cbor": "1.3.0", + "@harmoniclabs/cbor": "1.6.0", "@harmoniclabs/pair": "^1.0.0", "@harmoniclabs/plutus-data": "1.2.4", "@harmoniclabs/uplc": "1.2.4", - "@meshsdk/common": "1.9.0-beta.87", + "@meshsdk/common": "1.9.0-beta.90", "@types/base32-encoding": "^1.0.2", "base32-encoding": "^1.0.0", "bech32": "^2.0.0", @@ -2936,14 +3037,14 @@ } }, "node_modules/@meshsdk/provider": { - "version": "1.9.0-beta.87", - "resolved": "https://registry.npmjs.org/@meshsdk/provider/-/provider-1.9.0-beta.87.tgz", - "integrity": "sha512-k6VMUEGnVeIc0xFJMHJ4q/citzkTyRxP7KfBnuH/lXnZ4WUdOlxSK7S+PdfcaY9q13H6apBjsylDY+AdQcM91A==", + "version": "1.9.0-beta.90", + "resolved": "https://registry.npmjs.org/@meshsdk/provider/-/provider-1.9.0-beta.90.tgz", + "integrity": "sha512-nylHVAgC+TJT3Zdd8GU52YAW+0lF72vRzzg7ZBKpaKzYtetFTSW1uCR4ENoKrsg9/HVmtSC3MHhFB01aryfi+A==", "license": "Apache-2.0", "dependencies": { - "@meshsdk/bitcoin": "1.9.0-beta.87", - "@meshsdk/common": "1.9.0-beta.87", - "@meshsdk/core-cst": "1.9.0-beta.87", + "@meshsdk/bitcoin": "1.9.0-beta.90", + "@meshsdk/common": "1.9.0-beta.90", + "@meshsdk/core-cst": "1.9.0-beta.90", "@utxorpc/sdk": "^0.6.7", "@utxorpc/spec": "^0.16.0", "axios": "^1.7.2", @@ -2951,16 +3052,16 @@ } }, "node_modules/@meshsdk/react": { - "version": "1.9.0-beta.87", - "resolved": "https://registry.npmjs.org/@meshsdk/react/-/react-1.9.0-beta.87.tgz", - "integrity": "sha512-etzvE7P94TnLWr81LfILM5Cbb9CzUn719QZn7RQVaPGEisNd62wk8QZn1oBEyaiQA0cWoRyr2phLiLIEWoxAuQ==", + "version": "1.9.0-beta.90", + "resolved": "https://registry.npmjs.org/@meshsdk/react/-/react-1.9.0-beta.90.tgz", + "integrity": "sha512-RwEACdKfVaTuDYiAxDeojKcEZjEpfyt80iE01CWO8sLEEfQaqOPQueyEM9WlZ425YjORlhwOC+k/SdEAyGDxzA==", "license": "Apache-2.0", "dependencies": { - "@fabianbormann/cardano-peer-connect": "^1.2.18", - "@meshsdk/bitcoin": "1.9.0-beta.87", - "@meshsdk/common": "1.9.0-beta.87", - "@meshsdk/transaction": "1.9.0-beta.87", - "@meshsdk/wallet": "1.9.0-beta.87", + "@cardananium/cardano-peer-connect": "^1.2.19", + "@meshsdk/bitcoin": "1.9.0-beta.90", + "@meshsdk/common": "1.9.0-beta.90", + "@meshsdk/transaction": "1.9.0-beta.90", + "@meshsdk/wallet": "1.9.0-beta.90", "@meshsdk/web3-sdk": "0.0.50", "@radix-ui/react-dialog": "^1.1.2", "@radix-ui/react-dropdown-menu": "^2.1.2", @@ -2977,28 +3078,28 @@ } }, "node_modules/@meshsdk/transaction": { - "version": "1.9.0-beta.87", - "resolved": "https://registry.npmjs.org/@meshsdk/transaction/-/transaction-1.9.0-beta.87.tgz", - "integrity": "sha512-urLIE72NkShd+8EG7exGygDEL6qktc7cCmrhu/KNyQYevvGAwjWrb8wy63yc7vFC6mMtRlYEETFx7M7d+49Xfg==", + "version": "1.9.0-beta.90", + "resolved": "https://registry.npmjs.org/@meshsdk/transaction/-/transaction-1.9.0-beta.90.tgz", + "integrity": "sha512-oROPbbsaxTE1qB0p31sD5nRvqK33mUrNOzMQjIengXFbuI8WE1uvUC6cGEvMM1Hjm+GXA3N5SClIqJVHNUz5rw==", "license": "Apache-2.0", "dependencies": { "@cardano-sdk/core": "^0.45.5", "@cardano-sdk/input-selection": "^0.13.33", "@cardano-sdk/util": "^0.15.5", - "@meshsdk/common": "1.9.0-beta.87", - "@meshsdk/core-cst": "1.9.0-beta.87", + "@meshsdk/common": "1.9.0-beta.90", + "@meshsdk/core-cst": "1.9.0-beta.90", "json-bigint": "^1.0.0" } }, "node_modules/@meshsdk/wallet": { - "version": "1.9.0-beta.87", - "resolved": "https://registry.npmjs.org/@meshsdk/wallet/-/wallet-1.9.0-beta.87.tgz", - "integrity": "sha512-Jfm9Jeiy7Ps6RPbKX6KP8tSdgz7a92eVyPdLY0lvnKaMpRuLPOdjJ3TKY625n4pV78xo/CCsIZMYZ8FOh8ww9A==", + "version": "1.9.0-beta.90", + "resolved": "https://registry.npmjs.org/@meshsdk/wallet/-/wallet-1.9.0-beta.90.tgz", + "integrity": "sha512-PSsjSpVk1iFab4tlx7p+Xl0Zm2nxW7XqOIUOOQanexNai1IQaWzm37AkgXUr4Z8XW+QJJ0wY/XVs4A4tkv6Giw==", "license": "Apache-2.0", "dependencies": { - "@meshsdk/common": "1.9.0-beta.87", - "@meshsdk/core-cst": "1.9.0-beta.87", - "@meshsdk/transaction": "1.9.0-beta.87", + "@meshsdk/common": "1.9.0-beta.90", + "@meshsdk/core-cst": "1.9.0-beta.90", + "@meshsdk/transaction": "1.9.0-beta.90", "@simplewebauthn/browser": "^13.0.0" } }, @@ -3025,6 +3126,21 @@ "uuid": "^11.1.0" } }, + "node_modules/@meshsdk/web3-sdk/node_modules/@harmoniclabs/cbor": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@harmoniclabs/cbor/-/cbor-1.3.0.tgz", + "integrity": "sha512-gzRqqcJL8sulc2/6iqRXZdWUCEeK3A+jwJ88sbVNzgk4IeMFQLSFg4Ck8ZBETu/W/q1zdknjNfJYyH1OxVriQA==", + "deprecated": "update to 1.6.0", + "license": "Apache-2.0", + "dependencies": { + "@harmoniclabs/bytestring": "^1.0.0", + "@harmoniclabs/obj-utils": "^1.0.0", + "@harmoniclabs/uint8array-utils": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/HarmonicLabs" + } + }, "node_modules/@meshsdk/web3-sdk/node_modules/@meshsdk/bitcoin": { "version": "1.9.0-beta.68", "resolved": "https://registry.npmjs.org/@meshsdk/bitcoin/-/bitcoin-1.9.0-beta.68.tgz", @@ -3251,6 +3367,7 @@ "version": "3.4.0", "resolved": "https://registry.npmjs.org/@monogrid/gainmap-js/-/gainmap-js-3.4.0.tgz", "integrity": "sha512-2Z0FATFHaoYJ8b+Y4y4Hgfn3FRFwuU5zRrk+9dFWp4uGAdHGqVEdP7HP+gLA3X469KXHmfupJaUbKo1b/aDKIg==", + "dev": true, "license": "MIT", "dependencies": { "promise-worker-transferable": "^1.0.4" @@ -3310,16 +3427,26 @@ "@tybys/wasm-util": "^0.10.0" } }, + "node_modules/@next/bundle-analyzer": { + "version": "16.0.10", + "resolved": "https://registry.npmjs.org/@next/bundle-analyzer/-/bundle-analyzer-16.0.10.tgz", + "integrity": "sha512-AHA6ZomhQuRsJtkoRvsq+hIuwA6F26mQzQT8ICcc2dL3BvHRcWOA+EiFr+BgWFY++EE957xVDqMIJjLApyxnwA==", + "dev": true, + "license": "MIT", + "dependencies": { + "webpack-bundle-analyzer": "4.10.1" + } + }, "node_modules/@next/env": { - "version": "16.0.8", - "resolved": "https://registry.npmjs.org/@next/env/-/env-16.0.8.tgz", - "integrity": "sha512-xP4WrQZuj9MdmLJy3eWFHepo+R3vznsMSS8Dy3wdA7FKpjCiesQ6DxZvdGziQisj0tEtCgBKJzjcAc4yZOgLEQ==", + "version": "16.0.10", + "resolved": "https://registry.npmjs.org/@next/env/-/env-16.0.10.tgz", + "integrity": "sha512-8tuaQkyDVgeONQ1MeT9Mkk8pQmZapMKFh5B+OrFUlG3rVmYTXcXlBetBgTurKXGaIZvkoqRT9JL5K3phXcgang==", "license": "MIT" }, "node_modules/@next/eslint-plugin-next": { - "version": "16.0.8", - "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-16.0.8.tgz", - "integrity": "sha512-1miV0qXDcLUaOdHridVPCh4i39ElRIAraseVIbb3BEqyZ5ol9sPyjTP/GNTPV5rBxqxjF6/vv5zQTVbhiNaLqA==", + "version": "16.0.10", + "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-16.0.10.tgz", + "integrity": "sha512-b2NlWN70bbPLmfyoLvvidPKWENBYYIe017ZGUpElvQjDytCWgxPJx7L9juxHt0xHvNVA08ZHJdOyhGzon/KJuw==", "dev": true, "license": "MIT", "dependencies": { @@ -3327,9 +3454,9 @@ } }, "node_modules/@next/swc-darwin-arm64": { - "version": "16.0.8", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-16.0.8.tgz", - "integrity": "sha512-yjVMvTQN21ZHOclQnhSFbjBTEizle+1uo4NV6L4rtS9WO3nfjaeJYw+H91G+nEf3Ef43TaEZvY5mPWfB/De7tA==", + "version": "16.0.10", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-16.0.10.tgz", + "integrity": "sha512-4XgdKtdVsaflErz+B5XeG0T5PeXKDdruDf3CRpnhN+8UebNa5N2H58+3GDgpn/9GBurrQ1uWW768FfscwYkJRg==", "cpu": [ "arm64" ], @@ -3343,9 +3470,9 @@ } }, "node_modules/@next/swc-darwin-x64": { - "version": "16.0.8", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-16.0.8.tgz", - "integrity": "sha512-+zu2N3QQ0ZOb6RyqQKfcu/pn0UPGmg+mUDqpAAEviAcEVEYgDckemOpiMRsBP3IsEKpcoKuNzekDcPczEeEIzA==", + "version": "16.0.10", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-16.0.10.tgz", + "integrity": "sha512-spbEObMvRKkQ3CkYVOME+ocPDFo5UqHb8EMTS78/0mQ+O1nqE8toHJVioZo4TvebATxgA8XMTHHrScPrn68OGw==", "cpu": [ "x64" ], @@ -3359,9 +3486,9 @@ } }, "node_modules/@next/swc-linux-arm64-gnu": { - "version": "16.0.8", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-16.0.8.tgz", - "integrity": "sha512-LConttk+BeD0e6RG0jGEP9GfvdaBVMYsLJ5aDDweKiJVVCu6sGvo+Ohz9nQhvj7EQDVVRJMCGhl19DmJwGr6bQ==", + "version": "16.0.10", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-16.0.10.tgz", + "integrity": "sha512-uQtWE3X0iGB8apTIskOMi2w/MKONrPOUCi5yLO+v3O8Mb5c7K4Q5KD1jvTpTF5gJKa3VH/ijKjKUq9O9UhwOYw==", "cpu": [ "arm64" ], @@ -3375,9 +3502,9 @@ } }, "node_modules/@next/swc-linux-arm64-musl": { - "version": "16.0.8", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-16.0.8.tgz", - "integrity": "sha512-JaXFAlqn8fJV+GhhA9lpg6da/NCN/v9ub98n3HoayoUSPOVdoxEEt86iT58jXqQCs/R3dv5ZnxGkW8aF4obMrQ==", + "version": "16.0.10", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-16.0.10.tgz", + "integrity": "sha512-llA+hiDTrYvyWI21Z0L1GiXwjQaanPVQQwru5peOgtooeJ8qx3tlqRV2P7uH2pKQaUfHxI/WVarvI5oYgGxaTw==", "cpu": [ "arm64" ], @@ -3391,9 +3518,9 @@ } }, "node_modules/@next/swc-linux-x64-gnu": { - "version": "16.0.8", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-16.0.8.tgz", - "integrity": "sha512-O7M9it6HyNhsJp3HNAsJoHk5BUsfj7hRshfptpGcVsPZ1u0KQ/oVy8oxF7tlwxA5tR43VUP0yRmAGm1us514ng==", + "version": "16.0.10", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-16.0.10.tgz", + "integrity": "sha512-AK2q5H0+a9nsXbeZ3FZdMtbtu9jxW4R/NgzZ6+lrTm3d6Zb7jYrWcgjcpM1k8uuqlSy4xIyPR2YiuUr+wXsavA==", "cpu": [ "x64" ], @@ -3407,9 +3534,9 @@ } }, "node_modules/@next/swc-linux-x64-musl": { - "version": "16.0.8", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-16.0.8.tgz", - "integrity": "sha512-8+KClEC/GLI2dLYcrWwHu5JyC5cZYCFnccVIvmxpo6K+XQt4qzqM5L4coofNDZYkct/VCCyJWGbZZDsg6w6LFA==", + "version": "16.0.10", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-16.0.10.tgz", + "integrity": "sha512-1TDG9PDKivNw5550S111gsO4RGennLVl9cipPhtkXIFVwo31YZ73nEbLjNC8qG3SgTz/QZyYyaFYMeY4BKZR/g==", "cpu": [ "x64" ], @@ -3423,9 +3550,9 @@ } }, "node_modules/@next/swc-win32-arm64-msvc": { - "version": "16.0.8", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-16.0.8.tgz", - "integrity": "sha512-rpQ/PgTEgH68SiXmhu/cJ2hk9aZ6YgFvspzQWe2I9HufY6g7V02DXRr/xrVqOaKm2lenBFPNQ+KAaeveywqV+A==", + "version": "16.0.10", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-16.0.10.tgz", + "integrity": "sha512-aEZIS4Hh32xdJQbHz121pyuVZniSNoqDVx1yIr2hy+ZwJGipeqnMZBJHyMxv2tiuAXGx6/xpTcQJ6btIiBjgmg==", "cpu": [ "arm64" ], @@ -3439,9 +3566,9 @@ } }, "node_modules/@next/swc-win32-x64-msvc": { - "version": "16.0.8", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-16.0.8.tgz", - "integrity": "sha512-jWpWjWcMQu2iZz4pEK2IktcfR+OA9+cCG8zenyLpcW8rN4rzjfOzH4yj/b1FiEAZHKS+5Vq8+bZyHi+2yqHbFA==", + "version": "16.0.10", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-16.0.10.tgz", + "integrity": "sha512-E+njfCoFLb01RAFEnGZn6ERoOqhK1Gl3Lfz1Kjnj0Ulfu7oJbuMyvBKNj/bw8XZnenHDASlygTjZICQW+rYW1Q==", "cpu": [ "x64" ], @@ -3711,10 +3838,17 @@ "url": "https://opencollective.com/pkgr" } }, + "node_modules/@polka/url": { + "version": "1.0.0-next.29", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz", + "integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==", + "dev": true, + "license": "MIT" + }, "node_modules/@prisma/client": { - "version": "6.19.0", - "resolved": "https://registry.npmjs.org/@prisma/client/-/client-6.19.0.tgz", - "integrity": "sha512-QXFT+N/bva/QI2qoXmjBzL7D6aliPffIwP+81AdTGq0FXDoLxLkWivGMawG8iM5B9BKfxLIXxfWWAF6wbuJU6g==", + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-6.19.1.tgz", + "integrity": "sha512-4SXj4Oo6HyQkLUWT8Ke5R0PTAfVOKip5Roo+6+b2EDTkFg5be0FnBWiuRJc0BC0sRQIWGMLKW1XguhVfW/z3/A==", "hasInstallScript": true, "license": "Apache-2.0", "engines": { @@ -3734,9 +3868,9 @@ } }, "node_modules/@prisma/config": { - "version": "6.19.0", - "resolved": "https://registry.npmjs.org/@prisma/config/-/config-6.19.0.tgz", - "integrity": "sha512-zwCayme+NzI/WfrvFEtkFhhOaZb/hI+X8TTjzjJ252VbPxAl2hWHK5NMczmnG9sXck2lsXrxIZuK524E25UNmg==", + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/@prisma/config/-/config-6.19.1.tgz", + "integrity": "sha512-bUL/aYkGXLwxVGhJmQMtslLT7KPEfUqmRa919fKI4wQFX4bIFUKiY8Jmio/2waAjjPYrtuDHa7EsNCnJTXxiOw==", "devOptional": true, "license": "Apache-2.0", "dependencies": { @@ -3747,53 +3881,53 @@ } }, "node_modules/@prisma/debug": { - "version": "6.19.0", - "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-6.19.0.tgz", - "integrity": "sha512-8hAdGG7JmxrzFcTzXZajlQCidX0XNkMJkpqtfbLV54wC6LSSX6Vni25W/G+nAANwLnZ2TmwkfIuWetA7jJxJFA==", + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-6.19.1.tgz", + "integrity": "sha512-h1JImhlAd/s5nhY/e9qkAzausWldbeT+e4nZF7A4zjDYBF4BZmKDt4y0jK7EZapqOm1kW7V0e9agV/iFDy3fWw==", "devOptional": true, "license": "Apache-2.0" }, "node_modules/@prisma/engines": { - "version": "6.19.0", - "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-6.19.0.tgz", - "integrity": "sha512-pMRJ+1S6NVdXoB8QJAPIGpKZevFjxhKt0paCkRDTZiczKb7F4yTgRP8M4JdVkpQwmaD4EoJf6qA+p61godDokw==", + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-6.19.1.tgz", + "integrity": "sha512-xy95dNJ7DiPf9IJ3oaVfX785nbFl7oNDzclUF+DIiJw6WdWCvPl0LPU0YqQLsrwv8N64uOQkH391ujo3wSo+Nw==", "devOptional": true, "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { - "@prisma/debug": "6.19.0", - "@prisma/engines-version": "6.19.0-26.2ba551f319ab1df4bc874a89965d8b3641056773", - "@prisma/fetch-engine": "6.19.0", - "@prisma/get-platform": "6.19.0" + "@prisma/debug": "6.19.1", + "@prisma/engines-version": "7.1.1-3.c2990dca591cba766e3b7ef5d9e8a84796e47ab7", + "@prisma/fetch-engine": "6.19.1", + "@prisma/get-platform": "6.19.1" } }, "node_modules/@prisma/engines-version": { - "version": "6.19.0-26.2ba551f319ab1df4bc874a89965d8b3641056773", - "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-6.19.0-26.2ba551f319ab1df4bc874a89965d8b3641056773.tgz", - "integrity": "sha512-gV7uOBQfAFlWDvPJdQxMT1aSRur3a0EkU/6cfbAC5isV67tKDWUrPauyaHNpB+wN1ebM4A9jn/f4gH+3iHSYSQ==", + "version": "7.1.1-3.c2990dca591cba766e3b7ef5d9e8a84796e47ab7", + "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-7.1.1-3.c2990dca591cba766e3b7ef5d9e8a84796e47ab7.tgz", + "integrity": "sha512-03bgb1VD5gvuumNf+7fVGBzfpJPjmqV423l/WxsWk2cNQ42JD0/SsFBPhN6z8iAvdHs07/7ei77SKu7aZfq8bA==", "devOptional": true, "license": "Apache-2.0" }, "node_modules/@prisma/fetch-engine": { - "version": "6.19.0", - "resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-6.19.0.tgz", - "integrity": "sha512-OOx2Lda0DGrZ1rodADT06ZGqHzr7HY7LNMaFE2Vp8dp146uJld58sRuasdX0OiwpHgl8SqDTUKHNUyzEq7pDdQ==", + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-6.19.1.tgz", + "integrity": "sha512-mmgcotdaq4VtAHO6keov3db+hqlBzQS6X7tR7dFCbvXjLVTxBYdSJFRWz+dq7F9p6dvWyy1X0v8BlfRixyQK6g==", "devOptional": true, "license": "Apache-2.0", "dependencies": { - "@prisma/debug": "6.19.0", - "@prisma/engines-version": "6.19.0-26.2ba551f319ab1df4bc874a89965d8b3641056773", - "@prisma/get-platform": "6.19.0" + "@prisma/debug": "6.19.1", + "@prisma/engines-version": "7.1.1-3.c2990dca591cba766e3b7ef5d9e8a84796e47ab7", + "@prisma/get-platform": "6.19.1" } }, "node_modules/@prisma/get-platform": { - "version": "6.19.0", - "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-6.19.0.tgz", - "integrity": "sha512-ym85WDO2yDhC3fIXHWYpG3kVMBA49cL1XD2GCsCF8xbwoy2OkDQY44gEbAt2X46IQ4Apq9H6g0Ex1iFfPqEkHA==", + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-6.19.1.tgz", + "integrity": "sha512-zsg44QUiQAnFUyh6Fbt7c9HjMXHwFTqtrgcX7DAZmRgnkPyYT7Sh8Mn8D5PuuDYNtMOYcpLGg576MLfIORsBYw==", "devOptional": true, "license": "Apache-2.0", "dependencies": { - "@prisma/debug": "6.19.0" + "@prisma/debug": "6.19.1" } }, "node_modules/@radix-ui/number": { @@ -4939,6 +5073,7 @@ "version": "9.7.5", "resolved": "https://registry.npmjs.org/@react-spring/animated/-/animated-9.7.5.tgz", "integrity": "sha512-Tqrwz7pIlsSDITzxoLS3n/v/YCUHQdOIKtOJf4yL6kYVSDTSmVK1LI1Q3M/uu2Sx4X3pIWF3xLUhlsA6SPNTNg==", + "dev": true, "license": "MIT", "dependencies": { "@react-spring/shared": "~9.7.5", @@ -4952,6 +5087,7 @@ "version": "9.7.5", "resolved": "https://registry.npmjs.org/@react-spring/core/-/core-9.7.5.tgz", "integrity": "sha512-rmEqcxRcu7dWh7MnCcMXLvrf6/SDlSokLaLTxiPlAYi11nN3B5oiCUAblO72o+9z/87j2uzxa2Inm8UbLjXA+w==", + "dev": true, "license": "MIT", "dependencies": { "@react-spring/animated": "~9.7.5", @@ -4970,12 +5106,14 @@ "version": "9.7.5", "resolved": "https://registry.npmjs.org/@react-spring/rafz/-/rafz-9.7.5.tgz", "integrity": "sha512-5ZenDQMC48wjUzPAm1EtwQ5Ot3bLIAwwqP2w2owG5KoNdNHpEJV263nGhCeKKmuA3vG2zLLOdu3or6kuDjA6Aw==", + "dev": true, "license": "MIT" }, "node_modules/@react-spring/shared": { "version": "9.7.5", "resolved": "https://registry.npmjs.org/@react-spring/shared/-/shared-9.7.5.tgz", "integrity": "sha512-wdtoJrhUeeyD/PP/zo+np2s1Z820Ohr/BbuVYv+3dVLW7WctoiN7std8rISoYoHpUXtbkpesSKuPIw/6U1w1Pw==", + "dev": true, "license": "MIT", "dependencies": { "@react-spring/rafz": "~9.7.5", @@ -4989,6 +5127,7 @@ "version": "9.7.5", "resolved": "https://registry.npmjs.org/@react-spring/three/-/three-9.7.5.tgz", "integrity": "sha512-RxIsCoQfUqOS3POmhVHa1wdWS0wyHAUway73uRLp3GAL5U2iYVNdnzQsep6M2NZ994BlW8TcKuMtQHUqOsy6WA==", + "dev": true, "license": "MIT", "dependencies": { "@react-spring/animated": "~9.7.5", @@ -5006,12 +5145,14 @@ "version": "9.7.5", "resolved": "https://registry.npmjs.org/@react-spring/types/-/types-9.7.5.tgz", "integrity": "sha512-HVj7LrZ4ReHWBimBvu2SKND3cDVUPWKLqRTmWe/fNY6o1owGOX0cAHbdPDTMelgBlVbrTKrre6lFkhqGZErK/g==", + "dev": true, "license": "MIT" }, "node_modules/@react-three/drei": { "version": "9.122.0", "resolved": "https://registry.npmjs.org/@react-three/drei/-/drei-9.122.0.tgz", "integrity": "sha512-SEO/F/rBCTjlLez7WAlpys+iGe9hty4rNgjZvgkQeXFSiwqD4Hbk/wNHMAbdd8vprO2Aj81mihv4dF5bC7D0CA==", + "dev": true, "license": "MIT", "dependencies": { "@babel/runtime": "^7.26.0", @@ -5053,6 +5194,7 @@ "version": "5.0.9", "resolved": "https://registry.npmjs.org/zustand/-/zustand-5.0.9.tgz", "integrity": "sha512-ALBtUj0AfjJt3uNRQoL1tL2tMvj6Gp/6e39dnfT6uzpelGru8v1tPOGBzayOWbPJvujM8JojDk3E1LxeFisBNg==", + "dev": true, "license": "MIT", "engines": { "node": ">=12.20.0" @@ -5082,6 +5224,7 @@ "version": "8.18.0", "resolved": "https://registry.npmjs.org/@react-three/fiber/-/fiber-8.18.0.tgz", "integrity": "sha512-FYZZqD0UUHUswKz3LQl2Z7H24AhD14XGTsIRw3SJaXUxyfVMi+1yiZGmqTcPt/CkPpdU7rrxqcyQ1zJE5DjvIQ==", + "dev": true, "license": "MIT", "dependencies": { "@babel/runtime": "^7.17.8", @@ -5131,6 +5274,7 @@ "version": "3.7.2", "resolved": "https://registry.npmjs.org/zustand/-/zustand-3.7.2.tgz", "integrity": "sha512-PIJDIZKtokhof+9+60cpockVOq05sJzHCriyvaLBmEJixseQ1a5Kdov6fWZfWOu5SK9c+FhH1jU0tntLxRJYMA==", + "dev": true, "license": "MIT", "engines": { "node": ">=12.7.0" @@ -5295,6 +5439,26 @@ "node": ">=10.0.0" } }, + "node_modules/@simplewebauthn/browser": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/@simplewebauthn/browser/-/browser-9.0.1.tgz", + "integrity": "sha512-wD2WpbkaEP4170s13/HUxPcAV5y4ZXaKo1TfNklS5zDefPinIgXOpgz1kpEvobAsaLPa2KeH7AKKX/od1mrBJw==", + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@simplewebauthn/types": "^9.0.1" + } + }, + "node_modules/@simplewebauthn/types": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/@simplewebauthn/types/-/types-9.0.1.tgz", + "integrity": "sha512-tGSRP1QvsAvsJmnOlRQyw/mvK9gnPtjEc5fg2+m8n+QUa+D7rvrKkOYyfpy42GTs90X3RDOnqJgfHt+qO67/+w==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "license": "MIT", + "optional": true, + "peer": true + }, "node_modules/@sinclair/typebox": { "version": "0.34.41", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.41.tgz", @@ -5911,6 +6075,15 @@ "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.1" } }, + "node_modules/@swagger-api/apidom-reference/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, "node_modules/@swagger-api/apidom-reference/node_modules/minimatch": { "version": "7.4.6", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-7.4.6.tgz", @@ -6078,31 +6251,31 @@ } }, "node_modules/@trpc/client": { - "version": "11.7.2", - "resolved": "https://registry.npmjs.org/@trpc/client/-/client-11.7.2.tgz", - "integrity": "sha512-OQxqUMfpDvjcszo9dbnqWQXnW2L5IbrKSz2H7l8s+mVM3EvYw7ztQ/gjFIN3iy0NcamiQfd4eE6qjcb9Lm+63A==", + "version": "11.8.0", + "resolved": "https://registry.npmjs.org/@trpc/client/-/client-11.8.0.tgz", + "integrity": "sha512-imJQeESX1hAapDaC4JB91yvXg41AZfBuTh/scnEiN/hAubZa5s/ikp0n+w29q2GCf+hREkr3WptUFKFJoDAIug==", "funding": [ "https://trpc.io/sponsor" ], "license": "MIT", "peerDependencies": { - "@trpc/server": "11.7.2", + "@trpc/server": "11.8.0", "typescript": ">=5.7.2" } }, "node_modules/@trpc/next": { - "version": "11.7.2", - "resolved": "https://registry.npmjs.org/@trpc/next/-/next-11.7.2.tgz", - "integrity": "sha512-eZQeZag+/aJMxV6ucfyVdcgE7I6o88tldyBi+AFVCD8fPUjssRT7qOqR/THSaTLHjDl20Ok9gN0Sn1bmMEa+1w==", + "version": "11.8.0", + "resolved": "https://registry.npmjs.org/@trpc/next/-/next-11.8.0.tgz", + "integrity": "sha512-aMS1itkddKCeZEmd4fV9jm9+HMob4R684FfNqXdnGkw0acfdeUpk4hihs8gml+fMqgPRv6LcgsZlOb4YpOOjbg==", "funding": [ "https://trpc.io/sponsor" ], "license": "MIT", "peerDependencies": { "@tanstack/react-query": "^5.59.15", - "@trpc/client": "11.7.2", - "@trpc/react-query": "11.7.2", - "@trpc/server": "11.7.2", + "@trpc/client": "11.8.0", + "@trpc/react-query": "11.8.0", + "@trpc/server": "11.8.0", "next": "*", "react": ">=16.8.0", "react-dom": ">=16.8.0", @@ -6118,26 +6291,26 @@ } }, "node_modules/@trpc/react-query": { - "version": "11.7.2", - "resolved": "https://registry.npmjs.org/@trpc/react-query/-/react-query-11.7.2.tgz", - "integrity": "sha512-IcLDMqx2mvlGRxkr0/m37TtPvRQ8nonITH3EwYv436x0Igx8eduR9z4tdgGBsjJY9e5W1G7cZ4zKCwrizSimFQ==", + "version": "11.8.0", + "resolved": "https://registry.npmjs.org/@trpc/react-query/-/react-query-11.8.0.tgz", + "integrity": "sha512-zJG22PqhGUBq6ke58McGxRBGWGDTHlmsgpxp/rQx8iT2yi0Ja1H2/UcSsjZ/MG65DhCfpKvMVH0OVivTn9FWwA==", "funding": [ "https://trpc.io/sponsor" ], "license": "MIT", "peerDependencies": { "@tanstack/react-query": "^5.80.3", - "@trpc/client": "11.7.2", - "@trpc/server": "11.7.2", + "@trpc/client": "11.8.0", + "@trpc/server": "11.8.0", "react": ">=18.2.0", "react-dom": ">=18.2.0", "typescript": ">=5.7.2" } }, "node_modules/@trpc/server": { - "version": "11.7.2", - "resolved": "https://registry.npmjs.org/@trpc/server/-/server-11.7.2.tgz", - "integrity": "sha512-AgB26PXY69sckherIhCacKLY49rxE2XP5h38vr/KMZTbLCL1p8IuIoKPjALTcugC2kbyQ7Lbqo2JDVfRSmPmfQ==", + "version": "11.8.0", + "resolved": "https://registry.npmjs.org/@trpc/server/-/server-11.8.0.tgz", + "integrity": "sha512-DphyQnLuyX2nwJCQGWQ9zYz4hZGvRhSBqDhQ0SH3tDhQ3PU4u68xofA0pJ741Ir4InEAFD+TtJVLAQy+wVOkiQ==", "funding": [ "https://trpc.io/sponsor" ], @@ -6270,6 +6443,14 @@ "@types/node": "*" } }, + "node_modules/@types/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==", + "license": "MIT", + "optional": true, + "peer": true + }, "node_modules/@types/cors": { "version": "2.8.19", "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.19.tgz", @@ -6356,6 +6537,7 @@ "version": "1.4.10", "resolved": "https://registry.npmjs.org/@types/draco3d/-/draco3d-1.4.10.tgz", "integrity": "sha512-AX22jp8Y7wwaBgAixaSvkoG4M/+PlAcm3Qs4OW8yT9DM4xUpWKeFhLueTAyZF39pviAdcDdeJoACapiAceqNcw==", + "dev": true, "license": "MIT" }, "node_modules/@types/eslint": { @@ -6500,9 +6682,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "20.19.25", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.25.tgz", - "integrity": "sha512-ZsJzA5thDQMSQO788d7IocwwQbI8B5OPzmqNvpf3NY/+MHDAS759Wo0gd2WQeXYt5AAAQjzcrTVC6SKCuYgoCQ==", + "version": "20.19.27", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.27.tgz", + "integrity": "sha512-N2clP5pJhB2YnZJ3PIHFk5RkygRX5WO/5f0WC08tp0wd+sv0rsJk3MqWn3CbNmT2J505a5336jaQj4ph1AdMug==", "license": "MIT", "dependencies": { "undici-types": "~6.21.0" @@ -6512,12 +6694,13 @@ "version": "2019.7.3", "resolved": "https://registry.npmjs.org/@types/offscreencanvas/-/offscreencanvas-2019.7.3.tgz", "integrity": "sha512-ieXiYmgSRXUDeOntE1InxjWyvEelZGP63M+cGuquuRLuIKKT1osnkXjxev9B7d1nXSug5vpunx+gNlbVxMlC9A==", + "dev": true, "license": "MIT" }, "node_modules/@types/papaparse": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@types/papaparse/-/papaparse-5.5.1.tgz", - "integrity": "sha512-esEO+VISsLIyE+JZBmb89NzsYYbpwV8lmv2rPo6oX5y9KhBaIP7hhHgjuTut54qjdKVMufTEcrh5fUl9+58huw==", + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/@types/papaparse/-/papaparse-5.5.2.tgz", + "integrity": "sha512-gFnFp/JMzLHCwRf7tQHrNnfhN4eYBVYYI897CGX4MY1tzY9l2aLkVyx2IlKZ/SAqDbB3I1AOZW5gTMGGsqWliA==", "dev": true, "license": "MIT", "dependencies": { @@ -6530,12 +6713,6 @@ "integrity": "sha512-AUZTa7hQ2KY5L7AmtSiqxlhWxb4ina0yd8hNbl4TWuqnv/pFP0nDMb3YrfSBf4hJVGLh2YEIBfKaBW/9UEl6IQ==", "license": "MIT" }, - "node_modules/@types/prop-types": { - "version": "15.7.15", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz", - "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", - "license": "MIT" - }, "node_modules/@types/ramda": { "version": "0.30.2", "resolved": "https://registry.npmjs.org/@types/ramda/-/ramda-0.30.2.tgz", @@ -6546,29 +6723,29 @@ } }, "node_modules/@types/react": { - "version": "18.3.27", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.27.tgz", - "integrity": "sha512-cisd7gxkzjBKU2GgdYrTdtQx1SORymWyaAFhaxQPK9bYO9ot3Y5OikQRvY0VYQtvwjeQnizCINJAenh/V7MK2w==", + "version": "19.2.7", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.7.tgz", + "integrity": "sha512-MWtvHrGZLFttgeEj28VXHxpmwYbor/ATPYbBfSFZEIRK0ecCFLl2Qo55z52Hss+UV9CRN7trSeq1zbgx7YDWWg==", "license": "MIT", "dependencies": { - "@types/prop-types": "*", "csstype": "^3.2.2" } }, "node_modules/@types/react-dom": { - "version": "18.3.7", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.7.tgz", - "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==", + "version": "19.2.3", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz", + "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", "devOptional": true, "license": "MIT", "peerDependencies": { - "@types/react": "^18.0.0" + "@types/react": "^19.2.0" } }, "node_modules/@types/react-reconciler": { "version": "0.26.7", "resolved": "https://registry.npmjs.org/@types/react-reconciler/-/react-reconciler-0.26.7.tgz", "integrity": "sha512-mBDYl8x+oyPX/VBb3E638N0B7xG+SPk/EAMcVPeexqus/5aTpTphQi0curhhshOqRrc9t6OPoJfEUkbymse/lQ==", + "dev": true, "license": "MIT", "dependencies": { "@types/react": "*" @@ -6585,6 +6762,7 @@ "version": "0.17.4", "resolved": "https://registry.npmjs.org/@types/stats.js/-/stats.js-0.17.4.tgz", "integrity": "sha512-jIBvWWShCvlBqBNIZt0KAshWpvSjhkwkEu4ZUcASoAvhmrgAUI2t1dXrjSL4xXVLB4FznPrIsX3nKXFl/Dt4vA==", + "dev": true, "license": "MIT" }, "node_modules/@types/swagger-jsdoc": { @@ -6605,15 +6783,16 @@ } }, "node_modules/@types/three": { - "version": "0.181.0", - "resolved": "https://registry.npmjs.org/@types/three/-/three-0.181.0.tgz", - "integrity": "sha512-MLF1ks8yRM2k71D7RprFpDb9DOX0p22DbdPqT/uAkc6AtQXjxWCVDjCy23G9t1o8HcQPk7woD2NIyiaWcWPYmA==", + "version": "0.182.0", + "resolved": "https://registry.npmjs.org/@types/three/-/three-0.182.0.tgz", + "integrity": "sha512-WByN9V3Sbwbe2OkWuSGyoqQO8Du6yhYaXtXLoA5FkKTUJorZ+yOHBZ35zUUPQXlAKABZmbYp5oAqpA4RBjtJ/Q==", + "dev": true, "license": "MIT", "dependencies": { "@dimforge/rapier3d-compat": "~0.12.0", "@tweenjs/tween.js": "~23.1.3", "@types/stats.js": "*", - "@types/webxr": "*", + "@types/webxr": ">=0.5.17", "@webgpu/types": "*", "fflate": "~0.8.2", "meshoptimizer": "~0.22.0" @@ -6642,6 +6821,7 @@ "version": "0.5.24", "resolved": "https://registry.npmjs.org/@types/webxr/-/webxr-0.5.24.tgz", "integrity": "sha512-h8fgEd/DpoS9CBrjEQXR+dIDraopAEfu4wYVNY2tEPwk60stPWhvZMf4Foo5FakuQ7HFZoa8WceaWFervK2Ovg==", + "dev": true, "license": "MIT" }, "node_modules/@types/yargs": { @@ -6690,6 +6870,16 @@ "typescript": ">=4.8.4 <6.0.0" } }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, "node_modules/@typescript-eslint/parser": { "version": "8.49.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.49.0.tgz", @@ -6839,6 +7029,32 @@ "typescript": ">=4.8.4 <6.0.0" } }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { "version": "7.7.3", "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", @@ -7186,12 +7402,14 @@ "version": "10.3.1", "resolved": "https://registry.npmjs.org/@use-gesture/core/-/core-10.3.1.tgz", "integrity": "sha512-WcINiDt8WjqBdUXye25anHiNxPc0VOrlT8F6LLkU6cycrOGUDyY/yyFmsg3k8i5OLvv25llc0QC45GhR/C8llw==", + "dev": true, "license": "MIT" }, "node_modules/@use-gesture/react": { "version": "10.3.1", "resolved": "https://registry.npmjs.org/@use-gesture/react/-/react-10.3.1.tgz", "integrity": "sha512-Yy19y6O2GJq8f7CHf7L0nxL8bf4PZCPaVOCgJrusOeFHY1LvHgYXnmnXg6N5iwAnbgbZCDjo60SiM6IPJi9C5g==", + "dev": true, "license": "MIT", "dependencies": { "@use-gesture/core": "10.3.1" @@ -7226,9 +7444,10 @@ } }, "node_modules/@webgpu/types": { - "version": "0.1.67", - "resolved": "https://registry.npmjs.org/@webgpu/types/-/types-0.1.67.tgz", - "integrity": "sha512-uk53+2ECGUkWoDFez/hymwpRfdgdIn6y1ref70fEecGMe5607f4sozNFgBk0oxlr7j2CRGWBEc3IBYMmFdGGTQ==", + "version": "0.1.68", + "resolved": "https://registry.npmjs.org/@webgpu/types/-/types-0.1.68.tgz", + "integrity": "sha512-3ab1B59Ojb6RwjOspYLsTpCzbNB3ZaamIAxBMmvnNkiDoLTZUOBXZ9p5nAYVEkQlDdf6qAZWi1pqj9+ypiqznA==", + "dev": true, "license": "BSD-3-Clause" }, "node_modules/@webpod/ip": { @@ -7307,6 +7526,19 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, + "node_modules/acorn-walk": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", + "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/addr-to-ip-port": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/addr-to-ip-port/-/addr-to-ip-port-2.0.0.tgz", @@ -7615,9 +7847,9 @@ "license": "MIT" }, "node_modules/asn1js": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/asn1js/-/asn1js-3.0.6.tgz", - "integrity": "sha512-UOCGPYbl0tv8+006qks/dTgV9ajs97X2p0FAbyS2iyCRrmLSRolDaHdp+v/CLgnzHc3fVB+CwYiUmei7ndFcgA==", + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/asn1js/-/asn1js-3.0.7.tgz", + "integrity": "sha512-uLvq6KJu04qoQM6gvBfKFjlh6Gl0vOKQuR5cJMDHQkmwfMOQeN3F3SHCv9SNYSL+CRoHvOGFfllDlVz03GQjvQ==", "license": "BSD-3-Clause", "dependencies": { "pvtsutils": "^1.3.6", @@ -8002,9 +8234,9 @@ "license": "MIT" }, "node_modules/baseline-browser-mapping": { - "version": "2.9.4", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.4.tgz", - "integrity": "sha512-ZCQ9GEWl73BVm8bu5Fts8nt7MHdbt5vY9bP6WGnUh+r3l8M7CgfyTlwsgCbMC66BNxPr6Xoce3j66Ms5YUQTNA==", + "version": "2.9.7", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.7.tgz", + "integrity": "sha512-k9xFKplee6KIio3IDbwj+uaCLpqzOwakOgmqzPezM0sFJlFKcg30vk2wOiAJtkTSfx0SSQDSe8q+mWA/fSH5Zg==", "license": "Apache-2.0", "bin": { "baseline-browser-mapping": "dist/cli.js" @@ -8047,6 +8279,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/bidi-js/-/bidi-js-1.0.3.tgz", "integrity": "sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==", + "dev": true, "license": "MIT", "dependencies": { "require-from-string": "^2.0.2" @@ -8513,12 +8746,14 @@ "license": "MIT" }, "node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, "node_modules/braces": { @@ -8809,15 +9044,16 @@ "version": "2.10.1", "resolved": "https://registry.npmjs.org/camera-controls/-/camera-controls-2.10.1.tgz", "integrity": "sha512-KnaKdcvkBJ1Irbrzl8XD6WtZltkRjp869Jx8c0ujs9K+9WD+1D7ryBsCiVqJYUqt6i/HR5FxT7RLASieUD+Q5w==", + "dev": true, "license": "MIT", "peerDependencies": { "three": ">=0.126.1" } }, "node_modules/caniuse-lite": { - "version": "1.0.30001759", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001759.tgz", - "integrity": "sha512-Pzfx9fOKoKvevQf8oCXoyNRQ5QyxJj+3O0Rqx2V5oxT61KGx8+n6hV/IUyJeifUci2clnmmKVpvtiqRzgiWjSw==", + "version": "1.0.30001760", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001760.tgz", + "integrity": "sha512-7AAMPcueWELt1p3mi13HR/LHH0TJLT11cnwDJEs3xA4+CK/PLKeO9Kl1oru24htkyUKtkGCvAx4ohB0Ttry8Dw==", "funding": [ { "type": "opencollective", @@ -9460,6 +9696,7 @@ "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", + "dev": true, "license": "MIT", "dependencies": { "cross-spawn": "^7.0.1" @@ -9823,6 +10060,13 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/debounce": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", + "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==", + "dev": true, + "license": "MIT" + }, "node_modules/debug": { "version": "4.4.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", @@ -10132,6 +10376,7 @@ "version": "5.0.70", "resolved": "https://registry.npmjs.org/detect-gpu/-/detect-gpu-5.0.70.tgz", "integrity": "sha512-bqerEP1Ese6nt3rFkwPnGbsUF9a4q+gMmpTVVOEzoCyeCc+y7/RvJnQZJx1JwhgQI5Ntg0Kgat8Uu7XpBqnz1w==", + "dev": true, "license": "MIT", "dependencies": { "webgl-constants": "^1.1.1" @@ -10269,6 +10514,7 @@ "version": "1.5.7", "resolved": "https://registry.npmjs.org/draco3d/-/draco3d-1.5.7.tgz", "integrity": "sha512-m6WCKt/erDXcw+70IJXnG7M3awwQPAsZvJGX5zY7beBqpELw6RDGkYVU0W43AFxye4pDZ5i2Lbyc/NNGqwjUVQ==", + "dev": true, "license": "Apache-2.0" }, "node_modules/drange": { @@ -10294,6 +10540,13 @@ "node": ">= 0.4" } }, + "node_modules/duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", + "dev": true, + "license": "MIT" + }, "node_modules/earcut": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/earcut/-/earcut-3.0.2.tgz", @@ -10341,9 +10594,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.266", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.266.tgz", - "integrity": "sha512-kgWEglXvkEfMH7rxP5OSZZwnaDWT7J9EoZCujhnpLbfi0bbNtRkgdX2E3gt0Uer11c61qCYktB3hwkAS325sJg==", + "version": "1.5.267", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.267.tgz", + "integrity": "sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==", "license": "ISC" }, "node_modules/emittery": { @@ -10401,9 +10654,9 @@ } }, "node_modules/es-abstract": { - "version": "1.24.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz", - "integrity": "sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==", + "version": "1.24.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.1.tgz", + "integrity": "sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw==", "dev": true, "license": "MIT", "dependencies": { @@ -10488,27 +10741,27 @@ } }, "node_modules/es-iterator-helpers": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.1.tgz", - "integrity": "sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.2.tgz", + "integrity": "sha512-BrUQ0cPTB/IwXj23HtwHjS9n7O4h9FX94b4xc5zlTHxeLgTAdzYUDyy6KdExAl9lbN5rtfe44xpjpmj9grxs5w==", "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.8", - "call-bound": "^1.0.3", + "call-bound": "^1.0.4", "define-properties": "^1.2.1", - "es-abstract": "^1.23.6", + "es-abstract": "^1.24.1", "es-errors": "^1.3.0", - "es-set-tostringtag": "^2.0.3", + "es-set-tostringtag": "^2.1.0", "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.6", + "get-intrinsic": "^1.3.0", "globalthis": "^1.0.4", "gopd": "^1.2.0", "has-property-descriptors": "^1.0.2", "has-proto": "^1.2.0", "has-symbols": "^1.1.0", "internal-slot": "^1.1.0", - "iterator.prototype": "^1.1.4", + "iterator.prototype": "^1.1.5", "safe-array-concat": "^1.1.3" }, "engines": { @@ -10602,9 +10855,9 @@ } }, "node_modules/eslint": { - "version": "9.39.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.1.tgz", - "integrity": "sha512-BhHmn2yNOFA9H9JmmIVKJmd288g9hrVRDkdoIgRCRuSySRUHH7r/DI6aAXW9T1WwUuY3DFgrcaqB+deURBLR5g==", + "version": "9.39.2", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.2.tgz", + "integrity": "sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==", "dev": true, "license": "MIT", "dependencies": { @@ -10614,7 +10867,7 @@ "@eslint/config-helpers": "^0.4.2", "@eslint/core": "^0.17.0", "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.39.1", + "@eslint/js": "9.39.2", "@eslint/plugin-kit": "^0.4.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", @@ -10662,13 +10915,13 @@ } }, "node_modules/eslint-config-next": { - "version": "16.0.8", - "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-16.0.8.tgz", - "integrity": "sha512-8J5cOAboXIV3f8OD6BOyj7Fik6n/as7J4MboiUSExWruf/lCu1OPR3ZVSdnta6WhzebrmAATEmNSBZsLWA6kbg==", + "version": "16.0.10", + "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-16.0.10.tgz", + "integrity": "sha512-BxouZUm0I45K4yjOOIzj24nTi0H2cGo0y7xUmk+Po/PYtJXFBYVDS1BguE7t28efXjKdcN0tmiLivxQy//SsZg==", "dev": true, "license": "MIT", "dependencies": { - "@next/eslint-plugin-next": "16.0.8", + "@next/eslint-plugin-next": "16.0.10", "eslint-import-resolver-node": "^0.3.6", "eslint-import-resolver-typescript": "^3.5.2", "eslint-plugin-import": "^2.32.0", @@ -10811,24 +11064,13 @@ "object.values": "^1.2.1", "semver": "^6.3.1", "string.prototype.trimend": "^1.0.9", - "tsconfig-paths": "^3.15.0" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" - } - }, - "node_modules/eslint-plugin-import/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "tsconfig-paths": "^3.15.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" } }, "node_modules/eslint-plugin-import/node_modules/debug": { @@ -10841,19 +11083,6 @@ "ms": "^2.1.1" } }, - "node_modules/eslint-plugin-import/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, "node_modules/eslint-plugin-jsx-a11y": { "version": "6.10.2", "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.2.tgz", @@ -10884,30 +11113,6 @@ "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9" } }, - "node_modules/eslint-plugin-jsx-a11y/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/eslint-plugin-jsx-a11y/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, "node_modules/eslint-plugin-react": { "version": "7.37.5", "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz", @@ -10961,30 +11166,6 @@ "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" } }, - "node_modules/eslint-plugin-react/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/eslint-plugin-react/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, "node_modules/eslint-plugin-react/node_modules/resolve": { "version": "2.0.0-next.5", "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", @@ -11033,15 +11214,17 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "node_modules/eslint/node_modules/@eslint/core": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", + "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, "node_modules/eslint/node_modules/eslint-visitor-keys": { @@ -11057,29 +11240,6 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/eslint/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, "node_modules/espree": { "version": "10.4.0", "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", @@ -11340,9 +11500,9 @@ "license": "MIT" }, "node_modules/fast-equals": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-5.3.3.tgz", - "integrity": "sha512-/boTcHZeIAQ2r/tL11voclBHDeP9WPxLt+tyAbVSyyXuUFyh0Tne7gJZTqGbxnvj79TjLdCXLOY7UIPhyG5MTw==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-5.4.0.tgz", + "integrity": "sha512-jt2DW/aNFNwke7AUd+Z+e6pz39KO5rzdbbFCg2sGafS4mk13MI7Z8O5z9cADNn5lhGODIgLwug6TZO2ctf7kcw==", "license": "MIT", "engines": { "node": ">=6.0.0" @@ -11469,6 +11629,7 @@ "version": "0.8.2", "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.2.tgz", "integrity": "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==", + "dev": true, "license": "MIT" }, "node_modules/file-entry-cache": { @@ -12109,6 +12270,7 @@ "version": "0.0.0", "resolved": "https://registry.npmjs.org/glsl-noise/-/glsl-noise-0.0.0.tgz", "integrity": "sha512-b/ZCF6amfAUb7dJM/MxRs7AetQEahYzJ8PtgfrmEdtw6uyGOr+ZSGtgjFm6mfsBkxJ4d2W7kg+Nlqzqvn3Bc0w==", + "dev": true, "license": "MIT" }, "node_modules/gopd": { @@ -12130,10 +12292,26 @@ "dev": true, "license": "ISC" }, + "node_modules/gzip-size": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", + "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "duplexer": "^0.1.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/h3-js": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/h3-js/-/h3-js-4.3.0.tgz", - "integrity": "sha512-zgvyHZz5bEKeuyYGh0bF9/kYSxJ2SqroopkXHqKnD3lfjaZawcxulcI9nWbNC54gakl/2eObRLHWueTf1iLSaA==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/h3-js/-/h3-js-4.4.0.tgz", + "integrity": "sha512-DvJh07MhGgY2KcC4OeZc8SSyA+ZXpdvoh6uCzGpoKvWtZxJB+g6VXXC1+eWYkaMIsLz7J/ErhOalHCpcs1KYog==", "license": "Apache-2.0", "engines": { "node": ">=4", @@ -12422,6 +12600,7 @@ "version": "1.6.15", "resolved": "https://registry.npmjs.org/hls.js/-/hls.js-1.6.15.tgz", "integrity": "sha512-E3a5VwgXimGHwpRGV+WxRTKeSp2DW5DI5MWv34ulL3t5UNmyJWCQ1KmLEHbYzcfThfXG8amBL+fCYPneGHC4VA==", + "dev": true, "license": "Apache-2.0" }, "node_modules/html-escaper": { @@ -12492,9 +12671,9 @@ "license": "BSD-3-Clause" }, "node_modules/ignore": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", - "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, "license": "MIT", "engines": { @@ -12505,6 +12684,7 @@ "version": "3.0.6", "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", + "dev": true, "license": "MIT" }, "node_modules/immediate-chunk-store": { @@ -13063,10 +13243,21 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/is-promise": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==", + "dev": true, "license": "MIT" }, "node_modules/is-regex": { @@ -13373,6 +13564,7 @@ "version": "1.2.5", "resolved": "https://registry.npmjs.org/its-fine/-/its-fine-1.2.5.tgz", "integrity": "sha512-fXtDA0X0t0eBYAGLVM5YsgJGsJ5jEmqZEPrGbzdf5awjv0xE7nqv3TVnvtUF060Tkes15DbDAKW/I48vsb6SyA==", + "dev": true, "license": "MIT", "dependencies": { "@types/react-reconciler": "^0.28.0" @@ -13385,6 +13577,7 @@ "version": "0.28.9", "resolved": "https://registry.npmjs.org/@types/react-reconciler/-/react-reconciler-0.28.9.tgz", "integrity": "sha512-HHM3nxyUZ3zAylX8ZEyrDNd2XZOnQ0D5XfunJF5FLQnZbHHYq4UWvW1QfelQNXv1ICNkwYhfxjwfnqivYB6bFg==", + "dev": true, "license": "MIT", "peerDependencies": { "@types/react": "*" @@ -14427,6 +14620,7 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "dev": true, "license": "MIT", "dependencies": { "immediate": "~3.0.5" @@ -14693,6 +14887,7 @@ "version": "0.10.8", "resolved": "https://registry.npmjs.org/maath/-/maath-0.10.8.tgz", "integrity": "sha512-tRvbDF0Pgqz+9XUa4jjfgAQ8/aPKmQdWXilFu2tMy4GWj4NOsx99HlULO4IeREfbO3a0sA145DZYyvXPkybm0g==", + "dev": true, "license": "MIT", "peerDependencies": { "@types/three": ">=0.134.0", @@ -15113,6 +15308,7 @@ "version": "3.3.1", "resolved": "https://registry.npmjs.org/meshline/-/meshline-3.3.1.tgz", "integrity": "sha512-/TQj+JdZkeSUOl5Mk2J7eLcYTLiQm2IDzmlSvYm7ov15anEcDJ92GHqqazxTSreeNgfnYu24kiEvvv0WlbCdFQ==", + "dev": true, "license": "MIT", "peerDependencies": { "three": ">=0.137" @@ -15122,6 +15318,7 @@ "version": "0.22.0", "resolved": "https://registry.npmjs.org/meshoptimizer/-/meshoptimizer-0.22.0.tgz", "integrity": "sha512-IebiK79sqIy+E4EgOr+CAw+Ke8hAspXKzBd0JdgEmPHiAwmvEj2S4h1rfvo+o/BnfEYd/jAOg5IeeIjzlzSnDg==", + "dev": true, "license": "MIT" }, "node_modules/micromark": { @@ -15777,19 +15974,16 @@ } }, "node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "license": "ISC", "dependencies": { - "brace-expansion": "^2.0.1" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": "*" } }, "node_modules/minimist": { @@ -15831,6 +16025,16 @@ "integrity": "sha512-49Kt+HKjtbJKLtgO/LKj9Ld+6vw9BjH5d9sc40R/kVyH8GLAXgT42M2NnuPcJNuA3s9ZfZBUcwIgpmZWGEE+hA==", "license": "MIT" }, + "node_modules/mrmime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", + "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -15838,9 +16042,9 @@ "license": "MIT" }, "node_modules/multiformats": { - "version": "13.4.1", - "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-13.4.1.tgz", - "integrity": "sha512-VqO6OSvLrFVAYYjgsr8tyv62/rCQhPgsZUXLTqoFLSgdkgiUYKYeArbt1uWLlEpkjxQe+P0+sHlbPEte1Bi06Q==", + "version": "13.4.2", + "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-13.4.2.tgz", + "integrity": "sha512-eh6eHCrRi1+POZ3dA+Dq1C6jhP1GNtr9CRINMb67OKzqW9I5DUuZM/3jLPlzhgpGeiNUlEGEbkCYChXMCc/8DQ==", "license": "Apache-2.0 OR MIT" }, "node_modules/mz": { @@ -15947,12 +16151,12 @@ } }, "node_modules/next": { - "version": "16.0.8", - "resolved": "https://registry.npmjs.org/next/-/next-16.0.8.tgz", - "integrity": "sha512-LmcZzG04JuzNXi48s5P+TnJBsTGPJunViNKV/iE4uM6kstjTQsQhvsAv+xF6MJxU2Pr26tl15eVbp0jQnsv6/g==", + "version": "16.0.10", + "resolved": "https://registry.npmjs.org/next/-/next-16.0.10.tgz", + "integrity": "sha512-RtWh5PUgI+vxlV3HdR+IfWA1UUHu0+Ram/JBO4vWB54cVPentCD0e+lxyAYEsDTqGGMg7qpjhKh6dc6aW7W/sA==", "license": "MIT", "dependencies": { - "@next/env": "16.0.8", + "@next/env": "16.0.10", "@swc/helpers": "0.5.15", "caniuse-lite": "^1.0.30001579", "postcss": "8.4.31", @@ -15965,14 +16169,14 @@ "node": ">=20.9.0" }, "optionalDependencies": { - "@next/swc-darwin-arm64": "16.0.8", - "@next/swc-darwin-x64": "16.0.8", - "@next/swc-linux-arm64-gnu": "16.0.8", - "@next/swc-linux-arm64-musl": "16.0.8", - "@next/swc-linux-x64-gnu": "16.0.8", - "@next/swc-linux-x64-musl": "16.0.8", - "@next/swc-win32-arm64-msvc": "16.0.8", - "@next/swc-win32-x64-msvc": "16.0.8", + "@next/swc-darwin-arm64": "16.0.10", + "@next/swc-darwin-x64": "16.0.10", + "@next/swc-linux-arm64-gnu": "16.0.10", + "@next/swc-linux-arm64-musl": "16.0.10", + "@next/swc-linux-x64-gnu": "16.0.10", + "@next/swc-linux-x64-musl": "16.0.10", + "@next/swc-win32-arm64-msvc": "16.0.10", + "@next/swc-win32-x64-msvc": "16.0.10", "sharp": "^0.34.4" }, "peerDependencies": { @@ -16229,9 +16433,9 @@ } }, "node_modules/nostr-tools": { - "version": "2.19.2", - "resolved": "https://registry.npmjs.org/nostr-tools/-/nostr-tools-2.19.2.tgz", - "integrity": "sha512-XRMRSZp1mFgFP43krtySOs4vEbTNULmdsUnSec8Ow1S6QKFuCj56kYcAk8cXgJER4Gh5Z7Wfo0hENWINsPZrMQ==", + "version": "2.19.3", + "resolved": "https://registry.npmjs.org/nostr-tools/-/nostr-tools-2.19.3.tgz", + "integrity": "sha512-IJ1fcTYAfVVUbS8S/FtDopdPHCDh/34aHXnyppUzXDYGWlJMv2y1phomvOADZrMAQ6Z28iOIBEyGY256w1492Q==", "license": "Unlicense", "dependencies": { "@noble/ciphers": "^0.5.1", @@ -19344,6 +19548,17 @@ "integrity": "sha512-a5ERWK1kh38ExDEfoO6qUHJb32rd7aYmPHuyCu3Fta/cnICvYmgd2uhuKXvPD+PXB+gCEYYEaQdIRAjCOwAKNA==", "license": "MIT" }, + "node_modules/oauth4webapi": { + "version": "2.17.0", + "resolved": "https://registry.npmjs.org/oauth4webapi/-/oauth4webapi-2.17.0.tgz", + "integrity": "sha512-lbC0Z7uzAFNFyzEYRIC+pkSVvDHJTbEW+dYlSBAlCYDe6RxUkJ26bClhk8ocBZip1wfI9uKTe0fm4Ib4RHn6uQ==", + "license": "MIT", + "optional": true, + "peer": true, + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -19547,6 +19762,16 @@ "license": "MIT", "peer": true }, + "node_modules/opener": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", + "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", + "dev": true, + "license": "(WTFPL OR MIT)", + "bin": { + "opener": "bin/opener-bin.js" + } + }, "node_modules/openid-client": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/openid-client/-/openid-client-5.7.1.tgz", @@ -20129,6 +20354,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/potpack/-/potpack-1.0.2.tgz", "integrity": "sha512-choctRBIV9EMT9WGAZHn3V7t0Z2pMQyl0EZE6pFc/6ml3ssw7Dlf/oAOvFwjm1HVsqfQN8GfeFyJ+d8tRzqueQ==", + "dev": true, "license": "ISC" }, "node_modules/preact": { @@ -20327,15 +20553,15 @@ } }, "node_modules/prisma": { - "version": "6.19.0", - "resolved": "https://registry.npmjs.org/prisma/-/prisma-6.19.0.tgz", - "integrity": "sha512-F3eX7K+tWpkbhl3l4+VkFtrwJlLXbAM+f9jolgoUZbFcm1DgHZ4cq9AgVEgUym2au5Ad/TDLN8lg83D+M10ycw==", + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-6.19.1.tgz", + "integrity": "sha512-XRfmGzh6gtkc/Vq3LqZJcS2884dQQW3UhPo6jNRoiTW95FFQkXFg8vkYEy6og+Pyv0aY7zRQ7Wn1Cvr56XjhQQ==", "devOptional": true, "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { - "@prisma/config": "6.19.0", - "@prisma/engines": "6.19.0" + "@prisma/config": "6.19.1", + "@prisma/engines": "6.19.1" }, "bin": { "prisma": "build/index.js" @@ -20386,6 +20612,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/promise-worker-transferable/-/promise-worker-transferable-1.0.4.tgz", "integrity": "sha512-bN+0ehEnrXfxV2ZQvU2PetO0n4gqBD4ulq3MI1WOPLgr7/Mg9yRQkX5+0v1vagr74ZTsl7XtzlaYDo2EuCeYJw==", + "dev": true, "license": "Apache-2.0", "dependencies": { "is-promise": "^2.1.0", @@ -20680,6 +20907,7 @@ "version": "5.0.3", "resolved": "https://registry.npmjs.org/react-composer/-/react-composer-5.0.3.tgz", "integrity": "sha512-1uWd07EME6XZvMfapwZmc7NgCZqDemcvicRi3wMJzXsQLvZ3L7fTHVyPy1bZdnWXM4iPjYuNE+uJ41MLKeTtnA==", + "dev": true, "license": "MIT", "dependencies": { "prop-types": "^15.6.0" @@ -20838,6 +21066,7 @@ "version": "0.27.0", "resolved": "https://registry.npmjs.org/react-reconciler/-/react-reconciler-0.27.0.tgz", "integrity": "sha512-HmMDKciQjYmBRGuuhIaKA1ba/7a+UsM5FzOZsMO2JYHt9Jh8reCb7j1eDC95NOyUlKM9KRyvdx0flBuDvYSBoA==", + "dev": true, "license": "MIT", "dependencies": { "loose-envify": "^1.1.0", @@ -20997,6 +21226,7 @@ "version": "2.1.7", "resolved": "https://registry.npmjs.org/react-use-measure/-/react-use-measure-2.1.7.tgz", "integrity": "sha512-KrvcAo13I/60HpwGO5jpW7E9DfusKyLPLvuHlUyP5zqnmAPhNc6qTRjUQrdTADl0lpPpDVU2/Gg51UlOGHXbdg==", + "dev": true, "license": "MIT", "peerDependencies": { "react": ">=16.13", @@ -21312,6 +21542,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -21603,6 +21834,7 @@ "version": "0.21.0", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.21.0.tgz", "integrity": "sha512-1r87x5fz9MXqswA2ERLo0EbOAU74DpIUO090gIasYTqlVoJeMcl+Z1Rg7WHz+qtPujhS/hGIt9kxZOYBV3faRQ==", + "dev": true, "license": "MIT", "dependencies": { "loose-envify": "^1.1.0" @@ -21952,6 +22184,21 @@ "integrity": "sha512-PEo2qWpUke7IMhlqiBxrulIFvhJRLkl1ih52Rwa+bPjzhJepcd4GIjn2RiQmFSx3dQvsEAgF0/lXMwMN7vODaA==", "license": "MIT" }, + "node_modules/sirv": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.4.tgz", + "integrity": "sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@polka/url": "^1.0.0-next.24", + "mrmime": "^2.0.0", + "totalist": "^3.0.0" + }, + "engines": { + "node": ">= 10" + } + }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -22097,6 +22344,7 @@ "version": "2.4.2", "resolved": "https://registry.npmjs.org/stats-gl/-/stats-gl-2.4.2.tgz", "integrity": "sha512-g5O9B0hm9CvnM36+v7SFl39T7hmAlv541tU81ME8YeSb3i1CIP5/QdDeSB3A0la0bKNHpxpwxOVRo2wFTYEosQ==", + "dev": true, "license": "MIT", "dependencies": { "@types/three": "*", @@ -22111,12 +22359,14 @@ "version": "0.170.0", "resolved": "https://registry.npmjs.org/three/-/three-0.170.0.tgz", "integrity": "sha512-FQK+LEpYc0fBD+J8g6oSEyyNzjp+Q7Ks1C568WWaoMRLW+TkNNWmenWeGgJjV105Gd+p/2ql1ZcjYvNiPZBhuQ==", + "dev": true, "license": "MIT" }, "node_modules/stats.js": { "version": "0.17.0", "resolved": "https://registry.npmjs.org/stats.js/-/stats.js-0.17.0.tgz", "integrity": "sha512-hNKz8phvYLPEcRkeG1rsGmV5ChMjKDAWU7/OJJdDErPBNChQXxCo3WZurGpnWc6gZhAzEPFad1aVgyOANH1sMw==", + "dev": true, "license": "MIT" }, "node_modules/stop-iteration-iterator": { @@ -22579,6 +22829,7 @@ "version": "0.1.3", "resolved": "https://registry.npmjs.org/suspend-react/-/suspend-react-0.1.3.tgz", "integrity": "sha512-aqldKgX9aZqpoDp3e8/BZ8Dm7x1pJl+qI3ZKxDN0i/IQTWUwBx/ManmlVJ3wowqbno6c2bmiIfs+Um6LbsjJyQ==", + "dev": true, "license": "MIT", "peerDependencies": { "react": ">=17.0" @@ -22655,9 +22906,9 @@ } }, "node_modules/swagger-ui-react": { - "version": "5.30.3", - "resolved": "https://registry.npmjs.org/swagger-ui-react/-/swagger-ui-react-5.30.3.tgz", - "integrity": "sha512-QIy32nPql6yiV2NVwbww1P7f6HEOAuYrnk8VEJkzPC/p6Xc5Xnz9hhmSHzXTuM70fDbVw/qPzCJ0mZMMultpiw==", + "version": "5.31.0", + "resolved": "https://registry.npmjs.org/swagger-ui-react/-/swagger-ui-react-5.31.0.tgz", + "integrity": "sha512-E/sTgKADThzpVksaGXbhED0pQCYdajiBNOzvSAan+RhV7pdoi2qvdwWhZsIo8nRvHk9UXJ0nkuxrud854ICr7A==", "license": "Apache-2.0", "dependencies": { "@babel/runtime-corejs3": "^7.27.1", @@ -22727,9 +22978,9 @@ } }, "node_modules/tailwindcss": { - "version": "3.4.18", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.18.tgz", - "integrity": "sha512-6A2rnmW5xZMdw11LYjhcI5846rt9pbLSabY5XPxo+XWdxwZaFEn47Go4NzFiHu9sNNmr/kXivP1vStfvMaK1GQ==", + "version": "3.4.19", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.19.tgz", + "integrity": "sha512-3ofp+LL8E+pK/JuPLPggVAIaEuhvIz4qNcf3nA1Xn2o/7fb7s/TYpHhwGDv1ZU3PkBluUVaF8PyCHcm48cKLWQ==", "license": "MIT", "dependencies": { "@alloc/quick-lru": "^5.2.0", @@ -22912,6 +23163,7 @@ "version": "2.8.2", "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz", "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==", + "license": "ISC", "optional": true, "peer": true, "bin": { @@ -22990,30 +23242,6 @@ "node": ">=8" } }, - "node_modules/test-exclude/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/test-exclude/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, "node_modules/text-decoder": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.3.tgz", @@ -23137,6 +23365,7 @@ "version": "0.9.3", "resolved": "https://registry.npmjs.org/three-mesh-bvh/-/three-mesh-bvh-0.9.3.tgz", "integrity": "sha512-LaxfvQpF+At96fS90GnQxHpff9bu78UL5eooJNxYyBbyiWrOBpjRx+5yn/+Dj2lQVhz5A/jHqwpVchYYnz/hWQ==", + "dev": true, "license": "MIT", "peerDependencies": { "three": ">= 0.159.0" @@ -23163,6 +23392,7 @@ "version": "2.36.1", "resolved": "https://registry.npmjs.org/three-stdlib/-/three-stdlib-2.36.1.tgz", "integrity": "sha512-XyGQrFmNQ5O/IoKm556ftwKsBg11TIb301MB5dWNicziQBEs2g3gtOYIf7pFiLa0zI2gUwhtCjv9fmjnxKZ1Cg==", + "dev": true, "license": "MIT", "dependencies": { "@types/draco3d": "^1.4.0", @@ -23180,6 +23410,7 @@ "version": "0.6.10", "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.6.10.tgz", "integrity": "sha512-IQrh3lEPM93wVCEczc9SaAOvkmcoQn/G8Bo1e8ZPlY3X3bnAxWaBdvTdvM1hP62iZp0BXWDy4vTAy4fF0+Dlpg==", + "dev": true, "license": "MIT" }, "node_modules/through": { @@ -23375,6 +23606,16 @@ "node": ">=12.20.0" } }, + "node_modules/totalist": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", + "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", @@ -23427,6 +23668,7 @@ "version": "0.52.4", "resolved": "https://registry.npmjs.org/troika-three-text/-/troika-three-text-0.52.4.tgz", "integrity": "sha512-V50EwcYGruV5rUZ9F4aNsrytGdKcXKALjEtQXIOBfhVoZU9VAqZNIoGQ3TMiooVqFAbR1w15T+f+8gkzoFzawg==", + "dev": true, "license": "MIT", "dependencies": { "bidi-js": "^1.0.2", @@ -23442,6 +23684,7 @@ "version": "0.52.4", "resolved": "https://registry.npmjs.org/troika-three-utils/-/troika-three-utils-0.52.4.tgz", "integrity": "sha512-NORAStSVa/BDiG52Mfudk4j1FG4jC4ILutB3foPnfGbOeIs9+G5vZLa0pnmnaftZUGm4UwSoqEpWdqvC7zms3A==", + "dev": true, "license": "MIT", "peerDependencies": { "three": ">=0.125.0" @@ -23451,6 +23694,7 @@ "version": "0.52.0", "resolved": "https://registry.npmjs.org/troika-worker-utils/-/troika-worker-utils-0.52.0.tgz", "integrity": "sha512-W1CpvTHykaPH5brv5VHLfQo9D1OYuo0cSBEUQFFT/nBUzM8iD6Lq2/tgG/f1OelbAS1WtaTPQzE5uM49egnngw==", + "dev": true, "license": "MIT" }, "node_modules/trough": { @@ -23646,6 +23890,7 @@ "version": "0.1.2", "resolved": "https://registry.npmjs.org/tunnel-rat/-/tunnel-rat-0.1.2.tgz", "integrity": "sha512-lR5VHmkPhzdhrM092lI2nACsLO4QubF0/yoOhzX7c+wIpbN1GjHNzCc91QlpxBi+cnx8vVJ+Ur6vL5cEoQPFpQ==", + "dev": true, "license": "MIT", "dependencies": { "zustand": "^4.3.2" @@ -24224,6 +24469,21 @@ "node": ">=12.20.0" } }, + "node_modules/utf-8-validate": { + "version": "5.0.10", + "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.10.tgz", + "integrity": "sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "node-gyp-build": "^4.3.0" + }, + "engines": { + "node": ">=6.14.2" + } + }, "node_modules/util": { "version": "0.12.5", "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", @@ -24247,6 +24507,7 @@ "version": "3.11.0", "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.11.0.tgz", "integrity": "sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw==", + "dev": true, "license": "MIT", "engines": { "node": ">= 4" @@ -24478,12 +24739,14 @@ "node_modules/webgl-constants": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/webgl-constants/-/webgl-constants-1.1.1.tgz", - "integrity": "sha512-LkBXKjU5r9vAW7Gcu3T5u+5cvSvh5WwINdr0C+9jpzVB41cjQAP5ePArDtk/WHYdVj0GefCgM73BA7FlIiNtdg==" + "integrity": "sha512-LkBXKjU5r9vAW7Gcu3T5u+5cvSvh5WwINdr0C+9jpzVB41cjQAP5ePArDtk/WHYdVj0GefCgM73BA7FlIiNtdg==", + "dev": true }, "node_modules/webgl-sdf-generator": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/webgl-sdf-generator/-/webgl-sdf-generator-1.1.1.tgz", "integrity": "sha512-9Z0JcMTFxeE+b2x1LJTdnaT8rT8aEp7MVxkNwoycNmJWwPdzoXzMh0BjJSh/AEFP+KPYZUli814h8bJZFIZ2jA==", + "dev": true, "license": "MIT" }, "node_modules/webidl-conversions": { @@ -24492,6 +24755,44 @@ "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", "license": "BSD-2-Clause" }, + "node_modules/webpack-bundle-analyzer": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.10.1.tgz", + "integrity": "sha512-s3P7pgexgT/HTUSYgxJyn28A+99mmLq4HsJepMPzu0R8ImJc52QNqaFYW1Z2z2uIb1/J3eYgaAWVpaC+v/1aAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@discoveryjs/json-ext": "0.5.7", + "acorn": "^8.0.4", + "acorn-walk": "^8.0.0", + "commander": "^7.2.0", + "debounce": "^1.2.1", + "escape-string-regexp": "^4.0.0", + "gzip-size": "^6.0.0", + "html-escaper": "^2.0.2", + "is-plain-object": "^5.0.0", + "opener": "^1.5.2", + "picocolors": "^1.0.0", + "sirv": "^2.0.3", + "ws": "^7.3.1" + }, + "bin": { + "webpack-bundle-analyzer": "lib/bin/analyzer.js" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, "node_modules/webrtc-polyfill": { "version": "1.1.10", "resolved": "https://registry.npmjs.org/webrtc-polyfill/-/webrtc-polyfill-1.1.10.tgz", diff --git a/package.json b/package.json index b87a4c10..de6a082a 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,8 @@ "test": "jest", "test:watch": "jest --watch", "test:coverage": "jest --coverage", - "test:ci": "jest --ci --coverage --watchAll=false" + "test:ci": "jest --ci --coverage --watchAll=false", + "analyze": "ANALYZE=true npm run build" }, "dependencies": { "@auth/prisma-adapter": "^2.11.1", @@ -66,7 +67,7 @@ "jsonld": "^8.3.3", "jsonwebtoken": "^9.0.2", "lucide-react": "^0.439.0", - "next": "^16.0.8", + "next": "^16.0.7", "next-auth": "^4.24.7", "papaparse": "^5.5.3", "react": "^18.3.1", @@ -91,6 +92,7 @@ "@eslint/compat": "^2.0.0", "@eslint/eslintrc": "^3.3.3", "@jest/globals": "^30.1.2", + "@next/bundle-analyzer": "^16.0.10", "@types/busboy": "^1.5.4", "@types/cors": "^2.8.18", "@types/eslint": "^8.56.10", @@ -100,14 +102,16 @@ "@types/jsonwebtoken": "^9.0.9", "@types/node": "^20.14.10", "@types/papaparse": "^5.3.16", - "@types/react": "^18.3.3", - "@types/react-dom": "^18.3.0", + "@types/react": "^19.2.1", + "@types/react-dom": "^19.2.1", "@types/swagger-jsdoc": "^6.0.4", "@types/swagger-ui-react": "^5.18.0", "@typescript-eslint/eslint-plugin": "^8.1.0", "@typescript-eslint/parser": "^8.1.0", + "@react-three/fiber": "^8.17.7", + "@react-three/drei": "^9.122.0", "eslint": "^9.39.1", - "eslint-config-next": "^16.0.8", + "eslint-config-next": "^16.0.7", "jest": "^30.1.3", "postcss": "^8.4.39", "prettier": "^3.3.2", diff --git a/prisma/migrations/20251215090000_enable_rls_disable_postgrest/migration.sql b/prisma/migrations/20251215090000_enable_rls_disable_postgrest/migration.sql new file mode 100644 index 00000000..42b506ea --- /dev/null +++ b/prisma/migrations/20251215090000_enable_rls_disable_postgrest/migration.sql @@ -0,0 +1,222 @@ +-- Enable Row Level Security (RLS) and deny-all policies for PostgREST roles +-- This migration is designed for Supabase: +-- - Blocks access for `anon` and `authenticated` roles (used by PostgREST) +-- - Allows Prisma (using the service role) to continue bypassing RLS + +-- Helper comment: +-- Pattern applied for each table: +-- ALTER TABLE "TableName" ENABLE ROW LEVEL SECURITY; +-- CREATE POLICY "deny_all_anon_TableName" ON "TableName" +-- FOR ALL TO anon USING (false) WITH CHECK (false); +-- CREATE POLICY "deny_all_authenticated_TableName" ON "TableName" +-- FOR ALL TO authenticated USING (false) WITH CHECK (false); + +-- ========================= +-- User +-- ========================= +ALTER TABLE "User" ENABLE ROW LEVEL SECURITY; + +CREATE POLICY "deny_all_anon_User" ON "User" + FOR ALL + TO anon + USING (false) + WITH CHECK (false); + +CREATE POLICY "deny_all_authenticated_User" ON "User" + FOR ALL + TO authenticated + USING (false) + WITH CHECK (false); + +-- ========================= +-- Wallet +-- ========================= +ALTER TABLE "Wallet" ENABLE ROW LEVEL SECURITY; + +CREATE POLICY "deny_all_anon_Wallet" ON "Wallet" + FOR ALL + TO anon + USING (false) + WITH CHECK (false); + +CREATE POLICY "deny_all_authenticated_Wallet" ON "Wallet" + FOR ALL + TO authenticated + USING (false) + WITH CHECK (false); + +-- ========================= +-- Transaction +-- ========================= +ALTER TABLE "Transaction" ENABLE ROW LEVEL SECURITY; + +CREATE POLICY "deny_all_anon_Transaction" ON "Transaction" + FOR ALL + TO anon + USING (false) + WITH CHECK (false); + +CREATE POLICY "deny_all_authenticated_Transaction" ON "Transaction" + FOR ALL + TO authenticated + USING (false) + WITH CHECK (false); + +-- ========================= +-- Signable +-- ========================= +ALTER TABLE "Signable" ENABLE ROW LEVEL SECURITY; + +CREATE POLICY "deny_all_anon_Signable" ON "Signable" + FOR ALL + TO anon + USING (false) + WITH CHECK (false); + +CREATE POLICY "deny_all_authenticated_Signable" ON "Signable" + FOR ALL + TO authenticated + USING (false) + WITH CHECK (false); + +-- ========================= +-- NewWallet +-- ========================= +ALTER TABLE "NewWallet" ENABLE ROW LEVEL SECURITY; + +CREATE POLICY "deny_all_anon_NewWallet" ON "NewWallet" + FOR ALL + TO anon + USING (false) + WITH CHECK (false); + +CREATE POLICY "deny_all_authenticated_NewWallet" ON "NewWallet" + FOR ALL + TO authenticated + USING (false) + WITH CHECK (false); + +-- ========================= +-- Nonce +-- ========================= +ALTER TABLE "Nonce" ENABLE ROW LEVEL SECURITY; + +CREATE POLICY "deny_all_anon_Nonce" ON "Nonce" + FOR ALL + TO anon + USING (false) + WITH CHECK (false); + +CREATE POLICY "deny_all_authenticated_Nonce" ON "Nonce" + FOR ALL + TO authenticated + USING (false) + WITH CHECK (false); + +-- ========================= +-- Ballot +-- ========================= +ALTER TABLE "Ballot" ENABLE ROW LEVEL SECURITY; + +CREATE POLICY "deny_all_anon_Ballot" ON "Ballot" + FOR ALL + TO anon + USING (false) + WITH CHECK (false); + +CREATE POLICY "deny_all_authenticated_Ballot" ON "Ballot" + FOR ALL + TO authenticated + USING (false) + WITH CHECK (false); + +-- ========================= +-- Proxy +-- ========================= +ALTER TABLE "Proxy" ENABLE ROW LEVEL SECURITY; + +CREATE POLICY "deny_all_anon_Proxy" ON "Proxy" + FOR ALL + TO anon + USING (false) + WITH CHECK (false); + +CREATE POLICY "deny_all_authenticated_Proxy" ON "Proxy" + FOR ALL + TO authenticated + USING (false) + WITH CHECK (false); + +-- ========================= +-- BalanceSnapshot +-- ========================= +ALTER TABLE "BalanceSnapshot" ENABLE ROW LEVEL SECURITY; + +CREATE POLICY "deny_all_anon_BalanceSnapshot" ON "BalanceSnapshot" + FOR ALL + TO anon + USING (false) + WITH CHECK (false); + +CREATE POLICY "deny_all_authenticated_BalanceSnapshot" ON "BalanceSnapshot" + FOR ALL + TO authenticated + USING (false) + WITH CHECK (false); + +-- ========================= +-- Migration +-- ========================= +ALTER TABLE "Migration" ENABLE ROW LEVEL SECURITY; + +CREATE POLICY "deny_all_anon_Migration" ON "Migration" + FOR ALL + TO anon + USING (false) + WITH CHECK (false); + +CREATE POLICY "deny_all_authenticated_Migration" ON "Migration" + FOR ALL + TO authenticated + USING (false) + WITH CHECK (false); + +-- ========================= +-- Crowdfund +-- ========================= +-- Note: Crowdfund table exists in the database but is not defined in the current Prisma schema. +-- We still enable RLS and deny-all policies to secure its PostgREST exposure. +ALTER TABLE "Crowdfund" ENABLE ROW LEVEL SECURITY; + +CREATE POLICY "deny_all_anon_Crowdfund" ON "Crowdfund" + FOR ALL + TO anon + USING (false) + WITH CHECK (false); + +CREATE POLICY "deny_all_authenticated_Crowdfund" ON "Crowdfund" + FOR ALL + TO authenticated + USING (false) + WITH CHECK (false); + +-- ========================= +-- _prisma_migrations (optional system table) +-- ========================= +-- While Prisma typically manages this table without RLS, enabling RLS here +-- and denying anon/authenticated helps ensure it is not exposed via PostgREST. +ALTER TABLE "_prisma_migrations" ENABLE ROW LEVEL SECURITY; + +CREATE POLICY "deny_all_anon__prisma_migrations" ON "_prisma_migrations" + FOR ALL + TO anon + USING (false) + WITH CHECK (false); + +CREATE POLICY "deny_all_authenticated__prisma_migrations" ON "_prisma_migrations" + FOR ALL + TO authenticated + USING (false) + WITH CHECK (false); + + diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 827fd056..68b8a591 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -3,8 +3,8 @@ generator client { } datasource db { - provider = "postgresql" - url = env("DATABASE_URL") + provider = "postgresql" + url = env("DATABASE_URL") // For Supabase + Vercel serverless optimization: // - DATABASE_URL: Use Supabase's connection pooling URL (Transaction mode) // Example: postgresql://user:pass@host:6543/db?pgbouncer=true @@ -55,6 +55,10 @@ model Transaction { txHash String? createdAt DateTime @default(now()) updatedAt DateTime @updatedAt + + @@index([walletId]) + @@index([state]) + @@index([walletId, state]) } model Signable { @@ -122,6 +126,11 @@ model Proxy { createdAt DateTime @default(now()) updatedAt DateTime @updatedAt userId String? + + @@index([walletId]) + @@index([userId]) + @@index([walletId, isActive]) + @@index([userId, isActive]) } model BalanceSnapshot { diff --git a/src/__tests__/apiSecurity.test.ts b/src/__tests__/apiSecurity.test.ts new file mode 100644 index 00000000..667c6959 --- /dev/null +++ b/src/__tests__/apiSecurity.test.ts @@ -0,0 +1,142 @@ +import { TRPCError } from "@trpc/server"; + +import { applyRateLimit, enforceBodySize } from "@/lib/security/requestGuards"; +import { createCaller } from "@/server/api/root"; + +const mockRes = () => { + const res: any = { statusCode: 200, body: null }; + res.status = (code: number) => { + res.statusCode = code; + return res; + }; + res.json = (val: unknown) => { + res.body = val; + return res; + }; + return res; +}; + +const buildReq = (ip: string, body: unknown = {}) => + ({ + headers: { "x-real-ip": ip }, + socket: { remoteAddress: ip }, + body, + } as any); + +describe("request guards", () => { + it("enforces rate limit and returns 429 when exceeded", () => { + const req = buildReq("1.1.1.1"); + const res = mockRes(); + + expect(applyRateLimit(req, res, { maxRequests: 2, windowMs: 10, keySuffix: "test" })).toBe( + true, + ); + expect(applyRateLimit(req, res, { maxRequests: 2, windowMs: 10, keySuffix: "test" })).toBe( + true, + ); + expect(applyRateLimit(req, res, { maxRequests: 2, windowMs: 10, keySuffix: "test" })).toBe( + false, + ); + expect(res.statusCode).toBe(429); + }); + + it("rejects oversized bodies with 413", () => { + const large = "x".repeat(5 * 1024 * 1024); + const res = mockRes(); + const req = buildReq("2.2.2.2", { large }); + expect(enforceBodySize(req, res, 1024)).toBe(false); + expect(res.statusCode).toBe(413); + }); +}); + +describe("wallet router authorization", () => { + const baseDb = { + wallet: { findUnique: jest.fn() }, + user: { findUnique: jest.fn() }, + newWallet: { findUnique: jest.fn() }, + proxy: { findMany: jest.fn(), findUnique: jest.fn() }, + migration: { findUnique: jest.fn(), findMany: jest.fn() }, + }; + + beforeEach(() => { + jest.clearAllMocks(); + }); + + it("throws UNAUTHORIZED when session is missing", async () => { + const caller = createCaller({ + db: baseDb as any, + session: null, + sessionAddress: null, + ip: "3.3.3.3", + }); + + await expect( + caller.wallet.getWallet({ walletId: "w1", address: "addr1" }), + ).rejects.toBeInstanceOf(TRPCError); + }); + + it("throws FORBIDDEN when caller is not a signer", async () => { + baseDb.wallet.findUnique.mockResolvedValueOnce({ + id: "w1", + signersAddresses: ["other"], + ownerAddress: "other", + description: "", + name: "", + signersDescriptions: [], + signersStakeKeys: [], + signersDRepKeys: [], + numRequiredSigners: 1, + scriptCbor: "", + type: "atLeast", + stakeCredentialHash: null, + rawImportBodies: null, + isArchived: false, + verified: [], + migrationTargetWalletId: null, + }); + + const caller = createCaller({ + db: baseDb as any, + session: { user: { id: "addr1" }, expires: new Date().toISOString() } as any, + sessionAddress: "addr1", + ip: "4.4.4.4", + }); + + await expect( + caller.wallet.getWallet({ walletId: "w1", address: "addr1" }), + ).rejects.toBeInstanceOf(TRPCError); + }); + + it("returns wallet when caller is a signer", async () => { + const wallet = { + id: "w1", + signersAddresses: ["addr1"], + ownerAddress: "addr1", + description: "", + name: "Wallet", + signersDescriptions: [], + signersStakeKeys: [], + signersDRepKeys: [], + numRequiredSigners: 1, + scriptCbor: "", + type: "atLeast", + stakeCredentialHash: null, + rawImportBodies: null, + isArchived: false, + verified: [], + migrationTargetWalletId: null, + }; + baseDb.wallet.findUnique.mockResolvedValueOnce(wallet); + + const caller = createCaller({ + db: baseDb as any, + session: { user: { id: "addr1" }, expires: new Date().toISOString() } as any, + sessionAddress: "addr1", + ip: "5.5.5.5", + }); + + const result = await caller.wallet.getWallet({ walletId: "w1", address: "addr1" }); + expect(result).toEqual(wallet); + }); +}); + diff --git a/src/components/common/MeshProviderClient.tsx b/src/components/common/MeshProviderClient.tsx new file mode 100644 index 00000000..1d8cd2a0 --- /dev/null +++ b/src/components/common/MeshProviderClient.tsx @@ -0,0 +1,8 @@ + "use client"; + +import "@meshsdk/react/styles.css"; +import { MeshProvider } from "@meshsdk/react"; + +export default MeshProvider; + + diff --git a/src/components/common/cardano-objects/connect-wallet.tsx b/src/components/common/cardano-objects/connect-wallet.tsx index c3186125..3dc49ee5 100644 --- a/src/components/common/cardano-objects/connect-wallet.tsx +++ b/src/components/common/cardano-objects/connect-wallet.tsx @@ -320,31 +320,31 @@ function ConnectWalletContent({ if (isConnecting) { return ( <> - - Connecting... + + Connecting... ); } if (isConnected && isLoading) { return ( <> - - Loading... + + Loading... ); } if (isConnected && user && !userLoading) { return ( <> - - {connectedWalletName || "Connected"} + + {connectedWalletName || "Connected"} ); } return ( <> - - Connect Wallet + + Connect Wallet ); }; @@ -355,7 +355,8 @@ function ConnectWalletContent({ + + + + + ); +} + + diff --git a/src/components/common/overall-layout/layout.tsx b/src/components/common/overall-layout/layout.tsx index b85b2fd6..40cbba9b 100644 --- a/src/components/common/overall-layout/layout.tsx +++ b/src/components/common/overall-layout/layout.tsx @@ -1,4 +1,4 @@ -import React, { useEffect, Component, ReactNode } from "react"; +import React, { useEffect, Component, ReactNode, useMemo, useCallback } from "react"; import { useRouter } from "next/router"; import Link from "next/link"; import { useNostrChat } from "@jinglescode/nostr-chat-plugin"; @@ -32,6 +32,7 @@ import { MobileNavigation } from "@/components/ui/mobile-navigation"; import { MobileActionsMenu } from "@/components/ui/mobile-actions-menu"; import { Button } from "@/components/ui/button"; import { Card, CardContent } from "@/components/ui/card"; +import { cn } from "@/lib/utils"; // Dynamically import ConnectWallet with SSR disabled to avoid production SSR issues // Using a version-based key ensures fresh mount on updates, preventing cache issues @@ -127,22 +128,82 @@ export default function RootLayout({ }, []); const { mutate: createUser } = api.user.createUser.useMutation({ + onMutate: async (variables) => { + // Cancel outgoing refetches + await ctx.user.getUserByAddress.cancel({ address: variables.address }); + + // Snapshot previous value + const previous = ctx.user.getUserByAddress.getData({ address: variables.address }); + + // Optimistically update (only if old exists, otherwise wait for server response) + if (previous) { + ctx.user.getUserByAddress.setData( + { address: variables.address }, + { + ...previous, + address: variables.address, + stakeAddress: variables.stakeAddress, + drepKeyHash: variables.drepKeyHash ?? "", + nostrKey: variables.nostrKey, + } + ); + } + + return { previous }; + }, + onError: (err, variables, context) => { + // Rollback on error + if (context?.previous) { + ctx.user.getUserByAddress.setData({ address: variables.address }, context.previous); + } + console.error("Error creating user:", err); + }, onSuccess: (_, variables) => { console.log("User created/updated successfully, invalidating user query"); - // Invalidate the user query so it refetches the newly created user + // Invalidate to ensure we have the latest data void ctx.user.getUserByAddress.invalidate({ address: variables.address }); }, - onError: (e) => { - console.error("Error creating user:", e); - }, }); const { mutate: updateUser } = api.user.updateUser.useMutation({ + onMutate: async (variables) => { + // Only do optimistic update if address is provided + if (!variables.address) { + return { previous: undefined }; + } + + // Cancel outgoing refetches + await ctx.user.getUserByAddress.cancel({ address: variables.address }); + + // Snapshot previous value + const previous = ctx.user.getUserByAddress.getData({ address: variables.address }); + + // Optimistically update + if (previous) { + ctx.user.getUserByAddress.setData( + { address: variables.address }, + { + ...previous, + ...(variables.address && { address: variables.address }), + ...(variables.stakeAddress && { stakeAddress: variables.stakeAddress }), + ...(variables.drepKeyHash && { drepKeyHash: variables.drepKeyHash }), + } + ); + } + + return { previous }; + }, + onError: (err, variables, context) => { + // Rollback on error + if (context?.previous && variables.address) { + ctx.user.getUserByAddress.setData({ address: variables.address }, context.previous); + } + console.error("Error updating user:", err); + }, onSuccess: (_, variables) => { console.log("User updated successfully, invalidating user query"); - void ctx.user.getUserByAddress.invalidate({ address: variables.address }); - }, - onError: (e) => { - console.error("Error updating user:", e); + if (variables.address) { + void ctx.user.getUserByAddress.invalidate({ address: variables.address }); + } }, }); @@ -196,12 +257,13 @@ export default function RootLayout({ initializeWallet(); }, [connected, activeWallet, user, address, createUser, generateNsec]); - const isWalletPath = router.pathname.includes("/wallets/[wallet]"); - const walletPageRoute = router.pathname.split("/wallets/[wallet]/")[1]; - const walletPageNames = walletPageRoute ? walletPageRoute.split("/") : []; - const pageIsPublic = publicRoutes.includes(router.pathname); - const isLoggedIn = !!user; - const isHomepage = router.pathname === "/"; + // Memoize computed route values + const isWalletPath = useMemo(() => router.pathname.includes("/wallets/[wallet]"), [router.pathname]); + const walletPageRoute = useMemo(() => router.pathname.split("/wallets/[wallet]/")[1], [router.pathname]); + const walletPageNames = useMemo(() => walletPageRoute ? walletPageRoute.split("/") : [], [walletPageRoute]); + const pageIsPublic = useMemo(() => publicRoutes.includes(router.pathname), [router.pathname]); + const isLoggedIn = useMemo(() => !!user, [user]); + const isHomepage = useMemo(() => router.pathname === "/", [router.pathname]); // Keep track of the last visited wallet to show wallet menu even on other pages const [lastVisitedWalletId, setLastVisitedWalletId] = React.useState(null); @@ -224,7 +286,7 @@ export default function RootLayout({ } }, [router.query.wallet, isWalletPath, appWallet, multisigWallet]); - const clearWalletContext = React.useCallback(() => { + const clearWalletContext = useCallback(() => { setLastVisitedWalletId(null); setLastVisitedWalletName(null); setLastWalletStakingEnabled(null); @@ -237,11 +299,25 @@ export default function RootLayout({ } }, [isHomepage, lastVisitedWalletId, clearWalletContext]); - const showWalletMenu = isLoggedIn && (isWalletPath || !!lastVisitedWalletId); + // Memoize computed values + const showWalletMenu = useMemo(() => isLoggedIn && (isWalletPath || !!lastVisitedWalletId), [isLoggedIn, isWalletPath, lastVisitedWalletId]); + + // Don't show background loading when wallet is connecting or just connected (button already shows spinner) + // The connect button shows a spinner when: connecting OR (connected && (!user || userLoading)) + const isConnecting = useMemo(() => String(walletState) === String(WalletState.CONNECTING), [walletState]); + const isButtonShowingSpinner = useMemo(() => isConnecting || (connected && (!user || isLoading)), [isConnecting, connected, user, isLoading]); + const shouldShowBackgroundLoading = useMemo(() => isLoading && !isButtonShowingSpinner, [isLoading, isButtonShowingSpinner]); + + // Memoize wallet ID for menu + const walletIdForMenu = useMemo(() => (router.query.wallet as string) || lastVisitedWalletId || undefined, [router.query.wallet, lastVisitedWalletId]); return (
- {isLoading && } + {shouldShowBackgroundLoading && ( +
+ +
+ )} {/* Header - full width, always on top */}
{/* Mobile menu button - hidden only on public homepage (not logged in) */} - {(isLoggedIn || !isHomepage) && ( + {(isLoggedIn || !isHomepage) && (
diff --git a/src/components/common/overall-layout/loading.tsx b/src/components/common/overall-layout/loading.tsx index 50dac21f..1803a190 100644 --- a/src/components/common/overall-layout/loading.tsx +++ b/src/components/common/overall-layout/loading.tsx @@ -2,7 +2,7 @@ export default function Loading() { return (
refreshWallet()} - > - - Refresh Wallet -
+ <> +
refreshWallet()} + > + + Refresh Wallet +
+ {userAddress && ( + setShowAuthModal(false)} + onAuthorized={() => { + void walletSessionQuery.refetch(); + void ctx.transaction.getPendingTransactions.invalidate(); + void ctx.transaction.getAllTransactions.invalidate(); + void ctx.signable.getPendingSignables.invalidate(); + void ctx.signable.getCompleteSignables.invalidate(); + void ctx.proxy.getProxiesByUserOrWallet.invalidate(); + void ctx.migration.getPendingMigrations.invalidate(); + }} + /> + )} + ); } \ No newline at end of file diff --git a/src/components/common/overall-layout/proxy-data-loader.tsx b/src/components/common/overall-layout/proxy-data-loader.tsx index 962b32c5..e9bcaf71 100644 --- a/src/components/common/overall-layout/proxy-data-loader.tsx +++ b/src/components/common/overall-layout/proxy-data-loader.tsx @@ -26,7 +26,8 @@ export default function ProxyDataLoader() { { enabled: !!appWallet?.id, refetchOnWindowFocus: false, - staleTime: 30000, // 30 seconds + staleTime: 2 * 60 * 1000, // 2 minutes (proxy data changes moderately) + gcTime: 5 * 60 * 1000, // 5 minutes (formerly cacheTime) } ); @@ -49,17 +50,44 @@ export default function ProxyDataLoader() { // eslint-disable-next-line react-hooks/exhaustive-deps }, [apiProxies, appWallet?.id]); // setProxies is stable from Zustand, no need to include - // Fetch additional data for each proxy + // Fetch additional data for each proxy in parallel useEffect(() => { if (proxies.length > 0 && appWallet?.id && appWallet?.scriptCbor) { void (async () => { - for (const proxy of proxies) { - // Only fetch if we don't have recent data (older than 5 minutes) - const isStale = !proxy.lastUpdated || (Date.now() - proxy.lastUpdated) > 5 * 60 * 1000; - if (isStale) { - try { - await fetchProxyBalance(appWallet.id, proxy.id, proxy.proxyAddress, network.toString()); - await fetchProxyDrepInfo( + // Filter proxies that need data refresh + const staleProxies = proxies.filter( + (proxy) => !proxy.lastUpdated || (Date.now() - proxy.lastUpdated) > 5 * 60 * 1000 + ); + + if (staleProxies.length === 0) return; + + // Fetch all proxy data in parallel + const fetchPromises = staleProxies.map(async (proxy) => { + try { + // Fetch balance and DRep info in parallel for each proxy + await Promise.all([ + fetchProxyBalance(appWallet.id, proxy.id, proxy.proxyAddress, network.toString()), + fetchProxyDrepInfo( + appWallet.id, + proxy.id, + proxy.proxyAddress, + proxy.authTokenId, + appWallet.scriptCbor, + network.toString(), + proxy.paramUtxo, + true, + ), + ]); + + // Check if DRep is registered after fetching DRep info + // We need to wait a bit for the state to update, then check + await new Promise((resolve) => setTimeout(resolve, 100)); + const currentProxies = useProxyStore.getState().proxies[appWallet.id] || []; + const currentProxy = currentProxies.find((p) => p.id === proxy.id); + + // Only fetch delegators if DRep is registered + if (currentProxy?.drepInfo !== null && currentProxy?.drepInfo !== undefined) { + await fetchProxyDelegatorsInfo( appWallet.id, proxy.id, proxy.proxyAddress, @@ -69,29 +97,17 @@ export default function ProxyDataLoader() { proxy.paramUtxo, true, ); - // Only fetch delegators if DRep is registered - // Check if we have drepInfo and it's not null (meaning DRep is registered) - const currentProxies = useProxyStore.getState().proxies[appWallet.id] || []; - const currentProxy = currentProxies.find(p => p.id === proxy.id); - if (currentProxy?.drepInfo !== null && currentProxy?.drepInfo !== undefined) { - await fetchProxyDelegatorsInfo( - appWallet.id, - proxy.id, - proxy.proxyAddress, - proxy.authTokenId, - appWallet.scriptCbor, - network.toString(), - proxy.paramUtxo, - true, - ); - } else { - console.log(`Skipping delegators fetch for proxy ${proxy.id} - DRep not registered`); - } - } catch (error) { - console.error(`Error fetching data for proxy ${proxy.id}:`, error); + } else { + console.log(`Skipping delegators fetch for proxy ${proxy.id} - DRep not registered`); } + } catch (error) { + console.error(`Error fetching data for proxy ${proxy.id}:`, error); + // Continue processing other proxies even if one fails } - } + }); + + // Execute all fetches in parallel + await Promise.all(fetchPromises); })(); } // eslint-disable-next-line react-hooks/exhaustive-deps diff --git a/src/components/pages/homepage/governance/drep/id/metadata.tsx b/src/components/pages/homepage/governance/drep/id/metadata.tsx index 608efae7..c22e72aa 100644 --- a/src/components/pages/homepage/governance/drep/id/metadata.tsx +++ b/src/components/pages/homepage/governance/drep/id/metadata.tsx @@ -81,7 +81,7 @@ export default function Metadata({ }); // Icon Mapping for Social Media - const iconMap: Record = { + const iconMap: Record = { "x.com": , "twitter.com": ( diff --git a/src/components/pages/homepage/index.tsx b/src/components/pages/homepage/index.tsx index 307178f2..c88d4f95 100644 --- a/src/components/pages/homepage/index.tsx +++ b/src/components/pages/homepage/index.tsx @@ -56,16 +56,19 @@ function DappCard({ title, description, url }: { title: string; description: str {shouldShowImageArea ? ( -
- + {title} setImageLoaded(true)} onError={() => setImageError(true)} + sizes="(max-width: 768px) 100vw, (max-width: 1200px) 50vw, 33vw" + unoptimized={ogImage ? ogImage.startsWith('/api/local/proxy') : false} /> {!imageLoaded && ( -
+
)}
) : ( @@ -75,7 +78,14 @@ function DappCard({ title, description, url }: { title: string; description: str ) : (
{favicon ? ( - favicon + favicon ) : (
)} @@ -87,7 +97,16 @@ function DappCard({ title, description, url }: { title: string; description: str

- {favicon && favicon} + {favicon && ( + favicon + )} {title}

{description}

diff --git a/src/components/pages/homepage/wallets/SectionExplanation.tsx b/src/components/pages/homepage/wallets/SectionExplanation.tsx index 4bb1c540..3aea8379 100644 --- a/src/components/pages/homepage/wallets/SectionExplanation.tsx +++ b/src/components/pages/homepage/wallets/SectionExplanation.tsx @@ -20,3 +20,4 @@ export default function SectionExplanation({ } + diff --git a/src/components/pages/homepage/wallets/WalletBalanceSkeleton.tsx b/src/components/pages/homepage/wallets/WalletBalanceSkeleton.tsx index 7259098f..810f071f 100644 --- a/src/components/pages/homepage/wallets/WalletBalanceSkeleton.tsx +++ b/src/components/pages/homepage/wallets/WalletBalanceSkeleton.tsx @@ -14,3 +14,4 @@ export default function WalletBalanceSkeleton() { } + diff --git a/src/components/pages/wallet/dapps/index.tsx b/src/components/pages/wallet/dapps/index.tsx index 2a003238..8264f560 100644 --- a/src/components/pages/wallet/dapps/index.tsx +++ b/src/components/pages/wallet/dapps/index.tsx @@ -3,6 +3,7 @@ import { useEffect, useState } from "react"; import { Button } from "@/components/ui/button"; import { ExternalLink, Code, Database, ArrowLeft, CheckCircle, AlertTriangle, Info } from "lucide-react"; import ProxyControl from "@/components/multisig/proxy/ProxyControl"; +import Image from "next/image"; function DappCard({ title, description, url }: { title: string; description: string; url: string }) { const [ogImage, setOgImage] = useState(null); @@ -47,18 +48,21 @@ function DappCard({ title, description, url }: { title: string; description: str
{shouldShowImageArea ? ( -
+
{/* Image: show, track load/error */} - {title} setImageLoaded(true)} onError={() => setImageError(true)} + sizes="(max-width: 768px) 100vw, (max-width: 1200px) 50vw, 33vw" + unoptimized={ogImage ? ogImage.startsWith('/api/local/proxy') : false} /> {/* Skeleton overlay while loading */} {!imageLoaded && ( -
+
)}
) : ( @@ -69,7 +73,14 @@ function DappCard({ title, description, url }: { title: string; description: str ) : (
{favicon ? ( - favicon + favicon ) : (
)} @@ -81,7 +92,16 @@ function DappCard({ title, description, url }: { title: string; description: str - {favicon && favicon} + {favicon && ( + favicon + )} {title} {description} diff --git a/src/components/pages/wallet/governance/ballot/BallotModal.tsx b/src/components/pages/wallet/governance/ballot/BallotModal.tsx index 0f4af635..b9747c52 100644 --- a/src/components/pages/wallet/governance/ballot/BallotModal.tsx +++ b/src/components/pages/wallet/governance/ballot/BallotModal.tsx @@ -42,12 +42,12 @@ export default function BallotModal({ return ( - +
-
- +
+
Manage Ballots diff --git a/src/components/pages/wallet/governance/ballot/FloatingBallotSidebar.tsx b/src/components/pages/wallet/governance/ballot/FloatingBallotSidebar.tsx index 66485be6..a8becc4a 100644 --- a/src/components/pages/wallet/governance/ballot/FloatingBallotSidebar.tsx +++ b/src/components/pages/wallet/governance/ballot/FloatingBallotSidebar.tsx @@ -96,7 +96,7 @@ export default function FloatingBallotSidebar({
Your Ballots {proposalCount > 0 && ( - + {proposalCount} )} diff --git a/src/components/pages/wallet/governance/ballot/ballot.tsx b/src/components/pages/wallet/governance/ballot/ballot.tsx index 50edfe30..d95e9fc0 100644 --- a/src/components/pages/wallet/governance/ballot/ballot.tsx +++ b/src/components/pages/wallet/governance/ballot/ballot.tsx @@ -685,14 +685,14 @@ export default function BallotCard({ return (
{/* Ballot Tabs */} -
+
{ballots.map((b) => (