From 5ed4fa8b23da242dbed2916fb9001c3b91ecb3cf Mon Sep 17 00:00:00 2001 From: Hugh Date: Tue, 25 Jun 2024 11:56:38 +0100 Subject: [PATCH 01/14] Provider rate limiting setup --- package-lock.json | 9 +++- packages/api/README.md | 4 ++ packages/cli/package.json | 11 ++-- packages/cli/src/RateLimiter.ts | 83 +++++++++++++++++++++++++++++ packages/cli/src/prosopo.config.ts | 5 ++ packages/cli/src/start.ts | 7 +++ packages/types/src/config/config.ts | 2 + packages/types/src/provider/api.ts | 42 ++++++++++++++- 8 files changed, 155 insertions(+), 8 deletions(-) create mode 100644 packages/cli/src/RateLimiter.ts diff --git a/package-lock.json b/package-lock.json index 51777cba19..0ea9786064 100644 --- a/package-lock.json +++ b/package-lock.json @@ -163,8 +163,7 @@ "electron": "25.8.4", "react": "^18.3.1", "react-dom": "^18.3.1", - "react-router-dom": "^6.22.3", - "web-vitals": "^2.1.4" + "react-router-dom": "^6.22.3" }, "devDependencies": { "@prosopo/cli": "1.0.2", @@ -21975,6 +21974,11 @@ "node": ">= 0.6" } }, + "node_modules/rate-limiter-flexible": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/rate-limiter-flexible/-/rate-limiter-flexible-5.0.3.tgz", + "integrity": "sha512-lWx2y8NBVlTOLPyqs+6y7dxfEpT6YFqKy3MzWbCy95sTTOhOuxufP2QvRyOHpfXpB9OUJPbVLybw3z3AVAS5fA==" + }, "node_modules/raw-body": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", @@ -27867,6 +27871,7 @@ "cors": "^2.8.5", "cron-parser": "^4.9.0", "dotenv": "^16.0.1", + "rate-limiter-flexible": "^5.0.3", "yargs": "^17.7.2", "zod": "^3.22.4" }, diff --git a/packages/api/README.md b/packages/api/README.md index b27e78f5b9..ab3d09e190 100644 --- a/packages/api/README.md +++ b/packages/api/README.md @@ -1,3 +1,7 @@ # api Wrapper for the provider API + +## Rate Limiting + +Rate limits are set for all paths at 1 request per second per IP (over a window of 1 minute) diff --git a/packages/cli/package.json b/packages/cli/package.json index 84f4a4a500..837e22a3d5 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -45,18 +45,19 @@ "cors": "^2.8.5", "cron-parser": "^4.9.0", "dotenv": "^16.0.1", + "rate-limiter-flexible": "^5.0.3", "yargs": "^17.7.2", "zod": "^3.22.4" }, "devDependencies": { - "es-main": "^1.2.0", - "express": "^4.18.2", - "vite": "^5.1.7", - "vitest": "^1.3.1", "@prosopo/config": "1.0.2", "@types/cors": "^2.8.14", + "es-main": "^1.2.0", + "express": "^4.18.2", "tslib": "2.6.2", - "typescript": "5.1.6" + "typescript": "5.1.6", + "vite": "^5.1.7", + "vitest": "^1.3.1" }, "author": "Prosopo", "license": "Apache-2.0", diff --git a/packages/cli/src/RateLimiter.ts b/packages/cli/src/RateLimiter.ts new file mode 100644 index 0000000000..e6012a0660 --- /dev/null +++ b/packages/cli/src/RateLimiter.ts @@ -0,0 +1,83 @@ +import { RateLimiterMemory } from 'rate-limiter-flexible' +import { Request, Response, NextFunction, Express } from 'express' +import { AdminApiPaths, ApiPaths } from '@prosopo/types' + +export const rateLimiter = (key: string, windowMs: number, max: number) => { + const limiter = new RateLimiterMemory({ + keyPrefix: key, + points: max, // Number of points + duration: windowMs / 1000, // Per duration in seconds + }) + + return (req: Request, res: Response, next: NextFunction) => { + limiter + .consume(req.ip || '') + .then(() => { + next() + }) + .catch(() => { + res.status(429).send('Too Many Requests') + }) + } +} + +export const getRateLimitConfig = () => { + return { + [ApiPaths.GetImageCaptchaChallenge]: { + windowMs: process.env.PROSOPO_GET_IMAGE_CAPTCHA_CHALLENGE_WINDOW, + limit: process.env.PROSOPO_GET_IMAGE_CAPTCHA_CHALLENGE_LIMIT, + }, + [ApiPaths.GetPowCaptchaChallenge]: { + windowMs: process.env.PROSOPO_GET_POW_CAPTCHA_CHALLENGE_WINDOW, + limit: process.env.PROSOPO_GET_POW_CAPTCHA_CHALLENGE_LIMIT, + }, + [ApiPaths.SubmitImageCaptchaSolution]: { + windowMs: process.env.PROSOPO_SUBMIT_IMAGE_CAPTCHA_SOLUTION_WINDOW, + limit: process.env.PROSOPO_SUBMIT_IMAGE_CAPTCHA_SOLUTION_LIMIT, + }, + [ApiPaths.SubmitPowCaptchaSolution]: { + windowMs: process.env.PROSOPO_SUBMIT_POW_CAPTCHA_SOLUTION_WINDOW, + limit: process.env.PROSOPO_SUBMIT_POW_CAPTCHA_SOLUTION_LIMIT, + }, + [ApiPaths.VerifyPowCaptchaSolution]: { + windowMs: process.env.PROSOPO_VERIFY_POW_CAPTCHA_SOLUTION_WINDOW, + limit: process.env.PROSOPO_VERIFY_POW_CAPTCHA_SOLUTION_LIMIT, + }, + [ApiPaths.VerifyImageCaptchaSolutionDapp]: { + windowMs: process.env.PROSOPO_VERIFY_IMAGE_CAPTCHA_SOLUTION_DAPP_WINDOW, + limit: process.env.PROSOPO_VERIFY_IMAGE_CAPTCHA_SOLUTION_DAPP_LIMIT, + }, + [ApiPaths.VerifyImageCaptchaSolutionUser]: { + windowMs: process.env.PROSOPO_VERIFY_IMAGE_CAPTCHA_SOLUTION_USER_WINDOW, + limit: process.env.PROSOPO_VERIFY_IMAGE_CAPTCHA_SOLUTION_USER_LIMIT, + }, + [ApiPaths.GetProviderStatus]: { + windowMs: process.env.PROSOPO_GET_PROVIDER_STATUS_WINDOW, + limit: process.env.PROSOPO_GET_PROVIDER_STATUS_LIMIT, + }, + [ApiPaths.GetProviderDetails]: { + windowMs: process.env.PROSOPO_GET_PROVIDER_DETAILS_WINDOW, + limit: process.env.PROSOPO_GET_PROVIDER_DETAILS_LIMIT, + }, + [ApiPaths.SubmitUserEvents]: { + windowMs: process.env.PROSOPO_SUBMIT_USER_EVENTS_WINDOW, + limit: process.env.PROSOPO_SUBMIT_USER_EVENTS_LIMIT, + }, + [AdminApiPaths.BatchCommit]: { + windowMs: process.env.PROSOPO_BATCH_COMMIT_WINDOW, + limit: process.env.PROSOPO_BATCH_COMMIT_LIMIT, + }, + [AdminApiPaths.UpdateDataset]: { + windowMs: process.env.PROSOPO_UPDATE_DATASET_WINDOW, + limit: process.env.PROSOPO_UPDATE_DATASET_LIMIT, + }, + [AdminApiPaths.ProviderDeregister]: { + windowMs: process.env.PROSOPO_PROVIDER_DEREGISTER_WINDOW, + limit: process.env.PROSOPO_PROVIDER_DEREGISTER_LIMIT, + }, + [AdminApiPaths.ProviderUpdate]: { + windowMs: process.env.PROSOPO_PROVIDER_UPDATE_WINDOW, + limit: process.env.PROSOPO_PROVIDER_UPDATE_LIMIT, + }, + } +} diff --git a/packages/cli/src/prosopo.config.ts b/packages/cli/src/prosopo.config.ts index 5b7214f532..0d6690526a 100644 --- a/packages/cli/src/prosopo.config.ts +++ b/packages/cli/src/prosopo.config.ts @@ -13,6 +13,8 @@ // limitations under the License. import { + AdminApiPaths, + ApiPaths, BatchCommitConfigSchema, DatabaseTypes, EnvironmentTypesSchema, @@ -26,6 +28,8 @@ import { } from '@prosopo/types' import { getAddress, getPassword, getSecret } from './process.env.js' import { getLogLevel } from '@prosopo/common' +import { g } from 'vitest/dist/suite-IbNSsUWN.js' +import { getRateLimitConfig } from './RateLimiter.js' function getMongoURI(): string { const protocol = process.env.PROSOPO_DATABASE_PROTOCOL || 'mongodb' @@ -83,5 +87,6 @@ export default function getConfig( devOnlyWatchEvents: process.env._DEV_ONLY_WATCH_EVENTS === 'true', mongoEventsUri: process.env.PROSOPO_MONGO_EVENTS_URI || '', mongoCaptchaUri: process.env.PROSOPO_MONGO_CAPTCHA_URI || '', + rateLimits: getRateLimitConfig(), } as ProsopoConfigInput) } diff --git a/packages/cli/src/start.ts b/packages/cli/src/start.ts index 1f54989cb9..4b7d120f57 100644 --- a/packages/cli/src/start.ts +++ b/packages/cli/src/start.ts @@ -37,6 +37,11 @@ function startApi(env: ProviderEnvironment, admin = false): Server { apiApp.use(prosopoAdminRouter(env)) } + // Rate limiting + env.config.rateLimits.forEach((rateLimit) => { + apiApp.use(rateLimit) + }) + return apiApp.listen(apiPort, () => { env.logger.info(`Prosopo app listening at http://localhost:${apiPort}`) }) @@ -60,6 +65,8 @@ export async function start(env?: ProviderEnvironment, admin?: boolean) { } await env.isReady() + console.log(env.config.rateLimits) + // Start the scheduled job if (env.pair) { storeCaptchasExternally(env.pair, env.config).catch((err) => { diff --git a/packages/types/src/config/config.ts b/packages/types/src/config/config.ts index f22c952137..94ed548b1a 100644 --- a/packages/types/src/config/config.ts +++ b/packages/types/src/config/config.ts @@ -23,6 +23,7 @@ import { union } from 'zod' import { infer as zInfer } from 'zod' import networks from '../networks/index.js' import z, { boolean } from 'zod' +import { ApiPathRateLimits, ProviderDefaultRateLimits } from '../provider/index.js' const LogLevel = zEnum(['trace', 'debug', 'info', 'warn', 'error', 'fatal', 'log']) @@ -252,6 +253,7 @@ export const ProsopoConfigSchema = ProsopoBasicConfigSchema.merge( server: ProsopoImageServerConfigSchema, mongoEventsUri: string().optional(), mongoCaptchaUri: string().optional(), + rateLimits: ApiPathRateLimits.default(ProviderDefaultRateLimits), }) ) diff --git a/packages/types/src/provider/api.ts b/packages/types/src/provider/api.ts index 2e67bbd4d1..103576aaeb 100644 --- a/packages/types/src/provider/api.ts +++ b/packages/types/src/provider/api.ts @@ -16,7 +16,7 @@ import { CaptchaSolutionSchema, CaptchaWithProof } from '../datasets/index.js' import { DEFAULT_IMAGE_MAX_VERIFIED_TIME_CACHED, DEFAULT_POW_CAPTCHA_VERIFIED_TIMEOUT } from '../config/index.js' import { Hash, Provider } from '@prosopo/captcha-contract/types-returns' import { ProcaptchaTokenSpec } from '../procaptcha/index.js' -import { array, input, number, object, output, string, infer as zInfer } from 'zod' +import { ZodTypeAny, array, input, number, object, output, string, infer as zInfer } from 'zod' export enum ApiPaths { GetImageCaptchaChallenge = '/v1/prosopo/provider/captcha/image', @@ -38,6 +38,46 @@ export enum AdminApiPaths { ProviderUpdate = '/v1/prosopo/provider/admin/update', } +export const ProviderDefaultRateLimits = { + [ApiPaths.GetImageCaptchaChallenge]: { windowMs: 60000, limit: 30 }, + [ApiPaths.GetPowCaptchaChallenge]: { windowMs: 60000, limit: 60 }, + [ApiPaths.SubmitImageCaptchaSolution]: { windowMs: 60000, limit: 60 }, + [ApiPaths.SubmitPowCaptchaSolution]: { windowMs: 60000, limit: 60 }, + [ApiPaths.VerifyPowCaptchaSolution]: { windowMs: 60000, limit: 60 }, + [ApiPaths.VerifyImageCaptchaSolutionDapp]: { windowMs: 60000, limit: 60 }, + [ApiPaths.VerifyImageCaptchaSolutionUser]: { windowMs: 60000, limit: 60 }, + [ApiPaths.GetProviderStatus]: { windowMs: 60000, limit: 60 }, + [ApiPaths.GetProviderDetails]: { windowMs: 60000, limit: 60 }, + [ApiPaths.SubmitUserEvents]: { windowMs: 60000, limit: 60 }, + [AdminApiPaths.BatchCommit]: { windowMs: 60000, limit: 5 }, + [AdminApiPaths.UpdateDataset]: { windowMs: 60000, limit: 5 }, + [AdminApiPaths.ProviderDeregister]: { windowMs: 60000, limit: 1 }, + [AdminApiPaths.ProviderUpdate]: { windowMs: 60000, limit: 5 }, +} + +const RateLimitSchema = object({ + windowMs: number().optional().default(60000), + limit: number().optional().default(60), +}) + +// Utility function to create Zod schemas with defaults +const createRateLimitSchemaWithDefaults = (paths: Record) => { + return Object.entries(paths).reduce( + (schemas, [path, defaults]) => { + schemas[path] = RateLimitSchema.default(() => ({ + windowMs: defaults.windowMs, + limit: defaults.limit, + })) + return schemas + }, + {} as Record + ) +} + +const apiRateLimitSchemas = createRateLimitSchemaWithDefaults(ProviderDefaultRateLimits) + +export const ApiPathRateLimits = object(apiRateLimitSchemas) + export interface DappUserSolutionResult { [ApiParams.captchas]: CaptchaIdAndProof[] partialFee?: string From 048beef7c99cf5f2d9ad8e53640c68b021b804d5 Mon Sep 17 00:00:00 2001 From: Hugh Date: Tue, 25 Jun 2024 12:13:47 +0100 Subject: [PATCH 02/14] Fixing defaults for api rate limits --- packages/types/src/provider/api.ts | 46 ++++++++++++++++++++++++++---- 1 file changed, 41 insertions(+), 5 deletions(-) diff --git a/packages/types/src/provider/api.ts b/packages/types/src/provider/api.ts index 103576aaeb..7c1e74b3e6 100644 --- a/packages/types/src/provider/api.ts +++ b/packages/types/src/provider/api.ts @@ -16,7 +16,20 @@ import { CaptchaSolutionSchema, CaptchaWithProof } from '../datasets/index.js' import { DEFAULT_IMAGE_MAX_VERIFIED_TIME_CACHED, DEFAULT_POW_CAPTCHA_VERIFIED_TIMEOUT } from '../config/index.js' import { Hash, Provider } from '@prosopo/captcha-contract/types-returns' import { ProcaptchaTokenSpec } from '../procaptcha/index.js' -import { ZodTypeAny, array, input, number, object, output, string, infer as zInfer } from 'zod' +import { + ZodDefault, + ZodNumber, + ZodObject, + ZodOptional, + ZodTypeAny, + array, + input, + number, + object, + output, + string, + infer as zInfer, +} from 'zod' export enum ApiPaths { GetImageCaptchaChallenge = '/v1/prosopo/provider/captcha/image', @@ -55,14 +68,38 @@ export const ProviderDefaultRateLimits = { [AdminApiPaths.ProviderUpdate]: { windowMs: 60000, limit: 5 }, } +type RateLimit = { + windowMs: number + limit: number +} + const RateLimitSchema = object({ windowMs: number().optional().default(60000), limit: number().optional().default(60), }) +type RateLimitSchemaType = ZodDefault< + ZodObject< + { + windowMs: ZodDefault> + limit: ZodDefault> + }, + 'strip', + ZodTypeAny, + { + windowMs: number + limit: number + }, + { + windowMs?: number | undefined + limit?: number | undefined + } + > +> + // Utility function to create Zod schemas with defaults -const createRateLimitSchemaWithDefaults = (paths: Record) => { - return Object.entries(paths).reduce( +const createRateLimitSchemaWithDefaults = (paths: Record) => + Object.entries(paths).reduce( (schemas, [path, defaults]) => { schemas[path] = RateLimitSchema.default(() => ({ windowMs: defaults.windowMs, @@ -70,9 +107,8 @@ const createRateLimitSchemaWithDefaults = (paths: Record + {} as Record ) -} const apiRateLimitSchemas = createRateLimitSchemaWithDefaults(ProviderDefaultRateLimits) From 6b4dd79d9290b239a376def51d31647905a77b6b Mon Sep 17 00:00:00 2001 From: Hugh Date: Tue, 25 Jun 2024 12:39:16 +0100 Subject: [PATCH 03/14] zod tidy up --- package-lock.json | 15 ++++++++ packages/cli/package.json | 1 + packages/cli/src/start.ts | 11 ++++-- packages/types/src/provider/api.ts | 57 +++++++++++------------------- 4 files changed, 45 insertions(+), 39 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0ea9786064..8f8b4b2819 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14606,6 +14606,20 @@ "node": ">= 0.10.0" } }, + "node_modules/express-rate-limit": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-7.3.1.tgz", + "integrity": "sha512-BbaryvkY4wEgDqLgD18/NSy2lDO2jTuT9Y8c1Mpx0X63Yz0sYd5zN6KPe7UvpuSVvV33T6RaE1o1IVZQjHMYgw==", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/express-rate-limit" + }, + "peerDependencies": { + "express": "4 || 5 || ^5.0.0-beta.1" + } + }, "node_modules/express/node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -27871,6 +27885,7 @@ "cors": "^2.8.5", "cron-parser": "^4.9.0", "dotenv": "^16.0.1", + "express-rate-limit": "^7.3.1", "rate-limiter-flexible": "^5.0.3", "yargs": "^17.7.2", "zod": "^3.22.4" diff --git a/packages/cli/package.json b/packages/cli/package.json index 837e22a3d5..3e51aa51fb 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -45,6 +45,7 @@ "cors": "^2.8.5", "cron-parser": "^4.9.0", "dotenv": "^16.0.1", + "express-rate-limit": "^7.3.1", "rate-limiter-flexible": "^5.0.3", "yargs": "^17.7.2", "zod": "^3.22.4" diff --git a/packages/cli/src/start.ts b/packages/cli/src/start.ts index 4b7d120f57..73c760177f 100644 --- a/packages/cli/src/start.ts +++ b/packages/cli/src/start.ts @@ -21,6 +21,8 @@ import { prosopoAdminRouter, prosopoRouter, prosopoVerifyRouter, storeCaptchasEx import cors from 'cors' import express from 'express' import getConfig from './prosopo.config.js' +import { CombinedApiPaths } from '@prosopo/types' +import rateLimit from 'express-rate-limit' function startApi(env: ProviderEnvironment, admin = false): Server { env.logger.info(`Starting Prosopo API`) @@ -38,9 +40,12 @@ function startApi(env: ProviderEnvironment, admin = false): Server { } // Rate limiting - env.config.rateLimits.forEach((rateLimit) => { - apiApp.use(rateLimit) - }) + const rateLimits = env.config.rateLimits + for (const [path, limit] of Object.entries(rateLimits)) { + const enumPath = path as CombinedApiPaths + const limiter = rateLimit(limit) + apiApp.use(enumPath, limiter) + } return apiApp.listen(apiPort, () => { env.logger.info(`Prosopo app listening at http://localhost:${apiPort}`) diff --git a/packages/types/src/provider/api.ts b/packages/types/src/provider/api.ts index 7c1e74b3e6..ec7fcdc072 100644 --- a/packages/types/src/provider/api.ts +++ b/packages/types/src/provider/api.ts @@ -51,6 +51,8 @@ export enum AdminApiPaths { ProviderUpdate = '/v1/prosopo/provider/admin/update', } +export type CombinedApiPaths = ApiPaths | AdminApiPaths + export const ProviderDefaultRateLimits = { [ApiPaths.GetImageCaptchaChallenge]: { windowMs: 60000, limit: 30 }, [ApiPaths.GetPowCaptchaChallenge]: { windowMs: 60000, limit: 60 }, @@ -73,46 +75,29 @@ type RateLimit = { limit: number } -const RateLimitSchema = object({ - windowMs: number().optional().default(60000), - limit: number().optional().default(60), -}) - -type RateLimitSchemaType = ZodDefault< - ZodObject< - { - windowMs: ZodDefault> - limit: ZodDefault> - }, - 'strip', - ZodTypeAny, - { - windowMs: number - limit: number - }, - { - windowMs?: number | undefined - limit?: number | undefined - } - > -> +type RateLimitSchemaType = ZodObject<{ + windowMs: ZodDefault> + limit: ZodDefault> +}> // Utility function to create Zod schemas with defaults -const createRateLimitSchemaWithDefaults = (paths: Record) => - Object.entries(paths).reduce( - (schemas, [path, defaults]) => { - schemas[path] = RateLimitSchema.default(() => ({ - windowMs: defaults.windowMs, - limit: defaults.limit, - })) - return schemas - }, - {} as Record +const createRateLimitSchemaWithDefaults = (paths: Record) => + object( + Object.entries(paths).reduce( + (schemas, [path, defaults]) => { + const enumPath = path as CombinedApiPaths + schemas[enumPath] = object({ + windowMs: number().optional().default(defaults.windowMs), + limit: number().optional().default(defaults.limit), + }) + + return schemas + }, + {} as Record + ) ) -const apiRateLimitSchemas = createRateLimitSchemaWithDefaults(ProviderDefaultRateLimits) - -export const ApiPathRateLimits = object(apiRateLimitSchemas) +export const ApiPathRateLimits = createRateLimitSchemaWithDefaults(ProviderDefaultRateLimits) export interface DappUserSolutionResult { [ApiParams.captchas]: CaptchaIdAndProof[] From fa429f8f739f3a6bd3bc5c3b9db99d656e55781b Mon Sep 17 00:00:00 2001 From: Hugh Date: Tue, 25 Jun 2024 12:39:53 +0100 Subject: [PATCH 04/14] Removing redundant readme changes --- packages/api/README.md | 4 ---- 1 file changed, 4 deletions(-) diff --git a/packages/api/README.md b/packages/api/README.md index ab3d09e190..b27e78f5b9 100644 --- a/packages/api/README.md +++ b/packages/api/README.md @@ -1,7 +1,3 @@ # api Wrapper for the provider API - -## Rate Limiting - -Rate limits are set for all paths at 1 request per second per IP (over a window of 1 minute) From 58ff22bc879e9d31ebb6a087b85e7f8b0c4bbc43 Mon Sep 17 00:00:00 2001 From: Hugh Date: Tue, 25 Jun 2024 12:43:17 +0100 Subject: [PATCH 05/14] Removing unused code --- packages/cli/src/RateLimiter.ts | 21 --------------------- packages/cli/src/start.ts | 3 +-- 2 files changed, 1 insertion(+), 23 deletions(-) diff --git a/packages/cli/src/RateLimiter.ts b/packages/cli/src/RateLimiter.ts index e6012a0660..d07a72cefe 100644 --- a/packages/cli/src/RateLimiter.ts +++ b/packages/cli/src/RateLimiter.ts @@ -1,26 +1,5 @@ -import { RateLimiterMemory } from 'rate-limiter-flexible' -import { Request, Response, NextFunction, Express } from 'express' import { AdminApiPaths, ApiPaths } from '@prosopo/types' -export const rateLimiter = (key: string, windowMs: number, max: number) => { - const limiter = new RateLimiterMemory({ - keyPrefix: key, - points: max, // Number of points - duration: windowMs / 1000, // Per duration in seconds - }) - - return (req: Request, res: Response, next: NextFunction) => { - limiter - .consume(req.ip || '') - .then(() => { - next() - }) - .catch(() => { - res.status(429).send('Too Many Requests') - }) - } -} - export const getRateLimitConfig = () => { return { [ApiPaths.GetImageCaptchaChallenge]: { diff --git a/packages/cli/src/start.ts b/packages/cli/src/start.ts index 73c760177f..6188f03005 100644 --- a/packages/cli/src/start.ts +++ b/packages/cli/src/start.ts @@ -43,8 +43,7 @@ function startApi(env: ProviderEnvironment, admin = false): Server { const rateLimits = env.config.rateLimits for (const [path, limit] of Object.entries(rateLimits)) { const enumPath = path as CombinedApiPaths - const limiter = rateLimit(limit) - apiApp.use(enumPath, limiter) + apiApp.use(enumPath, rateLimit(limit)) } return apiApp.listen(apiPort, () => { From 39c07da6cf14d4909ee697fdfc48a5209d3b258b Mon Sep 17 00:00:00 2001 From: Hugh Date: Tue, 25 Jun 2024 12:44:22 +0100 Subject: [PATCH 06/14] Unused import --- packages/cli/src/prosopo.config.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/cli/src/prosopo.config.ts b/packages/cli/src/prosopo.config.ts index 0d6690526a..1155f7ab40 100644 --- a/packages/cli/src/prosopo.config.ts +++ b/packages/cli/src/prosopo.config.ts @@ -28,7 +28,6 @@ import { } from '@prosopo/types' import { getAddress, getPassword, getSecret } from './process.env.js' import { getLogLevel } from '@prosopo/common' -import { g } from 'vitest/dist/suite-IbNSsUWN.js' import { getRateLimitConfig } from './RateLimiter.js' function getMongoURI(): string { From 446f535a294550b57f18988c2da888f70dc4339e Mon Sep 17 00:00:00 2001 From: Hugh Date: Tue, 25 Jun 2024 12:54:34 +0100 Subject: [PATCH 07/14] Fixing linting issues --- packages/cli/src/prosopo.config.ts | 2 -- packages/cli/src/start.ts | 2 +- packages/types/src/config/config.ts | 2 +- packages/types/src/provider/api.ts | 1 - 4 files changed, 2 insertions(+), 5 deletions(-) diff --git a/packages/cli/src/prosopo.config.ts b/packages/cli/src/prosopo.config.ts index 1155f7ab40..ca39e92836 100644 --- a/packages/cli/src/prosopo.config.ts +++ b/packages/cli/src/prosopo.config.ts @@ -13,8 +13,6 @@ // limitations under the License. import { - AdminApiPaths, - ApiPaths, BatchCommitConfigSchema, DatabaseTypes, EnvironmentTypesSchema, diff --git a/packages/cli/src/start.ts b/packages/cli/src/start.ts index 6188f03005..de357a436c 100644 --- a/packages/cli/src/start.ts +++ b/packages/cli/src/start.ts @@ -11,6 +11,7 @@ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. +import { CombinedApiPaths } from '@prosopo/types' import { ProviderEnvironment } from '@prosopo/env' import { Server } from 'node:net' import { getDB, getSecret } from './process.env.js' @@ -21,7 +22,6 @@ import { prosopoAdminRouter, prosopoRouter, prosopoVerifyRouter, storeCaptchasEx import cors from 'cors' import express from 'express' import getConfig from './prosopo.config.js' -import { CombinedApiPaths } from '@prosopo/types' import rateLimit from 'express-rate-limit' function startApi(env: ProviderEnvironment, admin = false): Server { diff --git a/packages/types/src/config/config.ts b/packages/types/src/config/config.ts index 94ed548b1a..7082896485 100644 --- a/packages/types/src/config/config.ts +++ b/packages/types/src/config/config.ts @@ -12,6 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. +import { ApiPathRateLimits, ProviderDefaultRateLimits } from '../provider/index.js' import { NetworkNamesSchema, ProsopoNetworkSchema } from './network.js' import { input } from 'zod' import { literal } from 'zod' @@ -23,7 +24,6 @@ import { union } from 'zod' import { infer as zInfer } from 'zod' import networks from '../networks/index.js' import z, { boolean } from 'zod' -import { ApiPathRateLimits, ProviderDefaultRateLimits } from '../provider/index.js' const LogLevel = zEnum(['trace', 'debug', 'info', 'warn', 'error', 'fatal', 'log']) diff --git a/packages/types/src/provider/api.ts b/packages/types/src/provider/api.ts index ec7fcdc072..4a512f6392 100644 --- a/packages/types/src/provider/api.ts +++ b/packages/types/src/provider/api.ts @@ -21,7 +21,6 @@ import { ZodNumber, ZodObject, ZodOptional, - ZodTypeAny, array, input, number, From 48a7113c469a6982f73c568f765e384e87eba5e7 Mon Sep 17 00:00:00 2001 From: Hugh Date: Tue, 25 Jun 2024 13:13:42 +0100 Subject: [PATCH 08/14] Fixing circular deps --- packages/types/src/config/config.ts | 29 +++++++++------------------ packages/types/src/config/index.ts | 1 + packages/types/src/config/timeouts.ts | 18 +++++++++++++++++ 3 files changed, 29 insertions(+), 19 deletions(-) create mode 100644 packages/types/src/config/timeouts.ts diff --git a/packages/types/src/config/config.ts b/packages/types/src/config/config.ts index 7082896485..63d0cf7f0d 100644 --- a/packages/types/src/config/config.ts +++ b/packages/types/src/config/config.ts @@ -24,6 +24,16 @@ import { union } from 'zod' import { infer as zInfer } from 'zod' import networks from '../networks/index.js' import z, { boolean } from 'zod' +import { + DEFAULT_IMAGE_CAPTCHA_SOLUTION_TIMEOUT, + DEFAULT_IMAGE_CAPTCHA_TIMEOUT, + DEFAULT_IMAGE_CAPTCHA_VERIFIED_TIMEOUT, + DEFAULT_IMAGE_MAX_VERIFIED_TIME_CACHED, + DEFAULT_MAX_VERIFIED_TIME_CONTRACT, + DEFAULT_POW_CAPTCHA_CACHED_TIMEOUT, + DEFAULT_POW_CAPTCHA_SOLUTION_TIMEOUT, + DEFAULT_POW_CAPTCHA_VERIFIED_TIMEOUT, +} from './timeouts.js' const LogLevel = zEnum(['trace', 'debug', 'info', 'warn', 'error', 'fatal', 'log']) @@ -33,25 +43,6 @@ export const EnvironmentTypesSchema = zEnum(['development', 'staging', 'producti export type EnvironmentTypes = zInfer -const ONE_MINUTE = 60 * 1000 -// The timeframe in which a user must complete an image captcha (1 minute) -export const DEFAULT_IMAGE_CAPTCHA_TIMEOUT = ONE_MINUTE -// The timeframe in which an image captcha solution remains valid on the page before timing out (2 minutes) -export const DEFAULT_IMAGE_CAPTCHA_SOLUTION_TIMEOUT = DEFAULT_IMAGE_CAPTCHA_TIMEOUT * 2 -// The timeframe in which an image captcha solution must be verified within (3 minutes) -export const DEFAULT_IMAGE_CAPTCHA_VERIFIED_TIMEOUT = DEFAULT_IMAGE_CAPTCHA_TIMEOUT * 3 -// The time in milliseconds that a cached, verified, image captcha solution is valid for (15 minutes) -export const DEFAULT_IMAGE_MAX_VERIFIED_TIME_CACHED = DEFAULT_IMAGE_CAPTCHA_TIMEOUT * 15 -// The timeframe in which a pow captcha solution remains valid on the page before timing out (1 minute) -export const DEFAULT_POW_CAPTCHA_SOLUTION_TIMEOUT = ONE_MINUTE -// The timeframe in which a pow captcha must be completed and verified (2 minutes) -export const DEFAULT_POW_CAPTCHA_VERIFIED_TIMEOUT = DEFAULT_POW_CAPTCHA_SOLUTION_TIMEOUT * 2 -// The time in milliseconds that a Provider cached, verified, pow captcha solution is valid for (3 minutes) -export const DEFAULT_POW_CAPTCHA_CACHED_TIMEOUT = DEFAULT_POW_CAPTCHA_SOLUTION_TIMEOUT * 3 -// The time in milliseconds since the last correct captcha recorded in the contract (15 minutes), after which point, the -// user will be required to complete another captcha -export const DEFAULT_MAX_VERIFIED_TIME_CONTRACT = ONE_MINUTE * 15 - export const DatabaseConfigSchema = record( EnvironmentTypesSchema, object({ diff --git a/packages/types/src/config/index.ts b/packages/types/src/config/index.ts index d27e995900..71a7573d22 100644 --- a/packages/types/src/config/index.ts +++ b/packages/types/src/config/index.ts @@ -13,3 +13,4 @@ // limitations under the License. export * from './config.js' export * from './network.js' +export * from './timeouts.js' diff --git a/packages/types/src/config/timeouts.ts b/packages/types/src/config/timeouts.ts new file mode 100644 index 0000000000..4142acaf31 --- /dev/null +++ b/packages/types/src/config/timeouts.ts @@ -0,0 +1,18 @@ +const ONE_MINUTE = 60 * 1000 +// The timeframe in which a user must complete an image captcha (1 minute) +export const DEFAULT_IMAGE_CAPTCHA_TIMEOUT = ONE_MINUTE +// The timeframe in which an image captcha solution remains valid on the page before timing out (2 minutes) +export const DEFAULT_IMAGE_CAPTCHA_SOLUTION_TIMEOUT = DEFAULT_IMAGE_CAPTCHA_TIMEOUT * 2 +// The timeframe in which an image captcha solution must be verified within (3 minutes) +export const DEFAULT_IMAGE_CAPTCHA_VERIFIED_TIMEOUT = DEFAULT_IMAGE_CAPTCHA_TIMEOUT * 3 +// The time in milliseconds that a cached, verified, image captcha solution is valid for (15 minutes) +export const DEFAULT_IMAGE_MAX_VERIFIED_TIME_CACHED = DEFAULT_IMAGE_CAPTCHA_TIMEOUT * 15 +// The timeframe in which a pow captcha solution remains valid on the page before timing out (1 minute) +export const DEFAULT_POW_CAPTCHA_SOLUTION_TIMEOUT = ONE_MINUTE +// The timeframe in which a pow captcha must be completed and verified (2 minutes) +export const DEFAULT_POW_CAPTCHA_VERIFIED_TIMEOUT = DEFAULT_POW_CAPTCHA_SOLUTION_TIMEOUT * 2 +// The time in milliseconds that a Provider cached, verified, pow captcha solution is valid for (3 minutes) +export const DEFAULT_POW_CAPTCHA_CACHED_TIMEOUT = DEFAULT_POW_CAPTCHA_SOLUTION_TIMEOUT * 3 +// The time in milliseconds since the last correct captcha recorded in the contract (15 minutes), after which point, the +// user will be required to complete another captcha +export const DEFAULT_MAX_VERIFIED_TIME_CONTRACT = ONE_MINUTE * 15 From 43e91df5705ab17c7fc46940ce48ca785cce0493 Mon Sep 17 00:00:00 2001 From: Hugh Date: Tue, 25 Jun 2024 13:14:44 +0100 Subject: [PATCH 09/14] Linting command fix --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 29be1fbd57..7a318192bb 100644 --- a/package.json +++ b/package.json @@ -66,7 +66,7 @@ "lint:cmd": "f() { npm run -w @prosopo/scripts license; npm run eslint:cmd -- $@; npm run prettier:cmd -- $@; }; f", "lint:workspace": "npm run eslint:workspace && npm run prettier:workspace", "lint:contracts": "npm -w @prosopo/captcha-contract -w @prosopo/common-contract -w @prosopo/proxy-contract run lint", - "lint:fix": "FILES=$(git diff --name-status main | sed '/^[M]/!D' | awk -F ' ' '{print $2}'); echo $FILES; f() { npm run -w @prosopo/scripts license:fix; npm run eslint:fix -- $FILES; npm run prettier:fix -- $FILES; }; f", + "lint:fix": "FILES=$(git diff --name-status main | sed '/^[M|A]/!D' | awk -F ' ' '{print $2}'); echo $FILES; f() { npm run -w @prosopo/scripts license:fix; npm run eslint:fix -- $FILES; npm run prettier:fix -- $FILES; }; f", "lint:fix:contracts": "npm run -w @prosopo/scripts license:fix && npm -w @prosopo/captcha-contract -w @prosopo/common-contract -w @prosopo/proxy-contract run lint:fix", "lint:fix:workspace": "npm run eslint:fix:workspace && npm run prettier:fix:workspace", "removePolkadotJSWarnings": "sed -i 's/console.warn\\(.*\\);//g' ./node_modules/@polkadot/util/versionDetect.js && sed -i 's/console.warn\\(.*\\);//g' ./node_modules/@polkadot/util/cjs/versionDetect.js || true", From be166b6e73d99fe0f052911d85a9a97b7d5bad4c Mon Sep 17 00:00:00 2001 From: Hugh Date: Tue, 25 Jun 2024 13:18:44 +0100 Subject: [PATCH 10/14] Circular dep import resolve --- packages/types/src/provider/api.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/types/src/provider/api.ts b/packages/types/src/provider/api.ts index 4a512f6392..6aae427ded 100644 --- a/packages/types/src/provider/api.ts +++ b/packages/types/src/provider/api.ts @@ -13,7 +13,7 @@ // limitations under the License. import { ApiParams } from '../api/params.js' import { CaptchaSolutionSchema, CaptchaWithProof } from '../datasets/index.js' -import { DEFAULT_IMAGE_MAX_VERIFIED_TIME_CACHED, DEFAULT_POW_CAPTCHA_VERIFIED_TIMEOUT } from '../config/index.js' +import { DEFAULT_IMAGE_MAX_VERIFIED_TIME_CACHED, DEFAULT_POW_CAPTCHA_VERIFIED_TIMEOUT } from '../config/timeouts.js' import { Hash, Provider } from '@prosopo/captcha-contract/types-returns' import { ProcaptchaTokenSpec } from '../procaptcha/index.js' import { From 3caca488d86875e4bb3b7f33ef603d9f36d8505c Mon Sep 17 00:00:00 2001 From: Hugh Date: Tue, 25 Jun 2024 14:07:15 +0100 Subject: [PATCH 11/14] deps fixes --- package-lock.json | 846 +++++++++++++++++++++----------------- packages/cli/package.json | 2 - 2 files changed, 461 insertions(+), 387 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8f8b4b2819..1d52f02023 100644 --- a/package-lock.json +++ b/package-lock.json @@ -887,17 +887,17 @@ } }, "node_modules/@aws-sdk/client-cognito-identity": { - "version": "3.598.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.598.0.tgz", - "integrity": "sha512-N/1lnkhkzk1Il8WEZBWR713/7sDEqBtl/1AS6dfgw6Zh7NWUYSwBkZx6xdN8KogDu4CFExRHhilNOgI1JMug3w==", + "version": "3.600.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.600.0.tgz", + "integrity": "sha512-8dYsnDLiD0rjujRiZZl0E57heUkHqMSFZHBi0YMs57SM8ODPxK3tahwDYZtS7bqanvFKZwGy+o9jIcij7jBOlA==", "optional": true, "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.598.0", - "@aws-sdk/client-sts": "3.598.0", + "@aws-sdk/client-sso-oidc": "3.600.0", + "@aws-sdk/client-sts": "3.600.0", "@aws-sdk/core": "3.598.0", - "@aws-sdk/credential-provider-node": "3.598.0", + "@aws-sdk/credential-provider-node": "3.600.0", "@aws-sdk/middleware-host-header": "3.598.0", "@aws-sdk/middleware-logger": "3.598.0", "@aws-sdk/middleware-recursion-detection": "3.598.0", @@ -988,16 +988,16 @@ } }, "node_modules/@aws-sdk/client-sso-oidc": { - "version": "3.598.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.598.0.tgz", - "integrity": "sha512-jfdH1pAO9Tt8Nkta/JJLoUnwl7jaRdxToQTJfUtE+o3+0JP5sA4LfC2rBkJSWcU5BdAA+kyOs5Lv776DlN04Vg==", + "version": "3.600.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.600.0.tgz", + "integrity": "sha512-7+I8RWURGfzvChyNQSyj5/tKrqRbzRl7H+BnTOf/4Vsw1nFOi5ROhlhD4X/Y0QCTacxnaoNcIrqnY7uGGvVRzw==", "optional": true, "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sts": "3.598.0", + "@aws-sdk/client-sts": "3.600.0", "@aws-sdk/core": "3.598.0", - "@aws-sdk/credential-provider-node": "3.598.0", + "@aws-sdk/credential-provider-node": "3.600.0", "@aws-sdk/middleware-host-header": "3.598.0", "@aws-sdk/middleware-logger": "3.598.0", "@aws-sdk/middleware-recursion-detection": "3.598.0", @@ -1039,16 +1039,16 @@ } }, "node_modules/@aws-sdk/client-sts": { - "version": "3.598.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.598.0.tgz", - "integrity": "sha512-bXhz/cHL0iB9UH9IFtMaJJf4F8mV+HzncETCRFzZ9SyUMt5rP9j8A7VZknqGYSx/6mI8SsB1XJQkWSbhn6FiSQ==", + "version": "3.600.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.600.0.tgz", + "integrity": "sha512-KQG97B7LvTtTiGmjlrG1LRAY8wUvCQzrmZVV5bjrJ/1oXAU7DITYwVbSJeX9NWg6hDuSk0VE3MFwIXS2SvfLIA==", "optional": true, "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.598.0", + "@aws-sdk/client-sso-oidc": "3.600.0", "@aws-sdk/core": "3.598.0", - "@aws-sdk/credential-provider-node": "3.598.0", + "@aws-sdk/credential-provider-node": "3.600.0", "@aws-sdk/middleware-host-header": "3.598.0", "@aws-sdk/middleware-logger": "3.598.0", "@aws-sdk/middleware-recursion-detection": "3.598.0", @@ -1108,12 +1108,12 @@ } }, "node_modules/@aws-sdk/credential-provider-cognito-identity": { - "version": "3.598.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.598.0.tgz", - "integrity": "sha512-u6oocRReswkA2mFlOwtCetgmEr9B+Yhle3K13x37rb1lQgq1wUuWUvHU7U9v26hUZIhfUpigV/Mgr/RQZB6+Yw==", + "version": "3.600.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.600.0.tgz", + "integrity": "sha512-AIM+B06d1+71EuBrk2UR9ZZgRS3a+ARxE3oZKMZYlfqtZ3kY8w4DkhEt7OVruc6uSsMhkrcQT6nxsOxFSi4RtA==", "optional": true, "dependencies": { - "@aws-sdk/client-cognito-identity": "3.598.0", + "@aws-sdk/client-cognito-identity": "3.600.0", "@aws-sdk/types": "3.598.0", "@smithy/property-provider": "^3.1.1", "@smithy/types": "^3.1.0", @@ -1184,9 +1184,9 @@ } }, "node_modules/@aws-sdk/credential-provider-node": { - "version": "3.598.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.598.0.tgz", - "integrity": "sha512-sXTlqL5I/awlF9Dg2MQ17SfrEaABVnsj2mf4jF5qQrIRhfbvQOIYdEqdy8Rn1AWlJMz/N450SGzc0XJ5owxxqw==", + "version": "3.600.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.600.0.tgz", + "integrity": "sha512-1pC7MPMYD45J7yFjA90SxpR0yaSvy+yZiq23aXhAPZLYgJBAxHLu0s0mDCk/piWGPh8+UGur5K0bVdx4B1D5hw==", "optional": true, "dependencies": { "@aws-sdk/credential-provider-env": "3.598.0", @@ -1259,19 +1259,19 @@ } }, "node_modules/@aws-sdk/credential-providers": { - "version": "3.598.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.598.0.tgz", - "integrity": "sha512-IFZwH3F2rA2WbpYFUxOeu/M3/9p4+oRbKVLDZlaaDtwwuZ9VHEbnkUm20zOgSXeVExa3qgYhJvg7H5JrqxP97A==", + "version": "3.600.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.600.0.tgz", + "integrity": "sha512-cC9uqmX0rgx1efiJGqeR+i0EXr8RQ5SAzH7M45WNBZpYiLEe6reWgIYJY9hmOxuaoMdWSi8kekuN3IjTIORRjw==", "optional": true, "dependencies": { - "@aws-sdk/client-cognito-identity": "3.598.0", + "@aws-sdk/client-cognito-identity": "3.600.0", "@aws-sdk/client-sso": "3.598.0", - "@aws-sdk/client-sts": "3.598.0", - "@aws-sdk/credential-provider-cognito-identity": "3.598.0", + "@aws-sdk/client-sts": "3.600.0", + "@aws-sdk/credential-provider-cognito-identity": "3.600.0", "@aws-sdk/credential-provider-env": "3.598.0", "@aws-sdk/credential-provider-http": "3.598.0", "@aws-sdk/credential-provider-ini": "3.598.0", - "@aws-sdk/credential-provider-node": "3.598.0", + "@aws-sdk/credential-provider-node": "3.600.0", "@aws-sdk/credential-provider-process": "3.598.0", "@aws-sdk/credential-provider-sso": "3.598.0", "@aws-sdk/credential-provider-web-identity": "3.598.0", @@ -4230,26 +4230,26 @@ } }, "node_modules/@floating-ui/core": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.2.tgz", - "integrity": "sha512-+2XpQV9LLZeanU4ZevzRnGFg2neDeKHgFLjP6YLW+tly0IvrhqT4u8enLGjLH3qeh85g19xY5rsAusfwTdn5lg==", + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.3.tgz", + "integrity": "sha512-1ZpCvYf788/ZXOhRQGFxnYQOVgeU+pi0i+d0Ow34La7qjIXETi6RNswGVKkA6KcDO8/+Ysu2E/CeUmmeEBDvTg==", "dependencies": { - "@floating-ui/utils": "^0.2.0" + "@floating-ui/utils": "^0.2.3" } }, "node_modules/@floating-ui/dom": { - "version": "1.6.5", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.5.tgz", - "integrity": "sha512-Nsdud2X65Dz+1RHjAIP0t8z5e2ff/IRbei6BqFrl1urT8sDVzM1HMQ+R0XcU5ceRfyO3I6ayeqIfh+6Wb8LGTw==", + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.6.tgz", + "integrity": "sha512-qiTYajAnh3P+38kECeffMSQgbvXty2VB6rS+42iWR4FPIlZjLK84E9qtLnMTLIpPz2znD/TaFqaiavMUrS+Hcw==", "dependencies": { "@floating-ui/core": "^1.0.0", - "@floating-ui/utils": "^0.2.0" + "@floating-ui/utils": "^0.2.3" } }, "node_modules/@floating-ui/react-dom": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.0.tgz", - "integrity": "sha512-lNzj5EQmEKn5FFKc04+zasr09h/uX8RtJRNj5gUXsSQIXHVWTVh+hVAg1vOMCexkX8EgvemMvIFpQfkosnVNyA==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.1.tgz", + "integrity": "sha512-4h84MJt3CHrtG18mGsXuLCHMrug49d7DFkU0RMIyshRveBeyV2hmV/pDaF2Uxtu8kgq5r46llp5E5FQiR0K2Yg==", "dependencies": { "@floating-ui/dom": "^1.0.0" }, @@ -4259,9 +4259,9 @@ } }, "node_modules/@floating-ui/utils": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.2.tgz", - "integrity": "sha512-J4yDIIthosAsRZ5CPYP/jQvUAQtlZTTD/4suA08/FEnlxqW3sKS9iAhgsa9VYLZ6vDHn/ixJgIqRQPotoBjxIw==" + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.3.tgz", + "integrity": "sha512-XGndio0l5/Gvd6CLIABvsav9HHezgDFFhDfHk1bvLfr9ni8dojqLSvBbotJEjmIwNHL7vK4QzBJTdBRoB+c1ww==" }, "node_modules/@gar/promisify": { "version": "1.1.3", @@ -4509,9 +4509,9 @@ } }, "node_modules/@jsonjoy.com/util": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-1.1.3.tgz", - "integrity": "sha512-g//kkF4kOwUjemValCtOc/xiYzmwMRmWq3Bn+YnzOzuZLHq2PpMOxxIayN3cKbo7Ko2Np65t6D9H81IvXbXhqg==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-1.2.0.tgz", + "integrity": "sha512-4B8B+3vFsY4eo33DMKyJPlQ3sBMpPFUZK2dr3O3rXrOGKKbYG44J0XSFkDo1VOQiri5HFEhIeVvItjR2xcazmg==", "engines": { "node": ">=10.0" }, @@ -5992,9 +5992,9 @@ } }, "node_modules/@polkadot/phishing": { - "version": "0.22.8", - "resolved": "https://registry.npmjs.org/@polkadot/phishing/-/phishing-0.22.8.tgz", - "integrity": "sha512-rU6JgOJqnXeNZX5kR+haHQvJrbxlKN3rTcCZS9vvenhUZmLMeGxLLnaIa18G+hzOPNKLY/rCaODM7JwPQer7jA==", + "version": "0.22.9", + "resolved": "https://registry.npmjs.org/@polkadot/phishing/-/phishing-0.22.9.tgz", + "integrity": "sha512-WGBM4y9wC5Ot1mFLz4sqXJ5ZmnaCvfhi5b2BcLNguonbe27st+ms5pEa06JoaaJQibyqMlmhy/1aKOKUdO2Ikw==", "dependencies": { "@polkadot/util": "^12.6.2", "@polkadot/util-crypto": "^12.6.2", @@ -6670,17 +6670,17 @@ } }, "node_modules/@prosopo/typechain-polkadot-parser/node_modules/@types/node": { - "version": "18.19.36", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.36.tgz", - "integrity": "sha512-tX1BNmYSWEvViftB26VLNxT6mEr37M7+ldUtq7rlKnv4/2fKYsJIOmqJAjT6h1DNuwQjIKgw3VJ/Dtw3yiTIQw==", + "version": "18.19.39", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.39.tgz", + "integrity": "sha512-nPwTRDKUctxw3di5b4TfT3I0sWDiWoPQCZjXhvdkINntwr8lcoVCKsTgnXeRubKIlfnV+eN/HYk6Jb40tbcEAQ==", "dependencies": { "undici-types": "~5.26.4" } }, "node_modules/@prosopo/typechain-polkadot/node_modules/@types/node": { - "version": "18.19.36", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.36.tgz", - "integrity": "sha512-tX1BNmYSWEvViftB26VLNxT6mEr37M7+ldUtq7rlKnv4/2fKYsJIOmqJAjT6h1DNuwQjIKgw3VJ/Dtw3yiTIQw==", + "version": "18.19.39", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.39.tgz", + "integrity": "sha512-nPwTRDKUctxw3di5b4TfT3I0sWDiWoPQCZjXhvdkINntwr8lcoVCKsTgnXeRubKIlfnV+eN/HYk6Jb40tbcEAQ==", "dependencies": { "undici-types": "~5.26.4" } @@ -6727,9 +6727,9 @@ } }, "node_modules/@prosopo/typechain-types/node_modules/@types/node": { - "version": "18.19.36", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.36.tgz", - "integrity": "sha512-tX1BNmYSWEvViftB26VLNxT6mEr37M7+ldUtq7rlKnv4/2fKYsJIOmqJAjT6h1DNuwQjIKgw3VJ/Dtw3yiTIQw==", + "version": "18.19.39", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.39.tgz", + "integrity": "sha512-nPwTRDKUctxw3di5b4TfT3I0sWDiWoPQCZjXhvdkINntwr8lcoVCKsTgnXeRubKIlfnV+eN/HYk6Jb40tbcEAQ==", "dependencies": { "undici-types": "~5.26.4" } @@ -6759,9 +6759,9 @@ "link": true }, "node_modules/@remix-run/router": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.16.1.tgz", - "integrity": "sha512-es2g3dq6Nb07iFxGk5GuHN20RwBZOsuDQN7izWIisUcv9r+d2C5jQxqmgkdebXgReWfiyUabcki6Fg77mSNrig==", + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.17.0.tgz", + "integrity": "sha512-2D6XaHEVvkCn682XBnipbJjgZUU7xjLtA4dGJRBVUKpEaDYOZMENZoZjAOSb7qirxt5RupjzZxz4fK2FO+EFPw==", "engines": { "node": ">=14.0.0" } @@ -7312,12 +7312,12 @@ "dev": true }, "node_modules/@smithy/abort-controller": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-3.0.1.tgz", - "integrity": "sha512-Jb7jg4E+C+uvrUQi+h9kbILY6ts6fglKZzseMCHlH9ayq+1f5QdpYf8MV/xppuiN6DAMJAmwGz53GwP3213dmA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-3.1.0.tgz", + "integrity": "sha512-XOm4LkuC0PsK1sf2bBJLIlskn5ghmVxiEBVlo/jg0R8hxASBKYYgOoJEhKWgOr4vWGkN+5rC+oyBAqHYtxjnwQ==", "optional": true, "dependencies": { - "@smithy/types": "^3.1.0", + "@smithy/types": "^3.2.0", "tslib": "^2.6.2" }, "engines": { @@ -7325,15 +7325,15 @@ } }, "node_modules/@smithy/config-resolver": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-3.0.2.tgz", - "integrity": "sha512-wUyG6ezpp2sWAvfqmSYTROwFUmJqKV78GLf55WODrosBcT0BAMd9bOLO4HRhynWBgAobPml2cF9ZOdgCe00r+g==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-3.0.3.tgz", + "integrity": "sha512-4wHqCMkdfVDP4qmr4fVPYOFOH+vKhOv3X4e6KEU9wIC8xXUQ24tnF4CW+sddGDX1zU86GGyQ7A+rg2xmUD6jpQ==", "optional": true, "dependencies": { - "@smithy/node-config-provider": "^3.1.1", - "@smithy/types": "^3.1.0", + "@smithy/node-config-provider": "^3.1.2", + "@smithy/types": "^3.2.0", "@smithy/util-config-provider": "^3.0.0", - "@smithy/util-middleware": "^3.0.1", + "@smithy/util-middleware": "^3.0.2", "tslib": "^2.6.2" }, "engines": { @@ -7341,18 +7341,18 @@ } }, "node_modules/@smithy/core": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/@smithy/core/-/core-2.2.2.tgz", - "integrity": "sha512-bxZr4ZTqS6hMSQGYdcsfFQTFU0MO2xKLbkqZMSRDM+ruQ0nY00lFJUeLhXe7fqohSEd1y5wKu1Ap0bVJPzpmHg==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-2.2.3.tgz", + "integrity": "sha512-SpyLOL2vgE6sUYM6nQfu82OirCPkCDKctyG3aMgjMlDPTJpUlmlNH0ttu9ZWwzEjrzzr8uABmPjJTRI7gk1HFQ==", "optional": true, "dependencies": { - "@smithy/middleware-endpoint": "^3.0.2", - "@smithy/middleware-retry": "^3.0.5", - "@smithy/middleware-serde": "^3.0.1", - "@smithy/protocol-http": "^4.0.1", - "@smithy/smithy-client": "^3.1.3", - "@smithy/types": "^3.1.0", - "@smithy/util-middleware": "^3.0.1", + "@smithy/middleware-endpoint": "^3.0.3", + "@smithy/middleware-retry": "^3.0.6", + "@smithy/middleware-serde": "^3.0.2", + "@smithy/protocol-http": "^4.0.2", + "@smithy/smithy-client": "^3.1.4", + "@smithy/types": "^3.2.0", + "@smithy/util-middleware": "^3.0.2", "tslib": "^2.6.2" }, "engines": { @@ -7360,15 +7360,15 @@ } }, "node_modules/@smithy/credential-provider-imds": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-3.1.1.tgz", - "integrity": "sha512-htndP0LwHdE3R3Nam9ZyVWhwPYOmD4xCL79kqvNxy8u/bv0huuy574CSiRY4cvEICgimv8jlVfLeZ7zZqbnB2g==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-3.1.2.tgz", + "integrity": "sha512-gqVmUaNoeqyrOAjgZg+rTmFLsphh/vS59LCMdFfVpthVS0jbfBzvBmEPktBd+y9ME4DYMGHFAMSYJDK8q0noOQ==", "optional": true, "dependencies": { - "@smithy/node-config-provider": "^3.1.1", - "@smithy/property-provider": "^3.1.1", - "@smithy/types": "^3.1.0", - "@smithy/url-parser": "^3.0.1", + "@smithy/node-config-provider": "^3.1.2", + "@smithy/property-provider": "^3.1.2", + "@smithy/types": "^3.2.0", + "@smithy/url-parser": "^3.0.2", "tslib": "^2.6.2" }, "engines": { @@ -7376,25 +7376,25 @@ } }, "node_modules/@smithy/fetch-http-handler": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-3.0.3.tgz", - "integrity": "sha512-31x2MokxJL/u5U/BdElvVRotOGjUcOOvI2pb5TZ02umBLw+vVHImiLn+khbN0SblaFXNRzPoGrKwXylNjV3skw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-3.1.0.tgz", + "integrity": "sha512-s7oQjEOUH9TYjctpITtWF4qxOdg7pBrP9eigEQ8SBsxF3dRFV0S28pGMllC83DUr7ECmErhO/BUwnULfoNhKgQ==", "optional": true, "dependencies": { - "@smithy/protocol-http": "^4.0.1", - "@smithy/querystring-builder": "^3.0.1", - "@smithy/types": "^3.1.0", + "@smithy/protocol-http": "^4.0.2", + "@smithy/querystring-builder": "^3.0.2", + "@smithy/types": "^3.2.0", "@smithy/util-base64": "^3.0.0", "tslib": "^2.6.2" } }, "node_modules/@smithy/hash-node": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-3.0.1.tgz", - "integrity": "sha512-w2ncjgk2EYO2+WhAsSQA8owzoOSY7IL1qVytlwpnL1pFGWTjIoIh5nROkEKXY51unB63bMGZqDiVoXaFbyKDlg==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-3.0.2.tgz", + "integrity": "sha512-43uGA6o6QJQdXwAogybdTDHDd3SCdKyoiHIHb8PpdE2rKmVicjG9b1UgVwdgO8QPytmVqHFaUw27M3LZKwu8Yg==", "optional": true, "dependencies": { - "@smithy/types": "^3.1.0", + "@smithy/types": "^3.2.0", "@smithy/util-buffer-from": "^3.0.0", "@smithy/util-utf8": "^3.0.0", "tslib": "^2.6.2" @@ -7404,12 +7404,12 @@ } }, "node_modules/@smithy/invalid-dependency": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-3.0.1.tgz", - "integrity": "sha512-RSNF/32BKygXKKMyS7koyuAq1rcdW5p5c4EFa77QenBFze9As+JiRnV9OWBh2cB/ejGZalEZjvIrMLHwJl7aGA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-3.0.2.tgz", + "integrity": "sha512-+BAY3fMhomtq470tswXyrdVBSUhiLuhBVT+rOmpbz5e04YX+s1dX4NxTLzZGwBjCpeWZNtTxP8zbIvvFk81gUg==", "optional": true, "dependencies": { - "@smithy/types": "^3.1.0", + "@smithy/types": "^3.2.0", "tslib": "^2.6.2" } }, @@ -7426,13 +7426,13 @@ } }, "node_modules/@smithy/middleware-content-length": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-3.0.1.tgz", - "integrity": "sha512-6QdK/VbrCfXD5/QolE2W/ok6VqxD+SM28Ds8iSlEHXZwv4buLsvWyvoEEy0322K/g5uFgPzBmZjGqesTmPL+yQ==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-3.0.2.tgz", + "integrity": "sha512-/Havz3PkYIEmwpqkyRTR21yJsWnFbD1ec4H1pUL+TkDnE7RCQkAVUQepLL/UeCaZeCBXvfdoKbOjSbV01xIinQ==", "optional": true, "dependencies": { - "@smithy/protocol-http": "^4.0.1", - "@smithy/types": "^3.1.0", + "@smithy/protocol-http": "^4.0.2", + "@smithy/types": "^3.2.0", "tslib": "^2.6.2" }, "engines": { @@ -7440,17 +7440,17 @@ } }, "node_modules/@smithy/middleware-endpoint": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-3.0.2.tgz", - "integrity": "sha512-gWEaGYB3Bei17Oiy/F2IlUPpBazNXImytoOdJ1xbrUOaJKAOiUhx8/4FOnYLLJHdAwa9PlvJ2ULda2f/Dnwi9w==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-3.0.3.tgz", + "integrity": "sha512-ARAXHodhj4tttKa9y75zvENdSoHq6VGsSi7XS3+yLutrnxttJs6N10UMInCC1yi3/bopT8xug3iOP/y9R6sKJQ==", "optional": true, "dependencies": { - "@smithy/middleware-serde": "^3.0.1", - "@smithy/node-config-provider": "^3.1.1", - "@smithy/shared-ini-file-loader": "^3.1.1", - "@smithy/types": "^3.1.0", - "@smithy/url-parser": "^3.0.1", - "@smithy/util-middleware": "^3.0.1", + "@smithy/middleware-serde": "^3.0.2", + "@smithy/node-config-provider": "^3.1.2", + "@smithy/shared-ini-file-loader": "^3.1.2", + "@smithy/types": "^3.2.0", + "@smithy/url-parser": "^3.0.2", + "@smithy/util-middleware": "^3.0.2", "tslib": "^2.6.2" }, "engines": { @@ -7458,18 +7458,18 @@ } }, "node_modules/@smithy/middleware-retry": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-3.0.5.tgz", - "integrity": "sha512-nKAmmea9Wm0d94obPqVgjxW2zzaNemxcTzjgd17LhGKI23D66UQKI5gpoWDsnE+R4tfuZe9dCcw8gmTVEwFpRA==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-3.0.6.tgz", + "integrity": "sha512-ICsFKp8eAyIMmxN5UT3IU37S6886L879TKtgxPsn/VD/laYNwqTLmJaCAn5//+2fRIrV0dnHp6LFlMwdXlWoUQ==", "optional": true, "dependencies": { - "@smithy/node-config-provider": "^3.1.1", - "@smithy/protocol-http": "^4.0.1", - "@smithy/service-error-classification": "^3.0.1", - "@smithy/smithy-client": "^3.1.3", - "@smithy/types": "^3.1.0", - "@smithy/util-middleware": "^3.0.1", - "@smithy/util-retry": "^3.0.1", + "@smithy/node-config-provider": "^3.1.2", + "@smithy/protocol-http": "^4.0.2", + "@smithy/service-error-classification": "^3.0.2", + "@smithy/smithy-client": "^3.1.4", + "@smithy/types": "^3.2.0", + "@smithy/util-middleware": "^3.0.2", + "@smithy/util-retry": "^3.0.2", "tslib": "^2.6.2", "uuid": "^9.0.1" }, @@ -7478,12 +7478,12 @@ } }, "node_modules/@smithy/middleware-serde": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-3.0.1.tgz", - "integrity": "sha512-ak6H/ZRN05r5+SR0/IUc5zOSyh2qp3HReg1KkrnaSLXmncy9lwOjNqybX4L4x55/e5mtVDn1uf/gQ6bw5neJPw==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-3.0.2.tgz", + "integrity": "sha512-oT2abV5zLhBucJe1LIIFEcRgIBDbZpziuMPswTMbBQNcaEUycLFvX63zsFmqfwG+/ZQKsNx+BSE8W51CMuK7Yw==", "optional": true, "dependencies": { - "@smithy/types": "^3.1.0", + "@smithy/types": "^3.2.0", "tslib": "^2.6.2" }, "engines": { @@ -7491,12 +7491,12 @@ } }, "node_modules/@smithy/middleware-stack": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-3.0.1.tgz", - "integrity": "sha512-fS5uT//y1SlBdkzIvgmWQ9FufwMXrHSSbuR25ygMy1CRDIZkcBMoF4oTMYNfR9kBlVBcVzlv7joFdNrFuQirPA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-3.0.2.tgz", + "integrity": "sha512-6fRcxomlNKBPIy/YjcnC7YHpMAjRvGUYlYVJAfELqZjkW0vQegNcImjY7T1HgYA6u3pAcCxKVBLYnkTw8z/l0A==", "optional": true, "dependencies": { - "@smithy/types": "^3.1.0", + "@smithy/types": "^3.2.0", "tslib": "^2.6.2" }, "engines": { @@ -7504,14 +7504,14 @@ } }, "node_modules/@smithy/node-config-provider": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-3.1.1.tgz", - "integrity": "sha512-z5G7+ysL4yUtMghUd2zrLkecu0mTfnYlt5dR76g/HsFqf7evFazwiZP1ag2EJenGxNBDwDM5g8nm11NPogiUVA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-3.1.2.tgz", + "integrity": "sha512-388fEAa7+6ORj/BDC70peg3fyFBTTXJyXfXJ0Bwd6FYsRltePr2oGzIcm5AuC1WUSLtZ/dF+hYOnfTMs04rLvA==", "optional": true, "dependencies": { - "@smithy/property-provider": "^3.1.1", - "@smithy/shared-ini-file-loader": "^3.1.1", - "@smithy/types": "^3.1.0", + "@smithy/property-provider": "^3.1.2", + "@smithy/shared-ini-file-loader": "^3.1.2", + "@smithy/types": "^3.2.0", "tslib": "^2.6.2" }, "engines": { @@ -7519,15 +7519,15 @@ } }, "node_modules/@smithy/node-http-handler": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-3.0.1.tgz", - "integrity": "sha512-hlBI6MuREA4o1wBMEt+QNhUzoDtFFvwR6ecufimlx9D79jPybE/r8kNorphXOi91PgSO9S2fxRjcKCLk7Jw8zA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-3.1.0.tgz", + "integrity": "sha512-pOpgB6B+VLXLwAyyvRz+ZAVXABlbAsJ2xvn3WZvrppAPImxwQOPFbeSUzWYMhpC8Tr7yQ3R8fG990QDhskkf1Q==", "optional": true, "dependencies": { - "@smithy/abort-controller": "^3.0.1", - "@smithy/protocol-http": "^4.0.1", - "@smithy/querystring-builder": "^3.0.1", - "@smithy/types": "^3.1.0", + "@smithy/abort-controller": "^3.1.0", + "@smithy/protocol-http": "^4.0.2", + "@smithy/querystring-builder": "^3.0.2", + "@smithy/types": "^3.2.0", "tslib": "^2.6.2" }, "engines": { @@ -7535,12 +7535,12 @@ } }, "node_modules/@smithy/property-provider": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-3.1.1.tgz", - "integrity": "sha512-YknOMZcQkB5on+MU0DvbToCmT2YPtTETMXW0D3+/Iln7ezT+Zm1GMHhCW1dOH/X/+LkkQD9aXEoCX/B10s4Xdw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-3.1.2.tgz", + "integrity": "sha512-Hzp32BpeFFexBpO1z+ts8okbq/VLzJBadxanJAo/Wf2CmvXMBp6Q/TLWr7Js6IbMEcr0pDZ02V3u1XZkuQUJaA==", "optional": true, "dependencies": { - "@smithy/types": "^3.1.0", + "@smithy/types": "^3.2.0", "tslib": "^2.6.2" }, "engines": { @@ -7548,12 +7548,12 @@ } }, "node_modules/@smithy/protocol-http": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-4.0.1.tgz", - "integrity": "sha512-eBhm9zwcFPEazc654c0BEWtxYAzrw+OhoSf5pkwKzfftWKXRoqEhwOE2Pvn30v0iAdo7Mfsfb6pi1NnZlGCMpg==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-4.0.2.tgz", + "integrity": "sha512-X/90xNWIOqSR2tLUyWxVIBdatpm35DrL44rI/xoeBWUuanE0iyCXJpTcnqlOpnEzgcu0xCKE06+g70TTu2j7RQ==", "optional": true, "dependencies": { - "@smithy/types": "^3.1.0", + "@smithy/types": "^3.2.0", "tslib": "^2.6.2" }, "engines": { @@ -7561,12 +7561,12 @@ } }, "node_modules/@smithy/querystring-builder": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-3.0.1.tgz", - "integrity": "sha512-vKitpnG/2KOMVlx3x1S3FkBH075EROG3wcrcDaNerQNh8yuqnSL23btCD2UyX4i4lpPzNW6VFdxbn2Z25b/g5Q==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-3.0.2.tgz", + "integrity": "sha512-xhv1+HacDYsOLdNt7zW+8Fe779KYAzmWvzs9bC5NlKM8QGYCwwuFwDBynhlU4D5twgi2pZ14Lm4h6RiAazCtmA==", "optional": true, "dependencies": { - "@smithy/types": "^3.1.0", + "@smithy/types": "^3.2.0", "@smithy/util-uri-escape": "^3.0.0", "tslib": "^2.6.2" }, @@ -7575,12 +7575,12 @@ } }, "node_modules/@smithy/querystring-parser": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-3.0.1.tgz", - "integrity": "sha512-Qt8DMC05lVS8NcQx94lfVbZSX+2Ym7032b/JR8AlboAa/D669kPzqb35dkjkvAG6+NWmUchef3ENtrD6F+5n8Q==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-3.0.2.tgz", + "integrity": "sha512-C5hyRKgrZGPNh5QqIWzXnW+LXVrPmVQO0iJKjHeb5v3C61ZkP9QhrKmbfchcTyg/VnaE0tMNf/nmLpQlWuiqpg==", "optional": true, "dependencies": { - "@smithy/types": "^3.1.0", + "@smithy/types": "^3.2.0", "tslib": "^2.6.2" }, "engines": { @@ -7588,24 +7588,24 @@ } }, "node_modules/@smithy/service-error-classification": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-3.0.1.tgz", - "integrity": "sha512-ubFUvIePjDCyIzZ+pLETqNC6KXJ/fc6g+/baqel7Zf6kJI/kZKgjwkCI7zbUhoUuOZ/4eA/87YasVu40b/B4bA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-3.0.2.tgz", + "integrity": "sha512-cu0WV2XRttItsuXlcM0kq5MKdphbMMmSd2CXF122dJ75NrFE0o7rruXFGfxAp3BKzgF/DMxX+PllIA/cj4FHMw==", "optional": true, "dependencies": { - "@smithy/types": "^3.1.0" + "@smithy/types": "^3.2.0" }, "engines": { "node": ">=16.0.0" } }, "node_modules/@smithy/shared-ini-file-loader": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-3.1.1.tgz", - "integrity": "sha512-nD6tXIX2126/P9e3wqRY1bm9dTtPZwRDyjVOd18G28o+1UOG+kOVgUwujE795HslSuPlEgqzsH5sgNP1hDjj9g==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-3.1.2.tgz", + "integrity": "sha512-tgnXrXbLMO8vo6VeuqabMw/eTzQHlLmZx0TC0TjtjJghnD0Xl4pEnJtBjTJr6XF5fHMNrt5BcczDXHJT9yNQnA==", "optional": true, "dependencies": { - "@smithy/types": "^3.1.0", + "@smithy/types": "^3.2.0", "tslib": "^2.6.2" }, "engines": { @@ -7613,15 +7613,15 @@ } }, "node_modules/@smithy/signature-v4": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-3.1.0.tgz", - "integrity": "sha512-m0/6LW3IQ3/JBcdhqjpkpABPTPhcejqeAn0U877zxBdNLiWAnG2WmCe5MfkUyVuvpFTPQnQwCo/0ZBR4uF5kxg==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-3.1.1.tgz", + "integrity": "sha512-2/vlG86Sr489XX8TA/F+VDA+P04ESef04pSz0wRtlQBExcSPjqO08rvrkcas2zLnJ51i+7ukOURCkgqixBYjSQ==", "optional": true, "dependencies": { "@smithy/is-array-buffer": "^3.0.0", - "@smithy/types": "^3.1.0", + "@smithy/types": "^3.2.0", "@smithy/util-hex-encoding": "^3.0.0", - "@smithy/util-middleware": "^3.0.1", + "@smithy/util-middleware": "^3.0.2", "@smithy/util-uri-escape": "^3.0.0", "@smithy/util-utf8": "^3.0.0", "tslib": "^2.6.2" @@ -7631,16 +7631,16 @@ } }, "node_modules/@smithy/smithy-client": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-3.1.3.tgz", - "integrity": "sha512-YVz+akpR5lIIRPJfhE4sqoHYwMys6/33vsFvDof+71FCwa4jkVfMpzKv9TKrG/EDb5TV+YtjdXkwywdqlUOQXA==", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-3.1.4.tgz", + "integrity": "sha512-y6xJROGrIoitjpwXLY7P9luDHvuT9jWpAluliuSFdBymFxcl6iyQjo9U/JhYfRHFNTruqsvKOrOESVuPGEcRmQ==", "optional": true, "dependencies": { - "@smithy/middleware-endpoint": "^3.0.2", - "@smithy/middleware-stack": "^3.0.1", - "@smithy/protocol-http": "^4.0.1", - "@smithy/types": "^3.1.0", - "@smithy/util-stream": "^3.0.3", + "@smithy/middleware-endpoint": "^3.0.3", + "@smithy/middleware-stack": "^3.0.2", + "@smithy/protocol-http": "^4.0.2", + "@smithy/types": "^3.2.0", + "@smithy/util-stream": "^3.0.4", "tslib": "^2.6.2" }, "engines": { @@ -7648,9 +7648,9 @@ } }, "node_modules/@smithy/types": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.1.0.tgz", - "integrity": "sha512-qi4SeCVOUPjhSSZrxxB/mB8DrmuSFUcJnD9KXjuP+7C3LV/KFV4kpuUSH3OHDZgQB9TEH/1sO/Fq/5HyaK9MPw==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.2.0.tgz", + "integrity": "sha512-cKyeKAPazZRVqm7QPvcPD2jEIt2wqDPAL1KJKb0f/5I7uhollvsWZuZKLclmyP6a+Jwmr3OV3t+X0pZUUHS9BA==", "optional": true, "dependencies": { "tslib": "^2.6.2" @@ -7660,13 +7660,13 @@ } }, "node_modules/@smithy/url-parser": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-3.0.1.tgz", - "integrity": "sha512-G140IlNFlzYWVCedC4E2d6NycM1dCUbe5CnsGW1hmGt4hYKiGOw0v7lVru9WAn5T2w09QEjl4fOESWjGmCvVmg==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-3.0.2.tgz", + "integrity": "sha512-pRiPHrgibeAr4avtXDoBHmTLtthwA4l8jKYRfZjNgp+bBPyxDMPRg2TMJaYxqbKemvrOkHu9MIBTv2RkdNfD6w==", "optional": true, "dependencies": { - "@smithy/querystring-parser": "^3.0.1", - "@smithy/types": "^3.1.0", + "@smithy/querystring-parser": "^3.0.2", + "@smithy/types": "^3.2.0", "tslib": "^2.6.2" } }, @@ -7731,14 +7731,14 @@ } }, "node_modules/@smithy/util-defaults-mode-browser": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-3.0.5.tgz", - "integrity": "sha512-VZkJ+bXCHcNSMhX8EReGyFcc/Err94YGqeEKbbxkVz2TgKlacsoplpi+kxOMVbQq/tq9sQx5ajBKG+nl2GNuxw==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-3.0.6.tgz", + "integrity": "sha512-tAgoc++Eq+KL7g55+k108pn7nAob3GLWNEMbXhZIQyBcBNaE/o3+r4AEbae0A8bWvLRvArVsjeiuhMykGa04/A==", "optional": true, "dependencies": { - "@smithy/property-provider": "^3.1.1", - "@smithy/smithy-client": "^3.1.3", - "@smithy/types": "^3.1.0", + "@smithy/property-provider": "^3.1.2", + "@smithy/smithy-client": "^3.1.4", + "@smithy/types": "^3.2.0", "bowser": "^2.11.0", "tslib": "^2.6.2" }, @@ -7747,17 +7747,17 @@ } }, "node_modules/@smithy/util-defaults-mode-node": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-3.0.5.tgz", - "integrity": "sha512-jy19cFQA0k4f8VUDFsZVBey3rmI8EuXCw/xh/abdiq6S1qdwdfZ5coviuyYd//LPszf2yWIYkLpvmLF9qbhLGg==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-3.0.6.tgz", + "integrity": "sha512-UNerul6/E8aiCyFTBHk+RSIZCo7m96d/N5K3FeO/wFeZP6oy5HAicLzxqa85Wjv7MkXSxSySX29L/LwTV/QMag==", "optional": true, "dependencies": { - "@smithy/config-resolver": "^3.0.2", - "@smithy/credential-provider-imds": "^3.1.1", - "@smithy/node-config-provider": "^3.1.1", - "@smithy/property-provider": "^3.1.1", - "@smithy/smithy-client": "^3.1.3", - "@smithy/types": "^3.1.0", + "@smithy/config-resolver": "^3.0.3", + "@smithy/credential-provider-imds": "^3.1.2", + "@smithy/node-config-provider": "^3.1.2", + "@smithy/property-provider": "^3.1.2", + "@smithy/smithy-client": "^3.1.4", + "@smithy/types": "^3.2.0", "tslib": "^2.6.2" }, "engines": { @@ -7765,13 +7765,13 @@ } }, "node_modules/@smithy/util-endpoints": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-2.0.2.tgz", - "integrity": "sha512-4zFOcBFQvifd2LSD4a1dKvfIWWwh4sWNtS3oZ7mpob/qPPmJseqKB148iT+hWCDsG//TmI+8vjYPgZdvnkYlTg==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-2.0.3.tgz", + "integrity": "sha512-Dyi+pfLglDHSGsKSYunuUUSFM5V0tz7UDgv1Ex97yg+Xkn0Eb0rH0rcvl1n0MaJ11fac3HKDOH0DkALyQYCQag==", "optional": true, "dependencies": { - "@smithy/node-config-provider": "^3.1.1", - "@smithy/types": "^3.1.0", + "@smithy/node-config-provider": "^3.1.2", + "@smithy/types": "^3.2.0", "tslib": "^2.6.2" }, "engines": { @@ -7791,12 +7791,12 @@ } }, "node_modules/@smithy/util-middleware": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-3.0.1.tgz", - "integrity": "sha512-WRODCQtUsO7vIvfrdxS8RFPeLKcewYtaCglZsBsedIKSUGIIvMlZT5oh+pCe72I+1L+OjnZuqRNpN2LKhWA4KQ==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-3.0.2.tgz", + "integrity": "sha512-7WW5SD0XVrpfqljBYzS5rLR+EiDzl7wCVJZ9Lo6ChNFV4VYDk37Z1QI5w/LnYtU/QKnSawYoHRd7VjSyC8QRQQ==", "optional": true, "dependencies": { - "@smithy/types": "^3.1.0", + "@smithy/types": "^3.2.0", "tslib": "^2.6.2" }, "engines": { @@ -7804,13 +7804,13 @@ } }, "node_modules/@smithy/util-retry": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-3.0.1.tgz", - "integrity": "sha512-5lRtYm+8fNFEUTdqZXg5M4ppVp40rMIJfR1TpbHAhKQgPIDpWT+iYMaqgnwEbtpi9U1smyUOPv5Sg+M1neOBgw==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-3.0.2.tgz", + "integrity": "sha512-HUVOb1k8p/IH6WFUjsLa+L9H1Zi/FAAB2CDOpWuffI1b2Txi6sknau8kNfC46Xrt39P1j2KDzCE1UlLa2eW5+A==", "optional": true, "dependencies": { - "@smithy/service-error-classification": "^3.0.1", - "@smithy/types": "^3.1.0", + "@smithy/service-error-classification": "^3.0.2", + "@smithy/types": "^3.2.0", "tslib": "^2.6.2" }, "engines": { @@ -7818,14 +7818,14 @@ } }, "node_modules/@smithy/util-stream": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-3.0.3.tgz", - "integrity": "sha512-ztOvXkXKJromRHNzvrLEW/vvTQPnxPBRHA0gR0QX61LnHDgrm4TBT4EQNpWwwHCD1N0nnEL5bEkzo2dt2t34Kg==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-3.0.4.tgz", + "integrity": "sha512-CcMioiaOOsEVdb09pS7ux1ij7QcQ2jE/cE1+iin1DXMeRgAEQN/47m7Xztu7KFQuQsj0A5YwB2UN45q97CqKCg==", "optional": true, "dependencies": { - "@smithy/fetch-http-handler": "^3.0.3", - "@smithy/node-http-handler": "^3.0.1", - "@smithy/types": "^3.1.0", + "@smithy/fetch-http-handler": "^3.1.0", + "@smithy/node-http-handler": "^3.1.0", + "@smithy/types": "^3.2.0", "@smithy/util-base64": "^3.0.0", "@smithy/util-buffer-from": "^3.0.0", "@smithy/util-hex-encoding": "^3.0.0", @@ -7910,9 +7910,9 @@ } }, "node_modules/@substrate/ss58-registry": { - "version": "1.48.0", - "resolved": "https://registry.npmjs.org/@substrate/ss58-registry/-/ss58-registry-1.48.0.tgz", - "integrity": "sha512-lE9TGgtd93fTEIoHhSdtvSFBoCsvTbqiCvQIMvX4m6BO/hESywzzTzTFMVP1doBwDDMAN4lsMfIM3X3pdmt7kQ==" + "version": "1.49.0", + "resolved": "https://registry.npmjs.org/@substrate/ss58-registry/-/ss58-registry-1.49.0.tgz", + "integrity": "sha512-leW6Ix4LD7XgvxT7+aobPWSw+WvPcN2Rxof1rmd0mNC5t2n99k1N7UNEvz7YEFSOUeHWmKIY7F5q8KeIqYoHfA==" }, "node_modules/@swc/counter": { "version": "0.1.3", @@ -8179,9 +8179,9 @@ } }, "node_modules/@types/express-serve-static-core": { - "version": "4.19.3", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.3.tgz", - "integrity": "sha512-KOzM7MhcBFlmnlr/fzISFF5vGWVSvN6fTd4T+ExOt08bA/dA5kpSzY52nMsI1KDFmUREpJelPYyuslLRSjjgCg==", + "version": "4.19.5", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.5.tgz", + "integrity": "sha512-y6W03tvrACO72aijJ5uF02FRq5cgDR9lUxddQ8vyF+GvmjJQqbzDcJngEjURc+ZsG31VI3hODNZJ2URj86pzmg==", "dependencies": { "@types/node": "*", "@types/qs": "*", @@ -8282,9 +8282,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.14.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.5.tgz", - "integrity": "sha512-aoRR+fJkZT2l0aGOJhuA8frnCSoNX6W7U2mpNq63+BxBIj5BQFt8rHy627kijCmm63ijdSdwvGgpUsU6MBsZZA==", + "version": "20.14.8", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.8.tgz", + "integrity": "sha512-DO+2/jZinXfROG7j7WKFn/3C6nFwxy2lLpgLjEXJz+0XKphZlTLJ14mo8Vfg8X5BWN6XjyESXq+LcYdT7tR3bA==", "dependencies": { "undici-types": "~5.26.4" } @@ -8937,39 +8937,39 @@ } }, "node_modules/@vue/compiler-core": { - "version": "3.4.29", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.29.tgz", - "integrity": "sha512-TFKiRkKKsRCKvg/jTSSKK7mYLJEQdUiUfykbG49rubC9SfDyvT2JrzTReopWlz2MxqeLyxh9UZhvxEIBgAhtrg==", + "version": "3.4.30", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.30.tgz", + "integrity": "sha512-ZL8y4Xxdh8O6PSwfdZ1IpQ24PjTAieOz3jXb/MDTfDtANcKBMxg1KLm6OX2jofsaQGYfIVzd3BAG22i56/cF1w==", "dev": true, "dependencies": { "@babel/parser": "^7.24.7", - "@vue/shared": "3.4.29", + "@vue/shared": "3.4.30", "entities": "^4.5.0", "estree-walker": "^2.0.2", "source-map-js": "^1.2.0" } }, "node_modules/@vue/compiler-dom": { - "version": "3.4.29", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.29.tgz", - "integrity": "sha512-A6+iZ2fKIEGnfPJejdB7b1FlJzgiD+Y/sxxKwJWg1EbJu6ZPgzaPQQ51ESGNv0CP6jm6Z7/pO6Ia8Ze6IKrX7w==", + "version": "3.4.30", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.30.tgz", + "integrity": "sha512-+16Sd8lYr5j/owCbr9dowcNfrHd+pz+w2/b5Lt26Oz/kB90C9yNbxQ3bYOvt7rI2bxk0nqda39hVcwDFw85c2Q==", "dev": true, "dependencies": { - "@vue/compiler-core": "3.4.29", - "@vue/shared": "3.4.29" + "@vue/compiler-core": "3.4.30", + "@vue/shared": "3.4.30" } }, "node_modules/@vue/compiler-sfc": { - "version": "3.4.29", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.4.29.tgz", - "integrity": "sha512-zygDcEtn8ZimDlrEQyLUovoWgKQic6aEQqRXce2WXBvSeHbEbcAsXyCk9oG33ZkyWH4sl9D3tkYc1idoOkdqZQ==", + "version": "3.4.30", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.4.30.tgz", + "integrity": "sha512-8vElKklHn/UY8+FgUFlQrYAPbtiSB2zcgeRKW7HkpSRn/JjMRmZvuOtwDx036D1aqKNSTtXkWRfqx53Qb+HmMg==", "dev": true, "dependencies": { "@babel/parser": "^7.24.7", - "@vue/compiler-core": "3.4.29", - "@vue/compiler-dom": "3.4.29", - "@vue/compiler-ssr": "3.4.29", - "@vue/shared": "3.4.29", + "@vue/compiler-core": "3.4.30", + "@vue/compiler-dom": "3.4.30", + "@vue/compiler-ssr": "3.4.30", + "@vue/shared": "3.4.30", "estree-walker": "^2.0.2", "magic-string": "^0.30.10", "postcss": "^8.4.38", @@ -8977,19 +8977,19 @@ } }, "node_modules/@vue/compiler-ssr": { - "version": "3.4.29", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.4.29.tgz", - "integrity": "sha512-rFbwCmxJ16tDp3N8XCx5xSQzjhidYjXllvEcqX/lopkoznlNPz3jyy0WGJCyhAaVQK677WWFt3YO/WUEkMMUFQ==", + "version": "3.4.30", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.4.30.tgz", + "integrity": "sha512-ZJ56YZGXJDd6jky4mmM0rNaNP6kIbQu9LTKZDhcpddGe/3QIalB1WHHmZ6iZfFNyj5mSypTa4+qDJa5VIuxMSg==", "dev": true, "dependencies": { - "@vue/compiler-dom": "3.4.29", - "@vue/shared": "3.4.29" + "@vue/compiler-dom": "3.4.30", + "@vue/shared": "3.4.30" } }, "node_modules/@vue/shared": { - "version": "3.4.29", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.29.tgz", - "integrity": "sha512-hQ2gAQcBO/CDpC82DCrinJNgOHI2v+FA7BDW4lMSPeBpQ7sRe2OLHWe5cph1s7D8DUQAwRt18dBDfJJ220APEA==", + "version": "3.4.30", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.30.tgz", + "integrity": "sha512-CLg+f8RQCHQnKvuHY9adMsMaQOcqclh6Z5V9TaoMgy0ut0tz848joZ7/CYFFyF/yZ5i2yaw7Fn498C+CNZVHIg==", "dev": true }, "node_modules/@webassemblyjs/ast": { @@ -9523,12 +9523,12 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, "node_modules/aria-query": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", - "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", + "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", "dev": true, "dependencies": { - "dequal": "^2.0.3" + "deep-equal": "^2.0.5" } }, "node_modules/array-buffer-byte-length": { @@ -9857,21 +9857,21 @@ "dev": true }, "node_modules/axe-core": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.7.0.tgz", - "integrity": "sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ==", + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.9.1.tgz", + "integrity": "sha512-QbUdXJVTpvUTHU7871ppZkdOLBeGUKBQWHkHrvN2V9IQWGMt61zf3B45BtzjxEJzYuj0JBjBZP/hmYS/R9pmAw==", "dev": true, "engines": { "node": ">=4" } }, "node_modules/axobject-query": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.2.1.tgz", - "integrity": "sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.1.1.tgz", + "integrity": "sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg==", "dev": true, "dependencies": { - "dequal": "^2.0.3" + "deep-equal": "^2.0.5" } }, "node_modules/b4a": { @@ -12020,9 +12020,9 @@ "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" }, "node_modules/cypress": { - "version": "13.11.0", - "resolved": "https://registry.npmjs.org/cypress/-/cypress-13.11.0.tgz", - "integrity": "sha512-NXXogbAxVlVje4XHX+Cx5eMFZv4Dho/2rIcdBHg9CNPFUGZdM4cRdgIgM7USmNYsC12XY0bZENEQ+KBk72fl+A==", + "version": "13.12.0", + "resolved": "https://registry.npmjs.org/cypress/-/cypress-13.12.0.tgz", + "integrity": "sha512-udzS2JilmI9ApO/UuqurEwOvThclin5ntz7K0BtnHBs+tg2Bl9QShLISXpSEMDv/u8b6mqdoAdyKeZiSqKWL8g==", "dev": true, "hasInstallScript": true, "dependencies": { @@ -12547,6 +12547,38 @@ "node": ">=6" } }, + "node_modules/deep-equal": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz", + "integrity": "sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.5", + "es-get-iterator": "^1.1.3", + "get-intrinsic": "^1.2.2", + "is-arguments": "^1.1.1", + "is-array-buffer": "^3.0.2", + "is-date-object": "^1.0.5", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "isarray": "^2.0.5", + "object-is": "^1.1.5", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.1", + "side-channel": "^1.0.4", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/deep-extend": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", @@ -12987,15 +13019,6 @@ "integrity": "sha512-PwuBojGMQAYbWkMXOY9Pd/NWCDNHVH12pnS7WHqZkTSeMESe4hwnKKRp0yR87g37113x4JPbo/oIvXY+s/f56Q==", "dev": true }, - "node_modules/dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/des.js": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.1.0.tgz", @@ -13272,14 +13295,14 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.805", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.805.tgz", - "integrity": "sha512-8W4UJwX/w9T0QSzINJckTKG6CYpAUTqsaWcWIsdud3I1FYJcMgW9QqT1/4CBff/pP/TihWh13OmiyY8neto6vw==" + "version": "1.4.811", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.811.tgz", + "integrity": "sha512-CDyzcJ5XW78SHzsIOdn27z8J4ist8eaFLhdto2hSMSJQgsiwvbv2fbizcKUICryw1Wii1TI/FEkvzvJsR3awrA==" }, "node_modules/electron/node_modules/@types/node": { - "version": "18.19.36", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.36.tgz", - "integrity": "sha512-tX1BNmYSWEvViftB26VLNxT6mEr37M7+ldUtq7rlKnv4/2fKYsJIOmqJAjT6h1DNuwQjIKgw3VJ/Dtw3yiTIQw==", + "version": "18.19.39", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.39.tgz", + "integrity": "sha512-nPwTRDKUctxw3di5b4TfT3I0sWDiWoPQCZjXhvdkINntwr8lcoVCKsTgnXeRubKIlfnV+eN/HYk6Jb40tbcEAQ==", "dependencies": { "undici-types": "~5.26.4" } @@ -13549,6 +13572,26 @@ "node": ">= 0.4" } }, + "node_modules/es-get-iterator": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", + "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "has-symbols": "^1.0.3", + "is-arguments": "^1.1.1", + "is-map": "^2.0.2", + "is-set": "^2.0.2", + "is-string": "^1.0.7", + "isarray": "^2.0.5", + "stop-iteration-iterator": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/es-html-parser": { "version": "0.0.9", "resolved": "https://registry.npmjs.org/es-html-parser/-/es-html-parser-0.0.9.tgz", @@ -13586,9 +13629,9 @@ "integrity": "sha512-AzORKdz1Zt97TzbYQnIrI3ZiibWpRXUfpo/w0xOJ20GpNYd2bd3MU9m31zS/aJ1TJl6JfLTok83Y8HjNunYT0A==" }, "node_modules/es-module-lexer": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.3.tgz", - "integrity": "sha512-i1gCgmR9dCl6Vil6UKPI/trA69s08g/syhiDK9TG0Nf1RJjjFI+AzoWW7sPufzkgYAn861skuCwJa0pIIHYxvg==" + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", + "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==" }, "node_modules/es-object-atoms": { "version": "1.0.0", @@ -13978,27 +14021,27 @@ } }, "node_modules/eslint-plugin-jsx-a11y": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.8.0.tgz", - "integrity": "sha512-Hdh937BS3KdwwbBaKd5+PLCOmYY6U4f2h9Z2ktwtNKvIdIEu137rjYbcb9ApSbVJfWxANNuiKTD/9tOKjK9qOA==", + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.9.0.tgz", + "integrity": "sha512-nOFOCaJG2pYqORjK19lqPqxMO/JpvdCZdPtNdxY3kvom3jTvkAbOvQvD8wuD0G8BYR0IGAGYDlzqWJOh/ybn2g==", "dev": true, "dependencies": { - "@babel/runtime": "^7.23.2", - "aria-query": "^5.3.0", - "array-includes": "^3.1.7", + "aria-query": "~5.1.3", + "array-includes": "^3.1.8", "array.prototype.flatmap": "^1.3.2", "ast-types-flow": "^0.0.8", - "axe-core": "=4.7.0", - "axobject-query": "^3.2.1", + "axe-core": "^4.9.1", + "axobject-query": "~3.1.1", "damerau-levenshtein": "^1.0.8", "emoji-regex": "^9.2.2", - "es-iterator-helpers": "^1.0.15", - "hasown": "^2.0.0", + "es-iterator-helpers": "^1.0.19", + "hasown": "^2.0.2", "jsx-ast-utils": "^3.3.5", "language-tags": "^1.0.9", "minimatch": "^3.1.2", - "object.entries": "^1.1.7", - "object.fromentries": "^2.0.7" + "object.fromentries": "^2.0.8", + "safe-regex-test": "^1.0.3", + "string.prototype.includes": "^2.0.0" }, "engines": { "node": ">=4.0" @@ -14028,16 +14071,16 @@ } }, "node_modules/eslint-plugin-react": { - "version": "7.34.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.34.2.tgz", - "integrity": "sha512-2HCmrU+/JNigDN6tg55cRDKCQWicYAPB38JGSFDQt95jDm8rrvSUo7YPkOIm5l6ts1j1zCvysNcasvfTMQzUOw==", + "version": "7.34.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.34.3.tgz", + "integrity": "sha512-aoW4MV891jkUulwDApQbPYTVZmeuSyFrudpbTAQuj5Fv8VL+o6df2xIGpw8B0hPjAaih1/Fb0om9grCdyFYemA==", "dev": true, "dependencies": { "array-includes": "^3.1.8", "array.prototype.findlast": "^1.2.5", "array.prototype.flatmap": "^1.3.2", "array.prototype.toreversed": "^1.1.2", - "array.prototype.tosorted": "^1.1.3", + "array.prototype.tosorted": "^1.1.4", "doctrine": "^2.1.0", "es-iterator-helpers": "^1.0.19", "estraverse": "^5.3.0", @@ -15240,6 +15283,12 @@ "readable-stream": "~1.0.26-4" } }, + "node_modules/fwd-stream/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "dev": true + }, "node_modules/fwd-stream/node_modules/readable-stream": { "version": "1.0.34", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", @@ -15412,14 +15461,15 @@ "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==" }, "node_modules/glob": { - "version": "10.4.1", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.1.tgz", - "integrity": "sha512-2jelhlq3E4ho74ZyVLN03oKdAZVUa6UDZzFLVH1H7dnoax+y9qyaq8zBkfDIggjniU19z0wU18y16jMB2eyVIw==", + "version": "10.4.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.2.tgz", + "integrity": "sha512-GwMlUF6PkPo3Gk21UxkCohOv0PLcIXVtKyLlpEI28R/cO/4eNOdmLk3CMW1wROV/WR/EsZOWAfBbBOqYvs88/w==", "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", "minimatch": "^9.0.4", "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", "path-scurry": "^1.11.1" }, "bin": { @@ -16734,11 +16784,14 @@ } }, "node_modules/is-core-module": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", - "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.14.0.tgz", + "integrity": "sha512-a5dFJih5ZLYlRtDc0dZWP7RiKr6xIKzmn/oAYCDvdLThadVgyJwlaoQPmRtMSpz+rk0OGAgIu+TcM9HUF0fk1A==", "dependencies": { - "hasown": "^2.0.0" + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -17228,9 +17281,9 @@ } }, "node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", "dev": true }, "node_modules/isbuffer": { @@ -17738,9 +17791,9 @@ } }, "node_modules/jsonc-parser": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.1.tgz", - "integrity": "sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", + "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", "dev": true }, "node_modules/jsonfile": { @@ -17923,9 +17976,9 @@ } }, "node_modules/launch-editor": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.7.0.tgz", - "integrity": "sha512-KAc66u6LxWL8MifQ94oG3YGKYWDwz/Gi0T15lN//GaQoZe08vQGFJxrXkPAeu50UXgvJPPaRKVGuP1TRUm/aHQ==", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.8.0.tgz", + "integrity": "sha512-vJranOAJrI/llyWGRQqiDM+adrw+k83fvmmx3+nV47g3+36xM15jE+zyZ6Ffel02+xSvuM0b2GDRosXZkbb6wA==", "dependencies": { "picocolors": "^1.0.0", "shell-quote": "^1.8.1" @@ -18109,6 +18162,12 @@ "readable-stream": "~1.0.26" } }, + "node_modules/levelup/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "dev": true + }, "node_modules/levelup/node_modules/prr": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/prr/-/prr-0.0.0.tgz", @@ -20132,9 +20191,9 @@ } }, "node_modules/nodemon": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.3.tgz", - "integrity": "sha512-m4Vqs+APdKzDFpuaL9F9EVOF85+h070FnkHVEoU4+rmT6Vw0bmNl7s61VEkY/cJkL7RCv1p4urnUDUMrS5rk2w==", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.4.tgz", + "integrity": "sha512-wjPBbFhtpJwmIeY2yP7QF+UKzPfltVGtfce1g/bB15/8vCGZj8uxD62b/b9M9/WVgme0NZudpownKN+c0plXlQ==", "dev": true, "dependencies": { "chokidar": "^3.5.2", @@ -20649,9 +20708,12 @@ } }, "node_modules/object-inspect": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", - "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", + "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -21046,6 +21108,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/package-json-from-dist": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", + "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==" + }, "node_modules/package-json/node_modules/semver": { "version": "7.6.2", "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", @@ -21988,11 +22055,6 @@ "node": ">= 0.6" } }, - "node_modules/rate-limiter-flexible": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/rate-limiter-flexible/-/rate-limiter-flexible-5.0.3.tgz", - "integrity": "sha512-lWx2y8NBVlTOLPyqs+6y7dxfEpT6YFqKy3MzWbCy95sTTOhOuxufP2QvRyOHpfXpB9OUJPbVLybw3z3AVAS5fA==" - }, "node_modules/raw-body": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", @@ -22116,11 +22178,11 @@ } }, "node_modules/react-router": { - "version": "6.23.1", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.23.1.tgz", - "integrity": "sha512-fzcOaRF69uvqbbM7OhvQyBTFDVrrGlsFdS3AL+1KfIBtGETibHzi3FkoTRyiDJnWNc2VxrfvR+657ROHjaNjqQ==", + "version": "6.24.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.24.0.tgz", + "integrity": "sha512-sQrgJ5bXk7vbcC4BxQxeNa5UmboFm35we1AFK0VvQaz9g0LzxEIuLOhHIoZ8rnu9BO21ishGeL9no1WB76W/eg==", "dependencies": { - "@remix-run/router": "1.16.1" + "@remix-run/router": "1.17.0" }, "engines": { "node": ">=14.0.0" @@ -22130,12 +22192,12 @@ } }, "node_modules/react-router-dom": { - "version": "6.23.1", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.23.1.tgz", - "integrity": "sha512-utP+K+aSTtEdbWpC+4gxhdlPFwuEfDKq8ZrPFU65bbRJY+l706qjR7yaidBpo3MSeA/fzwbXWbKBI6ftOnP3OQ==", + "version": "6.24.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.24.0.tgz", + "integrity": "sha512-960sKuau6/yEwS8e+NVEidYQb1hNjAYM327gjEyXlc6r3Skf2vtwuJ2l7lssdegD2YjoKG5l8MsVyeTDlVeY8g==", "dependencies": { - "@remix-run/router": "1.16.1", - "react-router": "6.23.1" + "@remix-run/router": "1.17.0", + "react-router": "6.24.0" }, "engines": { "node": ">=14.0.0" @@ -22251,6 +22313,12 @@ "string_decoder": "~0.10.x" } }, + "node_modules/readable-stream/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "dev": true + }, "node_modules/readable-stream/node_modules/string_decoder": { "version": "0.10.31", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", @@ -22971,12 +23039,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/safe-array-concat/node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true - }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -24102,6 +24164,18 @@ "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.7.0.tgz", "integrity": "sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==" }, + "node_modules/stop-iteration-iterator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", + "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", + "dev": true, + "dependencies": { + "internal-slot": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/store": { "version": "2.0.12", "resolved": "https://registry.npmjs.org/store/-/store-2.0.12.tgz", @@ -24257,6 +24331,16 @@ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, + "node_modules/string.prototype.includes": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.0.tgz", + "integrity": "sha512-E34CkBgyeqNDcrbU76cDjL5JLcVrtSdYq0MEh/B10r17pRP4ciHLwTgnuLV8Ay6cgEMLkcBkFCKyFZ43YldYzg==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, "node_modules/string.prototype.matchall": { "version": "4.0.11", "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz", @@ -24849,9 +24933,9 @@ } }, "node_modules/tree-dump": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tree-dump/-/tree-dump-1.0.1.tgz", - "integrity": "sha512-WCkcRBVPSlHHq1dc/px9iOfqklvzCbdRwvlNfxGZsrHqf6aZttfPrd7DJTt6oR10dwUfpFFQeVTkPbBIZxX/YA==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tree-dump/-/tree-dump-1.0.2.tgz", + "integrity": "sha512-dpev9ABuLWdEubk+cIaI9cHwRNNDjkBBLXTwI4UCUFdQ5xXKqNXoK4FEciw/vxf+NQ7Cb7sGUyeUtORvHIdRXQ==", "engines": { "node": ">=10.0" }, @@ -24988,9 +25072,9 @@ "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, "node_modules/tsx": { - "version": "4.15.6", - "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.15.6.tgz", - "integrity": "sha512-is0VQQlfNZRHEuSSTKA6m4xw74IU4AizmuB6lAYLRt9XtuyeQnyJYexhNZOPCB59SqC4JzmSzPnHGBXxf3k0hA==", + "version": "4.15.7", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.15.7.tgz", + "integrity": "sha512-u3H0iSFDZM3za+VxkZ1kywdCeHCn+8/qHQS1MNoO2sONDgD95HlWtt8aB23OzeTmFP9IU4/8bZUdg58Uu5J4cg==", "dev": true, "dependencies": { "esbuild": "~0.21.4", @@ -25594,12 +25678,12 @@ } }, "node_modules/typedoc-plugin-mdn-links": { - "version": "3.1.30", - "resolved": "https://registry.npmjs.org/typedoc-plugin-mdn-links/-/typedoc-plugin-mdn-links-3.1.30.tgz", - "integrity": "sha512-aB3UqyRGdxYziOHKzE7AQPh+9xpqqHHrp23F+T6yshHeuSiauCL+zzgTRhi4Ad1x30/7rTkCtyQ5dfO/+1FDKA==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/typedoc-plugin-mdn-links/-/typedoc-plugin-mdn-links-3.2.1.tgz", + "integrity": "sha512-l76VJKKhOxCYXnb16aV6nAQG5JCsuStqviNFmgzhS9dW73nqm3/1MO9497+0KlDTOPO3o+R2uVXq87d2cDy/hg==", "dev": true, "peerDependencies": { - "typedoc": ">= 0.23.14 || 0.24.x || 0.25.x" + "typedoc": ">= 0.23.14 || 0.24.x || 0.25.x || 0.26.x" } }, "node_modules/typedoc-plugin-missing-exports": { @@ -25612,12 +25696,12 @@ } }, "node_modules/typedoc-plugin-zod": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/typedoc-plugin-zod/-/typedoc-plugin-zod-1.1.2.tgz", - "integrity": "sha512-jsmuYg1xsGjwKdhKN4tgRYORnbKpU7v5B1ZpsazMH5lUsI6ZLxBqAY5iiZ06oz/01gHOsAdhpABgWD97MOjKQA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/typedoc-plugin-zod/-/typedoc-plugin-zod-1.2.0.tgz", + "integrity": "sha512-eFvPQ4iJsoru4HJP8z7F0NhRxPBjgVPoM0j/xipB7nkGLYhfUjEOlABayaTdBiMocPNCXOCBjFWBHEJGBiMRdw==", "dev": true, "peerDependencies": { - "typedoc": "0.23.x || 0.24.x || 0.25.x" + "typedoc": "0.23.x || 0.24.x || 0.25.x || 0.26.x" } }, "node_modules/typedoc/node_modules/brace-expansion": { @@ -26005,9 +26089,9 @@ "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==" }, "node_modules/v8-to-istanbul": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.2.0.tgz", - "integrity": "sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==", + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", + "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", "dev": true, "dependencies": { "@jridgewell/trace-mapping": "^0.3.12", @@ -26969,9 +27053,9 @@ } }, "node_modules/webpack": { - "version": "5.92.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.92.0.tgz", - "integrity": "sha512-Bsw2X39MYIgxouNATyVpCNVWBCuUwDgWtN78g6lSdPJRLaQ/PUVm/oXcaRAyY/sMFoKFQrsPeqvTizWtq7QPCA==", + "version": "5.92.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.92.1.tgz", + "integrity": "sha512-JECQ7IwJb+7fgUFBlrJzbyu3GEuNBcdqr1LD7IbSzwkSmIevTm8PF+wej3Oxuz/JFBUZ6O1o43zsPkwm1C4TmA==", "dependencies": { "@types/eslint-scope": "^3.7.3", "@types/estree": "^1.0.5", @@ -27396,12 +27480,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/which-builtin-type/node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true - }, "node_modules/which-collection": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", @@ -27872,7 +27950,6 @@ "license": "Apache-2.0", "dependencies": { "@polkadot/keyring": "12.6.2", - "@polkadot/types": "10.13.1", "@polkadot/util": "12.6.2", "@polkadot/util-crypto": "12.6.2", "@prosopo/captcha-contract": "1.0.2", @@ -27886,7 +27963,6 @@ "cron-parser": "^4.9.0", "dotenv": "^16.0.1", "express-rate-limit": "^7.3.1", - "rate-limiter-flexible": "^5.0.3", "yargs": "^17.7.2", "zod": "^3.22.4" }, @@ -28362,9 +28438,9 @@ } }, "packages/provider/node_modules/@types/node": { - "version": "18.19.36", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.36.tgz", - "integrity": "sha512-tX1BNmYSWEvViftB26VLNxT6mEr37M7+ldUtq7rlKnv4/2fKYsJIOmqJAjT6h1DNuwQjIKgw3VJ/Dtw3yiTIQw==", + "version": "18.19.39", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.39.tgz", + "integrity": "sha512-nPwTRDKUctxw3di5b4TfT3I0sWDiWoPQCZjXhvdkINntwr8lcoVCKsTgnXeRubKIlfnV+eN/HYk6Jb40tbcEAQ==", "dev": true, "dependencies": { "undici-types": "~5.26.4" @@ -28523,9 +28599,9 @@ } }, "packages/types/node_modules/@types/node": { - "version": "18.19.36", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.36.tgz", - "integrity": "sha512-tX1BNmYSWEvViftB26VLNxT6mEr37M7+ldUtq7rlKnv4/2fKYsJIOmqJAjT6h1DNuwQjIKgw3VJ/Dtw3yiTIQw==", + "version": "18.19.39", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.39.tgz", + "integrity": "sha512-nPwTRDKUctxw3di5b4TfT3I0sWDiWoPQCZjXhvdkINntwr8lcoVCKsTgnXeRubKIlfnV+eN/HYk6Jb40tbcEAQ==", "dev": true, "dependencies": { "undici-types": "~5.26.4" diff --git a/packages/cli/package.json b/packages/cli/package.json index 3e51aa51fb..ccd44a1429 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -32,7 +32,6 @@ }, "dependencies": { "@polkadot/keyring": "12.6.2", - "@polkadot/types": "10.13.1", "@polkadot/util": "12.6.2", "@polkadot/util-crypto": "12.6.2", "@prosopo/captcha-contract": "1.0.2", @@ -46,7 +45,6 @@ "cron-parser": "^4.9.0", "dotenv": "^16.0.1", "express-rate-limit": "^7.3.1", - "rate-limiter-flexible": "^5.0.3", "yargs": "^17.7.2", "zod": "^3.22.4" }, From 2ea7d80a4e4b75d449353ac00aa30be951fa6761 Mon Sep 17 00:00:00 2001 From: Hugh Date: Tue, 25 Jun 2024 14:18:33 +0100 Subject: [PATCH 12/14] Linting --- packages/cli/src/RateLimiter.ts | 13 +++++++++++++ packages/detector/src/index.d.ts | 13 +++++++++++++ packages/types/src/config/config.ts | 20 ++++++++++---------- packages/types/src/config/timeouts.ts | 13 +++++++++++++ 4 files changed, 49 insertions(+), 10 deletions(-) diff --git a/packages/cli/src/RateLimiter.ts b/packages/cli/src/RateLimiter.ts index d07a72cefe..eb7a9d9135 100644 --- a/packages/cli/src/RateLimiter.ts +++ b/packages/cli/src/RateLimiter.ts @@ -1,3 +1,16 @@ +// Copyright 2021-2024 Prosopo (UK) Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. import { AdminApiPaths, ApiPaths } from '@prosopo/types' export const getRateLimitConfig = () => { diff --git a/packages/detector/src/index.d.ts b/packages/detector/src/index.d.ts index f95b61ee9e..8cab82e098 100644 --- a/packages/detector/src/index.d.ts +++ b/packages/detector/src/index.d.ts @@ -1,3 +1,16 @@ +// Copyright 2021-2024 Prosopo (UK) Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. export function isBot(): Promise<{ fingerprint: { resistance: diff --git a/packages/types/src/config/config.ts b/packages/types/src/config/config.ts index 63d0cf7f0d..2acb69d8a1 100644 --- a/packages/types/src/config/config.ts +++ b/packages/types/src/config/config.ts @@ -13,6 +13,16 @@ // limitations under the License. import { ApiPathRateLimits, ProviderDefaultRateLimits } from '../provider/index.js' +import { + DEFAULT_IMAGE_CAPTCHA_SOLUTION_TIMEOUT, + DEFAULT_IMAGE_CAPTCHA_TIMEOUT, + DEFAULT_IMAGE_CAPTCHA_VERIFIED_TIMEOUT, + DEFAULT_IMAGE_MAX_VERIFIED_TIME_CACHED, + DEFAULT_MAX_VERIFIED_TIME_CONTRACT, + DEFAULT_POW_CAPTCHA_CACHED_TIMEOUT, + DEFAULT_POW_CAPTCHA_SOLUTION_TIMEOUT, + DEFAULT_POW_CAPTCHA_VERIFIED_TIMEOUT, +} from './timeouts.js' import { NetworkNamesSchema, ProsopoNetworkSchema } from './network.js' import { input } from 'zod' import { literal } from 'zod' @@ -24,16 +34,6 @@ import { union } from 'zod' import { infer as zInfer } from 'zod' import networks from '../networks/index.js' import z, { boolean } from 'zod' -import { - DEFAULT_IMAGE_CAPTCHA_SOLUTION_TIMEOUT, - DEFAULT_IMAGE_CAPTCHA_TIMEOUT, - DEFAULT_IMAGE_CAPTCHA_VERIFIED_TIMEOUT, - DEFAULT_IMAGE_MAX_VERIFIED_TIME_CACHED, - DEFAULT_MAX_VERIFIED_TIME_CONTRACT, - DEFAULT_POW_CAPTCHA_CACHED_TIMEOUT, - DEFAULT_POW_CAPTCHA_SOLUTION_TIMEOUT, - DEFAULT_POW_CAPTCHA_VERIFIED_TIMEOUT, -} from './timeouts.js' const LogLevel = zEnum(['trace', 'debug', 'info', 'warn', 'error', 'fatal', 'log']) diff --git a/packages/types/src/config/timeouts.ts b/packages/types/src/config/timeouts.ts index 4142acaf31..631d887fe9 100644 --- a/packages/types/src/config/timeouts.ts +++ b/packages/types/src/config/timeouts.ts @@ -1,3 +1,16 @@ +// Copyright 2021-2024 Prosopo (UK) Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. const ONE_MINUTE = 60 * 1000 // The timeframe in which a user must complete an image captcha (1 minute) export const DEFAULT_IMAGE_CAPTCHA_TIMEOUT = ONE_MINUTE From 9441bf63f0a637a9499a1562d92860ade04e8c1c Mon Sep 17 00:00:00 2001 From: Hugh Date: Tue, 25 Jun 2024 14:20:32 +0100 Subject: [PATCH 13/14] Sneaky uncaught linting error --- .../procaptcha-frictionless/src/ProcaptchaFrictionless.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/procaptcha-frictionless/src/ProcaptchaFrictionless.tsx b/packages/procaptcha-frictionless/src/ProcaptchaFrictionless.tsx index 5abf7e8e2d..88b1d0f4f0 100644 --- a/packages/procaptcha-frictionless/src/ProcaptchaFrictionless.tsx +++ b/packages/procaptcha-frictionless/src/ProcaptchaFrictionless.tsx @@ -11,12 +11,12 @@ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. +import { BotDetectionFunction, ProcaptchaFrictionlessProps } from '@prosopo/types' import { Procaptcha } from '@prosopo/procaptcha-react' import { ProcaptchaPlaceholder } from '@prosopo/web-components' import { ProcaptchaPow } from '@prosopo/procaptcha-pow' -import { useEffect, useState } from 'react' -import { BotDetectionFunction, ProcaptchaFrictionlessProps } from '@prosopo/types' import { isBot } from '@prosopo/detector' +import { useEffect, useState } from 'react' const customDetectBot: BotDetectionFunction = async () => { return await isBot().then((result) => { From 0d841f3744579b4c17533e2595536894e977a42a Mon Sep 17 00:00:00 2001 From: Hugh Date: Wed, 3 Jul 2024 11:59:04 +0100 Subject: [PATCH 14/14] Removing console log --- packages/cli/src/start.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/cli/src/start.ts b/packages/cli/src/start.ts index de357a436c..06b6aec34d 100644 --- a/packages/cli/src/start.ts +++ b/packages/cli/src/start.ts @@ -69,8 +69,6 @@ export async function start(env?: ProviderEnvironment, admin?: boolean) { } await env.isReady() - console.log(env.config.rateLimits) - // Start the scheduled job if (env.pair) { storeCaptchasExternally(env.pair, env.config).catch((err) => {