From 7b1178406c8d0569f828fdd7002a99987d1114a8 Mon Sep 17 00:00:00 2001 From: Nicholas Barnett Date: Wed, 23 Oct 2024 15:29:57 -0500 Subject: [PATCH] feat: added signer id page --- next-env.d.ts | 2 +- pnpm-lock.yaml | 835 +++++++++++++----- .../time-filter/DatePickerInput.tsx | 2 +- .../_components/time-filter/TimeFilter.tsx | 2 +- src/app/_components/time-filter/TimeInput.tsx | 4 +- .../time-filter/TimeRangeInput.tsx | 4 +- src/app/global-error.tsx | 2 +- src/app/search/filters/Date.tsx | 2 +- .../[signerKey]/AssociatedAddressesTable.tsx | 138 +++ .../signer/[signerKey]/CycleSortFilter.tsx | 45 + src/app/signer/[signerKey]/PageClient.tsx | 64 ++ src/app/signer/[signerKey]/SignerStats.tsx | 86 ++ src/app/signer/[signerKey]/SignerSummary.tsx | 84 ++ .../[signerKey]/StackingHistoryTable.tsx | 307 +++++++ src/app/signer/[signerKey]/page.tsx | 12 + src/app/signer/[signerKey]/skeleton.tsx | 103 +++ src/app/signers/AddressesStackingCard.tsx | 110 --- src/app/signers/CycleFilter.tsx | 66 +- src/app/signers/SignerDistribution.tsx | 12 +- src/app/signers/SignerDistributionLegend.tsx | 4 +- .../signers/SignerDistributionPieChart.tsx | 4 +- src/app/signers/SignersTable.tsx | 180 ++-- src/app/signers/data/UseSigner.ts | 116 +++ src/app/signers/data/UseSignerAddresses.ts | 71 +- src/app/signers/data/signer-metrics-hooks.ts | 31 +- src/app/signers/data/useSigners.ts | 49 +- src/app/signers/skeleton.tsx | 12 +- .../components/modals/AddNetwork/utils.ts | 5 +- .../queries/useAddressMempoolTxsInfinite.ts | 9 +- src/stories/Colors.stories.tsx | 10 +- 30 files changed, 1842 insertions(+), 529 deletions(-) create mode 100644 src/app/signer/[signerKey]/AssociatedAddressesTable.tsx create mode 100644 src/app/signer/[signerKey]/CycleSortFilter.tsx create mode 100644 src/app/signer/[signerKey]/PageClient.tsx create mode 100644 src/app/signer/[signerKey]/SignerStats.tsx create mode 100644 src/app/signer/[signerKey]/SignerSummary.tsx create mode 100644 src/app/signer/[signerKey]/StackingHistoryTable.tsx create mode 100644 src/app/signer/[signerKey]/page.tsx create mode 100644 src/app/signer/[signerKey]/skeleton.tsx delete mode 100644 src/app/signers/AddressesStackingCard.tsx create mode 100644 src/app/signers/data/UseSigner.ts diff --git a/next-env.d.ts b/next-env.d.ts index 4f11a03dc..40c3d6809 100644 --- a/next-env.d.ts +++ b/next-env.d.ts @@ -2,4 +2,4 @@ /// // NOTE: This file should not be edited -// see https://nextjs.org/docs/basic-features/typescript for more information. +// see https://nextjs.org/docs/app/building-your-application/configuring/typescript for more information. diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c40c3e910..e371c922e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -23,7 +23,7 @@ dependencies: version: 2.8.2(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(@types/react@18.2.0)(framer-motion@10.16.4)(react-dom@18.2.0)(react@18.2.0) '@chakra-ui/theme-tools': specifier: 2.1.2 - version: 2.1.2(@chakra-ui/styled-system@2.9.2) + version: 2.1.2(@chakra-ui/styled-system@2.12.0) '@contentful/rich-text-react-renderer': specifier: 15.21.2 version: 15.21.2(react-dom@18.2.0)(react@18.2.0) @@ -80,7 +80,7 @@ dependencies: version: 1.9.7(react-redux@8.1.2)(react@18.2.0) '@sentry/nextjs': specifier: 8.26.0 - version: 8.26.0(@opentelemetry/api@1.9.0)(@opentelemetry/core@1.25.1)(@opentelemetry/instrumentation@0.52.1)(@opentelemetry/sdk-trace-base@1.25.1)(next@14.2.13)(react@18.2.0)(webpack@5.94.0) + version: 8.26.0(@opentelemetry/api@1.9.0)(@opentelemetry/core@1.27.0)(@opentelemetry/instrumentation@0.52.1)(@opentelemetry/sdk-trace-base@1.27.0)(next@14.2.13)(react@18.2.0)(webpack@5.95.0) '@stacks/auth': specifier: 6.15.0 version: 6.15.0 @@ -176,7 +176,7 @@ dependencies: version: 3.0.1(onigasm@2.2.5) monaco-vscode-textmate-theme-converter: specifier: 0.1.7 - version: 0.1.7(tslib@2.6.2) + version: 0.1.7(tslib@2.8.0) monacode: specifier: 0.3.1 version: 0.3.1 @@ -185,7 +185,7 @@ dependencies: version: 1.10.0 next: specifier: 14.2.13 - version: 14.2.13(@babel/core@7.25.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.40.0)(react-dom@18.2.0)(react@18.2.0) + version: 14.2.13(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.40.0)(react-dom@18.2.0)(react@18.2.0) nookies: specifier: 2.5.2 version: 2.5.2 @@ -197,7 +197,7 @@ dependencies: version: 8.0.0 preact-render-to-string: specifier: 5.1.19 - version: 5.1.19(preact@10.19.3) + version: 5.1.19(preact@10.24.3) prismjs: specifier: 1.29.0 version: 1.29.0 @@ -212,7 +212,7 @@ dependencies: version: 6.1.0(react@18.2.0) react-countup: specifier: 6.4.2 - version: 6.4.2(@babel/core@7.25.7)(react@18.2.0) + version: 6.4.2(@babel/core@7.26.0)(react@18.2.0) react-csv: specifier: 2.2.2 version: 2.2.2 @@ -242,7 +242,7 @@ dependencies: version: 0.13.1(react-dom@18.2.0)(react@18.2.0) react-ssr-prepass: specifier: npm:preact-ssr-prepass - version: /preact-ssr-prepass@1.2.1(preact@10.19.3) + version: /preact-ssr-prepass@1.2.1(preact@10.24.3) recharts: specifier: 2.12.7 version: 2.12.7(react-dom@18.2.0)(react@18.2.0) @@ -289,7 +289,7 @@ devDependencies: version: 1.40.0 '@stacks/eslint-config': specifier: 2.0.0 - version: 2.0.0(eslint-plugin-import@2.29.0)(eslint-plugin-prettier@5.0.1)(eslint-plugin-unused-imports@3.0.0)(eslint@8.54.0)(typescript@5.3.2) + version: 2.0.0(eslint-plugin-import@2.29.0)(eslint-plugin-prettier@5.0.1)(eslint-plugin-unused-imports@4.1.4)(eslint@8.54.0)(typescript@5.3.2) '@stacks/prettier-config': specifier: 0.0.10 version: 0.0.10 @@ -316,7 +316,7 @@ devDependencies: version: 8.3.5(react-dom@18.2.0)(react@18.2.0)(storybook@8.3.5) '@storybook/nextjs': specifier: 8.3.5 - version: 8.3.5(esbuild@0.23.1)(next@14.2.13)(react-dom@18.2.0)(react@18.2.0)(storybook@8.3.5)(typescript@5.3.2)(webpack@5.94.0) + version: 8.3.5(esbuild@0.23.1)(next@14.2.13)(react-dom@18.2.0)(react@18.2.0)(storybook@8.3.5)(typescript@5.3.2)(webpack@5.95.0) '@storybook/react': specifier: 8.3.5 version: 8.3.5(@storybook/test@8.3.5)(react-dom@18.2.0)(react@18.2.0)(storybook@8.3.5)(typescript@5.3.2) @@ -450,6 +450,13 @@ packages: '@jridgewell/gen-mapping': 0.3.3 '@jridgewell/trace-mapping': 0.3.20 + /@ampproject/remapping@2.3.0: + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + /@babel/code-frame@7.23.4: resolution: {integrity: sha512-r1IONyb6Ia+jYR2vvIDhdWdlTGhqbBoFqLTQidzZ4kepUFH15ejXvFHxCVbtl7BOXIudsIubf4E81xeA3h3IXA==} engines: {node: '>=6.9.0'} @@ -470,6 +477,15 @@ packages: dependencies: '@babel/highlight': 7.25.7 picocolors: 1.0.0 + dev: true + + /@babel/code-frame@7.26.0: + resolution: {integrity: sha512-INCKxTtbXtcNbUZ3YXutwMpEleqttcswhAdee7dhuoVrD2cnuc3PqtERBtxkX5nziX9vnBL8WXmSGwv8CuPV6g==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.25.9 + js-tokens: 4.0.0 + picocolors: 1.1.1 /@babel/compat-data@7.23.3: resolution: {integrity: sha512-BmR4bWbDIoFJmJ9z2cZ8Gmm2MXgEDgjdWgpKmKWUt54UGFJdlj31ECtbaDvCG/qVdG3AQ1SfpZEs01lUFbzLOQ==} @@ -483,6 +499,11 @@ packages: /@babel/compat-data@7.25.7: resolution: {integrity: sha512-9ickoLz+hcXCeh7jrcin+/SLWm+GkxE2kTvoYyp38p4WkdFXfQJxDFGWp/YHjiKLPx06z2A7W8XKuqbReXDzsw==} engines: {node: '>=6.9.0'} + dev: true + + /@babel/compat-data@7.26.0: + resolution: {integrity: sha512-qETICbZSLe7uXv9VE8T/RWOdIE5qqyTucOt4zLYMafj2MRO271VGgLd4RACJMeBO37UPWhXiKMBk7YlJ0fOzQA==} + engines: {node: '>=6.9.0'} /@babel/core@7.23.3: resolution: {integrity: sha512-Jg+msLuNuCJDyBvFv5+OKOUjWMZgd85bKjbICd3zWrKAo+bJ49HJufi7CQE0q0uR8NGyO6xkCACScNqyjHSZew==} @@ -499,7 +520,7 @@ packages: '@babel/traverse': 7.23.4 '@babel/types': 7.23.4 convert-source-map: 2.0.0 - debug: 4.3.4 + debug: 4.3.7 gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 @@ -522,7 +543,7 @@ packages: '@babel/traverse': 7.23.6 '@babel/types': 7.23.6 convert-source-map: 2.0.0 - debug: 4.3.6 + debug: 4.3.7 gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 @@ -550,6 +571,29 @@ packages: semver: 6.3.1 transitivePeerDependencies: - supports-color + dev: true + + /@babel/core@7.26.0: + resolution: {integrity: sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==} + engines: {node: '>=6.9.0'} + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.26.0 + '@babel/generator': 7.26.0 + '@babel/helper-compilation-targets': 7.25.9 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0) + '@babel/helpers': 7.26.0 + '@babel/parser': 7.26.1 + '@babel/template': 7.25.9 + '@babel/traverse': 7.25.9 + '@babel/types': 7.26.0 + convert-source-map: 2.0.0 + debug: 4.3.7 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color /@babel/generator@7.17.7: resolution: {integrity: sha512-oLcVCTeIFadUoArDTwpluncplrYBmTCCZZgXCbgNGvOBBiSDDK3eWO4b/+eOTli5tKv1lg+a5/NAXg+nTcei1w==} @@ -587,6 +631,17 @@ packages: '@jridgewell/gen-mapping': 0.3.5 '@jridgewell/trace-mapping': 0.3.25 jsesc: 3.0.2 + dev: true + + /@babel/generator@7.26.0: + resolution: {integrity: sha512-/AIkAmInnWwgEAJGQr9vY0c66Mj6kjkE2ZPB1PurTRaRAh3U+J45sAQMjQDJdh4WbR3l0x5xkimXBKyBXXAu2w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/parser': 7.26.1 + '@babel/types': 7.26.0 + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 3.0.2 /@babel/helper-annotate-as-pure@7.25.7: resolution: {integrity: sha512-4xwU8StnqnlIhhioZf1tqnVWeQ9pvH/ujS8hRfw/WOza+/a+1qv69BWNy+oY231maTCWgKWhfBU7kDpsds6zAA==} @@ -635,6 +690,17 @@ packages: browserslist: 4.24.0 lru-cache: 5.1.1 semver: 6.3.1 + dev: true + + /@babel/helper-compilation-targets@7.25.9: + resolution: {integrity: sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/compat-data': 7.26.0 + '@babel/helper-validator-option': 7.25.9 + browserslist: 4.24.2 + lru-cache: 5.1.1 + semver: 6.3.1 /@babel/helper-create-class-features-plugin@7.25.7(@babel/core@7.25.7): resolution: {integrity: sha512-bD4WQhbkx80mAyj/WCm4ZHcF4rDxkoLFO6ph8/5/mQ3z4vAzltQXAmbc7GvVJx5H+lk5Mi5EmbTeox5nMGCsbw==} @@ -674,7 +740,7 @@ packages: '@babel/core': 7.25.7 '@babel/helper-compilation-targets': 7.23.6 '@babel/helper-plugin-utils': 7.25.7 - debug: 4.3.6 + debug: 4.3.7 lodash.debounce: 4.0.8 resolve: 1.22.8 transitivePeerDependencies: @@ -722,6 +788,16 @@ packages: '@babel/types': 7.25.7 transitivePeerDependencies: - supports-color + dev: true + + /@babel/helper-module-imports@7.25.9: + resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/traverse': 7.25.9 + '@babel/types': 7.26.0 + transitivePeerDependencies: + - supports-color /@babel/helper-module-transforms@7.23.3(@babel/core@7.23.3): resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} @@ -763,6 +839,20 @@ packages: '@babel/traverse': 7.25.7 transitivePeerDependencies: - supports-color + dev: true + + /@babel/helper-module-transforms@7.26.0(@babel/core@7.26.0): + resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-module-imports': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + '@babel/traverse': 7.25.9 + transitivePeerDependencies: + - supports-color /@babel/helper-optimise-call-expression@7.25.7: resolution: {integrity: sha512-VAwcwuYhv/AT+Vfr28c9y6SHzTan1ryqrydSTFGjU0uDJHw3uZ+PduI8plCLkRsDnqK2DMEDmwrOQRsK/Ykjng==} @@ -823,6 +913,7 @@ packages: '@babel/types': 7.25.7 transitivePeerDependencies: - supports-color + dev: true /@babel/helper-skip-transparent-expression-wrappers@7.25.7: resolution: {integrity: sha512-pPbNbchZBkPMD50K0p3JGcFMNLVUCuU/ABybm/PGNj4JiHrpmNyqqCphBk4i19xXtNV0JhldQJJtbSW5aUvbyA==} @@ -847,6 +938,11 @@ packages: /@babel/helper-string-parser@7.25.7: resolution: {integrity: sha512-CbkjYdsJNHFk8uqpEkpCvRs3YRp9tY6FmFY7wLMSYuGYkrdUi7r2lc4/wqsvlHoMznX3WJ9IP8giGPq68T/Y6g==} engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-string-parser@7.25.9: + resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} + engines: {node: '>=6.9.0'} /@babel/helper-validator-identifier@7.22.20: resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} @@ -855,6 +951,11 @@ packages: /@babel/helper-validator-identifier@7.25.7: resolution: {integrity: sha512-AM6TzwYqGChO45oiuPqwL2t20/HdMC1rTPAesnBCgPCSF1x3oN9MVUwQV2iyz4xqWrctwK5RNC8LV22kaQCNYg==} engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-validator-identifier@7.25.9: + resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} + engines: {node: '>=6.9.0'} /@babel/helper-validator-option@7.22.15: resolution: {integrity: sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==} @@ -868,6 +969,11 @@ packages: /@babel/helper-validator-option@7.25.7: resolution: {integrity: sha512-ytbPLsm+GjArDYXJ8Ydr1c/KJuutjF2besPNbIZnZ6MKUxi/uTA22t2ymmA4WFjZFpjiAMO0xuuJPqK2nvDVfQ==} engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-validator-option@7.25.9: + resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==} + engines: {node: '>=6.9.0'} /@babel/helper-wrap-function@7.25.7: resolution: {integrity: sha512-MA0roW3JF2bD1ptAaJnvcabsVlNQShUaThyJbCDD4bCp8NEgiFvpoqRI2YS22hHlc2thjO/fTg2ShLMC3jygAg==} @@ -907,6 +1013,14 @@ packages: dependencies: '@babel/template': 7.25.7 '@babel/types': 7.25.7 + dev: true + + /@babel/helpers@7.26.0: + resolution: {integrity: sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.25.9 + '@babel/types': 7.26.0 /@babel/highlight@7.23.4: resolution: {integrity: sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==} @@ -924,6 +1038,7 @@ packages: chalk: 2.4.2 js-tokens: 4.0.0 picocolors: 1.0.0 + dev: true /@babel/parser@7.23.4: resolution: {integrity: sha512-vf3Xna6UEprW+7t6EtOmFpHNAuxw3xqPZghy+brsnusscJRW5BMUzzHZc5ICjULee81WeUV2jjakG09MDglJXQ==} @@ -945,6 +1060,14 @@ packages: hasBin: true dependencies: '@babel/types': 7.25.7 + dev: true + + /@babel/parser@7.26.1: + resolution: {integrity: sha512-reoQYNiAJreZNsJzyrDNzFQ+IQ5JFiIzAHJg9bn94S3l+4++J7RsIhNMoB+lgP/9tpmiAQqspv+xfdxTSzREOw==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.26.0 /@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.7(@babel/core@7.25.7): resolution: {integrity: sha512-UV9Lg53zyebzD1DwQoT9mzkEKa922LNUp5YkTJ6Uta0RbyXaQNUgcvSt7qIu1PpPzVb6rd10OVNTzkyBGeVmxQ==} @@ -2154,6 +2277,15 @@ packages: '@babel/code-frame': 7.25.7 '@babel/parser': 7.25.7 '@babel/types': 7.25.7 + dev: true + + /@babel/template@7.25.9: + resolution: {integrity: sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.26.0 + '@babel/parser': 7.26.1 + '@babel/types': 7.26.0 /@babel/traverse@7.23.2: resolution: {integrity: sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==} @@ -2185,7 +2317,7 @@ packages: '@babel/helper-split-export-declaration': 7.22.6 '@babel/parser': 7.23.4 '@babel/types': 7.23.4 - debug: 4.3.4 + debug: 4.3.7 globals: 11.12.0 transitivePeerDependencies: - supports-color @@ -2203,7 +2335,7 @@ packages: '@babel/helper-split-export-declaration': 7.22.6 '@babel/parser': 7.23.6 '@babel/types': 7.23.6 - debug: 4.3.6 + debug: 4.3.7 globals: 11.12.0 transitivePeerDependencies: - supports-color @@ -2217,7 +2349,22 @@ packages: '@babel/parser': 7.25.7 '@babel/template': 7.25.7 '@babel/types': 7.25.7 - debug: 4.3.6 + debug: 4.3.7 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/traverse@7.25.9: + resolution: {integrity: sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.26.0 + '@babel/generator': 7.26.0 + '@babel/parser': 7.26.1 + '@babel/template': 7.25.9 + '@babel/types': 7.26.0 + debug: 4.3.7 globals: 11.12.0 transitivePeerDependencies: - supports-color @@ -2252,6 +2399,14 @@ packages: '@babel/helper-string-parser': 7.25.7 '@babel/helper-validator-identifier': 7.25.7 to-fast-properties: 2.0.0 + dev: true + + /@babel/types@7.26.0: + resolution: {integrity: sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 /@base2/pretty-print-object@1.0.1: resolution: {integrity: sha512-4iri8i1AqYHJE2DstZYkyEprg6Pq6sKx3xn5FpySk9sNhH7qN2LLlHJCfDTZRILNwQNPD7mATWM0TBui7uC1pA==} @@ -2657,7 +2812,7 @@ packages: '@chakra-ui/react': 2.8.2(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(@types/react@18.2.0)(framer-motion@10.16.4)(react-dom@18.2.0)(react@18.2.0) '@emotion/cache': 11.11.0 '@emotion/react': 11.11.1(@types/react@18.2.0)(react@18.2.0) - next: 14.2.13(@babel/core@7.25.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.40.0)(react-dom@18.2.0)(react@18.2.0) + next: 14.2.13(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.40.0)(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 dev: false @@ -3161,6 +3316,15 @@ packages: react: 18.2.0 dev: false + /@chakra-ui/styled-system@2.12.0(react@18.2.0): + resolution: {integrity: sha512-zoqLw1I2y4GlZ0LDoyw8o0JjoDOW6u0IwFPAoHuw0UMbP8glHUGvwEL1STug/i/GzBKw83yoF6ae41HIQvhMww==} + dependencies: + '@chakra-ui/utils': 2.2.2(react@18.2.0) + csstype: 3.1.3 + transitivePeerDependencies: + - react + dev: false + /@chakra-ui/styled-system@2.9.2: resolution: {integrity: sha512-To/Z92oHpIE+4nk11uVMWqo2GGRS86coeMmjxtpnErmWRdLcp1WVCVRAvn+ZwpLiNR+reWFr2FFqJRsREuZdAg==} dependencies: @@ -3257,6 +3421,17 @@ packages: react: 18.2.0 dev: false + /@chakra-ui/theme-tools@2.1.2(@chakra-ui/styled-system@2.12.0): + resolution: {integrity: sha512-Qdj8ajF9kxY4gLrq7gA+Azp8CtFHGO9tWMN2wfF9aQNgG9AuMhPrUzMq9AMQ0MXiYcgNq/FD3eegB43nHVmXVA==} + peerDependencies: + '@chakra-ui/styled-system': '>=2.0.0' + dependencies: + '@chakra-ui/anatomy': 2.2.2 + '@chakra-ui/shared-utils': 2.0.5 + '@chakra-ui/styled-system': 2.12.0(react@18.2.0) + color2k: 2.0.2 + dev: false + /@chakra-ui/theme-tools@2.1.2(@chakra-ui/styled-system@2.9.2): resolution: {integrity: sha512-Qdj8ajF9kxY4gLrq7gA+Azp8CtFHGO9tWMN2wfF9aQNgG9AuMhPrUzMq9AMQ0MXiYcgNq/FD3eegB43nHVmXVA==} peerDependencies: @@ -3353,6 +3528,16 @@ packages: lodash.mergewith: 4.6.2 dev: false + /@chakra-ui/utils@2.2.2(react@18.2.0): + resolution: {integrity: sha512-jUPLT0JzRMWxpdzH6c+t0YMJYrvc5CLericgITV3zDSXblkfx3DsYXqU11DJTSGZI9dUKzM1Wd0Wswn4eJwvFQ==} + peerDependencies: + react: '>=16.8.0' + dependencies: + '@types/lodash.mergewith': 4.6.9 + lodash.mergewith: 4.6.2 + react: 18.2.0 + dev: false + /@chakra-ui/visually-hidden@2.2.0(@chakra-ui/system@2.6.2)(react@18.2.0): resolution: {integrity: sha512-KmKDg01SrQ7VbTD3+cPWf/UfpF5MSwm3v7MWi0n5t8HnnadT13MF0MJCDSXbBWnzLv1ZKJ6zlyAOeARWX+DpjQ==} peerDependencies: @@ -3549,11 +3734,11 @@ packages: engines: {node: '>=10.0.0'} dev: false - /@emnapi/runtime@1.3.0: - resolution: {integrity: sha512-XMBySMuNZs3DM96xcJmLW4EfGnf+uGmFNjzpehMjuX5PLB5j87ar2Zc4e3PVeZ3I5g3tYtAqskB28manlF69Zw==} + /@emnapi/runtime@1.3.1: + resolution: {integrity: sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw==} requiresBuild: true dependencies: - tslib: 2.6.2 + tslib: 2.8.0 dev: true optional: true @@ -3986,13 +4171,13 @@ packages: resolution: {integrity: sha512-PEVLoa3zBevWSCZzPIM/lvPCi8P5l4G+NXQMc/CjEiaCWgyHieUoo0nM7Bs0n/NbuQ6JpXEolivQ9pKSBHaDlA==} dependencies: '@formatjs/intl-localematcher': 0.5.2 - tslib: 2.6.2 + tslib: 2.8.0 dev: false /@formatjs/fast-memoize@2.2.0: resolution: {integrity: sha512-hnk/nY8FyrL5YxwP9e4r9dqeM6cAbo8PeU9UjyXojZMNvVad2Z06FAVHyR3Ecw6fza+0GH7vdJgiKIVXTMbSBA==} dependencies: - tslib: 2.6.2 + tslib: 2.8.0 dev: false /@formatjs/icu-messageformat-parser@2.7.3: @@ -4000,20 +4185,20 @@ packages: dependencies: '@formatjs/ecma402-abstract': 1.18.0 '@formatjs/icu-skeleton-parser': 1.7.0 - tslib: 2.6.2 + tslib: 2.8.0 dev: false /@formatjs/icu-skeleton-parser@1.7.0: resolution: {integrity: sha512-Cfdo/fgbZzpN/jlN/ptQVe0lRHora+8ezrEeg2RfrNjyp+YStwBy7cqDY8k5/z2LzXg6O0AdzAV91XS0zIWv+A==} dependencies: '@formatjs/ecma402-abstract': 1.18.0 - tslib: 2.6.2 + tslib: 2.8.0 dev: false /@formatjs/intl-localematcher@0.5.2: resolution: {integrity: sha512-txaaE2fiBMagLrR4jYhxzFO6wEdEG4TPMqrzBAcbr4HFUYzH/YC+lg6OIzKCHm8WgDdyQevxbAAV1OgcXctuGw==} dependencies: - tslib: 2.6.2 + tslib: 2.8.0 dev: false /@hirosystems/token-metadata-api-client@1.2.0: @@ -4199,7 +4384,7 @@ packages: cpu: [wasm32] requiresBuild: true dependencies: - '@emnapi/runtime': 1.3.0 + '@emnapi/runtime': 1.3.1 dev: true optional: true @@ -4714,7 +4899,7 @@ packages: next: ^13.0.0 || ^14.0.0 react: ^18.2.0 dependencies: - next: 14.2.13(@babel/core@7.25.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.40.0)(react-dom@18.2.0)(react@18.2.0) + next: 14.2.13(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.40.0)(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 third-party-capital: 1.0.20 dev: false @@ -4780,6 +4965,16 @@ packages: '@opentelemetry/semantic-conventions': 1.25.1 dev: false + /@opentelemetry/core@1.27.0(@opentelemetry/api@1.9.0): + resolution: {integrity: sha512-yQPKnK5e+76XuiqUH/gKyS8wv/7qITd5ln56QkBTf3uggr0VkXOXfcaAuG330UfdYu83wsyoBwqwxigpIG+Jkg==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/semantic-conventions': 1.27.0 + dev: false + /@opentelemetry/instrumentation-connect@0.38.0(@opentelemetry/api@1.9.0): resolution: {integrity: sha512-2/nRnx3pjYEmdPIaBwtgtSviTKHWnDZN3R+TkRUnhIVrvBKVcq+I5B2rtd6mr6Fe9cHlZ9Ojcuh7pkNh/xdWWg==} engines: {node: '>=14'} @@ -5055,6 +5250,17 @@ packages: '@opentelemetry/semantic-conventions': 1.25.1 dev: false + /@opentelemetry/resources@1.27.0(@opentelemetry/api@1.9.0): + resolution: {integrity: sha512-jOwt2VJ/lUD5BLc+PMNymDrUCpm5PKi1E9oSVYAvz01U/VdndGmrtV3DU1pG4AwlYhJRHbHfOUIlpBeXCPw6QQ==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.27.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.27.0 + dev: false + /@opentelemetry/sdk-metrics@1.25.1(@opentelemetry/api@1.9.0): resolution: {integrity: sha512-9Mb7q5ioFL4E4dDrc4wC/A3NTHDat44v4I3p2pLPSxRvqUbDIQyMVr9uK+EU69+HWhlET1VaSrRzwdckWqY15Q==} engines: {node: '>=14'} @@ -5079,6 +5285,18 @@ packages: '@opentelemetry/semantic-conventions': 1.25.1 dev: false + /@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0): + resolution: {integrity: sha512-btz6XTQzwsyJjombpeqCX6LhiMQYpzt2pIYNPnw0IPO/3AhT6yjnf8Mnv3ZC2A4eRYOjqrg+bfaXg9XHDRJDWQ==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.27.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.27.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.27.0 + dev: false + /@opentelemetry/semantic-conventions@1.25.1: resolution: {integrity: sha512-ZDjMJJQRlyk8A1KZFCc+bCbsyrn1wTwdNt56F7twdfUfnHUZUq77/WfONCj8p72NZOyP7pNTdUWSTYC3GTbuuQ==} engines: {node: '>=14'} @@ -5089,6 +5307,11 @@ packages: engines: {node: '>=14'} dev: false + /@opentelemetry/semantic-conventions@1.27.0: + resolution: {integrity: sha512-sAay1RrB+ONOem0OZanAR1ZI/k7yDpnOQSQmTMuGImUQb2y8EbSaCJ94FQluM74xoU03vlb2d2U90hZluL6nQg==} + engines: {node: '>=14'} + dev: false + /@opentelemetry/sql-common@0.40.1(@opentelemetry/api@1.9.0): resolution: {integrity: sha512-nSDlnHSqzC3pXn/wZEZVLuAuJ1MYMXPBwtv2qAbCa3847SaHItdE7SzUq/Jtb0KZmh1zfAbNi3AAMjztTT4Ugg==} engines: {node: '>=14'} @@ -5136,7 +5359,7 @@ packages: dependencies: playwright: 1.40.0 - /@pmmmwh/react-refresh-webpack-plugin@0.5.15(react-refresh@0.14.2)(webpack@5.94.0): + /@pmmmwh/react-refresh-webpack-plugin@0.5.15(react-refresh@0.14.2)(webpack@5.95.0): resolution: {integrity: sha512-LFWllMA55pzB9D34w/wXUCf8+c+IYKuJDgxiZ3qMhl64KRMBHYM1I3VdGaD2BV5FNPV2/S2596bppxHbv2ZydQ==} engines: {node: '>= 10.13'} peerDependencies: @@ -5170,7 +5393,7 @@ packages: react-refresh: 0.14.2 schema-utils: 4.2.0 source-map: 0.7.4 - webpack: 5.94.0(esbuild@0.23.1) + webpack: 5.95.0(esbuild@0.23.1) dev: true /@polka/url@1.0.0-next.25: @@ -6468,7 +6691,7 @@ packages: reselect: 4.1.8 dev: false - /@rollup/plugin-babel@6.0.4(@babel/core@7.25.7): + /@rollup/plugin-babel@6.0.4(@babel/core@7.26.0): resolution: {integrity: sha512-YF7Y52kFdFT/xVSuVdjkV5ZdX/3YtmX0QulG+x0taQOtJdHYzVU61aSSkAgVJ7NOv6qPkIYiJSgSWWN/DM5sGw==} engines: {node: '>=14.0.0'} peerDependencies: @@ -6481,7 +6704,7 @@ packages: rollup: optional: true dependencies: - '@babel/core': 7.25.7 + '@babel/core': 7.26.0 '@babel/helper-module-imports': 7.22.15 '@rollup/pluginutils': 5.0.5(rollup@3.29.4) dev: false @@ -6701,7 +6924,7 @@ packages: '@sentry/utils': 8.26.0 dev: false - /@sentry/nextjs@8.26.0(@opentelemetry/api@1.9.0)(@opentelemetry/core@1.25.1)(@opentelemetry/instrumentation@0.52.1)(@opentelemetry/sdk-trace-base@1.25.1)(next@14.2.13)(react@18.2.0)(webpack@5.94.0): + /@sentry/nextjs@8.26.0(@opentelemetry/api@1.9.0)(@opentelemetry/core@1.27.0)(@opentelemetry/instrumentation@0.52.1)(@opentelemetry/sdk-trace-base@1.27.0)(next@14.2.13)(react@18.2.0)(webpack@5.95.0): resolution: {integrity: sha512-FO4xtYRpmtKpVt9kJsdcL73SoJbFkfZbHONh2kvGalCa06w8DCdHuzYvPgKaf8UcjEixeb0qiM9ncmPpoDsnHA==} engines: {node: '>=14.18'} peerDependencies: @@ -6716,18 +6939,18 @@ packages: '@rollup/plugin-commonjs': 26.0.1(rollup@3.29.4) '@sentry/core': 8.26.0 '@sentry/node': 8.26.0 - '@sentry/opentelemetry': 8.26.0(@opentelemetry/api@1.9.0)(@opentelemetry/core@1.25.1)(@opentelemetry/instrumentation@0.52.1)(@opentelemetry/sdk-trace-base@1.25.1)(@opentelemetry/semantic-conventions@1.26.0) + '@sentry/opentelemetry': 8.26.0(@opentelemetry/api@1.9.0)(@opentelemetry/core@1.27.0)(@opentelemetry/instrumentation@0.52.1)(@opentelemetry/sdk-trace-base@1.27.0)(@opentelemetry/semantic-conventions@1.26.0) '@sentry/react': 8.26.0(react@18.2.0) '@sentry/types': 8.26.0 '@sentry/utils': 8.26.0 '@sentry/vercel-edge': 8.26.0 - '@sentry/webpack-plugin': 2.20.1(webpack@5.94.0) + '@sentry/webpack-plugin': 2.20.1(webpack@5.95.0) chalk: 3.0.0 - next: 14.2.13(@babel/core@7.25.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.40.0)(react-dom@18.2.0)(react@18.2.0) + next: 14.2.13(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.40.0)(react-dom@18.2.0)(react@18.2.0) resolve: 1.22.8 rollup: 3.29.4 stacktrace-parser: 0.1.10 - webpack: 5.94.0(esbuild@0.23.1) + webpack: 5.95.0(esbuild@0.23.1) transitivePeerDependencies: - '@opentelemetry/api' - '@opentelemetry/core' @@ -6797,6 +7020,26 @@ packages: '@sentry/utils': 8.26.0 dev: false + /@sentry/opentelemetry@8.26.0(@opentelemetry/api@1.9.0)(@opentelemetry/core@1.27.0)(@opentelemetry/instrumentation@0.52.1)(@opentelemetry/sdk-trace-base@1.27.0)(@opentelemetry/semantic-conventions@1.26.0): + resolution: {integrity: sha512-HBDheM/+ysfIz8R1OH4bBIxdgD7ZbQkKLJAUXkdAbBcfbpK/CTtwcplbauF5wY7Q+GYvwL/ShuDwvXRfW+gFyQ==} + engines: {node: '>=14.18'} + peerDependencies: + '@opentelemetry/api': ^1.9.0 + '@opentelemetry/core': ^1.25.1 + '@opentelemetry/instrumentation': ^0.52.1 + '@opentelemetry/sdk-trace-base': ^1.25.1 + '@opentelemetry/semantic-conventions': ^1.25.1 + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.27.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 1.27.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.26.0 + '@sentry/core': 8.26.0 + '@sentry/types': 8.26.0 + '@sentry/utils': 8.26.0 + dev: false + /@sentry/react@8.26.0(react@18.2.0): resolution: {integrity: sha512-dYoC0xzcqq8zmNMFoTWidhA7mVd3RDz/nAUn6C8yK/hkKA7bUknYCkhpESGLZfHaGwSKzeXRXKd/o/cgUVM9eA==} engines: {node: '>=14.18'} @@ -6832,7 +7075,7 @@ packages: '@sentry/utils': 8.26.0 dev: false - /@sentry/webpack-plugin@2.20.1(webpack@5.94.0): + /@sentry/webpack-plugin@2.20.1(webpack@5.95.0): resolution: {integrity: sha512-U6LzoE09Ndt0OCWROoRaZqqIHGxyMRdKpBhbqoBqyyfVwXN/zGW3I/cWZ1e8rreiKFj+2+c7+X0kOS+NGMTUrg==} engines: {node: '>= 14'} peerDependencies: @@ -6841,7 +7084,7 @@ packages: '@sentry/bundler-plugin-core': 2.20.1 unplugin: 1.0.1 uuid: 9.0.1 - webpack: 5.94.0(esbuild@0.23.1) + webpack: 5.95.0(esbuild@0.23.1) transitivePeerDependencies: - encoding - supports-color @@ -6879,8 +7122,8 @@ packages: '@sinonjs/commons': 1.8.6 dev: true - /@socket.io/component-emitter@3.1.0: - resolution: {integrity: sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==} + /@socket.io/component-emitter@3.1.2: + resolution: {integrity: sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==} dev: false /@stacks/auth@6.15.0: @@ -6931,14 +7174,14 @@ packages: resolution: {integrity: sha512-TMpyBvtYU/Irc9u9PDb8mqKSQHVgGQKIZvzZF58Rg60xQ038bJ8JEqmxrGnP5sEPbyUEBH3BX5fcvkRCokww6g==} dependencies: '@types/bn.js': 5.1.5 - '@types/node': 18.18.12 + '@types/node': 18.19.60 dev: false /@stacks/common@6.8.1: resolution: {integrity: sha512-ewL9GLZNQYa5a/3K4xSHlHIgHkD4rwWW/QEaPId8zQIaL+1O9qCaF4LX9orNQeOmEk8kvG0x2xGV54fXKCZeWQ==} dependencies: '@types/bn.js': 5.1.5 - '@types/node': 18.18.12 + '@types/node': 18.19.60 dev: false /@stacks/connect-react@22.4.2(react-dom@18.2.0)(react@18.2.0): @@ -6988,7 +7231,7 @@ packages: varuint-bitcoin: 1.1.2 dev: false - /@stacks/eslint-config@2.0.0(eslint-plugin-import@2.29.0)(eslint-plugin-prettier@5.0.1)(eslint-plugin-unused-imports@3.0.0)(eslint@8.54.0)(typescript@5.3.2): + /@stacks/eslint-config@2.0.0(eslint-plugin-import@2.29.0)(eslint-plugin-prettier@5.0.1)(eslint-plugin-unused-imports@4.1.4)(eslint@8.54.0)(typescript@5.3.2): resolution: {integrity: sha512-GrRiJE7nadre+wCGAkaxCmHGD8tEYOtVW/cjjMdh/H37yl3vGj/lX723MfiXj/YcQDJ1qs/8V9Rx9b4VsFp10Q==} peerDependencies: eslint: 8.54.0 @@ -7004,7 +7247,7 @@ packages: eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.12.0)(eslint-plugin-import@2.29.0)(eslint@8.54.0) eslint-plugin-import: 2.29.0(@typescript-eslint/parser@6.12.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.54.0) eslint-plugin-prettier: 5.0.1(eslint@8.54.0)(prettier@3.1.0) - eslint-plugin-unused-imports: 3.0.0(eslint@8.54.0) + eslint-plugin-unused-imports: 4.1.4(eslint@8.54.0) transitivePeerDependencies: - eslint-import-resolver-node - eslint-import-resolver-webpack @@ -7438,7 +7681,7 @@ packages: recast: 0.23.9 semver: 7.6.3 util: 0.12.5 - ws: 8.16.0 + ws: 8.17.1 transitivePeerDependencies: - bufferutil - supports-color @@ -7513,7 +7756,7 @@ packages: storybook: 8.3.5 dev: true - /@storybook/nextjs@8.3.5(esbuild@0.23.1)(next@14.2.13)(react-dom@18.2.0)(react@18.2.0)(storybook@8.3.5)(typescript@5.3.2)(webpack@5.94.0): + /@storybook/nextjs@8.3.5(esbuild@0.23.1)(next@14.2.13)(react-dom@18.2.0)(react@18.2.0)(storybook@8.3.5)(typescript@5.3.2)(webpack@5.95.0): resolution: {integrity: sha512-YMjDSVd7BHIvj6oLMEFMKRvfZ83INxZinxtrx4ZZXGe+5iP8j7rcV7D67lxKQKWNy36d9Foj4pjT85yYj5s+ZQ==} engines: {node: '>=18.0.0'} peerDependencies: @@ -7542,38 +7785,38 @@ packages: '@babel/preset-react': 7.25.7(@babel/core@7.25.7) '@babel/preset-typescript': 7.25.7(@babel/core@7.25.7) '@babel/runtime': 7.25.7 - '@pmmmwh/react-refresh-webpack-plugin': 0.5.15(react-refresh@0.14.2)(webpack@5.94.0) + '@pmmmwh/react-refresh-webpack-plugin': 0.5.15(react-refresh@0.14.2)(webpack@5.95.0) '@storybook/builder-webpack5': 8.3.5(esbuild@0.23.1)(storybook@8.3.5)(typescript@5.3.2) '@storybook/preset-react-webpack': 8.3.5(@storybook/test@8.3.5)(esbuild@0.23.1)(react-dom@18.2.0)(react@18.2.0)(storybook@8.3.5)(typescript@5.3.2) '@storybook/react': 8.3.5(@storybook/test@8.3.5)(react-dom@18.2.0)(react@18.2.0)(storybook@8.3.5)(typescript@5.3.2) '@storybook/test': 8.3.5(storybook@8.3.5) '@types/node': 22.7.4 '@types/semver': 7.5.6 - babel-loader: 9.2.1(@babel/core@7.25.7)(webpack@5.94.0) - css-loader: 6.11.0(webpack@5.94.0) + babel-loader: 9.2.1(@babel/core@7.25.7)(webpack@5.95.0) + css-loader: 6.11.0(webpack@5.95.0) find-up: 5.0.0 fs-extra: 11.2.0 image-size: 1.1.1 loader-utils: 3.3.1 - next: 14.2.13(@babel/core@7.25.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.40.0)(react-dom@18.2.0)(react@18.2.0) - node-polyfill-webpack-plugin: 2.0.1(webpack@5.94.0) + next: 14.2.13(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.40.0)(react-dom@18.2.0)(react@18.2.0) + node-polyfill-webpack-plugin: 2.0.1(webpack@5.95.0) pnp-webpack-plugin: 1.7.0(typescript@5.3.2) postcss: 8.4.47 - postcss-loader: 8.1.1(postcss@8.4.47)(typescript@5.3.2)(webpack@5.94.0) + postcss-loader: 8.1.1(postcss@8.4.47)(typescript@5.3.2)(webpack@5.95.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) react-refresh: 0.14.2 resolve-url-loader: 5.0.0 - sass-loader: 13.3.3(webpack@5.94.0) + sass-loader: 13.3.3(webpack@5.95.0) semver: 7.5.4 storybook: 8.3.5 - style-loader: 3.3.4(webpack@5.94.0) + style-loader: 3.3.4(webpack@5.95.0) styled-jsx: 5.1.6(@babel/core@7.25.7)(react@18.2.0) ts-dedent: 2.2.0 tsconfig-paths: 4.2.0 tsconfig-paths-webpack-plugin: 4.1.0 typescript: 5.3.2 - webpack: 5.94.0(esbuild@0.23.1) + webpack: 5.95.0(esbuild@0.23.1) optionalDependencies: sharp: 0.33.5 transitivePeerDependencies: @@ -7648,13 +7891,13 @@ packages: typescript: '>= 4.x' webpack: '>= 4' dependencies: - debug: 4.3.6 + debug: 4.3.7 endent: 2.1.0 find-cache-dir: 3.3.2 flat-cache: 3.2.0 micromatch: 4.0.5 react-docgen-typescript: 2.2.2(typescript@5.3.2) - tslib: 2.6.2 + tslib: 2.8.0 typescript: 5.3.2 webpack: 5.94.0(esbuild@0.23.1) transitivePeerDependencies: @@ -7758,14 +8001,14 @@ packages: /@swc/helpers@0.4.14: resolution: {integrity: sha512-4C7nX/dvpzB7za4Ql9K81xK3HPxCpHMgwTZVyf+9JQ6VUbn9jjZVN7/Nkdz/Ugzs2CSjqnL/UPXroiVBVHUWUw==} dependencies: - tslib: 2.6.2 + tslib: 2.8.0 dev: false /@swc/helpers@0.4.36: resolution: {integrity: sha512-5lxnyLEYFskErRPenYItLRSge5DjrJngYKdVjRSrWfza9G6KkgHEXi0vUZiyUeMU5JfXH1YnvXZzSp8ul88o2Q==} dependencies: legacy-swc-helpers: /@swc/helpers@0.4.14 - tslib: 2.6.2 + tslib: 2.8.0 dev: false /@swc/helpers@0.5.3: @@ -8044,6 +8287,9 @@ packages: /@types/estree@1.0.5: resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + /@types/estree@1.0.6: + resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} + /@types/express-serve-static-core@4.17.41: resolution: {integrity: sha512-OaJ7XLaelTgrvlZD8/aa0vvvxZdUmlCn6MtWeB7TkiKW70BQLc9XEPpDLPdbo52ZhXUCrznlWdCHWxJWtdyajA==} dependencies: @@ -8155,9 +8401,19 @@ packages: '@types/lodash': 4.14.202 dev: false + /@types/lodash.mergewith@4.6.9: + resolution: {integrity: sha512-fgkoCAOF47K7sxrQ7Mlud2TH023itugZs2bUg8h/KzT+BnZNrR2jAOmaokbLunHNnobXVWOezAeNn/lZqwxkcw==} + dependencies: + '@types/lodash': 4.17.12 + dev: false + /@types/lodash@4.14.202: resolution: {integrity: sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ==} + /@types/lodash@4.17.12: + resolution: {integrity: sha512-sviUmCE8AYdaF/KIHLDJBQgeYzPBI0vf/17NaYehBJfYD1j6/L95Slh07NlyK2iNyBNaEkb3En2jRt+a8y3xZQ==} + dev: false + /@types/mdx@2.0.13: resolution: {integrity: sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==} dev: true @@ -8186,6 +8442,12 @@ packages: undici-types: 5.26.5 dev: false + /@types/node@18.19.60: + resolution: {integrity: sha512-cYRj7igVqgxhlHFdBHHpU2SNw3+dN2x0VTZJtLYk6y/ieuGN4XiBgtDjYVktM/yk2y/8pKMileNc6IoEzEJnUw==} + dependencies: + undici-types: 5.26.5 + dev: false + /@types/node@20.9.4: resolution: {integrity: sha512-wmyg8HUhcn6ACjsn8oKYjkN/zUzQeNtMy44weTJSM6p4MMzEOuKbA3OjJ267uPCOW7Xex9dyrNTful8XTQYoDA==} dependencies: @@ -8438,7 +8700,7 @@ packages: dependencies: '@typescript-eslint/typescript-estree': 6.12.0(typescript@5.3.2) '@typescript-eslint/utils': 6.12.0(eslint@8.54.0)(typescript@5.3.2) - debug: 4.3.4 + debug: 4.3.7 eslint: 8.54.0 ts-api-utils: 1.0.3(typescript@5.3.2) typescript: 5.3.2 @@ -8466,7 +8728,7 @@ packages: dependencies: '@typescript-eslint/types': 5.62.0 '@typescript-eslint/visitor-keys': 5.62.0 - debug: 4.3.6 + debug: 4.3.7 globby: 11.1.0 is-glob: 4.0.3 semver: 7.6.3 @@ -8487,7 +8749,7 @@ packages: dependencies: '@typescript-eslint/types': 6.12.0 '@typescript-eslint/visitor-keys': 6.12.0 - debug: 4.3.4 + debug: 4.3.7 globby: 11.1.0 is-glob: 4.0.3 semver: 7.5.4 @@ -8766,6 +9028,13 @@ packages: dependencies: acorn: 8.12.1 + /acorn-import-attributes@1.9.5(acorn@8.14.0): + resolution: {integrity: sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==} + peerDependencies: + acorn: ^8 + dependencies: + acorn: 8.14.0 + /acorn-jsx@5.3.2(acorn@7.4.1): resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: @@ -8806,6 +9075,11 @@ packages: engines: {node: '>=0.4.0'} hasBin: true + /acorn@8.14.0: + resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} + engines: {node: '>=0.4.0'} + hasBin: true + /adjust-sourcemap-loader@4.0.0: resolution: {integrity: sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==} engines: {node: '>=8.9'} @@ -8818,7 +9092,7 @@ packages: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} engines: {node: '>= 6.0.0'} dependencies: - debug: 4.3.4 + debug: 4.3.7 transitivePeerDependencies: - supports-color @@ -8948,7 +9222,7 @@ packages: resolution: {integrity: sha512-xcLxITLe2HYa1cnYnwCjkOO1PqUHQpozB8x9AR0OgWN2woOBi5kSDVxKfd0b7sb1hw5qFeJhXm9H1nu3xSfLeQ==} engines: {node: '>=10'} dependencies: - tslib: 2.6.2 + tslib: 2.8.0 dev: false /aria-query@5.1.3: @@ -8966,7 +9240,7 @@ packages: /array-buffer-byte-length@1.0.0: resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==} dependencies: - call-bind: 1.0.5 + call-bind: 1.0.7 is-array-buffer: 3.0.2 /array-flatten@1.1.1: @@ -9021,11 +9295,11 @@ packages: /array.prototype.tosorted@1.1.2: resolution: {integrity: sha512-HuQCHOlk1Weat5jzStICBCd83NxiIMwqDg/dHEsoefabn/hJRj5pVdWcPUSpRrwhwxZOsQassMpgN/xRYFBMIg==} dependencies: - call-bind: 1.0.5 + call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.22.3 es-shim-unscopables: 1.0.2 - get-intrinsic: 1.2.2 + get-intrinsic: 1.2.4 dev: true /arraybuffer.prototype.slice@1.0.2: @@ -9033,10 +9307,10 @@ packages: engines: {node: '>= 0.4'} dependencies: array-buffer-byte-length: 1.0.0 - call-bind: 1.0.5 + call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.22.3 - get-intrinsic: 1.2.2 + get-intrinsic: 1.2.4 is-array-buffer: 3.0.2 is-shared-array-buffer: 1.0.2 @@ -9076,7 +9350,7 @@ packages: resolution: {integrity: sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==} engines: {node: '>=4'} dependencies: - tslib: 2.6.2 + tslib: 2.8.0 dev: true /astral-regex@2.0.0: @@ -9157,7 +9431,7 @@ packages: - supports-color dev: true - /babel-loader@9.2.1(@babel/core@7.25.7)(webpack@5.94.0): + /babel-loader@9.2.1(@babel/core@7.25.7)(webpack@5.95.0): resolution: {integrity: sha512-fqe8naHt46e0yIdkjUZYqddSXfej3AHajX+CSO5X7oy0EmPc6o5Xh+RClNoHjnieWz9AW4kZxW9yyFMhVB1QLA==} engines: {node: '>= 14.15.0'} peerDependencies: @@ -9167,7 +9441,7 @@ packages: '@babel/core': 7.25.7 find-cache-dir: 4.0.0 schema-utils: 4.2.0 - webpack: 5.94.0(esbuild@0.23.1) + webpack: 5.95.0(esbuild@0.23.1) dev: true /babel-plugin-istanbul@6.1.1: @@ -9458,6 +9732,17 @@ packages: electron-to-chromium: 1.5.32 node-releases: 2.0.18 update-browserslist-db: 1.1.1(browserslist@4.24.0) + dev: true + + /browserslist@4.24.2: + resolution: {integrity: sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + dependencies: + caniuse-lite: 1.0.30001673 + electron-to-chromium: 1.5.48 + node-releases: 2.0.18 + update-browserslist-db: 1.1.1(browserslist@4.24.2) /bs58@5.0.0: resolution: {integrity: sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ==} @@ -9522,8 +9807,8 @@ packages: resolution: {integrity: sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==} dependencies: function-bind: 1.1.2 - get-intrinsic: 1.2.2 - set-function-length: 1.1.1 + get-intrinsic: 1.2.4 + set-function-length: 1.2.2 /call-bind@1.0.7: resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} @@ -9543,7 +9828,7 @@ packages: resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==} dependencies: pascal-case: 3.1.2 - tslib: 2.6.2 + tslib: 2.8.0 dev: true /camelcase-keys@6.2.2: @@ -9575,6 +9860,9 @@ packages: /caniuse-lite@1.0.30001667: resolution: {integrity: sha512-7LTwJjcRkzKFmtqGsibMeuXmvFDfZq/nzIjnmgCGzKKRVzjD72selLDK1oPF/Oxzmt4fNcPvTDvGqSDG4tCALw==} + /caniuse-lite@1.0.30001673: + resolution: {integrity: sha512-WTrjUCSMp3LYX0nE12ECkV0a+e6LC85E0Auz75555/qr78Oc8YWhEPNfDd6SHdtlCMSzqtuXY0uyEMNRcsKpKw==} + /case-sensitive-paths-webpack-plugin@2.4.0: resolution: {integrity: sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw==} engines: {node: '>=4'} @@ -10082,6 +10370,29 @@ packages: webpack: 5.94.0(esbuild@0.23.1) dev: true + /css-loader@6.11.0(webpack@5.95.0): + resolution: {integrity: sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==} + engines: {node: '>= 12.13.0'} + peerDependencies: + '@rspack/core': 0.x || 1.x + webpack: ^5.0.0 + peerDependenciesMeta: + '@rspack/core': + optional: true + webpack: + optional: true + dependencies: + icss-utils: 5.1.0(postcss@8.4.47) + postcss: 8.4.47 + postcss-modules-extract-imports: 3.1.0(postcss@8.4.47) + postcss-modules-local-by-default: 4.0.5(postcss@8.4.47) + postcss-modules-scope: 3.2.0(postcss@8.4.47) + postcss-modules-values: 4.0.0(postcss@8.4.47) + postcss-value-parser: 4.2.0 + semver: 7.5.4 + webpack: 5.95.0(esbuild@0.23.1) + dev: true + /css-select@4.3.0: resolution: {integrity: sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==} dependencies: @@ -10271,6 +10582,18 @@ packages: optional: true dependencies: ms: 2.1.2 + dev: true + + /debug@4.3.7: + resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.3 /decamelize-keys@1.1.1: resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} @@ -10307,9 +10630,9 @@ packages: engines: {node: '>= 0.4'} dependencies: array-buffer-byte-length: 1.0.0 - call-bind: 1.0.5 + call-bind: 1.0.7 es-get-iterator: 1.1.3 - get-intrinsic: 1.2.2 + get-intrinsic: 1.2.4 is-arguments: 1.1.1 is-array-buffer: 3.0.2 is-date-object: 1.0.5 @@ -10320,7 +10643,7 @@ packages: object-keys: 1.1.1 object.assign: 4.1.4 regexp.prototype.flags: 1.5.1 - side-channel: 1.0.4 + side-channel: 1.0.6 which-boxed-primitive: 1.0.2 which-collection: 1.0.1 which-typed-array: 1.1.13 @@ -10357,14 +10680,6 @@ packages: titleize: 3.0.0 dev: true - /define-data-property@1.1.1: - resolution: {integrity: sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==} - engines: {node: '>= 0.4'} - dependencies: - get-intrinsic: 1.2.2 - gopd: 1.0.1 - has-property-descriptors: 1.0.1 - /define-data-property@1.1.4: resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} engines: {node: '>= 0.4'} @@ -10387,8 +10702,8 @@ packages: resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} engines: {node: '>= 0.4'} dependencies: - define-data-property: 1.1.1 - has-property-descriptors: 1.0.1 + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 object-keys: 1.1.1 /delayed-stream@1.0.0: @@ -10531,7 +10846,7 @@ packages: resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} dependencies: no-case: 3.0.4 - tslib: 2.6.2 + tslib: 2.8.0 dev: true /dot-prop@5.3.0: @@ -10572,6 +10887,10 @@ packages: /electron-to-chromium@1.5.32: resolution: {integrity: sha512-M+7ph0VGBQqqpTT2YrabjNKSQ2fEl9PVx6AK3N558gDH9NO8O6XN9SXXFWRo9u9PbEg/bWq+tjXQr+eXmxubCw==} + dev: true + + /electron-to-chromium@1.5.48: + resolution: {integrity: sha512-FXULnNK7ACNI9MTMOVAzUGiz/YrK9Kcb0s/JT4aJgsam7Eh6XYe7Y6q95lPq+VdBe1DpT2eTnfXFtnuPGCks4w==} /elliptic@6.5.7: resolution: {integrity: sha512-ESVCtTwiA+XhY3wyh24QqRGBoP3rEdDUl3EDUUo9tft074fi19IrdpH7hLCMMP3CIj7jb3W96rn8lt/BqIlt5Q==} @@ -10613,13 +10932,13 @@ packages: objectorarray: 1.0.5 dev: true - /engine.io-client@6.5.3: - resolution: {integrity: sha512-9Z0qLB0NIisTRt1DZ/8U2k12RJn8yls/nXMZLn+/N8hANT3TcYjKFKcwbw5zFQiN4NTde3TSY9zb79e1ij6j9Q==} + /engine.io-client@6.5.4: + resolution: {integrity: sha512-GeZeeRjpD2qf49cZQ0Wvh/8NJNfeXkXXcoGh+F77oEAgo9gUHwT1fCRxSNU+YEEaysOJTnsFHmM5oAcPy4ntvQ==} dependencies: - '@socket.io/component-emitter': 3.1.0 - debug: 4.3.4 - engine.io-parser: 5.2.1 - ws: 8.11.0 + '@socket.io/component-emitter': 3.1.2 + debug: 4.3.7 + engine.io-parser: 5.2.3 + ws: 8.17.1 xmlhttprequest-ssl: 2.0.0 transitivePeerDependencies: - bufferutil @@ -10627,8 +10946,8 @@ packages: - utf-8-validate dev: false - /engine.io-parser@5.2.1: - resolution: {integrity: sha512-9JktcM3u18nU9N2Lz3bWeBgxVgOKpw7yhRaoxQA3FUDZzzw+9WlA6p4G4u0RixNkg14fH7EfEc/RhpurtiROTQ==} + /engine.io-parser@5.2.3: + resolution: {integrity: sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==} engines: {node: '>=10.0.0'} dev: false @@ -10686,15 +11005,15 @@ packages: array-buffer-byte-length: 1.0.0 arraybuffer.prototype.slice: 1.0.2 available-typed-arrays: 1.0.5 - call-bind: 1.0.5 + call-bind: 1.0.7 es-set-tostringtag: 2.0.2 es-to-primitive: 1.2.1 function.prototype.name: 1.1.6 - get-intrinsic: 1.2.2 + get-intrinsic: 1.2.4 get-symbol-description: 1.0.0 globalthis: 1.0.3 gopd: 1.0.1 - has-property-descriptors: 1.0.1 + has-property-descriptors: 1.0.2 has-proto: 1.0.1 has-symbols: 1.0.3 hasown: 2.0.0 @@ -10736,8 +11055,8 @@ packages: /es-get-iterator@1.1.3: resolution: {integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==} dependencies: - call-bind: 1.0.5 - get-intrinsic: 1.2.2 + call-bind: 1.0.7 + get-intrinsic: 1.2.4 has-symbols: 1.0.3 is-arguments: 1.1.1 is-map: 2.0.2 @@ -10751,12 +11070,12 @@ packages: resolution: {integrity: sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g==} dependencies: asynciterator.prototype: 1.0.0 - call-bind: 1.0.5 + call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.22.3 es-set-tostringtag: 2.0.2 function-bind: 1.1.2 - get-intrinsic: 1.2.2 + get-intrinsic: 1.2.4 globalthis: 1.0.3 has-property-descriptors: 1.0.1 has-proto: 1.0.1 @@ -10773,7 +11092,7 @@ packages: resolution: {integrity: sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==} engines: {node: '>= 0.4'} dependencies: - get-intrinsic: 1.2.2 + get-intrinsic: 1.2.4 has-tostringtag: 1.0.0 hasown: 2.0.0 @@ -10795,7 +11114,7 @@ packages: peerDependencies: esbuild: '>=0.12 <1' dependencies: - debug: 4.3.6 + debug: 4.3.7 esbuild: 0.23.1 transitivePeerDependencies: - supports-color @@ -11143,23 +11462,16 @@ packages: - typescript dev: true - /eslint-plugin-unused-imports@3.0.0(eslint@8.54.0): - resolution: {integrity: sha512-sduiswLJfZHeeBJ+MQaG+xYzSWdRXoSw61DpU13mzWumCkR0ufD0HmO4kdNokjrkluMHpj/7PJeN35pgbhW3kw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + /eslint-plugin-unused-imports@4.1.4(eslint@8.54.0): + resolution: {integrity: sha512-YptD6IzQjDardkl0POxnnRBhU1OEePMV0nd6siHaRBbd+lyh6NAhFEobiznKU7kTsSsDeSD62Pe7kAM1b7dAZQ==} peerDependencies: - '@typescript-eslint/eslint-plugin': ^6.0.0 + '@typescript-eslint/eslint-plugin': ^8.0.0-0 || ^7.0.0 || ^6.0.0 || ^5.0.0 eslint: 8.54.0 peerDependenciesMeta: '@typescript-eslint/eslint-plugin': optional: true dependencies: eslint: 8.54.0 - eslint-rule-composer: 0.3.0 - dev: true - - /eslint-rule-composer@0.3.0: - resolution: {integrity: sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg==} - engines: {node: '>=4.0.0'} dev: true /eslint-scope@5.1.1: @@ -11532,7 +11844,7 @@ packages: resolution: {integrity: sha512-a8Ge6cdKh9za/GZR/qtigTAk7SrGore56EFcoMshClsh7FLk1zwszc/ltuMfKhx56qeuyL/jWQ4J4axou0iJ9w==} engines: {node: '>=10'} dependencies: - tslib: 2.6.2 + tslib: 2.8.0 dev: false /follow-redirects@1.15.6: @@ -11705,7 +12017,7 @@ packages: resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.5 + call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.22.3 functions-have-names: 1.2.3 @@ -11767,8 +12079,8 @@ packages: resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.5 - get-intrinsic: 1.2.2 + call-bind: 1.0.7 + get-intrinsic: 1.2.4 /get-tsconfig@4.7.2: resolution: {integrity: sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==} @@ -11928,7 +12240,8 @@ packages: /has-property-descriptors@1.0.1: resolution: {integrity: sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==} dependencies: - get-intrinsic: 1.2.2 + get-intrinsic: 1.2.4 + dev: true /has-property-descriptors@1.0.2: resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} @@ -12116,7 +12429,7 @@ packages: dependencies: '@tootallnate/once': 2.0.0 agent-base: 6.0.2 - debug: 4.3.4 + debug: 4.3.7 transitivePeerDependencies: - supports-color dev: true @@ -12134,7 +12447,7 @@ packages: engines: {node: '>= 6'} dependencies: agent-base: 6.0.2 - debug: 4.3.4 + debug: 4.3.7 transitivePeerDependencies: - supports-color @@ -12258,9 +12571,9 @@ packages: resolution: {integrity: sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==} engines: {node: '>= 0.4'} dependencies: - get-intrinsic: 1.2.2 + get-intrinsic: 1.2.4 hasown: 2.0.0 - side-channel: 1.0.4 + side-channel: 1.0.6 /internmap@2.0.3: resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} @@ -12273,7 +12586,7 @@ packages: '@formatjs/ecma402-abstract': 1.18.0 '@formatjs/fast-memoize': 2.2.0 '@formatjs/icu-messageformat-parser': 2.7.3 - tslib: 2.6.2 + tslib: 2.8.0 dev: false /invariant@2.2.4: @@ -12319,8 +12632,8 @@ packages: /is-array-buffer@3.0.2: resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} dependencies: - call-bind: 1.0.5 - get-intrinsic: 1.2.2 + call-bind: 1.0.7 + get-intrinsic: 1.2.4 is-typed-array: 1.1.12 /is-arrayish@0.2.1: @@ -12354,7 +12667,7 @@ packages: resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.5 + call-bind: 1.0.7 has-tostringtag: 1.0.0 /is-callable@1.2.7: @@ -12391,7 +12704,7 @@ packages: /is-finalizationregistry@1.0.2: resolution: {integrity: sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==} dependencies: - call-bind: 1.0.5 + call-bind: 1.0.7 dev: true /is-fullwidth-code-point@3.0.0: @@ -12487,7 +12800,7 @@ packages: resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.5 + call-bind: 1.0.7 has-tostringtag: 1.0.0 /is-regexp@1.0.0: @@ -12502,7 +12815,7 @@ packages: /is-shared-array-buffer@1.0.2: resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} dependencies: - call-bind: 1.0.5 + call-bind: 1.0.7 /is-stream@2.0.1: resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} @@ -12551,13 +12864,13 @@ packages: /is-weakref@1.0.2: resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} dependencies: - call-bind: 1.0.5 + call-bind: 1.0.7 /is-weakset@2.0.2: resolution: {integrity: sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==} dependencies: - call-bind: 1.0.5 - get-intrinsic: 1.2.2 + call-bind: 1.0.7 + get-intrinsic: 1.2.4 dev: true /is-wsl@2.2.0: @@ -12620,7 +12933,7 @@ packages: resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} engines: {node: '>=10'} dependencies: - debug: 4.3.4 + debug: 4.3.7 istanbul-lib-coverage: 3.2.2 source-map: 0.6.1 transitivePeerDependencies: @@ -12639,7 +12952,7 @@ packages: resolution: {integrity: sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==} dependencies: define-properties: 1.2.1 - get-intrinsic: 1.2.2 + get-intrinsic: 1.2.4 has-symbols: 1.0.3 reflect.getprototypeof: 1.0.4 set-function-name: 2.0.1 @@ -13190,7 +13503,7 @@ packages: whatwg-encoding: 2.0.0 whatwg-mimetype: 3.0.0 whatwg-url: 11.0.0 - ws: 8.14.2 + ws: 8.17.1 xml-name-validator: 4.0.0 transitivePeerDependencies: - bufferutil @@ -13492,7 +13805,7 @@ packages: /lower-case@2.0.2: resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} dependencies: - tslib: 2.6.2 + tslib: 2.8.0 dev: true /lru-cache@10.4.3: @@ -13752,7 +14065,7 @@ packages: onigasm: 2.2.5 dev: false - /monaco-vscode-textmate-theme-converter@0.1.7(tslib@2.6.2): + /monaco-vscode-textmate-theme-converter@0.1.7(tslib@2.8.0): resolution: {integrity: sha512-ZMsq1RPWwOD3pvXD0n+9ddnhfzZoiUMwNIWPNUqYqEiQeH2HjyZ9KYOdt/pqe0kkN8WnYWLrxT9C/SrtIsAu2Q==} hasBin: true peerDependencies: @@ -13760,7 +14073,7 @@ packages: dependencies: commander: 8.3.0 fs-extra: 7.0.1 - tslib: 2.6.2 + tslib: 2.8.0 dev: false /monacode@0.3.1: @@ -13822,11 +14135,11 @@ packages: next: '>=10.0.0' react: '>=17.0.0' dependencies: - next: 14.2.13(@babel/core@7.25.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.40.0)(react-dom@18.2.0)(react@18.2.0) + next: 14.2.13(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.40.0)(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 dev: true - /next@14.2.13(@babel/core@7.25.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.40.0)(react-dom@18.2.0)(react@18.2.0): + /next@14.2.13(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.40.0)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-BseY9YNw8QJSwLYD7hlZzl6QVDoSFHL/URN5K64kVEVpCsSOWeyjbIGK+dZUaRViHTaMQX8aqmnn0PHBbGZezg==} engines: {node: '>=18.17.0'} hasBin: true @@ -13854,7 +14167,7 @@ packages: postcss: 8.4.31 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - styled-jsx: 5.1.1(@babel/core@7.25.7)(react@18.2.0) + styled-jsx: 5.1.1(@babel/core@7.26.0)(react@18.2.0) optionalDependencies: '@next/swc-darwin-arm64': 14.2.13 '@next/swc-darwin-x64': 14.2.13 @@ -13873,7 +14186,7 @@ packages: resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} dependencies: lower-case: 2.0.2 - tslib: 2.6.2 + tslib: 2.8.0 dev: true /node-abort-controller@3.1.1: @@ -13908,7 +14221,7 @@ packages: resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} dev: true - /node-polyfill-webpack-plugin@2.0.1(webpack@5.94.0): + /node-polyfill-webpack-plugin@2.0.1(webpack@5.95.0): resolution: {integrity: sha512-ZUMiCnZkP1LF0Th2caY6J/eKKoA0TefpoVa68m/LQU1I/mE8rGt4fNYGgNuCcK+aG8P8P43nbeJ2RqJMOL/Y1A==} engines: {node: '>=12'} peerDependencies: @@ -13939,7 +14252,7 @@ packages: url: 0.11.4 util: 0.12.5 vm-browserify: 1.1.2 - webpack: 5.94.0(esbuild@0.23.1) + webpack: 5.95.0(esbuild@0.23.1) dev: true /node-releases@2.0.13: @@ -14017,7 +14330,7 @@ packages: resolution: {integrity: sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.5 + call-bind: 1.0.7 define-properties: 1.2.1 dev: true @@ -14033,7 +14346,7 @@ packages: resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.5 + call-bind: 1.0.7 define-properties: 1.2.1 has-symbols: 1.0.3 object-keys: 1.1.1 @@ -14042,7 +14355,7 @@ packages: resolution: {integrity: sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.5 + call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.22.3 dev: true @@ -14254,7 +14567,7 @@ packages: resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==} dependencies: dot-case: 3.0.4 - tslib: 2.6.2 + tslib: 2.8.0 dev: true /parent-module@1.0.1: @@ -14298,7 +14611,7 @@ packages: resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} dependencies: no-case: 3.0.4 - tslib: 2.6.2 + tslib: 2.8.0 dev: true /path-browserify@1.0.1: @@ -14387,6 +14700,9 @@ packages: /picocolors@1.1.0: resolution: {integrity: sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==} + /picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + /picomatch@2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} @@ -14451,7 +14767,7 @@ packages: '@babel/runtime': 7.23.4 dev: true - /postcss-loader@8.1.1(postcss@8.4.47)(typescript@5.3.2)(webpack@5.94.0): + /postcss-loader@8.1.1(postcss@8.4.47)(typescript@5.3.2)(webpack@5.95.0): resolution: {integrity: sha512-0IeqyAsG6tYiDRCYKQJLAmgQr47DX6N7sFSWvQxt6AcupX8DIdmykuk/o/tx0Lze3ErGHJEp5OSRxrelC6+NdQ==} engines: {node: '>= 18.12.0'} peerDependencies: @@ -14468,7 +14784,7 @@ packages: jiti: 1.21.6 postcss: 8.4.47 semver: 7.5.4 - webpack: 5.94.0(esbuild@0.23.1) + webpack: 5.95.0(esbuild@0.23.1) transitivePeerDependencies: - typescript dev: true @@ -14565,25 +14881,25 @@ packages: xtend: 4.0.2 dev: false - /preact-render-to-string@5.1.19(preact@10.19.3): + /preact-render-to-string@5.1.19(preact@10.24.3): resolution: {integrity: sha512-bj8sn/oytIKO6RtOGSS/1+5CrQyRSC99eLUnEVbqUa6MzJX5dYh7wu9bmT0d6lm/Vea21k9KhCQwvr2sYN3rrQ==} peerDependencies: preact: '>=10' dependencies: - preact: 10.19.3 + preact: 10.24.3 pretty-format: 3.8.0 dev: false - /preact-ssr-prepass@1.2.1(preact@10.19.3): + /preact-ssr-prepass@1.2.1(preact@10.24.3): resolution: {integrity: sha512-bLgbUfy8nL+PZghAPpyk9MF+cmXjdwEnxYPaJBmwbzFQqzIz8dQVBqjwB60RqZ9So/vIf6BRfHCiwFGuMCyfbQ==} peerDependencies: preact: '>=10 || ^10.0.0-beta.0 || ^10.0.0-alpha.0' dependencies: - preact: 10.19.3 + preact: 10.24.3 dev: false - /preact@10.19.3: - resolution: {integrity: sha512-nHHTeFVBTHRGxJXKkKu5hT8C/YWBkPso4/Gad6xuj5dbptt9iF9NZr9pHbPhBrnT2klheu7mHTxTZ/LjwJiEiQ==} + /preact@10.24.3: + resolution: {integrity: sha512-Z2dPnBnMUfyQfSQ+GBdsGa16hz35YmLmtTLhM169uW944hYL6xzTYkJjC07j+Wosz733pMWx0fgON3JNw1jJQA==} dev: false /prelude-ls@1.2.1: @@ -14878,12 +15194,12 @@ packages: universal-cookie: 6.1.1 dev: false - /react-countup@6.4.2(@babel/core@7.25.7)(react@18.2.0): + /react-countup@6.4.2(@babel/core@7.26.0)(react@18.2.0): resolution: {integrity: sha512-wdDrNb2lPFGbLb+i0FTgswPbWziubS6KZRII8NRpXmUCoZsi15PFbIHgBz60Dyxd4KPuRvwsK5aawIU4OPP3jA==} peerDependencies: react: '>= 16.3.0' dependencies: - '@rollup/plugin-babel': 6.0.4(@babel/core@7.25.7) + '@rollup/plugin-babel': 6.0.4(@babel/core@7.26.0) countup.js: 2.8.0 react: 18.2.0 transitivePeerDependencies: @@ -15106,7 +15422,7 @@ packages: '@types/react': 18.2.0 react: 18.2.0 react-style-singleton: 2.2.1(@types/react@18.2.0)(react@18.2.0) - tslib: 2.6.2 + tslib: 2.8.0 dev: false /react-remove-scroll@2.5.7(@types/react@18.2.0)(react@18.2.0): @@ -15123,7 +15439,7 @@ packages: react: 18.2.0 react-remove-scroll-bar: 2.3.4(@types/react@18.2.0)(react@18.2.0) react-style-singleton: 2.2.1(@types/react@18.2.0)(react@18.2.0) - tslib: 2.6.2 + tslib: 2.8.0 use-callback-ref: 1.3.0(@types/react@18.2.0)(react@18.2.0) use-sidecar: 1.1.2(@types/react@18.2.0)(react@18.2.0) dev: false @@ -15175,7 +15491,7 @@ packages: get-nonce: 1.0.1 invariant: 2.2.4 react: 18.2.0 - tslib: 2.6.2 + tslib: 2.8.0 dev: false /react-test-renderer@18.2.0(react@18.2.0): @@ -15282,7 +15598,7 @@ packages: esprima: 4.0.1 source-map: 0.6.1 tiny-invariant: 1.3.3 - tslib: 2.6.2 + tslib: 2.8.0 dev: true /recharts-scale@0.4.5: @@ -15348,10 +15664,10 @@ packages: resolution: {integrity: sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.5 + call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.22.3 - get-intrinsic: 1.2.2 + get-intrinsic: 1.2.4 globalthis: 1.0.3 which-builtin-type: 1.1.3 dev: true @@ -15384,7 +15700,7 @@ packages: resolution: {integrity: sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.5 + call-bind: 1.0.7 define-properties: 1.2.1 set-function-name: 2.0.1 @@ -15461,7 +15777,7 @@ packages: resolution: {integrity: sha512-X34iHADNbNDfr6OTStIAHWSAvvKQRYgLO6duASaVf7J2VA3lvmNYboAHOuLC2huav1IwgZJtyEcJCKVzFxOSMQ==} engines: {node: '>=8.6.0'} dependencies: - debug: 4.3.6 + debug: 4.3.7 module-details-from-path: 1.0.3 resolve: 1.22.8 transitivePeerDependencies: @@ -15601,15 +15917,15 @@ packages: /rxjs@7.8.1: resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} dependencies: - tslib: 2.6.2 + tslib: 2.8.0 dev: true /safe-array-concat@1.0.1: resolution: {integrity: sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==} engines: {node: '>=0.4'} dependencies: - call-bind: 1.0.5 - get-intrinsic: 1.2.2 + call-bind: 1.0.7 + get-intrinsic: 1.2.4 has-symbols: 1.0.3 isarray: 2.0.5 @@ -15622,14 +15938,14 @@ packages: /safe-regex-test@1.0.0: resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==} dependencies: - call-bind: 1.0.5 - get-intrinsic: 1.2.2 + call-bind: 1.0.7 + get-intrinsic: 1.2.4 is-regex: 1.1.4 /safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - /sass-loader@13.3.3(webpack@5.94.0): + /sass-loader@13.3.3(webpack@5.95.0): resolution: {integrity: sha512-mt5YN2F1MOZr3d/wBRcZxeFgwgkH44wVc2zohO2YF6JiOMkiXe4BYRZpSu2sO1g71mo/j16txzUhsKZlqjVGzA==} engines: {node: '>= 14.15.0'} peerDependencies: @@ -15649,7 +15965,7 @@ packages: optional: true dependencies: neo-async: 2.6.2 - webpack: 5.94.0(esbuild@0.23.1) + webpack: 5.95.0(esbuild@0.23.1) dev: true /saxes@6.0.0: @@ -15766,15 +16082,6 @@ packages: resolution: {integrity: sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==} dev: false - /set-function-length@1.1.1: - resolution: {integrity: sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==} - engines: {node: '>= 0.4'} - dependencies: - define-data-property: 1.1.1 - get-intrinsic: 1.2.2 - gopd: 1.0.1 - has-property-descriptors: 1.0.1 - /set-function-length@1.2.2: resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} engines: {node: '>= 0.4'} @@ -15790,9 +16097,9 @@ packages: resolution: {integrity: sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==} engines: {node: '>= 0.4'} dependencies: - define-data-property: 1.1.1 + define-data-property: 1.1.4 functions-have-names: 1.2.3 - has-property-descriptors: 1.0.1 + has-property-descriptors: 1.0.2 /setimmediate@1.0.5: resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} @@ -15857,8 +16164,8 @@ packages: /side-channel@1.0.4: resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} dependencies: - call-bind: 1.0.5 - get-intrinsic: 1.2.2 + call-bind: 1.0.7 + get-intrinsic: 1.2.4 object-inspect: 1.13.1 /side-channel@1.0.6: @@ -15926,9 +16233,9 @@ packages: resolution: {integrity: sha512-nU+ywttCyBitXIl9Xe0RSEfek4LneYkJxCeNnKCuhwoH4jGXO1ipIUw/VA/+Vvv2G1MTym11fzFC0SxkrcfXDw==} engines: {node: '>=10.0.0'} dependencies: - '@socket.io/component-emitter': 3.1.0 - debug: 4.3.4 - engine.io-client: 6.5.3 + '@socket.io/component-emitter': 3.1.2 + debug: 4.3.7 + engine.io-client: 6.5.4 socket.io-parser: 4.2.4 transitivePeerDependencies: - bufferutil @@ -15940,8 +16247,8 @@ packages: resolution: {integrity: sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==} engines: {node: '>=10.0.0'} dependencies: - '@socket.io/component-emitter': 3.1.0 - debug: 4.3.4 + '@socket.io/component-emitter': 3.1.2 + debug: 4.3.7 transitivePeerDependencies: - supports-color dev: false @@ -16122,10 +16429,10 @@ packages: /string.prototype.matchall@4.0.10: resolution: {integrity: sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==} dependencies: - call-bind: 1.0.5 + call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.22.3 - get-intrinsic: 1.2.2 + get-intrinsic: 1.2.4 has-symbols: 1.0.3 internal-slot: 1.0.6 regexp.prototype.flags: 1.5.1 @@ -16137,21 +16444,21 @@ packages: resolution: {integrity: sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.5 + call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.22.3 /string.prototype.trimend@1.0.7: resolution: {integrity: sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==} dependencies: - call-bind: 1.0.5 + call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.22.3 /string.prototype.trimstart@1.0.7: resolution: {integrity: sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==} dependencies: - call-bind: 1.0.5 + call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.22.3 @@ -16237,7 +16544,16 @@ packages: webpack: 5.94.0(esbuild@0.23.1) dev: true - /styled-jsx@5.1.1(@babel/core@7.25.7)(react@18.2.0): + /style-loader@3.3.4(webpack@5.95.0): + resolution: {integrity: sha512-0WqXzrsMTyb8yjZJHDqwmnwRJvhALK9LfRtRc6B4UTWe8AijYLZYZ9thuJTZc2VfQWINADW/j+LiJnfy2RoC1w==} + engines: {node: '>= 12.13.0'} + peerDependencies: + webpack: ^5.0.0 + dependencies: + webpack: 5.95.0(esbuild@0.23.1) + dev: true + + /styled-jsx@5.1.1(@babel/core@7.26.0)(react@18.2.0): resolution: {integrity: sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==} engines: {node: '>= 12.0.0'} peerDependencies: @@ -16250,7 +16566,7 @@ packages: babel-plugin-macros: optional: true dependencies: - '@babel/core': 7.25.7 + '@babel/core': 7.26.0 client-only: 0.0.1 react: 18.2.0 @@ -16373,6 +16689,31 @@ packages: serialize-javascript: 6.0.2 terser: 5.31.6 webpack: 5.94.0(esbuild@0.23.1) + dev: true + + /terser-webpack-plugin@5.3.10(esbuild@0.23.1)(webpack@5.95.0): + resolution: {integrity: sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==} + engines: {node: '>= 10.13.0'} + peerDependencies: + '@swc/core': '*' + esbuild: '*' + uglify-js: '*' + webpack: ^5.1.0 + peerDependenciesMeta: + '@swc/core': + optional: true + esbuild: + optional: true + uglify-js: + optional: true + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + esbuild: 0.23.1 + jest-worker: 27.5.1 + schema-utils: 3.3.0 + serialize-javascript: 6.0.2 + terser: 5.31.6 + webpack: 5.95.0(esbuild@0.23.1) /terser@5.31.6: resolution: {integrity: sha512-PQ4DAriWzKj+qgehQ7LK5bQqCFNMmlhjR2PFFLuqGCpuCAauxemVBWwWOxo3UIwWQx8+Pr61Df++r76wDmkQBg==} @@ -16594,6 +16935,9 @@ packages: /tslib@2.6.2: resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + /tslib@2.8.0: + resolution: {integrity: sha512-jWVzBLplnCmoaTr13V9dYbiQ99wvZRd0vNWaDRg+aVYRcjDF3nDksxFDE/+fkXnKhpnUUkmx5pK/v8mCtLVqZA==} + /tsutils@3.21.0(typescript@5.3.2): resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} engines: {node: '>= 6'} @@ -16672,15 +17016,15 @@ packages: resolution: {integrity: sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.5 - get-intrinsic: 1.2.2 + call-bind: 1.0.7 + get-intrinsic: 1.2.4 is-typed-array: 1.1.12 /typed-array-byte-length@1.0.0: resolution: {integrity: sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.5 + call-bind: 1.0.7 for-each: 0.3.3 has-proto: 1.0.1 is-typed-array: 1.1.12 @@ -16690,7 +17034,7 @@ packages: engines: {node: '>= 0.4'} dependencies: available-typed-arrays: 1.0.5 - call-bind: 1.0.5 + call-bind: 1.0.7 for-each: 0.3.3 has-proto: 1.0.1 is-typed-array: 1.1.12 @@ -16698,7 +17042,7 @@ packages: /typed-array-length@1.0.4: resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==} dependencies: - call-bind: 1.0.5 + call-bind: 1.0.7 for-each: 0.3.3 is-typed-array: 1.1.12 @@ -16710,7 +17054,7 @@ packages: /unbox-primitive@1.0.2: resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} dependencies: - call-bind: 1.0.5 + call-bind: 1.0.7 has-bigints: 1.0.2 has-symbols: 1.0.3 which-boxed-primitive: 1.0.2 @@ -16854,6 +17198,17 @@ packages: browserslist: 4.24.0 escalade: 3.2.0 picocolors: 1.1.0 + dev: true + + /update-browserslist-db@1.1.1(browserslist@4.24.2): + resolution: {integrity: sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + dependencies: + browserslist: 4.24.2 + escalade: 3.2.0 + picocolors: 1.1.0 /uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} @@ -16887,7 +17242,7 @@ packages: dependencies: '@types/react': 18.2.0 react: 18.2.0 - tslib: 2.6.2 + tslib: 2.8.0 dev: false /use-events@1.4.2(react@18.2.0): @@ -16912,7 +17267,7 @@ packages: '@types/react': 18.2.0 detect-node-es: 1.1.0 react: 18.2.0 - tslib: 2.6.2 + tslib: 2.8.0 dev: false /use-sync-external-store@1.2.0(react@18.2.0): @@ -17136,6 +17491,45 @@ packages: - '@swc/core' - esbuild - uglify-js + dev: true + + /webpack@5.95.0(esbuild@0.23.1): + resolution: {integrity: sha512-2t3XstrKULz41MNMBF+cJ97TyHdyQ8HCt//pqErqDvNjU9YQBnZxIHa11VXsi7F3mb5/aO2tuDxdeTPdU7xu9Q==} + engines: {node: '>=10.13.0'} + hasBin: true + peerDependencies: + webpack-cli: '*' + peerDependenciesMeta: + webpack-cli: + optional: true + dependencies: + '@types/estree': 1.0.6 + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/wasm-edit': 1.12.1 + '@webassemblyjs/wasm-parser': 1.12.1 + acorn: 8.14.0 + acorn-import-attributes: 1.9.5(acorn@8.14.0) + browserslist: 4.24.2 + chrome-trace-event: 1.0.4 + enhanced-resolve: 5.17.1 + es-module-lexer: 1.5.4 + eslint-scope: 5.1.1 + events: 3.3.0 + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + json-parse-even-better-errors: 2.3.1 + loader-runner: 4.3.0 + mime-types: 2.1.35 + neo-async: 2.6.2 + schema-utils: 3.3.0 + tapable: 2.2.1 + terser-webpack-plugin: 5.3.10(esbuild@0.23.1)(webpack@5.95.0) + watchpack: 2.4.2 + webpack-sources: 3.2.3 + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js /whatwg-encoding@2.0.0: resolution: {integrity: sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==} @@ -17271,21 +17665,8 @@ packages: optional: true dev: false - /ws@8.11.0: - resolution: {integrity: sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - dev: false - - /ws@8.14.2: - resolution: {integrity: sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==} + /ws@8.16.0: + resolution: {integrity: sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 @@ -17295,10 +17676,10 @@ packages: optional: true utf-8-validate: optional: true - dev: true + dev: false - /ws@8.16.0: - resolution: {integrity: sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==} + /ws@8.17.1: + resolution: {integrity: sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 diff --git a/src/app/_components/time-filter/DatePickerInput.tsx b/src/app/_components/time-filter/DatePickerInput.tsx index cfb6e4daa..44de3cef7 100644 --- a/src/app/_components/time-filter/DatePickerInput.tsx +++ b/src/app/_components/time-filter/DatePickerInput.tsx @@ -1,4 +1,3 @@ -import { FormLabel } from '@/ui/FormLabel'; import { UTCDate } from '@date-fns/utc'; import { Field, FieldProps, Form, Formik } from 'formik'; import DatePicker from 'react-datepicker'; @@ -7,6 +6,7 @@ import 'react-datepicker/dist/react-datepicker.css'; import { Box } from '../../../ui/Box'; import { Button } from '../../../ui/Button'; import { FormControl } from '../../../ui/FormControl'; +import { FormLabel } from '../../../ui/FormLabel'; import { Stack } from '../../../ui/Stack'; import { DateInput } from './DateInput'; diff --git a/src/app/_components/time-filter/TimeFilter.tsx b/src/app/_components/time-filter/TimeFilter.tsx index 7df45dfe2..0dfda8963 100644 --- a/src/app/_components/time-filter/TimeFilter.tsx +++ b/src/app/_components/time-filter/TimeFilter.tsx @@ -1,4 +1,3 @@ -import { Stack } from '@/ui/Stack'; import { useColorModeValue } from '@chakra-ui/react'; import { CaretDown } from '@phosphor-icons/react'; import { ReactNode, useEffect, useMemo, useState } from 'react'; @@ -10,6 +9,7 @@ import { Icon } from '../../../ui/Icon'; import { Popover } from '../../../ui/Popover'; import { PopoverContent } from '../../../ui/PopoverContent'; import { PopoverTrigger } from '../../../ui/PopoverTrigger'; +import { Stack } from '../../../ui/Stack'; import { Text } from '../../../ui/Text'; import { useDisclosure } from '../../../ui/hooks/useDisclosure'; import { DatePickerInput, DatePickerValues } from './DatePickerInput'; diff --git a/src/app/_components/time-filter/TimeInput.tsx b/src/app/_components/time-filter/TimeInput.tsx index ada430eb3..72c1c85fc 100644 --- a/src/app/_components/time-filter/TimeInput.tsx +++ b/src/app/_components/time-filter/TimeInput.tsx @@ -1,10 +1,10 @@ -import { FormLabel } from '@/ui/FormLabel'; -import { Input } from '@/ui/Input'; import { Field, FieldProps, Form, Formik } from 'formik'; import { Box } from '../../../ui/Box'; import { Button } from '../../../ui/Button'; import { FormControl } from '../../../ui/FormControl'; +import { FormLabel } from '../../../ui/FormLabel'; +import { Input } from '../../../ui/Input'; import { Stack } from '../../../ui/Stack'; export type Time = string; diff --git a/src/app/_components/time-filter/TimeRangeInput.tsx b/src/app/_components/time-filter/TimeRangeInput.tsx index da8fa3919..d0ce6bb44 100644 --- a/src/app/_components/time-filter/TimeRangeInput.tsx +++ b/src/app/_components/time-filter/TimeRangeInput.tsx @@ -1,10 +1,10 @@ -import { FormLabel } from '@/ui/FormLabel'; -import { Input } from '@/ui/Input'; import { Field, FieldProps, Form, Formik } from 'formik'; import { Box } from '../../../ui/Box'; import { Button } from '../../../ui/Button'; import { FormControl } from '../../../ui/FormControl'; +import { FormLabel } from '../../../ui/FormLabel'; +import { Input } from '../../../ui/Input'; import { Stack } from '../../../ui/Stack'; type Time = number | string | undefined; diff --git a/src/app/global-error.tsx b/src/app/global-error.tsx index db5e4742c..9723cc97e 100644 --- a/src/app/global-error.tsx +++ b/src/app/global-error.tsx @@ -1,10 +1,10 @@ 'use client'; -import { logError } from '@/common/utils/error-utils'; import { useEffect } from 'react'; import { ErrorMessageLayout } from '../common/components/ErrorMessageLayout'; import { Section } from '../common/components/Section'; +import { logError } from '../common/utils/error-utils'; import { Box } from '../ui/Box'; import { Grid } from '../ui/Grid'; diff --git a/src/app/search/filters/Date.tsx b/src/app/search/filters/Date.tsx index 159e54f52..1bbd20a88 100644 --- a/src/app/search/filters/Date.tsx +++ b/src/app/search/filters/Date.tsx @@ -1,4 +1,3 @@ -import { Stack } from '@/ui/Stack'; import { useColorModeValue } from '@chakra-ui/react'; import { CaretDown } from '@phosphor-icons/react'; import { ReactNode, useEffect, useState } from 'react'; @@ -11,6 +10,7 @@ import { Icon } from '../../../ui/Icon'; import { Popover } from '../../../ui/Popover'; import { PopoverContent } from '../../../ui/PopoverContent'; import { PopoverTrigger } from '../../../ui/PopoverTrigger'; +import { Stack } from '../../../ui/Stack'; import { Text } from '../../../ui/Text'; import { useDisclosure } from '../../../ui/hooks/useDisclosure'; import { AfterForm } from './After'; diff --git a/src/app/signer/[signerKey]/AssociatedAddressesTable.tsx b/src/app/signer/[signerKey]/AssociatedAddressesTable.tsx new file mode 100644 index 000000000..f71a3e37d --- /dev/null +++ b/src/app/signer/[signerKey]/AssociatedAddressesTable.tsx @@ -0,0 +1,138 @@ +import { ReactNode, Suspense, useMemo } from 'react'; + +import { + SignersStackersData, + useSuspenseSignerStackersInfinite, +} from '../../../app/signers/data/UseSignerAddresses'; +import { CopyButton } from '../../../common/components/CopyButton'; +import { ListFooter } from '../../../common/components/ListFooter'; +import { Section } from '../../../common/components/Section'; +import { Box } from '../../../ui/Box'; +import { Flex } from '../../../ui/Flex'; +import { Stack } from '../../../ui/Stack'; +import { Text } from '../../../ui/Text'; +import { ExplorerErrorBoundary } from '../../_components/ErrorBoundary'; +import { useSuspenseCurrentStackingCycle } from '../../_components/Stats/CurrentStackingCycle/useCurrentStackingCycle'; +import { AssociatedAddressesTableSkeleton } from './skeleton'; + +export const AssociatedAddressesTableLayout = ({ + addresses, + footer, +}: { + addresses: ReactNode; + footer: ReactNode; +}) => { + return ( +
+ + + {addresses} + + {footer} + +
+ ); +}; + +export const AssociatedAddressListItemLayout = ({ + children, + isLast, +}: { + children: ReactNode; + isLast: boolean; +}) => { + return ( + + {children} + + ); +}; + +export const AssociatedAddressListItem = ({ + stacker, + isLast, +}: { + stacker: SignersStackersData; + isLast: boolean; +}) => { + return ( + + {stacker.stacker_address} + + + ); +}; + +export const AssociatedAddressesTableBase = ({ signerKey }: { signerKey: string }) => { + const { currentCycleId } = useSuspenseCurrentStackingCycle(); + const { + data: signerStackers, + isFetchingNextPage, + fetchNextPage, + hasNextPage, + } = useSuspenseSignerStackersInfinite(currentCycleId, signerKey); + + const stackers = useMemo( + () => signerStackers?.pages.flatMap(page => page.results) ?? [], + [signerStackers] + ); + + return ( + page.results) + .map((stacker, i) => ( + + ))} + footer={ + + } + /> + ); +}; + +export const AssociatedAddressesTable = ({ signerKey }: { signerKey: string }) => { + return ( + + }> + + + + ); +}; diff --git a/src/app/signer/[signerKey]/CycleSortFilter.tsx b/src/app/signer/[signerKey]/CycleSortFilter.tsx new file mode 100644 index 000000000..fd7f019d5 --- /dev/null +++ b/src/app/signer/[signerKey]/CycleSortFilter.tsx @@ -0,0 +1,45 @@ +import { SortDescending } from '@phosphor-icons/react'; +import { useMemo } from 'react'; + +import { FilterMenu } from '../../../common/components/FilterMenu'; + +export enum CycleSortOrder { + Asc = 'asc', + Desc = 'desc', +} + +const cycleSortOrderLabels = { + [CycleSortOrder.Asc]: 'Cycle Asc', + [CycleSortOrder.Desc]: 'Cycle Desc', +}; + +function getSortOptionLabel(order: CycleSortOrder) { + return cycleSortOrderLabels[order]; +} + +export function CycleSortFilter({ + cycleSortOrder, + setCycleSortOrder, +}: { + cycleSortOrder: CycleSortOrder; + setCycleSortOrder: (order: CycleSortOrder) => void; +}) { + const menuItems = useMemo( + () => + Object.values(CycleSortOrder).map(order => ({ + onClick: () => { + setCycleSortOrder(order); + }, + label: getSortOptionLabel(order), + })), + [setCycleSortOrder] + ); + + return ( + getSortOptionLabel(cycleSortOrder)} + menuItems={menuItems} + leftIcon={SortDescending} + /> + ); +} diff --git a/src/app/signer/[signerKey]/PageClient.tsx b/src/app/signer/[signerKey]/PageClient.tsx new file mode 100644 index 000000000..08d40e2a3 --- /dev/null +++ b/src/app/signer/[signerKey]/PageClient.tsx @@ -0,0 +1,64 @@ +'use client'; + +import { useParams } from 'next/navigation'; +import { ReactNode } from 'react'; + +import { Grid } from '../../../ui/Grid'; +import { Stack } from '../../../ui/Stack'; +import { PageTitle } from '../../_components/PageTitle'; +import { AssociatedAddressesTable } from './AssociatedAddressesTable'; +import { SignerStats } from './SignerStats'; +import { SignerSummary } from './SignerSummary'; +import { StackingHistoryTable } from './StackingHistoryTable'; + +export function SignerKeyPageLayout({ + signerSummary, + associatedAddressesTable, + stackingHistoryTable, + signerStats, +}: { + signerSummary: ReactNode; + associatedAddressesTable: ReactNode; + stackingHistoryTable: ReactNode; + signerStats: ReactNode; +}) { + return ( + + + {signerSummary} + {associatedAddressesTable} + {stackingHistoryTable} + + {signerStats} + + ); +} + +export default function PageClient() { + const params = useParams<{ signerKey: string }>(); + + if (!params) { + console.error('params is undefined. This component should receive params from its parent.'); + return null; // or some error UI + } + + const { signerKey } = params; + return ( + <> + Signer key + + } + associatedAddressesTable={} + stackingHistoryTable={} + signerStats={} + /> + + ); +} diff --git a/src/app/signer/[signerKey]/SignerStats.tsx b/src/app/signer/[signerKey]/SignerStats.tsx new file mode 100644 index 000000000..bddf87385 --- /dev/null +++ b/src/app/signer/[signerKey]/SignerStats.tsx @@ -0,0 +1,86 @@ +import { ReactNode, Suspense } from 'react'; + +import { ExplorerErrorBoundary } from '../../../app/_components/ErrorBoundary'; +import { formatSignerLatency, formatSignerProposalMetric } from '../../../app/signers/SignersTable'; +import { useSignerMetricsSignerForCycle } from '../../../app/signers/data/signer-metrics-hooks'; +import { Section } from '../../../common/components/Section'; +import { Box } from '../../../ui/Box'; +import { Stack } from '../../../ui/Stack'; +import { Caption } from '../../../ui/typography'; +import { useSuspenseCurrentStackingCycle } from '../../_components/Stats/CurrentStackingCycle/useCurrentStackingCycle'; +import { SignerKeyStatsSkeleton } from './skeleton'; + +interface SignerStatsProps { + signerKey: string; +} + +export const SignerStatsLayout = ({ children }: { children: ReactNode }) => { + return
{children}
; +}; + +export const SignerKeyStat = ({ + label, + value, +}: { + label: string | ReactNode; + value: string | ReactNode; +}) => { + return ( + + {label} + {value} + + ); +}; + +function SignerStatsBase({ signerKey }: SignerStatsProps) { + const { currentCycleId } = useSuspenseCurrentStackingCycle(); + const { data: signerMetrics } = useSignerMetricsSignerForCycle(currentCycleId, signerKey); + const totalProposals = + signerMetrics?.proposals_accepted_count + + signerMetrics?.proposals_rejected_count + + signerMetrics?.proposals_missed_count; + + return ( + + + + + + + ); +} + +export function SignerStats(props: SignerStatsProps) { + return ( + + }> + + + + ); +} diff --git a/src/app/signer/[signerKey]/SignerSummary.tsx b/src/app/signer/[signerKey]/SignerSummary.tsx new file mode 100644 index 000000000..0c9a0878e --- /dev/null +++ b/src/app/signer/[signerKey]/SignerSummary.tsx @@ -0,0 +1,84 @@ +import { ReactNode, Suspense } from 'react'; + +import { ExplorerErrorBoundary } from '../../../app/_components/ErrorBoundary'; +import { KeyValueHorizontal } from '../../../common/components/KeyValueHorizontal'; +import { Section } from '../../../common/components/Section'; +import { Value } from '../../../common/components/Value'; +import { microToStacksFormatted } from '../../../common/utils/utils'; +import { Stack } from '../../../ui/Stack'; +import { useSuspenseCurrentStackingCycle } from '../../_components/Stats/CurrentStackingCycle/useCurrentStackingCycle'; +import { getEntityName } from '../../signers/SignersTable'; +import { useSuspensePoxSigner } from '../../signers/data/UseSigner'; +import { SignerSummarySkeleton } from './skeleton'; + +interface SignerSummaryProps { + signerKey: string; +} + +export const SignerSummaryLayout = ({ children }: { children: ReactNode }) => { + return ( +
+ {children} +
+ ); +}; + +export const SignerSummaryBase = ({ signerKey }: SignerSummaryProps) => { + const { currentCycleId } = useSuspenseCurrentStackingCycle(); + const { data: signerData } = useSuspensePoxSigner(currentCycleId, signerKey); + const numAssociatedAddresses = + signerData?.solo_stacker_count != null && signerData?.pooled_stacker_count != null + ? signerData.solo_stacker_count + signerData.pooled_stacker_count + : ''; + + return ( +
+ + {signerKey}} + copyValue={signerKey} + /> + {getEntityName(signerKey)}} + copyValue={getEntityName(signerKey)} + /> + {signerData?.weight_percent?.toFixed(2) ?? ''}%} + copyValue={signerData?.weight_percent?.toFixed(2) ?? ''} + /> + {microToStacksFormatted(signerData?.stacked_amount ?? '')}} + copyValue={microToStacksFormatted(signerData?.stacked_amount ?? '')} + /> + {numAssociatedAddresses}} + copyValue={numAssociatedAddresses?.toString()} + /> + +
+ ); +}; + +export const SignerSummary = ({ signerKey }: SignerSummaryProps) => { + return ( + + }> + + + + ); +}; diff --git a/src/app/signer/[signerKey]/StackingHistoryTable.tsx b/src/app/signer/[signerKey]/StackingHistoryTable.tsx new file mode 100644 index 000000000..8b2c13694 --- /dev/null +++ b/src/app/signer/[signerKey]/StackingHistoryTable.tsx @@ -0,0 +1,307 @@ +'use client'; + +import { useColorModeValue } from '@chakra-ui/react'; +import styled from '@emotion/styled'; +import { ReactNode, Suspense, useCallback, useMemo, useState } from 'react'; + +import { StackingHistoryInfo, useSignerStackingHistory } from '../../../app/signers/data/UseSigner'; +import { ListFooter } from '../../../common/components/ListFooter'; +import { Section } from '../../../common/components/Section'; +import { Flex } from '../../../ui/Flex'; +import { Table } from '../../../ui/Table'; +import { Tbody } from '../../../ui/Tbody'; +import { Td } from '../../../ui/Td'; +import { Text } from '../../../ui/Text'; +import { Th } from '../../../ui/Th'; +import { Thead } from '../../../ui/Thead'; +import { Tr } from '../../../ui/Tr'; +import { ScrollableBox } from '../../_components/BlockList/ScrollableDiv'; +import { ExplorerErrorBoundary } from '../../_components/ErrorBoundary'; +import { useSuspenseCurrentStackingCycle } from '../../_components/Stats/CurrentStackingCycle/useCurrentStackingCycle'; +import { CycleFilter } from '../../signers/CycleFilter'; +import { mobileBorderCss } from '../../signers/consts'; +import { CycleSortFilter, CycleSortOrder } from './CycleSortFilter'; +import { StackingHistoryTableSkeleton } from './skeleton'; + +const StyledTable = styled(Table)` + th { + border-bottom: none; + } + + tr:last-child td { + border-bottom: none; + } +`; + +const Header = ({ headerTitle, isFirst }: { headerTitle: string; isFirst: boolean }) => ( + + + + {headerTitle} + + + +); + +export const stackingHistoryTableHeaders = [ + 'Cycle', + 'Voting power', + 'STX stacked', + 'Latency', + 'Approved', + 'Rejected', + 'Missing', +]; + +const Headers = () => ( + + {stackingHistoryTableHeaders.map((header, i) => ( +
+ ))} + +); + +const Row = ({ + isFirst, + isLast, + cycleid, + votingPower, + stxStacked, + latency, + approved, + rejected, + missing, +}: { + index: number; + isFirst: boolean; + isLast: boolean; +} & SignerRowInfo) => { + return ( + + + + {cycleid} + + + + + {`${votingPower.toFixed(2)}%`} + + + + + {stxStacked.toFixed(0).toLocaleString()} + + + + + {`${latency}ms`} + + + + + {`${(approved * 100).toFixed(2)}%`} + + + + + {`${(rejected * 100).toFixed(2)}%`} + + + + + {`${(missing * 100).toFixed(2)}%`} + + + + ); +}; + +export function StackingHistoryTableLayout({ + title, + topRight, + headers, + rows, + fetchNextPage, + hasNextPage, +}: { + title: ReactNode; + topRight?: ReactNode; + headers: ReactNode; + rows: ReactNode; + fetchNextPage: (() => void) | undefined; + hasNextPage: boolean; +}) { + return ( +
+ + + {headers} + {rows} + + + +
+ ); +} +interface SignerRowInfo { + signerKey: string; + cycleid: number; + votingPower: number; + stxStacked: number; + latency: number; + approved: number; + rejected: number; + missing: number; +} + +function formatSignerRowData(singerInfo: StackingHistoryInfo): SignerRowInfo { + const totalProposals = + singerInfo.proposals_accepted_count + + singerInfo.proposals_rejected_count + + singerInfo.proposals_missed_count; + return { + signerKey: singerInfo.signer_key, + cycleid: singerInfo.cycleid, + votingPower: singerInfo.weight_percentage, + stxStacked: parseFloat(singerInfo.stacked_amount) / 1_000_000, + latency: singerInfo.average_response_time_ms, + approved: singerInfo.proposals_accepted_count / totalProposals, + rejected: singerInfo.proposals_rejected_count / totalProposals, + missing: singerInfo.proposals_missed_count / totalProposals, + }; +} + +const StackingHistoryTableBase = ({ signerKey }: { signerKey: string }) => { + const [cycleSortOrder, setCycleSortOrder] = useState(CycleSortOrder.Desc); + const { currentCycleId } = useSuspenseCurrentStackingCycle(); + const [selectedCycle, setSelectedCycle] = useState(''); + + const cycleFilterOnSubmitHandler = useCallback( + (cycle: string) => { + setSelectedCycle(cycle); + }, + [setSelectedCycle] + ); + + const { signerStackingHistory, fetchNextPage, hasNextPage } = useSignerStackingHistory( + signerKey, + selectedCycle + ); + + const signerData = useMemo( + () => + signerStackingHistory + .map((signer, index) => { + return { + ...formatSignerRowData(signer), + }; + }) + .sort((a, b) => + cycleSortOrder === CycleSortOrder.Desc ? b.cycleid - a.cycleid : a.cycleid - b.cycleid + ), + [signerStackingHistory, cycleSortOrder] + ); + + return ( + + + + Cycle: + + + + } + title={Stacking history} + headers={} + rows={signerData.map((cycleData, i) => ( + + ))} + fetchNextPage={fetchNextPage} + hasNextPage={hasNextPage} + /> + ); +}; + +export const StackingHistoryTable = ({ signerKey }: { signerKey: string }) => { + return ( + + }> + + + + ); +}; diff --git a/src/app/signer/[signerKey]/page.tsx b/src/app/signer/[signerKey]/page.tsx new file mode 100644 index 000000000..170df2d0f --- /dev/null +++ b/src/app/signer/[signerKey]/page.tsx @@ -0,0 +1,12 @@ +import dynamic from 'next/dynamic'; + +import { SignerKeyPageSkeleton } from './skeleton'; + +const Page = dynamic(() => import('./PageClient'), { + loading: () => , + ssr: false, +}); + +export default async function () { + return ; +} diff --git a/src/app/signer/[signerKey]/skeleton.tsx b/src/app/signer/[signerKey]/skeleton.tsx new file mode 100644 index 000000000..63969d7df --- /dev/null +++ b/src/app/signer/[signerKey]/skeleton.tsx @@ -0,0 +1,103 @@ +'use client'; + +import { KeyValueHorizontal } from '../../../common/components/KeyValueHorizontal'; +import { SkeletonItem } from '../../../ui/SkeletonItem'; +import { Tr } from '../../../ui/Tr'; +import { TableHeaderSkeleton, TableRowSkeleton } from '../../signers/skeleton'; +import { + AssociatedAddressListItemLayout, + AssociatedAddressesTableLayout, +} from './AssociatedAddressesTable'; +import { SignerKeyPageLayout } from './PageClient'; +import { SignerKeyStat, SignerStatsLayout } from './SignerStats'; +import { SignerSummaryLayout } from './SignerSummary'; +import { StackingHistoryTableLayout, stackingHistoryTableHeaders } from './StackingHistoryTable'; + +export const SignerKeyStatsSkeleton = () => { + return ( + + } + value={} + /> + } + value={} + /> + } + value={} + /> + } + value={} + /> + + ); +}; +export const StackingHistoryTableSkeleton = () => { + const numRows = Array.from({ length: 10 }, (_, i) => i + 1); + const numCols = Array.from({ length: stackingHistoryTableHeaders.length }, (_, i) => i + 1); + + return ( + + {numCols.map((_, i) => ( + + ))} + + } + rows={numRows.map((_, i) => ( + + ))} + fetchNextPage={undefined} + hasNextPage={false} + /> + ); +}; + +export const AssociatedAddressesTableSkeleton = () => { + return ( + ( + + + + ))} + footer={null} + /> + ); +}; + +export const SignerSummarySkeleton = () => { + return ( + + {Array.from({ length: 5 }, (_, i) => ( + } + value={} + /> + ))} + } + value={} + /> + + ); +}; + +export const SignerKeyPageSkeleton = () => { + return ( + } + associatedAddressesTable={} + stackingHistoryTable={} + signerStats={} + /> + ); +}; diff --git a/src/app/signers/AddressesStackingCard.tsx b/src/app/signers/AddressesStackingCard.tsx deleted file mode 100644 index a0380ba8d..000000000 --- a/src/app/signers/AddressesStackingCard.tsx +++ /dev/null @@ -1,110 +0,0 @@ -import { ArrowDownRight, ArrowUpRight } from '@phosphor-icons/react'; -import { UseQueryResult, useQueries, useQueryClient } from '@tanstack/react-query'; -import { Suspense, useMemo } from 'react'; - -import { Card } from '../../common/components/Card'; -import { ApiResponseWithResultsOffset } from '../../common/types/api'; -import { Icon } from '../../ui/Icon'; -import { Text } from '../../ui/Text'; -import { ExplorerErrorBoundary } from '../_components/ErrorBoundary'; -import { useSuspenseCurrentStackingCycle } from '../_components/Stats/CurrentStackingCycle/useCurrentStackingCycle'; -import { StatCardBase } from './StatsCardBase'; -import { SignersStackersData, useGetStackersBySignerQuery } from './data/UseSignerAddresses'; -import { useSuspensePoxSigners } from './data/useSigners'; -import { SignersStatsSectionSkeleton } from './skeleton'; - -// TODO: This is currently not being used, but it may be in the future -export function AddressesStackingCardBase() { - const { currentCycleId } = useSuspenseCurrentStackingCycle(); - const previousCycleId = useMemo(() => currentCycleId - 1, [currentCycleId]); - - const { - data: { results: currentCycleSigners }, - } = useSuspensePoxSigners(currentCycleId.toString()); - - if (!currentCycleSigners) { - throw new Error('No stacking data available'); - } - - const { - data: { results: previousCycleSigners }, - } = useSuspensePoxSigners(previousCycleId.toString()); - - const queryClient = useQueryClient(); - const getQuery = useGetStackersBySignerQuery(); - const currentCycleSignersStackersQueries = useMemo(() => { - return { - queries: currentCycleSigners.map(signer => { - return getQuery(currentCycleId, signer.signing_key); - }), - combine: ( - response: UseQueryResult, Error>[] - ) => response.map(r => r.data?.results ?? []), - }; - }, [currentCycleSigners, getQuery, currentCycleId]); - const previousCycleSignersStackersQueries = useMemo(() => { - return { - queries: previousCycleSigners - ? previousCycleSigners.map(signer => { - return getQuery(previousCycleId, signer.signing_key); - }) - : [], - combine: ( - response: UseQueryResult, Error>[] - ) => response.map(r => r.data?.results ?? []), - }; - }, [previousCycleSigners, getQuery, previousCycleId]); - - const currentCycleSignersStackers = useQueries({ - queries: currentCycleSignersStackersQueries.queries, - combine: result => result.map(r => r.data ?? []), - }); - const previousCycleSignersStackers = useQueries({ - queries: previousCycleSignersStackersQueries.queries, - combine: result => result.map(r => r.data ?? []), - }); - - const numCurrentCycleStackers = currentCycleSignersStackers.length; - const numPreviousCycleStackers = previousCycleSignersStackers.length; - - const rate = numPreviousCycleStackers - ? Number( - ( - ((numCurrentCycleStackers - numPreviousCycleStackers) / numPreviousCycleStackers) * - 100 - ).toFixed(2) - ) - : undefined; - - const moreInfo = rate ? ( - - - 0 ? ArrowUpRight : ArrowDownRight} - size={3} - color={rate > 0 ? 'green.600' : 'red.600'} - /> -  {`${rate}%`}  - - {`${rate > 0 ? 'more' : 'less'} than previous cycle`} - - ) : null; - - return ( - - ); -} - -export function AddressesStackingCard() { - return ( - - }> - - - - ); -} diff --git a/src/app/signers/CycleFilter.tsx b/src/app/signers/CycleFilter.tsx index d190847b0..cd40d0c55 100644 --- a/src/app/signers/CycleFilter.tsx +++ b/src/app/signers/CycleFilter.tsx @@ -3,16 +3,21 @@ import { CaretLeft, CaretRight } from '@phosphor-icons/react'; import { Field, Form, Formik } from 'formik'; import { useCallback, useState } from 'react'; +import { useSuspenseCurrentStackingCycle } from '../_components/Stats/CurrentStackingCycle/useCurrentStackingCycle'; + export function CycleFilter({ onChange, defaultCycleId, - currentCycleId, + placeholder, + showOnlyInput = false, }: { onChange: (cycle: string) => void; - defaultCycleId: string; - currentCycleId: string; + defaultCycleId?: string; + placeholder?: string; + showOnlyInput?: boolean; }) { - const [cycleId, setCycleId] = useState(defaultCycleId); + const { currentCycleId } = useSuspenseCurrentStackingCycle(); + const [cycleId, setCycleId] = useState(defaultCycleId ?? ''); const handleCycleChange = useCallback( (newCycleId: string) => { @@ -27,22 +32,25 @@ export function CycleFilter({ {({ values, setFieldValue, submitForm }) => (
- } - onClick={() => { - const newCycleId = String(Number(values.cycle) - 1); - setFieldValue('cycle', newCycleId); - submitForm(); - }} - h={5} - w={5} - /> + {!showOnlyInput && ( + } + onClick={() => { + const newCycleId = String(Number(values.cycle) - 1); + setFieldValue('cycle', newCycleId); + submitForm(); + }} + isDisabled={!cycleId} + h={5} + w={5} + /> + )} {({ field }: any) => ( { @@ -58,18 +66,20 @@ export function CycleFilter({ /> )} - } - onClick={() => { - const newCycleId = String(Number(values.cycle) + 1); - setFieldValue('cycle', newCycleId); - submitForm(); - }} - isDisabled={cycleId === currentCycleId} - h={5} - w={5} - /> + {!showOnlyInput && ( + } + onClick={() => { + const newCycleId = String(Number(values.cycle) + 1); + setFieldValue('cycle', newCycleId); + submitForm(); + }} + isDisabled={!cycleId || cycleId === currentCycleId.toString()} + h={5} + w={5} + /> + )}
)} diff --git a/src/app/signers/SignerDistribution.tsx b/src/app/signers/SignerDistribution.tsx index 7d1a478ee..0c05bce29 100644 --- a/src/app/signers/SignerDistribution.tsx +++ b/src/app/signers/SignerDistribution.tsx @@ -1,6 +1,7 @@ import { ReactNode, Suspense, useState } from 'react'; import { Card } from '../../common/components/Card'; +import { useSuspenseInfiniteQueryResult } from '../../common/hooks/useInfiniteQueryResult'; import { Box } from '../../ui/Box'; import { Flex } from '../../ui/Flex'; import { Grid } from '../../ui/Grid'; @@ -11,7 +12,7 @@ import { useSuspenseCurrentStackingCycle } from '../_components/Stats/CurrentSta import { SignersDistributionLegend } from './SignerDistributionLegend'; import { SignersDistributionPieChart } from './SignerDistributionPieChart'; import { SignersDistributionFilter } from './SignersDistributionFilter'; -import { useSuspensePoxSigners } from './data/useSigners'; +import { PoxSigner, useSuspensePoxSigners } from './data/useSigners'; import { SignersDistributionSkeleton } from './skeleton'; export function SignersDistributionLayout({ @@ -49,9 +50,12 @@ export function SignersDistributionLayout({ export function SignersDistributionBase() { const { currentCycleId } = useSuspenseCurrentStackingCycle(); - const { - data: { results: signers }, - } = useSuspensePoxSigners(currentCycleId.toString()); + + const signersResponse = useSuspensePoxSigners(currentCycleId, { + limit: 100, + }); + const signers = useSuspenseInfiniteQueryResult(signersResponse); + const [onlyShowPublicSigners, setOnlyShowPublicSigners] = useState(false); return signers.length > 0 ? ( diff --git a/src/app/signers/SignerDistributionLegend.tsx b/src/app/signers/SignerDistributionLegend.tsx index 5f7691f8b..40bbb3514 100644 --- a/src/app/signers/SignerDistributionLegend.tsx +++ b/src/app/signers/SignerDistributionLegend.tsx @@ -6,7 +6,7 @@ import { Stack } from '../../ui/Stack'; import { Text, TextProps } from '../../ui/Text'; import { useColorMode } from '../../ui/hooks/useColorMode'; import { getSignerDistributionPieChartColor } from './SignerDistributionPieChart'; -import { SignerInfo } from './data/useSigners'; +import { PoxSigner } from './data/useSigners'; import { getSignerKeyName } from './utils'; export function SignerLegendItem({ @@ -87,7 +87,7 @@ export function SignersDistributionLegend({ signers, onlyShowPublicSigners, }: { - signers: SignerInfo[]; + signers: PoxSigner[]; onlyShowPublicSigners: boolean; }) { const knownSigners = useMemo( diff --git a/src/app/signers/SignerDistributionPieChart.tsx b/src/app/signers/SignerDistributionPieChart.tsx index 2bc2749a3..b034c6495 100644 --- a/src/app/signers/SignerDistributionPieChart.tsx +++ b/src/app/signers/SignerDistributionPieChart.tsx @@ -5,7 +5,7 @@ import { PieSectorDataItem } from 'recharts/types/polar/Pie'; import { Box } from '../../ui/Box'; import { SignerLegendItem } from './SignerDistributionLegend'; -import { SignerInfo } from './data/useSigners'; +import { PoxSigner } from './data/useSigners'; import { getSignerKeyName } from './utils'; declare type Dict = Record; @@ -92,7 +92,7 @@ interface PieData { } interface SignersDistributionPieChartProps { - signers: SignerInfo[]; + signers: PoxSigner[]; onlyShowPublicSigners: boolean; } diff --git a/src/app/signers/SignersTable.tsx b/src/app/signers/SignersTable.tsx index 245da5ca0..e09782e09 100644 --- a/src/app/signers/SignersTable.tsx +++ b/src/app/signers/SignersTable.tsx @@ -1,10 +1,16 @@ +'use client'; + import { useColorModeValue } from '@chakra-ui/react'; import styled from '@emotion/styled'; -import { UseQueryResult, useQueries, useQueryClient } from '@tanstack/react-query'; import { ReactNode, Suspense, useCallback, useMemo, useState } from 'react'; import { CopyButton } from '../../common/components/CopyButton'; +import { ExplorerLink } from '../../common/components/ExplorerLinks'; import { Section } from '../../common/components/Section'; +import { + useInfiniteQueryResult, + useSuspenseInfiniteQueryResult, +} from '../../common/hooks/useInfiniteQueryResult'; import { truncateMiddle } from '../../common/utils/utils'; import { Flex } from '../../ui/Flex'; import { Table } from '../../ui/Table'; @@ -23,9 +29,9 @@ import { SortByVotingPowerFilter, VotingPowerSortOrder } from './SortByVotingPow import { mobileBorderCss } from './consts'; import { SignerMetricsSignerForCycle, - useGetSignerMetricsBySignerQuery, + useSignerMetricsSignersForCycle, } from './data/signer-metrics-hooks'; -import { SignerInfo, useSuspensePoxSigners } from './data/useSigners'; +import { PoxSigner, useSuspensePoxSigners } from './data/useSigners'; import { SignersTableSkeleton } from './skeleton'; import { getSignerKeyName } from './utils'; @@ -82,21 +88,21 @@ export const SignersTableHeader = ({ export const signersTableHeaders = [ 'Signer key', 'Entity', - '# of associated addresses', + 'Addresses', 'Voting power', 'STX stacked', 'Latency', 'Approved / Rejected / Missing', ]; -function formatSignerProposalMetric(metric: number): string { +export function formatSignerProposalMetric(metric: number): string { if (isNaN(metric)) return '-'; if (metric === 0) return '0%'; if (metric === 1) return '100%'; return `${(metric * 100).toFixed(1)}%`; } -function formatSignerLatency(latency: number, missing: number): string { +export function formatSignerLatency(latency: number, missing: number): string { if (missing === 1 || isNaN(missing)) return '-'; if (latency === 0) return '0s'; return `${(latency / 1000).toFixed(2)}s`; @@ -114,12 +120,12 @@ export const SignersTableHeaders = () => ( ); -function getEntityName(signerKey: string) { +export function getEntityName(signerKey: string) { const entityName = removeStackingDaoFromName(getSignerKeyName(signerKey)); return entityName === 'unknown' ? '-' : entityName; } -const SignerTableRow = ({ +export const SignerTableRow = ({ index, isFirst, isLast, @@ -152,9 +158,18 @@ const SignerTableRow = ({ onMouseEnter={() => setIsSignerKeyHovered(true)} onMouseLeave={() => setIsSignerKeyHovered(false)} > - - {truncateMiddle(signerKey)} - + + + {truncateMiddle(signerKey)} + + void; - cycleFilterOnSubmitHandler: (cycle: string) => void; - selectedCycle: string; - currentCycleId: string; }) { return ( -
- - - Cycle: - - - - } - > +
{signersTableHeaders} @@ -273,8 +251,8 @@ interface SignerRowInfo { missing: number; } -function formatSignerRowData( - singerInfo: SignerInfo, +export function formatSignerRowData( + signerData: PoxSigner, signerMetrics: SignerMetricsSignerForCycle ): SignerRowInfo { const totalProposals = @@ -282,10 +260,10 @@ function formatSignerRowData( signerMetrics.proposals_rejected_count + signerMetrics.proposals_missed_count; return { - signerKey: singerInfo.signing_key, - votingPower: singerInfo.weight_percent, - stxStaked: parseFloat(singerInfo.stacked_amount) / 1_000_000, - numStackers: singerInfo.pooled_stacker_count + singerInfo.solo_stacker_count, + signerKey: signerData.signing_key, + votingPower: signerData.weight_percent, + stxStaked: parseFloat(signerData.stacked_amount) / 1_000_000, + numStackers: signerData.pooled_stacker_count + signerData.solo_stacker_count, latency: signerMetrics.average_response_time_ms, approved: signerMetrics.proposals_accepted_count / totalProposals, rejected: signerMetrics.proposals_rejected_count / totalProposals, @@ -305,48 +283,63 @@ const SignersTableBase = () => { [setSelectedCycle] ); - const { - data: { results: signers }, - } = useSuspensePoxSigners(selectedCycle); + const signersResponse = useSuspensePoxSigners(parseInt(selectedCycle), { + limit: 100, + }); + const signers = useSuspenseInfiniteQueryResult(signersResponse); if (!signers) { throw new Error('Signers data is not available'); } - const queryClient = useQueryClient(); - const getSignerMetricsBySignerQuery = useGetSignerMetricsBySignerQuery(); - const signersMetricsQueries = useMemo(() => { - return { - queries: signers.map(signer => { - return getSignerMetricsBySignerQuery(parseInt(selectedCycle), signer.signing_key); - }), - combine: (response: UseQueryResult[]) => - response.map(r => r.data ?? ({} as SignerMetricsSignerForCycle)), - }; - }, [signers, getSignerMetricsBySignerQuery, selectedCycle]); - const signersMetrics = useQueries(signersMetricsQueries, queryClient); + const signersMetricsResponse = useSignerMetricsSignersForCycle(parseInt(selectedCycle), { + limit: 100, + }); - const signersData = useMemo( - () => - signers - .map((signer, index) => { - return { - ...formatSignerRowData(signer, signersMetrics[index]), - }; - }) - .sort((a, b) => - votingPowerSortOrder === 'desc' - ? b.votingPower - a.votingPower - : a.votingPower - b.votingPower - ), - [signers, signersMetrics, votingPowerSortOrder] - ); + const signersMetrics = + useInfiniteQueryResult(signersMetricsResponse); + + const signersData = useMemo(() => { + return signers + .map(signer => { + const metrics = + signersMetrics.find(m => m.signer_key === signer.signing_key) || + ({} as SignerMetricsSignerForCycle); + return formatSignerRowData(signer, metrics); + }) + .sort((a, b) => + votingPowerSortOrder === 'desc' + ? b.votingPower - a.votingPower + : a.votingPower - b.votingPower + ); + }, [signers, signersMetrics, votingPowerSortOrder]); return ( {signersData.length} Active Signers} + topRight={ + + + + Cycle: + + + + } + title={{signersData.length} Active Signers} signersTableHeaders={} signersTableRows={signersData.map((signer, i) => ( { isLast={i === signers.length - 1} /> ))} - cycleFilterOnSubmitHandler={cycleFilterOnSubmitHandler} - selectedCycle={selectedCycle} - currentCycleId={currentCycleId.toString()} /> ); }; diff --git a/src/app/signers/data/UseSigner.ts b/src/app/signers/data/UseSigner.ts new file mode 100644 index 000000000..428b15912 --- /dev/null +++ b/src/app/signers/data/UseSigner.ts @@ -0,0 +1,116 @@ +import { + UseQueryResult, + useQueries, + useQueryClient, + useSuspenseQuery, +} from '@tanstack/react-query'; +import { useCallback, useMemo, useState } from 'react'; + +import { useSuspenseCurrentStackingCycle } from '../../../app/_components/Stats/CurrentStackingCycle/useCurrentStackingCycle'; +import { useGlobalContext } from '../../../common/context/useGlobalContext'; +import { TEN_MINUTES } from '../../../common/queries/query-stale-time'; +import { + SignerMetricsSignerForCycle, + useGetSignerMetricsSignerForCycleQuery, +} from './signer-metrics-hooks'; + +const SIGNER_QUERY_KEY = 'signer'; + +export interface SignerInfo { + signing_key: string; + signer_address: string; + weight: number; + stacked_amount: string; + weight_percent: number; + stacked_amount_percent: number; + solo_stacker_count: number; + pooled_stacker_count: number; +} + +export interface StackingHistoryInfo extends SignerMetricsSignerForCycle { + cycleid: number; +} + +export function useSuspensePoxSigner(cycleId: number, signerKey: string) { + const { url: activeNetworkUrl } = useGlobalContext().activeNetwork; + + return useSuspenseQuery({ + queryKey: [SIGNER_QUERY_KEY, cycleId, signerKey], + queryFn: () => + fetch(`${activeNetworkUrl}/extended/v2/pox/cycles/${cycleId}/signers/${signerKey}`).then( + res => res.json() + ), + staleTime: TEN_MINUTES, + }); +} + +const DEFAULT_LIST_LIMIT = 5; + +export function useSignerStackingHistory(signerKey: string, selectedCycle?: string) { + const { currentCycleId } = useSuspenseCurrentStackingCycle(); + const getQuery = useGetSignerMetricsSignerForCycleQuery(); + const [offset, setOffset] = useState(0); + const cyclesToQuery = useMemo(() => { + return selectedCycle + ? [parseInt(selectedCycle)] + : Array.from({ length: offset + DEFAULT_LIST_LIMIT }, (_, i) => currentCycleId - i); + }, [selectedCycle, currentCycleId, offset]); + const queryClient = useQueryClient(); + const queries = useMemo(() => { + return cyclesToQuery.map(cycle => { + return getQuery(cycle, signerKey); + }); + }, [cyclesToQuery, getQuery, signerKey]); + + const signerStackingHistoryQueries = useMemo(() => { + return { + queries, + combine: (response: UseQueryResult[]) => { + return response.map(r => r.data); + }, + }; + }, [queries]); + const signerStackingHistory = useQueries(signerStackingHistoryQueries, queryClient); + + // We don't have a list endpoint for the stacking history, so we don't know when to stop fetching for more cycles. 404s tell us that we've reached the end. + const foundStackingHistory404s = useMemo(() => { + return signerStackingHistory.some(r => { + if (r && 'error' in r) { + return true; + } + return false; + }); + }, [signerStackingHistory]); + + const signerStackingHistoryFiltered = useMemo(() => { + return signerStackingHistory + .filter( + (data): data is SignerMetricsSignerForCycle | undefined => + data !== null && data !== undefined + ) + .filter((r): r is SignerMetricsSignerForCycle => { + if (r && 'error' in r) { + return false; + } + return true; + }) + .map((r, index) => ({ + ...(r as SignerMetricsSignerForCycle), + cycleid: cyclesToQuery[index], + })); + }, [signerStackingHistory, cyclesToQuery]); + + const fetchNextPage = useCallback(() => { + setOffset(prev => prev + DEFAULT_LIST_LIMIT); + }, []); + + const hasNextPage = useMemo(() => { + return !foundStackingHistory404s; + }, [foundStackingHistory404s]); + + return { + signerStackingHistory: signerStackingHistoryFiltered, + fetchNextPage: selectedCycle ? undefined : fetchNextPage, + hasNextPage: selectedCycle ? false : hasNextPage, + }; +} diff --git a/src/app/signers/data/UseSignerAddresses.ts b/src/app/signers/data/UseSignerAddresses.ts index 790bde3f4..9b1658a5c 100644 --- a/src/app/signers/data/UseSignerAddresses.ts +++ b/src/app/signers/data/UseSignerAddresses.ts @@ -1,21 +1,30 @@ -// Add missing import statement -import { useSuspenseQuery } from '@tanstack/react-query'; +import { + InfiniteData, + UseInfiniteQueryResult, + useInfiniteQuery, + useSuspenseQuery, +} from '@tanstack/react-query'; import { useGlobalContext } from '../../../common/context/useGlobalContext'; +import { GenericResponseType } from '../../../common/hooks/useInfiniteQueryResult'; import { TEN_MINUTES, TWO_MINUTES } from '../../../common/queries/query-stale-time'; +import { ApiResponseWithResultsOffset } from '../../../common/types/api'; +import { getNextPageParam } from '../../../common/utils/utils'; -const SIGNER_ADDRESSES_QUERY_KEY = 'signer-addresses'; +const SIGNER_STACKERS_QUERY_KEY = 'signer-stackers'; +const SIGNER_STACKERS_INFINITE_QUERY_KEY = 'signer-stackers-infinite'; export interface SignersStackersData { stacker_address: string; stacked_amount: string; pox_address: string; + stacker_type: string; } export function useGetStackersBySignerQuery() { const { url: activeNetworkUrl } = useGlobalContext().activeNetwork; return (cycleId: number, signerKey: string) => ({ - queryKey: [SIGNER_ADDRESSES_QUERY_KEY, cycleId, signerKey], + queryKey: [SIGNER_STACKERS_QUERY_KEY, cycleId, signerKey], queryFn: () => fetch( `${activeNetworkUrl}/extended/v2/pox/cycles/${cycleId}/signers/${signerKey}/stackers` @@ -27,15 +36,57 @@ export function useGetStackersBySignerQuery() { }); } -export function useSuspenseSignerAddresses(cycleId: number, signerKey: string) { +export function useSuspenseSignerStackers(cycleId: number, signerKey: string) { const { url: activeNetworkUrl } = useGlobalContext().activeNetwork; - return useSuspenseQuery({ - queryKey: [SIGNER_ADDRESSES_QUERY_KEY, cycleId, signerKey], + return useSuspenseQuery>({ + queryKey: [SIGNER_STACKERS_QUERY_KEY, cycleId, signerKey], queryFn: () => - fetch(`${activeNetworkUrl}/extended/v2/pox/cycles/${cycleId}/signers/${signerKey}`).then( - res => res.json() - ), + fetch( + `${activeNetworkUrl}/extended/v2/pox/cycles/${cycleId}/signers/${signerKey}/stackers` + ).then(res => res.json()), staleTime: TEN_MINUTES, }); } + +const DEFAULT_LIST_LIMIT = 10; + +const fetchStackers = async ( + apiUrl: string, + cycleId: number, + signerKey: string, + pageParam: number, + options: { limit: number; offset: number } = { limit: DEFAULT_LIST_LIMIT, offset: 0 } +): Promise> => { + const limit = options.limit || DEFAULT_LIST_LIMIT; + const offset = pageParam || 0; + const queryString = new URLSearchParams({ + limit: limit.toString(), + offset: offset.toString(), + }).toString(); + const response = await fetch( + `${apiUrl}/extended/v2/pox/cycles/${cycleId}/signers/${signerKey}/stackers${ + queryString ? `?${queryString}` : '' + }` + ); + return response.json(); +}; + +export function useSuspenseSignerStackersInfinite( + cycleId: number, + signerKey: string, + options: { limit: number; offset: number } = { limit: DEFAULT_LIST_LIMIT, offset: 0 } +): UseInfiniteQueryResult>> { + const { url: activeNetworkUrl } = useGlobalContext().activeNetwork; + + return useInfiniteQuery>({ + queryKey: [SIGNER_STACKERS_INFINITE_QUERY_KEY, cycleId, signerKey], + queryFn: ({ pageParam = 0 }) => + fetchStackers(activeNetworkUrl, cycleId, signerKey, pageParam as number, options), + getNextPageParam, + initialPageParam: 0, + staleTime: TWO_MINUTES, + enabled: !!cycleId && !!signerKey, + ...options, + }); +} diff --git a/src/app/signers/data/signer-metrics-hooks.ts b/src/app/signers/data/signer-metrics-hooks.ts index f565deb8f..f545771fa 100644 --- a/src/app/signers/data/signer-metrics-hooks.ts +++ b/src/app/signers/data/signer-metrics-hooks.ts @@ -1,6 +1,3 @@ -import { TWO_MINUTES } from '@/common/queries/query-stale-time'; -import { ApiResponseWithResultsOffset } from '@/common/types/api'; -import { getNextPageParam } from '@/common/utils/utils'; import { InfiniteData, UseInfiniteQueryResult, @@ -9,6 +6,9 @@ import { } from '@tanstack/react-query'; import { useGlobalContext } from '../../../common/context/useGlobalContext'; +import { TWO_MINUTES } from '../../../common/queries/query-stale-time'; +import { ApiResponseWithResultsOffset } from '../../../common/types/api'; +import { getNextPageParam } from '../../../common/utils/utils'; const SIGNER_METRICS_STATUS_QUERY_KEY = 'signer-metrics-status'; const SIGNER_METRICS_SIGNERS_FOR_CYCLE_QUERY_KEY = 'signer-metrics-signers-for-cycle'; @@ -70,14 +70,14 @@ export function useSignerMetricsStatus(signerKey: string) { }); } -const DEFAULT_LIST_LIMIT = 10; +const DEFAULT_LIST_LIMIT = 100; const fetchSignersForCycle = async ( apiUrl: string, cycleId: number, pageParam: number, options: any -): Promise> => { +): Promise> => { const limit = options.limit || DEFAULT_LIST_LIMIT; const offset = pageParam || 0; const queryString = new URLSearchParams({ @@ -89,16 +89,13 @@ const fetchSignersForCycle = async ( ); return response.json(); }; - export function useSignerMetricsSignersForCycle( cycleId: number, options: any = {} -): UseInfiniteQueryResult< - InfiniteData> -> { +): UseInfiniteQueryResult>> { const { url: activeNetworkUrl } = useGlobalContext().activeNetwork; - return useInfiniteQuery>({ + return useInfiniteQuery>({ queryKey: [SIGNER_METRICS_SIGNERS_FOR_CYCLE_QUERY_KEY, cycleId], queryFn: ({ pageParam }: { pageParam: number }) => fetchSignersForCycle(activeNetworkUrl, cycleId, pageParam, options), @@ -122,6 +119,20 @@ export function useSignerMetricsSignerForCycle(cycleId: number, signerKey: strin }); } +export function useGetSignerMetricsSignerForCycleQuery() { + const { url: activeNetworkUrl } = useGlobalContext().activeNetwork; + return (cycleId: number, signerKey: string) => ({ + queryKey: [SIGNER_METRICS_SIGNER_FOR_CYCLE_QUERY_KEY, cycleId, signerKey], + queryFn: () => + fetch(`${activeNetworkUrl}/signer-metrics/v1/cycles/${cycleId}/signers/${signerKey}`).then( + res => res.json() as Promise + ), + staleTime: TWO_MINUTES, + cacheTime: 15 * 60 * 1000, + refetchOnWindowFocus: false, + }); +} + const fetchBlocks = async ( apiUrl: string, pageParam: number, diff --git a/src/app/signers/data/useSigners.ts b/src/app/signers/data/useSigners.ts index 5268360b2..717f338d5 100644 --- a/src/app/signers/data/useSigners.ts +++ b/src/app/signers/data/useSigners.ts @@ -1,10 +1,10 @@ -import { useSuspenseQuery } from '@tanstack/react-query'; +import { useSuspenseInfiniteQuery } from '@tanstack/react-query'; import { useGlobalContext } from '../../../common/context/useGlobalContext'; import { TEN_MINUTES } from '../../../common/queries/query-stale-time'; import { ApiResponseWithResultsOffset } from '../../../common/types/api'; -export interface SignerInfo { +export interface PoxSigner { signing_key: string; weight: number; stacked_amount: string; @@ -13,19 +13,42 @@ export interface SignerInfo { pooled_stacker_count: number; solo_stacker_count: number; } -export function useSuspensePoxSigners(cycleId: string) { + +const DEFAULT_LIST_LIMIT = 100; + +const POX_SIGNERS_QUERY_KEY = 'pox-signers'; + +const fetchPoxSigners = async ( + apiUrl: string, + cycleId: number, + pageParam: number, + options: { limit?: number; offset?: number } +): Promise> => { + const limit = options.limit || DEFAULT_LIST_LIMIT; + const offset = pageParam || 0; + const queryString = new URLSearchParams({ + limit: limit.toString(), + offset: offset.toString(), + }).toString(); + const response = await fetch( + `${apiUrl}/extended/v2/pox/cycles/${cycleId}/signers${queryString ? `?${queryString}` : ''}` + ); + return response.json(); +}; + +export function useSuspensePoxSigners( + cycleId: number, + options: { limit?: number; offset?: number } = {} +) { const { url: activeNetworkUrl } = useGlobalContext().activeNetwork; - return useSuspenseQuery< - ApiResponseWithResultsOffset, - Error, - ApiResponseWithResultsOffset - >({ - queryKey: ['signers', cycleId], - queryFn: () => - fetch(`${activeNetworkUrl}/extended/v2/pox/cycles/${cycleId}/signers`).then( - res => res.json() as Promise> - ), + return useSuspenseInfiniteQuery>({ + queryKey: [POX_SIGNERS_QUERY_KEY, cycleId], + queryFn: ({ pageParam = 0 }) => + fetchPoxSigners(activeNetworkUrl, cycleId, pageParam as number, options), staleTime: TEN_MINUTES, + getNextPageParam: (lastPage, pages) => lastPage.offset + lastPage.limit, + initialPageParam: 0, + ...options, }); } diff --git a/src/app/signers/skeleton.tsx b/src/app/signers/skeleton.tsx index 7b33c2029..cc8d688eb 100644 --- a/src/app/signers/skeleton.tsx +++ b/src/app/signers/skeleton.tsx @@ -16,9 +16,8 @@ import { SignerLegendItem, SignersDistributionLegendLayout } from './SignerDistr import { SignersHeaderLayout } from './SignersHeader'; import { SignersMapComponentLayout } from './SignersMapComponent'; import { SignersTableLayout, signersTableHeaders } from './SignersTable'; -import { VotingPowerSortOrder } from './SortByVotingPowerFilter'; -const TableRowSkeleton = ({ numCols }: { numCols: number }) => { +export const TableRowSkeleton = ({ numCols }: { numCols: number }) => { const cols = Array.from({ length: numCols }, (_, i) => i + 1); return ( @@ -32,7 +31,7 @@ const TableRowSkeleton = ({ numCols }: { numCols: number }) => { ); }; -const TableHeaderSkeleton = () => ( +export const TableHeaderSkeleton = () => ( { return ( } + title={} signersTableHeaders={ {numCols.map((_, i) => ( @@ -66,11 +65,6 @@ export const SignersTableSkeleton = () => { signersTableRows={numRows.map((_, i) => ( ))} - votingPowerSortOrder={VotingPowerSortOrder.Asc} - setVotingPowerSortOrder={() => {}} - cycleFilterOnSubmitHandler={() => {}} - selectedCycle={''} - currentCycleId={''} /> ); }; diff --git a/src/common/components/modals/AddNetwork/utils.ts b/src/common/components/modals/AddNetwork/utils.ts index f180e04e5..a2669b54a 100644 --- a/src/common/components/modals/AddNetwork/utils.ts +++ b/src/common/components/modals/AddNetwork/utils.ts @@ -1,9 +1,10 @@ -import { fetchFromApi } from '@/common/api/fetch'; -import { DEFAULT_V2_INFO_ENDPOINT } from '@/common/constants/constants'; import { string } from 'yup'; import { ChainID } from '@stacks/transactions'; +import { fetchFromApi } from '../../../api/fetch'; +import { DEFAULT_V2_INFO_ENDPOINT } from '../../../constants/constants'; + export async function validateUrl( missingErrorMessage: string, invalidErrorMessage: string, diff --git a/src/common/queries/useAddressMempoolTxsInfinite.ts b/src/common/queries/useAddressMempoolTxsInfinite.ts index 6ece76e9c..4f922710b 100644 --- a/src/common/queries/useAddressMempoolTxsInfinite.ts +++ b/src/common/queries/useAddressMempoolTxsInfinite.ts @@ -1,9 +1,10 @@ import { + InfiniteData, UseInfiniteQueryResult, + UseSuspenseInfiniteQueryResult, useInfiniteQuery, useSuspenseInfiniteQuery, } from '@tanstack/react-query'; -import { InfiniteData, UseSuspenseInfiniteQueryResult } from '@tanstack/react-query'; import { MempoolTransaction } from '@stacks/stacks-blockchain-api-types'; @@ -13,13 +14,15 @@ import { GenericResponseType } from '../hooks/useInfiniteQueryResult'; import { getNextPageParam } from '../utils/utils'; import { TWO_MINUTES } from './query-stale-time'; +const ADDRESS_MEMPOOL_TXS_INFINITE_QUERY_KEY = 'addressMempoolTxsInfinite'; + export function useAddressMempoolTxsInfinite( address?: string, options: any = {} ): UseInfiniteQueryResult>> { const api = useApi(); return useInfiniteQuery({ - queryKey: ['addressMempoolTxsInfinite', address], + queryKey: [ADDRESS_MEMPOOL_TXS_INFINITE_QUERY_KEY, address], queryFn: ({ pageParam }: { pageParam: number }) => api.transactionsApi.getMempoolTransactionList({ address, @@ -39,7 +42,7 @@ export function useSuspenseAddressMempoolTxsInfinite( ): UseSuspenseInfiniteQueryResult>> { const api = useApi(); return useSuspenseInfiniteQuery({ - queryKey: ['addressMempoolTxsInfinite', address], + queryKey: [ADDRESS_MEMPOOL_TXS_INFINITE_QUERY_KEY, address], queryFn: ({ pageParam }: { pageParam: number }) => api.transactionsApi.getMempoolTransactionList({ address, diff --git a/src/stories/Colors.stories.tsx b/src/stories/Colors.stories.tsx index 28ffd2760..cb46f534e 100644 --- a/src/stories/Colors.stories.tsx +++ b/src/stories/Colors.stories.tsx @@ -1,10 +1,10 @@ -import { Box } from '@/ui/Box'; -import { Flex } from '@/ui/Flex'; -import { Heading } from '@/ui/Heading'; -import { Stack } from '@/ui/Stack'; -import { Text } from '@/ui/Text'; import type { Meta, StoryObj } from '@storybook/react'; +import { Box } from '../ui/Box'; +import { Flex } from '../ui/Flex'; +import { Heading } from '../ui/Heading'; +import { Stack } from '../ui/Stack'; +import { Text } from '../ui/Text'; import { NEW_COLORS } from '../ui/theme/colors'; const ColorSwatch = ({