From 38c391700dd458c2a31d008895031fb6f7f11100 Mon Sep 17 00:00:00 2001 From: AU_019 <64915515+Dargon789@users.noreply.github.com> Date: Sat, 25 Jan 2025 03:21:50 +0700 Subject: [PATCH 01/92] Create static.yml Signed-off-by: AU_019 <64915515+Dargon789@users.noreply.github.com> --- .github/workflows/static.yml | 43 ++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 .github/workflows/static.yml diff --git a/.github/workflows/static.yml b/.github/workflows/static.yml new file mode 100644 index 00000000000..f2c9e97c91d --- /dev/null +++ b/.github/workflows/static.yml @@ -0,0 +1,43 @@ +# Simple workflow for deploying static content to GitHub Pages +name: Deploy static content to Pages + +on: + # Runs on pushes targeting the default branch + push: + branches: ["main"] + + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + +# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages +permissions: + contents: read + pages: write + id-token: write + +# Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued. +# However, do NOT cancel in-progress runs as we want to allow these production deployments to complete. +concurrency: + group: "pages" + cancel-in-progress: false + +jobs: + # Single deploy job since we're just deploying + deploy: + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Setup Pages + uses: actions/configure-pages@v5 + - name: Upload artifact + uses: actions/upload-pages-artifact@v3 + with: + # Upload entire repository + path: '.' + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v4 From c7937cff0865d78d8df3af67da8c95fcd51600f5 Mon Sep 17 00:00:00 2001 From: AU_019 <64915515+Dargon789@users.noreply.github.com> Date: Sat, 1 Feb 2025 19:32:20 +0700 Subject: [PATCH 02/92] Create SECURITY.md Signed-off-by: AU_019 <64915515+Dargon789@users.noreply.github.com> --- SECURITY.md | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 SECURITY.md diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 00000000000..034e8480320 --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,21 @@ +# Security Policy + +## Supported Versions + +Use this section to tell people about which versions of your project are +currently being supported with security updates. + +| Version | Supported | +| ------- | ------------------ | +| 5.1.x | :white_check_mark: | +| 5.0.x | :x: | +| 4.0.x | :white_check_mark: | +| < 4.0 | :x: | + +## Reporting a Vulnerability + +Use this section to tell people how to report a vulnerability. + +Tell them where to go, how often they can expect to get an update on a +reported vulnerability, what to expect if the vulnerability is accepted or +declined, etc. From 5e36ad3105e3ad579ca33d604623fc03688ae2de Mon Sep 17 00:00:00 2001 From: AU_019 <64915515+Dargon789@users.noreply.github.com> Date: Sat, 25 Jan 2025 03:17:58 +0700 Subject: [PATCH 03/92] Create jekyll-gh-pages.yml Signed-off-by: AU_019 <64915515+Dargon789@users.noreply.github.com> --- .github/workflows/jekyll-gh-pages.yml | 51 +++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 .github/workflows/jekyll-gh-pages.yml diff --git a/.github/workflows/jekyll-gh-pages.yml b/.github/workflows/jekyll-gh-pages.yml new file mode 100644 index 00000000000..e31d81c5864 --- /dev/null +++ b/.github/workflows/jekyll-gh-pages.yml @@ -0,0 +1,51 @@ +# Sample workflow for building and deploying a Jekyll site to GitHub Pages +name: Deploy Jekyll with GitHub Pages dependencies preinstalled + +on: + # Runs on pushes targeting the default branch + push: + branches: ["main"] + + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + +# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages +permissions: + contents: read + pages: write + id-token: write + +# Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued. +# However, do NOT cancel in-progress runs as we want to allow these production deployments to complete. +concurrency: + group: "pages" + cancel-in-progress: false + +jobs: + # Build job + build: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Setup Pages + uses: actions/configure-pages@v5 + - name: Build with Jekyll + uses: actions/jekyll-build-pages@v1 + with: + source: ./ + destination: ./_site + - name: Upload artifact + uses: actions/upload-pages-artifact@v3 + + # Deployment job + deploy: + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + runs-on: ubuntu-latest + needs: build + steps: + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v4 From 9cafb49c55f3a67a9225a3918c51d69501aaa206 Mon Sep 17 00:00:00 2001 From: AU_019 <64915515+Dargon789@users.noreply.github.com> Date: Sat, 1 Feb 2025 19:43:24 +0700 Subject: [PATCH 04/92] Potential fix for code scanning alert no. 11: Incomplete string escaping or encoding Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> Signed-off-by: AU_019 <64915515+Dargon789@users.noreply.github.com> --- apps/web/src/components/Logo/DoubleLogo.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/web/src/components/Logo/DoubleLogo.tsx b/apps/web/src/components/Logo/DoubleLogo.tsx index f67758bd79d..8a6155708d5 100644 --- a/apps/web/src/components/Logo/DoubleLogo.tsx +++ b/apps/web/src/components/Logo/DoubleLogo.tsx @@ -38,7 +38,7 @@ function LogolessPlaceholder({ currency, size }: { currency?: Currency; size: nu return ( - {currency?.symbol?.toUpperCase().replace('$', '').replace(/\s+/g, '').slice(0, 3)} + {currency?.symbol?.toUpperCase().replace(/\$/g, '').replace(/\s+/g, '').slice(0, 3)} {showNetworkLogo && ( From f7c261d40e18639f2e9e62fce3103ac78cd556d8 Mon Sep 17 00:00:00 2001 From: AU_019 <64915515+Dargon789@users.noreply.github.com> Date: Sun, 2 Feb 2025 01:24:29 +0700 Subject: [PATCH 05/92] Potential fix for code scanning alert no. 10: Incomplete regular expression for hostnames Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> Signed-off-by: AU_019 <64915515+Dargon789@users.noreply.github.com> --- apps/web/cypress/support/commands.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/web/cypress/support/commands.ts b/apps/web/cypress/support/commands.ts index 1b0bb49e07c..476905a0daa 100644 --- a/apps/web/cypress/support/commands.ts +++ b/apps/web/cypress/support/commands.ts @@ -160,7 +160,7 @@ export function registerCommands() { }) Cypress.Commands.add('interceptQuoteRequest', (fixturePath) => { - return cy.intercept(/(?:interface|beta).gateway.uniswap.org\/v2\/quote/, (req) => { + return cy.intercept(/(?:interface|beta)\.gateway\.uniswap\.org\/v2\/quote/, (req) => { req.headers['origin'] = 'https://app.uniswap.org' req.reply({ fixture: fixturePath }) }) From 09d7af53dee4a59af6b0400570f2df323bb90ca3 Mon Sep 17 00:00:00 2001 From: snyk-bot Date: Sat, 22 Feb 2025 18:51:54 +0000 Subject: [PATCH 06/92] fix: packages/wallet/package.json to reduce vulnerabilities The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-UNDICI-8641354 --- packages/wallet/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/wallet/package.json b/packages/wallet/package.json index 2ca27a2cb21..93a2861ccf0 100644 --- a/packages/wallet/package.json +++ b/packages/wallet/package.json @@ -17,7 +17,7 @@ "@ethersproject/contracts": "5.7.0", "@ethersproject/providers": "5.7.2", "@gorhom/bottom-sheet": "4.6.4", - "@react-native-firebase/app": "21.0.0", + "@react-native-firebase/app": "21.7.2", "@react-native-firebase/app-check": "21.0.0", "@react-navigation/core": "6.2.2", "@redux-saga/core": "1.2.3", From 0acc3d6eef658a984e17695ccf68c111a585766a Mon Sep 17 00:00:00 2001 From: snyk-bot Date: Sat, 22 Feb 2025 18:51:55 +0000 Subject: [PATCH 07/92] fix: packages/utilities/package.json to reduce vulnerabilities The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-CROSSSPAWN-8303230 --- packages/utilities/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/utilities/package.json b/packages/utilities/package.json index f5aa9ed21da..248afa2b778 100644 --- a/packages/utilities/package.json +++ b/packages/utilities/package.json @@ -30,7 +30,7 @@ "jsbi": "3.2.5", "promise": "8.3.0", "react": "18.3.1", - "react-native": "0.76.6", + "react-native": "0.77.0", "react-native-device-info": "10.0.2", "react-test-renderer": "18.3.1", "redux": "4.2.1", From 2c1f99b59106980599a8c79c8a6e0b45f43df6ca Mon Sep 17 00:00:00 2001 From: snyk-bot Date: Sat, 22 Feb 2025 18:52:05 +0000 Subject: [PATCH 08/92] fix: apps/mobile/package.json to reduce vulnerabilities The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-UNDICI-8641354 --- apps/mobile/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/mobile/package.json b/apps/mobile/package.json index c0bbff9515a..51e131d87cd 100644 --- a/apps/mobile/package.json +++ b/apps/mobile/package.json @@ -156,7 +156,7 @@ "typed-redux-saga": "1.5.0", "uniswap": "workspace:^", "utilities": "workspace:^", - "wallet": "workspace:^" + "wallet": "0.0.1" }, "devDependencies": { "@babel/core": "7.26.0", From e9755d62db3587cecb416a43afd23a54ab84aad5 Mon Sep 17 00:00:00 2001 From: snyk-bot Date: Sun, 23 Feb 2025 04:32:23 +0000 Subject: [PATCH 09/92] fix: apps/mobile/package.json to reduce vulnerabilities The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-OPENZEPPELINCONTRACTS-1570170 - https://snyk.io/vuln/SNYK-JS-CROSSSPAWN-8303230 - https://snyk.io/vuln/SNYK-JS-WS-7266574 - https://snyk.io/vuln/SNYK-JS-JPEGJS-2859218 - https://snyk.io/vuln/SNYK-JS-UTILITIES-3184491 - https://snyk.io/vuln/SNYK-JS-INFLIGHT-6095116 - https://snyk.io/vuln/SNYK-JS-OPENZEPPELINCONTRACTS-2320176 - https://snyk.io/vuln/SNYK-JS-OPENZEPPELINCONTRACTS-6056529 - https://snyk.io/vuln/SNYK-JS-OPENZEPPELINCONTRACTS-2980279 - https://snyk.io/vuln/SNYK-JS-SEND-7926862 - https://snyk.io/vuln/SNYK-JS-SERVESTATIC-7926865 - https://snyk.io/vuln/SNYK-JS-GRAPHQL-5905181 - https://snyk.io/vuln/SNYK-JS-OPENZEPPELINCONTRACTS-2965798 - https://snyk.io/vuln/SNYK-JS-NANOID-8492085 - https://snyk.io/vuln/SNYK-JS-OPENZEPPELINCONTRACTS-5425827 - https://snyk.io/vuln/SNYK-JS-PHIN-6598077 --- apps/mobile/package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/mobile/package.json b/apps/mobile/package.json index 51e131d87cd..a91377950c8 100644 --- a/apps/mobile/package.json +++ b/apps/mobile/package.json @@ -154,8 +154,8 @@ "redux-persist": "6.0.0", "redux-saga": "1.2.2", "typed-redux-saga": "1.5.0", - "uniswap": "workspace:^", - "utilities": "workspace:^", + "uniswap": "0.0.1", + "utilities": "1.0.6", "wallet": "0.0.1" }, "devDependencies": { From 5705e0dc492bb5d2ad88d56d6a2c2cd4065a9b32 Mon Sep 17 00:00:00 2001 From: snyk-bot Date: Sun, 23 Feb 2025 04:41:54 +0000 Subject: [PATCH 10/92] fix: apps/mobile/package.json to reduce vulnerabilities The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-7577916 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-7577917 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-7577918 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-8172694 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-8720086 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-8187303 - https://snyk.io/vuln/SNYK-JS-CROSSSPAWN-8303230 - https://snyk.io/vuln/SNYK-JS-WS-7266574 --- apps/mobile/package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/mobile/package.json b/apps/mobile/package.json index a91377950c8..2b598270337 100644 --- a/apps/mobile/package.json +++ b/apps/mobile/package.json @@ -102,7 +102,7 @@ "cross-fetch": "3.1.5", "d3-shape": "3.2.0", "dayjs": "1.11.7", - "ethers": "5.7.2", + "ethers": "6.0.0", "expo": "52.0.9", "expo-blur": "14.0.3", "expo-camera": "16.0.8", @@ -121,7 +121,7 @@ "react": "18.3.1", "react-freeze": "1.0.3", "react-i18next": "14.1.0", - "react-native": "0.76.6", + "react-native": "0.77.0", "react-native-appsflyer": "6.13.1", "react-native-bootsplash": "6.3.1", "react-native-context-menu-view": "1.15.0", From 2f09c4ecf5072f5a40f30efc3d933fa46179d38d Mon Sep 17 00:00:00 2001 From: snyk-bot Date: Sat, 1 Mar 2025 23:55:02 +0000 Subject: [PATCH 11/92] fix: packages/utilities/package.json to reduce vulnerabilities The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-8720086 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-7577916 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-7577917 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-7577918 - https://snyk.io/vuln/SNYK-JS-WS-7266574 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-8172694 --- packages/utilities/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/utilities/package.json b/packages/utilities/package.json index 248afa2b778..15d783a0510 100644 --- a/packages/utilities/package.json +++ b/packages/utilities/package.json @@ -14,7 +14,7 @@ "@ethersproject/address": "5.7.0", "@ethersproject/constants": "5.7.0", "@ethersproject/contracts": "5.7.0", - "@ethersproject/providers": "5.7.2", + "@ethersproject/providers": "5.8.0", "@react-native-community/netinfo": "11.4.1", "@react-navigation/core": "6.2.2", "@sentry/core": "7.80.0", From 7a36b0856c0e807d4c9b7e18fa2dfdcf2c783672 Mon Sep 17 00:00:00 2001 From: snyk-bot Date: Sun, 2 Mar 2025 00:08:02 +0000 Subject: [PATCH 12/92] fix: packages/uniswap/package.json to reduce vulnerabilities The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-WS-7266574 --- packages/uniswap/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/uniswap/package.json b/packages/uniswap/package.json index e5b5549db81..89fffa6ab89 100644 --- a/packages/uniswap/package.json +++ b/packages/uniswap/package.json @@ -30,7 +30,7 @@ "@ethersproject/bignumber": "5.7.0", "@ethersproject/hash": "5.7.0", "@ethersproject/properties": "5.7.0", - "@ethersproject/providers": "5.7.2", + "@ethersproject/providers": "5.8.0", "@ethersproject/units": "5.7.0", "@ethersproject/web": "5.7.1", "@gorhom/bottom-sheet": "4.6.4", From 1b8ac68fb5e312d63c2e912dee30413fca0a21c6 Mon Sep 17 00:00:00 2001 From: snyk-bot Date: Sun, 2 Mar 2025 20:40:48 +0000 Subject: [PATCH 13/92] fix: packages/uniswap/package.json to reduce vulnerabilities The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-7577916 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-7577917 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-7577918 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-8172694 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-8187303 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-8720086 --- packages/uniswap/package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/uniswap/package.json b/packages/uniswap/package.json index 89fffa6ab89..0c58310e159 100644 --- a/packages/uniswap/package.json +++ b/packages/uniswap/package.json @@ -96,8 +96,8 @@ "statsig-react-native": "4.15.0", "tiny-invariant": "1.3.1", "typed-redux-saga": "1.5.0", - "ui": "workspace:^", - "utilities": "workspace:^", + "ui": "0.0.0", + "utilities": "1.0.6", "uuid": "9.0.0", "wagmi": "2.9.3", "wcag-contrast": "3.0.0", From c9d06b92c9f1e959fefb307b0c18a0de14d0646b Mon Sep 17 00:00:00 2001 From: snyk-bot Date: Mon, 3 Mar 2025 08:40:17 +0000 Subject: [PATCH 14/92] fix: packages/uniswap/package.json to reduce vulnerabilities The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-CROSSSPAWN-8303230 --- packages/uniswap/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/uniswap/package.json b/packages/uniswap/package.json index 0c58310e159..16fa6548b6d 100644 --- a/packages/uniswap/package.json +++ b/packages/uniswap/package.json @@ -76,7 +76,7 @@ "qs": "6.11.0", "react": "18.3.1", "react-i18next": "14.1.0", - "react-native": "0.76.6", + "react-native": "0.77.0", "react-native-appsflyer": "6.13.1", "react-native-device-info": "10.0.2", "react-native-gesture-handler": "2.21.2", From 86f739db5a4310346e46dba2469503be448e7224 Mon Sep 17 00:00:00 2001 From: snyk-bot Date: Mon, 3 Mar 2025 10:23:09 +0000 Subject: [PATCH 15/92] fix: packages/uniswap/package.json to reduce vulnerabilities The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-INFLIGHT-6095116 --- packages/uniswap/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/uniswap/package.json b/packages/uniswap/package.json index 16fa6548b6d..ac652eae7b2 100644 --- a/packages/uniswap/package.json +++ b/packages/uniswap/package.json @@ -99,7 +99,7 @@ "ui": "0.0.0", "utilities": "1.0.6", "uuid": "9.0.0", - "wagmi": "2.9.3", + "wagmi": "2.12.23", "wcag-contrast": "3.0.0", "zod": "3.22.4" }, From 7991e0dd8646342e7ff7e4fd14d2f61611a8b220 Mon Sep 17 00:00:00 2001 From: snyk-bot Date: Mon, 3 Mar 2025 22:14:40 +0000 Subject: [PATCH 16/92] fix: apps/extension/package.json to reduce vulnerabilities The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-WS-7266574 --- apps/extension/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/extension/package.json b/apps/extension/package.json index 135de693362..064e4c82b25 100644 --- a/apps/extension/package.json +++ b/apps/extension/package.json @@ -6,7 +6,7 @@ "@apollo/client": "3.10.4", "@datadog/browser-logs": "5.20.0", "@datadog/browser-rum": "5.23.3", - "@ethersproject/providers": "5.7.2", + "@ethersproject/providers": "5.8.0", "@metamask/rpc-errors": "6.2.1", "@reduxjs/toolkit": "1.9.3", "@svgr/webpack": "8.0.1", From 35bea4b211862402f6ad5d037fa050f17e04d0cd Mon Sep 17 00:00:00 2001 From: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> Date: Tue, 4 Mar 2025 17:20:19 +0700 Subject: [PATCH 17/92] Potential fix for code scanning alert no. 9: Incomplete regular expression for hostnames (#10) Signed-off-by: AU_019 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> --- apps/web/cypress/support/commands.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/web/cypress/support/commands.ts b/apps/web/cypress/support/commands.ts index 476905a0daa..f35f18e9b4b 100644 --- a/apps/web/cypress/support/commands.ts +++ b/apps/web/cypress/support/commands.ts @@ -144,7 +144,7 @@ export function registerCommands() { Cypress.Commands.add('interceptGraphqlOperation', (operationName, fixturePath) => { const graphqlInterceptions = Cypress.env('graphqlInterceptions') - cy.intercept(/(?:interface|beta).gateway.uniswap.org\/v1\/graphql/, (req) => { + cy.intercept(/(?:interface|beta)\.gateway\.uniswap\.org\/v1\/graphql/, (req) => { req.headers['origin'] = 'https://app.uniswap.org' const currentOperationName = req.body.operationName From 186408f45d4ef4e1e9f02e9317d358c493021a87 Mon Sep 17 00:00:00 2001 From: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> Date: Tue, 4 Mar 2025 17:30:10 +0700 Subject: [PATCH 18/92] Potential fix for code scanning alert no. 2: Inefficient regular expression (#11) Signed-off-by: AU_019 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> --- apps/web/src/utils/isDataUri.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/web/src/utils/isDataUri.ts b/apps/web/src/utils/isDataUri.ts index 3c4dd268701..7ed84764898 100644 --- a/apps/web/src/utils/isDataUri.ts +++ b/apps/web/src/utils/isDataUri.ts @@ -3,5 +3,5 @@ * @see {@link https://www.rfc-editor.org/rfc/rfc2397} */ export default function isDataURI(uri: string): boolean { - return /data:(image\/[-+\w.]+)(;?\w+=[-\w]+)*(;base64)?,.*/gu.test(uri) + return /data:(image\/(?:\w|-)+)(;?\w+=[\w-]+)*(;base64)?,.*/gu.test(uri) } From b81f3b9e18fd3115c8317d75367e22406ce59a5a Mon Sep 17 00:00:00 2001 From: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> Date: Tue, 4 Mar 2025 18:49:16 +0700 Subject: [PATCH 19/92] fix: packages/uniswap/package.json to reduce vulnerabilities (#14) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-AXIOS-7361793 Co-authored-by: snyk-bot --- packages/uniswap/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/uniswap/package.json b/packages/uniswap/package.json index ac652eae7b2..b3bfea874a3 100644 --- a/packages/uniswap/package.json +++ b/packages/uniswap/package.json @@ -55,7 +55,7 @@ "@uniswap/v3-sdk": "3.24.0", "@uniswap/v4-sdk": "1.19.2", "apollo-link-rest": "0.9.0", - "axios": "1.6.5", + "axios": "1.7.4", "date-fns": "2.30.0", "dayjs": "1.11.7", "es-toolkit": "1.10.0", From 049c9a48af8933a4022047bc53e43b22af99c841 Mon Sep 17 00:00:00 2001 From: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> Date: Tue, 4 Mar 2025 18:50:01 +0700 Subject: [PATCH 20/92] fix: apps/extension/package.json to reduce vulnerabilities (#17) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-UNDICI-8641354 Co-authored-by: snyk-bot --- apps/extension/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/extension/package.json b/apps/extension/package.json index 064e4c82b25..cc4988c9b6a 100644 --- a/apps/extension/package.json +++ b/apps/extension/package.json @@ -45,7 +45,7 @@ "uniswap": "workspace:^", "utilities": "workspace:^", "uuid": "9.0.0", - "wallet": "workspace:^", + "wallet": "0.0.1", "zod": "3.22.4" }, "devDependencies": { From 1a07ec8100f3914a4e87dfb8ee4c8cf49e26d9e3 Mon Sep 17 00:00:00 2001 From: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> Date: Tue, 4 Mar 2025 18:58:19 +0700 Subject: [PATCH 21/92] fix: apps/mobile/Gemfile & apps/mobile/Gemfile.lock to reduce vulnerabilities (#19) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-RUBY-REXML-7814166 - https://snyk.io/vuln/SNYK-RUBY-REXML-7577227 - https://snyk.io/vuln/SNYK-RUBY-REXML-6861566 - https://snyk.io/vuln/SNYK-RUBY-REXML-7577228 - https://snyk.io/vuln/SNYK-RUBY-REXML-7462086 Co-authored-by: snyk-bot --- apps/mobile/Gemfile | 2 +- apps/mobile/Gemfile.lock | 17 ++++++++--------- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/apps/mobile/Gemfile b/apps/mobile/Gemfile index f3847106e0d..19ced2ea626 100644 --- a/apps/mobile/Gemfile +++ b/apps/mobile/Gemfile @@ -4,7 +4,7 @@ gem 'fastlane', '2.214.0' # Exclude problematic versions of cocoapods and activesupport that causes build failures. gem 'cocoapods', '1.14.3' gem 'activesupport', '7.1.2' -gem 'xcodeproj', '1.26.0' +gem 'xcodeproj', '1.25.1' plugins_path = File.join(File.dirname(__FILE__), 'fastlane', 'Pluginfile') eval_gemfile(plugins_path) if File.exist?(plugins_path) diff --git a/apps/mobile/Gemfile.lock b/apps/mobile/Gemfile.lock index f3b95f291b9..cc456db1164 100644 --- a/apps/mobile/Gemfile.lock +++ b/apps/mobile/Gemfile.lock @@ -1,7 +1,9 @@ GEM remote: https://rubygems.org/ specs: - CFPropertyList (3.0.6) + CFPropertyList (3.0.7) + base64 + nkf rexml activesupport (7.1.2) base64 @@ -162,8 +164,6 @@ GEM xcodeproj (>= 1.13.0, < 2.0.0) xcpretty (~> 0.3.0) xcpretty-travis-formatter (>= 0.0.3) - fastlane-plugin-get_version_name (0.2.2) - fastlane-plugin-versioning_android (0.1.1) ffi (1.17.1) fourflusher (2.3.1) fuzzy_match (2.0.4) @@ -226,6 +226,7 @@ GEM nap (1.1.0) naturally (2.2.1) netrc (0.11.0) + nkf (0.2.0) optparse (0.1.1) os (1.1.4) plist (3.7.1) @@ -236,7 +237,7 @@ GEM trailblazer-option (>= 0.1.1, < 0.2.0) uber (< 0.2.0) retriable (3.1.2) - rexml (3.2.6) + rexml (3.4.1) rouge (2.0.7) ruby-macho (2.5.1) ruby2_keywords (0.0.5) @@ -266,13 +267,13 @@ GEM unicode-display_width (1.8.0) webrick (1.8.1) word_wrap (1.0.0) - xcodeproj (1.23.0) + xcodeproj (1.25.1) CFPropertyList (>= 2.3.3, < 4.0) atomos (~> 0.1.3) claide (>= 1.0.2, < 2.0) colored2 (~> 3.1) nanaimo (~> 0.3.0) - rexml (~> 3.2.4) + rexml (>= 3.3.6, < 4.0) xcpretty (0.3.0) rouge (~> 2.0.7) xcpretty-travis-formatter (1.0.1) @@ -285,9 +286,7 @@ DEPENDENCIES activesupport (= 7.1.2) cocoapods (= 1.14.3) fastlane (= 2.214.0) - fastlane-plugin-get_version_name - fastlane-plugin-versioning_android - xcodeproj (= 1.26.0) + xcodeproj (= 1.25.1) BUNDLED WITH 2.4.10 From 62f5c53b83a00285f1d3beb48004e9feb6bf5c7e Mon Sep 17 00:00:00 2001 From: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> Date: Tue, 4 Mar 2025 19:06:18 +0700 Subject: [PATCH 22/92] fix: apps/mobile/package.json to reduce vulnerabilities (#23) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-8720086 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-8187303 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-7577916 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-7577917 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-7577918 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-8172694 Co-authored-by: snyk-bot --- apps/mobile/package.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/mobile/package.json b/apps/mobile/package.json index 2b598270337..9412c9240ff 100644 --- a/apps/mobile/package.json +++ b/apps/mobile/package.json @@ -81,7 +81,7 @@ "@react-navigation/native-stack": "6.7.0", "@react-navigation/stack": "6.2.2", "@reduxjs/toolkit": "1.9.3", - "@reown/walletkit": "1.1.1", + "@reown/walletkit": "1.2.0", "@shopify/flash-list": "1.7.1", "@shopify/react-native-performance": "4.1.2", "@shopify/react-native-performance-navigation": "3.0.0", @@ -93,9 +93,9 @@ "@uniswap/client-explore": "0.0.15", "@uniswap/ethers-rs-mobile": "0.0.5", "@uniswap/sdk-core": "7.5.0", - "@walletconnect/core": "2.17.1", + "@walletconnect/core": "2.18.0", "@walletconnect/react-native-compat": "2.17.1", - "@walletconnect/utils": "2.17.1", + "@walletconnect/utils": "2.18.0", "apollo3-cache-persist": "0.14.1", "babel-plugin-transform-inline-environment-variables": "0.4.4", "babel-plugin-transform-remove-console": "6.9.4", From 4abfd1317c7f5abf38236871dcbdaaab64d38a31 Mon Sep 17 00:00:00 2001 From: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> Date: Tue, 4 Mar 2025 19:10:05 +0700 Subject: [PATCH 23/92] fix: apps/extension/package.json to reduce vulnerabilities (#30) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-8720086 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-8187303 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-7577916 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-7577917 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-7577918 - https://snyk.io/vuln/SNYK-JS-OPENZEPPELINCONTRACTS-1570170 - https://snyk.io/vuln/SNYK-JS-CROSSSPAWN-8303230 - https://snyk.io/vuln/SNYK-JS-WS-7266574 - https://snyk.io/vuln/SNYK-JS-JPEGJS-2859218 - https://snyk.io/vuln/SNYK-JS-UTILITIES-3184491 - https://snyk.io/vuln/SNYK-JS-INFLIGHT-6095116 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-8172694 - https://snyk.io/vuln/SNYK-JS-OPENZEPPELINCONTRACTS-2320176 - https://snyk.io/vuln/SNYK-JS-OPENZEPPELINCONTRACTS-6056529 - https://snyk.io/vuln/SNYK-JS-OPENZEPPELINCONTRACTS-2980279 - https://snyk.io/vuln/SNYK-JS-SEND-7926862 - https://snyk.io/vuln/SNYK-JS-SERVESTATIC-7926865 - https://snyk.io/vuln/SNYK-JS-GRAPHQL-5905181 - https://snyk.io/vuln/SNYK-JS-OPENZEPPELINCONTRACTS-2965798 - https://snyk.io/vuln/SNYK-JS-NANOID-8492085 - https://snyk.io/vuln/SNYK-JS-OPENZEPPELINCONTRACTS-5425827 - https://snyk.io/vuln/SNYK-JS-PHIN-6598077 Co-authored-by: snyk-bot --- apps/extension/package.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/extension/package.json b/apps/extension/package.json index cc4988c9b6a..f7434ee1b96 100644 --- a/apps/extension/package.json +++ b/apps/extension/package.json @@ -41,9 +41,9 @@ "symbol-observable": "4.0.0", "typed-redux-saga": "1.5.0", "ua-parser-js": "1.0.37", - "ui": "workspace:^", - "uniswap": "workspace:^", - "utilities": "workspace:^", + "ui": "0.0.0", + "uniswap": "0.0.1", + "utilities": "1.0.6", "uuid": "9.0.0", "wallet": "0.0.1", "zod": "3.22.4" From 31a92d0180d79dba89359970513d125e432340b2 Mon Sep 17 00:00:00 2001 From: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> Date: Tue, 4 Mar 2025 19:18:38 +0700 Subject: [PATCH 24/92] fix: apps/extension/package.json to reduce vulnerabilities (#31) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-CROSSSPAWN-8303230 Co-authored-by: snyk-bot --- apps/extension/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/extension/package.json b/apps/extension/package.json index f7434ee1b96..e7ed552c116 100644 --- a/apps/extension/package.json +++ b/apps/extension/package.json @@ -25,7 +25,7 @@ "react": "18.3.1", "react-dom": "18.3.1", "react-i18next": "14.1.0", - "react-native": "0.76.6", + "react-native": "0.77.0", "react-native-gesture-handler": "2.21.2", "react-native-reanimated": "3.16.7", "react-native-svg": "15.10.1", From 70d8accdd3ca17fa5049125ad0dbe96ca8cac36f Mon Sep 17 00:00:00 2001 From: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> Date: Tue, 4 Mar 2025 19:20:19 +0700 Subject: [PATCH 25/92] fix: apps/extension/package.json to reduce vulnerabilities (#32) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-INFLIGHT-6095116 Co-authored-by: snyk-bot --- apps/extension/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/extension/package.json b/apps/extension/package.json index e7ed552c116..55abf6a70c5 100644 --- a/apps/extension/package.json +++ b/apps/extension/package.json @@ -21,7 +21,7 @@ "ethers": "5.7.2", "eventemitter3": "5.0.1", "i18next": "23.10.0", - "node-polyfill-webpack-plugin": "2.0.1", + "node-polyfill-webpack-plugin": "4.1.0", "react": "18.3.1", "react-dom": "18.3.1", "react-i18next": "14.1.0", From 69612cb6dd4e7ab2ca95f8fcde2af61b35d54aa4 Mon Sep 17 00:00:00 2001 From: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> Date: Thu, 6 Mar 2025 01:34:04 +0700 Subject: [PATCH 26/92] Circleci project setup (#34) * Add .circleci/config.yml * Add .circleci/config.yml * ci(release): publish latest release --------- Co-authored-by: Uniswap Labs Service Account --- .circleci/config.yml | 31 +++++++++++++++++++ RELEASE | 15 ++++++--- VERSION | 2 +- .../uniswap/src/features/gating/configs.ts | 1 + .../swap/hooks/usePollingIntervalByChain.ts | 10 ++++++ 5 files changed, 53 insertions(+), 6 deletions(-) create mode 100644 .circleci/config.yml diff --git a/.circleci/config.yml b/.circleci/config.yml new file mode 100644 index 00000000000..62291703e26 --- /dev/null +++ b/.circleci/config.yml @@ -0,0 +1,31 @@ +# Use the latest 2.1 version of CircleCI pipeline process engine. +# See: https://circleci.com/docs/configuration-reference +version: 2.1 + +# Define a job to be invoked later in a workflow. +# See: https://circleci.com/docs/jobs-steps/#jobs-overview & https://circleci.com/docs/configuration-reference/#jobs +jobs: + say-hello: + # Specify the execution environment. You can specify an image from Docker Hub or use one of our convenience images from CircleCI's Developer Hub. + # See: https://circleci.com/docs/executor-intro/ & https://circleci.com/docs/configuration-reference/#executor-job + docker: + # Specify the version you desire here + # See: https://circleci.com/developer/images/image/cimg/base + - image: cimg/base:current + + # Add steps to the job + # See: https://circleci.com/docs/jobs-steps/#steps-overview & https://circleci.com/docs/configuration-reference/#steps + steps: + # Checkout the code as the first step. + - checkout + - run: + name: "Say hello" + command: "echo Hello, World!" + +# Orchestrate jobs using workflows +# See: https://circleci.com/docs/workflows/ & https://circleci.com/docs/configuration-reference/#workflows +workflows: + say-hello-workflow: # This is the name of the workflow, feel free to change it to better match your workflow. + # Inside the workflow, you define the jobs you want to run. + jobs: + - say-hello \ No newline at end of file diff --git a/RELEASE b/RELEASE index 8cdd815b6c8..a047fc4e21c 100644 --- a/RELEASE +++ b/RELEASE @@ -1,6 +1,6 @@ IPFS hash of the deployment: -- CIDv0: `QmQZe48wGBwx6z8DuboTG62AYf8BbKd6XYDENefVZUvjyV` -- CIDv1: `bafybeibbbmxslnkqathnm7vryt3oxm6pcjcwyc7s4c7u2agjr6b6uyo4vq` +- CIDv0: `QmSHXp5oNAxME6KY7LJy4ndnuBfL3ujQ67aMiPuTUuQ66g` +- CIDv1: `bafybeib2ui2plf3zbinsp24o4d5ir66yr4a3qlg55kswt2rmlgkoomvigu` The latest release is always mirrored at [app.uniswap.org](https://app.uniswap.org). @@ -10,9 +10,14 @@ You can also access the Uniswap Interface from an IPFS gateway. Your Uniswap settings are never remembered across different URLs. IPFS gateways: -- https://bafybeibbbmxslnkqathnm7vryt3oxm6pcjcwyc7s4c7u2agjr6b6uyo4vq.ipfs.dweb.link/ -- [ipfs://QmQZe48wGBwx6z8DuboTG62AYf8BbKd6XYDENefVZUvjyV/](ipfs://QmQZe48wGBwx6z8DuboTG62AYf8BbKd6XYDENefVZUvjyV/) +- https://bafybeib2ui2plf3zbinsp24o4d5ir66yr4a3qlg55kswt2rmlgkoomvigu.ipfs.dweb.link/ +- [ipfs://QmSHXp5oNAxME6KY7LJy4ndnuBfL3ujQ67aMiPuTUuQ66g/](ipfs://QmSHXp5oNAxME6KY7LJy4ndnuBfL3ujQ67aMiPuTUuQ66g/) -### 5.72.3 (2025-02-21) +## 5.73.0 (2025-02-26) + + +### Features + +* **web:** reduce monad testnet quote polling interval (#16719) c99cc6c diff --git a/VERSION b/VERSION index 6bee9fd42d9..d8763a818ae 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -web/5.72.3 \ No newline at end of file +web/5.73.0 \ No newline at end of file diff --git a/packages/uniswap/src/features/gating/configs.ts b/packages/uniswap/src/features/gating/configs.ts index 4979164e7ea..db13bb97924 100644 --- a/packages/uniswap/src/features/gating/configs.ts +++ b/packages/uniswap/src/features/gating/configs.ts @@ -33,6 +33,7 @@ export enum SwapConfigKey { AverageL1BlockTimeMs = 'averageL1BlockTimeMs', AverageL2BlockTimeMs = 'averageL2BlockTimeMs', TradingApiSwapRequestMs = 'tradingApiSwapRequestMs', + MonadTestnetPollingIntervalMs = 'monadTestnetPollingIntervalMs', MinAutoSlippageToleranceL2 = 'minAutoSlippageToleranceL2', diff --git a/packages/uniswap/src/features/transactions/swap/hooks/usePollingIntervalByChain.ts b/packages/uniswap/src/features/transactions/swap/hooks/usePollingIntervalByChain.ts index b7398fccb03..95055fde707 100644 --- a/packages/uniswap/src/features/transactions/swap/hooks/usePollingIntervalByChain.ts +++ b/packages/uniswap/src/features/transactions/swap/hooks/usePollingIntervalByChain.ts @@ -21,9 +21,19 @@ export function usePollingIntervalByChain(chainId?: UniverseChainId): number { AVERAGE_L2_BLOCK_TIME_MS, ) + const monadTestnetPollingIntervalMs = useDynamicConfigValue( + DynamicConfigs.Swap, + SwapConfigKey.MonadTestnetPollingIntervalMs, + AVERAGE_L2_BLOCK_TIME_MS, + ) + // TODO(WEB-6132): remove this flag once short term experiment is complete const enableTwoSecondInterval = useFeatureFlag(FeatureFlags.TwoSecondSwapQuotePollingInterval) const l2PollingInterval = enableTwoSecondInterval ? 2 * ONE_SECOND_MS : averageL2BlockTimeMs + // Remove this dynamic config once Monad RPC latency issues are resolved + if (chainId === UniverseChainId.MonadTestnet) { + return monadTestnetPollingIntervalMs + } return isMainnetChainId(chainId) ? averageL1BlockTimeMs : l2PollingInterval } From cbfbdbf34e1fafd7aee9496901a2aefac74a99f1 Mon Sep 17 00:00:00 2001 From: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> Date: Thu, 6 Mar 2025 01:50:01 +0700 Subject: [PATCH 27/92] fix: packages/wallet/package.json to reduce vulnerabilities (#33) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-WS-7266574 Co-authored-by: snyk-bot --- packages/wallet/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/wallet/package.json b/packages/wallet/package.json index 93a2861ccf0..e80eb009f3e 100644 --- a/packages/wallet/package.json +++ b/packages/wallet/package.json @@ -15,7 +15,7 @@ "@ethersproject/abstract-signer": "5.7.0", "@ethersproject/constants": "5.7.0", "@ethersproject/contracts": "5.7.0", - "@ethersproject/providers": "5.7.2", + "@ethersproject/providers": "5.8.0", "@gorhom/bottom-sheet": "4.6.4", "@react-native-firebase/app": "21.7.2", "@react-native-firebase/app-check": "21.0.0", From d3a93e8dcf4de0854aa9b2205e8da695eb30a9c1 Mon Sep 17 00:00:00 2001 From: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> Date: Thu, 6 Mar 2025 02:02:13 +0700 Subject: [PATCH 28/92] fix: packages/wallet/package.json to reduce vulnerabilities (#35) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-8720086 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-8187303 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-7577916 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-7577917 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-7577918 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-8172694 Co-authored-by: snyk-bot --- packages/wallet/package.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/wallet/package.json b/packages/wallet/package.json index e80eb009f3e..e99f8f74b92 100644 --- a/packages/wallet/package.json +++ b/packages/wallet/package.json @@ -61,9 +61,9 @@ "redux-saga": "1.2.2", "redux-saga-test-plan": "4.0.4", "typed-redux-saga": "1.5.0", - "ui": "workspace:^", - "uniswap": "workspace:^", - "utilities": "workspace:^", + "ui": "0.0.0", + "uniswap": "0.0.1", + "utilities": "1.0.6", "zod": "3.22.4", "zxcvbn": "4.4.2" }, From d62098f8fed3dc5a2c7233ad6b3c803113e47024 Mon Sep 17 00:00:00 2001 From: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> Date: Thu, 6 Mar 2025 05:44:04 +0700 Subject: [PATCH 29/92] fix: packages/wallet/package.json to reduce vulnerabilities (#36) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-CROSSSPAWN-8303230 Co-authored-by: snyk-bot --- packages/wallet/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/wallet/package.json b/packages/wallet/package.json index e99f8f74b92..d339aa039da 100644 --- a/packages/wallet/package.json +++ b/packages/wallet/package.json @@ -45,7 +45,7 @@ "no-yolo-signatures": "0.0.2", "react": "18.3.1", "react-i18next": "14.1.0", - "react-native": "0.76.6", + "react-native": "0.77.0", "react-native-context-menu-view": "1.15.0", "react-native-fast-image": "8.6.3", "react-native-gesture-handler": "2.21.2", From 936eb1a8ae92f30175c1d678b434e0264908c313 Mon Sep 17 00:00:00 2001 From: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> Date: Thu, 6 Mar 2025 17:55:58 +0700 Subject: [PATCH 30/92] Circleci project setup (#37) * Add .circleci/config.yml * Add .circleci/config.yml * ci(release): publish latest release --------- Co-authored-by: Uniswap Labs Service Account From 364eefa5ab1684236b6b9f7aff73ba20c58a0eb4 Mon Sep 17 00:00:00 2001 From: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> Date: Thu, 6 Mar 2025 20:04:41 +0700 Subject: [PATCH 31/92] Potential fix for code scanning alert no. 12: Inefficient regular expression (#38) Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> --- apps/web/src/utils/isDataUri.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/web/src/utils/isDataUri.ts b/apps/web/src/utils/isDataUri.ts index 7ed84764898..39c71050880 100644 --- a/apps/web/src/utils/isDataUri.ts +++ b/apps/web/src/utils/isDataUri.ts @@ -3,5 +3,5 @@ * @see {@link https://www.rfc-editor.org/rfc/rfc2397} */ export default function isDataURI(uri: string): boolean { - return /data:(image\/(?:\w|-)+)(;?\w+=[\w-]+)*(;base64)?,.*/gu.test(uri) + return /data:(image\/(?:\w|-)+)(;?\w+=\w+)*(;base64)?,.*/gu.test(uri) } From 7ceded6ae4049e5421a9d09cac9192a9a53d78d6 Mon Sep 17 00:00:00 2001 From: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> Date: Thu, 6 Mar 2025 20:57:21 +0700 Subject: [PATCH 32/92] Circleci project setup (#39) * Add .circleci/config.yml * Add .circleci/config.yml * ci(release): publish latest release --------- Co-authored-by: Uniswap Labs Service Account From 7d01e370ef2fa70e64b563683a893f5e2fe6cd85 Mon Sep 17 00:00:00 2001 From: snyk-bot Date: Thu, 6 Mar 2025 21:53:20 +0000 Subject: [PATCH 33/92] feat: upgrade turbo from 1.13.4 to 2.4.2 Snyk has created this PR to upgrade turbo from 1.13.4 to 2.4.2. See this package in yarn: turbo See this project in Snyk: https://app.snyk.io/org/dargon789/project/f1f45494-5345-451e-b5b7-2db758f979e0?utm_source=github&utm_medium=referral&page=upgrade-pr --- package.json | 2 +- yarn.lock | 50691 ++++--------------------------------------------- 2 files changed, 3908 insertions(+), 46785 deletions(-) diff --git a/package.json b/package.json index 09d5a6a4d35..8d5f5454b72 100644 --- a/package.json +++ b/package.json @@ -19,7 +19,7 @@ "prettier": "3.3.2", "prettier-plugin-organize-imports": "3.2.4", "syncpack": "8.5.14", - "turbo": "1.13.4", + "turbo": "2.4.2", "turbo-ignore": "1.11.3" }, "engines": { diff --git a/yarn.lock b/yarn.lock index de2e13875ad..3d13378b9a1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5,68 +5,6 @@ __metadata: version: 6 cacheKey: 8 -"@0no-co/graphql.web@npm:^1.0.5, @0no-co/graphql.web@npm:^1.0.8": - version: 1.0.13 - resolution: "@0no-co/graphql.web@npm:1.0.13" - peerDependencies: - graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 - peerDependenciesMeta: - graphql: - optional: true - checksum: d5899f374618d73620c04f85fd5f90ea469b153b3d484c1f203042864530f3439c552a56944d2f3e7f8026b26b14d62d7a592d3b1670eb5386ee2d71833e3ae1 - languageName: node - linkType: hard - -"@0xsequence/abi@npm:^0.39.6": - version: 0.39.6 - resolution: "@0xsequence/abi@npm:0.39.6" - checksum: 1a953e0c5379f9c015626f22ab8b84a2996a66af7b1aa8740674690ca87e4622917cebdecf426ae46fe4394c726077686ba4d8971a277abb74bc586707a05d3c - languageName: node - linkType: hard - -"@0xsequence/multicall@npm:^0.39.0": - version: 0.39.6 - resolution: "@0xsequence/multicall@npm:0.39.6" - dependencies: - "@0xsequence/abi": ^0.39.6 - "@0xsequence/network": ^0.39.6 - "@0xsequence/utils": ^0.39.6 - "@ethersproject/providers": ^5.5.1 - ethers: ^5.5.2 - checksum: cccfe1bf4dca8bdba3c7d0a02c95966f36405a64b119ee67c37157a731801290436a1b0bad6d06c868039401bcc25f4cdce910d861621f4c8cbcb9c37f50f35f - languageName: node - linkType: hard - -"@0xsequence/network@npm:^0.39.6": - version: 0.39.6 - resolution: "@0xsequence/network@npm:0.39.6" - dependencies: - "@0xsequence/utils": ^0.39.6 - "@ethersproject/providers": ^5.5.1 - ethers: ^5.5.2 - checksum: 18c739245b94845f2bdebf5024bfaa9ad8bab3ea29efb7021db287a0d169609b99ed6695659bcb4d4c44937c458b5b5cb4431c95f61f3d0cd095aa362a7501d9 - languageName: node - linkType: hard - -"@0xsequence/utils@npm:^0.39.6": - version: 0.39.6 - resolution: "@0xsequence/utils@npm:0.39.6" - dependencies: - "@ethersproject/abstract-signer": ^5.5.0 - "@ethersproject/properties": ^5.5.0 - ethers: ^5.5.2 - js-base64: ^3.7.2 - checksum: baa6e31329fbcf9c8a981a1a5618cae9eabc49cf0e5a5bdf45dba77c671623c1431fc377b181f0a38df9094cb8601e2c4e839c8daffa07232c641338a8566f8d - languageName: node - linkType: hard - -"@aashutoshrathi/word-wrap@npm:^1.2.3": - version: 1.2.6 - resolution: "@aashutoshrathi/word-wrap@npm:1.2.6" - checksum: ada901b9e7c680d190f1d012c84217ce0063d8f5c5a7725bb91ec3c5ed99bb7572680eb2d2938a531ccbaec39a95422fcd8a6b4a13110c7d98dd75402f66a0cd - languageName: node - linkType: hard - "@actions/core@npm:1.10.1": version: 1.10.1 resolution: "@actions/core@npm:1.10.1" @@ -87,48710 +25,6095 @@ __metadata: languageName: node linkType: hard -"@adobe/css-tools@npm:^4.0.1, @adobe/css-tools@npm:^4.4.0": - version: 4.4.1 - resolution: "@adobe/css-tools@npm:4.4.1" - checksum: bbded8a03c314afee0fb0b42922f664f437e0e2f0b86eeeb06dee9d02cd8fc958cf87aa3314952b00074e0b22fc5b8da23f45b61b6f8291c8aaa7cffc56a76e9 +"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.25.9, @babel/code-frame@npm:^7.26.2": + version: 7.26.2 + resolution: "@babel/code-frame@npm:7.26.2" + dependencies: + "@babel/helper-validator-identifier": ^7.25.9 + js-tokens: ^4.0.0 + picocolors: ^1.0.0 + checksum: db13f5c42d54b76c1480916485e6900748bbcb0014a8aca87f50a091f70ff4e0d0a6db63cade75eb41fcc3d2b6ba0a7f89e343def4f96f00269b41b8ab8dd7b8 languageName: node linkType: hard -"@adraffy/ens-normalize@npm:^1.10.1": - version: 1.11.0 - resolution: "@adraffy/ens-normalize@npm:1.11.0" - checksum: b2911269e3e0ec6396a2e5433a99e0e1f9726befc6c167994448cd0e53dbdd0be22b4835b4f619558b568ed9aa7312426b8fa6557a13999463489daa88169ee5 +"@babel/generator@npm:^7.26.5": + version: 7.26.5 + resolution: "@babel/generator@npm:7.26.5" + dependencies: + "@babel/parser": ^7.26.5 + "@babel/types": ^7.26.5 + "@jridgewell/gen-mapping": ^0.3.5 + "@jridgewell/trace-mapping": ^0.3.25 + jsesc: ^3.0.2 + checksum: baa42a98cd01efa3ae3634a6caa81d0738e5e0bdba4efbf1ac735216c8d7cf6bdffeab69c468e6ab2063b07db402346113def4962719746756518432f83c53ba languageName: node linkType: hard -"@alloc/quick-lru@npm:^5.2.0": - version: 5.2.0 - resolution: "@alloc/quick-lru@npm:5.2.0" - checksum: bdc35758b552bcf045733ac047fb7f9a07c4678b944c641adfbd41f798b4b91fffd0fdc0df2578d9b0afc7b4d636aa6e110ead5d6281a2adc1ab90efd7f057f8 +"@babel/helper-string-parser@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-string-parser@npm:7.25.9" + checksum: 6435ee0849e101681c1849868278b5aee82686ba2c1e27280e5e8aca6233af6810d39f8e4e693d2f2a44a3728a6ccfd66f72d71826a94105b86b731697cdfa99 languageName: node linkType: hard -"@amplitude/analytics-browser@npm:1.12.1, @amplitude/analytics-browser@npm:^1.5.8": - version: 1.12.1 - resolution: "@amplitude/analytics-browser@npm:1.12.1" - dependencies: - "@amplitude/analytics-client-common": ^1.1.1 - "@amplitude/analytics-core": ^1.2.1 - "@amplitude/analytics-types": ^1.3.1 - "@amplitude/plugin-page-view-tracking-browser": ^1.0.7 - "@amplitude/plugin-web-attribution-browser": ^1.0.7 - "@amplitude/ua-parser-js": ^0.7.31 - tslib: ^2.4.1 - checksum: 74bce3fc3d258162fce62b1e49e8f96e3e7fa598590e201a9c42683026fdf2d54497ed027b4af00e3eb749829f444103633a188100d19b12a7edfe9509826d74 +"@babel/helper-validator-identifier@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-validator-identifier@npm:7.25.9" + checksum: 5b85918cb1a92a7f3f508ea02699e8d2422fe17ea8e82acd445006c0ef7520fbf48e3dbcdaf7b0a1d571fc3a2715a29719e5226636cb6042e15fe6ed2a590944 languageName: node linkType: hard -"@amplitude/analytics-client-common@npm:^1.1.1, @amplitude/analytics-client-common@npm:^1.2.3": - version: 1.2.3 - resolution: "@amplitude/analytics-client-common@npm:1.2.3" +"@babel/parser@npm:^7.23.0, @babel/parser@npm:^7.23.5, @babel/parser@npm:^7.25.9, @babel/parser@npm:^7.26.5, @babel/parser@npm:^7.26.7": + version: 7.26.7 + resolution: "@babel/parser@npm:7.26.7" dependencies: - "@amplitude/analytics-connector": ^1.5.0 - "@amplitude/analytics-core": ^1.2.5 - "@amplitude/analytics-types": ^1.3.4 - tslib: ^2.4.1 - checksum: 440b1cb4959bd4977ce8d30137faafb9b69581939098a4d91ef5c60e7c9502a19cdf6ffc69f18d8a08b04173c8c82a45245a8450a898194cee9cf24138733c98 + "@babel/types": ^7.26.7 + bin: + parser: ./bin/babel-parser.js + checksum: 22aafd7a6fb9ae577cf192141e5b879477fc087872b8953df0eed60ab7e2397d01aa8d92690eb7ba406f408035dd27c86fbf9967c9a37abd9bf4b1d7cf46a823 languageName: node linkType: hard -"@amplitude/analytics-connector@npm:^1.5.0": - version: 1.6.2 - resolution: "@amplitude/analytics-connector@npm:1.6.2" +"@babel/runtime@npm:^7.20.6, @babel/runtime@npm:^7.23.2, @babel/runtime@npm:^7.5.5": + version: 7.26.7 + resolution: "@babel/runtime@npm:7.26.7" dependencies: - "@amplitude/experiment-core": ^0.10.1 - checksum: 31451926a4b5d6ae3779113d0bcfd72d2470b69d3a72e25111b4b844a8410abde2b5d819f02226375edcf0ba9ab98893b7d6cae9a8a223a3c8e03d7441a4b7ab + regenerator-runtime: ^0.14.0 + checksum: a1664a08f3f4854b895b540cca2f5f5c6c1993b5fb788c9615d70fc201e16bb254df8e0550c83eaf2749a14d87775e11a7c9ded6161203e9da7a4a323d546925 languageName: node linkType: hard -"@amplitude/analytics-core@npm:0.11.0": - version: 0.11.0 - resolution: "@amplitude/analytics-core@npm:0.11.0" +"@babel/template@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/template@npm:7.25.9" dependencies: - "@amplitude/analytics-types": ^0.14.0 - tslib: ^2.3.1 - checksum: be98d2614bbb22dfae03dfc4f79766ffb71c9f6b0b2fe88ea1b3ea4beae0f69f4d3add0a1dd6f0658300e14ca7d61d45d42f356653c19ba7cf87bcc9443cb7f1 + "@babel/code-frame": ^7.25.9 + "@babel/parser": ^7.25.9 + "@babel/types": ^7.25.9 + checksum: 103641fea19c7f4e82dc913aa6b6ac157112a96d7c724d513288f538b84bae04fb87b1f1e495ac1736367b1bc30e10f058b30208fb25f66038e1f1eb4e426472 languageName: node linkType: hard -"@amplitude/analytics-core@npm:^1.2.1, @amplitude/analytics-core@npm:^1.2.5": - version: 1.2.5 - resolution: "@amplitude/analytics-core@npm:1.2.5" +"@babel/traverse@npm:^7.23.2": + version: 7.26.7 + resolution: "@babel/traverse@npm:7.26.7" dependencies: - "@amplitude/analytics-types": ^1.3.4 - tslib: ^2.4.1 - checksum: e0ad121360d21acb811aa7b8728479cbe177948dbfa875b6234b127d3a25fa67bdcc96c42ae20ce20adef34de49ea1db743e47ff1ecefe50273e6a3db8d12dbd + "@babel/code-frame": ^7.26.2 + "@babel/generator": ^7.26.5 + "@babel/parser": ^7.26.7 + "@babel/template": ^7.25.9 + "@babel/types": ^7.26.7 + debug: ^4.3.1 + globals: ^11.1.0 + checksum: 22ea8aed130e51db320ff7b3b1555f7dfb82fa860669e593e62990bff004cf09d3dca6fecb8afbac5e51973b703d0cdebf1dc0f6c0021901506f90443c40271b languageName: node linkType: hard -"@amplitude/analytics-react-native@npm:1.4.11": - version: 1.4.11 - resolution: "@amplitude/analytics-react-native@npm:1.4.11" +"@babel/types@npm:^7.25.9, @babel/types@npm:^7.26.5, @babel/types@npm:^7.26.7": + version: 7.26.7 + resolution: "@babel/types@npm:7.26.7" dependencies: - "@amplitude/analytics-client-common": ^1.2.3 - "@amplitude/analytics-core": ^1.2.5 - "@amplitude/analytics-types": ^1.3.4 - "@amplitude/ua-parser-js": ^0.7.31 - "@react-native-async-storage/async-storage": ^1.17.11 - tslib: ^2.4.1 - peerDependencies: - react: "*" - react-native: "*" - checksum: 23b10c5c1b522b64ef7845030b4ebb71d783a67a3e0387f0f46443b4138613d80e16c0443f7433c95116935d090f403f4812df0189467b8d35b39b4f6954704b - languageName: node - linkType: hard - -"@amplitude/analytics-types@npm:0.13.0": - version: 0.13.0 - resolution: "@amplitude/analytics-types@npm:0.13.0" - checksum: 1815648fb637af8e47585befe61b0f1d1fe8320744760aacf972c79360aa67bb5db5707dbf71266063a22d0615fd3fe84dde36f956678e872ce8c55d70ccf6e7 + "@babel/helper-string-parser": ^7.25.9 + "@babel/helper-validator-identifier": ^7.25.9 + checksum: cfb12e8794ebda6c95c92f3b90f14a9ec87ab532a247d887233068f72f8c287c0fa2e8d3d6ed5a4e512729844f7f73a613cb87d86077ae60a63a2e870e697307 languageName: node linkType: hard -"@amplitude/analytics-types@npm:^0.14.0": - version: 0.14.0 - resolution: "@amplitude/analytics-types@npm:0.14.0" - checksum: 23972f7869b1020d86a6b1d427b003e6bfed6ffae37dd755a86b7d78310568b381b0b7d8970ba468894efb6d775e3b885ed8ac4548d6c15413ed02548dfa9d00 +"@changesets/types@npm:^4.0.1": + version: 4.1.0 + resolution: "@changesets/types@npm:4.1.0" + checksum: 72c1f58044178ca867dd9349ecc4b7c233ce3781bb03b5b72a70c3166fbbab54a2f2cb19a81f96b4649ba004442c8734569fba238be4dd737fb4624a135c6098 languageName: node linkType: hard -"@amplitude/analytics-types@npm:^1.3.1, @amplitude/analytics-types@npm:^1.3.4": - version: 1.3.4 - resolution: "@amplitude/analytics-types@npm:1.3.4" - checksum: 664ea9ab68f834680d9b91d7b867798e5823ee8977ee9d4d351977c023d9e3507d73bcdc601d1aa332b62052c97fe45cef06a4d225753dd215eab6e6b8776eb2 +"@commitlint/cli@npm:17.5.0": + version: 17.5.0 + resolution: "@commitlint/cli@npm:17.5.0" + dependencies: + "@commitlint/format": ^17.4.4 + "@commitlint/lint": ^17.4.4 + "@commitlint/load": ^17.5.0 + "@commitlint/read": ^17.4.4 + "@commitlint/types": ^17.4.4 + execa: ^5.0.0 + lodash.isfunction: ^3.0.9 + resolve-from: 5.0.0 + resolve-global: 1.0.0 + yargs: ^17.0.0 + bin: + commitlint: cli.js + checksum: d7d7a016a64d323ecbd3f9cc652039323d6ba735d13f0820dcbf78d3f270a63b4e609ef0fdd3ee2cfa749ad74bf59f9d4a7d74c3458ea1e849916078f9303bad languageName: node linkType: hard -"@amplitude/experiment-core@npm:^0.10.1": - version: 0.10.1 - resolution: "@amplitude/experiment-core@npm:0.10.1" +"@commitlint/config-conventional@npm:17.4.4": + version: 17.4.4 + resolution: "@commitlint/config-conventional@npm:17.4.4" dependencies: - js-base64: ^3.7.5 - checksum: 156bc59f7fdd8baf4f496629be02a34d00d3dd1f8f989b613dfab8a325cc6eb5c0c4ae58d45c8615cdf94dacf16fe58151a28566d79f5adf944188c770fe2c12 + conventional-changelog-conventionalcommits: ^5.0.0 + checksum: 679d92509fe6e53ee0cc4202f8069d88360c4f9dbd7ab74114bb28278a196da517ef711dfe69893033a66e54ffc29e8df2ccf63cfd746a89c82a053949473c4b languageName: node linkType: hard -"@amplitude/plugin-page-view-tracking-browser@npm:^1.0.7": - version: 1.0.7 - resolution: "@amplitude/plugin-page-view-tracking-browser@npm:1.0.7" +"@commitlint/config-validator@npm:^17.4.4": + version: 17.4.4 + resolution: "@commitlint/config-validator@npm:17.4.4" dependencies: - "@amplitude/analytics-client-common": ^1.1.1 - "@amplitude/analytics-types": ^1.3.1 - tslib: ^2.4.1 - checksum: d07663bfd0c304c5175e83c9e4ca28910333268dc5818797a91f976538ba3297a4dda70d0583e1b4f20480ae0dbc0f4f07cdec2f5afb3e093d452baefd8033df + "@commitlint/types": ^17.4.4 + ajv: ^8.11.0 + checksum: 71ee818608ed5c74832cdd63531c0f61b21758fba9f8b876205485ece4f047c9582bc3f323a20a5de700e3451296614d15448437270a82194eff7d71317b47ff languageName: node linkType: hard -"@amplitude/plugin-web-attribution-browser@npm:^1.0.7": - version: 1.0.7 - resolution: "@amplitude/plugin-web-attribution-browser@npm:1.0.7" +"@commitlint/ensure@npm:^17.4.4": + version: 17.4.4 + resolution: "@commitlint/ensure@npm:17.4.4" dependencies: - "@amplitude/analytics-client-common": ^1.1.1 - "@amplitude/analytics-core": ^1.2.1 - "@amplitude/analytics-types": ^1.3.1 - tslib: ^2.4.1 - checksum: 04ce646ec6ad7d7710aa89c20d3829ad3207db07ed82c11407f6f20e38dc551c0280e2b71573a34beefd559742d6b8974a4806d7a45d88dfbf4879b709909ede + "@commitlint/types": ^17.4.4 + lodash.camelcase: ^4.3.0 + lodash.kebabcase: ^4.1.1 + lodash.snakecase: ^4.1.1 + lodash.startcase: ^4.4.0 + lodash.upperfirst: ^4.3.1 + checksum: c21c189f22d8d3265e93256d101b72ef7cbdf8660438081799b9a4a8bd47d33133f250bbed858ab9bcc0d249d1c95ac58eddd9e5b46314d64ff049d0479d0d71 languageName: node linkType: hard -"@amplitude/ua-parser-js@npm:^0.7.31": - version: 0.7.31 - resolution: "@amplitude/ua-parser-js@npm:0.7.31" - checksum: c72e7c8656dd77a6c2ece9e3817929022aeadf731470e53fecddce03232d87977fd5b09d76c570a2a5bed97f5dd463fe6379aac7a6c4b2d2393f14486d385eec +"@commitlint/execute-rule@npm:^17.4.0": + version: 17.4.0 + resolution: "@commitlint/execute-rule@npm:17.4.0" + checksum: 17d8e56ab00bd45fdecb0ed33186d2020ce261250d6a516204b6509610b75af8c930e7226b1111af3de298db32a7e4d0ba2c9cc7ed67db5ba5159eeed634f067 languageName: node linkType: hard -"@ampproject/remapping@npm:^2.2.0": - version: 2.2.1 - resolution: "@ampproject/remapping@npm:2.2.1" +"@commitlint/format@npm:^17.4.4": + version: 17.4.4 + resolution: "@commitlint/format@npm:17.4.4" dependencies: - "@jridgewell/gen-mapping": ^0.3.0 - "@jridgewell/trace-mapping": ^0.3.9 - checksum: 03c04fd526acc64a1f4df22651186f3e5ef0a9d6d6530ce4482ec9841269cf7a11dbb8af79237c282d721c5312024ff17529cd72cc4768c11e999b58e2302079 + "@commitlint/types": ^17.4.4 + chalk: ^4.1.0 + checksum: 832d9641129f2da8d32389b4a47db59d41eb1adfab742723972cad64b833c4af9e253f96757b27664fedae61644dd4c01d21f775773b45b604bd7f93b23a27d2 languageName: node linkType: hard -"@apideck/better-ajv-errors@npm:^0.3.1": - version: 0.3.6 - resolution: "@apideck/better-ajv-errors@npm:0.3.6" +"@commitlint/is-ignored@npm:^17.4.4": + version: 17.4.4 + resolution: "@commitlint/is-ignored@npm:17.4.4" dependencies: - json-schema: ^0.4.0 - jsonpointer: ^5.0.0 - leven: ^3.1.0 - peerDependencies: - ajv: ">=8" - checksum: b70ec9aae3b30ba1ac06948e585cd96aabbfe7ef6a1c27dc51e56c425f01290a58e9beb19ed95ee64da9f32df3e9276cd1ea58e78792741d74a519cb56955491 + "@commitlint/types": ^17.4.4 + semver: 7.3.8 + checksum: 716631ecd6aece8642d76c1a99e1cdc24bad79f22199d1d4bad73d9b12edb3578ed7d6f23947ca28d4bb637e08a1738e55dd693c165a2d395c10560a988ffc05 languageName: node linkType: hard -"@apidevtools/json-schema-ref-parser@npm:^10.1.0": - version: 10.1.0 - resolution: "@apidevtools/json-schema-ref-parser@npm:10.1.0" +"@commitlint/lint@npm:^17.4.4": + version: 17.4.4 + resolution: "@commitlint/lint@npm:17.4.4" dependencies: - "@jsdevtools/ono": ^7.1.3 - "@types/json-schema": ^7.0.11 - "@types/lodash.clonedeep": ^4.5.7 - js-yaml: ^4.1.0 - lodash.clonedeep: ^4.5.0 - checksum: 6220dea1ffa2f1b34da54583cf447cc97c51e25b96c10705e858f42c8290bc775b5821182282493a8f99ec6e0dae8f01ccd865d547aa29c1a6be6a38713c4571 - languageName: node - linkType: hard - -"@apollo/client@npm:3.10.4": - version: 3.10.4 - resolution: "@apollo/client@npm:3.10.4" - dependencies: - "@graphql-typed-document-node/core": ^3.1.1 - "@wry/caches": ^1.0.0 - "@wry/equality": ^0.5.6 - "@wry/trie": ^0.5.0 - graphql-tag: ^2.12.6 - hoist-non-react-statics: ^3.3.2 - optimism: ^0.18.0 - prop-types: ^15.7.2 - rehackt: ^0.1.0 - response-iterator: ^0.2.6 - symbol-observable: ^4.0.0 - ts-invariant: ^0.10.3 - tslib: ^2.3.0 - zen-observable-ts: ^1.2.5 - peerDependencies: - graphql: ^15.0.0 || ^16.0.0 - graphql-ws: ^5.5.5 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - subscriptions-transport-ws: ^0.9.0 || ^0.11.0 - peerDependenciesMeta: - graphql-ws: - optional: true - react: - optional: true - react-dom: - optional: true - subscriptions-transport-ws: - optional: true - checksum: 577cb5a075fb9616b6b41bf7b34ce7ee393e7dfc3ca829db284a5bf70e35f658e4b218ba6f6d03e2604da814c6069e438584c9c609fe505dcbe6c4610f4cc638 + "@commitlint/is-ignored": ^17.4.4 + "@commitlint/parse": ^17.4.4 + "@commitlint/rules": ^17.4.4 + "@commitlint/types": ^17.4.4 + checksum: bf04a9f9a1435e0d3cd03c58b6bf924613d0278b66b0a5d0e18eb96c7af9eeb02871e739a4d7d9312b2b4178f6f8ae9a49ba74382b4e28f623e1bf0af7067946 languageName: node linkType: hard -"@ardatan/relay-compiler@npm:12.0.0": - version: 12.0.0 - resolution: "@ardatan/relay-compiler@npm:12.0.0" +"@commitlint/load@npm:^17.5.0": + version: 17.5.0 + resolution: "@commitlint/load@npm:17.5.0" dependencies: - "@babel/core": ^7.14.0 - "@babel/generator": ^7.14.0 - "@babel/parser": ^7.14.0 - "@babel/runtime": ^7.0.0 - "@babel/traverse": ^7.14.0 - "@babel/types": ^7.0.0 - babel-preset-fbjs: ^3.4.0 - chalk: ^4.0.0 - fb-watchman: ^2.0.0 - fbjs: ^3.0.0 - glob: ^7.1.1 - immutable: ~3.7.6 - invariant: ^2.2.4 - nullthrows: ^1.1.1 - relay-runtime: 12.0.0 - signedsource: ^1.0.0 - yargs: ^15.3.1 - peerDependencies: - graphql: "*" - bin: - relay-compiler: bin/relay-compiler - checksum: f0cec120d02961ee8652e0dde72d9e425bc97cad5d0f767d8764cfd30952294eb2838432f33e4da8bb6999d0c13dcd1df128280666bfea373294d98aa8033ae7 + "@commitlint/config-validator": ^17.4.4 + "@commitlint/execute-rule": ^17.4.0 + "@commitlint/resolve-extends": ^17.4.4 + "@commitlint/types": ^17.4.4 + "@types/node": "*" + chalk: ^4.1.0 + cosmiconfig: ^8.0.0 + cosmiconfig-typescript-loader: ^4.0.0 + lodash.isplainobject: ^4.0.6 + lodash.merge: ^4.6.2 + lodash.uniq: ^4.5.0 + resolve-from: ^5.0.0 + ts-node: ^10.8.1 + typescript: ^4.6.4 || ^5.0.0 + checksum: c039114b0ad67bb9d8b05ec635d847bd5ab760528f0fb203411f433585bdab5472f4f5c7856dfc417cf64c05576f54c1afc4997a813f529304e0156bfc1d6cc8 languageName: node linkType: hard -"@ardatan/sync-fetch@npm:0.0.1, @ardatan/sync-fetch@npm:^0.0.1": - version: 0.0.1 - resolution: "@ardatan/sync-fetch@npm:0.0.1" - dependencies: - node-fetch: ^2.6.1 - checksum: af39bdfb4c2b35bd2c6acc540a5e302730dae17e73d3a18cd1a4aa50c1c741cb1869dffdef1379c491da5ad2e3cfa2bf3a8064e6046c12b46c6a97f54f100a8d +"@commitlint/message@npm:^17.4.2": + version: 17.4.2 + resolution: "@commitlint/message@npm:17.4.2" + checksum: 55b6cfeb57f7c9f913e18821aa4d972a6b6faa78c62741390996151f99554396f6df68ccfee86c163d24d8c27a4dbbcb50ef03c2972ab0a7a21d89daa2f9a519 languageName: node linkType: hard -"@aws-crypto/crc32@npm:5.2.0": - version: 5.2.0 - resolution: "@aws-crypto/crc32@npm:5.2.0" +"@commitlint/parse@npm:^17.4.4": + version: 17.4.4 + resolution: "@commitlint/parse@npm:17.4.4" dependencies: - "@aws-crypto/util": ^5.2.0 - "@aws-sdk/types": ^3.222.0 - tslib: ^2.6.2 - checksum: 1ddf7ec3fccf106205ff2476d90ae1d6625eabd47752f689c761b71e41fe451962b7a1c9ed25fe54e17dd747a62fbf4de06030fe56fe625f95285f6f70b96c57 + "@commitlint/types": ^17.4.4 + conventional-changelog-angular: ^5.0.11 + conventional-commits-parser: ^3.2.2 + checksum: 2a6e5b0a5cdea21c879a3919a0227c0d7f3fa1f343808bcb09e3e7f25b0dc494dcca8af32982e7a65640b53c3e6cf138ebf685b657dd55173160bc0fa4e58916 languageName: node linkType: hard -"@aws-crypto/sha256-browser@npm:5.2.0": - version: 5.2.0 - resolution: "@aws-crypto/sha256-browser@npm:5.2.0" +"@commitlint/read@npm:^17.4.4": + version: 17.4.4 + resolution: "@commitlint/read@npm:17.4.4" dependencies: - "@aws-crypto/sha256-js": ^5.2.0 - "@aws-crypto/supports-web-crypto": ^5.2.0 - "@aws-crypto/util": ^5.2.0 - "@aws-sdk/types": ^3.222.0 - "@aws-sdk/util-locate-window": ^3.0.0 - "@smithy/util-utf8": ^2.0.0 - tslib: ^2.6.2 - checksum: 773f12f2026d82a6bb4a23a8f491894a6d32525bd9b8bfbc12896526cf11882a7607a671c478c45f9cd7d6ba1caaed48a62b67c6f725244bd83a1275108f46c7 + "@commitlint/top-level": ^17.4.0 + "@commitlint/types": ^17.4.4 + fs-extra: ^11.0.0 + git-raw-commits: ^2.0.0 + minimist: ^1.2.6 + checksum: 29c828ba0a756196cff6b6fb480971cc779519823c3d061c6b2debee1dfc6c17453ef8aefe6d72a2f21e7be866f501e478b77dddd77f7cd75dfdae7f4a153268 languageName: node linkType: hard -"@aws-crypto/sha256-js@npm:5.2.0, @aws-crypto/sha256-js@npm:^5.2.0": - version: 5.2.0 - resolution: "@aws-crypto/sha256-js@npm:5.2.0" +"@commitlint/resolve-extends@npm:^17.4.4": + version: 17.4.4 + resolution: "@commitlint/resolve-extends@npm:17.4.4" dependencies: - "@aws-crypto/util": ^5.2.0 - "@aws-sdk/types": ^3.222.0 - tslib: ^2.6.2 - checksum: 007fbe0436d714d0d0d282e2b61c90e45adcb9ad75eac9ac7ba03d32b56624afd09b2a9ceb4d659661cf17c51d74d1900ab6b00eacafc002da1101664955ca53 + "@commitlint/config-validator": ^17.4.4 + "@commitlint/types": ^17.4.4 + import-fresh: ^3.0.0 + lodash.mergewith: ^4.6.2 + resolve-from: ^5.0.0 + resolve-global: ^1.0.0 + checksum: d7bf1ff1ad3db8750421b252d79cf7b96cf07d72cad8cc3f73c1363a8e68c0afde611d38ae6f213bbb54e3248160c6b9425578f3d0f8f790e84aea811d748b3e languageName: node linkType: hard -"@aws-crypto/sha256-js@npm:^1.2.0": - version: 1.2.2 - resolution: "@aws-crypto/sha256-js@npm:1.2.2" +"@commitlint/rules@npm:^17.4.4": + version: 17.4.4 + resolution: "@commitlint/rules@npm:17.4.4" dependencies: - "@aws-crypto/util": ^1.2.2 - "@aws-sdk/types": ^3.1.0 - tslib: ^1.11.1 - checksum: b6aeb71f88ecc219c5473803345bb15150ecd056a337582638dd60fb2344e0ff63908c684ef55268b249290fe0776e8e6fc830605f0aad850ff325b9cfe0dc6a + "@commitlint/ensure": ^17.4.4 + "@commitlint/message": ^17.4.2 + "@commitlint/to-lines": ^17.4.0 + "@commitlint/types": ^17.4.4 + execa: ^5.0.0 + checksum: f36525f6e234df6a17d47457b733a1fc10e3e01db1aa6fb45b18cbaf74b7915f634ab65f73d2412787137c366046f8264126c2f21ad9023ac6b68ec8b1cee8f4 languageName: node linkType: hard -"@aws-crypto/supports-web-crypto@npm:^5.2.0": - version: 5.2.0 - resolution: "@aws-crypto/supports-web-crypto@npm:5.2.0" - dependencies: - tslib: ^2.6.2 - checksum: 6ffc21de48b2b2c3e918193101d7e8fe949d47b37688892e1c39eaedaa938be80c0f404fe1c874c30cce16781026777a53bf47d5d90143ca91d0feb7c4a6f830 +"@commitlint/to-lines@npm:^17.4.0": + version: 17.4.0 + resolution: "@commitlint/to-lines@npm:17.4.0" + checksum: 841f90f606238e145ab4ba02940662d511fc04fe553619900152a8542170fe664031b95d820ffaeb8864d4851344278e662ef29637d763fc19fd828e0f8d139b languageName: node linkType: hard -"@aws-crypto/util@npm:^1.2.2": - version: 1.2.2 - resolution: "@aws-crypto/util@npm:1.2.2" +"@commitlint/top-level@npm:^17.4.0": + version: 17.4.0 + resolution: "@commitlint/top-level@npm:17.4.0" dependencies: - "@aws-sdk/types": ^3.1.0 - "@aws-sdk/util-utf8-browser": ^3.0.0 - tslib: ^1.11.1 - checksum: 54d72ce4945b52f3fcbcb62574a55bc038cc3ff165742f340cabca1bdc979faf69c97709cf56daf434e4ad69e33582a04a64da33b4e4e13b25c6ff67f8abe5ae - languageName: node - linkType: hard - -"@aws-crypto/util@npm:^5.2.0": - version: 5.2.0 - resolution: "@aws-crypto/util@npm:5.2.0" - dependencies: - "@aws-sdk/types": ^3.222.0 - "@smithy/util-utf8": ^2.0.0 - tslib: ^2.6.2 - checksum: f0f81d9d2771c59946cfec48b86cb23d39f78a966c4a1f89d4753abdc3cb38de06f907d1e6450059b121d48ac65d612ab88bdb70014553a077fc3dabddfbf8d6 - languageName: node - linkType: hard - -"@aws-sdk/client-cloudwatch-logs@npm:^3.537.0": - version: 3.616.0 - resolution: "@aws-sdk/client-cloudwatch-logs@npm:3.616.0" - dependencies: - "@aws-crypto/sha256-browser": 5.2.0 - "@aws-crypto/sha256-js": 5.2.0 - "@aws-sdk/client-sso-oidc": 3.616.0 - "@aws-sdk/client-sts": 3.616.0 - "@aws-sdk/core": 3.616.0 - "@aws-sdk/credential-provider-node": 3.616.0 - "@aws-sdk/middleware-host-header": 3.616.0 - "@aws-sdk/middleware-logger": 3.609.0 - "@aws-sdk/middleware-recursion-detection": 3.616.0 - "@aws-sdk/middleware-user-agent": 3.616.0 - "@aws-sdk/region-config-resolver": 3.614.0 - "@aws-sdk/types": 3.609.0 - "@aws-sdk/util-endpoints": 3.614.0 - "@aws-sdk/util-user-agent-browser": 3.609.0 - "@aws-sdk/util-user-agent-node": 3.614.0 - "@smithy/config-resolver": ^3.0.5 - "@smithy/core": ^2.2.7 - "@smithy/eventstream-serde-browser": ^3.0.4 - "@smithy/eventstream-serde-config-resolver": ^3.0.3 - "@smithy/eventstream-serde-node": ^3.0.4 - "@smithy/fetch-http-handler": ^3.2.2 - "@smithy/hash-node": ^3.0.3 - "@smithy/invalid-dependency": ^3.0.3 - "@smithy/middleware-content-length": ^3.0.4 - "@smithy/middleware-endpoint": ^3.0.5 - "@smithy/middleware-retry": ^3.0.10 - "@smithy/middleware-serde": ^3.0.3 - "@smithy/middleware-stack": ^3.0.3 - "@smithy/node-config-provider": ^3.1.4 - "@smithy/node-http-handler": ^3.1.3 - "@smithy/protocol-http": ^4.0.4 - "@smithy/smithy-client": ^3.1.8 - "@smithy/types": ^3.3.0 - "@smithy/url-parser": ^3.0.3 - "@smithy/util-base64": ^3.0.0 - "@smithy/util-body-length-browser": ^3.0.0 - "@smithy/util-body-length-node": ^3.0.0 - "@smithy/util-defaults-mode-browser": ^3.0.10 - "@smithy/util-defaults-mode-node": ^3.0.10 - "@smithy/util-endpoints": ^2.0.5 - "@smithy/util-middleware": ^3.0.3 - "@smithy/util-retry": ^3.0.3 - "@smithy/util-utf8": ^3.0.0 - tslib: ^2.6.2 - uuid: ^9.0.1 - checksum: 6aa13c23e747f40be0a80ec6e7bede214c8a2c67b326b16fc4b105519135026dd381dfc7cf3cb875940961454d57d82131f879f074c5f649e70a0dbe567b6b68 - languageName: node - linkType: hard - -"@aws-sdk/client-cognito-identity@npm:3.616.0": - version: 3.616.0 - resolution: "@aws-sdk/client-cognito-identity@npm:3.616.0" - dependencies: - "@aws-crypto/sha256-browser": 5.2.0 - "@aws-crypto/sha256-js": 5.2.0 - "@aws-sdk/client-sso-oidc": 3.616.0 - "@aws-sdk/client-sts": 3.616.0 - "@aws-sdk/core": 3.616.0 - "@aws-sdk/credential-provider-node": 3.616.0 - "@aws-sdk/middleware-host-header": 3.616.0 - "@aws-sdk/middleware-logger": 3.609.0 - "@aws-sdk/middleware-recursion-detection": 3.616.0 - "@aws-sdk/middleware-user-agent": 3.616.0 - "@aws-sdk/region-config-resolver": 3.614.0 - "@aws-sdk/types": 3.609.0 - "@aws-sdk/util-endpoints": 3.614.0 - "@aws-sdk/util-user-agent-browser": 3.609.0 - "@aws-sdk/util-user-agent-node": 3.614.0 - "@smithy/config-resolver": ^3.0.5 - "@smithy/core": ^2.2.7 - "@smithy/fetch-http-handler": ^3.2.2 - "@smithy/hash-node": ^3.0.3 - "@smithy/invalid-dependency": ^3.0.3 - "@smithy/middleware-content-length": ^3.0.4 - "@smithy/middleware-endpoint": ^3.0.5 - "@smithy/middleware-retry": ^3.0.10 - "@smithy/middleware-serde": ^3.0.3 - "@smithy/middleware-stack": ^3.0.3 - "@smithy/node-config-provider": ^3.1.4 - "@smithy/node-http-handler": ^3.1.3 - "@smithy/protocol-http": ^4.0.4 - "@smithy/smithy-client": ^3.1.8 - "@smithy/types": ^3.3.0 - "@smithy/url-parser": ^3.0.3 - "@smithy/util-base64": ^3.0.0 - "@smithy/util-body-length-browser": ^3.0.0 - "@smithy/util-body-length-node": ^3.0.0 - "@smithy/util-defaults-mode-browser": ^3.0.10 - "@smithy/util-defaults-mode-node": ^3.0.10 - "@smithy/util-endpoints": ^2.0.5 - "@smithy/util-middleware": ^3.0.3 - "@smithy/util-retry": ^3.0.3 - "@smithy/util-utf8": ^3.0.0 - tslib: ^2.6.2 - checksum: 8ff406d4ac7a47315e3261e90358fb9ebaacc9f3f327c81e984c11a09f77f83a089f0df5534fd6721c8df587f9af1a71baf96640407665571738a0b149d20d23 - languageName: node - linkType: hard - -"@aws-sdk/client-iam@npm:^3.535.0": - version: 3.616.0 - resolution: "@aws-sdk/client-iam@npm:3.616.0" - dependencies: - "@aws-crypto/sha256-browser": 5.2.0 - "@aws-crypto/sha256-js": 5.2.0 - "@aws-sdk/client-sso-oidc": 3.616.0 - "@aws-sdk/client-sts": 3.616.0 - "@aws-sdk/core": 3.616.0 - "@aws-sdk/credential-provider-node": 3.616.0 - "@aws-sdk/middleware-host-header": 3.616.0 - "@aws-sdk/middleware-logger": 3.609.0 - "@aws-sdk/middleware-recursion-detection": 3.616.0 - "@aws-sdk/middleware-user-agent": 3.616.0 - "@aws-sdk/region-config-resolver": 3.614.0 - "@aws-sdk/types": 3.609.0 - "@aws-sdk/util-endpoints": 3.614.0 - "@aws-sdk/util-user-agent-browser": 3.609.0 - "@aws-sdk/util-user-agent-node": 3.614.0 - "@smithy/config-resolver": ^3.0.5 - "@smithy/core": ^2.2.7 - "@smithy/fetch-http-handler": ^3.2.2 - "@smithy/hash-node": ^3.0.3 - "@smithy/invalid-dependency": ^3.0.3 - "@smithy/middleware-content-length": ^3.0.4 - "@smithy/middleware-endpoint": ^3.0.5 - "@smithy/middleware-retry": ^3.0.10 - "@smithy/middleware-serde": ^3.0.3 - "@smithy/middleware-stack": ^3.0.3 - "@smithy/node-config-provider": ^3.1.4 - "@smithy/node-http-handler": ^3.1.3 - "@smithy/protocol-http": ^4.0.4 - "@smithy/smithy-client": ^3.1.8 - "@smithy/types": ^3.3.0 - "@smithy/url-parser": ^3.0.3 - "@smithy/util-base64": ^3.0.0 - "@smithy/util-body-length-browser": ^3.0.0 - "@smithy/util-body-length-node": ^3.0.0 - "@smithy/util-defaults-mode-browser": ^3.0.10 - "@smithy/util-defaults-mode-node": ^3.0.10 - "@smithy/util-endpoints": ^2.0.5 - "@smithy/util-middleware": ^3.0.3 - "@smithy/util-retry": ^3.0.3 - "@smithy/util-utf8": ^3.0.0 - "@smithy/util-waiter": ^3.1.2 - tslib: ^2.6.2 - checksum: def0ab7a921b8423bb935629bf53ed9f77791c36964c4d955056bfd6b005f12c96a40aee30a693602fbc2cb97945f61131af712e6de4acea0245aebf7cdeb300 - languageName: node - linkType: hard - -"@aws-sdk/client-lambda@npm:^3.536.0": - version: 3.616.0 - resolution: "@aws-sdk/client-lambda@npm:3.616.0" - dependencies: - "@aws-crypto/sha256-browser": 5.2.0 - "@aws-crypto/sha256-js": 5.2.0 - "@aws-sdk/client-sso-oidc": 3.616.0 - "@aws-sdk/client-sts": 3.616.0 - "@aws-sdk/core": 3.616.0 - "@aws-sdk/credential-provider-node": 3.616.0 - "@aws-sdk/middleware-host-header": 3.616.0 - "@aws-sdk/middleware-logger": 3.609.0 - "@aws-sdk/middleware-recursion-detection": 3.616.0 - "@aws-sdk/middleware-user-agent": 3.616.0 - "@aws-sdk/region-config-resolver": 3.614.0 - "@aws-sdk/types": 3.609.0 - "@aws-sdk/util-endpoints": 3.614.0 - "@aws-sdk/util-user-agent-browser": 3.609.0 - "@aws-sdk/util-user-agent-node": 3.614.0 - "@smithy/config-resolver": ^3.0.5 - "@smithy/core": ^2.2.7 - "@smithy/eventstream-serde-browser": ^3.0.4 - "@smithy/eventstream-serde-config-resolver": ^3.0.3 - "@smithy/eventstream-serde-node": ^3.0.4 - "@smithy/fetch-http-handler": ^3.2.2 - "@smithy/hash-node": ^3.0.3 - "@smithy/invalid-dependency": ^3.0.3 - "@smithy/middleware-content-length": ^3.0.4 - "@smithy/middleware-endpoint": ^3.0.5 - "@smithy/middleware-retry": ^3.0.10 - "@smithy/middleware-serde": ^3.0.3 - "@smithy/middleware-stack": ^3.0.3 - "@smithy/node-config-provider": ^3.1.4 - "@smithy/node-http-handler": ^3.1.3 - "@smithy/protocol-http": ^4.0.4 - "@smithy/smithy-client": ^3.1.8 - "@smithy/types": ^3.3.0 - "@smithy/url-parser": ^3.0.3 - "@smithy/util-base64": ^3.0.0 - "@smithy/util-body-length-browser": ^3.0.0 - "@smithy/util-body-length-node": ^3.0.0 - "@smithy/util-defaults-mode-browser": ^3.0.10 - "@smithy/util-defaults-mode-node": ^3.0.10 - "@smithy/util-endpoints": ^2.0.5 - "@smithy/util-middleware": ^3.0.3 - "@smithy/util-retry": ^3.0.3 - "@smithy/util-stream": ^3.1.0 - "@smithy/util-utf8": ^3.0.0 - "@smithy/util-waiter": ^3.1.2 - tslib: ^2.6.2 - checksum: 5e8678565008b571ee7531c4ae2e7f40e712aea1e14670b4e581b72dfd52a2bbfd9be9479bd37afda60feb9ac5dd9d19d2c8cffb2daed90fe83d0616ec9eddb0 - languageName: node - linkType: hard - -"@aws-sdk/client-sfn@npm:^3.535.0": - version: 3.616.0 - resolution: "@aws-sdk/client-sfn@npm:3.616.0" - dependencies: - "@aws-crypto/sha256-browser": 5.2.0 - "@aws-crypto/sha256-js": 5.2.0 - "@aws-sdk/client-sso-oidc": 3.616.0 - "@aws-sdk/client-sts": 3.616.0 - "@aws-sdk/core": 3.616.0 - "@aws-sdk/credential-provider-node": 3.616.0 - "@aws-sdk/middleware-host-header": 3.616.0 - "@aws-sdk/middleware-logger": 3.609.0 - "@aws-sdk/middleware-recursion-detection": 3.616.0 - "@aws-sdk/middleware-user-agent": 3.616.0 - "@aws-sdk/region-config-resolver": 3.614.0 - "@aws-sdk/types": 3.609.0 - "@aws-sdk/util-endpoints": 3.614.0 - "@aws-sdk/util-user-agent-browser": 3.609.0 - "@aws-sdk/util-user-agent-node": 3.614.0 - "@smithy/config-resolver": ^3.0.5 - "@smithy/core": ^2.2.7 - "@smithy/fetch-http-handler": ^3.2.2 - "@smithy/hash-node": ^3.0.3 - "@smithy/invalid-dependency": ^3.0.3 - "@smithy/middleware-content-length": ^3.0.4 - "@smithy/middleware-endpoint": ^3.0.5 - "@smithy/middleware-retry": ^3.0.10 - "@smithy/middleware-serde": ^3.0.3 - "@smithy/middleware-stack": ^3.0.3 - "@smithy/node-config-provider": ^3.1.4 - "@smithy/node-http-handler": ^3.1.3 - "@smithy/protocol-http": ^4.0.4 - "@smithy/smithy-client": ^3.1.8 - "@smithy/types": ^3.3.0 - "@smithy/url-parser": ^3.0.3 - "@smithy/util-base64": ^3.0.0 - "@smithy/util-body-length-browser": ^3.0.0 - "@smithy/util-body-length-node": ^3.0.0 - "@smithy/util-defaults-mode-browser": ^3.0.10 - "@smithy/util-defaults-mode-node": ^3.0.10 - "@smithy/util-endpoints": ^2.0.5 - "@smithy/util-middleware": ^3.0.3 - "@smithy/util-retry": ^3.0.3 - "@smithy/util-utf8": ^3.0.0 - tslib: ^2.6.2 - uuid: ^9.0.1 - checksum: 37a9adb696bc22660ee75d62199ef512b0d4bc31bb877e98014c174bf2c79385636c71392e0e36d2b0325557a4fa48a30a844e37c4d87df932b7933cf0def470 - languageName: node - linkType: hard - -"@aws-sdk/client-sso-oidc@npm:3.616.0": - version: 3.616.0 - resolution: "@aws-sdk/client-sso-oidc@npm:3.616.0" - dependencies: - "@aws-crypto/sha256-browser": 5.2.0 - "@aws-crypto/sha256-js": 5.2.0 - "@aws-sdk/core": 3.616.0 - "@aws-sdk/credential-provider-node": 3.616.0 - "@aws-sdk/middleware-host-header": 3.616.0 - "@aws-sdk/middleware-logger": 3.609.0 - "@aws-sdk/middleware-recursion-detection": 3.616.0 - "@aws-sdk/middleware-user-agent": 3.616.0 - "@aws-sdk/region-config-resolver": 3.614.0 - "@aws-sdk/types": 3.609.0 - "@aws-sdk/util-endpoints": 3.614.0 - "@aws-sdk/util-user-agent-browser": 3.609.0 - "@aws-sdk/util-user-agent-node": 3.614.0 - "@smithy/config-resolver": ^3.0.5 - "@smithy/core": ^2.2.7 - "@smithy/fetch-http-handler": ^3.2.2 - "@smithy/hash-node": ^3.0.3 - "@smithy/invalid-dependency": ^3.0.3 - "@smithy/middleware-content-length": ^3.0.4 - "@smithy/middleware-endpoint": ^3.0.5 - "@smithy/middleware-retry": ^3.0.10 - "@smithy/middleware-serde": ^3.0.3 - "@smithy/middleware-stack": ^3.0.3 - "@smithy/node-config-provider": ^3.1.4 - "@smithy/node-http-handler": ^3.1.3 - "@smithy/protocol-http": ^4.0.4 - "@smithy/smithy-client": ^3.1.8 - "@smithy/types": ^3.3.0 - "@smithy/url-parser": ^3.0.3 - "@smithy/util-base64": ^3.0.0 - "@smithy/util-body-length-browser": ^3.0.0 - "@smithy/util-body-length-node": ^3.0.0 - "@smithy/util-defaults-mode-browser": ^3.0.10 - "@smithy/util-defaults-mode-node": ^3.0.10 - "@smithy/util-endpoints": ^2.0.5 - "@smithy/util-middleware": ^3.0.3 - "@smithy/util-retry": ^3.0.3 - "@smithy/util-utf8": ^3.0.0 - tslib: ^2.6.2 - peerDependencies: - "@aws-sdk/client-sts": ^3.616.0 - checksum: cc6fab0e7369b0dbb7d03dbfcdc4e1dedd9bf395ed468c0c22b0c141ab35fc286d27f54a075584395dd5ca8a134682e9aa119e95b52694fb061aa8c389d6fc42 - languageName: node - linkType: hard - -"@aws-sdk/client-sso@npm:3.616.0": - version: 3.616.0 - resolution: "@aws-sdk/client-sso@npm:3.616.0" - dependencies: - "@aws-crypto/sha256-browser": 5.2.0 - "@aws-crypto/sha256-js": 5.2.0 - "@aws-sdk/core": 3.616.0 - "@aws-sdk/middleware-host-header": 3.616.0 - "@aws-sdk/middleware-logger": 3.609.0 - "@aws-sdk/middleware-recursion-detection": 3.616.0 - "@aws-sdk/middleware-user-agent": 3.616.0 - "@aws-sdk/region-config-resolver": 3.614.0 - "@aws-sdk/types": 3.609.0 - "@aws-sdk/util-endpoints": 3.614.0 - "@aws-sdk/util-user-agent-browser": 3.609.0 - "@aws-sdk/util-user-agent-node": 3.614.0 - "@smithy/config-resolver": ^3.0.5 - "@smithy/core": ^2.2.7 - "@smithy/fetch-http-handler": ^3.2.2 - "@smithy/hash-node": ^3.0.3 - "@smithy/invalid-dependency": ^3.0.3 - "@smithy/middleware-content-length": ^3.0.4 - "@smithy/middleware-endpoint": ^3.0.5 - "@smithy/middleware-retry": ^3.0.10 - "@smithy/middleware-serde": ^3.0.3 - "@smithy/middleware-stack": ^3.0.3 - "@smithy/node-config-provider": ^3.1.4 - "@smithy/node-http-handler": ^3.1.3 - "@smithy/protocol-http": ^4.0.4 - "@smithy/smithy-client": ^3.1.8 - "@smithy/types": ^3.3.0 - "@smithy/url-parser": ^3.0.3 - "@smithy/util-base64": ^3.0.0 - "@smithy/util-body-length-browser": ^3.0.0 - "@smithy/util-body-length-node": ^3.0.0 - "@smithy/util-defaults-mode-browser": ^3.0.10 - "@smithy/util-defaults-mode-node": ^3.0.10 - "@smithy/util-endpoints": ^2.0.5 - "@smithy/util-middleware": ^3.0.3 - "@smithy/util-retry": ^3.0.3 - "@smithy/util-utf8": ^3.0.0 - tslib: ^2.6.2 - checksum: 0a0d5560a84b381caad36264cc3760a0aa2c1dfa980429dc55c582447e7e7242f0947963815f7b91c0b92fc4b3b95507fd37cf9eb155b5409a6f9303f6efaed7 - languageName: node - linkType: hard - -"@aws-sdk/client-sts@npm:3.616.0": - version: 3.616.0 - resolution: "@aws-sdk/client-sts@npm:3.616.0" - dependencies: - "@aws-crypto/sha256-browser": 5.2.0 - "@aws-crypto/sha256-js": 5.2.0 - "@aws-sdk/client-sso-oidc": 3.616.0 - "@aws-sdk/core": 3.616.0 - "@aws-sdk/credential-provider-node": 3.616.0 - "@aws-sdk/middleware-host-header": 3.616.0 - "@aws-sdk/middleware-logger": 3.609.0 - "@aws-sdk/middleware-recursion-detection": 3.616.0 - "@aws-sdk/middleware-user-agent": 3.616.0 - "@aws-sdk/region-config-resolver": 3.614.0 - "@aws-sdk/types": 3.609.0 - "@aws-sdk/util-endpoints": 3.614.0 - "@aws-sdk/util-user-agent-browser": 3.609.0 - "@aws-sdk/util-user-agent-node": 3.614.0 - "@smithy/config-resolver": ^3.0.5 - "@smithy/core": ^2.2.7 - "@smithy/fetch-http-handler": ^3.2.2 - "@smithy/hash-node": ^3.0.3 - "@smithy/invalid-dependency": ^3.0.3 - "@smithy/middleware-content-length": ^3.0.4 - "@smithy/middleware-endpoint": ^3.0.5 - "@smithy/middleware-retry": ^3.0.10 - "@smithy/middleware-serde": ^3.0.3 - "@smithy/middleware-stack": ^3.0.3 - "@smithy/node-config-provider": ^3.1.4 - "@smithy/node-http-handler": ^3.1.3 - "@smithy/protocol-http": ^4.0.4 - "@smithy/smithy-client": ^3.1.8 - "@smithy/types": ^3.3.0 - "@smithy/url-parser": ^3.0.3 - "@smithy/util-base64": ^3.0.0 - "@smithy/util-body-length-browser": ^3.0.0 - "@smithy/util-body-length-node": ^3.0.0 - "@smithy/util-defaults-mode-browser": ^3.0.10 - "@smithy/util-defaults-mode-node": ^3.0.10 - "@smithy/util-endpoints": ^2.0.5 - "@smithy/util-middleware": ^3.0.3 - "@smithy/util-retry": ^3.0.3 - "@smithy/util-utf8": ^3.0.0 - tslib: ^2.6.2 - checksum: bad2619661085259ccfa2cd95f721ed1dc479c6871a8927648d182c6fbe3d25989a904d6b9430eac762c1d2a25d370a89879b9d1f2375f2cbfa869949288643f - languageName: node - linkType: hard - -"@aws-sdk/core@npm:3.616.0, @aws-sdk/core@npm:^3.535.0": - version: 3.616.0 - resolution: "@aws-sdk/core@npm:3.616.0" - dependencies: - "@smithy/core": ^2.2.7 - "@smithy/protocol-http": ^4.0.4 - "@smithy/signature-v4": ^4.0.0 - "@smithy/smithy-client": ^3.1.8 - "@smithy/types": ^3.3.0 - fast-xml-parser: 4.2.5 - tslib: ^2.6.2 - checksum: b19c43578beba8e90c1dac2a4842012e0ac2469fb0a8a72801677268447f5de2ad92ebcadc83826a7bfc360ef345c1686f2f76a04fc77f478e1c7512759789a9 - languageName: node - linkType: hard - -"@aws-sdk/credential-provider-cognito-identity@npm:3.616.0": - version: 3.616.0 - resolution: "@aws-sdk/credential-provider-cognito-identity@npm:3.616.0" - dependencies: - "@aws-sdk/client-cognito-identity": 3.616.0 - "@aws-sdk/types": 3.609.0 - "@smithy/property-provider": ^3.1.3 - "@smithy/types": ^3.3.0 - tslib: ^2.6.2 - checksum: 3aada71f75b633badfaf84c7cb8f4e6899f19d49e99a18cd1d3e591acf3e5aa495293e25ead945e2833630bae07a7bceca885fbf122ce8a4e6b4778251c29c46 - languageName: node - linkType: hard - -"@aws-sdk/credential-provider-env@npm:3.609.0": - version: 3.609.0 - resolution: "@aws-sdk/credential-provider-env@npm:3.609.0" - dependencies: - "@aws-sdk/types": 3.609.0 - "@smithy/property-provider": ^3.1.3 - "@smithy/types": ^3.3.0 - tslib: ^2.6.2 - checksum: eda20122740481d04f5110fb9349df339562da1e1d5217e6c47e5f80ed0cce1b3bea01081272487bf04e402fcecc2734a352b0b57ae80b090dd8a0b3547ad185 - languageName: node - linkType: hard - -"@aws-sdk/credential-provider-http@npm:3.616.0": - version: 3.616.0 - resolution: "@aws-sdk/credential-provider-http@npm:3.616.0" - dependencies: - "@aws-sdk/types": 3.609.0 - "@smithy/fetch-http-handler": ^3.2.2 - "@smithy/node-http-handler": ^3.1.3 - "@smithy/property-provider": ^3.1.3 - "@smithy/protocol-http": ^4.0.4 - "@smithy/smithy-client": ^3.1.8 - "@smithy/types": ^3.3.0 - "@smithy/util-stream": ^3.1.0 - tslib: ^2.6.2 - checksum: a1afc3d78bc2496b57583a0d4e2ce080ba6f365c5b84aba39b070e51daee677256b32b8dcd93278c3c82a9c1288b2691c8f02624d23e819817fd55fa8377ddb4 - languageName: node - linkType: hard - -"@aws-sdk/credential-provider-ini@npm:3.616.0, @aws-sdk/credential-provider-ini@npm:^3.535.0": - version: 3.616.0 - resolution: "@aws-sdk/credential-provider-ini@npm:3.616.0" - dependencies: - "@aws-sdk/credential-provider-env": 3.609.0 - "@aws-sdk/credential-provider-http": 3.616.0 - "@aws-sdk/credential-provider-process": 3.614.0 - "@aws-sdk/credential-provider-sso": 3.616.0 - "@aws-sdk/credential-provider-web-identity": 3.609.0 - "@aws-sdk/types": 3.609.0 - "@smithy/credential-provider-imds": ^3.1.4 - "@smithy/property-provider": ^3.1.3 - "@smithy/shared-ini-file-loader": ^3.1.4 - "@smithy/types": ^3.3.0 - tslib: ^2.6.2 - peerDependencies: - "@aws-sdk/client-sts": ^3.616.0 - checksum: 2de4455b8bc58ebed180954d04e4f3de35a390778156a99a5581b7ebbf9adf01df6166f3dc60129a465865f110d30352b740ee92591169a1cb56d11e5ea21d38 + find-up: ^5.0.0 + checksum: 14cd77e982d2dd7989718dafdbf7a2168a5fb387005e0686c2dfa9ffc36bb9a749e5d80a151884459e4d8c88564339688dca26e9c711abe043beeb3f30c3dfd6 languageName: node linkType: hard -"@aws-sdk/credential-provider-node@npm:3.616.0": - version: 3.616.0 - resolution: "@aws-sdk/credential-provider-node@npm:3.616.0" +"@commitlint/types@npm:^17.4.4": + version: 17.4.4 + resolution: "@commitlint/types@npm:17.4.4" dependencies: - "@aws-sdk/credential-provider-env": 3.609.0 - "@aws-sdk/credential-provider-http": 3.616.0 - "@aws-sdk/credential-provider-ini": 3.616.0 - "@aws-sdk/credential-provider-process": 3.614.0 - "@aws-sdk/credential-provider-sso": 3.616.0 - "@aws-sdk/credential-provider-web-identity": 3.609.0 - "@aws-sdk/types": 3.609.0 - "@smithy/credential-provider-imds": ^3.1.4 - "@smithy/property-provider": ^3.1.3 - "@smithy/shared-ini-file-loader": ^3.1.4 - "@smithy/types": ^3.3.0 - tslib: ^2.6.2 - checksum: 9a66c9401eb152711a69010bfe9adc55fedd445d4d9754bd26490bf7b75c6606486dde9495893f893998ba74786ff4703ba94f0bdef92e2aa4c0d5baa605757a + chalk: ^4.1.0 + checksum: 03c52429052d161710896d198000196bd2e60be0fd71459b22133dd83dee43e8d05ea8ee703c8369823bc40f77a54881b80d8aa4368ac52aea7f30fb234b73d2 languageName: node linkType: hard -"@aws-sdk/credential-provider-process@npm:3.614.0": - version: 3.614.0 - resolution: "@aws-sdk/credential-provider-process@npm:3.614.0" - dependencies: - "@aws-sdk/types": 3.609.0 - "@smithy/property-provider": ^3.1.3 - "@smithy/shared-ini-file-loader": ^3.1.4 - "@smithy/types": ^3.3.0 - tslib: ^2.6.2 - checksum: 8bbbbf66911f38818e801187ae8df000e92b4e1c0dbe6d6b9afae81e08fb771302d2dc86c459653a2ed71acc10b9773885ae28d6fbce0031e082e9a6e61c85ee +"@crowdin/cli@npm:3.14.0": + version: 3.14.0 + resolution: "@crowdin/cli@npm:3.14.0" + dependencies: + command-exists-promise: ^2.0.2 + node-fetch: 2.6.7 + shelljs: ^0.8.4 + tar: ^4.4.8 + yauzl: ^2.10.0 + bin: + crowdin: jdeploy-bundle/jdeploy.js + checksum: 659c287b19193a92de6582968568dd395e8da02f085b2c97d39e2d368a71da19cdceec2acf8152d34f345fd42d55d01781819655a4f661a3c1b6ab22a8d5a8b1 languageName: node linkType: hard -"@aws-sdk/credential-provider-sso@npm:3.616.0": - version: 3.616.0 - resolution: "@aws-sdk/credential-provider-sso@npm:3.616.0" +"@cspotcode/source-map-support@npm:^0.8.0": + version: 0.8.1 + resolution: "@cspotcode/source-map-support@npm:0.8.1" dependencies: - "@aws-sdk/client-sso": 3.616.0 - "@aws-sdk/token-providers": 3.614.0 - "@aws-sdk/types": 3.609.0 - "@smithy/property-provider": ^3.1.3 - "@smithy/shared-ini-file-loader": ^3.1.4 - "@smithy/types": ^3.3.0 - tslib: ^2.6.2 - checksum: 773fb35df0bb769964dd1da86e9a498620ba411b664e9ef968ba33d222dbc29849eb95a556f11bb23a3893141815db9be098cba3c99dd0148b34f116f5e1ef56 + "@jridgewell/trace-mapping": 0.3.9 + checksum: 5718f267085ed8edb3e7ef210137241775e607ee18b77d95aa5bd7514f47f5019aa2d82d96b3bf342ef7aa890a346fa1044532ff7cc3009e7d24fce3ce6200fa languageName: node linkType: hard -"@aws-sdk/credential-provider-web-identity@npm:3.609.0": - version: 3.609.0 - resolution: "@aws-sdk/credential-provider-web-identity@npm:3.609.0" +"@emotion/is-prop-valid@npm:^0.8.2": + version: 0.8.8 + resolution: "@emotion/is-prop-valid@npm:0.8.8" dependencies: - "@aws-sdk/types": 3.609.0 - "@smithy/property-provider": ^3.1.3 - "@smithy/types": ^3.3.0 - tslib: ^2.6.2 - peerDependencies: - "@aws-sdk/client-sts": ^3.609.0 - checksum: 7a95a6c4792491122677fab6f01a9a46c8aa2f94d95255430bbd3fdcd514ab05ecf92c0ab169c8b30215b6b9181165f8d009774ba5a39cdd633162ef30879e56 + "@emotion/memoize": 0.7.4 + checksum: bb7ec6d48c572c540e24e47cc94fc2f8dec2d6a342ae97bc9c8b6388d9b8d283862672172a1bb62d335c02662afe6291e10c71e9b8642664a8b43416cdceffac languageName: node linkType: hard -"@aws-sdk/credential-providers@npm:^3.535.0": - version: 3.616.0 - resolution: "@aws-sdk/credential-providers@npm:3.616.0" - dependencies: - "@aws-sdk/client-cognito-identity": 3.616.0 - "@aws-sdk/client-sso": 3.616.0 - "@aws-sdk/client-sts": 3.616.0 - "@aws-sdk/credential-provider-cognito-identity": 3.616.0 - "@aws-sdk/credential-provider-env": 3.609.0 - "@aws-sdk/credential-provider-http": 3.616.0 - "@aws-sdk/credential-provider-ini": 3.616.0 - "@aws-sdk/credential-provider-node": 3.616.0 - "@aws-sdk/credential-provider-process": 3.614.0 - "@aws-sdk/credential-provider-sso": 3.616.0 - "@aws-sdk/credential-provider-web-identity": 3.609.0 - "@aws-sdk/types": 3.609.0 - "@smithy/credential-provider-imds": ^3.1.4 - "@smithy/property-provider": ^3.1.3 - "@smithy/types": ^3.3.0 - tslib: ^2.6.2 - checksum: d3fa4e49e1d1f7bf9d6ad5eea2859164bc633a0ca98eb92b701e18e91623670b1b36155a8ce540d222d745ee534b04468b07d0b2a34a108d141fa399e5e15543 +"@emotion/memoize@npm:0.7.4": + version: 0.7.4 + resolution: "@emotion/memoize@npm:0.7.4" + checksum: 4e3920d4ec95995657a37beb43d3f4b7d89fed6caa2b173a4c04d10482d089d5c3ea50bbc96618d918b020f26ed6e9c4026bbd45433566576c1f7b056c3271dc languageName: node linkType: hard -"@aws-sdk/middleware-host-header@npm:3.616.0": - version: 3.616.0 - resolution: "@aws-sdk/middleware-host-header@npm:3.616.0" - dependencies: - "@aws-sdk/types": 3.609.0 - "@smithy/protocol-http": ^4.0.4 - "@smithy/types": ^3.3.0 - tslib: ^2.6.2 - checksum: 7936068785a58e35adf96b90d6e72d9defca2d1051992bfd7bf5bbc150d000942ff587151d27d40276942d430817bac9985ab68d926333dfb581983b6236a21c +"@esbuild/aix-ppc64@npm:0.19.12": + version: 0.19.12 + resolution: "@esbuild/aix-ppc64@npm:0.19.12" + conditions: os=aix & cpu=ppc64 languageName: node linkType: hard -"@aws-sdk/middleware-logger@npm:3.609.0": - version: 3.609.0 - resolution: "@aws-sdk/middleware-logger@npm:3.609.0" - dependencies: - "@aws-sdk/types": 3.609.0 - "@smithy/types": ^3.3.0 - tslib: ^2.6.2 - checksum: b6f67a2e9ba082c8aec9d45905ae45ea5a95896f1beecb0c2d7fecfe17dd8fad99513f43b11ed7fd6ca9ff7764a0fc1ce63af91b1baed92b36f7b4b5390be5c6 +"@esbuild/android-arm64@npm:0.19.12": + version: 0.19.12 + resolution: "@esbuild/android-arm64@npm:0.19.12" + conditions: os=android & cpu=arm64 languageName: node linkType: hard -"@aws-sdk/middleware-recursion-detection@npm:3.616.0": - version: 3.616.0 - resolution: "@aws-sdk/middleware-recursion-detection@npm:3.616.0" - dependencies: - "@aws-sdk/types": 3.609.0 - "@smithy/protocol-http": ^4.0.4 - "@smithy/types": ^3.3.0 - tslib: ^2.6.2 - checksum: 43bd173705125f07e44c0c0feb85af0edba1503fe629d9eacdcc446d45d038fca6148415a9f721d80a80a5dab390585ef122823f30bd8e06d723f523c6fc58c3 +"@esbuild/android-arm@npm:0.19.12": + version: 0.19.12 + resolution: "@esbuild/android-arm@npm:0.19.12" + conditions: os=android & cpu=arm languageName: node linkType: hard -"@aws-sdk/middleware-user-agent@npm:3.616.0": - version: 3.616.0 - resolution: "@aws-sdk/middleware-user-agent@npm:3.616.0" - dependencies: - "@aws-sdk/types": 3.609.0 - "@aws-sdk/util-endpoints": 3.614.0 - "@smithy/protocol-http": ^4.0.4 - "@smithy/types": ^3.3.0 - tslib: ^2.6.2 - checksum: 6525d9061e0993f338c6dbb2c55e3e094aa02801d0814824cd4a0c0d9810e0f82fc7af4f6f2010723b18a856da241c3daded3fd9bc16b991cffef5f3031f0941 +"@esbuild/android-x64@npm:0.19.12": + version: 0.19.12 + resolution: "@esbuild/android-x64@npm:0.19.12" + conditions: os=android & cpu=x64 languageName: node linkType: hard -"@aws-sdk/region-config-resolver@npm:3.614.0": - version: 3.614.0 - resolution: "@aws-sdk/region-config-resolver@npm:3.614.0" - dependencies: - "@aws-sdk/types": 3.609.0 - "@smithy/node-config-provider": ^3.1.4 - "@smithy/types": ^3.3.0 - "@smithy/util-config-provider": ^3.0.0 - "@smithy/util-middleware": ^3.0.3 - tslib: ^2.6.2 - checksum: dbaca50792c99685845b21dd4a53228613e0458ee517a21db941890ee521d91eff80704f08e9ee71b6f04e70fb86362c4823750bb0b3727240af68d78d8fa4be +"@esbuild/darwin-arm64@npm:0.19.12": + version: 0.19.12 + resolution: "@esbuild/darwin-arm64@npm:0.19.12" + conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@aws-sdk/token-providers@npm:3.614.0": - version: 3.614.0 - resolution: "@aws-sdk/token-providers@npm:3.614.0" - dependencies: - "@aws-sdk/types": 3.609.0 - "@smithy/property-provider": ^3.1.3 - "@smithy/shared-ini-file-loader": ^3.1.4 - "@smithy/types": ^3.3.0 - tslib: ^2.6.2 - peerDependencies: - "@aws-sdk/client-sso-oidc": ^3.614.0 - checksum: 2901b8428afc3b76ff1df9ac29a2698db6bf65d1d2afcd8424b9bf187313d2a3ca747c3b205afeb5c132068b5a5a94d84ce82710f775fa0cbb79499d7fea2d64 +"@esbuild/darwin-x64@npm:0.19.12": + version: 0.19.12 + resolution: "@esbuild/darwin-x64@npm:0.19.12" + conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@aws-sdk/types@npm:3.609.0, @aws-sdk/types@npm:^3.1.0, @aws-sdk/types@npm:^3.222.0, @aws-sdk/types@npm:^3.25.0": - version: 3.609.0 - resolution: "@aws-sdk/types@npm:3.609.0" - dependencies: - "@smithy/types": ^3.3.0 - tslib: ^2.6.2 - checksum: 522768d08f104065b0ff6a37eddaa7803186014acee1c0011b3dbd3ef841e47ae694e58f608aeec8a39d22d644d759ade996fe51d18b880617778dc2dbbe1ede +"@esbuild/freebsd-arm64@npm:0.19.12": + version: 0.19.12 + resolution: "@esbuild/freebsd-arm64@npm:0.19.12" + conditions: os=freebsd & cpu=arm64 languageName: node linkType: hard -"@aws-sdk/util-endpoints@npm:3.614.0": - version: 3.614.0 - resolution: "@aws-sdk/util-endpoints@npm:3.614.0" - dependencies: - "@aws-sdk/types": 3.609.0 - "@smithy/types": ^3.3.0 - "@smithy/util-endpoints": ^2.0.5 - tslib: ^2.6.2 - checksum: 9d9973ceee59bf30af85c7f4328083daea033a987ec396dcb89eb7649f470ceb19c6b96635e121f3557e726f7ec7453236c956cf43f22128883c277f17d2a13f +"@esbuild/freebsd-x64@npm:0.19.12": + version: 0.19.12 + resolution: "@esbuild/freebsd-x64@npm:0.19.12" + conditions: os=freebsd & cpu=x64 languageName: node linkType: hard -"@aws-sdk/util-hex-encoding@npm:^3.29.0": - version: 3.310.0 - resolution: "@aws-sdk/util-hex-encoding@npm:3.310.0" - dependencies: - tslib: ^2.5.0 - checksum: 97b8d7e0e406189cdbd4fccb0a497dd247a22d54b18caf5a64a63d19d2535b95a64ee79ecf81b13f741bda1d565eb11448d4fd39617e4b86fc8626b05485d98c +"@esbuild/linux-arm64@npm:0.19.12": + version: 0.19.12 + resolution: "@esbuild/linux-arm64@npm:0.19.12" + conditions: os=linux & cpu=arm64 languageName: node linkType: hard -"@aws-sdk/util-locate-window@npm:^3.0.0": - version: 3.568.0 - resolution: "@aws-sdk/util-locate-window@npm:3.568.0" - dependencies: - tslib: ^2.6.2 - checksum: 354db5187beee4203c7ec6583556ab14ecde9644c06aaa51fa2528131836d3fc73035a3b080c904e108c49defce20d5562893113b93d819b70497f47989bb578 +"@esbuild/linux-arm@npm:0.19.12": + version: 0.19.12 + resolution: "@esbuild/linux-arm@npm:0.19.12" + conditions: os=linux & cpu=arm languageName: node linkType: hard -"@aws-sdk/util-user-agent-browser@npm:3.609.0": - version: 3.609.0 - resolution: "@aws-sdk/util-user-agent-browser@npm:3.609.0" - dependencies: - "@aws-sdk/types": 3.609.0 - "@smithy/types": ^3.3.0 - bowser: ^2.11.0 - tslib: ^2.6.2 - checksum: 75ba1ae74dd1001f47870766d92b66ac02a0a488efcf42c1a368962a7978a778d99536e880f07f7db1c2ca66cc9b1863fd3342957a22dcf78bf2f4398265a7a5 +"@esbuild/linux-ia32@npm:0.19.12": + version: 0.19.12 + resolution: "@esbuild/linux-ia32@npm:0.19.12" + conditions: os=linux & cpu=ia32 languageName: node linkType: hard -"@aws-sdk/util-user-agent-node@npm:3.614.0": - version: 3.614.0 - resolution: "@aws-sdk/util-user-agent-node@npm:3.614.0" - dependencies: - "@aws-sdk/types": 3.609.0 - "@smithy/node-config-provider": ^3.1.4 - "@smithy/types": ^3.3.0 - tslib: ^2.6.2 - peerDependencies: - aws-crt: ">=1.0.0" - peerDependenciesMeta: - aws-crt: - optional: true - checksum: 1f010080c2301fd836908963a235ef39e597d959e27461d15d4958fa582ab20795022f8cb7429c183c386f558a5c125cb254a0c4e844dbc6422169f4884be34a +"@esbuild/linux-loong64@npm:0.19.12": + version: 0.19.12 + resolution: "@esbuild/linux-loong64@npm:0.19.12" + conditions: os=linux & cpu=loong64 languageName: node linkType: hard -"@aws-sdk/util-utf8-browser@npm:^3.0.0": - version: 3.259.0 - resolution: "@aws-sdk/util-utf8-browser@npm:3.259.0" - dependencies: - tslib: ^2.3.1 - checksum: b6a1e580da1c9b62c749814182a7649a748ca4253edb4063aa521df97d25b76eae3359eb1680b86f71aac668e05cc05c514379bca39ebf4ba998ae4348412da8 +"@esbuild/linux-mips64el@npm:0.19.12": + version: 0.19.12 + resolution: "@esbuild/linux-mips64el@npm:0.19.12" + conditions: os=linux & cpu=mips64el languageName: node linkType: hard -"@babel/code-frame@npm:7.10.4, @babel/code-frame@npm:~7.10.4": - version: 7.10.4 - resolution: "@babel/code-frame@npm:7.10.4" - dependencies: - "@babel/highlight": ^7.10.4 - checksum: feb4543c8a509fe30f0f6e8d7aa84f82b41148b963b826cd330e34986f649a85cb63b2f13dd4effdf434ac555d16f14940b8ea5f4433297c2f5ff85486ded019 +"@esbuild/linux-ppc64@npm:0.19.12": + version: 0.19.12 + resolution: "@esbuild/linux-ppc64@npm:0.19.12" + conditions: os=linux & cpu=ppc64 languageName: node linkType: hard -"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.10.4, @babel/code-frame@npm:^7.12.13, @babel/code-frame@npm:^7.16.0, @babel/code-frame@npm:^7.16.7, @babel/code-frame@npm:^7.24.7, @babel/code-frame@npm:^7.25.9, @babel/code-frame@npm:^7.26.0, @babel/code-frame@npm:^7.26.2, @babel/code-frame@npm:^7.8.3": - version: 7.26.2 - resolution: "@babel/code-frame@npm:7.26.2" - dependencies: - "@babel/helper-validator-identifier": ^7.25.9 - js-tokens: ^4.0.0 - picocolors: ^1.0.0 - checksum: db13f5c42d54b76c1480916485e6900748bbcb0014a8aca87f50a091f70ff4e0d0a6db63cade75eb41fcc3d2b6ba0a7f89e343def4f96f00269b41b8ab8dd7b8 +"@esbuild/linux-riscv64@npm:0.19.12": + version: 0.19.12 + resolution: "@esbuild/linux-riscv64@npm:0.19.12" + conditions: os=linux & cpu=riscv64 languageName: node linkType: hard -"@babel/compat-data@npm:^7.20.5, @babel/compat-data@npm:^7.22.6, @babel/compat-data@npm:^7.25.9, @babel/compat-data@npm:^7.26.0": - version: 7.26.5 - resolution: "@babel/compat-data@npm:7.26.5" - checksum: 7aaac0e79cf6f38478b877b1185413390bfe8ce9f2a19f906cfdf898df82f5a932579bee49c5d0d0a6fd838c715ff59d4958bfd161ef0e857e5eb083efb707b4 +"@esbuild/linux-s390x@npm:0.19.12": + version: 0.19.12 + resolution: "@esbuild/linux-s390x@npm:0.19.12" + conditions: os=linux & cpu=s390x languageName: node linkType: hard -"@babel/core@npm:7.26.0, @babel/core@npm:^7.1.0, @babel/core@npm:^7.11.1, @babel/core@npm:^7.11.6, @babel/core@npm:^7.12.3, @babel/core@npm:^7.13.16, @babel/core@npm:^7.14.0, @babel/core@npm:^7.16.0, @babel/core@npm:^7.18.9, @babel/core@npm:^7.20.0, @babel/core@npm:^7.20.7, @babel/core@npm:^7.21.3, @babel/core@npm:^7.25.2": - version: 7.26.0 - resolution: "@babel/core@npm:7.26.0" - dependencies: - "@ampproject/remapping": ^2.2.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/helpers": ^7.26.0 - "@babel/parser": ^7.26.0 - "@babel/template": ^7.25.9 - "@babel/traverse": ^7.25.9 - "@babel/types": ^7.26.0 - convert-source-map: ^2.0.0 - debug: ^4.1.0 - gensync: ^1.0.0-beta.2 - json5: ^2.2.3 - semver: ^6.3.1 - checksum: b296084cfd818bed8079526af93b5dfa0ba70282532d2132caf71d4060ab190ba26d3184832a45accd82c3c54016985a4109ab9118674347a7e5e9bc464894e6 +"@esbuild/linux-x64@npm:0.19.12": + version: 0.19.12 + resolution: "@esbuild/linux-x64@npm:0.19.12" + conditions: os=linux & cpu=x64 languageName: node linkType: hard -"@babel/eslint-parser@npm:^7.16.3, @babel/eslint-parser@npm:^7.18.2": - version: 7.25.9 - resolution: "@babel/eslint-parser@npm:7.25.9" - dependencies: - "@nicolo-ribaudo/eslint-scope-5-internals": 5.1.1-v1 - eslint-visitor-keys: ^2.1.0 - semver: ^6.3.1 - peerDependencies: - "@babel/core": ^7.11.0 - eslint: ^7.5.0 || ^8.0.0 || ^9.0.0 - checksum: dd2afa122b62a5b07c1e71d1c23b2cd4d655d96609eb2ba1b1ae3ec6f415f4365b77d6669ff859aa7b75952fb63a1d29c5db6e5811fc4012841491cb2dee36e4 +"@esbuild/netbsd-x64@npm:0.19.12": + version: 0.19.12 + resolution: "@esbuild/netbsd-x64@npm:0.19.12" + conditions: os=netbsd & cpu=x64 languageName: node linkType: hard -"@babel/generator@npm:^7.14.0, @babel/generator@npm:^7.18.13, @babel/generator@npm:^7.20.5, @babel/generator@npm:^7.25.0, @babel/generator@npm:^7.25.5, @babel/generator@npm:^7.26.0, @babel/generator@npm:^7.26.5, @babel/generator@npm:^7.7.2": - version: 7.26.5 - resolution: "@babel/generator@npm:7.26.5" - dependencies: - "@babel/parser": ^7.26.5 - "@babel/types": ^7.26.5 - "@jridgewell/gen-mapping": ^0.3.5 - "@jridgewell/trace-mapping": ^0.3.25 - jsesc: ^3.0.2 - checksum: baa42a98cd01efa3ae3634a6caa81d0738e5e0bdba4efbf1ac735216c8d7cf6bdffeab69c468e6ab2063b07db402346113def4962719746756518432f83c53ba +"@esbuild/openbsd-x64@npm:0.19.12": + version: 0.19.12 + resolution: "@esbuild/openbsd-x64@npm:0.19.12" + conditions: os=openbsd & cpu=x64 languageName: node linkType: hard -"@babel/helper-annotate-as-pure@npm:^7.18.6, @babel/helper-annotate-as-pure@npm:^7.22.5, @babel/helper-annotate-as-pure@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/helper-annotate-as-pure@npm:7.25.9" - dependencies: - "@babel/types": ^7.25.9 - checksum: 41edda10df1ae106a9b4fe617bf7c6df77db992992afd46192534f5cff29f9e49a303231733782dd65c5f9409714a529f215325569f14282046e9d3b7a1ffb6c +"@esbuild/sunos-x64@npm:0.19.12": + version: 0.19.12 + resolution: "@esbuild/sunos-x64@npm:0.19.12" + conditions: os=sunos & cpu=x64 languageName: node linkType: hard -"@babel/helper-compilation-targets@npm:^7.20.7, @babel/helper-compilation-targets@npm:^7.22.6, @babel/helper-compilation-targets@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/helper-compilation-targets@npm:7.25.9" - dependencies: - "@babel/compat-data": ^7.25.9 - "@babel/helper-validator-option": ^7.25.9 - browserslist: ^4.24.0 - lru-cache: ^5.1.1 - semver: ^6.3.1 - checksum: 3af536e2db358b38f968abdf7d512d425d1018fef2f485d6f131a57a7bcaed32c606b4e148bb230e1508fa42b5b2ac281855a68eb78270f54698c48a83201b9b +"@esbuild/win32-arm64@npm:0.19.12": + version: 0.19.12 + resolution: "@esbuild/win32-arm64@npm:0.19.12" + conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@babel/helper-create-class-features-plugin@npm:^7.18.6, @babel/helper-create-class-features-plugin@npm:^7.21.0, @babel/helper-create-class-features-plugin@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/helper-create-class-features-plugin@npm:7.25.9" - dependencies: - "@babel/helper-annotate-as-pure": ^7.25.9 - "@babel/helper-member-expression-to-functions": ^7.25.9 - "@babel/helper-optimise-call-expression": ^7.25.9 - "@babel/helper-replace-supers": ^7.25.9 - "@babel/helper-skip-transparent-expression-wrappers": ^7.25.9 - "@babel/traverse": ^7.25.9 - semver: ^6.3.1 - peerDependencies: - "@babel/core": ^7.0.0 - checksum: 91dd5f203ed04568c70b052e2f26dfaac7c146447196c00b8ecbb6d3d2f3b517abadb985d3321a19d143adaed6fe17f7f79f8f50e0c20e9d8ad83e1027b42424 +"@esbuild/win32-ia32@npm:0.19.12": + version: 0.19.12 + resolution: "@esbuild/win32-ia32@npm:0.19.12" + conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@babel/helper-create-regexp-features-plugin@npm:^7.18.6, @babel/helper-create-regexp-features-plugin@npm:^7.25.9": - version: 7.26.3 - resolution: "@babel/helper-create-regexp-features-plugin@npm:7.26.3" - dependencies: - "@babel/helper-annotate-as-pure": ^7.25.9 - regexpu-core: ^6.2.0 - semver: ^6.3.1 - peerDependencies: - "@babel/core": ^7.0.0 - checksum: 50a27d8ce6da5c2fa0c62c132c4d27cfeb36e3233ff1e5220d643de3dafe49423b507382f0b72a696fce7486014b134c1e742f55438590f9405d26765b009af0 +"@esbuild/win32-x64@npm:0.19.12": + version: 0.19.12 + resolution: "@esbuild/win32-x64@npm:0.19.12" + conditions: os=win32 & cpu=x64 languageName: node linkType: hard -"@babel/helper-define-polyfill-provider@npm:^0.6.2, @babel/helper-define-polyfill-provider@npm:^0.6.3": - version: 0.6.3 - resolution: "@babel/helper-define-polyfill-provider@npm:0.6.3" +"@ethersproject/bytes@npm:^5.7.0": + version: 5.7.0 + resolution: "@ethersproject/bytes@npm:5.7.0" dependencies: - "@babel/helper-compilation-targets": ^7.22.6 - "@babel/helper-plugin-utils": ^7.22.5 - debug: ^4.1.1 - lodash.debounce: ^4.0.8 - resolve: ^1.14.2 - peerDependencies: - "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - checksum: 710e6d8a5391736b9f53f09d0494575c2e03de199ad8d1349bc8e514cb85251ea1f1842c2ff44830849d482052ddb42ae931101002a87a263b12f649c2e57c01 + "@ethersproject/logger": ^5.7.0 + checksum: 66ad365ceaab5da1b23b72225c71dce472cf37737af5118181fa8ab7447d696bea15ca22e3a0e8836fdd8cfac161afe321a7c67d0dde96f9f645ddd759676621 languageName: node linkType: hard -"@babel/helper-member-expression-to-functions@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/helper-member-expression-to-functions@npm:7.25.9" +"@ethersproject/keccak256@npm:5.7.0": + version: 5.7.0 + resolution: "@ethersproject/keccak256@npm:5.7.0" dependencies: - "@babel/traverse": ^7.25.9 - "@babel/types": ^7.25.9 - checksum: 8e2f1979b6d596ac2a8cbf17f2cf709180fefc274ac3331408b48203fe19134ed87800774ef18838d0275c3965130bae22980d90caed756b7493631d4b2cf961 + "@ethersproject/bytes": ^5.7.0 + js-sha3: 0.8.0 + checksum: ff70950d82203aab29ccda2553422cbac2e7a0c15c986bd20a69b13606ed8bb6e4fdd7b67b8d3b27d4f841e8222cbaccd33ed34be29f866fec7308f96ed244c6 languageName: node linkType: hard -"@babel/helper-module-imports@npm:^7.0.0, @babel/helper-module-imports@npm:^7.10.4, @babel/helper-module-imports@npm:^7.14.5, @babel/helper-module-imports@npm:^7.22.5, @babel/helper-module-imports@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/helper-module-imports@npm:7.25.9" - dependencies: - "@babel/traverse": ^7.25.9 - "@babel/types": ^7.25.9 - checksum: 1b411ce4ca825422ef7065dffae7d8acef52023e51ad096351e3e2c05837e9bf9fca2af9ca7f28dc26d596a588863d0fedd40711a88e350b736c619a80e704e6 +"@ethersproject/logger@npm:^5.7.0": + version: 5.7.0 + resolution: "@ethersproject/logger@npm:5.7.0" + checksum: 075ab2f605f1fd0813f2e39c3308f77b44a67732b36e712d9bc085f22a84aac4da4f71b39bee50fe78da3e1c812673fadc41180c9970fe5e486e91ea17befe0d languageName: node linkType: hard -"@babel/helper-module-transforms@npm:^7.25.9, @babel/helper-module-transforms@npm:^7.26.0": - version: 7.26.0 - resolution: "@babel/helper-module-transforms@npm:7.26.0" - dependencies: - "@babel/helper-module-imports": ^7.25.9 - "@babel/helper-validator-identifier": ^7.25.9 - "@babel/traverse": ^7.25.9 - peerDependencies: - "@babel/core": ^7.0.0 - checksum: 942eee3adf2b387443c247a2c190c17c4fd45ba92a23087abab4c804f40541790d51ad5277e4b5b1ed8d5ba5b62de73857446b7742f835c18ebd350384e63917 +"@fastify/busboy@npm:^2.0.0": + version: 2.1.0 + resolution: "@fastify/busboy@npm:2.1.0" + checksum: 3233abd10f73e50668cb4bb278a79b7b3fadd30215ac6458299b0e5a09a29c3586ec07597aae6bd93f5cbedfcef43a8aeea51829cd28fc13850cdbcd324c28d5 languageName: node linkType: hard -"@babel/helper-optimise-call-expression@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/helper-optimise-call-expression@npm:7.25.9" +"@gitbeaker/core@npm:^21.7.0": + version: 21.7.0 + resolution: "@gitbeaker/core@npm:21.7.0" dependencies: - "@babel/types": ^7.25.9 - checksum: f09d0ad60c0715b9a60c31841b3246b47d67650c512ce85bbe24a3124f1a4d66377df793af393273bc6e1015b0a9c799626c48e53747581c1582b99167cc65dc + "@gitbeaker/requester-utils": ^21.7.0 + form-data: ^3.0.0 + li: ^1.3.0 + xcase: ^2.0.1 + checksum: 2f196849855e2d89573e49aed58d5f792833196b1a32cb2d0c84e7b00b6e6bd54f001498a598486fc226daec6cbbdeb739ffeb38f54dc1ba5c8ed14c8f035180 languageName: node linkType: hard -"@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.10.4, @babel/helper-plugin-utils@npm:^7.12.13, @babel/helper-plugin-utils@npm:^7.14.5, @babel/helper-plugin-utils@npm:^7.16.7, @babel/helper-plugin-utils@npm:^7.18.6, @babel/helper-plugin-utils@npm:^7.18.9, @babel/helper-plugin-utils@npm:^7.20.2, @babel/helper-plugin-utils@npm:^7.22.5, @babel/helper-plugin-utils@npm:^7.24.8, @babel/helper-plugin-utils@npm:^7.25.9, @babel/helper-plugin-utils@npm:^7.26.5, @babel/helper-plugin-utils@npm:^7.8.0, @babel/helper-plugin-utils@npm:^7.8.3": - version: 7.26.5 - resolution: "@babel/helper-plugin-utils@npm:7.26.5" - checksum: 4771fbb1711c624c62d12deabc2ed7435a6e6994b6ce09d5ede1bc1bf19be59c3775461a1e693bdd596af865685e87bb2abc778f62ceadc1b2095a8e2aa74180 +"@gitbeaker/node@npm:^21.3.0": + version: 21.7.0 + resolution: "@gitbeaker/node@npm:21.7.0" + dependencies: + "@gitbeaker/core": ^21.7.0 + "@gitbeaker/requester-utils": ^21.7.0 + form-data: ^3.0.0 + got: ^11.1.4 + xcase: ^2.0.1 + checksum: 397c5c1227faba1dee4c2c65cd4651014e80701922a3bd24ebd8567a9aa05c848b253583c8ca498e328177ae30fd6c29489daf43d20786e88ab40b6c0df15b05 languageName: node linkType: hard -"@babel/helper-remap-async-to-generator@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/helper-remap-async-to-generator@npm:7.25.9" +"@gitbeaker/requester-utils@npm:^21.7.0": + version: 21.7.0 + resolution: "@gitbeaker/requester-utils@npm:21.7.0" dependencies: - "@babel/helper-annotate-as-pure": ^7.25.9 - "@babel/helper-wrap-function": ^7.25.9 - "@babel/traverse": ^7.25.9 - peerDependencies: - "@babel/core": ^7.0.0 - checksum: ea37ad9f8f7bcc27c109963b8ebb9d22bac7a5db2a51de199cb560e251d5593fe721e46aab2ca7d3e7a24b0aa4aff0eaf9c7307af9c2fd3a1d84268579073052 + form-data: ^3.0.0 + query-string: ^6.12.1 + xcase: ^2.0.1 + checksum: 3e0bc40e6ae2d3492aaea632b8963fa89785d74eed434122a64e7d07069fafd2fbb0b0f5eddc309a1f7a8907de2cf0a591ff8f94176889814e713e79b8cd6a6b languageName: node linkType: hard -"@babel/helper-replace-supers@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/helper-replace-supers@npm:7.25.9" +"@jridgewell/gen-mapping@npm:^0.3.5": + version: 0.3.5 + resolution: "@jridgewell/gen-mapping@npm:0.3.5" dependencies: - "@babel/helper-member-expression-to-functions": ^7.25.9 - "@babel/helper-optimise-call-expression": ^7.25.9 - "@babel/traverse": ^7.25.9 - peerDependencies: - "@babel/core": ^7.0.0 - checksum: 84f40e12520b7023e52d289bf9d569a06284879fe23bbbacad86bec5d978b2669769f11b073fcfeb1567d8c547168323005fda88607a4681ecaeb4a5cdd48bb9 + "@jridgewell/set-array": ^1.2.1 + "@jridgewell/sourcemap-codec": ^1.4.10 + "@jridgewell/trace-mapping": ^0.3.24 + checksum: ff7a1764ebd76a5e129c8890aa3e2f46045109dabde62b0b6c6a250152227647178ff2069ea234753a690d8f3c4ac8b5e7b267bbee272bffb7f3b0a370ab6e52 languageName: node linkType: hard -"@babel/helper-skip-transparent-expression-wrappers@npm:^7.20.0, @babel/helper-skip-transparent-expression-wrappers@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/helper-skip-transparent-expression-wrappers@npm:7.25.9" - dependencies: - "@babel/traverse": ^7.25.9 - "@babel/types": ^7.25.9 - checksum: fdbb5248932198bc26daa6abf0d2ac42cab9c2dbb75b7e9f40d425c8f28f09620b886d40e7f9e4e08ffc7aaa2cefe6fc2c44be7c20e81f7526634702fb615bdc +"@jridgewell/resolve-uri@npm:^3.0.3, @jridgewell/resolve-uri@npm:^3.1.0": + version: 3.1.1 + resolution: "@jridgewell/resolve-uri@npm:3.1.1" + checksum: f5b441fe7900eab4f9155b3b93f9800a916257f4e8563afbcd3b5a5337b55e52bd8ae6735453b1b745457d9f6cdb16d74cd6220bbdd98cf153239e13f6cbb653 languageName: node linkType: hard -"@babel/helper-string-parser@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/helper-string-parser@npm:7.25.9" - checksum: 6435ee0849e101681c1849868278b5aee82686ba2c1e27280e5e8aca6233af6810d39f8e4e693d2f2a44a3728a6ccfd66f72d71826a94105b86b731697cdfa99 +"@jridgewell/set-array@npm:^1.2.1": + version: 1.2.1 + resolution: "@jridgewell/set-array@npm:1.2.1" + checksum: 832e513a85a588f8ed4f27d1279420d8547743cc37fcad5a5a76fc74bb895b013dfe614d0eed9cb860048e6546b798f8f2652020b4b2ba0561b05caa8c654b10 languageName: node linkType: hard -"@babel/helper-validator-identifier@npm:^7.24.7, @babel/helper-validator-identifier@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/helper-validator-identifier@npm:7.25.9" - checksum: 5b85918cb1a92a7f3f508ea02699e8d2422fe17ea8e82acd445006c0ef7520fbf48e3dbcdaf7b0a1d571fc3a2715a29719e5226636cb6042e15fe6ed2a590944 +"@jridgewell/sourcemap-codec@npm:^1.4.10, @jridgewell/sourcemap-codec@npm:^1.4.14, @jridgewell/sourcemap-codec@npm:^1.4.15": + version: 1.4.15 + resolution: "@jridgewell/sourcemap-codec@npm:1.4.15" + checksum: b881c7e503db3fc7f3c1f35a1dd2655a188cc51a3612d76efc8a6eb74728bef5606e6758ee77423e564092b4a518aba569bbb21c9bac5ab7a35b0c6ae7e344c8 languageName: node linkType: hard -"@babel/helper-validator-option@npm:^7.21.0, @babel/helper-validator-option@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/helper-validator-option@npm:7.25.9" - checksum: 9491b2755948ebbdd68f87da907283698e663b5af2d2b1b02a2765761974b1120d5d8d49e9175b167f16f72748ffceec8c9cf62acfbee73f4904507b246e2b3d - languageName: node - linkType: hard - -"@babel/helper-wrap-function@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/helper-wrap-function@npm:7.25.9" +"@jridgewell/trace-mapping@npm:0.3.9": + version: 0.3.9 + resolution: "@jridgewell/trace-mapping@npm:0.3.9" dependencies: - "@babel/template": ^7.25.9 - "@babel/traverse": ^7.25.9 - "@babel/types": ^7.25.9 - checksum: 8ec1701e60ae004415800c4a7a188f5564c73b4e4f3fdf58dd3f34a3feaa9753173f39bbd6d02e7ecc974f48155efc7940e62584435b3092c07728ee46a604ea + "@jridgewell/resolve-uri": ^3.0.3 + "@jridgewell/sourcemap-codec": ^1.4.10 + checksum: d89597752fd88d3f3480845691a05a44bd21faac18e2185b6f436c3b0fd0c5a859fbbd9aaa92050c4052caf325ad3e10e2e1d1b64327517471b7d51babc0ddef languageName: node linkType: hard -"@babel/helpers@npm:^7.26.0": - version: 7.26.0 - resolution: "@babel/helpers@npm:7.26.0" +"@jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.25": + version: 0.3.25 + resolution: "@jridgewell/trace-mapping@npm:0.3.25" dependencies: - "@babel/template": ^7.25.9 - "@babel/types": ^7.26.0 - checksum: d77fe8d45033d6007eadfa440355c1355eed57902d5a302f450827ad3d530343430a21210584d32eef2f216ae463d4591184c6fc60cf205bbf3a884561469200 + "@jridgewell/resolve-uri": ^3.1.0 + "@jridgewell/sourcemap-codec": ^1.4.14 + checksum: 9d3c40d225e139987b50c48988f8717a54a8c994d8a948ee42e1412e08988761d0754d7d10b803061cc3aebf35f92a5dbbab493bd0e1a9ef9e89a2130e83ba34 languageName: node linkType: hard -"@babel/highlight@npm:^7.10.4": - version: 7.24.7 - resolution: "@babel/highlight@npm:7.24.7" +"@manypkg/cli@npm:0.19.2": + version: 0.19.2 + resolution: "@manypkg/cli@npm:0.19.2" dependencies: - "@babel/helper-validator-identifier": ^7.24.7 + "@babel/runtime": ^7.5.5 + "@manypkg/get-packages": ^1.1.3 chalk: ^2.4.2 - js-tokens: ^4.0.0 - picocolors: ^1.0.0 - checksum: 5cd3a89f143671c4ac129960024ba678b669e6fc673ce078030f5175002d1d3d52bc10b22c5b916a6faf644b5028e9a4bd2bb264d053d9b05b6a98690f1d46f1 + detect-indent: ^6.0.0 + find-up: ^4.1.0 + fs-extra: ^8.1.0 + normalize-path: ^3.0.0 + p-limit: ^2.2.1 + package-json: ^6.5.0 + parse-github-url: ^1.0.2 + sembear: ^0.5.0 + semver: ^6.3.0 + spawndamnit: ^2.0.0 + validate-npm-package-name: ^3.0.0 + bin: + manypkg: bin.js + checksum: b40e9bff3aaccdfe85b4bfc08aee3b50ccde6c62bbe81ccf9c11e159e7adf26a0ebb990efa68c8fbd05b03ac9da5d6301b362c40c319e6ff6be45489361bd5c9 languageName: node linkType: hard -"@babel/parser@npm:^7.0.0, @babel/parser@npm:^7.1.0, @babel/parser@npm:^7.1.6, @babel/parser@npm:^7.13.16, @babel/parser@npm:^7.14.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.16.8, @babel/parser@npm:^7.20.0, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.21.4, @babel/parser@npm:^7.23.0, @babel/parser@npm:^7.23.5, @babel/parser@npm:^7.25.3, @babel/parser@npm:^7.25.4, @babel/parser@npm:^7.25.9, @babel/parser@npm:^7.26.0, @babel/parser@npm:^7.26.5, @babel/parser@npm:^7.26.7": - version: 7.26.7 - resolution: "@babel/parser@npm:7.26.7" +"@manypkg/find-root@npm:^1.1.0": + version: 1.1.0 + resolution: "@manypkg/find-root@npm:1.1.0" dependencies: - "@babel/types": ^7.26.7 - bin: - parser: ./bin/babel-parser.js - checksum: 22aafd7a6fb9ae577cf192141e5b879477fc087872b8953df0eed60ab7e2397d01aa8d92690eb7ba406f408035dd27c86fbf9967c9a37abd9bf4b1d7cf46a823 + "@babel/runtime": ^7.5.5 + "@types/node": ^12.7.1 + find-up: ^4.1.0 + fs-extra: ^8.1.0 + checksum: f0fd881a5a81a351cb6561cd24117e8ee9481bbf3b6d1c7d9d10bef1f4744ca2ba3d064713e83c0a0574416d1e5b4a4c6c414aad91913c4a1c6040d87283ac50 languageName: node linkType: hard -"@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:7.25.9" +"@manypkg/get-packages@npm:^1.1.3": + version: 1.1.3 + resolution: "@manypkg/get-packages@npm:1.1.3" dependencies: - "@babel/helper-plugin-utils": ^7.25.9 - "@babel/traverse": ^7.25.9 - peerDependencies: - "@babel/core": ^7.0.0 - checksum: b33d37dacf98a9c74f53959999adc37a258057668b62dba557e6865689433c53764673109eaba9102bf73b2ac4db162f0d9b89a6cca6f1b71d12f5908ec11da9 + "@babel/runtime": ^7.5.5 + "@changesets/types": ^4.0.1 + "@manypkg/find-root": ^1.1.0 + fs-extra: ^8.1.0 + globby: ^11.0.0 + read-yaml-file: ^1.1.0 + checksum: f5a756e5a659e0e1c33f48852d56826d170d5b10a3cdea89ce4fcaa77678d8799aa4004b30e1985c87b73dbc390b95bb6411b78336dd1e0db87c08c74b5c0e74 languageName: node linkType: hard -"@babel/plugin-bugfix-safari-class-field-initializer-scope@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-bugfix-safari-class-field-initializer-scope@npm:7.25.9" +"@motionone/animation@npm:^10.12.0": + version: 10.18.0 + resolution: "@motionone/animation@npm:10.18.0" dependencies: - "@babel/helper-plugin-utils": ^7.25.9 - peerDependencies: - "@babel/core": ^7.0.0 - checksum: d3e14ab1cb9cb50246d20cab9539f2fbd1e7ef1ded73980c8ad7c0561b4d5e0b144d362225f0976d47898e04cbd40f2000e208b0913bd788346cf7791b96af91 + "@motionone/easing": ^10.18.0 + "@motionone/types": ^10.17.1 + "@motionone/utils": ^10.18.0 + tslib: ^2.3.1 + checksum: 841cb9f4843a89e5e4560b9f960f52cbe78afc86f87c769f71e9edb3aadd53fb87982b7e11914428f228b29fd580756be531369c2ffac06432550afa4e87d1c3 languageName: node linkType: hard -"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:7.25.9" +"@motionone/dom@npm:10.12.0": + version: 10.12.0 + resolution: "@motionone/dom@npm:10.12.0" dependencies: - "@babel/helper-plugin-utils": ^7.25.9 - peerDependencies: - "@babel/core": ^7.0.0 - checksum: a9d1ee3fd100d3eb6799a2f2bbd785296f356c531d75c9369f71541811fa324270258a374db103ce159156d006da2f33370330558d0133e6f7584152c34997ca + "@motionone/animation": ^10.12.0 + "@motionone/generators": ^10.12.0 + "@motionone/types": ^10.12.0 + "@motionone/utils": ^10.12.0 + hey-listen: ^1.0.8 + tslib: ^2.3.1 + checksum: 123356f28e44362c4f081aae3df22e576f46bfcb07e01257b2ac64a115668448f29b8de67e4b6e692c5407cffb78ffe7cf9fa1bc064007482bab5dd23a69d380 languageName: node linkType: hard -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:7.25.9" +"@motionone/easing@npm:^10.18.0": + version: 10.18.0 + resolution: "@motionone/easing@npm:10.18.0" dependencies: - "@babel/helper-plugin-utils": ^7.25.9 - "@babel/helper-skip-transparent-expression-wrappers": ^7.25.9 - "@babel/plugin-transform-optional-chaining": ^7.25.9 - peerDependencies: - "@babel/core": ^7.13.0 - checksum: 5b298b28e156f64de51cdb03a2c5b80c7f978815ef1026f3ae8b9fc48d28bf0a83817d8fbecb61ef8fb94a7201f62cca5103cc6e7b9e8f28e38f766d7905b378 + "@motionone/utils": ^10.18.0 + tslib: ^2.3.1 + checksum: 6bd37f7a9d5a88f868cc0ad6e47d2ba8d9fefd7da84fccfea7ed77ec08c2e6d1e42df88dda462665102a5cf03f748231a1a077de7054b5a8ccb0fbf36f61b1e7 languageName: node linkType: hard -"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:7.25.9" +"@motionone/generators@npm:^10.12.0": + version: 10.18.0 + resolution: "@motionone/generators@npm:10.18.0" dependencies: - "@babel/helper-plugin-utils": ^7.25.9 - "@babel/traverse": ^7.25.9 - peerDependencies: - "@babel/core": ^7.0.0 - checksum: c684593952ab1b40dfa4e64e98a07e7227c6db175c21bd0e6d71d2ad5d240fef4e4a984d56f05a494876542a022244fe1c1098f4116109fd90d06615e8a269b1 + "@motionone/types": ^10.17.1 + "@motionone/utils": ^10.18.0 + tslib: ^2.3.1 + checksum: 51a0e075681697b11d0771998cac8c76a745f00141502f81adb953896992b7f49478965e4afe696bc83361afaae8d2f1057d71c25b21035fe67258ff73764f1c languageName: node linkType: hard -"@babel/plugin-proposal-class-properties@npm:^7.0.0, @babel/plugin-proposal-class-properties@npm:^7.13.0, @babel/plugin-proposal-class-properties@npm:^7.16.0": - version: 7.18.6 - resolution: "@babel/plugin-proposal-class-properties@npm:7.18.6" - dependencies: - "@babel/helper-create-class-features-plugin": ^7.18.6 - "@babel/helper-plugin-utils": ^7.18.6 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 49a78a2773ec0db56e915d9797e44fd079ab8a9b2e1716e0df07c92532f2c65d76aeda9543883916b8e0ff13606afeffa67c5b93d05b607bc87653ad18a91422 +"@motionone/types@npm:^10.12.0, @motionone/types@npm:^10.17.1": + version: 10.17.1 + resolution: "@motionone/types@npm:10.17.1" + checksum: 3fa74db64e371e61a7f7669d7d541d11c9a8dd871032d59c69041e3b2e07a67ad2ed8767cb9273bac90eed4e1f76efc1f14c8673c2e9a288f6070ee0fef64a25 languageName: node linkType: hard -"@babel/plugin-proposal-decorators@npm:^7.12.9, @babel/plugin-proposal-decorators@npm:^7.16.4": - version: 7.25.9 - resolution: "@babel/plugin-proposal-decorators@npm:7.25.9" +"@motionone/utils@npm:^10.12.0, @motionone/utils@npm:^10.18.0": + version: 10.18.0 + resolution: "@motionone/utils@npm:10.18.0" dependencies: - "@babel/helper-create-class-features-plugin": ^7.25.9 - "@babel/helper-plugin-utils": ^7.25.9 - "@babel/plugin-syntax-decorators": ^7.25.9 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: ff598127818ac8e704009f1a9a207766ada5f84f6ca74e9de662cb6ce32bcb846c28fd52d6c5df9c55b4eac9a2a3492aa71fbd5cef0569a14b6f12003df22af2 + "@motionone/types": ^10.17.1 + hey-listen: ^1.0.8 + tslib: ^2.3.1 + checksum: a27f9afde693a0cbbbcb33962b12bbe40dd2cfa514b0732f3c7953c5ef4beed738e1e8172a2de89e3b9f74a253ef0a70d7f3efb730be97b77d7176a3ffacb67a languageName: node linkType: hard -"@babel/plugin-proposal-export-default-from@npm:^7.24.7": - version: 7.25.9 - resolution: "@babel/plugin-proposal-export-default-from@npm:7.25.9" +"@nodelib/fs.scandir@npm:2.1.5": + version: 2.1.5 + resolution: "@nodelib/fs.scandir@npm:2.1.5" dependencies: - "@babel/helper-plugin-utils": ^7.25.9 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 0fb96b1229ed15ecfb09e6bf40be2da249007155a3deca53d319420a4d3c028c884e888c447898cbcdaa079165e045a8317be6a9205bef0041e7333822a40da9 + "@nodelib/fs.stat": 2.0.5 + run-parallel: ^1.1.9 + checksum: a970d595bd23c66c880e0ef1817791432dbb7acbb8d44b7e7d0e7a22f4521260d4a83f7f9fd61d44fda4610105577f8f58a60718105fb38352baed612fd79e59 languageName: node linkType: hard -"@babel/plugin-proposal-export-namespace-from@npm:7.18.9": - version: 7.18.9 - resolution: "@babel/plugin-proposal-export-namespace-from@npm:7.18.9" - dependencies: - "@babel/helper-plugin-utils": ^7.18.9 - "@babel/plugin-syntax-export-namespace-from": ^7.8.3 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 84ff22bacc5d30918a849bfb7e0e90ae4c5b8d8b65f2ac881803d1cf9068dffbe53bd657b0e4bc4c20b4db301b1c85f1e74183cf29a0dd31e964bd4e97c363ef +"@nodelib/fs.stat@npm:2.0.5, @nodelib/fs.stat@npm:^2.0.2": + version: 2.0.5 + resolution: "@nodelib/fs.stat@npm:2.0.5" + checksum: 012480b5ca9d97bff9261571dbbec7bbc6033f69cc92908bc1ecfad0792361a5a1994bc48674b9ef76419d056a03efadfce5a6cf6dbc0a36559571a7a483f6f0 languageName: node linkType: hard -"@babel/plugin-proposal-logical-assignment-operators@npm:7.16.7": - version: 7.16.7 - resolution: "@babel/plugin-proposal-logical-assignment-operators@npm:7.16.7" +"@nodelib/fs.walk@npm:^1.2.3": + version: 1.2.8 + resolution: "@nodelib/fs.walk@npm:1.2.8" dependencies: - "@babel/helper-plugin-utils": ^7.16.7 - "@babel/plugin-syntax-logical-assignment-operators": ^7.10.4 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: c4cf18e10f900d40eaa471c4adce4805e67bd845f997a4b9d5653eced4e653187b9950843b2bf7eab6c0c3e753aba222b1d38888e3e14e013f87295c5b014f19 + "@nodelib/fs.scandir": 2.1.5 + fastq: ^1.6.0 + checksum: 190c643f156d8f8f277bf2a6078af1ffde1fd43f498f187c2db24d35b4b4b5785c02c7dc52e356497b9a1b65b13edc996de08de0b961c32844364da02986dc53 languageName: node linkType: hard -"@babel/plugin-proposal-nullish-coalescing-operator@npm:^7.13.8, @babel/plugin-proposal-nullish-coalescing-operator@npm:^7.16.0": - version: 7.18.6 - resolution: "@babel/plugin-proposal-nullish-coalescing-operator@npm:7.18.6" +"@octokit/auth-token@npm:^2.4.4": + version: 2.5.0 + resolution: "@octokit/auth-token@npm:2.5.0" dependencies: - "@babel/helper-plugin-utils": ^7.18.6 - "@babel/plugin-syntax-nullish-coalescing-operator": ^7.8.3 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 949c9ddcdecdaec766ee610ef98f965f928ccc0361dd87cf9f88cf4896a6ccd62fce063d4494778e50da99dea63d270a1be574a62d6ab81cbe9d85884bf55a7d + "@octokit/types": ^6.0.3 + checksum: 45949296c09abcd6beb4c3f69d45b0c1f265f9581d2a9683cf4d1800c4cf8259c2f58d58e44c16c20bffb85a0282a176c0d51f4af300e428b863f27b910e6297 languageName: node linkType: hard -"@babel/plugin-proposal-numeric-separator@npm:7.16.7": - version: 7.16.7 - resolution: "@babel/plugin-proposal-numeric-separator@npm:7.16.7" +"@octokit/core@npm:^3.5.1": + version: 3.6.0 + resolution: "@octokit/core@npm:3.6.0" dependencies: - "@babel/helper-plugin-utils": ^7.16.7 - "@babel/plugin-syntax-numeric-separator": ^7.10.4 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 8e2fb0b32845908c67f80bc637a0968e28a66727d7ffb22b9c801dc355d88e865dc24aec586b00c922c23833ae5d26301b443b53609ea73d8344733cd48a1eca + "@octokit/auth-token": ^2.4.4 + "@octokit/graphql": ^4.5.8 + "@octokit/request": ^5.6.3 + "@octokit/request-error": ^2.0.5 + "@octokit/types": ^6.0.3 + before-after-hook: ^2.2.0 + universal-user-agent: ^6.0.0 + checksum: f81160129037bd8555d47db60cd5381637b7e3602ad70735a7bdf8f3d250c7b7114a666bb12ef7a8746a326a5d72ed30a1b8f8a5a170007f7285c8e217bef1f0 languageName: node linkType: hard -"@babel/plugin-proposal-numeric-separator@npm:^7.16.0": - version: 7.18.6 - resolution: "@babel/plugin-proposal-numeric-separator@npm:7.18.6" +"@octokit/endpoint@npm:^6.0.1": + version: 6.0.12 + resolution: "@octokit/endpoint@npm:6.0.12" dependencies: - "@babel/helper-plugin-utils": ^7.18.6 - "@babel/plugin-syntax-numeric-separator": ^7.10.4 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: f370ea584c55bf4040e1f78c80b4eeb1ce2e6aaa74f87d1a48266493c33931d0b6222d8cee3a082383d6bb648ab8d6b7147a06f974d3296ef3bc39c7851683ec + "@octokit/types": ^6.0.3 + is-plain-object: ^5.0.0 + universal-user-agent: ^6.0.0 + checksum: b48b29940af11c4b9bca41cf56809754bb8385d4e3a6122671799d27f0238ba575b3fde86d2d30a84f4dbbc14430940de821e56ecc6a9a92d47fc2b29a31479d languageName: node linkType: hard -"@babel/plugin-proposal-object-rest-spread@npm:^7.0.0": - version: 7.20.7 - resolution: "@babel/plugin-proposal-object-rest-spread@npm:7.20.7" +"@octokit/graphql@npm:^4.5.8": + version: 4.8.0 + resolution: "@octokit/graphql@npm:4.8.0" dependencies: - "@babel/compat-data": ^7.20.5 - "@babel/helper-compilation-targets": ^7.20.7 - "@babel/helper-plugin-utils": ^7.20.2 - "@babel/plugin-syntax-object-rest-spread": ^7.8.3 - "@babel/plugin-transform-parameters": ^7.20.7 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 1329db17009964bc644484c660eab717cb3ca63ac0ab0f67c651a028d1bc2ead51dc4064caea283e46994f1b7221670a35cbc0b4beb6273f55e915494b5aa0b2 + "@octokit/request": ^5.6.0 + "@octokit/types": ^6.0.3 + universal-user-agent: ^6.0.0 + checksum: f68afe53f63900d4a16a0a733f2f500df2695b731f8ed32edb728d50edead7f5011437f71d069c2d2f6d656227703d0c832a3c8af58ecf82bd5dcc051f2d2d74 languageName: node linkType: hard -"@babel/plugin-proposal-optional-chaining@npm:^7.13.12, @babel/plugin-proposal-optional-chaining@npm:^7.16.0": - version: 7.21.0 - resolution: "@babel/plugin-proposal-optional-chaining@npm:7.21.0" - dependencies: - "@babel/helper-plugin-utils": ^7.20.2 - "@babel/helper-skip-transparent-expression-wrappers": ^7.20.0 - "@babel/plugin-syntax-optional-chaining": ^7.8.3 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 11c5449e01b18bb8881e8e005a577fa7be2fe5688e2382c8822d51f8f7005342a301a46af7b273b1f5645f9a7b894c428eee8526342038a275ef6ba4c8d8d746 +"@octokit/openapi-types@npm:^12.11.0": + version: 12.11.0 + resolution: "@octokit/openapi-types@npm:12.11.0" + checksum: 8a7d4bd6288cc4085cabe0ca9af2b87c875c303af932cb138aa1b2290eb69d32407759ac23707bb02776466e671244a902e9857896903443a69aff4b6b2b0e3b languageName: node linkType: hard -"@babel/plugin-proposal-private-methods@npm:^7.16.0": - version: 7.18.6 - resolution: "@babel/plugin-proposal-private-methods@npm:7.18.6" +"@octokit/plugin-paginate-rest@npm:^2.16.8": + version: 2.21.3 + resolution: "@octokit/plugin-paginate-rest@npm:2.21.3" dependencies: - "@babel/helper-create-class-features-plugin": ^7.18.6 - "@babel/helper-plugin-utils": ^7.18.6 + "@octokit/types": ^6.40.0 peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 22d8502ee96bca99ad2c8393e8493e2b8d4507576dd054490fd8201a36824373440106f5b098b6d821b026c7e72b0424ff4aeca69ed5f42e48f029d3a156d5ad + "@octokit/core": ">=2" + checksum: acf31de2ba4021bceec7ff49c5b0e25309fc3c009d407f153f928ddf436ab66cd4217344138378d5523f5fb233896e1db58c9c7b3ffd9612a66d760bc5d319ed languageName: node linkType: hard -"@babel/plugin-proposal-private-property-in-object@npm:7.21.0-placeholder-for-preset-env.2": - version: 7.21.0-placeholder-for-preset-env.2 - resolution: "@babel/plugin-proposal-private-property-in-object@npm:7.21.0-placeholder-for-preset-env.2" +"@octokit/plugin-request-log@npm:^1.0.4": + version: 1.0.4 + resolution: "@octokit/plugin-request-log@npm:1.0.4" peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: d97745d098b835d55033ff3a7fb2b895b9c5295b08a5759e4f20df325aa385a3e0bc9bd5ad8f2ec554a44d4e6525acfc257b8c5848a1345cb40f26a30e277e91 + "@octokit/core": ">=3" + checksum: 2086db00056aee0f8ebd79797b5b57149ae1014e757ea08985b71eec8c3d85dbb54533f4fd34b6b9ecaa760904ae6a7536be27d71e50a3782ab47809094bfc0c languageName: node linkType: hard -"@babel/plugin-proposal-private-property-in-object@npm:^7.16.0": - version: 7.21.11 - resolution: "@babel/plugin-proposal-private-property-in-object@npm:7.21.11" +"@octokit/plugin-rest-endpoint-methods@npm:^5.12.0": + version: 5.16.2 + resolution: "@octokit/plugin-rest-endpoint-methods@npm:5.16.2" dependencies: - "@babel/helper-annotate-as-pure": ^7.18.6 - "@babel/helper-create-class-features-plugin": ^7.21.0 - "@babel/helper-plugin-utils": ^7.20.2 - "@babel/plugin-syntax-private-property-in-object": ^7.14.5 + "@octokit/types": ^6.39.0 + deprecation: ^2.3.1 peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 1b880543bc5f525b360b53d97dd30807302bb82615cd42bf931968f59003cac75629563d6b104868db50abd22235b3271fdf679fea5db59a267181a99cc0c265 + "@octokit/core": ">=3" + checksum: 30fcc50c335d1093f03573d9fa3a4b7d027fc98b215c43e07e82ee8dabfa0af0cf1b963feb542312ae32d897a2f68dc671577206f30850215517bebedc5a2c73 languageName: node linkType: hard -"@babel/plugin-syntax-async-generators@npm:^7.8.4": - version: 7.8.4 - resolution: "@babel/plugin-syntax-async-generators@npm:7.8.4" +"@octokit/request-error@npm:^2.0.5, @octokit/request-error@npm:^2.1.0": + version: 2.1.0 + resolution: "@octokit/request-error@npm:2.1.0" dependencies: - "@babel/helper-plugin-utils": ^7.8.0 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 7ed1c1d9b9e5b64ef028ea5e755c0be2d4e5e4e3d6cf7df757b9a8c4cfa4193d268176d0f1f7fbecdda6fe722885c7fda681f480f3741d8a2d26854736f05367 + "@octokit/types": ^6.0.3 + deprecation: ^2.0.0 + once: ^1.4.0 + checksum: baec2b5700498be01b4d958f9472cb776b3f3b0ea52924323a07e7a88572e24cac2cdf7eb04a0614031ba346043558b47bea2d346e98f0e8385b4261f138ef18 languageName: node linkType: hard -"@babel/plugin-syntax-bigint@npm:^7.8.3": - version: 7.8.3 - resolution: "@babel/plugin-syntax-bigint@npm:7.8.3" +"@octokit/request@npm:^5.6.0, @octokit/request@npm:^5.6.3": + version: 5.6.3 + resolution: "@octokit/request@npm:5.6.3" dependencies: - "@babel/helper-plugin-utils": ^7.8.0 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 3a10849d83e47aec50f367a9e56a6b22d662ddce643334b087f9828f4c3dd73bdc5909aaeabe123fed78515767f9ca43498a0e621c438d1cd2802d7fae3c9648 + "@octokit/endpoint": ^6.0.1 + "@octokit/request-error": ^2.1.0 + "@octokit/types": ^6.16.1 + is-plain-object: ^5.0.0 + node-fetch: ^2.6.7 + universal-user-agent: ^6.0.0 + checksum: c0b4542eb4baaf880d673c758d3e0b5c4a625a4ae30abf40df5548b35f1ff540edaac74625192b1aff42a79ac661e774da4ab7d5505f1cb4ef81239b1e8510c5 languageName: node linkType: hard -"@babel/plugin-syntax-class-properties@npm:^7.0.0, @babel/plugin-syntax-class-properties@npm:^7.8.3": - version: 7.12.13 - resolution: "@babel/plugin-syntax-class-properties@npm:7.12.13" +"@octokit/rest@npm:^16.43.0 || ^17.11.0 || ^18.12.0, @octokit/rest@npm:^18.12.0": + version: 18.12.0 + resolution: "@octokit/rest@npm:18.12.0" dependencies: - "@babel/helper-plugin-utils": ^7.12.13 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 24f34b196d6342f28d4bad303612d7ff566ab0a013ce89e775d98d6f832969462e7235f3e7eaf17678a533d4be0ba45d3ae34ab4e5a9dcbda5d98d49e5efa2fc + "@octokit/core": ^3.5.1 + "@octokit/plugin-paginate-rest": ^2.16.8 + "@octokit/plugin-request-log": ^1.0.4 + "@octokit/plugin-rest-endpoint-methods": ^5.12.0 + checksum: c18bd6676a60b66819b016b0f969fcd04d8dfa04d01b7af9af9a7410ff028c621c995185e29454c23c47906da506c1e01620711259989a964ebbfd9106f5b715 languageName: node linkType: hard -"@babel/plugin-syntax-decorators@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-syntax-decorators@npm:7.25.9" +"@octokit/types@npm:^6.0.3, @octokit/types@npm:^6.16.1, @octokit/types@npm:^6.39.0, @octokit/types@npm:^6.40.0": + version: 6.41.0 + resolution: "@octokit/types@npm:6.41.0" dependencies: - "@babel/helper-plugin-utils": ^7.25.9 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: aaf58b17e6aa08f41f93897daa93c601a486233a0375b4231799fc5c4e7c98480aaad3c1c44cf391a62e428c5f6546f76488a1023a4036bb87cd61fa79f1173b + "@octokit/openapi-types": ^12.11.0 + checksum: fd6f75e0b19b90d1a3d244d2b0c323ed8f2f05e474a281f60a321986683548ef2e0ec2b3a946aa9405d6092e055344455f69f58957c60f58368c8bdda5b7d2ab languageName: node linkType: hard -"@babel/plugin-syntax-dynamic-import@npm:^7.8.3": - version: 7.8.3 - resolution: "@babel/plugin-syntax-dynamic-import@npm:7.8.3" - dependencies: - "@babel/helper-plugin-utils": ^7.8.0 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: ce307af83cf433d4ec42932329fad25fa73138ab39c7436882ea28742e1c0066626d224e0ad2988724c82644e41601cef607b36194f695cb78a1fcdc959637bd +"@sindresorhus/is@npm:^0.14.0": + version: 0.14.0 + resolution: "@sindresorhus/is@npm:0.14.0" + checksum: 971e0441dd44ba3909b467219a5e242da0fc584048db5324cfb8048148fa8dcc9d44d71e3948972c4f6121d24e5da402ef191420d1266a95f713bb6d6e59c98a languageName: node linkType: hard -"@babel/plugin-syntax-export-default-from@npm:^7.24.7": - version: 7.25.9 - resolution: "@babel/plugin-syntax-export-default-from@npm:7.25.9" - dependencies: - "@babel/helper-plugin-utils": ^7.25.9 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 8eb254c8050369f3cfac7755230ad9d39a53d1b489e03170684d6b514a0d09ad6001c38e6dfd271a439a8035a57d60b8be7d3dd80f997c6bc5c7e688ed529517 +"@sindresorhus/is@npm:^4.0.0": + version: 4.6.0 + resolution: "@sindresorhus/is@npm:4.6.0" + checksum: 83839f13da2c29d55c97abc3bc2c55b250d33a0447554997a85c539e058e57b8da092da396e252b11ec24a0279a0bed1f537fa26302209327060643e327f81d2 languageName: node linkType: hard -"@babel/plugin-syntax-export-namespace-from@npm:^7.8.3": - version: 7.8.3 - resolution: "@babel/plugin-syntax-export-namespace-from@npm:7.8.3" +"@szmarczak/http-timer@npm:^1.1.2": + version: 1.1.2 + resolution: "@szmarczak/http-timer@npm:1.1.2" dependencies: - "@babel/helper-plugin-utils": ^7.8.3 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 85740478be5b0de185228e7814451d74ab8ce0a26fcca7613955262a26e99e8e15e9da58f60c754b84515d4c679b590dbd3f2148f0f58025f4ae706f1c5a5d4a + defer-to-connect: ^1.0.1 + checksum: 4d9158061c5f397c57b4988cde33a163244e4f02df16364f103971957a32886beb104d6180902cbe8b38cb940e234d9f98a4e486200deca621923f62f50a06fe languageName: node linkType: hard -"@babel/plugin-syntax-flow@npm:^7.0.0, @babel/plugin-syntax-flow@npm:^7.12.1, @babel/plugin-syntax-flow@npm:^7.26.0": - version: 7.26.0 - resolution: "@babel/plugin-syntax-flow@npm:7.26.0" +"@szmarczak/http-timer@npm:^4.0.5": + version: 4.0.6 + resolution: "@szmarczak/http-timer@npm:4.0.6" dependencies: - "@babel/helper-plugin-utils": ^7.25.9 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: fdc0d0a7b512e00d933e12cf93c785ea4645a193f4b539230b7601cfaa8c704410199318ce9ea14e5fca7d13e9027822f7d81a7871d3e854df26b6af04cc3c6c + defer-to-connect: ^2.0.0 + checksum: c29df3bcec6fc3bdec2b17981d89d9c9fc9bd7d0c9bcfe92821dc533f4440bc890ccde79971838b4ceed1921d456973c4180d7175ee1d0023ad0562240a58d95 languageName: node linkType: hard -"@babel/plugin-syntax-import-assertions@npm:^7.20.0, @babel/plugin-syntax-import-assertions@npm:^7.26.0": - version: 7.26.0 - resolution: "@babel/plugin-syntax-import-assertions@npm:7.26.0" - dependencies: - "@babel/helper-plugin-utils": ^7.25.9 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: b58f2306df4a690ca90b763d832ec05202c50af787158ff8b50cdf3354359710bce2e1eb2b5135fcabf284756ac8eadf09ca74764aa7e76d12a5cac5f6b21e67 +"@tootallnate/once@npm:2": + version: 2.0.0 + resolution: "@tootallnate/once@npm:2.0.0" + checksum: ad87447820dd3f24825d2d947ebc03072b20a42bfc96cbafec16bff8bbda6c1a81fcb0be56d5b21968560c5359a0af4038a68ba150c3e1694fe4c109a063bed8 languageName: node linkType: hard -"@babel/plugin-syntax-import-attributes@npm:^7.26.0": - version: 7.26.0 - resolution: "@babel/plugin-syntax-import-attributes@npm:7.26.0" - dependencies: - "@babel/helper-plugin-utils": ^7.25.9 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: c122aa577166c80ee67f75aebebeef4150a132c4d3109d25d7fc058bf802946f883e330f20b78c1d3e3a5ada631c8780c263d2d01b5dbaecc69efefeedd42916 +"@tsconfig/node10@npm:^1.0.7": + version: 1.0.9 + resolution: "@tsconfig/node10@npm:1.0.9" + checksum: a33ae4dc2a621c0678ac8ac4bceb8e512ae75dac65417a2ad9b022d9b5411e863c4c198b6ba9ef659e14b9fb609bbec680841a2e84c1172df7a5ffcf076539df languageName: node linkType: hard -"@babel/plugin-syntax-import-meta@npm:^7.8.3": - version: 7.10.4 - resolution: "@babel/plugin-syntax-import-meta@npm:7.10.4" - dependencies: - "@babel/helper-plugin-utils": ^7.10.4 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 166ac1125d10b9c0c430e4156249a13858c0366d38844883d75d27389621ebe651115cb2ceb6dc011534d5055719fa1727b59f39e1ab3ca97820eef3dcab5b9b +"@tsconfig/node12@npm:^1.0.7": + version: 1.0.11 + resolution: "@tsconfig/node12@npm:1.0.11" + checksum: 5ce29a41b13e7897a58b8e2df11269c5395999e588b9a467386f99d1d26f6c77d1af2719e407621412520ea30517d718d5192a32403b8dfcc163bf33e40a338a languageName: node linkType: hard -"@babel/plugin-syntax-json-strings@npm:^7.8.3": - version: 7.8.3 - resolution: "@babel/plugin-syntax-json-strings@npm:7.8.3" - dependencies: - "@babel/helper-plugin-utils": ^7.8.0 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: bf5aea1f3188c9a507e16efe030efb996853ca3cadd6512c51db7233cc58f3ac89ff8c6bdfb01d30843b161cfe7d321e1bf28da82f7ab8d7e6bc5464666f354a +"@tsconfig/node14@npm:^1.0.0": + version: 1.0.3 + resolution: "@tsconfig/node14@npm:1.0.3" + checksum: 19275fe80c4c8d0ad0abed6a96dbf00642e88b220b090418609c4376e1cef81bf16237bf170ad1b341452feddb8115d8dd2e5acdfdea1b27422071163dc9ba9d languageName: node linkType: hard -"@babel/plugin-syntax-jsx@npm:^7.0.0, @babel/plugin-syntax-jsx@npm:^7.22.5, @babel/plugin-syntax-jsx@npm:^7.25.9, @babel/plugin-syntax-jsx@npm:^7.7.2": - version: 7.25.9 - resolution: "@babel/plugin-syntax-jsx@npm:7.25.9" - dependencies: - "@babel/helper-plugin-utils": ^7.25.9 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: bb609d1ffb50b58f0c1bac8810d0e46a4f6c922aa171c458f3a19d66ee545d36e782d3bffbbc1fed0dc65a558bdce1caf5279316583c0fff5a2c1658982a8563 +"@tsconfig/node16@npm:^1.0.2": + version: 1.0.3 + resolution: "@tsconfig/node16@npm:1.0.3" + checksum: 3a8b657dd047495b7ad23437d6afd20297ce90380ff0bdee93fc7d39a900dbd8d9e26e53ff6b465e7967ce2adf0b218782590ce9013285121e6a5928fbd6819f languageName: node linkType: hard -"@babel/plugin-syntax-logical-assignment-operators@npm:^7.10.4, @babel/plugin-syntax-logical-assignment-operators@npm:^7.8.3": - version: 7.10.4 - resolution: "@babel/plugin-syntax-logical-assignment-operators@npm:7.10.4" +"@types/cacheable-request@npm:^6.0.1": + version: 6.0.3 + resolution: "@types/cacheable-request@npm:6.0.3" dependencies: - "@babel/helper-plugin-utils": ^7.10.4 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: aff33577037e34e515911255cdbb1fd39efee33658aa00b8a5fd3a4b903585112d037cce1cc9e4632f0487dc554486106b79ccd5ea63a2e00df4363f6d4ff886 + "@types/http-cache-semantics": "*" + "@types/keyv": ^3.1.4 + "@types/node": "*" + "@types/responselike": ^1.0.0 + checksum: d9b26403fe65ce6b0cb3720b7030104c352bcb37e4fac2a7089a25a97de59c355fa08940658751f2f347a8512aa9d18fdb66ab3ade835975b2f454f2d5befbd9 languageName: node linkType: hard -"@babel/plugin-syntax-nullish-coalescing-operator@npm:^7.8.3": - version: 7.8.3 - resolution: "@babel/plugin-syntax-nullish-coalescing-operator@npm:7.8.3" - dependencies: - "@babel/helper-plugin-utils": ^7.8.0 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 87aca4918916020d1fedba54c0e232de408df2644a425d153be368313fdde40d96088feed6c4e5ab72aac89be5d07fef2ddf329a15109c5eb65df006bf2580d1 +"@types/http-cache-semantics@npm:*": + version: 4.0.1 + resolution: "@types/http-cache-semantics@npm:4.0.1" + checksum: 1048aacf627829f0d5f00184e16548205cd9f964bf0841c29b36bc504509230c40bc57c39778703a1c965a6f5b416ae2cbf4c1d4589c889d2838dd9dbfccf6e9 languageName: node linkType: hard -"@babel/plugin-syntax-numeric-separator@npm:^7.10.4, @babel/plugin-syntax-numeric-separator@npm:^7.8.3": - version: 7.10.4 - resolution: "@babel/plugin-syntax-numeric-separator@npm:7.10.4" +"@types/keyv@npm:^3.1.1, @types/keyv@npm:^3.1.4": + version: 3.1.4 + resolution: "@types/keyv@npm:3.1.4" dependencies: - "@babel/helper-plugin-utils": ^7.10.4 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 01ec5547bd0497f76cc903ff4d6b02abc8c05f301c88d2622b6d834e33a5651aa7c7a3d80d8d57656a4588f7276eba357f6b7e006482f5b564b7a6488de493a1 + "@types/node": "*" + checksum: e009a2bfb50e90ca9b7c6e8f648f8464067271fd99116f881073fa6fa76dc8d0133181dd65e6614d5fb1220d671d67b0124aef7d97dc02d7e342ab143a47779d languageName: node linkType: hard -"@babel/plugin-syntax-object-rest-spread@npm:^7.0.0, @babel/plugin-syntax-object-rest-spread@npm:^7.8.3": - version: 7.8.3 - resolution: "@babel/plugin-syntax-object-rest-spread@npm:7.8.3" - dependencies: - "@babel/helper-plugin-utils": ^7.8.0 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: fddcf581a57f77e80eb6b981b10658421bc321ba5f0a5b754118c6a92a5448f12a0c336f77b8abf734841e102e5126d69110a306eadb03ca3e1547cab31f5cbf +"@types/minimatch@npm:^3.0.3": + version: 3.0.5 + resolution: "@types/minimatch@npm:3.0.5" + checksum: c41d136f67231c3131cf1d4ca0b06687f4a322918a3a5adddc87ce90ed9dbd175a3610adee36b106ae68c0b92c637c35e02b58c8a56c424f71d30993ea220b92 languageName: node linkType: hard -"@babel/plugin-syntax-optional-catch-binding@npm:^7.8.3": - version: 7.8.3 - resolution: "@babel/plugin-syntax-optional-catch-binding@npm:7.8.3" - dependencies: - "@babel/helper-plugin-utils": ^7.8.0 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 910d90e72bc90ea1ce698e89c1027fed8845212d5ab588e35ef91f13b93143845f94e2539d831dc8d8ededc14ec02f04f7bd6a8179edd43a326c784e7ed7f0b9 +"@types/minimist@npm:^1.2.0": + version: 1.2.2 + resolution: "@types/minimist@npm:1.2.2" + checksum: b8da83c66eb4aac0440e64674b19564d9d86c80ae273144db9681e5eeff66f238ade9515f5006ffbfa955ceff8b89ad2bd8ec577d7caee74ba101431fb07045d languageName: node linkType: hard -"@babel/plugin-syntax-optional-chaining@npm:^7.8.3": - version: 7.8.3 - resolution: "@babel/plugin-syntax-optional-chaining@npm:7.8.3" +"@types/node@npm:*": + version: 22.10.7 + resolution: "@types/node@npm:22.10.7" dependencies: - "@babel/helper-plugin-utils": ^7.8.0 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: eef94d53a1453361553c1f98b68d17782861a04a392840341bc91780838dd4e695209c783631cf0de14c635758beafb6a3a65399846ffa4386bff90639347f30 + undici-types: ~6.20.0 + checksum: 2dce6c75c607c6269744f1ea2b5296e8685cd71d0dd5c599c3029626f9d2dc8b037912495cf68b30d6f39f44d3fa8b025e179662ef16dc363e0658425bedfde8 languageName: node linkType: hard -"@babel/plugin-syntax-private-property-in-object@npm:^7.14.5": - version: 7.14.5 - resolution: "@babel/plugin-syntax-private-property-in-object@npm:7.14.5" - dependencies: - "@babel/helper-plugin-utils": ^7.14.5 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: b317174783e6e96029b743ccff2a67d63d38756876e7e5d0ba53a322e38d9ca452c13354a57de1ad476b4c066dbae699e0ca157441da611117a47af88985ecda +"@types/node@npm:^12.7.1": + version: 12.20.55 + resolution: "@types/node@npm:12.20.55" + checksum: e4f86785f4092706e0d3b0edff8dca5a13b45627e4b36700acd8dfe6ad53db71928c8dee914d4276c7fd3b6ccd829aa919811c9eb708a2c8e4c6eb3701178c37 languageName: node linkType: hard -"@babel/plugin-syntax-top-level-await@npm:^7.8.3": - version: 7.14.5 - resolution: "@babel/plugin-syntax-top-level-await@npm:7.14.5" - dependencies: - "@babel/helper-plugin-utils": ^7.14.5 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: bbd1a56b095be7820029b209677b194db9b1d26691fe999856462e66b25b281f031f3dfd91b1619e9dcf95bebe336211833b854d0fb8780d618e35667c2d0d7e +"@types/normalize-package-data@npm:^2.4.0": + version: 2.4.1 + resolution: "@types/normalize-package-data@npm:2.4.1" + checksum: e87bccbf11f95035c89a132b52b79ce69a1e3652fe55962363063c9c0dae0fe2477ebc585e03a9652adc6f381d24ba5589cc5e51849df4ced3d3e004a7d40ed5 languageName: node linkType: hard -"@babel/plugin-syntax-typescript@npm:^7.20.0, @babel/plugin-syntax-typescript@npm:^7.25.9, @babel/plugin-syntax-typescript@npm:^7.7.2": - version: 7.25.9 - resolution: "@babel/plugin-syntax-typescript@npm:7.25.9" - dependencies: - "@babel/helper-plugin-utils": ^7.25.9 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 0e9821e8ba7d660c36c919654e4144a70546942ae184e85b8102f2322451eae102cbfadbcadd52ce077a2b44b400ee52394c616feab7b5b9f791b910e933fd33 +"@types/parse-json@npm:^4.0.0": + version: 4.0.0 + resolution: "@types/parse-json@npm:4.0.0" + checksum: fd6bce2b674b6efc3db4c7c3d336bd70c90838e8439de639b909ce22f3720d21344f52427f1d9e57b265fcb7f6c018699b99e5e0c208a1a4823014269a6bf35b languageName: node linkType: hard -"@babel/plugin-syntax-unicode-sets-regex@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-syntax-unicode-sets-regex@npm:7.18.6" +"@types/responselike@npm:^1.0.0": + version: 1.0.0 + resolution: "@types/responselike@npm:1.0.0" dependencies: - "@babel/helper-create-regexp-features-plugin": ^7.18.6 - "@babel/helper-plugin-utils": ^7.18.6 - peerDependencies: - "@babel/core": ^7.0.0 - checksum: a651d700fe63ff0ddfd7186f4ebc24447ca734f114433139e3c027bc94a900d013cf1ef2e2db8430425ba542e39ae160c3b05f06b59fd4656273a3df97679e9c + "@types/node": "*" + checksum: e99fc7cc6265407987b30deda54c1c24bb1478803faf6037557a774b2f034c5b097ffd65847daa87e82a61a250d919f35c3588654b0fdaa816906650f596d1b0 languageName: node linkType: hard -"@babel/plugin-transform-arrow-functions@npm:^7.0.0, @babel/plugin-transform-arrow-functions@npm:^7.0.0-0, @babel/plugin-transform-arrow-functions@npm:^7.24.7, @babel/plugin-transform-arrow-functions@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-arrow-functions@npm:7.25.9" - dependencies: - "@babel/helper-plugin-utils": ^7.25.9 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: c29f081224859483accf55fb4d091db2aac0dcd0d7954bac5ca889030cc498d3f771aa20eb2e9cd8310084ec394d85fa084b97faf09298b6bc9541182b3eb5bb +"@types/semver@npm:^6.0.1": + version: 6.2.3 + resolution: "@types/semver@npm:6.2.3" + checksum: 83c86d7005b229df9c4c0d6d13825b839a01932895504596140aea19e2b88f63ac27ab1575347451b50eedb63f72309e845ce1a0ca78360c4f719bbb38371594 languageName: node linkType: hard -"@babel/plugin-transform-async-generator-functions@npm:^7.25.4, @babel/plugin-transform-async-generator-functions@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-async-generator-functions@npm:7.25.9" - dependencies: - "@babel/helper-plugin-utils": ^7.25.9 - "@babel/helper-remap-async-to-generator": ^7.25.9 - "@babel/traverse": ^7.25.9 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 41e02c18c2a57de9f274fa2c5a1bf81a20ab5f321db29cc3051512b9c5bdf3f1a8c42f1fc282cb62343c6d50849f992eede954d5f7fb5e7df48ae0c59ea7e054 +"@types/symlink-or-copy@npm:^1.2.0": + version: 1.2.0 + resolution: "@types/symlink-or-copy@npm:1.2.0" + checksum: 18fb73094b2cf6c84544939bd6344d7a8cd1ccf8496a1cfb1320f38491c8dfbea3248bb6e91495322a51a493e04a767582a214d5261f5c5b007aa6ef65fc8b50 languageName: node linkType: hard -"@babel/plugin-transform-async-to-generator@npm:^7.24.7, @babel/plugin-transform-async-to-generator@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-async-to-generator@npm:7.25.9" +"@vue/compiler-core@npm:3.3.13": + version: 3.3.13 + resolution: "@vue/compiler-core@npm:3.3.13" dependencies: - "@babel/helper-module-imports": ^7.25.9 - "@babel/helper-plugin-utils": ^7.25.9 - "@babel/helper-remap-async-to-generator": ^7.25.9 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: b3ad50fb93c171644d501864620ed23952a46648c4df10dc9c62cc9ad08031b66bd272cfdd708faeee07c23b6251b16f29ce0350473e4c79f0c32178d38ce3a6 + "@babel/parser": ^7.23.5 + "@vue/shared": 3.3.13 + estree-walker: ^2.0.2 + source-map-js: ^1.0.2 + checksum: e758146d7805199b60166a3bc8f6f8a4fa8bedf814f5c33a77776fc46585e14f36c11c2f96fa54c8b895e3115716db613c557e705ccadd306c424a7d39585bf8 languageName: node linkType: hard -"@babel/plugin-transform-block-scoped-functions@npm:^7.0.0, @babel/plugin-transform-block-scoped-functions@npm:^7.25.9": - version: 7.26.5 - resolution: "@babel/plugin-transform-block-scoped-functions@npm:7.26.5" +"@vue/compiler-dom@npm:3.3.13": + version: 3.3.13 + resolution: "@vue/compiler-dom@npm:3.3.13" dependencies: - "@babel/helper-plugin-utils": ^7.26.5 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: f2046c09bf8e588bfb1a6342d0eee733189102cf663ade27adb0130f3865123af5816b40a55ec8d8fa09271b54dfdaf977cd2f8e0b3dc97f18e690188d5a2174 + "@vue/compiler-core": 3.3.13 + "@vue/shared": 3.3.13 + checksum: 8165ae90d827ba7b0d89382bc404fc52edf40c2fa8f4a54fb4bdd4ed730f33283ccf359795823f6a3c2f31d538a10b828f38dd32d512ebdcc329ebd78ad7a325 languageName: node linkType: hard -"@babel/plugin-transform-block-scoping@npm:^7.0.0, @babel/plugin-transform-block-scoping@npm:^7.25.0, @babel/plugin-transform-block-scoping@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-block-scoping@npm:7.25.9" +"@vue/compiler-sfc@npm:^3.3.4": + version: 3.3.13 + resolution: "@vue/compiler-sfc@npm:3.3.13" dependencies: - "@babel/helper-plugin-utils": ^7.25.9 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: e869500cfb1995e06e64c9608543b56468639809febfcdd6fcf683bc0bf1be2431cacf2981a168a1a14f4766393e37bc9f7c96d25bc5b5f39a64a8a8ad0bf8e0 + "@babel/parser": ^7.23.5 + "@vue/compiler-core": 3.3.13 + "@vue/compiler-dom": 3.3.13 + "@vue/compiler-ssr": 3.3.13 + "@vue/reactivity-transform": 3.3.13 + "@vue/shared": 3.3.13 + estree-walker: ^2.0.2 + magic-string: ^0.30.5 + postcss: ^8.4.32 + source-map-js: ^1.0.2 + checksum: f78a9a01472a8effed49f524729c762588e38bcaed50a677e099fe1ddc66e3a9fb56a2f1f85020010a44e385e9ef01872d41b540eded28a52c054b887b77b488 languageName: node linkType: hard -"@babel/plugin-transform-class-properties@npm:^7.0.0-0, @babel/plugin-transform-class-properties@npm:^7.25.4, @babel/plugin-transform-class-properties@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-class-properties@npm:7.25.9" +"@vue/compiler-ssr@npm:3.3.13": + version: 3.3.13 + resolution: "@vue/compiler-ssr@npm:3.3.13" dependencies: - "@babel/helper-create-class-features-plugin": ^7.25.9 - "@babel/helper-plugin-utils": ^7.25.9 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: a8d69e2c285486b63f49193cbcf7a15e1d3a5f632c1c07d7a97f65306df7f554b30270b7378dde143f8b557d1f8f6336c643377943dec8ec405e4cd11e90b9ea + "@vue/compiler-dom": 3.3.13 + "@vue/shared": 3.3.13 + checksum: 02f3999467a6290af8a77c112462b23faf34399e55f7ef51b0b9985d75363a1ffcfb915201cb8a5890d50ede75af52356e32d9b950f1be16532842e670fd6b60 languageName: node linkType: hard -"@babel/plugin-transform-class-static-block@npm:^7.26.0": - version: 7.26.0 - resolution: "@babel/plugin-transform-class-static-block@npm:7.26.0" +"@vue/reactivity-transform@npm:3.3.13": + version: 3.3.13 + resolution: "@vue/reactivity-transform@npm:3.3.13" dependencies: - "@babel/helper-create-class-features-plugin": ^7.25.9 - "@babel/helper-plugin-utils": ^7.25.9 - peerDependencies: - "@babel/core": ^7.12.0 - checksum: d779d4d3a6f8d363f67fcbd928c15baa72be8d3b86c6d05e0300b50e66e2c4be9e99398b803d13064bc79d90ae36e37a505e3dc8af11904459804dec07660246 + "@babel/parser": ^7.23.5 + "@vue/compiler-core": 3.3.13 + "@vue/shared": 3.3.13 + estree-walker: ^2.0.2 + magic-string: ^0.30.5 + checksum: 6abe723dd33302635377acffd9a29121e48dea3dba720eefb26481fc78bfd5e4070674a5871c72c27905a4e01b3e8c27b73060c828a27f1e623ce2913f9a3af3 languageName: node linkType: hard -"@babel/plugin-transform-classes@npm:^7.0.0, @babel/plugin-transform-classes@npm:^7.0.0-0, @babel/plugin-transform-classes@npm:^7.25.4, @babel/plugin-transform-classes@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-classes@npm:7.25.9" - dependencies: - "@babel/helper-annotate-as-pure": ^7.25.9 - "@babel/helper-compilation-targets": ^7.25.9 - "@babel/helper-plugin-utils": ^7.25.9 - "@babel/helper-replace-supers": ^7.25.9 - "@babel/traverse": ^7.25.9 - globals: ^11.1.0 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: d12584f72125314cc0fa8c77586ece2888d677788ac75f7393f5da574dfe4e45a556f7e3488fab29c8777ab3e5856d7a2d79f6df02834083aaa9d766440e3c68 +"@vue/shared@npm:3.3.13": + version: 3.3.13 + resolution: "@vue/shared@npm:3.3.13" + checksum: 3f57cd2f4611962aa1a4e9a5926f160f200f1769015240ad02df0245fe25bd2303b88957f35a13fbb0bf8d3e5a649fd41f44f347a0cf29e84e8f41d70123f7bf languageName: node linkType: hard -"@babel/plugin-transform-computed-properties@npm:^7.0.0, @babel/plugin-transform-computed-properties@npm:^7.24.7, @babel/plugin-transform-computed-properties@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-computed-properties@npm:7.25.9" +"JSONStream@npm:^1.0.4": + version: 1.3.5 + resolution: "JSONStream@npm:1.3.5" dependencies: - "@babel/helper-plugin-utils": ^7.25.9 - "@babel/template": ^7.25.9 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: f77fa4bc0c1e0031068172df28852388db6b0f91c268d037905f459607cf1e8ebab00015f9f179f4ad96e11c5f381b635cd5dc4e147a48c7ac79d195ae7542de + jsonparse: ^1.2.0 + through: ">=2.2.7 <3" + bin: + JSONStream: ./bin.js + checksum: 2605fa124260c61bad38bb65eba30d2f72216a78e94d0ab19b11b4e0327d572b8d530c0c9cc3b0764f727ad26d39e00bf7ebad57781ca6368394d73169c59e46 languageName: node linkType: hard -"@babel/plugin-transform-destructuring@npm:^7.0.0, @babel/plugin-transform-destructuring@npm:^7.24.8, @babel/plugin-transform-destructuring@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-destructuring@npm:7.25.9" - dependencies: - "@babel/helper-plugin-utils": ^7.25.9 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 965f63077a904828f4adee91393f83644098533442b8217d5a135c23a759a4c252c714074c965676a60d2c33f610f579a4eeb59ffd783724393af61c0ca45fef +"acorn-walk@npm:^8.1.1": + version: 8.3.2 + resolution: "acorn-walk@npm:8.3.2" + checksum: 3626b9d26a37b1b427796feaa5261faf712307a8920392c8dce9a5739fb31077667f4ad2ec71c7ac6aaf9f61f04a9d3d67ff56f459587206fc04aa31c27ef392 languageName: node linkType: hard -"@babel/plugin-transform-dotall-regex@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-dotall-regex@npm:7.25.9" - dependencies: - "@babel/helper-create-regexp-features-plugin": ^7.25.9 - "@babel/helper-plugin-utils": ^7.25.9 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 8bdf1bb9e6e3a2cc8154ae88a3872faa6dc346d6901994505fb43ac85f858728781f1219f40b67f7bb0687c507450236cb7838ac68d457e65637f98500aa161b +"acorn@npm:^8.4.1": + version: 8.14.0 + resolution: "acorn@npm:8.14.0" + bin: + acorn: bin/acorn + checksum: 8755074ba55fff94e84e81c72f1013c2d9c78e973c31231c8ae505a5f966859baf654bddd75046bffd73ce816b149298977fff5077a3033dedba0ae2aad152d4 languageName: node linkType: hard -"@babel/plugin-transform-duplicate-keys@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-duplicate-keys@npm:7.25.9" +"agent-base@npm:6": + version: 6.0.2 + resolution: "agent-base@npm:6.0.2" dependencies: - "@babel/helper-plugin-utils": ^7.25.9 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: b553eebc328797ead6be5ba5bdaf2f1222cea8a5bd33fb4ed625975d4f9b510bfb0d688d97e314cd4b4a48b279bea7b3634ad68c1b41ee143c3082db0ae74037 + debug: 4 + checksum: f52b6872cc96fd5f622071b71ef200e01c7c4c454ee68bc9accca90c98cfb39f2810e3e9aa330435835eedc8c23f4f8a15267f67c6e245d2b33757575bdac49d languageName: node linkType: hard -"@babel/plugin-transform-duplicate-named-capturing-groups-regex@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-duplicate-named-capturing-groups-regex@npm:7.25.9" +"ajv@npm:^8.11.0": + version: 8.17.1 + resolution: "ajv@npm:8.17.1" dependencies: - "@babel/helper-create-regexp-features-plugin": ^7.25.9 - "@babel/helper-plugin-utils": ^7.25.9 - peerDependencies: - "@babel/core": ^7.0.0 - checksum: f7233cf596be8c6843d31951afaf2464a62a610cb89c72c818c044765827fab78403ab8a7d3a6386f838c8df574668e2a48f6c206b1d7da965aff9c6886cb8e6 + fast-deep-equal: ^3.1.3 + fast-uri: ^3.0.1 + json-schema-traverse: ^1.0.0 + require-from-string: ^2.0.2 + checksum: 1797bf242cfffbaf3b870d13565bd1716b73f214bb7ada9a497063aada210200da36e3ed40237285f3255acc4feeae91b1fb183625331bad27da95973f7253d9 languageName: node linkType: hard -"@babel/plugin-transform-dynamic-import@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-dynamic-import@npm:7.25.9" - dependencies: - "@babel/helper-plugin-utils": ^7.25.9 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: aaca1ccda819be9b2b85af47ba08ddd2210ff2dbea222f26e4cd33f97ab020884bf81a66197e50872721e9daf36ceb5659502c82199884ea74d5d75ecda5c58b +"ansi-regex@npm:^5.0.1": + version: 5.0.1 + resolution: "ansi-regex@npm:5.0.1" + checksum: 2aa4bb54caf2d622f1afdad09441695af2a83aa3fe8b8afa581d205e57ed4261c183c4d3877cee25794443fde5876417d859c108078ab788d6af7e4fe52eb66b languageName: node linkType: hard -"@babel/plugin-transform-exponentiation-operator@npm:^7.25.9": - version: 7.26.3 - resolution: "@babel/plugin-transform-exponentiation-operator@npm:7.26.3" +"ansi-styles@npm:^3.2.1": + version: 3.2.1 + resolution: "ansi-styles@npm:3.2.1" dependencies: - "@babel/helper-plugin-utils": ^7.25.9 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: b369ffad07e02e259c43a09d309a5ca86cb9da6b43b1df6256463a810b172cedc4254742605eec0fc2418371c3f7430430f5abd36f21717281e79142308c13ba + color-convert: ^1.9.0 + checksum: d85ade01c10e5dd77b6c89f34ed7531da5830d2cb5882c645f330079975b716438cd7ebb81d0d6e6b4f9c577f19ae41ab55f07f19786b02f9dfd9e0377395665 languageName: node linkType: hard -"@babel/plugin-transform-export-namespace-from@npm:^7.22.11, @babel/plugin-transform-export-namespace-from@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-export-namespace-from@npm:7.25.9" +"ansi-styles@npm:^4.0.0, ansi-styles@npm:^4.1.0": + version: 4.3.0 + resolution: "ansi-styles@npm:4.3.0" dependencies: - "@babel/helper-plugin-utils": ^7.25.9 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 4dfe8df86c5b1d085d591290874bb2d78a9063090d71567ed657a418010ad333c3f48af2c974b865f53bbb718987a065f89828d43279a7751db1a56c9229078d + color-convert: ^2.0.1 + checksum: 513b44c3b2105dd14cc42a19271e80f386466c4be574bccf60b627432f9198571ebf4ab1e4c3ba17347658f4ee1711c163d574248c0c1cdc2d5917a0ad582ec4 languageName: node linkType: hard -"@babel/plugin-transform-flow-strip-types@npm:^7.0.0, @babel/plugin-transform-flow-strip-types@npm:^7.16.0, @babel/plugin-transform-flow-strip-types@npm:^7.21.0, @babel/plugin-transform-flow-strip-types@npm:^7.25.2": - version: 7.26.5 - resolution: "@babel/plugin-transform-flow-strip-types@npm:7.26.5" +"append-buffer@npm:^1.0.2": + version: 1.0.2 + resolution: "append-buffer@npm:1.0.2" dependencies: - "@babel/helper-plugin-utils": ^7.26.5 - "@babel/plugin-syntax-flow": ^7.26.0 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: a15ae76aea55f1801a5c8ebdfdd0e4616f256ca1eeb504b0781120242aae5a2174439a084bacd2b9e3e83d2a8463cf10c2a8c9f0f0504ded21144297c2b4a380 + buffer-equal: ^1.0.0 + checksum: e809940b5137c0bfa6f6d4aefcae45b5a15a28938749c0ef50eb39e4d877978fcabf08ceba10d6f214fc15f021681f308fe24865d6557126e2923c58e9c3a134 languageName: node linkType: hard -"@babel/plugin-transform-for-of@npm:^7.0.0, @babel/plugin-transform-for-of@npm:^7.24.7, @babel/plugin-transform-for-of@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-for-of@npm:7.25.9" - dependencies: - "@babel/helper-plugin-utils": ^7.25.9 - "@babel/helper-skip-transparent-expression-wrappers": ^7.25.9 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 41b56e70256a29fc26ed7fb95ece062d7ec2f3b6ea8f0686349ffd004cd4816132085ee21165b89c502ee7161cb7cfb12510961638851357945dc7bc546475b7 +"arg@npm:^4.1.0": + version: 4.1.3 + resolution: "arg@npm:4.1.3" + checksum: 544af8dd3f60546d3e4aff084d451b96961d2267d668670199692f8d054f0415d86fc5497d0e641e91546f0aa920e7c29e5250e99fc89f5552a34b5d93b77f43 languageName: node linkType: hard -"@babel/plugin-transform-function-name@npm:^7.0.0, @babel/plugin-transform-function-name@npm:^7.25.1, @babel/plugin-transform-function-name@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-function-name@npm:7.25.9" +"argparse@npm:^1.0.7": + version: 1.0.10 + resolution: "argparse@npm:1.0.10" dependencies: - "@babel/helper-compilation-targets": ^7.25.9 - "@babel/helper-plugin-utils": ^7.25.9 - "@babel/traverse": ^7.25.9 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: a8d7c8d019a6eb57eab5ca1be3e3236f175557d55b1f3b11f8ad7999e3fbb1cf37905fd8cb3a349bffb4163a558e9f33b63f631597fdc97c858757deac1b2fd7 + sprintf-js: ~1.0.2 + checksum: 7ca6e45583a28de7258e39e13d81e925cfa25d7d4aacbf806a382d3c02fcb13403a07fb8aeef949f10a7cfe4a62da0e2e807b348a5980554cc28ee573ef95945 languageName: node linkType: hard -"@babel/plugin-transform-json-strings@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-json-strings@npm:7.25.9" - dependencies: - "@babel/helper-plugin-utils": ^7.25.9 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: e2498d84761cfd05aaea53799933d55af309c9d6204e66b38778792d171e4d1311ad34f334259a3aa3407dd0446f6bd3e390a1fcb8ce2e42fe5aabed0e41bee1 +"argparse@npm:^2.0.1": + version: 2.0.1 + resolution: "argparse@npm:2.0.1" + checksum: 83644b56493e89a254bae05702abf3a1101b4fa4d0ca31df1c9985275a5a5bd47b3c27b7fa0b71098d41114d8ca000e6ed90cad764b306f8a503665e4d517ced languageName: node linkType: hard -"@babel/plugin-transform-literals@npm:^7.0.0, @babel/plugin-transform-literals@npm:^7.25.2, @babel/plugin-transform-literals@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-literals@npm:7.25.9" - dependencies: - "@babel/helper-plugin-utils": ^7.25.9 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 3cca75823a38aab599bc151b0fa4d816b5e1b62d6e49c156aa90436deb6e13649f5505973151a10418b64f3f9d1c3da53e38a186402e0ed7ad98e482e70c0c14 - languageName: node - linkType: hard - -"@babel/plugin-transform-logical-assignment-operators@npm:^7.24.7, @babel/plugin-transform-logical-assignment-operators@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-logical-assignment-operators@npm:7.25.9" - dependencies: - "@babel/helper-plugin-utils": ^7.25.9 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 8c6febb4ac53852314d28b5e2c23d5dbbff7bf1e57d61f9672e0d97531ef7778b3f0ad698dcf1179f5486e626c77127508916a65eb846a89e98a92f70ed3537b +"array-differ@npm:^3.0.0": + version: 3.0.0 + resolution: "array-differ@npm:3.0.0" + checksum: 117edd9df5c1530bd116c6e8eea891d4bd02850fd89b1b36e532b6540e47ca620a373b81feca1c62d1395d9ae601516ba538abe5e8172d41091da2c546b05fb7 languageName: node linkType: hard -"@babel/plugin-transform-member-expression-literals@npm:^7.0.0, @babel/plugin-transform-member-expression-literals@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-member-expression-literals@npm:7.25.9" - dependencies: - "@babel/helper-plugin-utils": ^7.25.9 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: db92041ae87b8f59f98b50359e0bb172480f6ba22e5e76b13bdfe07122cbf0daa9cd8ad2e78dcb47939938fed88ad57ab5989346f64b3a16953fc73dea3a9b1f +"array-ify@npm:^1.0.0": + version: 1.0.0 + resolution: "array-ify@npm:1.0.0" + checksum: c0502015b319c93dd4484f18036bcc4b654eb76a4aa1f04afbcef11ac918859bb1f5d71ba1f0f1141770db9eef1a4f40f1761753650873068010bbf7bcdae4a4 languageName: node linkType: hard -"@babel/plugin-transform-modules-amd@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-modules-amd@npm:7.25.9" - dependencies: - "@babel/helper-module-transforms": ^7.25.9 - "@babel/helper-plugin-utils": ^7.25.9 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: baad1f6fd0e0d38e9a9c1086a06abdc014c4c653fd452337cadfe23fb5bd8bf4368d1bc433a5ac8e6421bc0732ebb7c044cf3fb39c1b7ebe967d66e26c4e5cec +"array-union@npm:^2.1.0": + version: 2.1.0 + resolution: "array-union@npm:2.1.0" + checksum: 5bee12395cba82da674931df6d0fea23c4aa4660cb3b338ced9f828782a65caa232573e6bf3968f23e0c5eb301764a382cef2f128b170a9dc59de0e36c39f98d languageName: node linkType: hard -"@babel/plugin-transform-modules-commonjs@npm:^7.0.0, @babel/plugin-transform-modules-commonjs@npm:^7.13.8, @babel/plugin-transform-modules-commonjs@npm:^7.24.8, @babel/plugin-transform-modules-commonjs@npm:^7.25.9": - version: 7.26.3 - resolution: "@babel/plugin-transform-modules-commonjs@npm:7.26.3" - dependencies: - "@babel/helper-module-transforms": ^7.26.0 - "@babel/helper-plugin-utils": ^7.25.9 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 0ac9aa4e5fe9fe34b58ee174881631e5e1c89eee5b1ebfd1147934686be92fc5fbfdc11119f0b607b3743d36a1cbcb7c36f18e0dd4424d6d7b749b1b9a18808a +"arrify@npm:^1.0.1": + version: 1.0.1 + resolution: "arrify@npm:1.0.1" + checksum: 745075dd4a4624ff0225c331dacb99be501a515d39bcb7c84d24660314a6ec28e68131b137e6f7e16318170842ce97538cd298fc4cd6b2cc798e0b957f2747e7 languageName: node linkType: hard -"@babel/plugin-transform-modules-systemjs@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-modules-systemjs@npm:7.25.9" - dependencies: - "@babel/helper-module-transforms": ^7.25.9 - "@babel/helper-plugin-utils": ^7.25.9 - "@babel/helper-validator-identifier": ^7.25.9 - "@babel/traverse": ^7.25.9 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: bf446202f372ba92dc0db32b24b56225b6e3ad3b227e31074de8b86fdec01c273ae2536873e38dbe3ceb1cd0894209343adeaa37df208e3fa88c0c7dffec7924 +"arrify@npm:^2.0.1": + version: 2.0.1 + resolution: "arrify@npm:2.0.1" + checksum: 067c4c1afd182806a82e4c1cb8acee16ab8b5284fbca1ce29408e6e91281c36bb5b612f6ddfbd40a0f7a7e0c75bf2696eb94c027f6e328d6e9c52465c98e4209 languageName: node linkType: hard -"@babel/plugin-transform-modules-umd@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-modules-umd@npm:7.25.9" +"async-retry@npm:1.2.3": + version: 1.2.3 + resolution: "async-retry@npm:1.2.3" dependencies: - "@babel/helper-module-transforms": ^7.25.9 - "@babel/helper-plugin-utils": ^7.25.9 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 946db66be5f04ab9ee56c424b00257276ec094aa2f148508927e6085239f76b00304fa1e33026d29eccdbe312efea15ca3d92e74a12689d7f0cdd9a7ba1a6c54 + retry: 0.12.0 + checksum: 9132060566def3a7f4b356b051f0a923dc15036178a568aaf5ed06274c10d2eacd69f816b11fc6112d1628279f61d4afbe0ebcb32b33ecdd87bdcfc17bae3cf2 languageName: node linkType: hard -"@babel/plugin-transform-named-capturing-groups-regex@npm:^7.24.7, @babel/plugin-transform-named-capturing-groups-regex@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-named-capturing-groups-regex@npm:7.25.9" - dependencies: - "@babel/helper-create-regexp-features-plugin": ^7.25.9 - "@babel/helper-plugin-utils": ^7.25.9 - peerDependencies: - "@babel/core": ^7.0.0 - checksum: 434346ba05cf74e3f4704b3bdd439287b95cd2a8676afcdc607810b8c38b6f4798cd69c1419726b2e4c7204e62e4a04d31b0360e91ca57a930521c9211e07789 +"asynckit@npm:^0.4.0": + version: 0.4.0 + resolution: "asynckit@npm:0.4.0" + checksum: 7b78c451df768adba04e2d02e63e2d0bf3b07adcd6e42b4cf665cb7ce899bedd344c69a1dcbce355b5f972d597b25aaa1c1742b52cffd9caccb22f348114f6be languageName: node linkType: hard -"@babel/plugin-transform-new-target@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-new-target@npm:7.25.9" - dependencies: - "@babel/helper-plugin-utils": ^7.25.9 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: f8113539919aafce52f07b2bd182c771a476fe1d5d96d813460b33a16f173f038929369c595572cadc1f7bd8cb816ce89439d056e007770ddd7b7a0878e7895f +"b4a@npm:^1.6.4": + version: 1.6.7 + resolution: "b4a@npm:1.6.7" + checksum: afe4e239b49c0ef62236fe0d788ac9bd9d7eac7e9855b0d1835593cd0efcc7be394f9cc28a747a2ed2cdcb0a48c3528a551a196f472eb625457c711169c9efa2 languageName: node linkType: hard -"@babel/plugin-transform-nullish-coalescing-operator@npm:^7.0.0-0, @babel/plugin-transform-nullish-coalescing-operator@npm:^7.24.7, @babel/plugin-transform-nullish-coalescing-operator@npm:^7.25.9": - version: 7.26.6 - resolution: "@babel/plugin-transform-nullish-coalescing-operator@npm:7.26.6" - dependencies: - "@babel/helper-plugin-utils": ^7.26.5 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 752837d532b85c41f6bb868e83809605f513bc9a3b8e88ac3d43757c9bf839af4f246874c1c6d6902bb2844d355efccae602c3856098911f8abdd603672f8379 +"balanced-match@npm:^1.0.0": + version: 1.0.2 + resolution: "balanced-match@npm:1.0.2" + checksum: 9706c088a283058a8a99e0bf91b0a2f75497f185980d9ffa8b304de1d9e58ebda7c72c07ebf01dadedaac5b2907b2c6f566f660d62bd336c3468e960403b9d65 languageName: node linkType: hard -"@babel/plugin-transform-numeric-separator@npm:^7.24.7, @babel/plugin-transform-numeric-separator@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-numeric-separator@npm:7.25.9" - dependencies: - "@babel/helper-plugin-utils": ^7.25.9 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 0528ef041ed88e8c3f51624ee87b8182a7f246fe4013f0572788e0727d20795b558f2b82e3989b5dd416cbd339500f0d88857de41b6d3b6fdacb1d5344bcc5b1 +"bare-events@npm:^2.2.0": + version: 2.5.2 + resolution: "bare-events@npm:2.5.2" + checksum: d2459e4010ee1aef3e589ea5b7a3643b3b1ff51363cbce507b761d18efb3c21fcfa9912d92e0f636a581b9a6e92aaabe7fe9828b82b9ad534db358bc92c6be7e languageName: node linkType: hard -"@babel/plugin-transform-object-rest-spread@npm:^7.12.13, @babel/plugin-transform-object-rest-spread@npm:^7.24.7, @babel/plugin-transform-object-rest-spread@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-object-rest-spread@npm:7.25.9" - dependencies: - "@babel/helper-compilation-targets": ^7.25.9 - "@babel/helper-plugin-utils": ^7.25.9 - "@babel/plugin-transform-parameters": ^7.25.9 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: a8ff73e1c46a03056b3a2236bafd6b3a4b83da93afe7ee24a50d0a8088150bf85bc5e5977daa04e66ff5fb7613d02d63ad49b91ebb64cf3f3022598d722e3a7a +"before-after-hook@npm:^2.2.0": + version: 2.2.3 + resolution: "before-after-hook@npm:2.2.3" + checksum: a1a2430976d9bdab4cd89cb50d27fa86b19e2b41812bf1315923b0cba03371ebca99449809226425dd3bcef20e010db61abdaff549278e111d6480034bebae87 languageName: node linkType: hard -"@babel/plugin-transform-object-super@npm:^7.0.0, @babel/plugin-transform-object-super@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-object-super@npm:7.25.9" - dependencies: - "@babel/helper-plugin-utils": ^7.25.9 - "@babel/helper-replace-supers": ^7.25.9 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 1817b5d8b80e451ae1ad9080cca884f4f16df75880a158947df76a2ed8ab404d567a7dce71dd8051ef95f90fbe3513154086a32aba55cc76027f6cbabfbd7f98 +"boolbase@npm:^1.0.0": + version: 1.0.0 + resolution: "boolbase@npm:1.0.0" + checksum: 3e25c80ef626c3a3487c73dbfc70ac322ec830666c9ad915d11b701142fab25ec1e63eff2c450c74347acfd2de854ccde865cd79ef4db1683f7c7b046ea43bb0 languageName: node linkType: hard -"@babel/plugin-transform-optional-catch-binding@npm:^7.24.7, @babel/plugin-transform-optional-catch-binding@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-optional-catch-binding@npm:7.25.9" +"brace-expansion@npm:^1.1.7": + version: 1.1.11 + resolution: "brace-expansion@npm:1.1.11" dependencies: - "@babel/helper-plugin-utils": ^7.25.9 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: b46a8d1e91829f3db5c252583eb00d05a779b4660abeea5500fda0f8ffa3584fd18299443c22f7fddf0ed9dfdb73c782c43b445dc468d4f89803f2356963b406 + balanced-match: ^1.0.0 + concat-map: 0.0.1 + checksum: faf34a7bb0c3fcf4b59c7808bc5d2a96a40988addf2e7e09dfbb67a2251800e0d14cd2bfc1aa79174f2f5095c54ff27f46fb1289fe2d77dac755b5eb3434cc07 languageName: node linkType: hard -"@babel/plugin-transform-optional-chaining@npm:^7.0.0-0, @babel/plugin-transform-optional-chaining@npm:^7.24.8, @babel/plugin-transform-optional-chaining@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-optional-chaining@npm:7.25.9" +"brace-expansion@npm:^2.0.1": + version: 2.0.1 + resolution: "brace-expansion@npm:2.0.1" dependencies: - "@babel/helper-plugin-utils": ^7.25.9 - "@babel/helper-skip-transparent-expression-wrappers": ^7.25.9 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: f1642a7094456067e82b176e1e9fd426fda7ed9df54cb6d10109fc512b622bf4b3c83acc5875125732b8622565107fdbe2d60fe3ec8685e1d1c22c38c1b57782 + balanced-match: ^1.0.0 + checksum: a61e7cd2e8a8505e9f0036b3b6108ba5e926b4b55089eeb5550cd04a471fe216c96d4fe7e4c7f995c728c554ae20ddfc4244cad10aef255e72b62930afd233d1 languageName: node linkType: hard -"@babel/plugin-transform-parameters@npm:^7.0.0, @babel/plugin-transform-parameters@npm:^7.20.7, @babel/plugin-transform-parameters@npm:^7.22.15, @babel/plugin-transform-parameters@npm:^7.24.7, @babel/plugin-transform-parameters@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-parameters@npm:7.25.9" +"braces@npm:^3.0.3": + version: 3.0.3 + resolution: "braces@npm:3.0.3" dependencies: - "@babel/helper-plugin-utils": ^7.25.9 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: d7ba2a7d05edbc85aed741289b0ff3d6289a1c25d82ac4be32c565f88a66391f46631aad59ceeed40824037f7eeaa7a0de1998db491f50e65a565cd964f78786 + fill-range: ^7.1.1 + checksum: b95aa0b3bd909f6cd1720ffcf031aeaf46154dd88b4da01f9a1d3f7ea866a79eba76a6d01cbc3c422b2ee5cdc39a4f02491058d5df0d7bf6e6a162a832df1f69 languageName: node linkType: hard -"@babel/plugin-transform-private-methods@npm:^7.24.7, @babel/plugin-transform-private-methods@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-private-methods@npm:7.25.9" - dependencies: - "@babel/helper-create-class-features-plugin": ^7.25.9 - "@babel/helper-plugin-utils": ^7.25.9 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 6e3671b352c267847c53a170a1937210fa8151764d70d25005e711ef9b21969aaf422acc14f9f7fb86bc0e4ec43e7aefcc0ad9196ae02d262ec10f509f126a58 +"broccoli-node-api@npm:^1.7.0": + version: 1.7.0 + resolution: "broccoli-node-api@npm:1.7.0" + checksum: 37b83c81549294d0c843bb4c07ef5330a5493f5e8204e4f7eda716c4f5175f5ccf0f10f0957a18321324b5ff3d4fe2a2cd6cd8e598d6f9e7986c45b8dd200b99 languageName: node linkType: hard -"@babel/plugin-transform-private-property-in-object@npm:^7.24.7, @babel/plugin-transform-private-property-in-object@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-private-property-in-object@npm:7.25.9" - dependencies: - "@babel/helper-annotate-as-pure": ^7.25.9 - "@babel/helper-create-class-features-plugin": ^7.25.9 - "@babel/helper-plugin-utils": ^7.25.9 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 9ce3e983fea9b9ba677c192aa065c0b42ebdc7774be4c02135df09029ad92a55c35b004650c75952cb64d650872ed18f13ab64422c6fc891d06333762caa8a0a +"broccoli-node-info@npm:^2.1.0": + version: 2.2.0 + resolution: "broccoli-node-info@npm:2.2.0" + checksum: e5d68ebb35aa4406dc7dd9e90f15f68fb58c2026696bda2a67045f993261e856fbfec35b3d424c835af7873bd7de00f15630a5b2626c8c0929365035ade9cddd languageName: node linkType: hard -"@babel/plugin-transform-property-literals@npm:^7.0.0, @babel/plugin-transform-property-literals@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-property-literals@npm:7.25.9" +"broccoli-output-wrapper@npm:^3.2.5": + version: 3.2.5 + resolution: "broccoli-output-wrapper@npm:3.2.5" dependencies: - "@babel/helper-plugin-utils": ^7.25.9 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 436046ab07d54a9b44a384eeffec701d4e959a37a7547dda72e069e751ca7ff753d1782a8339e354b97c78a868b49ea97bf41bf5a44c6d7a3c0a05ad40eeb49c + fs-extra: ^8.1.0 + heimdalljs-logger: ^0.1.10 + symlink-or-copy: ^1.2.0 + checksum: c23d875544bfdd4cf0767fb9080a6a16bf938497a1a6601fe9ea2e0e5cce26f1a4f4ab81f80e50376b0d86b622cef848d0ffba3f5fa4f2e3c4b531539383eddb languageName: node linkType: hard -"@babel/plugin-transform-react-constant-elements@npm:^7.12.1, @babel/plugin-transform-react-constant-elements@npm:^7.21.3": - version: 7.25.9 - resolution: "@babel/plugin-transform-react-constant-elements@npm:7.25.9" +"broccoli-plugin@npm:^4.0.7": + version: 4.0.7 + resolution: "broccoli-plugin@npm:4.0.7" dependencies: - "@babel/helper-plugin-utils": ^7.25.9 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: ed59464c96cd4014f636852b4de398d2ffc22ffe3177a6c2a6058447a72839bb66a346a1db525ab60dcc5dd48ec59113a8325f785593689900358a15136e05c3 + broccoli-node-api: ^1.7.0 + broccoli-output-wrapper: ^3.2.5 + fs-merger: ^3.2.1 + promise-map-series: ^0.3.0 + quick-temp: ^0.1.8 + rimraf: ^3.0.2 + symlink-or-copy: ^1.3.1 + checksum: 49d6a55ebfe1880e73956dc8bf23104ad81c1272d4a06755823e6e1eec5255583d2913de99427b3e0a620e3b56178fdd8ea03c832b7452f0440c166044aa555c languageName: node linkType: hard -"@babel/plugin-transform-react-display-name@npm:^7.0.0, @babel/plugin-transform-react-display-name@npm:^7.16.0, @babel/plugin-transform-react-display-name@npm:^7.24.7, @babel/plugin-transform-react-display-name@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-react-display-name@npm:7.25.9" - dependencies: - "@babel/helper-plugin-utils": ^7.25.9 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: cd7020494e6f31c287834e8929e6a718d5b0ace21232fa30feb48622c2312045504c34b347dcff9e88145c349882b296a7d6b6cc3d3447d8c85502f16471747c +"buffer-crc32@npm:~0.2.3": + version: 0.2.13 + resolution: "buffer-crc32@npm:0.2.13" + checksum: 06252347ae6daca3453b94e4b2f1d3754a3b146a111d81c68924c22d91889a40623264e95e67955b1cb4a68cbedf317abeabb5140a9766ed248973096db5ce1c languageName: node linkType: hard -"@babel/plugin-transform-react-jsx-development@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-react-jsx-development@npm:7.25.9" - dependencies: - "@babel/plugin-transform-react-jsx": ^7.25.9 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 537d38369537f1eb56041c4b770bc0733fde1801a7f5ffef40a1217ea448f33ee2fa8e6098a58a82fd00e432c1b9426a66849496da419020c9eca3b1b1a23779 +"buffer-equal-constant-time@npm:1.0.1": + version: 1.0.1 + resolution: "buffer-equal-constant-time@npm:1.0.1" + checksum: 80bb945f5d782a56f374b292770901065bad21420e34936ecbe949e57724b4a13874f735850dd1cc61f078773c4fb5493a41391e7bda40d1fa388d6bd80daaab languageName: node linkType: hard -"@babel/plugin-transform-react-jsx-self@npm:^7.24.7": - version: 7.25.9 - resolution: "@babel/plugin-transform-react-jsx-self@npm:7.25.9" - dependencies: - "@babel/helper-plugin-utils": ^7.25.9 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 41c833cd7f91b1432710f91b1325706e57979b2e8da44e83d86312c78bbe96cd9ef778b4e79e4e17ab25fa32c72b909f2be7f28e876779ede28e27506c41f4ae +"buffer-equal@npm:^1.0.0": + version: 1.0.0 + resolution: "buffer-equal@npm:1.0.0" + checksum: c63a62d25ffc6f3a7064a86dd0d92d93a32d03b14f22d17374790bc10e94bca2312302895fdd28a2b0060999d4385cf90cbf6ad1a6678065156c664016d3be45 languageName: node linkType: hard -"@babel/plugin-transform-react-jsx-source@npm:^7.24.7": - version: 7.25.9 - resolution: "@babel/plugin-transform-react-jsx-source@npm:7.25.9" - dependencies: - "@babel/helper-plugin-utils": ^7.25.9 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: a3e0e5672e344e9d01fb20b504fe29a84918eaa70cec512c4d4b1b035f72803261257343d8e93673365b72c371f35cf34bb0d129720bf178a4c87812c8b9c662 +"builtins@npm:^1.0.3": + version: 1.0.3 + resolution: "builtins@npm:1.0.3" + checksum: 47ce94f7eee0e644969da1f1a28e5f29bd2e48b25b2bbb61164c345881086e29464ccb1fb88dbc155ea26e8b1f5fc8a923b26c8c1ed0935b67b644d410674513 languageName: node linkType: hard -"@babel/plugin-transform-react-jsx@npm:^7.0.0, @babel/plugin-transform-react-jsx@npm:^7.25.2, @babel/plugin-transform-react-jsx@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-react-jsx@npm:7.25.9" - dependencies: - "@babel/helper-annotate-as-pure": ^7.25.9 - "@babel/helper-module-imports": ^7.25.9 - "@babel/helper-plugin-utils": ^7.25.9 - "@babel/plugin-syntax-jsx": ^7.25.9 - "@babel/types": ^7.25.9 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 5c6523c3963e3c6cf4c3cc2768a3766318af05b8f6c17aff52a4010e2c170e87b2fcdc94e9c9223ae12158664df4852ce81b9c8d042c15ea8fd83d6375f9f30f +"cacheable-lookup@npm:^5.0.3": + version: 5.0.4 + resolution: "cacheable-lookup@npm:5.0.4" + checksum: 763e02cf9196bc9afccacd8c418d942fc2677f22261969a4c2c2e760fa44a2351a81557bd908291c3921fe9beb10b976ba8fa50c5ca837c5a0dd945f16468f2d languageName: node linkType: hard -"@babel/plugin-transform-react-pure-annotations@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-react-pure-annotations@npm:7.25.9" +"cacheable-request@npm:^6.0.0": + version: 6.1.0 + resolution: "cacheable-request@npm:6.1.0" dependencies: - "@babel/helper-annotate-as-pure": ^7.25.9 - "@babel/helper-plugin-utils": ^7.25.9 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 9995c0fc7c25d3aaaa0ce84233de02eab2564ea111d0813ec5baa538eb21520402879cc787ad1ad4c2061b99cebc3beb09910e64c9592e8ccb42ae62d9e4fd9a + clone-response: ^1.0.2 + get-stream: ^5.1.0 + http-cache-semantics: ^4.0.0 + keyv: ^3.0.0 + lowercase-keys: ^2.0.0 + normalize-url: ^4.1.0 + responselike: ^1.0.2 + checksum: b510b237b18d17e89942e9ee2d2a077cb38db03f12167fd100932dfa8fc963424bfae0bfa1598df4ae16c944a5484e43e03df8f32105b04395ee9495e9e4e9f1 languageName: node linkType: hard -"@babel/plugin-transform-regenerator@npm:^7.24.7, @babel/plugin-transform-regenerator@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-regenerator@npm:7.25.9" +"cacheable-request@npm:^7.0.2": + version: 7.0.2 + resolution: "cacheable-request@npm:7.0.2" dependencies: - "@babel/helper-plugin-utils": ^7.25.9 - regenerator-transform: ^0.15.2 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 1c09e8087b476c5967282c9790fb8710e065eda77c60f6cb5da541edd59ded9d003d96f8ef640928faab4a0b35bf997673499a194973da4f0c97f0935807a482 + clone-response: ^1.0.2 + get-stream: ^5.1.0 + http-cache-semantics: ^4.0.0 + keyv: ^4.0.0 + lowercase-keys: ^2.0.0 + normalize-url: ^6.0.1 + responselike: ^2.0.0 + checksum: 6152813982945a5c9989cb457a6c499f12edcc7ade323d2fbfd759abc860bdbd1306e08096916bb413c3c47e812f8e4c0a0cc1e112c8ce94381a960f115bc77f languageName: node linkType: hard -"@babel/plugin-transform-regexp-modifiers@npm:^7.26.0": - version: 7.26.0 - resolution: "@babel/plugin-transform-regexp-modifiers@npm:7.26.0" +"call-bind@npm:^1.0.5": + version: 1.0.7 + resolution: "call-bind@npm:1.0.7" dependencies: - "@babel/helper-create-regexp-features-plugin": ^7.25.9 - "@babel/helper-plugin-utils": ^7.25.9 - peerDependencies: - "@babel/core": ^7.0.0 - checksum: 726deca486bbd4b176f8a966eb0f4aabc19d9def3b8dabb8b3a656778eca0df1fda3f3c92b213aa5a184232fdafd5b7bd73b4e24ca4345c498ef6baff2bda4e1 + es-define-property: ^1.0.0 + es-errors: ^1.3.0 + function-bind: ^1.1.2 + get-intrinsic: ^1.2.4 + set-function-length: ^1.2.1 + checksum: 295c0c62b90dd6522e6db3b0ab1ce26bdf9e7404215bda13cfee25b626b5ff1a7761324d58d38b1ef1607fc65aca2d06e44d2e18d0dfc6c14b465b00d8660029 languageName: node linkType: hard -"@babel/plugin-transform-reserved-words@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-reserved-words@npm:7.25.9" - dependencies: - "@babel/helper-plugin-utils": ^7.25.9 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 8beda04481b25767acbd1f6b9ef7b3a9c12fbd9dcb24df45a6ad120e1dc4b247c073db60ac742f9093657d6d8c050501fc0606af042f81a3bb6a3ff862cddc47 +"callsite@npm:^1.0.0": + version: 1.0.0 + resolution: "callsite@npm:1.0.0" + checksum: 569686d622a288a4f0a827466c2f967b6d7a98f2ee1e6ada9dcf5a6802267a5e2a995d40f07113b5f95c7b2b2d5cbff4fdde590195f2a8bed24b829d048688f8 languageName: node linkType: hard -"@babel/plugin-transform-runtime@npm:^7.16.4, @babel/plugin-transform-runtime@npm:^7.24.7": - version: 7.25.9 - resolution: "@babel/plugin-transform-runtime@npm:7.25.9" - dependencies: - "@babel/helper-module-imports": ^7.25.9 - "@babel/helper-plugin-utils": ^7.25.9 - babel-plugin-polyfill-corejs2: ^0.4.10 - babel-plugin-polyfill-corejs3: ^0.10.6 - babel-plugin-polyfill-regenerator: ^0.6.1 - semver: ^6.3.1 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: db7f20a7a7324dbfe3b43a09f0095c69dadcf8b08567fa7c7fa6e245d97c66cdcdc330e97733b7589261c0e1046bc5cc36741b932ac5dd7757374495b57e7b02 +"callsites@npm:^3.0.0": + version: 3.1.0 + resolution: "callsites@npm:3.1.0" + checksum: 072d17b6abb459c2ba96598918b55868af677154bec7e73d222ef95a8fdb9bbf7dae96a8421085cdad8cd190d86653b5b6dc55a4484f2e5b2e27d5e0c3fc15b3 languageName: node linkType: hard -"@babel/plugin-transform-shorthand-properties@npm:^7.0.0, @babel/plugin-transform-shorthand-properties@npm:^7.0.0-0, @babel/plugin-transform-shorthand-properties@npm:^7.24.7, @babel/plugin-transform-shorthand-properties@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-shorthand-properties@npm:7.25.9" +"camelcase-keys@npm:^6.2.2": + version: 6.2.2 + resolution: "camelcase-keys@npm:6.2.2" dependencies: - "@babel/helper-plugin-utils": ^7.25.9 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: f774995d58d4e3a992b732cf3a9b8823552d471040e280264dd15e0735433d51b468fef04d75853d061309389c66bda10ce1b298297ce83999220eb0ad62741d + camelcase: ^5.3.1 + map-obj: ^4.0.0 + quick-lru: ^4.0.1 + checksum: 43c9af1adf840471e54c68ab3e5fe8a62719a6b7dbf4e2e86886b7b0ff96112c945736342b837bd2529ec9d1c7d1934e5653318478d98e0cf22c475c04658e2a languageName: node linkType: hard -"@babel/plugin-transform-spread@npm:^7.0.0, @babel/plugin-transform-spread@npm:^7.24.7, @babel/plugin-transform-spread@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-spread@npm:7.25.9" - dependencies: - "@babel/helper-plugin-utils": ^7.25.9 - "@babel/helper-skip-transparent-expression-wrappers": ^7.25.9 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 2403a5d49171b7714d5e5ecb1f598c61575a4dbe5e33e5a5f08c0ea990b75e693ca1ea983b6a96b2e3e5e7da48c8238333f525e47498c53b577c5d094d964c06 +"camelcase@npm:^5.3.1": + version: 5.3.1 + resolution: "camelcase@npm:5.3.1" + checksum: e6effce26b9404e3c0f301498184f243811c30dfe6d0b9051863bd8e4034d09c8c2923794f280d6827e5aa055f6c434115ff97864a16a963366fb35fd673024b languageName: node linkType: hard -"@babel/plugin-transform-sticky-regex@npm:^7.24.7, @babel/plugin-transform-sticky-regex@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-sticky-regex@npm:7.25.9" - dependencies: - "@babel/helper-plugin-utils": ^7.25.9 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 7454b00844dbe924030dd15e2b3615b36e196500c4c47e98dabc6b37a054c5b1038ecd437e910aabf0e43bf56b973cb148d3437d50f6e2332d8309568e3e979b +"camelcase@npm:^6.3.0": + version: 6.3.0 + resolution: "camelcase@npm:6.3.0" + checksum: 8c96818a9076434998511251dcb2761a94817ea17dbdc37f47ac080bd088fc62c7369429a19e2178b993497132c8cbcf5cc1f44ba963e76782ba469c0474938d languageName: node linkType: hard -"@babel/plugin-transform-template-literals@npm:^7.0.0, @babel/plugin-transform-template-literals@npm:^7.0.0-0, @babel/plugin-transform-template-literals@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-template-literals@npm:7.25.9" +"chalk@npm:4.1.2, chalk@npm:^4.1.0": + version: 4.1.2 + resolution: "chalk@npm:4.1.2" dependencies: - "@babel/helper-plugin-utils": ^7.25.9 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 92eb1d6e2d95bd24abbb74fa7640d02b66ff6214e0bb616d7fda298a7821ce15132a4265d576a3502a347a3c9e94b6c69ed265bb0784664592fa076785a3d16a + ansi-styles: ^4.1.0 + supports-color: ^7.1.0 + checksum: fe75c9d5c76a7a98d45495b91b2172fa3b7a09e0cc9370e5c8feb1c567b85c4288e2b3fded7cfdd7359ac28d6b3844feb8b82b8686842e93d23c827c417e83fc languageName: node linkType: hard -"@babel/plugin-transform-typeof-symbol@npm:^7.25.9": - version: 7.26.7 - resolution: "@babel/plugin-transform-typeof-symbol@npm:7.26.7" +"chalk@npm:^2.3.0, chalk@npm:^2.4.2": + version: 2.4.2 + resolution: "chalk@npm:2.4.2" dependencies: - "@babel/helper-plugin-utils": ^7.26.5 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 1fcc48bde1426527d9905d561884e1ecaf3c03eb5abb507d33f71591f8da0c384e92097feaf91cc30692e04fb7f5e6ff1cb172acc5de7675d93fdb42db850d6a - languageName: node + ansi-styles: ^3.2.1 + escape-string-regexp: ^1.0.5 + supports-color: ^5.3.0 + checksum: ec3661d38fe77f681200f878edbd9448821924e0f93a9cefc0e26a33b145f1027a2084bf19967160d11e1f03bfe4eaffcabf5493b89098b2782c3fe0b03d80c2 + languageName: node linkType: hard -"@babel/plugin-transform-typescript@npm:^7.25.2, @babel/plugin-transform-typescript@npm:^7.25.9": - version: 7.26.7 - resolution: "@babel/plugin-transform-typescript@npm:7.26.7" +"cheerio-select@npm:^2.1.0": + version: 2.1.0 + resolution: "cheerio-select@npm:2.1.0" dependencies: - "@babel/helper-annotate-as-pure": ^7.25.9 - "@babel/helper-create-class-features-plugin": ^7.25.9 - "@babel/helper-plugin-utils": ^7.26.5 - "@babel/helper-skip-transparent-expression-wrappers": ^7.25.9 - "@babel/plugin-syntax-typescript": ^7.25.9 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: c0a20ed69f70135237c903d33291efc6023c99ac5e0aee29b480248f41cc3f24d5b09810368fe8b4804cf52cffb967012ea952ca7df03bf401351ed67aca8247 + boolbase: ^1.0.0 + css-select: ^5.1.0 + css-what: ^6.1.0 + domelementtype: ^2.3.0 + domhandler: ^5.0.3 + domutils: ^3.0.1 + checksum: 843d6d479922f28a6c5342c935aff1347491156814de63c585a6eb73baf7bb4185c1b4383a1195dca0f12e3946d737c7763bcef0b9544c515d905c5c44c5308b languageName: node linkType: hard -"@babel/plugin-transform-unicode-escapes@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-unicode-escapes@npm:7.25.9" +"cheerio@npm:1.0.0-rc.12": + version: 1.0.0-rc.12 + resolution: "cheerio@npm:1.0.0-rc.12" dependencies: - "@babel/helper-plugin-utils": ^7.25.9 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: be067e07488d804e3e82d7771f23666539d2ae5af03bf6eb8480406adf3dabd776e60c1fd5c6078dc5714b73cd80bbaca70e71d4f5d154c5c57200581602ca2f + cheerio-select: ^2.1.0 + dom-serializer: ^2.0.0 + domhandler: ^5.0.3 + domutils: ^3.0.1 + htmlparser2: ^8.0.1 + parse5: ^7.0.0 + parse5-htmlparser2-tree-adapter: ^7.0.0 + checksum: 5d4c1b7a53cf22d3a2eddc0aff70cf23cbb30d01a4c79013e703a012475c02461aa1fcd99127e8d83a02216386ed6942b2c8103845fd0812300dd199e6e7e054 languageName: node linkType: hard -"@babel/plugin-transform-unicode-property-regex@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-unicode-property-regex@npm:7.25.9" - dependencies: - "@babel/helper-create-regexp-features-plugin": ^7.25.9 - "@babel/helper-plugin-utils": ^7.25.9 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 201f6f46c1beb399e79aa208b94c5d54412047511795ce1e790edcd189cef73752e6a099fdfc01b3ad12205f139ae344143b62f21f44bbe02338a95e8506a911 +"chownr@npm:^1.1.4": + version: 1.1.4 + resolution: "chownr@npm:1.1.4" + checksum: 115648f8eb38bac5e41c3857f3e663f9c39ed6480d1349977c4d96c95a47266fcacc5a5aabf3cb6c481e22d72f41992827db47301851766c4fd77ac21a4f081d languageName: node linkType: hard -"@babel/plugin-transform-unicode-regex@npm:^7.0.0-0, @babel/plugin-transform-unicode-regex@npm:^7.24.7, @babel/plugin-transform-unicode-regex@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-unicode-regex@npm:7.25.9" +"cliui@npm:^7.0.2": + version: 7.0.4 + resolution: "cliui@npm:7.0.4" dependencies: - "@babel/helper-create-regexp-features-plugin": ^7.25.9 - "@babel/helper-plugin-utils": ^7.25.9 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: e8baae867526e179467c6ef5280d70390fa7388f8763a19a27c21302dd59b121032568be080749514b097097ceb9af716bf4b90638f1b3cf689aa837ba20150f + string-width: ^4.2.0 + strip-ansi: ^6.0.0 + wrap-ansi: ^7.0.0 + checksum: ce2e8f578a4813806788ac399b9e866297740eecd4ad1823c27fd344d78b22c5f8597d548adbcc46f0573e43e21e751f39446c5a5e804a12aace402b7a315d7f languageName: node linkType: hard -"@babel/plugin-transform-unicode-sets-regex@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-unicode-sets-regex@npm:7.25.9" +"cliui@npm:^8.0.1": + version: 8.0.1 + resolution: "cliui@npm:8.0.1" dependencies: - "@babel/helper-create-regexp-features-plugin": ^7.25.9 - "@babel/helper-plugin-utils": ^7.25.9 - peerDependencies: - "@babel/core": ^7.0.0 - checksum: 4445ef20de687cb4dcc95169742a8d9013d680aa5eee9186d8e25875bbfa7ee5e2de26a91177ccf70b1db518e36886abcd44750d28db5d7a9539f0efa6839f4b - languageName: node - linkType: hard - -"@babel/preset-env@npm:7.26.0": - version: 7.26.0 - resolution: "@babel/preset-env@npm:7.26.0" - dependencies: - "@babel/compat-data": ^7.26.0 - "@babel/helper-compilation-targets": ^7.25.9 - "@babel/helper-plugin-utils": ^7.25.9 - "@babel/helper-validator-option": ^7.25.9 - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": ^7.25.9 - "@babel/plugin-bugfix-safari-class-field-initializer-scope": ^7.25.9 - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": ^7.25.9 - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": ^7.25.9 - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": ^7.25.9 - "@babel/plugin-proposal-private-property-in-object": 7.21.0-placeholder-for-preset-env.2 - "@babel/plugin-syntax-import-assertions": ^7.26.0 - "@babel/plugin-syntax-import-attributes": ^7.26.0 - "@babel/plugin-syntax-unicode-sets-regex": ^7.18.6 - "@babel/plugin-transform-arrow-functions": ^7.25.9 - "@babel/plugin-transform-async-generator-functions": ^7.25.9 - "@babel/plugin-transform-async-to-generator": ^7.25.9 - "@babel/plugin-transform-block-scoped-functions": ^7.25.9 - "@babel/plugin-transform-block-scoping": ^7.25.9 - "@babel/plugin-transform-class-properties": ^7.25.9 - "@babel/plugin-transform-class-static-block": ^7.26.0 - "@babel/plugin-transform-classes": ^7.25.9 - "@babel/plugin-transform-computed-properties": ^7.25.9 - "@babel/plugin-transform-destructuring": ^7.25.9 - "@babel/plugin-transform-dotall-regex": ^7.25.9 - "@babel/plugin-transform-duplicate-keys": ^7.25.9 - "@babel/plugin-transform-duplicate-named-capturing-groups-regex": ^7.25.9 - "@babel/plugin-transform-dynamic-import": ^7.25.9 - "@babel/plugin-transform-exponentiation-operator": ^7.25.9 - "@babel/plugin-transform-export-namespace-from": ^7.25.9 - "@babel/plugin-transform-for-of": ^7.25.9 - "@babel/plugin-transform-function-name": ^7.25.9 - "@babel/plugin-transform-json-strings": ^7.25.9 - "@babel/plugin-transform-literals": ^7.25.9 - "@babel/plugin-transform-logical-assignment-operators": ^7.25.9 - "@babel/plugin-transform-member-expression-literals": ^7.25.9 - "@babel/plugin-transform-modules-amd": ^7.25.9 - "@babel/plugin-transform-modules-commonjs": ^7.25.9 - "@babel/plugin-transform-modules-systemjs": ^7.25.9 - "@babel/plugin-transform-modules-umd": ^7.25.9 - "@babel/plugin-transform-named-capturing-groups-regex": ^7.25.9 - "@babel/plugin-transform-new-target": ^7.25.9 - "@babel/plugin-transform-nullish-coalescing-operator": ^7.25.9 - "@babel/plugin-transform-numeric-separator": ^7.25.9 - "@babel/plugin-transform-object-rest-spread": ^7.25.9 - "@babel/plugin-transform-object-super": ^7.25.9 - "@babel/plugin-transform-optional-catch-binding": ^7.25.9 - "@babel/plugin-transform-optional-chaining": ^7.25.9 - "@babel/plugin-transform-parameters": ^7.25.9 - "@babel/plugin-transform-private-methods": ^7.25.9 - "@babel/plugin-transform-private-property-in-object": ^7.25.9 - "@babel/plugin-transform-property-literals": ^7.25.9 - "@babel/plugin-transform-regenerator": ^7.25.9 - "@babel/plugin-transform-regexp-modifiers": ^7.26.0 - "@babel/plugin-transform-reserved-words": ^7.25.9 - "@babel/plugin-transform-shorthand-properties": ^7.25.9 - "@babel/plugin-transform-spread": ^7.25.9 - "@babel/plugin-transform-sticky-regex": ^7.25.9 - "@babel/plugin-transform-template-literals": ^7.25.9 - "@babel/plugin-transform-typeof-symbol": ^7.25.9 - "@babel/plugin-transform-unicode-escapes": ^7.25.9 - "@babel/plugin-transform-unicode-property-regex": ^7.25.9 - "@babel/plugin-transform-unicode-regex": ^7.25.9 - "@babel/plugin-transform-unicode-sets-regex": ^7.25.9 - "@babel/preset-modules": 0.1.6-no-external-plugins - babel-plugin-polyfill-corejs2: ^0.4.10 - babel-plugin-polyfill-corejs3: ^0.10.6 - babel-plugin-polyfill-regenerator: ^0.6.1 - core-js-compat: ^3.38.1 - semver: ^6.3.1 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 0c3e2b3758cc0347dcf5551b5209db702764183dce66ff20bffceff6486c090bef9175f5f7d1e68cfe5584f0d817b2aab25ab5992058a7998f061f244c8caf5f + string-width: ^4.2.0 + strip-ansi: ^6.0.1 + wrap-ansi: ^7.0.0 + checksum: 79648b3b0045f2e285b76fb2e24e207c6db44323581e421c3acbd0e86454cba1b37aea976ab50195a49e7384b871e6dfb2247ad7dec53c02454ac6497394cb56 languageName: node linkType: hard -"@babel/preset-flow@npm:^7.13.13": - version: 7.21.4 - resolution: "@babel/preset-flow@npm:7.21.4" - dependencies: - "@babel/helper-plugin-utils": ^7.20.2 - "@babel/helper-validator-option": ^7.21.0 - "@babel/plugin-transform-flow-strip-types": ^7.21.0 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: a3a1ac91d0bc0ed033ae46556babe3dc571ea8788c531db550d6904bd303cf50ebb84fa417c1f059c3b69d62e0792d8eceda83d820a12c2e6b8008e5518ce7b8 +"clone-buffer@npm:^1.0.0": + version: 1.0.0 + resolution: "clone-buffer@npm:1.0.0" + checksum: a39a35e7fd081e0f362ba8195bd15cbc8205df1fbe4598bb4e09c1f9a13c0320a47ab8a61a8aa83561e4ed34dc07666d73254ee952ddd3985e4286b082fe63b9 languageName: node linkType: hard -"@babel/preset-modules@npm:0.1.6-no-external-plugins": - version: 0.1.6-no-external-plugins - resolution: "@babel/preset-modules@npm:0.1.6-no-external-plugins" +"clone-response@npm:^1.0.2": + version: 1.0.2 + resolution: "clone-response@npm:1.0.2" dependencies: - "@babel/helper-plugin-utils": ^7.0.0 - "@babel/types": ^7.4.4 - esutils: ^2.0.2 - peerDependencies: - "@babel/core": ^7.0.0-0 || ^8.0.0-0 <8.0.0 - checksum: 4855e799bc50f2449fb5210f78ea9e8fd46cf4f242243f1e2ed838e2bd702e25e73e822e7f8447722a5f4baa5e67a8f7a0e403f3e7ce04540ff743a9c411c375 + mimic-response: ^1.0.0 + checksum: 2d0e61547fc66276e0903be9654ada422515f5a15741691352000d47e8c00c226061221074ce2c0064d12e975e84a8687cfd35d8b405750cb4e772f87b256eda languageName: node linkType: hard -"@babel/preset-react@npm:^7.12.5, @babel/preset-react@npm:^7.16.0, @babel/preset-react@npm:^7.18.6, @babel/preset-react@npm:^7.22.15": - version: 7.26.3 - resolution: "@babel/preset-react@npm:7.26.3" - dependencies: - "@babel/helper-plugin-utils": ^7.25.9 - "@babel/helper-validator-option": ^7.25.9 - "@babel/plugin-transform-react-display-name": ^7.25.9 - "@babel/plugin-transform-react-jsx": ^7.25.9 - "@babel/plugin-transform-react-jsx-development": ^7.25.9 - "@babel/plugin-transform-react-pure-annotations": ^7.25.9 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 9c76f145026715c8e4a1f6c44f208918e700227d8d8a8068f4ae10d87031d23eb8b483e508cd4452d65066f731b7a8169527e66e83ffe165595e8db7899dd859 +"clone-stats@npm:^1.0.0": + version: 1.0.0 + resolution: "clone-stats@npm:1.0.0" + checksum: 654c0425afc5c5c55a4d95b2e0c6eccdd55b5247e7a1e7cca9000b13688b96b0a157950c72c5307f9fd61f17333ad796d3cd654778f2d605438012391cc4ada5 languageName: node linkType: hard -"@babel/preset-typescript@npm:7.26.0, @babel/preset-typescript@npm:^7.13.0, @babel/preset-typescript@npm:^7.16.0, @babel/preset-typescript@npm:^7.16.7, @babel/preset-typescript@npm:^7.21.0, @babel/preset-typescript@npm:^7.23.0": - version: 7.26.0 - resolution: "@babel/preset-typescript@npm:7.26.0" - dependencies: - "@babel/helper-plugin-utils": ^7.25.9 - "@babel/helper-validator-option": ^7.25.9 - "@babel/plugin-syntax-jsx": ^7.25.9 - "@babel/plugin-transform-modules-commonjs": ^7.25.9 - "@babel/plugin-transform-typescript": ^7.25.9 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 6d8641fa6efd0e10eec5e8f92cd164b916a06d57131cfa5216c281404289c87d2b4995140a1c1d9c3bad171ff6ef2226be5f0585e09577ffff349706e991ec71 +"clone@npm:^2.1.1, clone@npm:^2.1.2": + version: 2.1.2 + resolution: "clone@npm:2.1.2" + checksum: aaf106e9bc025b21333e2f4c12da539b568db4925c0501a1bf4070836c9e848c892fa22c35548ce0d1132b08bbbfa17a00144fe58fccdab6fa900fec4250f67d languageName: node linkType: hard -"@babel/register@npm:^7.13.16": - version: 7.18.9 - resolution: "@babel/register@npm:7.18.9" +"cloneable-readable@npm:^1.0.0": + version: 1.1.3 + resolution: "cloneable-readable@npm:1.1.3" dependencies: - clone-deep: ^4.0.1 - find-cache-dir: ^2.0.0 - make-dir: ^2.1.0 - pirates: ^4.0.5 - source-map-support: ^0.5.16 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 4aeaff97e061a397f632659082ba86c539ef8194697b236d991c10d1c2ea8f73213d3b5b3b2c24625951a1ef726b7a7d2e70f70ffcb37f79ef0c1a745eebef21 + inherits: ^2.0.1 + process-nextick-args: ^2.0.0 + readable-stream: ^2.3.5 + checksum: 23b3741225a80c1760dff58aafb6a45383d5ee2d42de7124e4e674387cfad2404493d685b35ebfca9098f99c296e5c5719e748c9750c13838a2016ea2d2bb83a languageName: node linkType: hard -"@babel/runtime-corejs3@npm:^7.10.2": - version: 7.23.4 - resolution: "@babel/runtime-corejs3@npm:7.23.4" +"color-convert@npm:^1.9.0": + version: 1.9.3 + resolution: "color-convert@npm:1.9.3" dependencies: - core-js-pure: ^3.30.2 - regenerator-runtime: ^0.14.0 - checksum: 9b7fcfea7e638e9c701a48e49579c4003073d74178af504867142136751f65e73731259858198cad152bfe5974d1e460a292dac8cbcca4b7c0a87cbf1285da1c + color-name: 1.1.3 + checksum: fd7a64a17cde98fb923b1dd05c5f2e6f7aefda1b60d67e8d449f9328b4e53b228a428fd38bfeaeb2db2ff6b6503a776a996150b80cdf224062af08a5c8a3a203 languageName: node linkType: hard -"@babel/runtime@npm:7.26.0": - version: 7.26.0 - resolution: "@babel/runtime@npm:7.26.0" +"color-convert@npm:^2.0.1": + version: 2.0.1 + resolution: "color-convert@npm:2.0.1" dependencies: - regenerator-runtime: ^0.14.0 - checksum: c8e2c0504ab271b3467a261a8f119bf2603eb857a0d71e37791f4e3fae00f681365073cc79f141ddaa90c6077c60ba56448004ad5429d07ac73532be9f7cf28a + color-name: ~1.1.4 + checksum: 79e6bdb9fd479a205c71d89574fccfb22bd9053bd98c6c4d870d65c132e5e904e6034978e55b43d69fcaa7433af2016ee203ce76eeba9cfa554b373e7f7db336 languageName: node linkType: hard -"@babel/runtime@npm:^7.0.0, @babel/runtime@npm:^7.10.1, @babel/runtime@npm:^7.10.2, @babel/runtime@npm:^7.11.2, @babel/runtime@npm:^7.12.1, @babel/runtime@npm:^7.12.13, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.16.3, @babel/runtime@npm:^7.17.8, @babel/runtime@npm:^7.18.3, @babel/runtime@npm:^7.18.6, @babel/runtime@npm:^7.19.4, @babel/runtime@npm:^7.20.0, @babel/runtime@npm:^7.20.6, @babel/runtime@npm:^7.21.0, @babel/runtime@npm:^7.23.2, @babel/runtime@npm:^7.23.7, @babel/runtime@npm:^7.23.9, @babel/runtime@npm:^7.25.0, @babel/runtime@npm:^7.25.4, @babel/runtime@npm:^7.4.4, @babel/runtime@npm:^7.5.5, @babel/runtime@npm:^7.6.3, @babel/runtime@npm:^7.7.2, @babel/runtime@npm:^7.8.4, @babel/runtime@npm:^7.9.2": - version: 7.26.7 - resolution: "@babel/runtime@npm:7.26.7" - dependencies: - regenerator-runtime: ^0.14.0 - checksum: a1664a08f3f4854b895b540cca2f5f5c6c1993b5fb788c9615d70fc201e16bb254df8e0550c83eaf2749a14d87775e11a7c9ded6161203e9da7a4a323d546925 +"color-name@npm:1.1.3": + version: 1.1.3 + resolution: "color-name@npm:1.1.3" + checksum: 09c5d3e33d2105850153b14466501f2bfb30324a2f76568a408763a3b7433b0e50e5b4ab1947868e65cb101bb7cb75029553f2c333b6d4b8138a73fcc133d69d languageName: node linkType: hard -"@babel/template@npm:^7.18.10, @babel/template@npm:^7.20.7, @babel/template@npm:^7.25.0, @babel/template@npm:^7.25.9, @babel/template@npm:^7.3.3": - version: 7.25.9 - resolution: "@babel/template@npm:7.25.9" - dependencies: - "@babel/code-frame": ^7.25.9 - "@babel/parser": ^7.25.9 - "@babel/types": ^7.25.9 - checksum: 103641fea19c7f4e82dc913aa6b6ac157112a96d7c724d513288f538b84bae04fb87b1f1e495ac1736367b1bc30e10f058b30208fb25f66038e1f1eb4e426472 +"color-name@npm:~1.1.4": + version: 1.1.4 + resolution: "color-name@npm:1.1.4" + checksum: b0445859521eb4021cd0fb0cc1a75cecf67fceecae89b63f62b201cca8d345baf8b952c966862a9d9a2632987d4f6581f0ec8d957dfacece86f0a7919316f610 languageName: node linkType: hard -"@babel/traverse--for-generate-function-map@npm:@babel/traverse@^7.25.3, @babel/traverse@npm:^7.1.6, @babel/traverse@npm:^7.14.0, @babel/traverse@npm:^7.16.8, @babel/traverse@npm:^7.18.9, @babel/traverse@npm:^7.23.2, @babel/traverse@npm:^7.25.3, @babel/traverse@npm:^7.25.4, @babel/traverse@npm:^7.25.9, @babel/traverse@npm:^7.4.5": - version: 7.26.7 - resolution: "@babel/traverse@npm:7.26.7" - dependencies: - "@babel/code-frame": ^7.26.2 - "@babel/generator": ^7.26.5 - "@babel/parser": ^7.26.7 - "@babel/template": ^7.25.9 - "@babel/types": ^7.26.7 - debug: ^4.3.1 - globals: ^11.1.0 - checksum: 22ea8aed130e51db320ff7b3b1555f7dfb82fa860669e593e62990bff004cf09d3dca6fecb8afbac5e51973b703d0cdebf1dc0f6c0021901506f90443c40271b +"colors@npm:1.4.0": + version: 1.4.0 + resolution: "colors@npm:1.4.0" + checksum: 98aa2c2418ad87dedf25d781be69dc5fc5908e279d9d30c34d8b702e586a0474605b3a189511482b9d5ed0d20c867515d22749537f7bc546256c6014f3ebdcec languageName: node linkType: hard -"@babel/types@npm:^7.0.0, @babel/types@npm:^7.1.6, @babel/types@npm:^7.12.6, @babel/types@npm:^7.16.8, @babel/types@npm:^7.18.13, @babel/types@npm:^7.18.9, @babel/types@npm:^7.20.0, @babel/types@npm:^7.20.7, @babel/types@npm:^7.21.3, @babel/types@npm:^7.25.2, @babel/types@npm:^7.25.4, @babel/types@npm:^7.25.9, @babel/types@npm:^7.26.0, @babel/types@npm:^7.26.5, @babel/types@npm:^7.26.7, @babel/types@npm:^7.3.3, @babel/types@npm:^7.4.4": - version: 7.26.7 - resolution: "@babel/types@npm:7.26.7" +"combined-stream@npm:^1.0.8": + version: 1.0.8 + resolution: "combined-stream@npm:1.0.8" dependencies: - "@babel/helper-string-parser": ^7.25.9 - "@babel/helper-validator-identifier": ^7.25.9 - checksum: cfb12e8794ebda6c95c92f3b90f14a9ec87ab532a247d887233068f72f8c287c0fa2e8d3d6ed5a4e512729844f7f73a613cb87d86077ae60a63a2e870e697307 + delayed-stream: ~1.0.0 + checksum: 49fa4aeb4916567e33ea81d088f6584749fc90c7abec76fd516bf1c5aa5c79f3584b5ba3de6b86d26ddd64bae5329c4c7479343250cfe71c75bb366eae53bb7c languageName: node linkType: hard -"@bcoe/v8-coverage@npm:^0.2.3": - version: 0.2.3 - resolution: "@bcoe/v8-coverage@npm:0.2.3" - checksum: 850f9305536d0f2bd13e9e0881cb5f02e4f93fad1189f7b2d4bebf694e3206924eadee1068130d43c11b750efcc9405f88a8e42ef098b6d75239c0f047de1a27 +"command-exists-promise@npm:^2.0.2": + version: 2.0.2 + resolution: "command-exists-promise@npm:2.0.2" + checksum: f6674abbc7d9cc704255999adb42e8b8fe165d941de207d1df8177e1ccea2afb9ff57aad7a70f9235056dd317e45b31f9726ecb2c39826f9a1f98a50f4de1b31 languageName: node linkType: hard -"@bufbuild/protobuf@npm:1.10.0": - version: 1.10.0 - resolution: "@bufbuild/protobuf@npm:1.10.0" - checksum: 84ba0bed65ebfc75dcb31d231af4226c87148cc4e333b59979674b187dd3e52b2a8f76431b236195d8cde5ea555bdc1ad38a76f418956f874041c15448f53402 +"commander@npm:10.0.0": + version: 10.0.0 + resolution: "commander@npm:10.0.0" + checksum: 9f6495651f878213005ac744dd87a85fa3d9f2b8b90d1c19d0866d666bda7f735adfd7c2f10dfff345782e2f80ea258f98bb4efcef58e4e502f25f883940acfd languageName: node linkType: hard -"@celo/base@npm:1.3.3": - version: 1.3.3 - resolution: "@celo/base@npm:1.3.3" - checksum: 64c259bfc4f49a42b62fb606f399dd62c5f46a18634a717b5339c11d0b452a0cfcfd7f073c0bddca00552daf7afd4433401a57bde0cd35a4a6d6ef1f29b6c608 +"commander@npm:^2.18.0": + version: 2.20.3 + resolution: "commander@npm:2.20.3" + checksum: ab8c07884e42c3a8dbc5dd9592c606176c7eb5c1ca5ff274bcf907039b2c41de3626f684ea75ccf4d361ba004bbaff1f577d5384c155f3871e456bdf27becf9e languageName: node linkType: hard -"@changesets/types@npm:^4.0.1": - version: 4.1.0 - resolution: "@changesets/types@npm:4.1.0" - checksum: 72c1f58044178ca867dd9349ecc4b7c233ce3781bb03b5b72a70c3166fbbab54a2f2cb19a81f96b4649ba004442c8734569fba238be4dd737fb4624a135c6098 +"commander@npm:~11.0.0": + version: 11.0.0 + resolution: "commander@npm:11.0.0" + checksum: 6621954e1e1d078b4991c1f5bbd9439ad37aa7768d6ab4842de1dbd4d222c8a27e1b8e62108b3a92988614af45031d5bb2a2aaa92951f4d0c934d1a1ac564bb4 languageName: node linkType: hard -"@chromatic-com/storybook@npm:3.2.2": - version: 3.2.2 - resolution: "@chromatic-com/storybook@npm:3.2.2" +"compare-func@npm:^2.0.0": + version: 2.0.0 + resolution: "compare-func@npm:2.0.0" dependencies: - chromatic: ^11.15.0 - filesize: ^10.0.12 - jsonfile: ^6.1.0 - react-confetti: ^6.1.0 - strip-ansi: ^7.1.0 - peerDependencies: - storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 - checksum: 8f1d03b32e131d391d41913b346d3898e5f2661c54dbe057f05fb1bce2d9b94581942bc5f90efe599b819d1f05d92c50a9be1e0cba2962be797f9a9551b568da + array-ify: ^1.0.0 + dot-prop: ^5.1.0 + checksum: fb71d70632baa1e93283cf9d80f30ac97f003aabee026e0b4426c9716678079ef5fea7519b84d012cbed938c476493866a38a79760564a9e21ae9433e40e6f0d languageName: node linkType: hard -"@cloudflare/kv-asset-handler@npm:^0.2.0": - version: 0.2.0 - resolution: "@cloudflare/kv-asset-handler@npm:0.2.0" +"concat-map@npm:0.0.1": + version: 0.0.1 + resolution: "concat-map@npm:0.0.1" + checksum: 902a9f5d8967a3e2faf138d5cb784b9979bad2e6db5357c5b21c568df4ebe62bcb15108af1b2253744844eb964fc023fbd9afbbbb6ddd0bcc204c6fb5b7bf3af + languageName: node + linkType: hard + +"conventional-changelog-angular@npm:^5.0.11": + version: 5.0.13 + resolution: "conventional-changelog-angular@npm:5.0.13" dependencies: - mime: ^3.0.0 - checksum: bc6a02a9c80be6de90e46454ef4de09301e68726eaa4835de0e30216e50fffcc5612274a17dfb455916cf3418f0cb25fefd2b561a9d2282f4cc10d40527f0acb + compare-func: ^2.0.0 + q: ^1.5.1 + checksum: 6ed4972fce25a50f9f038c749cc9db501363131b0fb2efc1fccecba14e4b1c80651d0d758d4c350a609f32010c66fa343eefd49c02e79e911884be28f53f3f90 languageName: node linkType: hard -"@cloudflare/workerd-darwin-64@npm:1.20231025.0": - version: 1.20231025.0 - resolution: "@cloudflare/workerd-darwin-64@npm:1.20231025.0" - conditions: os=darwin & cpu=x64 +"conventional-changelog-conventionalcommits@npm:^5.0.0": + version: 5.0.0 + resolution: "conventional-changelog-conventionalcommits@npm:5.0.0" + dependencies: + compare-func: ^2.0.0 + lodash: ^4.17.15 + q: ^1.5.1 + checksum: b67d12e4e0fdde5baa32c3d77af472de38646a18657b26f5543eecce041a318103092fbfcef247e2319a16957c9ac78c6ea78acc11a5db6acf74be79a28c561f languageName: node linkType: hard -"@cloudflare/workerd-darwin-arm64@npm:1.20231025.0": - version: 1.20231025.0 - resolution: "@cloudflare/workerd-darwin-arm64@npm:1.20231025.0" - conditions: os=darwin & cpu=arm64 +"conventional-commits-parser@npm:^3.2.2": + version: 3.2.4 + resolution: "conventional-commits-parser@npm:3.2.4" + dependencies: + JSONStream: ^1.0.4 + is-text-path: ^1.0.1 + lodash: ^4.17.15 + meow: ^8.0.0 + split2: ^3.0.0 + through2: ^4.0.0 + bin: + conventional-commits-parser: cli.js + checksum: 1627ff203bc9586d89e47a7fe63acecf339aba74903b9114e23d28094f79d4e2d6389bf146ae561461dcba8fc42e7bc228165d2b173f15756c43f1d32bc50bfd languageName: node linkType: hard -"@cloudflare/workerd-linux-64@npm:1.20231025.0": - version: 1.20231025.0 - resolution: "@cloudflare/workerd-linux-64@npm:1.20231025.0" - conditions: os=linux & cpu=x64 +"convert-source-map@npm:^1.5.0": + version: 1.9.0 + resolution: "convert-source-map@npm:1.9.0" + checksum: dc55a1f28ddd0e9485ef13565f8f756b342f9a46c4ae18b843fe3c30c675d058d6a4823eff86d472f187b176f0adf51ea7b69ea38be34be4a63cbbf91b0593c8 languageName: node linkType: hard -"@cloudflare/workerd-linux-arm64@npm:1.20231025.0": - version: 1.20231025.0 - resolution: "@cloudflare/workerd-linux-arm64@npm:1.20231025.0" - conditions: os=linux & cpu=arm64 +"core-js@npm:^3.8.2": + version: 3.39.0 + resolution: "core-js@npm:3.39.0" + checksum: 7a3670e9a2a89e0a049daa288d742d09f6e16d27a8945c5e2ef6fc45dc57e5c4bc5db589da05947486f54ae978d14cf27bd3fb1db0b9907000a611e8af37355b languageName: node linkType: hard -"@cloudflare/workerd-windows-64@npm:1.20231025.0": - version: 1.20231025.0 - resolution: "@cloudflare/workerd-windows-64@npm:1.20231025.0" - conditions: os=win32 & cpu=x64 +"core-util-is@npm:~1.0.0": + version: 1.0.3 + resolution: "core-util-is@npm:1.0.3" + checksum: 9de8597363a8e9b9952491ebe18167e3b36e7707569eed0ebf14f8bba773611376466ae34575bca8cfe3c767890c859c74056084738f09d4e4a6f902b2ad7d99 languageName: node linkType: hard -"@cloudflare/workers-types@npm:4.20231025.0": - version: 4.20231025.0 - resolution: "@cloudflare/workers-types@npm:4.20231025.0" - checksum: 74aa5c62f7bd82d78c38bcc7aceed898e8d6bab6569323d6424e816686d9bd324fc8e841c35699ec13b1dc72909884e152191caf09ba377d814b2cc6b1800fa5 +"cosmiconfig-typescript-loader@npm:^4.0.0": + version: 4.3.0 + resolution: "cosmiconfig-typescript-loader@npm:4.3.0" + peerDependencies: + "@types/node": "*" + cosmiconfig: ">=7" + ts-node: ">=10" + typescript: ">=3" + checksum: ea61dfd8e112cf2bb18df0ef89280bd3ae3dd5b997b4a9fc22bbabdc02513aadfbc6d4e15e922b6a9a5d987e9dad42286fa38caf77a9b8dcdbe7d4ce1c9db4fb languageName: node linkType: hard -"@coinbase/wallet-sdk@npm:4.0.0": - version: 4.0.0 - resolution: "@coinbase/wallet-sdk@npm:4.0.0" +"cosmiconfig@npm:8.0.0": + version: 8.0.0 + resolution: "cosmiconfig@npm:8.0.0" dependencies: - buffer: ^6.0.3 - clsx: ^1.2.1 - eventemitter3: ^5.0.1 - keccak: ^3.0.3 - preact: ^10.16.0 - sha.js: ^2.4.11 - checksum: f9101233cd4529daae235eb01fcd10fe3c9ab075b3171beacb755ff475be7a9e33957fb4ffedbdd34092c3045ddcbf6fda181a5adfd531307a4cc8937861ef38 + import-fresh: ^3.2.1 + js-yaml: ^4.1.0 + parse-json: ^5.0.0 + path-type: ^4.0.0 + checksum: ff4cdf89ac1ae52e7520816622c21a9e04380d04b82d653f5139ec581aa4f7f29e096d46770bc76c4a63c225367e88a1dfa233ea791669a35101f5f9b972c7d1 languageName: node linkType: hard -"@colors/colors@npm:1.5.0": - version: 1.5.0 - resolution: "@colors/colors@npm:1.5.0" - checksum: d64d5260bed1d5012ae3fc617d38d1afc0329fec05342f4e6b838f46998855ba56e0a73833f4a80fa8378c84810da254f76a8a19c39d038260dc06dc4e007425 +"cosmiconfig@npm:^7.1.0": + version: 7.1.0 + resolution: "cosmiconfig@npm:7.1.0" + dependencies: + "@types/parse-json": ^4.0.0 + import-fresh: ^3.2.1 + parse-json: ^5.0.0 + path-type: ^4.0.0 + yaml: ^1.10.0 + checksum: c53bf7befc1591b2651a22414a5e786cd5f2eeaa87f3678a3d49d6069835a9d8d1aef223728e98aa8fec9a95bf831120d245096db12abe019fecb51f5696c96f languageName: node linkType: hard -"@commitlint/cli@npm:17.5.0": - version: 17.5.0 - resolution: "@commitlint/cli@npm:17.5.0" +"cosmiconfig@npm:^8.0.0": + version: 8.1.3 + resolution: "cosmiconfig@npm:8.1.3" dependencies: - "@commitlint/format": ^17.4.4 - "@commitlint/lint": ^17.4.4 - "@commitlint/load": ^17.5.0 - "@commitlint/read": ^17.4.4 - "@commitlint/types": ^17.4.4 - execa: ^5.0.0 - lodash.isfunction: ^3.0.9 - resolve-from: 5.0.0 - resolve-global: 1.0.0 - yargs: ^17.0.0 - bin: - commitlint: cli.js - checksum: d7d7a016a64d323ecbd3f9cc652039323d6ba735d13f0820dcbf78d3f270a63b4e609ef0fdd3ee2cfa749ad74bf59f9d4a7d74c3458ea1e849916078f9303bad - languageName: node - linkType: hard - -"@commitlint/config-conventional@npm:17.4.4": - version: 17.4.4 - resolution: "@commitlint/config-conventional@npm:17.4.4" - dependencies: - conventional-changelog-conventionalcommits: ^5.0.0 - checksum: 679d92509fe6e53ee0cc4202f8069d88360c4f9dbd7ab74114bb28278a196da517ef711dfe69893033a66e54ffc29e8df2ccf63cfd746a89c82a053949473c4b - languageName: node - linkType: hard - -"@commitlint/config-validator@npm:^17.4.4": - version: 17.4.4 - resolution: "@commitlint/config-validator@npm:17.4.4" - dependencies: - "@commitlint/types": ^17.4.4 - ajv: ^8.11.0 - checksum: 71ee818608ed5c74832cdd63531c0f61b21758fba9f8b876205485ece4f047c9582bc3f323a20a5de700e3451296614d15448437270a82194eff7d71317b47ff - languageName: node - linkType: hard - -"@commitlint/ensure@npm:^17.4.4": - version: 17.4.4 - resolution: "@commitlint/ensure@npm:17.4.4" - dependencies: - "@commitlint/types": ^17.4.4 - lodash.camelcase: ^4.3.0 - lodash.kebabcase: ^4.1.1 - lodash.snakecase: ^4.1.1 - lodash.startcase: ^4.4.0 - lodash.upperfirst: ^4.3.1 - checksum: c21c189f22d8d3265e93256d101b72ef7cbdf8660438081799b9a4a8bd47d33133f250bbed858ab9bcc0d249d1c95ac58eddd9e5b46314d64ff049d0479d0d71 - languageName: node - linkType: hard - -"@commitlint/execute-rule@npm:^17.4.0": - version: 17.4.0 - resolution: "@commitlint/execute-rule@npm:17.4.0" - checksum: 17d8e56ab00bd45fdecb0ed33186d2020ce261250d6a516204b6509610b75af8c930e7226b1111af3de298db32a7e4d0ba2c9cc7ed67db5ba5159eeed634f067 - languageName: node - linkType: hard - -"@commitlint/format@npm:^17.4.4": - version: 17.4.4 - resolution: "@commitlint/format@npm:17.4.4" - dependencies: - "@commitlint/types": ^17.4.4 - chalk: ^4.1.0 - checksum: 832d9641129f2da8d32389b4a47db59d41eb1adfab742723972cad64b833c4af9e253f96757b27664fedae61644dd4c01d21f775773b45b604bd7f93b23a27d2 - languageName: node - linkType: hard - -"@commitlint/is-ignored@npm:^17.4.4": - version: 17.4.4 - resolution: "@commitlint/is-ignored@npm:17.4.4" - dependencies: - "@commitlint/types": ^17.4.4 - semver: 7.3.8 - checksum: 716631ecd6aece8642d76c1a99e1cdc24bad79f22199d1d4bad73d9b12edb3578ed7d6f23947ca28d4bb637e08a1738e55dd693c165a2d395c10560a988ffc05 - languageName: node - linkType: hard - -"@commitlint/lint@npm:^17.4.4": - version: 17.4.4 - resolution: "@commitlint/lint@npm:17.4.4" - dependencies: - "@commitlint/is-ignored": ^17.4.4 - "@commitlint/parse": ^17.4.4 - "@commitlint/rules": ^17.4.4 - "@commitlint/types": ^17.4.4 - checksum: bf04a9f9a1435e0d3cd03c58b6bf924613d0278b66b0a5d0e18eb96c7af9eeb02871e739a4d7d9312b2b4178f6f8ae9a49ba74382b4e28f623e1bf0af7067946 - languageName: node - linkType: hard - -"@commitlint/load@npm:^17.5.0": - version: 17.5.0 - resolution: "@commitlint/load@npm:17.5.0" - dependencies: - "@commitlint/config-validator": ^17.4.4 - "@commitlint/execute-rule": ^17.4.0 - "@commitlint/resolve-extends": ^17.4.4 - "@commitlint/types": ^17.4.4 - "@types/node": "*" - chalk: ^4.1.0 - cosmiconfig: ^8.0.0 - cosmiconfig-typescript-loader: ^4.0.0 - lodash.isplainobject: ^4.0.6 - lodash.merge: ^4.6.2 - lodash.uniq: ^4.5.0 - resolve-from: ^5.0.0 - ts-node: ^10.8.1 - typescript: ^4.6.4 || ^5.0.0 - checksum: c039114b0ad67bb9d8b05ec635d847bd5ab760528f0fb203411f433585bdab5472f4f5c7856dfc417cf64c05576f54c1afc4997a813f529304e0156bfc1d6cc8 - languageName: node - linkType: hard - -"@commitlint/message@npm:^17.4.2": - version: 17.4.2 - resolution: "@commitlint/message@npm:17.4.2" - checksum: 55b6cfeb57f7c9f913e18821aa4d972a6b6faa78c62741390996151f99554396f6df68ccfee86c163d24d8c27a4dbbcb50ef03c2972ab0a7a21d89daa2f9a519 - languageName: node - linkType: hard - -"@commitlint/parse@npm:^17.4.4": - version: 17.4.4 - resolution: "@commitlint/parse@npm:17.4.4" - dependencies: - "@commitlint/types": ^17.4.4 - conventional-changelog-angular: ^5.0.11 - conventional-commits-parser: ^3.2.2 - checksum: 2a6e5b0a5cdea21c879a3919a0227c0d7f3fa1f343808bcb09e3e7f25b0dc494dcca8af32982e7a65640b53c3e6cf138ebf685b657dd55173160bc0fa4e58916 - languageName: node - linkType: hard - -"@commitlint/read@npm:^17.4.4": - version: 17.4.4 - resolution: "@commitlint/read@npm:17.4.4" - dependencies: - "@commitlint/top-level": ^17.4.0 - "@commitlint/types": ^17.4.4 - fs-extra: ^11.0.0 - git-raw-commits: ^2.0.0 - minimist: ^1.2.6 - checksum: 29c828ba0a756196cff6b6fb480971cc779519823c3d061c6b2debee1dfc6c17453ef8aefe6d72a2f21e7be866f501e478b77dddd77f7cd75dfdae7f4a153268 - languageName: node - linkType: hard - -"@commitlint/resolve-extends@npm:^17.4.4": - version: 17.4.4 - resolution: "@commitlint/resolve-extends@npm:17.4.4" - dependencies: - "@commitlint/config-validator": ^17.4.4 - "@commitlint/types": ^17.4.4 - import-fresh: ^3.0.0 - lodash.mergewith: ^4.6.2 - resolve-from: ^5.0.0 - resolve-global: ^1.0.0 - checksum: d7bf1ff1ad3db8750421b252d79cf7b96cf07d72cad8cc3f73c1363a8e68c0afde611d38ae6f213bbb54e3248160c6b9425578f3d0f8f790e84aea811d748b3e - languageName: node - linkType: hard - -"@commitlint/rules@npm:^17.4.4": - version: 17.4.4 - resolution: "@commitlint/rules@npm:17.4.4" - dependencies: - "@commitlint/ensure": ^17.4.4 - "@commitlint/message": ^17.4.2 - "@commitlint/to-lines": ^17.4.0 - "@commitlint/types": ^17.4.4 - execa: ^5.0.0 - checksum: f36525f6e234df6a17d47457b733a1fc10e3e01db1aa6fb45b18cbaf74b7915f634ab65f73d2412787137c366046f8264126c2f21ad9023ac6b68ec8b1cee8f4 - languageName: node - linkType: hard - -"@commitlint/to-lines@npm:^17.4.0": - version: 17.4.0 - resolution: "@commitlint/to-lines@npm:17.4.0" - checksum: 841f90f606238e145ab4ba02940662d511fc04fe553619900152a8542170fe664031b95d820ffaeb8864d4851344278e662ef29637d763fc19fd828e0f8d139b - languageName: node - linkType: hard - -"@commitlint/top-level@npm:^17.4.0": - version: 17.4.0 - resolution: "@commitlint/top-level@npm:17.4.0" - dependencies: - find-up: ^5.0.0 - checksum: 14cd77e982d2dd7989718dafdbf7a2168a5fb387005e0686c2dfa9ffc36bb9a749e5d80a151884459e4d8c88564339688dca26e9c711abe043beeb3f30c3dfd6 - languageName: node - linkType: hard - -"@commitlint/types@npm:^17.4.4": - version: 17.4.4 - resolution: "@commitlint/types@npm:17.4.4" - dependencies: - chalk: ^4.1.0 - checksum: 03c52429052d161710896d198000196bd2e60be0fd71459b22133dd83dee43e8d05ea8ee703c8369823bc40f77a54881b80d8aa4368ac52aea7f30fb234b73d2 - languageName: node - linkType: hard - -"@connectrpc/connect-query@npm:1.4.1": - version: 1.4.1 - resolution: "@connectrpc/connect-query@npm:1.4.1" - dependencies: - stable-hash: ^0.0.4 - peerDependencies: - "@bufbuild/protobuf": ^1.3.3 - "@connectrpc/connect": ^1.1.2 - "@tanstack/react-query": 5.x - react: ^18.3.1 - react-dom: ^18.3.1 - checksum: adcc4e8c1972170fbabc8b4f1dc2fde2fdd7aacbd64a01fb589825ee4f05bbcaac66ad802238427827a67e5b44e51a6368d52a68ed436ebe883c208fe0ffa278 - languageName: node - linkType: hard - -"@connectrpc/connect-web@npm:1.4.0": - version: 1.4.0 - resolution: "@connectrpc/connect-web@npm:1.4.0" - peerDependencies: - "@bufbuild/protobuf": ^1.4.2 - "@connectrpc/connect": 1.4.0 - checksum: bf53f5cdd0be69be1cdebf7d7e01f74936f83b410fb26d7f515284771290e6c24f5701e6144ea600805fa2e39d5255ef009210f7b1c35f1dade60005e231b022 - languageName: node - linkType: hard - -"@connectrpc/connect@npm:1.4.0": - version: 1.4.0 - resolution: "@connectrpc/connect@npm:1.4.0" - peerDependencies: - "@bufbuild/protobuf": ^1.4.2 - checksum: 388145ea90b3216f133b34d96a47dfd0273dfa12c4b4963c7223cf45bdcbf8b3490ab234dda34fd42a7112ad9f51f22efc013f3183744a3f2ae65b825917b870 - languageName: node - linkType: hard - -"@craco/craco@npm:7.1.0": - version: 7.1.0 - resolution: "@craco/craco@npm:7.1.0" - dependencies: - autoprefixer: ^10.4.12 - cosmiconfig: ^7.0.1 - cosmiconfig-typescript-loader: ^1.0.0 - cross-spawn: ^7.0.3 - lodash: ^4.17.21 - semver: ^7.3.7 - webpack-merge: ^5.8.0 - peerDependencies: - react-scripts: ^5.0.0 - bin: - craco: dist/bin/craco.js - checksum: d534d1ea7814e7bd9f2e2aef17821fcdb1d9cac8308e8eb04809f8f3371180086b8f673dedce1ffbefba9ded566e91e4c9663464e488bf6291461091cbd95c4e - languageName: node - linkType: hard - -"@crowdin/cli@npm:3.14.0": - version: 3.14.0 - resolution: "@crowdin/cli@npm:3.14.0" - dependencies: - command-exists-promise: ^2.0.2 - node-fetch: 2.6.7 - shelljs: ^0.8.4 - tar: ^4.4.8 - yauzl: ^2.10.0 - bin: - crowdin: jdeploy-bundle/jdeploy.js - checksum: 659c287b19193a92de6582968568dd395e8da02f085b2c97d39e2d368a71da19cdceec2acf8152d34f345fd42d55d01781819655a4f661a3c1b6ab22a8d5a8b1 - languageName: node - linkType: hard - -"@cspotcode/source-map-support@npm:^0.8.0": - version: 0.8.1 - resolution: "@cspotcode/source-map-support@npm:0.8.1" - dependencies: - "@jridgewell/trace-mapping": 0.3.9 - checksum: 5718f267085ed8edb3e7ef210137241775e607ee18b77d95aa5bd7514f47f5019aa2d82d96b3bf342ef7aa890a346fa1044532ff7cc3009e7d24fce3ce6200fa - languageName: node - linkType: hard - -"@csstools/normalize.css@npm:*": - version: 12.1.1 - resolution: "@csstools/normalize.css@npm:12.1.1" - checksum: a356ee0fcb922f3e0bc23df4468bb4f27fc26c767e25359c079455fe30301d253d8a60c443859b04350c8174393edbb11bad2a9ef2f8cce0e371f6abf6c7ef36 - languageName: node - linkType: hard - -"@csstools/postcss-cascade-layers@npm:^1.1.1": - version: 1.1.1 - resolution: "@csstools/postcss-cascade-layers@npm:1.1.1" - dependencies: - "@csstools/selector-specificity": ^2.0.2 - postcss-selector-parser: ^6.0.10 - peerDependencies: - postcss: ^8.2 - checksum: 8ecd6a929e8ddee3ad0834ab5017f50a569817ba8490d152b11c705c13cf3d9701f74792f375cbd72d8f33a4eeaabb3f984f1514adf8c5a530eb91be70c14cf4 - languageName: node - linkType: hard - -"@csstools/postcss-color-function@npm:^1.1.1": - version: 1.1.1 - resolution: "@csstools/postcss-color-function@npm:1.1.1" - dependencies: - "@csstools/postcss-progressive-custom-properties": ^1.1.0 - postcss-value-parser: ^4.2.0 - peerDependencies: - postcss: ^8.2 - checksum: 087595985ebcc2fc42013d6305185d4cdc842d87fb261185db905dc31eaa24fc23a7cc068fa3da814b3c8b98164107ddaf1b4ab24f4ff5b2a7b5fbcd4c6ceec9 - languageName: node - linkType: hard - -"@csstools/postcss-font-format-keywords@npm:^1.0.1": - version: 1.0.1 - resolution: "@csstools/postcss-font-format-keywords@npm:1.0.1" - dependencies: - postcss-value-parser: ^4.2.0 - peerDependencies: - postcss: ^8.2 - checksum: ed8d9eab9793f0184e000709bcb155d4eb96c49a312e3ea9e549e006b74fd4aafac63cb9f9f01bec5b717a833539ff085c3f1ef7d273b97d587769ef637d50c1 - languageName: node - linkType: hard - -"@csstools/postcss-hwb-function@npm:^1.0.2": - version: 1.0.2 - resolution: "@csstools/postcss-hwb-function@npm:1.0.2" - dependencies: - postcss-value-parser: ^4.2.0 - peerDependencies: - postcss: ^8.2 - checksum: 352ead754a692f7ed33a712c491012cab5c2f2946136a669a354237cfe8e6faca90c7389ee793cb329b9b0ddec984faa06d47e2f875933aaca417afff74ce6aa - languageName: node - linkType: hard - -"@csstools/postcss-ic-unit@npm:^1.0.1": - version: 1.0.1 - resolution: "@csstools/postcss-ic-unit@npm:1.0.1" - dependencies: - "@csstools/postcss-progressive-custom-properties": ^1.1.0 - postcss-value-parser: ^4.2.0 - peerDependencies: - postcss: ^8.2 - checksum: 09c414c9b7762b5fbe837ff451d7a11e4890f1ed3c92edc3573f02f3d89747f6ac3f2270799b68a332bd7f5de05bb0dfffddb6323fc4020c2bea33ff58314533 - languageName: node - linkType: hard - -"@csstools/postcss-is-pseudo-class@npm:^2.0.7": - version: 2.0.7 - resolution: "@csstools/postcss-is-pseudo-class@npm:2.0.7" - dependencies: - "@csstools/selector-specificity": ^2.0.0 - postcss-selector-parser: ^6.0.10 - peerDependencies: - postcss: ^8.2 - checksum: a4494bb8e9a34826944ba6872c91c1e88268caab6d06968897f1a0cc75ca5cfc4989435961fc668a9c6842a6d17f4cda0055fa256d23e598b8bbc6f022956125 - languageName: node - linkType: hard - -"@csstools/postcss-nested-calc@npm:^1.0.0": - version: 1.0.0 - resolution: "@csstools/postcss-nested-calc@npm:1.0.0" - dependencies: - postcss-value-parser: ^4.2.0 - peerDependencies: - postcss: ^8.2 - checksum: 53bb783dd61621c11c1e6e352f079577e2eb908de67947ceef31a178e070c06c223baae87acd5c3bd51c664515d2adc16166a129159168626111aff548583790 - languageName: node - linkType: hard - -"@csstools/postcss-normalize-display-values@npm:^1.0.1": - version: 1.0.1 - resolution: "@csstools/postcss-normalize-display-values@npm:1.0.1" - dependencies: - postcss-value-parser: ^4.2.0 - peerDependencies: - postcss: ^8.2 - checksum: 75901daec3869ba15e0adfd50d8e2e754ec06d55ac44fbd540748476388d223d53710fb3a3cbfe6695a2bab015a489fb47d9e3914ff211736923f8deb818dc0b - languageName: node - linkType: hard - -"@csstools/postcss-oklab-function@npm:^1.1.1": - version: 1.1.1 - resolution: "@csstools/postcss-oklab-function@npm:1.1.1" - dependencies: - "@csstools/postcss-progressive-custom-properties": ^1.1.0 - postcss-value-parser: ^4.2.0 - peerDependencies: - postcss: ^8.2 - checksum: d66b789060b37ed810450d9a7d8319a0ae14e913c091f3e0ee482b3471538762e801d5eae3d62fda2f1eb1e88c76786d2c2b06c1172166eba1cca5e2a0dc95f2 - languageName: node - linkType: hard - -"@csstools/postcss-progressive-custom-properties@npm:^1.1.0, @csstools/postcss-progressive-custom-properties@npm:^1.3.0": - version: 1.3.0 - resolution: "@csstools/postcss-progressive-custom-properties@npm:1.3.0" - dependencies: - postcss-value-parser: ^4.2.0 - peerDependencies: - postcss: ^8.3 - checksum: e281845fde5b8a80d06ec20147bd74e96a9351bebbec5e5c3a6fb37ea30a597ff84172601786a8a270662f58f708b4a3bf8d822d6318023def9773d2f6589962 - languageName: node - linkType: hard - -"@csstools/postcss-stepped-value-functions@npm:^1.0.1": - version: 1.0.1 - resolution: "@csstools/postcss-stepped-value-functions@npm:1.0.1" - dependencies: - postcss-value-parser: ^4.2.0 - peerDependencies: - postcss: ^8.2 - checksum: 2fc88713a0d49d142010652be8139b00719e407df1173e46047284f1befd0647e1fff67f259f9f55ac3b46bba6462b21f0aa192bd10a2989c51a8ce0d25fc495 - languageName: node - linkType: hard - -"@csstools/postcss-text-decoration-shorthand@npm:^1.0.0": - version: 1.0.0 - resolution: "@csstools/postcss-text-decoration-shorthand@npm:1.0.0" - dependencies: - postcss-value-parser: ^4.2.0 - peerDependencies: - postcss: ^8.2 - checksum: d27aaf97872c42bec9f6fde4d8bf924e89f7886f0aca8e4fc5aaf2f9083b09bb43dbbfa29124fa36fcdeb2d4d3e0459a095acf62188260cd1577e9811bb1276e - languageName: node - linkType: hard - -"@csstools/postcss-trigonometric-functions@npm:^1.0.2": - version: 1.0.2 - resolution: "@csstools/postcss-trigonometric-functions@npm:1.0.2" - dependencies: - postcss-value-parser: ^4.2.0 - peerDependencies: - postcss: ^8.2 - checksum: f7f5b5f2492606b79a56f09e814ae8f10a2ae9e9c5fb8019f0e347a4a6c07953b2cc663fd4fa43a60e6994dfd958958f39df8ec760e2a646cfe71fe2bb119382 - languageName: node - linkType: hard - -"@csstools/postcss-unset-value@npm:^1.0.2": - version: 1.0.2 - resolution: "@csstools/postcss-unset-value@npm:1.0.2" - peerDependencies: - postcss: ^8.2 - checksum: 3facdae154d6516ffd964f7582696f406465f11cf8dead503e0afdfecc99ebc25638ab2830affce4516131aa2db004458a235e439f575b04e9ef72ad82f55835 - languageName: node - linkType: hard - -"@csstools/selector-specificity@npm:^2.0.0, @csstools/selector-specificity@npm:^2.0.2": - version: 2.2.0 - resolution: "@csstools/selector-specificity@npm:2.2.0" - peerDependencies: - postcss-selector-parser: ^6.0.10 - checksum: 97c89f23b3b527d7bd51ed299969ed2b9fbb219a367948b44aefec228b8eda6ae0ad74fe8a82f9aac8ff32cfd00bb6d0c98d1daeab2e8fc6d5c4af25e5be5673 - languageName: node - linkType: hard - -"@cypress/request@npm:^3.0.0": - version: 3.0.1 - resolution: "@cypress/request@npm:3.0.1" - dependencies: - aws-sign2: ~0.7.0 - aws4: ^1.8.0 - caseless: ~0.12.0 - combined-stream: ~1.0.6 - extend: ~3.0.2 - forever-agent: ~0.6.1 - form-data: ~2.3.2 - http-signature: ~1.3.6 - is-typedarray: ~1.0.0 - isstream: ~0.1.2 - json-stringify-safe: ~5.0.1 - mime-types: ~2.1.19 - performance-now: ^2.1.0 - qs: 6.10.4 - safe-buffer: ^5.1.2 - tough-cookie: ^4.1.3 - tunnel-agent: ^0.6.0 - uuid: ^8.3.2 - checksum: 7175522ebdbe30e3c37973e204c437c23ce659e58d5939466615bddcd58d778f3a8ea40f087b965ae8b8138ea8d102b729c6eb18c6324f121f3778f4a2e8e727 - languageName: node - linkType: hard - -"@cypress/xvfb@npm:^1.2.4": - version: 1.2.4 - resolution: "@cypress/xvfb@npm:1.2.4" - dependencies: - debug: ^3.1.0 - lodash.once: ^4.1.1 - checksum: 7bdcdaeb1bb692ec9d9bf8ec52538aa0bead6764753f4a067a171a511807a43fab016f7285a56bef6a606c2467ff3f1365e1ad2d2d583b81beed849ee1573fd1 - languageName: node - linkType: hard - -"@datadog/browser-core@npm:5.20.0": - version: 5.20.0 - resolution: "@datadog/browser-core@npm:5.20.0" - checksum: 82fb37ee0d02bda6f958549fd7b0c7f075613172bcb27133d2fa2fb91b22f6b4b1002042c0e96960993ebf0cde1d14aa55cdfaa2bc99bc358a793e491563d5c2 - languageName: node - linkType: hard - -"@datadog/browser-core@npm:5.23.3": - version: 5.23.3 - resolution: "@datadog/browser-core@npm:5.23.3" - checksum: 0d3b2af985b332a584d4ff6f3b5b688bb6da8153df34804a44e31815875949cd902695e1d13e4b5bcf964a857b0a31f0947c8b8cda9b948749b15c20ab0b76da - languageName: node - linkType: hard - -"@datadog/browser-logs@npm:5.20.0": - version: 5.20.0 - resolution: "@datadog/browser-logs@npm:5.20.0" - dependencies: - "@datadog/browser-core": 5.20.0 - peerDependencies: - "@datadog/browser-rum": 5.20.0 - peerDependenciesMeta: - "@datadog/browser-rum": - optional: true - checksum: d3ead69bb892e7d4015c58bdf180a318e0e2efcb572e503334852a458c31014b26b9948b1aec759b6b5a2fc743045b071be6a58685b191249b3bc4235b407fca - languageName: node - linkType: hard - -"@datadog/browser-rum-core@npm:5.23.3": - version: 5.23.3 - resolution: "@datadog/browser-rum-core@npm:5.23.3" - dependencies: - "@datadog/browser-core": 5.23.3 - checksum: d72be8d7ddcecd64a2ad7191379b738fed5077156cd63d1c1e889956d912759c9f68729962bd04b6ae257d016be40eaeaa365a4a98574ed7fefc3db32eb85b14 - languageName: node - linkType: hard - -"@datadog/browser-rum@npm:5.23.3": - version: 5.23.3 - resolution: "@datadog/browser-rum@npm:5.23.3" - dependencies: - "@datadog/browser-core": 5.23.3 - "@datadog/browser-rum-core": 5.23.3 - peerDependencies: - "@datadog/browser-logs": 5.23.3 - peerDependenciesMeta: - "@datadog/browser-logs": - optional: true - checksum: f0b8705a4667e4842981a2c4c3d2014b2d32946579088d3bfacfc80f4e95f5826e19dda186021d3af315cf8e7765267f8c90a98a3e65479a26f154c9d9654b11 - languageName: node - linkType: hard - -"@datadog/datadog-ci@npm:2.39.0": - version: 2.39.0 - resolution: "@datadog/datadog-ci@npm:2.39.0" - dependencies: - "@aws-sdk/client-cloudwatch-logs": ^3.537.0 - "@aws-sdk/client-iam": ^3.535.0 - "@aws-sdk/client-lambda": ^3.536.0 - "@aws-sdk/client-sfn": ^3.535.0 - "@aws-sdk/core": ^3.535.0 - "@aws-sdk/credential-provider-ini": ^3.535.0 - "@aws-sdk/credential-providers": ^3.535.0 - "@google-cloud/logging": ^11.0.0 - "@google-cloud/run": ^1.0.2 - "@smithy/property-provider": ^2.0.12 - "@smithy/util-retry": ^2.0.4 - "@types/datadog-metrics": 0.6.1 - "@types/retry": 0.12.0 - ajv: ^8.12.0 - ajv-formats: ^2.1.1 - async-retry: 1.3.1 - axios: ^1.6.8 - chalk: 3.0.0 - clipanion: ^3.2.1 - datadog-metrics: 0.9.3 - deep-extend: 0.6.0 - deep-object-diff: ^1.1.9 - fast-xml-parser: ^4.2.5 - form-data: 4.0.0 - fuzzy: ^0.1.3 - glob: 7.1.4 - google-auth-library: ^8.9.0 - inquirer: ^8.2.5 - inquirer-checkbox-plus-prompt: ^1.4.2 - js-yaml: 3.13.1 - jszip: ^3.10.1 - ora: 5.4.1 - proxy-agent: ^6.4.0 - rimraf: ^3.0.2 - semver: ^7.5.3 - simple-git: 3.16.0 - ssh2: ^1.15.0 - ssh2-streams: 0.4.10 - sshpk: 1.16.1 - terminal-link: 2.1.1 - tiny-async-pool: ^2.1.0 - typanion: ^3.14.0 - uuid: ^9.0.0 - ws: ^7.5.10 - xml2js: 0.5.0 - yamux-js: 0.1.2 - bin: - datadog-ci: dist/cli.js - checksum: 4dfa17fdb6180a65c1227f9dc742f1b3a0da20bd51e00e98dbe706dbd297bb69bc67e8b5de2f5a4ca5d5cc63ade9bab9994601424b000a9270703cc568efdf11 - languageName: node - linkType: hard - -"@datadog/mobile-react-native@npm:2.4.1": - version: 2.4.1 - resolution: "@datadog/mobile-react-native@npm:2.4.1" - peerDependencies: - react: ">=16.13.1" - react-native: ">=0.63.4 <1.0" - checksum: 7c7ce70a09b5f743556d5bc410dc57f11aeb43eb183211898394cd0b37e40f6102c47369eba9c76d844b069b8e225f276887ef9fc4c4346b656322bbc750bb9e - languageName: node - linkType: hard - -"@datadog/mobile-react-navigation@npm:2.4.1": - version: 2.4.1 - resolution: "@datadog/mobile-react-navigation@npm:2.4.1" - peerDependencies: - "@datadog/mobile-react-native": ^2.0.1 - react: ">=16.13.1" - react-native: ">=0.63.4 <1.0" - checksum: 9df2859b1581bd69688f97dc5ebdefd59a18a0c646ea741e0657d1fd7437d181806345980057d58611807fa7d48bf73fdbe7208c9b16268f256fc8ee24b9d2c3 - languageName: node - linkType: hard - -"@dependents/detective-less@npm:^3.0.1": - version: 3.0.2 - resolution: "@dependents/detective-less@npm:3.0.2" - dependencies: - gonzales-pe: ^4.3.0 - node-source-walk: ^5.0.1 - checksum: 2c263ab64fcd1f76117bc35f2b29a150c64bd2b105c96a909a63ce2f2baf07efd93d9ae80e612161d003fb71fbe46598292375f5cc3f447a1b83cfb545dc8f8f - languageName: node - linkType: hard - -"@discoveryjs/json-ext@npm:0.5.7, @discoveryjs/json-ext@npm:^0.5.0": - version: 0.5.7 - resolution: "@discoveryjs/json-ext@npm:0.5.7" - checksum: 2176d301cc258ea5c2324402997cf8134ebb212469c0d397591636cea8d3c02f2b3cf9fd58dcb748c7a0dade77ebdc1b10284fa63e608c033a1db52fddc69918 - languageName: node - linkType: hard - -"@egjs/hammerjs@npm:^2.0.17": - version: 2.0.17 - resolution: "@egjs/hammerjs@npm:2.0.17" - dependencies: - "@types/hammerjs": ^2.0.36 - checksum: 8945137cec5837edd70af3f2e0ea621543eb0aa3b667e6269ec6485350f4d120c2434b37c7c30b1cf42a65275dd61c1f24626749c616696d3956ac0c008c4766 - languageName: node - linkType: hard - -"@electron/get@npm:^2.0.0": - version: 2.0.2 - resolution: "@electron/get@npm:2.0.2" - dependencies: - debug: ^4.1.1 - env-paths: ^2.2.0 - fs-extra: ^8.1.0 - global-agent: ^3.0.0 - got: ^11.8.5 - progress: ^2.0.3 - semver: ^6.2.0 - sumchecker: ^3.0.1 - dependenciesMeta: - global-agent: - optional: true - checksum: 900845cc0b31b54761fc9b0ada2dea1e999e59aacc48999d53903bcb7c9a0a7356b5fe736cf610b2a56c5a21f5a3c0e083b2ed2b7e52c36a4d0f420d4b5ec268 - languageName: node - linkType: hard - -"@emotion/cache@npm:^10.0.27": - version: 10.0.29 - resolution: "@emotion/cache@npm:10.0.29" - dependencies: - "@emotion/sheet": 0.9.4 - "@emotion/stylis": 0.8.5 - "@emotion/utils": 0.11.3 - "@emotion/weak-memoize": 0.2.5 - checksum: 78b37fb0c2e513c90143a927abef229e995b6738ef8a92ce17abe2ed409b38859ddda7c14d7f4854d6f4e450b6db50231532f53a7fec4903d7ae775b2ae3fd64 - languageName: node - linkType: hard - -"@emotion/core@npm:^10.0.0": - version: 10.3.1 - resolution: "@emotion/core@npm:10.3.1" - dependencies: - "@babel/runtime": ^7.5.5 - "@emotion/cache": ^10.0.27 - "@emotion/css": ^10.0.27 - "@emotion/serialize": ^0.11.15 - "@emotion/sheet": 0.9.4 - "@emotion/utils": 0.11.3 - peerDependencies: - react: ">=16.3.0" - checksum: d2dad428e1b2cf0777badfb55e262d369273be9b2e6e9e7d61c953066c00811d544a6234db36b17ee07872ed092f4dd102bf6ffe2c76fc38d53eef3a60fddfd0 - languageName: node - linkType: hard - -"@emotion/css@npm:^10.0.27": - version: 10.0.27 - resolution: "@emotion/css@npm:10.0.27" - dependencies: - "@emotion/serialize": ^0.11.15 - "@emotion/utils": 0.11.3 - babel-plugin-emotion: ^10.0.27 - checksum: 1420f5b514fc3a8500bcf90384b309b0d9acc9f687ec3a655166b55dc81d1661d6b6132ea6fe6730d0071c10da93bf9427937c22a90a18088af4ba5e11d59141 - languageName: node - linkType: hard - -"@emotion/hash@npm:0.8.0": - version: 0.8.0 - resolution: "@emotion/hash@npm:0.8.0" - checksum: 4b35d88a97e67275c1d990c96d3b0450451d089d1508619488fc0acb882cb1ac91e93246d471346ebd1b5402215941ef4162efe5b51534859b39d8b3a0e3ffaa - languageName: node - linkType: hard - -"@emotion/hash@npm:^0.9.0": - version: 0.9.1 - resolution: "@emotion/hash@npm:0.9.1" - checksum: 716e17e48bf9047bf9383982c071de49f2615310fb4e986738931776f5a823bc1f29c84501abe0d3df91a3803c80122d24e28b57351bca9e01356ebb33d89876 - languageName: node - linkType: hard - -"@emotion/is-prop-valid@npm:0.8.8, @emotion/is-prop-valid@npm:^0.8.1, @emotion/is-prop-valid@npm:^0.8.2": - version: 0.8.8 - resolution: "@emotion/is-prop-valid@npm:0.8.8" - dependencies: - "@emotion/memoize": 0.7.4 - checksum: bb7ec6d48c572c540e24e47cc94fc2f8dec2d6a342ae97bc9c8b6388d9b8d283862672172a1bb62d335c02662afe6291e10c71e9b8642664a8b43416cdceffac - languageName: node - linkType: hard - -"@emotion/is-prop-valid@npm:^1.1.0": - version: 1.2.2 - resolution: "@emotion/is-prop-valid@npm:1.2.2" - dependencies: - "@emotion/memoize": ^0.8.1 - checksum: 61f6b128ea62b9f76b47955057d5d86fcbe2a6989d2cd1e583daac592901a950475a37d049b9f7a7c6aa8758a33b408735db759fdedfd1f629df0f85ab60ea25 - languageName: node - linkType: hard - -"@emotion/memoize@npm:0.7.4": - version: 0.7.4 - resolution: "@emotion/memoize@npm:0.7.4" - checksum: 4e3920d4ec95995657a37beb43d3f4b7d89fed6caa2b173a4c04d10482d089d5c3ea50bbc96618d918b020f26ed6e9c4026bbd45433566576c1f7b056c3271dc - languageName: node - linkType: hard - -"@emotion/memoize@npm:^0.7.1": - version: 0.7.5 - resolution: "@emotion/memoize@npm:0.7.5" - checksum: 83da8d4a7649a92c72f960817692bc6be13cc13e107b9f7e878d63766525ed4402881bfeb3cda61145c050281e7e260f114a0a2870515527346f2ef896b915b3 - languageName: node - linkType: hard - -"@emotion/memoize@npm:^0.8.1": - version: 0.8.1 - resolution: "@emotion/memoize@npm:0.8.1" - checksum: a19cc01a29fcc97514948eaab4dc34d8272e934466ed87c07f157887406bc318000c69ae6f813a9001c6a225364df04249842a50e692ef7a9873335fbcc141b0 - languageName: node - linkType: hard - -"@emotion/serialize@npm:^0.11.15, @emotion/serialize@npm:^0.11.16": - version: 0.11.16 - resolution: "@emotion/serialize@npm:0.11.16" - dependencies: - "@emotion/hash": 0.8.0 - "@emotion/memoize": 0.7.4 - "@emotion/unitless": 0.7.5 - "@emotion/utils": 0.11.3 - csstype: ^2.5.7 - checksum: 2949832fab9d803e6236f2af6aad021c09c6b6722ae910b06b4ec3bfb84d77cbecfe3eab9a7dcc269ac73e672ef4b696c7836825931670cb110731712e331438 - languageName: node - linkType: hard - -"@emotion/sheet@npm:0.9.4": - version: 0.9.4 - resolution: "@emotion/sheet@npm:0.9.4" - checksum: 53bb833b4bb69ea2af04e1ecad164f78fb2614834d2820f584c909686a8e047c44e96a6e824798c5c558e6d95e10772454a9e5c473c5dbe0d198e50deb2815bc - languageName: node - linkType: hard - -"@emotion/styled-base@npm:^10.3.0": - version: 10.3.0 - resolution: "@emotion/styled-base@npm:10.3.0" - dependencies: - "@babel/runtime": ^7.5.5 - "@emotion/is-prop-valid": 0.8.8 - "@emotion/serialize": ^0.11.15 - "@emotion/utils": 0.11.3 - peerDependencies: - "@emotion/core": ^10.0.28 - react: ">=16.3.0" - checksum: ac0bb8f39e92fda12686afe5d398f7215cc7276d66195d5937f58ee7dae516e58017594cc74deed72859043623db824fdaf8213d29276316749ebff2ef7a5e4d - languageName: node - linkType: hard - -"@emotion/styled@npm:^10.0.0": - version: 10.3.0 - resolution: "@emotion/styled@npm:10.3.0" - dependencies: - "@emotion/styled-base": ^10.3.0 - babel-plugin-emotion: ^10.0.27 - peerDependencies: - "@emotion/core": ^10.0.27 - react: ">=16.3.0" - checksum: 9d9609c008c009d8b9249fdbb2017a404b1fc6c9118c84ec9a916e86670d4c61f03fee24297ad10b460dab628ff8260066338617ee99ede3ae7969ce5995e9bc - languageName: node - linkType: hard - -"@emotion/stylis@npm:0.8.5, @emotion/stylis@npm:^0.8.4": - version: 0.8.5 - resolution: "@emotion/stylis@npm:0.8.5" - checksum: 67ff5958449b2374b329fb96e83cb9025775ffe1e79153b499537c6c8b2eb64b77f32d7b5d004d646973662356ceb646afd9269001b97c54439fceea3203ce65 - languageName: node - linkType: hard - -"@emotion/unitless@npm:0.7.5, @emotion/unitless@npm:^0.7.4": - version: 0.7.5 - resolution: "@emotion/unitless@npm:0.7.5" - checksum: f976e5345b53fae9414a7b2e7a949aa6b52f8bdbcc84458b1ddc0729e77ba1d1dfdff9960e0da60183877873d3a631fa24d9695dd714ed94bcd3ba5196586a6b - languageName: node - linkType: hard - -"@emotion/utils@npm:0.11.3": - version: 0.11.3 - resolution: "@emotion/utils@npm:0.11.3" - checksum: 9c4204bda84f9acd153a9be9478a83f9baa74d5d7a4c21882681c4d1b86cd113b84540cb1f92e1c30313b5075f024da2658dbc553f5b00776ef9b6ec7991c0c9 - languageName: node - linkType: hard - -"@emotion/weak-memoize@npm:0.2.5": - version: 0.2.5 - resolution: "@emotion/weak-memoize@npm:0.2.5" - checksum: 27d402b0c683b94658220b6d47840346ee582329ca2a15ec9c233492e0f1a27687ccb233b76eedc922f2e185e444cc89f7b97a81a1d3e5ae9f075bab08e965ea - languageName: node - linkType: hard - -"@esbuild-plugins/node-globals-polyfill@npm:^0.2.3": - version: 0.2.3 - resolution: "@esbuild-plugins/node-globals-polyfill@npm:0.2.3" - peerDependencies: - esbuild: "*" - checksum: f83eeaa382680b26a3b1cf6c396450332c41d2dc0f9fd935d3f4bacf5412bef7383d2aeb4246a858781435b7c005a570dadc81051f8a038f1ef2111f17d3d8b0 - languageName: node - linkType: hard - -"@esbuild-plugins/node-modules-polyfill@npm:^0.2.2": - version: 0.2.2 - resolution: "@esbuild-plugins/node-modules-polyfill@npm:0.2.2" - dependencies: - escape-string-regexp: ^4.0.0 - rollup-plugin-node-polyfills: ^0.2.1 - peerDependencies: - esbuild: "*" - checksum: 73c247a7559c68b7df080ab08dd3d0b0ab44b934840a4933df9626357b7183a9a5d8cf4ffa9c744f1bad8d7131bce0fde14a23203f7b262f9f14f7b3485bfdb1 - languageName: node - linkType: hard - -"@esbuild/aix-ppc64@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/aix-ppc64@npm:0.19.12" - conditions: os=aix & cpu=ppc64 - languageName: node - linkType: hard - -"@esbuild/aix-ppc64@npm:0.21.5": - version: 0.21.5 - resolution: "@esbuild/aix-ppc64@npm:0.21.5" - conditions: os=aix & cpu=ppc64 - languageName: node - linkType: hard - -"@esbuild/aix-ppc64@npm:0.24.0": - version: 0.24.0 - resolution: "@esbuild/aix-ppc64@npm:0.24.0" - conditions: os=aix & cpu=ppc64 - languageName: node - linkType: hard - -"@esbuild/android-arm64@npm:0.17.19": - version: 0.17.19 - resolution: "@esbuild/android-arm64@npm:0.17.19" - conditions: os=android & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/android-arm64@npm:0.17.6": - version: 0.17.6 - resolution: "@esbuild/android-arm64@npm:0.17.6" - conditions: os=android & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/android-arm64@npm:0.18.20": - version: 0.18.20 - resolution: "@esbuild/android-arm64@npm:0.18.20" - conditions: os=android & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/android-arm64@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/android-arm64@npm:0.19.12" - conditions: os=android & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/android-arm64@npm:0.21.5": - version: 0.21.5 - resolution: "@esbuild/android-arm64@npm:0.21.5" - conditions: os=android & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/android-arm64@npm:0.24.0": - version: 0.24.0 - resolution: "@esbuild/android-arm64@npm:0.24.0" - conditions: os=android & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/android-arm@npm:0.17.19": - version: 0.17.19 - resolution: "@esbuild/android-arm@npm:0.17.19" - conditions: os=android & cpu=arm - languageName: node - linkType: hard - -"@esbuild/android-arm@npm:0.17.6": - version: 0.17.6 - resolution: "@esbuild/android-arm@npm:0.17.6" - conditions: os=android & cpu=arm - languageName: node - linkType: hard - -"@esbuild/android-arm@npm:0.18.20": - version: 0.18.20 - resolution: "@esbuild/android-arm@npm:0.18.20" - conditions: os=android & cpu=arm - languageName: node - linkType: hard - -"@esbuild/android-arm@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/android-arm@npm:0.19.12" - conditions: os=android & cpu=arm - languageName: node - linkType: hard - -"@esbuild/android-arm@npm:0.21.5": - version: 0.21.5 - resolution: "@esbuild/android-arm@npm:0.21.5" - conditions: os=android & cpu=arm - languageName: node - linkType: hard - -"@esbuild/android-arm@npm:0.24.0": - version: 0.24.0 - resolution: "@esbuild/android-arm@npm:0.24.0" - conditions: os=android & cpu=arm - languageName: node - linkType: hard - -"@esbuild/android-x64@npm:0.17.19": - version: 0.17.19 - resolution: "@esbuild/android-x64@npm:0.17.19" - conditions: os=android & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/android-x64@npm:0.17.6": - version: 0.17.6 - resolution: "@esbuild/android-x64@npm:0.17.6" - conditions: os=android & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/android-x64@npm:0.18.20": - version: 0.18.20 - resolution: "@esbuild/android-x64@npm:0.18.20" - conditions: os=android & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/android-x64@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/android-x64@npm:0.19.12" - conditions: os=android & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/android-x64@npm:0.21.5": - version: 0.21.5 - resolution: "@esbuild/android-x64@npm:0.21.5" - conditions: os=android & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/android-x64@npm:0.24.0": - version: 0.24.0 - resolution: "@esbuild/android-x64@npm:0.24.0" - conditions: os=android & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/darwin-arm64@npm:0.17.19": - version: 0.17.19 - resolution: "@esbuild/darwin-arm64@npm:0.17.19" - conditions: os=darwin & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/darwin-arm64@npm:0.17.6": - version: 0.17.6 - resolution: "@esbuild/darwin-arm64@npm:0.17.6" - conditions: os=darwin & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/darwin-arm64@npm:0.18.20": - version: 0.18.20 - resolution: "@esbuild/darwin-arm64@npm:0.18.20" - conditions: os=darwin & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/darwin-arm64@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/darwin-arm64@npm:0.19.12" - conditions: os=darwin & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/darwin-arm64@npm:0.21.5": - version: 0.21.5 - resolution: "@esbuild/darwin-arm64@npm:0.21.5" - conditions: os=darwin & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/darwin-arm64@npm:0.24.0": - version: 0.24.0 - resolution: "@esbuild/darwin-arm64@npm:0.24.0" - conditions: os=darwin & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/darwin-x64@npm:0.17.19": - version: 0.17.19 - resolution: "@esbuild/darwin-x64@npm:0.17.19" - conditions: os=darwin & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/darwin-x64@npm:0.17.6": - version: 0.17.6 - resolution: "@esbuild/darwin-x64@npm:0.17.6" - conditions: os=darwin & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/darwin-x64@npm:0.18.20": - version: 0.18.20 - resolution: "@esbuild/darwin-x64@npm:0.18.20" - conditions: os=darwin & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/darwin-x64@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/darwin-x64@npm:0.19.12" - conditions: os=darwin & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/darwin-x64@npm:0.21.5": - version: 0.21.5 - resolution: "@esbuild/darwin-x64@npm:0.21.5" - conditions: os=darwin & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/darwin-x64@npm:0.24.0": - version: 0.24.0 - resolution: "@esbuild/darwin-x64@npm:0.24.0" - conditions: os=darwin & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/freebsd-arm64@npm:0.17.19": - version: 0.17.19 - resolution: "@esbuild/freebsd-arm64@npm:0.17.19" - conditions: os=freebsd & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/freebsd-arm64@npm:0.17.6": - version: 0.17.6 - resolution: "@esbuild/freebsd-arm64@npm:0.17.6" - conditions: os=freebsd & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/freebsd-arm64@npm:0.18.20": - version: 0.18.20 - resolution: "@esbuild/freebsd-arm64@npm:0.18.20" - conditions: os=freebsd & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/freebsd-arm64@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/freebsd-arm64@npm:0.19.12" - conditions: os=freebsd & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/freebsd-arm64@npm:0.21.5": - version: 0.21.5 - resolution: "@esbuild/freebsd-arm64@npm:0.21.5" - conditions: os=freebsd & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/freebsd-arm64@npm:0.24.0": - version: 0.24.0 - resolution: "@esbuild/freebsd-arm64@npm:0.24.0" - conditions: os=freebsd & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/freebsd-x64@npm:0.17.19": - version: 0.17.19 - resolution: "@esbuild/freebsd-x64@npm:0.17.19" - conditions: os=freebsd & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/freebsd-x64@npm:0.17.6": - version: 0.17.6 - resolution: "@esbuild/freebsd-x64@npm:0.17.6" - conditions: os=freebsd & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/freebsd-x64@npm:0.18.20": - version: 0.18.20 - resolution: "@esbuild/freebsd-x64@npm:0.18.20" - conditions: os=freebsd & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/freebsd-x64@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/freebsd-x64@npm:0.19.12" - conditions: os=freebsd & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/freebsd-x64@npm:0.21.5": - version: 0.21.5 - resolution: "@esbuild/freebsd-x64@npm:0.21.5" - conditions: os=freebsd & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/freebsd-x64@npm:0.24.0": - version: 0.24.0 - resolution: "@esbuild/freebsd-x64@npm:0.24.0" - conditions: os=freebsd & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/linux-arm64@npm:0.17.19": - version: 0.17.19 - resolution: "@esbuild/linux-arm64@npm:0.17.19" - conditions: os=linux & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/linux-arm64@npm:0.17.6": - version: 0.17.6 - resolution: "@esbuild/linux-arm64@npm:0.17.6" - conditions: os=linux & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/linux-arm64@npm:0.18.20": - version: 0.18.20 - resolution: "@esbuild/linux-arm64@npm:0.18.20" - conditions: os=linux & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/linux-arm64@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/linux-arm64@npm:0.19.12" - conditions: os=linux & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/linux-arm64@npm:0.21.5": - version: 0.21.5 - resolution: "@esbuild/linux-arm64@npm:0.21.5" - conditions: os=linux & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/linux-arm64@npm:0.24.0": - version: 0.24.0 - resolution: "@esbuild/linux-arm64@npm:0.24.0" - conditions: os=linux & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/linux-arm@npm:0.17.19": - version: 0.17.19 - resolution: "@esbuild/linux-arm@npm:0.17.19" - conditions: os=linux & cpu=arm - languageName: node - linkType: hard - -"@esbuild/linux-arm@npm:0.17.6": - version: 0.17.6 - resolution: "@esbuild/linux-arm@npm:0.17.6" - conditions: os=linux & cpu=arm - languageName: node - linkType: hard - -"@esbuild/linux-arm@npm:0.18.20": - version: 0.18.20 - resolution: "@esbuild/linux-arm@npm:0.18.20" - conditions: os=linux & cpu=arm - languageName: node - linkType: hard - -"@esbuild/linux-arm@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/linux-arm@npm:0.19.12" - conditions: os=linux & cpu=arm - languageName: node - linkType: hard - -"@esbuild/linux-arm@npm:0.21.5": - version: 0.21.5 - resolution: "@esbuild/linux-arm@npm:0.21.5" - conditions: os=linux & cpu=arm - languageName: node - linkType: hard - -"@esbuild/linux-arm@npm:0.24.0": - version: 0.24.0 - resolution: "@esbuild/linux-arm@npm:0.24.0" - conditions: os=linux & cpu=arm - languageName: node - linkType: hard - -"@esbuild/linux-ia32@npm:0.17.19": - version: 0.17.19 - resolution: "@esbuild/linux-ia32@npm:0.17.19" - conditions: os=linux & cpu=ia32 - languageName: node - linkType: hard - -"@esbuild/linux-ia32@npm:0.17.6": - version: 0.17.6 - resolution: "@esbuild/linux-ia32@npm:0.17.6" - conditions: os=linux & cpu=ia32 - languageName: node - linkType: hard - -"@esbuild/linux-ia32@npm:0.18.20": - version: 0.18.20 - resolution: "@esbuild/linux-ia32@npm:0.18.20" - conditions: os=linux & cpu=ia32 - languageName: node - linkType: hard - -"@esbuild/linux-ia32@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/linux-ia32@npm:0.19.12" - conditions: os=linux & cpu=ia32 - languageName: node - linkType: hard - -"@esbuild/linux-ia32@npm:0.21.5": - version: 0.21.5 - resolution: "@esbuild/linux-ia32@npm:0.21.5" - conditions: os=linux & cpu=ia32 - languageName: node - linkType: hard - -"@esbuild/linux-ia32@npm:0.24.0": - version: 0.24.0 - resolution: "@esbuild/linux-ia32@npm:0.24.0" - conditions: os=linux & cpu=ia32 - languageName: node - linkType: hard - -"@esbuild/linux-loong64@npm:0.17.19": - version: 0.17.19 - resolution: "@esbuild/linux-loong64@npm:0.17.19" - conditions: os=linux & cpu=loong64 - languageName: node - linkType: hard - -"@esbuild/linux-loong64@npm:0.17.6": - version: 0.17.6 - resolution: "@esbuild/linux-loong64@npm:0.17.6" - conditions: os=linux & cpu=loong64 - languageName: node - linkType: hard - -"@esbuild/linux-loong64@npm:0.18.20": - version: 0.18.20 - resolution: "@esbuild/linux-loong64@npm:0.18.20" - conditions: os=linux & cpu=loong64 - languageName: node - linkType: hard - -"@esbuild/linux-loong64@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/linux-loong64@npm:0.19.12" - conditions: os=linux & cpu=loong64 - languageName: node - linkType: hard - -"@esbuild/linux-loong64@npm:0.21.5": - version: 0.21.5 - resolution: "@esbuild/linux-loong64@npm:0.21.5" - conditions: os=linux & cpu=loong64 - languageName: node - linkType: hard - -"@esbuild/linux-loong64@npm:0.24.0": - version: 0.24.0 - resolution: "@esbuild/linux-loong64@npm:0.24.0" - conditions: os=linux & cpu=loong64 - languageName: node - linkType: hard - -"@esbuild/linux-mips64el@npm:0.17.19": - version: 0.17.19 - resolution: "@esbuild/linux-mips64el@npm:0.17.19" - conditions: os=linux & cpu=mips64el - languageName: node - linkType: hard - -"@esbuild/linux-mips64el@npm:0.17.6": - version: 0.17.6 - resolution: "@esbuild/linux-mips64el@npm:0.17.6" - conditions: os=linux & cpu=mips64el - languageName: node - linkType: hard - -"@esbuild/linux-mips64el@npm:0.18.20": - version: 0.18.20 - resolution: "@esbuild/linux-mips64el@npm:0.18.20" - conditions: os=linux & cpu=mips64el - languageName: node - linkType: hard - -"@esbuild/linux-mips64el@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/linux-mips64el@npm:0.19.12" - conditions: os=linux & cpu=mips64el - languageName: node - linkType: hard - -"@esbuild/linux-mips64el@npm:0.21.5": - version: 0.21.5 - resolution: "@esbuild/linux-mips64el@npm:0.21.5" - conditions: os=linux & cpu=mips64el - languageName: node - linkType: hard - -"@esbuild/linux-mips64el@npm:0.24.0": - version: 0.24.0 - resolution: "@esbuild/linux-mips64el@npm:0.24.0" - conditions: os=linux & cpu=mips64el - languageName: node - linkType: hard - -"@esbuild/linux-ppc64@npm:0.17.19": - version: 0.17.19 - resolution: "@esbuild/linux-ppc64@npm:0.17.19" - conditions: os=linux & cpu=ppc64 - languageName: node - linkType: hard - -"@esbuild/linux-ppc64@npm:0.17.6": - version: 0.17.6 - resolution: "@esbuild/linux-ppc64@npm:0.17.6" - conditions: os=linux & cpu=ppc64 - languageName: node - linkType: hard - -"@esbuild/linux-ppc64@npm:0.18.20": - version: 0.18.20 - resolution: "@esbuild/linux-ppc64@npm:0.18.20" - conditions: os=linux & cpu=ppc64 - languageName: node - linkType: hard - -"@esbuild/linux-ppc64@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/linux-ppc64@npm:0.19.12" - conditions: os=linux & cpu=ppc64 - languageName: node - linkType: hard - -"@esbuild/linux-ppc64@npm:0.21.5": - version: 0.21.5 - resolution: "@esbuild/linux-ppc64@npm:0.21.5" - conditions: os=linux & cpu=ppc64 - languageName: node - linkType: hard - -"@esbuild/linux-ppc64@npm:0.24.0": - version: 0.24.0 - resolution: "@esbuild/linux-ppc64@npm:0.24.0" - conditions: os=linux & cpu=ppc64 - languageName: node - linkType: hard - -"@esbuild/linux-riscv64@npm:0.17.19": - version: 0.17.19 - resolution: "@esbuild/linux-riscv64@npm:0.17.19" - conditions: os=linux & cpu=riscv64 - languageName: node - linkType: hard - -"@esbuild/linux-riscv64@npm:0.17.6": - version: 0.17.6 - resolution: "@esbuild/linux-riscv64@npm:0.17.6" - conditions: os=linux & cpu=riscv64 - languageName: node - linkType: hard - -"@esbuild/linux-riscv64@npm:0.18.20": - version: 0.18.20 - resolution: "@esbuild/linux-riscv64@npm:0.18.20" - conditions: os=linux & cpu=riscv64 - languageName: node - linkType: hard - -"@esbuild/linux-riscv64@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/linux-riscv64@npm:0.19.12" - conditions: os=linux & cpu=riscv64 - languageName: node - linkType: hard - -"@esbuild/linux-riscv64@npm:0.21.5": - version: 0.21.5 - resolution: "@esbuild/linux-riscv64@npm:0.21.5" - conditions: os=linux & cpu=riscv64 - languageName: node - linkType: hard - -"@esbuild/linux-riscv64@npm:0.24.0": - version: 0.24.0 - resolution: "@esbuild/linux-riscv64@npm:0.24.0" - conditions: os=linux & cpu=riscv64 - languageName: node - linkType: hard - -"@esbuild/linux-s390x@npm:0.17.19": - version: 0.17.19 - resolution: "@esbuild/linux-s390x@npm:0.17.19" - conditions: os=linux & cpu=s390x - languageName: node - linkType: hard - -"@esbuild/linux-s390x@npm:0.17.6": - version: 0.17.6 - resolution: "@esbuild/linux-s390x@npm:0.17.6" - conditions: os=linux & cpu=s390x - languageName: node - linkType: hard - -"@esbuild/linux-s390x@npm:0.18.20": - version: 0.18.20 - resolution: "@esbuild/linux-s390x@npm:0.18.20" - conditions: os=linux & cpu=s390x - languageName: node - linkType: hard - -"@esbuild/linux-s390x@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/linux-s390x@npm:0.19.12" - conditions: os=linux & cpu=s390x - languageName: node - linkType: hard - -"@esbuild/linux-s390x@npm:0.21.5": - version: 0.21.5 - resolution: "@esbuild/linux-s390x@npm:0.21.5" - conditions: os=linux & cpu=s390x - languageName: node - linkType: hard - -"@esbuild/linux-s390x@npm:0.24.0": - version: 0.24.0 - resolution: "@esbuild/linux-s390x@npm:0.24.0" - conditions: os=linux & cpu=s390x - languageName: node - linkType: hard - -"@esbuild/linux-x64@npm:0.17.19": - version: 0.17.19 - resolution: "@esbuild/linux-x64@npm:0.17.19" - conditions: os=linux & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/linux-x64@npm:0.17.6": - version: 0.17.6 - resolution: "@esbuild/linux-x64@npm:0.17.6" - conditions: os=linux & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/linux-x64@npm:0.18.20": - version: 0.18.20 - resolution: "@esbuild/linux-x64@npm:0.18.20" - conditions: os=linux & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/linux-x64@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/linux-x64@npm:0.19.12" - conditions: os=linux & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/linux-x64@npm:0.21.5": - version: 0.21.5 - resolution: "@esbuild/linux-x64@npm:0.21.5" - conditions: os=linux & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/linux-x64@npm:0.24.0": - version: 0.24.0 - resolution: "@esbuild/linux-x64@npm:0.24.0" - conditions: os=linux & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/netbsd-x64@npm:0.17.19": - version: 0.17.19 - resolution: "@esbuild/netbsd-x64@npm:0.17.19" - conditions: os=netbsd & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/netbsd-x64@npm:0.17.6": - version: 0.17.6 - resolution: "@esbuild/netbsd-x64@npm:0.17.6" - conditions: os=netbsd & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/netbsd-x64@npm:0.18.20": - version: 0.18.20 - resolution: "@esbuild/netbsd-x64@npm:0.18.20" - conditions: os=netbsd & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/netbsd-x64@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/netbsd-x64@npm:0.19.12" - conditions: os=netbsd & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/netbsd-x64@npm:0.21.5": - version: 0.21.5 - resolution: "@esbuild/netbsd-x64@npm:0.21.5" - conditions: os=netbsd & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/netbsd-x64@npm:0.24.0": - version: 0.24.0 - resolution: "@esbuild/netbsd-x64@npm:0.24.0" - conditions: os=netbsd & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/openbsd-arm64@npm:0.24.0": - version: 0.24.0 - resolution: "@esbuild/openbsd-arm64@npm:0.24.0" - conditions: os=openbsd & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/openbsd-x64@npm:0.17.19": - version: 0.17.19 - resolution: "@esbuild/openbsd-x64@npm:0.17.19" - conditions: os=openbsd & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/openbsd-x64@npm:0.17.6": - version: 0.17.6 - resolution: "@esbuild/openbsd-x64@npm:0.17.6" - conditions: os=openbsd & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/openbsd-x64@npm:0.18.20": - version: 0.18.20 - resolution: "@esbuild/openbsd-x64@npm:0.18.20" - conditions: os=openbsd & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/openbsd-x64@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/openbsd-x64@npm:0.19.12" - conditions: os=openbsd & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/openbsd-x64@npm:0.21.5": - version: 0.21.5 - resolution: "@esbuild/openbsd-x64@npm:0.21.5" - conditions: os=openbsd & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/openbsd-x64@npm:0.24.0": - version: 0.24.0 - resolution: "@esbuild/openbsd-x64@npm:0.24.0" - conditions: os=openbsd & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/sunos-x64@npm:0.17.19": - version: 0.17.19 - resolution: "@esbuild/sunos-x64@npm:0.17.19" - conditions: os=sunos & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/sunos-x64@npm:0.17.6": - version: 0.17.6 - resolution: "@esbuild/sunos-x64@npm:0.17.6" - conditions: os=sunos & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/sunos-x64@npm:0.18.20": - version: 0.18.20 - resolution: "@esbuild/sunos-x64@npm:0.18.20" - conditions: os=sunos & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/sunos-x64@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/sunos-x64@npm:0.19.12" - conditions: os=sunos & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/sunos-x64@npm:0.21.5": - version: 0.21.5 - resolution: "@esbuild/sunos-x64@npm:0.21.5" - conditions: os=sunos & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/sunos-x64@npm:0.24.0": - version: 0.24.0 - resolution: "@esbuild/sunos-x64@npm:0.24.0" - conditions: os=sunos & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/win32-arm64@npm:0.17.19": - version: 0.17.19 - resolution: "@esbuild/win32-arm64@npm:0.17.19" - conditions: os=win32 & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/win32-arm64@npm:0.17.6": - version: 0.17.6 - resolution: "@esbuild/win32-arm64@npm:0.17.6" - conditions: os=win32 & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/win32-arm64@npm:0.18.20": - version: 0.18.20 - resolution: "@esbuild/win32-arm64@npm:0.18.20" - conditions: os=win32 & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/win32-arm64@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/win32-arm64@npm:0.19.12" - conditions: os=win32 & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/win32-arm64@npm:0.21.5": - version: 0.21.5 - resolution: "@esbuild/win32-arm64@npm:0.21.5" - conditions: os=win32 & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/win32-arm64@npm:0.24.0": - version: 0.24.0 - resolution: "@esbuild/win32-arm64@npm:0.24.0" - conditions: os=win32 & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/win32-ia32@npm:0.17.19": - version: 0.17.19 - resolution: "@esbuild/win32-ia32@npm:0.17.19" - conditions: os=win32 & cpu=ia32 - languageName: node - linkType: hard - -"@esbuild/win32-ia32@npm:0.17.6": - version: 0.17.6 - resolution: "@esbuild/win32-ia32@npm:0.17.6" - conditions: os=win32 & cpu=ia32 - languageName: node - linkType: hard - -"@esbuild/win32-ia32@npm:0.18.20": - version: 0.18.20 - resolution: "@esbuild/win32-ia32@npm:0.18.20" - conditions: os=win32 & cpu=ia32 - languageName: node - linkType: hard - -"@esbuild/win32-ia32@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/win32-ia32@npm:0.19.12" - conditions: os=win32 & cpu=ia32 - languageName: node - linkType: hard - -"@esbuild/win32-ia32@npm:0.21.5": - version: 0.21.5 - resolution: "@esbuild/win32-ia32@npm:0.21.5" - conditions: os=win32 & cpu=ia32 - languageName: node - linkType: hard - -"@esbuild/win32-ia32@npm:0.24.0": - version: 0.24.0 - resolution: "@esbuild/win32-ia32@npm:0.24.0" - conditions: os=win32 & cpu=ia32 - languageName: node - linkType: hard - -"@esbuild/win32-x64@npm:0.17.19": - version: 0.17.19 - resolution: "@esbuild/win32-x64@npm:0.17.19" - conditions: os=win32 & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/win32-x64@npm:0.17.6": - version: 0.17.6 - resolution: "@esbuild/win32-x64@npm:0.17.6" - conditions: os=win32 & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/win32-x64@npm:0.18.20": - version: 0.18.20 - resolution: "@esbuild/win32-x64@npm:0.18.20" - conditions: os=win32 & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/win32-x64@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/win32-x64@npm:0.19.12" - conditions: os=win32 & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/win32-x64@npm:0.21.5": - version: 0.21.5 - resolution: "@esbuild/win32-x64@npm:0.21.5" - conditions: os=win32 & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/win32-x64@npm:0.24.0": - version: 0.24.0 - resolution: "@esbuild/win32-x64@npm:0.24.0" - conditions: os=win32 & cpu=x64 - languageName: node - linkType: hard - -"@eslint-community/eslint-utils@npm:^4.2.0, @eslint-community/eslint-utils@npm:^4.4.0": - version: 4.4.0 - resolution: "@eslint-community/eslint-utils@npm:4.4.0" - dependencies: - eslint-visitor-keys: ^3.3.0 - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - checksum: cdfe3ae42b4f572cbfb46d20edafe6f36fc5fb52bf2d90875c58aefe226892b9677fef60820e2832caf864a326fe4fc225714c46e8389ccca04d5f9288aabd22 - languageName: node - linkType: hard - -"@eslint-community/regexpp@npm:^4.4.0, @eslint-community/regexpp@npm:^4.5.1, @eslint-community/regexpp@npm:^4.6.1": - version: 4.12.1 - resolution: "@eslint-community/regexpp@npm:4.12.1" - checksum: 0d628680e204bc316d545b4993d3658427ca404ae646ce541fcc65306b8c712c340e5e573e30fb9f85f4855c0c5f6dca9868931f2fcced06417fbe1a0c6cd2d6 - languageName: node - linkType: hard - -"@eslint/eslintrc@npm:^2.1.0, @eslint/eslintrc@npm:^2.1.4": - version: 2.1.4 - resolution: "@eslint/eslintrc@npm:2.1.4" - dependencies: - ajv: ^6.12.4 - debug: ^4.3.2 - espree: ^9.6.0 - globals: ^13.19.0 - ignore: ^5.2.0 - import-fresh: ^3.2.1 - js-yaml: ^4.1.0 - minimatch: ^3.1.2 - strip-json-comments: ^3.1.1 - checksum: 10957c7592b20ca0089262d8c2a8accbad14b4f6507e35416c32ee6b4dbf9cad67dfb77096bbd405405e9ada2b107f3797fe94362e1c55e0b09d6e90dd149127 - languageName: node - linkType: hard - -"@eslint/js@npm:8.44.0": - version: 8.44.0 - resolution: "@eslint/js@npm:8.44.0" - checksum: fc539583226a28f5677356e9f00d2789c34253f076643d2e32888250e509a4e13aafe0880cb2425139051de0f3a48d25bfc5afa96b7304f203b706c17340e3cf - languageName: node - linkType: hard - -"@eslint/js@npm:8.57.1": - version: 8.57.1 - resolution: "@eslint/js@npm:8.57.1" - checksum: 2afb77454c06e8316793d2e8e79a0154854d35e6782a1217da274ca60b5044d2c69d6091155234ed0551a1e408f86f09dd4ece02752c59568fa403e60611e880 - languageName: node - linkType: hard - -"@ethereumjs/common@npm:^3.2.0": - version: 3.2.0 - resolution: "@ethereumjs/common@npm:3.2.0" - dependencies: - "@ethereumjs/util": ^8.1.0 - crc-32: ^1.2.0 - checksum: cb9cc11f5c868cb577ba611cebf55046e509218bbb89b47ccce010776dafe8256d70f8f43fab238aec74cf71f62601cd5842bc03a83261200802de365732a14b - languageName: node - linkType: hard - -"@ethereumjs/rlp@npm:^4.0.1": - version: 4.0.1 - resolution: "@ethereumjs/rlp@npm:4.0.1" - bin: - rlp: bin/rlp - checksum: 30db19c78faa2b6ff27275ab767646929207bb207f903f09eb3e4c273ce2738b45f3c82169ddacd67468b4f063d8d96035f2bf36f02b6b7e4d928eefe2e3ecbc - languageName: node - linkType: hard - -"@ethereumjs/tx@npm:^4.1.2, @ethereumjs/tx@npm:^4.2.0": - version: 4.2.0 - resolution: "@ethereumjs/tx@npm:4.2.0" - dependencies: - "@ethereumjs/common": ^3.2.0 - "@ethereumjs/rlp": ^4.0.1 - "@ethereumjs/util": ^8.1.0 - ethereum-cryptography: ^2.0.0 - checksum: 87a3f5f2452cfbf6712f8847525a80c213210ed453c211c793c5df801fe35ecef28bae17fadd222fcbdd94277478a47e52d2b916a90a6b30cda21f1e0cdaee42 - languageName: node - linkType: hard - -"@ethereumjs/util@npm:^8.1.0": - version: 8.1.0 - resolution: "@ethereumjs/util@npm:8.1.0" - dependencies: - "@ethereumjs/rlp": ^4.0.1 - ethereum-cryptography: ^2.0.0 - micro-ftch: ^0.3.1 - checksum: 9ae5dee8f12b0faf81cd83f06a41560e79b0ba96a48262771d897a510ecae605eb6d84f687da001ab8ccffd50f612ae50f988ef76e6312c752897f462f3ac08d - languageName: node - linkType: hard - -"@ethersproject/abi@npm:5.4.1": - version: 5.4.1 - resolution: "@ethersproject/abi@npm:5.4.1" - dependencies: - "@ethersproject/address": ^5.4.0 - "@ethersproject/bignumber": ^5.4.0 - "@ethersproject/bytes": ^5.4.0 - "@ethersproject/constants": ^5.4.0 - "@ethersproject/hash": ^5.4.0 - "@ethersproject/keccak256": ^5.4.0 - "@ethersproject/logger": ^5.4.0 - "@ethersproject/properties": ^5.4.0 - "@ethersproject/strings": ^5.4.0 - checksum: 75460eee1d4eeaa438a43a003343dfcd2a8c3b1b7e0d8a3dd31c9200375d52daeea7022622696d1fec54913ec3b72423057236677907793ec134d2601a061fec - languageName: node - linkType: hard - -"@ethersproject/abi@npm:5.7.0, @ethersproject/abi@npm:^5.1.2, @ethersproject/abi@npm:^5.5.0, @ethersproject/abi@npm:^5.7.0": - version: 5.7.0 - resolution: "@ethersproject/abi@npm:5.7.0" - dependencies: - "@ethersproject/address": ^5.7.0 - "@ethersproject/bignumber": ^5.7.0 - "@ethersproject/bytes": ^5.7.0 - "@ethersproject/constants": ^5.7.0 - "@ethersproject/hash": ^5.7.0 - "@ethersproject/keccak256": ^5.7.0 - "@ethersproject/logger": ^5.7.0 - "@ethersproject/properties": ^5.7.0 - "@ethersproject/strings": ^5.7.0 - checksum: bc6962bb6cb854e4d2a4d65b2c49c716477675b131b1363312234bdbb7e19badb7d9ce66f4ca2a70ae2ea84f7123dbc4e300a1bfe5d58864a7eafabc1466627e - languageName: node - linkType: hard - -"@ethersproject/abstract-provider@npm:5.7.0, @ethersproject/abstract-provider@npm:^5.4.0, @ethersproject/abstract-provider@npm:^5.7.0": - version: 5.7.0 - resolution: "@ethersproject/abstract-provider@npm:5.7.0" - dependencies: - "@ethersproject/bignumber": ^5.7.0 - "@ethersproject/bytes": ^5.7.0 - "@ethersproject/logger": ^5.7.0 - "@ethersproject/networks": ^5.7.0 - "@ethersproject/properties": ^5.7.0 - "@ethersproject/transactions": ^5.7.0 - "@ethersproject/web": ^5.7.0 - checksum: 74cf4696245cf03bb7cc5b6cbf7b4b89dd9a79a1c4688126d214153a938126d4972d42c93182198653ce1de35f2a2cad68be40337d4774b3698a39b28f0228a8 - languageName: node - linkType: hard - -"@ethersproject/abstract-signer@npm:5.7.0, @ethersproject/abstract-signer@npm:^5.5.0, @ethersproject/abstract-signer@npm:^5.7.0": - version: 5.7.0 - resolution: "@ethersproject/abstract-signer@npm:5.7.0" - dependencies: - "@ethersproject/abstract-provider": ^5.7.0 - "@ethersproject/bignumber": ^5.7.0 - "@ethersproject/bytes": ^5.7.0 - "@ethersproject/logger": ^5.7.0 - "@ethersproject/properties": ^5.7.0 - checksum: a823dac9cfb761e009851050ebebd5b229d1b1cc4a75b125c2da130ff37e8218208f7f9d1386f77407705b889b23d4a230ad67185f8872f083143e0073cbfbe3 - languageName: node - linkType: hard - -"@ethersproject/address@npm:5.7.0, @ethersproject/address@npm:^5, @ethersproject/address@npm:^5.0.2, @ethersproject/address@npm:^5.4.0, @ethersproject/address@npm:^5.7.0": - version: 5.7.0 - resolution: "@ethersproject/address@npm:5.7.0" - dependencies: - "@ethersproject/bignumber": ^5.7.0 - "@ethersproject/bytes": ^5.7.0 - "@ethersproject/keccak256": ^5.7.0 - "@ethersproject/logger": ^5.7.0 - "@ethersproject/rlp": ^5.7.0 - checksum: 64ea5ebea9cc0e845c413e6cb1e54e157dd9fc0dffb98e239d3a3efc8177f2ff798cd4e3206cf3660ee8faeb7bef1a47dc0ebef0d7b132c32e61e550c7d4c843 - languageName: node - linkType: hard - -"@ethersproject/base64@npm:5.7.0, @ethersproject/base64@npm:^5.7.0": - version: 5.7.0 - resolution: "@ethersproject/base64@npm:5.7.0" - dependencies: - "@ethersproject/bytes": ^5.7.0 - checksum: 7dd5d734d623582f08f665434f53685041a3d3b334a0e96c0c8afa8bbcaab934d50e5b6b980e826a8fde8d353e0b18f11e61faf17468177274b8e7c69cd9742b - languageName: node - linkType: hard - -"@ethersproject/basex@npm:5.7.0, @ethersproject/basex@npm:^5.7.0": - version: 5.7.0 - resolution: "@ethersproject/basex@npm:5.7.0" - dependencies: - "@ethersproject/bytes": ^5.7.0 - "@ethersproject/properties": ^5.7.0 - checksum: 326087b7e1f3787b5fe6cd1cf2b4b5abfafbc355a45e88e22e5e9d6c845b613ffc5301d629b28d5c4d5e2bfe9ec424e6782c804956dff79be05f0098cb5817de - languageName: node - linkType: hard - -"@ethersproject/bignumber@npm:5.7.0, @ethersproject/bignumber@npm:^5.4.0, @ethersproject/bignumber@npm:^5.7.0": - version: 5.7.0 - resolution: "@ethersproject/bignumber@npm:5.7.0" - dependencies: - "@ethersproject/bytes": ^5.7.0 - "@ethersproject/logger": ^5.7.0 - bn.js: ^5.2.1 - checksum: 8c9a134b76f3feb4ec26a5a27379efb4e156b8fb2de0678a67788a91c7f4e30abe9d948638458e4b20f2e42380da0adacc7c9389d05fce070692edc6ae9b4904 - languageName: node - linkType: hard - -"@ethersproject/bytes@npm:5.7.0, @ethersproject/bytes@npm:^5.4.0, @ethersproject/bytes@npm:^5.7.0": - version: 5.7.0 - resolution: "@ethersproject/bytes@npm:5.7.0" - dependencies: - "@ethersproject/logger": ^5.7.0 - checksum: 66ad365ceaab5da1b23b72225c71dce472cf37737af5118181fa8ab7447d696bea15ca22e3a0e8836fdd8cfac161afe321a7c67d0dde96f9f645ddd759676621 - languageName: node - linkType: hard - -"@ethersproject/constants@npm:5.7.0, @ethersproject/constants@npm:^5.4.0, @ethersproject/constants@npm:^5.7.0": - version: 5.7.0 - resolution: "@ethersproject/constants@npm:5.7.0" - dependencies: - "@ethersproject/bignumber": ^5.7.0 - checksum: 6d4b1355747cce837b3e76ec3bde70e4732736f23b04f196f706ebfa5d4d9c2be50904a390d4d40ce77803b98d03d16a9b6898418e04ba63491933ce08c4ba8a - languageName: node - linkType: hard - -"@ethersproject/contracts@npm:5.7.0": - version: 5.7.0 - resolution: "@ethersproject/contracts@npm:5.7.0" - dependencies: - "@ethersproject/abi": ^5.7.0 - "@ethersproject/abstract-provider": ^5.7.0 - "@ethersproject/abstract-signer": ^5.7.0 - "@ethersproject/address": ^5.7.0 - "@ethersproject/bignumber": ^5.7.0 - "@ethersproject/bytes": ^5.7.0 - "@ethersproject/constants": ^5.7.0 - "@ethersproject/logger": ^5.7.0 - "@ethersproject/properties": ^5.7.0 - "@ethersproject/transactions": ^5.7.0 - checksum: 6ccf1121cba01b31e02f8c507cb971ab6bfed85706484a9ec09878ef1594a62215f43c4fdef8f4a4875b99c4a800bc95e3be69b1803f8ce479e07634b5a740c0 - languageName: node - linkType: hard - -"@ethersproject/experimental@npm:5.7.0": - version: 5.7.0 - resolution: "@ethersproject/experimental@npm:5.7.0" - dependencies: - "@ethersproject/web": ^5.7.0 - ethers: ^5.7.0 - scrypt-js: 3.0.1 - checksum: a4973371be9b984d5834df5d6fe3d4d1641204ec859a6d4e11e4a972a3a4a2dd7c0eae6a9a86b90f30faa3633a86ab153197bff6e853fb3ff8f847e0340a3c24 - languageName: node - linkType: hard - -"@ethersproject/hash@npm:5.7.0": - version: 5.7.0 - resolution: "@ethersproject/hash@npm:5.7.0" - dependencies: - "@ethersproject/abstract-signer": ^5.7.0 - "@ethersproject/address": ^5.7.0 - "@ethersproject/base64": ^5.7.0 - "@ethersproject/bignumber": ^5.7.0 - "@ethersproject/bytes": ^5.7.0 - "@ethersproject/keccak256": ^5.7.0 - "@ethersproject/logger": ^5.7.0 - "@ethersproject/properties": ^5.7.0 - "@ethersproject/strings": ^5.7.0 - checksum: 6e9fa8d14eb08171cd32f17f98cc108ec2aeca74a427655f0d689c550fee0b22a83b3b400fad7fb3f41cf14d4111f87f170aa7905bcbcd1173a55f21b06262ef - languageName: node - linkType: hard - -"@ethersproject/hdnode@npm:5.7.0, @ethersproject/hdnode@npm:^5.7.0": - version: 5.7.0 - resolution: "@ethersproject/hdnode@npm:5.7.0" - dependencies: - "@ethersproject/abstract-signer": ^5.7.0 - "@ethersproject/basex": ^5.7.0 - "@ethersproject/bignumber": ^5.7.0 - "@ethersproject/bytes": ^5.7.0 - "@ethersproject/logger": ^5.7.0 - "@ethersproject/pbkdf2": ^5.7.0 - "@ethersproject/properties": ^5.7.0 - "@ethersproject/sha2": ^5.7.0 - "@ethersproject/signing-key": ^5.7.0 - "@ethersproject/strings": ^5.7.0 - "@ethersproject/transactions": ^5.7.0 - "@ethersproject/wordlists": ^5.7.0 - checksum: bfe5ca2d89a42de73655f853170ef4766b933c5f481cddad709b3aca18823275b096e572f92d1602a052f80b426edde44ad6b9d028799775a7dad4a5bbed2133 - languageName: node - linkType: hard - -"@ethersproject/json-wallets@npm:5.7.0, @ethersproject/json-wallets@npm:^5.7.0": - version: 5.7.0 - resolution: "@ethersproject/json-wallets@npm:5.7.0" - dependencies: - "@ethersproject/abstract-signer": ^5.7.0 - "@ethersproject/address": ^5.7.0 - "@ethersproject/bytes": ^5.7.0 - "@ethersproject/hdnode": ^5.7.0 - "@ethersproject/keccak256": ^5.7.0 - "@ethersproject/logger": ^5.7.0 - "@ethersproject/pbkdf2": ^5.7.0 - "@ethersproject/properties": ^5.7.0 - "@ethersproject/random": ^5.7.0 - "@ethersproject/strings": ^5.7.0 - "@ethersproject/transactions": ^5.7.0 - aes-js: 3.0.0 - scrypt-js: 3.0.1 - checksum: f583458d22db62efaaf94d38dd243482776a45bf90f9f3882fbad5aa0b8fd288b41eb7c1ff8ec0b99c9b751088e43d6173530db64dd33c59f9d8daa8d7ad5aa2 - languageName: node - linkType: hard - -"@ethersproject/keccak256@npm:5.7.0, @ethersproject/keccak256@npm:^5.4.0, @ethersproject/keccak256@npm:^5.7.0": - version: 5.7.0 - resolution: "@ethersproject/keccak256@npm:5.7.0" - dependencies: - "@ethersproject/bytes": ^5.7.0 - js-sha3: 0.8.0 - checksum: ff70950d82203aab29ccda2553422cbac2e7a0c15c986bd20a69b13606ed8bb6e4fdd7b67b8d3b27d4f841e8222cbaccd33ed34be29f866fec7308f96ed244c6 - languageName: node - linkType: hard - -"@ethersproject/logger@npm:5.7.0, @ethersproject/logger@npm:^5.4.0, @ethersproject/logger@npm:^5.7.0": - version: 5.7.0 - resolution: "@ethersproject/logger@npm:5.7.0" - checksum: 075ab2f605f1fd0813f2e39c3308f77b44a67732b36e712d9bc085f22a84aac4da4f71b39bee50fe78da3e1c812673fadc41180c9970fe5e486e91ea17befe0d - languageName: node - linkType: hard - -"@ethersproject/networks@npm:5.7.1, @ethersproject/networks@npm:^5.7.0": - version: 5.7.1 - resolution: "@ethersproject/networks@npm:5.7.1" - dependencies: - "@ethersproject/logger": ^5.7.0 - checksum: 0339f312304c17d9a0adce550edb825d4d2c8c9468c1634c44172c67a9ed256f594da62c4cda5c3837a0f28b7fabc03aca9b492f68ff1fdad337ee861b27bd5d - languageName: node - linkType: hard - -"@ethersproject/pbkdf2@npm:5.7.0, @ethersproject/pbkdf2@npm:^5.7.0": - version: 5.7.0 - resolution: "@ethersproject/pbkdf2@npm:5.7.0" - dependencies: - "@ethersproject/bytes": ^5.7.0 - "@ethersproject/sha2": ^5.7.0 - checksum: b895adb9e35a8a127e794f7aadc31a2424ef355a70e51cde10d457e3e888bb8102373199a540cf61f2d6b9a32e47358f9c65b47d559f42bf8e596b5fd67901e9 - languageName: node - linkType: hard - -"@ethersproject/properties@npm:5.7.0, @ethersproject/properties@npm:^5.4.0, @ethersproject/properties@npm:^5.5.0, @ethersproject/properties@npm:^5.7.0": - version: 5.7.0 - resolution: "@ethersproject/properties@npm:5.7.0" - dependencies: - "@ethersproject/logger": ^5.7.0 - checksum: 6ab0ccf0c3aadc9221e0cdc5306ce6cd0df7f89f77d77bccdd1277182c9ead0202cd7521329ba3acde130820bf8af299e17cf567d0d497c736ee918207bbf59f - languageName: node - linkType: hard - -"@ethersproject/providers@npm:5.7.2, @ethersproject/providers@npm:^5, @ethersproject/providers@npm:^5.5.1, @ethersproject/providers@npm:^5.7.0": - version: 5.7.2 - resolution: "@ethersproject/providers@npm:5.7.2" - dependencies: - "@ethersproject/abstract-provider": ^5.7.0 - "@ethersproject/abstract-signer": ^5.7.0 - "@ethersproject/address": ^5.7.0 - "@ethersproject/base64": ^5.7.0 - "@ethersproject/basex": ^5.7.0 - "@ethersproject/bignumber": ^5.7.0 - "@ethersproject/bytes": ^5.7.0 - "@ethersproject/constants": ^5.7.0 - "@ethersproject/hash": ^5.7.0 - "@ethersproject/logger": ^5.7.0 - "@ethersproject/networks": ^5.7.0 - "@ethersproject/properties": ^5.7.0 - "@ethersproject/random": ^5.7.0 - "@ethersproject/rlp": ^5.7.0 - "@ethersproject/sha2": ^5.7.0 - "@ethersproject/strings": ^5.7.0 - "@ethersproject/transactions": ^5.7.0 - "@ethersproject/web": ^5.7.0 - bech32: 1.1.4 - ws: 7.4.6 - checksum: 1754c731a5ca6782ae9677f4a9cd8b6246c4ef21a966c9a01b133750f3c578431ec43ec254e699969c4a0f87e84463ded50f96b415600aabd37d2056aee58c19 - languageName: node - linkType: hard - -"@ethersproject/random@npm:5.7.0, @ethersproject/random@npm:^5.7.0": - version: 5.7.0 - resolution: "@ethersproject/random@npm:5.7.0" - dependencies: - "@ethersproject/bytes": ^5.7.0 - "@ethersproject/logger": ^5.7.0 - checksum: 017829c91cff6c76470852855108115b0b52c611b6be817ed1948d56ba42d6677803ec2012aa5ae298a7660024156a64c11fcf544e235e239ab3f89f0fff7345 - languageName: node - linkType: hard - -"@ethersproject/rlp@npm:5.7.0, @ethersproject/rlp@npm:^5.7.0": - version: 5.7.0 - resolution: "@ethersproject/rlp@npm:5.7.0" - dependencies: - "@ethersproject/bytes": ^5.7.0 - "@ethersproject/logger": ^5.7.0 - checksum: bce165b0f7e68e4d091c9d3cf47b247cac33252df77a095ca4281d32d5eeaaa3695d9bc06b2b057c5015353a68df89f13a4a54a72e888e4beeabbe56b15dda6e - languageName: node - linkType: hard - -"@ethersproject/sha2@npm:5.7.0, @ethersproject/sha2@npm:^5.7.0": - version: 5.7.0 - resolution: "@ethersproject/sha2@npm:5.7.0" - dependencies: - "@ethersproject/bytes": ^5.7.0 - "@ethersproject/logger": ^5.7.0 - hash.js: 1.1.7 - checksum: 09321057c022effbff4cc2d9b9558228690b5dd916329d75c4b1ffe32ba3d24b480a367a7cc92d0f0c0b1c896814d03351ae4630e2f1f7160be2bcfbde435dbc - languageName: node - linkType: hard - -"@ethersproject/shims@npm:5.6.0": - version: 5.6.0 - resolution: "@ethersproject/shims@npm:5.6.0" - checksum: aa224261cdd6a0507db5483a38a26b0f56952e66088d880ad228b1e70023e7708d452da7995b04db5e0cdcfa026854ab57485e378298d948de1ac34f6f82149c - languageName: node - linkType: hard - -"@ethersproject/signing-key@npm:5.7.0, @ethersproject/signing-key@npm:^5.7.0": - version: 5.7.0 - resolution: "@ethersproject/signing-key@npm:5.7.0" - dependencies: - "@ethersproject/bytes": ^5.7.0 - "@ethersproject/logger": ^5.7.0 - "@ethersproject/properties": ^5.7.0 - bn.js: ^5.2.1 - elliptic: 6.5.4 - hash.js: 1.1.7 - checksum: 8f8de09b0aac709683bbb49339bc0a4cd2f95598f3546436c65d6f3c3a847ffa98e06d35e9ed2b17d8030bd2f02db9b7bd2e11c5cf8a71aad4537487ab4cf03a - languageName: node - linkType: hard - -"@ethersproject/solidity@npm:5.7.0, @ethersproject/solidity@npm:^5.0.9": - version: 5.7.0 - resolution: "@ethersproject/solidity@npm:5.7.0" - dependencies: - "@ethersproject/bignumber": ^5.7.0 - "@ethersproject/bytes": ^5.7.0 - "@ethersproject/keccak256": ^5.7.0 - "@ethersproject/logger": ^5.7.0 - "@ethersproject/sha2": ^5.7.0 - "@ethersproject/strings": ^5.7.0 - checksum: 9a02f37f801c96068c3e7721f83719d060175bc4e80439fe060e92bd7acfcb6ac1330c7e71c49f4c2535ca1308f2acdcb01e00133129aac00581724c2d6293f3 - languageName: node - linkType: hard - -"@ethersproject/strings@npm:5.7.0, @ethersproject/strings@npm:^5.4.0, @ethersproject/strings@npm:^5.7.0": - version: 5.7.0 - resolution: "@ethersproject/strings@npm:5.7.0" - dependencies: - "@ethersproject/bytes": ^5.7.0 - "@ethersproject/constants": ^5.7.0 - "@ethersproject/logger": ^5.7.0 - checksum: 5ff78693ae3fdf3cf23e1f6dc047a61e44c8197d2408c42719fef8cb7b7b3613a4eec88ac0ed1f9f5558c74fe0de7ae3195a29ca91a239c74b9f444d8e8b50df - languageName: node - linkType: hard - -"@ethersproject/transactions@npm:5.7.0, @ethersproject/transactions@npm:^5.7.0": - version: 5.7.0 - resolution: "@ethersproject/transactions@npm:5.7.0" - dependencies: - "@ethersproject/address": ^5.7.0 - "@ethersproject/bignumber": ^5.7.0 - "@ethersproject/bytes": ^5.7.0 - "@ethersproject/constants": ^5.7.0 - "@ethersproject/keccak256": ^5.7.0 - "@ethersproject/logger": ^5.7.0 - "@ethersproject/properties": ^5.7.0 - "@ethersproject/rlp": ^5.7.0 - "@ethersproject/signing-key": ^5.7.0 - checksum: a31b71996d2b283f68486241bff0d3ea3f1ba0e8f1322a8fffc239ccc4f4a7eb2ea9994b8fd2f093283fd75f87bae68171e01b6265261f821369aca319884a79 - languageName: node - linkType: hard - -"@ethersproject/units@npm:5.7.0": - version: 5.7.0 - resolution: "@ethersproject/units@npm:5.7.0" - dependencies: - "@ethersproject/bignumber": ^5.7.0 - "@ethersproject/constants": ^5.7.0 - "@ethersproject/logger": ^5.7.0 - checksum: 304714f848cd32e57df31bf545f7ad35c2a72adae957198b28cbc62166daa929322a07bff6e9c9ac4577ab6aa0de0546b065ed1b2d20b19e25748b7d475cb0fc - languageName: node - linkType: hard - -"@ethersproject/wallet@npm:5.7.0": - version: 5.7.0 - resolution: "@ethersproject/wallet@npm:5.7.0" - dependencies: - "@ethersproject/abstract-provider": ^5.7.0 - "@ethersproject/abstract-signer": ^5.7.0 - "@ethersproject/address": ^5.7.0 - "@ethersproject/bignumber": ^5.7.0 - "@ethersproject/bytes": ^5.7.0 - "@ethersproject/hash": ^5.7.0 - "@ethersproject/hdnode": ^5.7.0 - "@ethersproject/json-wallets": ^5.7.0 - "@ethersproject/keccak256": ^5.7.0 - "@ethersproject/logger": ^5.7.0 - "@ethersproject/properties": ^5.7.0 - "@ethersproject/random": ^5.7.0 - "@ethersproject/signing-key": ^5.7.0 - "@ethersproject/transactions": ^5.7.0 - "@ethersproject/wordlists": ^5.7.0 - checksum: a4009bf7331eddab38e3015b5e9101ef92de7f705b00a6196b997db0e5635b6d83561674d46c90c6f77b87c0500fe4a6b0183ba13749efc22db59c99deb82fbd - languageName: node - linkType: hard - -"@ethersproject/web@npm:5.7.1, @ethersproject/web@npm:^5.7.0": - version: 5.7.1 - resolution: "@ethersproject/web@npm:5.7.1" - dependencies: - "@ethersproject/base64": ^5.7.0 - "@ethersproject/bytes": ^5.7.0 - "@ethersproject/logger": ^5.7.0 - "@ethersproject/properties": ^5.7.0 - "@ethersproject/strings": ^5.7.0 - checksum: 7028c47103f82fd2e2c197ce0eecfacaa9180ffeec7de7845b1f4f9b19d84081b7a48227aaddde05a4aaa526af574a9a0ce01cc0fc75e3e371f84b38b5b16b2b - languageName: node - linkType: hard - -"@ethersproject/wordlists@npm:5.7.0, @ethersproject/wordlists@npm:^5.7.0": - version: 5.7.0 - resolution: "@ethersproject/wordlists@npm:5.7.0" - dependencies: - "@ethersproject/bytes": ^5.7.0 - "@ethersproject/hash": ^5.7.0 - "@ethersproject/logger": ^5.7.0 - "@ethersproject/properties": ^5.7.0 - "@ethersproject/strings": ^5.7.0 - checksum: 30eb6eb0731f9ef5faa44bf9c0c6e950bcaaef61e4d2d9ce0ae6d341f4e2d6d1f4ab4f8880bfce03b7aac4b862fb740e1421170cfbf8e2aafc359277d49e6e97 - languageName: node - linkType: hard - -"@expo/bunyan@npm:^4.0.0": - version: 4.0.0 - resolution: "@expo/bunyan@npm:4.0.0" - dependencies: - mv: ~2 - safe-json-stringify: ~1 - uuid: ^8.0.0 - dependenciesMeta: - mv: - optional: true - safe-json-stringify: - optional: true - checksum: dce0b66fde1c11f987bc31b9afd9b714c4295ba750780ee8861ab8a912b37a2b9dd2ab9c9fbf3a85f3adbe66c6cd85e45bc76fa37c98ee23a7db3ad24601c296 - languageName: node - linkType: hard - -"@expo/cli@npm:0.21.7": - version: 0.21.7 - resolution: "@expo/cli@npm:0.21.7" - dependencies: - "@0no-co/graphql.web": ^1.0.8 - "@babel/runtime": ^7.20.0 - "@expo/code-signing-certificates": ^0.0.5 - "@expo/config": ~10.0.4 - "@expo/config-plugins": ~9.0.10 - "@expo/devcert": ^1.1.2 - "@expo/env": ~0.4.0 - "@expo/image-utils": ^0.6.0 - "@expo/json-file": ^9.0.0 - "@expo/metro-config": ~0.19.0 - "@expo/osascript": ^2.0.31 - "@expo/package-manager": ^1.5.0 - "@expo/plist": ^0.2.0 - "@expo/prebuild-config": ^8.0.17 - "@expo/rudder-sdk-node": ^1.1.1 - "@expo/spawn-async": ^1.7.2 - "@expo/xcpretty": ^4.3.0 - "@react-native/dev-middleware": 0.76.2 - "@urql/core": ^5.0.6 - "@urql/exchange-retry": ^1.3.0 - accepts: ^1.3.8 - arg: ^5.0.2 - better-opn: ~3.0.2 - bplist-creator: 0.0.7 - bplist-parser: ^0.3.1 - cacache: ^18.0.2 - chalk: ^4.0.0 - ci-info: ^3.3.0 - compression: ^1.7.4 - connect: ^3.7.0 - debug: ^4.3.4 - env-editor: ^0.4.1 - fast-glob: ^3.3.2 - form-data: ^3.0.1 - freeport-async: ^2.0.0 - fs-extra: ~8.1.0 - getenv: ^1.0.0 - glob: ^10.4.2 - internal-ip: ^4.3.0 - is-docker: ^2.0.0 - is-wsl: ^2.1.1 - lodash.debounce: ^4.0.8 - minimatch: ^3.0.4 - node-forge: ^1.3.1 - npm-package-arg: ^11.0.0 - ora: ^3.4.0 - picomatch: ^3.0.1 - pretty-bytes: ^5.6.0 - pretty-format: ^29.7.0 - progress: ^2.0.3 - prompts: ^2.3.2 - qrcode-terminal: 0.11.0 - require-from-string: ^2.0.2 - requireg: ^0.2.2 - resolve: ^1.22.2 - resolve-from: ^5.0.0 - resolve.exports: ^2.0.2 - semver: ^7.6.0 - send: ^0.19.0 - slugify: ^1.3.4 - source-map-support: ~0.5.21 - stacktrace-parser: ^0.1.10 - structured-headers: ^0.4.1 - tar: ^6.2.1 - temp-dir: ^2.0.0 - tempy: ^0.7.1 - terminal-link: ^2.1.1 - undici: ^6.18.2 - unique-string: ~2.0.0 - wrap-ansi: ^7.0.0 - ws: ^8.12.1 - bin: - expo-internal: build/bin/cli - checksum: 6e0e5ab13662058490bcb88cb6cdf21fbd7ef750679ce178de6fe861b968020ebb421436a57866ec829f1c9a09c29e1d54c4a4c361315aa6b2c0baa743baaef9 - languageName: node - linkType: hard - -"@expo/code-signing-certificates@npm:^0.0.5": - version: 0.0.5 - resolution: "@expo/code-signing-certificates@npm:0.0.5" - dependencies: - node-forge: ^1.2.1 - nullthrows: ^1.1.1 - checksum: 4a1c73a6bc74443284a45db698ede874c7d47f6ed58cf44adaa255139490c8754d81dc1556247f3782cdc5034382fb72f23b0033daa2117facad4eb13b841e37 - languageName: node - linkType: hard - -"@expo/config-plugins@npm:^8.0.4": - version: 8.0.11 - resolution: "@expo/config-plugins@npm:8.0.11" - dependencies: - "@expo/config-types": ^51.0.3 - "@expo/json-file": ~8.3.0 - "@expo/plist": ^0.1.0 - "@expo/sdk-runtime-versions": ^1.0.0 - chalk: ^4.1.2 - debug: ^4.3.1 - find-up: ~5.0.0 - getenv: ^1.0.0 - glob: 7.1.6 - resolve-from: ^5.0.0 - semver: ^7.5.4 - slash: ^3.0.0 - slugify: ^1.6.6 - xcode: ^3.0.1 - xml2js: 0.6.0 - checksum: 084b20f6254d28644fbfde13cbf4b155c9d965a7ea44c25e67d1ee8d3675570593e8233291948813c0832e03a26ee600676fe39d78f11e388b62555c537d8463 - languageName: node - linkType: hard - -"@expo/config-plugins@npm:~9.0.10, @expo/config-plugins@npm:~9.0.14": - version: 9.0.14 - resolution: "@expo/config-plugins@npm:9.0.14" - dependencies: - "@expo/config-types": ^52.0.3 - "@expo/json-file": ~9.0.1 - "@expo/plist": ^0.2.1 - "@expo/sdk-runtime-versions": ^1.0.0 - chalk: ^4.1.2 - debug: ^4.3.5 - getenv: ^1.0.0 - glob: ^10.4.2 - resolve-from: ^5.0.0 - semver: ^7.5.4 - slash: ^3.0.0 - slugify: ^1.6.6 - xcode: ^3.0.1 - xml2js: 0.6.0 - checksum: d411b2a8ab1602318e02c9ef8c1710b63373d4eedbcba07c29843140c454ee83343fbc82c38a54e0e2ccfc5a6c20234b749fbb62f02178bf0275a037adc23b3b - languageName: node - linkType: hard - -"@expo/config-types@npm:^51.0.3": - version: 51.0.3 - resolution: "@expo/config-types@npm:51.0.3" - checksum: c46def814a5e0d6c8358b9767a89f51239f4f1c3b4a5305ffcfa1a86e4360ac40de54a65f7c6e787be7656e4144c99a050e98b600a1edd3d6e8e20c83d8e107b - languageName: node - linkType: hard - -"@expo/config-types@npm:^52.0.3": - version: 52.0.3 - resolution: "@expo/config-types@npm:52.0.3" - checksum: cd601d86537ad65bdf5f9731028618b1fc540726d06953e3349c62c0e5e33466aba04cdd993763e0094afa48059a36605ae4c419be23a4485e0c17b2223c0d8d - languageName: node - linkType: hard - -"@expo/config@npm:~10.0.4, @expo/config@npm:~10.0.5, @expo/config@npm:~10.0.8": - version: 10.0.8 - resolution: "@expo/config@npm:10.0.8" - dependencies: - "@babel/code-frame": ~7.10.4 - "@expo/config-plugins": ~9.0.14 - "@expo/config-types": ^52.0.3 - "@expo/json-file": ^9.0.1 - deepmerge: ^4.3.1 - getenv: ^1.0.0 - glob: ^10.4.2 - require-from-string: ^2.0.2 - resolve-from: ^5.0.0 - resolve-workspace-root: ^2.0.0 - semver: ^7.6.0 - slugify: ^1.3.4 - sucrase: 3.35.0 - checksum: f6189e955770300b769f230c0bbed15dec9add0fafdb2f53aaeb2daa98bc69191bfd1c640a9eecbf87a50455db76d387a47c27442307a9952f2e628d7d029cda - languageName: node - linkType: hard - -"@expo/devcert@npm:^1.1.2": - version: 1.1.4 - resolution: "@expo/devcert@npm:1.1.4" - dependencies: - application-config-path: ^0.1.0 - command-exists: ^1.2.4 - debug: ^3.1.0 - eol: ^0.9.1 - get-port: ^3.2.0 - glob: ^10.4.2 - lodash: ^4.17.21 - mkdirp: ^0.5.1 - password-prompt: ^1.0.4 - sudo-prompt: ^8.2.0 - tmp: ^0.0.33 - tslib: ^2.4.0 - checksum: a6bb5ba18d1d4fe5ebfa096f8d332f14bbe8bb942bc3650debf89fb68b5637bd5b7b22f9b28d5971965436bf83d442e843ac7e0e1e7408cce6e575b55c830b6d - languageName: node - linkType: hard - -"@expo/env@npm:~0.4.0, @expo/env@npm:~0.4.1": - version: 0.4.1 - resolution: "@expo/env@npm:0.4.1" - dependencies: - chalk: ^4.0.0 - debug: ^4.3.4 - dotenv: ~16.4.5 - dotenv-expand: ~11.0.6 - getenv: ^1.0.0 - checksum: f4028ae9947663f4ab7ab63cffdcd3db4d11bac19a8994d12f2ccaae75681024247cd61865a0f3222abf0a7fc17e3179426da4f152cd674646cfa8e2b7b1daa2 - languageName: node - linkType: hard - -"@expo/fingerprint@npm:0.11.2": - version: 0.11.2 - resolution: "@expo/fingerprint@npm:0.11.2" - dependencies: - "@expo/spawn-async": ^1.7.2 - arg: ^5.0.2 - chalk: ^4.1.2 - debug: ^4.3.4 - find-up: ^5.0.0 - getenv: ^1.0.0 - minimatch: ^3.0.4 - p-limit: ^3.1.0 - resolve-from: ^5.0.0 - semver: ^7.6.0 - bin: - fingerprint: bin/cli.js - checksum: 278d7a496ea6b89d520784350de924d2dc2af19454b5023abd34be3c47641c2856cacac74c7bdbe35905bf5525e19371c1f39b644026f6cbea23f4294fefb676 - languageName: node - linkType: hard - -"@expo/image-utils@npm:^0.6.0, @expo/image-utils@npm:^0.6.4": - version: 0.6.4 - resolution: "@expo/image-utils@npm:0.6.4" - dependencies: - "@expo/spawn-async": ^1.7.2 - chalk: ^4.0.0 - fs-extra: 9.0.0 - getenv: ^1.0.0 - jimp-compact: 0.16.1 - parse-png: ^2.1.0 - resolve-from: ^5.0.0 - semver: ^7.6.0 - temp-dir: ~2.0.0 - unique-string: ~2.0.0 - checksum: 0961c476e6da90ace3270a51aaef234a47e8a257b44e6d559e6ab9691721b24731783651de23ed582363393e81d3347a3933e6c2b0a6369ed3ad9eacf1d3b32f - languageName: node - linkType: hard - -"@expo/json-file@npm:^9.0.0, @expo/json-file@npm:^9.0.1, @expo/json-file@npm:~9.0.0, @expo/json-file@npm:~9.0.1": - version: 9.0.1 - resolution: "@expo/json-file@npm:9.0.1" - dependencies: - "@babel/code-frame": ~7.10.4 - json5: ^2.2.3 - write-file-atomic: ^2.3.0 - checksum: 368b4d70ed186067b9f8f00b896632334d587810b979ef01583bf7dc5c55aea9d015546443b9fefd4ab999520fa7d65fbdd81a79f0dd36cb72e3fbbbaa419b7a - languageName: node - linkType: hard - -"@expo/json-file@npm:~8.3.0": - version: 8.3.3 - resolution: "@expo/json-file@npm:8.3.3" - dependencies: - "@babel/code-frame": ~7.10.4 - json5: ^2.2.2 - write-file-atomic: ^2.3.0 - checksum: 49fcb3581ac21c1c223459f32e9e931149b56a7587318f666303a62e719e3d0f122ff56a60d47ee31fac937c297a66400a00fcee63a17bebbf4b8cd30c5138c1 - languageName: node - linkType: hard - -"@expo/metro-config@npm:0.19.4": - version: 0.19.4 - resolution: "@expo/metro-config@npm:0.19.4" - dependencies: - "@babel/core": ^7.20.0 - "@babel/generator": ^7.20.5 - "@babel/parser": ^7.20.0 - "@babel/types": ^7.20.0 - "@expo/config": ~10.0.4 - "@expo/env": ~0.4.0 - "@expo/json-file": ~9.0.0 - "@expo/spawn-async": ^1.7.2 - chalk: ^4.1.0 - debug: ^4.3.2 - fs-extra: ^9.1.0 - getenv: ^1.0.0 - glob: ^10.4.2 - jsc-safe-url: ^0.2.4 - lightningcss: ~1.27.0 - minimatch: ^3.0.4 - postcss: ~8.4.32 - resolve-from: ^5.0.0 - checksum: 32a3bfc89f465722eb0cf2407954f13ca8e1d95e49254257810d646534df2bbece447d04bdae3f79983a7ddfaf70f0160a223130427495b3086c317885683b2d - languageName: node - linkType: hard - -"@expo/metro-config@npm:~0.19.0": - version: 0.19.9 - resolution: "@expo/metro-config@npm:0.19.9" - dependencies: - "@babel/core": ^7.20.0 - "@babel/generator": ^7.20.5 - "@babel/parser": ^7.20.0 - "@babel/types": ^7.20.0 - "@expo/config": ~10.0.8 - "@expo/env": ~0.4.1 - "@expo/json-file": ~9.0.1 - "@expo/spawn-async": ^1.7.2 - chalk: ^4.1.0 - debug: ^4.3.2 - fs-extra: ^9.1.0 - getenv: ^1.0.0 - glob: ^10.4.2 - jsc-safe-url: ^0.2.4 - lightningcss: ~1.27.0 - minimatch: ^3.0.4 - postcss: ~8.4.32 - resolve-from: ^5.0.0 - checksum: f7ef4a59f7ea32af598fb3dfda071f6abb84fddb7d30acd629479d297d443517daefba3f3f62d2c2256f28f6530c58e8ec950df83b6ba011f8939cc1da174d27 - languageName: node - linkType: hard - -"@expo/osascript@npm:^2.0.31": - version: 2.0.33 - resolution: "@expo/osascript@npm:2.0.33" - dependencies: - "@expo/spawn-async": ^1.5.0 - exec-async: ^2.2.0 - checksum: f1ae2e365ec82fcfefbdcd3ceb52da1b38c54e55a2ceb884ca06fb9259544c032b2f8133b803be152e86d79b8510fda8320811053894884819fa10b66268045d - languageName: node - linkType: hard - -"@expo/package-manager@npm:^1.5.0": - version: 1.7.1 - resolution: "@expo/package-manager@npm:1.7.1" - dependencies: - "@expo/json-file": ^9.0.1 - "@expo/spawn-async": ^1.7.2 - ansi-regex: ^5.0.0 - chalk: ^4.0.0 - find-up: ^5.0.0 - js-yaml: ^3.13.1 - micromatch: ^4.0.8 - npm-package-arg: ^11.0.0 - ora: ^3.4.0 - resolve-workspace-root: ^2.0.0 - split: ^1.0.1 - sudo-prompt: 9.1.1 - checksum: 7a5f1d235c2aff12e8668605a84313c9ec498da63bfd3602628eaba38818cfd6735f6b0fd5e5ab86e415367a16a62dc3170b1cb66d3f2582ec10c3e89fb721a0 - languageName: node - linkType: hard - -"@expo/plist@npm:^0.1.0": - version: 0.1.0 - resolution: "@expo/plist@npm:0.1.0" - dependencies: - "@xmldom/xmldom": ~0.7.7 - base64-js: ^1.2.3 - xmlbuilder: ^14.0.0 - checksum: 49b647c4858d9669126ccc26ab09d8e93c38c3add1ed6944532dd0513671bd36b2ea6484f988087622e12c5513e9d3a5b3a5d0361abf701616f377b5bde97294 - languageName: node - linkType: hard - -"@expo/plist@npm:^0.2.0, @expo/plist@npm:^0.2.1": - version: 0.2.1 - resolution: "@expo/plist@npm:0.2.1" - dependencies: - "@xmldom/xmldom": ~0.7.7 - base64-js: ^1.2.3 - xmlbuilder: ^14.0.0 - checksum: a106f097b23ce8f29e6fe98bce539faea349de3346b11b39862dc449709f7e019e09ee67f752ea8cff32de409487a2ff3a2ab5b5d0ef096a58970e69be89cb72 - languageName: node - linkType: hard - -"@expo/prebuild-config@npm:^8.0.17": - version: 8.0.25 - resolution: "@expo/prebuild-config@npm:8.0.25" - dependencies: - "@expo/config": ~10.0.8 - "@expo/config-plugins": ~9.0.14 - "@expo/config-types": ^52.0.3 - "@expo/image-utils": ^0.6.4 - "@expo/json-file": ^9.0.1 - "@react-native/normalize-colors": 0.76.6 - debug: ^4.3.1 - fs-extra: ^9.0.0 - resolve-from: ^5.0.0 - semver: ^7.6.0 - xml2js: 0.6.0 - checksum: aff307dc725afa08cd5dbfab1c984c35caa48d8046b4aa78642a98072b8646285539dd1bca205b6b2090b19643725413954132f083b527fd711639d73756dc20 - languageName: node - linkType: hard - -"@expo/rudder-sdk-node@npm:^1.1.1": - version: 1.1.1 - resolution: "@expo/rudder-sdk-node@npm:1.1.1" - dependencies: - "@expo/bunyan": ^4.0.0 - "@segment/loosely-validate-event": ^2.0.0 - fetch-retry: ^4.1.1 - md5: ^2.2.1 - node-fetch: ^2.6.1 - remove-trailing-slash: ^0.1.0 - uuid: ^8.3.2 - checksum: 5ce50c1a82f899b135600cb29cddf3fab601938700c8203f16a1394d2ffbf9e2cdd246b92ff635f8415121072d99a7b4a370f715b78f6680594b5a630e8d78c6 - languageName: node - linkType: hard - -"@expo/sdk-runtime-versions@npm:^1.0.0": - version: 1.0.0 - resolution: "@expo/sdk-runtime-versions@npm:1.0.0" - checksum: 0942d5a356f590e8dc795761456cc48b3e2d6a38ad2a02d6774efcdc5a70424e05623b4e3e5d2fec0cdc30f40dde05c14391c781607eed3971bf8676518bfd9d - languageName: node - linkType: hard - -"@expo/spawn-async@npm:^1.5.0, @expo/spawn-async@npm:^1.7.2": - version: 1.7.2 - resolution: "@expo/spawn-async@npm:1.7.2" - dependencies: - cross-spawn: ^7.0.3 - checksum: d99e5ff6d303ec9b0105f97c4fa6c65bca526c7d4d0987997c35cc745fa8224adf009942d01808192ebb9fa30619a53316641958631e85cf17b773d9eeda2597 - languageName: node - linkType: hard - -"@expo/vector-icons@npm:^14.0.0": - version: 14.0.0 - resolution: "@expo/vector-icons@npm:14.0.0" - checksum: aae8160cd1b0dbe97e7e7b3f6102c8696186ce481a20117550a3bc7da23b6943534aa493e2c08fbcee80ee31f6e111e8012fe57df2446e55ab7dd8f6f3098d05 - languageName: node - linkType: hard - -"@expo/xcpretty@npm:^4.3.0": - version: 4.3.1 - resolution: "@expo/xcpretty@npm:4.3.1" - dependencies: - "@babel/code-frame": 7.10.4 - chalk: ^4.1.0 - find-up: ^5.0.0 - js-yaml: ^4.1.0 - bin: - excpretty: build/cli.js - checksum: dbf3e2d7f501fbbd11baf0c0aa9057c8a87efe0993a82caafd30c66977ac430d03fa84e27b529e3d0b04fee8c6beec1bd135f0522229dca91220561b76309854 - languageName: node - linkType: hard - -"@faker-js/faker@npm:7.6.0": - version: 7.6.0 - resolution: "@faker-js/faker@npm:7.6.0" - checksum: 942af6221774e8c98a0eb6bc75265e05fb81a941170377666c3439aab9495dd321d6beedc5406f07e6ad44262b3e43c20961f666d116ad150b78e7437dd1bb2b - languageName: node - linkType: hard - -"@fastify/busboy@npm:^2.0.0": - version: 2.1.0 - resolution: "@fastify/busboy@npm:2.1.0" - checksum: 3233abd10f73e50668cb4bb278a79b7b3fadd30215ac6458299b0e5a09a29c3586ec07597aae6bd93f5cbedfcef43a8aeea51829cd28fc13850cdbcd324c28d5 - languageName: node - linkType: hard - -"@firebase/analytics-compat@npm:0.2.14": - version: 0.2.14 - resolution: "@firebase/analytics-compat@npm:0.2.14" - dependencies: - "@firebase/analytics": 0.10.8 - "@firebase/analytics-types": 0.8.2 - "@firebase/component": 0.6.9 - "@firebase/util": 1.10.0 - tslib: ^2.1.0 - peerDependencies: - "@firebase/app-compat": 0.x - checksum: 9b594ab16a9f2f6cc5130b1c5d3837f24523903f63643f604fe5897daf3d8cc8af89109d17f1354d6f02797c0781fd7141ac0aa3971a8e8b3cfb0c3d9a945daa - languageName: node - linkType: hard - -"@firebase/analytics-types@npm:0.8.2": - version: 0.8.2 - resolution: "@firebase/analytics-types@npm:0.8.2" - checksum: a8279b070b8a2496b596a18111bc51488d2e6e4b7d6cd46cbe4406a61693254c2dbd0c7d0dec77a0016a4277cde7978fd61c711bcb15ea578b33b2a5b9aba46a - languageName: node - linkType: hard - -"@firebase/analytics@npm:0.10.8": - version: 0.10.8 - resolution: "@firebase/analytics@npm:0.10.8" - dependencies: - "@firebase/component": 0.6.9 - "@firebase/installations": 0.6.9 - "@firebase/logger": 0.4.2 - "@firebase/util": 1.10.0 - tslib: ^2.1.0 - peerDependencies: - "@firebase/app": 0.x - checksum: 04170135a4457e0c5571fccf0d11be7ccdaa591840364b10d0c21edaea06e0c23b90bfbc10589a730be6511cb129c7fe79aa4ff7f44c953d7b39fd4fcf0dc7d2 - languageName: node - linkType: hard - -"@firebase/app-check-compat@npm:0.3.15": - version: 0.3.15 - resolution: "@firebase/app-check-compat@npm:0.3.15" - dependencies: - "@firebase/app-check": 0.8.8 - "@firebase/app-check-types": 0.5.2 - "@firebase/component": 0.6.9 - "@firebase/logger": 0.4.2 - "@firebase/util": 1.10.0 - tslib: ^2.1.0 - peerDependencies: - "@firebase/app-compat": 0.x - checksum: dcbe62cd516a8b70784c4e55ccb16614db0966402c20896c48f4e42ec29e91b9722bf1f6a28eac6186483ac9d65f77b5291a522932da05d2927dc7cad26a1a1a - languageName: node - linkType: hard - -"@firebase/app-check-interop-types@npm:0.3.2": - version: 0.3.2 - resolution: "@firebase/app-check-interop-types@npm:0.3.2" - checksum: 7dd452c21cb8b3682082a6f4023de208b4a4808d97ede7d72a54f2e0a51963adf1c1bcc8a8c8338bee1ba0b66516cc101a1fb51a26a80c9322c3a080aee6ec26 - languageName: node - linkType: hard - -"@firebase/app-check-types@npm:0.5.2": - version: 0.5.2 - resolution: "@firebase/app-check-types@npm:0.5.2" - checksum: d0ab668274475bdb33a5f7164a9a380e46c21b3405cb46072895386f896953461e113119bd1b2eb63abd14fc9cf249f2f80e87adbbb9bc7ef7564967955cc200 - languageName: node - linkType: hard - -"@firebase/app-check@npm:0.8.8": - version: 0.8.8 - resolution: "@firebase/app-check@npm:0.8.8" - dependencies: - "@firebase/component": 0.6.9 - "@firebase/logger": 0.4.2 - "@firebase/util": 1.10.0 - tslib: ^2.1.0 - peerDependencies: - "@firebase/app": 0.x - checksum: 6a27316f49e15ed5925dd40a8c217712119dc21c83c0032bac9f2ee3e3de713546c51451831c47eeec77734e639ec8b2fb24fd41a0efe27a5913fe2ca83503f7 - languageName: node - linkType: hard - -"@firebase/app-compat@npm:0.2.41": - version: 0.2.41 - resolution: "@firebase/app-compat@npm:0.2.41" - dependencies: - "@firebase/app": 0.10.11 - "@firebase/component": 0.6.9 - "@firebase/logger": 0.4.2 - "@firebase/util": 1.10.0 - tslib: ^2.1.0 - checksum: eef1490eda88ffbc2e5e041591f2d587e6056e64e3fe1b899be4cbf061ad98ab1c3dc09605a35cdc178ff72e4a49588b1035aca6e6035d5dbd96d0fea590ba8c - languageName: node - linkType: hard - -"@firebase/app-types@npm:0.9.2": - version: 0.9.2 - resolution: "@firebase/app-types@npm:0.9.2" - checksum: c709592d84e262b980cbeff4fd5f5d5c522a9de7fe33bcdede8e6390fc05a283c11a2bf0b012fef1329251d4599f12f4b4f0dd2228a8ec42da017ae968e740a4 - languageName: node - linkType: hard - -"@firebase/app@npm:0.10.11": - version: 0.10.11 - resolution: "@firebase/app@npm:0.10.11" - dependencies: - "@firebase/component": 0.6.9 - "@firebase/logger": 0.4.2 - "@firebase/util": 1.10.0 - idb: 7.1.1 - tslib: ^2.1.0 - checksum: 62f8dabbb349292165fb0847d3923e2974a803ca7756c5c22ec17ba8bb5a864d5594bd41c7733b88e38b525b7eae838d80042e9dd71200e08daada44b998714d - languageName: node - linkType: hard - -"@firebase/auth-compat@npm:0.5.14": - version: 0.5.14 - resolution: "@firebase/auth-compat@npm:0.5.14" - dependencies: - "@firebase/auth": 1.7.9 - "@firebase/auth-types": 0.12.2 - "@firebase/component": 0.6.9 - "@firebase/util": 1.10.0 - tslib: ^2.1.0 - undici: 6.19.7 - peerDependencies: - "@firebase/app-compat": 0.x - checksum: a2adecd67abc436dea97d268f3478150612b60581b58d4d547ed8a29f760a2a60abd95da85437d3fe2a4124d6f0f9ecfbf14cd65bb6f19d63b2a99ec5e839e3e - languageName: node - linkType: hard - -"@firebase/auth-interop-types@npm:0.2.3": - version: 0.2.3 - resolution: "@firebase/auth-interop-types@npm:0.2.3" - checksum: fdadd64a067fdc1f32464890c861cdcc984a4aae307e7d46f182ba508082e55921c6f70042d1f893dfd18434484783f866adefcdc01dba8818cd7f0b0c89acf2 - languageName: node - linkType: hard - -"@firebase/auth-types@npm:0.12.2": - version: 0.12.2 - resolution: "@firebase/auth-types@npm:0.12.2" - peerDependencies: - "@firebase/app-types": 0.x - "@firebase/util": 1.x - checksum: d4bbe222b22bbd213d2e6dc8af9e196b39eb29e55c4aecf4d81d232dc105ae895c587e56e37363e5192c56b1db157c3b18c9378a907d1672e6124c4cd793a04d - languageName: node - linkType: hard - -"@firebase/auth@npm:1.7.9": - version: 1.7.9 - resolution: "@firebase/auth@npm:1.7.9" - dependencies: - "@firebase/component": 0.6.9 - "@firebase/logger": 0.4.2 - "@firebase/util": 1.10.0 - tslib: ^2.1.0 - undici: 6.19.7 - peerDependencies: - "@firebase/app": 0.x - "@react-native-async-storage/async-storage": ^1.18.1 - peerDependenciesMeta: - "@react-native-async-storage/async-storage": - optional: true - checksum: f6ce5151dae619ed18dc2e205e3d6c17280a7f05fa0b6416b3dbb8d75c694c9feefaf8b30bca3d3a01ebaafd8865d6fb8b38fe46b5c23ec998278a834a1976a9 - languageName: node - linkType: hard - -"@firebase/component@npm:0.6.9": - version: 0.6.9 - resolution: "@firebase/component@npm:0.6.9" - dependencies: - "@firebase/util": 1.10.0 - tslib: ^2.1.0 - checksum: f047109220b08eb1ff3509563c597c62bfef98c0190c4201a1c98de755931a7d3783c1de083888f600336a92865fc3f75d211467963191eaa86453d13b9ac704 - languageName: node - linkType: hard - -"@firebase/database-compat@npm:1.0.8": - version: 1.0.8 - resolution: "@firebase/database-compat@npm:1.0.8" - dependencies: - "@firebase/component": 0.6.9 - "@firebase/database": 1.0.8 - "@firebase/database-types": 1.0.5 - "@firebase/logger": 0.4.2 - "@firebase/util": 1.10.0 - tslib: ^2.1.0 - checksum: 68ea4e07a9aba636173b838fa0126310c1d4d7cee3bb64bccca5681d28515f9eb78d34ed1d8aef82de0891717b8e5e29c794d4deeed7bd7fd479eab16f00194a - languageName: node - linkType: hard - -"@firebase/database-types@npm:1.0.5": - version: 1.0.5 - resolution: "@firebase/database-types@npm:1.0.5" - dependencies: - "@firebase/app-types": 0.9.2 - "@firebase/util": 1.10.0 - checksum: 8c8c45162b6f138378f8aa16590cfad52233e0e93c35b5e6dc526ef06ee2b424e80023ab9defea4fef8f6886c9aeced8386bcf532c59008a1d2b620df90c5779 - languageName: node - linkType: hard - -"@firebase/database@npm:1.0.8": - version: 1.0.8 - resolution: "@firebase/database@npm:1.0.8" - dependencies: - "@firebase/app-check-interop-types": 0.3.2 - "@firebase/auth-interop-types": 0.2.3 - "@firebase/component": 0.6.9 - "@firebase/logger": 0.4.2 - "@firebase/util": 1.10.0 - faye-websocket: 0.11.4 - tslib: ^2.1.0 - checksum: a12d7985ceabfe71fe4fb657c2b87904082f54cce5ce9b3c1399c1fdf0ee7ab89091a328448f99e628e636ee4f8ed30378bce864a32a8881203992a8ba023c8d - languageName: node - linkType: hard - -"@firebase/firestore-compat@npm:0.3.37": - version: 0.3.37 - resolution: "@firebase/firestore-compat@npm:0.3.37" - dependencies: - "@firebase/component": 0.6.9 - "@firebase/firestore": 4.7.2 - "@firebase/firestore-types": 3.0.2 - "@firebase/util": 1.10.0 - tslib: ^2.1.0 - peerDependencies: - "@firebase/app-compat": 0.x - checksum: d23b1d67efbce88f566eef01e61583b9682e696972643a43c9359e1d29dc4713d7f9b3c9e458a15b759867df705ef86844d95abfc1d48505b36bf1124fcec1a0 - languageName: node - linkType: hard - -"@firebase/firestore-types@npm:3.0.2": - version: 3.0.2 - resolution: "@firebase/firestore-types@npm:3.0.2" - peerDependencies: - "@firebase/app-types": 0.x - "@firebase/util": 1.x - checksum: b275107a2d65aecb1fe66d44feac4d74f8bd48f309bdfe53e6c84e5ba4787fae0700d8d045b07939cbc7c3c7c19935d1ca8efab9eda4f5f8ad50e3ee330b90ca - languageName: node - linkType: hard - -"@firebase/firestore@npm:4.7.2": - version: 4.7.2 - resolution: "@firebase/firestore@npm:4.7.2" - dependencies: - "@firebase/component": 0.6.9 - "@firebase/logger": 0.4.2 - "@firebase/util": 1.10.0 - "@firebase/webchannel-wrapper": 1.0.1 - "@grpc/grpc-js": ~1.9.0 - "@grpc/proto-loader": ^0.7.8 - tslib: ^2.1.0 - undici: 6.19.7 - peerDependencies: - "@firebase/app": 0.x - checksum: 79973e621e70a5c4f799e9ab41618cc3309584e32a1b9fe1da14dcc80ad6b055001963382346b5994c64f700595637be11034d534de796c1b314685df1bc4adb - languageName: node - linkType: hard - -"@firebase/functions-compat@npm:0.3.14": - version: 0.3.14 - resolution: "@firebase/functions-compat@npm:0.3.14" - dependencies: - "@firebase/component": 0.6.9 - "@firebase/functions": 0.11.8 - "@firebase/functions-types": 0.6.2 - "@firebase/util": 1.10.0 - tslib: ^2.1.0 - peerDependencies: - "@firebase/app-compat": 0.x - checksum: 577c4c877a267587fe81628ea03ee9507c73b6b5ab7c52cfa67b6e6e7e45725aa017f16307e223a3a9f495a2df2ef1c3a76c6455f50adb6bf7e85d649ed9d4e8 - languageName: node - linkType: hard - -"@firebase/functions-types@npm:0.6.2": - version: 0.6.2 - resolution: "@firebase/functions-types@npm:0.6.2" - checksum: 7973e0de0b709295e7e885929ff10d35dec5a1d92c0f827f9580abc3860d4ccfebf7af69bbbceabc9b62eb88642028a6373a14b5f7be388fa40211e64c5147fb - languageName: node - linkType: hard - -"@firebase/functions@npm:0.11.8": - version: 0.11.8 - resolution: "@firebase/functions@npm:0.11.8" - dependencies: - "@firebase/app-check-interop-types": 0.3.2 - "@firebase/auth-interop-types": 0.2.3 - "@firebase/component": 0.6.9 - "@firebase/messaging-interop-types": 0.2.2 - "@firebase/util": 1.10.0 - tslib: ^2.1.0 - undici: 6.19.7 - peerDependencies: - "@firebase/app": 0.x - checksum: 69b71d68bbfb7148878bb276594553f0da8e7d60dd05353e5ee90ec06ab0524526a2d8e412f6392ae3545740a58b7d99166a63af7023fc6b0ce555ddac174050 - languageName: node - linkType: hard - -"@firebase/installations-compat@npm:0.2.9": - version: 0.2.9 - resolution: "@firebase/installations-compat@npm:0.2.9" - dependencies: - "@firebase/component": 0.6.9 - "@firebase/installations": 0.6.9 - "@firebase/installations-types": 0.5.2 - "@firebase/util": 1.10.0 - tslib: ^2.1.0 - peerDependencies: - "@firebase/app-compat": 0.x - checksum: 2af49d1c18791b740803e3a95a4192c00067fd97e922bb0f9bf3b494df97a9d9f3c94956242942308a3fb454021ef92412dbb92023b05c21f561b1cd022aeea4 - languageName: node - linkType: hard - -"@firebase/installations-types@npm:0.5.2": - version: 0.5.2 - resolution: "@firebase/installations-types@npm:0.5.2" - peerDependencies: - "@firebase/app-types": 0.x - checksum: 19f31ab2982198ffed0cf0e57307bcf17dbc994f6ec707f508c151108b09a67472728f2ee744548bf079b458a982ac865d2fd6d6879fc7d16a7b7dbfa7263fa8 - languageName: node - linkType: hard - -"@firebase/installations@npm:0.6.9": - version: 0.6.9 - resolution: "@firebase/installations@npm:0.6.9" - dependencies: - "@firebase/component": 0.6.9 - "@firebase/util": 1.10.0 - idb: 7.1.1 - tslib: ^2.1.0 - peerDependencies: - "@firebase/app": 0.x - checksum: d769a96e30eb781bf826f140f859627878142a7f5a2f9c501b1fa21026b0e0c0c9037c4cc95fcfea03555cb12d62d960f7fb951175c424ce50d9fce37a26a333 - languageName: node - linkType: hard - -"@firebase/logger@npm:0.4.2": - version: 0.4.2 - resolution: "@firebase/logger@npm:0.4.2" - dependencies: - tslib: ^2.1.0 - checksum: a0d288debe32108095af691fa8797c5ee2023b0f4e0f5024992f7e49b5353d1fb0280ea950d8bfd5d93af514cf839f663fd3559303d0591fcb8b0efe3d879f0e - languageName: node - linkType: hard - -"@firebase/messaging-compat@npm:0.2.11": - version: 0.2.11 - resolution: "@firebase/messaging-compat@npm:0.2.11" - dependencies: - "@firebase/component": 0.6.9 - "@firebase/messaging": 0.12.11 - "@firebase/util": 1.10.0 - tslib: ^2.1.0 - peerDependencies: - "@firebase/app-compat": 0.x - checksum: f7cb460e26d284df9bb9727192801d763708d70a11175228d97578898b6fe76e2da3d49db50ca4aea9bc0e5b2275a0b50c1286c4f5164785b87453b1ce4d3af6 - languageName: node - linkType: hard - -"@firebase/messaging-interop-types@npm:0.2.2": - version: 0.2.2 - resolution: "@firebase/messaging-interop-types@npm:0.2.2" - checksum: 75dc6c7d3951866145e2706562cc38d98de0d8c23a08c04b41c5641e89da424f85af4606294f1430de3c191be6c74cf7e2be55bab810720f70ba4c2f20297dbb - languageName: node - linkType: hard - -"@firebase/messaging@npm:0.12.11": - version: 0.12.11 - resolution: "@firebase/messaging@npm:0.12.11" - dependencies: - "@firebase/component": 0.6.9 - "@firebase/installations": 0.6.9 - "@firebase/messaging-interop-types": 0.2.2 - "@firebase/util": 1.10.0 - idb: 7.1.1 - tslib: ^2.1.0 - peerDependencies: - "@firebase/app": 0.x - checksum: 90230086f8ae5b953c91fbfa37ce5f750e132af0591cf7ce18bcf254c042fa004ee50302f8aa2332b05bd328dfff88f180223fc898672a80ca83ab22bba2d715 - languageName: node - linkType: hard - -"@firebase/performance-compat@npm:0.2.9": - version: 0.2.9 - resolution: "@firebase/performance-compat@npm:0.2.9" - dependencies: - "@firebase/component": 0.6.9 - "@firebase/logger": 0.4.2 - "@firebase/performance": 0.6.9 - "@firebase/performance-types": 0.2.2 - "@firebase/util": 1.10.0 - tslib: ^2.1.0 - peerDependencies: - "@firebase/app-compat": 0.x - checksum: 790e30300234ed81a018d3ef661ef571fb86287ea6587e44664059e3f3e6edf8664e542bc92c2ab2092d38547517ddcd5f4dd0e0b3c67c1f4829a0f8ddb52af5 - languageName: node - linkType: hard - -"@firebase/performance-types@npm:0.2.2": - version: 0.2.2 - resolution: "@firebase/performance-types@npm:0.2.2" - checksum: ff4c6b445629ba30a182e476d9ec0c1640a4fdf258716ebfe98573196d8ca67000d588846cf7f17d2e2144315b55146a70a6b0b184e7a05c446eb18cf0b6b8e3 - languageName: node - linkType: hard - -"@firebase/performance@npm:0.6.9": - version: 0.6.9 - resolution: "@firebase/performance@npm:0.6.9" - dependencies: - "@firebase/component": 0.6.9 - "@firebase/installations": 0.6.9 - "@firebase/logger": 0.4.2 - "@firebase/util": 1.10.0 - tslib: ^2.1.0 - peerDependencies: - "@firebase/app": 0.x - checksum: 4c839db0ccd7c67bbf7ade2f5df54e4922cb2907306787d17710ad49b407c4cbfac5e04ce264e66b0051f03a8139abfbdf11014402ce28c78e7facf9ac0e5820 - languageName: node - linkType: hard - -"@firebase/remote-config-compat@npm:0.2.9": - version: 0.2.9 - resolution: "@firebase/remote-config-compat@npm:0.2.9" - dependencies: - "@firebase/component": 0.6.9 - "@firebase/logger": 0.4.2 - "@firebase/remote-config": 0.4.9 - "@firebase/remote-config-types": 0.3.2 - "@firebase/util": 1.10.0 - tslib: ^2.1.0 - peerDependencies: - "@firebase/app-compat": 0.x - checksum: 32001792b53cdbe8a353deaf8dc5b7571641a46a45cb102dbf4bbfab1cdab5fc9683d63eddc40fb1a14b18619ba74efc08013799db3fe73d868e4dccd981a1c3 - languageName: node - linkType: hard - -"@firebase/remote-config-types@npm:0.3.2": - version: 0.3.2 - resolution: "@firebase/remote-config-types@npm:0.3.2" - checksum: 15dfab0febb7eb382ba1d702b677a72d11f9a98379464a9047349b844c36edb572ba7f353681ad65ece3cd9bee387a945c0939b13ae5c5f221fa264671152adc - languageName: node - linkType: hard - -"@firebase/remote-config@npm:0.4.9": - version: 0.4.9 - resolution: "@firebase/remote-config@npm:0.4.9" - dependencies: - "@firebase/component": 0.6.9 - "@firebase/installations": 0.6.9 - "@firebase/logger": 0.4.2 - "@firebase/util": 1.10.0 - tslib: ^2.1.0 - peerDependencies: - "@firebase/app": 0.x - checksum: 0113a3ed2227273684bd3b7249ba2e8707e734b02292b97044e7cf89fe36ff6c830673fd7afc315eebd9b45b731551db9f72a0a58df792bee6e902320860d0a6 - languageName: node - linkType: hard - -"@firebase/storage-compat@npm:0.3.12": - version: 0.3.12 - resolution: "@firebase/storage-compat@npm:0.3.12" - dependencies: - "@firebase/component": 0.6.9 - "@firebase/storage": 0.13.2 - "@firebase/storage-types": 0.8.2 - "@firebase/util": 1.10.0 - tslib: ^2.1.0 - peerDependencies: - "@firebase/app-compat": 0.x - checksum: daa8418fdde22e4dbe532f04a079669630650a86167cfdaa06c74b54a53c9d71b834fd5e4bc3eb735f1223d1b866d77de937d1eccb486e4c83e208fcefd3a64b - languageName: node - linkType: hard - -"@firebase/storage-types@npm:0.8.2": - version: 0.8.2 - resolution: "@firebase/storage-types@npm:0.8.2" - peerDependencies: - "@firebase/app-types": 0.x - "@firebase/util": 1.x - checksum: c992f49cc5d326a096e2ec350464c2b0934fc7259c6616e11279bc970db980545d46d150a8edcaa48d028d6fed2ee28c25ff4d5c3ade46ec48c96444d7e11198 - languageName: node - linkType: hard - -"@firebase/storage@npm:0.13.2": - version: 0.13.2 - resolution: "@firebase/storage@npm:0.13.2" - dependencies: - "@firebase/component": 0.6.9 - "@firebase/util": 1.10.0 - tslib: ^2.1.0 - undici: 6.19.7 - peerDependencies: - "@firebase/app": 0.x - checksum: d7112f3771b9145fc5e70fe8cfbe7dc9e6a1b9fb41cd6d1ce7a330a8af316f5c507cf2e707175a96b954f50e21353eb691c6bc16e3317436946353333cdd9005 - languageName: node - linkType: hard - -"@firebase/util@npm:1.10.0": - version: 1.10.0 - resolution: "@firebase/util@npm:1.10.0" - dependencies: - tslib: ^2.1.0 - checksum: 3fb8f0e58145f10bf2de0497c89293cf76bcb79d440b818466f8e1e272e4051e04926443c611f930f862af00e174bd49dc9f0b2513ba1719263a5297d4837709 - languageName: node - linkType: hard - -"@firebase/vertexai-preview@npm:0.0.4": - version: 0.0.4 - resolution: "@firebase/vertexai-preview@npm:0.0.4" - dependencies: - "@firebase/app-check-interop-types": 0.3.2 - "@firebase/component": 0.6.9 - "@firebase/logger": 0.4.2 - "@firebase/util": 1.10.0 - tslib: ^2.1.0 - peerDependencies: - "@firebase/app": 0.x - "@firebase/app-types": 0.x - checksum: bd46147ecc404d20662c0839dd2cfe855f415f9513755a795d642cbaad88ccb50f7fdbed08a879c58dae9f4df57e9dd7328141129a2e8e80c4b5a0b66723b68a - languageName: node - linkType: hard - -"@firebase/webchannel-wrapper@npm:1.0.1": - version: 1.0.1 - resolution: "@firebase/webchannel-wrapper@npm:1.0.1" - checksum: 4e12cf7866d9ceeaa7cab49b31dd5559a3ec5626137679f52598935720893022de6feac0bfd5c911886c0c0059c04dab58a000d8fd2612da266ca09a1f4412cb - languageName: node - linkType: hard - -"@floating-ui/core@npm:^1.0.0, @floating-ui/core@npm:^1.6.0": - version: 1.6.4 - resolution: "@floating-ui/core@npm:1.6.4" - dependencies: - "@floating-ui/utils": ^0.2.4 - checksum: 6855472c00ceaa14e0f1cb4bd5de0de01d05cd46bdf12cb19bd6a89fa70bdfba0460a776dc50d28ab40e3bddc291e2211958497528fdd98653ea7260d61e0442 - languageName: node - linkType: hard - -"@floating-ui/dom@npm:^1.0.0": - version: 1.6.7 - resolution: "@floating-ui/dom@npm:1.6.7" - dependencies: - "@floating-ui/core": ^1.6.0 - "@floating-ui/utils": ^0.2.4 - checksum: 66605a2948bfe7532408197b4c522fecf04cf11e7839623d0dca0d22362b42d64a5db2f3be865053e9b0d44c89faf1befa9a4ce1b7fa595d1b3dc82f635d079c - languageName: node - linkType: hard - -"@floating-ui/react-dom@npm:^2.1.2": - version: 2.1.2 - resolution: "@floating-ui/react-dom@npm:2.1.2" - dependencies: - "@floating-ui/dom": ^1.0.0 - peerDependencies: - react: ">=16.8.0" - react-dom: ">=16.8.0" - checksum: 25bb031686e23062ed4222a8946e76b3f9021d40a48437bd747233c4964a766204b8a55f34fa8b259839af96e60db7c6e3714d81f1de06914294f90e86ffbc48 - languageName: node - linkType: hard - -"@floating-ui/react-native@npm:^0.10.6": - version: 0.10.6 - resolution: "@floating-ui/react-native@npm:0.10.6" - dependencies: - "@floating-ui/core": ^1.0.0 - peerDependencies: - react: ">=16.8.0" - react-native: ">=0.64.0" - checksum: 06c701132c43ed3d0d49729e17c551d21a67a053795cdec576afc645dd7092157404924660fecbdadb58ebbd7b43693a3f99b094458a58d2859705d43423fb73 - languageName: node - linkType: hard - -"@floating-ui/react@npm:^0.26.24": - version: 0.26.28 - resolution: "@floating-ui/react@npm:0.26.28" - dependencies: - "@floating-ui/react-dom": ^2.1.2 - "@floating-ui/utils": ^0.2.8 - tabbable: ^6.0.0 - peerDependencies: - react: ">=16.8.0" - react-dom: ">=16.8.0" - checksum: 1bfcccdb1f388ceb0075dc3e46934f4f04ef10bff2f971e1bf79067391c8729b366025caca0a42f5ca80854820a621a9edecbacdc046c33eb428f508fd6ce1f3 - languageName: node - linkType: hard - -"@floating-ui/utils@npm:^0.2.4, @floating-ui/utils@npm:^0.2.8": - version: 0.2.8 - resolution: "@floating-ui/utils@npm:0.2.8" - checksum: deb98bba017c4e073c7ad5740d4dec33a4d3e0942d412e677ac0504f3dade15a68fc6fd164d43c93c0bb0bcc5dc5015c1f4080dfb1a6161140fe660624f7c875 - languageName: node - linkType: hard - -"@formatjs/ecma402-abstract@npm:1.11.10": - version: 1.11.10 - resolution: "@formatjs/ecma402-abstract@npm:1.11.10" - dependencies: - "@formatjs/intl-localematcher": 0.2.30 - tslib: 2.4.0 - checksum: 48139e195a3db2b982f4be3e9cbe6adff2eccde447710e37dffd80a3361aa83cf1a286f0735e0003120b62210da05542716d0647fb565f3cc23430ff77a13c65 - languageName: node - linkType: hard - -"@formatjs/ecma402-abstract@npm:1.11.2": - version: 1.11.2 - resolution: "@formatjs/ecma402-abstract@npm:1.11.2" - dependencies: - "@formatjs/intl-localematcher": 0.2.23 - tslib: ^2.1.0 - checksum: 9688d278bc43c3792cbaa3707ebef92bc20f35e17c5f81b7c7b401a6688df4282a352e8a542f84ea941b16b61edb2524898b19f78bb79d3b0fe23c53517eb62d - languageName: node - linkType: hard - -"@formatjs/ecma402-abstract@npm:2.2.4": - version: 2.2.4 - resolution: "@formatjs/ecma402-abstract@npm:2.2.4" - dependencies: - "@formatjs/fast-memoize": 2.2.3 - "@formatjs/intl-localematcher": 0.5.8 - tslib: 2 - checksum: 48e9ea01b0e1bdf9af9ccd68019b7026bc5e1c43f2cebfad2011504f8de533545bf862c42272f6fbcede13731d78a9cb98aec546fd9bdc52877e9cff5d7ff34d - languageName: node - linkType: hard - -"@formatjs/fast-memoize@npm:2.2.3": - version: 2.2.3 - resolution: "@formatjs/fast-memoize@npm:2.2.3" - dependencies: - tslib: 2 - checksum: a9634acb5e03d051e09881eea5484ab02271f7d6b5f96ae9485674ab3c359aa881bc45fc07a1181ae4b2d6e288dadc169f578d142d698913ebbefa373014cac2 - languageName: node - linkType: hard - -"@formatjs/intl-datetimeformat@npm:4.5.1": - version: 4.5.1 - resolution: "@formatjs/intl-datetimeformat@npm:4.5.1" - dependencies: - "@formatjs/ecma402-abstract": 1.11.2 - "@formatjs/intl-localematcher": 0.2.23 - tslib: ^2.1.0 - checksum: 460a6dfe736faa9f687e62cc142b0ff72ff8c6a7ee7876fef33b4d046c651c99ced35940b5cb67600815fc94f44d07cf93aaab05a9c6d4889dd5a52d2ae4dd14 - languageName: node - linkType: hard - -"@formatjs/intl-getcanonicallocales@npm:1.9.0": - version: 1.9.0 - resolution: "@formatjs/intl-getcanonicallocales@npm:1.9.0" - dependencies: - tslib: ^2.1.0 - peerDependencies: - "@types/node": 14 || 16 || 17 - checksum: 84d246a6a777a6676caeb0f117b74fb584f93b776404523fc7ae6d9be30743a731e00d8d11a1fccd73fbcd2438178eb7c0d01fcbf4b71fa081847173c9b93bfc - languageName: node - linkType: hard - -"@formatjs/intl-listformat@npm:7.7.5": - version: 7.7.5 - resolution: "@formatjs/intl-listformat@npm:7.7.5" - dependencies: - "@formatjs/ecma402-abstract": 2.2.4 - "@formatjs/intl-localematcher": 0.5.8 - tslib: 2 - checksum: 75e13ae48bc3dc382c8ad3bbb6cdda3bed32790e1513c861dd8a28ad8bcfe4ee07f302f96d291a7aaa7537a22f914156ab3de759e000f0e453ea398aaa6caf7e - languageName: node - linkType: hard - -"@formatjs/intl-locale@npm:2.4.44": - version: 2.4.44 - resolution: "@formatjs/intl-locale@npm:2.4.44" - dependencies: - "@formatjs/ecma402-abstract": 1.11.2 - "@formatjs/intl-getcanonicallocales": 1.9.0 - tslib: ^2.1.0 - checksum: 53651bd1ed172ade88986d083249b2f7ad0b14e6686d33527e702602bbdaa2b19ae39f2a28d72626da5e94f41e77086181e265821dd75723e45ea15b8db44492 - languageName: node - linkType: hard - -"@formatjs/intl-localematcher@npm:0.2.23": - version: 0.2.23 - resolution: "@formatjs/intl-localematcher@npm:0.2.23" - dependencies: - tslib: ^2.1.0 - checksum: 65bf8a126f3ef263548c6b3a55f2e9b441ec2745e49e4f8b19ba887ba0d908cfb821a1e644f15d381de6221b4276c50d6469e25da54bba0cdb2ef882f1ca4dfe - languageName: node - linkType: hard - -"@formatjs/intl-localematcher@npm:0.2.30": - version: 0.2.30 - resolution: "@formatjs/intl-localematcher@npm:0.2.30" - dependencies: - tslib: 2.4.0 - checksum: 911737ff600d934ff45bfe70224c8cac53865cbb78639bee3a229cdc878412f42c7920238b3224bdd723ea309a3e84617d2446da68083efa094484bf0c39bb1f - languageName: node - linkType: hard - -"@formatjs/intl-localematcher@npm:0.5.8": - version: 0.5.8 - resolution: "@formatjs/intl-localematcher@npm:0.5.8" - dependencies: - tslib: 2 - checksum: db1a06d6ee929497e73536f9f53e4a8698e0a648fad2fbeec1a32b8786c78627ad996b6da6b8fecb2686bbc6011e09c2a5206742a22f42ef4c5c67b190de760a - languageName: node - linkType: hard - -"@formatjs/intl-numberformat@npm:7.4.1": - version: 7.4.1 - resolution: "@formatjs/intl-numberformat@npm:7.4.1" - dependencies: - "@formatjs/ecma402-abstract": 1.11.2 - "@formatjs/intl-localematcher": 0.2.23 - tslib: ^2.1.0 - checksum: cea740b4ab80e23f7c5ad06b65d00a1bf85b5547a82a4b5aeb29289a3dea3b8f35b98a1cdff1d0ac5d2abb0522d5de7d0e975b8f6c257f1e6502e5b8f338a506 - languageName: node - linkType: hard - -"@formatjs/intl-pluralrules@npm:4.3.1": - version: 4.3.1 - resolution: "@formatjs/intl-pluralrules@npm:4.3.1" - dependencies: - "@formatjs/ecma402-abstract": 1.11.2 - "@formatjs/intl-localematcher": 0.2.23 - tslib: ^2.1.0 - checksum: 2ea620c5d131e92fa6cd232e6b233647456184663ae90bbfe479a1b24446e81d3b91f4a26d84ffa7d0dcf5aae7e304cd3172a4aa4989d2c337ca31999ff3a981 - languageName: node - linkType: hard - -"@formatjs/intl-relativetimeformat@npm:11.1.2": - version: 11.1.2 - resolution: "@formatjs/intl-relativetimeformat@npm:11.1.2" - dependencies: - "@formatjs/ecma402-abstract": 1.11.10 - "@formatjs/intl-localematcher": 0.2.30 - tslib: 2.4.0 - checksum: b627b40a5afc801f5636c047c8d8461204cf9f0030f8df7b1cda662fd896f67319c3e5914571fa50719d7047d698ac523ef19d84fd0fbbe51162325ad20b0c92 - languageName: node - linkType: hard - -"@gar/promisify@npm:^1.1.3": - version: 1.1.3 - resolution: "@gar/promisify@npm:1.1.3" - checksum: 4059f790e2d07bf3c3ff3e0fec0daa8144fe35c1f6e0111c9921bd32106adaa97a4ab096ad7dab1e28ee6a9060083c4d1a4ada42a7f5f3f7a96b8812e2b757c1 - languageName: node - linkType: hard - -"@gitbeaker/core@npm:^21.7.0": - version: 21.7.0 - resolution: "@gitbeaker/core@npm:21.7.0" - dependencies: - "@gitbeaker/requester-utils": ^21.7.0 - form-data: ^3.0.0 - li: ^1.3.0 - xcase: ^2.0.1 - checksum: 2f196849855e2d89573e49aed58d5f792833196b1a32cb2d0c84e7b00b6e6bd54f001498a598486fc226daec6cbbdeb739ffeb38f54dc1ba5c8ed14c8f035180 - languageName: node - linkType: hard - -"@gitbeaker/node@npm:^21.3.0": - version: 21.7.0 - resolution: "@gitbeaker/node@npm:21.7.0" - dependencies: - "@gitbeaker/core": ^21.7.0 - "@gitbeaker/requester-utils": ^21.7.0 - form-data: ^3.0.0 - got: ^11.1.4 - xcase: ^2.0.1 - checksum: 397c5c1227faba1dee4c2c65cd4651014e80701922a3bd24ebd8567a9aa05c848b253583c8ca498e328177ae30fd6c29489daf43d20786e88ab40b6c0df15b05 - languageName: node - linkType: hard - -"@gitbeaker/requester-utils@npm:^21.7.0": - version: 21.7.0 - resolution: "@gitbeaker/requester-utils@npm:21.7.0" - dependencies: - form-data: ^3.0.0 - query-string: ^6.12.1 - xcase: ^2.0.1 - checksum: 3e0bc40e6ae2d3492aaea632b8963fa89785d74eed434122a64e7d07069fafd2fbb0b0f5eddc309a1f7a8907de2cf0a591ff8f94176889814e713e79b8cd6a6b - languageName: node - linkType: hard - -"@google-cloud/common@npm:^5.0.0": - version: 5.0.2 - resolution: "@google-cloud/common@npm:5.0.2" - dependencies: - "@google-cloud/projectify": ^4.0.0 - "@google-cloud/promisify": ^4.0.0 - arrify: ^2.0.1 - duplexify: ^4.1.1 - extend: ^3.0.2 - google-auth-library: ^9.0.0 - html-entities: ^2.5.2 - retry-request: ^7.0.0 - teeny-request: ^9.0.0 - checksum: 13c3af95830c1410edb52b9a1bb8cbaf1b47e63be6049eae9c06b728225fd59f6acce1d8cdba575c14a2bb7e929acf9320bf8aec3f67409d920143a90a69dc53 - languageName: node - linkType: hard - -"@google-cloud/logging@npm:^11.0.0": - version: 11.1.0 - resolution: "@google-cloud/logging@npm:11.1.0" - dependencies: - "@google-cloud/common": ^5.0.0 - "@google-cloud/paginator": ^5.0.0 - "@google-cloud/projectify": ^4.0.0 - "@google-cloud/promisify": ^4.0.0 - arrify: ^2.0.1 - dot-prop: ^6.0.0 - eventid: ^2.0.0 - extend: ^3.0.2 - gcp-metadata: ^6.0.0 - google-auth-library: ^9.0.0 - google-gax: ^4.0.3 - on-finished: ^2.3.0 - pumpify: ^2.0.1 - stream-events: ^1.0.5 - uuid: ^9.0.0 - checksum: 603dd493bd2a1db501e86d80293c6afbe56772b60efa557b38b82fa5837354a1e8328b5e73382030b660cd9691755a33f74b914dd6330a151f32b11b09dbed57 - languageName: node - linkType: hard - -"@google-cloud/paginator@npm:^5.0.0": - version: 5.0.2 - resolution: "@google-cloud/paginator@npm:5.0.2" - dependencies: - arrify: ^2.0.0 - extend: ^3.0.2 - checksum: eeb4a387807270ba9f69f22d7439d60c5bd6663573c2da9ea7d998c373d77671d77450b87f0f229c28418df654af4064e70554fa4dcde7edb3c0f5c05f208246 - languageName: node - linkType: hard - -"@google-cloud/projectify@npm:^4.0.0": - version: 4.0.0 - resolution: "@google-cloud/projectify@npm:4.0.0" - checksum: 973d28414ae200433333a3c315aebb881ced42ea4afe6f3f8520d2fecded75e76c913f5189fea8fb29ce6ca36117c4f44001b3c503eecdd3ac7f02597a98354a - languageName: node - linkType: hard - -"@google-cloud/promisify@npm:^4.0.0": - version: 4.0.0 - resolution: "@google-cloud/promisify@npm:4.0.0" - checksum: edd189398c5ed5b7b64a373177d77c87d076a248c31b8ae878bb91e2411d89860108bcb948c349f32628973a823bd131beb53ec008fd613a8cb466ef1d89de49 - languageName: node - linkType: hard - -"@google-cloud/run@npm:^1.0.2": - version: 1.3.0 - resolution: "@google-cloud/run@npm:1.3.0" - dependencies: - google-gax: ^4.0.3 - checksum: e3f8c1adee61e18b73faebc1011db95d8f594b9bedc61af2f5125f8bd0cc6c8b45285c6df3aee9d24ecb1da6d9f97292069acb3a8abd9f4a866ba2e6e0ed5377 - languageName: node - linkType: hard - -"@gorhom/bottom-sheet@npm:4.6.4": - version: 4.6.4 - resolution: "@gorhom/bottom-sheet@npm:4.6.4" - dependencies: - "@gorhom/portal": 1.0.14 - invariant: ^2.2.4 - peerDependencies: - "@types/react": "*" - "@types/react-native": "*" - react: "*" - react-native: "*" - react-native-gesture-handler: ">=1.10.1" - react-native-reanimated: ">=2.2.0" - peerDependenciesMeta: - "@types/react": - optional: true - "@types/react-native": - optional: true - checksum: 2cea033c4f321b93fdbf61470b507b5efd51425a8ab927b49d7aaa1d9f0568cbcfb188e385311389dbffbafe47b941dbd3e60f74b1d663a1a2d73262e2719f85 - languageName: node - linkType: hard - -"@gorhom/bottom-sheet@patch:@gorhom/bottom-sheet@npm%3A4.6.4#./.yarn/patches/@gorhom-bottom-sheet-npm-4.6.4-5b2c27bb1f.patch::locator=universe%40workspace%3A.": - version: 4.6.4 - resolution: "@gorhom/bottom-sheet@patch:@gorhom/bottom-sheet@npm%3A4.6.4#./.yarn/patches/@gorhom-bottom-sheet-npm-4.6.4-5b2c27bb1f.patch::version=4.6.4&hash=8cfadb&locator=universe%40workspace%3A." - dependencies: - "@gorhom/portal": 1.0.14 - invariant: ^2.2.4 - peerDependencies: - "@types/react": "*" - "@types/react-native": "*" - react: "*" - react-native: "*" - react-native-gesture-handler: ">=1.10.1" - react-native-reanimated: ">=2.2.0" - peerDependenciesMeta: - "@types/react": - optional: true - "@types/react-native": - optional: true - checksum: c28e0e28e4bd46d62001a366b132be40fd8c0af72c22c3b8cd40df467266c7bc0ece8c56c173f7a70119c5551b908007f6d24494a6835d8e136adbba61c2489c - languageName: node - linkType: hard - -"@gorhom/portal@npm:1.0.14": - version: 1.0.14 - resolution: "@gorhom/portal@npm:1.0.14" - dependencies: - nanoid: ^3.3.1 - peerDependencies: - react: "*" - react-native: "*" - checksum: 227bb96a2db854ab29bb9da8d4f3823c7f7448358de459709dd1b78522110da564c9a8734c6bc7d7153ed7c99320e0fb5d60b420c2ebb75ecaf2f0d757f410f9 - languageName: node - linkType: hard - -"@graphql-codegen/add@npm:^4.0.1": - version: 4.0.1 - resolution: "@graphql-codegen/add@npm:4.0.1" - dependencies: - "@graphql-codegen/plugin-helpers": ^4.1.0 - tslib: ~2.5.0 - peerDependencies: - graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 - checksum: 0a1ee993cda0fd2adbffd79db03007e9eaa32830607ba6d46c12414bd9e0f568cee8c0d9ad976915b35a4647ff3201364383e57e023ab7dfd3b18f7c69c464e8 - languageName: node - linkType: hard - -"@graphql-codegen/cli@npm:3.3.1": - version: 3.3.1 - resolution: "@graphql-codegen/cli@npm:3.3.1" - dependencies: - "@babel/generator": ^7.18.13 - "@babel/template": ^7.18.10 - "@babel/types": ^7.18.13 - "@graphql-codegen/core": ^3.1.0 - "@graphql-codegen/plugin-helpers": ^4.2.0 - "@graphql-tools/apollo-engine-loader": ^7.3.6 - "@graphql-tools/code-file-loader": ^7.3.17 - "@graphql-tools/git-loader": ^7.2.13 - "@graphql-tools/github-loader": ^7.3.20 - "@graphql-tools/graphql-file-loader": ^7.5.0 - "@graphql-tools/json-file-loader": ^7.4.1 - "@graphql-tools/load": ^7.8.0 - "@graphql-tools/prisma-loader": ^7.2.49 - "@graphql-tools/url-loader": ^7.13.2 - "@graphql-tools/utils": ^9.0.0 - "@parcel/watcher": ^2.1.0 - "@whatwg-node/fetch": ^0.8.0 - chalk: ^4.1.0 - cosmiconfig: ^7.0.0 - debounce: ^1.2.0 - detect-indent: ^6.0.0 - graphql-config: ^4.5.0 - inquirer: ^8.0.0 - is-glob: ^4.0.1 - jiti: ^1.17.1 - json-to-pretty-yaml: ^1.2.2 - listr2: ^4.0.5 - log-symbols: ^4.0.0 - micromatch: ^4.0.5 - shell-quote: ^1.7.3 - string-env-interpolation: ^1.0.1 - ts-log: ^2.2.3 - tslib: ^2.4.0 - yaml: ^1.10.0 - yargs: ^17.0.0 - peerDependencies: - graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 - bin: - gql-gen: cjs/bin.js - graphql-code-generator: cjs/bin.js - graphql-codegen: cjs/bin.js - graphql-codegen-esm: esm/bin.js - checksum: cc3c0b8f1fd8150591b35b549a04577e84ac9c30396ad100196f594f741dd34e69ec9b1335ec41c00afe4ecf1d7e3505c1859fa244bdef1d10753d2b441de962 - languageName: node - linkType: hard - -"@graphql-codegen/client-preset@npm:3.0.1": - version: 3.0.1 - resolution: "@graphql-codegen/client-preset@npm:3.0.1" - dependencies: - "@babel/helper-plugin-utils": ^7.20.2 - "@babel/template": ^7.20.7 - "@graphql-codegen/add": ^4.0.1 - "@graphql-codegen/gql-tag-operations": 3.0.1 - "@graphql-codegen/plugin-helpers": ^4.2.0 - "@graphql-codegen/typed-document-node": ^4.0.1 - "@graphql-codegen/typescript": ^3.0.4 - "@graphql-codegen/typescript-operations": ^3.0.4 - "@graphql-codegen/visitor-plugin-common": ^3.1.1 - "@graphql-tools/documents": ^0.1.0 - "@graphql-tools/utils": ^9.0.0 - "@graphql-typed-document-node/core": 3.2.0 - tslib: ~2.5.0 - peerDependencies: - graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 - checksum: fb99d0b06c69775253f2efe96080f3da6815ff164807748b1fa36084d1759b4d21cf17f7587f839cb180748a087bd02492218b24d18cee521136ecd16b6428f5 - languageName: node - linkType: hard - -"@graphql-codegen/core@npm:^3.1.0": - version: 3.1.0 - resolution: "@graphql-codegen/core@npm:3.1.0" - dependencies: - "@graphql-codegen/plugin-helpers": ^4.1.0 - "@graphql-tools/schema": ^9.0.0 - "@graphql-tools/utils": ^9.1.1 - tslib: ~2.5.0 - peerDependencies: - graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 - checksum: 7ace2b185242d00575b877b0bbb884c66915d246ba17a98c0ab82c2ee3a93ff2c9ae9d7d75a1d346de02ca8f12eb02801ffe2da4846da6e164b43176cd02dd8c - languageName: node - linkType: hard - -"@graphql-codegen/gql-tag-operations@npm:3.0.1": - version: 3.0.1 - resolution: "@graphql-codegen/gql-tag-operations@npm:3.0.1" - dependencies: - "@graphql-codegen/plugin-helpers": ^4.2.0 - "@graphql-codegen/visitor-plugin-common": 3.1.1 - "@graphql-tools/utils": ^9.0.0 - auto-bind: ~4.0.0 - tslib: ~2.5.0 - peerDependencies: - graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 - checksum: 894b63af357e3dda9048eb0ade22a2449e3385ea7c72cf70639a7b8e3b4f949fce74120fd7e2602924af8db3e63268a116816c57695e9f81078e38d0a5ec6ea6 - languageName: node - linkType: hard - -"@graphql-codegen/plugin-helpers@npm:^2.7.2": - version: 2.7.2 - resolution: "@graphql-codegen/plugin-helpers@npm:2.7.2" - dependencies: - "@graphql-tools/utils": ^8.8.0 - change-case-all: 1.0.14 - common-tags: 1.8.2 - import-from: 4.0.0 - lodash: ~4.17.0 - tslib: ~2.4.0 - peerDependencies: - graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 - checksum: 66e0d507ad5db60b67092ebf7632d464d56ab446ac8fd87c293e00d9016944912d8cf9199e3e026b0a9247a50f50c4118a44f49e13675db64211652cd6259b05 - languageName: node - linkType: hard - -"@graphql-codegen/plugin-helpers@npm:^4.1.0, @graphql-codegen/plugin-helpers@npm:^4.2.0": - version: 4.2.0 - resolution: "@graphql-codegen/plugin-helpers@npm:4.2.0" - dependencies: - "@graphql-tools/utils": ^9.0.0 - change-case-all: 1.0.15 - common-tags: 1.8.2 - import-from: 4.0.0 - lodash: ~4.17.0 - tslib: ~2.5.0 - peerDependencies: - graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 - checksum: 5d26adc132026916db061d23b06fc2c329f372f19ecf56e39bd2b30082bff642f2030cd6dc0bad8d2d3ab781c1e145384e040310a479b83d85ec804b2983646d - languageName: node - linkType: hard - -"@graphql-codegen/schema-ast@npm:^3.0.1": - version: 3.0.1 - resolution: "@graphql-codegen/schema-ast@npm:3.0.1" - dependencies: - "@graphql-codegen/plugin-helpers": ^4.1.0 - "@graphql-tools/utils": ^9.0.0 - tslib: ~2.5.0 - peerDependencies: - graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 - checksum: 620aa67a4ae59ccb4609763b7347d05e2cec62bf1362be3e1e01fc00969cdbb858398542aa261128e5b5e3cb6808b77861bdcf82662e80326e72b418f25f465f - languageName: node - linkType: hard - -"@graphql-codegen/typed-document-node@npm:^4.0.1": - version: 4.0.1 - resolution: "@graphql-codegen/typed-document-node@npm:4.0.1" - dependencies: - "@graphql-codegen/plugin-helpers": ^4.2.0 - "@graphql-codegen/visitor-plugin-common": 3.1.1 - auto-bind: ~4.0.0 - change-case-all: 1.0.15 - tslib: ~2.5.0 - peerDependencies: - graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 - checksum: fedbcab3cd5852a91b8d3840e5ec156b18605334e45a9ac4265ace54fefef612840f6d4f300924746d91e7d3908daf29610c915230047d4ec5316b61897e1986 - languageName: node - linkType: hard - -"@graphql-codegen/typescript-operations@npm:3.0.4, @graphql-codegen/typescript-operations@npm:^3.0.4": - version: 3.0.4 - resolution: "@graphql-codegen/typescript-operations@npm:3.0.4" - dependencies: - "@graphql-codegen/plugin-helpers": ^4.2.0 - "@graphql-codegen/typescript": ^3.0.4 - "@graphql-codegen/visitor-plugin-common": 3.1.1 - auto-bind: ~4.0.0 - tslib: ~2.5.0 - peerDependencies: - graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 - checksum: 734ce9d77d377037b2ac8ae70c02b7d733dee1917bb0559daedc44afade1b7eea2b7d88f10404c2fca82719fd9588a5e482e609fae1169639b8b94a3e7577fcd - languageName: node - linkType: hard - -"@graphql-codegen/typescript-react-apollo@npm:3.3.7": - version: 3.3.7 - resolution: "@graphql-codegen/typescript-react-apollo@npm:3.3.7" - dependencies: - "@graphql-codegen/plugin-helpers": ^2.7.2 - "@graphql-codegen/visitor-plugin-common": 2.13.1 - auto-bind: ~4.0.0 - change-case-all: 1.0.14 - tslib: ~2.4.0 - peerDependencies: - graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 - graphql-tag: ^2.0.0 - checksum: e21d111ce1c968499a7f233d15801725f67745c53b70a3d6c6076824f81787e7dda34b248e8f606c8a4920dd0c078db1cf644ebd6ffde9b4e7b5b0cd652a4127 - languageName: node - linkType: hard - -"@graphql-codegen/typescript-resolvers@npm:3.2.1": - version: 3.2.1 - resolution: "@graphql-codegen/typescript-resolvers@npm:3.2.1" - dependencies: - "@graphql-codegen/plugin-helpers": ^4.2.0 - "@graphql-codegen/typescript": ^3.0.4 - "@graphql-codegen/visitor-plugin-common": 3.1.1 - "@graphql-tools/utils": ^9.0.0 - auto-bind: ~4.0.0 - tslib: ~2.5.0 - peerDependencies: - graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 - checksum: a84f8fc68fe778beabbf537f1312699a220a3a605d972403075d8307fb7fe9aec73ae2eb5b42dea9f3a7c91deabfe6e1271d607e1b2c84b346686107f39354fb - languageName: node - linkType: hard - -"@graphql-codegen/typescript@npm:3.0.4, @graphql-codegen/typescript@npm:^3.0.4": - version: 3.0.4 - resolution: "@graphql-codegen/typescript@npm:3.0.4" - dependencies: - "@graphql-codegen/plugin-helpers": ^4.2.0 - "@graphql-codegen/schema-ast": ^3.0.1 - "@graphql-codegen/visitor-plugin-common": 3.1.1 - auto-bind: ~4.0.0 - tslib: ~2.5.0 - peerDependencies: - graphql: ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 - checksum: ede5311c5f620e16c3e98f51bdcedc7fd42f2c552a8ca5a946f757dc9709c384a12d32d088769d04041461d3318159ad0644f70056aea1877ee80a0bdc48de1f - languageName: node - linkType: hard - -"@graphql-codegen/visitor-plugin-common@npm:2.13.1": - version: 2.13.1 - resolution: "@graphql-codegen/visitor-plugin-common@npm:2.13.1" - dependencies: - "@graphql-codegen/plugin-helpers": ^2.7.2 - "@graphql-tools/optimize": ^1.3.0 - "@graphql-tools/relay-operation-optimizer": ^6.5.0 - "@graphql-tools/utils": ^8.8.0 - auto-bind: ~4.0.0 - change-case-all: 1.0.14 - dependency-graph: ^0.11.0 - graphql-tag: ^2.11.0 - parse-filepath: ^1.0.2 - tslib: ~2.4.0 - peerDependencies: - graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 - checksum: 0c329aa6e435602f2f6c1569ec2091b7850f58cc5dca7ac763c38c82588545ec1110c1de587f5f3949b11ff96f94401d1e63e329607d78424583b276fd08f1ae - languageName: node - linkType: hard - -"@graphql-codegen/visitor-plugin-common@npm:3.1.1, @graphql-codegen/visitor-plugin-common@npm:^3.1.1": - version: 3.1.1 - resolution: "@graphql-codegen/visitor-plugin-common@npm:3.1.1" - dependencies: - "@graphql-codegen/plugin-helpers": ^4.2.0 - "@graphql-tools/optimize": ^1.3.0 - "@graphql-tools/relay-operation-optimizer": ^6.5.0 - "@graphql-tools/utils": ^9.0.0 - auto-bind: ~4.0.0 - change-case-all: 1.0.15 - dependency-graph: ^0.11.0 - graphql-tag: ^2.11.0 - parse-filepath: ^1.0.2 - tslib: ~2.5.0 - peerDependencies: - graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 - checksum: 8dbef75ba0576a7de5e134b53778d64d818084df01e74554adc979f08db8446e9734889575c820449b6ef9febd6a9005fb89c7c9c101a9e398c195b5c3279353 - languageName: node - linkType: hard - -"@graphql-tools/apollo-engine-loader@npm:^7.3.6": - version: 7.3.17 - resolution: "@graphql-tools/apollo-engine-loader@npm:7.3.17" - dependencies: - "@ardatan/sync-fetch": 0.0.1 - "@graphql-tools/utils": 9.0.1 - "@whatwg-node/fetch": ^0.5.0 - tslib: ^2.4.0 - peerDependencies: - graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - checksum: dd283960da64ab526b60d976fc31e5c90c3c67f379ae77dceadfef6ed0c435e315f605e280e12d8f2a8d0cb3433e9c6df20c0afe0e0f05971f652852cdf24023 - languageName: node - linkType: hard - -"@graphql-tools/batch-execute@npm:^8.5.22": - version: 8.5.22 - resolution: "@graphql-tools/batch-execute@npm:8.5.22" - dependencies: - "@graphql-tools/utils": ^9.2.1 - dataloader: ^2.2.2 - tslib: ^2.4.0 - value-or-promise: ^1.0.12 - peerDependencies: - graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - checksum: 4f7f7ba104737a57d0bd5b2b38b8dbf24d6db9e3ce8f8d1b8c3109702305c212b54b7642853c1584b12ce3a9136286b600076e94861c0bd1d29a218f44401224 - languageName: node - linkType: hard - -"@graphql-tools/code-file-loader@npm:^7.3.17": - version: 7.3.23 - resolution: "@graphql-tools/code-file-loader@npm:7.3.23" - dependencies: - "@graphql-tools/graphql-tag-pluck": 7.5.2 - "@graphql-tools/utils": ^9.2.1 - globby: ^11.0.3 - tslib: ^2.4.0 - unixify: ^1.0.0 - peerDependencies: - graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - checksum: fb1dfa807b9d5798936c7fe31cf5356412d9b5a25a08d5952b607921637afbe26555cb662cf97f82dfdf47ed8e7c2a42f527238fb2defd3be4505e15fb6027c3 - languageName: node - linkType: hard - -"@graphql-tools/delegate@npm:^9.0.31": - version: 9.0.35 - resolution: "@graphql-tools/delegate@npm:9.0.35" - dependencies: - "@graphql-tools/batch-execute": ^8.5.22 - "@graphql-tools/executor": ^0.0.20 - "@graphql-tools/schema": ^9.0.19 - "@graphql-tools/utils": ^9.2.1 - dataloader: ^2.2.2 - tslib: ^2.5.0 - value-or-promise: ^1.0.12 - peerDependencies: - graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - checksum: 4edd827d1767dc33ea1e28f8ceb30f82e1cdb47a9390cecc0a45f51594c6df28d11b2c2eec083e27fa45a76451c8490f2f826effc2dff9977de3fe1b66b2aadb - languageName: node - linkType: hard - -"@graphql-tools/documents@npm:^0.1.0": - version: 0.1.0 - resolution: "@graphql-tools/documents@npm:0.1.0" - dependencies: - lodash.sortby: ^4.7.0 - tslib: ^2.4.0 - peerDependencies: - graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - checksum: bac6ccc240687ba2f2639412c2d335e94dea22ce9c283edaa90c87148eeb4ff9caa6ba510e6e4c00fcf538d24ae27dcff60c06a7f47e6ad9592d880434b5a669 - languageName: node - linkType: hard - -"@graphql-tools/executor-graphql-ws@npm:^0.0.14": - version: 0.0.14 - resolution: "@graphql-tools/executor-graphql-ws@npm:0.0.14" - dependencies: - "@graphql-tools/utils": ^9.2.1 - "@repeaterjs/repeater": 3.0.4 - "@types/ws": ^8.0.0 - graphql-ws: 5.12.1 - isomorphic-ws: 5.0.0 - tslib: ^2.4.0 - ws: 8.13.0 - peerDependencies: - graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - checksum: c18f3ca3d70098017ff71045ae13de1d88c8dc0954af0d7a389aebdc831c82b678f9cf9b50ed065d5262d59a558b4f9be3b7b04e5002bae47a503493fc0b7542 - languageName: node - linkType: hard - -"@graphql-tools/executor-http@npm:^0.1.7, @graphql-tools/executor-http@npm:^0.1.9": - version: 0.1.9 - resolution: "@graphql-tools/executor-http@npm:0.1.9" - dependencies: - "@graphql-tools/utils": ^9.2.1 - "@repeaterjs/repeater": ^3.0.4 - "@whatwg-node/fetch": ^0.8.1 - dset: ^3.1.2 - extract-files: ^11.0.0 - meros: ^1.2.1 - tslib: ^2.4.0 - value-or-promise: ^1.0.12 - peerDependencies: - graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - checksum: de62f839c3775141f444a6a453bf8cd01e42257a915845180b7f840b59bb781c21eeb59f68b609dcbab5bae73bc9fa40f3d16449f23410bc616b1f347dedf1d1 - languageName: node - linkType: hard - -"@graphql-tools/executor-legacy-ws@npm:^0.0.11": - version: 0.0.11 - resolution: "@graphql-tools/executor-legacy-ws@npm:0.0.11" - dependencies: - "@graphql-tools/utils": ^9.2.1 - "@types/ws": ^8.0.0 - isomorphic-ws: 5.0.0 - tslib: ^2.4.0 - ws: 8.13.0 - peerDependencies: - graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - checksum: f9dd5dc87537c6adb3e1fb8e083944cfd9b2a9b34016f705b7b99105e744f11290f23aee726bb05ae32411c7d07a1ebc7b5bd35445053fc44877979f0ce4cd2e - languageName: node - linkType: hard - -"@graphql-tools/executor@npm:^0.0.20": - version: 0.0.20 - resolution: "@graphql-tools/executor@npm:0.0.20" - dependencies: - "@graphql-tools/utils": ^9.2.1 - "@graphql-typed-document-node/core": 3.2.0 - "@repeaterjs/repeater": ^3.0.4 - tslib: ^2.4.0 - value-or-promise: ^1.0.12 - peerDependencies: - graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - checksum: 5390800be4a346eb7d37d51458cd9cf4a24e01014fe1b392682ea4bce2b27fc1d5c7aebcb3dafaeefcb0a89e5b307fc2060816533b61d6796e0fa0e5e1f10959 - languageName: node - linkType: hard - -"@graphql-tools/git-loader@npm:^7.2.13": - version: 7.2.22 - resolution: "@graphql-tools/git-loader@npm:7.2.22" - dependencies: - "@graphql-tools/graphql-tag-pluck": 7.5.2 - "@graphql-tools/utils": ^9.2.1 - is-glob: 4.0.3 - micromatch: ^4.0.4 - tslib: ^2.4.0 - unixify: ^1.0.0 - peerDependencies: - graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - checksum: b0e0d3f9fc782c4fbcb95ec8b0da084fddbb8985f2b403b7f35f83652fb7834f02113ae8fa19a5109dcf856d8dcc225acc50e9b83af8d4db3621885d8cb64b5b - languageName: node - linkType: hard - -"@graphql-tools/github-loader@npm:^7.3.20": - version: 7.3.28 - resolution: "@graphql-tools/github-loader@npm:7.3.28" - dependencies: - "@ardatan/sync-fetch": ^0.0.1 - "@graphql-tools/executor-http": ^0.1.9 - "@graphql-tools/graphql-tag-pluck": ^7.4.6 - "@graphql-tools/utils": ^9.2.1 - "@whatwg-node/fetch": ^0.8.0 - tslib: ^2.4.0 - value-or-promise: ^1.0.12 - peerDependencies: - graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - checksum: 1ef168d72b0615e5e05408794fef549e841c399a12b7074ae4764fee28d145aebdf50ba573f0695159edced626f5757b7825be2b246c437bbdf5457aeff13e5b - languageName: node - linkType: hard - -"@graphql-tools/graphql-file-loader@npm:8.0.0": - version: 8.0.0 - resolution: "@graphql-tools/graphql-file-loader@npm:8.0.0" - dependencies: - "@graphql-tools/import": 7.0.0 - "@graphql-tools/utils": ^10.0.0 - globby: ^11.0.3 - tslib: ^2.4.0 - unixify: ^1.0.0 - peerDependencies: - graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - checksum: 62c5150132a044c396dddd55b6acfe88e1bee21911bbe7905eb35516e0dd969e18ca558a77bb62c5b243bf877fee0a66a5ef2e7dce611d44ef1d5ad8edda151b - languageName: node - linkType: hard - -"@graphql-tools/graphql-file-loader@npm:^7.3.7, @graphql-tools/graphql-file-loader@npm:^7.5.0": - version: 7.5.9 - resolution: "@graphql-tools/graphql-file-loader@npm:7.5.9" - dependencies: - "@graphql-tools/import": 6.7.10 - "@graphql-tools/utils": 9.0.1 - globby: ^11.0.3 - tslib: ^2.4.0 - unixify: ^1.0.0 - peerDependencies: - graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - checksum: 64620f4736e556b55cc04d2b9be85854ae16d976a1c2f560c7f9da0e3bde21107625217ef87ee2b84eab461a1af5c321afd0aea928af21fa612dd28c801441ae - languageName: node - linkType: hard - -"@graphql-tools/graphql-tag-pluck@npm:7.5.2, @graphql-tools/graphql-tag-pluck@npm:^7.4.6": - version: 7.5.2 - resolution: "@graphql-tools/graphql-tag-pluck@npm:7.5.2" - dependencies: - "@babel/parser": ^7.16.8 - "@babel/plugin-syntax-import-assertions": ^7.20.0 - "@babel/traverse": ^7.16.8 - "@babel/types": ^7.16.8 - "@graphql-tools/utils": ^9.2.1 - tslib: ^2.4.0 - peerDependencies: - graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - checksum: fbe2419f97ca700bb5f3fa7ff7a4ecab2519732339c2f5807ff0fc33dcb50e3b6e921b6c0b285992b34e95cb812d514f0d62d82f9275a8c074bcaff64cbff7bb - languageName: node - linkType: hard - -"@graphql-tools/import@npm:6.7.10": - version: 6.7.10 - resolution: "@graphql-tools/import@npm:6.7.10" - dependencies: - "@graphql-tools/utils": 9.0.1 - resolve-from: 5.0.0 - tslib: ^2.4.0 - peerDependencies: - graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - checksum: 5f11470b3f73f61979559e655a94e86007484a7cee2fa93cd14b328a36e9a4f52f2786071f88d782e5a274c8b608ceb62ed8ea2bf37566a692b59b1938d5fb8c - languageName: node - linkType: hard - -"@graphql-tools/import@npm:7.0.0": - version: 7.0.0 - resolution: "@graphql-tools/import@npm:7.0.0" - dependencies: - "@graphql-tools/utils": ^10.0.0 - resolve-from: 5.0.0 - tslib: ^2.4.0 - peerDependencies: - graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - checksum: 24f7f2096b635b84983932b53d2953edf77f2d35f22d892569aa0c8303a5eb1dd5cff5922dc0264cfe22891730a17cf69392a9fd4b1b682a89553d8e16247498 - languageName: node - linkType: hard - -"@graphql-tools/json-file-loader@npm:^7.3.7, @graphql-tools/json-file-loader@npm:^7.4.1": - version: 7.4.10 - resolution: "@graphql-tools/json-file-loader@npm:7.4.10" - dependencies: - "@graphql-tools/utils": 9.0.1 - globby: ^11.0.3 - tslib: ^2.4.0 - unixify: ^1.0.0 - peerDependencies: - graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - checksum: ed61382304a4611e37bc681248ca475168f7f4fc2a4dfb4f79382e1df14a1176a9e2d5d8739f1d045a72d669bf686d19deb0d24ff36249ae586620eebf9d3fea - languageName: node - linkType: hard - -"@graphql-tools/load@npm:8.0.1": - version: 8.0.1 - resolution: "@graphql-tools/load@npm:8.0.1" - dependencies: - "@graphql-tools/schema": ^10.0.0 - "@graphql-tools/utils": ^10.0.11 - p-limit: 3.1.0 - tslib: ^2.4.0 - peerDependencies: - graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - checksum: 007ff2a9ddc6eb4567b7ac55c29b2d1891f98a0c8084def67a9e76b4d611757fa56c5ca9e5d22fa409c7b0c3ba8ce8c8a46b65ba9cd50d41255b079125ca0273 - languageName: node - linkType: hard - -"@graphql-tools/load@npm:^7.5.5, @graphql-tools/load@npm:^7.8.0": - version: 7.8.14 - resolution: "@graphql-tools/load@npm:7.8.14" - dependencies: - "@graphql-tools/schema": ^9.0.18 - "@graphql-tools/utils": ^9.2.1 - p-limit: 3.1.0 - tslib: ^2.4.0 - peerDependencies: - graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - checksum: 12ffd6460da3d996d614faa3ced99f526247334bb671301b15ed1d2153314a8813f734d863086d154891ac4b35da090668f0ea7702508d19f8dd0f72413b585c - languageName: node - linkType: hard - -"@graphql-tools/merge@npm:9.0.1, @graphql-tools/merge@npm:^9.0.1": - version: 9.0.1 - resolution: "@graphql-tools/merge@npm:9.0.1" - dependencies: - "@graphql-tools/utils": ^10.0.10 - tslib: ^2.4.0 - peerDependencies: - graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - checksum: f078628838f57dcd2988b46ec27ce4786daef6e7fdd07c012acec2fe52139f4a905a101883eb0fa7094d1ace6d1b10e6a8d40c03778496b50e85093b36316e4e - languageName: node - linkType: hard - -"@graphql-tools/merge@npm:^8.2.6, @graphql-tools/merge@npm:^8.4.1": - version: 8.4.1 - resolution: "@graphql-tools/merge@npm:8.4.1" - dependencies: - "@graphql-tools/utils": ^9.2.1 - tslib: ^2.4.0 - peerDependencies: - graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - checksum: badb094e2eb29688d39d451a83909dc6f92a28c98dbb485a2f745a963813ad1310b1624c7618e97477c90f7935c99b06792bf63c4957a58c642af1609bcec143 - languageName: node - linkType: hard - -"@graphql-tools/mock@npm:9.0.0": - version: 9.0.0 - resolution: "@graphql-tools/mock@npm:9.0.0" - dependencies: - "@graphql-tools/schema": ^10.0.0 - "@graphql-tools/utils": ^10.0.0 - fast-json-stable-stringify: ^2.1.0 - tslib: ^2.4.0 - peerDependencies: - graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - checksum: 60099d8869a56284167bd440c6b451a1fa6947ed7c63edb0e60e83112bbb6e16499fedbe679c6e9a4764268c9d60dd1485f0526d21ee9bf240e1642eebe468e0 - languageName: node - linkType: hard - -"@graphql-tools/optimize@npm:^1.3.0": - version: 1.3.1 - resolution: "@graphql-tools/optimize@npm:1.3.1" - dependencies: - tslib: ^2.4.0 - peerDependencies: - graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - checksum: 4eed041bc3199a70ab426eeb10bc4af65f18fa0c5907613aec236fd7e14918d0f895e12489df6ff501562415eef64c99777a3ca6f6a4ee3c796b68e7cb778342 - languageName: node - linkType: hard - -"@graphql-tools/prisma-loader@npm:^7.2.49": - version: 7.2.71 - resolution: "@graphql-tools/prisma-loader@npm:7.2.71" - dependencies: - "@graphql-tools/url-loader": ^7.17.18 - "@graphql-tools/utils": ^9.2.1 - "@types/js-yaml": ^4.0.0 - "@types/json-stable-stringify": ^1.0.32 - "@whatwg-node/fetch": ^0.8.2 - chalk: ^4.1.0 - debug: ^4.3.1 - dotenv: ^16.0.0 - graphql-request: ^6.0.0 - http-proxy-agent: ^5.0.0 - https-proxy-agent: ^5.0.0 - jose: ^4.11.4 - js-yaml: ^4.0.0 - json-stable-stringify: ^1.0.1 - lodash: ^4.17.20 - scuid: ^1.1.0 - tslib: ^2.4.0 - yaml-ast-parser: ^0.0.43 - peerDependencies: - graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - checksum: f76a35d2d0bda15c6baeee58e2b3abcb38681bd6f7d0fbd720fdc372f9a314e22ab72363bfd92b9fa137f1987e3c863ce826fdb3f75ca4b66ec15c0a60b3945d - languageName: node - linkType: hard - -"@graphql-tools/relay-operation-optimizer@npm:^6.5.0": - version: 6.5.10 - resolution: "@graphql-tools/relay-operation-optimizer@npm:6.5.10" - dependencies: - "@ardatan/relay-compiler": 12.0.0 - "@graphql-tools/utils": 9.0.1 - tslib: ^2.4.0 - peerDependencies: - graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - checksum: e5373b41f85c7c8ffaa4fae4410765426e20746d1694b42d454ba8ce95ae6d6d2486ff6683c53fd7be55852efe1c02be2af83576f7469bc1476a2b25dc7c44bc - languageName: node - linkType: hard - -"@graphql-tools/schema@npm:^10.0.0": - version: 10.0.2 - resolution: "@graphql-tools/schema@npm:10.0.2" - dependencies: - "@graphql-tools/merge": ^9.0.1 - "@graphql-tools/utils": ^10.0.10 - tslib: ^2.4.0 - value-or-promise: ^1.0.12 - peerDependencies: - graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - checksum: fe977b1aee05b0a88cf6bb029f17d828d8707f784e1d42d446984b6ba649d78e16e3295c549ee352c09bbe88ad87c23bbe04b946c096b6815156c5be80d79a3f - languageName: node - linkType: hard - -"@graphql-tools/schema@npm:^9.0.0, @graphql-tools/schema@npm:^9.0.18, @graphql-tools/schema@npm:^9.0.19": - version: 9.0.19 - resolution: "@graphql-tools/schema@npm:9.0.19" - dependencies: - "@graphql-tools/merge": ^8.4.1 - "@graphql-tools/utils": ^9.2.1 - tslib: ^2.4.0 - value-or-promise: ^1.0.12 - peerDependencies: - graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - checksum: 1be91f61bf4be0c1c9aa640a6ad5b58328d5434d15e78ba73a47263420939db6741ad6723dece4611257e7e1e56518e116b76513a3014305d3f52d67aafb62fb - languageName: node - linkType: hard - -"@graphql-tools/url-loader@npm:^7.13.2, @graphql-tools/url-loader@npm:^7.17.18, @graphql-tools/url-loader@npm:^7.9.7": - version: 7.17.18 - resolution: "@graphql-tools/url-loader@npm:7.17.18" - dependencies: - "@ardatan/sync-fetch": ^0.0.1 - "@graphql-tools/delegate": ^9.0.31 - "@graphql-tools/executor-graphql-ws": ^0.0.14 - "@graphql-tools/executor-http": ^0.1.7 - "@graphql-tools/executor-legacy-ws": ^0.0.11 - "@graphql-tools/utils": ^9.2.1 - "@graphql-tools/wrap": ^9.4.2 - "@types/ws": ^8.0.0 - "@whatwg-node/fetch": ^0.8.0 - isomorphic-ws: ^5.0.0 - tslib: ^2.4.0 - value-or-promise: ^1.0.11 - ws: ^8.12.0 - peerDependencies: - graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - checksum: e4deccaa4b333a91022e9a19594e6c696c4463c94f091893c8d056e4090b2c8c5e5036b0e7bcce79f0c4c0ad2f0e6f3c8d170a765f0d5a2ba29965bee096f355 - languageName: node - linkType: hard - -"@graphql-tools/utils@npm:9.0.1": - version: 9.0.1 - resolution: "@graphql-tools/utils@npm:9.0.1" - dependencies: - tslib: ^2.4.0 - peerDependencies: - graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - checksum: a41221d8568bfaafa76526eaa89550d67965c43e0cd1ff94979f61c117d0caf880938799b351c4b637ce26309ba5d2ef8c4a657298f5d46702f43759b89bfa05 - languageName: node - linkType: hard - -"@graphql-tools/utils@npm:^10.0.0, @graphql-tools/utils@npm:^10.0.10, @graphql-tools/utils@npm:^10.0.11": - version: 10.0.11 - resolution: "@graphql-tools/utils@npm:10.0.11" - dependencies: - "@graphql-typed-document-node/core": ^3.1.1 - cross-inspect: 1.0.0 - dset: ^3.1.2 - tslib: ^2.4.0 - peerDependencies: - graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - checksum: cb480d0b3f253f85b84415f5b9e2893013a8e8b72501ec04e338c54a26ac234c9723c6c2d697f1316e89589425e5b133fd45eab2504a52b84d1d75dc6a495863 - languageName: node - linkType: hard - -"@graphql-tools/utils@npm:^8.8.0": - version: 8.12.0 - resolution: "@graphql-tools/utils@npm:8.12.0" - dependencies: - tslib: ^2.4.0 - peerDependencies: - graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - checksum: 24edc6ba3bcfa9a4c1d1d37117c3f96d847beed9638325083c32c6ec9674729dc89fc8cc389d317ae5d9dba22e91443bd9788f1dc8de91a1b6f1e592112bd48f - languageName: node - linkType: hard - -"@graphql-tools/utils@npm:^9.0.0, @graphql-tools/utils@npm:^9.1.1, @graphql-tools/utils@npm:^9.2.1": - version: 9.2.1 - resolution: "@graphql-tools/utils@npm:9.2.1" - dependencies: - "@graphql-typed-document-node/core": ^3.1.1 - tslib: ^2.4.0 - peerDependencies: - graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - checksum: 94ed12df5f49e5c338322ffd931236a687a3d5c443bf499f9baab5d4fcd9792234111142be8aa506a01ca2e82732996c4e1d8f6159ff9cc7fdc5c97f63e55226 - languageName: node - linkType: hard - -"@graphql-tools/wrap@npm:^9.4.2": - version: 9.4.2 - resolution: "@graphql-tools/wrap@npm:9.4.2" - dependencies: - "@graphql-tools/delegate": ^9.0.31 - "@graphql-tools/schema": ^9.0.18 - "@graphql-tools/utils": ^9.2.1 - tslib: ^2.4.0 - value-or-promise: ^1.0.12 - peerDependencies: - graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - checksum: 294d529a4b8e90cceaaa691e3b67d932626ad59a53260166e0281506a4e1a2b9d1c018984dffd0edcf518555baee23beaa8665167226da014d4d0b58c37cd744 - languageName: node - linkType: hard - -"@graphql-typed-document-node/core@npm:3.2.0, @graphql-typed-document-node/core@npm:^3.1.1, @graphql-typed-document-node/core@npm:^3.2.0": - version: 3.2.0 - resolution: "@graphql-typed-document-node/core@npm:3.2.0" - peerDependencies: - graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - checksum: fa44443accd28c8cf4cb96aaaf39d144a22e8b091b13366843f4e97d19c7bfeaf609ce3c7603a4aeffe385081eaf8ea245d078633a7324c11c5ec4b2011bb76d - languageName: node - linkType: hard - -"@grpc/grpc-js@npm:^1.10.9": - version: 1.11.1 - resolution: "@grpc/grpc-js@npm:1.11.1" - dependencies: - "@grpc/proto-loader": ^0.7.13 - "@js-sdsl/ordered-map": ^4.4.2 - checksum: 906894851a13b09f5a95052e1bec572b1b5760cc53635e80b50155c7546591cc8b8768d2723e2ec2ff5d7b086f65a27809db345fd3038fd50e3fc5e827ee88c6 - languageName: node - linkType: hard - -"@grpc/grpc-js@npm:~1.9.0": - version: 1.9.15 - resolution: "@grpc/grpc-js@npm:1.9.15" - dependencies: - "@grpc/proto-loader": ^0.7.8 - "@types/node": ">=12.12.47" - checksum: 5b0f84052ad6610fff7919cae99c79c1182b01d2f529f6e64e1189e902a90abcb6f828a119df8e4abcdab8fa1ac5d5975fe200220293a1ced126c536f3bc1374 - languageName: node - linkType: hard - -"@grpc/proto-loader@npm:^0.7.13, @grpc/proto-loader@npm:^0.7.8": - version: 0.7.13 - resolution: "@grpc/proto-loader@npm:0.7.13" - dependencies: - lodash.camelcase: ^4.3.0 - long: ^5.0.0 - protobufjs: ^7.2.5 - yargs: ^17.7.2 - bin: - proto-loader-gen-types: build/bin/proto-loader-gen-types.js - checksum: 399c1b8a4627f93dc31660d9636ea6bf58be5675cc7581e3df56a249369e5be02c6cd0d642c5332b0d5673bc8621619bc06fb045aa3e8f57383737b5d35930dc - languageName: node - linkType: hard - -"@hapi/hoek@npm:^9.0.0": - version: 9.3.0 - resolution: "@hapi/hoek@npm:9.3.0" - checksum: 4771c7a776242c3c022b168046af4e324d116a9d2e1d60631ee64f474c6e38d1bb07092d898bf95c7bc5d334c5582798a1456321b2e53ca817d4e7c88bc25b43 - languageName: node - linkType: hard - -"@hapi/topo@npm:^5.0.0": - version: 5.1.0 - resolution: "@hapi/topo@npm:5.1.0" - dependencies: - "@hapi/hoek": ^9.0.0 - checksum: 604dfd5dde76d5c334bd03f9001fce69c7ce529883acf92da96f4fe7e51221bf5e5110e964caca287a6a616ba027c071748ab636ff178ad750547fba611d6014 - languageName: node - linkType: hard - -"@humanwhocodes/config-array@npm:^0.11.10": - version: 0.11.13 - resolution: "@humanwhocodes/config-array@npm:0.11.13" - dependencies: - "@humanwhocodes/object-schema": ^2.0.1 - debug: ^4.1.1 - minimatch: ^3.0.5 - checksum: f8ea57b0d7ed7f2d64cd3944654976829d9da91c04d9c860e18804729a33f7681f78166ef4c761850b8c324d362f7d53f14c5c44907a6b38b32c703ff85e4805 - languageName: node - linkType: hard - -"@humanwhocodes/config-array@npm:^0.13.0": - version: 0.13.0 - resolution: "@humanwhocodes/config-array@npm:0.13.0" - dependencies: - "@humanwhocodes/object-schema": ^2.0.3 - debug: ^4.3.1 - minimatch: ^3.0.5 - checksum: eae69ff9134025dd2924f0b430eb324981494be26f0fddd267a33c28711c4db643242cf9fddf7dadb9d16c96b54b2d2c073e60a56477df86e0173149313bd5d6 - languageName: node - linkType: hard - -"@humanwhocodes/module-importer@npm:^1.0.1": - version: 1.0.1 - resolution: "@humanwhocodes/module-importer@npm:1.0.1" - checksum: 0fd22007db8034a2cdf2c764b140d37d9020bbfce8a49d3ec5c05290e77d4b0263b1b972b752df8c89e5eaa94073408f2b7d977aed131faf6cf396ebb5d7fb61 - languageName: node - linkType: hard - -"@humanwhocodes/object-schema@npm:^2.0.1, @humanwhocodes/object-schema@npm:^2.0.3": - version: 2.0.3 - resolution: "@humanwhocodes/object-schema@npm:2.0.3" - checksum: d3b78f6c5831888c6ecc899df0d03bcc25d46f3ad26a11d7ea52944dc36a35ef543fad965322174238d677a43d5c694434f6607532cff7077062513ad7022631 - languageName: node - linkType: hard - -"@ioredis/commands@npm:^1.1.1": - version: 1.2.0 - resolution: "@ioredis/commands@npm:1.2.0" - checksum: 9b20225ba36ef3e5caf69b3c0720597c3016cc9b1e157f519ea388f621dd9037177f84cfe7e25c4c32dad7dd90c70ff9123cd411f747e053cf292193c9c461e2 - languageName: node - linkType: hard - -"@isaacs/cliui@npm:^8.0.2": - version: 8.0.2 - resolution: "@isaacs/cliui@npm:8.0.2" - dependencies: - string-width: ^5.1.2 - string-width-cjs: "npm:string-width@^4.2.0" - strip-ansi: ^7.0.1 - strip-ansi-cjs: "npm:strip-ansi@^6.0.1" - wrap-ansi: ^8.1.0 - wrap-ansi-cjs: "npm:wrap-ansi@^7.0.0" - checksum: 4a473b9b32a7d4d3cfb7a614226e555091ff0c5a29a1734c28c72a182c2f6699b26fc6b5c2131dfd841e86b185aea714c72201d7c98c2fba5f17709333a67aeb - languageName: node - linkType: hard - -"@isaacs/ttlcache@npm:^1.4.1": - version: 1.4.1 - resolution: "@isaacs/ttlcache@npm:1.4.1" - checksum: b99f0918faf1eba405b6bc3421584282b2edc46cca23f8d8e112a643bf6e4506c6c53a4525901118e229d19c5719bbec3028ec438d758fd71081f6c32af871ec - languageName: node - linkType: hard - -"@istanbuljs/load-nyc-config@npm:^1.0.0": - version: 1.1.0 - resolution: "@istanbuljs/load-nyc-config@npm:1.1.0" - dependencies: - camelcase: ^5.3.1 - find-up: ^4.1.0 - get-package-type: ^0.1.0 - js-yaml: ^3.13.1 - resolve-from: ^5.0.0 - checksum: d578da5e2e804d5c93228450a1380e1a3c691de4953acc162f387b717258512a3e07b83510a936d9fab03eac90817473917e24f5d16297af3867f59328d58568 - languageName: node - linkType: hard - -"@istanbuljs/schema@npm:^0.1.2": - version: 0.1.3 - resolution: "@istanbuljs/schema@npm:0.1.3" - checksum: 5282759d961d61350f33d9118d16bcaed914ebf8061a52f4fa474b2cb08720c9c81d165e13b82f2e5a8a212cc5af482f0c6fc1ac27b9e067e5394c9a6ed186c9 - languageName: node - linkType: hard - -"@jambit/eslint-plugin-typed-redux-saga@npm:0.4.0": - version: 0.4.0 - resolution: "@jambit/eslint-plugin-typed-redux-saga@npm:0.4.0" - checksum: 4d4bd498b13a17d6afaae7790872fccdc02ef7142a43f18f3cd38a71bb1edc880d8f1923097388e16c6cc6642cd77366e4cf34f30ad41cb3444dfd4420490c32 - languageName: node - linkType: hard - -"@jest/console@npm:^28.1.3": - version: 28.1.3 - resolution: "@jest/console@npm:28.1.3" - dependencies: - "@jest/types": ^28.1.3 - "@types/node": "*" - chalk: ^4.0.0 - jest-message-util: ^28.1.3 - jest-util: ^28.1.3 - slash: ^3.0.0 - checksum: fe50d98d26d02ce2901c76dff4bd5429a33c13affb692c9ebf8a578ca2f38a5dd854363d40d6c394f215150791fd1f692afd8e730a4178dda24107c8dfd9750a - languageName: node - linkType: hard - -"@jest/console@npm:^29.7.0": - version: 29.7.0 - resolution: "@jest/console@npm:29.7.0" - dependencies: - "@jest/types": ^29.6.3 - "@types/node": "*" - chalk: ^4.0.0 - jest-message-util: ^29.7.0 - jest-util: ^29.7.0 - slash: ^3.0.0 - checksum: 0e3624e32c5a8e7361e889db70b170876401b7d70f509a2538c31d5cd50deb0c1ae4b92dc63fe18a0902e0a48c590c21d53787a0df41a52b34fa7cab96c384d6 - languageName: node - linkType: hard - -"@jest/core@npm:^29.7.0": - version: 29.7.0 - resolution: "@jest/core@npm:29.7.0" - dependencies: - "@jest/console": ^29.7.0 - "@jest/reporters": ^29.7.0 - "@jest/test-result": ^29.7.0 - "@jest/transform": ^29.7.0 - "@jest/types": ^29.6.3 - "@types/node": "*" - ansi-escapes: ^4.2.1 - chalk: ^4.0.0 - ci-info: ^3.2.0 - exit: ^0.1.2 - graceful-fs: ^4.2.9 - jest-changed-files: ^29.7.0 - jest-config: ^29.7.0 - jest-haste-map: ^29.7.0 - jest-message-util: ^29.7.0 - jest-regex-util: ^29.6.3 - jest-resolve: ^29.7.0 - jest-resolve-dependencies: ^29.7.0 - jest-runner: ^29.7.0 - jest-runtime: ^29.7.0 - jest-snapshot: ^29.7.0 - jest-util: ^29.7.0 - jest-validate: ^29.7.0 - jest-watcher: ^29.7.0 - micromatch: ^4.0.4 - pretty-format: ^29.7.0 - slash: ^3.0.0 - strip-ansi: ^6.0.0 - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - checksum: af759c9781cfc914553320446ce4e47775ae42779e73621c438feb1e4231a5d4862f84b1d8565926f2d1aab29b3ec3dcfdc84db28608bdf5f29867124ebcfc0d - languageName: node - linkType: hard - -"@jest/create-cache-key-function@npm:^27.4.2": - version: 27.5.1 - resolution: "@jest/create-cache-key-function@npm:27.5.1" - dependencies: - "@jest/types": ^27.5.1 - checksum: a6c3a8c769aca6f66f5dc80f1c77e66980b4f213a6b2a15a92ba3595f032848a1261c06c9c798dcf2b672b1ffbefad5085af89d130548741c85ddbe0cf4284e7 - languageName: node - linkType: hard - -"@jest/create-cache-key-function@npm:^29.2.1, @jest/create-cache-key-function@npm:^29.6.3": - version: 29.7.0 - resolution: "@jest/create-cache-key-function@npm:29.7.0" - dependencies: - "@jest/types": ^29.6.3 - checksum: 681bc761fa1d6fa3dd77578d444f97f28296ea80755e90e46d1c8fa68661b9e67f54dd38b988742db636d26cf160450dc6011892cec98b3a7ceb58cad8ff3aae - languageName: node - linkType: hard - -"@jest/environment@npm:^29.5.0, @jest/environment@npm:^29.6.4, @jest/environment@npm:^29.7.0": - version: 29.7.0 - resolution: "@jest/environment@npm:29.7.0" - dependencies: - "@jest/fake-timers": ^29.7.0 - "@jest/types": ^29.6.3 - "@types/node": "*" - jest-mock: ^29.7.0 - checksum: 6fb398143b2543d4b9b8d1c6dbce83fa5247f84f550330604be744e24c2bd2178bb893657d62d1b97cf2f24baf85c450223f8237cccb71192c36a38ea2272934 - languageName: node - linkType: hard - -"@jest/expect-utils@npm:^29.7.0": - version: 29.7.0 - resolution: "@jest/expect-utils@npm:29.7.0" - dependencies: - jest-get-type: ^29.6.3 - checksum: 75eb177f3d00b6331bcaa057e07c0ccb0733a1d0a1943e1d8db346779039cb7f103789f16e502f888a3096fb58c2300c38d1f3748b36a7fa762eb6f6d1b160ed - languageName: node - linkType: hard - -"@jest/expect@npm:^29.7.0": - version: 29.7.0 - resolution: "@jest/expect@npm:29.7.0" - dependencies: - expect: ^29.7.0 - jest-snapshot: ^29.7.0 - checksum: a01cb85fd9401bab3370618f4b9013b90c93536562222d920e702a0b575d239d74cecfe98010aaec7ad464f67cf534a353d92d181646a4b792acaa7e912ae55e - languageName: node - linkType: hard - -"@jest/fake-timers@npm:^29.5.0, @jest/fake-timers@npm:^29.6.4, @jest/fake-timers@npm:^29.7.0": - version: 29.7.0 - resolution: "@jest/fake-timers@npm:29.7.0" - dependencies: - "@jest/types": ^29.6.3 - "@sinonjs/fake-timers": ^10.0.2 - "@types/node": "*" - jest-message-util: ^29.7.0 - jest-mock: ^29.7.0 - jest-util: ^29.7.0 - checksum: caf2bbd11f71c9241b458d1b5a66cbe95debc5a15d96442444b5d5c7ba774f523c76627c6931cca5e10e76f0d08761f6f1f01a608898f4751a0eee54fc3d8d00 - languageName: node - linkType: hard - -"@jest/globals@npm:^29.2.1, @jest/globals@npm:^29.7.0": - version: 29.7.0 - resolution: "@jest/globals@npm:29.7.0" - dependencies: - "@jest/environment": ^29.7.0 - "@jest/expect": ^29.7.0 - "@jest/types": ^29.6.3 - jest-mock: ^29.7.0 - checksum: 97dbb9459135693ad3a422e65ca1c250f03d82b2a77f6207e7fa0edd2c9d2015fbe4346f3dc9ebff1678b9d8da74754d4d440b7837497f8927059c0642a22123 - languageName: node - linkType: hard - -"@jest/reporters@npm:^29.7.0": - version: 29.7.0 - resolution: "@jest/reporters@npm:29.7.0" - dependencies: - "@bcoe/v8-coverage": ^0.2.3 - "@jest/console": ^29.7.0 - "@jest/test-result": ^29.7.0 - "@jest/transform": ^29.7.0 - "@jest/types": ^29.6.3 - "@jridgewell/trace-mapping": ^0.3.18 - "@types/node": "*" - chalk: ^4.0.0 - collect-v8-coverage: ^1.0.0 - exit: ^0.1.2 - glob: ^7.1.3 - graceful-fs: ^4.2.9 - istanbul-lib-coverage: ^3.0.0 - istanbul-lib-instrument: ^6.0.0 - istanbul-lib-report: ^3.0.0 - istanbul-lib-source-maps: ^4.0.0 - istanbul-reports: ^3.1.3 - jest-message-util: ^29.7.0 - jest-util: ^29.7.0 - jest-worker: ^29.7.0 - slash: ^3.0.0 - string-length: ^4.0.1 - strip-ansi: ^6.0.0 - v8-to-istanbul: ^9.0.1 - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - checksum: 7eadabd62cc344f629024b8a268ecc8367dba756152b761bdcb7b7e570a3864fc51b2a9810cd310d85e0a0173ef002ba4528d5ea0329fbf66ee2a3ada9c40455 - languageName: node - linkType: hard - -"@jest/schemas@npm:^28.1.3": - version: 28.1.3 - resolution: "@jest/schemas@npm:28.1.3" - dependencies: - "@sinclair/typebox": ^0.24.1 - checksum: 3cf1d4b66c9c4ffda58b246de1ddcba8e6ad085af63dccdf07922511f13b68c0cc480a7bc620cb4f3099a6f134801c747e1df7bfc7a4ef4dceefbdea3e31e1de - languageName: node - linkType: hard - -"@jest/schemas@npm:^29.6.3": - version: 29.6.3 - resolution: "@jest/schemas@npm:29.6.3" - dependencies: - "@sinclair/typebox": ^0.27.8 - checksum: 910040425f0fc93cd13e68c750b7885590b8839066dfa0cd78e7def07bbb708ad869381f725945d66f2284de5663bbecf63e8fdd856e2ae6e261ba30b1687e93 - languageName: node - linkType: hard - -"@jest/source-map@npm:^29.6.3": - version: 29.6.3 - resolution: "@jest/source-map@npm:29.6.3" - dependencies: - "@jridgewell/trace-mapping": ^0.3.18 - callsites: ^3.0.0 - graceful-fs: ^4.2.9 - checksum: bcc5a8697d471396c0003b0bfa09722c3cd879ad697eb9c431e6164e2ea7008238a01a07193dfe3cbb48b1d258eb7251f6efcea36f64e1ebc464ea3c03ae2deb - languageName: node - linkType: hard - -"@jest/test-result@npm:^28.1.3": - version: 28.1.3 - resolution: "@jest/test-result@npm:28.1.3" - dependencies: - "@jest/console": ^28.1.3 - "@jest/types": ^28.1.3 - "@types/istanbul-lib-coverage": ^2.0.0 - collect-v8-coverage: ^1.0.0 - checksum: 957a5dd2fd2e84aabe86698f93c0825e96128ccaa23abf548b159a9b08ac74e4bde7acf4bec48479243dbdb27e4ea1b68c171846d21fb64855c6b55cead9ef27 - languageName: node - linkType: hard - -"@jest/test-result@npm:^29.7.0": - version: 29.7.0 - resolution: "@jest/test-result@npm:29.7.0" - dependencies: - "@jest/console": ^29.7.0 - "@jest/types": ^29.6.3 - "@types/istanbul-lib-coverage": ^2.0.0 - collect-v8-coverage: ^1.0.0 - checksum: 67b6317d526e335212e5da0e768e3b8ab8a53df110361b80761353ad23b6aea4432b7c5665bdeb87658ea373b90fb1afe02ed3611ef6c858c7fba377505057fa - languageName: node - linkType: hard - -"@jest/test-sequencer@npm:^29.7.0": - version: 29.7.0 - resolution: "@jest/test-sequencer@npm:29.7.0" - dependencies: - "@jest/test-result": ^29.7.0 - graceful-fs: ^4.2.9 - jest-haste-map: ^29.7.0 - slash: ^3.0.0 - checksum: 73f43599017946be85c0b6357993b038f875b796e2f0950487a82f4ebcb115fa12131932dd9904026b4ad8be131fe6e28bd8d0aa93b1563705185f9804bff8bd - languageName: node - linkType: hard - -"@jest/transform@npm:^27.5.1": - version: 27.5.1 - resolution: "@jest/transform@npm:27.5.1" - dependencies: - "@babel/core": ^7.1.0 - "@jest/types": ^27.5.1 - babel-plugin-istanbul: ^6.1.1 - chalk: ^4.0.0 - convert-source-map: ^1.4.0 - fast-json-stable-stringify: ^2.0.0 - graceful-fs: ^4.2.9 - jest-haste-map: ^27.5.1 - jest-regex-util: ^27.5.1 - jest-util: ^27.5.1 - micromatch: ^4.0.4 - pirates: ^4.0.4 - slash: ^3.0.0 - source-map: ^0.6.1 - write-file-atomic: ^3.0.0 - checksum: a22079121aedea0f20a03a9c026be971f7b92adbfb4d5fd1fb67be315741deac4f056936d7c72a53b24aa5a1071bc942c003925fd453bf3f6a0ae5da6384e137 - languageName: node - linkType: hard - -"@jest/transform@npm:^29.7.0": - version: 29.7.0 - resolution: "@jest/transform@npm:29.7.0" - dependencies: - "@babel/core": ^7.11.6 - "@jest/types": ^29.6.3 - "@jridgewell/trace-mapping": ^0.3.18 - babel-plugin-istanbul: ^6.1.1 - chalk: ^4.0.0 - convert-source-map: ^2.0.0 - fast-json-stable-stringify: ^2.1.0 - graceful-fs: ^4.2.9 - jest-haste-map: ^29.7.0 - jest-regex-util: ^29.6.3 - jest-util: ^29.7.0 - micromatch: ^4.0.4 - pirates: ^4.0.4 - slash: ^3.0.0 - write-file-atomic: ^4.0.2 - checksum: 0f8ac9f413903b3cb6d240102db848f2a354f63971ab885833799a9964999dd51c388162106a807f810071f864302cdd8e3f0c241c29ce02d85a36f18f3f40ab - languageName: node - linkType: hard - -"@jest/types@npm:^26.6.2": - version: 26.6.2 - resolution: "@jest/types@npm:26.6.2" - dependencies: - "@types/istanbul-lib-coverage": ^2.0.0 - "@types/istanbul-reports": ^3.0.0 - "@types/node": "*" - "@types/yargs": ^15.0.0 - chalk: ^4.0.0 - checksum: a0bd3d2f22f26ddb23f41fddf6e6a30bf4fab2ce79ec1cb6ce6fdfaf90a72e00f4c71da91ec61e13db3b10c41de22cf49d07c57ff2b59171d64b29f909c1d8d6 - languageName: node - linkType: hard - -"@jest/types@npm:^27.5.1": - version: 27.5.1 - resolution: "@jest/types@npm:27.5.1" - dependencies: - "@types/istanbul-lib-coverage": ^2.0.0 - "@types/istanbul-reports": ^3.0.0 - "@types/node": "*" - "@types/yargs": ^16.0.0 - chalk: ^4.0.0 - checksum: d1f43cc946d87543ddd79d49547aab2399481d34025d5c5f2025d3d99c573e1d9832fa83cef25e9d9b07a8583500229d15bbb07b8e233d127d911d133e2f14b1 - languageName: node - linkType: hard - -"@jest/types@npm:^28.1.3": - version: 28.1.3 - resolution: "@jest/types@npm:28.1.3" - dependencies: - "@jest/schemas": ^28.1.3 - "@types/istanbul-lib-coverage": ^2.0.0 - "@types/istanbul-reports": ^3.0.0 - "@types/node": "*" - "@types/yargs": ^17.0.8 - chalk: ^4.0.0 - checksum: 1e258d9c063fcf59ebc91e46d5ea5984674ac7ae6cae3e50aa780d22b4405bf2c925f40350bf30013839eb5d4b5e521d956ddf8f3b7c78debef0e75a07f57350 - languageName: node - linkType: hard - -"@jest/types@npm:^29.5.0, @jest/types@npm:^29.6.3": - version: 29.6.3 - resolution: "@jest/types@npm:29.6.3" - dependencies: - "@jest/schemas": ^29.6.3 - "@types/istanbul-lib-coverage": ^2.0.0 - "@types/istanbul-reports": ^3.0.0 - "@types/node": "*" - "@types/yargs": ^17.0.8 - chalk: ^4.0.0 - checksum: a0bcf15dbb0eca6bdd8ce61a3fb055349d40268622a7670a3b2eb3c3dbafe9eb26af59938366d520b86907b9505b0f9b29b85cec11579a9e580694b87cd90fcc - languageName: node - linkType: hard - -"@jimp/bmp@npm:^0.16.1": - version: 0.16.1 - resolution: "@jimp/bmp@npm:0.16.1" - dependencies: - "@babel/runtime": ^7.7.2 - "@jimp/utils": ^0.16.1 - bmp-js: ^0.1.0 - peerDependencies: - "@jimp/custom": ">=0.3.5" - checksum: fa656b93c3fd2a009381d26174c5b421813a085d8b8ce600b0cd4f989e594671bcc32d0fb72c573d6d7ee4dc4283e1929cef066beb7967368f3a6e30a26c2992 - languageName: node - linkType: hard - -"@jimp/core@npm:^0.16.1": - version: 0.16.1 - resolution: "@jimp/core@npm:0.16.1" - dependencies: - "@babel/runtime": ^7.7.2 - "@jimp/utils": ^0.16.1 - any-base: ^1.1.0 - buffer: ^5.2.0 - exif-parser: ^0.1.12 - file-type: ^9.0.0 - load-bmfont: ^1.3.1 - mkdirp: ^0.5.1 - phin: ^2.9.1 - pixelmatch: ^4.0.2 - tinycolor2: ^1.4.1 - checksum: 81821b53787eaf866cd3ee54412eca3e3dd10f70a7c2bd48360b8a0538ed50537124d92fa3933d01382b9183d8f26884a029d7566db2447f195316807ec39ebe - languageName: node - linkType: hard - -"@jimp/custom@npm:^0.16.1": - version: 0.16.1 - resolution: "@jimp/custom@npm:0.16.1" - dependencies: - "@babel/runtime": ^7.7.2 - "@jimp/core": ^0.16.1 - checksum: 7f65ba4f62ff5495a0c679d9acf052500a672a44b9626732ba1481e8710b3ff822468c4df94a06ad27dac8b3237886aa689278ce122314a7ed3a272f43956389 - languageName: node - linkType: hard - -"@jimp/gif@npm:^0.16.1": - version: 0.16.1 - resolution: "@jimp/gif@npm:0.16.1" - dependencies: - "@babel/runtime": ^7.7.2 - "@jimp/utils": ^0.16.1 - gifwrap: ^0.9.2 - omggif: ^1.0.9 - peerDependencies: - "@jimp/custom": ">=0.3.5" - checksum: 30f5d3540285b5829152515b3cb37a63b8c3794dbbb04b521208cc79351f9305ea041550cf669b5b28f5b07786a59b12a6aaf1b289a2b4820dce11d5b077e532 - languageName: node - linkType: hard - -"@jimp/jpeg@npm:^0.16.1": - version: 0.16.1 - resolution: "@jimp/jpeg@npm:0.16.1" - dependencies: - "@babel/runtime": ^7.7.2 - "@jimp/utils": ^0.16.1 - jpeg-js: 0.4.2 - peerDependencies: - "@jimp/custom": ">=0.3.5" - checksum: a080d3c5f510cb6b24a052e44a42d6edde9f93fa32e4eaaf4bbdae03e0063cc85ee6db3949ca1faa4eb27bf65825571db6016d80368f96d5ec469adc69897813 - languageName: node - linkType: hard - -"@jimp/plugin-resize@npm:^0.16.1": - version: 0.16.1 - resolution: "@jimp/plugin-resize@npm:0.16.1" - dependencies: - "@babel/runtime": ^7.7.2 - "@jimp/utils": ^0.16.1 - peerDependencies: - "@jimp/custom": ">=0.3.5" - checksum: 52d0a919277af0545de8dbb7789acb73c1d8cf69b0a960716a41fef6555618d8dcf54bb4268a5c4bf07bf3a07d53e1cfd1a19620033f00c8cdc513dfb2c0ae6b - languageName: node - linkType: hard - -"@jimp/png@npm:^0.16.1": - version: 0.16.1 - resolution: "@jimp/png@npm:0.16.1" - dependencies: - "@babel/runtime": ^7.7.2 - "@jimp/utils": ^0.16.1 - pngjs: ^3.3.3 - peerDependencies: - "@jimp/custom": ">=0.3.5" - checksum: 8cfa563cbbd9d5ec08ab0f0513a93eab814ce5aaec69fc1f0e2d18db13aa7bb26bd46c7a4b4be1cfe5151b83711e5796668d54fd69d325877d528ab3163af919 - languageName: node - linkType: hard - -"@jimp/tiff@npm:^0.16.1": - version: 0.16.1 - resolution: "@jimp/tiff@npm:0.16.1" - dependencies: - "@babel/runtime": ^7.7.2 - utif: ^2.0.1 - peerDependencies: - "@jimp/custom": ">=0.3.5" - checksum: b118db6b977bdc87bf23b16cccfd0f58224c18348327354306b9f738f0086166ae3f60f7e526abf1b5e0dbd33dddc9d75bfefa5c40801d8f85093277e9570e35 - languageName: node - linkType: hard - -"@jimp/types@npm:^0.16.1": - version: 0.16.1 - resolution: "@jimp/types@npm:0.16.1" - dependencies: - "@babel/runtime": ^7.7.2 - "@jimp/bmp": ^0.16.1 - "@jimp/gif": ^0.16.1 - "@jimp/jpeg": ^0.16.1 - "@jimp/png": ^0.16.1 - "@jimp/tiff": ^0.16.1 - timm: ^1.6.1 - peerDependencies: - "@jimp/custom": ">=0.3.5" - checksum: 62c569a21924d76ccdc4d460f40d1a7fef590a552e4fc2bf4d727ccc9003961c964c7172d5f09ef0fc6d768a31e4c4fa735dd0bbc1aa9245eebdd01d4659fdf3 - languageName: node - linkType: hard - -"@jimp/utils@npm:^0.16.1": - version: 0.16.1 - resolution: "@jimp/utils@npm:0.16.1" - dependencies: - "@babel/runtime": ^7.7.2 - regenerator-runtime: ^0.13.3 - checksum: e79cdbef3e4c8c57426230e223c26be99e6b1adccb439b99a0945248df6209afbadce1c54e7361d472e3e8115f01272e84a1b1c355977c8d0cc32c9d0faea2c5 - languageName: node - linkType: hard - -"@jridgewell/gen-mapping@npm:^0.3.0, @jridgewell/gen-mapping@npm:^0.3.2, @jridgewell/gen-mapping@npm:^0.3.5": - version: 0.3.5 - resolution: "@jridgewell/gen-mapping@npm:0.3.5" - dependencies: - "@jridgewell/set-array": ^1.2.1 - "@jridgewell/sourcemap-codec": ^1.4.10 - "@jridgewell/trace-mapping": ^0.3.24 - checksum: ff7a1764ebd76a5e129c8890aa3e2f46045109dabde62b0b6c6a250152227647178ff2069ea234753a690d8f3c4ac8b5e7b267bbee272bffb7f3b0a370ab6e52 - languageName: node - linkType: hard - -"@jridgewell/resolve-uri@npm:^3.0.3, @jridgewell/resolve-uri@npm:^3.1.0": - version: 3.1.1 - resolution: "@jridgewell/resolve-uri@npm:3.1.1" - checksum: f5b441fe7900eab4f9155b3b93f9800a916257f4e8563afbcd3b5a5337b55e52bd8ae6735453b1b745457d9f6cdb16d74cd6220bbdd98cf153239e13f6cbb653 - languageName: node - linkType: hard - -"@jridgewell/set-array@npm:^1.2.1": - version: 1.2.1 - resolution: "@jridgewell/set-array@npm:1.2.1" - checksum: 832e513a85a588f8ed4f27d1279420d8547743cc37fcad5a5a76fc74bb895b013dfe614d0eed9cb860048e6546b798f8f2652020b4b2ba0561b05caa8c654b10 - languageName: node - linkType: hard - -"@jridgewell/source-map@npm:^0.3.3": - version: 0.3.5 - resolution: "@jridgewell/source-map@npm:0.3.5" - dependencies: - "@jridgewell/gen-mapping": ^0.3.0 - "@jridgewell/trace-mapping": ^0.3.9 - checksum: 1ad4dec0bdafbade57920a50acec6634f88a0eb735851e0dda906fa9894e7f0549c492678aad1a10f8e144bfe87f238307bf2a914a1bc85b7781d345417e9f6f - languageName: node - linkType: hard - -"@jridgewell/sourcemap-codec@npm:^1.4.10, @jridgewell/sourcemap-codec@npm:^1.4.14, @jridgewell/sourcemap-codec@npm:^1.4.15": - version: 1.4.15 - resolution: "@jridgewell/sourcemap-codec@npm:1.4.15" - checksum: b881c7e503db3fc7f3c1f35a1dd2655a188cc51a3612d76efc8a6eb74728bef5606e6758ee77423e564092b4a518aba569bbb21c9bac5ab7a35b0c6ae7e344c8 - languageName: node - linkType: hard - -"@jridgewell/trace-mapping@npm:0.3.9": - version: 0.3.9 - resolution: "@jridgewell/trace-mapping@npm:0.3.9" - dependencies: - "@jridgewell/resolve-uri": ^3.0.3 - "@jridgewell/sourcemap-codec": ^1.4.10 - checksum: d89597752fd88d3f3480845691a05a44bd21faac18e2185b6f436c3b0fd0c5a859fbbd9aaa92050c4052caf325ad3e10e2e1d1b64327517471b7d51babc0ddef - languageName: node - linkType: hard - -"@jridgewell/trace-mapping@npm:^0.3.12, @jridgewell/trace-mapping@npm:^0.3.17, @jridgewell/trace-mapping@npm:^0.3.18, @jridgewell/trace-mapping@npm:^0.3.20, @jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.25, @jridgewell/trace-mapping@npm:^0.3.9": - version: 0.3.25 - resolution: "@jridgewell/trace-mapping@npm:0.3.25" - dependencies: - "@jridgewell/resolve-uri": ^3.1.0 - "@jridgewell/sourcemap-codec": ^1.4.14 - checksum: 9d3c40d225e139987b50c48988f8717a54a8c994d8a948ee42e1412e08988761d0754d7d10b803061cc3aebf35f92a5dbbab493bd0e1a9ef9e89a2130e83ba34 - languageName: node - linkType: hard - -"@js-sdsl/ordered-map@npm:^4.4.2": - version: 4.4.2 - resolution: "@js-sdsl/ordered-map@npm:4.4.2" - checksum: a927ae4ff8565ecb75355cc6886a4f8fadbf2af1268143c96c0cce3ba01261d241c3f4ba77f21f3f017a00f91dfe9e0673e95f830255945c80a0e96c6d30508a - languageName: node - linkType: hard - -"@jsdevtools/ono@npm:^7.1.3": - version: 7.1.3 - resolution: "@jsdevtools/ono@npm:7.1.3" - checksum: 2297fcd472ba810bffe8519d2249171132844c7174f3a16634f9260761c8c78bc0428a4190b5b6d72d45673c13918ab9844d706c3ed4ef8f62ab11a2627a08ad - languageName: node - linkType: hard - -"@juggle/resize-observer@npm:3.4.0, @juggle/resize-observer@npm:^3.3.1": - version: 3.4.0 - resolution: "@juggle/resize-observer@npm:3.4.0" - checksum: 2505028c05cc2e17639fcad06218b1c4b60f932a4ebb4b41ab546ef8c157031ae377e3f560903801f6d01706dbefd4943b6c4704bf19ed86dfa1c62f1473a570 - languageName: node - linkType: hard - -"@kwsites/file-exists@npm:^1.1.1": - version: 1.1.1 - resolution: "@kwsites/file-exists@npm:1.1.1" - dependencies: - debug: ^4.1.1 - checksum: 4ff945de7293285133aeae759caddc71e73c4a44a12fac710fdd4f574cce2671a3f89d8165fdb03d383cfc97f3f96f677d8de3c95133da3d0e12a123a23109fe - languageName: node - linkType: hard - -"@kwsites/promise-deferred@npm:^1.1.1": - version: 1.1.1 - resolution: "@kwsites/promise-deferred@npm:1.1.1" - checksum: 07455477a0123d9a38afb503739eeff2c5424afa8d3dbdcc7f9502f13604488a4b1d9742fc7288832a52a6422cf1e1c0a1d51f69a39052f14d27c9a0420b6629 - languageName: node - linkType: hard - -"@leichtgewicht/ip-codec@npm:^2.0.1": - version: 2.0.4 - resolution: "@leichtgewicht/ip-codec@npm:2.0.4" - checksum: 468de1f04d33de6d300892683d7c8aecbf96d1e2c5fe084f95f816e50a054d45b7c1ebfb141a1447d844b86a948733f6eebd92234da8581c84a1ad4de2946a2d - languageName: node - linkType: hard - -"@lit-labs/ssr-dom-shim@npm:^1.0.0, @lit-labs/ssr-dom-shim@npm:^1.1.0": - version: 1.1.2 - resolution: "@lit-labs/ssr-dom-shim@npm:1.1.2" - checksum: 73fd787893851d4ec4aaa5c775405ed2aae4ca0891b2dd3c973b32c2f4bf70ada5481dd0224e52b786d037aa8a00052186ad1623c44551affd66f6409cca8da6 - languageName: node - linkType: hard - -"@lit/reactive-element@npm:^1.3.0, @lit/reactive-element@npm:^1.6.0": - version: 1.6.3 - resolution: "@lit/reactive-element@npm:1.6.3" - dependencies: - "@lit-labs/ssr-dom-shim": ^1.0.0 - checksum: 79b58631c38effeabad090070324431da8a22cf0ff665f5e4de35e4d791f984742b3d340c9c7fce996d1124a8da95febc582471b4c237236c770b1300b56ef6e - languageName: node - linkType: hard - -"@looksrare/sdk@npm:0.10.4": - version: 0.10.4 - resolution: "@looksrare/sdk@npm:0.10.4" - peerDependencies: - ethers: ^5.5.4 - checksum: ba7949482e36c9d90222fddf77eb1b1d76cc8012906e9da9d053375a25dbd9d5acfd88ee83cd71dabbd8881620f142d00954901d3a970fd66b1b25d9c67ff412 - languageName: node - linkType: hard - -"@manypkg/cli@npm:0.19.2": - version: 0.19.2 - resolution: "@manypkg/cli@npm:0.19.2" - dependencies: - "@babel/runtime": ^7.5.5 - "@manypkg/get-packages": ^1.1.3 - chalk: ^2.4.2 - detect-indent: ^6.0.0 - find-up: ^4.1.0 - fs-extra: ^8.1.0 - normalize-path: ^3.0.0 - p-limit: ^2.2.1 - package-json: ^6.5.0 - parse-github-url: ^1.0.2 - sembear: ^0.5.0 - semver: ^6.3.0 - spawndamnit: ^2.0.0 - validate-npm-package-name: ^3.0.0 - bin: - manypkg: bin.js - checksum: b40e9bff3aaccdfe85b4bfc08aee3b50ccde6c62bbe81ccf9c11e159e7adf26a0ebb990efa68c8fbd05b03ac9da5d6301b362c40c319e6ff6be45489361bd5c9 - languageName: node - linkType: hard - -"@manypkg/find-root@npm:^1.1.0": - version: 1.1.0 - resolution: "@manypkg/find-root@npm:1.1.0" - dependencies: - "@babel/runtime": ^7.5.5 - "@types/node": ^12.7.1 - find-up: ^4.1.0 - fs-extra: ^8.1.0 - checksum: f0fd881a5a81a351cb6561cd24117e8ee9481bbf3b6d1c7d9d10bef1f4744ca2ba3d064713e83c0a0574416d1e5b4a4c6c414aad91913c4a1c6040d87283ac50 - languageName: node - linkType: hard - -"@manypkg/get-packages@npm:^1.1.3": - version: 1.1.3 - resolution: "@manypkg/get-packages@npm:1.1.3" - dependencies: - "@babel/runtime": ^7.5.5 - "@changesets/types": ^4.0.1 - "@manypkg/find-root": ^1.1.0 - fs-extra: ^8.1.0 - globby: ^11.0.0 - read-yaml-file: ^1.1.0 - checksum: f5a756e5a659e0e1c33f48852d56826d170d5b10a3cdea89ce4fcaa77678d8799aa4004b30e1985c87b73dbc390b95bb6411b78336dd1e0db87c08c74b5c0e74 - languageName: node - linkType: hard - -"@mdx-js/react@npm:^3.0.0": - version: 3.1.0 - resolution: "@mdx-js/react@npm:3.1.0" - dependencies: - "@types/mdx": ^2.0.0 - peerDependencies: - "@types/react": ">=16" - react: ">=16" - checksum: c5a9c495f43f498ece24a768762a1743abe2be33d050d7eab731beb754e631700547f039198c6262c998d9a443906bd78811c3fa38bc2fb37659848161dac331 - languageName: node - linkType: hard - -"@metamask/eth-json-rpc-provider@npm:^1.0.0": - version: 1.0.1 - resolution: "@metamask/eth-json-rpc-provider@npm:1.0.1" - dependencies: - "@metamask/json-rpc-engine": ^7.0.0 - "@metamask/safe-event-emitter": ^3.0.0 - "@metamask/utils": ^5.0.1 - checksum: ff97648b002d2889bd020c03abc26137cf068df3280e46144b5333c1b294f35f5099361343825f900ef20b9dcb6819495830b7a99eb1cbfbd671e5b11c0dfde1 - languageName: node - linkType: hard - -"@metamask/eth-sig-util@npm:^4.0.0": - version: 4.0.1 - resolution: "@metamask/eth-sig-util@npm:4.0.1" - dependencies: - ethereumjs-abi: ^0.6.8 - ethereumjs-util: ^6.2.1 - ethjs-util: ^0.1.6 - tweetnacl: ^1.0.3 - tweetnacl-util: ^0.15.1 - checksum: 740df4c92a1282e6be4c00c86c1a8ccfb93e767596e43f6da895aa5bab4a28fc3c2209f0327db34924a4a1e9db72bc4d3dddfcfc45cca0b218c9ccbf7d1b1445 - languageName: node - linkType: hard - -"@metamask/json-rpc-engine@npm:^7.0.0, @metamask/json-rpc-engine@npm:^7.3.2": - version: 7.3.3 - resolution: "@metamask/json-rpc-engine@npm:7.3.3" - dependencies: - "@metamask/rpc-errors": ^6.2.1 - "@metamask/safe-event-emitter": ^3.0.0 - "@metamask/utils": ^8.3.0 - checksum: 7bab8b4d2341a6243ba451bc58283f0a6905b09f7257857859848a51a795444ca6899b1a6908b15f8ed236fb574ab85a630c9cb28d127ab52c4630e496c16006 - languageName: node - linkType: hard - -"@metamask/json-rpc-middleware-stream@npm:^6.0.2": - version: 6.0.2 - resolution: "@metamask/json-rpc-middleware-stream@npm:6.0.2" - dependencies: - "@metamask/json-rpc-engine": ^7.3.2 - "@metamask/safe-event-emitter": ^3.0.0 - "@metamask/utils": ^8.3.0 - readable-stream: ^3.6.2 - checksum: e831041b03e9f48f584f4425188f72b58974f95b60429c9fe8b5561da69c6bbfad2f2b2199acdff06ee718967214b65c05604d4f85f3287186619683487f1060 - languageName: node - linkType: hard - -"@metamask/object-multiplex@npm:^2.0.0": - version: 2.0.0 - resolution: "@metamask/object-multiplex@npm:2.0.0" - dependencies: - once: ^1.4.0 - readable-stream: ^3.6.2 - checksum: 54baea752a3ac7c2742c376512e00d4902d383e9da8787574d3b21eb0081523309e24e3915a98f3ae0341d65712b6832d2eb7eeb862f4ef0da1ead52dcde5387 - languageName: node - linkType: hard - -"@metamask/onboarding@npm:^1.0.1": - version: 1.0.1 - resolution: "@metamask/onboarding@npm:1.0.1" - dependencies: - bowser: ^2.9.0 - checksum: c5a6b13760d8c761733fd5edcd3984b2951fb22b34ecebc27104224de7d2582065b8b7edc5b1dafafb76e73a55144d251bc08d540620dde7f1ebfb5f3520b050 - languageName: node - linkType: hard - -"@metamask/providers@npm:^15.0.0": - version: 15.0.0 - resolution: "@metamask/providers@npm:15.0.0" - dependencies: - "@metamask/json-rpc-engine": ^7.3.2 - "@metamask/json-rpc-middleware-stream": ^6.0.2 - "@metamask/object-multiplex": ^2.0.0 - "@metamask/rpc-errors": ^6.2.1 - "@metamask/safe-event-emitter": ^3.0.0 - "@metamask/utils": ^8.3.0 - detect-browser: ^5.2.0 - extension-port-stream: ^3.0.0 - fast-deep-equal: ^3.1.3 - is-stream: ^2.0.0 - readable-stream: ^3.6.2 - webextension-polyfill: ^0.10.0 - checksum: 42571450e79d69d943384f557f6a61e0f73101d49804fb6e8075d791959f76c42b8ff626f711d434674792d77aead6cb8a32b04a3dcd53598c8aff24cbb1ad25 - languageName: node - linkType: hard - -"@metamask/rpc-errors@npm:6.2.1, @metamask/rpc-errors@npm:^6.2.1": - version: 6.2.1 - resolution: "@metamask/rpc-errors@npm:6.2.1" - dependencies: - "@metamask/utils": ^8.3.0 - fast-safe-stringify: ^2.0.6 - checksum: a9223c3cb9ab05734ea0dda990597f90a7cdb143efa0c026b1a970f2094fe5fa3c341ed39b1e7623be13a96b98fb2c697ef51a2e2b87d8f048114841d35ee0a9 - languageName: node - linkType: hard - -"@metamask/safe-event-emitter@npm:^2.0.0": - version: 2.0.0 - resolution: "@metamask/safe-event-emitter@npm:2.0.0" - checksum: 8b717ac5d53df0027c05509f03d0534700b5898dd1c3a53fb2dc4c0499ca5971b14aae67f522d09eb9f509e77f50afa95fdb3eda1afbff8b071c18a3d2905e93 - languageName: node - linkType: hard - -"@metamask/safe-event-emitter@npm:^3.0.0": - version: 3.1.2 - resolution: "@metamask/safe-event-emitter@npm:3.1.2" - checksum: 8ef7579f9317eb5c94ecf3e6abb8d13b119af274b678805eac76abe4c0667bfdf539f385e552bb973e96333b71b77aa7c787cb3fce9cd5fb4b00f1dbbabf880d - languageName: node - linkType: hard - -"@metamask/sdk-communication-layer@npm:0.20.2": - version: 0.20.2 - resolution: "@metamask/sdk-communication-layer@npm:0.20.2" - dependencies: - bufferutil: ^4.0.8 - date-fns: ^2.29.3 - debug: ^4.3.4 - utf-8-validate: ^6.0.3 - uuid: ^8.3.2 - peerDependencies: - cross-fetch: ^3.1.5 - eciesjs: ^0.3.16 - eventemitter2: ^6.4.7 - readable-stream: ^3.6.2 - socket.io-client: ^4.5.1 - checksum: 4d8ef60fa459a164db4be5f2bed2a51895e106fa38ee6948b37ca54e4623b9fbe855d7830f7d2fc572fa0a72aac2c81e64a7828899f540fbc362f0ccd4ca1205 - languageName: node - linkType: hard - -"@metamask/sdk-install-modal-web@npm:0.20.2": - version: 0.20.2 - resolution: "@metamask/sdk-install-modal-web@npm:0.20.2" - dependencies: - qr-code-styling: ^1.6.0-rc.1 - peerDependencies: - i18next: 22.5.1 - react: ^18.2.0 - react-dom: ^18.2.0 - react-i18next: ^13.2.2 - react-native: "*" - peerDependenciesMeta: - react: - optional: true - react-dom: - optional: true - react-native: - optional: true - checksum: cba31f783ddb6351d5ef7e47d61a8eeee8ab3d95af345069ea0055ccc500da34c6f3c2e729db20664d4ff7f2c147d6e9f783131557cf28b1fb218737cdcc6d1c - languageName: node - linkType: hard - -"@metamask/sdk@npm:0.20.3": - version: 0.20.3 - resolution: "@metamask/sdk@npm:0.20.3" - dependencies: - "@metamask/onboarding": ^1.0.1 - "@metamask/providers": ^15.0.0 - "@metamask/sdk-communication-layer": 0.20.2 - "@metamask/sdk-install-modal-web": 0.20.2 - "@types/dom-screen-wake-lock": ^1.0.0 - bowser: ^2.9.0 - cross-fetch: ^4.0.0 - debug: ^4.3.4 - eciesjs: ^0.3.15 - eth-rpc-errors: ^4.0.3 - eventemitter2: ^6.4.7 - i18next: 22.5.1 - i18next-browser-languagedetector: 7.1.0 - obj-multiplex: ^1.0.0 - pump: ^3.0.0 - qrcode-terminal-nooctal: ^0.12.1 - react-native-webview: ^11.26.0 - readable-stream: ^3.6.2 - rollup-plugin-visualizer: ^5.9.2 - socket.io-client: ^4.5.1 - util: ^0.12.4 - uuid: ^8.3.2 - peerDependencies: - react: ^18.2.0 - react-dom: ^18.2.0 - peerDependenciesMeta: - react: - optional: true - react-dom: - optional: true - checksum: f3e0a99e744c12cec7e3c00aa9f4517b467d0b403379b70780303877bc84fedc9f068738ef6dfd04426aec4235729bde1e1667cf54f744506eaf6df5345498ac - languageName: node - linkType: hard - -"@metamask/utils@npm:^5.0.1": - version: 5.0.2 - resolution: "@metamask/utils@npm:5.0.2" - dependencies: - "@ethereumjs/tx": ^4.1.2 - "@types/debug": ^4.1.7 - debug: ^4.3.4 - semver: ^7.3.8 - superstruct: ^1.0.3 - checksum: eca82e42911b2840deb4f32f0f215c5ffd14d22d68afbbe92d3180e920e509e310777b15eab29def3448f3535b66596ceb4c23666ec846adacc8e1bb093ff882 - languageName: node - linkType: hard - -"@metamask/utils@npm:^8.3.0": - version: 8.4.0 - resolution: "@metamask/utils@npm:8.4.0" - dependencies: - "@ethereumjs/tx": ^4.2.0 - "@noble/hashes": ^1.3.1 - "@scure/base": ^1.1.3 - "@types/debug": ^4.1.7 - debug: ^4.3.4 - pony-cause: ^2.1.10 - semver: ^7.5.4 - superstruct: ^1.0.3 - uuid: ^9.0.1 - checksum: b0397e97bac7192f6189a8625a2dfcb56d3c2cf4dd2cb3d4e012a7e9786f04f59f6917805544bc131a6dacd2c8344e237ae43ad47429bb5eb35c6cf1248440b4 - languageName: node - linkType: hard - -"@motionone/animation@npm:^10.12.0, @motionone/animation@npm:^10.15.1, @motionone/animation@npm:^10.16.3": - version: 10.18.0 - resolution: "@motionone/animation@npm:10.18.0" - dependencies: - "@motionone/easing": ^10.18.0 - "@motionone/types": ^10.17.1 - "@motionone/utils": ^10.18.0 - tslib: ^2.3.1 - checksum: 841cb9f4843a89e5e4560b9f960f52cbe78afc86f87c769f71e9edb3aadd53fb87982b7e11914428f228b29fd580756be531369c2ffac06432550afa4e87d1c3 - languageName: node - linkType: hard - -"@motionone/dom@npm:10.12.0": - version: 10.12.0 - resolution: "@motionone/dom@npm:10.12.0" - dependencies: - "@motionone/animation": ^10.12.0 - "@motionone/generators": ^10.12.0 - "@motionone/types": ^10.12.0 - "@motionone/utils": ^10.12.0 - hey-listen: ^1.0.8 - tslib: ^2.3.1 - checksum: 123356f28e44362c4f081aae3df22e576f46bfcb07e01257b2ac64a115668448f29b8de67e4b6e692c5407cffb78ffe7cf9fa1bc064007482bab5dd23a69d380 - languageName: node - linkType: hard - -"@motionone/dom@npm:^10.16.2, @motionone/dom@npm:^10.16.4": - version: 10.16.4 - resolution: "@motionone/dom@npm:10.16.4" - dependencies: - "@motionone/animation": ^10.16.3 - "@motionone/generators": ^10.16.4 - "@motionone/types": ^10.16.3 - "@motionone/utils": ^10.16.3 - hey-listen: ^1.0.8 - tslib: ^2.3.1 - checksum: 8307864351d1c0108492c2f414ab564f59f4bb797180382948696df44e7389339560e642c7d0fbdbe63c1755515b2ace8264b5f8827ba2590636e11d474dd226 - languageName: node - linkType: hard - -"@motionone/easing@npm:^10.18.0": - version: 10.18.0 - resolution: "@motionone/easing@npm:10.18.0" - dependencies: - "@motionone/utils": ^10.18.0 - tslib: ^2.3.1 - checksum: 6bd37f7a9d5a88f868cc0ad6e47d2ba8d9fefd7da84fccfea7ed77ec08c2e6d1e42df88dda462665102a5cf03f748231a1a077de7054b5a8ccb0fbf36f61b1e7 - languageName: node - linkType: hard - -"@motionone/generators@npm:^10.12.0, @motionone/generators@npm:^10.16.4": - version: 10.18.0 - resolution: "@motionone/generators@npm:10.18.0" - dependencies: - "@motionone/types": ^10.17.1 - "@motionone/utils": ^10.18.0 - tslib: ^2.3.1 - checksum: 51a0e075681697b11d0771998cac8c76a745f00141502f81adb953896992b7f49478965e4afe696bc83361afaae8d2f1057d71c25b21035fe67258ff73764f1c - languageName: node - linkType: hard - -"@motionone/svelte@npm:^10.16.2": - version: 10.16.4 - resolution: "@motionone/svelte@npm:10.16.4" - dependencies: - "@motionone/dom": ^10.16.4 - tslib: ^2.3.1 - checksum: 699e20955ea832bcf32d410ae9f88edf61a5c2cf2b56527119ab1df6fecbf2632b62d541743d0f6d278fd700a15a20b9eb7c8aa5266e7aed5e113b8f8f75b863 - languageName: node - linkType: hard - -"@motionone/types@npm:^10.12.0, @motionone/types@npm:^10.15.1, @motionone/types@npm:^10.16.3, @motionone/types@npm:^10.17.1": - version: 10.17.1 - resolution: "@motionone/types@npm:10.17.1" - checksum: 3fa74db64e371e61a7f7669d7d541d11c9a8dd871032d59c69041e3b2e07a67ad2ed8767cb9273bac90eed4e1f76efc1f14c8673c2e9a288f6070ee0fef64a25 - languageName: node - linkType: hard - -"@motionone/utils@npm:^10.12.0, @motionone/utils@npm:^10.15.1, @motionone/utils@npm:^10.16.3, @motionone/utils@npm:^10.18.0": - version: 10.18.0 - resolution: "@motionone/utils@npm:10.18.0" - dependencies: - "@motionone/types": ^10.17.1 - hey-listen: ^1.0.8 - tslib: ^2.3.1 - checksum: a27f9afde693a0cbbbcb33962b12bbe40dd2cfa514b0732f3c7953c5ef4beed738e1e8172a2de89e3b9f74a253ef0a70d7f3efb730be97b77d7176a3ffacb67a - languageName: node - linkType: hard - -"@motionone/vue@npm:^10.16.2": - version: 10.16.4 - resolution: "@motionone/vue@npm:10.16.4" - dependencies: - "@motionone/dom": ^10.16.4 - tslib: ^2.3.1 - checksum: 746e38d0ee831829bfac2ce471f3d98a9e37bd8cbdf2706fa3becce69c17f51180a1ee47582d97758d68aafdfc9a187ab47ff216c77254ac994287dabcf266c1 - languageName: node - linkType: hard - -"@multiformats/base-x@npm:^4.0.1": - version: 4.0.1 - resolution: "@multiformats/base-x@npm:4.0.1" - checksum: ecbf84bdd7613fd795e4a41f20f3e8cc7df8bbee84690b7feed383d45a638ed228a80ff6f5c930373cbf24539f64857b66023ee3c1e914f6bac9995c76414a87 - languageName: node - linkType: hard - -"@nicolo-ribaudo/eslint-scope-5-internals@npm:5.1.1-v1": - version: 5.1.1-v1 - resolution: "@nicolo-ribaudo/eslint-scope-5-internals@npm:5.1.1-v1" - dependencies: - eslint-scope: 5.1.1 - checksum: f2e3b2d6a6e2d9f163ca22105910c9f850dc4897af0aea3ef0a5886b63d8e1ba6505b71c99cb78a3bba24a09557d601eb21c8dede3f3213753fcfef364eb0e57 - languageName: node - linkType: hard - -"@noble/curves@npm:1.1.0, @noble/curves@npm:~1.1.0": - version: 1.1.0 - resolution: "@noble/curves@npm:1.1.0" - dependencies: - "@noble/hashes": 1.3.1 - checksum: 2658cdd3f84f71079b4e3516c47559d22cf4b55c23ac8ee9d2b1f8e5b72916d9689e59820e0f9d9cb4a46a8423af5b56dc6bb7782405c88be06a015180508db5 - languageName: node - linkType: hard - -"@noble/curves@npm:1.6.0, @noble/curves@npm:~1.6.0": - version: 1.6.0 - resolution: "@noble/curves@npm:1.6.0" - dependencies: - "@noble/hashes": 1.5.0 - checksum: 258f3feb2a6098cf35521562ecb7d452fd728e8a008ff9f1ef435184f9d0c782ceb8f7b7fa8df3317c3be7a19f53995ee124cd05c8080b130bd42e3cb072f24d - languageName: node - linkType: hard - -"@noble/curves@npm:^1.4.0, @noble/curves@npm:^1.6.0, @noble/curves@npm:~1.8.0": - version: 1.8.0 - resolution: "@noble/curves@npm:1.8.0" - dependencies: - "@noble/hashes": 1.7.0 - checksum: 88198bc5b8049358dfcc6c5e121125744fb81c703299127800f38f868a41697bc26bef8f88dc38f1939f4e0133b8db5f24337164eca7421a6a9480ee711f5e1b - languageName: node - linkType: hard - -"@noble/curves@npm:~1.2.0": - version: 1.2.0 - resolution: "@noble/curves@npm:1.2.0" - dependencies: - "@noble/hashes": 1.3.2 - checksum: bb798d7a66d8e43789e93bc3c2ddff91a1e19fdb79a99b86cd98f1e5eff0ee2024a2672902c2576ef3577b6f282f3b5c778bebd55761ddbb30e36bf275e83dd0 - languageName: node - linkType: hard - -"@noble/hashes@npm:1.2.0, @noble/hashes@npm:~1.2.0": - version: 1.2.0 - resolution: "@noble/hashes@npm:1.2.0" - checksum: 8ca080ce557b8f40fb2f78d3aedffd95825a415ac8e13d7ffe3643f8626a8c2d99a3e5975b555027ac24316d8b3c02a35b8358567c0c23af681e6573602aa434 - languageName: node - linkType: hard - -"@noble/hashes@npm:1.3.1": - version: 1.3.1 - resolution: "@noble/hashes@npm:1.3.1" - checksum: 7fdefc0f7a0c1ec27acc6ff88841793e3f93ec4ce6b8a6a12bfc0dd70ae6b7c4c82fe305fdfeda1735d5ad4a9eebe761e6693b3d355689c559e91242f4bc95b1 - languageName: node - linkType: hard - -"@noble/hashes@npm:1.3.2, @noble/hashes@npm:~1.3.0, @noble/hashes@npm:~1.3.1, @noble/hashes@npm:~1.3.2": - version: 1.3.2 - resolution: "@noble/hashes@npm:1.3.2" - checksum: fe23536b436539d13f90e4b9be843cc63b1b17666a07634a2b1259dded6f490be3d050249e6af98076ea8f2ea0d56f578773c2197f2aa0eeaa5fba5bc18ba474 - languageName: node - linkType: hard - -"@noble/hashes@npm:1.5.0, @noble/hashes@npm:~1.5.0": - version: 1.5.0 - resolution: "@noble/hashes@npm:1.5.0" - checksum: 9cc031d5c888c455bfeef76af649b87f75380a4511405baea633c1e4912fd84aff7b61e99716f0231d244c9cfeda1fafd7d718963e6a0c674ed705e9b1b4f76b - languageName: node - linkType: hard - -"@noble/hashes@npm:1.7.0, @noble/hashes@npm:^1.3.1, @noble/hashes@npm:^1.4.0, @noble/hashes@npm:^1.5.0, @noble/hashes@npm:~1.7.0": - version: 1.7.0 - resolution: "@noble/hashes@npm:1.7.0" - checksum: c06949ead7f5771a74f6fc9a346c7519212b3484c5b7916c8cad6b1b0e5f5f6c997ac3a43c0884ef8b99cfc55fac89058eefb29b6aad1cb41f436c748b316a1c - languageName: node - linkType: hard - -"@noble/secp256k1@npm:1.7.1, @noble/secp256k1@npm:~1.7.0": - version: 1.7.1 - resolution: "@noble/secp256k1@npm:1.7.1" - checksum: d2301f1f7690368d8409a3152450458f27e54df47e3f917292de3de82c298770890c2de7c967d237eff9c95b70af485389a9695f73eb05a43e2bd562d18b18cb - languageName: node - linkType: hard - -"@nodelib/fs.scandir@npm:2.1.5": - version: 2.1.5 - resolution: "@nodelib/fs.scandir@npm:2.1.5" - dependencies: - "@nodelib/fs.stat": 2.0.5 - run-parallel: ^1.1.9 - checksum: a970d595bd23c66c880e0ef1817791432dbb7acbb8d44b7e7d0e7a22f4521260d4a83f7f9fd61d44fda4610105577f8f58a60718105fb38352baed612fd79e59 - languageName: node - linkType: hard - -"@nodelib/fs.stat@npm:2.0.5, @nodelib/fs.stat@npm:^2.0.2": - version: 2.0.5 - resolution: "@nodelib/fs.stat@npm:2.0.5" - checksum: 012480b5ca9d97bff9261571dbbec7bbc6033f69cc92908bc1ecfad0792361a5a1994bc48674b9ef76419d056a03efadfce5a6cf6dbc0a36559571a7a483f6f0 - languageName: node - linkType: hard - -"@nodelib/fs.walk@npm:^1.2.3, @nodelib/fs.walk@npm:^1.2.8": - version: 1.2.8 - resolution: "@nodelib/fs.walk@npm:1.2.8" - dependencies: - "@nodelib/fs.scandir": 2.1.5 - fastq: ^1.6.0 - checksum: 190c643f156d8f8f277bf2a6078af1ffde1fd43f498f187c2db24d35b4b4b5785c02c7dc52e356497b9a1b65b13edc996de08de0b961c32844364da02986dc53 - languageName: node - linkType: hard - -"@nolyfill/is-core-module@npm:1.0.39": - version: 1.0.39 - resolution: "@nolyfill/is-core-module@npm:1.0.39" - checksum: 0d6e098b871eca71d875651288e1f0fa770a63478b0b50479c99dc760c64175a56b5b04f58d5581bbcc6b552b8191ab415eada093d8df9597ab3423c8cac1815 - languageName: node - linkType: hard - -"@nomicfoundation/edr-darwin-arm64@npm:0.6.5": - version: 0.6.5 - resolution: "@nomicfoundation/edr-darwin-arm64@npm:0.6.5" - checksum: fb4ec67761fa044156fac5bcc0540312e93c6b1a8086d9871fb88cfc880fcc0f8db58a9ae8cab0fb9b74b3cb54571053f7016039c4730f5186c088102f5a43c6 - languageName: node - linkType: hard - -"@nomicfoundation/edr-darwin-x64@npm:0.6.5": - version: 0.6.5 - resolution: "@nomicfoundation/edr-darwin-x64@npm:0.6.5" - checksum: 31444f48aee4e9c522da4dc799665b2d11432ca9aa27510161f1833b6f566714cecf8e99649d4209556a8346ab2ae521060ebd47ce21dad31a3f2a5d053607f0 - languageName: node - linkType: hard - -"@nomicfoundation/edr-linux-arm64-gnu@npm:0.6.5": - version: 0.6.5 - resolution: "@nomicfoundation/edr-linux-arm64-gnu@npm:0.6.5" - checksum: c7059092122dd58ad38f0fa2d577b9c822424f335c217bf11c01b05257f6de7788f9db15546d2f3cbb6ba3cf0a6062d113d093f0000fd2e13fc1e2033b39c4ad - languageName: node - linkType: hard - -"@nomicfoundation/edr-linux-arm64-musl@npm:0.6.5": - version: 0.6.5 - resolution: "@nomicfoundation/edr-linux-arm64-musl@npm:0.6.5" - checksum: 4d011d07c2d63f36bea81d935eb29a41815ddc2570e60c6b62668a96442b00e03285ed7fea2afd40554ef3f4a2f45b8123d8623f05862ecc6d9a4c7c606cdff4 - languageName: node - linkType: hard - -"@nomicfoundation/edr-linux-x64-gnu@npm:0.6.5": - version: 0.6.5 - resolution: "@nomicfoundation/edr-linux-x64-gnu@npm:0.6.5" - checksum: d20616245f643cc930c9b10e2969a550f39a506c5e77d69dca2ecfd23b23bfbae4fe63a7d8add355e2c79b3624c130270cbd24cba0ae42583b087019e7d2e3fa - languageName: node - linkType: hard - -"@nomicfoundation/edr-linux-x64-musl@npm:0.6.5": - version: 0.6.5 - resolution: "@nomicfoundation/edr-linux-x64-musl@npm:0.6.5" - checksum: 4e47f0e5b5176cc500c4a5beff526688a26be69d9ac2d6176c432a7ca51da4270f3b3f6738771a13c68149c66c94dcf4b719c33cf97edf96a15ddabbbc22ba1c - languageName: node - linkType: hard - -"@nomicfoundation/edr-win32-x64-msvc@npm:0.6.5": - version: 0.6.5 - resolution: "@nomicfoundation/edr-win32-x64-msvc@npm:0.6.5" - checksum: ae953433f5e45e96f0448219716b7e204fc18e8b0b7f840e4158daf26e75163de528cb74940ded25b24a1f23af82993ff312ddcde120d94acecaaaf7e87f7eb7 - languageName: node - linkType: hard - -"@nomicfoundation/edr@npm:^0.6.4": - version: 0.6.5 - resolution: "@nomicfoundation/edr@npm:0.6.5" - dependencies: - "@nomicfoundation/edr-darwin-arm64": 0.6.5 - "@nomicfoundation/edr-darwin-x64": 0.6.5 - "@nomicfoundation/edr-linux-arm64-gnu": 0.6.5 - "@nomicfoundation/edr-linux-arm64-musl": 0.6.5 - "@nomicfoundation/edr-linux-x64-gnu": 0.6.5 - "@nomicfoundation/edr-linux-x64-musl": 0.6.5 - "@nomicfoundation/edr-win32-x64-msvc": 0.6.5 - checksum: 5390da27b59836b64a4f5975e02dc803a70c5ba82dd29795366a79b62b53927f69d43aaf533ec0e5f56a613c29c5edea4b188059d80caf51db9cd7bd9da9fb0a - languageName: node - linkType: hard - -"@nomicfoundation/ethereumjs-common@npm:4.0.4": - version: 4.0.4 - resolution: "@nomicfoundation/ethereumjs-common@npm:4.0.4" - dependencies: - "@nomicfoundation/ethereumjs-util": 9.0.4 - checksum: ce3f6e4ae15b976efdb7ccda27e19aadb62b5ffee209f9503e68b4fd8633715d4d697c0cc10ccd35f5e4e977edd05100d0f214e28880ec64fff77341dc34fcdf - languageName: node - linkType: hard - -"@nomicfoundation/ethereumjs-rlp@npm:5.0.4": - version: 5.0.4 - resolution: "@nomicfoundation/ethereumjs-rlp@npm:5.0.4" - bin: - rlp: bin/rlp.cjs - checksum: ee2c2e5776c73801dc5ed636f4988b599b4563c2d0037da542ea57eb237c69dd1ac555f6bcb5e06f70515b6459779ba0d68252a6e105132b4659ab4bf62919b0 - languageName: node - linkType: hard - -"@nomicfoundation/ethereumjs-tx@npm:5.0.4": - version: 5.0.4 - resolution: "@nomicfoundation/ethereumjs-tx@npm:5.0.4" - dependencies: - "@nomicfoundation/ethereumjs-common": 4.0.4 - "@nomicfoundation/ethereumjs-rlp": 5.0.4 - "@nomicfoundation/ethereumjs-util": 9.0.4 - ethereum-cryptography: 0.1.3 - peerDependencies: - c-kzg: ^2.1.2 - peerDependenciesMeta: - c-kzg: - optional: true - checksum: 0f1c87716682ccbcf4d92ffc6cf8ab557e658b90319d82be3219a091a736859f8803c73c98e4863682e3e86d264751c472d33ff6d3c3daf4e75b5f01d0af8fa3 - languageName: node - linkType: hard - -"@nomicfoundation/ethereumjs-util@npm:9.0.4": - version: 9.0.4 - resolution: "@nomicfoundation/ethereumjs-util@npm:9.0.4" - dependencies: - "@nomicfoundation/ethereumjs-rlp": 5.0.4 - ethereum-cryptography: 0.1.3 - peerDependencies: - c-kzg: ^2.1.2 - peerDependenciesMeta: - c-kzg: - optional: true - checksum: 754439f72b11cad2d8986707ad020077dcc763c4055f73e2668a0b4cadb22aa4407faa9b3c587d9eb5b97ac337afbe037eb642bc1d5a16197284f83db3462cbe - languageName: node - linkType: hard - -"@nomicfoundation/solidity-analyzer-darwin-arm64@npm:0.1.1": - version: 0.1.1 - resolution: "@nomicfoundation/solidity-analyzer-darwin-arm64@npm:0.1.1" - conditions: os=darwin & cpu=arm64 - languageName: node - linkType: hard - -"@nomicfoundation/solidity-analyzer-darwin-x64@npm:0.1.1": - version: 0.1.1 - resolution: "@nomicfoundation/solidity-analyzer-darwin-x64@npm:0.1.1" - conditions: os=darwin & cpu=x64 - languageName: node - linkType: hard - -"@nomicfoundation/solidity-analyzer-freebsd-x64@npm:0.1.1": - version: 0.1.1 - resolution: "@nomicfoundation/solidity-analyzer-freebsd-x64@npm:0.1.1" - conditions: os=freebsd & cpu=x64 - languageName: node - linkType: hard - -"@nomicfoundation/solidity-analyzer-linux-arm64-gnu@npm:0.1.1": - version: 0.1.1 - resolution: "@nomicfoundation/solidity-analyzer-linux-arm64-gnu@npm:0.1.1" - conditions: os=linux & cpu=arm64 & libc=glibc - languageName: node - linkType: hard - -"@nomicfoundation/solidity-analyzer-linux-arm64-musl@npm:0.1.1": - version: 0.1.1 - resolution: "@nomicfoundation/solidity-analyzer-linux-arm64-musl@npm:0.1.1" - conditions: os=linux & cpu=arm64 & libc=musl - languageName: node - linkType: hard - -"@nomicfoundation/solidity-analyzer-linux-x64-gnu@npm:0.1.1": - version: 0.1.1 - resolution: "@nomicfoundation/solidity-analyzer-linux-x64-gnu@npm:0.1.1" - conditions: os=linux & cpu=x64 & libc=glibc - languageName: node - linkType: hard - -"@nomicfoundation/solidity-analyzer-linux-x64-musl@npm:0.1.1": - version: 0.1.1 - resolution: "@nomicfoundation/solidity-analyzer-linux-x64-musl@npm:0.1.1" - conditions: os=linux & cpu=x64 & libc=musl - languageName: node - linkType: hard - -"@nomicfoundation/solidity-analyzer-win32-arm64-msvc@npm:0.1.1": - version: 0.1.1 - resolution: "@nomicfoundation/solidity-analyzer-win32-arm64-msvc@npm:0.1.1" - conditions: os=win32 & cpu=arm64 - languageName: node - linkType: hard - -"@nomicfoundation/solidity-analyzer-win32-ia32-msvc@npm:0.1.1": - version: 0.1.1 - resolution: "@nomicfoundation/solidity-analyzer-win32-ia32-msvc@npm:0.1.1" - conditions: os=win32 & cpu=ia32 - languageName: node - linkType: hard - -"@nomicfoundation/solidity-analyzer-win32-x64-msvc@npm:0.1.1": - version: 0.1.1 - resolution: "@nomicfoundation/solidity-analyzer-win32-x64-msvc@npm:0.1.1" - conditions: os=win32 & cpu=x64 - languageName: node - linkType: hard - -"@nomicfoundation/solidity-analyzer@npm:^0.1.0": - version: 0.1.1 - resolution: "@nomicfoundation/solidity-analyzer@npm:0.1.1" - dependencies: - "@nomicfoundation/solidity-analyzer-darwin-arm64": 0.1.1 - "@nomicfoundation/solidity-analyzer-darwin-x64": 0.1.1 - "@nomicfoundation/solidity-analyzer-freebsd-x64": 0.1.1 - "@nomicfoundation/solidity-analyzer-linux-arm64-gnu": 0.1.1 - "@nomicfoundation/solidity-analyzer-linux-arm64-musl": 0.1.1 - "@nomicfoundation/solidity-analyzer-linux-x64-gnu": 0.1.1 - "@nomicfoundation/solidity-analyzer-linux-x64-musl": 0.1.1 - "@nomicfoundation/solidity-analyzer-win32-arm64-msvc": 0.1.1 - "@nomicfoundation/solidity-analyzer-win32-ia32-msvc": 0.1.1 - "@nomicfoundation/solidity-analyzer-win32-x64-msvc": 0.1.1 - dependenciesMeta: - "@nomicfoundation/solidity-analyzer-darwin-arm64": - optional: true - "@nomicfoundation/solidity-analyzer-darwin-x64": - optional: true - "@nomicfoundation/solidity-analyzer-freebsd-x64": - optional: true - "@nomicfoundation/solidity-analyzer-linux-arm64-gnu": - optional: true - "@nomicfoundation/solidity-analyzer-linux-arm64-musl": - optional: true - "@nomicfoundation/solidity-analyzer-linux-x64-gnu": - optional: true - "@nomicfoundation/solidity-analyzer-linux-x64-musl": - optional: true - "@nomicfoundation/solidity-analyzer-win32-arm64-msvc": - optional: true - "@nomicfoundation/solidity-analyzer-win32-ia32-msvc": - optional: true - "@nomicfoundation/solidity-analyzer-win32-x64-msvc": - optional: true - checksum: 038cffafd5769e25256b5b8bef88d95cc1c021274a65c020cf84aceb3237752a3b51645fdb0687f5516a2bdfebf166fcf50b08ab64857925100213e0654b266b - languageName: node - linkType: hard - -"@npmcli/fs@npm:^2.1.0": - version: 2.1.2 - resolution: "@npmcli/fs@npm:2.1.2" - dependencies: - "@gar/promisify": ^1.1.3 - semver: ^7.3.5 - checksum: 405074965e72d4c9d728931b64d2d38e6ea12066d4fad651ac253d175e413c06fe4350970c783db0d749181da8fe49c42d3880bd1cbc12cd68e3a7964d820225 - languageName: node - linkType: hard - -"@npmcli/fs@npm:^3.1.0": - version: 3.1.1 - resolution: "@npmcli/fs@npm:3.1.1" - dependencies: - semver: ^7.3.5 - checksum: d960cab4b93adcb31ce223bfb75c5714edbd55747342efb67dcc2f25e023d930a7af6ece3e75f2f459b6f38fc14d031c766f116cd124fdc937fd33112579e820 - languageName: node - linkType: hard - -"@npmcli/move-file@npm:^2.0.0": - version: 2.0.1 - resolution: "@npmcli/move-file@npm:2.0.1" - dependencies: - mkdirp: ^1.0.4 - rimraf: ^3.0.2 - checksum: 52dc02259d98da517fae4cb3a0a3850227bdae4939dda1980b788a7670636ca2b4a01b58df03dd5f65c1e3cb70c50fa8ce5762b582b3f499ec30ee5ce1fd9380 - languageName: node - linkType: hard - -"@octokit/auth-token@npm:^2.4.4": - version: 2.5.0 - resolution: "@octokit/auth-token@npm:2.5.0" - dependencies: - "@octokit/types": ^6.0.3 - checksum: 45949296c09abcd6beb4c3f69d45b0c1f265f9581d2a9683cf4d1800c4cf8259c2f58d58e44c16c20bffb85a0282a176c0d51f4af300e428b863f27b910e6297 - languageName: node - linkType: hard - -"@octokit/core@npm:^3.5.1": - version: 3.6.0 - resolution: "@octokit/core@npm:3.6.0" - dependencies: - "@octokit/auth-token": ^2.4.4 - "@octokit/graphql": ^4.5.8 - "@octokit/request": ^5.6.3 - "@octokit/request-error": ^2.0.5 - "@octokit/types": ^6.0.3 - before-after-hook: ^2.2.0 - universal-user-agent: ^6.0.0 - checksum: f81160129037bd8555d47db60cd5381637b7e3602ad70735a7bdf8f3d250c7b7114a666bb12ef7a8746a326a5d72ed30a1b8f8a5a170007f7285c8e217bef1f0 - languageName: node - linkType: hard - -"@octokit/endpoint@npm:^6.0.1": - version: 6.0.12 - resolution: "@octokit/endpoint@npm:6.0.12" - dependencies: - "@octokit/types": ^6.0.3 - is-plain-object: ^5.0.0 - universal-user-agent: ^6.0.0 - checksum: b48b29940af11c4b9bca41cf56809754bb8385d4e3a6122671799d27f0238ba575b3fde86d2d30a84f4dbbc14430940de821e56ecc6a9a92d47fc2b29a31479d - languageName: node - linkType: hard - -"@octokit/graphql@npm:^4.5.8": - version: 4.8.0 - resolution: "@octokit/graphql@npm:4.8.0" - dependencies: - "@octokit/request": ^5.6.0 - "@octokit/types": ^6.0.3 - universal-user-agent: ^6.0.0 - checksum: f68afe53f63900d4a16a0a733f2f500df2695b731f8ed32edb728d50edead7f5011437f71d069c2d2f6d656227703d0c832a3c8af58ecf82bd5dcc051f2d2d74 - languageName: node - linkType: hard - -"@octokit/openapi-types@npm:^12.11.0": - version: 12.11.0 - resolution: "@octokit/openapi-types@npm:12.11.0" - checksum: 8a7d4bd6288cc4085cabe0ca9af2b87c875c303af932cb138aa1b2290eb69d32407759ac23707bb02776466e671244a902e9857896903443a69aff4b6b2b0e3b - languageName: node - linkType: hard - -"@octokit/plugin-paginate-rest@npm:^2.16.8": - version: 2.21.3 - resolution: "@octokit/plugin-paginate-rest@npm:2.21.3" - dependencies: - "@octokit/types": ^6.40.0 - peerDependencies: - "@octokit/core": ">=2" - checksum: acf31de2ba4021bceec7ff49c5b0e25309fc3c009d407f153f928ddf436ab66cd4217344138378d5523f5fb233896e1db58c9c7b3ffd9612a66d760bc5d319ed - languageName: node - linkType: hard - -"@octokit/plugin-request-log@npm:^1.0.4": - version: 1.0.4 - resolution: "@octokit/plugin-request-log@npm:1.0.4" - peerDependencies: - "@octokit/core": ">=3" - checksum: 2086db00056aee0f8ebd79797b5b57149ae1014e757ea08985b71eec8c3d85dbb54533f4fd34b6b9ecaa760904ae6a7536be27d71e50a3782ab47809094bfc0c - languageName: node - linkType: hard - -"@octokit/plugin-rest-endpoint-methods@npm:^5.12.0": - version: 5.16.2 - resolution: "@octokit/plugin-rest-endpoint-methods@npm:5.16.2" - dependencies: - "@octokit/types": ^6.39.0 - deprecation: ^2.3.1 - peerDependencies: - "@octokit/core": ">=3" - checksum: 30fcc50c335d1093f03573d9fa3a4b7d027fc98b215c43e07e82ee8dabfa0af0cf1b963feb542312ae32d897a2f68dc671577206f30850215517bebedc5a2c73 - languageName: node - linkType: hard - -"@octokit/request-error@npm:^2.0.5, @octokit/request-error@npm:^2.1.0": - version: 2.1.0 - resolution: "@octokit/request-error@npm:2.1.0" - dependencies: - "@octokit/types": ^6.0.3 - deprecation: ^2.0.0 - once: ^1.4.0 - checksum: baec2b5700498be01b4d958f9472cb776b3f3b0ea52924323a07e7a88572e24cac2cdf7eb04a0614031ba346043558b47bea2d346e98f0e8385b4261f138ef18 - languageName: node - linkType: hard - -"@octokit/request@npm:^5.6.0, @octokit/request@npm:^5.6.3": - version: 5.6.3 - resolution: "@octokit/request@npm:5.6.3" - dependencies: - "@octokit/endpoint": ^6.0.1 - "@octokit/request-error": ^2.1.0 - "@octokit/types": ^6.16.1 - is-plain-object: ^5.0.0 - node-fetch: ^2.6.7 - universal-user-agent: ^6.0.0 - checksum: c0b4542eb4baaf880d673c758d3e0b5c4a625a4ae30abf40df5548b35f1ff540edaac74625192b1aff42a79ac661e774da4ab7d5505f1cb4ef81239b1e8510c5 - languageName: node - linkType: hard - -"@octokit/rest@npm:^16.43.0 || ^17.11.0 || ^18.12.0, @octokit/rest@npm:^18.12.0": - version: 18.12.0 - resolution: "@octokit/rest@npm:18.12.0" - dependencies: - "@octokit/core": ^3.5.1 - "@octokit/plugin-paginate-rest": ^2.16.8 - "@octokit/plugin-request-log": ^1.0.4 - "@octokit/plugin-rest-endpoint-methods": ^5.12.0 - checksum: c18bd6676a60b66819b016b0f969fcd04d8dfa04d01b7af9af9a7410ff028c621c995185e29454c23c47906da506c1e01620711259989a964ebbfd9106f5b715 - languageName: node - linkType: hard - -"@octokit/types@npm:^6.0.3, @octokit/types@npm:^6.16.1, @octokit/types@npm:^6.39.0, @octokit/types@npm:^6.40.0": - version: 6.41.0 - resolution: "@octokit/types@npm:6.41.0" - dependencies: - "@octokit/openapi-types": ^12.11.0 - checksum: fd6f75e0b19b90d1a3d244d2b0c323ed8f2f05e474a281f60a321986683548ef2e0ec2b3a946aa9405d6092e055344455f69f58957c60f58368c8bdda5b7d2ab - languageName: node - linkType: hard - -"@opensea/seaport-js@npm:1.3.0": - version: 1.3.0 - resolution: "@opensea/seaport-js@npm:1.3.0" - dependencies: - "@0xsequence/multicall": ^0.39.0 - ethers: ^5.6.7 - merkletreejs: ^0.3.9 - checksum: 319980ed6cc4c0fc42a12bb375bbcffe27331078f1dd41e8c085db6f0240ca12d2c481a804966fb7032dbc5b97c13f75262f25533d92646eb48f437a56ce69d6 - languageName: node - linkType: hard - -"@openzeppelin/contracts@npm:3.4.1-solc-0.7-2": - version: 3.4.1-solc-0.7-2 - resolution: "@openzeppelin/contracts@npm:3.4.1-solc-0.7-2" - checksum: 3608a4065f65946117caa543ef72477ce637bd5cc4f4853303b5f5b6c26516f8b50898ea3a8486e2877689cae81453ce22c72c8624c77c363c63f019b4086ffa - languageName: node - linkType: hard - -"@openzeppelin/contracts@npm:3.4.2-solc-0.7": - version: 3.4.2-solc-0.7 - resolution: "@openzeppelin/contracts@npm:3.4.2-solc-0.7" - checksum: 1a6048f31ed560c34429a05e534102c51124ecaf113aca7ebeb7897cfaaf61007cdd7952374c282adaeb79b04ee86ee80b16eed28b62fc6d60e3ffcd7a696895 - languageName: node - linkType: hard - -"@openzeppelin/contracts@npm:4.7.0": - version: 4.7.0 - resolution: "@openzeppelin/contracts@npm:4.7.0" - checksum: ac917e668505ffbd300fcb00fd2f39b5f1153f77f82d482988336a881134b806b2d820f4293962691ef4d6f9f8ee5ecc71da82c6eb6ad2f02810511e90fa0d96 - languageName: node - linkType: hard - -"@openzeppelin/contracts@npm:5.0.2": - version: 5.0.2 - resolution: "@openzeppelin/contracts@npm:5.0.2" - checksum: 0cce6fc284bd1d89e2a447027832a62f1356b44ee31088899453e10349a63a62df2f07da63d76e4c41aad9c86b96b650b2b6fc85439ef276850dda1170a047fd - languageName: node - linkType: hard - -"@parcel/watcher-android-arm64@npm:2.4.0": - version: 2.4.0 - resolution: "@parcel/watcher-android-arm64@npm:2.4.0" - conditions: os=android & cpu=arm64 - languageName: node - linkType: hard - -"@parcel/watcher-darwin-arm64@npm:2.4.0": - version: 2.4.0 - resolution: "@parcel/watcher-darwin-arm64@npm:2.4.0" - conditions: os=darwin & cpu=arm64 - languageName: node - linkType: hard - -"@parcel/watcher-darwin-x64@npm:2.4.0": - version: 2.4.0 - resolution: "@parcel/watcher-darwin-x64@npm:2.4.0" - conditions: os=darwin & cpu=x64 - languageName: node - linkType: hard - -"@parcel/watcher-freebsd-x64@npm:2.4.0": - version: 2.4.0 - resolution: "@parcel/watcher-freebsd-x64@npm:2.4.0" - conditions: os=freebsd & cpu=x64 - languageName: node - linkType: hard - -"@parcel/watcher-linux-arm-glibc@npm:2.4.0": - version: 2.4.0 - resolution: "@parcel/watcher-linux-arm-glibc@npm:2.4.0" - conditions: os=linux & cpu=arm & libc=glibc - languageName: node - linkType: hard - -"@parcel/watcher-linux-arm64-glibc@npm:2.4.0": - version: 2.4.0 - resolution: "@parcel/watcher-linux-arm64-glibc@npm:2.4.0" - conditions: os=linux & cpu=arm64 & libc=glibc - languageName: node - linkType: hard - -"@parcel/watcher-linux-arm64-musl@npm:2.4.0": - version: 2.4.0 - resolution: "@parcel/watcher-linux-arm64-musl@npm:2.4.0" - conditions: os=linux & cpu=arm64 & libc=musl - languageName: node - linkType: hard - -"@parcel/watcher-linux-x64-glibc@npm:2.4.0": - version: 2.4.0 - resolution: "@parcel/watcher-linux-x64-glibc@npm:2.4.0" - conditions: os=linux & cpu=x64 & libc=glibc - languageName: node - linkType: hard - -"@parcel/watcher-linux-x64-musl@npm:2.4.0": - version: 2.4.0 - resolution: "@parcel/watcher-linux-x64-musl@npm:2.4.0" - conditions: os=linux & cpu=x64 & libc=musl - languageName: node - linkType: hard - -"@parcel/watcher-wasm@npm:2.3.0": - version: 2.3.0 - resolution: "@parcel/watcher-wasm@npm:2.3.0" - dependencies: - is-glob: ^4.0.3 - micromatch: ^4.0.5 - napi-wasm: ^1.1.0 - checksum: 61e3209e5253fc4eda2ddf903877475836cc3c65dca8b19c538de4b1fb598c17ca2797ab52cb45f61c01be963aed44059f2f9e536eb68539e31f27f1fcfb09ba - languageName: node - linkType: hard - -"@parcel/watcher-win32-arm64@npm:2.4.0": - version: 2.4.0 - resolution: "@parcel/watcher-win32-arm64@npm:2.4.0" - conditions: os=win32 & cpu=arm64 - languageName: node - linkType: hard - -"@parcel/watcher-win32-ia32@npm:2.4.0": - version: 2.4.0 - resolution: "@parcel/watcher-win32-ia32@npm:2.4.0" - conditions: os=win32 & cpu=ia32 - languageName: node - linkType: hard - -"@parcel/watcher-win32-x64@npm:2.4.0": - version: 2.4.0 - resolution: "@parcel/watcher-win32-x64@npm:2.4.0" - conditions: os=win32 & cpu=x64 - languageName: node - linkType: hard - -"@parcel/watcher@npm:^2.1.0, @parcel/watcher@npm:^2.3.0": - version: 2.4.0 - resolution: "@parcel/watcher@npm:2.4.0" - dependencies: - "@parcel/watcher-android-arm64": 2.4.0 - "@parcel/watcher-darwin-arm64": 2.4.0 - "@parcel/watcher-darwin-x64": 2.4.0 - "@parcel/watcher-freebsd-x64": 2.4.0 - "@parcel/watcher-linux-arm-glibc": 2.4.0 - "@parcel/watcher-linux-arm64-glibc": 2.4.0 - "@parcel/watcher-linux-arm64-musl": 2.4.0 - "@parcel/watcher-linux-x64-glibc": 2.4.0 - "@parcel/watcher-linux-x64-musl": 2.4.0 - "@parcel/watcher-win32-arm64": 2.4.0 - "@parcel/watcher-win32-ia32": 2.4.0 - "@parcel/watcher-win32-x64": 2.4.0 - detect-libc: ^1.0.3 - is-glob: ^4.0.3 - micromatch: ^4.0.5 - node-addon-api: ^7.0.0 - node-gyp: latest - dependenciesMeta: - "@parcel/watcher-android-arm64": - optional: true - "@parcel/watcher-darwin-arm64": - optional: true - "@parcel/watcher-darwin-x64": - optional: true - "@parcel/watcher-freebsd-x64": - optional: true - "@parcel/watcher-linux-arm-glibc": - optional: true - "@parcel/watcher-linux-arm64-glibc": - optional: true - "@parcel/watcher-linux-arm64-musl": - optional: true - "@parcel/watcher-linux-x64-glibc": - optional: true - "@parcel/watcher-linux-x64-musl": - optional: true - "@parcel/watcher-win32-arm64": - optional: true - "@parcel/watcher-win32-ia32": - optional: true - "@parcel/watcher-win32-x64": - optional: true - checksum: 9ff89d7e8c0beeee998b28a173870c657b65aa76fafb3c98524f4c28f37103b70e84538de3a380a1126b28e4e84c90df87804398c38fdcaef877f87aa06db961 - languageName: node - linkType: hard - -"@peculiar/asn1-schema@npm:^2.1.6, @peculiar/asn1-schema@npm:^2.3.0": - version: 2.3.0 - resolution: "@peculiar/asn1-schema@npm:2.3.0" - dependencies: - asn1js: ^3.0.5 - pvtsutils: ^1.3.2 - tslib: ^2.4.0 - checksum: aa510c68de83be94a8d0e96ca1f7c92d2bd790867eed887c0db32d6b2fc49c5dd9d8269648e9665686ba9b2fd8469324c61e04fed50f7aad3f68a0ca0e1cde4b - languageName: node - linkType: hard - -"@peculiar/json-schema@npm:^1.1.12": - version: 1.1.12 - resolution: "@peculiar/json-schema@npm:1.1.12" - dependencies: - tslib: ^2.0.0 - checksum: b26ececdc23c5ef25837f8be8d1eb5e1c8bb6e9ae7227ac59ffea57fff56bd05137734e7685e9100595d3d88d906dff638ef8d1df54264c388d3eac1b05aa060 - languageName: node - linkType: hard - -"@peculiar/webcrypto@npm:^1.4.0": - version: 1.4.1 - resolution: "@peculiar/webcrypto@npm:1.4.1" - dependencies: - "@peculiar/asn1-schema": ^2.3.0 - "@peculiar/json-schema": ^1.1.12 - pvtsutils: ^1.3.2 - tslib: ^2.4.1 - webcrypto-core: ^1.7.4 - checksum: cfcd49f6bd199016de83445f1786b17c49d02aee74b400e7e03ba3bc3707457bdebd23bbaba0e2ff3becdcd769d71b79ec64ae35e0acb80b4ab3ed6326ab111c - languageName: node - linkType: hard - -"@pkgjs/parseargs@npm:^0.11.0": - version: 0.11.0 - resolution: "@pkgjs/parseargs@npm:0.11.0" - checksum: 6ad6a00fc4f2f2cfc6bff76fb1d88b8ee20bc0601e18ebb01b6d4be583733a860239a521a7fbca73b612e66705078809483549d2b18f370eb346c5155c8e4a0f - languageName: node - linkType: hard - -"@playwright/test@npm:1.49.1": - version: 1.49.1 - resolution: "@playwright/test@npm:1.49.1" - dependencies: - playwright: 1.49.1 - bin: - playwright: cli.js - checksum: cdbd16df3d773dc8e522d79b4b961e25c2e1b1d4f3ec45eb711078ab5d11bca47caafe833e2be2f923328fbd012405a9ee31d9b449d184077598546a36847e69 - languageName: node - linkType: hard - -"@pmmmwh/react-refresh-webpack-plugin@npm:0.5.11": - version: 0.5.11 - resolution: "@pmmmwh/react-refresh-webpack-plugin@npm:0.5.11" - dependencies: - ansi-html-community: ^0.0.8 - common-path-prefix: ^3.0.0 - core-js-pure: ^3.23.3 - error-stack-parser: ^2.0.6 - find-up: ^5.0.0 - html-entities: ^2.1.0 - loader-utils: ^2.0.4 - schema-utils: ^3.0.0 - source-map: ^0.7.3 - peerDependencies: - "@types/webpack": 4.x || 5.x - react-refresh: ">=0.10.0 <1.0.0" - sockjs-client: ^1.4.0 - type-fest: ">=0.17.0 <5.0.0" - webpack: ">=4.43.0 <6.0.0" - webpack-dev-server: 3.x || 4.x - webpack-hot-middleware: 2.x - webpack-plugin-serve: 0.x || 1.x - peerDependenciesMeta: - "@types/webpack": - optional: true - sockjs-client: - optional: true - type-fest: - optional: true - webpack-dev-server: - optional: true - webpack-hot-middleware: - optional: true - webpack-plugin-serve: - optional: true - checksum: a82eced9519f4dcac424acae719f819ab4150bfcf2874ac7daaf25a4f1c409e3d8b9d693fea0c686c24d520a5473756df32da90d8b89739670f8f8084c600bb4 - languageName: node - linkType: hard - -"@pmmmwh/react-refresh-webpack-plugin@npm:^0.5.1, @pmmmwh/react-refresh-webpack-plugin@npm:^0.5.3": - version: 0.5.15 - resolution: "@pmmmwh/react-refresh-webpack-plugin@npm:0.5.15" - dependencies: - ansi-html: ^0.0.9 - core-js-pure: ^3.23.3 - error-stack-parser: ^2.0.6 - html-entities: ^2.1.0 - loader-utils: ^2.0.4 - schema-utils: ^4.2.0 - source-map: ^0.7.3 - peerDependencies: - "@types/webpack": 4.x || 5.x - react-refresh: ">=0.10.0 <1.0.0" - sockjs-client: ^1.4.0 - type-fest: ">=0.17.0 <5.0.0" - webpack: ">=4.43.0 <6.0.0" - webpack-dev-server: 3.x || 4.x || 5.x - webpack-hot-middleware: 2.x - webpack-plugin-serve: 0.x || 1.x - peerDependenciesMeta: - "@types/webpack": - optional: true - sockjs-client: - optional: true - type-fest: - optional: true - webpack-dev-server: - optional: true - webpack-hot-middleware: - optional: true - webpack-plugin-serve: - optional: true - checksum: 82df6244146209d63a12f0ca2e70b05274ee058c7e6d6eb4ced1228afde3b039a7f3f3cc0c76f1bb4b28deadbcf08bc2821c814f0bfee06979128578300fff3d - languageName: node - linkType: hard - -"@polka/url@npm:^1.0.0-next.24": - version: 1.0.0-next.25 - resolution: "@polka/url@npm:1.0.0-next.25" - checksum: 4ab1d7a37163139c0e7bfc9d1e3f6a2a0db91a78b9f0a21f571d6aec2cdaeaacced744d47886c117aa7579aa5694b303fe3e0bd1922bb9cb3ce6bf7c2dc09801 - languageName: node - linkType: hard - -"@popperjs/core@npm:2.11.8": - version: 2.11.8 - resolution: "@popperjs/core@npm:2.11.8" - checksum: e5c69fdebf52a4012f6a1f14817ca8e9599cb1be73dd1387e1785e2ed5e5f0862ff817f420a87c7fc532add1f88a12e25aeb010ffcbdc98eace3d55ce2139cf0 - languageName: node - linkType: hard - -"@protobufjs/aspromise@npm:^1.1.1, @protobufjs/aspromise@npm:^1.1.2": - version: 1.1.2 - resolution: "@protobufjs/aspromise@npm:1.1.2" - checksum: 011fe7ef0826b0fd1a95935a033a3c0fd08483903e1aa8f8b4e0704e3233406abb9ee25350ec0c20bbecb2aad8da0dcea58b392bbd77d6690736f02c143865d2 - languageName: node - linkType: hard - -"@protobufjs/base64@npm:^1.1.2": - version: 1.1.2 - resolution: "@protobufjs/base64@npm:1.1.2" - checksum: 67173ac34de1e242c55da52c2f5bdc65505d82453893f9b51dc74af9fe4c065cf4a657a4538e91b0d4a1a1e0a0642215e31894c31650ff6e3831471061e1ee9e - languageName: node - linkType: hard - -"@protobufjs/codegen@npm:^2.0.4": - version: 2.0.4 - resolution: "@protobufjs/codegen@npm:2.0.4" - checksum: 59240c850b1d3d0b56d8f8098dd04787dcaec5c5bd8de186fa548de86b86076e1c50e80144b90335e705a044edf5bc8b0998548474c2a10a98c7e004a1547e4b - languageName: node - linkType: hard - -"@protobufjs/eventemitter@npm:^1.1.0": - version: 1.1.0 - resolution: "@protobufjs/eventemitter@npm:1.1.0" - checksum: 0369163a3d226851682f855f81413cbf166cd98f131edb94a0f67f79e75342d86e89df9d7a1df08ac28be2bc77e0a7f0200526bb6c2a407abbfee1f0262d5fd7 - languageName: node - linkType: hard - -"@protobufjs/fetch@npm:^1.1.0": - version: 1.1.0 - resolution: "@protobufjs/fetch@npm:1.1.0" - dependencies: - "@protobufjs/aspromise": ^1.1.1 - "@protobufjs/inquire": ^1.1.0 - checksum: 3fce7e09eb3f1171dd55a192066450f65324fd5f7cc01a431df01bb00d0a895e6bfb5b0c5561ce157ee1d886349c90703d10a4e11a1a256418ff591b969b3477 - languageName: node - linkType: hard - -"@protobufjs/float@npm:^1.0.2": - version: 1.0.2 - resolution: "@protobufjs/float@npm:1.0.2" - checksum: 5781e1241270b8bd1591d324ca9e3a3128d2f768077a446187a049e36505e91bc4156ed5ac3159c3ce3d2ba3743dbc757b051b2d723eea9cd367bfd54ab29b2f - languageName: node - linkType: hard - -"@protobufjs/inquire@npm:^1.1.0": - version: 1.1.0 - resolution: "@protobufjs/inquire@npm:1.1.0" - checksum: ca06f02eaf65ca36fb7498fc3492b7fc087bfcc85c702bac5b86fad34b692bdce4990e0ef444c1e2aea8c034227bd1f0484be02810d5d7e931c55445555646f4 - languageName: node - linkType: hard - -"@protobufjs/path@npm:^1.1.2": - version: 1.1.2 - resolution: "@protobufjs/path@npm:1.1.2" - checksum: 856eeb532b16a7aac071cacde5c5620df800db4c80cee6dbc56380524736205aae21e5ae47739114bf669ab5e8ba0e767a282ad894f3b5e124197cb9224445ee - languageName: node - linkType: hard - -"@protobufjs/pool@npm:^1.1.0": - version: 1.1.0 - resolution: "@protobufjs/pool@npm:1.1.0" - checksum: d6a34fbbd24f729e2a10ee915b74e1d77d52214de626b921b2d77288bd8f2386808da2315080f2905761527cceffe7ec34c7647bd21a5ae41a25e8212ff79451 - languageName: node - linkType: hard - -"@protobufjs/utf8@npm:^1.1.0": - version: 1.1.0 - resolution: "@protobufjs/utf8@npm:1.1.0" - checksum: f9bf3163d13aaa3b6f5e6fbf37a116e094ea021c0e1f2a7ccd0e12a29e2ce08dafba4e8b36e13f8ed7397e1591610ce880ed1289af4d66cf4ace8a36a9557278 - languageName: node - linkType: hard - -"@reach/dialog@npm:0.10.5": - version: 0.10.5 - resolution: "@reach/dialog@npm:0.10.5" - dependencies: - "@reach/portal": 0.10.5 - "@reach/utils": 0.10.5 - prop-types: ^15.7.2 - react-focus-lock: ^2.3.1 - react-remove-scroll: ^2.3.0 - tslib: ^2.0.0 - peerDependencies: - react: ^16.8.0 - react-dom: ^16.8.0 - checksum: ed526ef5a2b0249dc98b91919f8468f4909fe6614523544f3eff215b55f89f51480868f5e614aee0c5dc3dfa3141a8d109202cd80fb223c83a6700fb16667440 - languageName: node - linkType: hard - -"@reach/portal@npm:0.10.5": - version: 0.10.5 - resolution: "@reach/portal@npm:0.10.5" - dependencies: - "@reach/utils": 0.10.5 - tslib: ^2.0.0 - peerDependencies: - react: ^16.8.0 - react-dom: ^16.8.0 - checksum: 4f8c43cdfa8e4f0cc0fdb71d17b344ee4e8e35d4c0633afce120cfc072445ec61123351563c3ca603b5829fe3d462acb3ed58ebe48a4c9cfcbea979c256d80f5 - languageName: node - linkType: hard - -"@reach/utils@npm:0.10.5": - version: 0.10.5 - resolution: "@reach/utils@npm:0.10.5" - dependencies: - "@types/warning": ^3.0.0 - tslib: ^2.0.0 - warning: ^4.0.3 - peerDependencies: - react: ^16.8.0 - react-dom: ^16.8.0 - checksum: 34acbff41f521774d78d847f9f463b187f5a85c903b43ff1b47a3368f97625809dded58156daa2dc25ecfa21a6f7c6c428286974531f964d0733cf4842edda5f - languageName: node - linkType: hard - -"@react-native-async-storage/async-storage@npm:1.23.1, @react-native-async-storage/async-storage@npm:^1.17.11": - version: 1.23.1 - resolution: "@react-native-async-storage/async-storage@npm:1.23.1" - dependencies: - merge-options: ^3.0.4 - peerDependencies: - react-native: ^0.0.0-0 || >=0.60 <1.0 - checksum: 7096546ed4a5faf1f6e0425e2e15713575f1a7493a04524da386ff35c3844b57b8fd20544fad4157b4a61e048b10235f2f06124f262da5b327edc74fbc31e02b - languageName: node - linkType: hard - -"@react-native-community/cli-clean@npm:15.0.1": - version: 15.0.1 - resolution: "@react-native-community/cli-clean@npm:15.0.1" - dependencies: - "@react-native-community/cli-tools": 15.0.1 - chalk: ^4.1.2 - execa: ^5.0.0 - fast-glob: ^3.3.2 - checksum: ea6c663ec56cfe3a2c4fac7d3f0fec2ac8de9c34458f241b2afdf7f45dfb00d1de9e367fec732f8fef6e2b17046f4ed03c3be2ea4d2075633197dc23c516f986 - languageName: node - linkType: hard - -"@react-native-community/cli-config-android@npm:^15.0.0": - version: 15.1.3 - resolution: "@react-native-community/cli-config-android@npm:15.1.3" - dependencies: - "@react-native-community/cli-tools": 15.1.3 - chalk: ^4.1.2 - fast-glob: ^3.3.2 - fast-xml-parser: ^4.4.1 - checksum: 07c207c5b9d9f21240c40c771a8761709c6f62e2d01272ca83d1649c728569e5447c172b0ef8868f1ba188217591fe63b731578cc2cec8b3c8705d4056e03186 - languageName: node - linkType: hard - -"@react-native-community/cli-config-apple@npm:15.0.1": - version: 15.0.1 - resolution: "@react-native-community/cli-config-apple@npm:15.0.1" - dependencies: - "@react-native-community/cli-tools": 15.0.1 - chalk: ^4.1.2 - execa: ^5.0.0 - fast-glob: ^3.3.2 - checksum: 67b9be8b6cce14f764a5734b9599eb7d1095c7fb5c06b0b6cd3518cf3a00c90026018c1eb8d497338da092a3cdcaa9b33fec34c5b766a4517c70293e5f1df58d - languageName: node - linkType: hard - -"@react-native-community/cli-config-apple@npm:^15.0.0": - version: 15.1.3 - resolution: "@react-native-community/cli-config-apple@npm:15.1.3" - dependencies: - "@react-native-community/cli-tools": 15.1.3 - chalk: ^4.1.2 - execa: ^5.0.0 - fast-glob: ^3.3.2 - checksum: 8c956e15505fd2753b2b8c5bf3a2b8838bb637ec84e8f44c4c29b12b1b60b601779611655eaa0adefe54d693818d7888eb77e07a0f915a3709c35d9c72e306a3 - languageName: node - linkType: hard - -"@react-native-community/cli-config@npm:15.0.1": - version: 15.0.1 - resolution: "@react-native-community/cli-config@npm:15.0.1" - dependencies: - "@react-native-community/cli-tools": 15.0.1 - chalk: ^4.1.2 - cosmiconfig: ^9.0.0 - deepmerge: ^4.3.0 - fast-glob: ^3.3.2 - joi: ^17.2.1 - checksum: 23314bcdf465974ee71a01792f0a1149ea51eea1dc66416e53aa2bc3a123dba6a8e0654d68211d2b20570bc875145b2e5d4abf923190c685c0021bb280230c3f - languageName: node - linkType: hard - -"@react-native-community/cli-debugger-ui@npm:15.0.1": - version: 15.0.1 - resolution: "@react-native-community/cli-debugger-ui@npm:15.0.1" - dependencies: - serve-static: ^1.13.1 - checksum: a97bb195f3722b91e0acf4c63f4e6956d572f5a275a13be01513b6797bd81ad0b838aa4fc8440131e64c39547c8e83feebb6435a34773269355a497122ed2209 - languageName: node - linkType: hard - -"@react-native-community/cli-doctor@npm:15.0.1": - version: 15.0.1 - resolution: "@react-native-community/cli-doctor@npm:15.0.1" - dependencies: - "@react-native-community/cli-config": 15.0.1 - "@react-native-community/cli-platform-android": 15.0.1 - "@react-native-community/cli-platform-apple": 15.0.1 - "@react-native-community/cli-platform-ios": 15.0.1 - "@react-native-community/cli-tools": 15.0.1 - chalk: ^4.1.2 - command-exists: ^1.2.8 - deepmerge: ^4.3.0 - envinfo: ^7.13.0 - execa: ^5.0.0 - node-stream-zip: ^1.9.1 - ora: ^5.4.1 - semver: ^7.5.2 - strip-ansi: ^5.2.0 - wcwidth: ^1.0.1 - yaml: ^2.2.1 - checksum: 6df1825df9f563096e48528f16d0bc521aceb2933e864921c8092eeeeeade0893963964897a6145b26a3d4de72ce05259f2d06f873eae64796d8c3815f22f1a5 - languageName: node - linkType: hard - -"@react-native-community/cli-platform-android@npm:15.0.1": - version: 15.0.1 - resolution: "@react-native-community/cli-platform-android@npm:15.0.1" - dependencies: - "@react-native-community/cli-tools": 15.0.1 - chalk: ^4.1.2 - execa: ^5.0.0 - fast-glob: ^3.3.2 - fast-xml-parser: ^4.4.1 - logkitty: ^0.7.1 - checksum: 6c5e5912b7c81a6cb9076ae08897470090e1ff20fdaa502d500b4700235f2411942c6e38e3373111efa025dee9a1d3cc71dea6a4c42a89272f0d56b1eeb7b38a - languageName: node - linkType: hard - -"@react-native-community/cli-platform-apple@npm:15.0.1": - version: 15.0.1 - resolution: "@react-native-community/cli-platform-apple@npm:15.0.1" - dependencies: - "@react-native-community/cli-config-apple": 15.0.1 - "@react-native-community/cli-tools": 15.0.1 - chalk: ^4.1.2 - execa: ^5.0.0 - fast-xml-parser: ^4.4.1 - checksum: 27278ff8790fddc220cba9daa4b05cb027403b7c3b81cd3f025b09f52ceccd41f68e86b71d493794eadc2d54fa4a5f6a1032608c4ec7ce928cc1985dce7b9bd2 - languageName: node - linkType: hard - -"@react-native-community/cli-platform-ios@npm:15.0.1": - version: 15.0.1 - resolution: "@react-native-community/cli-platform-ios@npm:15.0.1" - dependencies: - "@react-native-community/cli-platform-apple": 15.0.1 - checksum: 27b4775af43ce06e9315fda54f299e96405975c44d20a495443074d2818fc085dcb85cf2d2e6581990b71ab2e9ffc7d88666337bec8eb9412e80abf8dd793851 - languageName: node - linkType: hard - -"@react-native-community/cli-server-api@npm:15.0.1": - version: 15.0.1 - resolution: "@react-native-community/cli-server-api@npm:15.0.1" - dependencies: - "@react-native-community/cli-debugger-ui": 15.0.1 - "@react-native-community/cli-tools": 15.0.1 - compression: ^1.7.1 - connect: ^3.6.5 - errorhandler: ^1.5.1 - nocache: ^3.0.1 - pretty-format: ^26.6.2 - serve-static: ^1.13.1 - ws: ^6.2.3 - checksum: 354eba589433251a56db7edf005886aa3c4886ff70f52b999db7c3718435f01a3f1081bc56cc681a1b7de2fa50ea4891c4ea673fe0a02eb855ecbc001bd86654 - languageName: node - linkType: hard - -"@react-native-community/cli-tools@npm:15.0.1": - version: 15.0.1 - resolution: "@react-native-community/cli-tools@npm:15.0.1" - dependencies: - appdirsjs: ^1.2.4 - chalk: ^4.1.2 - execa: ^5.0.0 - find-up: ^5.0.0 - mime: ^2.4.1 - open: ^6.2.0 - ora: ^5.4.1 - prompts: ^2.4.2 - semver: ^7.5.2 - shell-quote: ^1.7.3 - sudo-prompt: ^9.0.0 - checksum: 0c40d5aa2306a2bfc1ee15362d045b0eff3cb162dd1b070f504508b2bbdd00c791151cf9f8679d248b4480b75b758e60b8d0cf3c19a19a02b4b4ece9928a119c - languageName: node - linkType: hard - -"@react-native-community/cli-tools@npm:15.1.3, @react-native-community/cli-tools@npm:^15.0.0": - version: 15.1.3 - resolution: "@react-native-community/cli-tools@npm:15.1.3" - dependencies: - appdirsjs: ^1.2.4 - chalk: ^4.1.2 - execa: ^5.0.0 - find-up: ^5.0.0 - mime: ^2.4.1 - open: ^6.2.0 - ora: ^5.4.1 - prompts: ^2.4.2 - semver: ^7.5.2 - shell-quote: ^1.7.3 - sudo-prompt: ^9.0.0 - checksum: f62997b7ed16df5beffc699c7556eebe0b27a63ac0b10dcf8af3e2875231183752e4a1a7e55e9d60f0b9cbfd7c3a2dd264eccc0e3430b81660538e27d5deffc8 - languageName: node - linkType: hard - -"@react-native-community/cli-types@npm:15.0.1": - version: 15.0.1 - resolution: "@react-native-community/cli-types@npm:15.0.1" - dependencies: - joi: ^17.2.1 - checksum: 77452486158afcf1f03a3596135b6dba16dba5dd10209dacd5a6a4b176df36d37b8e49af61590d5a64df4907cf0575b6f37e0a3893335f961a9380edaee32152 - languageName: node - linkType: hard - -"@react-native-community/cli@npm:15.0.1": - version: 15.0.1 - resolution: "@react-native-community/cli@npm:15.0.1" - dependencies: - "@react-native-community/cli-clean": 15.0.1 - "@react-native-community/cli-config": 15.0.1 - "@react-native-community/cli-debugger-ui": 15.0.1 - "@react-native-community/cli-doctor": 15.0.1 - "@react-native-community/cli-server-api": 15.0.1 - "@react-native-community/cli-tools": 15.0.1 - "@react-native-community/cli-types": 15.0.1 - chalk: ^4.1.2 - commander: ^9.4.1 - deepmerge: ^4.3.0 - execa: ^5.0.0 - find-up: ^5.0.0 - fs-extra: ^8.1.0 - graceful-fs: ^4.1.3 - prompts: ^2.4.2 - semver: ^7.5.2 - bin: - rnc-cli: build/bin.js - checksum: 26c98ef67b4b89d3af13f2a3b19e51c7b2de5d320ca908cb628ca22b32bff5a17b8a1cc7f4b0ece303c4e53dc10e8ac0e88df9b376e63ebc97acb8d358f78c2e - languageName: node - linkType: hard - -"@react-native-community/datetimepicker@npm:8.2.0": - version: 8.2.0 - resolution: "@react-native-community/datetimepicker@npm:8.2.0" - dependencies: - invariant: ^2.2.4 - peerDependencies: - expo: ">=50.0.0" - react: "*" - react-native: "*" - react-native-windows: "*" - peerDependenciesMeta: - expo: - optional: true - react-native-windows: - optional: true - checksum: 3adc9346f8948abed246da3bfa3a223e44c2c5903070178a82e583ce6f8273607fe5a542af834b3a27aff81980c555e5f72bf0e87c85e3f00856a0de21525374 - languageName: node - linkType: hard - -"@react-native-community/eslint-config@npm:3.2.0": - version: 3.2.0 - resolution: "@react-native-community/eslint-config@npm:3.2.0" - dependencies: - "@babel/core": ^7.14.0 - "@babel/eslint-parser": ^7.18.2 - "@react-native-community/eslint-plugin": ^1.1.0 - "@typescript-eslint/eslint-plugin": ^5.30.5 - "@typescript-eslint/parser": ^5.30.5 - eslint-config-prettier: ^8.5.0 - eslint-plugin-eslint-comments: ^3.2.0 - eslint-plugin-ft-flow: ^2.0.1 - eslint-plugin-jest: ^26.5.3 - eslint-plugin-prettier: ^4.2.1 - eslint-plugin-react: ^7.30.1 - eslint-plugin-react-hooks: ^4.6.0 - eslint-plugin-react-native: ^4.0.0 - peerDependencies: - eslint: ">=8" - prettier: ">=2" - checksum: 0a2dce65dbe43067571d7a382cfcfb1cae041b319aff216116797389ef0e431865caf6f48925e3532f1879363dc9f6b15cf81fdc967879d544d54605fd617119 - languageName: node - linkType: hard - -"@react-native-community/eslint-plugin@npm:^1.1.0": - version: 1.3.0 - resolution: "@react-native-community/eslint-plugin@npm:1.3.0" - checksum: 5e04fa161fca6453299aed691695ea071fed8166c5da36935047eb6c169bc38c9d599e1ce20402b63cbcaf086a9bb63d2e88836be142cecabf61ba36954ccaae - languageName: node - linkType: hard - -"@react-native-community/netinfo@npm:11.4.1": - version: 11.4.1 - resolution: "@react-native-community/netinfo@npm:11.4.1" - peerDependencies: - react-native: ">=0.59" - checksum: d347ae522da6b8c045d6378754d4928bdf23cc85b74571b91fa8a03fa168bdac5e3c65eb97eac0dd0c7cbd20e782f99d41b090fb79ce7d815cbaf6fb5d1abe37 - languageName: node - linkType: hard - -"@react-native-community/slider@npm:4.5.5": - version: 4.5.5 - resolution: "@react-native-community/slider@npm:4.5.5" - checksum: 8d818e7f505694269bf8009c8c5db89efc3e9bb56054a1835613b6d7431356370bef9ce23d269519163097fe506e3f5420b34ba2c553bf380d1f144277a11942 - languageName: node - linkType: hard - -"@react-native-firebase/app-check@npm:21.0.0": - version: 21.0.0 - resolution: "@react-native-firebase/app-check@npm:21.0.0" - peerDependencies: - "@react-native-firebase/app": 21.0.0 - expo: ">=47.0.0" - peerDependenciesMeta: - expo: - optional: true - checksum: 8dbbb514778c14871cbaf25c5fb39dc1039351d9993df68ccb20cbebf2a68baa991c53a0171e7aa4e03504e65f2a24befe23e15ba7fc06db417a0044e5130208 - languageName: node - linkType: hard - -"@react-native-firebase/app@npm:21.0.0": - version: 21.0.0 - resolution: "@react-native-firebase/app@npm:21.0.0" - dependencies: - firebase: 10.13.2 - superstruct: ^0.6.2 - peerDependencies: - expo: ">=47.0.0" - react: "*" - react-native: "*" - peerDependenciesMeta: - expo: - optional: true - checksum: 23c680ac7090c01214fa3c533f0fe3a3ce39698f0b7761130ca38606a51900f5b23d646f732e70e9fcb132fd4ab14c2512d1c234cefe6bd5e1494cb2aa6e6913 - languageName: node - linkType: hard - -"@react-native-firebase/auth@npm:21.0.0": - version: 21.0.0 - resolution: "@react-native-firebase/auth@npm:21.0.0" - dependencies: - plist: ^3.1.0 - peerDependencies: - "@react-native-firebase/app": 21.0.0 - expo: ">=47.0.0" - peerDependenciesMeta: - expo: - optional: true - checksum: 0e44d3394f23e41e92180a972dd976606b7f0268a2bd92e264a93a4e080164578e7121927631e000fda97f67d919431042d7c7a0da88bbfd8c29d76082be6ef3 - languageName: node - linkType: hard - -"@react-native-firebase/firestore@npm:21.0.0": - version: 21.0.0 - resolution: "@react-native-firebase/firestore@npm:21.0.0" - peerDependencies: - "@react-native-firebase/app": 21.0.0 - checksum: 76710b26730a12b97aba9b0596489d0b01e0e13081e895c2b3bb89f53127d90d81050f17482edcb9db453cf338f7f33f966f0117fe6fc14773f37ec7923e1fd3 - languageName: node - linkType: hard - -"@react-native-masked-view/masked-view@npm:0.3.2": - version: 0.3.2 - resolution: "@react-native-masked-view/masked-view@npm:0.3.2" - peerDependencies: - react: ">=16" - react-native: ">=0.57" - checksum: e35ab882148df3f9b71f04355d2fb1b24d6f2aaf29043f80758f398bdf905eed67734b36b072fa8b934923ff4e3d80ccb5e37d8376cb1825272078b96a21dadc - languageName: node - linkType: hard - -"@react-native/assets-registry@npm:0.76.6": - version: 0.76.6 - resolution: "@react-native/assets-registry@npm:0.76.6" - checksum: 20a4d8e00c5e975a2db7f449f8b6a0a81c25ed14de8ec14099b7bda690a27ed8f34a54f5e558cc45649d8171ff52d2a5f4305cf82abab3584490f67cc36ea718 - languageName: node - linkType: hard - -"@react-native/assets-registry@patch:@react-native/assets-registry@npm%3A0.76.6#./.yarn/patches/@react-native-assets-registry-npm-0.76.6-2e03ad50eb.patch::locator=universe%40workspace%3A.": - version: 0.76.6 - resolution: "@react-native/assets-registry@patch:@react-native/assets-registry@npm%3A0.76.6#./.yarn/patches/@react-native-assets-registry-npm-0.76.6-2e03ad50eb.patch::version=0.76.6&hash=752757&locator=universe%40workspace%3A." - checksum: 1a979a2feb4fa9f885d9a55a745a54939ce7eeb3bae96efe4e613764f6ed60fd6e320162b6add587a696dd6e025d84966df7f01a740da2d60fb20a6c841f1126 - languageName: node - linkType: hard - -"@react-native/babel-plugin-codegen@npm:0.76.6": - version: 0.76.6 - resolution: "@react-native/babel-plugin-codegen@npm:0.76.6" - dependencies: - "@react-native/codegen": 0.76.6 - checksum: 7c8eabe9dd1124c73ac11d76e752f5f3bcd15ea0b1973dc82b030e4b619a0ecc0992a7afc50defc44ad9dab066db847bc4f3eb62153a78c60d2e5a5457905e08 - languageName: node - linkType: hard - -"@react-native/babel-preset@npm:0.76.6": - version: 0.76.6 - resolution: "@react-native/babel-preset@npm:0.76.6" - dependencies: - "@babel/core": ^7.25.2 - "@babel/plugin-proposal-export-default-from": ^7.24.7 - "@babel/plugin-syntax-dynamic-import": ^7.8.3 - "@babel/plugin-syntax-export-default-from": ^7.24.7 - "@babel/plugin-syntax-nullish-coalescing-operator": ^7.8.3 - "@babel/plugin-syntax-optional-chaining": ^7.8.3 - "@babel/plugin-transform-arrow-functions": ^7.24.7 - "@babel/plugin-transform-async-generator-functions": ^7.25.4 - "@babel/plugin-transform-async-to-generator": ^7.24.7 - "@babel/plugin-transform-block-scoping": ^7.25.0 - "@babel/plugin-transform-class-properties": ^7.25.4 - "@babel/plugin-transform-classes": ^7.25.4 - "@babel/plugin-transform-computed-properties": ^7.24.7 - "@babel/plugin-transform-destructuring": ^7.24.8 - "@babel/plugin-transform-flow-strip-types": ^7.25.2 - "@babel/plugin-transform-for-of": ^7.24.7 - "@babel/plugin-transform-function-name": ^7.25.1 - "@babel/plugin-transform-literals": ^7.25.2 - "@babel/plugin-transform-logical-assignment-operators": ^7.24.7 - "@babel/plugin-transform-modules-commonjs": ^7.24.8 - "@babel/plugin-transform-named-capturing-groups-regex": ^7.24.7 - "@babel/plugin-transform-nullish-coalescing-operator": ^7.24.7 - "@babel/plugin-transform-numeric-separator": ^7.24.7 - "@babel/plugin-transform-object-rest-spread": ^7.24.7 - "@babel/plugin-transform-optional-catch-binding": ^7.24.7 - "@babel/plugin-transform-optional-chaining": ^7.24.8 - "@babel/plugin-transform-parameters": ^7.24.7 - "@babel/plugin-transform-private-methods": ^7.24.7 - "@babel/plugin-transform-private-property-in-object": ^7.24.7 - "@babel/plugin-transform-react-display-name": ^7.24.7 - "@babel/plugin-transform-react-jsx": ^7.25.2 - "@babel/plugin-transform-react-jsx-self": ^7.24.7 - "@babel/plugin-transform-react-jsx-source": ^7.24.7 - "@babel/plugin-transform-regenerator": ^7.24.7 - "@babel/plugin-transform-runtime": ^7.24.7 - "@babel/plugin-transform-shorthand-properties": ^7.24.7 - "@babel/plugin-transform-spread": ^7.24.7 - "@babel/plugin-transform-sticky-regex": ^7.24.7 - "@babel/plugin-transform-typescript": ^7.25.2 - "@babel/plugin-transform-unicode-regex": ^7.24.7 - "@babel/template": ^7.25.0 - "@react-native/babel-plugin-codegen": 0.76.6 - babel-plugin-syntax-hermes-parser: ^0.25.1 - babel-plugin-transform-flow-enums: ^0.0.2 - react-refresh: ^0.14.0 - peerDependencies: - "@babel/core": "*" - checksum: 4c2e231fd07e14dd9d7090d0247c58928c3b75adfea0a4fff836722aa848c4d9cef7db474fe81a663454794f43df1902569994a03ec9b1c34c06573393b1d7a7 - languageName: node - linkType: hard - -"@react-native/codegen@npm:0.76.6": - version: 0.76.6 - resolution: "@react-native/codegen@npm:0.76.6" - dependencies: - "@babel/parser": ^7.25.3 - glob: ^7.1.1 - hermes-parser: 0.23.1 - invariant: ^2.2.4 - jscodeshift: ^0.14.0 - mkdirp: ^0.5.1 - nullthrows: ^1.1.1 - yargs: ^17.6.2 - peerDependencies: - "@babel/preset-env": ^7.1.6 - checksum: e7e78c3c5b180876b6d5b3c496ab1f5670316e39bdd7c915a4656bffb1b2a4614b5b0aeb2905c73c72191fc4b21b5a2592209da3e4ef1fd36dbc166e3c4bc269 - languageName: node - linkType: hard - -"@react-native/community-cli-plugin@npm:0.76.6": - version: 0.76.6 - resolution: "@react-native/community-cli-plugin@npm:0.76.6" - dependencies: - "@react-native/dev-middleware": 0.76.6 - "@react-native/metro-babel-transformer": 0.76.6 - chalk: ^4.0.0 - execa: ^5.1.1 - invariant: ^2.2.4 - metro: ^0.81.0 - metro-config: ^0.81.0 - metro-core: ^0.81.0 - node-fetch: ^2.2.0 - readline: ^1.3.0 - semver: ^7.1.3 - peerDependencies: - "@react-native-community/cli-server-api": "*" - peerDependenciesMeta: - "@react-native-community/cli-server-api": - optional: true - checksum: 290008817d89e15074ef333561e8b8a5db0722743b3f760595c63e17de37d6663018040e4ffd8dd91bbdc19a50f7ac7a9db8e8eaf532434f776c14145414e3e6 - languageName: node - linkType: hard - -"@react-native/debugger-frontend@npm:0.76.2": - version: 0.76.2 - resolution: "@react-native/debugger-frontend@npm:0.76.2" - checksum: 64ff00f34356181ae33426827ea351f2f9ba788e53662ca1d80683dd063c98a4c474dbb85d24fa060d1ad19b5558734ac08cad531538c06f1e83eb34afbfa818 - languageName: node - linkType: hard - -"@react-native/debugger-frontend@npm:0.76.6": - version: 0.76.6 - resolution: "@react-native/debugger-frontend@npm:0.76.6" - checksum: f9c61f41b1d7ac8969d52db6189ccff11f74ea4522015d715fe07b87634f44a7d969074bee3bc5c2a824076d866f5462d127261c1af08645e60cfa2329bde972 - languageName: node - linkType: hard - -"@react-native/dev-middleware@npm:0.76.2": - version: 0.76.2 - resolution: "@react-native/dev-middleware@npm:0.76.2" - dependencies: - "@isaacs/ttlcache": ^1.4.1 - "@react-native/debugger-frontend": 0.76.2 - chrome-launcher: ^0.15.2 - chromium-edge-launcher: ^0.2.0 - connect: ^3.6.5 - debug: ^2.2.0 - nullthrows: ^1.1.1 - open: ^7.0.3 - selfsigned: ^2.4.1 - serve-static: ^1.13.1 - ws: ^6.2.3 - checksum: 5d38b9050b85d3d4e2ed4d48abe22c224a552d962fe519928ebb9eb2ffad9e7c53b2d02a3eec2e1be8d7a10bd1b3aa7035b68d56f4d3347942f1b605ba58e620 - languageName: node - linkType: hard - -"@react-native/dev-middleware@npm:0.76.6": - version: 0.76.6 - resolution: "@react-native/dev-middleware@npm:0.76.6" - dependencies: - "@isaacs/ttlcache": ^1.4.1 - "@react-native/debugger-frontend": 0.76.6 - chrome-launcher: ^0.15.2 - chromium-edge-launcher: ^0.2.0 - connect: ^3.6.5 - debug: ^2.2.0 - nullthrows: ^1.1.1 - open: ^7.0.3 - selfsigned: ^2.4.1 - serve-static: ^1.13.1 - ws: ^6.2.3 - checksum: 5f8d8bb48966ffed9fff22910749e082e2ee0de6d0b82438925520c17ff8989f71f9469ed1fc6e4d56d00664b8690e7be6fe666df324d10ca967ec12e47688ea - languageName: node - linkType: hard - -"@react-native/gradle-plugin@npm:0.76.6": - version: 0.76.6 - resolution: "@react-native/gradle-plugin@npm:0.76.6" - checksum: e77112769a6a6d1b1920dae4890599ea5287ee28655c3e214c39099d6f6167e3b605c2239ee9bfebd1305dc4a04767dfd2c984f991bb04e13d63eaaa829312b4 - languageName: node - linkType: hard - -"@react-native/js-polyfills@npm:0.76.6": - version: 0.76.6 - resolution: "@react-native/js-polyfills@npm:0.76.6" - checksum: e38ebd70d68144c26cf245a35d55567eebbdcb47cfe99da5d66dce6022b79ac3be3a33e9b83e949c9abab6dec7eb5ec777c7ab8180766ce2228be7283bc6ed83 - languageName: node - linkType: hard - -"@react-native/metro-babel-transformer@npm:0.76.6": - version: 0.76.6 - resolution: "@react-native/metro-babel-transformer@npm:0.76.6" - dependencies: - "@babel/core": ^7.25.2 - "@react-native/babel-preset": 0.76.6 - hermes-parser: 0.23.1 - nullthrows: ^1.1.1 - peerDependencies: - "@babel/core": "*" - checksum: 759bcb9abef7679bf9323aaae91091da6b975b5f61858a2528e636770c3b5697c226ab2b37dd737b10c50dae583ba8e4fe379750dda8d46f925f192060b65969 - languageName: node - linkType: hard - -"@react-native/metro-config@npm:0.76.6": - version: 0.76.6 - resolution: "@react-native/metro-config@npm:0.76.6" - dependencies: - "@react-native/js-polyfills": 0.76.6 - "@react-native/metro-babel-transformer": 0.76.6 - metro-config: ^0.81.0 - metro-runtime: ^0.81.0 - checksum: d617d15f7a7b1665090b1e6070654d389345943eda4d91b2acae2a61343260cca0a1fb28fe74041d5f4a29af9ba63c78d654a0f8444e2bf9c269e416780bec46 - languageName: node - linkType: hard - -"@react-native/normalize-color@npm:^2.1.0": - version: 2.1.0 - resolution: "@react-native/normalize-color@npm:2.1.0" - checksum: 8ccbd40b3c7629f1dc97b3e9aadd95fd3507fcf2e37535a6299a70436ab891c34cbdc4240b07380553d6e85dd909e23d5773b5be1da2906b026312e0b0768838 - languageName: node - linkType: hard - -"@react-native/normalize-colors@npm:0.76.6": - version: 0.76.6 - resolution: "@react-native/normalize-colors@npm:0.76.6" - checksum: e6783bee9f88efd1696e742e3beac64cafb4fc6a4a6ea1a14ad3e4a30f887ff194348f3c7b2ad21fc643a5b7727c513d15abe61b65737d41d9f90e28c2660477 - languageName: node - linkType: hard - -"@react-native/normalize-colors@npm:^0.74.1": - version: 0.74.89 - resolution: "@react-native/normalize-colors@npm:0.74.89" - checksum: df62772f029dd132d3061a8ee7f90b6aaf5c525bb7e33c22908249daffa42995cddd91adc790ec9ce701636c14eeafc1809a9d0d879e3f8c71c9f340145abfce - languageName: node - linkType: hard - -"@react-native/virtualized-lists@npm:0.76.6": - version: 0.76.6 - resolution: "@react-native/virtualized-lists@npm:0.76.6" - dependencies: - invariant: ^2.2.4 - nullthrows: ^1.1.1 - peerDependencies: - "@types/react": ^18.2.6 - react: "*" - react-native: "*" - peerDependenciesMeta: - "@types/react": - optional: true - checksum: 6c5aa84733b55bf5a927d0c666dc7d8808f7696fc12d4c22a86f5d68c2ad38d908132e59526934d36bc49f17546baae00f49c3f99f25317cabafa19387caa5de - languageName: node - linkType: hard - -"@react-navigation/core@npm:6.2.2": - version: 6.2.2 - resolution: "@react-navigation/core@npm:6.2.2" - dependencies: - "@react-navigation/routers": ^6.1.1 - escape-string-regexp: ^4.0.0 - nanoid: ^3.1.23 - query-string: ^7.0.0 - react-is: ^16.13.0 - peerDependencies: - react: "*" - checksum: ecc56be910c2eb98b8bb949db76cb59f0ce4b20479c05058244530383e363a57a4680ae638904810238f6cc29d67a140d0cc25b4cbcbce89808de3529ab45ebb - languageName: node - linkType: hard - -"@react-navigation/elements@npm:^1.3.4": - version: 1.3.19 - resolution: "@react-navigation/elements@npm:1.3.19" - peerDependencies: - "@react-navigation/native": ^6.0.0 - react: "*" - react-native: "*" - react-native-safe-area-context: ">= 3.0.0" - checksum: fd095ce1d5ba3c9225f0e861dcad4f72ab96436d8ef60f55731fb517ec1d0397eccde0a69ad9e5844333b82e48e922463d9b2a7f3bffd478a210d26f1b41bc7a - languageName: node - linkType: hard - -"@react-navigation/native-stack@npm:6.7.0": - version: 6.7.0 - resolution: "@react-navigation/native-stack@npm:6.7.0" - dependencies: - "@react-navigation/elements": ^1.3.4 - warn-once: ^0.1.0 - peerDependencies: - "@react-navigation/native": ^6.0.0 - react: "*" - react-native: "*" - react-native-safe-area-context: ">= 3.0.0" - react-native-screens: ">= 3.0.0" - checksum: 85ff46832662c7054a64475d8a7a4202a0f0108742f9a07f3f5b4e10e9d67c1d472d57e797a75371f5993a449446a53f3bbd85ab5db6beb76fd49868ae3539bf - languageName: node - linkType: hard - -"@react-navigation/native@npm:6.0.11": - version: 6.0.11 - resolution: "@react-navigation/native@npm:6.0.11" - dependencies: - "@react-navigation/core": ^6.2.2 - escape-string-regexp: ^4.0.0 - fast-deep-equal: ^3.1.3 - nanoid: ^3.1.23 - peerDependencies: - react: "*" - react-native: "*" - checksum: 0dab07c8144d0b50cfbbd52f2a2da7dd9284d67ed1fd638691eed04fd035881f40233e88998d6337804af573c93bd484c641344b7fd19c4395d698463fb8972b - languageName: node - linkType: hard - -"@react-navigation/routers@npm:6.1.9": - version: 6.1.9 - resolution: "@react-navigation/routers@npm:6.1.9" - dependencies: - nanoid: ^3.1.23 - checksum: 3a3392ce095d6a2bd2aad69856f513b35774f943a3dc73d8ffb75127de6773203e3264188d87058bdea4c0c9a7d43ed28d0cbf3a1f1cdc086df3ee255d8e1e27 - languageName: node - linkType: hard - -"@react-navigation/stack@npm:6.2.2": - version: 6.2.2 - resolution: "@react-navigation/stack@npm:6.2.2" - dependencies: - "@react-navigation/elements": ^1.3.4 - color: ^4.2.3 - warn-once: ^0.1.0 - peerDependencies: - "@react-navigation/native": ^6.0.0 - react: "*" - react-native: "*" - react-native-gesture-handler: ">= 1.0.0" - react-native-safe-area-context: ">= 3.0.0" - react-native-screens: ">= 3.0.0" - checksum: 27cb45e1493759be09c3b1e7ff0d6a7c6847d021d1ce48a1ccbf375d50145cde8fd7546a63c8136026c2d159d48bcdf27f1de7c8017354f16f411a091220c129 - languageName: node - linkType: hard - -"@redux-saga/core@npm:1.2.3, @redux-saga/core@npm:^1.2.2": - version: 1.2.3 - resolution: "@redux-saga/core@npm:1.2.3" - dependencies: - "@babel/runtime": ^7.6.3 - "@redux-saga/deferred": ^1.2.1 - "@redux-saga/delay-p": ^1.2.1 - "@redux-saga/is": ^1.1.3 - "@redux-saga/symbols": ^1.1.3 - "@redux-saga/types": ^1.2.1 - redux: ^4.0.4 - typescript-tuple: ^2.2.1 - checksum: a18249aa4e771699f103c2e18952d5fc0f65124f88c1fe33f4551b658b5ef7fb2d827091fea3e339c91f324e5d9098f758282d92536e1701bd003812353dd004 - languageName: node - linkType: hard - -"@redux-saga/deferred@npm:^1.2.1": - version: 1.2.1 - resolution: "@redux-saga/deferred@npm:1.2.1" - checksum: 2caca8d2fe559c74889562dbd7fabc6f139cc24871a41122e2ac8e4c98fb1c44a081d0fc762f13c12d6320fd759ee2b799d57141025fef93ae553c09338c3fff - languageName: node - linkType: hard - -"@redux-saga/delay-p@npm:^1.2.1": - version: 1.2.1 - resolution: "@redux-saga/delay-p@npm:1.2.1" - dependencies: - "@redux-saga/symbols": ^1.1.3 - checksum: 060533ce8ba6b919caa5d47961eb5d8c1d171519fccd5d44208c26a0b94f3f315c8ea440f1b23af70ed53ebd0445b64567d6a0ac9663a6f703dd8088746ce2b5 - languageName: node - linkType: hard - -"@redux-saga/is@npm:^1.1.3": - version: 1.1.3 - resolution: "@redux-saga/is@npm:1.1.3" - dependencies: - "@redux-saga/symbols": ^1.1.3 - "@redux-saga/types": ^1.2.1 - checksum: 8e24194d365e9a8896fa232a92c09a02a8f881f7a3a0d8004311568762ae3865d40391e4719b789114124f71904160a8942bb285e3fd1611599267bf2ae7d5fc - languageName: node - linkType: hard - -"@redux-saga/symbols@npm:^1.1.3": - version: 1.1.3 - resolution: "@redux-saga/symbols@npm:1.1.3" - checksum: 65a8ea23c1ab7b122823f1a4d957f881d48fa50f90898c26db65cac6524f22e2f337b768dadfa87324925b41e3279ff1ebce1c4141e53dc19e74855167b49b74 - languageName: node - linkType: hard - -"@redux-saga/types@npm:^1.2.1": - version: 1.2.1 - resolution: "@redux-saga/types@npm:1.2.1" - checksum: 754f183bd1bdd589a29d2b976f666e9ee9e6d28e88268538c11f679d019334999676d5425af14d2a99d5c91c0c87a01e7ac1c4d81a656d93dd529df315bbd0c7 - languageName: node - linkType: hard - -"@reduxjs/toolkit@npm:1.9.3": - version: 1.9.3 - resolution: "@reduxjs/toolkit@npm:1.9.3" - dependencies: - immer: ^9.0.16 - redux: ^4.2.0 - redux-thunk: ^2.4.2 - reselect: ^4.1.7 - peerDependencies: - react: ^16.9.0 || ^17.0.0 || ^18 - react-redux: ^7.2.1 || ^8.0.2 - peerDependenciesMeta: - react: - optional: true - react-redux: - optional: true - checksum: d965fc6197fd420e4b8eb714015aa908d4ea214e6e10889cf4521e64ac4f8e0a7de29ee4e8da63b291acc40ac330dd31682334090d54838add73c746dc590650 - languageName: node - linkType: hard - -"@remix-run/router@npm:1.5.0": - version: 1.5.0 - resolution: "@remix-run/router@npm:1.5.0" - checksum: 9c510c174af1553edd1f039ba16e7e3d34e04d53b3bac18814660e31cd0c48297ea4291ff86d0736b560123ebc63ecb62fa525829181d16a8dad15270d6672d7 - languageName: node - linkType: hard - -"@reown/walletkit@npm:1.1.1": - version: 1.1.1 - resolution: "@reown/walletkit@npm:1.1.1" - dependencies: - "@walletconnect/core": 2.17.1 - "@walletconnect/jsonrpc-provider": 1.0.14 - "@walletconnect/jsonrpc-utils": 1.0.8 - "@walletconnect/logger": 2.1.2 - "@walletconnect/sign-client": 2.17.1 - "@walletconnect/types": 2.17.1 - "@walletconnect/utils": 2.17.1 - checksum: 30499034bd6b1a4e6fd357243f3395cda4c22211f90c86f783207485de33e953db36d938b32b25fb45f038376de4c2932e9026cc199016caab4fb8d7842a641d - languageName: node - linkType: hard - -"@repeaterjs/repeater@npm:3.0.4, @repeaterjs/repeater@npm:^3.0.4": - version: 3.0.4 - resolution: "@repeaterjs/repeater@npm:3.0.4" - checksum: cca0db3e802bc26fcce0b4a574074d9956da53bf43094de03c0e4732d05e13441279a92f0b96e2a7a39da50933684947a138c1213406eaafe39cfd4683d6c0df - languageName: node - linkType: hard - -"@resvg/resvg-wasm@npm:2.4.1": - version: 2.4.1 - resolution: "@resvg/resvg-wasm@npm:2.4.1" - checksum: 855aa1e5f1b228b9d2fe87e5d12b628c64b43a513fb67cd78b2eb447684d6b0861543a77ff8b878b21bf89b048ffeff73267685967d9f20cb8ef2c350dac5c81 - languageName: node - linkType: hard - -"@rive-app/canvas@npm:2.19.0": - version: 2.19.0 - resolution: "@rive-app/canvas@npm:2.19.0" - checksum: 27c9df0a0c32639aee6f48209c13ccd05f16d71b379e0ee36aa0434826a1f4b3bc6d880b8d7e996eb4350b78e194ebc0cae24c3978c8cfda4a0361f4282cba22 - languageName: node - linkType: hard - -"@rive-app/react-canvas@npm:4.13.0": - version: 4.13.0 - resolution: "@rive-app/react-canvas@npm:4.13.0" - dependencies: - "@rive-app/canvas": 2.19.0 - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - checksum: 50f049daf52392d5f86bbac5c93aa49d26bf8e7656b1682947f95623e74d4fa06c55fcc552dd3a95f2e9538dfc3d9e643f488ef42c472027420fe3f0faa992fa - languageName: node - linkType: hard - -"@rollup/plugin-babel@npm:^5.2.0": - version: 5.3.1 - resolution: "@rollup/plugin-babel@npm:5.3.1" - dependencies: - "@babel/helper-module-imports": ^7.10.4 - "@rollup/pluginutils": ^3.1.0 - peerDependencies: - "@babel/core": ^7.0.0 - "@types/babel__core": ^7.1.9 - rollup: ^1.20.0||^2.0.0 - peerDependenciesMeta: - "@types/babel__core": - optional: true - checksum: 220d71e4647330f252ef33d5f29700aef2e8284a0b61acfcceb47617a7f96208aa1ed16eae75619424bf08811ede5241e271a6d031f07026dee6b3a2bdcdc638 - languageName: node - linkType: hard - -"@rollup/plugin-node-resolve@npm:^11.2.1": - version: 11.2.1 - resolution: "@rollup/plugin-node-resolve@npm:11.2.1" - dependencies: - "@rollup/pluginutils": ^3.1.0 - "@types/resolve": 1.17.1 - builtin-modules: ^3.1.0 - deepmerge: ^4.2.2 - is-module: ^1.0.0 - resolve: ^1.19.0 - peerDependencies: - rollup: ^1.20.0||^2.0.0 - checksum: 6f3b3ecf9a0596a5db4212984bdeb13bb7612693602407e9457ada075dea5a5f2e4e124c592352cf27066a88b194de9b9a95390149b52cf335d5b5e17b4e265b - languageName: node - linkType: hard - -"@rollup/plugin-replace@npm:^2.4.1": - version: 2.4.2 - resolution: "@rollup/plugin-replace@npm:2.4.2" - dependencies: - "@rollup/pluginutils": ^3.1.0 - magic-string: ^0.25.7 - peerDependencies: - rollup: ^1.20.0 || ^2.0.0 - checksum: b2f1618ee5526d288e2f8ae328dcb326e20e8dc8bd1f60d3e14d6708a5832e4aa44811f7d493f4aed2deeadca86e3b6b0503cd39bf50cfb4b595bb9da027fad0 - languageName: node - linkType: hard - -"@rollup/pluginutils@npm:^3.1.0": - version: 3.1.0 - resolution: "@rollup/pluginutils@npm:3.1.0" - dependencies: - "@types/estree": 0.0.39 - estree-walker: ^1.0.1 - picomatch: ^2.2.2 - peerDependencies: - rollup: ^1.20.0||^2.0.0 - checksum: 8be16e27863c219edbb25a4e6ec2fe0e1e451d9e917b6a43cf2ae5bc025a6b8faaa40f82a6e53b66d0de37b58ff472c6c3d57a83037ae635041f8df959d6d9aa - languageName: node - linkType: hard - -"@rushstack/eslint-patch@npm:1.5.1": - version: 1.5.1 - resolution: "@rushstack/eslint-patch@npm:1.5.1" - checksum: e4c25322312dbaa29e835a7ab4fbac53c8731dd0da65e46646e38945e296429e7fb91c2ef3da5af5d5938d44b0cde1d5290438ebb3dcb015e02b80b5e2530d24 - languageName: node - linkType: hard - -"@rushstack/eslint-patch@npm:^1.1.0": - version: 1.10.4 - resolution: "@rushstack/eslint-patch@npm:1.10.4" - checksum: ec17ac954ed01e9c714e29ae00da29099234a71615d6f61f2da5c7beeef283f5619132114faf9481cb1ca7b4417aed74c05a54d416e4d8facc189bb216d49066 - languageName: node - linkType: hard - -"@safe-global/safe-apps-provider@npm:0.18.1": - version: 0.18.1 - resolution: "@safe-global/safe-apps-provider@npm:0.18.1" - dependencies: - "@safe-global/safe-apps-sdk": ^8.1.0 - events: ^3.3.0 - checksum: fb77aee24149303a8886f1c23ed35ccd75ed63ed67cdb1dfd5c7160e7744f37c8872feadcfbf6d5712d2de65896a1aaf339dc4afb1fa648f0dddd689ff89183c - languageName: node - linkType: hard - -"@safe-global/safe-apps-sdk@npm:8.1.0, @safe-global/safe-apps-sdk@npm:^8.1.0": - version: 8.1.0 - resolution: "@safe-global/safe-apps-sdk@npm:8.1.0" - dependencies: - "@safe-global/safe-gateway-typescript-sdk": ^3.5.3 - viem: ^1.0.0 - checksum: e9d31ed6d9cd2cd9ed71ef5a0e1f6ecfca9f0c62acb9b86a0ddb1b65a609090f2297c4304591ac0518b266a1bcc88d1dad31b0d05e50c7732accccb65adab754 - languageName: node - linkType: hard - -"@safe-global/safe-gateway-typescript-sdk@npm:^3.5.3": - version: 3.13.2 - resolution: "@safe-global/safe-gateway-typescript-sdk@npm:3.13.2" - checksum: a1689557743b70ce8814974443d28d54d39d73e16ed2f5eeb044740287e38c052af00016278ba6aa0ab8523ad5dec4b79c609e5d192bc8a19434c076210050ed - languageName: node - linkType: hard - -"@scure/base@npm:^1.1.3, @scure/base@npm:~1.2.1": - version: 1.2.1 - resolution: "@scure/base@npm:1.2.1" - checksum: 061e04e4f6ed7bada6cdad4c799e6a82f30dda3f4008895bdb2e556f333f9b41f44dc067d25c064357ed6c012ea9c8be1e7927caf8a083af865b8de27b52370c - languageName: node - linkType: hard - -"@scure/base@npm:~1.1.0, @scure/base@npm:~1.1.2, @scure/base@npm:~1.1.7, @scure/base@npm:~1.1.8": - version: 1.1.9 - resolution: "@scure/base@npm:1.1.9" - checksum: 120820a37dfe9dfe4cab2b7b7460552d08e67dee8057ed5354eb68d8e3440890ae983ce3bee957d2b45684950b454a2b6d71d5ee77c1fd3fddc022e2a510337f - languageName: node - linkType: hard - -"@scure/bip32@npm:1.1.5": - version: 1.1.5 - resolution: "@scure/bip32@npm:1.1.5" - dependencies: - "@noble/hashes": ~1.2.0 - "@noble/secp256k1": ~1.7.0 - "@scure/base": ~1.1.0 - checksum: b08494ab0d2b1efee7226d1b5100db5157ebea22a78bb87126982a76a186cb3048413e8be0ba2622d00d048a20acbba527af730de86c132a77de616eb9907a3b - languageName: node - linkType: hard - -"@scure/bip32@npm:1.3.1": - version: 1.3.1 - resolution: "@scure/bip32@npm:1.3.1" - dependencies: - "@noble/curves": ~1.1.0 - "@noble/hashes": ~1.3.1 - "@scure/base": ~1.1.0 - checksum: 394d65f77a40651eba21a5096da0f4233c3b50d422864751d373fcf142eeedb94a1149f9ab1dbb078086dab2d0bc27e2b1afec8321bf22d4403c7df2fea5bfe2 - languageName: node - linkType: hard - -"@scure/bip32@npm:1.3.2": - version: 1.3.2 - resolution: "@scure/bip32@npm:1.3.2" - dependencies: - "@noble/curves": ~1.2.0 - "@noble/hashes": ~1.3.2 - "@scure/base": ~1.1.2 - checksum: c5ae84fae43490853693b481531132b89e056d45c945fc8b92b9d032577f753dfd79c5a7bbcbf0a7f035951006ff0311b6cf7a389e26c9ec6335e42b20c53157 - languageName: node - linkType: hard - -"@scure/bip32@npm:1.5.0": - version: 1.5.0 - resolution: "@scure/bip32@npm:1.5.0" - dependencies: - "@noble/curves": ~1.6.0 - "@noble/hashes": ~1.5.0 - "@scure/base": ~1.1.7 - checksum: 2e119525cdffccc3aad7ca64aec22df2101233708111dfb551410f82aae85fe14acf39dc87cea1a535adc327451f9c3dea3c6a2dd22b859508025bc46a7a80ce - languageName: node - linkType: hard - -"@scure/bip32@npm:^1.5.0": - version: 1.6.1 - resolution: "@scure/bip32@npm:1.6.1" - dependencies: - "@noble/curves": ~1.8.0 - "@noble/hashes": ~1.7.0 - "@scure/base": ~1.2.1 - checksum: a3a604aab771c425ce2422965b7041fcbaefceb5a77f6c3a9b6a2a1530932dfdc8d8b4e9447164fe14e31969d09f8883e0f29176b07c86b880d23e0f88df3727 - languageName: node - linkType: hard - -"@scure/bip39@npm:1.1.1": - version: 1.1.1 - resolution: "@scure/bip39@npm:1.1.1" - dependencies: - "@noble/hashes": ~1.2.0 - "@scure/base": ~1.1.0 - checksum: fbb594c50696fa9c14e891d872f382e50a3f919b6c96c55ef2fb10c7102c546dafb8f099a62bd114c12a00525b595dcf7381846f383f0ddcedeaa6e210747d2f - languageName: node - linkType: hard - -"@scure/bip39@npm:1.2.1": - version: 1.2.1 - resolution: "@scure/bip39@npm:1.2.1" - dependencies: - "@noble/hashes": ~1.3.0 - "@scure/base": ~1.1.0 - checksum: c5bd6f1328fdbeae2dcdd891825b1610225310e5e62a4942714db51066866e4f7bef242c7b06a1b9dcc8043a4a13412cf5c5df76d3b10aa9e36b82e9b6e3eeaa - languageName: node - linkType: hard - -"@scure/bip39@npm:1.4.0": - version: 1.4.0 - resolution: "@scure/bip39@npm:1.4.0" - dependencies: - "@noble/hashes": ~1.5.0 - "@scure/base": ~1.1.8 - checksum: 211f2c01361993bfe54c0e4949f290224381457c7f76d7cd51d6a983f3f4b6b9f85adfd0e623977d777ed80417a5fe729eb19dd34e657147810a0e58a8e7b9e0 - languageName: node - linkType: hard - -"@scure/bip39@npm:^1.4.0": - version: 1.5.1 - resolution: "@scure/bip39@npm:1.5.1" - dependencies: - "@noble/hashes": ~1.7.0 - "@scure/base": ~1.2.1 - checksum: 3069832465fc5b84602ee73271be22c47a7adb8459538b8121ad384e631f466703d7005b927db8b5554d70981e8c96bb99d5761cc45622786bfc555d46625e3e - languageName: node - linkType: hard - -"@segment/loosely-validate-event@npm:^2.0.0": - version: 2.0.0 - resolution: "@segment/loosely-validate-event@npm:2.0.0" - dependencies: - component-type: ^1.2.1 - join-component: ^1.1.0 - checksum: 8c4aacc903fb717619b69ca7eecf8d4a7b928661b0e835c9cd98f1b858a85ce62c348369ad9a52cb2df8df02578c0525a73fce4c69a42ac414d9554cc6be7117 - languageName: node - linkType: hard - -"@sentry-internal/tracing@npm:7.45.0": - version: 7.45.0 - resolution: "@sentry-internal/tracing@npm:7.45.0" - dependencies: - "@sentry/core": 7.45.0 - "@sentry/types": 7.45.0 - "@sentry/utils": 7.45.0 - tslib: ^1.9.3 - checksum: 64cb8ddca80d4c3a8b7d7fab8ebfc38e5eeb56753b72fc7fbcc6003a190f0492fe89075f7e7d7a2621f4746c52613c79eec2695368cc44da134b0be42bd0f71b - languageName: node - linkType: hard - -"@sentry-internal/tracing@npm:7.80.0": - version: 7.80.0 - resolution: "@sentry-internal/tracing@npm:7.80.0" - dependencies: - "@sentry/core": 7.80.0 - "@sentry/types": 7.80.0 - "@sentry/utils": 7.80.0 - checksum: a2f341e1072fc08c7017e1120abea84b58b27926d4d621a0f74c5ac62a013199d80154ca381904556b279854226a0e13ef0e39b7117c6696eefe6ea0aca83c80 - languageName: node - linkType: hard - -"@sentry/browser@npm:7.80.0": - version: 7.80.0 - resolution: "@sentry/browser@npm:7.80.0" - dependencies: - "@sentry-internal/tracing": 7.80.0 - "@sentry/core": 7.80.0 - "@sentry/replay": 7.80.0 - "@sentry/types": 7.80.0 - "@sentry/utils": 7.80.0 - checksum: a64061e50be53ac25043ae3214d6fc3d31b37f5fc4809fe3d8f8bca05085d77fe34d297930a3a85de5d779df59dcc090be4193a3de2550e0e9b0eda3140f9a6b - languageName: node - linkType: hard - -"@sentry/core@npm:7.45.0": - version: 7.45.0 - resolution: "@sentry/core@npm:7.45.0" - dependencies: - "@sentry/types": 7.45.0 - "@sentry/utils": 7.45.0 - tslib: ^1.9.3 - checksum: c0453edf833b7ed86bcde6d341090bd3f4cfdb08b50a5e96cbe9d240d3955ea90c4af5550af37f95e8b987c13fa178cb004dd7bea9071145e63ce0dc7c635ec6 - languageName: node - linkType: hard - -"@sentry/core@npm:7.80.0": - version: 7.80.0 - resolution: "@sentry/core@npm:7.80.0" - dependencies: - "@sentry/types": 7.80.0 - "@sentry/utils": 7.80.0 - checksum: 5b47929febbc517c4f9727abc73dd0d9fa0b21de3185eb21486a07409f27b84af9a58919d1341acda804e117f57aa9946187b35215edb8ac50745f9274edd5ae - languageName: node - linkType: hard - -"@sentry/node@npm:7.45.0": - version: 7.45.0 - resolution: "@sentry/node@npm:7.45.0" - dependencies: - "@sentry-internal/tracing": 7.45.0 - "@sentry/core": 7.45.0 - "@sentry/types": 7.45.0 - "@sentry/utils": 7.45.0 - cookie: ^0.4.1 - https-proxy-agent: ^5.0.0 - lru_map: ^0.3.3 - tslib: ^1.9.3 - checksum: cbe52b335419271d1e0926b28c476c590b9fb576914ed56af7b123f061d219b093a2bf1bcc9ac4131af891beb9286f5084e13575cfede9947dfa229d47a23065 - languageName: node - linkType: hard - -"@sentry/react@npm:7.80.0": - version: 7.80.0 - resolution: "@sentry/react@npm:7.80.0" - dependencies: - "@sentry/browser": 7.80.0 - "@sentry/types": 7.80.0 - "@sentry/utils": 7.80.0 - hoist-non-react-statics: ^3.3.2 - peerDependencies: - react: 15.x || 16.x || 17.x || 18.x - checksum: efa86456252ff6da4a2d143936857c626ba1e501d482fb1aeecac545dc5747623dce46b5ccff80adf7191628a061c3f496d80fdaf720d9eded05347a3faa29a7 - languageName: node - linkType: hard - -"@sentry/replay@npm:7.80.0": - version: 7.80.0 - resolution: "@sentry/replay@npm:7.80.0" - dependencies: - "@sentry-internal/tracing": 7.80.0 - "@sentry/core": 7.80.0 - "@sentry/types": 7.80.0 - "@sentry/utils": 7.80.0 - checksum: 9d367486bfc3b95a25be9264ff4b166642d468b2dcf272adb5f2f405e54573baca903d292a18fbd3f7c7be8cfc049e36a8c91ff39264eb413a74ebe7301cdef3 - languageName: node - linkType: hard - -"@sentry/types@npm:7.45.0": - version: 7.45.0 - resolution: "@sentry/types@npm:7.45.0" - checksum: feb7de474f486f52f8f2594dc0559872c51c770b8511d90383eb4aadac8dffc2ddfb8fd7747cfd1486e629eba47bc7c9fae72fdad28cddaaeaf8dd1a52fabdfa - languageName: node - linkType: hard - -"@sentry/utils@npm:7.45.0": - version: 7.45.0 - resolution: "@sentry/utils@npm:7.45.0" - dependencies: - "@sentry/types": 7.45.0 - tslib: ^1.9.3 - checksum: 5d4d2ab4fe85d7231a35859cbeecc3d0c95368c818f15d8d6332f8c57604a67c0e12d5a81c23e5dcb1c53b4e44faf753028592792eb98e4af1440ee375b2292e - languageName: node - linkType: hard - -"@sentry/utils@npm:7.80.0": - version: 7.80.0 - resolution: "@sentry/utils@npm:7.80.0" - dependencies: - "@sentry/types": 7.80.0 - checksum: 14442040f97e5dffbb3dd2f3903e954a68b24d9f60dbfd7a2b3a475859ecee8ac1d0adcab1037a423f854d4b3708cd115a8c0514ed2fe10cb9f86b663c765e0a - languageName: node - linkType: hard - -"@shopify/flash-list@npm:1.7.1": - version: 1.7.1 - resolution: "@shopify/flash-list@npm:1.7.1" - dependencies: - recyclerlistview: 4.2.1 - tslib: 2.6.3 - peerDependencies: - "@babel/runtime": "*" - react: "*" - react-native: "*" - checksum: 82235ac12043dd9da0bc58ab4be76d01f0496f6c769167f5139854278c5a680154d745e5226b0176cd28d1d2351fd9d3f484ed35c44c3b6ee18dbcb075826451 - languageName: node - linkType: hard - -"@shopify/react-native-performance-navigation@npm:3.0.0": - version: 3.0.0 - resolution: "@shopify/react-native-performance-navigation@npm:3.0.0" - dependencies: - lodash.isequal: ^4.5.0 - peerDependencies: - "@babel/runtime": "*" - "@react-navigation/core": ^6.2.1 - "@react-navigation/native": ^6.0.10 - "@react-navigation/stack": ^6.2.1 - "@shopify/react-native-performance": ^2.0.0 - react: "*" - react-native: "*" - checksum: 7f70b3bd875a3651d5742b2cb3c3023b04a8c9e8dd730619ccbdd50b5f9b24a44dce2d3e44804946647c9b7fbed79865b05367cd696fc18a8130cb8c1b8dc854 - languageName: node - linkType: hard - -"@shopify/react-native-performance@npm:4.1.2": - version: 4.1.2 - resolution: "@shopify/react-native-performance@npm:4.1.2" - peerDependencies: - "@babel/runtime": "*" - react: "*" - react-native: "*" - checksum: 9577aa31266250d9ff72d881301eef1b63be899aca4e8b97c8f02d954c618d16be87cac93c4288a941d754df2f59148f944e03bd1affc641c4b4f2e2a3c767a7 - languageName: node - linkType: hard - -"@shopify/react-native-performance@patch:@shopify/react-native-performance@npm%3A4.1.2#./.yarn/patches/@shopify-react-native-performance-npm-4.1.2-ec1fcc7507.patch::locator=universe%40workspace%3A.": - version: 4.1.2 - resolution: "@shopify/react-native-performance@patch:@shopify/react-native-performance@npm%3A4.1.2#./.yarn/patches/@shopify-react-native-performance-npm-4.1.2-ec1fcc7507.patch::version=4.1.2&hash=e18610&locator=universe%40workspace%3A." - peerDependencies: - "@babel/runtime": "*" - react: "*" - react-native: "*" - checksum: 4db0837c7a2918bcf1babd8b4615cf0c9b7e1ed2a750dea959ee3173f9242edf880ab86664c775750e6ff9ebb8278e1e9f1d864eabd62e05894013b48fee68c6 - languageName: node - linkType: hard - -"@shopify/react-native-skia@npm:1.6.0": - version: 1.6.0 - resolution: "@shopify/react-native-skia@npm:1.6.0" - dependencies: - canvaskit-wasm: 0.39.1 - react-reconciler: 0.27.0 - peerDependencies: - react: ">=18.0" - react-native: ">=0.64" - react-native-reanimated: ">=2.0.0" - peerDependenciesMeta: - react-native: - optional: true - react-native-reanimated: - optional: true - bin: - setup-skia-web: ./scripts/setup-canvaskit.js - checksum: 88abc446541a2310143c346c29ab7dedd5b3b21bc85f3d54db35c14c96c084c70d7c487bc98ab4db510d8690f16ac68d62a2c022ebc6389a29eafb8f0089b4eb - languageName: node - linkType: hard - -"@shuding/opentype.js@npm:1.4.0-beta.0": - version: 1.4.0-beta.0 - resolution: "@shuding/opentype.js@npm:1.4.0-beta.0" - dependencies: - fflate: ^0.7.3 - string.prototype.codepointat: ^0.2.1 - bin: - ot: bin/ot - checksum: af3478c40c068c7f6b6050b274a10837fcd1417c072b6af2b9d4fa48b8efe0bc93ec4b5f80b186678672f7d293027151389c66a4c5a156b48b810b8e8f3f5cdf - languageName: node - linkType: hard - -"@sideway/address@npm:^4.1.3": - version: 4.1.4 - resolution: "@sideway/address@npm:4.1.4" - dependencies: - "@hapi/hoek": ^9.0.0 - checksum: b9fca2a93ac2c975ba12e0a6d97853832fb1f4fb02393015e012b47fa916a75ca95102d77214b2a29a2784740df2407951af8c5dde054824c65577fd293c4cdb - languageName: node - linkType: hard - -"@sideway/formula@npm:3.0.1": - version: 3.0.1 - resolution: "@sideway/formula@npm:3.0.1" - checksum: e4beeebc9dbe2ff4ef0def15cec0165e00d1612e3d7cea0bc9ce5175c3263fc2c818b679bd558957f49400ee7be9d4e5ac90487e1625b4932e15c4aa7919c57a - languageName: node - linkType: hard - -"@sideway/pinpoint@npm:^2.0.0": - version: 2.0.0 - resolution: "@sideway/pinpoint@npm:2.0.0" - checksum: 0f4491e5897fcf5bf02c46f5c359c56a314e90ba243f42f0c100437935daa2488f20482f0f77186bd6bf43345095a95d8143ecf8b1f4d876a7bc0806aba9c3d2 - languageName: node - linkType: hard - -"@simplewebauthn/browser@npm:11.0.0": - version: 11.0.0 - resolution: "@simplewebauthn/browser@npm:11.0.0" - dependencies: - "@simplewebauthn/types": ^11.0.0 - checksum: 0c1c7d24bb3cf074596591e023d08faa8f79d4a1875ef2a0279873014f3c5bc91b0def7d8670f237f9720cfd9833c87f5fafa5ab4c13e77f1854018930d1bef2 - languageName: node - linkType: hard - -"@simplewebauthn/types@npm:11.0.0, @simplewebauthn/types@npm:^11.0.0": - version: 11.0.0 - resolution: "@simplewebauthn/types@npm:11.0.0" - checksum: 6fec4393a15393e5c1dfe7e9f3c924143c0616b637dd25bfd70b59fb0f24f6f4e2c9822f588a15f4a3415d476c2e8f5a22969fa8223b5aabe938fb6c5fbf2808 - languageName: node - linkType: hard - -"@sinclair/typebox@npm:^0.24.1": - version: 0.24.51 - resolution: "@sinclair/typebox@npm:0.24.51" - checksum: fd0d855e748ef767eb19da1a60ed0ab928e91e0f358c1dd198d600762c0015440b15755e96d1176e2a0db7e09c6a64ed487828ee10dd0c3e22f61eb09c478cd0 - languageName: node - linkType: hard - -"@sinclair/typebox@npm:^0.27.8": - version: 0.27.8 - resolution: "@sinclair/typebox@npm:0.27.8" - checksum: 00bd7362a3439021aa1ea51b0e0d0a0e8ca1351a3d54c606b115fdcc49b51b16db6e5f43b4fe7a28c38688523e22a94d49dd31168868b655f0d4d50f032d07a1 - languageName: node - linkType: hard - -"@sindresorhus/is@npm:^0.14.0": - version: 0.14.0 - resolution: "@sindresorhus/is@npm:0.14.0" - checksum: 971e0441dd44ba3909b467219a5e242da0fc584048db5324cfb8048148fa8dcc9d44d71e3948972c4f6121d24e5da402ef191420d1266a95f713bb6d6e59c98a - languageName: node - linkType: hard - -"@sindresorhus/is@npm:^4.0.0": - version: 4.6.0 - resolution: "@sindresorhus/is@npm:4.6.0" - checksum: 83839f13da2c29d55c97abc3bc2c55b250d33a0447554997a85c539e058e57b8da092da396e252b11ec24a0279a0bed1f537fa26302209327060643e327f81d2 - languageName: node - linkType: hard - -"@sinonjs/commons@npm:^2.0.0": - version: 2.0.0 - resolution: "@sinonjs/commons@npm:2.0.0" - dependencies: - type-detect: 4.0.8 - checksum: 5023ba17edf2b85ed58262313b8e9b59e23c6860681a9af0200f239fe939e2b79736d04a260e8270ddd57196851dde3ba754d7230be5c5234e777ae2ca8af137 - languageName: node - linkType: hard - -"@sinonjs/fake-timers@npm:^10.0.2": - version: 10.0.2 - resolution: "@sinonjs/fake-timers@npm:10.0.2" - dependencies: - "@sinonjs/commons": ^2.0.0 - checksum: c62aa98e7cefda8dedc101ce227abc888dc46b8ff9706c5f0a8dfd9c3ada97d0a5611384738d9ba0b26b59f99c2ba24efece8e779bb08329e9e87358fa309824 - languageName: node - linkType: hard - -"@slack/logger@npm:^4.0.0": - version: 4.0.0 - resolution: "@slack/logger@npm:4.0.0" - dependencies: - "@types/node": ">=18.0.0" - checksum: dc79e9d2032c4bf9ce01d96cc72882f003dd376d036f172d4169662cfc2c9b384a80d5546b06021578dd473e7059f064303f0ba851eeb153387f2081a1e3062e - languageName: node - linkType: hard - -"@slack/types@npm:^2.9.0": - version: 2.14.0 - resolution: "@slack/types@npm:2.14.0" - checksum: fbef74d50d0de8f16125f7178bd2e664a69eeefd827b09c6f78153957278fc4400049685c756076e7dbcabd04c22730ac783bcc5d36fd588c7749d35f02c2afd - languageName: node - linkType: hard - -"@slack/web-api@npm:^7.6.0": - version: 7.8.0 - resolution: "@slack/web-api@npm:7.8.0" - dependencies: - "@slack/logger": ^4.0.0 - "@slack/types": ^2.9.0 - "@types/node": ">=18.0.0" - "@types/retry": 0.12.0 - axios: ^1.7.8 - eventemitter3: ^5.0.1 - form-data: ^4.0.0 - is-electron: 2.2.2 - is-stream: ^2 - p-queue: ^6 - p-retry: ^4 - retry: ^0.13.1 - checksum: d76fcb6cfe8a8ebdaf71aaee7dfef54f3ce4fb5958f9f841bcba095097349f649c47e5e79adbaabbd4051fe0c8d6d96445adeeab3d67416c161ae20868f637f0 - languageName: node - linkType: hard - -"@slack/webhook@npm:^7.0.1": - version: 7.0.4 - resolution: "@slack/webhook@npm:7.0.4" - dependencies: - "@slack/types": ^2.9.0 - "@types/node": ">=18.0.0" - axios: ^1.7.8 - checksum: 2caa7b26d87a87c8ebc3f19044a308ad962392c26d60a6ab26f74f60e7faec610cf362680a3532198a77fcb7e970c9240a1c015ac94d2598f639ad048d9d81b4 - languageName: node - linkType: hard - -"@smithy/abort-controller@npm:^3.1.1": - version: 3.1.1 - resolution: "@smithy/abort-controller@npm:3.1.1" - dependencies: - "@smithy/types": ^3.3.0 - tslib: ^2.6.2 - checksum: 7b7497f49d58787cad858f8c5ea9931ccd44d39536db4abdd531a5abf37784469522e41d9ad1d541892caa0ed3bea750447809a0a18f4689a9543d672aa61d48 - languageName: node - linkType: hard - -"@smithy/config-resolver@npm:^3.0.5": - version: 3.0.5 - resolution: "@smithy/config-resolver@npm:3.0.5" - dependencies: - "@smithy/node-config-provider": ^3.1.4 - "@smithy/types": ^3.3.0 - "@smithy/util-config-provider": ^3.0.0 - "@smithy/util-middleware": ^3.0.3 - tslib: ^2.6.2 - checksum: 96895ae0622a229655fa08f009d29a20157043020125014e84cb5ca33a10171c9724c309491214c2422d9c4c6681e7f5ec5f7faa8f45e11250449cf07f3552ec - languageName: node - linkType: hard - -"@smithy/core@npm:^2.2.7": - version: 2.2.8 - resolution: "@smithy/core@npm:2.2.8" - dependencies: - "@smithy/middleware-endpoint": ^3.0.5 - "@smithy/middleware-retry": ^3.0.11 - "@smithy/middleware-serde": ^3.0.3 - "@smithy/protocol-http": ^4.0.4 - "@smithy/smithy-client": ^3.1.9 - "@smithy/types": ^3.3.0 - "@smithy/util-middleware": ^3.0.3 - tslib: ^2.6.2 - checksum: c6dbf5e7ce509779e57889a67036e67f7c9ba39ce93eac087162997105d4afd14b34a5b145ffdcf2c56d1afa65661fc0b42705705c140a79cf0cea78f7739919 - languageName: node - linkType: hard - -"@smithy/credential-provider-imds@npm:^3.1.4": - version: 3.1.4 - resolution: "@smithy/credential-provider-imds@npm:3.1.4" - dependencies: - "@smithy/node-config-provider": ^3.1.4 - "@smithy/property-provider": ^3.1.3 - "@smithy/types": ^3.3.0 - "@smithy/url-parser": ^3.0.3 - tslib: ^2.6.2 - checksum: c75a653970f5e7b888dddbcb916fadd2c45fe59b1a776de9b44f39771b3941fb536684d2407aef88ce376afa6024f38759290db966b07e9213c49a9427ea4a7c - languageName: node - linkType: hard - -"@smithy/eventstream-codec@npm:^3.1.2": - version: 3.1.2 - resolution: "@smithy/eventstream-codec@npm:3.1.2" - dependencies: - "@aws-crypto/crc32": 5.2.0 - "@smithy/types": ^3.3.0 - "@smithy/util-hex-encoding": ^3.0.0 - tslib: ^2.6.2 - checksum: b0c836acbf59b57a7e2ef948a54bd441d11b75d70f1c334723c27fce1ab0ff93ea9f936976b754272b5e90413b5a169c60b1df7ecfd7d061ebaae8d5cc067d94 - languageName: node - linkType: hard - -"@smithy/eventstream-serde-browser@npm:^3.0.4": - version: 3.0.5 - resolution: "@smithy/eventstream-serde-browser@npm:3.0.5" - dependencies: - "@smithy/eventstream-serde-universal": ^3.0.4 - "@smithy/types": ^3.3.0 - tslib: ^2.6.2 - checksum: 14e8a2027745e7a1ad261068e792e4a660043ce53fefc5f564b38b841ba02d40992b38fbd2357e762f0a1ecb658df3bbf23cf5ef33c3ec2488d316be95b61b9e - languageName: node - linkType: hard - -"@smithy/eventstream-serde-config-resolver@npm:^3.0.3": - version: 3.0.3 - resolution: "@smithy/eventstream-serde-config-resolver@npm:3.0.3" - dependencies: - "@smithy/types": ^3.3.0 - tslib: ^2.6.2 - checksum: c61780aa0ad8c479618d0b3fcb2b42f1f9a74dcf814dba08305107ed1f088f56aa1c346db9c72439ff18617f31b9c59c6895060e4c9765c81d759150a22674af - languageName: node - linkType: hard - -"@smithy/eventstream-serde-node@npm:^3.0.4": - version: 3.0.4 - resolution: "@smithy/eventstream-serde-node@npm:3.0.4" - dependencies: - "@smithy/eventstream-serde-universal": ^3.0.4 - "@smithy/types": ^3.3.0 - tslib: ^2.6.2 - checksum: 0a75b184d95ab8c08efd93bf32c5fd9d735b5879df556599bd2ab78f23e3f77452e597bbdd42586c9bbedcc2b0b7683de4c816db739c19a2ebd62a34096ca86d - languageName: node - linkType: hard - -"@smithy/eventstream-serde-universal@npm:^3.0.4": - version: 3.0.4 - resolution: "@smithy/eventstream-serde-universal@npm:3.0.4" - dependencies: - "@smithy/eventstream-codec": ^3.1.2 - "@smithy/types": ^3.3.0 - tslib: ^2.6.2 - checksum: 8463403ca4caf4ad48dba89b126f394439a289c9095ce6361c1f186c6021c1cd8ea402d1ce06b7284069c3415091ae4d802f66ded1b89e9da9d4c255b8402668 - languageName: node - linkType: hard - -"@smithy/fetch-http-handler@npm:^3.2.2": - version: 3.2.2 - resolution: "@smithy/fetch-http-handler@npm:3.2.2" - dependencies: - "@smithy/protocol-http": ^4.0.4 - "@smithy/querystring-builder": ^3.0.3 - "@smithy/types": ^3.3.0 - "@smithy/util-base64": ^3.0.0 - tslib: ^2.6.2 - checksum: ec7f0d648d0bb2e674ca6fda040357c462833825bba6d2b1549de4b6a8d0ffdd17d6effb2dbd56241b58e76f3e7c1afba5f321f3d592c39bf5007b89e9197875 - languageName: node - linkType: hard - -"@smithy/hash-node@npm:^3.0.3": - version: 3.0.3 - resolution: "@smithy/hash-node@npm:3.0.3" - dependencies: - "@smithy/types": ^3.3.0 - "@smithy/util-buffer-from": ^3.0.0 - "@smithy/util-utf8": ^3.0.0 - tslib: ^2.6.2 - checksum: 203a3581bec5373e63d42e03f62129022f03d17390e9358a4e25fc1d44c43962ea80ab5bcbb91605e3025e22136bed059665a3b16835f66316f43ed391df9548 - languageName: node - linkType: hard - -"@smithy/invalid-dependency@npm:^3.0.3": - version: 3.0.3 - resolution: "@smithy/invalid-dependency@npm:3.0.3" - dependencies: - "@smithy/types": ^3.3.0 - tslib: ^2.6.2 - checksum: 459b4ae4e47595e8a675ff2e8bfea7f58a41f77138416ea310c89e29312e08963a701cdc354324da9dd578a7995158b4421695365070d74b0276ddff7f701bba - languageName: node - linkType: hard - -"@smithy/is-array-buffer@npm:^2.2.0": - version: 2.2.0 - resolution: "@smithy/is-array-buffer@npm:2.2.0" - dependencies: - tslib: ^2.6.2 - checksum: cd12c2e27884fec89ca8966d33c9dc34d3234efe89b33a9b309c61ebcde463e6f15f6a02d31d4fddbfd6e5904743524ca5b95021b517b98fe10957c2da0cd5fc - languageName: node - linkType: hard - -"@smithy/is-array-buffer@npm:^3.0.0": - version: 3.0.0 - resolution: "@smithy/is-array-buffer@npm:3.0.0" - dependencies: - tslib: ^2.6.2 - checksum: ce7440fcb1ce3c46722cff11c33e2f62a9df86d74fa2054a8e6b540302a91211cf6e4e3b1b7aac7030c6c8909158c1b6867c394201fa8afc6b631979956610e5 - languageName: node - linkType: hard - -"@smithy/middleware-content-length@npm:^3.0.4": - version: 3.0.4 - resolution: "@smithy/middleware-content-length@npm:3.0.4" - dependencies: - "@smithy/protocol-http": ^4.0.4 - "@smithy/types": ^3.3.0 - tslib: ^2.6.2 - checksum: 462ed3511b5cf849d272c4a6e1a1b72f6f676252e208ebd652528e3d45f132859cbcbcf9e8cb127680fbbc587ab35965225fd7421a3711f4d125738b3e7f528e - languageName: node - linkType: hard - -"@smithy/middleware-endpoint@npm:^3.0.5": - version: 3.0.5 - resolution: "@smithy/middleware-endpoint@npm:3.0.5" - dependencies: - "@smithy/middleware-serde": ^3.0.3 - "@smithy/node-config-provider": ^3.1.4 - "@smithy/shared-ini-file-loader": ^3.1.4 - "@smithy/types": ^3.3.0 - "@smithy/url-parser": ^3.0.3 - "@smithy/util-middleware": ^3.0.3 - tslib: ^2.6.2 - checksum: 4ab0272efd47baa528a04c5413fb224e41be144902680239fffc83cf1fb7e9b5342e8b627a4149136efa2b29baacc84baa4dbcef5fd2fa55c70e169c7f4ba750 - languageName: node - linkType: hard - -"@smithy/middleware-retry@npm:^3.0.10, @smithy/middleware-retry@npm:^3.0.11": - version: 3.0.11 - resolution: "@smithy/middleware-retry@npm:3.0.11" - dependencies: - "@smithy/node-config-provider": ^3.1.4 - "@smithy/protocol-http": ^4.0.4 - "@smithy/service-error-classification": ^3.0.3 - "@smithy/smithy-client": ^3.1.9 - "@smithy/types": ^3.3.0 - "@smithy/util-middleware": ^3.0.3 - "@smithy/util-retry": ^3.0.3 - tslib: ^2.6.2 - uuid: ^9.0.1 - checksum: 4061f4823c949f5e9920b4840cfbc1472f38bac05cefc511a7731afa9372dab0fb238f48b6ce7a8d4d24fa966fa80f9eb7165d29fd90fd3854d72006f612d662 - languageName: node - linkType: hard - -"@smithy/middleware-serde@npm:^3.0.3": - version: 3.0.3 - resolution: "@smithy/middleware-serde@npm:3.0.3" - dependencies: - "@smithy/types": ^3.3.0 - tslib: ^2.6.2 - checksum: 6c633bb8957e078d480888bd33d5a8c269a483a1358c2b28c62daecfd442c711c509d9e69302e6b19fc298139ee67cdda63a604e7da0e4ef9005117d8e0897cc - languageName: node - linkType: hard - -"@smithy/middleware-stack@npm:^3.0.3": - version: 3.0.3 - resolution: "@smithy/middleware-stack@npm:3.0.3" - dependencies: - "@smithy/types": ^3.3.0 - tslib: ^2.6.2 - checksum: f4a450e2ebca0a8a3b4e1bbfad7d7e9c45edccbe1c984a22f2228092a526120748365e8964b478357249675d8bbc28fdaa8a4a19643a3c1d86bd74e1499327c5 - languageName: node - linkType: hard - -"@smithy/node-config-provider@npm:^3.1.4": - version: 3.1.4 - resolution: "@smithy/node-config-provider@npm:3.1.4" - dependencies: - "@smithy/property-provider": ^3.1.3 - "@smithy/shared-ini-file-loader": ^3.1.4 - "@smithy/types": ^3.3.0 - tslib: ^2.6.2 - checksum: 7ea4e7cea93ab154ab89a9d6b2453c8f96b96db18883070d287bc5fa9cfd10091bb00006a15bb7e6ed25810fd1a133d458e45310a8eaa1727a55d4ce2be3ba09 - languageName: node - linkType: hard - -"@smithy/node-http-handler@npm:^3.1.3": - version: 3.1.3 - resolution: "@smithy/node-http-handler@npm:3.1.3" - dependencies: - "@smithy/abort-controller": ^3.1.1 - "@smithy/protocol-http": ^4.0.4 - "@smithy/querystring-builder": ^3.0.3 - "@smithy/types": ^3.3.0 - tslib: ^2.6.2 - checksum: 2e07687544dc77714912467268db820cb76bffcb0f4cdb5d5f12b05561d8baedb98cb478ceb4e247151e2d7d30af7de88095f9b96037e56f58a371b2a7bab85e - languageName: node - linkType: hard - -"@smithy/property-provider@npm:^2.0.12": - version: 2.2.0 - resolution: "@smithy/property-provider@npm:2.2.0" - dependencies: - "@smithy/types": ^2.12.0 - tslib: ^2.6.2 - checksum: 8d257cbc5222baf6706e288c3b51196588f135878141f8af76fcb3f0abafc027ed46cf4bb938266d1906111175082ee85f73806d5a2b1c929aee16ec8b5283e6 - languageName: node - linkType: hard - -"@smithy/property-provider@npm:^3.1.3": - version: 3.1.3 - resolution: "@smithy/property-provider@npm:3.1.3" - dependencies: - "@smithy/types": ^3.3.0 - tslib: ^2.6.2 - checksum: 37a3d92267a2a32c2cc17fd1f0ab2b336f75fb7807db88f6194efede9d6a66068658a7effb7773451404fca990924393dbbf3d57e2aca67ef2e489a85666e225 - languageName: node - linkType: hard - -"@smithy/protocol-http@npm:^4.0.4": - version: 4.0.4 - resolution: "@smithy/protocol-http@npm:4.0.4" - dependencies: - "@smithy/types": ^3.3.0 - tslib: ^2.6.2 - checksum: a0155381d24f02d279f0b895c179e98af0a6dd1c8a1765666c856f0bca41aa7d4a245a228bc17ddde5f68c631ffe8684440051416757169074dfa5c7a7087e94 - languageName: node - linkType: hard - -"@smithy/querystring-builder@npm:^3.0.3": - version: 3.0.3 - resolution: "@smithy/querystring-builder@npm:3.0.3" - dependencies: - "@smithy/types": ^3.3.0 - "@smithy/util-uri-escape": ^3.0.0 - tslib: ^2.6.2 - checksum: 5c46c620d87f9b4e67b8eb543667b0160fb05bbec01d62d45adb94305369dca9e82daba47d81e840fdc399fa47f9b5930ce668d65fe83ee278a1b27d59d0b5d3 - languageName: node - linkType: hard - -"@smithy/querystring-parser@npm:^3.0.3": - version: 3.0.3 - resolution: "@smithy/querystring-parser@npm:3.0.3" - dependencies: - "@smithy/types": ^3.3.0 - tslib: ^2.6.2 - checksum: 1de11cbc4325578b243a0e3e89b46371f4705d3df41ea51b37e8efa655d3b75253180b0fca9ceed8b3955a2d458689f551cd24fd904d0f65647c62c6b08795bf - languageName: node - linkType: hard - -"@smithy/service-error-classification@npm:^2.1.5": - version: 2.1.5 - resolution: "@smithy/service-error-classification@npm:2.1.5" - dependencies: - "@smithy/types": ^2.12.0 - checksum: 00ac54110a258c7a47c62d4f655d4998bd40e5adb47e10281b28df7a585f2f1e960dc35325eac006636280e7fb2b81dbeb32b89e08bac87acc136c4d29a4dc53 - languageName: node - linkType: hard - -"@smithy/service-error-classification@npm:^3.0.3": - version: 3.0.3 - resolution: "@smithy/service-error-classification@npm:3.0.3" - dependencies: - "@smithy/types": ^3.3.0 - checksum: 5bef710f5698c929c97865cba41f36b0c59100b9a1c4478a2d47caeb5e3a1a18077b870b365efaa45c94666f2075bc8978f7a6e8b964afbba3a4e490eb6c13eb - languageName: node - linkType: hard - -"@smithy/shared-ini-file-loader@npm:^3.1.4": - version: 3.1.4 - resolution: "@smithy/shared-ini-file-loader@npm:3.1.4" - dependencies: - "@smithy/types": ^3.3.0 - tslib: ^2.6.2 - checksum: c5321635f3be34e424009fc9045454a9ceec543ec20b3b9719bf3a48bbfc03b794f4545546e9c2dcb0a987de2ca5ff8999df9bf7c166c6fc7685c1fa1f068bc1 - languageName: node - linkType: hard - -"@smithy/signature-v4@npm:^4.0.0": - version: 4.0.0 - resolution: "@smithy/signature-v4@npm:4.0.0" - dependencies: - "@smithy/is-array-buffer": ^3.0.0 - "@smithy/types": ^3.3.0 - "@smithy/util-hex-encoding": ^3.0.0 - "@smithy/util-middleware": ^3.0.3 - "@smithy/util-uri-escape": ^3.0.0 - "@smithy/util-utf8": ^3.0.0 - tslib: ^2.6.2 - checksum: 9cebd322cbfbc8794f4a21af1152d343c4ec431d0732985e6067d3d0038d2ae970e5f12cd4862b1380a3cd1d86230bdf90a171a93d3cd82b8cbe140a4d3685b0 - languageName: node - linkType: hard - -"@smithy/smithy-client@npm:^3.1.8, @smithy/smithy-client@npm:^3.1.9": - version: 3.1.9 - resolution: "@smithy/smithy-client@npm:3.1.9" - dependencies: - "@smithy/middleware-endpoint": ^3.0.5 - "@smithy/middleware-stack": ^3.0.3 - "@smithy/protocol-http": ^4.0.4 - "@smithy/types": ^3.3.0 - "@smithy/util-stream": ^3.1.1 - tslib: ^2.6.2 - checksum: 2d030ca4dd3e0767e30d3bd78d7eaea19ec96f8b03a8e15b61494ea4719f63d6f25290d2d4269fdbcc2df1912ece1aa8a4b92b5f2c2f3d3c75628002ce0b5b6a - languageName: node - linkType: hard - -"@smithy/types@npm:^2.12.0": - version: 2.12.0 - resolution: "@smithy/types@npm:2.12.0" - dependencies: - tslib: ^2.6.2 - checksum: 2dd93746624d87afbf51c22116fc69f82e95004b78cf681c4a283d908155c22a2b7a3afbd64a3aff7deefb6619276f186e212422ad200df3b42c32ef5330374e - languageName: node - linkType: hard - -"@smithy/types@npm:^3.3.0": - version: 3.3.0 - resolution: "@smithy/types@npm:3.3.0" - dependencies: - tslib: ^2.6.2 - checksum: 29bb5f83c41e32f8d4094a2aba2d3dfbd763ab5943784a700f3fa22df0dcf0ccac1b1907f7a87fbb9f6f2269fcd4750524bcb48f892249e200ffe397c0981309 - languageName: node - linkType: hard - -"@smithy/url-parser@npm:^3.0.3": - version: 3.0.3 - resolution: "@smithy/url-parser@npm:3.0.3" - dependencies: - "@smithy/querystring-parser": ^3.0.3 - "@smithy/types": ^3.3.0 - tslib: ^2.6.2 - checksum: 86b4bc8e6c176b56076c30233ca4cfeb98d162fe27a348ddfda5f163ce7d173b8e684aa26202bbf4e0b5695b0ad43c0cb40170ca6793652d0ea6edb00443c036 - languageName: node - linkType: hard - -"@smithy/util-base64@npm:^3.0.0": - version: 3.0.0 - resolution: "@smithy/util-base64@npm:3.0.0" - dependencies: - "@smithy/util-buffer-from": ^3.0.0 - "@smithy/util-utf8": ^3.0.0 - tslib: ^2.6.2 - checksum: 413f26046a7e98b2661a078f218a8d040c820fc5a02f5e364aff58c3957e28fde1ac4048c2ebbad5d87b9da4b9aa98a8d4a7fb0d2ce97def33738bd7d8d79aa0 - languageName: node - linkType: hard - -"@smithy/util-body-length-browser@npm:^3.0.0": - version: 3.0.0 - resolution: "@smithy/util-body-length-browser@npm:3.0.0" - dependencies: - tslib: ^2.6.2 - checksum: b01d8258b9a25b262734fc49cefefe48583ba193c3eefd49a6f7fd5922c3015d23dda88b52f3dd9a16827cad16b5b9425eef01e91bd0c71bb5abc469d2952c07 - languageName: node - linkType: hard - -"@smithy/util-body-length-node@npm:^3.0.0": - version: 3.0.0 - resolution: "@smithy/util-body-length-node@npm:3.0.0" - dependencies: - tslib: ^2.6.2 - checksum: da1baf4790609d3dc28c88385c7274fdf9b91a641fe3c5af22b78e18156df17bd470181348f43b2c739680936b1dafb1526158dfd817c3d9ecb71e653b4cbe3f - languageName: node - linkType: hard - -"@smithy/util-buffer-from@npm:^2.2.0": - version: 2.2.0 - resolution: "@smithy/util-buffer-from@npm:2.2.0" - dependencies: - "@smithy/is-array-buffer": ^2.2.0 - tslib: ^2.6.2 - checksum: 424c5b7368ae5880a8f2732e298d17879a19ca925f24ca45e1c6c005f717bb15b76eb28174d308d81631ad457ea0088aab0fd3255dd42f45a535c81944ad64d3 - languageName: node - linkType: hard - -"@smithy/util-buffer-from@npm:^3.0.0": - version: 3.0.0 - resolution: "@smithy/util-buffer-from@npm:3.0.0" - dependencies: - "@smithy/is-array-buffer": ^3.0.0 - tslib: ^2.6.2 - checksum: 1bfc4ab093fe98132bbc1ccd36a0b9ad75a31ed26bac4b7e9350205513a2481eb190ae44679ab4fecc5e10d367b5e6592bbfbf792671579d17d17bd7f7f233f5 - languageName: node - linkType: hard - -"@smithy/util-config-provider@npm:^3.0.0": - version: 3.0.0 - resolution: "@smithy/util-config-provider@npm:3.0.0" - dependencies: - tslib: ^2.6.2 - checksum: fc0f5f57d30261cf3a6693d8e338b9d269332c478ee18d905309a769844188190caf0564855d7e84f6c61e56aa556195dda89f65e8c30791951cf4999e4a70e7 - languageName: node - linkType: hard - -"@smithy/util-defaults-mode-browser@npm:^3.0.10": - version: 3.0.11 - resolution: "@smithy/util-defaults-mode-browser@npm:3.0.11" - dependencies: - "@smithy/property-provider": ^3.1.3 - "@smithy/smithy-client": ^3.1.9 - "@smithy/types": ^3.3.0 - bowser: ^2.11.0 - tslib: ^2.6.2 - checksum: 62536fc7e81a180e30445c94af022223a89346c3c2f2d3fe7e48ec67e198ed31e1de598f6195a3142b6db7edb94b701ad49f52a6ef9ed546b137b97219537014 - languageName: node - linkType: hard - -"@smithy/util-defaults-mode-node@npm:^3.0.10": - version: 3.0.11 - resolution: "@smithy/util-defaults-mode-node@npm:3.0.11" - dependencies: - "@smithy/config-resolver": ^3.0.5 - "@smithy/credential-provider-imds": ^3.1.4 - "@smithy/node-config-provider": ^3.1.4 - "@smithy/property-provider": ^3.1.3 - "@smithy/smithy-client": ^3.1.9 - "@smithy/types": ^3.3.0 - tslib: ^2.6.2 - checksum: 3df80c51cf77cd5215e64a48936831fad5f7d2accff3bed1ac62813bbd49da601cbca386b6efe0af67d33ddea423f428df14b4ca750ec7a376eb8a2e95893ba8 - languageName: node - linkType: hard - -"@smithy/util-endpoints@npm:^2.0.5": - version: 2.0.5 - resolution: "@smithy/util-endpoints@npm:2.0.5" - dependencies: - "@smithy/node-config-provider": ^3.1.4 - "@smithy/types": ^3.3.0 - tslib: ^2.6.2 - checksum: bb2a96323f52beaf2820f4e5764c865cff3ac5bca0c0df6923bb4582b0f87faf1606110cd4e36005ac43f41e9673ebdca4bbb8b913880fc2a4e0ff3301250da8 - languageName: node - linkType: hard - -"@smithy/util-hex-encoding@npm:^3.0.0": - version: 3.0.0 - resolution: "@smithy/util-hex-encoding@npm:3.0.0" - dependencies: - tslib: ^2.6.2 - checksum: dd32fd71e915825987a18bf7c0f8f0c4956d0b17a0ee71592b5563bb20e04f24dbf81d36161aac07caab3bb5e535cc609fce20aa4a38f66b457c4c6f5c7748d9 - languageName: node - linkType: hard - -"@smithy/util-middleware@npm:^3.0.3": - version: 3.0.3 - resolution: "@smithy/util-middleware@npm:3.0.3" - dependencies: - "@smithy/types": ^3.3.0 - tslib: ^2.6.2 - checksum: f37f25d65595af5ff4c3f69fa7e66545ac1651f77979e15ffbc9047e18fc668dae90458ee76add85a49ea3729c49d317e40542d5430e81e2eafe8dcae2ddb3bc - languageName: node - linkType: hard - -"@smithy/util-retry@npm:^2.0.4": - version: 2.2.0 - resolution: "@smithy/util-retry@npm:2.2.0" - dependencies: - "@smithy/service-error-classification": ^2.1.5 - "@smithy/types": ^2.12.0 - tslib: ^2.6.2 - checksum: 1a8071c8ac5a2646b3d3894e3bd9c36a9db045f52eadb194f32b02d2fdedd69fb267a2b02bcef9f91d0f8f3fe061754ac075d07ac166d90894acb27d68c62a41 - languageName: node - linkType: hard - -"@smithy/util-retry@npm:^3.0.3": - version: 3.0.3 - resolution: "@smithy/util-retry@npm:3.0.3" - dependencies: - "@smithy/service-error-classification": ^3.0.3 - "@smithy/types": ^3.3.0 - tslib: ^2.6.2 - checksum: c760595376154be67414083aa6f76094022df72987521469b124ef3ef5848c0536757dcd2006520580380db6a4d7b597a05569470c3151f71d5e678df63f4c13 - languageName: node - linkType: hard - -"@smithy/util-stream@npm:^3.1.0, @smithy/util-stream@npm:^3.1.1": - version: 3.1.1 - resolution: "@smithy/util-stream@npm:3.1.1" - dependencies: - "@smithy/fetch-http-handler": ^3.2.2 - "@smithy/node-http-handler": ^3.1.3 - "@smithy/types": ^3.3.0 - "@smithy/util-base64": ^3.0.0 - "@smithy/util-buffer-from": ^3.0.0 - "@smithy/util-hex-encoding": ^3.0.0 - "@smithy/util-utf8": ^3.0.0 - tslib: ^2.6.2 - checksum: a66ce6ffebfccbf5bf81cfef08f9286839e6d17406203e42d41d611e69da558a0c1ef98b218e5544a07a8171a60792437c3468d92ef41910a8472c052f47c6bc - languageName: node - linkType: hard - -"@smithy/util-uri-escape@npm:^3.0.0": - version: 3.0.0 - resolution: "@smithy/util-uri-escape@npm:3.0.0" - dependencies: - tslib: ^2.6.2 - checksum: d7ee01c978e2b08d0a89a3b678f5d5e5d5bb4ab4ab85567a238b1a6195dff1bdaf9ae62497e7f32ff5121b3dc007c370bcb6e8ef79b01fe5acdec5bbce8c7ce4 - languageName: node - linkType: hard - -"@smithy/util-utf8@npm:^2.0.0": - version: 2.3.0 - resolution: "@smithy/util-utf8@npm:2.3.0" - dependencies: - "@smithy/util-buffer-from": ^2.2.0 - tslib: ^2.6.2 - checksum: 00e55d4b4e37d48be0eef3599082402b933c52a1407fed7e8e8ad76d94d81a0b30b8bfaf2047c59d9c3af31e5f20e7a8c959cb7ae270f894255e05a2229964f0 - languageName: node - linkType: hard - -"@smithy/util-utf8@npm:^3.0.0": - version: 3.0.0 - resolution: "@smithy/util-utf8@npm:3.0.0" - dependencies: - "@smithy/util-buffer-from": ^3.0.0 - tslib: ^2.6.2 - checksum: d97be1748963263a1161ba80417d82318b977b38542f3fdf0379b0162461188be680e5bfb66a89d65652f0fad6ecf2ab23a43205979216e50602488f73434da3 - languageName: node - linkType: hard - -"@smithy/util-waiter@npm:^3.1.2": - version: 3.1.2 - resolution: "@smithy/util-waiter@npm:3.1.2" - dependencies: - "@smithy/abort-controller": ^3.1.1 - "@smithy/types": ^3.3.0 - tslib: ^2.6.2 - checksum: 35773b1bbbb215102555a55ce4de57cbd3e38f37546ca3e6748ce3856119019a613946b399c6d97981a0bad447ce9c41f87c276325ff4c0e5a2276ee4e9e384e - languageName: node - linkType: hard - -"@socket.io/component-emitter@npm:~3.1.0": - version: 3.1.0 - resolution: "@socket.io/component-emitter@npm:3.1.0" - checksum: db069d95425b419de1514dffe945cc439795f6a8ef5b9465715acf5b8b50798e2c91b8719cbf5434b3fe7de179d6cdcd503c277b7871cb3dd03febb69bdd50fa - languageName: node - linkType: hard - -"@sparkfabrik/react-native-idfa-aaid@npm:1.2.0": - version: 1.2.0 - resolution: "@sparkfabrik/react-native-idfa-aaid@npm:1.2.0" - peerDependencies: - react: "*" - react-native: "*" - checksum: 54347e18d64e7c5cc8931ed0b1b29ac0b923226726a2b77efe13156adfac8e2e754b9440fa2155074d28c4c268de040293437adf64539f4c152c6f88e0e39910 - languageName: node - linkType: hard - -"@stablelib/aead@npm:^1.0.1": - version: 1.0.1 - resolution: "@stablelib/aead@npm:1.0.1" - checksum: 1a6f68d138f105d17dd65349751515bd252ab0498c77255b8555478d28415600dde493f909eb718245047a993f838dfae546071e1687566ffb7b8c3e10c918d9 - languageName: node - linkType: hard - -"@stablelib/binary@npm:^1.0.1": - version: 1.0.1 - resolution: "@stablelib/binary@npm:1.0.1" - dependencies: - "@stablelib/int": ^1.0.1 - checksum: dca9b98eb1f56a4002b5b9e7351fbc49f3d8616af87007c01e833bd763ac89214eb5f3b7e18673c91ce59d4a0e4856a2eb661ace33d39f17fb1ad267271fccd8 - languageName: node - linkType: hard - -"@stablelib/bytes@npm:^1.0.1": - version: 1.0.1 - resolution: "@stablelib/bytes@npm:1.0.1" - checksum: 456267e08c3384abcb71d3ad3e97a6f99185ad754bac016f501ebea4e4886f37900589143b57e33bdbbf513a92fc89368c15dd4517e0540d0bdc79ecdf9dd087 - languageName: node - linkType: hard - -"@stablelib/chacha20poly1305@npm:1.0.1": - version: 1.0.1 - resolution: "@stablelib/chacha20poly1305@npm:1.0.1" - dependencies: - "@stablelib/aead": ^1.0.1 - "@stablelib/binary": ^1.0.1 - "@stablelib/chacha": ^1.0.1 - "@stablelib/constant-time": ^1.0.1 - "@stablelib/poly1305": ^1.0.1 - "@stablelib/wipe": ^1.0.1 - checksum: 81f1a32330838d31e4dc3144d76eba7244b56d9ea38c1f604f2c34d93ed8e67e9a6167d2cfd72254c13cc46dfc1f5ce5157b37939a575295d69d9144abb4e4fb - languageName: node - linkType: hard - -"@stablelib/chacha@npm:^1.0.1": - version: 1.0.1 - resolution: "@stablelib/chacha@npm:1.0.1" - dependencies: - "@stablelib/binary": ^1.0.1 - "@stablelib/wipe": ^1.0.1 - checksum: f061f36c4ca4bf177dd7cac11e7c65ced164f141b6065885141ae5a55f32e16ba0209aefcdcc966aef013f1da616ce901a3a80653b4b6f833cf7e3397ae2d6bd - languageName: node - linkType: hard - -"@stablelib/constant-time@npm:^1.0.1": - version: 1.0.1 - resolution: "@stablelib/constant-time@npm:1.0.1" - checksum: dba4f4bf508de2ff15f7f0cbd875e70391aa3ba3698290fe1ed2feb151c243ba08a90fc6fb390ec2230e30fcc622318c591a7c0e35dcb8150afb50c797eac3d7 - languageName: node - linkType: hard - -"@stablelib/ed25519@npm:^1.0.2": - version: 1.0.3 - resolution: "@stablelib/ed25519@npm:1.0.3" - dependencies: - "@stablelib/random": ^1.0.2 - "@stablelib/sha512": ^1.0.1 - "@stablelib/wipe": ^1.0.1 - checksum: e18279de078edac67396ba07dbb862dce0fe89efa8141c21a5b04108a29914bd51636019522323ca5097ec596a90b3028ed64e88ee009b0ac7de7c1ab6499ccb - languageName: node - linkType: hard - -"@stablelib/hash@npm:^1.0.1": - version: 1.0.1 - resolution: "@stablelib/hash@npm:1.0.1" - checksum: 3ff1f12d1a4082aaf4b6cdf40c2010aabe5c4209d3b40b97b5bbb0d9abc0ee94abdc545e57de0614afaea807ca0212ac870e247ec8f66cdce91ec39ce82948cf - languageName: node - linkType: hard - -"@stablelib/hkdf@npm:1.0.1": - version: 1.0.1 - resolution: "@stablelib/hkdf@npm:1.0.1" - dependencies: - "@stablelib/hash": ^1.0.1 - "@stablelib/hmac": ^1.0.1 - "@stablelib/wipe": ^1.0.1 - checksum: 9d45e303715a1835c8612b78e6c1b9d2b7463699b484241d8681fb5c17e0f2bbde5ce211c882134b64616a402e09177baeba80426995ff227b3654a155ab225d - languageName: node - linkType: hard - -"@stablelib/hmac@npm:^1.0.1": - version: 1.0.1 - resolution: "@stablelib/hmac@npm:1.0.1" - dependencies: - "@stablelib/constant-time": ^1.0.1 - "@stablelib/hash": ^1.0.1 - "@stablelib/wipe": ^1.0.1 - checksum: e3b93f7144a5846a6e30213278f7570de6d3f9d09131b95ce76d5c5c8bf37bf5d1830f2ee8d847555707271dbfd6e2461221719fd4d8b27ff06b9dd689c0ec21 - languageName: node - linkType: hard - -"@stablelib/int@npm:^1.0.1": - version: 1.0.1 - resolution: "@stablelib/int@npm:1.0.1" - checksum: 65bfbf50a382eea70c68e05366bf379cfceff8fbc076f1c267ef2f2411d7aed64fd140c415cb6c29f19a3910d3b8b7805d4b32ad5721a5007a8e744a808c7ae3 - languageName: node - linkType: hard - -"@stablelib/keyagreement@npm:^1.0.1": - version: 1.0.1 - resolution: "@stablelib/keyagreement@npm:1.0.1" - dependencies: - "@stablelib/bytes": ^1.0.1 - checksum: 3c8ec904dd50f72f3162f5447a0fa8f1d9ca6e24cd272d3dbe84971267f3b47f9bd5dc4e4eeedf3fbac2fe01f2d9277053e57c8e60db8c5544bfb35c62d290dd - languageName: node - linkType: hard - -"@stablelib/poly1305@npm:^1.0.1": - version: 1.0.1 - resolution: "@stablelib/poly1305@npm:1.0.1" - dependencies: - "@stablelib/constant-time": ^1.0.1 - "@stablelib/wipe": ^1.0.1 - checksum: 70b845bb0481c66b7ba3f3865d01e4c67a4dffc9616fc6de1d23efc5e828ec09de25f8e3be4e1f15a23b8e87e3036ee3d949c2fd4785047e6f7028bbec0ead18 - languageName: node - linkType: hard - -"@stablelib/random@npm:1.0.2, @stablelib/random@npm:^1.0.1, @stablelib/random@npm:^1.0.2": - version: 1.0.2 - resolution: "@stablelib/random@npm:1.0.2" - dependencies: - "@stablelib/binary": ^1.0.1 - "@stablelib/wipe": ^1.0.1 - checksum: f5ace0a588dc4c21f01cb85837892d4c872e994ae77a58a8eb7dd61aa0b26fb1e9b46b0445e71af57d963ef7d9f5965c64258fc0d04df7b2947bc48f2d3560c5 - languageName: node - linkType: hard - -"@stablelib/sha256@npm:1.0.1": - version: 1.0.1 - resolution: "@stablelib/sha256@npm:1.0.1" - dependencies: - "@stablelib/binary": ^1.0.1 - "@stablelib/hash": ^1.0.1 - "@stablelib/wipe": ^1.0.1 - checksum: 38669871e1bda72eb537629ebceac1c72da8890273a9fbe088f81f6d14c1ec04e78be8c5b455380a06c67f8e62b2508e11e9063fcc257dbaa1b5c27ac756ba77 - languageName: node - linkType: hard - -"@stablelib/sha512@npm:^1.0.1": - version: 1.0.1 - resolution: "@stablelib/sha512@npm:1.0.1" - dependencies: - "@stablelib/binary": ^1.0.1 - "@stablelib/hash": ^1.0.1 - "@stablelib/wipe": ^1.0.1 - checksum: b7c82f7608a35948a2147a534c0c9afc80deab3fd5f72a2e27b2454e7c0c6944d39381be3abcb1b7fac5b824ba030ae3e98209d517a579c143d8ed63930b042f - languageName: node - linkType: hard - -"@stablelib/wipe@npm:^1.0.1": - version: 1.0.1 - resolution: "@stablelib/wipe@npm:1.0.1" - checksum: 287802eb146810a46ba72af70b82022caf83a8aeebde23605f5ee0decf64fe2b97a60c856e43b6617b5801287c30cfa863cfb0469e7fcde6f02d143cf0c6cbf4 - languageName: node - linkType: hard - -"@stablelib/x25519@npm:1.0.3": - version: 1.0.3 - resolution: "@stablelib/x25519@npm:1.0.3" - dependencies: - "@stablelib/keyagreement": ^1.0.1 - "@stablelib/random": ^1.0.2 - "@stablelib/wipe": ^1.0.1 - checksum: f8537066b542b6770c1b5b2ae5ad0688d1b986e4bf818067c152c123a5471531987bbf024224f75f387f481ccc5b628e391e49e92102b8b1a3e2d449d6105402 - languageName: node - linkType: hard - -"@storybook/addon-actions@npm:8.4.2": - version: 8.4.2 - resolution: "@storybook/addon-actions@npm:8.4.2" - dependencies: - "@storybook/global": ^5.0.0 - "@types/uuid": ^9.0.1 - dequal: ^2.0.2 - polished: ^4.2.2 - uuid: ^9.0.0 - peerDependencies: - storybook: ^8.4.2 - checksum: 7ede8f0404a890c12879b2c2c33fd32e61eb3435461b922391c266d0e268976069be478f92630edfdb9e680f4b901896a9fa12b03c63e2ccb2fc1b6f6d378870 - languageName: node - linkType: hard - -"@storybook/addon-backgrounds@npm:8.4.2": - version: 8.4.2 - resolution: "@storybook/addon-backgrounds@npm:8.4.2" - dependencies: - "@storybook/global": ^5.0.0 - memoizerific: ^1.11.3 - ts-dedent: ^2.0.0 - peerDependencies: - storybook: ^8.4.2 - checksum: 889f4ecea5c6d9ca67e95a4d46925c7be3d7ced1657f2279bdf8717c5830074595638196e9c93f21dc63ec2cbc462680cf17602dddcb3f428669e667c8f5becd - languageName: node - linkType: hard - -"@storybook/addon-controls@npm:8.4.2": - version: 8.4.2 - resolution: "@storybook/addon-controls@npm:8.4.2" - dependencies: - "@storybook/global": ^5.0.0 - dequal: ^2.0.2 - ts-dedent: ^2.0.0 - peerDependencies: - storybook: ^8.4.2 - checksum: 721a179745e9c5cd0fbedb80f7f9578d99a48a4673c8227ae5b5634db9824f6de144223e4bc179e35a3ef206eed93cef51d8ad43d2c9b08edaee57f4f3c93ea2 - languageName: node - linkType: hard - -"@storybook/addon-controls@npm:^8.4.2": - version: 8.4.5 - resolution: "@storybook/addon-controls@npm:8.4.5" - dependencies: - "@storybook/global": ^5.0.0 - dequal: ^2.0.2 - ts-dedent: ^2.0.0 - peerDependencies: - storybook: ^8.4.5 - checksum: 673cdec1c5b174a317c295bcbbcb464f0d2778e6c403b3ae591a96d59510a96b9a97121b250d13e83886168396e5ee6877104e04da957950c3d87145ec76007b - languageName: node - linkType: hard - -"@storybook/addon-docs@npm:8.4.2": - version: 8.4.2 - resolution: "@storybook/addon-docs@npm:8.4.2" - dependencies: - "@mdx-js/react": ^3.0.0 - "@storybook/blocks": 8.4.2 - "@storybook/csf-plugin": 8.4.2 - "@storybook/react-dom-shim": 8.4.2 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - ts-dedent: ^2.0.0 - peerDependencies: - storybook: ^8.4.2 - checksum: bf24f21b56729bb1cfa7b17e3200c440151597a45f3dccdf183a1ad6f225394d6f98b54082276798c6062d11a2c15a7633b4058cac849010918f60481458fce9 - languageName: node - linkType: hard - -"@storybook/addon-essentials@npm:8.4.2": - version: 8.4.2 - resolution: "@storybook/addon-essentials@npm:8.4.2" - dependencies: - "@storybook/addon-actions": 8.4.2 - "@storybook/addon-backgrounds": 8.4.2 - "@storybook/addon-controls": 8.4.2 - "@storybook/addon-docs": 8.4.2 - "@storybook/addon-highlight": 8.4.2 - "@storybook/addon-measure": 8.4.2 - "@storybook/addon-outline": 8.4.2 - "@storybook/addon-toolbars": 8.4.2 - "@storybook/addon-viewport": 8.4.2 - ts-dedent: ^2.0.0 - peerDependencies: - storybook: ^8.4.2 - checksum: 951da2192a63d985e9af2e1e803bbe8bd6d64a87f50644034a55eb8bdc2ad0844e87836437d5c494eff3e94c8eae894d5f28bbef4b9cb99ef7e5fad573e1980d - languageName: node - linkType: hard - -"@storybook/addon-highlight@npm:8.4.2": - version: 8.4.2 - resolution: "@storybook/addon-highlight@npm:8.4.2" - dependencies: - "@storybook/global": ^5.0.0 - peerDependencies: - storybook: ^8.4.2 - checksum: 436a49e909866a263a1db0445d5498d3f551dab0af70789d22f9913fa562d8be9ae3ac9c6f08e46658cf4b5d9582a7a7be357e5511636088a57ae05a52743d2a - languageName: node - linkType: hard - -"@storybook/addon-interactions@npm:8.4.2": - version: 8.4.2 - resolution: "@storybook/addon-interactions@npm:8.4.2" - dependencies: - "@storybook/global": ^5.0.0 - "@storybook/instrumenter": 8.4.2 - "@storybook/test": 8.4.2 - polished: ^4.2.2 - ts-dedent: ^2.2.0 - peerDependencies: - storybook: ^8.4.2 - checksum: 80a41d9782594ac543fd4bb934cb572e19a0ec738f693f804b27aac63667f102cec5c3746c5d1472366530530534b47a2d470e374c486f17b18fcebc880e3d16 - languageName: node - linkType: hard - -"@storybook/addon-measure@npm:8.4.2": - version: 8.4.2 - resolution: "@storybook/addon-measure@npm:8.4.2" - dependencies: - "@storybook/global": ^5.0.0 - tiny-invariant: ^1.3.1 - peerDependencies: - storybook: ^8.4.2 - checksum: fb03d27a828ac035e88de4c035cb1fbc070a7fe6c3e8cf0422a2480f0fb62223d6e2d3ab966b04e3c8372c8258aa487431532c766111fbd268beec8b280bd4ec - languageName: node - linkType: hard - -"@storybook/addon-onboarding@npm:8.4.2": - version: 8.4.2 - resolution: "@storybook/addon-onboarding@npm:8.4.2" - dependencies: - react-confetti: ^6.1.0 - peerDependencies: - storybook: ^8.4.2 - checksum: 631d5261d092366b38d4edb745775dc5493ee1217806303b5fc7499d5ebf3b15768a6ce6b44672bb3dd6fe1da5411a7b004aafbb603877d966f07c96251e41ef - languageName: node - linkType: hard - -"@storybook/addon-ondevice-controls@npm:8.4.2": - version: 8.4.2 - resolution: "@storybook/addon-ondevice-controls@npm:8.4.2" - dependencies: - "@storybook/addon-controls": ^8.4.2 - "@storybook/core": ^8.4.2 - "@storybook/react-native-theming": ^8.4.2 - "@storybook/react-native-ui": ^8.4.2 - deep-equal: ^1.0.1 - prop-types: ^15.7.2 - react-native-modal-datetime-picker: ^14.0.0 - react-native-modal-selector: ^2.1.1 - tinycolor2: ^1.4.1 - peerDependencies: - "@gorhom/bottom-sheet": ">=4" - "@react-native-community/datetimepicker": "*" - "@react-native-community/slider": "*" - react: "*" - react-native: "*" - checksum: 43e6f8fa0fb92baa0e0acacd20953196d2e1b98c53f39520c7142e9d42c43ba2f1d1ddcdde2da67ef85fdf5c796e766d958eff01fe286ed6bbf3701a35691df2 - languageName: node - linkType: hard - -"@storybook/addon-outline@npm:8.4.2": - version: 8.4.2 - resolution: "@storybook/addon-outline@npm:8.4.2" - dependencies: - "@storybook/global": ^5.0.0 - ts-dedent: ^2.0.0 - peerDependencies: - storybook: ^8.4.2 - checksum: f7397522f7c4568bc1d6fe858ba9fa3c4ce4afbdbfd47761ebb841c8678a2472f4bbff4078fd557224b54b353e0164b97fef49d668e9b6ab8388b99bc312d3a0 - languageName: node - linkType: hard - -"@storybook/addon-toolbars@npm:8.4.2": - version: 8.4.2 - resolution: "@storybook/addon-toolbars@npm:8.4.2" - peerDependencies: - storybook: ^8.4.2 - checksum: 0b19b49ca00e952a50052f323b7e5fd144331f5b719e4d7053c266c32db1a0f30d3a28f6aafe4f5d239a5402cb0195bb295361adfc2e7d3abb9b27a888816c8e - languageName: node - linkType: hard - -"@storybook/addon-viewport@npm:8.4.2": - version: 8.4.2 - resolution: "@storybook/addon-viewport@npm:8.4.2" - dependencies: - memoizerific: ^1.11.3 - peerDependencies: - storybook: ^8.4.2 - checksum: fabb338c37ce560b1c67baf36fbefc7aca544e62e4b27b128e70c142d0cb1ebd320bf774208888e53879b4183c3899565edf0cdc2e80e55f9bcdee7a032a4da1 - languageName: node - linkType: hard - -"@storybook/blocks@npm:8.4.2": - version: 8.4.2 - resolution: "@storybook/blocks@npm:8.4.2" - dependencies: - "@storybook/csf": ^0.1.11 - "@storybook/icons": ^1.2.12 - ts-dedent: ^2.0.0 - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - storybook: ^8.4.2 - peerDependenciesMeta: - react: - optional: true - react-dom: - optional: true - checksum: 649bb81cdb5229b49aa7b913952974cbad533bf854f7bd400dc535b0f4781f90bf1b04df009fc6bcedbf111d7dbeeb375da38dbca8fa8f5306eeab8990dd342e - languageName: node - linkType: hard - -"@storybook/builder-webpack5@npm:8.4.2": - version: 8.4.2 - resolution: "@storybook/builder-webpack5@npm:8.4.2" - dependencies: - "@storybook/core-webpack": 8.4.2 - "@types/node": ^22.0.0 - "@types/semver": ^7.3.4 - browser-assert: ^1.2.1 - case-sensitive-paths-webpack-plugin: ^2.4.0 - cjs-module-lexer: ^1.2.3 - constants-browserify: ^1.0.0 - css-loader: ^6.7.1 - es-module-lexer: ^1.5.0 - fork-ts-checker-webpack-plugin: ^8.0.0 - html-webpack-plugin: ^5.5.0 - magic-string: ^0.30.5 - path-browserify: ^1.0.1 - process: ^0.11.10 - semver: ^7.3.7 - style-loader: ^3.3.1 - terser-webpack-plugin: ^5.3.1 - ts-dedent: ^2.0.0 - url: ^0.11.0 - util: ^0.12.4 - util-deprecate: ^1.0.2 - webpack: 5 - webpack-dev-middleware: ^6.1.2 - webpack-hot-middleware: ^2.25.1 - webpack-virtual-modules: ^0.6.0 - peerDependencies: - storybook: ^8.4.2 - peerDependenciesMeta: - typescript: - optional: true - checksum: a41b0b2b9316a35107794948da1a5cad84b76218db9a1d6a5d51d0de71afc9cf1b602d1aa28f755695186eb4c9ee22ac28c762d2d9203fbe98fa71477f59fe08 - languageName: node - linkType: hard - -"@storybook/components@npm:8.4.2": - version: 8.4.2 - resolution: "@storybook/components@npm:8.4.2" - peerDependencies: - storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 - checksum: 52c7885763f3154215b8f9fda57fe4af62e5194722bca90f35769a74aee411bf552d96455d1c2101404e30b2b0a4ed2c57c21a365ecbf18124a252538e15e83e - languageName: node - linkType: hard - -"@storybook/components@npm:8.4.5": - version: 8.4.5 - resolution: "@storybook/components@npm:8.4.5" - peerDependencies: - storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 - checksum: dd14e0a2d40f6590fd92204f3b40d4437403b7be311fa797250bd71fe4b38ade78389d41d2617fa5e75cfa0e1538366ca1154149c0894433245c23cebc4dfc73 - languageName: node - linkType: hard - -"@storybook/core-webpack@npm:8.4.2": - version: 8.4.2 - resolution: "@storybook/core-webpack@npm:8.4.2" - dependencies: - "@types/node": ^22.0.0 - ts-dedent: ^2.0.0 - peerDependencies: - storybook: ^8.4.2 - checksum: a1d42dab59627237e585f829480338f5f439210e74254da3c4014b10526adad2bc4458c722147a1f7dfbd7caa1dcc1c640b2dd89dc0b5edb445538237b92374e - languageName: node - linkType: hard - -"@storybook/core@npm:8.4.2": - version: 8.4.2 - resolution: "@storybook/core@npm:8.4.2" - dependencies: - "@storybook/csf": ^0.1.11 - better-opn: ^3.0.2 - browser-assert: ^1.2.1 - esbuild: ^0.18.0 || ^0.19.0 || ^0.20.0 || ^0.21.0 || ^0.22.0 || ^0.23.0 || ^0.24.0 - esbuild-register: ^3.5.0 - jsdoc-type-pratt-parser: ^4.0.0 - process: ^0.11.10 - recast: ^0.23.5 - semver: ^7.6.2 - util: ^0.12.5 - ws: ^8.2.3 - peerDependencies: - prettier: ^2 || ^3 - peerDependenciesMeta: - prettier: - optional: true - checksum: f8b29275f452772ae8663f568d7e00b3384465860df710a130ef72d3b15b767f04cd496949fb1f345d06698310f68c4bfc3f35577f76b87fee14b770d50dc12c - languageName: node - linkType: hard - -"@storybook/core@npm:8.4.5, @storybook/core@npm:^8.4.2": - version: 8.4.5 - resolution: "@storybook/core@npm:8.4.5" - dependencies: - "@storybook/csf": ^0.1.11 - better-opn: ^3.0.2 - browser-assert: ^1.2.1 - esbuild: ^0.18.0 || ^0.19.0 || ^0.20.0 || ^0.21.0 || ^0.22.0 || ^0.23.0 || ^0.24.0 - esbuild-register: ^3.5.0 - jsdoc-type-pratt-parser: ^4.0.0 - process: ^0.11.10 - recast: ^0.23.5 - semver: ^7.6.2 - util: ^0.12.5 - ws: ^8.2.3 - peerDependencies: - prettier: ^2 || ^3 - peerDependenciesMeta: - prettier: - optional: true - checksum: cfc7c93508befaed12314c61a64d892f543c16cff61b841ab5d74f666b88f6778aa3dd84095325074d4bc85bfde99a69ffc674e93200b457e33784b3ceccf730 - languageName: node - linkType: hard - -"@storybook/csf-plugin@npm:8.4.2": - version: 8.4.2 - resolution: "@storybook/csf-plugin@npm:8.4.2" - dependencies: - unplugin: ^1.3.1 - peerDependencies: - storybook: ^8.4.2 - checksum: ec787be0a4fe2928a2675fe6bca5799f0bff8c66e50cea7bed198a188b19ee57257266b0255c5226a7da97928758b86c978afecc3ee0e2bb1f21fe0e7fdaf0c5 - languageName: node - linkType: hard - -"@storybook/csf@npm:^0.0.1": - version: 0.0.1 - resolution: "@storybook/csf@npm:0.0.1" - dependencies: - lodash: ^4.17.15 - checksum: fb57fa028b08a51edf44e1a2bf4be40a4607f5c6ccb58aae8924f476a42b9bbd61a0ad521cfc82196f23e6a912caae0a615e70a755e6800b284c91c509fd2de6 - languageName: node - linkType: hard - -"@storybook/csf@npm:^0.1.1, @storybook/csf@npm:^0.1.11": - version: 0.1.11 - resolution: "@storybook/csf@npm:0.1.11" - dependencies: - type-fest: ^2.19.0 - checksum: ba2a265f62ad82a2853b069f77e974efe31bed263a640ca1dd8e6d7e194022018a67ad4a2587ae928f33ae45aaf6ffedd5925ba3fcf3fe5b7996667a918e22eb - languageName: node - linkType: hard - -"@storybook/global@npm:^5.0.0": - version: 5.0.0 - resolution: "@storybook/global@npm:5.0.0" - checksum: ede0ad35ec411fe31c61150dbd118fef344d1d0e72bf5d3502368e35cf68126f6b7ae4a0ab5e2ffe2f0baa3b4286f03ad069ba3e098e1725449ef08b7e154ba8 - languageName: node - linkType: hard - -"@storybook/icons@npm:^1.2.12": - version: 1.2.12 - resolution: "@storybook/icons@npm:1.2.12" - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - checksum: a4c87cbfadfa1369680c4acc9d5ef90b9ff23e2ad603b6c0aba0dafe89780e5643c567160eb0544fe33f3b9f157adda2621ae45b4036ac001139a34926e00102 - languageName: node - linkType: hard - -"@storybook/instrumenter@npm:8.4.2": - version: 8.4.2 - resolution: "@storybook/instrumenter@npm:8.4.2" - dependencies: - "@storybook/global": ^5.0.0 - "@vitest/utils": ^2.1.1 - peerDependencies: - storybook: ^8.4.2 - checksum: 9f4a70ecd5b8aa75aa51f88f829a7585831148c3d38db3f954be46c40a01b47135577d38e84ff7298cbad5efa5a2aaa3a57946d2d03edbf64008c6d2250d0d5d - languageName: node - linkType: hard - -"@storybook/manager-api@npm:8.4.2": - version: 8.4.2 - resolution: "@storybook/manager-api@npm:8.4.2" - peerDependencies: - storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 - checksum: 61b8f845f3271c2dd84597a94c2905a785949a2467582663165e476f455f1942b9c3be77a08f5101848d8a75ca23aa9f7db620d81f202d19093af7695d6ca8a0 - languageName: node - linkType: hard - -"@storybook/manager-api@npm:8.4.5": - version: 8.4.5 - resolution: "@storybook/manager-api@npm:8.4.5" - peerDependencies: - storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 - checksum: f6bc0ef3703afceedb862b77f22e169a173525c6d0483ba4ae5d1daf5b19c8077b33ef3fd634571e3ded93b2d4bd4a9e182c23d4395d1bfe8fdb6c98bdcc119f - languageName: node - linkType: hard - -"@storybook/preset-create-react-app@npm:8.4.2": - version: 8.4.2 - resolution: "@storybook/preset-create-react-app@npm:8.4.2" - dependencies: - "@pmmmwh/react-refresh-webpack-plugin": ^0.5.1 - "@storybook/react-docgen-typescript-plugin": 1.0.6--canary.9.0c3f3b7.0 - "@types/semver": ^7.5.6 - pnp-webpack-plugin: ^1.7.0 - semver: ^7.5.4 - peerDependencies: - react-scripts: ">=5.0.0" - storybook: ^8.4.2 - checksum: cc807c466cfecb66b53ca0269d2f6154148603bb2c65d00611ab3e27a7b24c34cb3791175fc5f34395ebc7432e75b937223f5882c9ce38305d77be980707f5ea - languageName: node - linkType: hard - -"@storybook/preset-react-webpack@npm:8.4.2": - version: 8.4.2 - resolution: "@storybook/preset-react-webpack@npm:8.4.2" - dependencies: - "@storybook/core-webpack": 8.4.2 - "@storybook/react": 8.4.2 - "@storybook/react-docgen-typescript-plugin": 1.0.6--canary.9.0c3f3b7.0 - "@types/node": ^22.0.0 - "@types/semver": ^7.3.4 - find-up: ^5.0.0 - magic-string: ^0.30.5 - react-docgen: ^7.0.0 - resolve: ^1.22.8 - semver: ^7.3.7 - tsconfig-paths: ^4.2.0 - webpack: 5 - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - storybook: ^8.4.2 - peerDependenciesMeta: - typescript: - optional: true - checksum: ea5911e60d0067d97d85c10623a31a446a807653247c9e2b16dc64f065cfcc355beefef8d219372f50f93c9d2f7e1812fd23a55352656f8e3879e4201b6068ba - languageName: node - linkType: hard - -"@storybook/preview-api@npm:8.4.2": - version: 8.4.2 - resolution: "@storybook/preview-api@npm:8.4.2" - peerDependencies: - storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 - checksum: 5e57c276bc30afd106dbe89b88dd8b4265d538bc4c55d011b6277d24d0210a7b1b9921f7f2403f06ad824fc50b5846d9037803c613a6f437239a667a52841eea - languageName: node - linkType: hard - -"@storybook/preview-api@npm:8.4.5": - version: 8.4.5 - resolution: "@storybook/preview-api@npm:8.4.5" - peerDependencies: - storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 - checksum: 832bee373583fb55102459445ae7f3e8bca0ff80a4220aa656bf6baf8661e0c65184f080b1e10695f8fbb948fd8d48cc9728d19d1bc6993418251126380d4818 - languageName: node - linkType: hard - -"@storybook/react-docgen-typescript-plugin@npm:1.0.6--canary.9.0c3f3b7.0": - version: 1.0.6--canary.9.0c3f3b7.0 - resolution: "@storybook/react-docgen-typescript-plugin@npm:1.0.6--canary.9.0c3f3b7.0" - dependencies: - debug: ^4.1.1 - endent: ^2.0.1 - find-cache-dir: ^3.3.1 - flat-cache: ^3.0.4 - micromatch: ^4.0.2 - react-docgen-typescript: ^2.2.2 - tslib: ^2.0.0 - peerDependencies: - typescript: ">= 4.x" - webpack: ">= 4" - checksum: 38c59c1dd7f9cdf5533e5ffe1991034f563f8d33c59e3cd33fa86719c72f5fe922276fde50315dd24f23f225d1ad5f3a261ecf4c70e82522805d09782272faff - languageName: node - linkType: hard - -"@storybook/react-dom-shim@npm:8.4.2": - version: 8.4.2 - resolution: "@storybook/react-dom-shim@npm:8.4.2" - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - storybook: ^8.4.2 - checksum: c8909337d8f6082bb3bd80adf97e539db3846a3fcd598ec8c2b919a91e9c11a6bd11b7aab76072c076f3e911feb9d798e19305b6d5306a2268b64a04931b6552 - languageName: node - linkType: hard - -"@storybook/react-dom-shim@npm:8.4.5": - version: 8.4.5 - resolution: "@storybook/react-dom-shim@npm:8.4.5" - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - storybook: ^8.4.5 - checksum: b1f176b85783bfa9c43f49a7ef69c04ff92079e5ba8ca76b1b9f46b814c19db6e882137c35ebd91424e2e51bfa0d34eb3f0b84d4ed9e8a2b93875b7f5563b310 - languageName: node - linkType: hard - -"@storybook/react-native-theming@npm:^8.4.2": - version: 8.4.2 - resolution: "@storybook/react-native-theming@npm:8.4.2" - dependencies: - polished: ^4.3.1 - peerDependencies: - react: "*" - react-native: ">=0.57.0" - checksum: 797c87c9770ca073a68d3542f5274624c4b11e4b0dac62f8c195c1df9068ff32705623412c03a7cca0f9816c438af0a8cb4dabcb65e3b6f652691a3a2894c77f - languageName: node - linkType: hard - -"@storybook/react-native-ui@npm:^8.4.2": - version: 8.4.2 - resolution: "@storybook/react-native-ui@npm:8.4.2" - dependencies: - "@storybook/core": ^8.4.2 - "@storybook/react": ^8.4.2 - "@storybook/react-native-theming": ^8.4.2 - fuse.js: ^7.0.0 - memoizerific: ^1.11.3 - polished: ^4.3.1 - store2: ^2.14.3 - peerDependencies: - "@gorhom/bottom-sheet": ">=4" - react: "*" - react-native: ">=0.57.0" - react-native-gesture-handler: ">=2" - react-native-reanimated: ">=3" - react-native-safe-area-context: "*" - react-native-svg: ">=14" - checksum: c6b6aaae98d4f7a21b603235c4391066027b6a401fb6c78cc5a3fba5c6e531d0f876cdf7b0a41c41bbc669e775f986edc469240771cd66407811ffb889d2f03b - languageName: node - linkType: hard - -"@storybook/react-native@npm:8.4.2": - version: 8.4.2 - resolution: "@storybook/react-native@npm:8.4.2" - dependencies: - "@storybook/core": ^8.4.2 - "@storybook/csf": ^0.1.1 - "@storybook/global": ^5.0.0 - "@storybook/react": ^8.4.2 - "@storybook/react-native-theming": ^8.4.2 - "@storybook/react-native-ui": ^8.4.2 - chokidar: ^3.5.1 - commander: ^8.2.0 - dedent: ^1.5.1 - deepmerge: ^4.3.0 - glob: ^7.1.7 - prettier: ^2.4.1 - react-native-swipe-gestures: ^1.0.5 - react-native-url-polyfill: ^2.0.0 - setimmediate: ^1.0.5 - storybook: ^8.4.2 - type-fest: ~2.19 - util: ^0.12.4 - ws: ^8.18.0 - peerDependencies: - "@gorhom/bottom-sheet": ">=4" - react: "*" - react-native: ">=0.72.0" - react-native-gesture-handler: ">=2" - react-native-safe-area-context: "*" - bin: - sb-rn-get-stories: ./bin/get-stories.js - sb-rn-watcher: ./bin/watcher.js - checksum: 245300ccd5edc61aa62e6f7e3e6c2d0c5cd387fa0b41d2d788a281df226c3f642f92c55af076f379a9f850b85364fa8534efa5528cbf6902d5605ea981ba578a - languageName: node - linkType: hard - -"@storybook/react-webpack5@npm:8.4.2": - version: 8.4.2 - resolution: "@storybook/react-webpack5@npm:8.4.2" - dependencies: - "@storybook/builder-webpack5": 8.4.2 - "@storybook/preset-react-webpack": 8.4.2 - "@storybook/react": 8.4.2 - "@types/node": ^22.0.0 - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - storybook: ^8.4.2 - typescript: ">= 4.2.x" - peerDependenciesMeta: - typescript: - optional: true - checksum: deccd9278bc9a90aa9952056a65a7c0bf0faf106423dd82e8abdf9174cafece1b37be746f590fda090b11a849b7689b42a6adb13d87f11b4c13ad06ab331f893 - languageName: node - linkType: hard - -"@storybook/react@npm:8.4.2": - version: 8.4.2 - resolution: "@storybook/react@npm:8.4.2" - dependencies: - "@storybook/components": 8.4.2 - "@storybook/global": ^5.0.0 - "@storybook/manager-api": 8.4.2 - "@storybook/preview-api": 8.4.2 - "@storybook/react-dom-shim": 8.4.2 - "@storybook/theming": 8.4.2 - peerDependencies: - "@storybook/test": 8.4.2 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - storybook: ^8.4.2 - typescript: ">= 4.2.x" - peerDependenciesMeta: - "@storybook/test": - optional: true - typescript: - optional: true - checksum: f1a2d4acce80da04ba044a29232940173e40cf5ad948bbe0ac327c597d625ae764c4f2dc8b00a1de00ddf3e31ff212241f0c48b466b00d5e0406db987ecb5038 - languageName: node - linkType: hard - -"@storybook/react@npm:^8.4.2": - version: 8.4.5 - resolution: "@storybook/react@npm:8.4.5" - dependencies: - "@storybook/components": 8.4.5 - "@storybook/global": ^5.0.0 - "@storybook/manager-api": 8.4.5 - "@storybook/preview-api": 8.4.5 - "@storybook/react-dom-shim": 8.4.5 - "@storybook/theming": 8.4.5 - peerDependencies: - "@storybook/test": 8.4.5 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - storybook: ^8.4.5 - typescript: ">= 4.2.x" - peerDependenciesMeta: - "@storybook/test": - optional: true - typescript: - optional: true - checksum: ea3f2008186d7b3556cdb1b0942ce2cb0b7d52ee322e3680f6f32f5a723a2d676fe4ba2bc2ea0060112453cd8652861c0b2d154a5c34e7d5b69ead9603c2ce68 - languageName: node - linkType: hard - -"@storybook/test@npm:8.4.2": - version: 8.4.2 - resolution: "@storybook/test@npm:8.4.2" - dependencies: - "@storybook/csf": ^0.1.11 - "@storybook/global": ^5.0.0 - "@storybook/instrumenter": 8.4.2 - "@testing-library/dom": 10.4.0 - "@testing-library/jest-dom": 6.5.0 - "@testing-library/user-event": 14.5.2 - "@vitest/expect": 2.0.5 - "@vitest/spy": 2.0.5 - peerDependencies: - storybook: ^8.4.2 - checksum: 24dcd0c7bd28b6feb176116ba265c4b68444d479208175edfc2e42a4e0a344788b2c3d07710424e88e51b8ccad9cdc6a6a40f520ddcb43d3d4861149418d4d63 - languageName: node - linkType: hard - -"@storybook/theming@npm:8.4.2": - version: 8.4.2 - resolution: "@storybook/theming@npm:8.4.2" - peerDependencies: - storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 - checksum: 8d0a6d20d3589815dea0bcdae9255216b8fc5459225871881a52e0fbc94a136a9972bef02c2ec6167ffd8eea24afab68962e01e83a8d4f60d12b4b787b9b23f3 - languageName: node - linkType: hard - -"@storybook/theming@npm:8.4.5": - version: 8.4.5 - resolution: "@storybook/theming@npm:8.4.5" - peerDependencies: - storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 - checksum: 0eefd3a3bea58e557f1e303270910046f05aa971ceba6ca6c1cd706c25b537243be6663dba5b2b3aa2edb7fc40279e93403131d76eae7da26da70f8a1c8d1c96 - languageName: node - linkType: hard - -"@styled-system/background@npm:^5.1.2": - version: 5.1.2 - resolution: "@styled-system/background@npm:5.1.2" - dependencies: - "@styled-system/core": ^5.1.2 - checksum: 2f5af340239d02310f95831e12a1acf2408194fc7e46b691db9ec6f105879455b5a128d863396654b8859c7d5f4a40fcfa4abd11111a3208d3de45f80ebbf2fc - languageName: node - linkType: hard - -"@styled-system/border@npm:^5.1.5": - version: 5.1.5 - resolution: "@styled-system/border@npm:5.1.5" - dependencies: - "@styled-system/core": ^5.1.2 - checksum: ff09e59b89b0ba62de7817025dd1f627187b1ce6fe6153eedaf31a402441a53f70763ce1fc8f9bf5796e973da60b910a043e37a0ff89f1360fb9d0bc13b1195c - languageName: node - linkType: hard - -"@styled-system/color@npm:^5.1.2": - version: 5.1.2 - resolution: "@styled-system/color@npm:5.1.2" - dependencies: - "@styled-system/core": ^5.1.2 - checksum: 3ab7ee7284a5e8ab5df28ef0355aa45b7c5a27d7665dc77d31ecde2d8a619e7eff064c88d0498a4c416a5f30a0abdd955aba811398d83a3155e9b7540574cd28 - languageName: node - linkType: hard - -"@styled-system/core@npm:^5.1.2": - version: 5.1.2 - resolution: "@styled-system/core@npm:5.1.2" - dependencies: - object-assign: ^4.1.1 - checksum: fac6b7d6b04790b2972bf877b77e0b6dba0addc54ecc39c12be659201ba1e1d4c260dee86d5048084d1745b800f3efd528c32ff2f9ee3f2661f683088672ffb6 - languageName: node - linkType: hard - -"@styled-system/css@npm:^5.0.0, @styled-system/css@npm:^5.1.5": - version: 5.1.5 - resolution: "@styled-system/css@npm:5.1.5" - checksum: 0d3579ae82f5f53412c22e675aec9f77fa17b52deddc03d680340d8187006f1698ef0577db30a3c57ee0204f83ec61bb8a01105c3f0d60ca5c925a70175b5358 - languageName: node - linkType: hard - -"@styled-system/flexbox@npm:^5.1.2": - version: 5.1.2 - resolution: "@styled-system/flexbox@npm:5.1.2" - dependencies: - "@styled-system/core": ^5.1.2 - checksum: adfecfd6d969174d0d2b7aa33c82709d1a8c4f1eedc295dfe0f966fa1075ed5e2573addfae849a604820c13db5589284a207f04acbdba195f9c7dd03d2d58db1 - languageName: node - linkType: hard - -"@styled-system/grid@npm:^5.1.2": - version: 5.1.2 - resolution: "@styled-system/grid@npm:5.1.2" - dependencies: - "@styled-system/core": ^5.1.2 - checksum: 7e29e96677f7fdd6edb4e019f7521a80b79521d5d768d6f94943f2026b369d1020d410f8b4abb7ec291bc17ab5bad84ba6aafc65f20f741f017ff32a885c358c - languageName: node - linkType: hard - -"@styled-system/layout@npm:^5.1.2": - version: 5.1.2 - resolution: "@styled-system/layout@npm:5.1.2" - dependencies: - "@styled-system/core": ^5.1.2 - checksum: 318e388a2ab072a0654c732777779453c9d3d8677e22a984d0ef42a10b9fbd0296207af258edbf110ecb6e5e0701ba969d8d3f3eb87641c8c984c6388bd38723 - languageName: node - linkType: hard - -"@styled-system/position@npm:^5.1.2": - version: 5.1.2 - resolution: "@styled-system/position@npm:5.1.2" - dependencies: - "@styled-system/core": ^5.1.2 - checksum: 6e3d1b8cc21b4863ba507e15b299c6a54406055269abf8a9721eae4803597a53de7bebea64646298f1122e7aca0aacbbf877565d9539ecd2b6a32e7507fe9b15 - languageName: node - linkType: hard - -"@styled-system/shadow@npm:^5.1.2": - version: 5.1.2 - resolution: "@styled-system/shadow@npm:5.1.2" - dependencies: - "@styled-system/core": ^5.1.2 - checksum: bfb45737e9375a976b1e0ec2c4b548b0d4bcc3c78ab4cb69558a5d8c145adcf5fb623abb3c5e7704652c65bf2b7c0d8a80447adbda99d88be65517ab7c2367e4 - languageName: node - linkType: hard - -"@styled-system/should-forward-prop@npm:^5.0.0": - version: 5.1.5 - resolution: "@styled-system/should-forward-prop@npm:5.1.5" - dependencies: - "@emotion/is-prop-valid": ^0.8.1 - "@emotion/memoize": ^0.7.1 - styled-system: ^5.1.5 - checksum: 49e383f114a72768a7c69d2986812b88f882cee81c96f7b58a1618162001168fce38f607acc6fd2af91fabe8e475a436f3f36c938dba249eadef631dcd3d26ad - languageName: node - linkType: hard - -"@styled-system/space@npm:^5.1.2": - version: 5.1.2 - resolution: "@styled-system/space@npm:5.1.2" - dependencies: - "@styled-system/core": ^5.1.2 - checksum: 959b6b69cf8226d798c38e2036fa2bccc3d9917f764322c4a3cf15adcc3c31aeb93fe34cfb826927116fc39b75185f6ed0bb720af3e19e028fb76308aecfa566 - languageName: node - linkType: hard - -"@styled-system/typography@npm:^5.1.2": - version: 5.1.2 - resolution: "@styled-system/typography@npm:5.1.2" - dependencies: - "@styled-system/core": ^5.1.2 - checksum: ae78eefb14e93b77c328e325f8b45f0052632a0642472ed29a1928f9180d3f8bde5d99ee01f1d976f8e2b11b6991464b3c34c3e88413cfeec2ba2b887c77f281 - languageName: node - linkType: hard - -"@styled-system/variant@npm:^5.1.5": - version: 5.1.5 - resolution: "@styled-system/variant@npm:5.1.5" - dependencies: - "@styled-system/core": ^5.1.2 - "@styled-system/css": ^5.1.5 - checksum: becddaa0269004bd788e25d6b5c6f92af1c87009fe31844b4c19bba5233d54e59cfc4c007f8825d812db84c8d1bade5f8a99eb744db41c9124e0c145db64b5b5 - languageName: node - linkType: hard - -"@surma/rollup-plugin-off-main-thread@npm:^2.2.3": - version: 2.2.3 - resolution: "@surma/rollup-plugin-off-main-thread@npm:2.2.3" - dependencies: - ejs: ^3.1.6 - json5: ^2.2.0 - magic-string: ^0.25.0 - string.prototype.matchall: ^4.0.6 - checksum: 2c021349442e2e2cec96bb50fd82ec8bf8514d909bc73594f6cfc89b3b68f2feed909a8161d7d307d9455585c97e6b66853ce334db432626c7596836d4549c0c - languageName: node - linkType: hard - -"@svgr/babel-plugin-add-jsx-attribute@npm:8.0.0": - version: 8.0.0 - resolution: "@svgr/babel-plugin-add-jsx-attribute@npm:8.0.0" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 3fc8e35d16f5abe0af5efe5851f27581225ac405d6a1ca44cda0df064cddfcc29a428c48c2e4bef6cebf627c9ac2f652a096030edb02cf5a120ce28d3c234710 - languageName: node - linkType: hard - -"@svgr/babel-plugin-add-jsx-attribute@npm:^5.4.0": - version: 5.4.0 - resolution: "@svgr/babel-plugin-add-jsx-attribute@npm:5.4.0" - checksum: 1c538cf312b486598c6aea17f9b72d7fc308eb5dd32effd804630206a185493b8a828ff980ceb29d57d8319c085614c7cea967be709c71ae77702a4c30037011 - languageName: node - linkType: hard - -"@svgr/babel-plugin-remove-jsx-attribute@npm:8.0.0": - version: 8.0.0 - resolution: "@svgr/babel-plugin-remove-jsx-attribute@npm:8.0.0" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: ff992893c6c4ac802713ba3a97c13be34e62e6d981c813af40daabcd676df68a72a61bd1e692bb1eda3587f1b1d700ea462222ae2153bb0f46886632d4f88d08 - languageName: node - linkType: hard - -"@svgr/babel-plugin-remove-jsx-attribute@npm:^5.4.0": - version: 5.4.0 - resolution: "@svgr/babel-plugin-remove-jsx-attribute@npm:5.4.0" - checksum: ad2231bfcb14daa944201df66236c222cde05a07c4cffaecab1d36d33f606b6caf17bda21844fc435780c1a27195e49beb8397536fe5e7545dfffcfbbcecb7f8 - languageName: node - linkType: hard - -"@svgr/babel-plugin-remove-jsx-empty-expression@npm:8.0.0": - version: 8.0.0 - resolution: "@svgr/babel-plugin-remove-jsx-empty-expression@npm:8.0.0" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 0fb691b63a21bac00da3aa2dccec50d0d5a5b347ff408d60803b84410d8af168f2656e4ba1ee1f24dab0ae4e4af77901f2928752bb0434c1f6788133ec599ec8 - languageName: node - linkType: hard - -"@svgr/babel-plugin-remove-jsx-empty-expression@npm:^5.0.1": - version: 5.0.1 - resolution: "@svgr/babel-plugin-remove-jsx-empty-expression@npm:5.0.1" - checksum: 175c8f13ddcb0744f7c3910ebed3799cfb961a75bff130e1ed2071c87ca8b8df8964825c988e511b2e3c5dbf48ad3d4fbbb6989edc53294253df40cf2a24375e - languageName: node - linkType: hard - -"@svgr/babel-plugin-replace-jsx-attribute-value@npm:8.0.0": - version: 8.0.0 - resolution: "@svgr/babel-plugin-replace-jsx-attribute-value@npm:8.0.0" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 1edda65ef4f4dd8f021143c8ec276a08f6baa6f733b8e8ee2e7775597bf6b97afb47fdeefd579d6ae6c959fe2e634f55cd61d99377631212228c8cfb351b8921 - languageName: node - linkType: hard - -"@svgr/babel-plugin-replace-jsx-attribute-value@npm:^5.0.1": - version: 5.0.1 - resolution: "@svgr/babel-plugin-replace-jsx-attribute-value@npm:5.0.1" - checksum: 68f4e2a5b95eca44e22fce485dc2ddd10adabe2b38f6db3ef9071b35e84bf379685f7acab6c05b7a82f722328c02f6424f8252c6dd5c2c4ed2f00104072b1dfe - languageName: node - linkType: hard - -"@svgr/babel-plugin-svg-dynamic-title@npm:8.0.0": - version: 8.0.0 - resolution: "@svgr/babel-plugin-svg-dynamic-title@npm:8.0.0" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 876cec891488992e6a9aebb8155e2bea4ec461b4718c51de36e988e00e271c6d9d01ef6be17b9effd44b2b3d7db0b41c161a5904a46ae6f38b26b387ad7f3709 - languageName: node - linkType: hard - -"@svgr/babel-plugin-svg-dynamic-title@npm:^5.4.0": - version: 5.4.0 - resolution: "@svgr/babel-plugin-svg-dynamic-title@npm:5.4.0" - checksum: c46feb52454acea32031d1d881a81334f2e5f838ed25a2d9014acb5e9541d404405911e86dbee8bee9f1e43c9e07118123a07dc297962dbed0c4c5a86bdc4be9 - languageName: node - linkType: hard - -"@svgr/babel-plugin-svg-em-dimensions@npm:8.0.0": - version: 8.0.0 - resolution: "@svgr/babel-plugin-svg-em-dimensions@npm:8.0.0" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: be0e2d391164428327d9ec469a52cea7d93189c6b0e2c290999e048f597d777852f701c64dca44cd45b31ed14a7f859520326e2e4ad7c3a4545d0aa235bc7e9a - languageName: node - linkType: hard - -"@svgr/babel-plugin-svg-em-dimensions@npm:^5.4.0": - version: 5.4.0 - resolution: "@svgr/babel-plugin-svg-em-dimensions@npm:5.4.0" - checksum: 0d19b26147bbba932bd973258dab4a80a7ea6b9d674713186f0e10fa21a9e3aa4327326b2bf1892e8051712bce0ea30561eb187ca27bb241d33c350cea51ac88 - languageName: node - linkType: hard - -"@svgr/babel-plugin-transform-react-native-svg@npm:8.0.0": - version: 8.0.0 - resolution: "@svgr/babel-plugin-transform-react-native-svg@npm:8.0.0" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 14e3f8ef27bb3215aa8914ea44831eb43decde4a131e4302480f23d6e75aa8c4ea9e1f8888d479b7a8ac63b828e590c03df6d72a6964676612c015f4a967fc74 - languageName: node - linkType: hard - -"@svgr/babel-plugin-transform-react-native-svg@npm:8.1.0": - version: 8.1.0 - resolution: "@svgr/babel-plugin-transform-react-native-svg@npm:8.1.0" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 85b434a57572f53bd2b9f0606f253e1fcf57b4a8c554ec3f2d43ed17f50d8cae200cb3aaf1ec9d626e1456e8b135dce530ae047eb0bed6d4bf98a752d6640459 - languageName: node - linkType: hard - -"@svgr/babel-plugin-transform-react-native-svg@npm:^5.4.0": - version: 5.4.0 - resolution: "@svgr/babel-plugin-transform-react-native-svg@npm:5.4.0" - checksum: 8ac5dc9fb2dee24addc74dbcb169860c95a69247606f986eabb0618fb300dd08e8f220891b758e62c051428ba04d8dd50f2c2bf877e15fa190e6d384d1ccd2ad - languageName: node - linkType: hard - -"@svgr/babel-plugin-transform-svg-component@npm:8.0.0": - version: 8.0.0 - resolution: "@svgr/babel-plugin-transform-svg-component@npm:8.0.0" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 04e2023d75693eeb0890341c40e449881184663056c249be7e5c80168e4aabb0fadd255e8d5d2dbf54b8c2a6e700efba994377135bfa4060dc4a2e860116ef8c - languageName: node - linkType: hard - -"@svgr/babel-plugin-transform-svg-component@npm:^5.5.0": - version: 5.5.0 - resolution: "@svgr/babel-plugin-transform-svg-component@npm:5.5.0" - checksum: 94c3fed490deb8544af4ea32a5d78a840334cdcc8a5a33fe8ea9f1c220a4d714d57c9e10934492de99b7e1acc17963b1749a49927e27b1e839a4dc3c893605c7 - languageName: node - linkType: hard - -"@svgr/babel-preset@npm:8.0.0": - version: 8.0.0 - resolution: "@svgr/babel-preset@npm:8.0.0" - dependencies: - "@svgr/babel-plugin-add-jsx-attribute": 8.0.0 - "@svgr/babel-plugin-remove-jsx-attribute": 8.0.0 - "@svgr/babel-plugin-remove-jsx-empty-expression": 8.0.0 - "@svgr/babel-plugin-replace-jsx-attribute-value": 8.0.0 - "@svgr/babel-plugin-svg-dynamic-title": 8.0.0 - "@svgr/babel-plugin-svg-em-dimensions": 8.0.0 - "@svgr/babel-plugin-transform-react-native-svg": 8.0.0 - "@svgr/babel-plugin-transform-svg-component": 8.0.0 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: c8a4497f3fe8338831be275e9e9534b265d22c8ecd75eec0ed82cff8d287506d38fc1963ac3b1a3a27abe0582bcba73f7a76798d23cce586e840bf65a87ba990 - languageName: node - linkType: hard - -"@svgr/babel-preset@npm:8.1.0": - version: 8.1.0 - resolution: "@svgr/babel-preset@npm:8.1.0" - dependencies: - "@svgr/babel-plugin-add-jsx-attribute": 8.0.0 - "@svgr/babel-plugin-remove-jsx-attribute": 8.0.0 - "@svgr/babel-plugin-remove-jsx-empty-expression": 8.0.0 - "@svgr/babel-plugin-replace-jsx-attribute-value": 8.0.0 - "@svgr/babel-plugin-svg-dynamic-title": 8.0.0 - "@svgr/babel-plugin-svg-em-dimensions": 8.0.0 - "@svgr/babel-plugin-transform-react-native-svg": 8.1.0 - "@svgr/babel-plugin-transform-svg-component": 8.0.0 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 3a67930f080b8891e1e8e2595716b879c944d253112bae763dce59807ba23454d162216c8d66a0a0e3d4f38a649ecd6c387e545d1e1261dd69a68e9a3392ee08 - languageName: node - linkType: hard - -"@svgr/babel-preset@npm:^5.5.0": - version: 5.5.0 - resolution: "@svgr/babel-preset@npm:5.5.0" - dependencies: - "@svgr/babel-plugin-add-jsx-attribute": ^5.4.0 - "@svgr/babel-plugin-remove-jsx-attribute": ^5.4.0 - "@svgr/babel-plugin-remove-jsx-empty-expression": ^5.0.1 - "@svgr/babel-plugin-replace-jsx-attribute-value": ^5.0.1 - "@svgr/babel-plugin-svg-dynamic-title": ^5.4.0 - "@svgr/babel-plugin-svg-em-dimensions": ^5.4.0 - "@svgr/babel-plugin-transform-react-native-svg": ^5.4.0 - "@svgr/babel-plugin-transform-svg-component": ^5.5.0 - checksum: 5d396c4499c9ff2df9db6d08a160d10386b9f459cb9c2bb5ee183ab03b2f46c8ef3c9a070f1eee93f4e4433a5f00704e7632b1386078eb697ad8a2b38edb8522 - languageName: node - linkType: hard - -"@svgr/core@npm:8.0.0": - version: 8.0.0 - resolution: "@svgr/core@npm:8.0.0" - dependencies: - "@babel/core": ^7.21.3 - "@svgr/babel-preset": 8.0.0 - camelcase: ^6.2.0 - cosmiconfig: ^8.1.3 - snake-case: ^3.0.4 - checksum: ce83ecbab185db72d16dbd9650f5a66c6e2705627722e593b0eaf23bfafe49cf8bb55f216016a11b8a546822c7387887d218aab8697f7b31e3d1a97d94fa0593 - languageName: node - linkType: hard - -"@svgr/core@npm:^5.5.0": - version: 5.5.0 - resolution: "@svgr/core@npm:5.5.0" - dependencies: - "@svgr/plugin-jsx": ^5.5.0 - camelcase: ^6.2.0 - cosmiconfig: ^7.0.0 - checksum: 39b230151e30b9ca8551d10674e50efb821d1a49ce10969b09587af130780eba581baa1e321b0922f48331943096f05590aa6ae92d88d011d58093a89dd34158 - languageName: node - linkType: hard - -"@svgr/core@npm:^8.1.0": - version: 8.1.0 - resolution: "@svgr/core@npm:8.1.0" - dependencies: - "@babel/core": ^7.21.3 - "@svgr/babel-preset": 8.1.0 - camelcase: ^6.2.0 - cosmiconfig: ^8.1.3 - snake-case: ^3.0.4 - checksum: da4a12865c7dc59829d58df8bd232d6c85b7115fda40da0d2f844a1a51886e2e945560596ecfc0345d37837ac457de86a931e8b8d8550e729e0c688c02250d8a - languageName: node - linkType: hard - -"@svgr/hast-util-to-babel-ast@npm:8.0.0": - version: 8.0.0 - resolution: "@svgr/hast-util-to-babel-ast@npm:8.0.0" - dependencies: - "@babel/types": ^7.21.3 - entities: ^4.4.0 - checksum: 88401281a38bbc7527e65ff5437970414391a86158ef4b4046c89764c156d2d39ecd7cce77be8a51994c9fb3249170cb1eb8b9128b62faaa81743ef6ed3534ab - languageName: node - linkType: hard - -"@svgr/hast-util-to-babel-ast@npm:^5.5.0": - version: 5.5.0 - resolution: "@svgr/hast-util-to-babel-ast@npm:5.5.0" - dependencies: - "@babel/types": ^7.12.6 - checksum: a03c1c7ab92b1a6dbd7671b0b78df4c07e8d808ff092671554a78752ec0c0425c03b6c82569a5f33903d191c73379eedf631f23aeb30b7a70185f5f2fc67fae6 - languageName: node - linkType: hard - -"@svgr/plugin-jsx@npm:8.0.1": - version: 8.0.1 - resolution: "@svgr/plugin-jsx@npm:8.0.1" - dependencies: - "@babel/core": ^7.21.3 - "@svgr/babel-preset": 8.0.0 - "@svgr/hast-util-to-babel-ast": 8.0.0 - svg-parser: ^2.0.4 - peerDependencies: - "@svgr/core": "*" - checksum: c6a0fc3e757e79837cd88f41f18b35594f8c4efe1b87e673514fa7add0912388b7dc79fa2738d629c2f945395ea568fa901c9c5ca5fce827a004c03867c1c482 - languageName: node - linkType: hard - -"@svgr/plugin-jsx@npm:^5.5.0": - version: 5.5.0 - resolution: "@svgr/plugin-jsx@npm:5.5.0" - dependencies: - "@babel/core": ^7.12.3 - "@svgr/babel-preset": ^5.5.0 - "@svgr/hast-util-to-babel-ast": ^5.5.0 - svg-parser: ^2.0.2 - checksum: e053f8dd6bfcd72377b432dd5b1db3c89d503d29839639a87f85b597a680d0b69e33a4db376f5a1074a89615f7157cd36f63f94bdb4083a0fd5bbe918c7fcb9b - languageName: node - linkType: hard - -"@svgr/plugin-jsx@npm:^8.1.0": - version: 8.1.0 - resolution: "@svgr/plugin-jsx@npm:8.1.0" - dependencies: - "@babel/core": ^7.21.3 - "@svgr/babel-preset": 8.1.0 - "@svgr/hast-util-to-babel-ast": 8.0.0 - svg-parser: ^2.0.4 - peerDependencies: - "@svgr/core": "*" - checksum: 0418a9780753d3544912ee2dad5d2cf8d12e1ba74df8053651b3886aeda54d5f0f7d2dece0af5e0d838332c4f139a57f0dabaa3ca1afa4d1a765efce6a7656f2 - languageName: node - linkType: hard - -"@svgr/plugin-svgo@npm:8.0.1": - version: 8.0.1 - resolution: "@svgr/plugin-svgo@npm:8.0.1" - dependencies: - cosmiconfig: ^8.1.3 - deepmerge: ^4.3.1 - svgo: ^3.0.2 - peerDependencies: - "@svgr/core": "*" - checksum: c5008c5dd8467f8f8b3a173462773fc37f2a8fa53989934ea802fc7a9db2147f6fee68736610a117751f2ab94773373e807d21e74db5f93b98040f1479845ec6 - languageName: node - linkType: hard - -"@svgr/plugin-svgo@npm:^5.5.0": - version: 5.5.0 - resolution: "@svgr/plugin-svgo@npm:5.5.0" - dependencies: - cosmiconfig: ^7.0.0 - deepmerge: ^4.2.2 - svgo: ^1.2.2 - checksum: bef5d09581349afdf654209f82199670649cc749b81ff5f310ce4a3bbad749cde877c9b1a711dd9ced51224e2b5b5a720d242bdf183fa0f83e08e8d5e069b0b6 - languageName: node - linkType: hard - -"@svgr/plugin-svgo@npm:^8.1.0": - version: 8.1.0 - resolution: "@svgr/plugin-svgo@npm:8.1.0" - dependencies: - cosmiconfig: ^8.1.3 - deepmerge: ^4.3.1 - svgo: ^3.0.2 - peerDependencies: - "@svgr/core": "*" - checksum: 59d9d214cebaacca9ca71a561f463d8b7e5a68ca9443e4792a42d903acd52259b1790c0680bc6afecc3f00a255a6cbd7ea278a9f625bac443620ea58a590c2d0 - languageName: node - linkType: hard - -"@svgr/webpack@npm:8.0.1": - version: 8.0.1 - resolution: "@svgr/webpack@npm:8.0.1" - dependencies: - "@babel/core": ^7.21.3 - "@babel/plugin-transform-react-constant-elements": ^7.21.3 - "@babel/preset-env": ^7.20.2 - "@babel/preset-react": ^7.18.6 - "@babel/preset-typescript": ^7.21.0 - "@svgr/core": 8.0.0 - "@svgr/plugin-jsx": 8.0.1 - "@svgr/plugin-svgo": 8.0.1 - checksum: e5e28be53ecf049056ea959040edabfc2d2e717e9ec7f4a549fa262cd1e2d9c6479836ea2eb1586196b9fee74855a0087dbb88257e872fe6b31157c5c0a52dcc - languageName: node - linkType: hard - -"@svgr/webpack@npm:^5.5.0": - version: 5.5.0 - resolution: "@svgr/webpack@npm:5.5.0" - dependencies: - "@babel/core": ^7.12.3 - "@babel/plugin-transform-react-constant-elements": ^7.12.1 - "@babel/preset-env": ^7.12.1 - "@babel/preset-react": ^7.12.5 - "@svgr/core": ^5.5.0 - "@svgr/plugin-jsx": ^5.5.0 - "@svgr/plugin-svgo": ^5.5.0 - loader-utils: ^2.0.0 - checksum: 540391bd63791625d26d6b5e0dd3c716ef51176bfba53bf0979a1ac4781afd2672f4bef2d76cf3d9cdc8e9ee61bda6863ed405a237b10406633ede4cd524f1cc - languageName: node - linkType: hard - -"@swc/core-darwin-arm64@npm:1.10.0": - version: 1.10.0 - resolution: "@swc/core-darwin-arm64@npm:1.10.0" - conditions: os=darwin & cpu=arm64 - languageName: node - linkType: hard - -"@swc/core-darwin-arm64@npm:1.3.72": - version: 1.3.72 - resolution: "@swc/core-darwin-arm64@npm:1.3.72" - conditions: os=darwin & cpu=arm64 - languageName: node - linkType: hard - -"@swc/core-darwin-x64@npm:1.10.0": - version: 1.10.0 - resolution: "@swc/core-darwin-x64@npm:1.10.0" - conditions: os=darwin & cpu=x64 - languageName: node - linkType: hard - -"@swc/core-darwin-x64@npm:1.3.72": - version: 1.3.72 - resolution: "@swc/core-darwin-x64@npm:1.3.72" - conditions: os=darwin & cpu=x64 - languageName: node - linkType: hard - -"@swc/core-linux-arm-gnueabihf@npm:1.10.0": - version: 1.10.0 - resolution: "@swc/core-linux-arm-gnueabihf@npm:1.10.0" - conditions: os=linux & cpu=arm - languageName: node - linkType: hard - -"@swc/core-linux-arm-gnueabihf@npm:1.3.72": - version: 1.3.72 - resolution: "@swc/core-linux-arm-gnueabihf@npm:1.3.72" - conditions: os=linux & cpu=arm - languageName: node - linkType: hard - -"@swc/core-linux-arm64-gnu@npm:1.10.0": - version: 1.10.0 - resolution: "@swc/core-linux-arm64-gnu@npm:1.10.0" - conditions: os=linux & cpu=arm64 & libc=glibc - languageName: node - linkType: hard - -"@swc/core-linux-arm64-gnu@npm:1.3.72": - version: 1.3.72 - resolution: "@swc/core-linux-arm64-gnu@npm:1.3.72" - conditions: os=linux & cpu=arm64 & libc=glibc - languageName: node - linkType: hard - -"@swc/core-linux-arm64-musl@npm:1.10.0": - version: 1.10.0 - resolution: "@swc/core-linux-arm64-musl@npm:1.10.0" - conditions: os=linux & cpu=arm64 & libc=musl - languageName: node - linkType: hard - -"@swc/core-linux-arm64-musl@npm:1.3.72": - version: 1.3.72 - resolution: "@swc/core-linux-arm64-musl@npm:1.3.72" - conditions: os=linux & cpu=arm64 & libc=musl - languageName: node - linkType: hard - -"@swc/core-linux-x64-gnu@npm:1.10.0": - version: 1.10.0 - resolution: "@swc/core-linux-x64-gnu@npm:1.10.0" - conditions: os=linux & cpu=x64 & libc=glibc - languageName: node - linkType: hard - -"@swc/core-linux-x64-gnu@npm:1.3.72": - version: 1.3.72 - resolution: "@swc/core-linux-x64-gnu@npm:1.3.72" - conditions: os=linux & cpu=x64 & libc=glibc - languageName: node - linkType: hard - -"@swc/core-linux-x64-musl@npm:1.10.0": - version: 1.10.0 - resolution: "@swc/core-linux-x64-musl@npm:1.10.0" - conditions: os=linux & cpu=x64 & libc=musl - languageName: node - linkType: hard - -"@swc/core-linux-x64-musl@npm:1.3.72": - version: 1.3.72 - resolution: "@swc/core-linux-x64-musl@npm:1.3.72" - conditions: os=linux & cpu=x64 & libc=musl - languageName: node - linkType: hard - -"@swc/core-win32-arm64-msvc@npm:1.10.0": - version: 1.10.0 - resolution: "@swc/core-win32-arm64-msvc@npm:1.10.0" - conditions: os=win32 & cpu=arm64 - languageName: node - linkType: hard - -"@swc/core-win32-arm64-msvc@npm:1.3.72": - version: 1.3.72 - resolution: "@swc/core-win32-arm64-msvc@npm:1.3.72" - conditions: os=win32 & cpu=arm64 - languageName: node - linkType: hard - -"@swc/core-win32-ia32-msvc@npm:1.10.0": - version: 1.10.0 - resolution: "@swc/core-win32-ia32-msvc@npm:1.10.0" - conditions: os=win32 & cpu=ia32 - languageName: node - linkType: hard - -"@swc/core-win32-ia32-msvc@npm:1.3.72": - version: 1.3.72 - resolution: "@swc/core-win32-ia32-msvc@npm:1.3.72" - conditions: os=win32 & cpu=ia32 - languageName: node - linkType: hard - -"@swc/core-win32-x64-msvc@npm:1.10.0": - version: 1.10.0 - resolution: "@swc/core-win32-x64-msvc@npm:1.10.0" - conditions: os=win32 & cpu=x64 - languageName: node - linkType: hard - -"@swc/core-win32-x64-msvc@npm:1.3.72": - version: 1.3.72 - resolution: "@swc/core-win32-x64-msvc@npm:1.3.72" - conditions: os=win32 & cpu=x64 - languageName: node - linkType: hard - -"@swc/core@npm:1.3.72": - version: 1.3.72 - resolution: "@swc/core@npm:1.3.72" - dependencies: - "@swc/core-darwin-arm64": 1.3.72 - "@swc/core-darwin-x64": 1.3.72 - "@swc/core-linux-arm-gnueabihf": 1.3.72 - "@swc/core-linux-arm64-gnu": 1.3.72 - "@swc/core-linux-arm64-musl": 1.3.72 - "@swc/core-linux-x64-gnu": 1.3.72 - "@swc/core-linux-x64-musl": 1.3.72 - "@swc/core-win32-arm64-msvc": 1.3.72 - "@swc/core-win32-ia32-msvc": 1.3.72 - "@swc/core-win32-x64-msvc": 1.3.72 - peerDependencies: - "@swc/helpers": ^0.5.0 - dependenciesMeta: - "@swc/core-darwin-arm64": - optional: true - "@swc/core-darwin-x64": - optional: true - "@swc/core-linux-arm-gnueabihf": - optional: true - "@swc/core-linux-arm64-gnu": - optional: true - "@swc/core-linux-arm64-musl": - optional: true - "@swc/core-linux-x64-gnu": - optional: true - "@swc/core-linux-x64-musl": - optional: true - "@swc/core-win32-arm64-msvc": - optional: true - "@swc/core-win32-ia32-msvc": - optional: true - "@swc/core-win32-x64-msvc": - optional: true - peerDependenciesMeta: - "@swc/helpers": - optional: true - checksum: 8dc1103de987d05ff97ec7acdb5ba0f9442ed658aa4923ba5f81eb6185375f695394a62415fbaf6f2e4685cfba5dec6c736666d8568e1defb5e3a44d65efecb9 - languageName: node - linkType: hard - -"@swc/core@npm:^1.5.25, @swc/core@npm:^1.7.21": - version: 1.10.0 - resolution: "@swc/core@npm:1.10.0" - dependencies: - "@swc/core-darwin-arm64": 1.10.0 - "@swc/core-darwin-x64": 1.10.0 - "@swc/core-linux-arm-gnueabihf": 1.10.0 - "@swc/core-linux-arm64-gnu": 1.10.0 - "@swc/core-linux-arm64-musl": 1.10.0 - "@swc/core-linux-x64-gnu": 1.10.0 - "@swc/core-linux-x64-musl": 1.10.0 - "@swc/core-win32-arm64-msvc": 1.10.0 - "@swc/core-win32-ia32-msvc": 1.10.0 - "@swc/core-win32-x64-msvc": 1.10.0 - "@swc/counter": ^0.1.3 - "@swc/types": ^0.1.17 - peerDependencies: - "@swc/helpers": "*" - dependenciesMeta: - "@swc/core-darwin-arm64": - optional: true - "@swc/core-darwin-x64": - optional: true - "@swc/core-linux-arm-gnueabihf": - optional: true - "@swc/core-linux-arm64-gnu": - optional: true - "@swc/core-linux-arm64-musl": - optional: true - "@swc/core-linux-x64-gnu": - optional: true - "@swc/core-linux-x64-musl": - optional: true - "@swc/core-win32-arm64-msvc": - optional: true - "@swc/core-win32-ia32-msvc": - optional: true - "@swc/core-win32-x64-msvc": - optional: true - peerDependenciesMeta: - "@swc/helpers": - optional: true - checksum: c86b7ead4f71f8b2065b4d11f979d49e248a0a721aac0469c4f3a209de3a71a7f1dca604559f034aeabd3ea9e00b7a574a7d8fc08fad786242b160098f2c7b3b - languageName: node - linkType: hard - -"@swc/counter@npm:^0.1.3": - version: 0.1.3 - resolution: "@swc/counter@npm:0.1.3" - checksum: df8f9cfba9904d3d60f511664c70d23bb323b3a0803ec9890f60133954173047ba9bdeabce28cd70ba89ccd3fd6c71c7b0bd58be85f611e1ffbe5d5c18616598 - languageName: node - linkType: hard - -"@swc/helpers@npm:^0.5.11": - version: 0.5.15 - resolution: "@swc/helpers@npm:0.5.15" - dependencies: - tslib: ^2.8.0 - checksum: 1a9e0dbb792b2d1e0c914d69c201dbc96af3a0e6e6e8cf5a7f7d6a5d7b0e8b762915cd4447acb6b040e2ecc1ed49822875a7239f99a2d63c96c3c3407fb6fccf - languageName: node - linkType: hard - -"@swc/jest@npm:0.2.29": - version: 0.2.29 - resolution: "@swc/jest@npm:0.2.29" - dependencies: - "@jest/create-cache-key-function": ^27.4.2 - jsonc-parser: ^3.2.0 - peerDependencies: - "@swc/core": "*" - checksum: 9eaad322310f34e81f67d41411a7d60663341af1bd9fb65456faa914c936d849d6f643fa3b942a187d52e71e62c33097098c639d25c2047fa874f49bf51cec76 - languageName: node - linkType: hard - -"@swc/plugin-styled-components@npm:1.5.97": - version: 1.5.97 - resolution: "@swc/plugin-styled-components@npm:1.5.97" - checksum: bf015d1b26c6c43e30e0b64f9ccab2cdfff898d4fc317dac68da20b367ae70025fb7bb2de979556339daebc2d726f601dbda4df319f24b73eb17768bd815b4df - languageName: node - linkType: hard - -"@swc/types@npm:^0.1.17": - version: 0.1.17 - resolution: "@swc/types@npm:0.1.17" - dependencies: - "@swc/counter": ^0.1.3 - checksum: 6cc87b8ddfb540096abdf40bc29742df0b7d068f97c1ce6c32cd1b7073cde263ed7bc3bae1fba7bf0e1a0f5d63336e9fa092e05a54f6d9b3570df956d2acaff6 - languageName: node - linkType: hard - -"@szmarczak/http-timer@npm:^1.1.2": - version: 1.1.2 - resolution: "@szmarczak/http-timer@npm:1.1.2" - dependencies: - defer-to-connect: ^1.0.1 - checksum: 4d9158061c5f397c57b4988cde33a163244e4f02df16364f103971957a32886beb104d6180902cbe8b38cb940e234d9f98a4e486200deca621923f62f50a06fe - languageName: node - linkType: hard - -"@szmarczak/http-timer@npm:^4.0.5": - version: 4.0.6 - resolution: "@szmarczak/http-timer@npm:4.0.6" - dependencies: - defer-to-connect: ^2.0.0 - checksum: c29df3bcec6fc3bdec2b17981d89d9c9fc9bd7d0c9bcfe92821dc533f4440bc890ccde79971838b4ceed1921d456973c4180d7175ee1d0023ad0562240a58d95 - languageName: node - linkType: hard - -"@tamagui/accordion@npm:1.121.7": - version: 1.121.7 - resolution: "@tamagui/accordion@npm:1.121.7" - dependencies: - "@tamagui/collapsible": 1.121.7 - "@tamagui/collection": 1.121.7 - "@tamagui/compose-refs": 1.121.7 - "@tamagui/constants": 1.121.7 - "@tamagui/core": 1.121.7 - "@tamagui/create-context": 1.121.7 - "@tamagui/polyfill-dev": 1.121.7 - "@tamagui/stacks": 1.121.7 - "@tamagui/use-controllable-state": 1.121.7 - peerDependencies: - react: "*" - checksum: 4afdb67a964e99717db135fadb3e5e9973d7a56cdb930fffbfae1180aaef38082d05837bfa58bbe787e56188dea4c58b3ce9b2887f7556723dd689866c44cdd9 - languageName: node - linkType: hard - -"@tamagui/adapt@npm:1.121.7": - version: 1.121.7 - resolution: "@tamagui/adapt@npm:1.121.7" - dependencies: - "@tamagui/constants": 1.121.7 - "@tamagui/core": 1.121.7 - "@tamagui/helpers": 1.121.7 - "@tamagui/portal": 1.121.7 - checksum: d13d5c65dc2a43753e83b6aad3605106475657f5086b9fda7d78dd34213d8ab6e4b4f18f78a4dfd2e0c8822421cc72d6aa8ff4611b1adf8b4f4452464ae364b6 - languageName: node - linkType: hard - -"@tamagui/alert-dialog@npm:1.121.7": - version: 1.121.7 - resolution: "@tamagui/alert-dialog@npm:1.121.7" - dependencies: - "@tamagui/animate-presence": 1.121.7 - "@tamagui/aria-hidden": 1.121.7 - "@tamagui/compose-refs": 1.121.7 - "@tamagui/constants": 1.121.7 - "@tamagui/core": 1.121.7 - "@tamagui/create-context": 1.121.7 - "@tamagui/dialog": 1.121.7 - "@tamagui/dismissable": 1.121.7 - "@tamagui/focus-scope": 1.121.7 - "@tamagui/helpers": 1.121.7 - "@tamagui/polyfill-dev": 1.121.7 - "@tamagui/popper": 1.121.7 - "@tamagui/portal": 1.121.7 - "@tamagui/remove-scroll": 1.121.7 - "@tamagui/stacks": 1.121.7 - "@tamagui/text": 1.121.7 - "@tamagui/use-controllable-state": 1.121.7 - peerDependencies: - react: "*" - checksum: 4ccf62a3ef5f20b523dea7dd11c89a24bc8252e1208572ad7c6c31bae61de4fc514923c1cdb05bc35771f5e334d9f317371dc1dd19e1ad647c9c044f51adb90c - languageName: node - linkType: hard - -"@tamagui/animate-presence@npm:1.121.7": - version: 1.121.7 - resolution: "@tamagui/animate-presence@npm:1.121.7" - dependencies: - "@tamagui/helpers": 1.121.7 - "@tamagui/use-constant": 1.121.7 - "@tamagui/use-force-update": 1.121.7 - "@tamagui/use-presence": 1.121.7 - "@tamagui/web": 1.121.7 - checksum: c840eca9009b63463348994000c416606da555a71f681fc77a094e1073ed5218d6d2a779da2cf474c2b2c5a333bbd3954caec7a120cc475363f6cf317c69b868 - languageName: node - linkType: hard - -"@tamagui/animate@npm:1.121.7": - version: 1.121.7 - resolution: "@tamagui/animate@npm:1.121.7" - dependencies: - "@tamagui/animate-presence": 1.121.7 - checksum: 3c0f00860398259afa2d6fb130f823ac42185736e13b67596d238b680aa90e670fcd524185399d65ccaa266be740429ea057f93e2cd1840f002cb5ba2fe9c31c - languageName: node - linkType: hard - -"@tamagui/animations-css@npm:1.121.7": - version: 1.121.7 - resolution: "@tamagui/animations-css@npm:1.121.7" - dependencies: - "@tamagui/constants": 1.121.7 - "@tamagui/cubic-bezier-animator": 1.121.7 - "@tamagui/use-presence": 1.121.7 - "@tamagui/web": 1.121.7 - peerDependencies: - react: "*" - react-dom: "*" - checksum: 0453839760470d2dd3e601d9a4b3c9ccd6186f7b39c48c5fdb283818c85560f46506523bca21c93455ee95fd4d20b5b2e2982b23c535b9df2b0de7d81bc6f5a6 - languageName: node - linkType: hard - -"@tamagui/animations-moti@npm:1.121.7": - version: 1.121.7 - resolution: "@tamagui/animations-moti@npm:1.121.7" - dependencies: - "@tamagui/use-presence": 1.121.7 - "@tamagui/web": 1.121.7 - moti: ^0.29.0 - peerDependencies: - react: "*" - checksum: 900251a4bf4a8e36d5b4f6e8c3ca8d809570cd01b14b1f9bc9a791e12ef8c118ccd78ab18309320d1e8f7ea068754dfb04fbb6c194db6c9855f5d89c57f0d0b3 - languageName: node - linkType: hard - -"@tamagui/animations-react-native@npm:1.121.7": - version: 1.121.7 - resolution: "@tamagui/animations-react-native@npm:1.121.7" - dependencies: - "@tamagui/constants": 1.121.7 - "@tamagui/use-presence": 1.121.7 - "@tamagui/web": 1.121.7 - peerDependencies: - react: "*" - checksum: 652dcd1b33a149c855f1ce7fdf53416d6a5453a338b6da34b5ac777c1424614523ff540a375ef5279a4aa45c75d50eeb5d7b5cf4078e1270efee12aed67d6079 - languageName: node - linkType: hard - -"@tamagui/aria-hidden@npm:1.121.7": - version: 1.121.7 - resolution: "@tamagui/aria-hidden@npm:1.121.7" - dependencies: - aria-hidden: ^1.1.3 - peerDependencies: - react: "*" - checksum: 9ad754351397562f85304521683911559e92d53a3bd81a9ab5b29e77b64d920bc1856bd16488e229e9312e638b39dfcb33bb31450ca6422a05038213c66f721b - languageName: node - linkType: hard - -"@tamagui/avatar@npm:1.121.7": - version: 1.121.7 - resolution: "@tamagui/avatar@npm:1.121.7" - dependencies: - "@tamagui/core": 1.121.7 - "@tamagui/helpers": 1.121.7 - "@tamagui/image": 1.121.7 - "@tamagui/shapes": 1.121.7 - "@tamagui/text": 1.121.7 - peerDependencies: - react: "*" - checksum: 3a7df603b6eaba522551e45e5640f65bbf8fac4d626902f8dde0849b01bec833d8f2c5f584c3624cfe4325b54800a946f0e10821597e1b4ce3fbb58933fd303a - languageName: node - linkType: hard - -"@tamagui/babel-plugin-fully-specified@npm:1.121.7": - version: 1.121.7 - resolution: "@tamagui/babel-plugin-fully-specified@npm:1.121.7" - dependencies: - "@babel/core": ^7.25.2 - checksum: 4042b4492eb2733ec359453c62847ee58e49726a13ccecd24f01bfb92c16813837b607d579c4c5f6b4b84ef4a039f6a9ee1cb579e947233568a664773f7cd323 - languageName: node - linkType: hard - -"@tamagui/babel-plugin@npm:1.121.7": - version: 1.121.7 - resolution: "@tamagui/babel-plugin@npm:1.121.7" - dependencies: - "@babel/generator": ^7.25.5 - "@babel/helper-plugin-utils": ^7.24.8 - "@babel/template": ^7.25.0 - "@babel/traverse": ^7.25.4 - "@tamagui/static": 1.121.7 - checksum: e8253336e4c3ab093b66ae0dd0f3552f66a30814ecbb7cf1f3ce138d244c9a0a253a29bf5272eff17328de56804ea9a417cf281cea9e8789d7a6bb510216527d - languageName: node - linkType: hard - -"@tamagui/build@npm:1.121.7": - version: 1.121.7 - resolution: "@tamagui/build@npm:1.121.7" - dependencies: - "@babel/core": ^7.25.2 - "@swc/core": ^1.7.21 - "@tamagui/babel-plugin-fully-specified": 1.121.7 - "@types/fs-extra": ^9.0.13 - chokidar: ^3.5.2 - esbuild: ^0.24.0 - esbuild-plugin-es5: ^2.1.1 - esbuild-register: ^3.6.0 - execa: ^5.0.0 - fast-glob: ^3.2.11 - fs-extra: ^11.2.0 - lodash.debounce: ^4.0.8 - typescript: ^5.7.2 - bin: - tamagui-build: tamagui-build.js - teesx: teesx.sh - checksum: ae6f22d08a2af1a0d70363c8b2995348d44d99e4bcb2a2f7715a40a87a53445fc38364e3b561caa54792f44a503a057f9cd06271acd3912639a423b4aa083916 - languageName: node - linkType: hard - -"@tamagui/button@npm:1.121.7": - version: 1.121.7 - resolution: "@tamagui/button@npm:1.121.7" - dependencies: - "@tamagui/font-size": 1.121.7 - "@tamagui/get-button-sized": 1.121.7 - "@tamagui/helpers": 1.121.7 - "@tamagui/helpers-tamagui": 1.121.7 - "@tamagui/stacks": 1.121.7 - "@tamagui/text": 1.121.7 - "@tamagui/web": 1.121.7 - peerDependencies: - react: "*" - checksum: 09a54b662f4287f4f6dd6520212ac7009d9ebb3f861b036b2744687b27aa1808eb3b7549c345dd7860fef3d734dad417148216d9fa25256c76d7cdb5f164c787 - languageName: node - linkType: hard - -"@tamagui/card@npm:1.121.7": - version: 1.121.7 - resolution: "@tamagui/card@npm:1.121.7" - dependencies: - "@tamagui/create-context": 1.121.7 - "@tamagui/helpers": 1.121.7 - "@tamagui/stacks": 1.121.7 - "@tamagui/web": 1.121.7 - peerDependencies: - react: "*" - checksum: d2cfb8192d686ec590d8efe37bbee3969694c4315576ef36cc8f329e05232637db80105765d73d8246c0c7a204c4fc5d73393b8813b0e7e72cdd6ac33add9125 - languageName: node - linkType: hard - -"@tamagui/checkbox-headless@npm:1.121.7": - version: 1.121.7 - resolution: "@tamagui/checkbox-headless@npm:1.121.7" - dependencies: - "@tamagui/compose-refs": 1.121.7 - "@tamagui/constants": 1.121.7 - "@tamagui/create-context": 1.121.7 - "@tamagui/focusable": 1.121.7 - "@tamagui/helpers": 1.121.7 - "@tamagui/label": 1.121.7 - "@tamagui/use-controllable-state": 1.121.7 - "@tamagui/use-previous": 1.121.7 - peerDependencies: - react: "*" - checksum: 59d5bc3ffab611312d7cc83fa13b57d708124071fa7dcfef50d23381384308b1a72766d64b288f71725e5eb1b80b5b1c59cd27a36906ba105f51cdb9b56c7f71 - languageName: node - linkType: hard - -"@tamagui/checkbox@npm:1.121.7": - version: 1.121.7 - resolution: "@tamagui/checkbox@npm:1.121.7" - dependencies: - "@tamagui/checkbox-headless": 1.121.7 - "@tamagui/compose-refs": 1.121.7 - "@tamagui/constants": 1.121.7 - "@tamagui/core": 1.121.7 - "@tamagui/create-context": 1.121.7 - "@tamagui/focusable": 1.121.7 - "@tamagui/font-size": 1.121.7 - "@tamagui/get-token": 1.121.7 - "@tamagui/helpers": 1.121.7 - "@tamagui/helpers-tamagui": 1.121.7 - "@tamagui/label": 1.121.7 - "@tamagui/stacks": 1.121.7 - "@tamagui/use-controllable-state": 1.121.7 - "@tamagui/use-previous": 1.121.7 - peerDependencies: - react: "*" - checksum: 3cb3dcff1e65b4a1f56424d0f6228632a5b26d1f3e58680805cbe70acd53c3656cd05f3835af3d1db0f2ba32462c75fa56387200d1abf49c4484b98a45ac3cb3 - languageName: node - linkType: hard - -"@tamagui/cli-color@npm:1.121.7": - version: 1.121.7 - resolution: "@tamagui/cli-color@npm:1.121.7" - checksum: 9dc8845f07dc7ae56516328e3033ea3d9699684580e25979443b18f97094d5df992c5efa879984392370c45d4b11f59a36a0705a0466f5e1e2b02311ba05bc7c - languageName: node - linkType: hard - -"@tamagui/collapsible@npm:1.121.7": - version: 1.121.7 - resolution: "@tamagui/collapsible@npm:1.121.7" - dependencies: - "@tamagui/animate-presence": 1.121.7 - "@tamagui/compose-refs": 1.121.7 - "@tamagui/core": 1.121.7 - "@tamagui/create-context": 1.121.7 - "@tamagui/helpers": 1.121.7 - "@tamagui/polyfill-dev": 1.121.7 - "@tamagui/stacks": 1.121.7 - "@tamagui/use-controllable-state": 1.121.7 - peerDependencies: - react: "*" - checksum: 1eba30faa9059bbab7ca99cedc7f4cdccf1fb48ec679ce3888414d5bca56a53c498cdf29ed1471b16a310bbc45fc46cebeb0f9ab5474538ac80ba45ebf288bfb - languageName: node - linkType: hard - -"@tamagui/collection@npm:1.121.7": - version: 1.121.7 - resolution: "@tamagui/collection@npm:1.121.7" - dependencies: - "@tamagui/compose-refs": 1.121.7 - "@tamagui/constants": 1.121.7 - "@tamagui/core": 1.121.7 - "@tamagui/create-context": 1.121.7 - "@tamagui/polyfill-dev": 1.121.7 - "@tamagui/stacks": 1.121.7 - "@tamagui/use-controllable-state": 1.121.7 - peerDependencies: - react: "*" - checksum: bcedc87e32fad61dd52901ec09319922c494c8fd9d406bf3c96e95acd7440ae3bc6da09dc3109d01e37320d41365dc88a4875d6a49963925c34ab274313d7b35 - languageName: node - linkType: hard - -"@tamagui/compose-refs@npm:1.121.7": - version: 1.121.7 - resolution: "@tamagui/compose-refs@npm:1.121.7" - peerDependencies: - react: "*" - checksum: af98455807814978da37d3bdd21f12a530eb0bfc0f5a1e155d2964ff128e5649cf28b6b275b87d7a736cbc27ee321e9ec96ad3aa2dcb1f279e867fd252041dda - languageName: node - linkType: hard - -"@tamagui/config-default@npm:1.121.7": - version: 1.121.7 - resolution: "@tamagui/config-default@npm:1.121.7" - dependencies: - "@tamagui/animations-css": 1.121.7 - "@tamagui/core": 1.121.7 - "@tamagui/shorthands": 1.121.7 - checksum: b724cb6c2028f171043b1ebd6ed572bdf748c40e9fd424948a3a36dbab29a3b0c687003ef3a0e11137e71abede46fc679da82b071d454ca468c773b3abf8e36b - languageName: node - linkType: hard - -"@tamagui/constants@npm:1.121.7": - version: 1.121.7 - resolution: "@tamagui/constants@npm:1.121.7" - peerDependencies: - react: "*" - checksum: f0c2d602bf23daf1980ae578e5e3e1241aa956e85aa94040d85a310b0f266ae2a8fbf227d649bf2ff2d4acc851a672fab54bd227a600a910cd82b5c5e8e21c3c - languageName: node - linkType: hard - -"@tamagui/core@npm:1.121.7": - version: 1.121.7 - resolution: "@tamagui/core@npm:1.121.7" - dependencies: - "@tamagui/react-native-use-pressable": 1.121.7 - "@tamagui/react-native-use-responder-events": 1.121.7 - "@tamagui/use-event": 1.121.7 - "@tamagui/web": 1.121.7 - checksum: 4ff28218f4a6420ff32f6710a0196d0f2dcb3d494b2bff900be01c2681e5b069c6c17b22f26240c37e497c66b4af4a107966f804798f5dcbf7e945d744b028aa - languageName: node - linkType: hard - -"@tamagui/create-context@npm:1.121.7": - version: 1.121.7 - resolution: "@tamagui/create-context@npm:1.121.7" - peerDependencies: - react: "*" - checksum: 03dbf68e3aabbe10027ac53a8c12862d1e319c61779f8ed0d4dc9357e48b3ecb9792ec66d4bb65b89703a1ad5367c73c80b91fcb3867b25e04be005730724cc8 - languageName: node - linkType: hard - -"@tamagui/create-theme@npm:1.121.7": - version: 1.121.7 - resolution: "@tamagui/create-theme@npm:1.121.7" - dependencies: - "@tamagui/web": 1.121.7 - checksum: ec043ce8aa976b812bfe07807a82bc94abbd9087b058b117dc9872ed621e792316cbe7cbab3dd80debefe217c0a6e7bb3966e6d66c172e4c28aea36d2271a319 - languageName: node - linkType: hard - -"@tamagui/cubic-bezier-animator@npm:1.121.7": - version: 1.121.7 - resolution: "@tamagui/cubic-bezier-animator@npm:1.121.7" - checksum: 09051c49e4d494c7536f66cf8ee8ce786b0c5112c58752f60f89192ab661713ea3577b2391bb16b8cbcc8b5604d204fe9cc13e3939b4d0fe6450b3ce80a0b4a9 - languageName: node - linkType: hard - -"@tamagui/dialog@npm:1.121.7": - version: 1.121.7 - resolution: "@tamagui/dialog@npm:1.121.7" - dependencies: - "@tamagui/adapt": 1.121.7 - "@tamagui/animate-presence": 1.121.7 - "@tamagui/aria-hidden": 1.121.7 - "@tamagui/compose-refs": 1.121.7 - "@tamagui/constants": 1.121.7 - "@tamagui/core": 1.121.7 - "@tamagui/create-context": 1.121.7 - "@tamagui/dismissable": 1.121.7 - "@tamagui/focus-scope": 1.121.7 - "@tamagui/helpers": 1.121.7 - "@tamagui/polyfill-dev": 1.121.7 - "@tamagui/popper": 1.121.7 - "@tamagui/portal": 1.121.7 - "@tamagui/remove-scroll": 1.121.7 - "@tamagui/sheet": 1.121.7 - "@tamagui/stacks": 1.121.7 - "@tamagui/text": 1.121.7 - "@tamagui/use-controllable-state": 1.121.7 - peerDependencies: - react: "*" - checksum: d01581916a51ff459a5dedc78856f9e2c5f04341506c72a6dec009c9a09698210d46586a378a714e3c2ea3e961cff12177d54bf227ce790036cb93812e624c40 - languageName: node - linkType: hard - -"@tamagui/dismissable@npm:1.121.7": - version: 1.121.7 - resolution: "@tamagui/dismissable@npm:1.121.7" - dependencies: - "@tamagui/compose-refs": 1.121.7 - "@tamagui/core": 1.121.7 - "@tamagui/helpers": 1.121.7 - "@tamagui/use-escape-keydown": 1.121.7 - "@tamagui/use-event": 1.121.7 - peerDependencies: - react: "*" - checksum: 536fe425ec2b1e356257e8d5089e5d86bd6f13459e7e3e3eb4fc2dbbfce84b52c9e9766993c995bf03d7cc6e8e83c35e1d92de572d3cd7e849df28c0ab73bf53 - languageName: node - linkType: hard - -"@tamagui/elements@npm:1.121.7": - version: 1.121.7 - resolution: "@tamagui/elements@npm:1.121.7" - dependencies: - "@tamagui/core": 1.121.7 - peerDependencies: - react: "*" - checksum: 8e49a9ce7aecc128021beaf386165511d404bc4b78951cb326819f33ce98e2c125d71eabc14fed025754dc06d9bfe5427b7c8ea28829e5852f2332369509c041 - languageName: node - linkType: hard - -"@tamagui/fake-react-native@npm:1.121.7": - version: 1.121.7 - resolution: "@tamagui/fake-react-native@npm:1.121.7" - checksum: 290cd6f67b464cbfe4a87f7aac99b97f678492f5f31d718b30b613d192b319a846ef77b87d820f6c9921f9752e7615bd1d4bafd91349a72e8a14dd5bded5a409 - languageName: node - linkType: hard - -"@tamagui/floating@npm:1.121.7": - version: 1.121.7 - resolution: "@tamagui/floating@npm:1.121.7" - dependencies: - "@floating-ui/react-dom": ^2.1.2 - "@floating-ui/react-native": ^0.10.6 - peerDependencies: - react: "*" - checksum: a1cbd2b96e4cacfae9dce0df2b3faa717ff3627f42e8fcdaceed34f1e484b890f8f9e0ab01591331ea71cddcdcfa0eb899b9d04e2a49f40a8e67dafa02009e96 - languageName: node - linkType: hard - -"@tamagui/focus-scope@npm:1.121.7": - version: 1.121.7 - resolution: "@tamagui/focus-scope@npm:1.121.7" - dependencies: - "@tamagui/compose-refs": 1.121.7 - "@tamagui/start-transition": 1.121.7 - "@tamagui/use-event": 1.121.7 - peerDependencies: - react: "*" - checksum: 6a63da5f210628f398c8e029f4bb97d7e7b7be10f769479d23d99666f53f2061378e2da42e72d3df84a03462b7f5eb024af81625a5f3b7c2c872cad06b5b10b6 - languageName: node - linkType: hard - -"@tamagui/focusable@npm:1.121.7": - version: 1.121.7 - resolution: "@tamagui/focusable@npm:1.121.7" - dependencies: - "@tamagui/compose-refs": 1.121.7 - "@tamagui/web": 1.121.7 - peerDependencies: - react: "*" - checksum: 81302a922813c8d760b5770151c13c777c2d2d13e932a4c20ec7cb7cd605f00fee14935e3afd518428d95768e88823b5dab3f11cb21bfee2b004a15d41e5349e - languageName: node - linkType: hard - -"@tamagui/font-inter@npm:1.121.7": - version: 1.121.7 - resolution: "@tamagui/font-inter@npm:1.121.7" - dependencies: - "@tamagui/core": 1.121.7 - checksum: 370cd4bfcabe2940773e730c62c0b2932303b0c73da502d5d71fcb716b91a2678415c4904b4836da7a86718562ff3b05d96f249ecbe6fd342e4720257a40adc1 - languageName: node - linkType: hard - -"@tamagui/font-size@npm:1.121.7": - version: 1.121.7 - resolution: "@tamagui/font-size@npm:1.121.7" - dependencies: - "@tamagui/core": 1.121.7 - peerDependencies: - react: "*" - checksum: 99dd2eb53c8b303a5a7f962c887240335609690c0bf6e9b4ca80810d23a0a72604e21e8986de55ef5f4b685fac9afe6f5e1aa2ced9a5f34b12fcd0c332d0e75c - languageName: node - linkType: hard - -"@tamagui/form@npm:1.121.7": - version: 1.121.7 - resolution: "@tamagui/form@npm:1.121.7" - dependencies: - "@tamagui/compose-refs": 1.121.7 - "@tamagui/core": 1.121.7 - "@tamagui/create-context": 1.121.7 - "@tamagui/focusable": 1.121.7 - "@tamagui/get-button-sized": 1.121.7 - "@tamagui/get-font-sized": 1.121.7 - "@tamagui/helpers": 1.121.7 - "@tamagui/text": 1.121.7 - peerDependencies: - react: "*" - checksum: dd29c469ed50e7296710e36c54525f52bfeb3d9784d3ec7eacbc352a304c56dddaec73432fd784d8190d1b41166f5619684f762aa6ac5a61ad7509885852d3de - languageName: node - linkType: hard - -"@tamagui/generate-themes@npm:1.121.7": - version: 1.121.7 - resolution: "@tamagui/generate-themes@npm:1.121.7" - dependencies: - "@tamagui/create-theme": 1.121.7 - "@tamagui/theme-builder": 1.121.7 - "@tamagui/types": 1.121.7 - esbuild-register: ^3.6.0 - fs-extra: ^11.2.0 - checksum: 19e3ed91e0ffa9b69454b2efc12218d40d36441b2bb0a585c2729a4edca09e1b6776214dc9415e1f913e5b64064e74f981f09815df0c2a5e7eb77bc95257b91c - languageName: node - linkType: hard - -"@tamagui/get-button-sized@npm:1.121.7": - version: 1.121.7 - resolution: "@tamagui/get-button-sized@npm:1.121.7" - dependencies: - "@tamagui/get-token": 1.121.7 - "@tamagui/web": 1.121.7 - peerDependencies: - react: "*" - checksum: 211168114e8c136a7efa8785b5ebca96f5b02bfebd59ee2769ae93a0f278f835b9ece37f5242a875559398619b312f80fe967339310fe36ae30d0bbae329c09b - languageName: node - linkType: hard - -"@tamagui/get-font-sized@npm:1.121.7": - version: 1.121.7 - resolution: "@tamagui/get-font-sized@npm:1.121.7" - dependencies: - "@tamagui/constants": 1.121.7 - "@tamagui/core": 1.121.7 - peerDependencies: - react: "*" - checksum: 0b13a4aea56611637fd155b2b2a726944eccae88ff01c455c2f374c7d0aa5cfad40e97614b741b73e4f72072dae1f212d88f0f9a6502e5dced4a97e04f170aef - languageName: node - linkType: hard - -"@tamagui/get-token@npm:1.121.7": - version: 1.121.7 - resolution: "@tamagui/get-token@npm:1.121.7" - dependencies: - "@tamagui/web": 1.121.7 - peerDependencies: - react: "*" - checksum: 4403596f60ea26193deee49c3d2cb32813adb2b744aafe2a394aa5d5e10a569283adf9b8f05c7ec698a4e6d2333429217499f160e8c3464513296041166f8c6e - languageName: node - linkType: hard - -"@tamagui/group@npm:1.121.7": - version: 1.121.7 - resolution: "@tamagui/group@npm:1.121.7" - dependencies: - "@tamagui/core": 1.121.7 - "@tamagui/create-context": 1.121.7 - "@tamagui/helpers": 1.121.7 - "@tamagui/stacks": 1.121.7 - "@tamagui/use-controllable-state": 1.121.7 - peerDependencies: - react: "*" - checksum: 24e995bee1fdb0b9ae6ad76c6f130f3d98160b9f075c1f230bef616041f8f0738eb445fad4b986070f6bb2cc98ff1c8cc33e9c979c59128276af0c84ae635646 - languageName: node - linkType: hard - -"@tamagui/helpers-icon@npm:1.121.7": - version: 1.121.7 - resolution: "@tamagui/helpers-icon@npm:1.121.7" - dependencies: - "@tamagui/core": 1.121.7 - peerDependencies: - react: "*" - react-native-svg: ">=12" - checksum: 72c07d70feba9bfb71e52c8bce2424a94fbc4a2b446af9b99d2db2aaa139918ed1149fa1cdc7d1c1172ee55872b3a5bda53acc4d4565dbaa4fad1a0f5ce0c7a3 - languageName: node - linkType: hard - -"@tamagui/helpers-node@npm:1.121.7": - version: 1.121.7 - resolution: "@tamagui/helpers-node@npm:1.121.7" - dependencies: - "@tamagui/types": 1.121.7 - checksum: fcec7e4e3c58108ccf4159326a1e86a9c43e728ec9fbd9af9c93a3c94d13ed4e07b8a47d54838bc04eb9861c250419823bd574b9ee567424194505e8629ccf2a - languageName: node - linkType: hard - -"@tamagui/helpers-tamagui@npm:1.121.7": - version: 1.121.7 - resolution: "@tamagui/helpers-tamagui@npm:1.121.7" - dependencies: - "@tamagui/helpers": 1.121.7 - "@tamagui/web": 1.121.7 - peerDependencies: - react: "*" - checksum: 76e1d58f41c46d99f0617ff890e71f4c1bab8cb9ea332c72024c0f54b8d77051a5ebb25ccc2dcaf9f3fb7ef2389717ffb9c69c83469503bf594a685cc0e72c0a - languageName: node - linkType: hard - -"@tamagui/helpers@npm:1.121.7": - version: 1.121.7 - resolution: "@tamagui/helpers@npm:1.121.7" - dependencies: - "@tamagui/constants": 1.121.7 - "@tamagui/simple-hash": 1.121.7 - checksum: eae62f77bb0e9059e0085e13ad203128bfc79120d6a8956d4047e664f79832306c1f8e0e4782d1522bd5704a15466f2c38c0745eb8d9fc15719f2f6602af852d - languageName: node - linkType: hard - -"@tamagui/image@npm:1.121.7": - version: 1.121.7 - resolution: "@tamagui/image@npm:1.121.7" - dependencies: - "@tamagui/constants": 1.121.7 - "@tamagui/core": 1.121.7 - peerDependencies: - react: "*" - checksum: c30d25abf4d09c372d9ab41041220f5733954780ecda43e8b2234b3af0ab5f11752de4a748cfc1745f03bdb9f0de8b9277ca33184a5c3981c60ba8ad0276f62a - languageName: node - linkType: hard - -"@tamagui/label@npm:1.121.7": - version: 1.121.7 - resolution: "@tamagui/label@npm:1.121.7" - dependencies: - "@tamagui/compose-refs": 1.121.7 - "@tamagui/constants": 1.121.7 - "@tamagui/create-context": 1.121.7 - "@tamagui/focusable": 1.121.7 - "@tamagui/get-button-sized": 1.121.7 - "@tamagui/get-font-sized": 1.121.7 - "@tamagui/text": 1.121.7 - "@tamagui/web": 1.121.7 - peerDependencies: - react: "*" - react-native: "*" - checksum: c438b2901b5279bb777cd50b8e36ff4e820fef005bbcb9b7bdab28baa9650664366599aa7daf33a772a030f78093632dca72c078a49c68d2fd5793842e4fb0f7 - languageName: node - linkType: hard - -"@tamagui/linear-gradient@npm:1.121.7": - version: 1.121.7 - resolution: "@tamagui/linear-gradient@npm:1.121.7" - dependencies: - "@tamagui/core": 1.121.7 - "@tamagui/stacks": 1.121.7 - peerDependencies: - react: "*" - checksum: 8ff1469f782efbc4b37a0d663405c6da623210c9af9059ebfca65785c7ed967020b2d1926c479e42d7f3667d6c99bbffe3cbf5ba7e60010dc63512d291adbf05 - languageName: node - linkType: hard - -"@tamagui/list-item@npm:1.121.7": - version: 1.121.7 - resolution: "@tamagui/list-item@npm:1.121.7" - dependencies: - "@tamagui/font-size": 1.121.7 - "@tamagui/get-font-sized": 1.121.7 - "@tamagui/get-token": 1.121.7 - "@tamagui/helpers": 1.121.7 - "@tamagui/helpers-tamagui": 1.121.7 - "@tamagui/stacks": 1.121.7 - "@tamagui/text": 1.121.7 - "@tamagui/web": 1.121.7 - peerDependencies: - react: "*" - checksum: 1a6d5872598d76d7ef13a4320397fced395875c6192c6444e6c3c1f19049b6d4a2244ed7c8215b77fb0952e0bdc495a99b2bb74334feb66061d8ac4ca8384a88 - languageName: node - linkType: hard - -"@tamagui/normalize-css-color@npm:1.121.7": - version: 1.121.7 - resolution: "@tamagui/normalize-css-color@npm:1.121.7" - dependencies: - "@react-native/normalize-color": ^2.1.0 - checksum: d4ba5bd47d1162d70efba4a7802d3846b2f2b6dff5b71d400352ea93997753c65de4176f98537dec3f661c7ccba7711c8941eb3cb847fdd366ae17fe583224a3 - languageName: node - linkType: hard - -"@tamagui/polyfill-dev@npm:1.121.7": - version: 1.121.7 - resolution: "@tamagui/polyfill-dev@npm:1.121.7" - checksum: 83ab4e9b4922edda252dfdc4fcce882a9819af3cb88b855d822b90c9b6ce094d52d3e9a6e214b0d3cfb53b0eb5fbaea9977b93d597558649c026adb4b0c9f50d - languageName: node - linkType: hard - -"@tamagui/popover@npm:1.121.7": - version: 1.121.7 - resolution: "@tamagui/popover@npm:1.121.7" - dependencies: - "@floating-ui/react": ^0.26.24 - "@tamagui/adapt": 1.121.7 - "@tamagui/animate": 1.121.7 - "@tamagui/aria-hidden": 1.121.7 - "@tamagui/compose-refs": 1.121.7 - "@tamagui/constants": 1.121.7 - "@tamagui/core": 1.121.7 - "@tamagui/dismissable": 1.121.7 - "@tamagui/floating": 1.121.7 - "@tamagui/focus-scope": 1.121.7 - "@tamagui/helpers": 1.121.7 - "@tamagui/polyfill-dev": 1.121.7 - "@tamagui/popper": 1.121.7 - "@tamagui/portal": 1.121.7 - "@tamagui/remove-scroll": 1.121.7 - "@tamagui/scroll-view": 1.121.7 - "@tamagui/sheet": 1.121.7 - "@tamagui/stacks": 1.121.7 - "@tamagui/use-controllable-state": 1.121.7 - react-freeze: ^1.0.3 - peerDependencies: - react: "*" - checksum: 2fe0007084174fe2087389bd6a4d083f12c4a59588f003542f8b1f1321261ff912a9325b2be1046cd9055bcbcb9c7a5716364e4ae4e9cefd7eea3da30d24ec53 - languageName: node - linkType: hard - -"@tamagui/popper@npm:1.121.7": - version: 1.121.7 - resolution: "@tamagui/popper@npm:1.121.7" - dependencies: - "@tamagui/compose-refs": 1.121.7 - "@tamagui/constants": 1.121.7 - "@tamagui/core": 1.121.7 - "@tamagui/floating": 1.121.7 - "@tamagui/get-token": 1.121.7 - "@tamagui/stacks": 1.121.7 - "@tamagui/start-transition": 1.121.7 - "@tamagui/use-controllable-state": 1.121.7 - peerDependencies: - react: "*" - checksum: 5f0c5c4b19aaeb35df6264aab187c1ec03c5950c7c4de30ec2190ccb559760d3ddc0fff6fb5a054ee6e1e85009cfdda0755c00b17e9c0c3c13b330ef7d6e2075 - languageName: node - linkType: hard - -"@tamagui/portal@npm:1.121.7": - version: 1.121.7 - resolution: "@tamagui/portal@npm:1.121.7" - dependencies: - "@tamagui/constants": 1.121.7 - "@tamagui/core": 1.121.7 - "@tamagui/stacks": 1.121.7 - "@tamagui/start-transition": 1.121.7 - "@tamagui/use-did-finish-ssr": 1.121.7 - "@tamagui/use-event": 1.121.7 - checksum: f5eab38e424d2f55e809a2c031d310071589bdf5d6c30d804d87b24739c43dcb05c4d5071d86453f374e94b4a0ee58a1eb1109ee2bef14b1d45f8b452642e5ce - languageName: node - linkType: hard - -"@tamagui/progress@npm:1.121.7": - version: 1.121.7 - resolution: "@tamagui/progress@npm:1.121.7" - dependencies: - "@tamagui/compose-refs": 1.121.7 - "@tamagui/core": 1.121.7 - "@tamagui/create-context": 1.121.7 - "@tamagui/get-token": 1.121.7 - "@tamagui/helpers": 1.121.7 - "@tamagui/stacks": 1.121.7 - peerDependencies: - react: "*" - checksum: 9213bf58118878539dbb14f39d2e278c4113751caf936554e8f3ab103d8176471c6c87838d48b3412fb9b2753f8c8fde5e1059eac43a357867de82c18d23af45 - languageName: node - linkType: hard - -"@tamagui/proxy-worm@npm:1.121.7": - version: 1.121.7 - resolution: "@tamagui/proxy-worm@npm:1.121.7" - checksum: 7396230c0ac3c206a407d412b307a9ce3eb4ee8f47126961558cbdd5990d13626a5f3d28686fda81dc0046bb75cc2a74fd795f8f66375adf461b155226be41c1 - languageName: node - linkType: hard - -"@tamagui/radio-group@npm:1.121.7": - version: 1.121.7 - resolution: "@tamagui/radio-group@npm:1.121.7" - dependencies: - "@tamagui/compose-refs": 1.121.7 - "@tamagui/constants": 1.121.7 - "@tamagui/core": 1.121.7 - "@tamagui/create-context": 1.121.7 - "@tamagui/focusable": 1.121.7 - "@tamagui/get-token": 1.121.7 - "@tamagui/helpers": 1.121.7 - "@tamagui/label": 1.121.7 - "@tamagui/radio-headless": 1.121.7 - "@tamagui/roving-focus": 1.121.7 - "@tamagui/stacks": 1.121.7 - "@tamagui/use-controllable-state": 1.121.7 - "@tamagui/use-previous": 1.121.7 - peerDependencies: - react: "*" - checksum: 3091104134477a7c1d600739ba2db20a3089a6f76e0dec37f07772ddffdcd71e57fdf5b99a7b7f55426cc2082a697e2885d10bc81082fbddd95b4cfe4345f519 - languageName: node - linkType: hard - -"@tamagui/radio-headless@npm:1.121.7": - version: 1.121.7 - resolution: "@tamagui/radio-headless@npm:1.121.7" - dependencies: - "@tamagui/compose-refs": 1.121.7 - "@tamagui/constants": 1.121.7 - "@tamagui/create-context": 1.121.7 - "@tamagui/focusable": 1.121.7 - "@tamagui/helpers": 1.121.7 - "@tamagui/label": 1.121.7 - "@tamagui/use-controllable-state": 1.121.7 - "@tamagui/use-previous": 1.121.7 - peerDependencies: - react: "*" - checksum: dcf02021163594442f92f22b6eb10e7a8c9089e8b7f159d65156e93ba1a9545d08ad2ff0fe5b4c94c67178080247c858a7749490f47d296ff1a2d8ca5c0a66c8 - languageName: node - linkType: hard - -"@tamagui/react-native-media-driver@npm:1.121.7": - version: 1.121.7 - resolution: "@tamagui/react-native-media-driver@npm:1.121.7" - dependencies: - "@tamagui/web": 1.121.7 - peerDependencies: - react-native: "*" - checksum: 23bf5409fcd826e00f35bada832c2927668fa801d955a8c908d2fb43d8780301ba53e83639c870db66c24bafb3008199aee65ae81f46aa424fcb21cba9787e60 - languageName: node - linkType: hard - -"@tamagui/react-native-svg@npm:1.121.7": - version: 1.121.7 - resolution: "@tamagui/react-native-svg@npm:1.121.7" - checksum: d2170e58dbd8cdbdd21348837341bb3f60bd5735d73d18281068e3e39338ecfa0c75e477bee94ba7212402bdee0f5be172e6df1c7e2c4bd1a91d58974939478f - languageName: node - linkType: hard - -"@tamagui/react-native-use-pressable@npm:1.121.7": - version: 1.121.7 - resolution: "@tamagui/react-native-use-pressable@npm:1.121.7" - peerDependencies: - react: "*" - checksum: 120aff42765c9270c0c8959eaee4d3d4f76703b628458658e7ef1c86baeb60fda124fe83743c7dc45ce5f828cfdaff99ad118c1423233d4f930cc2946dfaad39 - languageName: node - linkType: hard - -"@tamagui/react-native-use-responder-events@npm:1.121.7": - version: 1.121.7 - resolution: "@tamagui/react-native-use-responder-events@npm:1.121.7" - peerDependencies: - react: "*" - checksum: 1f60396a47bd658bebc9159053b3183c634a68290642784ad4e12ba41911906d38d3d56eb2e9af2d06d667540eae535b3720ae041fff0cc3103c014a6e544d8c - languageName: node - linkType: hard - -"@tamagui/react-native-web-internals@npm:1.121.7": - version: 1.121.7 - resolution: "@tamagui/react-native-web-internals@npm:1.121.7" - dependencies: - "@tamagui/normalize-css-color": 1.121.7 - "@tamagui/react-native-use-pressable": 1.121.7 - "@tamagui/react-native-use-responder-events": 1.121.7 - "@tamagui/simple-hash": 1.121.7 - "@tamagui/web": 1.121.7 - checksum: c45ce9d0d178b95ad2b0107dbe54f5f5d5033b2450cfa6b488aac6253771971484969fb587d99b0335136122820f7929fd7c408bbbec445a79705acbd24ef8ec - languageName: node - linkType: hard - -"@tamagui/react-native-web-lite@npm:1.121.7": - version: 1.121.7 - resolution: "@tamagui/react-native-web-lite@npm:1.121.7" - dependencies: - "@tamagui/normalize-css-color": 1.121.7 - "@tamagui/react-native-use-pressable": 1.121.7 - "@tamagui/react-native-use-responder-events": 1.121.7 - "@tamagui/react-native-web-internals": 1.121.7 - invariant: ^2.2.4 - peerDependencies: - react: "*" - checksum: ff718534635f64e98be2ec1b2e178829a74232fa5e92948d8c4e63e0639a24d9601fce56fb86e4b45422d3560eed173eb23eaead075d85a6db5895962ed6ec12 - languageName: node - linkType: hard - -"@tamagui/remove-scroll@npm:1.121.7": - version: 1.121.7 - resolution: "@tamagui/remove-scroll@npm:1.121.7" - dependencies: - react-remove-scroll: ^2.6.0 - peerDependencies: - react: "*" - checksum: 7141059ff92146bdfc6765e8c6c0e48f8b86446f8e2b0a54fc47478d213f3d7df543ad5e42b2dffd9fa0ee1d46c2489a135e0143e84224204d54b63bf0e4ca6a - languageName: node - linkType: hard - -"@tamagui/roving-focus@npm:1.121.7": - version: 1.121.7 - resolution: "@tamagui/roving-focus@npm:1.121.7" - dependencies: - "@tamagui/collection": 1.121.7 - "@tamagui/compose-refs": 1.121.7 - "@tamagui/constants": 1.121.7 - "@tamagui/core": 1.121.7 - "@tamagui/create-context": 1.121.7 - "@tamagui/helpers": 1.121.7 - "@tamagui/use-controllable-state": 1.121.7 - "@tamagui/use-direction": 1.121.7 - "@tamagui/use-event": 1.121.7 - peerDependencies: - react: "*" - checksum: ba253456c2e12ab98d8c6a6a6be89b0108b76fb005cb000e18d4a92d116951627449316b89c37fb3fb6e45242db18b91cac49d5a3032dcb0a3f9ffcaaace7646 - languageName: node - linkType: hard - -"@tamagui/scroll-view@npm:1.121.7": - version: 1.121.7 - resolution: "@tamagui/scroll-view@npm:1.121.7" - dependencies: - "@tamagui/stacks": 1.121.7 - "@tamagui/web": 1.121.7 - peerDependencies: - react: "*" - checksum: b6460492c54991f99199ae17c9c7826445c8e4f9fa6aab2e84a5e68db083f42c2b4b11ecd1076f630eb6dffbf234ea4af5ca1988159ec738ebf072e4eaa1ec14 - languageName: node - linkType: hard - -"@tamagui/select@npm:1.121.7": - version: 1.121.7 - resolution: "@tamagui/select@npm:1.121.7" - dependencies: - "@floating-ui/react": ^0.26.24 - "@floating-ui/react-dom": ^2.1.2 - "@floating-ui/react-native": ^0.10.6 - "@tamagui/adapt": 1.121.7 - "@tamagui/animate-presence": 1.121.7 - "@tamagui/compose-refs": 1.121.7 - "@tamagui/constants": 1.121.7 - "@tamagui/core": 1.121.7 - "@tamagui/create-context": 1.121.7 - "@tamagui/dismissable": 1.121.7 - "@tamagui/focus-scope": 1.121.7 - "@tamagui/get-token": 1.121.7 - "@tamagui/helpers": 1.121.7 - "@tamagui/list-item": 1.121.7 - "@tamagui/portal": 1.121.7 - "@tamagui/remove-scroll": 1.121.7 - "@tamagui/separator": 1.121.7 - "@tamagui/sheet": 1.121.7 - "@tamagui/stacks": 1.121.7 - "@tamagui/text": 1.121.7 - "@tamagui/use-controllable-state": 1.121.7 - "@tamagui/use-debounce": 1.121.7 - "@tamagui/use-event": 1.121.7 - "@tamagui/use-previous": 1.121.7 - peerDependencies: - react: "*" - checksum: 9e2b74dd8207198c9e334f8b71bff2190fddbd8065a8e52ce72df6e1ba86bb5404bd41ccc4be8adb022f1f8bc945f40f973d085d1e116af401400c4206f80430 - languageName: node - linkType: hard - -"@tamagui/separator@npm:1.121.7": - version: 1.121.7 - resolution: "@tamagui/separator@npm:1.121.7" - dependencies: - "@tamagui/constants": 1.121.7 - "@tamagui/core": 1.121.7 - peerDependencies: - react: "*" - checksum: 9533473e830b82ffed90796475584f1ed472041e6eedd1feb61d9da24afce5d0c572a65bc29bf66b60a07c71e94cbdc1f91f98a40fb763e6bb9b2ab3eea91a6f - languageName: node - linkType: hard - -"@tamagui/shapes@npm:1.121.7": - version: 1.121.7 - resolution: "@tamagui/shapes@npm:1.121.7" - dependencies: - "@tamagui/stacks": 1.121.7 - "@tamagui/web": 1.121.7 - peerDependencies: - react: "*" - checksum: d381748609046278062ffe73aff8b8cbda3fa97d686d13d267cc50ebe693940d74a877444c004019c84b727652adda64ea4604c5617b24f872f6a02e225e513a - languageName: node - linkType: hard - -"@tamagui/sheet@npm:1.121.7": - version: 1.121.7 - resolution: "@tamagui/sheet@npm:1.121.7" - dependencies: - "@tamagui/adapt": 1.121.7 - "@tamagui/animate-presence": 1.121.7 - "@tamagui/animations-react-native": 1.121.7 - "@tamagui/compose-refs": 1.121.7 - "@tamagui/constants": 1.121.7 - "@tamagui/core": 1.121.7 - "@tamagui/create-context": 1.121.7 - "@tamagui/helpers": 1.121.7 - "@tamagui/portal": 1.121.7 - "@tamagui/remove-scroll": 1.121.7 - "@tamagui/scroll-view": 1.121.7 - "@tamagui/stacks": 1.121.7 - "@tamagui/use-constant": 1.121.7 - "@tamagui/use-controllable-state": 1.121.7 - "@tamagui/use-did-finish-ssr": 1.121.7 - "@tamagui/use-keyboard-visible": 1.121.7 - peerDependencies: - react: "*" - checksum: 74c0625242fd5e560f4f83008418be9c3ae0db6c20d14eb9ba44e3b717c64fed386c913a64cf4e3cf268ee5f9cf001103dd25d5bf6476681d4780c659babd821 - languageName: node - linkType: hard - -"@tamagui/shorthands@npm:1.121.7": - version: 1.121.7 - resolution: "@tamagui/shorthands@npm:1.121.7" - checksum: 22465c6d65500442e2199d43e812b69d581cc80aafadcb75b14d71369fe428378b0eea7fbe58fb88d0363c7fff3a2246704e74fd76b026fe496cffa180544e8c - languageName: node - linkType: hard - -"@tamagui/simple-hash@npm:1.121.7": - version: 1.121.7 - resolution: "@tamagui/simple-hash@npm:1.121.7" - checksum: 8a67d43f8201b7c402eaefef1ef8a35a1030ab7dd24be812504e8bc4ff46fc39a44aaf7ed54cafc5048c4d912fb339429ec5ef4ea53ac3d7771c34d533b08b0a - languageName: node - linkType: hard - -"@tamagui/slider@npm:1.121.7": - version: 1.121.7 - resolution: "@tamagui/slider@npm:1.121.7" - dependencies: - "@tamagui/compose-refs": 1.121.7 - "@tamagui/constants": 1.121.7 - "@tamagui/core": 1.121.7 - "@tamagui/create-context": 1.121.7 - "@tamagui/get-token": 1.121.7 - "@tamagui/helpers": 1.121.7 - "@tamagui/stacks": 1.121.7 - "@tamagui/use-controllable-state": 1.121.7 - "@tamagui/use-debounce": 1.121.7 - "@tamagui/use-direction": 1.121.7 - peerDependencies: - react: "*" - checksum: f887c8d32dd387181566233a74dc0456534dbd85de1c675e2f1038e33507911fb9a8f150ccae75ec7a6e67df52d3d9932048528a3515a0d40d44588b67c37ee2 - languageName: node - linkType: hard - -"@tamagui/stacks@npm:1.121.7": - version: 1.121.7 - resolution: "@tamagui/stacks@npm:1.121.7" - dependencies: - "@tamagui/core": 1.121.7 - peerDependencies: - react: "*" - checksum: e9b6ac5be42fa428bb883083d67cc42215770c8e011aebf6e93cdffb03261c5bc946c61c5a902291adc24ffde7c1272b018b603dc9f30a48be2160ec57a7401e - languageName: node - linkType: hard - -"@tamagui/start-transition@npm:1.121.7": - version: 1.121.7 - resolution: "@tamagui/start-transition@npm:1.121.7" - checksum: 7b48d48e887311d22dc3cf79b2701462e44dd4d12d80ad8c25a3cdb366c0a7f99371c416a65e1810430299935aca764df62bc753737f9a32915653de5bcdd367 - languageName: node - linkType: hard - -"@tamagui/static@npm:1.121.7": - version: 1.121.7 - resolution: "@tamagui/static@npm:1.121.7" - dependencies: - "@babel/core": ^7.25.2 - "@babel/generator": ^7.25.5 - "@babel/helper-plugin-utils": ^7.24.8 - "@babel/parser": ^7.25.4 - "@babel/plugin-transform-react-jsx": ^7.25.2 - "@babel/runtime": ^7.25.4 - "@babel/traverse": ^7.25.4 - "@babel/types": ^7.25.4 - "@tamagui/build": 1.121.7 - "@tamagui/cli-color": 1.121.7 - "@tamagui/config-default": 1.121.7 - "@tamagui/core": 1.121.7 - "@tamagui/fake-react-native": 1.121.7 - "@tamagui/generate-themes": 1.121.7 - "@tamagui/helpers": 1.121.7 - "@tamagui/helpers-node": 1.121.7 - "@tamagui/proxy-worm": 1.121.7 - "@tamagui/react-native-web-internals": 1.121.7 - "@tamagui/react-native-web-lite": 1.121.7 - "@tamagui/shorthands": 1.121.7 - "@tamagui/types": 1.121.7 - babel-literal-to-ast: ^2.1.0 - browserslist: ^4.22.2 - check-dependency-version-consistency: ^4.1.0 - esbuild: ^0.24.0 - esbuild-register: ^3.6.0 - fast-glob: ^3.2.11 - find-cache-dir: ^3.3.2 - find-root: ^1.1.0 - fs-extra: ^11.2.0 - invariant: ^2.2.4 - js-yaml: ^4.1.0 - lodash: ^4.17.21 - react-native-web: ^0.19.0 - peerDependencies: - react: "*" - checksum: f39b68a313faf6a4a0e1daa49798a68b3ca86551947da28611b08684871fb660d3dd861ed41c1be16411f7707a85b6cfd20ef619b880d5c82db984768fb48a77 - languageName: node - linkType: hard - -"@tamagui/switch-headless@npm:1.121.7": - version: 1.121.7 - resolution: "@tamagui/switch-headless@npm:1.121.7" - dependencies: - "@tamagui/compose-refs": 1.121.7 - "@tamagui/constants": 1.121.7 - "@tamagui/helpers": 1.121.7 - "@tamagui/label": 1.121.7 - "@tamagui/use-previous": 1.121.7 - peerDependencies: - react: "*" - checksum: ddd2a3fdeb65373329c18fbad3c7ad4ec68811815d3d09a8e2acad3549687eaaaae09d3005ac4b8dd89f59dc26df798084d7d75cc1344c1ab31ac73870f7247a - languageName: node - linkType: hard - -"@tamagui/switch@npm:1.121.7": - version: 1.121.7 - resolution: "@tamagui/switch@npm:1.121.7" - dependencies: - "@tamagui/compose-refs": 1.121.7 - "@tamagui/constants": 1.121.7 - "@tamagui/core": 1.121.7 - "@tamagui/focusable": 1.121.7 - "@tamagui/get-token": 1.121.7 - "@tamagui/helpers": 1.121.7 - "@tamagui/label": 1.121.7 - "@tamagui/stacks": 1.121.7 - "@tamagui/switch-headless": 1.121.7 - "@tamagui/use-controllable-state": 1.121.7 - "@tamagui/use-previous": 1.121.7 - peerDependencies: - react: "*" - checksum: 2e424ef136c1f8ba20888a2c3b82d1c41332593d29efe6b8aa8f062d71000814e813207f1269b657c85b23f6df83e288310e488c5cc8e30fa8f65cf5c3550cae - languageName: node - linkType: hard - -"@tamagui/tabs@npm:1.121.7": - version: 1.121.7 - resolution: "@tamagui/tabs@npm:1.121.7" - dependencies: - "@tamagui/compose-refs": 1.121.7 - "@tamagui/constants": 1.121.7 - "@tamagui/create-context": 1.121.7 - "@tamagui/get-button-sized": 1.121.7 - "@tamagui/group": 1.121.7 - "@tamagui/helpers": 1.121.7 - "@tamagui/roving-focus": 1.121.7 - "@tamagui/stacks": 1.121.7 - "@tamagui/use-controllable-state": 1.121.7 - "@tamagui/use-direction": 1.121.7 - "@tamagui/web": 1.121.7 - peerDependencies: - react: "*" - checksum: 3dbf63203a6c81ab7a963e818beb3bac1c791a1ec50c96fb7200ca884cb056234bc5bd280f39d0518151adb3c73fd71ff7c3f5b4be7cc35e9c7cd801bab4739b - languageName: node - linkType: hard - -"@tamagui/text@npm:1.121.7": - version: 1.121.7 - resolution: "@tamagui/text@npm:1.121.7" - dependencies: - "@tamagui/get-font-sized": 1.121.7 - "@tamagui/helpers-tamagui": 1.121.7 - "@tamagui/web": 1.121.7 - peerDependencies: - react: "*" - checksum: b96f59570bc9dd789badb50a0b1857ad8137b7e3e2185e30a56952617583a03d7129b0d6ca22825d0a10f4870d8e6cf8bdf5fc2f735c3330487d0ca9ad1bd036 - languageName: node - linkType: hard - -"@tamagui/theme-base@npm:1.121.7": - version: 1.121.7 - resolution: "@tamagui/theme-base@npm:1.121.7" - checksum: 6ee8ffbd5ff35b9ffd6038355809f9551b8f8fd6a1db848ab6c132e5de03e7808f0dc451047ed0701d0b0ffcbcab8d6e0d4f9664fde2ec25f39f093732a494a6 - languageName: node - linkType: hard - -"@tamagui/theme-builder@npm:1.121.7": - version: 1.121.7 - resolution: "@tamagui/theme-builder@npm:1.121.7" - dependencies: - "@tamagui/create-theme": 1.121.7 - color2k: ^2.0.2 - checksum: fc0c6548a631b0e88c7f46abeb089b0e6d5da5dea7a529d56bc35e88a06bf547a4065f19b0621af33eb33e355516ab0ceb71e41905cc15ecc2dbb3e15018348e - languageName: node - linkType: hard - -"@tamagui/theme@npm:1.121.7": - version: 1.121.7 - resolution: "@tamagui/theme@npm:1.121.7" - dependencies: - "@tamagui/constants": 1.121.7 - "@tamagui/web": 1.121.7 - peerDependencies: - react: "*" - checksum: 72efd79167e4f6acf51c467bf0d527e0c15e9108da92de1b40b8c6056e6de5409f4405eaa4453998c47ef05bfe0eb8d59ac4a9cfe4c7a2970151327038a59766 - languageName: node - linkType: hard - -"@tamagui/timer@npm:1.121.7": - version: 1.121.7 - resolution: "@tamagui/timer@npm:1.121.7" - checksum: 73ae99aae97205c6478ce83d1ac12e1c7142df487a13050feb98891d2488854f96c55a186590429de3f1922fe34042463ff36fe6a60b5a35b3cc011d6aaa620f - languageName: node - linkType: hard - -"@tamagui/toggle-group@npm:1.121.7": - version: 1.121.7 - resolution: "@tamagui/toggle-group@npm:1.121.7" - dependencies: - "@tamagui/constants": 1.121.7 - "@tamagui/create-context": 1.121.7 - "@tamagui/focusable": 1.121.7 - "@tamagui/font-size": 1.121.7 - "@tamagui/get-token": 1.121.7 - "@tamagui/group": 1.121.7 - "@tamagui/helpers": 1.121.7 - "@tamagui/helpers-tamagui": 1.121.7 - "@tamagui/roving-focus": 1.121.7 - "@tamagui/stacks": 1.121.7 - "@tamagui/use-controllable-state": 1.121.7 - "@tamagui/use-direction": 1.121.7 - "@tamagui/web": 1.121.7 - peerDependencies: - react: "*" - checksum: 17faa5ad5b27bd1b584f202e2cbbd73bf24dab0a49e54bca8cd3cc992dc0fde80e608c2eeb66c18085edf3e0ac8a61de805d51634f7d0f3584978d0aa717a5ce - languageName: node - linkType: hard - -"@tamagui/tooltip@npm:1.121.7": - version: 1.121.7 - resolution: "@tamagui/tooltip@npm:1.121.7" - dependencies: - "@floating-ui/react": ^0.26.24 - "@tamagui/compose-refs": 1.121.7 - "@tamagui/core": 1.121.7 - "@tamagui/create-context": 1.121.7 - "@tamagui/floating": 1.121.7 - "@tamagui/get-token": 1.121.7 - "@tamagui/helpers": 1.121.7 - "@tamagui/polyfill-dev": 1.121.7 - "@tamagui/popover": 1.121.7 - "@tamagui/popper": 1.121.7 - "@tamagui/stacks": 1.121.7 - "@tamagui/text": 1.121.7 - "@tamagui/use-controllable-state": 1.121.7 - peerDependencies: - react: "*" - checksum: f560d4b9e52aafd65dc0afa204c59bea2a649d0f0d3912b795e2efcd2111f369be580875eb74b6b1cef9bf95e5f2f15c1f01e2b12b989c9a23df01d8cd6cf0d8 - languageName: node - linkType: hard - -"@tamagui/types@npm:1.121.7": - version: 1.121.7 - resolution: "@tamagui/types@npm:1.121.7" - checksum: 7013c0f6c8b94a34b143dd98ecc062257e1189113c070a8ee2a2426f202a9858eb916115af3072d7f3d96da85fabe06db57fcdfc5beac46b0f8c6ee257e08ae6 - languageName: node - linkType: hard - -"@tamagui/use-callback-ref@npm:1.121.7": - version: 1.121.7 - resolution: "@tamagui/use-callback-ref@npm:1.121.7" - checksum: 0a958019d59824d4866ce8bfd62247daf337afa57533dc78d4896a27c9d1e33bd3966ce4af3533b9d4925087b6b894ea857a392a0253c720d1211c2efa2b2046 - languageName: node - linkType: hard - -"@tamagui/use-constant@npm:1.121.7": - version: 1.121.7 - resolution: "@tamagui/use-constant@npm:1.121.7" - peerDependencies: - react: "*" - checksum: 834a0f5ea58971cd732098eca4600f666f7d8bea7b609202c11018c05218a234e30401b8145a26fc3dafbb8fba7a0e8e9c2b09dcee1cf4bca97cb3fbee611b8b - languageName: node - linkType: hard - -"@tamagui/use-controllable-state@npm:1.121.7": - version: 1.121.7 - resolution: "@tamagui/use-controllable-state@npm:1.121.7" - dependencies: - "@tamagui/start-transition": 1.121.7 - "@tamagui/use-event": 1.121.7 - peerDependencies: - react: "*" - checksum: d11447ce6e0d42f874bc0545598bebac8260abbb0da00a4f7c3dbcd2cab26efb6531379af8c0e7b434c15ccdc24d55752642200cbab59a888e0883e0f9353f48 - languageName: node - linkType: hard - -"@tamagui/use-debounce@npm:1.121.7": - version: 1.121.7 - resolution: "@tamagui/use-debounce@npm:1.121.7" - peerDependencies: - react: "*" - checksum: e486e5cfe01137629d77a0b383b7e34d5313d3f2f5ee645c1126349b7d5b15f3adfd68dd107d08279dc0a64616072bd2ceb4aad05bf3357f1e334575ef36901e - languageName: node - linkType: hard - -"@tamagui/use-did-finish-ssr@npm:1.121.7": - version: 1.121.7 - resolution: "@tamagui/use-did-finish-ssr@npm:1.121.7" - peerDependencies: - react: "*" - checksum: 35d40a83160898504157c6aad0a222e305ecdd380fac29b429fa163b53b3a7072adacd94ce0bbe8293105ccf87a3bbdb2057fa54698b5949fa74d81a77a678b1 - languageName: node - linkType: hard - -"@tamagui/use-direction@npm:1.121.7": - version: 1.121.7 - resolution: "@tamagui/use-direction@npm:1.121.7" - peerDependencies: - react: "*" - checksum: 0fe86e913dfc0ce2c7dd5dbb9b7851b0357a143ff11a1951523f10ed305a6702316f4ca94f19ec959cb2e66e3e2be0473b36b750ab3c4a881b186295a671e2e6 - languageName: node - linkType: hard - -"@tamagui/use-escape-keydown@npm:1.121.7": - version: 1.121.7 - resolution: "@tamagui/use-escape-keydown@npm:1.121.7" - dependencies: - "@tamagui/use-callback-ref": 1.121.7 - checksum: dcc2de1c89125d42c643ff75fc78ce6202a735659734f73e32d36d498ee9546cf01e6bac3ef7d61b9d415cd85f57a36e983930c47ab01d6e36c4c7b8e147368a - languageName: node - linkType: hard - -"@tamagui/use-event@npm:1.121.7": - version: 1.121.7 - resolution: "@tamagui/use-event@npm:1.121.7" - dependencies: - "@tamagui/constants": 1.121.7 - peerDependencies: - react: "*" - checksum: 35cb8936d2c2765db6303cab3ec2272b92393f67ebd738c5084dcfbfc2b67e43e1f1fc3ad91868beca4e36b83945394beea723c0f675bce96c89b2aaf05279d7 - languageName: node - linkType: hard - -"@tamagui/use-force-update@npm:1.121.7": - version: 1.121.7 - resolution: "@tamagui/use-force-update@npm:1.121.7" - peerDependencies: - react: "*" - checksum: a9df4f6c62cbd9a6ca7fb4785f76ab43a547c90bc7501113a13de05b1ea4529c7bc1d789f069515c371421683f547fa34893b6baa8095846b34a6f73831e023b - languageName: node - linkType: hard - -"@tamagui/use-keyboard-visible@npm:1.121.7": - version: 1.121.7 - resolution: "@tamagui/use-keyboard-visible@npm:1.121.7" - peerDependencies: - react: "*" - checksum: 75d7ab7066f15fc5dc5f1ea98952abf7fd6bbe322c2da4ab4d43f070bd5cbfd56a909cf37e9c5e705ef8ca788b6a4ff5ffcfa4a526964b3a91d6d06256edcfb0 - languageName: node - linkType: hard - -"@tamagui/use-presence@npm:1.121.7": - version: 1.121.7 - resolution: "@tamagui/use-presence@npm:1.121.7" - dependencies: - "@tamagui/web": 1.121.7 - peerDependencies: - react: "*" - checksum: 19385bfd4582a67a8428cd98596bebbec5faee76bd4acb27a68a99eace51cfe36c31f51f5f63a721cb24d0c2f6344b97be798c3c1a97a42f912623582a8ea700 - languageName: node - linkType: hard - -"@tamagui/use-previous@npm:1.121.7": - version: 1.121.7 - resolution: "@tamagui/use-previous@npm:1.121.7" - checksum: 0181d7c5a87a3a8d4271951b83a615c6c37fc4c7a9ed533e5eb2bdaf569707aeb629f894bc0379fd384496084626513accde39514fb17737f8c314cc74a32163 - languageName: node - linkType: hard - -"@tamagui/use-window-dimensions@npm:1.121.7": - version: 1.121.7 - resolution: "@tamagui/use-window-dimensions@npm:1.121.7" - dependencies: - "@tamagui/constants": 1.121.7 - peerDependencies: - react: "*" - checksum: 2558f464d7155d68a7975cccf104014d760c0ef56f444e5aca73a5f9626dc72f6d8ca2f85993e0bf88bc2b8c7c7e3df0ac273c7d5d52504f8e934147acc7f260 - languageName: node - linkType: hard - -"@tamagui/visually-hidden@npm:1.121.7": - version: 1.121.7 - resolution: "@tamagui/visually-hidden@npm:1.121.7" - dependencies: - "@tamagui/web": 1.121.7 - peerDependencies: - react: "*" - checksum: 99510a8dc9df7372d80686a43fbd088b34a29761c34d607762dc318a237882e09dda936071c33f3b65fef0b4d5b56d6c44ab5d6591fb499b0417ded21f9e23ca - languageName: node - linkType: hard - -"@tamagui/web@npm:1.121.7": - version: 1.121.7 - resolution: "@tamagui/web@npm:1.121.7" - dependencies: - "@tamagui/compose-refs": 1.121.7 - "@tamagui/constants": 1.121.7 - "@tamagui/helpers": 1.121.7 - "@tamagui/normalize-css-color": 1.121.7 - "@tamagui/timer": 1.121.7 - "@tamagui/types": 1.121.7 - "@tamagui/use-did-finish-ssr": 1.121.7 - "@tamagui/use-event": 1.121.7 - "@tamagui/use-force-update": 1.121.7 - peerDependencies: - react: "*" - react-dom: "*" - checksum: aa769a3cdd702ab4364088d6fa6a446901167fbcf9dcf7c862f2eac2c5e07c615cdff93c060055e4860040bfc187cdb1e27c231387a324cecd2ffab3502f8b82 - languageName: node - linkType: hard - -"@tanstack/query-async-storage-persister@npm:5.51.21": - version: 5.51.21 - resolution: "@tanstack/query-async-storage-persister@npm:5.51.21" - dependencies: - "@tanstack/query-persist-client-core": 5.51.21 - checksum: a1a8367c6d41b0d6119aa42d7d6b9f80a4fbf2c3ad5b76d3c2ff164910b68cc20ef392f9ff8cb443ab8959d7420e49e2f4a9f1057a3f535bfb092bde077e4135 - languageName: node - linkType: hard - -"@tanstack/query-core@npm:5.51.16": - version: 5.51.16 - resolution: "@tanstack/query-core@npm:5.51.16" - checksum: e1de4cc3917ae5867d22a48c1225ff5a81491b26b8e5e77f60ea69fbde187ad3a283342944eabd5273c9a398d39182f6c65cd64c399e59ac81316cc3084f6f52 - languageName: node - linkType: hard - -"@tanstack/query-core@npm:5.51.21": - version: 5.51.21 - resolution: "@tanstack/query-core@npm:5.51.21" - checksum: a602e70bfbfa1fa28333be8c1b9ac9c9b97937b236d3997a757079ae04086fe59c2688cb6406fd82dcf9ef07f73e7a4ba1d373040f6cad340e1f64bceafe0e07 - languageName: node - linkType: hard - -"@tanstack/query-persist-client-core@npm:5.51.21": - version: 5.51.21 - resolution: "@tanstack/query-persist-client-core@npm:5.51.21" - dependencies: - "@tanstack/query-core": 5.51.21 - checksum: 239b1c18b648fccce83cc7ea68392257c83da9719e77f814f464fc85a2968dd2f31b9ec0edd1b35dd1552c463bca2726559ffa3d0a3297b3577bfca80a8f576a - languageName: node - linkType: hard - -"@tanstack/react-query-persist-client@npm:5.51.23": - version: 5.51.23 - resolution: "@tanstack/react-query-persist-client@npm:5.51.23" - dependencies: - "@tanstack/query-persist-client-core": 5.51.21 - peerDependencies: - "@tanstack/react-query": ^5.51.23 - react: ^18 || ^19 - checksum: 1756b08c44c47e398ca24fe9661de38d6ca9a8945b84a471261eace83acf37dd667431457a79874589fcd08500291c6b7f24a3a1f6f3112b21afc7e3f9f34b93 - languageName: node - linkType: hard - -"@tanstack/react-query@npm:5.51.16": - version: 5.51.16 - resolution: "@tanstack/react-query@npm:5.51.16" - dependencies: - "@tanstack/query-core": 5.51.16 - peerDependencies: - react: ^18.0.0 - checksum: 7f7d21b398d645f6d1f85616fc76081b2558fb3f9b13eb2f46f441a4449caaa16b1f199b5bed164a366b4f49d0fd7db11731b42115a3bf3d49a081dee813cc62 - languageName: node - linkType: hard - -"@tanstack/react-query@patch:@tanstack/react-query@npm%3A5.51.16#./.yarn/patches/@tanstack-react-query-npm-5.51.16-8fa6414eca.patch::locator=universe%40workspace%3A.": - version: 5.51.16 - resolution: "@tanstack/react-query@patch:@tanstack/react-query@npm%3A5.51.16#./.yarn/patches/@tanstack-react-query-npm-5.51.16-8fa6414eca.patch::version=5.51.16&hash=66b6b9&locator=universe%40workspace%3A." - dependencies: - "@tanstack/query-core": 5.51.16 - peerDependencies: - react: ^18.0.0 - checksum: 41395a282cb7ad167bdb6351c1eaa7391f0072eb238228187414bc5a08847c161759908cf8140000d43d5d1f2afdec04abf77c0e0ae9d5c51d44b117c5879062 - languageName: node - linkType: hard - -"@tanstack/react-table@npm:8.10.7": - version: 8.10.7 - resolution: "@tanstack/react-table@npm:8.10.7" - dependencies: - "@tanstack/table-core": 8.10.7 - peerDependencies: - react: ">=16" - react-dom: ">=16" - checksum: f8f19ae3ad8531e0f3cb838b61213d9acd0b64b27d1a8a05a699e6ed50e25c9d3c9478ae3f6d20883288f601eec06e8264fac9503b36122471c2f8778782e1e2 - languageName: node - linkType: hard - -"@tanstack/table-core@npm:8.10.7": - version: 8.10.7 - resolution: "@tanstack/table-core@npm:8.10.7" - checksum: 2a364917e7ab051ef3f33d6f18e5e1ddb75cfed4b5ee0e2b9c74a8cb72d3b86cdd4ffbab67565c68b4333f761b6fde9a7215196387a9a3b3d5811119d8859bad - languageName: node - linkType: hard - -"@testing-library/dom@npm:10.4.0": - version: 10.4.0 - resolution: "@testing-library/dom@npm:10.4.0" - dependencies: - "@babel/code-frame": ^7.10.4 - "@babel/runtime": ^7.12.5 - "@types/aria-query": ^5.0.1 - aria-query: 5.3.0 - chalk: ^4.1.0 - dom-accessibility-api: ^0.5.9 - lz-string: ^1.5.0 - pretty-format: ^27.0.2 - checksum: bb128b90be0c8cd78c5f5e67aa45f53de614cc048a2b50b230e736ec710805ac6c73375af354b83c74d710b3928d52b83a273a4cb89de4eb3efe49e91e706837 - languageName: node - linkType: hard - -"@testing-library/dom@npm:^7.11.0": - version: 7.31.2 - resolution: "@testing-library/dom@npm:7.31.2" - dependencies: - "@babel/code-frame": ^7.10.4 - "@babel/runtime": ^7.12.5 - "@types/aria-query": ^4.2.0 - aria-query: ^4.2.2 - chalk: ^4.1.0 - dom-accessibility-api: ^0.5.6 - lz-string: ^1.4.4 - pretty-format: ^26.6.2 - checksum: 54fbedd1ecdfe1d47be2e592b98d18b2ab9d7e731f57231caf9b152593fe7329fe5ebe219e0e5d1e0df5b1ab803121cb8acd8b73bd1fb292bfdc2c55663eb01d - languageName: node - linkType: hard - -"@testing-library/jest-dom@npm:6.5.0": - version: 6.5.0 - resolution: "@testing-library/jest-dom@npm:6.5.0" - dependencies: - "@adobe/css-tools": ^4.4.0 - aria-query: ^5.0.0 - chalk: ^3.0.0 - css.escape: ^1.5.1 - dom-accessibility-api: ^0.6.3 - lodash: ^4.17.21 - redent: ^3.0.0 - checksum: c2d14103ebe3358852ec527ff7512f64207a39932b2f7b6dff7e73ba91296b01a71bad9a9584b6ee010681380a906c1740af50470adc6db660e1c7585d012ebf - languageName: node - linkType: hard - -"@testing-library/jest-dom@npm:6.6.3": - version: 6.6.3 - resolution: "@testing-library/jest-dom@npm:6.6.3" - dependencies: - "@adobe/css-tools": ^4.4.0 - aria-query: ^5.0.0 - chalk: ^3.0.0 - css.escape: ^1.5.1 - dom-accessibility-api: ^0.6.3 - lodash: ^4.17.21 - redent: ^3.0.0 - checksum: c1dc4260b05309a0084416639006cd105849acc5b102bef682a3b19bd6fce07ff6762085fc7f2599546c995a2fc66fdb1d70e50e22a634a0098524056cc9e511 - languageName: node - linkType: hard - -"@testing-library/jest-native@npm:5.4.3": - version: 5.4.3 - resolution: "@testing-library/jest-native@npm:5.4.3" - dependencies: - chalk: ^4.1.2 - jest-diff: ^29.0.1 - jest-matcher-utils: ^29.0.1 - pretty-format: ^29.0.3 - redent: ^3.0.0 - peerDependencies: - react: ">=16.0.0" - react-native: ">=0.59" - react-test-renderer: ">=16.0.0" - checksum: 2a4ebfeff09523860771cfddac6fcc3faa2f855dc63255b9efc016e727132320f16f935cec9717d6d79cfa6715fce6ded877215c8ec85d236a5c3136a65b1020 - languageName: node - linkType: hard - -"@testing-library/react-hooks@npm:8.0.1": - version: 8.0.1 - resolution: "@testing-library/react-hooks@npm:8.0.1" - dependencies: - "@babel/runtime": ^7.12.5 - react-error-boundary: ^3.1.0 - peerDependencies: - "@types/react": ^16.9.0 || ^17.0.0 - react: ^16.9.0 || ^17.0.0 - react-dom: ^16.9.0 || ^17.0.0 - react-test-renderer: ^16.9.0 || ^17.0.0 - peerDependenciesMeta: - "@types/react": - optional: true - react-dom: - optional: true - react-test-renderer: - optional: true - checksum: 7fe44352e920deb5cb1876f80d64e48615232072c9d5382f1e0284b3aab46bb1c659a040b774c45cdf084a5257b8fe463f7e08695ad8480d8a15635d4d3d1f6d - languageName: node - linkType: hard - -"@testing-library/react-native@npm:13.0.0": - version: 13.0.0 - resolution: "@testing-library/react-native@npm:13.0.0" - dependencies: - jest-matcher-utils: ^29.7.0 - pretty-format: ^29.7.0 - redent: ^3.0.0 - peerDependencies: - jest: ">=29.0.0" - react: ">=18.2.0" - react-native: ">=0.71" - react-test-renderer: ">=18.2.0" - peerDependenciesMeta: - jest: - optional: true - checksum: e49f25ed7c615d34324af8c342ee47dd85f4d6b5bea33a52510962dc4aa9c3d6d71709dbc57d422de0a69afa7521739b3d4050d376d261a89bdf49faf923621d - languageName: node - linkType: hard - -"@testing-library/react@npm:16.1.0": - version: 16.1.0 - resolution: "@testing-library/react@npm:16.1.0" - dependencies: - "@babel/runtime": ^7.12.5 - peerDependencies: - "@testing-library/dom": ^10.0.0 - "@types/react": ^18.0.0 || ^19.0.0 - "@types/react-dom": ^18.0.0 || ^19.0.0 - react: ^18.0.0 || ^19.0.0 - react-dom: ^18.0.0 || ^19.0.0 - peerDependenciesMeta: - "@types/react": - optional: true - "@types/react-dom": - optional: true - checksum: 5dc8e7abda23d108c29f43cdacd43fad750e981ee87ee8902fb349a2683f2f774ef1136f2d3ef3d9efb87e8b04426c43d7b46e95511cd7c9d37b10c3bdd3e9e2 - languageName: node - linkType: hard - -"@testing-library/user-event@npm:14.5.1": - version: 14.5.1 - resolution: "@testing-library/user-event@npm:14.5.1" - peerDependencies: - "@testing-library/dom": ">=7.21.4" - checksum: 3e6bc9fd53dfe2f3648190193ed2fd4bca2a1bfb47f68810df3b33f05412526e5fd5c4ef9dc5375635e0f4cdf1859916867b597eed22bda1321e04242ea6c519 - languageName: node - linkType: hard - -"@testing-library/user-event@npm:14.5.2": - version: 14.5.2 - resolution: "@testing-library/user-event@npm:14.5.2" - peerDependencies: - "@testing-library/dom": ">=7.21.4" - checksum: d76937dffcf0082fbf3bb89eb2b81a31bf5448048dd61c33928c5f10e33a58e035321d39145cefd469bb5a499c68a5b4086b22f1a44e3e7c7e817dc5f6782867 - languageName: node - linkType: hard - -"@tootallnate/once@npm:2": - version: 2.0.0 - resolution: "@tootallnate/once@npm:2.0.0" - checksum: ad87447820dd3f24825d2d947ebc03072b20a42bfc96cbafec16bff8bbda6c1a81fcb0be56d5b21968560c5359a0af4038a68ba150c3e1694fe4c109a063bed8 - languageName: node - linkType: hard - -"@tootallnate/quickjs-emscripten@npm:^0.23.0": - version: 0.23.0 - resolution: "@tootallnate/quickjs-emscripten@npm:0.23.0" - checksum: c350a2947ffb80b22e14ff35099fd582d1340d65723384a0fd0515e905e2534459ad2f301a43279a37308a27c99273c932e64649abd57d0bb3ca8c557150eccc - languageName: node - linkType: hard - -"@trysound/sax@npm:0.2.0": - version: 0.2.0 - resolution: "@trysound/sax@npm:0.2.0" - checksum: 11226c39b52b391719a2a92e10183e4260d9651f86edced166da1d95f39a0a1eaa470e44d14ac685ccd6d3df7e2002433782872c0feeb260d61e80f21250e65c - languageName: node - linkType: hard - -"@ts-morph/common@npm:~0.24.0": - version: 0.24.0 - resolution: "@ts-morph/common@npm:0.24.0" - dependencies: - fast-glob: ^3.3.2 - minimatch: ^9.0.4 - mkdirp: ^3.0.1 - path-browserify: ^1.0.1 - checksum: 793bc8a47c93ab55c6c036f94480d3b0e948661aef4bb7dbc29279b1dda2fc4fce809a88e221537867a313541842e12d1ecbd32b4769688abe1303807ec09db6 - languageName: node - linkType: hard - -"@tsconfig/node10@npm:^1.0.7": - version: 1.0.9 - resolution: "@tsconfig/node10@npm:1.0.9" - checksum: a33ae4dc2a621c0678ac8ac4bceb8e512ae75dac65417a2ad9b022d9b5411e863c4c198b6ba9ef659e14b9fb609bbec680841a2e84c1172df7a5ffcf076539df - languageName: node - linkType: hard - -"@tsconfig/node12@npm:^1.0.7": - version: 1.0.11 - resolution: "@tsconfig/node12@npm:1.0.11" - checksum: 5ce29a41b13e7897a58b8e2df11269c5395999e588b9a467386f99d1d26f6c77d1af2719e407621412520ea30517d718d5192a32403b8dfcc163bf33e40a338a - languageName: node - linkType: hard - -"@tsconfig/node14@npm:^1.0.0": - version: 1.0.3 - resolution: "@tsconfig/node14@npm:1.0.3" - checksum: 19275fe80c4c8d0ad0abed6a96dbf00642e88b220b090418609c4376e1cef81bf16237bf170ad1b341452feddb8115d8dd2e5acdfdea1b27422071163dc9ba9d - languageName: node - linkType: hard - -"@tsconfig/node16@npm:^1.0.2": - version: 1.0.3 - resolution: "@tsconfig/node16@npm:1.0.3" - checksum: 3a8b657dd047495b7ad23437d6afd20297ce90380ff0bdee93fc7d39a900dbd8d9e26e53ff6b465e7967ce2adf0b218782590ce9013285121e6a5928fbd6819f - languageName: node - linkType: hard - -"@typechain/ethers-v5@npm:7.2.0": - version: 7.2.0 - resolution: "@typechain/ethers-v5@npm:7.2.0" - dependencies: - lodash: ^4.17.15 - ts-essentials: ^7.0.1 - peerDependencies: - "@ethersproject/abi": ^5.0.0 - "@ethersproject/bytes": ^5.0.0 - "@ethersproject/providers": ^5.0.0 - ethers: ^5.1.3 - typechain: ^5.0.0 - typescript: ">=4.0.0" - checksum: 23c7bcb6ef3582fe7ec32dec26bd5067a751b7e3b88ece0b98b2c4bb9623ac074f079ebe3dbcdf57f7e659d8d3a3f018105bd660806f6e7bdafa0dc56c5de450 - languageName: node - linkType: hard - -"@types/aria-query@npm:^4.2.0": - version: 4.2.2 - resolution: "@types/aria-query@npm:4.2.2" - checksum: 6f2ce11d91e2d665f3873258db19da752d91d85d3679eb5efcdf9c711d14492287e1e4eb52613b28e60375841a9e428594e745b68436c963d8bad4bf72188df3 - languageName: node - linkType: hard - -"@types/aria-query@npm:^5.0.1": - version: 5.0.4 - resolution: "@types/aria-query@npm:5.0.4" - checksum: ad8b87e4ad64255db5f0a73bc2b4da9b146c38a3a8ab4d9306154334e0fc67ae64e76bfa298eebd1e71830591fb15987e5de7111bdb36a2221bdc379e3415fb0 - languageName: node - linkType: hard - -"@types/array.prototype.flat@npm:1.2.5": - version: 1.2.5 - resolution: "@types/array.prototype.flat@npm:1.2.5" - checksum: 159ed23d9a1c0bba0e854f2e45f214c599eb411389ce2b624524015a7671296e46870a17621a5eb41704eb069e43a9419a666f5d756682b529aee2439ae7d170 - languageName: node - linkType: hard - -"@types/array.prototype.flatmap@npm:1.2.6": - version: 1.2.6 - resolution: "@types/array.prototype.flatmap@npm:1.2.6" - checksum: ee09dde552243eb97e9c368b942b3b290790d02feb76922898066b3980eb333d8602b62485a5e7a04d51d0a6295961b05ab48c5623111900944c3e075a180752 - languageName: node - linkType: hard - -"@types/babel__core@npm:^7.0.0, @types/babel__core@npm:^7.1.14, @types/babel__core@npm:^7.18.0": - version: 7.20.5 - resolution: "@types/babel__core@npm:7.20.5" - dependencies: - "@babel/parser": ^7.20.7 - "@babel/types": ^7.20.7 - "@types/babel__generator": "*" - "@types/babel__template": "*" - "@types/babel__traverse": "*" - checksum: a3226f7930b635ee7a5e72c8d51a357e799d19cbf9d445710fa39ab13804f79ab1a54b72ea7d8e504659c7dfc50675db974b526142c754398d7413aa4bc30845 - languageName: node - linkType: hard - -"@types/babel__generator@npm:*": - version: 7.6.4 - resolution: "@types/babel__generator@npm:7.6.4" - dependencies: - "@babel/types": ^7.0.0 - checksum: 20effbbb5f8a3a0211e95959d06ae70c097fb6191011b73b38fe86deebefad8e09ee014605e0fd3cdaedc73d158be555866810e9166e1f09e4cfd880b874dcb0 - languageName: node - linkType: hard - -"@types/babel__template@npm:*": - version: 7.4.1 - resolution: "@types/babel__template@npm:7.4.1" - dependencies: - "@babel/parser": ^7.1.0 - "@babel/types": ^7.0.0 - checksum: 649fe8b42c2876be1fd28c6ed9b276f78152d5904ec290b6c861d9ef324206e0a5c242e8305c421ac52ecf6358fa7e32ab7a692f55370484825c1df29b1596ee - languageName: node - linkType: hard - -"@types/babel__traverse@npm:*, @types/babel__traverse@npm:^7.0.6, @types/babel__traverse@npm:^7.18.0": - version: 7.20.6 - resolution: "@types/babel__traverse@npm:7.20.6" - dependencies: - "@babel/types": ^7.20.7 - checksum: 2bdc65eb62232c2d5c1086adeb0c31e7980e6fd7e50a3483b4a724a1a1029c84d9cb59749cf8de612f9afa2bc14c85b8f50e64e21f8a4398fa77eb9059a4283c - languageName: node - linkType: hard - -"@types/bn.js@npm:^4.11.3": - version: 4.11.6 - resolution: "@types/bn.js@npm:4.11.6" - dependencies: - "@types/node": "*" - checksum: 7f66f2c7b7b9303b3205a57184261974b114495736b77853af5b18d857c0b33e82ce7146911e86e87a87837de8acae28986716fd381ac7c301fd6e8d8b6c811f - languageName: node - linkType: hard - -"@types/bn.js@npm:^5.1.0": - version: 5.1.0 - resolution: "@types/bn.js@npm:5.1.0" - dependencies: - "@types/node": "*" - checksum: 1dc1cbbd7a1e8bf3614752e9602f558762a901031f499f3055828b5e3e2bba16e5b88c27b3c4152ad795248fbe4086c731a5c4b0f29bb243f1875beeeabee59c - languageName: node - linkType: hard - -"@types/body-parser@npm:*": - version: 1.19.2 - resolution: "@types/body-parser@npm:1.19.2" - dependencies: - "@types/connect": "*" - "@types/node": "*" - checksum: e17840c7d747a549f00aebe72c89313d09fbc4b632b949b2470c5cb3b1cb73863901ae84d9335b567a79ec5efcfb8a28ff8e3f36bc8748a9686756b6d5681f40 - languageName: node - linkType: hard - -"@types/bonjour@npm:^3.5.9": - version: 3.5.10 - resolution: "@types/bonjour@npm:3.5.10" - dependencies: - "@types/node": "*" - checksum: bfcadb042a41b124c4e3de4925e3be6d35b78f93f27c4535d5ff86980dc0f8bc407ed99b9b54528952dc62834d5a779392f7a12c2947dd19330eb05a6bcae15a - languageName: node - linkType: hard - -"@types/cacheable-request@npm:^6.0.1": - version: 6.0.3 - resolution: "@types/cacheable-request@npm:6.0.3" - dependencies: - "@types/http-cache-semantics": "*" - "@types/keyv": ^3.1.4 - "@types/node": "*" - "@types/responselike": ^1.0.0 - checksum: d9b26403fe65ce6b0cb3720b7030104c352bcb37e4fac2a7089a25a97de59c355fa08940658751f2f347a8512aa9d18fdb66ab3ade835975b2f454f2d5befbd9 - languageName: node - linkType: hard - -"@types/caseless@npm:*": - version: 0.12.5 - resolution: "@types/caseless@npm:0.12.5" - checksum: f6a3628add76d27005495914c9c3873a93536957edaa5b69c63b46fe10b4649a6fecf16b676c1695f46aab851da47ec6047dcf3570fa8d9b6883492ff6d074e0 - languageName: node - linkType: hard - -"@types/chrome@npm:0.0.254": - version: 0.0.254 - resolution: "@types/chrome@npm:0.0.254" - dependencies: - "@types/filesystem": "*" - "@types/har-format": "*" - checksum: ec54e73b792eb93cdadead294a0de0f757cc30d8ddebabab548cbfd3ed479c2a557aa33cee6eb190b67f500eebbc2e09496017a1dd521df1154a7b38cdca70d3 - languageName: node - linkType: hard - -"@types/chrome@npm:^0.0.114": - version: 0.0.114 - resolution: "@types/chrome@npm:0.0.114" - dependencies: - "@types/filesystem": "*" - "@types/har-format": "*" - checksum: 7b7c7d7ae72e54011328709b23f6bb2b15e8626af01e7577deae34fd1a0ec52f3f911f9eb9eeb49110a6816ee993450119eb889a286e077c5ce194878415d63f - languageName: node - linkType: hard - -"@types/connect-history-api-fallback@npm:^1.3.5": - version: 1.3.5 - resolution: "@types/connect-history-api-fallback@npm:1.3.5" - dependencies: - "@types/express-serve-static-core": "*" - "@types/node": "*" - checksum: 464d06e5ab00f113fa89978633d5eb00d225aeb4ebbadc07f6f3bc337aa7cbfcd74957b2a539d6d47f2e128e956a17819973ec7ae62ade2e16e367a6c38b8d3a - languageName: node - linkType: hard - -"@types/connect@npm:*": - version: 3.4.38 - resolution: "@types/connect@npm:3.4.38" - dependencies: - "@types/node": "*" - checksum: 7eb1bc5342a9604facd57598a6c62621e244822442976c443efb84ff745246b10d06e8b309b6e80130026a396f19bf6793b7cecd7380169f369dac3bfc46fb99 - languageName: node - linkType: hard - -"@types/d3-array@npm:*": - version: 3.2.1 - resolution: "@types/d3-array@npm:3.2.1" - checksum: 8a41cee0969e53bab3f56cc15c4e6c9d76868d6daecb2b7d8c9ce71e0ececccc5a8239697cc52dadf5c665f287426de5c8ef31a49e7ad0f36e8846889a383df4 - languageName: node - linkType: hard - -"@types/d3-axis@npm:*": - version: 3.0.6 - resolution: "@types/d3-axis@npm:3.0.6" - dependencies: - "@types/d3-selection": "*" - checksum: ea1065d9e6d134c04427763603cbe9d549b8b5785b8ae0d002b5b14a362619d5b8f5ee3c2fda8b36b7e5a413cbcd387e1a2d89898b919a9f0cc91ad4e67b5ab5 - languageName: node - linkType: hard - -"@types/d3-brush@npm:*": - version: 3.0.6 - resolution: "@types/d3-brush@npm:3.0.6" - dependencies: - "@types/d3-selection": "*" - checksum: e5166bc53e5c914b1fed0a6ce55ca14d76ae11c5afd16b724b8ae47989e977c4af02bb07496d1ccd0a77f4ccd9a2ca7345e1d289bcfce16490fe4b39a9e0d170 - languageName: node - linkType: hard - -"@types/d3-chord@npm:*": - version: 3.0.6 - resolution: "@types/d3-chord@npm:3.0.6" - checksum: b511cf372ed8a0086d37a715c0d4aca811b614454e1f7c1561fbcd46863beaccdb115d274a7a992a30a8218393fbc3e1fdd7ca6e9d572e729a4570002c327083 - languageName: node - linkType: hard - -"@types/d3-color@npm:*": - version: 3.1.3 - resolution: "@types/d3-color@npm:3.1.3" - checksum: 8a0e79a709929502ec4effcee2c786465b9aec51b653ba0b5d05dbfec3e84f418270dd603002d94021885061ff592f614979193bd7a02ad76317f5608560e357 - languageName: node - linkType: hard - -"@types/d3-color@npm:^1": - version: 1.4.5 - resolution: "@types/d3-color@npm:1.4.5" - checksum: 4ca4d98e54506bfb94b013ebc5ca42a466fb86e310162e6dbe025817a1ce0f31420d857b3f313e846d93094864eda51a700f6ce7aa084ac82abb3e552ba4317b - languageName: node - linkType: hard - -"@types/d3-contour@npm:*": - version: 3.0.6 - resolution: "@types/d3-contour@npm:3.0.6" - dependencies: - "@types/d3-array": "*" - "@types/geojson": "*" - checksum: 83c13eb0567e95d6675d6d81cbeab38d0899c5af70a7c69354e23e0860ddb2f3e911d2cacd33a8baa60ce7846b38785a337b2d7c8d2763a1340bfb999b4bd2ab - languageName: node - linkType: hard - -"@types/d3-delaunay@npm:*": - version: 6.0.4 - resolution: "@types/d3-delaunay@npm:6.0.4" - checksum: 502fe0eb91f7d05b0f57904d68028c24348a54b1e5458009caf662de995d0e59bd82cd701b4af0087d614ee9e456d415fe32d63c25272ca753bf12b3f27b2d77 - languageName: node - linkType: hard - -"@types/d3-dispatch@npm:*": - version: 3.0.6 - resolution: "@types/d3-dispatch@npm:3.0.6" - checksum: f82076c7d205885480d363c92c19b8e0d6b9e529a3a78ce772f96a7cc4cce01f7941141f148828337035fac9676b13e7440565530491d560fdf12e562cb56573 - languageName: node - linkType: hard - -"@types/d3-drag@npm:*": - version: 3.0.7 - resolution: "@types/d3-drag@npm:3.0.7" - dependencies: - "@types/d3-selection": "*" - checksum: 1107cb1667ead79073741c06ea4a9e8e4551698f6c9c60821e327a6aa30ca2ba0b31a6fe767af85a2e38a22d2305f6c45b714df15c2bba68adf58978223a5fc5 - languageName: node - linkType: hard - -"@types/d3-dsv@npm:*": - version: 3.0.7 - resolution: "@types/d3-dsv@npm:3.0.7" - checksum: 5025e01459827d09d14e0d00281995a04042ce9e3e76444c5a65466c1d29649d82cbfaa9251e33837bf576f5c587525d8d8ff5aacc6bd3b831824d54449261b9 - languageName: node - linkType: hard - -"@types/d3-ease@npm:*": - version: 3.0.2 - resolution: "@types/d3-ease@npm:3.0.2" - checksum: 0885219966294bfc99548f37297e1c75e75da812a5f3ec941977ebb57dcab0a25acec5b2bbd82d09a49d387daafca08521ca269b7e4c27ddca7768189e987b54 - languageName: node - linkType: hard - -"@types/d3-fetch@npm:*": - version: 3.0.7 - resolution: "@types/d3-fetch@npm:3.0.7" - dependencies: - "@types/d3-dsv": "*" - checksum: e60cf60b25cbc49b2066ac2a3638f610c7379000562b0f499dd90fd57a8cb9740c24667a70496c2a66456d42867afeffb1722a75b26d95e7d7ee8667d96b0b36 - languageName: node - linkType: hard - -"@types/d3-force@npm:*": - version: 3.0.9 - resolution: "@types/d3-force@npm:3.0.9" - checksum: 6ec16109b5048cda0877931b5e60565436fee697ccbc223eae1562c4a8401dddacb25b0137da2babca2a810ad0471114444e08c8e395ce90758d768a05a23b4f - languageName: node - linkType: hard - -"@types/d3-format@npm:*": - version: 3.0.4 - resolution: "@types/d3-format@npm:3.0.4" - checksum: e69421cd93861a0c080084b0b23d4a5d6a427497559e46898189002fb756dae2c7c858b465308f6bcede7272b90e39ce8adab810bded2309035a5d9556c59134 - languageName: node - linkType: hard - -"@types/d3-geo@npm:*": - version: 3.1.0 - resolution: "@types/d3-geo@npm:3.1.0" - dependencies: - "@types/geojson": "*" - checksum: a4b2daa8a64012912ce7186891e8554af123925dca344c111b771e168a37477e02d504c6c94ee698440380e8c4f3f373d6755be97935da30eae0904f6745ce40 - languageName: node - linkType: hard - -"@types/d3-hierarchy@npm:*": - version: 3.1.6 - resolution: "@types/d3-hierarchy@npm:3.1.6" - checksum: cb6a80823fd8820277863f78dac7c8072b364c548cf266215d6bb3f3d017304348cfcb1ca806f38de48ce3ccd5e6af12c70814a10660f882ee4a48e6ae710afa - languageName: node - linkType: hard - -"@types/d3-interpolate@npm:*": - version: 3.0.4 - resolution: "@types/d3-interpolate@npm:3.0.4" - dependencies: - "@types/d3-color": "*" - checksum: efd2770e174e84fc7316fdafe03cf3688451f767dde1fa6211610137f495be7f3923db7e1723a6961a0e0e9ae0ed969f4f47c038189fa0beb1d556b447922622 - languageName: node - linkType: hard - -"@types/d3-interpolate@npm:^1.3.1": - version: 1.4.5 - resolution: "@types/d3-interpolate@npm:1.4.5" - dependencies: - "@types/d3-color": ^1 - checksum: 719b2fe387a01c70c1dab47f58a4d57156be8dda3bbafba7fd65024d264c04e55db9ad4354aeb0ca74ef58ca6feb6d4d103f6ffd9c7f7102dc4975b12263f807 - languageName: node - linkType: hard - -"@types/d3-path@npm:*": - version: 3.0.0 - resolution: "@types/d3-path@npm:3.0.0" - checksum: af7f45ea912cddd794c03384baba856f11e1f9b57a49d05a66a61968dafaeb86e0e42394883118b9b8ccadce21a5f25b1f9a88ad05235e1dc6d24c3e34a379ff - languageName: node - linkType: hard - -"@types/d3-path@npm:^1, @types/d3-path@npm:^1.0.8": - version: 1.0.11 - resolution: "@types/d3-path@npm:1.0.11" - checksum: 5feb35cc6091e63563587d180b4eaded8ed4fc6a017696dc6184d7051db0a4ee130938cc0ae82ef8ea0dc3681f7339469f5eb3144cd87b44f1cf32fda0617f7f - languageName: node - linkType: hard - -"@types/d3-polygon@npm:*": - version: 3.0.2 - resolution: "@types/d3-polygon@npm:3.0.2" - checksum: 7cf1eadb54f02dd3617512b558f4c0f3811f8a6a8c887d9886981c3cc251db28b68329b2b0707d9f517231a72060adbb08855227f89bef6ef30caedc0a67cab2 - languageName: node - linkType: hard - -"@types/d3-quadtree@npm:*": - version: 3.0.5 - resolution: "@types/d3-quadtree@npm:3.0.5" - checksum: 4bcd6c7ba3a61f1fa330e3826f47c7322e733e8229bc883fab150d1de2a5952515171d38e935b8700a0c8aed168e8d5796188708515c086898f41a33860dccac - languageName: node - linkType: hard - -"@types/d3-random@npm:*": - version: 3.0.3 - resolution: "@types/d3-random@npm:3.0.3" - checksum: 33285b57768a724d2466ac1deec002432805c9df3e475ffb7f7fec66681cfe3e18d2f68b7f8ba45f400b274907bbebfe8adff14c9a97ef1987e476135e784925 - languageName: node - linkType: hard - -"@types/d3-scale-chromatic@npm:*": - version: 3.0.3 - resolution: "@types/d3-scale-chromatic@npm:3.0.3" - checksum: a465d126a00a71d3824957283580b4b404fe6f6bb52eb2b7303047fffed2bec6e31aeb34bfb30313e72ee1d75243c50ec5a45824eaf547f9c0849a1379527662 - languageName: node - linkType: hard - -"@types/d3-scale@npm:*": - version: 4.0.8 - resolution: "@types/d3-scale@npm:4.0.8" - dependencies: - "@types/d3-time": "*" - checksum: 3b1906da895564f73bb3d0415033d9a8aefe7c4f516f970176d5b2ff7a417bd27ae98486e9a9aa0472001dc9885a9204279a1973a985553bdb3ee9bbc1b94018 - languageName: node - linkType: hard - -"@types/d3-scale@npm:^3.3.0": - version: 3.3.5 - resolution: "@types/d3-scale@npm:3.3.5" - dependencies: - "@types/d3-time": ^2 - checksum: e6ffe97c3022c857a88f73775930bd577fa55460f65eaf68038cd39d1b5d8e4a9941440b5ac8d382568463f04ca68d6b7c3e596f4ec6575c388db17305ca1524 - languageName: node - linkType: hard - -"@types/d3-selection@npm:*": - version: 3.0.10 - resolution: "@types/d3-selection@npm:3.0.10" - checksum: 8a1b0940eca565d754c1898b9e4f86e2778e4135878b76b3b8a89d497e37675d423ec3376f248577a502bccb55c1218cc9f6b5688a29a3b500973de8fc5f1c5c - languageName: node - linkType: hard - -"@types/d3-shape@npm:*": - version: 3.1.6 - resolution: "@types/d3-shape@npm:3.1.6" - dependencies: - "@types/d3-path": "*" - checksum: bd765be021019c43c8dca066a798a1de28a051d1213db6ca25f76c9e577da7ec40a592e3bda7628383ab48cb87164fe60b95eb5ec23761b2012bd0adb30c549a - languageName: node - linkType: hard - -"@types/d3-shape@npm:^1.3.1": - version: 1.3.11 - resolution: "@types/d3-shape@npm:1.3.11" - dependencies: - "@types/d3-path": ^1 - checksum: e53113a1e18f3398bbe9a885657640c2080f3a52c5d745a44ed161239bf64b009a3de1aa621ee3befb295de3e71116f69dd2837e7acab60a947fac714452e1ad - languageName: node - linkType: hard - -"@types/d3-time-format@npm:*": - version: 4.0.3 - resolution: "@types/d3-time-format@npm:4.0.3" - checksum: e981fc9780697a9d8c5d1ddf1167d9c6bc28e4e610afddff1384fe55e6eb52cb65309b2a0a1d4cf817413b0a80b9f1a652fe0b2cb8054ace4eafff80a6093aa5 - languageName: node - linkType: hard - -"@types/d3-time@npm:*": - version: 3.0.0 - resolution: "@types/d3-time@npm:3.0.0" - checksum: e76adb056daccf80107f4db190ac6deb77e8774f00362bb6c76f178e67f2f217422fe502b654edbc9ac6451f6619045b9f6f5fe0db1ec5520e2ada377af7c72e - languageName: node - linkType: hard - -"@types/d3-time@npm:^2, @types/d3-time@npm:^2.0.0": - version: 2.1.4 - resolution: "@types/d3-time@npm:2.1.4" - checksum: e5898c5520a536ea65b18d003d6d89e2def04c23ad15977240fe27558e8cc7ea5d0c362850090d5850d5fcd788cc6c6b16802c6826f932456aeebe9e2ddbce8a - languageName: node - linkType: hard - -"@types/d3-timer@npm:*": - version: 3.0.2 - resolution: "@types/d3-timer@npm:3.0.2" - checksum: 1643eebfa5f4ae3eb00b556bbc509444d88078208ec2589ddd8e4a24f230dd4cf2301e9365947e70b1bee33f63aaefab84cd907822aae812b9bc4871b98ab0e1 - languageName: node - linkType: hard - -"@types/d3-transition@npm:*": - version: 3.0.8 - resolution: "@types/d3-transition@npm:3.0.8" - dependencies: - "@types/d3-selection": "*" - checksum: 4ff2727f0f2305cbe4fed1ef860a6cac44393607db42e4d0975eb6348338c2c3091b25bc5a1bddd31d7f3e10d1028187f7d271f6e4239d67f485f28c4f076a8b - languageName: node - linkType: hard - -"@types/d3-zoom@npm:*": - version: 3.0.8 - resolution: "@types/d3-zoom@npm:3.0.8" - dependencies: - "@types/d3-interpolate": "*" - "@types/d3-selection": "*" - checksum: a1685728949ed39faf8ce162cc13338639c57bc2fd4d55fc7902b2632cad2bc2a808941263e57ce6685647e8a6a0a556e173386a52d6bb74c9ed6195b68be3de - languageName: node - linkType: hard - -"@types/d3@npm:7.4.3": - version: 7.4.3 - resolution: "@types/d3@npm:7.4.3" - dependencies: - "@types/d3-array": "*" - "@types/d3-axis": "*" - "@types/d3-brush": "*" - "@types/d3-chord": "*" - "@types/d3-color": "*" - "@types/d3-contour": "*" - "@types/d3-delaunay": "*" - "@types/d3-dispatch": "*" - "@types/d3-drag": "*" - "@types/d3-dsv": "*" - "@types/d3-ease": "*" - "@types/d3-fetch": "*" - "@types/d3-force": "*" - "@types/d3-format": "*" - "@types/d3-geo": "*" - "@types/d3-hierarchy": "*" - "@types/d3-interpolate": "*" - "@types/d3-path": "*" - "@types/d3-polygon": "*" - "@types/d3-quadtree": "*" - "@types/d3-random": "*" - "@types/d3-scale": "*" - "@types/d3-scale-chromatic": "*" - "@types/d3-selection": "*" - "@types/d3-shape": "*" - "@types/d3-time": "*" - "@types/d3-time-format": "*" - "@types/d3-timer": "*" - "@types/d3-transition": "*" - "@types/d3-zoom": "*" - checksum: 12234aa093c8661546168becdd8956e892b276f525d96f65a7b32fed886fc6a569fe5a1171bff26fef2a5663960635f460c9504a6f2d242ba281a2b6c8c6465c - languageName: node - linkType: hard - -"@types/datadog-metrics@npm:0.6.1": - version: 0.6.1 - resolution: "@types/datadog-metrics@npm:0.6.1" - checksum: a55e5661b91318ca5786675c56d054bb5b54a7e8882d87d359a844add1c06d44bf45b1cf8f33b67e1b4f017f617a023e044788a370244a912a0141dfbe55e441 - languageName: node - linkType: hard - -"@types/debug@npm:^4.1.7": - version: 4.1.12 - resolution: "@types/debug@npm:4.1.12" - dependencies: - "@types/ms": "*" - checksum: 47876a852de8240bfdaf7481357af2b88cb660d30c72e73789abf00c499d6bc7cd5e52f41c915d1b9cd8ec9fef5b05688d7b7aef17f7f272c2d04679508d1053 - languageName: node - linkType: hard - -"@types/doctrine@npm:^0.0.9": - version: 0.0.9 - resolution: "@types/doctrine@npm:0.0.9" - checksum: 3909eaca42e7386b2ab866f082b78da3e00718d2fa323597e254feb0556c678b41f2c490729067433630083ac9c806ec6ae1e146754f7f8ba7d3e43ed68d6500 - languageName: node - linkType: hard - -"@types/dom-screen-wake-lock@npm:^1.0.0": - version: 1.0.3 - resolution: "@types/dom-screen-wake-lock@npm:1.0.3" - checksum: 66bece3508b4f4147db97a530c758f8f5d3132ef00c06cab1db4bf2b4af6a3a614ae0a0ba6b53ddc4177a6545adf9d312547087256efc8eff7314b13221380b8 - languageName: node - linkType: hard - -"@types/eslint-scope@npm:^3.7.3, @types/eslint-scope@npm:^3.7.7": - version: 3.7.7 - resolution: "@types/eslint-scope@npm:3.7.7" - dependencies: - "@types/eslint": "*" - "@types/estree": "*" - checksum: e2889a124aaab0b89af1bab5959847c5bec09809209255de0e63b9f54c629a94781daa04adb66bffcdd742f5e25a17614fb933965093c0eea64aacda4309380e - languageName: node - linkType: hard - -"@types/eslint@npm:*, @types/eslint@npm:^7.29.0 || ^8.4.1": - version: 8.56.12 - resolution: "@types/eslint@npm:8.56.12" - dependencies: - "@types/estree": "*" - "@types/json-schema": "*" - checksum: 0f7710ee02a256c499514251f527f84de964bb29487db840408e4cde79283124a38935597636d2265756c34dd1d902e1b00ae78930d4a0b55111909cb7b80d84 - languageName: node - linkType: hard - -"@types/estree@npm:*, @types/estree@npm:^1.0.0, @types/estree@npm:^1.0.5, @types/estree@npm:^1.0.6": - version: 1.0.6 - resolution: "@types/estree@npm:1.0.6" - checksum: 8825d6e729e16445d9a1dd2fb1db2edc5ed400799064cd4d028150701031af012ba30d6d03fe9df40f4d7a437d0de6d2b256020152b7b09bde9f2e420afdffd9 - languageName: node - linkType: hard - -"@types/estree@npm:0.0.39": - version: 0.0.39 - resolution: "@types/estree@npm:0.0.39" - checksum: 412fb5b9868f2c418126451821833414189b75cc6bf84361156feed733e3d92ec220b9d74a89e52722e03d5e241b2932732711b7497374a404fad49087adc248 - languageName: node - linkType: hard - -"@types/express-serve-static-core@npm:*, @types/express-serve-static-core@npm:^4.17.33": - version: 4.17.33 - resolution: "@types/express-serve-static-core@npm:4.17.33" - dependencies: - "@types/node": "*" - "@types/qs": "*" - "@types/range-parser": "*" - checksum: dce580d16b85f207445af9d4053d66942b27d0c72e86153089fa00feee3e96ae336b7bedb31ed4eea9e553c99d6dd356ed6e0928f135375d9f862a1a8015adf2 - languageName: node - linkType: hard - -"@types/express@npm:*, @types/express@npm:^4.17.13": - version: 4.17.17 - resolution: "@types/express@npm:4.17.17" - dependencies: - "@types/body-parser": "*" - "@types/express-serve-static-core": ^4.17.33 - "@types/qs": "*" - "@types/serve-static": "*" - checksum: 0196dacc275ac3ce89d7364885cb08e7fb61f53ca101f65886dbf1daf9b7eb05c0943e2e4bbd01b0cc5e50f37e0eea7e4cbe97d0304094411ac73e1b7998f4da - languageName: node - linkType: hard - -"@types/filesystem@npm:*": - version: 0.0.32 - resolution: "@types/filesystem@npm:0.0.32" - dependencies: - "@types/filewriter": "*" - checksum: 4b9079d200a3b241722b90e1c5806c4b32c4dac87d42a1c7ef76a2c0dafdbe7d5f1a379b873ad5de73622b44de6599e1522908f67b938d54e785bd1c36e302a0 - languageName: node - linkType: hard - -"@types/filewriter@npm:*": - version: 0.0.29 - resolution: "@types/filewriter@npm:0.0.29" - checksum: 0c58aa875c2c245be7dbc42b20212f3203e13d11ec013a4a5cd0febf0e8b87214be5882c05ff9d7bdf0398f145a4fdbc24b7e6cf7b094e134a3b4c7a0598502f - languageName: node - linkType: hard - -"@types/fs-extra@npm:^9.0.13": - version: 9.0.13 - resolution: "@types/fs-extra@npm:9.0.13" - dependencies: - "@types/node": "*" - checksum: add79e212acd5ac76b97b9045834e03a7996aef60a814185e0459088fd290519a3c1620865d588fa36c4498bf614210d2a703af5cf80aa1dbc125db78f6edac3 - languageName: node - linkType: hard - -"@types/geojson@npm:*": - version: 7946.0.13 - resolution: "@types/geojson@npm:7946.0.13" - checksum: b3b68457c89bc3f0445dc9eb54d07e6f89658672867c54989bc7f71f87d54e562195b291d43e1b84476493351271d7ccb9f5c6ab2012b29fbafbb0e8e43c4bca - languageName: node - linkType: hard - -"@types/glob@npm:^7.1.1": - version: 7.2.0 - resolution: "@types/glob@npm:7.2.0" - dependencies: - "@types/minimatch": "*" - "@types/node": "*" - checksum: 6ae717fedfdfdad25f3d5a568323926c64f52ef35897bcac8aca8e19bc50c0bd84630bbd063e5d52078b2137d8e7d3c26eabebd1a2f03ff350fff8a91e79fc19 - languageName: node - linkType: hard - -"@types/graceful-fs@npm:^4.1.2, @types/graceful-fs@npm:^4.1.3": - version: 4.1.9 - resolution: "@types/graceful-fs@npm:4.1.9" - dependencies: - "@types/node": "*" - checksum: 79d746a8f053954bba36bd3d94a90c78de995d126289d656fb3271dd9f1229d33f678da04d10bce6be440494a5a73438e2e363e92802d16b8315b051036c5256 - languageName: node - linkType: hard - -"@types/hammerjs@npm:^2.0.36": - version: 2.0.40 - resolution: "@types/hammerjs@npm:2.0.40" - checksum: d815bd0a156159624e3f053fc06b6e1b30ee3d1fb31710211f4c615a212fe2a5e7f8580845c9474a0c4f0a65aef2eb9bb0d4166f688112b50d782f3ddb6df4d4 - languageName: node - linkType: hard - -"@types/har-format@npm:*": - version: 1.2.10 - resolution: "@types/har-format@npm:1.2.10" - checksum: 14c0118d809e77a0bac9deec0a87159c28beab21105cfce3aa291b51e28d4c07142851c4e6b93b7ecb4ea237fe07d39ba98a42bb2de2f5891144733411ac76b7 - languageName: node - linkType: hard - -"@types/hoist-non-react-statics@npm:*, @types/hoist-non-react-statics@npm:^3.3.0, @types/hoist-non-react-statics@npm:^3.3.1": - version: 3.3.5 - resolution: "@types/hoist-non-react-statics@npm:3.3.5" - dependencies: - "@types/react": "*" - hoist-non-react-statics: ^3.3.0 - checksum: b645b062a20cce6ab1245ada8274051d8e2e0b2ee5c6bd58215281d0ec6dae2f26631af4e2e7c8abe238cdcee73fcaededc429eef569e70908f82d0cc0ea31d7 - languageName: node - linkType: hard - -"@types/html-minifier-terser@npm:^6.0.0": - version: 6.1.0 - resolution: "@types/html-minifier-terser@npm:6.1.0" - checksum: eb843f6a8d662d44fb18ec61041117734c6aae77aa38df1be3b4712e8e50ffaa35f1e1c92fdd0fde14a5675fecf457abcd0d15a01fae7506c91926176967f452 - languageName: node - linkType: hard - -"@types/http-cache-semantics@npm:*": - version: 4.0.1 - resolution: "@types/http-cache-semantics@npm:4.0.1" - checksum: 1048aacf627829f0d5f00184e16548205cd9f964bf0841c29b36bc504509230c40bc57c39778703a1c965a6f5b416ae2cbf4c1d4589c889d2838dd9dbfccf6e9 - languageName: node - linkType: hard - -"@types/http-proxy@npm:^1.17.8": - version: 1.17.10 - resolution: "@types/http-proxy@npm:1.17.10" - dependencies: - "@types/node": "*" - checksum: 8fabee5d01715e338f426715325121d6c4b7a9694dee716ab61c874e0aaccee9a0fff7ccc3c9d7e37a8feeaab7c783c17aaa9943efbc8849c5e79ecd7eaf02ab - languageName: node - linkType: hard - -"@types/istanbul-lib-coverage@npm:*, @types/istanbul-lib-coverage@npm:^2.0.0, @types/istanbul-lib-coverage@npm:^2.0.1": - version: 2.0.4 - resolution: "@types/istanbul-lib-coverage@npm:2.0.4" - checksum: a25d7589ee65c94d31464c16b72a9dc81dfa0bea9d3e105ae03882d616e2a0712a9c101a599ec482d297c3591e16336962878cb3eb1a0a62d5b76d277a890ce7 - languageName: node - linkType: hard - -"@types/istanbul-lib-report@npm:*": - version: 3.0.0 - resolution: "@types/istanbul-lib-report@npm:3.0.0" - dependencies: - "@types/istanbul-lib-coverage": "*" - checksum: 656398b62dc288e1b5226f8880af98087233cdb90100655c989a09f3052b5775bf98ba58a16c5ae642fb66c61aba402e07a9f2bff1d1569e3b306026c59f3f36 - languageName: node - linkType: hard - -"@types/istanbul-reports@npm:^3.0.0": - version: 3.0.1 - resolution: "@types/istanbul-reports@npm:3.0.1" - dependencies: - "@types/istanbul-lib-report": "*" - checksum: f1ad54bc68f37f60b30c7915886b92f86b847033e597f9b34f2415acdbe5ed742fa559a0a40050d74cdba3b6a63c342cac1f3a64dba5b68b66a6941f4abd7903 - languageName: node - linkType: hard - -"@types/jest@npm:29.5.14": - version: 29.5.14 - resolution: "@types/jest@npm:29.5.14" - dependencies: - expect: ^29.0.0 - pretty-format: ^29.0.0 - checksum: 18dba4623f26661641d757c63da2db45e9524c9be96a29ef713c703a9a53792df9ecee9f7365a0858ddbd6440d98fe6b65ca67895ca5884b73cbc7ffc11f3838 - languageName: node - linkType: hard - -"@types/js-yaml@npm:^4.0.0, @types/js-yaml@npm:^4.0.5": - version: 4.0.9 - resolution: "@types/js-yaml@npm:4.0.9" - checksum: e5e5e49b5789a29fdb1f7d204f82de11cb9e8f6cb24ab064c616da5d6e1b3ccfbf95aa5d1498a9fbd3b9e745564e69b4a20b6c530b5a8bbb2d4eb830cda9bc69 - languageName: node - linkType: hard - -"@types/jsdom@npm:^20.0.0": - version: 20.0.1 - resolution: "@types/jsdom@npm:20.0.1" - dependencies: - "@types/node": "*" - "@types/tough-cookie": "*" - parse5: ^7.0.0 - checksum: d55402c5256ef451f93a6e3d3881f98339fe73a5ac2030588df056d6835df8367b5a857b48d27528289057e26dcdd3f502edc00cb877c79174cb3a4c7f2198c1 - languageName: node - linkType: hard - -"@types/json-schema@npm:*, @types/json-schema@npm:^7.0.11, @types/json-schema@npm:^7.0.12, @types/json-schema@npm:^7.0.4, @types/json-schema@npm:^7.0.5, @types/json-schema@npm:^7.0.8, @types/json-schema@npm:^7.0.9": - version: 7.0.15 - resolution: "@types/json-schema@npm:7.0.15" - checksum: 97ed0cb44d4070aecea772b7b2e2ed971e10c81ec87dd4ecc160322ffa55ff330dace1793489540e3e318d90942064bb697cc0f8989391797792d919737b3b98 - languageName: node - linkType: hard - -"@types/json-stable-stringify@npm:^1.0.32": - version: 1.0.34 - resolution: "@types/json-stable-stringify@npm:1.0.34" - checksum: 45767ecef0f6aae5680c3be6488d5c493f16046e34f182d7e6a2c69a667aab035799752c6f03017c883b134ad3f80e3f78d7e7da81a9c1f3d01676126baf5d0e - languageName: node - linkType: hard - -"@types/json5@npm:^0.0.29": - version: 0.0.29 - resolution: "@types/json5@npm:0.0.29" - checksum: e60b153664572116dfea673c5bda7778dbff150498f44f998e34b5886d8afc47f16799280e4b6e241c0472aef1bc36add771c569c68fc5125fc2ae519a3eb9ac - languageName: node - linkType: hard - -"@types/keyv@npm:^3.1.1, @types/keyv@npm:^3.1.4": - version: 3.1.4 - resolution: "@types/keyv@npm:3.1.4" - dependencies: - "@types/node": "*" - checksum: e009a2bfb50e90ca9b7c6e8f648f8464067271fd99116f881073fa6fa76dc8d0133181dd65e6614d5fb1220d671d67b0124aef7d97dc02d7e342ab143a47779d - languageName: node - linkType: hard - -"@types/lodash.clonedeep@npm:^4.5.7": - version: 4.5.9 - resolution: "@types/lodash.clonedeep@npm:4.5.9" - dependencies: - "@types/lodash": "*" - checksum: ef85512b7dce7a4f981a818ae44d11982907e1f26b5b26bedf0957c35e8591eb8e1d24fa31ca851d4b40e0a1ee88563853d762412691fe5f357e8335cead2325 - languageName: node - linkType: hard - -"@types/lodash@npm:*, @types/lodash@npm:^4.14.172, @types/lodash@npm:^4.14.53": - version: 4.14.202 - resolution: "@types/lodash@npm:4.14.202" - checksum: a91acf3564a568c6f199912f3eb2c76c99c5a0d7e219394294213b3f2d54f672619f0fde4da22b29dc5d4c31457cd799acc2e5cb6bd90f9af04a1578483b6ff7 - languageName: node - linkType: hard - -"@types/long@npm:^4.0.0": - version: 4.0.2 - resolution: "@types/long@npm:4.0.2" - checksum: d16cde7240d834cf44ba1eaec49e78ae3180e724cd667052b194a372f350d024cba8dd3f37b0864931683dab09ca935d52f0c4c1687178af5ada9fc85b0635f4 - languageName: node - linkType: hard - -"@types/lru-cache@npm:^5.1.0": - version: 5.1.1 - resolution: "@types/lru-cache@npm:5.1.1" - checksum: e1d6c0085f61b16ec5b3073ec76ad1be4844ea036561c3f145fc19f71f084b58a6eb600b14128aa95809d057d28f1d147c910186ae51219f58366ffd2ff2e118 - languageName: node - linkType: hard - -"@types/mdx@npm:^2.0.0": - version: 2.0.13 - resolution: "@types/mdx@npm:2.0.13" - checksum: 195137b548e75a85f0558bb1ca5088aff1c01ae0fc64454da06085b7513a043356d0bb51ed559d3cbc7ad724ccd8cef2a7d07d014b89a47a74dff8875ceb3b15 - languageName: node - linkType: hard - -"@types/mime@npm:*": - version: 3.0.1 - resolution: "@types/mime@npm:3.0.1" - checksum: 4040fac73fd0cea2460e29b348c1a6173da747f3a87da0dbce80dd7a9355a3d0e51d6d9a401654f3e5550620e3718b5a899b2ec1debf18424e298a2c605346e7 - languageName: node - linkType: hard - -"@types/minimatch@npm:*": - version: 5.1.2 - resolution: "@types/minimatch@npm:5.1.2" - checksum: 0391a282860c7cb6fe262c12b99564732401bdaa5e395bee9ca323c312c1a0f45efbf34dce974682036e857db59a5c9b1da522f3d6055aeead7097264c8705a8 - languageName: node - linkType: hard - -"@types/minimatch@npm:^3.0.3": - version: 3.0.5 - resolution: "@types/minimatch@npm:3.0.5" - checksum: c41d136f67231c3131cf1d4ca0b06687f4a322918a3a5adddc87ce90ed9dbd175a3610adee36b106ae68c0b92c637c35e02b58c8a56c424f71d30993ea220b92 - languageName: node - linkType: hard - -"@types/minimist@npm:^1.2.0": - version: 1.2.2 - resolution: "@types/minimist@npm:1.2.2" - checksum: b8da83c66eb4aac0440e64674b19564d9d86c80ae273144db9681e5eeff66f238ade9515f5006ffbfa955ceff8b89ad2bd8ec577d7caee74ba101431fb07045d - languageName: node - linkType: hard - -"@types/ms@npm:*": - version: 0.7.34 - resolution: "@types/ms@npm:0.7.34" - checksum: f38d36e7b6edecd9badc9cf50474159e9da5fa6965a75186cceaf883278611b9df6669dc3a3cc122b7938d317b68a9e3d573d316fcb35d1be47ec9e468c6bd8a - languageName: node - linkType: hard - -"@types/ms@npm:0.7.31": - version: 0.7.31 - resolution: "@types/ms@npm:0.7.31" - checksum: daadd354aedde024cce6f5aa873fefe7b71b22cd0e28632a69e8b677aeb48ae8caa1c60e5919bb781df040d116b01cb4316335167a3fc0ef6a63fa3614c0f6da - languageName: node - linkType: hard - -"@types/multicodec@npm:1.0.0": - version: 1.0.0 - resolution: "@types/multicodec@npm:1.0.0" - dependencies: - "@types/node": "*" - checksum: 2b4ef12f24d1c78dd2a7529699b6e786195539748e137b5534cdcb70a30878a2246ce8436dd87502e026a15c3669932ed6944ed7d253739c7713b351255d5281 - languageName: node - linkType: hard - -"@types/node-fetch@npm:^2.6.4": - version: 2.6.11 - resolution: "@types/node-fetch@npm:2.6.11" - dependencies: - "@types/node": "*" - form-data: ^4.0.0 - checksum: 180e4d44c432839bdf8a25251ef8c47d51e37355ddd78c64695225de8bc5dc2b50b7bb855956d471c026bb84bd7295688a0960085e7158cbbba803053492568b - languageName: node - linkType: hard - -"@types/node-forge@npm:^1.3.0": - version: 1.3.9 - resolution: "@types/node-forge@npm:1.3.9" - dependencies: - "@types/node": "*" - checksum: 4ffab54136960b0944af942a44206470e98766b89b867b6126ebc65c6f21463fd9ea20b26714216e153fbbee7ca5ce689db9067ea286a92b34368a5e2f77601f - languageName: node - linkType: hard - -"@types/node@npm:*, @types/node@npm:>=12.12.47, @types/node@npm:>=13.7.0, @types/node@npm:>=18.0.0, @types/node@npm:^22.0.0": - version: 22.10.7 - resolution: "@types/node@npm:22.10.7" - dependencies: - undici-types: ~6.20.0 - checksum: 2dce6c75c607c6269744f1ea2b5296e8685cd71d0dd5c599c3029626f9d2dc8b037912495cf68b30d6f39f44d3fa8b025e179662ef16dc363e0658425bedfde8 - languageName: node - linkType: hard - -"@types/node@npm:16.9.1": - version: 16.9.1 - resolution: "@types/node@npm:16.9.1" - checksum: 41afcf183a22d59323a0199dd7e0f46591247f45fc08a4434edb26d56dc279ae4fdb80f37989ddd7a0f45e3857c4933e6e82057ede09c5a829f77e373e680375 - languageName: node - linkType: hard - -"@types/node@npm:18.16.0": - version: 18.16.0 - resolution: "@types/node@npm:18.16.0" - checksum: 63e0042136663b9e85ce503a4c65406cc6621fdba63ea66c74b4b1364a9aa9bdb57cadcb76696abab177f38a819b0fa6ace9e7f1647dcb990aedb1b4bd01012f - languageName: node - linkType: hard - -"@types/node@npm:^10.11.7": - version: 10.17.60 - resolution: "@types/node@npm:10.17.60" - checksum: 2cdb3a77d071ba8513e5e8306fa64bf50e3c3302390feeaeff1fd325dd25c8441369715dfc8e3701011a72fed5958c7dfa94eb9239a81b3c286caa4d97db6eef - languageName: node - linkType: hard - -"@types/node@npm:^12.7.1": - version: 12.20.55 - resolution: "@types/node@npm:12.20.55" - checksum: e4f86785f4092706e0d3b0edff8dca5a13b45627e4b36700acd8dfe6ad53db71928c8dee914d4276c7fd3b6ccd829aa919811c9eb708a2c8e4c6eb3701178c37 - languageName: node - linkType: hard - -"@types/node@npm:^16.11.26": - version: 16.18.46 - resolution: "@types/node@npm:16.18.46" - checksum: 1aed3fe9693f2098b8dac8c76c809c1925a456da00dd6f06c1ccb55c62ccfbbe7ec43ccfd12001f9cb4ff84e138292ae53456435dfecd5c4bb1324394c3e09c7 - languageName: node - linkType: hard - -"@types/node@npm:^18.11.18": - version: 18.19.75 - resolution: "@types/node@npm:18.19.75" - dependencies: - undici-types: ~5.26.4 - checksum: 8f780a51a2dc1d597b104a2c33a2ab175fda492defbaab2cbb5fd098124d867ebed7cda0eaf80309bba25fbd4e41b4a04c91b7f14b50547b4377a39ccf749a7c - languageName: node - linkType: hard - -"@types/normalize-package-data@npm:^2.4.0": - version: 2.4.1 - resolution: "@types/normalize-package-data@npm:2.4.1" - checksum: e87bccbf11f95035c89a132b52b79ce69a1e3652fe55962363063c9c0dae0fe2477ebc585e03a9652adc6f381d24ba5589cc5e51849df4ced3d3e004a7d40ed5 - languageName: node - linkType: hard - -"@types/parse-json@npm:^4.0.0": - version: 4.0.0 - resolution: "@types/parse-json@npm:4.0.0" - checksum: fd6bce2b674b6efc3db4c7c3d336bd70c90838e8439de639b909ce22f3720d21344f52427f1d9e57b265fcb7f6c018699b99e5e0c208a1a4823014269a6bf35b - languageName: node - linkType: hard - -"@types/pbkdf2@npm:^3.0.0": - version: 3.1.0 - resolution: "@types/pbkdf2@npm:3.1.0" - dependencies: - "@types/node": "*" - checksum: d15024b1957c21cf3b8887329d9bd8dfde754cf13a09d76ae25f1391cfc62bb8b8d7b760773c5dbaa748172fba8b3e0c3dbe962af6ccbd69b76df12a48dfba40 - languageName: node - linkType: hard - -"@types/poisson-disk-sampling@npm:2.2.4": - version: 2.2.4 - resolution: "@types/poisson-disk-sampling@npm:2.2.4" - checksum: a52499f03ccc01cb1130ab98d58f503d9583d855621fc78ab082a78dcf48661062be6340a6c30ac6f55d42c17d87b7b4dd29f16033c123fa70b4b2d3d3451229 - languageName: node - linkType: hard - -"@types/prettier@npm:^2.1.1": - version: 2.7.3 - resolution: "@types/prettier@npm:2.7.3" - checksum: 705384209cea6d1433ff6c187c80dcc0b95d99d5c5ce21a46a9a58060c527973506822e428789d842761e0280d25e3359300f017fbe77b9755bc772ab3dc2f83 - languageName: node - linkType: hard - -"@types/prop-types@npm:*": - version: 15.7.4 - resolution: "@types/prop-types@npm:15.7.4" - checksum: ef6e1899e59b876c273811b1bd845022fc66d5a3d11cb38a25b6c566b30514ae38fe20a40f67622f362a4f4f7f9224e22d8da101cff3d6e97e11d7b4c307cfc1 - languageName: node - linkType: hard - -"@types/q@npm:^1.5.1": - version: 1.5.8 - resolution: "@types/q@npm:1.5.8" - checksum: ff3b7f09c2746d068dee8d39501f09dbf71728c4facdc9cb0e266ea6615ad97e61267c0606ab3da88d11ef1609ce904cef45a9c56b2b397f742388d7f15bb740 - languageName: node - linkType: hard - -"@types/qrcode@npm:1.5.5": - version: 1.5.5 - resolution: "@types/qrcode@npm:1.5.5" - dependencies: - "@types/node": "*" - checksum: d92c1d3e77406bf13a03ec521b2ffb1ac99b2e6ea3a17cad670f2610f62e1293554c57e4074bb2fd4e9369f475f863b69e0ae8c543cb049c4a3c1b0c2d92522a - languageName: node - linkType: hard - -"@types/qs@npm:*": - version: 6.9.11 - resolution: "@types/qs@npm:6.9.11" - checksum: 620ca1628bf3da65662c54ed6ebb120b18a3da477d0bfcc872b696685a9bb1893c3c92b53a1190a8f54d52eaddb6af8b2157755699ac83164604329935e8a7f2 - languageName: node - linkType: hard - -"@types/qs@npm:6.9.2": - version: 6.9.2 - resolution: "@types/qs@npm:6.9.2" - checksum: 754499cdb169c09a7799d7e0276cade1b79a73337a528c2231d5b07ce1973779be6450b162e7dabfe3593504f46f8969915ca8e2e15702e42a58e2911045b34e - languageName: node - linkType: hard - -"@types/range-parser@npm:*": - version: 1.2.4 - resolution: "@types/range-parser@npm:1.2.4" - checksum: b7c0dfd5080a989d6c8bb0b6750fc0933d9acabeb476da6fe71d8bdf1ab65e37c136169d84148034802f48378ab94e3c37bb4ef7656b2bec2cb9c0f8d4146a95 - languageName: node - linkType: hard - -"@types/react-dom@npm:18.3.1": - version: 18.3.1 - resolution: "@types/react-dom@npm:18.3.1" - dependencies: - "@types/react": "*" - checksum: ad28ecce3915d30dc76adc2a1373fda1745ba429cea290e16c6628df9a05fd80b6403c8e87d78b45e6c60e51df7a67add389ab62b90070fbfdc9bda8307d9953 - languageName: node - linkType: hard - -"@types/react-redux@npm:7.1.30": - version: 7.1.30 - resolution: "@types/react-redux@npm:7.1.30" - dependencies: - "@types/hoist-non-react-statics": ^3.3.0 - "@types/react": "*" - hoist-non-react-statics: ^3.3.0 - redux: ^4.0.0 - checksum: df86069aae0b2dd79752a45265b36ad5583f4c87a05731607192a4df6dd4e1ed151e458957cced31df37cbb60c58c41211f7186a783305a8af62d8cd69ae6789 - languageName: node - linkType: hard - -"@types/react-scroll-sync@npm:0.9.0": - version: 0.9.0 - resolution: "@types/react-scroll-sync@npm:0.9.0" - dependencies: - "@types/react": "*" - checksum: 4302b1c5eee01761903873926ce097ede0c04b781aaad58fd6302697676046d494750cb9b40b657b76c87836ad52f497784f0160b29520db3390be9d490ecc65 - languageName: node - linkType: hard - -"@types/react-table@npm:7.7.12": - version: 7.7.12 - resolution: "@types/react-table@npm:7.7.12" - dependencies: - "@types/react": "*" - checksum: 287ea68e75b56c2e70e6d6491cd172348c7302b032789047eb2dca1b25b240684e48a60f58140575828b790f95724b9f3ec4d3adce82fc1c05d994def1449009 - languageName: node - linkType: hard - -"@types/react-test-renderer@npm:19.0.0": - version: 19.0.0 - resolution: "@types/react-test-renderer@npm:19.0.0" - dependencies: - "@types/react": "*" - checksum: a22c4401e3af216a8c2cded22702bb6f928e22af7fbcaca7e0cc28447ec34bea5a94c6d6de7ed5734c527a1b53868393e67b7b4815623802e29abb1d8d378d61 - languageName: node - linkType: hard - -"@types/react-virtualized-auto-sizer@npm:1.0.0": - version: 1.0.0 - resolution: "@types/react-virtualized-auto-sizer@npm:1.0.0" - dependencies: - "@types/react": "*" - checksum: f98ecd3e22d7921e7f27cd883dcf5d61d11f383a7a09ec3a84873996dbf5057d57d8f5bbcf6d49ffd6918c166972e349f96657eb6133d406fa9a3a703f843f01 - languageName: node - linkType: hard - -"@types/react-window-infinite-loader@npm:1.0.6": - version: 1.0.6 - resolution: "@types/react-window-infinite-loader@npm:1.0.6" - dependencies: - "@types/react": "*" - "@types/react-window": "*" - checksum: d4648dfb44614e4f0137d7b77eb1868b0c5252f451a78edfc4520e508157ce7687d4b7d9efd6df8f01e72e0d92224338b8c8d934220f32a3081b528599a25829 - languageName: node - linkType: hard - -"@types/react-window@npm:*": - version: 1.8.8 - resolution: "@types/react-window@npm:1.8.8" - dependencies: - "@types/react": "*" - checksum: 253c9d6e0c942f34633edbddcbc369324403c42458ff004457c5bd5972961d8433a909c0cc1a89c918063d5eb85ecbdd774142af2555fae61f4ceb3ba9884b5a - languageName: node - linkType: hard - -"@types/react-window@npm:1.8.2": - version: 1.8.2 - resolution: "@types/react-window@npm:1.8.2" - dependencies: - "@types/react": "*" - checksum: c127ed420d881510fe647539342e7c494802aab12fd6cb61f9f8ba47ef16d3683e632b7a6a07eb0d284ea8f0953ae7941eafa2c51c0bcb3b176d009eac09c79a - languageName: node - linkType: hard - -"@types/react@npm:18.3.18": - version: 18.3.18 - resolution: "@types/react@npm:18.3.18" - dependencies: - "@types/prop-types": "*" - csstype: ^3.0.2 - checksum: 5933597bc9f53e282f0438f0bb76d0f0fab60faabe760ea806e05ffe6f5c61b9b4d363e1a03a8fea47c510d493c6cf926cdeeba9f7074fa97b61940c350245e7 - languageName: node - linkType: hard - -"@types/rebass@npm:4.0.7": - version: 4.0.7 - resolution: "@types/rebass@npm:4.0.7" - dependencies: - "@types/react": "*" - "@types/styled-components": "*" - "@types/styled-system": "*" - "@types/styled-system__css": "*" - checksum: cb2fc75787fe9d053f5a8bafbce6e91a29f841482ae92aa9ea75bf9d00f0430934803e38e68d22c7c8cd56f65a1de26f70ea719ea46e061743b516a4e5cae7b6 - languageName: node - linkType: hard - -"@types/redux-logger@npm:3.0.9": - version: 3.0.9 - resolution: "@types/redux-logger@npm:3.0.9" - dependencies: - redux: ^4.0.0 - checksum: c41fdc09198fae2d62ff7d6bd029ccae1fed655e6a7abd40614a8db5d6e01adbe565881b2c8d398789804a48259e3399af3939f994a532c11904ba2021799275 - languageName: node - linkType: hard - -"@types/redux-mock-store@npm:1.0.6": - version: 1.0.6 - resolution: "@types/redux-mock-store@npm:1.0.6" - dependencies: - redux: ^4.0.5 - checksum: 5c799d2fc5b3f0f84bfcd6243c56b1ac98be6707057f570b5e51e9d305f446978cc2958c7e0b629ebf73293f15a79765517e6d0a1df0371fd27551f7128325c7 - languageName: node - linkType: hard - -"@types/redux-persist-webextension-storage@npm:1.0.3": - version: 1.0.3 - resolution: "@types/redux-persist-webextension-storage@npm:1.0.3" - checksum: 666f12d8c8e463efac5a1cf36dd2bce409190d05f682d3eb71079ccfb56aa71291a29cd2159530783c224df43bb6326529e802870ca09ee920fb1b240169e986 - languageName: node - linkType: hard - -"@types/request@npm:^2.48.8": - version: 2.48.12 - resolution: "@types/request@npm:2.48.12" - dependencies: - "@types/caseless": "*" - "@types/node": "*" - "@types/tough-cookie": "*" - form-data: ^2.5.0 - checksum: 20dfad0a46b4249bf42f09c51fbd4d02ec6738c5152194b5c7c69bab80b00eae9cc71df4489ffa929d0968d453ef7d0823d1f98871efed563a4fdb57bf0a4c58 - languageName: node - linkType: hard - -"@types/resolve@npm:1.17.1": - version: 1.17.1 - resolution: "@types/resolve@npm:1.17.1" - dependencies: - "@types/node": "*" - checksum: dc6a6df507656004e242dcb02c784479deca516d5f4b58a1707e708022b269ae147e1da0521f3e8ad0d63638869d87e0adc023f0bd5454aa6f72ac66c7525cf5 - languageName: node - linkType: hard - -"@types/resolve@npm:^1.20.2": - version: 1.20.6 - resolution: "@types/resolve@npm:1.20.6" - checksum: dc35f5517606b6687cd971c0281ac58bdee2c50c051b030f04647d3991688be2259c304ee97e5b5d4b9936072c36767eb5933b54611a407d6557972bb6fea4f6 - languageName: node - linkType: hard - -"@types/responselike@npm:^1.0.0": - version: 1.0.0 - resolution: "@types/responselike@npm:1.0.0" - dependencies: - "@types/node": "*" - checksum: e99fc7cc6265407987b30deda54c1c24bb1478803faf6037557a774b2f034c5b097ffd65847daa87e82a61a250d919f35c3588654b0fdaa816906650f596d1b0 - languageName: node - linkType: hard - -"@types/retry@npm:0.12.0": - version: 0.12.0 - resolution: "@types/retry@npm:0.12.0" - checksum: 61a072c7639f6e8126588bf1eb1ce8835f2cb9c2aba795c4491cf6310e013267b0c8488039857c261c387e9728c1b43205099223f160bb6a76b4374f741b5603 - languageName: node - linkType: hard - -"@types/secp256k1@npm:^4.0.1": - version: 4.0.6 - resolution: "@types/secp256k1@npm:4.0.6" - dependencies: - "@types/node": "*" - checksum: 984494caf49a4ce99fda2b9ea1840eb47af946b8c2737314108949bcc0c06b4880e871296bd49ed6ea4c8423e3a302ad79fec43abfc987330e7eb98f0c4e8ba4 - languageName: node - linkType: hard - -"@types/semver@npm:^6.0.1": - version: 6.2.3 - resolution: "@types/semver@npm:6.2.3" - checksum: 83c86d7005b229df9c4c0d6d13825b839a01932895504596140aea19e2b88f63ac27ab1575347451b50eedb63f72309e845ce1a0ca78360c4f719bbb38371594 - languageName: node - linkType: hard - -"@types/semver@npm:^7.3.12, @types/semver@npm:^7.3.4, @types/semver@npm:^7.5.0, @types/semver@npm:^7.5.6": - version: 7.5.8 - resolution: "@types/semver@npm:7.5.8" - checksum: ea6f5276f5b84c55921785a3a27a3cd37afee0111dfe2bcb3e03c31819c197c782598f17f0b150a69d453c9584cd14c4c4d7b9a55d2c5e6cacd4d66fdb3b3663 - languageName: node - linkType: hard - -"@types/serve-index@npm:^1.9.1": - version: 1.9.1 - resolution: "@types/serve-index@npm:1.9.1" - dependencies: - "@types/express": "*" - checksum: 026f3995fb500f6df7c3fe5009e53bad6d739e20b84089f58ebfafb2f404bbbb6162bbe33f72d2f2af32d5b8d3799c8e179793f90d9ed5871fb8591190bb6056 - languageName: node - linkType: hard - -"@types/serve-static@npm:*, @types/serve-static@npm:^1.13.10": - version: 1.15.1 - resolution: "@types/serve-static@npm:1.15.1" - dependencies: - "@types/mime": "*" - "@types/node": "*" - checksum: 2e078bdc1e458c7dfe69e9faa83cc69194b8896cce57cb745016580543c7ab5af07fdaa8ac1765eb79524208c81017546f66056f44d1204f812d72810613de36 - languageName: node - linkType: hard - -"@types/sinonjs__fake-timers@npm:8.1.1": - version: 8.1.1 - resolution: "@types/sinonjs__fake-timers@npm:8.1.1" - checksum: ca09d54d47091d87020824a73f026300fa06b17cd9f2f9b9387f28b549364b141ef194ee28db762f6588de71d8febcd17f753163cb7ea116b8387c18e80ebd5c - languageName: node - linkType: hard - -"@types/sizzle@npm:^2.3.2": - version: 2.3.6 - resolution: "@types/sizzle@npm:2.3.6" - checksum: 1573d6c86fdf0d7d3d2759b0db65e374b99d773b57781443a6400ce3d0a3bf6a3be393fb9aee5076eff8399c14b7b4d3f51391d1d5cb6a3dcbdccee06a5f6e3e - languageName: node - linkType: hard - -"@types/sockjs@npm:^0.3.33": - version: 0.3.33 - resolution: "@types/sockjs@npm:0.3.33" - dependencies: - "@types/node": "*" - checksum: b9bbb2b5c5ead2fb884bb019f61a014e37410bddd295de28184e1b2e71ee6b04120c5ba7b9954617f0bdf962c13d06249ce65004490889c747c80d3f628ea842 - languageName: node - linkType: hard - -"@types/stack-utils@npm:^2.0.0": - version: 2.0.1 - resolution: "@types/stack-utils@npm:2.0.1" - checksum: 205fdbe3326b7046d7eaf5e494d8084f2659086a266f3f9cf00bccc549c8e36e407f88168ad4383c8b07099957ad669f75f2532ed4bc70be2b037330f7bae019 - languageName: node - linkType: hard - -"@types/styled-components@npm:*": - version: 5.1.30 - resolution: "@types/styled-components@npm:5.1.30" - dependencies: - "@types/hoist-non-react-statics": "*" - "@types/react": "*" - csstype: ^3.0.2 - checksum: 22948191a2de0187ab20383c1d9a6b7c9dfda9e6d58f104e03fd8bb8f3ee150b800806e90efa888f1d0fbb53d404613e4b6cccf0c77eb4287e8b1aeb1d7c1cb5 - languageName: node - linkType: hard - -"@types/styled-components@npm:5.1.25": - version: 5.1.25 - resolution: "@types/styled-components@npm:5.1.25" - dependencies: - "@types/hoist-non-react-statics": "*" - "@types/react": "*" - csstype: ^3.0.2 - checksum: 60ce64f13283b01da54fd3a4c5703769d8575c979d5ec6b67ad124c2d4df980c9b96bb91af87e03f6447a816a5d2b0270c63eefad60cfa885091b594984525f5 - languageName: node - linkType: hard - -"@types/styled-system@npm:*": - version: 5.1.22 - resolution: "@types/styled-system@npm:5.1.22" - dependencies: - csstype: ^3.0.2 - checksum: 4fc51ec24590ab979bd0d8fa539c19a50fe8be0cfc2243e769caeb40a0aea50322b07e7cfe06149cbd56e0c2c4aed48cb7fbe35221529b880493b73e4b639036 - languageName: node - linkType: hard - -"@types/styled-system__css@npm:*": - version: 5.0.21 - resolution: "@types/styled-system__css@npm:5.0.21" - dependencies: - csstype: ^3.0.2 - checksum: db32a674d214c6693baa91feec9e49e9df61af4cfd8244b6709f70ee184881928feb0366d07765dfa4c04fed79bcb7f670b0ca61bec1f2be41fc68c632593708 - languageName: node - linkType: hard - -"@types/symlink-or-copy@npm:^1.2.0": - version: 1.2.0 - resolution: "@types/symlink-or-copy@npm:1.2.0" - checksum: 18fb73094b2cf6c84544939bd6344d7a8cd1ccf8496a1cfb1320f38491c8dfbea3248bb6e91495322a51a493e04a767582a214d5261f5c5b007aa6ef65fc8b50 - languageName: node - linkType: hard - -"@types/testing-library__cypress@npm:5.0.13": - version: 5.0.13 - resolution: "@types/testing-library__cypress@npm:5.0.13" - dependencies: - "@testing-library/dom": ^7.11.0 - cypress: "*" - checksum: 565390f296efb6c65da83b4febe77520910f45a505722dae3adca78aebddc83a0a8a9bb5d099e6c1154537e8ca05187d0ec0dcf1ff3ce481e21d9baadee7231d - languageName: node - linkType: hard - -"@types/tough-cookie@npm:*": - version: 4.0.2 - resolution: "@types/tough-cookie@npm:4.0.2" - checksum: e055556ffdaa39ad85ede0af192c93f93f986f4bd9e9426efdc2948e3e2632db3a4a584d4937dbf6d7620527419bc99e6182d3daf2b08685e710f2eda5291905 - languageName: node - linkType: hard - -"@types/trusted-types@npm:^2.0.2": - version: 2.0.6 - resolution: "@types/trusted-types@npm:2.0.6" - checksum: 04250c7175e565b4d32cc2fd9ac1824ab9f0b2cfa82a7978581ffa1c96d7ed4166dc2415b4670cfcb734b389c49c3e9fc028b06ff325d77cc9e6f06bb05e273e - languageName: node - linkType: hard - -"@types/ua-parser-js@npm:0.7.31": - version: 0.7.31 - resolution: "@types/ua-parser-js@npm:0.7.31" - checksum: ef6a9fe4273f884b663a9318b9edf05f3b7b41f6442601f0ef6cb49dfd315d79ef6a1744a2f5c2841d0a568594e492e9bf18868ec8e8204a18a8facf914c0e24 - languageName: node - linkType: hard - -"@types/unist@npm:^2.0.0": - version: 2.0.6 - resolution: "@types/unist@npm:2.0.6" - checksum: 25cb860ff10dde48b54622d58b23e66214211a61c84c0f15f88d38b61aa1b53d4d46e42b557924a93178c501c166aa37e28d7f6d994aba13d24685326272d5db - languageName: node - linkType: hard - -"@types/use-sync-external-store@npm:^0.0.3": - version: 0.0.3 - resolution: "@types/use-sync-external-store@npm:0.0.3" - checksum: 161ddb8eec5dbe7279ac971531217e9af6b99f7783213566d2b502e2e2378ea19cf5e5ea4595039d730aa79d3d35c6567d48599f69773a02ffcff1776ec2a44e - languageName: node - linkType: hard - -"@types/uuid@npm:9.0.1": - version: 9.0.1 - resolution: "@types/uuid@npm:9.0.1" - checksum: c472b8a77cbeded4bc529220b8611afa39bd64677f507838f8083d8aac8033b1f88cb9ddaa2f8589e0dcd2317291d0f6e1379f82d5ceebd6f74f3b4825288e00 - languageName: node - linkType: hard - -"@types/uuid@npm:^9.0.1": - version: 9.0.8 - resolution: "@types/uuid@npm:9.0.8" - checksum: b8c60b7ba8250356b5088302583d1704a4e1a13558d143c549c408bf8920535602ffc12394ede77f8a8083511b023704bc66d1345792714002bfa261b17c5275 - languageName: node - linkType: hard - -"@types/warning@npm:^3.0.0": - version: 3.0.3 - resolution: "@types/warning@npm:3.0.3" - checksum: 862b71c918283d2ace5cab4e9f0167507a15ee9cf4d46035c858bdd4bf1ee83cbfb42bcfd4da6e7e254a2efa32200b6521f3719c729e39e88e336309d53bb4c4 - languageName: node - linkType: hard - -"@types/wcag-contrast@npm:3.0.0": - version: 3.0.0 - resolution: "@types/wcag-contrast@npm:3.0.0" - checksum: 49de8b7572d1ad12b71d29fd5856b5a4eebf65a809de6d6eafeca2f2783121a4ac734f572b27cff47f2e1863142d20e2f53a18b4ca5dd19545f246bde334f258 - languageName: node - linkType: hard - -"@types/ws@npm:^8.0.0, @types/ws@npm:^8.5.5": - version: 8.5.5 - resolution: "@types/ws@npm:8.5.5" - dependencies: - "@types/node": "*" - checksum: d00bf8070e6938e3ccf933010921c6ce78ac3606696ce37a393b27a9a603f7bd93ea64f3c5fa295a2f743575ba9c9a9fdb904af0f5fe2229bf2adf0630386e4a - languageName: node - linkType: hard - -"@types/xml2js@npm:0.4.14": - version: 0.4.14 - resolution: "@types/xml2js@npm:0.4.14" - dependencies: - "@types/node": "*" - checksum: df9f106b9953dcdec7ba3304ebc56d6c2f61d49bf556d600bed439f94a1733f73ca0bf2d0f64330b402191622862d9d6058bab9d7e3dcb5b0fe51ebdc4372aac - languageName: node - linkType: hard - -"@types/yargs-parser@npm:*": - version: 21.0.0 - resolution: "@types/yargs-parser@npm:21.0.0" - checksum: b2f4c8d12ac18a567440379909127cf2cec393daffb73f246d0a25df36ea983b93b7e9e824251f959e9f928cbc7c1aab6728d0a0ff15d6145f66cec2be67d9a2 - languageName: node - linkType: hard - -"@types/yargs@npm:^15.0.0": - version: 15.0.14 - resolution: "@types/yargs@npm:15.0.14" - dependencies: - "@types/yargs-parser": "*" - checksum: 8e358aeb8f0c3758e59e2b8fcfdee5627ab2fe3d92f50f380503d966c7f33287be3322155516a50d27727fde1ad3878f48f60cd6648439126d4b0bbb1a1153ed - languageName: node - linkType: hard - -"@types/yargs@npm:^16.0.0": - version: 16.0.4 - resolution: "@types/yargs@npm:16.0.4" - dependencies: - "@types/yargs-parser": "*" - checksum: caa21d2c957592fe2184a8368c8cbe5a82a6c2e2f2893722e489f842dc5963293d2f3120bc06fe3933d60a3a0d1e2eb269649fd6b1947fe1820f8841ba611dd9 - languageName: node - linkType: hard - -"@types/yargs@npm:^17.0.8": - version: 17.0.17 - resolution: "@types/yargs@npm:17.0.17" - dependencies: - "@types/yargs-parser": "*" - checksum: 4f1b5149e794c8960652b4339dc96655e53b48fdbe1b847fcb0db95e72e760724a4c5c616a7fccb3c0ae8beb0e57e06e37391d492e916e3ff179aafeb890e426 - languageName: node - linkType: hard - -"@types/yauzl@npm:^2.9.1": - version: 2.10.0 - resolution: "@types/yauzl@npm:2.10.0" - dependencies: - "@types/node": "*" - checksum: 55d27ae5d346ea260e40121675c24e112ef0247649073848e5d4e03182713ae4ec8142b98f61a1c6cbe7d3b72fa99bbadb65d8b01873e5e605cdc30f1ff70ef2 - languageName: node - linkType: hard - -"@types/zxcvbn@npm:4.4.2": - version: 4.4.2 - resolution: "@types/zxcvbn@npm:4.4.2" - checksum: 8b1dc561970a3c69d13b03a83ea4b3bd1ef9d6ea46e85454b1260eb5219262abd6ae36970e1fe3389f2d0341108cdde8cee470f85e5c6b5cd6bef165f10ec076 - languageName: node - linkType: hard - -"@typescript-eslint/eslint-plugin@npm:6.20.0": - version: 6.20.0 - resolution: "@typescript-eslint/eslint-plugin@npm:6.20.0" - dependencies: - "@eslint-community/regexpp": ^4.5.1 - "@typescript-eslint/scope-manager": 6.20.0 - "@typescript-eslint/type-utils": 6.20.0 - "@typescript-eslint/utils": 6.20.0 - "@typescript-eslint/visitor-keys": 6.20.0 - debug: ^4.3.4 - graphemer: ^1.4.0 - ignore: ^5.2.4 - natural-compare: ^1.4.0 - semver: ^7.5.4 - ts-api-utils: ^1.0.1 - peerDependencies: - "@typescript-eslint/parser": ^6.0.0 || ^6.0.0-alpha - eslint: ^7.0.0 || ^8.0.0 - peerDependenciesMeta: - typescript: - optional: true - checksum: d002cbe1a99aef5d5b1601702f08a9e3c060ab5355707b4428ec61854b88513e625e5a898dc9fded669a4b33bb71a216aa7799f0e0c58ee00150218c69e7959c - languageName: node - linkType: hard - -"@typescript-eslint/experimental-utils@npm:^5.0.0": - version: 5.62.0 - resolution: "@typescript-eslint/experimental-utils@npm:5.62.0" - dependencies: - "@typescript-eslint/utils": 5.62.0 - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - checksum: ce55d9f74eac5cb94d66d5db9ead9a5d734f4301519fb5956a57f4b405a5318a115b0316195a3c039e0111489138680411709cb769085d71e1e1db1376ea0949 - languageName: node - linkType: hard - -"@typescript-eslint/parser@npm:6.20.0": - version: 6.20.0 - resolution: "@typescript-eslint/parser@npm:6.20.0" - dependencies: - "@typescript-eslint/scope-manager": 6.20.0 - "@typescript-eslint/types": 6.20.0 - "@typescript-eslint/typescript-estree": 6.20.0 - "@typescript-eslint/visitor-keys": 6.20.0 - debug: ^4.3.4 - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - peerDependenciesMeta: - typescript: - optional: true - checksum: 91c0a715e7a37a0386770b0c4c208d0732736828294a3f58901655f0edf9230d1211dbfb8ac0ea562993506130773131fc1ee241311f43d78007af959bd46b9a - languageName: node - linkType: hard - -"@typescript-eslint/parser@npm:^5.30.5, @typescript-eslint/parser@npm:^5.5.0": - version: 5.62.0 - resolution: "@typescript-eslint/parser@npm:5.62.0" - dependencies: - "@typescript-eslint/scope-manager": 5.62.0 - "@typescript-eslint/types": 5.62.0 - "@typescript-eslint/typescript-estree": 5.62.0 - debug: ^4.3.4 - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - peerDependenciesMeta: - typescript: - optional: true - checksum: d168f4c7f21a7a63f47002e2d319bcbb6173597af5c60c1cf2de046b46c76b4930a093619e69faf2d30214c29ab27b54dcf1efc7046a6a6bd6f37f59a990e752 - languageName: node - linkType: hard - -"@typescript-eslint/scope-manager@npm:5.62.0": - version: 5.62.0 - resolution: "@typescript-eslint/scope-manager@npm:5.62.0" - dependencies: - "@typescript-eslint/types": 5.62.0 - "@typescript-eslint/visitor-keys": 5.62.0 - checksum: 6062d6b797fe1ce4d275bb0d17204c827494af59b5eaf09d8a78cdd39dadddb31074dded4297aaf5d0f839016d601032857698b0e4516c86a41207de606e9573 - languageName: node - linkType: hard - -"@typescript-eslint/scope-manager@npm:6.20.0": - version: 6.20.0 - resolution: "@typescript-eslint/scope-manager@npm:6.20.0" - dependencies: - "@typescript-eslint/types": 6.20.0 - "@typescript-eslint/visitor-keys": 6.20.0 - checksum: 54a06c485d4be6ac95b283fe2e29c2cd8a9a0b159d0f38e5f670dd2e1265358e2ad7b4442a0c61870430b38a6d0bf640843caaaf4c7f122523455221bbb3b011 - languageName: node - linkType: hard - -"@typescript-eslint/type-utils@npm:6.20.0": - version: 6.20.0 - resolution: "@typescript-eslint/type-utils@npm:6.20.0" - dependencies: - "@typescript-eslint/typescript-estree": 6.20.0 - "@typescript-eslint/utils": 6.20.0 - debug: ^4.3.4 - ts-api-utils: ^1.0.1 - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - peerDependenciesMeta: - typescript: - optional: true - checksum: 438702c626706cb62f0fcbbb3e3c5c8946ade84f170c182eaebb43604716d2dbf05fac105bdbcb968f3d3375e8076bed8bf095ab65dc891666c91d9174bced6f - languageName: node - linkType: hard - -"@typescript-eslint/types@npm:4.33.0": - version: 4.33.0 - resolution: "@typescript-eslint/types@npm:4.33.0" - checksum: 3baae1ca35872421b4eb60f5d3f3f32dc1d513f2ae0a67dee28c7d159fd7a43ed0d11a8a5a0f0c2d38507ffa036fc7c511cb0f18a5e8ac524b3ebde77390ec53 - languageName: node - linkType: hard - -"@typescript-eslint/types@npm:5.62.0": - version: 5.62.0 - resolution: "@typescript-eslint/types@npm:5.62.0" - checksum: 48c87117383d1864766486f24de34086155532b070f6264e09d0e6139449270f8a9559cfef3c56d16e3bcfb52d83d42105d61b36743626399c7c2b5e0ac3b670 - languageName: node - linkType: hard - -"@typescript-eslint/types@npm:6.20.0": - version: 6.20.0 - resolution: "@typescript-eslint/types@npm:6.20.0" - checksum: a4551ce9ce40119c2401a70d5a0f9fd16eec4771d076933983fd5fd4a42c0d9a1ac883dfa7640ddec0459057005d4ef4fd19d681b14b8cef89b094283a117f5f - languageName: node - linkType: hard - -"@typescript-eslint/typescript-estree@npm:5.62.0, @typescript-eslint/typescript-estree@npm:^5.55.0": - version: 5.62.0 - resolution: "@typescript-eslint/typescript-estree@npm:5.62.0" - dependencies: - "@typescript-eslint/types": 5.62.0 - "@typescript-eslint/visitor-keys": 5.62.0 - debug: ^4.3.4 - globby: ^11.1.0 - is-glob: ^4.0.3 - semver: ^7.3.7 - tsutils: ^3.21.0 - peerDependenciesMeta: - typescript: - optional: true - checksum: 3624520abb5807ed8f57b1197e61c7b1ed770c56dfcaca66372d584ff50175225798bccb701f7ef129d62c5989070e1ee3a0aa2d84e56d9524dcf011a2bb1a52 - languageName: node - linkType: hard - -"@typescript-eslint/typescript-estree@npm:6.20.0": - version: 6.20.0 - resolution: "@typescript-eslint/typescript-estree@npm:6.20.0" - dependencies: - "@typescript-eslint/types": 6.20.0 - "@typescript-eslint/visitor-keys": 6.20.0 - debug: ^4.3.4 - globby: ^11.1.0 - is-glob: ^4.0.3 - minimatch: 9.0.3 - semver: ^7.5.4 - ts-api-utils: ^1.0.1 - peerDependenciesMeta: - typescript: - optional: true - checksum: 256cdeae8c9c365f23ab1cefb29b9bc20451fc7b879651f47fd388e13976b62ecd0da56bf5b7a5d7050de1160b0e05fc841c4e5b0e91d8b03728a52d76e8caf9 - languageName: node - linkType: hard - -"@typescript-eslint/typescript-estree@npm:^4.33.0": - version: 4.33.0 - resolution: "@typescript-eslint/typescript-estree@npm:4.33.0" - dependencies: - "@typescript-eslint/types": 4.33.0 - "@typescript-eslint/visitor-keys": 4.33.0 - debug: ^4.3.1 - globby: ^11.0.3 - is-glob: ^4.0.1 - semver: ^7.3.5 - tsutils: ^3.21.0 - peerDependenciesMeta: - typescript: - optional: true - checksum: 2566984390c76bd95f43240057215c068c69769e406e27aba41e9f21fd300074d6772e4983fa58fe61e80eb5550af1548d2e31e80550d92ba1d051bb00fe6f5c - languageName: node - linkType: hard - -"@typescript-eslint/utils@npm:5.62.0, @typescript-eslint/utils@npm:^5.10.0, @typescript-eslint/utils@npm:^5.58.0, @typescript-eslint/utils@npm:^5.62.0": - version: 5.62.0 - resolution: "@typescript-eslint/utils@npm:5.62.0" - dependencies: - "@eslint-community/eslint-utils": ^4.2.0 - "@types/json-schema": ^7.0.9 - "@types/semver": ^7.3.12 - "@typescript-eslint/scope-manager": 5.62.0 - "@typescript-eslint/types": 5.62.0 - "@typescript-eslint/typescript-estree": 5.62.0 - eslint-scope: ^5.1.1 - semver: ^7.3.7 - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - checksum: ee9398c8c5db6d1da09463ca7bf36ed134361e20131ea354b2da16a5fdb6df9ba70c62a388d19f6eebb421af1786dbbd79ba95ddd6ab287324fc171c3e28d931 - languageName: node - linkType: hard - -"@typescript-eslint/utils@npm:6.20.0": - version: 6.20.0 - resolution: "@typescript-eslint/utils@npm:6.20.0" - dependencies: - "@eslint-community/eslint-utils": ^4.4.0 - "@types/json-schema": ^7.0.12 - "@types/semver": ^7.5.0 - "@typescript-eslint/scope-manager": 6.20.0 - "@typescript-eslint/types": 6.20.0 - "@typescript-eslint/typescript-estree": 6.20.0 - semver: ^7.5.4 - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - checksum: 1c248ce34b612e922796c3bbb323d05994f4bca5d49a200ff14f2d7522c9ca5bdf08613c4f2187c9242f67d73f9c2ec5d07b05c5af7034a2e57843b99230b0b0 - languageName: node - linkType: hard - -"@typescript-eslint/visitor-keys@npm:4.33.0": - version: 4.33.0 - resolution: "@typescript-eslint/visitor-keys@npm:4.33.0" - dependencies: - "@typescript-eslint/types": 4.33.0 - eslint-visitor-keys: ^2.0.0 - checksum: 59953e474ad4610c1aa23b2b1a964445e2c6201521da6367752f37939d854352bbfced5c04ea539274065e012b1337ba3ffa49c2647a240a4e87155378ba9873 - languageName: node - linkType: hard - -"@typescript-eslint/visitor-keys@npm:5.62.0": - version: 5.62.0 - resolution: "@typescript-eslint/visitor-keys@npm:5.62.0" - dependencies: - "@typescript-eslint/types": 5.62.0 - eslint-visitor-keys: ^3.3.0 - checksum: 976b05d103fe8335bef5c93ad3f76d781e3ce50329c0243ee0f00c0fcfb186c81df50e64bfdd34970148113f8ade90887f53e3c4938183afba830b4ba8e30a35 - languageName: node - linkType: hard - -"@typescript-eslint/visitor-keys@npm:6.20.0": - version: 6.20.0 - resolution: "@typescript-eslint/visitor-keys@npm:6.20.0" - dependencies: - "@typescript-eslint/types": 6.20.0 - eslint-visitor-keys: ^3.4.1 - checksum: 6a360f16b7b28d3cbb539252d17c6ac8519fd26e5f27f895cd7d400e9ec428b67ecda131f2bd2d57144c0436dcdb15022749b163a46c61e62af2312e8e3be488 - languageName: node - linkType: hard - -"@ungap/structured-clone@npm:^1.2.0": - version: 1.2.1 - resolution: "@ungap/structured-clone@npm:1.2.1" - checksum: 1e3b9fef293118861f0b2159b3695fc7f3793c0707095888ebb3ac7183f78c390e68f04cd4b4cf9ac979ae0da454505e08b3aae887cdd639609a3fe529e19e59 - languageName: node - linkType: hard - -"@uniswap/analytics-events@npm:2.41.0": - version: 2.41.0 - resolution: "@uniswap/analytics-events@npm:2.41.0" - checksum: 552f89113b75a09f8ff8332c823363888f59cc2521eb5f4007f87cf931b7121cd057c2450a1a06152116a9353de295d0ffdd2c4b29c56d0bb7b9b497fc5a1f53 - languageName: node - linkType: hard - -"@uniswap/analytics@npm:1.7.0": - version: 1.7.0 - resolution: "@uniswap/analytics@npm:1.7.0" - dependencies: - "@amplitude/analytics-browser": ^1.5.8 - react: ^18.2.0 - react-dom: ^18.2.0 - checksum: b591c67323b849210a86c62978c686207160176a47ebe91b48ba22f38ce9b9f91cc275aa5103b4ab6528ed4d71d97ecff7cfbd1671c0aebeb850ebadc2acaf1b - languageName: node - linkType: hard - -"@uniswap/client-embeddedwallet@npm:0.0.13": - version: 0.0.13 - resolution: "@uniswap/client-embeddedwallet@npm:0.0.13" - checksum: aaac81afa3351bbb11a694ba3b9cd25d13569dafcbb57bf5dca91bfefce9c9a83881e5c46f9af24c9c46f38f5c1d0978802acb788e4625883bcac2b872a725d1 - languageName: node - linkType: hard - -"@uniswap/client-explore@npm:0.0.15": - version: 0.0.15 - resolution: "@uniswap/client-explore@npm:0.0.15" - checksum: a8572a1cba1530c38b0e309cb15c0e1c0e8984731c24d5d8ea4513b793239dc840e632c578064f06c446cf0db516a4245713e8ccd21992fcc56143f6bd05d58e - languageName: node - linkType: hard - -"@uniswap/client-pools@npm:0.0.13": - version: 0.0.13 - resolution: "@uniswap/client-pools@npm:0.0.13" - checksum: 53773fbf35cf32366a3b1b88a7081a6000026aecda08542fa57607bc2dcf8662b47f987ec56115f715e537d1718834cb55b6132862f6ac3d94d789faf34c1f4f - languageName: node - linkType: hard - -"@uniswap/default-token-list@npm:11.19.0": - version: 11.19.0 - resolution: "@uniswap/default-token-list@npm:11.19.0" - checksum: c626834a6b859b19798bb10497a92705e780e9f5fe07087fb464901deb1bb71b8daf2957c8be11791046056d2ae187951991a3e363fb081ee10d806c55c9696e - languageName: node - linkType: hard - -"@uniswap/eslint-config@workspace:^, @uniswap/eslint-config@workspace:packages/eslint-config": - version: 0.0.0-use.local - resolution: "@uniswap/eslint-config@workspace:packages/eslint-config" - dependencies: - "@babel/core": 7.26.0 - "@babel/preset-env": 7.26.0 - "@babel/preset-typescript": 7.26.0 - "@jambit/eslint-plugin-typed-redux-saga": 0.4.0 - "@react-native-community/eslint-config": 3.2.0 - "@rushstack/eslint-patch": 1.5.1 - "@types/jest": 29.5.14 - "@typescript-eslint/eslint-plugin": 6.20.0 - "@typescript-eslint/parser": 6.20.0 - babel-jest: 29.7.0 - eslint: 8.44.0 - eslint-config-prettier: 8.10.0 - eslint-config-turbo: latest - eslint-import-resolver-typescript: 3.6.3 - eslint-plugin-check-file: 2.8.0 - eslint-plugin-cypress: 2.15.2 - eslint-plugin-detox: 1.0.0 - eslint-plugin-ft-flow: 2.0.3 - eslint-plugin-import: 2.27.5 - eslint-plugin-jest: 27.9.0 - eslint-plugin-local-rules: 3.0.2 - eslint-plugin-no-relative-import-paths: 1.5.2 - eslint-plugin-no-unsanitized: 4.0.1 - eslint-plugin-prettier: 4.2.1 - eslint-plugin-react: 7.34.1 - eslint-plugin-react-hooks: 4.6.0 - eslint-plugin-react-native: 4.1.0 - eslint-plugin-security: 1.5.0 - eslint-plugin-spellcheck: 0.0.20 - eslint-plugin-storybook: 0.8.0 - eslint-plugin-unused-imports: 2.0.0 - jest: 29.7.0 - typescript: 5.3.3 - peerDependencies: - eslint: 8.44.0 - languageName: unknown - linkType: soft - -"@uniswap/ethers-rs-mobile@npm:0.0.5": - version: 0.0.5 - resolution: "@uniswap/ethers-rs-mobile@npm:0.0.5" - checksum: bc2ae7ae6202d0ab77e603e361b24781a86ea68bc1e33951d4769c2eff5d5916a39ce945dac12875a31ebb5a5c09320617caca908dd886884ec3c6893eaaf418 - languageName: node - linkType: hard - -"@uniswap/extension@workspace:apps/extension": - version: 0.0.0-use.local - resolution: "@uniswap/extension@workspace:apps/extension" - dependencies: - "@apollo/client": 3.10.4 - "@datadog/browser-logs": 5.20.0 - "@datadog/browser-rum": 5.23.3 - "@ethersproject/providers": 5.7.2 - "@metamask/rpc-errors": 6.2.1 - "@pmmmwh/react-refresh-webpack-plugin": 0.5.11 - "@reduxjs/toolkit": 1.9.3 - "@svgr/webpack": 8.0.1 - "@tamagui/core": 1.121.7 - "@testing-library/dom": 10.4.0 - "@testing-library/react": 16.1.0 - "@types/chrome": 0.0.254 - "@types/jest": 29.5.14 - "@types/react": 18.3.18 - "@types/react-dom": 18.3.1 - "@types/redux-logger": 3.0.9 - "@types/redux-persist-webextension-storage": 1.0.3 - "@types/ua-parser-js": 0.7.31 - "@types/uuid": 9.0.1 - "@uniswap/analytics-events": 2.41.0 - "@uniswap/eslint-config": "workspace:^" - "@uniswap/uniswapx-sdk": 3.0.0-beta.3 - "@uniswap/universal-router-sdk": 4.17.0 - "@uniswap/v3-sdk": 3.24.0 - "@uniswap/v4-sdk": 1.19.2 - "@welldone-software/why-did-you-render": 8.0.1 - clean-webpack-plugin: 4.0.0 - concurrently: 8.2.2 - copy-webpack-plugin: 11.0.0 - css-loader: 6.11.0 - dotenv-webpack: 8.0.1 - esbuild-loader: 3.2.0 - eslint: 8.44.0 - ethers: 5.7.2 - eventemitter3: 5.0.1 - i18next: 23.10.0 - jest: 29.7.0 - jest-chrome: 0.8.0 - jest-environment-jsdom: 29.5.0 - jest-extended: 4.0.2 - mini-css-extract-plugin: 2.9.1 - node-polyfill-webpack-plugin: 2.0.1 - react: 18.3.1 - react-dom: 18.3.1 - react-i18next: 14.1.0 - react-native: 0.76.6 - react-native-gesture-handler: 2.21.2 - react-native-reanimated: 3.16.7 - react-native-svg: 15.10.1 - react-native-web: 0.19.13 - react-qr-code: 2.0.12 - react-redux: 8.0.5 - react-refresh: 0.14.0 - react-router-dom: 6.10.0 - redux: 4.2.1 - redux-logger: 3.0.6 - redux-persist: 6.0.0 - redux-persist-webextension-storage: 1.0.2 - redux-saga: 1.2.2 - serve: 14.2.4 - statsig-js: 4.41.0 - style-loader: 3.3.2 - swc-loader: 0.2.6 - symbol-observable: 4.0.0 - tamagui-loader: 1.121.7 - typed-redux-saga: 1.5.0 - typescript: 5.3.3 - ua-parser-js: 1.0.37 - ui: "workspace:^" - uniswap: "workspace:^" - utilities: "workspace:^" - uuid: 9.0.0 - wallet: "workspace:^" - webpack: 5.90.0 - webpack-cli: 5.1.4 - webpack-dev-server: 4.15.1 - zod: 3.22.4 - languageName: unknown - linkType: soft - -"@uniswap/interface@workspace:apps/web": - version: 0.0.0-use.local - resolution: "@uniswap/interface@workspace:apps/web" - dependencies: - "@amplitude/analytics-browser": 1.12.1 - "@apollo/client": 3.10.4 - "@babel/preset-env": 7.26.0 - "@chromatic-com/storybook": 3.2.2 - "@cloudflare/workers-types": 4.20231025.0 - "@craco/craco": 7.1.0 - "@crowdin/cli": 3.14.0 - "@ethersproject/experimental": 5.7.0 - "@graphql-codegen/cli": 3.3.1 - "@graphql-codegen/client-preset": 3.0.1 - "@graphql-codegen/typescript": 3.0.4 - "@graphql-codegen/typescript-operations": 3.0.4 - "@graphql-codegen/typescript-react-apollo": 3.3.7 - "@graphql-codegen/typescript-resolvers": 3.2.1 - "@juggle/resize-observer": 3.4.0 - "@looksrare/sdk": 0.10.4 - "@opensea/seaport-js": 1.3.0 - "@playwright/test": 1.49.1 - "@popperjs/core": 2.11.8 - "@reach/dialog": 0.10.5 - "@reach/portal": 0.10.5 - "@reduxjs/toolkit": 1.9.3 - "@rive-app/canvas": 2.19.0 - "@rive-app/react-canvas": 4.13.0 - "@sentry/browser": 7.80.0 - "@sentry/core": 7.80.0 - "@sentry/react": 7.80.0 - "@sentry/types": 7.80.0 - "@storybook/addon-essentials": 8.4.2 - "@storybook/addon-interactions": 8.4.2 - "@storybook/addon-onboarding": 8.4.2 - "@storybook/blocks": 8.4.2 - "@storybook/preset-create-react-app": 8.4.2 - "@storybook/react": 8.4.2 - "@storybook/react-webpack5": 8.4.2 - "@storybook/test": 8.4.2 - "@svgr/webpack": 8.0.1 - "@swc/core": 1.3.72 - "@swc/jest": 0.2.29 - "@swc/plugin-styled-components": 1.5.97 - "@tamagui/core": 1.121.7 - "@tamagui/portal": 1.121.7 - "@tamagui/react-native-svg": 1.121.7 - "@tanstack/react-query": 5.51.16 - "@tanstack/react-table": 8.10.7 - "@testing-library/jest-dom": 6.6.3 - "@testing-library/react": 16.1.0 - "@testing-library/react-hooks": 8.0.1 - "@testing-library/user-event": 14.5.1 - "@typechain/ethers-v5": 7.2.0 - "@types/array.prototype.flat": 1.2.5 - "@types/array.prototype.flatmap": 1.2.6 - "@types/chrome": 0.0.254 - "@types/d3": 7.4.3 - "@types/jest": 29.5.14 - "@types/ms": 0.7.31 - "@types/multicodec": 1.0.0 - "@types/node": 18.16.0 - "@types/poisson-disk-sampling": 2.2.4 - "@types/qs": 6.9.2 - "@types/react": 18.3.18 - "@types/react-dom": 18.3.1 - "@types/react-redux": 7.1.30 - "@types/react-scroll-sync": 0.9.0 - "@types/react-table": 7.7.12 - "@types/react-virtualized-auto-sizer": 1.0.0 - "@types/react-window": 1.8.2 - "@types/react-window-infinite-loader": 1.0.6 - "@types/rebass": 4.0.7 - "@types/styled-components": 5.1.25 - "@types/testing-library__cypress": 5.0.13 - "@types/uuid": 9.0.1 - "@types/wcag-contrast": 3.0.0 - "@types/xml2js": 0.4.14 - "@uniswap/analytics": 1.7.0 - "@uniswap/analytics-events": 2.41.0 - "@uniswap/client-explore": 0.0.15 - "@uniswap/client-pools": 0.0.13 - "@uniswap/default-token-list": 11.19.0 - "@uniswap/eslint-config": "workspace:^" - "@uniswap/liquidity-staker": 1.0.2 - "@uniswap/merkle-distributor": 1.0.1 - "@uniswap/permit2-sdk": 1.3.0 - "@uniswap/redux-multicall": 1.1.8 - "@uniswap/router-sdk": 1.22.1 - "@uniswap/sdk-core": 7.5.0 - "@uniswap/token-lists": 1.0.0-beta.33 - "@uniswap/uniswapx-sdk": 3.0.0-beta.3 - "@uniswap/universal-router-sdk": 4.17.0 - "@uniswap/v2-core": 1.0.1 - "@uniswap/v2-periphery": 1.1.0-beta.0 - "@uniswap/v2-sdk": 4.13.0 - "@uniswap/v3-core": 1.0.1 - "@uniswap/v3-periphery": 1.4.4 - "@uniswap/v3-sdk": 3.24.0 - "@uniswap/v4-sdk": 1.19.2 - "@vanilla-extract/css": 1.14.0 - "@vanilla-extract/dynamic": 2.1.0 - "@vanilla-extract/jest-transform": 1.1.1 - "@vanilla-extract/sprinkles": 1.6.1 - "@vanilla-extract/webpack-plugin": 2.3.1 - "@vercel/og": 0.5.8 - "@visx/group": 2.17.0 - "@visx/responsive": 2.17.0 - "@visx/shape": 2.18.0 - "@web3-react/core": 8.2.3 - "@web3-react/empty": 8.2.3 - "@web3-react/types": 8.2.3 - ajv: 8.11.0 - ajv-formats: 2.1.1 - array.prototype.flat: 1.3.2 - array.prototype.flatmap: 1.3.2 - babel-jest: 29.7.0 - browser-cache-mock: 0.1.7 - buffer: 6.0.3 - cids: 1.1.6 - clsx: 1.2.1 - concurrently: 8.2.2 - copy-to-clipboard: 3.3.3 - cypress: 12.17.4 - cypress-hardhat: 2.5.3 - d3: 7.6.1 - date-fns: 2.30.0 - depcheck: 1.4.7 - dotenv: 16.0.3 - dotenv-cli: 7.1.0 - esbuild-register: 3.6.0 - eslint: 8.44.0 - eslint-plugin-import: 2.27.5 - eslint-plugin-rulesdir: 0.2.2 - eslint-plugin-storybook: 0.8.0 - ethers: 5.7.2 - expo-crypto: 12.8.1 - fancy-canvas: 2.1.0 - focus-visible: 5.2.0 - framer-motion: 10.17.6 - graphql: 16.6.0 - hardhat: 2.22.16 - husky: 8.0.3 - i18next: 23.10.0 - immer: 9.0.6 - jest: 29.7.0 - jest-extended: 4.0.2 - jest-fail-on-console: 3.3.0 - jest-fetch-mock: 3.0.3 - jest-styled-components: 7.2.0 - jotai: 1.3.7 - jpeg-js: 0.4.4 - jsbi: 3.2.5 - lightweight-charts: 4.1.1 - lint-staged: 14.0.1 - localforage: 1.10.0 - madge: 6.1.0 - ms: 2.1.3 - multicodec: 3.2.1 - multihashes: 4.0.2 - nock: 13.3.3 - path-browserify: 1.0.1 - playwright: 1.49.1 - playwright-slack-report: 1.1.89 - png-ts: 0.0.3 - poisson-disk-sampling: 2.3.1 - polished: 3.3.2 - polyfill-object.fromentries: 1.0.1 - postinstall-postinstall: 2.1.0 - process: 0.11.10 - prop-types: 15.8.1 - qs: 6.11.0 - query-string: 7.1.3 - rc-slider: 10.4.0 - react: 18.3.1 - react-dom: 18.3.1 - react-feather: 2.0.10 - react-helmet-async: 2.0.4 - react-i18next: 14.1.0 - react-infinite-scroll-component: 6.1.0 - react-is: 18.3.1 - react-markdown: 4.3.1 - react-native-gesture-handler: 2.21.2 - react-popper: 2.3.0 - react-redux: 8.0.5 - react-router-dom: 6.10.0 - react-scripts: 5.0.1 - react-scroll-sync: 0.11.2 - react-table: 7.8.0 - react-use-gesture: 6.0.14 - react-virtualized-auto-sizer: 1.0.20 - react-window: 1.8.9 - react-window-infinite-loader: 1.0.9 - rebass: 4.0.7 - redux: 4.2.1 - redux-persist: 6.0.0 - redux-saga: 1.2.2 - resize-observer-polyfill: 1.5.1 - serve: 14.2.4 - source-map-explorer: 2.5.3 - start-server-and-test: 2.0.0 - statsig-react: 1.38.1 - storybook: 8.4.2 - styled-components: 5.3.11 - swc-loader: 0.2.6 - tamagui: 1.121.7 - terser: 5.24.0 - terser-webpack-plugin: 5.3.9 - tiny-invariant: 1.3.1 - ts-jest: 29.2.5 - ts-loader: 9.5.1 - tsafe: 1.6.4 - typed-redux-saga: 1.5.0 - typescript: 5.3.3 - ui: "workspace:^" - uniswap: "workspace:^" - use-resize-observer: 9.1.0 - utilities: "workspace:^" - uuid: 9.0.0 - video-extensions: 1.2.0 - viem: 2.x - wagmi: 2.9.3 - wcag-contrast: 3.0.0 - web-vitals: 2.1.4 - webpack: 5.90.0 - webpack-bundle-analyzer: 4.10.2 - webpack-retry-chunk-load-plugin: 3.1.1 - wrangler: 3.15.0 - xml2js: 0.6.2 - yarn-deduplicate: 6.0.0 - zone.js: 0.12.0 - zustand: 4.4.6 - languageName: unknown - linkType: soft - -"@uniswap/lib@npm:1.1.1": - version: 1.1.1 - resolution: "@uniswap/lib@npm:1.1.1" - checksum: 2ec6689f606a0cf7dc7acd8b7471997638b2c89202c52743dcb4dfc0df182f6e058ec1a5e4d94a872c81bb85cbcde9e4a46b6de45eea0d34582627d97e743c7b - languageName: node - linkType: hard - -"@uniswap/lib@npm:^4.0.1-alpha": - version: 4.0.1-alpha - resolution: "@uniswap/lib@npm:4.0.1-alpha" - checksum: d7bbacccef40966af16c7e215ab085f575686d316b2802c9e1cfd03f7ad351970e547535670a28b2279c3cfcc4fb02888614c46f94efe2987af2309f3ec86127 - languageName: node - linkType: hard - -"@uniswap/liquidity-staker@npm:1.0.2": - version: 1.0.2 - resolution: "@uniswap/liquidity-staker@npm:1.0.2" - dependencies: - openzeppelin-solidity-2.3.0: "npm:openzeppelin-solidity@2.3.0" - checksum: 42ca8460183e228c26b7c189eced98e9ab19d396edf135b6332146ef3b176c88f7293a6b54a6c660e6a1e57e441d6806f29942d89ab89950a21b1f538e414939 - languageName: node - linkType: hard - -"@uniswap/merkle-distributor@npm:1.0.1": - version: 1.0.1 - resolution: "@uniswap/merkle-distributor@npm:1.0.1" - checksum: 08c2834ca5af2892c746518dc7b8f098518193afe99449c8ae744bd27d04eb9405900be8a19b386b8c2e97f0d804ea2b4377c4817ec0147c0fd4645e39ce94d8 - languageName: node - linkType: hard - -"@uniswap/mobile@workspace:apps/mobile": - version: 0.0.0-use.local - resolution: "@uniswap/mobile@workspace:apps/mobile" - dependencies: - "@amplitude/analytics-react-native": 1.4.11 - "@apollo/client": 3.10.4 - "@babel/core": 7.26.0 - "@babel/plugin-proposal-export-namespace-from": 7.18.9 - "@babel/plugin-proposal-logical-assignment-operators": 7.16.7 - "@babel/plugin-proposal-numeric-separator": 7.16.7 - "@babel/runtime": 7.26.0 - "@datadog/datadog-ci": 2.39.0 - "@datadog/mobile-react-native": 2.4.1 - "@datadog/mobile-react-navigation": 2.4.1 - "@ethersproject/shims": 5.6.0 - "@faker-js/faker": 7.6.0 - "@formatjs/intl-datetimeformat": 4.5.1 - "@formatjs/intl-getcanonicallocales": 1.9.0 - "@formatjs/intl-listformat": 7.7.5 - "@formatjs/intl-locale": 2.4.44 - "@formatjs/intl-numberformat": 7.4.1 - "@formatjs/intl-pluralrules": 4.3.1 - "@formatjs/intl-relativetimeformat": 11.1.2 - "@gorhom/bottom-sheet": 4.6.4 - "@react-native-async-storage/async-storage": 1.23.1 - "@react-native-community/cli": 15.0.1 - "@react-native-community/cli-platform-android": 15.0.1 - "@react-native-community/cli-platform-ios": 15.0.1 - "@react-native-community/datetimepicker": 8.2.0 - "@react-native-community/netinfo": 11.4.1 - "@react-native-community/slider": 4.5.5 - "@react-native-firebase/app": 21.0.0 - "@react-native-firebase/app-check": 21.0.0 - "@react-native-firebase/auth": 21.0.0 - "@react-native-firebase/firestore": 21.0.0 - "@react-native-masked-view/masked-view": 0.3.2 - "@react-native/metro-config": 0.76.6 - "@react-navigation/core": 6.2.2 - "@react-navigation/native": 6.0.11 - "@react-navigation/native-stack": 6.7.0 - "@react-navigation/stack": 6.2.2 - "@reduxjs/toolkit": 1.9.3 - "@reown/walletkit": 1.1.1 - "@shopify/flash-list": 1.7.1 - "@shopify/react-native-performance": 4.1.2 - "@shopify/react-native-performance-navigation": 3.0.0 - "@shopify/react-native-skia": 1.6.0 - "@sparkfabrik/react-native-idfa-aaid": 1.2.0 - "@storybook/addon-ondevice-controls": 8.4.2 - "@storybook/react": 8.4.2 - "@storybook/react-native": 8.4.2 - "@tamagui/babel-plugin": 1.121.7 - "@tanstack/react-query": 5.51.16 - "@testing-library/react-native": 13.0.0 - "@types/jest": 29.5.14 - "@types/react": 18.3.18 - "@types/redux-mock-store": 1.0.6 - "@uniswap/analytics": 1.7.0 - "@uniswap/analytics-events": 2.41.0 - "@uniswap/client-explore": 0.0.15 - "@uniswap/eslint-config": "workspace:^" - "@uniswap/ethers-rs-mobile": 0.0.5 - "@uniswap/sdk-core": 7.5.0 - "@walletconnect/core": 2.17.1 - "@walletconnect/react-native-compat": 2.17.1 - "@walletconnect/types": 2.17.1 - "@walletconnect/utils": 2.17.1 - "@welldone-software/why-did-you-render": 8.0.1 - apollo3-cache-persist: 0.14.1 - babel-loader: 8.2.3 - babel-plugin-module-resolver: 5.0.0 - babel-plugin-react-native-web: 0.17.5 - babel-plugin-transform-inline-environment-variables: 0.4.4 - babel-plugin-transform-remove-console: 6.9.4 - babel-preset-expo: 12.0.6 - core-js: 2.6.12 - cross-fetch: 3.1.5 - d3-shape: 3.2.0 - dayjs: 1.11.7 - eslint: 8.44.0 - ethers: 5.7.2 - expo: 52.0.9 - expo-blur: 14.0.3 - expo-camera: 16.0.8 - expo-clipboard: 7.0.0 - expo-haptics: 14.0.0 - expo-linear-gradient: 14.0.1 - expo-linking: 7.0.3 - expo-local-authentication: 15.0.1 - expo-localization: 16.0.0 - expo-modules-core: 2.1.4 - expo-screen-capture: 7.0.0 - expo-store-review: 8.0.0 - fuse.js: 6.5.3 - i18next: 23.10.0 - jest: 29.7.0 - jest-expo: 52.0.3 - jest-extended: 4.0.2 - jest-transformer-svg: 2.0.0 - lodash: 4.17.21 - madge: 6.1.0 - mockdate: 3.0.5 - openai: 4.40.0 - postinstall-postinstall: 2.1.0 - react: 18.3.1 - react-devtools: 4.28.0 - react-dom: 18.3.1 - react-freeze: 1.0.3 - react-i18next: 14.1.0 - react-native: 0.76.6 - react-native-appsflyer: 6.13.1 - react-native-asset: 2.1.1 - react-native-bootsplash: 6.3.1 - react-native-clean-project: 4.0.1 - react-native-context-menu-view: 1.15.0 - react-native-device-info: 10.0.2 - react-native-dotenv: 3.2.0 - react-native-fast-image: 8.6.3 - react-native-gesture-handler: 2.21.2 - react-native-get-random-values: 1.11.0 - react-native-image-colors: 1.5.2 - react-native-image-picker: 7.1.0 - react-native-localize: 2.2.6 - react-native-markdown-display: 7.0.0-alpha.2 - react-native-mmkv: 2.10.1 - react-native-monorepo-tools: 1.2.1 - react-native-onesignal: 4.5.2 - react-native-pager-view: 6.5.1 - react-native-permissions: 4.1.5 - react-native-reanimated: 3.16.7 - react-native-restart: 0.0.27 - react-native-safe-area-context: 4.12.0 - react-native-screens: 4.1.0 - react-native-svg: 15.10.1 - react-native-svg-transformer: 1.3.0 - react-native-tab-view: 3.5.2 - react-native-url-polyfill: 1.3.0 - react-native-wagmi-charts: 2.5.2 - react-native-webview: 13.12.2 - react-native-widgetkit: 1.0.9 - react-redux: 8.0.5 - react-test-renderer: 18.3.1 - reactotron-react-native: 5.1.10 - reactotron-react-native-mmkv: 0.2.7 - reactotron-redux: 3.1.10 - redux: 4.2.1 - redux-mock-store: 1.5.4 - redux-persist: 6.0.0 - redux-saga: 1.2.2 - redux-saga-test-plan: 4.0.4 - typed-redux-saga: 1.5.0 - typescript: 5.3.3 - uniswap: "workspace:^" - utilities: "workspace:^" - wallet: "workspace:^" - yarn-deduplicate: 6.0.0 - languageName: unknown - linkType: soft - -"@uniswap/permit2-sdk@npm:1.3.0, @uniswap/permit2-sdk@npm:^1.2.0, @uniswap/permit2-sdk@npm:^1.2.1, @uniswap/permit2-sdk@npm:^1.3.0": - version: 1.3.0 - resolution: "@uniswap/permit2-sdk@npm:1.3.0" - dependencies: - ethers: ^5.7.0 - tiny-invariant: ^1.1.0 - checksum: 828a63c52673a5b4eefa769c0ecc2da667fe5573a3c447d0fea3809b46e7a71376a48917d959f253abba01e9faa442a503dd65649687a6bf7b385ee9f6d41afd - languageName: node - linkType: hard - -"@uniswap/redux-multicall@npm:1.1.8": - version: 1.1.8 - resolution: "@uniswap/redux-multicall@npm:1.1.8" - peerDependencies: - "@ethersproject/abi": 5 - "@ethersproject/bignumber": 5 - "@ethersproject/contracts": 5 - "@reduxjs/toolkit": 1 - react: ">=17" - react-redux: ">=7" - checksum: 11b783c2ab5c4bd8ba48dfa3a0cc0fc8af1f36af50b6343ea158564eb793031fbb7d77f84b2a52b78a1849aedc07a9e785882a412395863518489722752bc026 - languageName: node - linkType: hard - -"@uniswap/router-sdk@npm:1.22.1": - version: 1.22.1 - resolution: "@uniswap/router-sdk@npm:1.22.1" - dependencies: - "@ethersproject/abi": ^5.5.0 - "@uniswap/sdk-core": ^7.5.0 - "@uniswap/swap-router-contracts": ^1.3.0 - "@uniswap/v2-sdk": ^4.13.0 - "@uniswap/v3-sdk": ^3.24.0 - "@uniswap/v4-sdk": ^1.18.1 - checksum: fff26fe8607568ecfd8029fbc6ec462ccee6dddde916827a2116b4961947dee37fbae40a25d1325abe8ffbbb5280511fa9926fd034d334db681b9462ee206406 - languageName: node - linkType: hard - -"@uniswap/sdk-core@npm:7.5.0": - version: 7.5.0 - resolution: "@uniswap/sdk-core@npm:7.5.0" - dependencies: - "@ethersproject/address": ^5.0.2 - "@ethersproject/bytes": ^5.7.0 - "@ethersproject/keccak256": 5.7.0 - "@ethersproject/strings": 5.7.0 - big.js: ^5.2.2 - decimal.js-light: ^2.5.0 - jsbi: ^3.1.4 - tiny-invariant: ^1.1.0 - toformat: ^2.0.0 - checksum: 0d235ef1f2463e4642ae4b73216dcdc73490bfdd10d3007e3660e61346c5f6f23a28c15cb04ef479a7b3d6b6a665a0c000da081cdd1724737c5fa40b02211d64 - languageName: node - linkType: hard - -"@uniswap/swap-router-contracts@npm:^1.3.0": - version: 1.3.1 - resolution: "@uniswap/swap-router-contracts@npm:1.3.1" - dependencies: - "@openzeppelin/contracts": 3.4.2-solc-0.7 - "@uniswap/v2-core": ^1.0.1 - "@uniswap/v3-core": ^1.0.0 - "@uniswap/v3-periphery": ^1.4.4 - dotenv: ^14.2.0 - hardhat-watcher: ^2.1.1 - checksum: cf2e94464077d02af0041ef0971a0b54194970b57bd04bcf114f898724604750fe09fcd12ccc50309e3bb22ea9a513405f226b9ea236e5b53edb252e5cedef8b - languageName: node - linkType: hard - -"@uniswap/token-lists@npm:1.0.0-beta.33": - version: 1.0.0-beta.33 - resolution: "@uniswap/token-lists@npm:1.0.0-beta.33" - checksum: ec6842cb39c42cf3f173ce47d833968de811ffba0a1b3323c0e094d11f37187201fa0754bc6648499664819eaf9cf2420604a8915b98c7309d2e70d496c92cca - languageName: node - linkType: hard - -"@uniswap/uniswapx-sdk@npm:3.0.0-beta.3": - version: 3.0.0-beta.3 - resolution: "@uniswap/uniswapx-sdk@npm:3.0.0-beta.3" - dependencies: - "@ethersproject/bytes": ^5.7.0 - "@ethersproject/providers": ^5.7.0 - "@uniswap/permit2-sdk": ^1.2.1 - "@uniswap/sdk-core": ^7.5.0 - ethers: ^5.7.0 - checksum: 766bd6bb5c7eb11c57af601fe49d21bac20086d038876be6c344a43417cf284e22ed4defb7a2c7eb2753042ee3fa1e76e00f670eb47e7c8965a3d11ca68b4907 - languageName: node - linkType: hard - -"@uniswap/universal-router-sdk@npm:4.17.0": - version: 4.17.0 - resolution: "@uniswap/universal-router-sdk@npm:4.17.0" - dependencies: - "@openzeppelin/contracts": 4.7.0 - "@uniswap/permit2-sdk": ^1.3.0 - "@uniswap/router-sdk": ^1.22.1 - "@uniswap/sdk-core": ^7.5.0 - "@uniswap/universal-router": 2.0.0-beta.2 - "@uniswap/v2-core": ^1.0.1 - "@uniswap/v2-sdk": ^4.13.0 - "@uniswap/v3-core": 1.0.0 - "@uniswap/v3-sdk": ^3.24.0 - "@uniswap/v4-sdk": ^1.19.2 - bignumber.js: ^9.0.2 - ethers: ^5.7.0 - checksum: 8cdb7debc8e2bd2c34a63598ae6d8d5cb954f944894df772a5fd1aac7739458aa7933c49d06907c2d7dba4b623a3b6a695fada41b13d904948a929d8fbc5d23c - languageName: node - linkType: hard - -"@uniswap/universal-router-sdk@npm:^1.5.4": - version: 1.9.0 - resolution: "@uniswap/universal-router-sdk@npm:1.9.0" - dependencies: - "@uniswap/permit2-sdk": ^1.2.0 - "@uniswap/router-sdk": ^1.9.0 - "@uniswap/sdk-core": ^4.2.0 - "@uniswap/universal-router": 1.6.0 - "@uniswap/v2-sdk": ^4.3.0 - "@uniswap/v3-sdk": ^3.11.0 - bignumber.js: ^9.0.2 - ethers: ^5.3.1 - checksum: fc4bbe178cbdfc1228d93f9fe74de30b7d77feabc368576bbd972a6435a62f79da0ea26cf7d2754a8364c258e1b3521fcca68eee7609875d4b8daf08b06a6e3b - languageName: node - linkType: hard - -"@uniswap/universal-router@npm:1.6.0": - version: 1.6.0 - resolution: "@uniswap/universal-router@npm:1.6.0" - dependencies: - "@openzeppelin/contracts": 4.7.0 - "@uniswap/v2-core": 1.0.1 - "@uniswap/v3-core": 1.0.0 - checksum: c91e4a248f983378f806b2d7b1e2c9cdac5996d7ab46c323c35147f6f8e32a67ca330916ac0692275525236b557b5d39230fadf88ab2af7ba7c814cd81ed903b - languageName: node - linkType: hard - -"@uniswap/universal-router@npm:2.0.0-beta.2": - version: 2.0.0-beta.2 - resolution: "@uniswap/universal-router@npm:2.0.0-beta.2" - dependencies: - "@openzeppelin/contracts": 5.0.2 - "@uniswap/v2-core": 1.0.1 - "@uniswap/v3-core": 1.0.0 - checksum: 161494b4b73ebff72efcaeab89684cfe8b1d51a408e33ae6104d3369ef23d05ef6176b91f3de23ce53f0c886fed91bd810956cbe4f0fd5e808050a392fee2309 - languageName: node - linkType: hard - -"@uniswap/v2-core@npm:1.0.0": - version: 1.0.0 - resolution: "@uniswap/v2-core@npm:1.0.0" - checksum: 41e42ad801dbc058ebf0ab38a8ce3195990e21eff4b2d49cd0a8c8fd25ac067feed55c379f2be22d915a7601d94966ae66127b748b2d3acde20eeb2351e51703 - languageName: node - linkType: hard - -"@uniswap/v2-core@npm:1.0.1, @uniswap/v2-core@npm:^1.0.1": - version: 1.0.1 - resolution: "@uniswap/v2-core@npm:1.0.1" - checksum: eaa118fe45eac2e80b7468547ce2cde12bd3c8157555d2e40e0462a788c9506c6295247b511382da85e44a89ad92aff7bb3433b23bfbd2eeea23942ecd46e979 - languageName: node - linkType: hard - -"@uniswap/v2-periphery@npm:1.1.0-beta.0": - version: 1.1.0-beta.0 - resolution: "@uniswap/v2-periphery@npm:1.1.0-beta.0" - dependencies: - "@uniswap/lib": 1.1.1 - "@uniswap/v2-core": 1.0.0 - checksum: af13224c9f28f817be6e5794a7590b8433788e5387912343a8d61227a42b494b431fe6e549505e87d96a6896e96e289f80d92c68788eea4917596ec7fd94734e - languageName: node - linkType: hard - -"@uniswap/v2-sdk@npm:4.13.0": - version: 4.13.0 - resolution: "@uniswap/v2-sdk@npm:4.13.0" - dependencies: - "@ethersproject/address": ^5.0.2 - "@ethersproject/solidity": ^5.0.9 - "@uniswap/sdk-core": ^7.5.0 - tiny-invariant: ^1.1.0 - tiny-warning: ^1.0.3 - checksum: 17f8a26d86a2a1887991281865bbfe0c988f2a70dee685ec165f141bfb58089654990a41a5a41f1a85c24523b062cbfee958abc1f007b073a8631fc7c6548aa7 - languageName: node - linkType: hard - -"@uniswap/v3-core@npm:1.0.0": - version: 1.0.0 - resolution: "@uniswap/v3-core@npm:1.0.0" - checksum: 0e7654cfbf9885f1ca94446c3b220aeddb039af7892bc4ae94669512570ceefdf1ce6c2b0703396927d5a203d7c6c5ccaf8bd61426e52372aafb6ada64141055 - languageName: node - linkType: hard - -"@uniswap/v3-core@npm:1.0.1, @uniswap/v3-core@npm:^1.0.0": - version: 1.0.1 - resolution: "@uniswap/v3-core@npm:1.0.1" - checksum: 4bfd8b218391a3d9efde44e0f984cfec3bc25889cd4d1386766828521006e71b210a3583ee32b52f3c81d384af9e8c39f471f2229e9af4d50da6801446ecb3e4 - languageName: node - linkType: hard - -"@uniswap/v3-periphery@npm:1.4.4, @uniswap/v3-periphery@npm:^1.0.1, @uniswap/v3-periphery@npm:^1.1.1, @uniswap/v3-periphery@npm:^1.4.4": - version: 1.4.4 - resolution: "@uniswap/v3-periphery@npm:1.4.4" - dependencies: - "@openzeppelin/contracts": 3.4.2-solc-0.7 - "@uniswap/lib": ^4.0.1-alpha - "@uniswap/v2-core": ^1.0.1 - "@uniswap/v3-core": ^1.0.0 - base64-sol: 1.0.1 - checksum: 48b57f1f648cb002935421ac1770666ab3c0263885a03c769985b06501b88d513a435c8edc439b41ac5aef7ad40a11038a3561f7e828cce5ae6ec2c77742f1af - languageName: node - linkType: hard - -"@uniswap/v3-sdk@npm:3.24.0, @uniswap/v3-sdk@npm:^3.11.0, @uniswap/v3-sdk@npm:^3.24.0": - version: 3.24.0 - resolution: "@uniswap/v3-sdk@npm:3.24.0" - dependencies: - "@ethersproject/abi": ^5.5.0 - "@ethersproject/solidity": ^5.0.9 - "@uniswap/sdk-core": ^7.5.0 - "@uniswap/swap-router-contracts": ^1.3.0 - "@uniswap/v3-periphery": ^1.1.1 - "@uniswap/v3-staker": 1.0.0 - tiny-invariant: ^1.1.0 - tiny-warning: ^1.0.3 - checksum: 001e332e83e784ec2c192629ec40c0f875bfa1e2e76bd6cbb2aa6755b4b9d2912d0870dd84447451acf4bee875aae9846dacd238258607d244e11766ce6c1ab4 - languageName: node - linkType: hard - -"@uniswap/v3-staker@npm:1.0.0": - version: 1.0.0 - resolution: "@uniswap/v3-staker@npm:1.0.0" - dependencies: - "@openzeppelin/contracts": 3.4.1-solc-0.7-2 - "@uniswap/v3-core": 1.0.0 - "@uniswap/v3-periphery": ^1.0.1 - checksum: 5a68e59f33d4761956ad735c8ce5ea6e566076bd260ea0a0bb4b3a0db237719e39f21a22eb0a5a231141efdf0154bfe03f690612d632898f33192b4442c888b3 - languageName: node - linkType: hard - -"@uniswap/v4-sdk@npm:1.19.2, @uniswap/v4-sdk@npm:^1.18.1, @uniswap/v4-sdk@npm:^1.19.2": - version: 1.19.2 - resolution: "@uniswap/v4-sdk@npm:1.19.2" - dependencies: - "@ethersproject/solidity": ^5.0.9 - "@uniswap/sdk-core": ^7.5.0 - "@uniswap/v3-sdk": 3.24.0 - tiny-invariant: ^1.1.0 - tiny-warning: ^1.0.3 - checksum: aa789689bfa98c021f2355f234f8b9108cb27c1d6abbff59169326ecadd78a381fd50ba4cd267a3552a139f42b9c2c3f58cbbb1baf1af012124c010eb1c1bb6c - languageName: node - linkType: hard - -"@urql/core@npm:^5.0.0, @urql/core@npm:^5.0.6": - version: 5.1.0 - resolution: "@urql/core@npm:5.1.0" - dependencies: - "@0no-co/graphql.web": ^1.0.5 - wonka: ^6.3.2 - checksum: 63b8c1f25a5e3a50d84aeae63141e06ee8913c3a53d936fcb8453108034e50938fc774da298f50358ec2f3825bd62b2a3e4754ab1c9107dd9a79cb0c9c0d2a12 - languageName: node - linkType: hard - -"@urql/exchange-retry@npm:^1.3.0": - version: 1.3.0 - resolution: "@urql/exchange-retry@npm:1.3.0" - dependencies: - "@urql/core": ^5.0.0 - wonka: ^6.3.2 - peerDependencies: - "@urql/core": ^5.0.0 - checksum: a4da1866406b2244bd28ecd01881aded10d1da7728792d6d9e9c9e718080afd41a3a8694e87c59002ab2ffc823a52662e933a3ef9e7102fd3b2c4f008615ab14 - languageName: node - linkType: hard - -"@vanilla-extract/babel-plugin-debug-ids@npm:^1.0.2": - version: 1.0.3 - resolution: "@vanilla-extract/babel-plugin-debug-ids@npm:1.0.3" - dependencies: - "@babel/core": ^7.20.7 - checksum: aff82b7f5c0e1df0e3018335287d194832930b1e7a586716dbcf5dd2b0d6d74d48cb5cd64ab84232d2b597ff04c8bb2a734f3965c931e07fd3385d4954592fb0 - languageName: node - linkType: hard - -"@vanilla-extract/css@npm:1.14.0, @vanilla-extract/css@npm:^1.14.0": - version: 1.14.0 - resolution: "@vanilla-extract/css@npm:1.14.0" - dependencies: - "@emotion/hash": ^0.9.0 - "@vanilla-extract/private": ^1.0.3 - chalk: ^4.1.1 - css-what: ^6.1.0 - cssesc: ^3.0.0 - csstype: ^3.0.7 - deep-object-diff: ^1.1.9 - deepmerge: ^4.2.2 - media-query-parser: ^2.0.2 - modern-ahocorasick: ^1.0.0 - outdent: ^0.8.0 - checksum: ca12de26f72b908c7ac2ee9319faff885fb451ab3da7cef86aae8660c7e042c447041be40ac8c6155d87e8a709efb0697214db3a6cce211e8ef3c110d4dcf8a1 - languageName: node - linkType: hard - -"@vanilla-extract/dynamic@npm:2.1.0": - version: 2.1.0 - resolution: "@vanilla-extract/dynamic@npm:2.1.0" - dependencies: - "@vanilla-extract/private": ^1.0.3 - checksum: a6f129d096286cf7e2c7c868f12866d2da2967cd7591e071eb6420f0fafccce86c58e1d408864109fc894332399e731fe8ae67e2c92d456feb4b21c602287f6d - languageName: node - linkType: hard - -"@vanilla-extract/integration@npm:^6.0.0, @vanilla-extract/integration@npm:^6.2.0": - version: 6.2.3 - resolution: "@vanilla-extract/integration@npm:6.2.3" - dependencies: - "@babel/core": ^7.20.7 - "@babel/plugin-syntax-typescript": ^7.20.0 - "@vanilla-extract/babel-plugin-debug-ids": ^1.0.2 - "@vanilla-extract/css": ^1.14.0 - esbuild: 0.17.6 - eval: 0.1.8 - find-up: ^5.0.0 - javascript-stringify: ^2.0.1 - lodash: ^4.17.21 - mlly: ^1.1.0 - outdent: ^0.8.0 - vite: ^4.1.4 - vite-node: ^0.28.5 - checksum: 2f5dec52423052d991cb2ec2295514306a3121c7ff153614216351711281a3f9ea82ab03a23bde2256caf9220c6b764ffe7ec986eaf1d432cc6212217a17b3a0 - languageName: node - linkType: hard - -"@vanilla-extract/jest-transform@npm:1.1.1": - version: 1.1.1 - resolution: "@vanilla-extract/jest-transform@npm:1.1.1" - dependencies: - "@vanilla-extract/integration": ^6.2.0 - esbuild: 0.17.6 - checksum: 98f88ddc2e9a618328adc3ed0c59e3426cee29ee1f3f3310fc21f7f46f6ccc1183d0adb6aa51eafdc2aaf8e6948b732bed676af0be7c566fd3374ad1c2861b6d - languageName: node - linkType: hard - -"@vanilla-extract/private@npm:^1.0.3": - version: 1.0.3 - resolution: "@vanilla-extract/private@npm:1.0.3" - checksum: 866a71ba6804edeb0735684e7723ba78f5cf0bb40d4fb538fe6bf7d73928099e341312337b2a510ac0ce96ff8a4b39eb7f7a5fad0c842532353dd20e7278f29b - languageName: node - linkType: hard - -"@vanilla-extract/sprinkles@npm:1.6.1": - version: 1.6.1 - resolution: "@vanilla-extract/sprinkles@npm:1.6.1" - peerDependencies: - "@vanilla-extract/css": ^1.0.0 - checksum: 13c53a94b19f9226c2684b0da06b98022d2faaf504cb5a4a8e5a0abae499aaa7855c17aa6d88534800d9427696b3248f4fc1a5332bde336c445d837017569f3b - languageName: node - linkType: hard - -"@vanilla-extract/webpack-plugin@npm:2.3.1": - version: 2.3.1 - resolution: "@vanilla-extract/webpack-plugin@npm:2.3.1" - dependencies: - "@vanilla-extract/integration": ^6.0.0 - chalk: ^4.1.1 - debug: ^4.3.1 - loader-utils: ^2.0.0 - peerDependencies: - webpack: ^4.30.0 || ^5.20.2 - checksum: f0d836aa4c6755c1c202b22f0844fd4f52bc36a57524db75341240c6330eff6bc8cdc60edd6bac2a0a074eacaaf311ca2b8466c87355c4549726500e08a2938d - languageName: node - linkType: hard - -"@vercel/og@npm:0.5.8": - version: 0.5.8 - resolution: "@vercel/og@npm:0.5.8" - dependencies: - "@resvg/resvg-wasm": 2.4.1 - satori: 0.10.1 - yoga-wasm-web: 0.3.3 - checksum: 23d7cf8506fa2edec59d44ecbaef692e3b9efffa56243aa7f42295279e0ca688b5863ee97892b20a0ad1969ac82b48a64dd037c522aed5de7e23b2ffa5175c44 - languageName: node - linkType: hard - -"@vercel/og@patch:@vercel/og@npm%3A0.5.8#./.yarn/patches/@vercel-og-npm-0.5.8-83a79f2744.patch::locator=universe%40workspace%3A.": - version: 0.5.8 - resolution: "@vercel/og@patch:@vercel/og@npm%3A0.5.8#./.yarn/patches/@vercel-og-npm-0.5.8-83a79f2744.patch::version=0.5.8&hash=161abb&locator=universe%40workspace%3A." - dependencies: - "@resvg/resvg-wasm": 2.4.1 - satori: 0.10.1 - yoga-wasm-web: 0.3.3 - checksum: f36074e4a6f90750bc473df84f752d22642a06a85275cf2c91fabe6357099c66a97accd531bb6bd7f363189f5fb3bb9d6f1562dda28443a45f5cba86e92ed6ee - languageName: node - linkType: hard - -"@visx/curve@npm:2.17.0": - version: 2.17.0 - resolution: "@visx/curve@npm:2.17.0" - dependencies: - "@types/d3-shape": ^1.3.1 - d3-shape: ^1.0.6 - checksum: a3a717504506256e862f72dfe5260bdda43ed9567ab0b19aebb2386bd0c527a17a65112649c31e41dc5df63ac276543c1dd44c952319e80f1f1de5f0657094f4 - languageName: node - linkType: hard - -"@visx/group@npm:2.17.0": - version: 2.17.0 - resolution: "@visx/group@npm:2.17.0" - dependencies: - "@types/react": "*" - classnames: ^2.3.1 - prop-types: ^15.6.2 - peerDependencies: - react: ^16.0.0-0 || ^17.0.0-0 || ^18.0.0-0 - checksum: a93e5e586e78901a0403487f47918ed575aff37a73a9552d14586e51e6b42a0474cec8e05700b298d279a64448e42db568c6540658ba459a9e3bb5b5b94397a7 - languageName: node - linkType: hard - -"@visx/responsive@npm:2.17.0": - version: 2.17.0 - resolution: "@visx/responsive@npm:2.17.0" - dependencies: - "@juggle/resize-observer": ^3.3.1 - "@types/lodash": ^4.14.172 - "@types/react": "*" - lodash: ^4.17.21 - prop-types: ^15.6.1 - peerDependencies: - react: ^16.0.0-0 || ^17.0.0-0 || ^18.0.0-0 - checksum: effa85bc6a90420e53a170459e8434024c5fa1c399ad4b5d2f325c14dfac8923be30b4cdaf30e8acc4de1e9c63f8b25cbae780b3f14aca7bb1ed92e8324e493b - languageName: node - linkType: hard - -"@visx/scale@npm:2.18.0": - version: 2.18.0 - resolution: "@visx/scale@npm:2.18.0" - dependencies: - "@types/d3-interpolate": ^1.3.1 - "@types/d3-scale": ^3.3.0 - "@types/d3-time": ^2.0.0 - d3-interpolate: ^1.4.0 - d3-scale: ^3.3.0 - d3-time: ^2.1.1 - checksum: b83087532af6ff09e3ca58437e74efae03bafae94dab802c5f1d25b79081ca2970118fca4ae2e19bbda33e4ee8140d72efb97eeae2a0c05868621f66a3e295a9 - languageName: node - linkType: hard - -"@visx/shape@npm:2.18.0": - version: 2.18.0 - resolution: "@visx/shape@npm:2.18.0" - dependencies: - "@types/d3-path": ^1.0.8 - "@types/d3-shape": ^1.3.1 - "@types/lodash": ^4.14.172 - "@types/react": "*" - "@visx/curve": 2.17.0 - "@visx/group": 2.17.0 - "@visx/scale": 2.18.0 - classnames: ^2.3.1 - d3-path: ^1.0.5 - d3-shape: ^1.2.0 - lodash: ^4.17.21 - prop-types: ^15.5.10 - peerDependencies: - react: ^16.3.0-0 || ^17.0.0-0 || ^18.0.0-0 - checksum: dcddd424eeafea417f668406b37053624bbbb287afbf6ca43011a63d6663b2c50357abd43b1a4f667c45298a0e55d71f17198f095a98a611bf6d48e22d1f393b - languageName: node - linkType: hard - -"@vitest/expect@npm:2.0.5": - version: 2.0.5 - resolution: "@vitest/expect@npm:2.0.5" - dependencies: - "@vitest/spy": 2.0.5 - "@vitest/utils": 2.0.5 - chai: ^5.1.1 - tinyrainbow: ^1.2.0 - checksum: 0c65eb24c2fd9ef5735d1e65dc8fee59936e6cab1d6ab24a95e014b8337be5598242fceae4e8ec2974e2ae70a30c1906ad41208bf6de6cdf2043594cdb65e627 - languageName: node - linkType: hard - -"@vitest/pretty-format@npm:2.0.5": - version: 2.0.5 - resolution: "@vitest/pretty-format@npm:2.0.5" - dependencies: - tinyrainbow: ^1.2.0 - checksum: d60346001180e5bb3c53be4b4d0b6d9352648b066641d5aba7b97d7c97a8e252dc934204d58818330262a65f07127455fc5f3b5f7e3647c60f6ff302a725733b - languageName: node - linkType: hard - -"@vitest/pretty-format@npm:2.1.8": - version: 2.1.8 - resolution: "@vitest/pretty-format@npm:2.1.8" - dependencies: - tinyrainbow: ^1.2.0 - checksum: 2214ca317a19220a5f308a4e77fe403fa091c2f006d1f5b1bd91e8fad6e167db2fdc7882e564da3518d5b2cd9dedb1e97067bb666a820519c54f1c26ac9b0c5a - languageName: node - linkType: hard - -"@vitest/spy@npm:2.0.5": - version: 2.0.5 - resolution: "@vitest/spy@npm:2.0.5" - dependencies: - tinyspy: ^3.0.0 - checksum: a010dec99146832a2586c639fccf533b194482f6f25ffb2d64367598a4e77d094aedd3d82cdb55fc1a3971649577a039513ccf8dc1571492e5982482c530c7b9 - languageName: node - linkType: hard - -"@vitest/utils@npm:2.0.5": - version: 2.0.5 - resolution: "@vitest/utils@npm:2.0.5" - dependencies: - "@vitest/pretty-format": 2.0.5 - estree-walker: ^3.0.3 - loupe: ^3.1.1 - tinyrainbow: ^1.2.0 - checksum: 6867556dd7e376437e454b96c7e596ec16e141fb00b002b6ce435611ab3d9d1e3f38ebf48b1fc49f4c97f9754ed37abb602de8bf122f4ac0de621a4dbe0a314e - languageName: node - linkType: hard - -"@vitest/utils@npm:^2.1.1": - version: 2.1.8 - resolution: "@vitest/utils@npm:2.1.8" - dependencies: - "@vitest/pretty-format": 2.1.8 - loupe: ^3.1.2 - tinyrainbow: ^1.2.0 - checksum: 711e7998ba9785880ed416d08b478e2b881cd218d37c3d773b26477adaa6aab91758e01ac039f839175f446111118fb5aa041317b619eeeb05537e3912159eb7 - languageName: node - linkType: hard - -"@vue/compiler-core@npm:3.3.13": - version: 3.3.13 - resolution: "@vue/compiler-core@npm:3.3.13" - dependencies: - "@babel/parser": ^7.23.5 - "@vue/shared": 3.3.13 - estree-walker: ^2.0.2 - source-map-js: ^1.0.2 - checksum: e758146d7805199b60166a3bc8f6f8a4fa8bedf814f5c33a77776fc46585e14f36c11c2f96fa54c8b895e3115716db613c557e705ccadd306c424a7d39585bf8 - languageName: node - linkType: hard - -"@vue/compiler-dom@npm:3.3.13": - version: 3.3.13 - resolution: "@vue/compiler-dom@npm:3.3.13" - dependencies: - "@vue/compiler-core": 3.3.13 - "@vue/shared": 3.3.13 - checksum: 8165ae90d827ba7b0d89382bc404fc52edf40c2fa8f4a54fb4bdd4ed730f33283ccf359795823f6a3c2f31d538a10b828f38dd32d512ebdcc329ebd78ad7a325 - languageName: node - linkType: hard - -"@vue/compiler-sfc@npm:^3.3.4": - version: 3.3.13 - resolution: "@vue/compiler-sfc@npm:3.3.13" - dependencies: - "@babel/parser": ^7.23.5 - "@vue/compiler-core": 3.3.13 - "@vue/compiler-dom": 3.3.13 - "@vue/compiler-ssr": 3.3.13 - "@vue/reactivity-transform": 3.3.13 - "@vue/shared": 3.3.13 - estree-walker: ^2.0.2 - magic-string: ^0.30.5 - postcss: ^8.4.32 - source-map-js: ^1.0.2 - checksum: f78a9a01472a8effed49f524729c762588e38bcaed50a677e099fe1ddc66e3a9fb56a2f1f85020010a44e385e9ef01872d41b540eded28a52c054b887b77b488 - languageName: node - linkType: hard - -"@vue/compiler-ssr@npm:3.3.13": - version: 3.3.13 - resolution: "@vue/compiler-ssr@npm:3.3.13" - dependencies: - "@vue/compiler-dom": 3.3.13 - "@vue/shared": 3.3.13 - checksum: 02f3999467a6290af8a77c112462b23faf34399e55f7ef51b0b9985d75363a1ffcfb915201cb8a5890d50ede75af52356e32d9b950f1be16532842e670fd6b60 - languageName: node - linkType: hard - -"@vue/reactivity-transform@npm:3.3.13": - version: 3.3.13 - resolution: "@vue/reactivity-transform@npm:3.3.13" - dependencies: - "@babel/parser": ^7.23.5 - "@vue/compiler-core": 3.3.13 - "@vue/shared": 3.3.13 - estree-walker: ^2.0.2 - magic-string: ^0.30.5 - checksum: 6abe723dd33302635377acffd9a29121e48dea3dba720eefb26481fc78bfd5e4070674a5871c72c27905a4e01b3e8c27b73060c828a27f1e623ce2913f9a3af3 - languageName: node - linkType: hard - -"@vue/shared@npm:3.3.13": - version: 3.3.13 - resolution: "@vue/shared@npm:3.3.13" - checksum: 3f57cd2f4611962aa1a4e9a5926f160f200f1769015240ad02df0245fe25bd2303b88957f35a13fbb0bf8d3e5a649fd41f44f347a0cf29e84e8f41d70123f7bf - languageName: node - linkType: hard - -"@wagmi/connectors@npm:5.0.2": - version: 5.0.2 - resolution: "@wagmi/connectors@npm:5.0.2" - dependencies: - "@coinbase/wallet-sdk": 4.0.0 - "@metamask/sdk": 0.20.3 - "@safe-global/safe-apps-provider": 0.18.1 - "@safe-global/safe-apps-sdk": 8.1.0 - "@walletconnect/ethereum-provider": 2.13.0 - "@walletconnect/modal": 2.6.2 - cbw-sdk: "npm:@coinbase/wallet-sdk@3.9.3" - peerDependencies: - "@wagmi/core": 2.10.2 - typescript: ">=5.0.4" - viem: 2.x - peerDependenciesMeta: - typescript: - optional: true - checksum: 2c03cc7b3db25da9631afecfb5b40817d6205bd67e0e306a235bc07742f2cee7b120141197d6f165446e84f5c618a9f556d4bb5fa0e1392368f9ee6e7b950d50 - languageName: node - linkType: hard - -"@wagmi/core@npm:2.10.2": - version: 2.10.2 - resolution: "@wagmi/core@npm:2.10.2" - dependencies: - eventemitter3: 5.0.1 - mipd: 0.0.5 - zustand: 4.4.1 - peerDependencies: - "@tanstack/query-core": ">=5.0.0" - typescript: ">=5.0.4" - viem: 2.x - peerDependenciesMeta: - "@tanstack/query-core": - optional: true - typescript: - optional: true - checksum: a738aea155f662da2e538c3ba8ee2556eb317abc8a1bcac1e3d3002300dd65a7c7d7fa414419d8a306e0612c47e226368cacb88111b7071cd01366672a3394d0 - languageName: node - linkType: hard - -"@walletconnect/core@npm:2.17.1": - version: 2.17.1 - resolution: "@walletconnect/core@npm:2.17.1" - dependencies: - "@walletconnect/heartbeat": 1.2.2 - "@walletconnect/jsonrpc-provider": 1.0.14 - "@walletconnect/jsonrpc-types": 1.0.4 - "@walletconnect/jsonrpc-utils": 1.0.8 - "@walletconnect/jsonrpc-ws-connection": 1.0.14 - "@walletconnect/keyvaluestorage": 1.1.1 - "@walletconnect/logger": 2.1.2 - "@walletconnect/relay-api": 1.0.11 - "@walletconnect/relay-auth": 1.0.4 - "@walletconnect/safe-json": 1.0.2 - "@walletconnect/time": 1.0.2 - "@walletconnect/types": 2.17.1 - "@walletconnect/utils": 2.17.1 - "@walletconnect/window-getters": 1.0.1 - events: 3.3.0 - lodash.isequal: 4.5.0 - uint8arrays: 3.1.0 - checksum: 41fae7cfe91e012881eae3e1214ab626ad119bfdf33866f97ee423011efca828d673bb9496dce5f5f9d71c0997ca46c4c2bc7c3c53ca1aa6580494de945743cb - languageName: node - linkType: hard - -"@walletconnect/environment@npm:^1.0.1": - version: 1.0.1 - resolution: "@walletconnect/environment@npm:1.0.1" - dependencies: - tslib: 1.14.1 - checksum: a18731d857bdca73910147e59992cef3c6e292c37ab3d3013307bd706f06cb216aa804f0f48b25a78df6493ad8127e633629f4b50acb4f69d3765d6ac0524f68 - languageName: node - linkType: hard - -"@walletconnect/ethereum-provider@npm:2.17.1": - version: 2.17.1 - resolution: "@walletconnect/ethereum-provider@npm:2.17.1" - dependencies: - "@walletconnect/jsonrpc-http-connection": 1.0.8 - "@walletconnect/jsonrpc-provider": 1.0.14 - "@walletconnect/jsonrpc-types": 1.0.4 - "@walletconnect/jsonrpc-utils": 1.0.8 - "@walletconnect/keyvaluestorage": 1.1.1 - "@walletconnect/modal": 2.7.0 - "@walletconnect/sign-client": 2.17.1 - "@walletconnect/types": 2.17.1 - "@walletconnect/universal-provider": 2.17.1 - "@walletconnect/utils": 2.17.1 - events: 3.3.0 - checksum: 4d03152fecc21479fd5833304bd9830b4218d4b2ba33bb16f04339758cc2b36007a9c1218edda42d6a1d62a7373cbcc8d7d729ca1ab10cb5c0541513d98e6e1e - languageName: node - linkType: hard - -"@walletconnect/events@npm:1.0.1, @walletconnect/events@npm:^1.0.1": - version: 1.0.1 - resolution: "@walletconnect/events@npm:1.0.1" - dependencies: - keyvaluestorage-interface: ^1.0.0 - tslib: 1.14.1 - checksum: d28aa4dcc981bdaf38f0aeed979731ca793cead7e7a4ee730a9146d99d89db09a86c8e3192ed860638283276961c0723ba00cf3b8776f0692b36ec7df6c01be4 - languageName: node - linkType: hard - -"@walletconnect/heartbeat@npm:1.2.2": - version: 1.2.2 - resolution: "@walletconnect/heartbeat@npm:1.2.2" - dependencies: - "@walletconnect/events": ^1.0.1 - "@walletconnect/time": ^1.0.2 - events: ^3.3.0 - checksum: 720341f24dae64acc836015d694b4337a0d1cbc628a3f6ee556771278465cae61366fb0e5af93f9823b06a6f4e23013f3986d6dad2a58c2db4b7c991a73c646d - languageName: node - linkType: hard - -"@walletconnect/jsonrpc-http-connection@npm:1.0.8": - version: 1.0.8 - resolution: "@walletconnect/jsonrpc-http-connection@npm:1.0.8" - dependencies: - "@walletconnect/jsonrpc-utils": ^1.0.6 - "@walletconnect/safe-json": ^1.0.1 - cross-fetch: ^3.1.4 - events: ^3.3.0 - checksum: 2b7c49aca54af2ec37f7bb493062e0bb522ec262889890aa00c133a85dd39beffcfcdb73252600446383a9e6db360cffdc6c50ef7c9b68aae7f5606c8781bdbc - languageName: node - linkType: hard - -"@walletconnect/jsonrpc-provider@npm:1.0.14": - version: 1.0.14 - resolution: "@walletconnect/jsonrpc-provider@npm:1.0.14" - dependencies: - "@walletconnect/jsonrpc-utils": ^1.0.8 - "@walletconnect/safe-json": ^1.0.2 - events: ^3.3.0 - checksum: db8f931f93285520c51939603108f5cfe2a90a651d12744766d14471db3a488d2964ece5bfedc6cc93832ecd008cd37e7e1b1a950d9ef3385106ee052b936573 - languageName: node - linkType: hard - -"@walletconnect/jsonrpc-types@npm:1.0.4, @walletconnect/jsonrpc-types@npm:^1.0.2, @walletconnect/jsonrpc-types@npm:^1.0.3": - version: 1.0.4 - resolution: "@walletconnect/jsonrpc-types@npm:1.0.4" - dependencies: - events: ^3.3.0 - keyvaluestorage-interface: ^1.0.0 - checksum: 99ea5f9f3b0c5892ff874de87dee62cf4fc345124177db1e6e5eaf48b85e2ea3833f0157beca43c51047444938e8eda6362fa8069b33e11d39e1050e7ef6e821 - languageName: node - linkType: hard - -"@walletconnect/jsonrpc-utils@npm:1.0.8, @walletconnect/jsonrpc-utils@npm:^1.0.6, @walletconnect/jsonrpc-utils@npm:^1.0.8": - version: 1.0.8 - resolution: "@walletconnect/jsonrpc-utils@npm:1.0.8" - dependencies: - "@walletconnect/environment": ^1.0.1 - "@walletconnect/jsonrpc-types": ^1.0.3 - tslib: 1.14.1 - checksum: f43a85dfce8150c3e3d1f009e8d8241ab8e10b026ea435f0918edf4db6b3a17586ba9d9c54a93cc61e4d3c685611e5bd5954fc377a581af503acd38e6d84c2ef - languageName: node - linkType: hard - -"@walletconnect/jsonrpc-ws-connection@npm:1.0.14": - version: 1.0.14 - resolution: "@walletconnect/jsonrpc-ws-connection@npm:1.0.14" - dependencies: - "@walletconnect/jsonrpc-utils": ^1.0.6 - "@walletconnect/safe-json": ^1.0.2 - events: ^3.3.0 - ws: ^7.5.1 - checksum: a401e60b19390098183ef1b2a7b3e15c4dd3c64f9ac87fd2bbc0ae1f7fb31539ba542374ca021193efc4a2ae59fa3b04e588aed98cdf5c364f50524403d50f9f - languageName: node - linkType: hard - -"@walletconnect/keyvaluestorage@npm:1.1.1": - version: 1.1.1 - resolution: "@walletconnect/keyvaluestorage@npm:1.1.1" - dependencies: - "@walletconnect/safe-json": ^1.0.1 - idb-keyval: ^6.2.1 - unstorage: ^1.9.0 - peerDependencies: - "@react-native-async-storage/async-storage": 1.x - peerDependenciesMeta: - "@react-native-async-storage/async-storage": - optional: true - checksum: 7f85cb83963153417745367742070ccb78e03bd62adb549de57a7d5fae7bcfbd9a8f42b2f445ca76a3817ffacacc69d85bbf67757c3616ee7b3525f2f8a0faea - languageName: node - linkType: hard - -"@walletconnect/logger@npm:2.1.2": - version: 2.1.2 - resolution: "@walletconnect/logger@npm:2.1.2" - dependencies: - "@walletconnect/safe-json": ^1.0.2 - pino: 7.11.0 - checksum: a2bb88b76d95ec5a95279dcc919f1d044d17be8fdda98a01665a607561b445bb56f2245a280933fb19aa7d41d41b688d0ffdb434ac56c46163ad2eb5338f389a - languageName: node - linkType: hard - -"@walletconnect/modal-core@npm:2.6.2": - version: 2.6.2 - resolution: "@walletconnect/modal-core@npm:2.6.2" - dependencies: - valtio: 1.11.2 - checksum: 94daceba50c323b06ecbeac2968d9f0972f327359c6118887c6526cd64006249b12f64322d71bc6c4a2b928436ecc89cf3d3af706511fcdc264c1f4b34a2dd5d - languageName: node - linkType: hard - -"@walletconnect/modal-core@npm:2.7.0": - version: 2.7.0 - resolution: "@walletconnect/modal-core@npm:2.7.0" - dependencies: - valtio: 1.11.2 - checksum: 2abc4958eed0f65b3f03599f25f7393f06c94602df8ffceb59795e9da6ab3a36242520ee7f1e0733b14278422e9bbba5f850915b0b069f7f0a8f2d48c51365de - languageName: node - linkType: hard - -"@walletconnect/modal-ui@npm:2.6.2": - version: 2.6.2 - resolution: "@walletconnect/modal-ui@npm:2.6.2" - dependencies: - "@walletconnect/modal-core": 2.6.2 - lit: 2.8.0 - motion: 10.16.2 - qrcode: 1.5.3 - checksum: cd1ec0205eb491e529670599d3dd26f6782d7c5a99d5594bf6949a8c760c1c5f4eb6ed72b8662450774fe4e2dd47678f2c05145c8f2494bd7153446ddf4bd7ed - languageName: node - linkType: hard - -"@walletconnect/modal-ui@npm:2.7.0": - version: 2.7.0 - resolution: "@walletconnect/modal-ui@npm:2.7.0" - dependencies: - "@walletconnect/modal-core": 2.7.0 - lit: 2.8.0 - motion: 10.16.2 - qrcode: 1.5.3 - checksum: fbea115142df9aeeaa95eeb08581d03d829a5bef1aa145227f3e8c367e4ad990c0b833da37fe82464bf1349744197092a741ca85d3fe9ee255e42ba911f862cc - languageName: node - linkType: hard - -"@walletconnect/modal@npm:2.6.2": - version: 2.6.2 - resolution: "@walletconnect/modal@npm:2.6.2" - dependencies: - "@walletconnect/modal-core": 2.6.2 - "@walletconnect/modal-ui": 2.6.2 - checksum: 68b354d49960b96d22de0e47a3801df27c01a3e96ec5fbde3ca6df1344ca2b20668b0c4d58fe1803f5670ac7b7b4c6f5b7b405e354f5f9eaff5cca147c13de9c - languageName: node - linkType: hard - -"@walletconnect/modal@npm:2.7.0": - version: 2.7.0 - resolution: "@walletconnect/modal@npm:2.7.0" - dependencies: - "@walletconnect/modal-core": 2.7.0 - "@walletconnect/modal-ui": 2.7.0 - checksum: 028e914db306faac24e350510ea286f08c2aec1b6c39857b2ba8740f7d1bfab6a6c4d2acba5ab63fc127fd7da617ec80ab13599083363f13e72e2aff611615bf - languageName: node - linkType: hard - -"@walletconnect/react-native-compat@npm:2.17.1": - version: 2.17.1 - resolution: "@walletconnect/react-native-compat@npm:2.17.1" - dependencies: - events: 3.3.0 - fast-text-encoding: 1.0.6 - react-native-url-polyfill: 2.0.0 - peerDependencies: - "@react-native-async-storage/async-storage": "*" - "@react-native-community/netinfo": "*" - expo-application: "*" - react-native: "*" - react-native-get-random-values: "*" - peerDependenciesMeta: - expo-application: - optional: true - checksum: 50ae8e0673ab6996c4841dcba3103539f968b353f7de81edbb0570b16e4be37293dfd60badd5ccba10bcd1f79d4df797738342e13bcaeaccb971880b8caa113e - languageName: node - linkType: hard - -"@walletconnect/relay-api@npm:1.0.11": - version: 1.0.11 - resolution: "@walletconnect/relay-api@npm:1.0.11" - dependencies: - "@walletconnect/jsonrpc-types": ^1.0.2 - checksum: 9fcddf055de01c04b9fa59035e8c6e31d523743c848d266f528009048aeadaa1b4d9b544bdcb6928e7a69f738d5f0352d1cdebbaa34b1346b937942cb5f6f144 - languageName: node - linkType: hard - -"@walletconnect/relay-auth@npm:1.0.4": - version: 1.0.4 - resolution: "@walletconnect/relay-auth@npm:1.0.4" - dependencies: - "@stablelib/ed25519": ^1.0.2 - "@stablelib/random": ^1.0.1 - "@walletconnect/safe-json": ^1.0.1 - "@walletconnect/time": ^1.0.2 - tslib: 1.14.1 - uint8arrays: ^3.0.0 - checksum: 35b3229d7b57e74fdb8fe6827d8dd8291dc60bacda880a57b2acb47a34d38f12be46c971c9eff361eb4073e896648b550de7a7a3852ef3752f9619c08dfba891 - languageName: node - linkType: hard - -"@walletconnect/safe-json@npm:1.0.2, @walletconnect/safe-json@npm:^1.0.1, @walletconnect/safe-json@npm:^1.0.2": - version: 1.0.2 - resolution: "@walletconnect/safe-json@npm:1.0.2" - dependencies: - tslib: 1.14.1 - checksum: fee03fcc70adb5635ab9419ea6ec6555aa2467bef650ad3b9526451c3a5cf247836db0f3ae3bb435d2e585d99e50c2ebe7dc9c429cfa3df900cf3fe4bd06d37f - languageName: node - linkType: hard - -"@walletconnect/sign-client@npm:2.17.1": - version: 2.17.1 - resolution: "@walletconnect/sign-client@npm:2.17.1" - dependencies: - "@walletconnect/core": 2.17.1 - "@walletconnect/events": 1.0.1 - "@walletconnect/heartbeat": 1.2.2 - "@walletconnect/jsonrpc-utils": 1.0.8 - "@walletconnect/logger": 2.1.2 - "@walletconnect/time": 1.0.2 - "@walletconnect/types": 2.17.1 - "@walletconnect/utils": 2.17.1 - events: 3.3.0 - checksum: 055a0aa0d176592dec27d096244635b938c098c2f46ea8616c9e7f3fbfa27ecf68b19593c0576e91a74d49b1ced4da83f94813914e3e34eaad175ab96ba49e15 - languageName: node - linkType: hard - -"@walletconnect/time@npm:1.0.2, @walletconnect/time@npm:^1.0.2": - version: 1.0.2 - resolution: "@walletconnect/time@npm:1.0.2" - dependencies: - tslib: 1.14.1 - checksum: e3fc0113ca9e7ecedfc65f9e1517196682d5ffcda60750f51073b8d704719a17fea75da8b242c804bfa5b994707723043892a2db3cc86988b190b7b8711fe3c0 - languageName: node - linkType: hard - -"@walletconnect/types@npm:2.17.1": - version: 2.17.1 - resolution: "@walletconnect/types@npm:2.17.1" - dependencies: - "@walletconnect/events": 1.0.1 - "@walletconnect/heartbeat": 1.2.2 - "@walletconnect/jsonrpc-types": 1.0.4 - "@walletconnect/keyvaluestorage": 1.1.1 - "@walletconnect/logger": 2.1.2 - events: 3.3.0 - checksum: 1cf6be908e825ba5b2a292a228f3223c32041fb5c76de6bac1aa3a898f702f917bf500bd6edca8b3e7bcc9303643a114680b7ce29cdefd82c0702e52ba0b3cf1 - languageName: node - linkType: hard - -"@walletconnect/universal-provider@npm:2.17.1": - version: 2.17.1 - resolution: "@walletconnect/universal-provider@npm:2.17.1" - dependencies: - "@walletconnect/events": 1.0.1 - "@walletconnect/jsonrpc-http-connection": 1.0.8 - "@walletconnect/jsonrpc-provider": 1.0.14 - "@walletconnect/jsonrpc-types": 1.0.4 - "@walletconnect/jsonrpc-utils": 1.0.8 - "@walletconnect/keyvaluestorage": 1.1.1 - "@walletconnect/logger": 2.1.2 - "@walletconnect/sign-client": 2.17.1 - "@walletconnect/types": 2.17.1 - "@walletconnect/utils": 2.17.1 - events: 3.3.0 - lodash: 4.17.21 - checksum: 9412f53df01a527595e3afe9341bfed8d87bd0b4703e07c50a19fcc7279729b8a6350cbce637be77b2410273bf2983583e35b92db825a86923a50ebbce4d9aea - languageName: node - linkType: hard - -"@walletconnect/utils@npm:2.17.1": - version: 2.17.1 - resolution: "@walletconnect/utils@npm:2.17.1" - dependencies: - "@ethersproject/hash": 5.7.0 - "@ethersproject/transactions": 5.7.0 - "@stablelib/chacha20poly1305": 1.0.1 - "@stablelib/hkdf": 1.0.1 - "@stablelib/random": 1.0.2 - "@stablelib/sha256": 1.0.1 - "@stablelib/x25519": 1.0.3 - "@walletconnect/jsonrpc-utils": 1.0.8 - "@walletconnect/keyvaluestorage": 1.1.1 - "@walletconnect/relay-api": 1.0.11 - "@walletconnect/relay-auth": 1.0.4 - "@walletconnect/safe-json": 1.0.2 - "@walletconnect/time": 1.0.2 - "@walletconnect/types": 2.17.1 - "@walletconnect/window-getters": 1.0.1 - "@walletconnect/window-metadata": 1.0.1 - detect-browser: 5.3.0 - elliptic: 6.5.7 - query-string: 7.1.3 - uint8arrays: 3.1.0 - checksum: 0e2c4c911308e198b0757914536f85464782c3abeab8caaa4e3516354c4f56b40bc83f44f427e0fa1a1b58730d4e30e9f59d310fc4fcead65b7ed92602d59f54 - languageName: node - linkType: hard - -"@walletconnect/window-getters@npm:1.0.1, @walletconnect/window-getters@npm:^1.0.1": - version: 1.0.1 - resolution: "@walletconnect/window-getters@npm:1.0.1" - dependencies: - tslib: 1.14.1 - checksum: fae312c4e1be5574d97f071de58e6aa0d0296869761499caf9d4a9a5fd2643458af32233a2120521b00873a599ff88457d405bd82ced5fb5bd6dc3191c07a3e5 - languageName: node - linkType: hard - -"@walletconnect/window-metadata@npm:1.0.1": - version: 1.0.1 - resolution: "@walletconnect/window-metadata@npm:1.0.1" - dependencies: - "@walletconnect/window-getters": ^1.0.1 - tslib: 1.14.1 - checksum: e82aea7195c6fe95c00e87bb38051c5549838c2e8302da94f1afa48206f79f0b620166c9820f847494505d282d1568e2086a1561b0493d2d0a1fa115f9106aef - languageName: node - linkType: hard - -"@web3-react/core@npm:8.2.3": - version: 8.2.3 - resolution: "@web3-react/core@npm:8.2.3" - dependencies: - "@ethersproject/providers": ^5 - "@web3-react/store": ^8.2.3 - "@web3-react/types": ^8.2.3 - zustand: 4.4.0 - peerDependencies: - react: ">=16.8" - dependenciesMeta: - "@ethersproject/providers": - optional: true - checksum: 23aff5864c580c1799f75dea3edbeef7270a553fed5f8569cca42687f51e9b55b6d46c87104f5c66f49b66caffba3ea581726ecab2b39807319b192d0e0909c4 - languageName: node - linkType: hard - -"@web3-react/empty@npm:8.2.3": - version: 8.2.3 - resolution: "@web3-react/empty@npm:8.2.3" - dependencies: - "@web3-react/types": ^8.2.3 - checksum: e6f0c1c112a420a325cebc45d41e4f7b1a00c88ecc2bff594816252a21433fc6609c2aa8f1bcb96ffd04b4fef3a7d6b6b9ea5041c6335cfb3c1508ba8b4f3be7 - languageName: node - linkType: hard - -"@web3-react/store@npm:^8.2.3": - version: 8.2.3 - resolution: "@web3-react/store@npm:8.2.3" - dependencies: - "@ethersproject/address": ^5 - "@web3-react/types": ^8.2.3 - zustand: 4.4.0 - checksum: 97f8984f82b597e5a0bd012b416d2935c4d92cb2d11398e4b6194c338b796e9c0af94cef5414689cb7ed08f670021c87159c3bdb49aa8c7810480fffc804bf6c - languageName: node - linkType: hard - -"@web3-react/types@npm:8.2.3, @web3-react/types@npm:^8.2.3": - version: 8.2.3 - resolution: "@web3-react/types@npm:8.2.3" - dependencies: - zustand: 4.4.0 - checksum: 30c1d3c98a36f5cdde8deb949ae71bc55afbfc3609d75bf7c5ec9f89a11d69c58a41ce5fc5aea5c73ed7abcc8b90bf5a9cdb5dba8cb778a9ea41921bf73cb3e9 - languageName: node - linkType: hard - -"@webassemblyjs/ast@npm:1.14.1, @webassemblyjs/ast@npm:^1.11.5, @webassemblyjs/ast@npm:^1.14.1": - version: 1.14.1 - resolution: "@webassemblyjs/ast@npm:1.14.1" - dependencies: - "@webassemblyjs/helper-numbers": 1.13.2 - "@webassemblyjs/helper-wasm-bytecode": 1.13.2 - checksum: f9154ad9ea14f6f2374ebe918c221fd69a4d4514126a1acc6fa4966e8d27ab28cb550a5e6880032cf620e19640578658a7e5a55bd2aad1e3db4e9d598b8f2099 - languageName: node - linkType: hard - -"@webassemblyjs/floating-point-hex-parser@npm:1.13.2": - version: 1.13.2 - resolution: "@webassemblyjs/floating-point-hex-parser@npm:1.13.2" - checksum: e866ec8433f4a70baa511df5e8f2ebcd6c24f4e2cc6274c7c5aabe2bcce3459ea4680e0f35d450e1f3602acf3913b6b8e4f15069c8cfd34ae8609fb9a7d01795 - languageName: node - linkType: hard - -"@webassemblyjs/helper-api-error@npm:1.13.2": - version: 1.13.2 - resolution: "@webassemblyjs/helper-api-error@npm:1.13.2" - checksum: 48b5df7fd3095bb252f59a139fe2cbd999a62ac9b488123e9a0da3906ad8a2f2da7b2eb21d328c01a90da987380928706395c2897d1f3ed9e2125b6d75a920d0 - languageName: node - linkType: hard - -"@webassemblyjs/helper-buffer@npm:1.14.1": - version: 1.14.1 - resolution: "@webassemblyjs/helper-buffer@npm:1.14.1" - checksum: b611e981dfd6a797c3d8fc3a772de29a6e55033737c2c09c31bb66c613bdbb2d25f915df1dee62a602c6acc057ca71128432fa8c3e22a893e1219dc454f14ede - languageName: node - linkType: hard - -"@webassemblyjs/helper-numbers@npm:1.13.2": - version: 1.13.2 - resolution: "@webassemblyjs/helper-numbers@npm:1.13.2" - dependencies: - "@webassemblyjs/floating-point-hex-parser": 1.13.2 - "@webassemblyjs/helper-api-error": 1.13.2 - "@xtuc/long": 4.2.2 - checksum: 49e2c9bf9b66997e480f6b44d80f895b3cde4de52ac135921d28e144565edca6903a519f627f4089b5509de1d7f9e5023f0e1a94ff78a36c9e2eb30e7c18ffd2 - languageName: node - linkType: hard - -"@webassemblyjs/helper-wasm-bytecode@npm:1.13.2": - version: 1.13.2 - resolution: "@webassemblyjs/helper-wasm-bytecode@npm:1.13.2" - checksum: 8e059e1c1f0294f4fc3df8e4eaff3c5ef6e2e1358f34ebc118eaf5070ed59e56ed7fc92b28be734ebde17c8d662d5d27e06ade686c282445135da083ae11c128 - languageName: node - linkType: hard - -"@webassemblyjs/helper-wasm-section@npm:1.14.1": - version: 1.14.1 - resolution: "@webassemblyjs/helper-wasm-section@npm:1.14.1" - dependencies: - "@webassemblyjs/ast": 1.14.1 - "@webassemblyjs/helper-buffer": 1.14.1 - "@webassemblyjs/helper-wasm-bytecode": 1.13.2 - "@webassemblyjs/wasm-gen": 1.14.1 - checksum: 0a08d454a63192cd66abf91b6f060ac4b466cef341262246e9dcc828dd4c8536195dea9b46a1244b1eac65b59b8b502164a771a190052a92ff0a0a2ded0f8f53 - languageName: node - linkType: hard - -"@webassemblyjs/ieee754@npm:1.13.2": - version: 1.13.2 - resolution: "@webassemblyjs/ieee754@npm:1.13.2" - dependencies: - "@xtuc/ieee754": ^1.2.0 - checksum: d7e3520baa37a7309fa7db4d73d69fb869878853b1ebd4b168821bd03fcc4c0e1669c06231315b0039035d9a7a462e53de3ad982da4a426a4b0743b5888e8673 - languageName: node - linkType: hard - -"@webassemblyjs/leb128@npm:1.13.2": - version: 1.13.2 - resolution: "@webassemblyjs/leb128@npm:1.13.2" - dependencies: - "@xtuc/long": 4.2.2 - checksum: 64083507f7cff477a6d71a9e325d95665cea78ec8df99ca7c050e1cfbe300fbcf0842ca3dcf3b4fa55028350135588a4f879398d3dd2b6a8de9913ce7faf5333 - languageName: node - linkType: hard - -"@webassemblyjs/utf8@npm:1.13.2": - version: 1.13.2 - resolution: "@webassemblyjs/utf8@npm:1.13.2" - checksum: 95ec6052f30eefa8d50c9b2a3394d08b17d53a4aa52821451d41d774c126fa8f39b988fbf5bff56da86852a87c16d676e576775a4071e5e5ccf020cc85a4b281 - languageName: node - linkType: hard - -"@webassemblyjs/wasm-edit@npm:^1.11.5, @webassemblyjs/wasm-edit@npm:^1.14.1": - version: 1.14.1 - resolution: "@webassemblyjs/wasm-edit@npm:1.14.1" - dependencies: - "@webassemblyjs/ast": 1.14.1 - "@webassemblyjs/helper-buffer": 1.14.1 - "@webassemblyjs/helper-wasm-bytecode": 1.13.2 - "@webassemblyjs/helper-wasm-section": 1.14.1 - "@webassemblyjs/wasm-gen": 1.14.1 - "@webassemblyjs/wasm-opt": 1.14.1 - "@webassemblyjs/wasm-parser": 1.14.1 - "@webassemblyjs/wast-printer": 1.14.1 - checksum: 9341c3146bb1b7863f03d6050c2a66990f20384ca137388047bbe1feffacb599e94fca7b7c18287d17e2449ffb4005fdc7f41f674a6975af9ad8522756f8ffff - languageName: node - linkType: hard - -"@webassemblyjs/wasm-gen@npm:1.14.1": - version: 1.14.1 - resolution: "@webassemblyjs/wasm-gen@npm:1.14.1" - dependencies: - "@webassemblyjs/ast": 1.14.1 - "@webassemblyjs/helper-wasm-bytecode": 1.13.2 - "@webassemblyjs/ieee754": 1.13.2 - "@webassemblyjs/leb128": 1.13.2 - "@webassemblyjs/utf8": 1.13.2 - checksum: 401b12bec7431c4fc29d9414bbe40d3c6dc5be04d25a116657c42329f5481f0129f3b5834c293f26f0e42681ceac9157bf078ce9bdb6a7f78037c650373f98b2 - languageName: node - linkType: hard - -"@webassemblyjs/wasm-opt@npm:1.14.1": - version: 1.14.1 - resolution: "@webassemblyjs/wasm-opt@npm:1.14.1" - dependencies: - "@webassemblyjs/ast": 1.14.1 - "@webassemblyjs/helper-buffer": 1.14.1 - "@webassemblyjs/wasm-gen": 1.14.1 - "@webassemblyjs/wasm-parser": 1.14.1 - checksum: 60c697a9e9129d8d23573856df0791ba33cea4a3bc2339044cae73128c0983802e5e50a42157b990eeafe1237eb8e7653db6de5f02b54a0ae7b81b02dcdf2ae9 - languageName: node - linkType: hard - -"@webassemblyjs/wasm-parser@npm:1.14.1, @webassemblyjs/wasm-parser@npm:^1.11.5, @webassemblyjs/wasm-parser@npm:^1.14.1": - version: 1.14.1 - resolution: "@webassemblyjs/wasm-parser@npm:1.14.1" - dependencies: - "@webassemblyjs/ast": 1.14.1 - "@webassemblyjs/helper-api-error": 1.13.2 - "@webassemblyjs/helper-wasm-bytecode": 1.13.2 - "@webassemblyjs/ieee754": 1.13.2 - "@webassemblyjs/leb128": 1.13.2 - "@webassemblyjs/utf8": 1.13.2 - checksum: 93f1fe2676da465b4e824419d9812a3d7218de4c3addd4e916c04bc86055fa134416c1b67e4b7cbde8d728c0dce2721d06cc0bfe7a7db7c093a0898009937405 - languageName: node - linkType: hard - -"@webassemblyjs/wast-printer@npm:1.14.1": - version: 1.14.1 - resolution: "@webassemblyjs/wast-printer@npm:1.14.1" - dependencies: - "@webassemblyjs/ast": 1.14.1 - "@xtuc/long": 4.2.2 - checksum: 517881a0554debe6945de719d100b2d8883a2d24ddf47552cdeda866341e2bb153cd824a864bc7e2a61190a4b66b18f9899907e0074e9e820d2912ac0789ea60 - languageName: node - linkType: hard - -"@webgpu/types@npm:0.1.21": - version: 0.1.21 - resolution: "@webgpu/types@npm:0.1.21" - checksum: b16ddc4d46a3c507a7f243f14b08b96ebbdb4495f9ea703441ad3525dd5e7e4a5f743f2879e51d74c78846f950e7d60c1349670f75cb7ca03ac3ddf51d46aabe - languageName: node - linkType: hard - -"@webpack-cli/configtest@npm:^2.1.1": - version: 2.1.1 - resolution: "@webpack-cli/configtest@npm:2.1.1" - peerDependencies: - webpack: 5.x.x - webpack-cli: 5.x.x - checksum: 9f9f9145c2d05471fc83d426db1df85cf49f329836b0c4b9f46b6948bed4b013464c00622b136d2a0a26993ce2306976682592245b08ee717500b1db45009a72 - languageName: node - linkType: hard - -"@webpack-cli/info@npm:^2.0.2": - version: 2.0.2 - resolution: "@webpack-cli/info@npm:2.0.2" - peerDependencies: - webpack: 5.x.x - webpack-cli: 5.x.x - checksum: 8f9a178afca5c82e113aed1efa552d64ee5ae4fdff63fe747c096a981ec74f18a5d07bd6e89bbe6715c3e57d96eea024a410e58977169489fe1df044c10dd94e - languageName: node - linkType: hard - -"@webpack-cli/serve@npm:^2.0.5": - version: 2.0.5 - resolution: "@webpack-cli/serve@npm:2.0.5" - peerDependencies: - webpack: 5.x.x - webpack-cli: 5.x.x - peerDependenciesMeta: - webpack-dev-server: - optional: true - checksum: 75f0e54681796d567a71ac3e2781d2901a8d8cf1cdfc82f261034dddac59a8343e8c3bc5e32b4bb9d6766759ba49fb29a5cd86ef1701d79c506fe886bb63ac75 - languageName: node - linkType: hard - -"@welldone-software/why-did-you-render@npm:8.0.1": - version: 8.0.1 - resolution: "@welldone-software/why-did-you-render@npm:8.0.1" - dependencies: - lodash: ^4 - peerDependencies: - react: ^18 - checksum: cabb08e49a241b44208fc2acc60c34af2885b98feaa3e80c21b34d45c77cac72c83fc914645cc1cfa253b4a6272ac6d21327ec76d4c54b5b9387d8be576240c9 - languageName: node - linkType: hard - -"@whatwg-node/events@npm:^0.0.3": - version: 0.0.3 - resolution: "@whatwg-node/events@npm:0.0.3" - checksum: af26f40d4d0a0f5f0ee45fc6124afb8d6b33988dae96ab0fb87aa5e66d1ff08a749491b9da533ea524bbaebd4a770736f254d574a91ab4455386aa098cee8c77 - languageName: node - linkType: hard - -"@whatwg-node/fetch@npm:^0.5.0": - version: 0.5.1 - resolution: "@whatwg-node/fetch@npm:0.5.1" - dependencies: - "@peculiar/webcrypto": ^1.4.0 - abort-controller: ^3.0.0 - busboy: ^1.6.0 - form-data-encoder: ^1.7.1 - formdata-node: ^4.3.1 - node-fetch: ^2.6.7 - undici: ^5.12.0 - web-streams-polyfill: ^3.2.0 - checksum: f8d43b1bbf7ab20fc36bb9cc1d83094e1bb3d4b8256abd41045a02c3c9569d01f64309646273a4a50838929875408fc66396ada336747d81b2d3f965830bd0b6 - languageName: node - linkType: hard - -"@whatwg-node/fetch@npm:^0.8.0, @whatwg-node/fetch@npm:^0.8.1, @whatwg-node/fetch@npm:^0.8.2": - version: 0.8.8 - resolution: "@whatwg-node/fetch@npm:0.8.8" - dependencies: - "@peculiar/webcrypto": ^1.4.0 - "@whatwg-node/node-fetch": ^0.3.6 - busboy: ^1.6.0 - urlpattern-polyfill: ^8.0.0 - web-streams-polyfill: ^3.2.1 - checksum: 891407ba57e32e5af70a3b0a86980c4466dcf2ba8581b6927475c85400280b163085519e98821dd94776da9aa1b0b1e221e718009e2abed9c8a0d4721025b2ab - languageName: node - linkType: hard - -"@whatwg-node/node-fetch@npm:^0.3.6": - version: 0.3.6 - resolution: "@whatwg-node/node-fetch@npm:0.3.6" - dependencies: - "@whatwg-node/events": ^0.0.3 - busboy: ^1.6.0 - fast-querystring: ^1.1.1 - fast-url-parser: ^1.1.3 - tslib: ^2.3.1 - checksum: d3d7b0a0242c0511c7b666de66d9096fb24ea251426ce76e3a26a8ca17408de5d4d4f81b5aaec840cc7025f0321fb97e06067c53f377c844a5a9473dd76491ae - languageName: node - linkType: hard - -"@wry/caches@npm:^1.0.0": - version: 1.0.1 - resolution: "@wry/caches@npm:1.0.1" - dependencies: - tslib: ^2.3.0 - checksum: 9e89aa8e9e08577b2e4acbe805f406b141ae49c2ac4a2e22acf21fbee68339fa0550e0dee28cf2158799f35bb812326e80212e49e2afd169f39f02ad56ae4ef4 - languageName: node - linkType: hard - -"@wry/context@npm:^0.7.0": - version: 0.7.4 - resolution: "@wry/context@npm:0.7.4" - dependencies: - tslib: ^2.3.0 - checksum: 9bc8c30a31f9c7d36b616e89daa9280c03d196576a4f9fef800e9bd5de9434ba70216322faeeacc7ef1ab95f59185599d702538114045df729a5ceea50aef4e2 - languageName: node - linkType: hard - -"@wry/equality@npm:^0.5.6": - version: 0.5.7 - resolution: "@wry/equality@npm:0.5.7" - dependencies: - tslib: ^2.3.0 - checksum: 892f262fae362df80f199b12658ea6966949539d4a3a50c1acf00d94a367d673a38f8efa1abcb726ae9e5cc5e62fce50c540c70f797b7c8a2c4308b401dfd903 - languageName: node - linkType: hard - -"@wry/trie@npm:^0.4.3": - version: 0.4.3 - resolution: "@wry/trie@npm:0.4.3" - dependencies: - tslib: ^2.3.0 - checksum: 106e021125cfafd22250a6631a0438a6a3debae7bd73f6db87fe42aa0757fe67693db0dfbe200ae1f60ba608c3e09ddb8a4e2b3527d56ed0a7e02aa0ee4c94e1 - languageName: node - linkType: hard - -"@wry/trie@npm:^0.5.0": - version: 0.5.0 - resolution: "@wry/trie@npm:0.5.0" - dependencies: - tslib: ^2.3.0 - checksum: 92aeea34152bd8485184236fe328d3d05fc98ee3b431d82ee60cf3584dbf68155419c3d65d0ff3731b204ee79c149440a9b7672784a545afddc8d4342fbf21c9 - languageName: node - linkType: hard - -"@xmldom/xmldom@npm:0.7.7": - version: 0.7.7 - resolution: "@xmldom/xmldom@npm:0.7.7" - checksum: f19226999c1a18949361322e52cc545a0c4a2d85130aa605845a498c10cc737a241bb1abfc22aedbf57336eaf8ead9af0a65904a0ec6649bb77f9c0d9c00ed2e - languageName: node - linkType: hard - -"@xtuc/ieee754@npm:^1.2.0": - version: 1.2.0 - resolution: "@xtuc/ieee754@npm:1.2.0" - checksum: ac56d4ca6e17790f1b1677f978c0c6808b1900a5b138885d3da21732f62e30e8f0d9120fcf8f6edfff5100ca902b46f8dd7c1e3f903728634523981e80e2885a - languageName: node - linkType: hard - -"@xtuc/long@npm:4.2.2": - version: 4.2.2 - resolution: "@xtuc/long@npm:4.2.2" - checksum: 8ed0d477ce3bc9c6fe2bf6a6a2cc316bb9c4127c5a7827bae947fa8ec34c7092395c5a283cc300c05b5fa01cbbfa1f938f410a7bf75db7c7846fea41949989ec - languageName: node - linkType: hard - -"@yarnpkg/lockfile@npm:^1.1.0": - version: 1.1.0 - resolution: "@yarnpkg/lockfile@npm:1.1.0" - checksum: 05b881b4866a3546861fee756e6d3812776ea47fa6eb7098f983d6d0eefa02e12b66c3fff931574120f196286a7ad4879ce02743c8bb2be36c6a576c7852083a - languageName: node - linkType: hard - -"@zeit/schemas@npm:2.36.0": - version: 2.36.0 - resolution: "@zeit/schemas@npm:2.36.0" - checksum: 9a5939a14ffa1e3a2c73ccb7c06b7bbc932baf1012d9191d3df641f26a2c3f7a6f25ea0213aad02a2011602ded3410cbcdc47633ec9ed28400485625b432945f - languageName: node - linkType: hard - -"JSONStream@npm:^1.0.4": - version: 1.3.5 - resolution: "JSONStream@npm:1.3.5" - dependencies: - jsonparse: ^1.2.0 - through: ">=2.2.7 <3" - bin: - JSONStream: ./bin.js - checksum: 2605fa124260c61bad38bb65eba30d2f72216a78e94d0ab19b11b4e0327d572b8d530c0c9cc3b0764f727ad26d39e00bf7ebad57781ca6368394d73169c59e46 - languageName: node - linkType: hard - -"abab@npm:^2.0.5, abab@npm:^2.0.6": - version: 2.0.6 - resolution: "abab@npm:2.0.6" - checksum: 6ffc1af4ff315066c62600123990d87551ceb0aafa01e6539da77b0f5987ac7019466780bf480f1787576d4385e3690c81ccc37cfda12819bf510b8ab47e5a3e - languageName: node - linkType: hard - -"abbrev@npm:^1.0.0": - version: 1.1.1 - resolution: "abbrev@npm:1.1.1" - checksum: a4a97ec07d7ea112c517036882b2ac22f3109b7b19077dc656316d07d308438aac28e4d9746dc4d84bf6b1e75b4a7b0a5f3cb30592419f128ca9a8cee3bcfa17 - languageName: node - linkType: hard - -"abitype@npm:1.0.6": - version: 1.0.6 - resolution: "abitype@npm:1.0.6" - peerDependencies: - typescript: ">=5.0.4" - zod: ^3 >=3.22.0 - peerDependenciesMeta: - typescript: - optional: true - zod: - optional: true - checksum: 0bf6ed5ec785f372746c3ec5d6c87bf4d8cf0b6db30867b8d24e86fbc66d9f6599ae3d463ccd49817e67eedec6deba7cdae317bcf4da85b02bc48009379b9f84 - languageName: node - linkType: hard - -"abitype@npm:^1.0.6": - version: 1.0.8 - resolution: "abitype@npm:1.0.8" - peerDependencies: - typescript: ">=5.0.4" - zod: ^3 >=3.22.0 - peerDependenciesMeta: - typescript: - optional: true - zod: - optional: true - checksum: 104bc2f6820ced8d2cb61521916f7f22c0981a846216f5b6144f69461265f7da137a4ae108bf4b84cd8743f2dd1e9fdadffc0f95371528e15a59e0a369e08438 - languageName: node - linkType: hard - -"abort-controller@npm:^3.0.0": - version: 3.0.0 - resolution: "abort-controller@npm:3.0.0" - dependencies: - event-target-shim: ^5.0.0 - checksum: 170bdba9b47b7e65906a28c8ce4f38a7a369d78e2271706f020849c1bfe0ee2067d4261df8bbb66eb84f79208fd5b710df759d64191db58cfba7ce8ef9c54b75 - languageName: node - linkType: hard - -"abs-svg-path@npm:^0.1.1": - version: 0.1.1 - resolution: "abs-svg-path@npm:0.1.1" - checksum: af1a167c09e8bdb76c80adca7333f3d828e5b50e37b9702aa03675e271919e7b1eeaa35cce939970ecba14769953b7465ea34c2129ab683ddff9d973a07f164f - languageName: node - linkType: hard - -"accepts@npm:^1.3.7, accepts@npm:^1.3.8, accepts@npm:~1.3.4, accepts@npm:~1.3.5, accepts@npm:~1.3.7, accepts@npm:~1.3.8": - version: 1.3.8 - resolution: "accepts@npm:1.3.8" - dependencies: - mime-types: ~2.1.34 - negotiator: 0.6.3 - checksum: 50c43d32e7b50285ebe84b613ee4a3aa426715a7d131b65b786e2ead0fd76b6b60091b9916d3478a75f11f162628a2139991b6c03ab3f1d9ab7c86075dc8eab4 - languageName: node - linkType: hard - -"acorn-globals@npm:^7.0.0": - version: 7.0.1 - resolution: "acorn-globals@npm:7.0.1" - dependencies: - acorn: ^8.1.0 - acorn-walk: ^8.0.2 - checksum: 2a2998a547af6d0db5f0cdb90acaa7c3cbca6709010e02121fb8b8617c0fbd8bab0b869579903fde358ac78454356a14fadcc1a672ecb97b04b1c2ccba955ce8 - languageName: node - linkType: hard - -"acorn-import-assertions@npm:^1.9.0": - version: 1.9.0 - resolution: "acorn-import-assertions@npm:1.9.0" - peerDependencies: - acorn: ^8 - checksum: 944fb2659d0845c467066bdcda2e20c05abe3aaf11972116df457ce2627628a81764d800dd55031ba19de513ee0d43bb771bc679cc0eda66dc8b4fade143bc0c - languageName: node - linkType: hard - -"acorn-jsx@npm:^5.3.2": - version: 5.3.2 - resolution: "acorn-jsx@npm:5.3.2" - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - checksum: c3d3b2a89c9a056b205b69530a37b972b404ee46ec8e5b341666f9513d3163e2a4f214a71f4dfc7370f5a9c07472d2fd1c11c91c3f03d093e37637d95da98950 - languageName: node - linkType: hard - -"acorn-loose@npm:^8.3.0": - version: 8.4.0 - resolution: "acorn-loose@npm:8.4.0" - dependencies: - acorn: ^8.11.0 - checksum: e079d89c7502563f8e6aed39ae8facd1174198e8092b732d9913b6ad027ee3c2d29ab3612c1be739cefcf2508884ecff386e9390d3c264a1f8318c1eba1336b5 - languageName: node - linkType: hard - -"acorn-walk@npm:^8.0.0, acorn-walk@npm:^8.0.2, acorn-walk@npm:^8.1.1, acorn-walk@npm:^8.2.0": - version: 8.3.2 - resolution: "acorn-walk@npm:8.3.2" - checksum: 3626b9d26a37b1b427796feaa5261faf712307a8920392c8dce9a5739fb31077667f4ad2ec71c7ac6aaf9f61f04a9d3d67ff56f459587206fc04aa31c27ef392 - languageName: node - linkType: hard - -"acorn@npm:^8.0.4, acorn@npm:^8.1.0, acorn@npm:^8.11.0, acorn@npm:^8.11.3, acorn@npm:^8.14.0, acorn@npm:^8.4.1, acorn@npm:^8.7.1, acorn@npm:^8.8.0, acorn@npm:^8.8.1, acorn@npm:^8.8.2, acorn@npm:^8.9.0": - version: 8.14.0 - resolution: "acorn@npm:8.14.0" - bin: - acorn: bin/acorn - checksum: 8755074ba55fff94e84e81c72f1013c2d9c78e973c31231c8ae505a5f966859baf654bddd75046bffd73ce816b149298977fff5077a3033dedba0ae2aad152d4 - languageName: node - linkType: hard - -"address@npm:^1.0.1, address@npm:^1.1.2": - version: 1.2.2 - resolution: "address@npm:1.2.2" - checksum: ace439960c1e3564d8f523aff23a841904bf33a2a7c2e064f7f60a064194075758b9690e65bd9785692a4ef698a998c57eb74d145881a1cecab8ba658ddb1607 - languageName: node - linkType: hard - -"adjust-sourcemap-loader@npm:^4.0.0": - version: 4.0.0 - resolution: "adjust-sourcemap-loader@npm:4.0.0" - dependencies: - loader-utils: ^2.0.0 - regex-parser: ^2.2.11 - checksum: d524ae23582f41e2275af5d88faab7a9dc09770ed588244e0a76d3196d0d6a90bf02760c71bc6213dbfef3aef4a86232ac9521bfd629752c32b7af37bc74c660 - languageName: node - linkType: hard - -"adm-zip@npm:^0.4.16": - version: 0.4.16 - resolution: "adm-zip@npm:0.4.16" - checksum: 5ea46664d8b3b073fffeb7f934705fea288708745e708cffc1dd732ce3d2672cecd476b243f9d051892fd12952db2b6bd061975e1ff40057246f6d0cb6534a50 - languageName: node - linkType: hard - -"aes-js@npm:3.0.0": - version: 3.0.0 - resolution: "aes-js@npm:3.0.0" - checksum: 251e26d533cd1a915b44896b17d5ed68c24a02484cfdd2e74ec700a309267db96651ea4eb657bf20aac32a3baa61f6e34edf8e2fec2de440a655da9942d334b8 - languageName: node - linkType: hard - -"agent-base@npm:6, agent-base@npm:^6.0.2": - version: 6.0.2 - resolution: "agent-base@npm:6.0.2" - dependencies: - debug: 4 - checksum: f52b6872cc96fd5f622071b71ef200e01c7c4c454ee68bc9accca90c98cfb39f2810e3e9aa330435835eedc8c23f4f8a15267f67c6e245d2b33757575bdac49d - languageName: node - linkType: hard - -"agent-base@npm:^7.0.2, agent-base@npm:^7.1.0, agent-base@npm:^7.1.1": - version: 7.1.1 - resolution: "agent-base@npm:7.1.1" - dependencies: - debug: ^4.3.4 - checksum: 51c158769c5c051482f9ca2e6e1ec085ac72b5a418a9b31b4e82fe6c0a6699adb94c1c42d246699a587b3335215037091c79e0de512c516f73b6ea844202f037 - languageName: node - linkType: hard - -"agentkeepalive@npm:^4.2.1": - version: 4.5.0 - resolution: "agentkeepalive@npm:4.5.0" - dependencies: - humanize-ms: ^1.2.1 - checksum: 13278cd5b125e51eddd5079f04d6fe0914ac1b8b91c1f3db2c1822f99ac1a7457869068997784342fe455d59daaff22e14fb7b8c3da4e741896e7e31faf92481 - languageName: node - linkType: hard - -"aggregate-error@npm:^3.0.0": - version: 3.1.0 - resolution: "aggregate-error@npm:3.1.0" - dependencies: - clean-stack: ^2.0.0 - indent-string: ^4.0.0 - checksum: 1101a33f21baa27a2fa8e04b698271e64616b886795fd43c31068c07533c7b3facfcaf4e9e0cab3624bd88f729a592f1c901a1a229c9e490eafce411a8644b79 - languageName: node - linkType: hard - -"ajv-formats@npm:2.1.1, ajv-formats@npm:^2.1.1": - version: 2.1.1 - resolution: "ajv-formats@npm:2.1.1" - dependencies: - ajv: ^8.0.0 - peerDependencies: - ajv: ^8.0.0 - peerDependenciesMeta: - ajv: - optional: true - checksum: 4a287d937f1ebaad4683249a4c40c0fa3beed30d9ddc0adba04859026a622da0d317851316ea64b3680dc60f5c3c708105ddd5d5db8fe595d9d0207fd19f90b7 - languageName: node - linkType: hard - -"ajv-keywords@npm:^3.4.1, ajv-keywords@npm:^3.5.2": - version: 3.5.2 - resolution: "ajv-keywords@npm:3.5.2" - peerDependencies: - ajv: ^6.9.1 - checksum: 7dc5e5931677a680589050f79dcbe1fefbb8fea38a955af03724229139175b433c63c68f7ae5f86cf8f65d55eb7c25f75a046723e2e58296707617ca690feae9 - languageName: node - linkType: hard - -"ajv-keywords@npm:^5.1.0": - version: 5.1.0 - resolution: "ajv-keywords@npm:5.1.0" - dependencies: - fast-deep-equal: ^3.1.3 - peerDependencies: - ajv: ^8.8.2 - checksum: c35193940b853119242c6757787f09ecf89a2c19bcd36d03ed1a615e710d19d450cb448bfda407b939aba54b002368c8bff30529cc50a0536a8e10bcce300421 - languageName: node - linkType: hard - -"ajv@npm:8.11.0": - version: 8.11.0 - resolution: "ajv@npm:8.11.0" - dependencies: - fast-deep-equal: ^3.1.1 - json-schema-traverse: ^1.0.0 - require-from-string: ^2.0.2 - uri-js: ^4.2.2 - checksum: 5e0ff226806763be73e93dd7805b634f6f5921e3e90ca04acdf8db81eed9d8d3f0d4c5f1213047f45ebbf8047ffe0c840fa1ef2ec42c3a644899f69aa72b5bef - languageName: node - linkType: hard - -"ajv@npm:8.12.0": - version: 8.12.0 - resolution: "ajv@npm:8.12.0" - dependencies: - fast-deep-equal: ^3.1.1 - json-schema-traverse: ^1.0.0 - require-from-string: ^2.0.2 - uri-js: ^4.2.2 - checksum: 4dc13714e316e67537c8b31bc063f99a1d9d9a497eb4bbd55191ac0dcd5e4985bbb71570352ad6f1e76684fb6d790928f96ba3b2d4fd6e10024be9612fe3f001 - languageName: node - linkType: hard - -"ajv@npm:^6.10.0, ajv@npm:^6.12.2, ajv@npm:^6.12.4, ajv@npm:^6.12.5": - version: 6.12.6 - resolution: "ajv@npm:6.12.6" - dependencies: - fast-deep-equal: ^3.1.1 - fast-json-stable-stringify: ^2.0.0 - json-schema-traverse: ^0.4.1 - uri-js: ^4.2.2 - checksum: 874972efe5c4202ab0a68379481fbd3d1b5d0a7bd6d3cc21d40d3536ebff3352a2a1fabb632d4fd2cc7fe4cbdcd5ed6782084c9bbf7f32a1536d18f9da5007d4 - languageName: node - linkType: hard - -"ajv@npm:^8.0.0, ajv@npm:^8.0.1, ajv@npm:^8.11.0, ajv@npm:^8.12.0, ajv@npm:^8.6.0, ajv@npm:^8.9.0": - version: 8.17.1 - resolution: "ajv@npm:8.17.1" - dependencies: - fast-deep-equal: ^3.1.3 - fast-uri: ^3.0.1 - json-schema-traverse: ^1.0.0 - require-from-string: ^2.0.2 - checksum: 1797bf242cfffbaf3b870d13565bd1716b73f214bb7ada9a497063aada210200da36e3ed40237285f3255acc4feeae91b1fb183625331bad27da95973f7253d9 - languageName: node - linkType: hard - -"anser@npm:^1.4.9": - version: 1.4.10 - resolution: "anser@npm:1.4.10" - checksum: 3823c64f8930d3d97f36e56cdf646fa6351f1227e25eee70c3a17697447cae4238fc3a309bb3bc2003cf930687fa72aed71426dbcf3c0a15565e120a7fee5507 - languageName: node - linkType: hard - -"ansi-align@npm:^2.0.0": - version: 2.0.0 - resolution: "ansi-align@npm:2.0.0" - dependencies: - string-width: ^2.0.0 - checksum: fecefb3b4a128aaad52ed1d2ee2f999968acc77573645be49666273ec2952840e27aed8cb9c2e48cd0c2d5a088389223eabb6d09aa74bceba3b931d242288c97 - languageName: node - linkType: hard - -"ansi-align@npm:^3.0.0, ansi-align@npm:^3.0.1": - version: 3.0.1 - resolution: "ansi-align@npm:3.0.1" - dependencies: - string-width: ^4.1.0 - checksum: 6abfa08f2141d231c257162b15292467081fa49a208593e055c866aa0455b57f3a86b5a678c190c618faa79b4c59e254493099cb700dd9cf2293c6be2c8f5d8d - languageName: node - linkType: hard - -"ansi-colors@npm:4.1.1, ansi-colors@npm:^4.1.1": - version: 4.1.1 - resolution: "ansi-colors@npm:4.1.1" - checksum: 138d04a51076cb085da0a7e2d000c5c0bb09f6e772ed5c65c53cb118d37f6c5f1637506d7155fb5f330f0abcf6f12fa2e489ac3f8cdab9da393bf1bb4f9a32b0 - languageName: node - linkType: hard - -"ansi-escapes@npm:^3.1.0": - version: 3.2.0 - resolution: "ansi-escapes@npm:3.2.0" - checksum: 0f94695b677ea742f7f1eed961f7fd8d05670f744c6ad1f8f635362f6681dcfbc1575cb05b43abc7bb6d67e25a75fb8c7ea8f2a57330eb2c76b33f18cb2cef0a - languageName: node - linkType: hard - -"ansi-escapes@npm:^4.2.1, ansi-escapes@npm:^4.3.0, ansi-escapes@npm:^4.3.1": - version: 4.3.2 - resolution: "ansi-escapes@npm:4.3.2" - dependencies: - type-fest: ^0.21.3 - checksum: 93111c42189c0a6bed9cdb4d7f2829548e943827ee8479c74d6e0b22ee127b2a21d3f8b5ca57723b8ef78ce011fbfc2784350eb2bde3ccfccf2f575fa8489815 - languageName: node - linkType: hard - -"ansi-escapes@npm:^5.0.0": - version: 5.0.0 - resolution: "ansi-escapes@npm:5.0.0" - dependencies: - type-fest: ^1.0.2 - checksum: d4b5eb8207df38367945f5dd2ef41e08c28edc192dc766ef18af6b53736682f49d8bfcfa4e4d6ecbc2e2f97c258fda084fb29a9e43b69170b71090f771afccac - languageName: node - linkType: hard - -"ansi-escapes@npm:^6.0.0": - version: 6.2.0 - resolution: "ansi-escapes@npm:6.2.0" - dependencies: - type-fest: ^3.0.0 - checksum: f0bc667d5f1ededc3ea89b73c34f0cba95473525b07e1290ddfd3fc868c94614e95f3549f5c4fd0c05424af7d3fd298101fb3d9a52a597d3782508b340783bd7 - languageName: node - linkType: hard - -"ansi-fragments@npm:^0.2.1": - version: 0.2.1 - resolution: "ansi-fragments@npm:0.2.1" - dependencies: - colorette: ^1.0.7 - slice-ansi: ^2.0.0 - strip-ansi: ^5.0.0 - checksum: 22c3eb8a0aec6bcc15f4e78d77a264ee0c92160b09c94260d1161d051eb8c77c7ecfeb3c8ec44ca180bad554fef3489528c509a644a7589635fc36bcaf08234f - languageName: node - linkType: hard - -"ansi-html-community@npm:0.0.8, ansi-html-community@npm:^0.0.8": - version: 0.0.8 - resolution: "ansi-html-community@npm:0.0.8" - bin: - ansi-html: bin/ansi-html - checksum: 04c568e8348a636963f915e48eaa3e01218322e1169acafdd79c384f22e5558c003f79bbc480c1563865497482817c7eed025f0653ebc17642fededa5cb42089 - languageName: node - linkType: hard - -"ansi-html@npm:^0.0.9": - version: 0.0.9 - resolution: "ansi-html@npm:0.0.9" - bin: - ansi-html: bin/ansi-html - checksum: a03754d6f66bae33938ed8bb3dd98174b7f4895ebe45226185036ed4a1388a7aaf2f2b9581608f0626432ba7add92cfc590aa6475a78bbb90d9d1e1d1af8cbe6 - languageName: node - linkType: hard - -"ansi-regex@npm:^2.0.0": - version: 2.1.1 - resolution: "ansi-regex@npm:2.1.1" - checksum: 190abd03e4ff86794f338a31795d262c1dfe8c91f7e01d04f13f646f1dcb16c5800818f886047876f1272f065570ab86b24b99089f8b68a0e11ff19aed4ca8f1 - languageName: node - linkType: hard - -"ansi-regex@npm:^3.0.0": - version: 3.0.1 - resolution: "ansi-regex@npm:3.0.1" - checksum: 09daf180c5f59af9850c7ac1bd7fda85ba596cc8cbeb210826e90755f06c818af86d9fa1e6e8322fab2c3b9e9b03f56c537b42241139f824dd75066a1e7257cc - languageName: node - linkType: hard - -"ansi-regex@npm:^4.1.0": - version: 4.1.1 - resolution: "ansi-regex@npm:4.1.1" - checksum: b1a6ee44cb6ecdabaa770b2ed500542714d4395d71c7e5c25baa631f680fb2ad322eb9ba697548d498a6fd366949fc8b5bfcf48d49a32803611f648005b01888 - languageName: node - linkType: hard - -"ansi-regex@npm:^5.0.0, ansi-regex@npm:^5.0.1": - version: 5.0.1 - resolution: "ansi-regex@npm:5.0.1" - checksum: 2aa4bb54caf2d622f1afdad09441695af2a83aa3fe8b8afa581d205e57ed4261c183c4d3877cee25794443fde5876417d859c108078ab788d6af7e4fe52eb66b - languageName: node - linkType: hard - -"ansi-regex@npm:^6.0.1": - version: 6.0.1 - resolution: "ansi-regex@npm:6.0.1" - checksum: 1ff8b7667cded1de4fa2c9ae283e979fc87036864317da86a2e546725f96406746411d0d85e87a2d12fa5abd715d90006de7fa4fa0477c92321ad3b4c7d4e169 - languageName: node - linkType: hard - -"ansi-styles@npm:^3.2.0, ansi-styles@npm:^3.2.1": - version: 3.2.1 - resolution: "ansi-styles@npm:3.2.1" - dependencies: - color-convert: ^1.9.0 - checksum: d85ade01c10e5dd77b6c89f34ed7531da5830d2cb5882c645f330079975b716438cd7ebb81d0d6e6b4f9c577f19ae41ab55f07f19786b02f9dfd9e0377395665 - languageName: node - linkType: hard - -"ansi-styles@npm:^4.0.0, ansi-styles@npm:^4.1.0": - version: 4.3.0 - resolution: "ansi-styles@npm:4.3.0" - dependencies: - color-convert: ^2.0.1 - checksum: 513b44c3b2105dd14cc42a19271e80f386466c4be574bccf60b627432f9198571ebf4ab1e4c3ba17347658f4ee1711c163d574248c0c1cdc2d5917a0ad582ec4 - languageName: node - linkType: hard - -"ansi-styles@npm:^5.0.0": - version: 5.2.0 - resolution: "ansi-styles@npm:5.2.0" - checksum: d7f4e97ce0623aea6bc0d90dcd28881ee04cba06c570b97fd3391bd7a268eedfd9d5e2dd4fdcbdd82b8105df5faf6f24aaedc08eaf3da898e702db5948f63469 - languageName: node - linkType: hard - -"ansi-styles@npm:^6.0.0, ansi-styles@npm:^6.1.0": - version: 6.2.1 - resolution: "ansi-styles@npm:6.2.1" - checksum: ef940f2f0ced1a6347398da88a91da7930c33ecac3c77b72c5905f8b8fe402c52e6fde304ff5347f616e27a742da3f1dc76de98f6866c69251ad0b07a66776d9 - languageName: node - linkType: hard - -"any-base@npm:^1.1.0": - version: 1.1.0 - resolution: "any-base@npm:1.1.0" - checksum: c1fd040de52e710e2de7d9ae4df52bac589f35622adb24686c98ce21c7b824859a8db9614bc119ed8614f42fd08918b2612e6a6c385480462b3100a1af59289d - languageName: node - linkType: hard - -"any-promise@npm:^1.0.0, any-promise@npm:^1.1.0": - version: 1.3.0 - resolution: "any-promise@npm:1.3.0" - checksum: 0ee8a9bdbe882c90464d75d1f55cf027f5458650c4bd1f0467e65aec38ccccda07ca5844969ee77ed46d04e7dded3eaceb027e8d32f385688523fe305fa7e1de - languageName: node - linkType: hard - -"anymatch@npm:^3.0.3, anymatch@npm:^3.1.3, anymatch@npm:~3.1.2": - version: 3.1.3 - resolution: "anymatch@npm:3.1.3" - dependencies: - normalize-path: ^3.0.0 - picomatch: ^2.0.4 - checksum: 3e044fd6d1d26545f235a9fe4d7a534e2029d8e59fa7fd9f2a6eb21230f6b5380ea1eaf55136e60cbf8e613544b3b766e7a6fa2102e2a3a117505466e3025dc2 - languageName: node - linkType: hard - -"apollo-link-rest@npm:0.9.0": - version: 0.9.0 - resolution: "apollo-link-rest@npm:0.9.0" - peerDependencies: - "@apollo/client": ">=3" - graphql: ">=0.11" - qs: ">=6" - checksum: 1aa2ca1311597a125dfd0ae08a8edce95e32b7e6f661a5bd980305e7c9fa0bf8d833d510407a7c93fc45a5ed85cb649d42918a4149c160d184348e43d7475abe - languageName: node - linkType: hard - -"apollo3-cache-persist@npm:0.14.1": - version: 0.14.1 - resolution: "apollo3-cache-persist@npm:0.14.1" - peerDependencies: - "@apollo/client": ^3.2.5 - checksum: 9f286707c9ecc628c0a44117e5ed67ccdb2a5befe28029aba69724595c2ddacfe47c43271d7607a4046cb5167f25da5f81c27579413c95254dfdb91039e9fc1c - languageName: node - linkType: hard - -"app-module-path@npm:^2.2.0": - version: 2.2.0 - resolution: "app-module-path@npm:2.2.0" - checksum: b52aa49cfa809efbad41b514222e8ef3f8ee9e147f5eccf79280b45eddcc61f7aeb302b0049474e3f42072dd53a28348c57dd96f36cd461d2e31cc8ab1ef56b5 - languageName: node - linkType: hard - -"appdirsjs@npm:^1.2.4": - version: 1.2.7 - resolution: "appdirsjs@npm:1.2.7" - checksum: 3411b4e31edf8687ad69638ef81b92b4889ad31e527b673a364990c28c99b6b8c3ea81b2b2b636d5b08e166a18706c4464fd8436b298f85384d499ba6b8dc4b7 - languageName: node - linkType: hard - -"append-buffer@npm:^1.0.2": - version: 1.0.2 - resolution: "append-buffer@npm:1.0.2" - dependencies: - buffer-equal: ^1.0.0 - checksum: e809940b5137c0bfa6f6d4aefcae45b5a15a28938749c0ef50eb39e4d877978fcabf08ceba10d6f214fc15f021681f308fe24865d6557126e2923c58e9c3a134 - languageName: node - linkType: hard - -"application-config-path@npm:^0.1.0": - version: 0.1.1 - resolution: "application-config-path@npm:0.1.1" - checksum: e478c1e4d515108de89693165d92dab11cfdc69dd0f3ccde034f14a3f4e50007946de9e4dd51cd77d2f7ba9752e75d8e4d937ef053a53e466425d9751c961a37 - languageName: node - linkType: hard - -"aproba@npm:^1.0.3": - version: 1.2.0 - resolution: "aproba@npm:1.2.0" - checksum: 0fca141966559d195072ed047658b6e6c4fe92428c385dd38e288eacfc55807e7b4989322f030faff32c0f46bb0bc10f1e0ac32ec22d25315a1e5bbc0ebb76dc - languageName: node - linkType: hard - -"aproba@npm:^1.0.3 || ^2.0.0": - version: 2.0.0 - resolution: "aproba@npm:2.0.0" - checksum: 5615cadcfb45289eea63f8afd064ab656006361020e1735112e346593856f87435e02d8dcc7ff0d11928bc7d425f27bc7c2a84f6c0b35ab0ff659c814c138a24 - languageName: node - linkType: hard - -"arch@npm:^2.2.0": - version: 2.2.0 - resolution: "arch@npm:2.2.0" - checksum: e21b7635029fe8e9cdd5a026f9a6c659103e63fff423834323cdf836a1bb240a72d0c39ca8c470f84643385cf581bd8eda2cad8bf493e27e54bd9783abe9101f - languageName: node - linkType: hard - -"are-we-there-yet@npm:^3.0.0": - version: 3.0.1 - resolution: "are-we-there-yet@npm:3.0.1" - dependencies: - delegates: ^1.0.0 - readable-stream: ^3.6.0 - checksum: 52590c24860fa7173bedeb69a4c05fb573473e860197f618b9a28432ee4379049336727ae3a1f9c4cb083114601c1140cee578376164d0e651217a9843f9fe83 - languageName: node - linkType: hard - -"are-we-there-yet@npm:~1.1.2": - version: 1.1.7 - resolution: "are-we-there-yet@npm:1.1.7" - dependencies: - delegates: ^1.0.0 - readable-stream: ^2.0.6 - checksum: 70d251719c969b2745bfe5ddf3ebaefa846a636e90a6d5212573676af5d6670e15457761d4725731e19cbebdce42c4ab0cbedf23ab047f2a08274985aa10a3c7 - languageName: node - linkType: hard - -"arg@npm:5.0.2, arg@npm:^5.0.2": - version: 5.0.2 - resolution: "arg@npm:5.0.2" - checksum: 6c69ada1a9943d332d9e5382393e897c500908d91d5cb735a01120d5f71daf1b339b7b8980cbeaba8fd1afc68e658a739746179e4315a26e8a28951ff9930078 - languageName: node - linkType: hard - -"arg@npm:^4.1.0": - version: 4.1.3 - resolution: "arg@npm:4.1.3" - checksum: 544af8dd3f60546d3e4aff084d451b96961d2267d668670199692f8d054f0415d86fc5497d0e641e91546f0aa920e7c29e5250e99fc89f5552a34b5d93b77f43 - languageName: node - linkType: hard - -"argparse@npm:^1.0.7": - version: 1.0.10 - resolution: "argparse@npm:1.0.10" - dependencies: - sprintf-js: ~1.0.2 - checksum: 7ca6e45583a28de7258e39e13d81e925cfa25d7d4aacbf806a382d3c02fcb13403a07fb8aeef949f10a7cfe4a62da0e2e807b348a5980554cc28ee573ef95945 - languageName: node - linkType: hard - -"argparse@npm:^2.0.1": - version: 2.0.1 - resolution: "argparse@npm:2.0.1" - checksum: 83644b56493e89a254bae05702abf3a1101b4fa4d0ca31df1c9985275a5a5bd47b3c27b7fa0b71098d41114d8ca000e6ed90cad764b306f8a503665e4d517ced - languageName: node - linkType: hard - -"aria-hidden@npm:^1.1.3": - version: 1.2.3 - resolution: "aria-hidden@npm:1.2.3" - dependencies: - tslib: ^2.0.0 - checksum: 7d7d211629eef315e94ed3b064c6823d13617e609d3f9afab1c2ed86399bb8e90405f9bdd358a85506802766f3ecb468af985c67c846045a34b973bcc0289db9 - languageName: node - linkType: hard - -"aria-query@npm:5.3.0": - version: 5.3.0 - resolution: "aria-query@npm:5.3.0" - dependencies: - dequal: ^2.0.3 - checksum: 305bd73c76756117b59aba121d08f413c7ff5e80fa1b98e217a3443fcddb9a232ee790e24e432b59ae7625aebcf4c47cb01c2cac872994f0b426f5bdfcd96ba9 - languageName: node - linkType: hard - -"aria-query@npm:^4.2.2": - version: 4.2.2 - resolution: "aria-query@npm:4.2.2" - dependencies: - "@babel/runtime": ^7.10.2 - "@babel/runtime-corejs3": ^7.10.2 - checksum: 38401a9a400f26f3dcc24b84997461a16b32869a9893d323602bed8da40a8bcc0243b8d2880e942249a1496cea7a7de769e93d21c0baa439f01e1ee936fed665 - languageName: node - linkType: hard - -"aria-query@npm:^5.0.0, aria-query@npm:^5.3.2": - version: 5.3.2 - resolution: "aria-query@npm:5.3.2" - checksum: d971175c85c10df0f6d14adfe6f1292409196114ab3c62f238e208b53103686f46cc70695a4f775b73bc65f6a09b6a092fd963c4f3a5a7d690c8fc5094925717 - languageName: node - linkType: hard - -"array-back@npm:^1.0.3, array-back@npm:^1.0.4": - version: 1.0.4 - resolution: "array-back@npm:1.0.4" - dependencies: - typical: ^2.6.0 - checksum: 37a8be4cd4920b3d07bdbef40dae83bb37948f5d49601da98a6e48ba5496e9a0008e7f3f2184bcf4d3501bd371a048c9bdca7dc3cc5c3d5b1eb189bbba7b55db - languageName: node - linkType: hard - -"array-back@npm:^2.0.0": - version: 2.0.0 - resolution: "array-back@npm:2.0.0" - dependencies: - typical: ^2.6.1 - checksum: ab36ab3504b25116b47541fb0ac78ff13d1e991f33d98c361edd3aada3ed818a900b619bd67b195dd4e41b9256c27e8cdd6a69ece507e482f1207d07670ed6bd - languageName: node - linkType: hard - -"array-buffer-byte-length@npm:^1.0.1": - version: 1.0.1 - resolution: "array-buffer-byte-length@npm:1.0.1" - dependencies: - call-bind: ^1.0.5 - is-array-buffer: ^3.0.4 - checksum: 53524e08f40867f6a9f35318fafe467c32e45e9c682ba67b11943e167344d2febc0f6977a17e699b05699e805c3e8f073d876f8bbf1b559ed494ad2cd0fae09e - languageName: node - linkType: hard - -"array-differ@npm:^3.0.0": - version: 3.0.0 - resolution: "array-differ@npm:3.0.0" - checksum: 117edd9df5c1530bd116c6e8eea891d4bd02850fd89b1b36e532b6540e47ca620a373b81feca1c62d1395d9ae601516ba538abe5e8172d41091da2c546b05fb7 - languageName: node - linkType: hard - -"array-flatten@npm:1.1.1": - version: 1.1.1 - resolution: "array-flatten@npm:1.1.1" - checksum: a9925bf3512d9dce202112965de90c222cd59a4fbfce68a0951d25d965cf44642931f40aac72309c41f12df19afa010ecadceb07cfff9ccc1621e99d89ab5f3b - languageName: node - linkType: hard - -"array-flatten@npm:^2.1.2": - version: 2.1.2 - resolution: "array-flatten@npm:2.1.2" - checksum: e8988aac1fbfcdaae343d08c9a06a6fddd2c6141721eeeea45c3cf523bf4431d29a46602929455ed548c7a3e0769928cdc630405427297e7081bd118fdec9262 - languageName: node - linkType: hard - -"array-ify@npm:^1.0.0": - version: 1.0.0 - resolution: "array-ify@npm:1.0.0" - checksum: c0502015b319c93dd4484f18036bcc4b654eb76a4aa1f04afbcef11ac918859bb1f5d71ba1f0f1141770db9eef1a4f40f1761753650873068010bbf7bcdae4a4 - languageName: node - linkType: hard - -"array-includes@npm:^3.1.6, array-includes@npm:^3.1.7, array-includes@npm:^3.1.8": - version: 3.1.8 - resolution: "array-includes@npm:3.1.8" - dependencies: - call-bind: ^1.0.7 - define-properties: ^1.2.1 - es-abstract: ^1.23.2 - es-object-atoms: ^1.0.0 - get-intrinsic: ^1.2.4 - is-string: ^1.0.7 - checksum: eb39ba5530f64e4d8acab39297c11c1c5be2a4ea188ab2b34aba5fb7224d918f77717a9d57a3e2900caaa8440e59431bdaf5c974d5212ef65d97f132e38e2d91 - languageName: node - linkType: hard - -"array-union@npm:^1.0.1": - version: 1.0.2 - resolution: "array-union@npm:1.0.2" - dependencies: - array-uniq: ^1.0.1 - checksum: 82cec6421b6e6766556c484835a6d476a873f1b71cace5ab2b4f1b15b1e3162dc4da0d16f7a2b04d4aec18146c6638fe8f661340b31ba8e469fd811a1b45dc8d - languageName: node - linkType: hard - -"array-union@npm:^2.1.0": - version: 2.1.0 - resolution: "array-union@npm:2.1.0" - checksum: 5bee12395cba82da674931df6d0fea23c4aa4660cb3b338ced9f828782a65caa232573e6bf3968f23e0c5eb301764a382cef2f128b170a9dc59de0e36c39f98d - languageName: node - linkType: hard - -"array-uniq@npm:^1.0.1": - version: 1.0.3 - resolution: "array-uniq@npm:1.0.3" - checksum: 1625f06b093d8bf279b81adfec6e72951c0857d65b5e3f65f053fffe9f9dd61c2fc52cff57e38a4700817e7e3f01a4faa433d505ea9e33cdae4514c334e0bf9e - languageName: node - linkType: hard - -"array.prototype.findlast@npm:^1.2.4, array.prototype.findlast@npm:^1.2.5": - version: 1.2.5 - resolution: "array.prototype.findlast@npm:1.2.5" - dependencies: - call-bind: ^1.0.7 - define-properties: ^1.2.1 - es-abstract: ^1.23.2 - es-errors: ^1.3.0 - es-object-atoms: ^1.0.0 - es-shim-unscopables: ^1.0.2 - checksum: 83ce4ad95bae07f136d316f5a7c3a5b911ac3296c3476abe60225bc4a17938bf37541972fcc37dd5adbc99cbb9c928c70bbbfc1c1ce549d41a415144030bb446 - languageName: node - linkType: hard - -"array.prototype.flat@npm:1.3.2, array.prototype.flat@npm:^1.3.1": - version: 1.3.2 - resolution: "array.prototype.flat@npm:1.3.2" - dependencies: - call-bind: ^1.0.2 - define-properties: ^1.2.0 - es-abstract: ^1.22.1 - es-shim-unscopables: ^1.0.0 - checksum: 5d6b4bf102065fb3f43764bfff6feb3295d372ce89591e6005df3d0ce388527a9f03c909af6f2a973969a4d178ab232ffc9236654149173e0e187ec3a1a6b87b - languageName: node - linkType: hard - -"array.prototype.flatmap@npm:1.3.2, array.prototype.flatmap@npm:^1.3.1, array.prototype.flatmap@npm:^1.3.2": - version: 1.3.2 - resolution: "array.prototype.flatmap@npm:1.3.2" - dependencies: - call-bind: ^1.0.2 - define-properties: ^1.2.0 - es-abstract: ^1.22.1 - es-shim-unscopables: ^1.0.0 - checksum: ce09fe21dc0bcd4f30271f8144083aa8c13d4639074d6c8dc82054b847c7fc9a0c97f857491f4da19d4003e507172a78f4bcd12903098adac8b9cd374f734be3 - languageName: node - linkType: hard - -"array.prototype.reduce@npm:^1.0.6": - version: 1.0.7 - resolution: "array.prototype.reduce@npm:1.0.7" - dependencies: - call-bind: ^1.0.7 - define-properties: ^1.2.1 - es-abstract: ^1.23.2 - es-array-method-boxes-properly: ^1.0.0 - es-errors: ^1.3.0 - es-object-atoms: ^1.0.0 - is-string: ^1.0.7 - checksum: 90303617bd70c8e9a81ebff041d3e10fad1a97f163699cb015b7c84a3f9e6960d9bb161a30f1d0309d6e476f166af5668c1e24f7add3202213d25f7c7f15475d - languageName: node - linkType: hard - -"array.prototype.toreversed@npm:^1.1.2": - version: 1.1.2 - resolution: "array.prototype.toreversed@npm:1.1.2" - dependencies: - call-bind: ^1.0.2 - define-properties: ^1.2.0 - es-abstract: ^1.22.1 - es-shim-unscopables: ^1.0.0 - checksum: 58598193426282155297bedf950dc8d464624a0d81659822fb73124286688644cb7e0e4927a07f3ab2daaeb6617b647736cc3a5e6ca7ade5bb8e573b284e6240 - languageName: node - linkType: hard - -"array.prototype.tosorted@npm:^1.1.3, array.prototype.tosorted@npm:^1.1.4": - version: 1.1.4 - resolution: "array.prototype.tosorted@npm:1.1.4" - dependencies: - call-bind: ^1.0.7 - define-properties: ^1.2.1 - es-abstract: ^1.23.3 - es-errors: ^1.3.0 - es-shim-unscopables: ^1.0.2 - checksum: e4142d6f556bcbb4f393c02e7dbaea9af8f620c040450c2be137c9cbbd1a17f216b9c688c5f2c08fbb038ab83f55993fa6efdd9a05881d84693c7bcb5422127a - languageName: node - linkType: hard - -"arraybuffer.prototype.slice@npm:^1.0.3": - version: 1.0.3 - resolution: "arraybuffer.prototype.slice@npm:1.0.3" - dependencies: - array-buffer-byte-length: ^1.0.1 - call-bind: ^1.0.5 - define-properties: ^1.2.1 - es-abstract: ^1.22.3 - es-errors: ^1.2.1 - get-intrinsic: ^1.2.3 - is-array-buffer: ^3.0.4 - is-shared-array-buffer: ^1.0.2 - checksum: 352259cba534dcdd969c92ab002efd2ba5025b2e3b9bead3973150edbdf0696c629d7f4b3f061c5931511e8207bdc2306da614703c820b45dabce39e3daf7e3e - languageName: node - linkType: hard - -"arrify@npm:^1.0.1": - version: 1.0.1 - resolution: "arrify@npm:1.0.1" - checksum: 745075dd4a4624ff0225c331dacb99be501a515d39bcb7c84d24660314a6ec28e68131b137e6f7e16318170842ce97538cd298fc4cd6b2cc798e0b957f2747e7 - languageName: node - linkType: hard - -"arrify@npm:^2.0.0, arrify@npm:^2.0.1": - version: 2.0.1 - resolution: "arrify@npm:2.0.1" - checksum: 067c4c1afd182806a82e4c1cb8acee16ab8b5284fbca1ce29408e6e91281c36bb5b612f6ddfbd40a0f7a7e0c75bf2696eb94c027f6e328d6e9c52465c98e4209 - languageName: node - linkType: hard - -"as-table@npm:^1.0.36": - version: 1.0.55 - resolution: "as-table@npm:1.0.55" - dependencies: - printable-characters: ^1.0.42 - checksum: 341c99d9e99a702c315b3f0744d49b4764b26ef7ddd32bafb9e1706626560c0e599100521fc1b17f640e804bd0503ce70b2ba519c023da6edf06bdd9086dccd9 - languageName: node - linkType: hard - -"asap@npm:~2.0.3, asap@npm:~2.0.6": - version: 2.0.6 - resolution: "asap@npm:2.0.6" - checksum: b296c92c4b969e973260e47523207cd5769abd27c245a68c26dc7a0fe8053c55bb04360237cb51cab1df52be939da77150ace99ad331fb7fb13b3423ed73ff3d - languageName: node - linkType: hard - -"asn1.js@npm:^5.2.0": - version: 5.4.1 - resolution: "asn1.js@npm:5.4.1" - dependencies: - bn.js: ^4.0.0 - inherits: ^2.0.1 - minimalistic-assert: ^1.0.0 - safer-buffer: ^2.1.0 - checksum: 3786a101ac6f304bd4e9a7df79549a7561950a13d4bcaec0c7790d44c80d147c1a94ba3d4e663673406064642a40b23fcd6c82a9952468e386c1a1376d747f9a - languageName: node - linkType: hard - -"asn1@npm:^0.2.6, asn1@npm:~0.2.0, asn1@npm:~0.2.3": - version: 0.2.6 - resolution: "asn1@npm:0.2.6" - dependencies: - safer-buffer: ~2.1.0 - checksum: 39f2ae343b03c15ad4f238ba561e626602a3de8d94ae536c46a4a93e69578826305366dc09fbb9b56aec39b4982a463682f259c38e59f6fa380cd72cd61e493d - languageName: node - linkType: hard - -"asn1js@npm:^3.0.1, asn1js@npm:^3.0.5": - version: 3.0.5 - resolution: "asn1js@npm:3.0.5" - dependencies: - pvtsutils: ^1.3.2 - pvutils: ^1.1.3 - tslib: ^2.4.0 - checksum: 3b6af1bbadd5762ef8ead5daf2f6bda1bc9e23bc825c4dcc996aa1f9521ad7390a64028565d95d98090d69c8431f004c71cccb866004759169d7c203cf9075eb - languageName: node - linkType: hard - -"assert-plus@npm:1.0.0, assert-plus@npm:^1.0.0": - version: 1.0.0 - resolution: "assert-plus@npm:1.0.0" - checksum: 19b4340cb8f0e6a981c07225eacac0e9d52c2644c080198765d63398f0075f83bbc0c8e95474d54224e297555ad0d631c1dcd058adb1ddc2437b41a6b424ac64 - languageName: node - linkType: hard - -"assert@npm:^2.0.0": - version: 2.0.0 - resolution: "assert@npm:2.0.0" - dependencies: - es6-object-assign: ^1.1.0 - is-nan: ^1.2.1 - object-is: ^1.0.1 - util: ^0.12.0 - checksum: bb91f181a86d10588ee16c5e09c280f9811373974c29974cbe401987ea34e966699d7989a812b0e19377b511ea0bc627f5905647ce569311824848ede382cae8 - languageName: node - linkType: hard - -"assertion-error@npm:^2.0.1": - version: 2.0.1 - resolution: "assertion-error@npm:2.0.1" - checksum: a0789dd882211b87116e81e2648ccb7f60340b34f19877dd020b39ebb4714e475eb943e14ba3e22201c221ef6645b7bfe10297e76b6ac95b48a9898c1211ce66 - languageName: node - linkType: hard - -"ast-module-types@npm:^2.7.1": - version: 2.7.1 - resolution: "ast-module-types@npm:2.7.1" - checksum: 6238647bcf34eeff2a1390cb60388da8a5064dd598acf48d68f8d972d9a332dc8d0382a5a7c511b16470e314b313bcbb95de4b0b669515393e043282c0489538 - languageName: node - linkType: hard - -"ast-module-types@npm:^3.0.0": - version: 3.0.0 - resolution: "ast-module-types@npm:3.0.0" - checksum: c6ef35d9b286f84c7942aeb0e2b50e389e0b6f44ee3b6d2c46aeed4852dbca0681dde8c3c0ec1d456dad5dbc84fced2e1c607b10b4b4c3b065b901b40f45bbe7 - languageName: node - linkType: hard - -"ast-module-types@npm:^4.0.0": - version: 4.0.0 - resolution: "ast-module-types@npm:4.0.0" - checksum: 12705ff906e57d1440a2ff82f30cf5b3c93e1734076ea5868936477d5812a6fc257eb1e44fb2b7f8c22f7483987251d72251d2a295542f64df8768434f3f06db - languageName: node - linkType: hard - -"ast-types-flow@npm:^0.0.8": - version: 0.0.8 - resolution: "ast-types-flow@npm:0.0.8" - checksum: 0a64706609a179233aac23817837abab614f3548c252a2d3d79ea1e10c74aa28a0846e11f466cf72771b6ed8713abc094dcf8c40c3ec4207da163efa525a94a8 - languageName: node - linkType: hard - -"ast-types@npm:0.15.2": - version: 0.15.2 - resolution: "ast-types@npm:0.15.2" - dependencies: - tslib: ^2.0.1 - checksum: 24f0d86bf9e4c8dae16fa24b13c1776f2c2677040bcfbd4eb4f27911db49020be4876885e45e6cfcc548ed4dfea3a0742d77e3346b84fae47379cb0b89e9daa0 - languageName: node - linkType: hard - -"ast-types@npm:^0.13.4": - version: 0.13.4 - resolution: "ast-types@npm:0.13.4" - dependencies: - tslib: ^2.0.1 - checksum: 5a51f7b70588ecced3601845a0e203279ca2f5fdc184416a0a1640c93ec0a267241d6090a328e78eebb8de81f8754754e0a4f1558ba2a3d638f8ccbd0b1f0eff - languageName: node - linkType: hard - -"ast-types@npm:^0.16.1": - version: 0.16.1 - resolution: "ast-types@npm:0.16.1" - dependencies: - tslib: ^2.0.1 - checksum: 21c186da9fdb1d8087b1b7dabbc4059f91aa5a1e593a9776b4393cc1eaa857e741b2dda678d20e34b16727b78fef3ab59cf8f0c75ed1ba649c78fe194e5c114b - languageName: node - linkType: hard - -"astral-regex@npm:^1.0.0": - version: 1.0.0 - resolution: "astral-regex@npm:1.0.0" - checksum: 93417fc0879531cd95ace2560a54df865c9461a3ac0714c60cbbaa5f1f85d2bee85489e78d82f70b911b71ac25c5f05fc5a36017f44c9bb33c701bee229ff848 - languageName: node - linkType: hard - -"astral-regex@npm:^2.0.0": - version: 2.0.0 - resolution: "astral-regex@npm:2.0.0" - checksum: 876231688c66400473ba505731df37ea436e574dd524520294cc3bbc54ea40334865e01fa0d074d74d036ee874ee7e62f486ea38bc421ee8e6a871c06f011766 - languageName: node - linkType: hard - -"async-limiter@npm:~1.0.0": - version: 1.0.1 - resolution: "async-limiter@npm:1.0.1" - checksum: 2b849695b465d93ad44c116220dee29a5aeb63adac16c1088983c339b0de57d76e82533e8e364a93a9f997f28bbfc6a92948cefc120652bd07f3b59f8d75cf2b - languageName: node - linkType: hard - -"async-mutex@npm:^0.2.6": - version: 0.2.6 - resolution: "async-mutex@npm:0.2.6" - dependencies: - tslib: ^2.0.0 - checksum: f50102e0c57f6a958528cff7dff13da070897f17107b42274417a7248905b927b6e51c3387f8aed1f5cd6005b0e692d64a83a0789be602e4e7e7da4afe08b889 - languageName: node - linkType: hard - -"async-retry@npm:1.2.3": - version: 1.2.3 - resolution: "async-retry@npm:1.2.3" - dependencies: - retry: 0.12.0 - checksum: 9132060566def3a7f4b356b051f0a923dc15036178a568aaf5ed06274c10d2eacd69f816b11fc6112d1628279f61d4afbe0ebcb32b33ecdd87bdcfc17bae3cf2 - languageName: node - linkType: hard - -"async-retry@npm:1.3.1": - version: 1.3.1 - resolution: "async-retry@npm:1.3.1" - dependencies: - retry: 0.12.0 - checksum: 42b518505c0cf56179d49d0cc373e50656a1edf913842c045e84a9f7191ade10b73edf583915b05617296ed3d8c2f1f151e47fcb10eb47681a935db3b407787f - languageName: node - linkType: hard - -"async@npm:^3.2.0, async@npm:^3.2.3": - version: 3.2.5 - resolution: "async@npm:3.2.5" - checksum: 5ec77f1312301dee02d62140a6b1f7ee0edd2a0f983b6fd2b0849b969f245225b990b47b8243e7b9ad16451a53e7f68e753700385b706198ced888beedba3af4 - languageName: node - linkType: hard - -"asynckit@npm:^0.4.0": - version: 0.4.0 - resolution: "asynckit@npm:0.4.0" - checksum: 7b78c451df768adba04e2d02e63e2d0bf3b07adcd6e42b4cf665cb7ce899bedd344c69a1dcbce355b5f972d597b25aaa1c1742b52cffd9caccb22f348114f6be - languageName: node - linkType: hard - -"at-least-node@npm:^1.0.0": - version: 1.0.0 - resolution: "at-least-node@npm:1.0.0" - checksum: 463e2f8e43384f1afb54bc68485c436d7622acec08b6fad269b421cb1d29cebb5af751426793d0961ed243146fe4dc983402f6d5a51b720b277818dbf6f2e49e - languageName: node - linkType: hard - -"atomic-sleep@npm:^1.0.0": - version: 1.0.0 - resolution: "atomic-sleep@npm:1.0.0" - checksum: b95275afb2f80732f22f43a60178430c468906a415a7ff18bcd0feeebc8eec3930b51250aeda91a476062a90e07132b43a1794e8d8ffcf9b650e8139be75fa36 - languageName: node - linkType: hard - -"auto-bind@npm:~4.0.0": - version: 4.0.0 - resolution: "auto-bind@npm:4.0.0" - checksum: 00cad71cce5742faccb7dd65c1b55ebc4f45add4b0c9a1547b10b05bab22813230133b0c892c67ba3eb969a4524710c5e43cc45c72898ec84e56f3a596e7a04f - languageName: node - linkType: hard - -"autoprefixer@npm:^10.4.12, autoprefixer@npm:^10.4.13": - version: 10.4.20 - resolution: "autoprefixer@npm:10.4.20" - dependencies: - browserslist: ^4.23.3 - caniuse-lite: ^1.0.30001646 - fraction.js: ^4.3.7 - normalize-range: ^0.1.2 - picocolors: ^1.0.1 - postcss-value-parser: ^4.2.0 - peerDependencies: - postcss: ^8.1.0 - bin: - autoprefixer: bin/autoprefixer - checksum: 187cec2ec356631932b212f76dc64f4419c117fdb2fb9eeeb40867d38ba5ca5ba734e6ceefc9e3af4eec8258e60accdf5cbf2b7708798598fde35cdc3de562d6 - languageName: node - linkType: hard - -"available-typed-arrays@npm:^1.0.7": - version: 1.0.7 - resolution: "available-typed-arrays@npm:1.0.7" - dependencies: - possible-typed-array-names: ^1.0.0 - checksum: 1aa3ffbfe6578276996de660848b6e95669d9a95ad149e3dd0c0cda77db6ee1dbd9d1dd723b65b6d277b882dd0c4b91a654ae9d3cf9e1254b7e93e4908d78fd3 - languageName: node - linkType: hard - -"aws-appsync-auth-link@npm:3.0.7, aws-appsync-auth-link@npm:^3.0.7": - version: 3.0.7 - resolution: "aws-appsync-auth-link@npm:3.0.7" - dependencies: - "@aws-crypto/sha256-js": ^1.2.0 - "@aws-sdk/types": ^3.25.0 - "@aws-sdk/util-hex-encoding": ^3.29.0 - debug: 2.6.9 - peerDependencies: - "@apollo/client": 3.x - checksum: 0626782710ac9968da8b8c8112fcc2d6a9ffbb5a6e51779bf2a7bad9f7e1ff2561524493fa6fff78c85fce7f066f77873159002b6f47d1d25b24027e17060602 - languageName: node - linkType: hard - -"aws-appsync-subscription-link@npm:3.1.3": - version: 3.1.3 - resolution: "aws-appsync-subscription-link@npm:3.1.3" - dependencies: - aws-appsync-auth-link: ^3.0.7 - debug: 2.6.9 - url: ^0.11.0 - zen-observable-ts: ^1.2.5 - peerDependencies: - "@apollo/client": 3.x - checksum: 8df2080dc0efbf5c3f3c65b4cd32fda7b9875f45803c127f3dcee4fbad06d9a73baa9968dfefdf375d633617fc59063e9f08ca5608fdae43dbe0af98c1b1076a - languageName: node - linkType: hard - -"aws-sign2@npm:~0.7.0": - version: 0.7.0 - resolution: "aws-sign2@npm:0.7.0" - checksum: b148b0bb0778098ad8cf7e5fc619768bcb51236707ca1d3e5b49e41b171166d8be9fdc2ea2ae43d7decf02989d0aaa3a9c4caa6f320af95d684de9b548a71525 - languageName: node - linkType: hard - -"aws4@npm:^1.8.0": - version: 1.12.0 - resolution: "aws4@npm:1.12.0" - checksum: 68f79708ac7c335992730bf638286a3ee0a645cf12575d557860100767c500c08b30e24726b9f03265d74116417f628af78509e1333575e9f8d52a80edfe8cbc - languageName: node - linkType: hard - -"axe-core@npm:^4.10.0": - version: 4.10.2 - resolution: "axe-core@npm:4.10.2" - checksum: 2b9b1c93ea73ea9f206604e4e17bd771d2d835f077bde54517d73028b8865c69b209460e73d5b109968cbdb39ab3d28943efa5695189bd79e16421ce1706719e - languageName: node - linkType: hard - -"axios@npm:1.6.5": - version: 1.6.5 - resolution: "axios@npm:1.6.5" - dependencies: - follow-redirects: ^1.15.4 - form-data: ^4.0.0 - proxy-from-env: ^1.1.0 - checksum: e28d67b2d9134cb4608c44d8068b0678cfdccc652742e619006f27264a30c7aba13b2cd19c6f1f52ae195b5232734925928fb192d5c85feea7edd2f273df206d - languageName: node - linkType: hard - -"axios@npm:^0.27.2": - version: 0.27.2 - resolution: "axios@npm:0.27.2" - dependencies: - follow-redirects: ^1.14.9 - form-data: ^4.0.0 - checksum: 38cb7540465fe8c4102850c4368053c21683af85c5fdf0ea619f9628abbcb59415d1e22ebc8a6390d2bbc9b58a9806c874f139767389c862ec9b772235f06854 - languageName: node - linkType: hard - -"axios@npm:^1.6.8, axios@npm:^1.7.8": - version: 1.7.9 - resolution: "axios@npm:1.7.9" - dependencies: - follow-redirects: ^1.15.6 - form-data: ^4.0.0 - proxy-from-env: ^1.1.0 - checksum: cb8ce291818effda09240cb60f114d5625909b345e10f389a945320e06acf0bc949d0f8422d25720f5dd421362abee302c99f5e97edec4c156c8939814b23d19 - languageName: node - linkType: hard - -"axobject-query@npm:^4.1.0": - version: 4.1.0 - resolution: "axobject-query@npm:4.1.0" - checksum: 7d1e87bf0aa7ae7a76cd39ab627b7c48fda3dc40181303d9adce4ba1d5b5ce73b5e5403ee6626ec8e91090448c887294d6144e24b6741a976f5be9347e3ae1df - languageName: node - linkType: hard - -"b4a@npm:^1.6.4": - version: 1.6.7 - resolution: "b4a@npm:1.6.7" - checksum: afe4e239b49c0ef62236fe0d788ac9bd9d7eac7e9855b0d1835593cd0efcc7be394f9cc28a747a2ed2cdcb0a48c3528a551a196f472eb625457c711169c9efa2 - languageName: node - linkType: hard - -"babel-core@npm:^7.0.0-bridge.0": - version: 7.0.0-bridge.0 - resolution: "babel-core@npm:7.0.0-bridge.0" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 2a1cb879019dffb08d17bec36e13c3a6d74c94773f41c1fd8b14de13f149cc34b705b0a1e07b42fcf35917b49d78db6ff0c5c3b00b202a5235013d517b5c6bbb - languageName: node - linkType: hard - -"babel-jest@npm:29.7.0, babel-jest@npm:^29.2.1, babel-jest@npm:^29.7.0": - version: 29.7.0 - resolution: "babel-jest@npm:29.7.0" - dependencies: - "@jest/transform": ^29.7.0 - "@types/babel__core": ^7.1.14 - babel-plugin-istanbul: ^6.1.1 - babel-preset-jest: ^29.6.3 - chalk: ^4.0.0 - graceful-fs: ^4.2.9 - slash: ^3.0.0 - peerDependencies: - "@babel/core": ^7.8.0 - checksum: ee6f8e0495afee07cac5e4ee167be705c711a8cc8a737e05a587a131fdae2b3c8f9aa55dfd4d9c03009ac2d27f2de63d8ba96d3e8460da4d00e8af19ef9a83f7 - languageName: node - linkType: hard - -"babel-jest@npm:^27.4.2": - version: 27.5.1 - resolution: "babel-jest@npm:27.5.1" - dependencies: - "@jest/transform": ^27.5.1 - "@jest/types": ^27.5.1 - "@types/babel__core": ^7.1.14 - babel-plugin-istanbul: ^6.1.1 - babel-preset-jest: ^27.5.1 - chalk: ^4.0.0 - graceful-fs: ^4.2.9 - slash: ^3.0.0 - peerDependencies: - "@babel/core": ^7.8.0 - checksum: 4e93e6e9fb996cc5f1505e924eb8e8cc7b25c294ba9629762a2715390f48af6a4c14dbb84cd9730013ac0e03267a5a9aa2fb6318c544489cda7f50f4e506def4 - languageName: node - linkType: hard - -"babel-literal-to-ast@npm:^2.1.0": - version: 2.1.0 - resolution: "babel-literal-to-ast@npm:2.1.0" - dependencies: - "@babel/parser": ^7.1.6 - "@babel/traverse": ^7.1.6 - "@babel/types": ^7.1.6 - peerDependencies: - "@babel/core": ^7.1.2 - checksum: 19eccc9744dccf06e3a34314413cbf1ab4b2e79fbfbd25a13ff3f105dc66a350db5f91c966e88efa6728cb9570e76503c9c2940334a9e426df634da0635b13cd - languageName: node - linkType: hard - -"babel-loader@npm:8.2.3": - version: 8.2.3 - resolution: "babel-loader@npm:8.2.3" - dependencies: - find-cache-dir: ^3.3.1 - loader-utils: ^1.4.0 - make-dir: ^3.1.0 - schema-utils: ^2.6.5 - peerDependencies: - "@babel/core": ^7.0.0 - webpack: ">=2" - checksum: 78e1e1a91954d644b6ce66366834d4d245febbc0fde33e4e2831725e83d6e760d12b3a78e9534ce92af69067bef1d9d9674df36d8c1f20ee127bc2354b2203ba - languageName: node - linkType: hard - -"babel-loader@npm:^8.2.3": - version: 8.4.1 - resolution: "babel-loader@npm:8.4.1" - dependencies: - find-cache-dir: ^3.3.1 - loader-utils: ^2.0.4 - make-dir: ^3.1.0 - schema-utils: ^2.6.5 - peerDependencies: - "@babel/core": ^7.0.0 - webpack: ">=2" - checksum: fa02db1a7d3ebb7b4aab83e926fb51e627a00427943c9dd1b3302c8099c67fa6a242a2adeed37d95abcd39ba619edf558a1dec369ce0849c5a87dc290c90fe2f - languageName: node - linkType: hard - -"babel-plugin-emotion@npm:^10.0.27": - version: 10.2.2 - resolution: "babel-plugin-emotion@npm:10.2.2" - dependencies: - "@babel/helper-module-imports": ^7.0.0 - "@emotion/hash": 0.8.0 - "@emotion/memoize": 0.7.4 - "@emotion/serialize": ^0.11.16 - babel-plugin-macros: ^2.0.0 - babel-plugin-syntax-jsx: ^6.18.0 - convert-source-map: ^1.5.0 - escape-string-regexp: ^1.0.5 - find-root: ^1.1.0 - source-map: ^0.5.7 - checksum: 763f38c67ffbe7d091691d68c74686ba478296cc24716699fb5b0feddce1b1b47878a20b0bbe2aa4dea17f41074ead4deae7935d2cf6823638766709812c5b40 - languageName: node - linkType: hard - -"babel-plugin-istanbul@npm:^6.1.1": - version: 6.1.1 - resolution: "babel-plugin-istanbul@npm:6.1.1" - dependencies: - "@babel/helper-plugin-utils": ^7.0.0 - "@istanbuljs/load-nyc-config": ^1.0.0 - "@istanbuljs/schema": ^0.1.2 - istanbul-lib-instrument: ^5.0.4 - test-exclude: ^6.0.0 - checksum: cb4fd95738219f232f0aece1116628cccff16db891713c4ccb501cddbbf9272951a5df81f2f2658dfdf4b3e7b236a9d5cbcf04d5d8c07dd5077297339598061a - languageName: node - linkType: hard - -"babel-plugin-jest-hoist@npm:^27.5.1": - version: 27.5.1 - resolution: "babel-plugin-jest-hoist@npm:27.5.1" - dependencies: - "@babel/template": ^7.3.3 - "@babel/types": ^7.3.3 - "@types/babel__core": ^7.0.0 - "@types/babel__traverse": ^7.0.6 - checksum: 709c17727aa8fd3be755d256fb514bf945a5c2ea6017f037d80280fc44ae5fe7dfeebf63d8412df53796455c2c216119d628d8cc90b099434fd819005943d058 - languageName: node - linkType: hard - -"babel-plugin-jest-hoist@npm:^29.6.3": - version: 29.6.3 - resolution: "babel-plugin-jest-hoist@npm:29.6.3" - dependencies: - "@babel/template": ^7.3.3 - "@babel/types": ^7.3.3 - "@types/babel__core": ^7.1.14 - "@types/babel__traverse": ^7.0.6 - checksum: 51250f22815a7318f17214a9d44650ba89551e6d4f47a2dc259128428324b52f5a73979d010cefd921fd5a720d8c1d55ad74ff601cd94c7bd44d5f6292fde2d1 - languageName: node - linkType: hard - -"babel-plugin-macros@npm:^2.0.0": - version: 2.8.0 - resolution: "babel-plugin-macros@npm:2.8.0" - dependencies: - "@babel/runtime": ^7.7.2 - cosmiconfig: ^6.0.0 - resolve: ^1.12.0 - checksum: 59b09a21cf3ae1e14186c1b021917d004b49b953824b24953a54c6502da79e8051d4ac31cfd4a0ae7f6ea5ddf1f7edd93df4895dd3c3982a5b2431859c2889ac - languageName: node - linkType: hard - -"babel-plugin-macros@npm:^3.1.0": - version: 3.1.0 - resolution: "babel-plugin-macros@npm:3.1.0" - dependencies: - "@babel/runtime": ^7.12.5 - cosmiconfig: ^7.0.0 - resolve: ^1.19.0 - checksum: 765de4abebd3e4688ebdfbff8571ddc8cd8061f839bb6c3e550b0344a4027b04c60491f843296ce3f3379fb356cc873d57a9ee6694262547eb822c14a25be9a6 - languageName: node - linkType: hard - -"babel-plugin-module-resolver@npm:5.0.0": - version: 5.0.0 - resolution: "babel-plugin-module-resolver@npm:5.0.0" - dependencies: - find-babel-config: ^2.0.0 - glob: ^8.0.3 - pkg-up: ^3.1.0 - reselect: ^4.1.7 - resolve: ^1.22.1 - checksum: d6880e49fc8e7bac509a2c183b4303ee054a47a80032a59a6f7844bb468ebe5e333b5dc5378443afdab5839e2da2b31a6c8d9a985a0047cd076b82bb9161cc78 - languageName: node - linkType: hard - -"babel-plugin-named-asset-import@npm:^0.3.8": - version: 0.3.8 - resolution: "babel-plugin-named-asset-import@npm:0.3.8" - peerDependencies: - "@babel/core": ^7.1.0 - checksum: d1e58df8cb75d91d070feea31087bc989906d3465144bde7e9f3c3690b514a90a55d3aebf3e65e76c5d4c743ecedde5f640f09f43a21fa60f1a5d413cb3f7a67 - languageName: node - linkType: hard - -"babel-plugin-polyfill-corejs2@npm:^0.4.10": - version: 0.4.12 - resolution: "babel-plugin-polyfill-corejs2@npm:0.4.12" - dependencies: - "@babel/compat-data": ^7.22.6 - "@babel/helper-define-polyfill-provider": ^0.6.3 - semver: ^6.3.1 - peerDependencies: - "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - checksum: 6e6e6a8b85fec80a310ded2f5c151385e4ac59118909dd6a952e1025e4a478eb79dda45a5a6322cc2e598fd696eb07d4e2fa52418b4101f3dc370bdf8c8939ba - languageName: node - linkType: hard - -"babel-plugin-polyfill-corejs3@npm:^0.10.6": - version: 0.10.6 - resolution: "babel-plugin-polyfill-corejs3@npm:0.10.6" - dependencies: - "@babel/helper-define-polyfill-provider": ^0.6.2 - core-js-compat: ^3.38.0 - peerDependencies: - "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - checksum: f762f29f7acca576897c63149c850f0a72babd3fb9ea436a2e36f0c339161c4b912a77828541d8188ce8a91e50965c6687120cf36071eabb1b7aa92f279e2164 - languageName: node - linkType: hard - -"babel-plugin-polyfill-regenerator@npm:^0.6.1": - version: 0.6.3 - resolution: "babel-plugin-polyfill-regenerator@npm:0.6.3" - dependencies: - "@babel/helper-define-polyfill-provider": ^0.6.3 - peerDependencies: - "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - checksum: d12696e6b3f280eb78fac551619ca4389262db62c7352cd54bf679d830df8b35596eef2de77cf00db6648eada1c99d49c4f40636dbc9c335a1e5420cfef96750 - languageName: node - linkType: hard - -"babel-plugin-react-native-web@npm:0.17.5": - version: 0.17.5 - resolution: "babel-plugin-react-native-web@npm:0.17.5" - checksum: cb9a1d3ce65ac50761aeb38fab45c87291ff8908bed204f7989047cbae81fc7463389c007ea8bd8c2e2a6a92c4c88e6fb3a41994272303852979235f1596cae3 - languageName: node - linkType: hard - -"babel-plugin-react-native-web@npm:~0.19.13": - version: 0.19.13 - resolution: "babel-plugin-react-native-web@npm:0.19.13" - checksum: 899165793b6e3416b87e830633d98b2bec6e29c89d838b86419a5a6e40b7042d3db98098393dfe3fc9be507054f5bcbf83c420cccfe5dc47c7d962acd1d313d5 - languageName: node - linkType: hard - -"babel-plugin-styled-components@npm:>= 1.12.0": - version: 2.1.4 - resolution: "babel-plugin-styled-components@npm:2.1.4" - dependencies: - "@babel/helper-annotate-as-pure": ^7.22.5 - "@babel/helper-module-imports": ^7.22.5 - "@babel/plugin-syntax-jsx": ^7.22.5 - lodash: ^4.17.21 - picomatch: ^2.3.1 - peerDependencies: - styled-components: ">= 2" - checksum: d791aed68d975dae4f73055f86cd47afa99cb402b8113acdaf5678c8b6fba2cbc15543f2debe8ed09becb198aae8be2adfe268ad41f4bca917288e073a622bf8 - languageName: node - linkType: hard - -"babel-plugin-syntax-hermes-parser@npm:^0.23.1": - version: 0.23.1 - resolution: "babel-plugin-syntax-hermes-parser@npm:0.23.1" - dependencies: - hermes-parser: 0.23.1 - checksum: 5412008e8e85b08cd0d78168f746ade68b8ed69c0068831ce5e3d028f01c644f546ca0e2b7c9a4a8c6b9d5f14aff84c2453ab44b19cbec55e4366b20bbba9040 - languageName: node - linkType: hard - -"babel-plugin-syntax-hermes-parser@npm:^0.25.1": - version: 0.25.1 - resolution: "babel-plugin-syntax-hermes-parser@npm:0.25.1" - dependencies: - hermes-parser: 0.25.1 - checksum: dc80fafde1aed8e60cf86ecd2e9920e7f35ffe02b33bd4e772daaa786167bcf508aac3fc1aea425ff4c7a0be94d82528f3fe8619b7f41dac853264272d640c04 - languageName: node - linkType: hard - -"babel-plugin-syntax-jsx@npm:^6.18.0": - version: 6.18.0 - resolution: "babel-plugin-syntax-jsx@npm:6.18.0" - checksum: 0c7ce5b81d6cfc01a7dd7a76a9a8f090ee02ba5c890310f51217ef1a7e6163fb7848994bbc14fd560117892e82240df9c7157ad0764da67ca5f2afafb73a7d27 - languageName: node - linkType: hard - -"babel-plugin-syntax-trailing-function-commas@npm:^7.0.0-beta.0": - version: 7.0.0-beta.0 - resolution: "babel-plugin-syntax-trailing-function-commas@npm:7.0.0-beta.0" - checksum: e37509156ca945dd9e4b82c66dd74f2d842ad917bd280cb5aa67960942300cd065eeac476d2514bdcdedec071277a358f6d517c31d9f9244d9bbc3619a8ecf8a - languageName: node - linkType: hard - -"babel-plugin-transform-flow-enums@npm:^0.0.2": - version: 0.0.2 - resolution: "babel-plugin-transform-flow-enums@npm:0.0.2" - dependencies: - "@babel/plugin-syntax-flow": ^7.12.1 - checksum: fd52aef54448e01948a9d1cca0c8f87d064970c8682458962b7a222c372704bc2ce26ae8109e0ab2566e7ea5106856460f04c1a5ed794ab3bcd2f42cae1d9845 - languageName: node - linkType: hard - -"babel-plugin-transform-inline-environment-variables@npm:0.4.4": - version: 0.4.4 - resolution: "babel-plugin-transform-inline-environment-variables@npm:0.4.4" - checksum: fa361287411301237fd8ce332aff4f8e8ccb8db30e87a2ddc7224c8bf7cd792eda47aca24dc2e09e70bce4c027bc8cbe22f4999056be37a25d2472945df21ef5 - languageName: node - linkType: hard - -"babel-plugin-transform-react-remove-prop-types@npm:^0.4.24": - version: 0.4.24 - resolution: "babel-plugin-transform-react-remove-prop-types@npm:0.4.24" - checksum: 54afe56d67f0d118c9da23996f39948e502a152b3f582eb6e8f163fcb76c2c1ea4e0cdd4f9fac5c0ef050eab4fe0a950b0b74aae6237bcc0d31d8fc4cc808d1a - languageName: node - linkType: hard - -"babel-plugin-transform-remove-console@npm:6.9.4": - version: 6.9.4 - resolution: "babel-plugin-transform-remove-console@npm:6.9.4" - checksum: 1123c3816c6f89c064752199c8796f30265d937f5d8e1e43d3837f1c0e87ed0e6bbd0afa6117ce021c8b93ec1de7154e158674bb22331c7ed6609d10121359df - languageName: node - linkType: hard - -"babel-preset-current-node-syntax@npm:^1.0.0": - version: 1.0.1 - resolution: "babel-preset-current-node-syntax@npm:1.0.1" - dependencies: - "@babel/plugin-syntax-async-generators": ^7.8.4 - "@babel/plugin-syntax-bigint": ^7.8.3 - "@babel/plugin-syntax-class-properties": ^7.8.3 - "@babel/plugin-syntax-import-meta": ^7.8.3 - "@babel/plugin-syntax-json-strings": ^7.8.3 - "@babel/plugin-syntax-logical-assignment-operators": ^7.8.3 - "@babel/plugin-syntax-nullish-coalescing-operator": ^7.8.3 - "@babel/plugin-syntax-numeric-separator": ^7.8.3 - "@babel/plugin-syntax-object-rest-spread": ^7.8.3 - "@babel/plugin-syntax-optional-catch-binding": ^7.8.3 - "@babel/plugin-syntax-optional-chaining": ^7.8.3 - "@babel/plugin-syntax-top-level-await": ^7.8.3 - peerDependencies: - "@babel/core": ^7.0.0 - checksum: d118c2742498c5492c095bc8541f4076b253e705b5f1ad9a2e7d302d81a84866f0070346662355c8e25fc02caa28dc2da8d69bcd67794a0d60c4d6fab6913cc8 - languageName: node - linkType: hard - -"babel-preset-expo@npm:12.0.6, babel-preset-expo@npm:~12.0.1": - version: 12.0.6 - resolution: "babel-preset-expo@npm:12.0.6" - dependencies: - "@babel/plugin-proposal-decorators": ^7.12.9 - "@babel/plugin-transform-export-namespace-from": ^7.22.11 - "@babel/plugin-transform-object-rest-spread": ^7.12.13 - "@babel/plugin-transform-parameters": ^7.22.15 - "@babel/preset-react": ^7.22.15 - "@babel/preset-typescript": ^7.23.0 - "@react-native/babel-preset": 0.76.6 - babel-plugin-react-native-web: ~0.19.13 - react-refresh: ^0.14.2 - peerDependencies: - babel-plugin-react-compiler: ^19.0.0-beta-9ee70a1-20241017 - react-compiler-runtime: ^19.0.0-beta-8a03594-20241020 - peerDependenciesMeta: - babel-plugin-react-compiler: - optional: true - react-compiler-runtime: - optional: true - checksum: 2a8ce0f6631d1bb8889cabf5344eef312468d320255be1dfe58a9673799557a884cdd1a67b06ecdc3514aaf89f18ef4a127652d74b8d9b17dad183f974598fe5 - languageName: node - linkType: hard - -"babel-preset-fbjs@npm:^3.4.0": - version: 3.4.0 - resolution: "babel-preset-fbjs@npm:3.4.0" - dependencies: - "@babel/plugin-proposal-class-properties": ^7.0.0 - "@babel/plugin-proposal-object-rest-spread": ^7.0.0 - "@babel/plugin-syntax-class-properties": ^7.0.0 - "@babel/plugin-syntax-flow": ^7.0.0 - "@babel/plugin-syntax-jsx": ^7.0.0 - "@babel/plugin-syntax-object-rest-spread": ^7.0.0 - "@babel/plugin-transform-arrow-functions": ^7.0.0 - "@babel/plugin-transform-block-scoped-functions": ^7.0.0 - "@babel/plugin-transform-block-scoping": ^7.0.0 - "@babel/plugin-transform-classes": ^7.0.0 - "@babel/plugin-transform-computed-properties": ^7.0.0 - "@babel/plugin-transform-destructuring": ^7.0.0 - "@babel/plugin-transform-flow-strip-types": ^7.0.0 - "@babel/plugin-transform-for-of": ^7.0.0 - "@babel/plugin-transform-function-name": ^7.0.0 - "@babel/plugin-transform-literals": ^7.0.0 - "@babel/plugin-transform-member-expression-literals": ^7.0.0 - "@babel/plugin-transform-modules-commonjs": ^7.0.0 - "@babel/plugin-transform-object-super": ^7.0.0 - "@babel/plugin-transform-parameters": ^7.0.0 - "@babel/plugin-transform-property-literals": ^7.0.0 - "@babel/plugin-transform-react-display-name": ^7.0.0 - "@babel/plugin-transform-react-jsx": ^7.0.0 - "@babel/plugin-transform-shorthand-properties": ^7.0.0 - "@babel/plugin-transform-spread": ^7.0.0 - "@babel/plugin-transform-template-literals": ^7.0.0 - babel-plugin-syntax-trailing-function-commas: ^7.0.0-beta.0 - peerDependencies: - "@babel/core": ^7.0.0 - checksum: b3352cf690729125997f254bc31b9c4db347f8646f1571958ced1c45f0da89439e183e1c88e35397eb0361b9e1fbb1dd8142d3f4647814deb427e53c54f44d5f - languageName: node - linkType: hard - -"babel-preset-jest@npm:^27.5.1": - version: 27.5.1 - resolution: "babel-preset-jest@npm:27.5.1" - dependencies: - babel-plugin-jest-hoist: ^27.5.1 - babel-preset-current-node-syntax: ^1.0.0 - peerDependencies: - "@babel/core": ^7.0.0 - checksum: 251bcea11c18fd9672fec104eadb45b43f117ceeb326fa7345ced778d4c1feab29343cd7a87a1dcfae4997d6c851a8b386d7f7213792da6e23b74f4443a8976d - languageName: node - linkType: hard - -"babel-preset-jest@npm:^29.6.3": - version: 29.6.3 - resolution: "babel-preset-jest@npm:29.6.3" - dependencies: - babel-plugin-jest-hoist: ^29.6.3 - babel-preset-current-node-syntax: ^1.0.0 - peerDependencies: - "@babel/core": ^7.0.0 - checksum: aa4ff2a8a728d9d698ed521e3461a109a1e66202b13d3494e41eea30729a5e7cc03b3a2d56c594423a135429c37bf63a9fa8b0b9ce275298be3095a88c69f6fb - languageName: node - linkType: hard - -"babel-preset-react-app@npm:^10.0.1": - version: 10.0.1 - resolution: "babel-preset-react-app@npm:10.0.1" - dependencies: - "@babel/core": ^7.16.0 - "@babel/plugin-proposal-class-properties": ^7.16.0 - "@babel/plugin-proposal-decorators": ^7.16.4 - "@babel/plugin-proposal-nullish-coalescing-operator": ^7.16.0 - "@babel/plugin-proposal-numeric-separator": ^7.16.0 - "@babel/plugin-proposal-optional-chaining": ^7.16.0 - "@babel/plugin-proposal-private-methods": ^7.16.0 - "@babel/plugin-transform-flow-strip-types": ^7.16.0 - "@babel/plugin-transform-react-display-name": ^7.16.0 - "@babel/plugin-transform-runtime": ^7.16.4 - "@babel/preset-env": ^7.16.4 - "@babel/preset-react": ^7.16.0 - "@babel/preset-typescript": ^7.16.0 - "@babel/runtime": ^7.16.3 - babel-plugin-macros: ^3.1.0 - babel-plugin-transform-react-remove-prop-types: ^0.4.24 - checksum: ee66043484e67b8aef2541976388299691478ea00834f3bb14b6b3d5edcd316a5ac95351f6ec084b41ee555cad820d4194280ad38ce51884fedc7e8946a57b74 - languageName: node - linkType: hard - -"backo2@npm:^1.0.2": - version: 1.0.2 - resolution: "backo2@npm:1.0.2" - checksum: fda8d0a0f4810068d23715f2f45153146d6ee8f62dd827ce1e0b6cc3c8328e84ad61e11399a83931705cef702fe7cbb457856bf99b9bd10c4ed57b0786252385 - languageName: node - linkType: hard - -"bail@npm:^1.0.0": - version: 1.0.5 - resolution: "bail@npm:1.0.5" - checksum: 6c334940d7eaa4e656a12fb12407b6555649b6deb6df04270fa806e0da82684ebe4a4e47815b271c794b40f8d6fa286e0c248b14ddbabb324a917fab09b7301a - languageName: node - linkType: hard - -"balanced-match@npm:^1.0.0": - version: 1.0.2 - resolution: "balanced-match@npm:1.0.2" - checksum: 9706c088a283058a8a99e0bf91b0a2f75497f185980d9ffa8b304de1d9e58ebda7c72c07ebf01dadedaac5b2907b2c6f566f660d62bd336c3468e960403b9d65 - languageName: node - linkType: hard - -"bare-events@npm:^2.0.0, bare-events@npm:^2.2.0": - version: 2.5.2 - resolution: "bare-events@npm:2.5.2" - checksum: d2459e4010ee1aef3e589ea5b7a3643b3b1ff51363cbce507b761d18efb3c21fcfa9912d92e0f636a581b9a6e92aaabe7fe9828b82b9ad534db358bc92c6be7e - languageName: node - linkType: hard - -"bare-fs@npm:^2.1.1": - version: 2.3.5 - resolution: "bare-fs@npm:2.3.5" - dependencies: - bare-events: ^2.0.0 - bare-path: ^2.0.0 - bare-stream: ^2.0.0 - checksum: 071b1dff94a213eaf0b41693953959bf10af2deade597a56ff206a5d833579d56bc8530aa4614bb88bf39fd6d52f2404f7c36af4695109ffa756a13837ac3d91 - languageName: node - linkType: hard - -"bare-os@npm:^2.1.0": - version: 2.4.4 - resolution: "bare-os@npm:2.4.4" - checksum: e90088a7dc0307c020350a28df8ec5564cae5a4b7a213d8509d70831d7064308e2ed31de801b68f474cb004ad3a0a66bd28c38374d270484d9025ee71af20396 - languageName: node - linkType: hard - -"bare-path@npm:^2.0.0, bare-path@npm:^2.1.0": - version: 2.1.3 - resolution: "bare-path@npm:2.1.3" - dependencies: - bare-os: ^2.1.0 - checksum: 20301aeb05b735852a396515464908e51e896922c3bb353ef2a09ff54e81ced94e6ad857bb0a36d2ce659c42bd43dd5c3d5643edd8faaf910ee9950c4e137b88 - languageName: node - linkType: hard - -"bare-stream@npm:^2.0.0": - version: 2.6.1 - resolution: "bare-stream@npm:2.6.1" - dependencies: - streamx: ^2.21.0 - checksum: e7343a9ad6d3ca0d345c8b7dad449fbeccec1969d6c0971cd8f79e55508435dbba26e386a8f75e4baa94d9abd9d767972ab9917f59c64b1df06e0b30b5b814fd - languageName: node - linkType: hard - -"base-x@npm:^3.0.2": - version: 3.0.9 - resolution: "base-x@npm:3.0.9" - dependencies: - safe-buffer: ^5.0.1 - checksum: 957101d6fd09e1903e846fd8f69fd7e5e3e50254383e61ab667c725866bec54e5ece5ba49ce385128ae48f9ec93a26567d1d5ebb91f4d56ef4a9cc0d5a5481e8 - languageName: node - linkType: hard - -"base64-js@npm:0.0.8": - version: 0.0.8 - resolution: "base64-js@npm:0.0.8" - checksum: e95d2fa4b9000789fedd1e1ebac7830a70f5b1c06c72b2cf7862a48335af5d42229c0deda5085b2c8e403e479b612a55cd682bd4438838980d07cfc21c91e750 - languageName: node - linkType: hard - -"base64-js@npm:^1.2.3, base64-js@npm:^1.3.0, base64-js@npm:^1.3.1, base64-js@npm:^1.5.1": - version: 1.5.1 - resolution: "base64-js@npm:1.5.1" - checksum: 669632eb3745404c2f822a18fc3a0122d2f9a7a13f7fb8b5823ee19d1d2ff9ee5b52c53367176ea4ad093c332fd5ab4bd0ebae5a8e27917a4105a4cfc86b1005 - languageName: node - linkType: hard - -"base64-sol@npm:1.0.1": - version: 1.0.1 - resolution: "base64-sol@npm:1.0.1" - checksum: be0f9e8cf3c744256913223fbae8187773f530cc096e98a77f49ef0bd6cedeb294d15a784e439419f7cb99f07bf85b08999169feafafa1a9e29c3affc0bc6d0a - languageName: node - linkType: hard - -"basic-ftp@npm:^5.0.2": - version: 5.0.5 - resolution: "basic-ftp@npm:5.0.5" - checksum: bc82d1c1c61cd838eaca96d68ece888bacf07546642fb6b9b8328ed410756f5935f8cf43a42cb44bb343e0565e28e908adc54c298bd2f1a6e0976871fb11fec6 - languageName: node - linkType: hard - -"batch@npm:0.6.1": - version: 0.6.1 - resolution: "batch@npm:0.6.1" - checksum: 61f9934c7378a51dce61b915586191078ef7f1c3eca707fdd58b96ff2ff56d9e0af2bdab66b1462301a73c73374239e6542d9821c0af787f3209a23365d07e7f - languageName: node - linkType: hard - -"bcrypt-pbkdf@npm:^1.0.0, bcrypt-pbkdf@npm:^1.0.2": - version: 1.0.2 - resolution: "bcrypt-pbkdf@npm:1.0.2" - dependencies: - tweetnacl: ^0.14.3 - checksum: 4edfc9fe7d07019609ccf797a2af28351736e9d012c8402a07120c4453a3b789a15f2ee1530dc49eee8f7eb9379331a8dd4b3766042b9e502f74a68e7f662291 - languageName: node - linkType: hard - -"bech32@npm:1.1.4": - version: 1.1.4 - resolution: "bech32@npm:1.1.4" - checksum: 0e98db619191548390d6f09ff68b0253ba7ae6a55db93dfdbb070ba234c1fd3308c0606fbcc95fad50437227b10011e2698b89f0181f6e7f845c499bd14d0f4b - languageName: node - linkType: hard - -"before-after-hook@npm:^2.2.0": - version: 2.2.3 - resolution: "before-after-hook@npm:2.2.3" - checksum: a1a2430976d9bdab4cd89cb50d27fa86b19e2b41812bf1315923b0cba03371ebca99449809226425dd3bcef20e010db61abdaff549278e111d6480034bebae87 - languageName: node - linkType: hard - -"better-opn@npm:^3.0.2, better-opn@npm:~3.0.2": - version: 3.0.2 - resolution: "better-opn@npm:3.0.2" - dependencies: - open: ^8.0.4 - checksum: 1471552fa7f733561e7f49e812be074b421153006ca744de985fb6d38939807959fc5fe9cb819cf09f864782e294704fd3b31711ea14c115baf3330a2f1135de - languageName: node - linkType: hard - -"bfj@npm:^7.0.2": - version: 7.1.0 - resolution: "bfj@npm:7.1.0" - dependencies: - bluebird: ^3.7.2 - check-types: ^11.2.3 - hoopy: ^0.1.4 - jsonpath: ^1.1.1 - tryer: ^1.0.1 - checksum: 36da9ed36c60f377a3f43bb0433092af7dc40442914b8155a1330ae86b1905640baf57e9c195ab83b36d6518b27cf8ed880adff663aa444c193be149e027d722 - languageName: node - linkType: hard - -"big-integer@npm:1.6.x": - version: 1.6.51 - resolution: "big-integer@npm:1.6.51" - checksum: 3d444173d1b2e20747e2c175568bedeebd8315b0637ea95d75fd27830d3b8e8ba36c6af40374f36bdaea7b5de376dcada1b07587cb2a79a928fccdb6e6e3c518 - languageName: node - linkType: hard - -"big.js@npm:^5.2.2": - version: 5.2.2 - resolution: "big.js@npm:5.2.2" - checksum: b89b6e8419b097a8fb4ed2399a1931a68c612bce3cfd5ca8c214b2d017531191070f990598de2fc6f3f993d91c0f08aa82697717f6b3b8732c9731866d233c9e - languageName: node - linkType: hard - -"bignumber.js@npm:^9.0.0, bignumber.js@npm:^9.0.1, bignumber.js@npm:^9.0.2": - version: 9.1.2 - resolution: "bignumber.js@npm:9.1.2" - checksum: 582c03af77ec9cb0ebd682a373ee6c66475db94a4325f92299621d544aa4bd45cb45fd60001610e94aef8ae98a0905fa538241d9638d4422d57abbeeac6fadaf - languageName: node - linkType: hard - -"binary-extensions@npm:^2.0.0": - version: 2.2.0 - resolution: "binary-extensions@npm:2.2.0" - checksum: ccd267956c58d2315f5d3ea6757cf09863c5fc703e50fbeb13a7dc849b812ef76e3cf9ca8f35a0c48498776a7478d7b4a0418e1e2b8cb9cb9731f2922aaad7f8 - languageName: node - linkType: hard - -"bl@npm:^4.0.3, bl@npm:^4.1.0": - version: 4.1.0 - resolution: "bl@npm:4.1.0" - dependencies: - buffer: ^5.5.0 - inherits: ^2.0.4 - readable-stream: ^3.4.0 - checksum: 9e8521fa7e83aa9427c6f8ccdcba6e8167ef30cc9a22df26effcc5ab682ef91d2cbc23a239f945d099289e4bbcfae7a192e9c28c84c6202e710a0dfec3722662 - languageName: node - linkType: hard - -"blake3-wasm@npm:^2.1.5": - version: 2.1.5 - resolution: "blake3-wasm@npm:2.1.5" - checksum: 5088e929c722b52b9c28701c1760ab850a963692056a417b894c943030e3267f12138ae6409e79069b8d7d0401a411426147e8d812b65a49e303fa432af18871 - languageName: node - linkType: hard - -"blakejs@npm:^1.1.0": - version: 1.1.1 - resolution: "blakejs@npm:1.1.1" - checksum: 77a0875af41fe0a6b15feacc69a4a730063df697b2932adbde15aa2c9c58a592870cd511a494ceee59cc8143ae64964dfa1bf301dab275b330debcd12c2b3db9 - languageName: node - linkType: hard - -"blob-util@npm:^2.0.2": - version: 2.0.2 - resolution: "blob-util@npm:2.0.2" - checksum: d543e6b92e4ca715ca33c78e89a07a2290d43e5b2bc897d7ec588c5c7bbf59df93e45225ac0c9258aa6ce4320358990f99c9288f1c48280f8ec5d7a2e088d19b - languageName: node - linkType: hard - -"bluebird@npm:3.7.2, bluebird@npm:^3.7.2": - version: 3.7.2 - resolution: "bluebird@npm:3.7.2" - checksum: 869417503c722e7dc54ca46715f70e15f4d9c602a423a02c825570862d12935be59ed9c7ba34a9b31f186c017c23cac6b54e35446f8353059c101da73eac22ef - languageName: node - linkType: hard - -"bmp-js@npm:^0.1.0": - version: 0.1.0 - resolution: "bmp-js@npm:0.1.0" - checksum: 2f6cf7eeabae2aa50eb768122f59e9752caa97248028cb8b5cf0d9db7cf8fb3a60262aeb2c6889dd21357ab061b2fb318f21f20d2b24963ba36ead8e264c6654 - languageName: node - linkType: hard - -"bn.js@npm:4.11.6": - version: 4.11.6 - resolution: "bn.js@npm:4.11.6" - checksum: db23047bf06fdf9cf74401c8e76bca9f55313c81df382247d2c753868b368562e69171716b81b7038ada8860af18346fd4bcd1cf9d4963f923fe8e54e61cb58a - languageName: node - linkType: hard - -"bn.js@npm:^4.0.0, bn.js@npm:^4.1.0, bn.js@npm:^4.11.0, bn.js@npm:^4.11.8, bn.js@npm:^4.11.9": - version: 4.12.0 - resolution: "bn.js@npm:4.12.0" - checksum: 39afb4f15f4ea537b55eaf1446c896af28ac948fdcf47171961475724d1bb65118cca49fa6e3d67706e4790955ec0e74de584e45c8f1ef89f46c812bee5b5a12 - languageName: node - linkType: hard - -"bn.js@npm:^5.0.0, bn.js@npm:^5.1.1, bn.js@npm:^5.2.0, bn.js@npm:^5.2.1": - version: 5.2.1 - resolution: "bn.js@npm:5.2.1" - checksum: 3dd8c8d38055fedfa95c1d5fc3c99f8dd547b36287b37768db0abab3c239711f88ff58d18d155dd8ad902b0b0cee973747b7ae20ea12a09473272b0201c9edd3 - languageName: node - linkType: hard - -"body-parser@npm:1.20.1": - version: 1.20.1 - resolution: "body-parser@npm:1.20.1" - dependencies: - bytes: 3.1.2 - content-type: ~1.0.4 - debug: 2.6.9 - depd: 2.0.0 - destroy: 1.2.0 - http-errors: 2.0.0 - iconv-lite: 0.4.24 - on-finished: 2.4.1 - qs: 6.11.0 - raw-body: 2.5.1 - type-is: ~1.6.18 - unpipe: 1.0.0 - checksum: f1050dbac3bede6a78f0b87947a8d548ce43f91ccc718a50dd774f3c81f2d8b04693e52acf62659fad23101827dd318da1fb1363444ff9a8482b886a3e4a5266 - languageName: node - linkType: hard - -"bonjour-service@npm:^1.0.11": - version: 1.1.1 - resolution: "bonjour-service@npm:1.1.1" - dependencies: - array-flatten: ^2.1.2 - dns-equal: ^1.0.0 - fast-deep-equal: ^3.1.3 - multicast-dns: ^7.2.5 - checksum: 832d0cf78b91368fac8bb11fd7a714e46f4c4fb1bb14d7283bce614a6fb3aae2f3fe209aba5b4fa051811c1cab6921d073a83db8432fb23292f27dd4161fb0f1 - languageName: node - linkType: hard - -"boolbase@npm:^1.0.0, boolbase@npm:~1.0.0": - version: 1.0.0 - resolution: "boolbase@npm:1.0.0" - checksum: 3e25c80ef626c3a3487c73dbfc70ac322ec830666c9ad915d11b701142fab25ec1e63eff2c450c74347acfd2de854ccde865cd79ef4db1683f7c7b046ea43bb0 - languageName: node - linkType: hard - -"boolean@npm:^3.0.1": - version: 3.1.4 - resolution: "boolean@npm:3.1.4" - checksum: 9a48bce4799ccca861be0ec9564f47a96dd01535079624e37b06df45e5dc89d14dcefa04c56f1491a91f0827029f6d9e25690f0b308dfc248b9e64e15593aa35 - languageName: node - linkType: hard - -"bowser@npm:^2.11.0, bowser@npm:^2.9.0": - version: 2.11.0 - resolution: "bowser@npm:2.11.0" - checksum: 29c3f01f22e703fa6644fc3b684307442df4240b6e10f6cfe1b61c6ca5721073189ca97cdeedb376081148c8518e33b1d818a57f781d70b0b70e1f31fb48814f - languageName: node - linkType: hard - -"boxen@npm:7.0.0": - version: 7.0.0 - resolution: "boxen@npm:7.0.0" - dependencies: - ansi-align: ^3.0.1 - camelcase: ^7.0.0 - chalk: ^5.0.1 - cli-boxes: ^3.0.0 - string-width: ^5.1.2 - type-fest: ^2.13.0 - widest-line: ^4.0.1 - wrap-ansi: ^8.0.1 - checksum: b917cf7a168ef3149635a8c02d5c9717d66182348bd27038d85328ad12655151e3324db0f2815253846c33e5f0ddf28b6cd52d56a12b9f88617b7f8f722b946a - languageName: node - linkType: hard - -"boxen@npm:^1.2.1": - version: 1.3.0 - resolution: "boxen@npm:1.3.0" - dependencies: - ansi-align: ^2.0.0 - camelcase: ^4.0.0 - chalk: ^2.0.1 - cli-boxes: ^1.0.0 - string-width: ^2.0.0 - term-size: ^1.2.0 - widest-line: ^2.0.0 - checksum: 8dad2081bfaf5a86cb85685882b5f22027c5c430ee0974894078f521a44d92a90222fb4391b41fc4575aa1215c9133ea2c6b7feadcd1cb2fae8f4e97c05dbf11 - languageName: node - linkType: hard - -"boxen@npm:^5.1.2": - version: 5.1.2 - resolution: "boxen@npm:5.1.2" - dependencies: - ansi-align: ^3.0.0 - camelcase: ^6.2.0 - chalk: ^4.1.0 - cli-boxes: ^2.2.1 - string-width: ^4.2.2 - type-fest: ^0.20.2 - widest-line: ^3.1.0 - wrap-ansi: ^7.0.0 - checksum: 82d03e42a72576ff235123f17b7c505372fe05c83f75f61e7d4fa4bcb393897ec95ce766fecb8f26b915f0f7a7227d66e5ec7cef43f5b2bd9d3aeed47ec55877 - languageName: node - linkType: hard - -"bplist-creator@npm:0.0.7": - version: 0.0.7 - resolution: "bplist-creator@npm:0.0.7" - dependencies: - stream-buffers: ~2.2.0 - checksum: 5bcf4091c5a0e5934d56643d9f2705b5149a0b0b62b8314762f6ad4b3208d313c75ad03bab97a3c42b6e17db3d73530d3642d082ca249b55f952c90056c2b2ad - languageName: node - linkType: hard - -"bplist-creator@npm:0.1.1": - version: 0.1.1 - resolution: "bplist-creator@npm:0.1.1" - dependencies: - stream-buffers: 2.2.x - checksum: b0d40d1d1623f1afdbb575cfc8075d742d2c4f0eb458574be809e3857752d1042a39553b3943d2d7f505dde92bcd43e1d7bdac61c9cd44475d696deb79f897ce - languageName: node - linkType: hard - -"bplist-parser@npm:0.3.2, bplist-parser@npm:^0.3.1": - version: 0.3.2 - resolution: "bplist-parser@npm:0.3.2" - dependencies: - big-integer: 1.6.x - checksum: fad0f6eb155a9b636b4096a1725ce972a0386490d7d38df7be11a3a5645372446b7c44aacbc6626d24d2c17d8b837765361520ebf2960aeffcaf56765811620e - languageName: node - linkType: hard - -"brace-expansion@npm:^1.1.7": - version: 1.1.11 - resolution: "brace-expansion@npm:1.1.11" - dependencies: - balanced-match: ^1.0.0 - concat-map: 0.0.1 - checksum: faf34a7bb0c3fcf4b59c7808bc5d2a96a40988addf2e7e09dfbb67a2251800e0d14cd2bfc1aa79174f2f5095c54ff27f46fb1289fe2d77dac755b5eb3434cc07 - languageName: node - linkType: hard - -"brace-expansion@npm:^2.0.1": - version: 2.0.1 - resolution: "brace-expansion@npm:2.0.1" - dependencies: - balanced-match: ^1.0.0 - checksum: a61e7cd2e8a8505e9f0036b3b6108ba5e926b4b55089eeb5550cd04a471fe216c96d4fe7e4c7f995c728c554ae20ddfc4244cad10aef255e72b62930afd233d1 - languageName: node - linkType: hard - -"braces@npm:^3.0.2, braces@npm:^3.0.3, braces@npm:~3.0.2": - version: 3.0.3 - resolution: "braces@npm:3.0.3" - dependencies: - fill-range: ^7.1.1 - checksum: b95aa0b3bd909f6cd1720ffcf031aeaf46154dd88b4da01f9a1d3f7ea866a79eba76a6d01cbc3c422b2ee5cdc39a4f02491058d5df0d7bf6e6a162a832df1f69 - languageName: node - linkType: hard - -"broccoli-node-api@npm:^1.7.0": - version: 1.7.0 - resolution: "broccoli-node-api@npm:1.7.0" - checksum: 37b83c81549294d0c843bb4c07ef5330a5493f5e8204e4f7eda716c4f5175f5ccf0f10f0957a18321324b5ff3d4fe2a2cd6cd8e598d6f9e7986c45b8dd200b99 - languageName: node - linkType: hard - -"broccoli-node-info@npm:^2.1.0": - version: 2.2.0 - resolution: "broccoli-node-info@npm:2.2.0" - checksum: e5d68ebb35aa4406dc7dd9e90f15f68fb58c2026696bda2a67045f993261e856fbfec35b3d424c835af7873bd7de00f15630a5b2626c8c0929365035ade9cddd - languageName: node - linkType: hard - -"broccoli-output-wrapper@npm:^3.2.5": - version: 3.2.5 - resolution: "broccoli-output-wrapper@npm:3.2.5" - dependencies: - fs-extra: ^8.1.0 - heimdalljs-logger: ^0.1.10 - symlink-or-copy: ^1.2.0 - checksum: c23d875544bfdd4cf0767fb9080a6a16bf938497a1a6601fe9ea2e0e5cce26f1a4f4ab81f80e50376b0d86b622cef848d0ffba3f5fa4f2e3c4b531539383eddb - languageName: node - linkType: hard - -"broccoli-plugin@npm:^4.0.7": - version: 4.0.7 - resolution: "broccoli-plugin@npm:4.0.7" - dependencies: - broccoli-node-api: ^1.7.0 - broccoli-output-wrapper: ^3.2.5 - fs-merger: ^3.2.1 - promise-map-series: ^0.3.0 - quick-temp: ^0.1.8 - rimraf: ^3.0.2 - symlink-or-copy: ^1.3.1 - checksum: 49d6a55ebfe1880e73956dc8bf23104ad81c1272d4a06755823e6e1eec5255583d2913de99427b3e0a620e3b56178fdd8ea03c832b7452f0440c166044aa555c - languageName: node - linkType: hard - -"brorand@npm:^1.0.1, brorand@npm:^1.1.0": - version: 1.1.0 - resolution: "brorand@npm:1.1.0" - checksum: 8a05c9f3c4b46572dec6ef71012b1946db6cae8c7bb60ccd4b7dd5a84655db49fe043ecc6272e7ef1f69dc53d6730b9e2a3a03a8310509a3d797a618cbee52be - languageName: node - linkType: hard - -"browser-assert@npm:^1.2.1": - version: 1.2.1 - resolution: "browser-assert@npm:1.2.1" - checksum: 8b2407cd04c1ed592cf892dec35942b7d72635829221e0788c9a16c4d2afa8b7156bc9705b1c4b32c30d88136c576fda3cbcb8f494d6f865264c706ea8798d92 - languageName: node - linkType: hard - -"browser-cache-mock@npm:0.1.7": - version: 0.1.7 - resolution: "browser-cache-mock@npm:0.1.7" - checksum: cb776e3a7d60204041e7e5ce2048fe7bab0618e70fdb162f868464839833e17e1d93eb72ddbb4c575b2405f7fb3548b5ceef1347b29dee85b21b94596f027734 - languageName: node - linkType: hard - -"browser-stdout@npm:1.3.1": - version: 1.3.1 - resolution: "browser-stdout@npm:1.3.1" - checksum: b717b19b25952dd6af483e368f9bcd6b14b87740c3d226c2977a65e84666ffd67000bddea7d911f111a9b6ddc822b234de42d52ab6507bce4119a4cc003ef7b3 - languageName: node - linkType: hard - -"browserify-aes@npm:^1.0.0, browserify-aes@npm:^1.0.4, browserify-aes@npm:^1.2.0": - version: 1.2.0 - resolution: "browserify-aes@npm:1.2.0" - dependencies: - buffer-xor: ^1.0.3 - cipher-base: ^1.0.0 - create-hash: ^1.1.0 - evp_bytestokey: ^1.0.3 - inherits: ^2.0.1 - safe-buffer: ^5.0.1 - checksum: 4a17c3eb55a2aa61c934c286f34921933086bf6d67f02d4adb09fcc6f2fc93977b47d9d884c25619144fccd47b3b3a399e1ad8b3ff5a346be47270114bcf7104 - languageName: node - linkType: hard - -"browserify-cipher@npm:^1.0.0": - version: 1.0.1 - resolution: "browserify-cipher@npm:1.0.1" - dependencies: - browserify-aes: ^1.0.4 - browserify-des: ^1.0.0 - evp_bytestokey: ^1.0.0 - checksum: 2d8500acf1ee535e6bebe808f7a20e4c3a9e2ed1a6885fff1facbfd201ac013ef030422bec65ca9ece8ffe82b03ca580421463f9c45af6c8415fd629f4118c13 - languageName: node - linkType: hard - -"browserify-des@npm:^1.0.0": - version: 1.0.2 - resolution: "browserify-des@npm:1.0.2" - dependencies: - cipher-base: ^1.0.1 - des.js: ^1.0.0 - inherits: ^2.0.1 - safe-buffer: ^5.1.2 - checksum: b15a3e358a1d78a3b62ddc06c845d02afde6fc826dab23f1b9c016e643e7b1fda41de628d2110b712f6a44fb10cbc1800bc6872a03ddd363fb50768e010395b7 - languageName: node - linkType: hard - -"browserify-rsa@npm:^4.0.0, browserify-rsa@npm:^4.0.1": - version: 4.1.0 - resolution: "browserify-rsa@npm:4.1.0" - dependencies: - bn.js: ^5.0.0 - randombytes: ^2.0.1 - checksum: 155f0c135873efc85620571a33d884aa8810e40176125ad424ec9d85016ff105a07f6231650914a760cca66f29af0494087947b7be34880dd4599a0cd3c38e54 - languageName: node - linkType: hard - -"browserify-sign@npm:^4.0.0": - version: 4.2.1 - resolution: "browserify-sign@npm:4.2.1" - dependencies: - bn.js: ^5.1.1 - browserify-rsa: ^4.0.1 - create-hash: ^1.2.0 - create-hmac: ^1.1.7 - elliptic: ^6.5.3 - inherits: ^2.0.4 - parse-asn1: ^5.1.5 - readable-stream: ^3.6.0 - safe-buffer: ^5.2.0 - checksum: 0221f190e3f5b2d40183fa51621be7e838d9caa329fe1ba773406b7637855f37b30f5d83e52ff8f244ed12ffe6278dd9983638609ed88c841ce547e603855707 - languageName: node - linkType: hard - -"browserify-zlib@npm:^0.2.0": - version: 0.2.0 - resolution: "browserify-zlib@npm:0.2.0" - dependencies: - pako: ~1.0.5 - checksum: 5cd9d6a665190fedb4a97dfbad8dabc8698d8a507298a03f42c734e96d58ca35d3c7d4085e283440bbca1cd1938cff85031728079bedb3345310c58ab1ec92d6 - languageName: node - linkType: hard - -"browserslist@npm:^4.0.0, browserslist@npm:^4.18.1, browserslist@npm:^4.21.10, browserslist@npm:^4.21.4, browserslist@npm:^4.22.2, browserslist@npm:^4.23.3, browserslist@npm:^4.24.0, browserslist@npm:^4.24.3": - version: 4.24.4 - resolution: "browserslist@npm:4.24.4" - dependencies: - caniuse-lite: ^1.0.30001688 - electron-to-chromium: ^1.5.73 - node-releases: ^2.0.19 - update-browserslist-db: ^1.1.1 - bin: - browserslist: cli.js - checksum: 64074bf6cf0a9ae3094d753270e3eae9cf925149db45d646f0bc67bacc2e46d7ded64a4e835b95f5fdcf0350f63a83c3755b32f80831f643a47f0886deb8a065 - languageName: node - linkType: hard - -"bs-logger@npm:^0.2.6": - version: 0.2.6 - resolution: "bs-logger@npm:0.2.6" - dependencies: - fast-json-stable-stringify: 2.x - checksum: d34bdaf68c64bd099ab97c3ea608c9ae7d3f5faa1178b3f3f345acd94e852e608b2d4f9103fb2e503f5e69780e98293df41691b84be909b41cf5045374d54606 - languageName: node - linkType: hard - -"bs58@npm:^4.0.0": - version: 4.0.1 - resolution: "bs58@npm:4.0.1" - dependencies: - base-x: ^3.0.2 - checksum: b3c5365bb9e0c561e1a82f1a2d809a1a692059fae016be233a6127ad2f50a6b986467c3a50669ce4c18929dcccb297c5909314dd347a25a68c21b68eb3e95ac2 - languageName: node - linkType: hard - -"bs58check@npm:^2.1.2": - version: 2.1.2 - resolution: "bs58check@npm:2.1.2" - dependencies: - bs58: ^4.0.0 - create-hash: ^1.1.0 - safe-buffer: ^5.1.2 - checksum: 43bdf08a5dd04581b78f040bc4169480e17008da482ffe2a6507327bbc4fc5c28de0501f7faf22901cfe57fbca79cbb202ca529003fedb4cb8dccd265b38e54d - languageName: node - linkType: hard - -"bser@npm:2.1.1": - version: 2.1.1 - resolution: "bser@npm:2.1.1" - dependencies: - node-int64: ^0.4.0 - checksum: 9ba4dc58ce86300c862bffc3ae91f00b2a03b01ee07f3564beeeaf82aa243b8b03ba53f123b0b842c190d4399b94697970c8e7cf7b1ea44b61aa28c3526a4449 - languageName: node - linkType: hard - -"btoa@npm:^1.2.1": - version: 1.2.1 - resolution: "btoa@npm:1.2.1" - bin: - btoa: bin/btoa.js - checksum: afbf004fb1b1d530e053ffa66ef5bd3878b101c59d808ac947fcff96810b4452abba2b54be687adadea2ba9efc7af48b04228742789bf824ef93f103767e690c - languageName: node - linkType: hard - -"buffer-alloc-unsafe@npm:^1.1.0": - version: 1.1.0 - resolution: "buffer-alloc-unsafe@npm:1.1.0" - checksum: c5e18bf51f67754ec843c9af3d4c005051aac5008a3992938dda1344e5cfec77c4b02b4ca303644d1e9a6e281765155ce6356d85c6f5ccc5cd21afc868def396 - languageName: node - linkType: hard - -"buffer-alloc@npm:^1.1.0": - version: 1.2.0 - resolution: "buffer-alloc@npm:1.2.0" - dependencies: - buffer-alloc-unsafe: ^1.1.0 - buffer-fill: ^1.0.0 - checksum: 560cd27f3cbe73c614867da373407d4506309c62fe18de45a1ce191f3785ec6ca2488d802ff82065798542422980ca25f903db078c57822218182c37c3576df5 - languageName: node - linkType: hard - -"buffer-crc32@npm:~0.2.3": - version: 0.2.13 - resolution: "buffer-crc32@npm:0.2.13" - checksum: 06252347ae6daca3453b94e4b2f1d3754a3b146a111d81c68924c22d91889a40623264e95e67955b1cb4a68cbedf317abeabb5140a9766ed248973096db5ce1c - languageName: node - linkType: hard - -"buffer-equal-constant-time@npm:1.0.1": - version: 1.0.1 - resolution: "buffer-equal-constant-time@npm:1.0.1" - checksum: 80bb945f5d782a56f374b292770901065bad21420e34936ecbe949e57724b4a13874f735850dd1cc61f078773c4fb5493a41391e7bda40d1fa388d6bd80daaab - languageName: node - linkType: hard - -"buffer-equal@npm:0.0.1": - version: 0.0.1 - resolution: "buffer-equal@npm:0.0.1" - checksum: ca4b52e6c01143529d957a78cb9a93e4257f172bbab30d9eb87c20ae085ed23c5e07f236ac051202dacbf3d17aba42e1455f84cba21ea79b67d57f2b05e9a613 - languageName: node - linkType: hard - -"buffer-equal@npm:^1.0.0": - version: 1.0.0 - resolution: "buffer-equal@npm:1.0.0" - checksum: c63a62d25ffc6f3a7064a86dd0d92d93a32d03b14f22d17374790bc10e94bca2312302895fdd28a2b0060999d4385cf90cbf6ad1a6678065156c664016d3be45 - languageName: node - linkType: hard - -"buffer-fill@npm:^1.0.0": - version: 1.0.0 - resolution: "buffer-fill@npm:1.0.0" - checksum: c29b4723ddeab01e74b5d3b982a0c6828f2ded49cef049ddca3dac661c874ecdbcecb5dd8380cf0f4adbeb8cff90a7de724126750a1f1e5ebd4eb6c59a1315b1 - languageName: node - linkType: hard - -"buffer-from@npm:^1.0.0": - version: 1.1.2 - resolution: "buffer-from@npm:1.1.2" - checksum: 0448524a562b37d4d7ed9efd91685a5b77a50672c556ea254ac9a6d30e3403a517d8981f10e565db24e8339413b43c97ca2951f10e399c6125a0d8911f5679bb - languageName: node - linkType: hard - -"buffer-reverse@npm:^1.0.1": - version: 1.0.1 - resolution: "buffer-reverse@npm:1.0.1" - checksum: e350872a89b17af0a7e1bd7a73239a535164f3f010b0800add44f2e52bd0511548dc5b96c20309effba969868c385023d2d02a0add6155f6a76da7b3073b77bd - languageName: node - linkType: hard - -"buffer-xor@npm:^1.0.3": - version: 1.0.3 - resolution: "buffer-xor@npm:1.0.3" - checksum: 10c520df29d62fa6e785e2800e586a20fc4f6dfad84bcdbd12e1e8a83856de1cb75c7ebd7abe6d036bbfab738a6cf18a3ae9c8e5a2e2eb3167ca7399ce65373a - languageName: node - linkType: hard - -"buffer@npm:6.0.3, buffer@npm:^6.0.3": - version: 6.0.3 - resolution: "buffer@npm:6.0.3" - dependencies: - base64-js: ^1.3.1 - ieee754: ^1.2.1 - checksum: 5ad23293d9a731e4318e420025800b42bf0d264004c0286c8cc010af7a270c7a0f6522e84f54b9ad65cbd6db20b8badbfd8d2ebf4f80fa03dab093b89e68c3f9 - languageName: node - linkType: hard - -"buffer@npm:^5.2.0, buffer@npm:^5.4.3, buffer@npm:^5.5.0, buffer@npm:^5.7.1": - version: 5.7.1 - resolution: "buffer@npm:5.7.1" - dependencies: - base64-js: ^1.3.1 - ieee754: ^1.1.13 - checksum: e2cf8429e1c4c7b8cbd30834ac09bd61da46ce35f5c22a78e6c2f04497d6d25541b16881e30a019c6fd3154150650ccee27a308eff3e26229d788bbdeb08ab84 - languageName: node - linkType: hard - -"bufferutil@npm:^4.0.8": - version: 4.0.8 - resolution: "bufferutil@npm:4.0.8" - dependencies: - node-gyp: latest - node-gyp-build: ^4.3.0 - checksum: 7e9a46f1867dca72fda350966eb468eca77f4d623407b0650913fadf73d5750d883147d6e5e21c56f9d3b0bdc35d5474e80a600b9f31ec781315b4d2469ef087 - languageName: node - linkType: hard - -"buildcheck@npm:~0.0.6": - version: 0.0.6 - resolution: "buildcheck@npm:0.0.6" - checksum: ad61759dc98d62e931df2c9f54ccac7b522e600c6e13bdcfdc2c9a872a818648c87765ee209c850f022174da4dd7c6a450c00357c5391705d26b9c5807c2a076 - languageName: node - linkType: hard - -"builtin-modules@npm:^3.1.0": - version: 3.3.0 - resolution: "builtin-modules@npm:3.3.0" - checksum: db021755d7ed8be048f25668fe2117620861ef6703ea2c65ed2779c9e3636d5c3b82325bd912244293959ff3ae303afa3471f6a15bf5060c103e4cc3a839749d - languageName: node - linkType: hard - -"builtin-status-codes@npm:^3.0.0": - version: 3.0.0 - resolution: "builtin-status-codes@npm:3.0.0" - checksum: 1119429cf4b0d57bf76b248ad6f529167d343156ebbcc4d4e4ad600484f6bc63002595cbb61b67ad03ce55cd1d3c4711c03bbf198bf24653b8392420482f3773 - languageName: node - linkType: hard - -"builtins@npm:^1.0.3": - version: 1.0.3 - resolution: "builtins@npm:1.0.3" - checksum: 47ce94f7eee0e644969da1f1a28e5f29bd2e48b25b2bbb61164c345881086e29464ccb1fb88dbc155ea26e8b1f5fc8a923b26c8c1ed0935b67b644d410674513 - languageName: node - linkType: hard - -"busboy@npm:^1.6.0": - version: 1.6.0 - resolution: "busboy@npm:1.6.0" - dependencies: - streamsearch: ^1.1.0 - checksum: 32801e2c0164e12106bf236291a00795c3c4e4b709ae02132883fe8478ba2ae23743b11c5735a0aae8afe65ac4b6ca4568b91f0d9fed1fdbc32ede824a73746e - languageName: node - linkType: hard - -"bytes@npm:3.0.0": - version: 3.0.0 - resolution: "bytes@npm:3.0.0" - checksum: a2b386dd8188849a5325f58eef69c3b73c51801c08ffc6963eddc9be244089ba32d19347caf6d145c86f315ae1b1fc7061a32b0c1aa6379e6a719090287ed101 - languageName: node - linkType: hard - -"bytes@npm:3.1.2": - version: 3.1.2 - resolution: "bytes@npm:3.1.2" - checksum: e4bcd3948d289c5127591fbedf10c0b639ccbf00243504e4e127374a15c3bc8eed0d28d4aaab08ff6f1cf2abc0cce6ba3085ed32f4f90e82a5683ce0014e1b6e - languageName: node - linkType: hard - -"cac@npm:^6.7.14": - version: 6.7.14 - resolution: "cac@npm:6.7.14" - checksum: 45a2496a9443abbe7f52a49b22fbe51b1905eff46e03fd5e6c98e3f85077be3f8949685a1849b1a9cd2bc3e5567dfebcf64f01ce01847baf918f1b37c839791a - languageName: node - linkType: hard - -"cacache@npm:^16.1.0": - version: 16.1.3 - resolution: "cacache@npm:16.1.3" - dependencies: - "@npmcli/fs": ^2.1.0 - "@npmcli/move-file": ^2.0.0 - chownr: ^2.0.0 - fs-minipass: ^2.1.0 - glob: ^8.0.1 - infer-owner: ^1.0.4 - lru-cache: ^7.7.1 - minipass: ^3.1.6 - minipass-collect: ^1.0.2 - minipass-flush: ^1.0.5 - minipass-pipeline: ^1.2.4 - mkdirp: ^1.0.4 - p-map: ^4.0.0 - promise-inflight: ^1.0.1 - rimraf: ^3.0.2 - ssri: ^9.0.0 - tar: ^6.1.11 - unique-filename: ^2.0.0 - checksum: d91409e6e57d7d9a3a25e5dcc589c84e75b178ae8ea7de05cbf6b783f77a5fae938f6e8fda6f5257ed70000be27a681e1e44829251bfffe4c10216002f8f14e6 - languageName: node - linkType: hard - -"cacache@npm:^18.0.2": - version: 18.0.4 - resolution: "cacache@npm:18.0.4" - dependencies: - "@npmcli/fs": ^3.1.0 - fs-minipass: ^3.0.0 - glob: ^10.2.2 - lru-cache: ^10.0.1 - minipass: ^7.0.3 - minipass-collect: ^2.0.1 - minipass-flush: ^1.0.5 - minipass-pipeline: ^1.2.4 - p-map: ^4.0.0 - ssri: ^10.0.0 - tar: ^6.1.11 - unique-filename: ^3.0.0 - checksum: b7422c113b4ec750f33beeca0f426a0024c28e3172f332218f48f963e5b970647fa1ac05679fe5bb448832c51efea9fda4456b9a95c3a1af1105fe6c1833cde2 - languageName: node - linkType: hard - -"cacheable-lookup@npm:^5.0.3": - version: 5.0.4 - resolution: "cacheable-lookup@npm:5.0.4" - checksum: 763e02cf9196bc9afccacd8c418d942fc2677f22261969a4c2c2e760fa44a2351a81557bd908291c3921fe9beb10b976ba8fa50c5ca837c5a0dd945f16468f2d - languageName: node - linkType: hard - -"cacheable-request@npm:^6.0.0": - version: 6.1.0 - resolution: "cacheable-request@npm:6.1.0" - dependencies: - clone-response: ^1.0.2 - get-stream: ^5.1.0 - http-cache-semantics: ^4.0.0 - keyv: ^3.0.0 - lowercase-keys: ^2.0.0 - normalize-url: ^4.1.0 - responselike: ^1.0.2 - checksum: b510b237b18d17e89942e9ee2d2a077cb38db03f12167fd100932dfa8fc963424bfae0bfa1598df4ae16c944a5484e43e03df8f32105b04395ee9495e9e4e9f1 - languageName: node - linkType: hard - -"cacheable-request@npm:^7.0.2": - version: 7.0.2 - resolution: "cacheable-request@npm:7.0.2" - dependencies: - clone-response: ^1.0.2 - get-stream: ^5.1.0 - http-cache-semantics: ^4.0.0 - keyv: ^4.0.0 - lowercase-keys: ^2.0.0 - normalize-url: ^6.0.1 - responselike: ^2.0.0 - checksum: 6152813982945a5c9989cb457a6c499f12edcc7ade323d2fbfd759abc860bdbd1306e08096916bb413c3c47e812f8e4c0a0cc1e112c8ce94381a960f115bc77f - languageName: node - linkType: hard - -"cachedir@npm:^2.3.0": - version: 2.4.0 - resolution: "cachedir@npm:2.4.0" - checksum: 43198514eaa61f65b5535ed29ad651f22836fba3868ed58a6a87731f05462f317d39098fa3ac778801c25455483c9b7f32a2fcad1f690a978947431f12a0f4d0 - languageName: node - linkType: hard - -"call-bind@npm:^1.0.0, call-bind@npm:^1.0.2, call-bind@npm:^1.0.5, call-bind@npm:^1.0.6, call-bind@npm:^1.0.7": - version: 1.0.7 - resolution: "call-bind@npm:1.0.7" - dependencies: - es-define-property: ^1.0.0 - es-errors: ^1.3.0 - function-bind: ^1.1.2 - get-intrinsic: ^1.2.4 - set-function-length: ^1.2.1 - checksum: 295c0c62b90dd6522e6db3b0ab1ce26bdf9e7404215bda13cfee25b626b5ff1a7761324d58d38b1ef1607fc65aca2d06e44d2e18d0dfc6c14b465b00d8660029 - languageName: node - linkType: hard - -"caller-callsite@npm:^2.0.0": - version: 2.0.0 - resolution: "caller-callsite@npm:2.0.0" - dependencies: - callsites: ^2.0.0 - checksum: b685e9d126d9247b320cfdfeb3bc8da0c4be28d8fb98c471a96bc51aab3130099898a2fe3bf0308f0fe048d64c37d6d09f563958b9afce1a1e5e63d879c128a2 - languageName: node - linkType: hard - -"caller-path@npm:^2.0.0": - version: 2.0.0 - resolution: "caller-path@npm:2.0.0" - dependencies: - caller-callsite: ^2.0.0 - checksum: 3e12ccd0c71ec10a057aac69e3ec175b721ca858c640df021ef0d25999e22f7c1d864934b596b7d47038e9b56b7ec315add042abbd15caac882998b50102fb12 - languageName: node - linkType: hard - -"callsite@npm:^1.0.0": - version: 1.0.0 - resolution: "callsite@npm:1.0.0" - checksum: 569686d622a288a4f0a827466c2f967b6d7a98f2ee1e6ada9dcf5a6802267a5e2a995d40f07113b5f95c7b2b2d5cbff4fdde590195f2a8bed24b829d048688f8 - languageName: node - linkType: hard - -"callsites@npm:^2.0.0": - version: 2.0.0 - resolution: "callsites@npm:2.0.0" - checksum: be2f67b247df913732b7dec1ec0bbfcdbaea263e5a95968b19ec7965affae9496b970e3024317e6d4baa8e28dc6ba0cec03f46fdddc2fdcc51396600e53c2623 - languageName: node - linkType: hard - -"callsites@npm:^3.0.0": - version: 3.1.0 - resolution: "callsites@npm:3.1.0" - checksum: 072d17b6abb459c2ba96598918b55868af677154bec7e73d222ef95a8fdb9bbf7dae96a8421085cdad8cd190d86653b5b6dc55a4484f2e5b2e27d5e0c3fc15b3 - languageName: node - linkType: hard - -"camel-case@npm:^4.1.2": - version: 4.1.2 - resolution: "camel-case@npm:4.1.2" - dependencies: - pascal-case: ^3.1.2 - tslib: ^2.0.3 - checksum: bcbd25cd253b3cbc69be3f535750137dbf2beb70f093bdc575f73f800acc8443d34fd52ab8f0a2413c34f1e8203139ffc88428d8863e4dfe530cfb257a379ad6 - languageName: node - linkType: hard - -"camelcase-css@npm:^2.0.1": - version: 2.0.1 - resolution: "camelcase-css@npm:2.0.1" - checksum: 1cec2b3b3dcb5026688a470b00299a8db7d904c4802845c353dbd12d9d248d3346949a814d83bfd988d4d2e5b9904c07efe76fecd195a1d4f05b543e7c0b56b1 - languageName: node - linkType: hard - -"camelcase-keys@npm:^6.2.2": - version: 6.2.2 - resolution: "camelcase-keys@npm:6.2.2" - dependencies: - camelcase: ^5.3.1 - map-obj: ^4.0.0 - quick-lru: ^4.0.1 - checksum: 43c9af1adf840471e54c68ab3e5fe8a62719a6b7dbf4e2e86886b7b0ff96112c945736342b837bd2529ec9d1c7d1934e5653318478d98e0cf22c475c04658e2a - languageName: node - linkType: hard - -"camelcase@npm:6.3.0, camelcase@npm:^6.0.0, camelcase@npm:^6.2.0, camelcase@npm:^6.2.1, camelcase@npm:^6.3.0": - version: 6.3.0 - resolution: "camelcase@npm:6.3.0" - checksum: 8c96818a9076434998511251dcb2761a94817ea17dbdc37f47ac080bd088fc62c7369429a19e2178b993497132c8cbcf5cc1f44ba963e76782ba469c0474938d - languageName: node - linkType: hard - -"camelcase@npm:^4.0.0, camelcase@npm:^4.1.0": - version: 4.1.0 - resolution: "camelcase@npm:4.1.0" - checksum: 9683356daf9b64fae4b30c91f8ceb1f34f22746e03d1804efdbe738357d38b47f206cdd71efcf2ed72018b2e88eeb8ec3f79adb09c02f1253a4b6d5d405ff2ae - languageName: node - linkType: hard - -"camelcase@npm:^5.0.0, camelcase@npm:^5.3.1": - version: 5.3.1 - resolution: "camelcase@npm:5.3.1" - checksum: e6effce26b9404e3c0f301498184f243811c30dfe6d0b9051863bd8e4034d09c8c2923794f280d6827e5aa055f6c434115ff97864a16a963366fb35fd673024b - languageName: node - linkType: hard - -"camelcase@npm:^7.0.0": - version: 7.0.1 - resolution: "camelcase@npm:7.0.1" - checksum: 86ab8f3ebf08bcdbe605a211a242f00ed30d8bfb77dab4ebb744dd36efbc84432d1c4adb28975ba87a1b8be40a80fbd1e60e2f06565315918fa7350011a26d3d - languageName: node - linkType: hard - -"camelize@npm:^1.0.0": - version: 1.0.0 - resolution: "camelize@npm:1.0.0" - checksum: 769f8d10071f57b974d9a51dc02f589dd7fb07ea6a7ecde1a57b52ae68657ba61fe85c60d50661b76c7dbb76b6474fbfd3356aee33cf5f025cd7fd6fb2811b73 - languageName: node - linkType: hard - -"caniuse-api@npm:^3.0.0": - version: 3.0.0 - resolution: "caniuse-api@npm:3.0.0" - dependencies: - browserslist: ^4.0.0 - caniuse-lite: ^1.0.0 - lodash.memoize: ^4.1.2 - lodash.uniq: ^4.5.0 - checksum: db2a229383b20d0529b6b589dde99d7b6cb56ba371366f58cbbfa2929c9f42c01f873e2b6ef641d4eda9f0b4118de77dbb2805814670bdad4234bf08e720b0b4 - languageName: node - linkType: hard - -"caniuse-lite@npm:^1.0.0, caniuse-lite@npm:^1.0.30001646, caniuse-lite@npm:^1.0.30001688": - version: 1.0.30001696 - resolution: "caniuse-lite@npm:1.0.30001696" - checksum: 079be180f364b63fb85415fa3948d1e9646aa655f8678a827e9b533712e14d727c2983397603ce7107b995226f6590d96bf26ef2032e756ef6ee09898feee5f9 - languageName: node - linkType: hard - -"canvaskit-wasm@npm:0.39.1": - version: 0.39.1 - resolution: "canvaskit-wasm@npm:0.39.1" - dependencies: - "@webgpu/types": 0.1.21 - checksum: da62926fc81f424a781e148b4d76bb5fc9b0188f136090b3b287522dc653cb002bfb406e2eff45b55fcc1cafbc7629f988e20ad6c777bab85c1bb09e1091a5e2 - languageName: node - linkType: hard - -"capital-case@npm:^1.0.4": - version: 1.0.4 - resolution: "capital-case@npm:1.0.4" - dependencies: - no-case: ^3.0.4 - tslib: ^2.0.3 - upper-case-first: ^2.0.2 - checksum: 41fa8fa87f6d24d0835a2b4a9341a3eaecb64ac29cd7c5391f35d6175a0fa98ab044e7f2602e1ec3afc886231462ed71b5b80c590b8b41af903ec2c15e5c5931 - languageName: node - linkType: hard - -"capnp-ts@npm:^0.7.0": - version: 0.7.0 - resolution: "capnp-ts@npm:0.7.0" - dependencies: - debug: ^4.3.1 - tslib: ^2.2.0 - checksum: 9ab495a887c5d5fd56afa3cc930733cd8c6c0743c52c2e79c46675eb5c7753e5578f71348628a4b3d9f03e5269bc71f811e58af18d0b0557607c4ee56189cfbb - languageName: node - linkType: hard - -"capture-stack-trace@npm:^1.0.0": - version: 1.0.1 - resolution: "capture-stack-trace@npm:1.0.1" - checksum: 493668211de1307009589aeba5c382dc8b1011a41ca02f033b5f5a489ee174323a4b31d5afdc4bd48f64e1dd23b2521ddda4dbdcd382767e140f94b555f8f332 - languageName: node - linkType: hard - -"case-sensitive-paths-webpack-plugin@npm:^2.4.0": - version: 2.4.0 - resolution: "case-sensitive-paths-webpack-plugin@npm:2.4.0" - checksum: bcf469446eeee9ac0046e30860074ebb9aa4803aab9140e6bb72b600b23b1d70635690754be4504ce35cd99cdf05226bee8d894ba362a3f5485d5f6310fc6d02 - languageName: node - linkType: hard - -"caseless@npm:~0.12.0": - version: 0.12.0 - resolution: "caseless@npm:0.12.0" - checksum: b43bd4c440aa1e8ee6baefee8063b4850fd0d7b378f6aabc796c9ec8cb26d27fb30b46885350777d9bd079c5256c0e1329ad0dc7c2817e0bb466810ebb353751 - languageName: node - linkType: hard - -"cbw-sdk@npm:@coinbase/wallet-sdk@3.9.3": - version: 3.9.3 - resolution: "@coinbase/wallet-sdk@npm:3.9.3" - dependencies: - bn.js: ^5.2.1 - buffer: ^6.0.3 - clsx: ^1.2.1 - eth-block-tracker: ^7.1.0 - eth-json-rpc-filters: ^6.0.0 - eventemitter3: ^5.0.1 - keccak: ^3.0.3 - preact: ^10.16.0 - sha.js: ^2.4.11 - checksum: c3ab1b30facbe43f6d0f7f4010e438f9c488b72f9dad768b60adbb0e4f6b057e7518e3d86c7859fdd15df187ef3f1d6212898eae4694a7d8ed0ceb05ef216eb9 - languageName: node - linkType: hard - -"chai@npm:^5.1.1": - version: 5.1.2 - resolution: "chai@npm:5.1.2" - dependencies: - assertion-error: ^2.0.1 - check-error: ^2.1.1 - deep-eql: ^5.0.1 - loupe: ^3.1.0 - pathval: ^2.0.0 - checksum: f2341967ab5632612548d372c27b46219adad3af35021d8cba2ae3c262f588de2c60cb3f004e6ad40e363a9cad6d20d0de51f00e7e9ac31cce17fb05d4efa316 - languageName: node - linkType: hard - -"chalk-template@npm:0.4.0": - version: 0.4.0 - resolution: "chalk-template@npm:0.4.0" - dependencies: - chalk: ^4.1.2 - checksum: 6c706802a79a7963cbce18f022b046fe86e438a67843151868852f80ea7346e975a6a9749991601e7e5d3b6a6c4852a04c53dc966a9a3d04031bd0e0ed53c819 - languageName: node - linkType: hard - -"chalk@npm:3.0.0, chalk@npm:^3.0.0": - version: 3.0.0 - resolution: "chalk@npm:3.0.0" - dependencies: - ansi-styles: ^4.1.0 - supports-color: ^7.1.0 - checksum: 8e3ddf3981c4da405ddbd7d9c8d91944ddf6e33d6837756979f7840a29272a69a5189ecae0ff84006750d6d1e92368d413335eab4db5476db6e6703a1d1e0505 - languageName: node - linkType: hard - -"chalk@npm:4.1.2, chalk@npm:^4.0.0, chalk@npm:^4.0.2, chalk@npm:^4.1.0, chalk@npm:^4.1.1, chalk@npm:^4.1.2": - version: 4.1.2 - resolution: "chalk@npm:4.1.2" - dependencies: - ansi-styles: ^4.1.0 - supports-color: ^7.1.0 - checksum: fe75c9d5c76a7a98d45495b91b2172fa3b7a09e0cc9370e5c8feb1c567b85c4288e2b3fded7cfdd7359ac28d6b3844feb8b82b8686842e93d23c827c417e83fc - languageName: node - linkType: hard - -"chalk@npm:5.0.1": - version: 5.0.1 - resolution: "chalk@npm:5.0.1" - checksum: 7b45300372b908f0471fbf7389ce2f5de8d85bb949026fd51a1b95b10d0ed32c7ed5aab36dd5e9d2bf3191867909b4404cef75c5f4d2d1daeeacd301dd280b76 - languageName: node - linkType: hard - -"chalk@npm:5.3.0, chalk@npm:^5.0.1, chalk@npm:^5.2.0": - version: 5.3.0 - resolution: "chalk@npm:5.3.0" - checksum: 623922e077b7d1e9dedaea6f8b9e9352921f8ae3afe739132e0e00c275971bdd331268183b2628cf4ab1727c45ea1f28d7e24ac23ce1db1eb653c414ca8a5a80 - languageName: node - linkType: hard - -"chalk@npm:^2.0.1, chalk@npm:^2.3.0, chalk@npm:^2.4.1, chalk@npm:^2.4.2": - version: 2.4.2 - resolution: "chalk@npm:2.4.2" - dependencies: - ansi-styles: ^3.2.1 - escape-string-regexp: ^1.0.5 - supports-color: ^5.3.0 - checksum: ec3661d38fe77f681200f878edbd9448821924e0f93a9cefc0e26a33b145f1027a2084bf19967160d11e1f03bfe4eaffcabf5493b89098b2782c3fe0b03d80c2 - languageName: node - linkType: hard - -"change-case-all@npm:1.0.14": - version: 1.0.14 - resolution: "change-case-all@npm:1.0.14" - dependencies: - change-case: ^4.1.2 - is-lower-case: ^2.0.2 - is-upper-case: ^2.0.2 - lower-case: ^2.0.2 - lower-case-first: ^2.0.2 - sponge-case: ^1.0.1 - swap-case: ^2.0.2 - title-case: ^3.0.3 - upper-case: ^2.0.2 - upper-case-first: ^2.0.2 - checksum: 6ff893e005e1bf115cc2969cc5ca3610f7c6ece9e90b7927ed12c980c7d3ea9a565150d246c6dba0fee21aaacbd38d69b98a4670d96b892c76f66e46616506d3 - languageName: node - linkType: hard - -"change-case-all@npm:1.0.15": - version: 1.0.15 - resolution: "change-case-all@npm:1.0.15" - dependencies: - change-case: ^4.1.2 - is-lower-case: ^2.0.2 - is-upper-case: ^2.0.2 - lower-case: ^2.0.2 - lower-case-first: ^2.0.2 - sponge-case: ^1.0.1 - swap-case: ^2.0.2 - title-case: ^3.0.3 - upper-case: ^2.0.2 - upper-case-first: ^2.0.2 - checksum: e1dabdcd8447a3690f3faf15f92979dfbc113109b50916976e1d5e518e6cfdebee4f05f54d0ca24fb79a4bf835185b59ae25e967bb3dc10bd236a775b19ecc52 - languageName: node - linkType: hard - -"change-case@npm:^4.1.2": - version: 4.1.2 - resolution: "change-case@npm:4.1.2" - dependencies: - camel-case: ^4.1.2 - capital-case: ^1.0.4 - constant-case: ^3.0.4 - dot-case: ^3.0.4 - header-case: ^2.0.4 - no-case: ^3.0.4 - param-case: ^3.0.4 - pascal-case: ^3.1.2 - path-case: ^3.0.4 - sentence-case: ^3.0.4 - snake-case: ^3.0.4 - tslib: ^2.0.3 - checksum: e4bc4a093a1f7cce8b33896665cf9e456e3bc3cc0def2ad7691b1994cfca99b3188d0a513b16855b01a6bd20692fcde12a7d4d87a5615c4c515bbbf0e651f116 - languageName: node - linkType: hard - -"char-regex@npm:^1.0.2": - version: 1.0.2 - resolution: "char-regex@npm:1.0.2" - checksum: b563e4b6039b15213114626621e7a3d12f31008bdce20f9c741d69987f62aeaace7ec30f6018890ad77b2e9b4d95324c9f5acfca58a9441e3b1dcdd1e2525d17 - languageName: node - linkType: hard - -"char-regex@npm:^2.0.0": - version: 2.0.1 - resolution: "char-regex@npm:2.0.1" - checksum: 8524c03fd7e58381dccf33babe885fe62731ae20755528b19c39945b8203479184f35247210dc9eeeef279cdbdd6511cd3182e0e1db8e4549bf2586470b7c204 - languageName: node - linkType: hard - -"character-entities-legacy@npm:^1.0.0": - version: 1.1.4 - resolution: "character-entities-legacy@npm:1.1.4" - checksum: fe03a82c154414da3a0c8ab3188e4237ec68006cbcd681cf23c7cfb9502a0e76cd30ab69a2e50857ca10d984d57de3b307680fff5328ccd427f400e559c3a811 - languageName: node - linkType: hard - -"character-entities@npm:^1.0.0": - version: 1.2.4 - resolution: "character-entities@npm:1.2.4" - checksum: e1545716571ead57beac008433c1ff69517cd8ca5b336889321c5b8ff4a99c29b65589a701e9c086cda8a5e346a67295e2684f6c7ea96819fe85cbf49bf8686d - languageName: node - linkType: hard - -"character-reference-invalid@npm:^1.0.0": - version: 1.1.4 - resolution: "character-reference-invalid@npm:1.1.4" - checksum: 20274574c70e05e2f81135f3b93285536bc8ff70f37f0809b0d17791a832838f1e49938382899ed4cb444e5bbd4314ca1415231344ba29f4222ce2ccf24fea0b - languageName: node - linkType: hard - -"chardet@npm:^0.7.0": - version: 0.7.0 - resolution: "chardet@npm:0.7.0" - checksum: 6fd5da1f5d18ff5712c1e0aed41da200d7c51c28f11b36ee3c7b483f3696dabc08927fc6b227735eb8f0e1215c9a8abd8154637f3eff8cada5959df7f58b024d - languageName: node - linkType: hard - -"charenc@npm:~0.0.1": - version: 0.0.2 - resolution: "charenc@npm:0.0.2" - checksum: 81dcadbe57e861d527faf6dd3855dc857395a1c4d6781f4847288ab23cffb7b3ee80d57c15bba7252ffe3e5e8019db767757ee7975663ad2ca0939bb8fcaf2e5 - languageName: node - linkType: hard - -"check-dependency-version-consistency@npm:^4.1.0": - version: 4.1.0 - resolution: "check-dependency-version-consistency@npm:4.1.0" - dependencies: - "@types/js-yaml": ^4.0.5 - chalk: ^5.2.0 - commander: ^10.0.1 - edit-json-file: ^1.7.0 - globby: ^13.1.4 - js-yaml: ^4.1.0 - semver: ^7.5.1 - table: ^6.8.1 - type-fest: ^3.11.0 - bin: - check-dependency-version-consistency: dist/bin/check-dependency-version-consistency.js - checksum: 13cbb451b41b05b20de70c041e4f31e64793d24cee8f51214ababf520fa07e33a029b2d51323b01d46382a33029abcead25844c9388dcaa1fe8b09dac2aebd92 - languageName: node - linkType: hard - -"check-error@npm:^2.1.1": - version: 2.1.1 - resolution: "check-error@npm:2.1.1" - checksum: d785ed17b1d4a4796b6e75c765a9a290098cf52ff9728ce0756e8ffd4293d2e419dd30c67200aee34202463b474306913f2fcfaf1890641026d9fc6966fea27a - languageName: node - linkType: hard - -"check-more-types@npm:2.24.0, check-more-types@npm:^2.24.0": - version: 2.24.0 - resolution: "check-more-types@npm:2.24.0" - checksum: b09080ec3404d20a4b0ead828994b2e5913236ef44ed3033a27062af0004cf7d2091fbde4b396bf13b7ce02fb018bc9960b48305e6ab2304cd82d73ed7a51ef4 - languageName: node - linkType: hard - -"check-types@npm:^11.2.3": - version: 11.2.3 - resolution: "check-types@npm:11.2.3" - checksum: f99ff09ae65e63cfcfa40a1275c0a70d8c43ffbf9ac35095f3bf030cc70361c92e075a9975a1144329e50b4fe4620be6bedb4568c18abc96071a3e23aed3ed8e - languageName: node - linkType: hard - -"cheerio-select@npm:^2.1.0": - version: 2.1.0 - resolution: "cheerio-select@npm:2.1.0" - dependencies: - boolbase: ^1.0.0 - css-select: ^5.1.0 - css-what: ^6.1.0 - domelementtype: ^2.3.0 - domhandler: ^5.0.3 - domutils: ^3.0.1 - checksum: 843d6d479922f28a6c5342c935aff1347491156814de63c585a6eb73baf7bb4185c1b4383a1195dca0f12e3946d737c7763bcef0b9544c515d905c5c44c5308b - languageName: node - linkType: hard - -"cheerio@npm:1.0.0-rc.12": - version: 1.0.0-rc.12 - resolution: "cheerio@npm:1.0.0-rc.12" - dependencies: - cheerio-select: ^2.1.0 - dom-serializer: ^2.0.0 - domhandler: ^5.0.3 - domutils: ^3.0.1 - htmlparser2: ^8.0.1 - parse5: ^7.0.0 - parse5-htmlparser2-tree-adapter: ^7.0.0 - checksum: 5d4c1b7a53cf22d3a2eddc0aff70cf23cbb30d01a4c79013e703a012475c02461aa1fcd99127e8d83a02216386ed6942b2c8103845fd0812300dd199e6e7e054 - languageName: node - linkType: hard - -"chokidar@npm:3.5.3": - version: 3.5.3 - resolution: "chokidar@npm:3.5.3" - dependencies: - anymatch: ~3.1.2 - braces: ~3.0.2 - fsevents: ~2.3.2 - glob-parent: ~5.1.2 - is-binary-path: ~2.1.0 - is-glob: ~4.0.1 - normalize-path: ~3.0.0 - readdirp: ~3.6.0 - dependenciesMeta: - fsevents: - optional: true - checksum: b49fcde40176ba007ff361b198a2d35df60d9bb2a5aab228279eb810feae9294a6b4649ab15981304447afe1e6ffbf4788ad5db77235dc770ab777c6e771980c - languageName: node - linkType: hard - -"chokidar@npm:^3.4.2, chokidar@npm:^3.5.1, chokidar@npm:^3.5.2, chokidar@npm:^3.5.3, chokidar@npm:^3.6.0": - version: 3.6.0 - resolution: "chokidar@npm:3.6.0" - dependencies: - anymatch: ~3.1.2 - braces: ~3.0.2 - fsevents: ~2.3.2 - glob-parent: ~5.1.2 - is-binary-path: ~2.1.0 - is-glob: ~4.0.1 - normalize-path: ~3.0.0 - readdirp: ~3.6.0 - dependenciesMeta: - fsevents: - optional: true - checksum: d2f29f499705dcd4f6f3bbed79a9ce2388cf530460122eed3b9c48efeab7a4e28739c6551fd15bec9245c6b9eeca7a32baa64694d64d9b6faeb74ddb8c4a413d - languageName: node - linkType: hard - -"chokidar@npm:^4.0.0": - version: 4.0.1 - resolution: "chokidar@npm:4.0.1" - dependencies: - readdirp: ^4.0.1 - checksum: 193da9786b0422a895d59c7552195d15c6c636e6a2293ae43d09e34e243e24ccd02d693f007c767846a65abbeae5fea6bfacb8fc2ddec4ea4d397620d552010d - languageName: node - linkType: hard - -"chownr@npm:^1.1.1, chownr@npm:^1.1.4": - version: 1.1.4 - resolution: "chownr@npm:1.1.4" - checksum: 115648f8eb38bac5e41c3857f3e663f9c39ed6480d1349977c4d96c95a47266fcacc5a5aabf3cb6c481e22d72f41992827db47301851766c4fd77ac21a4f081d - languageName: node - linkType: hard - -"chownr@npm:^2.0.0": - version: 2.0.0 - resolution: "chownr@npm:2.0.0" - checksum: c57cf9dd0791e2f18a5ee9c1a299ae6e801ff58fee96dc8bfd0dcb4738a6ce58dd252a3605b1c93c6418fe4f9d5093b28ffbf4d66648cb2a9c67eaef9679be2f - languageName: node - linkType: hard - -"chromatic@npm:^11.15.0": - version: 11.20.0 - resolution: "chromatic@npm:11.20.0" - peerDependencies: - "@chromatic-com/cypress": ^0.*.* || ^1.0.0 - "@chromatic-com/playwright": ^0.*.* || ^1.0.0 - peerDependenciesMeta: - "@chromatic-com/cypress": - optional: true - "@chromatic-com/playwright": - optional: true - bin: - chroma: dist/bin.js - chromatic: dist/bin.js - chromatic-cli: dist/bin.js - checksum: 71f4097731d6528f001527dc5dde6d4b6b5ee35b1a681e8bb38464183eedcc31c0375218a028a15f757bcdc29d256cf3e460457c977ea74e72986ed25cc56196 - languageName: node - linkType: hard - -"chrome-launcher@npm:^0.15.2": - version: 0.15.2 - resolution: "chrome-launcher@npm:0.15.2" - dependencies: - "@types/node": "*" - escape-string-regexp: ^4.0.0 - is-wsl: ^2.2.0 - lighthouse-logger: ^1.0.0 - bin: - print-chrome-path: bin/print-chrome-path.js - checksum: e1f8131b9f7bd931248ea85f413c6cdb93a0d41440ff5bf0987f36afb081d2b2c7b60ba6062ee7ae2dd9b052143f6b275b38c9eb115d11b49c3ea8829bad7db0 - languageName: node - linkType: hard - -"chrome-trace-event@npm:^1.0.2": - version: 1.0.3 - resolution: "chrome-trace-event@npm:1.0.3" - checksum: cb8b1fc7e881aaef973bd0c4a43cd353c2ad8323fb471a041e64f7c2dd849cde4aad15f8b753331a32dda45c973f032c8a03b8177fc85d60eaa75e91e08bfb97 - languageName: node - linkType: hard - -"chromium-edge-launcher@npm:^0.2.0": - version: 0.2.0 - resolution: "chromium-edge-launcher@npm:0.2.0" - dependencies: - "@types/node": "*" - escape-string-regexp: ^4.0.0 - is-wsl: ^2.2.0 - lighthouse-logger: ^1.0.0 - mkdirp: ^1.0.4 - rimraf: ^3.0.2 - checksum: 9b56d1f8f18e84e34d6da89a4d97787ef323a1ade6551dcc83a6899af17c1bfc27a844c23422a29f51c6a315d1e04e2ad12595aaf07d3822335c2fce15914feb - languageName: node - linkType: hard - -"ci-info@npm:^1.5.0": - version: 1.6.0 - resolution: "ci-info@npm:1.6.0" - checksum: dfc058f60c3889793befe77349c3cd1a5452d21bed5ff60cb34382bee7bbdccc5c4c2ff2b77eab8c411c54d84f93963dacf593b9d901b43b93b7ad2a422aa163 - languageName: node - linkType: hard - -"ci-info@npm:^2.0.0": - version: 2.0.0 - resolution: "ci-info@npm:2.0.0" - checksum: 3b374666a85ea3ca43fa49aa3a048d21c9b475c96eb13c133505d2324e7ae5efd6a454f41efe46a152269e9b6a00c9edbe63ec7fa1921957165aae16625acd67 - languageName: node - linkType: hard - -"ci-info@npm:^3.2.0, ci-info@npm:^3.3.0": - version: 3.9.0 - resolution: "ci-info@npm:3.9.0" - checksum: 6b19dc9b2966d1f8c2041a838217299718f15d6c4b63ae36e4674edd2bee48f780e94761286a56aa59eb305a85fbea4ddffb7630ec063e7ec7e7e5ad42549a87 - languageName: node - linkType: hard - -"cids@npm:1.1.6": - version: 1.1.6 - resolution: "cids@npm:1.1.6" - dependencies: - multibase: ^4.0.1 - multicodec: ^3.0.1 - multihashes: ^4.0.1 - uint8arrays: ^2.1.3 - checksum: 1a11f0fa32c6a56ad0405edd87d797008a8bee1b1c0292ced4d20e2528b7f56bc4050336bf306b27c1cbe9a1baa860ddd104aee2702c0c2f60e0f27ca4cc0fc5 - languageName: node - linkType: hard - -"cipher-base@npm:^1.0.0, cipher-base@npm:^1.0.1, cipher-base@npm:^1.0.3": - version: 1.0.4 - resolution: "cipher-base@npm:1.0.4" - dependencies: - inherits: ^2.0.1 - safe-buffer: ^5.0.1 - checksum: 47d3568dbc17431a339bad1fe7dff83ac0891be8206911ace3d3b818fc695f376df809bea406e759cdea07fff4b454fa25f1013e648851bec790c1d75763032e - languageName: node - linkType: hard - -"citty@npm:^0.1.5": - version: 0.1.5 - resolution: "citty@npm:0.1.5" - dependencies: - consola: ^3.2.3 - checksum: 9a2379fd01345500f1eb2bcc33f5e60be8379551091b43a3ba4e3a39c63a92e41453dea542ab9f2528fe9e19177ff1453c01a845a74529292af34fdafd23a5f6 - languageName: node - linkType: hard - -"cjs-module-lexer@npm:^1.0.0, cjs-module-lexer@npm:^1.2.3": - version: 1.4.1 - resolution: "cjs-module-lexer@npm:1.4.1" - checksum: 2556807a99aec1f9daac60741af96cd613a707f343174ae7967da46402c91dced411bf830d209f2e93be4cecea46fc75cecf1f17c799d7d8a9e1dd6204bfcd22 - languageName: node - linkType: hard - -"classnames@npm:^2.2.5, classnames@npm:^2.3.1": - version: 2.3.2 - resolution: "classnames@npm:2.3.2" - checksum: 2c62199789618d95545c872787137262e741f9db13328e216b093eea91c85ef2bfb152c1f9e63027204e2559a006a92eb74147d46c800a9f96297ae1d9f96f4e - languageName: node - linkType: hard - -"clean-css@npm:^5.2.2": - version: 5.3.2 - resolution: "clean-css@npm:5.3.2" - dependencies: - source-map: ~0.6.0 - checksum: 8787b281acc9878f309b5f835d410085deedfd4e126472666773040a6a8a72f472a1d24185947d23b87b1c419bf2c5ed429395d5c5ff8279c98b05d8011e9758 - languageName: node - linkType: hard - -"clean-stack@npm:^2.0.0": - version: 2.2.0 - resolution: "clean-stack@npm:2.2.0" - checksum: 2ac8cd2b2f5ec986a3c743935ec85b07bc174d5421a5efc8017e1f146a1cf5f781ae962618f416352103b32c9cd7e203276e8c28241bbe946160cab16149fb68 - languageName: node - linkType: hard - -"clean-webpack-plugin@npm:4.0.0": - version: 4.0.0 - resolution: "clean-webpack-plugin@npm:4.0.0" - dependencies: - del: ^4.1.1 - peerDependencies: - webpack: ">=4.0.0 <6.0.0" - checksum: 199425e87b8c4a24ea321ec8116408219930f2ef86e27dd4cdf0ed77ed7b8b3a6908ed5160e4e981c773e015ba1d79d3f53f2fdcfebc5dc0b68f1478dea08fff - languageName: node - linkType: hard - -"cli-boxes@npm:^1.0.0": - version: 1.0.0 - resolution: "cli-boxes@npm:1.0.0" - checksum: 101cfd6464a418a76523c332665eaf0641522f30ecc2492de48263ada6b0852333b2ed47b2998ddda621e7008471c51f597f813be798db237c33ba45b27e802a - languageName: node - linkType: hard - -"cli-boxes@npm:^2.2.1": - version: 2.2.1 - resolution: "cli-boxes@npm:2.2.1" - checksum: be79f8ec23a558b49e01311b39a1ea01243ecee30539c880cf14bf518a12e223ef40c57ead0cb44f509bffdffc5c129c746cd50d863ab879385370112af4f585 - languageName: node - linkType: hard - -"cli-boxes@npm:^3.0.0": - version: 3.0.0 - resolution: "cli-boxes@npm:3.0.0" - checksum: 637d84419d293a9eac40a1c8c96a2859e7d98b24a1a317788e13c8f441be052fc899480c6acab3acc82eaf1bccda6b7542d7cdcf5c9c3cc39227175dc098d5b2 - languageName: node - linkType: hard - -"cli-cursor@npm:^2.1.0": - version: 2.1.0 - resolution: "cli-cursor@npm:2.1.0" - dependencies: - restore-cursor: ^2.0.0 - checksum: d88e97bfdac01046a3ffe7d49f06757b3126559d7e44aa2122637eb179284dc6cd49fca2fac4f67c19faaf7e6dab716b6fe1dfcd309977407d8c7578ec2d044d - languageName: node - linkType: hard - -"cli-cursor@npm:^3.1.0": - version: 3.1.0 - resolution: "cli-cursor@npm:3.1.0" - dependencies: - restore-cursor: ^3.1.0 - checksum: 2692784c6cd2fd85cfdbd11f53aea73a463a6d64a77c3e098b2b4697a20443f430c220629e1ca3b195ea5ac4a97a74c2ee411f3807abf6df2b66211fec0c0a29 - languageName: node - linkType: hard - -"cli-cursor@npm:^4.0.0": - version: 4.0.0 - resolution: "cli-cursor@npm:4.0.0" - dependencies: - restore-cursor: ^4.0.0 - checksum: ab3f3ea2076e2176a1da29f9d64f72ec3efad51c0960898b56c8a17671365c26e67b735920530eaf7328d61f8bd41c27f46b9cf6e4e10fe2fa44b5e8c0e392cc - languageName: node - linkType: hard - -"cli-spinners@npm:^2.0.0, cli-spinners@npm:^2.5.0": - version: 2.7.0 - resolution: "cli-spinners@npm:2.7.0" - checksum: a9afaf73f58d1f951fb23742f503631b3cf513f43f4c7acb1b640100eb76bfa16efbcd1994d149ffc6603a6d75dd3d4a516a76f125f90dce437de9b16fd0ee6f - languageName: node - linkType: hard - -"cli-table3@npm:~0.6.1": - version: 0.6.3 - resolution: "cli-table3@npm:0.6.3" - dependencies: - "@colors/colors": 1.5.0 - string-width: ^4.2.0 - dependenciesMeta: - "@colors/colors": - optional: true - checksum: 09897f68467973f827c04e7eaadf13b55f8aec49ecd6647cc276386ea660059322e2dd8020a8b6b84d422dbdd619597046fa89cbbbdc95b2cea149a2df7c096c - languageName: node - linkType: hard - -"cli-truncate@npm:^2.1.0": - version: 2.1.0 - resolution: "cli-truncate@npm:2.1.0" - dependencies: - slice-ansi: ^3.0.0 - string-width: ^4.2.0 - checksum: bf1e4e6195392dc718bf9cd71f317b6300dc4a9191d052f31046b8773230ece4fa09458813bf0e3455a5e68c0690d2ea2c197d14a8b85a7b5e01c97f4b5feb5d - languageName: node - linkType: hard - -"cli-truncate@npm:^3.1.0": - version: 3.1.0 - resolution: "cli-truncate@npm:3.1.0" - dependencies: - slice-ansi: ^5.0.0 - string-width: ^5.0.0 - checksum: c3243e41974445691c63f8b405df1d5a24049dc33d324fe448dc572e561a7b772ae982692900b1a5960901cc4fc7def25a629b9c69a4208ee89d12ab3332617a - languageName: node - linkType: hard - -"cli-width@npm:^3.0.0": - version: 3.0.0 - resolution: "cli-width@npm:3.0.0" - checksum: 4c94af3769367a70e11ed69aa6095f1c600c0ff510f3921ab4045af961820d57c0233acfa8b6396037391f31b4c397e1f614d234294f979ff61430a6c166c3f6 - languageName: node - linkType: hard - -"clipanion@npm:^3.2.1": - version: 3.2.1 - resolution: "clipanion@npm:3.2.1" - dependencies: - typanion: ^3.8.0 - peerDependencies: - typanion: "*" - checksum: 448efd122ead3c802e61ba7a2002e2080c8cce01ce8a0a789d9b9e4f8fe70fd887dcf163ef8c778f5364a9e6f4b498b9f1853f709d7ed4291713e78bcfb88ee8 - languageName: node - linkType: hard - -"clipboardy@npm:3.0.0": - version: 3.0.0 - resolution: "clipboardy@npm:3.0.0" - dependencies: - arch: ^2.2.0 - execa: ^5.1.1 - is-wsl: ^2.2.0 - checksum: 2c292acb59705494cbe07d7df7c8becff4f01651514d32ebd80f4aec2d20946d8f3824aac67ecdf2d09ef21fdf0eb24b6a7f033c137ccdceedc4661c54455c94 - languageName: node - linkType: hard - -"clipboardy@npm:^4.0.0": - version: 4.0.0 - resolution: "clipboardy@npm:4.0.0" - dependencies: - execa: ^8.0.1 - is-wsl: ^3.1.0 - is64bit: ^2.0.0 - checksum: ac7fa4438451d4a509fd7163505c08be92087c1a0ab8f54f8063eb04a69191ded1b59333344e2fd60bad9688e2a3dd69e50a813bf05ebf8369fa8bf65a0f47a2 - languageName: node - linkType: hard - -"cliui@npm:^6.0.0": - version: 6.0.0 - resolution: "cliui@npm:6.0.0" - dependencies: - string-width: ^4.2.0 - strip-ansi: ^6.0.0 - wrap-ansi: ^6.2.0 - checksum: 4fcfd26d292c9f00238117f39fc797608292ae36bac2168cfee4c85923817d0607fe21b3329a8621e01aedf512c99b7eaa60e363a671ffd378df6649fb48ae42 - languageName: node - linkType: hard - -"cliui@npm:^7.0.2": - version: 7.0.4 - resolution: "cliui@npm:7.0.4" - dependencies: - string-width: ^4.2.0 - strip-ansi: ^6.0.0 - wrap-ansi: ^7.0.0 - checksum: ce2e8f578a4813806788ac399b9e866297740eecd4ad1823c27fd344d78b22c5f8597d548adbcc46f0573e43e21e751f39446c5a5e804a12aace402b7a315d7f - languageName: node - linkType: hard - -"cliui@npm:^8.0.1": - version: 8.0.1 - resolution: "cliui@npm:8.0.1" - dependencies: - string-width: ^4.2.0 - strip-ansi: ^6.0.1 - wrap-ansi: ^7.0.0 - checksum: 79648b3b0045f2e285b76fb2e24e207c6db44323581e421c3acbd0e86454cba1b37aea976ab50195a49e7384b871e6dfb2247ad7dec53c02454ac6497394cb56 - languageName: node - linkType: hard - -"clone-buffer@npm:^1.0.0": - version: 1.0.0 - resolution: "clone-buffer@npm:1.0.0" - checksum: a39a35e7fd081e0f362ba8195bd15cbc8205df1fbe4598bb4e09c1f9a13c0320a47ab8a61a8aa83561e4ed34dc07666d73254ee952ddd3985e4286b082fe63b9 - languageName: node - linkType: hard - -"clone-deep@npm:^2.0.1": - version: 2.0.2 - resolution: "clone-deep@npm:2.0.2" - dependencies: - for-own: ^1.0.0 - is-plain-object: ^2.0.4 - kind-of: ^6.0.0 - shallow-clone: ^1.0.0 - checksum: c33ae31e332cdfd477a8115c9d044984eb69bf009fce3e1f0ff002176652f572d8742aa5e6caeaf16cf5d6084e33fe51bfa482fec53f43e767b3518c797955b1 - languageName: node - linkType: hard - -"clone-deep@npm:^4.0.1": - version: 4.0.1 - resolution: "clone-deep@npm:4.0.1" - dependencies: - is-plain-object: ^2.0.4 - kind-of: ^6.0.2 - shallow-clone: ^3.0.0 - checksum: 770f912fe4e6f21873c8e8fbb1e99134db3b93da32df271d00589ea4a29dbe83a9808a322c93f3bcaf8584b8b4fa6fc269fc8032efbaa6728e0c9886c74467d2 - languageName: node - linkType: hard - -"clone-response@npm:^1.0.2": - version: 1.0.2 - resolution: "clone-response@npm:1.0.2" - dependencies: - mimic-response: ^1.0.0 - checksum: 2d0e61547fc66276e0903be9654ada422515f5a15741691352000d47e8c00c226061221074ce2c0064d12e975e84a8687cfd35d8b405750cb4e772f87b256eda - languageName: node - linkType: hard - -"clone-stats@npm:^1.0.0": - version: 1.0.0 - resolution: "clone-stats@npm:1.0.0" - checksum: 654c0425afc5c5c55a4d95b2e0c6eccdd55b5247e7a1e7cca9000b13688b96b0a157950c72c5307f9fd61f17333ad796d3cd654778f2d605438012391cc4ada5 - languageName: node - linkType: hard - -"clone@npm:^1.0.2": - version: 1.0.4 - resolution: "clone@npm:1.0.4" - checksum: d06418b7335897209e77bdd430d04f882189582e67bd1f75a04565f3f07f5b3f119a9d670c943b6697d0afb100f03b866b3b8a1f91d4d02d72c4ecf2bb64b5dd - languageName: node - linkType: hard - -"clone@npm:^2.1.1, clone@npm:^2.1.2": - version: 2.1.2 - resolution: "clone@npm:2.1.2" - checksum: aaf106e9bc025b21333e2f4c12da539b568db4925c0501a1bf4070836c9e848c892fa22c35548ce0d1132b08bbbfa17a00144fe58fccdab6fa900fec4250f67d - languageName: node - linkType: hard - -"cloneable-readable@npm:^1.0.0": - version: 1.1.3 - resolution: "cloneable-readable@npm:1.1.3" - dependencies: - inherits: ^2.0.1 - process-nextick-args: ^2.0.0 - readable-stream: ^2.3.5 - checksum: 23b3741225a80c1760dff58aafb6a45383d5ee2d42de7124e4e674387cfad2404493d685b35ebfca9098f99c296e5c5719e748c9750c13838a2016ea2d2bb83a - languageName: node - linkType: hard - -"clsx@npm:1.2.1, clsx@npm:^1.2.1": - version: 1.2.1 - resolution: "clsx@npm:1.2.1" - checksum: 30befca8019b2eb7dbad38cff6266cf543091dae2825c856a62a8ccf2c3ab9c2907c4d12b288b73101196767f66812365400a227581484a05f968b0307cfaf12 - languageName: node - linkType: hard - -"cluster-key-slot@npm:^1.1.0": - version: 1.1.2 - resolution: "cluster-key-slot@npm:1.1.2" - checksum: be0ad2d262502adc998597e83f9ded1b80f827f0452127c5a37b22dfca36bab8edf393f7b25bb626006fb9fb2436106939ede6d2d6ecf4229b96a47f27edd681 - languageName: node - linkType: hard - -"co@npm:^4.6.0": - version: 4.6.0 - resolution: "co@npm:4.6.0" - checksum: 5210d9223010eb95b29df06a91116f2cf7c8e0748a9013ed853b53f362ea0e822f1e5bb054fb3cefc645239a4cf966af1f6133a3b43f40d591f3b68ed6cf0510 - languageName: node - linkType: hard - -"coa@npm:^2.0.2": - version: 2.0.2 - resolution: "coa@npm:2.0.2" - dependencies: - "@types/q": ^1.5.1 - chalk: ^2.4.1 - q: ^1.1.2 - checksum: 44736914aac2160d3d840ed64432a90a3bb72285a0cd6a688eb5cabdf15d15a85eee0915b3f6f2a4659d5075817b1cb577340d3c9cbb47d636d59ab69f819552 - languageName: node - linkType: hard - -"code-block-writer@npm:^13.0.1": - version: 13.0.2 - resolution: "code-block-writer@npm:13.0.2" - checksum: 8052ae6f27ef73366bd5df04b6f9beced493261fcaef5cbd0f3853644b5e0aa5af18d099b96448be88ea3d000c7b180207d371044edd9fcf98fea22c9f8ba3a1 - languageName: node - linkType: hard - -"code-point-at@npm:^1.0.0": - version: 1.1.0 - resolution: "code-point-at@npm:1.1.0" - checksum: 17d5666611f9b16d64fdf48176d9b7fb1c7d1c1607a189f7e600040a11a6616982876af148230336adb7d8fe728a559f743a4e29db3747e3b1a32fa7f4529681 - languageName: node - linkType: hard - -"collapse-white-space@npm:^1.0.2": - version: 1.0.6 - resolution: "collapse-white-space@npm:1.0.6" - checksum: 9673fb797952c5c888341435596c69388b22cd5560c8cd3f40edb72734a9c820f56a7c9525166bcb7068b5d5805372e6fd0c4b9f2869782ad070cb5d3faf26e7 - languageName: node - linkType: hard - -"collect-v8-coverage@npm:^1.0.0": - version: 1.0.1 - resolution: "collect-v8-coverage@npm:1.0.1" - checksum: 4efe0a1fccd517b65478a2364b33dadd0a43fc92a56f59aaece9b6186fe5177b2de471253587de7c91516f07c7268c2f6770b6cbcffc0e0ece353b766ec87e55 - languageName: node - linkType: hard - -"color-convert@npm:^1.9.0": - version: 1.9.3 - resolution: "color-convert@npm:1.9.3" - dependencies: - color-name: 1.1.3 - checksum: fd7a64a17cde98fb923b1dd05c5f2e6f7aefda1b60d67e8d449f9328b4e53b228a428fd38bfeaeb2db2ff6b6503a776a996150b80cdf224062af08a5c8a3a203 - languageName: node - linkType: hard - -"color-convert@npm:^2.0.1": - version: 2.0.1 - resolution: "color-convert@npm:2.0.1" - dependencies: - color-name: ~1.1.4 - checksum: 79e6bdb9fd479a205c71d89574fccfb22bd9053bd98c6c4d870d65c132e5e904e6034978e55b43d69fcaa7433af2016ee203ce76eeba9cfa554b373e7f7db336 - languageName: node - linkType: hard - -"color-name@npm:1.1.3": - version: 1.1.3 - resolution: "color-name@npm:1.1.3" - checksum: 09c5d3e33d2105850153b14466501f2bfb30324a2f76568a408763a3b7433b0e50e5b4ab1947868e65cb101bb7cb75029553f2c333b6d4b8138a73fcc133d69d - languageName: node - linkType: hard - -"color-name@npm:^1.0.0, color-name@npm:^1.1.4, color-name@npm:~1.1.4": - version: 1.1.4 - resolution: "color-name@npm:1.1.4" - checksum: b0445859521eb4021cd0fb0cc1a75cecf67fceecae89b63f62b201cca8d345baf8b952c966862a9d9a2632987d4f6581f0ec8d957dfacece86f0a7919316f610 - languageName: node - linkType: hard - -"color-string@npm:^1.9.0": - version: 1.9.1 - resolution: "color-string@npm:1.9.1" - dependencies: - color-name: ^1.0.0 - simple-swizzle: ^0.2.2 - checksum: c13fe7cff7885f603f49105827d621ce87f4571d78ba28ef4a3f1a104304748f620615e6bf065ecd2145d0d9dad83a3553f52bb25ede7239d18e9f81622f1cc5 - languageName: node - linkType: hard - -"color-support@npm:^1.1.3": - version: 1.1.3 - resolution: "color-support@npm:1.1.3" - bin: - color-support: bin.js - checksum: 9b7356817670b9a13a26ca5af1c21615463b500783b739b7634a0c2047c16cef4b2865d7576875c31c3cddf9dd621fa19285e628f20198b233a5cfdda6d0793b - languageName: node - linkType: hard - -"color2k@npm:^2.0.2": - version: 2.0.3 - resolution: "color2k@npm:2.0.3" - checksum: 0748e16e43c1740045af61f44de5d181f3f7a2a9cb0d5cccdccee23d04e3f107f02aaafebb7ca3335cca1d11849c6321aba702eb2f893e993a77f65761de7661 - languageName: node - linkType: hard - -"color@npm:^4.2.3": - version: 4.2.3 - resolution: "color@npm:4.2.3" - dependencies: - color-convert: ^2.0.1 - color-string: ^1.9.0 - checksum: 0579629c02c631b426780038da929cca8e8d80a40158b09811a0112a107c62e10e4aad719843b791b1e658ab4e800558f2e87ca4522c8b32349d497ecb6adeb4 - languageName: node - linkType: hard - -"colord@npm:^2.9.1": - version: 2.9.3 - resolution: "colord@npm:2.9.3" - checksum: 95d909bfbcfd8d5605cbb5af56f2d1ce2b323990258fd7c0d2eb0e6d3bb177254d7fb8213758db56bb4ede708964f78c6b992b326615f81a18a6aaf11d64c650 - languageName: node - linkType: hard - -"colorette@npm:^1.0.7": - version: 1.4.0 - resolution: "colorette@npm:1.4.0" - checksum: 01c3c16058b182a4ab4c126a65a75faa4d38a20fa7c845090b25453acec6c371bb2c5dceb0a2338511f17902b9d1a9af0cadd8509c9403894b79311032c256c3 - languageName: node - linkType: hard - -"colorette@npm:^2.0.10, colorette@npm:^2.0.14, colorette@npm:^2.0.16, colorette@npm:^2.0.20": - version: 2.0.20 - resolution: "colorette@npm:2.0.20" - checksum: 0c016fea2b91b733eb9f4bcdb580018f52c0bc0979443dad930e5037a968237ac53d9beb98e218d2e9235834f8eebce7f8e080422d6194e957454255bde71d3d - languageName: node - linkType: hard - -"colors@npm:1.4.0": - version: 1.4.0 - resolution: "colors@npm:1.4.0" - checksum: 98aa2c2418ad87dedf25d781be69dc5fc5908e279d9d30c34d8b702e586a0474605b3a189511482b9d5ed0d20c867515d22749537f7bc546256c6014f3ebdcec - languageName: node - linkType: hard - -"combined-stream@npm:^1.0.6, combined-stream@npm:^1.0.8, combined-stream@npm:~1.0.6": - version: 1.0.8 - resolution: "combined-stream@npm:1.0.8" - dependencies: - delayed-stream: ~1.0.0 - checksum: 49fa4aeb4916567e33ea81d088f6584749fc90c7abec76fd516bf1c5aa5c79f3584b5ba3de6b86d26ddd64bae5329c4c7479343250cfe71c75bb366eae53bb7c - languageName: node - linkType: hard - -"command-exists-promise@npm:^2.0.2": - version: 2.0.2 - resolution: "command-exists-promise@npm:2.0.2" - checksum: f6674abbc7d9cc704255999adb42e8b8fe165d941de207d1df8177e1ccea2afb9ff57aad7a70f9235056dd317e45b31f9726ecb2c39826f9a1f98a50f4de1b31 - languageName: node - linkType: hard - -"command-exists@npm:^1.2.4, command-exists@npm:^1.2.8": - version: 1.2.9 - resolution: "command-exists@npm:1.2.9" - checksum: 729ae3d88a2058c93c58840f30341b7f82688a573019535d198b57a4d8cb0135ced0ad7f52b591e5b28a90feb2c675080ce916e56254a0f7c15cb2395277cac3 - languageName: node - linkType: hard - -"command-line-args@npm:^4.0.7": - version: 4.0.7 - resolution: "command-line-args@npm:4.0.7" - dependencies: - array-back: ^2.0.0 - find-replace: ^1.0.3 - typical: ^2.6.1 - bin: - command-line-args: bin/cli.js - checksum: 618109143fbca741048d54a5d31a2a5e166fbda318ed1419c1ca66877ce92ed80d6768a52a2e6392eb751f16ca7755d4014ced6f5f858a68d0cbe793bab6e3ee - languageName: node - linkType: hard - -"commander@npm:10.0.0": - version: 10.0.0 - resolution: "commander@npm:10.0.0" - checksum: 9f6495651f878213005ac744dd87a85fa3d9f2b8b90d1c19d0866d666bda7f735adfd7c2f10dfff345782e2f80ea258f98bb4efcef58e4e502f25f883940acfd - languageName: node - linkType: hard - -"commander@npm:11.0.0, commander@npm:~11.0.0": - version: 11.0.0 - resolution: "commander@npm:11.0.0" - checksum: 6621954e1e1d078b4991c1f5bbd9439ad37aa7768d6ab4842de1dbd4d222c8a27e1b8e62108b3a92988614af45031d5bb2a2aaa92951f4d0c934d1a1ac564bb4 - languageName: node - linkType: hard - -"commander@npm:7, commander@npm:^7.2.0": - version: 7.2.0 - resolution: "commander@npm:7.2.0" - checksum: 53501cbeee61d5157546c0bef0fedb6cdfc763a882136284bed9a07225f09a14b82d2a84e7637edfd1a679fb35ed9502fd58ef1d091e6287f60d790147f68ddc - languageName: node - linkType: hard - -"commander@npm:^10.0.1": - version: 10.0.1 - resolution: "commander@npm:10.0.1" - checksum: 436901d64a818295803c1996cd856621a74f30b9f9e28a588e726b2b1670665bccd7c1a77007ebf328729f0139838a88a19265858a0fa7a8728c4656796db948 - languageName: node - linkType: hard - -"commander@npm:^11.1.0": - version: 11.1.0 - resolution: "commander@npm:11.1.0" - checksum: fd1a8557c6b5b622c89ecdfde703242ab7db3b628ea5d1755784c79b8e7cb0d74d65b4a262289b533359cd58e1bfc0bf50245dfbcd2954682a6f367c828b79ef - languageName: node - linkType: hard - -"commander@npm:^12.0.0, commander@npm:^12.1.0": - version: 12.1.0 - resolution: "commander@npm:12.1.0" - checksum: 68e9818b00fc1ed9cdab9eb16905551c2b768a317ae69a5e3c43924c2b20ac9bb65b27e1cab36aeda7b6496376d4da908996ba2c0b5d79463e0fb1e77935d514 - languageName: node - linkType: hard - -"commander@npm:^2.16.0, commander@npm:^2.18.0, commander@npm:^2.20.0, commander@npm:^2.20.3, commander@npm:^2.8.1": - version: 2.20.3 - resolution: "commander@npm:2.20.3" - checksum: ab8c07884e42c3a8dbc5dd9592c606176c7eb5c1ca5ff274bcf907039b2c41de3626f684ea75ccf4d361ba004bbaff1f577d5384c155f3871e456bdf27becf9e - languageName: node - linkType: hard - -"commander@npm:^4.0.0": - version: 4.1.1 - resolution: "commander@npm:4.1.1" - checksum: d7b9913ff92cae20cb577a4ac6fcc121bd6223319e54a40f51a14740a681ad5c574fd29a57da478a5f234a6fa6c52cbf0b7c641353e03c648b1ae85ba670b977 - languageName: node - linkType: hard - -"commander@npm:^6.2.1": - version: 6.2.1 - resolution: "commander@npm:6.2.1" - checksum: d7090410c0de6bc5c67d3ca41c41760d6d268f3c799e530aafb73b7437d1826bbf0d2a3edac33f8b57cc9887b4a986dce307fa5557e109be40eadb7c43b21742 - languageName: node - linkType: hard - -"commander@npm:^8.1.0, commander@npm:^8.2.0, commander@npm:^8.3.0": - version: 8.3.0 - resolution: "commander@npm:8.3.0" - checksum: 0f82321821fc27b83bd409510bb9deeebcfa799ff0bf5d102128b500b7af22872c0c92cb6a0ebc5a4cf19c6b550fba9cedfa7329d18c6442a625f851377bacf0 - languageName: node - linkType: hard - -"commander@npm:^9.4.0, commander@npm:^9.4.1, commander@npm:^9.5.0": - version: 9.5.0 - resolution: "commander@npm:9.5.0" - checksum: c7a3e27aa59e913b54a1bafd366b88650bc41d6651f0cbe258d4ff09d43d6a7394232a4dadd0bf518b3e696fdf595db1028a0d82c785b88bd61f8a440cecfade - languageName: node - linkType: hard - -"common-path-prefix@npm:^3.0.0": - version: 3.0.0 - resolution: "common-path-prefix@npm:3.0.0" - checksum: fdb3c4f54e51e70d417ccd950c07f757582de800c0678ca388aedefefc84982039f346f9fd9a1252d08d2da9e9ef4019f580a1d1d3a10da031e4bb3c924c5818 - languageName: node - linkType: hard - -"common-tags@npm:1.8.2, common-tags@npm:^1.8.0": - version: 1.8.2 - resolution: "common-tags@npm:1.8.2" - checksum: 767a6255a84bbc47df49a60ab583053bb29a7d9687066a18500a516188a062c4e4cd52de341f22de0b07062e699b1b8fe3cfa1cb55b241cb9301aeb4f45b4dff - languageName: node - linkType: hard - -"commondir@npm:^1.0.1": - version: 1.0.1 - resolution: "commondir@npm:1.0.1" - checksum: 59715f2fc456a73f68826285718503340b9f0dd89bfffc42749906c5cf3d4277ef11ef1cca0350d0e79204f00f1f6d83851ececc9095dc88512a697ac0b9bdcb - languageName: node - linkType: hard - -"compare-func@npm:^2.0.0": - version: 2.0.0 - resolution: "compare-func@npm:2.0.0" - dependencies: - array-ify: ^1.0.0 - dot-prop: ^5.1.0 - checksum: fb71d70632baa1e93283cf9d80f30ac97f003aabee026e0b4426c9716678079ef5fea7519b84d012cbed938c476493866a38a79760564a9e21ae9433e40e6f0d - languageName: node - linkType: hard - -"component-type@npm:^1.2.1": - version: 1.2.1 - resolution: "component-type@npm:1.2.1" - checksum: 41a81f87425088c072dc99b7bd06d8c81057047a599955572bfa7f320e1f4d0b38422b2eee922e0ac6e4132376c572673dbf5eb02717898173ec11512bc06b34 - languageName: node - linkType: hard - -"compressible@npm:~2.0.16": - version: 2.0.18 - resolution: "compressible@npm:2.0.18" - dependencies: - mime-db: ">= 1.43.0 < 2" - checksum: 58321a85b375d39230405654721353f709d0c1442129e9a17081771b816302a012471a9b8f4864c7dbe02eef7f2aaac3c614795197092262e94b409c9be108f0 - languageName: node - linkType: hard - -"compression@npm:1.7.4, compression@npm:^1.7.1, compression@npm:^1.7.4": - version: 1.7.4 - resolution: "compression@npm:1.7.4" - dependencies: - accepts: ~1.3.5 - bytes: 3.0.0 - compressible: ~2.0.16 - debug: 2.6.9 - on-headers: ~1.0.2 - safe-buffer: 5.1.2 - vary: ~1.1.2 - checksum: 35c0f2eb1f28418978615dc1bc02075b34b1568f7f56c62d60f4214d4b7cc00d0f6d282b5f8a954f59872396bd770b6b15ffd8aa94c67d4bce9b8887b906999b - languageName: node - linkType: hard - -"concat-map@npm:0.0.1": - version: 0.0.1 - resolution: "concat-map@npm:0.0.1" - checksum: 902a9f5d8967a3e2faf138d5cb784b9979bad2e6db5357c5b21c568df4ebe62bcb15108af1b2253744844eb964fc023fbd9afbbbb6ddd0bcc204c6fb5b7bf3af - languageName: node - linkType: hard - -"concurrently@npm:8.2.2": - version: 8.2.2 - resolution: "concurrently@npm:8.2.2" - dependencies: - chalk: ^4.1.2 - date-fns: ^2.30.0 - lodash: ^4.17.21 - rxjs: ^7.8.1 - shell-quote: ^1.8.1 - spawn-command: 0.0.2 - supports-color: ^8.1.1 - tree-kill: ^1.2.2 - yargs: ^17.7.2 - bin: - conc: dist/bin/concurrently.js - concurrently: dist/bin/concurrently.js - checksum: 8ac774df06869773438f1bf91025180c52d5b53139bc86cf47659136c0d97461d0579c515d848d1e945d4e3e0cafe646b2ea18af8d74259b46abddcfe39b2c6c - languageName: node - linkType: hard - -"configstore@npm:^3.0.0": - version: 3.1.5 - resolution: "configstore@npm:3.1.5" - dependencies: - dot-prop: ^4.2.1 - graceful-fs: ^4.1.2 - make-dir: ^1.0.0 - unique-string: ^1.0.0 - write-file-atomic: ^2.0.0 - xdg-basedir: ^3.0.0 - checksum: 948b50af436f72723b464440f5cfe7b5bc34729bd0709892d71e09517f179773f439a185d0b7bec7acbb183e2b53df8f02176e5be26c7f15382d073740ffad67 - languageName: node - linkType: hard - -"confusing-browser-globals@npm:^1.0.11": - version: 1.0.11 - resolution: "confusing-browser-globals@npm:1.0.11" - checksum: 3afc635abd37e566477f610e7978b15753f0e84025c25d49236f1f14d480117185516bdd40d2a2167e6bed8048641a9854964b9c067e3dcdfa6b5d0ad3c3a5ef - languageName: node - linkType: hard - -"connect-history-api-fallback@npm:^2.0.0": - version: 2.0.0 - resolution: "connect-history-api-fallback@npm:2.0.0" - checksum: dc5368690f4a5c413889792f8df70d5941ca9da44523cde3f87af0745faee5ee16afb8195434550f0504726642734f2683d6c07f8b460f828a12c45fbd4c9a68 - languageName: node - linkType: hard - -"connect@npm:^3.6.5, connect@npm:^3.7.0": - version: 3.7.0 - resolution: "connect@npm:3.7.0" - dependencies: - debug: 2.6.9 - finalhandler: 1.1.2 - parseurl: ~1.3.3 - utils-merge: 1.0.1 - checksum: 96e1c4effcf219b065c7823e57351c94366d2e2a6952fa95e8212bffb35c86f1d5a3f9f6c5796d4cd3a5fdda628368b1c3cc44bf19c66cfd68fe9f9cab9177e2 - languageName: node - linkType: hard - -"consola@npm:^3.2.3": - version: 3.2.3 - resolution: "consola@npm:3.2.3" - checksum: 32ec70e177dd2385c42e38078958cc7397be91db21af90c6f9faa0b16168b49b1c61d689338604bbb2d64370b9347a35f42a9197663a913d3a405bb0ce728499 - languageName: node - linkType: hard - -"console-browserify@npm:^1.2.0": - version: 1.2.0 - resolution: "console-browserify@npm:1.2.0" - checksum: 226591eeff8ed68e451dffb924c1fb750c654d54b9059b3b261d360f369d1f8f70650adecf2c7136656236a4bfeb55c39281b5d8a55d792ebbb99efd3d848d52 - languageName: node - linkType: hard - -"console-control-strings@npm:^1.0.0, console-control-strings@npm:^1.1.0, console-control-strings@npm:~1.1.0": - version: 1.1.0 - resolution: "console-control-strings@npm:1.1.0" - checksum: 8755d76787f94e6cf79ce4666f0c5519906d7f5b02d4b884cf41e11dcd759ed69c57da0670afd9236d229a46e0f9cf519db0cd829c6dca820bb5a5c3def584ed - languageName: node - linkType: hard - -"constant-case@npm:^3.0.4": - version: 3.0.4 - resolution: "constant-case@npm:3.0.4" - dependencies: - no-case: ^3.0.4 - tslib: ^2.0.3 - upper-case: ^2.0.2 - checksum: 6c3346d51afc28d9fae922e966c68eb77a19d94858dba230dd92d7b918b37d36db50f0311e9ecf6847e43e934b1c01406a0936973376ab17ec2c471fbcfb2cf3 - languageName: node - linkType: hard - -"constants-browserify@npm:^1.0.0": - version: 1.0.0 - resolution: "constants-browserify@npm:1.0.0" - checksum: f7ac8c6d0b6e4e0c77340a1d47a3574e25abd580bfd99ad707b26ff7618596cf1a5e5ce9caf44715e9e01d4a5d12cb3b4edaf1176f34c19adb2874815a56e64f - languageName: node - linkType: hard - -"content-disposition@npm:0.5.2": - version: 0.5.2 - resolution: "content-disposition@npm:0.5.2" - checksum: 298d7da63255a38f7858ee19c7b6aae32b167e911293174b4c1349955e97e78e1d0b0d06c10e229405987275b417cf36ff65cbd4821a98bc9df4e41e9372cde7 - languageName: node - linkType: hard - -"content-disposition@npm:0.5.4": - version: 0.5.4 - resolution: "content-disposition@npm:0.5.4" - dependencies: - safe-buffer: 5.2.1 - checksum: afb9d545e296a5171d7574fcad634b2fdf698875f4006a9dd04a3e1333880c5c0c98d47b560d01216fb6505a54a2ba6a843ee3a02ec86d7e911e8315255f56c3 - languageName: node - linkType: hard - -"content-type@npm:~1.0.4": - version: 1.0.4 - resolution: "content-type@npm:1.0.4" - checksum: 3d93585fda985d1554eca5ebd251994327608d2e200978fdbfba21c0c679914d5faf266d17027de44b34a72c7b0745b18584ecccaa7e1fdfb6a68ac7114f12e0 - languageName: node - linkType: hard - -"conventional-changelog-angular@npm:^5.0.11": - version: 5.0.13 - resolution: "conventional-changelog-angular@npm:5.0.13" - dependencies: - compare-func: ^2.0.0 - q: ^1.5.1 - checksum: 6ed4972fce25a50f9f038c749cc9db501363131b0fb2efc1fccecba14e4b1c80651d0d758d4c350a609f32010c66fa343eefd49c02e79e911884be28f53f3f90 - languageName: node - linkType: hard - -"conventional-changelog-conventionalcommits@npm:^5.0.0": - version: 5.0.0 - resolution: "conventional-changelog-conventionalcommits@npm:5.0.0" - dependencies: - compare-func: ^2.0.0 - lodash: ^4.17.15 - q: ^1.5.1 - checksum: b67d12e4e0fdde5baa32c3d77af472de38646a18657b26f5543eecce041a318103092fbfcef247e2319a16957c9ac78c6ea78acc11a5db6acf74be79a28c561f - languageName: node - linkType: hard - -"conventional-commits-parser@npm:^3.2.2": - version: 3.2.4 - resolution: "conventional-commits-parser@npm:3.2.4" - dependencies: - JSONStream: ^1.0.4 - is-text-path: ^1.0.1 - lodash: ^4.17.15 - meow: ^8.0.0 - split2: ^3.0.0 - through2: ^4.0.0 - bin: - conventional-commits-parser: cli.js - checksum: 1627ff203bc9586d89e47a7fe63acecf339aba74903b9114e23d28094f79d4e2d6389bf146ae561461dcba8fc42e7bc228165d2b173f15756c43f1d32bc50bfd - languageName: node - linkType: hard - -"convert-source-map@npm:^1.4.0, convert-source-map@npm:^1.5.0, convert-source-map@npm:^1.6.0, convert-source-map@npm:^1.7.0": - version: 1.9.0 - resolution: "convert-source-map@npm:1.9.0" - checksum: dc55a1f28ddd0e9485ef13565f8f756b342f9a46c4ae18b843fe3c30c675d058d6a4823eff86d472f187b176f0adf51ea7b69ea38be34be4a63cbbf91b0593c8 - languageName: node - linkType: hard - -"convert-source-map@npm:^2.0.0": - version: 2.0.0 - resolution: "convert-source-map@npm:2.0.0" - checksum: 63ae9933be5a2b8d4509daca5124e20c14d023c820258e484e32dc324d34c2754e71297c94a05784064ad27615037ef677e3f0c00469fb55f409d2bb21261035 - languageName: node - linkType: hard - -"cookie-es@npm:^1.0.0": - version: 1.0.0 - resolution: "cookie-es@npm:1.0.0" - checksum: e8721cf4d38f3e44049c9118874b323f4f674b1c5cef84a2b888f5bf86ad720ad17b51b43150cad7535a375c24e2921da603801ad28aa6125c3d36c031b41468 - languageName: node - linkType: hard - -"cookie-signature@npm:1.0.6": - version: 1.0.6 - resolution: "cookie-signature@npm:1.0.6" - checksum: f4e1b0a98a27a0e6e66fd7ea4e4e9d8e038f624058371bf4499cfcd8f3980be9a121486995202ba3fca74fbed93a407d6d54d43a43f96fd28d0bd7a06761591a - languageName: node - linkType: hard - -"cookie@npm:0.5.0, cookie@npm:^0.5.0": - version: 0.5.0 - resolution: "cookie@npm:0.5.0" - checksum: 1f4bd2ca5765f8c9689a7e8954183f5332139eb72b6ff783d8947032ec1fdf43109852c178e21a953a30c0dd42257828185be01b49d1eb1a67fd054ca588a180 - languageName: node - linkType: hard - -"cookie@npm:^0.4.1": - version: 0.4.1 - resolution: "cookie@npm:0.4.1" - checksum: bd7c47f5d94ab70ccdfe8210cde7d725880d2fcda06d8e375afbdd82de0c8d3b73541996e9ce57d35f67f672c4ee6d60208adec06b3c5fc94cebb85196084cf8 - languageName: node - linkType: hard - -"copy-to-clipboard@npm:3.3.3": - version: 3.3.3 - resolution: "copy-to-clipboard@npm:3.3.3" - dependencies: - toggle-selection: ^1.0.6 - checksum: e0a325e39b7615108e6c1c8ac110ae7b829cdc4ee3278b1df6a0e4228c490442cc86444cd643e2da344fbc424b3aab8909e2fec82f8bc75e7e5b190b7c24eecf - languageName: node - linkType: hard - -"copy-webpack-plugin@npm:11.0.0": - version: 11.0.0 - resolution: "copy-webpack-plugin@npm:11.0.0" - dependencies: - fast-glob: ^3.2.11 - glob-parent: ^6.0.1 - globby: ^13.1.1 - normalize-path: ^3.0.0 - schema-utils: ^4.0.0 - serialize-javascript: ^6.0.0 - peerDependencies: - webpack: ^5.1.0 - checksum: df4f8743f003a29ee7dd3d9b1789998a3a99051c92afb2ba2203d3dacfa696f4e757b275560fafb8f206e520a0aa78af34b990324a0e36c2326cefdeef3ca82e - languageName: node - linkType: hard - -"core-js-compat@npm:^3.38.0, core-js-compat@npm:^3.38.1": - version: 3.40.0 - resolution: "core-js-compat@npm:3.40.0" - dependencies: - browserslist: ^4.24.3 - checksum: 7ad00607c481ab2ded13d72be9ca5db5bbf42e221a175e905fb425e1ef520864aea28736c7283f57e9552d570eb6204bed87fbc8b9eab0fcfd9a7830dacccd43 - languageName: node - linkType: hard - -"core-js-pure@npm:^3.23.3, core-js-pure@npm:^3.30.2": - version: 3.33.3 - resolution: "core-js-pure@npm:3.33.3" - checksum: 369f01a8b544f413da96c606039c1b9beea57fd7252b56524fcfa4276103e3e6a0f857452ed9cc5638e9d203763e2a6f8466c6915c95b64b88b3aa976467b325 - languageName: node - linkType: hard - -"core-js@npm:2.6.12, core-js@npm:^2.4.1": - version: 2.6.12 - resolution: "core-js@npm:2.6.12" - checksum: 44fa9934a85f8c78d61e0c8b7b22436330471ffe59ec5076fe7f324d6e8cf7f824b14b1c81ca73608b13bdb0fef035bd820989bf059767ad6fa13123bb8bd016 - languageName: node - linkType: hard - -"core-js@npm:^3.19.2, core-js@npm:^3.8.2": - version: 3.39.0 - resolution: "core-js@npm:3.39.0" - checksum: 7a3670e9a2a89e0a049daa288d742d09f6e16d27a8945c5e2ef6fc45dc57e5c4bc5db589da05947486f54ae978d14cf27bd3fb1db0b9907000a611e8af37355b - languageName: node - linkType: hard - -"core-util-is@npm:1.0.2": - version: 1.0.2 - resolution: "core-util-is@npm:1.0.2" - checksum: 7a4c925b497a2c91421e25bf76d6d8190f0b2359a9200dbeed136e63b2931d6294d3b1893eda378883ed363cd950f44a12a401384c609839ea616befb7927dab - languageName: node - linkType: hard - -"core-util-is@npm:~1.0.0": - version: 1.0.3 - resolution: "core-util-is@npm:1.0.3" - checksum: 9de8597363a8e9b9952491ebe18167e3b36e7707569eed0ebf14f8bba773611376466ae34575bca8cfe3c767890c859c74056084738f09d4e4a6f902b2ad7d99 - languageName: node - linkType: hard - -"cosmiconfig-typescript-loader@npm:^1.0.0": - version: 1.0.9 - resolution: "cosmiconfig-typescript-loader@npm:1.0.9" - dependencies: - cosmiconfig: ^7 - ts-node: ^10.7.0 - peerDependencies: - "@types/node": "*" - cosmiconfig: ">=7" - typescript: ">=3" - checksum: 26a0198e03e81a9e7e1a6ce880d7309fdd056c7a3a23b587253e6d1d1224154d3f9edf727d9c0310628e89752353211b75de151b705298b4d0741fa1740c661e - languageName: node - linkType: hard - -"cosmiconfig-typescript-loader@npm:^4.0.0": - version: 4.3.0 - resolution: "cosmiconfig-typescript-loader@npm:4.3.0" - peerDependencies: - "@types/node": "*" - cosmiconfig: ">=7" - ts-node: ">=10" - typescript: ">=3" - checksum: ea61dfd8e112cf2bb18df0ef89280bd3ae3dd5b997b4a9fc22bbabdc02513aadfbc6d4e15e922b6a9a5d987e9dad42286fa38caf77a9b8dcdbe7d4ce1c9db4fb - languageName: node - linkType: hard - -"cosmiconfig@npm:8.0.0": - version: 8.0.0 - resolution: "cosmiconfig@npm:8.0.0" - dependencies: - import-fresh: ^3.2.1 - js-yaml: ^4.1.0 - parse-json: ^5.0.0 - path-type: ^4.0.0 - checksum: ff4cdf89ac1ae52e7520816622c21a9e04380d04b82d653f5139ec581aa4f7f29e096d46770bc76c4a63c225367e88a1dfa233ea791669a35101f5f9b972c7d1 - languageName: node - linkType: hard - -"cosmiconfig@npm:^5.0.5": - version: 5.2.1 - resolution: "cosmiconfig@npm:5.2.1" - dependencies: - import-fresh: ^2.0.0 - is-directory: ^0.3.1 - js-yaml: ^3.13.1 - parse-json: ^4.0.0 - checksum: 8b6f1d3c8a5ffdf663a952f17af0761adf210b7a5933d0fe8988f3ca3a1f0e1e5cbbb74d5b419c15933dd2fdcaec31dbc5cc85cb8259a822342b93b529eff89c - languageName: node - linkType: hard - -"cosmiconfig@npm:^6.0.0": - version: 6.0.0 - resolution: "cosmiconfig@npm:6.0.0" - dependencies: - "@types/parse-json": ^4.0.0 - import-fresh: ^3.1.0 - parse-json: ^5.0.0 - path-type: ^4.0.0 - yaml: ^1.7.2 - checksum: 8eed7c854b91643ecb820767d0deb038b50780ecc3d53b0b19e03ed8aabed4ae77271198d1ae3d49c3b110867edf679f5faad924820a8d1774144a87cb6f98fc - languageName: node - linkType: hard - -"cosmiconfig@npm:^7, cosmiconfig@npm:^7.0.0, cosmiconfig@npm:^7.0.1, cosmiconfig@npm:^7.1.0": - version: 7.1.0 - resolution: "cosmiconfig@npm:7.1.0" - dependencies: - "@types/parse-json": ^4.0.0 - import-fresh: ^3.2.1 - parse-json: ^5.0.0 - path-type: ^4.0.0 - yaml: ^1.10.0 - checksum: c53bf7befc1591b2651a22414a5e786cd5f2eeaa87f3678a3d49d6069835a9d8d1aef223728e98aa8fec9a95bf831120d245096db12abe019fecb51f5696c96f - languageName: node - linkType: hard - -"cosmiconfig@npm:^8.0.0, cosmiconfig@npm:^8.1.3": - version: 8.1.3 - resolution: "cosmiconfig@npm:8.1.3" - dependencies: - import-fresh: ^3.2.1 - js-yaml: ^4.1.0 - parse-json: ^5.0.0 - path-type: ^4.0.0 - checksum: b3d277bc3a8a9e649bf4c3fc9740f4c52bf07387481302aa79839f595045368903bf26ea24a8f7f7b8b180bf46037b027c5cb63b1391ab099f3f78814a147b2b - languageName: node - linkType: hard - -"cosmiconfig@npm:^9.0.0": - version: 9.0.0 - resolution: "cosmiconfig@npm:9.0.0" - dependencies: - env-paths: ^2.2.1 - import-fresh: ^3.3.0 - js-yaml: ^4.1.0 - parse-json: ^5.2.0 - peerDependencies: - typescript: ">=4.9.5" - peerDependenciesMeta: - typescript: - optional: true - checksum: a30c424b53d442ea0bdd24cb1b3d0d8687c8dda4a17ab6afcdc439f8964438801619cdb66e8e79f63b9caa3e6586b60d8bab9ce203e72df6c5e80179b971fe8f - languageName: node - linkType: hard - -"cpu-features@npm:~0.0.9": - version: 0.0.10 - resolution: "cpu-features@npm:0.0.10" - dependencies: - buildcheck: ~0.0.6 - nan: ^2.19.0 - node-gyp: latest - checksum: ab17e25cea0b642bdcfd163d3d872be4cc7d821e854d41048557799e990d672ee1cc7bd1d4e7c4de0309b1683d4c001d36ba8569b5035d1e7e2ff2d681f681d7 - languageName: node - linkType: hard - -"crc-32@npm:^1.2.0": - version: 1.2.0 - resolution: "crc-32@npm:1.2.0" - dependencies: - exit-on-epipe: ~1.0.1 - printj: ~1.1.0 - bin: - crc32: ./bin/crc32.njs - checksum: 7bcde8bea262f6629ac3c70e20bdfa3d058dc77091705ce8620513f76f19b41fc273ddd65a716eef9b4e33fbb61ff7f9b266653d214319aef27e4223789c6b9e - languageName: node - linkType: hard - -"create-ecdh@npm:^4.0.0": - version: 4.0.4 - resolution: "create-ecdh@npm:4.0.4" - dependencies: - bn.js: ^4.1.0 - elliptic: ^6.5.3 - checksum: 0dd7fca9711d09e152375b79acf1e3f306d1a25ba87b8ff14c2fd8e68b83aafe0a7dd6c4e540c9ffbdd227a5fa1ad9b81eca1f233c38bb47770597ba247e614b - languageName: node - linkType: hard - -"create-error-class@npm:^3.0.0": - version: 3.0.2 - resolution: "create-error-class@npm:3.0.2" - dependencies: - capture-stack-trace: ^1.0.0 - checksum: 7254a6f96002d3226d3c1fec952473398761eb4fb12624c5dce6ed0017cdfad6de39b29aa7139680d7dcf416c25f2f308efda6eb6d9b7123f829b19ef8271511 - languageName: node - linkType: hard - -"create-hash@npm:^1.1.0, create-hash@npm:^1.1.2, create-hash@npm:^1.2.0": - version: 1.2.0 - resolution: "create-hash@npm:1.2.0" - dependencies: - cipher-base: ^1.0.1 - inherits: ^2.0.1 - md5.js: ^1.3.4 - ripemd160: ^2.0.1 - sha.js: ^2.4.0 - checksum: 02a6ae3bb9cd4afee3fabd846c1d8426a0e6b495560a977ba46120c473cb283be6aa1cace76b5f927cf4e499c6146fb798253e48e83d522feba807d6b722eaa9 - languageName: node - linkType: hard - -"create-hmac@npm:^1.1.0, create-hmac@npm:^1.1.4, create-hmac@npm:^1.1.7": - version: 1.1.7 - resolution: "create-hmac@npm:1.1.7" - dependencies: - cipher-base: ^1.0.3 - create-hash: ^1.1.0 - inherits: ^2.0.1 - ripemd160: ^2.0.0 - safe-buffer: ^5.0.1 - sha.js: ^2.4.8 - checksum: ba12bb2257b585a0396108c72830e85f882ab659c3320c83584b1037f8ab72415095167ced80dc4ce8e446a8ecc4b2acf36d87befe0707d73b26cf9dc77440ed - languageName: node - linkType: hard - -"create-jest@npm:^29.7.0": - version: 29.7.0 - resolution: "create-jest@npm:29.7.0" - dependencies: - "@jest/types": ^29.6.3 - chalk: ^4.0.0 - exit: ^0.1.2 - graceful-fs: ^4.2.9 - jest-config: ^29.7.0 - jest-util: ^29.7.0 - prompts: ^2.0.1 - bin: - create-jest: bin/create-jest.js - checksum: 1427d49458adcd88547ef6fa39041e1fe9033a661293aa8d2c3aa1b4967cb5bf4f0c00436c7a61816558f28ba2ba81a94d5c962e8022ea9a883978fc8e1f2945 - languageName: node - linkType: hard - -"create-require@npm:^1.1.0": - version: 1.1.1 - resolution: "create-require@npm:1.1.1" - checksum: a9a1503d4390d8b59ad86f4607de7870b39cad43d929813599a23714831e81c520bddf61bcdd1f8e30f05fd3a2b71ae8538e946eb2786dc65c2bbc520f692eff - languageName: node - linkType: hard - -"cross-fetch@npm:3.0.4": - version: 3.0.4 - resolution: "cross-fetch@npm:3.0.4" - dependencies: - node-fetch: 2.6.0 - whatwg-fetch: 3.0.0 - checksum: beea2f418be32544f8e7acd66ecea67f1d88efd0188a26bccfe0d2fe3b5a9d044aa329c23eadea5f1e25c15d56b7a956c3edc5ec1c2bfa5cb293e01932e9b2c0 - languageName: node - linkType: hard - -"cross-fetch@npm:3.1.5": - version: 3.1.5 - resolution: "cross-fetch@npm:3.1.5" - dependencies: - node-fetch: 2.6.7 - checksum: f6b8c6ee3ef993ace6277fd789c71b6acf1b504fd5f5c7128df4ef2f125a429e29cd62dc8c127523f04a5f2fa4771ed80e3f3d9695617f441425045f505cf3bb - languageName: node - linkType: hard - -"cross-fetch@npm:^3.0.4, cross-fetch@npm:^3.1.4, cross-fetch@npm:^3.1.5": - version: 3.1.8 - resolution: "cross-fetch@npm:3.1.8" - dependencies: - node-fetch: ^2.6.12 - checksum: 78f993fa099eaaa041122ab037fe9503ecbbcb9daef234d1d2e0b9230a983f64d645d088c464e21a247b825a08dc444a6e7064adfa93536d3a9454b4745b3632 - languageName: node - linkType: hard - -"cross-fetch@npm:^4.0.0": - version: 4.0.0 - resolution: "cross-fetch@npm:4.0.0" - dependencies: - node-fetch: ^2.6.12 - checksum: ecca4f37ffa0e8283e7a8a590926b66713a7ef7892757aa36c2d20ffa27b0ac5c60dcf453119c809abe5923fc0bae3702a4d896bfb406ef1077b0d0018213e24 - languageName: node - linkType: hard - -"cross-inspect@npm:1.0.0": - version: 1.0.0 - resolution: "cross-inspect@npm:1.0.0" - dependencies: - tslib: ^2.4.0 - checksum: 975c81799549627027254eb70f1c349cefb14435d580bea6f351f510c839dcb1a9288983407bac2ad317e6eff29cf1e99299606da21f404562bfa64cec502239 - languageName: node - linkType: hard - -"cross-spawn@npm:^5.0.1, cross-spawn@npm:^5.1.0": - version: 5.1.0 - resolution: "cross-spawn@npm:5.1.0" - dependencies: - lru-cache: ^4.0.1 - shebang-command: ^1.2.0 - which: ^1.2.9 - checksum: 726939c9954fc70c20e538923feaaa33bebc253247d13021737c3c7f68cdc3e0a57f720c0fe75057c0387995349f3f12e20e9bfdbf12274db28019c7ea4ec166 - languageName: node - linkType: hard - -"cross-spawn@npm:^6.0.0, cross-spawn@npm:^6.0.5": - version: 6.0.5 - resolution: "cross-spawn@npm:6.0.5" - dependencies: - nice-try: ^1.0.4 - path-key: ^2.0.1 - semver: ^5.5.0 - shebang-command: ^1.2.0 - which: ^1.2.9 - checksum: f893bb0d96cd3d5751d04e67145bdddf25f99449531a72e82dcbbd42796bbc8268c1076c6b3ea51d4d455839902804b94bc45dfb37ecbb32ea8e54a6741c3ab9 - languageName: node - linkType: hard - -"cross-spawn@npm:^7.0.0, cross-spawn@npm:^7.0.2, cross-spawn@npm:^7.0.3": - version: 7.0.3 - resolution: "cross-spawn@npm:7.0.3" - dependencies: - path-key: ^3.1.0 - shebang-command: ^2.0.0 - which: ^2.0.1 - checksum: 671cc7c7288c3a8406f3c69a3ae2fc85555c04169e9d611def9a675635472614f1c0ed0ef80955d5b6d4e724f6ced67f0ad1bb006c2ea643488fcfef994d7f52 - languageName: node - linkType: hard - -"crypt@npm:~0.0.1": - version: 0.0.2 - resolution: "crypt@npm:0.0.2" - checksum: baf4c7bbe05df656ec230018af8cf7dbe8c14b36b98726939cef008d473f6fe7a4fad906cfea4062c93af516f1550a3f43ceb4d6615329612c6511378ed9fe34 - languageName: node - linkType: hard - -"crypto-browserify@npm:^3.12.0": - version: 3.12.0 - resolution: "crypto-browserify@npm:3.12.0" - dependencies: - browserify-cipher: ^1.0.0 - browserify-sign: ^4.0.0 - create-ecdh: ^4.0.0 - create-hash: ^1.1.0 - create-hmac: ^1.1.0 - diffie-hellman: ^5.0.0 - inherits: ^2.0.1 - pbkdf2: ^3.0.3 - public-encrypt: ^4.0.0 - randombytes: ^2.0.0 - randomfill: ^1.0.3 - checksum: c1609af82605474262f3eaa07daa0b2140026bd264ab316d4bf1170272570dbe02f0c49e29407fe0d3634f96c507c27a19a6765fb856fed854a625f9d15618e2 - languageName: node - linkType: hard - -"crypto-js@npm:^4.2.0": - version: 4.2.0 - resolution: "crypto-js@npm:4.2.0" - checksum: f051666dbc077c8324777f44fbd3aaea2986f198fe85092535130d17026c7c2ccf2d23ee5b29b36f7a4a07312db2fae23c9094b644cc35f7858b1b4fcaf27774 - languageName: node - linkType: hard - -"crypto-random-string@npm:^1.0.0": - version: 1.0.0 - resolution: "crypto-random-string@npm:1.0.0" - checksum: 6fc61a46c18547b49a93da24f4559c4a1c859f4ee730ecc9533c1ba89fa2a9e9d81f390c2789467afbbd0d1c55a6e96a71e4716b6cd3e77736ed5fced7a2df9a - languageName: node - linkType: hard - -"crypto-random-string@npm:^2.0.0": - version: 2.0.0 - resolution: "crypto-random-string@npm:2.0.0" - checksum: 0283879f55e7c16fdceacc181f87a0a65c53bc16ffe1d58b9d19a6277adcd71900d02bb2c4843dd55e78c51e30e89b0fec618a7f170ebcc95b33182c28f05fd6 - languageName: node - linkType: hard - -"css-background-parser@npm:^0.1.0": - version: 0.1.0 - resolution: "css-background-parser@npm:0.1.0" - checksum: cf53bef8d5df8538af7179f787fe04f4ac53c60089b338bf167b3e18be13817e395d48e303ca13493927b6fc11b4c24db2b144054c8ed3a55a044c6d177a08a5 - languageName: node - linkType: hard - -"css-blank-pseudo@npm:^3.0.3": - version: 3.0.3 - resolution: "css-blank-pseudo@npm:3.0.3" - dependencies: - postcss-selector-parser: ^6.0.9 - peerDependencies: - postcss: ^8.4 - bin: - css-blank-pseudo: dist/cli.cjs - checksum: 9be0a13885a99d8ba9e1f45ea66e801d4da75b58c1c3c516a40772fa3a93ef9952b15dcac0418acbb6c89daaae0572819647701b8e553a02972826e33d4cd67f - languageName: node - linkType: hard - -"css-box-shadow@npm:1.0.0-3": - version: 1.0.0-3 - resolution: "css-box-shadow@npm:1.0.0-3" - checksum: 1b7f15b291261023bb57e8718849951f313ee54e5cc3c72a90fac8d141138ea73562ad28006533f4ed92cb672ccbba2d6483ecb187a6c7f800936b006ba27925 - languageName: node - linkType: hard - -"css-color-keywords@npm:^1.0.0": - version: 1.0.0 - resolution: "css-color-keywords@npm:1.0.0" - checksum: 8f125e3ad477bd03c77b533044bd9e8a6f7c0da52d49bbc0bbe38327b3829d6ba04d368ca49dd9ff3b667d2fc8f1698d891c198bbf8feade1a5501bf5a296408 - languageName: node - linkType: hard - -"css-declaration-sorter@npm:^6.3.1": - version: 6.4.1 - resolution: "css-declaration-sorter@npm:6.4.1" - peerDependencies: - postcss: ^8.0.9 - checksum: cbdc9e0d481011b1a28fd5b60d4eb55fe204391d31a0b1b490b2cecf4baa85810f9b8c48adab4df644f4718104ed3ed72c64a9745e3216173767bf4aeca7f9b8 - languageName: node - linkType: hard - -"css-has-pseudo@npm:^3.0.4": - version: 3.0.4 - resolution: "css-has-pseudo@npm:3.0.4" - dependencies: - postcss-selector-parser: ^6.0.9 - peerDependencies: - postcss: ^8.4 - bin: - css-has-pseudo: dist/cli.cjs - checksum: 8f165d68f6621891d9fa1d874794916a52ed8847dfbec591523ad68774650cc1eae062ba08f59514666e04aeba27be72c9b211892f3a187c5ba6e287bd4260e7 - languageName: node - linkType: hard - -"css-in-js-utils@npm:^3.1.0": - version: 3.1.0 - resolution: "css-in-js-utils@npm:3.1.0" - dependencies: - hyphenate-style-name: ^1.0.3 - checksum: 066318e918c04a5e5bce46b38fe81052ea6ac051bcc6d3c369a1d59ceb1546cb2b6086901ab5d22be084122ee3732169996a3dfb04d3406eaee205af77aec61b - languageName: node - linkType: hard - -"css-loader@npm:6.11.0, css-loader@npm:^6.5.1, css-loader@npm:^6.7.1": - version: 6.11.0 - resolution: "css-loader@npm:6.11.0" - dependencies: - icss-utils: ^5.1.0 - postcss: ^8.4.33 - postcss-modules-extract-imports: ^3.1.0 - postcss-modules-local-by-default: ^4.0.5 - postcss-modules-scope: ^3.2.0 - postcss-modules-values: ^4.0.0 - postcss-value-parser: ^4.2.0 - semver: ^7.5.4 - peerDependencies: - "@rspack/core": 0.x || 1.x - webpack: ^5.0.0 - peerDependenciesMeta: - "@rspack/core": - optional: true - webpack: - optional: true - checksum: 5c8d35975a7121334905394e88e28f05df72f037dbed2fb8fec4be5f0b313ae73a13894ba791867d4a4190c35896da84a7fd0c54fb426db55d85ba5e714edbe3 - languageName: node - linkType: hard - -"css-minimizer-webpack-plugin@npm:^3.2.0": - version: 3.4.1 - resolution: "css-minimizer-webpack-plugin@npm:3.4.1" - dependencies: - cssnano: ^5.0.6 - jest-worker: ^27.0.2 - postcss: ^8.3.5 - schema-utils: ^4.0.0 - serialize-javascript: ^6.0.0 - source-map: ^0.6.1 - peerDependencies: - webpack: ^5.0.0 - peerDependenciesMeta: - "@parcel/css": - optional: true - clean-css: - optional: true - csso: - optional: true - esbuild: - optional: true - checksum: 065c6c1eadb7c99267db5d04d6f3909e9968b73c4cb79ab9e4502a5fbf1a3d564cfe6f8e0bff8e4ab00d4ed233e9c3c76a4ebe0ee89150b3d9ecb064ddf1e5e9 - languageName: node - linkType: hard - -"css-prefers-color-scheme@npm:^6.0.3": - version: 6.0.3 - resolution: "css-prefers-color-scheme@npm:6.0.3" - peerDependencies: - postcss: ^8.4 - bin: - css-prefers-color-scheme: dist/cli.cjs - checksum: 3a2b02f0454adda68861cdcaf6a0d11f462eadf165301cba61c5ec7c5f229ac261c5baa54c377d9b811ec5f21b30d72a02bc032cdad2415b3a566f08a0c47b3a - languageName: node - linkType: hard - -"css-select-base-adapter@npm:^0.1.1": - version: 0.1.1 - resolution: "css-select-base-adapter@npm:0.1.1" - checksum: c107e9cfa53a23427e4537451a67358375e656baa3322345a982d3c2751fb3904002aae7e5d72386c59f766fe6b109d1ffb43eeab1c16f069f7a3828eb17851c - languageName: node - linkType: hard - -"css-select@npm:^2.0.0": - version: 2.1.0 - resolution: "css-select@npm:2.1.0" - dependencies: - boolbase: ^1.0.0 - css-what: ^3.2.1 - domutils: ^1.7.0 - nth-check: ^1.0.2 - checksum: 0c4099910f2411e2a9103cf92ea6a4ad738b57da75bcf73d39ef2c14a00ef36e5f16cb863211c901320618b24ace74da6333442d82995cafd5040077307de462 - languageName: node - linkType: hard - -"css-select@npm:^4.1.3": - version: 4.3.0 - resolution: "css-select@npm:4.3.0" - dependencies: - boolbase: ^1.0.0 - css-what: ^6.0.1 - domhandler: ^4.3.1 - domutils: ^2.8.0 - nth-check: ^2.0.1 - checksum: d6202736839194dd7f910320032e7cfc40372f025e4bf21ca5bf6eb0a33264f322f50ba9c0adc35dadd342d3d6fae5ca244779a4873afbfa76561e343f2058e0 - languageName: node - linkType: hard - -"css-select@npm:^5.1.0": - version: 5.1.0 - resolution: "css-select@npm:5.1.0" - dependencies: - boolbase: ^1.0.0 - css-what: ^6.1.0 - domhandler: ^5.0.2 - domutils: ^3.0.1 - nth-check: ^2.0.1 - checksum: 2772c049b188d3b8a8159907192e926e11824aea525b8282981f72ba3f349cf9ecd523fdf7734875ee2cb772246c22117fc062da105b6d59afe8dcd5c99c9bda - languageName: node - linkType: hard - -"css-to-react-native@npm:^3.0.0": - version: 3.0.0 - resolution: "css-to-react-native@npm:3.0.0" - dependencies: - camelize: ^1.0.0 - css-color-keywords: ^1.0.0 - postcss-value-parser: ^4.0.2 - checksum: 98a2e9d4fbe9cabc8b744dfdd5ec108396ce497a7b860912a95b299bd52517461281810fcb707965a021a8be39adca9587184a26fb4e926211391a1557aca3c1 - languageName: node - linkType: hard - -"css-tree@npm:1.0.0-alpha.37": - version: 1.0.0-alpha.37 - resolution: "css-tree@npm:1.0.0-alpha.37" - dependencies: - mdn-data: 2.0.4 - source-map: ^0.6.1 - checksum: 0e419a1388ec0fbbe92885fba4a557f9fb0e077a2a1fad629b7245bbf7b4ef5df49e6877401b952b09b9057ffe1a3dba74f6fdfbf7b2223a5a35bce27ff2307d - languageName: node - linkType: hard - -"css-tree@npm:^1.1.2, css-tree@npm:^1.1.3": - version: 1.1.3 - resolution: "css-tree@npm:1.1.3" - dependencies: - mdn-data: 2.0.14 - source-map: ^0.6.1 - checksum: 79f9b81803991b6977b7fcb1588799270438274d89066ce08f117f5cdb5e20019b446d766c61506dd772c839df84caa16042d6076f20c97187f5abe3b50e7d1f - languageName: node - linkType: hard - -"css-tree@npm:^2.2.1": - version: 2.3.1 - resolution: "css-tree@npm:2.3.1" - dependencies: - mdn-data: 2.0.30 - source-map-js: ^1.0.1 - checksum: 493cc24b5c22b05ee5314b8a0d72d8a5869491c1458017ae5ed75aeb6c3596637dbe1b11dac2548974624adec9f7a1f3a6cf40593dc1f9185eb0e8279543fbc0 - languageName: node - linkType: hard - -"css-tree@npm:~2.2.0": - version: 2.2.1 - resolution: "css-tree@npm:2.2.1" - dependencies: - mdn-data: 2.0.28 - source-map-js: ^1.0.1 - checksum: b94aa8cc2f09e6f66c91548411fcf74badcbad3e150345074715012d16333ce573596ff5dfca03c2a87edf1924716db765120f94247e919d72753628ba3aba27 - languageName: node - linkType: hard - -"css-what@npm:^3.2.1": - version: 3.4.2 - resolution: "css-what@npm:3.4.2" - checksum: 26bb5ec3ae718393d418016365c849fa14bd0de408c735dea3ddf58146b6cc54f3b336fb4afd31d95c06ca79583acbcdfec7ee93d31ff5c1a697df135b38dfeb - languageName: node - linkType: hard - -"css-what@npm:^6.0.1, css-what@npm:^6.1.0": - version: 6.1.0 - resolution: "css-what@npm:6.1.0" - checksum: b975e547e1e90b79625918f84e67db5d33d896e6de846c9b584094e529f0c63e2ab85ee33b9daffd05bff3a146a1916bec664e18bb76dd5f66cbff9fc13b2bbe - languageName: node - linkType: hard - -"css.escape@npm:^1.5.1": - version: 1.5.1 - resolution: "css.escape@npm:1.5.1" - checksum: f6d38088d870a961794a2580b2b2af1027731bb43261cfdce14f19238a88664b351cc8978abc20f06cc6bbde725699dec8deb6fe9816b139fc3f2af28719e774 - languageName: node - linkType: hard - -"cssdb@npm:^7.1.0": - version: 7.11.2 - resolution: "cssdb@npm:7.11.2" - checksum: 79b2c3b6de1d80c7f3e40f28c06138b7f1ca27fe5d9173195cc781d8acc0261c2bdeccdf141bd035b13709655cf724c8ad4757ddf12a3d21b6d002368c9cb027 - languageName: node - linkType: hard - -"cssesc@npm:^3.0.0": - version: 3.0.0 - resolution: "cssesc@npm:3.0.0" - bin: - cssesc: bin/cssesc - checksum: f8c4ababffbc5e2ddf2fa9957dda1ee4af6048e22aeda1869d0d00843223c1b13ad3f5d88b51caa46c994225eacb636b764eb807a8883e2fb6f99b4f4e8c48b2 - languageName: node - linkType: hard - -"cssnano-preset-default@npm:^5.2.14": - version: 5.2.14 - resolution: "cssnano-preset-default@npm:5.2.14" - dependencies: - css-declaration-sorter: ^6.3.1 - cssnano-utils: ^3.1.0 - postcss-calc: ^8.2.3 - postcss-colormin: ^5.3.1 - postcss-convert-values: ^5.1.3 - postcss-discard-comments: ^5.1.2 - postcss-discard-duplicates: ^5.1.0 - postcss-discard-empty: ^5.1.1 - postcss-discard-overridden: ^5.1.0 - postcss-merge-longhand: ^5.1.7 - postcss-merge-rules: ^5.1.4 - postcss-minify-font-values: ^5.1.0 - postcss-minify-gradients: ^5.1.1 - postcss-minify-params: ^5.1.4 - postcss-minify-selectors: ^5.2.1 - postcss-normalize-charset: ^5.1.0 - postcss-normalize-display-values: ^5.1.0 - postcss-normalize-positions: ^5.1.1 - postcss-normalize-repeat-style: ^5.1.1 - postcss-normalize-string: ^5.1.0 - postcss-normalize-timing-functions: ^5.1.0 - postcss-normalize-unicode: ^5.1.1 - postcss-normalize-url: ^5.1.0 - postcss-normalize-whitespace: ^5.1.1 - postcss-ordered-values: ^5.1.3 - postcss-reduce-initial: ^5.1.2 - postcss-reduce-transforms: ^5.1.0 - postcss-svgo: ^5.1.0 - postcss-unique-selectors: ^5.1.1 - peerDependencies: - postcss: ^8.2.15 - checksum: d3bbbe3d50c6174afb28d0bdb65b511fdab33952ec84810aef58b87189f3891c34aaa8b6a6101acd5314f8acded839b43513e39a75f91a698ddc985a1b1d9e95 - languageName: node - linkType: hard - -"cssnano-utils@npm:^3.1.0": - version: 3.1.0 - resolution: "cssnano-utils@npm:3.1.0" - peerDependencies: - postcss: ^8.2.15 - checksum: 975c84ce9174cf23bb1da1e9faed8421954607e9ea76440cd3bb0c1bea7e17e490d800fca5ae2812d1d9e9d5524eef23ede0a3f52497d7ccc628e5d7321536f2 - languageName: node - linkType: hard - -"cssnano@npm:^5.0.6": - version: 5.1.15 - resolution: "cssnano@npm:5.1.15" - dependencies: - cssnano-preset-default: ^5.2.14 - lilconfig: ^2.0.3 - yaml: ^1.10.2 - peerDependencies: - postcss: ^8.2.15 - checksum: ca9e1922178617c66c2f1548824b2c7af2ecf69cc3a187fc96bf8d29251c2e84d9e4966c69cf64a2a6a057a37dff7d6d057bc8a2a0957e6ea382e452ae9d0bbb - languageName: node - linkType: hard - -"csso@npm:^4.0.2, csso@npm:^4.2.0": - version: 4.2.0 - resolution: "csso@npm:4.2.0" - dependencies: - css-tree: ^1.1.2 - checksum: 380ba9663da3bcea58dee358a0d8c4468bb6539be3c439dc266ac41c047217f52fd698fb7e4b6b6ccdfb8cf53ef4ceed8cc8ceccb8dfca2aa628319826b5b998 - languageName: node - linkType: hard - -"csso@npm:^5.0.5": - version: 5.0.5 - resolution: "csso@npm:5.0.5" - dependencies: - css-tree: ~2.2.0 - checksum: 0ad858d36bf5012ed243e9ec69962a867509061986d2ee07cc040a4b26e4d062c00d4c07e5ba8d430706ceb02dd87edd30a52b5937fd45b1b6f2119c4993d59a - languageName: node - linkType: hard - -"cssom@npm:^0.5.0": - version: 0.5.0 - resolution: "cssom@npm:0.5.0" - checksum: 823471aa30091c59e0a305927c30e7768939b6af70405808f8d2ce1ca778cddcb24722717392438329d1691f9a87cb0183b64b8d779b56a961546d54854fde01 - languageName: node - linkType: hard - -"cssom@npm:~0.3.6": - version: 0.3.8 - resolution: "cssom@npm:0.3.8" - checksum: 24beb3087c76c0d52dd458be9ee1fbc80ac771478a9baef35dd258cdeb527c68eb43204dd439692bb2b1ae5272fa5f2946d10946edab0d04f1078f85e06bc7f6 - languageName: node - linkType: hard - -"cssstyle@npm:^2.3.0": - version: 2.3.0 - resolution: "cssstyle@npm:2.3.0" - dependencies: - cssom: ~0.3.6 - checksum: 5f05e6fd2e3df0b44695c2f08b9ef38b011862b274e320665176467c0725e44a53e341bc4959a41176e83b66064ab786262e7380fd1cabeae6efee0d255bb4e3 - languageName: node - linkType: hard - -"csstype@npm:^2.5.7": - version: 2.6.21 - resolution: "csstype@npm:2.6.21" - checksum: 2ce8bc832375146eccdf6115a1f8565a27015b74cce197c35103b4494955e9516b246140425ad24103864076aa3e1257ac9bab25a06c8d931dd87a6428c9dccf - languageName: node - linkType: hard - -"csstype@npm:^3.0.2, csstype@npm:^3.0.7": - version: 3.1.2 - resolution: "csstype@npm:3.1.2" - checksum: e1a52e6c25c1314d6beef5168da704ab29c5186b877c07d822bd0806717d9a265e8493a2e35ca7e68d0f5d472d43fac1cdce70fd79fd0853dff81f3028d857b5 - languageName: node - linkType: hard - -"cypress-hardhat@npm:2.5.3": - version: 2.5.3 - resolution: "cypress-hardhat@npm:2.5.3" - dependencies: - "@uniswap/permit2-sdk": ^1.2.0 - "@uniswap/sdk-core": ">= 3" - "@uniswap/universal-router-sdk": ^1.5.4 - peerDependencies: - cypress: ^12.9.0 - ethers: ^5.1.3 - hardhat: ^2.9.6 - checksum: 6a7f15db68c878290db5886c2e566b5eb6922eab989a7056f6e22399f5e19901f51020def151f68a783b0a24e98ec7b10fa17d1569a3831f9674a93517802ca8 - languageName: node - linkType: hard - -"cypress@npm:13.7.3": - version: 13.7.3 - resolution: "cypress@npm:13.7.3" - dependencies: - "@cypress/request": ^3.0.0 - "@cypress/xvfb": ^1.2.4 - "@types/sinonjs__fake-timers": 8.1.1 - "@types/sizzle": ^2.3.2 - arch: ^2.2.0 - blob-util: ^2.0.2 - bluebird: ^3.7.2 - buffer: ^5.7.1 - cachedir: ^2.3.0 - chalk: ^4.1.0 - check-more-types: ^2.24.0 - cli-cursor: ^3.1.0 - cli-table3: ~0.6.1 - commander: ^6.2.1 - common-tags: ^1.8.0 - dayjs: ^1.10.4 - debug: ^4.3.4 - enquirer: ^2.3.6 - eventemitter2: 6.4.7 - execa: 4.1.0 - executable: ^4.1.1 - extract-zip: 2.0.1 - figures: ^3.2.0 - fs-extra: ^9.1.0 - getos: ^3.2.1 - is-ci: ^3.0.1 - is-installed-globally: ~0.4.0 - lazy-ass: ^1.6.0 - listr2: ^3.8.3 - lodash: ^4.17.21 - log-symbols: ^4.0.0 - minimist: ^1.2.8 - ospath: ^1.2.2 - pretty-bytes: ^5.6.0 - process: ^0.11.10 - proxy-from-env: 1.0.0 - request-progress: ^3.0.0 - semver: ^7.5.3 - supports-color: ^8.1.1 - tmp: ~0.2.1 - untildify: ^4.0.0 - yauzl: ^2.10.0 - bin: - cypress: bin/cypress - checksum: 618db0839893d7633771437a0109225251fc4d3c1fcf54f35e727acc1422ec811907edab2721fa3d8bbc3017df5eb974e2b96cf78d70e40eb92465b3772fa5ca - languageName: node - linkType: hard - -"d3-array@npm:2 - 3, d3-array@npm:2.10.0 - 3, d3-array@npm:2.5.0 - 3, d3-array@npm:3, d3-array@npm:^3.1.6, d3-array@npm:^3.2.0": - version: 3.2.4 - resolution: "d3-array@npm:3.2.4" - dependencies: - internmap: 1 - 2 - checksum: a5976a6d6205f69208478bb44920dd7ce3e788c9dceb86b304dbe401a4bfb42ecc8b04c20facde486e9adcb488b5d1800d49393a3f81a23902b68158e12cddd0 - languageName: node - linkType: hard - -"d3-array@npm:2, d3-array@npm:^2.3.0": - version: 2.12.1 - resolution: "d3-array@npm:2.12.1" - dependencies: - internmap: ^1.0.0 - checksum: 97853b7b523aded17078f37c67742f45d81e88dda2107ae9994c31b9e36c5fa5556c4c4cf39650436f247813602dfe31bf7ad067ff80f127a16903827f10c6eb - languageName: node - linkType: hard - -"d3-array@npm:^1.2.0": - version: 1.2.4 - resolution: "d3-array@npm:1.2.4" - checksum: d0be1fa7d72dbfac8a3bcffbb669d42bcb9128d8818d84d2b1df0c60bbe4c8e54a798be0457c55a219b399e2c2fabcbd581cbb130eb638b5436b0618d7e56000 - languageName: node - linkType: hard - -"d3-axis@npm:3": - version: 3.0.0 - resolution: "d3-axis@npm:3.0.0" - checksum: 227ddaa6d4bad083539c1ec245e2228b4620cca941997a8a650cb0af239375dc20271993127eedac66f0543f331027aca09385e1e16eed023f93eac937cddf0b - languageName: node - linkType: hard - -"d3-brush@npm:3": - version: 3.0.0 - resolution: "d3-brush@npm:3.0.0" - dependencies: - d3-dispatch: 1 - 3 - d3-drag: 2 - 3 - d3-interpolate: 1 - 3 - d3-selection: 3 - d3-transition: 3 - checksum: 1d042167769a02ac76271c71e90376d7184206e489552b7022a8ec2860209fe269db55e0a3430f3dcbe13b6fec2ff65b1adeaccba3218991b38e022390df72e3 - languageName: node - linkType: hard - -"d3-chord@npm:3": - version: 3.0.1 - resolution: "d3-chord@npm:3.0.1" - dependencies: - d3-path: 1 - 3 - checksum: ddf35d41675e0f8738600a8a2f05bf0858def413438c12cba357c5802ecc1014c80a658acbbee63cbad2a8c747912efb2358455d93e59906fe37469f1dc6b78b - languageName: node - linkType: hard - -"d3-collection@npm:1": - version: 1.0.7 - resolution: "d3-collection@npm:1.0.7" - checksum: 9c6b910a9da0efb021e294509f98263ca4f62d10b997bb30ccfb6edd582b703da36e176b968b5bac815fbb0f328e49643c38cf93b5edf8572a179ba55cf4a09d - languageName: node - linkType: hard - -"d3-color@npm:1": - version: 1.4.1 - resolution: "d3-color@npm:1.4.1" - checksum: a214b61458b5fcb7ad1a84faed0e02918037bab6be37f2d437bf0e2915cbd854d89fbf93754f17b0781c89e39d46704633d05a2bfae77e6209f0f4b140f9894b - languageName: node - linkType: hard - -"d3-color@npm:1 - 2": - version: 2.0.0 - resolution: "d3-color@npm:2.0.0" - checksum: b887354aa383937abd04fbffed3e26e5d6a788472cd3737fb10735930e427763e69fe93398663bccf88c0b53ee3e638ac6fcf0c02226b00ed9e4327c2dfbf3dc - languageName: node - linkType: hard - -"d3-color@npm:1 - 3, d3-color@npm:3": - version: 3.1.0 - resolution: "d3-color@npm:3.1.0" - checksum: 4931fbfda5d7c4b5cfa283a13c91a954f86e3b69d75ce588d06cde6c3628cebfc3af2069ccf225e982e8987c612aa7948b3932163ce15eb3c11cd7c003f3ee3b - languageName: node - linkType: hard - -"d3-contour@npm:4": - version: 4.0.2 - resolution: "d3-contour@npm:4.0.2" - dependencies: - d3-array: ^3.2.0 - checksum: 56aa082c1acf62a45b61c8d29fdd307041785aa17d9a07de7d1d848633769887a33fb6823888afa383f31c460d0f21d24756593e84e334ddb92d774214d32f1b - languageName: node - linkType: hard - -"d3-delaunay@npm:6": - version: 6.0.4 - resolution: "d3-delaunay@npm:6.0.4" - dependencies: - delaunator: 5 - checksum: ce6d267d5ef21a8aeadfe4606329fc80a22ab6e7748d47bc220bcc396ee8be84b77a5473033954c5ac4aa522d265ddc45d4165d30fe4787dd60a15ea66b9bbb4 - languageName: node - linkType: hard - -"d3-dispatch@npm:1 - 3, d3-dispatch@npm:3": - version: 3.0.1 - resolution: "d3-dispatch@npm:3.0.1" - checksum: fdfd4a230f46463e28e5b22a45dd76d03be9345b605e1b5dc7d18bd7ebf504e6c00ae123fd6d03e23d9e2711e01f0e14ea89cd0632545b9f0c00b924ba4be223 - languageName: node - linkType: hard - -"d3-drag@npm:2 - 3, d3-drag@npm:3": - version: 3.0.0 - resolution: "d3-drag@npm:3.0.0" - dependencies: - d3-dispatch: 1 - 3 - d3-selection: 3 - checksum: d297231e60ecd633b0d076a63b4052b436ddeb48b5a3a11ff68c7e41a6774565473a6b064c5e9256e88eca6439a917ab9cea76032c52d944ddbf4fd289e31111 - languageName: node - linkType: hard - -"d3-dsv@npm:1 - 3, d3-dsv@npm:3": - version: 3.0.1 - resolution: "d3-dsv@npm:3.0.1" - dependencies: - commander: 7 - iconv-lite: 0.6 - rw: 1 - bin: - csv2json: bin/dsv2json.js - csv2tsv: bin/dsv2dsv.js - dsv2dsv: bin/dsv2dsv.js - dsv2json: bin/dsv2json.js - json2csv: bin/json2dsv.js - json2dsv: bin/json2dsv.js - json2tsv: bin/json2dsv.js - tsv2csv: bin/dsv2dsv.js - tsv2json: bin/dsv2json.js - checksum: 5fc0723647269d5dccd181d74f2265920ab368a2868b0b4f55ffa2fecdfb7814390ea28622cd61ee5d9594ab262879509059544e9f815c54fe76fbfb4ffa4c8a - languageName: node - linkType: hard - -"d3-ease@npm:1 - 3, d3-ease@npm:3": - version: 3.0.1 - resolution: "d3-ease@npm:3.0.1" - checksum: 06e2ee5326d1e3545eab4e2c0f84046a123dcd3b612e68858219aa034da1160333d9ce3da20a1d3486d98cb5c2a06f7d233eee1bc19ce42d1533458bd85dedcd - languageName: node - linkType: hard - -"d3-fetch@npm:3": - version: 3.0.1 - resolution: "d3-fetch@npm:3.0.1" - dependencies: - d3-dsv: 1 - 3 - checksum: 382dcea06549ef82c8d0b719e5dc1d96286352579e3b51b20f71437f5800323315b09cf7dcfd4e1f60a41e1204deb01758470cea257d2285a7abd9dcec806984 - languageName: node - linkType: hard - -"d3-force@npm:3": - version: 3.0.0 - resolution: "d3-force@npm:3.0.0" - dependencies: - d3-dispatch: 1 - 3 - d3-quadtree: 1 - 3 - d3-timer: 1 - 3 - checksum: 6c7e96438cab62fa32aeadb0ade3297b62b51f81b1b38b0a60a5ec9fd627d74090c1189654d92df2250775f31b06812342f089f1d5947de9960a635ee3581def - languageName: node - linkType: hard - -"d3-format@npm:1": - version: 1.4.5 - resolution: "d3-format@npm:1.4.5" - checksum: 1b8b2c0bca182173bccd290a43e8b635a83fc8cfe52ec878c7bdabb997d47daac11f2b175cebbe73f807f782ad655f542bdfe18180ca5eb3498a3a82da1e06ab - languageName: node - linkType: hard - -"d3-format@npm:1 - 2": - version: 2.0.0 - resolution: "d3-format@npm:2.0.0" - checksum: c4d3c8f9941d097d514d3986f54f21434e08e5876dc08d1d65226447e8e167600d5b9210235bb03fd45327225f04f32d6e365f08f76d2f4b8bff81594851aaf7 - languageName: node - linkType: hard - -"d3-format@npm:1 - 3, d3-format@npm:3": - version: 3.1.0 - resolution: "d3-format@npm:3.1.0" - checksum: f345ec3b8ad3cab19bff5dead395bd9f5590628eb97a389b1dd89f0b204c7c4fc1d9520f13231c2c7cf14b7c9a8cf10f8ef15bde2befbab41454a569bd706ca2 - languageName: node - linkType: hard - -"d3-geo@npm:3": - version: 3.1.0 - resolution: "d3-geo@npm:3.1.0" - dependencies: - d3-array: 2.5.0 - 3 - checksum: adf82b0c105c0c5951ae0a833d4dfc479a563791ad7938579fa14e1cffd623b469d8aa7a37dc413a327fb6ac56880f3da3f6c43d4abe3c923972dd98f34f37d1 - languageName: node - linkType: hard - -"d3-hierarchy@npm:3": - version: 3.1.2 - resolution: "d3-hierarchy@npm:3.1.2" - checksum: 0fd946a8c5fd4686d43d3e11bbfc2037a145fda29d2261ccd0e36f70b66af6d7638e2c0c7112124d63fc3d3127197a00a6aecf676bd5bd392a94d7235a214263 - languageName: node - linkType: hard - -"d3-interpolate-path@npm:^2.2.3": - version: 2.3.0 - resolution: "d3-interpolate-path@npm:2.3.0" - checksum: bcc9923675098fff76f23a37e83cd8fa5ca10422e54e5f09653e3294f7b237b69868187e7becf53e17c3982028231b9bb533e9d9285229409e5c700668824241 - languageName: node - linkType: hard - -"d3-interpolate@npm:1 - 3, d3-interpolate@npm:1.2.0 - 3, d3-interpolate@npm:3": - version: 3.0.1 - resolution: "d3-interpolate@npm:3.0.1" - dependencies: - d3-color: 1 - 3 - checksum: a42ba314e295e95e5365eff0f604834e67e4a3b3c7102458781c477bd67e9b24b6bb9d8e41ff5521050a3f2c7c0c4bbbb6e187fd586daa3980943095b267e78b - languageName: node - linkType: hard - -"d3-interpolate@npm:1, d3-interpolate@npm:^1.4.0": - version: 1.4.0 - resolution: "d3-interpolate@npm:1.4.0" - dependencies: - d3-color: 1 - checksum: d98988bd1e2f59d01f100d0a19315ad8f82ef022aa09a65aff76f747a44f9b52f2d64c6578b8f47e01f2b14a8f0ef88f5460d11173c0dd2d58238c217ac0ec03 - languageName: node - linkType: hard - -"d3-interpolate@npm:1.2.0 - 2": - version: 2.0.1 - resolution: "d3-interpolate@npm:2.0.1" - dependencies: - d3-color: 1 - 2 - checksum: 4a2018ac34fbcc3e0e7241e117087ca1b2274b8b33673913658623efacc5db013b8d876586d167b23e3145bdb34ec8e441d301299b082e1a90985b2f18d4299c - languageName: node - linkType: hard - -"d3-path@npm:1 - 3, d3-path@npm:3, d3-path@npm:^3.1.0": - version: 3.1.0 - resolution: "d3-path@npm:3.1.0" - checksum: 2306f1bd9191e1eac895ec13e3064f732a85f243d6e627d242a313f9777756838a2215ea11562f0c7630c7c3b16a19ec1fe0948b1c82f3317fac55882f6ee5d8 - languageName: node - linkType: hard - -"d3-path@npm:1, d3-path@npm:^1.0.5": - version: 1.0.9 - resolution: "d3-path@npm:1.0.9" - checksum: d4382573baf9509a143f40944baeff9fead136926aed6872f7ead5b3555d68925f8a37935841dd51f1d70b65a294fe35c065b0906fb6e42109295f6598fc16d0 - languageName: node - linkType: hard - -"d3-polygon@npm:3": - version: 3.0.1 - resolution: "d3-polygon@npm:3.0.1" - checksum: 0b85c532517895544683849768a2c377cee3801ef8ccf3fa9693c8871dd21a0c1a2a0fc75ff54192f0ba2c562b0da2bc27f5bf959dfafc7fa23573b574865d2c - languageName: node - linkType: hard - -"d3-quadtree@npm:1 - 3, d3-quadtree@npm:3": - version: 3.0.1 - resolution: "d3-quadtree@npm:3.0.1" - checksum: 5469d462763811475f34a7294d984f3eb100515b0585ca5b249656f6b1a6e99b20056a2d2e463cc9944b888896d2b1d07859c50f9c0cf23438df9cd2e3146066 - languageName: node - linkType: hard - -"d3-random@npm:3": - version: 3.0.1 - resolution: "d3-random@npm:3.0.1" - checksum: a70ad8d1cabe399ebeb2e482703121ac8946a3b336830b518da6848b9fdd48a111990fc041dc716f16885a72176ffa2898f2a250ca3d363ecdba5ef92b18e131 - languageName: node - linkType: hard - -"d3-scale-chromatic@npm:3": - version: 3.0.0 - resolution: "d3-scale-chromatic@npm:3.0.0" - dependencies: - d3-color: 1 - 3 - d3-interpolate: 1 - 3 - checksum: a8ce4cb0267a17b28ebbb929f5e3071d985908a9c13b6fcaa2a198e1e018f275804d691c5794b970df0049725b7944f32297b31603d235af6414004f0c7f82c0 - languageName: node - linkType: hard - -"d3-scale@npm:4": - version: 4.0.2 - resolution: "d3-scale@npm:4.0.2" - dependencies: - d3-array: 2.10.0 - 3 - d3-format: 1 - 3 - d3-interpolate: 1.2.0 - 3 - d3-time: 2.1.1 - 3 - d3-time-format: 2 - 4 - checksum: a9c770d283162c3bd11477c3d9d485d07f8db2071665f1a4ad23eec3e515e2cefbd369059ec677c9ac849877d1a765494e90e92051d4f21111aa56791c98729e - languageName: node - linkType: hard - -"d3-scale@npm:^2": - version: 2.2.2 - resolution: "d3-scale@npm:2.2.2" - dependencies: - d3-array: ^1.2.0 - d3-collection: 1 - d3-format: 1 - d3-interpolate: 1 - d3-time: 1 - d3-time-format: 2 - checksum: 42086d4b9db9f8492a99dbbdacf546983faef1bb6260fe875c0c1884f1ca9cf5fd233de3702c2f9e24145b1c5383945e929c8682d80fa57ab515ef2c4f2c61f6 - languageName: node - linkType: hard - -"d3-scale@npm:^3.3.0": - version: 3.3.0 - resolution: "d3-scale@npm:3.3.0" - dependencies: - d3-array: ^2.3.0 - d3-format: 1 - 2 - d3-interpolate: 1.2.0 - 2 - d3-time: ^2.1.1 - d3-time-format: 2 - 3 - checksum: f77e73f0fb422292211d0687914c30d26e29011a936ad2a535a868ae92f306c3545af1fe7ea5db1b3e67dbce7a6c6cd952e53d02d1d557543e7e5d30e30e52f2 - languageName: node - linkType: hard - -"d3-selection@npm:2 - 3, d3-selection@npm:3": - version: 3.0.0 - resolution: "d3-selection@npm:3.0.0" - checksum: f4e60e133309115b99f5b36a79ae0a19d71ee6e2d5e3c7216ef3e75ebd2cb1e778c2ed2fa4c01bef35e0dcbd96c5428f5bd6ca2184fe2957ed582fde6841cbc5 - languageName: node - linkType: hard - -"d3-shape@npm:3, d3-shape@npm:3.2.0, d3-shape@npm:^3.0.1": - version: 3.2.0 - resolution: "d3-shape@npm:3.2.0" - dependencies: - d3-path: ^3.1.0 - checksum: de2af5fc9a93036a7b68581ca0bfc4aca2d5a328aa7ba7064c11aedd44d24f310c20c40157cb654359d4c15c3ef369f95ee53d71221017276e34172c7b719cfa - languageName: node - linkType: hard - -"d3-shape@npm:^1.0.6, d3-shape@npm:^1.2.0": - version: 1.3.7 - resolution: "d3-shape@npm:1.3.7" - dependencies: - d3-path: 1 - checksum: 46566a3ab64a25023653bf59d64e81e9e6c987e95be985d81c5cedabae5838bd55f4a201a6b69069ca862eb63594cd263cac9034afc2b0e5664dfe286c866129 - languageName: node - linkType: hard - -"d3-time-format@npm:2": - version: 2.3.0 - resolution: "d3-time-format@npm:2.3.0" - dependencies: - d3-time: 1 - checksum: 5445eaaf2b3b2095cdc1fa75dfd2f361a61c39b677dcc1c2ba4cb6bc0442953de0fbaaa397d7d7a9325ad99c63d869f162a713e150e826ff8af482615664cb3f - languageName: node - linkType: hard - -"d3-time-format@npm:2 - 3": - version: 3.0.0 - resolution: "d3-time-format@npm:3.0.0" - dependencies: - d3-time: 1 - 2 - checksum: c20c1667dbea653f81d923e741f84c23e4b966002ba0d6ed94cbc70692105566e55e89d18d175404534a879383fd1123300bd12885a3c924fe924032bb0060db - languageName: node - linkType: hard - -"d3-time-format@npm:2 - 4, d3-time-format@npm:4": - version: 4.1.0 - resolution: "d3-time-format@npm:4.1.0" - dependencies: - d3-time: 1 - 3 - checksum: 7342bce28355378152bbd4db4e275405439cabba082d9cd01946d40581140481c8328456d91740b0fe513c51ec4a467f4471ffa390c7e0e30ea30e9ec98fcdf4 - languageName: node - linkType: hard - -"d3-time@npm:1": - version: 1.1.0 - resolution: "d3-time@npm:1.1.0" - checksum: 33fcfff94ff093dde2048c190ecca8b39fe0ec8b3c61e9fc39c5f6072ce5b86dd2b91823f086366995422bbbac7f74fd9abdb7efe4f292a73b1c6197c699cc78 - languageName: node - linkType: hard - -"d3-time@npm:1 - 2, d3-time@npm:^2.1.1": - version: 2.1.1 - resolution: "d3-time@npm:2.1.1" - dependencies: - d3-array: 2 - checksum: d1c7b9658c20646e46c3dd19e11c38e02dec098e8baa7d2cd868af8eb01953668f5da499fa33dc63541cf74a26e788786f8828c4381dbbf475a76b95972979a6 - languageName: node - linkType: hard - -"d3-time@npm:1 - 3, d3-time@npm:2.1.1 - 3, d3-time@npm:3": - version: 3.1.0 - resolution: "d3-time@npm:3.1.0" - dependencies: - d3-array: 2 - 3 - checksum: 613b435352a78d9f31b7f68540788186d8c331b63feca60ad21c88e9db1989fe888f97f242322ebd6365e45ec3fb206a4324cd4ca0dfffa1d9b5feb856ba00a7 - languageName: node - linkType: hard - -"d3-timer@npm:1 - 3, d3-timer@npm:3": - version: 3.0.1 - resolution: "d3-timer@npm:3.0.1" - checksum: 1cfddf86d7bca22f73f2c427f52dfa35c49f50d64e187eb788dcad6e927625c636aa18ae4edd44d084eb9d1f81d8ca4ec305dae7f733c15846a824575b789d73 - languageName: node - linkType: hard - -"d3-transition@npm:2 - 3, d3-transition@npm:3": - version: 3.0.1 - resolution: "d3-transition@npm:3.0.1" - dependencies: - d3-color: 1 - 3 - d3-dispatch: 1 - 3 - d3-ease: 1 - 3 - d3-interpolate: 1 - 3 - d3-timer: 1 - 3 - peerDependencies: - d3-selection: 2 - 3 - checksum: cb1e6e018c3abf0502fe9ff7b631ad058efb197b5e14b973a410d3935aead6e3c07c67d726cfab258e4936ef2667c2c3d1cd2037feb0765f0b4e1d3b8788c0ea - languageName: node - linkType: hard - -"d3-zoom@npm:3": - version: 3.0.0 - resolution: "d3-zoom@npm:3.0.0" - dependencies: - d3-dispatch: 1 - 3 - d3-drag: 2 - 3 - d3-interpolate: 1 - 3 - d3-selection: 2 - 3 - d3-transition: 2 - 3 - checksum: 8056e3527281cfd1ccbcbc458408f86973b0583e9dac00e51204026d1d36803ca437f970b5736f02fafed9f2b78f145f72a5dbc66397e02d4d95d4c594b8ff54 - languageName: node - linkType: hard - -"d3@npm:7.6.1": - version: 7.6.1 - resolution: "d3@npm:7.6.1" - dependencies: - d3-array: 3 - d3-axis: 3 - d3-brush: 3 - d3-chord: 3 - d3-color: 3 - d3-contour: 4 - d3-delaunay: 6 - d3-dispatch: 3 - d3-drag: 3 - d3-dsv: 3 - d3-ease: 3 - d3-fetch: 3 - d3-force: 3 - d3-format: 3 - d3-geo: 3 - d3-hierarchy: 3 - d3-interpolate: 3 - d3-path: 3 - d3-polygon: 3 - d3-quadtree: 3 - d3-random: 3 - d3-scale: 4 - d3-scale-chromatic: 3 - d3-selection: 3 - d3-shape: 3 - d3-time: 3 - d3-time-format: 4 - d3-timer: 3 - d3-transition: 3 - d3-zoom: 3 - checksum: af883cfeaf0a861afb2424edcb5419a5c56c84ddbc1ac9c7771c569f1926ace8db3cf0f4996038eb1db9700f7335e30c23b885199e0320a002893492ae83b415 - languageName: node - linkType: hard - -"damerau-levenshtein@npm:^1.0.8": - version: 1.0.8 - resolution: "damerau-levenshtein@npm:1.0.8" - checksum: d240b7757544460ae0586a341a53110ab0a61126570ef2d8c731e3eab3f0cb6e488e2609e6a69b46727635de49be20b071688698744417ff1b6c1d7ccd03e0de - languageName: node - linkType: hard - -"danger@npm:11.2.6": - version: 11.2.6 - resolution: "danger@npm:11.2.6" - dependencies: - "@gitbeaker/node": ^21.3.0 - "@octokit/rest": ^18.12.0 - async-retry: 1.2.3 - chalk: ^2.3.0 - commander: ^2.18.0 - core-js: ^3.8.2 - debug: ^4.1.1 - fast-json-patch: ^3.0.0-1 - get-stdin: ^6.0.0 - http-proxy-agent: ^5.0.0 - https-proxy-agent: ^5.0.1 - hyperlinker: ^1.0.0 - json5: ^2.1.0 - jsonpointer: ^5.0.0 - jsonwebtoken: ^9.0.0 - lodash.find: ^4.6.0 - lodash.includes: ^4.3.0 - lodash.isobject: ^3.0.2 - lodash.keys: ^4.0.8 - lodash.mapvalues: ^4.6.0 - lodash.memoize: ^4.1.2 - memfs-or-file-map-to-github-branch: ^1.2.1 - micromatch: ^4.0.4 - node-cleanup: ^2.1.2 - node-fetch: ^2.6.7 - override-require: ^1.1.1 - p-limit: ^2.1.0 - parse-diff: ^0.7.0 - parse-git-config: ^2.0.3 - parse-github-url: ^1.0.2 - parse-link-header: ^2.0.0 - pinpoint: ^1.1.0 - prettyjson: ^1.2.1 - readline-sync: ^1.4.9 - regenerator-runtime: ^0.13.9 - require-from-string: ^2.0.2 - supports-hyperlinks: ^1.0.1 - bin: - danger: distribution/commands/danger.js - danger-ci: distribution/commands/danger-ci.js - danger-init: distribution/commands/danger-init.js - danger-js: distribution/commands/danger.js - danger-local: distribution/commands/danger-local.js - danger-pr: distribution/commands/danger-pr.js - danger-process: distribution/commands/danger-process.js - danger-reset-status: distribution/commands/danger-reset-status.js - danger-runner: distribution/commands/danger-runner.js - checksum: 606b92bce7618edc5d7d1500c5108d57ee86fd9d81d385c45b9acba5aac46e97c81c0687392ad117c296a581afb55c8e729d8ba283b770f1c6e7747be07fdaf4 - languageName: node - linkType: hard - -"dargs@npm:^7.0.0": - version: 7.0.0 - resolution: "dargs@npm:7.0.0" - checksum: b8f1e3cba59c42e1f13a114ad4848c3fc1cf7470f633ee9e9f1043762429bc97d91ae31b826fb135eefde203a3fdb20deb0c0a0222ac29d937b8046085d668d1 - languageName: node - linkType: hard - -"dashdash@npm:^1.12.0": - version: 1.14.1 - resolution: "dashdash@npm:1.14.1" - dependencies: - assert-plus: ^1.0.0 - checksum: 3634c249570f7f34e3d34f866c93f866c5b417f0dd616275decae08147dcdf8fccfaa5947380ccfb0473998ea3a8057c0b4cd90c875740ee685d0624b2983598 - languageName: node - linkType: hard - -"data-uri-to-buffer@npm:^2.0.0": - version: 2.0.2 - resolution: "data-uri-to-buffer@npm:2.0.2" - checksum: 152bec5e77513ee253a7c686700a1723246f582dad8b614e8eaaaba7fa45a15c8671ae4b8f4843f4f3a002dae1d3e7a20f852f7d7bdc8b4c15cfe7adfdfb07f8 - languageName: node - linkType: hard - -"data-uri-to-buffer@npm:^6.0.2": - version: 6.0.2 - resolution: "data-uri-to-buffer@npm:6.0.2" - checksum: 8b6927c33f9b54037f442856be0aa20e5fd49fa6c9c8ceece408dc306445d593ad72d207d57037c529ce65f413b421da800c6827b1dbefb607b8056f17123a61 - languageName: node - linkType: hard - -"data-urls@npm:^3.0.2": - version: 3.0.2 - resolution: "data-urls@npm:3.0.2" - dependencies: - abab: ^2.0.6 - whatwg-mimetype: ^3.0.0 - whatwg-url: ^11.0.0 - checksum: 033fc3dd0fba6d24bc9a024ddcf9923691dd24f90a3d26f6545d6a2f71ec6956f93462f2cdf2183cc46f10dc01ed3bcb36731a8208456eb1a08147e571fe2a76 - languageName: node - linkType: hard - -"data-view-buffer@npm:^1.0.1": - version: 1.0.1 - resolution: "data-view-buffer@npm:1.0.1" - dependencies: - call-bind: ^1.0.6 - es-errors: ^1.3.0 - is-data-view: ^1.0.1 - checksum: ce24348f3c6231223b216da92e7e6a57a12b4af81a23f27eff8feabdf06acfb16c00639c8b705ca4d167f761cfc756e27e5f065d0a1f840c10b907fdaf8b988c - languageName: node - linkType: hard - -"data-view-byte-length@npm:^1.0.1": - version: 1.0.1 - resolution: "data-view-byte-length@npm:1.0.1" - dependencies: - call-bind: ^1.0.7 - es-errors: ^1.3.0 - is-data-view: ^1.0.1 - checksum: dbb3200edcb7c1ef0d68979834f81d64fd8cab2f7691b3a4c6b97e67f22182f3ec2c8602efd7b76997b55af6ff8bce485829c1feda4fa2165a6b71fb7baa4269 - languageName: node - linkType: hard - -"data-view-byte-offset@npm:^1.0.0": - version: 1.0.0 - resolution: "data-view-byte-offset@npm:1.0.0" - dependencies: - call-bind: ^1.0.6 - es-errors: ^1.3.0 - is-data-view: ^1.0.1 - checksum: 7f0bf8720b7414ca719eedf1846aeec392f2054d7af707c5dc9a753cc77eb8625f067fa901e0b5127e831f9da9056138d894b9c2be79c27a21f6db5824f009c2 - languageName: node - linkType: hard - -"datadog-metrics@npm:0.9.3": - version: 0.9.3 - resolution: "datadog-metrics@npm:0.9.3" - dependencies: - debug: 3.1.0 - dogapi: 2.8.4 - checksum: f16c0feb21a1e08944e68df53be14da7a11a3482bcf17173af9d1cff7872378a676b4c9379758180914a58490818a475baadfb69637e0a6d53c22411fb452411 - languageName: node - linkType: hard - -"dataloader@npm:^2.2.2": - version: 2.2.2 - resolution: "dataloader@npm:2.2.2" - checksum: 4dabd247089c29f194e94d5434d504f99156c5c214a03463c20f3f17f40398d7e179edee69a27c16e315519ac8739042a810090087ae26449a0e685156a02c65 - languageName: node - linkType: hard - -"date-fns@npm:2.30.0, date-fns@npm:^2.29.3, date-fns@npm:^2.30.0": - version: 2.30.0 - resolution: "date-fns@npm:2.30.0" - dependencies: - "@babel/runtime": ^7.21.0 - checksum: f7be01523282e9bb06c0cd2693d34f245247a29098527d4420628966a2d9aad154bd0e90a6b1cf66d37adcb769cd108cf8a7bd49d76db0fb119af5cdd13644f4 - languageName: node - linkType: hard - -"dayjs@npm:1.11.7": - version: 1.11.7 - resolution: "dayjs@npm:1.11.7" - checksum: 5003a7c1dd9ed51385beb658231c3548700b82d3548c0cfbe549d85f2d08e90e972510282b7506941452c58d32136d6362f009c77ca55381a09c704e9f177ebb - languageName: node - linkType: hard - -"dayjs@npm:^1.10.4, dayjs@npm:^1.8.15": - version: 1.11.10 - resolution: "dayjs@npm:1.11.10" - checksum: a6b5a3813b8884f5cd557e2e6b7fa569f4c5d0c97aca9558e38534af4f2d60daafd3ff8c2000fed3435cfcec9e805bcebd99f90130c6d1c5ef524084ced588c4 - languageName: node - linkType: hard - -"de-indent@npm:^1.0.2": - version: 1.0.2 - resolution: "de-indent@npm:1.0.2" - checksum: 8deacc0f4a397a4414a0fc4d0034d2b7782e7cb4eaf34943ea47754e08eccf309a0e71fa6f56cc48de429ede999a42d6b4bca761bf91683be0095422dbf24611 - languageName: node - linkType: hard - -"debounce@npm:^1.2.0, debounce@npm:^1.2.1": - version: 1.2.1 - resolution: "debounce@npm:1.2.1" - checksum: 682a89506d9e54fb109526f4da255c5546102fbb8e3ae75eef3b04effaf5d4853756aee97475cd4650641869794e44f410eeb20ace2b18ea592287ab2038519e - languageName: node - linkType: hard - -"debug@npm:2.6.9, debug@npm:^2.2.0, debug@npm:^2.6.0, debug@npm:^2.6.9": - version: 2.6.9 - resolution: "debug@npm:2.6.9" - dependencies: - ms: 2.0.0 - checksum: d2f51589ca66df60bf36e1fa6e4386b318c3f1e06772280eea5b1ae9fd3d05e9c2b7fd8a7d862457d00853c75b00451aa2d7459b924629ee385287a650f58fe6 - languageName: node - linkType: hard - -"debug@npm:3.1.0": - version: 3.1.0 - resolution: "debug@npm:3.1.0" - dependencies: - ms: 2.0.0 - checksum: 0b52718ab957254a5b3ca07fc34543bc778f358620c206a08452251eb7fc193c3ea3505072acbf4350219c14e2d71ceb7bdaa0d3370aa630b50da790458d08b3 - languageName: node - linkType: hard - -"debug@npm:4, debug@npm:^4.0.0, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.3, debug@npm:^4.3.4, debug@npm:^4.3.5, debug@npm:~4.3.1, debug@npm:~4.3.2": - version: 4.3.7 - resolution: "debug@npm:4.3.7" - dependencies: - ms: ^2.1.3 - peerDependenciesMeta: - supports-color: - optional: true - checksum: 822d74e209cd910ef0802d261b150314bbcf36c582ccdbb3e70f0894823c17e49a50d3e66d96b633524263975ca16b6a833f3e3b7e030c157169a5fabac63160 - languageName: node - linkType: hard - -"debug@npm:4.3.4": - version: 4.3.4 - resolution: "debug@npm:4.3.4" - dependencies: - ms: 2.1.2 - peerDependenciesMeta: - supports-color: - optional: true - checksum: 3dbad3f94ea64f34431a9cbf0bafb61853eda57bff2880036153438f50fb5a84f27683ba0d8e5426bf41a8c6ff03879488120cf5b3a761e77953169c0600a708 - languageName: node - linkType: hard - -"debug@npm:^3.1.0, debug@npm:^3.2.7": - version: 3.2.7 - resolution: "debug@npm:3.2.7" - dependencies: - ms: ^2.1.1 - checksum: b3d8c5940799914d30314b7c3304a43305fd0715581a919dacb8b3176d024a782062368405b47491516d2091d6462d4d11f2f4974a405048094f8bfebfa3071c - languageName: node - linkType: hard - -"decamelize-keys@npm:^1.1.0": - version: 1.1.1 - resolution: "decamelize-keys@npm:1.1.1" - dependencies: - decamelize: ^1.1.0 - map-obj: ^1.0.0 - checksum: fc645fe20b7bda2680bbf9481a3477257a7f9304b1691036092b97ab04c0ab53e3bf9fcc2d2ae382536568e402ec41fb11e1d4c3836a9abe2d813dd9ef4311e0 - languageName: node - linkType: hard - -"decamelize@npm:^1.1.0, decamelize@npm:^1.2.0": - version: 1.2.0 - resolution: "decamelize@npm:1.2.0" - checksum: ad8c51a7e7e0720c70ec2eeb1163b66da03e7616d7b98c9ef43cce2416395e84c1e9548dd94f5f6ffecfee9f8b94251fc57121a8b021f2ff2469b2bae247b8aa - languageName: node - linkType: hard - -"decamelize@npm:^4.0.0": - version: 4.0.0 - resolution: "decamelize@npm:4.0.0" - checksum: b7d09b82652c39eead4d6678bb578e3bebd848add894b76d0f6b395bc45b2d692fb88d977e7cfb93c4ed6c119b05a1347cef261174916c2e75c0a8ca57da1809 - languageName: node - linkType: hard - -"decimal.js-light@npm:^2.5.0": - version: 2.5.1 - resolution: "decimal.js-light@npm:2.5.1" - checksum: f5a2c7eac1c4541c8ab8a5c8abea64fc1761cefc7794bd5f8afd57a8a78d1b51785e0c4e4f85f4895a043eaa90ddca1edc3981d1263eb6ddce60f32bf5fe66c9 - languageName: node - linkType: hard - -"decimal.js@npm:^10.4.2": - version: 10.4.3 - resolution: "decimal.js@npm:10.4.3" - checksum: 796404dcfa9d1dbfdc48870229d57f788b48c21c603c3f6554a1c17c10195fc1024de338b0cf9e1efe0c7c167eeb18f04548979bcc5fdfabebb7cc0ae3287bae - languageName: node - linkType: hard - -"decode-uri-component@npm:^0.2.0, decode-uri-component@npm:^0.2.2": - version: 0.2.2 - resolution: "decode-uri-component@npm:0.2.2" - checksum: 95476a7d28f267292ce745eac3524a9079058bbb35767b76e3ee87d42e34cd0275d2eb19d9d08c3e167f97556e8a2872747f5e65cbebcac8b0c98d83e285f139 - languageName: node - linkType: hard - -"decompress-response@npm:^3.3.0": - version: 3.3.0 - resolution: "decompress-response@npm:3.3.0" - dependencies: - mimic-response: ^1.0.0 - checksum: 952552ac3bd7de2fc18015086b09468645c9638d98a551305e485230ada278c039c91116e946d07894b39ee53c0f0d5b6473f25a224029344354513b412d7380 - languageName: node - linkType: hard - -"decompress-response@npm:^6.0.0": - version: 6.0.0 - resolution: "decompress-response@npm:6.0.0" - dependencies: - mimic-response: ^3.1.0 - checksum: d377cf47e02d805e283866c3f50d3d21578b779731e8c5072d6ce8c13cc31493db1c2f6784da9d1d5250822120cefa44f1deab112d5981015f2e17444b763812 - languageName: node - linkType: hard - -"dedent@npm:^0.7.0": - version: 0.7.0 - resolution: "dedent@npm:0.7.0" - checksum: 87de191050d9a40dd70cad01159a0bcf05ecb59750951242070b6abf9569088684880d00ba92a955b4058804f16eeaf91d604f283929b4f614d181cd7ae633d2 - languageName: node - linkType: hard - -"dedent@npm:^1.0.0, dedent@npm:^1.5.1": - version: 1.5.3 - resolution: "dedent@npm:1.5.3" - peerDependencies: - babel-plugin-macros: ^3.1.0 - peerDependenciesMeta: - babel-plugin-macros: - optional: true - checksum: 045b595557b2a8ea2eb9b0b4623d764e9a87326486fe2b61191b4342ed93dc01245644d8a09f3108a50c0ee7965f1eedd92e4a3a503ed89ea8e810566ea27f9a - languageName: node - linkType: hard - -"deep-diff@npm:^0.3.5": - version: 0.3.8 - resolution: "deep-diff@npm:0.3.8" - checksum: 8a0fb6cbe468e50211836f8daa1c14798b2d7436bfbcb7d8eb0902e0d61bf1dfd48d5b9edd46a10596182b90ad25f87461b8e55111ff9257b6067ad0676f79c9 - languageName: node - linkType: hard - -"deep-eql@npm:^5.0.1": - version: 5.0.2 - resolution: "deep-eql@npm:5.0.2" - checksum: 6aaaadb4c19cbce42e26b2bbe5bd92875f599d2602635dc97f0294bae48da79e89470aedee05f449e0ca8c65e9fd7e7872624d1933a1db02713d99c2ca8d1f24 - languageName: node - linkType: hard - -"deep-equal@npm:^1.0.1": - version: 1.1.2 - resolution: "deep-equal@npm:1.1.2" - dependencies: - is-arguments: ^1.1.1 - is-date-object: ^1.0.5 - is-regex: ^1.1.4 - object-is: ^1.1.5 - object-keys: ^1.1.1 - regexp.prototype.flags: ^1.5.1 - checksum: 2d50f27fff785fb272cdef038ee5365ee5a30ab1aab053976e6a6add44cc60abd99b38179a46a01ac52c5e54ebb220e8f1a3a1954da20678b79c46ef4d97c9db - languageName: node - linkType: hard - -"deep-extend@npm:0.6.0, deep-extend@npm:^0.6.0": - version: 0.6.0 - resolution: "deep-extend@npm:0.6.0" - checksum: 7be7e5a8d468d6b10e6a67c3de828f55001b6eb515d014f7aeb9066ce36bd5717161eb47d6a0f7bed8a9083935b465bc163ee2581c8b128d29bf61092fdf57a7 - languageName: node - linkType: hard - -"deep-is@npm:^0.1.3, deep-is@npm:~0.1.3": - version: 0.1.4 - resolution: "deep-is@npm:0.1.4" - checksum: edb65dd0d7d1b9c40b2f50219aef30e116cedd6fc79290e740972c132c09106d2e80aa0bc8826673dd5a00222d4179c84b36a790eef63a4c4bca75a37ef90804 - languageName: node - linkType: hard - -"deep-object-diff@npm:^1.1.9": - version: 1.1.9 - resolution: "deep-object-diff@npm:1.1.9" - checksum: ecd42455e4773f653595d28070295e7aaa8402db5f8ab21d0bec115a7cb4de5e207a5665514767da5f025c96597f1d3a0a4888aeb4dd49e03c996871a3aa05ef - languageName: node - linkType: hard - -"deepmerge@npm:^4.2.2, deepmerge@npm:^4.3.0, deepmerge@npm:^4.3.1": - version: 4.3.1 - resolution: "deepmerge@npm:4.3.1" - checksum: 2024c6a980a1b7128084170c4cf56b0fd58a63f2da1660dcfe977415f27b17dbe5888668b59d0b063753f3220719d5e400b7f113609489c90160bb9a5518d052 - languageName: node - linkType: hard - -"default-gateway@npm:^4.2.0": - version: 4.2.0 - resolution: "default-gateway@npm:4.2.0" - dependencies: - execa: ^1.0.0 - ip-regex: ^2.1.0 - checksum: 1f5be765471689c6bab33e0c8b87363c3e2485cc1ab78904d383a8a8293a79f684da2a3303744b112503f986af4ea87d917c63a468ed913e9b0c31588c02d6a4 - languageName: node - linkType: hard - -"default-gateway@npm:^6.0.3": - version: 6.0.3 - resolution: "default-gateway@npm:6.0.3" - dependencies: - execa: ^5.0.0 - checksum: 126f8273ecac8ee9ff91ea778e8784f6cd732d77c3157e8c5bdd6ed03651b5291f71446d05bc02d04073b1e67583604db5394ea3cf992ede0088c70ea15b7378 - languageName: node - linkType: hard - -"defaults@npm:^1.0.3": - version: 1.0.4 - resolution: "defaults@npm:1.0.4" - dependencies: - clone: ^1.0.2 - checksum: 3a88b7a587fc076b84e60affad8b85245c01f60f38fc1d259e7ac1d89eb9ce6abb19e27215de46b98568dd5bc48471730b327637e6f20b0f1bc85cf00440c80a - languageName: node - linkType: hard - -"defer-to-connect@npm:^1.0.1": - version: 1.1.3 - resolution: "defer-to-connect@npm:1.1.3" - checksum: 9491b301dcfa04956f989481ba7a43c2231044206269eb4ab64a52d6639ee15b1252262a789eb4239fb46ab63e44d4e408641bae8e0793d640aee55398cb3930 - languageName: node - linkType: hard - -"defer-to-connect@npm:^2.0.0": - version: 2.0.1 - resolution: "defer-to-connect@npm:2.0.1" - checksum: 8a9b50d2f25446c0bfefb55a48e90afd58f85b21bcf78e9207cd7b804354f6409032a1705c2491686e202e64fc05f147aa5aa45f9aa82627563f045937f5791b - languageName: node - linkType: hard - -"define-data-property@npm:^1.0.1, define-data-property@npm:^1.1.4": - version: 1.1.4 - resolution: "define-data-property@npm:1.1.4" - dependencies: - es-define-property: ^1.0.0 - es-errors: ^1.3.0 - gopd: ^1.0.1 - checksum: 8068ee6cab694d409ac25936eb861eea704b7763f7f342adbdfe337fc27c78d7ae0eff2364b2917b58c508d723c7a074326d068eef2e45c4edcd85cf94d0313b - languageName: node - linkType: hard - -"define-lazy-prop@npm:^2.0.0": - version: 2.0.0 - resolution: "define-lazy-prop@npm:2.0.0" - checksum: 0115fdb065e0490918ba271d7339c42453d209d4cb619dfe635870d906731eff3e1ade8028bb461ea27ce8264ec5e22c6980612d332895977e89c1bbc80fcee2 - languageName: node - linkType: hard - -"define-properties@npm:^1.1.3, define-properties@npm:^1.2.0, define-properties@npm:^1.2.1": - version: 1.2.1 - resolution: "define-properties@npm:1.2.1" - dependencies: - define-data-property: ^1.0.1 - has-property-descriptors: ^1.0.0 - object-keys: ^1.1.1 - checksum: b4ccd00597dd46cb2d4a379398f5b19fca84a16f3374e2249201992f36b30f6835949a9429669ee6b41b6e837205a163eadd745e472069e70dfc10f03e5fcc12 - languageName: node - linkType: hard - -"defu@npm:^6.1.3, defu@npm:^6.1.4": - version: 6.1.4 - resolution: "defu@npm:6.1.4" - checksum: 40e3af6338f195ac1564f53d1887fa2d0429ac7e8c081204bc4d29191180059d3952b5f4e08fe5df8d59eb873aa26e9c88b56d4fac699673d4a372c93620b229 - languageName: node - linkType: hard - -"degenerator@npm:^5.0.0": - version: 5.0.1 - resolution: "degenerator@npm:5.0.1" - dependencies: - ast-types: ^0.13.4 - escodegen: ^2.1.0 - esprima: ^4.0.1 - checksum: a64fa39cdf6c2edd75188157d32338ee9de7193d7dbb2aeb4acb1eb30fa4a15ed80ba8dae9bd4d7b085472cf174a5baf81adb761aaa8e326771392c922084152 - languageName: node - linkType: hard - -"del@npm:^4.1.1": - version: 4.1.1 - resolution: "del@npm:4.1.1" - dependencies: - "@types/glob": ^7.1.1 - globby: ^6.1.0 - is-path-cwd: ^2.0.0 - is-path-in-cwd: ^2.0.0 - p-map: ^2.0.0 - pify: ^4.0.1 - rimraf: ^2.6.3 - checksum: 521f7da44bd79da841c06d573923d1f64f423aee8b8219c973478d3150ce1dcc024d03ad605929292adbff56d6448bca60d96dcdd2d8a53b46dbcb27e265c94b - languageName: node - linkType: hard - -"del@npm:^6.0.0": - version: 6.1.1 - resolution: "del@npm:6.1.1" - dependencies: - globby: ^11.0.1 - graceful-fs: ^4.2.4 - is-glob: ^4.0.1 - is-path-cwd: ^2.2.0 - is-path-inside: ^3.0.2 - p-map: ^4.0.0 - rimraf: ^3.0.2 - slash: ^3.0.0 - checksum: 563288b73b8b19a7261c47fd21a330eeab6e2acd7c6208c49790dfd369127120dd7836cdf0c1eca216b77c94782a81507eac6b4734252d3bef2795cb366996b6 - languageName: node - linkType: hard - -"delaunator@npm:5": - version: 5.0.0 - resolution: "delaunator@npm:5.0.0" - dependencies: - robust-predicates: ^3.0.0 - checksum: d6764188442b7f7c6bcacebd96edc00e35f542a96f1af3ef600e586bfb9849a3682c489c0ab423440c90bc4c7cac77f28761babff76fa29e193e1cf50a95b860 - languageName: node - linkType: hard - -"delayed-stream@npm:~1.0.0": - version: 1.0.0 - resolution: "delayed-stream@npm:1.0.0" - checksum: 46fe6e83e2cb1d85ba50bd52803c68be9bd953282fa7096f51fc29edd5d67ff84ff753c51966061e5ba7cb5e47ef6d36a91924eddb7f3f3483b1c560f77a0020 - languageName: node - linkType: hard - -"delegates@npm:^1.0.0": - version: 1.0.0 - resolution: "delegates@npm:1.0.0" - checksum: a51744d9b53c164ba9c0492471a1a2ffa0b6727451bdc89e31627fdf4adda9d51277cfcbfb20f0a6f08ccb3c436f341df3e92631a3440226d93a8971724771fd - languageName: node - linkType: hard - -"denque@npm:^2.1.0": - version: 2.1.0 - resolution: "denque@npm:2.1.0" - checksum: 1d4ae1d05e59ac3a3481e7b478293f4b4c813819342273f3d5b826c7ffa9753c520919ba264f377e09108d24ec6cf0ec0ac729a5686cbb8f32d797126c5dae74 - languageName: node - linkType: hard - -"depcheck@npm:1.4.7": - version: 1.4.7 - resolution: "depcheck@npm:1.4.7" - dependencies: - "@babel/parser": ^7.23.0 - "@babel/traverse": ^7.23.2 - "@vue/compiler-sfc": ^3.3.4 - callsite: ^1.0.0 - camelcase: ^6.3.0 - cosmiconfig: ^7.1.0 - debug: ^4.3.4 - deps-regex: ^0.2.0 - findup-sync: ^5.0.0 - ignore: ^5.2.4 - is-core-module: ^2.12.0 - js-yaml: ^3.14.1 - json5: ^2.2.3 - lodash: ^4.17.21 - minimatch: ^7.4.6 - multimatch: ^5.0.0 - please-upgrade-node: ^3.2.0 - readdirp: ^3.6.0 - require-package-name: ^2.0.1 - resolve: ^1.22.3 - resolve-from: ^5.0.0 - semver: ^7.5.4 - yargs: ^16.2.0 - bin: - depcheck: bin/depcheck.js - checksum: e648788554ba88bd0dc37ce398f7756f143a78487b4ee3ac01756ad7ed97034476e0709497e9f8e474117bd4258db669a53fd46fafb703f151c9a0394fc8a55a - languageName: node - linkType: hard - -"depd@npm:2.0.0": - version: 2.0.0 - resolution: "depd@npm:2.0.0" - checksum: abbe19c768c97ee2eed6282d8ce3031126662252c58d711f646921c9623f9052e3e1906443066beec1095832f534e57c523b7333f8e7e0d93051ab6baef5ab3a - languageName: node - linkType: hard - -"depd@npm:~1.1.2": - version: 1.1.2 - resolution: "depd@npm:1.1.2" - checksum: 6b406620d269619852885ce15965272b829df6f409724415e0002c8632ab6a8c0a08ec1f0bd2add05dc7bd7507606f7e2cc034fa24224ab829580040b835ecd9 - languageName: node - linkType: hard - -"dependency-graph@npm:^0.11.0": - version: 0.11.0 - resolution: "dependency-graph@npm:0.11.0" - checksum: 477204beaa9be69e642bc31ffe7a8c383d0cf48fa27acbc91c5df01431ab913e65c154213d2ef83d034c98d77280743ec85e5da018a97a18dd43d3c0b78b28cd - languageName: node - linkType: hard - -"dependency-tree@npm:^9.0.0": - version: 9.0.0 - resolution: "dependency-tree@npm:9.0.0" - dependencies: - commander: ^2.20.3 - debug: ^4.3.1 - filing-cabinet: ^3.0.1 - precinct: ^9.0.0 - typescript: ^4.0.0 - bin: - dependency-tree: bin/cli.js - checksum: 38f95ec248f350f3ed443e0aac520c8ad979b3801262a1e67f6a5972c14f972887150d88972fb9e2630cef8c75efcd82719f93a55f9fc3207e64174ab9d3b0f3 - languageName: node - linkType: hard - -"deprecation@npm:^2.0.0, deprecation@npm:^2.3.1": - version: 2.3.1 - resolution: "deprecation@npm:2.3.1" - checksum: f56a05e182c2c195071385455956b0c4106fe14e36245b00c689ceef8e8ab639235176a96977ba7c74afb173317fac2e0ec6ec7a1c6d1e6eaa401c586c714132 - languageName: node - linkType: hard - -"deps-regex@npm:^0.2.0": - version: 0.2.0 - resolution: "deps-regex@npm:0.2.0" - checksum: a782304d481824c21c5aaff3d7fbd2eba9b112688cbadb36537304dde61e106595d4858bd097fad1df8b96fbff3df571dc9bfd73b749cbd24fd088cce3a999d8 - languageName: node - linkType: hard - -"dequal@npm:^2.0.2, dequal@npm:^2.0.3": - version: 2.0.3 - resolution: "dequal@npm:2.0.3" - checksum: 8679b850e1a3d0ebbc46ee780d5df7b478c23f335887464023a631d1b9af051ad4a6595a44220f9ff8ff95a8ddccf019b5ad778a976fd7bbf77383d36f412f90 - languageName: node - linkType: hard - -"des.js@npm:^1.0.0": - version: 1.0.1 - resolution: "des.js@npm:1.0.1" - dependencies: - inherits: ^2.0.1 - minimalistic-assert: ^1.0.0 - checksum: 1ec2eedd7ed6bd61dd5e0519fd4c96124e93bb22de8a9d211b02d63e5dd152824853d919bb2090f965cc0e3eb9c515950a9836b332020d810f9c71feb0fd7df4 - languageName: node - linkType: hard - -"destr@npm:^2.0.1, destr@npm:^2.0.2": - version: 2.0.2 - resolution: "destr@npm:2.0.2" - checksum: cb63dd477d1c323f95650ce7784f1497466d68150ac0fddd6c99652be45c9dcb997d53fd5eb6c6fda6c0b2a5e5b4fc7fa3c3e18dace3d810ba4cf45d8b55bdd6 - languageName: node - linkType: hard - -"destroy@npm:1.2.0": - version: 1.2.0 - resolution: "destroy@npm:1.2.0" - checksum: 0acb300b7478a08b92d810ab229d5afe0d2f4399272045ab22affa0d99dbaf12637659411530a6fcd597a9bdac718fc94373a61a95b4651bbc7b83684a565e38 - languageName: node - linkType: hard - -"detect-browser@npm:5.3.0, detect-browser@npm:^5.2.0": - version: 5.3.0 - resolution: "detect-browser@npm:5.3.0" - checksum: dd6e08d55da1d9e0f22510ac79872078ae03d9dfa13c5e66c96baedc1c86567345a88f96949161f6be8f3e0fafa93bf179bdb1cd311b14f5f163112fcc70ab49 - languageName: node - linkType: hard - -"detect-file@npm:^1.0.0": - version: 1.0.0 - resolution: "detect-file@npm:1.0.0" - checksum: 1861e4146128622e847abe0e1ed80fef01e78532665858a792267adf89032b7a9c698436137707fcc6f02956c2a6a0052d6a0cef5be3d4b76b1ff0da88e2158a - languageName: node - linkType: hard - -"detect-indent@npm:^6.0.0, detect-indent@npm:^6.1.0": - version: 6.1.0 - resolution: "detect-indent@npm:6.1.0" - checksum: ab953a73c72dbd4e8fc68e4ed4bfd92c97eb6c43734af3900add963fd3a9316f3bc0578b018b24198d4c31a358571eff5f0656e81a1f3b9ad5c547d58b2d093d - languageName: node - linkType: hard - -"detect-libc@npm:^1.0.3": - version: 1.0.3 - resolution: "detect-libc@npm:1.0.3" - bin: - detect-libc: ./bin/detect-libc.js - checksum: daaaed925ffa7889bd91d56e9624e6c8033911bb60f3a50a74a87500680652969dbaab9526d1e200a4c94acf80fc862a22131841145a0a8482d60a99c24f4a3e - languageName: node - linkType: hard - -"detect-libc@npm:^2.0.0, detect-libc@npm:^2.0.2": - version: 2.0.3 - resolution: "detect-libc@npm:2.0.3" - checksum: 2ba6a939ae55f189aea996ac67afceb650413c7a34726ee92c40fb0deb2400d57ef94631a8a3f052055eea7efb0f99a9b5e6ce923415daa3e68221f963cfc27d - languageName: node - linkType: hard - -"detect-newline@npm:^3.0.0": - version: 3.1.0 - resolution: "detect-newline@npm:3.1.0" - checksum: ae6cd429c41ad01b164c59ea36f264a2c479598e61cba7c99da24175a7ab80ddf066420f2bec9a1c57a6bead411b4655ff15ad7d281c000a89791f48cbe939e7 - languageName: node - linkType: hard - -"detect-node-es@npm:^1.1.0": - version: 1.1.0 - resolution: "detect-node-es@npm:1.1.0" - checksum: e46307d7264644975b71c104b9f028ed1d3d34b83a15b8a22373640ce5ea630e5640b1078b8ea15f202b54641da71e4aa7597093bd4b91f113db520a26a37449 - languageName: node - linkType: hard - -"detect-node@npm:^2.0.4": - version: 2.1.0 - resolution: "detect-node@npm:2.1.0" - checksum: 832184ec458353e41533ac9c622f16c19f7c02d8b10c303dfd3a756f56be93e903616c0bb2d4226183c9351c15fc0b3dba41a17a2308262afabcfa3776e6ae6e - languageName: node - linkType: hard - -"detect-port-alt@npm:^1.1.6": - version: 1.1.6 - resolution: "detect-port-alt@npm:1.1.6" - dependencies: - address: ^1.0.1 - debug: ^2.6.0 - bin: - detect: ./bin/detect-port - detect-port: ./bin/detect-port - checksum: 9dc37b1fa4a9dd6d4889e1045849b8d841232b598d1ca888bf712f4035b07a17cf6d537465a0d7323250048d3a5a0540e3b7cf89457efc222f96f77e2c40d16a - languageName: node - linkType: hard - -"detective-amd@npm:^3.1.0": - version: 3.1.2 - resolution: "detective-amd@npm:3.1.2" - dependencies: - ast-module-types: ^3.0.0 - escodegen: ^2.0.0 - get-amd-module-type: ^3.0.0 - node-source-walk: ^4.2.0 - bin: - detective-amd: bin/cli.js - checksum: 0b71555edad8e85c9a2ae85e2799d5faf2bdfe0de969587c9288ca76e717494678e34f444dffe32ffdd432e85ce50ca7017a5d0441a4855677a45a40c4590c74 - languageName: node - linkType: hard - -"detective-amd@npm:^4.0.1, detective-amd@npm:^4.1.0": - version: 4.2.0 - resolution: "detective-amd@npm:4.2.0" - dependencies: - ast-module-types: ^4.0.0 - escodegen: ^2.0.0 - get-amd-module-type: ^4.1.0 - node-source-walk: ^5.0.1 - bin: - detective-amd: bin/cli.js - checksum: c1e829a3202045796105680c9fe90ac61f63b0ccecc12cc30c7204c9e7ec22a4e2c3e2357719b9346a4e3579eba778cdce9a050e642938e2a4c8b57b091278e4 - languageName: node - linkType: hard - -"detective-cjs@npm:^3.1.1": - version: 3.1.3 - resolution: "detective-cjs@npm:3.1.3" - dependencies: - ast-module-types: ^3.0.0 - node-source-walk: ^4.0.0 - checksum: a691cb4afbbfea59d9aae0ee00752ec1a825a7ef18fc9178b53664975f162f3b537268590def009d9ce1cccfc5bc4f38cf775df08d0872aaacc05d96c72de85a - languageName: node - linkType: hard - -"detective-cjs@npm:^4.0.0, detective-cjs@npm:^4.1.0": - version: 4.1.0 - resolution: "detective-cjs@npm:4.1.0" - dependencies: - ast-module-types: ^4.0.0 - node-source-walk: ^5.0.1 - checksum: 17e40183959e9f377333a9fd03dcf4cbabf1b7a9f588882311066ecaaad68ad16765a7b63ffc096fc91d2a3c14ac044ed1823257c76105c9cb96dfc141a806e2 - languageName: node - linkType: hard - -"detective-es6@npm:^2.2.1": - version: 2.2.2 - resolution: "detective-es6@npm:2.2.2" - dependencies: - node-source-walk: ^4.0.0 - checksum: 9ee9909c089f5dcd1f89eccd347d509197996280ba24e2e08742bbc5ca3eef655ff07b4edfd76b52d6b4376ba03b8ec17d621c9f9c4382a6ba233dc1b1d00d33 - languageName: node - linkType: hard - -"detective-es6@npm:^3.0.0, detective-es6@npm:^3.0.1": - version: 3.0.1 - resolution: "detective-es6@npm:3.0.1" - dependencies: - node-source-walk: ^5.0.0 - checksum: 881a0c16b49504c212e61a521231ebbb4299a6102b178230959c74d2ca22d5f7538dfaf9518d01fb568ff93eadcf61d865d4428c9fed893dd4c91a7f29d515c5 - languageName: node - linkType: hard - -"detective-less@npm:^1.0.2": - version: 1.0.2 - resolution: "detective-less@npm:1.0.2" - dependencies: - debug: ^4.0.0 - gonzales-pe: ^4.2.3 - node-source-walk: ^4.0.0 - checksum: 858936fbad87423bd5d7502ff5fafca023e7c99e4006ed01b31c12c4b5ff8697edce91419798479d857efec68ee8f022fcac64de5530db6a64012be600a2249e - languageName: node - linkType: hard - -"detective-postcss@npm:^4.0.0": - version: 4.0.0 - resolution: "detective-postcss@npm:4.0.0" - dependencies: - debug: ^4.1.1 - is-url: ^1.2.4 - postcss: ^8.1.7 - postcss-values-parser: ^2.0.1 - checksum: e4c9fed31613df43466357fb104c4c5cdaf45a12909f7c1174161a45ebb2ebe77bb0843b3c0c117b68f55c9acb4e0578668298594c7f0108dfb73e54aaec8513 - languageName: node - linkType: hard - -"detective-postcss@npm:^6.1.0, detective-postcss@npm:^6.1.1": - version: 6.1.3 - resolution: "detective-postcss@npm:6.1.3" - dependencies: - is-url: ^1.2.4 - postcss: ^8.4.23 - postcss-values-parser: ^6.0.2 - checksum: 54c58227d5a1ec27e1b2b23bd992d823d0161d80e3d8ff6b202094e9841d53e88ac96a4d4cc9762ba4f09a9e038832b5d7c7a45b5e373c1c995c424a8289857b - languageName: node - linkType: hard - -"detective-sass@npm:^3.0.1": - version: 3.0.2 - resolution: "detective-sass@npm:3.0.2" - dependencies: - gonzales-pe: ^4.3.0 - node-source-walk: ^4.0.0 - checksum: 7489e5ae7dbed2eba89855cea21ad32321e8e92bd9f2d3b925e7feec0dd9aa8b4b865296525275938e573a3be9759715490038103cbc970570a1c48c4f2fd23d - languageName: node - linkType: hard - -"detective-sass@npm:^4.0.1, detective-sass@npm:^4.1.1": - version: 4.1.3 - resolution: "detective-sass@npm:4.1.3" - dependencies: - gonzales-pe: ^4.3.0 - node-source-walk: ^5.0.1 - checksum: 91681e90037cc935f38b2867fab2aa5585848491b3a269dfb44b37721146ff83f57a540d964b15db22dc1f232623568bedfd13470ec7363e6111991d4d3fe573 - languageName: node - linkType: hard - -"detective-scss@npm:^2.0.1": - version: 2.0.2 - resolution: "detective-scss@npm:2.0.2" - dependencies: - gonzales-pe: ^4.3.0 - node-source-walk: ^4.0.0 - checksum: 515ff1b8946ec92baead48ef435efe1ea0f33ee1d98a7537dd700f1d06dd192f9ea0971c10343adcb08b561ab296d01c18a1f62d0b63163a8f4c09885a956e1a - languageName: node - linkType: hard - -"detective-scss@npm:^3.0.0, detective-scss@npm:^3.0.1": - version: 3.1.1 - resolution: "detective-scss@npm:3.1.1" - dependencies: - gonzales-pe: ^4.3.0 - node-source-walk: ^5.0.1 - checksum: 3d9c0468216c822c25572e700b9aba1e2e2797d336b6b84fd455d83ce849263324855008d1e58d6ccdf9c7a4f099e31277b99e885407cd19674e0bb10fc458cd - languageName: node - linkType: hard - -"detective-stylus@npm:^1.0.0": - version: 1.0.3 - resolution: "detective-stylus@npm:1.0.3" - checksum: 2723da93545f3a55a2a7eaa76b50712457af3c93c2b003e95d02f4c240d5e5206a5df99209a4f5b54128c11fc4270c2de1d7316b4f7d02b359483ae74f5a6637 - languageName: node - linkType: hard - -"detective-stylus@npm:^2.0.1": - version: 2.0.1 - resolution: "detective-stylus@npm:2.0.1" - checksum: c701ba6df3e6b5346aa5dd37b8329a9069a20fd7d075933e2e3b819a75922a2adab809143591151e7337183d59c980e6bc64ad6e51ce96de864575221c1b9506 - languageName: node - linkType: hard - -"detective-stylus@npm:^3.0.0": - version: 3.0.0 - resolution: "detective-stylus@npm:3.0.0" - checksum: e82eda490406d289f7b22050423ad69eb1c0f0d88414adaa292de4ab533be3c50d4cf512a9fefba426f3ad20789f0c0db3b0d32f70162112ca89034bbc5ca9d3 - languageName: node - linkType: hard - -"detective-typescript@npm:^7.0.0": - version: 7.0.2 - resolution: "detective-typescript@npm:7.0.2" - dependencies: - "@typescript-eslint/typescript-estree": ^4.33.0 - ast-module-types: ^2.7.1 - node-source-walk: ^4.2.0 - typescript: ^3.9.10 - checksum: 77703410baa242029dc5e7d02cca7a26278dea498ec1c3320f92efa08a85263affc3b102fc2b09952ece1d2c851a3808733d7bfa9ed11944a7c0f39920e33ec9 - languageName: node - linkType: hard - -"detective-typescript@npm:^9.0.0, detective-typescript@npm:^9.1.1": - version: 9.1.1 - resolution: "detective-typescript@npm:9.1.1" - dependencies: - "@typescript-eslint/typescript-estree": ^5.55.0 - ast-module-types: ^4.0.0 - node-source-walk: ^5.0.1 - typescript: ^4.9.5 - checksum: 5f50801f622740d4e9d724ce04518ceb81591215bf18c18c5d22f6f3948df49dfb0a8bbe3596dac47220a37028bc2879ccd7a968f265217c9855817bda4622f5 - languageName: node - linkType: hard - -"didyoumean@npm:^1.2.2": - version: 1.2.2 - resolution: "didyoumean@npm:1.2.2" - checksum: d5d98719d58b3c2fa59663c4c42ba9716f1fd01245c31d5fce31915bd3aa26e6aac149788e007358f778ebbd68a2256eb5973e8ca6f221df221ba060115acf2e - languageName: node - linkType: hard - -"diff-sequences@npm:^29.6.3": - version: 29.6.3 - resolution: "diff-sequences@npm:29.6.3" - checksum: f4914158e1f2276343d98ff5b31fc004e7304f5470bf0f1adb2ac6955d85a531a6458d33e87667f98f6ae52ebd3891bb47d420bb48a5bd8b7a27ee25b20e33aa - languageName: node - linkType: hard - -"diff@npm:5.0.0": - version: 5.0.0 - resolution: "diff@npm:5.0.0" - checksum: f19fe29284b633afdb2725c2a8bb7d25761ea54d321d8e67987ac851c5294be4afeab532bd84531e02583a3fe7f4014aa314a3eda84f5590e7a9e6b371ef3b46 - languageName: node - linkType: hard - -"diff@npm:^4.0.1": - version: 4.0.2 - resolution: "diff@npm:4.0.2" - checksum: f2c09b0ce4e6b301c221addd83bf3f454c0bc00caa3dd837cf6c127d6edf7223aa2bbe3b688feea110b7f262adbfc845b757c44c8a9f8c0c5b15d8fa9ce9d20d - languageName: node - linkType: hard - -"diffie-hellman@npm:^5.0.0": - version: 5.0.3 - resolution: "diffie-hellman@npm:5.0.3" - dependencies: - bn.js: ^4.1.0 - miller-rabin: ^4.0.0 - randombytes: ^2.0.0 - checksum: 0e620f322170c41076e70181dd1c24e23b08b47dbb92a22a644f3b89b6d3834b0f8ee19e37916164e5eb1ee26d2aa836d6129f92723995267250a0b541811065 - languageName: node - linkType: hard - -"dijkstrajs@npm:^1.0.1": - version: 1.0.2 - resolution: "dijkstrajs@npm:1.0.2" - checksum: 8cd822441a26f190da24d69bfab7b433d080b09e069e41e046ac84e152f182a1ed9478d531b34126e000adaa7b73114a0f85fcac117a7d25b3edf302d57c0d09 - languageName: node - linkType: hard - -"dir-glob@npm:^3.0.1": - version: 3.0.1 - resolution: "dir-glob@npm:3.0.1" - dependencies: - path-type: ^4.0.0 - checksum: fa05e18324510d7283f55862f3161c6759a3f2f8dbce491a2fc14c8324c498286c54282c1f0e933cb930da8419b30679389499b919122952a4f8592362ef4615 - languageName: node - linkType: hard - -"dlv@npm:^1.1.3": - version: 1.1.3 - resolution: "dlv@npm:1.1.3" - checksum: d7381bca22ed11933a1ccf376db7a94bee2c57aa61e490f680124fa2d1cd27e94eba641d9f45be57caab4f9a6579de0983466f620a2cd6230d7ec93312105ae7 - languageName: node - linkType: hard - -"dns-equal@npm:^1.0.0": - version: 1.0.0 - resolution: "dns-equal@npm:1.0.0" - checksum: a8471ac849c7c13824f053babea1bc26e2f359394dd5a460f8340d8abd13434be01e3327a5c59d212f8c8997817450efd3f3ac77bec709b21979cf0235644524 - languageName: node - linkType: hard - -"dns-packet@npm:^5.2.2": - version: 5.5.0 - resolution: "dns-packet@npm:5.5.0" - dependencies: - "@leichtgewicht/ip-codec": ^2.0.1 - checksum: 3aa26bb03a613362937225f786d46b1a39b5002d0a68b40537326b090685d5c53d46e25cc7c610f2a29ea5029c8ce480c368a8b0492932c5fb88ebc377676e84 - languageName: node - linkType: hard - -"doctrine@npm:^2.1.0": - version: 2.1.0 - resolution: "doctrine@npm:2.1.0" - dependencies: - esutils: ^2.0.2 - checksum: a45e277f7feaed309fe658ace1ff286c6e2002ac515af0aaf37145b8baa96e49899638c7cd47dccf84c3d32abfc113246625b3ac8f552d1046072adee13b0dc8 - languageName: node - linkType: hard - -"doctrine@npm:^3.0.0": - version: 3.0.0 - resolution: "doctrine@npm:3.0.0" - dependencies: - esutils: ^2.0.2 - checksum: fd7673ca77fe26cd5cba38d816bc72d641f500f1f9b25b83e8ce28827fe2da7ad583a8da26ab6af85f834138cf8dae9f69b0cd6ab925f52ddab1754db44d99ce - languageName: node - linkType: hard - -"dogapi@npm:2.8.4": - version: 2.8.4 - resolution: "dogapi@npm:2.8.4" - dependencies: - extend: ^3.0.2 - json-bigint: ^1.0.0 - lodash: ^4.17.21 - minimist: ^1.2.5 - rc: ^1.2.8 - bin: - dogapi: bin/dogapi - checksum: 153da30207eb124c6e1d742ef10bc04bb4d671022a04e7a7b0122c236deaebe3cd1086e47fde7c61242f9e6bbee3271025abf6db083c008117f662a5ac355c3e - languageName: node - linkType: hard - -"dom-accessibility-api@npm:^0.5.6, dom-accessibility-api@npm:^0.5.9": - version: 0.5.16 - resolution: "dom-accessibility-api@npm:0.5.16" - checksum: 005eb283caef57fc1adec4d5df4dd49189b628f2f575af45decb210e04d634459e3f1ee64f18b41e2dcf200c844bc1d9279d80807e686a30d69a4756151ad248 - languageName: node - linkType: hard - -"dom-accessibility-api@npm:^0.6.3": - version: 0.6.3 - resolution: "dom-accessibility-api@npm:0.6.3" - checksum: c325b5144bb406df23f4affecffc117dbaec9af03daad9ee6b510c5be647b14d28ef0a4ea5ca06d696d8ab40bb777e5fed98b985976fdef9d8790178fa1d573f - languageName: node - linkType: hard - -"dom-converter@npm:^0.2.0": - version: 0.2.0 - resolution: "dom-converter@npm:0.2.0" - dependencies: - utila: ~0.4 - checksum: ea52fe303f5392e48dea563abef0e6fb3a478b8dbe3c599e99bb5d53981c6c38fc4944e56bb92a8ead6bb989d10b7914722ae11febbd2fd0910e33b9fc4aaa77 - languageName: node - linkType: hard - -"dom-serializer@npm:0": - version: 0.2.2 - resolution: "dom-serializer@npm:0.2.2" - dependencies: - domelementtype: ^2.0.1 - entities: ^2.0.0 - checksum: 376344893e4feccab649a14ca1a46473e9961f40fe62479ea692d4fee4d9df1c00ca8654811a79c1ca7b020096987e1ca4fb4d7f8bae32c1db800a680a0e5d5e - languageName: node - linkType: hard - -"dom-serializer@npm:^1.0.1": - version: 1.3.2 - resolution: "dom-serializer@npm:1.3.2" - dependencies: - domelementtype: ^2.0.1 - domhandler: ^4.2.0 - entities: ^2.0.0 - checksum: bff48714944d67b160db71ba244fb0f3fe72e77ef2ec8414e2eeb56f2d926e404a13456b8b83a5392e217ba47dec2ec0c368801b31481813e94d185276c3e964 - languageName: node - linkType: hard - -"dom-serializer@npm:^2.0.0": - version: 2.0.0 - resolution: "dom-serializer@npm:2.0.0" - dependencies: - domelementtype: ^2.3.0 - domhandler: ^5.0.2 - entities: ^4.2.0 - checksum: cd1810544fd8cdfbd51fa2c0c1128ec3a13ba92f14e61b7650b5de421b88205fd2e3f0cc6ace82f13334114addb90ed1c2f23074a51770a8e9c1273acbc7f3e6 - languageName: node - linkType: hard - -"dom-walk@npm:^0.1.0": - version: 0.1.2 - resolution: "dom-walk@npm:0.1.2" - checksum: 19eb0ce9c6de39d5e231530685248545d9cd2bd97b2cb3486e0bfc0f2a393a9addddfd5557463a932b52fdfcf68ad2a619020cd2c74a5fe46fbecaa8e80872f3 - languageName: node - linkType: hard - -"domain-browser@npm:^4.22.0": - version: 4.22.0 - resolution: "domain-browser@npm:4.22.0" - checksum: e7ce1c19073e17dec35cfde050a3ddaac437d3ba8b870adabf9d5682e665eab3084df05de432dedf25b34303f0a2c71ac30f1cdba61b1aea018047b10de3d988 - languageName: node - linkType: hard - -"domelementtype@npm:1": - version: 1.3.1 - resolution: "domelementtype@npm:1.3.1" - checksum: 7893da40218ae2106ec6ffc146b17f203487a52f5228b032ea7aa470e41dfe03e1bd762d0ee0139e792195efda765434b04b43cddcf63207b098f6ae44b36ad6 - languageName: node - linkType: hard - -"domelementtype@npm:^2.0.1, domelementtype@npm:^2.2.0, domelementtype@npm:^2.3.0": - version: 2.3.0 - resolution: "domelementtype@npm:2.3.0" - checksum: ee837a318ff702622f383409d1f5b25dd1024b692ef64d3096ff702e26339f8e345820f29a68bcdcea8cfee3531776b3382651232fbeae95612d6f0a75efb4f6 - languageName: node - linkType: hard - -"domexception@npm:^4.0.0": - version: 4.0.0 - resolution: "domexception@npm:4.0.0" - dependencies: - webidl-conversions: ^7.0.0 - checksum: ddbc1268edf33a8ba02ccc596735ede80375ee0cf124b30d2f05df5b464ba78ef4f49889b6391df4a04954e63d42d5631c7fcf8b1c4f12bc531252977a5f13d5 - languageName: node - linkType: hard - -"domhandler@npm:^4.0.0, domhandler@npm:^4.2.0, domhandler@npm:^4.3.1": - version: 4.3.1 - resolution: "domhandler@npm:4.3.1" - dependencies: - domelementtype: ^2.2.0 - checksum: 4c665ceed016e1911bf7d1dadc09dc888090b64dee7851cccd2fcf5442747ec39c647bb1cb8c8919f8bbdd0f0c625a6bafeeed4b2d656bbecdbae893f43ffaaa - languageName: node - linkType: hard - -"domhandler@npm:^5.0, domhandler@npm:^5.0.2, domhandler@npm:^5.0.3": - version: 5.0.3 - resolution: "domhandler@npm:5.0.3" - dependencies: - domelementtype: ^2.3.0 - checksum: 0f58f4a6af63e6f3a4320aa446d28b5790a009018707bce2859dcb1d21144c7876482b5188395a188dfa974238c019e0a1e610d2fc269a12b2c192ea2b0b131c - languageName: node - linkType: hard - -"domutils@npm:^1.7.0": - version: 1.7.0 - resolution: "domutils@npm:1.7.0" - dependencies: - dom-serializer: 0 - domelementtype: 1 - checksum: f60a725b1f73c1ae82f4894b691601ecc6ecb68320d87923ac3633137627c7865725af813ae5d188ad3954283853bcf46779eb50304ec5d5354044569fcefd2b - languageName: node - linkType: hard - -"domutils@npm:^2.5.2, domutils@npm:^2.8.0": - version: 2.8.0 - resolution: "domutils@npm:2.8.0" - dependencies: - dom-serializer: ^1.0.1 - domelementtype: ^2.2.0 - domhandler: ^4.2.0 - checksum: abf7434315283e9aadc2a24bac0e00eab07ae4313b40cc239f89d84d7315ebdfd2fb1b5bf750a96bc1b4403d7237c7b2ebf60459be394d625ead4ca89b934391 - languageName: node - linkType: hard - -"domutils@npm:^3.0.1, domutils@npm:^3.1.0": - version: 3.1.0 - resolution: "domutils@npm:3.1.0" - dependencies: - dom-serializer: ^2.0.0 - domelementtype: ^2.3.0 - domhandler: ^5.0.3 - checksum: e5757456ddd173caa411cfc02c2bb64133c65546d2c4081381a3bafc8a57411a41eed70494551aa58030be9e58574fcc489828bebd673863d39924fb4878f416 - languageName: node - linkType: hard - -"dot-case@npm:^3.0.4": - version: 3.0.4 - resolution: "dot-case@npm:3.0.4" - dependencies: - no-case: ^3.0.4 - tslib: ^2.0.3 - checksum: a65e3519414856df0228b9f645332f974f2bf5433370f544a681122eab59e66038fc3349b4be1cdc47152779dac71a5864f1ccda2f745e767c46e9c6543b1169 - languageName: node - linkType: hard - -"dot-prop@npm:^4.2.1": - version: 4.2.1 - resolution: "dot-prop@npm:4.2.1" - dependencies: - is-obj: ^1.0.0 - checksum: 5f4f19aa440bc548670d87f2adcbd105fa6842cd1fba3165a8a2b1380568ae82862acf8ebafcc6093fa062505d7d08d7155c7ba9a88da212f7348e95ef2bdce6 - languageName: node - linkType: hard - -"dot-prop@npm:^5.1.0": - version: 5.3.0 - resolution: "dot-prop@npm:5.3.0" - dependencies: - is-obj: ^2.0.0 - checksum: d5775790093c234ef4bfd5fbe40884ff7e6c87573e5339432870616331189f7f5d86575c5b5af2dcf0f61172990f4f734d07844b1f23482fff09e3c4bead05ea - languageName: node - linkType: hard - -"dot-prop@npm:^6.0.0": - version: 6.0.1 - resolution: "dot-prop@npm:6.0.1" - dependencies: - is-obj: ^2.0.0 - checksum: 0f47600a4b93e1dc37261da4e6909652c008832a5d3684b5bf9a9a0d3f4c67ea949a86dceed9b72f5733ed8e8e6383cc5958df3bbd0799ee317fd181f2ece700 - languageName: node - linkType: hard - -"dotenv-cli@npm:7.1.0": - version: 7.1.0 - resolution: "dotenv-cli@npm:7.1.0" - dependencies: - cross-spawn: ^7.0.3 - dotenv: ^16.0.0 - dotenv-expand: ^10.0.0 - minimist: ^1.2.6 - bin: - dotenv: cli.js - checksum: aa4e967061477a181d61e837246d79bc2c65fd6c664d4dbeda04d42283c3a8fb685163b1f3cf2474df97fae4429d5040f1ec6ea9d19e1ed092d4885469e54983 - languageName: node - linkType: hard - -"dotenv-defaults@npm:^2.0.2": - version: 2.0.2 - resolution: "dotenv-defaults@npm:2.0.2" - dependencies: - dotenv: ^8.2.0 - checksum: c005960bd048e2189c4799e729c41f362e415e6e0b54313d3f31e853a84b049bf770b25cb21c112c2805bb13a8376edc9de451fb514abf8546392d327c27f6e5 - languageName: node - linkType: hard - -"dotenv-expand@npm:^10.0.0": - version: 10.0.0 - resolution: "dotenv-expand@npm:10.0.0" - checksum: 2a38b470efe0abcb1ac8490421a55e1d764dc9440fd220942bce40965074f3fb00b585f4346020cb0f0f219966ee6b4ee5023458b3e2953fe5b3214de1b314ee - languageName: node - linkType: hard - -"dotenv-expand@npm:^5.1.0": - version: 5.1.0 - resolution: "dotenv-expand@npm:5.1.0" - checksum: 8017675b7f254384915d55f9eb6388e577cf0a1231a28d54b0ca03b782be9501b0ac90ac57338636d395fa59051e6209e9b44b8ddf169ce6076dffb5dea227d3 - languageName: node - linkType: hard - -"dotenv-expand@npm:~11.0.6": - version: 11.0.6 - resolution: "dotenv-expand@npm:11.0.6" - dependencies: - dotenv: ^16.4.4 - checksum: dbbe1ecbdf17f4ba5556744b259801bdbc8c221c0d167f4f3ef079206ebf658f487fe96ea1fd504dc15172328d25f6c665581eb8d873298904a52d48a2004b49 - languageName: node - linkType: hard - -"dotenv-webpack@npm:8.0.1": - version: 8.0.1 - resolution: "dotenv-webpack@npm:8.0.1" - dependencies: - dotenv-defaults: ^2.0.2 - peerDependencies: - webpack: ^4 || ^5 - checksum: ee73eda78df90bcf7446763dfe5e518a2054ed6222783856912d2c6a255fdfc041854e125e036ff2603b06fb44f5234713fad5feecb1e66a54fe78a35a98fb87 - languageName: node - linkType: hard - -"dotenv@npm:16.0.3": - version: 16.0.3 - resolution: "dotenv@npm:16.0.3" - checksum: afcf03f373d7a6d62c7e9afea6328e62851d627a4e73f2e12d0a8deae1cd375892004f3021883f8aec85932cd2834b091f568ced92b4774625b321db83b827f8 - languageName: node - linkType: hard - -"dotenv@npm:^10.0.0": - version: 10.0.0 - resolution: "dotenv@npm:10.0.0" - checksum: f412c5fe8c24fbe313d302d2500e247ba8a1946492db405a4de4d30dd0eb186a88a43f13c958c5a7de303938949c4231c56994f97d05c4bc1f22478d631b4005 - languageName: node - linkType: hard - -"dotenv@npm:^14.2.0": - version: 14.3.2 - resolution: "dotenv@npm:14.3.2" - checksum: 86c06758915d6facc35275f4a7fafc16705b6f3b44befaa8abca91367991efc8ff8db5437d3cc14778231d19fb97610fe82d60f8a53ba723cdb69fe4171439aa - languageName: node - linkType: hard - -"dotenv@npm:^16.0.0, dotenv@npm:^16.4.4, dotenv@npm:~16.4.5": - version: 16.4.5 - resolution: "dotenv@npm:16.4.5" - checksum: 301a12c3d44fd49888b74eb9ccf9f07a1f5df43f489e7fcb89647a2edcd84c42d6bc349dc8df099cd18f07c35c7b04685c1a4f3e6a6a9e6b30f8d48c15b7f49c - languageName: node - linkType: hard - -"dotenv@npm:^8.2.0": - version: 8.6.0 - resolution: "dotenv@npm:8.6.0" - checksum: 38e902c80b0666ab59e9310a3d24ed237029a7ce34d976796349765ac96b8d769f6df19090f1f471b77a25ca391971efde8a1ea63bb83111bd8bec8e5cc9b2cd - languageName: node - linkType: hard - -"dset@npm:^3.1.2": - version: 3.1.2 - resolution: "dset@npm:3.1.2" - checksum: 4f8066f517aa0a70af688c66e9a0a5590f0aada76f6edc7ba9ddb309e27d3a6d65c0a2e31ab2a84005d4c791e5327773cdde59b8ab169050330a0dc283663e87 - languageName: node - linkType: hard - -"duplexer3@npm:^0.1.4": - version: 0.1.4 - resolution: "duplexer3@npm:0.1.4" - checksum: c2fd6969314607d23439c583699aaa43c4100d66b3e161df55dccd731acc57d5c81a64bb4f250805fbe434ddb1d2623fee2386fb890f5886ca1298690ec53415 - languageName: node - linkType: hard - -"duplexer@npm:^0.1.2, duplexer@npm:~0.1.1": - version: 0.1.2 - resolution: "duplexer@npm:0.1.2" - checksum: 62ba61a830c56801db28ff6305c7d289b6dc9f859054e8c982abd8ee0b0a14d2e9a8e7d086ffee12e868d43e2bbe8a964be55ddbd8c8957714c87373c7a4f9b0 - languageName: node - linkType: hard - -"duplexify@npm:^3.6.0": - version: 3.7.1 - resolution: "duplexify@npm:3.7.1" - dependencies: - end-of-stream: ^1.0.0 - inherits: ^2.0.1 - readable-stream: ^2.0.0 - stream-shift: ^1.0.0 - checksum: 3c2ed2223d956a5da713dae12ba8295acb61d9acd966ccbba938090d04f4574ca4dca75cca089b5077c2d7e66101f32e6ea9b36a78ca213eff574e7a8b8accf2 - languageName: node - linkType: hard - -"duplexify@npm:^4.0.0, duplexify@npm:^4.1.1, duplexify@npm:^4.1.2": - version: 4.1.3 - resolution: "duplexify@npm:4.1.3" - dependencies: - end-of-stream: ^1.4.1 - inherits: ^2.0.3 - readable-stream: ^3.1.1 - stream-shift: ^1.0.2 - checksum: 9636a027345de3dd3c801594d01a7c73d9ce260019538beb1ee650bba7544e72f40a4d4902b52e1ab283dc32a06f210d42748773af02ff15e3064a9659deab7f - languageName: node - linkType: hard - -"eastasianwidth@npm:^0.2.0": - version: 0.2.0 - resolution: "eastasianwidth@npm:0.2.0" - checksum: 7d00d7cd8e49b9afa762a813faac332dee781932d6f2c848dc348939c4253f1d4564341b7af1d041853bc3f32c2ef141b58e0a4d9862c17a7f08f68df1e0f1ed - languageName: node - linkType: hard - -"ecc-jsbn@npm:~0.1.1": - version: 0.1.2 - resolution: "ecc-jsbn@npm:0.1.2" - dependencies: - jsbn: ~0.1.0 - safer-buffer: ^2.1.0 - checksum: 22fef4b6203e5f31d425f5b711eb389e4c6c2723402e389af394f8411b76a488fa414d309d866e2b577ce3e8462d344205545c88a8143cc21752a5172818888a - languageName: node - linkType: hard - -"ecdsa-sig-formatter@npm:1.0.11, ecdsa-sig-formatter@npm:^1.0.11": - version: 1.0.11 - resolution: "ecdsa-sig-formatter@npm:1.0.11" - dependencies: - safe-buffer: ^5.0.1 - checksum: 207f9ab1c2669b8e65540bce29506134613dd5f122cccf1e6a560f4d63f2732d427d938f8481df175505aad94583bcb32c688737bb39a6df0625f903d6d93c03 - languageName: node - linkType: hard - -"eciesjs@npm:^0.3.15": - version: 0.3.21 - resolution: "eciesjs@npm:0.3.21" - dependencies: - futoin-hkdf: ^1.5.3 - secp256k1: ^5.0.1 - checksum: 257065d17232f4d9bbd1a1045432c23728a7b30db4f791ac8ac5c1a54ce302a176eb1d58e28011c562a4e10ebdbd688942025cf927e06f6010610522d1959734 - languageName: node - linkType: hard - -"edit-json-file@npm:^1.7.0": - version: 1.8.0 - resolution: "edit-json-file@npm:1.8.0" - dependencies: - find-value: ^1.0.12 - iterate-object: ^1.3.4 - r-json: ^1.2.10 - set-value: ^4.1.0 - w-json: ^1.3.10 - checksum: 2676d5195d31b93457ecdaa4e043bb941cf0a146c1c416496fc50b2b6cb7f8773f8a60abd39cf91b0bea57cd8be7870dfc7dd802864a6bdb2cf1a46fdf40183c - languageName: node - linkType: hard - -"ee-first@npm:1.1.1": - version: 1.1.1 - resolution: "ee-first@npm:1.1.1" - checksum: 1b4cac778d64ce3b582a7e26b218afe07e207a0f9bfe13cc7395a6d307849cfe361e65033c3251e00c27dd060cab43014c2d6b2647676135e18b77d2d05b3f4f - languageName: node - linkType: hard - -"ejs@npm:^3.1.10, ejs@npm:^3.1.5, ejs@npm:^3.1.6": - version: 3.1.10 - resolution: "ejs@npm:3.1.10" - dependencies: - jake: ^10.8.5 - bin: - ejs: bin/cli.js - checksum: ce90637e9c7538663ae023b8a7a380b2ef7cc4096de70be85abf5a3b9641912dde65353211d05e24d56b1f242d71185c6d00e02cb8860701d571786d92c71f05 - languageName: node - linkType: hard - -"electron-to-chromium@npm:^1.5.73": - version: 1.5.91 - resolution: "electron-to-chromium@npm:1.5.91" - checksum: 50780d8a9cc5ec371f53e4b2dd548c8117c823b7cdf19ed9f0b56709d6194a09b0b6ef4eb022ffd5ff56865c2357e076eccf8c7b6d121e22ecde2c70dab267f7 - languageName: node - linkType: hard - -"electron@npm:^23.1.2": - version: 23.3.13 - resolution: "electron@npm:23.3.13" - dependencies: - "@electron/get": ^2.0.0 - "@types/node": ^16.11.26 - extract-zip: ^2.0.1 - bin: - electron: cli.js - checksum: ada215540c2482471aa30293fe415da104e090a28d1fde6e720584bc28a6855a864d7cb977c60d560d0dc26d93c9f52febe33501b764bac21cf4725a299fa886 - languageName: node - linkType: hard - -"elliptic@npm:6.5.7": - version: 6.5.7 - resolution: "elliptic@npm:6.5.7" - dependencies: - bn.js: ^4.11.9 - brorand: ^1.1.0 - hash.js: ^1.0.0 - hmac-drbg: ^1.0.1 - inherits: ^2.0.4 - minimalistic-assert: ^1.0.1 - minimalistic-crypto-utils: ^1.0.1 - checksum: af0ffddffdbc2fea4eeec74388cd73e62ed5a0eac6711568fb28071566319785df529c968b0bf1250ba4bc628e074b2d64c54a633e034aa6f0c6b152ceb49ab8 - languageName: node - linkType: hard - -"emittery@npm:^0.10.2": - version: 0.10.2 - resolution: "emittery@npm:0.10.2" - checksum: ee3e21788b043b90885b18ea756ec3105c1cedc50b29709c92b01e239c7e55345d4bb6d3aef4ddbaf528eef448a40b3bb831bad9ee0fc9c25cbf1367ab1ab5ac - languageName: node - linkType: hard - -"emittery@npm:^0.13.1": - version: 0.13.1 - resolution: "emittery@npm:0.13.1" - checksum: 2b089ab6306f38feaabf4f6f02792f9ec85fc054fda79f44f6790e61bbf6bc4e1616afb9b232e0c5ec5289a8a452f79bfa6d905a6fd64e94b49981f0934001c6 - languageName: node - linkType: hard - -"emoji-regex@npm:^10.2.1": - version: 10.3.0 - resolution: "emoji-regex@npm:10.3.0" - checksum: 5da48edfeb9462fb1ae5495cff2d79129974c696853fb0ce952cbf560f29a2756825433bf51cfd5157ec7b9f93f46f31d712e896d63e3d8ac9c3832bdb45ab73 - languageName: node - linkType: hard - -"emoji-regex@npm:^8.0.0": - version: 8.0.0 - resolution: "emoji-regex@npm:8.0.0" - checksum: d4c5c39d5a9868b5fa152f00cada8a936868fd3367f33f71be515ecee4c803132d11b31a6222b2571b1e5f7e13890156a94880345594d0ce7e3c9895f560f192 - languageName: node - linkType: hard - -"emoji-regex@npm:^9.2.2": - version: 9.2.2 - resolution: "emoji-regex@npm:9.2.2" - checksum: 8487182da74aabd810ac6d6f1994111dfc0e331b01271ae01ec1eb0ad7b5ecc2bbbbd2f053c05cb55a1ac30449527d819bbfbf0e3de1023db308cbcb47f86601 - languageName: node - linkType: hard - -"emojis-list@npm:^3.0.0": - version: 3.0.0 - resolution: "emojis-list@npm:3.0.0" - checksum: ddaaa02542e1e9436c03970eeed445f4ed29a5337dfba0fe0c38dfdd2af5da2429c2a0821304e8a8d1cadf27fdd5b22ff793571fa803ae16852a6975c65e8e70 - languageName: node - linkType: hard - -"encode-utf8@npm:^1.0.3": - version: 1.0.3 - resolution: "encode-utf8@npm:1.0.3" - checksum: 550224bf2a104b1d355458c8a82e9b4ea07f9fc78387bc3a49c151b940ad26473de8dc9e121eefc4e84561cb0b46de1e4cd2bc766f72ee145e9ea9541482817f - languageName: node - linkType: hard - -"encodeurl@npm:~1.0.2": - version: 1.0.2 - resolution: "encodeurl@npm:1.0.2" - checksum: e50e3d508cdd9c4565ba72d2012e65038e5d71bdc9198cb125beb6237b5b1ade6c0d343998da9e170fb2eae52c1bed37d4d6d98a46ea423a0cddbed5ac3f780c - languageName: node - linkType: hard - -"encodeurl@npm:~2.0.0": - version: 2.0.0 - resolution: "encodeurl@npm:2.0.0" - checksum: abf5cd51b78082cf8af7be6785813c33b6df2068ce5191a40ca8b1afe6a86f9230af9a9ce694a5ce4665955e5c1120871826df9c128a642e09c58d592e2807fe - languageName: node - linkType: hard - -"encoding@npm:^0.1.13": - version: 0.1.13 - resolution: "encoding@npm:0.1.13" - dependencies: - iconv-lite: ^0.6.2 - checksum: bb98632f8ffa823996e508ce6a58ffcf5856330fde839ae42c9e1f436cc3b5cc651d4aeae72222916545428e54fd0f6aa8862fd8d25bdbcc4589f1e3f3715e7f - languageName: node - linkType: hard - -"end-of-stream@npm:^1.0.0, end-of-stream@npm:^1.1.0, end-of-stream@npm:^1.4.0, end-of-stream@npm:^1.4.1": - version: 1.4.4 - resolution: "end-of-stream@npm:1.4.4" - dependencies: - once: ^1.4.0 - checksum: 530a5a5a1e517e962854a31693dbb5c0b2fc40b46dad2a56a2deec656ca040631124f4795823acc68238147805f8b021abbe221f4afed5ef3c8e8efc2024908b - languageName: node - linkType: hard - -"endent@npm:^2.0.1": - version: 2.1.0 - resolution: "endent@npm:2.1.0" - dependencies: - dedent: ^0.7.0 - fast-json-parse: ^1.0.3 - objectorarray: ^1.0.5 - checksum: c352831088fce745a39ddbd5f87a17e073ea6556e7e96e9010d945a3f3020f836b9a84657123fa01e897db9216f4b080d950b5ded9bf3a8227f14a34efaaaf7c - languageName: node - linkType: hard - -"engine.io-client@npm:~6.5.2": - version: 6.5.3 - resolution: "engine.io-client@npm:6.5.3" - dependencies: - "@socket.io/component-emitter": ~3.1.0 - debug: ~4.3.1 - engine.io-parser: ~5.2.1 - ws: ~8.11.0 - xmlhttprequest-ssl: ~2.0.0 - checksum: a72596fae99afbdb899926fccdb843f8fa790c69085b881dde121285a6935da2c2c665ebe88e0e6aa4285637782df84ac882084ff4892ad2430b059fc0045db0 - languageName: node - linkType: hard - -"engine.io-parser@npm:~5.2.1": - version: 5.2.2 - resolution: "engine.io-parser@npm:5.2.2" - checksum: 470231215f3136a9259efb1268bc9a71f789af4e8c74da8d3b49ceb149fe3cd5c315bf0cd13d2d8d9c8f0f051c6f93b68e8fa9c89a3b612b9217bf33765c943a - languageName: node - linkType: hard - -"enhanced-resolve@npm:^5.0.0, enhanced-resolve@npm:^5.15.0, enhanced-resolve@npm:^5.17.1, enhanced-resolve@npm:^5.8.3": - version: 5.17.1 - resolution: "enhanced-resolve@npm:5.17.1" - dependencies: - graceful-fs: ^4.2.4 - tapable: ^2.2.0 - checksum: 4bc38cf1cea96456f97503db7280394177d1bc46f8f87c267297d04f795ac5efa81e48115a2f5b6273c781027b5b6bfc5f62b54df629e4d25fa7001a86624f59 - languageName: node - linkType: hard - -"enquirer@npm:^2.3.0, enquirer@npm:^2.3.6": - version: 2.4.1 - resolution: "enquirer@npm:2.4.1" - dependencies: - ansi-colors: ^4.1.1 - strip-ansi: ^6.0.1 - checksum: f080f11a74209647dbf347a7c6a83c8a47ae1ebf1e75073a808bc1088eb780aa54075bfecd1bcdb3e3c724520edb8e6ee05da031529436b421b71066fcc48cb5 - languageName: node - linkType: hard - -"ensure-posix-path@npm:^1.1.0": - version: 1.1.1 - resolution: "ensure-posix-path@npm:1.1.1" - checksum: 90ac69f48a08003abe6f194b75bad78c3320762bd193a063eb76cd8f696be6a34e1524f16435eeee09ccbe3a719a7fb76409dead3ccedd10e32d906ff050457b - languageName: node - linkType: hard - -"entities@npm:^2.0.0, entities@npm:~2.0.0": - version: 2.0.3 - resolution: "entities@npm:2.0.3" - checksum: 5a7899fcc622e0d76afdeafe4c58a6b40ae3a8ee4772e5825a648c11a2ca324a9a02515386f512e466baac4aeb551f3d3b79eaece5cd98369b9f8601be336b1a - languageName: node - linkType: hard - -"entities@npm:^4.2.0, entities@npm:^4.4.0, entities@npm:^4.5.0": - version: 4.5.0 - resolution: "entities@npm:4.5.0" - checksum: 853f8ebd5b425d350bffa97dd6958143179a5938352ccae092c62d1267c4e392a039be1bae7d51b6e4ffad25f51f9617531fedf5237f15df302ccfb452cbf2d7 - languageName: node - linkType: hard - -"env-editor@npm:^0.4.1": - version: 0.4.2 - resolution: "env-editor@npm:0.4.2" - checksum: d162e161d9a1bddaf63f68428c587b1d823afe7d56cde039ce403cc68706c68350c92b9db44692f4ecea1d67ec80de9ba01ca70568299ed929d3fa056c40aebf - languageName: node - linkType: hard - -"env-paths@npm:^2.2.0, env-paths@npm:^2.2.1": - version: 2.2.1 - resolution: "env-paths@npm:2.2.1" - checksum: 65b5df55a8bab92229ab2b40dad3b387fad24613263d103a97f91c9fe43ceb21965cd3392b1ccb5d77088021e525c4e0481adb309625d0cb94ade1d1fb8dc17e - languageName: node - linkType: hard - -"envinfo@npm:^7.13.0, envinfo@npm:^7.7.3": - version: 7.14.0 - resolution: "envinfo@npm:7.14.0" - bin: - envinfo: dist/cli.js - checksum: 137c1dd9a4d5781c4a6cdc6b695454ba3c4ba1829f73927198aa4122f11b35b59d7b2cb7e1ceea1364925a30278897548511d22f860c14253a33797d0bebd551 - languageName: node - linkType: hard - -"eol@npm:^0.9.1": - version: 0.9.1 - resolution: "eol@npm:0.9.1" - checksum: ba9fa998bc8148b935dcf85585eacf049eeaf18d2ab6196710d4d1f59e7dfd0e87b18508dc67144ff8ba12f835a4a4989aeea64c98b13cca77b74b9d4b33bce5 - languageName: node - linkType: hard - -"err-code@npm:^2.0.2": - version: 2.0.3 - resolution: "err-code@npm:2.0.3" - checksum: 8b7b1be20d2de12d2255c0bc2ca638b7af5171142693299416e6a9339bd7d88fc8d7707d913d78e0993176005405a236b066b45666b27b797252c771156ace54 - languageName: node - linkType: hard - -"error-ex@npm:^1.3.1": - version: 1.3.2 - resolution: "error-ex@npm:1.3.2" - dependencies: - is-arrayish: ^0.2.1 - checksum: c1c2b8b65f9c91b0f9d75f0debaa7ec5b35c266c2cac5de412c1a6de86d4cbae04ae44e510378cb14d032d0645a36925d0186f8bb7367bcc629db256b743a001 - languageName: node - linkType: hard - -"error-stack-parser@npm:^2.0.6": - version: 2.1.4 - resolution: "error-stack-parser@npm:2.1.4" - dependencies: - stackframe: ^1.3.4 - checksum: 3b916d2d14c6682f287c8bfa28e14672f47eafe832701080e420e7cdbaebb2c50293868256a95706ac2330fe078cf5664713158b49bc30d7a5f2ac229ded0e18 - languageName: node - linkType: hard - -"errorhandler@npm:^1.5.1": - version: 1.5.1 - resolution: "errorhandler@npm:1.5.1" - dependencies: - accepts: ~1.3.7 - escape-html: ~1.0.3 - checksum: 73b7abb08fb751107e9bebecc33c40c0641a54be8bda8e4a045f3f5cb7b805041927fef5629ea39b1737799eb52fe2499ca531f11ac51b0294ccc4667d72cb91 - languageName: node - linkType: hard - -"es-abstract@npm:^1.17.2, es-abstract@npm:^1.17.5, es-abstract@npm:^1.22.1, es-abstract@npm:^1.22.3, es-abstract@npm:^1.23.0, es-abstract@npm:^1.23.2, es-abstract@npm:^1.23.3": - version: 1.23.5 - resolution: "es-abstract@npm:1.23.5" - dependencies: - array-buffer-byte-length: ^1.0.1 - arraybuffer.prototype.slice: ^1.0.3 - available-typed-arrays: ^1.0.7 - call-bind: ^1.0.7 - data-view-buffer: ^1.0.1 - data-view-byte-length: ^1.0.1 - data-view-byte-offset: ^1.0.0 - es-define-property: ^1.0.0 - es-errors: ^1.3.0 - es-object-atoms: ^1.0.0 - es-set-tostringtag: ^2.0.3 - es-to-primitive: ^1.2.1 - function.prototype.name: ^1.1.6 - get-intrinsic: ^1.2.4 - get-symbol-description: ^1.0.2 - globalthis: ^1.0.4 - gopd: ^1.0.1 - has-property-descriptors: ^1.0.2 - has-proto: ^1.0.3 - has-symbols: ^1.0.3 - hasown: ^2.0.2 - internal-slot: ^1.0.7 - is-array-buffer: ^3.0.4 - is-callable: ^1.2.7 - is-data-view: ^1.0.1 - is-negative-zero: ^2.0.3 - is-regex: ^1.1.4 - is-shared-array-buffer: ^1.0.3 - is-string: ^1.0.7 - is-typed-array: ^1.1.13 - is-weakref: ^1.0.2 - object-inspect: ^1.13.3 - object-keys: ^1.1.1 - object.assign: ^4.1.5 - regexp.prototype.flags: ^1.5.3 - safe-array-concat: ^1.1.2 - safe-regex-test: ^1.0.3 - string.prototype.trim: ^1.2.9 - string.prototype.trimend: ^1.0.8 - string.prototype.trimstart: ^1.0.8 - typed-array-buffer: ^1.0.2 - typed-array-byte-length: ^1.0.1 - typed-array-byte-offset: ^1.0.2 - typed-array-length: ^1.0.6 - unbox-primitive: ^1.0.2 - which-typed-array: ^1.1.15 - checksum: 17c81f8a42f0322fd11e0025d3c2229ecfd7923560c710906b8e68660e19c42322750dcedf8ba5cf28bae50d5befd8174d3903ac50dbabb336d3efc3aabed2ee - languageName: node - linkType: hard - -"es-array-method-boxes-properly@npm:^1.0.0": - version: 1.0.0 - resolution: "es-array-method-boxes-properly@npm:1.0.0" - checksum: 2537fcd1cecf187083890bc6f5236d3a26bf39237433587e5bf63392e88faae929dbba78ff0120681a3f6f81c23fe3816122982c160d63b38c95c830b633b826 - languageName: node - linkType: hard - -"es-define-property@npm:^1.0.0": - version: 1.0.0 - resolution: "es-define-property@npm:1.0.0" - dependencies: - get-intrinsic: ^1.2.4 - checksum: f66ece0a887b6dca71848fa71f70461357c0e4e7249696f81bad0a1f347eed7b31262af4a29f5d726dc026426f085483b6b90301855e647aa8e21936f07293c6 - languageName: node - linkType: hard - -"es-errors@npm:^1.2.1, es-errors@npm:^1.3.0": - version: 1.3.0 - resolution: "es-errors@npm:1.3.0" - checksum: ec1414527a0ccacd7f15f4a3bc66e215f04f595ba23ca75cdae0927af099b5ec865f9f4d33e9d7e86f512f252876ac77d4281a7871531a50678132429b1271b5 - languageName: node - linkType: hard - -"es-iterator-helpers@npm:^1.0.17, es-iterator-helpers@npm:^1.1.0": - version: 1.2.0 - resolution: "es-iterator-helpers@npm:1.2.0" - dependencies: - call-bind: ^1.0.7 - define-properties: ^1.2.1 - es-abstract: ^1.23.3 - es-errors: ^1.3.0 - es-set-tostringtag: ^2.0.3 - function-bind: ^1.1.2 - get-intrinsic: ^1.2.4 - globalthis: ^1.0.4 - gopd: ^1.0.1 - has-property-descriptors: ^1.0.2 - has-proto: ^1.0.3 - has-symbols: ^1.0.3 - internal-slot: ^1.0.7 - iterator.prototype: ^1.1.3 - safe-array-concat: ^1.1.2 - checksum: c5f5ff10d57f956539581aca7a2d8726c5a8a3e49e6285700d74dcd8b64c7a337b9ab5e81b459b079dac745d2fe02e4f6b80a842e3df45d9cfe3f12325fda8c0 - languageName: node - linkType: hard - -"es-module-lexer@npm:^1.2.1, es-module-lexer@npm:^1.5.0": - version: 1.5.4 - resolution: "es-module-lexer@npm:1.5.4" - checksum: a0cf04fb92d052647ac7d818d1913b98d3d3d0f5b9d88f0eafb993436e4c3e2c958599db68839d57f2dfa281fdf0f60e18d448eb78fc292c33c0f25635b6854f - languageName: node - linkType: hard - -"es-object-atoms@npm:^1.0.0": - version: 1.0.0 - resolution: "es-object-atoms@npm:1.0.0" - dependencies: - es-errors: ^1.3.0 - checksum: 26f0ff78ab93b63394e8403c353842b2272836968de4eafe97656adfb8a7c84b9099bf0fe96ed58f4a4cddc860f6e34c77f91649a58a5daa4a9c40b902744e3c - languageName: node - linkType: hard - -"es-set-tostringtag@npm:^2.0.3": - version: 2.0.3 - resolution: "es-set-tostringtag@npm:2.0.3" - dependencies: - get-intrinsic: ^1.2.4 - has-tostringtag: ^1.0.2 - hasown: ^2.0.1 - checksum: 7227fa48a41c0ce83e0377b11130d324ac797390688135b8da5c28994c0165be8b252e15cd1de41e1325e5a5412511586960213e88f9ab4a5e7d028895db5129 - languageName: node - linkType: hard - -"es-shim-unscopables@npm:^1.0.0, es-shim-unscopables@npm:^1.0.2": - version: 1.0.2 - resolution: "es-shim-unscopables@npm:1.0.2" - dependencies: - hasown: ^2.0.0 - checksum: 432bd527c62065da09ed1d37a3f8e623c423683285e6188108286f4a1e8e164a5bcbfbc0051557c7d14633cd2a41ce24c7048e6bbb66a985413fd32f1be72626 - languageName: node - linkType: hard - -"es-to-primitive@npm:^1.2.1": - version: 1.2.1 - resolution: "es-to-primitive@npm:1.2.1" - dependencies: - is-callable: ^1.1.4 - is-date-object: ^1.0.1 - is-symbol: ^1.0.2 - checksum: 4ead6671a2c1402619bdd77f3503991232ca15e17e46222b0a41a5d81aebc8740a77822f5b3c965008e631153e9ef0580540007744521e72de8e33599fca2eed - languageName: node - linkType: hard - -"es-toolkit@npm:1.10.0": - version: 1.10.0 - resolution: "es-toolkit@npm:1.10.0" - checksum: ff5464b7173b2083295f63ca910ce0ed764a55ed8cb843db6011a0e3c1fcbca4b14a661a7cacb829d304942c69f69272932a028a604f5d94dff837eda0ea4938 - languageName: node - linkType: hard - -"es6-error@npm:^4.1.1": - version: 4.1.1 - resolution: "es6-error@npm:4.1.1" - checksum: ae41332a51ec1323da6bbc5d75b7803ccdeddfae17c41b6166ebbafc8e8beb7a7b80b884b7fab1cc80df485860ac3c59d78605e860bb4f8cd816b3d6ade0d010 - languageName: node - linkType: hard - -"es6-object-assign@npm:^1.1.0": - version: 1.1.0 - resolution: "es6-object-assign@npm:1.1.0" - checksum: 8d4fdf63484d78b5c64cacc2c2e1165bc7b6a64b739d2a9db6a4dc8641d99cc9efb433cdd4dc3d3d6b00bfa6ce959694e4665e3255190339945c5f33b692b5d8 - languageName: node - linkType: hard - -"esbuild-loader@npm:3.2.0": - version: 3.2.0 - resolution: "esbuild-loader@npm:3.2.0" - dependencies: - esbuild: ^0.19.0 - get-tsconfig: ^4.6.2 - loader-utils: ^2.0.4 - webpack-sources: ^1.4.3 - peerDependencies: - webpack: ^4.40.0 || ^5.0.0 - checksum: 09d0ae648a0daddd7456ab900e23826958c7a219db943a2248e0ae102926915dd9de4c4dd03f530c1884f5030c32652ea211cf7581504eca68263666e351d686 - languageName: node - linkType: hard - -"esbuild-loader@npm:^4.2.2": - version: 4.2.2 - resolution: "esbuild-loader@npm:4.2.2" - dependencies: - esbuild: ^0.21.0 - get-tsconfig: ^4.7.0 - loader-utils: ^2.0.4 - webpack-sources: ^1.4.3 - peerDependencies: - webpack: ^4.40.0 || ^5.0.0 - checksum: 793d2482693c1c66298f63d7fdb62f2f3e314b006ade1dc3c46b46ade39777c5fba5930c2fa2752636c511997faa08d4a0f5d5b8a734b9046b3626aa6d5ab8e3 - languageName: node - linkType: hard - -"esbuild-plugin-es5@npm:^2.1.1": - version: 2.1.1 - resolution: "esbuild-plugin-es5@npm:2.1.1" - dependencies: - "@swc/core": ^1.5.25 - "@swc/helpers": ^0.5.11 - deepmerge: ^4.3.1 - peerDependencies: - esbuild: "*" - checksum: 4ed4984d83a8f8f49ced24ee135c1cd213e3a76d3dd503fd4f9f4d8c9c9562b88fb267910ef4753e2ddf15159b76d92631857aec2f001d46470266c6e613db01 - languageName: node - linkType: hard - -"esbuild-register@npm:3.6.0, esbuild-register@npm:^3.5.0, esbuild-register@npm:^3.6.0": - version: 3.6.0 - resolution: "esbuild-register@npm:3.6.0" - dependencies: - debug: ^4.3.4 - peerDependencies: - esbuild: ">=0.12 <1" - checksum: 9221e26dde3366398a43183b600d8e9252b8003516cd766983a06c321eb07cf1b6b236948a21e4d1728c17a341c0fa52b49409c951d89fc7bf65d07d43c31a05 - languageName: node - linkType: hard - -"esbuild@npm:0.17.19": - version: 0.17.19 - resolution: "esbuild@npm:0.17.19" - dependencies: - "@esbuild/android-arm": 0.17.19 - "@esbuild/android-arm64": 0.17.19 - "@esbuild/android-x64": 0.17.19 - "@esbuild/darwin-arm64": 0.17.19 - "@esbuild/darwin-x64": 0.17.19 - "@esbuild/freebsd-arm64": 0.17.19 - "@esbuild/freebsd-x64": 0.17.19 - "@esbuild/linux-arm": 0.17.19 - "@esbuild/linux-arm64": 0.17.19 - "@esbuild/linux-ia32": 0.17.19 - "@esbuild/linux-loong64": 0.17.19 - "@esbuild/linux-mips64el": 0.17.19 - "@esbuild/linux-ppc64": 0.17.19 - "@esbuild/linux-riscv64": 0.17.19 - "@esbuild/linux-s390x": 0.17.19 - "@esbuild/linux-x64": 0.17.19 - "@esbuild/netbsd-x64": 0.17.19 - "@esbuild/openbsd-x64": 0.17.19 - "@esbuild/sunos-x64": 0.17.19 - "@esbuild/win32-arm64": 0.17.19 - "@esbuild/win32-ia32": 0.17.19 - "@esbuild/win32-x64": 0.17.19 - dependenciesMeta: - "@esbuild/android-arm": - optional: true - "@esbuild/android-arm64": - optional: true - "@esbuild/android-x64": - optional: true - "@esbuild/darwin-arm64": - optional: true - "@esbuild/darwin-x64": - optional: true - "@esbuild/freebsd-arm64": - optional: true - "@esbuild/freebsd-x64": - optional: true - "@esbuild/linux-arm": - optional: true - "@esbuild/linux-arm64": - optional: true - "@esbuild/linux-ia32": - optional: true - "@esbuild/linux-loong64": - optional: true - "@esbuild/linux-mips64el": - optional: true - "@esbuild/linux-ppc64": - optional: true - "@esbuild/linux-riscv64": - optional: true - "@esbuild/linux-s390x": - optional: true - "@esbuild/linux-x64": - optional: true - "@esbuild/netbsd-x64": - optional: true - "@esbuild/openbsd-x64": - optional: true - "@esbuild/sunos-x64": - optional: true - "@esbuild/win32-arm64": - optional: true - "@esbuild/win32-ia32": - optional: true - "@esbuild/win32-x64": - optional: true - bin: - esbuild: bin/esbuild - checksum: ac11b1a5a6008e4e37ccffbd6c2c054746fc58d0ed4a2f9ee643bd030cfcea9a33a235087bc777def8420f2eaafb3486e76adb7bdb7241a9143b43a69a10afd8 - languageName: node - linkType: hard - -"esbuild@npm:0.17.6": - version: 0.17.6 - resolution: "esbuild@npm:0.17.6" - dependencies: - "@esbuild/android-arm": 0.17.6 - "@esbuild/android-arm64": 0.17.6 - "@esbuild/android-x64": 0.17.6 - "@esbuild/darwin-arm64": 0.17.6 - "@esbuild/darwin-x64": 0.17.6 - "@esbuild/freebsd-arm64": 0.17.6 - "@esbuild/freebsd-x64": 0.17.6 - "@esbuild/linux-arm": 0.17.6 - "@esbuild/linux-arm64": 0.17.6 - "@esbuild/linux-ia32": 0.17.6 - "@esbuild/linux-loong64": 0.17.6 - "@esbuild/linux-mips64el": 0.17.6 - "@esbuild/linux-ppc64": 0.17.6 - "@esbuild/linux-riscv64": 0.17.6 - "@esbuild/linux-s390x": 0.17.6 - "@esbuild/linux-x64": 0.17.6 - "@esbuild/netbsd-x64": 0.17.6 - "@esbuild/openbsd-x64": 0.17.6 - "@esbuild/sunos-x64": 0.17.6 - "@esbuild/win32-arm64": 0.17.6 - "@esbuild/win32-ia32": 0.17.6 - "@esbuild/win32-x64": 0.17.6 - dependenciesMeta: - "@esbuild/android-arm": - optional: true - "@esbuild/android-arm64": - optional: true - "@esbuild/android-x64": - optional: true - "@esbuild/darwin-arm64": - optional: true - "@esbuild/darwin-x64": - optional: true - "@esbuild/freebsd-arm64": - optional: true - "@esbuild/freebsd-x64": - optional: true - "@esbuild/linux-arm": - optional: true - "@esbuild/linux-arm64": - optional: true - "@esbuild/linux-ia32": - optional: true - "@esbuild/linux-loong64": - optional: true - "@esbuild/linux-mips64el": - optional: true - "@esbuild/linux-ppc64": - optional: true - "@esbuild/linux-riscv64": - optional: true - "@esbuild/linux-s390x": - optional: true - "@esbuild/linux-x64": - optional: true - "@esbuild/netbsd-x64": - optional: true - "@esbuild/openbsd-x64": - optional: true - "@esbuild/sunos-x64": - optional: true - "@esbuild/win32-arm64": - optional: true - "@esbuild/win32-ia32": - optional: true - "@esbuild/win32-x64": - optional: true - bin: - esbuild: bin/esbuild - checksum: 13c4c3bcaa7ff291810d2c8294a1eb997b4672c60a9285b32d8eafcbc552e4468e06efe9d1a15067f5cbd41adcb12ddb4362618845e2e916e437f281c9aa80ab - languageName: node - linkType: hard - -"esbuild@npm:^0.18.0 || ^0.19.0 || ^0.20.0 || ^0.21.0 || ^0.22.0 || ^0.23.0 || ^0.24.0, esbuild@npm:^0.24.0": - version: 0.24.0 - resolution: "esbuild@npm:0.24.0" - dependencies: - "@esbuild/aix-ppc64": 0.24.0 - "@esbuild/android-arm": 0.24.0 - "@esbuild/android-arm64": 0.24.0 - "@esbuild/android-x64": 0.24.0 - "@esbuild/darwin-arm64": 0.24.0 - "@esbuild/darwin-x64": 0.24.0 - "@esbuild/freebsd-arm64": 0.24.0 - "@esbuild/freebsd-x64": 0.24.0 - "@esbuild/linux-arm": 0.24.0 - "@esbuild/linux-arm64": 0.24.0 - "@esbuild/linux-ia32": 0.24.0 - "@esbuild/linux-loong64": 0.24.0 - "@esbuild/linux-mips64el": 0.24.0 - "@esbuild/linux-ppc64": 0.24.0 - "@esbuild/linux-riscv64": 0.24.0 - "@esbuild/linux-s390x": 0.24.0 - "@esbuild/linux-x64": 0.24.0 - "@esbuild/netbsd-x64": 0.24.0 - "@esbuild/openbsd-arm64": 0.24.0 - "@esbuild/openbsd-x64": 0.24.0 - "@esbuild/sunos-x64": 0.24.0 - "@esbuild/win32-arm64": 0.24.0 - "@esbuild/win32-ia32": 0.24.0 - "@esbuild/win32-x64": 0.24.0 - dependenciesMeta: - "@esbuild/aix-ppc64": - optional: true - "@esbuild/android-arm": - optional: true - "@esbuild/android-arm64": - optional: true - "@esbuild/android-x64": - optional: true - "@esbuild/darwin-arm64": - optional: true - "@esbuild/darwin-x64": - optional: true - "@esbuild/freebsd-arm64": - optional: true - "@esbuild/freebsd-x64": - optional: true - "@esbuild/linux-arm": - optional: true - "@esbuild/linux-arm64": - optional: true - "@esbuild/linux-ia32": - optional: true - "@esbuild/linux-loong64": - optional: true - "@esbuild/linux-mips64el": - optional: true - "@esbuild/linux-ppc64": - optional: true - "@esbuild/linux-riscv64": - optional: true - "@esbuild/linux-s390x": - optional: true - "@esbuild/linux-x64": - optional: true - "@esbuild/netbsd-x64": - optional: true - "@esbuild/openbsd-arm64": - optional: true - "@esbuild/openbsd-x64": - optional: true - "@esbuild/sunos-x64": - optional: true - "@esbuild/win32-arm64": - optional: true - "@esbuild/win32-ia32": - optional: true - "@esbuild/win32-x64": - optional: true - bin: - esbuild: bin/esbuild - checksum: dd386d92a05c7eb03078480522cdd8b40c434777b5f08487c27971d30933ecaae3f08bd221958dd8f9c66214915cdc85f844283ca9bdbf8ee703d889ae526edd - languageName: node - linkType: hard - -"esbuild@npm:^0.18.10": - version: 0.18.20 - resolution: "esbuild@npm:0.18.20" - dependencies: - "@esbuild/android-arm": 0.18.20 - "@esbuild/android-arm64": 0.18.20 - "@esbuild/android-x64": 0.18.20 - "@esbuild/darwin-arm64": 0.18.20 - "@esbuild/darwin-x64": 0.18.20 - "@esbuild/freebsd-arm64": 0.18.20 - "@esbuild/freebsd-x64": 0.18.20 - "@esbuild/linux-arm": 0.18.20 - "@esbuild/linux-arm64": 0.18.20 - "@esbuild/linux-ia32": 0.18.20 - "@esbuild/linux-loong64": 0.18.20 - "@esbuild/linux-mips64el": 0.18.20 - "@esbuild/linux-ppc64": 0.18.20 - "@esbuild/linux-riscv64": 0.18.20 - "@esbuild/linux-s390x": 0.18.20 - "@esbuild/linux-x64": 0.18.20 - "@esbuild/netbsd-x64": 0.18.20 - "@esbuild/openbsd-x64": 0.18.20 - "@esbuild/sunos-x64": 0.18.20 - "@esbuild/win32-arm64": 0.18.20 - "@esbuild/win32-ia32": 0.18.20 - "@esbuild/win32-x64": 0.18.20 - dependenciesMeta: - "@esbuild/android-arm": - optional: true - "@esbuild/android-arm64": - optional: true - "@esbuild/android-x64": - optional: true - "@esbuild/darwin-arm64": - optional: true - "@esbuild/darwin-x64": - optional: true - "@esbuild/freebsd-arm64": - optional: true - "@esbuild/freebsd-x64": - optional: true - "@esbuild/linux-arm": - optional: true - "@esbuild/linux-arm64": - optional: true - "@esbuild/linux-ia32": - optional: true - "@esbuild/linux-loong64": - optional: true - "@esbuild/linux-mips64el": - optional: true - "@esbuild/linux-ppc64": - optional: true - "@esbuild/linux-riscv64": - optional: true - "@esbuild/linux-s390x": - optional: true - "@esbuild/linux-x64": - optional: true - "@esbuild/netbsd-x64": - optional: true - "@esbuild/openbsd-x64": - optional: true - "@esbuild/sunos-x64": - optional: true - "@esbuild/win32-arm64": - optional: true - "@esbuild/win32-ia32": - optional: true - "@esbuild/win32-x64": - optional: true - bin: - esbuild: bin/esbuild - checksum: 5d253614e50cdb6ec22095afd0c414f15688e7278a7eb4f3720a6dd1306b0909cf431e7b9437a90d065a31b1c57be60130f63fe3e8d0083b588571f31ee6ec7b - languageName: node - linkType: hard - -"esbuild@npm:^0.19.0": - version: 0.19.12 - resolution: "esbuild@npm:0.19.12" - dependencies: - "@esbuild/aix-ppc64": 0.19.12 - "@esbuild/android-arm": 0.19.12 - "@esbuild/android-arm64": 0.19.12 - "@esbuild/android-x64": 0.19.12 - "@esbuild/darwin-arm64": 0.19.12 - "@esbuild/darwin-x64": 0.19.12 - "@esbuild/freebsd-arm64": 0.19.12 - "@esbuild/freebsd-x64": 0.19.12 - "@esbuild/linux-arm": 0.19.12 - "@esbuild/linux-arm64": 0.19.12 - "@esbuild/linux-ia32": 0.19.12 - "@esbuild/linux-loong64": 0.19.12 - "@esbuild/linux-mips64el": 0.19.12 - "@esbuild/linux-ppc64": 0.19.12 - "@esbuild/linux-riscv64": 0.19.12 - "@esbuild/linux-s390x": 0.19.12 - "@esbuild/linux-x64": 0.19.12 - "@esbuild/netbsd-x64": 0.19.12 - "@esbuild/openbsd-x64": 0.19.12 - "@esbuild/sunos-x64": 0.19.12 - "@esbuild/win32-arm64": 0.19.12 - "@esbuild/win32-ia32": 0.19.12 - "@esbuild/win32-x64": 0.19.12 - dependenciesMeta: - "@esbuild/aix-ppc64": - optional: true - "@esbuild/android-arm": - optional: true - "@esbuild/android-arm64": - optional: true - "@esbuild/android-x64": - optional: true - "@esbuild/darwin-arm64": - optional: true - "@esbuild/darwin-x64": - optional: true - "@esbuild/freebsd-arm64": - optional: true - "@esbuild/freebsd-x64": - optional: true - "@esbuild/linux-arm": - optional: true - "@esbuild/linux-arm64": - optional: true - "@esbuild/linux-ia32": - optional: true - "@esbuild/linux-loong64": - optional: true - "@esbuild/linux-mips64el": - optional: true - "@esbuild/linux-ppc64": - optional: true - "@esbuild/linux-riscv64": - optional: true - "@esbuild/linux-s390x": - optional: true - "@esbuild/linux-x64": - optional: true - "@esbuild/netbsd-x64": - optional: true - "@esbuild/openbsd-x64": - optional: true - "@esbuild/sunos-x64": - optional: true - "@esbuild/win32-arm64": - optional: true - "@esbuild/win32-ia32": - optional: true - "@esbuild/win32-x64": - optional: true - bin: - esbuild: bin/esbuild - checksum: 2936e29107b43e65a775b78b7bc66ddd7d76febd73840ac7e825fb22b65029422ff51038a08d19b05154f543584bd3afe7d1ef1c63900429475b17fbe61cb61f - languageName: node - linkType: hard - -"esbuild@npm:^0.21.0": - version: 0.21.5 - resolution: "esbuild@npm:0.21.5" - dependencies: - "@esbuild/aix-ppc64": 0.21.5 - "@esbuild/android-arm": 0.21.5 - "@esbuild/android-arm64": 0.21.5 - "@esbuild/android-x64": 0.21.5 - "@esbuild/darwin-arm64": 0.21.5 - "@esbuild/darwin-x64": 0.21.5 - "@esbuild/freebsd-arm64": 0.21.5 - "@esbuild/freebsd-x64": 0.21.5 - "@esbuild/linux-arm": 0.21.5 - "@esbuild/linux-arm64": 0.21.5 - "@esbuild/linux-ia32": 0.21.5 - "@esbuild/linux-loong64": 0.21.5 - "@esbuild/linux-mips64el": 0.21.5 - "@esbuild/linux-ppc64": 0.21.5 - "@esbuild/linux-riscv64": 0.21.5 - "@esbuild/linux-s390x": 0.21.5 - "@esbuild/linux-x64": 0.21.5 - "@esbuild/netbsd-x64": 0.21.5 - "@esbuild/openbsd-x64": 0.21.5 - "@esbuild/sunos-x64": 0.21.5 - "@esbuild/win32-arm64": 0.21.5 - "@esbuild/win32-ia32": 0.21.5 - "@esbuild/win32-x64": 0.21.5 - dependenciesMeta: - "@esbuild/aix-ppc64": - optional: true - "@esbuild/android-arm": - optional: true - "@esbuild/android-arm64": - optional: true - "@esbuild/android-x64": - optional: true - "@esbuild/darwin-arm64": - optional: true - "@esbuild/darwin-x64": - optional: true - "@esbuild/freebsd-arm64": - optional: true - "@esbuild/freebsd-x64": - optional: true - "@esbuild/linux-arm": - optional: true - "@esbuild/linux-arm64": - optional: true - "@esbuild/linux-ia32": - optional: true - "@esbuild/linux-loong64": - optional: true - "@esbuild/linux-mips64el": - optional: true - "@esbuild/linux-ppc64": - optional: true - "@esbuild/linux-riscv64": - optional: true - "@esbuild/linux-s390x": - optional: true - "@esbuild/linux-x64": - optional: true - "@esbuild/netbsd-x64": - optional: true - "@esbuild/openbsd-x64": - optional: true - "@esbuild/sunos-x64": - optional: true - "@esbuild/win32-arm64": - optional: true - "@esbuild/win32-ia32": - optional: true - "@esbuild/win32-x64": - optional: true - bin: - esbuild: bin/esbuild - checksum: 2911c7b50b23a9df59a7d6d4cdd3a4f85855787f374dce751148dbb13305e0ce7e880dde1608c2ab7a927fc6cec3587b80995f7fc87a64b455f8b70b55fd8ec1 - languageName: node - linkType: hard - -"escalade@npm:^3.1.1, escalade@npm:^3.2.0": - version: 3.2.0 - resolution: "escalade@npm:3.2.0" - checksum: 47b029c83de01b0d17ad99ed766347b974b0d628e848de404018f3abee728e987da0d2d370ad4574aa3d5b5bfc368754fd085d69a30f8e75903486ec4b5b709e - languageName: node - linkType: hard - -"escape-html@npm:^1.0.3, escape-html@npm:~1.0.3": - version: 1.0.3 - resolution: "escape-html@npm:1.0.3" - checksum: 6213ca9ae00d0ab8bccb6d8d4e0a98e76237b2410302cf7df70aaa6591d509a2a37ce8998008cbecae8fc8ffaadf3fb0229535e6a145f3ce0b211d060decbb24 - languageName: node - linkType: hard - -"escape-string-regexp@npm:2.0.0, escape-string-regexp@npm:^2.0.0": - version: 2.0.0 - resolution: "escape-string-regexp@npm:2.0.0" - checksum: 9f8a2d5743677c16e85c810e3024d54f0c8dea6424fad3c79ef6666e81dd0846f7437f5e729dfcdac8981bc9e5294c39b4580814d114076b8d36318f46ae4395 - languageName: node - linkType: hard - -"escape-string-regexp@npm:4.0.0, escape-string-regexp@npm:^4.0.0": - version: 4.0.0 - resolution: "escape-string-regexp@npm:4.0.0" - checksum: 98b48897d93060f2322108bf29db0feba7dd774be96cd069458d1453347b25ce8682ecc39859d4bca2203cc0ab19c237bcc71755eff49a0f8d90beadeeba5cc5 - languageName: node - linkType: hard - -"escape-string-regexp@npm:^1.0.5": - version: 1.0.5 - resolution: "escape-string-regexp@npm:1.0.5" - checksum: 6092fda75c63b110c706b6a9bfde8a612ad595b628f0bd2147eea1d3406723020810e591effc7db1da91d80a71a737a313567c5abb3813e8d9c71f4aa595b410 - languageName: node - linkType: hard - -"escodegen@npm:^1.8.1": - version: 1.14.3 - resolution: "escodegen@npm:1.14.3" - dependencies: - esprima: ^4.0.1 - estraverse: ^4.2.0 - esutils: ^2.0.2 - optionator: ^0.8.1 - source-map: ~0.6.1 - dependenciesMeta: - source-map: - optional: true - bin: - escodegen: bin/escodegen.js - esgenerate: bin/esgenerate.js - checksum: 381cdc4767ecdb221206bbbab021b467bbc2a6f5c9a99c9e6353040080bdd3dfe73d7604ad89a47aca6ea7d58bc635f6bd3fbc8da9a1998e9ddfa8372362ccd0 - languageName: node - linkType: hard - -"escodegen@npm:^2.0.0, escodegen@npm:^2.1.0": - version: 2.1.0 - resolution: "escodegen@npm:2.1.0" - dependencies: - esprima: ^4.0.1 - estraverse: ^5.2.0 - esutils: ^2.0.2 - source-map: ~0.6.1 - dependenciesMeta: - source-map: - optional: true - bin: - escodegen: bin/escodegen.js - esgenerate: bin/esgenerate.js - checksum: 096696407e161305cd05aebb95134ad176708bc5cb13d0dcc89a5fcbb959b8ed757e7f2591a5f8036f8f4952d4a724de0df14cd419e29212729fa6df5ce16bf6 - languageName: node - linkType: hard - -"eslint-config-prettier@npm:8.10.0, eslint-config-prettier@npm:^8.5.0": - version: 8.10.0 - resolution: "eslint-config-prettier@npm:8.10.0" - peerDependencies: - eslint: ">=7.0.0" - bin: - eslint-config-prettier: bin/cli.js - checksum: 153266badd477e49b0759816246b2132f1dbdb6c7f313ca60a9af5822fd1071c2bc5684a3720d78b725452bbac04bb130878b2513aea5e72b1b792de5a69fec8 - languageName: node - linkType: hard - -"eslint-config-react-app@npm:^7.0.1": - version: 7.0.1 - resolution: "eslint-config-react-app@npm:7.0.1" - dependencies: - "@babel/core": ^7.16.0 - "@babel/eslint-parser": ^7.16.3 - "@rushstack/eslint-patch": ^1.1.0 - "@typescript-eslint/eslint-plugin": ^5.5.0 - "@typescript-eslint/parser": ^5.5.0 - babel-preset-react-app: ^10.0.1 - confusing-browser-globals: ^1.0.11 - eslint-plugin-flowtype: ^8.0.3 - eslint-plugin-import: ^2.25.3 - eslint-plugin-jest: ^25.3.0 - eslint-plugin-jsx-a11y: ^6.5.1 - eslint-plugin-react: ^7.27.1 - eslint-plugin-react-hooks: ^4.3.0 - eslint-plugin-testing-library: ^5.0.1 - peerDependencies: - eslint: ^8.0.0 - checksum: a67e0821809e62308d6e419753fa2acfc7cd353659fab08cf34735f59c6c66910c0b6fda0471c4ec0d712ce762d65efc6431b39569f8d575e2d9bdfc384e0824 - languageName: node - linkType: hard - -"eslint-config-turbo@npm:latest": - version: 1.11.3 - resolution: "eslint-config-turbo@npm:1.11.3" - dependencies: - eslint-plugin-turbo: 1.11.3 - peerDependencies: - eslint: ">6.6.0" - checksum: e30c478f0435a289a6d921774a798b3a724492203f990a7cf0171eb913b9f160e652b3adb5195d12f480a68113452baf4c1f5aeed0c134f834e805098607224b - languageName: node - linkType: hard - -"eslint-import-resolver-node@npm:^0.3.7": - version: 0.3.7 - resolution: "eslint-import-resolver-node@npm:0.3.7" - dependencies: - debug: ^3.2.7 - is-core-module: ^2.11.0 - resolve: ^1.22.1 - checksum: 3379aacf1d2c6952c1b9666c6fa5982c3023df695430b0d391c0029f6403a7775414873d90f397e98ba6245372b6c8960e16e74d9e4a3b0c0a4582f3bdbe3d6e - languageName: node - linkType: hard - -"eslint-import-resolver-typescript@npm:3.6.3": - version: 3.6.3 - resolution: "eslint-import-resolver-typescript@npm:3.6.3" - dependencies: - "@nolyfill/is-core-module": 1.0.39 - debug: ^4.3.5 - enhanced-resolve: ^5.15.0 - eslint-module-utils: ^2.8.1 - fast-glob: ^3.3.2 - get-tsconfig: ^4.7.5 - is-bun-module: ^1.0.2 - is-glob: ^4.0.3 - peerDependencies: - eslint: "*" - eslint-plugin-import: "*" - eslint-plugin-import-x: "*" - peerDependenciesMeta: - eslint-plugin-import: - optional: true - eslint-plugin-import-x: - optional: true - checksum: 1ed0cab4f3852de1b14ea6978e76c27694b253a289c2030a35847ba8ab6ac4258d513877f83ea7bc265f746d570240a6348b11d77cc9cd77589749ad86a32234 - languageName: node - linkType: hard - -"eslint-module-utils@npm:^2.7.4, eslint-module-utils@npm:^2.8.1": - version: 2.12.0 - resolution: "eslint-module-utils@npm:2.12.0" - dependencies: - debug: ^3.2.7 - peerDependenciesMeta: - eslint: - optional: true - checksum: be3ac52e0971c6f46daeb1a7e760e45c7c45f820c8cc211799f85f10f04ccbf7afc17039165d56cb2da7f7ca9cec2b3a777013cddf0b976784b37eb9efa24180 - languageName: node - linkType: hard - -"eslint-plugin-check-file@npm:2.8.0": - version: 2.8.0 - resolution: "eslint-plugin-check-file@npm:2.8.0" - dependencies: - is-glob: ^4.0.3 - micromatch: ^4.0.5 - peerDependencies: - eslint: ">=7.28.0" - checksum: 636e4374c5fedafc9772d840953ef33cd7250907b526f4115ac73c220da7de23b14efb23f36e7bbfbb5ce311dff574b082283b9de796ae35ff949fb36f9cab25 - languageName: node - linkType: hard - -"eslint-plugin-cypress@npm:2.15.2": - version: 2.15.2 - resolution: "eslint-plugin-cypress@npm:2.15.2" - dependencies: - globals: ^13.20.0 - peerDependencies: - eslint: ">= 3.2.1" - checksum: 0ffd8b9b39a22543917e2d9ae0cb7545ce5ea0eea171d947b6e015062f462bf66a208b7e711923d5ad1525f3fb03a3f35c7d978ab88352343302ea885ee98c1b - languageName: node - linkType: hard - -"eslint-plugin-detox@npm:1.0.0": - version: 1.0.0 - resolution: "eslint-plugin-detox@npm:1.0.0" - dependencies: - requireindex: ~1.1.0 - checksum: c8e4db24fcb87310b13d1500000bb717c5c0ac409258af67c7eb53b203062c265a63aedae78e71bb3739cd180d97dddd0ab43b6732fce5a19515d51137eee7a2 - languageName: node - linkType: hard - -"eslint-plugin-eslint-comments@npm:^3.2.0": - version: 3.2.0 - resolution: "eslint-plugin-eslint-comments@npm:3.2.0" - dependencies: - escape-string-regexp: ^1.0.5 - ignore: ^5.0.5 - peerDependencies: - eslint: ">=4.19.1" - checksum: c9fe273dd56699abdf7e416cfad0344eb50aa01564a5a9133e72d982defb89310bc2e9b0b148ce19c5190d7ff641223b0ba9e667a194bc48467c3dd0d471e657 - languageName: node - linkType: hard - -"eslint-plugin-flowtype@npm:^8.0.3": - version: 8.0.3 - resolution: "eslint-plugin-flowtype@npm:8.0.3" - dependencies: - lodash: ^4.17.21 - string-natural-compare: ^3.0.1 - peerDependencies: - "@babel/plugin-syntax-flow": ^7.14.5 - "@babel/plugin-transform-react-jsx": ^7.14.9 - eslint: ^8.1.0 - checksum: 30e63c5357b0b5571f39afed51e59c140084f4aa53c106b1fd04f26da42b268908466daa6020b92943e71409bdaee1c67202515ed9012404d027cc92cb03cefa - languageName: node - linkType: hard - -"eslint-plugin-ft-flow@npm:2.0.3": - version: 2.0.3 - resolution: "eslint-plugin-ft-flow@npm:2.0.3" - dependencies: - lodash: ^4.17.21 - string-natural-compare: ^3.0.1 - peerDependencies: - "@babel/eslint-parser": ^7.12.0 - eslint: ^8.1.0 - checksum: 6272f7c352154875dc85c7dcd7cf66f6ed926a9a6aba81c675583bcc6695147597d6b9a6db0f643a387d14eccd61dc36daf20eec1c49e91ce1c63c01ffe295f7 - languageName: node - linkType: hard - -"eslint-plugin-import@npm:2.27.5": - version: 2.27.5 - resolution: "eslint-plugin-import@npm:2.27.5" - dependencies: - array-includes: ^3.1.6 - array.prototype.flat: ^1.3.1 - array.prototype.flatmap: ^1.3.1 - debug: ^3.2.7 - doctrine: ^2.1.0 - eslint-import-resolver-node: ^0.3.7 - eslint-module-utils: ^2.7.4 - has: ^1.0.3 - is-core-module: ^2.11.0 - is-glob: ^4.0.3 - minimatch: ^3.1.2 - object.values: ^1.1.6 - resolve: ^1.22.1 - semver: ^6.3.0 - tsconfig-paths: ^3.14.1 - peerDependencies: - eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 - checksum: f500571a380167e25d72a4d925ef9a7aae8899eada57653e5f3051ec3d3c16d08271fcefe41a30a9a2f4fefc232f066253673ee4ea77b30dba65ae173dade85d - languageName: node - linkType: hard - -"eslint-plugin-jest@npm:27.9.0": - version: 27.9.0 - resolution: "eslint-plugin-jest@npm:27.9.0" - dependencies: - "@typescript-eslint/utils": ^5.10.0 - peerDependencies: - "@typescript-eslint/eslint-plugin": ^5.0.0 || ^6.0.0 || ^7.0.0 - eslint: ^7.0.0 || ^8.0.0 - jest: "*" - peerDependenciesMeta: - "@typescript-eslint/eslint-plugin": - optional: true - jest: - optional: true - checksum: e2a4b415105408de28ad146818fcc6f4e122f6a39c6b2216ec5c24a80393f1390298b20231b0467bc5fd730f6e24b05b89e1a6a3ce651fc159aa4174ecc233d0 - languageName: node - linkType: hard - -"eslint-plugin-jest@npm:^25.3.0": - version: 25.7.0 - resolution: "eslint-plugin-jest@npm:25.7.0" - dependencies: - "@typescript-eslint/experimental-utils": ^5.0.0 - peerDependencies: - "@typescript-eslint/eslint-plugin": ^4.0.0 || ^5.0.0 - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - peerDependenciesMeta: - "@typescript-eslint/eslint-plugin": - optional: true - jest: - optional: true - checksum: fc6da96131f4cbf33d15ef911ec8e600ccd71deb97d73c0ca340427cef7b01ff41a797e2e7d1e351abf97321a46ed0c0acff5ee8eeedac94961dd6dad1f718a9 - languageName: node - linkType: hard - -"eslint-plugin-jest@npm:^26.5.3": - version: 26.9.0 - resolution: "eslint-plugin-jest@npm:26.9.0" - dependencies: - "@typescript-eslint/utils": ^5.10.0 - peerDependencies: - "@typescript-eslint/eslint-plugin": ^5.0.0 - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - peerDependenciesMeta: - "@typescript-eslint/eslint-plugin": - optional: true - jest: - optional: true - checksum: 6d5fd5c95368f1ca2640389aeb7ce703d6202493c3ec6bdedb4eaca37233710508b0c75829e727765a16fd27029a466d34202bc7f2811c752038ccbbce224400 - languageName: node - linkType: hard - -"eslint-plugin-jsx-a11y@npm:^6.5.1": - version: 6.10.2 - resolution: "eslint-plugin-jsx-a11y@npm:6.10.2" - dependencies: - aria-query: ^5.3.2 - array-includes: ^3.1.8 - array.prototype.flatmap: ^1.3.2 - ast-types-flow: ^0.0.8 - axe-core: ^4.10.0 - axobject-query: ^4.1.0 - damerau-levenshtein: ^1.0.8 - emoji-regex: ^9.2.2 - hasown: ^2.0.2 - jsx-ast-utils: ^3.3.5 - language-tags: ^1.0.9 - minimatch: ^3.1.2 - object.fromentries: ^2.0.8 - safe-regex-test: ^1.0.3 - string.prototype.includes: ^2.0.1 - peerDependencies: - eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9 - checksum: 0cc861398fa26ada61ed5703eef5b335495fcb96253263dcd5e399488ff019a2636372021baacc040e3560d1a34bfcd5d5ad9f1754f44cd0509c956f7df94050 - languageName: node - linkType: hard - -"eslint-plugin-local-rules@npm:3.0.2": - version: 3.0.2 - resolution: "eslint-plugin-local-rules@npm:3.0.2" - checksum: ad883be0739f022bcd0f49de45354c792bc2ef23ea0030789c3f90b10288b4346ab509fbfd451e87282c0f92393251e51a5a69a2f3ba3865a1a1f780cebef7cb - languageName: node - linkType: hard - -"eslint-plugin-no-relative-import-paths@npm:1.5.2": - version: 1.5.2 - resolution: "eslint-plugin-no-relative-import-paths@npm:1.5.2" - checksum: 194e72f21a8ec3796b6281d33d4a0f68b637da080fdd6a2d9abe8a3d7cf9b616067d7d63a9770c673e2843d03724b91d5f4ed720faff1db9bde0b322eb31b17b - languageName: node - linkType: hard - -"eslint-plugin-no-unsanitized@npm:4.0.1": - version: 4.0.1 - resolution: "eslint-plugin-no-unsanitized@npm:4.0.1" - peerDependencies: - eslint: ^6 || ^7 || ^8 - checksum: 36ce4884c3578d0229e4f45a70422d4cc0b687ef8f2cac4a9d8065eefb1c5cf74cbbc028046fc18c72ba9e89ff0910ac794aea0c32a81d96ff240fef76b7d631 - languageName: node - linkType: hard - -"eslint-plugin-prettier@npm:4.2.1, eslint-plugin-prettier@npm:^4.2.1": - version: 4.2.1 - resolution: "eslint-plugin-prettier@npm:4.2.1" - dependencies: - prettier-linter-helpers: ^1.0.0 - peerDependencies: - eslint: ">=7.28.0" - prettier: ">=2.0.0" - peerDependenciesMeta: - eslint-config-prettier: - optional: true - checksum: b9e839d2334ad8ec7a5589c5cb0f219bded260839a857d7a486997f9870e95106aa59b8756ff3f37202085ebab658de382b0267cae44c3a7f0eb0bcc03a4f6d6 - languageName: node - linkType: hard - -"eslint-plugin-react-hooks@npm:4.6.0": - version: 4.6.0 - resolution: "eslint-plugin-react-hooks@npm:4.6.0" - peerDependencies: - eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 - checksum: 23001801f14c1d16bf0a837ca7970d9dd94e7b560384b41db378b49b6e32dc43d6e2790de1bd737a652a86f81a08d6a91f402525061b47719328f586a57e86c3 - languageName: node - linkType: hard - -"eslint-plugin-react-hooks@npm:^4.3.0, eslint-plugin-react-hooks@npm:^4.6.0": - version: 4.6.2 - resolution: "eslint-plugin-react-hooks@npm:4.6.2" - peerDependencies: - eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 - checksum: 395c433610f59577cfcf3f2e42bcb130436c8a0b3777ac64f441d88c5275f4fcfc89094cedab270f2822daf29af1079151a7a6579a8e9ea8cee66540ba0384c4 - languageName: node - linkType: hard - -"eslint-plugin-react-native-globals@npm:^0.1.1": - version: 0.1.2 - resolution: "eslint-plugin-react-native-globals@npm:0.1.2" - checksum: ab91e8ecbb51718fb0763f29226b1c2d402251ab2c4730a8bf85f38b805e32d4243da46d07ccdb12cb9dcce9e7514364a1706142cf970f58dcc9a820bcf4b732 - languageName: node - linkType: hard - -"eslint-plugin-react-native@npm:4.1.0, eslint-plugin-react-native@npm:^4.0.0": - version: 4.1.0 - resolution: "eslint-plugin-react-native@npm:4.1.0" - dependencies: - eslint-plugin-react-native-globals: ^0.1.1 - peerDependencies: - eslint: ^3.17.0 || ^4 || ^5 || ^6 || ^7 || ^8 - checksum: b6acc5aa91f95cb4600d6ab4c00cf22577083e72c61aabcf010f4388d97e4fc53ba075db54eeee53cba25b297e1a6ec611434f2c2d0bfb3e8dc6419400663fe9 - languageName: node - linkType: hard - -"eslint-plugin-react@npm:7.34.1": - version: 7.34.1 - resolution: "eslint-plugin-react@npm:7.34.1" - dependencies: - array-includes: ^3.1.7 - array.prototype.findlast: ^1.2.4 - array.prototype.flatmap: ^1.3.2 - array.prototype.toreversed: ^1.1.2 - array.prototype.tosorted: ^1.1.3 - doctrine: ^2.1.0 - es-iterator-helpers: ^1.0.17 - estraverse: ^5.3.0 - jsx-ast-utils: ^2.4.1 || ^3.0.0 - minimatch: ^3.1.2 - object.entries: ^1.1.7 - object.fromentries: ^2.0.7 - object.hasown: ^1.1.3 - object.values: ^1.1.7 - prop-types: ^15.8.1 - resolve: ^2.0.0-next.5 - semver: ^6.3.1 - string.prototype.matchall: ^4.0.10 - peerDependencies: - eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 - checksum: 82f391c5a093235c3bc2f664c54e009c49460778ee7d1b86c1536df9ac4d2a80d1dedc9241ac797df4a9dced936e955d9c89042fb3ac8d017b5359d1320d3c0f - languageName: node - linkType: hard - -"eslint-plugin-react@npm:^7.27.1, eslint-plugin-react@npm:^7.30.1": - version: 7.37.2 - resolution: "eslint-plugin-react@npm:7.37.2" - dependencies: - array-includes: ^3.1.8 - array.prototype.findlast: ^1.2.5 - array.prototype.flatmap: ^1.3.2 - array.prototype.tosorted: ^1.1.4 - doctrine: ^2.1.0 - es-iterator-helpers: ^1.1.0 - estraverse: ^5.3.0 - hasown: ^2.0.2 - jsx-ast-utils: ^2.4.1 || ^3.0.0 - minimatch: ^3.1.2 - object.entries: ^1.1.8 - object.fromentries: ^2.0.8 - object.values: ^1.2.0 - prop-types: ^15.8.1 - resolve: ^2.0.0-next.5 - semver: ^6.3.1 - string.prototype.matchall: ^4.0.11 - string.prototype.repeat: ^1.0.0 - peerDependencies: - eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 - checksum: 7f5203afee7fbe3702b27fdd2b9a3c0ccbbb47d0672f58311b9d8a08dea819c9da4a87c15e8bd508f2562f327a9d29ee8bd9cd189bf758d8dc903de5648b0bfa - languageName: node - linkType: hard - -"eslint-plugin-rulesdir@npm:0.2.2": - version: 0.2.2 - resolution: "eslint-plugin-rulesdir@npm:0.2.2" - checksum: 1d8c2583dccca7e167b0eaf1adb1ae0bca4ea65b3eb3e0124fc0e21382a29ca3988306419d3b34f7f984f53c2ecb16b0c6956e676e23d165c2bd629023d10704 - languageName: node - linkType: hard - -"eslint-plugin-security@npm:1.5.0": - version: 1.5.0 - resolution: "eslint-plugin-security@npm:1.5.0" - dependencies: - safe-regex: ^2.1.1 - checksum: c51c9d43d1ef1eaf803d136ae73522369f1e0b4f2633a56fc3226afd64ad3936943080bf506353c25422d1d73e8395946d016847e0ac5c0b5886c394fe848b9f - languageName: node - linkType: hard - -"eslint-plugin-spellcheck@npm:0.0.20": - version: 0.0.20 - resolution: "eslint-plugin-spellcheck@npm:0.0.20" - dependencies: - globals: ^13.0.0 - hunspell-spellchecker: ^1.0.2 - lodash: ^4.17.15 - peerDependencies: - eslint: ">=0.8.0" - checksum: 2ab85337774910de86586581f76bf10e40f83be4e0971d2f6f5a31b658ed3bb003528bedd25d70b07e2942e8418cd0009bf6eeab829eb7cbf2108e13afa83f35 - languageName: node - linkType: hard - -"eslint-plugin-storybook@npm:0.8.0": - version: 0.8.0 - resolution: "eslint-plugin-storybook@npm:0.8.0" - dependencies: - "@storybook/csf": ^0.0.1 - "@typescript-eslint/utils": ^5.62.0 - requireindex: ^1.2.0 - ts-dedent: ^2.2.0 - peerDependencies: - eslint: ">=6" - checksum: 71e4b064259e09a6353360ca4a3ec929df0ea3aabe1dc83a40b9264fe5c16bcecb94d097e7403f6916622b8fdb739e91f1268bbad220d838fcbc2b9a901345ec - languageName: node - linkType: hard - -"eslint-plugin-testing-library@npm:^5.0.1": - version: 5.11.1 - resolution: "eslint-plugin-testing-library@npm:5.11.1" - dependencies: - "@typescript-eslint/utils": ^5.58.0 - peerDependencies: - eslint: ^7.5.0 || ^8.0.0 - checksum: 9f3fc68ef9f13016a4381b33ab5dbffcc189e5de3eaeba184bcf7d2771faa7f54e59c04b652162fb1c0f83fb52428dd909db5450a25508b94be59eba69fcc990 - languageName: node - linkType: hard - -"eslint-plugin-turbo@npm:1.11.3": - version: 1.11.3 - resolution: "eslint-plugin-turbo@npm:1.11.3" - dependencies: - dotenv: 16.0.3 - peerDependencies: - eslint: ">6.6.0" - checksum: 36d8f89ca3c04e1dff0d6434de05913d37010150cdbdff6b63f4af75f784b0903a9165ec546c8187f02f7c947c717610f6f4ac79b8e58f5fe64b302a1147dbe2 - languageName: node - linkType: hard - -"eslint-plugin-unused-imports@npm:2.0.0": - version: 2.0.0 - resolution: "eslint-plugin-unused-imports@npm:2.0.0" - dependencies: - eslint-rule-composer: ^0.3.0 - peerDependencies: - "@typescript-eslint/eslint-plugin": ^5.0.0 - eslint: ^8.0.0 - peerDependenciesMeta: - "@typescript-eslint/eslint-plugin": - optional: true - checksum: 8aa1e03e75da2a62a354065e0cb8fe370118c6f8d9720a32fe8c1da937de6adb81a4fed7d0d391d115ac9453b49029fb19f970d180a2cf3dba451fd4c20f0dc4 - languageName: node - linkType: hard - -"eslint-rule-composer@npm:^0.3.0": - version: 0.3.0 - resolution: "eslint-rule-composer@npm:0.3.0" - checksum: c2f57cded8d1c8f82483e0ce28861214347e24fd79fd4144667974cd334d718f4ba05080aaef2399e3bbe36f7d6632865110227e6b176ed6daa2d676df9281b1 - languageName: node - linkType: hard - -"eslint-scope@npm:5.1.1, eslint-scope@npm:^5.1.1": - version: 5.1.1 - resolution: "eslint-scope@npm:5.1.1" - dependencies: - esrecurse: ^4.3.0 - estraverse: ^4.1.1 - checksum: 47e4b6a3f0cc29c7feedee6c67b225a2da7e155802c6ea13bbef4ac6b9e10c66cd2dcb987867ef176292bf4e64eccc680a49e35e9e9c669f4a02bac17e86abdb - languageName: node - linkType: hard - -"eslint-scope@npm:^7.2.0, eslint-scope@npm:^7.2.2": - version: 7.2.2 - resolution: "eslint-scope@npm:7.2.2" - dependencies: - esrecurse: ^4.3.0 - estraverse: ^5.2.0 - checksum: ec97dbf5fb04b94e8f4c5a91a7f0a6dd3c55e46bfc7bbcd0e3138c3a76977570e02ed89a1810c778dcd72072ff0e9621ba1379b4babe53921d71e2e4486fda3e - languageName: node - linkType: hard - -"eslint-visitor-keys@npm:^2.0.0, eslint-visitor-keys@npm:^2.1.0": - version: 2.1.0 - resolution: "eslint-visitor-keys@npm:2.1.0" - checksum: e3081d7dd2611a35f0388bbdc2f5da60b3a3c5b8b6e928daffff7391146b434d691577aa95064c8b7faad0b8a680266bcda0a42439c18c717b80e6718d7e267d - languageName: node - linkType: hard - -"eslint-visitor-keys@npm:^3.3.0, eslint-visitor-keys@npm:^3.4.1, eslint-visitor-keys@npm:^3.4.3": - version: 3.4.3 - resolution: "eslint-visitor-keys@npm:3.4.3" - checksum: 36e9ef87fca698b6fd7ca5ca35d7b2b6eeaaf106572e2f7fd31c12d3bfdaccdb587bba6d3621067e5aece31c8c3a348b93922ab8f7b2cbc6aaab5e1d89040c60 - languageName: node - linkType: hard - -"eslint-webpack-plugin@npm:^3.1.1": - version: 3.2.0 - resolution: "eslint-webpack-plugin@npm:3.2.0" - dependencies: - "@types/eslint": ^7.29.0 || ^8.4.1 - jest-worker: ^28.0.2 - micromatch: ^4.0.5 - normalize-path: ^3.0.0 - schema-utils: ^4.0.0 - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - webpack: ^5.0.0 - checksum: 095034c35e773fdb21ec7e597ae1f8a6899679c290db29d8568ca94619e8c7f4971f0f9edccc8a965322ab8af9286c87205985a38f4fdcf17654aee7cd8bb7b5 - languageName: node - linkType: hard - -"eslint@npm:8.44.0": - version: 8.44.0 - resolution: "eslint@npm:8.44.0" - dependencies: - "@eslint-community/eslint-utils": ^4.2.0 - "@eslint-community/regexpp": ^4.4.0 - "@eslint/eslintrc": ^2.1.0 - "@eslint/js": 8.44.0 - "@humanwhocodes/config-array": ^0.11.10 - "@humanwhocodes/module-importer": ^1.0.1 - "@nodelib/fs.walk": ^1.2.8 - ajv: ^6.10.0 - chalk: ^4.0.0 - cross-spawn: ^7.0.2 - debug: ^4.3.2 - doctrine: ^3.0.0 - escape-string-regexp: ^4.0.0 - eslint-scope: ^7.2.0 - eslint-visitor-keys: ^3.4.1 - espree: ^9.6.0 - esquery: ^1.4.2 - esutils: ^2.0.2 - fast-deep-equal: ^3.1.3 - file-entry-cache: ^6.0.1 - find-up: ^5.0.0 - glob-parent: ^6.0.2 - globals: ^13.19.0 - graphemer: ^1.4.0 - ignore: ^5.2.0 - import-fresh: ^3.0.0 - imurmurhash: ^0.1.4 - is-glob: ^4.0.0 - is-path-inside: ^3.0.3 - js-yaml: ^4.1.0 - json-stable-stringify-without-jsonify: ^1.0.1 - levn: ^0.4.1 - lodash.merge: ^4.6.2 - minimatch: ^3.1.2 - natural-compare: ^1.4.0 - optionator: ^0.9.3 - strip-ansi: ^6.0.1 - strip-json-comments: ^3.1.0 - text-table: ^0.2.0 - bin: - eslint: bin/eslint.js - checksum: d06309ce4aafb9d27d558c8e5e5aa5cba3bbec3ce8ceccbc7d4b7a35f2b67fd40189159155553270e2e6febeb69bd8a3b60d6241c8f5ddc2ef1702ccbd328501 - languageName: node - linkType: hard - -"eslint@npm:^8.3.0": - version: 8.57.1 - resolution: "eslint@npm:8.57.1" - dependencies: - "@eslint-community/eslint-utils": ^4.2.0 - "@eslint-community/regexpp": ^4.6.1 - "@eslint/eslintrc": ^2.1.4 - "@eslint/js": 8.57.1 - "@humanwhocodes/config-array": ^0.13.0 - "@humanwhocodes/module-importer": ^1.0.1 - "@nodelib/fs.walk": ^1.2.8 - "@ungap/structured-clone": ^1.2.0 - ajv: ^6.12.4 - chalk: ^4.0.0 - cross-spawn: ^7.0.2 - debug: ^4.3.2 - doctrine: ^3.0.0 - escape-string-regexp: ^4.0.0 - eslint-scope: ^7.2.2 - eslint-visitor-keys: ^3.4.3 - espree: ^9.6.1 - esquery: ^1.4.2 - esutils: ^2.0.2 - fast-deep-equal: ^3.1.3 - file-entry-cache: ^6.0.1 - find-up: ^5.0.0 - glob-parent: ^6.0.2 - globals: ^13.19.0 - graphemer: ^1.4.0 - ignore: ^5.2.0 - imurmurhash: ^0.1.4 - is-glob: ^4.0.0 - is-path-inside: ^3.0.3 - js-yaml: ^4.1.0 - json-stable-stringify-without-jsonify: ^1.0.1 - levn: ^0.4.1 - lodash.merge: ^4.6.2 - minimatch: ^3.1.2 - natural-compare: ^1.4.0 - optionator: ^0.9.3 - strip-ansi: ^6.0.1 - text-table: ^0.2.0 - bin: - eslint: bin/eslint.js - checksum: e2489bb7f86dd2011967759a09164e65744ef7688c310bc990612fc26953f34cc391872807486b15c06833bdff737726a23e9b4cdba5de144c311377dc41d91b - languageName: node - linkType: hard - -"esm-resolve@npm:^1.0.8": - version: 1.0.8 - resolution: "esm-resolve@npm:1.0.8" - checksum: aa44828ecf3f417e3dc237658fb3f30ad91b7a3dc0896358c2c15f5ae54f95cc50804c5859aa7afcd7b96c0bbbdb47978f919379386ac4a6c5d2562c4ebd22f2 - languageName: node - linkType: hard - -"esm@npm:^3.0.84": - version: 3.2.25 - resolution: "esm@npm:3.2.25" - checksum: 978aabe2de83541c105605a6d60a26ed8e627ef6bb0a7605fe15a95bbdea6b8348bd045255cb22219c054dd09a81a94823df00843d9e97f42419c92015ce3a64 - languageName: node - linkType: hard - -"espree@npm:^9.6.0, espree@npm:^9.6.1": - version: 9.6.1 - resolution: "espree@npm:9.6.1" - dependencies: - acorn: ^8.9.0 - acorn-jsx: ^5.3.2 - eslint-visitor-keys: ^3.4.1 - checksum: eb8c149c7a2a77b3f33a5af80c10875c3abd65450f60b8af6db1bfcfa8f101e21c1e56a561c6dc13b848e18148d43469e7cd208506238554fb5395a9ea5a1ab9 - languageName: node - linkType: hard - -"esprima@npm:1.2.2": - version: 1.2.2 - resolution: "esprima@npm:1.2.2" - bin: - esparse: ./bin/esparse.js - esvalidate: ./bin/esvalidate.js - checksum: 4f10006f0e315f2f7d8cf6630e465f183512f1ab2e862b11785a133ce37ed1696573deefb5256e510eaa4368342b13b393334477f6ccdcdb8f10e782b0f5e6dc - languageName: node - linkType: hard - -"esprima@npm:^4.0.0, esprima@npm:^4.0.1, esprima@npm:~4.0.0": - version: 4.0.1 - resolution: "esprima@npm:4.0.1" - bin: - esparse: ./bin/esparse.js - esvalidate: ./bin/esvalidate.js - checksum: b45bc805a613dbea2835278c306b91aff6173c8d034223fa81498c77dcbce3b2931bf6006db816f62eacd9fd4ea975dfd85a5b7f3c6402cfd050d4ca3c13a628 - languageName: node - linkType: hard - -"esquery@npm:^1.4.2": - version: 1.5.0 - resolution: "esquery@npm:1.5.0" - dependencies: - estraverse: ^5.1.0 - checksum: aefb0d2596c230118656cd4ec7532d447333a410a48834d80ea648b1e7b5c9bc9ed8b5e33a89cb04e487b60d622f44cf5713bf4abed7c97343edefdc84a35900 - languageName: node - linkType: hard - -"esrecurse@npm:^4.3.0": - version: 4.3.0 - resolution: "esrecurse@npm:4.3.0" - dependencies: - estraverse: ^5.2.0 - checksum: ebc17b1a33c51cef46fdc28b958994b1dc43cd2e86237515cbc3b4e5d2be6a811b2315d0a1a4d9d340b6d2308b15322f5c8291059521cc5f4802f65e7ec32837 - languageName: node - linkType: hard - -"estraverse@npm:^4.1.1, estraverse@npm:^4.2.0": - version: 4.3.0 - resolution: "estraverse@npm:4.3.0" - checksum: a6299491f9940bb246124a8d44b7b7a413a8336f5436f9837aaa9330209bd9ee8af7e91a654a3545aee9c54b3308e78ee360cef1d777d37cfef77d2fa33b5827 - languageName: node - linkType: hard - -"estraverse@npm:^5.1.0, estraverse@npm:^5.2.0, estraverse@npm:^5.3.0": - version: 5.3.0 - resolution: "estraverse@npm:5.3.0" - checksum: 072780882dc8416ad144f8fe199628d2b3e7bbc9989d9ed43795d2c90309a2047e6bc5979d7e2322a341163d22cfad9e21f4110597fe487519697389497e4e2b - languageName: node - linkType: hard - -"estree-walker@npm:^0.6.1": - version: 0.6.1 - resolution: "estree-walker@npm:0.6.1" - checksum: 9d6f82a4921f11eec18f8089fb3cce6e53bcf45a8e545c42a2674d02d055fb30f25f90495f8be60803df6c39680c80dcee7f944526867eb7aa1fc9254883b23d - languageName: node - linkType: hard - -"estree-walker@npm:^1.0.1": - version: 1.0.1 - resolution: "estree-walker@npm:1.0.1" - checksum: 7e70da539691f6db03a08e7ce94f394ce2eef4180e136d251af299d41f92fb2d28ebcd9a6e393e3728d7970aeb5358705ddf7209d52fbcb2dd4693f95dcf925f - languageName: node - linkType: hard - -"estree-walker@npm:^2.0.2": - version: 2.0.2 - resolution: "estree-walker@npm:2.0.2" - checksum: 6151e6f9828abe2259e57f5fd3761335bb0d2ebd76dc1a01048ccee22fabcfef3c0859300f6d83ff0d1927849368775ec5a6d265dde2f6de5a1be1721cd94efc - languageName: node - linkType: hard - -"estree-walker@npm:^3.0.3": - version: 3.0.3 - resolution: "estree-walker@npm:3.0.3" - dependencies: - "@types/estree": ^1.0.0 - checksum: a65728d5727b71de172c5df323385755a16c0fdab8234dc756c3854cfee343261ddfbb72a809a5660fac8c75d960bb3e21aa898c2d7e9b19bb298482ca58a3af - languageName: node - linkType: hard - -"esutils@npm:^2.0.2": - version: 2.0.3 - resolution: "esutils@npm:2.0.3" - checksum: 22b5b08f74737379a840b8ed2036a5fb35826c709ab000683b092d9054e5c2a82c27818f12604bfc2a9a76b90b6834ef081edbc1c7ae30d1627012e067c6ec87 - languageName: node - linkType: hard - -"etag@npm:~1.8.1": - version: 1.8.1 - resolution: "etag@npm:1.8.1" - checksum: 571aeb3dbe0f2bbd4e4fadbdb44f325fc75335cd5f6f6b6a091e6a06a9f25ed5392f0863c5442acb0646787446e816f13cbfc6edce5b07658541dff573cab1ff - languageName: node - linkType: hard - -"eth-block-tracker@npm:^7.1.0": - version: 7.1.0 - resolution: "eth-block-tracker@npm:7.1.0" - dependencies: - "@metamask/eth-json-rpc-provider": ^1.0.0 - "@metamask/safe-event-emitter": ^3.0.0 - "@metamask/utils": ^5.0.1 - json-rpc-random-id: ^1.0.1 - pify: ^3.0.0 - checksum: 1d019f261e0ef07387cd74538b160700caa35ba9859ab9d4e5137c48bf9c92822c3b4ade40f8a504f16cb813de4c317c5378d047625ddf04592e256be8842588 - languageName: node - linkType: hard - -"eth-json-rpc-filters@npm:^6.0.0": - version: 6.0.1 - resolution: "eth-json-rpc-filters@npm:6.0.1" - dependencies: - "@metamask/safe-event-emitter": ^3.0.0 - async-mutex: ^0.2.6 - eth-query: ^2.1.2 - json-rpc-engine: ^6.1.0 - pify: ^5.0.0 - checksum: 216f7417417599a48273b08fb2894581175276fe21cb1c9ffa66e98a9c2a67bc0ac821ad2ca163fdb8e8de0960aea0d9c5e53aee9d5dcfec355abf020e9458c5 - languageName: node - linkType: hard - -"eth-query@npm:^2.1.2": - version: 2.1.2 - resolution: "eth-query@npm:2.1.2" - dependencies: - json-rpc-random-id: ^1.0.0 - xtend: ^4.0.1 - checksum: 83daa0e28452c54722aec78cd24d036bad5b6e7c08035d98e10d4bea11f71662f12cab63ebd8a848d4df46ad316503d54ecccb41c9244d2ea8b29364b0a20201 - languageName: node - linkType: hard - -"eth-rpc-errors@npm:^4.0.2, eth-rpc-errors@npm:^4.0.3": - version: 4.0.3 - resolution: "eth-rpc-errors@npm:4.0.3" - dependencies: - fast-safe-stringify: ^2.0.6 - checksum: 5fa31d1a10fdb340733b9a55e38e7687222c501052ca20743cef4d0c911a9bbcc0cad54aa6bf3e4b428604c071ff519803060e1cbc79ddb7c9257c11d407d32a - languageName: node - linkType: hard - -"ethereum-bloom-filters@npm:^1.0.6": - version: 1.0.10 - resolution: "ethereum-bloom-filters@npm:1.0.10" - dependencies: - js-sha3: ^0.8.0 - checksum: 4019cc6f9274ae271a52959194a72f6e9b013366f168f922dc3b349319faf7426bf1010125ee0676b4f75714fe4a440edd4e7e62342c121a046409f4cd4c0af9 - languageName: node - linkType: hard - -"ethereum-cryptography@npm:0.1.3, ethereum-cryptography@npm:^0.1.3": - version: 0.1.3 - resolution: "ethereum-cryptography@npm:0.1.3" - dependencies: - "@types/pbkdf2": ^3.0.0 - "@types/secp256k1": ^4.0.1 - blakejs: ^1.1.0 - browserify-aes: ^1.2.0 - bs58check: ^2.1.2 - create-hash: ^1.2.0 - create-hmac: ^1.1.7 - hash.js: ^1.1.7 - keccak: ^3.0.0 - pbkdf2: ^3.0.17 - randombytes: ^2.1.0 - safe-buffer: ^5.1.2 - scrypt-js: ^3.0.0 - secp256k1: ^4.0.1 - setimmediate: ^1.0.5 - checksum: 54bae7a4a96bd81398cdc35c91cfcc74339f71a95ed1b5b694663782e69e8e3afd21357de3b8bac9ff4877fd6f043601e200a7ad9133d94be6fd7d898ee0a449 - languageName: node - linkType: hard - -"ethereum-cryptography@npm:^1.0.3": - version: 1.2.0 - resolution: "ethereum-cryptography@npm:1.2.0" - dependencies: - "@noble/hashes": 1.2.0 - "@noble/secp256k1": 1.7.1 - "@scure/bip32": 1.1.5 - "@scure/bip39": 1.1.1 - checksum: 97e8e8253cb9f5a9271bd0201c37609c451c890eb85883b9c564f14743c3d7c673287406c93bf5604307593ee298ad9a03983388b85c11ca61461b9fc1a4f2c7 - languageName: node - linkType: hard - -"ethereum-cryptography@npm:^2.0.0, ethereum-cryptography@npm:^2.1.2": - version: 2.1.2 - resolution: "ethereum-cryptography@npm:2.1.2" - dependencies: - "@noble/curves": 1.1.0 - "@noble/hashes": 1.3.1 - "@scure/bip32": 1.3.1 - "@scure/bip39": 1.2.1 - checksum: 2e8f7b8cc90232ae838ab6a8167708e8362621404d26e79b5d9e762c7b53d699f7520aff358d9254de658fcd54d2d0af168ff909943259ed27dc4cef2736410c - languageName: node - linkType: hard - -"ethereumjs-abi@npm:^0.6.8": - version: 0.6.8 - resolution: "ethereumjs-abi@npm:0.6.8" - dependencies: - bn.js: ^4.11.8 - ethereumjs-util: ^6.0.0 - checksum: cede2a8ae7c7e04eeaec079c2f925601a25b2ef75cf9230e7c5da63b4ea27883b35447365a47e35c1e831af520973a2252af89022c292c18a09a4607821a366b - languageName: node - linkType: hard - -"ethereumjs-util@npm:^6.0.0, ethereumjs-util@npm:^6.2.1": - version: 6.2.1 - resolution: "ethereumjs-util@npm:6.2.1" - dependencies: - "@types/bn.js": ^4.11.3 - bn.js: ^4.11.0 - create-hash: ^1.1.2 - elliptic: ^6.5.2 - ethereum-cryptography: ^0.1.3 - ethjs-util: 0.1.6 - rlp: ^2.2.3 - checksum: e3cb4a2c034a2529281fdfc21a2126fe032fdc3038863f5720352daa65ddcc50fc8c67dbedf381a882dc3802e05d979287126d7ecf781504bde1fd8218693bde - languageName: node - linkType: hard - -"ethers@npm:5.7.2, ethers@npm:^5.3.1, ethers@npm:^5.5.2, ethers@npm:^5.6.7, ethers@npm:^5.7.0": - version: 5.7.2 - resolution: "ethers@npm:5.7.2" - dependencies: - "@ethersproject/abi": 5.7.0 - "@ethersproject/abstract-provider": 5.7.0 - "@ethersproject/abstract-signer": 5.7.0 - "@ethersproject/address": 5.7.0 - "@ethersproject/base64": 5.7.0 - "@ethersproject/basex": 5.7.0 - "@ethersproject/bignumber": 5.7.0 - "@ethersproject/bytes": 5.7.0 - "@ethersproject/constants": 5.7.0 - "@ethersproject/contracts": 5.7.0 - "@ethersproject/hash": 5.7.0 - "@ethersproject/hdnode": 5.7.0 - "@ethersproject/json-wallets": 5.7.0 - "@ethersproject/keccak256": 5.7.0 - "@ethersproject/logger": 5.7.0 - "@ethersproject/networks": 5.7.1 - "@ethersproject/pbkdf2": 5.7.0 - "@ethersproject/properties": 5.7.0 - "@ethersproject/providers": 5.7.2 - "@ethersproject/random": 5.7.0 - "@ethersproject/rlp": 5.7.0 - "@ethersproject/sha2": 5.7.0 - "@ethersproject/signing-key": 5.7.0 - "@ethersproject/solidity": 5.7.0 - "@ethersproject/strings": 5.7.0 - "@ethersproject/transactions": 5.7.0 - "@ethersproject/units": 5.7.0 - "@ethersproject/wallet": 5.7.0 - "@ethersproject/web": 5.7.1 - "@ethersproject/wordlists": 5.7.0 - checksum: b7c08cf3e257185a7946117dbbf764433b7ba0e77c27298dec6088b3bc871aff711462b0621930c56880ff0a7ceb8b1d3a361ffa259f93377b48e34107f62553 - languageName: node - linkType: hard - -"ethjs-unit@npm:0.1.6": - version: 0.1.6 - resolution: "ethjs-unit@npm:0.1.6" - dependencies: - bn.js: 4.11.6 - number-to-bn: 1.7.0 - checksum: df6b4752ff7461a59a20219f4b1684c631ea601241c39660e3f6c6bd63c950189723841c22b3c6c0ebeb3c9fc99e0e803e3c613101206132603705fcbcf4def5 - languageName: node - linkType: hard - -"ethjs-util@npm:0.1.6, ethjs-util@npm:^0.1.6": - version: 0.1.6 - resolution: "ethjs-util@npm:0.1.6" - dependencies: - is-hex-prefixed: 1.0.0 - strip-hex-prefix: 1.0.0 - checksum: 1f42959e78ec6f49889c49c8a98639e06f52a15966387dd39faf2930db48663d026efb7db2702dcffe7f2a99c4a0144b7ce784efdbf733f4077aae95de76d65f - languageName: node - linkType: hard - -"eval@npm:0.1.8": - version: 0.1.8 - resolution: "eval@npm:0.1.8" - dependencies: - "@types/node": "*" - require-like: ">= 0.1.1" - checksum: d005567f394cfbe60948e34982e4637d2665030f9aa7dcac581ea6f9ec6eceb87133ed3dc0ae21764aa362485c242a731dbb6371f1f1a86807c58676431e9d1a - languageName: node - linkType: hard - -"event-stream@npm:=3.3.4": - version: 3.3.4 - resolution: "event-stream@npm:3.3.4" - dependencies: - duplexer: ~0.1.1 - from: ~0 - map-stream: ~0.1.0 - pause-stream: 0.0.11 - split: 0.3 - stream-combiner: ~0.0.4 - through: ~2.3.1 - checksum: 80b467820b6daf824d9fb4345d2daf115a056e5c104463f2e98534e92d196a27f2df5ea2aa085624db26f4c45698905499e881d13bc7c01f7a13eac85be72a22 - languageName: node - linkType: hard - -"event-target-shim@npm:^5.0.0, event-target-shim@npm:^5.0.1": - version: 5.0.1 - resolution: "event-target-shim@npm:5.0.1" - checksum: 1ffe3bb22a6d51bdeb6bf6f7cf97d2ff4a74b017ad12284cc9e6a279e727dc30a5de6bb613e5596ff4dc3e517841339ad09a7eec44266eccb1aa201a30448166 - languageName: node - linkType: hard - -"eventemitter2@npm:6.4.7": - version: 6.4.7 - resolution: "eventemitter2@npm:6.4.7" - checksum: 1b36a77e139d6965ebf3a36c01fa00c089ae6b80faa1911e52888f40b3a7057b36a2cc45dcd1ad87cda3798fe7b97a0aabcbb8175a8b96092a23bb7d0f039e66 - languageName: node - linkType: hard - -"eventemitter2@npm:^6.4.7": - version: 6.4.9 - resolution: "eventemitter2@npm:6.4.9" - checksum: be59577c1e1c35509c7ba0e2624335c35bbcfd9485b8a977384c6cc6759341ea1a98d3cb9dbaa5cea4fff9b687e504504e3f9c2cc1674cf3bd8a43a7c74ea3eb - languageName: node - linkType: hard - -"eventemitter3@npm:5.0.1, eventemitter3@npm:^5.0.1": - version: 5.0.1 - resolution: "eventemitter3@npm:5.0.1" - checksum: 543d6c858ab699303c3c32e0f0f47fc64d360bf73c3daf0ac0b5079710e340d6fe9f15487f94e66c629f5f82cd1a8678d692f3dbb6f6fcd1190e1b97fcad36f8 - languageName: node - linkType: hard - -"eventemitter3@npm:^3.1.0": - version: 3.1.2 - resolution: "eventemitter3@npm:3.1.2" - checksum: 81e4e82b8418f5cfd986d2b4a2fa5397ac4eb8134e09bcb47005545e22fdf8e9e61d5c053d34651112245aae411bdfe6d0ad5511da0400743fef5fc38bfcfbe3 - languageName: node - linkType: hard - -"eventemitter3@npm:^4.0.0, eventemitter3@npm:^4.0.4": - version: 4.0.7 - resolution: "eventemitter3@npm:4.0.7" - checksum: 1875311c42fcfe9c707b2712c32664a245629b42bb0a5a84439762dd0fd637fc54d078155ea83c2af9e0323c9ac13687e03cfba79b03af9f40c89b4960099374 - languageName: node - linkType: hard - -"eventid@npm:^2.0.0": - version: 2.0.1 - resolution: "eventid@npm:2.0.1" - dependencies: - uuid: ^8.0.0 - checksum: d7de09a0792127796d8ff413e972c0fd2bf52547fd38b7d67bc6dcb10464eb6508f60b92b60e118ecce035586326b2e159be3cec7074fcd5e0e0217c754db3be - languageName: node - linkType: hard - -"events@npm:3.3.0, events@npm:^3.2.0, events@npm:^3.3.0": - version: 3.3.0 - resolution: "events@npm:3.3.0" - checksum: f6f487ad2198aa41d878fa31452f1a3c00958f46e9019286ff4787c84aac329332ab45c9cdc8c445928fc6d7ded294b9e005a7fce9426488518017831b272780 - languageName: node - linkType: hard - -"evp_bytestokey@npm:^1.0.0, evp_bytestokey@npm:^1.0.3": - version: 1.0.3 - resolution: "evp_bytestokey@npm:1.0.3" - dependencies: - md5.js: ^1.3.4 - node-gyp: latest - safe-buffer: ^5.1.1 - checksum: ad4e1577f1a6b721c7800dcc7c733fe01f6c310732bb5bf2240245c2a5b45a38518b91d8be2c610611623160b9d1c0e91f1ce96d639f8b53e8894625cf20fa45 - languageName: node - linkType: hard - -"exec-async@npm:^2.2.0": - version: 2.2.0 - resolution: "exec-async@npm:2.2.0" - checksum: 5877d83c2d553994accb39c26f40f0a633bca10d9572696e524fd91b385060ba05d1edcc28d6e3899c451e65ed453fdc7e6b69bd5d5a27d914220a100f81bb3a - languageName: node - linkType: hard - -"execa@npm:4.1.0": - version: 4.1.0 - resolution: "execa@npm:4.1.0" - dependencies: - cross-spawn: ^7.0.0 - get-stream: ^5.0.0 - human-signals: ^1.1.1 - is-stream: ^2.0.0 - merge-stream: ^2.0.0 - npm-run-path: ^4.0.0 - onetime: ^5.1.0 - signal-exit: ^3.0.2 - strip-final-newline: ^2.0.0 - checksum: e30d298934d9c52f90f3847704fd8224e849a081ab2b517bbc02f5f7732c24e56a21f14cb96a08256deffeb2d12b2b7cb7e2b014a12fb36f8d3357e06417ed55 - languageName: node - linkType: hard - -"execa@npm:5.1.1, execa@npm:^5.0.0, execa@npm:^5.1.1": - version: 5.1.1 - resolution: "execa@npm:5.1.1" - dependencies: - cross-spawn: ^7.0.3 - get-stream: ^6.0.0 - human-signals: ^2.1.0 - is-stream: ^2.0.0 - merge-stream: ^2.0.0 - npm-run-path: ^4.0.1 - onetime: ^5.1.2 - signal-exit: ^3.0.3 - strip-final-newline: ^2.0.0 - checksum: fba9022c8c8c15ed862847e94c252b3d946036d7547af310e344a527e59021fd8b6bb0723883ea87044dc4f0201f949046993124a42ccb0855cae5bf8c786343 - languageName: node - linkType: hard - -"execa@npm:7.2.0": - version: 7.2.0 - resolution: "execa@npm:7.2.0" - dependencies: - cross-spawn: ^7.0.3 - get-stream: ^6.0.1 - human-signals: ^4.3.0 - is-stream: ^3.0.0 - merge-stream: ^2.0.0 - npm-run-path: ^5.1.0 - onetime: ^6.0.0 - signal-exit: ^3.0.7 - strip-final-newline: ^3.0.0 - checksum: 14fd17ba0ca8c87b277584d93b1d9fc24f2a65e5152b31d5eb159a3b814854283eaae5f51efa9525e304447e2f757c691877f7adff8fde5746aae67eb1edd1cc - languageName: node - linkType: hard - -"execa@npm:^0.7.0": - version: 0.7.0 - resolution: "execa@npm:0.7.0" - dependencies: - cross-spawn: ^5.0.1 - get-stream: ^3.0.0 - is-stream: ^1.1.0 - npm-run-path: ^2.0.0 - p-finally: ^1.0.0 - signal-exit: ^3.0.0 - strip-eof: ^1.0.0 - checksum: dd70206d74b7217bf678ec9f04dddedc82f425df4c1d70e34c9f429d630ec407819e4bd42e3af2618981a4a3a1be000c9b651c0637be486cdab985160c20337c - languageName: node - linkType: hard - -"execa@npm:^1.0.0": - version: 1.0.0 - resolution: "execa@npm:1.0.0" - dependencies: - cross-spawn: ^6.0.0 - get-stream: ^4.0.0 - is-stream: ^1.1.0 - npm-run-path: ^2.0.0 - p-finally: ^1.0.0 - signal-exit: ^3.0.0 - strip-eof: ^1.0.0 - checksum: ddf1342c1c7d02dd93b41364cd847640f6163350d9439071abf70bf4ceb1b9b2b2e37f54babb1d8dc1df8e0d8def32d0e81e74a2e62c3e1d70c303eb4c306bc4 - languageName: node - linkType: hard - -"execa@npm:^8.0.1": - version: 8.0.1 - resolution: "execa@npm:8.0.1" - dependencies: - cross-spawn: ^7.0.3 - get-stream: ^8.0.1 - human-signals: ^5.0.0 - is-stream: ^3.0.0 - merge-stream: ^2.0.0 - npm-run-path: ^5.1.0 - onetime: ^6.0.0 - signal-exit: ^4.1.0 - strip-final-newline: ^3.0.0 - checksum: cac1bf86589d1d9b73bdc5dda65c52012d1a9619c44c526891956745f7b366ca2603d29fe3f7460bacc2b48c6eab5d6a4f7afe0534b31473d3708d1265545e1f - languageName: node - linkType: hard - -"executable@npm:^4.1.1": - version: 4.1.1 - resolution: "executable@npm:4.1.1" - dependencies: - pify: ^2.2.0 - checksum: f01927ce59bccec804e171bf859a26e362c1f50aa9ebc69f7cafdcce3859d29d4b6267fd47237c18b0a1830614bd3f0ee14b7380d9bad18a4e7af9b5f0b6984f - languageName: node - linkType: hard - -"exif-parser@npm:^0.1.12": - version: 0.1.12 - resolution: "exif-parser@npm:0.1.12" - checksum: 6ba50cb9e0b45a6efa37e966a9582ecd171b5c5b3ef0c47542f2b862c521f70d2f656dde85b4d2a5dd8e1163486b09049f4c412e9c6176bfbda1654a5b2f021c - languageName: node - linkType: hard - -"exit-hook@npm:^2.2.1": - version: 2.2.1 - resolution: "exit-hook@npm:2.2.1" - checksum: 1aa8359b6c5590a012d6cadf9cd337d227291bfcaa8970dc585d73dffef0582af34ed8ac56f6164f8979979fb417cff1eb49f03cdfd782f9332a30c773f0ada0 - languageName: node - linkType: hard - -"exit-on-epipe@npm:~1.0.1": - version: 1.0.1 - resolution: "exit-on-epipe@npm:1.0.1" - checksum: e8ab4940416d19f311b3c9226e3725c6c4c6026fe682266ecc0ff33a455d585fe3e4ee757857c7bf1d0491b478cb232b8e395dfb438e65ac87317eda47304c32 - languageName: node - linkType: hard - -"exit@npm:^0.1.2": - version: 0.1.2 - resolution: "exit@npm:0.1.2" - checksum: abc407f07a875c3961e4781dfcb743b58d6c93de9ab263f4f8c9d23bb6da5f9b7764fc773f86b43dd88030444d5ab8abcb611cb680fba8ca075362b77114bba3 - languageName: node - linkType: hard - -"expand-template@npm:^2.0.3": - version: 2.0.3 - resolution: "expand-template@npm:2.0.3" - checksum: 588c19847216421ed92befb521767b7018dc88f88b0576df98cb242f20961425e96a92cbece525ef28cc5becceae5d544ae0f5b9b5e2aa05acb13716ca5b3099 - languageName: node - linkType: hard - -"expand-tilde@npm:^2.0.0, expand-tilde@npm:^2.0.2": - version: 2.0.2 - resolution: "expand-tilde@npm:2.0.2" - dependencies: - homedir-polyfill: ^1.0.1 - checksum: 2efe6ed407d229981b1b6ceb552438fbc9e5c7d6a6751ad6ced3e0aa5cf12f0b299da695e90d6c2ac79191b5c53c613e508f7149e4573abfbb540698ddb7301a - languageName: node - linkType: hard - -"expect-more@npm:1.3.0": - version: 1.3.0 - resolution: "expect-more@npm:1.3.0" - checksum: 8d6b0692fbc22ad327161cfaa4f5920aad98e459873ba57f959fc07ce19dab9408e6b13afca812c50261b77a1c404b6d6ba64a928c5650cb1b76b3e0900155c0 - languageName: node - linkType: hard - -"expect@npm:^29.0.0, expect@npm:^29.7.0": - version: 29.7.0 - resolution: "expect@npm:29.7.0" - dependencies: - "@jest/expect-utils": ^29.7.0 - jest-get-type: ^29.6.3 - jest-matcher-utils: ^29.7.0 - jest-message-util: ^29.7.0 - jest-util: ^29.7.0 - checksum: 9257f10288e149b81254a0fda8ffe8d54a7061cd61d7515779998b012579d2b8c22354b0eb901daf0145f347403da582f75f359f4810c007182ad3fb318b5c0c - languageName: node - linkType: hard - -"expo-asset@npm:~11.0.1": - version: 11.0.3 - resolution: "expo-asset@npm:11.0.3" - dependencies: - "@expo/image-utils": ^0.6.4 - expo-constants: ~17.0.5 - invariant: ^2.2.4 - md5-file: ^3.2.3 - peerDependencies: - expo: "*" - react: "*" - react-native: "*" - checksum: e22714d0277dd7c3f8ece9ebc6e6475fb4fd96aa54c4ff42878837aef62f2d334232cd7a5afded0b5c55f18a7d4fa2737bce7920666525112c5ceee1d7e5c4fd - languageName: node - linkType: hard - -"expo-blur@npm:14.0.3": - version: 14.0.3 - resolution: "expo-blur@npm:14.0.3" - peerDependencies: - expo: "*" - react: "*" - react-native: "*" - checksum: f5f8aad2fa23b7cadc4c84bc7690ba44ebbe15c7aca89a703662c8a176e96de243baed2fde879bd6e044aafbe115ff0f3460ab8667aab0fd2461dfb1e5c53431 - languageName: node - linkType: hard - -"expo-camera@npm:16.0.8": - version: 16.0.8 - resolution: "expo-camera@npm:16.0.8" - dependencies: - invariant: ^2.2.4 - peerDependencies: - expo: "*" - react: "*" - react-native: "*" - react-native-web: "*" - peerDependenciesMeta: - react-native-web: - optional: true - checksum: e4d36dd52bf0976ac4f0e927cab561370a969bfa68ab0e01b9e797fbfa6cb611012e00513be7e7311964f383298aaacb08871d893a20263251bf697ca1d60967 - languageName: node - linkType: hard - -"expo-clipboard@npm:7.0.0": - version: 7.0.0 - resolution: "expo-clipboard@npm:7.0.0" - peerDependencies: - expo: "*" - react: "*" - react-native: "*" - checksum: 3d351582793a8d746f7fa26fd59d30a99e1cd59ce637ace94b85bea7348e8ab7ad0893cd830a47644e8ea3c109055ac369c6eed2e572b2d0f2a5834f64fb478a - languageName: node - linkType: hard - -"expo-constants@npm:~17.0.0, expo-constants@npm:~17.0.3, expo-constants@npm:~17.0.5": - version: 17.0.5 - resolution: "expo-constants@npm:17.0.5" - dependencies: - "@expo/config": ~10.0.8 - "@expo/env": ~0.4.1 - peerDependencies: - expo: "*" - react-native: "*" - checksum: b6cef4aabc59447e7cd15e6be0d002e88cf4c7c8cda498d027996bf6eee0b96b189d2e80ff120791589737f03a035986a6725b5de0534347f66aa4998b8439dc - languageName: node - linkType: hard - -"expo-crypto@npm:12.8.1": - version: 12.8.1 - resolution: "expo-crypto@npm:12.8.1" - dependencies: - base64-js: ^1.3.0 - peerDependencies: - expo: "*" - checksum: ec3e8cfe65914b05e5ce0cc47180eaa2e6ecad70c9e07ce7ddd0c2fc583350fcdf76a6e746f8dec66267ba4f904817d7967dbd0bb8397758e97a0a49f67397b0 - languageName: node - linkType: hard - -"expo-file-system@npm:~18.0.4": - version: 18.0.9 - resolution: "expo-file-system@npm:18.0.9" - dependencies: - web-streams-polyfill: ^3.3.2 - peerDependencies: - expo: "*" - react-native: "*" - checksum: 14827338cd20ecfae13915972870cfdd21e589962fb6b053a7a251364374aefee93c52fd356b7ba0099010ca2ea58f1843e83f7272751036cb1805f6d7e27263 - languageName: node - linkType: hard - -"expo-font@npm:~13.0.1": - version: 13.0.3 - resolution: "expo-font@npm:13.0.3" - dependencies: - fontfaceobserver: ^2.1.0 - peerDependencies: - expo: "*" - react: "*" - checksum: 43d46ddcd66cab21dd68c33dd45be21f9bd5092a7e8afe4becb6b4d6b6f3adb7d18c46ee4034526529ffcaa71070060c41377a1e88ba7d28a9587962d03e10b2 - languageName: node - linkType: hard - -"expo-haptics@npm:14.0.0": - version: 14.0.0 - resolution: "expo-haptics@npm:14.0.0" - peerDependencies: - expo: "*" - checksum: c4fec86f6c57c5b8d6ab0e19dff43bcffa2abdf37dbb785d4498e834ac2187ea2e4ea52e12f156ec1e8b02b8888b0aa055cd7ca033da520c67ce0159f88074d4 - languageName: node - linkType: hard - -"expo-keep-awake@npm:~14.0.1": - version: 14.0.2 - resolution: "expo-keep-awake@npm:14.0.2" - peerDependencies: - expo: "*" - react: "*" - checksum: 979ca89c95b37ac1fd13be82490515583e5c2dfd3f2f1919da3e3d453d78e5dc1df4420606934d787049c5d65b3613ff1428c6ee11ca8d28f00d99796f913f23 - languageName: node - linkType: hard - -"expo-linear-gradient@npm:14.0.1": - version: 14.0.1 - resolution: "expo-linear-gradient@npm:14.0.1" - peerDependencies: - expo: "*" - react: "*" - react-native: "*" - checksum: 8498a6d9888652bcde690f738fc3e00ec7c33ca251275135be73cecd0f7960c635b0c87aa4f73e681c907edcd52764d8a6b29fea3386ee9a74e59ea617d7e228 - languageName: node - linkType: hard - -"expo-linking@npm:7.0.3": - version: 7.0.3 - resolution: "expo-linking@npm:7.0.3" - dependencies: - expo-constants: ~17.0.0 - invariant: ^2.2.4 - peerDependencies: - react: "*" - react-native: "*" - checksum: f77c0ec729a23da6058e70a3bb556007efc0ad0d71f7306bec9a935678915efc61e814aaa4e72a6e52cc3bc8378e53abf98594bc8eba757eb7a1e96218490917 - languageName: node - linkType: hard - -"expo-local-authentication@npm:15.0.1": - version: 15.0.1 - resolution: "expo-local-authentication@npm:15.0.1" - dependencies: - invariant: ^2.2.4 - peerDependencies: - expo: "*" - checksum: 0716ae2b373a3a6ad21634cc86e50ca203d5fef0941ab9c3995a677999da66ea786bf8b2f42df48ced17ee5475f372c5fb5ad65c946ea0bf05c75a3a0b9c7ef0 - languageName: node - linkType: hard - -"expo-localization@npm:16.0.0": - version: 16.0.0 - resolution: "expo-localization@npm:16.0.0" - dependencies: - rtl-detect: ^1.0.2 - peerDependencies: - expo: "*" - react: "*" - checksum: f6d7663c4f803c55e754b02137cbd86f7c4485467eb12e7db0c15e195a9d2ccb68fa67a9bfe26168d68a49fe39917b5277a4d0d5b30aedfda0b5d4f4dbb1505a - languageName: node - linkType: hard - -"expo-modules-autolinking@npm:2.0.2": - version: 2.0.2 - resolution: "expo-modules-autolinking@npm:2.0.2" - dependencies: - "@expo/spawn-async": ^1.7.2 - chalk: ^4.1.0 - commander: ^7.2.0 - fast-glob: ^3.2.5 - find-up: ^5.0.0 - fs-extra: ^9.1.0 - require-from-string: ^2.0.2 - resolve-from: ^5.0.0 - bin: - expo-modules-autolinking: bin/expo-modules-autolinking.js - checksum: f1e7493069ed9eae2333577a7440a5432d4bfa9ab8c9a13f51d221bd6e472c3ea9783996fd0d4bbac43ae4cde3c8518bec38957572ce4c01c959db093730f43a - languageName: node - linkType: hard - -"expo-modules-core@npm:2.0.4": - version: 2.0.4 - resolution: "expo-modules-core@npm:2.0.4" - dependencies: - invariant: ^2.2.4 - checksum: a347753e6d8f611908f0cfb240f4b46c202cb3df99ccc45c40a7e32b8681e544fc185523b7b2a398c9626bc02610bcb6c2996bf789fb8cee5eaf2e837ffcdcf5 - languageName: node - linkType: hard - -"expo-modules-core@npm:2.1.4": - version: 2.1.4 - resolution: "expo-modules-core@npm:2.1.4" - dependencies: - invariant: ^2.2.4 - checksum: 58e52c6251609f61c58762c028b505bdd16fbba129e3641563db9d545ac251bf646c0b58133752b9afb0b8c4ea538f192ded667be642aea605c9f047acee5e2e - languageName: node - linkType: hard - -"expo-screen-capture@npm:7.0.0": - version: 7.0.0 - resolution: "expo-screen-capture@npm:7.0.0" - peerDependencies: - expo: "*" - react: "*" - checksum: 28e477f0a8c90614d0d1892d15e195acd5f48667877b05cdf22ab37b24c3c80254b1d6f5800d8d4f1d7b4e3b4bc45f099e4b166eb2a043f66c00372ac7afefa5 - languageName: node - linkType: hard - -"expo-store-review@npm:8.0.0": - version: 8.0.0 - resolution: "expo-store-review@npm:8.0.0" - peerDependencies: - expo: "*" - react-native: "*" - checksum: c0775c1307df7195abcbb609406d81fe909411be92fc506043c9275bb80cd98ab01600dbfa11ef0265a8a2691fee1e730aad3ca01bfde619c2b858d8ec526c15 - languageName: node - linkType: hard - -"expo-web-browser@npm:13.0.3": - version: 13.0.3 - resolution: "expo-web-browser@npm:13.0.3" - peerDependencies: - expo: "*" - checksum: 4ce0978ca64e0faca1a18ccec439f27e614e7f849a0496dd665d3da755c3a3462d03321bd93c736b1d1bc0eea896b2f275644b5f1fb672d88929c576fd1aa2f2 - languageName: node - linkType: hard - -"expo@npm:52.0.9": - version: 52.0.9 - resolution: "expo@npm:52.0.9" - dependencies: - "@babel/runtime": ^7.20.0 - "@expo/cli": 0.21.7 - "@expo/config": ~10.0.5 - "@expo/config-plugins": ~9.0.10 - "@expo/fingerprint": 0.11.2 - "@expo/metro-config": 0.19.4 - "@expo/vector-icons": ^14.0.0 - babel-preset-expo: ~12.0.1 - expo-asset: ~11.0.1 - expo-constants: ~17.0.3 - expo-file-system: ~18.0.4 - expo-font: ~13.0.1 - expo-keep-awake: ~14.0.1 - expo-modules-autolinking: 2.0.2 - expo-modules-core: 2.0.4 - fbemitter: ^3.0.0 - web-streams-polyfill: ^3.3.2 - whatwg-url-without-unicode: 8.0.0-3 - peerDependencies: - "@expo/dom-webview": "*" - "@expo/metro-runtime": "*" - react: "*" - react-native: "*" - react-native-webview: "*" - peerDependenciesMeta: - "@expo/dom-webview": - optional: true - "@expo/metro-runtime": - optional: true - react-native-webview: - optional: true - bin: - expo: bin/cli - checksum: 2a0f567d37a2896de07d8e03cfea683bde6430f3c00bd71e57d5e2e94d9336dc36d6ff2bac99c62c3aa39c7e8c831ff8760098de4d9bca253a66ac9d3444753f - languageName: node - linkType: hard - -"exponential-backoff@npm:^3.1.1": - version: 3.1.1 - resolution: "exponential-backoff@npm:3.1.1" - checksum: 3d21519a4f8207c99f7457287291316306255a328770d320b401114ec8481986e4e467e854cb9914dd965e0a1ca810a23ccb559c642c88f4c7f55c55778a9b48 - languageName: node - linkType: hard - -"express@npm:^4.17.3": - version: 4.18.2 - resolution: "express@npm:4.18.2" - dependencies: - accepts: ~1.3.8 - array-flatten: 1.1.1 - body-parser: 1.20.1 - content-disposition: 0.5.4 - content-type: ~1.0.4 - cookie: 0.5.0 - cookie-signature: 1.0.6 - debug: 2.6.9 - depd: 2.0.0 - encodeurl: ~1.0.2 - escape-html: ~1.0.3 - etag: ~1.8.1 - finalhandler: 1.2.0 - fresh: 0.5.2 - http-errors: 2.0.0 - merge-descriptors: 1.0.1 - methods: ~1.1.2 - on-finished: 2.4.1 - parseurl: ~1.3.3 - path-to-regexp: 0.1.7 - proxy-addr: ~2.0.7 - qs: 6.11.0 - range-parser: ~1.2.1 - safe-buffer: 5.2.1 - send: 0.18.0 - serve-static: 1.15.0 - setprototypeof: 1.2.0 - statuses: 2.0.1 - type-is: ~1.6.18 - utils-merge: 1.0.1 - vary: ~1.1.2 - checksum: 3c4b9b076879442f6b968fe53d85d9f1eeacbb4f4c41e5f16cc36d77ce39a2b0d81b3f250514982110d815b2f7173f5561367f9110fcc541f9371948e8c8b037 - languageName: node - linkType: hard - -"extend-shallow@npm:^2.0.1": - version: 2.0.1 - resolution: "extend-shallow@npm:2.0.1" - dependencies: - is-extendable: ^0.1.0 - checksum: 8fb58d9d7a511f4baf78d383e637bd7d2e80843bd9cd0853649108ea835208fb614da502a553acc30208e1325240bb7cc4a68473021612496bb89725483656d8 - languageName: node - linkType: hard - -"extend@npm:^3.0.0, extend@npm:^3.0.2, extend@npm:~3.0.2": - version: 3.0.2 - resolution: "extend@npm:3.0.2" - checksum: a50a8309ca65ea5d426382ff09f33586527882cf532931cb08ca786ea3146c0553310bda688710ff61d7668eba9f96b923fe1420cdf56a2c3eaf30fcab87b515 - languageName: node - linkType: hard - -"extension-port-stream@npm:^3.0.0": - version: 3.0.0 - resolution: "extension-port-stream@npm:3.0.0" - dependencies: - readable-stream: ^3.6.2 || ^4.4.2 - webextension-polyfill: ">=0.10.0 <1.0" - checksum: 4f51d2258a96154c2d916a8a5425636a2b0817763e9277f7dc378d08b6f050c90d185dbde4313d27cf66ad99d4b3116479f9f699c40358c64cccfa524d2b55bf - languageName: node - linkType: hard - -"external-editor@npm:^3.0.3": - version: 3.1.0 - resolution: "external-editor@npm:3.1.0" - dependencies: - chardet: ^0.7.0 - iconv-lite: ^0.4.24 - tmp: ^0.0.33 - checksum: 1c2a616a73f1b3435ce04030261bed0e22d4737e14b090bb48e58865da92529c9f2b05b893de650738d55e692d071819b45e1669259b2b354bc3154d27a698c7 - languageName: node - linkType: hard - -"extract-files@npm:^11.0.0": - version: 11.0.0 - resolution: "extract-files@npm:11.0.0" - checksum: 39ebd92772e9a1e30d1e3112fb7db85d353c8243640635668b615ac1d605ceb79fbb13d17829dd308993ef37bb189ad99817f79ab164ae95c9bb3df9f440bd16 - languageName: node - linkType: hard - -"extract-zip@npm:2.0.1, extract-zip@npm:^2.0.1": - version: 2.0.1 - resolution: "extract-zip@npm:2.0.1" - dependencies: - "@types/yauzl": ^2.9.1 - debug: ^4.1.1 - get-stream: ^5.1.0 - yauzl: ^2.10.0 - dependenciesMeta: - "@types/yauzl": - optional: true - bin: - extract-zip: cli.js - checksum: 8cbda9debdd6d6980819cc69734d874ddd71051c9fe5bde1ef307ebcedfe949ba57b004894b585f758b7c9eeeea0e3d87f2dda89b7d25320459c2c9643ebb635 - languageName: node - linkType: hard - -"extsprintf@npm:1.3.0": - version: 1.3.0 - resolution: "extsprintf@npm:1.3.0" - checksum: cee7a4a1e34cffeeec18559109de92c27517e5641991ec6bab849aa64e3081022903dd53084f2080d0d2530803aa5ee84f1e9de642c365452f9e67be8f958ce2 - languageName: node - linkType: hard - -"extsprintf@npm:^1.2.0": - version: 1.4.1 - resolution: "extsprintf@npm:1.4.1" - checksum: a2f29b241914a8d2bad64363de684821b6b1609d06ae68d5b539e4de6b28659715b5bea94a7265201603713b7027d35399d10b0548f09071c5513e65e8323d33 - languageName: node - linkType: hard - -"fancy-canvas@npm:2.1.0": - version: 2.1.0 - resolution: "fancy-canvas@npm:2.1.0" - checksum: 2463ca8a9254fb4cc69bbe33a2996b2a0ba8f725721d51464d9e87b4f3c3e8759e2289b0d592f56265501d5cff0b363bb7c72bb9c38212c19114dbd006ec8959 - languageName: node - linkType: hard - -"fast-base64-decode@npm:^1.0.0": - version: 1.0.0 - resolution: "fast-base64-decode@npm:1.0.0" - checksum: 4c59eb1775a7f132333f296c5082476fdcc8f58d023c42ed6d378d2e2da4c328c7a71562f271181a725dd17cdaa8f2805346cc330cdbad3b8e4b9751508bd0a3 - languageName: node - linkType: hard - -"fast-decode-uri-component@npm:^1.0.1": - version: 1.0.1 - resolution: "fast-decode-uri-component@npm:1.0.1" - checksum: 427a48fe0907e76f0e9a2c228e253b4d8a8ab21d130ee9e4bb8339c5ba4086235cf9576831f7b20955a752eae4b525a177ff9d5825dd8d416e7726939194fbee - languageName: node - linkType: hard - -"fast-deep-equal@npm:^3.1.1, fast-deep-equal@npm:^3.1.3": - version: 3.1.3 - resolution: "fast-deep-equal@npm:3.1.3" - checksum: e21a9d8d84f53493b6aa15efc9cfd53dd5b714a1f23f67fb5dc8f574af80df889b3bce25dc081887c6d25457cce704e636395333abad896ccdec03abaf1f3f9d - languageName: node - linkType: hard - -"fast-diff@npm:^1.1.2": - version: 1.2.0 - resolution: "fast-diff@npm:1.2.0" - checksum: 1b5306eaa9e826564d9e5ffcd6ebd881eb5f770b3f977fcbf38f05c824e42172b53c79920e8429c54eb742ce15a0caf268b0fdd5b38f6de52234c4a8368131ae - languageName: node - linkType: hard - -"fast-fifo@npm:^1.2.0, fast-fifo@npm:^1.3.2": - version: 1.3.2 - resolution: "fast-fifo@npm:1.3.2" - checksum: 6bfcba3e4df5af7be3332703b69a7898a8ed7020837ec4395bb341bd96cc3a6d86c3f6071dd98da289618cf2234c70d84b2a6f09a33dd6f988b1ff60d8e54275 - languageName: node - linkType: hard - -"fast-glob@npm:^3.2.11, fast-glob@npm:^3.2.5, fast-glob@npm:^3.2.9, fast-glob@npm:^3.3.0, fast-glob@npm:^3.3.2": - version: 3.3.2 - resolution: "fast-glob@npm:3.3.2" - dependencies: - "@nodelib/fs.stat": ^2.0.2 - "@nodelib/fs.walk": ^1.2.3 - glob-parent: ^5.1.2 - merge2: ^1.3.0 - micromatch: ^4.0.4 - checksum: 900e4979f4dbc3313840078419245621259f349950411ca2fa445a2f9a1a6d98c3b5e7e0660c5ccd563aa61abe133a21765c6c0dec8e57da1ba71d8000b05ec1 - languageName: node - linkType: hard - -"fast-json-parse@npm:^1.0.3": - version: 1.0.3 - resolution: "fast-json-parse@npm:1.0.3" - checksum: c19117c56ec18a9aa133c8ebf450c99d1037117e47a3cb9aff91b60580ba48d0fd8484b696c26749a1b9cb4914084177b3fa9ebef72063a74dee7d9ead987603 - languageName: node - linkType: hard - -"fast-json-patch@npm:^3.0.0-1": - version: 3.1.1 - resolution: "fast-json-patch@npm:3.1.1" - checksum: c4525b61b2471df60d4b025b4118b036d99778a93431aa44d1084218182841d82ce93056f0f3bbd731a24e6a8e69820128adf1873eb2199a26c62ef58d137833 - languageName: node - linkType: hard - -"fast-json-stable-stringify@npm:2.x, fast-json-stable-stringify@npm:^2.0.0, fast-json-stable-stringify@npm:^2.1.0": - version: 2.1.0 - resolution: "fast-json-stable-stringify@npm:2.1.0" - checksum: b191531e36c607977e5b1c47811158733c34ccb3bfde92c44798929e9b4154884378536d26ad90dfecd32e1ffc09c545d23535ad91b3161a27ddbb8ebe0cbecb - languageName: node - linkType: hard - -"fast-levenshtein@npm:^2.0.6, fast-levenshtein@npm:~2.0.6": - version: 2.0.6 - resolution: "fast-levenshtein@npm:2.0.6" - checksum: 92cfec0a8dfafd9c7a15fba8f2cc29cd0b62b85f056d99ce448bbcd9f708e18ab2764bda4dd5158364f4145a7c72788538994f0d1787b956ef0d1062b0f7c24c - languageName: node - linkType: hard - -"fast-loops@npm:^1.1.3": - version: 1.1.3 - resolution: "fast-loops@npm:1.1.3" - checksum: b674378ba2ed8364ca1a00768636e88b22201c8d010fa62a8588a4cace04f90bac46714c13cf638be82b03438d2fe813600da32291fb47297a1bd7fa6cef0cee - languageName: node - linkType: hard - -"fast-querystring@npm:^1.1.1": - version: 1.1.1 - resolution: "fast-querystring@npm:1.1.1" - dependencies: - fast-decode-uri-component: ^1.0.1 - checksum: 86d2b75b9b299a552353532fb1a542f09730ee2a61e657d68710971d9a2afc9a3c5c7b7e106b6534f4cc506d2ff1c08ab0fda4ae614b4e7720798c9ac2a88e02 - languageName: node - linkType: hard - -"fast-redact@npm:^3.0.0": - version: 3.1.2 - resolution: "fast-redact@npm:3.1.2" - checksum: a30eb6b6830333ab213e0def55f46453ca777544dbd3a883016cb590a0eeb95e6fdf546553c1a13d509896bfba889b789991160a6d0996ceb19fce0a02e8b753 - languageName: node - linkType: hard - -"fast-safe-stringify@npm:^2.0.6": - version: 2.1.1 - resolution: "fast-safe-stringify@npm:2.1.1" - checksum: a851cbddc451745662f8f00ddb622d6766f9bd97642dabfd9a405fb0d646d69fc0b9a1243cbf67f5f18a39f40f6fa821737651ff1bceeba06c9992ca2dc5bd3d - languageName: node - linkType: hard - -"fast-text-encoding@npm:1.0.6, fast-text-encoding@npm:^1.0.0": - version: 1.0.6 - resolution: "fast-text-encoding@npm:1.0.6" - checksum: 9d58f694314b3283e785bf61954902536da228607ad246905e30256f9ab8331f780ac987e7222c9f5eafd04168d07e12b8054c85cedb76a2c05af0e82387a903 - languageName: node - linkType: hard - -"fast-uri@npm:^3.0.1": - version: 3.0.1 - resolution: "fast-uri@npm:3.0.1" - checksum: 106143ff83705995225dcc559411288f3337e732bb2e264e79788f1914b6bd8f8bc3683102de60b15ba00e6ebb443633cabac77d4ebc5cb228c47cf955e199ff - languageName: node - linkType: hard - -"fast-url-parser@npm:^1.1.3": - version: 1.1.3 - resolution: "fast-url-parser@npm:1.1.3" - dependencies: - punycode: ^1.3.2 - checksum: 5043d0c4a8d775ff58504d56c096563c11b113e4cb8a2668c6f824a1cd4fb3812e2fdf76537eb24a7ce4ae7def6bd9747da630c617cf2a4b6ce0c42514e4f21c - languageName: node - linkType: hard - -"fast-xml-parser@npm:4.2.5": - version: 4.2.5 - resolution: "fast-xml-parser@npm:4.2.5" - dependencies: - strnum: ^1.0.5 - bin: - fxparser: src/cli/cli.js - checksum: d32b22005504eeb207249bf40dc82d0994b5bb9ca9dcc731d335a1f425e47fe085b3cace3cf9d32172dd1a5544193c49e8615ca95b4bf95a4a4920a226b06d80 - languageName: node - linkType: hard - -"fast-xml-parser@npm:^4.2.5, fast-xml-parser@npm:^4.4.1": - version: 4.5.1 - resolution: "fast-xml-parser@npm:4.5.1" - dependencies: - strnum: ^1.0.5 - bin: - fxparser: src/cli/cli.js - checksum: aab32d7f08a95b20f9ecdc2d769531a9dc454faf12740873972f8169c04ab9335ac5df1029ebfe829a01ddbb0ec60572cb7769d6be2409e95a9be8fc6a86e92c - languageName: node - linkType: hard - -"fastest-levenshtein@npm:^1.0.12": - version: 1.0.16 - resolution: "fastest-levenshtein@npm:1.0.16" - checksum: a78d44285c9e2ae2c25f3ef0f8a73f332c1247b7ea7fb4a191e6bb51aa6ee1ef0dfb3ed113616dcdc7023e18e35a8db41f61c8d88988e877cf510df8edafbc71 - languageName: node - linkType: hard - -"fastq@npm:^1.6.0": - version: 1.15.0 - resolution: "fastq@npm:1.15.0" - dependencies: - reusify: ^1.0.4 - checksum: 0170e6bfcd5d57a70412440b8ef600da6de3b2a6c5966aeaf0a852d542daff506a0ee92d6de7679d1de82e644bce69d7a574a6c93f0b03964b5337eed75ada1a - languageName: node - linkType: hard - -"faye-websocket@npm:0.11.4, faye-websocket@npm:^0.11.3": - version: 0.11.4 - resolution: "faye-websocket@npm:0.11.4" - dependencies: - websocket-driver: ">=0.5.1" - checksum: d49a62caf027f871149fc2b3f3c7104dc6d62744277eb6f9f36e2d5714e847d846b9f7f0d0b7169b25a012e24a594cde11a93034b30732e4c683f20b8a5019fa - languageName: node - linkType: hard - -"fb-watchman@npm:^2.0.0": - version: 2.0.2 - resolution: "fb-watchman@npm:2.0.2" - dependencies: - bser: 2.1.1 - checksum: b15a124cef28916fe07b400eb87cbc73ca082c142abf7ca8e8de6af43eca79ca7bd13eb4d4d48240b3bd3136eaac40d16e42d6edf87a8e5d1dd8070626860c78 - languageName: node - linkType: hard - -"fbemitter@npm:^3.0.0": - version: 3.0.0 - resolution: "fbemitter@npm:3.0.0" - dependencies: - fbjs: ^3.0.0 - checksum: 069690b8cdff3521ade3c9beb92ba0a38d818a86ef36dff8690e66749aef58809db4ac0d6938eb1cacea2dbef5f2a508952d455669590264cdc146bbe839f605 - languageName: node - linkType: hard - -"fbjs-css-vars@npm:^1.0.0": - version: 1.0.2 - resolution: "fbjs-css-vars@npm:1.0.2" - checksum: 72baf6d22c45b75109118b4daecb6c8016d4c83c8c0f23f683f22e9d7c21f32fff6201d288df46eb561e3c7d4bb4489b8ad140b7f56444c453ba407e8bd28511 - languageName: node - linkType: hard - -"fbjs@npm:^3.0.0, fbjs@npm:^3.0.4, fbjs@npm:^3.0.5": - version: 3.0.5 - resolution: "fbjs@npm:3.0.5" - dependencies: - cross-fetch: ^3.1.5 - fbjs-css-vars: ^1.0.0 - loose-envify: ^1.0.0 - object-assign: ^4.1.0 - promise: ^7.1.1 - setimmediate: ^1.0.5 - ua-parser-js: ^1.0.35 - checksum: e609b5b64686bc96495a5c67728ed9b2710b9b3d695c5759c5f5e47c9483d1c323543ac777a86459e3694efc5712c6ce7212e944feb19752867d699568bb0e54 - languageName: node - linkType: hard - -"fd-slicer@npm:~1.1.0": - version: 1.1.0 - resolution: "fd-slicer@npm:1.1.0" - dependencies: - pend: ~1.2.0 - checksum: c8585fd5713f4476eb8261150900d2cb7f6ff2d87f8feb306ccc8a1122efd152f1783bdb2b8dc891395744583436bfd8081d8e63ece0ec8687eeefea394d4ff2 - languageName: node - linkType: hard - -"fdir@npm:^6.4.2": - version: 6.4.2 - resolution: "fdir@npm:6.4.2" - peerDependencies: - picomatch: ^3 || ^4 - peerDependenciesMeta: - picomatch: - optional: true - checksum: 517ad31c495f1c0778238eef574a7818788efaaf2ce1969ffa18c70793e2951a9763dfa2e6720b8fcef615e602a3cbb47f9b8aea9da0b02147579ab36043f22f - languageName: node - linkType: hard - -"fetch-retry@npm:^4.1.1": - version: 4.1.1 - resolution: "fetch-retry@npm:4.1.1" - checksum: a06b6a0201efeb5082794713bcdc8dd2c8f1fd4ad5660de860b9c4e51738aa369be58ba7cfa67aa7aa4a3bf9d9b5a4cd2d2fdea88868856483fb81bacd70455b - languageName: node - linkType: hard - -"fflate@npm:^0.7.3": - version: 0.7.4 - resolution: "fflate@npm:0.7.4" - checksum: b812ab26047432db70ff4c73eb45ad53bd0774575b4818b9c61c2921e89ec65d1259f06ec1618f2ac55e6a2f2e29b6dc09173d213b46580bc69efae5344bf8f1 - languageName: node - linkType: hard - -"figures@npm:^3.0.0, figures@npm:^3.2.0": - version: 3.2.0 - resolution: "figures@npm:3.2.0" - dependencies: - escape-string-regexp: ^1.0.5 - checksum: 85a6ad29e9aca80b49b817e7c89ecc4716ff14e3779d9835af554db91bac41c0f289c418923519392a1e582b4d10482ad282021330cd045bb7b80c84152f2a2b - languageName: node - linkType: hard - -"file-entry-cache@npm:^6.0.1": - version: 6.0.1 - resolution: "file-entry-cache@npm:6.0.1" - dependencies: - flat-cache: ^3.0.4 - checksum: f49701feaa6314c8127c3c2f6173cfefff17612f5ed2daaafc6da13b5c91fd43e3b2a58fd0d63f9f94478a501b167615931e7200e31485e320f74a33885a9c74 - languageName: node - linkType: hard - -"file-loader@npm:^6.2.0": - version: 6.2.0 - resolution: "file-loader@npm:6.2.0" - dependencies: - loader-utils: ^2.0.0 - schema-utils: ^3.0.0 - peerDependencies: - webpack: ^4.0.0 || ^5.0.0 - checksum: faf43eecf233f4897b0150aaa874eeeac214e4f9de49738a9e0ef734a30b5260059e85b7edadf852b98e415f875bd5f12587768a93fd52aaf2e479ecf95fab20 - languageName: node - linkType: hard - -"file-type@npm:^9.0.0": - version: 9.0.0 - resolution: "file-type@npm:9.0.0" - checksum: 9ea78b29c3762d967eb1e3e4f45e401388b6d252b12c217f78f5ea97556ff7e35e4c7255cab68810ac414d51b776bd4e83504c86f132c262a454251561189efa - languageName: node - linkType: hard - -"filelist@npm:^1.0.1": - version: 1.0.4 - resolution: "filelist@npm:1.0.4" - dependencies: - minimatch: ^5.0.1 - checksum: a303573b0821e17f2d5e9783688ab6fbfce5d52aaac842790ae85e704a6f5e4e3538660a63183d6453834dedf1e0f19a9dadcebfa3e926c72397694ea11f5160 - languageName: node - linkType: hard - -"filesize@npm:^10.0.12": - version: 10.1.6 - resolution: "filesize@npm:10.1.6" - checksum: a797a9d41c8f27a9ae334d23f99fc5d903eac5d03c82190dc163901205435b56626fe1260c779ba3e87a2a34d426f19ff264c3f7d956e00f2d3ac69760b52e33 - languageName: node - linkType: hard - -"filesize@npm:^8.0.6": - version: 8.0.7 - resolution: "filesize@npm:8.0.7" - checksum: 8603d27c5287b984cb100733640645e078f5f5ad65c6d913173e01fb99e09b0747828498fd86647685ccecb69be31f3587b9739ab1e50732116b2374aff4cbf9 - languageName: node - linkType: hard - -"filing-cabinet@npm:^3.0.1": - version: 3.3.1 - resolution: "filing-cabinet@npm:3.3.1" - dependencies: - app-module-path: ^2.2.0 - commander: ^2.20.3 - debug: ^4.3.3 - enhanced-resolve: ^5.8.3 - is-relative-path: ^1.0.2 - module-definition: ^3.3.1 - module-lookup-amd: ^7.0.1 - resolve: ^1.21.0 - resolve-dependency-path: ^2.0.0 - sass-lookup: ^3.0.0 - stylus-lookup: ^3.0.1 - tsconfig-paths: ^3.10.1 - typescript: ^3.9.7 - bin: - filing-cabinet: bin/cli.js - checksum: f6511c2e93e236c0d882244b49936a2c8cb2fde47e0d1a0a93345ce171995c2734670c38ed1c0aceaee9ed4958fcce48bfbbb687efe4dedf04b6ea46b0a8c1c0 - languageName: node - linkType: hard - -"fill-range@npm:^7.1.1": - version: 7.1.1 - resolution: "fill-range@npm:7.1.1" - dependencies: - to-regex-range: ^5.0.1 - checksum: b4abfbca3839a3d55e4ae5ec62e131e2e356bf4859ce8480c64c4876100f4df292a63e5bb1618e1d7460282ca2b305653064f01654474aa35c68000980f17798 - languageName: node - linkType: hard - -"filter-obj@npm:^1.1.0": - version: 1.1.0 - resolution: "filter-obj@npm:1.1.0" - checksum: cf2104a7c45ff48e7f505b78a3991c8f7f30f28bd8106ef582721f321f1c6277f7751aacd5d83026cb079d9d5091082f588d14a72e7c5d720ece79118fa61e10 - languageName: node - linkType: hard - -"filter-obj@npm:^2.0.2": - version: 2.0.2 - resolution: "filter-obj@npm:2.0.2" - checksum: e0d71ebc89515a4305db5158aeb78c9f9a4bfef4bacf272e7de8cadf0d3b694191f6fdbd3b507ee330c266c4287f21804defa8c80693d8c6ad60f1cbfad4f477 - languageName: node - linkType: hard - -"finalhandler@npm:1.1.2": - version: 1.1.2 - resolution: "finalhandler@npm:1.1.2" - dependencies: - debug: 2.6.9 - encodeurl: ~1.0.2 - escape-html: ~1.0.3 - on-finished: ~2.3.0 - parseurl: ~1.3.3 - statuses: ~1.5.0 - unpipe: ~1.0.0 - checksum: 617880460c5138dd7ccfd555cb5dde4d8f170f4b31b8bd51e4b646bb2946c30f7db716428a1f2882d730d2b72afb47d1f67cc487b874cb15426f95753a88965e - languageName: node - linkType: hard - -"finalhandler@npm:1.2.0": - version: 1.2.0 - resolution: "finalhandler@npm:1.2.0" - dependencies: - debug: 2.6.9 - encodeurl: ~1.0.2 - escape-html: ~1.0.3 - on-finished: 2.4.1 - parseurl: ~1.3.3 - statuses: 2.0.1 - unpipe: ~1.0.0 - checksum: 92effbfd32e22a7dff2994acedbd9bcc3aa646a3e919ea6a53238090e87097f8ef07cced90aa2cc421abdf993aefbdd5b00104d55c7c5479a8d00ed105b45716 - languageName: node - linkType: hard - -"find-babel-config@npm:^2.0.0": - version: 2.0.0 - resolution: "find-babel-config@npm:2.0.0" - dependencies: - json5: ^2.1.1 - path-exists: ^4.0.0 - checksum: d110308b02fe6a6411a0cfb7fd50af6740fbf5093eada3d6ddacf99b07fc8eea4aa3475356484710a0032433029a21ce733bb3ef88fda1d6e35c29a3e4983014 - languageName: node - linkType: hard - -"find-cache-dir@npm:^2.0.0": - version: 2.1.0 - resolution: "find-cache-dir@npm:2.1.0" - dependencies: - commondir: ^1.0.1 - make-dir: ^2.0.0 - pkg-dir: ^3.0.0 - checksum: 60ad475a6da9f257df4e81900f78986ab367d4f65d33cf802c5b91e969c28a8762f098693d7a571b6e4dd4c15166c2da32ae2d18b6766a18e2071079448fdce4 - languageName: node - linkType: hard - -"find-cache-dir@npm:^3.3.1, find-cache-dir@npm:^3.3.2": - version: 3.3.2 - resolution: "find-cache-dir@npm:3.3.2" - dependencies: - commondir: ^1.0.1 - make-dir: ^3.0.2 - pkg-dir: ^4.1.0 - checksum: 1e61c2e64f5c0b1c535bd85939ae73b0e5773142713273818cc0b393ee3555fb0fd44e1a5b161b8b6c3e03e98c2fcc9c227d784850a13a90a8ab576869576817 - languageName: node - linkType: hard - -"find-replace@npm:^1.0.3": - version: 1.0.3 - resolution: "find-replace@npm:1.0.3" - dependencies: - array-back: ^1.0.4 - test-value: ^2.1.0 - checksum: fd95f44e59bd54ea1c0169480952b339a4642cd62d81236fef7f87146d3bc00a042b17d81f896712e8542e01fe5c84e82ac37b6b77b4e3422abbcf7c13bbacfd - languageName: node - linkType: hard - -"find-root@npm:^1.1.0": - version: 1.1.0 - resolution: "find-root@npm:1.1.0" - checksum: b2a59fe4b6c932eef36c45a048ae8f93c85640212ebe8363164814990ee20f154197505965f3f4f102efc33bfb1cbc26fd17c4a2fc739ebc51b886b137cbefaf - languageName: node - linkType: hard - -"find-up@npm:5.0.0, find-up@npm:^5.0.0, find-up@npm:~5.0.0": - version: 5.0.0 - resolution: "find-up@npm:5.0.0" - dependencies: - locate-path: ^6.0.0 - path-exists: ^4.0.0 - checksum: 07955e357348f34660bde7920783204ff5a26ac2cafcaa28bace494027158a97b9f56faaf2d89a6106211a8174db650dd9f503f9c0d526b1202d5554a00b9095 - languageName: node - linkType: hard - -"find-up@npm:^3.0.0": - version: 3.0.0 - resolution: "find-up@npm:3.0.0" - dependencies: - locate-path: ^3.0.0 - checksum: 38eba3fe7a66e4bc7f0f5a1366dc25508b7cfc349f852640e3678d26ad9a6d7e2c43eff0a472287de4a9753ef58f066a0ea892a256fa3636ad51b3fe1e17fae9 - languageName: node - linkType: hard - -"find-up@npm:^4.0.0, find-up@npm:^4.1.0": - version: 4.1.0 - resolution: "find-up@npm:4.1.0" - dependencies: - locate-path: ^5.0.0 - path-exists: ^4.0.0 - checksum: 4c172680e8f8c1f78839486e14a43ef82e9decd0e74145f40707cc42e7420506d5ec92d9a11c22bd2c48fb0c384ea05dd30e10dd152fefeec6f2f75282a8b844 - languageName: node - linkType: hard - -"find-value@npm:^1.0.12": - version: 1.0.12 - resolution: "find-value@npm:1.0.12" - checksum: 5cab63c88e5090744de582c8c331c05b134f3501935da270f24c95b395c4fea3e7d0df5e9cfdd6c2a25b80ac7cde3bc06d6dd388e4fdc6cd52f6580ed95e14e1 - languageName: node - linkType: hard - -"findup-sync@npm:^5.0.0": - version: 5.0.0 - resolution: "findup-sync@npm:5.0.0" - dependencies: - detect-file: ^1.0.0 - is-glob: ^4.0.3 - micromatch: ^4.0.4 - resolve-dir: ^1.0.1 - checksum: 576716c77a0e8330b17ae9cba27d1fda8907c8cda7bf33a47f1999e16e089bfc6df4dd62933e0760f430736183c054348c34aa45dd882d49c8c098f55b89ee1d - languageName: node - linkType: hard - -"firebase@npm:10.13.2": - version: 10.13.2 - resolution: "firebase@npm:10.13.2" - dependencies: - "@firebase/analytics": 0.10.8 - "@firebase/analytics-compat": 0.2.14 - "@firebase/app": 0.10.11 - "@firebase/app-check": 0.8.8 - "@firebase/app-check-compat": 0.3.15 - "@firebase/app-compat": 0.2.41 - "@firebase/app-types": 0.9.2 - "@firebase/auth": 1.7.9 - "@firebase/auth-compat": 0.5.14 - "@firebase/database": 1.0.8 - "@firebase/database-compat": 1.0.8 - "@firebase/firestore": 4.7.2 - "@firebase/firestore-compat": 0.3.37 - "@firebase/functions": 0.11.8 - "@firebase/functions-compat": 0.3.14 - "@firebase/installations": 0.6.9 - "@firebase/installations-compat": 0.2.9 - "@firebase/messaging": 0.12.11 - "@firebase/messaging-compat": 0.2.11 - "@firebase/performance": 0.6.9 - "@firebase/performance-compat": 0.2.9 - "@firebase/remote-config": 0.4.9 - "@firebase/remote-config-compat": 0.2.9 - "@firebase/storage": 0.13.2 - "@firebase/storage-compat": 0.3.12 - "@firebase/util": 1.10.0 - "@firebase/vertexai-preview": 0.0.4 - checksum: 5778ab880f845e1bfdf03282f1d5e024efa7ae18cec95cb5f416092da3eabc5b6f7b4f6377466987b842e42d434c111f7a49633b17d0db95504e6c743d4401f9 - languageName: node - linkType: hard - -"flat-cache@npm:^3.0.4": - version: 3.0.4 - resolution: "flat-cache@npm:3.0.4" - dependencies: - flatted: ^3.1.0 - rimraf: ^3.0.2 - checksum: 4fdd10ecbcbf7d520f9040dd1340eb5dfe951e6f0ecf2252edeec03ee68d989ec8b9a20f4434270e71bcfd57800dc09b3344fca3966b2eb8f613072c7d9a2365 - languageName: node - linkType: hard - -"flat@npm:^5.0.2": - version: 5.0.2 - resolution: "flat@npm:5.0.2" - bin: - flat: cli.js - checksum: 12a1536ac746db74881316a181499a78ef953632ddd28050b7a3a43c62ef5462e3357c8c29d76072bb635f147f7a9a1f0c02efef6b4be28f8db62ceb3d5c7f5d - languageName: node - linkType: hard - -"flatted@npm:^3.1.0": - version: 3.2.2 - resolution: "flatted@npm:3.2.2" - checksum: 9d5e03fd9309b9103f345cf6d0cef4fa46201baa053b0ca3d57fa489449b0bee687b7355407898f630afbb1a1286d2a6658e7e77dea3b85c3cd6c6ce2894a5c3 - languageName: node - linkType: hard - -"flatten@npm:^1.0.2": - version: 1.0.3 - resolution: "flatten@npm:1.0.3" - checksum: 5c57379816f1692aaa79fbc6390e0a0644e5e8442c5783ed57c6d315468eddbc53a659eaa03c9bb1e771b0f4a9bd8dd8a2620286bf21fd6538a7857321fdfb20 - languageName: node - linkType: hard - -"flow-enums-runtime@npm:^0.0.6": - version: 0.0.6 - resolution: "flow-enums-runtime@npm:0.0.6" - checksum: c60412ed6d43b26bf5dfa66be8e588c3ccdb20191fd269e02ca7e8e1d350c73a327cc9a7edb626c80c31eb906981945d12a87ca37118985f33406303806dab79 - languageName: node - linkType: hard - -"flow-parser@npm:0.*": - version: 0.206.0 - resolution: "flow-parser@npm:0.206.0" - checksum: 1b87d87b59815b09852a6981543ad222da7f4d0e0c26702f9d5e0065174f5f64d2563db76d07a487c6b55e1979344e3845ac42929db70f77a82e8c9171a62a86 - languageName: node - linkType: hard - -"flush-write-stream@npm:^1.0.2": - version: 1.1.1 - resolution: "flush-write-stream@npm:1.1.1" - dependencies: - inherits: ^2.0.3 - readable-stream: ^2.3.6 - checksum: 42e07747f83bcd4e799da802e621d6039787749ffd41f5517f8c4f786ee967e31ba32b09f8b28a9c6f67bd4f5346772e604202df350e8d99f4141771bae31279 - languageName: node - linkType: hard - -"focus-lock@npm:^1.0.0": - version: 1.0.0 - resolution: "focus-lock@npm:1.0.0" - dependencies: - tslib: ^2.0.3 - checksum: 85eb62534e8c0314026453c4f734bf6450054a19b248280f3f69c98b5d5481707124e2206d7dc515650a6f28da827a2de297455056a9c8f398e5f8ba5dba8419 - languageName: node - linkType: hard - -"focus-visible@npm:5.2.0": - version: 5.2.0 - resolution: "focus-visible@npm:5.2.0" - checksum: 876f646ef453680d3d34e9f9b23961527ffd5ccaed8690f423d4fbfa37ff023d98a490972bc1387850e37ec2e44958c81f6096ef95b67462e5c4b5404cf1dbb9 - languageName: node - linkType: hard - -"follow-redirects@npm:^1.0.0, follow-redirects@npm:^1.12.1, follow-redirects@npm:^1.14.9, follow-redirects@npm:^1.15.4, follow-redirects@npm:^1.15.6": - version: 1.15.6 - resolution: "follow-redirects@npm:1.15.6" - peerDependenciesMeta: - debug: - optional: true - checksum: a62c378dfc8c00f60b9c80cab158ba54e99ba0239a5dd7c81245e5a5b39d10f0c35e249c3379eae719ff0285fff88c365dd446fab19dee771f1d76252df1bbf5 - languageName: node - linkType: hard - -"fontfaceobserver@npm:^2.1.0": - version: 2.3.0 - resolution: "fontfaceobserver@npm:2.3.0" - checksum: 5f14715974203b9d68f299f93a7623afd9d5701572d683e861cdbb7514573ac556f56e9b5d07d2d534e01aed19a3b0bbe568e735e0e5494cbea913fc3f12b856 - languageName: node - linkType: hard - -"for-each@npm:^0.3.3": - version: 0.3.3 - resolution: "for-each@npm:0.3.3" - dependencies: - is-callable: ^1.1.3 - checksum: 6c48ff2bc63362319c65e2edca4a8e1e3483a2fabc72fbe7feaf8c73db94fc7861bd53bc02c8a66a0c1dd709da6b04eec42e0abdd6b40ce47305ae92a25e5d28 - languageName: node - linkType: hard - -"for-in@npm:^0.1.3": - version: 0.1.8 - resolution: "for-in@npm:0.1.8" - checksum: f5bdad7811700ee6a0f96b33d72a1db966aea75a1f03c7245d147f8369305e709f53a55ee7ae8eaddcfa85c7c89bca78472be8f1bc605475ce5bb2c70f77f8da - languageName: node - linkType: hard - -"for-in@npm:^1.0.1": - version: 1.0.2 - resolution: "for-in@npm:1.0.2" - checksum: 09f4ae93ce785d253ac963d94c7f3432d89398bf25ac7a24ed034ca393bf74380bdeccc40e0f2d721a895e54211b07c8fad7132e8157827f6f7f059b70b4043d - languageName: node - linkType: hard - -"for-own@npm:^1.0.0": - version: 1.0.0 - resolution: "for-own@npm:1.0.0" - dependencies: - for-in: ^1.0.1 - checksum: 233238f6e9060f61295a7f7c7e3e9de11aaef57e82a108e7f350dc92ae84fe2189848077ac4b8db47fd8edd45337ed8d9f66bd0b1efa4a6a1b3f38aa21b7ab2e - languageName: node - linkType: hard - -"foreground-child@npm:^3.1.0": - version: 3.3.0 - resolution: "foreground-child@npm:3.3.0" - dependencies: - cross-spawn: ^7.0.0 - signal-exit: ^4.0.1 - checksum: 1989698488f725b05b26bc9afc8a08f08ec41807cd7b92ad85d96004ddf8243fd3e79486b8348c64a3011ae5cc2c9f0936af989e1f28339805d8bc178a75b451 - languageName: node - linkType: hard - -"forever-agent@npm:~0.6.1": - version: 0.6.1 - resolution: "forever-agent@npm:0.6.1" - checksum: 766ae6e220f5fe23676bb4c6a99387cec5b7b62ceb99e10923376e27bfea72f3c3aeec2ba5f45f3f7ba65d6616965aa7c20b15002b6860833bb6e394dea546a8 - languageName: node - linkType: hard - -"fork-ts-checker-webpack-plugin@npm:^6.5.0": - version: 6.5.3 - resolution: "fork-ts-checker-webpack-plugin@npm:6.5.3" - dependencies: - "@babel/code-frame": ^7.8.3 - "@types/json-schema": ^7.0.5 - chalk: ^4.1.0 - chokidar: ^3.4.2 - cosmiconfig: ^6.0.0 - deepmerge: ^4.2.2 - fs-extra: ^9.0.0 - glob: ^7.1.6 - memfs: ^3.1.2 - minimatch: ^3.0.4 - schema-utils: 2.7.0 - semver: ^7.3.2 - tapable: ^1.0.0 - peerDependencies: - eslint: ">= 6" - typescript: ">= 2.7" - vue-template-compiler: "*" - webpack: ">= 4" - peerDependenciesMeta: - eslint: - optional: true - vue-template-compiler: - optional: true - checksum: 9732a49bfeed8fc23e6e8a59795fa7c238edeba91040a9b520db54b4d316dda27f9f1893d360e296fd0ad8930627d364417d28a8c7007fba60cc730ebfce4956 - languageName: node - linkType: hard - -"fork-ts-checker-webpack-plugin@npm:^8.0.0": - version: 8.0.0 - resolution: "fork-ts-checker-webpack-plugin@npm:8.0.0" - dependencies: - "@babel/code-frame": ^7.16.7 - chalk: ^4.1.2 - chokidar: ^3.5.3 - cosmiconfig: ^7.0.1 - deepmerge: ^4.2.2 - fs-extra: ^10.0.0 - memfs: ^3.4.1 - minimatch: ^3.0.4 - node-abort-controller: ^3.0.1 - schema-utils: ^3.1.1 - semver: ^7.3.5 - tapable: ^2.2.1 - peerDependencies: - typescript: ">3.6.0" - webpack: ^5.11.0 - checksum: aad4cbc5b802e6281a2700a379837697c93ad95288468f9595219d91d9c26674736d37852bb4c4341e9122f26181e9e05fc1a362e8d029fdd88e99de7816037b - languageName: node - linkType: hard - -"form-data-encoder@npm:1.7.2, form-data-encoder@npm:^1.7.1": - version: 1.7.2 - resolution: "form-data-encoder@npm:1.7.2" - checksum: aeebd87a1cb009e13cbb5e4e4008e6202ed5f6551eb6d9582ba8a062005178907b90f4887899d3c993de879159b6c0c940af8196725b428b4248cec5af3acf5f - languageName: node - linkType: hard - -"form-data@npm:4.0.0, form-data@npm:^4.0.0": - version: 4.0.0 - resolution: "form-data@npm:4.0.0" - dependencies: - asynckit: ^0.4.0 - combined-stream: ^1.0.8 - mime-types: ^2.1.12 - checksum: 01135bf8675f9d5c61ff18e2e2932f719ca4de964e3be90ef4c36aacfc7b9cb2fceb5eca0b7e0190e3383fe51c5b37f4cb80b62ca06a99aaabfcfd6ac7c9328c - languageName: node - linkType: hard - -"form-data@npm:^2.5.0": - version: 2.5.1 - resolution: "form-data@npm:2.5.1" - dependencies: - asynckit: ^0.4.0 - combined-stream: ^1.0.6 - mime-types: ^2.1.12 - checksum: 5134ada56cc246b293a1ac7678dba6830000603a3979cf83ff7b2f21f2e3725202237cfb89e32bcb38a1d35727efbd3c3a22e65b42321e8ade8eec01ce755d08 - languageName: node - linkType: hard - -"form-data@npm:^3.0.0, form-data@npm:^3.0.1": - version: 3.0.1 - resolution: "form-data@npm:3.0.1" - dependencies: - asynckit: ^0.4.0 - combined-stream: ^1.0.8 - mime-types: ^2.1.12 - checksum: b019e8d35c8afc14a2bd8a7a92fa4f525a4726b6d5a9740e8d2623c30e308fbb58dc8469f90415a856698933c8479b01646a9dff33c87cc4e76d72aedbbf860d - languageName: node - linkType: hard - -"form-data@npm:~2.3.2": - version: 2.3.3 - resolution: "form-data@npm:2.3.3" - dependencies: - asynckit: ^0.4.0 - combined-stream: ^1.0.6 - mime-types: ^2.1.12 - checksum: 10c1780fa13dbe1ff3100114c2ce1f9307f8be10b14bf16e103815356ff567b6be39d70fc4a40f8990b9660012dc24b0f5e1dde1b6426166eb23a445ba068ca3 - languageName: node - linkType: hard - -"formdata-node@npm:^4.3.1, formdata-node@npm:^4.3.2": - version: 4.4.1 - resolution: "formdata-node@npm:4.4.1" - dependencies: - node-domexception: 1.0.0 - web-streams-polyfill: 4.0.0-beta.3 - checksum: d91d4f667cfed74827fc281594102c0dabddd03c9f8b426fc97123eedbf73f5060ee43205d89284d6854e2fc5827e030cd352ef68b93beda8decc2d72128c576 - languageName: node - linkType: hard - -"forwarded@npm:0.2.0": - version: 0.2.0 - resolution: "forwarded@npm:0.2.0" - checksum: fd27e2394d8887ebd16a66ffc889dc983fbbd797d5d3f01087c020283c0f019a7d05ee85669383d8e0d216b116d720fc0cef2f6e9b7eb9f4c90c6e0bc7fd28e6 - languageName: node - linkType: hard - -"fp-ts@npm:1.19.3, fp-ts@npm:^1.0.0": - version: 1.19.3 - resolution: "fp-ts@npm:1.19.3" - checksum: eb0d4766ad561e9c5c01bfdd3d0ae589af135556921c733d26cf5289aad9f400110defdd93e6ac1d71f626697bb44d9d95ed2879c53dfd868f7cac3cf5c5553c - languageName: node - linkType: hard - -"fp-ts@npm:2.13.1": - version: 2.13.1 - resolution: "fp-ts@npm:2.13.1" - checksum: 618e0028aca9ff1d52b86f438499ccab149825bdab14c678d22c3e2ccbf9d36fd1f26d463bf0ae1e63f5cd79dd54c8218af2cca0daeea68b039307b751ae9563 - languageName: node - linkType: hard - -"fraction.js@npm:^4.3.7": - version: 4.3.7 - resolution: "fraction.js@npm:4.3.7" - checksum: e1553ae3f08e3ba0e8c06e43a3ab20b319966dfb7ddb96fd9b5d0ee11a66571af7f993229c88ebbb0d4a816eb813a24ed48207b140d442a8f76f33763b8d1f3f - languageName: node - linkType: hard - -"framer-motion@npm:10.17.6": - version: 10.17.6 - resolution: "framer-motion@npm:10.17.6" - dependencies: - "@emotion/is-prop-valid": ^0.8.2 - tslib: ^2.4.0 - peerDependencies: - react: ^18.0.0 - react-dom: ^18.0.0 - dependenciesMeta: - "@emotion/is-prop-valid": - optional: true - peerDependenciesMeta: - react: - optional: true - react-dom: - optional: true - checksum: c47fa15590c5eb8d9eeacc2ef9502530b1559aa3b9eaf2ac2bc48305eee155ad9ceebe1eb57300bc7fb72b47952134f80027aa8f23e286f15edc2aedb7770847 - languageName: node - linkType: hard - -"framer-motion@npm:^6.5.1": - version: 6.5.1 - resolution: "framer-motion@npm:6.5.1" - dependencies: - "@emotion/is-prop-valid": ^0.8.2 - "@motionone/dom": 10.12.0 - framesync: 6.0.1 - hey-listen: ^1.0.8 - popmotion: 11.0.3 - style-value-types: 5.0.0 - tslib: ^2.1.0 - peerDependencies: - react: ">=16.8 || ^17.0.0 || ^18.0.0" - react-dom: ">=16.8 || ^17.0.0 || ^18.0.0" - dependenciesMeta: - "@emotion/is-prop-valid": - optional: true - checksum: 737959063137b4ccafe01e0ac0c9e5a9531bf3f729f62c34ca7a5d7955e6664f70affd22b044f7db51df41acb21d120a4f71a860e17a80c4db766ad66f2153a1 - languageName: node - linkType: hard - -"framesync@npm:6.0.1": - version: 6.0.1 - resolution: "framesync@npm:6.0.1" - dependencies: - tslib: ^2.1.0 - checksum: a23ebe8f7e20a32c0b99c2f8175b6f07af3ec6316aad52a2316316a6d011d717af8d2175dcc2827031c59fabb30232ed3e19a720a373caba7f070e1eae436325 - languageName: node - linkType: hard - -"freeport-async@npm:^2.0.0": - version: 2.0.0 - resolution: "freeport-async@npm:2.0.0" - checksum: 03156ab2179fbbf5b7ff3aafc56f3e01c9d7df5cc366fbf3c29f26007773632e33ed90847fa4a979c5412ad55de8b21a7292601c531acaf8957933d96225c76d - languageName: node - linkType: hard - -"fresh@npm:0.5.2": - version: 0.5.2 - resolution: "fresh@npm:0.5.2" - checksum: 13ea8b08f91e669a64e3ba3a20eb79d7ca5379a81f1ff7f4310d54e2320645503cc0c78daedc93dfb6191287295f6479544a649c64d8e41a1c0fb0c221552346 - languageName: node - linkType: hard - -"from@npm:~0": - version: 0.1.7 - resolution: "from@npm:0.1.7" - checksum: b85125b7890489656eb2e4f208f7654a93ec26e3aefaf3bbbcc0d496fc1941e4405834fcc9fe7333192aa2187905510ace70417bbf9ac6f6f4784a731d986939 - languageName: node - linkType: hard - -"fs-constants@npm:^1.0.0": - version: 1.0.0 - resolution: "fs-constants@npm:1.0.0" - checksum: 18f5b718371816155849475ac36c7d0b24d39a11d91348cfcb308b4494824413e03572c403c86d3a260e049465518c4f0d5bd00f0371cdfcad6d4f30a85b350d - languageName: node - linkType: hard - -"fs-exists-sync@npm:^0.1.0": - version: 0.1.0 - resolution: "fs-exists-sync@npm:0.1.0" - checksum: 850a0d6e4c03a7bd2fd25043f77cd9d6be9c3b48bb99308bcfe9c94f3f92f65f2cd3fa036e13a1b0ba7a46d2e58792f53e578f01d75fbdcd56baeb9eed63b705 - languageName: node - linkType: hard - -"fs-extra@npm:11.1.0": - version: 11.1.0 - resolution: "fs-extra@npm:11.1.0" - dependencies: - graceful-fs: ^4.2.0 - jsonfile: ^6.0.1 - universalify: ^2.0.0 - checksum: 5ca476103fa1f5ff4a9b3c4f331548f8a3c1881edaae323a4415d3153b5dc11dc6a981c8d1dd93eec8367ceee27b53f8bd27eecbbf66ffcdd04927510c171e7f - languageName: node - linkType: hard - -"fs-extra@npm:11.2.0, fs-extra@npm:^11.0.0, fs-extra@npm:^11.1.0, fs-extra@npm:^11.2.0": - version: 11.2.0 - resolution: "fs-extra@npm:11.2.0" - dependencies: - graceful-fs: ^4.2.0 - jsonfile: ^6.0.1 - universalify: ^2.0.0 - checksum: b12e42fa40ba47104202f57b8480dd098aa931c2724565e5e70779ab87605665594e76ee5fb00545f772ab9ace167fe06d2ab009c416dc8c842c5ae6df7aa7e8 - languageName: node - linkType: hard - -"fs-extra@npm:9.0.0": - version: 9.0.0 - resolution: "fs-extra@npm:9.0.0" - dependencies: - at-least-node: ^1.0.0 - graceful-fs: ^4.2.0 - jsonfile: ^6.0.1 - universalify: ^1.0.0 - checksum: c4269fbfd8d8d2a1edca4257fa28545caf7e5ad218d264f723c338a154d3624d2ef098c19915b9436d3186b7ac45d5b032371a2004008ec0cd4072512e853aa8 - languageName: node - linkType: hard - -"fs-extra@npm:^10.0.0": - version: 10.1.0 - resolution: "fs-extra@npm:10.1.0" - dependencies: - graceful-fs: ^4.2.0 - jsonfile: ^6.0.1 - universalify: ^2.0.0 - checksum: dc94ab37096f813cc3ca12f0f1b5ad6744dfed9ed21e953d72530d103cea193c2f81584a39e9dee1bea36de5ee66805678c0dddc048e8af1427ac19c00fffc50 - languageName: node - linkType: hard - -"fs-extra@npm:^7.0.0, fs-extra@npm:^7.0.1": - version: 7.0.1 - resolution: "fs-extra@npm:7.0.1" - dependencies: - graceful-fs: ^4.1.2 - jsonfile: ^4.0.0 - universalify: ^0.1.0 - checksum: 141b9dccb23b66a66cefdd81f4cda959ff89282b1d721b98cea19ba08db3dcbe6f862f28841f3cf24bb299e0b7e6c42303908f65093cb7e201708e86ea5a8dcf - languageName: node - linkType: hard - -"fs-extra@npm:^8.0.1, fs-extra@npm:^8.1.0, fs-extra@npm:~8.1.0": - version: 8.1.0 - resolution: "fs-extra@npm:8.1.0" - dependencies: - graceful-fs: ^4.2.0 - jsonfile: ^4.0.0 - universalify: ^0.1.0 - checksum: bf44f0e6cea59d5ce071bba4c43ca76d216f89e402dc6285c128abc0902e9b8525135aa808adad72c9d5d218e9f4bcc63962815529ff2f684ad532172a284880 - languageName: node - linkType: hard - -"fs-extra@npm:^9.0.0, fs-extra@npm:^9.0.1, fs-extra@npm:^9.1.0": - version: 9.1.0 - resolution: "fs-extra@npm:9.1.0" - dependencies: - at-least-node: ^1.0.0 - graceful-fs: ^4.2.0 - jsonfile: ^6.0.1 - universalify: ^2.0.0 - checksum: ba71ba32e0faa74ab931b7a0031d1523c66a73e225de7426e275e238e312d07313d2da2d33e34a52aa406c8763ade5712eb3ec9ba4d9edce652bcacdc29e6b20 - languageName: node - linkType: hard - -"fs-merger@npm:^3.2.1": - version: 3.2.1 - resolution: "fs-merger@npm:3.2.1" - dependencies: - broccoli-node-api: ^1.7.0 - broccoli-node-info: ^2.1.0 - fs-extra: ^8.0.1 - fs-tree-diff: ^2.0.1 - walk-sync: ^2.2.0 - checksum: bfb93b537919407d947ab89c44f6d85f7cb58d1337aaa9115de0bd38178165b158809ad83c4f5d610d42ce0ee2f81ac7ad0ae5b573a69784b676a8a6ce506500 - languageName: node - linkType: hard - -"fs-minipass@npm:^1.2.7": - version: 1.2.7 - resolution: "fs-minipass@npm:1.2.7" - dependencies: - minipass: ^2.6.0 - checksum: 40fd46a2b5dcb74b3a580269f9a0c36f9098c2ebd22cef2e1a004f375b7b665c11f1507ec3f66ee6efab5664109f72d0a74ea19c3370842214c3da5168d6fdd7 - languageName: node - linkType: hard - -"fs-minipass@npm:^2.0.0, fs-minipass@npm:^2.1.0": - version: 2.1.0 - resolution: "fs-minipass@npm:2.1.0" - dependencies: - minipass: ^3.0.0 - checksum: 1b8d128dae2ac6cc94230cc5ead341ba3e0efaef82dab46a33d171c044caaa6ca001364178d42069b2809c35a1c3c35079a32107c770e9ffab3901b59af8c8b1 - languageName: node - linkType: hard - -"fs-minipass@npm:^3.0.0": - version: 3.0.3 - resolution: "fs-minipass@npm:3.0.3" - dependencies: - minipass: ^7.0.3 - checksum: 8722a41109130851d979222d3ec88aabaceeaaf8f57b2a8f744ef8bd2d1ce95453b04a61daa0078822bc5cd21e008814f06fe6586f56fef511e71b8d2394d802 - languageName: node - linkType: hard - -"fs-mkdirp-stream@npm:^1.0.0": - version: 1.0.0 - resolution: "fs-mkdirp-stream@npm:1.0.0" - dependencies: - graceful-fs: ^4.1.11 - through2: ^2.0.3 - checksum: 397c6a699a951bbbb9af1b0e173c9e9c0497501650dd55cb54dd6cad81e80601b6dea86c872600b25295a1502df9e240c86457a0af8c9fea46d2a4d772f73110 - languageName: node - linkType: hard - -"fs-monkey@npm:^1.0.4": - version: 1.0.5 - resolution: "fs-monkey@npm:1.0.5" - checksum: 424b67f65b37fe66117ae2bb061f790fe6d4b609e1d160487c74b3d69fbf42f262c665ccfba32e8b5f113f96f92e9a58fcdebe42d5f6649bdfc72918093a3119 - languageName: node - linkType: hard - -"fs-tree-diff@npm:^2.0.1": - version: 2.0.1 - resolution: "fs-tree-diff@npm:2.0.1" - dependencies: - "@types/symlink-or-copy": ^1.2.0 - heimdalljs-logger: ^0.1.7 - object-assign: ^4.1.0 - path-posix: ^1.0.0 - symlink-or-copy: ^1.1.8 - checksum: ea7927af283b1db3994b98e4c636ed7f8ecfcfb39dc205b57841b22f8ebf39e97649dca07b16ae2e421b000d81b6d96449f32d4dc78742ccb22dfd19db160a45 - languageName: node - linkType: hard - -"fs.realpath@npm:^1.0.0": - version: 1.0.0 - resolution: "fs.realpath@npm:1.0.0" - checksum: 99ddea01a7e75aa276c250a04eedeffe5662bce66c65c07164ad6264f9de18fb21be9433ead460e54cff20e31721c811f4fb5d70591799df5f85dce6d6746fd0 - languageName: node - linkType: hard - -"fsevents@npm:2.3.2": - version: 2.3.2 - resolution: "fsevents@npm:2.3.2" - dependencies: - node-gyp: latest - checksum: 97ade64e75091afee5265e6956cb72ba34db7819b4c3e94c431d4be2b19b8bb7a2d4116da417950c3425f17c8fe693d25e20212cac583ac1521ad066b77ae31f - conditions: os=darwin - languageName: node - linkType: hard - -"fsevents@npm:^2.3.2, fsevents@npm:~2.3.2": - version: 2.3.3 - resolution: "fsevents@npm:2.3.3" - dependencies: - node-gyp: latest - checksum: 11e6ea6fea15e42461fc55b4b0e4a0a3c654faa567f1877dbd353f39156f69def97a69936d1746619d656c4b93de2238bf731f6085a03a50cabf287c9d024317 - conditions: os=darwin - languageName: node - linkType: hard - -"fsevents@patch:fsevents@2.3.2#~builtin": - version: 2.3.2 - resolution: "fsevents@patch:fsevents@npm%3A2.3.2#~builtin::version=2.3.2&hash=18f3a7" - dependencies: - node-gyp: latest - conditions: os=darwin - languageName: node - linkType: hard - -"fsevents@patch:fsevents@^2.3.2#~builtin, fsevents@patch:fsevents@~2.3.2#~builtin": - version: 2.3.3 - resolution: "fsevents@patch:fsevents@npm%3A2.3.3#~builtin::version=2.3.3&hash=18f3a7" - dependencies: - node-gyp: latest - conditions: os=darwin - languageName: node - linkType: hard - -"fsm-iterator@npm:^1.1.0": - version: 1.1.0 - resolution: "fsm-iterator@npm:1.1.0" - checksum: ca35f89a6607df2542711faac62b4b9fdd1c90887bd7fbb0ed106d0d658a92376e996bdfc6db605665e25a63c510e5ea5986d054e3836becf95696ee928b0f6b - languageName: node - linkType: hard - -"function-bind@npm:^1.1.1, function-bind@npm:^1.1.2": - version: 1.1.2 - resolution: "function-bind@npm:1.1.2" - checksum: 2b0ff4ce708d99715ad14a6d1f894e2a83242e4a52ccfcefaee5e40050562e5f6dafc1adbb4ce2d4ab47279a45dc736ab91ea5042d843c3c092820dfe032efb1 - languageName: node - linkType: hard - -"function.prototype.name@npm:^1.1.5, function.prototype.name@npm:^1.1.6": - version: 1.1.6 - resolution: "function.prototype.name@npm:1.1.6" - dependencies: - call-bind: ^1.0.2 - define-properties: ^1.2.0 - es-abstract: ^1.22.1 - functions-have-names: ^1.2.3 - checksum: 7a3f9bd98adab09a07f6e1f03da03d3f7c26abbdeaeee15223f6c04a9fb5674792bdf5e689dac19b97ac71de6aad2027ba3048a9b883aa1b3173eed6ab07f479 - languageName: node - linkType: hard - -"functions-have-names@npm:^1.2.3": - version: 1.2.3 - resolution: "functions-have-names@npm:1.2.3" - checksum: c3f1f5ba20f4e962efb71344ce0a40722163e85bee2101ce25f88214e78182d2d2476aa85ef37950c579eb6cf6ee811c17b3101bb84004bb75655f3e33f3fdb5 - languageName: node - linkType: hard - -"fuse.js@npm:6.5.3": - version: 6.5.3 - resolution: "fuse.js@npm:6.5.3" - checksum: f7c14f4422000e7f7e3515c66f7cefdfc38adec4cf380097f4146a201ea438af60b67dc5849b3c0de0115ce3f9bc5afad6fc6570c08dcfcef5bf6e95eb8e6d6f - languageName: node - linkType: hard - -"fuse.js@npm:^7.0.0": - version: 7.0.0 - resolution: "fuse.js@npm:7.0.0" - checksum: d15750efec1808370c0cae92ec9473aa7261c59bca1f15f1cf60039ba6f804b8f95340b5cabd83a4ef55839c1034764856e0128e443921f072aa0d8a20e4cacf - languageName: node - linkType: hard - -"futoin-hkdf@npm:^1.5.3": - version: 1.5.3 - resolution: "futoin-hkdf@npm:1.5.3" - checksum: 790da5675b31df4b9a34c19a5181f673171b5ad81fa92b91981bcfd2250692f895d6aada5ae4203212babba3c7d7a1916432e0b42c7aa88d3f70408439ec315e - languageName: node - linkType: hard - -"fuzzy@npm:^0.1.3": - version: 0.1.3 - resolution: "fuzzy@npm:0.1.3" - checksum: acc09c6173e12d5dc8ae51857551ddbe834befa9ebc6be6d5581d09117265d704809d80407d220fd0652f347a9975a4d106854cacc8bd031487a0ede86982f84 - languageName: node - linkType: hard - -"gauge@npm:^4.0.3": - version: 4.0.4 - resolution: "gauge@npm:4.0.4" - dependencies: - aproba: ^1.0.3 || ^2.0.0 - color-support: ^1.1.3 - console-control-strings: ^1.1.0 - has-unicode: ^2.0.1 - signal-exit: ^3.0.7 - string-width: ^4.2.3 - strip-ansi: ^6.0.1 - wide-align: ^1.1.5 - checksum: 788b6bfe52f1dd8e263cda800c26ac0ca2ff6de0b6eee2fe0d9e3abf15e149b651bd27bf5226be10e6e3edb5c4e5d5985a5a1a98137e7a892f75eff76467ad2d - languageName: node - linkType: hard - -"gauge@npm:~2.7.3": - version: 2.7.4 - resolution: "gauge@npm:2.7.4" - dependencies: - aproba: ^1.0.3 - console-control-strings: ^1.0.0 - has-unicode: ^2.0.0 - object-assign: ^4.1.0 - signal-exit: ^3.0.0 - string-width: ^1.0.1 - strip-ansi: ^3.0.1 - wide-align: ^1.1.0 - checksum: a89b53cee65579b46832e050b5f3a79a832cc422c190de79c6b8e2e15296ab92faddde6ddf2d376875cbba2b043efa99b9e1ed8124e7365f61b04e3cee9d40ee - languageName: node - linkType: hard - -"gaxios@npm:^5.0.0, gaxios@npm:^5.0.1": - version: 5.1.3 - resolution: "gaxios@npm:5.1.3" - dependencies: - extend: ^3.0.2 - https-proxy-agent: ^5.0.0 - is-stream: ^2.0.0 - node-fetch: ^2.6.9 - checksum: 1cf72697715c64f6db1d6fa6e9243bb57ee14b0c758338a33790ecac2675d819a1fc0c51b2fab312d9bfe8201cc981c171b70ff60adcaaec881c5bc5610c42f1 - languageName: node - linkType: hard - -"gaxios@npm:^6.0.0, gaxios@npm:^6.1.1": - version: 6.7.0 - resolution: "gaxios@npm:6.7.0" - dependencies: - extend: ^3.0.2 - https-proxy-agent: ^7.0.1 - is-stream: ^2.0.0 - node-fetch: ^2.6.9 - uuid: ^10.0.0 - checksum: 7316ea45cb1fc84d2725d675a6f23fc68c5dfa53b437b89c2596e3219a1bf32ee48f57242b670ebad515c9644d45cc7b2b7ef9063fa50a86de54e1a5a6433999 - languageName: node - linkType: hard - -"gcp-metadata@npm:^5.3.0": - version: 5.3.0 - resolution: "gcp-metadata@npm:5.3.0" - dependencies: - gaxios: ^5.0.0 - json-bigint: ^1.0.0 - checksum: 891ea0b902a17f33d7bae753830d23962b63af94ed071092c30496e7d26f8128ba9af43c3d38474bea29cb32a884b4bcb5720ce8b9de4a7e1108475d3d7ae219 - languageName: node - linkType: hard - -"gcp-metadata@npm:^6.0.0, gcp-metadata@npm:^6.1.0": - version: 6.1.0 - resolution: "gcp-metadata@npm:6.1.0" - dependencies: - gaxios: ^6.0.0 - json-bigint: ^1.0.0 - checksum: 55de8ae4a6b7664379a093abf7e758ae06e82f244d41bd58d881a470bf34db94c4067ce9e1b425d9455b7705636d5f8baad844e49bb73879c338753ba7785b2b - languageName: node - linkType: hard - -"gensync@npm:^1.0.0-beta.2": - version: 1.0.0-beta.2 - resolution: "gensync@npm:1.0.0-beta.2" - checksum: a7437e58c6be12aa6c90f7730eac7fa9833dc78872b4ad2963d2031b00a3367a93f98aec75f9aaac7220848e4026d67a8655e870b24f20a543d103c0d65952ec - languageName: node - linkType: hard - -"get-amd-module-type@npm:^3.0.0": - version: 3.0.2 - resolution: "get-amd-module-type@npm:3.0.2" - dependencies: - ast-module-types: ^3.0.0 - node-source-walk: ^4.2.2 - checksum: d16fac5037f63027992e6ebd2d642e6d4feef2f8fa71ff3da6aa76006e05b3dcd4aa6044b4c5966f13ba5d412fd7c1367d910df86b58f9c13f53cbb35d2e4b72 - languageName: node - linkType: hard - -"get-amd-module-type@npm:^4.1.0": - version: 4.1.0 - resolution: "get-amd-module-type@npm:4.1.0" - dependencies: - ast-module-types: ^4.0.0 - node-source-walk: ^5.0.1 - checksum: dd3f58e88efb6a2224bb38325fe21b1ab417ba105b7f90d49089141b0eb3c24aab1866a2e2bf370430bbfc7ef226fc0a2a5c657e161d1d42d8a243f44ebd4fbe - languageName: node - linkType: hard - -"get-caller-file@npm:^2.0.1, get-caller-file@npm:^2.0.5": - version: 2.0.5 - resolution: "get-caller-file@npm:2.0.5" - checksum: b9769a836d2a98c3ee734a88ba712e62703f1df31b94b784762c433c27a386dd6029ff55c2a920c392e33657d80191edbf18c61487e198844844516f843496b9 - languageName: node - linkType: hard - -"get-graphql-schema@npm:2.1.2": - version: 2.1.2 - resolution: "get-graphql-schema@npm:2.1.2" - dependencies: - chalk: ^2.4.1 - graphql: ^14.0.2 - minimist: ^1.2.0 - node-fetch: ^2.2.0 - bin: - get-graphql-schema: dist/index.js - checksum: 2e299841d4eb34aeb25aa158cefacf343606e14c49cc9a36a2beb14f8d2f6486350024d276c76c115c4ad27c49e96b07c4f955a12e9a035582f25cba13419152 - languageName: node - linkType: hard - -"get-intrinsic@npm:^1.1.1, get-intrinsic@npm:^1.1.3, get-intrinsic@npm:^1.2.1, get-intrinsic@npm:^1.2.3, get-intrinsic@npm:^1.2.4": - version: 1.2.4 - resolution: "get-intrinsic@npm:1.2.4" - dependencies: - es-errors: ^1.3.0 - function-bind: ^1.1.2 - has-proto: ^1.0.1 - has-symbols: ^1.0.3 - hasown: ^2.0.0 - checksum: 414e3cdf2c203d1b9d7d33111df746a4512a1aa622770b361dadddf8ed0b5aeb26c560f49ca077e24bfafb0acb55ca908d1f709216ccba33ffc548ec8a79a951 - languageName: node - linkType: hard - -"get-nonce@npm:^1.0.0": - version: 1.0.1 - resolution: "get-nonce@npm:1.0.1" - checksum: e2614e43b4694c78277bb61b0f04583d45786881289285c73770b07ded246a98be7e1f78b940c80cbe6f2b07f55f0b724e6db6fd6f1bcbd1e8bdac16521074ed - languageName: node - linkType: hard - -"get-own-enumerable-property-symbols@npm:^3.0.0": - version: 3.0.2 - resolution: "get-own-enumerable-property-symbols@npm:3.0.2" - checksum: 8f0331f14159f939830884799f937343c8c0a2c330506094bc12cbee3665d88337fe97a4ea35c002cc2bdba0f5d9975ad7ec3abb925015cdf2a93e76d4759ede - languageName: node - linkType: hard - -"get-package-type@npm:^0.1.0": - version: 0.1.0 - resolution: "get-package-type@npm:0.1.0" - checksum: bba0811116d11e56d702682ddef7c73ba3481f114590e705fc549f4d868972263896af313c57a25c076e3c0d567e11d919a64ba1b30c879be985fc9d44f96148 - languageName: node - linkType: hard - -"get-port-please@npm:^3.1.2": - version: 3.1.2 - resolution: "get-port-please@npm:3.1.2" - checksum: 8e65b56459ead2f31c446d76bb8eb639c33e04e72b07a4dd5d8acc39738f12962591e90b2befecf10492844d0d11c2122c281f5204ee48692d4a8ba0ec68733a - languageName: node - linkType: hard - -"get-port@npm:^3.2.0": - version: 3.2.0 - resolution: "get-port@npm:3.2.0" - checksum: 31f530326569683ac4b7452eb7573c40e9dbe52aec14d80745c35475261e6389160da153d5b8ae911150b4ce99003472b30c69ba5be0cedeaa7865b95542d168 - languageName: node - linkType: hard - -"get-source@npm:^2.0.12": - version: 2.0.12 - resolution: "get-source@npm:2.0.12" - dependencies: - data-uri-to-buffer: ^2.0.0 - source-map: ^0.6.1 - checksum: c73368fee709594ba38682ec1a96872aac6f7d766396019611d3d2358b68186a7847765a773ea0db088c42781126cc6bc09e4b87f263951c74dae5dcea50ad42 - languageName: node - linkType: hard - -"get-stdin@npm:^6.0.0": - version: 6.0.0 - resolution: "get-stdin@npm:6.0.0" - checksum: 593f6fb4fff4c8d49ec93a07c430c1edc6bd4fe7e429d222b5da2f367276a98809af9e90467ad88a2d83722ff95b9b35bbaba02b56801421c5e3668173fe12b4 - languageName: node - linkType: hard - -"get-stream@npm:^3.0.0": - version: 3.0.0 - resolution: "get-stream@npm:3.0.0" - checksum: 36142f46005ed74ce3a45c55545ec4e7da8e243554179e345a786baf144e5c4a35fb7bdc49fadfa9f18bd08000589b6fe364abdadfc4e1eb0e1b9914a6bb9c56 - languageName: node - linkType: hard - -"get-stream@npm:^4.0.0, get-stream@npm:^4.1.0": - version: 4.1.0 - resolution: "get-stream@npm:4.1.0" - dependencies: - pump: ^3.0.0 - checksum: 443e1914170c15bd52ff8ea6eff6dfc6d712b031303e36302d2778e3de2506af9ee964d6124010f7818736dcfde05c04ba7ca6cc26883106e084357a17ae7d73 - languageName: node - linkType: hard - -"get-stream@npm:^5.0.0, get-stream@npm:^5.1.0": - version: 5.2.0 - resolution: "get-stream@npm:5.2.0" - dependencies: - pump: ^3.0.0 - checksum: 8bc1a23174a06b2b4ce600df38d6c98d2ef6d84e020c1ddad632ad75bac4e092eeb40e4c09e0761c35fc2dbc5e7fff5dab5e763a383582c4a167dd69a905bd12 - languageName: node - linkType: hard - -"get-stream@npm:^6.0.0, get-stream@npm:^6.0.1": - version: 6.0.1 - resolution: "get-stream@npm:6.0.1" - checksum: e04ecece32c92eebf5b8c940f51468cd53554dcbb0ea725b2748be583c9523d00128137966afce410b9b051eb2ef16d657cd2b120ca8edafcf5a65e81af63cad - languageName: node - linkType: hard - -"get-stream@npm:^8.0.1": - version: 8.0.1 - resolution: "get-stream@npm:8.0.1" - checksum: 01e3d3cf29e1393f05f44d2f00445c5f9ec3d1c49e8179b31795484b9c117f4c695e5e07b88b50785d5c8248a788c85d9913a79266fc77e3ef11f78f10f1b974 - languageName: node - linkType: hard - -"get-symbol-description@npm:^1.0.2": - version: 1.0.2 - resolution: "get-symbol-description@npm:1.0.2" - dependencies: - call-bind: ^1.0.5 - es-errors: ^1.3.0 - get-intrinsic: ^1.2.4 - checksum: e1cb53bc211f9dbe9691a4f97a46837a553c4e7caadd0488dc24ac694db8a390b93edd412b48dcdd0b4bbb4c595de1709effc75fc87c0839deedc6968f5bd973 - languageName: node - linkType: hard - -"get-tsconfig@npm:^4.6.2, get-tsconfig@npm:^4.7.0, get-tsconfig@npm:^4.7.5": - version: 4.8.1 - resolution: "get-tsconfig@npm:4.8.1" - dependencies: - resolve-pkg-maps: ^1.0.0 - checksum: 12df01672e691d2ff6db8cf7fed1ddfef90ed94a5f3d822c63c147a26742026d582acd86afcd6f65db67d809625d17dd7f9d34f4d3f38f69bc2f48e19b2bdd5b - languageName: node - linkType: hard - -"get-uri@npm:^6.0.1": - version: 6.0.3 - resolution: "get-uri@npm:6.0.3" - dependencies: - basic-ftp: ^5.0.2 - data-uri-to-buffer: ^6.0.2 - debug: ^4.3.4 - fs-extra: ^11.2.0 - checksum: 3eda448a59fa1ba82ad4f252e58490fec586b644f2dc9c98ba3ab20e801ecc8a1bc1784829c474c9d188edb633d4dfd81c33894ca6117a33a16e8e013b41b40f - languageName: node - linkType: hard - -"getenv@npm:^1.0.0": - version: 1.0.0 - resolution: "getenv@npm:1.0.0" - checksum: 19ae5cad603a1cf1bcb8fa3bed48e00d062eb0572a4404c02334b67f3b3499f238383082b064bb42515e9e25c2b08aef1a3e3d2b6852347721aa8b174825bd56 - languageName: node - linkType: hard - -"getos@npm:^3.2.1": - version: 3.2.1 - resolution: "getos@npm:3.2.1" - dependencies: - async: ^3.2.0 - checksum: 42fd78a66d47cebd3e09de5566cc0044e034b08f4a000a310dbd89a77b02c65d8f4002554bfa495ea5bdc4fa9d515f5ac785a7cc474ba45383cc697f865eeaf1 - languageName: node - linkType: hard - -"getpass@npm:^0.1.1": - version: 0.1.7 - resolution: "getpass@npm:0.1.7" - dependencies: - assert-plus: ^1.0.0 - checksum: ab18d55661db264e3eac6012c2d3daeafaab7a501c035ae0ccb193c3c23e9849c6e29b6ac762b9c2adae460266f925d55a3a2a3a3c8b94be2f222df94d70c046 - languageName: node - linkType: hard - -"gifwrap@npm:^0.9.2": - version: 0.9.4 - resolution: "gifwrap@npm:0.9.4" - dependencies: - image-q: ^4.0.0 - omggif: ^1.0.10 - checksum: f06d74d72d5fd5cfef78935471da06334c23305328fcaa5b1740c6c93b7ce7f775c28e75e166ecb4d7bc9848f767d4d191c8e18a74187543076a44123002f918 - languageName: node - linkType: hard - -"git-config-path@npm:^1.0.1": - version: 1.0.1 - resolution: "git-config-path@npm:1.0.1" - dependencies: - extend-shallow: ^2.0.1 - fs-exists-sync: ^0.1.0 - homedir-polyfill: ^1.0.0 - checksum: 13fda02984fa60122cd8ce3f61c63ca427aa41c35a88fe1ba91c508f9245da726d48eaa6a0158acd308b0271759b19dd922d6e8c0b069dc882bf8edc41aecaea - languageName: node - linkType: hard - -"git-raw-commits@npm:^2.0.0": - version: 2.0.11 - resolution: "git-raw-commits@npm:2.0.11" - dependencies: - dargs: ^7.0.0 - lodash: ^4.17.15 - meow: ^8.0.0 - split2: ^3.0.0 - through2: ^4.0.0 - bin: - git-raw-commits: cli.js - checksum: c178af43633684106179793b6e3473e1d2bb50bb41d04e2e285ea4eef342ca4090fee6bc8a737552fde879d22346c90de5c49f18c719a0f38d4c934f258a0f79 - languageName: node - linkType: hard - -"github-from-package@npm:0.0.0": - version: 0.0.0 - resolution: "github-from-package@npm:0.0.0" - checksum: 14e448192a35c1e42efee94c9d01a10f42fe790375891a24b25261246ce9336ab9df5d274585aedd4568f7922246c2a78b8a8cd2571bfe99c693a9718e7dd0e3 - languageName: node - linkType: hard - -"glob-parent@npm:^3.1.0": - version: 3.1.0 - resolution: "glob-parent@npm:3.1.0" - dependencies: - is-glob: ^3.1.0 - path-dirname: ^1.0.0 - checksum: 653d559237e89a11b9934bef3f392ec42335602034c928590544d383ff5ef449f7b12f3cfa539708e74bc0a6c28ab1fe51d663cc07463cdf899ba92afd85a855 - languageName: node - linkType: hard - -"glob-parent@npm:^5.1.2, glob-parent@npm:~5.1.2": - version: 5.1.2 - resolution: "glob-parent@npm:5.1.2" - dependencies: - is-glob: ^4.0.1 - checksum: f4f2bfe2425296e8a47e36864e4f42be38a996db40420fe434565e4480e3322f18eb37589617a98640c5dc8fdec1a387007ee18dbb1f3f5553409c34d17f425e - languageName: node - linkType: hard - -"glob-parent@npm:^6.0.1, glob-parent@npm:^6.0.2": - version: 6.0.2 - resolution: "glob-parent@npm:6.0.2" - dependencies: - is-glob: ^4.0.3 - checksum: c13ee97978bef4f55106b71e66428eb1512e71a7466ba49025fc2aec59a5bfb0954d5abd58fc5ee6c9b076eef4e1f6d3375c2e964b88466ca390da4419a786a8 - languageName: node - linkType: hard - -"glob-stream@npm:^6.1.0": - version: 6.1.0 - resolution: "glob-stream@npm:6.1.0" - dependencies: - extend: ^3.0.0 - glob: ^7.1.1 - glob-parent: ^3.1.0 - is-negated-glob: ^1.0.0 - ordered-read-streams: ^1.0.0 - pumpify: ^1.3.5 - readable-stream: ^2.1.5 - remove-trailing-separator: ^1.0.1 - to-absolute-glob: ^2.0.0 - unique-stream: ^2.0.2 - checksum: 7c9ec7be266974186b762ad686813025868067f2ea64a0428c0365b4046cb955d328b1e7498124392ec0026c5826ce2cfa4b41614584fb63edd02421e61db556 - languageName: node - linkType: hard - -"glob-to-regexp@npm:^0.4.1": - version: 0.4.1 - resolution: "glob-to-regexp@npm:0.4.1" - checksum: e795f4e8f06d2a15e86f76e4d92751cf8bbfcf0157cea5c2f0f35678a8195a750b34096b1256e436f0cebc1883b5ff0888c47348443e69546a5a87f9e1eb1167 - languageName: node - linkType: hard - -"glob@npm:7.1.4": - version: 7.1.4 - resolution: "glob@npm:7.1.4" - dependencies: - fs.realpath: ^1.0.0 - inflight: ^1.0.4 - inherits: 2 - minimatch: ^3.0.4 - once: ^1.3.0 - path-is-absolute: ^1.0.0 - checksum: f52480fc82b1e66e52990f0f2e7306447d12294c83fbbee0395e761ad1178172012a7cc0673dbf4810baac400fc09bf34484c08b5778c216403fd823db281716 - languageName: node - linkType: hard - -"glob@npm:7.1.6": - version: 7.1.6 - resolution: "glob@npm:7.1.6" - dependencies: - fs.realpath: ^1.0.0 - inflight: ^1.0.4 - inherits: 2 - minimatch: ^3.0.4 - once: ^1.3.0 - path-is-absolute: ^1.0.0 - checksum: 351d549dd90553b87c2d3f90ce11aed9e1093c74130440e7ae0592e11bbcd2ce7f0ebb8ba6bfe63aaf9b62166a7f4c80cb84490ae5d78408bb2572bf7d4ee0a6 - languageName: node - linkType: hard - -"glob@npm:7.2.0": - version: 7.2.0 - resolution: "glob@npm:7.2.0" - dependencies: - fs.realpath: ^1.0.0 - inflight: ^1.0.4 - inherits: 2 - minimatch: ^3.0.4 - once: ^1.3.0 - path-is-absolute: ^1.0.0 - checksum: 78a8ea942331f08ed2e055cb5b9e40fe6f46f579d7fd3d694f3412fe5db23223d29b7fee1575440202e9a7ff9a72ab106a39fee39934c7bedafe5e5f8ae20134 - languageName: node - linkType: hard - -"glob@npm:8.1.0, glob@npm:^8.0.1, glob@npm:^8.0.3": - version: 8.1.0 - resolution: "glob@npm:8.1.0" - dependencies: - fs.realpath: ^1.0.0 - inflight: ^1.0.4 - inherits: 2 - minimatch: ^5.0.1 - once: ^1.3.0 - checksum: 92fbea3221a7d12075f26f0227abac435de868dd0736a17170663783296d0dd8d3d532a5672b4488a439bf5d7fb85cdd07c11185d6cd39184f0385cbdfb86a47 - languageName: node - linkType: hard - -"glob@npm:^10.2.2, glob@npm:^10.3.10, glob@npm:^10.4.2": - version: 10.4.5 - resolution: "glob@npm:10.4.5" - dependencies: - foreground-child: ^3.1.0 - jackspeak: ^3.1.2 - minimatch: ^9.0.4 - minipass: ^7.1.2 - package-json-from-dist: ^1.0.0 - path-scurry: ^1.11.1 - bin: - glob: dist/esm/bin.mjs - checksum: 0bc725de5e4862f9f387fd0f2b274baf16850dcd2714502ccf471ee401803997983e2c05590cb65f9675a3c6f2a58e7a53f9e365704108c6ad3cbf1d60934c4a - languageName: node - linkType: hard - -"glob@npm:^6.0.1": - version: 6.0.4 - resolution: "glob@npm:6.0.4" - dependencies: - inflight: ^1.0.4 - inherits: 2 - minimatch: 2 || 3 - once: ^1.3.0 - path-is-absolute: ^1.0.0 - checksum: c4946c3d015ac81f704d185f2b3a55eb670100693c2cf7bc833d0efd970ec727d860d4839a5178e46a7e594b34a34661bae2f4c3405727c9fd189f84954ca3c0 - languageName: node - linkType: hard - -"glob@npm:^7.0.0, glob@npm:^7.0.3, glob@npm:^7.1.1, glob@npm:^7.1.3, glob@npm:^7.1.4, glob@npm:^7.1.6, glob@npm:^7.1.7": - version: 7.2.3 - resolution: "glob@npm:7.2.3" - dependencies: - fs.realpath: ^1.0.0 - inflight: ^1.0.4 - inherits: 2 - minimatch: ^3.1.1 - once: ^1.3.0 - path-is-absolute: ^1.0.0 - checksum: 29452e97b38fa704dabb1d1045350fb2467cf0277e155aa9ff7077e90ad81d1ea9d53d3ee63bd37c05b09a065e90f16aec4a65f5b8de401d1dac40bc5605d133 - languageName: node - linkType: hard - -"global-agent@npm:^3.0.0": - version: 3.0.0 - resolution: "global-agent@npm:3.0.0" - dependencies: - boolean: ^3.0.1 - es6-error: ^4.1.1 - matcher: ^3.0.0 - roarr: ^2.15.3 - semver: ^7.3.2 - serialize-error: ^7.0.1 - checksum: 75074d80733b4bd5386c47f5df028e798018025beac0ab310e9908c72bf5639e408203e7bca0130d5ee01b5f4abc6d34385d96a9f950ea5fe1979bb431c808f7 - languageName: node - linkType: hard - -"global-dirs@npm:^0.1.0, global-dirs@npm:^0.1.1": - version: 0.1.1 - resolution: "global-dirs@npm:0.1.1" - dependencies: - ini: ^1.3.4 - checksum: 10624f5a8ddb8634c22804c6b24f93fb591c3639a6bc78e3584e01a238fc6f7b7965824184e57d63f6df36980b6c191484ad7bc6c35a1599b8f1d64be64c2a4a - languageName: node - linkType: hard - -"global-dirs@npm:^3.0.0": - version: 3.0.1 - resolution: "global-dirs@npm:3.0.1" - dependencies: - ini: 2.0.0 - checksum: 70147b80261601fd40ac02a104581432325c1c47329706acd773f3a6ce99bb36d1d996038c85ccacd482ad22258ec233c586b6a91535b1a116b89663d49d6438 - languageName: node - linkType: hard - -"global-modules@npm:^1.0.0": - version: 1.0.0 - resolution: "global-modules@npm:1.0.0" - dependencies: - global-prefix: ^1.0.1 - is-windows: ^1.0.1 - resolve-dir: ^1.0.0 - checksum: 10be68796c1e1abc1e2ba87ec4ea507f5629873b119ab0cd29c07284ef2b930f1402d10df01beccb7391dedd9cd479611dd6a24311c71be58937beaf18edf85e - languageName: node - linkType: hard - -"global-modules@npm:^2.0.0": - version: 2.0.0 - resolution: "global-modules@npm:2.0.0" - dependencies: - global-prefix: ^3.0.0 - checksum: d6197f25856c878c2fb5f038899f2dca7cbb2f7b7cf8999660c0104972d5cfa5c68b5a0a77fa8206bb536c3903a4615665acb9709b4d80846e1bb47eaef65430 - languageName: node - linkType: hard - -"global-prefix@npm:^1.0.1": - version: 1.0.2 - resolution: "global-prefix@npm:1.0.2" - dependencies: - expand-tilde: ^2.0.2 - homedir-polyfill: ^1.0.1 - ini: ^1.3.4 - is-windows: ^1.0.1 - which: ^1.2.14 - checksum: 061b43470fe498271bcd514e7746e8a8535032b17ab9570517014ae27d700ff0dca749f76bbde13ba384d185be4310d8ba5712cb0e74f7d54d59390db63dd9a0 - languageName: node - linkType: hard - -"global-prefix@npm:^3.0.0": - version: 3.0.0 - resolution: "global-prefix@npm:3.0.0" - dependencies: - ini: ^1.3.5 - kind-of: ^6.0.2 - which: ^1.3.1 - checksum: 8a82fc1d6f22c45484a4e34656cc91bf021a03e03213b0035098d605bfc612d7141f1e14a21097e8a0413b4884afd5b260df0b6a25605ce9d722e11f1df2881d - languageName: node - linkType: hard - -"global@npm:~4.4.0": - version: 4.4.0 - resolution: "global@npm:4.4.0" - dependencies: - min-document: ^2.19.0 - process: ^0.11.10 - checksum: 9c057557c8f5a5bcfbeb9378ba4fe2255d04679452be504608dd5f13b54edf79f7be1db1031ea06a4ec6edd3b9f5f17d2d172fb47e6c69dae57fd84b7e72b77f - languageName: node - linkType: hard - -"globals@npm:^11.1.0": - version: 11.12.0 - resolution: "globals@npm:11.12.0" - checksum: 67051a45eca3db904aee189dfc7cd53c20c7d881679c93f6146ddd4c9f4ab2268e68a919df740d39c71f4445d2b38ee360fc234428baea1dbdfe68bbcb46979e - languageName: node - linkType: hard - -"globals@npm:^13.0.0, globals@npm:^13.19.0, globals@npm:^13.20.0": - version: 13.24.0 - resolution: "globals@npm:13.24.0" - dependencies: - type-fest: ^0.20.2 - checksum: 56066ef058f6867c04ff203b8a44c15b038346a62efbc3060052a1016be9f56f4cf0b2cd45b74b22b81e521a889fc7786c73691b0549c2f3a6e825b3d394f43c - languageName: node - linkType: hard - -"globalthis@npm:^1.0.1, globalthis@npm:^1.0.3, globalthis@npm:^1.0.4": - version: 1.0.4 - resolution: "globalthis@npm:1.0.4" - dependencies: - define-properties: ^1.2.1 - gopd: ^1.0.1 - checksum: 39ad667ad9f01476474633a1834a70842041f70a55571e8dcef5fb957980a92da5022db5430fca8aecc5d47704ae30618c0bc877a579c70710c904e9ef06108a - languageName: node - linkType: hard - -"globby@npm:^11.0.0, globby@npm:^11.0.1, globby@npm:^11.0.3, globby@npm:^11.0.4, globby@npm:^11.1.0": - version: 11.1.0 - resolution: "globby@npm:11.1.0" - dependencies: - array-union: ^2.1.0 - dir-glob: ^3.0.1 - fast-glob: ^3.2.9 - ignore: ^5.2.0 - merge2: ^1.4.1 - slash: ^3.0.0 - checksum: b4be8885e0cfa018fc783792942d53926c35c50b3aefd3fdcfb9d22c627639dc26bd2327a40a0b74b074100ce95bb7187bfeae2f236856aa3de183af7a02aea6 - languageName: node - linkType: hard - -"globby@npm:^13.1.1, globby@npm:^13.1.4": - version: 13.2.2 - resolution: "globby@npm:13.2.2" - dependencies: - dir-glob: ^3.0.1 - fast-glob: ^3.3.0 - ignore: ^5.2.4 - merge2: ^1.4.1 - slash: ^4.0.0 - checksum: f3d84ced58a901b4fcc29c846983108c426631fe47e94872868b65565495f7bee7b3defd68923bd480582771fd4bbe819217803a164a618ad76f1d22f666f41e - languageName: node - linkType: hard - -"globby@npm:^6.1.0": - version: 6.1.0 - resolution: "globby@npm:6.1.0" - dependencies: - array-union: ^1.0.1 - glob: ^7.0.3 - object-assign: ^4.0.1 - pify: ^2.0.0 - pinkie-promise: ^2.0.0 - checksum: 18109d6b9d55643d2b98b59c3cfae7073ccfe39829632f353d516cc124d836c2ddebe48a23f04af63d66a621b6d86dd4cbd7e6af906f2458a7fe510ffc4bd424 - languageName: node - linkType: hard - -"gonzales-pe@npm:^4.2.3, gonzales-pe@npm:^4.3.0": - version: 4.3.0 - resolution: "gonzales-pe@npm:4.3.0" - dependencies: - minimist: ^1.2.5 - bin: - gonzales: bin/gonzales.js - checksum: 49d60fc49ad35639e5d55923c1516d3ec2e4de5e6e5913ec3458a479b66623e54a060d568295349b0bb9f96ee970c473ff984d4b82a5cfeaf736c55f0d6dc3b7 - languageName: node - linkType: hard - -"google-auth-library@npm:^8.9.0": - version: 8.9.0 - resolution: "google-auth-library@npm:8.9.0" - dependencies: - arrify: ^2.0.0 - base64-js: ^1.3.0 - ecdsa-sig-formatter: ^1.0.11 - fast-text-encoding: ^1.0.0 - gaxios: ^5.0.0 - gcp-metadata: ^5.3.0 - gtoken: ^6.1.0 - jws: ^4.0.0 - lru-cache: ^6.0.0 - checksum: 8e0bc5f1e91804523786413bf4358e4c5ad94b1e873c725ddd03d0f1c242e2b38e26352c0f375334fbc1d94110f761b304aa0429de49b4a27ebc3875a5b56644 - languageName: node - linkType: hard - -"google-auth-library@npm:^9.0.0, google-auth-library@npm:^9.3.0": - version: 9.11.0 - resolution: "google-auth-library@npm:9.11.0" - dependencies: - base64-js: ^1.3.0 - ecdsa-sig-formatter: ^1.0.11 - gaxios: ^6.1.1 - gcp-metadata: ^6.1.0 - gtoken: ^7.0.0 - jws: ^4.0.0 - checksum: 984d344b5e0a21ea1e097d06e27173035619c0e8f89a363e538b445adb1414b79e938b56b4432aa36fda074c5922fa6a34f9b64734765c01dff73c45c8568554 - languageName: node - linkType: hard - -"google-gax@npm:^4.0.3": - version: 4.3.8 - resolution: "google-gax@npm:4.3.8" - dependencies: - "@grpc/grpc-js": ^1.10.9 - "@grpc/proto-loader": ^0.7.13 - "@types/long": ^4.0.0 - abort-controller: ^3.0.0 - duplexify: ^4.0.0 - google-auth-library: ^9.3.0 - node-fetch: ^2.6.1 - object-hash: ^3.0.0 - proto3-json-serializer: ^2.0.2 - protobufjs: ^7.3.2 - retry-request: ^7.0.0 - uuid: ^9.0.1 - checksum: e6a6946645d3290bf04c2815d091037ff24ef41bd3f8d9eaab802c82adc86b05fe665dc36181a79972292350a01a5e203e0f42dfa3498bf084caee99a16a8207 - languageName: node - linkType: hard - -"google-p12-pem@npm:^4.0.0": - version: 4.0.1 - resolution: "google-p12-pem@npm:4.0.1" - dependencies: - node-forge: ^1.3.1 - bin: - gp12-pem: build/src/bin/gp12-pem.js - checksum: 59a5026331ea67455672e83770da29f09d979f02e06cb2227ea5916f8cca437887c2d3869f2602a686dc84437886ae9d2ac010780803cbe8e5f161c2d02d8efd - languageName: node - linkType: hard - -"gopd@npm:^1.0.1": - version: 1.0.1 - resolution: "gopd@npm:1.0.1" - dependencies: - get-intrinsic: ^1.1.3 - checksum: a5ccfb8806e0917a94e0b3de2af2ea4979c1da920bc381667c260e00e7cafdbe844e2cb9c5bcfef4e5412e8bf73bab837285bc35c7ba73aaaf0134d4583393a6 - languageName: node - linkType: hard - -"got@npm:^11.1.4, got@npm:^11.8.5": - version: 11.8.6 - resolution: "got@npm:11.8.6" - dependencies: - "@sindresorhus/is": ^4.0.0 - "@szmarczak/http-timer": ^4.0.5 - "@types/cacheable-request": ^6.0.1 - "@types/responselike": ^1.0.0 - cacheable-lookup: ^5.0.3 - cacheable-request: ^7.0.2 - decompress-response: ^6.0.0 - http2-wrapper: ^1.0.0-beta.5.2 - lowercase-keys: ^2.0.0 - p-cancelable: ^2.0.0 - responselike: ^2.0.0 - checksum: bbc783578a8d5030c8164ef7f57ce41b5ad7db2ed13371e1944bef157eeca5a7475530e07c0aaa71610d7085474d0d96222c9f4268d41db333a17e39b463f45d - languageName: node - linkType: hard - -"got@npm:^6.7.1": - version: 6.7.1 - resolution: "got@npm:6.7.1" - dependencies: - create-error-class: ^3.0.0 - duplexer3: ^0.1.4 - get-stream: ^3.0.0 - is-redirect: ^1.0.0 - is-retry-allowed: ^1.0.0 - is-stream: ^1.0.0 - lowercase-keys: ^1.0.0 - safe-buffer: ^5.0.1 - timed-out: ^4.0.0 - unzip-response: ^2.0.1 - url-parse-lax: ^1.0.0 - checksum: e816306dbd968aa74c6bebcb611797fc08fe84af0f274b3af75d7d6a1f745bdf0dfe9279be0047646038b8b40ac94735d11187be1fb74069831520ae70fbd507 - languageName: node - linkType: hard - -"got@npm:^9.6.0": - version: 9.6.0 - resolution: "got@npm:9.6.0" - dependencies: - "@sindresorhus/is": ^0.14.0 - "@szmarczak/http-timer": ^1.1.2 - cacheable-request: ^6.0.0 - decompress-response: ^3.3.0 - duplexer3: ^0.1.4 - get-stream: ^4.1.0 - lowercase-keys: ^1.0.1 - mimic-response: ^1.0.1 - p-cancelable: ^1.0.0 - to-readable-stream: ^1.0.0 - url-parse-lax: ^3.0.0 - checksum: 941807bd9704bacf5eb401f0cc1212ffa1f67c6642f2d028fd75900471c221b1da2b8527f4553d2558f3faeda62ea1cf31665f8b002c6137f5de8732f07370b0 - languageName: node - linkType: hard - -"graceful-fs@npm:^4.0.0, graceful-fs@npm:^4.1.11, graceful-fs@npm:^4.1.2, graceful-fs@npm:^4.1.3, graceful-fs@npm:^4.1.5, graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.11, graceful-fs@npm:^4.2.4, graceful-fs@npm:^4.2.6, graceful-fs@npm:^4.2.9": - version: 4.2.11 - resolution: "graceful-fs@npm:4.2.11" - checksum: ac85f94da92d8eb6b7f5a8b20ce65e43d66761c55ce85ac96df6865308390da45a8d3f0296dd3a663de65d30ba497bd46c696cc1e248c72b13d6d567138a4fc7 - languageName: node - linkType: hard - -"graphemer@npm:^1.4.0": - version: 1.4.0 - resolution: "graphemer@npm:1.4.0" - checksum: bab8f0be9b568857c7bec9fda95a89f87b783546d02951c40c33f84d05bb7da3fd10f863a9beb901463669b6583173a8c8cc6d6b306ea2b9b9d5d3d943c3a673 - languageName: node - linkType: hard - -"graphql-config@npm:^4.5.0": - version: 4.5.0 - resolution: "graphql-config@npm:4.5.0" - dependencies: - "@graphql-tools/graphql-file-loader": ^7.3.7 - "@graphql-tools/json-file-loader": ^7.3.7 - "@graphql-tools/load": ^7.5.5 - "@graphql-tools/merge": ^8.2.6 - "@graphql-tools/url-loader": ^7.9.7 - "@graphql-tools/utils": ^9.0.0 - cosmiconfig: 8.0.0 - jiti: 1.17.1 - minimatch: 4.2.3 - string-env-interpolation: 1.0.1 - tslib: ^2.4.0 - peerDependencies: - cosmiconfig-toml-loader: ^1.0.0 - graphql: ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 - peerDependenciesMeta: - cosmiconfig-toml-loader: - optional: true - checksum: 8ab1a3ce3534598ddac2df213b6af2eecd9ebcca2268d39cc3e87a6e55749483389a6df222e9e0acd638dd2479378a5c8e8d90f980e6a54e700c4c4ae3522123 - languageName: node - linkType: hard - -"graphql-request@npm:^6.0.0": - version: 6.0.0 - resolution: "graphql-request@npm:6.0.0" - dependencies: - "@graphql-typed-document-node/core": ^3.2.0 - cross-fetch: ^3.1.5 - peerDependencies: - graphql: 14 - 16 - checksum: e3acc6267c3d25d6dea7144823b3552c3533489269272e651e2a16c45575ccb357bb1dd3c78c1b6c379d4080377bc5694f589bd681d822c9647f6b1736239428 - languageName: node - linkType: hard - -"graphql-scalars@npm:1.22.4": - version: 1.22.4 - resolution: "graphql-scalars@npm:1.22.4" - dependencies: - tslib: ^2.5.0 - peerDependencies: - graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 - checksum: 4688610c90f6b4de466c57c656ca3fc2a3c2dded2b61d5ecc8882051c7ab0cc1c8db85774fe30aa3f13d534d3c8c202ec23c2e504afcf65f102259ea82a22e7e - languageName: node - linkType: hard - -"graphql-tag@npm:^2.11.0, graphql-tag@npm:^2.12.6": - version: 2.12.6 - resolution: "graphql-tag@npm:2.12.6" - dependencies: - tslib: ^2.1.0 - peerDependencies: - graphql: ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 - checksum: b15162a3d62f17b9b79302445b9ee330e041582f1c7faca74b9dec5daa74272c906ec1c34e1c50592bb6215e5c3eba80a309103f6ba9e4c1cddc350c46f010df - languageName: node - linkType: hard - -"graphql-ws@npm:5.12.1": - version: 5.12.1 - resolution: "graphql-ws@npm:5.12.1" - peerDependencies: - graphql: ">=0.11 <=16" - checksum: 88d587c431feba681957faecd96101bb3860e1a4765f34b8cae1c514e7f98754b5f31c6b3127775e4732f26883b0802fe426bf9f7031c16cd0b25a27ad90ec9c - languageName: node - linkType: hard - -"graphql@npm:16.6.0": - version: 16.6.0 - resolution: "graphql@npm:16.6.0" - checksum: bf1d9e3c1938ce3c1a81e909bd3ead1ae4707c577f91cff1ca2eca474bfbc7873d5d7b942e1e9777ff5a8304421dba57a4b76d7a29eb19de8711cb70e3c2415e - languageName: node - linkType: hard - -"graphql@npm:^14.0.2": - version: 14.7.0 - resolution: "graphql@npm:14.7.0" - dependencies: - iterall: ^1.2.2 - checksum: e5f4e60799421a573904f390e1ec0aa76360f751688dbbe62e9c35baa0d3727c8d59a659bfc524f126dffe3518da87fd8ecaa78c94fd5c0fe4e035c670745242 - languageName: node - linkType: hard - -"gtoken@npm:^6.1.0": - version: 6.1.2 - resolution: "gtoken@npm:6.1.2" - dependencies: - gaxios: ^5.0.1 - google-p12-pem: ^4.0.0 - jws: ^4.0.0 - checksum: cf3210afe2ccee8feaa06f0c7eb942e217244a8563a1d0a71aa3095eea545015896741c1d48654d8de35b7b07579f93e25e5dfe817f06b7e753646b67f7a4ecf - languageName: node - linkType: hard - -"gtoken@npm:^7.0.0": - version: 7.1.0 - resolution: "gtoken@npm:7.1.0" - dependencies: - gaxios: ^6.0.0 - jws: ^4.0.0 - checksum: 1f338dced78f9d895ea03cd507454eb5a7b77e841ecd1d45e44483b08c1e64d16a9b0342358d37586d87462ffc2d5f5bff5dfe77ed8d4f0aafc3b5b0347d5d16 - languageName: node - linkType: hard - -"gulp-sort@npm:^2.0.0": - version: 2.0.0 - resolution: "gulp-sort@npm:2.0.0" - dependencies: - through2: ^2.0.1 - checksum: 8645d80b26990290e8623ccf38420e319a4ea67b64ac3e4f2b5de6c20b9006973001fd989dfe0fe3b2560044d3dfbc005685126826536e01718a2628aa45d0c5 - languageName: node - linkType: hard - -"gzip-size@npm:^6.0.0": - version: 6.0.0 - resolution: "gzip-size@npm:6.0.0" - dependencies: - duplexer: ^0.1.2 - checksum: 2df97f359696ad154fc171dcb55bc883fe6e833bca7a65e457b9358f3cb6312405ed70a8da24a77c1baac0639906cd52358dc0ce2ec1a937eaa631b934c94194 - languageName: node - linkType: hard - -"h3@npm:^1.10.0, h3@npm:^1.8.2": - version: 1.10.0 - resolution: "h3@npm:1.10.0" - dependencies: - cookie-es: ^1.0.0 - defu: ^6.1.3 - destr: ^2.0.2 - iron-webcrypto: ^1.0.0 - radix3: ^1.1.0 - ufo: ^1.3.2 - uncrypto: ^0.1.3 - unenv: ^1.8.0 - checksum: 70142b1bfc9d3fb4f09211c69d811812a48b75eb2bfae99f1d43b8aa666155efbc23ab5e65f576029e3d13f605e26012d0f14f99e0aa6fb66195e776fbc2c44c - languageName: node - linkType: hard - -"handle-thing@npm:^2.0.0": - version: 2.0.1 - resolution: "handle-thing@npm:2.0.1" - checksum: 68071f313062315cd9dce55710e9496873945f1dd425107007058fc1629f93002a7649fcc3e464281ce02c7e809a35f5925504ab8105d972cf649f1f47cb7d6c - languageName: node - linkType: hard - -"handlebars@npm:^4.7.8": - version: 4.7.8 - resolution: "handlebars@npm:4.7.8" - dependencies: - minimist: ^1.2.5 - neo-async: ^2.6.2 - source-map: ^0.6.1 - uglify-js: ^3.1.4 - wordwrap: ^1.0.0 - dependenciesMeta: - uglify-js: - optional: true - bin: - handlebars: bin/handlebars - checksum: 00e68bb5c183fd7b8b63322e6234b5ac8fbb960d712cb3f25587d559c2951d9642df83c04a1172c918c41bcfc81bfbd7a7718bbce93b893e0135fc99edea93ff - languageName: node - linkType: hard - -"hard-rejection@npm:^2.1.0": - version: 2.1.0 - resolution: "hard-rejection@npm:2.1.0" - checksum: 7baaf80a0c7fff4ca79687b4060113f1529589852152fa935e6787a2bc96211e784ad4588fb3048136ff8ffc9dfcf3ae385314a5b24db32de20bea0d1597f9dc - languageName: node - linkType: hard - -"hardhat-watcher@npm:^2.1.1": - version: 2.5.0 - resolution: "hardhat-watcher@npm:2.5.0" - dependencies: - chokidar: ^3.5.3 - peerDependencies: - hardhat: ^2.0.0 - checksum: e6c0d52865529653733b3fed6887b41a676fc5185eb835909b360e8cc24223a2fc4c398e3874b234fa918ec59be9de86d7fe92963022139c05cf07f027377cbb - languageName: node - linkType: hard - -"hardhat@npm:2.22.16": - version: 2.22.16 - resolution: "hardhat@npm:2.22.16" - dependencies: - "@ethersproject/abi": ^5.1.2 - "@metamask/eth-sig-util": ^4.0.0 - "@nomicfoundation/edr": ^0.6.4 - "@nomicfoundation/ethereumjs-common": 4.0.4 - "@nomicfoundation/ethereumjs-tx": 5.0.4 - "@nomicfoundation/ethereumjs-util": 9.0.4 - "@nomicfoundation/solidity-analyzer": ^0.1.0 - "@sentry/node": ^5.18.1 - "@types/bn.js": ^5.1.0 - "@types/lru-cache": ^5.1.0 - adm-zip: ^0.4.16 - aggregate-error: ^3.0.0 - ansi-escapes: ^4.3.0 - boxen: ^5.1.2 - chokidar: ^4.0.0 - ci-info: ^2.0.0 - debug: ^4.1.1 - enquirer: ^2.3.0 - env-paths: ^2.2.0 - ethereum-cryptography: ^1.0.3 - ethereumjs-abi: ^0.6.8 - find-up: ^5.0.0 - fp-ts: 1.19.3 - fs-extra: ^7.0.1 - immutable: ^4.0.0-rc.12 - io-ts: 1.10.4 - json-stream-stringify: ^3.1.4 - keccak: ^3.0.2 - lodash: ^4.17.11 - mnemonist: ^0.38.0 - mocha: ^10.0.0 - p-map: ^4.0.0 - picocolors: ^1.1.0 - raw-body: ^2.4.1 - resolve: 1.17.0 - semver: ^6.3.0 - solc: 0.8.26 - source-map-support: ^0.5.13 - stacktrace-parser: ^0.1.10 - tinyglobby: ^0.2.6 - tsort: 0.0.1 - undici: ^5.14.0 - uuid: ^8.3.2 - ws: ^7.4.6 - peerDependencies: - ts-node: "*" - typescript: "*" - peerDependenciesMeta: - ts-node: - optional: true - typescript: - optional: true - bin: - hardhat: internal/cli/bootstrap.js - checksum: 758fa3a0ade06a539a9ddb362c6d904db5bdc0430d9955ddf18cf6bd5365eee1b2f462fa66d7b202e9b4c0a7b291d007e3b3e84e293dec6135c7313785e68d2a - languageName: node - linkType: hard - -"harmony-reflect@npm:^1.4.6": - version: 1.6.2 - resolution: "harmony-reflect@npm:1.6.2" - checksum: 2e5bae414cd2bfae5476147f9935dc69ee9b9a413206994dcb94c5b3208d4555da3d4313aff6fd14bd9991c1e3ef69cdda5c8fac1eb1d7afc064925839339b8c - languageName: node - linkType: hard - -"has-bigints@npm:^1.0.1, has-bigints@npm:^1.0.2": - version: 1.0.2 - resolution: "has-bigints@npm:1.0.2" - checksum: 390e31e7be7e5c6fe68b81babb73dfc35d413604d7ee5f56da101417027a4b4ce6a27e46eff97ad040c835b5d228676eae99a9b5c3bc0e23c8e81a49241ff45b - languageName: node - linkType: hard - -"has-flag@npm:^2.0.0": - version: 2.0.0 - resolution: "has-flag@npm:2.0.0" - checksum: 7d060d142ef6740c79991cb99afe5962b267e6e95538bf8b607026b9b1e7451288927bc8e7b4a9484a8b99935c0af023070f91ee49faef791ecd401dc58b2e8d - languageName: node - linkType: hard - -"has-flag@npm:^3.0.0": - version: 3.0.0 - resolution: "has-flag@npm:3.0.0" - checksum: 4a15638b454bf086c8148979aae044dd6e39d63904cd452d970374fa6a87623423da485dfb814e7be882e05c096a7ccf1ebd48e7e7501d0208d8384ff4dea73b - languageName: node - linkType: hard - -"has-flag@npm:^4.0.0": - version: 4.0.0 - resolution: "has-flag@npm:4.0.0" - checksum: 261a1357037ead75e338156b1f9452c016a37dcd3283a972a30d9e4a87441ba372c8b81f818cd0fbcd9c0354b4ae7e18b9e1afa1971164aef6d18c2b6095a8ad - languageName: node - linkType: hard - -"has-property-descriptors@npm:^1.0.0, has-property-descriptors@npm:^1.0.2": - version: 1.0.2 - resolution: "has-property-descriptors@npm:1.0.2" - dependencies: - es-define-property: ^1.0.0 - checksum: fcbb246ea2838058be39887935231c6d5788babed499d0e9d0cc5737494c48aba4fe17ba1449e0d0fbbb1e36175442faa37f9c427ae357d6ccb1d895fbcd3de3 - languageName: node - linkType: hard - -"has-proto@npm:^1.0.1, has-proto@npm:^1.0.3": - version: 1.0.3 - resolution: "has-proto@npm:1.0.3" - checksum: fe7c3d50b33f50f3933a04413ed1f69441d21d2d2944f81036276d30635cad9279f6b43bc8f32036c31ebdfcf6e731150f46c1907ad90c669ffe9b066c3ba5c4 - languageName: node - linkType: hard - -"has-symbols@npm:^1.0.1, has-symbols@npm:^1.0.2, has-symbols@npm:^1.0.3": - version: 1.1.0 - resolution: "has-symbols@npm:1.1.0" - checksum: b2316c7302a0e8ba3aaba215f834e96c22c86f192e7310bdf689dd0e6999510c89b00fbc5742571507cebf25764d68c988b3a0da217369a73596191ac0ce694b - languageName: node - linkType: hard - -"has-tostringtag@npm:^1.0.0, has-tostringtag@npm:^1.0.2": - version: 1.0.2 - resolution: "has-tostringtag@npm:1.0.2" - dependencies: - has-symbols: ^1.0.3 - checksum: 999d60bb753ad714356b2c6c87b7fb74f32463b8426e159397da4bde5bca7e598ab1073f4d8d4deafac297f2eb311484cd177af242776bf05f0d11565680468d - languageName: node - linkType: hard - -"has-unicode@npm:^2.0.0, has-unicode@npm:^2.0.1": - version: 2.0.1 - resolution: "has-unicode@npm:2.0.1" - checksum: 1eab07a7436512db0be40a710b29b5dc21fa04880b7f63c9980b706683127e3c1b57cb80ea96d47991bdae2dfe479604f6a1ba410106ee1046a41d1bd0814400 - languageName: node - linkType: hard - -"has@npm:^1.0.3": - version: 1.0.3 - resolution: "has@npm:1.0.3" - dependencies: - function-bind: ^1.1.1 - checksum: b9ad53d53be4af90ce5d1c38331e712522417d017d5ef1ebd0507e07c2fbad8686fffb8e12ddecd4c39ca9b9b47431afbb975b8abf7f3c3b82c98e9aad052792 - languageName: node - linkType: hard - -"hash-base@npm:^3.0.0": - version: 3.1.0 - resolution: "hash-base@npm:3.1.0" - dependencies: - inherits: ^2.0.4 - readable-stream: ^3.6.0 - safe-buffer: ^5.2.0 - checksum: 26b7e97ac3de13cb23fc3145e7e3450b0530274a9562144fc2bf5c1e2983afd0e09ed7cc3b20974ba66039fad316db463da80eb452e7373e780cbee9a0d2f2dc - languageName: node - linkType: hard - -"hash.js@npm:1.1.7, hash.js@npm:^1.0.0, hash.js@npm:^1.0.3, hash.js@npm:^1.1.7": - version: 1.1.7 - resolution: "hash.js@npm:1.1.7" - dependencies: - inherits: ^2.0.3 - minimalistic-assert: ^1.0.1 - checksum: e350096e659c62422b85fa508e4b3669017311aa4c49b74f19f8e1bc7f3a54a584fdfd45326d4964d6011f2b2d882e38bea775a96046f2a61b7779a979629d8f - languageName: node - linkType: hard - -"hasown@npm:^2.0.0, hasown@npm:^2.0.1, hasown@npm:^2.0.2": - version: 2.0.2 - resolution: "hasown@npm:2.0.2" - dependencies: - function-bind: ^1.1.2 - checksum: e8516f776a15149ca6c6ed2ae3110c417a00b62260e222590e54aa367cbcd6ed99122020b37b7fbdf05748df57b265e70095d7bf35a47660587619b15ffb93db - languageName: node - linkType: hard - -"he@npm:1.2.0, he@npm:^1.1.0, he@npm:^1.2.0": - version: 1.2.0 - resolution: "he@npm:1.2.0" - bin: - he: bin/he - checksum: 3d4d6babccccd79c5c5a3f929a68af33360d6445587d628087f39a965079d84f18ce9c3d3f917ee1e3978916fc833bb8b29377c3b403f919426f91bc6965e7a7 - languageName: node - linkType: hard - -"header-case@npm:^2.0.4": - version: 2.0.4 - resolution: "header-case@npm:2.0.4" - dependencies: - capital-case: ^1.0.4 - tslib: ^2.0.3 - checksum: 571c83eeb25e8130d172218712f807c0b96d62b020981400bccc1503a7cf14b09b8b10498a962d2739eccf231d950e3848ba7d420b58a6acd2f9283439546cd9 - languageName: node - linkType: hard - -"heimdalljs-logger@npm:^0.1.10, heimdalljs-logger@npm:^0.1.7": - version: 0.1.10 - resolution: "heimdalljs-logger@npm:0.1.10" - dependencies: - debug: ^2.2.0 - heimdalljs: ^0.2.6 - checksum: 40a698843aa4773e3376f4e000c87599460971f4411b402985526a8f82563f5486fc85bfde90ce3e63d25381cf417289e870242321ce92ade32ea3b91585cfad - languageName: node - linkType: hard - -"heimdalljs@npm:^0.2.6": - version: 0.2.6 - resolution: "heimdalljs@npm:0.2.6" - dependencies: - rsvp: ~3.2.1 - checksum: 5b28d3df4e77ea94293b43c29f0a358381aa811079817f780a1dafc9d244c891a0a713691a3c53d0d2dc31a76484fb36d998e7ae5040ef4b52e8c4a00d2173ae - languageName: node - linkType: hard - -"hermes-estree@npm:0.23.1": - version: 0.23.1 - resolution: "hermes-estree@npm:0.23.1" - checksum: 0f63edc365099304f4cd8e91a3666a4fb5a2a47baee751dc120df9201640112865944cae93617f554af71be9827e96547f9989f4972d6964ecc121527295fec6 - languageName: node - linkType: hard - -"hermes-estree@npm:0.25.1": - version: 0.25.1 - resolution: "hermes-estree@npm:0.25.1" - checksum: 97f42e9178dff61db017810b4f79f5a2cdbb3cde94b7d99ba84ed632ee2adfcae2244555587951b3151fc036676c68f48f57fbe2b49e253eb1f3f904d284a8b0 - languageName: node - linkType: hard - -"hermes-parser@npm:0.23.1": - version: 0.23.1 - resolution: "hermes-parser@npm:0.23.1" - dependencies: - hermes-estree: 0.23.1 - checksum: a08008928aea9ea9a2cab2c0fac3cffa21f7869ab3fabb68e5add0fe057737a0c352d7a446426f7956172ccc8f2d4a215b4fc20d1d08354fc8dc16772c248fce - languageName: node - linkType: hard - -"hermes-parser@npm:0.25.1": - version: 0.25.1 - resolution: "hermes-parser@npm:0.25.1" - dependencies: - hermes-estree: 0.25.1 - checksum: 4edcfaa3030931343b540182b83c432aba4cdcb1925952521ab4cfb7ab90c2c1543dfcb042ccd51d5e81e4bfe2809420e85902c2ff95ef7c6c64644ce17138ea - languageName: node - linkType: hard - -"hex-rgb@npm:^4.1.0": - version: 4.3.0 - resolution: "hex-rgb@npm:4.3.0" - checksum: e654648db8647446f0111c68690d9b340eb192a93c8b2c6789a2b8deb5c20e757515ae209c5ae67074acfddf8575f9fc645d4ffaa0596d859457b08e180d791d - languageName: node - linkType: hard - -"hey-listen@npm:^1.0.8": - version: 1.0.8 - resolution: "hey-listen@npm:1.0.8" - checksum: 6bad60b367688f5348e25e7ca3276a74b59ac5a09b0455e6ff8ab7d4a9e38cd2116c708a7dcd8a954d27253ce1d8717ec891d175723ea739885b828cf44e4072 - languageName: node - linkType: hard - -"hmac-drbg@npm:^1.0.1": - version: 1.0.1 - resolution: "hmac-drbg@npm:1.0.1" - dependencies: - hash.js: ^1.0.3 - minimalistic-assert: ^1.0.0 - minimalistic-crypto-utils: ^1.0.1 - checksum: bd30b6a68d7f22d63f10e1888aee497d7c2c5c0bb469e66bbdac99f143904d1dfe95f8131f95b3e86c86dd239963c9d972fcbe147e7cffa00e55d18585c43fe0 - languageName: node - linkType: hard - -"hoist-non-react-statics@npm:^3.0.0, hoist-non-react-statics@npm:^3.3.0, hoist-non-react-statics@npm:^3.3.2": - version: 3.3.2 - resolution: "hoist-non-react-statics@npm:3.3.2" - dependencies: - react-is: ^16.7.0 - checksum: b1538270429b13901ee586aa44f4cc3ecd8831c061d06cb8322e50ea17b3f5ce4d0e2e66394761e6c8e152cd8c34fb3b4b690116c6ce2bd45b18c746516cb9e8 - languageName: node - linkType: hard - -"homedir-polyfill@npm:^1.0.0, homedir-polyfill@npm:^1.0.1": - version: 1.0.3 - resolution: "homedir-polyfill@npm:1.0.3" - dependencies: - parse-passwd: ^1.0.0 - checksum: 18dd4db87052c6a2179d1813adea0c4bfcfa4f9996f0e226fefb29eb3d548e564350fa28ec46b0bf1fbc0a1d2d6922ceceb80093115ea45ff8842a4990139250 - languageName: node - linkType: hard - -"hoopy@npm:^0.1.4": - version: 0.1.4 - resolution: "hoopy@npm:0.1.4" - checksum: cfa60c7684c5e1ee4efe26e167bc54b73f839ffb59d1d44a5c4bf891e26b4f5bcc666555219a98fec95508fea4eda3a79540c53c05cc79afc1f66f9a238f4d9e - languageName: node - linkType: hard - -"hosted-git-info@npm:^2.1.4": - version: 2.8.9 - resolution: "hosted-git-info@npm:2.8.9" - checksum: c955394bdab888a1e9bb10eb33029e0f7ce5a2ac7b3f158099dc8c486c99e73809dca609f5694b223920ca2174db33d32b12f9a2a47141dc59607c29da5a62dd - languageName: node - linkType: hard - -"hosted-git-info@npm:^4.0.1": - version: 4.1.0 - resolution: "hosted-git-info@npm:4.1.0" - dependencies: - lru-cache: ^6.0.0 - checksum: c3f87b3c2f7eb8c2748c8f49c0c2517c9a95f35d26f4bf54b2a8cba05d2e668f3753548b6ea366b18ec8dadb4e12066e19fa382a01496b0ffa0497eb23cbe461 - languageName: node - linkType: hard - -"hosted-git-info@npm:^7.0.0": - version: 7.0.2 - resolution: "hosted-git-info@npm:7.0.2" - dependencies: - lru-cache: ^10.0.1 - checksum: 467cf908a56556417b18e86ae3b8dee03c2360ef1d51e61c4028fe87f6f309b6ff038589c94b5666af207da9d972d5107698906aabeb78aca134641962a5c6f8 - languageName: node - linkType: hard - -"hpack.js@npm:^2.1.6": - version: 2.1.6 - resolution: "hpack.js@npm:2.1.6" - dependencies: - inherits: ^2.0.1 - obuf: ^1.0.0 - readable-stream: ^2.0.1 - wbuf: ^1.1.0 - checksum: 2de144115197967ad6eeee33faf41096c6ba87078703c5cb011632dcfbffeb45784569e0cf02c317bd79c48375597c8ec88c30fff5bb0b023e8f654fb6e9c06e - languageName: node - linkType: hard - -"html-encoding-sniffer@npm:^3.0.0": - version: 3.0.0 - resolution: "html-encoding-sniffer@npm:3.0.0" - dependencies: - whatwg-encoding: ^2.0.0 - checksum: 8d806aa00487e279e5ccb573366a951a9f68f65c90298eac9c3a2b440a7ffe46615aff2995a2f61c6746c639234e6179a97e18ca5ccbbf93d3725ef2099a4502 - languageName: node - linkType: hard - -"html-entities@npm:^2.1.0, html-entities@npm:^2.3.2, html-entities@npm:^2.5.2": - version: 2.5.2 - resolution: "html-entities@npm:2.5.2" - checksum: b23f4a07d33d49ade1994069af4e13d31650e3fb62621e92ae10ecdf01d1a98065c78fd20fdc92b4c7881612210b37c275f2c9fba9777650ab0d6f2ceb3b99b6 - languageName: node - linkType: hard - -"html-escaper@npm:^2.0.0, html-escaper@npm:^2.0.2": - version: 2.0.2 - resolution: "html-escaper@npm:2.0.2" - checksum: d2df2da3ad40ca9ee3a39c5cc6475ef67c8f83c234475f24d8e9ce0dc80a2c82df8e1d6fa78ddd1e9022a586ea1bd247a615e80a5cd9273d90111ddda7d9e974 - languageName: node - linkType: hard - -"html-minifier-terser@npm:^6.0.2": - version: 6.1.0 - resolution: "html-minifier-terser@npm:6.1.0" - dependencies: - camel-case: ^4.1.2 - clean-css: ^5.2.2 - commander: ^8.3.0 - he: ^1.2.0 - param-case: ^3.0.4 - relateurl: ^0.2.7 - terser: ^5.10.0 - bin: - html-minifier-terser: cli.js - checksum: ac52c14006476f773204c198b64838477859dc2879490040efab8979c0207424da55d59df7348153f412efa45a0840a1ca3c757bf14767d23a15e3e389d37a93 - languageName: node - linkType: hard - -"html-parse-stringify@npm:^3.0.1": - version: 3.0.1 - resolution: "html-parse-stringify@npm:3.0.1" - dependencies: - void-elements: 3.1.0 - checksum: 334fdebd4b5c355dba8e95284cead6f62bf865a2359da2759b039db58c805646350016d2017875718bc3c4b9bf81a0d11be5ee0cf4774a3a5a7b97cde21cfd67 - languageName: node - linkType: hard - -"html-to-react@npm:^1.3.4": - version: 1.7.0 - resolution: "html-to-react@npm:1.7.0" - dependencies: - domhandler: ^5.0 - htmlparser2: ^9.0 - lodash.camelcase: ^4.3.0 - peerDependencies: - react: ^0.13.0 || ^0.14.0 || >=15 - checksum: 2366ba0f3eb05b4f83fc46ff5dad9813c28506ece8b70cccdaac202fef51675e110ca467ed78d29f347a41e0f89efb6d825db2db0715f00105b414e0120f4447 - languageName: node - linkType: hard - -"html-webpack-plugin@npm:^5.5.0": - version: 5.5.1 - resolution: "html-webpack-plugin@npm:5.5.1" - dependencies: - "@types/html-minifier-terser": ^6.0.0 - html-minifier-terser: ^6.0.2 - lodash: ^4.17.21 - pretty-error: ^4.0.0 - tapable: ^2.0.0 - peerDependencies: - webpack: ^5.20.0 - checksum: f4b43271171e6374b10a49b5231bbab94610a344d58f4f7d95cd130520feb474f98006e1ab71ea102c57fe5a107b273ff7c19e7e1bc2314d611dbb791fcc0a98 - languageName: node - linkType: hard - -"htmlparser2@npm:^6.1.0": - version: 6.1.0 - resolution: "htmlparser2@npm:6.1.0" - dependencies: - domelementtype: ^2.0.1 - domhandler: ^4.0.0 - domutils: ^2.5.2 - entities: ^2.0.0 - checksum: 81a7b3d9c3bb9acb568a02fc9b1b81ffbfa55eae7f1c41ae0bf840006d1dbf54cb3aa245b2553e2c94db674840a9f0fdad7027c9a9d01a062065314039058c4e - languageName: node - linkType: hard - -"htmlparser2@npm:^8.0.1": - version: 8.0.2 - resolution: "htmlparser2@npm:8.0.2" - dependencies: - domelementtype: ^2.3.0 - domhandler: ^5.0.3 - domutils: ^3.0.1 - entities: ^4.4.0 - checksum: 29167a0f9282f181da8a6d0311b76820c8a59bc9e3c87009e21968264c2987d2723d6fde5a964d4b7b6cba663fca96ffb373c06d8223a85f52a6089ced942700 - languageName: node - linkType: hard - -"htmlparser2@npm:^9.0": - version: 9.0.0 - resolution: "htmlparser2@npm:9.0.0" - dependencies: - domelementtype: ^2.3.0 - domhandler: ^5.0.3 - domutils: ^3.1.0 - entities: ^4.5.0 - checksum: a234c3add821cae8308ca61ce4b8ad3e88af83cf9c3c2003059adc89c46a06ffc39cc2a92b39af8d16c3705e1055df6769d80877acb6529983867f0d7e74098d - languageName: node - linkType: hard - -"http-cache-semantics@npm:^4.0.0, http-cache-semantics@npm:^4.1.0": - version: 4.1.1 - resolution: "http-cache-semantics@npm:4.1.1" - checksum: 83ac0bc60b17a3a36f9953e7be55e5c8f41acc61b22583060e8dedc9dd5e3607c823a88d0926f9150e571f90946835c7fe150732801010845c72cd8bbff1a236 - languageName: node - linkType: hard - -"http-deceiver@npm:^1.2.7": - version: 1.2.7 - resolution: "http-deceiver@npm:1.2.7" - checksum: 64d7d1ae3a6933eb0e9a94e6f27be4af45a53a96c3c34e84ff57113787105a89fff9d1c3df263ef63add823df019b0e8f52f7121e32393bb5ce9a713bf100b41 - languageName: node - linkType: hard - -"http-errors@npm:2.0.0": - version: 2.0.0 - resolution: "http-errors@npm:2.0.0" - dependencies: - depd: 2.0.0 - inherits: 2.0.4 - setprototypeof: 1.2.0 - statuses: 2.0.1 - toidentifier: 1.0.1 - checksum: 9b0a3782665c52ce9dc658a0d1560bcb0214ba5699e4ea15aefb2a496e2ca83db03ebc42e1cce4ac1f413e4e0d2d736a3fd755772c556a9a06853ba2a0b7d920 - languageName: node - linkType: hard - -"http-errors@npm:~1.6.2": - version: 1.6.3 - resolution: "http-errors@npm:1.6.3" - dependencies: - depd: ~1.1.2 - inherits: 2.0.3 - setprototypeof: 1.1.0 - statuses: ">= 1.4.0 < 2" - checksum: a9654ee027e3d5de305a56db1d1461f25709ac23267c6dc28cdab8323e3f96caa58a9a6a5e93ac15d7285cee0c2f019378c3ada9026e7fe19c872d695f27de7c - languageName: node - linkType: hard - -"http-parser-js@npm:>=0.5.1": - version: 0.5.8 - resolution: "http-parser-js@npm:0.5.8" - checksum: 6bbdf2429858e8cf13c62375b0bfb6dc3955ca0f32e58237488bc86cd2378f31d31785fd3ac4ce93f1c74e0189cf8823c91f5cb061696214fd368d2452dc871d - languageName: node - linkType: hard - -"http-proxy-agent@npm:^5.0.0": - version: 5.0.0 - resolution: "http-proxy-agent@npm:5.0.0" - dependencies: - "@tootallnate/once": 2 - agent-base: 6 - debug: 4 - checksum: e2ee1ff1656a131953839b2a19cd1f3a52d97c25ba87bd2559af6ae87114abf60971e498021f9b73f9fd78aea8876d1fb0d4656aac8a03c6caa9fc175f22b786 - languageName: node - linkType: hard - -"http-proxy-agent@npm:^7.0.0, http-proxy-agent@npm:^7.0.1": - version: 7.0.2 - resolution: "http-proxy-agent@npm:7.0.2" - dependencies: - agent-base: ^7.1.0 - debug: ^4.3.4 - checksum: 670858c8f8f3146db5889e1fa117630910101db601fff7d5a8aa637da0abedf68c899f03d3451cac2f83bcc4c3d2dabf339b3aa00ff8080571cceb02c3ce02f3 - languageName: node - linkType: hard - -"http-proxy-middleware@npm:^2.0.3": - version: 2.0.6 - resolution: "http-proxy-middleware@npm:2.0.6" - dependencies: - "@types/http-proxy": ^1.17.8 - http-proxy: ^1.18.1 - is-glob: ^4.0.1 - is-plain-obj: ^3.0.0 - micromatch: ^4.0.2 - peerDependencies: - "@types/express": ^4.17.13 - peerDependenciesMeta: - "@types/express": - optional: true - checksum: 2ee85bc878afa6cbf34491e972ece0f5be0a3e5c98a60850cf40d2a9a5356e1fc57aab6cff33c1fc37691b0121c3a42602d2b1956c52577e87a5b77b62ae1c3a - languageName: node - linkType: hard - -"http-proxy@npm:^1.18.1": - version: 1.18.1 - resolution: "http-proxy@npm:1.18.1" - dependencies: - eventemitter3: ^4.0.0 - follow-redirects: ^1.0.0 - requires-port: ^1.0.0 - checksum: f5bd96bf83e0b1e4226633dbb51f8b056c3e6321917df402deacec31dd7fe433914fc7a2c1831cf7ae21e69c90b3a669b8f434723e9e8b71fd68afe30737b6a5 - languageName: node - linkType: hard - -"http-shutdown@npm:^1.2.2": - version: 1.2.2 - resolution: "http-shutdown@npm:1.2.2" - checksum: 5dccd94f4fe4f51f9cbd7ec4586121160cd6470728e581662ea8032724440d891c4c92b8210b871ac468adadb3c99c40098ad0f752a781a550abae49dfa26206 - languageName: node - linkType: hard - -"http-signature@npm:~1.3.6": - version: 1.3.6 - resolution: "http-signature@npm:1.3.6" - dependencies: - assert-plus: ^1.0.0 - jsprim: ^2.0.2 - sshpk: ^1.14.1 - checksum: 10be2af4764e71fee0281392937050201ee576ac755c543f570d6d87134ce5e858663fe999a7adb3e4e368e1e356d0d7fec6b9542295b875726ff615188e7a0c - languageName: node - linkType: hard - -"http2-wrapper@npm:^1.0.0-beta.5.2": - version: 1.0.3 - resolution: "http2-wrapper@npm:1.0.3" - dependencies: - quick-lru: ^5.1.1 - resolve-alpn: ^1.0.0 - checksum: 74160b862ec699e3f859739101ff592d52ce1cb207b7950295bf7962e4aa1597ef709b4292c673bece9c9b300efad0559fc86c71b1409c7a1e02b7229456003e - languageName: node - linkType: hard - -"https-browserify@npm:^1.0.0": - version: 1.0.0 - resolution: "https-browserify@npm:1.0.0" - checksum: 09b35353e42069fde2435760d13f8a3fb7dd9105e358270e2e225b8a94f811b461edd17cb57594e5f36ec1218f121c160ddceeec6e8be2d55e01dcbbbed8cbae - languageName: node - linkType: hard - -"https-proxy-agent@npm:^5.0.0, https-proxy-agent@npm:^5.0.1": - version: 5.0.1 - resolution: "https-proxy-agent@npm:5.0.1" - dependencies: - agent-base: 6 - debug: 4 - checksum: 571fccdf38184f05943e12d37d6ce38197becdd69e58d03f43637f7fa1269cf303a7d228aa27e5b27bbd3af8f09fd938e1c91dcfefff2df7ba77c20ed8dfc765 - languageName: node - linkType: hard - -"https-proxy-agent@npm:^7.0.1, https-proxy-agent@npm:^7.0.3, https-proxy-agent@npm:^7.0.5": - version: 7.0.5 - resolution: "https-proxy-agent@npm:7.0.5" - dependencies: - agent-base: ^7.0.2 - debug: 4 - checksum: 2e1a28960f13b041a50702ee74f240add8e75146a5c37fc98f1960f0496710f6918b3a9fe1e5aba41e50f58e6df48d107edd9c405c5f0d73ac260dabf2210857 - languageName: node - linkType: hard - -"human-signals@npm:^1.1.1": - version: 1.1.1 - resolution: "human-signals@npm:1.1.1" - checksum: d587647c9e8ec24e02821b6be7de5a0fc37f591f6c4e319b3054b43fd4c35a70a94c46fc74d8c1a43c47fde157d23acd7421f375e1c1365b09a16835b8300205 - languageName: node - linkType: hard - -"human-signals@npm:^2.1.0": - version: 2.1.0 - resolution: "human-signals@npm:2.1.0" - checksum: b87fd89fce72391625271454e70f67fe405277415b48bcc0117ca73d31fa23a4241787afdc8d67f5a116cf37258c052f59ea82daffa72364d61351423848e3b8 - languageName: node - linkType: hard - -"human-signals@npm:^4.3.0": - version: 4.3.1 - resolution: "human-signals@npm:4.3.1" - checksum: 6f12958df3f21b6fdaf02d90896c271df00636a31e2bbea05bddf817a35c66b38a6fdac5863e2df85bd52f34958997f1f50350ff97249e1dff8452865d5235d1 - languageName: node - linkType: hard - -"human-signals@npm:^5.0.0": - version: 5.0.0 - resolution: "human-signals@npm:5.0.0" - checksum: 6504560d5ed91444f16bea3bd9dfc66110a339442084e56c3e7fa7bbdf3f406426d6563d662bdce67064b165eac31eeabfc0857ed170aaa612cf14ec9f9a464c - languageName: node - linkType: hard - -"humanize-ms@npm:^1.2.1": - version: 1.2.1 - resolution: "humanize-ms@npm:1.2.1" - dependencies: - ms: ^2.0.0 - checksum: 9c7a74a2827f9294c009266c82031030eae811ca87b0da3dceb8d6071b9bde22c9f3daef0469c3c533cc67a97d8a167cd9fc0389350e5f415f61a79b171ded16 - languageName: node - linkType: hard - -"hunspell-spellchecker@npm:^1.0.2": - version: 1.0.2 - resolution: "hunspell-spellchecker@npm:1.0.2" - bin: - hunspell-tojson: ./bin/hunspell-tojson.js - checksum: 098e00a705b1b8975924ccef1b23e1d63acc139a493a392bb55f887926c518b2edae01f9a697cffa73346160c562f89610f80d354360a2cb637a67f7c54f8227 - languageName: node - linkType: hard - -"husky@npm:8.0.3": - version: 8.0.3 - resolution: "husky@npm:8.0.3" - bin: - husky: lib/bin.js - checksum: 837bc7e4413e58c1f2946d38fb050f5d7324c6f16b0fd66411ffce5703b294bd21429e8ba58711cd331951ee86ed529c5be4f76805959ff668a337dbfa82a1b0 - languageName: node - linkType: hard - -"hyperlinker@npm:^1.0.0": - version: 1.0.0 - resolution: "hyperlinker@npm:1.0.0" - checksum: f6d020ac552e9d048668206c805a737262b4c395546c773cceea3bc45252c46b4fa6eeb67c5896499dad00d21cb2f20f89fdd480a4529cfa3d012da2957162f9 - languageName: node - linkType: hard - -"hyphenate-style-name@npm:^1.0.3": - version: 1.0.4 - resolution: "hyphenate-style-name@npm:1.0.4" - checksum: 4f5bf4b055089754924babebaa23c17845937bcca6aee95d5d015f8fa1e6814279002bd6a9e541e3fac2cd02519fc76305396727066c57c8e21a7e73e7a12137 - languageName: node - linkType: hard - -"i18next-browser-languagedetector@npm:7.1.0": - version: 7.1.0 - resolution: "i18next-browser-languagedetector@npm:7.1.0" - dependencies: - "@babel/runtime": ^7.19.4 - checksum: 36981b9a9995ed66387f3735cceffe107ed3cdb6ca278d45fa243fabc65669c0eca095ed4a55a93dac046ca1eb23fd986ec0079723be7ebb8505e6ba25f379bb - languageName: node - linkType: hard - -"i18next-parser@npm:8.6.0": - version: 8.6.0 - resolution: "i18next-parser@npm:8.6.0" - dependencies: - broccoli-plugin: ^4.0.7 - cheerio: ^1.0.0-rc.2 - colors: 1.4.0 - commander: ~11.0.0 - eol: ^0.9.1 - esbuild: ^0.19.0 - fs-extra: ^11.1.0 - gulp-sort: ^2.0.0 - i18next: ^22.0.4 - js-yaml: 4.1.0 - lilconfig: ^2.0.6 - rsvp: ^4.8.2 - sort-keys: ^5.0.0 - typescript: ^5.0.4 - vinyl: ~3.0.0 - vinyl-fs: ^3.0.2 - vue-template-compiler: ^2.6.11 - bin: - i18next: bin/cli.js - checksum: 5e288432fee63e84e94ed44e053be0307339b79e033ce011ae4e8364e52640e16a7d0f801f46c6496af99f76845322836cad82669fe1430b799410edf06f01c4 - languageName: node - linkType: hard - -"i18next-resources-for-ts@npm:1.5.0": - version: 1.5.0 - resolution: "i18next-resources-for-ts@npm:1.5.0" - dependencies: - "@babel/runtime": ^7.23.7 - yaml: ^2.3.4 - bin: - i18next-resources-for-ts: bin/i18next-resources-for-ts.js - checksum: e07bff1421f42f9d6ec8a0f8d47beb4c70fbe13f73a8a891848dec356bd5e743773998a9e56efb6c14175379b9bb74a3d33bc775e3a1378888791771b444c6ba - languageName: node - linkType: hard - -"i18next-resources-to-backend@npm:1.2.1": - version: 1.2.1 - resolution: "i18next-resources-to-backend@npm:1.2.1" - dependencies: - "@babel/runtime": ^7.23.2 - checksum: a2f338c4eec8d5ba09846ae1abdd23afb72086f6395d6160c748d010c82f5c28c30133f6487f0fd3a65e710231d7750b324785f15cac4baf6d24b33227840341 - languageName: node - linkType: hard - -"i18next@npm:22.5.1, i18next@npm:^22.0.4": - version: 22.5.1 - resolution: "i18next@npm:22.5.1" - dependencies: - "@babel/runtime": ^7.20.6 - checksum: 175f8ab7fac2abcee147b00cc2d8e7d4fa9b05cdc227f02cac841fc2fd9545ed4a6d88774f594f8ad12dc944e4d34cc8e88aa00c8b9947baef9e859d93abd305 - languageName: node - linkType: hard - -"i18next@npm:23.10.0": - version: 23.10.0 - resolution: "i18next@npm:23.10.0" - dependencies: - "@babel/runtime": ^7.23.2 - checksum: 7b476071787c2b909517c86828b17ca7a7ae98c848a052a1c55f9cff114c2307975dcf8dcc30e43ca64389fb24cd2b76382d002d5c3ed0a9a900563813f61863 - languageName: node - linkType: hard - -"iconv-lite@npm:0.4.24, iconv-lite@npm:^0.4.24": - version: 0.4.24 - resolution: "iconv-lite@npm:0.4.24" - dependencies: - safer-buffer: ">= 2.1.2 < 3" - checksum: bd9f120f5a5b306f0bc0b9ae1edeb1577161503f5f8252a20f1a9e56ef8775c9959fd01c55f2d3a39d9a8abaf3e30c1abeb1895f367dcbbe0a8fd1c9ca01c4f6 - languageName: node - linkType: hard - -"iconv-lite@npm:0.6, iconv-lite@npm:0.6.3, iconv-lite@npm:^0.6.2, iconv-lite@npm:^0.6.3": - version: 0.6.3 - resolution: "iconv-lite@npm:0.6.3" - dependencies: - safer-buffer: ">= 2.1.2 < 3.0.0" - checksum: 3f60d47a5c8fc3313317edfd29a00a692cc87a19cac0159e2ce711d0ebc9019064108323b5e493625e25594f11c6236647d8e256fbe7a58f4a3b33b89e6d30bf - languageName: node - linkType: hard - -"icss-utils@npm:^5.0.0, icss-utils@npm:^5.1.0": - version: 5.1.0 - resolution: "icss-utils@npm:5.1.0" - peerDependencies: - postcss: ^8.1.0 - checksum: 5c324d283552b1269cfc13a503aaaa172a280f914e5b81544f3803bc6f06a3b585fb79f66f7c771a2c052db7982c18bf92d001e3b47282e3abbbb4c4cc488d68 - languageName: node - linkType: hard - -"idb-keyval@npm:6.2.1, idb-keyval@npm:^6.2.1": - version: 6.2.1 - resolution: "idb-keyval@npm:6.2.1" - checksum: 7c0836f832096086e99258167740181132a71dd2694c8b8454a4f5ec69114ba6d70983115153306f0b6de1c8d3bad04f67eed3dff8f50c96815b9985d6d78470 - languageName: node - linkType: hard - -"idb@npm:7.1.1, idb@npm:^7.0.1": - version: 7.1.1 - resolution: "idb@npm:7.1.1" - checksum: 1973c28d53c784b177bdef9f527ec89ec239ec7cf5fcbd987dae75a16c03f5b7dfcc8c6d3285716fd0309dd57739805390bd9f98ce23b1b7d8849a3b52de8d56 - languageName: node - linkType: hard - -"identity-obj-proxy@npm:^3.0.0": - version: 3.0.0 - resolution: "identity-obj-proxy@npm:3.0.0" - dependencies: - harmony-reflect: ^1.4.6 - checksum: 97559f8ea2aeaa1a880d279d8c49550dce01148321e00a2102cda5ddf9ce622fa1d7f3efc7bed63458af78889de888fdaebaf31c816312298bb3fdd0ef8aaf2c - languageName: node - linkType: hard - -"ieee754@npm:^1.1.13, ieee754@npm:^1.2.1": - version: 1.2.1 - resolution: "ieee754@npm:1.2.1" - checksum: 5144c0c9815e54ada181d80a0b810221a253562422e7c6c3a60b1901154184f49326ec239d618c416c1c5945a2e197107aee8d986a3dd836b53dffefd99b5e7e - languageName: node - linkType: hard - -"ignore@npm:^5.0.5, ignore@npm:^5.2.0, ignore@npm:^5.2.4": - version: 5.3.0 - resolution: "ignore@npm:5.3.0" - checksum: 2736da6621f14ced652785cb05d86301a66d70248597537176612bd0c8630893564bd5f6421f8806b09e8472e75c591ef01672ab8059c07c6eb2c09cefe04bf9 - languageName: node - linkType: hard - -"image-q@npm:^4.0.0": - version: 4.0.0 - resolution: "image-q@npm:4.0.0" - dependencies: - "@types/node": 16.9.1 - checksum: 6c6a1dd8467833161f46cc17b4a43218d30a3899ff71a4ffb895f71a14ca29de12f79d824d4d2174070924cbd97faa018b2ded8d690483ab7eb269f364cd97cc - languageName: node - linkType: hard - -"image-size@npm:^1.0.2": - version: 1.1.1 - resolution: "image-size@npm:1.1.1" - dependencies: - queue: 6.0.2 - bin: - image-size: bin/image-size.js - checksum: 23b3a515dded89e7f967d52b885b430d6a5a903da954fce703130bfb6069d738d80e6588efd29acfaf5b6933424a56535aa7bf06867e4ebd0250c2ee51f19a4a - languageName: node - linkType: hard - -"immediate@npm:~3.0.5": - version: 3.0.6 - resolution: "immediate@npm:3.0.6" - checksum: f9b3486477555997657f70318cc8d3416159f208bec4cca3ff3442fd266bc23f50f0c9bd8547e1371a6b5e82b821ec9a7044a4f7b944798b25aa3cc6d5e63e62 - languageName: node - linkType: hard - -"immer@npm:9.0.21": - version: 9.0.21 - resolution: "immer@npm:9.0.21" - checksum: 70e3c274165995352f6936695f0ef4723c52c92c92dd0e9afdfe008175af39fa28e76aafb3a2ca9d57d1fb8f796efc4dd1e1cc36f18d33fa5b74f3dfb0375432 - languageName: node - linkType: hard - -"immutable@npm:^4.0.0-rc.12": - version: 4.0.0 - resolution: "immutable@npm:4.0.0" - checksum: 4b5e9181e4d5fa06728a481835ec09c86367e5d03268666c95b522b7644ab891098022e4479a43c4c81a68f2ed82f10751ce5d33e208d7b873b6e7f9dfaf4d87 - languageName: node - linkType: hard - -"immutable@npm:~3.7.6": - version: 3.7.6 - resolution: "immutable@npm:3.7.6" - checksum: 8cccfb22d3ecf14fe0c474612e96d6bb5d117493e7639fe6642fb81e78c9ac4b698dd8a322c105001a709ad873ffc90e30bad7db5d9a3ef0b54a6e1db0258e8e - languageName: node - linkType: hard - -"import-fresh@npm:^2.0.0": - version: 2.0.0 - resolution: "import-fresh@npm:2.0.0" - dependencies: - caller-path: ^2.0.0 - resolve-from: ^3.0.0 - checksum: 610255f9753cc6775df00be08e9f43691aa39f7703e3636c45afe22346b8b545e600ccfe100c554607546fc8e861fa149a0d1da078c8adedeea30fff326eef79 - languageName: node - linkType: hard - -"import-fresh@npm:^3.0.0, import-fresh@npm:^3.1.0, import-fresh@npm:^3.2.1, import-fresh@npm:^3.3.0": - version: 3.3.1 - resolution: "import-fresh@npm:3.3.1" - dependencies: - parent-module: ^1.0.0 - resolve-from: ^4.0.0 - checksum: a06b19461b4879cc654d46f8a6244eb55eb053437afd4cbb6613cad6be203811849ed3e4ea038783092879487299fda24af932b86bdfff67c9055ba3612b8c87 - languageName: node - linkType: hard - -"import-from@npm:4.0.0": - version: 4.0.0 - resolution: "import-from@npm:4.0.0" - checksum: 1fa29c05b048da18914e91d9a529e5d9b91774bebbfab10e53f59bcc1667917672b971cf102fee857f142e5e433ce69fa1f0a596e1c7d82f9947a5ec352694b9 - languageName: node - linkType: hard - -"import-lazy@npm:^2.1.0": - version: 2.1.0 - resolution: "import-lazy@npm:2.1.0" - checksum: 05294f3b9dd4971d3a996f0d2f176410fb6745d491d6e73376429189f5c1c3d290548116b2960a7cf3e89c20cdf11431739d1d2d8c54b84061980795010e803a - languageName: node - linkType: hard - -"import-local@npm:^3.0.2": - version: 3.1.0 - resolution: "import-local@npm:3.1.0" - dependencies: - pkg-dir: ^4.2.0 - resolve-cwd: ^3.0.0 - bin: - import-local-fixture: fixtures/cli.js - checksum: bfcdb63b5e3c0e245e347f3107564035b128a414c4da1172a20dc67db2504e05ede4ac2eee1252359f78b0bfd7b19ef180aec427c2fce6493ae782d73a04cddd - languageName: node - linkType: hard - -"imurmurhash@npm:^0.1.4": - version: 0.1.4 - resolution: "imurmurhash@npm:0.1.4" - checksum: 7cae75c8cd9a50f57dadd77482359f659eaebac0319dd9368bcd1714f55e65badd6929ca58569da2b6494ef13fdd5598cd700b1eba23f8b79c5f19d195a3ecf7 - languageName: node - linkType: hard - -"indent-string@npm:^4.0.0": - version: 4.0.0 - resolution: "indent-string@npm:4.0.0" - checksum: 824cfb9929d031dabf059bebfe08cf3137365e112019086ed3dcff6a0a7b698cb80cf67ccccde0e25b9e2d7527aa6cc1fed1ac490c752162496caba3e6699612 - languageName: node - linkType: hard - -"indexes-of@npm:^1.0.1": - version: 1.0.1 - resolution: "indexes-of@npm:1.0.1" - checksum: 4f9799b1739a62f3e02d09f6f4162cf9673025282af7fa36e790146e7f4e216dad3e776a25b08536c093209c9fcb5ea7bd04b082d42686a45f58ff401d6da32e - languageName: node - linkType: hard - -"infer-owner@npm:^1.0.4": - version: 1.0.4 - resolution: "infer-owner@npm:1.0.4" - checksum: 181e732764e4a0611576466b4b87dac338972b839920b2a8cde43642e4ed6bd54dc1fb0b40874728f2a2df9a1b097b8ff83b56d5f8f8e3927f837fdcb47d8a89 - languageName: node - linkType: hard - -"inflight@npm:^1.0.4": - version: 1.0.6 - resolution: "inflight@npm:1.0.6" - dependencies: - once: ^1.3.0 - wrappy: 1 - checksum: f4f76aa072ce19fae87ce1ef7d221e709afb59d445e05d47fba710e85470923a75de35bfae47da6de1b18afc3ce83d70facf44cfb0aff89f0a3f45c0a0244dfd - languageName: node - linkType: hard - -"inherits@npm:2, inherits@npm:2.0.4, inherits@npm:^2.0.0, inherits@npm:^2.0.1, inherits@npm:^2.0.3, inherits@npm:^2.0.4, inherits@npm:~2.0.3, inherits@npm:~2.0.4": - version: 2.0.4 - resolution: "inherits@npm:2.0.4" - checksum: 4a48a733847879d6cf6691860a6b1e3f0f4754176e4d71494c41f3475553768b10f84b5ce1d40fbd0e34e6bfbb864ee35858ad4dd2cf31e02fc4a154b724d7f1 - languageName: node - linkType: hard - -"inherits@npm:2.0.3": - version: 2.0.3 - resolution: "inherits@npm:2.0.3" - checksum: 78cb8d7d850d20a5e9a7f3620db31483aa00ad5f722ce03a55b110e5a723539b3716a3b463e2b96ce3fe286f33afc7c131fa2f91407528ba80cea98a7545d4c0 - languageName: node - linkType: hard - -"ini@npm:2.0.0": - version: 2.0.0 - resolution: "ini@npm:2.0.0" - checksum: e7aadc5fb2e4aefc666d74ee2160c073995a4061556b1b5b4241ecb19ad609243b9cceafe91bae49c219519394bbd31512516cb22a3b1ca6e66d869e0447e84e - languageName: node - linkType: hard - -"ini@npm:^1.3.4, ini@npm:^1.3.5, ini@npm:~1.3.0": - version: 1.3.8 - resolution: "ini@npm:1.3.8" - checksum: dfd98b0ca3a4fc1e323e38a6c8eb8936e31a97a918d3b377649ea15bdb15d481207a0dda1021efbd86b464cae29a0d33c1d7dcaf6c5672bee17fa849bc50a1b3 - languageName: node - linkType: hard - -"inline-style-prefixer@npm:^6.0.1": - version: 6.0.4 - resolution: "inline-style-prefixer@npm:6.0.4" - dependencies: - css-in-js-utils: ^3.1.0 - fast-loops: ^1.1.3 - checksum: caf7a75d18acbedc7e3b8bfac17563082becd2df6b65accad964a6afdf490329b42315c37fe65ba0177cc10fd32809eb40d62aba23a0118c74d87d4fc58defa2 - languageName: node - linkType: hard - -"inquirer-checkbox-plus-prompt@npm:^1.4.2": - version: 1.4.2 - resolution: "inquirer-checkbox-plus-prompt@npm:1.4.2" - dependencies: - chalk: 4.1.2 - cli-cursor: ^3.1.0 - figures: ^3.0.0 - lodash: ^4.17.5 - rxjs: ^6.6.7 - peerDependencies: - inquirer: < 9.x - checksum: 0bdadc94e4bd13cc3b918b3a7d343376939e5713ccceb51b28293649bd51c476aaa6aab6cafecf89c784cffcaf879c307ab3830a12d3e54ba7a26c6e81c85d27 - languageName: node - linkType: hard - -"inquirer@npm:^8.0.0, inquirer@npm:^8.2.5": - version: 8.2.6 - resolution: "inquirer@npm:8.2.6" - dependencies: - ansi-escapes: ^4.2.1 - chalk: ^4.1.1 - cli-cursor: ^3.1.0 - cli-width: ^3.0.0 - external-editor: ^3.0.3 - figures: ^3.0.0 - lodash: ^4.17.21 - mute-stream: 0.0.8 - ora: ^5.4.1 - run-async: ^2.4.0 - rxjs: ^7.5.5 - string-width: ^4.1.0 - strip-ansi: ^6.0.0 - through: ^2.3.6 - wrap-ansi: ^6.0.1 - checksum: 387ffb0a513559cc7414eb42c57556a60e302f820d6960e89d376d092e257a919961cd485a1b4de693dbb5c0de8bc58320bfd6247dfd827a873aa82a4215a240 - languageName: node - linkType: hard - -"internal-ip@npm:^4.3.0": - version: 4.3.0 - resolution: "internal-ip@npm:4.3.0" - dependencies: - default-gateway: ^4.2.0 - ipaddr.js: ^1.9.0 - checksum: c970433c84d9a6b46e2c9f5ab7785d3105b856d0a566891bf919241b5a884c5c1c9bf8e915aebb822a86c14b1b6867e58c1eaf5cd49eb023368083069d1a4a9a - languageName: node - linkType: hard - -"internal-slot@npm:^1.0.7": - version: 1.0.7 - resolution: "internal-slot@npm:1.0.7" - dependencies: - es-errors: ^1.3.0 - hasown: ^2.0.0 - side-channel: ^1.0.4 - checksum: cadc5eea5d7d9bc2342e93aae9f31f04c196afebb11bde97448327049f492cd7081e18623ae71388aac9cd237b692ca3a105be9c68ac39c1dec679d7409e33eb - languageName: node - linkType: hard - -"internmap@npm:1 - 2": - version: 2.0.3 - resolution: "internmap@npm:2.0.3" - checksum: 7ca41ec6aba8f0072fc32fa8a023450a9f44503e2d8e403583c55714b25efd6390c38a87161ec456bf42d7bc83aab62eb28f5aef34876b1ac4e60693d5e1d241 - languageName: node - linkType: hard - -"internmap@npm:^1.0.0": - version: 1.0.1 - resolution: "internmap@npm:1.0.1" - checksum: 9d00f8c0cf873a24a53a5a937120dab634c41f383105e066bb318a61864e6292d24eb9516e8e7dccfb4420ec42ca474a0f28ac9a6cc82536898fa09bbbe53813 - languageName: node - linkType: hard - -"interpret@npm:^1.0.0": - version: 1.4.0 - resolution: "interpret@npm:1.4.0" - checksum: 2e5f51268b5941e4a17e4ef0575bc91ed0ab5f8515e3cf77486f7c14d13f3010df9c0959f37063dcc96e78d12dc6b0bb1b9e111cdfe69771f4656d2993d36155 - languageName: node - linkType: hard - -"interpret@npm:^3.1.1": - version: 3.1.1 - resolution: "interpret@npm:3.1.1" - checksum: 35cebcf48c7351130437596d9ab8c8fe131ce4038da4561e6d665f25640e0034702a031cf7e3a5cea60ac7ac548bf17465e0571ede126f3d3a6933152171ac82 - languageName: node - linkType: hard - -"invariant@npm:2.2.4, invariant@npm:^2.2.2, invariant@npm:^2.2.4": - version: 2.2.4 - resolution: "invariant@npm:2.2.4" - dependencies: - loose-envify: ^1.0.0 - checksum: cc3182d793aad82a8d1f0af697b462939cb46066ec48bbf1707c150ad5fad6406137e91a262022c269702e01621f35ef60269f6c0d7fd178487959809acdfb14 - languageName: node - linkType: hard - -"io-ts@npm:1.10.4": - version: 1.10.4 - resolution: "io-ts@npm:1.10.4" - dependencies: - fp-ts: ^1.0.0 - checksum: 619134006778f7ca42693716ade7fc1a383079e7848bbeabc67a0e4ac9139cda6b2a88a052d539ab7d554033ee2ffe4dab5cb96b958c83fee2dff73d23f03e88 - languageName: node - linkType: hard - -"ioredis@npm:^5.3.2": - version: 5.3.2 - resolution: "ioredis@npm:5.3.2" - dependencies: - "@ioredis/commands": ^1.1.1 - cluster-key-slot: ^1.1.0 - debug: ^4.3.4 - denque: ^2.1.0 - lodash.defaults: ^4.2.0 - lodash.isarguments: ^3.1.0 - redis-errors: ^1.2.0 - redis-parser: ^3.0.0 - standard-as-callback: ^2.1.0 - checksum: 9a23559133e862a768778301efb68ae8c2af3c33562174b54a4c2d6574b976e85c75a4c34857991af733e35c48faf4c356e7daa8fb0a3543d85ff1768c8754bc - languageName: node - linkType: hard - -"ip-address@npm:^9.0.5": - version: 9.0.5 - resolution: "ip-address@npm:9.0.5" - dependencies: - jsbn: 1.1.0 - sprintf-js: ^1.1.3 - checksum: aa15f12cfd0ef5e38349744e3654bae649a34c3b10c77a674a167e99925d1549486c5b14730eebce9fea26f6db9d5e42097b00aa4f9f612e68c79121c71652dc - languageName: node - linkType: hard - -"ip-regex@npm:^2.1.0": - version: 2.1.0 - resolution: "ip-regex@npm:2.1.0" - checksum: 331d95052aa53ce245745ea0fc3a6a1e2e3c8d6da65fa8ea52bf73768c1b22a9ac50629d1d2b08c04e7b3ac4c21b536693c149ce2c2615ee4796030e5b3e3cba - languageName: node - linkType: hard - -"ip@npm:^1.1.4": - version: 1.1.8 - resolution: "ip@npm:1.1.8" - checksum: a2ade53eb339fb0cbe9e69a44caab10d6e3784662285eb5d2677117ee4facc33a64679051c35e0dfdb1a3983a51ce2f5d2cb36446d52e10d01881789b76e28fb - languageName: node - linkType: hard - -"ipaddr.js@npm:1.9.1, ipaddr.js@npm:^1.9.0": - version: 1.9.1 - resolution: "ipaddr.js@npm:1.9.1" - checksum: f88d3825981486f5a1942414c8d77dd6674dd71c065adcfa46f578d677edcb99fda25af42675cb59db492fdf427b34a5abfcde3982da11a8fd83a500b41cfe77 - languageName: node - linkType: hard - -"ipaddr.js@npm:^2.0.1": - version: 2.0.1 - resolution: "ipaddr.js@npm:2.0.1" - checksum: dd194a394a843d470f88d17191b0948f383ed1c8e320813f850c336a0fcb5e9215d97ec26ca35ab4fbbd31392c8b3467f3e8344628029ed3710b2ff6b5d1034e - languageName: node - linkType: hard - -"iron-webcrypto@npm:^1.0.0": - version: 1.0.0 - resolution: "iron-webcrypto@npm:1.0.0" - checksum: bbd96cbbfec7d072296bc7464763b96555bdadb12aca50f1f1c7e4fcdc6acb102bc3488333e924f94404dd50eda24f84b67ad28323b9138ec7255a023e8dc19e - languageName: node - linkType: hard - -"is-absolute@npm:^1.0.0": - version: 1.0.0 - resolution: "is-absolute@npm:1.0.0" - dependencies: - is-relative: ^1.0.0 - is-windows: ^1.0.1 - checksum: 9d16b2605eda3f3ce755410f1d423e327ad3a898bcb86c9354cf63970ed3f91ba85e9828aa56f5d6a952b9fae43d0477770f78d37409ae8ecc31e59ebc279b27 - languageName: node - linkType: hard - -"is-alphabetical@npm:^1.0.0": - version: 1.0.4 - resolution: "is-alphabetical@npm:1.0.4" - checksum: 6508cce44fd348f06705d377b260974f4ce68c74000e7da4045f0d919e568226dc3ce9685c5a2af272195384df6930f748ce9213fc9f399b5d31b362c66312cb - languageName: node - linkType: hard - -"is-alphanumerical@npm:^1.0.0": - version: 1.0.4 - resolution: "is-alphanumerical@npm:1.0.4" - dependencies: - is-alphabetical: ^1.0.0 - is-decimal: ^1.0.0 - checksum: e2e491acc16fcf5b363f7c726f666a9538dba0a043665740feb45bba1652457a73441e7c5179c6768a638ed396db3437e9905f403644ec7c468fb41f4813d03f - languageName: node - linkType: hard - -"is-arguments@npm:^1.0.4, is-arguments@npm:^1.1.1": - version: 1.1.1 - resolution: "is-arguments@npm:1.1.1" - dependencies: - call-bind: ^1.0.2 - has-tostringtag: ^1.0.0 - checksum: 7f02700ec2171b691ef3e4d0e3e6c0ba408e8434368504bb593d0d7c891c0dbfda6d19d30808b904a6cb1929bca648c061ba438c39f296c2a8ca083229c49f27 - languageName: node - linkType: hard - -"is-array-buffer@npm:^3.0.4": - version: 3.0.4 - resolution: "is-array-buffer@npm:3.0.4" - dependencies: - call-bind: ^1.0.2 - get-intrinsic: ^1.2.1 - checksum: e4e3e6ef0ff2239e75371d221f74bc3c26a03564a22efb39f6bb02609b598917ddeecef4e8c877df2a25888f247a98198959842a5e73236bc7f22cabdf6351a7 - languageName: node - linkType: hard - -"is-arrayish@npm:^0.2.1": - version: 0.2.1 - resolution: "is-arrayish@npm:0.2.1" - checksum: eef4417e3c10e60e2c810b6084942b3ead455af16c4509959a27e490e7aee87cfb3f38e01bbde92220b528a0ee1a18d52b787e1458ee86174d8c7f0e58cd488f - languageName: node - linkType: hard - -"is-arrayish@npm:^0.3.1": - version: 0.3.2 - resolution: "is-arrayish@npm:0.3.2" - checksum: 977e64f54d91c8f169b59afcd80ff19227e9f5c791fa28fa2e5bce355cbaf6c2c356711b734656e80c9dd4a854dd7efcf7894402f1031dfc5de5d620775b4d5f - languageName: node - linkType: hard - -"is-async-function@npm:^2.0.0": - version: 2.0.0 - resolution: "is-async-function@npm:2.0.0" - dependencies: - has-tostringtag: ^1.0.0 - checksum: e3471d95e6c014bf37cad8a93f2f4b6aac962178e0a5041e8903147166964fdc1c5c1d2ef87e86d77322c370ca18f2ea004fa7420581fa747bcaf7c223069dbd - languageName: node - linkType: hard - -"is-bigint@npm:^1.0.1": - version: 1.0.4 - resolution: "is-bigint@npm:1.0.4" - dependencies: - has-bigints: ^1.0.1 - checksum: c56edfe09b1154f8668e53ebe8252b6f185ee852a50f9b41e8d921cb2bed425652049fbe438723f6cb48a63ca1aa051e948e7e401e093477c99c84eba244f666 - languageName: node - linkType: hard - -"is-binary-path@npm:~2.1.0": - version: 2.1.0 - resolution: "is-binary-path@npm:2.1.0" - dependencies: - binary-extensions: ^2.0.0 - checksum: 84192eb88cff70d320426f35ecd63c3d6d495da9d805b19bc65b518984b7c0760280e57dbf119b7e9be6b161784a5a673ab2c6abe83abb5198a432232ad5b35c - languageName: node - linkType: hard - -"is-boolean-object@npm:^1.1.0": - version: 1.1.2 - resolution: "is-boolean-object@npm:1.1.2" - dependencies: - call-bind: ^1.0.2 - has-tostringtag: ^1.0.0 - checksum: c03b23dbaacadc18940defb12c1c0e3aaece7553ef58b162a0f6bba0c2a7e1551b59f365b91e00d2dbac0522392d576ef322628cb1d036a0fe51eb466db67222 - languageName: node - linkType: hard - -"is-buffer@npm:^1.1.4, is-buffer@npm:^1.1.5, is-buffer@npm:~1.1.1": - version: 1.1.6 - resolution: "is-buffer@npm:1.1.6" - checksum: 4a186d995d8bbf9153b4bd9ff9fd04ae75068fe695d29025d25e592d9488911eeece84eefbd8fa41b8ddcc0711058a71d4c466dcf6f1f6e1d83830052d8ca707 - languageName: node - linkType: hard - -"is-bun-module@npm:^1.0.2": - version: 1.2.1 - resolution: "is-bun-module@npm:1.2.1" - dependencies: - semver: ^7.6.3 - checksum: 1c2cbcf1a76991add1b640d2d7fe09848e8697a76f96e1289dff44133a48c97f5dc601d4a66d3f3a86217a77178d72d33d10d0c9e14194e58e70ec8df3eae41a - languageName: node - linkType: hard - -"is-callable@npm:^1.1.3, is-callable@npm:^1.1.4, is-callable@npm:^1.2.7": - version: 1.2.7 - resolution: "is-callable@npm:1.2.7" - checksum: 61fd57d03b0d984e2ed3720fb1c7a897827ea174bd44402878e059542ea8c4aeedee0ea0985998aa5cc2736b2fa6e271c08587addb5b3959ac52cf665173d1ac - languageName: node - linkType: hard - -"is-ci@npm:^1.0.10": - version: 1.2.1 - resolution: "is-ci@npm:1.2.1" - dependencies: - ci-info: ^1.5.0 - bin: - is-ci: bin.js - checksum: eca06c5626e54ec01be6f9114a8f19b3f571602cfe66458e42ccc42e401e2ebbe1bd3b2fcaa93b5896b9c759e964f3c7f4d9b2d0f4fc4ef5dba78a7c4825e0be - languageName: node - linkType: hard - -"is-ci@npm:^3.0.1": - version: 3.0.1 - resolution: "is-ci@npm:3.0.1" - dependencies: - ci-info: ^3.2.0 - bin: - is-ci: bin.js - checksum: 192c66dc7826d58f803ecae624860dccf1899fc1f3ac5505284c0a5cf5f889046ffeb958fa651e5725d5705c5bcb14f055b79150ea5fcad7456a9569de60260e - languageName: node - linkType: hard - -"is-core-module@npm:2.13.0": - version: 2.13.0 - resolution: "is-core-module@npm:2.13.0" - dependencies: - has: ^1.0.3 - checksum: 053ab101fb390bfeb2333360fd131387bed54e476b26860dc7f5a700bbf34a0ec4454f7c8c4d43e8a0030957e4b3db6e16d35e1890ea6fb654c833095e040355 - languageName: node - linkType: hard - -"is-data-view@npm:^1.0.1": - version: 1.0.1 - resolution: "is-data-view@npm:1.0.1" - dependencies: - is-typed-array: ^1.1.13 - checksum: 4ba4562ac2b2ec005fefe48269d6bd0152785458cd253c746154ffb8a8ab506a29d0cfb3b74af87513843776a88e4981ae25c89457bf640a33748eab1a7216b5 - languageName: node - linkType: hard - -"is-date-object@npm:^1.0.1, is-date-object@npm:^1.0.5": - version: 1.0.5 - resolution: "is-date-object@npm:1.0.5" - dependencies: - has-tostringtag: ^1.0.0 - checksum: baa9077cdf15eb7b58c79398604ca57379b2fc4cf9aa7a9b9e295278648f628c9b201400c01c5e0f7afae56507d741185730307cbe7cad3b9f90a77e5ee342fc - languageName: node - linkType: hard - -"is-decimal@npm:^1.0.0": - version: 1.0.4 - resolution: "is-decimal@npm:1.0.4" - checksum: ed483a387517856dc395c68403a10201fddcc1b63dc56513fbe2fe86ab38766120090ecdbfed89223d84ca8b1cd28b0641b93cb6597b6e8f4c097a7c24e3fb96 - languageName: node - linkType: hard - -"is-directory@npm:^0.3.1": - version: 0.3.1 - resolution: "is-directory@npm:0.3.1" - checksum: dce9a9d3981e38f2ded2a80848734824c50ee8680cd09aa477bef617949715cfc987197a2ca0176c58a9fb192a1a0d69b535c397140d241996a609d5906ae524 - languageName: node - linkType: hard - -"is-docker@npm:^2.0.0, is-docker@npm:^2.1.1": - version: 2.2.1 - resolution: "is-docker@npm:2.2.1" - bin: - is-docker: cli.js - checksum: 3fef7ddbf0be25958e8991ad941901bf5922ab2753c46980b60b05c1bf9c9c2402d35e6dc32e4380b980ef5e1970a5d9d5e5aa2e02d77727c3b6b5e918474c56 - languageName: node - linkType: hard - -"is-docker@npm:^3.0.0": - version: 3.0.0 - resolution: "is-docker@npm:3.0.0" - bin: - is-docker: cli.js - checksum: b698118f04feb7eaf3338922bd79cba064ea54a1c3db6ec8c0c8d8ee7613e7e5854d802d3ef646812a8a3ace81182a085dfa0a71cc68b06f3fa794b9783b3c90 - languageName: node - linkType: hard - -"is-electron@npm:2.2.2": - version: 2.2.2 - resolution: "is-electron@npm:2.2.2" - checksum: de5aa8bd8d72c96675b8d0f93fab4cc21f62be5440f65bc05c61338ca27bd851a64200f31f1bf9facbaa01b3dbfed7997b2186741d84b93b63e0aff1db6a9494 - languageName: node - linkType: hard - -"is-extendable@npm:^0.1.0, is-extendable@npm:^0.1.1": - version: 0.1.1 - resolution: "is-extendable@npm:0.1.1" - checksum: 3875571d20a7563772ecc7a5f36cb03167e9be31ad259041b4a8f73f33f885441f778cee1f1fe0085eb4bc71679b9d8c923690003a36a6a5fdf8023e6e3f0672 - languageName: node - linkType: hard - -"is-extglob@npm:^2.1.0, is-extglob@npm:^2.1.1": - version: 2.1.1 - resolution: "is-extglob@npm:2.1.1" - checksum: df033653d06d0eb567461e58a7a8c9f940bd8c22274b94bf7671ab36df5719791aae15eef6d83bbb5e23283967f2f984b8914559d4449efda578c775c4be6f85 - languageName: node - linkType: hard - -"is-finalizationregistry@npm:^1.0.2": - version: 1.0.2 - resolution: "is-finalizationregistry@npm:1.0.2" - dependencies: - call-bind: ^1.0.2 - checksum: 4f243a8e06228cd45bdab8608d2cb7abfc20f6f0189c8ac21ea8d603f1f196eabd531ce0bb8e08cbab047e9845ef2c191a3761c9a17ad5cabf8b35499c4ad35d - languageName: node - linkType: hard - -"is-fullwidth-code-point@npm:^1.0.0": - version: 1.0.0 - resolution: "is-fullwidth-code-point@npm:1.0.0" - dependencies: - number-is-nan: ^1.0.0 - checksum: 4d46a7465a66a8aebcc5340d3b63a56602133874af576a9ca42c6f0f4bd787a743605771c5f246db77da96605fefeffb65fc1dbe862dcc7328f4b4d03edf5a57 - languageName: node - linkType: hard - -"is-fullwidth-code-point@npm:^2.0.0": - version: 2.0.0 - resolution: "is-fullwidth-code-point@npm:2.0.0" - checksum: eef9c6e15f68085fec19ff6a978a6f1b8f48018fd1265035552078ee945573594933b09bbd6f562553e2a241561439f1ef5339276eba68d272001343084cfab8 - languageName: node - linkType: hard - -"is-fullwidth-code-point@npm:^3.0.0": - version: 3.0.0 - resolution: "is-fullwidth-code-point@npm:3.0.0" - checksum: 44a30c29457c7fb8f00297bce733f0a64cd22eca270f83e58c105e0d015e45c019491a4ab2faef91ab51d4738c670daff901c799f6a700e27f7314029e99e348 - languageName: node - linkType: hard - -"is-fullwidth-code-point@npm:^4.0.0": - version: 4.0.0 - resolution: "is-fullwidth-code-point@npm:4.0.0" - checksum: 8ae89bf5057bdf4f57b346fb6c55e9c3dd2549983d54191d722d5c739397a903012cc41a04ee3403fd872e811243ef91a7c5196da7b5841dc6b6aae31a264a8d - languageName: node - linkType: hard - -"is-function@npm:^1.0.1": - version: 1.0.2 - resolution: "is-function@npm:1.0.2" - checksum: 7d564562e07b4b51359547d3ccc10fb93bb392fd1b8177ae2601ee4982a0ece86d952323fc172a9000743a3971f09689495ab78a1d49a9b14fc97a7e28521dc0 - languageName: node - linkType: hard - -"is-generator-fn@npm:^2.0.0": - version: 2.1.0 - resolution: "is-generator-fn@npm:2.1.0" - checksum: a6ad5492cf9d1746f73b6744e0c43c0020510b59d56ddcb78a91cbc173f09b5e6beff53d75c9c5a29feb618bfef2bf458e025ecf3a57ad2268e2fb2569f56215 - languageName: node - linkType: hard - -"is-generator-function@npm:^1.0.10, is-generator-function@npm:^1.0.7": - version: 1.0.10 - resolution: "is-generator-function@npm:1.0.10" - dependencies: - has-tostringtag: ^1.0.0 - checksum: d54644e7dbaccef15ceb1e5d91d680eb5068c9ee9f9eb0a9e04173eb5542c9b51b5ab52c5537f5703e48d5fddfd376817c1ca07a84a407b7115b769d4bdde72b - languageName: node - linkType: hard - -"is-glob@npm:4.0.3, is-glob@npm:^4.0.0, is-glob@npm:^4.0.1, is-glob@npm:^4.0.3, is-glob@npm:~4.0.1": - version: 4.0.3 - resolution: "is-glob@npm:4.0.3" - dependencies: - is-extglob: ^2.1.1 - checksum: d381c1319fcb69d341cc6e6c7cd588e17cd94722d9a32dbd60660b993c4fb7d0f19438674e68dfec686d09b7c73139c9166b47597f846af387450224a8101ab4 - languageName: node - linkType: hard - -"is-glob@npm:^3.1.0": - version: 3.1.0 - resolution: "is-glob@npm:3.1.0" - dependencies: - is-extglob: ^2.1.0 - checksum: 9d483bca84f16f01230f7c7c8c63735248fe1064346f292e0f6f8c76475fd20c6f50fc19941af5bec35f85d6bf26f4b7768f39a48a5f5fdc72b408dc74e07afc - languageName: node - linkType: hard - -"is-hex-prefixed@npm:1.0.0": - version: 1.0.0 - resolution: "is-hex-prefixed@npm:1.0.0" - checksum: 5ac58e6e528fb029cc43140f6eeb380fad23d0041cc23154b87f7c9a1b728bcf05909974e47248fd0b7fcc11ba33cf7e58d64804883056fabd23e2b898be41de - languageName: node - linkType: hard - -"is-hexadecimal@npm:^1.0.0": - version: 1.0.4 - resolution: "is-hexadecimal@npm:1.0.4" - checksum: a452e047587b6069332d83130f54d30da4faf2f2ebaa2ce6d073c27b5703d030d58ed9e0b729c8e4e5b52c6f1dab26781bb77b7bc6c7805f14f320e328ff8cd5 - languageName: node - linkType: hard - -"is-inside-container@npm:^1.0.0": - version: 1.0.0 - resolution: "is-inside-container@npm:1.0.0" - dependencies: - is-docker: ^3.0.0 - bin: - is-inside-container: cli.js - checksum: c50b75a2ab66ab3e8b92b3bc534e1ea72ca25766832c0623ac22d134116a98bcf012197d1caabe1d1c4bd5f84363d4aa5c36bb4b585fbcaf57be172cd10a1a03 - languageName: node - linkType: hard - -"is-installed-globally@npm:^0.1.0": - version: 0.1.0 - resolution: "is-installed-globally@npm:0.1.0" - dependencies: - global-dirs: ^0.1.0 - is-path-inside: ^1.0.0 - checksum: 45a27b3cfa46a174d1b430102cab7a6b5cd7da5d0e0917d3c3478a9f18b9974892534025ab1115d790cfb1d3958f2736fd22057e2eef289cf31820dafdc486e6 - languageName: node - linkType: hard - -"is-installed-globally@npm:~0.4.0": - version: 0.4.0 - resolution: "is-installed-globally@npm:0.4.0" - dependencies: - global-dirs: ^3.0.0 - is-path-inside: ^3.0.2 - checksum: 3359840d5982d22e9b350034237b2cda2a12bac1b48a721912e1ab8e0631dd07d45a2797a120b7b87552759a65ba03e819f1bd63f2d7ab8657ec0b44ee0bf399 - languageName: node - linkType: hard - -"is-interactive@npm:^1.0.0": - version: 1.0.0 - resolution: "is-interactive@npm:1.0.0" - checksum: 824808776e2d468b2916cdd6c16acacebce060d844c35ca6d82267da692e92c3a16fdba624c50b54a63f38bdc4016055b6f443ce57d7147240de4f8cdabaf6f9 - languageName: node - linkType: hard - -"is-lambda@npm:^1.0.1": - version: 1.0.1 - resolution: "is-lambda@npm:1.0.1" - checksum: 93a32f01940220532e5948538699ad610d5924ac86093fcee83022252b363eb0cc99ba53ab084a04e4fb62bf7b5731f55496257a4c38adf87af9c4d352c71c35 - languageName: node - linkType: hard - -"is-lower-case@npm:^2.0.2": - version: 2.0.2 - resolution: "is-lower-case@npm:2.0.2" - dependencies: - tslib: ^2.0.3 - checksum: ba57dd1201e15fd9b590654736afccf1b3b68e919f40c23ef13b00ebcc639b1d9c2f81fe86415bff3e8eccffec459786c9ac9dc8f3a19cfa4484206c411c1d7d - languageName: node - linkType: hard - -"is-map@npm:^2.0.1": - version: 2.0.2 - resolution: "is-map@npm:2.0.2" - checksum: ace3d0ecd667bbdefdb1852de601268f67f2db725624b1958f279316e13fecb8fa7df91fd60f690d7417b4ec180712f5a7ee967008e27c65cfd475cc84337728 - languageName: node - linkType: hard - -"is-module@npm:^1.0.0": - version: 1.0.0 - resolution: "is-module@npm:1.0.0" - checksum: 8cd5390730c7976fb4e8546dd0b38865ee6f7bacfa08dfbb2cc07219606755f0b01709d9361e01f13009bbbd8099fa2927a8ed665118a6105d66e40f1b838c3f - languageName: node - linkType: hard - -"is-nan@npm:^1.2.1": - version: 1.3.2 - resolution: "is-nan@npm:1.3.2" - dependencies: - call-bind: ^1.0.0 - define-properties: ^1.1.3 - checksum: 5dfadcef6ad12d3029d43643d9800adbba21cf3ce2ec849f734b0e14ee8da4070d82b15fdb35138716d02587c6578225b9a22779cab34888a139cc43e4e3610a - languageName: node - linkType: hard - -"is-negated-glob@npm:^1.0.0": - version: 1.0.0 - resolution: "is-negated-glob@npm:1.0.0" - checksum: 2a767da06435b492daa98d3049480f0b7032abd5bfd3930ac01dbe9d6fcae04f2b3d883c6dca6b9c0c3f8a703952643c78540151c3eb1a2fe90fec543d61d241 - languageName: node - linkType: hard - -"is-negative-zero@npm:^2.0.3": - version: 2.0.3 - resolution: "is-negative-zero@npm:2.0.3" - checksum: c1e6b23d2070c0539d7b36022d5a94407132411d01aba39ec549af824231f3804b1aea90b5e4e58e807a65d23ceb538ed6e355ce76b267bdd86edb757ffcbdcd - languageName: node - linkType: hard - -"is-npm@npm:^1.0.0": - version: 1.0.0 - resolution: "is-npm@npm:1.0.0" - checksum: 7992bd56bddf001c610b80c9892eea633993f15b73a5de53426cf5cb30d5e5a889aac575f02d4d339fb5a9b7f0a66c454001cfa6cd2541da96d2d675cabd9a1d - languageName: node - linkType: hard - -"is-number-object@npm:^1.0.4": - version: 1.0.6 - resolution: "is-number-object@npm:1.0.6" - dependencies: - has-tostringtag: ^1.0.0 - checksum: c697704e8fc2027fc41cb81d29805de4e8b6dc9c3efee93741dbf126a8ecc8443fef85adbc581415ae7e55d325e51d0a942324ae35c829131748cce39cba55f3 - languageName: node - linkType: hard - -"is-number@npm:^7.0.0": - version: 7.0.0 - resolution: "is-number@npm:7.0.0" - checksum: 456ac6f8e0f3111ed34668a624e45315201dff921e5ac181f8ec24923b99e9f32ca1a194912dc79d539c97d33dba17dc635202ff0b2cf98326f608323276d27a - languageName: node - linkType: hard - -"is-obj@npm:^1.0.0, is-obj@npm:^1.0.1": - version: 1.0.1 - resolution: "is-obj@npm:1.0.1" - checksum: 3ccf0efdea12951e0b9c784e2b00e77e87b2f8bd30b42a498548a8afcc11b3287342a2030c308e473e93a7a19c9ea7854c99a8832a476591c727df2a9c79796c - languageName: node - linkType: hard - -"is-obj@npm:^2.0.0": - version: 2.0.0 - resolution: "is-obj@npm:2.0.0" - checksum: c9916ac8f4621962a42f5e80e7ffdb1d79a3fab7456ceaeea394cd9e0858d04f985a9ace45be44433bf605673c8be8810540fe4cc7f4266fc7526ced95af5a08 - languageName: node - linkType: hard - -"is-path-cwd@npm:^2.0.0, is-path-cwd@npm:^2.2.0": - version: 2.2.0 - resolution: "is-path-cwd@npm:2.2.0" - checksum: 46a840921bb8cc0dc7b5b423a14220e7db338072a4495743a8230533ce78812dc152548c86f4b828411fe98c5451959f07cf841c6a19f611e46600bd699e8048 - languageName: node - linkType: hard - -"is-path-in-cwd@npm:^2.0.0": - version: 2.1.0 - resolution: "is-path-in-cwd@npm:2.1.0" - dependencies: - is-path-inside: ^2.1.0 - checksum: 6b01b3f8c9172e9682ea878d001836a0cc5a78cbe6236024365d478c2c9e384da2417e5f21f2ad2da2761d0465309fc5baf6e71187d2a23f0058da69790f7f48 - languageName: node - linkType: hard - -"is-path-inside@npm:^1.0.0": - version: 1.0.1 - resolution: "is-path-inside@npm:1.0.1" - dependencies: - path-is-inside: ^1.0.1 - checksum: 07e52c81163937ff89b4700b7ad474de3b396846b55ed87530fb0a22cb9103926152939f673bc1a0592448e7e4e9d75eb734be21b4ad411311065c6a509fae54 - languageName: node - linkType: hard - -"is-path-inside@npm:^2.1.0": - version: 2.1.0 - resolution: "is-path-inside@npm:2.1.0" - dependencies: - path-is-inside: ^1.0.2 - checksum: 6ca34dbd84d5c50a3ee1547afb6ada9b06d556a4ff42da9b303797e4acc3ac086516a4833030aa570f397f8c58dacabd57ee8e6c2ce8b2396a986ad2af10fcaf - languageName: node - linkType: hard - -"is-path-inside@npm:^3.0.2, is-path-inside@npm:^3.0.3": - version: 3.0.3 - resolution: "is-path-inside@npm:3.0.3" - checksum: abd50f06186a052b349c15e55b182326f1936c89a78bf6c8f2b707412517c097ce04bc49a0ca221787bc44e1049f51f09a2ffb63d22899051988d3a618ba13e9 - languageName: node - linkType: hard - -"is-plain-obj@npm:^1.1.0": - version: 1.1.0 - resolution: "is-plain-obj@npm:1.1.0" - checksum: 0ee04807797aad50859652a7467481816cbb57e5cc97d813a7dcd8915da8195dc68c436010bf39d195226cde6a2d352f4b815f16f26b7bf486a5754290629931 - languageName: node - linkType: hard - -"is-plain-obj@npm:^2.1.0": - version: 2.1.0 - resolution: "is-plain-obj@npm:2.1.0" - checksum: cec9100678b0a9fe0248a81743041ed990c2d4c99f893d935545cfbc42876cbe86d207f3b895700c690ad2fa520e568c44afc1605044b535a7820c1d40e38daa - languageName: node - linkType: hard - -"is-plain-obj@npm:^3.0.0": - version: 3.0.0 - resolution: "is-plain-obj@npm:3.0.0" - checksum: a6ebdf8e12ab73f33530641972a72a4b8aed6df04f762070d823808303e4f76d87d5ea5bd76f96a7bbe83d93f04ac7764429c29413bd9049853a69cb630fb21c - languageName: node - linkType: hard - -"is-plain-obj@npm:^4.0.0": - version: 4.1.0 - resolution: "is-plain-obj@npm:4.1.0" - checksum: 6dc45da70d04a81f35c9310971e78a6a3c7a63547ef782e3a07ee3674695081b6ca4e977fbb8efc48dae3375e0b34558d2bcd722aec9bddfa2d7db5b041be8ce - languageName: node - linkType: hard - -"is-plain-object@npm:^2.0.4": - version: 2.0.4 - resolution: "is-plain-object@npm:2.0.4" - dependencies: - isobject: ^3.0.1 - checksum: 2a401140cfd86cabe25214956ae2cfee6fbd8186809555cd0e84574f88de7b17abacb2e477a6a658fa54c6083ecbda1e6ae404c7720244cd198903848fca70ca - languageName: node - linkType: hard - -"is-plain-object@npm:^5.0.0": - version: 5.0.0 - resolution: "is-plain-object@npm:5.0.0" - checksum: e32d27061eef62c0847d303125440a38660517e586f2f3db7c9d179ae5b6674ab0f469d519b2e25c147a1a3bc87156d0d5f4d8821e0ce4a9ee7fe1fcf11ce45c - languageName: node - linkType: hard - -"is-port-reachable@npm:4.0.0": - version: 4.0.0 - resolution: "is-port-reachable@npm:4.0.0" - checksum: 47b7e10db8edcef27fbf9e50f0de85ad368d35688790ca64a13db67260111ac5f4b98989b11af06199fa93f25d810bd09a5b21b2c2646529668638f7c34d3c04 - languageName: node - linkType: hard - -"is-potential-custom-element-name@npm:^1.0.1": - version: 1.0.1 - resolution: "is-potential-custom-element-name@npm:1.0.1" - checksum: ced7bbbb6433a5b684af581872afe0e1767e2d1146b2207ca0068a648fb5cab9d898495d1ac0583524faaf24ca98176a7d9876363097c2d14fee6dd324f3a1ab - languageName: node - linkType: hard - -"is-primitive@npm:^3.0.1": - version: 3.0.1 - resolution: "is-primitive@npm:3.0.1" - checksum: c4da6a6e6d487f31d85b9259b67695fffcc75dca6c9612b0a002e3050c734227b9911be09b877539ec6309710229c19f4edd0f9e26ed2a67924ee0916baf0bed - languageName: node - linkType: hard - -"is-redirect@npm:^1.0.0": - version: 1.0.0 - resolution: "is-redirect@npm:1.0.0" - checksum: 25dd3d9943f57ef0f29d28e2d9deda8288e0c7098ddc65abec3364ced9a6491ea06cfaf5110c61fc40ec1fde706b73cee5d171f85278edbf4e409b85725bfea7 - languageName: node - linkType: hard - -"is-regex@npm:^1.1.4": - version: 1.1.4 - resolution: "is-regex@npm:1.1.4" - dependencies: - call-bind: ^1.0.2 - has-tostringtag: ^1.0.0 - checksum: 362399b33535bc8f386d96c45c9feb04cf7f8b41c182f54174c1a45c9abbbe5e31290bbad09a458583ff6bf3b2048672cdb1881b13289569a7c548370856a652 - languageName: node - linkType: hard - -"is-regexp@npm:^1.0.0": - version: 1.0.0 - resolution: "is-regexp@npm:1.0.0" - checksum: be692828e24cba479ec33644326fa98959ec68ba77965e0291088c1a741feaea4919d79f8031708f85fd25e39de002b4520622b55460660b9c369e6f7187faef - languageName: node - linkType: hard - -"is-relative-path@npm:^1.0.2": - version: 1.0.2 - resolution: "is-relative-path@npm:1.0.2" - checksum: 6c2ccffd3c0a3e3990535d0571370883d558b825b51940085f3446ec338857f4552f44521dfec3e83b7e067de08c0b0369de290208a91200bcae2c569533e340 - languageName: node - linkType: hard - -"is-relative@npm:^1.0.0": - version: 1.0.0 - resolution: "is-relative@npm:1.0.0" - dependencies: - is-unc-path: ^1.0.0 - checksum: 3271a0df109302ef5e14a29dcd5d23d9788e15ade91a40b942b035827ffbb59f7ce9ff82d036ea798541a52913cbf9d2d0b66456340887b51f3542d57b5a4c05 - languageName: node - linkType: hard - -"is-retry-allowed@npm:^1.0.0": - version: 1.2.0 - resolution: "is-retry-allowed@npm:1.2.0" - checksum: 50d700a89ae31926b1c91b3eb0104dbceeac8790d8b80d02f5c76d9a75c2056f1bb24b5268a8a018dead606bddf116b2262e5ac07401eb8b8783b266ed22558d - languageName: node - linkType: hard - -"is-root@npm:^2.1.0": - version: 2.1.0 - resolution: "is-root@npm:2.1.0" - checksum: 37eea0822a2a9123feb58a9d101558ba276771a6d830f87005683349a9acff15958a9ca590a44e778c6b335660b83e85c744789080d734f6081a935a4880aee2 - languageName: node - linkType: hard - -"is-set@npm:^2.0.1": - version: 2.0.2 - resolution: "is-set@npm:2.0.2" - checksum: b64343faf45e9387b97a6fd32be632ee7b269bd8183701f3b3f5b71a7cf00d04450ed8669d0bd08753e08b968beda96fca73a10fd0ff56a32603f64deba55a57 - languageName: node - linkType: hard - -"is-shared-array-buffer@npm:^1.0.2, is-shared-array-buffer@npm:^1.0.3": - version: 1.0.3 - resolution: "is-shared-array-buffer@npm:1.0.3" - dependencies: - call-bind: ^1.0.7 - checksum: a4fff602c309e64ccaa83b859255a43bb011145a42d3f56f67d9268b55bc7e6d98a5981a1d834186ad3105d6739d21547083fe7259c76c0468483fc538e716d8 - languageName: node - linkType: hard - -"is-stream@npm:^1.0.0, is-stream@npm:^1.1.0": - version: 1.1.0 - resolution: "is-stream@npm:1.1.0" - checksum: 063c6bec9d5647aa6d42108d4c59723d2bd4ae42135a2d4db6eadbd49b7ea05b750fd69d279e5c7c45cf9da753ad2c00d8978be354d65aa9f6bb434969c6a2ae - languageName: node - linkType: hard - -"is-stream@npm:^2, is-stream@npm:^2.0.0": - version: 2.0.1 - resolution: "is-stream@npm:2.0.1" - checksum: b8e05ccdf96ac330ea83c12450304d4a591f9958c11fd17bed240af8d5ffe08aedafa4c0f4cfccd4d28dc9d4d129daca1023633d5c11601a6cbc77521f6fae66 - languageName: node - linkType: hard - -"is-stream@npm:^3.0.0": - version: 3.0.0 - resolution: "is-stream@npm:3.0.0" - checksum: 172093fe99119ffd07611ab6d1bcccfe8bc4aa80d864b15f43e63e54b7abc71e779acd69afdb854c4e2a67fdc16ae710e370eda40088d1cfc956a50ed82d8f16 - languageName: node - linkType: hard - -"is-string@npm:^1.0.5, is-string@npm:^1.0.7": - version: 1.0.7 - resolution: "is-string@npm:1.0.7" - dependencies: - has-tostringtag: ^1.0.0 - checksum: 323b3d04622f78d45077cf89aab783b2f49d24dc641aa89b5ad1a72114cfeff2585efc8c12ef42466dff32bde93d839ad321b26884cf75e5a7892a938b089989 - languageName: node - linkType: hard - -"is-symbol@npm:^1.0.2, is-symbol@npm:^1.0.3": - version: 1.0.4 - resolution: "is-symbol@npm:1.0.4" - dependencies: - has-symbols: ^1.0.2 - checksum: 92805812ef590738d9de49d677cd17dfd486794773fb6fa0032d16452af46e9b91bb43ffe82c983570f015b37136f4b53b28b8523bfb10b0ece7a66c31a54510 - languageName: node - linkType: hard - -"is-text-path@npm:^1.0.1": - version: 1.0.1 - resolution: "is-text-path@npm:1.0.1" - dependencies: - text-extensions: ^1.0.0 - checksum: fb5d78752c22b3f73a7c9540768f765ffcfa38c9e421e2b9af869565307fa1ae5e3d3a2ba016a43549742856846566d327da406e94a5846ec838a288b1704fd2 - languageName: node - linkType: hard - -"is-typed-array@npm:^1.1.13, is-typed-array@npm:^1.1.3": - version: 1.1.13 - resolution: "is-typed-array@npm:1.1.13" - dependencies: - which-typed-array: ^1.1.14 - checksum: 150f9ada183a61554c91e1c4290086d2c100b0dff45f60b028519be72a8db964da403c48760723bf5253979b8dffe7b544246e0e5351dcd05c5fdb1dcc1dc0f0 - languageName: node - linkType: hard - -"is-typedarray@npm:^1.0.0, is-typedarray@npm:~1.0.0": - version: 1.0.0 - resolution: "is-typedarray@npm:1.0.0" - checksum: 3508c6cd0a9ee2e0df2fa2e9baabcdc89e911c7bd5cf64604586697212feec525aa21050e48affb5ffc3df20f0f5d2e2cf79b08caa64e1ccc9578e251763aef7 - languageName: node - linkType: hard - -"is-unc-path@npm:^1.0.0": - version: 1.0.0 - resolution: "is-unc-path@npm:1.0.0" - dependencies: - unc-path-regex: ^0.1.2 - checksum: e8abfde203f7409f5b03a5f1f8636e3a41e78b983702ef49d9343eb608cdfe691429398e8815157519b987b739bcfbc73ae7cf4c8582b0ab66add5171088eab6 - languageName: node - linkType: hard - -"is-unicode-supported@npm:^0.1.0": - version: 0.1.0 - resolution: "is-unicode-supported@npm:0.1.0" - checksum: a2aab86ee7712f5c2f999180daaba5f361bdad1efadc9610ff5b8ab5495b86e4f627839d085c6530363c6d6d4ecbde340fb8e54bdb83da4ba8e0865ed5513c52 - languageName: node - linkType: hard - -"is-upper-case@npm:^2.0.2": - version: 2.0.2 - resolution: "is-upper-case@npm:2.0.2" - dependencies: - tslib: ^2.0.3 - checksum: cf4fd43c00c2e72cd5cff911923070b89f0933b464941bd782e2315385f80b5a5acd772db3b796542e5e3cfed735f4dffd88c54d62db1ebfc5c3daa7b1af2bc6 - languageName: node - linkType: hard - -"is-url-superb@npm:^4.0.0": - version: 4.0.0 - resolution: "is-url-superb@npm:4.0.0" - checksum: fd55e91c96349acb0d688f95fcb1ac67450e5db934976e3a8ff13ef446841e779a6f4d18b15f02331f05a3429c8fdaba2382ac1ab444059e86e9ffcde1ec8db0 - languageName: node - linkType: hard - -"is-url@npm:^1.2.4": - version: 1.2.4 - resolution: "is-url@npm:1.2.4" - checksum: 100e74b3b1feab87a43ef7653736e88d997eb7bd32e71fd3ebc413e58c1cbe56269699c776aaea84244b0567f2a7d68dfaa512a062293ed2f9fdecb394148432 - languageName: node - linkType: hard - -"is-utf8@npm:^0.2.1": - version: 0.2.1 - resolution: "is-utf8@npm:0.2.1" - checksum: 167ccd2be869fc228cc62c1a28df4b78c6b5485d15a29027d3b5dceb09b383e86a3522008b56dcac14b592b22f0a224388718c2505027a994fd8471465de54b3 - languageName: node - linkType: hard - -"is-valid-glob@npm:^1.0.0": - version: 1.0.0 - resolution: "is-valid-glob@npm:1.0.0" - checksum: 0155951e89291d405cbb2ff4e25a38ee7a88bc70b05f246c25d31a1d09f13d4207377e5860f67443bbda8e3e353da37047b60e586bd9c97a39c9301c30b67acb - languageName: node - linkType: hard - -"is-weakmap@npm:^2.0.1": - version: 2.0.1 - resolution: "is-weakmap@npm:2.0.1" - checksum: 1222bb7e90c32bdb949226e66d26cb7bce12e1e28e3e1b40bfa6b390ba3e08192a8664a703dff2a00a84825f4e022f9cd58c4599ff9981ab72b1d69479f4f7f6 - languageName: node - linkType: hard - -"is-weakref@npm:^1.0.2": - version: 1.0.2 - resolution: "is-weakref@npm:1.0.2" - dependencies: - call-bind: ^1.0.2 - checksum: 95bd9a57cdcb58c63b1c401c60a474b0f45b94719c30f548c891860f051bc2231575c290a6b420c6bc6e7ed99459d424c652bd5bf9a1d5259505dc35b4bf83de - languageName: node - linkType: hard - -"is-weakset@npm:^2.0.1": - version: 2.0.2 - resolution: "is-weakset@npm:2.0.2" - dependencies: - call-bind: ^1.0.2 - get-intrinsic: ^1.1.1 - checksum: 5d8698d1fa599a0635d7ca85be9c26d547b317ed8fd83fc75f03efbe75d50001b5eececb1e9971de85fcde84f69ae6f8346bc92d20d55d46201d328e4c74a367 - languageName: node - linkType: hard - -"is-whitespace-character@npm:^1.0.0": - version: 1.0.4 - resolution: "is-whitespace-character@npm:1.0.4" - checksum: adab8ad9847ccfcb6f1b7000b8f622881b5ba2a09ce8be2794a6d2b10c3af325b469fc562c9fb889f468eed27be06e227ac609d0aa1e3a59b4dbcc88e2b0418e - languageName: node - linkType: hard - -"is-windows@npm:^1.0.1": - version: 1.0.2 - resolution: "is-windows@npm:1.0.2" - checksum: 438b7e52656fe3b9b293b180defb4e448088e7023a523ec21a91a80b9ff8cdb3377ddb5b6e60f7c7de4fa8b63ab56e121b6705fe081b3cf1b828b0a380009ad7 - languageName: node - linkType: hard - -"is-word-character@npm:^1.0.0": - version: 1.0.4 - resolution: "is-word-character@npm:1.0.4" - checksum: 1821d6c6abe5bc0b3abe3fdc565d66d7c8a74ea4e93bc77b4a47d26e2e2a306d6ab7d92b353b0d2b182869e3ecaa8f4a346c62d0e31d38ebc0ceaf7cae182c3f - languageName: node - linkType: hard - -"is-wsl@npm:^1.1.0": - version: 1.1.0 - resolution: "is-wsl@npm:1.1.0" - checksum: ea157d232351e68c92bd62fc541771096942fe72f69dff452dd26dcc31466258c570a3b04b8cda2e01cd2968255b02951b8670d08ea4ed76d6b1a646061ac4fe - languageName: node - linkType: hard - -"is-wsl@npm:^2.1.1, is-wsl@npm:^2.2.0": - version: 2.2.0 - resolution: "is-wsl@npm:2.2.0" - dependencies: - is-docker: ^2.0.0 - checksum: 20849846ae414997d290b75e16868e5261e86ff5047f104027026fd61d8b5a9b0b3ade16239f35e1a067b3c7cc02f70183cb661010ed16f4b6c7c93dad1b19d8 - languageName: node - linkType: hard - -"is-wsl@npm:^3.1.0": - version: 3.1.0 - resolution: "is-wsl@npm:3.1.0" - dependencies: - is-inside-container: ^1.0.0 - checksum: f9734c81f2f9cf9877c5db8356bfe1ff61680f1f4c1011e91278a9c0564b395ae796addb4bf33956871041476ec82c3e5260ed57b22ac91794d4ae70a1d2f0a9 - languageName: node - linkType: hard - -"is64bit@npm:^2.0.0": - version: 2.0.0 - resolution: "is64bit@npm:2.0.0" - dependencies: - system-architecture: ^0.1.0 - checksum: 253079e64b6f9bb90295a63b73a046bea67364cdc104bc5abeffcf4cbc52b3e66b0e921cb14f686deb71b5cab628f9f490845c1194c6e94f84068d177c7f15cd - languageName: node - linkType: hard - -"isarray@npm:^2.0.5": - version: 2.0.5 - resolution: "isarray@npm:2.0.5" - checksum: bd5bbe4104438c4196ba58a54650116007fa0262eccef13a4c55b2e09a5b36b59f1e75b9fcc49883dd9d4953892e6fc007eef9e9155648ceea036e184b0f930a - languageName: node - linkType: hard - -"isarray@npm:~1.0.0": - version: 1.0.0 - resolution: "isarray@npm:1.0.0" - checksum: f032df8e02dce8ec565cf2eb605ea939bdccea528dbcf565cdf92bfa2da9110461159d86a537388ef1acef8815a330642d7885b29010e8f7eac967c9993b65ab - languageName: node - linkType: hard - -"isexe@npm:^2.0.0": - version: 2.0.0 - resolution: "isexe@npm:2.0.0" - checksum: 26bf6c5480dda5161c820c5b5c751ae1e766c587b1f951ea3fcfc973bafb7831ae5b54a31a69bd670220e42e99ec154475025a468eae58ea262f813fdc8d1c62 - languageName: node - linkType: hard - -"isobject@npm:^3.0.1": - version: 3.0.1 - resolution: "isobject@npm:3.0.1" - checksum: db85c4c970ce30693676487cca0e61da2ca34e8d4967c2e1309143ff910c207133a969f9e4ddb2dc6aba670aabce4e0e307146c310350b298e74a31f7d464703 - languageName: node - linkType: hard - -"isomorphic-ws@npm:5.0.0, isomorphic-ws@npm:^5.0.0": - version: 5.0.0 - resolution: "isomorphic-ws@npm:5.0.0" - peerDependencies: - ws: "*" - checksum: e20eb2aee09ba96247465fda40c6d22c1153394c0144fa34fe6609f341af4c8c564f60ea3ba762335a7a9c306809349f9b863c8beedf2beea09b299834ad5398 - languageName: node - linkType: hard - -"isows@npm:1.0.6": - version: 1.0.6 - resolution: "isows@npm:1.0.6" - peerDependencies: - ws: "*" - checksum: ab9e85b50bcc3d70aa5ec875aa2746c5daf9321cb376ed4e5434d3c2643c5d62b1f466d93a05cd2ad0ead5297224922748c31707cb4fbd68f5d05d0479dce99c - languageName: node - linkType: hard - -"isstream@npm:~0.1.2": - version: 0.1.2 - resolution: "isstream@npm:0.1.2" - checksum: 1eb2fe63a729f7bdd8a559ab552c69055f4f48eb5c2f03724430587c6f450783c8f1cd936c1c952d0a927925180fcc892ebd5b174236cf1065d4bd5bdb37e963 - languageName: node - linkType: hard - -"istanbul-lib-coverage@npm:^3.0.0, istanbul-lib-coverage@npm:^3.2.0": - version: 3.2.0 - resolution: "istanbul-lib-coverage@npm:3.2.0" - checksum: a2a545033b9d56da04a8571ed05c8120bf10e9bce01cf8633a3a2b0d1d83dff4ac4fe78d6d5673c27fc29b7f21a41d75f83a36be09f82a61c367b56aa73c1ff9 - languageName: node - linkType: hard - -"istanbul-lib-instrument@npm:^5.0.4": - version: 5.2.1 - resolution: "istanbul-lib-instrument@npm:5.2.1" - dependencies: - "@babel/core": ^7.12.3 - "@babel/parser": ^7.14.7 - "@istanbuljs/schema": ^0.1.2 - istanbul-lib-coverage: ^3.2.0 - semver: ^6.3.0 - checksum: bf16f1803ba5e51b28bbd49ed955a736488381e09375d830e42ddeb403855b2006f850711d95ad726f2ba3f1ae8e7366de7e51d2b9ac67dc4d80191ef7ddf272 - languageName: node - linkType: hard - -"istanbul-lib-instrument@npm:^6.0.0": - version: 6.0.1 - resolution: "istanbul-lib-instrument@npm:6.0.1" - dependencies: - "@babel/core": ^7.12.3 - "@babel/parser": ^7.14.7 - "@istanbuljs/schema": ^0.1.2 - istanbul-lib-coverage: ^3.2.0 - semver: ^7.5.4 - checksum: fb23472e739cfc9b027cefcd7d551d5e7ca7ff2817ae5150fab99fe42786a7f7b56a29a2aa8309c37092e18297b8003f9c274f50ca4360949094d17fbac81472 - languageName: node - linkType: hard - -"istanbul-lib-report@npm:^3.0.0": - version: 3.0.0 - resolution: "istanbul-lib-report@npm:3.0.0" - dependencies: - istanbul-lib-coverage: ^3.0.0 - make-dir: ^3.0.0 - supports-color: ^7.1.0 - checksum: 3f29eb3f53c59b987386e07fe772d24c7f58c6897f34c9d7a296f4000de7ae3de9eb95c3de3df91dc65b134c84dee35c54eee572a56243e8907c48064e34ff1b - languageName: node - linkType: hard - -"istanbul-lib-source-maps@npm:^4.0.0": - version: 4.0.1 - resolution: "istanbul-lib-source-maps@npm:4.0.1" - dependencies: - debug: ^4.1.1 - istanbul-lib-coverage: ^3.0.0 - source-map: ^0.6.1 - checksum: 21ad3df45db4b81852b662b8d4161f6446cd250c1ddc70ef96a585e2e85c26ed7cd9c2a396a71533cfb981d1a645508bc9618cae431e55d01a0628e7dec62ef2 - languageName: node - linkType: hard - -"istanbul-reports@npm:^3.1.3": - version: 3.1.5 - resolution: "istanbul-reports@npm:3.1.5" - dependencies: - html-escaper: ^2.0.0 - istanbul-lib-report: ^3.0.0 - checksum: 7867228f83ed39477b188ea07e7ccb9b4f5320b6f73d1db93a0981b7414fa4ef72d3f80c4692c442f90fc250d9406e71d8d7ab65bb615cb334e6292b73192b89 - languageName: node - linkType: hard - -"iterall@npm:^1.2.1, iterall@npm:^1.2.2": - version: 1.3.0 - resolution: "iterall@npm:1.3.0" - checksum: c78b99678f8c99be488cca7f33e4acca9b72c1326e050afbaf023f086e55619ee466af0464af94a0cb3f292e60cb5bac53a8fd86bd4249ecad26e09f17bb158b - languageName: node - linkType: hard - -"iterate-object@npm:^1.3.4": - version: 1.3.4 - resolution: "iterate-object@npm:1.3.4" - checksum: b63496c489177babccb4b487322279ea4377e08d02b93902c3ffba3032a788f014a74e03c615da2a24807fa3fca872f69c9570f7801c8e88181df7a49298904b - languageName: node - linkType: hard - -"iterator.prototype@npm:^1.1.3": - version: 1.1.3 - resolution: "iterator.prototype@npm:1.1.3" - dependencies: - define-properties: ^1.2.1 - get-intrinsic: ^1.2.1 - has-symbols: ^1.0.3 - reflect.getprototypeof: ^1.0.4 - set-function-name: ^2.0.1 - checksum: 7d2a1f8bcbba7b76f72e956faaf7b25405f4de54430c9d099992e6fb9d571717c3044604e8cdfb8e624cb881337d648030ee8b1541d544af8b338835e3f47ebe - languageName: node - linkType: hard - -"jackspeak@npm:^3.1.2": - version: 3.4.3 - resolution: "jackspeak@npm:3.4.3" - dependencies: - "@isaacs/cliui": ^8.0.2 - "@pkgjs/parseargs": ^0.11.0 - dependenciesMeta: - "@pkgjs/parseargs": - optional: true - checksum: be31027fc72e7cc726206b9f560395604b82e0fddb46c4cbf9f97d049bcef607491a5afc0699612eaa4213ca5be8fd3e1e7cd187b3040988b65c9489838a7c00 - languageName: node - linkType: hard - -"jake@npm:^10.8.5": - version: 10.8.5 - resolution: "jake@npm:10.8.5" - dependencies: - async: ^3.2.3 - chalk: ^4.0.2 - filelist: ^1.0.1 - minimatch: ^3.0.4 - bin: - jake: ./bin/cli.js - checksum: 56c913ecf5a8d74325d0af9bc17a233bad50977438d44864d925bb6c45c946e0fee8c4c1f5fe2225471ef40df5222e943047982717ebff0d624770564d3c46ba - languageName: node - linkType: hard - -"javascript-stringify@npm:^2.0.1": - version: 2.1.0 - resolution: "javascript-stringify@npm:2.1.0" - checksum: 009981ec84299da88795fc764221ed213e3d52251cc93a396430a7a02ae09f1163a9be36a36808689681a8e6113cf00fe97ec2eea2552df48111f79be59e9358 - languageName: node - linkType: hard - -"jest-changed-files@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-changed-files@npm:29.7.0" - dependencies: - execa: ^5.0.0 - jest-util: ^29.7.0 - p-limit: ^3.1.0 - checksum: 963e203893c396c5dfc75e00a49426688efea7361b0f0e040035809cecd2d46b3c01c02be2d9e8d38b1138357d2de7719ea5b5be21f66c10f2e9685a5a73bb99 - languageName: node - linkType: hard - -"jest-chrome@npm:0.8.0": - version: 0.8.0 - resolution: "jest-chrome@npm:0.8.0" - dependencies: - "@types/chrome": ^0.0.114 - peerDependencies: - jest: ^26.0.1 || ^27.0.0 - checksum: c34b3be1c7c13d08eafd8505d130d1dad3339836cb77d3997e09cf1dc2be618a5ca1f685190692d9872b8a1ce0f04d204b7b66476fea275b0bcf54779ebc5a72 - languageName: node - linkType: hard - -"jest-circus@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-circus@npm:29.7.0" - dependencies: - "@jest/environment": ^29.7.0 - "@jest/expect": ^29.7.0 - "@jest/test-result": ^29.7.0 - "@jest/types": ^29.6.3 - "@types/node": "*" - chalk: ^4.0.0 - co: ^4.6.0 - dedent: ^1.0.0 - is-generator-fn: ^2.0.0 - jest-each: ^29.7.0 - jest-matcher-utils: ^29.7.0 - jest-message-util: ^29.7.0 - jest-runtime: ^29.7.0 - jest-snapshot: ^29.7.0 - jest-util: ^29.7.0 - p-limit: ^3.1.0 - pretty-format: ^29.7.0 - pure-rand: ^6.0.0 - slash: ^3.0.0 - stack-utils: ^2.0.3 - checksum: 349437148924a5a109c9b8aad6d393a9591b4dac1918fc97d81b7fc515bc905af9918495055071404af1fab4e48e4b04ac3593477b1d5dcf48c4e71b527c70a7 - languageName: node - linkType: hard - -"jest-cli@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-cli@npm:29.7.0" - dependencies: - "@jest/core": ^29.7.0 - "@jest/test-result": ^29.7.0 - "@jest/types": ^29.6.3 - chalk: ^4.0.0 - create-jest: ^29.7.0 - exit: ^0.1.2 - import-local: ^3.0.2 - jest-config: ^29.7.0 - jest-util: ^29.7.0 - jest-validate: ^29.7.0 - yargs: ^17.3.1 - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - bin: - jest: bin/jest.js - checksum: 664901277a3f5007ea4870632ed6e7889db9da35b2434e7cb488443e6bf5513889b344b7fddf15112135495b9875892b156faeb2d7391ddb9e2a849dcb7b6c36 - languageName: node - linkType: hard - -"jest-config@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-config@npm:29.7.0" - dependencies: - "@babel/core": ^7.11.6 - "@jest/test-sequencer": ^29.7.0 - "@jest/types": ^29.6.3 - babel-jest: ^29.7.0 - chalk: ^4.0.0 - ci-info: ^3.2.0 - deepmerge: ^4.2.2 - glob: ^7.1.3 - graceful-fs: ^4.2.9 - jest-circus: ^29.7.0 - jest-environment-node: ^29.7.0 - jest-get-type: ^29.6.3 - jest-regex-util: ^29.6.3 - jest-resolve: ^29.7.0 - jest-runner: ^29.7.0 - jest-util: ^29.7.0 - jest-validate: ^29.7.0 - micromatch: ^4.0.4 - parse-json: ^5.2.0 - pretty-format: ^29.7.0 - slash: ^3.0.0 - strip-json-comments: ^3.1.1 - peerDependencies: - "@types/node": "*" - ts-node: ">=9.0.0" - peerDependenciesMeta: - "@types/node": - optional: true - ts-node: - optional: true - checksum: 4cabf8f894c180cac80b7df1038912a3fc88f96f2622de33832f4b3314f83e22b08fb751da570c0ab2b7988f21604bdabade95e3c0c041068ac578c085cf7dff - languageName: node - linkType: hard - -"jest-diff@npm:^29.0.0, jest-diff@npm:^29.0.1, jest-diff@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-diff@npm:29.7.0" - dependencies: - chalk: ^4.0.0 - diff-sequences: ^29.6.3 - jest-get-type: ^29.6.3 - pretty-format: ^29.7.0 - checksum: 08e24a9dd43bfba1ef07a6374e5af138f53137b79ec3d5cc71a2303515335898888fa5409959172e1e05de966c9e714368d15e8994b0af7441f0721ee8e1bb77 - languageName: node - linkType: hard - -"jest-docblock@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-docblock@npm:29.7.0" - dependencies: - detect-newline: ^3.0.0 - checksum: 66390c3e9451f8d96c5da62f577a1dad701180cfa9b071c5025acab2f94d7a3efc2515cfa1654ebe707213241541ce9c5530232cdc8017c91ed64eea1bd3b192 - languageName: node - linkType: hard - -"jest-each@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-each@npm:29.7.0" - dependencies: - "@jest/types": ^29.6.3 - chalk: ^4.0.0 - jest-get-type: ^29.6.3 - jest-util: ^29.7.0 - pretty-format: ^29.7.0 - checksum: e88f99f0184000fc8813f2a0aa79e29deeb63700a3b9b7928b8a418d7d93cd24933608591dbbdea732b473eb2021c72991b5cc51a17966842841c6e28e6f691c - languageName: node - linkType: hard - -"jest-environment-jsdom@npm:29.5.0": - version: 29.5.0 - resolution: "jest-environment-jsdom@npm:29.5.0" - dependencies: - "@jest/environment": ^29.5.0 - "@jest/fake-timers": ^29.5.0 - "@jest/types": ^29.5.0 - "@types/jsdom": ^20.0.0 - "@types/node": "*" - jest-mock: ^29.5.0 - jest-util: ^29.5.0 - jsdom: ^20.0.0 - peerDependencies: - canvas: ^2.5.0 - peerDependenciesMeta: - canvas: - optional: true - checksum: 3df7fc85275711f20b483ac8cd8c04500704ed0f69791eb55c574b38f5a39470f03d775cf20c1025bc1884916ac0573aa2fa4db1bb74225bc7fdd95ba97ad0da - languageName: node - linkType: hard - -"jest-environment-jsdom@npm:^29.2.1": - version: 29.6.4 - resolution: "jest-environment-jsdom@npm:29.6.4" - dependencies: - "@jest/environment": ^29.6.4 - "@jest/fake-timers": ^29.6.4 - "@jest/types": ^29.6.3 - "@types/jsdom": ^20.0.0 - "@types/node": "*" - jest-mock: ^29.6.3 - jest-util: ^29.6.3 - jsdom: ^20.0.0 - peerDependencies: - canvas: ^2.5.0 - peerDependenciesMeta: - canvas: - optional: true - checksum: 2afe105f12d7d93ca56e2e6f67ab07ada3dd3da0516d1198f254930683ab9feb2b8c14417baaca53544eed88fd7fb5744f0dbce2e100269746187317ce0347df - languageName: node - linkType: hard - -"jest-environment-node@npm:^29.6.3, jest-environment-node@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-environment-node@npm:29.7.0" - dependencies: - "@jest/environment": ^29.7.0 - "@jest/fake-timers": ^29.7.0 - "@jest/types": ^29.6.3 - "@types/node": "*" - jest-mock: ^29.7.0 - jest-util: ^29.7.0 - checksum: 501a9966292cbe0ca3f40057a37587cb6def25e1e0c5e39ac6c650fe78d3c70a2428304341d084ac0cced5041483acef41c477abac47e9a290d5545fd2f15646 - languageName: node - linkType: hard - -"jest-expo@npm:52.0.3": - version: 52.0.3 - resolution: "jest-expo@npm:52.0.3" - dependencies: - "@expo/config": ~10.0.8 - "@expo/json-file": ^9.0.1 - "@jest/create-cache-key-function": ^29.2.1 - "@jest/globals": ^29.2.1 - babel-jest: ^29.2.1 - fbemitter: ^3.0.0 - find-up: ^5.0.0 - jest-environment-jsdom: ^29.2.1 - jest-snapshot: ^29.2.1 - jest-watch-select-projects: ^2.0.0 - jest-watch-typeahead: 2.2.1 - json5: ^2.2.3 - lodash: ^4.17.19 - react-server-dom-webpack: 19.0.0-rc-6230622a1a-20240610 - react-test-renderer: 18.3.1 - server-only: ^0.0.1 - stacktrace-js: ^2.0.2 - peerDependencies: - expo: "*" - react-native: "*" - bin: - jest: bin/jest.js - checksum: 92eee7ea962f797ff4b7be201a2b02d69f1cca61a1a29c7bdd590e5cc97d09f71eba9ac037df70b84c0ceda203064adfd8a8d4133a5b234188e77cc32ba070aa - languageName: node - linkType: hard - -"jest-extended@npm:4.0.2": - version: 4.0.2 - resolution: "jest-extended@npm:4.0.2" - dependencies: - jest-diff: ^29.0.0 - jest-get-type: ^29.0.0 - peerDependencies: - jest: ">=27.2.5" - peerDependenciesMeta: - jest: - optional: true - checksum: afdc255eec7caa173f9e805e94562273d8b8aa4c7ab9b396668f018c18ea5236270a6ac499ca84b8c60e90ccbe9ccb4aebf998daef13aec9542c426df1df6079 - languageName: node - linkType: hard - -"jest-fail-on-console@npm:3.3.0": - version: 3.3.0 - resolution: "jest-fail-on-console@npm:3.3.0" - checksum: 891cbe9bac5d7656beee75850c880427401880debc6dc110b845d17313cf375dc5f6f1d27eaf411553839287fe150fd46738f3c5facba5cb22244546ee66e111 - languageName: node - linkType: hard - -"jest-fetch-mock@npm:3.0.3": - version: 3.0.3 - resolution: "jest-fetch-mock@npm:3.0.3" - dependencies: - cross-fetch: ^3.0.4 - promise-polyfill: ^8.1.3 - checksum: fb052f7e0ef1c8192a9c15efdd1b18d281ab68fc6b1648b30bff8880fe24418bdf12190ea79b1996932dc15417c3c01f5b2d77ef7104a7e7943e7cbe8d61071d - languageName: node - linkType: hard - -"jest-get-type@npm:^27.5.1": - version: 27.5.1 - resolution: "jest-get-type@npm:27.5.1" - checksum: 63064ab70195c21007d897c1157bf88ff94a790824a10f8c890392e7d17eda9c3900513cb291ca1c8d5722cad79169764e9a1279f7c8a9c4cd6e9109ff04bbc0 - languageName: node - linkType: hard - -"jest-get-type@npm:^29.0.0, jest-get-type@npm:^29.6.3": - version: 29.6.3 - resolution: "jest-get-type@npm:29.6.3" - checksum: 88ac9102d4679d768accae29f1e75f592b760b44277df288ad76ce5bf038c3f5ce3719dea8aa0f035dac30e9eb034b848ce716b9183ad7cc222d029f03e92205 - languageName: node - linkType: hard - -"jest-haste-map@npm:^27.5.1": - version: 27.5.1 - resolution: "jest-haste-map@npm:27.5.1" - dependencies: - "@jest/types": ^27.5.1 - "@types/graceful-fs": ^4.1.2 - "@types/node": "*" - anymatch: ^3.0.3 - fb-watchman: ^2.0.0 - fsevents: ^2.3.2 - graceful-fs: ^4.2.9 - jest-regex-util: ^27.5.1 - jest-serializer: ^27.5.1 - jest-util: ^27.5.1 - jest-worker: ^27.5.1 - micromatch: ^4.0.4 - walker: ^1.0.7 - dependenciesMeta: - fsevents: - optional: true - checksum: e092a1412829a9254b4725531ee72926de530f77fda7b0d9ea18008fb7623c16f72e772d8e93be71cac9e591b2c6843a669610887dd2c89bd9eb528856e3ab47 - languageName: node - linkType: hard - -"jest-haste-map@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-haste-map@npm:29.7.0" - dependencies: - "@jest/types": ^29.6.3 - "@types/graceful-fs": ^4.1.3 - "@types/node": "*" - anymatch: ^3.0.3 - fb-watchman: ^2.0.0 - fsevents: ^2.3.2 - graceful-fs: ^4.2.9 - jest-regex-util: ^29.6.3 - jest-util: ^29.7.0 - jest-worker: ^29.7.0 - micromatch: ^4.0.4 - walker: ^1.0.8 - dependenciesMeta: - fsevents: - optional: true - checksum: c2c8f2d3e792a963940fbdfa563ce14ef9e14d4d86da645b96d3cd346b8d35c5ce0b992ee08593939b5f718cf0a1f5a90011a056548a1dbf58397d4356786f01 - languageName: node - linkType: hard - -"jest-leak-detector@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-leak-detector@npm:29.7.0" - dependencies: - jest-get-type: ^29.6.3 - pretty-format: ^29.7.0 - checksum: e3950e3ddd71e1d0c22924c51a300a1c2db6cf69ec1e51f95ccf424bcc070f78664813bef7aed4b16b96dfbdeea53fe358f8aeaaea84346ae15c3735758f1605 - languageName: node - linkType: hard - -"jest-matcher-utils@npm:^29.0.1, jest-matcher-utils@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-matcher-utils@npm:29.7.0" - dependencies: - chalk: ^4.0.0 - jest-diff: ^29.7.0 - jest-get-type: ^29.6.3 - pretty-format: ^29.7.0 - checksum: d7259e5f995d915e8a37a8fd494cb7d6af24cd2a287b200f831717ba0d015190375f9f5dc35393b8ba2aae9b2ebd60984635269c7f8cff7d85b077543b7744cd - languageName: node - linkType: hard - -"jest-message-util@npm:^28.1.3": - version: 28.1.3 - resolution: "jest-message-util@npm:28.1.3" - dependencies: - "@babel/code-frame": ^7.12.13 - "@jest/types": ^28.1.3 - "@types/stack-utils": ^2.0.0 - chalk: ^4.0.0 - graceful-fs: ^4.2.9 - micromatch: ^4.0.4 - pretty-format: ^28.1.3 - slash: ^3.0.0 - stack-utils: ^2.0.3 - checksum: 1f266854166dcc6900d75a88b54a25225a2f3710d463063ff1c99021569045c35c7d58557b25447a17eb3a65ce763b2f9b25550248b468a9d4657db365f39e96 - languageName: node - linkType: hard - -"jest-message-util@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-message-util@npm:29.7.0" - dependencies: - "@babel/code-frame": ^7.12.13 - "@jest/types": ^29.6.3 - "@types/stack-utils": ^2.0.0 - chalk: ^4.0.0 - graceful-fs: ^4.2.9 - micromatch: ^4.0.4 - pretty-format: ^29.7.0 - slash: ^3.0.0 - stack-utils: ^2.0.3 - checksum: a9d025b1c6726a2ff17d54cc694de088b0489456c69106be6b615db7a51b7beb66788bea7a59991a019d924fbf20f67d085a445aedb9a4d6760363f4d7d09930 - languageName: node - linkType: hard - -"jest-mock@npm:^29.5.0, jest-mock@npm:^29.6.3, jest-mock@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-mock@npm:29.7.0" - dependencies: - "@jest/types": ^29.6.3 - "@types/node": "*" - jest-util: ^29.7.0 - checksum: 81ba9b68689a60be1482212878973700347cb72833c5e5af09895882b9eb5c4e02843a1bbdf23f94c52d42708bab53a30c45a3482952c9eec173d1eaac5b86c5 - languageName: node - linkType: hard - -"jest-pnp-resolver@npm:^1.2.2": - version: 1.2.3 - resolution: "jest-pnp-resolver@npm:1.2.3" - peerDependencies: - jest-resolve: "*" - peerDependenciesMeta: - jest-resolve: - optional: true - checksum: db1a8ab2cb97ca19c01b1cfa9a9c8c69a143fde833c14df1fab0766f411b1148ff0df878adea09007ac6a2085ec116ba9a996a6ad104b1e58c20adbf88eed9b2 - languageName: node - linkType: hard - -"jest-presets@workspace:^, jest-presets@workspace:config/jest-presets": - version: 0.0.0-use.local - resolution: "jest-presets@workspace:config/jest-presets" - dependencies: - "@testing-library/jest-native": 5.4.3 - babel-jest: 29.7.0 - jest-svg-transformer: 1.0.0 - jest-transform-stub: 2.0.0 - mem-storage-area: 1.0.3 - ts-jest: 29.2.5 - languageName: unknown - linkType: soft - -"jest-regex-util@npm:^27.5.1": - version: 27.5.1 - resolution: "jest-regex-util@npm:27.5.1" - checksum: d45ca7a9543616a34f7f3079337439cf07566e677a096472baa2810e274b9808b76767c97b0a4029b8a5b82b9d256dee28ef9ad4138b2b9e5933f6fac106c418 - languageName: node - linkType: hard - -"jest-regex-util@npm:^28.0.0": - version: 28.0.2 - resolution: "jest-regex-util@npm:28.0.2" - checksum: 0ea8c5c82ec88bc85e273c0ec82e0c0f35f7a1e2d055070e50f0cc2a2177f848eec55f73e37ae0d045c3db5014c42b2f90ac62c1ab3fdb354d2abd66a9e08add - languageName: node - linkType: hard - -"jest-regex-util@npm:^29.0.0, jest-regex-util@npm:^29.6.3": - version: 29.6.3 - resolution: "jest-regex-util@npm:29.6.3" - checksum: 0518beeb9bf1228261695e54f0feaad3606df26a19764bc19541e0fc6e2a3737191904607fb72f3f2ce85d9c16b28df79b7b1ec9443aa08c3ef0e9efda6f8f2a - languageName: node - linkType: hard - -"jest-resolve-dependencies@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-resolve-dependencies@npm:29.7.0" - dependencies: - jest-regex-util: ^29.6.3 - jest-snapshot: ^29.7.0 - checksum: aeb75d8150aaae60ca2bb345a0d198f23496494677cd6aefa26fc005faf354061f073982175daaf32b4b9d86b26ca928586344516e3e6969aa614cb13b883984 - languageName: node - linkType: hard - -"jest-resolve@npm:^27.4.2": - version: 27.5.1 - resolution: "jest-resolve@npm:27.5.1" - dependencies: - "@jest/types": ^27.5.1 - chalk: ^4.0.0 - graceful-fs: ^4.2.9 - jest-haste-map: ^27.5.1 - jest-pnp-resolver: ^1.2.2 - jest-util: ^27.5.1 - jest-validate: ^27.5.1 - resolve: ^1.20.0 - resolve.exports: ^1.1.0 - slash: ^3.0.0 - checksum: 735830e7265b20a348029738680bb2f6e37f80ecea86cda869a4c318ba3a45d39c7a3a873a22f7f746d86258c50ead6e7f501de043e201c095d7ba628a1c440f - languageName: node - linkType: hard - -"jest-resolve@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-resolve@npm:29.7.0" - dependencies: - chalk: ^4.0.0 - graceful-fs: ^4.2.9 - jest-haste-map: ^29.7.0 - jest-pnp-resolver: ^1.2.2 - jest-util: ^29.7.0 - jest-validate: ^29.7.0 - resolve: ^1.20.0 - resolve.exports: ^2.0.0 - slash: ^3.0.0 - checksum: 0ca218e10731aa17920526ec39deaec59ab9b966237905ffc4545444481112cd422f01581230eceb7e82d86f44a543d520a71391ec66e1b4ef1a578bd5c73487 - languageName: node - linkType: hard - -"jest-runner@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-runner@npm:29.7.0" - dependencies: - "@jest/console": ^29.7.0 - "@jest/environment": ^29.7.0 - "@jest/test-result": ^29.7.0 - "@jest/transform": ^29.7.0 - "@jest/types": ^29.6.3 - "@types/node": "*" - chalk: ^4.0.0 - emittery: ^0.13.1 - graceful-fs: ^4.2.9 - jest-docblock: ^29.7.0 - jest-environment-node: ^29.7.0 - jest-haste-map: ^29.7.0 - jest-leak-detector: ^29.7.0 - jest-message-util: ^29.7.0 - jest-resolve: ^29.7.0 - jest-runtime: ^29.7.0 - jest-util: ^29.7.0 - jest-watcher: ^29.7.0 - jest-worker: ^29.7.0 - p-limit: ^3.1.0 - source-map-support: 0.5.13 - checksum: f0405778ea64812bf9b5c50b598850d94ccf95d7ba21f090c64827b41decd680ee19fcbb494007cdd7f5d0d8906bfc9eceddd8fa583e753e736ecd462d4682fb - languageName: node - linkType: hard - -"jest-runtime@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-runtime@npm:29.7.0" - dependencies: - "@jest/environment": ^29.7.0 - "@jest/fake-timers": ^29.7.0 - "@jest/globals": ^29.7.0 - "@jest/source-map": ^29.6.3 - "@jest/test-result": ^29.7.0 - "@jest/transform": ^29.7.0 - "@jest/types": ^29.6.3 - "@types/node": "*" - chalk: ^4.0.0 - cjs-module-lexer: ^1.0.0 - collect-v8-coverage: ^1.0.0 - glob: ^7.1.3 - graceful-fs: ^4.2.9 - jest-haste-map: ^29.7.0 - jest-message-util: ^29.7.0 - jest-mock: ^29.7.0 - jest-regex-util: ^29.6.3 - jest-resolve: ^29.7.0 - jest-snapshot: ^29.7.0 - jest-util: ^29.7.0 - slash: ^3.0.0 - strip-bom: ^4.0.0 - checksum: d19f113d013e80691e07047f68e1e3448ef024ff2c6b586ce4f90cd7d4c62a2cd1d460110491019719f3c59bfebe16f0e201ed005ef9f80e2cf798c374eed54e - languageName: node - linkType: hard - -"jest-serializer@npm:^27.5.1": - version: 27.5.1 - resolution: "jest-serializer@npm:27.5.1" - dependencies: - "@types/node": "*" - graceful-fs: ^4.2.9 - checksum: 803e03a552278610edc6753c0dd9fa5bb5cd3ca47414a7b2918106efb62b79fd5e9ae785d0a21f12a299fa599fea8acc1fa6dd41283328cee43962cf7df9bb44 - languageName: node - linkType: hard - -"jest-snapshot@npm:^29.2.1, jest-snapshot@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-snapshot@npm:29.7.0" - dependencies: - "@babel/core": ^7.11.6 - "@babel/generator": ^7.7.2 - "@babel/plugin-syntax-jsx": ^7.7.2 - "@babel/plugin-syntax-typescript": ^7.7.2 - "@babel/types": ^7.3.3 - "@jest/expect-utils": ^29.7.0 - "@jest/transform": ^29.7.0 - "@jest/types": ^29.6.3 - babel-preset-current-node-syntax: ^1.0.0 - chalk: ^4.0.0 - expect: ^29.7.0 - graceful-fs: ^4.2.9 - jest-diff: ^29.7.0 - jest-get-type: ^29.6.3 - jest-matcher-utils: ^29.7.0 - jest-message-util: ^29.7.0 - jest-util: ^29.7.0 - natural-compare: ^1.4.0 - pretty-format: ^29.7.0 - semver: ^7.5.3 - checksum: 86821c3ad0b6899521ce75ee1ae7b01b17e6dfeff9166f2cf17f012e0c5d8c798f30f9e4f8f7f5bed01ea7b55a6bc159f5eda778311162cbfa48785447c237ad - languageName: node - linkType: hard - -"jest-styled-components@npm:7.2.0": - version: 7.2.0 - resolution: "jest-styled-components@npm:7.2.0" - dependencies: - "@adobe/css-tools": ^4.0.1 - peerDependencies: - styled-components: ">= 5" - checksum: 9eb440fb98571520fa6309ebec5464bdd6a15fd29989c7a583badc24f390264459f21d1d09253e6a449f4f6e41ca0d8f630f762941794b51b327df9bfdcce030 - languageName: node - linkType: hard - -"jest-svg-transformer@npm:1.0.0": - version: 1.0.0 - resolution: "jest-svg-transformer@npm:1.0.0" - peerDependencies: - jest: ">22" - react: ">=16" - checksum: 773a9129bf628101eddd911bf54783736991f2007b10bf7f05f7566a225485b03ca6cb30fcd270bfac845d6c0075976f1def4fccdda113d0d3176cf67ee18ded - languageName: node - linkType: hard - -"jest-transform-stub@npm:2.0.0": - version: 2.0.0 - resolution: "jest-transform-stub@npm:2.0.0" - checksum: c46134257e5fb047f5952e4a4a1339925dd009da15aa8d3310ba1d3e4d22266ed6c675cd18e58c9d5ca2246718d6cc8ff00ea6a4b6f3b2a6b285b6426f6ae8fe - languageName: node - linkType: hard - -"jest-transformer-svg@npm:2.0.0": - version: 2.0.0 - resolution: "jest-transformer-svg@npm:2.0.0" - peerDependencies: - jest: ^28.1.0 - react: ^17.0.0 || ^18.0.0 - checksum: f7c609ff44c2ec650e37fd39196263733dc1e24ae555f667e223894591e0419034e30f7555d8d04fc8f21be6371e5ebe5d9b022b8e9960694166a32754649ae9 - languageName: node - linkType: hard - -"jest-util@npm:^27.5.1": - version: 27.5.1 - resolution: "jest-util@npm:27.5.1" - dependencies: - "@jest/types": ^27.5.1 - "@types/node": "*" - chalk: ^4.0.0 - ci-info: ^3.2.0 - graceful-fs: ^4.2.9 - picomatch: ^2.2.3 - checksum: ac8d122f6daf7a035dcea156641fd3701aeba245417c40836a77e35b3341b9c02ddc5d904cfcd4ddbaa00ab854da76d3b911870cafdcdbaff90ea471de26c7d7 - languageName: node - linkType: hard - -"jest-util@npm:^28.1.3": - version: 28.1.3 - resolution: "jest-util@npm:28.1.3" - dependencies: - "@jest/types": ^28.1.3 - "@types/node": "*" - chalk: ^4.0.0 - ci-info: ^3.2.0 - graceful-fs: ^4.2.9 - picomatch: ^2.2.3 - checksum: fd6459742c941f070223f25e38a2ac0719aad92561591e9fb2a50d602a5d19d754750b79b4074327a42b00055662b95da3b006542ceb8b54309da44d4a62e721 - languageName: node - linkType: hard - -"jest-util@npm:^29.0.0, jest-util@npm:^29.5.0, jest-util@npm:^29.6.3, jest-util@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-util@npm:29.7.0" - dependencies: - "@jest/types": ^29.6.3 - "@types/node": "*" - chalk: ^4.0.0 - ci-info: ^3.2.0 - graceful-fs: ^4.2.9 - picomatch: ^2.2.3 - checksum: 042ab4980f4ccd4d50226e01e5c7376a8556b472442ca6091a8f102488c0f22e6e8b89ea874111d2328a2080083bf3225c86f3788c52af0bd0345a00eb57a3ca - languageName: node - linkType: hard - -"jest-validate@npm:^27.5.1": - version: 27.5.1 - resolution: "jest-validate@npm:27.5.1" - dependencies: - "@jest/types": ^27.5.1 - camelcase: ^6.2.0 - chalk: ^4.0.0 - jest-get-type: ^27.5.1 - leven: ^3.1.0 - pretty-format: ^27.5.1 - checksum: 82e870f8ee7e4fb949652711b1567f05ae31c54be346b0899e8353e5c20fad7692b511905b37966945e90af8dc0383eb41a74f3ffefb16140ea4f9164d841412 - languageName: node - linkType: hard - -"jest-validate@npm:^29.6.3, jest-validate@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-validate@npm:29.7.0" - dependencies: - "@jest/types": ^29.6.3 - camelcase: ^6.2.0 - chalk: ^4.0.0 - jest-get-type: ^29.6.3 - leven: ^3.1.0 - pretty-format: ^29.7.0 - checksum: 191fcdc980f8a0de4dbdd879fa276435d00eb157a48683af7b3b1b98b0f7d9de7ffe12689b617779097ff1ed77601b9f7126b0871bba4f776e222c40f62e9dae - languageName: node - linkType: hard - -"jest-watch-select-projects@npm:^2.0.0": - version: 2.0.0 - resolution: "jest-watch-select-projects@npm:2.0.0" - dependencies: - ansi-escapes: ^4.3.0 - chalk: ^3.0.0 - prompts: ^2.2.1 - checksum: 67b7a08d8e7b5ecfba67d86f02be29e4917c4416c9f169246f10cc40792b1c5fa38fcfeb25195643db080ace1f4fdf2f827bd244e7cdff7512d1ddfbc94270f0 - languageName: node - linkType: hard - -"jest-watch-typeahead@npm:2.2.1": - version: 2.2.1 - resolution: "jest-watch-typeahead@npm:2.2.1" - dependencies: - ansi-escapes: ^6.0.0 - chalk: ^4.0.0 - jest-regex-util: ^29.0.0 - jest-watcher: ^29.0.0 - slash: ^5.0.0 - string-length: ^5.0.1 - strip-ansi: ^7.0.1 - peerDependencies: - jest: ^27.0.0 || ^28.0.0 || ^29.0.0 - checksum: 5ba8068209da273187065b8900495ca9d0fce13b090d2e0193e1b862f7e920ca808f8a0c4c2ea504e1646d38519083276fbb304dba728e16b9126c0734f8f8ee - languageName: node - linkType: hard - -"jest-watch-typeahead@npm:^1.0.0": - version: 1.1.0 - resolution: "jest-watch-typeahead@npm:1.1.0" - dependencies: - ansi-escapes: ^4.3.1 - chalk: ^4.0.0 - jest-regex-util: ^28.0.0 - jest-watcher: ^28.0.0 - slash: ^4.0.0 - string-length: ^5.0.1 - strip-ansi: ^7.0.1 - peerDependencies: - jest: ^27.0.0 || ^28.0.0 - checksum: 59b0a494ac01e3801c9ec586de3209153eedb024b981e25443111c5703711d23b67ebc71b072986c1758307e0bfb5bf1c92bd323f73f58602d6f4f609dce6a0c - languageName: node - linkType: hard - -"jest-watcher@npm:^28.0.0": - version: 28.1.3 - resolution: "jest-watcher@npm:28.1.3" - dependencies: - "@jest/test-result": ^28.1.3 - "@jest/types": ^28.1.3 - "@types/node": "*" - ansi-escapes: ^4.2.1 - chalk: ^4.0.0 - emittery: ^0.10.2 - jest-util: ^28.1.3 - string-length: ^4.0.1 - checksum: 8f6d674a4865e7df251f71544f1b51f06fd36b5a3a61f2ac81aeb81fa2a196be354fba51d0f97911c88f67cd254583b3a22ee124bf2c5b6ee2fadec27356c207 - languageName: node - linkType: hard - -"jest-watcher@npm:^29.0.0, jest-watcher@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-watcher@npm:29.7.0" - dependencies: - "@jest/test-result": ^29.7.0 - "@jest/types": ^29.6.3 - "@types/node": "*" - ansi-escapes: ^4.2.1 - chalk: ^4.0.0 - emittery: ^0.13.1 - jest-util: ^29.7.0 - string-length: ^4.0.1 - checksum: 67e6e7fe695416deff96b93a14a561a6db69389a0667e9489f24485bb85e5b54e12f3b2ba511ec0b777eca1e727235b073e3ebcdd473d68888650489f88df92f - languageName: node - linkType: hard - -"jest-worker@npm:^26.2.1": - version: 26.6.2 - resolution: "jest-worker@npm:26.6.2" - dependencies: - "@types/node": "*" - merge-stream: ^2.0.0 - supports-color: ^7.0.0 - checksum: f9afa3b88e3f12027901e4964ba3ff048285b5783b5225cab28fac25b4058cea8ad54001e9a1577ee2bed125fac3ccf5c80dc507b120300cc1bbcb368796533e - languageName: node - linkType: hard - -"jest-worker@npm:^27.0.2, jest-worker@npm:^27.4.5, jest-worker@npm:^27.5.1": - version: 27.5.1 - resolution: "jest-worker@npm:27.5.1" - dependencies: - "@types/node": "*" - merge-stream: ^2.0.0 - supports-color: ^8.0.0 - checksum: 98cd68b696781caed61c983a3ee30bf880b5bd021c01d98f47b143d4362b85d0737f8523761e2713d45e18b4f9a2b98af1eaee77afade4111bb65c77d6f7c980 - languageName: node - linkType: hard - -"jest-worker@npm:^28.0.2": - version: 28.1.3 - resolution: "jest-worker@npm:28.1.3" - dependencies: - "@types/node": "*" - merge-stream: ^2.0.0 - supports-color: ^8.0.0 - checksum: e921c9a1b8f0909da9ea07dbf3592f95b653aef3a8bb0cbcd20fc7f9a795a1304adecac31eecb308992c167e8d7e75c522061fec38a5928ace0f9571c90169ca - languageName: node - linkType: hard - -"jest-worker@npm:^29.6.3, jest-worker@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-worker@npm:29.7.0" - dependencies: - "@types/node": "*" - jest-util: ^29.7.0 - merge-stream: ^2.0.0 - supports-color: ^8.0.0 - checksum: 30fff60af49675273644d408b650fc2eb4b5dcafc5a0a455f238322a8f9d8a98d847baca9d51ff197b6747f54c7901daa2287799230b856a0f48287d131f8c13 - languageName: node - linkType: hard - -"jest@npm:29.7.0": - version: 29.7.0 - resolution: "jest@npm:29.7.0" - dependencies: - "@jest/core": ^29.7.0 - "@jest/types": ^29.6.3 - import-local: ^3.0.2 - jest-cli: ^29.7.0 - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - bin: - jest: bin/jest.js - checksum: 17ca8d67504a7dbb1998cf3c3077ec9031ba3eb512da8d71cb91bcabb2b8995c4e4b292b740cb9bf1cbff5ce3e110b3f7c777b0cefb6f41ab05445f248d0ee0b - languageName: node - linkType: hard - -"jimp-compact@npm:0.16.1": - version: 0.16.1 - resolution: "jimp-compact@npm:0.16.1" - checksum: 5a1c62d70881b31f79ea65fecfe03617be0eb56139bc451f37e8972365c99ac3b52c5176c446ff27144c98ab664a99107ae08d347044e94e1de637f165b41a57 - languageName: node - linkType: hard - -"jiti@npm:1.17.1": - version: 1.17.1 - resolution: "jiti@npm:1.17.1" - bin: - jiti: bin/jiti.js - checksum: 56c6d8488e7e9cc6ee66a0f0d5e18db6669cb12b2e93364f393442289a9bc75a8e8c796249f59015e01c3ebdf9478e2ca8b76c30e29072c678ee00d39de757c7 - languageName: node - linkType: hard - -"jiti@npm:^1.17.1, jiti@npm:^1.21.0, jiti@npm:^1.21.6": - version: 1.21.6 - resolution: "jiti@npm:1.21.6" - bin: - jiti: bin/jiti.js - checksum: 9ea4a70a7bb950794824683ed1c632e2ede26949fbd348e2ba5ec8dc5efa54dc42022d85ae229cadaa60d4b95012e80ea07d625797199b688cc22ab0e8891d32 - languageName: node - linkType: hard - -"joi@npm:^17.2.1, joi@npm:^17.7.0": - version: 17.11.0 - resolution: "joi@npm:17.11.0" - dependencies: - "@hapi/hoek": ^9.0.0 - "@hapi/topo": ^5.0.0 - "@sideway/address": ^4.1.3 - "@sideway/formula": ^3.0.1 - "@sideway/pinpoint": ^2.0.0 - checksum: 3a4e9ecba345cdafe585e7ed8270a44b39718e11dff3749aa27e0001a63d578b75100c062be28e6f48f960b594864034e7a13833f33fbd7ad56d5ce6b617f9bf - languageName: node - linkType: hard - -"join-component@npm:^1.1.0": - version: 1.1.0 - resolution: "join-component@npm:1.1.0" - checksum: b904c2f98549e4195022caca3a7dc837f9706c670ff333f3d617f2aed23bce2841322a999734683b6ab8e202568ad810c11ff79b58a64df66888153f04750239 - languageName: node - linkType: hard - -"jose@npm:^4.11.4": - version: 4.14.3 - resolution: "jose@npm:4.14.3" - checksum: b766d65a60c0407f891003aae053fb500be0edb7e0745e6702bce39199d9f06fda5eb74a90df10611cb7bd7daf2636cbe3726341fef388b51cb4e43b64200f4f - languageName: node - linkType: hard - -"jotai@npm:1.3.7": - version: 1.3.7 - resolution: "jotai@npm:1.3.7" - peerDependencies: - "@babel/core": "*" - "@babel/template": "*" - "@urql/core": "*" - immer: "*" - optics-ts: "*" - react: ">=16.8" - react-query: "*" - valtio: "*" - wonka: "*" - xstate: "*" - peerDependenciesMeta: - "@babel/core": - optional: true - "@babel/template": - optional: true - "@urql/core": - optional: true - immer: - optional: true - optics-ts: - optional: true - react-query: - optional: true - valtio: - optional: true - wonka: - optional: true - xstate: - optional: true - checksum: 8695f319af9178a3c42d8a510cb364aac8f5afb1ba0a0e02e62491e946ea3367106de7bb9e35578efd05171fbe0a4c44d456392547d8d6639e56f0103ebc939f - languageName: node - linkType: hard - -"jpeg-js@npm:0.4.2": - version: 0.4.2 - resolution: "jpeg-js@npm:0.4.2" - checksum: def900757c395e6376446aef5c13ed122cae1ab15308e84784d260c8d3c14d30c2092eaf32a4f57528d6e1f96a6b240a801e92122f00c9f3bb5d5c4d38df5bc0 - languageName: node - linkType: hard - -"jpeg-js@npm:0.4.4": - version: 0.4.4 - resolution: "jpeg-js@npm:0.4.4" - checksum: bd7cb61aa8df40a9ee2c2106839c3df6054891e56cfc22c0ac581402e06c6295f962a4754b0b2ac50a401789131b1c6dc9df8d24400f1352168be1894833c590 - languageName: node - linkType: hard - -"js-base64@npm:^3.7.2, js-base64@npm:^3.7.5": - version: 3.7.7 - resolution: "js-base64@npm:3.7.7" - checksum: d1b02971db9dc0fd35baecfaf6ba499731fb44fe3373e7e1d6681fbd3ba665f29e8d9d17910254ef8104e2cb8b44117fe4202d3dc54c7cafe9ba300fe5433358 - languageName: node - linkType: hard - -"js-sha256@npm:^0.10.1": - version: 0.10.1 - resolution: "js-sha256@npm:0.10.1" - checksum: 6eb5c9f95aa902cec1930f036deb3bc664024b75fede456c0ac74b855797776c18620f47efec36787077a56ba2f3b8d6aacc7733ff8a2b5bb9ce6b655a35c5e6 - languageName: node - linkType: hard - -"js-sha256@npm:^0.11.0": - version: 0.11.0 - resolution: "js-sha256@npm:0.11.0" - checksum: 742d34a0c6eb15247309f1c74889b5a51df01a96e4307375b420fbe973f2f25585012b4d3c8fa52a1b18546153d12587e6463bb725dc1bc58686da03e892c334 - languageName: node - linkType: hard - -"js-sha3@npm:0.8.0, js-sha3@npm:^0.8.0": - version: 0.8.0 - resolution: "js-sha3@npm:0.8.0" - checksum: 75df77c1fc266973f06cce8309ce010e9e9f07ec35ab12022ed29b7f0d9c8757f5a73e1b35aa24840dced0dea7059085aa143d817aea9e188e2a80d569d9adce - languageName: node - linkType: hard - -"js-tokens@npm:^3.0.0 || ^4.0.0, js-tokens@npm:^4.0.0": - version: 4.0.0 - resolution: "js-tokens@npm:4.0.0" - checksum: 8a95213a5a77deb6cbe94d86340e8d9ace2b93bc367790b260101d2f36a2eaf4e4e22d9fa9cf459b38af3a32fb4190e638024cf82ec95ef708680e405ea7cc78 - languageName: node - linkType: hard - -"js-yaml@npm:3.13.1": - version: 3.13.1 - resolution: "js-yaml@npm:3.13.1" - dependencies: - argparse: ^1.0.7 - esprima: ^4.0.0 - bin: - js-yaml: bin/js-yaml.js - checksum: 7511b764abb66d8aa963379f7d2a404f078457d106552d05a7b556d204f7932384e8477513c124749fa2de52eb328961834562bd09924902c6432e40daa408bc - languageName: node - linkType: hard - -"js-yaml@npm:4.1.0, js-yaml@npm:^4.0.0, js-yaml@npm:^4.1.0": - version: 4.1.0 - resolution: "js-yaml@npm:4.1.0" - dependencies: - argparse: ^2.0.1 - bin: - js-yaml: bin/js-yaml.js - checksum: c7830dfd456c3ef2c6e355cc5a92e6700ceafa1d14bba54497b34a99f0376cecbb3e9ac14d3e5849b426d5a5140709a66237a8c991c675431271c4ce5504151a - languageName: node - linkType: hard - -"js-yaml@npm:^3.13.1, js-yaml@npm:^3.14.1, js-yaml@npm:^3.6.1": - version: 3.14.1 - resolution: "js-yaml@npm:3.14.1" - dependencies: - argparse: ^1.0.7 - esprima: ^4.0.0 - bin: - js-yaml: bin/js-yaml.js - checksum: bef146085f472d44dee30ec34e5cf36bf89164f5d585435a3d3da89e52622dff0b188a580e4ad091c3341889e14cb88cac6e4deb16dc5b1e9623bb0601fc255c - languageName: node - linkType: hard - -"jsbi@npm:3.2.5, jsbi@npm:^3.1.4": - version: 3.2.5 - resolution: "jsbi@npm:3.2.5" - checksum: 642d1bb139ad1c1e96c4907eb159565e980a0d168487626b493d0d0b7b341da0e43001089d3b21703fe17b18a7a6c0f42c92026f71d54471ed0a0d1b3015ec0f - languageName: node - linkType: hard - -"jsbn@npm:1.1.0": - version: 1.1.0 - resolution: "jsbn@npm:1.1.0" - checksum: 944f924f2bd67ad533b3850eee47603eed0f6ae425fd1ee8c760f477e8c34a05f144c1bd4f5a5dd1963141dc79a2c55f89ccc5ab77d039e7077f3ad196b64965 - languageName: node - linkType: hard - -"jsbn@npm:~0.1.0": - version: 0.1.1 - resolution: "jsbn@npm:0.1.1" - checksum: e5ff29c1b8d965017ef3f9c219dacd6e40ad355c664e277d31246c90545a02e6047018c16c60a00f36d561b3647215c41894f5d869ada6908a2e0ce4200c88f2 - languageName: node - linkType: hard - -"jsc-android@npm:^250231.0.0": - version: 250231.0.0 - resolution: "jsc-android@npm:250231.0.0" - checksum: 6c3f0f6f02fa37a19935b2fbe651e9d6ecc370eb30f2ecee76379337bbf084abb568a1ef1133fe622c5b76f43cf54bb7716f92a94dca010985da38edc48841e2 - languageName: node - linkType: hard - -"jsc-safe-url@npm:^0.2.2, jsc-safe-url@npm:^0.2.4": - version: 0.2.4 - resolution: "jsc-safe-url@npm:0.2.4" - checksum: 53b5741ba2c0a54da1722929dc80becb2c6fcc9525124fb6c2aec1a00f48e79afffd26816c278111e7b938e37ace029e33cbb8cdaa4ac1f528a87e58022284af - languageName: node - linkType: hard - -"jscodeshift@npm:^0.14.0": - version: 0.14.0 - resolution: "jscodeshift@npm:0.14.0" - dependencies: - "@babel/core": ^7.13.16 - "@babel/parser": ^7.13.16 - "@babel/plugin-proposal-class-properties": ^7.13.0 - "@babel/plugin-proposal-nullish-coalescing-operator": ^7.13.8 - "@babel/plugin-proposal-optional-chaining": ^7.13.12 - "@babel/plugin-transform-modules-commonjs": ^7.13.8 - "@babel/preset-flow": ^7.13.13 - "@babel/preset-typescript": ^7.13.0 - "@babel/register": ^7.13.16 - babel-core: ^7.0.0-bridge.0 - chalk: ^4.1.2 - flow-parser: 0.* - graceful-fs: ^4.2.4 - micromatch: ^4.0.4 - neo-async: ^2.5.0 - node-dir: ^0.1.17 - recast: ^0.21.0 - temp: ^0.8.4 - write-file-atomic: ^2.3.0 - peerDependencies: - "@babel/preset-env": ^7.1.6 - bin: - jscodeshift: bin/jscodeshift.js - checksum: 54ea6d639455883336f80b38a70648821c88b7942315dc0fbab01bc34a9ad0f0f78e3bd69304b5ab167e4262d6ed7e6284c6d32525ab01c89d9118df89b3e2a0 - languageName: node - linkType: hard - -"jsdoc-type-pratt-parser@npm:^4.0.0": - version: 4.1.0 - resolution: "jsdoc-type-pratt-parser@npm:4.1.0" - checksum: e7642a508b090b1bdf17775383000ed71013c38e1231c1e576e5374636e8baf7c3fae8bf0252f5e1d3397d95efd56e8c8a5dd1a0de76d05d1499cbcb3c325bc3 - languageName: node - linkType: hard - -"jsdom@npm:^20.0.0": - version: 20.0.3 - resolution: "jsdom@npm:20.0.3" - dependencies: - abab: ^2.0.6 - acorn: ^8.8.1 - acorn-globals: ^7.0.0 - cssom: ^0.5.0 - cssstyle: ^2.3.0 - data-urls: ^3.0.2 - decimal.js: ^10.4.2 - domexception: ^4.0.0 - escodegen: ^2.0.0 - form-data: ^4.0.0 - html-encoding-sniffer: ^3.0.0 - http-proxy-agent: ^5.0.0 - https-proxy-agent: ^5.0.1 - is-potential-custom-element-name: ^1.0.1 - nwsapi: ^2.2.2 - parse5: ^7.1.1 - saxes: ^6.0.0 - symbol-tree: ^3.2.4 - tough-cookie: ^4.1.2 - w3c-xmlserializer: ^4.0.0 - webidl-conversions: ^7.0.0 - whatwg-encoding: ^2.0.0 - whatwg-mimetype: ^3.0.0 - whatwg-url: ^11.0.0 - ws: ^8.11.0 - xml-name-validator: ^4.0.0 - peerDependencies: - canvas: ^2.5.0 - peerDependenciesMeta: - canvas: - optional: true - checksum: 6e2ae21db397133a061b270c26d2dbc0b9051733ea3b896a7ece78d79f475ff0974f766a413c1198a79c793159119169f2335ddb23150348fbfdcfa6f3105536 - languageName: node - linkType: hard - -"jsesc@npm:^3.0.2, jsesc@npm:~3.0.2": - version: 3.0.2 - resolution: "jsesc@npm:3.0.2" - bin: - jsesc: bin/jsesc - checksum: a36d3ca40574a974d9c2063bf68c2b6141c20da8f2a36bd3279fc802563f35f0527a6c828801295bdfb2803952cf2cf387786c2c90ed564f88d5782475abfe3c - languageName: node - linkType: hard - -"json-bigint@npm:^1.0.0": - version: 1.0.0 - resolution: "json-bigint@npm:1.0.0" - dependencies: - bignumber.js: ^9.0.0 - checksum: c67bb93ccb3c291e60eb4b62931403e378906aab113ec1c2a8dd0f9a7f065ad6fd9713d627b732abefae2e244ac9ce1721c7a3142b2979532f12b258634ce6f6 - languageName: node - linkType: hard - -"json-buffer@npm:3.0.0": - version: 3.0.0 - resolution: "json-buffer@npm:3.0.0" - checksum: 0cecacb8025370686a916069a2ff81f7d55167421b6aa7270ee74e244012650dd6bce22b0852202ea7ff8624fce50ff0ec1bdf95914ccb4553426e290d5a63fa - languageName: node - linkType: hard - -"json-buffer@npm:3.0.1": - version: 3.0.1 - resolution: "json-buffer@npm:3.0.1" - checksum: 9026b03edc2847eefa2e37646c579300a1f3a4586cfb62bf857832b60c852042d0d6ae55d1afb8926163fa54c2b01d83ae24705f34990348bdac6273a29d4581 - languageName: node - linkType: hard - -"json-parse-better-errors@npm:^1.0.1": - version: 1.0.2 - resolution: "json-parse-better-errors@npm:1.0.2" - checksum: ff2b5ba2a70e88fd97a3cb28c1840144c5ce8fae9cbeeddba15afa333a5c407cf0e42300cd0a2885dbb055227fe68d405070faad941beeffbfde9cf3b2c78c5d - languageName: node - linkType: hard - -"json-parse-even-better-errors@npm:^2.3.0, json-parse-even-better-errors@npm:^2.3.1": - version: 2.3.1 - resolution: "json-parse-even-better-errors@npm:2.3.1" - checksum: 798ed4cf3354a2d9ccd78e86d2169515a0097a5c133337807cdf7f1fc32e1391d207ccfc276518cc1d7d8d4db93288b8a50ba4293d212ad1336e52a8ec0a941f - languageName: node - linkType: hard - -"json-rpc-engine@npm:^6.1.0": - version: 6.1.0 - resolution: "json-rpc-engine@npm:6.1.0" - dependencies: - "@metamask/safe-event-emitter": ^2.0.0 - eth-rpc-errors: ^4.0.2 - checksum: 33b6c9bbd81abf8e323a0281ee05871713203c40d34a4d0bda27706cd0a0935c7b51845238ba89b73027e44ebc8034bbd82db9f962e6c578eb922d9b95acc8bd - languageName: node - linkType: hard - -"json-rpc-random-id@npm:^1.0.0, json-rpc-random-id@npm:^1.0.1": - version: 1.0.1 - resolution: "json-rpc-random-id@npm:1.0.1" - checksum: fcd2e884193a129ace4002bd65a86e9cdb206733b4693baea77bd8b372cf8de3043fbea27716a2c9a716581a908ca8d978d9dfec4847eb2cf77edb4cf4b2252c - languageName: node - linkType: hard - -"json-schema-traverse@npm:^0.4.1": - version: 0.4.1 - resolution: "json-schema-traverse@npm:0.4.1" - checksum: 7486074d3ba247769fda17d5181b345c9fb7d12e0da98b22d1d71a5db9698d8b4bd900a3ec1a4ffdd60846fc2556274a5c894d0c48795f14cb03aeae7b55260b - languageName: node - linkType: hard - -"json-schema-traverse@npm:^1.0.0": - version: 1.0.0 - resolution: "json-schema-traverse@npm:1.0.0" - checksum: 02f2f466cdb0362558b2f1fd5e15cce82ef55d60cd7f8fa828cf35ba74330f8d767fcae5c5c2adb7851fa811766c694b9405810879bc4e1ddd78a7c0e03658ad - languageName: node - linkType: hard - -"json-schema@npm:0.4.0, json-schema@npm:^0.4.0": - version: 0.4.0 - resolution: "json-schema@npm:0.4.0" - checksum: 66389434c3469e698da0df2e7ac5a3281bcff75e797a5c127db7c5b56270e01ae13d9afa3c03344f76e32e81678337a8c912bdbb75101c62e487dc3778461d72 - languageName: node - linkType: hard - -"json-stable-stringify-without-jsonify@npm:^1.0.1": - version: 1.0.1 - resolution: "json-stable-stringify-without-jsonify@npm:1.0.1" - checksum: cff44156ddce9c67c44386ad5cddf91925fe06b1d217f2da9c4910d01f358c6e3989c4d5a02683c7a5667f9727ff05831f7aa8ae66c8ff691c556f0884d49215 - languageName: node - linkType: hard - -"json-stable-stringify@npm:^1.0.1": - version: 1.0.1 - resolution: "json-stable-stringify@npm:1.0.1" - dependencies: - jsonify: ~0.0.0 - checksum: 65d6cbf0fca72a4136999f65f4401cf39a129f7aeff0fdd987ac3d3423a2113659294045fb8377e6e20d865cac32b1b8d70f3d87346c9786adcee60661d96ca5 - languageName: node - linkType: hard - -"json-stream-stringify@npm:^3.1.4": - version: 3.1.6 - resolution: "json-stream-stringify@npm:3.1.6" - checksum: ce873e09fe18461960b7536f63e2f913a2cb242819513856ed1af58989d41846976e7177cb1fe3c835220023aa01e534d56b6d5c3290a5b23793a6f4cb93785e - languageName: node - linkType: hard - -"json-stringify-safe@npm:^5.0.1, json-stringify-safe@npm:~5.0.1": - version: 5.0.1 - resolution: "json-stringify-safe@npm:5.0.1" - checksum: 48ec0adad5280b8a96bb93f4563aa1667fd7a36334f79149abd42446d0989f2ddc58274b479f4819f1f00617957e6344c886c55d05a4e15ebb4ab931e4a6a8ee - languageName: node - linkType: hard - -"json-to-pretty-yaml@npm:^1.2.2": - version: 1.2.2 - resolution: "json-to-pretty-yaml@npm:1.2.2" - dependencies: - remedial: ^1.0.7 - remove-trailing-spaces: ^1.0.6 - checksum: 4b78480f426e176e5fdac073e05877683bb026f1175deb52d0941b992f9c91a58a812c020f00aa67ba1fc7cadb220539a264146f222e48a48c8bb2a0931cac9b - languageName: node - linkType: hard - -"json5@npm:2.2.2": - version: 2.2.2 - resolution: "json5@npm:2.2.2" - bin: - json5: lib/cli.js - checksum: 9a878d66b72157b073cf0017f3e5d93ec209fa5943abcb38d37a54b208917c166bd473c26a24695e67a016ce65759aeb89946592991f8f9174fb96c8e2492683 - languageName: node - linkType: hard - -"jsonc-parser@npm:^3.2.0": - version: 3.2.0 - resolution: "jsonc-parser@npm:3.2.0" - checksum: 946dd9a5f326b745aa326d48a7257e3f4a4b62c5e98ec8e49fa2bdd8d96cef7e6febf1399f5c7016114fd1f68a1c62c6138826d5d90bc650448e3cf0951c53c7 - languageName: node - linkType: hard - -"jsonfile@npm:^4.0.0": - version: 4.0.0 - resolution: "jsonfile@npm:4.0.0" - dependencies: - graceful-fs: ^4.1.6 - dependenciesMeta: - graceful-fs: - optional: true - checksum: 6447d6224f0d31623eef9b51185af03ac328a7553efcee30fa423d98a9e276ca08db87d71e17f2310b0263fd3ffa6c2a90a6308367f661dc21580f9469897c9e - languageName: node - linkType: hard - -"jsonfile@npm:^6.0.1, jsonfile@npm:^6.1.0": - version: 6.1.0 - resolution: "jsonfile@npm:6.1.0" - dependencies: - graceful-fs: ^4.1.6 - universalify: ^2.0.0 - dependenciesMeta: - graceful-fs: - optional: true - checksum: 7af3b8e1ac8fe7f1eccc6263c6ca14e1966fcbc74b618d3c78a0a2075579487547b94f72b7a1114e844a1e15bb00d440e5d1720bfc4612d790a6f285d5ea8354 - languageName: node - linkType: hard - -"jsonify@npm:~0.0.0": - version: 0.0.1 - resolution: "jsonify@npm:0.0.1" - checksum: 027287e1c0294fce15f18c0ff990cfc2318e7f01fb76515f784d5cd0784abfec6fc5c2355c3a2f2cb0ad7f4aa2f5b74ebbfe4e80476c35b2d13cabdb572e1134 - languageName: node - linkType: hard - -"jsonparse@npm:^1.2.0": - version: 1.3.1 - resolution: "jsonparse@npm:1.3.1" - checksum: 6514a7be4674ebf407afca0eda3ba284b69b07f9958a8d3113ef1005f7ec610860c312be067e450c569aab8b89635e332cee3696789c750692bb60daba627f4d - languageName: node - linkType: hard - -"jsonpath@npm:^1.1.1": - version: 1.1.1 - resolution: "jsonpath@npm:1.1.1" - dependencies: - esprima: 1.2.2 - static-eval: 2.0.2 - underscore: 1.12.1 - checksum: 5480d8e9e424fe2ed4ade6860b6e2cefddb21adb3a99abe0254cd9428e8ef9b0c9fb5729d6a5a514e90df50d645ccea9f3be48d627570e6222dd5dadc28eba7b - languageName: node - linkType: hard - -"jsonpointer@npm:^5.0.0": - version: 5.0.1 - resolution: "jsonpointer@npm:5.0.1" - checksum: 0b40f712900ad0c846681ea2db23b6684b9d5eedf55807b4708c656f5894b63507d0e28ae10aa1bddbea551241035afe62b6df0800fc94c2e2806a7f3adecd7c - languageName: node - linkType: hard - -"jsonwebtoken@npm:^9.0.0": - version: 9.0.0 - resolution: "jsonwebtoken@npm:9.0.0" - dependencies: - jws: ^3.2.2 - lodash: ^4.17.21 - ms: ^2.1.1 - semver: ^7.3.8 - checksum: b9181cecf9df99f1dc0253f91ba000a1aa4d91f5816d1608c0dba61a5623726a0bfe200b51df25de18c1a6000825d231ad7ce2788aa54fd48dcb760ad9eb9514 - languageName: node - linkType: hard - -"jsprim@npm:^2.0.2": - version: 2.0.2 - resolution: "jsprim@npm:2.0.2" - dependencies: - assert-plus: 1.0.0 - extsprintf: 1.3.0 - json-schema: 0.4.0 - verror: 1.10.0 - checksum: d175f6b1991e160cb0aa39bc857da780e035611986b5492f32395411879fdaf4e513d98677f08f7352dac93a16b66b8361c674b86a3fa406e2e7af6b26321838 - languageName: node - linkType: hard - -"jsx-ast-utils@npm:^2.4.1 || ^3.0.0, jsx-ast-utils@npm:^3.3.5": - version: 3.3.5 - resolution: "jsx-ast-utils@npm:3.3.5" - dependencies: - array-includes: ^3.1.6 - array.prototype.flat: ^1.3.1 - object.assign: ^4.1.4 - object.values: ^1.1.6 - checksum: f4b05fa4d7b5234230c905cfa88d36dc8a58a6666975a3891429b1a8cdc8a140bca76c297225cb7a499fad25a2c052ac93934449a2c31a44fc9edd06c773780a - languageName: node - linkType: hard - -"jszip@npm:^3.10.1": - version: 3.10.1 - resolution: "jszip@npm:3.10.1" - dependencies: - lie: ~3.3.0 - pako: ~1.0.2 - readable-stream: ~2.3.6 - setimmediate: ^1.0.5 - checksum: abc77bfbe33e691d4d1ac9c74c8851b5761fba6a6986630864f98d876f3fcc2d36817dfc183779f32c00157b5d53a016796677298272a714ae096dfe6b1c8b60 - languageName: node - linkType: hard - -"jwa@npm:^1.4.1": - version: 1.4.1 - resolution: "jwa@npm:1.4.1" - dependencies: - buffer-equal-constant-time: 1.0.1 - ecdsa-sig-formatter: 1.0.11 - safe-buffer: ^5.0.1 - checksum: ff30ea7c2dcc61f3ed2098d868bf89d43701605090c5b21b5544b512843ec6fd9e028381a4dda466cbcdb885c2d1150f7c62e7168394ee07941b4098e1035e2f - languageName: node - linkType: hard - -"jwa@npm:^2.0.0": - version: 2.0.0 - resolution: "jwa@npm:2.0.0" - dependencies: - buffer-equal-constant-time: 1.0.1 - ecdsa-sig-formatter: 1.0.11 - safe-buffer: ^5.0.1 - checksum: 8f00b71ad5fe94cb55006d0d19202f8f56889109caada2f7eeb63ca81755769ce87f4f48101967f398462e3b8ae4faebfbd5a0269cb755dead5d63c77ba4d2f1 - languageName: node - linkType: hard - -"jws@npm:^3.2.2": - version: 3.2.2 - resolution: "jws@npm:3.2.2" - dependencies: - jwa: ^1.4.1 - safe-buffer: ^5.0.1 - checksum: f0213fe5b79344c56cd443428d8f65c16bf842dc8cb8f5aed693e1e91d79c20741663ad6eff07a6d2c433d1831acc9814e8d7bada6a0471fbb91d09ceb2bf5c2 - languageName: node - linkType: hard - -"jws@npm:^4.0.0": - version: 4.0.0 - resolution: "jws@npm:4.0.0" - dependencies: - jwa: ^2.0.0 - safe-buffer: ^5.0.1 - checksum: d68d07aa6d1b8cb35c363a9bd2b48f15064d342a5d9dc18a250dbbce8dc06bd7e4792516c50baa16b8d14f61167c19e851fd7f66b59ecc68b7f6a013759765f7 - languageName: node - linkType: hard - -"keccak@npm:^3.0.0, keccak@npm:^3.0.2, keccak@npm:^3.0.3": - version: 3.0.4 - resolution: "keccak@npm:3.0.4" - dependencies: - node-addon-api: ^2.0.0 - node-gyp: latest - node-gyp-build: ^4.2.0 - readable-stream: ^3.6.0 - checksum: 2bf27b97b2f24225b1b44027de62be547f5c7326d87d249605665abd0c8c599d774671c35504c62c9b922cae02758504c6f76a73a84234d23af8a2211afaaa11 - languageName: node - linkType: hard - -"keyv@npm:^3.0.0": - version: 3.1.0 - resolution: "keyv@npm:3.1.0" - dependencies: - json-buffer: 3.0.0 - checksum: bb7e8f3acffdbafbc2dd5b63f377fe6ec4c0e2c44fc82720449ef8ab54f4a7ce3802671ed94c0f475ae0a8549703353a2124561fcf3317010c141b32ca1ce903 - languageName: node - linkType: hard - -"keyv@npm:^4.0.0": - version: 4.5.2 - resolution: "keyv@npm:4.5.2" - dependencies: - json-buffer: 3.0.1 - checksum: 13ad58303acd2261c0d4831b4658451603fd159e61daea2121fcb15feb623e75ee328cded0572da9ca76b7b3ceaf8e614f1806c6b3af5db73c9c35a345259651 - languageName: node - linkType: hard - -"keyvaluestorage-interface@npm:^1.0.0": - version: 1.0.0 - resolution: "keyvaluestorage-interface@npm:1.0.0" - checksum: e20530e71b738dc094ad170a91a98d4b9bdc772dd9044b23cdaaa102aafa8997b1ac867550a1e66ba1d64fcaa949214df31aed18413b4bac31e5fe1f2c76c9de - languageName: node - linkType: hard - -"kind-of@npm:^5.0.0": - version: 5.1.0 - resolution: "kind-of@npm:5.1.0" - checksum: f2a0102ae0cf19c4a953397e552571bad2b588b53282874f25fca7236396e650e2db50d41f9f516bd402536e4df968dbb51b8e69e4d5d4a7173def78448f7bab - languageName: node - linkType: hard - -"kind-of@npm:^6.0.0, kind-of@npm:^6.0.1, kind-of@npm:^6.0.2, kind-of@npm:^6.0.3": - version: 6.0.3 - resolution: "kind-of@npm:6.0.3" - checksum: 3ab01e7b1d440b22fe4c31f23d8d38b4d9b91d9f291df683476576493d5dfd2e03848a8b05813dd0c3f0e835bc63f433007ddeceb71f05cb25c45ae1b19c6d3b - languageName: node - linkType: hard - -"kleur@npm:^3.0.3": - version: 3.0.3 - resolution: "kleur@npm:3.0.3" - checksum: df82cd1e172f957bae9c536286265a5cdbd5eeca487cb0a3b2a7b41ef959fc61f8e7c0e9aeea9c114ccf2c166b6a8dd45a46fd619c1c569d210ecd2765ad5169 - languageName: node - linkType: hard - -"klona@npm:^2.0.4, klona@npm:^2.0.5": - version: 2.0.6 - resolution: "klona@npm:2.0.6" - checksum: ac9ee3732e42b96feb67faae4d27cf49494e8a3bf3fa7115ce242fe04786788e0aff4741a07a45a2462e2079aa983d73d38519c85d65b70ef11447bbc3c58ce7 - languageName: node - linkType: hard - -"language-subtag-registry@npm:^0.3.20": - version: 0.3.23 - resolution: "language-subtag-registry@npm:0.3.23" - checksum: 0b64c1a6c5431c8df648a6d25594ff280613c886f4a1a542d9b864e5472fb93e5c7856b9c41595c38fac31370328fc79fcc521712e89ea6d6866cbb8e0995d81 - languageName: node - linkType: hard - -"language-tags@npm:^1.0.9": - version: 1.0.9 - resolution: "language-tags@npm:1.0.9" - dependencies: - language-subtag-registry: ^0.3.20 - checksum: 57c530796dc7179914dee71bc94f3747fd694612480241d0453a063777265dfe3a951037f7acb48f456bf167d6eb419d4c00263745326b3ba1cdcf4657070e78 - languageName: node - linkType: hard - -"latest-version@npm:^3.0.0": - version: 3.1.0 - resolution: "latest-version@npm:3.1.0" - dependencies: - package-json: ^4.0.0 - checksum: 1923b097b5e674727416de873abf9a671c28edb4181e435c74701c6124af942d2c83a7698bb66c6c7ce1eaae945c99beae2ef787c8409512b80a734686e977f7 - languageName: node - linkType: hard - -"launch-editor@npm:^2.6.0": - version: 2.6.0 - resolution: "launch-editor@npm:2.6.0" - dependencies: - picocolors: ^1.0.0 - shell-quote: ^1.7.3 - checksum: 48e4230643e8fdb5c14c11314706d58d9f3fbafe2606be3d6e37da1918ad8bfe39dd87875c726a1b59b9f4da99d87ec3e36d4c528464f0b820f9e91e5cb1c02d - languageName: node - linkType: hard - -"lazy-ass@npm:1.6.0, lazy-ass@npm:^1.6.0": - version: 1.6.0 - resolution: "lazy-ass@npm:1.6.0" - checksum: 5a3ebb17915b03452320804466345382a6c25ac782ec4874fecdb2385793896cd459be2f187dc7def8899180c32ee0ab9a1aa7fe52193ac3ff3fe29bb0591729 - languageName: node - linkType: hard - -"lazystream@npm:^1.0.0": - version: 1.0.0 - resolution: "lazystream@npm:1.0.0" - dependencies: - readable-stream: ^2.0.5 - checksum: 6cb9352a697bad74471671b299997edc736b400bb405dc409acfc9ffe584bb6f86898c4ace86b2f145ae32fe42ef60bd68749acb62c2ff3fa6bded721193f79c - languageName: node - linkType: hard - -"lead@npm:^1.0.0": - version: 1.0.0 - resolution: "lead@npm:1.0.0" - dependencies: - flush-write-stream: ^1.0.2 - checksum: f08a9f45ac39b8d1fecf31de4d97a8fa2aa7e233e99bb61fd443414fc8055331224490698e186cb614aa3ea2f2695d71c42afc85415fa680b078d640efadab50 - languageName: node - linkType: hard - -"leven@npm:^3.1.0": - version: 3.1.0 - resolution: "leven@npm:3.1.0" - checksum: 638401d534585261b6003db9d99afd244dfe82d75ddb6db5c0df412842d5ab30b2ef18de471aaec70fe69a46f17b4ae3c7f01d8a4e6580ef7adb9f4273ad1e55 - languageName: node - linkType: hard - -"levn@npm:^0.4.1": - version: 0.4.1 - resolution: "levn@npm:0.4.1" - dependencies: - prelude-ls: ^1.2.1 - type-check: ~0.4.0 - checksum: 12c5021c859bd0f5248561bf139121f0358285ec545ebf48bb3d346820d5c61a4309535c7f387ed7d84361cf821e124ce346c6b7cef8ee09a67c1473b46d0fc4 - languageName: node - linkType: hard - -"levn@npm:~0.3.0": - version: 0.3.0 - resolution: "levn@npm:0.3.0" - dependencies: - prelude-ls: ~1.1.2 - type-check: ~0.3.2 - checksum: 0d084a524231a8246bb10fec48cdbb35282099f6954838604f3c7fc66f2e16fa66fd9cc2f3f20a541a113c4dafdf181e822c887c8a319c9195444e6c64ac395e - languageName: node - linkType: hard - -"li@npm:^1.3.0": - version: 1.3.0 - resolution: "li@npm:1.3.0" - checksum: 44056b8278771cc11c93a9622860554e34181a7c3789b6bf57b2f9a5ccb02fadc169d211c3f360615a790f3bd54bfc5618c5615ffce3a8e68e515b5bea4bede4 - languageName: node - linkType: hard - -"lie@npm:3.1.1": - version: 3.1.1 - resolution: "lie@npm:3.1.1" - dependencies: - immediate: ~3.0.5 - checksum: 6da9f2121d2dbd15f1eca44c0c7e211e66a99c7b326ec8312645f3648935bc3a658cf0e9fa7b5f10144d9e2641500b4f55bd32754607c3de945b5f443e50ddd1 - languageName: node - linkType: hard - -"lie@npm:~3.3.0": - version: 3.3.0 - resolution: "lie@npm:3.3.0" - dependencies: - immediate: ~3.0.5 - checksum: 33102302cf19766f97919a6a98d481e01393288b17a6aa1f030a3542031df42736edde8dab29ffdbf90bebeffc48c761eb1d064dc77592ca3ba3556f9fe6d2a8 - languageName: node - linkType: hard - -"lighthouse-logger@npm:^1.0.0": - version: 1.4.2 - resolution: "lighthouse-logger@npm:1.4.2" - dependencies: - debug: ^2.6.9 - marky: ^1.2.2 - checksum: ba6b73d93424318fab58b4e07c9ed246e3e969a3313f26b69515ed4c06457dd9a0b11bc706948398fdaef26aa4ba5e65cb848c37ce59f470d3c6c450b9b79a33 - languageName: node - linkType: hard - -"lightningcss-darwin-arm64@npm:1.27.0": - version: 1.27.0 - resolution: "lightningcss-darwin-arm64@npm:1.27.0" - conditions: os=darwin & cpu=arm64 - languageName: node - linkType: hard - -"lightningcss-darwin-x64@npm:1.27.0": - version: 1.27.0 - resolution: "lightningcss-darwin-x64@npm:1.27.0" - conditions: os=darwin & cpu=x64 - languageName: node - linkType: hard - -"lightningcss-freebsd-x64@npm:1.27.0": - version: 1.27.0 - resolution: "lightningcss-freebsd-x64@npm:1.27.0" - conditions: os=freebsd & cpu=x64 - languageName: node - linkType: hard - -"lightningcss-linux-arm-gnueabihf@npm:1.27.0": - version: 1.27.0 - resolution: "lightningcss-linux-arm-gnueabihf@npm:1.27.0" - conditions: os=linux & cpu=arm - languageName: node - linkType: hard - -"lightningcss-linux-arm64-gnu@npm:1.27.0": - version: 1.27.0 - resolution: "lightningcss-linux-arm64-gnu@npm:1.27.0" - conditions: os=linux & cpu=arm64 & libc=glibc - languageName: node - linkType: hard - -"lightningcss-linux-arm64-musl@npm:1.27.0": - version: 1.27.0 - resolution: "lightningcss-linux-arm64-musl@npm:1.27.0" - conditions: os=linux & cpu=arm64 & libc=musl - languageName: node - linkType: hard - -"lightningcss-linux-x64-gnu@npm:1.27.0": - version: 1.27.0 - resolution: "lightningcss-linux-x64-gnu@npm:1.27.0" - conditions: os=linux & cpu=x64 & libc=glibc - languageName: node - linkType: hard - -"lightningcss-linux-x64-musl@npm:1.27.0": - version: 1.27.0 - resolution: "lightningcss-linux-x64-musl@npm:1.27.0" - conditions: os=linux & cpu=x64 & libc=musl - languageName: node - linkType: hard - -"lightningcss-win32-arm64-msvc@npm:1.27.0": - version: 1.27.0 - resolution: "lightningcss-win32-arm64-msvc@npm:1.27.0" - conditions: os=win32 & cpu=arm64 - languageName: node - linkType: hard - -"lightningcss-win32-x64-msvc@npm:1.27.0": - version: 1.27.0 - resolution: "lightningcss-win32-x64-msvc@npm:1.27.0" - conditions: os=win32 & cpu=x64 - languageName: node - linkType: hard - -"lightningcss@npm:~1.27.0": - version: 1.27.0 - resolution: "lightningcss@npm:1.27.0" - dependencies: - detect-libc: ^1.0.3 - lightningcss-darwin-arm64: 1.27.0 - lightningcss-darwin-x64: 1.27.0 - lightningcss-freebsd-x64: 1.27.0 - lightningcss-linux-arm-gnueabihf: 1.27.0 - lightningcss-linux-arm64-gnu: 1.27.0 - lightningcss-linux-arm64-musl: 1.27.0 - lightningcss-linux-x64-gnu: 1.27.0 - lightningcss-linux-x64-musl: 1.27.0 - lightningcss-win32-arm64-msvc: 1.27.0 - lightningcss-win32-x64-msvc: 1.27.0 - dependenciesMeta: - lightningcss-darwin-arm64: - optional: true - lightningcss-darwin-x64: - optional: true - lightningcss-freebsd-x64: - optional: true - lightningcss-linux-arm-gnueabihf: - optional: true - lightningcss-linux-arm64-gnu: - optional: true - lightningcss-linux-arm64-musl: - optional: true - lightningcss-linux-x64-gnu: - optional: true - lightningcss-linux-x64-musl: - optional: true - lightningcss-win32-arm64-msvc: - optional: true - lightningcss-win32-x64-msvc: - optional: true - checksum: 3761a4feb67ca250bf1b1cb1982a3d212dee56ea345dd487592908648e70d8c17da2f5918affaf08b6cdc4e4702eee29d800ff29e16d194e7af6300af1b28409 - languageName: node - linkType: hard - -"lightweight-charts@npm:4.1.1": - version: 4.1.1 - resolution: "lightweight-charts@npm:4.1.1" - dependencies: - fancy-canvas: 2.1.0 - checksum: c90ee2370b82758ae402a855f8729b8ca19a268e923ecd7e0faa04490b91ac0a0de26a76c42fc47aad2adf24627b5766a4e56b1ecdff0d7d03a768c4edc8c3e9 - languageName: node - linkType: hard - -"lightweight-charts@patch:lightweight-charts@npm%3A4.1.1#./.yarn/patches/lightweight-charts-npm-4.1.1-01f161d9b6.patch::locator=universe%40workspace%3A.": - version: 4.1.1 - resolution: "lightweight-charts@patch:lightweight-charts@npm%3A4.1.1#./.yarn/patches/lightweight-charts-npm-4.1.1-01f161d9b6.patch::version=4.1.1&hash=ec459c&locator=universe%40workspace%3A." - dependencies: - fancy-canvas: 2.1.0 - checksum: 5e2bdb5deb24d109f255db81893c7afc7907cf1a6c43a90bfd0bbb5c4301cf3d458217bff1bcd8024a75b3a6ff60b6149935e1ac70f146ca4863552b92f781de - languageName: node - linkType: hard - -"lilconfig@npm:2.1.0, lilconfig@npm:^2.0.3, lilconfig@npm:^2.0.6": - version: 2.1.0 - resolution: "lilconfig@npm:2.1.0" - checksum: 8549bb352b8192375fed4a74694cd61ad293904eee33f9d4866c2192865c44c4eb35d10782966242634e0cbc1e91fe62b1247f148dc5514918e3a966da7ea117 - languageName: node - linkType: hard - -"lilconfig@npm:^3.0.0, lilconfig@npm:^3.1.3": - version: 3.1.3 - resolution: "lilconfig@npm:3.1.3" - checksum: 644eb10830350f9cdc88610f71a921f510574ed02424b57b0b3abb66ea725d7a082559552524a842f4e0272c196b88dfe1ff7d35ffcc6f45736777185cd67c9a - languageName: node - linkType: hard - -"linebreak@npm:^1.1.0": - version: 1.1.0 - resolution: "linebreak@npm:1.1.0" - dependencies: - base64-js: 0.0.8 - unicode-trie: ^2.0.0 - checksum: 65cb66900b4b60d99bb761fb4143d8673ad5dd57dd850fcd921fe425a5a8e3c4416ebee76a68058a90d88b5033a50b210f522558a7e0c7d95ca907b5a2b52520 - languageName: node - linkType: hard - -"lines-and-columns@npm:^1.1.6": - version: 1.2.4 - resolution: "lines-and-columns@npm:1.2.4" - checksum: 0c37f9f7fa212b38912b7145e1cd16a5f3cd34d782441c3e6ca653485d326f58b3caccda66efce1c5812bde4961bbde3374fae4b0d11bf1226152337f3894aa5 - languageName: node - linkType: hard - -"linkify-it@npm:^2.0.0": - version: 2.2.0 - resolution: "linkify-it@npm:2.2.0" - dependencies: - uc.micro: ^1.0.1 - checksum: d198871d0b3f3cfdb745dae564bfd6743474f20cd0ef1057e6ca29451834749e7f3da52b59b4de44e98f31a1e5c71bdad160490d4ae54de251cbcde57e4d7837 - languageName: node - linkType: hard - -"lint-staged@npm:14.0.1": - version: 14.0.1 - resolution: "lint-staged@npm:14.0.1" - dependencies: - chalk: 5.3.0 - commander: 11.0.0 - debug: 4.3.4 - execa: 7.2.0 - lilconfig: 2.1.0 - listr2: 6.6.1 - micromatch: 4.0.5 - pidtree: 0.6.0 - string-argv: 0.3.2 - yaml: 2.3.1 - bin: - lint-staged: bin/lint-staged.js - checksum: 8c5d740cb3c90fab2d970fa6bbffe5ddf35ec66ed374a52caf3a3cf83d8f4d5fd01a949994822bce5ea18c0b8dc8fa4ce087ef886a8c11db674139a063cdfe4f - languageName: node - linkType: hard - -"listhen@npm:^1.5.5": - version: 1.5.6 - resolution: "listhen@npm:1.5.6" - dependencies: - "@parcel/watcher": ^2.3.0 - "@parcel/watcher-wasm": 2.3.0 - citty: ^0.1.5 - clipboardy: ^4.0.0 - consola: ^3.2.3 - defu: ^6.1.4 - get-port-please: ^3.1.2 - h3: ^1.10.0 - http-shutdown: ^1.2.2 - jiti: ^1.21.0 - mlly: ^1.4.2 - node-forge: ^1.3.1 - pathe: ^1.1.1 - std-env: ^3.7.0 - ufo: ^1.3.2 - untun: ^0.1.3 - uqr: ^0.1.2 - bin: - listen: bin/listhen.mjs - listhen: bin/listhen.mjs - checksum: 8e0b577abdce014b93e934c564a0a67624ec2d1a3215906c1ae5c7daa2ab074e215085a77f7dd229066e44f966c598fdea9725f9ae5963389a020e7b4fb2f187 - languageName: node - linkType: hard - -"listr2@npm:6.6.1": - version: 6.6.1 - resolution: "listr2@npm:6.6.1" - dependencies: - cli-truncate: ^3.1.0 - colorette: ^2.0.20 - eventemitter3: ^5.0.1 - log-update: ^5.0.1 - rfdc: ^1.3.0 - wrap-ansi: ^8.1.0 - peerDependencies: - enquirer: ">= 2.3.0 < 3" - peerDependenciesMeta: - enquirer: - optional: true - checksum: 99600e8a51f838f7208bce7e16d6b3d91d361f13881e6aa91d0b561a9a093ddcf63b7bc2a7b47aec7fdbff9d0e8c9f68cb66e6dfe2d857e5b1df8ab045c26ce8 - languageName: node - linkType: hard - -"listr2@npm:^3.8.3": - version: 3.14.0 - resolution: "listr2@npm:3.14.0" - dependencies: - cli-truncate: ^2.1.0 - colorette: ^2.0.16 - log-update: ^4.0.0 - p-map: ^4.0.0 - rfdc: ^1.3.0 - rxjs: ^7.5.1 - through: ^2.3.8 - wrap-ansi: ^7.0.0 - peerDependencies: - enquirer: ">= 2.3.0 < 3" - peerDependenciesMeta: - enquirer: - optional: true - checksum: fdb8b2d6bdf5df9371ebd5082bee46c6d0ca3d1e5f2b11fbb5a127839855d5f3da9d4968fce94f0a5ec67cac2459766abbb1faeef621065ebb1829b11ef9476d - languageName: node - linkType: hard - -"listr2@npm:^4.0.5": - version: 4.0.5 - resolution: "listr2@npm:4.0.5" - dependencies: - cli-truncate: ^2.1.0 - colorette: ^2.0.16 - log-update: ^4.0.0 - p-map: ^4.0.0 - rfdc: ^1.3.0 - rxjs: ^7.5.5 - through: ^2.3.8 - wrap-ansi: ^7.0.0 - peerDependencies: - enquirer: ">= 2.3.0 < 3" - peerDependenciesMeta: - enquirer: - optional: true - checksum: 7af31851abe25969ef0581c6db808117e36af15b131401795182427769d9824f451ba9e8aff6ccd25b6a4f6c8796f816292caf08e5f1f9b1775e8e9c313dc6c5 - languageName: node - linkType: hard - -"lit-element@npm:^3.3.0": - version: 3.3.3 - resolution: "lit-element@npm:3.3.3" - dependencies: - "@lit-labs/ssr-dom-shim": ^1.1.0 - "@lit/reactive-element": ^1.3.0 - lit-html: ^2.8.0 - checksum: 29a596fa556e231cce7246ca3e5687ad238f299b0cb374a0934d5e6fe9adf1436e031d4fbd21b280aabfc0e21a66e6c4b52da558a908df2566d09d960f3ca93d - languageName: node - linkType: hard - -"lit-html@npm:^2.8.0": - version: 2.8.0 - resolution: "lit-html@npm:2.8.0" - dependencies: - "@types/trusted-types": ^2.0.2 - checksum: 2d70df07248bcb2f502a3afb1e91d260735024fa669669ffb1417575aa39c3092779725ac1b90f5f39e4ce78c63f431f51176bc67f532389f0285a6991573255 - languageName: node - linkType: hard - -"lit@npm:2.8.0": - version: 2.8.0 - resolution: "lit@npm:2.8.0" - dependencies: - "@lit/reactive-element": ^1.6.0 - lit-element: ^3.3.0 - lit-html: ^2.8.0 - checksum: 2480e733f7d022d3ecba91abc58a20968f0ca8f5fa30b3341ecf4bcf4845e674ad27b721a5ae53529cafc6ca603c015b80d0979ceb7a711e268ef20bb6bc7527 - languageName: node - linkType: hard - -"load-bmfont@npm:^1.3.1": - version: 1.4.1 - resolution: "load-bmfont@npm:1.4.1" - dependencies: - buffer-equal: 0.0.1 - mime: ^1.3.4 - parse-bmfont-ascii: ^1.0.3 - parse-bmfont-binary: ^1.0.5 - parse-bmfont-xml: ^1.1.4 - phin: ^2.9.1 - xhr: ^2.0.1 - xtend: ^4.0.0 - checksum: 688d932fb0dc4c9333747736ccd926261f0b91734b7bdb6ff24f8659ef068a0f0b2278084b208851afac0beec79af7bd6664fe2ed5b6c5e1db88755fc25f785e - languageName: node - linkType: hard - -"loader-runner@npm:^4.2.0": - version: 4.3.0 - resolution: "loader-runner@npm:4.3.0" - checksum: a90e00dee9a16be118ea43fec3192d0b491fe03a32ed48a4132eb61d498f5536a03a1315531c19d284392a8726a4ecad71d82044c28d7f22ef62e029bf761569 - languageName: node - linkType: hard - -"loader-utils@npm:^1.4.0": - version: 1.4.2 - resolution: "loader-utils@npm:1.4.2" - dependencies: - big.js: ^5.2.2 - emojis-list: ^3.0.0 - json5: ^1.0.1 - checksum: eb6fb622efc0ffd1abdf68a2022f9eac62bef8ec599cf8adb75e94d1d338381780be6278534170e99edc03380a6d29bc7eb1563c89ce17c5fed3a0b17f1ad804 - languageName: node - linkType: hard - -"loader-utils@npm:^2.0.0, loader-utils@npm:^2.0.4": - version: 2.0.4 - resolution: "loader-utils@npm:2.0.4" - dependencies: - big.js: ^5.2.2 - emojis-list: ^3.0.0 - json5: ^2.1.2 - checksum: a5281f5fff1eaa310ad5e1164095689443630f3411e927f95031ab4fb83b4a98f388185bb1fe949e8ab8d4247004336a625e9255c22122b815bb9a4c5d8fc3b7 - languageName: node - linkType: hard - -"loader-utils@npm:^3.2.0, loader-utils@npm:^3.2.1": - version: 3.3.1 - resolution: "loader-utils@npm:3.3.1" - checksum: d35808e081635e5bc50228a52ed79f83e2c82bd8f7578818c12b1b4cf0b7f409d72d9b93a683ec36b9eaa93346693d3f3c8380183ba2ff81599b0829d685de39 - languageName: node - linkType: hard - -"localforage@npm:1.10.0": - version: 1.10.0 - resolution: "localforage@npm:1.10.0" - dependencies: - lie: 3.1.1 - checksum: f2978b434dafff9bcb0d9498de57d97eba165402419939c944412e179cab1854782830b5ec196212560b22712d1dd03918939f59cf1d4fc1d756fca7950086cf - languageName: node - linkType: hard - -"locate-path@npm:^3.0.0": - version: 3.0.0 - resolution: "locate-path@npm:3.0.0" - dependencies: - p-locate: ^3.0.0 - path-exists: ^3.0.0 - checksum: 53db3996672f21f8b0bf2a2c645ae2c13ffdae1eeecfcd399a583bce8516c0b88dcb4222ca6efbbbeb6949df7e46860895be2c02e8d3219abd373ace3bfb4e11 - languageName: node - linkType: hard - -"locate-path@npm:^5.0.0": - version: 5.0.0 - resolution: "locate-path@npm:5.0.0" - dependencies: - p-locate: ^4.1.0 - checksum: 83e51725e67517287d73e1ded92b28602e3ae5580b301fe54bfb76c0c723e3f285b19252e375712316774cf52006cb236aed5704692c32db0d5d089b69696e30 - languageName: node - linkType: hard - -"locate-path@npm:^6.0.0": - version: 6.0.0 - resolution: "locate-path@npm:6.0.0" - dependencies: - p-locate: ^5.0.0 - checksum: 72eb661788a0368c099a184c59d2fee760b3831c9c1c33955e8a19ae4a21b4116e53fa736dc086cdeb9fce9f7cc508f2f92d2d3aae516f133e16a2bb59a39f5a - languageName: node - linkType: hard - -"lodash.camelcase@npm:^4.3.0": - version: 4.3.0 - resolution: "lodash.camelcase@npm:4.3.0" - checksum: cb9227612f71b83e42de93eccf1232feeb25e705bdb19ba26c04f91e885bfd3dd5c517c4a97137658190581d3493ea3973072ca010aab7e301046d90740393d1 - languageName: node - linkType: hard - -"lodash.clonedeep@npm:^4.5.0": - version: 4.5.0 - resolution: "lodash.clonedeep@npm:4.5.0" - checksum: 92c46f094b064e876a23c97f57f81fbffd5d760bf2d8a1c61d85db6d1e488c66b0384c943abee4f6af7debf5ad4e4282e74ff83177c9e63d8ff081a4837c3489 - languageName: node - linkType: hard - -"lodash.debounce@npm:4.0.8, lodash.debounce@npm:^4.0.8": - version: 4.0.8 - resolution: "lodash.debounce@npm:4.0.8" - checksum: a3f527d22c548f43ae31c861ada88b2637eb48ac6aa3eb56e82d44917971b8aa96fbb37aa60efea674dc4ee8c42074f90f7b1f772e9db375435f6c83a19b3bc6 - languageName: node - linkType: hard - -"lodash.defaults@npm:^4.2.0": - version: 4.2.0 - resolution: "lodash.defaults@npm:4.2.0" - checksum: 84923258235592c8886e29de5491946ff8c2ae5c82a7ac5cddd2e3cb697e6fbdfbbb6efcca015795c86eec2bb953a5a2ee4016e3735a3f02720428a40efbb8f1 - languageName: node - linkType: hard - -"lodash.find@npm:^4.6.0": - version: 4.6.0 - resolution: "lodash.find@npm:4.6.0" - checksum: b737f849a4fe36f5c3664ea636780dda2fde18335021faf80cdfdcb300ed75441da6f55cfd6de119092d8bb2ddbc4433f4a8de4b99c0b9c8640465b0901c717c - languageName: node - linkType: hard - -"lodash.includes@npm:^4.3.0": - version: 4.3.0 - resolution: "lodash.includes@npm:4.3.0" - checksum: 71092c130515a67ab3bd928f57f6018434797c94def7f46aafa417771e455ce3a4834889f4267b17887d7f75297dfabd96231bf704fd2b8c5096dc4a913568b6 - languageName: node - linkType: hard - -"lodash.isarguments@npm:^3.1.0": - version: 3.1.0 - resolution: "lodash.isarguments@npm:3.1.0" - checksum: ae1526f3eb5c61c77944b101b1f655f846ecbedcb9e6b073526eba6890dc0f13f09f72e11ffbf6540b602caee319af9ac363d6cdd6be41f4ee453436f04f13b5 - languageName: node - linkType: hard - -"lodash.isequal@npm:4.5.0, lodash.isequal@npm:^4.5.0": - version: 4.5.0 - resolution: "lodash.isequal@npm:4.5.0" - checksum: da27515dc5230eb1140ba65ff8de3613649620e8656b19a6270afe4866b7bd461d9ba2ac8a48dcc57f7adac4ee80e1de9f965d89d4d81a0ad52bb3eec2609644 - languageName: node - linkType: hard - -"lodash.isfunction@npm:^3.0.9": - version: 3.0.9 - resolution: "lodash.isfunction@npm:3.0.9" - checksum: 99e54c34b1e8a9ba75c034deb39cedbd2aca7af685815e67a2a8ec4f73ec9748cda6ebee5a07d7de4b938e90d421fd280e9c385cc190f903ac217ac8aff30314 - languageName: node - linkType: hard - -"lodash.ismatch@npm:^4.4.0": - version: 4.4.0 - resolution: "lodash.ismatch@npm:4.4.0" - checksum: a393917578842705c7fc1a30fb80613d1ac42d20b67eb26a2a6004d6d61ee90b419f9eb320508ddcd608e328d91eeaa2651411727eaa9a12534ed6ccb02fc705 - languageName: node - linkType: hard - -"lodash.isobject@npm:^3.0.2": - version: 3.0.2 - resolution: "lodash.isobject@npm:3.0.2" - checksum: 6c1667cbc4494d0a13a3617a4b23278d6d02dac520311f2bbb43f16f2cf71d2e6eb9dec8057315b77459df4890c756a256a087d3f4baa44a79ab5d6c968b060e - languageName: node - linkType: hard - -"lodash.isplainobject@npm:^4.0.6": - version: 4.0.6 - resolution: "lodash.isplainobject@npm:4.0.6" - checksum: 29c6351f281e0d9a1d58f1a4c8f4400924b4c79f18dfc4613624d7d54784df07efaff97c1ff2659f3e085ecf4fff493300adc4837553104cef2634110b0d5337 - languageName: node - linkType: hard - -"lodash.kebabcase@npm:^4.1.1": - version: 4.1.1 - resolution: "lodash.kebabcase@npm:4.1.1" - checksum: 5a6c59161914e1bae23438a298c7433e83d935e0f59853fa862e691164696bc07f6dfa4c313d499fbf41ba8d53314e9850416502376705a357d24ee6ca33af78 - languageName: node - linkType: hard - -"lodash.keys@npm:^4.0.8": - version: 4.2.0 - resolution: "lodash.keys@npm:4.2.0" - checksum: 055576c8c4a0bacc0c1da9bcbb520e6e70dcf94c609495263686c62c8242a440293e9ab8387a7398dda529cb05b76e8f783c3fd3d6ba7bc6d5d6d2e08e8512ae - languageName: node - linkType: hard - -"lodash.mapvalues@npm:^4.6.0": - version: 4.6.0 - resolution: "lodash.mapvalues@npm:4.6.0" - checksum: 0ff1b252fda318fc36e47c296984925e98fbb0fc5a2ecc4ef458f3c739a9476d47e40c95ac653e8314d132aa59c746d4276527b99d6e271940555c6e12d2babd - languageName: node - linkType: hard - -"lodash.memoize@npm:^4.1.2": - version: 4.1.2 - resolution: "lodash.memoize@npm:4.1.2" - checksum: 9ff3942feeccffa4f1fafa88d32f0d24fdc62fd15ded5a74a5f950ff5f0c6f61916157246744c620173dddf38d37095a92327d5fd3861e2063e736a5c207d089 - languageName: node - linkType: hard - -"lodash.merge@npm:^4.6.2": - version: 4.6.2 - resolution: "lodash.merge@npm:4.6.2" - checksum: ad580b4bdbb7ca1f7abf7e1bce63a9a0b98e370cf40194b03380a46b4ed799c9573029599caebc1b14e3f24b111aef72b96674a56cfa105e0f5ac70546cdc005 - languageName: node - linkType: hard - -"lodash.mergewith@npm:^4.6.2": - version: 4.6.2 - resolution: "lodash.mergewith@npm:4.6.2" - checksum: a6db2a9339752411f21b956908c404ec1e088e783a65c8b29e30ae5b3b6384f82517662d6f425cc97c2070b546cc2c7daaa8d33f78db7b6e9be06cd834abdeb8 - languageName: node - linkType: hard - -"lodash.once@npm:^4.1.1": - version: 4.1.1 - resolution: "lodash.once@npm:4.1.1" - checksum: d768fa9f9b4e1dc6453be99b753906f58990e0c45e7b2ca5a3b40a33111e5d17f6edf2f768786e2716af90a8e78f8f91431ab8435f761fef00f9b0c256f6d245 - languageName: node - linkType: hard - -"lodash.snakecase@npm:^4.1.1": - version: 4.1.1 - resolution: "lodash.snakecase@npm:4.1.1" - checksum: 1685ed3e83dda6eae5a4dcaee161a51cd210aabb3e1c09c57150e7dd8feda19e4ca0d27d0631eabe8d0f4eaa51e376da64e8c018ae5415417c5890d42feb72a8 - languageName: node - linkType: hard - -"lodash.sortby@npm:^4.7.0": - version: 4.7.0 - resolution: "lodash.sortby@npm:4.7.0" - checksum: db170c9396d29d11fe9a9f25668c4993e0c1331bcb941ddbd48fb76f492e732add7f2a47cfdf8e9d740fa59ac41bbfaf931d268bc72aab3ab49e9f89354d718c - languageName: node - linkType: hard - -"lodash.startcase@npm:^4.4.0": - version: 4.4.0 - resolution: "lodash.startcase@npm:4.4.0" - checksum: c03a4a784aca653845fe09d0ef67c902b6e49288dc45f542a4ab345a9c406a6dc194c774423fa313ee7b06283950301c1221dd2a1d8ecb2dac8dfbb9ed5606b5 - languageName: node - linkType: hard - -"lodash.throttle@npm:^4.1.1": - version: 4.1.1 - resolution: "lodash.throttle@npm:4.1.1" - checksum: 129c0a28cee48b348aef146f638ef8a8b197944d4e9ec26c1890c19d9bf5a5690fe11b655c77a4551268819b32d27f4206343e30c78961f60b561b8608c8c805 - languageName: node - linkType: hard - -"lodash.truncate@npm:^4.4.2": - version: 4.4.2 - resolution: "lodash.truncate@npm:4.4.2" - checksum: b463d8a382cfb5f0e71c504dcb6f807a7bd379ff1ea216669aa42c52fc28c54e404bfbd96791aa09e6df0de2c1d7b8f1b7f4b1a61f324d38fe98bc535aeee4f5 - languageName: node - linkType: hard - -"lodash.uniq@npm:^4.5.0": - version: 4.5.0 - resolution: "lodash.uniq@npm:4.5.0" - checksum: a4779b57a8d0f3c441af13d9afe7ecff22dd1b8ce1129849f71d9bbc8e8ee4e46dfb4b7c28f7ad3d67481edd6e51126e4e2a6ee276e25906d10f7140187c392d - languageName: node - linkType: hard - -"lodash.upperfirst@npm:^4.3.1": - version: 4.3.1 - resolution: "lodash.upperfirst@npm:4.3.1" - checksum: cadec6955900afe1928cc60cdc4923a79c2ef991e42665419cc81630ed9b4f952a1093b222e0141ab31cbc4dba549f97ec28ff67929d71e01861c97188a5fa83 - languageName: node - linkType: hard - -"lodash@npm:4.17.21, lodash@npm:^4, lodash@npm:^4.17.11, lodash@npm:^4.17.15, lodash@npm:^4.17.19, lodash@npm:^4.17.20, lodash@npm:^4.17.21, lodash@npm:^4.17.5, lodash@npm:~4.17.0": - version: 4.17.21 - resolution: "lodash@npm:4.17.21" - checksum: eb835a2e51d381e561e508ce932ea50a8e5a68f4ebdd771ea240d3048244a8d13658acbd502cd4829768c56f2e16bdd4340b9ea141297d472517b83868e677f7 - languageName: node - linkType: hard - -"log-symbols@npm:4.1.0, log-symbols@npm:^4.0.0, log-symbols@npm:^4.1.0": - version: 4.1.0 - resolution: "log-symbols@npm:4.1.0" - dependencies: - chalk: ^4.1.0 - is-unicode-supported: ^0.1.0 - checksum: fce1497b3135a0198803f9f07464165e9eb83ed02ceb2273930a6f8a508951178d8cf4f0378e9d28300a2ed2bc49050995d2bd5f53ab716bb15ac84d58c6ef74 - languageName: node - linkType: hard - -"log-symbols@npm:^2.2.0": - version: 2.2.0 - resolution: "log-symbols@npm:2.2.0" - dependencies: - chalk: ^2.0.1 - checksum: 4c95e3b65f0352dbe91dc4989c10baf7a44e2ef5b0db7e6721e1476268e2b6f7090c3aa880d4f833a05c5c3ff18f4ec5215a09bd0099986d64a8186cfeb48ac8 - languageName: node - linkType: hard - -"log-update@npm:^4.0.0": - version: 4.0.0 - resolution: "log-update@npm:4.0.0" - dependencies: - ansi-escapes: ^4.3.0 - cli-cursor: ^3.1.0 - slice-ansi: ^4.0.0 - wrap-ansi: ^6.2.0 - checksum: ae2f85bbabc1906034154fb7d4c4477c79b3e703d22d78adee8b3862fa913942772e7fa11713e3d96fb46de4e3cabefbf5d0a544344f03b58d3c4bff52aa9eb2 - languageName: node - linkType: hard - -"log-update@npm:^5.0.1": - version: 5.0.1 - resolution: "log-update@npm:5.0.1" - dependencies: - ansi-escapes: ^5.0.0 - cli-cursor: ^4.0.0 - slice-ansi: ^5.0.0 - strip-ansi: ^7.0.1 - wrap-ansi: ^8.0.1 - checksum: 2c6b47dcce6f9233df6d232a37d9834cb3657a0749ef6398f1706118de74c55f158587d4128c225297ea66803f35c5ac3db4f3f617046d817233c45eedc32ef1 - languageName: node - linkType: hard - -"logkitty@npm:^0.7.1": - version: 0.7.1 - resolution: "logkitty@npm:0.7.1" - dependencies: - ansi-fragments: ^0.2.1 - dayjs: ^1.8.15 - yargs: ^15.1.0 - bin: - logkitty: bin/logkitty.js - checksum: f1af990ff09564ef5122597a52bba6d233302c49865e6ddea1343d2a0e2efe3005127e58e93e25c98b6b1f192731fc5c52e3204876a15fc9a52abc8b4f1af931 - languageName: node - linkType: hard - -"long@npm:^5.0.0": - version: 5.2.3 - resolution: "long@npm:5.2.3" - checksum: 885ede7c3de4facccbd2cacc6168bae3a02c3e836159ea4252c87b6e34d40af819824b2d4edce330bfb5c4d6e8ce3ec5864bdcf9473fa1f53a4f8225860e5897 - languageName: node - linkType: hard - -"loose-envify@npm:^1.0.0, loose-envify@npm:^1.1.0, loose-envify@npm:^1.4.0": - version: 1.4.0 - resolution: "loose-envify@npm:1.4.0" - dependencies: - js-tokens: ^3.0.0 || ^4.0.0 - bin: - loose-envify: cli.js - checksum: 6517e24e0cad87ec9888f500c5b5947032cdfe6ef65e1c1936a0c48a524b81e65542c9c3edc91c97d5bddc806ee2a985dbc79be89215d613b1de5db6d1cfe6f4 - languageName: node - linkType: hard - -"loupe@npm:^3.1.0, loupe@npm:^3.1.1, loupe@npm:^3.1.2": - version: 3.1.2 - resolution: "loupe@npm:3.1.2" - checksum: 4a75bbe8877a1ced3603e08b1095cd6f4c987c50fe63719fdc3009029560f91e07a915e7f6eff1322bb62bfb2a2beeef06b13ccb3c12f81bda9f3674434dcab9 - languageName: node - linkType: hard - -"lower-case-first@npm:^2.0.2": - version: 2.0.2 - resolution: "lower-case-first@npm:2.0.2" - dependencies: - tslib: ^2.0.3 - checksum: 33e3da1098ddda219ce125d4ab7a78a944972c0ee8872e95b6ccc35df8ad405284ab233b0ba4d72315ad1a06fe2f0d418ee4cba9ec1ef1c386dea78899fc8958 - languageName: node - linkType: hard - -"lower-case@npm:^2.0.2": - version: 2.0.2 - resolution: "lower-case@npm:2.0.2" - dependencies: - tslib: ^2.0.3 - checksum: 83a0a5f159ad7614bee8bf976b96275f3954335a84fad2696927f609ddae902802c4f3312d86668722e668bef41400254807e1d3a7f2e8c3eede79691aa1f010 - languageName: node - linkType: hard - -"lowercase-keys@npm:^1.0.0, lowercase-keys@npm:^1.0.1": - version: 1.0.1 - resolution: "lowercase-keys@npm:1.0.1" - checksum: 4d045026595936e09953e3867722e309415ff2c80d7701d067546d75ef698dac218a4f53c6d1d0e7368b47e45fd7529df47e6cb56fbb90523ba599f898b3d147 - languageName: node - linkType: hard - -"lowercase-keys@npm:^2.0.0": - version: 2.0.0 - resolution: "lowercase-keys@npm:2.0.0" - checksum: 24d7ebd56ccdf15ff529ca9e08863f3c54b0b9d1edb97a3ae1af34940ae666c01a1e6d200707bce730a8ef76cb57cc10e65f245ecaaf7e6bc8639f2fb460ac23 - languageName: node - linkType: hard - -"lru-cache@npm:^10.0.1, lru-cache@npm:^10.0.2, lru-cache@npm:^10.2.0": - version: 10.4.3 - resolution: "lru-cache@npm:10.4.3" - checksum: 6476138d2125387a6d20f100608c2583d415a4f64a0fecf30c9e2dda976614f09cad4baa0842447bd37dd459a7bd27f57d9d8f8ce558805abd487c583f3d774a - languageName: node - linkType: hard - -"lru-cache@npm:^4.0.1": - version: 4.1.5 - resolution: "lru-cache@npm:4.1.5" - dependencies: - pseudomap: ^1.0.2 - yallist: ^2.1.2 - checksum: 4bb4b58a36cd7dc4dcec74cbe6a8f766a38b7426f1ff59d4cf7d82a2aa9b9565cd1cb98f6ff60ce5cd174524868d7bc9b7b1c294371851356066ca9ac4cf135a - languageName: node - linkType: hard - -"lru-cache@npm:^5.1.1": - version: 5.1.1 - resolution: "lru-cache@npm:5.1.1" - dependencies: - yallist: ^3.0.2 - checksum: c154ae1cbb0c2206d1501a0e94df349653c92c8cbb25236d7e85190bcaf4567a03ac6eb43166fabfa36fd35623694da7233e88d9601fbf411a9a481d85dbd2cb - languageName: node - linkType: hard - -"lru-cache@npm:^6.0.0": - version: 6.0.0 - resolution: "lru-cache@npm:6.0.0" - dependencies: - yallist: ^4.0.0 - checksum: f97f499f898f23e4585742138a22f22526254fdba6d75d41a1c2526b3b6cc5747ef59c5612ba7375f42aca4f8461950e925ba08c991ead0651b4918b7c978297 - languageName: node - linkType: hard - -"lru-cache@npm:^7.14.1, lru-cache@npm:^7.7.1": - version: 7.18.3 - resolution: "lru-cache@npm:7.18.3" - checksum: e550d772384709deea3f141af34b6d4fa392e2e418c1498c078de0ee63670f1f46f5eee746e8ef7e69e1c895af0d4224e62ee33e66a543a14763b0f2e74c1356 - languageName: node - linkType: hard - -"lru_map@npm:^0.3.3": - version: 0.3.3 - resolution: "lru_map@npm:0.3.3" - checksum: ca9dd43c65ed7a4f117c548028101c5b6855e10923ea9d1f635af53ad20c5868ff428c364d454a7b57fe391b89c704982275410c3c5099cca5aeee00d76e169a - languageName: node - linkType: hard - -"lz-string@npm:^1.4.4, lz-string@npm:^1.5.0": - version: 1.5.0 - resolution: "lz-string@npm:1.5.0" - bin: - lz-string: bin/bin.js - checksum: 1ee98b4580246fd90dd54da6e346fb1caefcf05f677c686d9af237a157fdea3fd7c83a4bc58f858cd5b10a34d27afe0fdcbd0505a47e0590726a873dc8b8f65d - languageName: node - linkType: hard - -"madge@npm:6.1.0": - version: 6.1.0 - resolution: "madge@npm:6.1.0" - dependencies: - chalk: ^4.1.1 - commander: ^7.2.0 - commondir: ^1.0.1 - debug: ^4.3.1 - dependency-tree: ^9.0.0 - detective-amd: ^4.0.1 - detective-cjs: ^4.0.0 - detective-es6: ^3.0.0 - detective-less: ^1.0.2 - detective-postcss: ^6.1.0 - detective-sass: ^4.0.1 - detective-scss: ^3.0.0 - detective-stylus: ^2.0.1 - detective-typescript: ^9.0.0 - ora: ^5.4.1 - pluralize: ^8.0.0 - precinct: ^8.1.0 - pretty-ms: ^7.0.1 - rc: ^1.2.7 - stream-to-array: ^2.3.0 - ts-graphviz: ^1.5.0 - walkdir: ^0.4.1 - peerDependencies: - typescript: ^3.9.5 || ^4.9.5 || ^5 - peerDependenciesMeta: - typescript: - optional: true - bin: - madge: bin/cli.js - checksum: cb8a629c1eb837640ca2416dbd2236f1ea8657eb188725ff42294718dd1769ece5ec635ef02c344c72e3b4faab3cd8f084b043ce8ecccf4018915738b3329096 - languageName: node - linkType: hard - -"magic-string@npm:^0.25.0, magic-string@npm:^0.25.3, magic-string@npm:^0.25.7": - version: 0.25.9 - resolution: "magic-string@npm:0.25.9" - dependencies: - sourcemap-codec: ^1.4.8 - checksum: 9a0e55a15c7303fc360f9572a71cffba1f61451bc92c5602b1206c9d17f492403bf96f946dfce7483e66822d6b74607262e24392e87b0ac27b786e69a40e9b1a - languageName: node - linkType: hard - -"magic-string@npm:^0.30.5": - version: 0.30.5 - resolution: "magic-string@npm:0.30.5" - dependencies: - "@jridgewell/sourcemap-codec": ^1.4.15 - checksum: da10fecff0c0a7d3faf756913ce62bd6d5e7b0402be48c3b27bfd651b90e29677e279069a63b764bcdc1b8ecdcdb898f29a5c5ec510f2323e8d62ee057a6eb18 - languageName: node - linkType: hard - -"make-dir@npm:^1.0.0": - version: 1.3.0 - resolution: "make-dir@npm:1.3.0" - dependencies: - pify: ^3.0.0 - checksum: c564f6e7bb5ace1c02ad56b3a5f5e07d074af0c0b693c55c7b2c2b148882827c8c2afc7b57e43338a9f90c125b58d604e8cf3e6990a48bf949dfea8c79668c0b - languageName: node - linkType: hard - -"make-dir@npm:^2.0.0, make-dir@npm:^2.1.0": - version: 2.1.0 - resolution: "make-dir@npm:2.1.0" - dependencies: - pify: ^4.0.1 - semver: ^5.6.0 - checksum: 043548886bfaf1820323c6a2997e6d2fa51ccc2586ac14e6f14634f7458b4db2daf15f8c310e2a0abd3e0cddc64df1890d8fc7263033602c47bb12cbfcf86aab - languageName: node - linkType: hard - -"make-dir@npm:^3.0.0, make-dir@npm:^3.0.2, make-dir@npm:^3.1.0": - version: 3.1.0 - resolution: "make-dir@npm:3.1.0" - dependencies: - semver: ^6.0.0 - checksum: 484200020ab5a1fdf12f393fe5f385fc8e4378824c940fba1729dcd198ae4ff24867bc7a5646331e50cead8abff5d9270c456314386e629acec6dff4b8016b78 - languageName: node - linkType: hard - -"make-error@npm:^1.1.1, make-error@npm:^1.3.6": - version: 1.3.6 - resolution: "make-error@npm:1.3.6" - checksum: b86e5e0e25f7f777b77fabd8e2cbf15737972869d852a22b7e73c17623928fccb826d8e46b9951501d3f20e51ad74ba8c59ed584f610526a48f8ccf88aaec402 - languageName: node - linkType: hard - -"make-fetch-happen@npm:^10.0.3": - version: 10.2.1 - resolution: "make-fetch-happen@npm:10.2.1" - dependencies: - agentkeepalive: ^4.2.1 - cacache: ^16.1.0 - http-cache-semantics: ^4.1.0 - http-proxy-agent: ^5.0.0 - https-proxy-agent: ^5.0.0 - is-lambda: ^1.0.1 - lru-cache: ^7.7.1 - minipass: ^3.1.6 - minipass-collect: ^1.0.2 - minipass-fetch: ^2.0.3 - minipass-flush: ^1.0.5 - minipass-pipeline: ^1.2.4 - negotiator: ^0.6.3 - promise-retry: ^2.0.1 - socks-proxy-agent: ^7.0.0 - ssri: ^9.0.0 - checksum: 2332eb9a8ec96f1ffeeea56ccefabcb4193693597b132cd110734d50f2928842e22b84cfa1508e921b8385cdfd06dda9ad68645fed62b50fff629a580f5fb72c - languageName: node - linkType: hard - -"makeerror@npm:1.0.12": - version: 1.0.12 - resolution: "makeerror@npm:1.0.12" - dependencies: - tmpl: 1.0.5 - checksum: b38a025a12c8146d6eeea5a7f2bf27d51d8ad6064da8ca9405fcf7bf9b54acd43e3b30ddd7abb9b1bfa4ddb266019133313482570ddb207de568f71ecfcf6060 - languageName: node - linkType: hard - -"map-cache@npm:^0.2.0": - version: 0.2.2 - resolution: "map-cache@npm:0.2.2" - checksum: 3067cea54285c43848bb4539f978a15dedc63c03022abeec6ef05c8cb6829f920f13b94bcaf04142fc6a088318e564c4785704072910d120d55dbc2e0c421969 - languageName: node - linkType: hard - -"map-obj@npm:^1.0.0": - version: 1.0.1 - resolution: "map-obj@npm:1.0.1" - checksum: 9949e7baec2a336e63b8d4dc71018c117c3ce6e39d2451ccbfd3b8350c547c4f6af331a4cbe1c83193d7c6b786082b6256bde843db90cb7da2a21e8fcc28afed - languageName: node - linkType: hard - -"map-obj@npm:^4.0.0": - version: 4.3.0 - resolution: "map-obj@npm:4.3.0" - checksum: fbc554934d1a27a1910e842bc87b177b1a556609dd803747c85ece420692380827c6ae94a95cce4407c054fa0964be3bf8226f7f2cb2e9eeee432c7c1985684e - languageName: node - linkType: hard - -"map-or-similar@npm:^1.5.0": - version: 1.5.0 - resolution: "map-or-similar@npm:1.5.0" - checksum: f65c0d420e272d0fce4e24db35f6a08109218480bca1d61eaa442cbe6cf46270b840218d3b5e94e4bfcc2595f1d0a1fa5885df750b52aac9ab1d437b29dcce38 - languageName: node - linkType: hard - -"map-stream@npm:~0.1.0": - version: 0.1.0 - resolution: "map-stream@npm:0.1.0" - checksum: 38abbe4eb883888031e6b2fc0630bc583c99396be16b8ace5794b937b682a8a081f03e8b15bfd4914d1bc88318f0e9ac73ba3512ae65955cd449f63256ddb31d - languageName: node - linkType: hard - -"markdown-escapes@npm:^1.0.0": - version: 1.0.4 - resolution: "markdown-escapes@npm:1.0.4" - checksum: 6833a93d72d3f70a500658872312c6fa8015c20cc835a85ae6901fa232683fbc6ed7118ebe920fea7c80039a560f339c026597d96eee0e9de602a36921804997 - languageName: node - linkType: hard - -"markdown-it@npm:^10.0.0": - version: 10.0.0 - resolution: "markdown-it@npm:10.0.0" - dependencies: - argparse: ^1.0.7 - entities: ~2.0.0 - linkify-it: ^2.0.0 - mdurl: ^1.0.1 - uc.micro: ^1.0.5 - bin: - markdown-it: bin/markdown-it.js - checksum: 69f5ee640cbebb451b80d3cce308fff7230767e05c0f8c206a1e413775b7a6e5a08e91e9f3ec59f9b5c5a45493f9ce7ac089379cffb60c9d3e6677ed9d535086 - languageName: node - linkType: hard - -"marky@npm:^1.2.2": - version: 1.2.5 - resolution: "marky@npm:1.2.5" - checksum: 823b946677749551cdfc3b5221685478b5d1b9cc0dc03eff977c6f9a615fb05c67559f9556cb3c0fcb941a9ea0e195e37befd83026443396ccee8b724f54f4c5 - languageName: node - linkType: hard - -"matcher-collection@npm:^2.0.0": - version: 2.0.1 - resolution: "matcher-collection@npm:2.0.1" - dependencies: - "@types/minimatch": ^3.0.3 - minimatch: ^3.0.2 - checksum: f6d4f94bdcf773f9cbd4b7b10199a7632c434833a4c01bfb29c373e118647bb3b748aa3f20c70d6c3a715915fcc44ad4a77a9f8d5f059f3a0d15c984c0acc83d - languageName: node - linkType: hard - -"matcher@npm:^3.0.0": - version: 3.0.0 - resolution: "matcher@npm:3.0.0" - dependencies: - escape-string-regexp: ^4.0.0 - checksum: 8bee1a7ab7609c2c21d9c9254b6785fa708eadf289032b556d57a34e98fcd4c537659a004dafee6ce80ab157099e645c199dc52678dff1e7fb0a6684e0da4dbe - languageName: node - linkType: hard - -"md5-file@npm:^3.2.3": - version: 3.2.3 - resolution: "md5-file@npm:3.2.3" - dependencies: - buffer-alloc: ^1.1.0 - bin: - md5-file: cli.js - checksum: a3738274ee0c5ce21e7c14a4b60e5de6b298740f8a37eeb502bb97a056e3f19ea0871418b4dd45ca9c70d2f1d6c79a19e9a320fba1c129b196cdf671e544c450 - languageName: node - linkType: hard - -"md5.js@npm:^1.3.4": - version: 1.3.5 - resolution: "md5.js@npm:1.3.5" - dependencies: - hash-base: ^3.0.0 - inherits: ^2.0.1 - safe-buffer: ^5.1.2 - checksum: 098494d885684bcc4f92294b18ba61b7bd353c23147fbc4688c75b45cb8590f5a95fd4584d742415dcc52487f7a1ef6ea611cfa1543b0dc4492fe026357f3f0c - languageName: node - linkType: hard - -"md5@npm:^2.2.1": - version: 2.2.1 - resolution: "md5@npm:2.2.1" - dependencies: - charenc: ~0.0.1 - crypt: ~0.0.1 - is-buffer: ~1.1.1 - checksum: 2237e583f961d04d43c59c2f9383d1e47099427fa37f9dc50e8aec32e770f8b038ad9268c2523a7c8041ab6f4678a742ca533a7f670dbc2857c5b18388cf4d71 - languageName: node - linkType: hard - -"mdast-add-list-metadata@npm:1.0.1": - version: 1.0.1 - resolution: "mdast-add-list-metadata@npm:1.0.1" - dependencies: - unist-util-visit-parents: 1.1.2 - checksum: 5408207afc6cc8924e9466cb9dc0e75eb5af6c053242b6f8e8605cf8f3e58b043d5d81256640abe75b317e76c2a24697b9ec727d39b72889ebe6cb443bf64ff3 - languageName: node - linkType: hard - -"mdn-data@npm:2.0.14": - version: 2.0.14 - resolution: "mdn-data@npm:2.0.14" - checksum: 9d0128ed425a89f4cba8f787dca27ad9408b5cb1b220af2d938e2a0629d17d879a34d2cb19318bdb26c3f14c77dd5dfbae67211f5caaf07b61b1f2c5c8c7dc16 - languageName: node - linkType: hard - -"mdn-data@npm:2.0.28": - version: 2.0.28 - resolution: "mdn-data@npm:2.0.28" - checksum: f51d587a6ebe8e426c3376c74ea6df3e19ec8241ed8e2466c9c8a3904d5d04397199ea4f15b8d34d14524b5de926d8724ae85207984be47e165817c26e49e0aa - languageName: node - linkType: hard - -"mdn-data@npm:2.0.30": - version: 2.0.30 - resolution: "mdn-data@npm:2.0.30" - checksum: d6ac5ac7439a1607df44b22738ecf83f48e66a0874e4482d6424a61c52da5cde5750f1d1229b6f5fa1b80a492be89465390da685b11f97d62b8adcc6e88189aa - languageName: node - linkType: hard - -"mdn-data@npm:2.0.4": - version: 2.0.4 - resolution: "mdn-data@npm:2.0.4" - checksum: add3c95e6d03d301b8a8bcfee3de33f4d07e4c5eee5b79f18d6d737de717e22472deadf67c1a8563983c0b603e10d7df40aa8e5fddf18884dfe118ccec7ae329 - languageName: node - linkType: hard - -"mdurl@npm:^1.0.1": - version: 1.0.1 - resolution: "mdurl@npm:1.0.1" - checksum: 71731ecba943926bfbf9f9b51e28b5945f9411c4eda80894221b47cc105afa43ba2da820732b436f0798fd3edbbffcd1fc1415843c41a87fea08a41cc1e3d02b - languageName: node - linkType: hard - -"media-query-parser@npm:^2.0.2": - version: 2.0.2 - resolution: "media-query-parser@npm:2.0.2" - dependencies: - "@babel/runtime": ^7.12.5 - checksum: 8ef956d9e63fe6f4041988beda69843b3a6bb48228ea2923a066f6e7c8f7c5dba75fae357318c48a97ed5beae840b8425cb7e727fc1bb77acc65f2005f8945ab - languageName: node - linkType: hard - -"media-typer@npm:0.3.0": - version: 0.3.0 - resolution: "media-typer@npm:0.3.0" - checksum: af1b38516c28ec95d6b0826f6c8f276c58aec391f76be42aa07646b4e39d317723e869700933ca6995b056db4b09a78c92d5440dc23657e6764be5d28874bba1 - languageName: node - linkType: hard - -"mem-storage-area@npm:1.0.3": - version: 1.0.3 - resolution: "mem-storage-area@npm:1.0.3" - checksum: a6869e7b1a1475102bc5df459958545134b5b0ce04f415f0a790735fccde3a4b1c73275ef2e1ea222ab89c0cb67b2015cee79db9698516ce3fbb05f366517ac7 - languageName: node - linkType: hard - -"memfs-or-file-map-to-github-branch@npm:^1.2.1": - version: 1.2.1 - resolution: "memfs-or-file-map-to-github-branch@npm:1.2.1" - dependencies: - "@octokit/rest": ^16.43.0 || ^17.11.0 || ^18.12.0 - checksum: 0e63721da8b6ee0bb9826ac8662a6bfde392e3ac8c6c335a057b0e43794bbf24701f019734dfcee796c70af7a4e0cffa693d03b49be561204d52aac5edf5802e - languageName: node - linkType: hard - -"memfs@npm:^3.1.2, memfs@npm:^3.4.1, memfs@npm:^3.4.12, memfs@npm:^3.4.3": - version: 3.5.3 - resolution: "memfs@npm:3.5.3" - dependencies: - fs-monkey: ^1.0.4 - checksum: 18dfdeacad7c8047b976a6ccd58bc98ba76e122ad3ca0e50a21837fe2075fc0d9aafc58ab9cf2576c2b6889da1dd2503083f2364191b695273f40969db2ecc44 - languageName: node - linkType: hard - -"memoize-one@npm:>=3.1.1 <6, memoize-one@npm:^5.0.0": - version: 5.2.1 - resolution: "memoize-one@npm:5.2.1" - checksum: a3cba7b824ebcf24cdfcd234aa7f86f3ad6394b8d9be4c96ff756dafb8b51c7f71320785fbc2304f1af48a0467cbbd2a409efc9333025700ed523f254cb52e3d - languageName: node - linkType: hard - -"memoize-one@npm:^6.0.0": - version: 6.0.0 - resolution: "memoize-one@npm:6.0.0" - checksum: f185ea69f7cceae5d1cb596266dcffccf545e8e7b4106ec6aa93b71ab9d16460dd118ac8b12982c55f6d6322fcc1485de139df07eacffaae94888b9b3ad7675f - languageName: node - linkType: hard - -"memoizerific@npm:^1.11.3": - version: 1.11.3 - resolution: "memoizerific@npm:1.11.3" - dependencies: - map-or-similar: ^1.5.0 - checksum: d51bdc3ed8c39b4b73845c90eb62d243ddf21899914352d0c303f5e1d477abcb192f4c605e008caa4a31d823225eeb22a99ba5ee825fb88d0c33382db3aee95a - languageName: node - linkType: hard - -"memorystream@npm:^0.3.1": - version: 0.3.1 - resolution: "memorystream@npm:0.3.1" - checksum: f18b42440d24d09516d01466c06adf797df7873f0d40aa7db02e5fb9ed83074e5e65412d0720901d7069363465f82dc4f8bcb44f0cde271567a61426ce6ca2e9 - languageName: node - linkType: hard - -"meow@npm:^8.0.0": - version: 8.1.2 - resolution: "meow@npm:8.1.2" - dependencies: - "@types/minimist": ^1.2.0 - camelcase-keys: ^6.2.2 - decamelize-keys: ^1.1.0 - hard-rejection: ^2.1.0 - minimist-options: 4.1.0 - normalize-package-data: ^3.0.0 - read-pkg-up: ^7.0.1 - redent: ^3.0.0 - trim-newlines: ^3.0.0 - type-fest: ^0.18.0 - yargs-parser: ^20.2.3 - checksum: bc23bf1b4423ef6a821dff9734406bce4b91ea257e7f10a8b7f896f45b59649f07adc0926e2917eacd8cf1df9e4cd89c77623cf63dfd0f8bf54de07a32ee5a85 - languageName: node - linkType: hard - -"merge-descriptors@npm:1.0.1": - version: 1.0.1 - resolution: "merge-descriptors@npm:1.0.1" - checksum: 5abc259d2ae25bb06d19ce2b94a21632583c74e2a9109ee1ba7fd147aa7362b380d971e0251069f8b3eb7d48c21ac839e21fa177b335e82c76ec172e30c31a26 - languageName: node - linkType: hard - -"merge-options@npm:^3.0.4": - version: 3.0.4 - resolution: "merge-options@npm:3.0.4" - dependencies: - is-plain-obj: ^2.1.0 - checksum: d86ddb3dd6e85d558dbf25dc944f3527b6bacb944db3fdda6e84a3f59c4e4b85231095f58b835758b9a57708342dee0f8de0dffa352974a48221487fe9f4584f - languageName: node - linkType: hard - -"merge-stream@npm:^2.0.0": - version: 2.0.0 - resolution: "merge-stream@npm:2.0.0" - checksum: 6fa4dcc8d86629705cea944a4b88ef4cb0e07656ebf223fa287443256414283dd25d91c1cd84c77987f2aec5927af1a9db6085757cb43d90eb170ebf4b47f4f4 - languageName: node - linkType: hard - -"merge2@npm:^1.3.0, merge2@npm:^1.4.1": - version: 1.4.1 - resolution: "merge2@npm:1.4.1" - checksum: 7268db63ed5169466540b6fb947aec313200bcf6d40c5ab722c22e242f651994619bcd85601602972d3c85bd2cc45a358a4c61937e9f11a061919a1da569b0c2 - languageName: node - linkType: hard - -"merkletreejs@npm:^0.3.9": - version: 0.3.11 - resolution: "merkletreejs@npm:0.3.11" - dependencies: - bignumber.js: ^9.0.1 - buffer-reverse: ^1.0.1 - crypto-js: ^4.2.0 - treeify: ^1.1.0 - web3-utils: ^1.3.4 - checksum: 93edb8ec66aa6c9f59aa0902e675590e3791692893bb3e8c1018f758367ded1bf7d6b1057ccde3729b283ca946a316838a631a922960b76889b3be528c43ef4e - languageName: node - linkType: hard - -"meros@npm:^1.2.1": - version: 1.2.1 - resolution: "meros@npm:1.2.1" - peerDependencies: - "@types/node": ">=13" - peerDependenciesMeta: - "@types/node": - optional: true - checksum: 2201c3f7c58ad2a5b5f7d6b1c644d79bde513e25cb64b51a8c41381ec74bc02cd3423425e34f60c96bf3991f1ec51d65dc8b8e3354cbb060cc9f8226b4666a5a - languageName: node - linkType: hard - -"methods@npm:~1.1.2": - version: 1.1.2 - resolution: "methods@npm:1.1.2" - checksum: 0917ff4041fa8e2f2fda5425a955fe16ca411591fbd123c0d722fcf02b73971ed6f764d85f0a6f547ce49ee0221ce2c19a5fa692157931cecb422984f1dcd13a - languageName: node - linkType: hard - -"metro-babel-transformer@npm:0.81.1": - version: 0.81.1 - resolution: "metro-babel-transformer@npm:0.81.1" - dependencies: - "@babel/core": ^7.25.2 - flow-enums-runtime: ^0.0.6 - hermes-parser: 0.25.1 - nullthrows: ^1.1.1 - checksum: 9ddb40958d3bbd0d0128277e23508936823e2c18bc73f95ef8076a3c47b8b8d16e2bc67c8b6e31bad81b80c8eb58eab5306953e967ad0a8605b4e32d59a96427 - languageName: node - linkType: hard - -"metro-cache-key@npm:0.81.1": - version: 0.81.1 - resolution: "metro-cache-key@npm:0.81.1" - dependencies: - flow-enums-runtime: ^0.0.6 - checksum: e209badae33f32122e6b4d0c5b027f343172408cc6683210f84cb747ee24947c2b2fe0bca13042fb06e02d324620fddeb65b34e8ac5c95551b3284d9d3d1da1e - languageName: node - linkType: hard - -"metro-cache@npm:0.81.1": - version: 0.81.1 - resolution: "metro-cache@npm:0.81.1" - dependencies: - exponential-backoff: ^3.1.1 - flow-enums-runtime: ^0.0.6 - metro-core: 0.81.1 - checksum: 54f6335eef4d3402964b19aa022f18df990cf53f20c8e37319f654192994bc0cc600fe62703c557d5cc63d1be8cf629785c6e7997ae3dfa0ffd298854f4f9be9 - languageName: node - linkType: hard - -"metro-config@npm:0.81.1, metro-config@npm:^0.81.0": - version: 0.81.1 - resolution: "metro-config@npm:0.81.1" - dependencies: - connect: ^3.6.5 - cosmiconfig: ^5.0.5 - flow-enums-runtime: ^0.0.6 - jest-validate: ^29.6.3 - metro: 0.81.1 - metro-cache: 0.81.1 - metro-core: 0.81.1 - metro-runtime: 0.81.1 - checksum: 2162d58406982cc2f8112d675d47ef554671634b0b6b3de296cce7f3b3390a1e38abfcdc9da13aa815b463b403cec1d0ddce2fe2b97eb4183e713582a8115cc6 - languageName: node - linkType: hard - -"metro-core@npm:0.81.1, metro-core@npm:^0.81.0": - version: 0.81.1 - resolution: "metro-core@npm:0.81.1" - dependencies: - flow-enums-runtime: ^0.0.6 - lodash.throttle: ^4.1.1 - metro-resolver: 0.81.1 - checksum: ad3536fbbff26c89e4553b313b9eb60d7f95f603e9e3bf4c4349d35814b03ce684cb8a2d329c92d2db3a490c00a83ffdf84d154503eecff7deb8bb3ef5e5b44b - languageName: node - linkType: hard - -"metro-file-map@npm:0.81.1": - version: 0.81.1 - resolution: "metro-file-map@npm:0.81.1" - dependencies: - debug: ^2.2.0 - fb-watchman: ^2.0.0 - flow-enums-runtime: ^0.0.6 - graceful-fs: ^4.2.4 - invariant: ^2.2.4 - jest-worker: ^29.6.3 - micromatch: ^4.0.4 - nullthrows: ^1.1.1 - walker: ^1.0.7 - checksum: 9ec3cc9a84a1c29303fe4e137a2e48eedb54ff69cbf7a5071524a84da0bf21c5b73ca7be6165a5ebc3738dc967bc209d0b9cf0af65bbe766aa76b6029e258bc0 - languageName: node - linkType: hard - -"metro-minify-terser@npm:0.81.1": - version: 0.81.1 - resolution: "metro-minify-terser@npm:0.81.1" - dependencies: - flow-enums-runtime: ^0.0.6 - terser: ^5.15.0 - checksum: 9d58e34571aaef0d42e5439a09e5bd975aa8b734de5beae325d89ce54d00d6bac23b51ab36aef4ff2ab70894dfab60d79a709f317403817bf6b2e1ed0eb3b118 - languageName: node - linkType: hard - -"metro-resolver@npm:0.81.1": - version: 0.81.1 - resolution: "metro-resolver@npm:0.81.1" - dependencies: - flow-enums-runtime: ^0.0.6 - checksum: e8b6e826e09ecf5aa64d5ffa58200afb5b86b621e1ae748b013405dfb47076cad0f19ff4e6d62dbd337e70fbd9337fb0c6a30aa175c344ab66ae24f4f622aebc - languageName: node - linkType: hard - -"metro-runtime@npm:0.81.1, metro-runtime@npm:^0.81.0": - version: 0.81.1 - resolution: "metro-runtime@npm:0.81.1" - dependencies: - "@babel/runtime": ^7.25.0 - flow-enums-runtime: ^0.0.6 - checksum: f45d97f2b5bebc15e107c6a3fa033a7e241df3f56503884e8ee8eefb483d554558ebac1b6820d9f7f17ace7b1465c4287959a1d06bc922513661b51f2d025ad9 - languageName: node - linkType: hard - -"metro-source-map@npm:0.81.1, metro-source-map@npm:^0.81.0": - version: 0.81.1 - resolution: "metro-source-map@npm:0.81.1" - dependencies: - "@babel/traverse": ^7.25.3 - "@babel/traverse--for-generate-function-map": "npm:@babel/traverse@^7.25.3" - "@babel/types": ^7.25.2 - flow-enums-runtime: ^0.0.6 - invariant: ^2.2.4 - metro-symbolicate: 0.81.1 - nullthrows: ^1.1.1 - ob1: 0.81.1 - source-map: ^0.5.6 - vlq: ^1.0.0 - checksum: 59a1dc68ebdd1c8183a486312a474aa1c5d9670111f324e1d0532311f04f4e0c1b6e79c9be3c79cdb4bc8d3e13b33cc08e02ed5233c8fe635ec4b6b0d96e2b17 - languageName: node - linkType: hard - -"metro-symbolicate@npm:0.81.1": - version: 0.81.1 - resolution: "metro-symbolicate@npm:0.81.1" - dependencies: - flow-enums-runtime: ^0.0.6 - invariant: ^2.2.4 - metro-source-map: 0.81.1 - nullthrows: ^1.1.1 - source-map: ^0.5.6 - vlq: ^1.0.0 - bin: - metro-symbolicate: src/index.js - checksum: 179879cf07cf5b599ffd376e6a1bfefb911e0038fd01afe478252cadbafaacd55fef203d3857f1d06de220c9ade9b79e33a01a1545b6774a6a740ba9d1e6fe3f - languageName: node - linkType: hard - -"metro-transform-plugins@npm:0.81.1": - version: 0.81.1 - resolution: "metro-transform-plugins@npm:0.81.1" - dependencies: - "@babel/core": ^7.25.2 - "@babel/generator": ^7.25.0 - "@babel/template": ^7.25.0 - "@babel/traverse": ^7.25.3 - flow-enums-runtime: ^0.0.6 - nullthrows: ^1.1.1 - checksum: bfeca230488afb3a7464c1effefa850b6a70acc0f6a7f1dba762024ee8a2ce5ea92fdbf430b867f3607b243e9043acdc463ca752a912bda2502b63a88b998601 - languageName: node - linkType: hard - -"metro-transform-worker@npm:0.81.1": - version: 0.81.1 - resolution: "metro-transform-worker@npm:0.81.1" - dependencies: - "@babel/core": ^7.25.2 - "@babel/generator": ^7.25.0 - "@babel/parser": ^7.25.3 - "@babel/types": ^7.25.2 - flow-enums-runtime: ^0.0.6 - metro: 0.81.1 - metro-babel-transformer: 0.81.1 - metro-cache: 0.81.1 - metro-cache-key: 0.81.1 - metro-minify-terser: 0.81.1 - metro-source-map: 0.81.1 - metro-transform-plugins: 0.81.1 - nullthrows: ^1.1.1 - checksum: 75438b0f7641f22219d6d52448784d39b7b858fb648bfead5a6ffc4844b13beb6af71e32c30db20b0ae94b9eb186e4d4151eec727525bf401c5f065fbd765f5d - languageName: node - linkType: hard - -"metro@npm:0.81.1, metro@npm:^0.81.0": - version: 0.81.1 - resolution: "metro@npm:0.81.1" - dependencies: - "@babel/code-frame": ^7.24.7 - "@babel/core": ^7.25.2 - "@babel/generator": ^7.25.0 - "@babel/parser": ^7.25.3 - "@babel/template": ^7.25.0 - "@babel/traverse": ^7.25.3 - "@babel/types": ^7.25.2 - accepts: ^1.3.7 - chalk: ^4.0.0 - ci-info: ^2.0.0 - connect: ^3.6.5 - debug: ^2.2.0 - error-stack-parser: ^2.0.6 - flow-enums-runtime: ^0.0.6 - graceful-fs: ^4.2.4 - hermes-parser: 0.25.1 - image-size: ^1.0.2 - invariant: ^2.2.4 - jest-worker: ^29.6.3 - jsc-safe-url: ^0.2.2 - lodash.throttle: ^4.1.1 - metro-babel-transformer: 0.81.1 - metro-cache: 0.81.1 - metro-cache-key: 0.81.1 - metro-config: 0.81.1 - metro-core: 0.81.1 - metro-file-map: 0.81.1 - metro-resolver: 0.81.1 - metro-runtime: 0.81.1 - metro-source-map: 0.81.1 - metro-symbolicate: 0.81.1 - metro-transform-plugins: 0.81.1 - metro-transform-worker: 0.81.1 - mime-types: ^2.1.27 - nullthrows: ^1.1.1 - serialize-error: ^2.1.0 - source-map: ^0.5.6 - throat: ^5.0.0 - ws: ^7.5.10 - yargs: ^17.6.2 - bin: - metro: src/cli.js - checksum: 24342be8238157c926883915f5b30d421943a8bab92159cb96200a1e1f588a0119de7c3d4e27710d68177051956408ae1da52e89c449de71d08ff7953f864d45 - languageName: node - linkType: hard - -"micro-ftch@npm:^0.3.1": - version: 0.3.1 - resolution: "micro-ftch@npm:0.3.1" - checksum: 0e496547253a36e98a83fb00c628c53c3fb540fa5aaeaf718438873785afd193244988c09d219bb1802984ff227d04938d9571ef90fe82b48bd282262586aaff - languageName: node - linkType: hard - -"micromatch@npm:4.0.5": - version: 4.0.5 - resolution: "micromatch@npm:4.0.5" - dependencies: - braces: ^3.0.2 - picomatch: ^2.3.1 - checksum: 02a17b671c06e8fefeeb6ef996119c1e597c942e632a21ef589154f23898c9c6a9858526246abb14f8bca6e77734aa9dcf65476fca47cedfb80d9577d52843fc - languageName: node - linkType: hard - -"micromatch@npm:^4.0.0, micromatch@npm:^4.0.2, micromatch@npm:^4.0.4, micromatch@npm:^4.0.5, micromatch@npm:^4.0.8": - version: 4.0.8 - resolution: "micromatch@npm:4.0.8" - dependencies: - braces: ^3.0.3 - picomatch: ^2.3.1 - checksum: 79920eb634e6f400b464a954fcfa589c4e7c7143209488e44baf627f9affc8b1e306f41f4f0deedde97e69cb725920879462d3e750ab3bd3c1aed675bb3a8966 - languageName: node - linkType: hard - -"miller-rabin@npm:^4.0.0": - version: 4.0.1 - resolution: "miller-rabin@npm:4.0.1" - dependencies: - bn.js: ^4.0.0 - brorand: ^1.0.1 - bin: - miller-rabin: bin/miller-rabin - checksum: 00cd1ab838ac49b03f236cc32a14d29d7d28637a53096bf5c6246a032a37749c9bd9ce7360cbf55b41b89b7d649824949ff12bc8eee29ac77c6b38eada619ece - languageName: node - linkType: hard - -"mime-db@npm:1.52.0, mime-db@npm:>= 1.43.0 < 2": - version: 1.52.0 - resolution: "mime-db@npm:1.52.0" - checksum: 0d99a03585f8b39d68182803b12ac601d9c01abfa28ec56204fa330bc9f3d1c5e14beb049bafadb3dbdf646dfb94b87e24d4ec7b31b7279ef906a8ea9b6a513f - languageName: node - linkType: hard - -"mime-db@npm:~1.33.0": - version: 1.33.0 - resolution: "mime-db@npm:1.33.0" - checksum: 281a0772187c9b8f6096976cb193ac639c6007ac85acdbb8dc1617ed7b0f4777fa001d1b4f1b634532815e60717c84b2f280201d55677fb850c9d45015b50084 - languageName: node - linkType: hard - -"mime-types@npm:2.1.18": - version: 2.1.18 - resolution: "mime-types@npm:2.1.18" - dependencies: - mime-db: ~1.33.0 - checksum: 729265eff1e5a0e87cb7f869da742a610679585167d2f2ec997a7387fc6aedf8e5cad078e99b0164a927bdf3ace34fca27430d6487456ad090cba5594441ba43 - languageName: node - linkType: hard - -"mime-types@npm:^2.1.12, mime-types@npm:^2.1.27, mime-types@npm:^2.1.31, mime-types@npm:~2.1.17, mime-types@npm:~2.1.19, mime-types@npm:~2.1.24, mime-types@npm:~2.1.34": - version: 2.1.35 - resolution: "mime-types@npm:2.1.35" - dependencies: - mime-db: 1.52.0 - checksum: 89a5b7f1def9f3af5dad6496c5ed50191ae4331cc5389d7c521c8ad28d5fdad2d06fd81baf38fed813dc4e46bb55c8145bb0ff406330818c9cf712fb2e9b3836 - languageName: node - linkType: hard - -"mime@npm:1.6.0, mime@npm:^1.3.4": - version: 1.6.0 - resolution: "mime@npm:1.6.0" - bin: - mime: cli.js - checksum: fef25e39263e6d207580bdc629f8872a3f9772c923c7f8c7e793175cee22777bbe8bba95e5d509a40aaa292d8974514ce634ae35769faa45f22d17edda5e8557 - languageName: node - linkType: hard - -"mime@npm:^2.4.1": - version: 2.6.0 - resolution: "mime@npm:2.6.0" - bin: - mime: cli.js - checksum: 1497ba7b9f6960694268a557eae24b743fd2923da46ec392b042469f4b901721ba0adcf8b0d3c2677839d0e243b209d76e5edcbd09cfdeffa2dfb6bb4df4b862 - languageName: node - linkType: hard - -"mime@npm:^3.0.0": - version: 3.0.0 - resolution: "mime@npm:3.0.0" - bin: - mime: cli.js - checksum: f43f9b7bfa64534e6b05bd6062961681aeb406a5b53673b53b683f27fcc4e739989941836a355eef831f4478923651ecc739f4a5f6e20a76487b432bfd4db928 - languageName: node - linkType: hard - -"mimic-fn@npm:^1.0.0": - version: 1.2.0 - resolution: "mimic-fn@npm:1.2.0" - checksum: 69c08205156a1f4906d9c46f9b4dc08d18a50176352e77fdeb645cedfe9f20c0b19865d465bd2dec27a5c432347f24dc07fc3695e11159d193f892834233e939 - languageName: node - linkType: hard - -"mimic-fn@npm:^2.1.0": - version: 2.1.0 - resolution: "mimic-fn@npm:2.1.0" - checksum: d2421a3444848ce7f84bd49115ddacff29c15745db73f54041edc906c14b131a38d05298dae3081667627a59b2eb1ca4b436ff2e1b80f69679522410418b478a - languageName: node - linkType: hard - -"mimic-fn@npm:^4.0.0": - version: 4.0.0 - resolution: "mimic-fn@npm:4.0.0" - checksum: 995dcece15ee29aa16e188de6633d43a3db4611bcf93620e7e62109ec41c79c0f34277165b8ce5e361205049766e371851264c21ac64ca35499acb5421c2ba56 - languageName: node - linkType: hard - -"mimic-response@npm:^1.0.0, mimic-response@npm:^1.0.1": - version: 1.0.1 - resolution: "mimic-response@npm:1.0.1" - checksum: 034c78753b0e622bc03c983663b1cdf66d03861050e0c8606563d149bc2b02d63f62ce4d32be4ab50d0553ae0ffe647fc34d1f5281184c6e1e8cf4d85e8d9823 - languageName: node - linkType: hard - -"mimic-response@npm:^3.1.0": - version: 3.1.0 - resolution: "mimic-response@npm:3.1.0" - checksum: 25739fee32c17f433626bf19f016df9036b75b3d84a3046c7d156e72ec963dd29d7fc8a302f55a3d6c5a4ff24259676b15d915aad6480815a969ff2ec0836867 - languageName: node - linkType: hard - -"min-document@npm:^2.19.0": - version: 2.19.0 - resolution: "min-document@npm:2.19.0" - dependencies: - dom-walk: ^0.1.0 - checksum: da6437562ea2228041542a2384528e74e22d1daa1a4ec439c165abf0b9d8a63e17e3b8a6dc6e0c731845e85301198730426932a0e813d23f932ca668340c9623 - languageName: node - linkType: hard - -"min-indent@npm:^1.0.0, min-indent@npm:^1.0.1": - version: 1.0.1 - resolution: "min-indent@npm:1.0.1" - checksum: bfc6dd03c5eaf623a4963ebd94d087f6f4bbbfd8c41329a7f09706b0cb66969c4ddd336abeb587bc44bc6f08e13bf90f0b374f9d71f9f01e04adc2cd6f083ef1 - languageName: node - linkType: hard - -"mini-css-extract-plugin@npm:2.9.1": - version: 2.9.1 - resolution: "mini-css-extract-plugin@npm:2.9.1" - dependencies: - schema-utils: ^4.0.0 - tapable: ^2.2.1 - peerDependencies: - webpack: ^5.0.0 - checksum: 036b0fbb207cf9a56e2f5f5dce5e35100cbd255e5b5a920a5357ec99215af16a77136020729b2d004a041d04ebb0a544b2f442535cbb982704dcd50297014c9e - languageName: node - linkType: hard - -"mini-css-extract-plugin@npm:^2.4.5": - version: 2.9.2 - resolution: "mini-css-extract-plugin@npm:2.9.2" - dependencies: - schema-utils: ^4.0.0 - tapable: ^2.2.1 - peerDependencies: - webpack: ^5.0.0 - checksum: 67a1f75359371a7776108999d472ae0942ccd904401e364e3a2c710d4b6fec61c4f53288594fcac35891f009e6df8825a00dfd3bfe4bcec0f862081d1f7cad50 - languageName: node - linkType: hard - -"miniflare@npm:3.20231025.0": - version: 3.20231025.0 - resolution: "miniflare@npm:3.20231025.0" - dependencies: - acorn: ^8.8.0 - acorn-walk: ^8.2.0 - capnp-ts: ^0.7.0 - exit-hook: ^2.2.1 - glob-to-regexp: ^0.4.1 - source-map-support: 0.5.21 - stoppable: ^1.1.0 - undici: ^5.22.1 - workerd: 1.20231025.0 - ws: ^8.11.0 - youch: ^3.2.2 - zod: ^3.20.6 - checksum: 7c931dbbb883b0aee7f6dba51cc4eeeb0f6e4534da842eafec0319c4391536579d50d273a637bca10b0da40fdb5ca6e06f1e071b0bdbcd01b6c0b99973f3e0e4 - languageName: node - linkType: hard - -"minimalistic-assert@npm:^1.0.0, minimalistic-assert@npm:^1.0.1": - version: 1.0.1 - resolution: "minimalistic-assert@npm:1.0.1" - checksum: cc7974a9268fbf130fb055aff76700d7e2d8be5f761fb5c60318d0ed010d839ab3661a533ad29a5d37653133385204c503bfac995aaa4236f4e847461ea32ba7 - languageName: node - linkType: hard - -"minimalistic-crypto-utils@npm:^1.0.1": - version: 1.0.1 - resolution: "minimalistic-crypto-utils@npm:1.0.1" - checksum: 6e8a0422b30039406efd4c440829ea8f988845db02a3299f372fceba56ffa94994a9c0f2fd70c17f9969eedfbd72f34b5070ead9656a34d3f71c0bd72583a0ed - languageName: node - linkType: hard - -"minimatch@npm:2 || 3, minimatch@npm:3.1.2, minimatch@npm:^3.0.2, minimatch@npm:^3.0.4, minimatch@npm:^3.0.5, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2": - version: 3.1.2 - resolution: "minimatch@npm:3.1.2" - dependencies: - brace-expansion: ^1.1.7 - checksum: c154e566406683e7bcb746e000b84d74465b3a832c45d59912b9b55cd50dee66e5c4b1e5566dba26154040e51672f9aa450a9aef0c97cfc7336b78b7afb9540a - languageName: node - linkType: hard - -"minimatch@npm:4.2.3": - version: 4.2.3 - resolution: "minimatch@npm:4.2.3" - dependencies: - brace-expansion: ^1.1.7 - checksum: 3392388e3ef7de7ae9a3a48d48a27a323934452f4af81b925dfbe85ce2dc07da855e3dbcc69229888be4e5118f6c0b79847d30f3e7c0e0017b25e423c11c0409 - languageName: node - linkType: hard - -"minimatch@npm:5.0.1": - version: 5.0.1 - resolution: "minimatch@npm:5.0.1" - dependencies: - brace-expansion: ^2.0.1 - checksum: b34b98463da4754bc526b244d680c69d4d6089451ebe512edaf6dd9eeed0279399cfa3edb19233513b8f830bf4bfcad911dddcdf125e75074100d52f724774f0 - languageName: node - linkType: hard - -"minimatch@npm:6.1.6": - version: 6.1.6 - resolution: "minimatch@npm:6.1.6" - dependencies: - brace-expansion: ^2.0.1 - checksum: 707b026e0adc610be6c02f24173d84811e5b8cc2e434881e47ef00a72be5fbea9323b7158d7bf065782b1e1d5c50d7d80cd72f2602255f2fddfb1d2f02e9092c - languageName: node - linkType: hard - -"minimatch@npm:9.0.3": - version: 9.0.3 - resolution: "minimatch@npm:9.0.3" - dependencies: - brace-expansion: ^2.0.1 - checksum: 253487976bf485b612f16bf57463520a14f512662e592e95c571afdab1442a6a6864b6c88f248ce6fc4ff0b6de04ac7aa6c8bb51e868e99d1d65eb0658a708b5 - languageName: node - linkType: hard - -"minimatch@npm:^5.0.1": - version: 5.1.6 - resolution: "minimatch@npm:5.1.6" - dependencies: - brace-expansion: ^2.0.1 - checksum: 7564208ef81d7065a370f788d337cd80a689e981042cb9a1d0e6580b6c6a8c9279eba80010516e258835a988363f99f54a6f711a315089b8b42694f5da9d0d77 - languageName: node - linkType: hard - -"minimatch@npm:^7.4.6": - version: 7.4.6 - resolution: "minimatch@npm:7.4.6" - dependencies: - brace-expansion: ^2.0.1 - checksum: 1a6c8d22618df9d2a88aabeef1de5622eb7b558e9f8010be791cb6b0fa6e102d39b11c28d75b855a1e377b12edc7db8ff12a99c20353441caa6a05e78deb5da9 - languageName: node - linkType: hard - -"minimatch@npm:^9.0.4": - version: 9.0.5 - resolution: "minimatch@npm:9.0.5" - dependencies: - brace-expansion: ^2.0.1 - checksum: 2c035575eda1e50623c731ec6c14f65a85296268f749b9337005210bb2b34e2705f8ef1a358b188f69892286ab99dc42c8fb98a57bde55c8d81b3023c19cea28 - languageName: node - linkType: hard - -"minimist-options@npm:4.1.0": - version: 4.1.0 - resolution: "minimist-options@npm:4.1.0" - dependencies: - arrify: ^1.0.1 - is-plain-obj: ^1.1.0 - kind-of: ^6.0.3 - checksum: 8c040b3068811e79de1140ca2b708d3e203c8003eb9a414c1ab3cd467fc5f17c9ca02a5aef23bedc51a7f8bfbe77f87e9a7e31ec81fba304cda675b019496f4e - languageName: node - linkType: hard - -"minimist@npm:^1.2.0, minimist@npm:^1.2.3, minimist@npm:^1.2.5, minimist@npm:^1.2.6, minimist@npm:^1.2.7, minimist@npm:^1.2.8": - version: 1.2.8 - resolution: "minimist@npm:1.2.8" - checksum: 75a6d645fb122dad29c06a7597bddea977258957ed88d7a6df59b5cd3fe4a527e253e9bbf2e783e4b73657f9098b96a5fe96ab8a113655d4109108577ecf85b0 - languageName: node - linkType: hard - -"minipass-collect@npm:^1.0.2": - version: 1.0.2 - resolution: "minipass-collect@npm:1.0.2" - dependencies: - minipass: ^3.0.0 - checksum: 14df761028f3e47293aee72888f2657695ec66bd7d09cae7ad558da30415fdc4752bbfee66287dcc6fd5e6a2fa3466d6c484dc1cbd986525d9393b9523d97f10 - languageName: node - linkType: hard - -"minipass-collect@npm:^2.0.1": - version: 2.0.1 - resolution: "minipass-collect@npm:2.0.1" - dependencies: - minipass: ^7.0.3 - checksum: b251bceea62090f67a6cced7a446a36f4cd61ee2d5cea9aee7fff79ba8030e416327a1c5aa2908dc22629d06214b46d88fdab8c51ac76bacbf5703851b5ad342 - languageName: node - linkType: hard - -"minipass-fetch@npm:^2.0.3": - version: 2.1.2 - resolution: "minipass-fetch@npm:2.1.2" - dependencies: - encoding: ^0.1.13 - minipass: ^3.1.6 - minipass-sized: ^1.0.3 - minizlib: ^2.1.2 - dependenciesMeta: - encoding: - optional: true - checksum: 3f216be79164e915fc91210cea1850e488793c740534985da017a4cbc7a5ff50506956d0f73bb0cb60e4fe91be08b6b61ef35101706d3ef5da2c8709b5f08f91 - languageName: node - linkType: hard - -"minipass-flush@npm:^1.0.5": - version: 1.0.5 - resolution: "minipass-flush@npm:1.0.5" - dependencies: - minipass: ^3.0.0 - checksum: 56269a0b22bad756a08a94b1ffc36b7c9c5de0735a4dd1ab2b06c066d795cfd1f0ac44a0fcae13eece5589b908ecddc867f04c745c7009be0b566421ea0944cf - languageName: node - linkType: hard - -"minipass-pipeline@npm:^1.2.4": - version: 1.2.4 - resolution: "minipass-pipeline@npm:1.2.4" - dependencies: - minipass: ^3.0.0 - checksum: b14240dac0d29823c3d5911c286069e36d0b81173d7bdf07a7e4a91ecdef92cdff4baaf31ea3746f1c61e0957f652e641223970870e2353593f382112257971b - languageName: node - linkType: hard - -"minipass-sized@npm:^1.0.3": - version: 1.0.3 - resolution: "minipass-sized@npm:1.0.3" - dependencies: - minipass: ^3.0.0 - checksum: 79076749fcacf21b5d16dd596d32c3b6bf4d6e62abb43868fac21674078505c8b15eaca4e47ed844985a4514854f917d78f588fcd029693709417d8f98b2bd60 - languageName: node - linkType: hard - -"minipass@npm:^2.6.0, minipass@npm:^2.9.0": - version: 2.9.0 - resolution: "minipass@npm:2.9.0" - dependencies: - safe-buffer: ^5.1.2 - yallist: ^3.0.0 - checksum: 077b66f31ba44fd5a0d27d12a9e6a86bff8f97a4978dedb0373167156b5599fadb6920fdde0d9f803374164d810e05e8462ce28e86abbf7f0bea293a93711fc6 - languageName: node - linkType: hard - -"minipass@npm:^3.0.0, minipass@npm:^3.1.1, minipass@npm:^3.1.6": - version: 3.3.6 - resolution: "minipass@npm:3.3.6" - dependencies: - yallist: ^4.0.0 - checksum: a30d083c8054cee83cdcdc97f97e4641a3f58ae743970457b1489ce38ee1167b3aaf7d815cd39ec7a99b9c40397fd4f686e83750e73e652b21cb516f6d845e48 - languageName: node - linkType: hard - -"minipass@npm:^5.0.0": - version: 5.0.0 - resolution: "minipass@npm:5.0.0" - checksum: 425dab288738853fded43da3314a0b5c035844d6f3097a8e3b5b29b328da8f3c1af6fc70618b32c29ff906284cf6406b6841376f21caaadd0793c1d5a6a620ea - languageName: node - linkType: hard - -"minipass@npm:^5.0.0 || ^6.0.2 || ^7.0.0, minipass@npm:^7.0.3, minipass@npm:^7.1.2": - version: 7.1.2 - resolution: "minipass@npm:7.1.2" - checksum: 2bfd325b95c555f2b4d2814d49325691c7bee937d753814861b0b49d5edcda55cbbf22b6b6a60bb91eddac8668771f03c5ff647dcd9d0f798e9548b9cdc46ee3 - languageName: node - linkType: hard - -"minizlib@npm:^1.3.3": - version: 1.3.3 - resolution: "minizlib@npm:1.3.3" - dependencies: - minipass: ^2.9.0 - checksum: b0425c04d2ae6aad5027462665f07cc0d52075f7fa16e942b4611115f9b31f02924073b7221be6f75929d3c47ab93750c63f6dc2bbe8619ceacb3de1f77732c0 - languageName: node - linkType: hard - -"minizlib@npm:^2.1.1, minizlib@npm:^2.1.2": - version: 2.1.2 - resolution: "minizlib@npm:2.1.2" - dependencies: - minipass: ^3.0.0 - yallist: ^4.0.0 - checksum: f1fdeac0b07cf8f30fcf12f4b586795b97be856edea22b5e9072707be51fc95d41487faec3f265b42973a304fe3a64acd91a44a3826a963e37b37bafde0212c3 - languageName: node - linkType: hard - -"mipd@npm:0.0.5": - version: 0.0.5 - resolution: "mipd@npm:0.0.5" - dependencies: - viem: ^1.1.4 - peerDependencies: - typescript: ">=5.0.4" - peerDependenciesMeta: - typescript: - optional: true - checksum: 920b3afb3a92daeb66685adb746211ac4268ff805392a2f6e1da2703c43aa5835e5ad7be9d0312582a348d4c764ae3c81ab39362b66607ba0d54032def0038f1 - languageName: node - linkType: hard - -"mitt@npm:^3.0.1": - version: 3.0.1 - resolution: "mitt@npm:3.0.1" - checksum: b55a489ac9c2949ab166b7f060601d3b6d893a852515ae9eca4e11df01c013876df777ea109317622b5c1c60e8aae252558e33c8c94e14124db38f64a39614b1 - languageName: node - linkType: hard - -"mixin-object@npm:^2.0.1": - version: 2.0.1 - resolution: "mixin-object@npm:2.0.1" - dependencies: - for-in: ^0.1.3 - is-extendable: ^0.1.1 - checksum: 7d0eb7c2f06435fcc01d132824b4c973a0df689a117d8199d79911b506363b6f4f86a84458a63f3acfa7388f3052612cfe27105400b4932678452925a9739a4c - languageName: node - linkType: hard - -"mkdirp-classic@npm:^0.5.2, mkdirp-classic@npm:^0.5.3": - version: 0.5.3 - resolution: "mkdirp-classic@npm:0.5.3" - checksum: 3f4e088208270bbcc148d53b73e9a5bd9eef05ad2cbf3b3d0ff8795278d50dd1d11a8ef1875ff5aea3fa888931f95bfcb2ad5b7c1061cfefd6284d199e6776ac - languageName: node - linkType: hard - -"mkdirp@npm:^0.5.1, mkdirp@npm:^0.5.5, mkdirp@npm:~0.5.1": - version: 0.5.6 - resolution: "mkdirp@npm:0.5.6" - dependencies: - minimist: ^1.2.6 - bin: - mkdirp: bin/cmd.js - checksum: 0c91b721bb12c3f9af4b77ebf73604baf350e64d80df91754dc509491ae93bf238581e59c7188360cec7cb62fc4100959245a42cfe01834efedc5e9d068376c2 - languageName: node - linkType: hard - -"mkdirp@npm:^1.0.3, mkdirp@npm:^1.0.4": - version: 1.0.4 - resolution: "mkdirp@npm:1.0.4" - bin: - mkdirp: bin/cmd.js - checksum: a96865108c6c3b1b8e1d5e9f11843de1e077e57737602de1b82030815f311be11f96f09cce59bd5b903d0b29834733e5313f9301e3ed6d6f6fba2eae0df4298f - languageName: node - linkType: hard - -"mkdirp@npm:^3.0.1": - version: 3.0.1 - resolution: "mkdirp@npm:3.0.1" - bin: - mkdirp: dist/cjs/src/bin.js - checksum: 972deb188e8fb55547f1e58d66bd6b4a3623bf0c7137802582602d73e6480c1c2268dcbafbfb1be466e00cc7e56ac514d7fd9334b7cf33e3e2ab547c16f83a8d - languageName: node - linkType: hard - -"mktemp@npm:~0.4.0": - version: 0.4.0 - resolution: "mktemp@npm:0.4.0" - checksum: f67d8b1ed599807a4ec154efc6a50d61b28f4183fa740c4fe3bd75ce8442d84a3b8fca382fb3cb4e20bb883cb14478a7fe549c4eab6135cd213163ca5083f0fe - languageName: node - linkType: hard - -"mlly@npm:^1.1.0, mlly@npm:^1.2.0, mlly@npm:^1.4.2": - version: 1.5.0 - resolution: "mlly@npm:1.5.0" - dependencies: - acorn: ^8.11.3 - pathe: ^1.1.2 - pkg-types: ^1.0.3 - ufo: ^1.3.2 - checksum: 82fda663265628ee83a31e99950553371f42f6995838795d44320c78497bf17ab04d1f26c49998944178e4e2416f6f0a580bbca3e272114ee597ae9f3c128b47 - languageName: node - linkType: hard - -"mnemonist@npm:^0.38.0": - version: 0.38.5 - resolution: "mnemonist@npm:0.38.5" - dependencies: - obliterator: ^2.0.0 - checksum: 66080afc1616866beb164e230c432964d6eed467cf37ad00e9c10161b8267928124ca8f1d0ecfea86c85568acfa62d54faaf646a86968d1135189a0fdfdd6b78 - languageName: node - linkType: hard - -"mocha@npm:^10.0.0": - version: 10.2.0 - resolution: "mocha@npm:10.2.0" - dependencies: - ansi-colors: 4.1.1 - browser-stdout: 1.3.1 - chokidar: 3.5.3 - debug: 4.3.4 - diff: 5.0.0 - escape-string-regexp: 4.0.0 - find-up: 5.0.0 - glob: 7.2.0 - he: 1.2.0 - js-yaml: 4.1.0 - log-symbols: 4.1.0 - minimatch: 5.0.1 - ms: 2.1.3 - nanoid: 3.3.3 - serialize-javascript: 6.0.0 - strip-json-comments: 3.1.1 - supports-color: 8.1.1 - workerpool: 6.2.1 - yargs: 16.2.0 - yargs-parser: 20.2.4 - yargs-unparser: 2.0.0 - bin: - _mocha: bin/_mocha - mocha: bin/mocha.js - checksum: 406c45eab122ffd6ea2003c2f108b2bc35ba036225eee78e0c784b6fa2c7f34e2b13f1dbacef55a4fdf523255d76e4f22d1b5aacda2394bd11666febec17c719 - languageName: node - linkType: hard - -"mockdate@npm:3.0.5": - version: 3.0.5 - resolution: "mockdate@npm:3.0.5" - checksum: 72b66786d9e072379693f80bf9fb82eb5153c9741030a4294184e3ccaf952d0713fae8966f77780580cf902f8ec7ccc95577b0ad47980d255e2ffb71fc7ca49c - languageName: node - linkType: hard - -"modern-ahocorasick@npm:^1.0.0": - version: 1.0.1 - resolution: "modern-ahocorasick@npm:1.0.1" - checksum: ec83479f406511f37a966d66ce1c2b1701bb4a2cc2aabbbc257001178c9fbc48ce748c88eb10dfe72ba8b7f991a0bc7f1fa14683f444685edd1a9eeb32ecbc1e - languageName: node - linkType: hard - -"module-definition@npm:^3.3.1": - version: 3.4.0 - resolution: "module-definition@npm:3.4.0" - dependencies: - ast-module-types: ^3.0.0 - node-source-walk: ^4.0.0 - bin: - module-definition: bin/cli.js - checksum: 5cbfd38aab1a9169b5c31924e208e430a87a1b1512ab9736a9a368d950e3cc8e2f5cf642e37fe74123e25402cae50bfb8fdf1f5f0fd3d4d9270df705a2360bfa - languageName: node - linkType: hard - -"module-definition@npm:^4.1.0": - version: 4.1.0 - resolution: "module-definition@npm:4.1.0" - dependencies: - ast-module-types: ^4.0.0 - node-source-walk: ^5.0.1 - bin: - module-definition: bin/cli.js - checksum: d9b6397c9ba04b08bc035fd87a3652900530b9a5d6e5263f8a1e05c927dfc103fdffcecd7071a9fd6cd7813fc9feafbbe828f5277e5b706e5de82831153ef0fb - languageName: node - linkType: hard - -"module-lookup-amd@npm:^7.0.1": - version: 7.0.1 - resolution: "module-lookup-amd@npm:7.0.1" - dependencies: - commander: ^2.8.1 - debug: ^4.1.0 - glob: ^7.1.6 - requirejs: ^2.3.5 - requirejs-config-file: ^4.0.0 - bin: - lookup-amd: bin/cli.js - checksum: 911abd6b8fb1d82cfae4ef38050981d4eb7e710bfeba898903c5c49a4d3a44b3cacb6201ddf9930a39fae3473faf9b96d39930cfa8766dbf0da86689108895b1 - languageName: node - linkType: hard - -"moore@npm:~1.0.0": - version: 1.0.0 - resolution: "moore@npm:1.0.0" - checksum: b30ce01c531435c3548cc7ccb8b916ed43b429093c897ab753b3c250565f81a87382e4be7714503c7e2ed89429f0e4c7f72bfda1ac986b11f0dd6a17da8166c3 - languageName: node - linkType: hard - -"moti@npm:0.27.2": - version: 0.27.2 - resolution: "moti@npm:0.27.2" - dependencies: - framer-motion: ^6.5.1 - peerDependencies: - react-native-reanimated: "*" - checksum: 7695e914180608cee58c6bd95a66f5b02cfde2ccfbce82b31395a190115acf5cca7723e08cad5119fdc6c452c7bc7f5127207c66cba625e75ba65aa8e64a49f9 - languageName: node - linkType: hard - -"motion@npm:10.16.2": - version: 10.16.2 - resolution: "motion@npm:10.16.2" - dependencies: - "@motionone/animation": ^10.15.1 - "@motionone/dom": ^10.16.2 - "@motionone/svelte": ^10.16.2 - "@motionone/types": ^10.15.1 - "@motionone/utils": ^10.15.1 - "@motionone/vue": ^10.16.2 - checksum: 0b91256808c2374d8b7f4ac5e7ed513f2ca8df2b7d1be4fbc00ec5baece5162ada648aedaa5bc1d60be9ad2e6c9bc1d3bb160333051c20ab79e241b8e02e3c92 - languageName: node - linkType: hard - -"mri@npm:^1.2.0": - version: 1.2.0 - resolution: "mri@npm:1.2.0" - checksum: 83f515abbcff60150873e424894a2f65d68037e5a7fcde8a9e2b285ee9c13ac581b63cfc1e6826c4732de3aeb84902f7c1e16b7aff46cd3f897a0f757a894e85 - languageName: node - linkType: hard - -"mrmime@npm:^2.0.0": - version: 2.0.0 - resolution: "mrmime@npm:2.0.0" - checksum: f6fe11ec667c3d96f1ce5fd41184ed491d5f0a5f4045e82446a471ccda5f84c7f7610dff61d378b73d964f73a320bd7f89788f9e6b9403e32cc4be28ba99f569 - languageName: node - linkType: hard - -"ms@npm:2.0.0": - version: 2.0.0 - resolution: "ms@npm:2.0.0" - checksum: 0e6a22b8b746d2e0b65a430519934fefd41b6db0682e3477c10f60c76e947c4c0ad06f63ffdf1d78d335f83edee8c0aa928aa66a36c7cd95b69b26f468d527f4 - languageName: node - linkType: hard - -"ms@npm:2.1.2": - version: 2.1.2 - resolution: "ms@npm:2.1.2" - checksum: 673cdb2c3133eb050c745908d8ce632ed2c02d85640e2edb3ace856a2266a813b30c613569bf3354fdf4ea7d1a1494add3bfa95e2713baa27d0c2c71fc44f58f - languageName: node - linkType: hard - -"ms@npm:2.1.3, ms@npm:^2.0.0, ms@npm:^2.1.1, ms@npm:^2.1.3": - version: 2.1.3 - resolution: "ms@npm:2.1.3" - checksum: aa92de608021b242401676e35cfa5aa42dd70cbdc082b916da7fb925c542173e36bce97ea3e804923fe92c0ad991434e4a38327e15a1b5b5f945d66df615ae6d - languageName: node - linkType: hard - -"multibase@npm:^4.0.1": - version: 4.0.6 - resolution: "multibase@npm:4.0.6" - dependencies: - "@multiformats/base-x": ^4.0.1 - checksum: 891ce47f509c6070d2306e7e00aef3ef41fbb50a848a1e1bec5e75ca63c5032015a436cf09e9e3939b5b2ca81e74804151eb410a388f10e9aabf7a2f5a35d272 - languageName: node - linkType: hard - -"multicast-dns@npm:^7.2.5": - version: 7.2.5 - resolution: "multicast-dns@npm:7.2.5" - dependencies: - dns-packet: ^5.2.2 - thunky: ^1.0.2 - bin: - multicast-dns: cli.js - checksum: 00b8a57df152d4cd0297946320a94b7c3cdf75a46a2247f32f958a8927dea42958177f9b7fdae69fab2e4e033fb3416881af1f5e9055a3e1542888767139e2fb - languageName: node - linkType: hard - -"multicodec@npm:3.0.1": - version: 3.0.1 - resolution: "multicodec@npm:3.0.1" - dependencies: - uint8arrays: ^2.1.3 - varint: ^5.0.2 - checksum: d65963d4065e829db3a6d1823fb4729c4c8881368e61fa0bca3b9722947c7162f2fef565e7e17b0e0b855df907dd88cc50a88fe36c44f00777b6da94af66bc62 - languageName: node - linkType: hard - -"multiformats@npm:9.4.2": - version: 9.4.2 - resolution: "multiformats@npm:9.4.2" - checksum: 558819f6e347b64f399da64adc1da866bdc490ea1d390605b0be23546fd989565bdc449564fefd7a69f2fac7adf266e146e86f8994efb877d70629b590bf594f - languageName: node - linkType: hard - -"multiformats@patch:multiformats@npm%3A9.4.2#./.yarn/patches/multiformats-npm-9.4.2-44b8a13c1d.patch::locator=universe%40workspace%3A.": - version: 9.4.2 - resolution: "multiformats@patch:multiformats@npm%3A9.4.2#./.yarn/patches/multiformats-npm-9.4.2-44b8a13c1d.patch::version=9.4.2&hash=6e4024&locator=universe%40workspace%3A." - checksum: 17e7e5e3aa3b3f10ab45794837627f2e2d3c04bc69356102bb2e3ab254f043c34edf03769664c04a24892d22ad8ee3aa01203e36ca0645ad3a7256f7f9aa1988 - languageName: node - linkType: hard - -"multihashes@npm:4.0.2": - version: 4.0.2 - resolution: "multihashes@npm:4.0.2" - dependencies: - multibase: ^4.0.1 - uint8arrays: ^2.1.3 - varint: ^5.0.2 - checksum: 506fcbc3e59638e3509900beb34f490bfb5bf19bcce338f55e7c908d93d5358a6a0876a3275f8d07d9e5a7a5368e1d598a0d5359fa3d6003116977b4e1e306f8 - languageName: node - linkType: hard - -"multimatch@npm:^5.0.0": - version: 5.0.0 - resolution: "multimatch@npm:5.0.0" - dependencies: - "@types/minimatch": ^3.0.3 - array-differ: ^3.0.0 - array-union: ^2.1.0 - arrify: ^2.0.1 - minimatch: ^3.0.4 - checksum: 82c8030a53af965cab48da22f1b0f894ef99e16ee680dabdfbd38d2dfacc3c8208c475203d747afd9e26db44118ed0221d5a0d65268c864f06d6efc7ac6df812 - languageName: node - linkType: hard - -"mustache@npm:^4.2.0": - version: 4.2.0 - resolution: "mustache@npm:4.2.0" - bin: - mustache: bin/mustache - checksum: 928fcb63e3aa44a562bfe9b59ba202cccbe40a46da50be6f0dd831b495be1dd7e38ca4657f0ecab2c1a89dc7bccba0885eab7ee7c1b215830da765758c7e0506 - languageName: node - linkType: hard - -"mute-stream@npm:0.0.8": - version: 0.0.8 - resolution: "mute-stream@npm:0.0.8" - checksum: ff48d251fc3f827e5b1206cda0ffdaec885e56057ee86a3155e1951bc940fd5f33531774b1cc8414d7668c10a8907f863f6561875ee6e8768931a62121a531a1 - languageName: node - linkType: hard - -"mv@npm:~2": - version: 2.1.1 - resolution: "mv@npm:2.1.1" - dependencies: - mkdirp: ~0.5.1 - ncp: ~2.0.0 - rimraf: ~2.4.0 - checksum: 59d4b5ebff6c265b452d6630ae8873d573c82e36fdc1ed9c34c7901a0bf2d3d357022f49db8e9bded127b743f709c7ef7befec249a2b3967578d649a8029aa06 - languageName: node - linkType: hard - -"mz@npm:^2.7.0": - version: 2.7.0 - resolution: "mz@npm:2.7.0" - dependencies: - any-promise: ^1.0.0 - object-assign: ^4.0.1 - thenify-all: ^1.0.0 - checksum: 8427de0ece99a07e9faed3c0c6778820d7543e3776f9a84d22cf0ec0a8eb65f6e9aee9c9d353ff9a105ff62d33a9463c6ca638974cc652ee8140cd1e35951c87 - languageName: node - linkType: hard - -"nan@npm:^2.18.0, nan@npm:^2.19.0": - version: 2.20.0 - resolution: "nan@npm:2.20.0" - dependencies: - node-gyp: latest - checksum: eb09286e6c238a3582db4d88c875db73e9b5ab35f60306090acd2f3acae21696c9b653368b4a0e32abcef64ee304a923d6223acaddd16169e5eaaf5c508fb533 - languageName: node - linkType: hard - -"nanoid@npm:3.3.3": - version: 3.3.3 - resolution: "nanoid@npm:3.3.3" - bin: - nanoid: bin/nanoid.cjs - checksum: ada019402a07464a694553c61d2dca8a4353645a7d92f2830f0d487fedff403678a0bee5323a46522752b2eab95a0bc3da98b6cccaa7c0c55cd9975130e6d6f0 - languageName: node - linkType: hard - -"nanoid@npm:^3.1.23, nanoid@npm:^3.3.1, nanoid@npm:^3.3.3, nanoid@npm:^3.3.7": - version: 3.3.7 - resolution: "nanoid@npm:3.3.7" - bin: - nanoid: bin/nanoid.cjs - checksum: d36c427e530713e4ac6567d488b489a36582ef89da1d6d4e3b87eded11eb10d7042a877958c6f104929809b2ab0bafa17652b076cdf84324aa75b30b722204f2 - languageName: node - linkType: hard - -"napi-build-utils@npm:^1.0.1": - version: 1.0.2 - resolution: "napi-build-utils@npm:1.0.2" - checksum: 06c14271ee966e108d55ae109f340976a9556c8603e888037145d6522726aebe89dd0c861b4b83947feaf6d39e79e08817559e8693deedc2c94e82c5cbd090c7 - languageName: node - linkType: hard - -"napi-wasm@npm:^1.1.0": - version: 1.1.0 - resolution: "napi-wasm@npm:1.1.0" - checksum: 649a5d03477b89ee75cd8d7be5404daa5c889915640fd4ab042f2d38d265e961f86933e83982388d72c8b0a3952f36f099b96598ea88210205519ec2adc41d8d - languageName: node - linkType: hard - -"natural-compare@npm:^1.4.0": - version: 1.4.0 - resolution: "natural-compare@npm:1.4.0" - checksum: 23ad088b08f898fc9b53011d7bb78ec48e79de7627e01ab5518e806033861bef68d5b0cd0e2205c2f36690ac9571ff6bcb05eb777ced2eeda8d4ac5b44592c3d - languageName: node - linkType: hard - -"ncp@npm:~2.0.0": - version: 2.0.0 - resolution: "ncp@npm:2.0.0" - bin: - ncp: ./bin/ncp - checksum: ea9b19221da1d1c5529bdb9f8e85c9d191d156bcaae408cce5e415b7fbfd8744c288e792bd7faf1fe3b70fd44c74e22f0d43c39b209bc7ac1fb8016f70793a16 - languageName: node - linkType: hard - -"negotiator@npm:0.6.3, negotiator@npm:^0.6.3": - version: 0.6.3 - resolution: "negotiator@npm:0.6.3" - checksum: b8ffeb1e262eff7968fc90a2b6767b04cfd9842582a9d0ece0af7049537266e7b2506dfb1d107a32f06dd849ab2aea834d5830f7f4d0e5cb7d36e1ae55d021d9 - languageName: node - linkType: hard - -"neo-async@npm:^2.5.0, neo-async@npm:^2.6.1, neo-async@npm:^2.6.2": - version: 2.6.2 - resolution: "neo-async@npm:2.6.2" - checksum: deac9f8d00eda7b2e5cd1b2549e26e10a0faa70adaa6fdadca701cc55f49ee9018e427f424bac0c790b7c7e2d3068db97f3093f1093975f2acb8f8818b936ed9 - languageName: node - linkType: hard - -"nested-error-stacks@npm:~2.0.1": - version: 2.0.1 - resolution: "nested-error-stacks@npm:2.0.1" - checksum: 8430d7d80ad69b1add2992ee2992a363db6c1a26a54740963bc99a004c5acb1d2a67049397062eab2caa3a312b4da89a0b85de3bdf82d7d472a6baa166311fe6 - languageName: node - linkType: hard - -"netmask@npm:^2.0.2": - version: 2.0.2 - resolution: "netmask@npm:2.0.2" - checksum: c65cb8d3f7ea5669edddb3217e4c96910a60d0d9a4b52d9847ff6b28b2d0277cd8464eee0ef85133cdee32605c57940cacdd04a9a019079b091b6bba4cb0ec22 - languageName: node - linkType: hard - -"nice-try@npm:^1.0.4": - version: 1.0.5 - resolution: "nice-try@npm:1.0.5" - checksum: 0b4af3b5bb5d86c289f7a026303d192a7eb4417231fe47245c460baeabae7277bcd8fd9c728fb6bd62c30b3e15cd6620373e2cf33353b095d8b403d3e8a15aff - languageName: node - linkType: hard - -"no-case@npm:^3.0.4": - version: 3.0.4 - resolution: "no-case@npm:3.0.4" - dependencies: - lower-case: ^2.0.2 - tslib: ^2.0.3 - checksum: 0b2ebc113dfcf737d48dde49cfebf3ad2d82a8c3188e7100c6f375e30eafbef9e9124aadc3becef237b042fd5eb0aad2fd78669c20972d045bbe7fea8ba0be5c - languageName: node - linkType: hard - -"no-yolo-signatures@npm:0.0.2": - version: 0.0.2 - resolution: "no-yolo-signatures@npm:0.0.2" - dependencies: - "@celo/base": 1.3.3 - "@ethersproject/abi": 5.4.1 - "@ethersproject/abstract-provider": ^5.4.0 - cross-fetch: 3.0.4 - ethers: ^5.5.2 - checksum: 6d509bba0fb9e33fd16395cde4c12aa2ee6dcd2161245b7ff8b2af24406f0794917794e83042a572420706ad12fbb2281158f1a7d647c7e85389a579ac2ae464 - languageName: node - linkType: hard - -"nocache@npm:^3.0.1": - version: 3.0.4 - resolution: "nocache@npm:3.0.4" - checksum: 6be9ee67eb561ecedc56d805c024c0fda55b9836ecba659c720073b067929aa4fe04bb7121480e004c9cf52989e62d8720f29a7fe0269f1a4941221a1e4be1c2 - languageName: node - linkType: hard - -"nock@npm:13.3.3": - version: 13.3.3 - resolution: "nock@npm:13.3.3" - dependencies: - debug: ^4.1.0 - json-stringify-safe: ^5.0.1 - lodash: ^4.17.21 - propagate: ^2.0.0 - checksum: e3e4f0fb777ac63d74f89bbb7aebe8e815b891b64ac71983d91686f725fdab856fe189cf2fe23d4add9f5dd5da53f3568106a61116a771ce0f4ed0f5ad7b035b - languageName: node - linkType: hard - -"node-abi@npm:^3.3.0": - version: 3.71.0 - resolution: "node-abi@npm:3.71.0" - dependencies: - semver: ^7.3.5 - checksum: d7f34c294c0351b636688a792e41493840cc195f64a76ecdc35eb0c1682d86e633a932b03e924395b0d2f52ca1db5046898839d57bcfb5819226e64e922b0617 - languageName: node - linkType: hard - -"node-abort-controller@npm:^3.0.1": - version: 3.1.1 - resolution: "node-abort-controller@npm:3.1.1" - checksum: 2c340916af9710328b11c0828223fc65ba320e0d082214a211311bf64c2891028e42ef276b9799188c4ada9e6e1c54cf7a0b7c05dd9d59fcdc8cd633304c8047 - languageName: node - linkType: hard - -"node-addon-api@npm:^2.0.0": - version: 2.0.2 - resolution: "node-addon-api@npm:2.0.2" - dependencies: - node-gyp: latest - checksum: 31fb22d674648204f8dd94167eb5aac896c841b84a9210d614bf5d97c74ef059cc6326389cf0c54d2086e35312938401d4cc82e5fcd679202503eb8ac84814f8 - languageName: node - linkType: hard - -"node-addon-api@npm:^5.0.0": - version: 5.1.0 - resolution: "node-addon-api@npm:5.1.0" - dependencies: - node-gyp: latest - checksum: 2508bd2d2981945406243a7bd31362fc7af8b70b8b4d65f869c61731800058fb818cc2fd36c8eac714ddd0e568cc85becf5e165cebbdf7b5024d5151bbc75ea1 - languageName: node - linkType: hard - -"node-addon-api@npm:^6.1.0": - version: 6.1.0 - resolution: "node-addon-api@npm:6.1.0" - dependencies: - node-gyp: latest - checksum: 3a539510e677cfa3a833aca5397300e36141aca064cdc487554f2017110709a03a95da937e98c2a14ec3c626af7b2d1b6dabe629a481f9883143d0d5bff07bf2 - languageName: node - linkType: hard - -"node-addon-api@npm:^7.0.0": - version: 7.0.0 - resolution: "node-addon-api@npm:7.0.0" - dependencies: - node-gyp: latest - checksum: 4349465d737e284b280fc0e5fd2384f9379bca6b7f2a5a1460bea676ba5b90bf563e7d02a9254c35b9ed808641c81d9b4ca9e1da17d2849cd07727660b00b332 - languageName: node - linkType: hard - -"node-cleanup@npm:^2.1.2": - version: 2.1.2 - resolution: "node-cleanup@npm:2.1.2" - checksum: 584cdc3e42560a998b4579f91ed8f936b27011628f3102e5a1093205f0691cdf8d899287d1f2e4d2071ea4ab1d615810bad6dbe2b988ef173a1cbaa76d8165b3 - languageName: node - linkType: hard - -"node-dir@npm:^0.1.17": - version: 0.1.17 - resolution: "node-dir@npm:0.1.17" - dependencies: - minimatch: ^3.0.2 - checksum: 29de9560e52cdac8d3f794d38d782f6799e13d4d11aaf96d3da8c28458e1c5e33bb5f8edfb42dc34172ec5516c50c5b8850c9e1526542616757a969267263328 - languageName: node - linkType: hard - -"node-domexception@npm:1.0.0": - version: 1.0.0 - resolution: "node-domexception@npm:1.0.0" - checksum: ee1d37dd2a4eb26a8a92cd6b64dfc29caec72bff5e1ed9aba80c294f57a31ba4895a60fd48347cf17dd6e766da0ae87d75657dfd1f384ebfa60462c2283f5c7f - languageName: node - linkType: hard - -"node-fetch-native@npm:^1.4.0, node-fetch-native@npm:^1.4.1, node-fetch-native@npm:^1.6.1": - version: 1.6.2 - resolution: "node-fetch-native@npm:1.6.2" - checksum: a6e7b9bf2f671895421441177ebd1d12d2a6f18bc1afc29b8d413f65716faebb6c03adab332eff6392e538da8f40e862c67402bfb8a12c6b54b6a84a1a267377 - languageName: node - linkType: hard - -"node-fetch@npm:2.6.0": - version: 2.6.0 - resolution: "node-fetch@npm:2.6.0" - checksum: 2b741e9315c1c07df4a291d0b304892fa7e8d623fe789fedd53f9bcb8d09102b07591b4b93e552a65dfc457eee9d5d879d0440aefdb64f2d78e7cb78cbad28e9 - languageName: node - linkType: hard - -"node-fetch@npm:2.6.7": - version: 2.6.7 - resolution: "node-fetch@npm:2.6.7" - dependencies: - whatwg-url: ^5.0.0 - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - checksum: 8d816ffd1ee22cab8301c7756ef04f3437f18dace86a1dae22cf81db8ef29c0bf6655f3215cb0cdb22b420b6fe141e64b26905e7f33f9377a7fa59135ea3e10b - languageName: node - linkType: hard - -"node-fetch@npm:^2.2.0, node-fetch@npm:^2.6.1, node-fetch@npm:^2.6.12, node-fetch@npm:^2.6.7, node-fetch@npm:^2.6.9": - version: 2.7.0 - resolution: "node-fetch@npm:2.7.0" - dependencies: - whatwg-url: ^5.0.0 - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - checksum: d76d2f5edb451a3f05b15115ec89fc6be39de37c6089f1b6368df03b91e1633fd379a7e01b7ab05089a25034b2023d959b47e59759cb38d88341b2459e89d6e5 - languageName: node - linkType: hard - -"node-forge@npm:^1, node-forge@npm:^1.2.1, node-forge@npm:^1.3.1": - version: 1.3.1 - resolution: "node-forge@npm:1.3.1" - checksum: 08fb072d3d670599c89a1704b3e9c649ff1b998256737f0e06fbd1a5bf41cae4457ccaee32d95052d80bbafd9ffe01284e078c8071f0267dc9744e51c5ed42a9 - languageName: node - linkType: hard - -"node-gyp-build@npm:^4.2.0, node-gyp-build@npm:^4.3.0": - version: 4.6.0 - resolution: "node-gyp-build@npm:4.6.0" - bin: - node-gyp-build: bin.js - node-gyp-build-optional: optional.js - node-gyp-build-test: build-test.js - checksum: 25d78c5ef1f8c24291f4a370c47ba52fcea14f39272041a90a7894cd50d766f7c8cb8fb06c0f42bf6f69b204b49d9be3c8fc344aac09714d5bdb95965499eb15 - languageName: node - linkType: hard - -"node-gyp@npm:latest": - version: 9.3.1 - resolution: "node-gyp@npm:9.3.1" - dependencies: - env-paths: ^2.2.0 - glob: ^7.1.4 - graceful-fs: ^4.2.6 - make-fetch-happen: ^10.0.3 - nopt: ^6.0.0 - npmlog: ^6.0.0 - rimraf: ^3.0.2 - semver: ^7.3.5 - tar: ^6.1.2 - which: ^2.0.2 - bin: - node-gyp: bin/node-gyp.js - checksum: b860e9976fa645ca0789c69e25387401b4396b93c8375489b5151a6c55cf2640a3b6183c212b38625ef7c508994930b72198338e3d09b9d7ade5acc4aaf51ea7 - languageName: node - linkType: hard - -"node-html-parser@npm:^6.1.13": - version: 6.1.13 - resolution: "node-html-parser@npm:6.1.13" - dependencies: - css-select: ^5.1.0 - he: 1.2.0 - checksum: bf172147f5bee7ab3dbef4dce0308a2c02264bac178ebd6375cd460e0a120e916451b93601aabdd59331c467bed0e3f9bb5b362a74050254846135d5cd5dd66d - languageName: node - linkType: hard - -"node-int64@npm:^0.4.0": - version: 0.4.0 - resolution: "node-int64@npm:0.4.0" - checksum: d0b30b1ee6d961851c60d5eaa745d30b5c95d94bc0e74b81e5292f7c42a49e3af87f1eb9e89f59456f80645d679202537de751b7d72e9e40ceea40c5e449057e - languageName: node - linkType: hard - -"node-polyfill-webpack-plugin@npm:2.0.1": - version: 2.0.1 - resolution: "node-polyfill-webpack-plugin@npm:2.0.1" - dependencies: - assert: ^2.0.0 - browserify-zlib: ^0.2.0 - buffer: ^6.0.3 - console-browserify: ^1.2.0 - constants-browserify: ^1.0.0 - crypto-browserify: ^3.12.0 - domain-browser: ^4.22.0 - events: ^3.3.0 - filter-obj: ^2.0.2 - https-browserify: ^1.0.0 - os-browserify: ^0.3.0 - path-browserify: ^1.0.1 - process: ^0.11.10 - punycode: ^2.1.1 - querystring-es3: ^0.2.1 - readable-stream: ^4.0.0 - stream-browserify: ^3.0.0 - stream-http: ^3.2.0 - string_decoder: ^1.3.0 - timers-browserify: ^2.0.12 - tty-browserify: ^0.0.1 - type-fest: ^2.14.0 - url: ^0.11.0 - util: ^0.12.4 - vm-browserify: ^1.1.2 - peerDependencies: - webpack: ">=5" - checksum: 0efb27ba224449d530d837bf7cd22f033ee5d0498e31898968896e2bb6844ffbfb26af976623268a052671f2b927df7561859faf5cbf3d646677ad0e914e1427 - languageName: node - linkType: hard - -"node-releases@npm:^2.0.19": - version: 2.0.19 - resolution: "node-releases@npm:2.0.19" - checksum: 917dbced519f48c6289a44830a0ca6dc944c3ee9243c468ebd8515a41c97c8b2c256edb7f3f750416bc37952cc9608684e6483c7b6c6f39f6bd8d86c52cfe658 - languageName: node - linkType: hard - -"node-source-walk@npm:^4.0.0, node-source-walk@npm:^4.2.0, node-source-walk@npm:^4.2.2": - version: 4.3.0 - resolution: "node-source-walk@npm:4.3.0" - dependencies: - "@babel/parser": ^7.0.0 - checksum: 124bcec61f73141a5f13e63f773beb00c9a9620e9eec6d7505b9de8fa884797f3eb0b9e9d225bb324930234ae03b28a4a7a231e2c2f23d71405d4a562b404e34 - languageName: node - linkType: hard - -"node-source-walk@npm:^5.0.0, node-source-walk@npm:^5.0.1": - version: 5.0.2 - resolution: "node-source-walk@npm:5.0.2" - dependencies: - "@babel/parser": ^7.21.4 - checksum: 1031bc0871bb77ace33bd09fb1e9ef7589b03e6a2fa441b8e684023102362da6dba77d6b9b086dc1f995c7e69e3517666d5316c3831b9d9ff077cb36d57179e8 - languageName: node - linkType: hard - -"node-stream-zip@npm:^1.9.1": - version: 1.15.0 - resolution: "node-stream-zip@npm:1.15.0" - checksum: 0b73ffbb09490e479c8f47038d7cba803e6242618fbc1b71c26782009d388742ed6fb5ce6e9d31f528b410249e7eb1c6e7534e9d3792a0cafd99813ac5a35107 - languageName: node - linkType: hard - -"node-vibrant@npm:3.1.6": - version: 3.1.6 - resolution: "node-vibrant@npm:3.1.6" - dependencies: - "@jimp/custom": ^0.16.1 - "@jimp/plugin-resize": ^0.16.1 - "@jimp/types": ^0.16.1 - "@types/lodash": ^4.14.53 - "@types/node": ^10.11.7 - lodash: ^4.17.20 - url: ^0.11.0 - checksum: 54bd51db763ad53ff7e17cca66c3979ca9c55d1a5d0860a97468baf7caa4996bd2baf429f3860130ea78091f192c82edd02a2e0d156381692cdcb719206704ae - languageName: node - linkType: hard - -"nopt@npm:^6.0.0": - version: 6.0.0 - resolution: "nopt@npm:6.0.0" - dependencies: - abbrev: ^1.0.0 - bin: - nopt: bin/nopt.js - checksum: 82149371f8be0c4b9ec2f863cc6509a7fd0fa729929c009f3a58e4eb0c9e4cae9920e8f1f8eb46e7d032fec8fb01bede7f0f41a67eb3553b7b8e14fa53de1dac - languageName: node - linkType: hard - -"normalize-package-data@npm:^2.5.0": - version: 2.5.0 - resolution: "normalize-package-data@npm:2.5.0" - dependencies: - hosted-git-info: ^2.1.4 - resolve: ^1.10.0 - semver: 2 || 3 || 4 || 5 - validate-npm-package-license: ^3.0.1 - checksum: 7999112efc35a6259bc22db460540cae06564aa65d0271e3bdfa86876d08b0e578b7b5b0028ee61b23f1cae9fc0e7847e4edc0948d3068a39a2a82853efc8499 - languageName: node - linkType: hard - -"normalize-package-data@npm:^3.0.0": - version: 3.0.3 - resolution: "normalize-package-data@npm:3.0.3" - dependencies: - hosted-git-info: ^4.0.1 - is-core-module: ^2.5.0 - semver: ^7.3.4 - validate-npm-package-license: ^3.0.1 - checksum: bbcee00339e7c26fdbc760f9b66d429258e2ceca41a5df41f5df06cc7652de8d82e8679ff188ca095cad8eff2b6118d7d866af2b68400f74602fbcbce39c160a - languageName: node - linkType: hard - -"normalize-path@npm:^2.1.1": - version: 2.1.1 - resolution: "normalize-path@npm:2.1.1" - dependencies: - remove-trailing-separator: ^1.0.1 - checksum: 7e9cbdcf7f5b8da7aa191fbfe33daf290cdcd8c038f422faf1b8a83c972bf7a6d94c5be34c4326cb00fb63bc0fd97d9fbcfaf2e5d6142332c2cd36d2e1b86cea - languageName: node - linkType: hard - -"normalize-path@npm:^3.0.0, normalize-path@npm:~3.0.0": - version: 3.0.0 - resolution: "normalize-path@npm:3.0.0" - checksum: 88eeb4da891e10b1318c4b2476b6e2ecbeb5ff97d946815ffea7794c31a89017c70d7f34b3c2ebf23ef4e9fc9fb99f7dffe36da22011b5b5c6ffa34f4873ec20 - languageName: node - linkType: hard - -"normalize-range@npm:^0.1.2": - version: 0.1.2 - resolution: "normalize-range@npm:0.1.2" - checksum: 9b2f14f093593f367a7a0834267c24f3cb3e887a2d9809c77d8a7e5fd08738bcd15af46f0ab01cc3a3d660386f015816b5c922cea8bf2ee79777f40874063184 - languageName: node - linkType: hard - -"normalize-svg-path@npm:^1.0.1": - version: 1.1.0 - resolution: "normalize-svg-path@npm:1.1.0" - dependencies: - svg-arc-to-cubic-bezier: ^3.0.0 - checksum: 106e108b2f99e9e222a1c6edfc859523c6c3c2b0a6ba64743ed08af120b23b9bc2c16682bc2ae043a24c011c34c8252376c68525cf11735c6f110b571740eb2e - languageName: node - linkType: hard - -"normalize-url@npm:^4.1.0": - version: 4.5.1 - resolution: "normalize-url@npm:4.5.1" - checksum: 9a9dee01df02ad23e171171893e56e22d752f7cff86fb96aafeae074819b572ea655b60f8302e2d85dbb834dc885c972cc1c573892fea24df46b2765065dd05a - languageName: node - linkType: hard - -"normalize-url@npm:^6.0.1": - version: 6.1.0 - resolution: "normalize-url@npm:6.1.0" - checksum: 4a4944631173e7d521d6b80e4c85ccaeceb2870f315584fa30121f505a6dfd86439c5e3fdd8cd9e0e291290c41d0c3599f0cb12ab356722ed242584c30348e50 - languageName: node - linkType: hard - -"now-and-later@npm:^2.0.0": - version: 2.0.1 - resolution: "now-and-later@npm:2.0.1" - dependencies: - once: ^1.3.2 - checksum: a6715b9504b96f2603020e048f5ef7adc0693a1be1fbb46589d359d95f16df77207339d7bccf76295675f0f152f4ef145914b8775fa179c294833abef05b475f - languageName: node - linkType: hard - -"npm-package-arg@npm:^11.0.0": - version: 11.0.3 - resolution: "npm-package-arg@npm:11.0.3" - dependencies: - hosted-git-info: ^7.0.0 - proc-log: ^4.0.0 - semver: ^7.3.5 - validate-npm-package-name: ^5.0.0 - checksum: cc6f22c39201aa14dcceeddb81bfbf7fa0484f94bcd2b3ad038e18afec5167c843cdde90c897f6034dc368faa0100c1eeee6e3f436a89e0af32ba932af4a8c28 - languageName: node - linkType: hard - -"npm-run-path@npm:^2.0.0": - version: 2.0.2 - resolution: "npm-run-path@npm:2.0.2" - dependencies: - path-key: ^2.0.0 - checksum: acd5ad81648ba4588ba5a8effb1d98d2b339d31be16826a118d50f182a134ac523172101b82eab1d01cb4c2ba358e857d54cfafd8163a1ffe7bd52100b741125 - languageName: node - linkType: hard - -"npm-run-path@npm:^4.0.0, npm-run-path@npm:^4.0.1": - version: 4.0.1 - resolution: "npm-run-path@npm:4.0.1" - dependencies: - path-key: ^3.0.0 - checksum: 5374c0cea4b0bbfdfae62da7bbdf1e1558d338335f4cacf2515c282ff358ff27b2ecb91ffa5330a8b14390ac66a1e146e10700440c1ab868208430f56b5f4d23 - languageName: node - linkType: hard - -"npm-run-path@npm:^5.1.0": - version: 5.1.0 - resolution: "npm-run-path@npm:5.1.0" - dependencies: - path-key: ^4.0.0 - checksum: dc184eb5ec239d6a2b990b43236845332ef12f4e0beaa9701de724aa797fe40b6bbd0157fb7639d24d3ab13f5d5cf22d223a19c6300846b8126f335f788bee66 - languageName: node - linkType: hard - -"npmlog@npm:^4.1.2": - version: 4.1.2 - resolution: "npmlog@npm:4.1.2" - dependencies: - are-we-there-yet: ~1.1.2 - console-control-strings: ~1.1.0 - gauge: ~2.7.3 - set-blocking: ~2.0.0 - checksum: edbda9f95ec20957a892de1839afc6fb735054c3accf6fbefe767bac9a639fd5cea2baeac6bd2bcd50a85cb54924d57d9886c81c7fbc2332c2ddd19227504192 - languageName: node - linkType: hard - -"npmlog@npm:^6.0.0": - version: 6.0.2 - resolution: "npmlog@npm:6.0.2" - dependencies: - are-we-there-yet: ^3.0.0 - console-control-strings: ^1.1.0 - gauge: ^4.0.3 - set-blocking: ^2.0.0 - checksum: ae238cd264a1c3f22091cdd9e2b106f684297d3c184f1146984ecbe18aaa86343953f26b9520dedd1b1372bc0316905b736c1932d778dbeb1fcf5a1001390e2a - languageName: node - linkType: hard - -"nth-check@npm:^1.0.2": - version: 1.0.2 - resolution: "nth-check@npm:1.0.2" - dependencies: - boolbase: ~1.0.0 - checksum: 59e115fdd75b971d0030f42ada3aac23898d4c03aa13371fa8b3339d23461d1badf3fde5aad251fb956aaa75c0a3b9bfcd07c08a34a83b4f9dadfdce1d19337c - languageName: node - linkType: hard - -"nth-check@npm:^2.0.1": - version: 2.1.1 - resolution: "nth-check@npm:2.1.1" - dependencies: - boolbase: ^1.0.0 - checksum: 5afc3dafcd1573b08877ca8e6148c52abd565f1d06b1eb08caf982e3fa289a82f2cae697ffb55b5021e146d60443f1590a5d6b944844e944714a5b549675bcd3 - languageName: node - linkType: hard - -"nullthrows@npm:^1.1.1": - version: 1.1.1 - resolution: "nullthrows@npm:1.1.1" - checksum: 10806b92121253eb1b08ecf707d92480f5331ba8ae5b23fa3eb0548ad24196eb797ed47606153006568a5733ea9e528a3579f21421f7828e09e7756f4bdd386f - languageName: node - linkType: hard - -"number-is-nan@npm:^1.0.0": - version: 1.0.1 - resolution: "number-is-nan@npm:1.0.1" - checksum: 13656bc9aa771b96cef209ffca31c31a03b507ca6862ba7c3f638a283560620d723d52e626d57892c7fff475f4c36ac07f0600f14544692ff595abff214b9ffb - languageName: node - linkType: hard - -"number-to-bn@npm:1.7.0": - version: 1.7.0 - resolution: "number-to-bn@npm:1.7.0" - dependencies: - bn.js: 4.11.6 - strip-hex-prefix: 1.0.0 - checksum: 5b8c9dbe7b49dc7a069e5f0ba4e197257c89db11463478cb002fee7a34dc8868636952bd9f6310e5fdf22b266e0e6dffb5f9537c741734718107e90ae59b3de4 - languageName: node - linkType: hard - -"nwsapi@npm:^2.2.2": - version: 2.2.16 - resolution: "nwsapi@npm:2.2.16" - checksum: 467b36a74b7b8647d53fd61d05ca7d6c73a4a5d1b94ea84f770c03150b00ef46d38076cf8e708936246ae450c42a1f21e28e153023719784dc4d1a19b1737d47 - languageName: node - linkType: hard - -"ob1@npm:0.81.1": - version: 0.81.1 - resolution: "ob1@npm:0.81.1" - dependencies: - flow-enums-runtime: ^0.0.6 - checksum: 0b0fa64ecb1d91b2fbdc8c365e845d6231be404f1c97f43d6ad4a0d6aaf75817108b3b7641784e7b727f75a754fe07fdf6212b2540be4f7f0ae0f0a7128b0847 - languageName: node - linkType: hard - -"obj-multiplex@npm:^1.0.0": - version: 1.0.0 - resolution: "obj-multiplex@npm:1.0.0" - dependencies: - end-of-stream: ^1.4.0 - once: ^1.4.0 - readable-stream: ^2.3.3 - checksum: 6bdcb7d48a1cd4458a7ff0be0b3c1dc58e8e9e6504f937c10b1eac096a3d459b85d7ba32bdd9a45382bb238e245eb42ebcd91430c72f04b0a57c97f846f2d06f - languageName: node - linkType: hard - -"object-assign@npm:^4.0.1, object-assign@npm:^4.1.0, object-assign@npm:^4.1.1": - version: 4.1.1 - resolution: "object-assign@npm:4.1.1" - checksum: fcc6e4ea8c7fe48abfbb552578b1c53e0d194086e2e6bbbf59e0a536381a292f39943c6e9628af05b5528aa5e3318bb30d6b2e53cadaf5b8fe9e12c4b69af23f - languageName: node - linkType: hard - -"object-hash@npm:^3.0.0": - version: 3.0.0 - resolution: "object-hash@npm:3.0.0" - checksum: 80b4904bb3857c52cc1bfd0b52c0352532ca12ed3b8a6ff06a90cd209dfda1b95cee059a7625eb9da29537027f68ac4619363491eedb2f5d3dddbba97494fd6c - languageName: node - linkType: hard - -"object-inspect@npm:^1.13.1, object-inspect@npm:^1.13.3": - version: 1.13.3 - resolution: "object-inspect@npm:1.13.3" - checksum: 8c962102117241e18ea403b84d2521f78291b774b03a29ee80a9863621d88265ffd11d0d7e435c4c2cea0dc2a2fbf8bbc92255737a05536590f2df2e8756f297 - languageName: node - linkType: hard - -"object-is@npm:^1.0.1, object-is@npm:^1.1.5": - version: 1.1.5 - resolution: "object-is@npm:1.1.5" - dependencies: - call-bind: ^1.0.2 - define-properties: ^1.1.3 - checksum: 989b18c4cba258a6b74dc1d74a41805c1a1425bce29f6cabb50dcb1a6a651ea9104a1b07046739a49a5bb1bc49727bcb00efd5c55f932f6ea04ec8927a7901fe - languageName: node - linkType: hard - -"object-keys@npm:^1.1.1": - version: 1.1.1 - resolution: "object-keys@npm:1.1.1" - checksum: b363c5e7644b1e1b04aa507e88dcb8e3a2f52b6ffd0ea801e4c7a62d5aa559affe21c55a07fd4b1fd55fc03a33c610d73426664b20032405d7b92a1414c34d6a - languageName: node - linkType: hard - -"object.assign@npm:^4.0.4, object.assign@npm:^4.1.4, object.assign@npm:^4.1.5": - version: 4.1.5 - resolution: "object.assign@npm:4.1.5" - dependencies: - call-bind: ^1.0.5 - define-properties: ^1.2.1 - has-symbols: ^1.0.3 - object-keys: ^1.1.1 - checksum: f9aeac0541661370a1fc86e6a8065eb1668d3e771f7dbb33ee54578201336c057b21ee61207a186dd42db0c62201d91aac703d20d12a79fc79c353eed44d4e25 - languageName: node - linkType: hard - -"object.entries@npm:^1.1.7, object.entries@npm:^1.1.8": - version: 1.1.8 - resolution: "object.entries@npm:1.1.8" - dependencies: - call-bind: ^1.0.7 - define-properties: ^1.2.1 - es-object-atoms: ^1.0.0 - checksum: 5314877cb637ef3437a30bba61d9bacdb3ce74bf73ac101518be0633c37840c8cc67407edb341f766e8093b3d7516d5c3358f25adfee4a2c697c0ec4c8491907 - languageName: node - linkType: hard - -"object.fromentries@npm:^2.0.7, object.fromentries@npm:^2.0.8": - version: 2.0.8 - resolution: "object.fromentries@npm:2.0.8" - dependencies: - call-bind: ^1.0.7 - define-properties: ^1.2.1 - es-abstract: ^1.23.2 - es-object-atoms: ^1.0.0 - checksum: 29b2207a2db2782d7ced83f93b3ff5d425f901945f3665ffda1821e30a7253cd1fd6b891a64279976098137ddfa883d748787a6fea53ecdb51f8df8b8cec0ae1 - languageName: node - linkType: hard - -"object.getownpropertydescriptors@npm:^2.1.0": - version: 2.1.8 - resolution: "object.getownpropertydescriptors@npm:2.1.8" - dependencies: - array.prototype.reduce: ^1.0.6 - call-bind: ^1.0.7 - define-properties: ^1.2.1 - es-abstract: ^1.23.2 - es-object-atoms: ^1.0.0 - gopd: ^1.0.1 - safe-array-concat: ^1.1.2 - checksum: 073e492700a7f61ff6c471a2ed96e72473b030a7a105617f03cab192fb4bbc0e6068ef76534ec56afd34baf26b5dc5408de59cb0140ec8abde781e00faa3e63e - languageName: node - linkType: hard - -"object.hasown@npm:^1.1.3": - version: 1.1.4 - resolution: "object.hasown@npm:1.1.4" - dependencies: - define-properties: ^1.2.1 - es-abstract: ^1.23.2 - es-object-atoms: ^1.0.0 - checksum: bc46eb5ca22106fcd07aab1411508c2c68b7565fe8fb272f166fb9bf203972e8b5c86a5a4b2c86204beead0626a7a4119d32cefbaf7c5dd57b400bf9e6363cb6 - languageName: node - linkType: hard - -"object.values@npm:^1.1.0, object.values@npm:^1.1.6, object.values@npm:^1.1.7, object.values@npm:^1.2.0": - version: 1.2.0 - resolution: "object.values@npm:1.2.0" - dependencies: - call-bind: ^1.0.7 - define-properties: ^1.2.1 - es-object-atoms: ^1.0.0 - checksum: 51fef456c2a544275cb1766897f34ded968b22adfc13ba13b5e4815fdaf4304a90d42a3aee114b1f1ede048a4890381d47a5594d84296f2767c6a0364b9da8fa - languageName: node - linkType: hard - -"objectorarray@npm:^1.0.5": - version: 1.0.5 - resolution: "objectorarray@npm:1.0.5" - checksum: 8fd776aa495d113e217837f4adc1d53e63f656498237094d25f84c3e2c038b34b71d6fd85c4b60c7ae5f558790e5042426a400fae3eac35f297e11be12643a78 - languageName: node - linkType: hard - -"obliterator@npm:^2.0.0": - version: 2.0.0 - resolution: "obliterator@npm:2.0.0" - checksum: 6d84bd5e54b7ddfcf69b71b39515e69c9bbf742e2f505f72ecbaaa179df670a7411e041951710216fa42d6afd4eaceb5c7b968dc203e4b5f55dab432502037ba - languageName: node - linkType: hard - -"obuf@npm:^1.0.0, obuf@npm:^1.1.2": - version: 1.1.2 - resolution: "obuf@npm:1.1.2" - checksum: 41a2ba310e7b6f6c3b905af82c275bf8854896e2e4c5752966d64cbcd2f599cfffd5932006bcf3b8b419dfdacebb3a3912d5d94e10f1d0acab59876c8757f27f - languageName: node - linkType: hard - -"ofetch@npm:^1.3.3": - version: 1.3.3 - resolution: "ofetch@npm:1.3.3" - dependencies: - destr: ^2.0.1 - node-fetch-native: ^1.4.0 - ufo: ^1.3.0 - checksum: 945d757b25ba144f9f45d9de3382de743f0950e68e76726a4c0d2ef01456fa6700a6b102cc343a4e06f71d5ac59a8affdd9a673751c448f4265996f7f22ffa3d - languageName: node - linkType: hard - -"omggif@npm:^1.0.10, omggif@npm:^1.0.9": - version: 1.0.10 - resolution: "omggif@npm:1.0.10" - checksum: 15102e46b6fa0fba32d7e948f702623cdc3cdcdfd64b2d33c6e29a61f366ffd0f250da55d66f5217dce5b93ba9c67763fa998652791a5c7f2201a3bde2c4db45 - languageName: node - linkType: hard - -"on-exit-leak-free@npm:^0.2.0": - version: 0.2.0 - resolution: "on-exit-leak-free@npm:0.2.0" - checksum: d22b0f0538069110626b578db6e68b6ee0e85b1ee9cc5ef9b4de1bba431431d6a8da91a61e09d2ad46f22a96f968e5237833cb9d0b69bc4d294f7ec82f609b05 - languageName: node - linkType: hard - -"on-finished@npm:2.4.1, on-finished@npm:^2.3.0": - version: 2.4.1 - resolution: "on-finished@npm:2.4.1" - dependencies: - ee-first: 1.1.1 - checksum: d20929a25e7f0bb62f937a425b5edeb4e4cde0540d77ba146ec9357f00b0d497cdb3b9b05b9c8e46222407d1548d08166bff69cc56dfa55ba0e4469228920ff0 - languageName: node - linkType: hard - -"on-finished@npm:~2.3.0": - version: 2.3.0 - resolution: "on-finished@npm:2.3.0" - dependencies: - ee-first: 1.1.1 - checksum: 1db595bd963b0124d6fa261d18320422407b8f01dc65863840f3ddaaf7bcad5b28ff6847286703ca53f4ec19595bd67a2f1253db79fc4094911ec6aa8df1671b - languageName: node - linkType: hard - -"on-headers@npm:~1.0.2": - version: 1.0.2 - resolution: "on-headers@npm:1.0.2" - checksum: 2bf13467215d1e540a62a75021e8b318a6cfc5d4fc53af8e8f84ad98dbcea02d506c6d24180cd62e1d769c44721ba542f3154effc1f7579a8288c9f7873ed8e5 - languageName: node - linkType: hard - -"once@npm:^1.3.0, once@npm:^1.3.1, once@npm:^1.3.2, once@npm:^1.4.0": - version: 1.4.0 - resolution: "once@npm:1.4.0" - dependencies: - wrappy: 1 - checksum: cd0a88501333edd640d95f0d2700fbde6bff20b3d4d9bdc521bdd31af0656b5706570d6c6afe532045a20bb8dc0849f8332d6f2a416e0ba6d3d3b98806c7db68 - languageName: node - linkType: hard - -"onetime@npm:^2.0.0": - version: 2.0.1 - resolution: "onetime@npm:2.0.1" - dependencies: - mimic-fn: ^1.0.0 - checksum: bb44015ac7a525d0fb43b029a583d4ad359834632b4424ca209b438aacf6d669dda81b5edfbdb42c22636e607b276ba5589f46694a729e3bc27948ce26f4cc1a - languageName: node - linkType: hard - -"onetime@npm:^5.1.0, onetime@npm:^5.1.2": - version: 5.1.2 - resolution: "onetime@npm:5.1.2" - dependencies: - mimic-fn: ^2.1.0 - checksum: 2478859ef817fc5d4e9c2f9e5728512ddd1dbc9fb7829ad263765bb6d3b91ce699d6e2332eef6b7dff183c2f490bd3349f1666427eaba4469fba0ac38dfd0d34 - languageName: node - linkType: hard - -"onetime@npm:^6.0.0": - version: 6.0.0 - resolution: "onetime@npm:6.0.0" - dependencies: - mimic-fn: ^4.0.0 - checksum: 0846ce78e440841335d4e9182ef69d5762e9f38aa7499b19f42ea1c4cd40f0b4446094c455c713f9adac3f4ae86f613bb5e30c99e52652764d06a89f709b3788 - languageName: node - linkType: hard - -"open@npm:^6.2.0": - version: 6.4.0 - resolution: "open@npm:6.4.0" - dependencies: - is-wsl: ^1.1.0 - checksum: e5037facf3e03ed777537db3e2511ada37f351c4394e1dadccf9cac11d63b28447ae8b495b7b138659910fd78d918bafed546e47163673c4a4e43dbb5ac53c5d - languageName: node - linkType: hard - -"open@npm:^7.0.3, open@npm:^7.3.1": - version: 7.4.2 - resolution: "open@npm:7.4.2" - dependencies: - is-docker: ^2.0.0 - is-wsl: ^2.1.1 - checksum: 3333900ec0e420d64c23b831bc3467e57031461d843c801f569b2204a1acc3cd7b3ec3c7897afc9dde86491dfa289708eb92bba164093d8bd88fb2c231843c91 - languageName: node - linkType: hard - -"open@npm:^8.0.4, open@npm:^8.0.9, open@npm:^8.4.0": - version: 8.4.2 - resolution: "open@npm:8.4.2" - dependencies: - define-lazy-prop: ^2.0.0 - is-docker: ^2.1.1 - is-wsl: ^2.2.0 - checksum: 6388bfff21b40cb9bd8f913f9130d107f2ed4724ea81a8fd29798ee322b361ca31fa2cdfb491a5c31e43a3996cfe9566741238c7a741ada8d7af1cb78d85cf26 - languageName: node - linkType: hard - -"openai@npm:4.40.0": - version: 4.40.0 - resolution: "openai@npm:4.40.0" - dependencies: - "@types/node": ^18.11.18 - "@types/node-fetch": ^2.6.4 - abort-controller: ^3.0.0 - agentkeepalive: ^4.2.1 - form-data-encoder: 1.7.2 - formdata-node: ^4.3.2 - node-fetch: ^2.6.7 - web-streams-polyfill: ^3.2.1 - bin: - openai: bin/cli - checksum: ada7436a5de012a09887aad567f6d5630f14f723a7eaaaba72dd7f8a0adc631e5ebb22e92da1afd85f41d96e981703fdbf5d1797f409ca35a11a2516e4e5f39e - languageName: node - linkType: hard - -"openapi-typescript-codegen@npm:0.27.0": - version: 0.27.0 - resolution: "openapi-typescript-codegen@npm:0.27.0" - dependencies: - "@apidevtools/json-schema-ref-parser": ^10.1.0 - camelcase: ^6.3.0 - commander: ^11.1.0 - fs-extra: ^11.2.0 - handlebars: ^4.7.8 - bin: - openapi: bin/index.js - checksum: 53f6fd2fbeda752147978558671588ce69215b4c5eaefd9bc728d93f780462a8bdfac1d12f1f7499260014f5de55a1fe29beaf75e375a07e23776944c9e2c41f - languageName: node - linkType: hard - -"opener@npm:^1.5.2": - version: 1.5.2 - resolution: "opener@npm:1.5.2" - bin: - opener: bin/opener-bin.js - checksum: 33b620c0d53d5b883f2abc6687dd1c5fd394d270dbe33a6356f2d71e0a2ec85b100d5bac94694198ccf5c30d592da863b2292c5539009c715a9c80c697b4f6cc - languageName: node - linkType: hard - -"openzeppelin-solidity-2.3.0@npm:openzeppelin-solidity@2.3.0": - version: 2.3.0 - resolution: "openzeppelin-solidity@npm:2.3.0" - checksum: 7259a9c414891288ad7b327fb7024d25ccf95e1e66857a735cc9372c0dd905a66b0d951334e0b58c8d09b309fa7e207aef6bb1aece27edd8172a7d0d1095cc68 - languageName: node - linkType: hard - -"optimism@npm:^0.18.0": - version: 0.18.0 - resolution: "optimism@npm:0.18.0" - dependencies: - "@wry/caches": ^1.0.0 - "@wry/context": ^0.7.0 - "@wry/trie": ^0.4.3 - tslib: ^2.3.0 - checksum: d6ed6a90b05ee886dadfe556c7a30227c66843f51278e51eb843977a6a9368b6c50297fcc63fa514f53d8a5a58f8ddc8049c2356bd4ffac32f8961bcb806254d - languageName: node - linkType: hard - -"optionator@npm:^0.8.1": - version: 0.8.3 - resolution: "optionator@npm:0.8.3" - dependencies: - deep-is: ~0.1.3 - fast-levenshtein: ~2.0.6 - levn: ~0.3.0 - prelude-ls: ~1.1.2 - type-check: ~0.3.2 - word-wrap: ~1.2.3 - checksum: b8695ddf3d593203e25ab0900e265d860038486c943ff8b774f596a310f8ceebdb30c6832407a8198ba3ec9debe1abe1f51d4aad94843612db3b76d690c61d34 - languageName: node - linkType: hard - -"optionator@npm:^0.9.3": - version: 0.9.3 - resolution: "optionator@npm:0.9.3" - dependencies: - "@aashutoshrathi/word-wrap": ^1.2.3 - deep-is: ^0.1.3 - fast-levenshtein: ^2.0.6 - levn: ^0.4.1 - prelude-ls: ^1.2.1 - type-check: ^0.4.0 - checksum: 09281999441f2fe9c33a5eeab76700795365a061563d66b098923eb719251a42bdbe432790d35064d0816ead9296dbeb1ad51a733edf4167c96bd5d0882e428a - languageName: node - linkType: hard - -"ora@npm:5.4.1, ora@npm:^5.4.1": - version: 5.4.1 - resolution: "ora@npm:5.4.1" - dependencies: - bl: ^4.1.0 - chalk: ^4.1.0 - cli-cursor: ^3.1.0 - cli-spinners: ^2.5.0 - is-interactive: ^1.0.0 - is-unicode-supported: ^0.1.0 - log-symbols: ^4.1.0 - strip-ansi: ^6.0.0 - wcwidth: ^1.0.1 - checksum: 28d476ee6c1049d68368c0dc922e7225e3b5600c3ede88fade8052837f9ed342625fdaa84a6209302587c8ddd9b664f71f0759833cbdb3a4cf81344057e63c63 - languageName: node - linkType: hard - -"ora@npm:^3.4.0": - version: 3.4.0 - resolution: "ora@npm:3.4.0" - dependencies: - chalk: ^2.4.2 - cli-cursor: ^2.1.0 - cli-spinners: ^2.0.0 - log-symbols: ^2.2.0 - strip-ansi: ^5.2.0 - wcwidth: ^1.0.1 - checksum: f1f8e7f290b766276dcd19ddf2159a1971b1ec37eec4a5556b8f5e4afbe513a965ed65c183d38956724263b6a20989b3d8fb71b95ac4a2d6a01db2f1ed8899e4 - languageName: node - linkType: hard - -"ordered-read-streams@npm:^1.0.0": - version: 1.0.1 - resolution: "ordered-read-streams@npm:1.0.1" - dependencies: - readable-stream: ^2.0.1 - checksum: 7558ac1acd649164524be715d25e38a1aba0f34df9dfb8ce281f9d14589ac3506bfe66e6609fa8c9cf0d7835e11da33f3f5445336cf3eb783f81da09a1bc5fe8 - languageName: node - linkType: hard - -"os-browserify@npm:^0.3.0": - version: 0.3.0 - resolution: "os-browserify@npm:0.3.0" - checksum: 16e37ba3c0e6a4c63443c7b55799ce4066d59104143cb637ecb9fce586d5da319cdca786ba1c867abbe3890d2cbf37953f2d51eea85e20dd6c4570d6c54bfebf - languageName: node - linkType: hard - -"os-tmpdir@npm:~1.0.2": - version: 1.0.2 - resolution: "os-tmpdir@npm:1.0.2" - checksum: 5666560f7b9f10182548bf7013883265be33620b1c1b4a4d405c25be2636f970c5488ff3e6c48de75b55d02bde037249fe5dbfbb4c0fb7714953d56aed062e6d - languageName: node - linkType: hard - -"ospath@npm:^1.2.2": - version: 1.2.2 - resolution: "ospath@npm:1.2.2" - checksum: 505f48a4f4f1c557d6c656ec985707726e3714721680139be037613e903aa8c8fa4ddd8d1342006f9b2dc0065e6e20f8b7bea2ee05354f31257044790367b347 - languageName: node - linkType: hard - -"outdent@npm:^0.8.0": - version: 0.8.0 - resolution: "outdent@npm:0.8.0" - checksum: 72b7c1a287674317ea477999ec24e73a9eda21de35eb9429218f4a5bab899e964afaee7508265898118fee5cbee1d79397916b66dd8aeee285cd948ea5b1f562 - languageName: node - linkType: hard - -"override-require@npm:^1.1.1": - version: 1.1.1 - resolution: "override-require@npm:1.1.1" - checksum: 02978916308a07265034eb5252454b044288bacd8354a8dff433b4aba3c726ac7352230f6430176a44e1180deae43c1ae324646a9c36e5a9b058ff6076eecfd2 - languageName: node - linkType: hard - -"ox@npm:0.1.2": - version: 0.1.2 - resolution: "ox@npm:0.1.2" - dependencies: - "@adraffy/ens-normalize": ^1.10.1 - "@noble/curves": ^1.6.0 - "@noble/hashes": ^1.5.0 - "@scure/bip32": ^1.5.0 - "@scure/bip39": ^1.4.0 - abitype: ^1.0.6 - eventemitter3: 5.0.1 - peerDependencies: - typescript: ">=5.4.0" - peerDependenciesMeta: - typescript: - optional: true - checksum: 3f01119adbec8258b064298c66cb9830fc32c023e7fdc6e0634610505e74e8aab051c7fa49dad0fdd751a1c4af66c8eb2a825d993c6e79611e761a537276afd6 - languageName: node - linkType: hard - -"p-cancelable@npm:^1.0.0": - version: 1.1.0 - resolution: "p-cancelable@npm:1.1.0" - checksum: 2db3814fef6d9025787f30afaee4496a8857a28be3c5706432cbad76c688a6db1874308f48e364a42f5317f5e41e8e7b4f2ff5c8ff2256dbb6264bc361704ece - languageName: node - linkType: hard - -"p-cancelable@npm:^2.0.0": - version: 2.1.1 - resolution: "p-cancelable@npm:2.1.1" - checksum: 3dba12b4fb4a1e3e34524535c7858fc82381bbbd0f247cc32dedc4018592a3950ce66b106d0880b4ec4c2d8d6576f98ca885dc1d7d0f274d1370be20e9523ddf - languageName: node - linkType: hard - -"p-finally@npm:^1.0.0": - version: 1.0.0 - resolution: "p-finally@npm:1.0.0" - checksum: 93a654c53dc805dd5b5891bab16eb0ea46db8f66c4bfd99336ae929323b1af2b70a8b0654f8f1eae924b2b73d037031366d645f1fd18b3d30cbd15950cc4b1d4 - languageName: node - linkType: hard - -"p-limit@npm:3.1.0, p-limit@npm:^3.0.2, p-limit@npm:^3.1.0": - version: 3.1.0 - resolution: "p-limit@npm:3.1.0" - dependencies: - yocto-queue: ^0.1.0 - checksum: 7c3690c4dbf62ef625671e20b7bdf1cbc9534e83352a2780f165b0d3ceba21907e77ad63401708145ca4e25bfc51636588d89a8c0aeb715e6c37d1c066430360 - languageName: node - linkType: hard - -"p-limit@npm:^2.0.0, p-limit@npm:^2.1.0, p-limit@npm:^2.2.0, p-limit@npm:^2.2.1": - version: 2.3.0 - resolution: "p-limit@npm:2.3.0" - dependencies: - p-try: ^2.0.0 - checksum: 84ff17f1a38126c3314e91ecfe56aecbf36430940e2873dadaa773ffe072dc23b7af8e46d4b6485d302a11673fe94c6b67ca2cfbb60c989848b02100d0594ac1 - languageName: node - linkType: hard - -"p-locate@npm:^3.0.0": - version: 3.0.0 - resolution: "p-locate@npm:3.0.0" - dependencies: - p-limit: ^2.0.0 - checksum: 83991734a9854a05fe9dbb29f707ea8a0599391f52daac32b86f08e21415e857ffa60f0e120bfe7ce0cc4faf9274a50239c7895fc0d0579d08411e513b83a4ae - languageName: node - linkType: hard - -"p-locate@npm:^4.1.0": - version: 4.1.0 - resolution: "p-locate@npm:4.1.0" - dependencies: - p-limit: ^2.2.0 - checksum: 513bd14a455f5da4ebfcb819ef706c54adb09097703de6aeaa5d26fe5ea16df92b48d1ac45e01e3944ce1e6aa2a66f7f8894742b8c9d6e276e16cd2049a2b870 - languageName: node - linkType: hard - -"p-locate@npm:^5.0.0": - version: 5.0.0 - resolution: "p-locate@npm:5.0.0" - dependencies: - p-limit: ^3.0.2 - checksum: 1623088f36cf1cbca58e9b61c4e62bf0c60a07af5ae1ca99a720837356b5b6c5ba3eb1b2127e47a06865fee59dd0453cad7cc844cda9d5a62ac1a5a51b7c86d3 - languageName: node - linkType: hard - -"p-map@npm:^2.0.0": - version: 2.1.0 - resolution: "p-map@npm:2.1.0" - checksum: 9e3ad3c9f6d75a5b5661bcad78c91f3a63849189737cd75e4f1225bf9ac205194e5c44aac2ef6f09562b1facdb9bd1425584d7ac375bfaa17b3f1a142dab936d - languageName: node - linkType: hard - -"p-map@npm:^4.0.0": - version: 4.0.0 - resolution: "p-map@npm:4.0.0" - dependencies: - aggregate-error: ^3.0.0 - checksum: cb0ab21ec0f32ddffd31dfc250e3afa61e103ef43d957cc45497afe37513634589316de4eb88abdfd969fe6410c22c0b93ab24328833b8eb1ccc087fc0442a1c - languageName: node - linkType: hard - -"p-queue@npm:^6": - version: 6.6.2 - resolution: "p-queue@npm:6.6.2" - dependencies: - eventemitter3: ^4.0.4 - p-timeout: ^3.2.0 - checksum: 832642fcc4ab6477b43e6d7c30209ab10952969ed211c6d6f2931be8a4f9935e3578c72e8cce053dc34f2eb6941a408a2c516a54904e989851a1a209cf19761c - languageName: node - linkType: hard - -"p-retry@npm:^4, p-retry@npm:^4.5.0": - version: 4.6.2 - resolution: "p-retry@npm:4.6.2" - dependencies: - "@types/retry": 0.12.0 - retry: ^0.13.1 - checksum: 45c270bfddaffb4a895cea16cb760dcc72bdecb6cb45fef1971fa6ea2e91ddeafddefe01e444ac73e33b1b3d5d29fb0dd18a7effb294262437221ddc03ce0f2e - languageName: node - linkType: hard - -"p-timeout@npm:^3.2.0": - version: 3.2.0 - resolution: "p-timeout@npm:3.2.0" - dependencies: - p-finally: ^1.0.0 - checksum: 3dd0eaa048780a6f23e5855df3dd45c7beacff1f820476c1d0d1bcd6648e3298752ba2c877aa1c92f6453c7dd23faaf13d9f5149fc14c0598a142e2c5e8d649c - languageName: node - linkType: hard - -"p-try@npm:^2.0.0": - version: 2.2.0 - resolution: "p-try@npm:2.2.0" - checksum: f8a8e9a7693659383f06aec604ad5ead237c7a261c18048a6e1b5b85a5f8a067e469aa24f5bc009b991ea3b058a87f5065ef4176793a200d4917349881216cae - languageName: node - linkType: hard - -"pac-proxy-agent@npm:^7.0.1": - version: 7.0.2 - resolution: "pac-proxy-agent@npm:7.0.2" - dependencies: - "@tootallnate/quickjs-emscripten": ^0.23.0 - agent-base: ^7.0.2 - debug: ^4.3.4 - get-uri: ^6.0.1 - http-proxy-agent: ^7.0.0 - https-proxy-agent: ^7.0.5 - pac-resolver: ^7.0.1 - socks-proxy-agent: ^8.0.4 - checksum: 82772aaa489a4ad6f598b75d56daf609e7ba294a05a91cfe3101b004e2df494f0a269c98452cb47aaa4a513428e248308a156e26fee67eb78a76a58e9346921e - languageName: node - linkType: hard - -"pac-resolver@npm:^7.0.1": - version: 7.0.1 - resolution: "pac-resolver@npm:7.0.1" - dependencies: - degenerator: ^5.0.0 - netmask: ^2.0.2 - checksum: 839134328781b80d49f9684eae1f5c74f50a1d4482076d44c84fc2f3ca93da66fa11245a4725a057231e06b311c20c989fd0681e662a0792d17f644d8fe62a5e - languageName: node - linkType: hard - -"package-json-from-dist@npm:^1.0.0": - version: 1.0.1 - resolution: "package-json-from-dist@npm:1.0.1" - checksum: 58ee9538f2f762988433da00e26acc788036914d57c71c246bf0be1b60cdbd77dd60b6a3e1a30465f0b248aeb80079e0b34cb6050b1dfa18c06953bb1cbc7602 - languageName: node - linkType: hard - -"package-json@npm:^4.0.0": - version: 4.0.1 - resolution: "package-json@npm:4.0.1" - dependencies: - got: ^6.7.1 - registry-auth-token: ^3.0.1 - registry-url: ^3.0.3 - semver: ^5.1.0 - checksum: 920bd8280f9f42e0ebce69ecdc08327e716eec92127c4ff1dd4087dce236c7b29ad38e440bf40726a3d7b9e546d20ac0702cd82c8efe5390a84f9f2434ebd5b5 - languageName: node - linkType: hard - -"package-json@npm:^6.5.0": - version: 6.5.0 - resolution: "package-json@npm:6.5.0" - dependencies: - got: ^9.6.0 - registry-auth-token: ^4.0.0 - registry-url: ^5.0.0 - semver: ^6.2.0 - checksum: cc9f890d3667d7610e6184decf543278b87f657d1ace0deb4a9c9155feca738ef88f660c82200763d3348010f4e42e9c7adc91e96ab0f86a770955995b5351e2 - languageName: node - linkType: hard - -"pako@npm:^0.2.5": - version: 0.2.9 - resolution: "pako@npm:0.2.9" - checksum: 055f9487cd57fbb78df84315873bbdd089ba286f3499daed47d2effdc6253e981f5db6898c23486de76d4a781559f890d643bd3a49f70f1b4a18019c98aa5125 - languageName: node - linkType: hard - -"pako@npm:^1.0.5, pako@npm:^1.0.6, pako@npm:~1.0.2, pako@npm:~1.0.5": - version: 1.0.11 - resolution: "pako@npm:1.0.11" - checksum: 1be2bfa1f807608c7538afa15d6f25baa523c30ec870a3228a89579e474a4d992f4293859524e46d5d87fd30fa17c5edf34dbef0671251d9749820b488660b16 - languageName: node - linkType: hard - -"param-case@npm:^3.0.4": - version: 3.0.4 - resolution: "param-case@npm:3.0.4" - dependencies: - dot-case: ^3.0.4 - tslib: ^2.0.3 - checksum: b34227fd0f794e078776eb3aa6247442056cb47761e9cd2c4c881c86d84c64205f6a56ef0d70b41ee7d77da02c3f4ed2f88e3896a8fefe08bdfb4deca037c687 - languageName: node - linkType: hard - -"parent-module@npm:^1.0.0": - version: 1.0.1 - resolution: "parent-module@npm:1.0.1" - dependencies: - callsites: ^3.0.0 - checksum: 6ba8b255145cae9470cf5551eb74be2d22281587af787a2626683a6c20fbb464978784661478dd2a3f1dad74d1e802d403e1b03c1a31fab310259eec8ac560ff - languageName: node - linkType: hard - -"parse-asn1@npm:^5.0.0, parse-asn1@npm:^5.1.5": - version: 5.1.6 - resolution: "parse-asn1@npm:5.1.6" - dependencies: - asn1.js: ^5.2.0 - browserify-aes: ^1.0.0 - evp_bytestokey: ^1.0.0 - pbkdf2: ^3.0.3 - safe-buffer: ^5.1.1 - checksum: 9243311d1f88089bc9f2158972aa38d1abd5452f7b7cabf84954ed766048fe574d434d82c6f5a39b988683e96fb84cd933071dda38927e03469dc8c8d14463c7 - languageName: node - linkType: hard - -"parse-bmfont-ascii@npm:^1.0.3": - version: 1.0.6 - resolution: "parse-bmfont-ascii@npm:1.0.6" - checksum: de3f6671f183c3e9d64bb4812b0407693b5fd0d24e9d16b2e106bb9eef809d64a6cc061f39ca29bb10c5c2e47e241e91b7aeefa587391fff7ccb27ab9db5012e - languageName: node - linkType: hard - -"parse-bmfont-binary@npm:^1.0.5": - version: 1.0.6 - resolution: "parse-bmfont-binary@npm:1.0.6" - checksum: ca37fb1e92f5941fddc5342b45857fafd27f00d2bd5fa44dd504bec6faeab97536c95ad45260c2dd5fc4c63de71e525663d3cdac09d038cbca803d97c669add5 - languageName: node - linkType: hard - -"parse-bmfont-xml@npm:^1.1.4": - version: 1.1.4 - resolution: "parse-bmfont-xml@npm:1.1.4" - dependencies: - xml-parse-from-string: ^1.0.0 - xml2js: ^0.4.5 - checksum: 879e5435be44f22b8c4934e2e1d2754a6d90a9ddb16309360daff965e1428d877b673f3d1fafaab4fef437c912a0db9f85545e0dd375ec62df7d4d328450d257 - languageName: node - linkType: hard - -"parse-css-color@npm:^0.2.1": - version: 0.2.1 - resolution: "parse-css-color@npm:0.2.1" - dependencies: - color-name: ^1.1.4 - hex-rgb: ^4.1.0 - checksum: 3751e81fe904b491612ee4c92235b476d16419b88a0da2822319b657ff35311f5ffc13cd092bd385d17319058dc2188e5bcbee7d476516a77b90f6aa556d88d9 - languageName: node - linkType: hard - -"parse-diff@npm:^0.7.0": - version: 0.7.1 - resolution: "parse-diff@npm:0.7.1" - checksum: 937fab2cca7760178814a23c512cc7fcdd63c0eb1f28adc816a1eb0b59bf0b88c8d0ec4bd221db0cc0c30e0b51ea271a355b03b61abd2cbe79515ae298e7b440 - languageName: node - linkType: hard - -"parse-entities@npm:^1.1.0": - version: 1.2.2 - resolution: "parse-entities@npm:1.2.2" - dependencies: - character-entities: ^1.0.0 - character-entities-legacy: ^1.0.0 - character-reference-invalid: ^1.0.0 - is-alphanumerical: ^1.0.0 - is-decimal: ^1.0.0 - is-hexadecimal: ^1.0.0 - checksum: abf070c67912647a016efd5547607ecddc7e1963e59fc20c76797419b6699a3a9a522c067efa509feefedd37afd6c2a44200b3e5546a023a973c90e6e650b68a - languageName: node - linkType: hard - -"parse-filepath@npm:^1.0.2": - version: 1.0.2 - resolution: "parse-filepath@npm:1.0.2" - dependencies: - is-absolute: ^1.0.0 - map-cache: ^0.2.0 - path-root: ^0.1.1 - checksum: 6794c3f38d3921f0f7cc63fb1fb0c4d04cd463356ad389c8ce6726d3c50793b9005971f4138975a6d7025526058d5e65e9bfe634d0765e84c4e2571152665a69 - languageName: node - linkType: hard - -"parse-git-config@npm:^2.0.3": - version: 2.0.3 - resolution: "parse-git-config@npm:2.0.3" - dependencies: - expand-tilde: ^2.0.2 - git-config-path: ^1.0.1 - ini: ^1.3.5 - checksum: 360ca1f52ebc5dbbc31276a175919e97f06a16c07dd5bbe5e58eb79ed38d4f8e6468b320b255e184e29306ef7796f69a4a5e010a90705723cd265487ce4a4fe7 - languageName: node - linkType: hard - -"parse-github-url@npm:^1.0.2": - version: 1.0.2 - resolution: "parse-github-url@npm:1.0.2" - bin: - parse-github-url: ./cli.js - checksum: a19b8bc6f8908a24cb63a10ff90cd39cec0745615a272ec686803684653be34eb3e638e31a66c8ee3a9568082ff686eaf010181688000a6274c86a23e9220f2f - languageName: node - linkType: hard - -"parse-headers@npm:^2.0.0": - version: 2.0.5 - resolution: "parse-headers@npm:2.0.5" - checksum: 3e97f01e4c7f960bfbfd0ee489f0bd8d3c72b6c814f1f79b66abec2cca8eaf8e4ecd89deba0b6e61266469aed87350bc932001181c01ff8c29a59e696abe251f - languageName: node - linkType: hard - -"parse-json@npm:^4.0.0": - version: 4.0.0 - resolution: "parse-json@npm:4.0.0" - dependencies: - error-ex: ^1.3.1 - json-parse-better-errors: ^1.0.1 - checksum: 0fe227d410a61090c247e34fa210552b834613c006c2c64d9a05cfe9e89cf8b4246d1246b1a99524b53b313e9ac024438d0680f67e33eaed7e6f38db64cfe7b5 - languageName: node - linkType: hard - -"parse-json@npm:^5.0.0, parse-json@npm:^5.2.0": - version: 5.2.0 - resolution: "parse-json@npm:5.2.0" - dependencies: - "@babel/code-frame": ^7.0.0 - error-ex: ^1.3.1 - json-parse-even-better-errors: ^2.3.0 - lines-and-columns: ^1.1.6 - checksum: 62085b17d64da57f40f6afc2ac1f4d95def18c4323577e1eced571db75d9ab59b297d1d10582920f84b15985cbfc6b6d450ccbf317644cfa176f3ed982ad87e2 - languageName: node - linkType: hard - -"parse-link-header@npm:^2.0.0": - version: 2.0.0 - resolution: "parse-link-header@npm:2.0.0" - dependencies: - xtend: ~4.0.1 - checksum: 0e96c6af9910e8f92084b49b8dc6a10dd58db470847d1499f562576180c1ac5e49d18007697f0d538e5f3efdc8ce1d8777641f3ae225302b74af0dd0578b628e - languageName: node - linkType: hard - -"parse-ms@npm:^2.1.0": - version: 2.1.0 - resolution: "parse-ms@npm:2.1.0" - checksum: d5c66c76cca8df5bd0574e2d11b9c3752893b59b466e74308d4a2f09760dc5436a1633f549cad300fc8c3c19154d14959a3b8333d3b2f7bd75898fe18149d564 - languageName: node - linkType: hard - -"parse-passwd@npm:^1.0.0": - version: 1.0.0 - resolution: "parse-passwd@npm:1.0.0" - checksum: 4e55e0231d58f828a41d0f1da2bf2ff7bcef8f4cb6146e69d16ce499190de58b06199e6bd9b17fbf0d4d8aef9052099cdf8c4f13a6294b1a522e8e958073066e - languageName: node - linkType: hard - -"parse-png@npm:^2.1.0": - version: 2.1.0 - resolution: "parse-png@npm:2.1.0" - dependencies: - pngjs: ^3.3.0 - checksum: 0c6b6c42c8830cd16f6f9e9aedafd53111c0ad2ff350ba79c629996887567558f5639ad0c95764f96f7acd1f9ff63d4ac73737e80efa3911a6de9839ee520c96 - languageName: node - linkType: hard - -"parse-svg-path@npm:^0.1.2": - version: 0.1.2 - resolution: "parse-svg-path@npm:0.1.2" - checksum: bba7d4b4207fcc9eaf553b0d34db96ea8a1173635bc94528b5b66e1581902d4792d8d6229103764f01af4d839274234e97a4fa1c6f0fe7dcce195383848cec56 - languageName: node - linkType: hard - -"parse5-htmlparser2-tree-adapter@npm:^7.0.0": - version: 7.0.0 - resolution: "parse5-htmlparser2-tree-adapter@npm:7.0.0" - dependencies: - domhandler: ^5.0.2 - parse5: ^7.0.0 - checksum: fc5d01e07733142a1baf81de5c2a9c41426c04b7ab29dd218acb80cd34a63177c90aff4a4aee66cf9f1d0aeecff1389adb7452ad6f8af0a5888e3e9ad6ef733d - languageName: node - linkType: hard - -"parse5@npm:^7.0.0, parse5@npm:^7.1.1": - version: 7.1.2 - resolution: "parse5@npm:7.1.2" - dependencies: - entities: ^4.4.0 - checksum: 59465dd05eb4c5ec87b76173d1c596e152a10e290b7abcda1aecf0f33be49646ea74840c69af975d7887543ea45564801736356c568d6b5e71792fd0f4055713 - languageName: node - linkType: hard - -"parseurl@npm:~1.3.2, parseurl@npm:~1.3.3": - version: 1.3.3 - resolution: "parseurl@npm:1.3.3" - checksum: 407cee8e0a3a4c5cd472559bca8b6a45b82c124e9a4703302326e9ab60fc1081442ada4e02628efef1eb16197ddc7f8822f5a91fd7d7c86b51f530aedb17dfa2 - languageName: node - linkType: hard - -"pascal-case@npm:^3.1.2": - version: 3.1.2 - resolution: "pascal-case@npm:3.1.2" - dependencies: - no-case: ^3.0.4 - tslib: ^2.0.3 - checksum: ba98bfd595fc91ef3d30f4243b1aee2f6ec41c53b4546bfa3039487c367abaa182471dcfc830a1f9e1a0df00c14a370514fa2b3a1aacc68b15a460c31116873e - languageName: node - linkType: hard - -"password-prompt@npm:^1.0.4": - version: 1.1.2 - resolution: "password-prompt@npm:1.1.2" - dependencies: - ansi-escapes: ^3.1.0 - cross-spawn: ^6.0.5 - checksum: 4763ec1b48cb311d60df37186e31f1b85ec3249a21cc17bbf8407d66c5b55cffe34b4eb529ebd044ed4ced7f3ea3fad744fe15e30a5de31645433e94cd444266 - languageName: node - linkType: hard - -"path-browserify@npm:1.0.1, path-browserify@npm:^1.0.1": - version: 1.0.1 - resolution: "path-browserify@npm:1.0.1" - checksum: c6d7fa376423fe35b95b2d67990060c3ee304fc815ff0a2dc1c6c3cfaff2bd0d572ee67e18f19d0ea3bbe32e8add2a05021132ac40509416459fffee35200699 - languageName: node - linkType: hard - -"path-case@npm:^3.0.4": - version: 3.0.4 - resolution: "path-case@npm:3.0.4" - dependencies: - dot-case: ^3.0.4 - tslib: ^2.0.3 - checksum: 61de0526222629f65038a66f63330dd22d5b54014ded6636283e1d15364da38b3cf29e4433aa3f9d8b0dba407ae2b059c23b0104a34ee789944b1bc1c5c7e06d - languageName: node - linkType: hard - -"path-dirname@npm:^1.0.0, path-dirname@npm:^1.0.2": - version: 1.0.2 - resolution: "path-dirname@npm:1.0.2" - checksum: 0d2f6604ae05a252a0025318685f290e2764ecf9c5436f203cdacfc8c0b17c24cdedaa449d766beb94ab88cc7fc70a09ec21e7933f31abc2b719180883e5e33f - languageName: node - linkType: hard - -"path-exists@npm:^3.0.0": - version: 3.0.0 - resolution: "path-exists@npm:3.0.0" - checksum: 96e92643aa34b4b28d0de1cd2eba52a1c5313a90c6542d03f62750d82480e20bfa62bc865d5cfc6165f5fcd5aeb0851043c40a39be5989646f223300021bae0a - languageName: node - linkType: hard - -"path-exists@npm:^4.0.0": - version: 4.0.0 - resolution: "path-exists@npm:4.0.0" - checksum: 505807199dfb7c50737b057dd8d351b82c033029ab94cb10a657609e00c1bc53b951cfdbccab8de04c5584d5eff31128ce6afd3db79281874a5ef2adbba55ed1 - languageName: node - linkType: hard - -"path-is-absolute@npm:^1.0.0": - version: 1.0.1 - resolution: "path-is-absolute@npm:1.0.1" - checksum: 060840f92cf8effa293bcc1bea81281bd7d363731d214cbe5c227df207c34cd727430f70c6037b5159c8a870b9157cba65e775446b0ab06fd5ecc7e54615a3b8 - languageName: node - linkType: hard - -"path-is-inside@npm:1.0.2, path-is-inside@npm:^1.0.1, path-is-inside@npm:^1.0.2": - version: 1.0.2 - resolution: "path-is-inside@npm:1.0.2" - checksum: 0b5b6c92d3018b82afb1f74fe6de6338c4c654de4a96123cb343f2b747d5606590ac0c890f956ed38220a4ab59baddfd7b713d78a62d240b20b14ab801fa02cb - languageName: node - linkType: hard - -"path-key@npm:^2.0.0, path-key@npm:^2.0.1": - version: 2.0.1 - resolution: "path-key@npm:2.0.1" - checksum: f7ab0ad42fe3fb8c7f11d0c4f849871e28fbd8e1add65c370e422512fc5887097b9cf34d09c1747d45c942a8c1e26468d6356e2df3f740bf177ab8ca7301ebfd - languageName: node - linkType: hard - -"path-key@npm:^3.0.0, path-key@npm:^3.1.0": - version: 3.1.1 - resolution: "path-key@npm:3.1.1" - checksum: 55cd7a9dd4b343412a8386a743f9c746ef196e57c823d90ca3ab917f90ab9f13dd0ded27252ba49dbdfcab2b091d998bc446f6220cd3cea65db407502a740020 - languageName: node - linkType: hard - -"path-key@npm:^4.0.0": - version: 4.0.0 - resolution: "path-key@npm:4.0.0" - checksum: 8e6c314ae6d16b83e93032c61020129f6f4484590a777eed709c4a01b50e498822b00f76ceaf94bc64dbd90b327df56ceadce27da3d83393790f1219e07721d7 - languageName: node - linkType: hard - -"path-parse@npm:^1.0.7": - version: 1.0.7 - resolution: "path-parse@npm:1.0.7" - checksum: 49abf3d81115642938a8700ec580da6e830dde670be21893c62f4e10bd7dd4c3742ddc603fe24f898cba7eb0c6bc1777f8d9ac14185d34540c6d4d80cd9cae8a - languageName: node - linkType: hard - -"path-posix@npm:^1.0.0": - version: 1.0.0 - resolution: "path-posix@npm:1.0.0" - checksum: 4f64ad212de6ad8d0dbfa440cac8b924303c25c30301769ad0501e29e83a5b9d469e8133753f999ad37482c9c8d3511129e4d83db55d2e4b1555b183c9749ae8 - languageName: node - linkType: hard - -"path-root-regex@npm:^0.1.0": - version: 0.1.2 - resolution: "path-root-regex@npm:0.1.2" - checksum: dcd75d1f8e93faabe35a58e875b0f636839b3658ff2ad8c289463c40bc1a844debe0dab73c3398ef9dc8f6ec6c319720aff390cf4633763ddcf3cf4b1bbf7e8b - languageName: node - linkType: hard - -"path-root@npm:^0.1.1": - version: 0.1.1 - resolution: "path-root@npm:0.1.1" - dependencies: - path-root-regex: ^0.1.0 - checksum: ff88aebfc1c59ace510cc06703d67692a11530989920427625e52b66a303ca9b3d4059b0b7d0b2a73248d1ad29bcb342b8b786ec00592f3101d38a45fd3b2e08 - languageName: node - linkType: hard - -"path-scurry@npm:^1.11.1": - version: 1.11.1 - resolution: "path-scurry@npm:1.11.1" - dependencies: - lru-cache: ^10.2.0 - minipass: ^5.0.0 || ^6.0.2 || ^7.0.0 - checksum: 890d5abcd593a7912dcce7cf7c6bf7a0b5648e3dee6caf0712c126ca0a65c7f3d7b9d769072a4d1baf370f61ce493ab5b038d59988688e0c5f3f646ee3c69023 - languageName: node - linkType: hard - -"path-to-regexp@npm:0.1.7": - version: 0.1.7 - resolution: "path-to-regexp@npm:0.1.7" - checksum: 69a14ea24db543e8b0f4353305c5eac6907917031340e5a8b37df688e52accd09e3cebfe1660b70d76b6bd89152f52183f28c74813dbf454ba1a01c82a38abce - languageName: node - linkType: hard - -"path-to-regexp@npm:3.3.0": - version: 3.3.0 - resolution: "path-to-regexp@npm:3.3.0" - checksum: bb249d08804f7961dd44fb175466c900b893c56e909db8e2a66ec12b9d9a964af269eb7a50892c933f52b47315953dfdb4279639fbce20977c3625a9ef3055fe - languageName: node - linkType: hard - -"path-to-regexp@npm:^6.2.0": - version: 6.2.1 - resolution: "path-to-regexp@npm:6.2.1" - checksum: f0227af8284ea13300f4293ba111e3635142f976d4197f14d5ad1f124aebd9118783dd2e5f1fe16f7273743cc3dbeddfb7493f237bb27c10fdae07020cc9b698 - languageName: node - linkType: hard - -"path-type@npm:^4.0.0": - version: 4.0.0 - resolution: "path-type@npm:4.0.0" - checksum: 5b1e2daa247062061325b8fdbfd1fb56dde0a448fb1455453276ea18c60685bdad23a445dc148cf87bc216be1573357509b7d4060494a6fd768c7efad833ee45 - languageName: node - linkType: hard - -"pathe@npm:^1.1.0, pathe@npm:^1.1.1, pathe@npm:^1.1.2": - version: 1.1.2 - resolution: "pathe@npm:1.1.2" - checksum: ec5f778d9790e7b9ffc3e4c1df39a5bb1ce94657a4e3ad830c1276491ca9d79f189f47609884671db173400256b005f4955f7952f52a2aeb5834ad5fb4faf134 - languageName: node - linkType: hard - -"pathval@npm:^2.0.0": - version: 2.0.0 - resolution: "pathval@npm:2.0.0" - checksum: 682b6a6289de7990909effef7dae9aa7bb6218c0426727bccf66a35b34e7bfbc65615270c5e44e3c9557a5cb44b1b9ef47fc3cb18bce6ad3ba92bcd28467ed7d - languageName: node - linkType: hard - -"pause-stream@npm:0.0.11": - version: 0.0.11 - resolution: "pause-stream@npm:0.0.11" - dependencies: - through: ~2.3 - checksum: 3c4a14052a638b92e0c96eb00c0d7977df7f79ea28395250c525d197f1fc02d34ce1165d5362e2e6ebbb251524b94a76f3f0d4abc39ab8b016d97449fe15583c - languageName: node - linkType: hard - -"pbkdf2@npm:^3.0.17, pbkdf2@npm:^3.0.3": - version: 3.1.2 - resolution: "pbkdf2@npm:3.1.2" - dependencies: - create-hash: ^1.1.2 - create-hmac: ^1.1.4 - ripemd160: ^2.0.1 - safe-buffer: ^5.0.1 - sha.js: ^2.4.8 - checksum: 2c950a100b1da72123449208e231afc188d980177d021d7121e96a2de7f2abbc96ead2b87d03d8fe5c318face097f203270d7e27908af9f471c165a4e8e69c92 - languageName: node - linkType: hard - -"pend@npm:~1.2.0": - version: 1.2.0 - resolution: "pend@npm:1.2.0" - checksum: 6c72f5243303d9c60bd98e6446ba7d30ae29e3d56fdb6fae8767e8ba6386f33ee284c97efe3230a0d0217e2b1723b8ab490b1bbf34fcbb2180dbc8a9de47850d - languageName: node - linkType: hard - -"performance-now@npm:^2.1.0": - version: 2.1.0 - resolution: "performance-now@npm:2.1.0" - checksum: 534e641aa8f7cba160f0afec0599b6cecefbb516a2e837b512be0adbe6c1da5550e89c78059c7fabc5c9ffdf6627edabe23eb7c518c4500067a898fa65c2b550 - languageName: node - linkType: hard - -"phin@npm:^2.9.1": - version: 2.9.3 - resolution: "phin@npm:2.9.3" - checksum: 7e2abd7be74a54eb7be92dccb1d7a019725c8adaa79ac22a38f25220f9a859393e654ea753a559d326aed7bbc966fadac88270cc8c39d78896f7784219560c47 - languageName: node - linkType: hard - -"picocolors@npm:^0.2.1": - version: 0.2.1 - resolution: "picocolors@npm:0.2.1" - checksum: 3b0f441f0062def0c0f39e87b898ae7461c3a16ffc9f974f320b44c799418cabff17780ee647fda42b856a1dc45897e2c62047e1b546d94d6d5c6962f45427b2 - languageName: node - linkType: hard - -"picocolors@npm:^1.0.0, picocolors@npm:^1.0.1, picocolors@npm:^1.1.0, picocolors@npm:^1.1.1": - version: 1.1.1 - resolution: "picocolors@npm:1.1.1" - checksum: e1cf46bf84886c79055fdfa9dcb3e4711ad259949e3565154b004b260cd356c5d54b31a1437ce9782624bf766272fe6b0154f5f0c744fb7af5d454d2b60db045 - languageName: node - linkType: hard - -"picomatch@npm:^2.0.4, picomatch@npm:^2.2.1, picomatch@npm:^2.2.2, picomatch@npm:^2.2.3, picomatch@npm:^2.3.1": - version: 2.3.1 - resolution: "picomatch@npm:2.3.1" - checksum: 050c865ce81119c4822c45d3c84f1ced46f93a0126febae20737bd05ca20589c564d6e9226977df859ed5e03dc73f02584a2b0faad36e896936238238b0446cf - languageName: node - linkType: hard - -"picomatch@npm:^3.0.1": - version: 3.0.1 - resolution: "picomatch@npm:3.0.1" - checksum: b7fe18174bcc05bbf0ea09cc85623ae395676b3e6bc25636d4c20db79a948586237e429905453bf1ba385bc7a7aa5b56f1b351680e650d2b5c305ceb98dfc914 - languageName: node - linkType: hard - -"picomatch@npm:^4.0.2": - version: 4.0.2 - resolution: "picomatch@npm:4.0.2" - checksum: a7a5188c954f82c6585720e9143297ccd0e35ad8072231608086ca950bee672d51b0ef676254af0788205e59bd4e4deb4e7708769226bed725bf13370a7d1464 - languageName: node - linkType: hard - -"pidtree@npm:0.6.0": - version: 0.6.0 - resolution: "pidtree@npm:0.6.0" - bin: - pidtree: bin/pidtree.js - checksum: 8fbc073ede9209dd15e80d616e65eb674986c93be49f42d9ddde8dbbd141bb53d628a7ca4e58ab5c370bb00383f67d75df59a9a226dede8fa801267a7030c27a - languageName: node - linkType: hard - -"pify@npm:^2.0.0, pify@npm:^2.2.0, pify@npm:^2.3.0": - version: 2.3.0 - resolution: "pify@npm:2.3.0" - checksum: 9503aaeaf4577acc58642ad1d25c45c6d90288596238fb68f82811c08104c800e5a7870398e9f015d82b44ecbcbef3dc3d4251a1cbb582f6e5959fe09884b2ba - languageName: node - linkType: hard - -"pify@npm:^3.0.0": - version: 3.0.0 - resolution: "pify@npm:3.0.0" - checksum: 6cdcbc3567d5c412450c53261a3f10991665d660961e06605decf4544a61a97a54fefe70a68d5c37080ff9d6f4cf51444c90198d1ba9f9309a6c0d6e9f5c4fde - languageName: node - linkType: hard - -"pify@npm:^4.0.1": - version: 4.0.1 - resolution: "pify@npm:4.0.1" - checksum: 9c4e34278cb09987685fa5ef81499c82546c033713518f6441778fbec623fc708777fe8ac633097c72d88470d5963094076c7305cafc7ad340aae27cfacd856b - languageName: node - linkType: hard - -"pify@npm:^5.0.0": - version: 5.0.0 - resolution: "pify@npm:5.0.0" - checksum: 443e3e198ad6bfa8c0c533764cf75c9d5bc976387a163792fb553ffe6ce923887cf14eebf5aea9b7caa8eab930da8c33612990ae85bd8c2bc18bedb9eae94ecb - languageName: node - linkType: hard - -"pinkie-promise@npm:^2.0.0": - version: 2.0.1 - resolution: "pinkie-promise@npm:2.0.1" - dependencies: - pinkie: ^2.0.0 - checksum: b53a4a2e73bf56b6f421eef711e7bdcb693d6abb474d57c5c413b809f654ba5ee750c6a96dd7225052d4b96c4d053cdcb34b708a86fceed4663303abee52fcca - languageName: node - linkType: hard - -"pinkie@npm:^2.0.0": - version: 2.0.4 - resolution: "pinkie@npm:2.0.4" - checksum: b12b10afea1177595aab036fc220785488f67b4b0fc49e7a27979472592e971614fa1c728e63ad3e7eb748b4ec3c3dbd780819331dad6f7d635c77c10537b9db - languageName: node - linkType: hard - -"pino-abstract-transport@npm:v0.5.0": - version: 0.5.0 - resolution: "pino-abstract-transport@npm:0.5.0" - dependencies: - duplexify: ^4.1.2 - split2: ^4.0.0 - checksum: c503f867de3189f8217ab9cf794e8a631dddd0029a829f0f985f5511308152ebd53e363764fbc5570b3d1c715b341e3923456ce16ad84cd41be2b9a074ada234 - languageName: node - linkType: hard - -"pino-std-serializers@npm:^4.0.0": - version: 4.0.0 - resolution: "pino-std-serializers@npm:4.0.0" - checksum: 89d487729b58c9d3273a0ee851ead068d6d2e2ccc1af8e1c1d28f1b3442423679bec7ec04d9a2aba36f94f335e82be9f4de19dc4fbc161e71c136aaa15b85ad3 - languageName: node - linkType: hard - -"pino@npm:7.11.0": - version: 7.11.0 - resolution: "pino@npm:7.11.0" - dependencies: - atomic-sleep: ^1.0.0 - fast-redact: ^3.0.0 - on-exit-leak-free: ^0.2.0 - pino-abstract-transport: v0.5.0 - pino-std-serializers: ^4.0.0 - process-warning: ^1.0.0 - quick-format-unescaped: ^4.0.3 - real-require: ^0.1.0 - safe-stable-stringify: ^2.1.0 - sonic-boom: ^2.2.1 - thread-stream: ^0.15.1 - bin: - pino: bin.js - checksum: b919e7dbe41de978bb050dcef94fd687c012eb78d344a18f75f04ce180d5810fc162be1f136722d70cd005ed05832c4023a38b9acbc1076ae63c9f5ec5ca515c - languageName: node - linkType: hard - -"pinpoint@npm:^1.1.0": - version: 1.1.0 - resolution: "pinpoint@npm:1.1.0" - checksum: 6199e13269796fea5b0da39df86dc815e14adc20081b533150be8cabaabc64f0581506288c379b96df2095c015fe28d012e2386a14759e1372a1bafcc05a1746 - languageName: node - linkType: hard - -"pirates@npm:^4.0.1, pirates@npm:^4.0.4, pirates@npm:^4.0.5": - version: 4.0.5 - resolution: "pirates@npm:4.0.5" - checksum: c9994e61b85260bec6c4fc0307016340d9b0c4f4b6550a957afaaff0c9b1ad58fbbea5cfcf083860a25cb27a375442e2b0edf52e2e1e40e69934e08dcc52d227 - languageName: node - linkType: hard - -"pixelmatch@npm:^4.0.2": - version: 4.0.2 - resolution: "pixelmatch@npm:4.0.2" - dependencies: - pngjs: ^3.0.0 - bin: - pixelmatch: bin/pixelmatch - checksum: 9c5c1329001938cae6d01e2bb84a909ba767f8256bcafc075422cea2a4dbaa8bebd44fceaa4b4ce7cdc36d11f20d4f1ba0cf669851d5649b32d8d1d27e4f5a36 - languageName: node - linkType: hard - -"pkg-dir@npm:^3.0.0": - version: 3.0.0 - resolution: "pkg-dir@npm:3.0.0" - dependencies: - find-up: ^3.0.0 - checksum: 70c9476ffefc77552cc6b1880176b71ad70bfac4f367604b2b04efd19337309a4eec985e94823271c7c0e83946fa5aeb18cd360d15d10a5d7533e19344bfa808 - languageName: node - linkType: hard - -"pkg-dir@npm:^4.1.0, pkg-dir@npm:^4.2.0": - version: 4.2.0 - resolution: "pkg-dir@npm:4.2.0" - dependencies: - find-up: ^4.0.0 - checksum: 9863e3f35132bf99ae1636d31ff1e1e3501251d480336edb1c211133c8d58906bed80f154a1d723652df1fda91e01c7442c2eeaf9dc83157c7ae89087e43c8d6 - languageName: node - linkType: hard - -"pkg-types@npm:^1.0.3": - version: 1.0.3 - resolution: "pkg-types@npm:1.0.3" - dependencies: - jsonc-parser: ^3.2.0 - mlly: ^1.2.0 - pathe: ^1.1.0 - checksum: 4b305c834b912ddcc8a0fe77530c0b0321fe340396f84cbb87aecdbc126606f47f2178f23b8639e71a4870f9631c7217aef52ffed0ae17ea2dbbe7e43d116a6e - languageName: node - linkType: hard - -"pkg-up@npm:^3.1.0": - version: 3.1.0 - resolution: "pkg-up@npm:3.1.0" - dependencies: - find-up: ^3.0.0 - checksum: 5bac346b7c7c903613c057ae3ab722f320716199d753f4a7d053d38f2b5955460f3e6ab73b4762c62fd3e947f58e04f1343e92089e7bb6091c90877406fcd8c8 - languageName: node - linkType: hard - -"playwright-core@npm:1.49.1": - version: 1.49.1 - resolution: "playwright-core@npm:1.49.1" - bin: - playwright-core: cli.js - checksum: a940f4b10ff1de033b4b8594b5104b02849a892d9adda0d42330a872cd3d8d287ffd2b01fc33f33ccd34f8904bb8ae8220b878b62e899f3d9bcd1b0945ab45c7 - languageName: node - linkType: hard - -"playwright-slack-report@npm:1.1.89": - version: 1.1.89 - resolution: "playwright-slack-report@npm:1.1.89" - dependencies: - "@slack/web-api": ^7.6.0 - "@slack/webhook": ^7.0.1 - commander: ^11.1.0 - https-proxy-agent: ^7.0.5 - ts-node: ^10.9.2 - zod: ^3.22.4 - bin: - playwright-slack-report: dist/cli.js - checksum: 7054ae9c272a89d168d67b7f9b1cabb96af4d29d85f31348c3ee73eb7e477083ab9ca5afcf3cc7a914f91cff5b9871fd31dbc7f74cff9959284725631c17f648 - languageName: node - linkType: hard - -"playwright@npm:1.49.1": - version: 1.49.1 - resolution: "playwright@npm:1.49.1" - dependencies: - fsevents: 2.3.2 - playwright-core: 1.49.1 - dependenciesMeta: - fsevents: - optional: true - bin: - playwright: cli.js - checksum: c136d42d625e32614f90e5228a165dc8be48c5bfb52aca9210c6ff04161a409dbe42fe5ae4f05a2653f6a1b836876a04d3b0f24bcbbc053d1509c1d605b7c8d5 - languageName: node - linkType: hard - -"please-upgrade-node@npm:^3.2.0": - version: 3.2.0 - resolution: "please-upgrade-node@npm:3.2.0" - dependencies: - semver-compare: ^1.0.0 - checksum: d87c41581a2a022fbe25965a97006238cd9b8cbbf49b39f78d262548149a9d30bd2bdf35fec3d810e0001e630cd46ef13c7e19c389dea8de7e64db271a2381bb - languageName: node - linkType: hard - -"plist@npm:^3.0.1, plist@npm:^3.0.5, plist@npm:^3.1.0": - version: 3.1.0 - resolution: "plist@npm:3.1.0" - dependencies: - "@xmldom/xmldom": ^0.8.8 - base64-js: ^1.5.1 - xmlbuilder: ^15.1.1 - checksum: c8ea013da8646d4c50dff82f9be39488054621cc229957621bb00add42b5d4ce3657cf58d4b10c50f7dea1a81118f825838f838baeb4e6f17fab453ecf91d424 - languageName: node - linkType: hard - -"pluralize@npm:^8.0.0": - version: 8.0.0 - resolution: "pluralize@npm:8.0.0" - checksum: 08931d4a6a4a5561a7f94f67a31c17e6632cb21e459ab3ff4f6f629d9a822984cf8afef2311d2005fbea5d7ef26016ebb090db008e2d8bce39d0a9a9d218736e - languageName: node - linkType: hard - -"png-ts@npm:0.0.3": - version: 0.0.3 - resolution: "png-ts@npm:0.0.3" - dependencies: - pako: ^1.0.6 - checksum: c1a87455975d419bd01ce1219707a506936ec78bdb60530ab559ffcb4e4da799dd636ae000a3ac0fe9c942c94b3fa1e6e7023d5b2a18e371264354cc87dc0307 - languageName: node - linkType: hard - -"pngjs@npm:^3.0.0, pngjs@npm:^3.3.0, pngjs@npm:^3.3.3": - version: 3.4.0 - resolution: "pngjs@npm:3.4.0" - checksum: 8bd40bd698abd16b72c97b85cb858c80894fbedc76277ce72a784aa441e14795d45d9856e97333ca469b34b67528860ffc8a7317ca6beea349b645366df00bcd - languageName: node - linkType: hard - -"pngjs@npm:^5.0.0": - version: 5.0.0 - resolution: "pngjs@npm:5.0.0" - checksum: 04e912cc45fb9601564e2284efaf0c5d20d131d9b596244f8a6789fc6cdb6b18d2975a6bbf7a001858d7e159d5c5c5dd7b11592e97629b7137f7f5cef05904c8 - languageName: node - linkType: hard - -"pnp-webpack-plugin@npm:^1.7.0": - version: 1.7.0 - resolution: "pnp-webpack-plugin@npm:1.7.0" - dependencies: - ts-pnp: ^1.1.6 - checksum: a41716d13607be5a3e06ba58b17e9e619cf07da3a0a7b10bd41cd89362873041054fd2b7966ad30a1b26b826cfb8fecc0469a95902d5b1b8ba8f591e2fe6b96d - languageName: node - linkType: hard - -"poisson-disk-sampling@npm:2.3.1": - version: 2.3.1 - resolution: "poisson-disk-sampling@npm:2.3.1" - dependencies: - moore: ~1.0.0 - checksum: 657e6d65e8e32f0b63763577cd1efa406b2d605aeb87876c807cc82377b2880753e43dc191c104a4cd213620cdab7b44199746ebd70db9ae18542d8252378737 - languageName: node - linkType: hard - -"polished@npm:3.3.2": - version: 3.3.2 - resolution: "polished@npm:3.3.2" - dependencies: - "@babel/runtime": ^7.4.4 - checksum: d2a4897636e9b532970cacfe8d161cd6b99b0825abdb852096c66592033dfb14f4366097c379c26edb9bf1a4f348ea4b0c14ce9071976e78a53b83a06f77189a - languageName: node - linkType: hard - -"polished@npm:^4.2.2, polished@npm:^4.3.1": - version: 4.3.1 - resolution: "polished@npm:4.3.1" - dependencies: - "@babel/runtime": ^7.17.8 - checksum: a6f863c23f1d2f3f5cda3427b5885c9fb9e83b036d681e24820b143c7df40d2685bebb01c0939767120a28e1183671ae17c93db82ac30b3c20942180bb153bc7 - languageName: node - linkType: hard - -"polyfill-object.fromentries@npm:1.0.1": - version: 1.0.1 - resolution: "polyfill-object.fromentries@npm:1.0.1" - checksum: 1cfec1d2637cc1d6c6c7db5965e27e95964854f1964413ebe05f97223837c99150c2e31fe46634cf4347cfc8a0c93186ab4c01cd1b0a3ebed823b2c629d8b4d2 - languageName: node - linkType: hard - -"pony-cause@npm:^2.1.10": - version: 2.1.10 - resolution: "pony-cause@npm:2.1.10" - checksum: 8b61378f213e61056312dc274a1c79980154e9d864f6ad86e0c8b91a50d3ce900d430995ee24147c9f3caa440dfe7d51c274b488d7f033b65b206522536d7217 - languageName: node - linkType: hard - -"popmotion@npm:11.0.3": - version: 11.0.3 - resolution: "popmotion@npm:11.0.3" - dependencies: - framesync: 6.0.1 - hey-listen: ^1.0.8 - style-value-types: 5.0.0 - tslib: ^2.1.0 - checksum: 9fe7d03b4ec0e85bfb9dadc23b745147bfe42e16f466ba06e6327197d0e38b72015afc2f918a8051dedc3680310417f346ffdc463be6518e2e92e98f48e30268 - languageName: node - linkType: hard - -"possible-typed-array-names@npm:^1.0.0": - version: 1.0.0 - resolution: "possible-typed-array-names@npm:1.0.0" - checksum: b32d403ece71e042385cc7856385cecf1cd8e144fa74d2f1de40d1e16035dba097bc189715925e79b67bdd1472796ff168d3a90d296356c9c94d272d5b95f3ae - languageName: node - linkType: hard - -"postcss-attribute-case-insensitive@npm:^5.0.2": - version: 5.0.2 - resolution: "postcss-attribute-case-insensitive@npm:5.0.2" - dependencies: - postcss-selector-parser: ^6.0.10 - peerDependencies: - postcss: ^8.2 - checksum: c0b8139f37e68dba372724cba03a53c30716224f0085f98485cada99489beb7c3da9d598ffc1d81519b59d9899291712c9041c250205e6ec0b034bb2c144dcf9 - languageName: node - linkType: hard - -"postcss-browser-comments@npm:^4": - version: 4.0.0 - resolution: "postcss-browser-comments@npm:4.0.0" - peerDependencies: - browserslist: ">=4" - postcss: ">=8" - checksum: 9b8e7094838c2d7bd1ab3ca9cb8d0a78a9a6c8e22f43133ba02db8862fb6c141630e9f590e46f7125cfa4723cacd27b74fa00c05a9907b364dc1f6f17cf13f6f - languageName: node - linkType: hard - -"postcss-calc@npm:^8.2.3": - version: 8.2.4 - resolution: "postcss-calc@npm:8.2.4" - dependencies: - postcss-selector-parser: ^6.0.9 - postcss-value-parser: ^4.2.0 - peerDependencies: - postcss: ^8.2.2 - checksum: 314b4cebb0c4ed0cf8356b4bce71eca78f5a7842e6a3942a3bba49db168d5296b2bd93c3f735ae1c616f2651d94719ade33becc03c73d2d79c7394fb7f73eabb - languageName: node - linkType: hard - -"postcss-clamp@npm:^4.1.0": - version: 4.1.0 - resolution: "postcss-clamp@npm:4.1.0" - dependencies: - postcss-value-parser: ^4.2.0 - peerDependencies: - postcss: ^8.4.6 - checksum: 118eec936b3b035dc8d75c89973408f15c5a3de3d1ee210a2b3511e3e431d9c56e6f354b509a90540241e2225ffe3caaa2fdf25919c63348ce4583a28ada642c - languageName: node - linkType: hard - -"postcss-color-functional-notation@npm:^4.2.4": - version: 4.2.4 - resolution: "postcss-color-functional-notation@npm:4.2.4" - dependencies: - postcss-value-parser: ^4.2.0 - peerDependencies: - postcss: ^8.2 - checksum: b763e164fe3577a1de96f75e4bf451585c4f80b8ce60799763a51582cc9402d76faed57324a5d5e5556d90ca7ea0ebde565acb820c95e04bee6f36a91b019831 - languageName: node - linkType: hard - -"postcss-color-hex-alpha@npm:^8.0.4": - version: 8.0.4 - resolution: "postcss-color-hex-alpha@npm:8.0.4" - dependencies: - postcss-value-parser: ^4.2.0 - peerDependencies: - postcss: ^8.4 - checksum: a2f3173a60176cf0aea3b7ebbc799b2cb08229127f0fff708fa31efa14e4ded47ca49aff549d8ed92e74ffe24adee32d5b9d557dbde0524fde5fe389bc520b4e - languageName: node - linkType: hard - -"postcss-color-rebeccapurple@npm:^7.1.1": - version: 7.1.1 - resolution: "postcss-color-rebeccapurple@npm:7.1.1" - dependencies: - postcss-value-parser: ^4.2.0 - peerDependencies: - postcss: ^8.2 - checksum: 03482f9b8170da0fa014c41a5d88bce7b987471fb73fc456d397222a2455c89ac7f974dd6ddf40fd31907e768aad158057164b7c5f62cee63a6ecf29d47d7467 - languageName: node - linkType: hard - -"postcss-colormin@npm:^5.3.1": - version: 5.3.1 - resolution: "postcss-colormin@npm:5.3.1" - dependencies: - browserslist: ^4.21.4 - caniuse-api: ^3.0.0 - colord: ^2.9.1 - postcss-value-parser: ^4.2.0 - peerDependencies: - postcss: ^8.2.15 - checksum: e5778baab30877cd1f51e7dc9d2242a162aeca6360a52956acd7f668c5bc235c2ccb7e4df0370a804d65ebe00c5642366f061db53aa823f9ed99972cebd16024 - languageName: node - linkType: hard - -"postcss-convert-values@npm:^5.1.3": - version: 5.1.3 - resolution: "postcss-convert-values@npm:5.1.3" - dependencies: - browserslist: ^4.21.4 - postcss-value-parser: ^4.2.0 - peerDependencies: - postcss: ^8.2.15 - checksum: df48cdaffabf9737f9cfdc58a3dc2841cf282506a7a944f6c70236cff295d3a69f63de6e0935eeb8a9d3f504324e5b4e240abc29e21df9e35a02585d3060aeb5 - languageName: node - linkType: hard - -"postcss-custom-media@npm:^8.0.2": - version: 8.0.2 - resolution: "postcss-custom-media@npm:8.0.2" - dependencies: - postcss-value-parser: ^4.2.0 - peerDependencies: - postcss: ^8.3 - checksum: 887bbbacf6f8fab688123796e5dc1e8283b99f21e4c674235bd929dc8018c50df8634ea08932033ec93baaca32670ef2b87e6632863e0b4d84847375dbde9366 - languageName: node - linkType: hard - -"postcss-custom-properties@npm:^12.1.10": - version: 12.1.11 - resolution: "postcss-custom-properties@npm:12.1.11" - dependencies: - postcss-value-parser: ^4.2.0 - peerDependencies: - postcss: ^8.2 - checksum: 421f9d8d6b9c9066919f39251859232efc4dc5dd406c01e62e08734319a6ccda6d03dd6b46063ba0971053ac6ad3f7abade56d67650b3e370851b2291e8e45e6 - languageName: node - linkType: hard - -"postcss-custom-selectors@npm:^6.0.3": - version: 6.0.3 - resolution: "postcss-custom-selectors@npm:6.0.3" - dependencies: - postcss-selector-parser: ^6.0.4 - peerDependencies: - postcss: ^8.3 - checksum: 18080d60a8a77a76d8ddff185104d65418fffd02bbf9824499f807ced7941509ba63828ab8fe3ec1d6b0d6c72a482bb90a79d79cdef58e5f4b30113cca16e69b - languageName: node - linkType: hard - -"postcss-dir-pseudo-class@npm:^6.0.5": - version: 6.0.5 - resolution: "postcss-dir-pseudo-class@npm:6.0.5" - dependencies: - postcss-selector-parser: ^6.0.10 - peerDependencies: - postcss: ^8.2 - checksum: 7810c439d8d1a9072c00f8ab39261a1492873ad170425745bd2819c59767db2f352f906588fc2a7d814e91117900563d7e569ecd640367c7332b26b9829927ef - languageName: node - linkType: hard - -"postcss-discard-comments@npm:^5.1.2": - version: 5.1.2 - resolution: "postcss-discard-comments@npm:5.1.2" - peerDependencies: - postcss: ^8.2.15 - checksum: abfd064ebc27aeaf5037643dd51ffaff74d1fa4db56b0523d073ace4248cbb64ffd9787bd6924b0983a9d0bd0e9bf9f10d73b120e50391dc236e0d26c812fa2a - languageName: node - linkType: hard - -"postcss-discard-duplicates@npm:^5.1.0": - version: 5.1.0 - resolution: "postcss-discard-duplicates@npm:5.1.0" - peerDependencies: - postcss: ^8.2.15 - checksum: 88d6964201b1f4ed6bf7a32cefe68e86258bb6e42316ca01d9b32bdb18e7887d02594f89f4a2711d01b51ea6e3fcca8c54be18a59770fe5f4521c61d3eb6ca35 - languageName: node - linkType: hard - -"postcss-discard-empty@npm:^5.1.1": - version: 5.1.1 - resolution: "postcss-discard-empty@npm:5.1.1" - peerDependencies: - postcss: ^8.2.15 - checksum: 970adb12fae5c214c0768236ad9a821552626e77dedbf24a8213d19cc2c4a531a757cd3b8cdd3fc22fb1742471b8692a1db5efe436a71236dec12b1318ee8ff4 - languageName: node - linkType: hard - -"postcss-discard-overridden@npm:^5.1.0": - version: 5.1.0 - resolution: "postcss-discard-overridden@npm:5.1.0" - peerDependencies: - postcss: ^8.2.15 - checksum: d64d4a545aa2c81b22542895cfcddc787d24119f294d35d29b0599a1c818b3cc51f4ee80b80f5a0a09db282453dd5ac49f104c2117cc09112d0ac9b40b499a41 - languageName: node - linkType: hard - -"postcss-double-position-gradients@npm:^3.1.2": - version: 3.1.2 - resolution: "postcss-double-position-gradients@npm:3.1.2" - dependencies: - "@csstools/postcss-progressive-custom-properties": ^1.1.0 - postcss-value-parser: ^4.2.0 - peerDependencies: - postcss: ^8.2 - checksum: ca09bf2aefddc180f1c1413f379eef30d492b8147543413f7251216f23f413c394b2ed10b7cd255e87b18e0c8efe36087ea8b9bfb26a09813f9607a0b8e538b6 - languageName: node - linkType: hard - -"postcss-env-function@npm:^4.0.6": - version: 4.0.6 - resolution: "postcss-env-function@npm:4.0.6" - dependencies: - postcss-value-parser: ^4.2.0 - peerDependencies: - postcss: ^8.4 - checksum: 645b2363cfa21be9dcce7fe4a0f172f0af70c00d6a4c1eb3d7ff7e9cfe26d569e291ec2533114d77b12d610023cd168a92d62c38f2fc969fa333b5ae2bff5ffe - languageName: node - linkType: hard - -"postcss-flexbugs-fixes@npm:^5.0.2": - version: 5.0.2 - resolution: "postcss-flexbugs-fixes@npm:5.0.2" - peerDependencies: - postcss: ^8.1.4 - checksum: 022ddbcca8987303b9be75ff259e9de81b98643adac87a5fc6b52a0fcbbf95e1ac9fd508c4ed67cad76ac5d039b7123de8a0832329481b3c626f5d63f7a28f47 - languageName: node - linkType: hard - -"postcss-focus-visible@npm:^6.0.4": - version: 6.0.4 - resolution: "postcss-focus-visible@npm:6.0.4" - dependencies: - postcss-selector-parser: ^6.0.9 - peerDependencies: - postcss: ^8.4 - checksum: acd010b9ddef9b86ffb5fa604c13515ba83e18bc5118dad0a1281150f412aa0ece056c2c5ac56b55e2599f53ab0f740f5ebfdc51e1f5cfe43b8130bac0096fcc - languageName: node - linkType: hard - -"postcss-focus-within@npm:^5.0.4": - version: 5.0.4 - resolution: "postcss-focus-within@npm:5.0.4" - dependencies: - postcss-selector-parser: ^6.0.9 - peerDependencies: - postcss: ^8.4 - checksum: f23d8ab757345a6deaa807d76e10c88caf4b771c38b60e1593b24aee161c503b5823620e89302226a6ae5e7afdb6ac31809241291912e4176eb594a7ddcc9521 - languageName: node - linkType: hard - -"postcss-font-variant@npm:^5.0.0": - version: 5.0.0 - resolution: "postcss-font-variant@npm:5.0.0" - peerDependencies: - postcss: ^8.1.0 - checksum: a19286589261c2bc3e20470486e1ee3b4daf34271c5020167f30856c9b30c26f23264307cb97a184d503814e1b8c5d8a1f9f64a14fd4fd9551c173dca9424695 - languageName: node - linkType: hard - -"postcss-gap-properties@npm:^3.0.5": - version: 3.0.5 - resolution: "postcss-gap-properties@npm:3.0.5" - peerDependencies: - postcss: ^8.2 - checksum: aed559d6d375203a08a006c9ae8cf5ae90d9edaec5cadd20fe65c1b8ce63c2bc8dfe752d4331880a6e24a300541cde61058be790b7bd9b5d04d470c250fbcd39 - languageName: node - linkType: hard - -"postcss-image-set-function@npm:^4.0.7": - version: 4.0.7 - resolution: "postcss-image-set-function@npm:4.0.7" - dependencies: - postcss-value-parser: ^4.2.0 - peerDependencies: - postcss: ^8.2 - checksum: 7e509330986de14250ead1a557e8da8baaf66ebe8a40354a5dff60ab40d99a483d92aa57d52713251ca1adbf0055ef476c5702b0d0ba5f85a4f407367cdabac0 - languageName: node - linkType: hard - -"postcss-import@npm:^15.1.0": - version: 15.1.0 - resolution: "postcss-import@npm:15.1.0" - dependencies: - postcss-value-parser: ^4.0.0 - read-cache: ^1.0.0 - resolve: ^1.1.7 - peerDependencies: - postcss: ^8.0.0 - checksum: 7bd04bd8f0235429009d0022cbf00faebc885de1d017f6d12ccb1b021265882efc9302006ba700af6cab24c46bfa2f3bc590be3f9aee89d064944f171b04e2a3 - languageName: node - linkType: hard - -"postcss-initial@npm:^4.0.1": - version: 4.0.1 - resolution: "postcss-initial@npm:4.0.1" - peerDependencies: - postcss: ^8.0.0 - checksum: 6956953853865de79c39d11533a2860e9f38b770bb284d0010d98a00b9469e22de344e4e5fd8208614d797030487e8918dd2f2c37d9e24d4dd59d565d4fc3e12 - languageName: node - linkType: hard - -"postcss-js@npm:^4.0.1": - version: 4.0.1 - resolution: "postcss-js@npm:4.0.1" - dependencies: - camelcase-css: ^2.0.1 - peerDependencies: - postcss: ^8.4.21 - checksum: 5c1e83efeabeb5a42676193f4357aa9c88f4dc1b3c4a0332c132fe88932b33ea58848186db117cf473049fc233a980356f67db490bd0a7832ccba9d0b3fd3491 - languageName: node - linkType: hard - -"postcss-lab-function@npm:^4.2.1": - version: 4.2.1 - resolution: "postcss-lab-function@npm:4.2.1" - dependencies: - "@csstools/postcss-progressive-custom-properties": ^1.1.0 - postcss-value-parser: ^4.2.0 - peerDependencies: - postcss: ^8.2 - checksum: 26ac74b430011271b5581beba69b2cd788f56375fcb64c90f6ec1577379af85f6022dc38c410ff471dac520c7ddc289160a6a16cca3c7ff76f5af7e90d31eaa3 - languageName: node - linkType: hard - -"postcss-load-config@npm:^4.0.2": - version: 4.0.2 - resolution: "postcss-load-config@npm:4.0.2" - dependencies: - lilconfig: ^3.0.0 - yaml: ^2.3.4 - peerDependencies: - postcss: ">=8.0.9" - ts-node: ">=9.0.0" - peerDependenciesMeta: - postcss: - optional: true - ts-node: - optional: true - checksum: 7c27dd3801db4eae207a5116fed2db6b1ebb780b40c3dd62a3e57e087093a8e6a14ee17ada729fee903152d6ef4826c6339eb135bee6208e0f3140d7e8090185 - languageName: node - linkType: hard - -"postcss-loader@npm:^6.2.1": - version: 6.2.1 - resolution: "postcss-loader@npm:6.2.1" - dependencies: - cosmiconfig: ^7.0.0 - klona: ^2.0.5 - semver: ^7.3.5 - peerDependencies: - postcss: ^7.0.0 || ^8.0.1 - webpack: ^5.0.0 - checksum: e40ae79c3e39df37014677a817b001bd115d8b10dedf53a07b97513d93b1533cd702d7a48831bdd77b9a9484b1ec84a5d4a723f80e83fb28682c75b5e65e8a90 - languageName: node - linkType: hard - -"postcss-logical@npm:^5.0.4": - version: 5.0.4 - resolution: "postcss-logical@npm:5.0.4" - peerDependencies: - postcss: ^8.4 - checksum: 17c71291ed6a03883a5aa54b9923b874c32710707d041a0f0752e6febdb09dee5d2abf4ef271978d932e4a4c948f349bb23edf633c03e3427ba15e71bfc66ac7 - languageName: node - linkType: hard - -"postcss-media-minmax@npm:^5.0.0": - version: 5.0.0 - resolution: "postcss-media-minmax@npm:5.0.0" - peerDependencies: - postcss: ^8.1.0 - checksum: 2cd7283e07a1ac1acdcc3ecbaa0e9932f8d1e7647e7aeb14d91845fcb890d60d7257ec70c825cae8d48ae80a08cc77ebc4021a0dfa32360e0cd991e2bc021607 - languageName: node - linkType: hard - -"postcss-merge-longhand@npm:^5.1.7": - version: 5.1.7 - resolution: "postcss-merge-longhand@npm:5.1.7" - dependencies: - postcss-value-parser: ^4.2.0 - stylehacks: ^5.1.1 - peerDependencies: - postcss: ^8.2.15 - checksum: 81c3fc809f001b9b71a940148e242bdd6e2d77713d1bfffa15eb25c1f06f6648d5e57cb21645746d020a2a55ff31e1740d2b27900442913a9d53d8a01fb37e1b - languageName: node - linkType: hard - -"postcss-merge-rules@npm:^5.1.4": - version: 5.1.4 - resolution: "postcss-merge-rules@npm:5.1.4" - dependencies: - browserslist: ^4.21.4 - caniuse-api: ^3.0.0 - cssnano-utils: ^3.1.0 - postcss-selector-parser: ^6.0.5 - peerDependencies: - postcss: ^8.2.15 - checksum: 8ab6a569babe6cb412d6612adee74f053cea7edb91fa013398515ab36754b1fec830d68782ed8cdfb44cffdc6b78c79eab157bff650f428aa4460d3f3857447e - languageName: node - linkType: hard - -"postcss-minify-font-values@npm:^5.1.0": - version: 5.1.0 - resolution: "postcss-minify-font-values@npm:5.1.0" - dependencies: - postcss-value-parser: ^4.2.0 - peerDependencies: - postcss: ^8.2.15 - checksum: 35e858fa41efa05acdeb28f1c76579c409fdc7eabb1744c3bd76e895bb9fea341a016746362a67609688ab2471f587202b9a3e14ea28ad677754d663a2777ece - languageName: node - linkType: hard - -"postcss-minify-gradients@npm:^5.1.1": - version: 5.1.1 - resolution: "postcss-minify-gradients@npm:5.1.1" - dependencies: - colord: ^2.9.1 - cssnano-utils: ^3.1.0 - postcss-value-parser: ^4.2.0 - peerDependencies: - postcss: ^8.2.15 - checksum: 27354072a07c5e6dab36731103b94ca2354d4ed3c5bc6aacfdf2ede5a55fa324679d8fee5450800bc50888dbb5e9ed67569c0012040c2be128143d0cebb36d67 - languageName: node - linkType: hard - -"postcss-minify-params@npm:^5.1.4": - version: 5.1.4 - resolution: "postcss-minify-params@npm:5.1.4" - dependencies: - browserslist: ^4.21.4 - cssnano-utils: ^3.1.0 - postcss-value-parser: ^4.2.0 - peerDependencies: - postcss: ^8.2.15 - checksum: bd63e2cc89edcf357bb5c2a16035f6d02ef676b8cede4213b2bddd42626b3d428403849188f95576fc9f03e43ebd73a29bf61d33a581be9a510b13b7f7f100d5 - languageName: node - linkType: hard - -"postcss-minify-selectors@npm:^5.2.1": - version: 5.2.1 - resolution: "postcss-minify-selectors@npm:5.2.1" - dependencies: - postcss-selector-parser: ^6.0.5 - peerDependencies: - postcss: ^8.2.15 - checksum: 6fdbc84f99a60d56b43df8930707da397775e4c36062a106aea2fd2ac81b5e24e584a1892f4baa4469fa495cb87d1422560eaa8f6c9d500f9f0b691a5f95bab5 - languageName: node - linkType: hard - -"postcss-modules-extract-imports@npm:^3.1.0": - version: 3.1.0 - resolution: "postcss-modules-extract-imports@npm:3.1.0" - peerDependencies: - postcss: ^8.1.0 - checksum: b9192e0f4fb3d19431558be6f8af7ca45fc92baaad9b2778d1732a5880cd25c3df2074ce5484ae491e224f0d21345ffc2d419bd51c25b019af76d7a7af88c17f - languageName: node - linkType: hard - -"postcss-modules-local-by-default@npm:^4.0.5": - version: 4.1.0 - resolution: "postcss-modules-local-by-default@npm:4.1.0" - dependencies: - icss-utils: ^5.0.0 - postcss-selector-parser: ^7.0.0 - postcss-value-parser: ^4.1.0 - peerDependencies: - postcss: ^8.1.0 - checksum: 64ac4803c21dd82e227179cf0a8489c645ea99a8c514475da028c9afe5d5b915485d00d8efbe94295d688a23a172965cc15f20d550168d1fed272dbdbbe053f0 - languageName: node - linkType: hard - -"postcss-modules-scope@npm:^3.2.0": - version: 3.2.1 - resolution: "postcss-modules-scope@npm:3.2.1" - dependencies: - postcss-selector-parser: ^7.0.0 - peerDependencies: - postcss: ^8.1.0 - checksum: 085f65863bb7d8bf08209a979ceb22b2b07bb466574e0e698d34aaad832d614957bb05f2418348a14e4035f65e23b2be2951369d26ea429dd5762c6a020f0f7c - languageName: node - linkType: hard - -"postcss-modules-values@npm:^4.0.0": - version: 4.0.0 - resolution: "postcss-modules-values@npm:4.0.0" - dependencies: - icss-utils: ^5.0.0 - peerDependencies: - postcss: ^8.1.0 - checksum: f7f2cdf14a575b60e919ad5ea52fed48da46fe80db2733318d71d523fc87db66c835814940d7d05b5746b0426e44661c707f09bdb83592c16aea06e859409db6 - languageName: node - linkType: hard - -"postcss-nested@npm:^6.2.0": - version: 6.2.0 - resolution: "postcss-nested@npm:6.2.0" - dependencies: - postcss-selector-parser: ^6.1.1 - peerDependencies: - postcss: ^8.2.14 - checksum: 2c86ecf2d0ce68f27c87c7e24ae22dc6dd5515a89fcaf372b2627906e11f5c1f36e4a09e4c15c20fd4a23d628b3d945c35839f44496fbee9a25866258006671b - languageName: node - linkType: hard - -"postcss-nesting@npm:^10.2.0": - version: 10.2.0 - resolution: "postcss-nesting@npm:10.2.0" - dependencies: - "@csstools/selector-specificity": ^2.0.0 - postcss-selector-parser: ^6.0.10 - peerDependencies: - postcss: ^8.2 - checksum: 25e6e66186bd7f18bc4628cf0f43e02189268f28a449aa4a63b33b8f2c33745af99acfcd4ce2ac69319dc850e83b28dbaabcf517e3977dfe20e37fed0e032c7d - languageName: node - linkType: hard - -"postcss-normalize-charset@npm:^5.1.0": - version: 5.1.0 - resolution: "postcss-normalize-charset@npm:5.1.0" - peerDependencies: - postcss: ^8.2.15 - checksum: e79d92971fc05b8b3c9b72f3535a574e077d13c69bef68156a0965f397fdf157de670da72b797f57b0e3bac8f38155b5dd1735ecab143b9cc4032d72138193b4 - languageName: node - linkType: hard - -"postcss-normalize-display-values@npm:^5.1.0": - version: 5.1.0 - resolution: "postcss-normalize-display-values@npm:5.1.0" - dependencies: - postcss-value-parser: ^4.2.0 - peerDependencies: - postcss: ^8.2.15 - checksum: b6eb7b9b02c3bdd62bbc54e01e2b59733d73a1c156905d238e178762962efe0c6f5104544da39f32cade8a4fb40f10ff54b63a8ebfbdff51e8780afb9fbdcf86 - languageName: node - linkType: hard - -"postcss-normalize-positions@npm:^5.1.1": - version: 5.1.1 - resolution: "postcss-normalize-positions@npm:5.1.1" - dependencies: - postcss-value-parser: ^4.2.0 - peerDependencies: - postcss: ^8.2.15 - checksum: d9afc233729c496463c7b1cdd06732469f401deb387484c3a2422125b46ec10b4af794c101f8c023af56f01970b72b535e88373b9058ecccbbf88db81662b3c4 - languageName: node - linkType: hard - -"postcss-normalize-repeat-style@npm:^5.1.1": - version: 5.1.1 - resolution: "postcss-normalize-repeat-style@npm:5.1.1" - dependencies: - postcss-value-parser: ^4.2.0 - peerDependencies: - postcss: ^8.2.15 - checksum: 2c6ad2b0ae10a1fda156b948c34f78c8f1e185513593de4d7e2480973586675520edfec427645fa168c337b0a6b3ceca26f92b96149741ca98a9806dad30d534 - languageName: node - linkType: hard - -"postcss-normalize-string@npm:^5.1.0": - version: 5.1.0 - resolution: "postcss-normalize-string@npm:5.1.0" - dependencies: - postcss-value-parser: ^4.2.0 - peerDependencies: - postcss: ^8.2.15 - checksum: 6e549c6e5b2831e34c7bdd46d8419e2278f6af1d5eef6d26884a37c162844e60339340c57e5e06058cdbe32f27fc6258eef233e811ed2f71168ef2229c236ada - languageName: node - linkType: hard - -"postcss-normalize-timing-functions@npm:^5.1.0": - version: 5.1.0 - resolution: "postcss-normalize-timing-functions@npm:5.1.0" - dependencies: - postcss-value-parser: ^4.2.0 - peerDependencies: - postcss: ^8.2.15 - checksum: da550f50e90b0b23e17b67449a7d1efd1aa68288e66d4aa7614ca6f5cc012896be1972b7168eee673d27da36504faccf7b9f835c0f7e81243f966a42c8c030aa - languageName: node - linkType: hard - -"postcss-normalize-unicode@npm:^5.1.1": - version: 5.1.1 - resolution: "postcss-normalize-unicode@npm:5.1.1" - dependencies: - browserslist: ^4.21.4 - postcss-value-parser: ^4.2.0 - peerDependencies: - postcss: ^8.2.15 - checksum: 4c24d26cc9f4b19a9397db4e71dd600dab690f1de8e14a3809e2aa1452dbc3791c208c38a6316bbc142f29e934fdf02858e68c94038c06174d78a4937e0f273c - languageName: node - linkType: hard - -"postcss-normalize-url@npm:^5.1.0": - version: 5.1.0 - resolution: "postcss-normalize-url@npm:5.1.0" - dependencies: - normalize-url: ^6.0.1 - postcss-value-parser: ^4.2.0 - peerDependencies: - postcss: ^8.2.15 - checksum: 3bd4b3246d6600230bc827d1760b24cb3101827ec97570e3016cbe04dc0dd28f4dbe763245d1b9d476e182c843008fbea80823061f1d2219b96f0d5c724a24c0 - languageName: node - linkType: hard - -"postcss-normalize-whitespace@npm:^5.1.1": - version: 5.1.1 - resolution: "postcss-normalize-whitespace@npm:5.1.1" - dependencies: - postcss-value-parser: ^4.2.0 - peerDependencies: - postcss: ^8.2.15 - checksum: 12d8fb6d1c1cba208cc08c1830959b7d7ad447c3f5581873f7e185f99a9a4230c43d3af21ca12c818e4690a5085a95b01635b762ad4a7bef69d642609b4c0e19 - languageName: node - linkType: hard - -"postcss-normalize@npm:^10.0.1": - version: 10.0.1 - resolution: "postcss-normalize@npm:10.0.1" - dependencies: - "@csstools/normalize.css": "*" - postcss-browser-comments: ^4 - sanitize.css: "*" - peerDependencies: - browserslist: ">= 4" - postcss: ">= 8" - checksum: af67ade84e5d65de0cf84cde479840da96ffb2037fe6bf86737788216f67e414622e718e7d84182885ad65fa948150e4a0c3e454ca63e619dd5c7b4eb4224c39 - languageName: node - linkType: hard - -"postcss-opacity-percentage@npm:^1.1.2": - version: 1.1.3 - resolution: "postcss-opacity-percentage@npm:1.1.3" - peerDependencies: - postcss: ^8.2 - checksum: 54d1b8ca68035bc1a5788aaabdbc3b66ffee34b5a2412cecf073627dad7e3f2bae07c01fac3bc7f46bbac5da3291ac9ddcf74bfee26dfd86f9f96c847a0afc13 - languageName: node - linkType: hard - -"postcss-ordered-values@npm:^5.1.3": - version: 5.1.3 - resolution: "postcss-ordered-values@npm:5.1.3" - dependencies: - cssnano-utils: ^3.1.0 - postcss-value-parser: ^4.2.0 - peerDependencies: - postcss: ^8.2.15 - checksum: 6f3ca85b6ceffc68aadaf319d9ee4c5ac16d93195bf8cba2d1559b631555ad61941461cda6d3909faab86e52389846b2b36345cff8f0c3f4eb345b1b8efadcf9 - languageName: node - linkType: hard - -"postcss-overflow-shorthand@npm:^3.0.4": - version: 3.0.4 - resolution: "postcss-overflow-shorthand@npm:3.0.4" - dependencies: - postcss-value-parser: ^4.2.0 - peerDependencies: - postcss: ^8.2 - checksum: 74009022491e3901263f8f5811630393480323e51f5d23ef17f3fdc7e03bf9c2502a632f3ba8fe6a468b57590f13b2fa3b17a68ef19653589e76277607696743 - languageName: node - linkType: hard - -"postcss-page-break@npm:^3.0.4": - version: 3.0.4 - resolution: "postcss-page-break@npm:3.0.4" - peerDependencies: - postcss: ^8 - checksum: a7d08c945fc691f62c77ac701e64722218b14ec5c8fc1972b8af9c21553492d40808cf95e61b9697b1dacaf7e6180636876d7fee314f079e6c9e39ac1b1edc6f - languageName: node - linkType: hard - -"postcss-place@npm:^7.0.5": - version: 7.0.5 - resolution: "postcss-place@npm:7.0.5" - dependencies: - postcss-value-parser: ^4.2.0 - peerDependencies: - postcss: ^8.2 - checksum: 903fec0c313bb7ec20f2c8f0a125866fb7804aa3186b5b2c7c2d58cb9039ff301461677a060e9db643d1aaffaf80a0ff71e900a6da16705dad6b49c804cb3c73 - languageName: node - linkType: hard - -"postcss-preset-env@npm:^7.0.1": - version: 7.8.3 - resolution: "postcss-preset-env@npm:7.8.3" - dependencies: - "@csstools/postcss-cascade-layers": ^1.1.1 - "@csstools/postcss-color-function": ^1.1.1 - "@csstools/postcss-font-format-keywords": ^1.0.1 - "@csstools/postcss-hwb-function": ^1.0.2 - "@csstools/postcss-ic-unit": ^1.0.1 - "@csstools/postcss-is-pseudo-class": ^2.0.7 - "@csstools/postcss-nested-calc": ^1.0.0 - "@csstools/postcss-normalize-display-values": ^1.0.1 - "@csstools/postcss-oklab-function": ^1.1.1 - "@csstools/postcss-progressive-custom-properties": ^1.3.0 - "@csstools/postcss-stepped-value-functions": ^1.0.1 - "@csstools/postcss-text-decoration-shorthand": ^1.0.0 - "@csstools/postcss-trigonometric-functions": ^1.0.2 - "@csstools/postcss-unset-value": ^1.0.2 - autoprefixer: ^10.4.13 - browserslist: ^4.21.4 - css-blank-pseudo: ^3.0.3 - css-has-pseudo: ^3.0.4 - css-prefers-color-scheme: ^6.0.3 - cssdb: ^7.1.0 - postcss-attribute-case-insensitive: ^5.0.2 - postcss-clamp: ^4.1.0 - postcss-color-functional-notation: ^4.2.4 - postcss-color-hex-alpha: ^8.0.4 - postcss-color-rebeccapurple: ^7.1.1 - postcss-custom-media: ^8.0.2 - postcss-custom-properties: ^12.1.10 - postcss-custom-selectors: ^6.0.3 - postcss-dir-pseudo-class: ^6.0.5 - postcss-double-position-gradients: ^3.1.2 - postcss-env-function: ^4.0.6 - postcss-focus-visible: ^6.0.4 - postcss-focus-within: ^5.0.4 - postcss-font-variant: ^5.0.0 - postcss-gap-properties: ^3.0.5 - postcss-image-set-function: ^4.0.7 - postcss-initial: ^4.0.1 - postcss-lab-function: ^4.2.1 - postcss-logical: ^5.0.4 - postcss-media-minmax: ^5.0.0 - postcss-nesting: ^10.2.0 - postcss-opacity-percentage: ^1.1.2 - postcss-overflow-shorthand: ^3.0.4 - postcss-page-break: ^3.0.4 - postcss-place: ^7.0.5 - postcss-pseudo-class-any-link: ^7.1.6 - postcss-replace-overflow-wrap: ^4.0.0 - postcss-selector-not: ^6.0.1 - postcss-value-parser: ^4.2.0 - peerDependencies: - postcss: ^8.2 - checksum: 71bfb697ffc55e27895b2bf3a579dd9b4c1321872816091935e33d6f659cab60795a03bb022dc8a4cab48fd5680a419fe9ae5d61a3a3d8c785ec9308f323e787 - languageName: node - linkType: hard - -"postcss-pseudo-class-any-link@npm:^7.1.6": - version: 7.1.6 - resolution: "postcss-pseudo-class-any-link@npm:7.1.6" - dependencies: - postcss-selector-parser: ^6.0.10 - peerDependencies: - postcss: ^8.2 - checksum: 43aa18ea1ef1b168f61310856dd92f46ceb3dc60b6cf820e079ca1a849df5cc0f12a1511bdc1811a23f03d60ddcc959200c80c3f9a7b57feebe32bab226afb39 - languageName: node - linkType: hard - -"postcss-reduce-initial@npm:^5.1.2": - version: 5.1.2 - resolution: "postcss-reduce-initial@npm:5.1.2" - dependencies: - browserslist: ^4.21.4 - caniuse-api: ^3.0.0 - peerDependencies: - postcss: ^8.2.15 - checksum: 55db697f85231a81f1969d54c894e4773912d9ddb914f9b03d2e73abc4030f2e3bef4d7465756d0c1acfcc2c2d69974bfb50a972ab27546a7d68b5a4fc90282b - languageName: node - linkType: hard - -"postcss-reduce-transforms@npm:^5.1.0": - version: 5.1.0 - resolution: "postcss-reduce-transforms@npm:5.1.0" - dependencies: - postcss-value-parser: ^4.2.0 - peerDependencies: - postcss: ^8.2.15 - checksum: 0c6af2cba20e3ff63eb9ad045e634ddfb9c3e5c0e614c020db2a02f3aa20632318c4ede9e0c995f9225d9a101e673de91c0a6e10bb2fa5da6d6c75d15a55882f - languageName: node - linkType: hard - -"postcss-replace-overflow-wrap@npm:^4.0.0": - version: 4.0.0 - resolution: "postcss-replace-overflow-wrap@npm:4.0.0" - peerDependencies: - postcss: ^8.0.3 - checksum: 3ffe20b300a4c377a11c588b142740d8557e03c707474c45234c934190ac374750ddc92c7906c373471d273a20504a429c2062c21fdcaff830fb28e0a81ac1dc - languageName: node - linkType: hard - -"postcss-selector-not@npm:^6.0.1": - version: 6.0.1 - resolution: "postcss-selector-not@npm:6.0.1" - dependencies: - postcss-selector-parser: ^6.0.10 - peerDependencies: - postcss: ^8.2 - checksum: fe523a0219e4bd34f04498534bb9e8aec3193f3585eafe4c388d086955b41201cae71fd20980ca465acade7f182029b43dbd5ca7e9d50bf34bbcaf1d19fe3ee6 - languageName: node - linkType: hard - -"postcss-selector-parser@npm:^6.0.10, postcss-selector-parser@npm:^6.0.4, postcss-selector-parser@npm:^6.0.5, postcss-selector-parser@npm:^6.0.9, postcss-selector-parser@npm:^6.1.1, postcss-selector-parser@npm:^6.1.2": - version: 6.1.2 - resolution: "postcss-selector-parser@npm:6.1.2" - dependencies: - cssesc: ^3.0.0 - util-deprecate: ^1.0.2 - checksum: ce9440fc42a5419d103f4c7c1847cb75488f3ac9cbe81093b408ee9701193a509f664b4d10a2b4d82c694ee7495e022f8f482d254f92b7ffd9ed9dea696c6f84 - languageName: node - linkType: hard - -"postcss-selector-parser@npm:^7.0.0": - version: 7.0.0 - resolution: "postcss-selector-parser@npm:7.0.0" - dependencies: - cssesc: ^3.0.0 - util-deprecate: ^1.0.2 - checksum: f906b7449fcbe9fa6ae739b6fc324ee3c6201aaf5224f26da27de64ccba68d878d734dd182a467881e463f7ede08972d0129b0cc4d6b671d78c6492cddcef154 - languageName: node - linkType: hard - -"postcss-svgo@npm:^5.1.0": - version: 5.1.0 - resolution: "postcss-svgo@npm:5.1.0" - dependencies: - postcss-value-parser: ^4.2.0 - svgo: ^2.7.0 - peerDependencies: - postcss: ^8.2.15 - checksum: d86eb5213d9f700cf5efe3073799b485fb7cacae0c731db3d7749c9c2b1c9bc85e95e0baeca439d699ff32ea24815fc916c4071b08f67ed8219df229ce1129bd - languageName: node - linkType: hard - -"postcss-unique-selectors@npm:^5.1.1": - version: 5.1.1 - resolution: "postcss-unique-selectors@npm:5.1.1" - dependencies: - postcss-selector-parser: ^6.0.5 - peerDependencies: - postcss: ^8.2.15 - checksum: 637e7b786e8558265775c30400c54b6b3b24d4748923f4a39f16a65fd0e394f564ccc9f0a1d3c0e770618a7637a7502ea1d0d79f731d429cb202255253c23278 - languageName: node - linkType: hard - -"postcss-value-parser@npm:^4.0.0, postcss-value-parser@npm:^4.0.2, postcss-value-parser@npm:^4.1.0, postcss-value-parser@npm:^4.2.0": - version: 4.2.0 - resolution: "postcss-value-parser@npm:4.2.0" - checksum: 819ffab0c9d51cf0acbabf8996dffbfafbafa57afc0e4c98db88b67f2094cb44488758f06e5da95d7036f19556a4a732525e84289a425f4f6fd8e412a9d7442f - languageName: node - linkType: hard - -"postcss-values-parser@npm:^2.0.1": - version: 2.0.1 - resolution: "postcss-values-parser@npm:2.0.1" - dependencies: - flatten: ^1.0.2 - indexes-of: ^1.0.1 - uniq: ^1.0.1 - checksum: 050877880937e15af8d18bf48902e547e2123d7cc32c1f215b392642bc5e2598a87a341995d62f38e450aab4186b8afeb2c9541934806d458ad8b117020b2ebf - languageName: node - linkType: hard - -"postcss-values-parser@npm:^6.0.2": - version: 6.0.2 - resolution: "postcss-values-parser@npm:6.0.2" - dependencies: - color-name: ^1.1.4 - is-url-superb: ^4.0.0 - quote-unquote: ^1.0.0 - peerDependencies: - postcss: ^8.2.9 - checksum: 615fea3d7996b3fae84a8674fb0e7c6bd0bc006beddb126692c2e43112b772625329c5f10121b00d69fe7a24f7f18dd25e24745574556735c4e9671774df0eb1 - languageName: node - linkType: hard - -"postcss@npm:^7.0.35": - version: 7.0.39 - resolution: "postcss@npm:7.0.39" - dependencies: - picocolors: ^0.2.1 - source-map: ^0.6.1 - checksum: 4ac793f506c23259189064bdc921260d869a115a82b5e713973c5af8e94fbb5721a5cc3e1e26840500d7e1f1fa42a209747c5b1a151918a9bc11f0d7ed9048e3 - languageName: node - linkType: hard - -"postcss@npm:^8.1.7, postcss@npm:^8.3.5, postcss@npm:^8.4.23, postcss@npm:^8.4.27, postcss@npm:^8.4.32, postcss@npm:^8.4.33, postcss@npm:^8.4.4, postcss@npm:^8.4.47, postcss@npm:~8.4.32": - version: 8.4.49 - resolution: "postcss@npm:8.4.49" - dependencies: - nanoid: ^3.3.7 - picocolors: ^1.1.1 - source-map-js: ^1.2.1 - checksum: eb5d6cbdca24f50399aafa5d2bea489e4caee4c563ea1edd5a2485bc5f84e9ceef3febf170272bc83a99c31d23a316ad179213e853f34c2a7a8ffa534559d63a - languageName: node - linkType: hard - -"postinstall-postinstall@npm:2.1.0": - version: 2.1.0 - resolution: "postinstall-postinstall@npm:2.1.0" - checksum: e1d34252cf8d2c5641c7d2db7426ec96e3d7a975f01c174c68f09ef5b8327bc8d5a9aa2001a45e693db2cdbf69577094d3fe6597b564ad2d2202b65fba76134b - languageName: node - linkType: hard - -"preact@npm:^10.16.0": - version: 10.25.0 - resolution: "preact@npm:10.25.0" - checksum: f7ec537a2e21dfc5b9e0704af7c5b85388a2b675dbf49710261d85708bdc980e5d0b8f8601ba5c4d7cbd1295d3c6aaee9f5c70ad005d872ae89b22e7c46a17ed - languageName: node - linkType: hard - -"prebuild-install@npm:^7.1.1": - version: 7.1.2 - resolution: "prebuild-install@npm:7.1.2" - dependencies: - detect-libc: ^2.0.0 - expand-template: ^2.0.3 - github-from-package: 0.0.0 - minimist: ^1.2.3 - mkdirp-classic: ^0.5.3 - napi-build-utils: ^1.0.1 - node-abi: ^3.3.0 - pump: ^3.0.0 - rc: ^1.2.7 - simple-get: ^4.0.0 - tar-fs: ^2.0.0 - tunnel-agent: ^0.6.0 - bin: - prebuild-install: bin.js - checksum: 543dadf8c60e004ae9529e6013ca0cbeac8ef38b5f5ba5518cb0b622fe7f8758b34e4b5cb1a791db3cdc9d2281766302df6088bd1a225f206925d6fee17d6c5c - languageName: node - linkType: hard - -"precinct@npm:^8.1.0": - version: 8.3.1 - resolution: "precinct@npm:8.3.1" - dependencies: - commander: ^2.20.3 - debug: ^4.3.3 - detective-amd: ^3.1.0 - detective-cjs: ^3.1.1 - detective-es6: ^2.2.1 - detective-less: ^1.0.2 - detective-postcss: ^4.0.0 - detective-sass: ^3.0.1 - detective-scss: ^2.0.1 - detective-stylus: ^1.0.0 - detective-typescript: ^7.0.0 - module-definition: ^3.3.1 - node-source-walk: ^4.2.0 - bin: - precinct: bin/cli.js - checksum: 16ba57e545fc53481b3a194f9d7843cefd562ce5e847280355eed360ca4c55def4d03d501776fb49fdf79bfe84a03ec6138003d8387c0426f6a68e1931688399 - languageName: node - linkType: hard - -"precinct@npm:^9.0.0": - version: 9.2.1 - resolution: "precinct@npm:9.2.1" - dependencies: - "@dependents/detective-less": ^3.0.1 - commander: ^9.5.0 - detective-amd: ^4.1.0 - detective-cjs: ^4.1.0 - detective-es6: ^3.0.1 - detective-postcss: ^6.1.1 - detective-sass: ^4.1.1 - detective-scss: ^3.0.1 - detective-stylus: ^3.0.0 - detective-typescript: ^9.1.1 - module-definition: ^4.1.0 - node-source-walk: ^5.0.1 - bin: - precinct: bin/cli.js - checksum: 0352553cca8aff0baa04412429bbe3fab278e9e574fd9bcb2b1bb87dc3ed608f3e08b66c86aee90eed6bac5c4091fe78753ae094d54b01a803189d3259817fe7 - languageName: node - linkType: hard - -"prelude-ls@npm:^1.2.1": - version: 1.2.1 - resolution: "prelude-ls@npm:1.2.1" - checksum: cd192ec0d0a8e4c6da3bb80e4f62afe336df3f76271ac6deb0e6a36187133b6073a19e9727a1ff108cd8b9982e4768850d413baa71214dd80c7979617dca827a - languageName: node - linkType: hard - -"prelude-ls@npm:~1.1.2": - version: 1.1.2 - resolution: "prelude-ls@npm:1.1.2" - checksum: c4867c87488e4a0c233e158e4d0d5565b609b105d75e4c05dc760840475f06b731332eb93cc8c9cecb840aa8ec323ca3c9a56ad7820ad2e63f0261dadcb154e4 - languageName: node - linkType: hard - -"prepend-http@npm:^1.0.1": - version: 1.0.4 - resolution: "prepend-http@npm:1.0.4" - checksum: 01e7baf4ad38af02257b99098543469332fc42ae50df33d97a124bf8172295907352fa6138c9b1610c10c6dd0847ca736e53fda736387cc5cf8fcffe96b47f29 - languageName: node - linkType: hard - -"prepend-http@npm:^2.0.0": - version: 2.0.0 - resolution: "prepend-http@npm:2.0.0" - checksum: 7694a9525405447662c1ffd352fcb41b6410c705b739b6f4e3a3e21cf5fdede8377890088e8934436b8b17ba55365a615f153960f30877bf0d0392f9e93503ea - languageName: node - linkType: hard - -"prettier-linter-helpers@npm:^1.0.0": - version: 1.0.0 - resolution: "prettier-linter-helpers@npm:1.0.0" - dependencies: - fast-diff: ^1.1.2 - checksum: 00ce8011cf6430158d27f9c92cfea0a7699405633f7f1d4a45f07e21bf78e99895911cbcdc3853db3a824201a7c745bd49bfea8abd5fb9883e765a90f74f8392 - languageName: node - linkType: hard - -"prettier-plugin-organize-imports@npm:3.2.4": - version: 3.2.4 - resolution: "prettier-plugin-organize-imports@npm:3.2.4" - peerDependencies: - "@volar/vue-language-plugin-pug": ^1.0.4 - "@volar/vue-typescript": ^1.0.4 - prettier: ">=2.0" - typescript: ">=2.9" - peerDependenciesMeta: - "@volar/vue-language-plugin-pug": - optional: true - "@volar/vue-typescript": - optional: true - checksum: 57ae97d7e403445e650ae92b7da586761d1d88a47e46b3ea274baeb96782165bebd0132db9c652081e185c41b50701ba1d30d615ad1c9000300cc0c67eb12b7a - languageName: node - linkType: hard - -"prettier@npm:3.3.2": - version: 3.3.2 - resolution: "prettier@npm:3.3.2" - bin: - prettier: bin/prettier.cjs - checksum: 5557d8caed0b182f68123c2e1e370ef105251d1dd75800fadaece3d061daf96b1389141634febf776050f9d732c7ae8fd444ff0b4a61b20535e7610552f32c69 - languageName: node - linkType: hard - -"prettier@npm:^2.1.2, prettier@npm:^2.4.1, prettier@npm:^2.6.2": - version: 2.8.8 - resolution: "prettier@npm:2.8.8" - bin: - prettier: bin-prettier.js - checksum: b49e409431bf129dd89238d64299ba80717b57ff5a6d1c1a8b1a28b590d998a34e083fa13573bc732bb8d2305becb4c9a4407f8486c81fa7d55100eb08263cf8 - languageName: node - linkType: hard - -"prettier@npm:^3.3.3": - version: 3.4.2 - resolution: "prettier@npm:3.4.2" - bin: - prettier: bin/prettier.cjs - checksum: 061c84513db62d3944c8dc8df36584dad82883ce4e49efcdbedd8703dce5b173c33fd9d2a4e1725d642a3b713c932b55418342eaa347479bc4a9cca114a04cd0 - languageName: node - linkType: hard - -"pretty-bytes@npm:^5.3.0, pretty-bytes@npm:^5.4.1, pretty-bytes@npm:^5.6.0": - version: 5.6.0 - resolution: "pretty-bytes@npm:5.6.0" - checksum: 9c082500d1e93434b5b291bd651662936b8bd6204ec9fa17d563116a192d6d86b98f6d328526b4e8d783c07d5499e2614a807520249692da9ec81564b2f439cd - languageName: node - linkType: hard - -"pretty-error@npm:^4.0.0": - version: 4.0.0 - resolution: "pretty-error@npm:4.0.0" - dependencies: - lodash: ^4.17.20 - renderkid: ^3.0.0 - checksum: a5b9137365690104ded6947dca2e33360bf55e62a4acd91b1b0d7baa3970e43754c628cc9e16eafbdd4e8f8bcb260a5865475d4fc17c3106ff2d61db4e72cdf3 - languageName: node - linkType: hard - -"pretty-format@npm:^26.6.2": - version: 26.6.2 - resolution: "pretty-format@npm:26.6.2" - dependencies: - "@jest/types": ^26.6.2 - ansi-regex: ^5.0.0 - ansi-styles: ^4.0.0 - react-is: ^17.0.1 - checksum: e3b808404d7e1519f0df1aa1f25cee0054ab475775c6b2b8c5568ff23194a92d54bf93274139b6f584ca70fd773be4eaa754b0e03f12bb0a8d1426b07f079976 - languageName: node - linkType: hard - -"pretty-format@npm:^27.0.2, pretty-format@npm:^27.5.1": - version: 27.5.1 - resolution: "pretty-format@npm:27.5.1" - dependencies: - ansi-regex: ^5.0.1 - ansi-styles: ^5.0.0 - react-is: ^17.0.1 - checksum: cf610cffcb793885d16f184a62162f2dd0df31642d9a18edf4ca298e909a8fe80bdbf556d5c9573992c102ce8bf948691da91bf9739bee0ffb6e79c8a8a6e088 - languageName: node - linkType: hard - -"pretty-format@npm:^28.1.3": - version: 28.1.3 - resolution: "pretty-format@npm:28.1.3" - dependencies: - "@jest/schemas": ^28.1.3 - ansi-regex: ^5.0.1 - ansi-styles: ^5.0.0 - react-is: ^18.0.0 - checksum: e69f857358a3e03d271252d7524bec758c35e44680287f36c1cb905187fbc82da9981a6eb07edfd8a03bc3cbeebfa6f5234c13a3d5b59f2bbdf9b4c4053e0a7f - languageName: node - linkType: hard - -"pretty-format@npm:^29.0.0, pretty-format@npm:^29.0.3, pretty-format@npm:^29.7.0": - version: 29.7.0 - resolution: "pretty-format@npm:29.7.0" - dependencies: - "@jest/schemas": ^29.6.3 - ansi-styles: ^5.0.0 - react-is: ^18.0.0 - checksum: 032c1602383e71e9c0c02a01bbd25d6759d60e9c7cf21937dde8357aa753da348fcec5def5d1002c9678a8524d5fe099ad98861286550ef44de8808cc61e43b6 - languageName: node - linkType: hard - -"pretty-ms@npm:^7.0.1": - version: 7.0.1 - resolution: "pretty-ms@npm:7.0.1" - dependencies: - parse-ms: ^2.1.0 - checksum: d76c4920283b48be91f1d3797a2ce4bd51187d58d2a609ae993c028f73c92d16439449d857af57ccad91ae3a38b30c87307f5589749a056102ebb494c686957e - languageName: node - linkType: hard - -"prettyjson@npm:^1.2.1": - version: 1.2.5 - resolution: "prettyjson@npm:1.2.5" - dependencies: - colors: 1.4.0 - minimist: ^1.2.0 - bin: - prettyjson: bin/prettyjson - checksum: e36e8ae4f77065160028fea33c6ae8e91936f86a4fd1751ceb19f88f336bc54e6f7d232ece38d4da3f7734e5c5e1fc3114a0d92da1987e7cf1515dcb29d447d1 - languageName: node - linkType: hard - -"printable-characters@npm:^1.0.42": - version: 1.0.42 - resolution: "printable-characters@npm:1.0.42" - checksum: 2724aa02919d7085933af0f8f904bd0de67a6b53834f2e5b98fc7aa3650e20755c805e8c85bcf96c09f678cb16a58b55640dd3a2da843195fce06b1ccb0c8ce4 - languageName: node - linkType: hard - -"printj@npm:~1.1.0": - version: 1.1.2 - resolution: "printj@npm:1.1.2" - bin: - printj: ./bin/printj.njs - checksum: 1c0c66844545415e339356ad62009cdc467819817b1e0341aba428087a1414d46b84089edb4e77ef24705829f8aae6349724b9c7bd89d8690302b2de7a89b315 - languageName: node - linkType: hard - -"proc-log@npm:^4.0.0": - version: 4.2.0 - resolution: "proc-log@npm:4.2.0" - checksum: 98f6cd012d54b5334144c5255ecb941ee171744f45fca8b43b58ae5a0c1af07352475f481cadd9848e7f0250376ee584f6aa0951a856ff8f021bdfbff4eb33fc - languageName: node - linkType: hard - -"process-nextick-args@npm:^2.0.0, process-nextick-args@npm:~2.0.0": - version: 2.0.1 - resolution: "process-nextick-args@npm:2.0.1" - checksum: 1d38588e520dab7cea67cbbe2efdd86a10cc7a074c09657635e34f035277b59fbb57d09d8638346bf7090f8e8ebc070c96fa5fd183b777fff4f5edff5e9466cf - languageName: node - linkType: hard - -"process-warning@npm:^1.0.0": - version: 1.0.0 - resolution: "process-warning@npm:1.0.0" - checksum: c708a03241deec3cabaeee39c4f9ee8c4d71f1c5ef9b746c8252cdb952a6059068cfcdaf348399775244cbc441b6ae5e26a9c87ed371f88335d84f26d19180f9 - languageName: node - linkType: hard - -"process@npm:0.11.10, process@npm:^0.11.10": - version: 0.11.10 - resolution: "process@npm:0.11.10" - checksum: bfcce49814f7d172a6e6a14d5fa3ac92cc3d0c3b9feb1279774708a719e19acd673995226351a082a9ae99978254e320ccda4240ddc474ba31a76c79491ca7c3 - languageName: node - linkType: hard - -"progress@npm:^2.0.3": - version: 2.0.3 - resolution: "progress@npm:2.0.3" - checksum: f67403fe7b34912148d9252cb7481266a354bd99ce82c835f79070643bb3c6583d10dbcfda4d41e04bbc1d8437e9af0fb1e1f2135727878f5308682a579429b7 - languageName: node - linkType: hard - -"promise-inflight@npm:^1.0.1": - version: 1.0.1 - resolution: "promise-inflight@npm:1.0.1" - checksum: 22749483091d2c594261517f4f80e05226d4d5ecc1fc917e1886929da56e22b5718b7f2a75f3807e7a7d471bc3be2907fe92e6e8f373ddf5c64bae35b5af3981 - languageName: node - linkType: hard - -"promise-map-series@npm:^0.3.0": - version: 0.3.0 - resolution: "promise-map-series@npm:0.3.0" - checksum: a1c992562e68a3e14c39d010bd6335166e4a0469763fd161a8b1e15f972033fce5207722edb9c16ecc9324b44ef45e42674f7015e6a8922972f45a85849bbeef - languageName: node - linkType: hard - -"promise-polyfill@npm:^8.1.3": - version: 8.3.0 - resolution: "promise-polyfill@npm:8.3.0" - checksum: 206373802076c77def0805758d0a8ece64120dfa6603f092404a1004211f8f2f67f33cadbc35953fc2a8ed0b0d38c774e88bdf01e20ce7a920723a60df84b7a5 - languageName: node - linkType: hard - -"promise-retry@npm:^2.0.1": - version: 2.0.1 - resolution: "promise-retry@npm:2.0.1" - dependencies: - err-code: ^2.0.2 - retry: ^0.12.0 - checksum: f96a3f6d90b92b568a26f71e966cbbc0f63ab85ea6ff6c81284dc869b41510e6cdef99b6b65f9030f0db422bf7c96652a3fff9f2e8fb4a0f069d8f4430359429 - languageName: node - linkType: hard - -"promise@npm:8.3.0, promise@npm:^8.1.0, promise@npm:^8.3.0": - version: 8.3.0 - resolution: "promise@npm:8.3.0" - dependencies: - asap: ~2.0.6 - checksum: a69f0ddbddf78ffc529cffee7ad950d307347615970564b17988ce43fbe767af5c738a9439660b24a9a8cbea106c0dcbb6c2b20e23b7e96a8e89e5c2679e94d5 - languageName: node - linkType: hard - -"promise@npm:^7.1.1": - version: 7.3.1 - resolution: "promise@npm:7.3.1" - dependencies: - asap: ~2.0.3 - checksum: 475bb069130179fbd27ed2ab45f26d8862376a137a57314cf53310bdd85cc986a826fd585829be97ebc0aaf10e9d8e68be1bfe5a4a0364144b1f9eedfa940cf1 - languageName: node - linkType: hard - -"prompts@npm:^2.0.1, prompts@npm:^2.2.1, prompts@npm:^2.3.2, prompts@npm:^2.4.2": - version: 2.4.2 - resolution: "prompts@npm:2.4.2" - dependencies: - kleur: ^3.0.3 - sisteransi: ^1.0.5 - checksum: d8fd1fe63820be2412c13bfc5d0a01909acc1f0367e32396962e737cb2fc52d004f3302475d5ce7d18a1e8a79985f93ff04ee03007d091029c3f9104bffc007d - languageName: node - linkType: hard - -"prop-types@npm:15.8.1, prop-types@npm:^15.5.10, prop-types@npm:^15.5.7, prop-types@npm:^15.6.1, prop-types@npm:^15.6.2, prop-types@npm:^15.7.2, prop-types@npm:^15.8.1": - version: 15.8.1 - resolution: "prop-types@npm:15.8.1" - dependencies: - loose-envify: ^1.4.0 - object-assign: ^4.1.1 - react-is: ^16.13.1 - checksum: c056d3f1c057cb7ff8344c645450e14f088a915d078dcda795041765047fa080d38e5d626560ccaac94a4e16e3aa15f3557c1a9a8d1174530955e992c675e459 - languageName: node - linkType: hard - -"propagate@npm:^2.0.0": - version: 2.0.1 - resolution: "propagate@npm:2.0.1" - checksum: c4febaee2be0979e82fb6b3727878fd122a98d64a7fa3c9d09b0576751b88514a9e9275b1b92e76b364d488f508e223bd7e1dcdc616be4cdda876072fbc2a96c - languageName: node - linkType: hard - -"proto3-json-serializer@npm:^2.0.2": - version: 2.0.2 - resolution: "proto3-json-serializer@npm:2.0.2" - dependencies: - protobufjs: ^7.2.5 - checksum: 21b8aa65be6dac2bb24920e5bdabef48b249bdf65b1498ae7e69ac4e70722275b083cd60a21d2b4be3ead9d768de2f6f5fb6b188bd177d51c824a539b5ba55cc - languageName: node - linkType: hard - -"protobufjs@npm:^7.2.5, protobufjs@npm:^7.3.2": - version: 7.3.2 - resolution: "protobufjs@npm:7.3.2" - dependencies: - "@protobufjs/aspromise": ^1.1.2 - "@protobufjs/base64": ^1.1.2 - "@protobufjs/codegen": ^2.0.4 - "@protobufjs/eventemitter": ^1.1.0 - "@protobufjs/fetch": ^1.1.0 - "@protobufjs/float": ^1.0.2 - "@protobufjs/inquire": ^1.1.0 - "@protobufjs/path": ^1.1.2 - "@protobufjs/pool": ^1.1.0 - "@protobufjs/utf8": ^1.1.0 - "@types/node": ">=13.7.0" - long: ^5.0.0 - checksum: cfb2a744787f26ee7c82f3e7c4b72cfc000e9bb4c07828ed78eb414db0ea97a340c0cc3264d0e88606592f847b12c0351411f10e9af255b7ba864eec44d7705f - languageName: node - linkType: hard - -"proxy-addr@npm:~2.0.7": - version: 2.0.7 - resolution: "proxy-addr@npm:2.0.7" - dependencies: - forwarded: 0.2.0 - ipaddr.js: 1.9.1 - checksum: 29c6990ce9364648255454842f06f8c46fcd124d3e6d7c5066df44662de63cdc0bad032e9bf5a3d653ff72141cc7b6019873d685708ac8210c30458ad99f2b74 - languageName: node - linkType: hard - -"proxy-agent@npm:^6.4.0": - version: 6.4.0 - resolution: "proxy-agent@npm:6.4.0" - dependencies: - agent-base: ^7.0.2 - debug: ^4.3.4 - http-proxy-agent: ^7.0.1 - https-proxy-agent: ^7.0.3 - lru-cache: ^7.14.1 - pac-proxy-agent: ^7.0.1 - proxy-from-env: ^1.1.0 - socks-proxy-agent: ^8.0.2 - checksum: 4d3794ad5e07486298902f0a7f250d0f869fa0e92d790767ca3f793a81374ce0ab6c605f8ab8e791c4d754da96656b48d1c24cb7094bfd310a15867e4a0841d7 - languageName: node - linkType: hard - -"proxy-compare@npm:2.5.1": - version: 2.5.1 - resolution: "proxy-compare@npm:2.5.1" - checksum: c7cc151ac255150bcb24becde6495b3e399416c31991af377ce082255b51f07eaeb5d861bf8bf482703e92f88b90a5892ad57d3153ea29450d03ef921683d9fa - languageName: node - linkType: hard - -"proxy-from-env@npm:1.0.0": - version: 1.0.0 - resolution: "proxy-from-env@npm:1.0.0" - checksum: 292e28d1de0c315958d71d8315eb546dd3cd8c8cbc2dab7c54eeb9f5c17f421771964ad0b5e1f77011bab2305bdae42e1757ce33bdb1ccc3e87732322a8efcf1 - languageName: node - linkType: hard - -"proxy-from-env@npm:^1.1.0": - version: 1.1.0 - resolution: "proxy-from-env@npm:1.1.0" - checksum: ed7fcc2ba0a33404958e34d95d18638249a68c430e30fcb6c478497d72739ba64ce9810a24f53a7d921d0c065e5b78e3822759800698167256b04659366ca4d4 - languageName: node - linkType: hard - -"ps-tree@npm:1.2.0": - version: 1.2.0 - resolution: "ps-tree@npm:1.2.0" - dependencies: - event-stream: =3.3.4 - bin: - ps-tree: ./bin/ps-tree.js - checksum: e635dd00f53d30d31696cf5f95b3a8dbdf9b1aeb36d4391578ce8e8cd22949b7c5536c73b0dc18c78615ea3ddd4be96101166be59ca2e3e3cb1e2f79ba3c7f98 - languageName: node - linkType: hard - -"pseudomap@npm:^1.0.2": - version: 1.0.2 - resolution: "pseudomap@npm:1.0.2" - checksum: 856c0aae0ff2ad60881168334448e898ad7a0e45fe7386d114b150084254c01e200c957cf378378025df4e052c7890c5bd933939b0e0d2ecfcc1dc2f0b2991f5 - languageName: node - linkType: hard - -"psl@npm:^1.1.33": - version: 1.9.0 - resolution: "psl@npm:1.9.0" - checksum: 20c4277f640c93d393130673f392618e9a8044c6c7bf61c53917a0fddb4952790f5f362c6c730a9c32b124813e173733f9895add8d26f566ed0ea0654b2e711d - languageName: node - linkType: hard - -"public-encrypt@npm:^4.0.0": - version: 4.0.3 - resolution: "public-encrypt@npm:4.0.3" - dependencies: - bn.js: ^4.1.0 - browserify-rsa: ^4.0.0 - create-hash: ^1.1.0 - parse-asn1: ^5.0.0 - randombytes: ^2.0.1 - safe-buffer: ^5.1.2 - checksum: 215d446e43cef021a20b67c1df455e5eea134af0b1f9b8a35f9e850abf32991b0c307327bc5b9bc07162c288d5cdb3d4a783ea6c6640979ed7b5017e3e0c9935 - languageName: node - linkType: hard - -"pump@npm:^2.0.0": - version: 2.0.1 - resolution: "pump@npm:2.0.1" - dependencies: - end-of-stream: ^1.1.0 - once: ^1.3.1 - checksum: e9f26a17be00810bff37ad0171edb35f58b242487b0444f92fb7d78bc7d61442fa9b9c5bd93a43fd8fd8ddd3cc75f1221f5e04c790f42907e5baab7cf5e2b931 - languageName: node - linkType: hard - -"pump@npm:^3.0.0": - version: 3.0.0 - resolution: "pump@npm:3.0.0" - dependencies: - end-of-stream: ^1.1.0 - once: ^1.3.1 - checksum: e42e9229fba14732593a718b04cb5e1cfef8254544870997e0ecd9732b189a48e1256e4e5478148ecb47c8511dca2b09eae56b4d0aad8009e6fac8072923cfc9 - languageName: node - linkType: hard - -"pumpify@npm:^1.3.5": - version: 1.5.1 - resolution: "pumpify@npm:1.5.1" - dependencies: - duplexify: ^3.6.0 - inherits: ^2.0.3 - pump: ^2.0.0 - checksum: 26ca412ec8d665bd0d5e185c1b8f627728eff603440d75d22a58e421e3c66eaf86ec6fc6a6efc54808ecef65979279fa8e99b109a23ec1fa8d79f37e6978c9bd - languageName: node - linkType: hard - -"pumpify@npm:^2.0.1": - version: 2.0.1 - resolution: "pumpify@npm:2.0.1" - dependencies: - duplexify: ^4.1.1 - inherits: ^2.0.3 - pump: ^3.0.0 - checksum: cfc96f5307ee828ef8e6eca9fe9e1ae1de0a23ca55688bfe71ea376bc126418073dab870f02b433617f421c4545726b39e31295fce9a99b78bda5f0e527a7c11 - languageName: node - linkType: hard - -"punycode@npm:1.3.2": - version: 1.3.2 - resolution: "punycode@npm:1.3.2" - checksum: b8807fd594b1db33335692d1f03e8beeddde6fda7fbb4a2e32925d88d20a3aa4cd8dcc0c109ccaccbd2ba761c208dfaaada83007087ea8bfb0129c9ef1b99ed6 - languageName: node - linkType: hard - -"punycode@npm:^1.3.2": - version: 1.4.1 - resolution: "punycode@npm:1.4.1" - checksum: fa6e698cb53db45e4628559e557ddaf554103d2a96a1d62892c8f4032cd3bc8871796cae9eabc1bc700e2b6677611521ce5bb1d9a27700086039965d0cf34518 - languageName: node - linkType: hard - -"punycode@npm:^2.1.0, punycode@npm:^2.1.1": - version: 2.1.1 - resolution: "punycode@npm:2.1.1" - checksum: 823bf443c6dd14f669984dea25757b37993f67e8d94698996064035edd43bed8a5a17a9f12e439c2b35df1078c6bec05a6c86e336209eb1061e8025c481168e8 - languageName: node - linkType: hard - -"pure-rand@npm:^6.0.0": - version: 6.0.2 - resolution: "pure-rand@npm:6.0.2" - checksum: 79de33876a4f515d759c48e98d00756bbd916b4ea260cc572d7adfa4b62cace9952e89f0241d0410214554503d25061140fe325c66f845213d2b1728ba8d413e - languageName: node - linkType: hard - -"pvtsutils@npm:^1.3.2": - version: 1.3.2 - resolution: "pvtsutils@npm:1.3.2" - dependencies: - tslib: ^2.4.0 - checksum: 9b8155611363e2f40276879f2454e60204b45be0cd0482f9373f369308a2e9c76d5d74cdf661a3f5aae8022d75ea159eb0ba38ee78fc782ee3051e4722db98d0 - languageName: node - linkType: hard - -"pvutils@npm:^1.1.3": - version: 1.1.3 - resolution: "pvutils@npm:1.1.3" - checksum: 2ee26a9e5176c348977d6ec00d8ee80bff62f51743b1c5fe8abeeb4c5d29d9959cdfe0ce146707a9e6801bce88190fed3002d720b072dc87d031c692820b44c9 - languageName: node - linkType: hard - -"q@npm:^1.1.2, q@npm:^1.5.1": - version: 1.5.1 - resolution: "q@npm:1.5.1" - checksum: 147baa93c805bc1200ed698bdf9c72e9e42c05f96d007e33a558b5fdfd63e5ea130e99313f28efc1783e90e6bdb4e48b67a36fcc026b7b09202437ae88a1fb12 - languageName: node - linkType: hard - -"qr-code-styling@npm:^1.6.0-rc.1": - version: 1.6.0-rc.1 - resolution: "qr-code-styling@npm:1.6.0-rc.1" - dependencies: - qrcode-generator: ^1.4.3 - checksum: 778754790fe0b586ecd38fb02de777c7dd9cf844cf6e3c88f9a23ad85b122200a8567c946e3c41dba84ddd2f0016aa31ddfd1507150e1dbfea8a58323b62d944 - languageName: node - linkType: hard - -"qr.js@npm:0.0.0": - version: 0.0.0 - resolution: "qr.js@npm:0.0.0" - checksum: 5ac6c393967bdeaa660e7fd3a501a25eb538c1f6008a4d30ab2b97bbe520e5c236530090773f1578aa0a523cdaa6923c866615e21143f9e7cd22abd41c789b69 - languageName: node - linkType: hard - -"qrcode-generator@npm:^1.4.3": - version: 1.4.4 - resolution: "qrcode-generator@npm:1.4.4" - checksum: 860cfdd2a7a608d34e92cab99774cc08182e1911432f30ed36d16f8a5cdabd7fdf40239caed91fa2691cfe66c8d95c1340a2fc9cc439eed07a9f2eb328c6f527 - languageName: node - linkType: hard - -"qrcode-terminal-nooctal@npm:^0.12.1": - version: 0.12.1 - resolution: "qrcode-terminal-nooctal@npm:0.12.1" - bin: - qrcode-terminal: bin/qrcode-terminal.js - checksum: 1071c4be2bfa07b3956ad0a63c87452ced0b5180a9dc19f224fc3dd69bb24ad687a7af365acdde0f876ddf89dc1a4beadba88d89c7c5c5cbf2ef3efaef64736e - languageName: node - linkType: hard - -"qrcode-terminal@npm:0.11.0": - version: 0.11.0 - resolution: "qrcode-terminal@npm:0.11.0" - bin: - qrcode-terminal: ./bin/qrcode-terminal.js - checksum: ad146ea1e339e1745402a3ea131631f64f40f0d1ff9cc6bd9c21677feaa1ca6dcd32eadf188fd3febdab8bf6191b3d24d533454903a72543645a72820e4d324c - languageName: node - linkType: hard - -"qrcode@npm:1.5.1": - version: 1.5.1 - resolution: "qrcode@npm:1.5.1" - dependencies: - dijkstrajs: ^1.0.1 - encode-utf8: ^1.0.3 - pngjs: ^5.0.0 - yargs: ^15.3.1 - bin: - qrcode: bin/qrcode - checksum: 842f899d95caaad2ac507408b5498be3197e1df16bc6b537b20069d2cb1330e4588b50f672ce4a9ccf01338f7c97b5732ff9b5caaa6eb2338187d3c25a973e79 - languageName: node - linkType: hard - -"qrcode@npm:1.5.3": - version: 1.5.3 - resolution: "qrcode@npm:1.5.3" - dependencies: - dijkstrajs: ^1.0.1 - encode-utf8: ^1.0.3 - pngjs: ^5.0.0 - yargs: ^15.3.1 - bin: - qrcode: bin/qrcode - checksum: 9a8a20a0a9cb1d15de8e7b3ffa214e8b6d2a8b07655f25bd1b1d77f4681488f84d7bae569870c0652872d829d5f8ac4922c27a6bd14c13f0e197bf07b28dead7 - languageName: node - linkType: hard - -"qs@npm:6.11.0": - version: 6.11.0 - resolution: "qs@npm:6.11.0" - dependencies: - side-channel: ^1.0.4 - checksum: 6e1f29dd5385f7488ec74ac7b6c92f4d09a90408882d0c208414a34dd33badc1a621019d4c799a3df15ab9b1d0292f97c1dd71dc7c045e69f81a8064e5af7297 - languageName: node - linkType: hard - -"query-string@npm:7.1.3, query-string@npm:^7.0.0": - version: 7.1.3 - resolution: "query-string@npm:7.1.3" - dependencies: - decode-uri-component: ^0.2.2 - filter-obj: ^1.1.0 - split-on-first: ^1.0.0 - strict-uri-encode: ^2.0.0 - checksum: 91af02dcd9cc9227a052841d5c2eecb80a0d6489d05625df506a097ef1c59037cfb5e907f39b84643cbfd535c955abec3e553d0130a7b510120c37d06e0f4346 - languageName: node - linkType: hard - -"query-string@npm:^6.12.1": - version: 6.14.1 - resolution: "query-string@npm:6.14.1" - dependencies: - decode-uri-component: ^0.2.0 - filter-obj: ^1.1.0 - split-on-first: ^1.0.0 - strict-uri-encode: ^2.0.0 - checksum: f2c7347578fa0f3fd4eaace506470cb4e9dc52d409a7ddbd613f614b9a594d750877e193b5d5e843c7477b3b295b857ec328903c943957adc41a3efb6c929449 - languageName: node - linkType: hard - -"querystring-es3@npm:^0.2.1": - version: 0.2.1 - resolution: "querystring-es3@npm:0.2.1" - checksum: 691e8d6b8b157e7cd49ae8e83fcf86de39ab3ba948c25abaa94fba84c0986c641aa2f597770848c64abce290ed17a39c9df6df737dfa7e87c3b63acc7d225d61 - languageName: node - linkType: hard - -"querystring@npm:0.2.0": - version: 0.2.0 - resolution: "querystring@npm:0.2.0" - checksum: 8258d6734f19be27e93f601758858c299bdebe71147909e367101ba459b95446fbe5b975bf9beb76390156a592b6f4ac3a68b6087cea165c259705b8b4e56a69 - languageName: node - linkType: hard - -"querystringify@npm:^2.1.1": - version: 2.2.0 - resolution: "querystringify@npm:2.2.0" - checksum: 5641ea231bad7ef6d64d9998faca95611ed4b11c2591a8cae741e178a974f6a8e0ebde008475259abe1621cb15e692404e6b6626e927f7b849d5c09392604b15 - languageName: node - linkType: hard - -"queue-microtask@npm:^1.2.2": - version: 1.2.3 - resolution: "queue-microtask@npm:1.2.3" - checksum: b676f8c040cdc5b12723ad2f91414d267605b26419d5c821ff03befa817ddd10e238d22b25d604920340fd73efd8ba795465a0377c4adf45a4a41e4234e42dc4 - languageName: node - linkType: hard - -"queue-tick@npm:^1.0.1": - version: 1.0.1 - resolution: "queue-tick@npm:1.0.1" - checksum: 57c3292814b297f87f792fbeb99ce982813e4e54d7a8bdff65cf53d5c084113913289d4a48ec8bbc964927a74b847554f9f4579df43c969a6c8e0f026457ad01 - languageName: node - linkType: hard - -"queue@npm:6.0.2": - version: 6.0.2 - resolution: "queue@npm:6.0.2" - dependencies: - inherits: ~2.0.3 - checksum: ebc23639248e4fe40a789f713c20548e513e053b3dc4924b6cb0ad741e3f264dcff948225c8737834dd4f9ec286dbc06a1a7c13858ea382d9379f4303bcc0916 - languageName: node - linkType: hard - -"quick-format-unescaped@npm:^4.0.3": - version: 4.0.4 - resolution: "quick-format-unescaped@npm:4.0.4" - checksum: 7bc32b99354a1aa46c089d2a82b63489961002bb1d654cee3e6d2d8778197b68c2d854fd23d8422436ee1fdfd0abaddc4d4da120afe700ade68bd357815b26fd - languageName: node - linkType: hard - -"quick-lru@npm:^4.0.1": - version: 4.0.1 - resolution: "quick-lru@npm:4.0.1" - checksum: bea46e1abfaa07023e047d3cf1716a06172c4947886c053ede5c50321893711577cb6119360f810cc3ffcd70c4d7db4069c3cee876b358ceff8596e062bd1154 - languageName: node - linkType: hard - -"quick-lru@npm:^5.1.1": - version: 5.1.1 - resolution: "quick-lru@npm:5.1.1" - checksum: a516faa25574be7947969883e6068dbe4aa19e8ef8e8e0fd96cddd6d36485e9106d85c0041a27153286b0770b381328f4072aa40d3b18a19f5f7d2b78b94b5ed - languageName: node - linkType: hard - -"quick-temp@npm:^0.1.8": - version: 0.1.8 - resolution: "quick-temp@npm:0.1.8" - dependencies: - mktemp: ~0.4.0 - rimraf: ^2.5.4 - underscore.string: ~3.3.4 - checksum: b9a60934301afd5cb67a10946f8124e63ccb0cd305d35e2d8e5fe7be80df4d29b8414605ee1e55a714c3b87468856fa92526737569fc5e4a11e056ee192b72c8 - languageName: node - linkType: hard - -"quote-unquote@npm:^1.0.0": - version: 1.0.0 - resolution: "quote-unquote@npm:1.0.0" - checksum: 955a2ead534f5b6a3f8d4dc5a4b95ac6468213d3fb11f8c1592a0a56345c45a3d14d5ca04d3de2bc9891493fcac38c03dfa91c48a6159aef50124e9c5afcea49 - languageName: node - linkType: hard - -"r-json@npm:^1.2.10": - version: 1.3.0 - resolution: "r-json@npm:1.3.0" - dependencies: - w-json: 1.3.10 - checksum: 9a2aa9b92a2f4b7932c7eb45175d9c7ff078e322eecaf1ca2c9cdda346ea68e73062004c1b3631a9127e84eedf982fc816110f0c7a1d07c6b2b3344f6d621791 - languageName: node - linkType: hard - -"radix3@npm:^1.1.0": - version: 1.1.0 - resolution: "radix3@npm:1.1.0" - checksum: e5e6ed8fcf68be4d124bca4f7da7ba0fc7c5b6f9e98bc3f4424459c45d50f1f92506c5f7f8421b5cfee5823c524a4a2cef416053e88845813ce9fc9c7086729a - languageName: node - linkType: hard - -"raf@npm:^3.4.1": - version: 3.4.1 - resolution: "raf@npm:3.4.1" - dependencies: - performance-now: ^2.1.0 - checksum: 50ba284e481c8185dbcf45fc4618ba3aec580bb50c9121385d5698cb6012fe516d2015b1df6dd407a7b7c58d44be8086108236affbce1861edd6b44637c8cd52 - languageName: node - linkType: hard - -"randombytes@npm:^2.0.0, randombytes@npm:^2.0.1, randombytes@npm:^2.0.5, randombytes@npm:^2.1.0": - version: 2.1.0 - resolution: "randombytes@npm:2.1.0" - dependencies: - safe-buffer: ^5.1.0 - checksum: d779499376bd4cbb435ef3ab9a957006c8682f343f14089ed5f27764e4645114196e75b7f6abf1cbd84fd247c0cb0651698444df8c9bf30e62120fbbc52269d6 - languageName: node - linkType: hard - -"randomfill@npm:^1.0.3": - version: 1.0.4 - resolution: "randomfill@npm:1.0.4" - dependencies: - randombytes: ^2.0.5 - safe-buffer: ^5.1.0 - checksum: 33734bb578a868d29ee1b8555e21a36711db084065d94e019a6d03caa67debef8d6a1bfd06a2b597e32901ddc761ab483a85393f0d9a75838f1912461d4dbfc7 - languageName: node - linkType: hard - -"range-parser@npm:1.2.0": - version: 1.2.0 - resolution: "range-parser@npm:1.2.0" - checksum: bdf397f43fedc15c559d3be69c01dedf38444ca7a1610f5bf5955e3f3da6057a892f34691e7ebdd8c7e1698ce18ef6c4d4811f70e658dda3ff230ef741f8423a - languageName: node - linkType: hard - -"range-parser@npm:^1.2.1, range-parser@npm:~1.2.1": - version: 1.2.1 - resolution: "range-parser@npm:1.2.1" - checksum: 0a268d4fea508661cf5743dfe3d5f47ce214fd6b7dec1de0da4d669dd4ef3d2144468ebe4179049eff253d9d27e719c88dae55be64f954e80135a0cada804ec9 - languageName: node - linkType: hard - -"raw-body@npm:2.5.1, raw-body@npm:^2.4.1": - version: 2.5.1 - resolution: "raw-body@npm:2.5.1" - dependencies: - bytes: 3.1.2 - http-errors: 2.0.0 - iconv-lite: 0.4.24 - unpipe: 1.0.0 - checksum: 5362adff1575d691bb3f75998803a0ffed8c64eabeaa06e54b4ada25a0cd1b2ae7f4f5ec46565d1bec337e08b5ac90c76eaa0758de6f72a633f025d754dec29e - languageName: node - linkType: hard - -"rc-slider@npm:10.4.0": - version: 10.4.0 - resolution: "rc-slider@npm:10.4.0" - dependencies: - "@babel/runtime": ^7.10.1 - classnames: ^2.2.5 - rc-util: ^5.27.0 - peerDependencies: - react: ">=16.9.0" - react-dom: ">=16.9.0" - checksum: 713cfcf0bc1f35b70db3f233ed76f84e3c43c39700631db4932aff760289c8174076ecd5ec8a6184d056beda28b6b2e08b7add98edebf1ba1025a392ebff9280 - languageName: node - linkType: hard - -"rc-util@npm:^5.27.0": - version: 5.38.1 - resolution: "rc-util@npm:5.38.1" - dependencies: - "@babel/runtime": ^7.18.3 - react-is: ^18.2.0 - peerDependencies: - react: ">=16.9.0" - react-dom: ">=16.9.0" - checksum: 40d0411fb5d6b0a187e718ff16c18f3d68eae3d7e4def43a9a9b2690b89cfce639077a69d683aa01302f8132394dd633baf76b07e5a3b8438fb706b1abb31937 - languageName: node - linkType: hard - -"rc@npm:1.2.8, rc@npm:^1.0.1, rc@npm:^1.1.6, rc@npm:^1.2.7, rc@npm:^1.2.8, rc@npm:~1.2.7": - version: 1.2.8 - resolution: "rc@npm:1.2.8" - dependencies: - deep-extend: ^0.6.0 - ini: ~1.3.0 - minimist: ^1.2.0 - strip-json-comments: ~2.0.1 - bin: - rc: ./cli.js - checksum: 2e26e052f8be2abd64e6d1dabfbd7be03f80ec18ccbc49562d31f617d0015fbdbcf0f9eed30346ea6ab789e0fdfe4337f033f8016efdbee0df5354751842080e - languageName: node - linkType: hard - -"react-app-polyfill@npm:^3.0.0": - version: 3.0.0 - resolution: "react-app-polyfill@npm:3.0.0" - dependencies: - core-js: ^3.19.2 - object-assign: ^4.1.1 - promise: ^8.1.0 - raf: ^3.4.1 - regenerator-runtime: ^0.13.9 - whatwg-fetch: ^3.6.2 - checksum: 1bb031080af15397d6eb9c69a0c2e93799991f7197a086e4409ba719398f1256b542a3d6c9a34673d516c684eef3e8226c99b335982593851f58f65f6e43571b - languageName: node - linkType: hard - -"react-clientside-effect@npm:^1.2.6": - version: 1.2.6 - resolution: "react-clientside-effect@npm:1.2.6" - dependencies: - "@babel/runtime": ^7.12.13 - peerDependencies: - react: ^15.3.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 - checksum: 7db6110027a51458b1a46109d2b63dd822825f483c71afef7c0c0a671f3b1aa155049dbd8651c9d536ffac83601f8823b7c3f8916b4f4ee5c3cb7647a85cce4e - languageName: node - linkType: hard - -"react-confetti@npm:^6.1.0": - version: 6.1.0 - resolution: "react-confetti@npm:6.1.0" - dependencies: - tween-functions: ^1.2.0 - peerDependencies: - react: ^16.3.0 || ^17.0.1 || ^18.0.0 - checksum: 24b6975df144d2bf09d8e1c95ddc49e547775f911efaa8d96b49e522659d931539e9d9e48cc0db3a01f3a671be7e3824e6e728db85096f5527db5d1c69ebb153 - languageName: node - linkType: hard - -"react-dev-utils@npm:^12.0.1": - version: 12.0.1 - resolution: "react-dev-utils@npm:12.0.1" - dependencies: - "@babel/code-frame": ^7.16.0 - address: ^1.1.2 - browserslist: ^4.18.1 - chalk: ^4.1.2 - cross-spawn: ^7.0.3 - detect-port-alt: ^1.1.6 - escape-string-regexp: ^4.0.0 - filesize: ^8.0.6 - find-up: ^5.0.0 - fork-ts-checker-webpack-plugin: ^6.5.0 - global-modules: ^2.0.0 - globby: ^11.0.4 - gzip-size: ^6.0.0 - immer: ^9.0.7 - is-root: ^2.1.0 - loader-utils: ^3.2.0 - open: ^8.4.0 - pkg-up: ^3.1.0 - prompts: ^2.4.2 - react-error-overlay: ^6.0.11 - recursive-readdir: ^2.2.2 - shell-quote: ^1.7.3 - strip-ansi: ^6.0.1 - text-table: ^0.2.0 - checksum: 2c6917e47f03d9595044770b0f883a61c6b660fcaa97b8ba459a1d57c9cca9aa374cd51296b22d461ff5e432105dbe6f04732dab128e52729c79239e1c23ab56 - languageName: node - linkType: hard - -"react-devtools-core@npm:4.28.0": - version: 4.28.0 - resolution: "react-devtools-core@npm:4.28.0" - dependencies: - shell-quote: ^1.6.1 - ws: ^7 - checksum: a5be506a35ca027ba283f0efa7c0c9a818bd8b9b38b77081960423cc038b9f3ab3014970ed9cdd451b72a949bc279399daedb65931e8a44def0fb49c0a69f0a7 - languageName: node - linkType: hard - -"react-devtools-core@npm:^5.3.1": - version: 5.3.2 - resolution: "react-devtools-core@npm:5.3.2" - dependencies: - shell-quote: ^1.6.1 - ws: ^7 - checksum: 8ae15b34f69ea16a0c6b9966c195aecf61981099409ddfe1950e1686cfae6717f93dc63285bd8f1094cc783de81c3d1e73285a82e774d2b289a17ede93d6589b - languageName: node - linkType: hard - -"react-devtools@npm:4.28.0": - version: 4.28.0 - resolution: "react-devtools@npm:4.28.0" - dependencies: - cross-spawn: ^5.0.1 - electron: ^23.1.2 - ip: ^1.1.4 - minimist: ^1.2.3 - react-devtools-core: 4.28.0 - update-notifier: ^2.1.0 - bin: - react-devtools: bin.js - checksum: aa5748e7f7d359bb754b4ee38505ce1855e8bb8217532b905d80d7ee107e2661a861a9c862b27b8a13cc495cb930951ab9cdf7da625c13e608667c345c6aa46d - languageName: node - linkType: hard - -"react-docgen-typescript@npm:^2.2.2": - version: 2.2.2 - resolution: "react-docgen-typescript@npm:2.2.2" - peerDependencies: - typescript: ">= 4.3.x" - checksum: a9826459ea44e818f21402728dd47f5cae60bd936574cefd4f90ad101ff3eebacd67b6e017b793309734ce62c037aa3072dbc855d2b0e29bad1a38cbf5bac115 - languageName: node - linkType: hard - -"react-docgen@npm:^7.0.0": - version: 7.1.0 - resolution: "react-docgen@npm:7.1.0" - dependencies: - "@babel/core": ^7.18.9 - "@babel/traverse": ^7.18.9 - "@babel/types": ^7.18.9 - "@types/babel__core": ^7.18.0 - "@types/babel__traverse": ^7.18.0 - "@types/doctrine": ^0.0.9 - "@types/resolve": ^1.20.2 - doctrine: ^3.0.0 - resolve: ^1.22.1 - strip-indent: ^4.0.0 - checksum: dfdec82a4d695e8b1e31b77eef4ceac0f60e00f13725f0a18886d2737595531e58a54f4dde5db4657276d194597bd5e67a1792ca52eb42a59b67943105f24893 - languageName: node - linkType: hard - -"react-dom@npm:18.3.1": - version: 18.3.1 - resolution: "react-dom@npm:18.3.1" - dependencies: - loose-envify: ^1.1.0 - scheduler: ^0.23.2 - peerDependencies: - react: ^18.3.1 - checksum: 298954ecd8f78288dcaece05e88b570014d8f6dce5db6f66e6ee91448debeb59dcd31561dddb354eee47e6c1bb234669459060deb238ed0213497146e555a0b9 - languageName: node - linkType: hard - -"react-error-boundary@npm:^3.1.0": - version: 3.1.4 - resolution: "react-error-boundary@npm:3.1.4" - dependencies: - "@babel/runtime": ^7.12.5 - peerDependencies: - react: ">=16.13.1" - checksum: f36270a5d775a25c8920f854c0d91649ceea417b15b5bc51e270a959b0476647bb79abb4da3be7dd9a4597b029214e8fe43ea914a7f16fa7543c91f784977f1b - languageName: node - linkType: hard - -"react-error-overlay@npm:^6.0.11": - version: 6.0.11 - resolution: "react-error-overlay@npm:6.0.11" - checksum: ce7b44c38fadba9cedd7c095cf39192e632daeccf1d0747292ed524f17dcb056d16bc197ddee5723f9dd888f0b9b19c3b486c430319e30504289b9296f2d2c42 - languageName: node - linkType: hard - -"react-fast-compare@npm:^3.0.1, react-fast-compare@npm:^3.2.2": - version: 3.2.2 - resolution: "react-fast-compare@npm:3.2.2" - checksum: 2071415b4f76a3e6b55c84611c4d24dcb12ffc85811a2840b5a3f1ff2d1a99be1020d9437ee7c6e024c9f4cbb84ceb35e48cf84f28fcb00265ad2dfdd3947704 - languageName: node - linkType: hard - -"react-feather@npm:2.0.10": - version: 2.0.10 - resolution: "react-feather@npm:2.0.10" - dependencies: - prop-types: ^15.7.2 - peerDependencies: - react: ">=16.8.6" - checksum: 75acb29ee4352cd4e2a509ca81e15f3b553439c069dac19035503d53c0fe2b6133d65f5e32ccdb61ed1514cfda1b615e34de6a9640973a7bda283b7eb98850a1 - languageName: node - linkType: hard - -"react-focus-lock@npm:^2.3.1": - version: 2.9.6 - resolution: "react-focus-lock@npm:2.9.6" - dependencies: - "@babel/runtime": ^7.0.0 - focus-lock: ^1.0.0 - prop-types: ^15.6.2 - react-clientside-effect: ^1.2.6 - use-callback-ref: ^1.3.0 - use-sidecar: ^1.1.2 - peerDependencies: - "@types/react": ^16.8.0 || ^17.0.0 || ^18.0.0 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - "@types/react": - optional: true - checksum: 3ee2b32dfe479839548baf097d53ddab0b9a8df71cd51763edc9dd900eb85ac98e0255130a9152de9a424a038bae6e1782fca6fde0d89ae1f37c2ca802d94351 - languageName: node - linkType: hard - -"react-freeze@npm:1.0.3, react-freeze@npm:^1.0.0, react-freeze@npm:^1.0.3": - version: 1.0.3 - resolution: "react-freeze@npm:1.0.3" - peerDependencies: - react: ">=17.0.0" - checksum: 4258eabdbbf74aaebc38ad1fd7cfdc1984d2a844a2247b39a341c55c1beb02d5e855e6473ec5683205a52b2251d0f7dffa07cd8100f402dd2698af88b932d946 - languageName: node - linkType: hard - -"react-helmet-async@npm:2.0.4": - version: 2.0.4 - resolution: "react-helmet-async@npm:2.0.4" - dependencies: - invariant: ^2.2.4 - react-fast-compare: ^3.2.2 - shallowequal: ^1.1.0 - peerDependencies: - react: ^16.6.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.6.0 || ^17.0.0 || ^18.0.0 - checksum: 1bd16e6be6d15cf3d4b4c0853d1e122941a05d3fb2bad1fb1c5037069c5f142fcab063c342b95c58a998a81f093bdf1bd1bb00852a5a3a84d49e48790d5142bb - languageName: node - linkType: hard - -"react-i18next@npm:14.1.0": - version: 14.1.0 - resolution: "react-i18next@npm:14.1.0" - dependencies: - "@babel/runtime": ^7.23.9 - html-parse-stringify: ^3.0.1 - peerDependencies: - i18next: ">= 23.2.3" - react: ">= 16.8.0" - peerDependenciesMeta: - react-dom: - optional: true - react-native: - optional: true - checksum: 96fbc4b0919b9f0c639f9f3eb35eecac528174aa97e3b1af469cfdbff4b34e40ae8969c26c0b737691a5fa9b56bb13093524cfca79b93cbd58f1319530da31b2 - languageName: node - linkType: hard - -"react-infinite-scroll-component@npm:6.1.0": - version: 6.1.0 - resolution: "react-infinite-scroll-component@npm:6.1.0" - dependencies: - throttle-debounce: ^2.1.0 - peerDependencies: - react: ">=16.0.0" - checksum: 3708398934366df907dbad215247ebc1033221957ce7e32289ea31750cce70aa16513e2d03743e06c8b868ac7c542d12d5dbb6c830fd408433a4762f3cb5ecfb - languageName: node - linkType: hard - -"react-is@npm:18.3.1, react-is@npm:^16.12.0 || ^17.0.0 || ^18.0.0, react-is@npm:^18.0.0, react-is@npm:^18.2.0, react-is@npm:^18.3.1": - version: 18.3.1 - resolution: "react-is@npm:18.3.1" - checksum: e20fe84c86ff172fc8d898251b7cc2c43645d108bf96d0b8edf39b98f9a2cae97b40520ee7ed8ee0085ccc94736c4886294456033304151c3f94978cec03df21 - languageName: node - linkType: hard - -"react-is@npm:^16.13.0, react-is@npm:^16.13.1, react-is@npm:^16.7.0, react-is@npm:^16.8.6": - version: 16.13.1 - resolution: "react-is@npm:16.13.1" - checksum: f7a19ac3496de32ca9ae12aa030f00f14a3d45374f1ceca0af707c831b2a6098ef0d6bdae51bd437b0a306d7f01d4677fcc8de7c0d331eb47ad0f46130e53c5f - languageName: node - linkType: hard - -"react-is@npm:^17.0.1": - version: 17.0.2 - resolution: "react-is@npm:17.0.2" - checksum: 9d6d111d8990dc98bc5402c1266a808b0459b5d54830bbea24c12d908b536df7883f268a7868cfaedde3dd9d4e0d574db456f84d2e6df9c4526f99bb4b5344d8 - languageName: node - linkType: hard - -"react-keyed-flatten-children@npm:^1.3.0": - version: 1.3.0 - resolution: "react-keyed-flatten-children@npm:1.3.0" - dependencies: - react-is: ^16.8.6 - peerDependencies: - react: ">=15.0.0" - checksum: 3bb042bb7cd48909491a5f92b8e7b2fb0417d69ad24bf04dbe1ed7a308cc7dfe6e3c9b5550e7b9016ee6bef61829b92e7f3a355ed1b867affd251bd518bcdd90 - languageName: node - linkType: hard - -"react-markdown@npm:4.3.1": - version: 4.3.1 - resolution: "react-markdown@npm:4.3.1" - dependencies: - html-to-react: ^1.3.4 - mdast-add-list-metadata: 1.0.1 - prop-types: ^15.7.2 - react-is: ^16.8.6 - remark-parse: ^5.0.0 - unified: ^6.1.5 - unist-util-visit: ^1.3.0 - xtend: ^4.0.1 - peerDependencies: - react: ^15.0.0 || ^16.0.0 - checksum: 0e500c3ca24162ba693f73f4ce928d8a7cf038a8f806307f7fa6c095209625cf6f1434f07fe1bc6e9a43d376f70eda7ee7f697887dcf87f00832b762e827f7c8 - languageName: node - linkType: hard - -"react-native-appsflyer@npm:6.13.1": - version: 6.13.1 - resolution: "react-native-appsflyer@npm:6.13.1" - checksum: dc9730f5c77915ab5070fb684801e34cbc314ac307d7654aac2171c64e4a7c85dc7cc571e2377754909e88c71eff4dde16029968cc88aebdb9ba290632911391 - languageName: node - linkType: hard - -"react-native-asset@npm:2.1.1": - version: 2.1.1 - resolution: "react-native-asset@npm:2.1.1" - dependencies: - fs-extra: ^7.0.1 - lodash: 4.17.21 - npmlog: ^4.1.2 - plist: ^3.0.1 - sha1-file: ^1.0.4 - xcode: ^2.0.0 - peerDependencies: - react-native: ">=0.60.0" - bin: - react-native-asset: lib/cli.js - checksum: 6c7dcc0b359b14e46de9872bceadfc1fdd68174787a1243ea53285577dcba7a028fd19a89be3e1ecbbc30817ec38c2ebb822d4d57d096d724c56e0ef9c61d587 - languageName: node - linkType: hard - -"react-native-bootsplash@npm:6.3.1": - version: 6.3.1 - resolution: "react-native-bootsplash@npm:6.3.1" - dependencies: - "@expo/config-plugins": ^8.0.4 - "@react-native-community/cli-config-android": ^15.0.0 - "@react-native-community/cli-config-apple": ^15.0.0 - "@react-native-community/cli-tools": ^15.0.0 - commander: ^12.1.0 - detect-indent: ^6.1.0 - fs-extra: ^11.2.0 - node-html-parser: ^6.1.13 - picocolors: ^1.1.1 - prettier: ^3.3.3 - react-native-is-edge-to-edge: ^1.1.6 - sharp: ^0.32.6 - ts-dedent: ^2.2.0 - xml-formatter: ^3.6.3 - peerDependencies: - react: ">=18.1.0" - react-native: ">=0.70.0" - bin: - react-native-bootsplash: cli.js - checksum: 0104d8cdb80e6dc24d7ce6b2a010f8e4433cd6de84f6e3e8c2410c13df449094827a218d3733c933019a2cbed3eb53110b538408e918a04ae3bf51288d3e23bc - languageName: node - linkType: hard - -"react-native-clean-project@npm:4.0.1": - version: 4.0.1 - resolution: "react-native-clean-project@npm:4.0.1" - bin: - react-native-clean-project: source/index.js - checksum: 97fd966fc158ed406cdeabb65855fe137601123b9c894a1f6c093bbe2d5a2bf2c9faf56a4c3d1e87402f919e5e7d1a297e6763874c4f7176c4194c5682450fc8 - languageName: node - linkType: hard - -"react-native-context-menu-view@npm:1.15.0": - version: 1.15.0 - resolution: "react-native-context-menu-view@npm:1.15.0" - peerDependencies: - react: ^16.8.1 || ^17.0.0 || ^18.0.0 - react-native: ">=0.60.0-rc.0 <1.0.x" - checksum: eac38c41a83a9d37a5658f7d81a77c2b4433c92c97703c760a9fbf1731ad6e07acd19f1b8173023cada9305a6f9e315850d37ad2e8bc9c3447e0694517ff36bb - languageName: node - linkType: hard - -"react-native-context-menu-view@patch:react-native-context-menu-view@npm%3A1.15.0#./.yarn/patches/react-native-context-menu-view-npm-1.15.0-c8a9d10d8c.patch::locator=universe%40workspace%3A.": - version: 1.15.0 - resolution: "react-native-context-menu-view@patch:react-native-context-menu-view@npm%3A1.15.0#./.yarn/patches/react-native-context-menu-view-npm-1.15.0-c8a9d10d8c.patch::version=1.15.0&hash=86e788&locator=universe%40workspace%3A." - peerDependencies: - react: ^16.8.1 || ^17.0.0 || ^18.0.0 - react-native: ">=0.60.0-rc.0 <1.0.x" - checksum: f41bd5ea81fe5b15f7f30f0975da7643dc795c5b9ecd5a7b6f8ca5b3ffcda5c3d112f146ada98a1cf7e475318b7bfc616a7389380e7feb6f51fbd8189b6ec9ce - languageName: node - linkType: hard - -"react-native-device-info@npm:10.0.2": - version: 10.0.2 - resolution: "react-native-device-info@npm:10.0.2" - peerDependencies: - react-native: "*" - checksum: 751274e5e2cec4f47f70a8b8ca7f3d7ce465a6dd022a5f935fd1a3fd81e4cb1a8b1072ee02d26047ba57da887b8dba0ea67888b238db4de6e0dbfa68fc079f13 - languageName: node - linkType: hard - -"react-native-dotenv@npm:3.2.0": - version: 3.2.0 - resolution: "react-native-dotenv@npm:3.2.0" - dependencies: - dotenv: ^10.0.0 - checksum: 31012bd58d014fb9bbe0253441581bb9fd955f0ebe5996aca9a6e342b6142ccdf6de58533887610017c7f3bd5d17d90ff6159be1862665a986f8ce3e85db9b5c - languageName: node - linkType: hard - -"react-native-fast-image@npm:8.6.3": - version: 8.6.3 - resolution: "react-native-fast-image@npm:8.6.3" - peerDependencies: - react: ^17 || ^18 - react-native: ">=0.60.0" - checksum: 29289cb6b2eae0983c8922b22e2d9de3be07322bb7991c5def19f95eadefaedb0e308ff0b38cc1d0444e8bd4fe94a7621a99a2d3d9298100bcb60b3144677234 - languageName: node - linkType: hard - -"react-native-fast-image@patch:react-native-fast-image@npm%3A8.6.3#./.yarn/patches/react-native-fast-image-npm-8.6.3-03ee2d23c0.patch::locator=universe%40workspace%3A.": - version: 8.6.3 - resolution: "react-native-fast-image@patch:react-native-fast-image@npm%3A8.6.3#./.yarn/patches/react-native-fast-image-npm-8.6.3-03ee2d23c0.patch::version=8.6.3&hash=47a2df&locator=universe%40workspace%3A." - peerDependencies: - react: ^17 || ^18 - react-native: ">=0.60.0" - checksum: 90813199e49049e1eed1436ca6c928d4c6e8408f70625ce3caed25846cd7d1b6f07614c8957b6a9f7f59f2aabfca23087a3fd955e2213102a8b92233d544a454 - languageName: node - linkType: hard - -"react-native-fit-image@npm:^1.5.5": - version: 1.5.5 - resolution: "react-native-fit-image@npm:1.5.5" - dependencies: - prop-types: ^15.5.10 - checksum: 2f3ce06b43191efe3a4bd0698a4117342d821455c96433e9561d50f156ee446d2c449bf9e0908f9a8b7bbb8f95c02478d4fca8d8d103f38b6ce3b8b75557af15 - languageName: node - linkType: hard - -"react-native-gesture-handler@npm:2.21.2": - version: 2.21.2 - resolution: "react-native-gesture-handler@npm:2.21.2" - dependencies: - "@egjs/hammerjs": ^2.0.17 - hoist-non-react-statics: ^3.3.0 - invariant: ^2.2.4 - prop-types: ^15.7.2 - peerDependencies: - react: "*" - react-native: "*" - checksum: 0a42cedb8860a326b465085d0f7622ba03f038b0f0bdd1b1fe5703e58d62cb08bfb82a686c069a1a1410705c2ae0d82971b0449d83796fdd6d071131cf88e68b - languageName: node - linkType: hard - -"react-native-get-random-values@npm:1.11.0": - version: 1.11.0 - resolution: "react-native-get-random-values@npm:1.11.0" - dependencies: - fast-base64-decode: ^1.0.0 - peerDependencies: - react-native: ">=0.56" - checksum: 07729f70a007f7a3b8f98ebf687c1298ba288b87dd71d8ba385be6b5a377718b27b97547bbe1db6b225b83ee109dfce0b01721e6ed535d53892f3ac81e6bf975 - languageName: node - linkType: hard - -"react-native-image-colors@npm:1.5.2": - version: 1.5.2 - resolution: "react-native-image-colors@npm:1.5.2" - dependencies: - node-vibrant: 3.1.6 - peerDependencies: - react: "*" - react-native: "*" - checksum: b4ebd9d8ce093f7caf2b4865c7f154e226d161e17c1f073fed322c6a16a7ccef2b7cc915069f8be4476cbb5cd2a6659359f12974c78f881c2d5cb790b87b5281 - languageName: node - linkType: hard - -"react-native-image-picker@npm:7.1.0": - version: 7.1.0 - resolution: "react-native-image-picker@npm:7.1.0" - peerDependencies: - react: "*" - react-native: "*" - checksum: 7f5c16dbcde719367e8fea7e05dd0ca8cb4cb4d163ce3fd093440fde69ff536dfb12f8b14a82b3d306785b7a5609e99042a981050631aa91cffb0a410c056ef9 - languageName: node - linkType: hard - -"react-native-is-edge-to-edge@npm:^1.1.6": - version: 1.1.6 - resolution: "react-native-is-edge-to-edge@npm:1.1.6" - peerDependencies: - react: ">=18.2.0" - react-native: ">=0.73.0" - checksum: 4e07c1e34c01c8d50fd7c1d0460db06f6f0515197405230386a8ffb950cb724b10743af032310d1384df0a90059bfb8992ba2d93344ce86315315f0493feccc2 - languageName: node - linkType: hard - -"react-native-localize@npm:2.2.6": - version: 2.2.6 - resolution: "react-native-localize@npm:2.2.6" - peerDependencies: - react: ">=16.8.6" - react-native: ">=0.60.0" - react-native-macos: ">=0.64.0" - react-native-windows: ">=0.62.0" - peerDependenciesMeta: - react-native-macos: - optional: true - react-native-windows: - optional: true - checksum: aa03c37a254e4bec71dcd8b9844ece091e9b14ff38b6e1db6307674d33f62477c8d42b5a022da8ec892586004985846e08b79822f05989382ef07ba696438917 - languageName: node - linkType: hard - -"react-native-markdown-display@npm:7.0.0-alpha.2": - version: 7.0.0-alpha.2 - resolution: "react-native-markdown-display@npm:7.0.0-alpha.2" - dependencies: - css-to-react-native: ^3.0.0 - markdown-it: ^10.0.0 - prop-types: ^15.7.2 - react-native-fit-image: ^1.5.5 - peerDependencies: - react: ^16.2.0 - react-native: ">=0.50.4" - checksum: 9f8f7a9ae165e6964719dc16a79d254e1ce7febc9938ebf035f1194f3cda3154eb6c7efd622de1b92b9c01704aad88c0501e64c00a0a2439331c44a039929db4 - languageName: node - linkType: hard - -"react-native-mmkv@npm:2.10.1": - version: 2.10.1 - resolution: "react-native-mmkv@npm:2.10.1" - peerDependencies: - react: "*" - react-native: ">=0.71.0" - checksum: 2db42a667acd104047ddf307e852ffd9d9c6302454364fcc4cd35d8510d6f500bcd3562e14d95ae7fd520eac1cd3cc8a239c539a7339b70a4e6fd2d3f70daee7 - languageName: node - linkType: hard - -"react-native-modal-datetime-picker@npm:^14.0.0": - version: 14.0.1 - resolution: "react-native-modal-datetime-picker@npm:14.0.1" - dependencies: - prop-types: ^15.7.2 - peerDependencies: - "@react-native-community/datetimepicker": ">=3.0.0" - react-native: ">=0.65.0" - checksum: 15df05f76bea0303a0130fee435ec6e42def6e7cb5d113f45b16edba92ddf482264dc3d34b23b31ec37a64ff7a5330e58cd553987cb1fdf25b6163e281d1e3da - languageName: node - linkType: hard - -"react-native-modal-selector@npm:^2.1.1": - version: 2.1.2 - resolution: "react-native-modal-selector@npm:2.1.2" - dependencies: - prop-types: ^15.5.10 - checksum: c7b00ebceb6fe15e025ef1655483bc98fdb150453fb27e71d17a282a87317c5b1e242a1108f5247fac99594e6778470513d19c21e02eb2ce81f80688dd616419 - languageName: node - linkType: hard - -"react-native-monorepo-tools@npm:1.2.1": - version: 1.2.1 - resolution: "react-native-monorepo-tools@npm:1.2.1" - dependencies: - find-root: ^1.1.0 - glob: ^7.1.7 - checksum: c4820a8550b328aff8df428055468ba94c84dceaa351cbab0c4722e531392f9fcf4258de0617c3ba08184ac273cd4c99be2a30ef29ce8f178ca11513dd2fdc44 - languageName: node - linkType: hard - -"react-native-onesignal@npm:4.5.2": - version: 4.5.2 - resolution: "react-native-onesignal@npm:4.5.2" - dependencies: - invariant: ^2.2.2 - checksum: 0630a672b90f70aa0f5d6162e9f16d94f14cae0b5a8b629951920fe97cdb2644d97746b55356ab0c40db4b33662efc3239e1edc448bcc0a6677284931f2dea4a - languageName: node - linkType: hard - -"react-native-pager-view@npm:6.5.1": - version: 6.5.1 - resolution: "react-native-pager-view@npm:6.5.1" - peerDependencies: - react: "*" - react-native: "*" - checksum: 9c8a9bb5f69d0dbc4dcf4826b2d319c0fd926fa60dd7c0dddc765aeb775c070d516b189fab575773f902c924ecb6db6ae8fdb67d6e879890ac82e094a4d2b930 - languageName: node - linkType: hard - -"react-native-permissions@npm:4.1.5": - version: 4.1.5 - resolution: "react-native-permissions@npm:4.1.5" - peerDependencies: - react: ">=18.1.0" - react-native: ">=0.70.0" - react-native-windows: ">=0.70.0" - peerDependenciesMeta: - react-native-windows: - optional: true - checksum: dc4b366a0f561a47f032c027eb703a2be45e801788b915ed583e38f617eea23656eb63a77b17fb3a663fe3199b2ec25788f799e751421634e35a64f5258feed9 - languageName: node - linkType: hard - -"react-native-reanimated@npm:3.16.7": - version: 3.16.7 - resolution: "react-native-reanimated@npm:3.16.7" - dependencies: - "@babel/plugin-transform-arrow-functions": ^7.0.0-0 - "@babel/plugin-transform-class-properties": ^7.0.0-0 - "@babel/plugin-transform-classes": ^7.0.0-0 - "@babel/plugin-transform-nullish-coalescing-operator": ^7.0.0-0 - "@babel/plugin-transform-optional-chaining": ^7.0.0-0 - "@babel/plugin-transform-shorthand-properties": ^7.0.0-0 - "@babel/plugin-transform-template-literals": ^7.0.0-0 - "@babel/plugin-transform-unicode-regex": ^7.0.0-0 - "@babel/preset-typescript": ^7.16.7 - convert-source-map: ^2.0.0 - invariant: ^2.2.4 - peerDependencies: - "@babel/core": ^7.0.0-0 - react: "*" - react-native: "*" - checksum: 108095709cd7a3effc5b5d276d94e161b399bd2d06e32140834168a0051545401bb09228071447e5925571da3f86f335d2a82c76751cdae07f66faf50b25c97f - languageName: node - linkType: hard - -"react-native-reanimated@patch:react-native-reanimated@npm%3A3.16.7#./.yarn/patches/react-native-reanimated-npm-3.16.7-1e7cd6d376.patch::locator=universe%40workspace%3A.": - version: 3.16.7 - resolution: "react-native-reanimated@patch:react-native-reanimated@npm%3A3.16.7#./.yarn/patches/react-native-reanimated-npm-3.16.7-1e7cd6d376.patch::version=3.16.7&hash=621c7a&locator=universe%40workspace%3A." - dependencies: - "@babel/plugin-transform-arrow-functions": ^7.0.0-0 - "@babel/plugin-transform-class-properties": ^7.0.0-0 - "@babel/plugin-transform-classes": ^7.0.0-0 - "@babel/plugin-transform-nullish-coalescing-operator": ^7.0.0-0 - "@babel/plugin-transform-optional-chaining": ^7.0.0-0 - "@babel/plugin-transform-shorthand-properties": ^7.0.0-0 - "@babel/plugin-transform-template-literals": ^7.0.0-0 - "@babel/plugin-transform-unicode-regex": ^7.0.0-0 - "@babel/preset-typescript": ^7.16.7 - convert-source-map: ^2.0.0 - invariant: ^2.2.4 - peerDependencies: - "@babel/core": ^7.0.0-0 - react: "*" - react-native: "*" - checksum: 637d8cc7c484f5cc2e686e1ac834fe025915a7fd1896264bd850c5d7acfa944db060f5fd7dbad339055cb5fa52cb175f7d0487e6eb1ca59c7145bf7e0611ab2d - languageName: node - linkType: hard - -"react-native-redash@npm:^18.1.3": - version: 18.1.3 - resolution: "react-native-redash@npm:18.1.3" - dependencies: - abs-svg-path: ^0.1.1 - normalize-svg-path: ^1.0.1 - parse-svg-path: ^0.1.2 - peerDependencies: - react: "*" - react-native: "*" - react-native-gesture-handler: "*" - react-native-reanimated: ">=2.0.0" - checksum: 8ef94db8d05b29c76ff05e095233a94dcb8d9cf1f1ae569a27b55c3f83c0224a8fd2d36228c9a36eb74c6ed32d0e1d5019ec7a3154dc0ee5ab8433fe3bbbde2a - languageName: node - linkType: hard - -"react-native-restart@npm:0.0.27": - version: 0.0.27 - resolution: "react-native-restart@npm:0.0.27" - peerDependencies: - react: "*" - react-native: "*" - checksum: 49cfaa954f12c37c6e34988cb47bf0626f4a2cd68ecc15be3d8d6acc7a5ca3032729545ddb66b6d3a5c30dfe626e46010e3e2148e709487354907997fde64255 - languageName: node - linkType: hard - -"react-native-safe-area-context@npm:4.12.0": - version: 4.12.0 - resolution: "react-native-safe-area-context@npm:4.12.0" - peerDependencies: - react: "*" - react-native: "*" - checksum: 04a751afed448b31dc401f0e8ecf9cf3edc4fe77b5c16cb7bc2a70381c3a2ffa54f42a313a46ad7deec0aff74a3f5650cf49db0264ba4a6c4f6a1d69ecf489fd - languageName: node - linkType: hard - -"react-native-screens@npm:4.1.0": - version: 4.1.0 - resolution: "react-native-screens@npm:4.1.0" - dependencies: - react-freeze: ^1.0.0 - warn-once: ^0.1.0 - peerDependencies: - react: "*" - react-native: "*" - checksum: 70a1c522b000758ca066b30062b7902c3df15ee5d1bccc4e59901d207e278cb6852f7c883a5df5c93f1415fd4089de2d4261e3f3a7cd5150c1aad8674193c728 - languageName: node - linkType: hard - -"react-native-svg-transformer@npm:1.3.0": - version: 1.3.0 - resolution: "react-native-svg-transformer@npm:1.3.0" - dependencies: - "@svgr/core": ^8.1.0 - "@svgr/plugin-jsx": ^8.1.0 - "@svgr/plugin-svgo": ^8.1.0 - path-dirname: ^1.0.2 - peerDependencies: - react-native: ">=0.59.0" - react-native-svg: ">=12.0.0" - checksum: 09dc490aad05b8f44289fc6c1b75a2fce92b95b27cacb07f320f29c0d0edcc6979fbd6a46f0b13e6b0681c2ae4652d08af35c018bbbd29324db3579a869a4502 - languageName: node - linkType: hard - -"react-native-svg@npm:15.10.1": - version: 15.10.1 - resolution: "react-native-svg@npm:15.10.1" - dependencies: - css-select: ^5.1.0 - css-tree: ^1.1.3 - warn-once: 0.1.1 - peerDependencies: - react: "*" - react-native: "*" - checksum: c210426b424e99730ba35d6bbf18335a99f04f2f234cb5bb578ac685c31cfca5e39d48ebf05f9189edd61c028405f4ff242b5edc98ee3e3f41c8bfa960f5bff4 - languageName: node - linkType: hard - -"react-native-swipe-gestures@npm:^1.0.5": - version: 1.0.5 - resolution: "react-native-swipe-gestures@npm:1.0.5" - checksum: d637bc40baa50fa0ce3b6cf2b494efeceaea03cc3875cb7cf7d76922914a21d5e6b098d4a084fb291ce61bfbb0a241c03cff24b15bebf0cfae1c146f4ad10d92 - languageName: node - linkType: hard - -"react-native-tab-view@npm:3.5.2": - version: 3.5.2 - resolution: "react-native-tab-view@npm:3.5.2" - dependencies: - use-latest-callback: ^0.1.5 - peerDependencies: - react: "*" - react-native: "*" - react-native-pager-view: "*" - checksum: bd287e5543881aa662ee55418a3bd5dacb25033425a9fcb0fff21c3a3b96f956af1a77cd9bab4e7a8e94590080a5d8e3cb99cfa8613b19bf6da24bfc9b4942d4 - languageName: node - linkType: hard - -"react-native-tab-view@patch:react-native-tab-view@npm%3A3.5.2#./.yarn/patches/react-native-tab-view-npm-3.5.2-fb6cb6fe6f.patch::locator=universe%40workspace%3A.": - version: 3.5.2 - resolution: "react-native-tab-view@patch:react-native-tab-view@npm%3A3.5.2#./.yarn/patches/react-native-tab-view-npm-3.5.2-fb6cb6fe6f.patch::version=3.5.2&hash=024ace&locator=universe%40workspace%3A." - dependencies: - use-latest-callback: ^0.1.5 - peerDependencies: - react: "*" - react-native: "*" - react-native-pager-view: "*" - checksum: ee6810d86a7a22273f46ba01c2b2e99cd51356a860e7e6ab69cceb50e689393f5271138eb7e59c72bcc7ca65f7f605c1bb2d94f71d240a2051341a19de78ecaf - languageName: node - linkType: hard - -"react-native-url-polyfill@npm:1.3.0": - version: 1.3.0 - resolution: "react-native-url-polyfill@npm:1.3.0" - dependencies: - whatwg-url-without-unicode: 8.0.0-3 - peerDependencies: - react-native: "*" - checksum: 24ef81493a642b9359c1e8048de4da84fb554ffcf35677f9d8b11956d700faa4b9ac9d74f56aee67dd8d8b4ef6d9879e7431848785880ada657f8bec0211b00a - languageName: node - linkType: hard - -"react-native-url-polyfill@npm:2.0.0, react-native-url-polyfill@npm:^2.0.0": - version: 2.0.0 - resolution: "react-native-url-polyfill@npm:2.0.0" - dependencies: - whatwg-url-without-unicode: 8.0.0-3 - peerDependencies: - react-native: "*" - checksum: 1a2e1030a62fd093764b5330ce0ff34d72246e581dd2892cddc347d8621931aeb2c9ea3e054960484a1259230e8461e569e1890f1ff452d3c5c0adef70190fc3 - languageName: node - linkType: hard - -"react-native-wagmi-charts@npm:2.5.2": - version: 2.5.2 - resolution: "react-native-wagmi-charts@npm:2.5.2" - dependencies: - d3-array: ^3.1.6 - d3-interpolate-path: ^2.2.3 - d3-scale: ^2 - d3-shape: ^3.0.1 - fbjs: ^3.0.5 - react-keyed-flatten-children: ^1.3.0 - react-native-redash: ^18.1.3 - peerDependencies: - react: "*" - react-native: "*" - react-native-gesture-handler: "*" - react-native-reanimated: "*" - react-native-redash: "*" - react-native-svg: "*" - checksum: c78b683746050f621e86810c7705aeaa937a77a1b3508123b74f3f092a2194d297dd3403b63eef476d94ffa62f758b0e878ca3ea8fa1093f2478a9982a0e591e - languageName: node - linkType: hard - -"react-native-web@npm:0.19.13": - version: 0.19.13 - resolution: "react-native-web@npm:0.19.13" - dependencies: - "@babel/runtime": ^7.18.6 - "@react-native/normalize-colors": ^0.74.1 - fbjs: ^3.0.4 - inline-style-prefixer: ^6.0.1 - memoize-one: ^6.0.0 - nullthrows: ^1.1.1 - postcss-value-parser: ^4.2.0 - styleq: ^0.1.3 - peerDependencies: - react: ^18.0.0 - react-dom: ^18.0.0 - checksum: 15077f88204cb980203b8e3784c092c8c25c972bf281db43fd4ccc9696b603380a49f5289fb9a742daddd8e7599baab5798a1f1c857bdd634add827bc39fd8d8 - languageName: node - linkType: hard - -"react-native-webview@npm:13.12.2": - version: 13.12.2 - resolution: "react-native-webview@npm:13.12.2" - dependencies: - escape-string-regexp: ^4.0.0 - invariant: 2.2.4 - peerDependencies: - react: "*" - react-native: "*" - checksum: d84b2e2e75dc484eb40f8e285607b9686693f2d31e95802e2b358dc0820bcc294b438a77174eba157c31d95675c962c61c94885629af999416ad1355e9618fe0 - languageName: node - linkType: hard - -"react-native-webview@npm:^11.26.0": - version: 11.26.1 - resolution: "react-native-webview@npm:11.26.1" - dependencies: - escape-string-regexp: 2.0.0 - invariant: 2.2.4 - peerDependencies: - react: "*" - react-native: "*" - checksum: d2f95a89e944a2f1e8cf402e4e274f3568edae42e7ef190915e9fba8004a01d699c962459bdc9688c159060538e90aea3017cab24e6f4112021cbbc10ef57104 - languageName: node - linkType: hard - -"react-native-widgetkit@npm:1.0.9": - version: 1.0.9 - resolution: "react-native-widgetkit@npm:1.0.9" - peerDependencies: - react: "*" - react-native: "*" - checksum: bf5e319226062150dcfe0e1371576b7e86e5b914683583dbb0b953812bcb8e278ce07c57c40690f414aadbbaf72938b21f390989ce8b54409e043c47204f4bc4 - languageName: node - linkType: hard - -"react-native@npm:0.76.6": - version: 0.76.6 - resolution: "react-native@npm:0.76.6" - dependencies: - "@jest/create-cache-key-function": ^29.6.3 - "@react-native/assets-registry": 0.76.6 - "@react-native/codegen": 0.76.6 - "@react-native/community-cli-plugin": 0.76.6 - "@react-native/gradle-plugin": 0.76.6 - "@react-native/js-polyfills": 0.76.6 - "@react-native/normalize-colors": 0.76.6 - "@react-native/virtualized-lists": 0.76.6 - abort-controller: ^3.0.0 - anser: ^1.4.9 - ansi-regex: ^5.0.0 - babel-jest: ^29.7.0 - babel-plugin-syntax-hermes-parser: ^0.23.1 - base64-js: ^1.5.1 - chalk: ^4.0.0 - commander: ^12.0.0 - event-target-shim: ^5.0.1 - flow-enums-runtime: ^0.0.6 - glob: ^7.1.1 - invariant: ^2.2.4 - jest-environment-node: ^29.6.3 - jsc-android: ^250231.0.0 - memoize-one: ^5.0.0 - metro-runtime: ^0.81.0 - metro-source-map: ^0.81.0 - mkdirp: ^0.5.1 - nullthrows: ^1.1.1 - pretty-format: ^29.7.0 - promise: ^8.3.0 - react-devtools-core: ^5.3.1 - react-refresh: ^0.14.0 - regenerator-runtime: ^0.13.2 - scheduler: 0.24.0-canary-efb381bbf-20230505 - semver: ^7.1.3 - stacktrace-parser: ^0.1.10 - whatwg-fetch: ^3.0.0 - ws: ^6.2.3 - yargs: ^17.6.2 - peerDependencies: - "@types/react": ^18.2.6 - react: ^18.2.0 - peerDependenciesMeta: - "@types/react": - optional: true - bin: - react-native: cli.js - checksum: c3a36bb3e5c702de63d94fe4ccb0858f34fa5d580516156b5eb0651c157b7815a04c35f76078e7c29236cba84247394ea40066012d22c54917db88bdc6c13211 - languageName: node - linkType: hard - -"react-popper@npm:2.3.0": - version: 2.3.0 - resolution: "react-popper@npm:2.3.0" - dependencies: - react-fast-compare: ^3.0.1 - warning: ^4.0.2 - peerDependencies: - "@popperjs/core": ^2.0.0 - react: ^16.8.0 || ^17 || ^18 - react-dom: ^16.8.0 || ^17 || ^18 - checksum: 837111c98738011c69b3069a464ea5bdcbf487105b6148e8faf90cb7337e134edb1b98b8824322941c378756cca30a15c18c25f558e53b85ed5762fa0dc8e6b2 - languageName: node - linkType: hard - -"react-qr-code@npm:2.0.12": - version: 2.0.12 - resolution: "react-qr-code@npm:2.0.12" - dependencies: - prop-types: ^15.8.1 - qr.js: 0.0.0 - peerDependencies: - react: ^16.x || ^17.x || ^18.x - react-native-svg: "*" - peerDependenciesMeta: - react-native-svg: - optional: true - checksum: b7bad40d7d5f04f7ff336ae499920dd5ea0e7616ed7fec5f849e54f8f26b5e4acd1ba8e69198be8617dc7fecdf36cf4302c99ff74885320b55bb95d19a09de7c - languageName: node - linkType: hard - -"react-reconciler@npm:0.27.0": - version: 0.27.0 - resolution: "react-reconciler@npm:0.27.0" - dependencies: - loose-envify: ^1.1.0 - scheduler: ^0.21.0 - peerDependencies: - react: ^18.0.0 - checksum: c2ae111f150c2a46970182df12ea8254719fdfec5e26574711b1838fc37863c63671460a351570fd359c088d891e7bb0ff89023c2f7c1582393b57dd517b92c2 - languageName: node - linkType: hard - -"react-redux@npm:8.0.5": - version: 8.0.5 - resolution: "react-redux@npm:8.0.5" - dependencies: - "@babel/runtime": ^7.12.1 - "@types/hoist-non-react-statics": ^3.3.1 - "@types/use-sync-external-store": ^0.0.3 - hoist-non-react-statics: ^3.3.2 - react-is: ^18.0.0 - use-sync-external-store: ^1.0.0 - peerDependencies: - "@types/react": ^16.8 || ^17.0 || ^18.0 - "@types/react-dom": ^16.8 || ^17.0 || ^18.0 - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - react-native: ">=0.59" - redux: ^4 - peerDependenciesMeta: - "@types/react": - optional: true - "@types/react-dom": - optional: true - react-dom: - optional: true - react-native: - optional: true - redux: - optional: true - checksum: a108f4f7ead6ac005e656d46051474a2bbdb31ede481bbbb3d8d779c1a35e1940b8655577cc5021313411864d305f67fc719aa48d6e5ed8288cf9cbe8b7042e4 - languageName: node - linkType: hard - -"react-refresh@npm:0.14.0": - version: 0.14.0 - resolution: "react-refresh@npm:0.14.0" - checksum: dc69fa8c993df512f42dd0f1b604978ae89bd747c0ed5ec595c0cc50d535fb2696619ccd98ae28775cc01d0a7c146a532f0f7fb81dc22e1977c242a4912312f4 - languageName: node - linkType: hard - -"react-remove-scroll-bar@npm:^2.3.7": - version: 2.3.8 - resolution: "react-remove-scroll-bar@npm:2.3.8" - dependencies: - react-style-singleton: ^2.2.2 - tslib: ^2.0.0 - peerDependencies: - "@types/react": "*" - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - peerDependenciesMeta: - "@types/react": - optional: true - checksum: c4663247f689dbe51c370836edf735487f6d8796acb7f15b09e8a1c14e84c7997360e8e3d54de2bc9c0e782fed2b2c4127d15b4053e4d2cf26839e809e57605f - languageName: node - linkType: hard - -"react-remove-scroll@npm:^2.3.0, react-remove-scroll@npm:^2.6.0": - version: 2.6.2 - resolution: "react-remove-scroll@npm:2.6.2" - dependencies: - react-remove-scroll-bar: ^2.3.7 - react-style-singleton: ^2.2.1 - tslib: ^2.1.0 - use-callback-ref: ^1.3.3 - use-sidecar: ^1.1.2 - peerDependencies: - "@types/react": "*" - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc - peerDependenciesMeta: - "@types/react": - optional: true - checksum: 310e6e6d2f28226a1751dc5084a2dce49167f0b69e3d78d6510f329f423ee313d4f6477f5e1adccb68baef40a7af75541e980a8c398cb82ea0d3573e514e8124 - languageName: node - linkType: hard - -"react-router-dom@npm:6.10.0": - version: 6.10.0 - resolution: "react-router-dom@npm:6.10.0" - dependencies: - "@remix-run/router": 1.5.0 - react-router: 6.10.0 - peerDependencies: - react: ">=16.8" - react-dom: ">=16.8" - checksum: d048d8cc66e5aec782bd675097d6bf0e5f867f3f0539bff9acdc4a314b5e0e34093944762960ca0977a54c6255272edd262231242b18c4e260d68df6b5288464 - languageName: node - linkType: hard - -"react-router@npm:6.10.0": - version: 6.10.0 - resolution: "react-router@npm:6.10.0" - dependencies: - "@remix-run/router": 1.5.0 - peerDependencies: - react: ">=16.8" - checksum: c9fce46147c04257d7d6fa1f5bbfac96c5fdd0b15f26918bd12b2e5fe9143977c5a4452272f9b85795a22e29ec105a60d0bbe036118efc52b383d163cd8829ab - languageName: node - linkType: hard - -"react-scripts@npm:5.0.1": - version: 5.0.1 - resolution: "react-scripts@npm:5.0.1" - dependencies: - "@babel/core": ^7.16.0 - "@pmmmwh/react-refresh-webpack-plugin": ^0.5.3 - "@svgr/webpack": ^5.5.0 - babel-jest: ^27.4.2 - babel-loader: ^8.2.3 - babel-plugin-named-asset-import: ^0.3.8 - babel-preset-react-app: ^10.0.1 - bfj: ^7.0.2 - browserslist: ^4.18.1 - camelcase: ^6.2.1 - case-sensitive-paths-webpack-plugin: ^2.4.0 - css-loader: ^6.5.1 - css-minimizer-webpack-plugin: ^3.2.0 - dotenv: ^10.0.0 - dotenv-expand: ^5.1.0 - eslint: ^8.3.0 - eslint-config-react-app: ^7.0.1 - eslint-webpack-plugin: ^3.1.1 - file-loader: ^6.2.0 - fs-extra: ^10.0.0 - fsevents: ^2.3.2 - html-webpack-plugin: ^5.5.0 - identity-obj-proxy: ^3.0.0 - jest: ^27.4.3 - jest-resolve: ^27.4.2 - jest-watch-typeahead: ^1.0.0 - mini-css-extract-plugin: ^2.4.5 - postcss: ^8.4.4 - postcss-flexbugs-fixes: ^5.0.2 - postcss-loader: ^6.2.1 - postcss-normalize: ^10.0.1 - postcss-preset-env: ^7.0.1 - prompts: ^2.4.2 - react-app-polyfill: ^3.0.0 - react-dev-utils: ^12.0.1 - react-refresh: ^0.11.0 - resolve: ^1.20.0 - resolve-url-loader: ^4.0.0 - sass-loader: ^12.3.0 - semver: ^7.3.5 - source-map-loader: ^3.0.0 - style-loader: ^3.3.1 - tailwindcss: ^3.0.2 - terser-webpack-plugin: ^5.2.5 - webpack: ^5.64.4 - webpack-dev-server: ^4.6.0 - webpack-manifest-plugin: ^4.0.2 - workbox-webpack-plugin: ^6.4.1 - peerDependencies: - react: ">= 16" - typescript: ^3.2.1 || ^4 - dependenciesMeta: - fsevents: - optional: true - peerDependenciesMeta: - typescript: - optional: true - bin: - react-scripts: bin/react-scripts.js - checksum: 92afa2f245c7092ccc97d5609dc7a2130616262e34da7f15072d9442e2d2e1d4909a91022abd1faac1336eb17c5525a10d9bd43e1ae374c7ec941ca20addca68 - languageName: node - linkType: hard - -"react-scripts@patch:react-scripts@npm%3A5.0.1#./.yarn/patches/react-scripts-npm-5.0.1-d06bd2d5ad.patch::locator=universe%40workspace%3A.": - version: 5.0.1 - resolution: "react-scripts@patch:react-scripts@npm%3A5.0.1#./.yarn/patches/react-scripts-npm-5.0.1-d06bd2d5ad.patch::version=5.0.1&hash=39fb2f&locator=universe%40workspace%3A." - dependencies: - "@babel/core": ^7.16.0 - "@pmmmwh/react-refresh-webpack-plugin": ^0.5.3 - "@svgr/webpack": ^5.5.0 - babel-jest: ^27.4.2 - babel-loader: ^8.2.3 - babel-plugin-named-asset-import: ^0.3.8 - babel-preset-react-app: ^10.0.1 - bfj: ^7.0.2 - browserslist: ^4.18.1 - camelcase: ^6.2.1 - case-sensitive-paths-webpack-plugin: ^2.4.0 - css-loader: ^6.5.1 - css-minimizer-webpack-plugin: ^3.2.0 - dotenv: ^10.0.0 - dotenv-expand: ^5.1.0 - eslint: ^8.3.0 - eslint-config-react-app: ^7.0.1 - eslint-webpack-plugin: ^3.1.1 - file-loader: ^6.2.0 - fs-extra: ^10.0.0 - fsevents: ^2.3.2 - html-webpack-plugin: ^5.5.0 - identity-obj-proxy: ^3.0.0 - jest: ^27.4.3 - jest-resolve: ^27.4.2 - jest-watch-typeahead: ^1.0.0 - mini-css-extract-plugin: ^2.4.5 - postcss: ^8.4.4 - postcss-flexbugs-fixes: ^5.0.2 - postcss-loader: ^6.2.1 - postcss-normalize: ^10.0.1 - postcss-preset-env: ^7.0.1 - prompts: ^2.4.2 - react-app-polyfill: ^3.0.0 - react-dev-utils: ^12.0.1 - react-refresh: ^0.11.0 - resolve: ^1.20.0 - resolve-url-loader: ^4.0.0 - sass-loader: ^12.3.0 - semver: ^7.3.5 - source-map-loader: ^3.0.0 - style-loader: ^3.3.1 - tailwindcss: ^3.0.2 - terser-webpack-plugin: ^5.2.5 - webpack: ^5.64.4 - webpack-dev-server: ^4.6.0 - webpack-manifest-plugin: ^4.0.2 - workbox-webpack-plugin: ^6.4.1 - peerDependencies: - react: ">= 16" - typescript: ^3.2.1 || ^4 - dependenciesMeta: - fsevents: - optional: true - peerDependenciesMeta: - typescript: - optional: true - bin: - react-scripts: bin/react-scripts.js - checksum: 602ee997062a37fe6215150e5ac3b682b210e44a161778a355604af3e876008e3133515e588377ce3fc6a0811a992ee69ac3ddf02c695c583f6ebda35525dd7b - languageName: node - linkType: hard - -"react-scroll-sync@npm:0.11.2": - version: 0.11.2 - resolution: "react-scroll-sync@npm:0.11.2" - dependencies: - prop-types: ^15.5.7 - peerDependencies: - react: 16.x || 17.x || 18.x - react-dom: 16.x || 17.x || 18.x - checksum: 42220e7606c3f28a58ce579313044d5dc2c370c2db25737432e74065805ff50baf7f94136597ae7b1c192657c13ee16d6a9274316ab9481ba05595cefd7a2f07 - languageName: node - linkType: hard - -"react-server-dom-webpack@npm:19.0.0-rc-6230622a1a-20240610": - version: 19.0.0-rc-6230622a1a-20240610 - resolution: "react-server-dom-webpack@npm:19.0.0-rc-6230622a1a-20240610" - dependencies: - acorn-loose: ^8.3.0 - neo-async: ^2.6.1 - peerDependencies: - react: 19.0.0-rc-6230622a1a-20240610 - react-dom: 19.0.0-rc-6230622a1a-20240610 - webpack: ^5.59.0 - checksum: 2cd0b042b29525d2ad172dc4617a0f0a464f1c415e46149743e7a4bbaa2682ea35121ef108d1ea6ea362fc20feeeb344d0f4053bae33a66bd0af0e7f0f904112 - languageName: node - linkType: hard - -"react-shallow-renderer@npm:^16.15.0": - version: 16.15.0 - resolution: "react-shallow-renderer@npm:16.15.0" - dependencies: - object-assign: ^4.1.1 - react-is: ^16.12.0 || ^17.0.0 || ^18.0.0 - peerDependencies: - react: ^16.0.0 || ^17.0.0 || ^18.0.0 - checksum: 6052c7e3e9627485120ebd8257f128aad8f56386fe8d42374b7743eac1be457c33506d153c7886b4e32923c0c352d402ab805ef9ca02dbcd8393b2bdeb6e5af8 - languageName: node - linkType: hard - -"react-style-singleton@npm:^2.2.1, react-style-singleton@npm:^2.2.2": - version: 2.2.3 - resolution: "react-style-singleton@npm:2.2.3" - dependencies: - get-nonce: ^1.0.0 - tslib: ^2.0.0 - peerDependencies: - "@types/react": "*" - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc - peerDependenciesMeta: - "@types/react": - optional: true - checksum: a7b0bf493c9231065ebafa84c4237aed997c746c561196121b7de82fe155a5355b372db5070a3ac9fe980cf7f60dc0f1e8cf6402a2aa5b2957392932ccf76e76 - languageName: node - linkType: hard - -"react-table@npm:7.8.0": - version: 7.8.0 - resolution: "react-table@npm:7.8.0" - peerDependencies: - react: ^16.8.3 || ^17.0.0-0 || ^18.0.0 - checksum: 44ca0fb848c6869cd793cede8dc33072b38ebb8f8d2833565afe7cf3eac5d1fa455ac5fb9d06838b16fab0523d5d03e3e82f7645032f71245096e67b892313b9 - languageName: node - linkType: hard - -"react-test-renderer@npm:18.3.1": - version: 18.3.1 - resolution: "react-test-renderer@npm:18.3.1" - dependencies: - react-is: ^18.3.1 - react-shallow-renderer: ^16.15.0 - scheduler: ^0.23.2 - peerDependencies: - react: ^18.3.1 - checksum: e8e58e738835fab3801afb63f6bfe0fcf6e68ea39619fae5bdf47feefc36b1e4acb48c9dd139c7533611466eff1dfce6ffdda4b317e06aee663dda7d91438f26 - languageName: node - linkType: hard - -"react-use-gesture@npm:6.0.14": - version: 6.0.14 - resolution: "react-use-gesture@npm:6.0.14" - peerDependencies: - react: ">= 16.8.0" - checksum: 3450912c0c21fcef972ca9cf69426dc048eccd9c255f1acb3526d0efad9d1363a70bf4f0e29be1482986aa853c89d0ba91d589d0489098877bb680d769d34076 - languageName: node - linkType: hard - -"react-virtualized-auto-sizer@npm:1.0.20": - version: 1.0.20 - resolution: "react-virtualized-auto-sizer@npm:1.0.20" - peerDependencies: - react: ^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0-rc - react-dom: ^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0-rc - checksum: 2c616ec7587de64a46aa8c6c301e75fee87eb7a39013f25d940b0fe95eee5e8a8a3c109923e241b427752d71fba80f44cd2c8557750967df0777d99ebd16ba24 - languageName: node - linkType: hard - -"react-window-infinite-loader@npm:1.0.9": - version: 1.0.9 - resolution: "react-window-infinite-loader@npm:1.0.9" - peerDependencies: - react: ^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0 - react-dom: ^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0 - checksum: 9ba451e827ddf1605ae12d26fe8eab1e70928e528b16c0a3443a98dcf7df93a362b0c2a0f64e6e4465b136fee6ccdfda3b1f7fa6748a441cb76a03f926559336 - languageName: node - linkType: hard - -"react-window@npm:1.8.9": - version: 1.8.9 - resolution: "react-window@npm:1.8.9" - dependencies: - "@babel/runtime": ^7.0.0 - memoize-one: ">=3.1.1 <6" - peerDependencies: - react: ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 - react-dom: ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 - checksum: cefa232f4f37269d292529ef15780fb108123d6bb5beee19eeac657e75cf8d4664be66f2da04baf0cb1bc64c5ab3d83a88199c3358f023b78940acd37b0673b2 - languageName: node - linkType: hard - -"react@npm:18.3.1": - version: 18.3.1 - resolution: "react@npm:18.3.1" - dependencies: - loose-envify: ^1.1.0 - checksum: a27bcfa8ff7c15a1e50244ad0d0c1cb2ad4375eeffefd266a64889beea6f6b64c4966c9b37d14ee32d6c9fcd5aa6ba183b6988167ab4d127d13e7cb5b386a376 - languageName: node - linkType: hard - -"reactotron-core-client@npm:2.9.6": - version: 2.9.6 - resolution: "reactotron-core-client@npm:2.9.6" - dependencies: - reactotron-core-contract: 0.2.4 - checksum: 4d09b501cbcac44cd06f1c7210429b6acc486e348ca0dd9e2e4268d635cec11a22e101e306395066bd769f470a8cea9b44a26c0d285fc907479aef5b4eb3350e - languageName: node - linkType: hard - -"reactotron-core-contract@npm:0.2.4": - version: 0.2.4 - resolution: "reactotron-core-contract@npm:0.2.4" - checksum: b3c3e21f3137202d3089b00eda409ec1fb72b8ec296d710883dca07dfb98fa8c48564347854b40b031adcbeb17842730adebac53890f516a5304d03d90d1c1c7 - languageName: node - linkType: hard - -"reactotron-react-native-mmkv@npm:0.2.7": - version: 0.2.7 - resolution: "reactotron-react-native-mmkv@npm:0.2.7" - peerDependencies: - react-native-mmkv: "*" - reactotron-core-client: "*" - checksum: f8aeb18858e1421b87580fc781b60c27fa1a54773eb944d5b83b195873455aa04e1b2c065e9222cc16fd9f1edead084785c0abc5cdc573f1d89e0c56bb1823b6 - languageName: node - linkType: hard - -"reactotron-react-native@npm:5.1.10": - version: 5.1.10 - resolution: "reactotron-react-native@npm:5.1.10" - dependencies: - mitt: ^3.0.1 - reactotron-core-client: 2.9.6 - peerDependencies: - react-native: ">=0.40.0" - checksum: d6f52c23b8c636aee456627aaaa8ce5630b25c90921d2eb7e2d28cb1367a2471d4f4ef35db91a5d518614289b5f0950100b5580b25b4f2179b1e8423575b7cb8 - languageName: node - linkType: hard - -"reactotron-redux@npm:3.1.10": - version: 3.1.10 - resolution: "reactotron-redux@npm:3.1.10" - peerDependencies: - reactotron-core-client: "*" - redux: ">=4.0.0" - checksum: 5922ba94240bb6d221e58e798a30aff35f5de3b4e3bfc0a8ae7d4e9554b6328a4a33e771fd6a9ca8c0fdfc65cd16fd82b583361c41b7e17aa823c3850947392b - languageName: node - linkType: hard - -"read-cache@npm:^1.0.0": - version: 1.0.0 - resolution: "read-cache@npm:1.0.0" - dependencies: - pify: ^2.3.0 - checksum: cffc728b9ede1e0667399903f9ecaf3789888b041c46ca53382fa3a06303e5132774dc0a96d0c16aa702dbac1ea0833d5a868d414f5ab2af1e1438e19e6657c6 - languageName: node - linkType: hard - -"read-pkg-up@npm:^7.0.1": - version: 7.0.1 - resolution: "read-pkg-up@npm:7.0.1" - dependencies: - find-up: ^4.1.0 - read-pkg: ^5.2.0 - type-fest: ^0.8.1 - checksum: e4e93ce70e5905b490ca8f883eb9e48b5d3cebc6cd4527c25a0d8f3ae2903bd4121c5ab9c5a3e217ada0141098eeb661313c86fa008524b089b8ed0b7f165e44 - languageName: node - linkType: hard - -"read-pkg@npm:^5.2.0": - version: 5.2.0 - resolution: "read-pkg@npm:5.2.0" - dependencies: - "@types/normalize-package-data": ^2.4.0 - normalize-package-data: ^2.5.0 - parse-json: ^5.0.0 - type-fest: ^0.6.0 - checksum: eb696e60528b29aebe10e499ba93f44991908c57d70f2d26f369e46b8b9afc208ef11b4ba64f67630f31df8b6872129e0a8933c8c53b7b4daf0eace536901222 - languageName: node - linkType: hard - -"read-yaml-file@npm:2.1.0": - version: 2.1.0 - resolution: "read-yaml-file@npm:2.1.0" - dependencies: - js-yaml: ^4.0.0 - strip-bom: ^4.0.0 - checksum: 52765eb183e79466f51eebeb19b933cc0f0e907052d062d67300b97e79910064a24b370cdb0b5dd8b05afff3d0ec57282670fd9070dc608e13b11820ac79183d - languageName: node - linkType: hard - -"read-yaml-file@npm:^1.1.0": - version: 1.1.0 - resolution: "read-yaml-file@npm:1.1.0" - dependencies: - graceful-fs: ^4.1.5 - js-yaml: ^3.6.1 - pify: ^4.0.1 - strip-bom: ^3.0.0 - checksum: 41ee5f075507ef0403328dd54e225a61c3149f915675ce7fd0fd791ddcce2e6c30a9fe0f76ffa7a465c1c157b9b4ad8ded1dcf47dc3b396103eeb013490bbc2e - languageName: node - linkType: hard - -"readable-stream@npm:3, readable-stream@npm:^3.0.0, readable-stream@npm:^3.0.6, readable-stream@npm:^3.1.1, readable-stream@npm:^3.4.0, readable-stream@npm:^3.5.0, readable-stream@npm:^3.6.0, readable-stream@npm:^3.6.2": - version: 3.6.2 - resolution: "readable-stream@npm:3.6.2" - dependencies: - inherits: ^2.0.3 - string_decoder: ^1.1.1 - util-deprecate: ^1.0.1 - checksum: bdcbe6c22e846b6af075e32cf8f4751c2576238c5043169a1c221c92ee2878458a816a4ea33f4c67623c0b6827c8a400409bfb3cf0bf3381392d0b1dfb52ac8d - languageName: node - linkType: hard - -"readable-stream@npm:^2.0.0, readable-stream@npm:^2.0.1, readable-stream@npm:^2.0.5, readable-stream@npm:^2.0.6, readable-stream@npm:^2.1.5, readable-stream@npm:^2.3.3, readable-stream@npm:^2.3.5, readable-stream@npm:^2.3.6, readable-stream@npm:~2.3.6": - version: 2.3.8 - resolution: "readable-stream@npm:2.3.8" - dependencies: - core-util-is: ~1.0.0 - inherits: ~2.0.3 - isarray: ~1.0.0 - process-nextick-args: ~2.0.0 - safe-buffer: ~5.1.1 - string_decoder: ~1.1.1 - util-deprecate: ~1.0.1 - checksum: 65645467038704f0c8aaf026a72fbb588a9e2ef7a75cd57a01702ee9db1c4a1e4b03aaad36861a6a0926546a74d174149c8c207527963e0c2d3eee2f37678a42 - languageName: node - linkType: hard - -"readable-stream@npm:^3.6.2 || ^4.4.2, readable-stream@npm:^4.0.0": - version: 4.5.2 - resolution: "readable-stream@npm:4.5.2" - dependencies: - abort-controller: ^3.0.0 - buffer: ^6.0.3 - events: ^3.3.0 - process: ^0.11.10 - string_decoder: ^1.3.0 - checksum: c4030ccff010b83e4f33289c535f7830190773e274b3fcb6e2541475070bdfd69c98001c3b0cb78763fc00c8b62f514d96c2b10a8bd35d5ce45203a25fa1d33a - languageName: node - linkType: hard - -"readdirp@npm:^3.6.0, readdirp@npm:~3.6.0": - version: 3.6.0 - resolution: "readdirp@npm:3.6.0" - dependencies: - picomatch: ^2.2.1 - checksum: 1ced032e6e45670b6d7352d71d21ce7edf7b9b928494dcaba6f11fba63180d9da6cd7061ebc34175ffda6ff529f481818c962952004d273178acd70f7059b320 - languageName: node - linkType: hard - -"readdirp@npm:^4.0.1": - version: 4.0.2 - resolution: "readdirp@npm:4.0.2" - checksum: 309376e717f94fb7eb61bec21e2603243a9e2420cd2e9bf94ddf026aefea0d7377ed1a62f016d33265682e44908049a55c3cfc2307450a1421654ea008489b39 - languageName: node - linkType: hard - -"readline-sync@npm:^1.4.9": - version: 1.4.10 - resolution: "readline-sync@npm:1.4.10" - checksum: 4dbd8925af028dc4cb1bb813f51ca3479035199aa5224886b560eec8e768ab27d7ebf11d69a67ed93d5a130b7c994f0bdb77796326e563cf928bbfd560e3747e - languageName: node - linkType: hard - -"readline@npm:^1.3.0": - version: 1.3.0 - resolution: "readline@npm:1.3.0" - checksum: dfaf8e6ac20408ea00d650e95f7bb47f77c4c62dd12ed7fb51731ee84532a2f3675fcdc4cab4923dc1eef227520a2e082a093215190907758bea9f585b19438e - languageName: node - linkType: hard - -"real-require@npm:^0.1.0": - version: 0.1.0 - resolution: "real-require@npm:0.1.0" - checksum: 96745583ed4f82cd5c6a6af012fd1d3c6fc2f13ae1bcff1a3c4f8094696013a1a07c82c5aa66a403d7d4f84949fc2203bc927c7ad120caad125941ca2d7e5e8e - languageName: node - linkType: hard - -"rebass@npm:4.0.7": - version: 4.0.7 - resolution: "rebass@npm:4.0.7" - dependencies: - reflexbox: ^4.0.6 - checksum: 2819f5d7605d9804a47718bb39898c94d88da67cd1b2709c29c6b5997083a0de36fd2b1795e15934fb85f6895f765ca920c1ab65f714041bfc505ede9521ea8e - languageName: node - linkType: hard - -"recast@npm:^0.21.0": - version: 0.21.5 - resolution: "recast@npm:0.21.5" - dependencies: - ast-types: 0.15.2 - esprima: ~4.0.0 - source-map: ~0.6.1 - tslib: ^2.0.1 - checksum: 03cc7f57562238ba258d468be67bf7446ce7a707bc87a087891dad15afead46c36e9aaeedf2130e2ab5a465244a9c62bfd4127849761cf8f4085abe2f3e5f485 - languageName: node - linkType: hard - -"recast@npm:^0.23.5": - version: 0.23.9 - resolution: "recast@npm:0.23.9" - dependencies: - ast-types: ^0.16.1 - esprima: ~4.0.0 - source-map: ~0.6.1 - tiny-invariant: ^1.3.3 - tslib: ^2.0.1 - checksum: be8e896a46b24e30fbeafcd111ff3beaf2b5532d241c199f833fe1c18e89f695b2704cf83f3006fa96a785851019031de0de50bd3e0fd7bb114be18bf2cad900 - languageName: node - linkType: hard - -"rechoir@npm:^0.6.2": - version: 0.6.2 - resolution: "rechoir@npm:0.6.2" - dependencies: - resolve: ^1.1.6 - checksum: fe76bf9c21875ac16e235defedd7cbd34f333c02a92546142b7911a0f7c7059d2e16f441fe6fb9ae203f459c05a31b2bcf26202896d89e390eda7514d5d2702b - languageName: node - linkType: hard - -"rechoir@npm:^0.8.0": - version: 0.8.0 - resolution: "rechoir@npm:0.8.0" - dependencies: - resolve: ^1.20.0 - checksum: ad3caed8afdefbc33fbc30e6d22b86c35b3d51c2005546f4e79bcc03c074df804b3640ad18945e6bef9ed12caedc035655ec1082f64a5e94c849ff939dc0a788 - languageName: node - linkType: hard - -"recursive-readdir@npm:^2.2.2": - version: 2.2.3 - resolution: "recursive-readdir@npm:2.2.3" - dependencies: - minimatch: ^3.0.5 - checksum: 88ec96e276237290607edc0872b4f9842837b95cfde0cdbb1e00ba9623dfdf3514d44cdd14496ab60a0c2dd180a6ef8a3f1c34599e6cf2273afac9b72a6fb2b5 - languageName: node - linkType: hard - -"recyclerlistview@npm:4.2.1": - version: 4.2.1 - resolution: "recyclerlistview@npm:4.2.1" - dependencies: - lodash.debounce: 4.0.8 - prop-types: 15.8.1 - ts-object-utils: 0.0.5 - peerDependencies: - react: ">= 15.2.1" - react-native: ">= 0.30.0" - checksum: 48e84937f803ac2acb510b2bc36b3ef1ea9c5383540a832f80c87d7e7f933b26c59e4ffc2d7de529be55e14a8d551c4f6660a450ad220142f351e6bf6e630450 - languageName: node - linkType: hard - -"redent@npm:^3.0.0": - version: 3.0.0 - resolution: "redent@npm:3.0.0" - dependencies: - indent-string: ^4.0.0 - strip-indent: ^3.0.0 - checksum: fa1ef20404a2d399235e83cc80bd55a956642e37dd197b4b612ba7327bf87fa32745aeb4a1634b2bab25467164ab4ed9c15be2c307923dd08b0fe7c52431ae6b - languageName: node - linkType: hard - -"redis-errors@npm:^1.0.0, redis-errors@npm:^1.2.0": - version: 1.2.0 - resolution: "redis-errors@npm:1.2.0" - checksum: f28ac2692113f6f9c222670735aa58aeae413464fd58ccf3fce3f700cae7262606300840c802c64f2b53f19f65993da24dc918afc277e9e33ac1ff09edb394f4 - languageName: node - linkType: hard - -"redis-parser@npm:^3.0.0": - version: 3.0.0 - resolution: "redis-parser@npm:3.0.0" - dependencies: - redis-errors: ^1.0.0 - checksum: 89290ae530332f2ae37577647fa18208d10308a1a6ba750b9d9a093e7398f5e5253f19855b64c98757f7129cccce958e4af2573fdc33bad41405f87f1943459a - languageName: node - linkType: hard - -"redux-logger@npm:3.0.6": - version: 3.0.6 - resolution: "redux-logger@npm:3.0.6" - dependencies: - deep-diff: ^0.3.5 - checksum: c40f63c44c6475cf6374ae0eaa810d913f142614cb80692a0beacaf135c5dc3eb3e2cdd4296f01446ba48cb69b82e81363b84d829f1f6659382c991022a814ac - languageName: node - linkType: hard - -"redux-mock-store@npm:1.5.4": - version: 1.5.4 - resolution: "redux-mock-store@npm:1.5.4" - dependencies: - lodash.isplainobject: ^4.0.6 - checksum: 571eab2cca3e46321969025af865ddd780804c811be9db277fddf772d86e3ea67b4ef1b19ea3866417d41eb1b73605103020321f68cf68f379a52679a6823d12 - languageName: node - linkType: hard - -"redux-persist-webextension-storage@npm:1.0.2": - version: 1.0.2 - resolution: "redux-persist-webextension-storage@npm:1.0.2" - checksum: 6d6866ed61477ff9daca54a21e2278113036074adcbe9fb72fed81849a41faf95d829a347edfe2a4f0b3eccaa788311a10baf5f0f4522674860a60351d785c46 - languageName: node - linkType: hard - -"redux-persist@npm:6.0.0": - version: 6.0.0 - resolution: "redux-persist@npm:6.0.0" - peerDependencies: - redux: ">4.0.0" - checksum: edaf10dbf17351ce8058d0802357adae8665b3a1ff39371834e37838ddbe1a79cccbc717b8ba54acb5307651ccf51d0f7dc1cbc8dbae0726ff952d11ef61c6b8 - languageName: node - linkType: hard - -"redux-saga-test-plan@npm:4.0.4": - version: 4.0.4 - resolution: "redux-saga-test-plan@npm:4.0.4" - dependencies: - core-js: ^2.4.1 - fsm-iterator: ^1.1.0 - lodash.isequal: ^4.5.0 - lodash.ismatch: ^4.4.0 - object-assign: ^4.1.0 - peerDependencies: - "@redux-saga/is": ^1.0.1 - "@redux-saga/symbols": ^1.0.1 - redux-saga: ^1.0.1 - checksum: f2c643a35c97b86580bae2724179d732cd8768b1dfaa920df97efdf7b071635cb9e6b4be3bb86f95305a60f71e935425277f99942d75c885aa3f9523daf11b66 - languageName: node - linkType: hard - -"redux-saga@npm:1.2.2": - version: 1.2.2 - resolution: "redux-saga@npm:1.2.2" - dependencies: - "@redux-saga/core": ^1.2.2 - checksum: 645cb64f082fe82a5cc3bade85c5c86f64171155d23bd39befb9c64f9bc16142d7bdbe495e9e74af8d50fefa25a897d80c336f26ffdb7c944a1e60ca83302b0c - languageName: node - linkType: hard - -"redux-thunk@npm:^2.4.2": - version: 2.4.2 - resolution: "redux-thunk@npm:2.4.2" - peerDependencies: - redux: ^4 - checksum: c7f757f6c383b8ec26152c113e20087818d18ed3edf438aaad43539e9a6b77b427ade755c9595c4a163b6ad3063adf3497e5fe6a36c68884eb1f1cfb6f049a5c - languageName: node - linkType: hard - -"redux@npm:4.2.1, redux@npm:^4.0.0, redux@npm:^4.0.4, redux@npm:^4.0.5, redux@npm:^4.2.0": - version: 4.2.1 - resolution: "redux@npm:4.2.1" - dependencies: - "@babel/runtime": ^7.9.2 - checksum: f63b9060c3a1d930ae775252bb6e579b42415aee7a23c4114e21a0b4ba7ec12f0ec76936c00f546893f06e139819f0e2855e0d55ebfce34ca9c026241a6950dd - languageName: node - linkType: hard - -"reflect.getprototypeof@npm:^1.0.4": - version: 1.0.4 - resolution: "reflect.getprototypeof@npm:1.0.4" - dependencies: - call-bind: ^1.0.2 - define-properties: ^1.2.0 - es-abstract: ^1.22.1 - get-intrinsic: ^1.2.1 - globalthis: ^1.0.3 - which-builtin-type: ^1.1.3 - checksum: 16e2361988dbdd23274b53fb2b1b9cefeab876c3941a2543b4cadac6f989e3db3957b07a44aac46cfceb3e06e2871785ec2aac992d824f76292f3b5ee87f66f2 - languageName: node - linkType: hard - -"reflexbox@npm:^4.0.6": - version: 4.0.6 - resolution: "reflexbox@npm:4.0.6" - dependencies: - "@emotion/core": ^10.0.0 - "@emotion/styled": ^10.0.0 - "@styled-system/css": ^5.0.0 - "@styled-system/should-forward-prop": ^5.0.0 - styled-system: ^5.0.0 - peerDependencies: - react: ^16.8.6 - checksum: b532551c8b84242c7f49abcb41efa3e68b7ee42228221973da9b385e665ca8c04b216fda710b41641d97d75fbd7ebe0a21bb9c9f5428617199afbde684afe842 - languageName: node - linkType: hard - -"regenerate-unicode-properties@npm:^10.2.0": - version: 10.2.0 - resolution: "regenerate-unicode-properties@npm:10.2.0" - dependencies: - regenerate: ^1.4.2 - checksum: d5c5fc13f8b8d7e16e791637a4bfef741f8d70e267d51845ee7d5404a32fa14c75b181c4efba33e4bff8b0000a2f13e9773593713dfe5b66597df4259275ce63 - languageName: node - linkType: hard - -"regenerate@npm:^1.4.2": - version: 1.4.2 - resolution: "regenerate@npm:1.4.2" - checksum: 3317a09b2f802da8db09aa276e469b57a6c0dd818347e05b8862959c6193408242f150db5de83c12c3fa99091ad95fb42a6db2c3329bfaa12a0ea4cbbeb30cb0 - languageName: node - linkType: hard - -"regenerator-runtime@npm:^0.13.2, regenerator-runtime@npm:^0.13.3, regenerator-runtime@npm:^0.13.9": - version: 0.13.11 - resolution: "regenerator-runtime@npm:0.13.11" - checksum: 27481628d22a1c4e3ff551096a683b424242a216fee44685467307f14d58020af1e19660bf2e26064de946bad7eff28950eae9f8209d55723e2d9351e632bbb4 - languageName: node - linkType: hard - -"regenerator-runtime@npm:^0.14.0": - version: 0.14.0 - resolution: "regenerator-runtime@npm:0.14.0" - checksum: 1c977ad82a82a4412e4f639d65d22be376d3ebdd30da2c003eeafdaaacd03fc00c2320f18120007ee700900979284fc78a9f00da7fb593f6e6eeebc673fba9a3 - languageName: node - linkType: hard - -"regenerator-transform@npm:^0.15.2": - version: 0.15.2 - resolution: "regenerator-transform@npm:0.15.2" - dependencies: - "@babel/runtime": ^7.8.4 - checksum: 20b6f9377d65954980fe044cfdd160de98df415b4bff38fbade67b3337efaf078308c4fed943067cd759827cc8cfeca9cb28ccda1f08333b85d6a2acbd022c27 - languageName: node - linkType: hard - -"regex-parser@npm:^2.2.11": - version: 2.3.0 - resolution: "regex-parser@npm:2.3.0" - checksum: bcd1eb7e9b0775b6f44928ceb0280ad5b6e4da91e1070d3e9a653fcf72d2d04873c44190fb569141b6897fe94e9514fee1f3ac7ba112ccd9c9b5ad6eabab6bbd - languageName: node - linkType: hard - -"regexp-tree@npm:~0.1.1": - version: 0.1.27 - resolution: "regexp-tree@npm:0.1.27" - bin: - regexp-tree: bin/regexp-tree - checksum: 129aebb34dae22d6694ab2ac328be3f99105143737528ab072ef624d599afecbcfae1f5c96a166fa9e5f64fa1ecf30b411c4691e7924c3e11bbaf1712c260c54 - languageName: node - linkType: hard - -"regexp.prototype.flags@npm:^1.5.1, regexp.prototype.flags@npm:^1.5.2, regexp.prototype.flags@npm:^1.5.3": - version: 1.5.3 - resolution: "regexp.prototype.flags@npm:1.5.3" - dependencies: - call-bind: ^1.0.7 - define-properties: ^1.2.1 - es-errors: ^1.3.0 - set-function-name: ^2.0.2 - checksum: 83ff0705b837f7cb6d664010a11642250f36d3f642263dd0f3bdfe8f150261aa7b26b50ee97f21c1da30ef82a580bb5afedbef5f45639d69edaafbeac9bbb0ed - languageName: node - linkType: hard - -"regexpu-core@npm:^6.2.0": - version: 6.2.0 - resolution: "regexpu-core@npm:6.2.0" - dependencies: - regenerate: ^1.4.2 - regenerate-unicode-properties: ^10.2.0 - regjsgen: ^0.8.0 - regjsparser: ^0.12.0 - unicode-match-property-ecmascript: ^2.0.0 - unicode-match-property-value-ecmascript: ^2.1.0 - checksum: 67d3c4a3f6c99bc80b5d690074a27e6f675be1c1739f8a9acf028fbc36f1a468472574ea65e331e217995198ba4404d7878f3cb3739a73552dd3c70d3fb7f8e6 - languageName: node - linkType: hard - -"registry-auth-token@npm:3.3.2": - version: 3.3.2 - resolution: "registry-auth-token@npm:3.3.2" - dependencies: - rc: ^1.1.6 - safe-buffer: ^5.0.1 - checksum: c9d7ae160a738f1fa825556e3669e6c771d2c0239ce37679f7e8646157a97d0a76464738be075002a1f754ef9bfb913b689f4bbfd5296d28f136fbf98c8c2217 - languageName: node - linkType: hard - -"registry-auth-token@npm:^3.0.1": - version: 3.4.0 - resolution: "registry-auth-token@npm:3.4.0" - dependencies: - rc: ^1.1.6 - safe-buffer: ^5.0.1 - checksum: a15780726bae327a8fff4048cb6a5de03d58bc19ea9e2411322e32e4ebb59962efb669d270bdde384ed68ed7b948f5feb11469e3d0c7e50a33cc8866710f0bc2 - languageName: node - linkType: hard - -"registry-auth-token@npm:^4.0.0": - version: 4.2.2 - resolution: "registry-auth-token@npm:4.2.2" - dependencies: - rc: 1.2.8 - checksum: c5030198546ecfdcbcb0722cbc3e260c4f5f174d8d07bdfedd4620e79bfdf17a2db735aa230d600bd388fce6edd26c0a9ed2eb7e9b4641ec15213a28a806688b - languageName: node - linkType: hard - -"registry-url@npm:3.1.0, registry-url@npm:^3.0.3": - version: 3.1.0 - resolution: "registry-url@npm:3.1.0" - dependencies: - rc: ^1.0.1 - checksum: 6d223da41b04e1824f5faa63905c6f2e43b216589d72794111573f017352b790aef42cd1f826463062f89d804abb2027e3d9665d2a9a0426a11eedd04d470af3 - languageName: node - linkType: hard - -"registry-url@npm:^5.0.0": - version: 5.1.0 - resolution: "registry-url@npm:5.1.0" - dependencies: - rc: ^1.2.8 - checksum: bcea86c84a0dbb66467b53187fadebfea79017cddfb4a45cf27530d7275e49082fe9f44301976eb0164c438e395684bcf3dae4819b36ff9d1640d8cc60c73df9 - languageName: node - linkType: hard - -"regjsgen@npm:^0.8.0": - version: 0.8.0 - resolution: "regjsgen@npm:0.8.0" - checksum: a1d925ff14a4b2be774e45775ee6b33b256f89c42d480e6d85152d2133f18bd3d6af662161b226fa57466f7efec367eaf7ccd2a58c0ec2a1306667ba2ad07b0d - languageName: node - linkType: hard - -"regjsparser@npm:^0.12.0": - version: 0.12.0 - resolution: "regjsparser@npm:0.12.0" - dependencies: - jsesc: ~3.0.2 - bin: - regjsparser: bin/parser - checksum: 094b55b0ab3e1fd58f8ce5132a1d44dab08d91f7b0eea4132b0157b303ebb8ded20a9cbd893d25402d2aeddb23fac1f428ab4947b295d6fa51dd1c334a9e76f0 - languageName: node - linkType: hard - -"rehackt@npm:^0.1.0": - version: 0.1.0 - resolution: "rehackt@npm:0.1.0" - peerDependencies: - "@types/react": "*" - react: "*" - peerDependenciesMeta: - "@types/react": - optional: true - react: - optional: true - checksum: 2c3bcd72524bf47672640265e79cba785e0e6837b9b385ccb0a3ea7d00f55a439d9aed3e0ae71e991d88e0d4b2b3158457c92e75fff5ebf99cd46e280068ddeb - languageName: node - linkType: hard - -"relateurl@npm:^0.2.7": - version: 0.2.7 - resolution: "relateurl@npm:0.2.7" - checksum: 5891e792eae1dfc3da91c6fda76d6c3de0333a60aa5ad848982ebb6dccaa06e86385fb1235a1582c680a3d445d31be01c6bfc0804ebbcab5aaf53fa856fde6b6 - languageName: node - linkType: hard - -"relative-luminance@npm:^2.0.0": - version: 2.0.1 - resolution: "relative-luminance@npm:2.0.1" - dependencies: - esm: ^3.0.84 - checksum: a69398ffe30cdb61e12ea18662674654b8895a607b5f8d362a99b42d888777a5508f27f0355da143dafe46ae5a1e419a549451ba3c52e21ccc3f0c9f71e227b9 - languageName: node - linkType: hard - -"relay-runtime@npm:12.0.0": - version: 12.0.0 - resolution: "relay-runtime@npm:12.0.0" - dependencies: - "@babel/runtime": ^7.0.0 - fbjs: ^3.0.0 - invariant: ^2.2.4 - checksum: 51cdc8a5e04188982452ae4e7c6ac7d6375ee769130d24ce8e8f9cdd45aa7e11ecd68670f56e30dcee1b4974585e88ecce19e69a9868b80cda0db7678c3b8f0a - languageName: node - linkType: hard - -"remark-parse@npm:^5.0.0": - version: 5.0.0 - resolution: "remark-parse@npm:5.0.0" - dependencies: - collapse-white-space: ^1.0.2 - is-alphabetical: ^1.0.0 - is-decimal: ^1.0.0 - is-whitespace-character: ^1.0.0 - is-word-character: ^1.0.0 - markdown-escapes: ^1.0.0 - parse-entities: ^1.1.0 - repeat-string: ^1.5.4 - state-toggle: ^1.0.0 - trim: 0.0.1 - trim-trailing-lines: ^1.0.0 - unherit: ^1.0.4 - unist-util-remove-position: ^1.0.0 - vfile-location: ^2.0.0 - xtend: ^4.0.1 - checksum: 98ced32fe1198b5abc890eb0b46ca9681fd4a328e4a8a0fecf76cf2bf4017f6f9fbf7997819612cd158bb2432ef5161bde9fee8faf487027be6716ee6ef74f68 - languageName: node - linkType: hard - -"remedial@npm:^1.0.7": - version: 1.0.8 - resolution: "remedial@npm:1.0.8" - checksum: 12df7c55eb92501d7f33cfe5f5ad12be13bb6ac0c53f494aaa9963d5a5155bb8be2143e8d5e17afa1a500ef5dc71d13642920d35350f2a31b65a9778afab6869 - languageName: node - linkType: hard - -"remove-bom-buffer@npm:^3.0.0": - version: 3.0.0 - resolution: "remove-bom-buffer@npm:3.0.0" - dependencies: - is-buffer: ^1.1.5 - is-utf8: ^0.2.1 - checksum: e508fd92e5c7b210123485a366b00bb46fe15ef2c23ae90b05cd365bbfeede429ae70f32bce150fc6467e53c921bc0d9a5c7e33d865009c99603f9fbf7c8b7ae - languageName: node - linkType: hard - -"remove-bom-stream@npm:^1.2.0": - version: 1.2.0 - resolution: "remove-bom-stream@npm:1.2.0" - dependencies: - remove-bom-buffer: ^3.0.0 - safe-buffer: ^5.1.0 - through2: ^2.0.3 - checksum: 32533fa1925a753cfeb352efe7f01c4171de992275e39f66672752669a457d6cdaaa1c9fd41a25b0e54cd6c0db4987a01a2593c01680a6d5e7b5076d27540786 - languageName: node - linkType: hard - -"remove-trailing-separator@npm:^1.0.1, remove-trailing-separator@npm:^1.1.0": - version: 1.1.0 - resolution: "remove-trailing-separator@npm:1.1.0" - checksum: d3c20b5a2d987db13e1cca9385d56ecfa1641bae143b620835ac02a6b70ab88f68f117a0021838db826c57b31373d609d52e4f31aca75fc490c862732d595419 - languageName: node - linkType: hard - -"remove-trailing-slash@npm:^0.1.0": - version: 0.1.1 - resolution: "remove-trailing-slash@npm:0.1.1" - checksum: dd200c6b7d6f2b49d12b3eff3abc7089917e8a268cefcd5bf67ff23f8c2ad9f866fbe2f3566e1a8dbdc4f4b1171e2941f7dd00852f8de549bb73c3df53b09d96 - languageName: node - linkType: hard - -"remove-trailing-spaces@npm:^1.0.6": - version: 1.0.8 - resolution: "remove-trailing-spaces@npm:1.0.8" - checksum: 81f615c5cd8dd6a5e3017dcc9af598965575d176d42ef99cfd7b894529991f464e629fd68aba089f5c6bebf5bb8070a5eee56f3b621aba55e8ef524d6a4d4f69 - languageName: node - linkType: hard - -"renderkid@npm:^3.0.0": - version: 3.0.0 - resolution: "renderkid@npm:3.0.0" - dependencies: - css-select: ^4.1.3 - dom-converter: ^0.2.0 - htmlparser2: ^6.1.0 - lodash: ^4.17.21 - strip-ansi: ^6.0.1 - checksum: 77162b62d6f33ab81f337c39efce0439ff0d1f6d441e29c35183151f83041c7850774fb904da163d6c844264d440d10557714e6daa0b19e4561a5cd4ef305d41 - languageName: node - linkType: hard - -"repeat-string@npm:^1.5.4": - version: 1.6.1 - resolution: "repeat-string@npm:1.6.1" - checksum: 1b809fc6db97decdc68f5b12c4d1a671c8e3f65ec4a40c238bc5200e44e85bcc52a54f78268ab9c29fcf5fe4f1343e805420056d1f30fa9a9ee4c2d93e3cc6c0 - languageName: node - linkType: hard - -"replace-ext@npm:1.0.0": - version: 1.0.0 - resolution: "replace-ext@npm:1.0.0" - checksum: 123e5c28046e4f0b82e1cdedb0340058d362ddbd8e17d98e5068bbacc3b3b397b4d8e3c69d603f9c4c0f6a6494852064396570c44f9426a4673dba63850fab34 - languageName: node - linkType: hard - -"replace-ext@npm:^1.0.0": - version: 1.0.1 - resolution: "replace-ext@npm:1.0.1" - checksum: 4994ea1aaa3d32d152a8d98ff638988812c4fa35ba55485630008fe6f49e3384a8a710878e6fd7304b42b38d1b64c1cd070e78ece411f327735581a79dd88571 - languageName: node - linkType: hard - -"replace-ext@npm:^2.0.0": - version: 2.0.0 - resolution: "replace-ext@npm:2.0.0" - checksum: ed640ac90d24cce4be977642847d138908d430049cc097633be33b072143515cc7d29699675a0c35f6dc3c3c73cb529ed352d59649cf15931740eb31ae083c1e - languageName: node - linkType: hard - -"request-progress@npm:^3.0.0": - version: 3.0.0 - resolution: "request-progress@npm:3.0.0" - dependencies: - throttleit: ^1.0.0 - checksum: 6ea1761dcc8a8b7b5894afd478c0286aa31bd69438d7050294bd4fd0d0b3e09b5cde417d38deef9c49809039c337d8744e4bb49d8632b0c3e4ffa5e8a687e0fd - languageName: node - linkType: hard - -"require-directory@npm:^2.1.1": - version: 2.1.1 - resolution: "require-directory@npm:2.1.1" - checksum: fb47e70bf0001fdeabdc0429d431863e9475e7e43ea5f94ad86503d918423c1543361cc5166d713eaa7029dd7a3d34775af04764bebff99ef413111a5af18c80 - languageName: node - linkType: hard - -"require-from-string@npm:^2.0.2": - version: 2.0.2 - resolution: "require-from-string@npm:2.0.2" - checksum: a03ef6895445f33a4015300c426699bc66b2b044ba7b670aa238610381b56d3f07c686251740d575e22f4c87531ba662d06937508f0f3c0f1ddc04db3130560b - languageName: node - linkType: hard - -"require-like@npm:>= 0.1.1": - version: 0.1.2 - resolution: "require-like@npm:0.1.2" - checksum: edb8331f05fd807381a75b76f6cca9f0ce8acaa2e910b7e116541799aa970bfbc64fde5fd6adb3a6917dba346f8386ebbddb81614c24e8dad1b4290c7af9535e - languageName: node - linkType: hard - -"require-main-filename@npm:^2.0.0": - version: 2.0.0 - resolution: "require-main-filename@npm:2.0.0" - checksum: e9e294695fea08b076457e9ddff854e81bffbe248ed34c1eec348b7abbd22a0d02e8d75506559e2265e96978f3c4720bd77a6dad84755de8162b357eb6c778c7 - languageName: node - linkType: hard - -"require-package-name@npm:^2.0.1": - version: 2.0.1 - resolution: "require-package-name@npm:2.0.1" - checksum: 00f4e9e467ebe2bbced2b4198a165de11c83b5ee9f4c20b05a8782659b92bcb544dbd50be9a3eed746d05ecd875453e258c079eb3a79604b50a27cf8ab0798b5 - languageName: node - linkType: hard - -"requireg@npm:^0.2.2": - version: 0.2.2 - resolution: "requireg@npm:0.2.2" - dependencies: - nested-error-stacks: ~2.0.1 - rc: ~1.2.7 - resolve: ~1.7.1 - checksum: 99b420a02e7272717153cdf75891cbb133c02c04b287721eb1bdb0668b6a98aa1da38c08d8148fc8b1443a668d939eeb622d390538ac8da17b18a977ebe998ae - languageName: node - linkType: hard - -"requireindex@npm:^1.2.0": - version: 1.2.0 - resolution: "requireindex@npm:1.2.0" - checksum: 50d8b10a1ff1fdf6aea7a1870bc7bd238b0fb1917d8d7ca17fd03afc38a65dcd7a8a4eddd031f89128b5f0065833d5c92c4fef67f2c04e8624057fe626c9cf94 - languageName: node - linkType: hard - -"requireindex@npm:~1.1.0": - version: 1.1.0 - resolution: "requireindex@npm:1.1.0" - checksum: 397057d97d7f753a3851abf0d6db94c295bd8254536f71f622b896ba08ea8c0d3e3771c8b009a557e6ce602f4245c0588836cdf59c4ce588fff721a7b855d323 - languageName: node - linkType: hard - -"requirejs-config-file@npm:^4.0.0": - version: 4.0.0 - resolution: "requirejs-config-file@npm:4.0.0" - dependencies: - esprima: ^4.0.0 - stringify-object: ^3.2.1 - checksum: 61ac1c419a8978df9484211827047f0a43d48a97e242ebca9628a2e52da8c739ee068bd67dc4d5dc5fd7be6d1c9a863006bb02df691c86914921fe12713fbebb - languageName: node - linkType: hard - -"requirejs@npm:^2.3.5": - version: 2.3.6 - resolution: "requirejs@npm:2.3.6" - bin: - r.js: ./bin/r.js - r_js: ./bin/r.js - checksum: 7c3c006bf5e1887d93ac7adb7f600328918d23cf3d28282a505a2873d4ddde499c7ec560e55cee3440d17fe1205cb4dcb72b07f35b39e8940372eca850e49b62 - languageName: node - linkType: hard - -"requires-port@npm:^1.0.0": - version: 1.0.0 - resolution: "requires-port@npm:1.0.0" - checksum: eee0e303adffb69be55d1a214e415cf42b7441ae858c76dfc5353148644f6fd6e698926fc4643f510d5c126d12a705e7c8ed7e38061113bdf37547ab356797ff - languageName: node - linkType: hard - -"reselect@npm:^4.1.7": - version: 4.1.8 - resolution: "reselect@npm:4.1.8" - checksum: a4ac87cedab198769a29be92bc221c32da76cfdad6911eda67b4d3e7136dca86208c3b210e31632eae31ebd2cded18596f0dd230d3ccc9e978df22f233b5583e - languageName: node - linkType: hard - -"resize-observer-polyfill@npm:1.5.1": - version: 1.5.1 - resolution: "resize-observer-polyfill@npm:1.5.1" - checksum: 57e7f79489867b00ba43c9c051524a5c8f162a61d5547e99333549afc23e15c44fd43f2f318ea0261ea98c0eb3158cca261e6f48d66e1ed1cd1f340a43977094 - languageName: node - linkType: hard - -"resolve-alpn@npm:^1.0.0": - version: 1.2.1 - resolution: "resolve-alpn@npm:1.2.1" - checksum: f558071fcb2c60b04054c99aebd572a2af97ef64128d59bef7ab73bd50d896a222a056de40ffc545b633d99b304c259ea9d0c06830d5c867c34f0bfa60b8eae0 - languageName: node - linkType: hard - -"resolve-cwd@npm:^3.0.0": - version: 3.0.0 - resolution: "resolve-cwd@npm:3.0.0" - dependencies: - resolve-from: ^5.0.0 - checksum: 546e0816012d65778e580ad62b29e975a642989108d9a3c5beabfb2304192fa3c9f9146fbdfe213563c6ff51975ae41bac1d3c6e047dd9572c94863a057b4d81 - languageName: node - linkType: hard - -"resolve-dependency-path@npm:^2.0.0": - version: 2.0.0 - resolution: "resolve-dependency-path@npm:2.0.0" - checksum: 161296969a0a7853ebb7710847154ffb5bd11a51c370b67a0d0c89cacfcb57063d204587617fd030ea227bfd19a3c4af79d39e9d20ae0fbe354c27598d1ea8a8 - languageName: node - linkType: hard - -"resolve-dir@npm:^1.0.0, resolve-dir@npm:^1.0.1": - version: 1.0.1 - resolution: "resolve-dir@npm:1.0.1" - dependencies: - expand-tilde: ^2.0.0 - global-modules: ^1.0.0 - checksum: ef736b8ed60d6645c3b573da17d329bfb50ec4e1d6c5ffd6df49e3497acef9226f9810ea6823b8ece1560e01dcb13f77a9f6180d4f242d00cc9a8f4de909c65c - languageName: node - linkType: hard - -"resolve-from@npm:5.0.0, resolve-from@npm:^5.0.0": - version: 5.0.0 - resolution: "resolve-from@npm:5.0.0" - checksum: 4ceeb9113e1b1372d0cd969f3468fa042daa1dd9527b1b6bb88acb6ab55d8b9cd65dbf18819f9f9ddf0db804990901dcdaade80a215e7b2c23daae38e64f5bdf - languageName: node - linkType: hard - -"resolve-from@npm:^3.0.0": - version: 3.0.0 - resolution: "resolve-from@npm:3.0.0" - checksum: fff9819254d2d62b57f74e5c2ca9c0bdd425ca47287c4d801bc15f947533148d858229ded7793b0f59e61e49e782fffd6722048add12996e1bd4333c29669062 - languageName: node - linkType: hard - -"resolve-from@npm:^4.0.0": - version: 4.0.0 - resolution: "resolve-from@npm:4.0.0" - checksum: f4ba0b8494846a5066328ad33ef8ac173801a51739eb4d63408c847da9a2e1c1de1e6cbbf72699211f3d13f8fc1325648b169bd15eb7da35688e30a5fb0e4a7f - languageName: node - linkType: hard - -"resolve-global@npm:1.0.0, resolve-global@npm:^1.0.0": - version: 1.0.0 - resolution: "resolve-global@npm:1.0.0" - dependencies: - global-dirs: ^0.1.1 - checksum: c4e11d33e84bde7516b824503ffbe4b6cce863d5ce485680fd3db997b7c64da1df98321b1fd0703b58be8bc9bc83bc96bd83043f96194386b45eb47229efb6b6 - languageName: node - linkType: hard - -"resolve-options@npm:^1.1.0": - version: 1.1.0 - resolution: "resolve-options@npm:1.1.0" - dependencies: - value-or-function: ^3.0.0 - checksum: 437813d9418b49e52c367b980b6b48b3ea1ea39105aac97c39f104724abb6cda224ed92ebf12499cf00993589d38c8195eb2be730d0ba8b45df9bdf7cec65b33 - languageName: node - linkType: hard - -"resolve-pkg-maps@npm:^1.0.0": - version: 1.0.0 - resolution: "resolve-pkg-maps@npm:1.0.0" - checksum: 1012afc566b3fdb190a6309cc37ef3b2dcc35dff5fa6683a9d00cd25c3247edfbc4691b91078c97adc82a29b77a2660c30d791d65dab4fc78bfc473f60289977 - languageName: node - linkType: hard - -"resolve-url-loader@npm:^4.0.0": - version: 4.0.0 - resolution: "resolve-url-loader@npm:4.0.0" - dependencies: - adjust-sourcemap-loader: ^4.0.0 - convert-source-map: ^1.7.0 - loader-utils: ^2.0.0 - postcss: ^7.0.35 - source-map: 0.6.1 - peerDependencies: - rework: 1.0.1 - rework-visit: 1.0.0 - peerDependenciesMeta: - rework: - optional: true - rework-visit: - optional: true - checksum: 8e5bcf97867a5e128b6b86988d445b7fbd1214f7c5c0214332f835e8607438e153d9b3899799a03ddd03540254bb591e572feb330981a4478be934f6f045c925 - languageName: node - linkType: hard - -"resolve-workspace-root@npm:^2.0.0": - version: 2.0.0 - resolution: "resolve-workspace-root@npm:2.0.0" - checksum: c7222391a35ecb3514fa04d753334a86f984d8ffe06ce87506582c4c5671ac608273b8f5e6faa2055be6e196785bf751ede9a48d484de53889d721b814c097ab - languageName: node - linkType: hard - -"resolve.exports@npm:^1.1.0": - version: 1.1.1 - resolution: "resolve.exports@npm:1.1.1" - checksum: 485aa10082eb388a569d696e17ad7b16f4186efc97dd34eadd029d95b811f21ffee13b1b733198bb4584dbb3cb296aa6f141835221fb7613b9606b84f1386655 - languageName: node - linkType: hard - -"resolve.exports@npm:^2.0.0, resolve.exports@npm:^2.0.2": - version: 2.0.2 - resolution: "resolve.exports@npm:2.0.2" - checksum: 1c7778ca1b86a94f8ab4055d196c7d87d1874b96df4d7c3e67bbf793140f0717fd506dcafd62785b079cd6086b9264424ad634fb904409764c3509c3df1653f2 - languageName: node - linkType: hard - -"resolve@npm:1.22.4": - version: 1.22.4 - resolution: "resolve@npm:1.22.4" - dependencies: - is-core-module: ^2.13.0 - path-parse: ^1.0.7 - supports-preserve-symlinks-flag: ^1.0.0 - bin: - resolve: bin/resolve - checksum: 23f25174c2736ce24c6d918910e0d1f89b6b38fefa07a995dff864acd7863d59a7f049e691f93b4b2ee29696303390d921552b6d1b841ed4a8101f517e1d0124 - languageName: node - linkType: hard - -"resolve@patch:resolve@npm%3A1.22.4#~builtin": - version: 1.22.4 - resolution: "resolve@patch:resolve@npm%3A1.22.4#~builtin::version=1.22.4&hash=07638b" - dependencies: - is-core-module: ^2.13.0 - path-parse: ^1.0.7 - supports-preserve-symlinks-flag: ^1.0.0 - bin: - resolve: bin/resolve - checksum: c45f2545fdc4d21883861b032789e20aa67a2f2692f68da320cc84d5724cd02f2923766c5354b3210897e88f1a7b3d6d2c7c22faeead8eed7078e4c783a444bc - languageName: node - linkType: hard - -"response-iterator@npm:^0.2.6": - version: 0.2.6 - resolution: "response-iterator@npm:0.2.6" - checksum: b0db3c0665a0d698d65512951de9623c086b9c84ce015a76076d4bd0bf733779601d0b41f0931d16ae38132fba29e1ce291c1f8e6550fc32daaa2dc3ab4f338d - languageName: node - linkType: hard - -"responselike@npm:^1.0.2": - version: 1.0.2 - resolution: "responselike@npm:1.0.2" - dependencies: - lowercase-keys: ^1.0.0 - checksum: 2e9e70f1dcca3da621a80ce71f2f9a9cad12c047145c6ece20df22f0743f051cf7c73505e109814915f23f9e34fb0d358e22827723ee3d56b623533cab8eafcd - languageName: node - linkType: hard - -"responselike@npm:^2.0.0": - version: 2.0.1 - resolution: "responselike@npm:2.0.1" - dependencies: - lowercase-keys: ^2.0.0 - checksum: b122535466e9c97b55e69c7f18e2be0ce3823c5d47ee8de0d9c0b114aa55741c6db8bfbfce3766a94d1272e61bfb1ebf0a15e9310ac5629fbb7446a861b4fd3a - languageName: node - linkType: hard - -"restore-cursor@npm:^2.0.0": - version: 2.0.0 - resolution: "restore-cursor@npm:2.0.0" - dependencies: - onetime: ^2.0.0 - signal-exit: ^3.0.2 - checksum: 482e13d02d834b6e5e3aa90304a8b5e840775d6f06916cc92a50038adf9f098dcc72405b567da8a37e137ae40ad3e31896fa3136ae62f7a426c2fbf53d036536 - languageName: node - linkType: hard - -"restore-cursor@npm:^3.1.0": - version: 3.1.0 - resolution: "restore-cursor@npm:3.1.0" - dependencies: - onetime: ^5.1.0 - signal-exit: ^3.0.2 - checksum: f877dd8741796b909f2a82454ec111afb84eb45890eb49ac947d87991379406b3b83ff9673a46012fca0d7844bb989f45cc5b788254cf1a39b6b5a9659de0630 - languageName: node - linkType: hard - -"restore-cursor@npm:^4.0.0": - version: 4.0.0 - resolution: "restore-cursor@npm:4.0.0" - dependencies: - onetime: ^5.1.0 - signal-exit: ^3.0.2 - checksum: 5b675c5a59763bf26e604289eab35711525f11388d77f409453904e1e69c0d37ae5889295706b2c81d23bd780165084d040f9b68fffc32cc921519031c4fa4af - languageName: node - linkType: hard - -"retry-request@npm:^7.0.0": - version: 7.0.2 - resolution: "retry-request@npm:7.0.2" - dependencies: - "@types/request": ^2.48.8 - extend: ^3.0.2 - teeny-request: ^9.0.0 - checksum: 2d7307422333f548e5f40524978a344b62193714f6209c4f6a41057ae279804eb9bc8e0a277791e7b6f2d5d76068bdaca8590662a909cf1e6cfc3ab789e4c6b6 - languageName: node - linkType: hard - -"retry@npm:0.12.0, retry@npm:^0.12.0": - version: 0.12.0 - resolution: "retry@npm:0.12.0" - checksum: 623bd7d2e5119467ba66202d733ec3c2e2e26568074923bc0585b6b99db14f357e79bdedb63cab56cec47491c4a0da7e6021a7465ca6dc4f481d3898fdd3158c - languageName: node - linkType: hard - -"retry@npm:^0.13.1": - version: 0.13.1 - resolution: "retry@npm:0.13.1" - checksum: 47c4d5be674f7c13eee4cfe927345023972197dbbdfba5d3af7e461d13b44de1bfd663bfc80d2f601f8ef3fc8164c16dd99655a221921954a65d044a2fc1233b - languageName: node - linkType: hard - -"reusify@npm:^1.0.4": - version: 1.0.4 - resolution: "reusify@npm:1.0.4" - checksum: c3076ebcc22a6bc252cb0b9c77561795256c22b757f40c0d8110b1300723f15ec0fc8685e8d4ea6d7666f36c79ccc793b1939c748bf36f18f542744a4e379fcc - languageName: node - linkType: hard - -"rfdc@npm:^1.3.0": - version: 1.3.0 - resolution: "rfdc@npm:1.3.0" - checksum: fb2ba8512e43519983b4c61bd3fa77c0f410eff6bae68b08614437bc3f35f91362215f7b4a73cbda6f67330b5746ce07db5dd9850ad3edc91271ad6deea0df32 - languageName: node - linkType: hard - -"rimraf@npm:^2.5.4, rimraf@npm:^2.6.3": - version: 2.7.1 - resolution: "rimraf@npm:2.7.1" - dependencies: - glob: ^7.1.3 - bin: - rimraf: ./bin.js - checksum: cdc7f6eacb17927f2a075117a823e1c5951792c6498ebcce81ca8203454a811d4cf8900314154d3259bb8f0b42ab17f67396a8694a54cae3283326e57ad250cd - languageName: node - linkType: hard - -"rimraf@npm:^3.0.0, rimraf@npm:^3.0.2": - version: 3.0.2 - resolution: "rimraf@npm:3.0.2" - dependencies: - glob: ^7.1.3 - bin: - rimraf: bin.js - checksum: 87f4164e396f0171b0a3386cc1877a817f572148ee13a7e113b238e48e8a9f2f31d009a92ec38a591ff1567d9662c6b67fd8818a2dbbaed74bc26a87a2a4a9a0 - languageName: node - linkType: hard - -"rimraf@npm:~2.4.0": - version: 2.4.5 - resolution: "rimraf@npm:2.4.5" - dependencies: - glob: ^6.0.1 - bin: - rimraf: ./bin.js - checksum: 036793b4055d65344ad7bea73c3f4095640af7455478fe56c19783619463e6bb4374ab3556b9e6d4d6d3dd210eb677b0955ece38813e734c294fd2687201151d - languageName: node - linkType: hard - -"rimraf@npm:~2.6.2": - version: 2.6.3 - resolution: "rimraf@npm:2.6.3" - dependencies: - glob: ^7.1.3 - bin: - rimraf: ./bin.js - checksum: 3ea587b981a19016297edb96d1ffe48af7e6af69660e3b371dbfc73722a73a0b0e9be5c88089fbeeb866c389c1098e07f64929c7414290504b855f54f901ab10 - languageName: node - linkType: hard - -"ripemd160@npm:^2.0.0, ripemd160@npm:^2.0.1": - version: 2.0.2 - resolution: "ripemd160@npm:2.0.2" - dependencies: - hash-base: ^3.0.0 - inherits: ^2.0.1 - checksum: 006accc40578ee2beae382757c4ce2908a826b27e2b079efdcd2959ee544ddf210b7b5d7d5e80467807604244e7388427330f5c6d4cd61e6edaddc5773ccc393 - languageName: node - linkType: hard - -"rlp@npm:^2.2.3": - version: 2.2.7 - resolution: "rlp@npm:2.2.7" - dependencies: - bn.js: ^5.2.0 - bin: - rlp: bin/rlp - checksum: 3db4dfe5c793f40ac7e0be689a1f75d05e6f2ca0c66189aeb62adab8c436b857ab4420a419251ee60370d41d957a55698fc5e23ab1e1b41715f33217bc4bb558 - languageName: node - linkType: hard - -"roarr@npm:^2.15.3": - version: 2.15.4 - resolution: "roarr@npm:2.15.4" - dependencies: - boolean: ^3.0.1 - detect-node: ^2.0.4 - globalthis: ^1.0.1 - json-stringify-safe: ^5.0.1 - semver-compare: ^1.0.0 - sprintf-js: ^1.1.2 - checksum: 682e28d5491e3ae99728a35ba188f4f0ccb6347dbd492f95dc9f4bfdfe8ee63d8203ad234766ee2db88c8d7a300714304976eb095ce5c9366fe586c03a21586c - languageName: node - linkType: hard - -"robust-predicates@npm:^3.0.0": - version: 3.0.2 - resolution: "robust-predicates@npm:3.0.2" - checksum: 36854c1321548ceca96d36ad9d6e0a5a512986029ec6929ad6ed3ec1612c22cc8b46cc72d2c5674af42e8074a119d793f6f0ea3a5b51373e3ab926c64b172d7a - languageName: node - linkType: hard - -"rollup-plugin-inject@npm:^3.0.0": - version: 3.0.2 - resolution: "rollup-plugin-inject@npm:3.0.2" - dependencies: - estree-walker: ^0.6.1 - magic-string: ^0.25.3 - rollup-pluginutils: ^2.8.1 - checksum: a014972c80fe34b8c8154056fa2533a8440066a31de831e3793fc21b15d108d92c22d8f7f472397bd5783d7c5e04d8cbf112fb72c5a26e997726e4eb090edad1 - languageName: node - linkType: hard - -"rollup-plugin-node-polyfills@npm:^0.2.1": - version: 0.2.1 - resolution: "rollup-plugin-node-polyfills@npm:0.2.1" - dependencies: - rollup-plugin-inject: ^3.0.0 - checksum: e84645212c443aca3cfae2ba69f01c6d8c5c250f0bf651416b69a4572b60aae9da7cdd687de3ab9b903f7a1ab96b06b71f0c4927d1b02a37485360d2b563937b - languageName: node - linkType: hard - -"rollup-plugin-terser@npm:^7.0.0": - version: 7.0.2 - resolution: "rollup-plugin-terser@npm:7.0.2" - dependencies: - "@babel/code-frame": ^7.10.4 - jest-worker: ^26.2.1 - serialize-javascript: ^4.0.0 - terser: ^5.0.0 - peerDependencies: - rollup: ^2.0.0 - checksum: af84bb7a7a894cd00852b6486528dfb8653cf94df4c126f95f389a346f401d054b08c46bee519a2ab6a22b33804d1d6ac6d8c90b1b2bf8fffb097eed73fc3c72 - languageName: node - linkType: hard - -"rollup-plugin-visualizer@npm:^5.9.2": - version: 5.14.0 - resolution: "rollup-plugin-visualizer@npm:5.14.0" - dependencies: - open: ^8.4.0 - picomatch: ^4.0.2 - source-map: ^0.7.4 - yargs: ^17.5.1 - peerDependencies: - rolldown: 1.x - rollup: 2.x || 3.x || 4.x - peerDependenciesMeta: - rolldown: - optional: true - rollup: - optional: true - bin: - rollup-plugin-visualizer: dist/bin/cli.js - checksum: 8ef5b05c91bd74bc1bb536609dd0ef2f1995066ec623393d192d638c209620fd2318c902d185ae648873d0a2788131cbaec11595c91322f0c2661ef6a1cc7e42 - languageName: node - linkType: hard - -"rollup-pluginutils@npm:^2.8.1": - version: 2.8.2 - resolution: "rollup-pluginutils@npm:2.8.2" - dependencies: - estree-walker: ^0.6.1 - checksum: 339fdf866d8f4ff6e408fa274c0525412f7edb01dc46b5ccda51f575b7e0d20ad72965773376fb5db95a77a7fcfcab97bf841ec08dbadf5d6b08af02b7a2cf5e - languageName: node - linkType: hard - -"rollup@npm:^2.43.1": - version: 2.79.2 - resolution: "rollup@npm:2.79.2" - dependencies: - fsevents: ~2.3.2 - dependenciesMeta: - fsevents: - optional: true - bin: - rollup: dist/bin/rollup - checksum: df7aa4c8b95245dede157b06ab71e1921de6080757d30e9bf31f8fb142064d12dda865e2bafbab4349588f43425b2965a290c9a5da1c048246a70fc21734ebd7 - languageName: node - linkType: hard - -"rollup@npm:^3.27.1": - version: 3.29.4 - resolution: "rollup@npm:3.29.4" - dependencies: - fsevents: ~2.3.2 - dependenciesMeta: - fsevents: - optional: true - bin: - rollup: dist/bin/rollup - checksum: 8bb20a39c8d91130825159c3823eccf4dc2295c9a0a5c4ed851a5bf2167dbf24d9a29f23461a54c955e5506395e6cc188eafc8ab0e20399d7489fb33793b184e - languageName: node - linkType: hard - -"rsvp@npm:^4.8.2": - version: 4.8.5 - resolution: "rsvp@npm:4.8.5" - checksum: 2d8ef30d8febdf05bdf856ccca38001ae3647e41835ca196bc1225333f79b94ae44def733121ca549ccc36209c9b689f6586905e2a043873262609744da8efc1 - languageName: node - linkType: hard - -"rsvp@npm:~3.2.1": - version: 3.2.1 - resolution: "rsvp@npm:3.2.1" - checksum: e2ac49cbe35b8c2701b07698066d7cd8004115b070f3352d45759dfcd820fa57e687230331ba41f5a40e1871789cbf122de6e73559598777a0b18b66953dc09b - languageName: node - linkType: hard - -"rtl-detect@npm:^1.0.2": - version: 1.1.2 - resolution: "rtl-detect@npm:1.1.2" - checksum: 4a43a1e5df0617eb86d5485640b318787d12b86acf53d840a3b2ff701ee941e95479d4e9ae97e907569ec763d1c47218cb87639bc87bcdad60a85747e5270cf0 - languageName: node - linkType: hard - -"run-async@npm:^2.4.0": - version: 2.4.1 - resolution: "run-async@npm:2.4.1" - checksum: a2c88aa15df176f091a2878eb840e68d0bdee319d8d97bbb89112223259cebecb94bc0defd735662b83c2f7a30bed8cddb7d1674eb48ae7322dc602b22d03797 - languageName: node - linkType: hard - -"run-parallel@npm:^1.1.9": - version: 1.2.0 - resolution: "run-parallel@npm:1.2.0" - dependencies: - queue-microtask: ^1.2.2 - checksum: cb4f97ad25a75ebc11a8ef4e33bb962f8af8516bb2001082ceabd8902e15b98f4b84b4f8a9b222e5d57fc3bd1379c483886ed4619367a7680dad65316993021d - languageName: node - linkType: hard - -"rw@npm:1": - version: 1.3.3 - resolution: "rw@npm:1.3.3" - checksum: c20d82421f5a71c86a13f76121b751553a99cd4a70ea27db86f9b23f33db941f3f06019c30f60d50c356d0bd674c8e74764ac146ea55e217c091bde6fba82aa3 - languageName: node - linkType: hard - -"rxjs@npm:^6.6.7": - version: 6.6.7 - resolution: "rxjs@npm:6.6.7" - dependencies: - tslib: ^1.9.0 - checksum: bc334edef1bb8bbf56590b0b25734ba0deaf8825b703256a93714308ea36dff8a11d25533671adf8e104e5e8f256aa6fdfe39b2e248cdbd7a5f90c260acbbd1b - languageName: node - linkType: hard - -"rxjs@npm:^7.5.1, rxjs@npm:^7.5.5, rxjs@npm:^7.8.0, rxjs@npm:^7.8.1": - version: 7.8.1 - resolution: "rxjs@npm:7.8.1" - dependencies: - tslib: ^2.1.0 - checksum: de4b53db1063e618ec2eca0f7965d9137cabe98cf6be9272efe6c86b47c17b987383df8574861bcced18ebd590764125a901d5506082be84a8b8e364bf05f119 - languageName: node - linkType: hard - -"safe-array-concat@npm:^1.1.2": - version: 1.1.2 - resolution: "safe-array-concat@npm:1.1.2" - dependencies: - call-bind: ^1.0.7 - get-intrinsic: ^1.2.4 - has-symbols: ^1.0.3 - isarray: ^2.0.5 - checksum: a3b259694754ddfb73ae0663829e396977b99ff21cbe8607f35a469655656da8e271753497e59da8a7575baa94d2e684bea3e10ddd74ba046c0c9b4418ffa0c4 - languageName: node - linkType: hard - -"safe-buffer@npm:5.1.2, safe-buffer@npm:~5.1.0, safe-buffer@npm:~5.1.1": - version: 5.1.2 - resolution: "safe-buffer@npm:5.1.2" - checksum: f2f1f7943ca44a594893a852894055cf619c1fbcb611237fc39e461ae751187e7baf4dc391a72125e0ac4fb2d8c5c0b3c71529622e6a58f46b960211e704903c - languageName: node - linkType: hard - -"safe-buffer@npm:5.2.1, safe-buffer@npm:>=5.1.0, safe-buffer@npm:^5.0.1, safe-buffer@npm:^5.1.0, safe-buffer@npm:^5.1.1, safe-buffer@npm:^5.1.2, safe-buffer@npm:^5.2.0, safe-buffer@npm:^5.2.1, safe-buffer@npm:~5.2.0": - version: 5.2.1 - resolution: "safe-buffer@npm:5.2.1" - checksum: b99c4b41fdd67a6aaf280fcd05e9ffb0813654894223afb78a31f14a19ad220bba8aba1cb14eddce1fcfb037155fe6de4e861784eb434f7d11ed58d1e70dd491 - languageName: node - linkType: hard - -"safe-json-stringify@npm:~1": - version: 1.2.0 - resolution: "safe-json-stringify@npm:1.2.0" - checksum: 5bb32db6d6a3ceb3752df51f4043a412419cd3d4fcd5680a865dfa34cd7e575ba659c077d13f52981ced084061df9c75c7fb12e391584d4264e6914c1cd3d216 - languageName: node - linkType: hard - -"safe-regex-test@npm:^1.0.3": - version: 1.0.3 - resolution: "safe-regex-test@npm:1.0.3" - dependencies: - call-bind: ^1.0.6 - es-errors: ^1.3.0 - is-regex: ^1.1.4 - checksum: 6c7d392ff1ae7a3ae85273450ed02d1d131f1d2c76e177d6b03eb88e6df8fa062639070e7d311802c1615f351f18dc58f9454501c58e28d5ffd9b8f502ba6489 - languageName: node - linkType: hard - -"safe-regex@npm:^2.1.1": - version: 2.1.1 - resolution: "safe-regex@npm:2.1.1" - dependencies: - regexp-tree: ~0.1.1 - checksum: 5d734e2193c63ef0cb00f60c0244e0f8a30ecb31923633cd34636808d6a7c4c206d650017953ae1db8bc33967c2f06af33488dea6f038f4e38212beb7bed77b4 - languageName: node - linkType: hard - -"safe-stable-stringify@npm:^2.1.0": - version: 2.4.2 - resolution: "safe-stable-stringify@npm:2.4.2" - checksum: 0324ba2e40f78cae63e31a02b1c9bdf1b786621f9e8760845608eb9e81aef401944ac2078e5c9c1533cf516aea34d08fa8052ca853637ced84b791caaf1e394e - languageName: node - linkType: hard - -"safer-buffer@npm:>= 2.1.2 < 3, safer-buffer@npm:>= 2.1.2 < 3.0.0, safer-buffer@npm:^2.0.2, safer-buffer@npm:^2.1.0, safer-buffer@npm:~2.1.0": - version: 2.1.2 - resolution: "safer-buffer@npm:2.1.2" - checksum: cab8f25ae6f1434abee8d80023d7e72b598cf1327164ddab31003c51215526801e40b66c5e65d658a0af1e9d6478cadcb4c745f4bd6751f97d8644786c0978b0 - languageName: node - linkType: hard - -"sanitize.css@npm:*": - version: 13.0.0 - resolution: "sanitize.css@npm:13.0.0" - checksum: a99ca77c4d135800a4a93c3555e5aa4a2eb040a833df716dbe9132e1f2086fbf9acdb8021a579f40dcf77166d2d50f3358b4b6121a247d26fed5a0e6f5af3bb7 - languageName: node - linkType: hard - -"sass-loader@npm:^12.3.0": - version: 12.6.0 - resolution: "sass-loader@npm:12.6.0" - dependencies: - klona: ^2.0.4 - neo-async: ^2.6.2 - peerDependencies: - fibers: ">= 3.1.0" - node-sass: ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 - sass: ^1.3.0 - sass-embedded: "*" - webpack: ^5.0.0 - peerDependenciesMeta: - fibers: - optional: true - node-sass: - optional: true - sass: - optional: true - sass-embedded: - optional: true - checksum: 5d73a428588150f704016aa27397941bb9246cecd2ee083b573e95d969fc080ac6a16f2fe1cc64aca08f6e70da6f3c586ee68f0efc9f527fecc360e5f1c299ec - languageName: node - linkType: hard - -"sass-lookup@npm:^3.0.0": - version: 3.0.0 - resolution: "sass-lookup@npm:3.0.0" - dependencies: - commander: ^2.16.0 - bin: - sass-lookup: bin/cli.js - checksum: fd4bf1ad9c54111617dec30dd90aff083e87c96aef50aff6cec443ad2fbbfa65da09f6e67a7e5ef99fa39dff65c937dc7358f18d319e083c6031f21def85ce6d - languageName: node - linkType: hard - -"satori@npm:0.10.1": - version: 0.10.1 - resolution: "satori@npm:0.10.1" - dependencies: - "@shuding/opentype.js": 1.4.0-beta.0 - css-background-parser: ^0.1.0 - css-box-shadow: 1.0.0-3 - css-to-react-native: ^3.0.0 - emoji-regex: ^10.2.1 - escape-html: ^1.0.3 - linebreak: ^1.1.0 - parse-css-color: ^0.2.1 - postcss-value-parser: ^4.2.0 - yoga-wasm-web: ^0.3.3 - checksum: fd6df0f80002bb1387bbec413f0d07414c1c1d6825abecf79a59f17283ca87db88c6928898ff494230946b9ee4773e389e71e6c4ed8ce5964323ef3baf2ed884 - languageName: node - linkType: hard - -"sax@npm:>=0.6.0, sax@npm:~1.2.4": - version: 1.2.4 - resolution: "sax@npm:1.2.4" - checksum: d3df7d32b897a2c2f28e941f732c71ba90e27c24f62ee918bd4d9a8cfb3553f2f81e5493c7f0be94a11c1911b643a9108f231dd6f60df3fa9586b5d2e3e9e1fe - languageName: node - linkType: hard - -"saxes@npm:^6.0.0": - version: 6.0.0 - resolution: "saxes@npm:6.0.0" - dependencies: - xmlchars: ^2.2.0 - checksum: d3fa3e2aaf6c65ed52ee993aff1891fc47d5e47d515164b5449cbf5da2cbdc396137e55590472e64c5c436c14ae64a8a03c29b9e7389fc6f14035cf4e982ef3b - languageName: node - linkType: hard - -"scheduler@npm:0.24.0-canary-efb381bbf-20230505": - version: 0.24.0-canary-efb381bbf-20230505 - resolution: "scheduler@npm:0.24.0-canary-efb381bbf-20230505" - dependencies: - loose-envify: ^1.1.0 - checksum: 232149125c10f10193b1340ec4bbf14a8e6a845152790d6fd6f58207642db801abdb5a21227561a0a93871b98ba47539a6233b4e6155aae72d6db6db9f9f09b3 - languageName: node - linkType: hard - -"scheduler@npm:^0.21.0": - version: 0.21.0 - resolution: "scheduler@npm:0.21.0" - dependencies: - loose-envify: ^1.1.0 - checksum: 4f8285076041ed2c81acdd1faa987f1655fdbd30554bc667c1ea64743fc74fb3a04ca7d27454b3d678735df5a230137a3b84756061b43dc5796e80701b66d124 - languageName: node - linkType: hard - -"scheduler@npm:^0.23.2": - version: 0.23.2 - resolution: "scheduler@npm:0.23.2" - dependencies: - loose-envify: ^1.1.0 - checksum: 3e82d1f419e240ef6219d794ff29c7ee415fbdc19e038f680a10c067108e06284f1847450a210b29bbaf97b9d8a97ced5f624c31c681248ac84c80d56ad5a2c4 - languageName: node - linkType: hard - -"schema-utils@npm:2.7.0": - version: 2.7.0 - resolution: "schema-utils@npm:2.7.0" - dependencies: - "@types/json-schema": ^7.0.4 - ajv: ^6.12.2 - ajv-keywords: ^3.4.1 - checksum: 8889325b0ee1ae6a8f5d6aaa855c71e136ebbb7fd731b01a9d3ec8225dcb245f644c47c50104db4c741983b528cdff8558570021257d4d397ec6aaecd9172a8e - languageName: node - linkType: hard - -"schema-utils@npm:^2.6.5": - version: 2.7.1 - resolution: "schema-utils@npm:2.7.1" - dependencies: - "@types/json-schema": ^7.0.5 - ajv: ^6.12.4 - ajv-keywords: ^3.5.2 - checksum: 32c62fc9e28edd101e1bd83453a4216eb9bd875cc4d3775e4452b541908fa8f61a7bbac8ffde57484f01d7096279d3ba0337078e85a918ecbeb72872fb09fb2b - languageName: node - linkType: hard - -"schema-utils@npm:^3.0.0, schema-utils@npm:^3.1.1, schema-utils@npm:^3.2.0": - version: 3.3.0 - resolution: "schema-utils@npm:3.3.0" - dependencies: - "@types/json-schema": ^7.0.8 - ajv: ^6.12.5 - ajv-keywords: ^3.5.2 - checksum: ea56971926fac2487f0757da939a871388891bc87c6a82220d125d587b388f1704788f3706e7f63a7b70e49fc2db974c41343528caea60444afd5ce0fe4b85c0 - languageName: node - linkType: hard - -"schema-utils@npm:^4.0.0, schema-utils@npm:^4.2.0": - version: 4.2.0 - resolution: "schema-utils@npm:4.2.0" - dependencies: - "@types/json-schema": ^7.0.9 - ajv: ^8.9.0 - ajv-formats: ^2.1.1 - ajv-keywords: ^5.1.0 - checksum: 26a0463d47683258106e6652e9aeb0823bf0b85843039e068b57da1892f7ae6b6b1094d48e9ed5ba5cbe9f7166469d880858b9d91abe8bd249421eb813850cde - languageName: node - linkType: hard - -"scrypt-js@npm:3.0.1, scrypt-js@npm:^3.0.0": - version: 3.0.1 - resolution: "scrypt-js@npm:3.0.1" - checksum: b7c7d1a68d6ca946f2fbb0778e0c4ec63c65501b54023b2af7d7e9f48fdb6c6580d6f7675cd53bda5944c5ebc057560d5a6365079752546865defb3b79dea454 - languageName: node - linkType: hard - -"scuid@npm:^1.1.0": - version: 1.1.0 - resolution: "scuid@npm:1.1.0" - checksum: cd094ac3718b0070a222f9a499b280c698fdea10268cc163fa244421099544c1766dd893fdee0e2a8eba5d53ab9d0bcb11067bedff166665030fa6fda25a096b - languageName: node - linkType: hard - -"secp256k1@npm:^4.0.1": - version: 4.0.2 - resolution: "secp256k1@npm:4.0.2" - dependencies: - elliptic: ^6.5.2 - node-addon-api: ^2.0.0 - node-gyp: latest - node-gyp-build: ^4.2.0 - checksum: 0d0d42e8033aee5aec5caaaa26d90fcaec4bf5e24dc4652552ddaa60734c2d95e90f7d95697b521fe833363c629d5ff623227961de86686c7a0ed5b5ffc1ebd0 - languageName: node - linkType: hard - -"secp256k1@npm:^5.0.1": - version: 5.0.1 - resolution: "secp256k1@npm:5.0.1" - dependencies: - elliptic: ^6.5.7 - node-addon-api: ^5.0.0 - node-gyp: latest - node-gyp-build: ^4.2.0 - checksum: e21fb801502fe03a233f04c294cfdf16bd6087c36caa6514ccc5eac38ebd5ff50090a59d0ee7d50adf87f6d508a8211d09b905290fac97b4d43751967b7dfd9e - languageName: node - linkType: hard - -"select-hose@npm:^2.0.0": - version: 2.0.0 - resolution: "select-hose@npm:2.0.0" - checksum: d7e5fcc695a4804209d232a1b18624a5134be334d4e1114b0721f7a5e72bd73da483dcf41528c1af4f4f4892ad7cfd6a1e55c8ffb83f9c9fe723b738db609dbb - languageName: node - linkType: hard - -"selfsigned@npm:^2.0.1, selfsigned@npm:^2.1.1, selfsigned@npm:^2.4.1": - version: 2.4.1 - resolution: "selfsigned@npm:2.4.1" - dependencies: - "@types/node-forge": ^1.3.0 - node-forge: ^1 - checksum: 38b91c56f1d7949c0b77f9bbe4545b19518475cae15e7d7f0043f87b1626710b011ce89879a88969651f650a19d213bb15b7d5b4c2877df9eeeff7ba8f8b9bfa - languageName: node - linkType: hard - -"sembear@npm:^0.5.0": - version: 0.5.2 - resolution: "sembear@npm:0.5.2" - dependencies: - "@types/semver": ^6.0.1 - semver: ^6.3.0 - checksum: 365e5557e5a9b0fe2e107609fec4f2a9c8c43ac547efb64eba536fd9d68f2452db05129a604fa6eaf2de000a99ed2b3e7895669331eca0213fb39f09a1ee6a0a - languageName: node - linkType: hard - -"semver-compare@npm:^1.0.0": - version: 1.0.0 - resolution: "semver-compare@npm:1.0.0" - checksum: dd1d7e2909744cf2cf71864ac718efc990297f9de2913b68e41a214319e70174b1d1793ac16e31183b128c2b9812541300cb324db8168e6cf6b570703b171c68 - languageName: node - linkType: hard - -"semver-diff@npm:^2.0.0": - version: 2.1.0 - resolution: "semver-diff@npm:2.1.0" - dependencies: - semver: ^5.0.3 - checksum: 14e50363d12ac7e77c2dd89319d97f9ec075ed8ee7ab1bde867b30f8e890fffd637dd90c7c2559e2431278d555b8bc6abc5796bb40b734cea267631c9501827c - languageName: node - linkType: hard - -"semver@npm:7.5.2": - version: 7.5.2 - resolution: "semver@npm:7.5.2" - dependencies: - lru-cache: ^6.0.0 - bin: - semver: bin/semver.js - checksum: 3fdf5d1e6f170fe8bcc41669e31787649af91af7f54f05c71d0865bb7aa27e8b92f68b3e6b582483e2c1c648008bc84249d2cd86301771fe5cbf7621d1fe5375 - languageName: node - linkType: hard - -"send@npm:0.18.0": - version: 0.18.0 - resolution: "send@npm:0.18.0" - dependencies: - debug: 2.6.9 - depd: 2.0.0 - destroy: 1.2.0 - encodeurl: ~1.0.2 - escape-html: ~1.0.3 - etag: ~1.8.1 - fresh: 0.5.2 - http-errors: 2.0.0 - mime: 1.6.0 - ms: 2.1.3 - on-finished: 2.4.1 - range-parser: ~1.2.1 - statuses: 2.0.1 - checksum: 74fc07ebb58566b87b078ec63e5a3e41ecd987e4272ba67b7467e86c6ad51bc6b0b0154133b6d8b08a2ddda360464f71382f7ef864700f34844a76c8027817a8 - languageName: node - linkType: hard - -"send@npm:^0.19.0": - version: 0.19.1 - resolution: "send@npm:0.19.1" - dependencies: - debug: 2.6.9 - depd: 2.0.0 - destroy: 1.2.0 - encodeurl: ~2.0.0 - escape-html: ~1.0.3 - etag: ~1.8.1 - fresh: 0.5.2 - http-errors: 2.0.0 - mime: 1.6.0 - ms: 2.1.3 - on-finished: 2.4.1 - range-parser: ~1.2.1 - statuses: 2.0.1 - checksum: 2a1991c8ac23a9b47c4477fbed056f1e4503ef683c669e9113303f793965c42f462d763755378eef9ad8b8c0e0cfbcf7789e2e517fa8d7451bc2cf8b3feca01e - languageName: node - linkType: hard - -"sentence-case@npm:^3.0.4": - version: 3.0.4 - resolution: "sentence-case@npm:3.0.4" - dependencies: - no-case: ^3.0.4 - tslib: ^2.0.3 - upper-case-first: ^2.0.2 - checksum: 3cfe6c0143e649132365695706702d7f729f484fa7b25f43435876efe7af2478243eefb052bacbcce10babf9319fd6b5b6bc59b94c80a1c819bcbb40651465d5 - languageName: node - linkType: hard - -"serialize-error@npm:^2.1.0": - version: 2.1.0 - resolution: "serialize-error@npm:2.1.0" - checksum: 28464a6f65e6becd6e49fb782aff06573fdbf3d19f161a20228179842fed05c75a34110e54c3ee020b00240f9e11d8bee9b9fee5d04e0bc0bef1fdbf2baa297e - languageName: node - linkType: hard - -"serialize-error@npm:^7.0.1": - version: 7.0.1 - resolution: "serialize-error@npm:7.0.1" - dependencies: - type-fest: ^0.13.1 - checksum: e0aba4dca2fc9fe74ae1baf38dbd99190e1945445a241ba646290f2176cdb2032281a76443b02ccf0caf30da5657d510746506368889a593b9835a497fc0732e - languageName: node - linkType: hard - -"serialize-javascript@npm:6.0.0": - version: 6.0.0 - resolution: "serialize-javascript@npm:6.0.0" - dependencies: - randombytes: ^2.1.0 - checksum: 56f90b562a1bdc92e55afb3e657c6397c01a902c588c0fe3d4c490efdcc97dcd2a3074ba12df9e94630f33a5ce5b76a74784a7041294628a6f4306e0ec84bf93 - languageName: node - linkType: hard - -"serialize-javascript@npm:^4.0.0": - version: 4.0.0 - resolution: "serialize-javascript@npm:4.0.0" - dependencies: - randombytes: ^2.1.0 - checksum: 3273b3394b951671fcf388726e9577021870dfbf85e742a1183fb2e91273e6101bdccea81ff230724f6659a7ee4cef924b0ff9baca32b79d9384ec37caf07302 - languageName: node - linkType: hard - -"serialize-javascript@npm:^6.0.0, serialize-javascript@npm:^6.0.1": - version: 6.0.1 - resolution: "serialize-javascript@npm:6.0.1" - dependencies: - randombytes: ^2.1.0 - checksum: 3c4f4cb61d0893b988415bdb67243637333f3f574e9e9cc9a006a2ced0b390b0b3b44aef8d51c951272a9002ec50885eefdc0298891bc27eb2fe7510ea87dc4f - languageName: node - linkType: hard - -"serve-handler@npm:6.1.6": - version: 6.1.6 - resolution: "serve-handler@npm:6.1.6" - dependencies: - bytes: 3.0.0 - content-disposition: 0.5.2 - mime-types: 2.1.18 - minimatch: 3.1.2 - path-is-inside: 1.0.2 - path-to-regexp: 3.3.0 - range-parser: 1.2.0 - checksum: eb26201e699ac4694fb16f9aaf932330f6b1159e9d9496261baa23caf1e81322afcfd2b5f5f2b306b133298c03a8395a3c13b56fde5d70b331014b3a5ab7217f - languageName: node - linkType: hard - -"serve-index@npm:^1.9.1": - version: 1.9.1 - resolution: "serve-index@npm:1.9.1" - dependencies: - accepts: ~1.3.4 - batch: 0.6.1 - debug: 2.6.9 - escape-html: ~1.0.3 - http-errors: ~1.6.2 - mime-types: ~2.1.17 - parseurl: ~1.3.2 - checksum: e2647ce13379485b98a53ba2ea3fbad4d44b57540d00663b02b976e426e6194d62ac465c0d862cb7057f65e0de8ab8a684aa095427a4b8612412eca0d300d22f - languageName: node - linkType: hard - -"serve-static@npm:1.15.0, serve-static@npm:^1.13.1": - version: 1.15.0 - resolution: "serve-static@npm:1.15.0" - dependencies: - encodeurl: ~1.0.2 - escape-html: ~1.0.3 - parseurl: ~1.3.3 - send: 0.18.0 - checksum: af57fc13be40d90a12562e98c0b7855cf6e8bd4c107fe9a45c212bf023058d54a1871b1c89511c3958f70626fff47faeb795f5d83f8cf88514dbaeb2b724464d - languageName: node - linkType: hard - -"serve@npm:14.2.4": - version: 14.2.4 - resolution: "serve@npm:14.2.4" - dependencies: - "@zeit/schemas": 2.36.0 - ajv: 8.12.0 - arg: 5.0.2 - boxen: 7.0.0 - chalk: 5.0.1 - chalk-template: 0.4.0 - clipboardy: 3.0.0 - compression: 1.7.4 - is-port-reachable: 4.0.0 - serve-handler: 6.1.6 - update-check: 1.5.4 - bin: - serve: build/main.js - checksum: 9d396609214d6d368e95943cd556be76a6918d8522b401115a109fa8e40e1b8740d55cc930b9ee2980540da852c7d54750d00d232b903c88c6471c504c55e62c - languageName: node - linkType: hard - -"server-only@npm:^0.0.1": - version: 0.0.1 - resolution: "server-only@npm:0.0.1" - checksum: c432348956641ea3f460af8dc3765f3a1bdbcf7a1e0205b0756d868e6e6fe8934cdee6bff68401a1dd49ba4a831c75916517a877446d54b334f7de36fa273e53 - languageName: node - linkType: hard - -"set-blocking@npm:^2.0.0, set-blocking@npm:~2.0.0": - version: 2.0.0 - resolution: "set-blocking@npm:2.0.0" - checksum: 6e65a05f7cf7ebdf8b7c75b101e18c0b7e3dff4940d480efed8aad3a36a4005140b660fa1d804cb8bce911cac290441dc728084a30504d3516ac2ff7ad607b02 - languageName: node - linkType: hard - -"set-function-length@npm:^1.2.1": - version: 1.2.2 - resolution: "set-function-length@npm:1.2.2" - dependencies: - define-data-property: ^1.1.4 - es-errors: ^1.3.0 - function-bind: ^1.1.2 - get-intrinsic: ^1.2.4 - gopd: ^1.0.1 - has-property-descriptors: ^1.0.2 - checksum: a8248bdacdf84cb0fab4637774d9fb3c7a8e6089866d04c817583ff48e14149c87044ce683d7f50759a8c50fb87c7a7e173535b06169c87ef76f5fb276dfff72 - languageName: node - linkType: hard - -"set-function-name@npm:^2.0.1, set-function-name@npm:^2.0.2": - version: 2.0.2 - resolution: "set-function-name@npm:2.0.2" - dependencies: - define-data-property: ^1.1.4 - es-errors: ^1.3.0 - functions-have-names: ^1.2.3 - has-property-descriptors: ^1.0.2 - checksum: d6229a71527fd0404399fc6227e0ff0652800362510822a291925c9d7b48a1ca1a468b11b281471c34cd5a2da0db4f5d7ff315a61d26655e77f6e971e6d0c80f - languageName: node - linkType: hard - -"set-value@npm:^4.1.0": - version: 4.1.0 - resolution: "set-value@npm:4.1.0" - dependencies: - is-plain-object: ^2.0.4 - is-primitive: ^3.0.1 - checksum: 2b4f0f222538ae4c1f4171a5014c113649631c86ed81d1ac0c2df406d0a974d8006412ce1d7844c531268f1c66eb912f7eae7245ab3114e34357f1ff9d6dc697 - languageName: node - linkType: hard - -"setimmediate@npm:^1.0.4, setimmediate@npm:^1.0.5": - version: 1.0.5 - resolution: "setimmediate@npm:1.0.5" - checksum: c9a6f2c5b51a2dabdc0247db9c46460152ffc62ee139f3157440bd48e7c59425093f42719ac1d7931f054f153e2d26cf37dfeb8da17a794a58198a2705e527fd - languageName: node - linkType: hard - -"setprototypeof@npm:1.1.0": - version: 1.1.0 - resolution: "setprototypeof@npm:1.1.0" - checksum: 27cb44304d6c9e1a23bc6c706af4acaae1a7aa1054d4ec13c05f01a99fd4887109a83a8042b67ad90dbfcd100d43efc171ee036eb080667172079213242ca36e - languageName: node - linkType: hard - -"setprototypeof@npm:1.2.0": - version: 1.2.0 - resolution: "setprototypeof@npm:1.2.0" - checksum: be18cbbf70e7d8097c97f713a2e76edf84e87299b40d085c6bf8b65314e994cc15e2e317727342fa6996e38e1f52c59720b53fe621e2eb593a6847bf0356db89 - languageName: node - linkType: hard - -"sha.js@npm:^2.4.0, sha.js@npm:^2.4.11, sha.js@npm:^2.4.8": - version: 2.4.11 - resolution: "sha.js@npm:2.4.11" - dependencies: - inherits: ^2.0.1 - safe-buffer: ^5.0.1 - bin: - sha.js: ./bin.js - checksum: ebd3f59d4b799000699097dadb831c8e3da3eb579144fd7eb7a19484cbcbb7aca3c68ba2bb362242eb09e33217de3b4ea56e4678184c334323eca24a58e3ad07 - languageName: node - linkType: hard - -"sha1-file@npm:^1.0.4": - version: 1.0.4 - resolution: "sha1-file@npm:1.0.4" - checksum: d27cd0297c7be7bb08cb77e78a3825b9e5b6f4715b4679db47b42769f41f331ee4be3678cdf94502e2544199fe8ee619dfbc5481c4347f04eeaea4aa112f7a4e - languageName: node - linkType: hard - -"shallow-clone@npm:^1.0.0": - version: 1.0.0 - resolution: "shallow-clone@npm:1.0.0" - dependencies: - is-extendable: ^0.1.1 - kind-of: ^5.0.0 - mixin-object: ^2.0.1 - checksum: d4fd93b82d9fdd135027510f4beb04479de96c50b5392a17b022cf0942d17d43bff92aa83dfc30ddf962c0ed015e7c686c2ce677b85760ca5a8db9ebd5f1d791 - languageName: node - linkType: hard - -"shallow-clone@npm:^3.0.0": - version: 3.0.1 - resolution: "shallow-clone@npm:3.0.1" - dependencies: - kind-of: ^6.0.2 - checksum: 39b3dd9630a774aba288a680e7d2901f5c0eae7b8387fc5c8ea559918b29b3da144b7bdb990d7ccd9e11be05508ac9e459ce51d01fd65e583282f6ffafcba2e7 - languageName: node - linkType: hard - -"shallowequal@npm:^1.1.0": - version: 1.1.0 - resolution: "shallowequal@npm:1.1.0" - checksum: f4c1de0837f106d2dbbfd5d0720a5d059d1c66b42b580965c8f06bb1db684be8783538b684092648c981294bf817869f743a066538771dbecb293df78f765e00 - languageName: node - linkType: hard - -"sharp@npm:^0.32.6": - version: 0.32.6 - resolution: "sharp@npm:0.32.6" - dependencies: - color: ^4.2.3 - detect-libc: ^2.0.2 - node-addon-api: ^6.1.0 - node-gyp: latest - prebuild-install: ^7.1.1 - semver: ^7.5.4 - simple-get: ^4.0.1 - tar-fs: ^3.0.4 - tunnel-agent: ^0.6.0 - checksum: 0cca1d16b1920800c0e22d27bc6305f4c67c9ebe44f67daceb30bf645ae39e7fb7dfbd7f5d6cd9f9eebfddd87ac3f7e2695f4eb906d19b7a775286238e6a29fc - languageName: node - linkType: hard - -"shebang-command@npm:^1.2.0": - version: 1.2.0 - resolution: "shebang-command@npm:1.2.0" - dependencies: - shebang-regex: ^1.0.0 - checksum: 9eed1750301e622961ba5d588af2212505e96770ec376a37ab678f965795e995ade7ed44910f5d3d3cb5e10165a1847f52d3348c64e146b8be922f7707958908 - languageName: node - linkType: hard - -"shebang-command@npm:^2.0.0": - version: 2.0.0 - resolution: "shebang-command@npm:2.0.0" - dependencies: - shebang-regex: ^3.0.0 - checksum: 6b52fe87271c12968f6a054e60f6bde5f0f3d2db483a1e5c3e12d657c488a15474121a1d55cd958f6df026a54374ec38a4a963988c213b7570e1d51575cea7fa - languageName: node - linkType: hard - -"shebang-regex@npm:^1.0.0": - version: 1.0.0 - resolution: "shebang-regex@npm:1.0.0" - checksum: 404c5a752cd40f94591dfd9346da40a735a05139dac890ffc229afba610854d8799aaa52f87f7e0c94c5007f2c6af55bdcaeb584b56691926c5eaf41dc8f1372 - languageName: node - linkType: hard - -"shebang-regex@npm:^3.0.0": - version: 3.0.0 - resolution: "shebang-regex@npm:3.0.0" - checksum: 1a2bcae50de99034fcd92ad4212d8e01eedf52c7ec7830eedcf886622804fe36884278f2be8be0ea5fde3fd1c23911643a4e0f726c8685b61871c8908af01222 - languageName: node - linkType: hard - -"shell-quote@npm:^1.6.1, shell-quote@npm:^1.7.3, shell-quote@npm:^1.8.1": - version: 1.8.1 - resolution: "shell-quote@npm:1.8.1" - checksum: 5f01201f4ef504d4c6a9d0d283fa17075f6770bfbe4c5850b074974c68062f37929ca61700d95ad2ac8822e14e8c4b990ca0e6e9272e64befd74ce5e19f0736b - languageName: node - linkType: hard - -"shelljs@npm:^0.8.4": - version: 0.8.5 - resolution: "shelljs@npm:0.8.5" - dependencies: - glob: ^7.0.0 - interpret: ^1.0.0 - rechoir: ^0.6.2 - bin: - shjs: bin/shjs - checksum: 7babc46f732a98f4c054ec1f048b55b9149b98aa2da32f6cf9844c434b43c6251efebd6eec120937bd0999e13811ebd45efe17410edb3ca938f82f9381302748 - languageName: node - linkType: hard - -"side-channel@npm:^1.0.4, side-channel@npm:^1.0.6": - version: 1.0.6 - resolution: "side-channel@npm:1.0.6" - dependencies: - call-bind: ^1.0.7 - es-errors: ^1.3.0 - get-intrinsic: ^1.2.4 - object-inspect: ^1.13.1 - checksum: bfc1afc1827d712271453e91b7cd3878ac0efd767495fd4e594c4c2afaa7963b7b510e249572bfd54b0527e66e4a12b61b80c061389e129755f34c493aad9b97 - languageName: node - linkType: hard - -"signal-exit@npm:^3.0.0, signal-exit@npm:^3.0.2, signal-exit@npm:^3.0.3, signal-exit@npm:^3.0.7": - version: 3.0.7 - resolution: "signal-exit@npm:3.0.7" - checksum: a2f098f247adc367dffc27845853e9959b9e88b01cb301658cfe4194352d8d2bb32e18467c786a7fe15f1d44b233ea35633d076d5e737870b7139949d1ab6318 - languageName: node - linkType: hard - -"signal-exit@npm:^4.0.1, signal-exit@npm:^4.1.0": - version: 4.1.0 - resolution: "signal-exit@npm:4.1.0" - checksum: 64c757b498cb8629ffa5f75485340594d2f8189e9b08700e69199069c8e3070fb3e255f7ab873c05dc0b3cec412aea7402e10a5990cb6a050bd33ba062a6c549 - languageName: node - linkType: hard - -"signedsource@npm:^1.0.0": - version: 1.0.0 - resolution: "signedsource@npm:1.0.0" - checksum: 64b2c8d7a48de9009cfd3aff62bb7c88abf3b8e0421f17ebb1d7f5ca9cc9c3ad10f5a1e3ae6cd804e4e6121c87b668202ae9057065f058ddfbf34ea65f63945d - languageName: node - linkType: hard - -"simple-concat@npm:^1.0.0": - version: 1.0.1 - resolution: "simple-concat@npm:1.0.1" - checksum: 4d211042cc3d73a718c21ac6c4e7d7a0363e184be6a5ad25c8a1502e49df6d0a0253979e3d50dbdd3f60ef6c6c58d756b5d66ac1e05cda9cacd2e9fc59e3876a - languageName: node - linkType: hard - -"simple-get@npm:^4.0.0, simple-get@npm:^4.0.1": - version: 4.0.1 - resolution: "simple-get@npm:4.0.1" - dependencies: - decompress-response: ^6.0.0 - once: ^1.3.1 - simple-concat: ^1.0.0 - checksum: e4132fd27cf7af230d853fa45c1b8ce900cb430dd0a3c6d3829649fe4f2b26574c803698076c4006450efb0fad2ba8c5455fbb5755d4b0a5ec42d4f12b31d27e - languageName: node - linkType: hard - -"simple-git@npm:3.16.0": - version: 3.16.0 - resolution: "simple-git@npm:3.16.0" - dependencies: - "@kwsites/file-exists": ^1.1.1 - "@kwsites/promise-deferred": ^1.1.1 - debug: ^4.3.4 - checksum: fd28eb43be39d158d2c321cd34eb00f61c365513478ff2bb31f4da06315dcd018e03c6ece9f99558f3fd8834171072850aed1376bf50f8d922b0e2dadede0c2d - languageName: node - linkType: hard - -"simple-plist@npm:^1.0.0, simple-plist@npm:^1.1.0": - version: 1.4.0 - resolution: "simple-plist@npm:1.4.0" - dependencies: - bplist-creator: 0.1.1 - bplist-parser: 0.3.2 - plist: ^3.0.5 - checksum: fa8086f6b781c289f1abad21306481dda4af6373b32a5d998a70e53c2b7218a1d21ebb5ae3e736baae704c21d311d3d39d01d0e6a2387eda01b4020b9ebd909e - languageName: node - linkType: hard - -"simple-swizzle@npm:^0.2.2": - version: 0.2.2 - resolution: "simple-swizzle@npm:0.2.2" - dependencies: - is-arrayish: ^0.3.1 - checksum: a7f3f2ab5c76c4472d5c578df892e857323e452d9f392e1b5cf74b74db66e6294a1e1b8b390b519fa1b96b5b613f2a37db6cffef52c3f1f8f3c5ea64eb2d54c0 - languageName: node - linkType: hard - -"sirv@npm:^2.0.3": - version: 2.0.4 - resolution: "sirv@npm:2.0.4" - dependencies: - "@polka/url": ^1.0.0-next.24 - mrmime: ^2.0.0 - totalist: ^3.0.0 - checksum: 6853384a51d6ee9377dd657e2b257e0e98b29abbfbfa6333e105197f0f100c8c56a4520b47028b04ab1833cf2312526206f38fcd4f891c6df453f40da1a15a57 - languageName: node - linkType: hard - -"sisteransi@npm:^1.0.5": - version: 1.0.5 - resolution: "sisteransi@npm:1.0.5" - checksum: aba6438f46d2bfcef94cf112c835ab395172c75f67453fe05c340c770d3c402363018ae1ab4172a1026a90c47eaccf3af7b6ff6fa749a680c2929bd7fa2b37a4 - languageName: node - linkType: hard - -"slash@npm:^3.0.0": - version: 3.0.0 - resolution: "slash@npm:3.0.0" - checksum: 94a93fff615f25a999ad4b83c9d5e257a7280c90a32a7cb8b4a87996e4babf322e469c42b7f649fd5796edd8687652f3fb452a86dc97a816f01113183393f11c - languageName: node - linkType: hard - -"slash@npm:^4.0.0": - version: 4.0.0 - resolution: "slash@npm:4.0.0" - checksum: da8e4af73712253acd21b7853b7e0dbba776b786e82b010a5bfc8b5051a1db38ed8aba8e1e8f400dd2c9f373be91eb1c42b66e91abb407ff42b10feece5e1d2d - languageName: node - linkType: hard - -"slash@npm:^5.0.0": - version: 5.1.0 - resolution: "slash@npm:5.1.0" - checksum: 70434b34c50eb21b741d37d455110258c42d2cf18c01e6518aeb7299f3c6e626330c889c0c552b5ca2ef54a8f5a74213ab48895f0640717cacefeef6830a1ba4 - languageName: node - linkType: hard - -"slice-ansi@npm:^2.0.0": - version: 2.1.0 - resolution: "slice-ansi@npm:2.1.0" - dependencies: - ansi-styles: ^3.2.0 - astral-regex: ^1.0.0 - is-fullwidth-code-point: ^2.0.0 - checksum: 4e82995aa59cef7eb03ef232d73c2239a15efa0ace87a01f3012ebb942e963fbb05d448ce7391efcd52ab9c32724164aba2086f5143e0445c969221dde3b6b1e - languageName: node - linkType: hard - -"slice-ansi@npm:^3.0.0": - version: 3.0.0 - resolution: "slice-ansi@npm:3.0.0" - dependencies: - ansi-styles: ^4.0.0 - astral-regex: ^2.0.0 - is-fullwidth-code-point: ^3.0.0 - checksum: 5ec6d022d12e016347e9e3e98a7eb2a592213a43a65f1b61b74d2c78288da0aded781f665807a9f3876b9daa9ad94f64f77d7633a0458876c3a4fdc4eb223f24 - languageName: node - linkType: hard - -"slice-ansi@npm:^4.0.0": - version: 4.0.0 - resolution: "slice-ansi@npm:4.0.0" - dependencies: - ansi-styles: ^4.0.0 - astral-regex: ^2.0.0 - is-fullwidth-code-point: ^3.0.0 - checksum: 4a82d7f085b0e1b070e004941ada3c40d3818563ac44766cca4ceadd2080427d337554f9f99a13aaeb3b4a94d9964d9466c807b3d7b7541d1ec37ee32d308756 - languageName: node - linkType: hard - -"slice-ansi@npm:^5.0.0": - version: 5.0.0 - resolution: "slice-ansi@npm:5.0.0" - dependencies: - ansi-styles: ^6.0.0 - is-fullwidth-code-point: ^4.0.0 - checksum: 7e600a2a55e333a21ef5214b987c8358fe28bfb03c2867ff2cbf919d62143d1812ac27b4297a077fdaf27a03da3678e49551c93e35f9498a3d90221908a1180e - languageName: node - linkType: hard - -"slugify@npm:^1.3.4, slugify@npm:^1.6.6": - version: 1.6.6 - resolution: "slugify@npm:1.6.6" - checksum: 04773c2d3b7aea8d2a61fa47cc7e5d29ce04e1a96cbaec409da57139df906acb3a449fac30b167d203212c806e73690abd4ff94fbad0a9a7b7ea109a2a638ae9 - languageName: node - linkType: hard - -"smart-buffer@npm:^4.2.0": - version: 4.2.0 - resolution: "smart-buffer@npm:4.2.0" - checksum: b5167a7142c1da704c0e3af85c402002b597081dd9575031a90b4f229ca5678e9a36e8a374f1814c8156a725d17008ae3bde63b92f9cfd132526379e580bec8b - languageName: node - linkType: hard - -"snake-case@npm:^3.0.4": - version: 3.0.4 - resolution: "snake-case@npm:3.0.4" - dependencies: - dot-case: ^3.0.4 - tslib: ^2.0.3 - checksum: 0a7a79900bbb36f8aaa922cf111702a3647ac6165736d5dc96d3ef367efc50465cac70c53cd172c382b022dac72ec91710608e5393de71f76d7142e6fd80e8a3 - languageName: node - linkType: hard - -"socket.io-client@npm:^4.5.1": - version: 4.7.5 - resolution: "socket.io-client@npm:4.7.5" - dependencies: - "@socket.io/component-emitter": ~3.1.0 - debug: ~4.3.2 - engine.io-client: ~6.5.2 - socket.io-parser: ~4.2.4 - checksum: a6994b93a753d14292682ee97ba3c925c54b63e6fcb2ed5e0aa1d7c1d6164ed4a30d993f7eaaa3017ddf868ad0a1ab996badc8310129070136d84668789ee6c9 - languageName: node - linkType: hard - -"socket.io-parser@npm:~4.2.4": - version: 4.2.4 - resolution: "socket.io-parser@npm:4.2.4" - dependencies: - "@socket.io/component-emitter": ~3.1.0 - debug: ~4.3.1 - checksum: 61540ef99af33e6a562b9effe0fad769bcb7ec6a301aba5a64b3a8bccb611a0abdbe25f469933ab80072582006a78ca136bf0ad8adff9c77c9953581285e2263 - languageName: node - linkType: hard - -"sockjs@npm:^0.3.24": - version: 0.3.24 - resolution: "sockjs@npm:0.3.24" - dependencies: - faye-websocket: ^0.11.3 - uuid: ^8.3.2 - websocket-driver: ^0.7.4 - checksum: 355309b48d2c4e9755349daa29cea1c0d9ee23e49b983841c6bf7a20276b00d3c02343f9f33f26d2ee8b261a5a02961b52a25c8da88b2538c5b68d3071b4934c - languageName: node - linkType: hard - -"socks-proxy-agent@npm:^7.0.0": - version: 7.0.0 - resolution: "socks-proxy-agent@npm:7.0.0" - dependencies: - agent-base: ^6.0.2 - debug: ^4.3.3 - socks: ^2.6.2 - checksum: 720554370154cbc979e2e9ce6a6ec6ced205d02757d8f5d93fe95adae454fc187a5cbfc6b022afab850a5ce9b4c7d73e0f98e381879cf45f66317a4895953846 - languageName: node - linkType: hard - -"socks-proxy-agent@npm:^8.0.2, socks-proxy-agent@npm:^8.0.4": - version: 8.0.4 - resolution: "socks-proxy-agent@npm:8.0.4" - dependencies: - agent-base: ^7.1.1 - debug: ^4.3.4 - socks: ^2.8.3 - checksum: b2ec5051d85fe49072f9a250c427e0e9571fd09d5db133819192d078fd291276e1f0f50f6dbc04329b207738b1071314cee8bdbb4b12e27de42dbcf1d4233c67 - languageName: node - linkType: hard - -"socks@npm:^2.6.2, socks@npm:^2.8.3": - version: 2.8.3 - resolution: "socks@npm:2.8.3" - dependencies: - ip-address: ^9.0.5 - smart-buffer: ^4.2.0 - checksum: 7a6b7f6eedf7482b9e4597d9a20e09505824208006ea8f2c49b71657427f3c137ca2ae662089baa73e1971c62322d535d9d0cf1c9235cf6f55e315c18203eadd - languageName: node - linkType: hard - -"solc@npm:0.8.26": - version: 0.8.26 - resolution: "solc@npm:0.8.26" - dependencies: - command-exists: ^1.2.8 - commander: ^8.1.0 - follow-redirects: ^1.12.1 - js-sha3: 0.8.0 - memorystream: ^0.3.1 - semver: ^5.5.0 - tmp: 0.0.33 - bin: - solcjs: solc.js - checksum: e3eaeac76e60676377b357af8f3919d4c8c6a74b74112b49279fe8c74a3dfa1de8afe4788689fc307453bde336edc8572988d2cf9e909f84d870420eb640400c - languageName: node - linkType: hard - -"sonic-boom@npm:^2.2.1": - version: 2.8.0 - resolution: "sonic-boom@npm:2.8.0" - dependencies: - atomic-sleep: ^1.0.0 - checksum: c7f9c89f931d7f60f8e0741551a729f0d81e6dc407a99420fc847a9a4c25af048a615b1188ab3c4f1fb3708fe4904973ddab6ebcc8ed5b78b50ab81a99045910 - languageName: node - linkType: hard - -"sort-keys@npm:^5.0.0": - version: 5.0.0 - resolution: "sort-keys@npm:5.0.0" - dependencies: - is-plain-obj: ^4.0.0 - checksum: 9c0b7a468312075be03770b260b2cc0e5d55149025e564edaed41c9ff619199698aad6712a6fe4bbc75c541efb081276ac6bbd4cf2723d742f272f7a8fe354f5 - languageName: node - linkType: hard - -"source-list-map@npm:^2.0.0, source-list-map@npm:^2.0.1": - version: 2.0.1 - resolution: "source-list-map@npm:2.0.1" - checksum: 806efc6f75e7cd31e4815e7a3aaf75a45c704871ea4075cb2eb49882c6fca28998f44fc5ac91adb6de03b2882ee6fb02f951fdc85e6a22b338c32bfe19557938 - languageName: node - linkType: hard - -"source-map-explorer@npm:2.5.3": - version: 2.5.3 - resolution: "source-map-explorer@npm:2.5.3" - dependencies: - btoa: ^1.2.1 - chalk: ^4.1.0 - convert-source-map: ^1.7.0 - ejs: ^3.1.5 - escape-html: ^1.0.3 - glob: ^7.1.6 - gzip-size: ^6.0.0 - lodash: ^4.17.20 - open: ^7.3.1 - source-map: ^0.7.4 - temp: ^0.9.4 - yargs: ^16.2.0 - bin: - sme: bin/cli.js - source-map-explorer: bin/cli.js - checksum: 1d4e619d7eb224f38a3dadfb20eb34a56cfc29bd237b4815b60257e7fe5ee9f791fda3e0bba91318e0f2beffec5cca573abb8b5030a95f305ce4abee93296065 - languageName: node - linkType: hard - -"source-map-js@npm:^1.0.1, source-map-js@npm:^1.0.2, source-map-js@npm:^1.2.1": - version: 1.2.1 - resolution: "source-map-js@npm:1.2.1" - checksum: 4eb0cd997cdf228bc253bcaff9340afeb706176e64868ecd20efbe6efea931465f43955612346d6b7318789e5265bdc419bc7669c1cebe3db0eb255f57efa76b - languageName: node - linkType: hard - -"source-map-loader@npm:^3.0.0": - version: 3.0.2 - resolution: "source-map-loader@npm:3.0.2" - dependencies: - abab: ^2.0.5 - iconv-lite: ^0.6.3 - source-map-js: ^1.0.1 - peerDependencies: - webpack: ^5.0.0 - checksum: d5a4e2ab190c93ae5cba68c247fbaa9fd560333c91060602b634c399a8a4b3205b8c07714c3bcdb0a11c6cc5476c06256bd8e824e71fbbb7981e8fad5cba4a00 - languageName: node - linkType: hard - -"source-map-support@npm:0.5.13": - version: 0.5.13 - resolution: "source-map-support@npm:0.5.13" - dependencies: - buffer-from: ^1.0.0 - source-map: ^0.6.0 - checksum: 933550047b6c1a2328599a21d8b7666507427c0f5ef5eaadd56b5da0fd9505e239053c66fe181bf1df469a3b7af9d775778eee283cbb7ae16b902ddc09e93a97 - languageName: node - linkType: hard - -"source-map-support@npm:0.5.21, source-map-support@npm:^0.5.13, source-map-support@npm:^0.5.16, source-map-support@npm:^0.5.21, source-map-support@npm:~0.5.20, source-map-support@npm:~0.5.21": - version: 0.5.21 - resolution: "source-map-support@npm:0.5.21" - dependencies: - buffer-from: ^1.0.0 - source-map: ^0.6.0 - checksum: 43e98d700d79af1d36f859bdb7318e601dfc918c7ba2e98456118ebc4c4872b327773e5a1df09b0524e9e5063bb18f0934538eace60cca2710d1fa687645d137 - languageName: node - linkType: hard - -"source-map@npm:0.5.6": - version: 0.5.6 - resolution: "source-map@npm:0.5.6" - checksum: 390b3f5165c9631a74fb6fb55ba61e62a7f9b7d4026ae0e2bfc2899c241d71c1bccb8731c496dc7f7cb79a5f523406eb03d8c5bebe8448ee3fc38168e2d209c8 - languageName: node - linkType: hard - -"source-map@npm:0.6.1, source-map@npm:^0.6.0, source-map@npm:^0.6.1, source-map@npm:~0.6.0, source-map@npm:~0.6.1": - version: 0.6.1 - resolution: "source-map@npm:0.6.1" - checksum: 59ce8640cf3f3124f64ac289012c2b8bd377c238e316fb323ea22fbfe83da07d81e000071d7242cad7a23cd91c7de98e4df8830ec3f133cb6133a5f6e9f67bc2 - languageName: node - linkType: hard - -"source-map@npm:^0.5.6, source-map@npm:^0.5.7": - version: 0.5.7 - resolution: "source-map@npm:0.5.7" - checksum: 5dc2043b93d2f194142c7f38f74a24670cd7a0063acdaf4bf01d2964b402257ae843c2a8fa822ad5b71013b5fcafa55af7421383da919752f22ff488bc553f4d - languageName: node - linkType: hard - -"source-map@npm:^0.7.3, source-map@npm:^0.7.4": - version: 0.7.4 - resolution: "source-map@npm:0.7.4" - checksum: 01cc5a74b1f0e1d626a58d36ad6898ea820567e87f18dfc9d24a9843a351aaa2ec09b87422589906d6ff1deed29693e176194dc88bcae7c9a852dc74b311dbf5 - languageName: node - linkType: hard - -"source-map@npm:^0.8.0-beta.0": - version: 0.8.0-beta.0 - resolution: "source-map@npm:0.8.0-beta.0" - dependencies: - whatwg-url: ^7.0.0 - checksum: e94169be6461ab0ac0913313ad1719a14c60d402bd22b0ad96f4a6cffd79130d91ab5df0a5336a326b04d2df131c1409f563c9dc0d21a6ca6239a44b6c8dbd92 - languageName: node - linkType: hard - -"sourcemap-codec@npm:^1.4.8": - version: 1.4.8 - resolution: "sourcemap-codec@npm:1.4.8" - checksum: b57981c05611afef31605732b598ccf65124a9fcb03b833532659ac4d29ac0f7bfacbc0d6c5a28a03e84c7510e7e556d758d0bb57786e214660016fb94279316 - languageName: node - linkType: hard - -"spawn-command@npm:0.0.2": - version: 0.0.2 - resolution: "spawn-command@npm:0.0.2" - checksum: e35c5d28177b4d461d33c88cc11f6f3a5079e2b132c11e1746453bbb7a0c0b8a634f07541a2a234fa4758239d88203b758def509161b651e81958894c0b4b64b - languageName: node - linkType: hard - -"spawndamnit@npm:^2.0.0": - version: 2.0.0 - resolution: "spawndamnit@npm:2.0.0" - dependencies: - cross-spawn: ^5.1.0 - signal-exit: ^3.0.2 - checksum: c74b5e264ee5bc13d55692fd422d74c282e4607eb04ac64d19d06796718d89b14921620fa4237ec5635e7acdff21461670ff19850f210225410a353cad0d7fed - languageName: node - linkType: hard - -"spdx-correct@npm:^3.0.0": - version: 3.1.1 - resolution: "spdx-correct@npm:3.1.1" - dependencies: - spdx-expression-parse: ^3.0.0 - spdx-license-ids: ^3.0.0 - checksum: 77ce438344a34f9930feffa61be0eddcda5b55fc592906ef75621d4b52c07400a97084d8701557b13f7d2aae0cb64f808431f469e566ef3fe0a3a131dcb775a6 - languageName: node - linkType: hard - -"spdx-exceptions@npm:^2.1.0": - version: 2.3.0 - resolution: "spdx-exceptions@npm:2.3.0" - checksum: cb69a26fa3b46305637123cd37c85f75610e8c477b6476fa7354eb67c08128d159f1d36715f19be6f9daf4b680337deb8c65acdcae7f2608ba51931540687ac0 - languageName: node - linkType: hard - -"spdx-expression-parse@npm:^3.0.0": - version: 3.0.1 - resolution: "spdx-expression-parse@npm:3.0.1" - dependencies: - spdx-exceptions: ^2.1.0 - spdx-license-ids: ^3.0.0 - checksum: a1c6e104a2cbada7a593eaa9f430bd5e148ef5290d4c0409899855ce8b1c39652bcc88a725259491a82601159d6dc790bedefc9016c7472f7de8de7361f8ccde - languageName: node - linkType: hard - -"spdx-license-ids@npm:^3.0.0": - version: 3.0.11 - resolution: "spdx-license-ids@npm:3.0.11" - checksum: 1da1acb090257773e60b022094050e810ae9fec874dc1461f65dc0400cd42dd830ab2df6e64fb49c2db3dce386dd0362110780e1b154db7c0bb413488836aaeb - languageName: node - linkType: hard - -"spdy-transport@npm:^3.0.0": - version: 3.0.0 - resolution: "spdy-transport@npm:3.0.0" - dependencies: - debug: ^4.1.0 - detect-node: ^2.0.4 - hpack.js: ^2.1.6 - obuf: ^1.1.2 - readable-stream: ^3.0.6 - wbuf: ^1.7.3 - checksum: 0fcaad3b836fb1ec0bdd39fa7008b9a7a84a553f12be6b736a2512613b323207ffc924b9551cef0378f7233c85916cff1118652e03a730bdb97c0e042243d56c - languageName: node - linkType: hard - -"spdy@npm:^4.0.2": - version: 4.0.2 - resolution: "spdy@npm:4.0.2" - dependencies: - debug: ^4.1.0 - handle-thing: ^2.0.0 - http-deceiver: ^1.2.7 - select-hose: ^2.0.0 - spdy-transport: ^3.0.0 - checksum: 2c739d0ff6f56ad36d2d754d0261d5ec358457bea7cbf77b1b05b0c6464f2ce65b85f196305f50b7bd9120723eb94bae9933466f28e67e5cd8cde4e27f1d75f8 - languageName: node - linkType: hard - -"split-on-first@npm:^1.0.0": - version: 1.1.0 - resolution: "split-on-first@npm:1.1.0" - checksum: 16ff85b54ddcf17f9147210a4022529b343edbcbea4ce977c8f30e38408b8d6e0f25f92cd35b86a524d4797f455e29ab89eb8db787f3c10708e0b47ebf528d30 - languageName: node - linkType: hard - -"split2@npm:^3.0.0": - version: 3.2.2 - resolution: "split2@npm:3.2.2" - dependencies: - readable-stream: ^3.0.0 - checksum: 8127ddbedd0faf31f232c0e9192fede469913aa8982aa380752e0463b2e31c2359ef6962eb2d24c125bac59eeec76873678d723b1c7ff696216a1cd071e3994a - languageName: node - linkType: hard - -"split2@npm:^4.0.0": - version: 4.1.0 - resolution: "split2@npm:4.1.0" - checksum: ec581597cb74c13cdfb5e2047543dd40cb1e8e9803c7b1e0c29ede05f2b4f049b2d6e7f2788a225d544549375719658b8f38e9366364dec35dc7a12edfda5ee5 - languageName: node - linkType: hard - -"split@npm:0.3": - version: 0.3.3 - resolution: "split@npm:0.3.3" - dependencies: - through: 2 - checksum: 2e076634c9637cfdc54ab4387b6a243b8c33b360874a25adf6f327a5647f07cb3bf1c755d515248eb3afee4e382278d01f62c62d87263c118f28065b86f74f02 - languageName: node - linkType: hard - -"split@npm:^1.0.1": - version: 1.0.1 - resolution: "split@npm:1.0.1" - dependencies: - through: 2 - checksum: 12f4554a5792c7e98bb3e22b53c63bfa5ef89aa704353e1db608a55b51f5b12afaad6e4a8ecf7843c15f273f43cdadd67b3705cc43d48a75c2cf4641d51f7e7a - languageName: node - linkType: hard - -"sponge-case@npm:^1.0.1": - version: 1.0.1 - resolution: "sponge-case@npm:1.0.1" - dependencies: - tslib: ^2.0.3 - checksum: 64f53d930f63c5a9e59d4cae487c1ffa87d25eab682833b01d572cc885e7e3fdbad4f03409a41f03ecb27f1f8959432253eb48332c7007c3388efddb24ba2792 - languageName: node - linkType: hard - -"sprintf-js@npm:^1.1.1, sprintf-js@npm:^1.1.2, sprintf-js@npm:^1.1.3": - version: 1.1.3 - resolution: "sprintf-js@npm:1.1.3" - checksum: a3fdac7b49643875b70864a9d9b469d87a40dfeaf5d34d9d0c5b1cda5fd7d065531fcb43c76357d62254c57184a7b151954156563a4d6a747015cfb41021cad0 - languageName: node - linkType: hard - -"sprintf-js@npm:~1.0.2": - version: 1.0.3 - resolution: "sprintf-js@npm:1.0.3" - checksum: 19d79aec211f09b99ec3099b5b2ae2f6e9cdefe50bc91ac4c69144b6d3928a640bb6ae5b3def70c2e85a2c3d9f5ec2719921e3a59d3ca3ef4b2fd1a4656a0df3 - languageName: node - linkType: hard - -"ssh2-streams@npm:0.4.10": - version: 0.4.10 - resolution: "ssh2-streams@npm:0.4.10" - dependencies: - asn1: ~0.2.0 - bcrypt-pbkdf: ^1.0.2 - streamsearch: ~0.1.2 - checksum: dad86d7aa83c08a8f57feedfda26f4032a3f5e605a1d2018da835ced4ebb003739962aa416066f374a006d941067e4215f8b84a8ec81e888156c9274445ae5db - languageName: node - linkType: hard - -"ssh2@npm:^1.15.0": - version: 1.15.0 - resolution: "ssh2@npm:1.15.0" - dependencies: - asn1: ^0.2.6 - bcrypt-pbkdf: ^1.0.2 - cpu-features: ~0.0.9 - nan: ^2.18.0 - dependenciesMeta: - cpu-features: - optional: true - nan: - optional: true - checksum: 56baa07dc0dd8d97aefa05033b8a95d220a34b2f203aa9116173d7adc5e9fd46be22d7cfed99cdd9f5548862ae44abd1ec136e20ea856d5c470a0df0e5aea9d1 - languageName: node - linkType: hard - -"sshpk@npm:1.16.1": - version: 1.16.1 - resolution: "sshpk@npm:1.16.1" - dependencies: - asn1: ~0.2.3 - assert-plus: ^1.0.0 - bcrypt-pbkdf: ^1.0.0 - dashdash: ^1.12.0 - ecc-jsbn: ~0.1.1 - getpass: ^0.1.1 - jsbn: ~0.1.0 - safer-buffer: ^2.0.2 - tweetnacl: ~0.14.0 - bin: - sshpk-conv: bin/sshpk-conv - sshpk-sign: bin/sshpk-sign - sshpk-verify: bin/sshpk-verify - checksum: 5e76afd1cedc780256f688b7c09327a8a650902d18e284dfeac97489a735299b03c3e72c6e8d22af03dbbe4d6f123fdfd5f3c4ed6bedbec72b9529a55051b857 - languageName: node - linkType: hard - -"sshpk@npm:^1.14.1": - version: 1.18.0 - resolution: "sshpk@npm:1.18.0" - dependencies: - asn1: ~0.2.3 - assert-plus: ^1.0.0 - bcrypt-pbkdf: ^1.0.0 - dashdash: ^1.12.0 - ecc-jsbn: ~0.1.1 - getpass: ^0.1.1 - jsbn: ~0.1.0 - safer-buffer: ^2.0.2 - tweetnacl: ~0.14.0 - bin: - sshpk-conv: bin/sshpk-conv - sshpk-sign: bin/sshpk-sign - sshpk-verify: bin/sshpk-verify - checksum: 01d43374eee3a7e37b3b82fdbecd5518cbb2e47ccbed27d2ae30f9753f22bd6ffad31225cb8ef013bc3fb7785e686cea619203ee1439a228f965558c367c3cfa - languageName: node - linkType: hard - -"ssri@npm:^10.0.0": - version: 10.0.6 - resolution: "ssri@npm:10.0.6" - dependencies: - minipass: ^7.0.3 - checksum: 4603d53a05bcd44188747d38f1cc43833b9951b5a1ee43ba50535bdfc5fe4a0897472dbe69837570a5417c3c073377ef4f8c1a272683b401857f72738ee57299 - languageName: node - linkType: hard - -"ssri@npm:^9.0.0": - version: 9.0.1 - resolution: "ssri@npm:9.0.1" - dependencies: - minipass: ^3.1.1 - checksum: fb58f5e46b6923ae67b87ad5ef1c5ab6d427a17db0bead84570c2df3cd50b4ceb880ebdba2d60726588272890bae842a744e1ecce5bd2a2a582fccd5068309eb - languageName: node - linkType: hard - -"stable-hash@npm:^0.0.4": - version: 0.0.4 - resolution: "stable-hash@npm:0.0.4" - checksum: 21c039d21c1cb739cf8342561753a5e007cb95ea682ccd452e76310bbb9c6987a89de8eda023e320b019f3e4691aabda75079cdbb7dadf7ab9013e931f2f23cd - languageName: node - linkType: hard - -"stable@npm:^0.1.8": - version: 0.1.8 - resolution: "stable@npm:0.1.8" - checksum: 2ff482bb100285d16dd75cd8f7c60ab652570e8952c0bfa91828a2b5f646a0ff533f14596ea4eabd48bb7f4aeea408dce8f8515812b975d958a4cc4fa6b9dfeb - languageName: node - linkType: hard - -"stack-generator@npm:^2.0.5": - version: 2.0.10 - resolution: "stack-generator@npm:2.0.10" - dependencies: - stackframe: ^1.3.4 - checksum: 4fc3978a934424218a0aa9f398034e1f78153d5ff4f4ff9c62478c672debb47dd58de05b09fc3900530cbb526d72c93a6e6c9353bacc698e3b1c00ca3dda0c47 - languageName: node - linkType: hard - -"stack-utils@npm:^2.0.3": - version: 2.0.6 - resolution: "stack-utils@npm:2.0.6" - dependencies: - escape-string-regexp: ^2.0.0 - checksum: 052bf4d25bbf5f78e06c1d5e67de2e088b06871fa04107ca8d3f0e9d9263326e2942c8bedee3545795fc77d787d443a538345eef74db2f8e35db3558c6f91ff7 - languageName: node - linkType: hard - -"stackframe@npm:^1.3.4": - version: 1.3.4 - resolution: "stackframe@npm:1.3.4" - checksum: bae1596873595c4610993fa84f86a3387d67586401c1816ea048c0196800c0646c4d2da98c2ee80557fd9eff05877efe33b91ba6cd052658ed96ddc85d19067d + import-fresh: ^3.2.1 + js-yaml: ^4.1.0 + parse-json: ^5.0.0 + path-type: ^4.0.0 + checksum: b3d277bc3a8a9e649bf4c3fc9740f4c52bf07387481302aa79839f595045368903bf26ea24a8f7f7b8b180bf46037b027c5cb63b1391ab099f3f78814a147b2b languageName: node linkType: hard -"stacktrace-gps@npm:^3.0.4": - version: 3.1.2 - resolution: "stacktrace-gps@npm:3.1.2" - dependencies: - source-map: 0.5.6 - stackframe: ^1.3.4 - checksum: 85daa232d138239b6ae0f4bcdd87d15d302a045d93625db17614030945b5314e204b5fbcf9bee5b6f4f9e6af5fca05f65c27fe910894b861ef6853b99470aa1c +"create-require@npm:^1.1.0": + version: 1.1.1 + resolution: "create-require@npm:1.1.1" + checksum: a9a1503d4390d8b59ad86f4607de7870b39cad43d929813599a23714831e81c520bddf61bcdd1f8e30f05fd3a2b71ae8538e946eb2786dc65c2bbc520f692eff languageName: node linkType: hard -"stacktrace-js@npm:^2.0.2": - version: 2.0.2 - resolution: "stacktrace-js@npm:2.0.2" +"cross-spawn@npm:^5.1.0": + version: 5.1.0 + resolution: "cross-spawn@npm:5.1.0" dependencies: - error-stack-parser: ^2.0.6 - stack-generator: ^2.0.5 - stacktrace-gps: ^3.0.4 - checksum: 081e786d56188ac04ac6604c09cd863b3ca2b4300ec061366cf68c3e4ad9edaa34fb40deea03cc23a05f442aa341e9171f47313f19bd588f9bec6c505a396286 + lru-cache: ^4.0.1 + shebang-command: ^1.2.0 + which: ^1.2.9 + checksum: 726939c9954fc70c20e538923feaaa33bebc253247d13021737c3c7f68cdc3e0a57f720c0fe75057c0387995349f3f12e20e9bfdbf12274db28019c7ea4ec166 languageName: node linkType: hard -"stacktrace-parser@npm:^0.1.10": - version: 0.1.10 - resolution: "stacktrace-parser@npm:0.1.10" +"cross-spawn@npm:^7.0.3": + version: 7.0.3 + resolution: "cross-spawn@npm:7.0.3" dependencies: - type-fest: ^0.7.1 - checksum: f4fbddfc09121d91e587b60de4beb4941108e967d71ad3a171812dc839b010ca374d064ad0a296295fed13acd103609d99a4224a25b4e67de13cae131f1901ee + path-key: ^3.1.0 + shebang-command: ^2.0.0 + which: ^2.0.1 + checksum: 671cc7c7288c3a8406f3c69a3ae2fc85555c04169e9d611def9a675635472614f1c0ed0ef80955d5b6d4e724f6ced67f0ad1bb006c2ea643488fcfef994d7f52 languageName: node linkType: hard -"stacktracey@npm:^2.1.8": - version: 2.1.8 - resolution: "stacktracey@npm:2.1.8" +"css-select@npm:^5.1.0": + version: 5.1.0 + resolution: "css-select@npm:5.1.0" dependencies: - as-table: ^1.0.36 - get-source: ^2.0.12 - checksum: abd8316b4e120884108f5a47b2f61abdcaeaa118afd95f3c48317cb057fff43d697450ba00de3f9fe7fee61ee72644ccda4db990a8e4553706644f7c17522eab + boolbase: ^1.0.0 + css-what: ^6.1.0 + domhandler: ^5.0.2 + domutils: ^3.0.1 + nth-check: ^2.0.1 + checksum: 2772c049b188d3b8a8159907192e926e11824aea525b8282981f72ba3f349cf9ecd523fdf7734875ee2cb772246c22117fc062da105b6d59afe8dcd5c99c9bda languageName: node linkType: hard -"standard-as-callback@npm:^2.1.0": - version: 2.1.0 - resolution: "standard-as-callback@npm:2.1.0" - checksum: 88bec83ee220687c72d94fd86a98d5272c91d37ec64b66d830dbc0d79b62bfa6e47f53b71646011835fc9ce7fae62739545d13124262b53be4fbb3e2ebad551c +"css-what@npm:^6.1.0": + version: 6.1.0 + resolution: "css-what@npm:6.1.0" + checksum: b975e547e1e90b79625918f84e67db5d33d896e6de846c9b584094e529f0c63e2ab85ee33b9daffd05bff3a146a1916bec664e18bb76dd5f66cbff9fc13b2bbe languageName: node linkType: hard -"start-server-and-test@npm:2.0.0": - version: 2.0.0 - resolution: "start-server-and-test@npm:2.0.0" - dependencies: - arg: ^5.0.2 - bluebird: 3.7.2 - check-more-types: 2.24.0 - debug: 4.3.4 - execa: 5.1.1 - lazy-ass: 1.6.0 - ps-tree: 1.2.0 - wait-on: 7.0.1 +"danger@npm:11.2.6": + version: 11.2.6 + resolution: "danger@npm:11.2.6" + dependencies: + "@gitbeaker/node": ^21.3.0 + "@octokit/rest": ^18.12.0 + async-retry: 1.2.3 + chalk: ^2.3.0 + commander: ^2.18.0 + core-js: ^3.8.2 + debug: ^4.1.1 + fast-json-patch: ^3.0.0-1 + get-stdin: ^6.0.0 + http-proxy-agent: ^5.0.0 + https-proxy-agent: ^5.0.1 + hyperlinker: ^1.0.0 + json5: ^2.1.0 + jsonpointer: ^5.0.0 + jsonwebtoken: ^9.0.0 + lodash.find: ^4.6.0 + lodash.includes: ^4.3.0 + lodash.isobject: ^3.0.2 + lodash.keys: ^4.0.8 + lodash.mapvalues: ^4.6.0 + lodash.memoize: ^4.1.2 + memfs-or-file-map-to-github-branch: ^1.2.1 + micromatch: ^4.0.4 + node-cleanup: ^2.1.2 + node-fetch: ^2.6.7 + override-require: ^1.1.1 + p-limit: ^2.1.0 + parse-diff: ^0.7.0 + parse-git-config: ^2.0.3 + parse-github-url: ^1.0.2 + parse-link-header: ^2.0.0 + pinpoint: ^1.1.0 + prettyjson: ^1.2.1 + readline-sync: ^1.4.9 + regenerator-runtime: ^0.13.9 + require-from-string: ^2.0.2 + supports-hyperlinks: ^1.0.1 bin: - server-test: src/bin/start.js - start-server-and-test: src/bin/start.js - start-test: src/bin/start.js - checksum: 8788e59ad78275332c78325a804504ac558f06a112d47cb5bc3d012d2bda46add72c863cae2357836fe245ee4e22e2fec0b6d47dbdf5e0f0f5cfd1a57544d100 - languageName: node - linkType: hard - -"state-toggle@npm:^1.0.0": - version: 1.0.3 - resolution: "state-toggle@npm:1.0.3" - checksum: 17398af928413e8d8b866cf0c81fd1b1348bb7d65d8983126ff6ff2317a80d6ee023484fba0c54d8169f5aa544f125434a650ae3a71eddc935cae307d4692b4f + danger: distribution/commands/danger.js + danger-ci: distribution/commands/danger-ci.js + danger-init: distribution/commands/danger-init.js + danger-js: distribution/commands/danger.js + danger-local: distribution/commands/danger-local.js + danger-pr: distribution/commands/danger-pr.js + danger-process: distribution/commands/danger-process.js + danger-reset-status: distribution/commands/danger-reset-status.js + danger-runner: distribution/commands/danger-runner.js + checksum: 606b92bce7618edc5d7d1500c5108d57ee86fd9d81d385c45b9acba5aac46e97c81c0687392ad117c296a581afb55c8e729d8ba283b770f1c6e7747be07fdaf4 languageName: node linkType: hard -"static-eval@npm:2.0.2": - version: 2.0.2 - resolution: "static-eval@npm:2.0.2" - dependencies: - escodegen: ^1.8.1 - checksum: 335a923c5ccb29add404ac23d0a55c0da6cee3071f6f67a7053aeac0dedc6dbfc53ac9269e9c25f403f5b7603a291ef47d7114f99bde241184f7aa3f9286dc32 +"dargs@npm:^7.0.0": + version: 7.0.0 + resolution: "dargs@npm:7.0.0" + checksum: b8f1e3cba59c42e1f13a114ad4848c3fc1cf7470f633ee9e9f1043762429bc97d91ae31b826fb135eefde203a3fdb20deb0c0a0222ac29d937b8046085d668d1 languageName: node linkType: hard -"statsig-js@npm:4.41.0": - version: 4.41.0 - resolution: "statsig-js@npm:4.41.0" - dependencies: - js-sha256: ^0.10.1 - uuid: ^8.3.2 - checksum: adc757d29705d8cabf8282eb45803b8063da4faa804abe09a1156254ff276c451bb979a60e4e54f5d3bfb6bc2a6d496562aaac2ebd033cf71bc516228f9fffb8 +"de-indent@npm:^1.0.2": + version: 1.0.2 + resolution: "de-indent@npm:1.0.2" + checksum: 8deacc0f4a397a4414a0fc4d0034d2b7782e7cb4eaf34943ea47754e08eccf309a0e71fa6f56cc48de429ede999a42d6b4bca761bf91683be0095422dbf24611 languageName: node linkType: hard -"statsig-js@npm:4.51.0": - version: 4.51.0 - resolution: "statsig-js@npm:4.51.0" +"debug@npm:4, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.4": + version: 4.3.7 + resolution: "debug@npm:4.3.7" dependencies: - js-sha256: ^0.11.0 - uuid: ^8.3.2 - checksum: 0c9fd04ed16d4647fa48ded34cdf87ab12f0f479bf1002eecc779effed5db81f52f457381cd594ea70bc40c2343c51906bed70a36188c86f3d397a38c467b809 + ms: ^2.1.3 + peerDependenciesMeta: + supports-color: + optional: true + checksum: 822d74e209cd910ef0802d261b150314bbcf36c582ccdbb3e70f0894823c17e49a50d3e66d96b633524263975ca16b6a833f3e3b7e030c157169a5fabac63160 languageName: node linkType: hard -"statsig-react-native@npm:4.15.0": - version: 4.15.0 - resolution: "statsig-react-native@npm:4.15.0" +"debug@npm:^2.2.0": + version: 2.6.9 + resolution: "debug@npm:2.6.9" dependencies: - statsig-react: ^1.36.0 - peerDependencies: - "@babel/traverse": ">=7.23.2" - "@react-native-async-storage/async-storage": ^1.15.10 - logkitty: ">=0.7.1" - react-native: ">=0.60.0" - react-native-device-info: ^8.1.3 - react-native-get-random-values: ^1.6.0 - shell-quote: ">=1.7.3" - checksum: 14a9dcc9e06bf2cef5f78ce0a65aa3e2f6e6117d0a56e9bb9cbd62019f3cb389881bf53e7173440e35ca114af1da840446cc297b9c39b7f214ddddbc6e1b92d8 + ms: 2.0.0 + checksum: d2f51589ca66df60bf36e1fa6e4386b318c3f1e06772280eea5b1ae9fd3d05e9c2b7fd8a7d862457d00853c75b00451aa2d7459b924629ee385287a650f58fe6 languageName: node linkType: hard -"statsig-react@npm:1.38.1, statsig-react@npm:^1.36.0": - version: 1.38.1 - resolution: "statsig-react@npm:1.38.1" +"decamelize-keys@npm:^1.1.0": + version: 1.1.1 + resolution: "decamelize-keys@npm:1.1.1" dependencies: - statsig-js: 4.51.0 - peerDependencies: - react: ^16.6.3 || ^17.0.0 || ^18.0.0 - checksum: 3f5d5fdd38db135ce5de96dfdc08434730e626aa2268d5d9eee20ea3eb3c12630f9e06fcc05a3e26bc49291ef3d0c2e306f6deecd4c8b758ddd9140f65dda53c - languageName: node - linkType: hard - -"statuses@npm:2.0.1": - version: 2.0.1 - resolution: "statuses@npm:2.0.1" - checksum: 18c7623fdb8f646fb213ca4051be4df7efb3484d4ab662937ca6fbef7ced9b9e12842709872eb3020cc3504b93bde88935c9f6417489627a7786f24f8031cbcb - languageName: node - linkType: hard - -"statuses@npm:>= 1.4.0 < 2, statuses@npm:~1.5.0": - version: 1.5.0 - resolution: "statuses@npm:1.5.0" - checksum: c469b9519de16a4bb19600205cffb39ee471a5f17b82589757ca7bd40a8d92ebb6ed9f98b5a540c5d302ccbc78f15dc03cc0280dd6e00df1335568a5d5758a5c - languageName: node - linkType: hard - -"std-env@npm:^3.7.0": - version: 3.7.0 - resolution: "std-env@npm:3.7.0" - checksum: 4f489d13ff2ab838c9acd4ed6b786b51aa52ecacdfeaefe9275fcb220ff2ac80c6e95674723508fd29850a694569563a8caaaea738eb82ca16429b3a0b50e510 - languageName: node - linkType: hard - -"stoppable@npm:^1.1.0": - version: 1.1.0 - resolution: "stoppable@npm:1.1.0" - checksum: 63104fcbdece130bc4906fd982061e763d2ef48065ed1ab29895e5ad00552c625f8a4c50c9cd2e3bfa805c8a2c3bfdda0f07c5ae39694bd2d5cb0bee1618d1e9 + decamelize: ^1.1.0 + map-obj: ^1.0.0 + checksum: fc645fe20b7bda2680bbf9481a3477257a7f9304b1691036092b97ab04c0ab53e3bf9fcc2d2ae382536568e402ec41fb11e1d4c3836a9abe2d813dd9ef4311e0 languageName: node linkType: hard -"store2@npm:^2.14.3": - version: 2.14.3 - resolution: "store2@npm:2.14.3" - checksum: 971a47aa479ff5491f89ee3fcbaf4ddafe0cfb55ac2f4cf4b4fc7b21d349fa3a761f79368d1573b9f65af08b3cf0f6973eed56a213b8bb4cb7e820ac048d1613 +"decamelize@npm:^1.1.0": + version: 1.2.0 + resolution: "decamelize@npm:1.2.0" + checksum: ad8c51a7e7e0720c70ec2eeb1163b66da03e7616d7b98c9ef43cce2416395e84c1e9548dd94f5f6ffecfee9f8b94251fc57121a8b021f2ff2469b2bae247b8aa languageName: node linkType: hard -"storybook@npm:8.4.2": - version: 8.4.2 - resolution: "storybook@npm:8.4.2" - dependencies: - "@storybook/core": 8.4.2 - peerDependencies: - prettier: ^2 || ^3 - peerDependenciesMeta: - prettier: - optional: true - bin: - getstorybook: ./bin/index.cjs - sb: ./bin/index.cjs - storybook: ./bin/index.cjs - checksum: 8fe9013ea95d0f10493b3ba6c0b1599b6c1efdb9f5e59e36c1f4b4ec6200640581ab37b415d4aa86c0a70bd4cb919d25d6411f906580d0a7ca42542e8032d8de +"decode-uri-component@npm:^0.2.0": + version: 0.2.2 + resolution: "decode-uri-component@npm:0.2.2" + checksum: 95476a7d28f267292ce745eac3524a9079058bbb35767b76e3ee87d42e34cd0275d2eb19d9d08c3e167f97556e8a2872747f5e65cbebcac8b0c98d83e285f139 languageName: node linkType: hard -"storybook@npm:^8.4.2": - version: 8.4.5 - resolution: "storybook@npm:8.4.5" +"decompress-response@npm:^3.3.0": + version: 3.3.0 + resolution: "decompress-response@npm:3.3.0" dependencies: - "@storybook/core": 8.4.5 - peerDependencies: - prettier: ^2 || ^3 - peerDependenciesMeta: - prettier: - optional: true - bin: - getstorybook: ./bin/index.cjs - sb: ./bin/index.cjs - storybook: ./bin/index.cjs - checksum: 3495183749b760da077b2ede7607884c62f6707412e91defbe20328b275b78528fcef350453ad95642a52b97eded50f2c5374e94fb422a3b39587de364d87ee8 + mimic-response: ^1.0.0 + checksum: 952552ac3bd7de2fc18015086b09468645c9638d98a551305e485230ada278c039c91116e946d07894b39ee53c0f0d5b6473f25a224029344354513b412d7380 languageName: node linkType: hard -"stream-browserify@npm:^3.0.0": - version: 3.0.0 - resolution: "stream-browserify@npm:3.0.0" +"decompress-response@npm:^6.0.0": + version: 6.0.0 + resolution: "decompress-response@npm:6.0.0" dependencies: - inherits: ~2.0.4 - readable-stream: ^3.5.0 - checksum: 4c47ef64d6f03815a9ca3874e2319805e8e8a85f3550776c47ce523b6f4c6cd57f40e46ec6a9ab8ad260fde61863c2718f250d3bedb3fe9052444eb9abfd9921 + mimic-response: ^3.1.0 + checksum: d377cf47e02d805e283866c3f50d3d21578b779731e8c5072d6ce8c13cc31493db1c2f6784da9d1d5250822120cefa44f1deab112d5981015f2e17444b763812 languageName: node linkType: hard -"stream-buffers@npm:2.2.x, stream-buffers@npm:~2.2.0": - version: 2.2.0 - resolution: "stream-buffers@npm:2.2.0" - checksum: 4587d9e8f050d689fb38b4295e73408401b16de8edecc12026c6f4ae92956705ecfd995ae3845d7fa3ebf19502d5754df9143d91447fd881d86e518f43882c1c +"deep-extend@npm:^0.6.0": + version: 0.6.0 + resolution: "deep-extend@npm:0.6.0" + checksum: 7be7e5a8d468d6b10e6a67c3de828f55001b6eb515d014f7aeb9066ce36bd5717161eb47d6a0f7bed8a9083935b465bc163ee2581c8b128d29bf61092fdf57a7 languageName: node linkType: hard -"stream-combiner@npm:~0.0.4": - version: 0.0.4 - resolution: "stream-combiner@npm:0.0.4" - dependencies: - duplexer: ~0.1.1 - checksum: 844b622cfe8b9de45a6007404f613b60aaf85200ab9862299066204242f89a7c8033b1c356c998aa6cfc630f6cd9eba119ec1c6dc1f93e245982be4a847aee7d +"defer-to-connect@npm:^1.0.1": + version: 1.1.3 + resolution: "defer-to-connect@npm:1.1.3" + checksum: 9491b301dcfa04956f989481ba7a43c2231044206269eb4ab64a52d6639ee15b1252262a789eb4239fb46ab63e44d4e408641bae8e0793d640aee55398cb3930 languageName: node linkType: hard -"stream-events@npm:^1.0.5": - version: 1.0.5 - resolution: "stream-events@npm:1.0.5" - dependencies: - stubs: ^3.0.0 - checksum: 969ce82e34bfbef5734629cc06f9d7f3705a9ceb8fcd6a526332f9159f1f8bbfdb1a453f3ced0b728083454f7706adbbe8428bceb788a0287ca48ba2642dc3fc +"defer-to-connect@npm:^2.0.0": + version: 2.0.1 + resolution: "defer-to-connect@npm:2.0.1" + checksum: 8a9b50d2f25446c0bfefb55a48e90afd58f85b21bcf78e9207cd7b804354f6409032a1705c2491686e202e64fc05f147aa5aa45f9aa82627563f045937f5791b languageName: node linkType: hard -"stream-http@npm:^3.2.0": - version: 3.2.0 - resolution: "stream-http@npm:3.2.0" +"define-data-property@npm:^1.0.1, define-data-property@npm:^1.1.4": + version: 1.1.4 + resolution: "define-data-property@npm:1.1.4" dependencies: - builtin-status-codes: ^3.0.0 - inherits: ^2.0.4 - readable-stream: ^3.6.0 - xtend: ^4.0.2 - checksum: c9b78453aeb0c84fcc59555518ac62bacab9fa98e323e7b7666e5f9f58af8f3155e34481078509b02929bd1268427f664d186604cdccee95abc446099b339f83 - languageName: node - linkType: hard - -"stream-shift@npm:^1.0.0, stream-shift@npm:^1.0.2": - version: 1.0.3 - resolution: "stream-shift@npm:1.0.3" - checksum: a24c0a3f66a8f9024bd1d579a533a53be283b4475d4e6b4b3211b964031447bdf6532dd1f3c2b0ad66752554391b7c62bd7ca4559193381f766534e723d50242 + es-define-property: ^1.0.0 + es-errors: ^1.3.0 + gopd: ^1.0.1 + checksum: 8068ee6cab694d409ac25936eb861eea704b7763f7f342adbdfe337fc27c78d7ae0eff2364b2917b58c508d723c7a074326d068eef2e45c4edcd85cf94d0313b languageName: node linkType: hard -"stream-to-array@npm:^2.3.0": - version: 2.3.0 - resolution: "stream-to-array@npm:2.3.0" +"define-properties@npm:^1.2.1": + version: 1.2.1 + resolution: "define-properties@npm:1.2.1" dependencies: - any-promise: ^1.1.0 - checksum: 7feaf63b38399b850615e6ffcaa951e96e4c8f46745dbce4b553a94c5dc43966933813747014935a3ff97793e7f30a65270bde19f82b2932871a1879229a77cf - languageName: node - linkType: hard - -"streamsearch@npm:^1.1.0": - version: 1.1.0 - resolution: "streamsearch@npm:1.1.0" - checksum: 1cce16cea8405d7a233d32ca5e00a00169cc0e19fbc02aa839959985f267335d435c07f96e5e0edd0eadc6d39c98d5435fb5bbbdefc62c41834eadc5622ad942 + define-data-property: ^1.0.1 + has-property-descriptors: ^1.0.0 + object-keys: ^1.1.1 + checksum: b4ccd00597dd46cb2d4a379398f5b19fca84a16f3374e2249201992f36b30f6835949a9429669ee6b41b6e837205a163eadd745e472069e70dfc10f03e5fcc12 languageName: node linkType: hard -"streamsearch@npm:~0.1.2": - version: 0.1.2 - resolution: "streamsearch@npm:0.1.2" - checksum: d2db57cbfbf7947ab9c75a7b4c80a8ef8d24850cf0a1a24258bb6956c97317ce1eab7dbcbf9c5aba3e6198611af1053b02411057bbedb99bf9c64b8275248997 +"delayed-stream@npm:~1.0.0": + version: 1.0.0 + resolution: "delayed-stream@npm:1.0.0" + checksum: 46fe6e83e2cb1d85ba50bd52803c68be9bd953282fa7096f51fc29edd5d67ff84ff753c51966061e5ba7cb5e47ef6d36a91924eddb7f3f3483b1c560f77a0020 languageName: node linkType: hard -"streamx@npm:^2.12.5, streamx@npm:^2.15.0, streamx@npm:^2.21.0": - version: 2.21.1 - resolution: "streamx@npm:2.21.1" +"depcheck@npm:1.4.7": + version: 1.4.7 + resolution: "depcheck@npm:1.4.7" dependencies: - bare-events: ^2.2.0 - fast-fifo: ^1.3.2 - queue-tick: ^1.0.1 - text-decoder: ^1.1.0 - dependenciesMeta: - bare-events: - optional: true - checksum: 98abdd0a926b172be6f2b306cdda3d8689a4da51e478518aa187d321ceca31ebfcbfff222c55ef4140fdc2a5c14da5db9da19fdfd7a08bcdcb0c1c6e6df96f22 - languageName: node - linkType: hard - -"strict-uri-encode@npm:^2.0.0": - version: 2.0.0 - resolution: "strict-uri-encode@npm:2.0.0" - checksum: eaac4cf978b6fbd480f1092cab8b233c9b949bcabfc9b598dd79a758f7243c28765ef7639c876fa72940dac687181b35486ea01ff7df3e65ce3848c64822c581 + "@babel/parser": ^7.23.0 + "@babel/traverse": ^7.23.2 + "@vue/compiler-sfc": ^3.3.4 + callsite: ^1.0.0 + camelcase: ^6.3.0 + cosmiconfig: ^7.1.0 + debug: ^4.3.4 + deps-regex: ^0.2.0 + findup-sync: ^5.0.0 + ignore: ^5.2.4 + is-core-module: ^2.12.0 + js-yaml: ^3.14.1 + json5: ^2.2.3 + lodash: ^4.17.21 + minimatch: ^7.4.6 + multimatch: ^5.0.0 + please-upgrade-node: ^3.2.0 + readdirp: ^3.6.0 + require-package-name: ^2.0.1 + resolve: ^1.22.3 + resolve-from: ^5.0.0 + semver: ^7.5.4 + yargs: ^16.2.0 + bin: + depcheck: bin/depcheck.js + checksum: e648788554ba88bd0dc37ce398f7756f143a78487b4ee3ac01756ad7ed97034476e0709497e9f8e474117bd4258db669a53fd46fafb703f151c9a0394fc8a55a languageName: node linkType: hard -"string-argv@npm:0.3.2": - version: 0.3.2 - resolution: "string-argv@npm:0.3.2" - checksum: 8703ad3f3db0b2641ed2adbb15cf24d3945070d9a751f9e74a924966db9f325ac755169007233e8985a39a6a292f14d4fee20482989b89b96e473c4221508a0f +"deprecation@npm:^2.0.0, deprecation@npm:^2.3.1": + version: 2.3.1 + resolution: "deprecation@npm:2.3.1" + checksum: f56a05e182c2c195071385455956b0c4106fe14e36245b00c689ceef8e8ab639235176a96977ba7c74afb173317fac2e0ec6ec7a1c6d1e6eaa401c586c714132 languageName: node linkType: hard -"string-env-interpolation@npm:1.0.1, string-env-interpolation@npm:^1.0.1": - version: 1.0.1 - resolution: "string-env-interpolation@npm:1.0.1" - checksum: d126329587f635bee65300e4451e7352b9b67e03daeb62f006ca84244cac12a1f6e45176b018653ba0c3ec3b5d980f9ca59d2eeed99cf799501cdaa7f871dc6f +"deps-regex@npm:^0.2.0": + version: 0.2.0 + resolution: "deps-regex@npm:0.2.0" + checksum: a782304d481824c21c5aaff3d7fbd2eba9b112688cbadb36537304dde61e106595d4858bd097fad1df8b96fbff3df571dc9bfd73b749cbd24fd088cce3a999d8 languageName: node linkType: hard -"string-length@npm:^4.0.1": - version: 4.0.2 - resolution: "string-length@npm:4.0.2" - dependencies: - char-regex: ^1.0.2 - strip-ansi: ^6.0.0 - checksum: ce85533ef5113fcb7e522bcf9e62cb33871aa99b3729cec5595f4447f660b0cefd542ca6df4150c97a677d58b0cb727a3fe09ac1de94071d05526c73579bf505 +"detect-file@npm:^1.0.0": + version: 1.0.0 + resolution: "detect-file@npm:1.0.0" + checksum: 1861e4146128622e847abe0e1ed80fef01e78532665858a792267adf89032b7a9c698436137707fcc6f02956c2a6a0052d6a0cef5be3d4b76b1ff0da88e2158a languageName: node linkType: hard -"string-length@npm:^5.0.1": - version: 5.0.1 - resolution: "string-length@npm:5.0.1" - dependencies: - char-regex: ^2.0.0 - strip-ansi: ^7.0.1 - checksum: 71f73b8c8a743e01dcd001bcf1b197db78d5e5e53b12bd898cddaf0961be09f947dfd8c429783db3694b55b05cb5a51de6406c5085ff1aaa10c4771440c8396d +"detect-indent@npm:^6.0.0": + version: 6.1.0 + resolution: "detect-indent@npm:6.1.0" + checksum: ab953a73c72dbd4e8fc68e4ed4bfd92c97eb6c43734af3900add963fd3a9316f3bc0578b018b24198d4c31a358571eff5f0656e81a1f3b9ad5c547d58b2d093d languageName: node linkType: hard -"string-natural-compare@npm:^3.0.1": - version: 3.0.1 - resolution: "string-natural-compare@npm:3.0.1" - checksum: 65910d9995074086e769a68728395effbba9b7186be5b4c16a7fad4f4ef50cae95ca16e3e9086e019cbb636ae8daac9c7b8fe91b5f21865c5c0f26e3c0725406 +"diff@npm:^4.0.1": + version: 4.0.2 + resolution: "diff@npm:4.0.2" + checksum: f2c09b0ce4e6b301c221addd83bf3f454c0bc00caa3dd837cf6c127d6edf7223aa2bbe3b688feea110b7f262adbfc845b757c44c8a9f8c0c5b15d8fa9ce9d20d languageName: node linkType: hard -"string-width-cjs@npm:string-width@^4.2.0, string-width@npm:^1.0.2 || 2 || 3 || 4, string-width@npm:^4.0.0, string-width@npm:^4.1.0, string-width@npm:^4.2.0, string-width@npm:^4.2.2, string-width@npm:^4.2.3": - version: 4.2.3 - resolution: "string-width@npm:4.2.3" +"dir-glob@npm:^3.0.1": + version: 3.0.1 + resolution: "dir-glob@npm:3.0.1" dependencies: - emoji-regex: ^8.0.0 - is-fullwidth-code-point: ^3.0.0 - strip-ansi: ^6.0.1 - checksum: e52c10dc3fbfcd6c3a15f159f54a90024241d0f149cf8aed2982a2d801d2e64df0bf1dc351cf8e95c3319323f9f220c16e740b06faecd53e2462df1d2b5443fb + path-type: ^4.0.0 + checksum: fa05e18324510d7283f55862f3161c6759a3f2f8dbce491a2fc14c8324c498286c54282c1f0e933cb930da8419b30679389499b919122952a4f8592362ef4615 languageName: node linkType: hard -"string-width@npm:^1.0.1": - version: 1.0.2 - resolution: "string-width@npm:1.0.2" +"dom-serializer@npm:^2.0.0": + version: 2.0.0 + resolution: "dom-serializer@npm:2.0.0" dependencies: - code-point-at: ^1.0.0 - is-fullwidth-code-point: ^1.0.0 - strip-ansi: ^3.0.0 - checksum: 5c79439e95bc3bd7233a332c5f5926ab2ee90b23816ed4faa380ce3b2576d7800b0a5bb15ae88ed28737acc7ea06a518c2eef39142dd727adad0e45c776cd37e + domelementtype: ^2.3.0 + domhandler: ^5.0.2 + entities: ^4.2.0 + checksum: cd1810544fd8cdfbd51fa2c0c1128ec3a13ba92f14e61b7650b5de421b88205fd2e3f0cc6ace82f13334114addb90ed1c2f23074a51770a8e9c1273acbc7f3e6 languageName: node linkType: hard -"string-width@npm:^2.0.0, string-width@npm:^2.1.1": - version: 2.1.1 - resolution: "string-width@npm:2.1.1" - dependencies: - is-fullwidth-code-point: ^2.0.0 - strip-ansi: ^4.0.0 - checksum: d6173abe088c615c8dffaf3861dc5d5906ed3dc2d6fd67ff2bd2e2b5dce7fd683c5240699cf0b1b8aa679a3b3bd6b28b5053c824cb89b813d7f6541d8f89064a +"domelementtype@npm:^2.3.0": + version: 2.3.0 + resolution: "domelementtype@npm:2.3.0" + checksum: ee837a318ff702622f383409d1f5b25dd1024b692ef64d3096ff702e26339f8e345820f29a68bcdcea8cfee3531776b3382651232fbeae95612d6f0a75efb4f6 languageName: node linkType: hard -"string-width@npm:^5.0.0, string-width@npm:^5.0.1, string-width@npm:^5.1.2": - version: 5.1.2 - resolution: "string-width@npm:5.1.2" +"domhandler@npm:^5.0.2, domhandler@npm:^5.0.3": + version: 5.0.3 + resolution: "domhandler@npm:5.0.3" dependencies: - eastasianwidth: ^0.2.0 - emoji-regex: ^9.2.2 - strip-ansi: ^7.0.1 - checksum: 7369deaa29f21dda9a438686154b62c2c5f661f8dda60449088f9f980196f7908fc39fdd1803e3e01541970287cf5deae336798337e9319a7055af89dafa7193 - languageName: node - linkType: hard - -"string.prototype.codepointat@npm:^0.2.1": - version: 0.2.1 - resolution: "string.prototype.codepointat@npm:0.2.1" - checksum: bafa15844d7ea5bed24a01fa8954327c0c49226cefe68ab70573f1338f6a4680587db962724924f2cceb91abe408e11bd38c80095f25ee080f136a6c9d300f00 + domelementtype: ^2.3.0 + checksum: 0f58f4a6af63e6f3a4320aa446d28b5790a009018707bce2859dcb1d21144c7876482b5188395a188dfa974238c019e0a1e610d2fc269a12b2c192ea2b0b131c languageName: node linkType: hard -"string.prototype.includes@npm:^2.0.1": - version: 2.0.1 - resolution: "string.prototype.includes@npm:2.0.1" +"domutils@npm:^3.0.1": + version: 3.1.0 + resolution: "domutils@npm:3.1.0" dependencies: - call-bind: ^1.0.7 - define-properties: ^1.2.1 - es-abstract: ^1.23.3 - checksum: ed4b7058b092f30d41c4df1e3e805eeea92479d2c7a886aa30f42ae32fde8924a10cc99cccc99c29b8e18c48216608a0fe6bf887f8b4aadf9559096a758f313a + dom-serializer: ^2.0.0 + domelementtype: ^2.3.0 + domhandler: ^5.0.3 + checksum: e5757456ddd173caa411cfc02c2bb64133c65546d2c4081381a3bafc8a57411a41eed70494551aa58030be9e58574fcc489828bebd673863d39924fb4878f416 languageName: node linkType: hard -"string.prototype.matchall@npm:^4.0.10, string.prototype.matchall@npm:^4.0.11, string.prototype.matchall@npm:^4.0.6": - version: 4.0.11 - resolution: "string.prototype.matchall@npm:4.0.11" +"dot-prop@npm:^5.1.0": + version: 5.3.0 + resolution: "dot-prop@npm:5.3.0" dependencies: - call-bind: ^1.0.7 - define-properties: ^1.2.1 - es-abstract: ^1.23.2 - es-errors: ^1.3.0 - es-object-atoms: ^1.0.0 - get-intrinsic: ^1.2.4 - gopd: ^1.0.1 - has-symbols: ^1.0.3 - internal-slot: ^1.0.7 - regexp.prototype.flags: ^1.5.2 - set-function-name: ^2.0.2 - side-channel: ^1.0.6 - checksum: 6ac6566ed065c0c8489c91156078ca077db8ff64d683fda97ae652d00c52dfa5f39aaab0a710d8243031a857fd2c7c511e38b45524796764d25472d10d7075ae + is-obj: ^2.0.0 + checksum: d5775790093c234ef4bfd5fbe40884ff7e6c87573e5339432870616331189f7f5d86575c5b5af2dcf0f61172990f4f734d07844b1f23482fff09e3c4bead05ea languageName: node linkType: hard -"string.prototype.repeat@npm:^1.0.0": - version: 1.0.0 - resolution: "string.prototype.repeat@npm:1.0.0" +"dotenv-cli@npm:7.1.0": + version: 7.1.0 + resolution: "dotenv-cli@npm:7.1.0" dependencies: - define-properties: ^1.1.3 - es-abstract: ^1.17.5 - checksum: 95dfc514ed7f328d80a066dabbfbbb1615c3e51490351085409db2eb7cbfed7ea29fdadaf277647fbf9f4a1e10e6dd9e95e78c0fd2c4e6bb6723ea6e59401004 + cross-spawn: ^7.0.3 + dotenv: ^16.0.0 + dotenv-expand: ^10.0.0 + minimist: ^1.2.6 + bin: + dotenv: cli.js + checksum: aa4e967061477a181d61e837246d79bc2c65fd6c664d4dbeda04d42283c3a8fb685163b1f3cf2474df97fae4429d5040f1ec6ea9d19e1ed092d4885469e54983 languageName: node linkType: hard -"string.prototype.trim@npm:^1.2.9": - version: 1.2.9 - resolution: "string.prototype.trim@npm:1.2.9" - dependencies: - call-bind: ^1.0.7 - define-properties: ^1.2.1 - es-abstract: ^1.23.0 - es-object-atoms: ^1.0.0 - checksum: ea2df6ec1e914c9d4e2dc856fa08228e8b1be59b59e50b17578c94a66a176888f417264bb763d4aac638ad3b3dad56e7a03d9317086a178078d131aa293ba193 +"dotenv-expand@npm:^10.0.0": + version: 10.0.0 + resolution: "dotenv-expand@npm:10.0.0" + checksum: 2a38b470efe0abcb1ac8490421a55e1d764dc9440fd220942bce40965074f3fb00b585f4346020cb0f0f219966ee6b4ee5023458b3e2953fe5b3214de1b314ee languageName: node linkType: hard -"string.prototype.trimend@npm:^1.0.8": - version: 1.0.8 - resolution: "string.prototype.trimend@npm:1.0.8" - dependencies: - call-bind: ^1.0.7 - define-properties: ^1.2.1 - es-object-atoms: ^1.0.0 - checksum: cc3bd2de08d8968a28787deba9a3cb3f17ca5f9f770c91e7e8fa3e7d47f079bad70fadce16f05dda9f261788be2c6e84a942f618c3bed31e42abc5c1084f8dfd +"dotenv@npm:^16.0.0": + version: 16.4.5 + resolution: "dotenv@npm:16.4.5" + checksum: 301a12c3d44fd49888b74eb9ccf9f07a1f5df43f489e7fcb89647a2edcd84c42d6bc349dc8df099cd18f07c35c7b04685c1a4f3e6a6a9e6b30f8d48c15b7f49c languageName: node linkType: hard -"string.prototype.trimstart@npm:^1.0.8": - version: 1.0.8 - resolution: "string.prototype.trimstart@npm:1.0.8" - dependencies: - call-bind: ^1.0.7 - define-properties: ^1.2.1 - es-object-atoms: ^1.0.0 - checksum: df1007a7f580a49d692375d996521dc14fd103acda7f3034b3c558a60b82beeed3a64fa91e494e164581793a8ab0ae2f59578a49896a7af6583c1f20472bce96 +"duplexer3@npm:^0.1.4": + version: 0.1.4 + resolution: "duplexer3@npm:0.1.4" + checksum: c2fd6969314607d23439c583699aaa43c4100d66b3e161df55dccd731acc57d5c81a64bb4f250805fbe434ddb1d2623fee2386fb890f5886ca1298690ec53415 languageName: node linkType: hard -"string_decoder@npm:^1.1.1, string_decoder@npm:^1.3.0": - version: 1.3.0 - resolution: "string_decoder@npm:1.3.0" +"duplexify@npm:^3.6.0": + version: 3.7.1 + resolution: "duplexify@npm:3.7.1" dependencies: - safe-buffer: ~5.2.0 - checksum: 8417646695a66e73aefc4420eb3b84cc9ffd89572861fe004e6aeb13c7bc00e2f616247505d2dbbef24247c372f70268f594af7126f43548565c68c117bdeb56 + end-of-stream: ^1.0.0 + inherits: ^2.0.1 + readable-stream: ^2.0.0 + stream-shift: ^1.0.0 + checksum: 3c2ed2223d956a5da713dae12ba8295acb61d9acd966ccbba938090d04f4574ca4dca75cca089b5077c2d7e66101f32e6ea9b36a78ca213eff574e7a8b8accf2 languageName: node linkType: hard -"string_decoder@npm:~1.1.1": - version: 1.1.1 - resolution: "string_decoder@npm:1.1.1" +"ecdsa-sig-formatter@npm:1.0.11": + version: 1.0.11 + resolution: "ecdsa-sig-formatter@npm:1.0.11" dependencies: - safe-buffer: ~5.1.0 - checksum: 9ab7e56f9d60a28f2be697419917c50cac19f3e8e6c28ef26ed5f4852289fe0de5d6997d29becf59028556f2c62983790c1d9ba1e2a3cc401768ca12d5183a5b + safe-buffer: ^5.0.1 + checksum: 207f9ab1c2669b8e65540bce29506134613dd5f122cccf1e6a560f4d63f2732d427d938f8481df175505aad94583bcb32c688737bb39a6df0625f903d6d93c03 languageName: node linkType: hard -"stringify-object@npm:^3.2.1, stringify-object@npm:^3.3.0": - version: 3.3.0 - resolution: "stringify-object@npm:3.3.0" - dependencies: - get-own-enumerable-property-symbols: ^3.0.0 - is-obj: ^1.0.1 - is-regexp: ^1.0.0 - checksum: 6827a3f35975cfa8572e8cd3ed4f7b262def260af18655c6fde549334acdac49ddba69f3c861ea5a6e9c5a4990fe4ae870b9c0e6c31019430504c94a83b7a154 +"emoji-regex@npm:^8.0.0": + version: 8.0.0 + resolution: "emoji-regex@npm:8.0.0" + checksum: d4c5c39d5a9868b5fa152f00cada8a936868fd3367f33f71be515ecee4c803132d11b31a6222b2571b1e5f7e13890156a94880345594d0ce7e3c9895f560f192 languageName: node linkType: hard -"strip-ansi-cjs@npm:strip-ansi@^6.0.1, strip-ansi@npm:^6.0.0, strip-ansi@npm:^6.0.1": - version: 6.0.1 - resolution: "strip-ansi@npm:6.0.1" +"end-of-stream@npm:^1.0.0, end-of-stream@npm:^1.1.0": + version: 1.4.4 + resolution: "end-of-stream@npm:1.4.4" dependencies: - ansi-regex: ^5.0.1 - checksum: f3cd25890aef3ba6e1a74e20896c21a46f482e93df4a06567cebf2b57edabb15133f1f94e57434e0a958d61186087b1008e89c94875d019910a213181a14fc8c + once: ^1.4.0 + checksum: 530a5a5a1e517e962854a31693dbb5c0b2fc40b46dad2a56a2deec656ca040631124f4795823acc68238147805f8b021abbe221f4afed5ef3c8e8efc2024908b languageName: node linkType: hard -"strip-ansi@npm:^3.0.0, strip-ansi@npm:^3.0.1": - version: 3.0.1 - resolution: "strip-ansi@npm:3.0.1" - dependencies: - ansi-regex: ^2.0.0 - checksum: 9b974de611ce5075c70629c00fa98c46144043db92ae17748fb780f706f7a789e9989fd10597b7c2053ae8d1513fd707816a91f1879b2f71e6ac0b6a863db465 +"ensure-posix-path@npm:^1.1.0": + version: 1.1.1 + resolution: "ensure-posix-path@npm:1.1.1" + checksum: 90ac69f48a08003abe6f194b75bad78c3320762bd193a063eb76cd8f696be6a34e1524f16435eeee09ccbe3a719a7fb76409dead3ccedd10e32d906ff050457b languageName: node linkType: hard -"strip-ansi@npm:^4.0.0": - version: 4.0.0 - resolution: "strip-ansi@npm:4.0.0" - dependencies: - ansi-regex: ^3.0.0 - checksum: d9186e6c0cf78f25274f6750ee5e4a5725fb91b70fdd79aa5fe648eab092a0ec5b9621b22d69d4534a56319f75d8944efbd84e3afa8d4ad1b9a9491f12c84eca +"entities@npm:^4.2.0, entities@npm:^4.4.0": + version: 4.5.0 + resolution: "entities@npm:4.5.0" + checksum: 853f8ebd5b425d350bffa97dd6958143179a5938352ccae092c62d1267c4e392a039be1bae7d51b6e4ffad25f51f9617531fedf5237f15df302ccfb452cbf2d7 languageName: node linkType: hard -"strip-ansi@npm:^5.0.0, strip-ansi@npm:^5.2.0": - version: 5.2.0 - resolution: "strip-ansi@npm:5.2.0" - dependencies: - ansi-regex: ^4.1.0 - checksum: bdb5f76ade97062bd88e7723aa019adbfacdcba42223b19ccb528ffb9fb0b89a5be442c663c4a3fb25268eaa3f6ea19c7c3fbae830bd1562d55adccae1fcec46 +"eol@npm:^0.9.1": + version: 0.9.1 + resolution: "eol@npm:0.9.1" + checksum: ba9fa998bc8148b935dcf85585eacf049eeaf18d2ab6196710d4d1f59e7dfd0e87b18508dc67144ff8ba12f835a4a4989aeea64c98b13cca77b74b9d4b33bce5 languageName: node linkType: hard -"strip-ansi@npm:^7.0.1, strip-ansi@npm:^7.1.0": - version: 7.1.0 - resolution: "strip-ansi@npm:7.1.0" +"error-ex@npm:^1.3.1": + version: 1.3.2 + resolution: "error-ex@npm:1.3.2" dependencies: - ansi-regex: ^6.0.1 - checksum: 859c73fcf27869c22a4e4d8c6acfe690064659e84bef9458aa6d13719d09ca88dcfd40cbf31fd0be63518ea1a643fe070b4827d353e09533a5b0b9fd4553d64d + is-arrayish: ^0.2.1 + checksum: c1c2b8b65f9c91b0f9d75f0debaa7ec5b35c266c2cac5de412c1a6de86d4cbae04ae44e510378cb14d032d0645a36925d0186f8bb7367bcc629db256b743a001 languageName: node linkType: hard -"strip-bom@npm:^3.0.0": - version: 3.0.0 - resolution: "strip-bom@npm:3.0.0" - checksum: 8d50ff27b7ebe5ecc78f1fe1e00fcdff7af014e73cf724b46fb81ef889eeb1015fc5184b64e81a2efe002180f3ba431bdd77e300da5c6685d702780fbf0c8d5b +"es-define-property@npm:^1.0.0": + version: 1.0.0 + resolution: "es-define-property@npm:1.0.0" + dependencies: + get-intrinsic: ^1.2.4 + checksum: f66ece0a887b6dca71848fa71f70461357c0e4e7249696f81bad0a1f347eed7b31262af4a29f5d726dc026426f085483b6b90301855e647aa8e21936f07293c6 languageName: node linkType: hard -"strip-bom@npm:^4.0.0": - version: 4.0.0 - resolution: "strip-bom@npm:4.0.0" - checksum: 9dbcfbaf503c57c06af15fe2c8176fb1bf3af5ff65003851a102749f875a6dbe0ab3b30115eccf6e805e9d756830d3e40ec508b62b3f1ddf3761a20ebe29d3f3 +"es-errors@npm:^1.3.0": + version: 1.3.0 + resolution: "es-errors@npm:1.3.0" + checksum: ec1414527a0ccacd7f15f4a3bc66e215f04f595ba23ca75cdae0927af099b5ec865f9f4d33e9d7e86f512f252876ac77d4281a7871531a50678132429b1271b5 languageName: node linkType: hard -"strip-comments@npm:^2.0.1": - version: 2.0.1 - resolution: "strip-comments@npm:2.0.1" - checksum: 36cd122e1c27b5be69df87e1687770a62fe183bdee9f3ff5cf85d30bbc98280afc012581f2fd50c7ad077c90f656f272560c9d2e520d28604b8b7ea3bc87d6f9 +"esbuild@npm:^0.19.0": + version: 0.19.12 + resolution: "esbuild@npm:0.19.12" + dependencies: + "@esbuild/aix-ppc64": 0.19.12 + "@esbuild/android-arm": 0.19.12 + "@esbuild/android-arm64": 0.19.12 + "@esbuild/android-x64": 0.19.12 + "@esbuild/darwin-arm64": 0.19.12 + "@esbuild/darwin-x64": 0.19.12 + "@esbuild/freebsd-arm64": 0.19.12 + "@esbuild/freebsd-x64": 0.19.12 + "@esbuild/linux-arm": 0.19.12 + "@esbuild/linux-arm64": 0.19.12 + "@esbuild/linux-ia32": 0.19.12 + "@esbuild/linux-loong64": 0.19.12 + "@esbuild/linux-mips64el": 0.19.12 + "@esbuild/linux-ppc64": 0.19.12 + "@esbuild/linux-riscv64": 0.19.12 + "@esbuild/linux-s390x": 0.19.12 + "@esbuild/linux-x64": 0.19.12 + "@esbuild/netbsd-x64": 0.19.12 + "@esbuild/openbsd-x64": 0.19.12 + "@esbuild/sunos-x64": 0.19.12 + "@esbuild/win32-arm64": 0.19.12 + "@esbuild/win32-ia32": 0.19.12 + "@esbuild/win32-x64": 0.19.12 + dependenciesMeta: + "@esbuild/aix-ppc64": + optional: true + "@esbuild/android-arm": + optional: true + "@esbuild/android-arm64": + optional: true + "@esbuild/android-x64": + optional: true + "@esbuild/darwin-arm64": + optional: true + "@esbuild/darwin-x64": + optional: true + "@esbuild/freebsd-arm64": + optional: true + "@esbuild/freebsd-x64": + optional: true + "@esbuild/linux-arm": + optional: true + "@esbuild/linux-arm64": + optional: true + "@esbuild/linux-ia32": + optional: true + "@esbuild/linux-loong64": + optional: true + "@esbuild/linux-mips64el": + optional: true + "@esbuild/linux-ppc64": + optional: true + "@esbuild/linux-riscv64": + optional: true + "@esbuild/linux-s390x": + optional: true + "@esbuild/linux-x64": + optional: true + "@esbuild/netbsd-x64": + optional: true + "@esbuild/openbsd-x64": + optional: true + "@esbuild/sunos-x64": + optional: true + "@esbuild/win32-arm64": + optional: true + "@esbuild/win32-ia32": + optional: true + "@esbuild/win32-x64": + optional: true + bin: + esbuild: bin/esbuild + checksum: 2936e29107b43e65a775b78b7bc66ddd7d76febd73840ac7e825fb22b65029422ff51038a08d19b05154f543584bd3afe7d1ef1c63900429475b17fbe61cb61f languageName: node linkType: hard -"strip-eof@npm:^1.0.0": - version: 1.0.0 - resolution: "strip-eof@npm:1.0.0" - checksum: 40bc8ddd7e072f8ba0c2d6d05267b4e0a4800898c3435b5fb5f5a21e6e47dfaff18467e7aa0d1844bb5d6274c3097246595841fbfeb317e541974ee992cac506 +"escalade@npm:^3.1.1": + version: 3.2.0 + resolution: "escalade@npm:3.2.0" + checksum: 47b029c83de01b0d17ad99ed766347b974b0d628e848de404018f3abee728e987da0d2d370ad4574aa3d5b5bfc368754fd085d69a30f8e75903486ec4b5b709e languageName: node linkType: hard -"strip-final-newline@npm:^2.0.0": - version: 2.0.0 - resolution: "strip-final-newline@npm:2.0.0" - checksum: 69412b5e25731e1938184b5d489c32e340605bb611d6140344abc3421b7f3c6f9984b21dff296dfcf056681b82caa3bb4cc996a965ce37bcfad663e92eae9c64 +"escape-string-regexp@npm:^1.0.5": + version: 1.0.5 + resolution: "escape-string-regexp@npm:1.0.5" + checksum: 6092fda75c63b110c706b6a9bfde8a612ad595b628f0bd2147eea1d3406723020810e591effc7db1da91d80a71a737a313567c5abb3813e8d9c71f4aa595b410 languageName: node linkType: hard -"strip-final-newline@npm:^3.0.0": - version: 3.0.0 - resolution: "strip-final-newline@npm:3.0.0" - checksum: 23ee263adfa2070cd0f23d1ac14e2ed2f000c9b44229aec9c799f1367ec001478469560abefd00c5c99ee6f0b31c137d53ec6029c53e9f32a93804e18c201050 +"esprima@npm:^4.0.0": + version: 4.0.1 + resolution: "esprima@npm:4.0.1" + bin: + esparse: ./bin/esparse.js + esvalidate: ./bin/esvalidate.js + checksum: b45bc805a613dbea2835278c306b91aff6173c8d034223fa81498c77dcbce3b2931bf6006db816f62eacd9fd4ea975dfd85a5b7f3c6402cfd050d4ca3c13a628 languageName: node linkType: hard -"strip-hex-prefix@npm:1.0.0": - version: 1.0.0 - resolution: "strip-hex-prefix@npm:1.0.0" - dependencies: - is-hex-prefixed: 1.0.0 - checksum: 4cafe7caee1d281d3694d14920fd5d3c11adf09371cef7e2ccedd5b83efd9e9bd2219b5d6ce6e809df6e0f437dc9d30db1192116580875698aad164a6d6b285b +"estree-walker@npm:^2.0.2": + version: 2.0.2 + resolution: "estree-walker@npm:2.0.2" + checksum: 6151e6f9828abe2259e57f5fd3761335bb0d2ebd76dc1a01048ccee22fabcfef3c0859300f6d83ff0d1927849368775ec5a6d265dde2f6de5a1be1721cd94efc languageName: node linkType: hard -"strip-indent@npm:^3.0.0": - version: 3.0.0 - resolution: "strip-indent@npm:3.0.0" +"execa@npm:^5.0.0": + version: 5.1.1 + resolution: "execa@npm:5.1.1" dependencies: - min-indent: ^1.0.0 - checksum: 18f045d57d9d0d90cd16f72b2313d6364fd2cb4bf85b9f593523ad431c8720011a4d5f08b6591c9d580f446e78855c5334a30fb91aa1560f5d9f95ed1b4a0530 + cross-spawn: ^7.0.3 + get-stream: ^6.0.0 + human-signals: ^2.1.0 + is-stream: ^2.0.0 + merge-stream: ^2.0.0 + npm-run-path: ^4.0.1 + onetime: ^5.1.2 + signal-exit: ^3.0.3 + strip-final-newline: ^2.0.0 + checksum: fba9022c8c8c15ed862847e94c252b3d946036d7547af310e344a527e59021fd8b6bb0723883ea87044dc4f0201f949046993124a42ccb0855cae5bf8c786343 languageName: node linkType: hard -"strip-indent@npm:^4.0.0": - version: 4.0.0 - resolution: "strip-indent@npm:4.0.0" +"expand-tilde@npm:^2.0.0, expand-tilde@npm:^2.0.2": + version: 2.0.2 + resolution: "expand-tilde@npm:2.0.2" dependencies: - min-indent: ^1.0.1 - checksum: 06cbcd93da721c46bc13caeb1c00af93a9b18146a1c95927672d2decab6a25ad83662772417cea9317a2507fb143253ecc23c4415b64f5828cef9b638a744598 + homedir-polyfill: ^1.0.1 + checksum: 2efe6ed407d229981b1b6ceb552438fbc9e5c7d6a6751ad6ced3e0aa5cf12f0b299da695e90d6c2ac79191b5c53c613e508f7149e4573abfbb540698ddb7301a languageName: node linkType: hard -"strip-json-comments@npm:3.1.1, strip-json-comments@npm:^3.1.0, strip-json-comments@npm:^3.1.1": - version: 3.1.1 - resolution: "strip-json-comments@npm:3.1.1" - checksum: 492f73e27268f9b1c122733f28ecb0e7e8d8a531a6662efbd08e22cccb3f9475e90a1b82cab06a392f6afae6d2de636f977e231296400d0ec5304ba70f166443 +"expect-more@npm:1.3.0": + version: 1.3.0 + resolution: "expect-more@npm:1.3.0" + checksum: 8d6b0692fbc22ad327161cfaa4f5920aad98e459873ba57f959fc07ce19dab9408e6b13afca812c50261b77a1c404b6d6ba64a928c5650cb1b76b3e0900155c0 languageName: node linkType: hard -"strip-json-comments@npm:~2.0.1": +"extend-shallow@npm:^2.0.1": version: 2.0.1 - resolution: "strip-json-comments@npm:2.0.1" - checksum: 1074ccb63270d32ca28edfb0a281c96b94dc679077828135141f27d52a5a398ef5e78bcf22809d23cadc2b81dfbe345eb5fd8699b385c8b1128907dec4a7d1e1 + resolution: "extend-shallow@npm:2.0.1" + dependencies: + is-extendable: ^0.1.0 + checksum: 8fb58d9d7a511f4baf78d383e637bd7d2e80843bd9cd0853649108ea835208fb614da502a553acc30208e1325240bb7cc4a68473021612496bb89725483656d8 languageName: node linkType: hard -"strnum@npm:^1.0.5": - version: 1.0.5 - resolution: "strnum@npm:1.0.5" - checksum: 651b2031db5da1bf4a77fdd2f116a8ac8055157c5420f5569f64879133825915ad461513e7202a16d7fec63c54fd822410d0962f8ca12385c4334891b9ae6dd2 +"extend@npm:^3.0.0": + version: 3.0.2 + resolution: "extend@npm:3.0.2" + checksum: a50a8309ca65ea5d426382ff09f33586527882cf532931cb08ca786ea3146c0553310bda688710ff61d7668eba9f96b923fe1420cdf56a2c3eaf30fcab87b515 languageName: node linkType: hard -"structured-headers@npm:^0.4.1": - version: 0.4.1 - resolution: "structured-headers@npm:0.4.1" - checksum: 2f3073b2c8b4f2515367a1647ba0b6764ce6d35b3943605940de41077c2afd2513257f4bf6fbfd67a3455f25a3e844905da6fddde6b6ad7974256495311a25a3 +"fast-deep-equal@npm:^3.1.3": + version: 3.1.3 + resolution: "fast-deep-equal@npm:3.1.3" + checksum: e21a9d8d84f53493b6aa15efc9cfd53dd5b714a1f23f67fb5dc8f574af80df889b3bce25dc081887c6d25457cce704e636395333abad896ccdec03abaf1f3f9d languageName: node linkType: hard -"stubs@npm:^3.0.0": - version: 3.0.0 - resolution: "stubs@npm:3.0.0" - checksum: dec7b82186e3743317616235c59bfb53284acc312cb9f4c3e97e2205c67a5c158b0ca89db5927e52351582e90a2672822eeaec9db396e23e56893d2a8676e024 +"fast-fifo@npm:^1.3.2": + version: 1.3.2 + resolution: "fast-fifo@npm:1.3.2" + checksum: 6bfcba3e4df5af7be3332703b69a7898a8ed7020837ec4395bb341bd96cc3a6d86c3f6071dd98da289618cf2234c70d84b2a6f09a33dd6f988b1ff60d8e54275 languageName: node linkType: hard -"style-loader@npm:3.3.2, style-loader@npm:^3.3.1": +"fast-glob@npm:^3.2.9": version: 3.3.2 - resolution: "style-loader@npm:3.3.2" - peerDependencies: - webpack: ^5.0.0 - checksum: 5ee5ce2dc885369eccb55d429376e83d02570d473ac5edeb69fd65ee894847f1e51429cf078351f617bd04516ece8a1dd967f9f40464bd8fa76d903c6b2a6f08 - languageName: node - linkType: hard - -"style-value-types@npm:5.0.0": - version: 5.0.0 - resolution: "style-value-types@npm:5.0.0" - dependencies: - hey-listen: ^1.0.8 - tslib: ^2.1.0 - checksum: 16d198302cd102edf9dba94e7752a2364c93b1eaa5cc7c32b42b28eef4af4ccb5149a3f16bc2a256adc02616a2404f4612bd15f3081c1e8ca06132cae78be6c0 - languageName: node - linkType: hard - -"styled-components@npm:5.3.11": - version: 5.3.11 - resolution: "styled-components@npm:5.3.11" - dependencies: - "@babel/helper-module-imports": ^7.0.0 - "@babel/traverse": ^7.4.5 - "@emotion/is-prop-valid": ^1.1.0 - "@emotion/stylis": ^0.8.4 - "@emotion/unitless": ^0.7.4 - babel-plugin-styled-components: ">= 1.12.0" - css-to-react-native: ^3.0.0 - hoist-non-react-statics: ^3.0.0 - shallowequal: ^1.1.0 - supports-color: ^5.5.0 - peerDependencies: - react: ">= 16.8.0" - react-dom: ">= 16.8.0" - react-is: ">= 16.8.0" - checksum: 10edd4dae3b0231ec02d86bdd09c88e894eedfa7e9d4f8e562b09fb69c67a27d586cbcf35c785002d59b3bf11e6c0940b0efce40d13ae9ed148b26b1dc8f3284 - languageName: node - linkType: hard - -"styled-system@npm:^5.0.0, styled-system@npm:^5.1.5": - version: 5.1.5 - resolution: "styled-system@npm:5.1.5" + resolution: "fast-glob@npm:3.3.2" dependencies: - "@styled-system/background": ^5.1.2 - "@styled-system/border": ^5.1.5 - "@styled-system/color": ^5.1.2 - "@styled-system/core": ^5.1.2 - "@styled-system/flexbox": ^5.1.2 - "@styled-system/grid": ^5.1.2 - "@styled-system/layout": ^5.1.2 - "@styled-system/position": ^5.1.2 - "@styled-system/shadow": ^5.1.2 - "@styled-system/space": ^5.1.2 - "@styled-system/typography": ^5.1.2 - "@styled-system/variant": ^5.1.5 - object-assign: ^4.1.1 - checksum: e1345f88e0962ad785a500b656c9b7120d87e12ab16b7c107cf745d676190918b169a849eacdf3b09b2f765d9e22838c00211200f6ebbb3cde8eaddce3535054 + "@nodelib/fs.stat": ^2.0.2 + "@nodelib/fs.walk": ^1.2.3 + glob-parent: ^5.1.2 + merge2: ^1.3.0 + micromatch: ^4.0.4 + checksum: 900e4979f4dbc3313840078419245621259f349950411ca2fa445a2f9a1a6d98c3b5e7e0660c5ccd563aa61abe133a21765c6c0dec8e57da1ba71d8000b05ec1 languageName: node linkType: hard -"stylehacks@npm:^5.1.1": - version: 5.1.1 - resolution: "stylehacks@npm:5.1.1" - dependencies: - browserslist: ^4.21.4 - postcss-selector-parser: ^6.0.4 - peerDependencies: - postcss: ^8.2.15 - checksum: 11175366ef52de65bf06cefba0ddc9db286dc3a1451fd2989e74c6ea47091a02329a4bf6ce10b1a36950056927b6bbbe47c5ab3a1f4c7032df932d010fbde5a2 +"fast-json-patch@npm:^3.0.0-1": + version: 3.1.1 + resolution: "fast-json-patch@npm:3.1.1" + checksum: c4525b61b2471df60d4b025b4118b036d99778a93431aa44d1084218182841d82ce93056f0f3bbd731a24e6a8e69820128adf1873eb2199a26c62ef58d137833 languageName: node linkType: hard -"styleq@npm:^0.1.3": - version: 0.1.3 - resolution: "styleq@npm:0.1.3" - checksum: 14a8d23abd914166a9b4bd04ed753bd91363f0e029ee4a94ec2c7dc37d3213fe01fceee22dc655288da3ae89f5dc01cec42d5e2b58478b0dea33bf5bdf509be1 +"fast-uri@npm:^3.0.1": + version: 3.0.1 + resolution: "fast-uri@npm:3.0.1" + checksum: 106143ff83705995225dcc559411288f3337e732bb2e264e79788f1914b6bd8f8bc3683102de60b15ba00e6ebb443633cabac77d4ebc5cb228c47cf955e199ff languageName: node linkType: hard -"stylus-lookup@npm:^3.0.1": - version: 3.0.2 - resolution: "stylus-lookup@npm:3.0.2" +"fastq@npm:^1.6.0": + version: 1.15.0 + resolution: "fastq@npm:1.15.0" dependencies: - commander: ^2.8.1 - debug: ^4.1.0 - bin: - stylus-lookup: bin/cli.js - checksum: 460e9b6e7e662e2cf98d41ee670cb5da9ec8b8dbc1d4574de29ac422c632d5c7933772822fc12792f2ee9f9c2f62b3f60ed5850690e7c780ab7b6f07010199e4 + reusify: ^1.0.4 + checksum: 0170e6bfcd5d57a70412440b8ef600da6de3b2a6c5966aeaf0a852d542daff506a0ee92d6de7679d1de82e644bce69d7a574a6c93f0b03964b5337eed75ada1a languageName: node linkType: hard -"subscriptions-transport-ws@npm:0.11.0": - version: 0.11.0 - resolution: "subscriptions-transport-ws@npm:0.11.0" +"fd-slicer@npm:~1.1.0": + version: 1.1.0 + resolution: "fd-slicer@npm:1.1.0" dependencies: - backo2: ^1.0.2 - eventemitter3: ^3.1.0 - iterall: ^1.2.1 - symbol-observable: ^1.0.4 - ws: ^5.2.0 || ^6.0.0 || ^7.0.0 - peerDependencies: - graphql: ^15.7.2 || ^16.0.0 - checksum: cc2e98d5c9d89c44d2e15eca188781c6ebae13d1661c42a99cee9d2897aebe2a22bc118eefff83244a79c88ee4ea24d46973ebf26ae7cb47ac1857fb8ee2c947 + pend: ~1.2.0 + checksum: c8585fd5713f4476eb8261150900d2cb7f6ff2d87f8feb306ccc8a1122efd152f1783bdb2b8dc891395744583436bfd8081d8e63ece0ec8687eeefea394d4ff2 languageName: node linkType: hard -"sucrase@npm:3.35.0, sucrase@npm:^3.35.0": - version: 3.35.0 - resolution: "sucrase@npm:3.35.0" +"fill-range@npm:^7.1.1": + version: 7.1.1 + resolution: "fill-range@npm:7.1.1" dependencies: - "@jridgewell/gen-mapping": ^0.3.2 - commander: ^4.0.0 - glob: ^10.3.10 - lines-and-columns: ^1.1.6 - mz: ^2.7.0 - pirates: ^4.0.1 - ts-interface-checker: ^0.1.9 - bin: - sucrase: bin/sucrase - sucrase-node: bin/sucrase-node - checksum: 9fc5792a9ab8a14dcf9c47dcb704431d35c1cdff1d17d55d382a31c2e8e3063870ad32ce120a80915498486246d612e30cda44f1624d9d9a10423e1a43487ad1 - languageName: node - linkType: hard - -"sudo-prompt@npm:9.1.1, sudo-prompt@npm:^9.0.0": - version: 9.1.1 - resolution: "sudo-prompt@npm:9.1.1" - checksum: 20fe5bde6a27725d87938e68d6f99c0798ce9bf3a8fdebd58392a0436df713c66ebf67863e682941ff98ee7611e40ed599e12be7f264c9286106feb0f3db3860 + to-regex-range: ^5.0.1 + checksum: b4abfbca3839a3d55e4ae5ec62e131e2e356bf4859ce8480c64c4876100f4df292a63e5bb1618e1d7460282ca2b305653064f01654474aa35c68000980f17798 languageName: node linkType: hard -"sudo-prompt@npm:^8.2.0": - version: 8.2.5 - resolution: "sudo-prompt@npm:8.2.5" - checksum: bacff1f18a8ab8dba345cc1f3cf3a02b4cc571f71585df79af95af31278f56107f7c29402f5347b07c489888c63f2deb78d544b93a6347e83d0ed0847f4bc163 +"filter-obj@npm:^1.1.0": + version: 1.1.0 + resolution: "filter-obj@npm:1.1.0" + checksum: cf2104a7c45ff48e7f505b78a3991c8f7f30f28bd8106ef582721f321f1c6277f7751aacd5d83026cb079d9d5091082f588d14a72e7c5d720ece79118fa61e10 languageName: node linkType: hard -"sumchecker@npm:^3.0.1": - version: 3.0.1 - resolution: "sumchecker@npm:3.0.1" +"find-up@npm:^4.1.0": + version: 4.1.0 + resolution: "find-up@npm:4.1.0" dependencies: - debug: ^4.1.0 - checksum: 31ba7a62c889236b5b07f75b5c250d481158a1ca061b8f234fca0457bdbe48a20e5011c12c715343dc577e111463dc3d9e721b98015a445a2a88c35e0c9f0f91 + locate-path: ^5.0.0 + path-exists: ^4.0.0 + checksum: 4c172680e8f8c1f78839486e14a43ef82e9decd0e74145f40707cc42e7420506d5ec92d9a11c22bd2c48fb0c384ea05dd30e10dd152fefeec6f2f75282a8b844 languageName: node linkType: hard -"superstruct@npm:^0.6.2": - version: 0.6.2 - resolution: "superstruct@npm:0.6.2" +"find-up@npm:^5.0.0": + version: 5.0.0 + resolution: "find-up@npm:5.0.0" dependencies: - clone-deep: ^2.0.1 - kind-of: ^6.0.1 - checksum: f95e4049becb928baa531fe56256a74b050a2e4da0bee09ccd0031e08fffd521defeb1d37881b93e6861fa1a7c17c48f3834a99af83cb3ad60c9e6079e840a65 - languageName: node - linkType: hard - -"superstruct@npm:^1.0.3": - version: 1.0.3 - resolution: "superstruct@npm:1.0.3" - checksum: 761790bb111e6e21ddd608299c252f3be35df543263a7ebbc004e840d01fcf8046794c274bcb351bdf3eae4600f79d317d085cdbb19ca05803a4361840cc9bb1 + locate-path: ^6.0.0 + path-exists: ^4.0.0 + checksum: 07955e357348f34660bde7920783204ff5a26ac2cafcaa28bace494027158a97b9f56faaf2d89a6106211a8174db650dd9f503f9c0d526b1202d5554a00b9095 languageName: node linkType: hard -"supports-color@npm:8.1.1, supports-color@npm:^8.0.0, supports-color@npm:^8.1.1": - version: 8.1.1 - resolution: "supports-color@npm:8.1.1" +"findup-sync@npm:^5.0.0": + version: 5.0.0 + resolution: "findup-sync@npm:5.0.0" dependencies: - has-flag: ^4.0.0 - checksum: c052193a7e43c6cdc741eb7f378df605636e01ad434badf7324f17fb60c69a880d8d8fcdcb562cf94c2350e57b937d7425ab5b8326c67c2adc48f7c87c1db406 + detect-file: ^1.0.0 + is-glob: ^4.0.3 + micromatch: ^4.0.4 + resolve-dir: ^1.0.1 + checksum: 576716c77a0e8330b17ae9cba27d1fda8907c8cda7bf33a47f1999e16e089bfc6df4dd62933e0760f430736183c054348c34aa45dd882d49c8c098f55b89ee1d languageName: node linkType: hard -"supports-color@npm:^5.0.0, supports-color@npm:^5.3.0, supports-color@npm:^5.5.0": - version: 5.5.0 - resolution: "supports-color@npm:5.5.0" +"flush-write-stream@npm:^1.0.2": + version: 1.1.1 + resolution: "flush-write-stream@npm:1.1.1" dependencies: - has-flag: ^3.0.0 - checksum: 95f6f4ba5afdf92f495b5a912d4abee8dcba766ae719b975c56c084f5004845f6f5a5f7769f52d53f40e21952a6d87411bafe34af4a01e65f9926002e38e1dac + inherits: ^2.0.3 + readable-stream: ^2.3.6 + checksum: 42e07747f83bcd4e799da802e621d6039787749ffd41f5517f8c4f786ee967e31ba32b09f8b28a9c6f67bd4f5346772e604202df350e8d99f4141771bae31279 languageName: node linkType: hard -"supports-color@npm:^7.0.0, supports-color@npm:^7.1.0": - version: 7.2.0 - resolution: "supports-color@npm:7.2.0" +"form-data@npm:^3.0.0": + version: 3.0.1 + resolution: "form-data@npm:3.0.1" dependencies: - has-flag: ^4.0.0 - checksum: 3dda818de06ebbe5b9653e07842d9479f3555ebc77e9a0280caf5a14fb877ffee9ed57007c3b78f5a6324b8dbeec648d9e97a24e2ed9fdb81ddc69ea07100f4a + asynckit: ^0.4.0 + combined-stream: ^1.0.8 + mime-types: ^2.1.12 + checksum: b019e8d35c8afc14a2bd8a7a92fa4f525a4726b6d5a9740e8d2623c30e308fbb58dc8469f90415a856698933c8479b01646a9dff33c87cc4e76d72aedbbf860d languageName: node linkType: hard -"supports-hyperlinks@npm:^1.0.1": - version: 1.0.1 - resolution: "supports-hyperlinks@npm:1.0.1" - dependencies: - has-flag: ^2.0.0 - supports-color: ^5.0.0 - checksum: 3d6d142012b5b47709476544a0980863e81893065c0349e8e2a857ec3ff42a11a26de5faf5dae57c1ef2c09b5d94fb211a3703f8c546fee1a8fd4446df0070ad +"fp-ts@npm:2.13.1": + version: 2.13.1 + resolution: "fp-ts@npm:2.13.1" + checksum: 618e0028aca9ff1d52b86f438499ccab149825bdab14c678d22c3e2ccbf9d36fd1f26d463bf0ae1e63f5cd79dd54c8218af2cca0daeea68b039307b751ae9563 languageName: node linkType: hard -"supports-hyperlinks@npm:^2.0.0": - version: 2.3.0 - resolution: "supports-hyperlinks@npm:2.3.0" +"framer-motion@npm:^6.5.1": + version: 6.5.1 + resolution: "framer-motion@npm:6.5.1" dependencies: - has-flag: ^4.0.0 - supports-color: ^7.0.0 - checksum: 9ee0de3c8ce919d453511b2b1588a8205bd429d98af94a01df87411391010fe22ca463f268c84b2ce2abad019dfff8452aa02806eeb5c905a8d7ad5c4f4c52b8 - languageName: node - linkType: hard - -"supports-preserve-symlinks-flag@npm:^1.0.0": - version: 1.0.0 - resolution: "supports-preserve-symlinks-flag@npm:1.0.0" - checksum: 53b1e247e68e05db7b3808b99b892bd36fb096e6fba213a06da7fab22045e97597db425c724f2bbd6c99a3c295e1e73f3e4de78592289f38431049e1277ca0ae - languageName: node - linkType: hard - -"svg-arc-to-cubic-bezier@npm:^3.0.0": - version: 3.2.0 - resolution: "svg-arc-to-cubic-bezier@npm:3.2.0" - checksum: 55bf17756d558b9c0daddf636a6c9f2fe01fd5ac412229dfa2d4b29740226a82c980bcd3b5eb09ce311cbea282106c7549d97f8c8dba3a5a7b75f786bcb5e155 - languageName: node - linkType: hard - -"svg-parser@npm:^2.0.2, svg-parser@npm:^2.0.4": - version: 2.0.4 - resolution: "svg-parser@npm:2.0.4" - checksum: b3de6653048212f2ae7afe4a423e04a76ec6d2d06e1bf7eacc618a7c5f7df7faa5105561c57b94579ec831fbbdbf5f190ba56a9205ff39ed13eabdf8ab086ddf + "@emotion/is-prop-valid": ^0.8.2 + "@motionone/dom": 10.12.0 + framesync: 6.0.1 + hey-listen: ^1.0.8 + popmotion: 11.0.3 + style-value-types: 5.0.0 + tslib: ^2.1.0 + peerDependencies: + react: ">=16.8 || ^17.0.0 || ^18.0.0" + react-dom: ">=16.8 || ^17.0.0 || ^18.0.0" + dependenciesMeta: + "@emotion/is-prop-valid": + optional: true + checksum: 737959063137b4ccafe01e0ac0c9e5a9531bf3f729f62c34ca7a5d7955e6664f70affd22b044f7db51df41acb21d120a4f71a860e17a80c4db766ad66f2153a1 languageName: node linkType: hard -"svgo@npm:^1.2.2": - version: 1.3.2 - resolution: "svgo@npm:1.3.2" - dependencies: - chalk: ^2.4.1 - coa: ^2.0.2 - css-select: ^2.0.0 - css-select-base-adapter: ^0.1.1 - css-tree: 1.0.0-alpha.37 - csso: ^4.0.2 - js-yaml: ^3.13.1 - mkdirp: ~0.5.1 - object.values: ^1.1.0 - sax: ~1.2.4 - stable: ^0.1.8 - unquote: ~1.1.1 - util.promisify: ~1.0.0 - bin: - svgo: ./bin/svgo - checksum: 28a5680a61245eb4a1603bc03459095bb01ad5ebd23e95882d886c3c81752313c0a9a9fe48dd0bcbb9a27c52e11c603640df952971573b2b550d9e15a9ee6116 +"framesync@npm:6.0.1": + version: 6.0.1 + resolution: "framesync@npm:6.0.1" + dependencies: + tslib: ^2.1.0 + checksum: a23ebe8f7e20a32c0b99c2f8175b6f07af3ec6316aad52a2316316a6d011d717af8d2175dcc2827031c59fabb30232ed3e19a720a373caba7f070e1eae436325 languageName: node linkType: hard -"svgo@npm:^2.7.0": - version: 2.8.0 - resolution: "svgo@npm:2.8.0" - dependencies: - "@trysound/sax": 0.2.0 - commander: ^7.2.0 - css-select: ^4.1.3 - css-tree: ^1.1.3 - csso: ^4.2.0 - picocolors: ^1.0.0 - stable: ^0.1.8 - bin: - svgo: bin/svgo - checksum: b92f71a8541468ffd0b81b8cdb36b1e242eea320bf3c1a9b2c8809945853e9d8c80c19744267eb91cabf06ae9d5fff3592d677df85a31be4ed59ff78534fa420 +"fs-exists-sync@npm:^0.1.0": + version: 0.1.0 + resolution: "fs-exists-sync@npm:0.1.0" + checksum: 850a0d6e4c03a7bd2fd25043f77cd9d6be9c3b48bb99308bcfe9c94f3f92f65f2cd3fa036e13a1b0ba7a46d2e58792f53e578f01d75fbdcd56baeb9eed63b705 languageName: node linkType: hard -"svgo@npm:^3.0.2": - version: 3.0.2 - resolution: "svgo@npm:3.0.2" +"fs-extra@npm:11.1.0": + version: 11.1.0 + resolution: "fs-extra@npm:11.1.0" dependencies: - "@trysound/sax": 0.2.0 - commander: ^7.2.0 - css-select: ^5.1.0 - css-tree: ^2.2.1 - csso: ^5.0.5 - picocolors: ^1.0.0 - bin: - svgo: bin/svgo - checksum: 381ba14aa782e71ab7033227634a3041c11fa3e2769aeaf0df43a08a615de61925108e34f55af6e7c5146f4a3109e78deabb4fa9d687e36d45d1f848b4e23d17 + graceful-fs: ^4.2.0 + jsonfile: ^6.0.1 + universalify: ^2.0.0 + checksum: 5ca476103fa1f5ff4a9b3c4f331548f8a3c1881edaae323a4415d3153b5dc11dc6a981c8d1dd93eec8367ceee27b53f8bd27eecbbf66ffcdd04927510c171e7f languageName: node linkType: hard -"swap-case@npm:^2.0.2": - version: 2.0.2 - resolution: "swap-case@npm:2.0.2" +"fs-extra@npm:^11.0.0, fs-extra@npm:^11.1.0": + version: 11.2.0 + resolution: "fs-extra@npm:11.2.0" dependencies: - tslib: ^2.0.3 - checksum: 6e21c9e1b3cd5735eb2af679a99ec3efc78a14e3d4d5e3fd594e254b91cfd37185b3d1c6e41b22f53a2cdf5d1b963ce30c0fe8b78337e3fd43d0137084670a5f + graceful-fs: ^4.2.0 + jsonfile: ^6.0.1 + universalify: ^2.0.0 + checksum: b12e42fa40ba47104202f57b8480dd098aa931c2724565e5e70779ab87605665594e76ee5fb00545f772ab9ace167fe06d2ab009c416dc8c842c5ae6df7aa7e8 languageName: node linkType: hard -"swc-loader@npm:0.2.6": - version: 0.2.6 - resolution: "swc-loader@npm:0.2.6" +"fs-extra@npm:^8.0.1, fs-extra@npm:^8.1.0": + version: 8.1.0 + resolution: "fs-extra@npm:8.1.0" dependencies: - "@swc/counter": ^0.1.3 - peerDependencies: - "@swc/core": ^1.2.147 - webpack: ">=2" - checksum: fe90948c02a51bb8ffcff1ce3590e01dc12860b0bb7c9e22052b14fa846ed437781ae265614a5e14344bea22001108780f00a6e350e28c0b3499bc4cd11335fb + graceful-fs: ^4.2.0 + jsonfile: ^4.0.0 + universalify: ^0.1.0 + checksum: bf44f0e6cea59d5ce071bba4c43ca76d216f89e402dc6285c128abc0902e9b8525135aa808adad72c9d5d218e9f4bcc63962815529ff2f684ad532172a284880 languageName: node linkType: hard -"symbol-observable@npm:4.0.0, symbol-observable@npm:^4.0.0": - version: 4.0.0 - resolution: "symbol-observable@npm:4.0.0" - checksum: 212c7edce6186634d671336a88c0e0bbd626c2ab51ed57498dc90698cce541839a261b969c2a1e8dd43762133d47672e8b62e0b1ce9cf4157934ba45fd172ba8 +"fs-merger@npm:^3.2.1": + version: 3.2.1 + resolution: "fs-merger@npm:3.2.1" + dependencies: + broccoli-node-api: ^1.7.0 + broccoli-node-info: ^2.1.0 + fs-extra: ^8.0.1 + fs-tree-diff: ^2.0.1 + walk-sync: ^2.2.0 + checksum: bfb93b537919407d947ab89c44f6d85f7cb58d1337aaa9115de0bd38178165b158809ad83c4f5d610d42ce0ee2f81ac7ad0ae5b573a69784b676a8a6ce506500 languageName: node linkType: hard -"symbol-observable@npm:^1.0.4": - version: 1.2.0 - resolution: "symbol-observable@npm:1.2.0" - checksum: 48ffbc22e3d75f9853b3ff2ae94a44d84f386415110aea5effc24d84c502e03a4a6b7a8f75ebaf7b585780bda34eb5d6da3121f826a6f93398429d30032971b6 +"fs-minipass@npm:^1.2.7": + version: 1.2.7 + resolution: "fs-minipass@npm:1.2.7" + dependencies: + minipass: ^2.6.0 + checksum: 40fd46a2b5dcb74b3a580269f9a0c36f9098c2ebd22cef2e1a004f375b7b665c11f1507ec3f66ee6efab5664109f72d0a74ea19c3370842214c3da5168d6fdd7 languageName: node linkType: hard -"symbol-tree@npm:^3.2.4": - version: 3.2.4 - resolution: "symbol-tree@npm:3.2.4" - checksum: 6e8fc7e1486b8b54bea91199d9535bb72f10842e40c79e882fc94fb7b14b89866adf2fd79efa5ebb5b658bc07fb459ccce5ac0e99ef3d72f474e74aaf284029d +"fs-mkdirp-stream@npm:^1.0.0": + version: 1.0.0 + resolution: "fs-mkdirp-stream@npm:1.0.0" + dependencies: + graceful-fs: ^4.1.11 + through2: ^2.0.3 + checksum: 397c6a699a951bbbb9af1b0e173c9e9c0497501650dd55cb54dd6cad81e80601b6dea86c872600b25295a1502df9e240c86457a0af8c9fea46d2a4d772f73110 languageName: node linkType: hard -"symlink-or-copy@npm:^1.1.8, symlink-or-copy@npm:^1.2.0, symlink-or-copy@npm:^1.3.1": - version: 1.3.1 - resolution: "symlink-or-copy@npm:1.3.1" - checksum: 430c32ab5606f7b7c946a5a29ea17ce6cb0b34d8cb8394234b7abe710c8c029bf41030df79406cf49c4fc1e49aa979ca950b836767e3b8702acf9efe922a2f74 +"fs-tree-diff@npm:^2.0.1": + version: 2.0.1 + resolution: "fs-tree-diff@npm:2.0.1" + dependencies: + "@types/symlink-or-copy": ^1.2.0 + heimdalljs-logger: ^0.1.7 + object-assign: ^4.1.0 + path-posix: ^1.0.0 + symlink-or-copy: ^1.1.8 + checksum: ea7927af283b1db3994b98e4c636ed7f8ecfcfb39dc205b57841b22f8ebf39e97649dca07b16ae2e421b000d81b6d96449f32d4dc78742ccb22dfd19db160a45 languageName: node linkType: hard -"syncpack@npm:8.5.14": - version: 8.5.14 - resolution: "syncpack@npm:8.5.14" - dependencies: - chalk: 4.1.2 - commander: 10.0.0 - cosmiconfig: 8.0.0 - expect-more: 1.3.0 - fp-ts: 2.13.1 - fs-extra: 11.1.0 - glob: 8.1.0 - minimatch: 6.1.6 - read-yaml-file: 2.1.0 - semver: 7.3.8 - bin: - syncpack: dist/bin.js - syncpack-fix-mismatches: dist/bin-fix-mismatches/index.js - syncpack-format: dist/bin-format/index.js - syncpack-lint-semver-ranges: dist/bin-lint-semver-ranges/index.js - syncpack-list: dist/bin-list/index.js - syncpack-list-mismatches: dist/bin-list-mismatches/index.js - syncpack-set-semver-ranges: dist/bin-set-semver-ranges/index.js - checksum: 49b80707a38955c9e97f10ba898c49a0e8215e416a9aa217c1d788f9f2b2876780c027806955c42cba55bac22584424d3cb4510ab11ac5da66e38ca118614a5f +"fs.realpath@npm:^1.0.0": + version: 1.0.0 + resolution: "fs.realpath@npm:1.0.0" + checksum: 99ddea01a7e75aa276c250a04eedeffe5662bce66c65c07164ad6264f9de18fb21be9433ead460e54cff20e31721c811f4fb5d70591799df5f85dce6d6746fd0 languageName: node linkType: hard -"system-architecture@npm:^0.1.0": - version: 0.1.0 - resolution: "system-architecture@npm:0.1.0" - checksum: ca0dd793c45c354ab57dd7fc8ce7dc9923a6e07382bd3b22eb5b08f55ddb0217c390d00767549c5155fd4ce7ef23ffdd8cfb33dd4344cbbd37837d085a50f6f0 +"function-bind@npm:^1.1.1, function-bind@npm:^1.1.2": + version: 1.1.2 + resolution: "function-bind@npm:1.1.2" + checksum: 2b0ff4ce708d99715ad14a6d1f894e2a83242e4a52ccfcefaee5e40050562e5f6dafc1adbb4ce2d4ab47279a45dc736ab91ea5042d843c3c092820dfe032efb1 languageName: node linkType: hard -"tabbable@npm:^6.0.0": - version: 6.2.0 - resolution: "tabbable@npm:6.2.0" - checksum: f8440277d223949272c74bb627a3371be21735ca9ad34c2570f7e1752bd646ccfc23a9d8b1ee65d6561243f4134f5fbbf1ad6b39ac3c4b586554accaff4a1300 +"get-caller-file@npm:^2.0.5": + version: 2.0.5 + resolution: "get-caller-file@npm:2.0.5" + checksum: b9769a836d2a98c3ee734a88ba712e62703f1df31b94b784762c433c27a386dd6029ff55c2a920c392e33657d80191edbf18c61487e198844844516f843496b9 languageName: node linkType: hard -"table@npm:^6.8.1": - version: 6.8.1 - resolution: "table@npm:6.8.1" +"get-intrinsic@npm:^1.1.3, get-intrinsic@npm:^1.2.4": + version: 1.2.4 + resolution: "get-intrinsic@npm:1.2.4" dependencies: - ajv: ^8.0.1 - lodash.truncate: ^4.4.2 - slice-ansi: ^4.0.0 - string-width: ^4.2.3 - strip-ansi: ^6.0.1 - checksum: 08249c7046125d9d0a944a6e96cfe9ec66908d6b8a9db125531be6eb05fa0de047fd5542e9d43b4f987057f00a093b276b8d3e19af162a9c40db2681058fd306 + es-errors: ^1.3.0 + function-bind: ^1.1.2 + has-proto: ^1.0.1 + has-symbols: ^1.0.3 + hasown: ^2.0.0 + checksum: 414e3cdf2c203d1b9d7d33111df746a4512a1aa622770b361dadddf8ed0b5aeb26c560f49ca077e24bfafb0acb55ca908d1f709216ccba33ffc548ec8a79a951 languageName: node linkType: hard -"tailwindcss@npm:^3.0.2": - version: 3.4.16 - resolution: "tailwindcss@npm:3.4.16" - dependencies: - "@alloc/quick-lru": ^5.2.0 - arg: ^5.0.2 - chokidar: ^3.6.0 - didyoumean: ^1.2.2 - dlv: ^1.1.3 - fast-glob: ^3.3.2 - glob-parent: ^6.0.2 - is-glob: ^4.0.3 - jiti: ^1.21.6 - lilconfig: ^3.1.3 - micromatch: ^4.0.8 - normalize-path: ^3.0.0 - object-hash: ^3.0.0 - picocolors: ^1.1.1 - postcss: ^8.4.47 - postcss-import: ^15.1.0 - postcss-js: ^4.0.1 - postcss-load-config: ^4.0.2 - postcss-nested: ^6.2.0 - postcss-selector-parser: ^6.1.2 - resolve: ^1.22.8 - sucrase: ^3.35.0 - bin: - tailwind: lib/cli.js - tailwindcss: lib/cli.js - checksum: a6ec1ce07da6ea4d40a62d9b3babfc5e56da75c5efb3c6fe48317dbda6877949f011c67b4fd03cb9a680d3bd734f45dbc977ee9138f8ce59619c7c712fb1350f +"get-stdin@npm:^6.0.0": + version: 6.0.0 + resolution: "get-stdin@npm:6.0.0" + checksum: 593f6fb4fff4c8d49ec93a07c430c1edc6bd4fe7e429d222b5da2f367276a98809af9e90467ad88a2d83722ff95b9b35bbaba02b56801421c5e3668173fe12b4 languageName: node linkType: hard -"tamagui-loader@npm:1.121.7": - version: 1.121.7 - resolution: "tamagui-loader@npm:1.121.7" +"get-stream@npm:^4.1.0": + version: 4.1.0 + resolution: "get-stream@npm:4.1.0" dependencies: - "@tamagui/cli-color": 1.121.7 - "@tamagui/core": 1.121.7 - "@tamagui/static": 1.121.7 - "@tamagui/web": 1.121.7 - esbuild-loader: ^4.2.2 - esm-resolve: ^1.0.8 - fs-extra: ^11.2.0 - loader-utils: ^3.2.1 - lodash: ^4.17.21 - checksum: 53168f9fd0821c1f56a7e85075a9008413433aa9ee731f3954cc5175ac291192b3303f91a20f3385740baad3b0607c8330d613e92b2c9aec1a3b6074481a290e - languageName: node - linkType: hard - -"tamagui@npm:1.121.7": - version: 1.121.7 - resolution: "tamagui@npm:1.121.7" - dependencies: - "@tamagui/accordion": 1.121.7 - "@tamagui/adapt": 1.121.7 - "@tamagui/alert-dialog": 1.121.7 - "@tamagui/animate-presence": 1.121.7 - "@tamagui/avatar": 1.121.7 - "@tamagui/button": 1.121.7 - "@tamagui/card": 1.121.7 - "@tamagui/checkbox": 1.121.7 - "@tamagui/compose-refs": 1.121.7 - "@tamagui/constants": 1.121.7 - "@tamagui/core": 1.121.7 - "@tamagui/create-context": 1.121.7 - "@tamagui/dialog": 1.121.7 - "@tamagui/elements": 1.121.7 - "@tamagui/fake-react-native": 1.121.7 - "@tamagui/focusable": 1.121.7 - "@tamagui/font-size": 1.121.7 - "@tamagui/form": 1.121.7 - "@tamagui/get-button-sized": 1.121.7 - "@tamagui/get-font-sized": 1.121.7 - "@tamagui/get-token": 1.121.7 - "@tamagui/group": 1.121.7 - "@tamagui/helpers-tamagui": 1.121.7 - "@tamagui/image": 1.121.7 - "@tamagui/label": 1.121.7 - "@tamagui/linear-gradient": 1.121.7 - "@tamagui/list-item": 1.121.7 - "@tamagui/polyfill-dev": 1.121.7 - "@tamagui/popover": 1.121.7 - "@tamagui/popper": 1.121.7 - "@tamagui/portal": 1.121.7 - "@tamagui/progress": 1.121.7 - "@tamagui/radio-group": 1.121.7 - "@tamagui/react-native-media-driver": 1.121.7 - "@tamagui/scroll-view": 1.121.7 - "@tamagui/select": 1.121.7 - "@tamagui/separator": 1.121.7 - "@tamagui/shapes": 1.121.7 - "@tamagui/sheet": 1.121.7 - "@tamagui/slider": 1.121.7 - "@tamagui/stacks": 1.121.7 - "@tamagui/switch": 1.121.7 - "@tamagui/tabs": 1.121.7 - "@tamagui/text": 1.121.7 - "@tamagui/theme": 1.121.7 - "@tamagui/toggle-group": 1.121.7 - "@tamagui/tooltip": 1.121.7 - "@tamagui/use-controllable-state": 1.121.7 - "@tamagui/use-debounce": 1.121.7 - "@tamagui/use-force-update": 1.121.7 - "@tamagui/use-window-dimensions": 1.121.7 - "@tamagui/visually-hidden": 1.121.7 - peerDependencies: - react: "*" - checksum: f103c8a5a04c905d3bf4e1048b5b3800f4ec7f97ca91d271023337e97c4c75751f048ff3845bcc6d6ad3b0087ffcf7068a6ca54ce8725ac21676fe3c58bc7d13 + pump: ^3.0.0 + checksum: 443e1914170c15bd52ff8ea6eff6dfc6d712b031303e36302d2778e3de2506af9ee964d6124010f7818736dcfde05c04ba7ca6cc26883106e084357a17ae7d73 languageName: node linkType: hard -"tapable@npm:^1.0.0": - version: 1.1.3 - resolution: "tapable@npm:1.1.3" - checksum: 53ff4e7c3900051c38cc4faab428ebfd7e6ad0841af5a7ac6d5f3045c5b50e88497bfa8295b4b3fbcadd94993c9e358868b78b9fb249a76cb8b018ac8dccafd7 +"get-stream@npm:^5.1.0": + version: 5.2.0 + resolution: "get-stream@npm:5.2.0" + dependencies: + pump: ^3.0.0 + checksum: 8bc1a23174a06b2b4ce600df38d6c98d2ef6d84e020c1ddad632ad75bac4e092eeb40e4c09e0761c35fc2dbc5e7fff5dab5e763a383582c4a167dd69a905bd12 languageName: node linkType: hard -"tapable@npm:^2.0.0, tapable@npm:^2.1.1, tapable@npm:^2.2.0, tapable@npm:^2.2.1": - version: 2.2.1 - resolution: "tapable@npm:2.2.1" - checksum: 3b7a1b4d86fa940aad46d9e73d1e8739335efd4c48322cb37d073eb6f80f5281889bf0320c6d8ffcfa1a0dd5bfdbd0f9d037e252ef972aca595330538aac4d51 +"get-stream@npm:^6.0.0": + version: 6.0.1 + resolution: "get-stream@npm:6.0.1" + checksum: e04ecece32c92eebf5b8c940f51468cd53554dcbb0ea725b2748be583c9523d00128137966afce410b9b051eb2ef16d657cd2b120ca8edafcf5a65e81af63cad languageName: node linkType: hard -"tar-fs@npm:^2.0.0": - version: 2.1.1 - resolution: "tar-fs@npm:2.1.1" +"git-config-path@npm:^1.0.1": + version: 1.0.1 + resolution: "git-config-path@npm:1.0.1" dependencies: - chownr: ^1.1.1 - mkdirp-classic: ^0.5.2 - pump: ^3.0.0 - tar-stream: ^2.1.4 - checksum: f5b9a70059f5b2969e65f037b4e4da2daf0fa762d3d232ffd96e819e3f94665dbbbe62f76f084f1acb4dbdcce16c6e4dac08d12ffc6d24b8d76720f4d9cf032d + extend-shallow: ^2.0.1 + fs-exists-sync: ^0.1.0 + homedir-polyfill: ^1.0.0 + checksum: 13fda02984fa60122cd8ce3f61c63ca427aa41c35a88fe1ba91c508f9245da726d48eaa6a0158acd308b0271759b19dd922d6e8c0b069dc882bf8edc41aecaea languageName: node linkType: hard -"tar-fs@npm:^3.0.4": - version: 3.0.6 - resolution: "tar-fs@npm:3.0.6" +"git-raw-commits@npm:^2.0.0": + version: 2.0.11 + resolution: "git-raw-commits@npm:2.0.11" dependencies: - bare-fs: ^2.1.1 - bare-path: ^2.1.0 - pump: ^3.0.0 - tar-stream: ^3.1.5 - dependenciesMeta: - bare-fs: - optional: true - bare-path: - optional: true - checksum: b4fa09c70f75caf05bf5cf87369cd2862f1ac5fb75c4ddf9d25d55999f7736a94b58ad679d384196cba837c5f5ff14086e060fafccef5474a16e2d3058ffa488 + dargs: ^7.0.0 + lodash: ^4.17.15 + meow: ^8.0.0 + split2: ^3.0.0 + through2: ^4.0.0 + bin: + git-raw-commits: cli.js + checksum: c178af43633684106179793b6e3473e1d2bb50bb41d04e2e285ea4eef342ca4090fee6bc8a737552fde879d22346c90de5c49f18c719a0f38d4c934f258a0f79 languageName: node linkType: hard -"tar-stream@npm:^2.1.4": - version: 2.2.0 - resolution: "tar-stream@npm:2.2.0" +"glob-parent@npm:^3.1.0": + version: 3.1.0 + resolution: "glob-parent@npm:3.1.0" dependencies: - bl: ^4.0.3 - end-of-stream: ^1.4.1 - fs-constants: ^1.0.0 - inherits: ^2.0.3 - readable-stream: ^3.1.1 - checksum: 699831a8b97666ef50021c767f84924cfee21c142c2eb0e79c63254e140e6408d6d55a065a2992548e72b06de39237ef2b802b99e3ece93ca3904a37622a66f3 + is-glob: ^3.1.0 + path-dirname: ^1.0.0 + checksum: 653d559237e89a11b9934bef3f392ec42335602034c928590544d383ff5ef449f7b12f3cfa539708e74bc0a6c28ab1fe51d663cc07463cdf899ba92afd85a855 languageName: node linkType: hard -"tar-stream@npm:^3.1.5": - version: 3.1.7 - resolution: "tar-stream@npm:3.1.7" +"glob-parent@npm:^5.1.2": + version: 5.1.2 + resolution: "glob-parent@npm:5.1.2" dependencies: - b4a: ^1.6.4 - fast-fifo: ^1.2.0 - streamx: ^2.15.0 - checksum: 6393a6c19082b17b8dcc8e7fd349352bb29b4b8bfe1075912b91b01743ba6bb4298f5ff0b499a3bbaf82121830e96a1a59d4f21a43c0df339e54b01789cb8cc6 + is-glob: ^4.0.1 + checksum: f4f2bfe2425296e8a47e36864e4f42be38a996db40420fe434565e4480e3322f18eb37589617a98640c5dc8fdec1a387007ee18dbb1f3f5553409c34d17f425e languageName: node linkType: hard -"tar@npm:^4.4.8": - version: 4.4.19 - resolution: "tar@npm:4.4.19" +"glob-stream@npm:^6.1.0": + version: 6.1.0 + resolution: "glob-stream@npm:6.1.0" dependencies: - chownr: ^1.1.4 - fs-minipass: ^1.2.7 - minipass: ^2.9.0 - minizlib: ^1.3.3 - mkdirp: ^0.5.5 - safe-buffer: ^5.2.1 - yallist: ^3.1.1 - checksum: 423c8259b17f8f612cef9c96805d65f90ba9a28e19be582cd9d0fcb217038219f29b7547198e8fd617da5f436376d6a74b99827acd1238d2f49cf62330f9664e + extend: ^3.0.0 + glob: ^7.1.1 + glob-parent: ^3.1.0 + is-negated-glob: ^1.0.0 + ordered-read-streams: ^1.0.0 + pumpify: ^1.3.5 + readable-stream: ^2.1.5 + remove-trailing-separator: ^1.0.1 + to-absolute-glob: ^2.0.0 + unique-stream: ^2.0.2 + checksum: 7c9ec7be266974186b762ad686813025868067f2ea64a0428c0365b4046cb955d328b1e7498124392ec0026c5826ce2cfa4b41614584fb63edd02421e61db556 languageName: node linkType: hard -"tar@npm:^6.1.11, tar@npm:^6.1.2, tar@npm:^6.2.1": - version: 6.2.1 - resolution: "tar@npm:6.2.1" +"glob@npm:8.1.0": + version: 8.1.0 + resolution: "glob@npm:8.1.0" dependencies: - chownr: ^2.0.0 - fs-minipass: ^2.0.0 - minipass: ^5.0.0 - minizlib: ^2.1.1 - mkdirp: ^1.0.3 - yallist: ^4.0.0 - checksum: f1322768c9741a25356c11373bce918483f40fa9a25c69c59410c8a1247632487edef5fe76c5f12ac51a6356d2f1829e96d2bc34098668a2fc34d76050ac2b6c + fs.realpath: ^1.0.0 + inflight: ^1.0.4 + inherits: 2 + minimatch: ^5.0.1 + once: ^1.3.0 + checksum: 92fbea3221a7d12075f26f0227abac435de868dd0736a17170663783296d0dd8d3d532a5672b4488a439bf5d7fb85cdd07c11185d6cd39184f0385cbdfb86a47 languageName: node linkType: hard -"teeny-request@npm:^9.0.0": - version: 9.0.0 - resolution: "teeny-request@npm:9.0.0" +"glob@npm:^7.0.0, glob@npm:^7.1.1, glob@npm:^7.1.3": + version: 7.2.3 + resolution: "glob@npm:7.2.3" dependencies: - http-proxy-agent: ^5.0.0 - https-proxy-agent: ^5.0.0 - node-fetch: ^2.6.9 - stream-events: ^1.0.5 - uuid: ^9.0.0 - checksum: 9cb0ad83f9ca6ce6515b3109cbb30ceb2533cdeab8e41c3a0de89f509bd92c5a9aabd27b3adf7f3e49516e106a358859b19fa4928a1937a4ab95809ccb7d52eb + fs.realpath: ^1.0.0 + inflight: ^1.0.4 + inherits: 2 + minimatch: ^3.1.1 + once: ^1.3.0 + path-is-absolute: ^1.0.0 + checksum: 29452e97b38fa704dabb1d1045350fb2467cf0277e155aa9ff7077e90ad81d1ea9d53d3ee63bd37c05b09a065e90f16aec4a65f5b8de401d1dac40bc5605d133 languageName: node linkType: hard -"teex@npm:^1.0.1": - version: 1.0.1 - resolution: "teex@npm:1.0.1" +"global-dirs@npm:^0.1.1": + version: 0.1.1 + resolution: "global-dirs@npm:0.1.1" dependencies: - streamx: ^2.12.5 - checksum: 36bf7ce8bb5eb428ad7b14b695ee7fb0a02f09c1a9d8181cc42531208543a920b299d711bf78dad4ff9bcf36ac437ae8e138053734746076e3e0e7d6d76eef64 + ini: ^1.3.4 + checksum: 10624f5a8ddb8634c22804c6b24f93fb591c3639a6bc78e3584e01a238fc6f7b7965824184e57d63f6df36980b6c191484ad7bc6c35a1599b8f1d64be64c2a4a languageName: node linkType: hard -"temp-dir@npm:^2.0.0, temp-dir@npm:~2.0.0": - version: 2.0.0 - resolution: "temp-dir@npm:2.0.0" - checksum: cc4f0404bf8d6ae1a166e0e64f3f409b423f4d1274d8c02814a59a5529f07db6cd070a749664141b992b2c1af337fa9bb451a460a43bb9bcddc49f235d3115aa +"global-modules@npm:^1.0.0": + version: 1.0.0 + resolution: "global-modules@npm:1.0.0" + dependencies: + global-prefix: ^1.0.1 + is-windows: ^1.0.1 + resolve-dir: ^1.0.0 + checksum: 10be68796c1e1abc1e2ba87ec4ea507f5629873b119ab0cd29c07284ef2b930f1402d10df01beccb7391dedd9cd479611dd6a24311c71be58937beaf18edf85e languageName: node linkType: hard -"temp@npm:^0.8.4": - version: 0.8.4 - resolution: "temp@npm:0.8.4" +"global-prefix@npm:^1.0.1": + version: 1.0.2 + resolution: "global-prefix@npm:1.0.2" dependencies: - rimraf: ~2.6.2 - checksum: f35bed78565355dfdf95f730b7b489728bd6b7e35071bcc6497af7c827fb6c111fbe9063afc7b8cbc19522a072c278679f9a0ee81e684aa2c8617cc0f2e9c191 + expand-tilde: ^2.0.2 + homedir-polyfill: ^1.0.1 + ini: ^1.3.4 + is-windows: ^1.0.1 + which: ^1.2.14 + checksum: 061b43470fe498271bcd514e7746e8a8535032b17ab9570517014ae27d700ff0dca749f76bbde13ba384d185be4310d8ba5712cb0e74f7d54d59390db63dd9a0 languageName: node linkType: hard -"temp@npm:^0.9.4": - version: 0.9.4 - resolution: "temp@npm:0.9.4" - dependencies: - mkdirp: ^0.5.1 - rimraf: ~2.6.2 - checksum: 8709d4d63278bd309ca0e49e80a268308dea543a949e71acd427b3314cd9417da9a2cc73425dd9c21c6780334dbffd67e05e7be5aaa73e9affe8479afc6f20e3 +"globals@npm:^11.1.0": + version: 11.12.0 + resolution: "globals@npm:11.12.0" + checksum: 67051a45eca3db904aee189dfc7cd53c20c7d881679c93f6146ddd4c9f4ab2268e68a919df740d39c71f4445d2b38ee360fc234428baea1dbdfe68bbcb46979e languageName: node linkType: hard -"tempy@npm:^0.6.0": - version: 0.6.0 - resolution: "tempy@npm:0.6.0" +"globby@npm:^11.0.0": + version: 11.1.0 + resolution: "globby@npm:11.1.0" dependencies: - is-stream: ^2.0.0 - temp-dir: ^2.0.0 - type-fest: ^0.16.0 - unique-string: ^2.0.0 - checksum: dd09c8b6615e4b785ea878e9a18b17ac0bfe5dccf5a0e205ebd274bb356356aff3f5c90a6c917077d51c75efb7648b113a78b0492e2ffc81a7c9912eb872ac52 + array-union: ^2.1.0 + dir-glob: ^3.0.1 + fast-glob: ^3.2.9 + ignore: ^5.2.0 + merge2: ^1.4.1 + slash: ^3.0.0 + checksum: b4be8885e0cfa018fc783792942d53926c35c50b3aefd3fdcfb9d22c627639dc26bd2327a40a0b74b074100ce95bb7187bfeae2f236856aa3de183af7a02aea6 languageName: node linkType: hard -"tempy@npm:^0.7.1": - version: 0.7.1 - resolution: "tempy@npm:0.7.1" +"gopd@npm:^1.0.1": + version: 1.0.1 + resolution: "gopd@npm:1.0.1" dependencies: - del: ^6.0.0 - is-stream: ^2.0.0 - temp-dir: ^2.0.0 - type-fest: ^0.16.0 - unique-string: ^2.0.0 - checksum: 265652f94eed077c311777e0290c4b4f3ec670c71c62c979efcbbd67ee506d677ff2741a72d7160556e9b0fba8fc5fbd7b3c482ac94c8acc48d85411f1f079c3 + get-intrinsic: ^1.1.3 + checksum: a5ccfb8806e0917a94e0b3de2af2ea4979c1da920bc381667c260e00e7cafdbe844e2cb9c5bcfef4e5412e8bf73bab837285bc35c7ba73aaaf0134d4583393a6 languageName: node linkType: hard -"term-size@npm:^1.2.0": - version: 1.2.0 - resolution: "term-size@npm:1.2.0" +"got@npm:^11.1.4": + version: 11.8.6 + resolution: "got@npm:11.8.6" dependencies: - execa: ^0.7.0 - checksum: 833aeb21c74d735c6ab63859fec6a7308d8724089b23b6f58e1a21c015058383529222a63074cbf0814a1812621bf11f01e60d5c5afbbfedcc31d115bf54631a + "@sindresorhus/is": ^4.0.0 + "@szmarczak/http-timer": ^4.0.5 + "@types/cacheable-request": ^6.0.1 + "@types/responselike": ^1.0.0 + cacheable-lookup: ^5.0.3 + cacheable-request: ^7.0.2 + decompress-response: ^6.0.0 + http2-wrapper: ^1.0.0-beta.5.2 + lowercase-keys: ^2.0.0 + p-cancelable: ^2.0.0 + responselike: ^2.0.0 + checksum: bbc783578a8d5030c8164ef7f57ce41b5ad7db2ed13371e1944bef157eeca5a7475530e07c0aaa71610d7085474d0d96222c9f4268d41db333a17e39b463f45d languageName: node linkType: hard -"terminal-link@npm:2.1.1, terminal-link@npm:^2.1.1": - version: 2.1.1 - resolution: "terminal-link@npm:2.1.1" +"got@npm:^9.6.0": + version: 9.6.0 + resolution: "got@npm:9.6.0" dependencies: - ansi-escapes: ^4.2.1 - supports-hyperlinks: ^2.0.0 - checksum: ce3d2cd3a438c4a9453947aa664581519173ea40e77e2534d08c088ee6dda449eabdbe0a76d2a516b8b73c33262fedd10d5270ccf7576ae316e3db170ce6562f + "@sindresorhus/is": ^0.14.0 + "@szmarczak/http-timer": ^1.1.2 + cacheable-request: ^6.0.0 + decompress-response: ^3.3.0 + duplexer3: ^0.1.4 + get-stream: ^4.1.0 + lowercase-keys: ^1.0.1 + mimic-response: ^1.0.1 + p-cancelable: ^1.0.0 + to-readable-stream: ^1.0.0 + url-parse-lax: ^3.0.0 + checksum: 941807bd9704bacf5eb401f0cc1212ffa1f67c6642f2d028fd75900471c221b1da2b8527f4553d2558f3faeda62ea1cf31665f8b002c6137f5de8732f07370b0 languageName: node linkType: hard -"terser-webpack-plugin@npm:5.3.9": - version: 5.3.9 - resolution: "terser-webpack-plugin@npm:5.3.9" - dependencies: - "@jridgewell/trace-mapping": ^0.3.17 - jest-worker: ^27.4.5 - schema-utils: ^3.1.1 - serialize-javascript: ^6.0.1 - terser: ^5.16.8 - peerDependencies: - webpack: ^5.1.0 - peerDependenciesMeta: - "@swc/core": - optional: true - esbuild: - optional: true - uglify-js: - optional: true - checksum: 41705713d6f9cb83287936b21e27c658891c78c4392159f5148b5623f0e8c48559869779619b058382a4c9758e7820ea034695e57dc7c474b4962b79f553bc5f +"graceful-fs@npm:^4.0.0, graceful-fs@npm:^4.1.11, graceful-fs@npm:^4.1.5, graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.2.0": + version: 4.2.11 + resolution: "graceful-fs@npm:4.2.11" + checksum: ac85f94da92d8eb6b7f5a8b20ce65e43d66761c55ce85ac96df6865308390da45a8d3f0296dd3a663de65d30ba497bd46c696cc1e248c72b13d6d567138a4fc7 languageName: node linkType: hard -"terser-webpack-plugin@npm:^5.2.5, terser-webpack-plugin@npm:^5.3.1, terser-webpack-plugin@npm:^5.3.10": - version: 5.3.10 - resolution: "terser-webpack-plugin@npm:5.3.10" +"gulp-sort@npm:^2.0.0": + version: 2.0.0 + resolution: "gulp-sort@npm:2.0.0" dependencies: - "@jridgewell/trace-mapping": ^0.3.20 - jest-worker: ^27.4.5 - schema-utils: ^3.1.1 - serialize-javascript: ^6.0.1 - terser: ^5.26.0 - peerDependencies: - webpack: ^5.1.0 - peerDependenciesMeta: - "@swc/core": - optional: true - esbuild: - optional: true - uglify-js: - optional: true - checksum: bd6e7596cf815f3353e2a53e79cbdec959a1b0276f5e5d4e63e9d7c3c5bb5306df567729da287d1c7b39d79093e56863c569c42c6c24cc34c76aa313bd2cbcea + through2: ^2.0.1 + checksum: 8645d80b26990290e8623ccf38420e319a4ea67b64ac3e4f2b5de6c20b9006973001fd989dfe0fe3b2560044d3dfbc005685126826536e01718a2628aa45d0c5 languageName: node linkType: hard -"terser@npm:5.24.0": - version: 5.24.0 - resolution: "terser@npm:5.24.0" - dependencies: - "@jridgewell/source-map": ^0.3.3 - acorn: ^8.8.2 - commander: ^2.20.0 - source-map-support: ~0.5.20 - bin: - terser: bin/terser - checksum: d88f774b6fa711a234fcecefd7657f99189c367e17dbe95a51c2776d426ad0e4d98d1ffe6edfdf299877c7602e495bdd711d21b2caaec188410795e5447d0f6c +"hard-rejection@npm:^2.1.0": + version: 2.1.0 + resolution: "hard-rejection@npm:2.1.0" + checksum: 7baaf80a0c7fff4ca79687b4060113f1529589852152fa935e6787a2bc96211e784ad4588fb3048136ff8ffc9dfcf3ae385314a5b24db32de20bea0d1597f9dc languageName: node linkType: hard -"terser@npm:^5.0.0, terser@npm:^5.10.0, terser@npm:^5.15.0, terser@npm:^5.16.8, terser@npm:^5.26.0": - version: 5.37.0 - resolution: "terser@npm:5.37.0" - dependencies: - "@jridgewell/source-map": ^0.3.3 - acorn: ^8.8.2 - commander: ^2.20.0 - source-map-support: ~0.5.20 - bin: - terser: bin/terser - checksum: 70c06a8ce1288ff4370a7e481beb6fc8b22fc4995371479f49df1552aa9cf8e794ace66e1da6e87057eda1745644311213f5043bda9a06cf55421eff68b3ac06 +"has-flag@npm:^2.0.0": + version: 2.0.0 + resolution: "has-flag@npm:2.0.0" + checksum: 7d060d142ef6740c79991cb99afe5962b267e6e95538bf8b607026b9b1e7451288927bc8e7b4a9484a8b99935c0af023070f91ee49faef791ecd401dc58b2e8d languageName: node linkType: hard -"test-exclude@npm:^6.0.0": - version: 6.0.0 - resolution: "test-exclude@npm:6.0.0" - dependencies: - "@istanbuljs/schema": ^0.1.2 - glob: ^7.1.4 - minimatch: ^3.0.4 - checksum: 3b34a3d77165a2cb82b34014b3aba93b1c4637a5011807557dc2f3da826c59975a5ccad765721c4648b39817e3472789f9b0fa98fc854c5c1c7a1e632aacdc28 +"has-flag@npm:^3.0.0": + version: 3.0.0 + resolution: "has-flag@npm:3.0.0" + checksum: 4a15638b454bf086c8148979aae044dd6e39d63904cd452d970374fa6a87623423da485dfb814e7be882e05c096a7ccf1ebd48e7e7501d0208d8384ff4dea73b languageName: node linkType: hard -"test-value@npm:^2.1.0": - version: 2.1.0 - resolution: "test-value@npm:2.1.0" - dependencies: - array-back: ^1.0.3 - typical: ^2.6.0 - checksum: ce41ef4100c9ac84630e78d1ca06706714587faf255e44296ace1fc7bf5b888c160b8c0229d31467252a3b2b57197965194391f6ee0c54f33e0b8e3af3a33a0c +"has-flag@npm:^4.0.0": + version: 4.0.0 + resolution: "has-flag@npm:4.0.0" + checksum: 261a1357037ead75e338156b1f9452c016a37dcd3283a972a30d9e4a87441ba372c8b81f818cd0fbcd9c0354b4ae7e18b9e1afa1971164aef6d18c2b6095a8ad languageName: node linkType: hard -"text-decoder@npm:^1.1.0": - version: 1.2.3 - resolution: "text-decoder@npm:1.2.3" +"has-property-descriptors@npm:^1.0.0, has-property-descriptors@npm:^1.0.2": + version: 1.0.2 + resolution: "has-property-descriptors@npm:1.0.2" dependencies: - b4a: ^1.6.4 - checksum: d7642a61f9d72330eac52ff6b6e8d34dea03ebbb1e82749a8734e7892e246cf262ed70730d20c4351c5dc5334297b9cc6c0b6a8725a204a63a197d7728bb35e5 + es-define-property: ^1.0.0 + checksum: fcbb246ea2838058be39887935231c6d5788babed499d0e9d0cc5737494c48aba4fe17ba1449e0d0fbbb1e36175442faa37f9c427ae357d6ccb1d895fbcd3de3 languageName: node linkType: hard -"text-extensions@npm:^1.0.0": - version: 1.9.0 - resolution: "text-extensions@npm:1.9.0" - checksum: 56a9962c1b62d39b2bcb369b7558ca85c1b55e554b38dfd725edcc0a1babe5815782a60c17ff6b839093b163dfebb92b804208aaaea616ec7571c8059ae0cf44 +"has-proto@npm:^1.0.1": + version: 1.0.3 + resolution: "has-proto@npm:1.0.3" + checksum: fe7c3d50b33f50f3933a04413ed1f69441d21d2d2944f81036276d30635cad9279f6b43bc8f32036c31ebdfcf6e731150f46c1907ad90c669ffe9b066c3ba5c4 languageName: node linkType: hard -"text-table@npm:^0.2.0": - version: 0.2.0 - resolution: "text-table@npm:0.2.0" - checksum: b6937a38c80c7f84d9c11dd75e49d5c44f71d95e810a3250bd1f1797fc7117c57698204adf676b71497acc205d769d65c16ae8fa10afad832ae1322630aef10a +"has-symbols@npm:^1.0.3": + version: 1.1.0 + resolution: "has-symbols@npm:1.1.0" + checksum: b2316c7302a0e8ba3aaba215f834e96c22c86f192e7310bdf689dd0e6999510c89b00fbc5742571507cebf25764d68c988b3a0da217369a73596191ac0ce694b languageName: node linkType: hard -"thenify-all@npm:^1.0.0": - version: 1.6.0 - resolution: "thenify-all@npm:1.6.0" +"has@npm:^1.0.3": + version: 1.0.3 + resolution: "has@npm:1.0.3" dependencies: - thenify: ">= 3.1.0 < 4" - checksum: dba7cc8a23a154cdcb6acb7f51d61511c37a6b077ec5ab5da6e8b874272015937788402fd271fdfc5f187f8cb0948e38d0a42dcc89d554d731652ab458f5343e + function-bind: ^1.1.1 + checksum: b9ad53d53be4af90ce5d1c38331e712522417d017d5ef1ebd0507e07c2fbad8686fffb8e12ddecd4c39ca9b9b47431afbb975b8abf7f3c3b82c98e9aad052792 languageName: node linkType: hard -"thenify@npm:>= 3.1.0 < 4": - version: 3.3.1 - resolution: "thenify@npm:3.3.1" +"hasown@npm:^2.0.0": + version: 2.0.2 + resolution: "hasown@npm:2.0.2" dependencies: - any-promise: ^1.0.0 - checksum: 84e1b804bfec49f3531215f17b4a6e50fd4397b5f7c1bccc427b9c656e1ecfb13ea79d899930184f78bc2f57285c54d9a50a590c8868f4f0cef5c1d9f898b05e + function-bind: ^1.1.2 + checksum: e8516f776a15149ca6c6ed2ae3110c417a00b62260e222590e54aa367cbcd6ed99122020b37b7fbdf05748df57b265e70095d7bf35a47660587619b15ffb93db languageName: node linkType: hard -"thread-stream@npm:^0.15.1": - version: 0.15.2 - resolution: "thread-stream@npm:0.15.2" - dependencies: - real-require: ^0.1.0 - checksum: 0547795a8f357ba1ac0dba29c71f965182e29e21752951a04a7167515ee37524bfba6c410f31e65a01a8d3e5b93400b812889aa09523e38ce4d744c894ffa6c0 +"he@npm:^1.1.0": + version: 1.2.0 + resolution: "he@npm:1.2.0" + bin: + he: bin/he + checksum: 3d4d6babccccd79c5c5a3f929a68af33360d6445587d628087f39a965079d84f18ce9c3d3f917ee1e3978916fc833bb8b29377c3b403f919426f91bc6965e7a7 languageName: node linkType: hard -"throat@npm:^5.0.0": - version: 5.0.0 - resolution: "throat@npm:5.0.0" - checksum: 031ff7f4431618036c1dedd99c8aa82f5c33077320a8358ed829e84b320783781d1869fe58e8f76e948306803de966f5f7573766a437562c9f5c033297ad2fe2 +"heimdalljs-logger@npm:^0.1.10, heimdalljs-logger@npm:^0.1.7": + version: 0.1.10 + resolution: "heimdalljs-logger@npm:0.1.10" + dependencies: + debug: ^2.2.0 + heimdalljs: ^0.2.6 + checksum: 40a698843aa4773e3376f4e000c87599460971f4411b402985526a8f82563f5486fc85bfde90ce3e63d25381cf417289e870242321ce92ade32ea3b91585cfad languageName: node linkType: hard -"throttle-debounce@npm:^2.1.0": - version: 2.3.0 - resolution: "throttle-debounce@npm:2.3.0" - checksum: 6d90aa2ddb294f8dad13d854a1cfcd88fdb757469669a096a7da10f515ee466857ac1e750649cb9da931165c6f36feb448318e7cb92570f0a3679d20e860a925 +"heimdalljs@npm:^0.2.6": + version: 0.2.6 + resolution: "heimdalljs@npm:0.2.6" + dependencies: + rsvp: ~3.2.1 + checksum: 5b28d3df4e77ea94293b43c29f0a358381aa811079817f780a1dafc9d244c891a0a713691a3c53d0d2dc31a76484fb36d998e7ae5040ef4b52e8c4a00d2173ae languageName: node linkType: hard -"throttleit@npm:^1.0.0": - version: 1.0.0 - resolution: "throttleit@npm:1.0.0" - checksum: 1b2db4d2454202d589e8236c07a69d2fab838876d370030ebea237c34c0a7d1d9cf11c29f994531ebb00efd31e9728291042b7754f2798a8352ec4463455b659 +"hey-listen@npm:^1.0.8": + version: 1.0.8 + resolution: "hey-listen@npm:1.0.8" + checksum: 6bad60b367688f5348e25e7ca3276a74b59ac5a09b0455e6ff8ab7d4a9e38cd2116c708a7dcd8a954d27253ce1d8717ec891d175723ea739885b828cf44e4072 languageName: node linkType: hard -"through2-filter@npm:^3.0.0": - version: 3.0.0 - resolution: "through2-filter@npm:3.0.0" +"homedir-polyfill@npm:^1.0.0, homedir-polyfill@npm:^1.0.1": + version: 1.0.3 + resolution: "homedir-polyfill@npm:1.0.3" dependencies: - through2: ~2.0.0 - xtend: ~4.0.0 - checksum: 2fa0f042290749824b973c27ae006f9dfe7c9bcee570504ab066998e3bd7d43bea28b642eef8a4434dbfd0a7cd18c8823ac81927614234fd477ccd5ea38fab18 + parse-passwd: ^1.0.0 + checksum: 18dd4db87052c6a2179d1813adea0c4bfcfa4f9996f0e226fefb29eb3d548e564350fa28ec46b0bf1fbc0a1d2d6922ceceb80093115ea45ff8842a4990139250 languageName: node linkType: hard -"through2@npm:^2.0.0, through2@npm:^2.0.1, through2@npm:^2.0.3, through2@npm:~2.0.0": - version: 2.0.5 - resolution: "through2@npm:2.0.5" - dependencies: - readable-stream: ~2.3.6 - xtend: ~4.0.1 - checksum: beb0f338aa2931e5660ec7bf3ad949e6d2e068c31f4737b9525e5201b824ac40cac6a337224856b56bd1ddd866334bbfb92a9f57cd6f66bc3f18d3d86fc0fe50 +"hosted-git-info@npm:^2.1.4": + version: 2.8.9 + resolution: "hosted-git-info@npm:2.8.9" + checksum: c955394bdab888a1e9bb10eb33029e0f7ce5a2ac7b3f158099dc8c486c99e73809dca609f5694b223920ca2174db33d32b12f9a2a47141dc59607c29da5a62dd languageName: node linkType: hard -"through2@npm:^4.0.0": - version: 4.0.2 - resolution: "through2@npm:4.0.2" +"hosted-git-info@npm:^4.0.1": + version: 4.1.0 + resolution: "hosted-git-info@npm:4.1.0" dependencies: - readable-stream: 3 - checksum: ac7430bd54ccb7920fd094b1c7ff3e1ad6edd94202e5528331253e5fde0cc56ceaa690e8df9895de2e073148c52dfbe6c4db74cacae812477a35660090960cc0 + lru-cache: ^6.0.0 + checksum: c3f87b3c2f7eb8c2748c8f49c0c2517c9a95f35d26f4bf54b2a8cba05d2e668f3753548b6ea366b18ec8dadb4e12066e19fa382a01496b0ffa0497eb23cbe461 languageName: node linkType: hard -"through@npm:2, through@npm:>=2.2.7 <3, through@npm:^2.3.6, through@npm:^2.3.8, through@npm:~2.3, through@npm:~2.3.1": - version: 2.3.8 - resolution: "through@npm:2.3.8" - checksum: a38c3e059853c494af95d50c072b83f8b676a9ba2818dcc5b108ef252230735c54e0185437618596c790bbba8fcdaef5b290405981ffa09dce67b1f1bf190cbd +"htmlparser2@npm:^8.0.1": + version: 8.0.2 + resolution: "htmlparser2@npm:8.0.2" + dependencies: + domelementtype: ^2.3.0 + domhandler: ^5.0.3 + domutils: ^3.0.1 + entities: ^4.4.0 + checksum: 29167a0f9282f181da8a6d0311b76820c8a59bc9e3c87009e21968264c2987d2723d6fde5a964d4b7b6cba663fca96ffb373c06d8223a85f52a6089ced942700 languageName: node linkType: hard -"thunky@npm:^1.0.2": - version: 1.1.0 - resolution: "thunky@npm:1.1.0" - checksum: 993096c472b6b8f30e29dc777a8d17720e4cab448375041f20c0cb802a09a7fb2217f2a3e8cdc11851faa71c957e2db309357367fc9d7af3cb7a4d00f4b66034 +"http-cache-semantics@npm:^4.0.0": + version: 4.1.1 + resolution: "http-cache-semantics@npm:4.1.1" + checksum: 83ac0bc60b17a3a36f9953e7be55e5c8f41acc61b22583060e8dedc9dd5e3607c823a88d0926f9150e571f90946835c7fe150732801010845c72cd8bbff1a236 languageName: node linkType: hard -"timed-out@npm:^4.0.0": - version: 4.0.1 - resolution: "timed-out@npm:4.0.1" - checksum: 98efc5d6fc0d2a329277bd4d34f65c1bf44d9ca2b14fd267495df92898f522e6f563c5e9e467c418e0836f5ca1f47a84ca3ee1de79b1cc6fe433834b7f02ec54 +"http-proxy-agent@npm:^5.0.0": + version: 5.0.0 + resolution: "http-proxy-agent@npm:5.0.0" + dependencies: + "@tootallnate/once": 2 + agent-base: 6 + debug: 4 + checksum: e2ee1ff1656a131953839b2a19cd1f3a52d97c25ba87bd2559af6ae87114abf60971e498021f9b73f9fd78aea8876d1fb0d4656aac8a03c6caa9fc175f22b786 languageName: node linkType: hard -"timers-browserify@npm:^2.0.12": - version: 2.0.12 - resolution: "timers-browserify@npm:2.0.12" +"http2-wrapper@npm:^1.0.0-beta.5.2": + version: 1.0.3 + resolution: "http2-wrapper@npm:1.0.3" dependencies: - setimmediate: ^1.0.4 - checksum: ec37ae299066bef6c464dcac29c7adafba1999e7227a9bdc4e105a459bee0f0b27234a46bfd7ab4041da79619e06a58433472867a913d01c26f8a203f87cee70 + quick-lru: ^5.1.1 + resolve-alpn: ^1.0.0 + checksum: 74160b862ec699e3f859739101ff592d52ce1cb207b7950295bf7962e4aa1597ef709b4292c673bece9c9b300efad0559fc86c71b1409c7a1e02b7229456003e languageName: node linkType: hard -"timm@npm:^1.6.1": - version: 1.7.1 - resolution: "timm@npm:1.7.1" - checksum: c80df538ec7fae50a0e3183931b20fbe97f6f2c06907d9675eb7b9d90b3f788af7742285c730192db3b066c4ab22ebae75f8d21970c5b03f38d928d5bb2a0339 +"https-proxy-agent@npm:^5.0.1": + version: 5.0.1 + resolution: "https-proxy-agent@npm:5.0.1" + dependencies: + agent-base: 6 + debug: 4 + checksum: 571fccdf38184f05943e12d37d6ce38197becdd69e58d03f43637f7fa1269cf303a7d228aa27e5b27bbd3af8f09fd938e1c91dcfefff2df7ba77c20ed8dfc765 languageName: node linkType: hard -"tiny-async-pool@npm:^2.1.0": +"human-signals@npm:^2.1.0": version: 2.1.0 - resolution: "tiny-async-pool@npm:2.1.0" - checksum: 8891326f30e587590f94c5e1f8cab59c9aa305e442fc5b9f7ea997f8611d805a797aae2ea93cd00b42b494ef749353df38b4555e2a769d6fff31a3db7add7208 - languageName: node - linkType: hard - -"tiny-inflate@npm:^1.0.0": - version: 1.0.3 - resolution: "tiny-inflate@npm:1.0.3" - checksum: 4086a1f8938dafa4a20c63b099aeb47bf8fef5aca991bf4ea4b35dd2684fa52363b2c19b3e76660311e7613cb7c4f063bc48751b9bdf9555e498d997c30bc2d6 + resolution: "human-signals@npm:2.1.0" + checksum: b87fd89fce72391625271454e70f67fe405277415b48bcc0117ca73d31fa23a4241787afdc8d67f5a116cf37258c052f59ea82daffa72364d61351423848e3b8 languageName: node linkType: hard -"tiny-invariant@npm:1.3.1": - version: 1.3.1 - resolution: "tiny-invariant@npm:1.3.1" - checksum: 872dbd1ff20a21303a2fd20ce3a15602cfa7fcf9b228bd694a52e2938224313b5385a1078cb667ed7375d1612194feaca81c4ecbe93121ca1baebe344de4f84c +"husky@npm:8.0.3": + version: 8.0.3 + resolution: "husky@npm:8.0.3" + bin: + husky: lib/bin.js + checksum: 837bc7e4413e58c1f2946d38fb050f5d7324c6f16b0fd66411ffce5703b294bd21429e8ba58711cd331951ee86ed529c5be4f76805959ff668a337dbfa82a1b0 languageName: node linkType: hard -"tiny-invariant@npm:^1.1.0, tiny-invariant@npm:^1.3.1, tiny-invariant@npm:^1.3.3": - version: 1.3.3 - resolution: "tiny-invariant@npm:1.3.3" - checksum: 5e185c8cc2266967984ce3b352a4e57cb89dad5a8abb0dea21468a6ecaa67cd5bb47a3b7a85d08041008644af4f667fb8b6575ba38ba5fb00b3b5068306e59fe +"hyperlinker@npm:^1.0.0": + version: 1.0.0 + resolution: "hyperlinker@npm:1.0.0" + checksum: f6d020ac552e9d048668206c805a737262b4c395546c773cceea3bc45252c46b4fa6eeb67c5896499dad00d21cb2f20f89fdd480a4529cfa3d012da2957162f9 languageName: node linkType: hard -"tiny-warning@npm:^1.0.3": - version: 1.0.3 - resolution: "tiny-warning@npm:1.0.3" - checksum: da62c4acac565902f0624b123eed6dd3509bc9a8d30c06e017104bedcf5d35810da8ff72864400ad19c5c7806fc0a8323c68baf3e326af7cb7d969f846100d71 +"i18next-parser@npm:8.6.0": + version: 8.6.0 + resolution: "i18next-parser@npm:8.6.0" + dependencies: + broccoli-plugin: ^4.0.7 + cheerio: ^1.0.0-rc.2 + colors: 1.4.0 + commander: ~11.0.0 + eol: ^0.9.1 + esbuild: ^0.19.0 + fs-extra: ^11.1.0 + gulp-sort: ^2.0.0 + i18next: ^22.0.4 + js-yaml: 4.1.0 + lilconfig: ^2.0.6 + rsvp: ^4.8.2 + sort-keys: ^5.0.0 + typescript: ^5.0.4 + vinyl: ~3.0.0 + vinyl-fs: ^3.0.2 + vue-template-compiler: ^2.6.11 + bin: + i18next: bin/cli.js + checksum: 5e288432fee63e84e94ed44e053be0307339b79e033ce011ae4e8364e52640e16a7d0f801f46c6496af99f76845322836cad82669fe1430b799410edf06f01c4 languageName: node linkType: hard -"tinycolor2@npm:^1.4.1": - version: 1.4.2 - resolution: "tinycolor2@npm:1.4.2" - checksum: 57ed262e08815a4ab0ed933edafdbc6555a17081781766149813b44a080ecbe58b3ee281e81c0e75b42e4d41679f138cfa98eabf043f829e0683c04adb12c031 +"i18next@npm:23.10.0": + version: 23.10.0 + resolution: "i18next@npm:23.10.0" + dependencies: + "@babel/runtime": ^7.23.2 + checksum: 7b476071787c2b909517c86828b17ca7a7ae98c848a052a1c55f9cff114c2307975dcf8dcc30e43ca64389fb24cd2b76382d002d5c3ed0a9a900563813f61863 languageName: node linkType: hard -"tinyglobby@npm:^0.2.6": - version: 0.2.10 - resolution: "tinyglobby@npm:0.2.10" +"i18next@npm:^22.0.4": + version: 22.5.1 + resolution: "i18next@npm:22.5.1" dependencies: - fdir: ^6.4.2 - picomatch: ^4.0.2 - checksum: 7e2ffe262ebc149036bdef37c56b32d02d52cf09efa7d43dbdab2ea3c12844a4da881058835ce4c74d1891190e5ad5ec5133560a11ec8314849b68ad0d99d3f4 + "@babel/runtime": ^7.20.6 + checksum: 175f8ab7fac2abcee147b00cc2d8e7d4fa9b05cdc227f02cac841fc2fd9545ed4a6d88774f594f8ad12dc944e4d34cc8e88aa00c8b9947baef9e859d93abd305 languageName: node linkType: hard -"tinyrainbow@npm:^1.2.0": - version: 1.2.0 - resolution: "tinyrainbow@npm:1.2.0" - checksum: d1e2cb5400032c0092be00e4a3da5450bea8b4fad58bfb5d3c58ca37ff5c5e252f7fcfb9af247914854af79c46014add9d1042fe044358c305a129ed55c8be35 +"ignore@npm:^5.2.0, ignore@npm:^5.2.4": + version: 5.3.0 + resolution: "ignore@npm:5.3.0" + checksum: 2736da6621f14ced652785cb05d86301a66d70248597537176612bd0c8630893564bd5f6421f8806b09e8472e75c591ef01672ab8059c07c6eb2c09cefe04bf9 languageName: node linkType: hard -"tinyspy@npm:^3.0.0": - version: 3.0.2 - resolution: "tinyspy@npm:3.0.2" - checksum: 5db671b2ff5cd309de650c8c4761ca945459d7204afb1776db9a04fb4efa28a75f08517a8620c01ee32a577748802231ad92f7d5b194dc003ee7f987a2a06337 +"import-fresh@npm:^3.0.0, import-fresh@npm:^3.2.1": + version: 3.3.1 + resolution: "import-fresh@npm:3.3.1" + dependencies: + parent-module: ^1.0.0 + resolve-from: ^4.0.0 + checksum: a06b19461b4879cc654d46f8a6244eb55eb053437afd4cbb6613cad6be203811849ed3e4ea038783092879487299fda24af932b86bdfff67c9055ba3612b8c87 languageName: node linkType: hard -"title-case@npm:^3.0.3": - version: 3.0.3 - resolution: "title-case@npm:3.0.3" - dependencies: - tslib: ^2.0.3 - checksum: e8b7ea006b53cf3208d278455d9f1e22c409459d7f9878da324fa3b18cc0aef8560924c19c744e870394a5d9cddfdbe029ebae9875909ee7f4fc562e7cbfc53e +"indent-string@npm:^4.0.0": + version: 4.0.0 + resolution: "indent-string@npm:4.0.0" + checksum: 824cfb9929d031dabf059bebfe08cf3137365e112019086ed3dcff6a0a7b698cb80cf67ccccde0e25b9e2d7527aa6cc1fed1ac490c752162496caba3e6699612 languageName: node linkType: hard -"tmp@npm:0.0.33, tmp@npm:^0.0.33": - version: 0.0.33 - resolution: "tmp@npm:0.0.33" +"inflight@npm:^1.0.4": + version: 1.0.6 + resolution: "inflight@npm:1.0.6" dependencies: - os-tmpdir: ~1.0.2 - checksum: 902d7aceb74453ea02abbf58c203f4a8fc1cead89b60b31e354f74ed5b3fb09ea817f94fb310f884a5d16987dd9fa5a735412a7c2dd088dd3d415aa819ae3a28 + once: ^1.3.0 + wrappy: 1 + checksum: f4f76aa072ce19fae87ce1ef7d221e709afb59d445e05d47fba710e85470923a75de35bfae47da6de1b18afc3ce83d70facf44cfb0aff89f0a3f45c0a0244dfd languageName: node linkType: hard -"tmp@npm:~0.2.1": - version: 0.2.1 - resolution: "tmp@npm:0.2.1" - dependencies: - rimraf: ^3.0.0 - checksum: 8b1214654182575124498c87ca986ac53dc76ff36e8f0e0b67139a8d221eaecfdec108c0e6ec54d76f49f1f72ab9325500b246f562b926f85bcdfca8bf35df9e +"inherits@npm:2, inherits@npm:^2.0.1, inherits@npm:^2.0.3, inherits@npm:~2.0.3": + version: 2.0.4 + resolution: "inherits@npm:2.0.4" + checksum: 4a48a733847879d6cf6691860a6b1e3f0f4754176e4d71494c41f3475553768b10f84b5ce1d40fbd0e34e6bfbb864ee35858ad4dd2cf31e02fc4a154b724d7f1 languageName: node linkType: hard -"tmpl@npm:1.0.5": - version: 1.0.5 - resolution: "tmpl@npm:1.0.5" - checksum: cd922d9b853c00fe414c5a774817be65b058d54a2d01ebb415840960406c669a0fc632f66df885e24cb022ec812739199ccbdb8d1164c3e513f85bfca5ab2873 +"ini@npm:^1.3.4, ini@npm:^1.3.5, ini@npm:~1.3.0": + version: 1.3.8 + resolution: "ini@npm:1.3.8" + checksum: dfd98b0ca3a4fc1e323e38a6c8eb8936e31a97a918d3b377649ea15bdb15d481207a0dda1021efbd86b464cae29a0d33c1d7dcaf6c5672bee17fa849bc50a1b3 languageName: node linkType: hard -"to-absolute-glob@npm:^2.0.0": - version: 2.0.2 - resolution: "to-absolute-glob@npm:2.0.2" - dependencies: - is-absolute: ^1.0.0 - is-negated-glob: ^1.0.0 - checksum: 0a8bef172909e43d711bfd33792643f2eec35b9109bde927dabfd231e6ad643b7a657f306c93c6e7b89f71d3de74ac94060fe9637bca8c37b036523993664323 +"interpret@npm:^1.0.0": + version: 1.4.0 + resolution: "interpret@npm:1.4.0" + checksum: 2e5f51268b5941e4a17e4ef0575bc91ed0ab5f8515e3cf77486f7c14d13f3010df9c0959f37063dcc96e78d12dc6b0bb1b9e111cdfe69771f4656d2993d36155 languageName: node linkType: hard -"to-readable-stream@npm:^1.0.0": +"is-absolute@npm:^1.0.0": version: 1.0.0 - resolution: "to-readable-stream@npm:1.0.0" - checksum: 2bd7778490b6214a2c40276065dd88949f4cf7037ce3964c76838b8cb212893aeb9cceaaf4352a4c486e3336214c350270f3263e1ce7a0c38863a715a4d9aeb5 + resolution: "is-absolute@npm:1.0.0" + dependencies: + is-relative: ^1.0.0 + is-windows: ^1.0.1 + checksum: 9d16b2605eda3f3ce755410f1d423e327ad3a898bcb86c9354cf63970ed3f91ba85e9828aa56f5d6a952b9fae43d0477770f78d37409ae8ecc31e59ebc279b27 languageName: node linkType: hard -"to-regex-range@npm:^5.0.1": - version: 5.0.1 - resolution: "to-regex-range@npm:5.0.1" - dependencies: - is-number: ^7.0.0 - checksum: f76fa01b3d5be85db6a2a143e24df9f60dd047d151062d0ba3df62953f2f697b16fe5dad9b0ac6191c7efc7b1d9dcaa4b768174b7b29da89d4428e64bc0a20ed +"is-arrayish@npm:^0.2.1": + version: 0.2.1 + resolution: "is-arrayish@npm:0.2.1" + checksum: eef4417e3c10e60e2c810b6084942b3ead455af16c4509959a27e490e7aee87cfb3f38e01bbde92220b528a0ee1a18d52b787e1458ee86174d8c7f0e58cd488f languageName: node linkType: hard -"to-through@npm:^2.0.0": - version: 2.0.0 - resolution: "to-through@npm:2.0.0" - dependencies: - through2: ^2.0.3 - checksum: 5834a69d68cbe0d74115373bbe219dbe60c1950021f5ec9dd4af179ffbb307bce3d45fde9dacec05a8f4f79b86734433eb9b42946ccb81d2d4d4f8828628b7e6 +"is-buffer@npm:^1.1.5": + version: 1.1.6 + resolution: "is-buffer@npm:1.1.6" + checksum: 4a186d995d8bbf9153b4bd9ff9fd04ae75068fe695d29025d25e592d9488911eeece84eefbd8fa41b8ddcc0711058a71d4c466dcf6f1f6e1d83830052d8ca707 languageName: node linkType: hard -"toformat@npm:^2.0.0": - version: 2.0.0 - resolution: "toformat@npm:2.0.0" - checksum: c75341911a811a85c309e2c3eb8e9c7b60f26e2c629170179fc92ed339a2faf44433ebde75d4ac6dbe6f55a2aa044e1d4cd5242dbdd5e4c047babbe6defd8387 +"is-core-module@npm:2.13.0": + version: 2.13.0 + resolution: "is-core-module@npm:2.13.0" + dependencies: + has: ^1.0.3 + checksum: 053ab101fb390bfeb2333360fd131387bed54e476b26860dc7f5a700bbf34a0ec4454f7c8c4d43e8a0030957e4b3db6e16d35e1890ea6fb654c833095e040355 languageName: node linkType: hard -"toggle-selection@npm:^1.0.6": - version: 1.0.6 - resolution: "toggle-selection@npm:1.0.6" - checksum: a90dc80ed1e7b18db8f4e16e86a5574f87632dc729cfc07d9ea3ced50021ad42bb4e08f22c0913e0b98e3837b0b717e0a51613c65f30418e21eb99da6556a74c +"is-extendable@npm:^0.1.0": + version: 0.1.1 + resolution: "is-extendable@npm:0.1.1" + checksum: 3875571d20a7563772ecc7a5f36cb03167e9be31ad259041b4a8f73f33f885441f778cee1f1fe0085eb4bc71679b9d8c923690003a36a6a5fdf8023e6e3f0672 languageName: node linkType: hard -"toidentifier@npm:1.0.1": - version: 1.0.1 - resolution: "toidentifier@npm:1.0.1" - checksum: 952c29e2a85d7123239b5cfdd889a0dde47ab0497f0913d70588f19c53f7e0b5327c95f4651e413c74b785147f9637b17410ac8c846d5d4a20a5a33eb6dc3a45 +"is-extglob@npm:^2.1.0, is-extglob@npm:^2.1.1": + version: 2.1.1 + resolution: "is-extglob@npm:2.1.1" + checksum: df033653d06d0eb567461e58a7a8c9f940bd8c22274b94bf7671ab36df5719791aae15eef6d83bbb5e23283967f2f984b8914559d4449efda578c775c4be6f85 languageName: node linkType: hard -"totalist@npm:^3.0.0": - version: 3.0.1 - resolution: "totalist@npm:3.0.1" - checksum: 5132d562cf88ff93fd710770a92f31dbe67cc19b5c6ccae2efc0da327f0954d211bbfd9456389655d726c624f284b4a23112f56d1da931ca7cfabbe1f45e778a +"is-fullwidth-code-point@npm:^3.0.0": + version: 3.0.0 + resolution: "is-fullwidth-code-point@npm:3.0.0" + checksum: 44a30c29457c7fb8f00297bce733f0a64cd22eca270f83e58c105e0d015e45c019491a4ab2faef91ab51d4738c670daff901c799f6a700e27f7314029e99e348 languageName: node linkType: hard -"tough-cookie@npm:^4.1.2, tough-cookie@npm:^4.1.3": - version: 4.1.4 - resolution: "tough-cookie@npm:4.1.4" +"is-glob@npm:^3.1.0": + version: 3.1.0 + resolution: "is-glob@npm:3.1.0" dependencies: - psl: ^1.1.33 - punycode: ^2.1.1 - universalify: ^0.2.0 - url-parse: ^1.5.3 - checksum: 5815059f014c31179a303c673f753f7899a6fce94ac93712c88ea5f3c26e0c042b5f0c7a599a00f8e0feeca4615dba75c3dffc54f3c1a489978aa8205e09307c + is-extglob: ^2.1.0 + checksum: 9d483bca84f16f01230f7c7c8c63735248fe1064346f292e0f6f8c76475fd20c6f50fc19941af5bec35f85d6bf26f4b7768f39a48a5f5fdc72b408dc74e07afc languageName: node linkType: hard -"tr46@npm:^1.0.1": - version: 1.0.1 - resolution: "tr46@npm:1.0.1" +"is-glob@npm:^4.0.1, is-glob@npm:^4.0.3": + version: 4.0.3 + resolution: "is-glob@npm:4.0.3" dependencies: - punycode: ^2.1.0 - checksum: 96d4ed46bc161db75dbf9247a236ea0bfcaf5758baae6749e92afab0bc5a09cb59af21788ede7e55080f2bf02dce3e4a8f2a484cc45164e29f4b5e68f7cbcc1a + is-extglob: ^2.1.1 + checksum: d381c1319fcb69d341cc6e6c7cd588e17cd94722d9a32dbd60660b993c4fb7d0f19438674e68dfec686d09b7c73139c9166b47597f846af387450224a8101ab4 languageName: node linkType: hard -"tr46@npm:^3.0.0": - version: 3.0.0 - resolution: "tr46@npm:3.0.0" - dependencies: - punycode: ^2.1.1 - checksum: 44c3cc6767fb800490e6e9fd64fd49041aa4e49e1f6a012b34a75de739cc9ed3a6405296072c1df8b6389ae139c5e7c6496f659cfe13a04a4bff3a1422981270 +"is-negated-glob@npm:^1.0.0": + version: 1.0.0 + resolution: "is-negated-glob@npm:1.0.0" + checksum: 2a767da06435b492daa98d3049480f0b7032abd5bfd3930ac01dbe9d6fcae04f2b3d883c6dca6b9c0c3f8a703952643c78540151c3eb1a2fe90fec543d61d241 languageName: node linkType: hard -"tr46@npm:~0.0.3": - version: 0.0.3 - resolution: "tr46@npm:0.0.3" - checksum: 726321c5eaf41b5002e17ffbd1fb7245999a073e8979085dacd47c4b4e8068ff5777142fc6726d6ca1fd2ff16921b48788b87225cbc57c72636f6efa8efbffe3 +"is-number@npm:^7.0.0": + version: 7.0.0 + resolution: "is-number@npm:7.0.0" + checksum: 456ac6f8e0f3111ed34668a624e45315201dff921e5ac181f8ec24923b99e9f32ca1a194912dc79d539c97d33dba17dc635202ff0b2cf98326f608323276d27a languageName: node linkType: hard -"tree-kill@npm:^1.2.2": - version: 1.2.2 - resolution: "tree-kill@npm:1.2.2" - bin: - tree-kill: cli.js - checksum: 49117f5f410d19c84b0464d29afb9642c863bc5ba40fcb9a245d474c6d5cc64d1b177a6e6713129eb346b40aebb9d4631d967517f9fbe8251c35b21b13cd96c7 +"is-obj@npm:^2.0.0": + version: 2.0.0 + resolution: "is-obj@npm:2.0.0" + checksum: c9916ac8f4621962a42f5e80e7ffdb1d79a3fab7456ceaeea394cd9e0858d04f985a9ace45be44433bf605673c8be8810540fe4cc7f4266fc7526ced95af5a08 languageName: node linkType: hard -"treeify@npm:^1.1.0": +"is-plain-obj@npm:^1.1.0": version: 1.1.0 - resolution: "treeify@npm:1.1.0" - checksum: aa00dded220c1dd052573bd6fc2c52862f09870851a284f0d3650d72bf913ba9b4f6b824f4f1ab81899bae29375f4266b07fe47cbf82343a1efa13cc09ce87af + resolution: "is-plain-obj@npm:1.1.0" + checksum: 0ee04807797aad50859652a7467481816cbb57e5cc97d813a7dcd8915da8195dc68c436010bf39d195226cde6a2d352f4b815f16f26b7bf486a5754290629931 languageName: node linkType: hard -"trim-newlines@npm:^3.0.0": - version: 3.0.1 - resolution: "trim-newlines@npm:3.0.1" - checksum: b530f3fadf78e570cf3c761fb74fef655beff6b0f84b29209bac6c9622db75ad1417f4a7b5d54c96605dcd72734ad44526fef9f396807b90839449eb543c6206 +"is-plain-obj@npm:^4.0.0": + version: 4.1.0 + resolution: "is-plain-obj@npm:4.1.0" + checksum: 6dc45da70d04a81f35c9310971e78a6a3c7a63547ef782e3a07ee3674695081b6ca4e977fbb8efc48dae3375e0b34558d2bcd722aec9bddfa2d7db5b041be8ce languageName: node linkType: hard -"trim-trailing-lines@npm:^1.0.0": - version: 1.1.4 - resolution: "trim-trailing-lines@npm:1.1.4" - checksum: 5d39d21c0d4b258667012fcd784f73129e148ea1c213b1851d8904f80499fc91df6710c94c7dd49a486a32da2b9cb86020dda79f285a9a2586cfa622f80490c2 +"is-plain-object@npm:^5.0.0": + version: 5.0.0 + resolution: "is-plain-object@npm:5.0.0" + checksum: e32d27061eef62c0847d303125440a38660517e586f2f3db7c9d179ae5b6674ab0f469d519b2e25c147a1a3bc87156d0d5f4d8821e0ce4a9ee7fe1fcf11ce45c languageName: node linkType: hard -"trim@npm:0.0.1": - version: 0.0.1 - resolution: "trim@npm:0.0.1" - checksum: 2b4646dff99a222e8e1526edd4e3a43bbd925af0b8e837c340455d250157e7deefaa4da49bb891ab841e5c27b1afc5e9e32d4b57afb875d2dfcabf4e319b8f7f +"is-relative@npm:^1.0.0": + version: 1.0.0 + resolution: "is-relative@npm:1.0.0" + dependencies: + is-unc-path: ^1.0.0 + checksum: 3271a0df109302ef5e14a29dcd5d23d9788e15ade91a40b942b035827ffbb59f7ce9ff82d036ea798541a52913cbf9d2d0b66456340887b51f3542d57b5a4c05 languageName: node linkType: hard -"trough@npm:^1.0.0": - version: 1.0.5 - resolution: "trough@npm:1.0.5" - checksum: d6c8564903ed00e5258bab92134b020724dbbe83148dc72e4bf6306c03ed8843efa1bcc773fa62410dd89161ecb067432dd5916501793508a9506cacbc408e25 +"is-stream@npm:^2.0.0": + version: 2.0.1 + resolution: "is-stream@npm:2.0.1" + checksum: b8e05ccdf96ac330ea83c12450304d4a591f9958c11fd17bed240af8d5ffe08aedafa4c0f4cfccd4d28dc9d4d129daca1023633d5c11601a6cbc77521f6fae66 languageName: node linkType: hard -"tryer@npm:^1.0.1": +"is-text-path@npm:^1.0.1": version: 1.0.1 - resolution: "tryer@npm:1.0.1" - checksum: 1cf14d7f67c79613f054b569bfc9a89c7020d331573a812dfcf7437244e8f8e6eb6893b210cbd9cc217f67c1d72617f89793df231e4fe7d53634ed91cf3a89d1 - languageName: node - linkType: hard - -"ts-api-utils@npm:^1.0.1": - version: 1.4.0 - resolution: "ts-api-utils@npm:1.4.0" - peerDependencies: - typescript: ">=4.2.0" - checksum: 477601317dc8a6d961788663ee76984005ed20c70689bd6f807eed2cad258d3731edcc4162d438ce04782ca62a05373ba51e484180fc2a081d8dab2bf693a5af + resolution: "is-text-path@npm:1.0.1" + dependencies: + text-extensions: ^1.0.0 + checksum: fb5d78752c22b3f73a7c9540768f765ffcfa38c9e421e2b9af869565307fa1ae5e3d3a2ba016a43549742856846566d327da406e94a5846ec838a288b1704fd2 languageName: node linkType: hard -"ts-dedent@npm:^2.0.0, ts-dedent@npm:^2.2.0": - version: 2.2.0 - resolution: "ts-dedent@npm:2.2.0" - checksum: 93ed8f7878b6d5ed3c08d99b740010eede6bccfe64bce61c5a4da06a2c17d6ddbb80a8c49c2d15251de7594a4f93ffa21dd10e7be75ef66a4dc9951b4a94e2af +"is-unc-path@npm:^1.0.0": + version: 1.0.0 + resolution: "is-unc-path@npm:1.0.0" + dependencies: + unc-path-regex: ^0.1.2 + checksum: e8abfde203f7409f5b03a5f1f8636e3a41e78b983702ef49d9343eb608cdfe691429398e8815157519b987b739bcfbc73ae7cf4c8582b0ab66add5171088eab6 languageName: node linkType: hard -"ts-essentials@npm:^7.0.1": - version: 7.0.3 - resolution: "ts-essentials@npm:7.0.3" - peerDependencies: - typescript: ">=3.7.0" - checksum: 74d75868acf7f8b95e447d8b3b7442ca21738c6894e576df9917a352423fde5eb43c5651da5f78997da6061458160ae1f6b279150b42f47ccc58b73e55acaa2f +"is-utf8@npm:^0.2.1": + version: 0.2.1 + resolution: "is-utf8@npm:0.2.1" + checksum: 167ccd2be869fc228cc62c1a28df4b78c6b5485d15a29027d3b5dceb09b383e86a3522008b56dcac14b592b22f0a224388718c2505027a994fd8471465de54b3 languageName: node linkType: hard -"ts-graphviz@npm:^1.5.0": - version: 1.8.1 - resolution: "ts-graphviz@npm:1.8.1" - checksum: c560fc3a70fc7743bb1cacd21fdeb68661e78132cad4c0cb53c071d2485b1e5975350f0a754c2a797912e9d9022dc375b47e6b023a2eafe4b824c0bb9b7d58ed +"is-valid-glob@npm:^1.0.0": + version: 1.0.0 + resolution: "is-valid-glob@npm:1.0.0" + checksum: 0155951e89291d405cbb2ff4e25a38ee7a88bc70b05f246c25d31a1d09f13d4207377e5860f67443bbda8e3e353da37047b60e586bd9c97a39c9301c30b67acb languageName: node linkType: hard -"ts-interface-checker@npm:^0.1.9": - version: 0.1.13 - resolution: "ts-interface-checker@npm:0.1.13" - checksum: 20c29189c2dd6067a8775e07823ddf8d59a33e2ffc47a1bd59a5cb28bb0121a2969a816d5e77eda2ed85b18171aa5d1c4005a6b88ae8499ec7cc49f78571cb5e +"is-windows@npm:^1.0.1": + version: 1.0.2 + resolution: "is-windows@npm:1.0.2" + checksum: 438b7e52656fe3b9b293b180defb4e448088e7023a523ec21a91a80b9ff8cdb3377ddb5b6e60f7c7de4fa8b63ab56e121b6705fe081b3cf1b828b0a380009ad7 languageName: node linkType: hard -"ts-invariant@npm:^0.10.3": - version: 0.10.3 - resolution: "ts-invariant@npm:0.10.3" - dependencies: - tslib: ^2.1.0 - checksum: bb07d56fe4aae69d8860e0301dfdee2d375281159054bc24bf1e49e513fb0835bf7f70a11351344d213a79199c5e695f37ebbf5a447188a377ce0cd81d91ddb5 +"isarray@npm:~1.0.0": + version: 1.0.0 + resolution: "isarray@npm:1.0.0" + checksum: f032df8e02dce8ec565cf2eb605ea939bdccea528dbcf565cdf92bfa2da9110461159d86a537388ef1acef8815a330642d7885b29010e8f7eac967c9993b65ab languageName: node linkType: hard -"ts-jest@npm:29.2.5": - version: 29.2.5 - resolution: "ts-jest@npm:29.2.5" - dependencies: - bs-logger: ^0.2.6 - ejs: ^3.1.10 - fast-json-stable-stringify: ^2.1.0 - jest-util: ^29.0.0 - json5: ^2.2.3 - lodash.memoize: ^4.1.2 - make-error: ^1.3.6 - semver: ^7.6.3 - yargs-parser: ^21.1.1 - peerDependencies: - "@babel/core": ">=7.0.0-beta.0 <8" - "@jest/transform": ^29.0.0 - "@jest/types": ^29.0.0 - babel-jest: ^29.0.0 - jest: ^29.0.0 - typescript: ">=4.3 <6" - peerDependenciesMeta: - "@babel/core": - optional: true - "@jest/transform": - optional: true - "@jest/types": - optional: true - babel-jest: - optional: true - esbuild: - optional: true - bin: - ts-jest: cli.js - checksum: d60d1e1d80936f6002b1bb27f7e062408bc733141b9d666565503f023c340a3196d506c836a4316c5793af81a5f910ab49bb9c13f66e2dc66de4e0f03851dbca +"isexe@npm:^2.0.0": + version: 2.0.0 + resolution: "isexe@npm:2.0.0" + checksum: 26bf6c5480dda5161c820c5b5c751ae1e766c587b1f951ea3fcfc973bafb7831ae5b54a31a69bd670220e42e99ec154475025a468eae58ea262f813fdc8d1c62 languageName: node linkType: hard -"ts-loader@npm:9.5.1": - version: 9.5.1 - resolution: "ts-loader@npm:9.5.1" - dependencies: - chalk: ^4.1.0 - enhanced-resolve: ^5.0.0 - micromatch: ^4.0.0 - semver: ^7.3.4 - source-map: ^0.7.4 - peerDependencies: - typescript: "*" - webpack: ^5.0.0 - checksum: 7cf396e656d905388ea2a9b5e82f16d3c955fda8d3df2fbf219f4bee16ff50a3c995c44ae3e584634e9443f056cec70bb3151add3917ffb4588ecd7394bac0ec +"js-sha3@npm:0.8.0": + version: 0.8.0 + resolution: "js-sha3@npm:0.8.0" + checksum: 75df77c1fc266973f06cce8309ce010e9e9f07ec35ab12022ed29b7f0d9c8757f5a73e1b35aa24840dced0dea7059085aa143d817aea9e188e2a80d569d9adce languageName: node linkType: hard -"ts-log@npm:^2.2.3": - version: 2.2.5 - resolution: "ts-log@npm:2.2.5" - checksum: 28f78ab15b8555d56c089dbc243327d8ce4331219956242a29fc4cb3bad6bb0cb8234dd17a292381a1b1dba99a7e4849a2181b2e1a303e8247e9f4ca4e284f2d +"js-tokens@npm:^4.0.0": + version: 4.0.0 + resolution: "js-tokens@npm:4.0.0" + checksum: 8a95213a5a77deb6cbe94d86340e8d9ace2b93bc367790b260101d2f36a2eaf4e4e22d9fa9cf459b38af3a32fb4190e638024cf82ec95ef708680e405ea7cc78 languageName: node linkType: hard -"ts-morph@npm:23.0.0": - version: 23.0.0 - resolution: "ts-morph@npm:23.0.0" +"js-yaml@npm:4.1.0, js-yaml@npm:^4.0.0, js-yaml@npm:^4.1.0": + version: 4.1.0 + resolution: "js-yaml@npm:4.1.0" dependencies: - "@ts-morph/common": ~0.24.0 - code-block-writer: ^13.0.1 - checksum: 3282eb0f8bd4577770874736c3259b97501da9a86137160b5d68f106b7848ea7b1fbccf9e198a3d930ec40c993e9951d4bfae31e2562dac8f3de0d7bb0e23615 + argparse: ^2.0.1 + bin: + js-yaml: bin/js-yaml.js + checksum: c7830dfd456c3ef2c6e355cc5a92e6700ceafa1d14bba54497b34a99f0376cecbb3e9ac14d3e5849b426d5a5140709a66237a8c991c675431271c4ce5504151a languageName: node linkType: hard -"ts-node@npm:^10.7.0, ts-node@npm:^10.8.1, ts-node@npm:^10.9.2": - version: 10.9.2 - resolution: "ts-node@npm:10.9.2" - dependencies: - "@cspotcode/source-map-support": ^0.8.0 - "@tsconfig/node10": ^1.0.7 - "@tsconfig/node12": ^1.0.7 - "@tsconfig/node14": ^1.0.0 - "@tsconfig/node16": ^1.0.2 - acorn: ^8.4.1 - acorn-walk: ^8.1.1 - arg: ^4.1.0 - create-require: ^1.1.0 - diff: ^4.0.1 - make-error: ^1.1.1 - v8-compile-cache-lib: ^3.0.1 - yn: 3.1.1 - peerDependencies: - "@swc/core": ">=1.2.50" - "@swc/wasm": ">=1.2.50" - "@types/node": "*" - typescript: ">=2.7" - peerDependenciesMeta: - "@swc/core": - optional: true - "@swc/wasm": - optional: true - bin: - ts-node: dist/bin.js - ts-node-cwd: dist/bin-cwd.js - ts-node-esm: dist/bin-esm.js - ts-node-script: dist/bin-script.js - ts-node-transpile-only: dist/bin-transpile.js - ts-script: dist/bin-script-deprecated.js - checksum: fde256c9073969e234526e2cfead42591b9a2aec5222bac154b0de2fa9e4ceb30efcd717ee8bc785a56f3a119bdd5aa27b333d9dbec94ed254bd26f8944c67ac +"js-yaml@npm:^3.14.1, js-yaml@npm:^3.6.1": + version: 3.14.1 + resolution: "js-yaml@npm:3.14.1" + dependencies: + argparse: ^1.0.7 + esprima: ^4.0.0 + bin: + js-yaml: bin/js-yaml.js + checksum: bef146085f472d44dee30ec34e5cf36bf89164f5d585435a3d3da89e52622dff0b188a580e4ad091c3341889e14cb88cac6e4deb16dc5b1e9623bb0601fc255c languageName: node linkType: hard -"ts-object-utils@npm:0.0.5": - version: 0.0.5 - resolution: "ts-object-utils@npm:0.0.5" - checksum: 83c48fbdaba392fb2c01cea53b267ed5538d2bb44fc6c3eecc10bcfabc1780bfa6ec8569b52bbf0140d9b521d9049d5f15884e12286918244d463d854dbc73cb +"jsesc@npm:^3.0.2": + version: 3.0.2 + resolution: "jsesc@npm:3.0.2" + bin: + jsesc: bin/jsesc + checksum: a36d3ca40574a974d9c2063bf68c2b6141c20da8f2a36bd3279fc802563f35f0527a6c828801295bdfb2803952cf2cf387786c2c90ed564f88d5782475abfe3c languageName: node linkType: hard -"ts-pnp@npm:^1.1.6": - version: 1.2.0 - resolution: "ts-pnp@npm:1.2.0" - peerDependenciesMeta: - typescript: - optional: true - checksum: c2a698b85d521298fe6f2435fbf2d3dc5834b423ea25abd321805ead3f399dbeedce7ca09492d7eb005b9d2c009c6b9587055bc3ab273dc6b9e40eefd7edb5b2 +"json-buffer@npm:3.0.0": + version: 3.0.0 + resolution: "json-buffer@npm:3.0.0" + checksum: 0cecacb8025370686a916069a2ff81f7d55167421b6aa7270ee74e244012650dd6bce22b0852202ea7ff8624fce50ff0ec1bdf95914ccb4553426e290d5a63fa languageName: node linkType: hard -"tsafe@npm:1.6.4": - version: 1.6.4 - resolution: "tsafe@npm:1.6.4" - checksum: 9a6194442248451891f3fcab4d77ee81be767334023f62af885187071bb3d457d030b43871cf303685c45c5d6389bc230730ac94d257b1d0f2f91f40c2d7fbc1 +"json-buffer@npm:3.0.1": + version: 3.0.1 + resolution: "json-buffer@npm:3.0.1" + checksum: 9026b03edc2847eefa2e37646c579300a1f3a4586cfb62bf857832b60c852042d0d6ae55d1afb8926163fa54c2b01d83ae24705f34990348bdac6273a29d4581 languageName: node linkType: hard -"tsconfig-paths@npm:^3.10.1, tsconfig-paths@npm:^3.14.1": - version: 3.14.2 - resolution: "tsconfig-paths@npm:3.14.2" - dependencies: - "@types/json5": ^0.0.29 - json5: ^1.0.2 - minimist: ^1.2.6 - strip-bom: ^3.0.0 - checksum: a6162eaa1aed680537f93621b82399c7856afd10ec299867b13a0675e981acac4e0ec00896860480efc59fc10fd0b16fdc928c0b885865b52be62cadac692447 +"json-parse-even-better-errors@npm:^2.3.0": + version: 2.3.1 + resolution: "json-parse-even-better-errors@npm:2.3.1" + checksum: 798ed4cf3354a2d9ccd78e86d2169515a0097a5c133337807cdf7f1fc32e1391d207ccfc276518cc1d7d8d4db93288b8a50ba4293d212ad1336e52a8ec0a941f languageName: node linkType: hard -"tsconfig-paths@npm:^4.2.0": - version: 4.2.0 - resolution: "tsconfig-paths@npm:4.2.0" - dependencies: - json5: ^2.2.2 - minimist: ^1.2.6 - strip-bom: ^3.0.0 - checksum: 28c5f7bbbcabc9dabd4117e8fdc61483f6872a1c6b02a4b1c4d68c5b79d06896c3cc9547610c4c3ba64658531caa2de13ead1ea1bf321c7b53e969c4752b98c7 +"json-schema-traverse@npm:^1.0.0": + version: 1.0.0 + resolution: "json-schema-traverse@npm:1.0.0" + checksum: 02f2f466cdb0362558b2f1fd5e15cce82ef55d60cd7f8fa828cf35ba74330f8d767fcae5c5c2adb7851fa811766c694b9405810879bc4e1ddd78a7c0e03658ad languageName: node linkType: hard -"tsconfig@workspace:config/tsconfig": - version: 0.0.0-use.local - resolution: "tsconfig@workspace:config/tsconfig" - languageName: unknown - linkType: soft - -"tslib@npm:1.14.1, tslib@npm:^1.11.1, tslib@npm:^1.8.1, tslib@npm:^1.9.0, tslib@npm:^1.9.3": - version: 1.14.1 - resolution: "tslib@npm:1.14.1" - checksum: dbe628ef87f66691d5d2959b3e41b9ca0045c3ee3c7c7b906cc1e328b39f199bb1ad9e671c39025bd56122ac57dfbf7385a94843b1cc07c60a4db74795829acd +"json-stable-stringify-without-jsonify@npm:^1.0.1": + version: 1.0.1 + resolution: "json-stable-stringify-without-jsonify@npm:1.0.1" + checksum: cff44156ddce9c67c44386ad5cddf91925fe06b1d217f2da9c4910d01f358c6e3989c4d5a02683c7a5667f9727ff05831f7aa8ae66c8ff691c556f0884d49215 languageName: node linkType: hard -"tslib@npm:2, tslib@npm:^2.0.0, tslib@npm:^2.0.1, tslib@npm:^2.0.3, tslib@npm:^2.1.0, tslib@npm:^2.2.0, tslib@npm:^2.3.0, tslib@npm:^2.3.1, tslib@npm:^2.4.0, tslib@npm:^2.4.1, tslib@npm:^2.5.0, tslib@npm:^2.6.2, tslib@npm:^2.8.0": - version: 2.8.1 - resolution: "tslib@npm:2.8.1" - checksum: e4aba30e632b8c8902b47587fd13345e2827fa639e7c3121074d5ee0880723282411a8838f830b55100cbe4517672f84a2472667d355b81e8af165a55dc6203a +"json5@npm:2.2.2": + version: 2.2.2 + resolution: "json5@npm:2.2.2" + bin: + json5: lib/cli.js + checksum: 9a878d66b72157b073cf0017f3e5d93ec209fa5943abcb38d37a54b208917c166bd473c26a24695e67a016ce65759aeb89946592991f8f9174fb96c8e2492683 languageName: node linkType: hard -"tslib@npm:2.4.0": - version: 2.4.0 - resolution: "tslib@npm:2.4.0" - checksum: 8c4aa6a3c5a754bf76aefc38026134180c053b7bd2f81338cb5e5ebf96fefa0f417bff221592bf801077f5bf990562f6264fecbc42cd3309b33872cb6fc3b113 +"jsonfile@npm:^4.0.0": + version: 4.0.0 + resolution: "jsonfile@npm:4.0.0" + dependencies: + graceful-fs: ^4.1.6 + dependenciesMeta: + graceful-fs: + optional: true + checksum: 6447d6224f0d31623eef9b51185af03ac328a7553efcee30fa423d98a9e276ca08db87d71e17f2310b0263fd3ffa6c2a90a6308367f661dc21580f9469897c9e languageName: node linkType: hard -"tslib@npm:2.6.3": - version: 2.6.3 - resolution: "tslib@npm:2.6.3" - checksum: 74fce0e100f1ebd95b8995fbbd0e6c91bdd8f4c35c00d4da62e285a3363aaa534de40a80db30ecfd388ed7c313c42d930ee0eaf108e8114214b180eec3dbe6f5 +"jsonfile@npm:^6.0.1": + version: 6.1.0 + resolution: "jsonfile@npm:6.1.0" + dependencies: + graceful-fs: ^4.1.6 + universalify: ^2.0.0 + dependenciesMeta: + graceful-fs: + optional: true + checksum: 7af3b8e1ac8fe7f1eccc6263c6ca14e1966fcbc74b618d3c78a0a2075579487547b94f72b7a1114e844a1e15bb00d440e5d1720bfc4612d790a6f285d5ea8354 languageName: node linkType: hard -"tslib@npm:~2.4.0": - version: 2.4.1 - resolution: "tslib@npm:2.4.1" - checksum: 19480d6e0313292bd6505d4efe096a6b31c70e21cf08b5febf4da62e95c265c8f571f7b36fcc3d1a17e068032f59c269fab3459d6cd3ed6949eafecf64315fca +"jsonparse@npm:^1.2.0": + version: 1.3.1 + resolution: "jsonparse@npm:1.3.1" + checksum: 6514a7be4674ebf407afca0eda3ba284b69b07f9958a8d3113ef1005f7ec610860c312be067e450c569aab8b89635e332cee3696789c750692bb60daba627f4d languageName: node linkType: hard -"tslib@npm:~2.5.0": - version: 2.5.0 - resolution: "tslib@npm:2.5.0" - checksum: ae3ed5f9ce29932d049908ebfdf21b3a003a85653a9a140d614da6b767a93ef94f460e52c3d787f0e4f383546981713f165037dc2274df212ea9f8a4541004e1 +"jsonpointer@npm:^5.0.0": + version: 5.0.1 + resolution: "jsonpointer@npm:5.0.1" + checksum: 0b40f712900ad0c846681ea2db23b6684b9d5eedf55807b4708c656f5894b63507d0e28ae10aa1bddbea551241035afe62b6df0800fc94c2e2806a7f3adecd7c languageName: node linkType: hard -"tsort@npm:0.0.1": - version: 0.0.1 - resolution: "tsort@npm:0.0.1" - checksum: 581566c248690b9ea7e431e1545affb3d2cab0f5dcd0e45ddef815dfaec4864cb5f0cfd8072924dedbc0de9585ff07e3e65db60f14fab4123737b9bb6e72eacc +"jsonwebtoken@npm:^9.0.0": + version: 9.0.0 + resolution: "jsonwebtoken@npm:9.0.0" + dependencies: + jws: ^3.2.2 + lodash: ^4.17.21 + ms: ^2.1.1 + semver: ^7.3.8 + checksum: b9181cecf9df99f1dc0253f91ba000a1aa4d91f5816d1608c0dba61a5623726a0bfe200b51df25de18c1a6000825d231ad7ce2788aa54fd48dcb760ad9eb9514 languageName: node linkType: hard -"tsutils@npm:^3.21.0": - version: 3.21.0 - resolution: "tsutils@npm:3.21.0" +"jwa@npm:^1.4.1": + version: 1.4.1 + resolution: "jwa@npm:1.4.1" dependencies: - tslib: ^1.8.1 - peerDependencies: - typescript: ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - checksum: 1843f4c1b2e0f975e08c4c21caa4af4f7f65a12ac1b81b3b8489366826259323feb3fc7a243123453d2d1a02314205a7634e048d4a8009921da19f99755cdc48 + buffer-equal-constant-time: 1.0.1 + ecdsa-sig-formatter: 1.0.11 + safe-buffer: ^5.0.1 + checksum: ff30ea7c2dcc61f3ed2098d868bf89d43701605090c5b21b5544b512843ec6fd9e028381a4dda466cbcdb885c2d1150f7c62e7168394ee07941b4098e1035e2f languageName: node linkType: hard -"tty-browserify@npm:^0.0.1": - version: 0.0.1 - resolution: "tty-browserify@npm:0.0.1" - checksum: 93b745d43fa5a7d2b948fa23be8d313576d1d884b48acd957c07710bac1c0d8ac34c0556ad4c57c73d36e11741763ef66b3fb4fb97b06b7e4d525315a3cd45f5 +"jws@npm:^3.2.2": + version: 3.2.2 + resolution: "jws@npm:3.2.2" + dependencies: + jwa: ^1.4.1 + safe-buffer: ^5.0.1 + checksum: f0213fe5b79344c56cd443428d8f65c16bf842dc8cb8f5aed693e1e91d79c20741663ad6eff07a6d2c433d1831acc9814e8d7bada6a0471fbb91d09ceb2bf5c2 languageName: node linkType: hard -"tunnel-agent@npm:^0.6.0": - version: 0.6.0 - resolution: "tunnel-agent@npm:0.6.0" +"keyv@npm:^3.0.0": + version: 3.1.0 + resolution: "keyv@npm:3.1.0" dependencies: - safe-buffer: ^5.0.1 - checksum: 05f6510358f8afc62a057b8b692f05d70c1782b70db86d6a1e0d5e28a32389e52fa6e7707b6c5ecccacc031462e4bc35af85ecfe4bbc341767917b7cf6965711 + json-buffer: 3.0.0 + checksum: bb7e8f3acffdbafbc2dd5b63f377fe6ec4c0e2c44fc82720449ef8ab54f4a7ce3802671ed94c0f475ae0a8549703353a2124561fcf3317010c141b32ca1ce903 languageName: node linkType: hard -"tunnel@npm:^0.0.6": - version: 0.0.6 - resolution: "tunnel@npm:0.0.6" - checksum: c362948df9ad34b649b5585e54ce2838fa583aa3037091aaed66793c65b423a264e5229f0d7e9a95513a795ac2bd4cb72cda7e89a74313f182c1e9ae0b0994fa +"keyv@npm:^4.0.0": + version: 4.5.2 + resolution: "keyv@npm:4.5.2" + dependencies: + json-buffer: 3.0.1 + checksum: 13ad58303acd2261c0d4831b4658451603fd159e61daea2121fcb15feb623e75ee328cded0572da9ca76b7b3ceaf8e614f1806c6b3af5db73c9c35a345259651 languageName: node linkType: hard -"turbo-darwin-64@npm:1.13.4": - version: 1.13.4 - resolution: "turbo-darwin-64@npm:1.13.4" - conditions: os=darwin & cpu=x64 +"kind-of@npm:^6.0.3": + version: 6.0.3 + resolution: "kind-of@npm:6.0.3" + checksum: 3ab01e7b1d440b22fe4c31f23d8d38b4d9b91d9f291df683476576493d5dfd2e03848a8b05813dd0c3f0e835bc63f433007ddeceb71f05cb25c45ae1b19c6d3b languageName: node linkType: hard -"turbo-darwin-arm64@npm:1.13.4": - version: 1.13.4 - resolution: "turbo-darwin-arm64@npm:1.13.4" - conditions: os=darwin & cpu=arm64 +"lazystream@npm:^1.0.0": + version: 1.0.0 + resolution: "lazystream@npm:1.0.0" + dependencies: + readable-stream: ^2.0.5 + checksum: 6cb9352a697bad74471671b299997edc736b400bb405dc409acfc9ffe584bb6f86898c4ace86b2f145ae32fe42ef60bd68749acb62c2ff3fa6bded721193f79c languageName: node linkType: hard -"turbo-ignore@npm:1.11.3": - version: 1.11.3 - resolution: "turbo-ignore@npm:1.11.3" - bin: - turbo-ignore: dist/cli.js - checksum: f57862ba5f2cc759a54877c395a03a3ea52396d57b01a418377abe6b677abfd78941b6c7e9db26b728ed8a7c63135490eea075d1603efb6e4834b24474aa0379 +"lead@npm:^1.0.0": + version: 1.0.0 + resolution: "lead@npm:1.0.0" + dependencies: + flush-write-stream: ^1.0.2 + checksum: f08a9f45ac39b8d1fecf31de4d97a8fa2aa7e233e99bb61fd443414fc8055331224490698e186cb614aa3ea2f2695d71c42afc85415fa680b078d640efadab50 languageName: node linkType: hard -"turbo-linux-64@npm:1.13.4": - version: 1.13.4 - resolution: "turbo-linux-64@npm:1.13.4" - conditions: os=linux & cpu=x64 +"li@npm:^1.3.0": + version: 1.3.0 + resolution: "li@npm:1.3.0" + checksum: 44056b8278771cc11c93a9622860554e34181a7c3789b6bf57b2f9a5ccb02fadc169d211c3f360615a790f3bd54bfc5618c5615ffce3a8e68e515b5bea4bede4 languageName: node linkType: hard -"turbo-linux-arm64@npm:1.13.4": - version: 1.13.4 - resolution: "turbo-linux-arm64@npm:1.13.4" - conditions: os=linux & cpu=arm64 +"lilconfig@npm:^2.0.6": + version: 2.1.0 + resolution: "lilconfig@npm:2.1.0" + checksum: 8549bb352b8192375fed4a74694cd61ad293904eee33f9d4866c2192865c44c4eb35d10782966242634e0cbc1e91fe62b1247f148dc5514918e3a966da7ea117 languageName: node linkType: hard -"turbo-windows-64@npm:1.13.4": - version: 1.13.4 - resolution: "turbo-windows-64@npm:1.13.4" - conditions: os=win32 & cpu=x64 +"lines-and-columns@npm:^1.1.6": + version: 1.2.4 + resolution: "lines-and-columns@npm:1.2.4" + checksum: 0c37f9f7fa212b38912b7145e1cd16a5f3cd34d782441c3e6ca653485d326f58b3caccda66efce1c5812bde4961bbde3374fae4b0d11bf1226152337f3894aa5 languageName: node linkType: hard -"turbo-windows-arm64@npm:1.13.4": - version: 1.13.4 - resolution: "turbo-windows-arm64@npm:1.13.4" - conditions: os=win32 & cpu=arm64 +"locate-path@npm:^5.0.0": + version: 5.0.0 + resolution: "locate-path@npm:5.0.0" + dependencies: + p-locate: ^4.1.0 + checksum: 83e51725e67517287d73e1ded92b28602e3ae5580b301fe54bfb76c0c723e3f285b19252e375712316774cf52006cb236aed5704692c32db0d5d089b69696e30 languageName: node linkType: hard -"turbo@npm:1.13.4": - version: 1.13.4 - resolution: "turbo@npm:1.13.4" +"locate-path@npm:^6.0.0": + version: 6.0.0 + resolution: "locate-path@npm:6.0.0" dependencies: - turbo-darwin-64: 1.13.4 - turbo-darwin-arm64: 1.13.4 - turbo-linux-64: 1.13.4 - turbo-linux-arm64: 1.13.4 - turbo-windows-64: 1.13.4 - turbo-windows-arm64: 1.13.4 - dependenciesMeta: - turbo-darwin-64: - optional: true - turbo-darwin-arm64: - optional: true - turbo-linux-64: - optional: true - turbo-linux-arm64: - optional: true - turbo-windows-64: - optional: true - turbo-windows-arm64: - optional: true - bin: - turbo: bin/turbo - checksum: 94533f700dbbb7b556a7152ef04500a44b571232daf1eb9bd82bcfebac473d0cf45a78c851325c6867246656cb0b3be7c62a412381b6e85c77c1eddf51302778 + p-locate: ^5.0.0 + checksum: 72eb661788a0368c099a184c59d2fee760b3831c9c1c33955e8a19ae4a21b4116e53fa736dc086cdeb9fce9f7cc508f2f92d2d3aae516f133e16a2bb59a39f5a languageName: node linkType: hard -"tween-functions@npm:^1.2.0": - version: 1.2.0 - resolution: "tween-functions@npm:1.2.0" - checksum: 880708d680eff5c347ddcb9f922ad121703a91c78ce308ed309073e73a794b633eb0b80589a839365803f150515ad34c9646809ae8a0e90f09e62686eefb1ab6 +"lodash.camelcase@npm:^4.3.0": + version: 4.3.0 + resolution: "lodash.camelcase@npm:4.3.0" + checksum: cb9227612f71b83e42de93eccf1232feeb25e705bdb19ba26c04f91e885bfd3dd5c517c4a97137658190581d3493ea3973072ca010aab7e301046d90740393d1 languageName: node linkType: hard -"tweetnacl-util@npm:^0.15.1": - version: 0.15.1 - resolution: "tweetnacl-util@npm:0.15.1" - checksum: ae6aa8a52cdd21a95103a4cc10657d6a2040b36c7a6da7b9d3ab811c6750a2d5db77e8c36969e75fdee11f511aa2b91c552496c6e8e989b6e490e54aca2864fc +"lodash.find@npm:^4.6.0": + version: 4.6.0 + resolution: "lodash.find@npm:4.6.0" + checksum: b737f849a4fe36f5c3664ea636780dda2fde18335021faf80cdfdcb300ed75441da6f55cfd6de119092d8bb2ddbc4433f4a8de4b99c0b9c8640465b0901c717c languageName: node linkType: hard -"tweetnacl@npm:^0.14.3, tweetnacl@npm:~0.14.0": - version: 0.14.5 - resolution: "tweetnacl@npm:0.14.5" - checksum: 6061daba1724f59473d99a7bb82e13f211cdf6e31315510ae9656fefd4779851cb927adad90f3b488c8ed77c106adc0421ea8055f6f976ff21b27c5c4e918487 +"lodash.includes@npm:^4.3.0": + version: 4.3.0 + resolution: "lodash.includes@npm:4.3.0" + checksum: 71092c130515a67ab3bd928f57f6018434797c94def7f46aafa417771e455ce3a4834889f4267b17887d7f75297dfabd96231bf704fd2b8c5096dc4a913568b6 languageName: node linkType: hard -"tweetnacl@npm:^1.0.3": - version: 1.0.3 - resolution: "tweetnacl@npm:1.0.3" - checksum: e4a57cac188f0c53f24c7a33279e223618a2bfb5fea426231991652a13247bea06b081fd745d71291fcae0f4428d29beba1b984b1f1ce6f66b06a6d1ab90645c +"lodash.isfunction@npm:^3.0.9": + version: 3.0.9 + resolution: "lodash.isfunction@npm:3.0.9" + checksum: 99e54c34b1e8a9ba75c034deb39cedbd2aca7af685815e67a2a8ec4f73ec9748cda6ebee5a07d7de4b938e90d421fd280e9c385cc190f903ac217ac8aff30314 languageName: node linkType: hard -"typanion@npm:^3.14.0, typanion@npm:^3.8.0": - version: 3.14.0 - resolution: "typanion@npm:3.14.0" - checksum: fc0590d02c13c659eb1689e8adf7777e6c00dc911377e44cd36fe1b1271cfaca71547149f12cdc275058c0de5562a14e5273adbae66d47e6e0320e36007f5912 +"lodash.isobject@npm:^3.0.2": + version: 3.0.2 + resolution: "lodash.isobject@npm:3.0.2" + checksum: 6c1667cbc4494d0a13a3617a4b23278d6d02dac520311f2bbb43f16f2cf71d2e6eb9dec8057315b77459df4890c756a256a087d3f4baa44a79ab5d6c968b060e languageName: node linkType: hard -"type-check@npm:^0.4.0, type-check@npm:~0.4.0": - version: 0.4.0 - resolution: "type-check@npm:0.4.0" - dependencies: - prelude-ls: ^1.2.1 - checksum: ec688ebfc9c45d0c30412e41ca9c0cdbd704580eb3a9ccf07b9b576094d7b86a012baebc95681999dd38f4f444afd28504cb3a89f2ef16b31d4ab61a0739025a +"lodash.isplainobject@npm:^4.0.6": + version: 4.0.6 + resolution: "lodash.isplainobject@npm:4.0.6" + checksum: 29c6351f281e0d9a1d58f1a4c8f4400924b4c79f18dfc4613624d7d54784df07efaff97c1ff2659f3e085ecf4fff493300adc4837553104cef2634110b0d5337 languageName: node linkType: hard -"type-check@npm:~0.3.2": - version: 0.3.2 - resolution: "type-check@npm:0.3.2" - dependencies: - prelude-ls: ~1.1.2 - checksum: dd3b1495642731bc0e1fc40abe5e977e0263005551ac83342ecb6f4f89551d106b368ec32ad3fb2da19b3bd7b2d1f64330da2ea9176d8ddbfe389fb286eb5124 +"lodash.kebabcase@npm:^4.1.1": + version: 4.1.1 + resolution: "lodash.kebabcase@npm:4.1.1" + checksum: 5a6c59161914e1bae23438a298c7433e83d935e0f59853fa862e691164696bc07f6dfa4c313d499fbf41ba8d53314e9850416502376705a357d24ee6ca33af78 languageName: node linkType: hard -"type-detect@npm:4.0.8": - version: 4.0.8 - resolution: "type-detect@npm:4.0.8" - checksum: 62b5628bff67c0eb0b66afa371bd73e230399a8d2ad30d852716efcc4656a7516904570cd8631a49a3ce57c10225adf5d0cbdcb47f6b0255fe6557c453925a15 +"lodash.keys@npm:^4.0.8": + version: 4.2.0 + resolution: "lodash.keys@npm:4.2.0" + checksum: 055576c8c4a0bacc0c1da9bcbb520e6e70dcf94c609495263686c62c8242a440293e9ab8387a7398dda529cb05b76e8f783c3fd3d6ba7bc6d5d6d2e08e8512ae languageName: node linkType: hard -"type-fest@npm:^0.13.1": - version: 0.13.1 - resolution: "type-fest@npm:0.13.1" - checksum: e6bf2e3c449f27d4ef5d56faf8b86feafbc3aec3025fc9a5fbe2db0a2587c44714521f9c30d8516a833c8c506d6263f5cc11267522b10c6ccdb6cc55b0a9d1c4 +"lodash.mapvalues@npm:^4.6.0": + version: 4.6.0 + resolution: "lodash.mapvalues@npm:4.6.0" + checksum: 0ff1b252fda318fc36e47c296984925e98fbb0fc5a2ecc4ef458f3c739a9476d47e40c95ac653e8314d132aa59c746d4276527b99d6e271940555c6e12d2babd languageName: node linkType: hard -"type-fest@npm:^0.16.0": - version: 0.16.0 - resolution: "type-fest@npm:0.16.0" - checksum: 1a4102c06dc109db00418c753062e206cab65befd469d000ece4452ee649bf2a9cf57686d96fb42326bc9d918d9a194d4452897b486dcc41989e5c99e4e87094 +"lodash.memoize@npm:^4.1.2": + version: 4.1.2 + resolution: "lodash.memoize@npm:4.1.2" + checksum: 9ff3942feeccffa4f1fafa88d32f0d24fdc62fd15ded5a74a5f950ff5f0c6f61916157246744c620173dddf38d37095a92327d5fd3861e2063e736a5c207d089 languageName: node linkType: hard -"type-fest@npm:^0.18.0": - version: 0.18.1 - resolution: "type-fest@npm:0.18.1" - checksum: e96dcee18abe50ec82dab6cbc4751b3a82046da54c52e3b2d035b3c519732c0b3dd7a2fa9df24efd1a38d953d8d4813c50985f215f1957ee5e4f26b0fe0da395 +"lodash.merge@npm:^4.6.2": + version: 4.6.2 + resolution: "lodash.merge@npm:4.6.2" + checksum: ad580b4bdbb7ca1f7abf7e1bce63a9a0b98e370cf40194b03380a46b4ed799c9573029599caebc1b14e3f24b111aef72b96674a56cfa105e0f5ac70546cdc005 + languageName: node + linkType: hard + +"lodash.mergewith@npm:^4.6.2": + version: 4.6.2 + resolution: "lodash.mergewith@npm:4.6.2" + checksum: a6db2a9339752411f21b956908c404ec1e088e783a65c8b29e30ae5b3b6384f82517662d6f425cc97c2070b546cc2c7daaa8d33f78db7b6e9be06cd834abdeb8 languageName: node linkType: hard -"type-fest@npm:^0.20.2": - version: 0.20.2 - resolution: "type-fest@npm:0.20.2" - checksum: 4fb3272df21ad1c552486f8a2f8e115c09a521ad7a8db3d56d53718d0c907b62c6e9141ba5f584af3f6830d0872c521357e512381f24f7c44acae583ad517d73 +"lodash.snakecase@npm:^4.1.1": + version: 4.1.1 + resolution: "lodash.snakecase@npm:4.1.1" + checksum: 1685ed3e83dda6eae5a4dcaee161a51cd210aabb3e1c09c57150e7dd8feda19e4ca0d27d0631eabe8d0f4eaa51e376da64e8c018ae5415417c5890d42feb72a8 languageName: node linkType: hard -"type-fest@npm:^0.21.3": - version: 0.21.3 - resolution: "type-fest@npm:0.21.3" - checksum: e6b32a3b3877f04339bae01c193b273c62ba7bfc9e325b8703c4ee1b32dc8fe4ef5dfa54bf78265e069f7667d058e360ae0f37be5af9f153b22382cd55a9afe0 +"lodash.startcase@npm:^4.4.0": + version: 4.4.0 + resolution: "lodash.startcase@npm:4.4.0" + checksum: c03a4a784aca653845fe09d0ef67c902b6e49288dc45f542a4ab345a9c406a6dc194c774423fa313ee7b06283950301c1221dd2a1d8ecb2dac8dfbb9ed5606b5 languageName: node linkType: hard -"type-fest@npm:^0.6.0": - version: 0.6.0 - resolution: "type-fest@npm:0.6.0" - checksum: b2188e6e4b21557f6e92960ec496d28a51d68658018cba8b597bd3ef757721d1db309f120ae987abeeda874511d14b776157ff809f23c6d1ce8f83b9b2b7d60f +"lodash.uniq@npm:^4.5.0": + version: 4.5.0 + resolution: "lodash.uniq@npm:4.5.0" + checksum: a4779b57a8d0f3c441af13d9afe7ecff22dd1b8ce1129849f71d9bbc8e8ee4e46dfb4b7c28f7ad3d67481edd6e51126e4e2a6ee276e25906d10f7140187c392d languageName: node linkType: hard -"type-fest@npm:^0.7.1": - version: 0.7.1 - resolution: "type-fest@npm:0.7.1" - checksum: 5b1b113529d59949d97b76977d545989ddc11b81bb0c766b6d2ccc65473cb4b4a5c7d24f5be2c2bb2de302a5d7a13c1732ea1d34c8c59b7e0ec1f890cf7fc424 +"lodash.upperfirst@npm:^4.3.1": + version: 4.3.1 + resolution: "lodash.upperfirst@npm:4.3.1" + checksum: cadec6955900afe1928cc60cdc4923a79c2ef991e42665419cc81630ed9b4f952a1093b222e0141ab31cbc4dba549f97ec28ff67929d71e01861c97188a5fa83 languageName: node linkType: hard -"type-fest@npm:^0.8.1": - version: 0.8.1 - resolution: "type-fest@npm:0.8.1" - checksum: d61c4b2eba24009033ae4500d7d818a94fd6d1b481a8111612ee141400d5f1db46f199c014766b9fa9b31a6a7374d96fc748c6d688a78a3ce5a33123839becb7 +"lodash@npm:^4.17.15, lodash@npm:^4.17.21": + version: 4.17.21 + resolution: "lodash@npm:4.17.21" + checksum: eb835a2e51d381e561e508ce932ea50a8e5a68f4ebdd771ea240d3048244a8d13658acbd502cd4829768c56f2e16bdd4340b9ea141297d472517b83868e677f7 languageName: node linkType: hard -"type-fest@npm:^1.0.2": - version: 1.4.0 - resolution: "type-fest@npm:1.4.0" - checksum: b011c3388665b097ae6a109a437a04d6f61d81b7357f74cbcb02246f2f5bd72b888ae33631b99871388122ba0a87f4ff1c94078e7119ff22c70e52c0ff828201 +"lowercase-keys@npm:^1.0.0, lowercase-keys@npm:^1.0.1": + version: 1.0.1 + resolution: "lowercase-keys@npm:1.0.1" + checksum: 4d045026595936e09953e3867722e309415ff2c80d7701d067546d75ef698dac218a4f53c6d1d0e7368b47e45fd7529df47e6cb56fbb90523ba599f898b3d147 languageName: node linkType: hard -"type-fest@npm:^2.13.0, type-fest@npm:^2.14.0, type-fest@npm:^2.19.0, type-fest@npm:~2.19": - version: 2.19.0 - resolution: "type-fest@npm:2.19.0" - checksum: a4ef07ece297c9fba78fc1bd6d85dff4472fe043ede98bd4710d2615d15776902b595abf62bd78339ed6278f021235fb28a96361f8be86ed754f778973a0d278 +"lowercase-keys@npm:^2.0.0": + version: 2.0.0 + resolution: "lowercase-keys@npm:2.0.0" + checksum: 24d7ebd56ccdf15ff529ca9e08863f3c54b0b9d1edb97a3ae1af34940ae666c01a1e6d200707bce730a8ef76cb57cc10e65f245ecaaf7e6bc8639f2fb460ac23 languageName: node linkType: hard -"type-fest@npm:^3.0.0, type-fest@npm:^3.11.0": - version: 3.13.1 - resolution: "type-fest@npm:3.13.1" - checksum: c06b0901d54391dc46de3802375f5579868949d71f93b425ce564e19a428a0d411ae8d8cb0e300d330071d86152c3ea86e744c3f2860a42a79585b6ec2fdae8e +"lru-cache@npm:^4.0.1": + version: 4.1.5 + resolution: "lru-cache@npm:4.1.5" + dependencies: + pseudomap: ^1.0.2 + yallist: ^2.1.2 + checksum: 4bb4b58a36cd7dc4dcec74cbe6a8f766a38b7426f1ff59d4cf7d82a2aa9b9565cd1cb98f6ff60ce5cd174524868d7bc9b7b1c294371851356066ca9ac4cf135a languageName: node linkType: hard -"type-is@npm:~1.6.18": - version: 1.6.18 - resolution: "type-is@npm:1.6.18" +"lru-cache@npm:^6.0.0": + version: 6.0.0 + resolution: "lru-cache@npm:6.0.0" dependencies: - media-typer: 0.3.0 - mime-types: ~2.1.24 - checksum: 2c8e47675d55f8b4e404bcf529abdf5036c537a04c2b20177bcf78c9e3c1da69da3942b1346e6edb09e823228c0ee656ef0e033765ec39a70d496ef601a0c657 + yallist: ^4.0.0 + checksum: f97f499f898f23e4585742138a22f22526254fdba6d75d41a1c2526b3b6cc5747ef59c5612ba7375f42aca4f8461950e925ba08c991ead0651b4918b7c978297 languageName: node linkType: hard -"typechain@npm:5.2.0": - version: 5.2.0 - resolution: "typechain@npm:5.2.0" +"magic-string@npm:^0.30.5": + version: 0.30.5 + resolution: "magic-string@npm:0.30.5" dependencies: - "@types/prettier": ^2.1.1 - command-line-args: ^4.0.7 - debug: ^4.1.1 - fs-extra: ^7.0.0 - glob: ^7.1.6 - js-sha3: ^0.8.0 - lodash: ^4.17.15 - mkdirp: ^1.0.4 - prettier: ^2.1.2 - ts-essentials: ^7.0.1 - peerDependencies: - typescript: ">=4.1.0" - bin: - typechain: dist/cli/cli.js - checksum: 1116e835a355b0d9dc9be77ebbfe972e1fe93eec6dc71cabaaada9e606c2bbaa18c786a22388e41ea3d2745fee1479b542b45dd9ebab4f60b2773524668a5d05 + "@jridgewell/sourcemap-codec": ^1.4.15 + checksum: da10fecff0c0a7d3faf756913ce62bd6d5e7b0402be48c3b27bfd651b90e29677e279069a63b764bcdc1b8ecdcdb898f29a5c5ec510f2323e8d62ee057a6eb18 languageName: node linkType: hard -"typed-array-buffer@npm:^1.0.2": - version: 1.0.2 - resolution: "typed-array-buffer@npm:1.0.2" - dependencies: - call-bind: ^1.0.7 - es-errors: ^1.3.0 - is-typed-array: ^1.1.13 - checksum: 02ffc185d29c6df07968272b15d5319a1610817916ec8d4cd670ded5d1efe72901541ff2202fcc622730d8a549c76e198a2f74e312eabbfb712ed907d45cbb0b +"make-error@npm:^1.1.1": + version: 1.3.6 + resolution: "make-error@npm:1.3.6" + checksum: b86e5e0e25f7f777b77fabd8e2cbf15737972869d852a22b7e73c17623928fccb826d8e46b9951501d3f20e51ad74ba8c59ed584f610526a48f8ccf88aaec402 languageName: node linkType: hard -"typed-array-byte-length@npm:^1.0.1": +"map-obj@npm:^1.0.0": version: 1.0.1 - resolution: "typed-array-byte-length@npm:1.0.1" - dependencies: - call-bind: ^1.0.7 - for-each: ^0.3.3 - gopd: ^1.0.1 - has-proto: ^1.0.3 - is-typed-array: ^1.1.13 - checksum: f65e5ecd1cf76b1a2d0d6f631f3ea3cdb5e08da106c6703ffe687d583e49954d570cc80434816d3746e18be889ffe53c58bf3e538081ea4077c26a41055b216d + resolution: "map-obj@npm:1.0.1" + checksum: 9949e7baec2a336e63b8d4dc71018c117c3ce6e39d2451ccbfd3b8350c547c4f6af331a4cbe1c83193d7c6b786082b6256bde843db90cb7da2a21e8fcc28afed languageName: node linkType: hard -"typed-array-byte-offset@npm:^1.0.2": - version: 1.0.2 - resolution: "typed-array-byte-offset@npm:1.0.2" - dependencies: - available-typed-arrays: ^1.0.7 - call-bind: ^1.0.7 - for-each: ^0.3.3 - gopd: ^1.0.1 - has-proto: ^1.0.3 - is-typed-array: ^1.1.13 - checksum: c8645c8794a621a0adcc142e0e2c57b1823bbfa4d590ad2c76b266aa3823895cf7afb9a893bf6685e18454ab1b0241e1a8d885a2d1340948efa4b56add4b5f67 +"map-obj@npm:^4.0.0": + version: 4.3.0 + resolution: "map-obj@npm:4.3.0" + checksum: fbc554934d1a27a1910e842bc87b177b1a556609dd803747c85ece420692380827c6ae94a95cce4407c054fa0964be3bf8226f7f2cb2e9eeee432c7c1985684e languageName: node linkType: hard -"typed-array-length@npm:^1.0.6": - version: 1.0.6 - resolution: "typed-array-length@npm:1.0.6" +"matcher-collection@npm:^2.0.0": + version: 2.0.1 + resolution: "matcher-collection@npm:2.0.1" dependencies: - call-bind: ^1.0.7 - for-each: ^0.3.3 - gopd: ^1.0.1 - has-proto: ^1.0.3 - is-typed-array: ^1.1.13 - possible-typed-array-names: ^1.0.0 - checksum: f0315e5b8f0168c29d390ff410ad13e4d511c78e6006df4a104576844812ee447fcc32daab1f3a76c9ef4f64eff808e134528b5b2439de335586b392e9750e5c + "@types/minimatch": ^3.0.3 + minimatch: ^3.0.2 + checksum: f6d4f94bdcf773f9cbd4b7b10199a7632c434833a4c01bfb29c373e118647bb3b748aa3f20c70d6c3a715915fcc44ad4a77a9f8d5f059f3a0d15c984c0acc83d languageName: node linkType: hard -"typed-redux-saga@npm:1.5.0": - version: 1.5.0 - resolution: "typed-redux-saga@npm:1.5.0" +"memfs-or-file-map-to-github-branch@npm:^1.2.1": + version: 1.2.1 + resolution: "memfs-or-file-map-to-github-branch@npm:1.2.1" dependencies: - "@babel/helper-module-imports": ^7.14.5 - babel-plugin-macros: ^3.1.0 - peerDependencies: - redux-saga: ^1.1.3 - dependenciesMeta: - "@babel/helper-module-imports": - optional: true - babel-plugin-macros: - optional: true - checksum: 9abf3ae98003e42a09dd0252b00339c6bd3074de2ce7cf1d6b9bc57cf496e7ffe81fc645bb3388bce90aca421204f5f081ba5932f4c63185c96ffafc4d43624e + "@octokit/rest": ^16.43.0 || ^17.11.0 || ^18.12.0 + checksum: 0e63721da8b6ee0bb9826ac8662a6bfde392e3ac8c6c335a057b0e43794bbf24701f019734dfcee796c70af7a4e0cffa693d03b49be561204d52aac5edf5802e languageName: node linkType: hard -"typedarray-to-buffer@npm:^3.1.5": - version: 3.1.5 - resolution: "typedarray-to-buffer@npm:3.1.5" +"meow@npm:^8.0.0": + version: 8.1.2 + resolution: "meow@npm:8.1.2" dependencies: - is-typedarray: ^1.0.0 - checksum: 99c11aaa8f45189fcfba6b8a4825fd684a321caa9bd7a76a27cf0c7732c174d198b99f449c52c3818107430b5f41c0ccbbfb75cb2ee3ca4a9451710986d61a60 + "@types/minimist": ^1.2.0 + camelcase-keys: ^6.2.2 + decamelize-keys: ^1.1.0 + hard-rejection: ^2.1.0 + minimist-options: 4.1.0 + normalize-package-data: ^3.0.0 + read-pkg-up: ^7.0.1 + redent: ^3.0.0 + trim-newlines: ^3.0.0 + type-fest: ^0.18.0 + yargs-parser: ^20.2.3 + checksum: bc23bf1b4423ef6a821dff9734406bce4b91ea257e7f10a8b7f896f45b59649f07adc0926e2917eacd8cf1df9e4cd89c77623cf63dfd0f8bf54de07a32ee5a85 languageName: node linkType: hard -"typescript-compare@npm:^0.0.2": - version: 0.0.2 - resolution: "typescript-compare@npm:0.0.2" - dependencies: - typescript-logic: ^0.0.0 - checksum: d6c43213e7689f8519438b6deceb9877cdc83b4f64677bbc07e6d88d8b63bee713035731678facfd3f81b019b93131a876a230194b4f8d31737bfc5af71594d2 +"merge-stream@npm:^2.0.0": + version: 2.0.0 + resolution: "merge-stream@npm:2.0.0" + checksum: 6fa4dcc8d86629705cea944a4b88ef4cb0e07656ebf223fa287443256414283dd25d91c1cd84c77987f2aec5927af1a9db6085757cb43d90eb170ebf4b47f4f4 languageName: node linkType: hard -"typescript-logic@npm:^0.0.0": - version: 0.0.0 - resolution: "typescript-logic@npm:0.0.0" - checksum: 84506bd58b7e15455b3233ded7f43f2ff8667500dca94f8e96e61aa16fa5a78bd9c45455f27c49f0e4aee7322c3e5a4b270e68bf8ba29fdf1571256fe2607152 +"merge2@npm:^1.3.0, merge2@npm:^1.4.1": + version: 1.4.1 + resolution: "merge2@npm:1.4.1" + checksum: 7268db63ed5169466540b6fb947aec313200bcf6d40c5ab722c22e242f651994619bcd85601602972d3c85bd2cc45a358a4c61937e9f11a061919a1da569b0c2 languageName: node linkType: hard -"typescript-tuple@npm:^2.2.1": - version: 2.2.1 - resolution: "typescript-tuple@npm:2.2.1" +"micromatch@npm:^4.0.4": + version: 4.0.8 + resolution: "micromatch@npm:4.0.8" dependencies: - typescript-compare: ^0.0.2 - checksum: 7f9620d6b5c895b2b2a61817b27c6fb32c23fd3f47fef6aef202f387b7d82f2d49a2bab96f9a25b512b8718a70d38a2898a0dfdca623136f7aa9a5b17331da71 + braces: ^3.0.3 + picomatch: ^2.3.1 + checksum: 79920eb634e6f400b464a954fcfa589c4e7c7143209488e44baf627f9affc8b1e306f41f4f0deedde97e69cb725920879462d3e750ab3bd3c1aed675bb3a8966 languageName: node linkType: hard -"typescript@npm:5.3.3": - version: 5.3.3 - resolution: "typescript@npm:5.3.3" - bin: - tsc: bin/tsc - tsserver: bin/tsserver - checksum: 2007ccb6e51bbbf6fde0a78099efe04dc1c3dfbdff04ca3b6a8bc717991862b39fd6126c0c3ebf2d2d98ac5e960bcaa873826bb2bb241f14277034148f41f6a2 +"mime-db@npm:1.52.0": + version: 1.52.0 + resolution: "mime-db@npm:1.52.0" + checksum: 0d99a03585f8b39d68182803b12ac601d9c01abfa28ec56204fa330bc9f3d1c5e14beb049bafadb3dbdf646dfb94b87e24d4ec7b31b7279ef906a8ea9b6a513f languageName: node linkType: hard -"typescript@patch:typescript@npm%3A5.3.3#~builtin": - version: 5.3.3 - resolution: "typescript@patch:typescript@npm%3A5.3.3#~builtin::version=5.3.3&hash=a1c5e5" - bin: - tsc: bin/tsc - tsserver: bin/tsserver - checksum: f61375590b3162599f0f0d5b8737877ac0a7bc52761dbb585d67e7b8753a3a4c42d9a554c4cc929f591ffcf3a2b0602f65ae3ce74714fd5652623a816862b610 +"mime-types@npm:^2.1.12": + version: 2.1.35 + resolution: "mime-types@npm:2.1.35" + dependencies: + mime-db: 1.52.0 + checksum: 89a5b7f1def9f3af5dad6496c5ed50191ae4331cc5389d7c521c8ad28d5fdad2d06fd81baf38fed813dc4e46bb55c8145bb0ff406330818c9cf712fb2e9b3836 languageName: node linkType: hard -"typical@npm:^2.6.0, typical@npm:^2.6.1": - version: 2.6.1 - resolution: "typical@npm:2.6.1" - checksum: 6af04fefe50d90d3471f058b2cdc0f49b7436bdd605cd00acea7965926ff388a5a7d692ef144f45fccee6f8e896c065702ecc44b69057e2ce88c09e897c7d3a4 +"mimic-fn@npm:^2.1.0": + version: 2.1.0 + resolution: "mimic-fn@npm:2.1.0" + checksum: d2421a3444848ce7f84bd49115ddacff29c15745db73f54041edc906c14b131a38d05298dae3081667627a59b2eb1ca4b436ff2e1b80f69679522410418b478a languageName: node linkType: hard -"ua-parser-js@npm:1.0.37": - version: 1.0.37 - resolution: "ua-parser-js@npm:1.0.37" - checksum: 4d481c720d523366d7762dc8a46a1b58967d979aacf786f9ceceb1cd767de069f64a4bdffb63956294f1c0696eb465ddb950f28ba90571709e33521b4bd75e07 +"mimic-response@npm:^1.0.0, mimic-response@npm:^1.0.1": + version: 1.0.1 + resolution: "mimic-response@npm:1.0.1" + checksum: 034c78753b0e622bc03c983663b1cdf66d03861050e0c8606563d149bc2b02d63f62ce4d32be4ab50d0553ae0ffe647fc34d1f5281184c6e1e8cf4d85e8d9823 languageName: node linkType: hard -"ua-parser-js@npm:^1.0.35": - version: 1.0.38 - resolution: "ua-parser-js@npm:1.0.38" - checksum: d0772b22b027338d806ab17d1ac2896ee7485bdf9217c526028159f3cd6bb10272bb18f6196d2f94dde83e3b36dc9d2533daf08a414764f6f4f1844842383838 +"mimic-response@npm:^3.1.0": + version: 3.1.0 + resolution: "mimic-response@npm:3.1.0" + checksum: 25739fee32c17f433626bf19f016df9036b75b3d84a3046c7d156e72ec963dd29d7fc8a302f55a3d6c5a4ff24259676b15d915aad6480815a969ff2ec0836867 languageName: node linkType: hard -"uc.micro@npm:^1.0.1, uc.micro@npm:^1.0.5": - version: 1.0.6 - resolution: "uc.micro@npm:1.0.6" - checksum: 6898bb556319a38e9cf175e3628689347bd26fec15fc6b29fa38e0045af63075ff3fea4cf1fdba9db46c9f0cbf07f2348cd8844889dd31ebd288c29fe0d27e7a +"min-indent@npm:^1.0.0": + version: 1.0.1 + resolution: "min-indent@npm:1.0.1" + checksum: bfc6dd03c5eaf623a4963ebd94d087f6f4bbbfd8c41329a7f09706b0cb66969c4ddd336abeb587bc44bc6f08e13bf90f0b374f9d71f9f01e04adc2cd6f083ef1 languageName: node linkType: hard -"ufo@npm:^1.3.0, ufo@npm:^1.3.1, ufo@npm:^1.3.2": - version: 1.3.2 - resolution: "ufo@npm:1.3.2" - checksum: f1180bb715ff4dd46152fd4dec41c731e84d7b9eaf1432548a0210b2f7e0cd29de125ac88e582c6a079d8ae5bc9ab04ef2bdbafe125086480b10c1006b81bfce +"minimatch@npm:6.1.6": + version: 6.1.6 + resolution: "minimatch@npm:6.1.6" + dependencies: + brace-expansion: ^2.0.1 + checksum: 707b026e0adc610be6c02f24173d84811e5b8cc2e434881e47ef00a72be5fbea9323b7158d7bf065782b1e1d5c50d7d80cd72f2602255f2fddfb1d2f02e9092c languageName: node linkType: hard -"uglify-js@npm:^3.1.4": - version: 3.14.5 - resolution: "uglify-js@npm:3.14.5" - bin: - uglifyjs: bin/uglifyjs - checksum: 0330eb11a36f4181b6d9a00336355989bfad9dd2203049fc63a59454b0d12337612272ad011bc571b9a382bf74d829ca20409ebfe089e38edb26cfc06bfa2cc9 +"minimatch@npm:^3.0.2, minimatch@npm:^3.0.4, minimatch@npm:^3.1.1": + version: 3.1.2 + resolution: "minimatch@npm:3.1.2" + dependencies: + brace-expansion: ^1.1.7 + checksum: c154e566406683e7bcb746e000b84d74465b3a832c45d59912b9b55cd50dee66e5c4b1e5566dba26154040e51672f9aa450a9aef0c97cfc7336b78b7afb9540a languageName: node linkType: hard -"ui@workspace:^, ui@workspace:packages/ui": - version: 0.0.0-use.local - resolution: "ui@workspace:packages/ui" - dependencies: - "@gorhom/bottom-sheet": 4.6.4 - "@react-native-masked-view/masked-view": 0.3.2 - "@shopify/flash-list": 1.7.1 - "@shopify/react-native-skia": 1.6.0 - "@storybook/react": 8.4.2 - "@tamagui/animations-moti": 1.121.7 - "@tamagui/animations-react-native": 1.121.7 - "@tamagui/build": 1.121.7 - "@tamagui/core": 1.121.7 - "@tamagui/font-inter": 1.121.7 - "@tamagui/helpers-icon": 1.121.7 - "@tamagui/react-native-media-driver": 1.121.7 - "@tamagui/remove-scroll": 1.121.7 - "@tamagui/theme-base": 1.121.7 - "@testing-library/react-hooks": 8.0.1 - "@testing-library/react-native": 13.0.0 - "@types/qrcode": 1.5.5 - "@uniswap/eslint-config": "workspace:^" - camelcase: 6.3.0 - cheerio: 1.0.0-rc.12 - esbuild-register: 3.6.0 - eslint: 8.44.0 - ethers: 5.7.2 - expo-linear-gradient: 14.0.1 - fs-extra: 11.2.0 - i18next: 23.10.0 - jest: 29.7.0 - jest-presets: "workspace:^" - qrcode: 1.5.1 - react: 18.3.1 - react-native: 0.76.6 - react-native-fast-image: 8.6.3 - react-native-gesture-handler: 2.21.2 - react-native-image-colors: 1.5.2 - react-native-reanimated: 3.16.7 - react-native-safe-area-context: 4.12.0 - react-native-svg: 15.10.1 - react-native-webview: 13.12.2 - tamagui: 1.121.7 - typescript: 5.3.3 - uppercamelcase: 3.0.0 - utilities: "workspace:^" - uuid: 9.0.0 - wcag-contrast: 3.0.0 - languageName: unknown - linkType: soft +"minimatch@npm:^5.0.1": + version: 5.1.6 + resolution: "minimatch@npm:5.1.6" + dependencies: + brace-expansion: ^2.0.1 + checksum: 7564208ef81d7065a370f788d337cd80a689e981042cb9a1d0e6580b6c6a8c9279eba80010516e258835a988363f99f54a6f711a315089b8b42694f5da9d0d77 + languageName: node + linkType: hard -"uint8arrays@npm:3.1.0": - version: 3.1.0 - resolution: "uint8arrays@npm:3.1.0" +"minimatch@npm:^7.4.6": + version: 7.4.6 + resolution: "minimatch@npm:7.4.6" dependencies: - multiformats: ^9.4.2 - checksum: 77fe0c8644417a849f5cfc0e5a5308c65e3b779a56f816dd27b8f60f7fac1ac7626f57c9abacec77d147beb5da8401b86438b1591d93cae7f7511a3211cc01b3 + brace-expansion: ^2.0.1 + checksum: 1a6c8d22618df9d2a88aabeef1de5622eb7b558e9f8010be791cb6b0fa6e102d39b11c28d75b855a1e377b12edc7db8ff12a99c20353441caa6a05e78deb5da9 languageName: node linkType: hard -"uint8arrays@npm:^2.1.3": - version: 2.1.10 - resolution: "uint8arrays@npm:2.1.10" +"minimist-options@npm:4.1.0": + version: 4.1.0 + resolution: "minimist-options@npm:4.1.0" dependencies: - multiformats: ^9.4.2 - checksum: 63ceb5fecc09de69641531c847e0b435d15a73587e40d4db23ed9b8a1ebbe839ae39fe81a15ea6079cdf642fcf2583983f9a5d32726edc4bc5e87634f34e3bd5 + arrify: ^1.0.1 + is-plain-obj: ^1.1.0 + kind-of: ^6.0.3 + checksum: 8c040b3068811e79de1140ca2b708d3e203c8003eb9a414c1ab3cd467fc5f17c9ca02a5aef23bedc51a7f8bfbe77f87e9a7e31ec81fba304cda675b019496f4e languageName: node linkType: hard -"uint8arrays@npm:^3.0.0": - version: 3.1.1 - resolution: "uint8arrays@npm:3.1.1" +"minimist@npm:^1.2.0, minimist@npm:^1.2.6": + version: 1.2.8 + resolution: "minimist@npm:1.2.8" + checksum: 75a6d645fb122dad29c06a7597bddea977258957ed88d7a6df59b5cd3fe4a527e253e9bbf2e783e4b73657f9098b96a5fe96ab8a113655d4109108577ecf85b0 + languageName: node + linkType: hard + +"minipass@npm:^2.6.0, minipass@npm:^2.9.0": + version: 2.9.0 + resolution: "minipass@npm:2.9.0" dependencies: - multiformats: ^9.4.2 - checksum: b93b6c3f0a526b116799f3a3409bd4b5d5553eb3e73e485998ece7974742254fbc0d2f7988dd21ac86c4b974552f45d9ae9cf9cba9647e529f8eb1fdd2ed84d0 + safe-buffer: ^5.1.2 + yallist: ^3.0.0 + checksum: 077b66f31ba44fd5a0d27d12a9e6a86bff8f97a4978dedb0373167156b5599fadb6920fdde0d9f803374164d810e05e8462ce28e86abbf7f0bea293a93711fc6 languageName: node linkType: hard -"unbox-primitive@npm:^1.0.2": - version: 1.0.2 - resolution: "unbox-primitive@npm:1.0.2" +"minizlib@npm:^1.3.3": + version: 1.3.3 + resolution: "minizlib@npm:1.3.3" dependencies: - call-bind: ^1.0.2 - has-bigints: ^1.0.2 - has-symbols: ^1.0.3 - which-boxed-primitive: ^1.0.2 - checksum: b7a1cf5862b5e4b5deb091672ffa579aa274f648410009c81cca63fed3b62b610c4f3b773f912ce545bb4e31edc3138975b5bc777fc6e4817dca51affb6380e9 + minipass: ^2.9.0 + checksum: b0425c04d2ae6aad5027462665f07cc0d52075f7fa16e942b4611115f9b31f02924073b7221be6f75929d3c47ab93750c63f6dc2bbe8619ceacb3de1f77732c0 languageName: node linkType: hard -"unc-path-regex@npm:^0.1.2": - version: 0.1.2 - resolution: "unc-path-regex@npm:0.1.2" - checksum: a05fa2006bf4606051c10fc7968f08ce7b28fa646befafa282813aeb1ac1a56f65cb1b577ca7851af2726198d59475bb49b11776036257b843eaacee2860a4ec +"mkdirp@npm:^0.5.5": + version: 0.5.6 + resolution: "mkdirp@npm:0.5.6" + dependencies: + minimist: ^1.2.6 + bin: + mkdirp: bin/cmd.js + checksum: 0c91b721bb12c3f9af4b77ebf73604baf350e64d80df91754dc509491ae93bf238581e59c7188360cec7cb62fc4100959245a42cfe01834efedc5e9d068376c2 languageName: node linkType: hard -"uncrypto@npm:^0.1.3": - version: 0.1.3 - resolution: "uncrypto@npm:0.1.3" - checksum: 07160e08806dd6cea16bb96c3fd54cd70fc801e02fc3c6f86980144d15c9ebbd1c55587f7280a207b3af6cd34901c0d0b77ada5a02c2f7081a033a05acf409e2 +"mktemp@npm:~0.4.0": + version: 0.4.0 + resolution: "mktemp@npm:0.4.0" + checksum: f67d8b1ed599807a4ec154efc6a50d61b28f4183fa740c4fe3bd75ce8442d84a3b8fca382fb3cb4e20bb883cb14478a7fe549c4eab6135cd213163ca5083f0fe languageName: node linkType: hard -"underscore.string@npm:~3.3.4": - version: 3.3.6 - resolution: "underscore.string@npm:3.3.6" +"moti@npm:0.27.2": + version: 0.27.2 + resolution: "moti@npm:0.27.2" dependencies: - sprintf-js: ^1.1.1 - util-deprecate: ^1.0.2 - checksum: b7719c30e5d1fdda4ee9379e8d80dca2b0668942420ba365ae3410120e08225fe36707a7981ce0f921812dee6a2290b713cdce1e75e770b98e67a45d8a378d35 + framer-motion: ^6.5.1 + peerDependencies: + react-native-reanimated: "*" + checksum: 7695e914180608cee58c6bd95a66f5b02cfde2ccfbce82b31395a190115acf5cca7723e08cad5119fdc6c452c7bc7f5127207c66cba625e75ba65aa8e64a49f9 + languageName: node + linkType: hard + +"ms@npm:2.0.0": + version: 2.0.0 + resolution: "ms@npm:2.0.0" + checksum: 0e6a22b8b746d2e0b65a430519934fefd41b6db0682e3477c10f60c76e947c4c0ad06f63ffdf1d78d335f83edee8c0aa928aa66a36c7cd95b69b26f468d527f4 languageName: node linkType: hard -"underscore@npm:1.12.1": - version: 1.12.1 - resolution: "underscore@npm:1.12.1" - checksum: ec327603aa112b99fe9d74cd9bf3b3b7451465a9d2610ceab269a532e3f191650ab017903be34dc86fe406a11d04d8905a3b04dd4c129493e51bee09a3f3074c +"ms@npm:^2.1.1, ms@npm:^2.1.3": + version: 2.1.3 + resolution: "ms@npm:2.1.3" + checksum: aa92de608021b242401676e35cfa5aa42dd70cbdc082b916da7fb925c542173e36bce97ea3e804923fe92c0ad991434e4a38327e15a1b5b5f945d66df615ae6d languageName: node linkType: hard -"undici-types@npm:~5.26.4": - version: 5.26.5 - resolution: "undici-types@npm:5.26.5" - checksum: 3192ef6f3fd5df652f2dc1cd782b49d6ff14dc98e5dced492aa8a8c65425227da5da6aafe22523c67f035a272c599bb89cfe803c1db6311e44bed3042fc25487 +"multimatch@npm:^5.0.0": + version: 5.0.0 + resolution: "multimatch@npm:5.0.0" + dependencies: + "@types/minimatch": ^3.0.3 + array-differ: ^3.0.0 + array-union: ^2.1.0 + arrify: ^2.0.1 + minimatch: ^3.0.4 + checksum: 82c8030a53af965cab48da22f1b0f894ef99e16ee680dabdfbd38d2dfacc3c8208c475203d747afd9e26db44118ed0221d5a0d65268c864f06d6efc7ac6df812 languageName: node linkType: hard -"undici-types@npm:~6.20.0": - version: 6.20.0 - resolution: "undici-types@npm:6.20.0" - checksum: b7bc50f012dc6afbcce56c9fd62d7e86b20a62ff21f12b7b5cbf1973b9578d90f22a9c7fe50e638e96905d33893bf2f9f16d98929c4673c2480de05c6c96ea8b +"nanoid@npm:^3.3.7": + version: 3.3.7 + resolution: "nanoid@npm:3.3.7" + bin: + nanoid: bin/nanoid.cjs + checksum: d36c427e530713e4ac6567d488b489a36582ef89da1d6d4e3b87eded11eb10d7042a877958c6f104929809b2ab0bafa17652b076cdf84324aa75b30b722204f2 languageName: node linkType: hard -"undici@npm:6.19.7": - version: 6.19.7 - resolution: "undici@npm:6.19.7" - checksum: ccf7f311cc2f7109e03c433190cb13d45c581905a70674992b0d8469c36ec1ae011824f41ba0c4a85b9771e4dd30a94228315c316215f76fafcb8e3b91ffbc22 +"node-cleanup@npm:^2.1.2": + version: 2.1.2 + resolution: "node-cleanup@npm:2.1.2" + checksum: 584cdc3e42560a998b4579f91ed8f936b27011628f3102e5a1093205f0691cdf8d899287d1f2e4d2071ea4ab1d615810bad6dbe2b988ef173a1cbaa76d8165b3 languageName: node linkType: hard -"undici@npm:^5.12.0, undici@npm:^5.14.0, undici@npm:^5.22.1, undici@npm:^5.25.4": - version: 5.28.4 - resolution: "undici@npm:5.28.4" +"node-fetch@npm:2.6.7": + version: 2.6.7 + resolution: "node-fetch@npm:2.6.7" dependencies: - "@fastify/busboy": ^2.0.0 - checksum: a8193132d84540e4dc1895ecc8dbaa176e8a49d26084d6fbe48a292e28397cd19ec5d13bc13e604484e76f94f6e334b2bdc740d5f06a6e50c44072818d0c19f9 - languageName: node - linkType: hard - -"undici@npm:^6.18.2": - version: 6.21.1 - resolution: "undici@npm:6.21.1" - checksum: 2efc52f77224754a2efa7cb6459829f3c93c8321d17e76f574a904b353783d95073b6116f5b15637c4845d98c9dc5a019b809cb9d63b3529267e7727c49f6996 + whatwg-url: ^5.0.0 + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + checksum: 8d816ffd1ee22cab8301c7756ef04f3437f18dace86a1dae22cf81db8ef29c0bf6655f3215cb0cdb22b420b6fe141e64b26905e7f33f9377a7fa59135ea3e10b languageName: node linkType: hard -"unenv@npm:^1.8.0": - version: 1.9.0 - resolution: "unenv@npm:1.9.0" +"node-fetch@npm:^2.6.7": + version: 2.7.0 + resolution: "node-fetch@npm:2.7.0" dependencies: - consola: ^3.2.3 - defu: ^6.1.3 - mime: ^3.0.0 - node-fetch-native: ^1.6.1 - pathe: ^1.1.1 - checksum: 4cfbeedee1436e7f417d655c521e4c6220228f5b96afff90b5253d4504282c6de5acdd982aa51c977ce38d21d7692a33d10fc857166b3488655ff29c3bb754a2 + whatwg-url: ^5.0.0 + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + checksum: d76d2f5edb451a3f05b15115ec89fc6be39de37c6089f1b6368df03b91e1633fd379a7e01b7ab05089a25034b2023d959b47e59759cb38d88341b2459e89d6e5 languageName: node linkType: hard -"unherit@npm:^1.0.4": - version: 1.1.3 - resolution: "unherit@npm:1.1.3" +"normalize-package-data@npm:^2.5.0": + version: 2.5.0 + resolution: "normalize-package-data@npm:2.5.0" dependencies: - inherits: ^2.0.0 - xtend: ^4.0.0 - checksum: fd7922f84fc0bfb7c4df6d1f5a50b5b94a0218e3cda98a54dbbd209226ddd4072d742d3df44d0e295ab08d5ccfd304a1e193dfe31a86d2a91b7cb9fdac093194 + hosted-git-info: ^2.1.4 + resolve: ^1.10.0 + semver: 2 || 3 || 4 || 5 + validate-npm-package-license: ^3.0.1 + checksum: 7999112efc35a6259bc22db460540cae06564aa65d0271e3bdfa86876d08b0e578b7b5b0028ee61b23f1cae9fc0e7847e4edc0948d3068a39a2a82853efc8499 languageName: node linkType: hard -"unicode-canonical-property-names-ecmascript@npm:^2.0.0": - version: 2.0.0 - resolution: "unicode-canonical-property-names-ecmascript@npm:2.0.0" - checksum: 39be078afd014c14dcd957a7a46a60061bc37c4508ba146517f85f60361acf4c7539552645ece25de840e17e293baa5556268d091ca6762747fdd0c705001a45 +"normalize-package-data@npm:^3.0.0": + version: 3.0.3 + resolution: "normalize-package-data@npm:3.0.3" + dependencies: + hosted-git-info: ^4.0.1 + is-core-module: ^2.5.0 + semver: ^7.3.4 + validate-npm-package-license: ^3.0.1 + checksum: bbcee00339e7c26fdbc760f9b66d429258e2ceca41a5df41f5df06cc7652de8d82e8679ff188ca095cad8eff2b6118d7d866af2b68400f74602fbcbce39c160a languageName: node linkType: hard -"unicode-match-property-ecmascript@npm:^2.0.0": - version: 2.0.0 - resolution: "unicode-match-property-ecmascript@npm:2.0.0" +"normalize-path@npm:^2.1.1": + version: 2.1.1 + resolution: "normalize-path@npm:2.1.1" dependencies: - unicode-canonical-property-names-ecmascript: ^2.0.0 - unicode-property-aliases-ecmascript: ^2.0.0 - checksum: 1f34a7434a23df4885b5890ac36c5b2161a809887000be560f56ad4b11126d433c0c1c39baf1016bdabed4ec54829a6190ee37aa24919aa116dc1a5a8a62965a + remove-trailing-separator: ^1.0.1 + checksum: 7e9cbdcf7f5b8da7aa191fbfe33daf290cdcd8c038f422faf1b8a83c972bf7a6d94c5be34c4326cb00fb63bc0fd97d9fbcfaf2e5d6142332c2cd36d2e1b86cea languageName: node linkType: hard -"unicode-match-property-value-ecmascript@npm:^2.1.0": - version: 2.1.0 - resolution: "unicode-match-property-value-ecmascript@npm:2.1.0" - checksum: 8d6f5f586b9ce1ed0e84a37df6b42fdba1317a05b5df0c249962bd5da89528771e2d149837cad11aa26bcb84c35355cb9f58a10c3d41fa3b899181ece6c85220 +"normalize-path@npm:^3.0.0": + version: 3.0.0 + resolution: "normalize-path@npm:3.0.0" + checksum: 88eeb4da891e10b1318c4b2476b6e2ecbeb5ff97d946815ffea7794c31a89017c70d7f34b3c2ebf23ef4e9fc9fb99f7dffe36da22011b5b5c6ffa34f4873ec20 languageName: node linkType: hard -"unicode-property-aliases-ecmascript@npm:^2.0.0": - version: 2.1.0 - resolution: "unicode-property-aliases-ecmascript@npm:2.1.0" - checksum: 243524431893649b62cc674d877bd64ef292d6071dd2fd01ab4d5ad26efbc104ffcd064f93f8a06b7e4ec54c172bf03f6417921a0d8c3a9994161fe1f88f815b +"normalize-url@npm:^4.1.0": + version: 4.5.1 + resolution: "normalize-url@npm:4.5.1" + checksum: 9a9dee01df02ad23e171171893e56e22d752f7cff86fb96aafeae074819b572ea655b60f8302e2d85dbb834dc885c972cc1c573892fea24df46b2765065dd05a languageName: node linkType: hard -"unicode-trie@npm:^2.0.0": - version: 2.0.0 - resolution: "unicode-trie@npm:2.0.0" - dependencies: - pako: ^0.2.5 - tiny-inflate: ^1.0.0 - checksum: 19e637ce20953ec1fbfa9087abef4746a50352679b833be27924e4ba7ad753cc4073b74263747ccfccb5e38b30b17468cbb96f361eb49903ff8602396280b5a4 +"normalize-url@npm:^6.0.1": + version: 6.1.0 + resolution: "normalize-url@npm:6.1.0" + checksum: 4a4944631173e7d521d6b80e4c85ccaeceb2870f315584fa30121f505a6dfd86439c5e3fdd8cd9e0e291290c41d0c3599f0cb12ab356722ed242584c30348e50 languageName: node linkType: hard -"unified@npm:^6.1.5": - version: 6.2.0 - resolution: "unified@npm:6.2.0" +"now-and-later@npm:^2.0.0": + version: 2.0.1 + resolution: "now-and-later@npm:2.0.1" dependencies: - bail: ^1.0.0 - extend: ^3.0.0 - is-plain-obj: ^1.1.0 - trough: ^1.0.0 - vfile: ^2.0.0 - x-is-string: ^0.1.0 - checksum: e7f56e3359ac01611a8128cad1d5b0ee66c0abde54e691a39af72326f6cc19ba1bfe5d16b2e54cee620fd28d626d7ff8e37dc283bb68c44f2517a0dee14be8f8 + once: ^1.3.2 + checksum: a6715b9504b96f2603020e048f5ef7adc0693a1be1fbb46589d359d95f16df77207339d7bccf76295675f0f152f4ef145914b8775fa179c294833abef05b475f languageName: node linkType: hard -"uniq@npm:^1.0.1": - version: 1.0.1 - resolution: "uniq@npm:1.0.1" - checksum: 8206535f83745ea83f9da7035f3b983fd6ed5e35b8ed7745441944e4065b616bc67cf0d0a23a86b40ee0074426f0607f0a138f9b78e124eb6a7a6a6966055709 +"npm-run-path@npm:^4.0.1": + version: 4.0.1 + resolution: "npm-run-path@npm:4.0.1" + dependencies: + path-key: ^3.0.0 + checksum: 5374c0cea4b0bbfdfae62da7bbdf1e1558d338335f4cacf2515c282ff358ff27b2ecb91ffa5330a8b14390ac66a1e146e10700440c1ab868208430f56b5f4d23 languageName: node linkType: hard -"unique-filename@npm:^2.0.0": - version: 2.0.1 - resolution: "unique-filename@npm:2.0.1" +"nth-check@npm:^2.0.1": + version: 2.1.1 + resolution: "nth-check@npm:2.1.1" dependencies: - unique-slug: ^3.0.0 - checksum: 807acf3381aff319086b64dc7125a9a37c09c44af7620bd4f7f3247fcd5565660ac12d8b80534dcbfd067e6fe88a67e621386dd796a8af828d1337a8420a255f + boolbase: ^1.0.0 + checksum: 5afc3dafcd1573b08877ca8e6148c52abd565f1d06b1eb08caf982e3fa289a82f2cae697ffb55b5021e146d60443f1590a5d6b944844e944714a5b549675bcd3 languageName: node linkType: hard -"unique-filename@npm:^3.0.0": - version: 3.0.0 - resolution: "unique-filename@npm:3.0.0" - dependencies: - unique-slug: ^4.0.0 - checksum: 8e2f59b356cb2e54aab14ff98a51ac6c45781d15ceaab6d4f1c2228b780193dc70fae4463ce9e1df4479cb9d3304d7c2043a3fb905bdeca71cc7e8ce27e063df +"object-assign@npm:^4.1.0": + version: 4.1.1 + resolution: "object-assign@npm:4.1.1" + checksum: fcc6e4ea8c7fe48abfbb552578b1c53e0d194086e2e6bbbf59e0a536381a292f39943c6e9628af05b5528aa5e3318bb30d6b2e53cadaf5b8fe9e12c4b69af23f languageName: node linkType: hard -"unique-slug@npm:^3.0.0": - version: 3.0.0 - resolution: "unique-slug@npm:3.0.0" - dependencies: - imurmurhash: ^0.1.4 - checksum: 49f8d915ba7f0101801b922062ee46b7953256c93ceca74303bd8e6413ae10aa7e8216556b54dc5382895e8221d04f1efaf75f945c2e4a515b4139f77aa6640c +"object-keys@npm:^1.1.1": + version: 1.1.1 + resolution: "object-keys@npm:1.1.1" + checksum: b363c5e7644b1e1b04aa507e88dcb8e3a2f52b6ffd0ea801e4c7a62d5aa559affe21c55a07fd4b1fd55fc03a33c610d73426664b20032405d7b92a1414c34d6a languageName: node linkType: hard -"unique-slug@npm:^4.0.0": - version: 4.0.0 - resolution: "unique-slug@npm:4.0.0" +"object.assign@npm:^4.0.4": + version: 4.1.5 + resolution: "object.assign@npm:4.1.5" dependencies: - imurmurhash: ^0.1.4 - checksum: 0884b58365af59f89739e6f71e3feacb5b1b41f2df2d842d0757933620e6de08eff347d27e9d499b43c40476cbaf7988638d3acb2ffbcb9d35fd035591adfd15 + call-bind: ^1.0.5 + define-properties: ^1.2.1 + has-symbols: ^1.0.3 + object-keys: ^1.1.1 + checksum: f9aeac0541661370a1fc86e6a8065eb1668d3e771f7dbb33ee54578201336c057b21ee61207a186dd42db0c62201d91aac703d20d12a79fc79c353eed44d4e25 languageName: node linkType: hard -"unique-stream@npm:^2.0.2": - version: 2.3.1 - resolution: "unique-stream@npm:2.3.1" +"once@npm:^1.3.0, once@npm:^1.3.1, once@npm:^1.3.2, once@npm:^1.4.0": + version: 1.4.0 + resolution: "once@npm:1.4.0" dependencies: - json-stable-stringify-without-jsonify: ^1.0.1 - through2-filter: ^3.0.0 - checksum: 65e433e68e46640e9283dbb022493c8d79ed1dac47807fe751dfe3bd50586927f63ad880ce9e01c2f85911f3caca48d04731aff6f07869434d5f76ecfe478559 + wrappy: 1 + checksum: cd0a88501333edd640d95f0d2700fbde6bff20b3d4d9bdc521bdd31af0656b5706570d6c6afe532045a20bb8dc0849f8332d6f2a416e0ba6d3d3b98806c7db68 languageName: node linkType: hard -"unique-string@npm:^1.0.0": - version: 1.0.0 - resolution: "unique-string@npm:1.0.0" +"onetime@npm:^5.1.2": + version: 5.1.2 + resolution: "onetime@npm:5.1.2" dependencies: - crypto-random-string: ^1.0.0 - checksum: 588f16bd4ec99b5130f237793d1a5694156adde20460366726573238e41e93b739b87987e863792aeb2392b26f8afb292490ace119c82ed12c46816c9c859f5f + mimic-fn: ^2.1.0 + checksum: 2478859ef817fc5d4e9c2f9e5728512ddd1dbc9fb7829ad263765bb6d3b91ce699d6e2332eef6b7dff183c2f490bd3349f1666427eaba4469fba0ac38dfd0d34 languageName: node linkType: hard -"unique-string@npm:^2.0.0, unique-string@npm:~2.0.0": - version: 2.0.0 - resolution: "unique-string@npm:2.0.0" +"ordered-read-streams@npm:^1.0.0": + version: 1.0.1 + resolution: "ordered-read-streams@npm:1.0.1" dependencies: - crypto-random-string: ^2.0.0 - checksum: ef68f639136bcfe040cf7e3cd7a8dff076a665288122855148a6f7134092e6ed33bf83a7f3a9185e46c98dddc445a0da6ac25612afa1a7c38b8b654d6c02498e + readable-stream: ^2.0.1 + checksum: 7558ac1acd649164524be715d25e38a1aba0f34df9dfb8ce281f9d14589ac3506bfe66e6609fa8c9cf0d7835e11da33f3f5445336cf3eb783f81da09a1bc5fe8 languageName: node linkType: hard -"unist-util-is@npm:^3.0.0": - version: 3.0.0 - resolution: "unist-util-is@npm:3.0.0" - checksum: d24a5dd80c670f763b2ae608651cf062317456aa81be51f66f45cbd7d440a2ab18356e4f48aeac6b5e3d391c69d3c3452ade5fe5aa9574bec4a2de0b10122ed5 +"override-require@npm:^1.1.1": + version: 1.1.1 + resolution: "override-require@npm:1.1.1" + checksum: 02978916308a07265034eb5252454b044288bacd8354a8dff433b4aba3c726ac7352230f6430176a44e1180deae43c1ae324646a9c36e5a9b058ff6076eecfd2 languageName: node linkType: hard -"unist-util-remove-position@npm:^1.0.0": - version: 1.1.4 - resolution: "unist-util-remove-position@npm:1.1.4" - dependencies: - unist-util-visit: ^1.1.0 - checksum: 74be7078d135601e9d295f392ef2768efc2c0bdb8720480c36fa608df6290cb85d324e82d4bdfc2f38303c466ffbba4f0fa4f9acb25fff45d23926259bdafcf6 +"p-cancelable@npm:^1.0.0": + version: 1.1.0 + resolution: "p-cancelable@npm:1.1.0" + checksum: 2db3814fef6d9025787f30afaee4496a8857a28be3c5706432cbad76c688a6db1874308f48e364a42f5317f5e41e8e7b4f2ff5c8ff2256dbb6264bc361704ece languageName: node linkType: hard -"unist-util-stringify-position@npm:^1.0.0, unist-util-stringify-position@npm:^1.1.1": - version: 1.1.2 - resolution: "unist-util-stringify-position@npm:1.1.2" - checksum: a8742a66cd0c1f5905b7d14345ef9bf2abf74acd68d419dbbfb284e6005629288dbbbc2a78df190c3939d6fb1031b0bb8f94025689c44209d48a1f2ff2ff54a0 +"p-cancelable@npm:^2.0.0": + version: 2.1.1 + resolution: "p-cancelable@npm:2.1.1" + checksum: 3dba12b4fb4a1e3e34524535c7858fc82381bbbd0f247cc32dedc4018592a3950ce66b106d0880b4ec4c2d8d6576f98ca885dc1d7d0f274d1370be20e9523ddf languageName: node linkType: hard -"unist-util-visit-parents@npm:1.1.2": - version: 1.1.2 - resolution: "unist-util-visit-parents@npm:1.1.2" - checksum: fed235889d2c95833153ac70dc6c736ddef11ce3e51285c1ae9fcf66d78fe26752f3e23a4cdf25ac532d3d41070662aa400fd30f79d8baf41aea135174b035a6 +"p-limit@npm:^2.1.0, p-limit@npm:^2.2.0, p-limit@npm:^2.2.1": + version: 2.3.0 + resolution: "p-limit@npm:2.3.0" + dependencies: + p-try: ^2.0.0 + checksum: 84ff17f1a38126c3314e91ecfe56aecbf36430940e2873dadaa773ffe072dc23b7af8e46d4b6485d302a11673fe94c6b67ca2cfbb60c989848b02100d0594ac1 languageName: node linkType: hard -"unist-util-visit-parents@npm:^2.0.0": - version: 2.1.2 - resolution: "unist-util-visit-parents@npm:2.1.2" +"p-limit@npm:^3.0.2": + version: 3.1.0 + resolution: "p-limit@npm:3.1.0" dependencies: - unist-util-is: ^3.0.0 - checksum: 048edbb590a8c4bc0043eec9f50d3fe76faa58f1ac663a7e6dee5e895ddd0ce8bc52f2cfe2e633849fa93671e8de021070667acb1518e3d40220768c7f70a3d3 + yocto-queue: ^0.1.0 + checksum: 7c3690c4dbf62ef625671e20b7bdf1cbc9534e83352a2780f165b0d3ceba21907e77ad63401708145ca4e25bfc51636588d89a8c0aeb715e6c37d1c066430360 languageName: node linkType: hard -"unist-util-visit@npm:^1.1.0, unist-util-visit@npm:^1.3.0": - version: 1.4.1 - resolution: "unist-util-visit@npm:1.4.1" +"p-locate@npm:^4.1.0": + version: 4.1.0 + resolution: "p-locate@npm:4.1.0" dependencies: - unist-util-visit-parents: ^2.0.0 - checksum: e9395205b6908c8d0fe71bc44e65d89d4781d1bb2d453a33cb67ed4124bad0b89d6b1d526ebaecb82a7c48e211bdf6f24351449b8cc115327b345f4617c18728 + p-limit: ^2.2.0 + checksum: 513bd14a455f5da4ebfcb819ef706c54adb09097703de6aeaa5d26fe5ea16df92b48d1ac45e01e3944ce1e6aa2a66f7f8894742b8c9d6e276e16cd2049a2b870 languageName: node linkType: hard -"uniswap@workspace:^, uniswap@workspace:packages/uniswap": - version: 0.0.0-use.local - resolution: "uniswap@workspace:packages/uniswap" - dependencies: - "@apollo/client": 3.10.4 - "@bufbuild/protobuf": 1.10.0 - "@connectrpc/connect": 1.4.0 - "@connectrpc/connect-query": 1.4.1 - "@connectrpc/connect-web": 1.4.0 - "@ethersproject/abstract-signer": 5.7.0 - "@ethersproject/address": 5.7.0 - "@ethersproject/bignumber": 5.7.0 - "@ethersproject/hash": 5.7.0 - "@ethersproject/properties": 5.7.0 - "@ethersproject/providers": 5.7.2 - "@ethersproject/units": 5.7.0 - "@ethersproject/web": 5.7.1 - "@faker-js/faker": 7.6.0 - "@gorhom/bottom-sheet": 4.6.4 - "@graphql-codegen/cli": 3.3.1 - "@graphql-codegen/client-preset": 3.0.1 - "@graphql-codegen/typescript": 3.0.4 - "@graphql-codegen/typescript-operations": 3.0.4 - "@graphql-codegen/typescript-react-apollo": 3.3.7 - "@graphql-codegen/typescript-resolvers": 3.2.1 - "@graphql-tools/graphql-file-loader": 8.0.0 - "@graphql-tools/load": 8.0.1 - "@graphql-tools/merge": 9.0.1 - "@graphql-tools/mock": 9.0.0 - "@react-native-async-storage/async-storage": 1.23.1 - "@react-native-community/netinfo": 11.4.1 - "@reduxjs/toolkit": 1.9.3 - "@shopify/flash-list": 1.7.1 - "@shopify/react-native-skia": 1.6.0 - "@simplewebauthn/browser": 11.0.0 - "@simplewebauthn/types": 11.0.0 - "@tanstack/query-async-storage-persister": 5.51.21 - "@tanstack/react-query": 5.51.16 - "@tanstack/react-query-persist-client": 5.51.23 - "@testing-library/jest-native": 5.4.3 - "@testing-library/react-hooks": 8.0.1 - "@testing-library/react-native": 13.0.0 - "@typechain/ethers-v5": 7.2.0 - "@types/chrome": 0.0.254 - "@types/react-test-renderer": 19.0.0 - "@types/react-window": 1.8.2 - "@typescript-eslint/utils": 6.20.0 - "@uniswap/analytics-events": 2.41.0 - "@uniswap/client-embeddedwallet": 0.0.13 - "@uniswap/client-explore": 0.0.15 - "@uniswap/client-pools": 0.0.13 - "@uniswap/eslint-config": "workspace:^" - "@uniswap/permit2-sdk": 1.3.0 - "@uniswap/router-sdk": 1.22.1 - "@uniswap/sdk-core": 7.5.0 - "@uniswap/uniswapx-sdk": 3.0.0-beta.3 - "@uniswap/v2-sdk": 4.13.0 - "@uniswap/v3-sdk": 3.24.0 - "@uniswap/v4-sdk": 1.19.2 - apollo-link-rest: 0.9.0 - axios: 1.6.5 - date-fns: 2.30.0 - dayjs: 1.11.7 - depcheck: 1.4.7 - es-toolkit: 1.10.0 - eslint: 8.44.0 - eslint-plugin-rulesdir: 0.2.2 - ethers: 5.7.2 - expo-blur: 14.0.3 - expo-clipboard: 7.0.0 - expo-web-browser: 13.0.3 - fuse.js: 6.5.3 - get-graphql-schema: 2.1.2 - graphql: 16.6.0 - graphql-scalars: 1.22.4 - i18next: 23.10.0 - i18next-resources-for-ts: 1.5.0 - i18next-resources-to-backend: 1.2.1 - idb-keyval: 6.2.1 - jest: 29.7.0 - jest-extended: 4.0.2 - jest-presets: "workspace:^" - jotai: 1.3.7 - jsbi: 3.2.5 - lodash: 4.17.21 - ms: 2.1.3 - openapi-typescript-codegen: 0.27.0 - qs: 6.11.0 - react: 18.3.1 - react-dom: 18.3.1 - react-i18next: 14.1.0 - react-native: 0.76.6 - react-native-appsflyer: 6.13.1 - react-native-device-info: 10.0.2 - react-native-dotenv: 3.2.0 - react-native-gesture-handler: 2.21.2 - react-native-get-random-values: 1.11.0 - react-native-localize: 2.2.6 - react-native-mmkv: 2.10.1 - react-native-reanimated: 3.16.7 - react-native-restart: 0.0.27 - react-native-svg: 15.10.1 - react-redux: 8.0.5 - react-router-dom: 6.10.0 - react-test-renderer: 18.3.1 - react-virtualized-auto-sizer: 1.0.20 - react-window: 1.8.9 - redux: 4.2.1 - statsig-react: 1.38.1 - statsig-react-native: 4.15.0 - tiny-invariant: 1.3.1 - ts-morph: 23.0.0 - tsafe: 1.6.4 - typechain: 5.2.0 - typed-redux-saga: 1.5.0 - typescript: 5.3.3 - ui: "workspace:^" - utilities: "workspace:^" - uuid: 9.0.0 - wagmi: 2.9.3 - wcag-contrast: 3.0.0 - zod: 3.22.4 - languageName: unknown - linkType: soft - -"universal-user-agent@npm:^6.0.0": - version: 6.0.0 - resolution: "universal-user-agent@npm:6.0.0" - checksum: 5092bbc80dd0d583cef0b62c17df0043193b74f425112ea6c1f69bc5eda21eeec7a08d8c4f793a277eb2202ffe9b44bec852fa3faff971234cd209874d1b79ef +"p-locate@npm:^5.0.0": + version: 5.0.0 + resolution: "p-locate@npm:5.0.0" + dependencies: + p-limit: ^3.0.2 + checksum: 1623088f36cf1cbca58e9b61c4e62bf0c60a07af5ae1ca99a720837356b5b6c5ba3eb1b2127e47a06865fee59dd0453cad7cc844cda9d5a62ac1a5a51b7c86d3 languageName: node linkType: hard -"universalify@npm:^0.1.0": - version: 0.1.2 - resolution: "universalify@npm:0.1.2" - checksum: 40cdc60f6e61070fe658ca36016a8f4ec216b29bf04a55dce14e3710cc84c7448538ef4dad3728d0bfe29975ccd7bfb5f414c45e7b78883567fb31b246f02dff +"p-try@npm:^2.0.0": + version: 2.2.0 + resolution: "p-try@npm:2.2.0" + checksum: f8a8e9a7693659383f06aec604ad5ead237c7a261c18048a6e1b5b85a5f8a067e469aa24f5bc009b991ea3b058a87f5065ef4176793a200d4917349881216cae languageName: node linkType: hard -"universalify@npm:^0.2.0": - version: 0.2.0 - resolution: "universalify@npm:0.2.0" - checksum: e86134cb12919d177c2353196a4cc09981524ee87abf621f7bc8d249dbbbebaec5e7d1314b96061497981350df786e4c5128dbf442eba104d6e765bc260678b5 +"package-json@npm:^6.5.0": + version: 6.5.0 + resolution: "package-json@npm:6.5.0" + dependencies: + got: ^9.6.0 + registry-auth-token: ^4.0.0 + registry-url: ^5.0.0 + semver: ^6.2.0 + checksum: cc9f890d3667d7610e6184decf543278b87f657d1ace0deb4a9c9155feca738ef88f660c82200763d3348010f4e42e9c7adc91e96ab0f86a770955995b5351e2 languageName: node linkType: hard -"universalify@npm:^1.0.0": - version: 1.0.0 - resolution: "universalify@npm:1.0.0" - checksum: 095a808f2b915e3b89d29b6f3b4ee4163962b02fa5b7cb686970b8d0439f4ca789bc43f319b7cbb1ce552ae724e631d148e5aee9ce04c4f46a7fe0c5bbfd2b9e +"parent-module@npm:^1.0.0": + version: 1.0.1 + resolution: "parent-module@npm:1.0.1" + dependencies: + callsites: ^3.0.0 + checksum: 6ba8b255145cae9470cf5551eb74be2d22281587af787a2626683a6c20fbb464978784661478dd2a3f1dad74d1e802d403e1b03c1a31fab310259eec8ac560ff languageName: node linkType: hard -"universalify@npm:^2.0.0": - version: 2.0.0 - resolution: "universalify@npm:2.0.0" - checksum: 2406a4edf4a8830aa6813278bab1f953a8e40f2f63a37873ffa9a3bc8f9745d06cc8e88f3572cb899b7e509013f7f6fcc3e37e8a6d914167a5381d8440518c44 +"parse-diff@npm:^0.7.0": + version: 0.7.1 + resolution: "parse-diff@npm:0.7.1" + checksum: 937fab2cca7760178814a23c512cc7fcdd63c0eb1f28adc816a1eb0b59bf0b88c8d0ec4bd221db0cc0c30e0b51ea271a355b03b61abd2cbe79515ae298e7b440 languageName: node linkType: hard -"universe@workspace:.": - version: 0.0.0-use.local - resolution: "universe@workspace:." - dependencies: - "@actions/core": 1.10.1 - "@commitlint/cli": 17.5.0 - "@commitlint/config-conventional": 17.4.4 - "@crowdin/cli": 3.14.0 - "@ethersproject/keccak256": 5.7.0 - "@manypkg/cli": 0.19.2 - danger: 11.2.6 - depcheck: 1.4.7 - dotenv-cli: 7.1.0 - husky: 8.0.3 - i18next: 23.10.0 - i18next-parser: 8.6.0 - js-yaml: 4.1.0 - moti: 0.29.0 - prettier: 3.3.2 - prettier-plugin-organize-imports: 3.2.4 - syncpack: 8.5.14 - turbo: 1.13.4 - turbo-ignore: 1.11.3 - languageName: unknown - linkType: soft - -"unixify@npm:^1.0.0": - version: 1.0.0 - resolution: "unixify@npm:1.0.0" +"parse-git-config@npm:^2.0.3": + version: 2.0.3 + resolution: "parse-git-config@npm:2.0.3" dependencies: - normalize-path: ^2.1.1 - checksum: 3be30e48579fc6c7390bd59b4ab9e745fede0c164dfb7351cf710bd1dbef8484b1441186205af6bcb13b731c0c88caf9b33459f7bf8c89e79c046e656ae433f0 + expand-tilde: ^2.0.2 + git-config-path: ^1.0.1 + ini: ^1.3.5 + checksum: 360ca1f52ebc5dbbc31276a175919e97f06a16c07dd5bbe5e58eb79ed38d4f8e6468b320b255e184e29306ef7796f69a4a5e010a90705723cd265487ce4a4fe7 languageName: node linkType: hard -"unpipe@npm:1.0.0, unpipe@npm:~1.0.0": - version: 1.0.0 - resolution: "unpipe@npm:1.0.0" - checksum: 4fa18d8d8d977c55cb09715385c203197105e10a6d220087ec819f50cb68870f02942244f1017565484237f1f8c5d3cd413631b1ae104d3096f24fdfde1b4aa2 +"parse-github-url@npm:^1.0.2": + version: 1.0.2 + resolution: "parse-github-url@npm:1.0.2" + bin: + parse-github-url: ./cli.js + checksum: a19b8bc6f8908a24cb63a10ff90cd39cec0745615a272ec686803684653be34eb3e638e31a66c8ee3a9568082ff686eaf010181688000a6274c86a23e9220f2f languageName: node linkType: hard -"unplugin@npm:^1.3.1": - version: 1.16.0 - resolution: "unplugin@npm:1.16.0" +"parse-json@npm:^5.0.0": + version: 5.2.0 + resolution: "parse-json@npm:5.2.0" dependencies: - acorn: ^8.14.0 - webpack-virtual-modules: ^0.6.2 - checksum: 84bff88dd8fd6ba88bd21dad1b170fea2a91f7ff8ddcfadf826297cf77dfe305f3428f1612c0637f30d7ac10d668491f15fdf8f378dd56def370fdbc16edd85e + "@babel/code-frame": ^7.0.0 + error-ex: ^1.3.1 + json-parse-even-better-errors: ^2.3.0 + lines-and-columns: ^1.1.6 + checksum: 62085b17d64da57f40f6afc2ac1f4d95def18c4323577e1eced571db75d9ab59b297d1d10582920f84b15985cbfc6b6d450ccbf317644cfa176f3ed982ad87e2 languageName: node linkType: hard -"unquote@npm:~1.1.1": - version: 1.1.1 - resolution: "unquote@npm:1.1.1" - checksum: 71745867d09cba44ba2d26cb71d6dda7045a98b14f7405df4faaf2b0c90d24703ad027a9d90ba9a6e0d096de2c8d56f864fd03f1c0498c0b7a3990f73b4c8f5f +"parse-link-header@npm:^2.0.0": + version: 2.0.0 + resolution: "parse-link-header@npm:2.0.0" + dependencies: + xtend: ~4.0.1 + checksum: 0e96c6af9910e8f92084b49b8dc6a10dd58db470847d1499f562576180c1ac5e49d18007697f0d538e5f3efdc8ce1d8777641f3ae225302b74af0dd0578b628e languageName: node linkType: hard -"unstorage@npm:^1.9.0": - version: 1.10.1 - resolution: "unstorage@npm:1.10.1" - dependencies: - anymatch: ^3.1.3 - chokidar: ^3.5.3 - destr: ^2.0.2 - h3: ^1.8.2 - ioredis: ^5.3.2 - listhen: ^1.5.5 - lru-cache: ^10.0.2 - mri: ^1.2.0 - node-fetch-native: ^1.4.1 - ofetch: ^1.3.3 - ufo: ^1.3.1 - peerDependencies: - "@azure/app-configuration": ^1.4.1 - "@azure/cosmos": ^4.0.0 - "@azure/data-tables": ^13.2.2 - "@azure/identity": ^3.3.2 - "@azure/keyvault-secrets": ^4.7.0 - "@azure/storage-blob": ^12.16.0 - "@capacitor/preferences": ^5.0.6 - "@netlify/blobs": ^6.2.0 - "@planetscale/database": ^1.11.0 - "@upstash/redis": ^1.23.4 - "@vercel/kv": ^0.2.3 - idb-keyval: ^6.2.1 - peerDependenciesMeta: - "@azure/app-configuration": - optional: true - "@azure/cosmos": - optional: true - "@azure/data-tables": - optional: true - "@azure/identity": - optional: true - "@azure/keyvault-secrets": - optional: true - "@azure/storage-blob": - optional: true - "@capacitor/preferences": - optional: true - "@netlify/blobs": - optional: true - "@planetscale/database": - optional: true - "@upstash/redis": - optional: true - "@vercel/kv": - optional: true - idb-keyval: - optional: true - checksum: 59dc9f21d25df2bc8d14e3965235cbb85e3e2e8cb332da70ca471ba4519269a06936eba4012916251f3b88e23176df44b64abb826202a3a3c9d0a185bfe5e500 +"parse-passwd@npm:^1.0.0": + version: 1.0.0 + resolution: "parse-passwd@npm:1.0.0" + checksum: 4e55e0231d58f828a41d0f1da2bf2ff7bcef8f4cb6146e69d16ce499190de58b06199e6bd9b17fbf0d4d8aef9052099cdf8c4f13a6294b1a522e8e958073066e languageName: node linkType: hard -"untildify@npm:^4.0.0": - version: 4.0.0 - resolution: "untildify@npm:4.0.0" - checksum: 39ced9c418a74f73f0a56e1ba4634b4d959422dff61f4c72a8e39f60b99380c1b45ed776fbaa0a4101b157e4310d873ad7d114e8534ca02609b4916bb4187fb9 +"parse5-htmlparser2-tree-adapter@npm:^7.0.0": + version: 7.0.0 + resolution: "parse5-htmlparser2-tree-adapter@npm:7.0.0" + dependencies: + domhandler: ^5.0.2 + parse5: ^7.0.0 + checksum: fc5d01e07733142a1baf81de5c2a9c41426c04b7ab29dd218acb80cd34a63177c90aff4a4aee66cf9f1d0aeecff1389adb7452ad6f8af0a5888e3e9ad6ef733d languageName: node linkType: hard -"untun@npm:^0.1.3": - version: 0.1.3 - resolution: "untun@npm:0.1.3" +"parse5@npm:^7.0.0": + version: 7.1.2 + resolution: "parse5@npm:7.1.2" dependencies: - citty: ^0.1.5 - consola: ^3.2.3 - pathe: ^1.1.1 - bin: - untun: bin/untun.mjs - checksum: ad886c242dbac250f88ef6f18ad780fa084d07e4d030ab5ceacfe4378aa4bf2d3549b8ed8352bad5776facd9aaee05e3f914c661adc11bace867e2a12fd7bee5 + entities: ^4.4.0 + checksum: 59465dd05eb4c5ec87b76173d1c596e152a10e290b7abcda1aecf0f33be49646ea74840c69af975d7887543ea45564801736356c568d6b5e71792fd0f4055713 languageName: node linkType: hard -"unzip-response@npm:^2.0.1": - version: 2.0.1 - resolution: "unzip-response@npm:2.0.1" - checksum: 433aa4869a82c0e2bf2896dce8072b723511023515ba97155759efeea7c0e4db8ecfee2fcc0babf168545c2be613aed205d5237423c249d77d0f5327a842c20d +"path-dirname@npm:^1.0.0": + version: 1.0.2 + resolution: "path-dirname@npm:1.0.2" + checksum: 0d2f6604ae05a252a0025318685f290e2764ecf9c5436f203cdacfc8c0b17c24cdedaa449d766beb94ab88cc7fc70a09ec21e7933f31abc2b719180883e5e33f languageName: node linkType: hard -"upath@npm:^1.2.0": - version: 1.2.0 - resolution: "upath@npm:1.2.0" - checksum: 4c05c094797cb733193a0784774dbea5b1889d502fc9f0572164177e185e4a59ba7099bf0b0adf945b232e2ac60363f9bf18aac9b2206fb99cbef971a8455445 +"path-exists@npm:^4.0.0": + version: 4.0.0 + resolution: "path-exists@npm:4.0.0" + checksum: 505807199dfb7c50737b057dd8d351b82c033029ab94cb10a657609e00c1bc53b951cfdbccab8de04c5584d5eff31128ce6afd3db79281874a5ef2adbba55ed1 languageName: node linkType: hard -"update-browserslist-db@npm:^1.1.1": - version: 1.1.1 - resolution: "update-browserslist-db@npm:1.1.1" - dependencies: - escalade: ^3.2.0 - picocolors: ^1.1.0 - peerDependencies: - browserslist: ">= 4.21.0" - bin: - update-browserslist-db: cli.js - checksum: 2ea11bd2562122162c3e438d83a1f9125238c0844b6d16d366e3276d0c0acac6036822dc7df65fc5a89c699cdf9f174acf439c39bedf3f9a2f3983976e4b4c3e +"path-is-absolute@npm:^1.0.0": + version: 1.0.1 + resolution: "path-is-absolute@npm:1.0.1" + checksum: 060840f92cf8effa293bcc1bea81281bd7d363731d214cbe5c227df207c34cd727430f70c6037b5159c8a870b9157cba65e775446b0ab06fd5ecc7e54615a3b8 languageName: node linkType: hard -"update-check@npm:1.5.4": - version: 1.5.4 - resolution: "update-check@npm:1.5.4" - dependencies: - registry-auth-token: 3.3.2 - registry-url: 3.1.0 - checksum: 2c9f7de6f030364c5ea02a341e5ae2dfe76da6559b32d40dd3b047b3ac0927408cf92d322c51cd8e009688210a85ccbf1eba449762a65a0d1b14f3cdf1ea5c48 +"path-key@npm:^3.0.0, path-key@npm:^3.1.0": + version: 3.1.1 + resolution: "path-key@npm:3.1.1" + checksum: 55cd7a9dd4b343412a8386a743f9c746ef196e57c823d90ca3ab917f90ab9f13dd0ded27252ba49dbdfcab2b091d998bc446f6220cd3cea65db407502a740020 languageName: node linkType: hard -"update-notifier@npm:^2.1.0": - version: 2.5.0 - resolution: "update-notifier@npm:2.5.0" - dependencies: - boxen: ^1.2.1 - chalk: ^2.0.1 - configstore: ^3.0.0 - import-lazy: ^2.1.0 - is-ci: ^1.0.10 - is-installed-globally: ^0.1.0 - is-npm: ^1.0.0 - latest-version: ^3.0.0 - semver-diff: ^2.0.0 - xdg-basedir: ^3.0.0 - checksum: a9ba50396b7f66ae32897be76165a3b344a15e8605efebf1e0c7bd82a27e3f69b5372c54c2c5e35685ea3918212246fba5faf942f341258d4f4590f7f80a2ce7 +"path-parse@npm:^1.0.7": + version: 1.0.7 + resolution: "path-parse@npm:1.0.7" + checksum: 49abf3d81115642938a8700ec580da6e830dde670be21893c62f4e10bd7dd4c3742ddc603fe24f898cba7eb0c6bc1777f8d9ac14185d34540c6d4d80cd9cae8a languageName: node linkType: hard -"upper-case-first@npm:^2.0.2": - version: 2.0.2 - resolution: "upper-case-first@npm:2.0.2" - dependencies: - tslib: ^2.0.3 - checksum: 4487db4701effe3b54ced4b3e4aa4d9ab06c548f97244d04aafb642eedf96a76d5a03cf5f38f10f415531d5792d1ac6e1b50f2a76984dc6964ad530f12876409 +"path-posix@npm:^1.0.0": + version: 1.0.0 + resolution: "path-posix@npm:1.0.0" + checksum: 4f64ad212de6ad8d0dbfa440cac8b924303c25c30301769ad0501e29e83a5b9d469e8133753f999ad37482c9c8d3511129e4d83db55d2e4b1555b183c9749ae8 languageName: node linkType: hard -"upper-case@npm:^2.0.2": - version: 2.0.2 - resolution: "upper-case@npm:2.0.2" - dependencies: - tslib: ^2.0.3 - checksum: 508723a2b03ab90cf1d6b7e0397513980fab821cbe79c87341d0e96cedefadf0d85f9d71eac24ab23f526a041d585a575cfca120a9f920e44eb4f8a7cf89121c +"path-type@npm:^4.0.0": + version: 4.0.0 + resolution: "path-type@npm:4.0.0" + checksum: 5b1e2daa247062061325b8fdbfd1fb56dde0a448fb1455453276ea18c60685bdad23a445dc148cf87bc216be1573357509b7d4060494a6fd768c7efad833ee45 languageName: node linkType: hard -"uppercamelcase@npm:3.0.0": - version: 3.0.0 - resolution: "uppercamelcase@npm:3.0.0" - dependencies: - camelcase: ^4.1.0 - checksum: 150470c3de1ec4bb6957f39004c0db30f2badc8d1e7b77e3209fa92cc0896ac294a6138aef62ae163ac774eea5c4d688feff5673e2b2323ef4a91552b408b117 +"pend@npm:~1.2.0": + version: 1.2.0 + resolution: "pend@npm:1.2.0" + checksum: 6c72f5243303d9c60bd98e6446ba7d30ae29e3d56fdb6fae8767e8ba6386f33ee284c97efe3230a0d0217e2b1723b8ab490b1bbf34fcbb2180dbc8a9de47850d languageName: node linkType: hard -"uqr@npm:^0.1.2": - version: 0.1.2 - resolution: "uqr@npm:0.1.2" - checksum: 717766f03814172f5a9934dae2c4c48f6de065a4fd7da82aa513bd8300b621c1e606efdd174478cab79093e5ba244a99f0c0b1b0b9c0175656ab5e637a006d92 +"picocolors@npm:^1.0.0, picocolors@npm:^1.1.1": + version: 1.1.1 + resolution: "picocolors@npm:1.1.1" + checksum: e1cf46bf84886c79055fdfa9dcb3e4711ad259949e3565154b004b260cd356c5d54b31a1437ce9782624bf766272fe6b0154f5f0c744fb7af5d454d2b60db045 languageName: node linkType: hard -"uri-js@npm:^4.2.2": - version: 4.4.1 - resolution: "uri-js@npm:4.4.1" - dependencies: - punycode: ^2.1.0 - checksum: 7167432de6817fe8e9e0c9684f1d2de2bb688c94388f7569f7dbdb1587c9f4ca2a77962f134ec90be0cc4d004c939ff0d05acc9f34a0db39a3c797dada262633 +"picomatch@npm:^2.2.1, picomatch@npm:^2.3.1": + version: 2.3.1 + resolution: "picomatch@npm:2.3.1" + checksum: 050c865ce81119c4822c45d3c84f1ced46f93a0126febae20737bd05ca20589c564d6e9226977df859ed5e03dc73f02584a2b0faad36e896936238238b0446cf languageName: node linkType: hard -"url-parse-lax@npm:^1.0.0": - version: 1.0.0 - resolution: "url-parse-lax@npm:1.0.0" - dependencies: - prepend-http: ^1.0.1 - checksum: 03316acff753845329652258c16d1688765ee34f7d242a94dadf9ff6e43ea567ec062cec7aa27c37f76f2c57f95e0660695afff32fb97b527591c7340a3090fa +"pify@npm:^4.0.1": + version: 4.0.1 + resolution: "pify@npm:4.0.1" + checksum: 9c4e34278cb09987685fa5ef81499c82546c033713518f6441778fbec623fc708777fe8ac633097c72d88470d5963094076c7305cafc7ad340aae27cfacd856b languageName: node linkType: hard -"url-parse-lax@npm:^3.0.0": - version: 3.0.0 - resolution: "url-parse-lax@npm:3.0.0" +"pinpoint@npm:^1.1.0": + version: 1.1.0 + resolution: "pinpoint@npm:1.1.0" + checksum: 6199e13269796fea5b0da39df86dc815e14adc20081b533150be8cabaabc64f0581506288c379b96df2095c015fe28d012e2386a14759e1372a1bafcc05a1746 + languageName: node + linkType: hard + +"please-upgrade-node@npm:^3.2.0": + version: 3.2.0 + resolution: "please-upgrade-node@npm:3.2.0" dependencies: - prepend-http: ^2.0.0 - checksum: 1040e357750451173132228036aff1fd04abbd43eac1fb3e4fca7495a078bcb8d33cb765fe71ad7e473d9c94d98fd67adca63bd2716c815a2da066198dd37217 + semver-compare: ^1.0.0 + checksum: d87c41581a2a022fbe25965a97006238cd9b8cbbf49b39f78d262548149a9d30bd2bdf35fec3d810e0001e630cd46ef13c7e19c389dea8de7e64db271a2381bb languageName: node linkType: hard -"url-parse@npm:^1.5.3": - version: 1.5.10 - resolution: "url-parse@npm:1.5.10" +"popmotion@npm:11.0.3": + version: 11.0.3 + resolution: "popmotion@npm:11.0.3" dependencies: - querystringify: ^2.1.1 - requires-port: ^1.0.0 - checksum: fbdba6b1d83336aca2216bbdc38ba658d9cfb8fc7f665eb8b17852de638ff7d1a162c198a8e4ed66001ddbf6c9888d41e4798912c62b4fd777a31657989f7bdf + framesync: 6.0.1 + hey-listen: ^1.0.8 + style-value-types: 5.0.0 + tslib: ^2.1.0 + checksum: 9fe7d03b4ec0e85bfb9dadc23b745147bfe42e16f466ba06e6327197d0e38b72015afc2f918a8051dedc3680310417f346ffdc463be6518e2e92e98f48e30268 languageName: node linkType: hard -"url@npm:^0.11.0": - version: 0.11.0 - resolution: "url@npm:0.11.0" +"postcss@npm:^8.4.32": + version: 8.4.49 + resolution: "postcss@npm:8.4.49" dependencies: - punycode: 1.3.2 - querystring: 0.2.0 - checksum: 50d100d3dd2d98b9fe3ada48cadb0b08aa6be6d3ac64112b867b56b19be4bfcba03c2a9a0d7922bfd7ac17d4834e88537749fe182430dfd9b68e520175900d90 + nanoid: ^3.3.7 + picocolors: ^1.1.1 + source-map-js: ^1.2.1 + checksum: eb5d6cbdca24f50399aafa5d2bea489e4caee4c563ea1edd5a2485bc5f84e9ceef3febf170272bc83a99c31d23a316ad179213e853f34c2a7a8ffa534559d63a languageName: node linkType: hard -"urlpattern-polyfill@npm:^8.0.0": - version: 8.0.2 - resolution: "urlpattern-polyfill@npm:8.0.2" - checksum: d2cc0905a613c77e330c426e8697ee522dd9640eda79ac51160a0f6350e103f09b8c327623880989f8ba7325e8d95267b745aa280fdcc2aead80b023e16bd09d +"prepend-http@npm:^2.0.0": + version: 2.0.0 + resolution: "prepend-http@npm:2.0.0" + checksum: 7694a9525405447662c1ffd352fcb41b6410c705b739b6f4e3a3e21cf5fdede8377890088e8934436b8b17ba55365a615f153960f30877bf0d0392f9e93503ea languageName: node linkType: hard -"use-callback-ref@npm:^1.3.0, use-callback-ref@npm:^1.3.3": - version: 1.3.3 - resolution: "use-callback-ref@npm:1.3.3" - dependencies: - tslib: ^2.0.0 +"prettier-plugin-organize-imports@npm:3.2.4": + version: 3.2.4 + resolution: "prettier-plugin-organize-imports@npm:3.2.4" peerDependencies: - "@types/react": "*" - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + "@volar/vue-language-plugin-pug": ^1.0.4 + "@volar/vue-typescript": ^1.0.4 + prettier: ">=2.0" + typescript: ">=2.9" peerDependenciesMeta: - "@types/react": + "@volar/vue-language-plugin-pug": + optional: true + "@volar/vue-typescript": optional: true - checksum: 4da1c82d7a2409cee6c882748a40f4a083decf238308bf12c3d0166f0e338f8d512f37b8d11987eb5a421f14b9b5b991edf3e11ed25c3bb7a6559081f8359b44 + checksum: 57ae97d7e403445e650ae92b7da586761d1d88a47e46b3ea274baeb96782165bebd0132db9c652081e185c41b50701ba1d30d615ad1c9000300cc0c67eb12b7a languageName: node linkType: hard -"use-latest-callback@npm:^0.1.5": - version: 0.1.6 - resolution: "use-latest-callback@npm:0.1.6" - peerDependencies: - react: ">=16.8" - checksum: d94bea5cc5910d5967b12c766355c11812c1f57b5993d4b429dd6e580ac5904087ce732891d4fb3a855e0e56e6a7900b9af2084ede1d86df8e381afe47c2947a +"prettier@npm:3.3.2": + version: 3.3.2 + resolution: "prettier@npm:3.3.2" + bin: + prettier: bin/prettier.cjs + checksum: 5557d8caed0b182f68123c2e1e370ef105251d1dd75800fadaece3d061daf96b1389141634febf776050f9d732c7ae8fd444ff0b4a61b20535e7610552f32c69 languageName: node linkType: hard -"use-resize-observer@npm:9.1.0": - version: 9.1.0 - resolution: "use-resize-observer@npm:9.1.0" +"prettyjson@npm:^1.2.1": + version: 1.2.5 + resolution: "prettyjson@npm:1.2.5" dependencies: - "@juggle/resize-observer": ^3.3.1 - peerDependencies: - react: 16.8.0 - 18 - react-dom: 16.8.0 - 18 - checksum: 92be0ac34a3b3cf884cd55847c90792b5b44833dc258e96d650152815ad246afe45825aa223332203004d836535a927ab74f18dc0313229e2c7c69510eddf382 + colors: 1.4.0 + minimist: ^1.2.0 + bin: + prettyjson: bin/prettyjson + checksum: e36e8ae4f77065160028fea33c6ae8e91936f86a4fd1751ceb19f88f336bc54e6f7d232ece38d4da3f7734e5c5e1fc3114a0d92da1987e7cf1515dcb29d447d1 languageName: node linkType: hard -"use-sidecar@npm:^1.1.2": - version: 1.1.2 - resolution: "use-sidecar@npm:1.1.2" - dependencies: - detect-node-es: ^1.1.0 - tslib: ^2.0.0 - peerDependencies: - "@types/react": ^16.9.0 || ^17.0.0 || ^18.0.0 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - "@types/react": - optional: true - checksum: 925d1922f9853e516eaad526b6fed1be38008073067274f0ecc3f56b17bb8ab63480140dd7c271f94150027c996cea4efe83d3e3525e8f3eda22055f6a39220b +"process-nextick-args@npm:^2.0.0, process-nextick-args@npm:~2.0.0": + version: 2.0.1 + resolution: "process-nextick-args@npm:2.0.1" + checksum: 1d38588e520dab7cea67cbbe2efdd86a10cc7a074c09657635e34f035277b59fbb57d09d8638346bf7090f8e8ebc070c96fa5fd183b777fff4f5edff5e9466cf languageName: node linkType: hard -"use-sync-external-store@npm:1.2.0": - version: 1.2.0 - resolution: "use-sync-external-store@npm:1.2.0" - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - checksum: 5c639e0f8da3521d605f59ce5be9e094ca772bd44a4ce7322b055a6f58eeed8dda3c94cabd90c7a41fb6fa852210092008afe48f7038792fd47501f33299116a +"promise-map-series@npm:^0.3.0": + version: 0.3.0 + resolution: "promise-map-series@npm:0.3.0" + checksum: a1c992562e68a3e14c39d010bd6335166e4a0469763fd161a8b1e15f972033fce5207722edb9c16ecc9324b44ef45e42674f7015e6a8922972f45a85849bbeef languageName: node linkType: hard -"use-sync-external-store@npm:^1.0.0": - version: 1.2.2 - resolution: "use-sync-external-store@npm:1.2.2" - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - checksum: fe07c071c4da3645f112c38c0e57beb479a8838616ff4e92598256ecce527f2888c08febc7f9b2f0ce2f0e18540ba3cde41eb2035e4fafcb4f52955037098a81 +"pseudomap@npm:^1.0.2": + version: 1.0.2 + resolution: "pseudomap@npm:1.0.2" + checksum: 856c0aae0ff2ad60881168334448e898ad7a0e45fe7386d114b150084254c01e200c957cf378378025df4e052c7890c5bd933939b0e0d2ecfcc1dc2f0b2991f5 languageName: node linkType: hard -"utf-8-validate@npm:^6.0.3": - version: 6.0.5 - resolution: "utf-8-validate@npm:6.0.5" +"pump@npm:^2.0.0": + version: 2.0.1 + resolution: "pump@npm:2.0.1" dependencies: - node-gyp: latest - node-gyp-build: ^4.3.0 - checksum: ab6bd5b0db2241a990a9e1c434a29194900f9f8f715158b56d591306634cdd4f748e91b965d91a32fd459c86b082ec0a35d369bbc4efbb243b48f593c14448e8 + end-of-stream: ^1.1.0 + once: ^1.3.1 + checksum: e9f26a17be00810bff37ad0171edb35f58b242487b0444f92fb7d78bc7d61442fa9b9c5bd93a43fd8fd8ddd3cc75f1221f5e04c790f42907e5baab7cf5e2b931 languageName: node linkType: hard -"utf8@npm:3.0.0": +"pump@npm:^3.0.0": version: 3.0.0 - resolution: "utf8@npm:3.0.0" - checksum: cb89a69ad9ab393e3eae9b25305b3ff08bebca9adc839191a34f90777eb2942f86a96369d2839925fea58f8f722f7e27031d697f10f5f39690f8c5047303e62d + resolution: "pump@npm:3.0.0" + dependencies: + end-of-stream: ^1.1.0 + once: ^1.3.1 + checksum: e42e9229fba14732593a718b04cb5e1cfef8254544870997e0ecd9732b189a48e1256e4e5478148ecb47c8511dca2b09eae56b4d0aad8009e6fac8072923cfc9 languageName: node linkType: hard -"utif@npm:^2.0.1": - version: 2.0.1 - resolution: "utif@npm:2.0.1" +"pumpify@npm:^1.3.5": + version: 1.5.1 + resolution: "pumpify@npm:1.5.1" + dependencies: + duplexify: ^3.6.0 + inherits: ^2.0.3 + pump: ^2.0.0 + checksum: 26ca412ec8d665bd0d5e185c1b8f627728eff603440d75d22a58e421e3c66eaf86ec6fc6a6efc54808ecef65979279fa8e99b109a23ec1fa8d79f37e6978c9bd + languageName: node + linkType: hard + +"q@npm:^1.5.1": + version: 1.5.1 + resolution: "q@npm:1.5.1" + checksum: 147baa93c805bc1200ed698bdf9c72e9e42c05f96d007e33a558b5fdfd63e5ea130e99313f28efc1783e90e6bdb4e48b67a36fcc026b7b09202437ae88a1fb12 + languageName: node + linkType: hard + +"query-string@npm:^6.12.1": + version: 6.14.1 + resolution: "query-string@npm:6.14.1" dependencies: - pako: ^1.0.5 - checksum: 66b0bffc18f08834a34c44846f189b2223418e8bddfff3882e07fccea54436737f7334e27c86cbff46e247487dc92377b7a17428a7aafc5d5c733d61bed39038 + decode-uri-component: ^0.2.0 + filter-obj: ^1.1.0 + split-on-first: ^1.0.0 + strict-uri-encode: ^2.0.0 + checksum: f2c7347578fa0f3fd4eaace506470cb4e9dc52d409a7ddbd613f614b9a594d750877e193b5d5e843c7477b3b295b857ec328903c943957adc41a3efb6c929449 languageName: node linkType: hard -"util-deprecate@npm:^1.0.1, util-deprecate@npm:^1.0.2, util-deprecate@npm:~1.0.1": - version: 1.0.2 - resolution: "util-deprecate@npm:1.0.2" - checksum: 474acf1146cb2701fe3b074892217553dfcf9a031280919ba1b8d651a068c9b15d863b7303cb15bd00a862b498e6cf4ad7b4a08fb134edd5a6f7641681cb54a2 +"queue-microtask@npm:^1.2.2": + version: 1.2.3 + resolution: "queue-microtask@npm:1.2.3" + checksum: b676f8c040cdc5b12723ad2f91414d267605b26419d5c821ff03befa817ddd10e238d22b25d604920340fd73efd8ba795465a0377c4adf45a4a41e4234e42dc4 languageName: node linkType: hard -"util.promisify@npm:~1.0.0": +"queue-tick@npm:^1.0.1": version: 1.0.1 - resolution: "util.promisify@npm:1.0.1" - dependencies: - define-properties: ^1.1.3 - es-abstract: ^1.17.2 - has-symbols: ^1.0.1 - object.getownpropertydescriptors: ^2.1.0 - checksum: d823c75b3fc66510018596f128a6592c98991df38bc0464a633bdf9134e2de0a1a33199c5c21cc261048a3982d7a19e032ecff8835b3c587f843deba96063e37 + resolution: "queue-tick@npm:1.0.1" + checksum: 57c3292814b297f87f792fbeb99ce982813e4e54d7a8bdff65cf53d5c084113913289d4a48ec8bbc964927a74b847554f9f4579df43c969a6c8e0f026457ad01 languageName: node linkType: hard -"util@npm:^0.12.0, util@npm:^0.12.4, util@npm:^0.12.5": - version: 0.12.5 - resolution: "util@npm:0.12.5" - dependencies: - inherits: ^2.0.3 - is-arguments: ^1.0.4 - is-generator-function: ^1.0.7 - is-typed-array: ^1.1.3 - which-typed-array: ^1.1.2 - checksum: 705e51f0de5b446f4edec10739752ac25856541e0254ea1e7e45e5b9f9b0cb105bc4bd415736a6210edc68245a7f903bf085ffb08dd7deb8a0e847f60538a38a +"quick-lru@npm:^4.0.1": + version: 4.0.1 + resolution: "quick-lru@npm:4.0.1" + checksum: bea46e1abfaa07023e047d3cf1716a06172c4947886c053ede5c50321893711577cb6119360f810cc3ffcd70c4d7db4069c3cee876b358ceff8596e062bd1154 languageName: node linkType: hard -"utila@npm:~0.4": - version: 0.4.0 - resolution: "utila@npm:0.4.0" - checksum: 97ffd3bd2bb80c773429d3fb8396469115cd190dded1e733f190d8b602bd0a1bcd6216b7ce3c4395ee3c79e3c879c19d268dbaae3093564cb169ad1212d436f4 +"quick-lru@npm:^5.1.1": + version: 5.1.1 + resolution: "quick-lru@npm:5.1.1" + checksum: a516faa25574be7947969883e6068dbe4aa19e8ef8e8e0fd96cddd6d36485e9106d85c0041a27153286b0770b381328f4072aa40d3b18a19f5f7d2b78b94b5ed languageName: node linkType: hard -"utilities@workspace:^, utilities@workspace:packages/utilities": - version: 0.0.0-use.local - resolution: "utilities@workspace:packages/utilities" - dependencies: - "@amplitude/analytics-browser": 1.12.1 - "@amplitude/analytics-core": 0.11.0 - "@amplitude/analytics-react-native": 1.4.11 - "@amplitude/analytics-types": 0.13.0 - "@apollo/client": 3.10.4 - "@datadog/browser-logs": 5.20.0 - "@datadog/browser-rum": 5.23.3 - "@datadog/mobile-react-native": 2.4.1 - "@ethersproject/abstract-signer": 5.7.0 - "@ethersproject/address": 5.7.0 - "@ethersproject/constants": 5.7.0 - "@ethersproject/contracts": 5.7.0 - "@ethersproject/providers": 5.7.2 - "@react-native-community/netinfo": 11.4.1 - "@react-navigation/core": 6.2.2 - "@sentry/core": 7.80.0 - "@sentry/react": 7.80.0 - "@sentry/types": 7.80.0 - "@testing-library/react-hooks": 8.0.1 - "@types/chrome": 0.0.254 - "@types/react": 18.3.18 - "@types/uuid": 9.0.1 - "@uniswap/analytics": 1.7.0 - "@uniswap/analytics-events": 2.41.0 - "@uniswap/eslint-config": "workspace:^" - "@uniswap/sdk-core": 7.5.0 - aws-appsync-auth-link: 3.0.7 - aws-appsync-subscription-link: 3.1.3 - dayjs: 1.11.7 - eslint: 8.44.0 - expo-localization: 16.0.0 - graphql: 16.6.0 - jest: 29.7.0 - jest-chrome: 0.8.0 - jsbi: 3.2.5 - promise: 8.3.0 - react: 18.3.1 - react-native: 0.76.6 - react-native-device-info: 10.0.2 - react-test-renderer: 18.3.1 - redux: 4.2.1 - subscriptions-transport-ws: 0.11.0 - typescript: 5.3.3 - uuid: 9.0.0 - zen-observable-ts: 1.2.5 - languageName: unknown - linkType: soft - -"utils-merge@npm:1.0.1": - version: 1.0.1 - resolution: "utils-merge@npm:1.0.1" - checksum: c81095493225ecfc28add49c106ca4f09cdf56bc66731aa8dabc2edbbccb1e1bfe2de6a115e5c6a380d3ea166d1636410b62ef216bb07b3feb1cfde1d95d5080 +"quick-temp@npm:^0.1.8": + version: 0.1.8 + resolution: "quick-temp@npm:0.1.8" + dependencies: + mktemp: ~0.4.0 + rimraf: ^2.5.4 + underscore.string: ~3.3.4 + checksum: b9a60934301afd5cb67a10946f8124e63ccb0cd305d35e2d8e5fe7be80df4d29b8414605ee1e55a714c3b87468856fa92526737569fc5e4a11e056ee192b72c8 languageName: node linkType: hard -"uuid@npm:9.0.0": - version: 9.0.0 - resolution: "uuid@npm:9.0.0" +"rc@npm:1.2.8, rc@npm:^1.2.8": + version: 1.2.8 + resolution: "rc@npm:1.2.8" + dependencies: + deep-extend: ^0.6.0 + ini: ~1.3.0 + minimist: ^1.2.0 + strip-json-comments: ~2.0.1 bin: - uuid: dist/bin/uuid - checksum: 8dd2c83c43ddc7e1c71e36b60aea40030a6505139af6bee0f382ebcd1a56f6cd3028f7f06ffb07f8cf6ced320b76aea275284b224b002b289f89fe89c389b028 + rc: ./cli.js + checksum: 2e26e052f8be2abd64e6d1dabfbd7be03f80ec18ccbc49562d31f617d0015fbdbcf0f9eed30346ea6ab789e0fdfe4337f033f8016efdbee0df5354751842080e languageName: node linkType: hard -"uuid@npm:^10.0.0": - version: 10.0.0 - resolution: "uuid@npm:10.0.0" - bin: - uuid: dist/bin/uuid - checksum: 4b81611ade2885d2313ddd8dc865d93d8dccc13ddf901745edca8f86d99bc46d7a330d678e7532e7ebf93ce616679fb19b2e3568873ac0c14c999032acb25869 +"read-pkg-up@npm:^7.0.1": + version: 7.0.1 + resolution: "read-pkg-up@npm:7.0.1" + dependencies: + find-up: ^4.1.0 + read-pkg: ^5.2.0 + type-fest: ^0.8.1 + checksum: e4e93ce70e5905b490ca8f883eb9e48b5d3cebc6cd4527c25a0d8f3ae2903bd4121c5ab9c5a3e217ada0141098eeb661313c86fa008524b089b8ed0b7f165e44 languageName: node linkType: hard -"uuid@npm:^3.3.2": - version: 3.4.0 - resolution: "uuid@npm:3.4.0" - bin: - uuid: ./bin/uuid - checksum: 58de2feed61c59060b40f8203c0e4ed7fd6f99d42534a499f1741218a1dd0c129f4aa1de797bcf822c8ea5da7e4137aa3673431a96dae729047f7aca7b27866f +"read-pkg@npm:^5.2.0": + version: 5.2.0 + resolution: "read-pkg@npm:5.2.0" + dependencies: + "@types/normalize-package-data": ^2.4.0 + normalize-package-data: ^2.5.0 + parse-json: ^5.0.0 + type-fest: ^0.6.0 + checksum: eb696e60528b29aebe10e499ba93f44991908c57d70f2d26f369e46b8b9afc208ef11b4ba64f67630f31df8b6872129e0a8933c8c53b7b4daf0eace536901222 languageName: node linkType: hard -"uuid@npm:^7.0.3": - version: 7.0.3 - resolution: "uuid@npm:7.0.3" - bin: - uuid: dist/bin/uuid - checksum: f5b7b5cc28accac68d5c083fd51cca64896639ebd4cca88c6cfb363801aaa83aa439c86dfc8446ea250a7a98d17afd2ad9e88d9d4958c79a412eccb93bae29de +"read-yaml-file@npm:2.1.0": + version: 2.1.0 + resolution: "read-yaml-file@npm:2.1.0" + dependencies: + js-yaml: ^4.0.0 + strip-bom: ^4.0.0 + checksum: 52765eb183e79466f51eebeb19b933cc0f0e907052d062d67300b97e79910064a24b370cdb0b5dd8b05afff3d0ec57282670fd9070dc608e13b11820ac79183d languageName: node linkType: hard -"uuid@npm:^8.0.0, uuid@npm:^8.3.2": - version: 8.3.2 - resolution: "uuid@npm:8.3.2" - bin: - uuid: dist/bin/uuid - checksum: 5575a8a75c13120e2f10e6ddc801b2c7ed7d8f3c8ac22c7ed0c7b2ba6383ec0abda88c905085d630e251719e0777045ae3236f04c812184b7c765f63a70e58df +"read-yaml-file@npm:^1.1.0": + version: 1.1.0 + resolution: "read-yaml-file@npm:1.1.0" + dependencies: + graceful-fs: ^4.1.5 + js-yaml: ^3.6.1 + pify: ^4.0.1 + strip-bom: ^3.0.0 + checksum: 41ee5f075507ef0403328dd54e225a61c3149f915675ce7fd0fd791ddcce2e6c30a9fe0f76ffa7a465c1c157b9b4ad8ded1dcf47dc3b396103eeb013490bbc2e languageName: node linkType: hard -"uuid@npm:^9.0.0, uuid@npm:^9.0.1": - version: 9.0.1 - resolution: "uuid@npm:9.0.1" - bin: - uuid: dist/bin/uuid - checksum: 39931f6da74e307f51c0fb463dc2462807531dc80760a9bff1e35af4316131b4fc3203d16da60ae33f07fdca5b56f3f1dd662da0c99fea9aaeab2004780cc5f4 +"readable-stream@npm:3, readable-stream@npm:^3.0.0": + version: 3.6.2 + resolution: "readable-stream@npm:3.6.2" + dependencies: + inherits: ^2.0.3 + string_decoder: ^1.1.1 + util-deprecate: ^1.0.1 + checksum: bdcbe6c22e846b6af075e32cf8f4751c2576238c5043169a1c221c92ee2878458a816a4ea33f4c67623c0b6827c8a400409bfb3cf0bf3381392d0b1dfb52ac8d languageName: node linkType: hard -"v8-compile-cache-lib@npm:^3.0.1": - version: 3.0.1 - resolution: "v8-compile-cache-lib@npm:3.0.1" - checksum: 78089ad549e21bcdbfca10c08850022b22024cdcc2da9b168bcf5a73a6ed7bf01a9cebb9eac28e03cd23a684d81e0502797e88f3ccd27a32aeab1cfc44c39da0 +"readable-stream@npm:^2.0.0, readable-stream@npm:^2.0.1, readable-stream@npm:^2.0.5, readable-stream@npm:^2.1.5, readable-stream@npm:^2.3.3, readable-stream@npm:^2.3.5, readable-stream@npm:^2.3.6, readable-stream@npm:~2.3.6": + version: 2.3.8 + resolution: "readable-stream@npm:2.3.8" + dependencies: + core-util-is: ~1.0.0 + inherits: ~2.0.3 + isarray: ~1.0.0 + process-nextick-args: ~2.0.0 + safe-buffer: ~5.1.1 + string_decoder: ~1.1.1 + util-deprecate: ~1.0.1 + checksum: 65645467038704f0c8aaf026a72fbb588a9e2ef7a75cd57a01702ee9db1c4a1e4b03aaad36861a6a0926546a74d174149c8c207527963e0c2d3eee2f37678a42 languageName: node linkType: hard -"v8-to-istanbul@npm:^9.0.1": - version: 9.0.1 - resolution: "v8-to-istanbul@npm:9.0.1" +"readdirp@npm:^3.6.0": + version: 3.6.0 + resolution: "readdirp@npm:3.6.0" dependencies: - "@jridgewell/trace-mapping": ^0.3.12 - "@types/istanbul-lib-coverage": ^2.0.1 - convert-source-map: ^1.6.0 - checksum: a49c34bf0a3af0c11041a3952a2600913904a983bd1bc87148b5c033bc5c1d02d5a13620fcdbfa2c60bc582a2e2970185780f0c844b4c3a220abf405f8af6311 + picomatch: ^2.2.1 + checksum: 1ced032e6e45670b6d7352d71d21ce7edf7b9b928494dcaba6f11fba63180d9da6cd7061ebc34175ffda6ff529f481818c962952004d273178acd70f7059b320 languageName: node linkType: hard -"validate-npm-package-license@npm:^3.0.1": - version: 3.0.4 - resolution: "validate-npm-package-license@npm:3.0.4" +"readline-sync@npm:^1.4.9": + version: 1.4.10 + resolution: "readline-sync@npm:1.4.10" + checksum: 4dbd8925af028dc4cb1bb813f51ca3479035199aa5224886b560eec8e768ab27d7ebf11d69a67ed93d5a130b7c994f0bdb77796326e563cf928bbfd560e3747e + languageName: node + linkType: hard + +"rechoir@npm:^0.6.2": + version: 0.6.2 + resolution: "rechoir@npm:0.6.2" dependencies: - spdx-correct: ^3.0.0 - spdx-expression-parse: ^3.0.0 - checksum: 35703ac889d419cf2aceef63daeadbe4e77227c39ab6287eeb6c1b36a746b364f50ba22e88591f5d017bc54685d8137bc2d328d0a896e4d3fd22093c0f32a9ad + resolve: ^1.1.6 + checksum: fe76bf9c21875ac16e235defedd7cbd34f333c02a92546142b7911a0f7c7059d2e16f441fe6fb9ae203f459c05a31b2bcf26202896d89e390eda7514d5d2702b languageName: node linkType: hard -"validate-npm-package-name@npm:^3.0.0": +"redent@npm:^3.0.0": version: 3.0.0 - resolution: "validate-npm-package-name@npm:3.0.0" + resolution: "redent@npm:3.0.0" dependencies: - builtins: ^1.0.3 - checksum: ce4c68207abfb22c05eedb09ff97adbcedc80304a235a0844f5344f1fd5086aa80e4dbec5684d6094e26e35065277b765c1caef68bcea66b9056761eddb22967 + indent-string: ^4.0.0 + strip-indent: ^3.0.0 + checksum: fa1ef20404a2d399235e83cc80bd55a956642e37dd197b4b612ba7327bf87fa32745aeb4a1634b2bab25467164ab4ed9c15be2c307923dd08b0fe7c52431ae6b languageName: node linkType: hard -"validate-npm-package-name@npm:^5.0.0": - version: 5.0.1 - resolution: "validate-npm-package-name@npm:5.0.1" - checksum: 0d583a1af23aeffea7748742cf22b6802458736fb8b60323ba5949763824d46f796474b0e1b9206beb716f9d75269e19dbd7795d6b038b29d561be95dd827381 +"regenerator-runtime@npm:^0.13.9": + version: 0.13.11 + resolution: "regenerator-runtime@npm:0.13.11" + checksum: 27481628d22a1c4e3ff551096a683b424242a216fee44685467307f14d58020af1e19660bf2e26064de946bad7eff28950eae9f8209d55723e2d9351e632bbb4 languageName: node linkType: hard -"valtio@npm:1.11.2": - version: 1.11.2 - resolution: "valtio@npm:1.11.2" - dependencies: - proxy-compare: 2.5.1 - use-sync-external-store: 1.2.0 - peerDependencies: - "@types/react": ">=16.8" - react: ">=16.8" - peerDependenciesMeta: - "@types/react": - optional: true - react: - optional: true - checksum: cce2d9212aac9fc4bdeba2d381188cc831cfe8d2d03039024cfcd58ba1801f2a5b14d01c2bb21a2c9f12046d2ede64f1dd887175185f39bee553677a35592c30 +"regenerator-runtime@npm:^0.14.0": + version: 0.14.0 + resolution: "regenerator-runtime@npm:0.14.0" + checksum: 1c977ad82a82a4412e4f639d65d22be376d3ebdd30da2c003eeafdaaacd03fc00c2320f18120007ee700900979284fc78a9f00da7fb593f6e6eeebc673fba9a3 languageName: node linkType: hard -"value-or-function@npm:^3.0.0": - version: 3.0.0 - resolution: "value-or-function@npm:3.0.0" - checksum: 2b901d05b82deb8565d4edeba02e0737be73e7fb2c640b79fa64152aae8b450f790a46c86bf7039f91938c1b69d2cc0908cd18c4695b120293bb442179061fac +"registry-auth-token@npm:^4.0.0": + version: 4.2.2 + resolution: "registry-auth-token@npm:4.2.2" + dependencies: + rc: 1.2.8 + checksum: c5030198546ecfdcbcb0722cbc3e260c4f5f174d8d07bdfedd4620e79bfdf17a2db735aa230d600bd388fce6edd26c0a9ed2eb7e9b4641ec15213a28a806688b languageName: node linkType: hard -"value-or-promise@npm:^1.0.11, value-or-promise@npm:^1.0.12": - version: 1.0.12 - resolution: "value-or-promise@npm:1.0.12" - checksum: f53a66c75b7447c90bbaf946a757ca09c094629cb80ba742f59c980ec3a69be0a385a0e75505dedb4e757862f1a994ca4beaf083a831f24d3ffb3d4bb18cd1e1 +"registry-url@npm:^5.0.0": + version: 5.1.0 + resolution: "registry-url@npm:5.1.0" + dependencies: + rc: ^1.2.8 + checksum: bcea86c84a0dbb66467b53187fadebfea79017cddfb4a45cf27530d7275e49082fe9f44301976eb0164c438e395684bcf3dae4819b36ff9d1640d8cc60c73df9 languageName: node linkType: hard -"varint@npm:^5.0.2": - version: 5.0.2 - resolution: "varint@npm:5.0.2" - checksum: e1a66bf9a6cea96d1f13259170d4d41b845833acf3a9df990ea1e760d279bd70d5b1f4c002a50197efd2168a2fd43eb0b808444600fd4d23651e8d42fe90eb05 +"remove-bom-buffer@npm:^3.0.0": + version: 3.0.0 + resolution: "remove-bom-buffer@npm:3.0.0" + dependencies: + is-buffer: ^1.1.5 + is-utf8: ^0.2.1 + checksum: e508fd92e5c7b210123485a366b00bb46fe15ef2c23ae90b05cd365bbfeede429ae70f32bce150fc6467e53c921bc0d9a5c7e33d865009c99603f9fbf7c8b7ae languageName: node linkType: hard -"vary@npm:~1.1.2": - version: 1.1.2 - resolution: "vary@npm:1.1.2" - checksum: ae0123222c6df65b437669d63dfa8c36cee20a504101b2fcd97b8bf76f91259c17f9f2b4d70a1e3c6bbcee7f51b28392833adb6b2770b23b01abec84e369660b +"remove-bom-stream@npm:^1.2.0": + version: 1.2.0 + resolution: "remove-bom-stream@npm:1.2.0" + dependencies: + remove-bom-buffer: ^3.0.0 + safe-buffer: ^5.1.0 + through2: ^2.0.3 + checksum: 32533fa1925a753cfeb352efe7f01c4171de992275e39f66672752669a457d6cdaaa1c9fd41a25b0e54cd6c0db4987a01a2593c01680a6d5e7b5076d27540786 languageName: node linkType: hard -"verror@npm:1.10.0": - version: 1.10.0 - resolution: "verror@npm:1.10.0" - dependencies: - assert-plus: ^1.0.0 - core-util-is: 1.0.2 - extsprintf: ^1.2.0 - checksum: c431df0bedf2088b227a4e051e0ff4ca54df2c114096b0c01e1cbaadb021c30a04d7dd5b41ab277bcd51246ca135bf931d4c4c796ecae7a4fef6d744ecef36ea +"remove-trailing-separator@npm:^1.0.1, remove-trailing-separator@npm:^1.1.0": + version: 1.1.0 + resolution: "remove-trailing-separator@npm:1.1.0" + checksum: d3c20b5a2d987db13e1cca9385d56ecfa1641bae143b620835ac02a6b70ab88f68f117a0021838db826c57b31373d609d52e4f31aca75fc490c862732d595419 languageName: node linkType: hard -"vfile-location@npm:^2.0.0": - version: 2.0.6 - resolution: "vfile-location@npm:2.0.6" - checksum: ca0da908fdcd86f3df749a328ff777cf8994240eb333da7e6ee270b4fec09058d7b64f174ce9e31a9c591bb9ed01b45c223186a31036860d9f463eca059c058e +"replace-ext@npm:^1.0.0": + version: 1.0.1 + resolution: "replace-ext@npm:1.0.1" + checksum: 4994ea1aaa3d32d152a8d98ff638988812c4fa35ba55485630008fe6f49e3384a8a710878e6fd7304b42b38d1b64c1cd070e78ece411f327735581a79dd88571 languageName: node linkType: hard -"vfile-message@npm:^1.0.0": - version: 1.1.1 - resolution: "vfile-message@npm:1.1.1" - dependencies: - unist-util-stringify-position: ^1.1.1 - checksum: 0be85d2c9bf00aa3e065cd284a705c4143fe65004d2927d20e3f06aa7ff77038008a38704c6f60519362e3a413c9fe86e4c770e3ecf3bff6b7d604ade9ecf4ff +"replace-ext@npm:^2.0.0": + version: 2.0.0 + resolution: "replace-ext@npm:2.0.0" + checksum: ed640ac90d24cce4be977642847d138908d430049cc097633be33b072143515cc7d29699675a0c35f6dc3c3c73cb529ed352d59649cf15931740eb31ae083c1e languageName: node linkType: hard -"vfile@npm:^2.0.0": - version: 2.3.0 - resolution: "vfile@npm:2.3.0" - dependencies: - is-buffer: ^1.1.4 - replace-ext: 1.0.0 - unist-util-stringify-position: ^1.0.0 - vfile-message: ^1.0.0 - checksum: 59f1be789f0a9bfeca45a8bddbd17b3280002c8b8fd4674cde7f632196201973f7e641cd25d3cd1099977d95395db50b4a3dede39ad0ed774ca3d4894b08feb8 +"require-directory@npm:^2.1.1": + version: 2.1.1 + resolution: "require-directory@npm:2.1.1" + checksum: fb47e70bf0001fdeabdc0429d431863e9475e7e43ea5f94ad86503d918423c1543361cc5166d713eaa7029dd7a3d34775af04764bebff99ef413111a5af18c80 languageName: node linkType: hard -"video-extensions@npm:1.2.0": - version: 1.2.0 - resolution: "video-extensions@npm:1.2.0" - checksum: bc8be852095c89ecf458cb7c05d76941503950a133a17638f08e20a68ff413df21af7ad0a0ef26fcee9c054c7b993e2921c192bdd046178c487074baeead2af1 +"require-from-string@npm:^2.0.2": + version: 2.0.2 + resolution: "require-from-string@npm:2.0.2" + checksum: a03ef6895445f33a4015300c426699bc66b2b044ba7b670aa238610381b56d3f07c686251740d575e22f4c87531ba662d06937508f0f3c0f1ddc04db3130560b languageName: node linkType: hard -"viem@npm:2.21.51": - version: 2.21.51 - resolution: "viem@npm:2.21.51" - dependencies: - "@noble/curves": 1.6.0 - "@noble/hashes": 1.5.0 - "@scure/bip32": 1.5.0 - "@scure/bip39": 1.4.0 - abitype: 1.0.6 - isows: 1.0.6 - ox: 0.1.2 - webauthn-p256: 0.0.10 - ws: 8.18.0 - peerDependencies: - typescript: ">=5.0.4" - peerDependenciesMeta: - typescript: - optional: true - checksum: 8f3ae4cacdbba57bc804240be1c9b602959b7022e435c2594fe26d704932009715fb2e2322a9a8c9d3a0ffbea6cf9f5d9d8db448e98fb56d23104d38d13ce3d5 +"require-package-name@npm:^2.0.1": + version: 2.0.1 + resolution: "require-package-name@npm:2.0.1" + checksum: 00f4e9e467ebe2bbced2b4198a165de11c83b5ee9f4c20b05a8782659b92bcb544dbd50be9a3eed746d05ecd875453e258c079eb3a79604b50a27cf8ab0798b5 languageName: node linkType: hard -"vinyl-fs@npm:^3.0.2": - version: 3.0.3 - resolution: "vinyl-fs@npm:3.0.3" - dependencies: - fs-mkdirp-stream: ^1.0.0 - glob-stream: ^6.1.0 - graceful-fs: ^4.0.0 - is-valid-glob: ^1.0.0 - lazystream: ^1.0.0 - lead: ^1.0.0 - object.assign: ^4.0.4 - pumpify: ^1.3.5 - readable-stream: ^2.3.3 - remove-bom-buffer: ^3.0.0 - remove-bom-stream: ^1.2.0 - resolve-options: ^1.1.0 - through2: ^2.0.0 - to-through: ^2.0.0 - value-or-function: ^3.0.0 - vinyl: ^2.0.0 - vinyl-sourcemap: ^1.1.0 - checksum: 948366325994e13e331bc559ac38d10bff9469eeb227e627cc903cb7580c73779158c7b25dd7ac416df2fc261cdd5341896e680c086de693de71420ccbdb9cd5 +"resolve-alpn@npm:^1.0.0": + version: 1.2.1 + resolution: "resolve-alpn@npm:1.2.1" + checksum: f558071fcb2c60b04054c99aebd572a2af97ef64128d59bef7ab73bd50d896a222a056de40ffc545b633d99b304c259ea9d0c06830d5c867c34f0bfa60b8eae0 languageName: node linkType: hard -"vinyl-sourcemap@npm:^1.1.0": - version: 1.1.0 - resolution: "vinyl-sourcemap@npm:1.1.0" +"resolve-dir@npm:^1.0.0, resolve-dir@npm:^1.0.1": + version: 1.0.1 + resolution: "resolve-dir@npm:1.0.1" dependencies: - append-buffer: ^1.0.2 - convert-source-map: ^1.5.0 - graceful-fs: ^4.1.6 - normalize-path: ^2.1.1 - now-and-later: ^2.0.0 - remove-bom-buffer: ^3.0.0 - vinyl: ^2.0.0 - checksum: e7174851faff44ffd0f91d4d7234a0c153cad7da9c142e5ef46b4a24fe5ab0c98c997db7c719919cbab28edb4b9cf9ec3d7fed8460f047b3d640740a613ec944 + expand-tilde: ^2.0.0 + global-modules: ^1.0.0 + checksum: ef736b8ed60d6645c3b573da17d329bfb50ec4e1d6c5ffd6df49e3497acef9226f9810ea6823b8ece1560e01dcb13f77a9f6180d4f242d00cc9a8f4de909c65c languageName: node linkType: hard -"vinyl@npm:^2.0.0": - version: 2.2.1 - resolution: "vinyl@npm:2.2.1" - dependencies: - clone: ^2.1.1 - clone-buffer: ^1.0.0 - clone-stats: ^1.0.0 - cloneable-readable: ^1.0.0 - remove-trailing-separator: ^1.0.1 - replace-ext: ^1.0.0 - checksum: 1f663973f1362f2d074b554f79ff7673187667082373b3d3e628beb1fc2a7ff33024f10b492fbd8db421a09ea3b7b22c3d3de4a0f0e73ead7b4685af570b906f +"resolve-from@npm:5.0.0, resolve-from@npm:^5.0.0": + version: 5.0.0 + resolution: "resolve-from@npm:5.0.0" + checksum: 4ceeb9113e1b1372d0cd969f3468fa042daa1dd9527b1b6bb88acb6ab55d8b9cd65dbf18819f9f9ddf0db804990901dcdaade80a215e7b2c23daae38e64f5bdf languageName: node linkType: hard -"vinyl@npm:~3.0.0": - version: 3.0.0 - resolution: "vinyl@npm:3.0.0" - dependencies: - clone: ^2.1.2 - clone-stats: ^1.0.0 - remove-trailing-separator: ^1.1.0 - replace-ext: ^2.0.0 - teex: ^1.0.1 - checksum: 29c563d6a027d49ec216bc8259b494bd048d1f9df39103aea6877e02af1d0a6956b11ad977206b5a807b331ef5431bed9f6b8890de5e55188389d31cf7af7fbe +"resolve-from@npm:^4.0.0": + version: 4.0.0 + resolution: "resolve-from@npm:4.0.0" + checksum: f4ba0b8494846a5066328ad33ef8ac173801a51739eb4d63408c847da9a2e1c1de1e6cbbf72699211f3d13f8fc1325648b169bd15eb7da35688e30a5fb0e4a7f languageName: node linkType: hard -"vite-node@npm:^0.28.5": - version: 0.28.5 - resolution: "vite-node@npm:0.28.5" +"resolve-global@npm:1.0.0, resolve-global@npm:^1.0.0": + version: 1.0.0 + resolution: "resolve-global@npm:1.0.0" dependencies: - cac: ^6.7.14 - debug: ^4.3.4 - mlly: ^1.1.0 - pathe: ^1.1.0 - picocolors: ^1.0.0 - source-map: ^0.6.1 - source-map-support: ^0.5.21 - vite: ^3.0.0 || ^4.0.0 - bin: - vite-node: vite-node.mjs - checksum: b3813b784f551613e561bf85e64ceb8e869d760d34f135dc3351b093618c6fc3c64f23839ac530ddc49724beb83c3f70ee6392e62676c78141ed04c7ab1e0aa0 + global-dirs: ^0.1.1 + checksum: c4e11d33e84bde7516b824503ffbe4b6cce863d5ce485680fd3db997b7c64da1df98321b1fd0703b58be8bc9bc83bc96bd83043f96194386b45eb47229efb6b6 languageName: node linkType: hard -"vite@npm:^3.0.0 || ^4.0.0, vite@npm:^4.1.4": - version: 4.5.0 - resolution: "vite@npm:4.5.0" +"resolve-options@npm:^1.1.0": + version: 1.1.0 + resolution: "resolve-options@npm:1.1.0" dependencies: - esbuild: ^0.18.10 - fsevents: ~2.3.2 - postcss: ^8.4.27 - rollup: ^3.27.1 - peerDependencies: - "@types/node": ">= 14" - less: "*" - lightningcss: ^1.21.0 - sass: "*" - stylus: "*" - sugarss: "*" - terser: ^5.4.0 - dependenciesMeta: - fsevents: - optional: true - peerDependenciesMeta: - "@types/node": - optional: true - less: - optional: true - lightningcss: - optional: true - sass: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - bin: - vite: bin/vite.js - checksum: 06f1a4c858e4dc4c04a10466f4ccacea30c5a9f8574e5ba3deb9d03fa20e80ca6797f02dad97a988da7cdef96238dbc69c3b6a538156585c74722d996223619e + value-or-function: ^3.0.0 + checksum: 437813d9418b49e52c367b980b6b48b3ea1ea39105aac97c39f104724abb6cda224ed92ebf12499cf00993589d38c8195eb2be730d0ba8b45df9bdf7cec65b33 languageName: node linkType: hard -"vlq@npm:^1.0.0": - version: 1.0.1 - resolution: "vlq@npm:1.0.1" - checksum: 67ab6dd35c787eaa02c0ff1a869dd07a230db08722fb6014adaaf432634808ddb070765f70958b47997e438c331790cfcf20902411b0d6453f1a2a5923522f55 +"resolve@npm:1.22.4": + version: 1.22.4 + resolution: "resolve@npm:1.22.4" + dependencies: + is-core-module: ^2.13.0 + path-parse: ^1.0.7 + supports-preserve-symlinks-flag: ^1.0.0 + bin: + resolve: bin/resolve + checksum: 23f25174c2736ce24c6d918910e0d1f89b6b38fefa07a995dff864acd7863d59a7f049e691f93b4b2ee29696303390d921552b6d1b841ed4a8101f517e1d0124 languageName: node linkType: hard -"vm-browserify@npm:^1.1.2": - version: 1.1.2 - resolution: "vm-browserify@npm:1.1.2" - checksum: 10a1c50aab54ff8b4c9042c15fc64aefccce8d2fb90c0640403242db0ee7fb269f9b102bdb69cfb435d7ef3180d61fd4fb004a043a12709abaf9056cfd7e039d +"resolve@patch:resolve@npm%3A1.22.4#~builtin": + version: 1.22.4 + resolution: "resolve@patch:resolve@npm%3A1.22.4#~builtin::version=1.22.4&hash=07638b" + dependencies: + is-core-module: ^2.13.0 + path-parse: ^1.0.7 + supports-preserve-symlinks-flag: ^1.0.0 + bin: + resolve: bin/resolve + checksum: c45f2545fdc4d21883861b032789e20aa67a2f2692f68da320cc84d5724cd02f2923766c5354b3210897e88f1a7b3d6d2c7c22faeead8eed7078e4c783a444bc languageName: node linkType: hard -"void-elements@npm:3.1.0": - version: 3.1.0 - resolution: "void-elements@npm:3.1.0" - checksum: 0390f818107fa8fce55bb0a5c3f661056001c1d5a2a48c28d582d4d847347c2ab5b7f8272314cac58acf62345126b6b09bea623a185935f6b1c3bbce0dfd7f7f +"responselike@npm:^1.0.2": + version: 1.0.2 + resolution: "responselike@npm:1.0.2" + dependencies: + lowercase-keys: ^1.0.0 + checksum: 2e9e70f1dcca3da621a80ce71f2f9a9cad12c047145c6ece20df22f0743f051cf7c73505e109814915f23f9e34fb0d358e22827723ee3d56b623533cab8eafcd languageName: node linkType: hard -"vue-template-compiler@npm:^2.6.11": - version: 2.6.14 - resolution: "vue-template-compiler@npm:2.6.14" +"responselike@npm:^2.0.0": + version: 2.0.1 + resolution: "responselike@npm:2.0.1" dependencies: - de-indent: ^1.0.2 - he: ^1.1.0 - checksum: 0d03f804ac97e26629c78219929596cfd98f522e1f13b16dd42f13e3fff09b85fb8252ef3486e9d62ca7993f576386f587e760df0506230fa87141fdac8275ea + lowercase-keys: ^2.0.0 + checksum: b122535466e9c97b55e69c7f18e2be0ce3823c5d47ee8de0d9c0b114aa55741c6db8bfbfce3766a94d1272e61bfb1ebf0a15e9310ac5629fbb7446a861b4fd3a languageName: node linkType: hard -"w-json@npm:1.3.10, w-json@npm:^1.3.10": - version: 1.3.10 - resolution: "w-json@npm:1.3.10" - checksum: 8535a207e579e616797efc4d5140acc7c0aefd11f0c9f846e6739816a2db8637d235492d86fc5c47bb2dba5821413d72b2d62df9184ee9d6e22e67b3f90d205b +"retry@npm:0.12.0": + version: 0.12.0 + resolution: "retry@npm:0.12.0" + checksum: 623bd7d2e5119467ba66202d733ec3c2e2e26568074923bc0585b6b99db14f357e79bdedb63cab56cec47491c4a0da7e6021a7465ca6dc4f481d3898fdd3158c languageName: node linkType: hard -"w3c-xmlserializer@npm:^4.0.0": - version: 4.0.0 - resolution: "w3c-xmlserializer@npm:4.0.0" - dependencies: - xml-name-validator: ^4.0.0 - checksum: eba070e78deb408ae8defa4d36b429f084b2b47a4741c4a9be3f27a0a3d1845e277e3072b04391a138f7e43776842627d1334e448ff13ff90ad9fb1214ee7091 +"reusify@npm:^1.0.4": + version: 1.0.4 + resolution: "reusify@npm:1.0.4" + checksum: c3076ebcc22a6bc252cb0b9c77561795256c22b757f40c0d8110b1300723f15ec0fc8685e8d4ea6d7666f36c79ccc793b1939c748bf36f18f542744a4e379fcc languageName: node linkType: hard -"wagmi@npm:2.9.3": - version: 2.9.3 - resolution: "wagmi@npm:2.9.3" +"rimraf@npm:^2.5.4": + version: 2.7.1 + resolution: "rimraf@npm:2.7.1" dependencies: - "@wagmi/connectors": 5.0.2 - "@wagmi/core": 2.10.2 - use-sync-external-store: 1.2.0 - peerDependencies: - "@tanstack/react-query": ">=5.0.0" - react: ">=18" - typescript: ">=5.0.4" - viem: 2.x - peerDependenciesMeta: - typescript: - optional: true - checksum: 56460173fddce5e81427d17e464a2fc5ca019c983fd9812252196f559273ecd289ffff17202a0df734d29209bb4beb6146c4411888d2d8f5a6e74b108579e00e + glob: ^7.1.3 + bin: + rimraf: ./bin.js + checksum: cdc7f6eacb17927f2a075117a823e1c5951792c6498ebcce81ca8203454a811d4cf8900314154d3259bb8f0b42ab17f67396a8694a54cae3283326e57ad250cd languageName: node linkType: hard -"wait-on@npm:7.0.1": - version: 7.0.1 - resolution: "wait-on@npm:7.0.1" +"rimraf@npm:^3.0.2": + version: 3.0.2 + resolution: "rimraf@npm:3.0.2" dependencies: - axios: ^0.27.2 - joi: ^17.7.0 - lodash: ^4.17.21 - minimist: ^1.2.7 - rxjs: ^7.8.0 + glob: ^7.1.3 bin: - wait-on: bin/wait-on - checksum: 1e8a17d8ee6436f71d3ab82781ce31267481fcd7bbccde49b0f8124871e6e40a1acac3401f04f775ba6203853a5813352fa131620fc139914351f3b2894d573f + rimraf: bin.js + checksum: 87f4164e396f0171b0a3386cc1877a817f572148ee13a7e113b238e48e8a9f2f31d009a92ec38a591ff1567d9662c6b67fd8818a2dbbaed74bc26a87a2a4a9a0 languageName: node linkType: hard -"walk-sync@npm:^2.2.0": - version: 2.2.0 - resolution: "walk-sync@npm:2.2.0" - dependencies: - "@types/minimatch": ^3.0.3 - ensure-posix-path: ^1.1.0 - matcher-collection: ^2.0.0 - minimatch: ^3.0.4 - checksum: e579b574f769977a739607d4feba40ded8931ff641f26964ea5a10a280d648d1c1aca260e9ab60288f16d69500ff33687d3ba5fa4dbd427090123189f0f0c9b6 +"rsvp@npm:^4.8.2": + version: 4.8.5 + resolution: "rsvp@npm:4.8.5" + checksum: 2d8ef30d8febdf05bdf856ccca38001ae3647e41835ca196bc1225333f79b94ae44def733121ca549ccc36209c9b689f6586905e2a043873262609744da8efc1 languageName: node linkType: hard -"walkdir@npm:^0.4.1": - version: 0.4.1 - resolution: "walkdir@npm:0.4.1" - checksum: 71045c21dc19aae3321f897b6e9e507cf8039202665c35a0b908eecccaf25636aab769b31cbd61ef8267237fe22fc316923a691ecc2d9d38840a15c59c0f2594 +"rsvp@npm:~3.2.1": + version: 3.2.1 + resolution: "rsvp@npm:3.2.1" + checksum: e2ac49cbe35b8c2701b07698066d7cd8004115b070f3352d45759dfcd820fa57e687230331ba41f5a40e1871789cbf122de6e73559598777a0b18b66953dc09b languageName: node linkType: hard -"walker@npm:^1.0.7, walker@npm:^1.0.8": - version: 1.0.8 - resolution: "walker@npm:1.0.8" +"run-parallel@npm:^1.1.9": + version: 1.2.0 + resolution: "run-parallel@npm:1.2.0" dependencies: - makeerror: 1.0.12 - checksum: ad7a257ea1e662e57ef2e018f97b3c02a7240ad5093c392186ce0bcf1f1a60bbadd520d073b9beb921ed99f64f065efb63dfc8eec689a80e569f93c1c5d5e16c + queue-microtask: ^1.2.2 + checksum: cb4f97ad25a75ebc11a8ef4e33bb962f8af8516bb2001082ceabd8902e15b98f4b84b4f8a9b222e5d57fc3bd1379c483886ed4619367a7680dad65316993021d languageName: node linkType: hard -"wallet@workspace:^, wallet@workspace:packages/wallet": - version: 0.0.0-use.local - resolution: "wallet@workspace:packages/wallet" - dependencies: - "@apollo/client": 3.10.4 - "@ethersproject/abstract-signer": 5.7.0 - "@ethersproject/constants": 5.7.0 - "@ethersproject/contracts": 5.7.0 - "@ethersproject/providers": 5.7.2 - "@faker-js/faker": 7.6.0 - "@gorhom/bottom-sheet": 4.6.4 - "@react-native-firebase/app": 21.0.0 - "@react-native-firebase/app-check": 21.0.0 - "@react-navigation/core": 6.2.2 - "@redux-saga/core": 1.2.3 - "@reduxjs/toolkit": 1.9.3 - "@scure/bip32": 1.3.2 - "@shopify/flash-list": 1.7.1 - "@testing-library/react-native": 13.0.0 - "@types/react": 18.3.18 - "@types/zxcvbn": 4.4.2 - "@uniswap/analytics-events": 2.41.0 - "@uniswap/eslint-config": "workspace:^" - "@uniswap/permit2-sdk": 1.3.0 - "@uniswap/router-sdk": 1.22.1 - "@uniswap/sdk-core": 7.5.0 - "@uniswap/uniswapx-sdk": 3.0.0-beta.3 - "@uniswap/universal-router-sdk": 4.17.0 - "@uniswap/v3-sdk": 3.24.0 - apollo3-cache-persist: 0.14.1 - axios: 1.6.5 - dayjs: 1.11.7 - depcheck: 1.4.7 - eslint: 8.44.0 - ethers: 5.7.2 - expo-web-browser: 13.0.3 - fuse.js: 6.5.3 - graphql: 16.6.0 - i18next: 23.10.0 - jest: 29.7.0 - jest-extended: 4.0.2 - jest-presets: "workspace:^" - jsbi: 3.2.5 - lodash: 4.17.21 - mockdate: 3.0.5 - no-yolo-signatures: 0.0.2 - react: 18.3.1 - react-i18next: 14.1.0 - react-native: 0.76.6 - react-native-context-menu-view: 1.15.0 - react-native-fast-image: 8.6.3 - react-native-gesture-handler: 2.21.2 - react-native-image-picker: 7.1.0 - react-native-localize: 2.2.6 - react-native-reanimated: 3.16.7 - react-native-restart: 0.0.27 - react-native-svg: 15.10.1 - react-native-webview: 13.12.2 - react-redux: 8.0.5 - react-test-renderer: 18.3.1 - redux: 4.2.1 - redux-persist: 6.0.0 - redux-saga: 1.2.2 - redux-saga-test-plan: 4.0.4 - typed-redux-saga: 1.5.0 - typescript: 5.3.3 - ui: "workspace:^" - uniswap: "workspace:^" - utilities: "workspace:^" - zod: 3.22.4 - zxcvbn: 4.4.2 - languageName: unknown - linkType: soft - -"warn-once@npm:0.1.1, warn-once@npm:^0.1.0": - version: 0.1.1 - resolution: "warn-once@npm:0.1.1" - checksum: e6a5a1f5a8dba7744399743d3cfb571db4c3947897875d4962a7c5b1bf2195ab4518c838cb4cea652e71729f21bba2e98dc75686f5fccde0fabbd894e2ed0c0d +"safe-buffer@npm:^5.0.1, safe-buffer@npm:^5.1.0, safe-buffer@npm:^5.1.2, safe-buffer@npm:^5.2.1, safe-buffer@npm:~5.2.0": + version: 5.2.1 + resolution: "safe-buffer@npm:5.2.1" + checksum: b99c4b41fdd67a6aaf280fcd05e9ffb0813654894223afb78a31f14a19ad220bba8aba1cb14eddce1fcfb037155fe6de4e861784eb434f7d11ed58d1e70dd491 languageName: node linkType: hard -"warning@npm:^4.0.2, warning@npm:^4.0.3": - version: 4.0.3 - resolution: "warning@npm:4.0.3" - dependencies: - loose-envify: ^1.0.0 - checksum: 4f2cb6a9575e4faf71ddad9ad1ae7a00d0a75d24521c193fa464f30e6b04027bd97aa5d9546b0e13d3a150ab402eda216d59c1d0f2d6ca60124d96cd40dfa35c +"safe-buffer@npm:~5.1.0, safe-buffer@npm:~5.1.1": + version: 5.1.2 + resolution: "safe-buffer@npm:5.1.2" + checksum: f2f1f7943ca44a594893a852894055cf619c1fbcb611237fc39e461ae751187e7baf4dc391a72125e0ac4fb2d8c5c0b3c71529622e6a58f46b960211e704903c languageName: node linkType: hard -"watchpack@npm:^2.4.0, watchpack@npm:^2.4.1": - version: 2.4.2 - resolution: "watchpack@npm:2.4.2" +"sembear@npm:^0.5.0": + version: 0.5.2 + resolution: "sembear@npm:0.5.2" dependencies: - glob-to-regexp: ^0.4.1 - graceful-fs: ^4.1.2 - checksum: 92d9d52ce3d16fd83ed6994d1dd66a4d146998882f4c362d37adfea9ab77748a5b4d1e0c65fa104797928b2d40f635efa8f9b925a6265428a69f1e1852ca3441 + "@types/semver": ^6.0.1 + semver: ^6.3.0 + checksum: 365e5557e5a9b0fe2e107609fec4f2a9c8c43ac547efb64eba536fd9d68f2452db05129a604fa6eaf2de000a99ed2b3e7895669331eca0213fb39f09a1ee6a0a languageName: node linkType: hard -"wbuf@npm:^1.1.0, wbuf@npm:^1.7.3": - version: 1.7.3 - resolution: "wbuf@npm:1.7.3" - dependencies: - minimalistic-assert: ^1.0.0 - checksum: 2abc306c96930b757972a1c4650eb6b25b5d99f24088714957f88629e137db569368c5de0e57986c89ea70db2f1df9bba11a87cb6d0c8694b6f53a0159fab3bf +"semver-compare@npm:^1.0.0": + version: 1.0.0 + resolution: "semver-compare@npm:1.0.0" + checksum: dd1d7e2909744cf2cf71864ac718efc990297f9de2913b68e41a214319e70174b1d1793ac16e31183b128c2b9812541300cb324db8168e6cf6b570703b171c68 languageName: node linkType: hard -"wcag-contrast@npm:3.0.0": - version: 3.0.0 - resolution: "wcag-contrast@npm:3.0.0" +"semver@npm:7.5.2": + version: 7.5.2 + resolution: "semver@npm:7.5.2" dependencies: - relative-luminance: ^2.0.0 - checksum: 16cdc895fc7e6a07f4f63fb7c0d9616a2d02004b769c2e246795793cb8edad8ae279a1d9f28418e93bb43815d8c7ba3967b35bd92d249f3ee1f7c921c0c795b1 + lru-cache: ^6.0.0 + bin: + semver: bin/semver.js + checksum: 3fdf5d1e6f170fe8bcc41669e31787649af91af7f54f05c71d0865bb7aa27e8b92f68b3e6b582483e2c1c648008bc84249d2cd86301771fe5cbf7621d1fe5375 languageName: node linkType: hard -"wcwidth@npm:^1.0.1": - version: 1.0.1 - resolution: "wcwidth@npm:1.0.1" +"set-function-length@npm:^1.2.1": + version: 1.2.2 + resolution: "set-function-length@npm:1.2.2" dependencies: - defaults: ^1.0.3 - checksum: 814e9d1ddcc9798f7377ffa448a5a3892232b9275ebb30a41b529607691c0491de47cba426e917a4d08ded3ee7e9ba2f3fe32e62ee3cd9c7d3bafb7754bd553c - languageName: node - linkType: hard - -"web-streams-polyfill@npm:4.0.0-beta.3": - version: 4.0.0-beta.3 - resolution: "web-streams-polyfill@npm:4.0.0-beta.3" - checksum: dfec1fbf52b9140e4183a941e380487b6c3d5d3838dd1259be81506c1c9f2abfcf5aeb670aeeecfd9dff4271a6d8fef931b193c7bedfb42542a3b05ff36c0d16 + define-data-property: ^1.1.4 + es-errors: ^1.3.0 + function-bind: ^1.1.2 + get-intrinsic: ^1.2.4 + gopd: ^1.0.1 + has-property-descriptors: ^1.0.2 + checksum: a8248bdacdf84cb0fab4637774d9fb3c7a8e6089866d04c817583ff48e14149c87044ce683d7f50759a8c50fb87c7a7e173535b06169c87ef76f5fb276dfff72 languageName: node linkType: hard -"web-streams-polyfill@npm:^3.2.0, web-streams-polyfill@npm:^3.2.1, web-streams-polyfill@npm:^3.3.2": - version: 3.3.3 - resolution: "web-streams-polyfill@npm:3.3.3" - checksum: 21ab5ea08a730a2ef8023736afe16713b4f2023ec1c7085c16c8e293ee17ed085dff63a0ad8722da30c99c4ccbd4ccd1b2e79c861829f7ef2963d7de7004c2cb +"shebang-command@npm:^1.2.0": + version: 1.2.0 + resolution: "shebang-command@npm:1.2.0" + dependencies: + shebang-regex: ^1.0.0 + checksum: 9eed1750301e622961ba5d588af2212505e96770ec376a37ab678f965795e995ade7ed44910f5d3d3cb5e10165a1847f52d3348c64e146b8be922f7707958908 languageName: node linkType: hard -"web-vitals@npm:2.1.4": - version: 2.1.4 - resolution: "web-vitals@npm:2.1.4" - checksum: 03d3f47dbf55c3dce07beb0ff5de8ddd52e2d0a53a8df5c84e7a16dda93543341d67231fa79b1d9772b091419af4ec0fd395b8bcf451a0e26846e3f76b3d0efc +"shebang-command@npm:^2.0.0": + version: 2.0.0 + resolution: "shebang-command@npm:2.0.0" + dependencies: + shebang-regex: ^3.0.0 + checksum: 6b52fe87271c12968f6a054e60f6bde5f0f3d2db483a1e5c3e12d657c488a15474121a1d55cd958f6df026a54374ec38a4a963988c213b7570e1d51575cea7fa languageName: node linkType: hard -"web3-utils@npm:^1.3.4": - version: 1.10.3 - resolution: "web3-utils@npm:1.10.3" - dependencies: - "@ethereumjs/util": ^8.1.0 - bn.js: ^5.2.1 - ethereum-bloom-filters: ^1.0.6 - ethereum-cryptography: ^2.1.2 - ethjs-unit: 0.1.6 - number-to-bn: 1.7.0 - randombytes: ^2.1.0 - utf8: 3.0.0 - checksum: 353226710b2089a8e84f2b97cc765093e3018b850d3a6d60c92fe012829fa15a54ad15d432f1927bc185c6ef5100397a32fd4a896da5f514817c3f53583df134 +"shebang-regex@npm:^1.0.0": + version: 1.0.0 + resolution: "shebang-regex@npm:1.0.0" + checksum: 404c5a752cd40f94591dfd9346da40a735a05139dac890ffc229afba610854d8799aaa52f87f7e0c94c5007f2c6af55bdcaeb584b56691926c5eaf41dc8f1372 languageName: node linkType: hard -"webauthn-p256@npm:0.0.10": - version: 0.0.10 - resolution: "webauthn-p256@npm:0.0.10" - dependencies: - "@noble/curves": ^1.4.0 - "@noble/hashes": ^1.4.0 - checksum: 0648a3d78451bfa7105b5151a34bd685ee60e193be9be1981fe73819ed5a92f410973bdeb72427ef03c8c2a848619f818cf3e66b94012d5127b462cb10c24f5d +"shebang-regex@npm:^3.0.0": + version: 3.0.0 + resolution: "shebang-regex@npm:3.0.0" + checksum: 1a2bcae50de99034fcd92ad4212d8e01eedf52c7ec7830eedcf886622804fe36884278f2be8be0ea5fde3fd1c23911643a4e0f726c8685b61871c8908af01222 languageName: node linkType: hard -"webcrypto-core@npm:^1.7.4": - version: 1.7.5 - resolution: "webcrypto-core@npm:1.7.5" +"shelljs@npm:^0.8.4": + version: 0.8.5 + resolution: "shelljs@npm:0.8.5" dependencies: - "@peculiar/asn1-schema": ^2.1.6 - "@peculiar/json-schema": ^1.1.12 - asn1js: ^3.0.1 - pvtsutils: ^1.3.2 - tslib: ^2.4.0 - checksum: f6e529ca5c1175b8ccead3547f60efa7a1f8e247aaeab3bd4f096eb9fda11cfc8e6b6fb574bbc5696f608958c491a27e9682c89204412f73fb430e5fcbe9ebac + glob: ^7.0.0 + interpret: ^1.0.0 + rechoir: ^0.6.2 + bin: + shjs: bin/shjs + checksum: 7babc46f732a98f4c054ec1f048b55b9149b98aa2da32f6cf9844c434b43c6251efebd6eec120937bd0999e13811ebd45efe17410edb3ca938f82f9381302748 languageName: node linkType: hard -"webextension-polyfill@npm:>=0.10.0 <1.0, webextension-polyfill@npm:^0.10.0": - version: 0.10.0 - resolution: "webextension-polyfill@npm:0.10.0" - checksum: 4a59036bda571360c2c0b2fb03fe1dc244f233946bcf9a6766f677956c40fd14d270aaa69cdba95e4ac521014afbe4008bfa5959d0ac39f91c990eb206587f91 +"signal-exit@npm:^3.0.2, signal-exit@npm:^3.0.3": + version: 3.0.7 + resolution: "signal-exit@npm:3.0.7" + checksum: a2f098f247adc367dffc27845853e9959b9e88b01cb301658cfe4194352d8d2bb32e18467c786a7fe15f1d44b233ea35633d076d5e737870b7139949d1ab6318 languageName: node linkType: hard -"webidl-conversions@npm:^3.0.0": - version: 3.0.1 - resolution: "webidl-conversions@npm:3.0.1" - checksum: c92a0a6ab95314bde9c32e1d0a6dfac83b578f8fa5f21e675bc2706ed6981bc26b7eb7e6a1fab158e5ce4adf9caa4a0aee49a52505d4d13c7be545f15021b17c +"slash@npm:^3.0.0": + version: 3.0.0 + resolution: "slash@npm:3.0.0" + checksum: 94a93fff615f25a999ad4b83c9d5e257a7280c90a32a7cb8b4a87996e4babf322e469c42b7f649fd5796edd8687652f3fb452a86dc97a816f01113183393f11c languageName: node linkType: hard -"webidl-conversions@npm:^4.0.2": - version: 4.0.2 - resolution: "webidl-conversions@npm:4.0.2" - checksum: c93d8dfe908a0140a4ae9c0ebc87a33805b416a33ee638a605b551523eec94a9632165e54632f6d57a39c5f948c4bab10e0e066525e9a4b87a79f0d04fbca374 +"sort-keys@npm:^5.0.0": + version: 5.0.0 + resolution: "sort-keys@npm:5.0.0" + dependencies: + is-plain-obj: ^4.0.0 + checksum: 9c0b7a468312075be03770b260b2cc0e5d55149025e564edaed41c9ff619199698aad6712a6fe4bbc75c541efb081276ac6bbd4cf2723d742f272f7a8fe354f5 languageName: node linkType: hard -"webidl-conversions@npm:^5.0.0": - version: 5.0.0 - resolution: "webidl-conversions@npm:5.0.0" - checksum: ccf1ec2ca7c0b5671e5440ace4a66806ae09c49016ab821481bec0c05b1b82695082dc0a27d1fe9d804d475a408ba0c691e6803fd21be608e710955d4589cd69 +"source-map-js@npm:^1.0.2, source-map-js@npm:^1.2.1": + version: 1.2.1 + resolution: "source-map-js@npm:1.2.1" + checksum: 4eb0cd997cdf228bc253bcaff9340afeb706176e64868ecd20efbe6efea931465f43955612346d6b7318789e5265bdc419bc7669c1cebe3db0eb255f57efa76b languageName: node linkType: hard -"webidl-conversions@npm:^7.0.0": - version: 7.0.0 - resolution: "webidl-conversions@npm:7.0.0" - checksum: f05588567a2a76428515333eff87200fae6c83c3948a7482ebb109562971e77ef6dc49749afa58abb993391227c5697b3ecca52018793e0cb4620a48f10bd21b +"spawndamnit@npm:^2.0.0": + version: 2.0.0 + resolution: "spawndamnit@npm:2.0.0" + dependencies: + cross-spawn: ^5.1.0 + signal-exit: ^3.0.2 + checksum: c74b5e264ee5bc13d55692fd422d74c282e4607eb04ac64d19d06796718d89b14921620fa4237ec5635e7acdff21461670ff19850f210225410a353cad0d7fed languageName: node linkType: hard -"webpack-bundle-analyzer@npm:4.10.2": - version: 4.10.2 - resolution: "webpack-bundle-analyzer@npm:4.10.2" +"spdx-correct@npm:^3.0.0": + version: 3.1.1 + resolution: "spdx-correct@npm:3.1.1" dependencies: - "@discoveryjs/json-ext": 0.5.7 - acorn: ^8.0.4 - acorn-walk: ^8.0.0 - commander: ^7.2.0 - debounce: ^1.2.1 - escape-string-regexp: ^4.0.0 - gzip-size: ^6.0.0 - html-escaper: ^2.0.2 - opener: ^1.5.2 - picocolors: ^1.0.0 - sirv: ^2.0.3 - ws: ^7.3.1 - bin: - webpack-bundle-analyzer: lib/bin/analyzer.js - checksum: 4f0275e7d87bb6203a618ca5d2d4953943979d986fa2b91be1bf1ad0bcd22bec13398803273d11699f9fbcf106896311208a72d63fe5f8a47b687a226e598dc1 + spdx-expression-parse: ^3.0.0 + spdx-license-ids: ^3.0.0 + checksum: 77ce438344a34f9930feffa61be0eddcda5b55fc592906ef75621d4b52c07400a97084d8701557b13f7d2aae0cb64f808431f469e566ef3fe0a3a131dcb775a6 languageName: node linkType: hard -"webpack-cli@npm:5.1.4": - version: 5.1.4 - resolution: "webpack-cli@npm:5.1.4" - dependencies: - "@discoveryjs/json-ext": ^0.5.0 - "@webpack-cli/configtest": ^2.1.1 - "@webpack-cli/info": ^2.0.2 - "@webpack-cli/serve": ^2.0.5 - colorette: ^2.0.14 - commander: ^10.0.1 - cross-spawn: ^7.0.3 - envinfo: ^7.7.3 - fastest-levenshtein: ^1.0.12 - import-local: ^3.0.2 - interpret: ^3.1.1 - rechoir: ^0.8.0 - webpack-merge: ^5.7.3 - peerDependencies: - webpack: 5.x.x - peerDependenciesMeta: - "@webpack-cli/generators": - optional: true - webpack-bundle-analyzer: - optional: true - webpack-dev-server: - optional: true - bin: - webpack-cli: bin/cli.js - checksum: 3a4ad0d0342a6815c850ee4633cc2a8a5dae04f918e7847f180bf24ab400803cf8a8943707ffbed03eb20fe6ce647f996f60a2aade87b0b4a9954da3da172ce0 +"spdx-exceptions@npm:^2.1.0": + version: 2.3.0 + resolution: "spdx-exceptions@npm:2.3.0" + checksum: cb69a26fa3b46305637123cd37c85f75610e8c477b6476fa7354eb67c08128d159f1d36715f19be6f9daf4b680337deb8c65acdcae7f2608ba51931540687ac0 languageName: node linkType: hard -"webpack-dev-middleware@npm:^5.3.1, webpack-dev-middleware@npm:^5.3.4": - version: 5.3.4 - resolution: "webpack-dev-middleware@npm:5.3.4" +"spdx-expression-parse@npm:^3.0.0": + version: 3.0.1 + resolution: "spdx-expression-parse@npm:3.0.1" dependencies: - colorette: ^2.0.10 - memfs: ^3.4.3 - mime-types: ^2.1.31 - range-parser: ^1.2.1 - schema-utils: ^4.0.0 - peerDependencies: - webpack: ^4.0.0 || ^5.0.0 - checksum: 90cf3e27d0714c1a745454a1794f491b7076434939340605b9ee8718ba2b85385b120939754e9fdbd6569811e749dee53eec319e0d600e70e0b0baffd8e3fb13 + spdx-exceptions: ^2.1.0 + spdx-license-ids: ^3.0.0 + checksum: a1c6e104a2cbada7a593eaa9f430bd5e148ef5290d4c0409899855ce8b1c39652bcc88a725259491a82601159d6dc790bedefc9016c7472f7de8de7361f8ccde languageName: node linkType: hard -"webpack-dev-middleware@npm:^6.1.2": - version: 6.1.3 - resolution: "webpack-dev-middleware@npm:6.1.3" - dependencies: - colorette: ^2.0.10 - memfs: ^3.4.12 - mime-types: ^2.1.31 - range-parser: ^1.2.1 - schema-utils: ^4.0.0 - peerDependencies: - webpack: ^5.0.0 - peerDependenciesMeta: - webpack: - optional: true - checksum: ddedaa913cc39d7ac7f971d902f181ecc5c4ab0b91f9eda5923f0ea513ecf458f71046f2ed423cb4fc657c2177fe279186453e395bd1051f0949e265c3124665 - languageName: node - linkType: hard - -"webpack-dev-server@npm:4.15.1": - version: 4.15.1 - resolution: "webpack-dev-server@npm:4.15.1" - dependencies: - "@types/bonjour": ^3.5.9 - "@types/connect-history-api-fallback": ^1.3.5 - "@types/express": ^4.17.13 - "@types/serve-index": ^1.9.1 - "@types/serve-static": ^1.13.10 - "@types/sockjs": ^0.3.33 - "@types/ws": ^8.5.5 - ansi-html-community: ^0.0.8 - bonjour-service: ^1.0.11 - chokidar: ^3.5.3 - colorette: ^2.0.10 - compression: ^1.7.4 - connect-history-api-fallback: ^2.0.0 - default-gateway: ^6.0.3 - express: ^4.17.3 - graceful-fs: ^4.2.6 - html-entities: ^2.3.2 - http-proxy-middleware: ^2.0.3 - ipaddr.js: ^2.0.1 - launch-editor: ^2.6.0 - open: ^8.0.9 - p-retry: ^4.5.0 - rimraf: ^3.0.2 - schema-utils: ^4.0.0 - selfsigned: ^2.1.1 - serve-index: ^1.9.1 - sockjs: ^0.3.24 - spdy: ^4.0.2 - webpack-dev-middleware: ^5.3.1 - ws: ^8.13.0 - peerDependencies: - webpack: ^4.37.0 || ^5.0.0 - peerDependenciesMeta: - webpack: - optional: true - webpack-cli: - optional: true - bin: - webpack-dev-server: bin/webpack-dev-server.js - checksum: cd0063b068d2b938fd76c412d555374186ac2fa84bbae098265212ed50a5c15d6f03aa12a5a310c544a242943eb58c0bfde4c296d5c36765c182f53799e1bc71 - languageName: node - linkType: hard - -"webpack-dev-server@npm:^4.6.0": - version: 4.15.2 - resolution: "webpack-dev-server@npm:4.15.2" - dependencies: - "@types/bonjour": ^3.5.9 - "@types/connect-history-api-fallback": ^1.3.5 - "@types/express": ^4.17.13 - "@types/serve-index": ^1.9.1 - "@types/serve-static": ^1.13.10 - "@types/sockjs": ^0.3.33 - "@types/ws": ^8.5.5 - ansi-html-community: ^0.0.8 - bonjour-service: ^1.0.11 - chokidar: ^3.5.3 - colorette: ^2.0.10 - compression: ^1.7.4 - connect-history-api-fallback: ^2.0.0 - default-gateway: ^6.0.3 - express: ^4.17.3 - graceful-fs: ^4.2.6 - html-entities: ^2.3.2 - http-proxy-middleware: ^2.0.3 - ipaddr.js: ^2.0.1 - launch-editor: ^2.6.0 - open: ^8.0.9 - p-retry: ^4.5.0 - rimraf: ^3.0.2 - schema-utils: ^4.0.0 - selfsigned: ^2.1.1 - serve-index: ^1.9.1 - sockjs: ^0.3.24 - spdy: ^4.0.2 - webpack-dev-middleware: ^5.3.4 - ws: ^8.13.0 - peerDependencies: - webpack: ^4.37.0 || ^5.0.0 - peerDependenciesMeta: - webpack: - optional: true - webpack-cli: - optional: true - bin: - webpack-dev-server: bin/webpack-dev-server.js - checksum: 123507129cb4d55fdc5fabdd177574f31133605748372bb11353307b7a583ef25c6fd27b6addf56bf070ba44c88d5da861771c2ec55f52405082ec9efd01f039 +"spdx-license-ids@npm:^3.0.0": + version: 3.0.11 + resolution: "spdx-license-ids@npm:3.0.11" + checksum: 1da1acb090257773e60b022094050e810ae9fec874dc1461f65dc0400cd42dd830ab2df6e64fb49c2db3dce386dd0362110780e1b154db7c0bb413488836aaeb languageName: node linkType: hard -"webpack-hot-middleware@npm:^2.25.1": - version: 2.26.1 - resolution: "webpack-hot-middleware@npm:2.26.1" - dependencies: - ansi-html-community: 0.0.8 - html-entities: ^2.1.0 - strip-ansi: ^6.0.0 - checksum: 78513d8d5770c59c3039ce094c49b2e2772b3f1d4ec5c124a7aabe6124a0e08429993b81129649087dc300f496822257e39135bf8b891b51aea197c1b554072a +"split-on-first@npm:^1.0.0": + version: 1.1.0 + resolution: "split-on-first@npm:1.1.0" + checksum: 16ff85b54ddcf17f9147210a4022529b343edbcbea4ce977c8f30e38408b8d6e0f25f92cd35b86a524d4797f455e29ab89eb8db787f3c10708e0b47ebf528d30 languageName: node linkType: hard -"webpack-manifest-plugin@npm:^4.0.2": - version: 4.1.1 - resolution: "webpack-manifest-plugin@npm:4.1.1" +"split2@npm:^3.0.0": + version: 3.2.2 + resolution: "split2@npm:3.2.2" dependencies: - tapable: ^2.0.0 - webpack-sources: ^2.2.0 - peerDependencies: - webpack: ^4.44.2 || ^5.47.0 - checksum: 426982030d3b0ef26432d98960ee1fa33889d8f0ed79b3d2c8e37be9b4e4beba7524c60631297ea557c642a340b76d70b0eb6a1e08b86a769409037185795038 + readable-stream: ^3.0.0 + checksum: 8127ddbedd0faf31f232c0e9192fede469913aa8982aa380752e0463b2e31c2359ef6962eb2d24c125bac59eeec76873678d723b1c7ff696216a1cd071e3994a languageName: node linkType: hard -"webpack-merge@npm:^5.7.3, webpack-merge@npm:^5.8.0": - version: 5.10.0 - resolution: "webpack-merge@npm:5.10.0" - dependencies: - clone-deep: ^4.0.1 - flat: ^5.0.2 - wildcard: ^2.0.0 - checksum: 1fe8bf5309add7298e1ac72fb3f2090e1dfa80c48c7e79fa48aa60b5961332c7d0d61efa8851acb805e6b91a4584537a347bc106e05e9aec87fa4f7088c62f2f +"sprintf-js@npm:^1.1.1": + version: 1.1.3 + resolution: "sprintf-js@npm:1.1.3" + checksum: a3fdac7b49643875b70864a9d9b469d87a40dfeaf5d34d9d0c5b1cda5fd7d065531fcb43c76357d62254c57184a7b151954156563a4d6a747015cfb41021cad0 languageName: node linkType: hard -"webpack-retry-chunk-load-plugin@npm:3.1.1": - version: 3.1.1 - resolution: "webpack-retry-chunk-load-plugin@npm:3.1.1" - dependencies: - prettier: ^2.6.2 - peerDependencies: - webpack: ">=5.0.0" - checksum: ea621b7317691378d93dbfa67737657e7628d51988ae5540e04a0bd8e91deeadcd5cb5ba8d8995c89b5eb532190c2d818029992b34305821ea72376296dcdf8d +"sprintf-js@npm:~1.0.2": + version: 1.0.3 + resolution: "sprintf-js@npm:1.0.3" + checksum: 19d79aec211f09b99ec3099b5b2ae2f6e9cdefe50bc91ac4c69144b6d3928a640bb6ae5b3def70c2e85a2c3d9f5ec2719921e3a59d3ca3ef4b2fd1a4656a0df3 languageName: node linkType: hard -"webpack-sources@npm:^1.4.3": - version: 1.4.3 - resolution: "webpack-sources@npm:1.4.3" - dependencies: - source-list-map: ^2.0.0 - source-map: ~0.6.1 - checksum: 37463dad8d08114930f4bc4882a9602941f07c9f0efa9b6bc78738cd936275b990a596d801ef450d022bb005b109b9f451dd087db2f3c9baf53e8e22cf388f79 +"stream-shift@npm:^1.0.0": + version: 1.0.3 + resolution: "stream-shift@npm:1.0.3" + checksum: a24c0a3f66a8f9024bd1d579a533a53be283b4475d4e6b4b3211b964031447bdf6532dd1f3c2b0ad66752554391b7c62bd7ca4559193381f766534e723d50242 languageName: node linkType: hard -"webpack-sources@npm:^2.2.0": - version: 2.3.1 - resolution: "webpack-sources@npm:2.3.1" +"streamx@npm:^2.12.5": + version: 2.21.1 + resolution: "streamx@npm:2.21.1" dependencies: - source-list-map: ^2.0.1 - source-map: ^0.6.1 - checksum: 6fd67f2274a84c5f51ad89767112ec8b47727134bf0f2ba0cff458c970f18966939a24128bdbddba621cd66eeb2bef0552642a9333cd8e54514f7b2a71776346 + bare-events: ^2.2.0 + fast-fifo: ^1.3.2 + queue-tick: ^1.0.1 + text-decoder: ^1.1.0 + dependenciesMeta: + bare-events: + optional: true + checksum: 98abdd0a926b172be6f2b306cdda3d8689a4da51e478518aa187d321ceca31ebfcbfff222c55ef4140fdc2a5c14da5db9da19fdfd7a08bcdcb0c1c6e6df96f22 languageName: node linkType: hard -"webpack-sources@npm:^3.2.3": - version: 3.2.3 - resolution: "webpack-sources@npm:3.2.3" - checksum: 989e401b9fe3536529e2a99dac8c1bdc50e3a0a2c8669cbafad31271eadd994bc9405f88a3039cd2e29db5e6d9d0926ceb7a1a4e7409ece021fe79c37d9c4607 +"strict-uri-encode@npm:^2.0.0": + version: 2.0.0 + resolution: "strict-uri-encode@npm:2.0.0" + checksum: eaac4cf978b6fbd480f1092cab8b233c9b949bcabfc9b598dd79a758f7243c28765ef7639c876fa72940dac687181b35486ea01ff7df3e65ce3848c64822c581 languageName: node linkType: hard -"webpack-virtual-modules@npm:^0.6.0, webpack-virtual-modules@npm:^0.6.2": - version: 0.6.2 - resolution: "webpack-virtual-modules@npm:0.6.2" - checksum: 7e8e1d63f35864c815420cc2f27da8561a1e028255040698a352717de0ba46d3b3faf16f06c1a1965217054c4c2894eb9af53a85451870e919b5707ce9c5822d - languageName: node - linkType: hard - -"webpack@npm:5, webpack@npm:^5.64.4": - version: 5.97.1 - resolution: "webpack@npm:5.97.1" - dependencies: - "@types/eslint-scope": ^3.7.7 - "@types/estree": ^1.0.6 - "@webassemblyjs/ast": ^1.14.1 - "@webassemblyjs/wasm-edit": ^1.14.1 - "@webassemblyjs/wasm-parser": ^1.14.1 - acorn: ^8.14.0 - browserslist: ^4.24.0 - chrome-trace-event: ^1.0.2 - enhanced-resolve: ^5.17.1 - es-module-lexer: ^1.2.1 - eslint-scope: 5.1.1 - events: ^3.2.0 - glob-to-regexp: ^0.4.1 - graceful-fs: ^4.2.11 - json-parse-even-better-errors: ^2.3.1 - loader-runner: ^4.2.0 - mime-types: ^2.1.27 - neo-async: ^2.6.2 - schema-utils: ^3.2.0 - tapable: ^2.1.1 - terser-webpack-plugin: ^5.3.10 - watchpack: ^2.4.1 - webpack-sources: ^3.2.3 - peerDependenciesMeta: - webpack-cli: - optional: true - bin: - webpack: bin/webpack.js - checksum: 649065e2258b495ae41a4088be804b4be2ec07d280aa514ebef43da79caf96fa973d26a08826c3902b5676a098d9b37c589f16be7b4da17b68b08b6c76441196 - languageName: node - linkType: hard - -"webpack@npm:5.90.0": - version: 5.90.0 - resolution: "webpack@npm:5.90.0" - dependencies: - "@types/eslint-scope": ^3.7.3 - "@types/estree": ^1.0.5 - "@webassemblyjs/ast": ^1.11.5 - "@webassemblyjs/wasm-edit": ^1.11.5 - "@webassemblyjs/wasm-parser": ^1.11.5 - acorn: ^8.7.1 - acorn-import-assertions: ^1.9.0 - browserslist: ^4.21.10 - chrome-trace-event: ^1.0.2 - enhanced-resolve: ^5.15.0 - es-module-lexer: ^1.2.1 - eslint-scope: 5.1.1 - events: ^3.2.0 - glob-to-regexp: ^0.4.1 - graceful-fs: ^4.2.9 - json-parse-even-better-errors: ^2.3.1 - loader-runner: ^4.2.0 - mime-types: ^2.1.27 - neo-async: ^2.6.2 - schema-utils: ^3.2.0 - tapable: ^2.1.1 - terser-webpack-plugin: ^5.3.10 - watchpack: ^2.4.0 - webpack-sources: ^3.2.3 - peerDependenciesMeta: - webpack-cli: - optional: true - bin: - webpack: bin/webpack.js - checksum: 178a0e7e9e5b26264a19dd5fe554a3508a8afafc9cce972bfd4452b5128d0db1b37832f5e615be1cff1934f24da0de967929f199be2b3fe283ca1951f98ea3fe +"string-width@npm:^4.1.0, string-width@npm:^4.2.0, string-width@npm:^4.2.3": + version: 4.2.3 + resolution: "string-width@npm:4.2.3" + dependencies: + emoji-regex: ^8.0.0 + is-fullwidth-code-point: ^3.0.0 + strip-ansi: ^6.0.1 + checksum: e52c10dc3fbfcd6c3a15f159f54a90024241d0f149cf8aed2982a2d801d2e64df0bf1dc351cf8e95c3319323f9f220c16e740b06faecd53e2462df1d2b5443fb languageName: node linkType: hard -"websocket-driver@npm:>=0.5.1, websocket-driver@npm:^0.7.4": - version: 0.7.4 - resolution: "websocket-driver@npm:0.7.4" +"string_decoder@npm:^1.1.1": + version: 1.3.0 + resolution: "string_decoder@npm:1.3.0" dependencies: - http-parser-js: ">=0.5.1" - safe-buffer: ">=5.1.0" - websocket-extensions: ">=0.1.1" - checksum: fffe5a33fe8eceafd21d2a065661d09e38b93877eae1de6ab5d7d2734c6ed243973beae10ae48c6613cfd675f200e5a058d1e3531bc9e6c5d4f1396ff1f0bfb9 + safe-buffer: ~5.2.0 + checksum: 8417646695a66e73aefc4420eb3b84cc9ffd89572861fe004e6aeb13c7bc00e2f616247505d2dbbef24247c372f70268f594af7126f43548565c68c117bdeb56 languageName: node linkType: hard -"websocket-extensions@npm:>=0.1.1": - version: 0.1.4 - resolution: "websocket-extensions@npm:0.1.4" - checksum: 5976835e68a86afcd64c7a9762ed85f2f27d48c488c707e67ba85e717b90fa066b98ab33c744d64255c9622d349eedecf728e65a5f921da71b58d0e9591b9038 +"string_decoder@npm:~1.1.1": + version: 1.1.1 + resolution: "string_decoder@npm:1.1.1" + dependencies: + safe-buffer: ~5.1.0 + checksum: 9ab7e56f9d60a28f2be697419917c50cac19f3e8e6c28ef26ed5f4852289fe0de5d6997d29becf59028556f2c62983790c1d9ba1e2a3cc401768ca12d5183a5b languageName: node linkType: hard -"whatwg-encoding@npm:^2.0.0": - version: 2.0.0 - resolution: "whatwg-encoding@npm:2.0.0" +"strip-ansi@npm:^6.0.0, strip-ansi@npm:^6.0.1": + version: 6.0.1 + resolution: "strip-ansi@npm:6.0.1" dependencies: - iconv-lite: 0.6.3 - checksum: 7087810c410aa9b689cbd6af8773341a53cdc1f3aae2a882c163bd5522ec8ca4cdfc269aef417a5792f411807d5d77d50df4c24e3abb00bb60192858a40cc675 + ansi-regex: ^5.0.1 + checksum: f3cd25890aef3ba6e1a74e20896c21a46f482e93df4a06567cebf2b57edabb15133f1f94e57434e0a958d61186087b1008e89c94875d019910a213181a14fc8c languageName: node linkType: hard -"whatwg-fetch@npm:3.0.0": +"strip-bom@npm:^3.0.0": version: 3.0.0 - resolution: "whatwg-fetch@npm:3.0.0" - checksum: dcb90ab919e742d275c32d397d7480f6981da4c1b49961f0d0a2fa6825325b553fee2d793bc38ed85b9bcc8c50de39802440e2480fe40243067b3dab228c52c3 + resolution: "strip-bom@npm:3.0.0" + checksum: 8d50ff27b7ebe5ecc78f1fe1e00fcdff7af014e73cf724b46fb81ef889eeb1015fc5184b64e81a2efe002180f3ba431bdd77e300da5c6685d702780fbf0c8d5b languageName: node linkType: hard -"whatwg-fetch@npm:^3.0.0, whatwg-fetch@npm:^3.6.2": - version: 3.6.20 - resolution: "whatwg-fetch@npm:3.6.20" - checksum: c58851ea2c4efe5c2235f13450f426824cf0253c1d45da28f45900290ae602a20aff2ab43346f16ec58917d5562e159cd691efa368354b2e82918c2146a519c5 +"strip-bom@npm:^4.0.0": + version: 4.0.0 + resolution: "strip-bom@npm:4.0.0" + checksum: 9dbcfbaf503c57c06af15fe2c8176fb1bf3af5ff65003851a102749f875a6dbe0ab3b30115eccf6e805e9d756830d3e40ec508b62b3f1ddf3761a20ebe29d3f3 languageName: node linkType: hard -"whatwg-mimetype@npm:^3.0.0": - version: 3.0.0 - resolution: "whatwg-mimetype@npm:3.0.0" - checksum: ce08bbb36b6aaf64f3a84da89707e3e6a31e5ab1c1a2379fd68df79ba712a4ab090904f0b50e6693b0dafc8e6343a6157e40bf18fdffd26e513cf95ee2a59824 +"strip-final-newline@npm:^2.0.0": + version: 2.0.0 + resolution: "strip-final-newline@npm:2.0.0" + checksum: 69412b5e25731e1938184b5d489c32e340605bb611d6140344abc3421b7f3c6f9984b21dff296dfcf056681b82caa3bb4cc996a965ce37bcfad663e92eae9c64 languageName: node linkType: hard -"whatwg-url-without-unicode@npm:8.0.0-3": - version: 8.0.0-3 - resolution: "whatwg-url-without-unicode@npm:8.0.0-3" +"strip-indent@npm:^3.0.0": + version: 3.0.0 + resolution: "strip-indent@npm:3.0.0" dependencies: - buffer: ^5.4.3 - punycode: ^2.1.1 - webidl-conversions: ^5.0.0 - checksum: 1fe266f7161e0bd961087c1254a5a59d1138c3d402064495eed65e7590d9caed5a1d9acfd6e7a1b0bf0431253b0e637ee3e4ffc08387cd60e0b2ddb9d4687a4b + min-indent: ^1.0.0 + checksum: 18f045d57d9d0d90cd16f72b2313d6364fd2cb4bf85b9f593523ad431c8720011a4d5f08b6591c9d580f446e78855c5334a30fb91aa1560f5d9f95ed1b4a0530 languageName: node linkType: hard -"whatwg-url@npm:^11.0.0": - version: 11.0.0 - resolution: "whatwg-url@npm:11.0.0" - dependencies: - tr46: ^3.0.0 - webidl-conversions: ^7.0.0 - checksum: ed4826aaa57e66bb3488a4b25c9cd476c46ba96052747388b5801f137dd740b73fde91ad207d96baf9f17fbcc80fc1a477ad65181b5eb5fa718d27c69501d7af +"strip-json-comments@npm:~2.0.1": + version: 2.0.1 + resolution: "strip-json-comments@npm:2.0.1" + checksum: 1074ccb63270d32ca28edfb0a281c96b94dc679077828135141f27d52a5a398ef5e78bcf22809d23cadc2b81dfbe345eb5fd8699b385c8b1128907dec4a7d1e1 languageName: node linkType: hard -"whatwg-url@npm:^5.0.0": +"style-value-types@npm:5.0.0": version: 5.0.0 - resolution: "whatwg-url@npm:5.0.0" - dependencies: - tr46: ~0.0.3 - webidl-conversions: ^3.0.0 - checksum: b8daed4ad3356cc4899048a15b2c143a9aed0dfae1f611ebd55073310c7b910f522ad75d727346ad64203d7e6c79ef25eafd465f4d12775ca44b90fa82ed9e2c - languageName: node - linkType: hard - -"whatwg-url@npm:^7.0.0": - version: 7.1.0 - resolution: "whatwg-url@npm:7.1.0" + resolution: "style-value-types@npm:5.0.0" dependencies: - lodash.sortby: ^4.7.0 - tr46: ^1.0.1 - webidl-conversions: ^4.0.2 - checksum: fecb07c87290b47d2ec2fb6d6ca26daad3c9e211e0e531dd7566e7ff95b5b3525a57d4f32640ad4adf057717e0c215731db842ad761e61d947e81010e05cf5fd + hey-listen: ^1.0.8 + tslib: ^2.1.0 + checksum: 16d198302cd102edf9dba94e7752a2364c93b1eaa5cc7c32b42b28eef4af4ccb5149a3f16bc2a256adc02616a2404f4612bd15f3081c1e8ca06132cae78be6c0 languageName: node linkType: hard -"which-boxed-primitive@npm:^1.0.2": - version: 1.0.2 - resolution: "which-boxed-primitive@npm:1.0.2" +"supports-color@npm:^5.0.0, supports-color@npm:^5.3.0": + version: 5.5.0 + resolution: "supports-color@npm:5.5.0" dependencies: - is-bigint: ^1.0.1 - is-boolean-object: ^1.1.0 - is-number-object: ^1.0.4 - is-string: ^1.0.5 - is-symbol: ^1.0.3 - checksum: 53ce774c7379071729533922adcca47220228405e1895f26673bbd71bdf7fb09bee38c1d6399395927c6289476b5ae0629863427fd151491b71c4b6cb04f3a5e + has-flag: ^3.0.0 + checksum: 95f6f4ba5afdf92f495b5a912d4abee8dcba766ae719b975c56c084f5004845f6f5a5f7769f52d53f40e21952a6d87411bafe34af4a01e65f9926002e38e1dac languageName: node linkType: hard -"which-builtin-type@npm:^1.1.3": - version: 1.1.3 - resolution: "which-builtin-type@npm:1.1.3" +"supports-color@npm:^7.1.0": + version: 7.2.0 + resolution: "supports-color@npm:7.2.0" dependencies: - function.prototype.name: ^1.1.5 - has-tostringtag: ^1.0.0 - is-async-function: ^2.0.0 - is-date-object: ^1.0.5 - is-finalizationregistry: ^1.0.2 - is-generator-function: ^1.0.10 - is-regex: ^1.1.4 - is-weakref: ^1.0.2 - isarray: ^2.0.5 - which-boxed-primitive: ^1.0.2 - which-collection: ^1.0.1 - which-typed-array: ^1.1.9 - checksum: 43730f7d8660ff9e33d1d3f9f9451c4784265ee7bf222babc35e61674a11a08e1c2925019d6c03154fcaaca4541df43abe35d2720843b9b4cbcebdcc31408f36 + has-flag: ^4.0.0 + checksum: 3dda818de06ebbe5b9653e07842d9479f3555ebc77e9a0280caf5a14fb877ffee9ed57007c3b78f5a6324b8dbeec648d9e97a24e2ed9fdb81ddc69ea07100f4a languageName: node linkType: hard -"which-collection@npm:^1.0.1": +"supports-hyperlinks@npm:^1.0.1": version: 1.0.1 - resolution: "which-collection@npm:1.0.1" + resolution: "supports-hyperlinks@npm:1.0.1" dependencies: - is-map: ^2.0.1 - is-set: ^2.0.1 - is-weakmap: ^2.0.1 - is-weakset: ^2.0.1 - checksum: c815bbd163107ef9cb84f135e6f34453eaf4cca994e7ba85ddb0d27cea724c623fae2a473ceccfd5549c53cc65a5d82692de418166df3f858e1e5dc60818581c - languageName: node - linkType: hard - -"which-module@npm:^2.0.0": - version: 2.0.0 - resolution: "which-module@npm:2.0.0" - checksum: 809f7fd3dfcb2cdbe0180b60d68100c88785084f8f9492b0998c051d7a8efe56784492609d3f09ac161635b78ea29219eb1418a98c15ce87d085bce905705c9c + has-flag: ^2.0.0 + supports-color: ^5.0.0 + checksum: 3d6d142012b5b47709476544a0980863e81893065c0349e8e2a857ec3ff42a11a26de5faf5dae57c1ef2c09b5d94fb211a3703f8c546fee1a8fd4446df0070ad languageName: node linkType: hard -"which-typed-array@npm:^1.1.14, which-typed-array@npm:^1.1.15, which-typed-array@npm:^1.1.2, which-typed-array@npm:^1.1.9": - version: 1.1.15 - resolution: "which-typed-array@npm:1.1.15" - dependencies: - available-typed-arrays: ^1.0.7 - call-bind: ^1.0.7 - for-each: ^0.3.3 - gopd: ^1.0.1 - has-tostringtag: ^1.0.2 - checksum: 65227dcbfadf5677aacc43ec84356d17b5500cb8b8753059bb4397de5cd0c2de681d24e1a7bd575633f976a95f88233abfd6549c2105ef4ebd58af8aa1807c75 +"supports-preserve-symlinks-flag@npm:^1.0.0": + version: 1.0.0 + resolution: "supports-preserve-symlinks-flag@npm:1.0.0" + checksum: 53b1e247e68e05db7b3808b99b892bd36fb096e6fba213a06da7fab22045e97597db425c724f2bbd6c99a3c295e1e73f3e4de78592289f38431049e1277ca0ae languageName: node linkType: hard -"which@npm:^1.2.14, which@npm:^1.2.9, which@npm:^1.3.1": +"symlink-or-copy@npm:^1.1.8, symlink-or-copy@npm:^1.2.0, symlink-or-copy@npm:^1.3.1": version: 1.3.1 - resolution: "which@npm:1.3.1" - dependencies: - isexe: ^2.0.0 - bin: - which: ./bin/which - checksum: f2e185c6242244b8426c9df1510e86629192d93c1a986a7d2a591f2c24869e7ffd03d6dac07ca863b2e4c06f59a4cc9916c585b72ee9fa1aa609d0124df15e04 + resolution: "symlink-or-copy@npm:1.3.1" + checksum: 430c32ab5606f7b7c946a5a29ea17ce6cb0b34d8cb8394234b7abe710c8c029bf41030df79406cf49c4fc1e49aa979ca950b836767e3b8702acf9efe922a2f74 languageName: node linkType: hard -"which@npm:^2.0.1, which@npm:^2.0.2": - version: 2.0.2 - resolution: "which@npm:2.0.2" +"syncpack@npm:8.5.14": + version: 8.5.14 + resolution: "syncpack@npm:8.5.14" dependencies: - isexe: ^2.0.0 + chalk: 4.1.2 + commander: 10.0.0 + cosmiconfig: 8.0.0 + expect-more: 1.3.0 + fp-ts: 2.13.1 + fs-extra: 11.1.0 + glob: 8.1.0 + minimatch: 6.1.6 + read-yaml-file: 2.1.0 + semver: 7.3.8 bin: - node-which: ./bin/node-which - checksum: 1a5c563d3c1b52d5f893c8b61afe11abc3bab4afac492e8da5bde69d550de701cf9806235f20a47b5c8fa8a1d6a9135841de2596535e998027a54589000e66d1 + syncpack: dist/bin.js + syncpack-fix-mismatches: dist/bin-fix-mismatches/index.js + syncpack-format: dist/bin-format/index.js + syncpack-lint-semver-ranges: dist/bin-lint-semver-ranges/index.js + syncpack-list: dist/bin-list/index.js + syncpack-list-mismatches: dist/bin-list-mismatches/index.js + syncpack-set-semver-ranges: dist/bin-set-semver-ranges/index.js + checksum: 49b80707a38955c9e97f10ba898c49a0e8215e416a9aa217c1d788f9f2b2876780c027806955c42cba55bac22584424d3cb4510ab11ac5da66e38ca118614a5f languageName: node linkType: hard -"wide-align@npm:^1.1.0, wide-align@npm:^1.1.5": - version: 1.1.5 - resolution: "wide-align@npm:1.1.5" +"tar@npm:^4.4.8": + version: 4.4.19 + resolution: "tar@npm:4.4.19" dependencies: - string-width: ^1.0.2 || 2 || 3 || 4 - checksum: d5fc37cd561f9daee3c80e03b92ed3e84d80dde3365a8767263d03dacfc8fa06b065ffe1df00d8c2a09f731482fcacae745abfbb478d4af36d0a891fad4834d3 + chownr: ^1.1.4 + fs-minipass: ^1.2.7 + minipass: ^2.9.0 + minizlib: ^1.3.3 + mkdirp: ^0.5.5 + safe-buffer: ^5.2.1 + yallist: ^3.1.1 + checksum: 423c8259b17f8f612cef9c96805d65f90ba9a28e19be582cd9d0fcb217038219f29b7547198e8fd617da5f436376d6a74b99827acd1238d2f49cf62330f9664e languageName: node linkType: hard -"widest-line@npm:^2.0.0": - version: 2.0.1 - resolution: "widest-line@npm:2.0.1" +"teex@npm:^1.0.1": + version: 1.0.1 + resolution: "teex@npm:1.0.1" dependencies: - string-width: ^2.1.1 - checksum: 6245b1f2cff418107f937691d1cafd0e416b9e350aa79e3853dc0759ad20849451d7126c2f06d0a13286d37b44b8e79e4220df09630bce1e4722d9808bc7bfd2 + streamx: ^2.12.5 + checksum: 36bf7ce8bb5eb428ad7b14b695ee7fb0a02f09c1a9d8181cc42531208543a920b299d711bf78dad4ff9bcf36ac437ae8e138053734746076e3e0e7d6d76eef64 languageName: node linkType: hard -"widest-line@npm:^3.1.0": - version: 3.1.0 - resolution: "widest-line@npm:3.1.0" +"text-decoder@npm:^1.1.0": + version: 1.2.3 + resolution: "text-decoder@npm:1.2.3" dependencies: - string-width: ^4.0.0 - checksum: 03db6c9d0af9329c37d74378ff1d91972b12553c7d72a6f4e8525fe61563fa7adb0b9d6e8d546b7e059688712ea874edd5ded475999abdeedf708de9849310e0 + b4a: ^1.6.4 + checksum: d7642a61f9d72330eac52ff6b6e8d34dea03ebbb1e82749a8734e7892e246cf262ed70730d20c4351c5dc5334297b9cc6c0b6a8725a204a63a197d7728bb35e5 languageName: node linkType: hard -"widest-line@npm:^4.0.1": - version: 4.0.1 - resolution: "widest-line@npm:4.0.1" - dependencies: - string-width: ^5.0.1 - checksum: 64c48cf27171221be5f86fc54b94dd29879165bdff1a7aa92dde723d9a8c99fb108312768a5d62c8c2b80b701fa27bbd36a1ddc58367585cd45c0db7920a0cba +"text-extensions@npm:^1.0.0": + version: 1.9.0 + resolution: "text-extensions@npm:1.9.0" + checksum: 56a9962c1b62d39b2bcb369b7558ca85c1b55e554b38dfd725edcc0a1babe5815782a60c17ff6b839093b163dfebb92b804208aaaea616ec7571c8059ae0cf44 languageName: node linkType: hard -"wildcard@npm:^2.0.0": - version: 2.0.0 - resolution: "wildcard@npm:2.0.0" - checksum: 1f4fe4c03dfc492777c60f795bbba597ac78794f1b650d68f398fbee9adb765367c516ebd4220889b6a81e9626e7228bbe0d66237abb311573c2ee1f4902a5ad +"through2-filter@npm:^3.0.0": + version: 3.0.0 + resolution: "through2-filter@npm:3.0.0" + dependencies: + through2: ~2.0.0 + xtend: ~4.0.0 + checksum: 2fa0f042290749824b973c27ae006f9dfe7c9bcee570504ab066998e3bd7d43bea28b642eef8a4434dbfd0a7cd18c8823ac81927614234fd477ccd5ea38fab18 languageName: node linkType: hard -"wonka@npm:^6.3.2": - version: 6.3.4 - resolution: "wonka@npm:6.3.4" - checksum: 6bb57955cb2982fb469a7824484e6854b436f89a7f10b6a981348789d88fbc944665771adc4cc404f62416417eb47ab2b8657d898e5301ccd4a53eaac6a10508 +"through2@npm:^2.0.0, through2@npm:^2.0.1, through2@npm:^2.0.3, through2@npm:~2.0.0": + version: 2.0.5 + resolution: "through2@npm:2.0.5" + dependencies: + readable-stream: ~2.3.6 + xtend: ~4.0.1 + checksum: beb0f338aa2931e5660ec7bf3ad949e6d2e068c31f4737b9525e5201b824ac40cac6a337224856b56bd1ddd866334bbfb92a9f57cd6f66bc3f18d3d86fc0fe50 languageName: node linkType: hard -"word-wrap@npm:~1.2.3": - version: 1.2.5 - resolution: "word-wrap@npm:1.2.5" - checksum: f93ba3586fc181f94afdaff3a6fef27920b4b6d9eaefed0f428f8e07adea2a7f54a5f2830ce59406c8416f033f86902b91eb824072354645eea687dff3691ccb +"through2@npm:^4.0.0": + version: 4.0.2 + resolution: "through2@npm:4.0.2" + dependencies: + readable-stream: 3 + checksum: ac7430bd54ccb7920fd094b1c7ff3e1ad6edd94202e5528331253e5fde0cc56ceaa690e8df9895de2e073148c52dfbe6c4db74cacae812477a35660090960cc0 languageName: node linkType: hard -"wordwrap@npm:^1.0.0": - version: 1.0.0 - resolution: "wordwrap@npm:1.0.0" - checksum: 2a44b2788165d0a3de71fd517d4880a8e20ea3a82c080ce46e294f0b68b69a2e49cff5f99c600e275c698a90d12c5ea32aff06c311f0db2eb3f1201f3e7b2a04 +"through@npm:>=2.2.7 <3": + version: 2.3.8 + resolution: "through@npm:2.3.8" + checksum: a38c3e059853c494af95d50c072b83f8b676a9ba2818dcc5b108ef252230735c54e0185437618596c790bbba8fcdaef5b290405981ffa09dce67b1f1bf190cbd languageName: node linkType: hard -"workbox-background-sync@npm:6.6.0": - version: 6.6.0 - resolution: "workbox-background-sync@npm:6.6.0" +"to-absolute-glob@npm:^2.0.0": + version: 2.0.2 + resolution: "to-absolute-glob@npm:2.0.2" dependencies: - idb: ^7.0.1 - workbox-core: 6.6.0 - checksum: ac2990110643aef62ca0be54e962296de7b09593b0262bd09fe4893978a42fa1f256c6d989ed472a31ae500b2255b80c6678530a6024eafb0b2f3a93a3c94a5f + is-absolute: ^1.0.0 + is-negated-glob: ^1.0.0 + checksum: 0a8bef172909e43d711bfd33792643f2eec35b9109bde927dabfd231e6ad643b7a657f306c93c6e7b89f71d3de74ac94060fe9637bca8c37b036523993664323 languageName: node linkType: hard -"workbox-broadcast-update@npm:6.6.0": - version: 6.6.0 - resolution: "workbox-broadcast-update@npm:6.6.0" - dependencies: - workbox-core: 6.6.0 - checksum: 46a74b3b703244eb363e1731a2d6fe1fb2cd9b82d454733dfc6941fd35b76a852685f56db92408383ac50d564c2fd4282f0c6c4db60ba9beb5f311ea8f944dc7 +"to-readable-stream@npm:^1.0.0": + version: 1.0.0 + resolution: "to-readable-stream@npm:1.0.0" + checksum: 2bd7778490b6214a2c40276065dd88949f4cf7037ce3964c76838b8cb212893aeb9cceaaf4352a4c486e3336214c350270f3263e1ce7a0c38863a715a4d9aeb5 languageName: node linkType: hard -"workbox-build@npm:6.6.0": - version: 6.6.0 - resolution: "workbox-build@npm:6.6.0" +"to-regex-range@npm:^5.0.1": + version: 5.0.1 + resolution: "to-regex-range@npm:5.0.1" dependencies: - "@apideck/better-ajv-errors": ^0.3.1 - "@babel/core": ^7.11.1 - "@babel/preset-env": ^7.11.0 - "@babel/runtime": ^7.11.2 - "@rollup/plugin-babel": ^5.2.0 - "@rollup/plugin-node-resolve": ^11.2.1 - "@rollup/plugin-replace": ^2.4.1 - "@surma/rollup-plugin-off-main-thread": ^2.2.3 - ajv: ^8.6.0 - common-tags: ^1.8.0 - fast-json-stable-stringify: ^2.1.0 - fs-extra: ^9.0.1 - glob: ^7.1.6 - lodash: ^4.17.20 - pretty-bytes: ^5.3.0 - rollup: ^2.43.1 - rollup-plugin-terser: ^7.0.0 - source-map: ^0.8.0-beta.0 - stringify-object: ^3.3.0 - strip-comments: ^2.0.1 - tempy: ^0.6.0 - upath: ^1.2.0 - workbox-background-sync: 6.6.0 - workbox-broadcast-update: 6.6.0 - workbox-cacheable-response: 6.6.0 - workbox-core: 6.6.0 - workbox-expiration: 6.6.0 - workbox-google-analytics: 6.6.0 - workbox-navigation-preload: 6.6.0 - workbox-precaching: 6.6.0 - workbox-range-requests: 6.6.0 - workbox-recipes: 6.6.0 - workbox-routing: 6.6.0 - workbox-strategies: 6.6.0 - workbox-streams: 6.6.0 - workbox-sw: 6.6.0 - workbox-window: 6.6.0 - checksum: cd1a6c413659c2fd66f4438012f65b211cc748bb594c79bf0d9a60de0cefff3f8a4a23ab06f32c62064c37397ffffc1b77d3328658b7556ea7ff88e57f6ee4fd + is-number: ^7.0.0 + checksum: f76fa01b3d5be85db6a2a143e24df9f60dd047d151062d0ba3df62953f2f697b16fe5dad9b0ac6191c7efc7b1d9dcaa4b768174b7b29da89d4428e64bc0a20ed languageName: node linkType: hard -"workbox-cacheable-response@npm:6.6.0": - version: 6.6.0 - resolution: "workbox-cacheable-response@npm:6.6.0" +"to-through@npm:^2.0.0": + version: 2.0.0 + resolution: "to-through@npm:2.0.0" dependencies: - workbox-core: 6.6.0 - checksum: 9e4e00c53679fd2020874cbdf54bb17560fd12353120ea08ca6213e5a11bf08139072616d79f5f8ab80d09f00efde94b003fe9bf5b6e23815be30d7aca760835 - languageName: node - linkType: hard - -"workbox-core@npm:6.6.0": - version: 6.6.0 - resolution: "workbox-core@npm:6.6.0" - checksum: 7d773a866b73a733780c52b895f9cf7bec926c9187395c307174deefba9a0a2fcd1edce0d1ca12b8a6c95ca9cf7755ccc1885b03bc82ebcfc4843e015bd84d7b + through2: ^2.0.3 + checksum: 5834a69d68cbe0d74115373bbe219dbe60c1950021f5ec9dd4af179ffbb307bce3d45fde9dacec05a8f4f79b86734433eb9b42946ccb81d2d4d4f8828628b7e6 languageName: node linkType: hard -"workbox-expiration@npm:6.6.0": - version: 6.6.0 - resolution: "workbox-expiration@npm:6.6.0" - dependencies: - idb: ^7.0.1 - workbox-core: 6.6.0 - checksum: b100b9c512754bc3e1a9c7c7d20d215d72c601a7b956333ca7753704a771a9f00e1732e9b774da4549bae390dd3cd138c6392f6a25fd67f7dcd84f89b0df7e9c +"tr46@npm:~0.0.3": + version: 0.0.3 + resolution: "tr46@npm:0.0.3" + checksum: 726321c5eaf41b5002e17ffbd1fb7245999a073e8979085dacd47c4b4e8068ff5777142fc6726d6ca1fd2ff16921b48788b87225cbc57c72636f6efa8efbffe3 languageName: node linkType: hard -"workbox-google-analytics@npm:6.6.0": - version: 6.6.0 - resolution: "workbox-google-analytics@npm:6.6.0" - dependencies: - workbox-background-sync: 6.6.0 - workbox-core: 6.6.0 - workbox-routing: 6.6.0 - workbox-strategies: 6.6.0 - checksum: 7b287da7517ae416aae8ea1494830bb517a29ab9786b2a8b8bf98971377b83715070e784399065ab101d4bba381ab0abbb8bd0962b3010bc01f54fdafb0b6702 +"trim-newlines@npm:^3.0.0": + version: 3.0.1 + resolution: "trim-newlines@npm:3.0.1" + checksum: b530f3fadf78e570cf3c761fb74fef655beff6b0f84b29209bac6c9622db75ad1417f4a7b5d54c96605dcd72734ad44526fef9f396807b90839449eb543c6206 languageName: node linkType: hard -"workbox-navigation-preload@npm:6.6.0": - version: 6.6.0 - resolution: "workbox-navigation-preload@npm:6.6.0" +"ts-node@npm:^10.8.1": + version: 10.9.2 + resolution: "ts-node@npm:10.9.2" dependencies: - workbox-core: 6.6.0 - checksum: d254465648e45ec6b6d7c3471354336501901d3872622ea9ba1aa1f935d4d52941d0f92fa6c06e7363e10dbac4874d5d4bff7d99cbe094925046f562a37e88cc + "@cspotcode/source-map-support": ^0.8.0 + "@tsconfig/node10": ^1.0.7 + "@tsconfig/node12": ^1.0.7 + "@tsconfig/node14": ^1.0.0 + "@tsconfig/node16": ^1.0.2 + acorn: ^8.4.1 + acorn-walk: ^8.1.1 + arg: ^4.1.0 + create-require: ^1.1.0 + diff: ^4.0.1 + make-error: ^1.1.1 + v8-compile-cache-lib: ^3.0.1 + yn: 3.1.1 + peerDependencies: + "@swc/core": ">=1.2.50" + "@swc/wasm": ">=1.2.50" + "@types/node": "*" + typescript: ">=2.7" + peerDependenciesMeta: + "@swc/core": + optional: true + "@swc/wasm": + optional: true + bin: + ts-node: dist/bin.js + ts-node-cwd: dist/bin-cwd.js + ts-node-esm: dist/bin-esm.js + ts-node-script: dist/bin-script.js + ts-node-transpile-only: dist/bin-transpile.js + ts-script: dist/bin-script-deprecated.js + checksum: fde256c9073969e234526e2cfead42591b9a2aec5222bac154b0de2fa9e4ceb30efcd717ee8bc785a56f3a119bdd5aa27b333d9dbec94ed254bd26f8944c67ac languageName: node linkType: hard -"workbox-precaching@npm:6.6.0": - version: 6.6.0 - resolution: "workbox-precaching@npm:6.6.0" - dependencies: - workbox-core: 6.6.0 - workbox-routing: 6.6.0 - workbox-strategies: 6.6.0 - checksum: 62e5ee2e40568a56d4131bba461623579f56b9bd273aa7d2805e43151057f413c2ef32fb3d007aff0a5ac3ad84d5feae87408284249a487a5d51c3775c46c816 +"tslib@npm:^2.1.0, tslib@npm:^2.3.1": + version: 2.8.1 + resolution: "tslib@npm:2.8.1" + checksum: e4aba30e632b8c8902b47587fd13345e2827fa639e7c3121074d5ee0880723282411a8838f830b55100cbe4517672f84a2472667d355b81e8af165a55dc6203a languageName: node linkType: hard -"workbox-range-requests@npm:6.6.0": - version: 6.6.0 - resolution: "workbox-range-requests@npm:6.6.0" - dependencies: - workbox-core: 6.6.0 - checksum: a55d1a364b2155548695dc8f6f85baade196d7d1bec980bcdbda80236803b14167995a81b944cffe932a94c4d556466773121afe3661a6f0a13403cbe96d8d9f +"tunnel@npm:^0.0.6": + version: 0.0.6 + resolution: "tunnel@npm:0.0.6" + checksum: c362948df9ad34b649b5585e54ce2838fa583aa3037091aaed66793c65b423a264e5229f0d7e9a95513a795ac2bd4cb72cda7e89a74313f182c1e9ae0b0994fa languageName: node linkType: hard -"workbox-recipes@npm:6.6.0": - version: 6.6.0 - resolution: "workbox-recipes@npm:6.6.0" - dependencies: - workbox-cacheable-response: 6.6.0 - workbox-core: 6.6.0 - workbox-expiration: 6.6.0 - workbox-precaching: 6.6.0 - workbox-routing: 6.6.0 - workbox-strategies: 6.6.0 - checksum: f2ecf38502260703e4b0dcef67e3ac26d615f2c90f6d863ca7308db52454f67934ba842fd577ee807d9f510f1a277fd66af7caf57d39e50a181d05dbb3e550a7 +"turbo-darwin-64@npm:2.4.2": + version: 2.4.2 + resolution: "turbo-darwin-64@npm:2.4.2" + conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"workbox-routing@npm:6.6.0": - version: 6.6.0 - resolution: "workbox-routing@npm:6.6.0" - dependencies: - workbox-core: 6.6.0 - checksum: 7a70b836196eb67332d33a94c0b57859781fe869e81a9c95452d3f4f368d3199f8c3da632dbc10425fde902a1930cf8cfd83f6434ad2b586904ce68cd9f35c6d +"turbo-darwin-arm64@npm:2.4.2": + version: 2.4.2 + resolution: "turbo-darwin-arm64@npm:2.4.2" + conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"workbox-strategies@npm:6.6.0": - version: 6.6.0 - resolution: "workbox-strategies@npm:6.6.0" - dependencies: - workbox-core: 6.6.0 - checksum: 236232a77fb4a4847d1e9ae6c7c9bd9c6b9449209baab9d8d90f78240326a9c0f69551b408ebf9e76610d86da15563bf27439b7e885a7bac01dfd08047c0dd7b +"turbo-ignore@npm:1.11.3": + version: 1.11.3 + resolution: "turbo-ignore@npm:1.11.3" + bin: + turbo-ignore: dist/cli.js + checksum: f57862ba5f2cc759a54877c395a03a3ea52396d57b01a418377abe6b677abfd78941b6c7e9db26b728ed8a7c63135490eea075d1603efb6e4834b24474aa0379 languageName: node linkType: hard -"workbox-streams@npm:6.6.0": - version: 6.6.0 - resolution: "workbox-streams@npm:6.6.0" - dependencies: - workbox-core: 6.6.0 - workbox-routing: 6.6.0 - checksum: 64a295e48e44e3fa4743b5baec646fc9117428e7592033475e38c461e45c294910712f322c32417d354b22999902ef8035119e070e61e159e531d878d991fc33 +"turbo-linux-64@npm:2.4.2": + version: 2.4.2 + resolution: "turbo-linux-64@npm:2.4.2" + conditions: os=linux & cpu=x64 languageName: node linkType: hard -"workbox-sw@npm:6.6.0": - version: 6.6.0 - resolution: "workbox-sw@npm:6.6.0" - checksum: bb5f8695de02f89c7955465dcbd568299915565008dc8a068c5d19c1347f75d417640b9f61590e16b169b703e77d02f8b1e10c4b241f74f43cfe76175bfa5fed +"turbo-linux-arm64@npm:2.4.2": + version: 2.4.2 + resolution: "turbo-linux-arm64@npm:2.4.2" + conditions: os=linux & cpu=arm64 languageName: node linkType: hard -"workbox-webpack-plugin@npm:^6.4.1": - version: 6.6.0 - resolution: "workbox-webpack-plugin@npm:6.6.0" - dependencies: - fast-json-stable-stringify: ^2.1.0 - pretty-bytes: ^5.4.1 - upath: ^1.2.0 - webpack-sources: ^1.4.3 - workbox-build: 6.6.0 - peerDependencies: - webpack: ^4.4.0 || ^5.9.0 - checksum: b8e04a342f2d45086f28ae56e4806d74dd153c3b750855533a55954f4e85752113e76a6d79a32206eb697a342725897834c9e7976894374d8698cd950477d37a +"turbo-windows-64@npm:2.4.2": + version: 2.4.2 + resolution: "turbo-windows-64@npm:2.4.2" + conditions: os=win32 & cpu=x64 languageName: node linkType: hard -"workbox-window@npm:6.6.0": - version: 6.6.0 - resolution: "workbox-window@npm:6.6.0" - dependencies: - "@types/trusted-types": ^2.0.2 - workbox-core: 6.6.0 - checksum: bb1dd031c1525317ceffbdc3e4f502a70dce461fd6355146e1050c1090f3c640bf65edf42a5d2a3b91b4d0c313df32c1405d88bf701d44c0e3ebc492cd77fe14 +"turbo-windows-arm64@npm:2.4.2": + version: 2.4.2 + resolution: "turbo-windows-arm64@npm:2.4.2" + conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"workerd@npm:1.20231025.0": - version: 1.20231025.0 - resolution: "workerd@npm:1.20231025.0" - dependencies: - "@cloudflare/workerd-darwin-64": 1.20231025.0 - "@cloudflare/workerd-darwin-arm64": 1.20231025.0 - "@cloudflare/workerd-linux-64": 1.20231025.0 - "@cloudflare/workerd-linux-arm64": 1.20231025.0 - "@cloudflare/workerd-windows-64": 1.20231025.0 +"turbo@npm:2.4.2": + version: 2.4.2 + resolution: "turbo@npm:2.4.2" + dependencies: + turbo-darwin-64: 2.4.2 + turbo-darwin-arm64: 2.4.2 + turbo-linux-64: 2.4.2 + turbo-linux-arm64: 2.4.2 + turbo-windows-64: 2.4.2 + turbo-windows-arm64: 2.4.2 dependenciesMeta: - "@cloudflare/workerd-darwin-64": + turbo-darwin-64: optional: true - "@cloudflare/workerd-darwin-arm64": + turbo-darwin-arm64: + optional: true + turbo-linux-64: optional: true - "@cloudflare/workerd-linux-64": + turbo-linux-arm64: optional: true - "@cloudflare/workerd-linux-arm64": + turbo-windows-64: optional: true - "@cloudflare/workerd-windows-64": + turbo-windows-arm64: optional: true bin: - workerd: bin/workerd - checksum: ca9c119f51ab3ecdaa7a5dc917138e40d97a960101e98018307d224153677ef364229d6f5566927276ac8ef4af7e6734a44e029c7469c4b2cd9e6b9423a71a16 + turbo: bin/turbo + checksum: c9544f00a303566e53c7ee78b68bc90236c73ab50e4a8af2ec71e7852fc91aa3e182dcffe119146c457f084a19ca1544fa7b0766712e1782b3c9085ce5c18b00 languageName: node linkType: hard -"workerpool@npm:6.2.1": - version: 6.2.1 - resolution: "workerpool@npm:6.2.1" - checksum: c2c6eebbc5225f10f758d599a5c016fa04798bcc44e4c1dffb34050cd361d7be2e97891aa44419e7afe647b1f767b1dc0b85a5e046c409d890163f655028b09d +"type-fest@npm:^0.18.0": + version: 0.18.1 + resolution: "type-fest@npm:0.18.1" + checksum: e96dcee18abe50ec82dab6cbc4751b3a82046da54c52e3b2d035b3c519732c0b3dd7a2fa9df24efd1a38d953d8d4813c50985f215f1957ee5e4f26b0fe0da395 languageName: node linkType: hard -"wrangler@npm:3.15.0": - version: 3.15.0 - resolution: "wrangler@npm:3.15.0" - dependencies: - "@cloudflare/kv-asset-handler": ^0.2.0 - "@esbuild-plugins/node-globals-polyfill": ^0.2.3 - "@esbuild-plugins/node-modules-polyfill": ^0.2.2 - blake3-wasm: ^2.1.5 - chokidar: ^3.5.3 - esbuild: 0.17.19 - fsevents: ~2.3.2 - miniflare: 3.20231025.0 - nanoid: ^3.3.3 - path-to-regexp: ^6.2.0 - resolve.exports: ^2.0.2 - selfsigned: ^2.0.1 - source-map: 0.6.1 - source-map-support: 0.5.21 - xxhash-wasm: ^1.0.1 - dependenciesMeta: - fsevents: - optional: true - bin: - wrangler: bin/wrangler.js - wrangler2: bin/wrangler.js - checksum: 058c505c58bce8387bfd8fe051a8a9e50e5f7b564db15c07c33fcd7137f3dcc67f5bf507db1acb054ad54044d0e8756e08264e70c04722dd2be19f1e03d18a01 +"type-fest@npm:^0.6.0": + version: 0.6.0 + resolution: "type-fest@npm:0.6.0" + checksum: b2188e6e4b21557f6e92960ec496d28a51d68658018cba8b597bd3ef757721d1db309f120ae987abeeda874511d14b776157ff809f23c6d1ce8f83b9b2b7d60f languageName: node linkType: hard -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0, wrap-ansi@npm:^7.0.0": - version: 7.0.0 - resolution: "wrap-ansi@npm:7.0.0" - dependencies: - ansi-styles: ^4.0.0 - string-width: ^4.1.0 - strip-ansi: ^6.0.0 - checksum: a790b846fd4505de962ba728a21aaeda189b8ee1c7568ca5e817d85930e06ef8d1689d49dbf0e881e8ef84436af3a88bc49115c2e2788d841ff1b8b5b51a608b +"type-fest@npm:^0.8.1": + version: 0.8.1 + resolution: "type-fest@npm:0.8.1" + checksum: d61c4b2eba24009033ae4500d7d818a94fd6d1b481a8111612ee141400d5f1db46f199c014766b9fa9b31a6a7374d96fc748c6d688a78a3ce5a33123839becb7 languageName: node linkType: hard -"wrap-ansi@npm:^6.0.1, wrap-ansi@npm:^6.2.0": - version: 6.2.0 - resolution: "wrap-ansi@npm:6.2.0" - dependencies: - ansi-styles: ^4.0.0 - string-width: ^4.1.0 - strip-ansi: ^6.0.0 - checksum: 6cd96a410161ff617b63581a08376f0cb9162375adeb7956e10c8cd397821f7eb2a6de24eb22a0b28401300bf228c86e50617cd568209b5f6775b93c97d2fe3a +"typescript@npm:5.3.3": + version: 5.3.3 + resolution: "typescript@npm:5.3.3" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 2007ccb6e51bbbf6fde0a78099efe04dc1c3dfbdff04ca3b6a8bc717991862b39fd6126c0c3ebf2d2d98ac5e960bcaa873826bb2bb241f14277034148f41f6a2 languageName: node linkType: hard -"wrap-ansi@npm:^8.0.1, wrap-ansi@npm:^8.1.0": - version: 8.1.0 - resolution: "wrap-ansi@npm:8.1.0" - dependencies: - ansi-styles: ^6.1.0 - string-width: ^5.0.1 - strip-ansi: ^7.0.1 - checksum: 371733296dc2d616900ce15a0049dca0ef67597d6394c57347ba334393599e800bab03c41d4d45221b6bc967b8c453ec3ae4749eff3894202d16800fdfe0e238 +"typescript@patch:typescript@npm%3A5.3.3#~builtin": + version: 5.3.3 + resolution: "typescript@patch:typescript@npm%3A5.3.3#~builtin::version=5.3.3&hash=701156" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: f61375590b3162599f0f0d5b8737877ac0a7bc52761dbb585d67e7b8753a3a4c42d9a554c4cc929f591ffcf3a2b0602f65ae3ce74714fd5652623a816862b610 languageName: node linkType: hard -"wrappy@npm:1": - version: 1.0.2 - resolution: "wrappy@npm:1.0.2" - checksum: 159da4805f7e84a3d003d8841557196034155008f817172d4e986bd591f74aa82aa7db55929a54222309e01079a65a92a9e6414da5a6aa4b01ee44a511ac3ee5 +"unc-path-regex@npm:^0.1.2": + version: 0.1.2 + resolution: "unc-path-regex@npm:0.1.2" + checksum: a05fa2006bf4606051c10fc7968f08ce7b28fa646befafa282813aeb1ac1a56f65cb1b577ca7851af2726198d59475bb49b11776036257b843eaacee2860a4ec languageName: node linkType: hard -"write-file-atomic@npm:^2.0.0, write-file-atomic@npm:^2.3.0": - version: 2.4.3 - resolution: "write-file-atomic@npm:2.4.3" +"underscore.string@npm:~3.3.4": + version: 3.3.6 + resolution: "underscore.string@npm:3.3.6" dependencies: - graceful-fs: ^4.1.11 - imurmurhash: ^0.1.4 - signal-exit: ^3.0.2 - checksum: 2db81f92ae974fd87ab4a5e7932feacaca626679a7c98fcc73ad8fcea5a1950eab32fa831f79e9391ac99b562ca091ad49be37a79045bd65f595efbb8f4596ae + sprintf-js: ^1.1.1 + util-deprecate: ^1.0.2 + checksum: b7719c30e5d1fdda4ee9379e8d80dca2b0668942420ba365ae3410120e08225fe36707a7981ce0f921812dee6a2290b713cdce1e75e770b98e67a45d8a378d35 languageName: node linkType: hard -"write-file-atomic@npm:^3.0.0": - version: 3.0.3 - resolution: "write-file-atomic@npm:3.0.3" - dependencies: - imurmurhash: ^0.1.4 - is-typedarray: ^1.0.0 - signal-exit: ^3.0.2 - typedarray-to-buffer: ^3.1.5 - checksum: c55b24617cc61c3a4379f425fc62a386cc51916a9b9d993f39734d005a09d5a4bb748bc251f1304e7abd71d0a26d339996c275955f527a131b1dcded67878280 +"undici-types@npm:~6.20.0": + version: 6.20.0 + resolution: "undici-types@npm:6.20.0" + checksum: b7bc50f012dc6afbcce56c9fd62d7e86b20a62ff21f12b7b5cbf1973b9578d90f22a9c7fe50e638e96905d33893bf2f9f16d98929c4673c2480de05c6c96ea8b languageName: node linkType: hard -"write-file-atomic@npm:^4.0.2": - version: 4.0.2 - resolution: "write-file-atomic@npm:4.0.2" +"undici@npm:^5.25.4": + version: 5.28.4 + resolution: "undici@npm:5.28.4" dependencies: - imurmurhash: ^0.1.4 - signal-exit: ^3.0.7 - checksum: 5da60bd4eeeb935eec97ead3df6e28e5917a6bd317478e4a85a5285e8480b8ed96032bbcc6ecd07b236142a24f3ca871c924ec4a6575e623ec1b11bf8c1c253c + "@fastify/busboy": ^2.0.0 + checksum: a8193132d84540e4dc1895ecc8dbaa176e8a49d26084d6fbe48a292e28397cd19ec5d13bc13e604484e76f94f6e334b2bdc740d5f06a6e50c44072818d0c19f9 languageName: node linkType: hard -"ws@npm:7.4.6": - version: 7.4.6 - resolution: "ws@npm:7.4.6" - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - checksum: 3a990b32ed08c72070d5e8913e14dfcd831919205be52a3ff0b4cdd998c8d554f167c9df3841605cde8b11d607768cacab3e823c58c96a5c08c987e093eb767a +"unique-stream@npm:^2.0.2": + version: 2.3.1 + resolution: "unique-stream@npm:2.3.1" + dependencies: + json-stable-stringify-without-jsonify: ^1.0.1 + through2-filter: ^3.0.0 + checksum: 65e433e68e46640e9283dbb022493c8d79ed1dac47807fe751dfe3bd50586927f63ad880ce9e01c2f85911f3caca48d04731aff6f07869434d5f76ecfe478559 languageName: node linkType: hard -"ws@npm:8.13.0": - version: 8.13.0 - resolution: "ws@npm:8.13.0" - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ">=5.0.2" - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - checksum: 53e991bbf928faf5dc6efac9b8eb9ab6497c69feeb94f963d648b7a3530a720b19ec2e0ec037344257e05a4f35bd9ad04d9de6f289615ffb133282031b18c61c +"universal-user-agent@npm:^6.0.0": + version: 6.0.0 + resolution: "universal-user-agent@npm:6.0.0" + checksum: 5092bbc80dd0d583cef0b62c17df0043193b74f425112ea6c1f69bc5eda21eeec7a08d8c4f793a277eb2202ffe9b44bec852fa3faff971234cd209874d1b79ef languageName: node linkType: hard -"ws@npm:8.18.0, ws@npm:^8.11.0, ws@npm:^8.12.0, ws@npm:^8.12.1, ws@npm:^8.13.0, ws@npm:^8.18.0, ws@npm:^8.2.3": - version: 8.18.0 - resolution: "ws@npm:8.18.0" - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ">=5.0.2" - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - checksum: 91d4d35bc99ff6df483bdf029b9ea4bfd7af1f16fc91231a96777a63d263e1eabf486e13a2353970efc534f9faa43bdbf9ee76525af22f4752cbc5ebda333975 +"universalify@npm:^0.1.0": + version: 0.1.2 + resolution: "universalify@npm:0.1.2" + checksum: 40cdc60f6e61070fe658ca36016a8f4ec216b29bf04a55dce14e3710cc84c7448538ef4dad3728d0bfe29975ccd7bfb5f414c45e7b78883567fb31b246f02dff languageName: node linkType: hard -"ws@npm:^5.2.0 || ^6.0.0 || ^7.0.0, ws@npm:^7, ws@npm:^7.3.1, ws@npm:^7.4.6, ws@npm:^7.5.1, ws@npm:^7.5.10": - version: 7.5.10 - resolution: "ws@npm:7.5.10" - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - checksum: f9bb062abf54cc8f02d94ca86dcd349c3945d63851f5d07a3a61c2fcb755b15a88e943a63cf580cbdb5b74436d67ef6b67f745b8f7c0814e411379138e1863cb +"universalify@npm:^2.0.0": + version: 2.0.0 + resolution: "universalify@npm:2.0.0" + checksum: 2406a4edf4a8830aa6813278bab1f953a8e40f2f63a37873ffa9a3bc8f9745d06cc8e88f3572cb899b7e509013f7f6fcc3e37e8a6d914167a5381d8440518c44 languageName: node linkType: hard -"ws@npm:^6.2.3": - version: 6.2.3 - resolution: "ws@npm:6.2.3" +"universe@workspace:.": + version: 0.0.0-use.local + resolution: "universe@workspace:." + dependencies: + "@actions/core": 1.10.1 + "@commitlint/cli": 17.5.0 + "@commitlint/config-conventional": 17.4.4 + "@crowdin/cli": 3.14.0 + "@ethersproject/keccak256": 5.7.0 + "@manypkg/cli": 0.19.2 + danger: 11.2.6 + depcheck: 1.4.7 + dotenv-cli: 7.1.0 + husky: 8.0.3 + i18next: 23.10.0 + i18next-parser: 8.6.0 + js-yaml: 4.1.0 + moti: 0.29.0 + prettier: 3.3.2 + prettier-plugin-organize-imports: 3.2.4 + syncpack: 8.5.14 + turbo: 2.4.2 + turbo-ignore: 1.11.3 + languageName: unknown + linkType: soft + +"url-parse-lax@npm:^3.0.0": + version: 3.0.0 + resolution: "url-parse-lax@npm:3.0.0" dependencies: - async-limiter: ~1.0.0 - checksum: bbc96ff5628832d80669a88fd117487bf070492dfaa50df77fa442a2b119792e772f4365521e0a8e025c0d51173c54fa91adab165c11b8e0674685fdd36844a5 + prepend-http: ^2.0.0 + checksum: 1040e357750451173132228036aff1fd04abbd43eac1fb3e4fca7495a078bcb8d33cb765fe71ad7e473d9c94d98fd67adca63bd2716c815a2da066198dd37217 languageName: node linkType: hard -"ws@npm:~8.11.0": - version: 8.11.0 - resolution: "ws@npm:8.11.0" - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - checksum: 316b33aba32f317cd217df66dbfc5b281a2f09ff36815de222bc859e3424d83766d9eb2bd4d667de658b6ab7be151f258318fb1da812416b30be13103e5b5c67 +"util-deprecate@npm:^1.0.1, util-deprecate@npm:^1.0.2, util-deprecate@npm:~1.0.1": + version: 1.0.2 + resolution: "util-deprecate@npm:1.0.2" + checksum: 474acf1146cb2701fe3b074892217553dfcf9a031280919ba1b8d651a068c9b15d863b7303cb15bd00a862b498e6cf4ad7b4a08fb134edd5a6f7641681cb54a2 languageName: node linkType: hard -"x-is-string@npm:^0.1.0": - version: 0.1.0 - resolution: "x-is-string@npm:0.1.0" - checksum: 38acefe5ae2dd48339996f732c55f55d4b1c1d3f65c02116639989d8a49dd06daca3e907accfc56aac84f23372c88b83af0efc849cc62e702c81aae4de44c0d6 +"uuid@npm:^8.3.2": + version: 8.3.2 + resolution: "uuid@npm:8.3.2" + bin: + uuid: dist/bin/uuid + checksum: 5575a8a75c13120e2f10e6ddc801b2c7ed7d8f3c8ac22c7ed0c7b2ba6383ec0abda88c905085d630e251719e0777045ae3236f04c812184b7c765f63a70e58df languageName: node linkType: hard -"xcase@npm:^2.0.1": - version: 2.0.1 - resolution: "xcase@npm:2.0.1" - checksum: 1d407306593f1049ebb5d3b7b86b0d40b4b108be428cf4d17c57454ef5444c962555c387384c121d83a6bcf7a9b6b04a51cc4b76786bfb0fac8d0a108b5b7ef8 +"v8-compile-cache-lib@npm:^3.0.1": + version: 3.0.1 + resolution: "v8-compile-cache-lib@npm:3.0.1" + checksum: 78089ad549e21bcdbfca10c08850022b22024cdcc2da9b168bcf5a73a6ed7bf01a9cebb9eac28e03cd23a684d81e0502797e88f3ccd27a32aeab1cfc44c39da0 languageName: node linkType: hard -"xcode@npm:^2.0.0": - version: 2.1.0 - resolution: "xcode@npm:2.1.0" +"validate-npm-package-license@npm:^3.0.1": + version: 3.0.4 + resolution: "validate-npm-package-license@npm:3.0.4" dependencies: - simple-plist: ^1.0.0 - uuid: ^3.3.2 - checksum: aaa4569f96411f3a024abfa9fb27f2b1dfcf0544b91d2a8b63a36214042b4560dc455942abd9b95836cdd24386d4a6731faf339e32b496b46b4ca810a1dea0e1 + spdx-correct: ^3.0.0 + spdx-expression-parse: ^3.0.0 + checksum: 35703ac889d419cf2aceef63daeadbe4e77227c39ab6287eeb6c1b36a746b364f50ba22e88591f5d017bc54685d8137bc2d328d0a896e4d3fd22093c0f32a9ad languageName: node linkType: hard -"xcode@npm:^3.0.1": - version: 3.0.1 - resolution: "xcode@npm:3.0.1" +"validate-npm-package-name@npm:^3.0.0": + version: 3.0.0 + resolution: "validate-npm-package-name@npm:3.0.0" dependencies: - simple-plist: ^1.1.0 - uuid: ^7.0.3 - checksum: 908ff85851f81aec6e36ca24427db092e1cc068f052716e14de5e762196858039efabbe053a1abe8920184622501049e74a93618e8692b982f7604a9847db108 + builtins: ^1.0.3 + checksum: ce4c68207abfb22c05eedb09ff97adbcedc80304a235a0844f5344f1fd5086aa80e4dbec5684d6094e26e35065277b765c1caef68bcea66b9056761eddb22967 languageName: node linkType: hard -"xdg-basedir@npm:^3.0.0": +"value-or-function@npm:^3.0.0": version: 3.0.0 - resolution: "xdg-basedir@npm:3.0.0" - checksum: 60d613dcb09b1198c70cb442979825531c605ac7861a8a6131304207d2962020dbb23660ac7e1be324fb9e4111a51a6206d875148d3e98df47a7d1869fa1515f + resolution: "value-or-function@npm:3.0.0" + checksum: 2b901d05b82deb8565d4edeba02e0737be73e7fb2c640b79fa64152aae8b450f790a46c86bf7039f91938c1b69d2cc0908cd18c4695b120293bb442179061fac languageName: node linkType: hard -"xhr@npm:^2.0.1": - version: 2.6.0 - resolution: "xhr@npm:2.6.0" +"vinyl-fs@npm:^3.0.2": + version: 3.0.3 + resolution: "vinyl-fs@npm:3.0.3" dependencies: - global: ~4.4.0 - is-function: ^1.0.1 - parse-headers: ^2.0.0 - xtend: ^4.0.0 - checksum: a1db277e37737caf3ed363d2a33ce4b4ea5b5fc190b663a6f70bc252799185b840ccaa166eaeeea4841c9c60b87741f0a24e29cbcf6708dd425986d4df186d2f + fs-mkdirp-stream: ^1.0.0 + glob-stream: ^6.1.0 + graceful-fs: ^4.0.0 + is-valid-glob: ^1.0.0 + lazystream: ^1.0.0 + lead: ^1.0.0 + object.assign: ^4.0.4 + pumpify: ^1.3.5 + readable-stream: ^2.3.3 + remove-bom-buffer: ^3.0.0 + remove-bom-stream: ^1.2.0 + resolve-options: ^1.1.0 + through2: ^2.0.0 + to-through: ^2.0.0 + value-or-function: ^3.0.0 + vinyl: ^2.0.0 + vinyl-sourcemap: ^1.1.0 + checksum: 948366325994e13e331bc559ac38d10bff9469eeb227e627cc903cb7580c73779158c7b25dd7ac416df2fc261cdd5341896e680c086de693de71420ccbdb9cd5 languageName: node linkType: hard -"xml-formatter@npm:^3.6.3": - version: 3.6.3 - resolution: "xml-formatter@npm:3.6.3" +"vinyl-sourcemap@npm:^1.1.0": + version: 1.1.0 + resolution: "vinyl-sourcemap@npm:1.1.0" dependencies: - xml-parser-xo: ^4.1.2 - checksum: e4c6927d30de9e82f69ea1752d93b9e31e5eb308c2261e039272a04cdf1120a03cf01aea5cbb01c4197a1dee9dc67b04bf91a24acd6a1abe52b4fcb7ac843086 + append-buffer: ^1.0.2 + convert-source-map: ^1.5.0 + graceful-fs: ^4.1.6 + normalize-path: ^2.1.1 + now-and-later: ^2.0.0 + remove-bom-buffer: ^3.0.0 + vinyl: ^2.0.0 + checksum: e7174851faff44ffd0f91d4d7234a0c153cad7da9c142e5ef46b4a24fe5ab0c98c997db7c719919cbab28edb4b9cf9ec3d7fed8460f047b3d640740a613ec944 languageName: node linkType: hard -"xml-name-validator@npm:^4.0.0": - version: 4.0.0 - resolution: "xml-name-validator@npm:4.0.0" - checksum: af100b79c29804f05fa35aa3683e29a321db9b9685d5e5febda3fa1e40f13f85abc40f45a6b2bf7bee33f68a1dc5e8eaef4cec100a304a9db565e6061d4cb5ad +"vinyl@npm:^2.0.0": + version: 2.2.1 + resolution: "vinyl@npm:2.2.1" + dependencies: + clone: ^2.1.1 + clone-buffer: ^1.0.0 + clone-stats: ^1.0.0 + cloneable-readable: ^1.0.0 + remove-trailing-separator: ^1.0.1 + replace-ext: ^1.0.0 + checksum: 1f663973f1362f2d074b554f79ff7673187667082373b3d3e628beb1fc2a7ff33024f10b492fbd8db421a09ea3b7b22c3d3de4a0f0e73ead7b4685af570b906f languageName: node linkType: hard -"xml-parse-from-string@npm:^1.0.0": - version: 1.0.1 - resolution: "xml-parse-from-string@npm:1.0.1" - checksum: 5155cb98e428409829f4060ce542c55438b2f7646d11fd306d850eaf12d35c06ffd9e86d76aa5230121a533b958fd1a319d6f90a5c113391853d0ff01f4da7bb +"vinyl@npm:~3.0.0": + version: 3.0.0 + resolution: "vinyl@npm:3.0.0" + dependencies: + clone: ^2.1.2 + clone-stats: ^1.0.0 + remove-trailing-separator: ^1.1.0 + replace-ext: ^2.0.0 + teex: ^1.0.1 + checksum: 29c563d6a027d49ec216bc8259b494bd048d1f9df39103aea6877e02af1d0a6956b11ad977206b5a807b331ef5431bed9f6b8890de5e55188389d31cf7af7fbe languageName: node linkType: hard -"xml-parser-xo@npm:^4.1.2": - version: 4.1.3 - resolution: "xml-parser-xo@npm:4.1.3" - checksum: b7d271f9405deb05c51d3ce0b92e13ef9d8c1220c35ad128c95decec5139deed88017dd3ba3345d1923bf717af3721383e2f8c4c5338c042468f7c961a9805ad +"vue-template-compiler@npm:^2.6.11": + version: 2.6.14 + resolution: "vue-template-compiler@npm:2.6.14" + dependencies: + de-indent: ^1.0.2 + he: ^1.1.0 + checksum: 0d03f804ac97e26629c78219929596cfd98f522e1f13b16dd42f13e3fff09b85fb8252ef3486e9d62ca7993f576386f587e760df0506230fa87141fdac8275ea languageName: node linkType: hard -"xml2js@npm:0.5.0": - version: 0.5.0 - resolution: "xml2js@npm:0.5.0" +"walk-sync@npm:^2.2.0": + version: 2.2.0 + resolution: "walk-sync@npm:2.2.0" dependencies: - sax: ">=0.6.0" - xmlbuilder: ~11.0.0 - checksum: 1aa71d62e5bc2d89138e3929b9ea46459157727759cbc62ef99484b778641c0cd21fb637696c052d901a22f82d092a3e740a16b4ce218e81ac59b933535124ea + "@types/minimatch": ^3.0.3 + ensure-posix-path: ^1.1.0 + matcher-collection: ^2.0.0 + minimatch: ^3.0.4 + checksum: e579b574f769977a739607d4feba40ded8931ff641f26964ea5a10a280d648d1c1aca260e9ab60288f16d69500ff33687d3ba5fa4dbd427090123189f0f0c9b6 languageName: node linkType: hard -"xmlbuilder@npm:^14.0.0": - version: 14.0.0 - resolution: "xmlbuilder@npm:14.0.0" - checksum: 9e93d3c73957dbb21acde63afa5d241b19057bdbdca9d53534d8351e70f1d5c9db154e3ca19bd3e9ea84c082539ab6e7845591c8778a663e8b5d3470d5427a8b +"webidl-conversions@npm:^3.0.0": + version: 3.0.1 + resolution: "webidl-conversions@npm:3.0.1" + checksum: c92a0a6ab95314bde9c32e1d0a6dfac83b578f8fa5f21e675bc2706ed6981bc26b7eb7e6a1fab158e5ce4adf9caa4a0aee49a52505d4d13c7be545f15021b17c languageName: node linkType: hard -"xmlbuilder@npm:^15.1.1": - version: 15.1.1 - resolution: "xmlbuilder@npm:15.1.1" - checksum: 14f7302402e28d1f32823583d121594a9dca36408d40320b33f598bd589ca5163a352d076489c9c64d2dc1da19a790926a07bf4191275330d4de2b0d85bb1843 +"whatwg-url@npm:^5.0.0": + version: 5.0.0 + resolution: "whatwg-url@npm:5.0.0" + dependencies: + tr46: ~0.0.3 + webidl-conversions: ^3.0.0 + checksum: b8daed4ad3356cc4899048a15b2c143a9aed0dfae1f611ebd55073310c7b910f522ad75d727346ad64203d7e6c79ef25eafd465f4d12775ca44b90fa82ed9e2c languageName: node linkType: hard -"xmlbuilder@npm:~11.0.0": - version: 11.0.1 - resolution: "xmlbuilder@npm:11.0.1" - checksum: 7152695e16f1a9976658215abab27e55d08b1b97bca901d58b048d2b6e106b5af31efccbdecf9b07af37c8377d8e7e821b494af10b3a68b0ff4ae60331b415b0 +"which@npm:^1.2.14, which@npm:^1.2.9": + version: 1.3.1 + resolution: "which@npm:1.3.1" + dependencies: + isexe: ^2.0.0 + bin: + which: ./bin/which + checksum: f2e185c6242244b8426c9df1510e86629192d93c1a986a7d2a591f2c24869e7ffd03d6dac07ca863b2e4c06f59a4cc9916c585b72ee9fa1aa609d0124df15e04 languageName: node linkType: hard -"xmlchars@npm:^2.2.0": - version: 2.2.0 - resolution: "xmlchars@npm:2.2.0" - checksum: 8c70ac94070ccca03f47a81fcce3b271bd1f37a591bf5424e787ae313fcb9c212f5f6786e1fa82076a2c632c0141552babcd85698c437506dfa6ae2d58723062 +"which@npm:^2.0.1": + version: 2.0.2 + resolution: "which@npm:2.0.2" + dependencies: + isexe: ^2.0.0 + bin: + node-which: ./bin/node-which + checksum: 1a5c563d3c1b52d5f893c8b61afe11abc3bab4afac492e8da5bde69d550de701cf9806235f20a47b5c8fa8a1d6a9135841de2596535e998027a54589000e66d1 languageName: node linkType: hard -"xmlhttprequest-ssl@npm:~2.0.0": - version: 2.0.0 - resolution: "xmlhttprequest-ssl@npm:2.0.0" - checksum: 1e98df67f004fec15754392a131343ea92e6ab5ac4d77e842378c5c4e4fd5b6a9134b169d96842cc19422d77b1606b8df84a5685562b3b698cb68441636f827e +"wrap-ansi@npm:^7.0.0": + version: 7.0.0 + resolution: "wrap-ansi@npm:7.0.0" + dependencies: + ansi-styles: ^4.0.0 + string-width: ^4.1.0 + strip-ansi: ^6.0.0 + checksum: a790b846fd4505de962ba728a21aaeda189b8ee1c7568ca5e817d85930e06ef8d1689d49dbf0e881e8ef84436af3a88bc49115c2e2788d841ff1b8b5b51a608b languageName: node linkType: hard -"xtend@npm:^4.0.0, xtend@npm:^4.0.1, xtend@npm:^4.0.2, xtend@npm:~4.0.0, xtend@npm:~4.0.1": - version: 4.0.2 - resolution: "xtend@npm:4.0.2" - checksum: ac5dfa738b21f6e7f0dd6e65e1b3155036d68104e67e5d5d1bde74892e327d7e5636a076f625599dc394330a731861e87343ff184b0047fef1360a7ec0a5a36a +"wrappy@npm:1": + version: 1.0.2 + resolution: "wrappy@npm:1.0.2" + checksum: 159da4805f7e84a3d003d8841557196034155008f817172d4e986bd591f74aa82aa7db55929a54222309e01079a65a92a9e6414da5a6aa4b01ee44a511ac3ee5 languageName: node linkType: hard -"xxhash-wasm@npm:^1.0.1": - version: 1.0.2 - resolution: "xxhash-wasm@npm:1.0.2" - checksum: 11fec6e6196e37ad96cc958b7a4477dc30caf5b4da889a02a84f6f663ab8cd3c9be6ae405e66f0af0404301f27c39375191c5254f0409a793020e2093afd1409 +"xcase@npm:^2.0.1": + version: 2.0.1 + resolution: "xcase@npm:2.0.1" + checksum: 1d407306593f1049ebb5d3b7b86b0d40b4b108be428cf4d17c57454ef5444c962555c387384c121d83a6bcf7a9b6b04a51cc4b76786bfb0fac8d0a108b5b7ef8 languageName: node linkType: hard -"y18n@npm:^4.0.0": - version: 4.0.3 - resolution: "y18n@npm:4.0.3" - checksum: 014dfcd9b5f4105c3bb397c1c8c6429a9df004aa560964fb36732bfb999bfe83d45ae40aeda5b55d21b1ee53d8291580a32a756a443e064317953f08025b1aa4 +"xtend@npm:~4.0.0, xtend@npm:~4.0.1": + version: 4.0.2 + resolution: "xtend@npm:4.0.2" + checksum: ac5dfa738b21f6e7f0dd6e65e1b3155036d68104e67e5d5d1bde74892e327d7e5636a076f625599dc394330a731861e87343ff184b0047fef1360a7ec0a5a36a languageName: node linkType: hard @@ -48808,7 +6131,7 @@ __metadata: languageName: node linkType: hard -"yallist@npm:^3.0.0, yallist@npm:^3.0.2, yallist@npm:^3.1.1": +"yallist@npm:^3.0.0, yallist@npm:^3.1.1": version: 3.1.1 resolution: "yallist@npm:3.1.1" checksum: 48f7bb00dc19fc635a13a39fe547f527b10c9290e7b3e836b9a8f1ca04d4d342e85714416b3c2ab74949c9c66f9cebb0473e6bc353b79035356103b47641285d @@ -48822,13 +6145,6 @@ __metadata: languageName: node linkType: hard -"yaml-ast-parser@npm:^0.0.43": - version: 0.0.43 - resolution: "yaml-ast-parser@npm:0.0.43" - checksum: fb5df4c067b6ccbd00953a46faf6ff27f0e290d623c712dc41f330251118f110e22cfd184bbff498bd969cbcda3cd27e0f9d0adb9e6d90eb60ccafc0d8e28077 - languageName: node - linkType: hard - "yaml@npm:2.2.2": version: 2.2.2 resolution: "yaml@npm:2.2.2" @@ -48836,30 +6152,6 @@ __metadata: languageName: node linkType: hard -"yamux-js@npm:0.1.2": - version: 0.1.2 - resolution: "yamux-js@npm:0.1.2" - checksum: 6c0ba09d55d0176a15d7ef5bc7dfc7bda87f7dd50abb5bd268d8e026a8af33ff3bdb20c4537662b062b1cb7c2c103d2554beba4bd66bd9d1d6f8dec9cedcae85 - languageName: node - linkType: hard - -"yargs-parser@npm:20.2.4": - version: 20.2.4 - resolution: "yargs-parser@npm:20.2.4" - checksum: d251998a374b2743a20271c2fd752b9fbef24eb881d53a3b99a7caa5e8227fcafd9abf1f345ac5de46435821be25ec12189a11030c12ee6481fef6863ed8b924 - languageName: node - linkType: hard - -"yargs-parser@npm:^18.1.2": - version: 18.1.3 - resolution: "yargs-parser@npm:18.1.3" - dependencies: - camelcase: ^5.0.0 - decamelize: ^1.2.0 - checksum: 60e8c7d1b85814594d3719300ecad4e6ae3796748b0926137bfec1f3042581b8646d67e83c6fc80a692ef08b8390f21ddcacb9464476c39bbdf52e34961dd4d9 - languageName: node - linkType: hard - "yargs-parser@npm:^20.2.2, yargs-parser@npm:^20.2.3": version: 20.2.9 resolution: "yargs-parser@npm:20.2.9" @@ -48874,19 +6166,7 @@ __metadata: languageName: node linkType: hard -"yargs-unparser@npm:2.0.0": - version: 2.0.0 - resolution: "yargs-unparser@npm:2.0.0" - dependencies: - camelcase: ^6.0.0 - decamelize: ^4.0.0 - flat: ^5.0.2 - is-plain-obj: ^2.1.0 - checksum: 68f9a542c6927c3768c2f16c28f71b19008710abd6b8f8efbac6dcce26bbb68ab6503bed1d5994bdbc2df9a5c87c161110c1dfe04c6a3fe5c6ad1b0e15d9a8a3 - languageName: node - linkType: hard - -"yargs@npm:16.2.0, yargs@npm:^16.2.0": +"yargs@npm:^16.2.0": version: 16.2.0 resolution: "yargs@npm:16.2.0" dependencies: @@ -48901,26 +6181,7 @@ __metadata: languageName: node linkType: hard -"yargs@npm:^15.1.0, yargs@npm:^15.3.1": - version: 15.4.1 - resolution: "yargs@npm:15.4.1" - dependencies: - cliui: ^6.0.0 - decamelize: ^1.2.0 - find-up: ^4.1.0 - get-caller-file: ^2.0.1 - require-directory: ^2.1.1 - require-main-filename: ^2.0.0 - set-blocking: ^2.0.0 - string-width: ^4.2.0 - which-module: ^2.0.0 - y18n: ^4.0.0 - yargs-parser: ^18.1.2 - checksum: 40b974f508d8aed28598087720e086ecd32a5fd3e945e95ea4457da04ee9bdb8bdd17fd91acff36dc5b7f0595a735929c514c40c402416bbb87c03f6fb782373 - languageName: node - linkType: hard - -"yargs@npm:^17.0.0, yargs@npm:^17.3.1, yargs@npm:^17.5.1, yargs@npm:^17.6.2, yargs@npm:^17.7.2": +"yargs@npm:^17.0.0": version: 17.7.2 resolution: "yargs@npm:17.7.2" dependencies: @@ -48935,20 +6196,6 @@ __metadata: languageName: node linkType: hard -"yarn-deduplicate@npm:6.0.0": - version: 6.0.0 - resolution: "yarn-deduplicate@npm:6.0.0" - dependencies: - "@yarnpkg/lockfile": ^1.1.0 - commander: ^9.4.0 - semver: ^7.3.7 - tslib: ^2.4.0 - bin: - yarn-deduplicate: dist/cli.js - checksum: 101faee6d7a862b9c9bedd72ff07e9c1a87dc2c95a5ac9b9e34d1611842cc3d057d441707eaff73cc092be6f9f1a56755e6fd14c4e537e0250a125977f2490c1 - languageName: node - linkType: hard - "yauzl@npm:^2.10.0": version: 2.10.0 resolution: "yauzl@npm:2.10.0" @@ -48972,127 +6219,3 @@ __metadata: checksum: f77b3d8d00310def622123df93d4ee654fc6a0096182af8bd60679ddcdfb3474c56c6c7190817c84a2785648cdee9d721c0154eb45698c62176c322fb46fc700 languageName: node linkType: hard - -"yoga-wasm-web@npm:0.3.3, yoga-wasm-web@npm:^0.3.3": - version: 0.3.3 - resolution: "yoga-wasm-web@npm:0.3.3" - checksum: ff65192a832975ff531a1b6eae160c2da859c250feaa58b6389b684f9b48f53fda849a7ea49d12d241198309e671e6bd230a44e7155af9573d7843ac48831c98 - languageName: node - linkType: hard - -"youch@npm:^3.2.2": - version: 3.3.3 - resolution: "youch@npm:3.3.3" - dependencies: - cookie: ^0.5.0 - mustache: ^4.2.0 - stacktracey: ^2.1.8 - checksum: 2b099d8f7b7579ef9d226023037d06c3c03ed6c663e03966d034505e11c026b7ea1359052d5402ded439a9e762cf72449b0db4170e6982ce8be24bbbda4e6b95 - languageName: node - linkType: hard - -"zen-observable-ts@npm:1.2.5, zen-observable-ts@npm:^1.2.5": - version: 1.2.5 - resolution: "zen-observable-ts@npm:1.2.5" - dependencies: - zen-observable: 0.8.15 - checksum: 3b707b7a0239a9bc40f73ba71b27733a689a957c1f364fabb9fa9cbd7d04b7c2faf0d517bf17004e3ed3f4330ac613e84c0d32313e450ddaa046f3350af44541 - languageName: node - linkType: hard - -"zen-observable@npm:0.8.15": - version: 0.8.15 - resolution: "zen-observable@npm:0.8.15" - checksum: b7289084bc1fc74a559b7259faa23d3214b14b538a8843d2b001a35e27147833f4107590b1b44bf5bc7f6dfe6f488660d3a3725f268e09b3925b3476153b7821 - languageName: node - linkType: hard - -"zod@npm:3.22.4": - version: 3.22.4 - resolution: "zod@npm:3.22.4" - checksum: 80bfd7f8039b24fddeb0718a2ec7c02aa9856e4838d6aa4864335a047b6b37a3273b191ef335bf0b2002e5c514ef261ffcda5a589fb084a48c336ffc4cdbab7f - languageName: node - linkType: hard - -"zod@npm:^3.20.6, zod@npm:^3.22.4": - version: 3.24.1 - resolution: "zod@npm:3.24.1" - checksum: dcd5334725b29555593c186fd6505878bb7ccb4f5954f728d2de24bf71f9397492d83bdb69d5b8a376eb500a02273ae0691b57deb1eb8718df3f64c77cc5534a - languageName: node - linkType: hard - -"zone.js@npm:0.12.0": - version: 0.12.0 - resolution: "zone.js@npm:0.12.0" - dependencies: - tslib: ^2.3.0 - checksum: 8efd980442dd11a79837e94de17baef45b27acb82061ac9e204b02b4290379a861c03cc332c5220a94e38f1402e89b306cb6a9e91de77dc7407e88f893abcd25 - languageName: node - linkType: hard - -"zustand@npm:4.4.0": - version: 4.4.0 - resolution: "zustand@npm:4.4.0" - dependencies: - use-sync-external-store: 1.2.0 - peerDependencies: - "@types/react": ">=16.8" - immer: ">=9.0" - react: ">=16.8" - peerDependenciesMeta: - "@types/react": - optional: true - immer: - optional: true - react: - optional: true - checksum: 37e69eec1b56677a93712e5aa6d0048b55997379919dc0f78f61181f8a58994a6cae064f816f8101f5b1039008d3c1c9d136432a62e0edeb796807cc84cf45ef - languageName: node - linkType: hard - -"zustand@npm:4.4.1": - version: 4.4.1 - resolution: "zustand@npm:4.4.1" - dependencies: - use-sync-external-store: 1.2.0 - peerDependencies: - "@types/react": ">=16.8" - immer: ">=9.0" - react: ">=16.8" - peerDependenciesMeta: - "@types/react": - optional: true - immer: - optional: true - react: - optional: true - checksum: 80acd0fbf633782996642802c8692bbb80ae5c80a8dff4c501b88250acd5ccd468fbc6398bdce198475a25e3839c91385b81da921274f33ffb5c2d08c3eab400 - languageName: node - linkType: hard - -"zustand@npm:4.4.6": - version: 4.4.6 - resolution: "zustand@npm:4.4.6" - dependencies: - use-sync-external-store: 1.2.0 - peerDependencies: - "@types/react": ">=16.8" - immer: ">=9.0" - react: ">=16.8" - peerDependenciesMeta: - "@types/react": - optional: true - immer: - optional: true - react: - optional: true - checksum: da7b00cc6dbe5cf5fc2e3fbca745317da4bbaf53bf4a6909bbd3e335242704df9689027f613461aff07eb5f672d5570bc1a2ef99d0ad7bc868920a3b331613d4 - languageName: node - linkType: hard - -"zxcvbn@npm:4.4.2": - version: 4.4.2 - resolution: "zxcvbn@npm:4.4.2" - checksum: 76ab32c066082ac73491b7cd7f93ad0595c59b6d45ae80a0745e9e1661237388beb2f0c2ba0ae3dc330ca3ecdb87edcb7a21e0c09137ab81d5b32e584cda1e5d - languageName: node - linkType: hard From c2e03b737fb610a21c7d1febf3a2dcccfaffa52a Mon Sep 17 00:00:00 2001 From: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> Date: Tue, 23 Sep 2025 15:48:39 +0700 Subject: [PATCH 34/92] Create config.yml (#56) Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> --- .circleci/config.yml | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 .circleci/config.yml diff --git a/.circleci/config.yml b/.circleci/config.yml new file mode 100644 index 00000000000..d5d401c5189 --- /dev/null +++ b/.circleci/config.yml @@ -0,0 +1,31 @@ +# Use the latest 2.1 version of CircleCI pipeline process engine. +# See: https://circleci.com/docs/configuration-reference +version: 2.1 + +# Define a job to be invoked later in a workflow. +# See: https://circleci.com/docs/jobs-steps/#jobs-overview & https://circleci.com/docs/configuration-reference/#jobs +jobs: + say-hello: + # Specify the execution environment. You can specify an image from Docker Hub or use one of our convenience images from CircleCI's Developer Hub. + # See: https://circleci.com/docs/executor-intro/ & https://circleci.com/docs/configuration-reference/#executor-job + docker: + # Specify the version you desire here + # See: https://circleci.com/developer/images/image/cimg/base + - image: cimg/base:current + + # Add steps to the job + # See: https://circleci.com/docs/jobs-steps/#steps-overview & https://circleci.com/docs/configuration-reference/#steps + steps: + # Checkout the code as the first step. + - checkout + - run: + name: "Say hello" + command: "echo Hello, World!" + +# Orchestrate jobs using workflows +# See: https://circleci.com/docs/workflows/ & https://circleci.com/docs/configuration-reference/#workflows +workflows: + say-hello-workflow: # This is the name of the workflow, feel free to change it to better match your workflow. + # Inside the workflow, you define the jobs you want to run. + jobs: + - say-hello From b7ece147ee4072d81d137dcb182f5b21268a7f46 Mon Sep 17 00:00:00 2001 From: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> Date: Sun, 28 Sep 2025 14:32:25 +0700 Subject: [PATCH 35/92] fix: apps/mobile/Gemfile & apps/mobile/Gemfile.lock to reduce vulnerabilities (#60) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-RUBY-REXML-12878608 - https://snyk.io/vuln/SNYK-RUBY-WEBRICK-10500756 - https://snyk.io/vuln/SNYK-RUBY-WEBRICK-8068535 Co-authored-by: snyk-bot --- apps/mobile/Gemfile | 4 +- apps/mobile/Gemfile.lock | 184 ++++++++++++++++++++------------------- 2 files changed, 98 insertions(+), 90 deletions(-) diff --git a/apps/mobile/Gemfile b/apps/mobile/Gemfile index a07e6ca69f3..a9e494ea9a1 100644 --- a/apps/mobile/Gemfile +++ b/apps/mobile/Gemfile @@ -1,8 +1,8 @@ source "https://rubygems.org" -gem 'fastlane', '2.214.0' +gem 'fastlane', '2.215.0' # Exclude problematic versions of cocoapods and activesupport that causes build failures. -gem 'cocoapods', '1.14.3' +gem 'cocoapods', '1.15.0' gem 'activesupport', '7.1.2' gem 'xcodeproj', '1.27.0' gem 'concurrent-ruby', '1.3.4' diff --git a/apps/mobile/Gemfile.lock b/apps/mobile/Gemfile.lock index b5891798a1a..c99f3366066 100644 --- a/apps/mobile/Gemfile.lock +++ b/apps/mobile/Gemfile.lock @@ -1,7 +1,9 @@ GEM remote: https://rubygems.org/ specs: - CFPropertyList (3.0.6) + CFPropertyList (3.0.7) + base64 + nkf rexml activesupport (7.1.2) base64 @@ -13,37 +15,40 @@ GEM minitest (>= 5.1) mutex_m tzinfo (~> 2.0) - addressable (2.8.6) - public_suffix (>= 2.0.2, < 6.0) + addressable (2.8.7) + public_suffix (>= 2.0.2, < 7.0) algoliasearch (1.27.5) httpclient (~> 2.8, >= 2.8.3) json (>= 1.5.1) - artifactory (3.0.15) + artifactory (3.0.17) atomos (0.1.3) - aws-eventstream (1.3.0) - aws-partitions (1.877.0) - aws-sdk-core (3.190.1) + aws-eventstream (1.4.0) + aws-partitions (1.1166.0) + aws-sdk-core (3.233.0) aws-eventstream (~> 1, >= 1.3.0) - aws-partitions (~> 1, >= 1.651.0) - aws-sigv4 (~> 1.8) + aws-partitions (~> 1, >= 1.992.0) + aws-sigv4 (~> 1.9) + base64 + bigdecimal jmespath (~> 1, >= 1.6.1) - aws-sdk-kms (1.75.0) - aws-sdk-core (~> 3, >= 3.188.0) - aws-sigv4 (~> 1.1) - aws-sdk-s3 (1.142.0) - aws-sdk-core (~> 3, >= 3.189.0) + logger + aws-sdk-kms (1.113.0) + aws-sdk-core (~> 3, >= 3.231.0) + aws-sigv4 (~> 1.5) + aws-sdk-s3 (1.199.1) + aws-sdk-core (~> 3, >= 3.231.0) aws-sdk-kms (~> 1) - aws-sigv4 (~> 1.8) - aws-sigv4 (1.8.0) + aws-sigv4 (~> 1.5) + aws-sigv4 (1.12.1) aws-eventstream (~> 1, >= 1.0.2) babosa (1.0.4) - base64 (0.2.0) - bigdecimal (3.1.9) + base64 (0.3.0) + bigdecimal (3.2.3) claide (1.1.0) - cocoapods (1.14.3) + cocoapods (1.15.0) addressable (~> 2.8) claide (>= 1.0.2, < 2.0) - cocoapods-core (= 1.14.3) + cocoapods-core (= 1.15.0) cocoapods-deintegrate (>= 1.0.3, < 2.0) cocoapods-downloader (>= 2.1, < 3.0) cocoapods-plugins (>= 1.0.0, < 2.0) @@ -58,7 +63,7 @@ GEM nap (~> 1.0) ruby-macho (>= 2.3.0, < 3.0) xcodeproj (>= 1.23.0, < 2.0) - cocoapods-core (1.14.3) + cocoapods-core (1.15.0) activesupport (>= 5.0, < 8) addressable (~> 2.8) algoliasearch (~> 1.0) @@ -82,19 +87,19 @@ GEM commander (4.6.0) highline (~> 2.0.0) concurrent-ruby (1.3.4) - connection_pool (2.5.0) + connection_pool (2.5.4) declarative (0.0.20) - digest-crc (0.6.5) + digest-crc (0.7.0) rake (>= 12.0.0, < 14.0.0) - domain_name (0.6.20231109) + domain_name (0.6.20240107) dotenv (2.8.1) - drb (2.2.1) + drb (2.2.3) emoji_regex (3.2.3) escape (0.0.4) - ethon (0.16.0) + ethon (0.15.0) ffi (>= 1.15.0) - excon (0.109.0) - faraday (1.10.3) + excon (0.112.0) + faraday (1.10.4) faraday-em_http (~> 1.0) faraday-em_synchrony (~> 1.0) faraday-excon (~> 1.1) @@ -110,20 +115,20 @@ GEM faraday (>= 0.8.0) http-cookie (~> 1.0.0) faraday-em_http (1.0.0) - faraday-em_synchrony (1.0.0) + faraday-em_synchrony (1.0.1) faraday-excon (1.1.0) faraday-httpclient (1.0.1) - faraday-multipart (1.0.4) - multipart-post (~> 2) - faraday-net_http (1.0.1) + faraday-multipart (1.1.1) + multipart-post (~> 2.0) + faraday-net_http (1.0.2) faraday-net_http_persistent (1.2.0) faraday-patron (1.0.0) faraday-rack (1.0.0) faraday-retry (1.0.3) - faraday_middleware (1.2.0) + faraday_middleware (1.2.1) faraday (~> 1.0) - fastimage (2.3.0) - fastlane (2.214.0) + fastimage (2.4.0) + fastlane (2.215.0) CFPropertyList (>= 2.3, < 4.0.0) addressable (>= 2.8, < 3.0.0) artifactory (~> 3.0) @@ -144,6 +149,7 @@ GEM google-apis-playcustomapp_v1 (~> 0.1) google-cloud-storage (~> 1.31) highline (~> 2.0) + http-cookie (~> 1.0.5) json (< 3.0.0) jwt (>= 2.1.0, < 3) mini_magick (>= 4.9.4, < 5.0.0) @@ -155,116 +161,120 @@ GEM security (= 0.1.3) simctl (~> 1.6.3) terminal-notifier (>= 2.0.0, < 3.0.0) - terminal-table (>= 1.4.5, < 2.0.0) + terminal-table (~> 3) tty-screen (>= 0.6.3, < 1.0.0) tty-spinner (>= 0.8.0, < 1.0.0) word_wrap (~> 1.0.0) xcodeproj (>= 1.13.0, < 2.0.0) xcpretty (~> 0.3.0) xcpretty-travis-formatter (>= 0.0.3) - fastlane-plugin-get_version_name (0.2.2) - fastlane-plugin-versioning_android (0.1.1) - ffi (1.17.1) + ffi (1.17.2) fourflusher (2.3.1) fuzzy_match (2.0.4) gh_inspector (1.1.3) - google-apis-androidpublisher_v3 (0.54.0) - google-apis-core (>= 0.11.0, < 2.a) - google-apis-core (0.11.2) + google-apis-androidpublisher_v3 (0.87.0) + google-apis-core (>= 0.15.0, < 2.a) + google-apis-core (0.18.0) addressable (~> 2.5, >= 2.5.1) - googleauth (>= 0.16.2, < 2.a) - httpclient (>= 2.8.1, < 3.a) + googleauth (~> 1.9) + httpclient (>= 2.8.3, < 3.a) mini_mime (~> 1.0) + mutex_m representable (~> 3.0) retriable (>= 2.0, < 4.a) - rexml - webrick - google-apis-iamcredentials_v1 (0.17.0) - google-apis-core (>= 0.11.0, < 2.a) - google-apis-playcustomapp_v1 (0.13.0) - google-apis-core (>= 0.11.0, < 2.a) - google-apis-storage_v1 (0.29.0) - google-apis-core (>= 0.11.0, < 2.a) - google-cloud-core (1.6.1) + google-apis-iamcredentials_v1 (0.24.0) + google-apis-core (>= 0.15.0, < 2.a) + google-apis-playcustomapp_v1 (0.17.0) + google-apis-core (>= 0.15.0, < 2.a) + google-apis-storage_v1 (0.56.0) + google-apis-core (>= 0.15.0, < 2.a) + google-cloud-core (1.8.0) google-cloud-env (>= 1.0, < 3.a) google-cloud-errors (~> 1.0) - google-cloud-env (2.1.0) + google-cloud-env (2.3.1) + base64 (~> 0.2) faraday (>= 1.0, < 3.a) - google-cloud-errors (1.3.1) - google-cloud-storage (1.45.0) + google-cloud-errors (1.5.0) + google-cloud-storage (1.57.0) addressable (~> 2.8) digest-crc (~> 0.4) - google-apis-iamcredentials_v1 (~> 0.1) - google-apis-storage_v1 (~> 0.29.0) + google-apis-core (>= 0.18, < 2) + google-apis-iamcredentials_v1 (~> 0.18) + google-apis-storage_v1 (>= 0.42) google-cloud-core (~> 1.6) - googleauth (>= 0.16.2, < 2.a) + googleauth (~> 1.9) mini_mime (~> 1.0) - googleauth (1.9.1) + google-logging-utils (0.2.0) + googleauth (1.15.0) faraday (>= 1.0, < 3.a) - google-cloud-env (~> 2.1) - jwt (>= 1.4, < 3.0) + google-cloud-env (~> 2.2) + google-logging-utils (~> 0.1) + jwt (>= 1.4, < 4.0) multi_json (~> 1.11) os (>= 0.9, < 2.0) signet (>= 0.16, < 2.a) highline (2.0.3) - http-cookie (1.0.5) + http-cookie (1.0.8) domain_name (~> 0.5) - httpclient (2.8.3) + httpclient (2.9.0) + mutex_m i18n (1.14.7) concurrent-ruby (~> 1.0) jmespath (1.6.2) - json (2.7.1) - jwt (2.7.1) - mini_magick (4.12.0) + json (2.15.0) + jwt (2.10.2) + base64 + logger (1.7.0) + mini_magick (4.13.2) mini_mime (1.1.5) - minitest (5.25.4) + minitest (5.25.5) molinillo (0.8.0) - multi_json (1.15.0) - multipart-post (2.3.0) + multi_json (1.17.0) + multipart-post (2.4.1) mutex_m (0.3.0) nanaimo (0.4.0) nap (1.1.0) - naturally (2.2.1) + naturally (2.3.0) netrc (0.11.0) + nkf (0.2.0) optparse (0.1.1) os (1.1.4) - plist (3.7.1) + plist (3.7.2) public_suffix (4.0.7) - rake (13.1.0) + rake (13.3.0) representable (3.2.0) declarative (< 0.1.0) trailblazer-option (>= 0.1.1, < 0.2.0) uber (< 0.2.0) retriable (3.1.2) - rexml (3.4.1) + rexml (3.4.4) rouge (2.0.7) ruby-macho (2.5.1) ruby2_keywords (0.0.5) - rubyzip (2.3.2) + rubyzip (2.4.1) security (0.1.3) - signet (0.18.0) + signet (0.21.0) addressable (~> 2.8) faraday (>= 0.17.5, < 3.a) - jwt (>= 1.5, < 3.0) + jwt (>= 1.5, < 4.0) multi_json (~> 1.10) simctl (1.6.10) CFPropertyList naturally terminal-notifier (2.0.0) - terminal-table (1.8.0) - unicode-display_width (~> 1.1, >= 1.1.1) + terminal-table (3.0.2) + unicode-display_width (>= 1.1.1, < 3) trailblazer-option (0.1.2) tty-cursor (0.7.1) tty-screen (0.8.2) tty-spinner (0.9.3) tty-cursor (~> 0.7) - typhoeus (1.4.1) - ethon (>= 0.9.0) + typhoeus (1.5.0) + ethon (>= 0.9.0, < 0.16.0) tzinfo (2.0.6) concurrent-ruby (~> 1.0) uber (0.1.0) - unicode-display_width (1.8.0) - webrick (1.8.1) + unicode-display_width (2.6.0) word_wrap (1.0.0) xcodeproj (1.27.0) CFPropertyList (>= 2.3.3, < 4.0) @@ -283,12 +293,10 @@ PLATFORMS DEPENDENCIES activesupport (= 7.1.2) - cocoapods (= 1.14.3) + cocoapods (= 1.15.0) concurrent-ruby (= 1.3.4) - fastlane (= 2.214.0) - fastlane-plugin-get_version_name - fastlane-plugin-versioning_android + fastlane (= 2.215.0) xcodeproj (= 1.27.0) BUNDLED WITH - 2.4.10 + 2.3.26 From 58d9f6c20cf4711bd922c35668c9e4d3c7f7b513 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 28 Sep 2025 19:39:15 +0700 Subject: [PATCH 36/92] build(deps): bump the npm_and_yarn group across 6 directories with 5 updates (#61) Bumps the npm_and_yarn group with 2 updates in the /apps/extension directory: [webpack](https://github.com/webpack/webpack) and [webpack-dev-server](https://github.com/webpack/webpack-dev-server). Bumps the npm_and_yarn group with 1 update in the /apps/mobile directory: [react-native-mmkv](https://github.com/mrousavy/react-native-mmkv). Bumps the npm_and_yarn group with 3 updates in the /apps/web directory: [webpack](https://github.com/webpack/webpack), [graphql](https://github.com/graphql/graphql-js) and [hono](https://github.com/honojs/hono). Bumps the npm_and_yarn group with 2 updates in the /packages/uniswap directory: [react-native-mmkv](https://github.com/mrousavy/react-native-mmkv) and [graphql](https://github.com/graphql/graphql-js). Bumps the npm_and_yarn group with 1 update in the /packages/utilities directory: [graphql](https://github.com/graphql/graphql-js). Bumps the npm_and_yarn group with 1 update in the /packages/wallet directory: [graphql](https://github.com/graphql/graphql-js). Updates `webpack` from 5.90.0 to 5.94.0 - [Release notes](https://github.com/webpack/webpack/releases) - [Commits](https://github.com/webpack/webpack/compare/v5.90.0...v5.94.0) Updates `webpack-dev-server` from 4.15.1 to 5.2.1 - [Release notes](https://github.com/webpack/webpack-dev-server/releases) - [Changelog](https://github.com/webpack/webpack-dev-server/blob/main/CHANGELOG.md) - [Commits](https://github.com/webpack/webpack-dev-server/compare/v4.15.1...v5.2.1) Updates `react-native-mmkv` from 2.10.1 to 2.11.0 - [Release notes](https://github.com/mrousavy/react-native-mmkv/releases) - [Commits](https://github.com/mrousavy/react-native-mmkv/compare/v2.10.1...v2.11.0) Updates `webpack` from 5.90.0 to 5.94.0 - [Release notes](https://github.com/webpack/webpack/releases) - [Commits](https://github.com/webpack/webpack/compare/v5.90.0...v5.94.0) Updates `graphql` from 16.6.0 to 16.8.1 - [Release notes](https://github.com/graphql/graphql-js/releases) - [Commits](https://github.com/graphql/graphql-js/compare/v16.6.0...v16.8.1) Updates `hono` from 4.8.4 to 4.9.7 - [Release notes](https://github.com/honojs/hono/releases) - [Commits](https://github.com/honojs/hono/compare/v4.8.4...v4.9.7) Updates `react-native-mmkv` from 2.10.1 to 2.11.0 - [Release notes](https://github.com/mrousavy/react-native-mmkv/releases) - [Commits](https://github.com/mrousavy/react-native-mmkv/compare/v2.10.1...v2.11.0) Updates `graphql` from 16.6.0 to 16.8.1 - [Release notes](https://github.com/graphql/graphql-js/releases) - [Commits](https://github.com/graphql/graphql-js/compare/v16.6.0...v16.8.1) Updates `graphql` from 16.6.0 to 16.8.1 - [Release notes](https://github.com/graphql/graphql-js/releases) - [Commits](https://github.com/graphql/graphql-js/compare/v16.6.0...v16.8.1) Updates `graphql` from 16.6.0 to 16.8.1 - [Release notes](https://github.com/graphql/graphql-js/releases) - [Commits](https://github.com/graphql/graphql-js/compare/v16.6.0...v16.8.1) --- updated-dependencies: - dependency-name: webpack dependency-version: 5.94.0 dependency-type: direct:development dependency-group: npm_and_yarn - dependency-name: webpack-dev-server dependency-version: 5.2.1 dependency-type: direct:development dependency-group: npm_and_yarn - dependency-name: react-native-mmkv dependency-version: 2.11.0 dependency-type: direct:production dependency-group: npm_and_yarn - dependency-name: webpack dependency-version: 5.94.0 dependency-type: direct:development dependency-group: npm_and_yarn - dependency-name: graphql dependency-version: 16.8.1 dependency-type: direct:production dependency-group: npm_and_yarn - dependency-name: hono dependency-version: 4.9.7 dependency-type: direct:production dependency-group: npm_and_yarn - dependency-name: react-native-mmkv dependency-version: 2.11.0 dependency-type: direct:production dependency-group: npm_and_yarn - dependency-name: graphql dependency-version: 16.8.1 dependency-type: direct:production dependency-group: npm_and_yarn - dependency-name: graphql dependency-version: 16.8.1 dependency-type: direct:production dependency-group: npm_and_yarn - dependency-name: graphql dependency-version: 16.8.1 dependency-type: direct:production dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- apps/extension/package.json | 4 ++-- apps/mobile/package.json | 2 +- apps/web/package.json | 6 +++--- packages/uniswap/package.json | 4 ++-- packages/utilities/package.json | 2 +- packages/wallet/package.json | 2 +- 6 files changed, 10 insertions(+), 10 deletions(-) diff --git a/apps/extension/package.json b/apps/extension/package.json index ad4bff5873a..9dcc7292896 100644 --- a/apps/extension/package.json +++ b/apps/extension/package.json @@ -93,9 +93,9 @@ "swc-loader": "0.2.6", "tamagui-loader": "1.125.17", "typescript": "5.3.3", - "webpack": "5.90.0", + "webpack": "5.94.0", "webpack-cli": "5.1.4", - "webpack-dev-server": "4.15.1" + "webpack-dev-server": "5.2.1" }, "private": true, "scripts": { diff --git a/apps/mobile/package.json b/apps/mobile/package.json index 70aa1633b50..8d69f608761 100644 --- a/apps/mobile/package.json +++ b/apps/mobile/package.json @@ -152,7 +152,7 @@ "react-native-keyboard-controller": "1.17.5", "react-native-localize": "2.2.6", "react-native-markdown-display": "7.0.0-alpha.2", - "react-native-mmkv": "2.10.1", + "react-native-mmkv": "2.11.0", "react-native-onesignal": "5.2.9", "react-native-pager-view": "6.5.1", "react-native-passkey": "3.1.0", diff --git a/apps/web/package.json b/apps/web/package.json index 95063c98f64..9761dcb163d 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -150,7 +150,7 @@ "vitest": "3.2.1", "vitest-fetch-mock": "0.4.5", "wait-on": "8.0.2", - "webpack": "5.90.0", + "webpack": "5.94.0", "wrangler": "4.28.0" }, "dependencies": { @@ -222,8 +222,8 @@ "expo-crypto": "12.8.1", "fancy-canvas": "2.1.0", "framer-motion": "10.17.6", - "graphql": "16.6.0", - "hono": "4.8.4", + "graphql": "16.8.1", + "hono": "4.9.7", "html-entities": "2.6.0", "i18next": "23.10.0", "jotai": "1.3.7", diff --git a/packages/uniswap/package.json b/packages/uniswap/package.json index 134290c7a7c..b0ef401bf29 100644 --- a/packages/uniswap/package.json +++ b/packages/uniswap/package.json @@ -76,7 +76,7 @@ "expo-haptics": "14.0.1", "expo-web-browser": "14.0.2", "fuse.js": "6.5.3", - "graphql": "16.6.0", + "graphql": "16.8.1", "i18next": "23.10.0", "i18next-resources-to-backend": "1.2.1", "idb-keyval": "6.2.1", @@ -96,7 +96,7 @@ "react-native-fast-image": "8.6.3", "react-native-gesture-handler": "2.22.1", "react-native-localize": "2.2.6", - "react-native-mmkv": "2.10.1", + "react-native-mmkv": "2.11.0", "react-native-reanimated": "3.16.7", "react-native-svg": "15.11.2", "react-native-webview": "13.13.5", diff --git a/packages/utilities/package.json b/packages/utilities/package.json index 5d6ff4e591c..59fcda15023 100644 --- a/packages/utilities/package.json +++ b/packages/utilities/package.json @@ -24,7 +24,7 @@ "@uniswap/sdk-core": "7.7.2", "dayjs": "1.11.7", "expo-localization": "16.0.1", - "graphql": "16.6.0", + "graphql": "16.8.1", "jsbi": "3.2.5", "promise": "8.3.0", "react": "18.3.1", diff --git a/packages/wallet/package.json b/packages/wallet/package.json index da490de9e11..7a619b7c796 100644 --- a/packages/wallet/package.json +++ b/packages/wallet/package.json @@ -35,7 +35,7 @@ "dayjs": "1.11.7", "ethers": "5.7.2", "fuse.js": "6.5.3", - "graphql": "16.6.0", + "graphql": "16.8.1", "i18next": "23.10.0", "jsbi": "3.2.5", "lodash": "4.17.21", From 607e2db9562cc148fa60c2c5cfdd32ceb75f515f Mon Sep 17 00:00:00 2001 From: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> Date: Tue, 30 Sep 2025 02:43:18 +0700 Subject: [PATCH 37/92] Potential fix for code scanning alert no. 19: Incomplete regular expression for hostnames (#63) Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> --- apps/web/src/pages/Landing/Landing.e2e.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/web/src/pages/Landing/Landing.e2e.test.ts b/apps/web/src/pages/Landing/Landing.e2e.test.ts index aec2b7a703b..e213ceaa6c1 100644 --- a/apps/web/src/pages/Landing/Landing.e2e.test.ts +++ b/apps/web/src/pages/Landing/Landing.e2e.test.ts @@ -53,7 +53,7 @@ test.describe('Landing Page', () => { await page.unrouteAll({ behavior: 'ignoreErrors' }) }) test('renders UK compliance banner in UK', async ({ page }) => { - await page.route(/(?:interface|beta).gateway.uniswap.org\/v1\/amplitude-proxy/, async (route) => { + await page.route(/(?:interface|beta)\.gateway\.uniswap\.org\/v1\/amplitude-proxy/, async (route) => { const requestBody = JSON.stringify(await route.request().postDataJSON()) const originalResponse = await route.fetch() const byteSize = new Blob([requestBody]).size From 036022cf0ef73728dd0d13d6855a16103ba349a6 Mon Sep 17 00:00:00 2001 From: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> Date: Tue, 30 Sep 2025 03:29:29 +0700 Subject: [PATCH 38/92] Update issue templates (#64) * Update issue templates * Update .github/ISSUE_TEMPLATE/feature_request.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- .github/ISSUE_TEMPLATE/bug_report.md | 2 ++ .github/ISSUE_TEMPLATE/custom.md | 10 ++++++++++ .github/ISSUE_TEMPLATE/feature_request.md | 20 ++++++++++++++++++++ 3 files changed, 32 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/custom.md create mode 100644 .github/ISSUE_TEMPLATE/feature_request.md diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index b01ad10c152..feac4b614be 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -3,6 +3,8 @@ name: Bug Report about: Report a bug or unexpected behavior in the Uniswap interfaces. title: "[Bug] " labels: bug +assignees: '' + --- ## 📱 Interface Affected diff --git a/.github/ISSUE_TEMPLATE/custom.md b/.github/ISSUE_TEMPLATE/custom.md new file mode 100644 index 00000000000..48d5f81fa42 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/custom.md @@ -0,0 +1,10 @@ +--- +name: Custom issue template +about: Describe this issue template's purpose here. +title: '' +labels: '' +assignees: '' + +--- + + diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 00000000000..36014cde565 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,20 @@ +--- +name: Feature request +about: Suggest an idea for this project +title: '' +labels: 'enhancement' +assignees: '' + +--- + +**Is your feature request related to a problem? Please describe.** +A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] + +**Describe the solution you'd like** +A clear and concise description of what you want to happen. + +**Describe alternatives you've considered** +A clear and concise description of any alternative solutions or features you've considered. + +**Additional context** +Add any other context or screenshots about the feature request here. From 87893de63935254c9c8e4b2d6ff8d41d7bf7e4aa Mon Sep 17 00:00:00 2001 From: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> Date: Wed, 1 Oct 2025 02:22:52 +0700 Subject: [PATCH 39/92] Potential fix for code scanning alert no. 17: Incomplete regular expression for hostnames (#65) Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> --- apps/web/src/playwright/fixtures/graphql.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/web/src/playwright/fixtures/graphql.ts b/apps/web/src/playwright/fixtures/graphql.ts index 5f2ed08e1e0..59823342aac 100644 --- a/apps/web/src/playwright/fixtures/graphql.ts +++ b/apps/web/src/playwright/fixtures/graphql.ts @@ -58,7 +58,7 @@ export const test = base.extend({ } } - await page.route(/(?:interface|beta).(gateway|api).uniswap.org\/v1\/graphql/, async (route) => { + await page.route(/(?:interface|beta)\.(gateway|api)\.uniswap\.org\/v1\/graphql/, async (route) => { const request = route.request() const postData = request.postData() if (!postData) { From b6ab792db29f627749ae76d929e914e01379c363 Mon Sep 17 00:00:00 2001 From: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> Date: Wed, 1 Oct 2025 03:17:11 +0700 Subject: [PATCH 40/92] Update tag_and_release.yml Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> --- .github/workflows/tag_and_release.yml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/.github/workflows/tag_and_release.yml b/.github/workflows/tag_and_release.yml index d96e0d46fef..681f171f631 100644 --- a/.github/workflows/tag_and_release.yml +++ b/.github/workflows/tag_and_release.yml @@ -3,7 +3,10 @@ on: push: branches: - 'main' - +permissions: + contents: write + issues: write + pull-requests: write jobs: deploy-to-prod: runs-on: ubuntu-latest @@ -33,7 +36,7 @@ jobs: - name: 🪽 Release uses: actions/create-release@c9ba6969f07ed90fae07e2e66100dd03f9b1a50e env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # Or use your PAT with: tag_name: ${{ steps.github-tag-action.outputs.new_tag }} release_name: Release ${{ steps.github-tag-action.outputs.new_tag }} From 8e3b4a5e184b498423d5b25ca5ceb5a9258c92c2 Mon Sep 17 00:00:00 2001 From: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> Date: Wed, 1 Oct 2025 03:30:14 +0700 Subject: [PATCH 41/92] Update tag_and_release.yml (#66) Configure tag_and_release GitHub Actions workflow with explicit write permissions and annotate the GITHUB_TOKEN usage. CI: Add explicit contents, issues, and pull-requests write permissions to the workflow Chores: Add comment noting alternative use of a personal access token for GITHUB_TOKEN Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> --- .github/workflows/tag_and_release.yml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/.github/workflows/tag_and_release.yml b/.github/workflows/tag_and_release.yml index d96e0d46fef..681f171f631 100644 --- a/.github/workflows/tag_and_release.yml +++ b/.github/workflows/tag_and_release.yml @@ -3,7 +3,10 @@ on: push: branches: - 'main' - +permissions: + contents: write + issues: write + pull-requests: write jobs: deploy-to-prod: runs-on: ubuntu-latest @@ -33,7 +36,7 @@ jobs: - name: 🪽 Release uses: actions/create-release@c9ba6969f07ed90fae07e2e66100dd03f9b1a50e env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # Or use your PAT with: tag_name: ${{ steps.github-tag-action.outputs.new_tag }} release_name: Release ${{ steps.github-tag-action.outputs.new_tag }} From 4b5c40f67b3a55a3ddb505fe2dcc53b4dc6d9d1c Mon Sep 17 00:00:00 2001 From: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> Date: Wed, 1 Oct 2025 09:17:20 +0700 Subject: [PATCH 42/92] Update tag_and_release.yml (#67) Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> --- .github/workflows/tag_and_release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/tag_and_release.yml b/.github/workflows/tag_and_release.yml index 681f171f631..ec6b8721bc6 100644 --- a/.github/workflows/tag_and_release.yml +++ b/.github/workflows/tag_and_release.yml @@ -34,7 +34,7 @@ jobs: tag_prefix: "" - name: 🪽 Release - uses: actions/create-release@c9ba6969f07ed90fae07e2e66100dd03f9b1a50e + uses: actions/create-release@8e3b4a5e184b498423d5b25ca5ceb5a9258c92c2 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # Or use your PAT with: From 008555b99b527a799ea1cd33771b932bd7866383 Mon Sep 17 00:00:00 2001 From: AU_019 <64915515+Dargon789@users.noreply.github.com> Date: Sun, 2 Feb 2025 01:24:29 +0700 Subject: [PATCH 43/92] Potential fix for code scanning alert no. 10: Incomplete regular expression for hostnames Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> Signed-off-by: AU_019 <64915515+Dargon789@users.noreply.github.com> --- apps/web/cypress/support/commands.ts | 168 +++++++++++++++++++++++++++ 1 file changed, 168 insertions(+) create mode 100644 apps/web/cypress/support/commands.ts diff --git a/apps/web/cypress/support/commands.ts b/apps/web/cypress/support/commands.ts new file mode 100644 index 00000000000..476905a0daa --- /dev/null +++ b/apps/web/cypress/support/commands.ts @@ -0,0 +1,168 @@ +import 'cypress-hardhat/lib/browser' + +import { Eip1193 } from 'cypress-hardhat/lib/browser/eip1193' +import { FeatureFlagClient, FeatureFlags, getFeatureFlagName } from 'uniswap/src/features/gating/flags' +import { ALLOW_ANALYTICS_ATOM_KEY } from 'utilities/src/telemetry/analytics/constants' +import { UserState, initialState } from '../../src/state/user/reducer' +import { setInitialUserState } from '../utils/user-state' + +declare global { + // eslint-disable-next-line @typescript-eslint/no-namespace + namespace Cypress { + interface ApplicationWindow { + ethereum: Eip1193 + } + interface Chainable { + /** + * Wait for a specific event to be sent to amplitude. If the event is found, the subject will be the event. + * + * @param {string} eventName - The type of the event to search for e.g. SwapEventName.SWAP_TRANSACTION_COMPLETED + * @param {number} timeout - The maximum amount of time (in ms) to wait for the event. + * @returns {Chainable} + */ + waitForAmplitudeEvent(eventName: string, requiredProperties?: string[]): Chainable + /** + * Intercepts a specific graphql operation and responds with the given fixture. + * @param {string} operationName - The name of the graphql operation to intercept. + * @param {string} fixturePath - The path to the fixture to respond with. + */ + interceptGraphqlOperation(operationName: string, fixturePath: string): Chainable + /** + * Intercepts a quote request and responds with the given fixture. + * @param {string} fixturePath - The path to the fixture to respond with. + */ + interceptQuoteRequest(fixturePath: string): Chainable + } + interface Cypress { + eagerlyConnect?: boolean + } + interface VisitOptions { + featureFlags?: Array<{ flag: FeatureFlags; value: boolean }> + /** + * Initial user state. + * @default {@type import('../utils/user-state').CONNECTED_WALLET_USER_STATE} + */ + userState?: Partial + /** + * If false, prevents the app from eagerly connecting to the injected provider. + * @default true + */ + eagerlyConnect?: false + } + } +} + +export function registerCommands() { + // sets up the injected provider to be a mock ethereum provider with the given mnemonic/index + // eslint-disable-next-line no-undef + Cypress.Commands.overwrite( + 'visit', + (original, url: string | Partial, options?: Partial) => { + if (typeof url !== 'string') { + throw new Error('Invalid arguments. The first argument to cy.visit must be the path.') + } + + // Parse overrides + const flagsOn: FeatureFlags[] = [] + const flagsOff: FeatureFlags[] = [] + options?.featureFlags?.forEach((f) => { + if (f.value) { + flagsOn.push(f.flag) + } else { + flagsOff.push(f.flag) + } + }) + + // Format into URL parameters + const overrideParams = new URLSearchParams() + if (flagsOn.length > 0) { + overrideParams.append( + 'featureFlagOverride', + flagsOn.map((flag) => getFeatureFlagName(flag, FeatureFlagClient.Web)).join(','), + ) + } + if (flagsOff.length > 0) { + overrideParams.append( + 'featureFlagOverrideOff', + flagsOn.map((flag) => getFeatureFlagName(flag, FeatureFlagClient.Web)).join(','), + ) + } + + return cy.provider().then((provider) => + original({ + ...options, + url: + [...overrideParams.entries()].length === 0 + ? url + : url.includes('?') + ? `${url}&${overrideParams.toString()}` + : `${url}?${overrideParams.toString()}`, + onBeforeLoad(win) { + options?.onBeforeLoad?.(win) + + setInitialUserState(win, { + ...initialState, + ...(options?.userState ?? {}), + }) + + win.ethereum = provider + win.Cypress.eagerlyConnect = options?.eagerlyConnect ?? true + win.localStorage.setItem(ALLOW_ANALYTICS_ATOM_KEY, 'true') + win.localStorage.setItem('showUniswapExtensionLaunchAtom', 'false') + }, + }), + ) + }, + ) + + Cypress.Commands.add('waitForAmplitudeEvent', (eventName, requiredProperties) => { + function findAndDiscardEventsUpToTarget() { + const events = Cypress.env('amplitudeEventCache') + const targetEventIndex = events.findIndex((event) => { + if (event.event_type !== eventName) { + return false + } + if (requiredProperties) { + return requiredProperties.every((prop) => event.event_properties[prop]) + } + return true + }) + + if (targetEventIndex !== -1) { + const event = events[targetEventIndex] + Cypress.env('amplitudeEventCache', events.slice(targetEventIndex + 1)) + return cy.wrap(event) + } else { + // If not found, retry after waiting for more events to be sent. + return cy.wait('@amplitude').then(findAndDiscardEventsUpToTarget) + } + } + return findAndDiscardEventsUpToTarget() + }) + + Cypress.env('graphqlInterceptions', new Map()) + + Cypress.Commands.add('interceptGraphqlOperation', (operationName, fixturePath) => { + const graphqlInterceptions = Cypress.env('graphqlInterceptions') + cy.intercept(/(?:interface|beta).gateway.uniswap.org\/v1\/graphql/, (req) => { + req.headers['origin'] = 'https://app.uniswap.org' + const currentOperationName = req.body.operationName + + if (graphqlInterceptions.has(currentOperationName)) { + const fixturePath = graphqlInterceptions.get(currentOperationName) + req.reply({ fixture: fixturePath }) + } else { + req.continue() + } + }).as(operationName) + + graphqlInterceptions.set(operationName, fixturePath) + }) + + Cypress.Commands.add('interceptQuoteRequest', (fixturePath) => { + return cy.intercept(/(?:interface|beta)\.gateway\.uniswap\.org\/v2\/quote/, (req) => { + req.headers['origin'] = 'https://app.uniswap.org' + req.reply({ fixture: fixturePath }) + }) + }) +} From 085f13dfe805ed43222615349fa29b319583d880 Mon Sep 17 00:00:00 2001 From: AU_019 <64915515+Dargon789@users.noreply.github.com> Date: Sat, 1 Feb 2025 19:32:20 +0700 Subject: [PATCH 44/92] Create SECURITY.md Signed-off-by: AU_019 <64915515+Dargon789@users.noreply.github.com> --- SECURITY.md | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 SECURITY.md diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 00000000000..034e8480320 --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,21 @@ +# Security Policy + +## Supported Versions + +Use this section to tell people about which versions of your project are +currently being supported with security updates. + +| Version | Supported | +| ------- | ------------------ | +| 5.1.x | :white_check_mark: | +| 5.0.x | :x: | +| 4.0.x | :white_check_mark: | +| < 4.0 | :x: | + +## Reporting a Vulnerability + +Use this section to tell people how to report a vulnerability. + +Tell them where to go, how often they can expect to get an update on a +reported vulnerability, what to expect if the vulnerability is accepted or +declined, etc. From a6b4970e8ffd383db9de1bdd280ba5b90ed3aeb3 Mon Sep 17 00:00:00 2001 From: AU_019 <64915515+Dargon789@users.noreply.github.com> Date: Sat, 1 Feb 2025 19:43:24 +0700 Subject: [PATCH 45/92] Potential fix for code scanning alert no. 11: Incomplete string escaping or encoding Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> Signed-off-by: AU_019 <64915515+Dargon789@users.noreply.github.com> --- apps/web/src/components/Logo/DoubleLogo.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/web/src/components/Logo/DoubleLogo.tsx b/apps/web/src/components/Logo/DoubleLogo.tsx index 610c4e8205c..9d3dfc98b7e 100644 --- a/apps/web/src/components/Logo/DoubleLogo.tsx +++ b/apps/web/src/components/Logo/DoubleLogo.tsx @@ -47,7 +47,7 @@ function LogolessPlaceholder({ return ( - {currency?.symbol?.toUpperCase().replace('$', '').replace(/\s+/g, '').slice(0, 3)} + {currency?.symbol?.toUpperCase().replace(/\$/g, '').replace(/\s+/g, '').slice(0, 3)} {showNetworkLogo && ( From 8a4ae07b83f18c96635d6dc2d812bcc9753f1b99 Mon Sep 17 00:00:00 2001 From: AU_019 <64915515+Dargon789@users.noreply.github.com> Date: Sat, 25 Jan 2025 03:21:50 +0700 Subject: [PATCH 46/92] Create static.yml Signed-off-by: AU_019 <64915515+Dargon789@users.noreply.github.com> --- .github/workflows/static.yml | 43 ++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 .github/workflows/static.yml diff --git a/.github/workflows/static.yml b/.github/workflows/static.yml new file mode 100644 index 00000000000..f2c9e97c91d --- /dev/null +++ b/.github/workflows/static.yml @@ -0,0 +1,43 @@ +# Simple workflow for deploying static content to GitHub Pages +name: Deploy static content to Pages + +on: + # Runs on pushes targeting the default branch + push: + branches: ["main"] + + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + +# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages +permissions: + contents: read + pages: write + id-token: write + +# Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued. +# However, do NOT cancel in-progress runs as we want to allow these production deployments to complete. +concurrency: + group: "pages" + cancel-in-progress: false + +jobs: + # Single deploy job since we're just deploying + deploy: + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Setup Pages + uses: actions/configure-pages@v5 + - name: Upload artifact + uses: actions/upload-pages-artifact@v3 + with: + # Upload entire repository + path: '.' + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v4 From 46b0af5555e498ccc1ac24f1a954c97741603033 Mon Sep 17 00:00:00 2001 From: AU_019 <64915515+Dargon789@users.noreply.github.com> Date: Sat, 25 Jan 2025 03:17:58 +0700 Subject: [PATCH 47/92] Create jekyll-gh-pages.yml Signed-off-by: AU_019 <64915515+Dargon789@users.noreply.github.com> --- .github/workflows/jekyll-gh-pages.yml | 51 +++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 .github/workflows/jekyll-gh-pages.yml diff --git a/.github/workflows/jekyll-gh-pages.yml b/.github/workflows/jekyll-gh-pages.yml new file mode 100644 index 00000000000..e31d81c5864 --- /dev/null +++ b/.github/workflows/jekyll-gh-pages.yml @@ -0,0 +1,51 @@ +# Sample workflow for building and deploying a Jekyll site to GitHub Pages +name: Deploy Jekyll with GitHub Pages dependencies preinstalled + +on: + # Runs on pushes targeting the default branch + push: + branches: ["main"] + + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + +# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages +permissions: + contents: read + pages: write + id-token: write + +# Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued. +# However, do NOT cancel in-progress runs as we want to allow these production deployments to complete. +concurrency: + group: "pages" + cancel-in-progress: false + +jobs: + # Build job + build: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Setup Pages + uses: actions/configure-pages@v5 + - name: Build with Jekyll + uses: actions/jekyll-build-pages@v1 + with: + source: ./ + destination: ./_site + - name: Upload artifact + uses: actions/upload-pages-artifact@v3 + + # Deployment job + deploy: + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + runs-on: ubuntu-latest + needs: build + steps: + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v4 From bdef85180fee744e0d32cdb3da7085b14302c3cf Mon Sep 17 00:00:00 2001 From: snyk-bot Date: Sat, 15 Feb 2025 21:21:05 +0000 Subject: [PATCH 48/92] fix: packages/ui/package.json to reduce vulnerabilities The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-8720086 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-8187303 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-7577916 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-7577917 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-7577918 --- packages/ui/package.json | 68 +++++++++++++++++++--------------------- 1 file changed, 32 insertions(+), 36 deletions(-) diff --git a/packages/ui/package.json b/packages/ui/package.json index d7f21662fd3..b2be1a7682d 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -2,47 +2,41 @@ "name": "ui", "version": "0.0.0", "dependencies": { - "@gorhom/bottom-sheet": "4.6.4", - "@react-native-masked-view/masked-view": "0.3.2", - "@shopify/flash-list": "1.7.3", - "@shopify/react-native-skia": "1.12.4", - "@storybook/react": "8.5.2", - "@tamagui/animations-react-native": "1.125.17", - "@tamagui/font-inter": "1.125.17", - "@tamagui/helpers-icon": "1.125.17", - "@tamagui/portal": "1.125.17", - "@tamagui/react-native-media-driver": "1.125.17", - "@tamagui/remove-scroll": "1.125.17", - "@tamagui/theme-base": "1.125.17", - "@tanstack/react-query": "5.77.2", - "@testing-library/react-hooks": "8.0.1", - "ethers": "5.7.2", - "expo-blur": "14.0.3", - "expo-linear-gradient": "14.0.2", + "@gorhom/bottom-sheet": "4.5.1", + "@react-native-masked-view/masked-view": "0.2.9", + "@shopify/flash-list": "1.6.3", + "@shopify/react-native-skia": "1.4.2", + "@storybook/react": "8.4.2", + "@tamagui/animations-react-native": "1.114.4", + "@tamagui/font-inter": "1.114.4", + "@tamagui/helpers-icon": "1.114.4", + "@tamagui/react-native-media-driver": "1.114.4", + "@tamagui/remove-scroll": "1.114.4", + "@tamagui/theme-base": "1.114.4", + "@testing-library/react-hooks": "7.0.2", + "ethers": "6.0.0", + "expo-linear-gradient": "12.7.2", "i18next": "23.10.0", "qrcode": "1.5.1", - "react": "18.3.1", - "react-i18next": "14.1.0", - "react-native": "0.77.2", + "react": "18.2.0", + "react-native": "0.73.6", "react-native-fast-image": "8.6.3", - "react-native-gesture-handler": "2.22.1", + "react-native-gesture-handler": "2.19.0", "react-native-image-colors": "1.5.2", - "react-native-keyboard-controller": "1.17.5", - "react-native-reanimated": "3.16.7", - "react-native-safe-area-context": "5.1.0", - "react-native-svg": "15.11.2", - "react-native-webview": "13.13.5", - "tamagui": "1.125.17", + "react-native-reanimated": "3.15.0", + "react-native-safe-area-context": "4.9.0", + "react-native-svg": "15.1.0", + "react-native-webview": "11.23.1", + "tamagui": "1.114.4", "utilities": "workspace:^", "uuid": "9.0.0", "wcag-contrast": "3.0.0" }, "devDependencies": { - "@storybook/test": "8.5.2", - "@tamagui/animations-moti": "1.125.17", - "@tamagui/core": "1.125.17", - "@testing-library/react-native": "13.0.0", - "@types/chrome": "0.0.304", + "@tamagui/animations-moti": "1.114.4", + "@tamagui/build": "1.114.4", + "@tamagui/core": "1.114.4", + "@testing-library/react-native": "11.5.0", "@types/qrcode": "1.5.5", "@uniswap/eslint-config": "workspace:^", "camelcase": "6.3.0", @@ -63,15 +57,17 @@ "module:jsx": "src", "private": true, "scripts": { - "build:icons": "bunx tsx ./src/scripts/componentize-icons.ts && biome check --write --unsafe", - "build:icons:missing": "bun run build:icons --skip-existing", + "build": "tamagui-build --ignore-base-url && node -r esbuild-register ./src/scripts/remove-declaration-files-from-utilities.ts", + "clean": "tamagui-build clean", + "build:icons": "node -r esbuild-register ./src/scripts/componentize-icons.ts", + "build:icons:missing": "yarn build:icons --skip-existing", "check:deps:usage": "depcheck", "lint": "eslint src --max-warnings=0", - "format": "biome check . --linter-enabled=false", + "format": "../../scripts/prettier.sh", "lint:fix": "eslint src --fix", "test": "jest && echo 'ignoring'", "typecheck": "tsc -b", - "watch": "bun run build --watch" + "watch": "yarn build --watch" }, "sideEffects": [ "*.css" From d061a4d1739df56068f7885c85e7e51755b07b9e Mon Sep 17 00:00:00 2001 From: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> Date: Wed, 1 Oct 2025 21:53:05 +0700 Subject: [PATCH 49/92] Update tag_and_release.yml (#68) Refactor the tag_and_release workflow to trigger only on tag pushes, tighten permissions, restructure the release job, and switch from the actions/create-release action to a GitHub CLI invocation. Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> --- .github/workflows/tag_and_release.yml | 30 ++++++++++++++++++++------- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/.github/workflows/tag_and_release.yml b/.github/workflows/tag_and_release.yml index ec6b8721bc6..f05c7a5689b 100644 --- a/.github/workflows/tag_and_release.yml +++ b/.github/workflows/tag_and_release.yml @@ -33,11 +33,27 @@ jobs: custom_tag: ${{ steps.version.outputs.content }} tag_prefix: "" - - name: 🪽 Release - uses: actions/create-release@8e3b4a5e184b498423d5b25ca5ceb5a9258c92c2 + - name: 🪽 Create release + + on: + push: + tags: + - v* + + permissions: + contents: write + + jobs: + release: + name: Release pushed tag + runs-on: ubuntu-24.04 + steps: + - name: Create release env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # Or use your PAT - with: - tag_name: ${{ steps.github-tag-action.outputs.new_tag }} - release_name: Release ${{ steps.github-tag-action.outputs.new_tag }} - body: ${{ steps.release-notes.outputs.content }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + tag: ${{ github.ref_name }} + run: | + gh release create "$tag" \ + --repo="$GITHUB_REPOSITORY" \ + --title="${GITHUB_REPOSITORY#*/} ${tag#v}" \ + --generate-notes From 0b9e0dc6018f9849382563b6f2aa95e74e510272 Mon Sep 17 00:00:00 2001 From: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> Date: Thu, 9 Oct 2025 18:38:42 +0000 Subject: [PATCH 50/92] Create config.yml (#75) Add a CircleCI configuration file with a basic job and workflow CI: Add .circleci/config.yml using CircleCI 2.1 configuration format Define a Docker-based "say-hello" job that checks out the code and prints "Hello, World!" Create "say-hello-workflow" to orchestrate and run the "say-hello" job Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> --- .circleci/config.yml | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 .circleci/config.yml diff --git a/.circleci/config.yml b/.circleci/config.yml new file mode 100644 index 00000000000..d5d401c5189 --- /dev/null +++ b/.circleci/config.yml @@ -0,0 +1,31 @@ +# Use the latest 2.1 version of CircleCI pipeline process engine. +# See: https://circleci.com/docs/configuration-reference +version: 2.1 + +# Define a job to be invoked later in a workflow. +# See: https://circleci.com/docs/jobs-steps/#jobs-overview & https://circleci.com/docs/configuration-reference/#jobs +jobs: + say-hello: + # Specify the execution environment. You can specify an image from Docker Hub or use one of our convenience images from CircleCI's Developer Hub. + # See: https://circleci.com/docs/executor-intro/ & https://circleci.com/docs/configuration-reference/#executor-job + docker: + # Specify the version you desire here + # See: https://circleci.com/developer/images/image/cimg/base + - image: cimg/base:current + + # Add steps to the job + # See: https://circleci.com/docs/jobs-steps/#steps-overview & https://circleci.com/docs/configuration-reference/#steps + steps: + # Checkout the code as the first step. + - checkout + - run: + name: "Say hello" + command: "echo Hello, World!" + +# Orchestrate jobs using workflows +# See: https://circleci.com/docs/workflows/ & https://circleci.com/docs/configuration-reference/#workflows +workflows: + say-hello-workflow: # This is the name of the workflow, feel free to change it to better match your workflow. + # Inside the workflow, you define the jobs you want to run. + jobs: + - say-hello From 158f5146c430d8c1abaa56f93893adb74b3628c9 Mon Sep 17 00:00:00 2001 From: "snyk-io[bot]" <141718529+snyk-io[bot]@users.noreply.github.com> Date: Thu, 9 Oct 2025 18:16:15 +0000 Subject: [PATCH 51/92] fix: apps/mobile/Gemfile & apps/mobile/Gemfile.lock to reduce vulnerabilities The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-RUBY-REXML-12878608 - https://snyk.io/vuln/SNYK-RUBY-WEBRICK-10500756 - https://snyk.io/vuln/SNYK-RUBY-WEBRICK-8068535 - https://snyk.io/vuln/SNYK-RUBY-REXML-13110060 --- apps/mobile/Gemfile | 4 +- apps/mobile/Gemfile.lock | 184 ++++++++++++++++++++------------------- 2 files changed, 98 insertions(+), 90 deletions(-) diff --git a/apps/mobile/Gemfile b/apps/mobile/Gemfile index a07e6ca69f3..a9e494ea9a1 100644 --- a/apps/mobile/Gemfile +++ b/apps/mobile/Gemfile @@ -1,8 +1,8 @@ source "https://rubygems.org" -gem 'fastlane', '2.214.0' +gem 'fastlane', '2.215.0' # Exclude problematic versions of cocoapods and activesupport that causes build failures. -gem 'cocoapods', '1.14.3' +gem 'cocoapods', '1.15.0' gem 'activesupport', '7.1.2' gem 'xcodeproj', '1.27.0' gem 'concurrent-ruby', '1.3.4' diff --git a/apps/mobile/Gemfile.lock b/apps/mobile/Gemfile.lock index b5891798a1a..1cc3a294c88 100644 --- a/apps/mobile/Gemfile.lock +++ b/apps/mobile/Gemfile.lock @@ -1,7 +1,9 @@ GEM remote: https://rubygems.org/ specs: - CFPropertyList (3.0.6) + CFPropertyList (3.0.7) + base64 + nkf rexml activesupport (7.1.2) base64 @@ -13,37 +15,40 @@ GEM minitest (>= 5.1) mutex_m tzinfo (~> 2.0) - addressable (2.8.6) - public_suffix (>= 2.0.2, < 6.0) + addressable (2.8.7) + public_suffix (>= 2.0.2, < 7.0) algoliasearch (1.27.5) httpclient (~> 2.8, >= 2.8.3) json (>= 1.5.1) - artifactory (3.0.15) + artifactory (3.0.17) atomos (0.1.3) - aws-eventstream (1.3.0) - aws-partitions (1.877.0) - aws-sdk-core (3.190.1) + aws-eventstream (1.4.0) + aws-partitions (1.1170.0) + aws-sdk-core (3.233.0) aws-eventstream (~> 1, >= 1.3.0) - aws-partitions (~> 1, >= 1.651.0) - aws-sigv4 (~> 1.8) + aws-partitions (~> 1, >= 1.992.0) + aws-sigv4 (~> 1.9) + base64 + bigdecimal jmespath (~> 1, >= 1.6.1) - aws-sdk-kms (1.75.0) - aws-sdk-core (~> 3, >= 3.188.0) - aws-sigv4 (~> 1.1) - aws-sdk-s3 (1.142.0) - aws-sdk-core (~> 3, >= 3.189.0) + logger + aws-sdk-kms (1.113.0) + aws-sdk-core (~> 3, >= 3.231.0) + aws-sigv4 (~> 1.5) + aws-sdk-s3 (1.199.1) + aws-sdk-core (~> 3, >= 3.231.0) aws-sdk-kms (~> 1) - aws-sigv4 (~> 1.8) - aws-sigv4 (1.8.0) + aws-sigv4 (~> 1.5) + aws-sigv4 (1.12.1) aws-eventstream (~> 1, >= 1.0.2) babosa (1.0.4) - base64 (0.2.0) - bigdecimal (3.1.9) + base64 (0.3.0) + bigdecimal (3.3.1) claide (1.1.0) - cocoapods (1.14.3) + cocoapods (1.15.0) addressable (~> 2.8) claide (>= 1.0.2, < 2.0) - cocoapods-core (= 1.14.3) + cocoapods-core (= 1.15.0) cocoapods-deintegrate (>= 1.0.3, < 2.0) cocoapods-downloader (>= 2.1, < 3.0) cocoapods-plugins (>= 1.0.0, < 2.0) @@ -58,7 +63,7 @@ GEM nap (~> 1.0) ruby-macho (>= 2.3.0, < 3.0) xcodeproj (>= 1.23.0, < 2.0) - cocoapods-core (1.14.3) + cocoapods-core (1.15.0) activesupport (>= 5.0, < 8) addressable (~> 2.8) algoliasearch (~> 1.0) @@ -82,19 +87,19 @@ GEM commander (4.6.0) highline (~> 2.0.0) concurrent-ruby (1.3.4) - connection_pool (2.5.0) + connection_pool (2.5.4) declarative (0.0.20) - digest-crc (0.6.5) + digest-crc (0.7.0) rake (>= 12.0.0, < 14.0.0) - domain_name (0.6.20231109) + domain_name (0.6.20240107) dotenv (2.8.1) - drb (2.2.1) + drb (2.2.3) emoji_regex (3.2.3) escape (0.0.4) - ethon (0.16.0) + ethon (0.15.0) ffi (>= 1.15.0) - excon (0.109.0) - faraday (1.10.3) + excon (0.112.0) + faraday (1.10.4) faraday-em_http (~> 1.0) faraday-em_synchrony (~> 1.0) faraday-excon (~> 1.1) @@ -110,20 +115,20 @@ GEM faraday (>= 0.8.0) http-cookie (~> 1.0.0) faraday-em_http (1.0.0) - faraday-em_synchrony (1.0.0) + faraday-em_synchrony (1.0.1) faraday-excon (1.1.0) faraday-httpclient (1.0.1) - faraday-multipart (1.0.4) - multipart-post (~> 2) - faraday-net_http (1.0.1) + faraday-multipart (1.1.1) + multipart-post (~> 2.0) + faraday-net_http (1.0.2) faraday-net_http_persistent (1.2.0) faraday-patron (1.0.0) faraday-rack (1.0.0) faraday-retry (1.0.3) - faraday_middleware (1.2.0) + faraday_middleware (1.2.1) faraday (~> 1.0) - fastimage (2.3.0) - fastlane (2.214.0) + fastimage (2.4.0) + fastlane (2.215.0) CFPropertyList (>= 2.3, < 4.0.0) addressable (>= 2.8, < 3.0.0) artifactory (~> 3.0) @@ -144,6 +149,7 @@ GEM google-apis-playcustomapp_v1 (~> 0.1) google-cloud-storage (~> 1.31) highline (~> 2.0) + http-cookie (~> 1.0.5) json (< 3.0.0) jwt (>= 2.1.0, < 3) mini_magick (>= 4.9.4, < 5.0.0) @@ -155,116 +161,120 @@ GEM security (= 0.1.3) simctl (~> 1.6.3) terminal-notifier (>= 2.0.0, < 3.0.0) - terminal-table (>= 1.4.5, < 2.0.0) + terminal-table (~> 3) tty-screen (>= 0.6.3, < 1.0.0) tty-spinner (>= 0.8.0, < 1.0.0) word_wrap (~> 1.0.0) xcodeproj (>= 1.13.0, < 2.0.0) xcpretty (~> 0.3.0) xcpretty-travis-formatter (>= 0.0.3) - fastlane-plugin-get_version_name (0.2.2) - fastlane-plugin-versioning_android (0.1.1) - ffi (1.17.1) + ffi (1.17.2) fourflusher (2.3.1) fuzzy_match (2.0.4) gh_inspector (1.1.3) - google-apis-androidpublisher_v3 (0.54.0) - google-apis-core (>= 0.11.0, < 2.a) - google-apis-core (0.11.2) + google-apis-androidpublisher_v3 (0.87.0) + google-apis-core (>= 0.15.0, < 2.a) + google-apis-core (0.18.0) addressable (~> 2.5, >= 2.5.1) - googleauth (>= 0.16.2, < 2.a) - httpclient (>= 2.8.1, < 3.a) + googleauth (~> 1.9) + httpclient (>= 2.8.3, < 3.a) mini_mime (~> 1.0) + mutex_m representable (~> 3.0) retriable (>= 2.0, < 4.a) - rexml - webrick - google-apis-iamcredentials_v1 (0.17.0) - google-apis-core (>= 0.11.0, < 2.a) - google-apis-playcustomapp_v1 (0.13.0) - google-apis-core (>= 0.11.0, < 2.a) - google-apis-storage_v1 (0.29.0) - google-apis-core (>= 0.11.0, < 2.a) - google-cloud-core (1.6.1) + google-apis-iamcredentials_v1 (0.24.0) + google-apis-core (>= 0.15.0, < 2.a) + google-apis-playcustomapp_v1 (0.17.0) + google-apis-core (>= 0.15.0, < 2.a) + google-apis-storage_v1 (0.57.0) + google-apis-core (>= 0.15.0, < 2.a) + google-cloud-core (1.8.0) google-cloud-env (>= 1.0, < 3.a) google-cloud-errors (~> 1.0) - google-cloud-env (2.1.0) + google-cloud-env (2.3.1) + base64 (~> 0.2) faraday (>= 1.0, < 3.a) - google-cloud-errors (1.3.1) - google-cloud-storage (1.45.0) + google-cloud-errors (1.5.0) + google-cloud-storage (1.57.0) addressable (~> 2.8) digest-crc (~> 0.4) - google-apis-iamcredentials_v1 (~> 0.1) - google-apis-storage_v1 (~> 0.29.0) + google-apis-core (>= 0.18, < 2) + google-apis-iamcredentials_v1 (~> 0.18) + google-apis-storage_v1 (>= 0.42) google-cloud-core (~> 1.6) - googleauth (>= 0.16.2, < 2.a) + googleauth (~> 1.9) mini_mime (~> 1.0) - googleauth (1.9.1) + google-logging-utils (0.2.0) + googleauth (1.15.0) faraday (>= 1.0, < 3.a) - google-cloud-env (~> 2.1) - jwt (>= 1.4, < 3.0) + google-cloud-env (~> 2.2) + google-logging-utils (~> 0.1) + jwt (>= 1.4, < 4.0) multi_json (~> 1.11) os (>= 0.9, < 2.0) signet (>= 0.16, < 2.a) highline (2.0.3) - http-cookie (1.0.5) + http-cookie (1.0.8) domain_name (~> 0.5) - httpclient (2.8.3) + httpclient (2.9.0) + mutex_m i18n (1.14.7) concurrent-ruby (~> 1.0) jmespath (1.6.2) - json (2.7.1) - jwt (2.7.1) - mini_magick (4.12.0) + json (2.15.1) + jwt (2.10.2) + base64 + logger (1.7.0) + mini_magick (4.13.2) mini_mime (1.1.5) - minitest (5.25.4) + minitest (5.26.0) molinillo (0.8.0) - multi_json (1.15.0) - multipart-post (2.3.0) + multi_json (1.17.0) + multipart-post (2.4.1) mutex_m (0.3.0) nanaimo (0.4.0) nap (1.1.0) - naturally (2.2.1) + naturally (2.3.0) netrc (0.11.0) + nkf (0.2.0) optparse (0.1.1) os (1.1.4) - plist (3.7.1) + plist (3.7.2) public_suffix (4.0.7) - rake (13.1.0) + rake (13.3.0) representable (3.2.0) declarative (< 0.1.0) trailblazer-option (>= 0.1.1, < 0.2.0) uber (< 0.2.0) retriable (3.1.2) - rexml (3.4.1) + rexml (3.4.4) rouge (2.0.7) ruby-macho (2.5.1) ruby2_keywords (0.0.5) - rubyzip (2.3.2) + rubyzip (2.4.1) security (0.1.3) - signet (0.18.0) + signet (0.21.0) addressable (~> 2.8) faraday (>= 0.17.5, < 3.a) - jwt (>= 1.5, < 3.0) + jwt (>= 1.5, < 4.0) multi_json (~> 1.10) simctl (1.6.10) CFPropertyList naturally terminal-notifier (2.0.0) - terminal-table (1.8.0) - unicode-display_width (~> 1.1, >= 1.1.1) + terminal-table (3.0.2) + unicode-display_width (>= 1.1.1, < 3) trailblazer-option (0.1.2) tty-cursor (0.7.1) tty-screen (0.8.2) tty-spinner (0.9.3) tty-cursor (~> 0.7) - typhoeus (1.4.1) - ethon (>= 0.9.0) + typhoeus (1.5.0) + ethon (>= 0.9.0, < 0.16.0) tzinfo (2.0.6) concurrent-ruby (~> 1.0) uber (0.1.0) - unicode-display_width (1.8.0) - webrick (1.8.1) + unicode-display_width (2.6.0) word_wrap (1.0.0) xcodeproj (1.27.0) CFPropertyList (>= 2.3.3, < 4.0) @@ -283,12 +293,10 @@ PLATFORMS DEPENDENCIES activesupport (= 7.1.2) - cocoapods (= 1.14.3) + cocoapods (= 1.15.0) concurrent-ruby (= 1.3.4) - fastlane (= 2.214.0) - fastlane-plugin-get_version_name - fastlane-plugin-versioning_android + fastlane (= 2.215.0) xcodeproj (= 1.27.0) BUNDLED WITH - 2.4.10 + 2.3.27 From 1cbe82b0b79b3e6b72732c300f29dd0acb767957 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 9 Oct 2025 18:16:45 +0000 Subject: [PATCH 52/92] build(deps): bump the npm_and_yarn group across 7 directories with 5 updates Bumps the npm_and_yarn group with 2 updates in the /apps/extension directory: [webpack](https://github.com/webpack/webpack) and [webpack-dev-server](https://github.com/webpack/webpack-dev-server). Bumps the npm_and_yarn group with 1 update in the /apps/mobile directory: [react-native-mmkv](https://github.com/mrousavy/react-native-mmkv). Bumps the npm_and_yarn group with 3 updates in the /apps/web directory: [webpack](https://github.com/webpack/webpack), [graphql](https://github.com/graphql/graphql-js) and [hono](https://github.com/honojs/hono). Bumps the npm_and_yarn group with 1 update in the /packages/api directory: [graphql](https://github.com/graphql/graphql-js). Bumps the npm_and_yarn group with 2 updates in the /packages/uniswap directory: [react-native-mmkv](https://github.com/mrousavy/react-native-mmkv) and [graphql](https://github.com/graphql/graphql-js). Bumps the npm_and_yarn group with 1 update in the /packages/utilities directory: [graphql](https://github.com/graphql/graphql-js). Bumps the npm_and_yarn group with 1 update in the /packages/wallet directory: [graphql](https://github.com/graphql/graphql-js). Updates `webpack` from 5.90.0 to 5.94.0 - [Release notes](https://github.com/webpack/webpack/releases) - [Commits](https://github.com/webpack/webpack/compare/v5.90.0...v5.94.0) Updates `webpack-dev-server` from 4.15.1 to 5.2.1 - [Release notes](https://github.com/webpack/webpack-dev-server/releases) - [Changelog](https://github.com/webpack/webpack-dev-server/blob/main/CHANGELOG.md) - [Commits](https://github.com/webpack/webpack-dev-server/compare/v4.15.1...v5.2.1) Updates `react-native-mmkv` from 2.10.1 to 2.11.0 - [Release notes](https://github.com/mrousavy/react-native-mmkv/releases) - [Commits](https://github.com/mrousavy/react-native-mmkv/compare/v2.10.1...v2.11.0) Updates `webpack` from 5.90.0 to 5.94.0 - [Release notes](https://github.com/webpack/webpack/releases) - [Commits](https://github.com/webpack/webpack/compare/v5.90.0...v5.94.0) Updates `graphql` from 16.6.0 to 16.8.1 - [Release notes](https://github.com/graphql/graphql-js/releases) - [Commits](https://github.com/graphql/graphql-js/compare/v16.6.0...v16.8.1) Updates `hono` from 4.8.4 to 4.9.7 - [Release notes](https://github.com/honojs/hono/releases) - [Commits](https://github.com/honojs/hono/compare/v4.8.4...v4.9.7) Updates `graphql` from 16.6.0 to 16.8.1 - [Release notes](https://github.com/graphql/graphql-js/releases) - [Commits](https://github.com/graphql/graphql-js/compare/v16.6.0...v16.8.1) Updates `react-native-mmkv` from 2.10.1 to 2.11.0 - [Release notes](https://github.com/mrousavy/react-native-mmkv/releases) - [Commits](https://github.com/mrousavy/react-native-mmkv/compare/v2.10.1...v2.11.0) Updates `graphql` from 16.6.0 to 16.8.1 - [Release notes](https://github.com/graphql/graphql-js/releases) - [Commits](https://github.com/graphql/graphql-js/compare/v16.6.0...v16.8.1) Updates `graphql` from 16.6.0 to 16.8.1 - [Release notes](https://github.com/graphql/graphql-js/releases) - [Commits](https://github.com/graphql/graphql-js/compare/v16.6.0...v16.8.1) Updates `graphql` from 16.6.0 to 16.8.1 - [Release notes](https://github.com/graphql/graphql-js/releases) - [Commits](https://github.com/graphql/graphql-js/compare/v16.6.0...v16.8.1) --- updated-dependencies: - dependency-name: webpack dependency-version: 5.94.0 dependency-type: direct:development dependency-group: npm_and_yarn - dependency-name: webpack-dev-server dependency-version: 5.2.1 dependency-type: direct:development dependency-group: npm_and_yarn - dependency-name: react-native-mmkv dependency-version: 2.11.0 dependency-type: direct:production dependency-group: npm_and_yarn - dependency-name: webpack dependency-version: 5.94.0 dependency-type: direct:development dependency-group: npm_and_yarn - dependency-name: graphql dependency-version: 16.8.1 dependency-type: direct:production dependency-group: npm_and_yarn - dependency-name: hono dependency-version: 4.9.7 dependency-type: direct:production dependency-group: npm_and_yarn - dependency-name: graphql dependency-version: 16.8.1 dependency-type: direct:production dependency-group: npm_and_yarn - dependency-name: react-native-mmkv dependency-version: 2.11.0 dependency-type: direct:production dependency-group: npm_and_yarn - dependency-name: graphql dependency-version: 16.8.1 dependency-type: direct:production dependency-group: npm_and_yarn - dependency-name: graphql dependency-version: 16.8.1 dependency-type: direct:production dependency-group: npm_and_yarn - dependency-name: graphql dependency-version: 16.8.1 dependency-type: direct:production dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] --- apps/extension/package.json | 4 ++-- apps/mobile/package.json | 2 +- apps/web/package.json | 6 +++--- packages/api/package.json | 2 +- packages/uniswap/package.json | 4 ++-- packages/utilities/package.json | 2 +- packages/wallet/package.json | 2 +- 7 files changed, 11 insertions(+), 11 deletions(-) diff --git a/apps/extension/package.json b/apps/extension/package.json index 5a62068364d..ac67f4fe010 100644 --- a/apps/extension/package.json +++ b/apps/extension/package.json @@ -97,9 +97,9 @@ "swc-loader": "0.2.6", "tamagui-loader": "1.125.17", "typescript": "5.3.3", - "webpack": "5.90.0", + "webpack": "5.94.0", "webpack-cli": "5.1.4", - "webpack-dev-server": "4.15.1" + "webpack-dev-server": "5.2.1" }, "private": true, "scripts": { diff --git a/apps/mobile/package.json b/apps/mobile/package.json index b39462fe118..422cbd68341 100644 --- a/apps/mobile/package.json +++ b/apps/mobile/package.json @@ -153,7 +153,7 @@ "react-native-keyboard-controller": "1.17.5", "react-native-localize": "2.2.6", "react-native-markdown-display": "7.0.0-alpha.2", - "react-native-mmkv": "2.10.1", + "react-native-mmkv": "2.11.0", "react-native-onesignal": "5.2.9", "react-native-pager-view": "6.5.1", "react-native-passkey": "3.1.0", diff --git a/apps/web/package.json b/apps/web/package.json index 264da854f4e..757d51e367f 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -141,7 +141,7 @@ "vitest": "3.2.1", "vitest-fetch-mock": "0.4.5", "wait-on": "8.0.2", - "webpack": "5.90.0", + "webpack": "5.94.0", "wrangler": "4.28.0" }, "dependencies": { @@ -213,8 +213,8 @@ "ethers": "5.7.2", "fancy-canvas": "2.1.0", "framer-motion": "10.17.6", - "graphql": "16.6.0", - "hono": "4.8.4", + "graphql": "16.8.1", + "hono": "4.9.7", "html-entities": "2.6.0", "i18next": "23.10.0", "jotai": "1.3.7", diff --git a/packages/api/package.json b/packages/api/package.json index 1f537020b17..40f39ddccc2 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -8,7 +8,7 @@ "@universe/config": "workspace:^", "@universe/sessions": "workspace:^", "expo-secure-store": "14.0.1", - "graphql": "16.6.0", + "graphql": "16.8.1", "react": "18.3.1", "utilities": "workspace:^" }, diff --git a/packages/uniswap/package.json b/packages/uniswap/package.json index f4db7bdb1b3..fa142a1b1fd 100644 --- a/packages/uniswap/package.json +++ b/packages/uniswap/package.json @@ -75,7 +75,7 @@ "expo-haptics": "14.0.1", "expo-web-browser": "14.0.2", "fuse.js": "6.5.3", - "graphql": "16.6.0", + "graphql": "16.8.1", "i18next": "23.10.0", "i18next-resources-to-backend": "1.2.1", "idb-keyval": "6.2.1", @@ -95,7 +95,7 @@ "react-native-fast-image": "8.6.3", "react-native-gesture-handler": "2.22.1", "react-native-localize": "2.2.6", - "react-native-mmkv": "2.10.1", + "react-native-mmkv": "2.11.0", "react-native-reanimated": "3.16.7", "react-native-svg": "15.11.2", "react-native-webview": "13.13.5", diff --git a/packages/utilities/package.json b/packages/utilities/package.json index 94ce33a3b3f..116f59393d3 100644 --- a/packages/utilities/package.json +++ b/packages/utilities/package.json @@ -24,7 +24,7 @@ "@uniswap/sdk-core": "7.7.2", "dayjs": "1.11.7", "expo-localization": "16.0.1", - "graphql": "16.6.0", + "graphql": "16.8.1", "jsbi": "3.2.5", "promise": "8.3.0", "react": "18.3.1", diff --git a/packages/wallet/package.json b/packages/wallet/package.json index 3e0634f44ef..c84d751abf2 100644 --- a/packages/wallet/package.json +++ b/packages/wallet/package.json @@ -36,7 +36,7 @@ "dayjs": "1.11.7", "ethers": "5.7.2", "fuse.js": "6.5.3", - "graphql": "16.6.0", + "graphql": "16.8.1", "i18next": "23.10.0", "jsbi": "3.2.5", "lodash": "4.17.21", From 9ec565f326ffce0392b3d907c2f82dab21facee0 Mon Sep 17 00:00:00 2001 From: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> Date: Fri, 10 Oct 2025 02:04:35 +0700 Subject: [PATCH 53/92] Create notify vercel.yml Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> --- .github/workflows/notify vercel.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 .github/workflows/notify vercel.yml diff --git a/.github/workflows/notify vercel.yml b/.github/workflows/notify vercel.yml new file mode 100644 index 00000000000..ae9288a9d30 --- /dev/null +++ b/.github/workflows/notify vercel.yml @@ -0,0 +1,4 @@ +- name: 'notify vercel' + uses: 'vercel/repository-dispatch/actions/status@v1' + with: + name: Vercel - interface-web: notify vercel From 6fec7e2a8bc47755cbaed7c0c9e6d4621ae30ca9 Mon Sep 17 00:00:00 2001 From: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> Date: Fri, 10 Oct 2025 03:02:52 +0700 Subject: [PATCH 54/92] Delete .github/workflows/notify vercel.yml Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> --- .github/workflows/notify vercel.yml | 4 ---- 1 file changed, 4 deletions(-) delete mode 100644 .github/workflows/notify vercel.yml diff --git a/.github/workflows/notify vercel.yml b/.github/workflows/notify vercel.yml deleted file mode 100644 index ae9288a9d30..00000000000 --- a/.github/workflows/notify vercel.yml +++ /dev/null @@ -1,4 +0,0 @@ -- name: 'notify vercel' - uses: 'vercel/repository-dispatch/actions/status@v1' - with: - name: Vercel - interface-web: notify vercel From 5422b1925ab795ea6264190d1eb3b28650b5c6a9 Mon Sep 17 00:00:00 2001 From: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> Date: Fri, 10 Oct 2025 04:15:42 +0700 Subject: [PATCH 55/92] Update static.yml Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> --- .github/workflows/static.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/static.yml b/.github/workflows/static.yml index f2c9e97c91d..c1100987a39 100644 --- a/.github/workflows/static.yml +++ b/.github/workflows/static.yml @@ -1,6 +1,5 @@ # Simple workflow for deploying static content to GitHub Pages name: Deploy static content to Pages - on: # Runs on pushes targeting the default branch push: From fbe55b59da28411ce6cf232ba8299b801c5465d1 Mon Sep 17 00:00:00 2001 From: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> Date: Fri, 10 Oct 2025 04:34:02 +0700 Subject: [PATCH 56/92] Update jekyll-gh-pages.yml Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> --- .github/workflows/jekyll-gh-pages.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/jekyll-gh-pages.yml b/.github/workflows/jekyll-gh-pages.yml index e31d81c5864..2ea15f25992 100644 --- a/.github/workflows/jekyll-gh-pages.yml +++ b/.github/workflows/jekyll-gh-pages.yml @@ -1,6 +1,5 @@ # Sample workflow for building and deploying a Jekyll site to GitHub Pages name: Deploy Jekyll with GitHub Pages dependencies preinstalled - on: # Runs on pushes targeting the default branch push: From 3f6d466632146384b383f9f1ee521ddfcdbecf20 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 20 Oct 2025 19:04:58 +0000 Subject: [PATCH 57/92] build(deps-dev): bump playwright Bumps the npm_and_yarn group with 1 update in the /apps/web directory: [playwright](https://github.com/microsoft/playwright). Updates `playwright` from 1.49.1 to 1.55.1 - [Release notes](https://github.com/microsoft/playwright/releases) - [Commits](https://github.com/microsoft/playwright/compare/v1.49.1...v1.55.1) --- updated-dependencies: - dependency-name: playwright dependency-version: 1.55.1 dependency-type: direct:development dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] --- apps/web/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/web/package.json b/apps/web/package.json index 757d51e367f..4009a64efb4 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -116,7 +116,7 @@ "jest-styled-components": "7.2.0", "lint-staged": "14.0.1", "madge": "6.1.0", - "playwright": "1.49.1", + "playwright": "1.55.1", "postinstall-postinstall": "2.1.0", "process": "0.11.10", "prop-types": "15.8.1", From 8d28ba55d28236c8c6afe8aac85e1392c0925173 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 24 Oct 2025 23:40:39 +0000 Subject: [PATCH 58/92] build(deps): bump hono Bumps the npm_and_yarn group with 1 update in the /apps/web directory: [hono](https://github.com/honojs/hono). Updates `hono` from 4.9.7 to 4.10.3 - [Release notes](https://github.com/honojs/hono/releases) - [Commits](https://github.com/honojs/hono/compare/v4.9.7...v4.10.3) --- updated-dependencies: - dependency-name: hono dependency-version: 4.10.3 dependency-type: direct:production dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] --- apps/web/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/web/package.json b/apps/web/package.json index 4009a64efb4..adf5afbb5bc 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -214,7 +214,7 @@ "fancy-canvas": "2.1.0", "framer-motion": "10.17.6", "graphql": "16.8.1", - "hono": "4.9.7", + "hono": "4.10.3", "html-entities": "2.6.0", "i18next": "23.10.0", "jotai": "1.3.7", From 5db5983f60e987d7f32af31c2ad8d186e4a0a069 Mon Sep 17 00:00:00 2001 From: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Sun, 26 Oct 2025 12:22:27 +0000 Subject: [PATCH 59/92] Create ci-web3-gamefi.yml (#86) Summary by Sourcery Introduce a new CircleCI configuration for the Web3 GameFi project New Features: Add .circleci/ci-web3-gamefi.yml to define a CircleCI pipeline for the web3-gamefi project Define a custom Docker-based executor for use in the pipeline Enhancements: Configure a placeholder job and workflow to scaffold future CI steps Use environment variables for Docker Hub authentication in the executor https://github.com/apps/gemini-code-assist Code Review This pull request introduces a new CircleCI workflow file. The initial setup is a good start, but there are several areas for improvement to enhance maintainability and clarity. I've pointed out the use of generic names for the executor, job, and workflow, which should be made more descriptive. The job name also appears to have a typo with a trailing hyphen. Additionally, the job's run step is currently empty, and a comment contains a hardcoded, non-portable URL. Addressing these points will make the CI configuration more robust and easier to understand. Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --- .circleci/ci-web3-gamefi.yml | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 .circleci/ci-web3-gamefi.yml diff --git a/.circleci/ci-web3-gamefi.yml b/.circleci/ci-web3-gamefi.yml new file mode 100644 index 00000000000..ad53a8e4982 --- /dev/null +++ b/.circleci/ci-web3-gamefi.yml @@ -0,0 +1,26 @@ +# Use the latest 2.1 version of CircleCI pipeline process engine. +# See: https://circleci.com/docs/configuration-reference + +version: 2.1 +executors: + my-custom-executor: + docker: + - image: cimg/base:stable + auth: + # ensure you have first added these secrets + # visit app.circleci.com/settings/project/github/Dargon789/foundry/environment-variables + username: $DOCKER_HUB_USER + password: $DOCKER_HUB_PASSWORD +jobs: + web3-defi-game-project-: + + executor: my-custom-executor + steps: + - checkout + - run: | + # echo Hello, World! + +workflows: + my-custom-workflow: + jobs: + - web3-defi-game-project- From 7f595cd180db8a7eeac4f0a7c14be589439efe1e Mon Sep 17 00:00:00 2001 From: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Sun, 26 Oct 2025 15:54:12 +0000 Subject: [PATCH 60/92] Create docker.yml (#87) Add a new GitHub Actions workflow under .circleci/docker.yml to automate Docker image building, pushing, and signing with Buildx, caching, and cosign on scheduled and event-driven triggers New Features: Add Docker GitHub Actions workflow to build and push container images to the registry Integrate cosign to sign published images outside of pull requests Enhancements: Use Docker Buildx for multi-platform builds with GitHub Actions cache Extract and apply Docker metadata (tags and labels) via docker/metadata-action CI: Trigger the Docker workflow on a daily cron, master branch pushes, pull requests, and semver tag creations Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --- .circleci/docker.yml | 100 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 100 insertions(+) create mode 100644 .circleci/docker.yml diff --git a/.circleci/docker.yml b/.circleci/docker.yml new file mode 100644 index 00000000000..e994f94e708 --- /dev/null +++ b/.circleci/docker.yml @@ -0,0 +1,100 @@ +name: Docker + +# This workflow uses actions that are not certified by GitHub. +# They are provided by a third-party and are governed by +# separate terms of service, privacy policy, and support +# documentation. + +on: + schedule: + - cron: '21 12 * * *' + push: + branches: [ "master" ] + # Publish semver tags as releases. + tags: [ 'v*.*.*' ] + pull_request: + branches: [ "master" ] + +env: + # Use docker.io for Docker Hub if empty + REGISTRY: ghcr.io + # github.repository as / + IMAGE_NAME: ${{ github.repository }} + + +jobs: + build: + - name: Build the Docker image + run: docker build . --file path/to/Dockerfile --tag my-image-name:$(date +%s) + + runs-on: ubuntu-latest + permissions: + contents: read + packages: write + # This is used to complete the identity challenge + # with sigstore/fulcio when running outside of PRs. + id-token: write + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + # Install the cosign tool except on PR + # https://github.com/sigstore/cosign-installer + - name: Install cosign + if: github.event_name != 'pull_request' + uses: sigstore/cosign-installer@59acb6260d9c0ba8f4a2f9d9b48431a222b68e20 #v3.5.0 + with: + cosign-release: 'v2.2.4' + + # Set up BuildKit Docker container builder to be able to build + # multi-platform images and export cache + # https://github.com/docker/setup-buildx-action + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@f95db51fddba0c2d1ec667646a06c2ce06100226 # v3.0.0 + + # Login against a Docker registry except on PR + # https://github.com/docker/login-action + - name: Log into registry ${{ env.REGISTRY }} + if: github.event_name != 'pull_request' + uses: docker/login-action@343f7c4344506bcbf9b4de18042ae17996df046d # v3.0.0 + with: + registry: ${{ env.REGISTRY }} + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + # Extract metadata (tags, labels) for Docker + # https://github.com/docker/metadata-action + - name: Extract Docker metadata + id: meta + uses: docker/metadata-action@96383f45573cb7f253c731d3b3ab81c87ef81934 # v5.0.0 + with: + images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} + + # Build and push Docker image with Buildx (don't push on PR) + # https://github.com/docker/build-push-action + - name: Build and push Docker image + id: build-and-push + uses: docker/build-push-action@v5.0.0 + with: + context: ./ + push: ${{ github.event_name != 'pull_request' }} + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} + cache-from: type=gha + cache-to: type=gha,mode=max + + # Sign the resulting Docker image digest except on PRs. + # This will only write to the public Rekor transparency log when the Docker + # repository is public to avoid leaking data. If you would like to publish + # transparency data even for private images, pass --force to cosign below. + # https://github.com/sigstore/cosign + - name: Sign the published Docker image + if: ${{ github.event_name != 'pull_request' }} + env: + # https://docs.github.com/en/actions/security-guides/security-hardening-for-github-actions#using-an-intermediate-environment-variable + TAGS: ${{ steps.meta.outputs.tags }} + DIGEST: ${{ steps.build-and-push.outputs.digest }} + # This step uses the identity token to provision an ephemeral certificate + # against the sigstore community Fulcio instance. + run: echo "${TAGS}" | xargs -I {} cosign sign --yes {}@${DIGEST} From 73418e68474f33aa69df2d5e3d92c3783fc67655 Mon Sep 17 00:00:00 2001 From: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Mon, 27 Oct 2025 04:16:43 +0000 Subject: [PATCH 61/92] Create docker.yml (#88) Summary by Sourcery Add a GitHub Actions workflow to automate Docker image builds, tagging, caching, pushing to a registry, and signing with cosign, triggered on a daily schedule, main branch updates, semver tag releases, and pull requests. New Features: Introduce a Docker build-and-push workflow using GitHub Actions to create and publish multi-platform images on a schedule, main branch pushes, and semver tag releases. Integrate cosign to sign published Docker images automatically on non-pull-request runs. Enhancements: Set up Docker Buildx and GitHub Actions cache-to/cache-from for optimized multi-platform builds and faster rebuilds. CI: Add .github/workflows/docker.yml to handle Docker build, push, metadata extraction, and signing processes. Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --- .github/workflows/docker.yml | 100 +++++++++++++++++++++++++++++++++++ 1 file changed, 100 insertions(+) create mode 100644 .github/workflows/docker.yml diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml new file mode 100644 index 00000000000..fad6d04d70f --- /dev/null +++ b/.github/workflows/docker.yml @@ -0,0 +1,100 @@ +name: Docker + +# This workflow uses actions that are not certified by GitHub. +# They are provided by a third-party and are governed by +# separate terms of service, privacy policy, and support +# documentation. + +on: + schedule: + - cron: '21 12 * * *' + push: + branches: [ "main" ] + # Publish semver tags as releases. + tags: [ 'v*.*.*' ] + pull_request: + branches: [ "main" ] + +env: + # Use docker.io for Docker Hub if empty + REGISTRY: ghcr.io + # github.repository as / + IMAGE_NAME: ${{ github.repository }} + + +jobs: + build: + - name: Build the Docker image + run: docker build . --file path/to/Dockerfile --tag my-image-name:$(date +%s) + + runs-on: ubuntu-latest + permissions: + contents: read + packages: write + # This is used to complete the identity challenge + # with sigstore/fulcio when running outside of PRs. + id-token: write + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + # Install the cosign tool except on PR + # https://github.com/sigstore/cosign-installer + - name: Install cosign + if: github.event_name != 'pull_request' + uses: sigstore/cosign-installer@59acb6260d9c0ba8f4a2f9d9b48431a222b68e20 #v3.5.0 + with: + cosign-release: 'v2.2.4' + + # Set up BuildKit Docker container builder to be able to build + # multi-platform images and export cache + # https://github.com/docker/setup-buildx-action + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@f95db51fddba0c2d1ec667646a06c2ce06100226 # v3.0.0 + + # Login against a Docker registry except on PR + # https://github.com/docker/login-action + - name: Log into registry ${{ env.REGISTRY }} + if: github.event_name != 'pull_request' + uses: docker/login-action@343f7c4344506bcbf9b4de18042ae17996df046d # v3.0.0 + with: + registry: ${{ env.REGISTRY }} + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + # Extract metadata (tags, labels) for Docker + # https://github.com/docker/metadata-action + - name: Extract Docker metadata + id: meta + uses: docker/metadata-action@96383f45573cb7f253c731d3b3ab81c87ef81934 # v5.0.0 + with: + images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} + + # Build and push Docker image with Buildx (don't push on PR) + # https://github.com/docker/build-push-action + - name: Build and push Docker image + id: build-and-push + uses: docker/build-push-action@v5.0.0 + with: + context: ./ + push: ${{ github.event_name != 'pull_request' }} + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} + cache-from: type=gha + cache-to: type=gha,mode=max + + # Sign the resulting Docker image digest except on PRs. + # This will only write to the public Rekor transparency log when the Docker + # repository is public to avoid leaking data. If you would like to publish + # transparency data even for private images, pass --force to cosign below. + # https://github.com/sigstore/cosign + - name: Sign the published Docker image + if: ${{ github.event_name != 'pull_request' }} + env: + # https://docs.github.com/en/actions/security-guides/security-hardening-for-github-actions#using-an-intermediate-environment-variable + TAGS: ${{ steps.meta.outputs.tags }} + DIGEST: ${{ steps.build-and-push.outputs.digest }} + # This step uses the identity token to provision an ephemeral certificate + # against the sigstore community Fulcio instance. + run: echo "${TAGS}" | xargs -I {} cosign sign --yes {}@${DIGEST} From 557b3bd02c5ccc6df9fe4c93e80447ac3879ee88 Mon Sep 17 00:00:00 2001 From: Uniswap Labs Service Account Date: Tue, 28 Oct 2025 19:55:37 +0000 Subject: [PATCH 62/92] ci(release): publish latest release --- .gitignore | 7 +- RELEASE | 52 +- VERSION | 2 +- apps/extension/package.json | 1 + apps/extension/src/app/apollo.tsx | 10 +- .../src/app/components/AutoLockProvider.tsx | 3 +- .../src/app/core/StatsigProvider.tsx | 3 +- .../app/core/initStatSigForBrowserScripts.tsx | 3 +- .../useShouldShowBiometricUnlock.ts | 3 +- .../useShouldShowBiometricUnlockEnrollment.ts | 3 +- .../SignTypedDataRequestContent.tsx | 3 +- .../src/app/features/dappRequests/saga.ts | 3 +- .../src/app/features/home/HomeScreen.tsx | 3 +- .../features/home/PortfolioActionButtons.tsx | 3 +- .../src/app/features/home/PortfolioHeader.tsx | 2 +- .../onboarding/import/SelectWallets.tsx | 3 +- .../onboarding/scan/ScanToOnboard.tsx | 2 +- .../app/features/settings/SettingsScreen.tsx | 3 +- .../useIsExtensionPasskeyImportEnabled.ts | 3 +- .../src/entrypoints/sidepanel/main.tsx | 3 + apps/extension/tsconfig.json | 3 + .../deeplinks/deeplink-comprehensive.yaml | 128 +- .../flows/restore/restore-new-device.yaml | 21 +- .../shared-flows/navigate-to-explore.yaml | 23 +- apps/mobile/package.json | 1 + apps/mobile/src/app/App.tsx | 25 +- .../app/MobileWalletNavigationProvider.tsx | 3 +- .../app/modals/BridgedAssetWarningWrapper.tsx | 3 +- apps/mobile/src/app/navigation/navigation.tsx | 3 +- .../tabs/CustomTabBar/CustomTabBar.tsx | 1 + .../navigation/tabs/SwapLongPressModal.tsx | 3 +- .../PriceExplorer/PriceExplorer.tsx | 19 +- .../src/components/PriceExplorer/Text.tsx | 43 +- .../__snapshots__/Text.test.tsx.snap | 9 +- .../components/PriceExplorer/useFiatDelta.tsx | 116 ++ .../src/components/PriceExplorer/usePrice.tsx | 2 +- .../PriceExplorer/usePriceHistory.ts | 2 +- .../ModalWithOverlay/ModalWithOverlay.tsx | 3 +- .../WalletConnectRequestModal.tsx | 3 +- .../Requests/ScanSheet/WalletConnectModal.tsx | 3 +- .../Requests/ScanSheet/util.test.ts | 84 ++ .../src/components/Requests/ScanSheet/util.ts | 29 +- .../src/components/Requests/Uwulink/utils.ts | 14 +- .../TokenDetailsBridgedAssetSection.tsx | 4 +- .../src/components/accounts/AccountHeader.tsx | 5 +- .../components/activity/ActivityContent.tsx | 11 +- .../src/components/carousel/Carousel.tsx | 4 +- .../ExploreSections/ExploreSections.tsx | 3 +- .../search/ExploreScreenSearchResultsList.tsx | 3 +- .../src/components/home/HomeExploreTab.tsx | 3 +- apps/mobile/src/components/home/TokensTab.tsx | 3 +- apps/mobile/src/components/home/hooks.tsx | 17 +- .../home/introCards/FundWalletModal.tsx | 3 +- .../introCards/OnboardingIntroCardStack.tsx | 3 +- .../src/components/layout/TabHelpers.tsx | 3 +- .../components/loading/parts/WaveLoader.tsx | 1 - .../datadog/DatadogProviderWrapper.tsx | 10 +- .../src/features/deepLinking/configUtils.ts | 4 +- .../src/features/deepLinking/deepLinkUtils.ts | 2 +- .../deepLinking/handleDeepLinkSaga.test.ts | 6 +- .../deepLinking/handleDeepLinkSaga.ts | 3 +- .../deepLinking/handleOnRampReturnLinkSaga.ts | 3 +- .../deepLinking/handleTransactionLinkSaga.ts | 3 +- .../features/lockScreen/LockScreenModal.tsx | 3 +- .../src/features/send/SendFormButton.tsx | 3 +- .../src/features/wallet/useWalletRestore.ts | 3 +- .../walletConnect/batchedTransactionSaga.ts | 3 +- .../mobile/src/features/walletConnect/saga.ts | 3 +- apps/mobile/src/screens/ActivityScreen.tsx | 11 +- apps/mobile/src/screens/AppLoadingScreen.tsx | 3 +- apps/mobile/src/screens/ExploreScreen.tsx | 5 +- .../src/screens/HomeScreen/HomeScreen.tsx | 3 +- .../HomeScreen/HomeScreenQuickActions.tsx | 3 +- .../src/screens/Import/ImportMethodScreen.tsx | 3 +- .../screens/Import/OnDeviceRecoveryScreen.tsx | 3 +- .../screens/Import/RestoreMethodScreen.tsx | 3 +- .../src/screens/Import/SelectWalletScreen.tsx | 3 +- .../src/screens/Onboarding/LandingScreen.tsx | 5 +- apps/mobile/src/screens/SettingsScreen.tsx | 3 +- .../mobile/src/screens/TokenDetailsScreen.tsx | 9 +- .../ViewPrivateKeys/ViewPrivateKeysScreen.tsx | 3 +- apps/mobile/tsconfig.json | 3 + apps/web/.eslintrc.js | 26 + apps/web/package.json | 3 +- apps/web/project.json | 4 +- .../images/portfolio_page_promo/dark.png | Bin 0 -> 232460 bytes .../images/portfolio_page_promo/light.png | Bin 0 -> 279063 bytes apps/web/public/pools-sitemap.xml | 20 + apps/web/public/tokens-sitemap.xml | 90 ++ apps/web/src/appGraphql/data/util.tsx | 6 + .../images/portfolio-page-promo/dark.svg | 778 +++++++++++ .../images/portfolio-page-promo/light.svg | 778 +++++++++++ apps/web/src/assets/svg/Emblem/A.svg | 4 + apps/web/src/assets/svg/Emblem/B.svg | 3 + apps/web/src/assets/svg/Emblem/C.svg | 18 + apps/web/src/assets/svg/Emblem/D.svg | 4 + apps/web/src/assets/svg/Emblem/E.svg | 3 + apps/web/src/assets/svg/Emblem/F.svg | 3 + apps/web/src/assets/svg/Emblem/G.svg | 3 + apps/web/src/assets/svg/Emblem/default.svg | 3 + .../AccountDrawer/AuthenticatedHeader.tsx | 3 +- .../AccountDrawer/DisconnectButton.tsx | 3 +- .../Activity/ActivityTab.anvil.e2e.test.ts | 1 + .../MiniPortfolio/ExtensionDeeplinks.tsx | 2 +- .../MiniPortfolio/Pools/PoolsTab.tsx | 2 +- .../MiniPortfolio/PortfolioRow.tsx | 60 +- .../ActivityTable/ActivityAddressCell.tsx | 27 + .../ActivityTable/ActivityAmountCell.tsx | 255 ++++ .../ActivityTable/ActivityTable.tsx | 123 ++ .../ActivityTable/AddressWithAvatar.tsx | 42 + .../src/components/ActivityTable/TimeCell.tsx | 15 + .../ActivityTable/TokenAmountDisplay.tsx | 32 + .../ActivityTable/TransactionTypeCell.tsx | 30 + .../ActivityTable/activityTableModels.ts | 61 + .../src/components/ActivityTable/registry.ts | 246 ++++ .../BridgingPopularTokensBanner.tsx | 108 ++ .../src/components/Banner/shared/Banners.tsx | 13 +- .../D3LiquidityRangeChart.tsx | 10 +- .../components/D3LiquidityMinMaxInput.tsx | 17 +- .../D3LiquidityRangeChart/store/types.ts | 2 +- .../D3LiquidityRangeChart/utils/tickUtils.ts | 2 +- .../D3LiquidityRangeInput.tsx | 7 +- .../Charts/LiquidityChart/index.tsx | 2 +- .../LiquidityPositionRangeChart.tsx | 2 +- .../LiquidityRangeInput.tsx | 2 +- .../Charts/LiquidityRangeInput/hooks.ts | 2 +- .../components/Charts/PriceChart/index.tsx | 66 +- apps/web/src/components/Expand/index.tsx | 59 +- .../FeatureFlagModal/FeatureFlagModal.tsx | 24 +- .../src/components/HelpModal/HelpContent.tsx | 3 +- .../src/components/HelpModal/HelpModal.tsx | 26 +- .../components/Liquidity/ClaimFeeModal.tsx | 2 +- .../components/Liquidity/Create/AddHook.tsx | 2 +- .../components/Liquidity/Create/EditStep.tsx | 2 +- .../Liquidity/Create/FormWrapper.tsx | 2 +- .../Create/PositionOutOfRangeError.tsx | 2 +- .../Liquidity/Create/RangeSelectionStep.tsx | 6 +- .../Liquidity/Create/SelectTokenStep.tsx | 16 +- .../Create/hooks/useDepositInfo.test.ts | 6 +- .../Liquidity/Create/hooks/useDepositInfo.tsx | 2 +- .../hooks/useDerivedPositionInfo.test.ts | 8 +- .../Create/hooks/useDerivedPositionInfo.tsx | 5 +- .../Create/hooks/useLPSlippageValues.test.ts | 6 +- .../Create/hooks/useLPSlippageValues.ts | 5 +- ...seNativeTokenPercentageBufferExperiment.ts | 3 +- .../src/components/Liquidity/Create/types.ts | 14 +- apps/web/src/components/Liquidity/Deposit.tsx | 2 +- .../Liquidity/DisplayCurrentPrice.tsx | 3 +- .../Liquidity/FeeTierSearchModal.tsx | 3 +- .../Liquidity/LiquidityPositionCard.tsx | 5 +- .../Liquidity/LiquidityPositionFeeStats.tsx | 2 +- .../Liquidity/LiquidityPositionInfo.test.tsx | 2 +- .../Liquidity/LiquidityPositionInfo.tsx | 2 +- .../LiquidityPositionInfoBadges.test.tsx | 2 +- .../Liquidity/LiquidityPositionInfoBadges.tsx | 2 +- .../LiquidityPositionStatusIndicator.test.tsx | 2 +- .../LiquidityPositionStatusIndicator.tsx | 2 +- .../Liquidity/PositionPageActionButtons.tsx | 2 +- .../components/Liquidity/PositionsHeader.tsx | 2 +- .../src/components/Liquidity/TokenInfo.tsx | 2 +- .../web/src/components/Liquidity/analytics.ts | 2 +- .../web/src/components/Liquidity/constants.ts | 2 +- .../hooks/useAllFeeTierPoolData.test.tsx | 2 +- .../Liquidity/hooks/useAllFeeTierPoolData.ts | 2 +- apps/web/src/components/Liquidity/types.ts | 2 +- .../Liquidity/utils/currency.test.ts | 2 +- .../components/Liquidity/utils/currency.ts | 2 +- .../Liquidity/utils/feeTiers.test.ts | 2 +- .../components/Liquidity/utils/feeTiers.ts | 2 +- ...etPoolIdOrAddressFromCreatePositionInfo.ts | 2 +- .../Liquidity/utils/getPositionUrl.test.ts | 2 +- .../Liquidity/utils/getPositionUrl.ts | 2 +- .../utils/hasLPFoTTransferError.test.ts | 2 +- .../Liquidity/utils/hasLPFoTTransferError.ts | 2 +- .../Liquidity/utils/parseFromRest.test.ts | 2 +- .../Liquidity/utils/parseFromRest.ts | 2 +- .../Liquidity/utils/priceRangeInfo.test.ts | 2 +- .../Liquidity/utils/priceRangeInfo.ts | 2 +- .../Liquidity/utils/protocolVersion.test.ts | 2 +- .../Liquidity/utils/protocolVersion.ts | 2 +- .../NavBar/CompanyMenu/MenuDropdown.tsx | 27 +- .../NavBar/CompanyMenu/MobileMenuDrawer.tsx | 22 +- .../components/NavBar/CompanyMenu/index.tsx | 2 +- .../NavBar/DownloadApp/Modal/GetStarted.tsx | 3 +- .../NavBar/DownloadApp/Modal/index.tsx | 3 +- .../DownloadApp/NewUserCTAButton.test.tsx | 11 +- .../NavBar/DownloadApp/NewUserCTAButton.tsx | 3 +- .../NavBar/LegalAndPrivacyMenu/index.tsx | 6 +- .../NavBar/NavDropdown/NavDropdown.tsx | 7 +- .../NavBar/SearchBar/SearchModal.tsx | 3 +- .../src/components/NavBar/SearchBar/index.tsx | 3 +- .../NavBar/SearchBar/useIsSearchBarVisible.ts | 3 +- .../components/NavBar/Tabs/TabsContent.tsx | 3 +- apps/web/src/components/NavBar/index.tsx | 3 +- .../Pools/PoolDetails/ChartSection/index.tsx | 4 +- .../Pools/PoolDetails/PoolDetailsHeader.tsx | 3 +- .../PoolDetails/PoolDetailsStatsButtons.tsx | 2 +- .../components/Pools/PoolTable/PoolTable.tsx | 3 +- apps/web/src/components/Popups/PopupItem.tsx | 1 + .../components/Popups/ToastRegularSimple.tsx | 6 +- .../src/components/StatusIcon/index.test.tsx | 11 +- apps/web/src/components/Table/index.tsx | 72 +- .../Tokens/TokenDetails/BalanceSummary.tsx | 7 +- .../TokenDetails/BridgedAssetSection.tsx | 3 +- .../components/Tokens/TokenDetails/Delta.tsx | 26 +- .../__snapshots__/Delta.test.tsx.snap | 10 +- .../components/Tokens/TokenDetails/index.tsx | 2 +- .../WalletModal/DownloadWalletOption.tsx | 3 +- .../WalletModal/UniswapWalletOptions.test.tsx | 30 +- .../WalletModal/WalletConnectorOption.tsx | 3 +- .../UniswapWalletOptions.test.tsx.snap | 4 +- apps/web/src/components/WalletModal/index.tsx | 3 +- .../Web3Provider/WebUniswapContext.tsx | 3 +- .../Web3Provider/rejectableConnector.ts | 52 + .../Web3Provider/wagmiAutoConnect.ts | 4 +- .../components/Web3Provider/wagmiConfig.ts | 5 +- .../Web3Status/RecentlyConnectedModal.tsx | 3 +- apps/web/src/components/Web3Status/index.tsx | 3 +- apps/web/src/dev/DevFlagsBox.tsx | 5 +- .../src/featureFlags/flags/outageBanner.ts | 3 +- .../useFeatureFlagUrlOverrides.tsx | 3 +- .../features/accounts/store/provider.test.tsx | 8 +- .../src/features/accounts/store/provider.tsx | 3 +- .../src/features/accounts/store/updater.tsx | 3 +- .../connection/connectors/solana.test.ts | 3 +- .../hooks/useOrderedWalletConnectors.test.ts | 14 +- .../hooks/useOrderedWalletConnectors.ts | 3 +- .../providers/ExternalWalletProvider.tsx | 3 +- apps/web/src/hooks/useConfirmModalState.ts | 20 +- .../hooks/useIsUniswapExtensionConnected.ts | 3 +- .../src/hooks/useIsUniswapXSupportedChain.ts | 3 +- .../hooks/useLpIncentivesFormattedEarnings.ts | 5 +- apps/web/src/hooks/usePoolTickData.ts | 2 +- apps/web/src/hooks/usePositionTokenURI.ts | 2 +- apps/web/src/index.tsx | 5 +- .../hooks/routing/useRoutingAPIArguments.ts | 3 +- apps/web/src/lib/utils/analytics.ts | 8 +- .../pages/App/WalletConnection.e2e.test.ts | 2 +- .../CreateLiquidityContextProvider.tsx | 5 +- .../CreatePosition.anvil.e2e.test.ts | 7 +- .../CreatePosition/CreatePosition.e2e.test.ts | 8 +- .../pages/CreatePosition/CreatePosition.tsx | 2 +- .../CreatePosition/CreatePositionModal.tsx | 2 +- .../CreatePositionTxContext.test.ts | 2 +- .../CreatePositionTxContext.tsx | 2 +- apps/web/src/pages/Errors.anvil.e2e.test.ts | 18 +- apps/web/src/pages/Explore/ProtocolFilter.tsx | 2 +- apps/web/src/pages/Explore/redirects.tsx | 3 +- .../useExternallyConnectableExtensionId.ts | 3 +- .../IncreaseLiquidity.anvil.e2e.test.ts | 2 +- .../IncreaseLiquidityForm.tsx | 2 +- .../IncreaseLiquidityReview.tsx | 2 +- .../IncreaseLiquidityTxContext.tsx | 2 +- .../hooks/useDerivedIncreaseLiquidityInfo.ts | 2 +- .../web/src/pages/Landing/sections/Footer.tsx | 6 +- apps/web/src/pages/Landing/sections/Hero.tsx | 2 +- apps/web/src/pages/LegacyPool/redirects.tsx | 2 +- .../web/src/pages/MigrateV2/MigrateV2Pair.tsx | 2 +- .../MigrateV3/MigrateV3.anvil.e2e.test.ts | 2 +- .../src/pages/MigrateV3/MigrateV3.e2e.test.ts | 2 +- .../MigrateV3/MigrateV3LiquidityTxContext.tsx | 2 +- .../MigrateV3/hooks/useInitialPosition.ts | 2 +- apps/web/src/pages/MigrateV3/index.tsx | 2 +- apps/web/src/pages/PoolDetails/index.tsx | 3 +- .../src/pages/Portfolio/Activity/Activity.tsx | 137 +- .../pages/Portfolio/Activity/Filters/utils.ts | 104 +- .../pages/Portfolio/ConnectWalletBanner.tsx | 124 ++ .../Portfolio/ConnectWalletBottomOverlay.tsx | 47 + .../src/pages/Portfolio/ConnectWalletView.tsx | 41 - .../web/src/pages/Portfolio/Header/Header.tsx | 30 +- .../ConnectedAddressDisplay.tsx | 39 + .../DemoAddressDisplay.tsx | 37 + .../PortfolioAddressDisplay.tsx | 9 + .../Portfolio/Header/hooks/useIsConnected.ts | 7 + apps/web/src/pages/Portfolio/NFTs/NFTCard.tsx | 144 ++ apps/web/src/pages/Portfolio/NFTs/Nfts.tsx | 75 + .../Portfolio/NFTs/utils/filterNfts.test.ts | 257 ++++ .../pages/Portfolio/NFTs/utils/filterNfts.ts | 32 + apps/web/src/pages/Portfolio/Nfts.tsx | 30 - apps/web/src/pages/Portfolio/Portfolio.tsx | 101 +- .../src/pages/Portfolio/PortfolioContent.tsx | 42 + .../Portfolio/PortfolioDisconnectedView.tsx | 105 ++ .../Tokens/Table/TokensContextMenuWrapper.tsx | 4 +- .../Portfolio/Tokens/Table/TokensTable.tsx | 56 + .../Table/{Table.tsx => TokensTableInner.tsx} | 73 +- .../Tokens/Table/columns/Balance.tsx | 2 +- .../web/src/pages/Portfolio/Tokens/Tokens.tsx | 121 +- .../hooks/useTransformTokenTableData.ts | 74 +- .../Tokens/utils/filterTokensBySearch.test.ts | 280 ++++ .../Tokens/utils/filterTokensBySearch.ts | 28 + .../Portfolio/hooks/usePortfolioAddress.ts | 13 + .../Positions/ClaimFees.anvil.e2e.test.ts | 2 +- apps/web/src/pages/Positions/PositionPage.tsx | 5 +- apps/web/src/pages/Positions/TopPools.tsx | 3 +- .../src/pages/Positions/V2PositionPage.tsx | 5 +- apps/web/src/pages/Positions/index.tsx | 5 +- .../RemoveLiquidity.anvil.e2e.test.ts | 2 +- .../RemoveLiquidityModalContext.tsx | 2 +- .../RemoveLiquidity/RemoveLiquidityReview.tsx | 2 +- .../hooks/useRemoveLiquidityTxAndGasInfo.ts | 2 +- apps/web/src/pages/RouteDefinitions.tsx | 3 +- apps/web/src/pages/Swap/Buy/Buy.e2e.test.ts | 3 + apps/web/src/pages/Swap/Buy/hooks.ts | 3 +- .../web/src/pages/Swap/Fees.anvil.e2e.test.ts | 1 + apps/web/src/pages/Swap/Fees.e2e.test.ts | 4 +- apps/web/src/pages/Swap/Limit/LimitForm.tsx | 3 +- .../src/pages/Swap/Logging.anvil.e2e.test.ts | 1 + .../Swap/Send/NewAddressSpeedBump.test.tsx | 3 +- apps/web/src/pages/Swap/Send/SendForm.tsx | 3 +- .../web/src/pages/Swap/Swap.anvil.e2e.test.ts | 22 +- apps/web/src/pages/Swap/index.tsx | 46 +- .../pages/Swap/settings/useWebSwapSettings.ts | 3 +- .../web/src/playwright/anvil/anvil-manager.ts | 4 +- apps/web/src/playwright/fixtures/anvil.ts | 13 +- .../web/src/playwright/fixtures/tradingApi.ts | 12 +- apps/web/src/setupTests.ts | 7 +- .../state/activity/polling/transactions.ts | 3 +- .../src/state/explore/protocolStats.test.tsx | 9 +- apps/web/src/state/explore/topPools.ts | 2 +- apps/web/src/state/limit/hooks.ts | 3 +- .../state/routing/useRoutingAPITrade.test.ts | 3 +- .../state/sagas/liquidity/liquiditySaga.ts | 3 +- apps/web/src/state/sagas/root.ts | 2 + apps/web/src/state/sagas/transactions/5792.ts | 4 +- .../src/state/sagas/transactions/solana.ts | 72 +- .../src/state/sagas/transactions/swapSaga.ts | 104 +- .../src/state/sagas/transactions/uniswapx.ts | 2 +- .../web/src/state/sagas/transactions/utils.ts | 45 +- .../src/state/sagas/transactions/wrapSaga.ts | 4 +- apps/web/src/state/swap/hooks.test.tsx | 114 +- apps/web/src/state/swap/hooks.tsx | 25 +- apps/web/src/state/transactions/types.ts | 6 +- .../hooks/useMismatchAccount.ts | 3 +- .../hooks/useWalletGetCapabilitiesMutation.ts | 3 +- .../src/utils/computeSurroundingTicks.test.ts | 2 +- apps/web/src/utils/computeSurroundingTicks.ts | 2 +- apps/web/tsconfig.json | 3 + apps/web/vite.config.mts | 2 +- bun.lock | 300 ++-- config/jest-presets/jest/jest-preset.js | 2 +- config/jest-presets/jest/setup.js | 54 +- config/vitest-presets/vitest/vitest-preset.js | 1 - dangerfile.ts | 2 +- nx.json | 30 +- package.json | 41 +- packages/api/package.json | 3 +- .../api/src/clients/graphql/queries.graphql | 6 + .../api/src/clients/graphql/schema.graphql | 59 +- .../createNotificationsApiClient.ts | 49 + .../api/src/clients/notifications/types.ts | 38 + .../api/src/clients/trading/tradeTypes.ts | 4 +- packages/api/src/connectRpc/utils.ts | 2 +- packages/api/src/index.ts | 12 +- packages/biome-config/base.jsonc | 12 +- packages/gating/.eslintrc.js | 46 + packages/gating/README.md | 3 + packages/gating/package.json | 31 + packages/gating/project.json | 16 + .../src}/LocalOverrideAdapterWrapper.ts | 2 +- .../features/gating => gating/src}/configs.ts | 61 +- .../gating => gating/src}/constants.ts | 0 .../gating => gating/src}/experiments.ts | 10 + .../features/gating => gating/src}/flags.ts | 2 + .../src}/getStatsigEnvName.ts | 0 .../features/gating => gating/src}/hooks.ts | 10 +- packages/gating/src/index.ts | 86 ++ .../src}/sdk/statsig.native.ts | 6 +- .../gating => gating/src}/sdk/statsig.ts | 2 +- .../features/gating => gating/src}/utils.ts | 2 +- packages/gating/tsconfig.json | 19 + packages/gating/tsconfig.lint.json | 8 + packages/notifications/.eslintrc.js | 45 + packages/notifications/README.md | 73 + packages/notifications/package.json | 18 + packages/notifications/project.json | 16 + packages/notifications/src/index.ts | 0 packages/notifications/tsconfig.json | 12 + packages/notifications/tsconfig.lint.json | 8 + .../graphics/bridged-assets-v2-web-banner.png | Bin 0 -> 128449 bytes packages/ui/src/assets/index.ts | 1 + .../components/swipeablecards/BaseCard.tsx | 2 +- .../src/components/switch/Switch.native.tsx | 2 +- packages/ui/src/loading/Shine.native.tsx | 2 +- packages/ui/src/loading/Skeleton.native.tsx | 1 - .../ui/src/loading/SpinningLoader.native.tsx | 2 +- packages/uniswap/jest-package-mocks.js | 6 +- packages/uniswap/package.json | 10 +- .../BridgedAsset/BridgedAssetModal.tsx | 10 +- .../components/BridgedAsset/WormholeModal.tsx | 17 +- .../src/components/BridgedAsset/utils.ts | 23 - .../AmountInputPresets/AmountInputPresets.tsx | 37 +- .../AmountInputPresets/types.ts | 13 +- .../CurrencyInputPanel/CurrencyInputPanel.tsx | 31 +- .../CurrencyInputPanelHeader.tsx | 31 +- .../TokenSelector/TokenSelector.tsx | 3 +- .../TokenSelector/TokenSelectorList.tsx | 3 +- .../components/TokenSelector/hooks.test.ts | 31 +- .../details/TransactionDetailsModal.test.tsx | 3 +- .../SwapTransactionDetails.test.tsx | 3 +- .../TransferTransactionDetails.test.tsx | 3 +- .../gating/DynamicConfigDropdown.tsx | 4 +- .../src/components/gating/GatingOverrides.tsx | 23 +- .../uniswap/src/components/gating/Rows.tsx | 3 +- .../gating/dynamicConfigOverrides.tsx | 2 +- .../lists/items/pools/PoolOptionItem.tsx | 2 +- .../items/pools/PoolOptionItemContextMenu.tsx | 2 +- .../usePoolSearchResultsToPoolOptions.tsx | 2 +- .../items/pools/usePoolStatsToPoolOptions.tsx | 2 +- .../src/components/lists/items/types.ts | 2 +- .../uniswap/src/components/nfts/NftView.tsx | 6 +- .../uniswap/src/components/nfts/NftsList.tsx | 7 +- .../src/components/nfts/NftsList.web.tsx | 66 +- .../NotificationToast.native.tsx | 4 +- .../apiClients/tradingApi/TradingApiClient.ts | 3 +- .../apiClients/uniswapApi/useGasFeeQuery.ts | 2 +- .../conversionTracking/useConversionProxy.ts | 3 +- .../useConversionTracking.ts | 3 +- packages/uniswap/src/data/rest/getPair.ts | 19 - packages/uniswap/src/data/rest/getPools.ts | 4 +- .../uniswap/src/data/rest/getPoolsRewards.ts | 4 +- .../uniswap/src/data/rest/getPortfolio.ts | 5 +- packages/uniswap/src/data/rest/getPosition.ts | 4 +- .../uniswap/src/data/rest/getPositions.ts | 6 +- .../data/rest/portfolioBalanceOverrides.ts | 21 +- .../src/data/rest/searchTokensAndPools.ts | 61 +- .../activity/formatTransactionsByDate.ts | 21 +- .../src/features/behaviorHistory/slice.ts | 6 + .../src/features/chains/evm/info/avalanche.ts | 2 +- .../src/features/chains/evm/info/celo.ts | 2 +- .../src/features/chains/evm/info/mainnet.ts | 2 +- .../src/features/chains/evm/info/monad.ts | 2 +- .../src/features/chains/evm/info/polygon.ts | 2 +- .../src/features/chains/gasDefaults.ts | 2 +- .../chains/hooks/useFeatureFlaggedChainIds.ts | 3 +- .../features/chains/hooks/useNewChainIds.ts | 3 +- .../chains/hooks/useOrderedChainIds.ts | 3 +- packages/uniswap/src/features/chains/types.ts | 2 +- .../src/features/dataApi/balances/balances.ts | 31 +- .../features/dataApi/balances/balancesRest.ts | 3 +- .../tokenProjects/tokenProjects.test.tsx | 14 +- .../utils/tokenProjectToCurrencyInfos.test.ts | 2 + .../utils/tokenProjectToCurrencyInfos.ts | 5 +- .../uniswap/src/features/dataApi/types.ts | 5 + .../utils/gqlTokenToCurrencyInfo.test.ts | 2 + .../dataApi/utils/gqlTokenToCurrencyInfo.ts | 5 +- .../hooks/useFormatChartFiatDelta.ts | 31 + .../priceChart/formatters/shared/types.ts | 37 + .../priceChart/formatters/shared/utils.ts | 93 ++ .../formatters/stablecoinFormatter.ts | 84 ++ .../formatters/standardFormatter.ts | 88 ++ .../priceChart/priceChartConversion.test.ts | 1204 +++++++++++++++++ .../priceChart/priceChartConversion.ts | 42 + .../hooks/useForceUpgradeStatus.ts | 3 +- .../hooks/useForceUpgradeTranslations.ts | 8 +- packages/uniswap/src/features/gas/hooks.ts | 3 +- .../gas/hooks/useMaxAmountSpend.test.ts | 3 +- .../features/gas/hooks/useMaxAmountSpend.ts | 3 +- packages/uniswap/src/features/gas/utils.ts | 8 +- .../gating/StatsigProviderWrapper.tsx | 8 +- .../src/features/gating/statsigBaseConfig.ts | 3 +- .../uniswap/src/features/gating/typeGuards.ts | 2 +- .../uniswap/src/features/language/hooks.tsx | 2 +- .../nfts/hooks/useNftContextMenuItems.tsx | 3 +- .../passkey/hooks/useEmbeddedWalletBaseUrl.ts | 3 +- .../PortfolioBalance/PortfolioBalance.tsx | 35 +- .../uniswap/src/features/portfolio/api.ts | 3 +- .../isInstantTokenBalanceUpdateEnabled.ts | 3 +- .../rest/fetchOnChainBalancesRest.test.ts | 66 +- .../rest/fetchOnChainBalancesRest.ts | 87 +- ...estQueriesViaOnchainOverrideVariantSaga.ts | 16 +- .../src/features/providers/rpcUrlSelector.ts | 3 +- .../features/search/SearchHistoryResult.ts | 2 +- .../search/SearchModal/analytics/analytics.ts | 2 +- .../SearchModal/hooks/useFilterCallbacks.ts | 86 +- .../src/features/settings/hooks.test.ts | 3 +- .../smartWallet/mismatch/MismatchContext.tsx | 3 +- .../telemetry/constants/trace/element.ts | 2 + .../telemetry/constants/trace/section.ts | 1 + .../features/telemetry/constants/uniswap.ts | 7 +- .../uniswap/src/features/telemetry/types.ts | 4 + .../utils/logExperimentQualifyingEvent.ts | 9 + .../useBlockaidFeeComparisonAnalytics.ts | 3 +- .../DecimalPadInput/DecimalPad.native.tsx | 2 +- .../TransactionSettingsRow.tsx | 3 +- .../slippage/useSlippageSettings.ts | 2 +- .../transactions/components/settings/types.ts | 2 +- .../hooks/useGetCanSignPermits.ts | 3 +- .../hooks/useGetSwapDelegationAddress.ts | 3 +- .../hooks/usePollingIntervalByChain.ts | 4 +- .../features/transactions/liquidity/types.ts | 2 +- .../src/features/transactions/steps/types.ts | 49 + .../SlippageInfo/SlippageInfoCaption.tsx | 2 +- .../hooks/useSwapFormButtonText.ts | 3 +- .../TradeRoutingPreferenceScreen.tsx | 4 +- .../AnimatedTokenFlip.tsx | 2 +- .../GradientContainer.native.tsx | 2 +- .../GradientContainer.web.tsx | 2 +- .../useReceiptSuccessHandler.ts | 24 +- .../hooks/receiptFetching/utils.ts | 78 ++ .../SwapFormDecimalPad.native.tsx | 31 +- .../swap/hooks/useIsForFiltersEnabled.ts | 3 +- .../hooks/useIsUnichainFlashblocksEnabled.ts | 129 +- .../swap/hooks/useNeedsBridgedAssetWarning.ts | 10 +- .../swap/hooks/usePriceUXEnabled.ts | 3 +- .../transactions/swap/plan/planSaga.ts | 243 ++++ .../swap/plan/planStepTransformer.ts | 62 + .../features/transactions/swap/plan/utils.ts | 35 + .../hooks/useCreateSwapReviewCallbacks.tsx | 3 +- .../services/swapTxAndGasInfoService/hooks.ts | 3 +- .../swapFormStore/hooks/useDerivedSwapInfo.ts | 3 +- .../SwapTxStoreContextProvider.tsx | 3 +- .../hooks/useTransactionRequestInfo.test.ts | 4 +- .../hooks/useTransactionRequestInfo.ts | 4 +- .../features/transactions/swap/types/trade.ts | 1 + .../swap/utils/getIsWebForNudgeEnabled.ts | 3 +- .../transactions/swap/utils/protocols.test.ts | 6 +- .../transactions/swap/utils/protocols.ts | 4 +- .../transactions/swap/utils/routing.ts | 12 +- .../features/transactions/swap/utils/trade.ts | 10 + .../swap/utils/tradingApi.test.ts | 5 +- .../transactions/swap/utils/tradingApi.ts | 3 +- .../features/unitags/ClaimUnitagContent.tsx | 18 +- .../src/i18n/locales/source/en-US.json | 26 +- .../src/i18n/locales/translations/af-ZA.json | 3 +- .../src/i18n/locales/translations/ar-SA.json | 3 +- .../src/i18n/locales/translations/ca-ES.json | 3 +- .../src/i18n/locales/translations/da-DK.json | 3 +- .../src/i18n/locales/translations/el-GR.json | 3 +- .../src/i18n/locales/translations/es-ES.json | 28 +- .../src/i18n/locales/translations/fi-FI.json | 3 +- .../src/i18n/locales/translations/fil-PH.json | 28 +- .../src/i18n/locales/translations/fr-FR.json | 28 +- .../src/i18n/locales/translations/he-IL.json | 3 +- .../src/i18n/locales/translations/hi-IN.json | 3 +- .../src/i18n/locales/translations/hu-HU.json | 3 +- .../src/i18n/locales/translations/id-ID.json | 28 +- .../src/i18n/locales/translations/it-IT.json | 3 +- .../src/i18n/locales/translations/ja-JP.json | 28 +- .../src/i18n/locales/translations/ko-KR.json | 28 +- .../src/i18n/locales/translations/ms-MY.json | 3 +- .../src/i18n/locales/translations/nl-NL.json | 28 +- .../src/i18n/locales/translations/pl-PL.json | 3 +- .../src/i18n/locales/translations/pt-PT.json | 28 +- .../src/i18n/locales/translations/ru-RU.json | 28 +- .../src/i18n/locales/translations/sl-SI.json | 3 +- .../src/i18n/locales/translations/sr-SP.json | 3 +- .../src/i18n/locales/translations/sv-SE.json | 3 +- .../src/i18n/locales/translations/sw-TZ.json | 3 +- .../src/i18n/locales/translations/tr-TR.json | 28 +- .../src/i18n/locales/translations/uk-UA.json | 3 +- .../src/i18n/locales/translations/ur-PK.json | 3 +- .../src/i18n/locales/translations/vi-VN.json | 28 +- .../src/i18n/locales/translations/zh-CN.json | 28 +- .../src/i18n/locales/translations/zh-TW.json | 28 +- packages/uniswap/src/state/oldTypes.ts | 2 +- .../src/test/fixtures/gql/assets/tokens.ts | 2 + packages/uniswap/src/test/fixtures/testIDs.ts | 2 + packages/uniswap/src/test/mocks/gql/mocks.ts | 2 + packages/uniswap/src/utils/datadog.web.ts | 17 +- .../search/doesTokenMatchSearchTerm.test.ts | 419 ++++++ .../utils/search/doesTokenMatchSearchTerm.ts | 37 + ...etPossibleChainMatchFromSearchWord.test.ts | 437 ++++++ .../getPossibleChainMatchFromSearchWord.ts | 47 + .../parseChainFromTokenSearchQuery.test.ts | 138 ++ .../search/parseChainFromTokenSearchQuery.ts | 81 ++ packages/uniswap/tsconfig.json | 3 + packages/wallet/package.json | 3 +- .../components/landing/LandingBackground.tsx | 4 +- .../smartWallet/smartAccounts/hooks.ts | 3 +- .../src/features/gating/userPropertyHooks.ts | 2 +- .../smartWallet/hooks/useNetworkBalances.tsx | 2 +- .../contexts/WalletUniswapContext.tsx | 3 +- .../services/featureFlagService.ts | 4 +- .../services/featureFlagServiceImpl.ts | 4 +- .../transactionConfigServiceImpl.test.ts | 2 +- .../services/transactionConfigServiceImpl.ts | 3 +- .../executeTransaction/tryGetNonce.ts | 12 +- .../transactions/send/TokenSelectorPanel.tsx | 1 - .../transactions/swap/confirmation.ts | 3 +- .../transactions/swap/executeSwapSaga.ts | 3 +- .../swap/hooks/useSwapHandlers.ts | 3 +- .../swap/modals/QueuedOrderModal.tsx | 3 +- .../swap/prepareAndSignSwapSaga.test.ts | 3 +- .../swap/prepareAndSignSwapSaga.ts | 3 +- .../swap/settings/SwapProtection.tsx | 2 +- .../transactions/swap/swapSaga.test.ts | 3 +- .../features/transactions/swap/swapSaga.ts | 22 +- .../watcher/transactionFinalizationSaga.ts | 3 +- .../watchOnChainTransactionSaga.test.ts | 3 +- .../watcher/watchOnChainTransactionSaga.ts | 3 +- packages/wallet/tsconfig.json | 3 + scripts/clean.sh | 88 +- scripts/remove-local-packages.sh | 14 + .../src/generators/package/files/biome.json | 6 - .../generators/package/files/tsconfig.json | 2 +- .../src/generators/package/package.ts | 28 +- tsconfig.base.json | 4 +- tsconfig.json | 6 + 598 files changed, 11278 insertions(+), 2162 deletions(-) create mode 100644 apps/mobile/src/components/PriceExplorer/useFiatDelta.tsx create mode 100644 apps/web/public/images/portfolio_page_promo/dark.png create mode 100644 apps/web/public/images/portfolio_page_promo/light.png create mode 100644 apps/web/src/assets/images/portfolio-page-promo/dark.svg create mode 100644 apps/web/src/assets/images/portfolio-page-promo/light.svg create mode 100644 apps/web/src/assets/svg/Emblem/A.svg create mode 100644 apps/web/src/assets/svg/Emblem/B.svg create mode 100644 apps/web/src/assets/svg/Emblem/C.svg create mode 100644 apps/web/src/assets/svg/Emblem/D.svg create mode 100644 apps/web/src/assets/svg/Emblem/E.svg create mode 100644 apps/web/src/assets/svg/Emblem/F.svg create mode 100644 apps/web/src/assets/svg/Emblem/G.svg create mode 100644 apps/web/src/assets/svg/Emblem/default.svg create mode 100644 apps/web/src/components/ActivityTable/ActivityAddressCell.tsx create mode 100644 apps/web/src/components/ActivityTable/ActivityAmountCell.tsx create mode 100644 apps/web/src/components/ActivityTable/ActivityTable.tsx create mode 100644 apps/web/src/components/ActivityTable/AddressWithAvatar.tsx create mode 100644 apps/web/src/components/ActivityTable/TimeCell.tsx create mode 100644 apps/web/src/components/ActivityTable/TokenAmountDisplay.tsx create mode 100644 apps/web/src/components/ActivityTable/TransactionTypeCell.tsx create mode 100644 apps/web/src/components/ActivityTable/activityTableModels.ts create mode 100644 apps/web/src/components/ActivityTable/registry.ts create mode 100644 apps/web/src/components/Banner/BridgingPopularTokens/BridgingPopularTokensBanner.tsx create mode 100644 apps/web/src/components/Web3Provider/rejectableConnector.ts create mode 100644 apps/web/src/pages/Portfolio/ConnectWalletBanner.tsx create mode 100644 apps/web/src/pages/Portfolio/ConnectWalletBottomOverlay.tsx delete mode 100644 apps/web/src/pages/Portfolio/ConnectWalletView.tsx create mode 100644 apps/web/src/pages/Portfolio/Header/PortfolioAddressDisplay/ConnectedAddressDisplay.tsx create mode 100644 apps/web/src/pages/Portfolio/Header/PortfolioAddressDisplay/DemoAddressDisplay.tsx create mode 100644 apps/web/src/pages/Portfolio/Header/PortfolioAddressDisplay/PortfolioAddressDisplay.tsx create mode 100644 apps/web/src/pages/Portfolio/Header/hooks/useIsConnected.ts create mode 100644 apps/web/src/pages/Portfolio/NFTs/NFTCard.tsx create mode 100644 apps/web/src/pages/Portfolio/NFTs/Nfts.tsx create mode 100644 apps/web/src/pages/Portfolio/NFTs/utils/filterNfts.test.ts create mode 100644 apps/web/src/pages/Portfolio/NFTs/utils/filterNfts.ts delete mode 100644 apps/web/src/pages/Portfolio/Nfts.tsx create mode 100644 apps/web/src/pages/Portfolio/PortfolioContent.tsx create mode 100644 apps/web/src/pages/Portfolio/PortfolioDisconnectedView.tsx create mode 100644 apps/web/src/pages/Portfolio/Tokens/Table/TokensTable.tsx rename apps/web/src/pages/Portfolio/Tokens/Table/{Table.tsx => TokensTableInner.tsx} (66%) create mode 100644 apps/web/src/pages/Portfolio/Tokens/utils/filterTokensBySearch.test.ts create mode 100644 apps/web/src/pages/Portfolio/Tokens/utils/filterTokensBySearch.ts create mode 100644 apps/web/src/pages/Portfolio/hooks/usePortfolioAddress.ts create mode 100644 packages/api/src/clients/notifications/createNotificationsApiClient.ts create mode 100644 packages/api/src/clients/notifications/types.ts create mode 100644 packages/gating/.eslintrc.js create mode 100644 packages/gating/README.md create mode 100644 packages/gating/package.json create mode 100644 packages/gating/project.json rename packages/{uniswap/src/features/gating => gating/src}/LocalOverrideAdapterWrapper.ts (95%) rename packages/{uniswap/src/features/gating => gating/src}/configs.ts (81%) rename packages/{uniswap/src/features/gating => gating/src}/constants.ts (100%) rename packages/{uniswap/src/features/gating => gating/src}/experiments.ts (83%) rename packages/{uniswap/src/features/gating => gating/src}/flags.ts (98%) rename packages/{uniswap/src/features/gating => gating/src}/getStatsigEnvName.ts (100%) rename packages/{uniswap/src/features/gating => gating/src}/hooks.ts (95%) create mode 100644 packages/gating/src/index.ts rename packages/{uniswap/src/features/gating => gating/src}/sdk/statsig.native.ts (83%) rename packages/{uniswap/src/features/gating => gating/src}/sdk/statsig.ts (92%) rename packages/{uniswap/src/features/gating => gating/src}/utils.ts (92%) create mode 100644 packages/gating/tsconfig.json create mode 100644 packages/gating/tsconfig.lint.json create mode 100644 packages/notifications/.eslintrc.js create mode 100644 packages/notifications/README.md create mode 100644 packages/notifications/package.json create mode 100644 packages/notifications/project.json create mode 100644 packages/notifications/src/index.ts create mode 100644 packages/notifications/tsconfig.json create mode 100644 packages/notifications/tsconfig.lint.json create mode 100644 packages/ui/src/assets/graphics/bridged-assets-v2-web-banner.png delete mode 100644 packages/uniswap/src/components/BridgedAsset/utils.ts delete mode 100644 packages/uniswap/src/data/rest/getPair.ts create mode 100644 packages/uniswap/src/features/fiatCurrency/hooks/useFormatChartFiatDelta.ts create mode 100644 packages/uniswap/src/features/fiatCurrency/priceChart/formatters/shared/types.ts create mode 100644 packages/uniswap/src/features/fiatCurrency/priceChart/formatters/shared/utils.ts create mode 100644 packages/uniswap/src/features/fiatCurrency/priceChart/formatters/stablecoinFormatter.ts create mode 100644 packages/uniswap/src/features/fiatCurrency/priceChart/formatters/standardFormatter.ts create mode 100644 packages/uniswap/src/features/fiatCurrency/priceChart/priceChartConversion.test.ts create mode 100644 packages/uniswap/src/features/fiatCurrency/priceChart/priceChartConversion.ts create mode 100644 packages/uniswap/src/features/telemetry/utils/logExperimentQualifyingEvent.ts create mode 100644 packages/uniswap/src/features/transactions/swap/plan/planSaga.ts create mode 100644 packages/uniswap/src/features/transactions/swap/plan/planStepTransformer.ts create mode 100644 packages/uniswap/src/features/transactions/swap/plan/utils.ts create mode 100644 packages/uniswap/src/utils/search/doesTokenMatchSearchTerm.test.ts create mode 100644 packages/uniswap/src/utils/search/doesTokenMatchSearchTerm.ts create mode 100644 packages/uniswap/src/utils/search/getPossibleChainMatchFromSearchWord.test.ts create mode 100644 packages/uniswap/src/utils/search/getPossibleChainMatchFromSearchWord.ts create mode 100644 packages/uniswap/src/utils/search/parseChainFromTokenSearchQuery.test.ts create mode 100644 packages/uniswap/src/utils/search/parseChainFromTokenSearchQuery.ts create mode 100755 scripts/remove-local-packages.sh delete mode 100644 tools/uniswap-nx/src/generators/package/files/biome.json diff --git a/.gitignore b/.gitignore index 3b3a172871a..b3c573b208b 100644 --- a/.gitignore +++ b/.gitignore @@ -76,9 +76,10 @@ CLAUDE.local.md # lefthook .lefthook/ - - +# Nx .nx/cache .nx/workspace-data -.cursor/rules/nx-rules.mdc .github/instructions/nx.instructions.md + +# Spec Workflow MCP +.spec-workflow/ diff --git a/RELEASE b/RELEASE index 80f8e3ca3e2..12680356c4b 100644 --- a/RELEASE +++ b/RELEASE @@ -1,6 +1,6 @@ IPFS hash of the deployment: -- CIDv0: `QmZmRjJXcRL1HVbuFBLX23qqmQydzmqGsLmb94qrqTU9A7` -- CIDv1: `bafybeifjzfti2rq27be42zfwqnturszxqyecs4zxklxxr4pejgcgi72eja` +- CIDv0: `QmUF5sYAgjigJ6D7nE6p12SG1rFrwYLidKxeX52qBN1Pce` +- CIDv1: `bafybeicxxeljdmh6f2s3xo43piks2h7ibgm6hbfoo3ftc5wjfmqfsngghm` The latest release is always mirrored at [app.uniswap.org](https://app.uniswap.org). @@ -10,14 +10,54 @@ You can also access the Uniswap Interface from an IPFS gateway. Your Uniswap settings are never remembered across different URLs. IPFS gateways: -- https://bafybeifjzfti2rq27be42zfwqnturszxqyecs4zxklxxr4pejgcgi72eja.ipfs.dweb.link/ -- [ipfs://QmZmRjJXcRL1HVbuFBLX23qqmQydzmqGsLmb94qrqTU9A7/](ipfs://QmZmRjJXcRL1HVbuFBLX23qqmQydzmqGsLmb94qrqTU9A7/) +- https://bafybeicxxeljdmh6f2s3xo43piks2h7ibgm6hbfoo3ftc5wjfmqfsngghm.ipfs.dweb.link/ +- [ipfs://QmUF5sYAgjigJ6D7nE6p12SG1rFrwYLidKxeX52qBN1Pce/](ipfs://QmUF5sYAgjigJ6D7nE6p12SG1rFrwYLidKxeX52qBN1Pce/) -## 5.115.0 (2025-10-24) +## 5.116.0 (2025-10-28) ### Features -* **web:** special case metamask dual vm connection flow (#24756) (#24789) b21eafd +* **web:** add activity table to the tab with real data (#23506) f00228c +* **web:** Add createRejectableMockConnector util to force tx rejection (#24574) 3b3b2b7 +* **web:** add demo account support for activity tab (#24639) 9ec0194 +* **web:** add disconnected portfolio view (#23690) 7a1b085 +* **web:** add fiat to price chart (#23577) fab99ce +* **web:** add hidden tokens table rows (#23535) 291fab3 +* **web:** add loading state to tokens table (#23544) ed5ced8 +* **web:** add more & better filtering + transaction parsing (#24579) 205c03d +* **web:** add v2 bridged asset banner (#24734) 4666868 +* **web:** disconnected view B version (#24630) 46ca828 +* **web:** Help Modal styling nits (#24547) ae252e6 +* **web:** NFTs tab (#23604) a438b54 +* **web:** small style nits for Company menu (#24318) 4d71e08 +* **web:** special case metamask dual vm connection flow (#24756) faabc72 +* **web:** tokens table search (#23509) b83fc75 +* **web:** update CompanyMenu arrangement on tablet width (#24312) 758f68d + + +### Bug Fixes + +* **web:** default to mainnet for limits flow [STAGING] (#24885) 5a8e150 +* **web:** Fix CreatePosition e2e anvil test (#24573) d68b011 +* **web:** Fix e2e anvil tests missing quote stub (#24590) 838d5bd +* **web:** Fix limit order chain switch bug (#23064) b11176d +* **web:** Fix Swap e2e anvil tests (#24662) 26adf5c +* **web:** fixes pools tab loader skeletons (#24472) 2f887aa +* **web:** Increase anvil manager timeout (#24623) 466eb69 +* **web:** log interface swap finalization results for flashblocks (#24869) bf30270 +* **web:** support chain filtering query params (#24754) 4bc3729 +* **web:** update the create flow to display the latest dependnet amount (#24676) 168c20a +* **web:** Use Mainnet instead of Base for e2e test commands (#24589) ff7dfee + + +### Continuous Integration + +* **web:** update sitemaps 4e8124b + + +### Tests + +* **web:** Disable anvil snapshots by default (#24666) 1a2903c diff --git a/VERSION b/VERSION index 885f8abd813..a4fafce7ea0 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -web/5.115.0 \ No newline at end of file +web/5.116.0 \ No newline at end of file diff --git a/apps/extension/package.json b/apps/extension/package.json index 3409945e3e4..02974e473d0 100644 --- a/apps/extension/package.json +++ b/apps/extension/package.json @@ -22,6 +22,7 @@ "@uniswap/v3-sdk": "3.25.2", "@uniswap/v4-sdk": "1.21.2", "@universe/api": "workspace:^", + "@universe/gating": "workspace:^", "@wxt-dev/module-react": "1.1.3", "confusing-browser-globals": "1.0.11", "dotenv-webpack": "8.0.1", diff --git a/apps/extension/src/app/apollo.tsx b/apps/extension/src/app/apollo.tsx index 41416c70604..e006c3ed06a 100644 --- a/apps/extension/src/app/apollo.tsx +++ b/apps/extension/src/app/apollo.tsx @@ -1,8 +1,7 @@ import { ApolloProvider } from '@apollo/client/react/context' -import { PropsWithChildren, useEffect } from 'react' +import { PropsWithChildren } from 'react' import { localStorage } from 'redux-persist-webextension-storage' import { getReduxStore } from 'src/store/store' -import { initializePortfolioQueryOverrides } from 'uniswap/src/data/rest/portfolioBalanceOverrides' // biome-ignore lint/style/noRestrictedImports: Direct wallet import needed for Apollo client setup in extension context import { usePersistedApolloClient } from 'wallet/src/data/apollo/usePersistedApolloClient' @@ -16,14 +15,9 @@ export function GraphqlProvider({ children }: PropsWithChildren): JSX.E reduxStore: getReduxStore(), }) - useEffect(() => { - if (apolloClient) { - initializePortfolioQueryOverrides({ store: getReduxStore(), apolloClient }) - } - }, [apolloClient]) - if (!apolloClient) { return <> } + return {children} } diff --git a/apps/extension/src/app/components/AutoLockProvider.tsx b/apps/extension/src/app/components/AutoLockProvider.tsx index 4d7989e0fc7..8f26d940352 100644 --- a/apps/extension/src/app/components/AutoLockProvider.tsx +++ b/apps/extension/src/app/components/AutoLockProvider.tsx @@ -1,9 +1,8 @@ +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import { PropsWithChildren, useEffect } from 'react' import { useSelector } from 'react-redux' import { ExtensionState } from 'src/store/extensionReducer' import { useIsChromeWindowFocusedWithTimeout } from 'uniswap/src/extension/useIsChromeWindowFocused' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' import { deviceAccessTimeoutToMs } from 'uniswap/src/features/settings/constants' import { ExtensionEventName } from 'uniswap/src/features/telemetry/constants' import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send' diff --git a/apps/extension/src/app/core/StatsigProvider.tsx b/apps/extension/src/app/core/StatsigProvider.tsx index 63f55e72d4f..7c6aeb01b76 100644 --- a/apps/extension/src/app/core/StatsigProvider.tsx +++ b/apps/extension/src/app/core/StatsigProvider.tsx @@ -1,10 +1,9 @@ import { useQuery } from '@tanstack/react-query' import { SharedQueryClient } from '@universe/api' +import { StatsigCustomAppValue, StatsigUser } from '@universe/gating' import { useEffect, useState } from 'react' import { makeStatsigUser } from 'src/app/core/initStatSigForBrowserScripts' -import { StatsigCustomAppValue } from 'uniswap/src/features/gating/constants' import { StatsigProviderWrapper } from 'uniswap/src/features/gating/StatsigProviderWrapper' -import { StatsigUser } from 'uniswap/src/features/gating/sdk/statsig' import { initializeDatadog } from 'uniswap/src/utils/datadog' import { uniqueIdQuery } from 'utilities/src/device/uniqueIdQuery' diff --git a/apps/extension/src/app/core/initStatSigForBrowserScripts.tsx b/apps/extension/src/app/core/initStatSigForBrowserScripts.tsx index 3e3ffaaa9ba..7a495477c72 100644 --- a/apps/extension/src/app/core/initStatSigForBrowserScripts.tsx +++ b/apps/extension/src/app/core/initStatSigForBrowserScripts.tsx @@ -1,6 +1,5 @@ +import { StatsigClient, StatsigCustomAppValue, StatsigUser } from '@universe/gating' import { config } from 'uniswap/src/config' -import { StatsigCustomAppValue } from 'uniswap/src/features/gating/constants' -import { StatsigClient, StatsigUser } from 'uniswap/src/features/gating/sdk/statsig' import { statsigBaseConfig } from 'uniswap/src/features/gating/statsigBaseConfig' import { getUniqueId } from 'utilities/src/device/uniqueId' import { logger } from 'utilities/src/logger/logger' diff --git a/apps/extension/src/app/features/biometricUnlock/useShouldShowBiometricUnlock.ts b/apps/extension/src/app/features/biometricUnlock/useShouldShowBiometricUnlock.ts index 3491a94d6bb..54582813431 100644 --- a/apps/extension/src/app/features/biometricUnlock/useShouldShowBiometricUnlock.ts +++ b/apps/extension/src/app/features/biometricUnlock/useShouldShowBiometricUnlock.ts @@ -1,7 +1,6 @@ import { useQuery } from '@tanstack/react-query' +import { DynamicConfigs, ExtensionBiometricUnlockConfigKey, useDynamicConfigValue } from '@universe/gating' import { biometricUnlockCredentialQuery } from 'src/app/features/biometricUnlock/biometricUnlockCredentialQuery' -import { DynamicConfigs, ExtensionBiometricUnlockConfigKey } from 'uniswap/src/features/gating/configs' -import { useDynamicConfigValue } from 'uniswap/src/features/gating/hooks' export function useShouldShowBiometricUnlock(): boolean { const isEnabled = useDynamicConfigValue({ diff --git a/apps/extension/src/app/features/biometricUnlock/useShouldShowBiometricUnlockEnrollment.ts b/apps/extension/src/app/features/biometricUnlock/useShouldShowBiometricUnlockEnrollment.ts index 7c496296c1d..f642af2d9ad 100644 --- a/apps/extension/src/app/features/biometricUnlock/useShouldShowBiometricUnlockEnrollment.ts +++ b/apps/extension/src/app/features/biometricUnlock/useShouldShowBiometricUnlockEnrollment.ts @@ -1,8 +1,7 @@ import { useQuery } from '@tanstack/react-query' +import { DynamicConfigs, ExtensionBiometricUnlockConfigKey, useDynamicConfigValue } from '@universe/gating' import { useTranslation } from 'react-i18next' import { builtInBiometricCapabilitiesQuery } from 'src/app/utils/device/builtInBiometricCapabilitiesQuery' -import { DynamicConfigs, ExtensionBiometricUnlockConfigKey } from 'uniswap/src/features/gating/configs' -import { useDynamicConfigValue } from 'uniswap/src/features/gating/hooks' export function useShouldShowBiometricUnlockEnrollment({ flow }: { flow: 'onboarding' | 'settings' }): boolean { const { t } = useTranslation() diff --git a/apps/extension/src/app/features/dappRequests/requestContent/SignTypeData/SignTypedDataRequestContent.tsx b/apps/extension/src/app/features/dappRequests/requestContent/SignTypeData/SignTypedDataRequestContent.tsx index 19606509983..b015627b61b 100644 --- a/apps/extension/src/app/features/dappRequests/requestContent/SignTypeData/SignTypedDataRequestContent.tsx +++ b/apps/extension/src/app/features/dappRequests/requestContent/SignTypeData/SignTypedDataRequestContent.tsx @@ -1,3 +1,4 @@ +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import { useTranslation } from 'react-i18next' import { DappRequestContent } from 'src/app/features/dappRequests/DappRequestContent' import { ActionCanNotBeCompletedContent } from 'src/app/features/dappRequests/requestContent/ActionCanNotBeCompleted/ActionCanNotBeCompletedContent' @@ -11,8 +12,6 @@ import { EIP712Message, isEIP712TypedData } from 'src/app/features/dappRequests/ import { isPermit2, isUniswapXSwapRequest } from 'src/app/features/dappRequests/types/Permit2Types' import { Flex, Text } from 'ui/src' import { toSupportedChainId } from 'uniswap/src/features/chains/utils' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' import { useHasAccountMismatchCallback } from 'uniswap/src/features/smartWallet/mismatch/hooks' import { ExplorerDataType, getExplorerLink } from 'uniswap/src/utils/linking' import { isEVMAddressWithChecksum } from 'utilities/src/addresses/evm/evm' diff --git a/apps/extension/src/app/features/dappRequests/saga.ts b/apps/extension/src/app/features/dappRequests/saga.ts index 8ce3f50de43..7a511bca103 100644 --- a/apps/extension/src/app/features/dappRequests/saga.ts +++ b/apps/extension/src/app/features/dappRequests/saga.ts @@ -1,6 +1,7 @@ /* eslint-disable max-lines */ import { Provider } from '@ethersproject/providers' import { providerErrors, rpcErrors, serializeError } from '@metamask/rpc-errors' +import { FeatureFlags, getFeatureFlag } from '@universe/gating' import { createSearchParams } from 'react-router' import { changeChain } from 'src/app/features/dapp/changeChain' import { DappInfo, dappStore } from 'src/app/features/dapp/store' @@ -45,8 +46,6 @@ import getCalldataInfoFromTransaction from 'src/background/utils/getCalldataInfo import { call, put, select, take } from 'typed-redux-saga' import { hexadecimalStringToInt, toSupportedChainId } from 'uniswap/src/features/chains/utils' import { DappRequestType, DappResponseType } from 'uniswap/src/features/dappRequests/types' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { getFeatureFlag } from 'uniswap/src/features/gating/hooks' import { pushNotification } from 'uniswap/src/features/notifications/slice/slice' import { AppNotificationType } from 'uniswap/src/features/notifications/slice/types' import { Platform } from 'uniswap/src/features/platforms/types/Platform' diff --git a/apps/extension/src/app/features/home/HomeScreen.tsx b/apps/extension/src/app/features/home/HomeScreen.tsx index f7a5e10a591..00145f31da7 100644 --- a/apps/extension/src/app/features/home/HomeScreen.tsx +++ b/apps/extension/src/app/features/home/HomeScreen.tsx @@ -1,5 +1,6 @@ import { useApolloClient } from '@apollo/client' import { SharedEventName } from '@uniswap/analytics-events' +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import { memo, useCallback, useEffect, useState } from 'react' import { useTranslation } from 'react-i18next' import { useDispatch, useSelector } from 'react-redux' @@ -21,8 +22,6 @@ import { navigate } from 'src/app/navigation/state' import { Flex, Loader, styled, Text, TouchableArea } from 'ui/src' import { SMART_WALLET_UPGRADE_VIDEO } from 'ui/src/assets' import { NFTS_TAB_DATA_DEPENDENCIES } from 'uniswap/src/components/nfts/constants' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' import { useSelectAddressHasNotifications } from 'uniswap/src/features/notifications/slice/hooks' import { setNotificationStatus } from 'uniswap/src/features/notifications/slice/slice' import { PortfolioBalance } from 'uniswap/src/features/portfolio/PortfolioBalance/PortfolioBalance' diff --git a/apps/extension/src/app/features/home/PortfolioActionButtons.tsx b/apps/extension/src/app/features/home/PortfolioActionButtons.tsx index a0ac5b56037..9a7a08625ce 100644 --- a/apps/extension/src/app/features/home/PortfolioActionButtons.tsx +++ b/apps/extension/src/app/features/home/PortfolioActionButtons.tsx @@ -1,4 +1,5 @@ import { SharedEventName } from '@uniswap/analytics-events' +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import { cloneElement, memo, useCallback, useState } from 'react' import { useTranslation } from 'react-i18next' import { useInterfaceBuyNavigator } from 'src/app/features/for/utils' @@ -7,8 +8,6 @@ import { navigate } from 'src/app/navigation/state' import { Flex, getTokenValue, Text, TouchableArea, useMedia } from 'ui/src' import { ArrowDownCircle, Bank, CoinConvert, SendAction } from 'ui/src/components/icons' import { useEnabledChains } from 'uniswap/src/features/chains/hooks/useEnabledChains' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' import { ElementName } from 'uniswap/src/features/telemetry/constants' import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send' import { TestnetModeModal } from 'uniswap/src/features/testnets/TestnetModeModal' diff --git a/apps/extension/src/app/features/home/PortfolioHeader.tsx b/apps/extension/src/app/features/home/PortfolioHeader.tsx index 45df41829bc..b951fd5c50a 100644 --- a/apps/extension/src/app/features/home/PortfolioHeader.tsx +++ b/apps/extension/src/app/features/home/PortfolioHeader.tsx @@ -55,7 +55,7 @@ const RotatingSettingsIcon = ({ onPressSettings }: { onPressSettings(): void }): }), ) } - }, [isScreenFocused, pressProgress]) + }, [isScreenFocused]) const onBegin = (): void => { pressProgress.value = withTiming(1) diff --git a/apps/extension/src/app/features/onboarding/import/SelectWallets.tsx b/apps/extension/src/app/features/onboarding/import/SelectWallets.tsx index dcf3940bb5e..3c8597824a0 100644 --- a/apps/extension/src/app/features/onboarding/import/SelectWallets.tsx +++ b/apps/extension/src/app/features/onboarding/import/SelectWallets.tsx @@ -1,4 +1,5 @@ import { useQuery } from '@tanstack/react-query' +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import { ComponentProps, useMemo, useState } from 'react' import { Trans, useTranslation } from 'react-i18next' import { SelectWalletsSkeleton } from 'src/app/components/loading/SelectWalletSkeleton' @@ -9,8 +10,6 @@ import { Flex, ScrollView, SpinningLoader, Square, Text, Tooltip, TouchableArea import { WalletFilled } from 'ui/src/components/icons' import { iconSizes } from 'ui/src/theme' import { uniswapUrls } from 'uniswap/src/constants/urls' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' import Trace from 'uniswap/src/features/telemetry/Trace' import { ExtensionOnboardingFlow, ExtensionOnboardingScreens } from 'uniswap/src/types/screens/extension' import { openUri } from 'uniswap/src/utils/linking' diff --git a/apps/extension/src/app/features/onboarding/scan/ScanToOnboard.tsx b/apps/extension/src/app/features/onboarding/scan/ScanToOnboard.tsx index 30080a5b13f..3e01afb4a99 100644 --- a/apps/extension/src/app/features/onboarding/scan/ScanToOnboard.tsx +++ b/apps/extension/src/app/features/onboarding/scan/ScanToOnboard.tsx @@ -174,7 +174,7 @@ export function ScanToOnboard(): JSX.Element { ) return () => cancelAnimation(qrScale) - }, [isLoadingUUID, qrScale]) + }, [isLoadingUUID]) // Using useAnimatedStyle and AnimatedFlex because tamagui scale animation not working const qrAnimatedStyle = useAnimatedStyle(() => { return { diff --git a/apps/extension/src/app/features/settings/SettingsScreen.tsx b/apps/extension/src/app/features/settings/SettingsScreen.tsx index 4dd4947e716..ed9a068a3c1 100644 --- a/apps/extension/src/app/features/settings/SettingsScreen.tsx +++ b/apps/extension/src/app/features/settings/SettingsScreen.tsx @@ -1,3 +1,4 @@ +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import { useCallback, useEffect, useState } from 'react' import { useTranslation } from 'react-i18next' import { useDispatch, useSelector } from 'react-redux' @@ -31,8 +32,6 @@ import { resetUniswapBehaviorHistory } from 'uniswap/src/features/behaviorHistor import { useEnabledChains } from 'uniswap/src/features/chains/hooks/useEnabledChains' import { FiatCurrency, ORDERED_CURRENCIES } from 'uniswap/src/features/fiatCurrency/constants' import { getFiatCurrencyName, useAppFiatCurrencyInfo } from 'uniswap/src/features/fiatCurrency/hooks' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' import { useCurrentLanguageInfo } from 'uniswap/src/features/language/hooks' import { PasskeyManagementModal } from 'uniswap/src/features/passkey/PasskeyManagementModal' import { setCurrentFiatCurrency, setIsTestnetModeEnabled } from 'uniswap/src/features/settings/slice' diff --git a/apps/extension/src/app/hooks/useIsExtensionPasskeyImportEnabled.ts b/apps/extension/src/app/hooks/useIsExtensionPasskeyImportEnabled.ts index 8abf941051b..823ac6ba868 100644 --- a/apps/extension/src/app/hooks/useIsExtensionPasskeyImportEnabled.ts +++ b/apps/extension/src/app/hooks/useIsExtensionPasskeyImportEnabled.ts @@ -1,5 +1,4 @@ -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' +import { FeatureFlags, useFeatureFlag } from '@universe/gating' export function useIsExtensionPasskeyImportEnabled(): boolean { return useFeatureFlag(FeatureFlags.EmbeddedWallet) diff --git a/apps/extension/src/entrypoints/sidepanel/main.tsx b/apps/extension/src/entrypoints/sidepanel/main.tsx index 4cbeaaa35d0..5465a71e672 100644 --- a/apps/extension/src/entrypoints/sidepanel/main.tsx +++ b/apps/extension/src/entrypoints/sidepanel/main.tsx @@ -11,8 +11,10 @@ import { createRoot } from 'react-dom/client' import SidebarApp from 'src/app/core/SidebarApp' import { onboardingMessageChannel } from 'src/background/messagePassing/messageChannels' import { OnboardingMessageType } from 'src/background/messagePassing/types/ExtensionMessages' +import { getReduxStore } from 'src/store/store' import { ExtensionAppLocation, StoreSynchronization } from 'src/store/storeSynchronization' import { initializeScrollWatcher } from 'uniswap/src/components/modals/ScrollLock' +import { initializePortfolioQueryOverrides } from 'uniswap/src/data/rest/portfolioBalanceOverrides' import { logger } from 'utilities/src/logger/logger' // biome-ignore lint/suspicious/noExplicitAny: Global polyfill cleanup requires any type for runtime modification ;(globalThis as any).regeneratorRuntime = undefined @@ -44,6 +46,7 @@ export function makeSidebar(): void { } StoreSynchronization.init(ExtensionAppLocation.SidePanel) + initializePortfolioQueryOverrides({ store: getReduxStore() }) initSidebar() initializeScrollWatcher() } diff --git a/apps/extension/tsconfig.json b/apps/extension/tsconfig.json index 007f0494490..831ce04a0d1 100644 --- a/apps/extension/tsconfig.json +++ b/apps/extension/tsconfig.json @@ -19,6 +19,9 @@ }, { "path": "../../packages/api" + }, + { + "path": "../../packages/gating" } ], "compilerOptions": { diff --git a/apps/mobile/.maestro/flows/deeplinks/deeplink-comprehensive.yaml b/apps/mobile/.maestro/flows/deeplinks/deeplink-comprehensive.yaml index 7986a843f72..71df2ffe3af 100644 --- a/apps/mobile/.maestro/flows/deeplinks/deeplink-comprehensive.yaml +++ b/apps/mobile/.maestro/flows/deeplinks/deeplink-comprehensive.yaml @@ -12,7 +12,7 @@ env: - runScript: file: ../../scripts/performance/dist/actions/start-flow.js env: - FLOW_NAME: 'deeplink-comprehensive' + FLOW_NAME: "deeplink-comprehensive" # Run prerequisite flows (tracked as sub-flows) - runFlow: ../../shared-flows/start.yaml @@ -22,15 +22,15 @@ env: - runScript: file: ../../scripts/performance/dist/actions/track-action.js env: - ACTION: 'openLink' - TARGET: 'onramp-deeplink' - PHASE: 'start' + ACTION: "openLink" + TARGET: "onramp-deeplink" + PHASE: "start" - openLink: - link: 'uniswap://app/fiatonramp?userAddress=0xEEf806b3Cae8fcecAe1793EE1e0B2c738F61C6bB&source=push' + link: "uniswap://app/fiatonramp?userAddress=0xEEf806b3Cae8fcecAe1793EE1e0B2c738F61C6bB&source=push" autoVerify: true # Handle iOS deeplink permission dialog (optional - only appears on first run) - tapOn: - text: 'Open' + text: "Open" optional: true - waitForAnimationToEnd: timeout: 5000 @@ -41,43 +41,43 @@ env: - runScript: file: ../../scripts/performance/dist/actions/track-action.js env: - ACTION: 'openLink' - TARGET: 'onramp-deeplink' - PHASE: 'end' + ACTION: "openLink" + TARGET: "onramp-deeplink" + PHASE: "end" - killApp # Open widget deeplink - runScript: file: ../../scripts/performance/dist/actions/track-action.js env: - ACTION: 'openLink' - TARGET: 'widget-deeplink' - PHASE: 'start' + ACTION: "openLink" + TARGET: "widget-deeplink" + PHASE: "start" - openLink: - link: 'uniswap://widget/#/tokens/ethereum/0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984' + link: "uniswap://widget/#/tokens/ethereum/0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984" autoVerify: true - waitForAnimationToEnd: timeout: 3000 - assertVisible: id: ${output.testIds.TokenDetailsHeaderText} - text: 'Uniswap' + text: "Uniswap" - runScript: file: ../../scripts/performance/dist/actions/track-action.js env: - ACTION: 'openLink' - TARGET: 'widget-deeplink' - PHASE: 'end' + ACTION: "openLink" + TARGET: "widget-deeplink" + PHASE: "end" - killApp # Open swap deeplink - runScript: file: ../../scripts/performance/dist/actions/track-action.js env: - ACTION: 'openLink' - TARGET: 'swap-deeplink' - PHASE: 'start' + ACTION: "openLink" + TARGET: "swap-deeplink" + PHASE: "start" - openLink: - link: 'uniswap://redirect?screen=swap&userAddress=0xEEf806b3Cae8fcecAe1793EE1e0B2c738F61C6bB&inputCurrencyId=1-0x6B175474E89094C44Da98b954EedeAC495271d0F&outputCurrencyId=1-0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984¤cyField=input&amount=100' + link: "uniswap://redirect?screen=swap&userAddress=0xEEf806b3Cae8fcecAe1793EE1e0B2c738F61C6bB&inputCurrencyId=1-0x6B175474E89094C44Da98b954EedeAC495271d0F&outputCurrencyId=1-0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984¤cyField=input&amount=100" autoVerify: true - waitForAnimationToEnd: timeout: 3000 @@ -92,20 +92,20 @@ env: - runScript: file: ../../scripts/performance/dist/actions/track-action.js env: - ACTION: 'openLink' - TARGET: 'swap-deeplink' - PHASE: 'end' + ACTION: "openLink" + TARGET: "swap-deeplink" + PHASE: "end" - killApp # Open token details deeplink - runScript: file: ../../scripts/performance/dist/actions/track-action.js env: - ACTION: 'openLink' - TARGET: 'token-details-deeplink' - PHASE: 'start' + ACTION: "openLink" + TARGET: "token-details-deeplink" + PHASE: "start" - openLink: - link: 'uniswap://app/tokendetails?currencyId=10-0x6fd9d7ad17242c41f7131d257212c54a0e816691&source=push' + link: "uniswap://app/tokendetails?currencyId=10-0x6fd9d7ad17242c41f7131d257212c54a0e816691&source=push" autoVerify: true - waitForAnimationToEnd: timeout: 3000 @@ -116,20 +116,20 @@ env: - runScript: file: ../../scripts/performance/dist/actions/track-action.js env: - ACTION: 'openLink' - TARGET: 'token-details-deeplink' - PHASE: 'end' + ACTION: "openLink" + TARGET: "token-details-deeplink" + PHASE: "end" - killApp # Open transaction history deeplink - runScript: file: ../../scripts/performance/dist/actions/track-action.js env: - ACTION: 'openLink' - TARGET: 'transaction-history-deeplink' - PHASE: 'start' + ACTION: "openLink" + TARGET: "transaction-history-deeplink" + PHASE: "start" - openLink: - link: 'uniswap://redirect?screen=transaction&fiatOnRamp=true&userAddress=0xEEf806b3Cae8fcecAe1793EE1e0B2c738F61C6bB' + link: "uniswap://redirect?screen=transaction&fiatOnRamp=true&userAddress=0xEEf806b3Cae8fcecAe1793EE1e0B2c738F61C6bB" autoVerify: true - waitForAnimationToEnd: timeout: 3000 @@ -138,20 +138,20 @@ env: - runScript: file: ../../scripts/performance/dist/actions/track-action.js env: - ACTION: 'openLink' - TARGET: 'transaction-history-deeplink' - PHASE: 'end' + ACTION: "openLink" + TARGET: "transaction-history-deeplink" + PHASE: "end" - killApp # Invalid deeplink (should fail gracefully and remain functional) - runScript: file: ../../scripts/performance/dist/actions/track-action.js env: - ACTION: 'openLink' - TARGET: 'invalid-deeplink' - PHASE: 'start' + ACTION: "openLink" + TARGET: "invalid-deeplink" + PHASE: "start" - openLink: - link: 'uniswap://invalid-path' + link: "uniswap://invalid-path" autoVerify: true - waitForAnimationToEnd: timeout: 3000 @@ -160,46 +160,46 @@ env: - runScript: file: ../../scripts/performance/dist/actions/track-action.js env: - ACTION: 'openLink' - TARGET: 'invalid-deeplink' - PHASE: 'end' + ACTION: "openLink" + TARGET: "invalid-deeplink" + PHASE: "end" - killApp # Open moonpayOnly onramp deeplink - runScript: file: ../../scripts/performance/dist/actions/track-action.js env: - ACTION: 'openLink' - TARGET: 'moonpay-onramp-deeplink' - PHASE: 'start' + ACTION: "openLink" + TARGET: "moonpay-onramp-deeplink" + PHASE: "start" - openLink: - link: 'uniswap://app/fiatonramp?source=push&moonpayOnly=true&moonpayCurrencyCode=usdc&amount=200' + link: "uniswap://app/fiatonramp?source=push&moonpayOnly=true&moonpayCurrencyCode=usdc&amount=200" autoVerify: true - waitForAnimationToEnd: timeout: 5000 - assertVisible: id: ${output.testIds.ForFormTokenSelected} - text: 'USD Coin' + text: "USD Coin" - assertVisible: id: ${output.testIds.BuyFormAmountInput} - text: '200' + text: "200" - runScript: file: ../../scripts/performance/dist/actions/track-action.js env: - ACTION: 'openLink' - TARGET: 'moonpay-onramp-deeplink' - PHASE: 'end' + ACTION: "openLink" + TARGET: "moonpay-onramp-deeplink" + PHASE: "end" - killApp # Open scantastic deeplink (when user scans QR code on the extension) - runScript: file: ../../scripts/performance/dist/actions/track-action.js env: - ACTION: 'openLink' - TARGET: 'scantastic-deeplink' - PHASE: 'start' + ACTION: "openLink" + TARGET: "scantastic-deeplink" + PHASE: "start" - openLink: - link: 'uniswap://scantastic?pubKey=%7B%22alg%22%3A%22RSA-OAEP-256%22%2C%22kty%22%3A%22RSA%22%2C%22n%22%3A%224X4nRAEZ8FWoVmoQ5KrxcssIR7XpdcVo_y7yD1SgmYuXekvHMIYuLxxkxVTjsyxj2s9jctIHOhZ-g96w4oM8-HXjCJG_v55w6FZyDskllcmaGeUlZFwWkiqZ-PKkHCWxCe_dZGvL33sazS_L8P3eAxXEPEJMG9p9lxsIlPp7ki0GSyVjq4rrHgW0lIz6qy6WqHbnyJWQAMSPnZTGM697ZCdkW_GTD3MyqitBwK5xNQN8Pxgbu6S7xbQglanYNBbeMYpJ3X1PDl37sp16YwPm6ryGaX1ESDPHa3M7-_we_yQEUQvtU5t2dd8chISJX8L1D7s8iNxM1LxG_nZTwKnccRPtrzKj-osBMbfCoU4fiNS2LC7q6zsyHxgDpeFlrV--iboQ9TsaQ7RGaFOSKs0l74_dt8GvX2JtNJ0ah8K__eNg9q0xBD8DTdeY2duMTEKJZIKgEyX0KUiRpsbsNmm_76iqhhZyYvcb6mwvNnVcXPg_TabX7lQEEippd7JTWVnF2LKzldlUonchQSsbLEUlN_ALa0Nuq6GG1MVJ0JjSsNMcpin6rH9fPzmDKkqzM2qvhdyuV66vkS82Wj9tQpqXL_jkRk7bQsDlB-HiVbzM2oNPk6or5u6p5tJni0th6BZm4z-sYgmMj3D5xHeusyap-8dmS9J4mXDxGLL_NloaHY8%22%2C%22e%22%3A%22AQAB%22%7D&uuid=28c01911-8e69-46e9-b2f0-f5e719bb714b&vendor=Apple&model=Macintosh&browser=Chrome' + link: "uniswap://scantastic?pubKey=%7B%22alg%22%3A%22RSA-OAEP-256%22%2C%22kty%22%3A%22RSA%22%2C%22n%22%3A%224X4nRAEZ8FWoVmoQ5KrxcssIR7XpdcVo_y7yD1SgmYuXekvHMIYuLxxkxVTjsyxj2s9jctIHOhZ-g96w4oM8-HXjCJG_v55w6FZyDskllcmaGeUlZFwWkiqZ-PKkHCWxCe_dZGvL33sazS_L8P3eAxXEPEJMG9p9lxsIlPp7ki0GSyVjq4rrHgW0lIz6qy6WqHbnyJWQAMSPnZTGM697ZCdkW_GTD3MyqitBwK5xNQN8Pxgbu6S7xbQglanYNBbeMYpJ3X1PDl37sp16YwPm6ryGaX1ESDPHa3M7-_we_yQEUQvtU5t2dd8chISJX8L1D7s8iNxM1LxG_nZTwKnccRPtrzKj-osBMbfCoU4fiNS2LC7q6zsyHxgDpeFlrV--iboQ9TsaQ7RGaFOSKs0l74_dt8GvX2JtNJ0ah8K__eNg9q0xBD8DTdeY2duMTEKJZIKgEyX0KUiRpsbsNmm_76iqhhZyYvcb6mwvNnVcXPg_TabX7lQEEippd7JTWVnF2LKzldlUonchQSsbLEUlN_ALa0Nuq6GG1MVJ0JjSsNMcpin6rH9fPzmDKkqzM2qvhdyuV66vkS82Wj9tQpqXL_jkRk7bQsDlB-HiVbzM2oNPk6or5u6p5tJni0th6BZm4z-sYgmMj3D5xHeusyap-8dmS9J4mXDxGLL_NloaHY8%22%2C%22e%22%3A%22AQAB%22%7D&uuid=28c01911-8e69-46e9-b2f0-f5e719bb714b&vendor=Apple&model=Macintosh&browser=Chrome" autoVerify: true - waitForAnimationToEnd: timeout: 3000 @@ -207,16 +207,16 @@ env: id: ${output.testIds.ScantasticConfirmationTitle} - assertVisible: id: ${output.testIds.ScantasticDevice} - text: 'Apple Macintosh' + text: "Apple Macintosh" - assertVisible: id: ${output.testIds.ScantasticBrowser} - text: 'Chrome' + text: "Chrome" - runScript: file: ../../scripts/performance/dist/actions/track-action.js env: - ACTION: 'openLink' - TARGET: 'scantastic-deeplink' - PHASE: 'end' + ACTION: "openLink" + TARGET: "scantastic-deeplink" + PHASE: "end" - killApp # End flow tracking @@ -228,4 +228,4 @@ env: file: ../../scripts/performance/upload-metrics.js env: DATADOG_API_KEY: ${DATADOG_API_KEY} - ENVIRONMENT: 'maestro_cloud' + ENVIRONMENT: "maestro_cloud" diff --git a/apps/mobile/.maestro/flows/restore/restore-new-device.yaml b/apps/mobile/.maestro/flows/restore/restore-new-device.yaml index 0f73d3201f3..08ab78e29fa 100644 --- a/apps/mobile/.maestro/flows/restore/restore-new-device.yaml +++ b/apps/mobile/.maestro/flows/restore/restore-new-device.yaml @@ -184,10 +184,29 @@ env: PHASE: 'end' - waitForAnimationToEnd +# Wait for cloud backup to fail - handle both possible error states +# First try waiting for "No backups found" - extendedWaitUntil: visible: text: 'No backups found' - timeout: 5000 # wait for cloud backup to fail + timeout: 5000 + optional: true + +# If that didn't appear, wait for "Error while importing backups" +- extendedWaitUntil: + visible: + text: 'Error while importing backups' + timeout: 5000 + optional: true + +# If error while importing backups appeared, tap to enter recovery phrase manually +- runFlow: + when: + visible: + text: 'Enter recovery phrase' + commands: + - tapOn: + text: 'Enter recovery phrase' # Track seed phrase input - runScript: diff --git a/apps/mobile/.maestro/shared-flows/navigate-to-explore.yaml b/apps/mobile/.maestro/shared-flows/navigate-to-explore.yaml index 3431fe0cb24..200f366aeaf 100644 --- a/apps/mobile/.maestro/shared-flows/navigate-to-explore.yaml +++ b/apps/mobile/.maestro/shared-flows/navigate-to-explore.yaml @@ -1,20 +1,37 @@ appId: com.uniswap.mobile.dev --- # This flow handles the common action of navigating to the Explore tab -# from the main wallet screen. +# from the main wallet screen. It supports both bottom tabs navigation (new) +# and the legacy floating navigation bar. # Wait for the home screen to be visible - extendedWaitUntil: - visible: 'noop' + visible: "noop" timeout: 2000 optional: true -# Tap on the Explore/Search button in the navigation bar +# OPTION 1: Try bottom tabs navigation first (new UI pattern) +# This will be available when BottomTabs feature flag is enabled +- tapOn: + id: ${output.testIds.ExploreTab} + optional: true + +# TODO: INFRA-1074 - Remove this fallback when we no longer support the legacy navigation bar +# OPTION 2: Fallback to legacy floating navigation bar +# This will be used when BottomTabs feature flag is disabled - tapOn: id: ${output.testIds.SearchTokensAndWallets} + optional: true +# Wait for tab animations to complete (200ms animation duration) - waitForAnimationToEnd # Verify we're in the Explore screen by checking for the search input +# This verification works for both navigation patterns +- extendedWaitUntil: + visible: + id: ${output.testIds.ExploreSearchInput} + timeout: 3000 + - assertVisible: id: ${output.testIds.ExploreSearchInput} diff --git a/apps/mobile/package.json b/apps/mobile/package.json index 6e581251f19..18f214ecb22 100644 --- a/apps/mobile/package.json +++ b/apps/mobile/package.json @@ -111,6 +111,7 @@ "@uniswap/ethers-rs-mobile": "0.0.5", "@uniswap/sdk-core": "7.7.2", "@universe/api": "workspace:^", + "@universe/gating": "workspace:^", "@walletconnect/core": "2.21.4", "@walletconnect/react-native-compat": "2.21.4", "@walletconnect/types": "2.21.4", diff --git a/apps/mobile/src/app/App.tsx b/apps/mobile/src/app/App.tsx index 7554650723a..da7c8559205 100644 --- a/apps/mobile/src/app/App.tsx +++ b/apps/mobile/src/app/App.tsx @@ -3,6 +3,17 @@ import { loadDevMessages, loadErrorMessages } from '@apollo/client/dev' import { DdRum, RumActionType } from '@datadog/mobile-react-native' import { BottomSheetModalProvider } from '@gorhom/bottom-sheet' import { PerformanceProfiler, RenderPassReport } from '@shopify/react-native-performance' +import { + DatadogSessionSampleRateKey, + DynamicConfigs, + Experiments, + getDynamicConfigValue, + getStatsigClient, + StatsigCustomAppValue, + StatsigUser, + Storage, + WALLET_FEATURE_FLAG_NAMES, +} from '@universe/gating' import { MMKVWrapper } from 'apollo3-cache-persist' import { default as React, StrictMode, useCallback, useEffect, useMemo, useRef } from 'react' import { I18nextProvider } from 'react-i18next' @@ -55,13 +66,7 @@ import { BlankUrlProvider } from 'uniswap/src/contexts/UrlContext' import { initializePortfolioQueryOverrides } from 'uniswap/src/data/rest/portfolioBalanceOverrides' import { selectFavoriteTokens } from 'uniswap/src/features/favorites/selectors' import { useAppFiatCurrencyInfo } from 'uniswap/src/features/fiatCurrency/hooks' -import { DatadogSessionSampleRateKey, DynamicConfigs } from 'uniswap/src/features/gating/configs' -import { StatsigCustomAppValue } from 'uniswap/src/features/gating/constants' -import { Experiments } from 'uniswap/src/features/gating/experiments' -import { WALLET_FEATURE_FLAG_NAMES } from 'uniswap/src/features/gating/flags' -import { getDynamicConfigValue } from 'uniswap/src/features/gating/hooks' import { StatsigProviderWrapper } from 'uniswap/src/features/gating/StatsigProviderWrapper' -import { getStatsigClient, StatsigUser, Storage } from 'uniswap/src/features/gating/sdk/statsig' import { useCurrentLanguageInfo } from 'uniswap/src/features/language/hooks' import { LocalizationContextProvider } from 'uniswap/src/features/language/LocalizationContext' import { clearNotificationQueue } from 'uniswap/src/features/notifications/slice/slice' @@ -121,6 +126,8 @@ initDynamicIntlPolyfills() initOneSignal() initAppsFlyer() +initializePortfolioQueryOverrides({ store }) + function App(): JSX.Element | null { useEffect(() => { if (!__DEV__) { @@ -240,12 +247,6 @@ function AppOuter(): JSX.Element | null { } }, []) - useEffect(() => { - if (client) { - initializePortfolioQueryOverrides({ store, apolloClient: client }) - } - }, [client]) - if (!client) { return null } diff --git a/apps/mobile/src/app/MobileWalletNavigationProvider.tsx b/apps/mobile/src/app/MobileWalletNavigationProvider.tsx index 9e692d3fe02..6f2319b4364 100644 --- a/apps/mobile/src/app/MobileWalletNavigationProvider.tsx +++ b/apps/mobile/src/app/MobileWalletNavigationProvider.tsx @@ -1,4 +1,5 @@ import { StackActions } from '@react-navigation/native' +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import { PropsWithChildren, useCallback } from 'react' import { Share } from 'react-native' import { useDispatch } from 'react-redux' @@ -15,8 +16,6 @@ import { useFiatOnRampAggregatorGetCountryQuery, } from 'uniswap/src/features/fiatOnRamp/api' import { RampDirection } from 'uniswap/src/features/fiatOnRamp/types' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' import { ModalName, WalletEventName } from 'uniswap/src/features/telemetry/constants' import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send' import { TransactionState } from 'uniswap/src/features/transactions/types/transactionState' diff --git a/apps/mobile/src/app/modals/BridgedAssetWarningWrapper.tsx b/apps/mobile/src/app/modals/BridgedAssetWarningWrapper.tsx index 6b6c3ade50d..29cd1bd00a2 100644 --- a/apps/mobile/src/app/modals/BridgedAssetWarningWrapper.tsx +++ b/apps/mobile/src/app/modals/BridgedAssetWarningWrapper.tsx @@ -1,7 +1,6 @@ import { AppStackScreenProp } from 'src/app/navigation/types' import { useReactNavigationModal } from 'src/components/modals/useReactNavigationModal' import { BridgedAssetModal } from 'uniswap/src/components/BridgedAsset/BridgedAssetModal' -import { checkIsBridgedAsset } from 'uniswap/src/components/BridgedAsset/utils' import { useEnabledChains } from 'uniswap/src/features/chains/hooks/useEnabledChains' import { ModalName } from 'uniswap/src/features/telemetry/constants' import { useDismissedBridgedAssetWarnings } from 'uniswap/src/features/tokens/slice/hooks' @@ -36,7 +35,7 @@ export function BridgedAssetWarningWrapper({ return null } - const isBridgedAsset = checkIsBridgedAsset(currencyInfo) + const isBridgedAsset = Boolean(currencyInfo.isBridged) // If token is not bridged or warning was dismissed and not blocked, skip warning and proceed to SwapFlow if (!isBridgedAsset || bridgedAssetWarningDismissed) { diff --git a/apps/mobile/src/app/navigation/navigation.tsx b/apps/mobile/src/app/navigation/navigation.tsx index d59a3a4d5d1..07cbfafd88c 100644 --- a/apps/mobile/src/app/navigation/navigation.tsx +++ b/apps/mobile/src/app/navigation/navigation.tsx @@ -1,6 +1,7 @@ import { NavigationContainer, NavigationIndependentTree } from '@react-navigation/native' import { createNativeStackNavigator } from '@react-navigation/native-stack' import { createStackNavigator, TransitionPresets } from '@react-navigation/stack' +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import React, { useEffect } from 'react' import { DevSettings } from 'react-native' import { INCLUDE_PROTOTYPE_FEATURES, IS_E2E_TEST } from 'react-native-dotenv' @@ -110,8 +111,6 @@ import { ViewPrivateKeysScreen } from 'src/screens/ViewPrivateKeys/ViewPrivateKe import { WebViewScreen } from 'src/screens/WebViewScreen' import { useSporeColors } from 'ui/src' import { spacing } from 'ui/src/theme' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' import { ModalName } from 'uniswap/src/features/telemetry/constants' import { useAppInsets } from 'uniswap/src/hooks/useAppInsets' import { OnboardingEntryPoint } from 'uniswap/src/types/onboarding' diff --git a/apps/mobile/src/app/navigation/tabs/CustomTabBar/CustomTabBar.tsx b/apps/mobile/src/app/navigation/tabs/CustomTabBar/CustomTabBar.tsx index dc6727df6f5..01de66c7fe1 100644 --- a/apps/mobile/src/app/navigation/tabs/CustomTabBar/CustomTabBar.tsx +++ b/apps/mobile/src/app/navigation/tabs/CustomTabBar/CustomTabBar.tsx @@ -37,6 +37,7 @@ const TabItem = ({ tab, index, isFocused, onPress, colors }: TabItemProps): JSX. return ( numberOfDigits: PriceNumberOfDigits spotPrice?: SharedValue + startingPrice?: number + shouldTreatAsStablecoin?: boolean } const PriceTextSection = memo(function PriceTextSection({ loading, numberOfDigits, spotPrice, + startingPrice, + shouldTreatAsStablecoin, }: PriceTextProps): JSX.Element { const price = useLineChartPrice(spotPrice) const currency = useAppFiatCurrencyInfo() @@ -62,9 +66,13 @@ const PriceTextSection = memo(function PriceTextSection({ We want both the animated number skeleton and the relative change skeleton to hide at the exact same time. When multiple skeletons hide in different order, it gives the feeling of things being slower than they actually are. */} - - + + ) }) @@ -144,7 +152,7 @@ const PriceExplorerInner = memo(function _PriceExplorerInner(): JSX.Element { value: convertedSpotValue, } ) - }, [data, convertedSpotValue]) + }, [data]) // Zoom out y-axis for low variance assets const shouldZoomOut = useMemo(() => { @@ -177,6 +185,9 @@ const PriceExplorerInner = memo(function _PriceExplorerInner(): JSX.Element { return } + // Get the starting price for fiat delta calculation + const startingPrice = convertedPriceHistory[0]?.value + return ( @@ -185,6 +196,8 @@ const PriceExplorerInner = memo(function _PriceExplorerInner(): JSX.Element { numberOfDigits={numberOfDigits} relativeChange={convertedSpot?.relativeChange} spotPrice={convertedSpot?.value} + startingPrice={startingPrice} + shouldTreatAsStablecoin={shouldZoomOut} /> diff --git a/apps/mobile/src/components/PriceExplorer/Text.tsx b/apps/mobile/src/components/PriceExplorer/Text.tsx index 0da167fcdcd..8cddaffd8e7 100644 --- a/apps/mobile/src/components/PriceExplorer/Text.tsx +++ b/apps/mobile/src/components/PriceExplorer/Text.tsx @@ -1,7 +1,8 @@ import React from 'react' -import { useAnimatedStyle } from 'react-native-reanimated' +import { useAnimatedStyle, useDerivedValue } from 'react-native-reanimated' import { useLineChartDatetime } from 'react-native-wagmi-charts' import { AnimatedDecimalNumber } from 'src/components/PriceExplorer/AnimatedDecimalNumber' +import { useLineChartFiatDelta } from 'src/components/PriceExplorer/useFiatDelta' import { useLineChartPrice, useLineChartRelativeChange } from 'src/components/PriceExplorer/usePrice' import { AnimatedText } from 'src/components/text/AnimatedText' import { Flex, Text, useSporeColors } from 'ui/src' @@ -39,19 +40,47 @@ export function PriceText({ maxWidth }: { loading: boolean; maxWidth?: number }) ) } -export function RelativeChangeText({ loading }: { loading: boolean }): JSX.Element { +export function RelativeChangeText({ + loading, + startingPrice, + shouldTreatAsStablecoin = false, +}: { + loading: boolean + startingPrice?: number + shouldTreatAsStablecoin?: boolean +}): JSX.Element { const colors = useSporeColors() const relativeChange = useLineChartRelativeChange() + const fiatDelta = useLineChartFiatDelta({ + startingPrice, + shouldTreatAsStablecoin, + }) + + const changeColor = useDerivedValue(() => { + if (relativeChange.value.value === 0) { + return colors.neutral3.val + } + return relativeChange.value.value > 0 ? colors.statusSuccess.val : colors.statusCritical.val + }) const styles = useAnimatedStyle(() => ({ - color: relativeChange.value.value >= 0 ? colors.statusSuccess.val : colors.statusCritical.val, + color: changeColor.value, })) const caretStyle = useAnimatedStyle(() => ({ - color: relativeChange.value.value >= 0 ? colors.statusSuccess.val : colors.statusCritical.val, + color: changeColor.value, transform: [{ rotate: relativeChange.value.value >= 0 ? '180deg' : '0deg' }], })) + // Combine fiat delta and percentage in a derived value + const combinedText = useDerivedValue(() => { + const delta = fiatDelta.formatted.value + if (delta) { + return `${delta} (${relativeChange.formatted.value})` + } + return relativeChange.formatted.value + }) + return ( = 0 ? -1 : 1 }, ]} /> - + )} @@ -93,8 +122,8 @@ export function DatetimeText({ loading }: { loading: boolean }): JSX.Element | n } return ( - - + + ) } diff --git a/apps/mobile/src/components/PriceExplorer/__snapshots__/Text.test.tsx.snap b/apps/mobile/src/components/PriceExplorer/__snapshots__/Text.test.tsx.snap index 98694cc5409..4b14e906407 100644 --- a/apps/mobile/src/components/PriceExplorer/__snapshots__/Text.test.tsx.snap +++ b/apps/mobile/src/components/PriceExplorer/__snapshots__/Text.test.tsx.snap @@ -6,10 +6,9 @@ exports[`DatetimeText renders without error 1`] = ` @@ -32,9 +31,9 @@ exports[`DatetimeText renders without error 1`] = ` }, }, "fontFamily": "Basel Grotesk", - "fontSize": 19, + "fontSize": 15, "fontWeight": "400", - "lineHeight": 24.7, + "lineHeight": 19.5, "padding": 0, } } diff --git a/apps/mobile/src/components/PriceExplorer/useFiatDelta.tsx b/apps/mobile/src/components/PriceExplorer/useFiatDelta.tsx new file mode 100644 index 00000000000..ff0024319e8 --- /dev/null +++ b/apps/mobile/src/components/PriceExplorer/useFiatDelta.tsx @@ -0,0 +1,116 @@ +import { useCallback, useMemo } from 'react' +import { runOnJS, SharedValue, useAnimatedReaction, useDerivedValue, useSharedValue } from 'react-native-reanimated' +import { useLineChart } from 'react-native-wagmi-charts' +import { useFormatChartFiatDelta } from 'uniswap/src/features/fiatCurrency/hooks/useFormatChartFiatDelta' +import { useLocalizationContext } from 'uniswap/src/features/language/LocalizationContext' + +interface UseFiatDeltaParams { + startingPrice?: number + shouldTreatAsStablecoin?: boolean +} + +interface FiatDeltaResult { + formatted: SharedValue +} + +/** + * Hook to calculate and format fiat delta for price charts. + * Optimized to only calculate deltas on-demand during scrubbing, reducing memory usage. + */ +export function useLineChartFiatDelta({ + startingPrice, + shouldTreatAsStablecoin = false, +}: UseFiatDeltaParams): FiatDeltaResult { + const { currentIndex, data, isActive } = useLineChart() + const { conversionRate } = useLocalizationContext() + const { formatChartFiatDelta } = useFormatChartFiatDelta() + + // Shared value for the current scrubbing delta + const scrubbingDeltaSharedValue = useSharedValue('') + + // Pre-calculate only the last point's delta (for non-scrubbing state) + const lastPointDelta = useMemo(() => { + if (!startingPrice || !data || !conversionRate || data.length === 0) { + return '' + } + + const convertedStartPrice = startingPrice * conversionRate + const lastPoint = data[data.length - 1] + if (!lastPoint) { + return '' + } + const convertedEndPrice = lastPoint.value * conversionRate + + const delta = formatChartFiatDelta({ + startingPrice: convertedStartPrice, + endingPrice: convertedEndPrice, + isStablecoin: shouldTreatAsStablecoin, + }) + + return delta.formatted + }, [startingPrice, data, conversionRate, formatChartFiatDelta, shouldTreatAsStablecoin]) + + // Calculate delta for current scrubbing position + const calculateCurrentDelta = useMemo(() => { + return (index: number) => { + if (!startingPrice || !data || !conversionRate) { + return '' + } + + const currentPoint = data[index] + if (!currentPoint) { + return '' + } + + const convertedStartPrice = startingPrice * conversionRate + const convertedEndPrice = currentPoint.value * conversionRate + + const delta = formatChartFiatDelta({ + startingPrice: convertedStartPrice, + endingPrice: convertedEndPrice, + isStablecoin: shouldTreatAsStablecoin, + }) + + return delta.formatted + } + }, [startingPrice, data, conversionRate, formatChartFiatDelta, shouldTreatAsStablecoin]) + + // Callback for updating the scrubbing delta from the UI thread + const updateScrubbingDelta = useCallback( + (index: number) => { + scrubbingDeltaSharedValue.value = calculateCurrentDelta(index) + }, + [calculateCurrentDelta], + ) + + // Track current index changes with useAnimatedReaction + useAnimatedReaction( + () => { + return currentIndex.value + }, + (currentIndexValue) => { + if (data && data.length > 0) { + const safeIndex = Math.min(Math.max(0, Math.round(currentIndexValue)), data.length - 1) + runOnJS(updateScrubbingDelta)(safeIndex) + } + }, + [data, updateScrubbingDelta], + ) + + // Create a derived value that decides which delta to show + const formatted = useDerivedValue(() => { + if (!data || data.length === 0) { + return '' + } + + // When scrubbing, use the current scrubbing delta + if (isActive.value) { + return scrubbingDeltaSharedValue.value + } + + // When not scrubbing, use the pre-calculated last point delta + return lastPointDelta + }) + + return { formatted } +} diff --git a/apps/mobile/src/components/PriceExplorer/usePrice.tsx b/apps/mobile/src/components/PriceExplorer/usePrice.tsx index 3b8197599c2..0e23b3d110b 100644 --- a/apps/mobile/src/components/PriceExplorer/usePrice.tsx +++ b/apps/mobile/src/components/PriceExplorer/usePrice.tsx @@ -68,7 +68,7 @@ export function useLineChartPrice(currentSpot?: SharedValue): ValueAndFo formatted: priceFormatted, shouldAnimate, }), - [price, priceFormatted, shouldAnimate], + [], ) } diff --git a/apps/mobile/src/components/PriceExplorer/usePriceHistory.ts b/apps/mobile/src/components/PriceExplorer/usePriceHistory.ts index 5f1222aaeda..62775d74aee 100644 --- a/apps/mobile/src/components/PriceExplorer/usePriceHistory.ts +++ b/apps/mobile/src/components/PriceExplorer/usePriceHistory.ts @@ -83,7 +83,7 @@ export function useTokenPriceHistory({ relativeChange: spotRelativeChange, } : undefined, - [price, spotValue, spotRelativeChange], + [price], ) const formattedPriceHistory = useMemo(() => { diff --git a/apps/mobile/src/components/Requests/ModalWithOverlay/ModalWithOverlay.tsx b/apps/mobile/src/components/Requests/ModalWithOverlay/ModalWithOverlay.tsx index e86b139e12b..4ea51ca8353 100644 --- a/apps/mobile/src/components/Requests/ModalWithOverlay/ModalWithOverlay.tsx +++ b/apps/mobile/src/components/Requests/ModalWithOverlay/ModalWithOverlay.tsx @@ -1,4 +1,5 @@ import { BottomSheetFooter, BottomSheetScrollView, useBottomSheetInternal } from '@gorhom/bottom-sheet' +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import { PropsWithChildren, useCallback, useRef, useState } from 'react' import { useTranslation } from 'react-i18next' import { @@ -17,8 +18,6 @@ import { Button, ButtonProps, Flex } from 'ui/src' import { spacing } from 'ui/src/theme' import { Modal } from 'uniswap/src/components/modals/Modal' import { ModalProps } from 'uniswap/src/components/modals/ModalProps' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' import { useAppInsets } from 'uniswap/src/hooks/useAppInsets' import { TestID } from 'uniswap/src/test/fixtures/testIDs' diff --git a/apps/mobile/src/components/Requests/RequestModal/WalletConnectRequestModal.tsx b/apps/mobile/src/components/Requests/RequestModal/WalletConnectRequestModal.tsx index daf85557387..768181e6026 100644 --- a/apps/mobile/src/components/Requests/RequestModal/WalletConnectRequestModal.tsx +++ b/apps/mobile/src/components/Requests/RequestModal/WalletConnectRequestModal.tsx @@ -1,4 +1,5 @@ import { useNetInfo } from '@react-native-community/netinfo' +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import { getSdkError } from '@walletconnect/utils' import { providers } from 'ethers' import React, { useMemo, useRef } from 'react' @@ -29,8 +30,6 @@ import { spacing } from 'ui/src/theme' import { EthMethod } from 'uniswap/src/features/dappRequests/types' import { isSignTypedDataRequest } from 'uniswap/src/features/dappRequests/utils' import { useTransactionGasFee } from 'uniswap/src/features/gas/hooks' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' import { Platform } from 'uniswap/src/features/platforms/types/Platform' import { useHasAccountMismatchCallback } from 'uniswap/src/features/smartWallet/mismatch/hooks' import { MobileEventName, ModalName } from 'uniswap/src/features/telemetry/constants' diff --git a/apps/mobile/src/components/Requests/ScanSheet/WalletConnectModal.tsx b/apps/mobile/src/components/Requests/ScanSheet/WalletConnectModal.tsx index b3d79b23c5c..d3bd8eb86a0 100644 --- a/apps/mobile/src/components/Requests/ScanSheet/WalletConnectModal.tsx +++ b/apps/mobile/src/components/Requests/ScanSheet/WalletConnectModal.tsx @@ -2,6 +2,7 @@ import React, { useCallback, useEffect, useState } from 'react' import { useTranslation } from 'react-i18next' import { Alert } from 'react-native' import 'react-native-reanimated' +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import { useDispatch } from 'react-redux' import { useEagerExternalProfileRootNavigation } from 'src/app/navigation/hooks' import { BackButtonView } from 'src/components/layout/BackButtonView' @@ -24,8 +25,6 @@ import { Modal } from 'uniswap/src/components/modals/Modal' import { ScannerModalState } from 'uniswap/src/components/ReceiveQRCode/constants' import { ReceiveQRCode } from 'uniswap/src/components/ReceiveQRCode/ReceiveQRCode' import { AccountType } from 'uniswap/src/features/accounts/types' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' import { ElementName, ModalName } from 'uniswap/src/features/telemetry/constants' import Trace from 'uniswap/src/features/telemetry/Trace' import { TestID } from 'uniswap/src/test/fixtures/testIDs' diff --git a/apps/mobile/src/components/Requests/ScanSheet/util.test.ts b/apps/mobile/src/components/Requests/ScanSheet/util.test.ts index 441ed9a01a7..76993011636 100644 --- a/apps/mobile/src/components/Requests/ScanSheet/util.test.ts +++ b/apps/mobile/src/components/Requests/ScanSheet/util.test.ts @@ -1,5 +1,9 @@ import * as wcUtils from '@walletconnect/utils' import { CUSTOM_UNI_QR_CODE_PREFIX, getSupportedURI, URIType } from 'src/components/Requests/ScanSheet/util' +import { + UNISWAP_URL_SCHEME_WALLETCONNECT_AS_PARAM, + UNISWAP_WALLETCONNECT_URL, +} from 'src/features/deepLinking/constants' import { wcAsParamInUniwapScheme, wcInUniwapScheme, @@ -121,4 +125,84 @@ describe('getSupportedURI', () => { it('should return undefined for invalid metamask address', async () => { expect(await getSupportedURI('ethereum:invalid_address')).toBeUndefined() }) + + describe('URL and HTML encoded URIs', () => { + it('should handle percent-encoded WalletConnect v2 URI', async () => { + // Simulate a URI that has been percent-encoded (& becomes %26) + const encodedUri = encodeURIComponent(VALID_WC_V2_URI) + const result = await getSupportedURI(encodedUri) + expect(result).toEqual({ type: URIType.WalletConnectV2URL, value: VALID_WC_V2_URI }) + }) + + it('should handle HTML entity-encoded ampersands in WalletConnect v2 URI', async () => { + // Simulate a URI with HTML-encoded ampersands (& becomes &) + const htmlEncodedUri = VALID_WC_V2_URI.replace(/&/g, '&') + const result = await getSupportedURI(htmlEncodedUri) + expect(result).toEqual({ type: URIType.WalletConnectV2URL, value: VALID_WC_V2_URI }) + }) + + it('should handle both percent-encoded and HTML entity-encoded URI', async () => { + // First apply HTML encoding, then percent encoding + const htmlEncodedUri = VALID_WC_V2_URI.replace(/&/g, '&') + const doubleEncodedUri = encodeURIComponent(htmlEncodedUri) + const result = await getSupportedURI(doubleEncodedUri) + expect(result).toEqual({ type: URIType.WalletConnectV2URL, value: VALID_WC_V2_URI }) + }) + + it('should handle percent-encoded uniswap scheme URI with query param', async () => { + const fullUri = UNISWAP_URL_SCHEME_WALLETCONNECT_AS_PARAM + VALID_WC_V2_URI + const encodedUri = encodeURIComponent(fullUri) + const result = await getSupportedURI(encodedUri) + expect(result).toEqual({ type: URIType.WalletConnectV2URL, value: VALID_WC_V2_URI }) + }) + + it('should handle HTML entity-encoded uniswap scheme URI with query param', async () => { + const fullUri = UNISWAP_URL_SCHEME_WALLETCONNECT_AS_PARAM + VALID_WC_V2_URI + const htmlEncodedUri = fullUri.replace(/&/g, '&') + const result = await getSupportedURI(htmlEncodedUri) + expect(result).toEqual({ type: URIType.WalletConnectV2URL, value: VALID_WC_V2_URI }) + }) + + it('should handle percent-encoded uniswap app URL', async () => { + const fullUri = UNISWAP_WALLETCONNECT_URL + VALID_WC_V2_URI + const encodedUri = encodeURIComponent(fullUri) + const result = await getSupportedURI(encodedUri) + expect(result).toEqual({ type: URIType.WalletConnectV2URL, value: VALID_WC_V2_URI }) + }) + + it('should handle HTML entity-encoded uniswap app URL', async () => { + const fullUri = UNISWAP_WALLETCONNECT_URL + VALID_WC_V2_URI + const htmlEncodedUri = fullUri.replace(/&/g, '&') + const result = await getSupportedURI(htmlEncodedUri) + expect(result).toEqual({ type: URIType.WalletConnectV2URL, value: VALID_WC_V2_URI }) + }) + + it('should handle percent-encoded hello_uniwallet prefix', async () => { + const fullUri = CUSTOM_UNI_QR_CODE_PREFIX + VALID_WC_V2_URI + const encodedUri = encodeURIComponent(fullUri) + const result = await getSupportedURI(encodedUri) + expect(result).toEqual({ type: URIType.WalletConnectV2URL, value: VALID_WC_V2_URI }) + }) + + it('should handle HTML entity-encoded hello_uniwallet prefix', async () => { + const fullUri = CUSTOM_UNI_QR_CODE_PREFIX + VALID_WC_V2_URI + const htmlEncodedUri = fullUri.replace(/&/g, '&') + const result = await getSupportedURI(htmlEncodedUri) + expect(result).toEqual({ type: URIType.WalletConnectV2URL, value: VALID_WC_V2_URI }) + }) + + it('should handle malformed percent-encoded URI without crashing', async () => { + // Malformed URI with invalid percent encoding (% not followed by valid hex) + const malformedUri = 'uniswap://wc?uri=%E0%A4%A' + // Should not throw an error, even with malformed encoding + await expect(getSupportedURI(malformedUri)).resolves.not.toThrow() + }) + + it('should handle URI with standalone percent sign', async () => { + // URI with a standalone % which is invalid for decodeURIComponent + const malformedUri = 'hello_uniwallet:' + VALID_WC_V2_URI + '%' + // Should not throw an error, even with malformed encoding + await expect(getSupportedURI(malformedUri)).resolves.not.toThrow() + }) + }) }) diff --git a/apps/mobile/src/components/Requests/ScanSheet/util.ts b/apps/mobile/src/components/Requests/ScanSheet/util.ts index 140882c7d38..f8f07334473 100644 --- a/apps/mobile/src/components/Requests/ScanSheet/util.ts +++ b/apps/mobile/src/components/Requests/ScanSheet/util.ts @@ -46,6 +46,9 @@ export async function getSupportedURI( return undefined } + // Decode URI in case it's encoded (handles both percent encoding and HTML ampersand) + uri = safeDecodeURIComponent(uri).replace(/&/g, '&') + const maybeAddress = getValidAddress({ address: uri, platform: Platform.EVM, @@ -72,7 +75,7 @@ export async function getSupportedURI( (await getWcUriWithCustomPrefix(uri, CUSTOM_UNI_QR_CODE_PREFIX)) || (await getWcUriWithCustomPrefix(uri, UNISWAP_URL_SCHEME_WALLETCONNECT_AS_PARAM)) || (await getWcUriWithCustomPrefix(uri, UNISWAP_URL_SCHEME)) || - (await getWcUriWithCustomPrefix(decodeURIComponent(uri), UNISWAP_WALLETCONNECT_URL)) || + (await getWcUriWithCustomPrefix(uri, UNISWAP_WALLETCONNECT_URL)) || {} if (maybeCustomWcUri && type) { @@ -147,6 +150,22 @@ export function getScantasticQueryParams(uri: string): Nullable { return uriParts[1] || null } +function safeDecodeURIComponent(value: string): string { + try { + return decodeURIComponent(value) + } catch (e) { + logger.error(new Error('Failed to decode URI component'), { + tags: { + file: 'util.ts', + function: 'safeDecodeURIComponent', + }, + extra: { value, error: e }, + }) + // If decoding fails, return the original value + return value + } +} + const PARAM_PUB_KEY = 'pubKey' const PARAM_UUID = 'uuid' const PARAM_VENDOR = 'vendor' @@ -181,10 +200,10 @@ export function parseScantasticParams(uri: string): ScantasticParams | undefined try { return ScantasticParamsSchema.parse({ publicKey: publicKey ? JSON.parse(publicKey) : undefined, - uuid: uuid ? decodeURIComponent(uuid) : undefined, - vendor: vendor ? decodeURIComponent(vendor) : undefined, - model: model ? decodeURIComponent(model) : undefined, - browser: browser ? decodeURIComponent(browser) : undefined, + uuid: uuid ? safeDecodeURIComponent(uuid) : undefined, + vendor: vendor ? safeDecodeURIComponent(vendor) : undefined, + model: model ? safeDecodeURIComponent(model) : undefined, + browser: browser ? safeDecodeURIComponent(browser) : undefined, }) } catch (e) { const wrappedError = new Error('Invalid scantastic params', { cause: e }) diff --git a/apps/mobile/src/components/Requests/Uwulink/utils.ts b/apps/mobile/src/components/Requests/Uwulink/utils.ts index a600453c6dc..5fede7fe5ea 100644 --- a/apps/mobile/src/components/Requests/Uwulink/utils.ts +++ b/apps/mobile/src/components/Requests/Uwulink/utils.ts @@ -1,15 +1,15 @@ -import { parseEther } from 'ethers/lib/utils' -import { WalletConnectSigningRequest } from 'src/features/walletConnect/walletConnectSlice' -import { AssetType } from 'uniswap/src/entities/assets' -import { SignerMnemonicAccountMeta } from 'uniswap/src/features/accounts/types' -import { EthMethod } from 'uniswap/src/features/dappRequests/types' import { DynamicConfigs, UwULinkAllowlist, UwULinkAllowlistItem, UwuLinkConfigKey, -} from 'uniswap/src/features/gating/configs' -import { useDynamicConfigValue } from 'uniswap/src/features/gating/hooks' + useDynamicConfigValue, +} from '@universe/gating' +import { parseEther } from 'ethers/lib/utils' +import { WalletConnectSigningRequest } from 'src/features/walletConnect/walletConnectSlice' +import { AssetType } from 'uniswap/src/entities/assets' +import { SignerMnemonicAccountMeta } from 'uniswap/src/features/accounts/types' +import { EthMethod } from 'uniswap/src/features/dappRequests/types' import { isUwULinkAllowlistType } from 'uniswap/src/features/gating/typeGuards' import { DappRequestType, diff --git a/apps/mobile/src/components/TokenDetails/TokenDetailsBridgedAssetSection.tsx b/apps/mobile/src/components/TokenDetails/TokenDetailsBridgedAssetSection.tsx index 840d9c10050..cd3aecd60b1 100644 --- a/apps/mobile/src/components/TokenDetails/TokenDetailsBridgedAssetSection.tsx +++ b/apps/mobile/src/components/TokenDetails/TokenDetailsBridgedAssetSection.tsx @@ -1,8 +1,6 @@ -import { useMemo } from 'react' import { navigate } from 'src/app/navigation/rootNavigation' import { useTokenDetailsContext } from 'src/components/TokenDetails/TokenDetailsContext' import { BridgedAssetTDPSection } from 'uniswap/src/components/BridgedAsset/BridgedAssetTDPSection' -import { checkIsBridgedAsset } from 'uniswap/src/components/BridgedAsset/utils' import { ModalName } from 'uniswap/src/features/telemetry/constants' import { useCurrencyInfo } from 'uniswap/src/features/tokens/useCurrencyInfo' import { CurrencyField } from 'uniswap/src/types/currency' @@ -29,7 +27,7 @@ export function TokenDetailsBridgedAssetSection(): JSX.Element | null { }, }) }) - const isBridgedAsset = useMemo(() => currencyInfo && checkIsBridgedAsset(currencyInfo), [currencyInfo]) + const isBridgedAsset = Boolean(currencyInfo?.isBridged) if (!isBridgedAsset || !currencyInfo) { return null } diff --git a/apps/mobile/src/components/accounts/AccountHeader.tsx b/apps/mobile/src/components/accounts/AccountHeader.tsx index 040684b16b8..5b29965af69 100644 --- a/apps/mobile/src/components/accounts/AccountHeader.tsx +++ b/apps/mobile/src/components/accounts/AccountHeader.tsx @@ -1,4 +1,5 @@ import { SharedEventName } from '@uniswap/analytics-events' +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import React, { useCallback, useEffect } from 'react' import { Gesture, GestureDetector, State } from 'react-native-gesture-handler' import Animated, { runOnJS, useAnimatedStyle, useSharedValue, withDelay, withTiming } from 'react-native-reanimated' @@ -11,8 +12,6 @@ import { CopyAlt, ScanHome, SettingsHome } from 'ui/src/components/icons' import { ScannerModalState } from 'uniswap/src/components/ReceiveQRCode/constants' import { AccountIcon } from 'uniswap/src/features/accounts/AccountIcon' import { AccountType, DisplayNameType } from 'uniswap/src/features/accounts/types' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' import { pushNotification } from 'uniswap/src/features/notifications/slice/slice' import { AppNotificationType, CopyNotificationType } from 'uniswap/src/features/notifications/slice/types' import { ElementName, ModalName } from 'uniswap/src/features/telemetry/constants' @@ -39,7 +38,7 @@ const RotatingSettingsIcon = ({ onPressSettings }: { onPressSettings(): void }): if (isScreenFocused) { pressProgress.value = withDelay(50, withTiming(0)) } - }, [isScreenFocused, pressProgress]) + }, [isScreenFocused]) const tap = Gesture.Tap() .withTestId(TestID.AccountHeaderSettings) diff --git a/apps/mobile/src/components/activity/ActivityContent.tsx b/apps/mobile/src/components/activity/ActivityContent.tsx index bdbab3bf204..ed12c5ecaaa 100644 --- a/apps/mobile/src/components/activity/ActivityContent.tsx +++ b/apps/mobile/src/components/activity/ActivityContent.tsx @@ -1,6 +1,7 @@ import type { LegendListRef } from '@legendapp/list' import { LegendList } from '@legendapp/list' import { useScrollToTop } from '@react-navigation/native' +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import type { ForwardedRef } from 'react' import { forwardRef, memo, useMemo, useRef } from 'react' import type { FlatList } from 'react-native' @@ -17,14 +18,13 @@ import { openModal } from 'src/features/modals/modalSlice' import { removePendingSession } from 'src/features/walletConnect/walletConnectSlice' import { Flex, useSporeColors } from 'ui/src' import { ScannerModalState } from 'uniswap/src/components/ReceiveQRCode/constants' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' import { ModalName } from 'uniswap/src/features/telemetry/constants' import { useAppInsets } from 'uniswap/src/hooks/useAppInsets' import { TestID } from 'uniswap/src/test/fixtures/testIDs' import { DDRumManualTiming } from 'utilities/src/logger/datadog/datadogEvents' import { usePerformanceLogger } from 'utilities/src/logger/usePerformanceLogger' import { isAndroid } from 'utilities/src/platform' +import { useEvent } from 'utilities/src/react/hooks' import { useActivityDataWallet } from 'wallet/src/features/activity/useActivityDataWallet' const ESTIMATED_ITEM_SIZE = 92 @@ -55,11 +55,11 @@ export const ActivityContent = memo( const { onContentSizeChange, adaptiveFooter } = useAdaptiveFooter(containerProps?.contentContainerStyle) - const onPressReceive = (): void => { + const onPressReceive = useEvent((): void => { // in case we received a pending session from a previous scan after closing modal dispatch(removePendingSession()) dispatch(openModal({ name: ModalName.WalletConnectScan, initialState: ScannerModalState.WalletQr })) - } + }) const { maybeEmptyComponent, renderActivityItem, sectionData, keyExtractor } = useActivityDataWallet({ evmOwner: owner, @@ -105,6 +105,9 @@ export const ActivityContent = memo( ListEmptyComponent={maybeEmptyComponent} ListFooterComponent={isExternalProfile ? null : adaptiveFooter} contentContainerStyle={containerProps?.contentContainerStyle} + refreshControl={refreshControl} + refreshing={refreshing} + onContentSizeChange={onContentSizeChange} /> ) : ( { // @ts-expect-error https://github.com/software-mansion/react-native-reanimated/issues/2976 myRef.current?._listRef._scrollRef.scrollTo({ x: Math.floor(scroll.value / fullWidth - 0.5) * fullWidth, }) - }, [fullWidth, scroll]) + }, [fullWidth]) return ( diff --git a/apps/mobile/src/components/explore/ExploreSections/ExploreSections.tsx b/apps/mobile/src/components/explore/ExploreSections/ExploreSections.tsx index 26d19b1252f..edda8bccac5 100644 --- a/apps/mobile/src/components/explore/ExploreSections/ExploreSections.tsx +++ b/apps/mobile/src/components/explore/ExploreSections/ExploreSections.tsx @@ -6,6 +6,7 @@ import { TokenStats, } from '@uniswap/client-explore/dist/uniswap/explore/v1/service_pb' import { ALL_NETWORKS_ARG } from '@universe/api' +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import React, { memo, useCallback, useEffect, useMemo, useRef, useState } from 'react' import { useTranslation } from 'react-i18next' import { @@ -34,8 +35,6 @@ import { BaseCard } from 'uniswap/src/components/BaseCard/BaseCard' import { useTokenRankingsQuery } from 'uniswap/src/data/rest/tokenRankings' import type { UniverseChainId } from 'uniswap/src/features/chains/types' import { fromGraphQLChain } from 'uniswap/src/features/chains/utils' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' import { MobileEventName } from 'uniswap/src/features/telemetry/constants' import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send' import { useAppInsets } from 'uniswap/src/hooks/useAppInsets' diff --git a/apps/mobile/src/components/explore/search/ExploreScreenSearchResultsList.tsx b/apps/mobile/src/components/explore/search/ExploreScreenSearchResultsList.tsx index 1ae943b09fb..49db351bbc5 100644 --- a/apps/mobile/src/components/explore/search/ExploreScreenSearchResultsList.tsx +++ b/apps/mobile/src/components/explore/search/ExploreScreenSearchResultsList.tsx @@ -1,3 +1,4 @@ +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import { memo, useCallback, useMemo, useState } from 'react' import { useTranslation } from 'react-i18next' import { KeyboardAvoidingView } from 'react-native-keyboard-controller' @@ -5,8 +6,6 @@ import { ESTIMATED_BOTTOM_TABS_HEIGHT } from 'src/app/navigation/tabs/CustomTabB import { Flex, flexStyles, Text, TouchableArea } from 'ui/src' import { spacing } from 'ui/src/theme' import type { UniverseChainId } from 'uniswap/src/features/chains/types' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' import { SearchModalNoQueryList } from 'uniswap/src/features/search/SearchModal/SearchModalNoQueryList' import { SearchModalResultsList } from 'uniswap/src/features/search/SearchModal/SearchModalResultsList' import { MOBILE_SEARCH_TABS, SearchTab } from 'uniswap/src/features/search/SearchModal/types' diff --git a/apps/mobile/src/components/home/HomeExploreTab.tsx b/apps/mobile/src/components/home/HomeExploreTab.tsx index a52b9881913..899a6fddaed 100644 --- a/apps/mobile/src/components/home/HomeExploreTab.tsx +++ b/apps/mobile/src/components/home/HomeExploreTab.tsx @@ -1,5 +1,6 @@ import { ReactNavigationPerformanceView } from '@shopify/react-native-performance-navigation' import { GraphQLApi } from '@universe/api' +import { DynamicConfigs, HomeScreenExploreTokensConfigKey, useDynamicConfigValue } from '@universe/gating' import { ForwardedRef, forwardRef, memo, useCallback, useEffect, useMemo, useState } from 'react' import { useTranslation } from 'react-i18next' import { FlatList, LayoutRectangle, RefreshControl } from 'react-native' @@ -15,8 +16,6 @@ import { SwirlyArrowDown } from 'ui/src/components/icons' import { spacing, zIndexes } from 'ui/src/theme' import { fromGraphQLChain } from 'uniswap/src/features/chains/utils' import { useAppFiatCurrency } from 'uniswap/src/features/fiatCurrency/hooks' -import { DynamicConfigs, HomeScreenExploreTokensConfigKey } from 'uniswap/src/features/gating/configs' -import { useDynamicConfigValue } from 'uniswap/src/features/gating/hooks' import { isContractInputArrayType } from 'uniswap/src/features/gating/typeGuards' import { MobileEventName } from 'uniswap/src/features/telemetry/constants' import { useAppInsets } from 'uniswap/src/hooks/useAppInsets' diff --git a/apps/mobile/src/components/home/TokensTab.tsx b/apps/mobile/src/components/home/TokensTab.tsx index 9b41db908a6..b5da1f62cb5 100644 --- a/apps/mobile/src/components/home/TokensTab.tsx +++ b/apps/mobile/src/components/home/TokensTab.tsx @@ -1,4 +1,5 @@ import { useStartProfiler } from '@shopify/react-native-performance' +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import React, { forwardRef, memo, useCallback, useMemo } from 'react' import { useTranslation } from 'react-i18next' import { FlatList } from 'react-native' @@ -14,8 +15,6 @@ import { NoTokens } from 'ui/src/components/icons' import { BaseCard } from 'uniswap/src/components/BaseCard/BaseCard' import { PortfolioEmptyState } from 'uniswap/src/components/portfolio/PortfolioEmptyState' import { ScannerModalState } from 'uniswap/src/components/ReceiveQRCode/constants' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' import { TokenBalanceListRow } from 'uniswap/src/features/portfolio/types' import { ModalName } from 'uniswap/src/features/telemetry/constants' import { CurrencyId } from 'uniswap/src/types/currency' diff --git a/apps/mobile/src/components/home/hooks.tsx b/apps/mobile/src/components/home/hooks.tsx index c216431ac85..e5b8826f637 100644 --- a/apps/mobile/src/components/home/hooks.tsx +++ b/apps/mobile/src/components/home/hooks.tsx @@ -1,6 +1,8 @@ +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import { useCallback, useEffect, useMemo } from 'react' import { StyleProp, ViewStyle } from 'react-native' import Animated, { SharedValue, useAnimatedStyle, useSharedValue } from 'react-native-reanimated' +import { ESTIMATED_BOTTOM_TABS_HEIGHT } from 'src/app/navigation/tabs/CustomTabBar/constants' import { TAB_BAR_HEIGHT } from 'src/components/layout/TabHelpers' import { useDeviceDimensions } from 'ui/src/hooks/useDeviceDimensions' import { useAppInsets } from 'uniswap/src/hooks/useAppInsets' @@ -13,6 +15,9 @@ export function useAdaptiveFooter(contentContainerStyle?: StyleProp): } { const { fullHeight } = useDeviceDimensions() const insets = useAppInsets() + const isBottomTabsEnabled = useFeatureFlag(FeatureFlags.BottomTabs) + + const HEIGHT_TO_SUBTRACT = isBottomTabsEnabled ? ESTIMATED_BOTTOM_TABS_HEIGHT : TAB_BAR_HEIGHT // Content is rendered under the navigation bar but not under the status bar const maxContentHeight = fullHeight - insets.top // Use maxContentHeight as the initial value to properly position the TabBar @@ -28,7 +33,7 @@ export function useAdaptiveFooter(contentContainerStyle?: StyleProp): } // The height of the footer added to the list can be calculated from // the following equation (for collapsed tab bar): - // maxContentHeight = TAB_BAR_HEIGHT + + footerHeight + paddingBottom + // maxContentHeight = HEIGHT_TO_SUBTRACT + + footerHeight + paddingBottom // // To get the we need to subtract padding already // added to the content container style and the footer if it's already @@ -36,17 +41,17 @@ export function useAdaptiveFooter(contentContainerStyle?: StyleProp): // = contentHeight - paddingTop - paddingBottom - footerHeight // // The resulting equation is: - // footerHeight = maxContentHeight - - TAB_BAR_HEIGHT - paddingBottom - // = maxContentHeight - (contentHeight - paddingTop - paddingBottom - footerHeight) - TAB_BAR_HEIGHT - paddingBottom - // = maxContentHeight + paddingTop + footerHeight - (contentHeight + TAB_BAR_HEIGHT) + // footerHeight = maxContentHeight - - HEIGHT_TO_SUBTRACT - paddingBottom + // = maxContentHeight - (contentHeight - paddingTop - paddingBottom - footerHeight) - HEIGHT_TO_SUBTRACT - paddingBottom + // = maxContentHeight + paddingTop + footerHeight - (contentHeight + HEIGHT_TO_SUBTRACT) const paddingTopProp = (contentContainerStyle as ViewStyle).paddingTop const paddingTop = typeof paddingTopProp === 'number' ? paddingTopProp : 0 const calculatedFooterHeight = - maxContentHeight + paddingTop + footerHeight.value - (contentHeight + TAB_BAR_HEIGHT) + maxContentHeight + paddingTop + footerHeight.value - (contentHeight + HEIGHT_TO_SUBTRACT) footerHeight.value = Math.max(0, calculatedFooterHeight) }, - [footerHeight, contentContainerStyle, maxContentHeight], + [contentContainerStyle, maxContentHeight, HEIGHT_TO_SUBTRACT], ) // biome-ignore lint/correctness/useExhaustiveDependencies: we want to recalculate this when activeAccount changes diff --git a/apps/mobile/src/components/home/introCards/FundWalletModal.tsx b/apps/mobile/src/components/home/introCards/FundWalletModal.tsx index 67565c140cf..35c592bf7ee 100644 --- a/apps/mobile/src/components/home/introCards/FundWalletModal.tsx +++ b/apps/mobile/src/components/home/introCards/FundWalletModal.tsx @@ -1,3 +1,4 @@ +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import React, { PropsWithChildren, useCallback, useMemo } from 'react' import { useTranslation } from 'react-i18next' import { FlatList } from 'react-native' @@ -13,8 +14,6 @@ import { ActionCard, ActionCardItem } from 'uniswap/src/components/misc/ActionCa import { Modal } from 'uniswap/src/components/modals/Modal' import { ImageUri } from 'uniswap/src/components/nfts/images/ImageUri' import { useCexTransferProviders } from 'uniswap/src/features/fiatOnRamp/useCexTransferProviders' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' import { ElementName, ModalName } from 'uniswap/src/features/telemetry/constants' import { usePortfolioEmptyStateBackground } from 'wallet/src/components/portfolio/empty' diff --git a/apps/mobile/src/components/home/introCards/OnboardingIntroCardStack.tsx b/apps/mobile/src/components/home/introCards/OnboardingIntroCardStack.tsx index a03ea0a749d..910a539088f 100644 --- a/apps/mobile/src/components/home/introCards/OnboardingIntroCardStack.tsx +++ b/apps/mobile/src/components/home/introCards/OnboardingIntroCardStack.tsx @@ -1,4 +1,5 @@ import { SharedEventName } from '@uniswap/analytics-events' +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import React, { useCallback, useMemo } from 'react' import { useTranslation } from 'react-i18next' import { useDispatch, useSelector } from 'react-redux' @@ -12,8 +13,6 @@ import { BRIDGED_ASSETS_CARD_BANNER, PUSH_NOTIFICATIONS_CARD_BANNER } from 'ui/s import { Buy } from 'ui/src/components/icons' import { AccountType } from 'uniswap/src/features/accounts/types' import { UniverseChainId } from 'uniswap/src/features/chains/types' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' import { ElementName, ModalName, WalletEventName } from 'uniswap/src/features/telemetry/constants' import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send' import { OnboardingCardLoggingName } from 'uniswap/src/features/telemetry/types' diff --git a/apps/mobile/src/components/layout/TabHelpers.tsx b/apps/mobile/src/components/layout/TabHelpers.tsx index 3cbea4bdbc6..e09383d79f3 100644 --- a/apps/mobile/src/components/layout/TabHelpers.tsx +++ b/apps/mobile/src/components/layout/TabHelpers.tsx @@ -1,5 +1,6 @@ /* eslint-disable react-native/no-unused-styles */ import { FlashList, FlashListProps } from '@shopify/flash-list' +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import React, { RefObject, useCallback, useMemo } from 'react' import { FlatList, @@ -14,8 +15,6 @@ import Animated, { SharedValue } from 'react-native-reanimated' import { Route } from 'react-native-tab-view' import { Flex, Text } from 'ui/src' import { colorsLight, spacing } from 'ui/src/theme' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' import { TestIDType } from 'uniswap/src/test/fixtures/testIDs' import { PendingNotificationBadge } from 'wallet/src/features/notifications/components/PendingNotificationBadge' diff --git a/apps/mobile/src/components/loading/parts/WaveLoader.tsx b/apps/mobile/src/components/loading/parts/WaveLoader.tsx index 8eb6baa7881..202eb9da63b 100644 --- a/apps/mobile/src/components/loading/parts/WaveLoader.tsx +++ b/apps/mobile/src/components/loading/parts/WaveLoader.tsx @@ -19,7 +19,6 @@ export function WaveLoader(): JSX.Element { const yPosition = useSharedValue(0) const { chartHeight } = useChartDimensions() - // biome-ignore lint/correctness/useExhaustiveDependencies: only want to do this once on mount useEffect(() => { yPosition.value = withRepeat(withTiming(1, { duration: WAVE_DURATION }), Infinity, false) }, []) diff --git a/apps/mobile/src/features/datadog/DatadogProviderWrapper.tsx b/apps/mobile/src/features/datadog/DatadogProviderWrapper.tsx index b307753f982..33cc7e78ee6 100644 --- a/apps/mobile/src/features/datadog/DatadogProviderWrapper.tsx +++ b/apps/mobile/src/features/datadog/DatadogProviderWrapper.tsx @@ -8,15 +8,15 @@ import { UploadFrequency, } from '@datadog/mobile-react-native' import { ErrorEventMapper } from '@datadog/mobile-react-native/lib/typescript/rum/eventMappers/errorEventMapper' -import { PropsWithChildren, default as React, useEffect, useState } from 'react' -import { DatadogContext } from 'src/features/datadog/DatadogContext' -import { config } from 'uniswap/src/config' import { DatadogIgnoredErrorsConfigKey, DatadogIgnoredErrorsValType, DynamicConfigs, -} from 'uniswap/src/features/gating/configs' -import { getDynamicConfigValue } from 'uniswap/src/features/gating/hooks' + getDynamicConfigValue, +} from '@universe/gating' +import { PropsWithChildren, default as React, useEffect, useState } from 'react' +import { DatadogContext } from 'src/features/datadog/DatadogContext' +import { config } from 'uniswap/src/config' import { datadogEnabledBuild, isTestRun, localDevDatadogEnabled } from 'utilities/src/environment/constants' import { setAttributesToDatadog } from 'utilities/src/logger/datadog/Datadog' import { getDatadogEnvironment } from 'utilities/src/logger/datadog/env' diff --git a/apps/mobile/src/features/deepLinking/configUtils.ts b/apps/mobile/src/features/deepLinking/configUtils.ts index f6047a337dd..19231b35d75 100644 --- a/apps/mobile/src/features/deepLinking/configUtils.ts +++ b/apps/mobile/src/features/deepLinking/configUtils.ts @@ -2,10 +2,10 @@ import { DeepLinkUrlAllowlist, DeepLinkUrlAllowlistConfigKey, DynamicConfigs, + getDynamicConfigValue, UwULinkAllowlist, UwuLinkConfigKey, -} from 'uniswap/src/features/gating/configs' -import { getDynamicConfigValue } from 'uniswap/src/features/gating/hooks' +} from '@universe/gating' import { isUwULinkAllowlistType } from 'uniswap/src/features/gating/typeGuards' /** diff --git a/apps/mobile/src/features/deepLinking/deepLinkUtils.ts b/apps/mobile/src/features/deepLinking/deepLinkUtils.ts index a25138e2060..318a9e14845 100644 --- a/apps/mobile/src/features/deepLinking/deepLinkUtils.ts +++ b/apps/mobile/src/features/deepLinking/deepLinkUtils.ts @@ -1,3 +1,4 @@ +import { DeepLinkUrlAllowlist } from '@universe/gating' import { getScantasticQueryParams } from 'src/components/Requests/ScanSheet/util' import { UNISWAP_URL_SCHEME_UWU_LINK } from 'src/components/Requests/Uwulink/utils' import { getInAppBrowserAllowlist } from 'src/features/deepLinking/configUtils' @@ -8,7 +9,6 @@ import { UNISWAP_WALLETCONNECT_URL, } from 'src/features/deepLinking/constants' import { UNISWAP_WEB_HOSTNAME } from 'uniswap/src/constants/urls' -import { DeepLinkUrlAllowlist } from 'uniswap/src/features/gating/configs' import { isCurrencyIdValid } from 'uniswap/src/utils/currencyId' import { logger } from 'utilities/src/logger/logger' diff --git a/apps/mobile/src/features/deepLinking/handleDeepLinkSaga.test.ts b/apps/mobile/src/features/deepLinking/handleDeepLinkSaga.test.ts index 170a0955994..9424abf457a 100644 --- a/apps/mobile/src/features/deepLinking/handleDeepLinkSaga.test.ts +++ b/apps/mobile/src/features/deepLinking/handleDeepLinkSaga.test.ts @@ -42,13 +42,11 @@ jest.mock('expo-web-browser', () => ({ FULL_SCREEN: 'fullScreen', }, })) -jest.mock('uniswap/src/features/gating/sdk/statsig', () => ({ +jest.mock('@universe/gating', () => ({ + ...jest.requireActual('@universe/gating'), getStatsigClient: jest.fn(() => ({ checkGate: jest.fn(() => false), // Always return false to avoid Korea gate redirects })), -})) - -jest.mock('uniswap/src/features/gating/hooks', () => ({ getFeatureFlag: jest.fn(() => false), // Default to false for feature flags })) diff --git a/apps/mobile/src/features/deepLinking/handleDeepLinkSaga.ts b/apps/mobile/src/features/deepLinking/handleDeepLinkSaga.ts index a9afe70a1a0..c115585ae5b 100644 --- a/apps/mobile/src/features/deepLinking/handleDeepLinkSaga.ts +++ b/apps/mobile/src/features/deepLinking/handleDeepLinkSaga.ts @@ -1,4 +1,5 @@ import { createAction } from '@reduxjs/toolkit' +import { FeatureFlags, getFeatureFlagName, getStatsigClient } from '@universe/gating' import { parseUri } from '@walletconnect/utils' import { Alert } from 'react-native' import { navigate } from 'src/app/navigation/rootNavigation' @@ -29,8 +30,6 @@ import { waitForWcWeb3WalletIsReady } from 'src/features/walletConnect/walletCon import { addRequest, setDidOpenFromDeepLink } from 'src/features/walletConnect/walletConnectSlice' import { call, delay, put, select, takeLatest } from 'typed-redux-saga' import { AccountType } from 'uniswap/src/features/accounts/types' -import { FeatureFlags, getFeatureFlagName } from 'uniswap/src/features/gating/flags' -import { getStatsigClient } from 'uniswap/src/features/gating/sdk/statsig' import { MobileEventName, ModalName } from 'uniswap/src/features/telemetry/constants' import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send' import i18n from 'uniswap/src/i18n' diff --git a/apps/mobile/src/features/deepLinking/handleOnRampReturnLinkSaga.ts b/apps/mobile/src/features/deepLinking/handleOnRampReturnLinkSaga.ts index da904ede2ea..8edff2d8379 100644 --- a/apps/mobile/src/features/deepLinking/handleOnRampReturnLinkSaga.ts +++ b/apps/mobile/src/features/deepLinking/handleOnRampReturnLinkSaga.ts @@ -1,9 +1,8 @@ +import { FeatureFlags, getFeatureFlag } from '@universe/gating' import { navigate } from 'src/app/navigation/rootNavigation' import { HomeScreenTabIndex } from 'src/screens/HomeScreen/HomeScreenTabIndex' import { dismissInAppBrowser } from 'src/utils/linking' import { call, put } from 'typed-redux-saga' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { getFeatureFlag } from 'uniswap/src/features/gating/hooks' import { forceFetchFiatOnRampTransactions } from 'uniswap/src/features/transactions/slice' import { MobileScreens } from 'uniswap/src/types/screens/mobile' diff --git a/apps/mobile/src/features/deepLinking/handleTransactionLinkSaga.ts b/apps/mobile/src/features/deepLinking/handleTransactionLinkSaga.ts index fefafa0b2dd..c6e5d16b175 100644 --- a/apps/mobile/src/features/deepLinking/handleTransactionLinkSaga.ts +++ b/apps/mobile/src/features/deepLinking/handleTransactionLinkSaga.ts @@ -1,9 +1,8 @@ +import { FeatureFlags, getFeatureFlag } from '@universe/gating' import { navigate } from 'src/app/navigation/rootNavigation' import { closeAllModals } from 'src/features/modals/modalSlice' import { HomeScreenTabIndex } from 'src/screens/HomeScreen/HomeScreenTabIndex' import { call, put } from 'typed-redux-saga' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { getFeatureFlag } from 'uniswap/src/features/gating/hooks' import { MobileScreens } from 'uniswap/src/types/screens/mobile' export function* handleTransactionLink() { diff --git a/apps/mobile/src/features/lockScreen/LockScreenModal.tsx b/apps/mobile/src/features/lockScreen/LockScreenModal.tsx index e1c19214daf..91addda367a 100644 --- a/apps/mobile/src/features/lockScreen/LockScreenModal.tsx +++ b/apps/mobile/src/features/lockScreen/LockScreenModal.tsx @@ -1,3 +1,4 @@ +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import { BlurView } from 'expo-blur' import React, { memo } from 'react' import { useTranslation } from 'react-i18next' @@ -15,8 +16,6 @@ import { UNISWAP_MONO_LOGO_LARGE } from 'ui/src/assets' import { AnimatedFlex } from 'ui/src/components/layout/AnimatedFlex' import { useDeviceDimensions } from 'ui/src/hooks/useDeviceDimensions' import { spacing, zIndexes } from 'ui/src/theme' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' import { useAppInsets } from 'uniswap/src/hooks/useAppInsets' import { isAndroid } from 'utilities/src/platform' import { useEvent } from 'utilities/src/react/hooks' diff --git a/apps/mobile/src/features/send/SendFormButton.tsx b/apps/mobile/src/features/send/SendFormButton.tsx index 2b7019008c5..82bf9ea84db 100644 --- a/apps/mobile/src/features/send/SendFormButton.tsx +++ b/apps/mobile/src/features/send/SendFormButton.tsx @@ -2,7 +2,6 @@ import React, { Dispatch, SetStateAction, useCallback, useMemo } from 'react' import { useTranslation } from 'react-i18next' import { useSelector } from 'react-redux' import { Button, Flex } from 'ui/src' -import { checkIsBridgedAsset } from 'uniswap/src/components/BridgedAsset/utils' import { WarningLabel } from 'uniswap/src/components/modals/WarningModal/types' import { nativeOnChain } from 'uniswap/src/constants/tokens' import { AccountType } from 'uniswap/src/features/accounts/types' @@ -60,7 +59,7 @@ export function SendFormButton({ const { tokenWarningDismissed: isCompatibleAddressDismissed } = useDismissedCompatibleAddressWarnings( currencyInInfo?.currency, ) - const isUnichainBridgedAsset = checkIsBridgedAsset(currencyInInfo ?? undefined) && !isCompatibleAddressDismissed + const isUnichainBridgedAsset = Boolean(currencyInInfo?.isBridged) && !isCompatibleAddressDismissed const insufficientGasFunds = warnings.warnings.some((warning) => warning.type === WarningLabel.InsufficientGasFunds) diff --git a/apps/mobile/src/features/wallet/useWalletRestore.ts b/apps/mobile/src/features/wallet/useWalletRestore.ts index 00c8d30154b..d0e4e6214aa 100644 --- a/apps/mobile/src/features/wallet/useWalletRestore.ts +++ b/apps/mobile/src/features/wallet/useWalletRestore.ts @@ -1,9 +1,8 @@ import { useFocusEffect } from '@react-navigation/core' +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import { useCallback, useEffect, useRef, useState } from 'react' import { navigate } from 'src/app/navigation/rootNavigation' import { WalletRestoreType } from 'src/components/RestoreWalletModal/RestoreWalletModalState' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' import { ModalName } from 'uniswap/src/features/telemetry/constants' import { logger } from 'utilities/src/logger/logger' import { useSignerAccounts } from 'wallet/src/features/wallet/hooks' diff --git a/apps/mobile/src/features/walletConnect/batchedTransactionSaga.ts b/apps/mobile/src/features/walletConnect/batchedTransactionSaga.ts index 15cd9d3e14b..ae825ac1a3d 100644 --- a/apps/mobile/src/features/walletConnect/batchedTransactionSaga.ts +++ b/apps/mobile/src/features/walletConnect/batchedTransactionSaga.ts @@ -1,4 +1,5 @@ import { TradingApi } from '@universe/api' +import { FeatureFlags, getFeatureFlag } from '@universe/gating' import { getInternalError, getSdkError } from '@walletconnect/utils' import { navigate } from 'src/app/navigation/rootNavigation' import { wcWeb3Wallet } from 'src/features/walletConnect/walletConnectClient' @@ -7,8 +8,6 @@ import { call, put, select } from 'typed-redux-saga' import { UNISWAP_DELEGATION_ADDRESS } from 'uniswap/src/constants/addresses' import { checkWalletDelegation, TradingApiClient } from 'uniswap/src/data/apiClients/tradingApi/TradingApiClient' import { UniverseChainId } from 'uniswap/src/features/chains/types' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { getFeatureFlag } from 'uniswap/src/features/gating/hooks' import { Platform } from 'uniswap/src/features/platforms/types/Platform' import { getEnabledChainIdsSaga } from 'uniswap/src/features/settings/saga' import { ModalName } from 'uniswap/src/features/telemetry/constants' diff --git a/apps/mobile/src/features/walletConnect/saga.ts b/apps/mobile/src/features/walletConnect/saga.ts index ed6d1af97bb..b52b1b8d603 100644 --- a/apps/mobile/src/features/walletConnect/saga.ts +++ b/apps/mobile/src/features/walletConnect/saga.ts @@ -1,6 +1,7 @@ /* eslint-disable max-lines */ import { AnyAction } from '@reduxjs/toolkit' import { WalletKitTypes } from '@reown/walletkit' +import { FeatureFlags, getFeatureFlag } from '@universe/gating' import { PendingRequestTypes, ProposalTypes, SessionTypes, Verify } from '@walletconnect/types' import { buildApprovedNamespaces, getSdkError, populateAuthPayload } from '@walletconnect/utils' import { Alert } from 'react-native' @@ -39,8 +40,6 @@ import { UniverseChainId } from 'uniswap/src/features/chains/types' import { getChainLabel } from 'uniswap/src/features/chains/utils' import { EthMethod } from 'uniswap/src/features/dappRequests/types' import { isSelfCallWithData } from 'uniswap/src/features/dappRequests/utils' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { getFeatureFlag } from 'uniswap/src/features/gating/hooks' import { pushNotification } from 'uniswap/src/features/notifications/slice/slice' import { AppNotificationType } from 'uniswap/src/features/notifications/slice/types' import { Platform } from 'uniswap/src/features/platforms/types/Platform' diff --git a/apps/mobile/src/screens/ActivityScreen.tsx b/apps/mobile/src/screens/ActivityScreen.tsx index d3005fa1c06..5ab318ab1fa 100644 --- a/apps/mobile/src/screens/ActivityScreen.tsx +++ b/apps/mobile/src/screens/ActivityScreen.tsx @@ -2,16 +2,16 @@ import { useApolloClient } from '@apollo/client' import { useScrollToTop } from '@react-navigation/native' import { useQuery } from '@tanstack/react-query' import { GQLQueries } from '@universe/api' +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import { useCallback, useEffect, useMemo, useRef } from 'react' import { useTranslation } from 'react-i18next' import { useDispatch } from 'react-redux' import { ESTIMATED_BOTTOM_TABS_HEIGHT } from 'src/app/navigation/tabs/CustomTabBar/constants' import { ActivityContent } from 'src/components/activity/ActivityContent' import { Screen } from 'src/components/layout/Screen' +import { useAppStateTrigger } from 'src/utils/useAppStateTrigger' import { Text } from 'ui/src' import { spacing } from 'ui/src/theme' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' import { useSelectAddressHasNotifications } from 'uniswap/src/features/notifications/slice/hooks' import { setNotificationStatus } from 'uniswap/src/features/notifications/slice/slice' import { useAppInsets } from 'uniswap/src/hooks/useAppInsets' @@ -49,6 +49,13 @@ export function ActivityScreen(): JSX.Element { const { refreshing, onRefreshActivityData } = useRefreshActivityData(activeAccount.address) + // Automatically refresh activity data when app comes to foreground + useAppStateTrigger({ + from: 'background', + to: 'active', + callback: onRefreshActivityData, + }) + const insets = useAppInsets() const isBottomTabsEnabled = useFeatureFlag(FeatureFlags.BottomTabs) diff --git a/apps/mobile/src/screens/AppLoadingScreen.tsx b/apps/mobile/src/screens/AppLoadingScreen.tsx index 27192763892..10f97edf4aa 100644 --- a/apps/mobile/src/screens/AppLoadingScreen.tsx +++ b/apps/mobile/src/screens/AppLoadingScreen.tsx @@ -1,4 +1,5 @@ import { NativeStackScreenProps } from '@react-navigation/native-stack' +import { DynamicConfigs, OnDeviceRecoveryConfigKey, useDynamicConfigValue } from '@universe/gating' import dayjs from 'dayjs' import { isEnrolledAsync } from 'expo-local-authentication' import { useCallback, useEffect, useState } from 'react' @@ -15,8 +16,6 @@ import { import { useHideSplashScreen } from 'src/features/splashScreen/useHideSplashScreen' import { RecoveryWalletInfo, useOnDeviceRecoveryData } from 'src/screens/Import/useOnDeviceRecoveryData' import { AccountType } from 'uniswap/src/features/accounts/types' -import { DynamicConfigs, OnDeviceRecoveryConfigKey } from 'uniswap/src/features/gating/configs' -import { useDynamicConfigValue } from 'uniswap/src/features/gating/hooks' import { MobileEventName } from 'uniswap/src/features/telemetry/constants' import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send' import Trace from 'uniswap/src/features/telemetry/Trace' diff --git a/apps/mobile/src/screens/ExploreScreen.tsx b/apps/mobile/src/screens/ExploreScreen.tsx index ff0cbf76986..136fc7bcaa6 100644 --- a/apps/mobile/src/screens/ExploreScreen.tsx +++ b/apps/mobile/src/screens/ExploreScreen.tsx @@ -1,5 +1,6 @@ import { useIsFocused, useNavigation, useScrollToTop } from '@react-navigation/native' import { SharedEventName } from '@uniswap/analytics-events' +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import { useEffect, useRef, useState } from 'react' import { useTranslation } from 'react-i18next' import { type TextInput } from 'react-native' @@ -16,8 +17,6 @@ import { HandleBar } from 'uniswap/src/components/modals/HandleBar' import { NetworkFilter, type NetworkFilterProps } from 'uniswap/src/components/network/NetworkFilter' import { useEnabledChains } from 'uniswap/src/features/chains/hooks/useEnabledChains' import type { UniverseChainId } from 'uniswap/src/features/chains/types' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' import { useFilterCallbacks } from 'uniswap/src/features/search/SearchModal/hooks/useFilterCallbacks' import { CancelBehaviorType, SearchTextInput } from 'uniswap/src/features/search/SearchTextInput' import { MobileEventName, ModalName, SectionName } from 'uniswap/src/features/telemetry/constants' @@ -98,7 +97,7 @@ export function ExploreScreen(): JSX.Element { }) return unsubscribe - }, [isBottomTabsEnabled, navigation, listRef]) + }, [isBottomTabsEnabled, navigation]) // TODO(WALL-5482): investigate list rendering performance/scrolling issue const canRenderList = useRenderNextFrame(isSheetReady && !isSearchMode) diff --git a/apps/mobile/src/screens/HomeScreen/HomeScreen.tsx b/apps/mobile/src/screens/HomeScreen/HomeScreen.tsx index c57c24a05d1..e9d87ab7df3 100644 --- a/apps/mobile/src/screens/HomeScreen/HomeScreen.tsx +++ b/apps/mobile/src/screens/HomeScreen/HomeScreen.tsx @@ -2,6 +2,7 @@ import { useApolloClient } from '@apollo/client' import { useIsFocused, useScrollToTop } from '@react-navigation/native' import { SharedQueryClient } from '@universe/api' +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import { useCallback, useEffect, useMemo, useRef, useState } from 'react' import { Freeze } from 'react-freeze' import { useTranslation } from 'react-i18next' @@ -52,8 +53,6 @@ import { NFTS_TAB_DATA_DEPENDENCIES } from 'uniswap/src/components/nfts/constant import { getPortfolioQuery } from 'uniswap/src/data/rest/getPortfolio' import { getListTransactionsQuery } from 'uniswap/src/data/rest/listTransactions' import { AccountType } from 'uniswap/src/features/accounts/types' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' import { useSelectAddressHasNotifications } from 'uniswap/src/features/notifications/slice/hooks' import { setNotificationStatus } from 'uniswap/src/features/notifications/slice/slice' import { PortfolioBalance } from 'uniswap/src/features/portfolio/PortfolioBalance/PortfolioBalance' diff --git a/apps/mobile/src/screens/HomeScreen/HomeScreenQuickActions.tsx b/apps/mobile/src/screens/HomeScreen/HomeScreenQuickActions.tsx index 30cf4f84917..44b5ac900e0 100644 --- a/apps/mobile/src/screens/HomeScreen/HomeScreenQuickActions.tsx +++ b/apps/mobile/src/screens/HomeScreen/HomeScreenQuickActions.tsx @@ -1,3 +1,4 @@ +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import React, { useCallback, useMemo } from 'react' import { useTranslation } from 'react-i18next' import { FlatList, ListRenderItemInfo } from 'react-native' @@ -10,8 +11,6 @@ import { ArrowDownCircle, Bank, SendAction, SwapDotted } from 'ui/src/components import { iconSizes, spacing } from 'ui/src/theme' import { useEnabledChains } from 'uniswap/src/features/chains/hooks/useEnabledChains' import { useHighestBalanceNativeCurrencyId } from 'uniswap/src/features/dataApi/balances/balances' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' import { useHapticFeedback } from 'uniswap/src/features/settings/useHapticFeedback/useHapticFeedback' import { ElementName, MobileEventName, ModalName } from 'uniswap/src/features/telemetry/constants' import { Trace } from 'uniswap/src/features/telemetry/Trace' diff --git a/apps/mobile/src/screens/Import/ImportMethodScreen.tsx b/apps/mobile/src/screens/Import/ImportMethodScreen.tsx index 572ca36bbcc..fe00d212b5d 100644 --- a/apps/mobile/src/screens/Import/ImportMethodScreen.tsx +++ b/apps/mobile/src/screens/Import/ImportMethodScreen.tsx @@ -1,4 +1,5 @@ import { NativeStackScreenProps } from '@react-navigation/native-stack' +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import React, { useState } from 'react' import { useTranslation } from 'react-i18next' import { navigate } from 'src/app/navigation/rootNavigation' @@ -17,8 +18,6 @@ import { Flex, SpinningLoader, Text, TouchableArea } from 'ui/src' import { Eye, WalletFilled } from 'ui/src/components/icons' import { useIsDarkMode } from 'ui/src/hooks/useIsDarkMode' import { iconSizes } from 'ui/src/theme' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' import { authenticateWithPasskeyForSeedPhraseExport } from 'uniswap/src/features/passkey/embeddedWallet' import { ElementName, ModalName } from 'uniswap/src/features/telemetry/constants' import Trace from 'uniswap/src/features/telemetry/Trace' diff --git a/apps/mobile/src/screens/Import/OnDeviceRecoveryScreen.tsx b/apps/mobile/src/screens/Import/OnDeviceRecoveryScreen.tsx index 95c14285751..0172fcfffc9 100644 --- a/apps/mobile/src/screens/Import/OnDeviceRecoveryScreen.tsx +++ b/apps/mobile/src/screens/Import/OnDeviceRecoveryScreen.tsx @@ -1,6 +1,7 @@ import { NativeStackScreenProps } from '@react-navigation/native-stack' import { ReactNavigationPerformanceView } from '@shopify/react-native-performance-navigation' import { SharedEventName } from '@uniswap/analytics-events' +import { DynamicConfigs, OnDeviceRecoveryConfigKey, useDynamicConfigValue } from '@universe/gating' import dayjs from 'dayjs' import React, { useCallback, useEffect, useState } from 'react' import { useTranslation } from 'react-i18next' @@ -20,8 +21,6 @@ import { iconSizes } from 'ui/src/theme' import { WarningSeverity } from 'uniswap/src/components/modals/WarningModal/types' import { WarningModal } from 'uniswap/src/components/modals/WarningModal/WarningModal' import { AccountType } from 'uniswap/src/features/accounts/types' -import { DynamicConfigs, OnDeviceRecoveryConfigKey } from 'uniswap/src/features/gating/configs' -import { useDynamicConfigValue } from 'uniswap/src/features/gating/hooks' import { Platform } from 'uniswap/src/features/platforms/types/Platform' import { ElementName, ModalName } from 'uniswap/src/features/telemetry/constants' import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send' diff --git a/apps/mobile/src/screens/Import/RestoreMethodScreen.tsx b/apps/mobile/src/screens/Import/RestoreMethodScreen.tsx index 994f0ce214b..d4b12c53b99 100644 --- a/apps/mobile/src/screens/Import/RestoreMethodScreen.tsx +++ b/apps/mobile/src/screens/Import/RestoreMethodScreen.tsx @@ -1,4 +1,5 @@ import { NativeStackScreenProps } from '@react-navigation/native-stack' +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import React from 'react' import { useTranslation } from 'react-i18next' import { OnboardingStackParamList } from 'src/app/navigation/types' @@ -13,8 +14,6 @@ import { useNavigationHeader } from 'src/utils/useNavigationHeader' import { Flex, Text, TouchableArea } from 'ui/src' import { WalletFilled } from 'ui/src/components/icons' import { useIsDarkMode } from 'ui/src/hooks/useIsDarkMode' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' import { ElementName, ModalName } from 'uniswap/src/features/telemetry/constants' import Trace from 'uniswap/src/features/telemetry/Trace' import { TestID } from 'uniswap/src/test/fixtures/testIDs' diff --git a/apps/mobile/src/screens/Import/SelectWalletScreen.tsx b/apps/mobile/src/screens/Import/SelectWalletScreen.tsx index 8e0f065ad69..a661b53a19c 100644 --- a/apps/mobile/src/screens/Import/SelectWalletScreen.tsx +++ b/apps/mobile/src/screens/Import/SelectWalletScreen.tsx @@ -1,4 +1,5 @@ import { NativeStackScreenProps } from '@react-navigation/native-stack' +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import React, { ComponentProps, useCallback } from 'react' import { Trans, useTranslation } from 'react-i18next' import { ScrollView } from 'react-native' @@ -10,8 +11,6 @@ import { Button, Flex, Loader, Text, TouchableArea, useLayoutAnimationOnChange } import { WalletFilled } from 'ui/src/components/icons' import { spacing } from 'ui/src/theme' import { BaseCard } from 'uniswap/src/components/BaseCard/BaseCard' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' import { ElementName, ModalName } from 'uniswap/src/features/telemetry/constants' import Trace from 'uniswap/src/features/telemetry/Trace' import { TestID } from 'uniswap/src/test/fixtures/testIDs' diff --git a/apps/mobile/src/screens/Onboarding/LandingScreen.tsx b/apps/mobile/src/screens/Onboarding/LandingScreen.tsx index e18fd5f0ac5..d4871955da3 100644 --- a/apps/mobile/src/screens/Onboarding/LandingScreen.tsx +++ b/apps/mobile/src/screens/Onboarding/LandingScreen.tsx @@ -1,5 +1,6 @@ import { NativeStackScreenProps } from '@react-navigation/native-stack' import { ReactNavigationPerformanceView } from '@shopify/react-native-performance-navigation' +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import React, { useCallback, useEffect } from 'react' import { useTranslation } from 'react-i18next' import { useAnimatedStyle, useSharedValue, withDelay, withTiming } from 'react-native-reanimated' @@ -12,8 +13,6 @@ import { TermsOfService } from 'src/screens/Onboarding/TermsOfService' import { Button, Flex, Text, TouchableArea } from 'ui/src' import { AnimatedFlex } from 'ui/src/components/layout/AnimatedFlex' import { useEnabledChains } from 'uniswap/src/features/chains/hooks/useEnabledChains' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' import { setIsTestnetModeEnabled } from 'uniswap/src/features/settings/slice' import { ElementName, ModalName } from 'uniswap/src/features/telemetry/constants' import Trace from 'uniswap/src/features/telemetry/Trace' @@ -40,7 +39,7 @@ export function LandingScreen({ navigation }: Props): JSX.Element { useEffect(() => { // disables looping animation during e2e tests which was preventing js thread from idle actionButtonsOpacity.value = withDelay(LANDING_ANIMATION_DURATION, withTiming(1, { duration: ONE_SECOND_MS })) - }, [actionButtonsOpacity]) + }, []) // Disables testnet mode on mount if enabled (eg upon removing a wallet) useEffect(() => { diff --git a/apps/mobile/src/screens/SettingsScreen.tsx b/apps/mobile/src/screens/SettingsScreen.tsx index 87db6bed817..8f4d3e83b9c 100644 --- a/apps/mobile/src/screens/SettingsScreen.tsx +++ b/apps/mobile/src/screens/SettingsScreen.tsx @@ -1,4 +1,5 @@ import { useNavigation } from '@react-navigation/core' +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import { default as React, useCallback, useMemo } from 'react' import { useTranslation } from 'react-i18next' import { ListRenderItemInfo } from 'react-native' @@ -56,8 +57,6 @@ import { iconSizes } from 'ui/src/theme' import { uniswapUrls } from 'uniswap/src/constants/urls' import { useEnabledChains } from 'uniswap/src/features/chains/hooks/useEnabledChains' import { useAppFiatCurrencyInfo } from 'uniswap/src/features/fiatCurrency/hooks' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' import { useCurrentLanguageInfo } from 'uniswap/src/features/language/hooks' import { setIsTestnetModeEnabled } from 'uniswap/src/features/settings/slice' import { useHapticFeedback } from 'uniswap/src/features/settings/useHapticFeedback/useHapticFeedback' diff --git a/apps/mobile/src/screens/TokenDetailsScreen.tsx b/apps/mobile/src/screens/TokenDetailsScreen.tsx index 37413162e96..83a20f7ec10 100644 --- a/apps/mobile/src/screens/TokenDetailsScreen.tsx +++ b/apps/mobile/src/screens/TokenDetailsScreen.tsx @@ -25,7 +25,6 @@ import { Flex, Separator } from 'ui/src' import { ArrowDownCircle, ArrowUpCircle, Bank, SendRoundedAirplane } from 'ui/src/components/icons' import { AnimatedFlex } from 'ui/src/components/layout/AnimatedFlex' import { BaseCard } from 'uniswap/src/components/BaseCard/BaseCard' -import { getBridgedAsset } from 'uniswap/src/components/BridgedAsset/utils' import type { MenuOptionItem } from 'uniswap/src/components/menus/ContextMenuV2' import { PollingInterval } from 'uniswap/src/constants/misc' import { useCrossChainBalances } from 'uniswap/src/data/balances/hooks/useCrossChainBalances' @@ -296,7 +295,7 @@ const TokenDetailsActionButtonsWrapper = memo(function _TokenDetailsActionButton }, 300) // delay is needed to prevent menu from not closing properly }, [currencyInfo]) - const bridgedAsset = getBridgedAsset(currencyInfo) + const bridgedWithdrawalInfo = currencyInfo?.bridgedWithdrawalInfo const isScreenNavigationReady = useIsScreenNavigationReady({ navigation }) @@ -320,12 +319,12 @@ const TokenDetailsActionButtonsWrapper = memo(function _TokenDetailsActionButton actions.push({ label: t('common.button.buy'), Icon: Bank, onPress: () => onPressBuyFiatOnRamp() }) } - if (!!bridgedAsset && hasTokenBalance) { + if (bridgedWithdrawalInfo && hasTokenBalance) { actions.push({ label: t('common.withdraw'), Icon: ArrowUpCircle, onPress: () => onPressWithdraw(), - subheader: t('bridgedAsset.wormhole.toNativeChain', { nativeChainName: bridgedAsset.nativeChain }), + subheader: t('bridgedAsset.wormhole.toNativeChain', { nativeChainName: bridgedWithdrawalInfo.chain }), actionType: 'external-link', height: 56, }) @@ -346,7 +345,7 @@ const TokenDetailsActionButtonsWrapper = memo(function _TokenDetailsActionButton }, [ fiatOnRampCurrency, t, - bridgedAsset, + bridgedWithdrawalInfo, hasTokenBalance, onPressWithdraw, onPressSend, diff --git a/apps/mobile/src/screens/ViewPrivateKeys/ViewPrivateKeysScreen.tsx b/apps/mobile/src/screens/ViewPrivateKeys/ViewPrivateKeysScreen.tsx index 618d1ae0c4d..5d5bf6a3765 100644 --- a/apps/mobile/src/screens/ViewPrivateKeys/ViewPrivateKeysScreen.tsx +++ b/apps/mobile/src/screens/ViewPrivateKeys/ViewPrivateKeysScreen.tsx @@ -1,5 +1,6 @@ import { CommonActions } from '@react-navigation/core' import { NativeStackScreenProps } from '@react-navigation/native-stack' +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import React, { useCallback, useEffect, useState } from 'react' import { useTranslation } from 'react-i18next' import { ScrollView } from 'react-native-gesture-handler' @@ -17,8 +18,6 @@ import { AlertTriangleFilled } from 'ui/src/components/icons/AlertTriangleFilled import { HiddenWordView } from 'ui/src/components/placeholders/HiddenWordView' import { AddressDisplay } from 'uniswap/src/components/accounts/AddressDisplay' import { Modal } from 'uniswap/src/components/modals/Modal' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' import { ElementName, ModalName } from 'uniswap/src/features/telemetry/constants' import { Trace } from 'uniswap/src/features/telemetry/Trace' import { TestID } from 'uniswap/src/test/fixtures/testIDs' diff --git a/apps/mobile/tsconfig.json b/apps/mobile/tsconfig.json index 0f4eef55ad2..94f3a6d681f 100644 --- a/apps/mobile/tsconfig.json +++ b/apps/mobile/tsconfig.json @@ -15,6 +15,9 @@ }, { "path": "../../packages/api" + }, + { + "path": "../../packages/gating" } ], "compilerOptions": { diff --git a/apps/web/.eslintrc.js b/apps/web/.eslintrc.js index 331eff80908..3f9abcfcb2b 100644 --- a/apps/web/.eslintrc.js +++ b/apps/web/.eslintrc.js @@ -21,6 +21,32 @@ module.exports = { }, overrides: [ + { + // Portfolio pages must not use useAccount directly. Use usePortfolioAddress (or a domain-specific hook) instead. + files: ['src/pages/Portfolio/*.{ts,tsx}', 'src/pages/Portfolio/**/*.{ts,tsx}'], + rules: { + 'no-restricted-imports': [ + 'error', + { + paths: [ + { + name: 'hooks/useAccount', + message: + "Do not import 'useAccount' in portfolio pages. Use 'pages/Portfolio/hooks/usePortfolioAddress' (or a domain-specific hook) instead.", + }, + ], + }, + ], + 'no-restricted-syntax': [ + 'error', + { + selector: 'CallExpression[callee.name="useAccount"]', + message: + "Do not call 'useAccount' in portfolio pages. Use 'pages/Portfolio/hooks/usePortfolioAddress' (or a domain-specific hook) instead.", + }, + ], + }, + }, { files: [ 'src/index.tsx', diff --git a/apps/web/package.json b/apps/web/package.json index 6cd0ce8266c..b06f96e8d51 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -187,8 +187,8 @@ "@types/react-scroll-sync": "0.9.0", "@uniswap/analytics": "1.7.2", "@uniswap/analytics-events": "2.43.0", + "@uniswap/client-data-api": "0.0.18", "@uniswap/client-explore": "0.0.17", - "@uniswap/client-pools": "0.0.17", "@uniswap/merkle-distributor": "1.0.1", "@uniswap/permit2-sdk": "1.3.0", "@uniswap/router-sdk": "2.0.2", @@ -203,6 +203,7 @@ "@uniswap/v3-sdk": "3.25.2", "@uniswap/v4-sdk": "1.21.2", "@universe/api": "workspace:^", + "@universe/gating": "workspace:^", "@visx/group": "2.17.0", "@visx/responsive": "3.12.0", "@visx/shape": "2.18.0", diff --git a/apps/web/project.json b/apps/web/project.json index 9d2524a729b..a49be623dc7 100644 --- a/apps/web/project.json +++ b/apps/web/project.json @@ -19,7 +19,7 @@ "command": "nx playwright:test web", "cwd": "{projectRoot}" }, - "dependsOn": ["anvil:base", "preview", "wait-for-webserver"] + "dependsOn": ["anvil:mainnet", "preview", "wait-for-webserver"] }, "e2e:anvil": { "executor": "nx:run-commands", @@ -27,7 +27,7 @@ "command": "nx playwright:test:anvil web", "cwd": "{projectRoot}" }, - "dependsOn": ["anvil:base", "preview", "wait-for-webserver"] + "dependsOn": ["anvil:mainnet", "preview", "wait-for-webserver"] }, "e2e:no-anvil": { "executor": "nx:run-commands", diff --git a/apps/web/public/images/portfolio_page_promo/dark.png b/apps/web/public/images/portfolio_page_promo/dark.png new file mode 100644 index 0000000000000000000000000000000000000000..910c183e24deb9b43730d54843d9036769a12733 GIT binary patch literal 232460 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%0APxrg1&5$NyZKw4;**he-L2uztDq8}u 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 literal 0 HcmV?d00001 diff --git a/apps/web/public/images/portfolio_page_promo/light.png b/apps/web/public/images/portfolio_page_promo/light.png new file mode 100644 index 0000000000000000000000000000000000000000..0387c71c436244e8e3b8aa406dc0345e9dd3c1c4 GIT binary patch literal 279063 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

H0!@vNK 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�smaIsoI)3 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 HedGSW=zn+i literal 0 HcmV?d00001 diff --git a/apps/web/public/pools-sitemap.xml b/apps/web/public/pools-sitemap.xml index 08339144e0f..03d6f39b07c 100644 --- a/apps/web/public/pools-sitemap.xml +++ b/apps/web/public/pools-sitemap.xml @@ -13130,4 +13130,24 @@ 2025-10-17T22:04:33.647Z 0.8 + + https://app.uniswap.org/explore/pools/ethereum/0xa3ccaf08a54cf31649f91ae1570a0720c8d4eb1e + 2025-10-24T19:06:27.459Z + 0.8 + + + https://app.uniswap.org/explore/pools/arbitrum/0xd13040d4fe917ee704158cfcb3338dcd2838b245 + 2025-10-24T19:06:27.459Z + 0.8 + + + https://app.uniswap.org/explore/pools/bnb/0x75c5fbf77c1cd517544487aca4cc41e1ad95aced + 2025-10-24T19:06:27.459Z + 0.8 + + + https://app.uniswap.org/explore/pools/bnb/0x8c5a402ede3a33998604c8ba5fe6510896cb3821 + 2025-10-24T19:06:27.459Z + 0.8 + \ No newline at end of file diff --git a/apps/web/public/tokens-sitemap.xml b/apps/web/public/tokens-sitemap.xml index a865ac527e2..cc16efb4f28 100644 --- a/apps/web/public/tokens-sitemap.xml +++ b/apps/web/public/tokens-sitemap.xml @@ -11115,4 +11115,94 @@ 2025-10-17T22:04:33.647Z 0.8 + + https://app.uniswap.org/explore/tokens/solana/METvsvVRapdj9cFLzq4Tr43xK4tAjQfwX76z3n6mWQL + 2025-10-24T19:06:27.459Z + 0.8 + + + https://app.uniswap.org/explore/tokens/solana/Dfh5DzRgSvvCFDoYc2ciTkMrbDfRKybA4SoFbPmApump + 2025-10-24T19:06:27.459Z + 0.8 + + + https://app.uniswap.org/explore/tokens/base/0x815269d17c10f0f3df7249370e0c1b9efe781aa8 + 2025-10-24T19:06:27.459Z + 0.8 + + + https://app.uniswap.org/explore/tokens/solana/SarosY6Vscao718M4A778z4CGtvcwcGef5M9MEH1LGL + 2025-10-24T19:06:27.459Z + 0.8 + + + https://app.uniswap.org/explore/tokens/base/0x93d6afa0e6f11f4f7e9521ec6243f839526af7a6 + 2025-10-24T19:06:27.459Z + 0.8 + + + https://app.uniswap.org/explore/tokens/bnb/0x4c9027e10c5271efca82379d3123917ae3f2374e + 2025-10-24T19:06:27.459Z + 0.8 + + + https://app.uniswap.org/explore/tokens/solana/USDSwr9ApdHk5bvJKMjzff41FfuX8bSxdKcR81vTwcA + 2025-10-24T19:06:27.459Z + 0.8 + + + https://app.uniswap.org/explore/tokens/solana/SW1TCHLmRGTfW5xZknqQdpdarB8PD95sJYWpNp9TbFx + 2025-10-24T19:06:27.459Z + 0.8 + + + https://app.uniswap.org/explore/tokens/solana/3wPQhXYqy861Nhoc4bahtpf7G3e89XCLfZ67ptEfZUSA + 2025-10-24T19:06:27.459Z + 0.8 + + + https://app.uniswap.org/explore/tokens/base/0xdcaa5e062b2be18e52ea6ed7ba232538621ddc10 + 2025-10-24T19:06:27.459Z + 0.8 + + + https://app.uniswap.org/explore/tokens/solana/METAwkXcqyXKy1AtsSgJ8JiUHwGCafnZL38n3vYmeta + 2025-10-24T19:06:27.459Z + 0.8 + + + https://app.uniswap.org/explore/tokens/solana/oreoU2P8bN6jkk3jbaiVxYnG1dCXcYxwhwyK9jSybcp + 2025-10-24T19:06:27.459Z + 0.8 + + + https://app.uniswap.org/explore/tokens/solana/6nR8wBnfsmXfcdDr1hovJKjvFQxNSidN6XFyfAFZpump + 2025-10-24T19:06:27.459Z + 0.8 + + + https://app.uniswap.org/explore/tokens/solana/AjPzK6Sf1G27jFkFe4HViSNqMxa3JLE4D1fm6Pzouq2q + 2025-10-24T19:06:27.459Z + 0.8 + + + https://app.uniswap.org/explore/tokens/bnb/0x0a8d6c86e1bce73fe4d0bd531e1a567306836ea5 + 2025-10-24T19:06:27.459Z + 0.8 + + + https://app.uniswap.org/explore/tokens/solana/JUPyiwrYJFskUPiHa7hkeR8VUtAeFoSYbKedZNsDvCN + 2025-10-24T19:06:27.459Z + 0.8 + + + https://app.uniswap.org/explore/tokens/solana/pSo1f9nQXWgXibFtKf7NWYxb5enAM4qfP6UJSiXRQfL + 2025-10-24T19:06:27.459Z + 0.8 + + + https://app.uniswap.org/explore/tokens/ethereum/0xf245964bd0a73128e10c4f7c96d0664ea2e436d8 + 2025-10-24T19:06:27.459Z + 0.8 + \ No newline at end of file diff --git a/apps/web/src/appGraphql/data/util.tsx b/apps/web/src/appGraphql/data/util.tsx index 18e459e39c1..a7ffb3e9d86 100644 --- a/apps/web/src/appGraphql/data/util.tsx +++ b/apps/web/src/appGraphql/data/util.tsx @@ -189,6 +189,12 @@ const PROTOCOL_META: { [source in GraphQLApi.PriceSource]: ProtocolMeta } = { color: '$chain_137', gradient: { start: 'rgba(96, 123, 238, 0.20)', end: 'rgba(55, 70, 136, 0.00)' }, }, + [GraphQLApi.PriceSource.External]: { + // TODO (LP-350): Remove this since this protocol chart does not exist anymore + name: 'external', + color: '$neutral1', + gradient: { start: 'rgba(252, 116, 254, 0.20)', end: 'rgba(252, 116, 254, 0.00)' }, + }, /* [GraphQLApi.PriceSource.UniswapX]: { name: 'UniswapX', color: purple } */ } diff --git a/apps/web/src/assets/images/portfolio-page-promo/dark.svg b/apps/web/src/assets/images/portfolio-page-promo/dark.svg new file mode 100644 index 00000000000..1ae6e3cb76e --- /dev/null +++ b/apps/web/src/assets/images/portfolio-page-promo/dark.svg @@ -0,0 +1,778 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/web/src/assets/images/portfolio-page-promo/light.svg b/apps/web/src/assets/images/portfolio-page-promo/light.svg new file mode 100644 index 00000000000..8e9c0579fe4 --- /dev/null +++ b/apps/web/src/assets/images/portfolio-page-promo/light.svg @@ -0,0 +1,778 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/web/src/assets/svg/Emblem/A.svg b/apps/web/src/assets/svg/Emblem/A.svg new file mode 100644 index 00000000000..46c5ecdf931 --- /dev/null +++ b/apps/web/src/assets/svg/Emblem/A.svg @@ -0,0 +1,4 @@ + + + + diff --git a/apps/web/src/assets/svg/Emblem/B.svg b/apps/web/src/assets/svg/Emblem/B.svg new file mode 100644 index 00000000000..9ba0cad2077 --- /dev/null +++ b/apps/web/src/assets/svg/Emblem/B.svg @@ -0,0 +1,3 @@ + + + diff --git a/apps/web/src/assets/svg/Emblem/C.svg b/apps/web/src/assets/svg/Emblem/C.svg new file mode 100644 index 00000000000..df525ee3977 --- /dev/null +++ b/apps/web/src/assets/svg/Emblem/C.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/apps/web/src/assets/svg/Emblem/D.svg b/apps/web/src/assets/svg/Emblem/D.svg new file mode 100644 index 00000000000..6673c60e7b6 --- /dev/null +++ b/apps/web/src/assets/svg/Emblem/D.svg @@ -0,0 +1,4 @@ + + + + diff --git a/apps/web/src/assets/svg/Emblem/E.svg b/apps/web/src/assets/svg/Emblem/E.svg new file mode 100644 index 00000000000..f1d262aa1fd --- /dev/null +++ b/apps/web/src/assets/svg/Emblem/E.svg @@ -0,0 +1,3 @@ + + + diff --git a/apps/web/src/assets/svg/Emblem/F.svg b/apps/web/src/assets/svg/Emblem/F.svg new file mode 100644 index 00000000000..f7f9944dbfa --- /dev/null +++ b/apps/web/src/assets/svg/Emblem/F.svg @@ -0,0 +1,3 @@ + + + diff --git a/apps/web/src/assets/svg/Emblem/G.svg b/apps/web/src/assets/svg/Emblem/G.svg new file mode 100644 index 00000000000..44e41f65357 --- /dev/null +++ b/apps/web/src/assets/svg/Emblem/G.svg @@ -0,0 +1,3 @@ + + + diff --git a/apps/web/src/assets/svg/Emblem/default.svg b/apps/web/src/assets/svg/Emblem/default.svg new file mode 100644 index 00000000000..1839d363511 --- /dev/null +++ b/apps/web/src/assets/svg/Emblem/default.svg @@ -0,0 +1,3 @@ + + + diff --git a/apps/web/src/components/AccountDrawer/AuthenticatedHeader.tsx b/apps/web/src/components/AccountDrawer/AuthenticatedHeader.tsx index 638bf5898ad..72bdd2ef2ee 100644 --- a/apps/web/src/components/AccountDrawer/AuthenticatedHeader.tsx +++ b/apps/web/src/components/AccountDrawer/AuthenticatedHeader.tsx @@ -1,5 +1,6 @@ import { NetworkStatus } from '@apollo/client' import { CurrencyAmount, Token } from '@uniswap/sdk-core' +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import { MultiBlockchainAddressDisplay } from 'components/AccountDetails/MultiBlockchainAddressDisplay' import { ActionTile } from 'components/AccountDrawer/ActionTile' import { DisconnectButton } from 'components/AccountDrawer/DisconnectButton' @@ -38,8 +39,6 @@ import { UniverseChainId } from 'uniswap/src/features/chains/types' import { usePortfolioTotalValue } from 'uniswap/src/features/dataApi/balances/balancesRest' import { FiatCurrency } from 'uniswap/src/features/fiatCurrency/constants' import { useAppFiatCurrency, useAppFiatCurrencyInfo } from 'uniswap/src/features/fiatCurrency/hooks' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' import { useLocalizationContext } from 'uniswap/src/features/language/LocalizationContext' import { Platform } from 'uniswap/src/features/platforms/types/Platform' import { useHasAccountMismatchOnAnyChain } from 'uniswap/src/features/smartWallet/mismatch/hooks' diff --git a/apps/web/src/components/AccountDrawer/DisconnectButton.tsx b/apps/web/src/components/AccountDrawer/DisconnectButton.tsx index 4cd815d1f91..0e23c16c916 100644 --- a/apps/web/src/components/AccountDrawer/DisconnectButton.tsx +++ b/apps/web/src/components/AccountDrawer/DisconnectButton.tsx @@ -1,3 +1,4 @@ +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import { useAccountDrawer } from 'components/AccountDrawer/MiniPortfolio/hooks' import { MenuStateVariant, useSetMenu } from 'components/AccountDrawer/menuState' import { Power } from 'components/Icons/Power' @@ -14,8 +15,6 @@ import { PlusCircle } from 'ui/src/components/icons/PlusCircle' import { SwitchArrows } from 'ui/src/components/icons/SwitchArrows' import { AppTFunction } from 'ui/src/i18n/types' import { CONNECTION_PROVIDER_IDS } from 'uniswap/src/constants/web3' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' import { Platform } from 'uniswap/src/features/platforms/types/Platform' import { setIsTestnetModeEnabled } from 'uniswap/src/features/settings/slice' import { ElementName } from 'uniswap/src/features/telemetry/constants' diff --git a/apps/web/src/components/AccountDrawer/MiniPortfolio/Activity/ActivityTab.anvil.e2e.test.ts b/apps/web/src/components/AccountDrawer/MiniPortfolio/Activity/ActivityTab.anvil.e2e.test.ts index 413b3f15890..432c2f5f253 100644 --- a/apps/web/src/components/AccountDrawer/MiniPortfolio/Activity/ActivityTab.anvil.e2e.test.ts +++ b/apps/web/src/components/AccountDrawer/MiniPortfolio/Activity/ActivityTab.anvil.e2e.test.ts @@ -19,6 +19,7 @@ test.describe('ActivityTab activity history', () => { }) await stubTradingApiEndpoint({ page, endpoint: uniswapUrls.tradingApiPaths.swap }) + await stubTradingApiEndpoint({ page, endpoint: uniswapUrls.tradingApiPaths.quote }) await graphql.intercept('ActivityWeb', Mocks.Account.activity_history) await page.goto(`/swap?inputCurrency=ETH&outputCurrency=${USDC_MAINNET.address}`) diff --git a/apps/web/src/components/AccountDrawer/MiniPortfolio/ExtensionDeeplinks.tsx b/apps/web/src/components/AccountDrawer/MiniPortfolio/ExtensionDeeplinks.tsx index f163e30df46..34d31b6c4dc 100644 --- a/apps/web/src/components/AccountDrawer/MiniPortfolio/ExtensionDeeplinks.tsx +++ b/apps/web/src/components/AccountDrawer/MiniPortfolio/ExtensionDeeplinks.tsx @@ -1,4 +1,4 @@ -import { PositionStatus } from '@uniswap/client-pools/dist/pools/v1/types_pb' +import { PositionStatus } from '@uniswap/client-data-api/dist/data/v1/poolTypes_pb' import { useOpenLimitOrders, usePendingActivity } from 'components/AccountDrawer/MiniPortfolio/Activity/hooks' import { useAccountDrawer } from 'components/AccountDrawer/MiniPortfolio/hooks' import { MenuStateVariant, useSetMenu } from 'components/AccountDrawer/menuState' diff --git a/apps/web/src/components/AccountDrawer/MiniPortfolio/Pools/PoolsTab.tsx b/apps/web/src/components/AccountDrawer/MiniPortfolio/Pools/PoolsTab.tsx index d4bb8b966c4..5dbd6c74049 100644 --- a/apps/web/src/components/AccountDrawer/MiniPortfolio/Pools/PoolsTab.tsx +++ b/apps/web/src/components/AccountDrawer/MiniPortfolio/Pools/PoolsTab.tsx @@ -1,4 +1,4 @@ -import { PositionStatus, ProtocolVersion } from '@uniswap/client-pools/dist/pools/v1/types_pb' +import { PositionStatus, ProtocolVersion } from '@uniswap/client-data-api/dist/data/v1/poolTypes_pb' import { ExpandoRow } from 'components/AccountDrawer/MiniPortfolio/ExpandoRow' import { useAccountDrawer } from 'components/AccountDrawer/MiniPortfolio/hooks' import { EmptyPools } from 'components/AccountDrawer/MiniPortfolio/Pools/EmptyPools' diff --git a/apps/web/src/components/AccountDrawer/MiniPortfolio/PortfolioRow.tsx b/apps/web/src/components/AccountDrawer/MiniPortfolio/PortfolioRow.tsx index 7c5c73a38ee..404fd569423 100644 --- a/apps/web/src/components/AccountDrawer/MiniPortfolio/PortfolioRow.tsx +++ b/apps/web/src/components/AccountDrawer/MiniPortfolio/PortfolioRow.tsx @@ -1,5 +1,5 @@ -import { LoadingBubble } from 'components/Tokens/loading' -import { Flex, FlexProps } from 'ui/src' +import { TextLoader } from 'components/Liquidity/Loader' +import { Circle, Flex, FlexProps, Shine } from 'ui/src' const PortfolioRowWrapper = ({ children, className, ...rest }: FlexProps) => ( - - - - - - - {shrinkRight ? ( - - ) : ( - <> - - - - )} + + + + + + + + + + + + + + + + + + + + + - + ) } -export function PortfolioSkeleton({ shrinkRight = false }: { shrinkRight?: boolean }) { +export function PortfolioSkeleton() { return ( - <> + {Array.from({ length: 5 }).map((_, i) => ( - + ))} - + ) } diff --git a/apps/web/src/components/ActivityTable/ActivityAddressCell.tsx b/apps/web/src/components/ActivityTable/ActivityAddressCell.tsx new file mode 100644 index 00000000000..b47c5acf5cd --- /dev/null +++ b/apps/web/src/components/ActivityTable/ActivityAddressCell.tsx @@ -0,0 +1,27 @@ +import { AddressWithAvatar } from 'components/ActivityTable/AddressWithAvatar' +import { buildActivityRowFragments } from 'components/ActivityTable/registry' +import { Flex } from 'ui/src' +import { ArrowRight } from 'ui/src/components/icons/ArrowRight' +import { TransactionDetails } from 'uniswap/src/features/transactions/types/transactionDetails' +import { getValidAddress } from 'uniswap/src/utils/addresses' + +interface ActivityAddressCellProps { + transaction: TransactionDetails +} + +export function ActivityAddressCell({ transaction }: ActivityAddressCellProps) { + const { counterparty } = buildActivityRowFragments(transaction) + + // Use counterparty from adapter if available, otherwise fall back to from address + const rawAddress = counterparty ?? transaction.from + const otherPartyAddress = rawAddress ? getValidAddress({ address: rawAddress, chainId: transaction.chainId }) : null + + return ( + + {otherPartyAddress && } + + + + + ) +} diff --git a/apps/web/src/components/ActivityTable/ActivityAmountCell.tsx b/apps/web/src/components/ActivityTable/ActivityAmountCell.tsx new file mode 100644 index 00000000000..b3cddbac36b --- /dev/null +++ b/apps/web/src/components/ActivityTable/ActivityAmountCell.tsx @@ -0,0 +1,255 @@ +import { buildActivityRowFragments } from 'components/ActivityTable/registry' +import { TokenAmountDisplay } from 'components/ActivityTable/TokenAmountDisplay' +import { useTranslation } from 'react-i18next' +import { Flex, Text } from 'ui/src' +import { ArrowRight } from 'ui/src/components/icons/ArrowRight' +import { useFormattedCurrencyAmountAndUSDValue } from 'uniswap/src/components/activity/hooks/useFormattedCurrencyAmountAndUSDValue' +import { CurrencyInfo } from 'uniswap/src/features/dataApi/types' +import { useLocalizationContext } from 'uniswap/src/features/language/LocalizationContext' +import { + useCurrencyInfo, + useNativeCurrencyInfo, + useWrappedNativeCurrencyInfo, +} from 'uniswap/src/features/tokens/useCurrencyInfo' +import { TransactionDetails } from 'uniswap/src/features/transactions/types/transactionDetails' +import { getSymbolDisplayText } from 'uniswap/src/utils/currency' +import { NumberType } from 'utilities/src/format/types' + +interface ActivityAmountCellProps { + transaction: TransactionDetails +} + +function EmptyCell() { + return ( + + — + + ) +} + +interface DualTokenLayoutProps { + inputCurrency: CurrencyInfo | null | undefined + outputCurrency: CurrencyInfo | null | undefined + inputFormattedAmount: string | null + outputFormattedAmount: string | null + inputUsdValue: string | null + outputUsdValue: string | null + separator?: React.ReactNode +} + +function Separator({ children }: { children: React.ReactNode }) { + return ( + + {typeof children === 'string' ? ( + + {children} + + ) : ( + children + )} + + ) +} + +function DualTokenLayout({ + inputCurrency, + outputCurrency, + inputFormattedAmount, + outputFormattedAmount, + inputUsdValue, + outputUsdValue, + separator = , +}: DualTokenLayoutProps) { + return ( + + + {separator} + + + ) +} + +function formatAmountWithSymbol(amount: string | undefined, symbol: string | undefined): string | null { + return amount ? `${amount}${getSymbolDisplayText(symbol)}` : null +} + +function getUsdValue(value: string | undefined): string | null { + return value !== '-' ? (value ?? null) : null +} + +export function ActivityAmountCell({ transaction }: ActivityAmountCellProps) { + const formatter = useLocalizationContext() + const { t } = useTranslation() + const { chainId } = transaction + const { amount } = buildActivityRowFragments(transaction) + + // Hook up currency info based on amount model + const inputCurrencyInfo = useCurrencyInfo(amount?.kind === 'pair' ? amount.inputCurrencyId : undefined) + const outputCurrencyInfo = useCurrencyInfo(amount?.kind === 'pair' ? amount.outputCurrencyId : undefined) + const singleCurrencyInfo = useCurrencyInfo( + amount?.kind === 'single' || amount?.kind === 'approve' ? amount.currencyId : undefined, + ) + const currency0Info = useCurrencyInfo(amount?.kind === 'liquidity-pair' ? amount.currency0Id : undefined) + const currency1Info = useCurrencyInfo(amount?.kind === 'liquidity-pair' ? amount.currency1Id : undefined) + + const nativeCurrencyInfo = useNativeCurrencyInfo(chainId) + const wrappedCurrencyInfo = useWrappedNativeCurrencyInfo(chainId) + + // Format amounts based on kind + const inputFormattedData = useFormattedCurrencyAmountAndUSDValue({ + currency: inputCurrencyInfo?.currency, + currencyAmountRaw: amount?.kind === 'pair' ? (amount.inputAmountRaw ?? '') : '', + formatter, + isApproximateAmount: false, + }) + + const outputFormattedData = useFormattedCurrencyAmountAndUSDValue({ + currency: outputCurrencyInfo?.currency, + currencyAmountRaw: amount?.kind === 'pair' ? (amount.outputAmountRaw ?? '') : '', + formatter, + isApproximateAmount: false, + }) + + const singleFormattedData = useFormattedCurrencyAmountAndUSDValue({ + currency: singleCurrencyInfo?.currency, + currencyAmountRaw: amount?.kind === 'single' ? (amount.amountRaw ?? '') : '', + formatter, + isApproximateAmount: false, + }) + + const wrapAmountRaw = amount?.kind === 'wrap' ? (amount.amountRaw ?? '') : '' + const wrapInputCurrency = amount?.kind === 'wrap' && amount.unwrapped ? wrappedCurrencyInfo : nativeCurrencyInfo + const wrapOutputCurrency = amount?.kind === 'wrap' && amount.unwrapped ? nativeCurrencyInfo : wrappedCurrencyInfo + + const wrapInputFormattedData = useFormattedCurrencyAmountAndUSDValue({ + currency: wrapInputCurrency?.currency, + currencyAmountRaw: wrapAmountRaw, + formatter, + isApproximateAmount: false, + }) + + const wrapOutputFormattedData = useFormattedCurrencyAmountAndUSDValue({ + currency: wrapOutputCurrency?.currency, + currencyAmountRaw: wrapAmountRaw, + formatter, + isApproximateAmount: false, + }) + + const currency0FormattedData = useFormattedCurrencyAmountAndUSDValue({ + currency: currency0Info?.currency, + currencyAmountRaw: amount?.kind === 'liquidity-pair' ? amount.currency0AmountRaw : '', + formatter, + isApproximateAmount: false, + }) + + const currency1FormattedData = useFormattedCurrencyAmountAndUSDValue({ + currency: currency1Info?.currency, + currencyAmountRaw: amount?.kind === 'liquidity-pair' ? (amount.currency1AmountRaw ?? '') : '', + formatter, + isApproximateAmount: false, + }) + + if (!amount) { + return + } + + // Guard against missing currency data before formatting + if (amount.kind === 'pair' && (!inputCurrencyInfo || !outputCurrencyInfo)) { + return + } + + if (amount.kind === 'liquidity-pair' && (!currency0Info || !currency1Info)) { + return + } + + switch (amount.kind) { + case 'pair': { + // Dual token layout for swaps and bridges: Token1 → Token2 + return ( + + ) + } + + case 'approve': { + // Single token layout for approvals + let formattedAmount: string | null = null + + if (singleCurrencyInfo && amount.approvalAmount !== undefined) { + const amountText = + amount.approvalAmount === 'INF' + ? t('transaction.amount.unlimited') + : amount.approvalAmount && amount.approvalAmount !== '0.0' + ? formatter.formatNumberOrString({ value: amount.approvalAmount, type: NumberType.TokenNonTx }) + : '' + + formattedAmount = `${amountText ? amountText + ' ' : ''}${getSymbolDisplayText(singleCurrencyInfo.currency.symbol) ?? ''}` + } + + return + } + + case 'wrap': { + // Dual token layout for wraps: ETH ↔ WETH + return ( + + ) + } + + case 'single': { + // Single token layout for transfers + return ( + + ) + } + + case 'liquidity-pair': { + // Dual token layout for liquidity: Token0 and Token1 + return ( + + ) + } + } +} diff --git a/apps/web/src/components/ActivityTable/ActivityTable.tsx b/apps/web/src/components/ActivityTable/ActivityTable.tsx new file mode 100644 index 00000000000..97b62e13d1d --- /dev/null +++ b/apps/web/src/components/ActivityTable/ActivityTable.tsx @@ -0,0 +1,123 @@ +import { createColumnHelper, Row } from '@tanstack/react-table' +import { ActivityAddressCell } from 'components/ActivityTable/ActivityAddressCell' +import { ActivityAmountCell } from 'components/ActivityTable/ActivityAmountCell' +import { TimeCell } from 'components/ActivityTable/TimeCell' +import { TransactionTypeCell } from 'components/ActivityTable/TransactionTypeCell' +import { Table } from 'components/Table' +import { Cell } from 'components/Table/Cell' +import { HeaderCell } from 'components/Table/styled' +import { memo, useMemo } from 'react' +import { useTranslation } from 'react-i18next' +import { Text } from 'ui/src' +import { TransactionDetails } from 'uniswap/src/features/transactions/types/transactionDetails' + +interface ActivityTableProps { + data: TransactionDetails[] + loading?: boolean + error?: boolean + rowWrapper?: (row: Row, content: JSX.Element) => JSX.Element +} + +function _ActivityTable({ data, loading = false, error = false, rowWrapper }: ActivityTableProps): JSX.Element { + const { t } = useTranslation() + const columnHelper = useMemo(() => createColumnHelper(), []) + const showLoadingSkeleton = loading || error + + const columns = useMemo( + () => [ + // Time Column + columnHelper.accessor('addedTime', { + header: () => ( + + + {t('portfolio.activity.table.column.time')} + + + ), + cell: (info) => { + if (showLoadingSkeleton) { + return + } + return ( + + + + ) + }, + }), + + // Type Column + columnHelper.accessor((row) => row.typeInfo.type, { + id: 'type', + header: () => ( + + + {t('portfolio.activity.table.column.type')} + + + ), + cell: (info) => { + if (showLoadingSkeleton) { + return + } + return ( + + + + ) + }, + }), + + // Amount Column + columnHelper.display({ + id: 'amount', + header: () => ( + + + {t('portfolio.activity.table.column.amount')} + + + ), + cell: (info) => { + if (showLoadingSkeleton) { + return + } + return ( + + + + ) + }, + minSize: 280, + size: 300, + }), + + // Address Column + columnHelper.display({ + id: 'address', + header: () => ( + + + {t('portfolio.activity.table.column.address')} + + + ), + cell: (info) => { + if (showLoadingSkeleton) { + return + } + return ( + + + + ) + }, + }), + ], + [t, columnHelper, showLoadingSkeleton], + ) + + return +} + +export const ActivityTable = memo(_ActivityTable) diff --git a/apps/web/src/components/ActivityTable/AddressWithAvatar.tsx b/apps/web/src/components/ActivityTable/AddressWithAvatar.tsx new file mode 100644 index 00000000000..4abee3d5de7 --- /dev/null +++ b/apps/web/src/components/ActivityTable/AddressWithAvatar.tsx @@ -0,0 +1,42 @@ +import { Flex, Text } from 'ui/src' +import { Unitag } from 'ui/src/components/icons/Unitag' +import { useUnitagsAddressQuery } from 'uniswap/src/data/apiClients/unitagsApi/useUnitagsAddressQuery' +import { AccountIcon } from 'uniswap/src/features/accounts/AccountIcon' +import { useENSName } from 'uniswap/src/features/ens/api' +import { shortenAddress } from 'utilities/src/addresses' + +interface AddressWithAvatarProps { + address: Address + size?: number + showAvatar?: boolean +} + +export function AddressWithAvatar({ address, size = 20, showAvatar = true }: AddressWithAvatarProps) { + const { data: ENSName } = useENSName(address) + const { data: unitag } = useUnitagsAddressQuery({ + params: address ? { address } : undefined, + }) + const uniswapUsername = unitag?.username + + const displayName = uniswapUsername ?? ENSName ?? shortenAddress({ address }) + const hasUnitag = Boolean(uniswapUsername) + + return ( + + {showAvatar && ( + + )} + + {displayName} + + {hasUnitag && } + + ) +} diff --git a/apps/web/src/components/ActivityTable/TimeCell.tsx b/apps/web/src/components/ActivityTable/TimeCell.tsx new file mode 100644 index 00000000000..f90326cfbb8 --- /dev/null +++ b/apps/web/src/components/ActivityTable/TimeCell.tsx @@ -0,0 +1,15 @@ +import { TableText } from 'components/Table/styled' +import { useFormattedTimeForActivity } from 'uniswap/src/components/activity/hooks/useFormattedTime' + +interface TimeCellProps { + timestamp: number +} + +export function TimeCell({ timestamp }: TimeCellProps) { + const formattedTime = useFormattedTimeForActivity(timestamp) + return ( + + {formattedTime} + + ) +} diff --git a/apps/web/src/components/ActivityTable/TokenAmountDisplay.tsx b/apps/web/src/components/ActivityTable/TokenAmountDisplay.tsx new file mode 100644 index 00000000000..ef04e9384bf --- /dev/null +++ b/apps/web/src/components/ActivityTable/TokenAmountDisplay.tsx @@ -0,0 +1,32 @@ +import { TableText } from 'components/Table/styled' +import { Flex } from 'ui/src' +import { CurrencyLogo } from 'uniswap/src/components/CurrencyLogo/CurrencyLogo' +import { useCurrencyInfo } from 'uniswap/src/features/tokens/useCurrencyInfo' + +interface TokenAmountDisplayProps { + currencyInfo: ReturnType + formattedAmount: string | null + usdValue: string | null +} + +export function TokenAmountDisplay({ currencyInfo, formattedAmount, usdValue }: TokenAmountDisplayProps) { + if (!currencyInfo || !formattedAmount) { + return null + } + + return ( + + + + + {formattedAmount} + + {usdValue && ( + + {usdValue} + + )} + + + ) +} diff --git a/apps/web/src/components/ActivityTable/TransactionTypeCell.tsx b/apps/web/src/components/ActivityTable/TransactionTypeCell.tsx new file mode 100644 index 00000000000..5c3f52d05e7 --- /dev/null +++ b/apps/web/src/components/ActivityTable/TransactionTypeCell.tsx @@ -0,0 +1,30 @@ +import { buildActivityRowFragments } from 'components/ActivityTable/registry' +import { TableText } from 'components/Table/styled' +import { getTransactionTypeFilterOptions } from 'pages/Portfolio/Activity/Filters/utils' +import { useTranslation } from 'react-i18next' +import { Flex } from 'ui/src' +import { TransactionDetails } from 'uniswap/src/features/transactions/types/transactionDetails' + +interface TransactionTypeCellProps { + transaction: TransactionDetails +} + +export function TransactionTypeCell({ transaction }: TransactionTypeCellProps) { + const { t } = useTranslation() + const { typeLabel } = buildActivityRowFragments(transaction) + + // Get the icon from the filter options based on base group + const transactionTypeOptions = getTransactionTypeFilterOptions(t) + const typeOption = typeLabel?.baseGroup ? transactionTypeOptions[typeLabel.baseGroup] : null + const IconComponent = typeOption?.icon + + // Use override label key if provided, otherwise use the base group label + const label = typeLabel?.overrideLabelKey ? t(typeLabel.overrideLabelKey) : (typeOption?.label ?? 'Transaction') + + return ( + + {IconComponent && } + {label} + + ) +} diff --git a/apps/web/src/components/ActivityTable/activityTableModels.ts b/apps/web/src/components/ActivityTable/activityTableModels.ts new file mode 100644 index 00000000000..f1fc9d10af1 --- /dev/null +++ b/apps/web/src/components/ActivityTable/activityTableModels.ts @@ -0,0 +1,61 @@ +/** + * Models for activity table presentation layer. + * These types describe table-ready data from transaction parsers, without formatting or i18n. + * Each adapter returns raw IDs, amounts, addresses, and translation keys. + */ + +/** + * Represents the amount/token data for different transaction types + */ +type ActivityAmountModel = + | { + kind: 'pair' + inputCurrencyId: string + outputCurrencyId: string + inputAmountRaw?: string + outputAmountRaw?: string + } + | { + kind: 'single' + currencyId?: string + amountRaw?: string + } + | { + kind: 'approve' + currencyId?: string + approvalAmount?: string | 'INF' + } + | { + kind: 'wrap' + unwrapped: boolean + amountRaw?: string + } + | { + kind: 'liquidity-pair' + currency0Id: string + currency1Id: string + currency0AmountRaw: string + currency1AmountRaw?: string + } + +/** + * Represents the type label and grouping for a transaction + */ +interface ActivityTypeLabel { + /** Base group for filtering and icon mapping */ + baseGroup: 'swaps' | 'sent' | 'received' | 'deposits' | null + /** Optional override translation key for custom labels (e.g., "Wrapped"/"Unwrapped") */ + overrideLabelKey?: string +} + +/** + * Complete row data fragments for a single transaction in the activity table + */ +export interface ActivityRowFragments { + /** Amount/token data for the transaction */ + amount?: ActivityAmountModel | null + /** Counterparty address (sender/recipient/spender) */ + counterparty?: Address | null + /** Type label and grouping information */ + typeLabel?: ActivityTypeLabel | null +} diff --git a/apps/web/src/components/ActivityTable/registry.ts b/apps/web/src/components/ActivityTable/registry.ts new file mode 100644 index 00000000000..889b6d0451a --- /dev/null +++ b/apps/web/src/components/ActivityTable/registry.ts @@ -0,0 +1,246 @@ +import { UNI_ADDRESSES } from '@uniswap/sdk-core' +import { ActivityRowFragments } from 'components/ActivityTable/activityTableModels' +import { AssetType } from 'uniswap/src/entities/assets' +import { TransactionDetails, TransactionType } from 'uniswap/src/features/transactions/types/transactionDetails' +import { getValidAddress } from 'uniswap/src/utils/addresses' +import { buildCurrencyId } from 'uniswap/src/utils/currencyId' + +/** + * Builds activity row fragments for a transaction by mapping from parsed typeInfo. + * Returns empty object for unsupported transaction types. + * + * @param details - The transaction details with parsed typeInfo + * @returns Activity row fragments containing amount, counterparty, and type label data + */ +export function buildActivityRowFragments(details: TransactionDetails): ActivityRowFragments { + const { typeInfo, chainId } = details + + switch (typeInfo.type) { + case TransactionType.Swap: + return { + amount: { + kind: 'pair', + inputCurrencyId: typeInfo.inputCurrencyId, + outputCurrencyId: typeInfo.outputCurrencyId, + inputAmountRaw: 'inputCurrencyAmountRaw' in typeInfo ? typeInfo.inputCurrencyAmountRaw : undefined, + outputAmountRaw: 'outputCurrencyAmountRaw' in typeInfo ? typeInfo.outputCurrencyAmountRaw : undefined, + }, + counterparty: null, + typeLabel: { + baseGroup: 'swaps', + overrideLabelKey: 'transaction.status.swap.success', + }, + } + + case TransactionType.Bridge: + return { + amount: { + kind: 'pair', + inputCurrencyId: typeInfo.inputCurrencyId, + outputCurrencyId: typeInfo.outputCurrencyId, + inputAmountRaw: 'inputCurrencyAmountRaw' in typeInfo ? typeInfo.inputCurrencyAmountRaw : undefined, + outputAmountRaw: 'outputCurrencyAmountRaw' in typeInfo ? typeInfo.outputCurrencyAmountRaw : undefined, + }, + counterparty: null, + typeLabel: { + baseGroup: 'swaps', + }, + } + + case TransactionType.Send: { + const currencyId = + typeInfo.assetType === AssetType.Currency ? buildCurrencyId(chainId, typeInfo.tokenAddress) : undefined + + return { + amount: { + kind: 'single', + currencyId, + amountRaw: typeInfo.currencyAmountRaw, + }, + counterparty: typeInfo.recipient ? getValidAddress({ address: typeInfo.recipient, chainId }) : null, + typeLabel: { + baseGroup: 'sent', + }, + } + } + + case TransactionType.Receive: { + const currencyId = + typeInfo.assetType === AssetType.Currency ? buildCurrencyId(chainId, typeInfo.tokenAddress) : undefined + + return { + amount: { + kind: 'single', + currencyId, + amountRaw: typeInfo.currencyAmountRaw, + }, + counterparty: typeInfo.sender ? getValidAddress({ address: typeInfo.sender, chainId }) : null, + typeLabel: { + baseGroup: 'received', + }, + } + } + + case TransactionType.Approve: { + const currencyId = buildCurrencyId(chainId, typeInfo.tokenAddress) + + return { + amount: { + kind: 'approve', + currencyId, + approvalAmount: typeInfo.approvalAmount, + }, + counterparty: typeInfo.spender ? getValidAddress({ address: typeInfo.spender, chainId }) : null, + typeLabel: { + baseGroup: null, + overrideLabelKey: 'common.approved', + }, + } + } + + case TransactionType.Wrap: + return { + amount: { + kind: 'wrap', + unwrapped: typeInfo.unwrapped, + amountRaw: typeInfo.currencyAmountRaw, + }, + counterparty: null, + typeLabel: { + baseGroup: 'swaps', + overrideLabelKey: typeInfo.unwrapped ? 'common.unwrapped' : 'common.wrapped', + }, + } + + case TransactionType.CreatePool: + case TransactionType.CreatePair: + return { + amount: { + kind: 'liquidity-pair', + currency0Id: typeInfo.currency0Id, + currency1Id: typeInfo.currency1Id, + currency0AmountRaw: typeInfo.currency0AmountRaw, + currency1AmountRaw: typeInfo.currency1AmountRaw, + }, + counterparty: typeInfo.dappInfo?.address + ? getValidAddress({ address: typeInfo.dappInfo.address, chainId }) + : null, + typeLabel: { + baseGroup: null, + overrideLabelKey: 'pool.create', + }, + } + + case TransactionType.LiquidityIncrease: + return { + amount: { + kind: 'liquidity-pair', + currency0Id: typeInfo.currency0Id, + currency1Id: typeInfo.currency1Id, + currency0AmountRaw: typeInfo.currency0AmountRaw, + currency1AmountRaw: typeInfo.currency1AmountRaw, + }, + counterparty: typeInfo.dappInfo?.address + ? getValidAddress({ address: typeInfo.dappInfo.address, chainId }) + : null, + typeLabel: { + baseGroup: 'deposits', + overrideLabelKey: 'common.addLiquidity', + }, + } + + case TransactionType.LiquidityDecrease: + return { + amount: { + kind: 'liquidity-pair', + currency0Id: typeInfo.currency0Id, + currency1Id: typeInfo.currency1Id, + currency0AmountRaw: typeInfo.currency0AmountRaw, + currency1AmountRaw: typeInfo.currency1AmountRaw, + }, + counterparty: typeInfo.dappInfo?.address + ? getValidAddress({ address: typeInfo.dappInfo.address, chainId }) + : null, + typeLabel: { + baseGroup: null, + overrideLabelKey: 'pool.removeLiquidity', + }, + } + + case TransactionType.NFTMint: { + const currencyId = typeInfo.purchaseCurrencyId + return { + amount: { + kind: 'single', + currencyId, + amountRaw: typeInfo.purchaseCurrencyAmountRaw, + }, + counterparty: typeInfo.dappInfo?.address + ? getValidAddress({ address: typeInfo.dappInfo.address, chainId }) + : null, + typeLabel: { + baseGroup: null, + overrideLabelKey: 'transaction.status.mint.success', + }, + } + } + + case TransactionType.CollectFees: + return { + amount: typeInfo.currency1Id + ? { + kind: 'liquidity-pair', + currency0Id: typeInfo.currency0Id, + currency1Id: typeInfo.currency1Id, + currency0AmountRaw: typeInfo.currency0AmountRaw, + currency1AmountRaw: typeInfo.currency1AmountRaw, + } + : { + kind: 'single', + currencyId: typeInfo.currency0Id, + amountRaw: typeInfo.currency0AmountRaw, + }, + counterparty: null, + typeLabel: { + baseGroup: null, + overrideLabelKey: 'transaction.status.collected.fees', + }, + } + + case TransactionType.LPIncentivesClaimRewards: { + const currencyId = buildCurrencyId(chainId, typeInfo.tokenAddress) + return { + amount: { + kind: 'single', + currencyId, + amountRaw: undefined, + }, + counterparty: null, + typeLabel: { + baseGroup: null, + overrideLabelKey: 'transaction.status.collected.fees', + }, + } + } + + case TransactionType.ClaimUni: { + const tokenAddress = UNI_ADDRESSES[chainId] + const currencyId = tokenAddress ? buildCurrencyId(chainId, tokenAddress) : undefined + return { + amount: { + kind: 'single', + currencyId, + amountRaw: typeInfo.uniAmountRaw, + }, + counterparty: getValidAddress({ address: typeInfo.recipient, chainId }), + typeLabel: { + baseGroup: null, + overrideLabelKey: 'common.claimed', + }, + } + } + + default: + return {} + } +} diff --git a/apps/web/src/components/Banner/BridgingPopularTokens/BridgingPopularTokensBanner.tsx b/apps/web/src/components/Banner/BridgingPopularTokens/BridgingPopularTokensBanner.tsx new file mode 100644 index 00000000000..2957dd9ef47 --- /dev/null +++ b/apps/web/src/components/Banner/BridgingPopularTokens/BridgingPopularTokensBanner.tsx @@ -0,0 +1,108 @@ +import { SharedEventName } from '@uniswap/analytics-events' +import { useCallback } from 'react' +import { useTranslation } from 'react-i18next' +import { useNavigate } from 'react-router' +import { useAppDispatch } from 'state/hooks' +import { Flex, IconButton, Image, styled, Text, TouchableArea } from 'ui/src' +import { BRIDGED_ASSETS_V2_WEB_BANNER } from 'ui/src/assets' +import { X } from 'ui/src/components/icons/X' +import { useUniswapContext } from 'uniswap/src/contexts/UniswapContext' +import { setHasDismissedBridgedAssetsBannerV2 } from 'uniswap/src/features/behaviorHistory/slice' +import { UniverseChainId } from 'uniswap/src/features/chains/types' +import { ElementName } from 'uniswap/src/features/telemetry/constants' +import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send' +import { Trace } from 'uniswap/src/features/telemetry/Trace' + +const BRIDGING_POPULAR_TOKENS_BANNER_HEIGHT = 152 +const GRADIENT_BACKGROUND_HEIGHT = 64 +const BANNER_PADDING = 16 + +const BannerContainer = styled(TouchableArea, { + borderRadius: '$rounded16', + width: 260, + height: BRIDGING_POPULAR_TOKENS_BANNER_HEIGHT, + shadowColor: '$shadowColor', + shadowOffset: { width: 0, height: 4 }, + shadowOpacity: 0.4, + shadowRadius: 10, + overflow: 'hidden', + padding: BANNER_PADDING, + backgroundColor: '$surface1', + borderWidth: 1, + borderColor: '$surface3', + gap: '$spacing16', + + '$platform-web': { + position: 'fixed', + bottom: 29, + left: 40, + }, +}) + +export function BridgingPopularTokensBanner() { + const dispatch = useAppDispatch() + const { t } = useTranslation() + const navigate = useNavigate() + const { setIsSwapTokenSelectorOpen, setSwapOutputChainId } = useUniswapContext() + + const handleBannerClose = useCallback(() => { + dispatch(setHasDismissedBridgedAssetsBannerV2(true)) + sendAnalyticsEvent(SharedEventName.ELEMENT_CLICKED, { + element: ElementName.CloseButton, + modal: ElementName.BridgedAssetsBannerV2, + }) + }, [dispatch]) + + const handleBannerClick = useCallback(() => { + navigate('/swap?outputChain=unichain') + setSwapOutputChainId(UniverseChainId.Unichain) + setIsSwapTokenSelectorOpen(true) + dispatch(setHasDismissedBridgedAssetsBannerV2(true)) + }, [dispatch, navigate, setIsSwapTokenSelectorOpen, setSwapOutputChainId]) + + return ( + + + + + + + + + {t('onboarding.home.intro.bridgedAssets.title')} + + + {t('bridgingPopularTokens.banner.description')} + + + + + ) +} + +function BannerXButton({ handleClose }: { handleClose: () => void }) { + return ( + + { + e.stopPropagation() + handleClose() + }} + hoverStyle={{ opacity: 0.8 }} + icon={} + p={2} + /> + + ) +} diff --git a/apps/web/src/components/Banner/shared/Banners.tsx b/apps/web/src/components/Banner/shared/Banners.tsx index 9ccc4ece9a5..5e16d747a68 100644 --- a/apps/web/src/components/Banner/shared/Banners.tsx +++ b/apps/web/src/components/Banner/shared/Banners.tsx @@ -1,12 +1,13 @@ import { manualChainOutageAtom, useChainOutageConfig } from 'featureFlags/flags/outageBanner' +import { FeatureFlags, useFeatureFlag } from '@universe/gating' +import { BridgingPopularTokensBanner } from 'components/Banner/BridgingPopularTokens/BridgingPopularTokensBanner' import { getOutageBannerSessionStorageKey, OutageBanner } from 'components/Banner/Outage/OutageBanner' import { SOLANA_PROMO_BANNER_STORAGE_KEY, SolanaPromoBanner } from 'components/Banner/SolanaPromo/SolanaPromoBanner' import { useAtomValue } from 'jotai/utils' import { useMemo } from 'react' import { useLocation } from 'react-router' +import { useAppSelector } from 'state/hooks' import { UniverseChainId } from 'uniswap/src/features/chains/types' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' import { InterfacePageName } from 'uniswap/src/features/telemetry/constants' import { getChainIdFromChainUrlParam, isChainUrlParam } from 'utils/chainParams' import { getCurrentPageFromLocation } from 'utils/urlRoutes' @@ -15,6 +16,10 @@ export function Banners() { const { pathname } = useLocation() const currentPage = getCurrentPageFromLocation(pathname) const isSolanaPromoEnabled = useFeatureFlag(FeatureFlags.SolanaPromo) + const isBridgedAssetsBannerV2Enabled = useFeatureFlag(FeatureFlags.BridgedAssetsBannerV2) + const hasDismissedBridgedAssetsBannerV2 = useAppSelector( + (state) => state.uniswapBehaviorHistory.hasDismissedBridgedAssetsBannerV2, + ) // Read from both sources: error-detected (from GraphQL failures) and Statsig (manual config) const statsigOutage = useChainOutageConfig() @@ -55,5 +60,9 @@ export function Banners() { return } + if (isBridgedAssetsBannerV2Enabled && !hasDismissedBridgedAssetsBannerV2) { + return + } + return null } diff --git a/apps/web/src/components/Charts/D3LiquidityRangeInput/D3LiquidityRangeChart/D3LiquidityRangeChart.tsx b/apps/web/src/components/Charts/D3LiquidityRangeInput/D3LiquidityRangeChart/D3LiquidityRangeChart.tsx index 685f409f924..33afc62d804 100644 --- a/apps/web/src/components/Charts/D3LiquidityRangeInput/D3LiquidityRangeChart/D3LiquidityRangeChart.tsx +++ b/apps/web/src/components/Charts/D3LiquidityRangeInput/D3LiquidityRangeChart/D3LiquidityRangeChart.tsx @@ -12,6 +12,7 @@ import { ChartEntry } from 'components/Charts/LiquidityRangeInput/types' import { PriceChartData } from 'components/Charts/PriceChart' import { ChartType } from 'components/Charts/utils' import { useLiquidityUrlState } from 'components/Liquidity/Create/hooks/useLiquidityUrlState' +import { InitialPosition } from 'components/Liquidity/Create/types' import { ChartQueryResult } from 'components/Tokens/TokenDetails/ChartSection/util' import * as d3 from 'd3' import { useEffect, useMemo, useRef } from 'react' @@ -22,11 +23,13 @@ const D3LiquidityRangeChart = ({ liquidityData, quoteCurrency, baseCurrency, + initialPosition, }: { priceData: ChartQueryResult liquidityData: ChartEntry[] quoteCurrency: Currency baseCurrency: Currency + initialPosition?: InitialPosition }) => { const colors = useSporeColors() const svgRef = useRef(null) @@ -125,6 +128,11 @@ const D3LiquidityRangeChart = ({ useEffect(() => { let minPrice let maxPrice + + if (initialPosition) { + return + } + if (priceRangeState.minPrice && !isNaN(parseFloat(priceRangeState.minPrice))) { minPrice = parseFloat(priceRangeState.minPrice) } @@ -136,7 +144,7 @@ const D3LiquidityRangeChart = ({ minPrice, maxPrice, }) - }, [priceData.dataHash, reset]) + }, [priceData.dataHash, initialPosition, reset]) return ( diff --git a/apps/web/src/components/Charts/D3LiquidityRangeInput/D3LiquidityRangeChart/components/D3LiquidityMinMaxInput.tsx b/apps/web/src/components/Charts/D3LiquidityRangeInput/D3LiquidityRangeChart/components/D3LiquidityMinMaxInput.tsx index ee3695042fb..1e0723c11af 100644 --- a/apps/web/src/components/Charts/D3LiquidityRangeInput/D3LiquidityRangeChart/components/D3LiquidityMinMaxInput.tsx +++ b/apps/web/src/components/Charts/D3LiquidityRangeInput/D3LiquidityRangeChart/components/D3LiquidityMinMaxInput.tsx @@ -92,15 +92,26 @@ export function D3LiquidityMinMaxInput() { } const price = input === RangeSelectionInput.MIN ? minPrice : maxPrice - if (input === RangeSelectionInput.MIN && ticksAtLimit[0]) { + + if (input === RangeSelectionInput.MIN && ticksAtLimit[0] && !positionState.initialPosition) { return '0' } - if (input === RangeSelectionInput.MAX && ticksAtLimit[1]) { + if (input === RangeSelectionInput.MAX && ticksAtLimit[1] && !positionState.initialPosition) { return '∞' } + return price?.toString() ?? '' }, - [displayUserTypedValue, typedValue, inputMode, priceDifferences, minPrice, maxPrice, ticksAtLimit], + [ + displayUserTypedValue, + typedValue, + inputMode, + priceDifferences, + minPrice, + maxPrice, + ticksAtLimit, + positionState.initialPosition, + ], ) // Sets chart state but does not update liquidity context diff --git a/apps/web/src/components/Charts/D3LiquidityRangeInput/D3LiquidityRangeChart/store/types.ts b/apps/web/src/components/Charts/D3LiquidityRangeInput/D3LiquidityRangeChart/store/types.ts index 4efa9bf8fd5..d6eec00d3de 100644 --- a/apps/web/src/components/Charts/D3LiquidityRangeInput/D3LiquidityRangeChart/store/types.ts +++ b/apps/web/src/components/Charts/D3LiquidityRangeInput/D3LiquidityRangeChart/store/types.ts @@ -1,4 +1,4 @@ -import { ProtocolVersion } from '@uniswap/client-pools/dist/pools/v1/types_pb' +import { ProtocolVersion } from '@uniswap/client-data-api/dist/data/v1/poolTypes_pb' import { Currency } from '@uniswap/sdk-core' import { GraphQLApi } from '@universe/api' import { TickAlignment } from 'components/Charts/D3LiquidityRangeInput/D3LiquidityRangeChart/utils/priceToY' diff --git a/apps/web/src/components/Charts/D3LiquidityRangeInput/D3LiquidityRangeChart/utils/tickUtils.ts b/apps/web/src/components/Charts/D3LiquidityRangeInput/D3LiquidityRangeChart/utils/tickUtils.ts index a3385a91640..5b7eb089cf3 100644 --- a/apps/web/src/components/Charts/D3LiquidityRangeInput/D3LiquidityRangeChart/utils/tickUtils.ts +++ b/apps/web/src/components/Charts/D3LiquidityRangeInput/D3LiquidityRangeChart/utils/tickUtils.ts @@ -1,4 +1,4 @@ -import { ProtocolVersion } from '@uniswap/client-pools/dist/pools/v1/types_pb' +import { ProtocolVersion } from '@uniswap/client-data-api/dist/data/v1/poolTypes_pb' import { nearestUsableTick, priceToClosestTick, TickMath, tickToPrice as tickToPriceV3 } from '@uniswap/v3-sdk' import { priceToClosestTick as priceToClosestV4Tick, tickToPrice as tickToPriceV4 } from '@uniswap/v4-sdk' import { TickNavigationParams } from 'components/Charts/D3LiquidityRangeInput/D3LiquidityRangeChart/store/types' diff --git a/apps/web/src/components/Charts/D3LiquidityRangeInput/D3LiquidityRangeInput.tsx b/apps/web/src/components/Charts/D3LiquidityRangeInput/D3LiquidityRangeInput.tsx index 205c72ed202..71128df63fe 100644 --- a/apps/web/src/components/Charts/D3LiquidityRangeInput/D3LiquidityRangeInput.tsx +++ b/apps/web/src/components/Charts/D3LiquidityRangeInput/D3LiquidityRangeInput.tsx @@ -1,4 +1,4 @@ -import { ProtocolVersion } from '@uniswap/client-pools/dist/pools/v1/types_pb' +import { ProtocolVersion } from '@uniswap/client-data-api/dist/data/v1/poolTypes_pb' import { Currency, Price } from '@uniswap/sdk-core' import { GraphQLApi } from '@universe/api' import { D3LiquidityChartHeader } from 'components/Charts/D3LiquidityRangeInput/D3LiquidityRangeChart/components/D3LiquidityChartHeader' @@ -13,7 +13,7 @@ import { ChartEntry } from 'components/Charts/LiquidityRangeInput/types' import { ChartSkeleton } from 'components/Charts/LoadingState' import { PriceChartData } from 'components/Charts/PriceChart' import { ChartType } from 'components/Charts/utils' -import { RangeAmountInputPriceMode } from 'components/Liquidity/Create/types' +import { InitialPosition, RangeAmountInputPriceMode } from 'components/Liquidity/Create/types' import { usePoolPriceChartData } from 'hooks/usePoolPriceChartData' import { UTCTimestamp } from 'lightweight-charts' import { useMemo, useState } from 'react' @@ -42,6 +42,7 @@ export function D3LiquidityRangeInput({ price, hook, currentPrice, + initialPosition, isFullRange, minPrice, maxPrice, @@ -73,6 +74,7 @@ export function D3LiquidityRangeInput({ minPrice?: number maxPrice?: number inputMode?: RangeAmountInputPriceMode + initialPosition?: InitialPosition setInputMode: (inputMode: RangeAmountInputPriceMode) => void setMinPrice: (minPrice?: number | null) => void setMaxPrice: (maxPrice?: number | null) => void @@ -194,6 +196,7 @@ export function D3LiquidityRangeInput({ baseCurrency={baseCurrency} priceData={finalPriceData} liquidityData={sortedLiquidityData} + initialPosition={initialPosition} /> ) : ( diff --git a/apps/web/src/components/Charts/LiquidityChart/index.tsx b/apps/web/src/components/Charts/LiquidityChart/index.tsx index cf4dfbf7f2a..b5aff745efb 100644 --- a/apps/web/src/components/Charts/LiquidityChart/index.tsx +++ b/apps/web/src/components/Charts/LiquidityChart/index.tsx @@ -1,5 +1,5 @@ import { BigNumber } from '@ethersproject/bignumber' -import { ProtocolVersion } from '@uniswap/client-pools/dist/pools/v1/types_pb' +import { ProtocolVersion } from '@uniswap/client-data-api/dist/data/v1/poolTypes_pb' import { Currency, CurrencyAmount, Token } from '@uniswap/sdk-core' import { FeeAmount, Pool as PoolV3, TICK_SPACINGS, TickMath as TickMathV3, tickToPrice } from '@uniswap/v3-sdk' import { Pool as PoolV4, tickToPrice as tickToPriceV4 } from '@uniswap/v4-sdk' diff --git a/apps/web/src/components/Charts/LiquidityPositionRangeChart/LiquidityPositionRangeChart.tsx b/apps/web/src/components/Charts/LiquidityPositionRangeChart/LiquidityPositionRangeChart.tsx index f22dce5006c..e820c97f067 100644 --- a/apps/web/src/components/Charts/LiquidityPositionRangeChart/LiquidityPositionRangeChart.tsx +++ b/apps/web/src/components/Charts/LiquidityPositionRangeChart/LiquidityPositionRangeChart.tsx @@ -1,4 +1,4 @@ -import { PositionStatus, ProtocolVersion } from '@uniswap/client-pools/dist/pools/v1/types_pb' +import { PositionStatus, ProtocolVersion } from '@uniswap/client-data-api/dist/data/v1/poolTypes_pb' import { Currency, Price } from '@uniswap/sdk-core' import { Pair } from '@uniswap/v2-sdk' import { FeeAmount, Pool as V3Pool } from '@uniswap/v3-sdk' diff --git a/apps/web/src/components/Charts/LiquidityRangeInput/LiquidityRangeInput.tsx b/apps/web/src/components/Charts/LiquidityRangeInput/LiquidityRangeInput.tsx index af38a075534..6ad03dc900c 100644 --- a/apps/web/src/components/Charts/LiquidityRangeInput/LiquidityRangeInput.tsx +++ b/apps/web/src/components/Charts/LiquidityRangeInput/LiquidityRangeInput.tsx @@ -1,4 +1,4 @@ -import { ProtocolVersion } from '@uniswap/client-pools/dist/pools/v1/types_pb' +import { ProtocolVersion } from '@uniswap/client-data-api/dist/data/v1/poolTypes_pb' import { Currency } from '@uniswap/sdk-core' import { GraphQLApi } from '@universe/api' import { ActiveLiquidityChart } from 'components/Charts/ActiveLiquidityChart/ActiveLiquidityChart' diff --git a/apps/web/src/components/Charts/LiquidityRangeInput/hooks.ts b/apps/web/src/components/Charts/LiquidityRangeInput/hooks.ts index 907bb46ba51..22f595d3efc 100644 --- a/apps/web/src/components/Charts/LiquidityRangeInput/hooks.ts +++ b/apps/web/src/components/Charts/LiquidityRangeInput/hooks.ts @@ -1,5 +1,5 @@ import { useQuery } from '@tanstack/react-query' -import { ProtocolVersion } from '@uniswap/client-pools/dist/pools/v1/types_pb' +import { ProtocolVersion } from '@uniswap/client-data-api/dist/data/v1/poolTypes_pb' import { Currency } from '@uniswap/sdk-core' import { calculateTokensLockedV3, calculateTokensLockedV4 } from 'components/Charts/LiquidityChart' import { ChartEntry } from 'components/Charts/LiquidityRangeInput/types' diff --git a/apps/web/src/components/Charts/PriceChart/index.tsx b/apps/web/src/components/Charts/PriceChart/index.tsx index f3767252cd6..2313ca3d480 100644 --- a/apps/web/src/components/Charts/PriceChart/index.tsx +++ b/apps/web/src/components/Charts/PriceChart/index.tsx @@ -25,6 +25,7 @@ import { Trans } from 'react-i18next' import { Flex, styled, Text } from 'ui/src' import { opacify } from 'ui/src/theme' import { isLowVarianceRange } from 'uniswap/src/components/charts/utils' +import { useFormatChartFiatDelta } from 'uniswap/src/features/fiatCurrency/hooks/useFormatChartFiatDelta' import { useLocalizationContext } from 'uniswap/src/features/language/LocalizationContext' import { NumberType } from 'utilities/src/format/types' @@ -230,19 +231,54 @@ export class PriceChartModel extends ChartModel { } interface PriceChartDeltaProps { - startingPrice: PriceChartData - endingPrice: PriceChartData + startingPrice: number + endingPrice: number noColor?: boolean + shouldIncludeFiatDelta?: boolean + shouldTreatAsStablecoin?: boolean } -export function PriceChartDelta({ startingPrice, endingPrice, noColor }: PriceChartDeltaProps) { - const delta = calculateDelta(startingPrice.close, endingPrice.close) - const { formatPercent } = useLocalizationContext() +export function PriceChartDelta({ + startingPrice, + endingPrice, + noColor, + shouldIncludeFiatDelta = false, + shouldTreatAsStablecoin = false, +}: PriceChartDeltaProps) { + const { formatPercent, convertFiatAmount } = useLocalizationContext() + const { formatChartFiatDelta } = useFormatChartFiatDelta() + + const delta = calculateDelta(startingPrice, endingPrice) + const formattedDelta = useMemo(() => { + return delta !== undefined ? formatPercent(Math.abs(delta)) : '-' + }, [delta, formatPercent]) + + const fiatDelta = useMemo(() => { + if (!shouldIncludeFiatDelta) { + return null + } + + const convertedStart = convertFiatAmount(startingPrice) + const convertedEnd = convertFiatAmount(endingPrice) + + return formatChartFiatDelta({ + startingPrice: convertedStart.amount, + endingPrice: convertedEnd.amount, + isStablecoin: shouldTreatAsStablecoin, + }) + }, [ + shouldIncludeFiatDelta, + formatChartFiatDelta, + startingPrice, + endingPrice, + convertFiatAmount, + shouldTreatAsStablecoin, + ]) return ( - {delta && } - {delta ? formatPercent(Math.abs(delta)) : '-'} + {delta !== undefined && } + {fiatDelta ? `${fiatDelta.formatted} (${formattedDelta})` : formattedDelta} ) } @@ -288,7 +324,14 @@ function CandlestickTooltip({ data }: { data: PriceChartData }) { } export function PriceChart({ data, height, type, stale, timePeriod }: PriceChartProps) { + const startingPrice = data[0] const lastPrice = data[data.length - 1] + const { min, max } = getCandlestickPriceBounds(data) + const shouldTreatAsStablecoin = isLowVarianceRange({ + min, + max, + duration: timePeriod, + }) return ( ( } + additionalFields={ + + } valueFormatterType={NumberType.FiatTokenPrice} time={crosshairData?.time} /> diff --git a/apps/web/src/components/Expand/index.tsx b/apps/web/src/components/Expand/index.tsx index aa3303a3209..d9831b552f8 100644 --- a/apps/web/src/components/Expand/index.tsx +++ b/apps/web/src/components/Expand/index.tsx @@ -1,31 +1,8 @@ -import Column from 'components/deprecated/Column' -import Row, { RowBetween } from 'components/deprecated/Row' -import styled from 'lib/styled-components' import { PropsWithChildren, ReactElement } from 'react' -import { ChevronDown } from 'react-feather' -import { HeightAnimator } from 'ui/src' +import { Flex, FlexProps, HeightAnimator } from 'ui/src' +import { RotatableChevron } from 'ui/src/components/icons/RotatableChevron' import { iconSizes } from 'ui/src/theme' -const ButtonContainer = styled(Row)` - cursor: pointer; - justify-content: flex-end; - width: unset; -` - -const ExpandIcon = styled(ChevronDown)<{ $isOpen: boolean }>` - color: ${({ theme }) => theme.neutral2}; - transform: ${({ $isOpen }) => ($isOpen ? 'rotate(180deg)' : 'rotate(0deg)')}; - transition: transform ${({ theme }) => theme.transition.duration.medium}; -` - -const Content = styled(Column)` - padding-top: ${({ theme }) => theme.grids.md}; -` - -const Wrapper = styled(Column)<{ $padding?: string }>` - padding: ${({ $padding }) => $padding}; -` - export default function Expand({ header, button, @@ -35,27 +12,41 @@ export default function Expand({ padding, onToggle, iconSize = 'icon24', + paddingTop, + width, }: PropsWithChildren<{ header?: ReactElement button: ReactElement testId?: string isOpen: boolean - padding?: string + padding?: FlexProps['p'] onToggle: () => void iconSize?: keyof typeof iconSizes + paddingTop?: FlexProps['pt'] + width?: FlexProps['width'] }>) { return ( - - + + {header} - + {button} - - - + + + - {children} + + {children} + - + ) } diff --git a/apps/web/src/components/FeatureFlagModal/FeatureFlagModal.tsx b/apps/web/src/components/FeatureFlagModal/FeatureFlagModal.tsx index d419cc0f67d..0b3d9913486 100644 --- a/apps/web/src/components/FeatureFlagModal/FeatureFlagModal.tsx +++ b/apps/web/src/components/FeatureFlagModal/FeatureFlagModal.tsx @@ -1,3 +1,15 @@ +import type { DynamicConfigKeys } from '@universe/gating' +import { + DynamicConfigs, + Experiments, + ExternallyConnectableExtensionConfigKey, + FeatureFlags, + getFeatureFlagName, + getOverrideAdapter, + Layers, + NetworkRequestsConfigKey, + useFeatureFlagWithExposureLoggingDisabled, +} from '@universe/gating' import { useModalState } from 'hooks/useModalState' import styledDep from 'lib/styled-components' import { useExternallyConnectableExtensionId } from 'pages/ExtensionPasskeyAuthPopUp/useExternallyConnectableExtensionId' @@ -6,16 +18,6 @@ import { useCallback } from 'react' import { Button, Flex, ModalCloseIcon, styled, Text } from 'ui/src' import { ExperimentRow, LayerRow } from 'uniswap/src/components/gating/Rows' import { Modal } from 'uniswap/src/components/modals/Modal' -import type { DynamicConfigKeys } from 'uniswap/src/features/gating/configs' -import { - DynamicConfigs, - ExternallyConnectableExtensionConfigKey, - NetworkRequestsConfigKey, -} from 'uniswap/src/features/gating/configs' -import { Experiments, Layers } from 'uniswap/src/features/gating/experiments' -import { FeatureFlags, getFeatureFlagName } from 'uniswap/src/features/gating/flags' -import { useFeatureFlagWithExposureLoggingDisabled } from 'uniswap/src/features/gating/hooks' -import { getOverrideAdapter } from 'uniswap/src/features/gating/sdk/statsig' import { ModalName } from 'uniswap/src/features/telemetry/constants' import { isPlaywrightEnv } from 'utilities/src/environment/env' import { TRUSTED_CHROME_EXTENSION_IDS } from 'utilities/src/environment/extensionId' @@ -276,6 +278,7 @@ export default function FeatureFlagModal() { + @@ -286,6 +289,7 @@ export default function FeatureFlagModal() { + diff --git a/apps/web/src/components/HelpModal/HelpContent.tsx b/apps/web/src/components/HelpModal/HelpContent.tsx index b67856643ae..4e3332c04b6 100644 --- a/apps/web/src/components/HelpModal/HelpContent.tsx +++ b/apps/web/src/components/HelpModal/HelpContent.tsx @@ -32,7 +32,8 @@ export function HelpContent({ onClose }: HelpContentProps) { return ( - setIsOpen(open)}> + setIsOpen(open)} + > - + + + setIsOpen(false)} /> diff --git a/apps/web/src/components/Liquidity/ClaimFeeModal.tsx b/apps/web/src/components/Liquidity/ClaimFeeModal.tsx index 330fceecad5..bd924749dad 100644 --- a/apps/web/src/components/Liquidity/ClaimFeeModal.tsx +++ b/apps/web/src/components/Liquidity/ClaimFeeModal.tsx @@ -1,4 +1,4 @@ -import { ProtocolVersion } from '@uniswap/client-pools/dist/pools/v1/types_pb' +import { ProtocolVersion } from '@uniswap/client-data-api/dist/data/v1/poolTypes_pb' import { CurrencyAmount } from '@uniswap/sdk-core' import { TradingApi } from '@universe/api' import { ErrorCallout } from 'components/ErrorCallout' diff --git a/apps/web/src/components/Liquidity/Create/AddHook.tsx b/apps/web/src/components/Liquidity/Create/AddHook.tsx index 2620a7cf2e9..506d1aa9dc6 100644 --- a/apps/web/src/components/Liquidity/Create/AddHook.tsx +++ b/apps/web/src/components/Liquidity/Create/AddHook.tsx @@ -1,4 +1,4 @@ -import { ProtocolVersion } from '@uniswap/client-pools/dist/pools/v1/types_pb' +import { ProtocolVersion } from '@uniswap/client-data-api/dist/data/v1/poolTypes_pb' import { AdvancedButton } from 'components/Liquidity/Create/AdvancedButton' import { useLiquidityUrlState } from 'components/Liquidity/Create/hooks/useLiquidityUrlState' import { DEFAULT_POSITION_STATE } from 'components/Liquidity/Create/types' diff --git a/apps/web/src/components/Liquidity/Create/EditStep.tsx b/apps/web/src/components/Liquidity/Create/EditStep.tsx index bd96f6af8bc..ba5d25fd7c7 100644 --- a/apps/web/src/components/Liquidity/Create/EditStep.tsx +++ b/apps/web/src/components/Liquidity/Create/EditStep.tsx @@ -1,4 +1,4 @@ -import { ProtocolVersion } from '@uniswap/client-pools/dist/pools/v1/types_pb' +import { ProtocolVersion } from '@uniswap/client-data-api/dist/data/v1/poolTypes_pb' import CreatingPoolInfo from 'components/CreatingPoolInfo/CreatingPoolInfo' import { useDefaultInitialPrice } from 'components/Liquidity/Create/hooks/useDefaultInitialPrice' import { PositionFlowStep } from 'components/Liquidity/Create/types' diff --git a/apps/web/src/components/Liquidity/Create/FormWrapper.tsx b/apps/web/src/components/Liquidity/Create/FormWrapper.tsx index 8a172f68a51..07713ff025b 100644 --- a/apps/web/src/components/Liquidity/Create/FormWrapper.tsx +++ b/apps/web/src/components/Liquidity/Create/FormWrapper.tsx @@ -1,4 +1,4 @@ -import { ProtocolVersion } from '@uniswap/client-pools/dist/pools/v1/types_pb' +import { ProtocolVersion } from '@uniswap/client-data-api/dist/data/v1/poolTypes_pb' import { Currency } from '@uniswap/sdk-core' import { BreadcrumbNavContainer, BreadcrumbNavLink } from 'components/BreadcrumbNav' import { Container } from 'components/Liquidity/Create/Container' diff --git a/apps/web/src/components/Liquidity/Create/PositionOutOfRangeError.tsx b/apps/web/src/components/Liquidity/Create/PositionOutOfRangeError.tsx index b5e243de478..76aab9ca1cc 100644 --- a/apps/web/src/components/Liquidity/Create/PositionOutOfRangeError.tsx +++ b/apps/web/src/components/Liquidity/Create/PositionOutOfRangeError.tsx @@ -1,4 +1,4 @@ -import { PositionStatus } from '@uniswap/client-pools/dist/pools/v1/types_pb' +import { PositionStatus } from '@uniswap/client-data-api/dist/data/v1/poolTypes_pb' import { ErrorCallout } from 'components/ErrorCallout' import { PositionInfo } from 'components/Liquidity/types' import { useTranslation } from 'react-i18next' diff --git a/apps/web/src/components/Liquidity/Create/RangeSelectionStep.tsx b/apps/web/src/components/Liquidity/Create/RangeSelectionStep.tsx index 80c51c9c44e..7ad8a3b54b9 100644 --- a/apps/web/src/components/Liquidity/Create/RangeSelectionStep.tsx +++ b/apps/web/src/components/Liquidity/Create/RangeSelectionStep.tsx @@ -1,4 +1,5 @@ -import { ProtocolVersion } from '@uniswap/client-pools/dist/pools/v1/types_pb' +import { ProtocolVersion } from '@uniswap/client-data-api/dist/data/v1/poolTypes_pb' +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import { D3LiquidityRangeInput } from 'components/Charts/D3LiquidityRangeInput/D3LiquidityRangeInput' import { LiquidityRangeInput } from 'components/Charts/LiquidityRangeInput/LiquidityRangeInput' import { useDefaultInitialPrice } from 'components/Liquidity/Create/hooks/useDefaultInitialPrice' @@ -23,8 +24,6 @@ import { AlertTriangleFilled } from 'ui/src/components/icons/AlertTriangleFilled import { fonts, zIndexes } from 'ui/src/theme' import { AmountInput } from 'uniswap/src/components/AmountInput/AmountInput' import { WarningSeverity } from 'uniswap/src/components/modals/WarningModal/types' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' enum RangeSelection { FULL = 'FULL', @@ -535,6 +534,7 @@ export const SelectPriceRangeStep = ({ price={price} currentPrice={Number(price?.toSignificant())} inputMode={priceRangeState.inputMode} + initialPosition={initialPosition} minPrice={rangeInputMinPrice} maxPrice={rangeInputMaxPrice} isFullRange={priceRangeState.fullRange} diff --git a/apps/web/src/components/Liquidity/Create/SelectTokenStep.tsx b/apps/web/src/components/Liquidity/Create/SelectTokenStep.tsx index 86470371e61..95762e764d7 100644 --- a/apps/web/src/components/Liquidity/Create/SelectTokenStep.tsx +++ b/apps/web/src/components/Liquidity/Create/SelectTokenStep.tsx @@ -1,6 +1,13 @@ import { PrefetchBalancesWrapper } from 'appGraphql/data/apollo/AdaptiveTokenBalancesProvider' -import { ProtocolVersion } from '@uniswap/client-pools/dist/pools/v1/types_pb' +import { ProtocolVersion } from '@uniswap/client-data-api/dist/data/v1/poolTypes_pb' import type { Currency, Percent } from '@uniswap/sdk-core' +import { + AllowedV4WethHookAddressesConfigKey, + DynamicConfigs, + FeatureFlags, + useDynamicConfigValue, + useFeatureFlag, +} from '@universe/gating' import CreatingPoolInfo from 'components/CreatingPoolInfo/CreatingPoolInfo' import { ErrorCallout } from 'components/ErrorCallout' import { AddHook } from 'components/Liquidity/Create/AddHook' @@ -41,9 +48,6 @@ import { useUrlContext } from 'uniswap/src/contexts/UrlContext' import { useEnabledChains } from 'uniswap/src/features/chains/hooks/useEnabledChains' import { UniverseChainId } from 'uniswap/src/features/chains/types' import type { CurrencyInfo } from 'uniswap/src/features/dataApi/types' -import { AllowedV4WethHookAddressesConfigKey, DynamicConfigs } from 'uniswap/src/features/gating/configs' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useDynamicConfigValue, useFeatureFlag } from 'uniswap/src/features/gating/hooks' import { useLocalizationContext } from 'uniswap/src/features/language/LocalizationContext' import { Platform } from 'uniswap/src/features/platforms/types/Platform' import { isSVMChain } from 'uniswap/src/features/platforms/utils/chains' @@ -225,7 +229,7 @@ export function SelectTokensStep({ }) const { - positionState: { hook, userApprovedHook, fee }, + positionState: { hook, userApprovedHook, fee, initialPosition }, setPositionState, protocolVersion, creatingPoolOrPair, @@ -586,7 +590,7 @@ export function SelectTokensStep({ + + + ) +} diff --git a/apps/web/src/pages/Portfolio/ConnectWalletBottomOverlay.tsx b/apps/web/src/pages/Portfolio/ConnectWalletBottomOverlay.tsx new file mode 100644 index 00000000000..1d3023714b3 --- /dev/null +++ b/apps/web/src/pages/Portfolio/ConnectWalletBottomOverlay.tsx @@ -0,0 +1,47 @@ +import { useAccountDrawer } from 'components/AccountDrawer/MiniPortfolio/hooks' +import { useTranslation } from 'react-i18next' +import { Button, Flex, Text } from 'ui/src' + +export function ConnectWalletBottomOverlay(): JSX.Element { + const accountDrawer = useAccountDrawer() + const { t } = useTranslation() + + return ( + + + + {t('portfolio.disconnected.connectWallet.cta')} + + + + + ) +} diff --git a/apps/web/src/pages/Portfolio/ConnectWalletView.tsx b/apps/web/src/pages/Portfolio/ConnectWalletView.tsx deleted file mode 100644 index 2cbbd7b7d11..00000000000 --- a/apps/web/src/pages/Portfolio/ConnectWalletView.tsx +++ /dev/null @@ -1,41 +0,0 @@ -import { useAccountDrawer } from 'components/AccountDrawer/MiniPortfolio/hooks' -import { useTranslation } from 'react-i18next' -import { Button, Flex, Text } from 'ui/src' -import { LineChartDots } from 'ui/src/components/icons/LineChartDots' -import { iconSizes } from 'ui/src/theme' -import { useEnabledChains } from 'uniswap/src/features/chains/hooks/useEnabledChains' - -export default function PortfolioConnectWalletView() { - const { t } = useTranslation() - const accountDrawer = useAccountDrawer() - const { chains } = useEnabledChains() - - return ( - - - - - - - {t('common.getStarted')} - - {t('portfolio.connectWallet.summary', { amount: chains.length })} - - - - - - ) -} diff --git a/apps/web/src/pages/Portfolio/Header/Header.tsx b/apps/web/src/pages/Portfolio/Header/Header.tsx index dabe6593763..c08767e2216 100644 --- a/apps/web/src/pages/Portfolio/Header/Header.tsx +++ b/apps/web/src/pages/Portfolio/Header/Header.tsx @@ -1,14 +1,11 @@ import NetworkFilter from 'components/NetworkFilter/NetworkFilter' -import { useAccount } from 'hooks/useAccount' -import { useScroll } from 'hooks/useScroll' import { usePortfolioParams } from 'pages/Portfolio/Header/hooks/usePortfolioParams' +import PortfolioAddressDisplay from 'pages/Portfolio/Header/PortfolioAddressDisplay/PortfolioAddressDisplay' import { PortfolioTabs } from 'pages/Portfolio/Header/Tabs' import { PortfolioTab } from 'pages/Portfolio/types' -import { useEffect, useState } from 'react' import { useNavigate } from 'react-router' import { Flex } from 'ui/src' import { INTERFACE_NAV_HEIGHT } from 'ui/src/theme/heights' -import { AddressDisplay } from 'uniswap/src/components/accounts/AddressDisplay' import { UniverseChainId } from 'uniswap/src/features/chains/types' import { useEvent } from 'utilities/src/react/hooks' import { getChainUrlParam } from 'utils/chainParams' @@ -22,21 +19,6 @@ function buildPortfolioUrl(tab: PortfolioTab | undefined, chainId: UniverseChain export default function PortfolioHeader() { const navigate = useNavigate() const { tab, chainId: currentChainId } = usePortfolioParams() - const { height: scrollHeight } = useScroll() - const [isCompact, setIsCompact] = useState(false) - const account = useAccount() - - useEffect(() => { - setIsCompact((prevIsCompact) => { - if (!prevIsCompact && scrollHeight > 120) { - return true - } - if (prevIsCompact && scrollHeight < 80) { - return false - } - return prevIsCompact - }) - }, [scrollHeight]) const onNetworkPress = useEvent((chainId: UniverseChainId | undefined) => { navigate(buildPortfolioUrl(tab, chainId)) @@ -56,14 +38,8 @@ export default function PortfolioHeader() { > - + + { + setIsCompact((prevIsCompact) => { + if (!prevIsCompact && scrollHeight > 120) { + return true + } + if (prevIsCompact && scrollHeight < 80) { + return false + } + return prevIsCompact + }) + }, [scrollHeight]) + + if (!account.address) { + return null + } + + return ( + + ) +} diff --git a/apps/web/src/pages/Portfolio/Header/PortfolioAddressDisplay/DemoAddressDisplay.tsx b/apps/web/src/pages/Portfolio/Header/PortfolioAddressDisplay/DemoAddressDisplay.tsx new file mode 100644 index 00000000000..4d6166b96cf --- /dev/null +++ b/apps/web/src/pages/Portfolio/Header/PortfolioAddressDisplay/DemoAddressDisplay.tsx @@ -0,0 +1,37 @@ +import { ReactComponent as Unicon } from 'assets/svg/Emblem/default.svg' +import { useTranslation } from 'react-i18next' +import { Flex, Text, Tooltip, useSporeColors } from 'ui/src' +import { Eye } from 'ui/src/components/icons/Eye' +import { iconSizes } from 'ui/src/theme' + +export default function DemoAddressDisplay() { + const colors = useSporeColors() + const { t } = useTranslation() + + return ( + + + + + + + + + {t('portfolio.disconnected.demoWallet.title')} + + + + + + {t('portfolio.disconnected.demoWallet.description')} + + + + ) +} diff --git a/apps/web/src/pages/Portfolio/Header/PortfolioAddressDisplay/PortfolioAddressDisplay.tsx b/apps/web/src/pages/Portfolio/Header/PortfolioAddressDisplay/PortfolioAddressDisplay.tsx new file mode 100644 index 00000000000..c2f6a8b9fbf --- /dev/null +++ b/apps/web/src/pages/Portfolio/Header/PortfolioAddressDisplay/PortfolioAddressDisplay.tsx @@ -0,0 +1,9 @@ +import useIsConnected from 'pages/Portfolio/Header/hooks/useIsConnected' +import ConnectedAddressDisplay from 'pages/Portfolio/Header/PortfolioAddressDisplay/ConnectedAddressDisplay' +import DemoAddressDisplay from 'pages/Portfolio/Header/PortfolioAddressDisplay/DemoAddressDisplay' + +export default function PortfolioAddressDisplay(): JSX.Element { + const isConnected = useIsConnected() + + return isConnected ? : +} diff --git a/apps/web/src/pages/Portfolio/Header/hooks/useIsConnected.ts b/apps/web/src/pages/Portfolio/Header/hooks/useIsConnected.ts new file mode 100644 index 00000000000..6c381c705ec --- /dev/null +++ b/apps/web/src/pages/Portfolio/Header/hooks/useIsConnected.ts @@ -0,0 +1,7 @@ +/* eslint-disable-next-line no-restricted-imports, no-restricted-syntax */ +import { useAccount } from 'hooks/useAccount' + +export default function useIsConnected() { + const account = useAccount() + return !!account.address +} diff --git a/apps/web/src/pages/Portfolio/NFTs/NFTCard.tsx b/apps/web/src/pages/Portfolio/NFTs/NFTCard.tsx new file mode 100644 index 00000000000..878c0a3cab8 --- /dev/null +++ b/apps/web/src/pages/Portfolio/NFTs/NFTCard.tsx @@ -0,0 +1,144 @@ +import { SharedEventName } from '@uniswap/analytics-events' +import { useCallback, useMemo, useState } from 'react' +import { useTranslation } from 'react-i18next' +import { AnimateTransition, Flex, Text, TouchableArea, useSporeColors } from 'ui/src' +import { ArrowUpRight } from 'ui/src/components/icons/ArrowUpRight' +import { MoreHorizontal } from 'ui/src/components/icons/MoreHorizontal' +import { zIndexes } from 'ui/src/theme' +import { iconSizes } from 'ui/src/theme/iconSizes' +import { NetworkLogo } from 'uniswap/src/components/CurrencyLogo/NetworkLogo' +import { NftView, NftViewProps } from 'uniswap/src/components/nfts/NftView' +import { fromGraphQLChain } from 'uniswap/src/features/chains/utils' +import { ElementName, SectionName } from 'uniswap/src/features/telemetry/constants' +import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send' +import { getOpenseaLink, openUri } from 'uniswap/src/utils/linking' + +const FLOAT_UP_ON_HOVER_OFFSET = -4 + +/** + * Generates a unique rotation angle for an element based on its ID + * @param id - Unique identifier for the element + * @returns CSS custom property object with rotation value + */ +function generateRotationStyle(id: string) { + // Generate hash from ID + const hashCode = id.split('').reduce((acc, char) => acc + char.charCodeAt(0), 0) + + // Determine rotation direction (positive or negative) + const direction = hashCode % 2 === 0 ? 1 : -1 + + // Generate rotation amount between 0.5 and 2.5 degrees + const rotationAmount = 0.5 + (hashCode % 201) / 100 // Range: 0.5 to 2.5 + return direction * rotationAmount +} + +type NftCardProps = Omit & { + owner: Address + id: string + onPress?: () => void +} + +export function NFTCard(props: NftCardProps): JSX.Element { + const [isHovered, setIsHovered] = useState(false) + const colors = useSporeColors() + const { t } = useTranslation() + + // Generate OpenSea URL for the NFT + const openseaUrl = useMemo(() => { + if (props.item.chain && props.item.contractAddress && props.item.tokenId) { + const chainId = fromGraphQLChain(props.item.chain) + if (chainId) { + return getOpenseaLink({ + chainId, + contractAddress: props.item.contractAddress, + tokenId: props.item.tokenId, + }) + } + } + return null + }, [props.item.chain, props.item.contractAddress, props.item.tokenId]) + + const handlePress = useCallback(async () => { + if (openseaUrl) { + await openUri({ uri: openseaUrl }) + } + sendAnalyticsEvent(SharedEventName.ELEMENT_CLICKED, { + element: ElementName.PortfolioNftItem, + section: SectionName.PortfolioNftsTab, + collection_name: props.item.collectionName, + collection_address: props.item.contractAddress, + token_id: props.item.tokenId, + }) + props.onPress?.() + }, [openseaUrl, props.item.collectionName, props.item.contractAddress, props.item.tokenId, props.onPress]) + + return ( + + setIsHovered(true)} + onMouseLeave={() => setIsHovered(false)} + onPress={handlePress} + > + {/* Context menu trigger icon */} + {/* TODO: open NFT context menu on click */} + event.stopPropagation()} + > + + + + {/* Let the parent card handle the onPress */} + {}} /> + + + + {props.item.name} + + + + + {props.item.collectionName} + + {props.item.chain && } + + + + {t('common.opensea.link')} + + + + + + + + ) +} diff --git a/apps/web/src/pages/Portfolio/NFTs/Nfts.tsx b/apps/web/src/pages/Portfolio/NFTs/Nfts.tsx new file mode 100644 index 00000000000..d876b5a78f2 --- /dev/null +++ b/apps/web/src/pages/Portfolio/NFTs/Nfts.tsx @@ -0,0 +1,75 @@ +import { SearchInput } from 'pages/Portfolio/components/SearchInput' +import { usePortfolioAddress } from 'pages/Portfolio/hooks/usePortfolioAddress' +import { NFTCard } from 'pages/Portfolio/NFTs/NFTCard' +import { filterNft } from 'pages/Portfolio/NFTs/utils/filterNfts' +import { useCallback, useMemo, useRef, useState } from 'react' +import { useTranslation } from 'react-i18next' +import { Flex, Text } from 'ui/src' +import { useNftListRenderData } from 'uniswap/src/components/nfts/hooks/useNftListRenderData' +import { NftsList } from 'uniswap/src/components/nfts/NftsList' +import { NFTItem } from 'uniswap/src/features/nfts/types' +import { InterfacePageName } from 'uniswap/src/features/telemetry/constants' +import Trace from 'uniswap/src/features/telemetry/Trace' +import { assume0xAddress } from 'utils/wagmi' + +const LOADING_SKELETON_COUNT = 10 + +export default function PortfolioNfts(): JSX.Element { + const { t } = useTranslation() + const owner = usePortfolioAddress() + const nftsContainerRef = useRef(null) + + const [search, setSearch] = useState('') + const lowercaseSearch = useMemo(() => search.trim().toLowerCase(), [search]) + + const { numShown } = useNftListRenderData({ owner: assume0xAddress(owner), skip: !owner }) + + const renderNFTItem = useCallback( + (item: NFTItem) => { + if (!filterNft(item, lowercaseSearch)) { + return + } + + return ( + + + + + + ) + }, + [lowercaseSearch, owner], + ) + + return ( + + + + + {numShown ? `${numShown}` : ''} {t('portfolio.nfts.title')} + + + + + + + + + + ) +} diff --git a/apps/web/src/pages/Portfolio/NFTs/utils/filterNfts.test.ts b/apps/web/src/pages/Portfolio/NFTs/utils/filterNfts.test.ts new file mode 100644 index 00000000000..b208030e60d --- /dev/null +++ b/apps/web/src/pages/Portfolio/NFTs/utils/filterNfts.test.ts @@ -0,0 +1,257 @@ +import { filterNft } from 'pages/Portfolio/NFTs/utils/filterNfts' +import { NFTItem } from 'uniswap/src/features/nfts/types' + +describe('filterNft', () => { + const createMockNft = (overrides: Partial = {}): NFTItem => ({ + name: 'Bored Ape #1234', + collectionName: 'Bored Ape Yacht Club', + tokenId: '1234', + contractAddress: '0xBC4CA0EdA7647A8aB7C2061c2E118A18a936f13D', + ...overrides, + }) + + describe('when search query is empty', () => { + it('should return true for empty string', () => { + const nft = createMockNft() + expect(filterNft(nft, '')).toBe(true) + }) + + it('should return true for whitespace-only string', () => { + const nft = createMockNft() + expect(filterNft(nft, ' ')).toBe(true) + }) + + it('should return true for null/undefined search', () => { + const nft = createMockNft() + expect(filterNft(nft, '')).toBe(true) + }) + }) + + describe('when searching by NFT name', () => { + it('should match exact name', () => { + const nft = createMockNft({ name: 'Bored Ape #1234' }) + expect(filterNft(nft, 'Bored Ape #1234')).toBe(true) + }) + + it('should match partial name', () => { + const nft = createMockNft({ name: 'Bored Ape #1234' }) + expect(filterNft(nft, 'Bored')).toBe(true) + }) + + it('should be case-insensitive', () => { + const nft = createMockNft({ name: 'Bored Ape #1234' }) + expect(filterNft(nft, 'bored')).toBe(true) + expect(filterNft(nft, 'BORED')).toBe(true) + expect(filterNft(nft, 'BoReD')).toBe(true) + }) + + it('should not match when name does not contain search term', () => { + const nft = createMockNft({ name: 'Bored Ape #1234' }) + expect(filterNft(nft, 'CryptoPunk')).toBe(false) + }) + + it('should handle undefined name', () => { + const nft = createMockNft({ + name: undefined, + collectionName: undefined, + tokenId: undefined, + contractAddress: undefined, + }) + expect(filterNft(nft, 'Bored')).toBe(false) + }) + + it('should handle null name', () => { + const nft = createMockNft({ + name: null as any, + collectionName: undefined, + tokenId: undefined, + contractAddress: undefined, + }) + expect(filterNft(nft, 'Bored')).toBe(false) + }) + }) + + describe('when searching by collection name', () => { + it('should match exact collection name', () => { + const nft = createMockNft({ collectionName: 'Bored Ape Yacht Club' }) + expect(filterNft(nft, 'Bored Ape Yacht Club')).toBe(true) + }) + + it('should match partial collection name', () => { + const nft = createMockNft({ collectionName: 'Bored Ape Yacht Club' }) + expect(filterNft(nft, 'Yacht')).toBe(true) + }) + + it('should be case-insensitive', () => { + const nft = createMockNft({ collectionName: 'Bored Ape Yacht Club' }) + expect(filterNft(nft, 'yacht')).toBe(true) + expect(filterNft(nft, 'YACHT')).toBe(true) + expect(filterNft(nft, 'YaChT')).toBe(true) + }) + + it('should not match when collection name does not contain search term', () => { + const nft = createMockNft({ collectionName: 'Bored Ape Yacht Club' }) + expect(filterNft(nft, 'CryptoPunks')).toBe(false) + }) + + it('should handle undefined collection name', () => { + const nft = createMockNft({ collectionName: undefined }) + expect(filterNft(nft, 'Yacht')).toBe(false) + }) + }) + + describe('when searching by token ID', () => { + it('should match exact token ID', () => { + const nft = createMockNft({ tokenId: '1234' }) + expect(filterNft(nft, '1234')).toBe(true) + }) + + it('should match partial token ID', () => { + const nft = createMockNft({ tokenId: '1234' }) + expect(filterNft(nft, '123')).toBe(true) + }) + + it('should be case-insensitive', () => { + const nft = createMockNft({ tokenId: 'ABC123' }) + expect(filterNft(nft, 'abc')).toBe(true) + expect(filterNft(nft, 'ABC')).toBe(true) + expect(filterNft(nft, 'AbC')).toBe(true) + }) + + it('should not match when token ID does not contain search term', () => { + const nft = createMockNft({ tokenId: '1234' }) + expect(filterNft(nft, '5678')).toBe(false) + }) + + it('should handle undefined token ID', () => { + const nft = createMockNft({ + tokenId: undefined, + name: undefined, + collectionName: undefined, + contractAddress: undefined, + }) + expect(filterNft(nft, '1234')).toBe(false) + }) + }) + + describe('when searching by contract address', () => { + it('should match exact contract address', () => { + const nft = createMockNft({ contractAddress: '0xBC4CA0EdA7647A8aB7C2061c2E118A18a936f13D' }) + expect(filterNft(nft, '0xBC4CA0EdA7647A8aB7C2061c2E118A18a936f13D')).toBe(true) + }) + + it('should match partial contract address', () => { + const nft = createMockNft({ contractAddress: '0xBC4CA0EdA7647A8aB7C2061c2E118A18a936f13D' }) + expect(filterNft(nft, 'BC4CA0')).toBe(true) + }) + + it('should be case-insensitive', () => { + const nft = createMockNft({ contractAddress: '0xBC4CA0EdA7647A8aB7C2061c2E118A18a936f13D' }) + expect(filterNft(nft, 'bc4ca0')).toBe(true) + expect(filterNft(nft, 'BC4CA0')).toBe(true) + expect(filterNft(nft, 'Bc4Ca0')).toBe(true) + }) + + it('should not match when contract address does not contain search term', () => { + const nft = createMockNft({ contractAddress: '0xBC4CA0EdA7647A8aB7C2061c2E118A18a936f13D' }) + expect(filterNft(nft, '0x123456789')).toBe(false) + }) + + it('should handle undefined contract address', () => { + const nft = createMockNft({ contractAddress: undefined }) + expect(filterNft(nft, 'BC4CA0')).toBe(false) + }) + }) + + describe('when searching with whitespace', () => { + it('should trim leading and trailing whitespace', () => { + const nft = createMockNft({ name: 'Bored Ape #1234' }) + expect(filterNft(nft, ' Bored ')).toBe(true) + expect(filterNft(nft, '\tBored\n')).toBe(true) + }) + + it('should handle whitespace-only search as empty search', () => { + const nft = createMockNft() + expect(filterNft(nft, ' ')).toBe(true) + expect(filterNft(nft, '\t\n')).toBe(true) + }) + }) + + describe('edge cases', () => { + it('should handle NFT with all undefined fields', () => { + const nft = createMockNft({ + name: undefined, + collectionName: undefined, + tokenId: undefined, + contractAddress: undefined, + }) + expect(filterNft(nft, 'anything')).toBe(false) + }) + + it('should handle NFT with empty string fields', () => { + const nft = createMockNft({ + name: '', + collectionName: '', + tokenId: '', + contractAddress: '', + }) + expect(filterNft(nft, 'anything')).toBe(false) + }) + + it('should handle special characters in search', () => { + const nft = createMockNft({ name: 'NFT #1234' }) + expect(filterNft(nft, '#')).toBe(true) + expect(filterNft(nft, '1234')).toBe(true) + }) + + it('should handle unicode characters', () => { + const nft = createMockNft({ name: '🚀 Rocket NFT' }) + expect(filterNft(nft, '🚀')).toBe(true) + expect(filterNft(nft, 'Rocket')).toBe(true) + }) + }) + + describe('real-world examples', () => { + it('should match Bored Ape Yacht Club NFT', () => { + const nft = createMockNft({ + name: 'Bored Ape #1234', + collectionName: 'Bored Ape Yacht Club', + tokenId: '1234', + contractAddress: '0xBC4CA0EdA7647A8aB7C2061c2E118A18a936f13D', + }) + + expect(filterNft(nft, 'bored')).toBe(true) + expect(filterNft(nft, 'ape')).toBe(true) + expect(filterNft(nft, 'yacht')).toBe(true) + expect(filterNft(nft, '1234')).toBe(true) + expect(filterNft(nft, 'BC4CA0')).toBe(true) + }) + + it('should match CryptoPunks NFT', () => { + const nft = createMockNft({ + name: 'CryptoPunk #1234', + collectionName: 'CryptoPunks', + tokenId: '1234', + contractAddress: '0xb47e3cd837dDF8e4c57F05d70Ab865de6e193BBB', + }) + + expect(filterNft(nft, 'crypto')).toBe(true) + expect(filterNft(nft, 'punk')).toBe(true) + expect(filterNft(nft, 'punks')).toBe(true) + expect(filterNft(nft, '1234')).toBe(true) + }) + + it('should not match unrelated NFTs', () => { + const nft = createMockNft({ + name: 'Bored Ape #1234', + collectionName: 'Bored Ape Yacht Club', + tokenId: '1234', + contractAddress: '0xBC4CA0EdA7647A8aB7C2061c2E118A18a936f13D', + }) + + expect(filterNft(nft, 'cryptopunk')).toBe(false) + expect(filterNft(nft, 'azuki')).toBe(false) + expect(filterNft(nft, '5678')).toBe(false) + }) + }) +}) diff --git a/apps/web/src/pages/Portfolio/NFTs/utils/filterNfts.ts b/apps/web/src/pages/Portfolio/NFTs/utils/filterNfts.ts new file mode 100644 index 00000000000..643712033f0 --- /dev/null +++ b/apps/web/src/pages/Portfolio/NFTs/utils/filterNfts.ts @@ -0,0 +1,32 @@ +import { NFTItem } from 'uniswap/src/features/nfts/types' + +/** + * Filters an NFT item based on a search query. + * The search is case-insensitive and matches against: + * - NFT name + * - Collection name + * - Token ID + * - Contract address + * + * @param item - The NFT item to filter + * @param searchQuery - The search query (will be converted to lowercase) + * @returns true if the item matches the search query, false otherwise + */ +export function filterNft(item: NFTItem, searchQuery: string): boolean { + if (!searchQuery.trim()) { + return true + } + + const lowercaseSearch = searchQuery.trim().toLowerCase() + const name = item.name?.toLowerCase() ?? '' + const collectionName = item.collectionName?.toLowerCase() ?? '' + const tokenId = item.tokenId?.toLowerCase() ?? '' + const contract = item.contractAddress?.toLowerCase() ?? '' + + return ( + name.includes(lowercaseSearch) || + collectionName.includes(lowercaseSearch) || + tokenId.includes(lowercaseSearch) || + contract.includes(lowercaseSearch) + ) +} diff --git a/apps/web/src/pages/Portfolio/Nfts.tsx b/apps/web/src/pages/Portfolio/Nfts.tsx deleted file mode 100644 index 49fdcff4e64..00000000000 --- a/apps/web/src/pages/Portfolio/Nfts.tsx +++ /dev/null @@ -1,30 +0,0 @@ -import { useTranslation } from 'react-i18next' -import { Flex, Text } from 'ui/src' -import { InterfacePageName } from 'uniswap/src/features/telemetry/constants' -import Trace from 'uniswap/src/features/telemetry/Trace' - -export default function PortfolioNfts() { - const { t } = useTranslation() - - return ( - - - {t('portfolio.nfts.title')} - - Coming Soon - - This feature is under development and will be available soon. - - - - - ) -} diff --git a/apps/web/src/pages/Portfolio/Portfolio.tsx b/apps/web/src/pages/Portfolio/Portfolio.tsx index b58e47ab710..8959a955b19 100644 --- a/apps/web/src/pages/Portfolio/Portfolio.tsx +++ b/apps/web/src/pages/Portfolio/Portfolio.tsx @@ -1,70 +1,59 @@ -import { useAccount } from 'hooks/useAccount' -import PortfolioActivity from 'pages/Portfolio/Activity/Activity' -import PortfolioConnectWalletView from 'pages/Portfolio/ConnectWalletView' -import PortfolioDefi from 'pages/Portfolio/Defi' +import { Layers, PortfolioDisconnectedDemoViewProperties, useExperimentValueFromLayer } from '@universe/gating' +import PortfolioConnectWalletBanner from 'pages/Portfolio/ConnectWalletBanner' +import { ConnectWalletBottomOverlay } from 'pages/Portfolio/ConnectWalletBottomOverlay' import PortfolioHeader from 'pages/Portfolio/Header/Header' -import { usePortfolioParams } from 'pages/Portfolio/Header/hooks/usePortfolioParams' -import { usePortfolioTabsAnimation } from 'pages/Portfolio/Header/hooks/usePortfolioTabsAnimation' -import PortfolioNfts from 'pages/Portfolio/Nfts' -import PortfolioOverview from 'pages/Portfolio/Overview' -import PortfolioTokens from 'pages/Portfolio/Tokens/Tokens' -import { PortfolioTab } from 'pages/Portfolio/types' -import { useLocation } from 'react-router' +import useIsConnected from 'pages/Portfolio/Header/hooks/useIsConnected' +import { PortfolioContent } from 'pages/Portfolio/PortfolioContent' +import PortfolioDisconnectedView from 'pages/Portfolio/PortfolioDisconnectedView' import { Flex } from 'ui/src' -import { TransitionItem } from 'ui/src/animations/components/AnimatePresencePager' import { InterfacePageName } from 'uniswap/src/features/telemetry/constants' import Trace from 'uniswap/src/features/telemetry/Trace' -const renderPortfolioContent = (tab: PortfolioTab | undefined) => { - switch (tab) { - case PortfolioTab.Overview: - return - case PortfolioTab.Tokens: - return - case PortfolioTab.Defi: - return - case PortfolioTab.Nfts: - return - case PortfolioTab.Activity: - return - default: - return - } -} - // eslint-disable-next-line import/no-unused-modules -- used in RouteDefinitions.tsx via lazy import export default function Portfolio() { - const { pathname } = useLocation() - const account = useAccount() - const animationType = usePortfolioTabsAnimation(pathname) - const { tab } = usePortfolioParams() + const isConnected = useIsConnected() + const showDemoView = useExperimentValueFromLayer({ + layerName: Layers.PortfolioPage, + param: PortfolioDisconnectedDemoViewProperties.DemoViewEnabled, + defaultValue: false, + }) return ( - - {account.address ? ( - <> - + {!showDemoView && !isConnected ? ( + + ) : ( + + {!isConnected && } + {!isConnected && } + + {isConnected ? ( + <> + + + {/* Animated Content Area - All routes show same content, filtered by chain */} + + + ) : ( + <> + - {/* Animated Content Area - All routes show same content, filtered by chain */} - - - {renderPortfolioContent(tab)} - - - - ) : ( - - )} - + {/* Animated Content Area - All routes show same content, filtered by chain */} + + + + + )} + + )} ) } diff --git a/apps/web/src/pages/Portfolio/PortfolioContent.tsx b/apps/web/src/pages/Portfolio/PortfolioContent.tsx new file mode 100644 index 00000000000..9f859aaa643 --- /dev/null +++ b/apps/web/src/pages/Portfolio/PortfolioContent.tsx @@ -0,0 +1,42 @@ +import PortfolioActivity from 'pages/Portfolio/Activity/Activity' +import PortfolioDefi from 'pages/Portfolio/Defi' +import { usePortfolioParams } from 'pages/Portfolio/Header/hooks/usePortfolioParams' +import { usePortfolioTabsAnimation } from 'pages/Portfolio/Header/hooks/usePortfolioTabsAnimation' +import PortfolioNfts from 'pages/Portfolio/NFTs/Nfts' +import PortfolioOverview from 'pages/Portfolio/Overview' +import PortfolioTokens from 'pages/Portfolio/Tokens/Tokens' +import { PortfolioTab } from 'pages/Portfolio/types' +import { useLocation } from 'react-router' +import { Flex } from 'ui/src' +import { TransitionItem } from 'ui/src/animations/components/AnimatePresencePager' + +const renderPortfolioContent = (tab: PortfolioTab | undefined) => { + switch (tab) { + case PortfolioTab.Overview: + return + case PortfolioTab.Tokens: + return + case PortfolioTab.Defi: + return + case PortfolioTab.Nfts: + return + case PortfolioTab.Activity: + return + default: + return + } +} + +export function PortfolioContent({ disabled }: { disabled?: boolean }): JSX.Element { + const { pathname } = useLocation() + const animationType = usePortfolioTabsAnimation(pathname) + const { tab } = usePortfolioParams() + + return ( + + + {renderPortfolioContent(tab)} + + + ) +} diff --git a/apps/web/src/pages/Portfolio/PortfolioDisconnectedView.tsx b/apps/web/src/pages/Portfolio/PortfolioDisconnectedView.tsx new file mode 100644 index 00000000000..fe9e4c354d6 --- /dev/null +++ b/apps/web/src/pages/Portfolio/PortfolioDisconnectedView.tsx @@ -0,0 +1,105 @@ +import DISCONNECTED_B_DARK from 'assets/images/portfolio-page-promo/dark.svg' +import DISCONNECTED_B_LIGHT from 'assets/images/portfolio-page-promo/light.svg' +import { useAccountDrawer } from 'components/AccountDrawer/MiniPortfolio/hooks' +import { useTranslation } from 'react-i18next' +import { Button, Flex, Image, Text, useIsDarkMode, useSporeColors } from 'ui/src' +import { INTERFACE_NAV_HEIGHT } from 'ui/src/theme' +import { useEnabledChains } from 'uniswap/src/features/chains/hooks/useEnabledChains' + +const PADDING_TOP = 60 +const NAV_BORDER_WIDTH = 1 +const OFFSET_TOP = INTERFACE_NAV_HEIGHT + NAV_BORDER_WIDTH +const LEFT_CONTENT_MAX_WIDTH = 262 + +export default function PortfolioDisconnectedView() { + const { t } = useTranslation() + const enabledChains = useEnabledChains() + const isDarkMode = useIsDarkMode() + const accountDrawer = useAccountDrawer() + const colors = useSporeColors() + + return ( + + + + + {t('common.getStarted')} + + + {t('portfolio.disconnected.cta.description', { numNetworks: enabledChains.chains.length })} + + + + + + + + + + + ) +} diff --git a/apps/web/src/pages/Portfolio/Tokens/Table/TokensContextMenuWrapper.tsx b/apps/web/src/pages/Portfolio/Tokens/Table/TokensContextMenuWrapper.tsx index ae185fdcc14..3bd16b1bd30 100644 --- a/apps/web/src/pages/Portfolio/Tokens/Table/TokensContextMenuWrapper.tsx +++ b/apps/web/src/pages/Portfolio/Tokens/Table/TokensContextMenuWrapper.tsx @@ -1,3 +1,4 @@ +import useIsConnected from 'pages/Portfolio/Header/hooks/useIsConnected' import { TokenData } from 'pages/Portfolio/Tokens/hooks/useTransformTokenTableData' import { PropsWithChildren, useMemo } from 'react' import { ContextMenuTriggerMode } from 'uniswap/src/components/menus/types' @@ -9,6 +10,7 @@ export default function TokensContextMenuWrapper({ triggerMode, children, }: PropsWithChildren<{ tokenData: TokenData; triggerMode?: ContextMenuTriggerMode }>): React.ReactNode { + const isConnected = useIsConnected() const portfolioBalance: PortfolioBalance | undefined = useMemo(() => { if (!tokenData.currencyInfo) { return undefined @@ -25,7 +27,7 @@ export default function TokensContextMenuWrapper({ } }, [tokenData.currencyInfo, tokenData.id, tokenData.balance.value, tokenData.change1d, tokenData.rawValue]) - if (!portfolioBalance) { + if (!portfolioBalance || !isConnected) { return children } diff --git a/apps/web/src/pages/Portfolio/Tokens/Table/TokensTable.tsx b/apps/web/src/pages/Portfolio/Tokens/Table/TokensTable.tsx new file mode 100644 index 00000000000..39c41307320 --- /dev/null +++ b/apps/web/src/pages/Portfolio/Tokens/Table/TokensTable.tsx @@ -0,0 +1,56 @@ +import { NetworkStatus } from '@apollo/client' +import { TokenData } from 'pages/Portfolio/Tokens/hooks/useTransformTokenTableData' +import TokensTableInner from 'pages/Portfolio/Tokens/Table/TokensTableInner' +import { useState } from 'react' +import { useTranslation } from 'react-i18next' +import { ScrollSync } from 'react-scroll-sync' +import { Flex, HeightAnimator, Text, TouchableArea } from 'ui/src' +import { AnglesDownUp } from 'ui/src/components/icons/AnglesDownUp' +import { SortVertical } from 'ui/src/components/icons/SortVertical' + +interface TokensTableProps { + visible: TokenData[] + hidden: TokenData[] + loading: boolean + refetching?: boolean + networkStatus: NetworkStatus + error?: Error | undefined +} + +export default function TokensTable({ visible, hidden, loading, refetching, networkStatus, error }: TokensTableProps) { + const { t } = useTranslation() + const [isOpen, setIsOpen] = useState(false) + const tableLoading = loading && !refetching + + return ( + // Scroll Sync Architecture: + // - Outer ScrollSync coordinates horizontal scrolling between visible and hidden tables + // - Each TokensTableInner uses externalScrollSync=true to skip its own ScrollSync wrapper + // - Both tables use ScrollSyncPane with scrollGroup="portfolio-tokens" for coordination + // - DO NOT remove this outer ScrollSync wrapper without updating the Table components + + + + {hidden.length > 0 && ( + <> + setIsOpen(!isOpen)} row gap="$gap8" p="$spacing16"> + + {t('hidden.tokens.info.text.button', { numHidden: hidden.length })} + + + {isOpen ? ( + + ) : ( + + )} + + + + + + + )} + + + ) +} diff --git a/apps/web/src/pages/Portfolio/Tokens/Table/Table.tsx b/apps/web/src/pages/Portfolio/Tokens/Table/TokensTableInner.tsx similarity index 66% rename from apps/web/src/pages/Portfolio/Tokens/Table/Table.tsx rename to apps/web/src/pages/Portfolio/Tokens/Table/TokensTableInner.tsx index e7f13d1fd33..aeb4600af6a 100644 --- a/apps/web/src/pages/Portfolio/Tokens/Table/Table.tsx +++ b/apps/web/src/pages/Portfolio/Tokens/Table/TokensTableInner.tsx @@ -15,12 +15,29 @@ import { useMemo } from 'react' import { useTranslation } from 'react-i18next' import { Text } from 'ui/src' -export default function TokensTable({ tokenData }: { tokenData: TokenData[] }) { +const hasRow = (obj: unknown): obj is { row: { original: T } } => { + const maybeRow = (obj as { row?: unknown }).row + return typeof maybeRow === 'object' && maybeRow !== null && 'original' in maybeRow && maybeRow.original !== undefined +} + +export default function TokensTableInner({ + tokenData, + hideHeader, + loading = false, + error, +}: { + tokenData: TokenData[] + hideHeader?: boolean + loading?: boolean + error?: Error | undefined +}) { const { t } = useTranslation() + const showLoadingSkeleton = loading || !!error // Create table columns const columns = useMemo(() => { const columnHelper = createColumnHelper() + return [ columnHelper.accessor('currencyInfo', { header: () => ( @@ -31,10 +48,9 @@ export default function TokensTable({ tokenData }: { tokenData: TokenData[] }) { ), cell: (info) => { - const currencyInfo = info.getValue() return ( - - + + ) }, @@ -48,10 +64,9 @@ export default function TokensTable({ tokenData }: { tokenData: TokenData[] }) { ), cell: (info) => { - const value = info.getValue() return ( - - + + ) }, @@ -65,10 +80,9 @@ export default function TokensTable({ tokenData }: { tokenData: TokenData[] }) { ), cell: (info) => { - const value = info.getValue() return ( - - + + ) }, @@ -82,10 +96,9 @@ export default function TokensTable({ tokenData }: { tokenData: TokenData[] }) { ), cell: (info) => { - const value = info.getValue() return ( - - + + ) }, @@ -99,11 +112,9 @@ export default function TokensTable({ tokenData }: { tokenData: TokenData[] }) { ), cell: (info) => { - const value = info.getValue() - return ( - - + + ) }, @@ -117,10 +128,9 @@ export default function TokensTable({ tokenData }: { tokenData: TokenData[] }) { ), cell: (info) => { - const value = info.getValue() return ( - - + + ) }, @@ -130,28 +140,33 @@ export default function TokensTable({ tokenData }: { tokenData: TokenData[] }) { size: 40, header: () => , cell: (info) => { - const tokenData = info.row.original + const tokenData = hasRow(info) ? info.row.original : undefined return ( - - + + {tokenData && } ) }, }), ] - }, [t]) + }, [t, showLoadingSkeleton]) return (
row.id} - rowWrapper={(row, content) => ( - {content} - )} + rowWrapper={ + loading + ? undefined + : (row, content) => {content} + } /> ) } diff --git a/apps/web/src/pages/Portfolio/Tokens/Table/columns/Balance.tsx b/apps/web/src/pages/Portfolio/Tokens/Table/columns/Balance.tsx index 8a0d4a018f0..9a9a00ac191 100644 --- a/apps/web/src/pages/Portfolio/Tokens/Table/columns/Balance.tsx +++ b/apps/web/src/pages/Portfolio/Tokens/Table/columns/Balance.tsx @@ -10,7 +10,7 @@ const Balance = memo(function Balance({ value, symbol }: TokenData['balance']) { } return ( - + {symbol} ) diff --git a/apps/web/src/pages/Portfolio/Tokens/Tokens.tsx b/apps/web/src/pages/Portfolio/Tokens/Tokens.tsx index 3b44943cf6f..4e44c419bcf 100644 --- a/apps/web/src/pages/Portfolio/Tokens/Tokens.tsx +++ b/apps/web/src/pages/Portfolio/Tokens/Tokens.tsx @@ -1,27 +1,122 @@ -import { useAccount } from 'hooks/useAccount' +import { SearchInput } from 'pages/Portfolio/components/SearchInput' +import { usePortfolioParams } from 'pages/Portfolio/Header/hooks/usePortfolioParams' +import { usePortfolioAddress } from 'pages/Portfolio/hooks/usePortfolioAddress' import { useTransformTokenTableData } from 'pages/Portfolio/Tokens/hooks/useTransformTokenTableData' -import TokensTable from 'pages/Portfolio/Tokens/Table/Table' import { TokensAllocationChart } from 'pages/Portfolio/Tokens/Table/TokensAllocationChart' -import { Flex } from 'ui/src' +import TokensTable from 'pages/Portfolio/Tokens/Table/TokensTable' +import { filterTokensBySearch } from 'pages/Portfolio/Tokens/utils/filterTokensBySearch' +import { memo, useMemo, useState } from 'react' +import { useTranslation } from 'react-i18next' +import { Flex, RemoveScroll, Text } from 'ui/src' +import { useEnabledChains } from 'uniswap/src/features/chains/hooks/useEnabledChains' import { PortfolioBalance } from 'uniswap/src/features/portfolio/PortfolioBalance/PortfolioBalance' import { InterfacePageName } from 'uniswap/src/features/telemetry/constants' import Trace from 'uniswap/src/features/telemetry/Trace' +import { parseChainFromTokenSearchQuery } from 'uniswap/src/utils/search/parseChainFromTokenSearchQuery' + +const TokenCountIndicator = memo(({ count }: { count: number }) => { + const { t } = useTranslation() + + return ( + + + + {t('portfolio.tokens.balance.totalTokens', { numTokens: count })} + + + ) +}) + +TokenCountIndicator.displayName = 'TokenCountIndicator' export default function PortfolioTokens() { - const account = useAccount() - const tokenData = useTransformTokenTableData() + const portfolioAddress = usePortfolioAddress() + const { t } = useTranslation() + const [search, setSearch] = useState('') + const { chains: enabledChains } = useEnabledChains() + const { chainId: urlChainId } = usePortfolioParams() + + // Parse search query to extract chain filter and search term + const { chainFilter, searchTerm } = useMemo(() => { + return parseChainFromTokenSearchQuery(search, enabledChains) + }, [search, enabledChains]) + + // Use URL chain ID as primary filter, search chain filter as fallback + const effectiveChainId = urlChainId || chainFilter + + // Get token data filtered by chain at API level + const { + visible: tokenData, + hidden: hiddenTokenData, + loading, + refetching, + networkStatus, + error, + } = useTransformTokenTableData({ + chainIds: effectiveChainId ? [effectiveChainId] : undefined, + }) + + // Filter tokens by search term at client level (chain filtering is handled at API level) + const filteredTokenData = useMemo(() => { + return filterTokensBySearch({ tokens: tokenData || [], searchTerm }) + // return filterTokensBySearch({ tokens: tokenData, searchTerm }) || [] + }, [tokenData, searchTerm]) + + const filteredHiddenTokenData = useMemo(() => { + return filterTokensBySearch({ tokens: hiddenTokenData || [], searchTerm }) || [] + }, [hiddenTokenData, searchTerm]) return ( - - {account.address && ( + + - - - + + : undefined} + /> + + - + {(tokenData && tokenData.length > 0) || loading ? ( + <> + + {(filteredTokenData?.length ?? 0) > 0 || loading ? ( + - )} - + + ) } diff --git a/apps/web/src/pages/Portfolio/Tokens/hooks/useTransformTokenTableData.ts b/apps/web/src/pages/Portfolio/Tokens/hooks/useTransformTokenTableData.ts index 082c0562e57..2812331fa28 100644 --- a/apps/web/src/pages/Portfolio/Tokens/hooks/useTransformTokenTableData.ts +++ b/apps/web/src/pages/Portfolio/Tokens/hooks/useTransformTokenTableData.ts @@ -1,6 +1,9 @@ -import { useAccount } from 'hooks/useAccount' +import { NetworkStatus } from '@apollo/client' +import { usePortfolioAddress } from 'pages/Portfolio/hooks/usePortfolioAddress' import { useMemo } from 'react' +import { UniverseChainId } from 'uniswap/src/features/chains/types' import { useSortedPortfolioBalances } from 'uniswap/src/features/dataApi/balances/balances' +import type { PortfolioBalance } from 'uniswap/src/features/dataApi/types' import { CurrencyInfo } from 'uniswap/src/features/dataApi/types' import { useLocalizationContext } from 'uniswap/src/features/language/LocalizationContext' import { NumberType } from 'utilities/src/format/types' @@ -20,41 +23,54 @@ export interface TokenData { } // Custom hook to format portfolio data -export function useTransformTokenTableData(): TokenData[] { - const account = useAccount() - const { data: portfolioData, loading } = useSortedPortfolioBalances({ - evmAddress: account.address || undefined, - }) +export function useTransformTokenTableData({ chainIds }: { chainIds?: UniverseChainId[] }): { + visible: TokenData[] | null + hidden: TokenData[] | null + loading: boolean + refetching: boolean + error: Error | undefined + refetch: (() => void) | undefined + networkStatus: NetworkStatus +} { + const portfolioAddress = usePortfolioAddress() const { convertFiatAmountFormatted, formatNumberOrString } = useLocalizationContext() + const { + data: sortedBalances, + loading, + error, + refetch, + networkStatus, + } = useSortedPortfolioBalances({ + evmAddress: portfolioAddress, + chainIds, + }) + return useMemo(() => { - if (!account.address || !portfolioData?.balances || loading) { - return [] + // Only show empty state on initial load, not during refetch + const isInitialLoading = loading && !sortedBalances + const isRefetching = loading && !!sortedBalances + + if (isInitialLoading) { + return { visible: null, hidden: null, loading, refetching: false, error, refetch, networkStatus } + } + + if (!sortedBalances) { + return { visible: [], hidden: [], loading, refetching: false, error, refetch, networkStatus } } // Compute total USD across visible balances to determine allocation per token - const totalUSD = portfolioData.balances.reduce((sum, b) => sum + (b.balanceUSD ?? 0), 0) + const totalUSDVisible = sortedBalances.balances.reduce((sum, b) => sum + (b.balanceUSD ?? 0), 0) - return portfolioData.balances.map((balance) => { - // Format price (using balanceUSD / quantity for now, could be improved with actual price data) + const mapBalanceToTokenData = (balance: PortfolioBalance, allocationFromTotal?: number): TokenData => { const price = balance.balanceUSD && balance.quantity > 0 ? convertFiatAmountFormatted(balance.balanceUSD / balance.quantity, NumberType.FiatTokenPrice) : '$0.00' - // Format balance quantity - const formattedBalance = formatNumberOrString({ - value: balance.quantity, - type: NumberType.TokenNonTx, - }) - - // Format USD value + const formattedBalance = formatNumberOrString({ value: balance.quantity, type: NumberType.TokenNonTx }) const value = convertFiatAmountFormatted(balance.balanceUSD, NumberType.PortfolioBalance) - // Allocation percentage of this token vs total portfolio USD (0..100) - const balanceUSD = balance.balanceUSD ?? 0 - const allocation = totalUSD > 0 ? (balanceUSD / totalUSD) * 100 : 0 - return { id: balance.id, currencyInfo: balance.currencyInfo, @@ -66,8 +82,18 @@ export function useTransformTokenTableData(): TokenData[] { }, value, rawValue: balance.balanceUSD, - allocation, + allocation: allocationFromTotal ?? 0, } + } + + const visible = sortedBalances.balances.map((b) => { + const balanceUSD = b.balanceUSD ?? 0 + const allocation = totalUSDVisible > 0 ? (balanceUSD / totalUSDVisible) * 100 : 0 + return mapBalanceToTokenData(b, allocation) }) - }, [account.address, portfolioData?.balances, loading, convertFiatAmountFormatted, formatNumberOrString]) + + const hidden = sortedBalances.hiddenBalances.map((b) => mapBalanceToTokenData(b, 0)) + + return { visible, hidden, loading, refetching: isRefetching, refetch, networkStatus, error } + }, [loading, sortedBalances, convertFiatAmountFormatted, formatNumberOrString, error, refetch, networkStatus]) } diff --git a/apps/web/src/pages/Portfolio/Tokens/utils/filterTokensBySearch.test.ts b/apps/web/src/pages/Portfolio/Tokens/utils/filterTokensBySearch.test.ts new file mode 100644 index 00000000000..ab64034b7bb --- /dev/null +++ b/apps/web/src/pages/Portfolio/Tokens/utils/filterTokensBySearch.test.ts @@ -0,0 +1,280 @@ +import { Currency } from '@uniswap/sdk-core' +import { filterTokensBySearch } from 'pages/Portfolio/Tokens/utils/filterTokensBySearch' +import { TEST_TOKEN_1 } from 'test-utils/constants' + +// Mock the doesTokenMatchSearchTerm function to have full control over test scenarios +vi.mock('uniswap/src/utils/search/doesTokenMatchSearchTerm', () => ({ + doesTokenMatchSearchTerm: vi.fn(), +})) + +import { doesTokenMatchSearchTerm } from 'uniswap/src/utils/search/doesTokenMatchSearchTerm' + +const mockDoesTokenMatchSearchTerm = vi.mocked(doesTokenMatchSearchTerm) + +// Test data factory functions using test tokens +const createMockCurrencyInfo = ( + overrides: Partial<{ currencyId: string; currency: Currency }> = {}, +): { currencyId: string; currency: Currency } => ({ + currencyId: 'TEST', + currency: TEST_TOKEN_1, // Default to TEST_TOKEN_1 + ...overrides, +}) + +const createMockTokenWithInfo = ( + overrides: Partial<{ currencyInfo: { currencyId: string; currency: Currency } | null }> = {}, +): { currencyInfo: { currencyId: string; currency: Currency } | null } => ({ + currencyInfo: createMockCurrencyInfo(), + ...overrides, +}) + +describe('filterTokensBySearch', () => { + beforeEach(() => { + vi.clearAllMocks() + }) + + describe('when searchTerm is empty or undefined', () => { + it('should return all tokens when searchTerm is undefined', () => { + const tokens = [createMockTokenWithInfo(), createMockTokenWithInfo()] + + const result = filterTokensBySearch({ + tokens, + searchTerm: undefined, + }) + + expect(result).toBe(tokens) + expect(mockDoesTokenMatchSearchTerm).not.toHaveBeenCalled() + }) + + it('should return all tokens when searchTerm is null', () => { + const tokens = [createMockTokenWithInfo(), createMockTokenWithInfo()] + + const result = filterTokensBySearch({ + tokens, + searchTerm: null, + }) + + expect(result).toBe(tokens) + expect(mockDoesTokenMatchSearchTerm).not.toHaveBeenCalled() + }) + + it('should return all tokens when searchTerm is empty string', () => { + const tokens = [createMockTokenWithInfo(), createMockTokenWithInfo()] + + const result = filterTokensBySearch({ + tokens, + searchTerm: '', + }) + + expect(result).toBe(tokens) + expect(mockDoesTokenMatchSearchTerm).not.toHaveBeenCalled() + }) + + it('should return all tokens when searchTerm is only whitespace', () => { + const tokens = [createMockTokenWithInfo(), createMockTokenWithInfo()] + + const result = filterTokensBySearch({ + tokens, + searchTerm: ' ', + }) + + expect(result).toBe(tokens) + expect(mockDoesTokenMatchSearchTerm).not.toHaveBeenCalled() + }) + }) + + describe('when tokens array is undefined', () => { + it('should return undefined when tokens is undefined', () => { + const result = filterTokensBySearch({ + tokens: undefined, + searchTerm: 'test', + }) + + expect(result).toBeUndefined() + expect(mockDoesTokenMatchSearchTerm).not.toHaveBeenCalled() + }) + }) + + describe('when tokens array is empty', () => { + it('should return empty array when tokens is empty', () => { + const result = filterTokensBySearch({ + tokens: [], + searchTerm: 'test', + }) + + expect(result).toEqual([]) + expect(mockDoesTokenMatchSearchTerm).not.toHaveBeenCalled() + }) + }) + + describe('when filtering with valid search term', () => { + it('should filter tokens based on doesTokenMatchSearchTerm results', () => { + const token1 = createMockTokenWithInfo() + const token2 = createMockTokenWithInfo() + const token3 = createMockTokenWithInfo() + const tokens = [token1, token2, token3] + + // Mock the search function to return different results for each token + mockDoesTokenMatchSearchTerm + .mockReturnValueOnce(true) // token1 matches + .mockReturnValueOnce(false) // token2 doesn't match + .mockReturnValueOnce(true) // token3 matches + + const result = filterTokensBySearch({ + tokens, + searchTerm: 'test', + }) + + expect(result).toEqual([token1, token3]) + expect(mockDoesTokenMatchSearchTerm).toHaveBeenCalledTimes(3) + expect(mockDoesTokenMatchSearchTerm).toHaveBeenCalledWith(token1, 'test') + expect(mockDoesTokenMatchSearchTerm).toHaveBeenCalledWith(token2, 'test') + expect(mockDoesTokenMatchSearchTerm).toHaveBeenCalledWith(token3, 'test') + }) + + it('should return empty array when no tokens match', () => { + const token1 = createMockTokenWithInfo() + const token2 = createMockTokenWithInfo() + const tokens = [token1, token2] + + mockDoesTokenMatchSearchTerm.mockReturnValueOnce(false).mockReturnValueOnce(false) + + const result = filterTokensBySearch({ + tokens, + searchTerm: 'nonexistent', + }) + + expect(result).toEqual([]) + expect(mockDoesTokenMatchSearchTerm).toHaveBeenCalledTimes(2) + }) + + it('should return all tokens when all tokens match', () => { + const token1 = createMockTokenWithInfo() + const token2 = createMockTokenWithInfo() + const tokens = [token1, token2] + + mockDoesTokenMatchSearchTerm.mockReturnValueOnce(true).mockReturnValueOnce(true) + + const result = filterTokensBySearch({ + tokens, + searchTerm: 'common', + }) + + expect(result).toEqual(tokens) + expect(mockDoesTokenMatchSearchTerm).toHaveBeenCalledTimes(2) + }) + }) + + describe('with different token types', () => { + it('should work with tokens that have currencyInfo', () => { + const token = createMockTokenWithInfo({ + currencyInfo: createMockCurrencyInfo({ + currencyId: 'ABC', + currency: TEST_TOKEN_1, // Use TEST_TOKEN_1 (symbol: 'ABC', name: 'Abc') + }), + }) + + mockDoesTokenMatchSearchTerm.mockReturnValue(true) + + const result = filterTokensBySearch({ + tokens: [token], + searchTerm: 'abc', + }) + + expect(result).toEqual([token]) + expect(mockDoesTokenMatchSearchTerm).toHaveBeenCalledWith(token, 'abc') + }) + + it('should work with tokens that have null currencyInfo', () => { + const token = createMockTokenWithInfo({ + currencyInfo: null, + }) + + mockDoesTokenMatchSearchTerm.mockReturnValue(false) + + const result = filterTokensBySearch({ + tokens: [token], + searchTerm: 'test', + }) + + expect(result).toEqual([]) + expect(mockDoesTokenMatchSearchTerm).toHaveBeenCalledWith(token, 'test') + }) + }) + + describe('edge cases', () => { + it('should handle single token array', () => { + const token = createMockTokenWithInfo() + mockDoesTokenMatchSearchTerm.mockReturnValue(true) + + const result = filterTokensBySearch({ + tokens: [token], + searchTerm: 'test', + }) + + expect(result).toEqual([token]) + expect(mockDoesTokenMatchSearchTerm).toHaveBeenCalledTimes(1) + }) + + it('should preserve original array reference when no filtering occurs', () => { + const tokens = [createMockTokenWithInfo()] + + const result = filterTokensBySearch({ + tokens, + searchTerm: undefined, + }) + + expect(result).toBe(tokens) + }) + + it('should handle search term with special characters', () => { + const token = createMockTokenWithInfo() + mockDoesTokenMatchSearchTerm.mockReturnValue(true) + + const result = filterTokensBySearch({ + tokens: [token], + searchTerm: 'test@#$%^&*()', + }) + + expect(result).toEqual([token]) + expect(mockDoesTokenMatchSearchTerm).toHaveBeenCalledWith(token, 'test@#$%^&*()') + }) + + it('should handle very long search terms', () => { + const token = createMockTokenWithInfo() + const longSearchTerm = 'a'.repeat(1000) + mockDoesTokenMatchSearchTerm.mockReturnValue(false) + + const result = filterTokensBySearch({ + tokens: [token], + searchTerm: longSearchTerm, + }) + + expect(result).toEqual([]) + expect(mockDoesTokenMatchSearchTerm).toHaveBeenCalledWith(token, longSearchTerm) + }) + }) + + describe('type safety', () => { + it('should work with generic token types', () => { + interface ExtendedToken { + currencyInfo: { currencyId: string; currency: Currency } | null + customProperty: string + } + + const extendedToken: ExtendedToken = { + currencyInfo: createMockCurrencyInfo(), + customProperty: 'test', + } + + mockDoesTokenMatchSearchTerm.mockReturnValue(true) + + const result = filterTokensBySearch({ + tokens: [extendedToken], + searchTerm: 'test', + }) + + expect(result).toEqual([extendedToken]) + expect(mockDoesTokenMatchSearchTerm).toHaveBeenCalledWith(extendedToken, 'test') + }) + }) +}) diff --git a/apps/web/src/pages/Portfolio/Tokens/utils/filterTokensBySearch.ts b/apps/web/src/pages/Portfolio/Tokens/utils/filterTokensBySearch.ts new file mode 100644 index 00000000000..7fa87992045 --- /dev/null +++ b/apps/web/src/pages/Portfolio/Tokens/utils/filterTokensBySearch.ts @@ -0,0 +1,28 @@ +import { Currency } from '@uniswap/sdk-core' +import { doesTokenMatchSearchTerm } from 'uniswap/src/utils/search/doesTokenMatchSearchTerm' + +/** + * Filters tokens based on search criteria (name, symbol, address, chain name). + * This is a pure utility function for client-side filtering. + * + * @param tokens - Array of tokens to filter + * @param searchTerm - Search term to match against + * @param enabledChains - Array of enabled chain IDs to search within + * @returns Filtered array of tokens that match the search criteria + */ +export function filterTokensBySearch({ + tokens, + searchTerm, +}: { + tokens: T[] | undefined + searchTerm: string | undefined | null +}): T[] | undefined { + const trimmedSearchTerm = searchTerm?.trim() + if (!trimmedSearchTerm) { + return tokens + } + + return tokens?.filter((token) => { + return doesTokenMatchSearchTerm(token, trimmedSearchTerm) + }) +} diff --git a/apps/web/src/pages/Portfolio/hooks/usePortfolioAddress.ts b/apps/web/src/pages/Portfolio/hooks/usePortfolioAddress.ts new file mode 100644 index 00000000000..b3909dc2a0d --- /dev/null +++ b/apps/web/src/pages/Portfolio/hooks/usePortfolioAddress.ts @@ -0,0 +1,13 @@ +/* eslint-disable-next-line no-restricted-imports, no-restricted-syntax */ +import { useAccount } from 'hooks/useAccount' + +// This is the address used for the disconnected demo view. It is only used in the disconnected state for the portfolio page. +const DEMO_WALLET_ADDRESS = '0x8796207d877194d97a2c360c041f13887896FC79' + +export function usePortfolioAddress() { + const account = useAccount() + if (!account.address) { + return DEMO_WALLET_ADDRESS + } + return account.address +} diff --git a/apps/web/src/pages/Positions/ClaimFees.anvil.e2e.test.ts b/apps/web/src/pages/Positions/ClaimFees.anvil.e2e.test.ts index 1d50f7b36b5..670e989ec5c 100644 --- a/apps/web/src/pages/Positions/ClaimFees.anvil.e2e.test.ts +++ b/apps/web/src/pages/Positions/ClaimFees.anvil.e2e.test.ts @@ -1,4 +1,4 @@ -import { getPosition } from '@uniswap/client-pools/dist/pools/v1/api-PoolsService_connectquery' +import { getPosition } from '@uniswap/client-data-api/dist/data/v1/api-DataApiService_connectquery' import { createExpectSingleTransaction } from 'playwright/anvil/transactions' import { expect, getTest } from 'playwright/fixtures' import { DEFAULT_TEST_GAS_LIMIT, stubTradingApiEndpoint } from 'playwright/fixtures/tradingApi' diff --git a/apps/web/src/pages/Positions/PositionPage.tsx b/apps/web/src/pages/Positions/PositionPage.tsx index 44a4eda09fb..5f923abfd40 100644 --- a/apps/web/src/pages/Positions/PositionPage.tsx +++ b/apps/web/src/pages/Positions/PositionPage.tsx @@ -1,7 +1,8 @@ import { BigNumber } from '@ethersproject/bignumber' -import { Position, PositionStatus, ProtocolVersion } from '@uniswap/client-pools/dist/pools/v1/types_pb' +import { Position, PositionStatus, ProtocolVersion } from '@uniswap/client-data-api/dist/data/v1/poolTypes_pb' import { Currency, CurrencyAmount, Percent, Price } from '@uniswap/sdk-core' import { GraphQLApi } from '@universe/api' +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import { BreadcrumbNavContainer, BreadcrumbNavLink } from 'components/BreadcrumbNav' import { WrappedLiquidityPositionRangeChart } from 'components/Charts/LiquidityPositionRangeChart/LiquidityPositionRangeChart' import { Dropdown } from 'components/Dropdowns/Dropdown' @@ -56,8 +57,6 @@ import { getChainInfo } from 'uniswap/src/features/chains/chainInfo' import { useSupportedChainId } from 'uniswap/src/features/chains/hooks/useSupportedChainId' import { EVMUniverseChainId, UniverseChainId } from 'uniswap/src/features/chains/types' import { CurrencyInfo } from 'uniswap/src/features/dataApi/types' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' import { useLocalizationContext } from 'uniswap/src/features/language/LocalizationContext' import { isEVMChain } from 'uniswap/src/features/platforms/utils/chains' import { InterfacePageName } from 'uniswap/src/features/telemetry/constants' diff --git a/apps/web/src/pages/Positions/TopPools.tsx b/apps/web/src/pages/Positions/TopPools.tsx index 18a5f69a9ff..92b14c1ebe2 100644 --- a/apps/web/src/pages/Positions/TopPools.tsx +++ b/apps/web/src/pages/Positions/TopPools.tsx @@ -2,6 +2,7 @@ import { PoolSortFields } from 'appGraphql/data/pools/useTopPools' import { OrderDirection } from 'appGraphql/data/util' import { ExploreStatsResponse } from '@uniswap/client-explore/dist/uniswap/explore/v1/service_pb' import { ALL_NETWORKS_ARG } from '@universe/api' +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import { ExternalArrowLink } from 'components/Liquidity/ExternalArrowLink' import { useAccount } from 'hooks/useAccount' import { TopPoolsSection } from 'pages/Positions/TopPoolsSection' @@ -10,8 +11,6 @@ import { useTopPools } from 'state/explore/topPools' import { Flex, useMedia } from 'ui/src' import { useExploreStatsQuery } from 'uniswap/src/data/rest/exploreStats' import { UniverseChainId } from 'uniswap/src/features/chains/types' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' const MAX_BOOSTED_POOLS = 3 diff --git a/apps/web/src/pages/Positions/V2PositionPage.tsx b/apps/web/src/pages/Positions/V2PositionPage.tsx index 40cf64e6e4e..1b79fdd6bc5 100644 --- a/apps/web/src/pages/Positions/V2PositionPage.tsx +++ b/apps/web/src/pages/Positions/V2PositionPage.tsx @@ -1,4 +1,5 @@ -import { ProtocolVersion } from '@uniswap/client-pools/dist/pools/v1/types_pb' +import { ProtocolVersion } from '@uniswap/client-data-api/dist/data/v1/poolTypes_pb' +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import { BreadcrumbNavContainer, BreadcrumbNavLink } from 'components/BreadcrumbNav' import { useGetPoolTokenPercentage } from 'components/Liquidity/hooks/useGetPoolTokenPercentage' import { LiquidityPositionInfo, LiquidityPositionInfoLoader } from 'components/Liquidity/LiquidityPositionInfo' @@ -25,8 +26,6 @@ import { useGetPositionQuery } from 'uniswap/src/data/rest/getPosition' import { getChainInfo } from 'uniswap/src/features/chains/chainInfo' import { useSupportedChainId } from 'uniswap/src/features/chains/hooks/useSupportedChainId' import { UniverseChainId } from 'uniswap/src/features/chains/types' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' import { useLocalizationContext } from 'uniswap/src/features/language/LocalizationContext' import { isEVMChain } from 'uniswap/src/features/platforms/utils/chains' import { useUSDCValue } from 'uniswap/src/features/transactions/hooks/useUSDCPrice' diff --git a/apps/web/src/pages/Positions/index.tsx b/apps/web/src/pages/Positions/index.tsx index 4fb2229256b..43c75054aeb 100644 --- a/apps/web/src/pages/Positions/index.tsx +++ b/apps/web/src/pages/Positions/index.tsx @@ -1,4 +1,5 @@ -import { PositionStatus, ProtocolVersion } from '@uniswap/client-pools/dist/pools/v1/types_pb' +import { PositionStatus, ProtocolVersion } from '@uniswap/client-data-api/dist/data/v1/poolTypes_pb' +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import PROVIDE_LIQUIDITY from 'assets/images/provideLiquidity.png' import tokenLogo from 'assets/images/token-logo.png' import V4_HOOK from 'assets/images/v4Hooks.png' @@ -34,8 +35,6 @@ import { uniswapUrls } from 'uniswap/src/constants/urls' import { useGetPositionsInfiniteQuery } from 'uniswap/src/data/rest/getPositions' import { useEnabledChains } from 'uniswap/src/features/chains/hooks/useEnabledChains' import { UniverseChainId } from 'uniswap/src/features/chains/types' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' import { Platform } from 'uniswap/src/features/platforms/types/Platform' import { InterfacePageName, UniswapEventName } from 'uniswap/src/features/telemetry/constants' import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send' diff --git a/apps/web/src/pages/RemoveLiquidity/RemoveLiquidity.anvil.e2e.test.ts b/apps/web/src/pages/RemoveLiquidity/RemoveLiquidity.anvil.e2e.test.ts index 155481bbbbd..60cdd4784fb 100644 --- a/apps/web/src/pages/RemoveLiquidity/RemoveLiquidity.anvil.e2e.test.ts +++ b/apps/web/src/pages/RemoveLiquidity/RemoveLiquidity.anvil.e2e.test.ts @@ -1,4 +1,4 @@ -import { getPosition } from '@uniswap/client-pools/dist/pools/v1/api-PoolsService_connectquery' +import { getPosition } from '@uniswap/client-data-api/dist/data/v1/api-DataApiService_connectquery' import { ONE_MILLION_USDT } from 'playwright/anvil/utils' import { expect, getTest } from 'playwright/fixtures' import { stubTradingApiEndpoint } from 'playwright/fixtures/tradingApi' diff --git a/apps/web/src/pages/RemoveLiquidity/RemoveLiquidityModalContext.tsx b/apps/web/src/pages/RemoveLiquidity/RemoveLiquidityModalContext.tsx index 7dab6197615..0a558e17485 100644 --- a/apps/web/src/pages/RemoveLiquidity/RemoveLiquidityModalContext.tsx +++ b/apps/web/src/pages/RemoveLiquidity/RemoveLiquidityModalContext.tsx @@ -1,4 +1,4 @@ -import { ProtocolVersion } from '@uniswap/client-pools/dist/pools/v1/types_pb' +import { ProtocolVersion } from '@uniswap/client-data-api/dist/data/v1/poolTypes_pb' import { Currency } from '@uniswap/sdk-core' import { getCurrencyWithOptionalUnwrap } from 'components/Liquidity/utils/currency' import { useModalInitialState } from 'hooks/useModalInitialState' diff --git a/apps/web/src/pages/RemoveLiquidity/RemoveLiquidityReview.tsx b/apps/web/src/pages/RemoveLiquidity/RemoveLiquidityReview.tsx index 4e219497812..5ad7f04a845 100644 --- a/apps/web/src/pages/RemoveLiquidity/RemoveLiquidityReview.tsx +++ b/apps/web/src/pages/RemoveLiquidity/RemoveLiquidityReview.tsx @@ -1,4 +1,4 @@ -import { ProtocolVersion } from '@uniswap/client-pools/dist/pools/v1/types_pb' +import { ProtocolVersion } from '@uniswap/client-data-api/dist/data/v1/poolTypes_pb' import { CurrencyAmount } from '@uniswap/sdk-core' import { getLPBaseAnalyticsProperties } from 'components/Liquidity/analytics' import { useGetPoolTokenPercentage } from 'components/Liquidity/hooks/useGetPoolTokenPercentage' diff --git a/apps/web/src/pages/RemoveLiquidity/hooks/useRemoveLiquidityTxAndGasInfo.ts b/apps/web/src/pages/RemoveLiquidity/hooks/useRemoveLiquidityTxAndGasInfo.ts index c64e786d904..7ddeb195330 100644 --- a/apps/web/src/pages/RemoveLiquidity/hooks/useRemoveLiquidityTxAndGasInfo.ts +++ b/apps/web/src/pages/RemoveLiquidity/hooks/useRemoveLiquidityTxAndGasInfo.ts @@ -1,4 +1,4 @@ -import { ProtocolVersion } from '@uniswap/client-pools/dist/pools/v1/types_pb' +import { ProtocolVersion } from '@uniswap/client-data-api/dist/data/v1/poolTypes_pb' import { TradingApi } from '@universe/api' import { getTokenOrZeroAddress } from 'components/Liquidity/utils/currency' import { getProtocolItems } from 'components/Liquidity/utils/protocolVersion' diff --git a/apps/web/src/pages/RouteDefinitions.tsx b/apps/web/src/pages/RouteDefinitions.tsx index 794e24ecd46..675c2e7fd5f 100644 --- a/apps/web/src/pages/RouteDefinitions.tsx +++ b/apps/web/src/pages/RouteDefinitions.tsx @@ -1,3 +1,4 @@ +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import { getExploreDescription, getExploreTitle } from 'pages/getExploreTitle' import { getAddLiquidityPageTitle, getPositionPageDescription, getPositionPageTitle } from 'pages/getPositionPageTitle' // High-traffic pages (index and /swap) should not be lazy-loaded. @@ -7,8 +8,6 @@ import { lazy, ReactNode, Suspense, useMemo } from 'react' import { matchPath, Navigate, Route, Routes, useLocation } from 'react-router' import { CHROME_EXTENSION_UNINSTALL_URL_PATH } from 'uniswap/src/constants/urls' import { WRAPPED_SOL_ADDRESS_SOLANA } from 'uniswap/src/features/chains/svm/defaults' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' import { EXTENSION_PASSKEY_AUTH_PATH } from 'uniswap/src/features/passkey/constants' import i18n from 'uniswap/src/i18n' import { isBrowserRouterEnabled } from 'utils/env' diff --git a/apps/web/src/pages/Swap/Buy/Buy.e2e.test.ts b/apps/web/src/pages/Swap/Buy/Buy.e2e.test.ts index 5a725eb6dc7..2feb4d89169 100644 --- a/apps/web/src/pages/Swap/Buy/Buy.e2e.test.ts +++ b/apps/web/src/pages/Swap/Buy/Buy.e2e.test.ts @@ -1,5 +1,7 @@ import { expect, getTest } from 'playwright/fixtures' +import { stubTradingApiEndpoint } from 'playwright/fixtures/tradingApi' import { Mocks } from 'playwright/mocks/mocks' +import { uniswapUrls } from 'uniswap/src/constants/urls' import { TestID } from 'uniswap/src/test/fixtures/testIDs' const test = getTest() @@ -20,6 +22,7 @@ test.describe('Buy Crypto Form', () => { }) } + await stubTradingApiEndpoint({ page, endpoint: uniswapUrls.tradingApiPaths.quote }) await page.goto('/buy') // Wait for wallet to be connected diff --git a/apps/web/src/pages/Swap/Buy/hooks.ts b/apps/web/src/pages/Swap/Buy/hooks.ts index 975c5d00a40..41d10539e82 100644 --- a/apps/web/src/pages/Swap/Buy/hooks.ts +++ b/apps/web/src/pages/Swap/Buy/hooks.ts @@ -1,4 +1,5 @@ import { useMeldSupportedCurrencyToCurrencyInfo } from 'appGraphql/data/types' +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import { useMemo } from 'react' import { useTranslation } from 'react-i18next' import { useSearchParams } from 'react-router' @@ -17,8 +18,6 @@ import { FORCountry, OffRampTransferDetailsRequest, } from 'uniswap/src/features/fiatOnRamp/types' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' // biome-ignore lint/style/noRestrictedImports: Buy hooks need direct SDK imports import { getFiatCurrencyComponents } from 'utilities/src/format/localeBased' diff --git a/apps/web/src/pages/Swap/Fees.anvil.e2e.test.ts b/apps/web/src/pages/Swap/Fees.anvil.e2e.test.ts index cda699f73ca..9ba01796841 100644 --- a/apps/web/src/pages/Swap/Fees.anvil.e2e.test.ts +++ b/apps/web/src/pages/Swap/Fees.anvil.e2e.test.ts @@ -10,6 +10,7 @@ const test = getTest({ withAnvil: true }) test.describe('Fees', () => { test('swaps ETH for USDC exact-in with swap fee', async ({ page, anvil }) => { await stubTradingApiEndpoint({ page, endpoint: uniswapUrls.tradingApiPaths.swap }) + await stubTradingApiEndpoint({ page, endpoint: uniswapUrls.tradingApiPaths.quote }) await page.goto(`/swap?inputCurrency=ETH&outputCurrency=${USDC_MAINNET.address}`) diff --git a/apps/web/src/pages/Swap/Fees.e2e.test.ts b/apps/web/src/pages/Swap/Fees.e2e.test.ts index 2c6564b3a16..c7b33190f5d 100644 --- a/apps/web/src/pages/Swap/Fees.e2e.test.ts +++ b/apps/web/src/pages/Swap/Fees.e2e.test.ts @@ -1,15 +1,16 @@ +import { Layers, PriceUxUpdateProperties } from '@universe/gating' import { expect, getTest } from 'playwright/fixtures' import { stubTradingApiEndpoint } from 'playwright/fixtures/tradingApi' import { Mocks } from 'playwright/mocks/mocks' import { DAI, USDC_MAINNET } from 'uniswap/src/constants/tokens' import { uniswapUrls } from 'uniswap/src/constants/urls' -import { Layers, PriceUxUpdateProperties } from 'uniswap/src/features/gating/experiments' import { TestID } from 'uniswap/src/test/fixtures/testIDs' const test = getTest() test.describe('Fees', () => { test('should not display fee on swaps without fees', async ({ page }) => { + await stubTradingApiEndpoint({ page, endpoint: uniswapUrls.tradingApiPaths.quote }) await page.goto(`/swap?inputCurrency=${DAI.address}&outputCurrency=${USDC_MAINNET.address}`) // Enter amount @@ -23,6 +24,7 @@ test.describe('Fees', () => { }) test('displays UniswapX fee in UI', async ({ page }) => { + await stubTradingApiEndpoint({ page, endpoint: uniswapUrls.tradingApiPaths.quote }) await stubTradingApiEndpoint({ page, endpoint: uniswapUrls.tradingApiPaths.swap }) await page.goto( diff --git a/apps/web/src/pages/Swap/Limit/LimitForm.tsx b/apps/web/src/pages/Swap/Limit/LimitForm.tsx index 6ae17550be7..762c656b716 100644 --- a/apps/web/src/pages/Swap/Limit/LimitForm.tsx +++ b/apps/web/src/pages/Swap/Limit/LimitForm.tsx @@ -1,5 +1,6 @@ import { Currency, CurrencyAmount, Token } from '@uniswap/sdk-core' import { UNIVERSAL_ROUTER_ADDRESS, UniversalRouterVersion } from '@uniswap/universal-router-sdk' +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import { useAccountDrawer } from 'components/AccountDrawer/MiniPortfolio/hooks' import { OpenLimitOrdersButton } from 'components/AccountDrawer/MiniPortfolio/Limits/OpenLimitOrdersButton' import { MenuStateVariant, useSetMenu } from 'components/AccountDrawer/menuState' @@ -40,8 +41,6 @@ import { uniswapUrls } from 'uniswap/src/constants/urls' import { LIMIT_SUPPORTED_CHAINS } from 'uniswap/src/features/chains/chainInfo' import { useIsSupportedChainId } from 'uniswap/src/features/chains/hooks/useSupportedChainId' import { getPrimaryStablecoin } from 'uniswap/src/features/chains/utils' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' import { useLocalizationContext } from 'uniswap/src/features/language/LocalizationContext' import { isEVMChain } from 'uniswap/src/features/platforms/utils/chains' import { useIsMismatchAccountQuery } from 'uniswap/src/features/smartWallet/mismatch/hooks' diff --git a/apps/web/src/pages/Swap/Logging.anvil.e2e.test.ts b/apps/web/src/pages/Swap/Logging.anvil.e2e.test.ts index 0c679d6bb32..ff6221750f6 100644 --- a/apps/web/src/pages/Swap/Logging.anvil.e2e.test.ts +++ b/apps/web/src/pages/Swap/Logging.anvil.e2e.test.ts @@ -16,6 +16,7 @@ test.describe('Time-to-swap logging', () => { anvil, }) => { await stubTradingApiEndpoint({ page, endpoint: uniswapUrls.tradingApiPaths.swap }) + await stubTradingApiEndpoint({ page, endpoint: uniswapUrls.tradingApiPaths.quote }) await page.goto(`/swap?inputCurrency=ETH&outputCurrency=${USDC_MAINNET.address}`) const expectMultipleTransactions = createExpectMultipleTransactions({ diff --git a/apps/web/src/pages/Swap/Send/NewAddressSpeedBump.test.tsx b/apps/web/src/pages/Swap/Send/NewAddressSpeedBump.test.tsx index 7c2a01a89ad..35ef25f0b89 100644 --- a/apps/web/src/pages/Swap/Send/NewAddressSpeedBump.test.tsx +++ b/apps/web/src/pages/Swap/Send/NewAddressSpeedBump.test.tsx @@ -22,8 +22,9 @@ const mockSendContext: SendContextType = { setSendState: vi.fn(), } -vi.mock('uniswap/src/features/gating/hooks', () => { +vi.mock('@universe/gating', async (importOriginal) => { return { + ...(await importOriginal()), useFeatureFlag: vi.fn(), getFeatureFlag: vi.fn(), } diff --git a/apps/web/src/pages/Swap/Send/SendForm.tsx b/apps/web/src/pages/Swap/Send/SendForm.tsx index 064fc5844a0..69a680ca15e 100644 --- a/apps/web/src/pages/Swap/Send/SendForm.tsx +++ b/apps/web/src/pages/Swap/Send/SendForm.tsx @@ -13,7 +13,6 @@ import { useTranslation } from 'react-i18next' import { useSendContext } from 'state/send/SendContext' import { CurrencyState } from 'state/swap/types' import { Button, Flex } from 'ui/src' -import { checkIsBridgedAsset } from 'uniswap/src/components/BridgedAsset/utils' import { GetHelpHeader } from 'uniswap/src/components/dialog/GetHelpHeader' import { uniswapUrls } from 'uniswap/src/constants/urls' import { useActiveAddress, useConnectionStatus } from 'uniswap/src/features/accounts/store/hooks' @@ -114,7 +113,7 @@ function SendFormInner({ disableTokenInputs = false, onCurrencyChange }: SendFor const { tokenWarningDismissed: isCompatibleAddressDismissed } = useDismissedCompatibleAddressWarnings( inputCurrencyInfo?.currency, ) - const isUnichainBridgedAsset = checkIsBridgedAsset(inputCurrencyInfo ?? undefined) && !isCompatibleAddressDismissed + const isUnichainBridgedAsset = Boolean(inputCurrencyInfo?.isBridged) && !isCompatibleAddressDismissed const { isSmartContractAddress, loading: loadingSmartContractAddress } = useIsSmartContractAddress( recipientData?.address, diff --git a/apps/web/src/pages/Swap/Swap.anvil.e2e.test.ts b/apps/web/src/pages/Swap/Swap.anvil.e2e.test.ts index cc58e9a32fd..974ec8a1d6c 100644 --- a/apps/web/src/pages/Swap/Swap.anvil.e2e.test.ts +++ b/apps/web/src/pages/Swap/Swap.anvil.e2e.test.ts @@ -48,6 +48,7 @@ test.describe('Swap', () => { test('should swap ETH to USDC', async ({ page, anvil }) => { await stubTradingApiEndpoint({ page, endpoint: uniswapUrls.tradingApiPaths.swap }) + await stubTradingApiEndpoint({ page, endpoint: uniswapUrls.tradingApiPaths.quote }) await page.goto('/swap') await page.getByTestId(TestID.ChooseOutputToken).click() @@ -68,6 +69,8 @@ test.describe('Swap', () => { }) test('should be able to swap token with FOT warning via TDP', async ({ page, anvil }) => { + await stubTradingApiEndpoint({ page, endpoint: uniswapUrls.tradingApiPaths.quote }) + await page.route(`${uniswapUrls.tradingApiUrl}/v1/swap`, async (route) => { const request = route.request() const postData = request.postDataJSON() @@ -111,6 +114,8 @@ test.describe('Swap', () => { }) test('should bridge from ETH to L2', async ({ page, anvil }) => { + await stubTradingApiEndpoint({ page, endpoint: uniswapUrls.tradingApiPaths.swap }) + await stubTradingApiEndpoint({ page, endpoint: uniswapUrls.tradingApiPaths.quote }) await page.goto(`/swap?inputCurrency=ETH`) await page.getByTestId(TestID.ChooseOutputToken).click() await page.getByTestId(`token-option-${UniverseChainId.Base}-ETH`).first().click() @@ -122,6 +127,7 @@ test.describe('Swap', () => { ).toBeVisible() await page.getByTestId(TestID.AmountInputIn).click() await page.getByTestId(TestID.AmountInputIn).fill('1') + await expect(page.getByTestId(TestID.ReviewSwap)).toBeEnabled() await page.getByTestId(TestID.ReviewSwap).click() await page.getByTestId(TestID.Confirm).click() await page.getByTestId(TestID.Swap).click() @@ -198,7 +204,7 @@ test.describe('Swap', () => { await page.getByTestId(TestID.ReviewSwap).click() await page.getByTestId(TestID.Swap).click() - await expect(page.getByText('Sign Message')).not.toBeVisible() + await expect(page.getByText('Sign message')).not.toBeVisible() await expect(page.getByText('Approved')).toBeVisible() await expect(page.getByText('Swapped')).toBeVisible() }) @@ -239,48 +245,48 @@ test.describe('Swap', () => { await page.getByTestId(TestID.Swap).click() await expect(page.getByText('Reset USDT limit')).toBeVisible() - await expect(page.getByText('Sign Message')).toBeVisible() + await expect(page.getByText('Sign message')).toBeVisible() await expect(page.getByText('Approved')).toBeVisible() await expect(page.getByText('Swapped')).toBeVisible() }) test('prompts signature when existing permit approval is expired', async ({ page, anvil }) => { + await stubTradingApiEndpoint({ page, endpoint: uniswapUrls.tradingApiPaths.swap }) + await anvil.setErc20Balance({ address: assume0xAddress(USDT.address), balance: ONE_MILLION_USDT }) await anvil.setPermit2Allowance({ owner: TEST_WALLET_ADDRESS, token: assume0xAddress(USDT.address), spender: assume0xAddress(UNIVERSAL_ROUTER_ADDRESS(UniversalRouterVersion.V2_0, UniverseChainId.Mainnet)), expiration: Math.floor((Date.now() - 1) / 1000), }) - await stubTradingApiEndpoint({ page, endpoint: uniswapUrls.tradingApiPaths.swap }) - await anvil.setErc20Balance({ address: assume0xAddress(USDT.address), balance: ONE_MILLION_USDT }) await page.goto(`/swap?inputCurrency=${USDT.address}&outputCurrency=ETH`) await page.getByTestId(TestID.AmountInputIn).click() await page.getByTestId(TestID.AmountInputIn).fill('10') await page.getByTestId(TestID.ReviewSwap).click() await page.getByTestId(TestID.Swap).click() + await expect(page.getByText('Sign message')).toBeVisible() await expect(page.getByText('Approved')).toBeVisible() - await expect(page.getByText('Sign Message')).toBeVisible() await expect(page.getByText('Swapped')).toBeVisible() }) test('prompts signature when existing permit approval amount is too low', async ({ page, anvil }) => { + await stubTradingApiEndpoint({ page, endpoint: uniswapUrls.tradingApiPaths.swap }) + await anvil.setErc20Balance({ address: assume0xAddress(USDT.address), balance: ONE_MILLION_USDT }) await anvil.setPermit2Allowance({ owner: TEST_WALLET_ADDRESS, token: assume0xAddress(USDT.address), spender: assume0xAddress(UNIVERSAL_ROUTER_ADDRESS(UniversalRouterVersion.V2_0, UniverseChainId.Mainnet)), amount: 1n, }) - await stubTradingApiEndpoint({ page, endpoint: uniswapUrls.tradingApiPaths.swap }) - await anvil.setErc20Balance({ address: assume0xAddress(USDT.address), balance: ONE_MILLION_USDT }) await page.goto(`/swap?inputCurrency=${USDT.address}&outputCurrency=ETH`) await page.getByTestId(TestID.AmountInputIn).click() await page.getByTestId(TestID.AmountInputIn).fill('10') await page.getByTestId(TestID.ReviewSwap).click() await page.getByTestId(TestID.Swap).click() + await expect(page.getByText('Sign message')).toBeVisible() await expect(page.getByText('Approved')).toBeVisible() - await expect(page.getByText('Sign Message')).toBeVisible() await expect(page.getByText('Swapped')).toBeVisible() }) }) diff --git a/apps/web/src/pages/Swap/index.tsx b/apps/web/src/pages/Swap/index.tsx index c17bb5ba55a..a06928cb810 100644 --- a/apps/web/src/pages/Swap/index.tsx +++ b/apps/web/src/pages/Swap/index.tsx @@ -1,5 +1,6 @@ import { PrefetchBalancesWrapper } from 'appGraphql/data/apollo/AdaptiveTokenBalancesProvider' import type { Currency } from '@uniswap/sdk-core' +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import { useAccountDrawer } from 'components/AccountDrawer/MiniPortfolio/hooks' import { SwapBottomCard } from 'components/SwapBottomCard' import { SwitchLocaleLink } from 'components/SwitchLocaleLink' @@ -28,10 +29,8 @@ import type { AppTFunction } from 'ui/src/i18n/types' import { zIndexes } from 'ui/src/theme' import { useUniswapContext } from 'uniswap/src/contexts/UniswapContext' import { useIsModeMismatch } from 'uniswap/src/features/chains/hooks/useEnabledChains' -import type { UniverseChainId } from 'uniswap/src/features/chains/types' +import { UniverseChainId } from 'uniswap/src/features/chains/types' import { RampDirection } from 'uniswap/src/features/fiatOnRamp/types' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' import { useGetPasskeyAuthStatus } from 'uniswap/src/features/passkey/hooks/useGetPasskeyAuthStatus' import { WebFORNudgeProvider } from 'uniswap/src/features/providers/webForNudgeProvider' import { InterfaceEventName, InterfacePageName, ModalName } from 'uniswap/src/features/telemetry/constants' @@ -49,6 +48,7 @@ import { SwapDependenciesStoreContextProvider } from 'uniswap/src/features/trans import { SwapFormStoreContextProvider } from 'uniswap/src/features/transactions/swap/stores/swapFormStore/SwapFormStoreContextProvider' import type { SwapFormState } from 'uniswap/src/features/transactions/swap/stores/swapFormStore/types' import { currencyToAsset } from 'uniswap/src/features/transactions/swap/utils/asset' +import { TransactionState } from 'uniswap/src/features/transactions/types/transactionState' import { CurrencyField } from 'uniswap/src/types/currency' import { SwapTab } from 'uniswap/src/types/screens/interface' import { isMobileWeb } from 'utilities/src/platform' @@ -66,7 +66,8 @@ export default function SwapPage() { const { initialInputCurrency, initialOutputCurrency, - initialChainId, + initialInputChainId, + initialOutputChainId, initialTypedValue, initialField, triggerConnect, @@ -84,9 +85,10 @@ export default function SwapPage() { void initialInputCurrency?: Currency initialOutputCurrency?: Currency + initialOutputChainId?: UniverseChainId initialTypedValue?: string initialIndependentField?: CurrencyField syncTabToUrl: boolean @@ -137,7 +158,7 @@ export function Swap({ const { isSwapTokenSelectorOpen, swapOutputChainId } = useUniswapContext() const isExplorePage = useIsPage(PageType.EXPLORE) - const isModeMismatch = useIsModeMismatch(chainId) + const isModeMismatch = useIsModeMismatch(initialInputChainId) const isSharedSwapDisabled = isModeMismatch && isExplorePage const input = currencyToAsset(initialInputCurrency) @@ -153,11 +174,16 @@ export function Swap({ selectingCurrencyField: isSwapTokenSelectorOpen ? CurrencyField.OUTPUT : undefined, selectingCurrencyChainId: swapOutputChainId, skipFocusOnCurrencyField: isMobileWeb, - filteredChainIdsOverride: usePersistedFilteredChainIds ? persistedFilteredChainIds : undefined, + filteredChainIdsOverride: getFilteredChainIdsOverride({ + initialInputChainId, + initialOutputChainId, + usePersistedFilteredChainIds, + persistedFilteredChainIds, + }), }) return ( - + ): AnvilConfig { port: overrides?.port ?? parseInt(process.env.ANVIL_PORT ?? '8545'), host: overrides?.host ?? '127.0.0.1', forkUrl: overrides?.forkUrl ?? buildForkUrl(), - timeout: overrides?.timeout ?? 5000, - healthCheckInterval: overrides?.healthCheckInterval ?? 10000, + timeout: overrides?.timeout ?? 10_000, + healthCheckInterval: overrides?.healthCheckInterval ?? 10_000, logFile: overrides?.logFile ?? path.join(process.cwd(), `anvil-test-${process.pid}.log`), } } diff --git a/apps/web/src/playwright/fixtures/anvil.ts b/apps/web/src/playwright/fixtures/anvil.ts index d80cd8c8bc4..91fcab8dffb 100644 --- a/apps/web/src/playwright/fixtures/anvil.ts +++ b/apps/web/src/playwright/fixtures/anvil.ts @@ -10,7 +10,9 @@ import { ZERO_ADDRESS } from 'uniswap/src/constants/misc' import { DAI, USDT } from 'uniswap/src/constants/tokens' import { UniverseChainId } from 'uniswap/src/features/chains/types' import { assume0xAddress } from 'utils/wagmi' -import { Address, erc20Abi } from 'viem' +import { type Address, erc20Abi } from 'viem' + +const SNAPSHOTS_ENABLED = process.env.ENABLE_ANVIL_SNAPSHOTS === 'true' class WalletError extends Error { code?: number @@ -162,6 +164,11 @@ const createAnvilClient = () => { await client.mine({ blocks: 1 }) }, + /** + * @deprecated + * Wagmi submits transactions to Anvil via the RPC interface so this function no longer intercepts + * the requests. Use createRejectableMockConnector instead. + */ async setTransactionRejection() { // Override the wallet actions to reject transactions const originalRequest = client.request @@ -219,7 +226,9 @@ export const test = base.extend<{ anvil: AnvilClient; delegateToZeroAddress?: vo // Take snapshot for test isolation let snapshotId: `0x${string}` | undefined try { - snapshotId = await testAnvil.snapshot() + if (SNAPSHOTS_ENABLED) { + snapshotId = await testAnvil.snapshot() + } } catch (error) { if (isTimeoutError(error)) { // Anvil timed out during snapshot, restart and retry diff --git a/apps/web/src/playwright/fixtures/tradingApi.ts b/apps/web/src/playwright/fixtures/tradingApi.ts index b84f79de3b1..0092111e8b4 100644 --- a/apps/web/src/playwright/fixtures/tradingApi.ts +++ b/apps/web/src/playwright/fixtures/tradingApi.ts @@ -1,6 +1,6 @@ // biome-ignore lint/style/noRestrictedImports: Trading API fixtures need direct Playwright imports import { test as base } from '@playwright/test' -import { Page } from 'playwright/test' +import { type Page } from 'playwright/test' import { uniswapUrls } from 'uniswap/src/constants/urls' export const DEFAULT_TEST_GAS_LIMIT = '20000000' @@ -54,7 +54,15 @@ export async function stubTradingApiEndpoint({ }) const responseText = await response.text() - let responseJson = JSON.parse(responseText) + let responseJson + try { + responseJson = JSON.parse(responseText) + } catch (parseError) { + throw new Error(`Failed to parse trading API response for ${endpoint}. Response: ${responseText}`, { + cause: parseError, + }) + } + // Set a high gas limit to avoid OutOfGas if (endpoint === uniswapUrls.tradingApiPaths.swap) { responseJson.swap.gasLimit = DEFAULT_TEST_GAS_LIMIT diff --git a/apps/web/src/setupTests.ts b/apps/web/src/setupTests.ts index 9ede1b601e6..27620e661a8 100644 --- a/apps/web/src/setupTests.ts +++ b/apps/web/src/setupTests.ts @@ -10,6 +10,7 @@ import { WalletName, WalletReadyState, } from '@solana/wallet-adapter-base' +import { useFeatureFlag } from '@universe/gating' import { useWeb3React } from '@web3-react/core' import { config as loadEnv } from 'dotenv' import failOnConsole from 'jest-fail-on-console' @@ -19,7 +20,6 @@ import { Readable } from 'stream' import { toBeVisible } from 'test-utils/matchers' import { mocked } from 'test-utils/mocked' import { UniverseChainId } from 'uniswap/src/features/chains/types' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' import { setupi18n } from 'uniswap/src/i18n/i18n-setup-interface' import { mockLocalizationContext } from 'uniswap/src/test/mocks/locale' import { TextDecoder, TextEncoder } from 'util' @@ -390,10 +390,9 @@ failOnConsole({ }, }) -vi.mock('uniswap/src/features/gating/hooks', async () => { - const genMock = await vi.importActual('uniswap/src/features/gating/hooks') +vi.mock('@universe/gating', async (importOriginal) => { return { - ...genMock, + ...(await importOriginal()), useFeatureFlag: vi.fn(), useFeatureFlagWithLoading: vi.fn(), getFeatureFlag: vi.fn(), diff --git a/apps/web/src/state/activity/polling/transactions.ts b/apps/web/src/state/activity/polling/transactions.ts index 4bbbb3fae73..417397b7707 100644 --- a/apps/web/src/state/activity/polling/transactions.ts +++ b/apps/web/src/state/activity/polling/transactions.ts @@ -1,4 +1,5 @@ import { TradingApi } from '@universe/api' +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import { useAccount } from 'hooks/useAccount' import useCurrentBlockTimestamp from 'hooks/useCurrentBlockTimestamp' import useBlockNumber from 'lib/hooks/useBlockNumber' @@ -13,8 +14,6 @@ import { isPendingTx } from 'state/transactions/utils' import { TradingApiClient } from 'uniswap/src/data/apiClients/tradingApi/TradingApiClient' import { getChainInfo } from 'uniswap/src/features/chains/chainInfo' import { RetryOptions, UniverseChainId } from 'uniswap/src/features/chains/types' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' import { InterfaceEventName } from 'uniswap/src/features/telemetry/constants' import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send' import { checkedTransaction } from 'uniswap/src/features/transactions/slice' diff --git a/apps/web/src/state/explore/protocolStats.test.tsx b/apps/web/src/state/explore/protocolStats.test.tsx index 0c94c9521fb..55ee77f344a 100644 --- a/apps/web/src/state/explore/protocolStats.test.tsx +++ b/apps/web/src/state/explore/protocolStats.test.tsx @@ -1,14 +1,13 @@ import { ProtocolStatsResponse } from '@uniswap/client-explore/dist/uniswap/explore/v1/service_pb' +import { useFeatureFlagWithLoading } from '@universe/gating' import { ExploreContext } from 'state/explore' import { use24hProtocolVolume, useDailyTVLWithChange } from 'state/explore/protocolStats' import { render, screen } from 'test-utils/render' -import * as GatingHooks from 'uniswap/src/features/gating/hooks' import type { Mock } from 'vitest' -vi.mock('uniswap/src/features/gating/hooks', async () => { - const actual = await vi.importActual('uniswap/src/features/gating/hooks') +vi.mock('@universe/gating', async (importOriginal) => { return { - ...actual, + ...(await importOriginal()), useFeatureFlagWithLoading: vi.fn(() => ({ value: true, isLoading: false })), // Ensure mock returns value immediately } }) @@ -57,7 +56,7 @@ const TestComponent24HrTVL = () => { } beforeEach(() => { - ;(GatingHooks.useFeatureFlagWithLoading as Mock).mockReturnValue({ value: true, isLoading: false }) + ;(useFeatureFlagWithLoading as Mock).mockReturnValue({ value: true, isLoading: false }) }) describe('use24hProtocolVolume', () => { diff --git a/apps/web/src/state/explore/topPools.ts b/apps/web/src/state/explore/topPools.ts index b8f97566868..980f69ad586 100644 --- a/apps/web/src/state/explore/topPools.ts +++ b/apps/web/src/state/explore/topPools.ts @@ -5,8 +5,8 @@ import { PoolTableSortState, } from 'appGraphql/data/pools/useTopPools' import { OrderDirection } from 'appGraphql/data/util' +import { ProtocolVersion } from '@uniswap/client-data-api/dist/data/v1/poolTypes_pb' import { ExploreStatsResponse, PoolStats } from '@uniswap/client-explore/dist/uniswap/explore/v1/service_pb' -import { ProtocolVersion } from '@uniswap/client-pools/dist/pools/v1/types_pb' import { exploreSearchStringAtom } from 'components/Tokens/state' import { useAtomValue } from 'jotai/utils' import { useContext, useMemo } from 'react' diff --git a/apps/web/src/state/limit/hooks.ts b/apps/web/src/state/limit/hooks.ts index d63821e61f4..5e04da2d683 100644 --- a/apps/web/src/state/limit/hooks.ts +++ b/apps/web/src/state/limit/hooks.ts @@ -1,4 +1,5 @@ import { Currency, CurrencyAmount, Price, TradeType } from '@uniswap/sdk-core' +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import { useAccount } from 'hooks/useAccount' import JSBI from 'jsbi' import { useCurrencyBalances } from 'lib/hooks/useCurrencyBalance' @@ -13,8 +14,6 @@ import { getUSDCostPerGas, isClassicTrade } from 'state/routing/utils' import { useSwapAndLimitContext } from 'state/swap/useSwapContext' import { nativeOnChain } from 'uniswap/src/constants/tokens' import { getStablecoinsForChain, isUniverseChainId } from 'uniswap/src/features/chains/utils' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' import { isEVMChain, isSVMChain } from 'uniswap/src/features/platforms/utils/chains' import { CurrencyField } from 'uniswap/src/types/currency' diff --git a/apps/web/src/state/routing/useRoutingAPITrade.test.ts b/apps/web/src/state/routing/useRoutingAPITrade.test.ts index f535380851d..208225f4531 100644 --- a/apps/web/src/state/routing/useRoutingAPITrade.test.ts +++ b/apps/web/src/state/routing/useRoutingAPITrade.test.ts @@ -24,8 +24,9 @@ vi.mock('./slice', () => { } }) vi.mock('state/user/hooks') -vi.mock('uniswap/src/features/gating/hooks', () => { +vi.mock('@universe/gating', async (importOriginal) => { return { + ...(await importOriginal()), useFeatureFlag: vi.fn(), useExperimentValue: vi.fn(), getFeatureFlag: vi.fn(), diff --git a/apps/web/src/state/sagas/liquidity/liquiditySaga.ts b/apps/web/src/state/sagas/liquidity/liquiditySaga.ts index 492091bf334..1f96ff38e72 100644 --- a/apps/web/src/state/sagas/liquidity/liquiditySaga.ts +++ b/apps/web/src/state/sagas/liquidity/liquiditySaga.ts @@ -5,7 +5,6 @@ import { import { getLiquidityEventName } from 'components/Liquidity/analytics' import { popupRegistry } from 'components/Popups/registry' import { PopupType } from 'components/Popups/types' -import type { HandleOnChainStepParams } from 'state/sagas/transactions/utils' import { getDisplayableError, handleApprovalTransactionStep, @@ -34,7 +33,7 @@ import type { } from 'uniswap/src/features/transactions/liquidity/steps/migrate' import type { LiquidityAction, ValidatedLiquidityTxContext } from 'uniswap/src/features/transactions/liquidity/types' import { LiquidityTransactionType } from 'uniswap/src/features/transactions/liquidity/types' -import type { TransactionStep } from 'uniswap/src/features/transactions/steps/types' +import type { HandleOnChainStepParams, TransactionStep } from 'uniswap/src/features/transactions/steps/types' import { TransactionStepType } from 'uniswap/src/features/transactions/steps/types' import type { SetCurrentStepFn } from 'uniswap/src/features/transactions/swap/types/swapCallback' import type { diff --git a/apps/web/src/state/sagas/root.ts b/apps/web/src/state/sagas/root.ts index 7ebf0f49ac1..88b64fae9a5 100644 --- a/apps/web/src/state/sagas/root.ts +++ b/apps/web/src/state/sagas/root.ts @@ -4,10 +4,12 @@ import { swapSaga } from 'state/sagas/transactions/swapSaga' import { watchTransactionsSaga } from 'state/sagas/transactions/watcherSaga' import { wrapSaga } from 'state/sagas/transactions/wrapSaga' import { call, spawn } from 'typed-redux-saga' +import { planSaga } from 'uniswap/src/features/transactions/swap/plan/planSaga' import { waitForRehydration } from 'uniswap/src/utils/saga' const sagas = [ swapSaga.wrappedSaga, + planSaga.wrappedSaga, wrapSaga.wrappedSaga, liquiditySaga.wrappedSaga, watchTransactionsSaga.wrappedSaga, diff --git a/apps/web/src/state/sagas/transactions/5792.ts b/apps/web/src/state/sagas/transactions/5792.ts index 30f39529ce0..f10eed438aa 100644 --- a/apps/web/src/state/sagas/transactions/5792.ts +++ b/apps/web/src/state/sagas/transactions/5792.ts @@ -4,12 +4,12 @@ import { popupRegistry } from 'components/Popups/registry' import { PopupType } from 'components/Popups/types' import { wagmiConfig } from 'components/Web3Provider/wagmiConfig' import { getRoutingForTransaction } from 'state/activity/utils' -import { getSigner, HandleOnChainStepParams, watchForInterruption } from 'state/sagas/transactions/utils' +import { getSigner, watchForInterruption } from 'state/sagas/transactions/utils' import { handleGetCapabilities } from 'state/walletCapabilities/lib/handleGetCapabilities' import { setCapabilitiesByChain } from 'state/walletCapabilities/reducer' import { call, put } from 'typed-redux-saga' import { addTransaction } from 'uniswap/src/features/transactions/slice' -import { OnChainTransactionStepBatched } from 'uniswap/src/features/transactions/steps/types' +import { HandleOnChainStepParams, OnChainTransactionStepBatched } from 'uniswap/src/features/transactions/steps/types' import { InterfaceTransactionDetails, TransactionOriginType, diff --git a/apps/web/src/state/sagas/transactions/solana.ts b/apps/web/src/state/sagas/transactions/solana.ts index 7451e96e51a..2ff23ceb5ac 100644 --- a/apps/web/src/state/sagas/transactions/solana.ts +++ b/apps/web/src/state/sagas/transactions/solana.ts @@ -5,9 +5,10 @@ import { PopupType } from 'components/Popups/types' import { signSolanaTransactionWithCurrentWallet } from 'components/Web3Provider/signSolanaTransaction' import store from 'state' import { getSwapTransactionInfo } from 'state/sagas/transactions/utils' -import { call } from 'typed-redux-saga' +import { call, delay, spawn } from 'typed-redux-saga' import { JupiterApiClient } from 'uniswap/src/data/apiClients/jupiterApi/JupiterFetchClient' import { UniverseChainId } from 'uniswap/src/features/chains/types' +import { refetchRestQueriesViaOnchainOverrideVariant } from 'uniswap/src/features/portfolio/portfolioUpdates/rest/refetchRestQueriesViaOnchainOverrideVariantSaga' import { SwapEventName } from 'uniswap/src/features/telemetry/constants/features' import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send' import { JupiterExecuteError } from 'uniswap/src/features/transactions/errors' @@ -16,9 +17,15 @@ import { ExtractedBaseTradeAnalyticsProperties } from 'uniswap/src/features/tran import { SolanaTrade } from 'uniswap/src/features/transactions/swap/types/solana' import { ValidatedSolanaSwapTxAndGasInfo } from 'uniswap/src/features/transactions/swap/types/swapTxAndGasInfo' import { SwapEventType, timestampTracker } from 'uniswap/src/features/transactions/swap/utils/SwapEventTimestampTracker' -import { TransactionOriginType, TransactionStatus } from 'uniswap/src/features/transactions/types/transactionDetails' +import { + InterfaceBaseTransactionDetails, + SolanaTransactionDetails, + TransactionOriginType, + TransactionStatus, +} from 'uniswap/src/features/transactions/types/transactionDetails' import { SignerMnemonicAccountDetails } from 'uniswap/src/features/wallet/types/AccountDetails' import { tryCatch } from 'utilities/src/errors' +import { ONE_SECOND_MS } from 'utilities/src/time/time' type JupiterSwapParams = { account: SignerMnemonicAccountDetails @@ -49,27 +56,52 @@ async function signAndSendJupiterSwap({ return result } -function updateAppState({ hash, trade, from }: { hash: string; trade: SolanaTrade; from: string }) { +function* refetchBalancesWithDelay({ + transaction, + activeAddress, +}: { + transaction: SolanaTransactionDetails + activeAddress: string +}) { + // Wait 3 seconds before refetching. + // This is because at this point the transaction hasn't been fully confirmed yet, + // and it should take 1-2 seconds for the balance to update onchain. + yield* delay(3 * ONE_SECOND_MS) + + yield* call(refetchRestQueriesViaOnchainOverrideVariant, { + transaction, + activeAddress, + apolloClient: null, + }) +} + +function* updateAppState({ hash, trade, from }: { hash: string; trade: SolanaTrade; from: string }) { const typeInfo = getSwapTransactionInfo(trade) - store.dispatch( - addTransaction({ - from, - typeInfo, - hash, - chainId: UniverseChainId.Solana, - routing: TradingApi.Routing.JUPITER, - status: TransactionStatus.Success, - addedTime: Date.now(), - id: hash, - transactionOriginType: TransactionOriginType.Internal, - options: { - request: {}, - }, - }), - ) + const transaction: SolanaTransactionDetails = { + from, + typeInfo, + hash, + chainId: UniverseChainId.Solana, + routing: TradingApi.Routing.JUPITER, + status: TransactionStatus.Success, + addedTime: Date.now(), + id: hash, + transactionOriginType: TransactionOriginType.Internal, + options: { + request: {}, + }, + } + + store.dispatch(addTransaction(transaction)) popupRegistry.addPopup({ type: PopupType.Transaction, hash }, hash) + + // Spawn background task to refetch balances after a delay + yield* spawn(refetchBalancesWithDelay, { + transaction, + activeAddress: from, + }) } function createJupiterSwap(signSolanaTransaction: (tx: VersionedTransaction) => Promise) { @@ -92,7 +124,7 @@ function createJupiterSwap(signSolanaTransaction: (tx: VersionedTransaction) => throw new JupiterExecuteError(errorMessage ?? 'Unknown Jupiter Execution Error', code) } - updateAppState({ hash, trade, from: account.address }) + yield* call(updateAppState, { hash, trade, from: account.address }) return hash } diff --git a/apps/web/src/state/sagas/transactions/swapSaga.ts b/apps/web/src/state/sagas/transactions/swapSaga.ts index 2187773687e..f24c0bcfe3c 100644 --- a/apps/web/src/state/sagas/transactions/swapSaga.ts +++ b/apps/web/src/state/sagas/transactions/swapSaga.ts @@ -1,5 +1,6 @@ import { useTotalBalancesUsdForAnalytics } from 'appGraphql/data/apollo/useTotalBalancesUsdForAnalytics' import { TradingApi } from '@universe/api' +import { Experiments } from '@universe/gating' import { popupRegistry } from 'components/Popups/registry' import { PopupType } from 'components/Popups/types' import { DEFAULT_TXN_DISMISS_MS, L2_TXN_DISMISS_MS, ZERO_PERCENT } from 'constants/misc' @@ -16,7 +17,6 @@ import { handleUniswapXSignatureStep } from 'state/sagas/transactions/uniswapx' import { getDisplayableError, getSwapTransactionInfo, - HandleOnChainStepParams, handleApprovalTransactionStep, handleOnChainStep, handlePermitTransactionStep, @@ -24,24 +24,31 @@ import { } from 'state/sagas/transactions/utils' import { VitalTxFields } from 'state/transactions/types' import invariant from 'tiny-invariant' -import { call } from 'typed-redux-saga' +import { call, SagaGenerator } from 'typed-redux-saga' import { isL2ChainId } from 'uniswap/src/features/chains/utils' import { useLocalizationContext } from 'uniswap/src/features/language/LocalizationContext' import { isSVMChain } from 'uniswap/src/features/platforms/utils/chains' import { SwapEventName } from 'uniswap/src/features/telemetry/constants' import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send' import { SwapTradeBaseProperties } from 'uniswap/src/features/telemetry/types' +import { logExperimentQualifyingEvent } from 'uniswap/src/features/telemetry/utils/logExperimentQualifyingEvent' import { selectSwapStartTimestamp } from 'uniswap/src/features/timing/selectors' import { updateSwapStartTimestamp } from 'uniswap/src/features/timing/slice' import { UnexpectedTransactionStateError } from 'uniswap/src/features/transactions/errors' -import { TransactionStep, TransactionStepType } from 'uniswap/src/features/transactions/steps/types' +import { + HandleOnChainStepParams, + HandleSwapStepParams, + TransactionStep, + TransactionStepType, +} from 'uniswap/src/features/transactions/steps/types' import { ExtractedBaseTradeAnalyticsProperties, getBaseTradeAnalyticsProperties, } from 'uniswap/src/features/transactions/swap/analytics' -import { FLASHBLOCKS_UI_SKIP_ROUTES } from 'uniswap/src/features/transactions/swap/components/UnichainInstantBalanceModal/constants' -import { getIsFlashblocksEnabled } from 'uniswap/src/features/transactions/swap/hooks/useIsUnichainFlashblocksEnabled' +import { getFlashblocksExperimentStatus } from 'uniswap/src/features/transactions/swap/hooks/useIsUnichainFlashblocksEnabled' import { useV4SwapEnabled } from 'uniswap/src/features/transactions/swap/hooks/useV4SwapEnabled' +import { planSaga } from 'uniswap/src/features/transactions/swap/plan/planSaga' +import { handleSwitchChains } from 'uniswap/src/features/transactions/swap/plan/utils' import { SwapTransactionStep, SwapTransactionStepAsync, @@ -54,10 +61,15 @@ import { SwapCallbackParams, } from 'uniswap/src/features/transactions/swap/types/swapCallback' import { PermitMethod, ValidatedSwapTxContext } from 'uniswap/src/features/transactions/swap/types/swapTxAndGasInfo' -import { BridgeTrade, ClassicTrade } from 'uniswap/src/features/transactions/swap/types/trade' +import { BridgeTrade, ChainedActionTrade, ClassicTrade } from 'uniswap/src/features/transactions/swap/types/trade' import { slippageToleranceToPercent } from 'uniswap/src/features/transactions/swap/utils/format' import { generateSwapTransactionSteps } from 'uniswap/src/features/transactions/swap/utils/generateSwapTransactionSteps' -import { isClassic, isJupiter, UNISWAPX_ROUTING_VARIANTS } from 'uniswap/src/features/transactions/swap/utils/routing' +import { + isClassic, + isJupiter, + requireRouting, + UNISWAPX_ROUTING_VARIANTS, +} from 'uniswap/src/features/transactions/swap/utils/routing' import { getClassicQuoteFromResponse } from 'uniswap/src/features/transactions/swap/utils/tradingApi' import { useWallet } from 'uniswap/src/features/wallet/hooks/useWallet' import { @@ -68,14 +80,7 @@ import { createSaga } from 'uniswap/src/utils/saga' import { logger } from 'utilities/src/logger/logger' import { useTrace } from 'utilities/src/telemetry/trace/TraceContext' -interface HandleSwapStepParams extends Omit { - step: SwapTransactionStep | SwapTransactionStepAsync - signature?: string - trade: ClassicTrade | BridgeTrade - analytics: ExtractedBaseTradeAnalyticsProperties - onTransactionHash?: (hash: string) => void -} -function* handleSwapTransactionStep(params: HandleSwapStepParams) { +function* handleSwapTransactionStep(params: HandleSwapStepParams): SagaGenerator { const { trade, step, signature, analytics, onTransactionHash } = params const info = getSwapTransactionInfo(trade) @@ -103,14 +108,24 @@ function* handleSwapTransactionStep(params: HandleSwapStepParams) { handleSwapTransactionAnalytics({ ...params, hash }) - if ( - !getIsFlashblocksEnabled(trade.inputAmount.currency.chainId) || - FLASHBLOCKS_UI_SKIP_ROUTES.includes(trade.routing) - ) { + const chainId = trade.inputAmount.currency.chainId + const { shouldLogQualifyingEvent, shouldShowModal } = getFlashblocksExperimentStatus({ + chainId, + routing: trade.routing, + }) + + if (shouldLogQualifyingEvent) { + logExperimentQualifyingEvent({ + experiment: Experiments.UnichainFlashblocksModal, + }) + } + + // Show regular popup for control variant or ineligible swaps + if (!shouldShowModal) { popupRegistry.addPopup( { type: PopupType.Transaction, hash }, hash, - isL2ChainId(trade.inputAmount.currency.chainId) ? L2_TXN_DISMISS_MS : DEFAULT_TXN_DISMISS_MS, + isL2ChainId(chainId) ? L2_TXN_DISMISS_MS : DEFAULT_TXN_DISMISS_MS, ) } @@ -119,7 +134,7 @@ function* handleSwapTransactionStep(params: HandleSwapStepParams) { onTransactionHash(hash) } - return + return hash } interface HandleSwapBatchedStepParams extends Omit { @@ -149,7 +164,7 @@ function* handleSwapTransactionBatchedStep(params: HandleSwapBatchedStepParams) } function handleSwapTransactionAnalytics(params: { - trade: ClassicTrade | BridgeTrade + trade: ClassicTrade | BridgeTrade | ChainedActionTrade analytics: SwapTradeBaseProperties hash?: string batchId?: string @@ -208,31 +223,6 @@ type SwapParams = { v4Enabled: boolean } -/** Asserts that a given object fits a given routing variant. */ -function requireRouting( - val: V, - routing: readonly T[], -): asserts val is V & { routing: T } { - if (!routing.includes(val.routing as T)) { - throw new UnexpectedTransactionStateError(`Expected routing ${routing}, got ${val.routing}`) - } -} - -/** Switches to the proper chain, if needed. If a chain switch is necessary and it fails, returns success=false. */ -async function handleSwitchChains( - params: Pick, -): Promise<{ chainSwitchFailed: boolean }> { - const { selectChain, startChainId, swapTxContext } = params - - const swapChainId = swapTxContext.trade.inputAmount.currency.chainId - if (isJupiter(swapTxContext) || swapChainId === startChainId) { - return { chainSwitchFailed: false } - } - - const chainSwitched = await selectChain(swapChainId) - return { chainSwitchFailed: !chainSwitched } -} - function* swap(params: SwapParams) { const { account, @@ -247,7 +237,11 @@ function* swap(params: SwapParams) { } = params const { trade } = swapTxContext - const { chainSwitchFailed } = yield* call(handleSwitchChains, params) + const { chainSwitchFailed } = yield* call(handleSwitchChains, { + selectChain: params.selectChain, + startChainId: params.startChainId, + swapTxContext, + }) if (chainSwitchFailed) { onFailure() return @@ -408,7 +402,19 @@ export function useSwapCallback(): SwapCallback { updateSwapForm({ txHash: hash, txHashReceivedTime: Date.now() }) }, } - appDispatch(swapSaga.actions.trigger(swapParams)) + if (swapTxContext.trade.routing === TradingApi.Routing.CHAINED) { + appDispatch( + planSaga.actions.trigger({ + ...swapParams, + handleApprovalTransactionStep, + handleSwapTransactionStep, + handleSignatureStep, + getDisplayableError, + }), + ) + } else { + appDispatch(swapSaga.actions.trigger(swapParams)) + } const blockNumber = getClassicQuoteFromResponse(trade.quote)?.blockNumber?.toString() diff --git a/apps/web/src/state/sagas/transactions/uniswapx.ts b/apps/web/src/state/sagas/transactions/uniswapx.ts index fee5167d8bf..fe118260a6a 100644 --- a/apps/web/src/state/sagas/transactions/uniswapx.ts +++ b/apps/web/src/state/sagas/transactions/uniswapx.ts @@ -4,7 +4,6 @@ import { formatSwapSignedAnalyticsEventProperties } from 'lib/utils/analytics' import { addTransactionBreadcrumb, getSwapTransactionInfo, - HandleSignatureStepParams, handleSignatureStep, TransactionBreadcrumbStatus, } from 'state/sagas/transactions/utils' @@ -15,6 +14,7 @@ import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send' import { SwapTradeBaseProperties } from 'uniswap/src/features/telemetry/types' import { HandledTransactionInterrupt } from 'uniswap/src/features/transactions/errors' import { addTransaction } from 'uniswap/src/features/transactions/slice' +import { HandleSignatureStepParams } from 'uniswap/src/features/transactions/steps/types' import { UniswapXSignatureStep } from 'uniswap/src/features/transactions/swap/steps/signOrder' import { UniswapXTrade } from 'uniswap/src/features/transactions/swap/types/trade' import { slippageToleranceToPercent } from 'uniswap/src/features/transactions/swap/utils/format' diff --git a/apps/web/src/state/sagas/transactions/utils.ts b/apps/web/src/state/sagas/transactions/utils.ts index bd12ae770d0..1905efecf5a 100644 --- a/apps/web/src/state/sagas/transactions/utils.ts +++ b/apps/web/src/state/sagas/transactions/utils.ts @@ -3,6 +3,7 @@ import type { TransactionResponse } from '@ethersproject/abstract-provider' import type { JsonRpcSigner, Web3Provider } from '@ethersproject/providers' import { TradeType } from '@uniswap/sdk-core' import { FetchError, TradingApi } from '@universe/api' +import { BlockedAsyncSubmissionChainIdsConfigKey, DynamicConfigs, getDynamicConfigValue } from '@universe/gating' import { wagmiConfig } from 'components/Web3Provider/wagmiConfig' import { clientToProvider } from 'hooks/useEthersProvider' import ms from 'ms' @@ -15,8 +16,6 @@ import type { SagaGenerator } from 'typed-redux-saga' import { call, cancel, delay, fork, put, race, select, spawn, take } from 'typed-redux-saga' import { UniverseChainId } from 'uniswap/src/features/chains/types' import { isL2ChainId, isUniverseChainId } from 'uniswap/src/features/chains/utils' -import { BlockedAsyncSubmissionChainIdsConfigKey, DynamicConfigs } from 'uniswap/src/features/gating/configs' -import { getDynamicConfigValue } from 'uniswap/src/features/gating/hooks' import { ApprovalEditedInWalletError, HandledTransactionInterrupt, @@ -33,14 +32,21 @@ import type { TokenApprovalTransactionStep } from 'uniswap/src/features/transact import type { Permit2TransactionStep } from 'uniswap/src/features/transactions/steps/permit2Transaction' import type { TokenRevocationTransactionStep } from 'uniswap/src/features/transactions/steps/revoke' import type { + HandleApprovalStepParams, + HandleOnChainPermit2TransactionStep, + HandleOnChainStepParams, + HandleSignatureStepParams, OnChainTransactionStep, - SignatureTransactionStep, TransactionStep, } from 'uniswap/src/features/transactions/steps/types' import { TransactionStepType } from 'uniswap/src/features/transactions/steps/types' import { SolanaTrade } from 'uniswap/src/features/transactions/swap/types/solana' -import type { SetCurrentStepFn } from 'uniswap/src/features/transactions/swap/types/swapCallback' -import type { BridgeTrade, ClassicTrade, UniswapXTrade } from 'uniswap/src/features/transactions/swap/types/trade' +import type { + BridgeTrade, + ChainedActionTrade, + ClassicTrade, + UniswapXTrade, +} from 'uniswap/src/features/transactions/swap/types/trade' import { isUniswapX } from 'uniswap/src/features/transactions/swap/utils/routing' import type { ApproveTransactionInfo, @@ -75,12 +81,6 @@ export enum TransactionBreadcrumbStatus { Interrupted = 'interrupted', } -export interface HandleSignatureStepParams { - account: AccountDetails - step: T - setCurrentStep: SetCurrentStepFn - ignoreInterrupt?: boolean -} export function* handleSignatureStep({ setCurrentStep, step, ignoreInterrupt, account }: HandleSignatureStepParams) { // Add a watcher to check if the transaction flow is interrupted during this step const { throwIfInterrupted } = yield* watchForInterruption(ignoreInterrupt) @@ -107,20 +107,6 @@ export function* handleSignatureStep({ setCurrentStep, step, ignoreInterrupt, ac return signature } -export interface HandleOnChainStepParams { - account: AccountDetails - info: TransactionInfo - step: T - setCurrentStep: SetCurrentStepFn - /** Controls whether the function allow submitting a duplicate tx (a tx w/ identical `info` to another recent/pending tx). Defaults to false. */ - allowDuplicativeTx?: boolean - /** Controls whether the function should throw an error upon interrupt or not, defaults to `false`. */ - ignoreInterrupt?: boolean - /** Controls whether the function should wait to return until after the transaction has confirmed. Defaults to `true`. */ - shouldWaitForConfirmation?: boolean - /** Called when data returned from a submitted transaction differs from data originally sent to the wallet. */ - onModification?: (response: VitalTxFields) => void | Generator -} export function* handleOnChainStep(params: HandleOnChainStepParams) { const { account, @@ -350,15 +336,12 @@ function transformTransactionResponse(response: TransactionResponse | Transactio return { hash: response.hash, data: response.input, nonce: response.nonce } } -interface HandlePermitStepParams extends Omit, 'info'> {} -export function* handlePermitTransactionStep(params: HandlePermitStepParams) { +export function* handlePermitTransactionStep(params: HandleOnChainPermit2TransactionStep) { const { step } = params const info = getPermitTransactionInfo(step) return yield* call(handleOnChainStep, { ...params, info }) } -interface HandleApprovalStepParams - extends Omit, 'info'> {} export function* handleApprovalTransactionStep(params: HandleApprovalStepParams) { const { step, account } = params const info = getApprovalTransactionInfo(step) @@ -528,11 +511,11 @@ export async function getSigner(account: string): Promise { type SwapInfo = ExactInputSwapTransactionInfo | ExactOutputSwapTransactionInfo export function getSwapTransactionInfo( - trade: ClassicTrade | BridgeTrade | SolanaTrade, + trade: ClassicTrade | BridgeTrade | SolanaTrade | ChainedActionTrade, ): SwapInfo | BridgeTransactionInfo export function getSwapTransactionInfo(trade: UniswapXTrade): SwapInfo & { isUniswapXOrder: true } export function getSwapTransactionInfo( - trade: ClassicTrade | BridgeTrade | UniswapXTrade | SolanaTrade, + trade: ClassicTrade | BridgeTrade | UniswapXTrade | SolanaTrade | ChainedActionTrade, ): SwapInfo | BridgeTransactionInfo { if (trade.routing === TradingApi.Routing.BRIDGE) { return { diff --git a/apps/web/src/state/sagas/transactions/wrapSaga.ts b/apps/web/src/state/sagas/transactions/wrapSaga.ts index d2b767e6076..6dc3d46a298 100644 --- a/apps/web/src/state/sagas/transactions/wrapSaga.ts +++ b/apps/web/src/state/sagas/transactions/wrapSaga.ts @@ -6,10 +6,10 @@ import { useAccount } from 'hooks/useAccount' import useSelectChain from 'hooks/useSelectChain' import { useCallback } from 'react' import { useDispatch } from 'react-redux' -import { HandleOnChainStepParams, handleOnChainStep } from 'state/sagas/transactions/utils' +import { handleOnChainStep } from 'state/sagas/transactions/utils' import { call } from 'typed-redux-saga' import { isTestnetChain } from 'uniswap/src/features/chains/utils' -import { TransactionStepType } from 'uniswap/src/features/transactions/steps/types' +import { HandleOnChainStepParams, TransactionStepType } from 'uniswap/src/features/transactions/steps/types' import { WrapTransactionStep } from 'uniswap/src/features/transactions/steps/wrap' import { WrapCallback, WrapCallbackParams } from 'uniswap/src/features/transactions/swap/types/wrapCallback' import { TransactionType, WrapTransactionInfo } from 'uniswap/src/features/transactions/types/transactionDetails' diff --git a/apps/web/src/state/swap/hooks.test.tsx b/apps/web/src/state/swap/hooks.test.tsx index 2836b4d444d..516eda349ac 100644 --- a/apps/web/src/state/swap/hooks.test.tsx +++ b/apps/web/src/state/swap/hooks.test.tsx @@ -20,8 +20,9 @@ import { useEnabledChains } from 'uniswap/src/features/chains/hooks/useEnabledCh import { UniverseChainId } from 'uniswap/src/features/chains/types' import { CurrencyField } from 'uniswap/src/types/currency' -vi.mock('uniswap/src/features/gating/hooks', () => { +vi.mock('@universe/gating', async (importOriginal) => { return { + ...(await importOriginal()), useFeatureFlag: vi.fn(), getFeatureFlag: vi.fn(), } @@ -128,6 +129,91 @@ describe('hooks', () => { chainId: undefined, }) }) + + test('no query parameters', () => { + expect(queryParametersToCurrencyState(parse('', { parseArrays: false, ignoreQueryPrefix: true }))).toEqual({ + inputCurrencyAddress: undefined, + outputCurrencyAddress: undefined, + value: undefined, + field: undefined, + chainId: undefined, + outputChainId: undefined, + }) + }) + + test('only chain parameter, no currencies', () => { + expect( + queryParametersToCurrencyState(parse('?chain=optimism', { parseArrays: false, ignoreQueryPrefix: true })), + ).toEqual({ + inputCurrencyAddress: undefined, + outputCurrencyAddress: undefined, + value: undefined, + field: undefined, + chainId: UniverseChainId.Optimism, + outputChainId: undefined, + }) + }) + + test('only outputChain parameter, no currencies', () => { + expect( + queryParametersToCurrencyState(parse('?outputChain=base', { parseArrays: false, ignoreQueryPrefix: true })), + ).toEqual({ + inputCurrencyAddress: undefined, + outputCurrencyAddress: undefined, + value: undefined, + field: undefined, + chainId: undefined, + outputChainId: UniverseChainId.Base, + }) + }) + + test('both chain and outputChain parameters, no currencies', () => { + expect( + queryParametersToCurrencyState( + parse('?chain=mainnet&outputChain=optimism', { parseArrays: false, ignoreQueryPrefix: true }), + ), + ).toEqual({ + inputCurrencyAddress: undefined, + outputCurrencyAddress: undefined, + value: undefined, + field: undefined, + chainId: UniverseChainId.Mainnet, + outputChainId: UniverseChainId.Optimism, + }) + }) + + test('outputChain parameter with output currency', () => { + expect( + queryParametersToCurrencyState( + parse(`?outputChain=base&outputCurrency=${DAI.address}`, { parseArrays: false, ignoreQueryPrefix: true }), + ), + ).toEqual({ + inputCurrencyAddress: undefined, + outputCurrencyAddress: DAI.address, + value: undefined, + field: undefined, + chainId: undefined, + outputChainId: UniverseChainId.Base, + }) + }) + + test('both chain and outputChain with input and output currencies', () => { + expect( + queryParametersToCurrencyState( + parse(`?chain=mainnet&outputChain=optimism&inputCurrency=ETH&outputCurrency=${USDC_OPTIMISM.address}`, { + parseArrays: false, + ignoreQueryPrefix: true, + }), + ), + ).toEqual({ + inputCurrencyAddress: 'ETH', + outputCurrencyAddress: USDC_OPTIMISM.address, + value: undefined, + field: undefined, + chainId: UniverseChainId.Mainnet, + outputChainId: UniverseChainId.Optimism, + }) + }) }) describe('URL parameter serialization', () => { @@ -260,7 +346,7 @@ describe('hooks', () => { const { result: { - current: { initialInputCurrency, initialOutputCurrency, initialChainId }, + current: { initialInputCurrency, initialOutputCurrency, initialInputChainId: initialChainId }, }, } = renderHook(() => useInitialCurrencyState()) @@ -282,7 +368,7 @@ describe('hooks', () => { const { result: { - current: { initialInputCurrency, initialOutputCurrency, initialChainId }, + current: { initialInputCurrency, initialOutputCurrency, initialInputChainId: initialChainId }, }, } = renderHook(() => useInitialCurrencyState()) @@ -307,7 +393,13 @@ describe('hooks', () => { const { result: { - current: { initialInputCurrency, initialOutputCurrency, initialTypedValue, initialField, initialChainId }, + current: { + initialInputCurrency, + initialOutputCurrency, + initialTypedValue, + initialField, + initialInputChainId: initialChainId, + }, }, } = renderHook(() => useInitialCurrencyState()) @@ -328,7 +420,7 @@ describe('hooks', () => { const { result: { - current: { initialInputCurrency, initialOutputCurrency, initialChainId }, + current: { initialInputCurrency, initialOutputCurrency, initialInputChainId: initialChainId }, }, } = renderHook(() => useInitialCurrencyState()) @@ -391,7 +483,7 @@ describe('hooks', () => { const { result: { - current: { initialInputCurrency, initialChainId }, + current: { initialInputCurrency, initialInputChainId: initialChainId }, }, } = renderHook(() => useInitialCurrencyState()) @@ -417,7 +509,7 @@ describe('hooks', () => { const { result: { - current: { initialInputCurrency, initialOutputCurrency, initialChainId }, + current: { initialInputCurrency, initialOutputCurrency, initialInputChainId: initialChainId }, }, } = renderHook(() => useInitialCurrencyState()) @@ -444,7 +536,7 @@ describe('hooks', () => { const { result: { - current: { initialInputCurrency, initialChainId }, + current: { initialInputCurrency, initialInputChainId: initialChainId }, }, } = renderHook(() => useInitialCurrencyState()) @@ -463,7 +555,7 @@ describe('hooks', () => { const { result: { - current: { initialInputCurrency, initialOutputCurrency, initialChainId }, + current: { initialInputCurrency, initialOutputCurrency, initialInputChainId: initialChainId }, }, } = renderHook(() => useInitialCurrencyState()) @@ -482,7 +574,7 @@ describe('hooks', () => { const { result: { - current: { initialInputCurrency, initialOutputCurrency, initialChainId }, + current: { initialInputCurrency, initialOutputCurrency, initialInputChainId: initialChainId }, }, } = renderHook(() => useInitialCurrencyState()) @@ -504,7 +596,7 @@ describe('hooks', () => { const { result: { - current: { initialInputCurrency, initialOutputCurrency, initialChainId }, + current: { initialInputCurrency, initialOutputCurrency, initialInputChainId: initialChainId }, }, } = renderHook(() => useInitialCurrencyState()) diff --git a/apps/web/src/state/swap/hooks.tsx b/apps/web/src/state/swap/hooks.tsx index 1f590d11da1..e95c837cd79 100644 --- a/apps/web/src/state/swap/hooks.tsx +++ b/apps/web/src/state/swap/hooks.tsx @@ -225,7 +225,8 @@ export function useInitialCurrencyState(): { initialOutputCurrency?: Currency initialTypedValue?: string initialField?: CurrencyField - initialChainId: UniverseChainId + initialInputChainId?: UniverseChainId + initialOutputChainId?: UniverseChainId triggerConnect: boolean } { const { setIsUserSelectedToken } = useMultichainContext() @@ -243,7 +244,10 @@ export function useInitialCurrencyState(): { const isSupportedChainCompatible = isTestnetModeEnabled === !!supportedChainInfo.testnet const hasCurrencyQueryParams = - parsedCurrencyState.inputCurrencyAddress || parsedCurrencyState.outputCurrencyAddress || parsedCurrencyState.chainId + parsedCurrencyState.inputCurrencyAddress || + parsedCurrencyState.outputCurrencyAddress || + parsedCurrencyState.chainId || + parsedCurrencyState.outputChainId useEffect(() => { if (parsedCurrencyState.inputCurrencyAddress || parsedCurrencyState.outputCurrencyAddress) { @@ -255,9 +259,9 @@ export function useInitialCurrencyState(): { const { initialInputCurrencyAddress, initialChainId } = useMemo(() => { // Default to native if no query params or chain is not compatible with testnet or mainnet mode if (!hasCurrencyQueryParams || !isSupportedChainCompatible) { - const initialChainId = persistedFilteredChainIds?.input ?? defaultChainId + const initialChainId = persistedFilteredChainIds?.input return { - initialInputCurrencyAddress: getNativeAddress(initialChainId), + initialInputCurrencyAddress: getNativeAddress(initialChainId ?? defaultChainId), initialChainId, } } @@ -265,13 +269,13 @@ export function useInitialCurrencyState(): { if (parsedCurrencyState.inputCurrencyAddress) { return { initialInputCurrencyAddress: parsedCurrencyState.inputCurrencyAddress, - initialChainId: supportedChainId, + initialChainId: parsedCurrencyState.chainId ? supportedChainId : undefined, } } // return ETH or parsedCurrencyState return { initialInputCurrencyAddress: parsedCurrencyState.outputCurrencyAddress ? undefined : 'ETH', - initialChainId: supportedChainId, + initialChainId: parsedCurrencyState.chainId ? supportedChainId : undefined, } }, [ hasCurrencyQueryParams, @@ -282,15 +286,15 @@ export function useInitialCurrencyState(): { defaultChainId, ]) - const outputChainIsSupported = useSupportedChainId(parsedCurrencyState.outputChainId) + const supportedOutputChainId = useSupportedChainId(parsedCurrencyState.outputChainId) const initialOutputCurrencyAddress = useMemo( () => // clear output if identical unless there's a supported outputChainId which means we're bridging - initialInputCurrencyAddress === parsedCurrencyState.outputCurrencyAddress && !outputChainIsSupported + initialInputCurrencyAddress === parsedCurrencyState.outputCurrencyAddress && !supportedOutputChainId ? undefined : parsedCurrencyState.outputCurrencyAddress, - [initialInputCurrencyAddress, parsedCurrencyState.outputCurrencyAddress, outputChainIsSupported], + [initialInputCurrencyAddress, parsedCurrencyState.outputCurrencyAddress, supportedOutputChainId], ) const initialInputCurrency = useCurrency({ address: initialInputCurrencyAddress, chainId: initialChainId }) @@ -313,7 +317,8 @@ export function useInitialCurrencyState(): { initialOutputCurrency, initialTypedValue, initialField, - initialChainId, + initialInputChainId: initialChainId, + initialOutputChainId: supportedOutputChainId, triggerConnect: !!parsedQs.connect, } } diff --git a/apps/web/src/state/transactions/types.ts b/apps/web/src/state/transactions/types.ts index 70d93c70194..d5708d22270 100644 --- a/apps/web/src/state/transactions/types.ts +++ b/apps/web/src/state/transactions/types.ts @@ -8,7 +8,11 @@ import type { } from 'uniswap/src/features/transactions/types/transactionDetails' import type { ValidatedTransactionRequest } from 'uniswap/src/features/transactions/types/transactionRequests' -// Re-export for backward compatibility +/** + * Re-export for backward compatibility + * + * @deprecated Use TransactionTypeInfo + */ export type TransactionInfo = TransactionTypeInfo // Web-specific pending transaction details with guaranteed pending status diff --git a/apps/web/src/state/walletCapabilities/hooks/useMismatchAccount.ts b/apps/web/src/state/walletCapabilities/hooks/useMismatchAccount.ts index 86b48a4a479..1b5633726c5 100644 --- a/apps/web/src/state/walletCapabilities/hooks/useMismatchAccount.ts +++ b/apps/web/src/state/walletCapabilities/hooks/useMismatchAccount.ts @@ -1,4 +1,5 @@ import { nanoid } from '@reduxjs/toolkit' +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import { popupRegistry } from 'components/Popups/registry' import { PopupType } from 'components/Popups/types' import { useRef } from 'react' @@ -9,8 +10,6 @@ import { isAtomicBatchingSupportedByChainId } from 'state/walletCapabilities/lib import { useDelegationService } from 'state/wallets/useDelegationService' import { selectHasShownMismatchToast } from 'uniswap/src/features/behaviorHistory/selectors' import { setHasShownMismatchToast } from 'uniswap/src/features/behaviorHistory/slice' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' import { createHasMismatchUtil, type HasMismatchUtil } from 'uniswap/src/features/smartWallet/mismatch/mismatch' import { UniswapEventName } from 'uniswap/src/features/telemetry/constants' import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send.web' diff --git a/apps/web/src/state/walletCapabilities/hooks/useWalletGetCapabilitiesMutation.ts b/apps/web/src/state/walletCapabilities/hooks/useWalletGetCapabilitiesMutation.ts index 889cdf53524..2fca5aae612 100644 --- a/apps/web/src/state/walletCapabilities/hooks/useWalletGetCapabilitiesMutation.ts +++ b/apps/web/src/state/walletCapabilities/hooks/useWalletGetCapabilitiesMutation.ts @@ -1,11 +1,10 @@ import { queryOptions, useMutation, useQueryClient } from '@tanstack/react-query' +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import { useAccount } from 'hooks/useAccount' import ms from 'ms' import { useAppDispatch } from 'state/hooks' import { handleGetCapabilities } from 'state/walletCapabilities/lib/handleGetCapabilities' import { setCapabilitiesByChain, setCapabilitiesNotSupported } from 'state/walletCapabilities/reducer' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' import { getLogger } from 'utilities/src/logger/logger' import { useEvent } from 'utilities/src/react/hooks' import { ReactQueryCacheKey } from 'utilities/src/reactQuery/cache' diff --git a/apps/web/src/utils/computeSurroundingTicks.test.ts b/apps/web/src/utils/computeSurroundingTicks.test.ts index 1be002984db..266ddb293ca 100644 --- a/apps/web/src/utils/computeSurroundingTicks.test.ts +++ b/apps/web/src/utils/computeSurroundingTicks.test.ts @@ -1,5 +1,5 @@ import { TickData } from 'appGraphql/data/AllV3TicksQuery' -import { ProtocolVersion } from '@uniswap/client-pools/dist/pools/v1/types_pb' +import { ProtocolVersion } from '@uniswap/client-data-api/dist/data/v1/poolTypes_pb' import { Price, Token } from '@uniswap/sdk-core' import { FeeAmount, TICK_SPACINGS } from '@uniswap/v3-sdk' import JSBI from 'jsbi' diff --git a/apps/web/src/utils/computeSurroundingTicks.ts b/apps/web/src/utils/computeSurroundingTicks.ts index 03f3f448e93..4f98225ae92 100644 --- a/apps/web/src/utils/computeSurroundingTicks.ts +++ b/apps/web/src/utils/computeSurroundingTicks.ts @@ -1,5 +1,5 @@ import { Ticks } from 'appGraphql/data/AllV3TicksQuery' -import { ProtocolVersion } from '@uniswap/client-pools/dist/pools/v1/types_pb' +import { ProtocolVersion } from '@uniswap/client-data-api/dist/data/v1/poolTypes_pb' import { Currency, Price, Token } from '@uniswap/sdk-core' import { tickToPrice as tickToPriceV3 } from '@uniswap/v3-sdk' import { tickToPrice as tickToPriceV4 } from '@uniswap/v4-sdk' diff --git a/apps/web/tsconfig.json b/apps/web/tsconfig.json index 8426335ca78..31f14d0e75b 100644 --- a/apps/web/tsconfig.json +++ b/apps/web/tsconfig.json @@ -56,6 +56,9 @@ }, { "path": "../../packages/api" + }, + { + "path": "../../packages/gating" } ] } diff --git a/apps/web/vite.config.mts b/apps/web/vite.config.mts index 31586201d5a..2f1476e4429 100644 --- a/apps/web/vite.config.mts +++ b/apps/web/vite.config.mts @@ -287,7 +287,7 @@ export default defineConfig(({ mode }) => { '@visx/responsive', ], // Libraries that shouldn't be pre-bundled - exclude: ['expo-clipboard'], + exclude: ['expo-clipboard', '@connectrpc/connect'], esbuildOptions: { resolveExtensions: ['.web.js', '.web.ts', '.web.tsx', '.js', '.ts', '.tsx'], loader: { diff --git a/bun.lock b/bun.lock index a2d98fc1fbc..d06d2a9e293 100644 --- a/bun.lock +++ b/bun.lock @@ -67,6 +67,7 @@ "@uniswap/v3-sdk": "3.25.2", "@uniswap/v4-sdk": "1.21.2", "@universe/api": "workspace:^", + "@universe/gating": "workspace:^", "@wxt-dev/module-react": "1.1.3", "confusing-browser-globals": "1.0.11", "dotenv-webpack": "8.0.1", @@ -196,6 +197,7 @@ "@uniswap/ethers-rs-mobile": "0.0.5", "@uniswap/sdk-core": "7.7.2", "@universe/api": "workspace:^", + "@universe/gating": "workspace:^", "@walletconnect/core": "2.21.4", "@walletconnect/react-native-compat": "2.21.4", "@walletconnect/types": "2.21.4", @@ -362,8 +364,8 @@ "@types/react-scroll-sync": "0.9.0", "@uniswap/analytics": "1.7.2", "@uniswap/analytics-events": "2.43.0", + "@uniswap/client-data-api": "0.0.18", "@uniswap/client-explore": "0.0.17", - "@uniswap/client-pools": "0.0.17", "@uniswap/merkle-distributor": "1.0.1", "@uniswap/permit2-sdk": "1.3.0", "@uniswap/router-sdk": "2.0.2", @@ -378,6 +380,7 @@ "@uniswap/v3-sdk": "3.25.2", "@uniswap/v4-sdk": "1.21.2", "@universe/api": "workspace:^", + "@universe/gating": "workspace:^", "@visx/group": "2.17.0", "@visx/responsive": "3.12.0", "@visx/shape": "2.18.0", @@ -584,10 +587,9 @@ "@connectrpc/connect": "1.4.0", "@connectrpc/connect-web": "1.4.0", "@tanstack/react-query": "5.77.2", - "@uniswap/client-data-api": "0.0.14", + "@uniswap/client-data-api": "0.0.18", "@uniswap/client-embeddedwallet": "0.0.16", "@uniswap/client-explore": "0.0.17", - "@uniswap/client-pools": "0.0.17", "@uniswap/client-trading": "0.1.0", "@universe/config": "workspace:^", "@universe/sessions": "workspace:^", @@ -682,6 +684,37 @@ "eslint": "8.44.0", }, }, + "packages/gating": { + "name": "@universe/gating", + "version": "0.0.0", + "dependencies": { + "@statsig/client-core": "3.12.2", + "@statsig/js-client": "3.12.2", + "@statsig/js-local-overrides": "3.12.2", + "@statsig/react-bindings": "3.12.2", + "@statsig/react-native-bindings": "3.12.2", + "@universe/api": "workspace:*", + "utilities": "workspace:*", + }, + "devDependencies": { + "@types/node": "22.13.1", + "@uniswap/eslint-config": "workspace:^", + "depcheck": "1.4.7", + "eslint": "8.44.0", + "typescript": "5.3.3", + }, + }, + "packages/notifications": { + "name": "@universe/notifications", + "version": "0.0.0", + "devDependencies": { + "@types/node": "22.13.1", + "@uniswap/eslint-config": "workspace:^", + "depcheck": "1.4.7", + "eslint": "8.44.0", + "typescript": "5.3.3", + }, + }, "packages/sessions": { "name": "@universe/sessions", "version": "0.0.0", @@ -774,6 +807,7 @@ "@connectrpc/connect-query": "1.4.1", "@datadog/browser-logs": "5.20.0", "@datadog/browser-rum": "5.23.3", + "@ethersproject/abstract-provider": "5.8.0", "@ethersproject/abstract-signer": "5.7.0", "@ethersproject/address": "5.7.0", "@ethersproject/bignumber": "5.7.0", @@ -788,21 +822,15 @@ "@shopify/flash-list": "1.7.3", "@simplewebauthn/browser": "13.1.0", "@solana/web3.js": "1.92.0", - "@statsig/client-core": "3.12.2", - "@statsig/js-client": "3.12.2", - "@statsig/js-local-overrides": "3.12.2", - "@statsig/react-bindings": "3.12.2", - "@statsig/react-native-bindings": "3.12.2", "@tanstack/query-async-storage-persister": "5.51.21", "@tanstack/react-query": "5.77.2", "@tanstack/react-query-persist-client": "5.77.2", "@typechain/ethers-v5": "7.2.0", "@types/poisson-disk-sampling": "2.2.4", "@uniswap/analytics-events": "2.43.0", - "@uniswap/client-data-api": "0.0.14", + "@uniswap/client-data-api": "0.0.18", "@uniswap/client-embeddedwallet": "0.0.16", "@uniswap/client-explore": "0.0.17", - "@uniswap/client-pools": "0.0.17", "@uniswap/client-search": "0.0.10", "@uniswap/client-trading": "0.1.0", "@uniswap/permit2-sdk": "1.3.0", @@ -815,6 +843,7 @@ "@uniswap/v4-sdk": "1.21.2", "@universe/api": "workspace:^", "@universe/config": "workspace:^", + "@universe/gating": "workspace:^", "apollo-link-rest": "0.9.0", "date-fns": "2.30.0", "dayjs": "1.11.7", @@ -971,12 +1000,13 @@ "@scure/bip32": "1.3.2", "@tanstack/react-query": "5.77.2", "@uniswap/analytics-events": "2.43.0", - "@uniswap/client-data-api": "0.0.14", + "@uniswap/client-data-api": "0.0.18", "@uniswap/permit2-sdk": "1.3.0", "@uniswap/router-sdk": "2.0.2", "@uniswap/sdk-core": "7.7.2", "@uniswap/universal-router-sdk": "4.19.5", "@universe/api": "workspace:^", + "@universe/gating": "workspace:^", "apollo3-cache-persist": "0.14.1", "dayjs": "1.11.7", "ethers": "5.7.2", @@ -1167,29 +1197,29 @@ "@aws-crypto/util": ["@aws-crypto/util@5.2.0", "", { "dependencies": { "@aws-sdk/types": "^3.222.0", "@smithy/util-utf8": "^2.0.0", "tslib": "^2.6.2" } }, "sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ=="], - "@aws-sdk/client-cloudwatch-logs": ["@aws-sdk/client-cloudwatch-logs@3.911.0", "", { "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.911.0", "@aws-sdk/credential-provider-node": "3.911.0", "@aws-sdk/middleware-host-header": "3.910.0", "@aws-sdk/middleware-logger": "3.910.0", "@aws-sdk/middleware-recursion-detection": "3.910.0", "@aws-sdk/middleware-user-agent": "3.911.0", "@aws-sdk/region-config-resolver": "3.910.0", "@aws-sdk/types": "3.910.0", "@aws-sdk/util-endpoints": "3.910.0", "@aws-sdk/util-user-agent-browser": "3.910.0", "@aws-sdk/util-user-agent-node": "3.911.0", "@smithy/config-resolver": "^4.3.2", "@smithy/core": "^3.16.1", "@smithy/eventstream-serde-browser": "^4.2.2", "@smithy/eventstream-serde-config-resolver": "^4.3.2", "@smithy/eventstream-serde-node": "^4.2.2", "@smithy/fetch-http-handler": "^5.3.3", "@smithy/hash-node": "^4.2.2", "@smithy/invalid-dependency": "^4.2.2", "@smithy/middleware-content-length": "^4.2.2", "@smithy/middleware-endpoint": "^4.3.3", "@smithy/middleware-retry": "^4.4.3", "@smithy/middleware-serde": "^4.2.2", "@smithy/middleware-stack": "^4.2.2", "@smithy/node-config-provider": "^4.3.2", "@smithy/node-http-handler": "^4.4.1", "@smithy/protocol-http": "^5.3.2", "@smithy/smithy-client": "^4.8.1", "@smithy/types": "^4.7.1", "@smithy/url-parser": "^4.2.2", "@smithy/util-base64": "^4.3.0", "@smithy/util-body-length-browser": "^4.2.0", "@smithy/util-body-length-node": "^4.2.1", "@smithy/util-defaults-mode-browser": "^4.3.2", "@smithy/util-defaults-mode-node": "^4.2.3", "@smithy/util-endpoints": "^3.2.2", "@smithy/util-middleware": "^4.2.2", "@smithy/util-retry": "^4.2.2", "@smithy/util-utf8": "^4.2.0", "@smithy/uuid": "^1.1.0", "tslib": "^2.6.2" } }, "sha512-172pKzqYk/GtIQsdrqmJCg8VRBGR+U70kSWdcOWtTMZOOex7Cv6iYMsCLX/ckmvVCKicgsSdxXE6TWYIEMr6oQ=="], + "@aws-sdk/client-cloudwatch-logs": ["@aws-sdk/client-cloudwatch-logs@3.913.0", "", { "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.911.0", "@aws-sdk/credential-provider-node": "3.913.0", "@aws-sdk/middleware-host-header": "3.910.0", "@aws-sdk/middleware-logger": "3.910.0", "@aws-sdk/middleware-recursion-detection": "3.910.0", "@aws-sdk/middleware-user-agent": "3.911.0", "@aws-sdk/region-config-resolver": "3.910.0", "@aws-sdk/types": "3.910.0", "@aws-sdk/util-endpoints": "3.910.0", "@aws-sdk/util-user-agent-browser": "3.910.0", "@aws-sdk/util-user-agent-node": "3.911.0", "@smithy/config-resolver": "^4.3.2", "@smithy/core": "^3.16.1", "@smithy/eventstream-serde-browser": "^4.2.2", "@smithy/eventstream-serde-config-resolver": "^4.3.2", "@smithy/eventstream-serde-node": "^4.2.2", "@smithy/fetch-http-handler": "^5.3.3", "@smithy/hash-node": "^4.2.2", "@smithy/invalid-dependency": "^4.2.2", "@smithy/middleware-content-length": "^4.2.2", "@smithy/middleware-endpoint": "^4.3.3", "@smithy/middleware-retry": "^4.4.3", "@smithy/middleware-serde": "^4.2.2", "@smithy/middleware-stack": "^4.2.2", "@smithy/node-config-provider": "^4.3.2", "@smithy/node-http-handler": "^4.4.1", "@smithy/protocol-http": "^5.3.2", "@smithy/smithy-client": "^4.8.1", "@smithy/types": "^4.7.1", "@smithy/url-parser": "^4.2.2", "@smithy/util-base64": "^4.3.0", "@smithy/util-body-length-browser": "^4.2.0", "@smithy/util-body-length-node": "^4.2.1", "@smithy/util-defaults-mode-browser": "^4.3.2", "@smithy/util-defaults-mode-node": "^4.2.3", "@smithy/util-endpoints": "^3.2.2", "@smithy/util-middleware": "^4.2.2", "@smithy/util-retry": "^4.2.2", "@smithy/util-utf8": "^4.2.0", "@smithy/uuid": "^1.1.0", "tslib": "^2.6.2" } }, "sha512-ztaUBCI6ps90O5sERy5ZP8aGC2+Ks9kvOJrdpGFMKcTVtyHP1xTB/FDfNvmz2s25S8W7yeCokvs1fvoKcLyniQ=="], - "@aws-sdk/client-cognito-identity": ["@aws-sdk/client-cognito-identity@3.911.0", "", { "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.911.0", "@aws-sdk/credential-provider-node": "3.911.0", "@aws-sdk/middleware-host-header": "3.910.0", "@aws-sdk/middleware-logger": "3.910.0", "@aws-sdk/middleware-recursion-detection": "3.910.0", "@aws-sdk/middleware-user-agent": "3.911.0", "@aws-sdk/region-config-resolver": "3.910.0", "@aws-sdk/types": "3.910.0", "@aws-sdk/util-endpoints": "3.910.0", "@aws-sdk/util-user-agent-browser": "3.910.0", "@aws-sdk/util-user-agent-node": "3.911.0", "@smithy/config-resolver": "^4.3.2", "@smithy/core": "^3.16.1", "@smithy/fetch-http-handler": "^5.3.3", "@smithy/hash-node": "^4.2.2", "@smithy/invalid-dependency": "^4.2.2", "@smithy/middleware-content-length": "^4.2.2", "@smithy/middleware-endpoint": "^4.3.3", "@smithy/middleware-retry": "^4.4.3", "@smithy/middleware-serde": "^4.2.2", "@smithy/middleware-stack": "^4.2.2", "@smithy/node-config-provider": "^4.3.2", "@smithy/node-http-handler": "^4.4.1", "@smithy/protocol-http": "^5.3.2", "@smithy/smithy-client": "^4.8.1", "@smithy/types": "^4.7.1", "@smithy/url-parser": "^4.2.2", "@smithy/util-base64": "^4.3.0", "@smithy/util-body-length-browser": "^4.2.0", "@smithy/util-body-length-node": "^4.2.1", "@smithy/util-defaults-mode-browser": "^4.3.2", "@smithy/util-defaults-mode-node": "^4.2.3", "@smithy/util-endpoints": "^3.2.2", "@smithy/util-middleware": "^4.2.2", "@smithy/util-retry": "^4.2.2", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-Ch/ndkyrh5fAIOqIBS/0IOSsxLQSrzhmBqyZ6Zrahy/haKHOC1UxFFld7crJUbcukvgvmuM9l5DRncy0tIe1tQ=="], + "@aws-sdk/client-cognito-identity": ["@aws-sdk/client-cognito-identity@3.913.0", "", { "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.911.0", "@aws-sdk/credential-provider-node": "3.913.0", "@aws-sdk/middleware-host-header": "3.910.0", "@aws-sdk/middleware-logger": "3.910.0", "@aws-sdk/middleware-recursion-detection": "3.910.0", "@aws-sdk/middleware-user-agent": "3.911.0", "@aws-sdk/region-config-resolver": "3.910.0", "@aws-sdk/types": "3.910.0", "@aws-sdk/util-endpoints": "3.910.0", "@aws-sdk/util-user-agent-browser": "3.910.0", "@aws-sdk/util-user-agent-node": "3.911.0", "@smithy/config-resolver": "^4.3.2", "@smithy/core": "^3.16.1", "@smithy/fetch-http-handler": "^5.3.3", "@smithy/hash-node": "^4.2.2", "@smithy/invalid-dependency": "^4.2.2", "@smithy/middleware-content-length": "^4.2.2", "@smithy/middleware-endpoint": "^4.3.3", "@smithy/middleware-retry": "^4.4.3", "@smithy/middleware-serde": "^4.2.2", "@smithy/middleware-stack": "^4.2.2", "@smithy/node-config-provider": "^4.3.2", "@smithy/node-http-handler": "^4.4.1", "@smithy/protocol-http": "^5.3.2", "@smithy/smithy-client": "^4.8.1", "@smithy/types": "^4.7.1", "@smithy/url-parser": "^4.2.2", "@smithy/util-base64": "^4.3.0", "@smithy/util-body-length-browser": "^4.2.0", "@smithy/util-body-length-node": "^4.2.1", "@smithy/util-defaults-mode-browser": "^4.3.2", "@smithy/util-defaults-mode-node": "^4.2.3", "@smithy/util-endpoints": "^3.2.2", "@smithy/util-middleware": "^4.2.2", "@smithy/util-retry": "^4.2.2", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-TdEwasoXnLIb90z7NL1vLbEprzY0vdRqZH97ubIUDo8EaJ6WrJ35Um5g0rcnWKR6C+P9lKKI4mVv2BI2EwY94Q=="], - "@aws-sdk/client-iam": ["@aws-sdk/client-iam@3.911.0", "", { "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.911.0", "@aws-sdk/credential-provider-node": "3.911.0", "@aws-sdk/middleware-host-header": "3.910.0", "@aws-sdk/middleware-logger": "3.910.0", "@aws-sdk/middleware-recursion-detection": "3.910.0", "@aws-sdk/middleware-user-agent": "3.911.0", "@aws-sdk/region-config-resolver": "3.910.0", "@aws-sdk/types": "3.910.0", "@aws-sdk/util-endpoints": "3.910.0", "@aws-sdk/util-user-agent-browser": "3.910.0", "@aws-sdk/util-user-agent-node": "3.911.0", "@smithy/config-resolver": "^4.3.2", "@smithy/core": "^3.16.1", "@smithy/fetch-http-handler": "^5.3.3", "@smithy/hash-node": "^4.2.2", "@smithy/invalid-dependency": "^4.2.2", "@smithy/middleware-content-length": "^4.2.2", "@smithy/middleware-endpoint": "^4.3.3", "@smithy/middleware-retry": "^4.4.3", "@smithy/middleware-serde": "^4.2.2", "@smithy/middleware-stack": "^4.2.2", "@smithy/node-config-provider": "^4.3.2", "@smithy/node-http-handler": "^4.4.1", "@smithy/protocol-http": "^5.3.2", "@smithy/smithy-client": "^4.8.1", "@smithy/types": "^4.7.1", "@smithy/url-parser": "^4.2.2", "@smithy/util-base64": "^4.3.0", "@smithy/util-body-length-browser": "^4.2.0", "@smithy/util-body-length-node": "^4.2.1", "@smithy/util-defaults-mode-browser": "^4.3.2", "@smithy/util-defaults-mode-node": "^4.2.3", "@smithy/util-endpoints": "^3.2.2", "@smithy/util-middleware": "^4.2.2", "@smithy/util-retry": "^4.2.2", "@smithy/util-utf8": "^4.2.0", "@smithy/util-waiter": "^4.2.2", "tslib": "^2.6.2" } }, "sha512-IksVAEDAsiKR0NsP6b4OLhtvg6GkH/CpopR8Dh1TaBTotS/lE8amF2N94SYq+emG0vJ23CvErmkHQpa2ZBYDUg=="], + "@aws-sdk/client-iam": ["@aws-sdk/client-iam@3.913.0", "", { "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.911.0", "@aws-sdk/credential-provider-node": "3.913.0", "@aws-sdk/middleware-host-header": "3.910.0", "@aws-sdk/middleware-logger": "3.910.0", "@aws-sdk/middleware-recursion-detection": "3.910.0", "@aws-sdk/middleware-user-agent": "3.911.0", "@aws-sdk/region-config-resolver": "3.910.0", "@aws-sdk/types": "3.910.0", "@aws-sdk/util-endpoints": "3.910.0", "@aws-sdk/util-user-agent-browser": "3.910.0", "@aws-sdk/util-user-agent-node": "3.911.0", "@smithy/config-resolver": "^4.3.2", "@smithy/core": "^3.16.1", "@smithy/fetch-http-handler": "^5.3.3", "@smithy/hash-node": "^4.2.2", "@smithy/invalid-dependency": "^4.2.2", "@smithy/middleware-content-length": "^4.2.2", "@smithy/middleware-endpoint": "^4.3.3", "@smithy/middleware-retry": "^4.4.3", "@smithy/middleware-serde": "^4.2.2", "@smithy/middleware-stack": "^4.2.2", "@smithy/node-config-provider": "^4.3.2", "@smithy/node-http-handler": "^4.4.1", "@smithy/protocol-http": "^5.3.2", "@smithy/smithy-client": "^4.8.1", "@smithy/types": "^4.7.1", "@smithy/url-parser": "^4.2.2", "@smithy/util-base64": "^4.3.0", "@smithy/util-body-length-browser": "^4.2.0", "@smithy/util-body-length-node": "^4.2.1", "@smithy/util-defaults-mode-browser": "^4.3.2", "@smithy/util-defaults-mode-node": "^4.2.3", "@smithy/util-endpoints": "^3.2.2", "@smithy/util-middleware": "^4.2.2", "@smithy/util-retry": "^4.2.2", "@smithy/util-utf8": "^4.2.0", "@smithy/util-waiter": "^4.2.2", "tslib": "^2.6.2" } }, "sha512-3UR3EJ/2eutWpcs6LdtLl4JTJ4u/TZZEoLryUConEchrBNNtSVBG2CXrG7In1hS4l0t5TlkW/ruEZyLZJiqFfw=="], - "@aws-sdk/client-lambda": ["@aws-sdk/client-lambda@3.911.0", "", { "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.911.0", "@aws-sdk/credential-provider-node": "3.911.0", "@aws-sdk/middleware-host-header": "3.910.0", "@aws-sdk/middleware-logger": "3.910.0", "@aws-sdk/middleware-recursion-detection": "3.910.0", "@aws-sdk/middleware-user-agent": "3.911.0", "@aws-sdk/region-config-resolver": "3.910.0", "@aws-sdk/types": "3.910.0", "@aws-sdk/util-endpoints": "3.910.0", "@aws-sdk/util-user-agent-browser": "3.910.0", "@aws-sdk/util-user-agent-node": "3.911.0", "@smithy/config-resolver": "^4.3.2", "@smithy/core": "^3.16.1", "@smithy/eventstream-serde-browser": "^4.2.2", "@smithy/eventstream-serde-config-resolver": "^4.3.2", "@smithy/eventstream-serde-node": "^4.2.2", "@smithy/fetch-http-handler": "^5.3.3", "@smithy/hash-node": "^4.2.2", "@smithy/invalid-dependency": "^4.2.2", "@smithy/middleware-content-length": "^4.2.2", "@smithy/middleware-endpoint": "^4.3.3", "@smithy/middleware-retry": "^4.4.3", "@smithy/middleware-serde": "^4.2.2", "@smithy/middleware-stack": "^4.2.2", "@smithy/node-config-provider": "^4.3.2", "@smithy/node-http-handler": "^4.4.1", "@smithy/protocol-http": "^5.3.2", "@smithy/smithy-client": "^4.8.1", "@smithy/types": "^4.7.1", "@smithy/url-parser": "^4.2.2", "@smithy/util-base64": "^4.3.0", "@smithy/util-body-length-browser": "^4.2.0", "@smithy/util-body-length-node": "^4.2.1", "@smithy/util-defaults-mode-browser": "^4.3.2", "@smithy/util-defaults-mode-node": "^4.2.3", "@smithy/util-endpoints": "^3.2.2", "@smithy/util-middleware": "^4.2.2", "@smithy/util-retry": "^4.2.2", "@smithy/util-stream": "^4.5.2", "@smithy/util-utf8": "^4.2.0", "@smithy/util-waiter": "^4.2.2", "tslib": "^2.6.2" } }, "sha512-cKRF10Fks0EEkZiRYlIy3mOUKCwtGET6CwsdYbaQ28qCm/Hh26QcL5YjVbq1fUF4BfdsFi7AQAX9WOWOAA8HQA=="], + "@aws-sdk/client-lambda": ["@aws-sdk/client-lambda@3.913.0", "", { "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.911.0", "@aws-sdk/credential-provider-node": "3.913.0", "@aws-sdk/middleware-host-header": "3.910.0", "@aws-sdk/middleware-logger": "3.910.0", "@aws-sdk/middleware-recursion-detection": "3.910.0", "@aws-sdk/middleware-user-agent": "3.911.0", "@aws-sdk/region-config-resolver": "3.910.0", "@aws-sdk/types": "3.910.0", "@aws-sdk/util-endpoints": "3.910.0", "@aws-sdk/util-user-agent-browser": "3.910.0", "@aws-sdk/util-user-agent-node": "3.911.0", "@smithy/config-resolver": "^4.3.2", "@smithy/core": "^3.16.1", "@smithy/eventstream-serde-browser": "^4.2.2", "@smithy/eventstream-serde-config-resolver": "^4.3.2", "@smithy/eventstream-serde-node": "^4.2.2", "@smithy/fetch-http-handler": "^5.3.3", "@smithy/hash-node": "^4.2.2", "@smithy/invalid-dependency": "^4.2.2", "@smithy/middleware-content-length": "^4.2.2", "@smithy/middleware-endpoint": "^4.3.3", "@smithy/middleware-retry": "^4.4.3", "@smithy/middleware-serde": "^4.2.2", "@smithy/middleware-stack": "^4.2.2", "@smithy/node-config-provider": "^4.3.2", "@smithy/node-http-handler": "^4.4.1", "@smithy/protocol-http": "^5.3.2", "@smithy/smithy-client": "^4.8.1", "@smithy/types": "^4.7.1", "@smithy/url-parser": "^4.2.2", "@smithy/util-base64": "^4.3.0", "@smithy/util-body-length-browser": "^4.2.0", "@smithy/util-body-length-node": "^4.2.1", "@smithy/util-defaults-mode-browser": "^4.3.2", "@smithy/util-defaults-mode-node": "^4.2.3", "@smithy/util-endpoints": "^3.2.2", "@smithy/util-middleware": "^4.2.2", "@smithy/util-retry": "^4.2.2", "@smithy/util-stream": "^4.5.2", "@smithy/util-utf8": "^4.2.0", "@smithy/util-waiter": "^4.2.2", "tslib": "^2.6.2" } }, "sha512-Z1POaV/q+unF0G6PEDO0p6JrepJI6DXkVAl4RQiN1hZRshsfZxPQtsanKqMHLEi/OyhqnoVxy1buSNHjuumTdg=="], - "@aws-sdk/client-sfn": ["@aws-sdk/client-sfn@3.911.0", "", { "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.911.0", "@aws-sdk/credential-provider-node": "3.911.0", "@aws-sdk/middleware-host-header": "3.910.0", "@aws-sdk/middleware-logger": "3.910.0", "@aws-sdk/middleware-recursion-detection": "3.910.0", "@aws-sdk/middleware-user-agent": "3.911.0", "@aws-sdk/region-config-resolver": "3.910.0", "@aws-sdk/types": "3.910.0", "@aws-sdk/util-endpoints": "3.910.0", "@aws-sdk/util-user-agent-browser": "3.910.0", "@aws-sdk/util-user-agent-node": "3.911.0", "@smithy/config-resolver": "^4.3.2", "@smithy/core": "^3.16.1", "@smithy/fetch-http-handler": "^5.3.3", "@smithy/hash-node": "^4.2.2", "@smithy/invalid-dependency": "^4.2.2", "@smithy/middleware-content-length": "^4.2.2", "@smithy/middleware-endpoint": "^4.3.3", "@smithy/middleware-retry": "^4.4.3", "@smithy/middleware-serde": "^4.2.2", "@smithy/middleware-stack": "^4.2.2", "@smithy/node-config-provider": "^4.3.2", "@smithy/node-http-handler": "^4.4.1", "@smithy/protocol-http": "^5.3.2", "@smithy/smithy-client": "^4.8.1", "@smithy/types": "^4.7.1", "@smithy/url-parser": "^4.2.2", "@smithy/util-base64": "^4.3.0", "@smithy/util-body-length-browser": "^4.2.0", "@smithy/util-body-length-node": "^4.2.1", "@smithy/util-defaults-mode-browser": "^4.3.2", "@smithy/util-defaults-mode-node": "^4.2.3", "@smithy/util-endpoints": "^3.2.2", "@smithy/util-middleware": "^4.2.2", "@smithy/util-retry": "^4.2.2", "@smithy/util-utf8": "^4.2.0", "@smithy/uuid": "^1.1.0", "tslib": "^2.6.2" } }, "sha512-JQrrhHXecw607oAqJOmg53pd9f9iYOAXcDcTfIVdHiTnXvhMshqgW8TuRobQ4n8Yg4FtgCg0SB/WQNDfYiU+vg=="], + "@aws-sdk/client-sfn": ["@aws-sdk/client-sfn@3.913.0", "", { "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.911.0", "@aws-sdk/credential-provider-node": "3.913.0", "@aws-sdk/middleware-host-header": "3.910.0", "@aws-sdk/middleware-logger": "3.910.0", "@aws-sdk/middleware-recursion-detection": "3.910.0", "@aws-sdk/middleware-user-agent": "3.911.0", "@aws-sdk/region-config-resolver": "3.910.0", "@aws-sdk/types": "3.910.0", "@aws-sdk/util-endpoints": "3.910.0", "@aws-sdk/util-user-agent-browser": "3.910.0", "@aws-sdk/util-user-agent-node": "3.911.0", "@smithy/config-resolver": "^4.3.2", "@smithy/core": "^3.16.1", "@smithy/fetch-http-handler": "^5.3.3", "@smithy/hash-node": "^4.2.2", "@smithy/invalid-dependency": "^4.2.2", "@smithy/middleware-content-length": "^4.2.2", "@smithy/middleware-endpoint": "^4.3.3", "@smithy/middleware-retry": "^4.4.3", "@smithy/middleware-serde": "^4.2.2", "@smithy/middleware-stack": "^4.2.2", "@smithy/node-config-provider": "^4.3.2", "@smithy/node-http-handler": "^4.4.1", "@smithy/protocol-http": "^5.3.2", "@smithy/smithy-client": "^4.8.1", "@smithy/types": "^4.7.1", "@smithy/url-parser": "^4.2.2", "@smithy/util-base64": "^4.3.0", "@smithy/util-body-length-browser": "^4.2.0", "@smithy/util-body-length-node": "^4.2.1", "@smithy/util-defaults-mode-browser": "^4.3.2", "@smithy/util-defaults-mode-node": "^4.2.3", "@smithy/util-endpoints": "^3.2.2", "@smithy/util-middleware": "^4.2.2", "@smithy/util-retry": "^4.2.2", "@smithy/util-utf8": "^4.2.0", "@smithy/uuid": "^1.1.0", "tslib": "^2.6.2" } }, "sha512-XVonl1v6mqz+FxevEvY+CBEOi+fTG3Ht2BTwWRM3F0XUwOo4ONH4+jo54rEEbq12zVW3M53k+rMfUDyy1pSLiw=="], "@aws-sdk/client-sso": ["@aws-sdk/client-sso@3.911.0", "", { "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.911.0", "@aws-sdk/middleware-host-header": "3.910.0", "@aws-sdk/middleware-logger": "3.910.0", "@aws-sdk/middleware-recursion-detection": "3.910.0", "@aws-sdk/middleware-user-agent": "3.911.0", "@aws-sdk/region-config-resolver": "3.910.0", "@aws-sdk/types": "3.910.0", "@aws-sdk/util-endpoints": "3.910.0", "@aws-sdk/util-user-agent-browser": "3.910.0", "@aws-sdk/util-user-agent-node": "3.911.0", "@smithy/config-resolver": "^4.3.2", "@smithy/core": "^3.16.1", "@smithy/fetch-http-handler": "^5.3.3", "@smithy/hash-node": "^4.2.2", "@smithy/invalid-dependency": "^4.2.2", "@smithy/middleware-content-length": "^4.2.2", "@smithy/middleware-endpoint": "^4.3.3", "@smithy/middleware-retry": "^4.4.3", "@smithy/middleware-serde": "^4.2.2", "@smithy/middleware-stack": "^4.2.2", "@smithy/node-config-provider": "^4.3.2", "@smithy/node-http-handler": "^4.4.1", "@smithy/protocol-http": "^5.3.2", "@smithy/smithy-client": "^4.8.1", "@smithy/types": "^4.7.1", "@smithy/url-parser": "^4.2.2", "@smithy/util-base64": "^4.3.0", "@smithy/util-body-length-browser": "^4.2.0", "@smithy/util-body-length-node": "^4.2.1", "@smithy/util-defaults-mode-browser": "^4.3.2", "@smithy/util-defaults-mode-node": "^4.2.3", "@smithy/util-endpoints": "^3.2.2", "@smithy/util-middleware": "^4.2.2", "@smithy/util-retry": "^4.2.2", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-N9QAeMvN3D1ZyKXkQp4aUgC4wUMuA5E1HuVCkajc0bq1pnH4PIke36YlrDGGREqPlyLFrXCkws2gbL5p23vtlg=="], "@aws-sdk/core": ["@aws-sdk/core@3.911.0", "", { "dependencies": { "@aws-sdk/types": "3.910.0", "@aws-sdk/xml-builder": "3.911.0", "@smithy/core": "^3.16.1", "@smithy/node-config-provider": "^4.3.2", "@smithy/property-provider": "^4.2.2", "@smithy/protocol-http": "^5.3.2", "@smithy/signature-v4": "^5.3.2", "@smithy/smithy-client": "^4.8.1", "@smithy/types": "^4.7.1", "@smithy/util-base64": "^4.3.0", "@smithy/util-middleware": "^4.2.2", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-k4QG9A+UCq/qlDJFmjozo6R0eXXfe++/KnCDMmajehIE9kh+b/5DqlGvAmbl9w4e92LOtrY6/DN3mIX1xs4sXw=="], - "@aws-sdk/credential-provider-cognito-identity": ["@aws-sdk/credential-provider-cognito-identity@3.911.0", "", { "dependencies": { "@aws-sdk/client-cognito-identity": "3.911.0", "@aws-sdk/types": "3.910.0", "@smithy/property-provider": "^4.2.2", "@smithy/types": "^4.7.1", "tslib": "^2.6.2" } }, "sha512-4RF/HQ2C4K+UfNfddw3xHLqk/c1G0/8nhgW10BGU0w/EICkCxtVEzgbflGeUumuXsxJYo8Fyyg/Pd8302brfHA=="], + "@aws-sdk/credential-provider-cognito-identity": ["@aws-sdk/credential-provider-cognito-identity@3.913.0", "", { "dependencies": { "@aws-sdk/client-cognito-identity": "3.913.0", "@aws-sdk/types": "3.910.0", "@smithy/property-provider": "^4.2.2", "@smithy/types": "^4.7.1", "tslib": "^2.6.2" } }, "sha512-AYZNpy3eEFzopzntLcrkEQQ1qyhg0V7BL8U77QdLSYtzoYvI9CqnWOGdWnNSEUp+Mpbk1VJyPzVfkDoDq5kX6g=="], "@aws-sdk/credential-provider-env": ["@aws-sdk/credential-provider-env@3.911.0", "", { "dependencies": { "@aws-sdk/core": "3.911.0", "@aws-sdk/types": "3.910.0", "@smithy/property-provider": "^4.2.2", "@smithy/types": "^4.7.1", "tslib": "^2.6.2" } }, "sha512-6FWRwWn3LUZzLhqBXB+TPMW2ijCWUqGICSw8bVakEdODrvbiv1RT/MVUayzFwz/ek6e6NKZn6DbSWzx07N9Hjw=="], "@aws-sdk/credential-provider-http": ["@aws-sdk/credential-provider-http@3.911.0", "", { "dependencies": { "@aws-sdk/core": "3.911.0", "@aws-sdk/types": "3.910.0", "@smithy/fetch-http-handler": "^5.3.3", "@smithy/node-http-handler": "^4.4.1", "@smithy/property-provider": "^4.2.2", "@smithy/protocol-http": "^5.3.2", "@smithy/smithy-client": "^4.8.1", "@smithy/types": "^4.7.1", "@smithy/util-stream": "^4.5.2", "tslib": "^2.6.2" } }, "sha512-xUlwKmIUW2fWP/eM3nF5u4CyLtOtyohlhGJ5jdsJokr3MrQ7w0tDITO43C9IhCn+28D5UbaiWnKw5ntkw7aVfA=="], - "@aws-sdk/credential-provider-ini": ["@aws-sdk/credential-provider-ini@3.911.0", "", { "dependencies": { "@aws-sdk/core": "3.911.0", "@aws-sdk/credential-provider-env": "3.911.0", "@aws-sdk/credential-provider-http": "3.911.0", "@aws-sdk/credential-provider-process": "3.911.0", "@aws-sdk/credential-provider-sso": "3.911.0", "@aws-sdk/credential-provider-web-identity": "3.911.0", "@aws-sdk/nested-clients": "3.911.0", "@aws-sdk/types": "3.910.0", "@smithy/credential-provider-imds": "^4.2.2", "@smithy/property-provider": "^4.2.2", "@smithy/shared-ini-file-loader": "^4.3.2", "@smithy/types": "^4.7.1", "tslib": "^2.6.2" } }, "sha512-bQ86kWAZ0Imn7uWl7uqOYZ2aqlkftPmEc8cQh+QyhmUXbia8II4oYKq/tMek6j3M5UOMCiJVxzJoxemJZA6/sw=="], + "@aws-sdk/credential-provider-ini": ["@aws-sdk/credential-provider-ini@3.913.0", "", { "dependencies": { "@aws-sdk/core": "3.911.0", "@aws-sdk/credential-provider-env": "3.911.0", "@aws-sdk/credential-provider-http": "3.911.0", "@aws-sdk/credential-provider-process": "3.911.0", "@aws-sdk/credential-provider-sso": "3.911.0", "@aws-sdk/credential-provider-web-identity": "3.911.0", "@aws-sdk/nested-clients": "3.911.0", "@aws-sdk/types": "3.910.0", "@smithy/credential-provider-imds": "^4.2.2", "@smithy/property-provider": "^4.2.2", "@smithy/shared-ini-file-loader": "^4.3.2", "@smithy/types": "^4.7.1", "tslib": "^2.6.2" } }, "sha512-iR4c4NQ1OSRKQi0SxzpwD+wP1fCy+QNKtEyCajuVlD0pvmoIHdrm5THK9e+2/7/SsQDRhOXHJfLGxHapD74WJw=="], - "@aws-sdk/credential-provider-node": ["@aws-sdk/credential-provider-node@3.911.0", "", { "dependencies": { "@aws-sdk/credential-provider-env": "3.911.0", "@aws-sdk/credential-provider-http": "3.911.0", "@aws-sdk/credential-provider-ini": "3.911.0", "@aws-sdk/credential-provider-process": "3.911.0", "@aws-sdk/credential-provider-sso": "3.911.0", "@aws-sdk/credential-provider-web-identity": "3.911.0", "@aws-sdk/types": "3.910.0", "@smithy/credential-provider-imds": "^4.2.2", "@smithy/property-provider": "^4.2.2", "@smithy/shared-ini-file-loader": "^4.3.2", "@smithy/types": "^4.7.1", "tslib": "^2.6.2" } }, "sha512-4oGpLwgQCKNtVoJROztJ4v7lZLhCqcUMX6pe/DQ2aU0TktZX7EczMCIEGjVo5b7yHwSNWt2zW0tDdgVUTsMHPw=="], + "@aws-sdk/credential-provider-node": ["@aws-sdk/credential-provider-node@3.913.0", "", { "dependencies": { "@aws-sdk/credential-provider-env": "3.911.0", "@aws-sdk/credential-provider-http": "3.911.0", "@aws-sdk/credential-provider-ini": "3.913.0", "@aws-sdk/credential-provider-process": "3.911.0", "@aws-sdk/credential-provider-sso": "3.911.0", "@aws-sdk/credential-provider-web-identity": "3.911.0", "@aws-sdk/types": "3.910.0", "@smithy/credential-provider-imds": "^4.2.2", "@smithy/property-provider": "^4.2.2", "@smithy/shared-ini-file-loader": "^4.3.2", "@smithy/types": "^4.7.1", "tslib": "^2.6.2" } }, "sha512-HQPLkKDxS83Q/nZKqg9bq4igWzYQeOMqhpx5LYs4u1GwsKeCsYrrfz12Iu4IHNWPp9EnGLcmdfbfYuqZGrsaSQ=="], "@aws-sdk/credential-provider-process": ["@aws-sdk/credential-provider-process@3.911.0", "", { "dependencies": { "@aws-sdk/core": "3.911.0", "@aws-sdk/types": "3.910.0", "@smithy/property-provider": "^4.2.2", "@smithy/shared-ini-file-loader": "^4.3.2", "@smithy/types": "^4.7.1", "tslib": "^2.6.2" } }, "sha512-mKshhV5jRQffZjbK9x7bs+uC2IsYKfpzYaBamFsEov3xtARCpOiKaIlM8gYKFEbHT2M+1R3rYYlhhl9ndVWS2g=="], @@ -1197,7 +1227,7 @@ "@aws-sdk/credential-provider-web-identity": ["@aws-sdk/credential-provider-web-identity@3.911.0", "", { "dependencies": { "@aws-sdk/core": "3.911.0", "@aws-sdk/nested-clients": "3.911.0", "@aws-sdk/types": "3.910.0", "@smithy/property-provider": "^4.2.2", "@smithy/shared-ini-file-loader": "^4.3.2", "@smithy/types": "^4.7.1", "tslib": "^2.6.2" } }, "sha512-urIbXWWG+cm54RwwTFQuRwPH0WPsMFSDF2/H9qO2J2fKoHRURuyblFCyYG3aVKZGvFBhOizJYexf5+5w3CJKBw=="], - "@aws-sdk/credential-providers": ["@aws-sdk/credential-providers@3.911.0", "", { "dependencies": { "@aws-sdk/client-cognito-identity": "3.911.0", "@aws-sdk/core": "3.911.0", "@aws-sdk/credential-provider-cognito-identity": "3.911.0", "@aws-sdk/credential-provider-env": "3.911.0", "@aws-sdk/credential-provider-http": "3.911.0", "@aws-sdk/credential-provider-ini": "3.911.0", "@aws-sdk/credential-provider-node": "3.911.0", "@aws-sdk/credential-provider-process": "3.911.0", "@aws-sdk/credential-provider-sso": "3.911.0", "@aws-sdk/credential-provider-web-identity": "3.911.0", "@aws-sdk/nested-clients": "3.911.0", "@aws-sdk/types": "3.910.0", "@smithy/config-resolver": "^4.3.2", "@smithy/core": "^3.16.1", "@smithy/credential-provider-imds": "^4.2.2", "@smithy/node-config-provider": "^4.3.2", "@smithy/property-provider": "^4.2.2", "@smithy/types": "^4.7.1", "tslib": "^2.6.2" } }, "sha512-BTJyah0hB0w4kP6RKBr4oA1O9cJ5hG3UWVXKIH3YvvSEfZtjbaN1lrnN9DXk1lIEsNZG/yG5m6UjI4e9c7eeKA=="], + "@aws-sdk/credential-providers": ["@aws-sdk/credential-providers@3.913.0", "", { "dependencies": { "@aws-sdk/client-cognito-identity": "3.913.0", "@aws-sdk/core": "3.911.0", "@aws-sdk/credential-provider-cognito-identity": "3.913.0", "@aws-sdk/credential-provider-env": "3.911.0", "@aws-sdk/credential-provider-http": "3.911.0", "@aws-sdk/credential-provider-ini": "3.913.0", "@aws-sdk/credential-provider-node": "3.913.0", "@aws-sdk/credential-provider-process": "3.911.0", "@aws-sdk/credential-provider-sso": "3.911.0", "@aws-sdk/credential-provider-web-identity": "3.911.0", "@aws-sdk/nested-clients": "3.911.0", "@aws-sdk/types": "3.910.0", "@smithy/config-resolver": "^4.3.2", "@smithy/core": "^3.16.1", "@smithy/credential-provider-imds": "^4.2.2", "@smithy/node-config-provider": "^4.3.2", "@smithy/property-provider": "^4.2.2", "@smithy/types": "^4.7.1", "tslib": "^2.6.2" } }, "sha512-KnkvoLXGszXNV7IMLdUH2Smo+tr4MiHUp2zkkrhl+6uXdSWpEAhlARSA8OPIxgVMabUW1AWDumN7Km7z0GvnWg=="], "@aws-sdk/middleware-host-header": ["@aws-sdk/middleware-host-header@3.910.0", "", { "dependencies": { "@aws-sdk/types": "3.910.0", "@smithy/protocol-http": "^5.3.2", "@smithy/types": "^4.7.1", "tslib": "^2.6.2" } }, "sha512-F9Lqeu80/aTM6S/izZ8RtwSmjfhWjIuxX61LX+/9mxJyEkgaECRxv0chsLQsLHJumkGnXRy/eIyMLBhcTPF5vg=="], @@ -2679,7 +2709,7 @@ "@reown/walletkit": ["@reown/walletkit@1.2.8", "", { "dependencies": { "@walletconnect/core": "2.21.4", "@walletconnect/jsonrpc-provider": "1.0.14", "@walletconnect/jsonrpc-utils": "1.0.8", "@walletconnect/logger": "2.1.2", "@walletconnect/sign-client": "2.21.4", "@walletconnect/types": "2.21.4", "@walletconnect/utils": "2.21.4" } }, "sha512-X3EO9P6+Dvc++h8OwpBtBhGmq+890UlG/o0Ilb98l5ByDr3QVcYOURRIPVcV6pkTJ9sE6sVDXW7RIRiYSnQp2g=="], - "@repeaterjs/repeater": ["@repeaterjs/repeater@3.0.6", "", {}, "sha512-Javneu5lsuhwNCryN+pXH93VPQ8g0dBX7wItHFgYiwQmzE1sVdg5tWHiOgHywzL2W21XQopa7IwIEnNbmeUJYA=="], + "@repeaterjs/repeater": ["@repeaterjs/repeater@3.0.4", "", {}, "sha512-AW8PKd6iX3vAZ0vA43nOUOnbq/X5ihgU+mSXXqunMkeQADGiqw/PY0JNeYtD5sr0PAy51YPgAPbDoeapv9r8WA=="], "@resvg/resvg-wasm": ["@resvg/resvg-wasm@2.4.1", "", {}, "sha512-yi6R0HyHtsoWTRA06Col4WoDs7SvlXU3DLMNP2bdAgs7HK18dTEVl1weXgxRzi8gwLteGUbIg29zulxIB3GSdg=="], @@ -2901,16 +2931,24 @@ "@socket.io/component-emitter": ["@socket.io/component-emitter@3.1.2", "", {}, "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA=="], - "@solana-mobile/mobile-wallet-adapter-protocol": ["@solana-mobile/mobile-wallet-adapter-protocol@2.2.4", "", { "dependencies": { "@solana/wallet-standard": "^1.1.2", "@solana/wallet-standard-util": "^1.1.1", "@wallet-standard/core": "^1.0.3", "js-base64": "^3.7.5" }, "peerDependencies": { "react-native": ">0.69" } }, "sha512-0YvA8QAzMQYujYq1fuJ4wNlouvnJpVYJ4XKqBBh+G8IQGEezhWjuP6DryIg9gw3LD6ju/rDX1jfzGOZ38JAzkQ=="], + "@solana-mobile/mobile-wallet-adapter-protocol": ["@solana-mobile/mobile-wallet-adapter-protocol@2.2.5", "", { "dependencies": { "@solana/codecs-strings": "^4.0.0", "@solana/wallet-standard": "^1.1.2", "@solana/wallet-standard-util": "^1.1.1", "@wallet-standard/core": "^1.0.3", "js-base64": "^3.7.5" }, "peerDependencies": { "react-native": ">0.69" } }, "sha512-kCI+0/umWm98M9g12ndpS56U6wBzq4XdhobCkDPF8qRDYX/iTU8CD+QMcalh7VgRT7GWEmySQvQdaugM0Chf0g=="], - "@solana-mobile/mobile-wallet-adapter-protocol-web3js": ["@solana-mobile/mobile-wallet-adapter-protocol-web3js@2.2.4", "", { "dependencies": { "@solana-mobile/mobile-wallet-adapter-protocol": "^2.2.4", "bs58": "^5.0.0", "js-base64": "^3.7.5" }, "peerDependencies": { "@solana/web3.js": "^1.58.0" } }, "sha512-vSsIVGEOs+IJ8+5gzSwl5XBCW1zFIwhF0Qfx+fqH8F0eN5ip+XExFcnt5Of426HVpmVL2H8jocBwGwvdrTNU/A=="], + "@solana-mobile/mobile-wallet-adapter-protocol-web3js": ["@solana-mobile/mobile-wallet-adapter-protocol-web3js@2.2.5", "", { "dependencies": { "@solana-mobile/mobile-wallet-adapter-protocol": "^2.2.5", "bs58": "^5.0.0", "js-base64": "^3.7.5" }, "peerDependencies": { "@solana/web3.js": "^1.58.0" } }, "sha512-xfQl6Kee0ZXagUG5mpy+bMhQTNf2LAzF65m5SSgNJp47y/nP9GdXWi9blVH8IPP+QjF/+DnCtURaXS14bk3WJw=="], - "@solana-mobile/wallet-adapter-mobile": ["@solana-mobile/wallet-adapter-mobile@2.2.4", "", { "dependencies": { "@solana-mobile/mobile-wallet-adapter-protocol-web3js": "^2.2.0", "@solana-mobile/wallet-standard-mobile": "^0.4.1", "@solana/wallet-adapter-base": "^0.9.23", "@solana/wallet-standard-features": "^1.2.0", "js-base64": "^3.7.5" }, "optionalDependencies": { "@react-native-async-storage/async-storage": "^1.17.7" }, "peerDependencies": { "@solana/web3.js": "^1.58.0" } }, "sha512-ZKj8xU1bOtgHMgMfJh8qfUtdp5Ii4JhVJP3jqaRswYpRClmTApkBB++izSD3NBQ6fmiGv2G8F7AILQO0dYOwbg=="], + "@solana-mobile/wallet-adapter-mobile": ["@solana-mobile/wallet-adapter-mobile@2.2.5", "", { "dependencies": { "@solana-mobile/mobile-wallet-adapter-protocol-web3js": "^2.2.5", "@solana-mobile/wallet-standard-mobile": "^0.4.3", "@solana/wallet-adapter-base": "^0.9.23", "@solana/wallet-standard-features": "^1.2.0", "js-base64": "^3.7.5" }, "optionalDependencies": { "@react-native-async-storage/async-storage": "^1.17.7" }, "peerDependencies": { "@solana/web3.js": "^1.58.0" } }, "sha512-Zpzfwm3N4FfI63ZMs2qZChQ1j0z+p2prkZbSU51NyTnE+K9l9sDAl8RmRCOWnE29y+/AN10WuQZQoIAccHVOFg=="], - "@solana-mobile/wallet-standard-mobile": ["@solana-mobile/wallet-standard-mobile@0.4.2", "", { "dependencies": { "@solana-mobile/mobile-wallet-adapter-protocol": "^2.2.4", "@solana/wallet-standard-chains": "^1.1.0", "@solana/wallet-standard-features": "^1.2.0", "@wallet-standard/base": "^1.0.1", "@wallet-standard/features": "^1.0.3", "bs58": "^5.0.0", "js-base64": "^3.7.5", "qrcode": "^1.5.4" } }, "sha512-D/ebTRcpSEdCxfp7OZ0NRg+ScguJHqp208EGWI1R5rMBoGdoeu4ZvIi3VeJdi+Y9qcJFji8p2gf/wdHRL+6RkQ=="], + "@solana-mobile/wallet-standard-mobile": ["@solana-mobile/wallet-standard-mobile@0.4.3", "", { "dependencies": { "@solana-mobile/mobile-wallet-adapter-protocol": "^2.2.5", "@solana/wallet-standard-chains": "^1.1.0", "@solana/wallet-standard-features": "^1.2.0", "@wallet-standard/base": "^1.0.1", "@wallet-standard/features": "^1.0.3", "bs58": "^5.0.0", "js-base64": "^3.7.5", "qrcode": "^1.5.4" } }, "sha512-LLMQs/KgRZpftIhwOLCM2VZLMdA2vIghJjKsYUIiy1FBJS9GEkGDLJdbujb92lfAdmYwbyTuolIRik7JMPH3Kg=="], "@solana/buffer-layout": ["@solana/buffer-layout@4.0.1", "", { "dependencies": { "buffer": "~6.0.3" } }, "sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA=="], + "@solana/codecs-core": ["@solana/codecs-core@4.0.0", "", { "dependencies": { "@solana/errors": "4.0.0" }, "peerDependencies": { "typescript": ">=5.3.3" } }, "sha512-28kNUsyIlhU3MO3/7ZLDqeJf2YAm32B4tnTjl5A9HrbBqsTZ+upT/RzxZGP1MMm7jnPuIKCMwmTpsyqyR6IUpw=="], + + "@solana/codecs-numbers": ["@solana/codecs-numbers@4.0.0", "", { "dependencies": { "@solana/codecs-core": "4.0.0", "@solana/errors": "4.0.0" }, "peerDependencies": { "typescript": ">=5.3.3" } }, "sha512-z9zpjtcwzqT9rbkKVZpkWB5/0V7+6YRKs6BccHkGJlaDx8Pe/+XOvPi2rEdXPqrPd9QWb5Xp1iBfcgaDMyiOiA=="], + + "@solana/codecs-strings": ["@solana/codecs-strings@4.0.0", "", { "dependencies": { "@solana/codecs-core": "4.0.0", "@solana/codecs-numbers": "4.0.0", "@solana/errors": "4.0.0" }, "peerDependencies": { "fastestsmallesttextencoderdecoder": "^1.0.22", "typescript": ">=5.3.3" } }, "sha512-XvyD+sQ1zyA0amfxbpoFZsucLoe+yASQtDiLUGMDg5TZ82IHE3B7n82jE8d8cTAqi0HgqQiwU13snPhvg1O0Ow=="], + + "@solana/errors": ["@solana/errors@4.0.0", "", { "dependencies": { "chalk": "5.6.2", "commander": "14.0.1" }, "peerDependencies": { "typescript": ">=5.3.3" }, "bin": { "errors": "bin/cli.mjs" } }, "sha512-3YEtvcMvtcnTl4HahqLt0VnaGVf7vVWOnt6/uPky5e0qV6BlxDSbGkbBzttNjxLXHognV0AQi3pjvrtfUnZmbg=="], + "@solana/wallet-adapter-base": ["@solana/wallet-adapter-base@0.9.27", "", { "dependencies": { "@solana/wallet-standard-features": "^1.3.0", "@wallet-standard/base": "^1.1.0", "@wallet-standard/features": "^1.1.0", "eventemitter3": "^5.0.1" }, "peerDependencies": { "@solana/web3.js": "^1.98.0" } }, "sha512-kXjeNfNFVs/NE9GPmysBRKQ/nf+foSaq3kfVSeMcO/iVgigyRmB551OjU3WyAolLG/1jeEfKLqF9fKwMCRkUqg=="], "@solana/wallet-adapter-coinbase": ["@solana/wallet-adapter-coinbase@0.1.23", "", { "dependencies": { "@solana/wallet-adapter-base": "^0.9.27" }, "peerDependencies": { "@solana/web3.js": "^1.98.0" } }, "sha512-vCJi/clbq1VVgydPFnHGAc2jdEhDAClYmhEAR4RJp9UHBg+MEQUl1WW8PVIREY5uOzJHma0qEiyummIfyt0b4A=="], @@ -3495,7 +3533,7 @@ "@types/express": ["@types/express@4.17.23", "", { "dependencies": { "@types/body-parser": "*", "@types/express-serve-static-core": "^4.17.33", "@types/qs": "*", "@types/serve-static": "*" } }, "sha512-Crp6WY9aTYP3qPi2wGDo9iUe/rceX01UMhnF1jmwDcKCFM6cx7YhGP/Mpr3y9AASpfHixIG0E6azCcL5OcDHsQ=="], - "@types/express-serve-static-core": ["@types/express-serve-static-core@5.1.0", "", { "dependencies": { "@types/node": "*", "@types/qs": "*", "@types/range-parser": "*", "@types/send": "*" } }, "sha512-jnHMsrd0Mwa9Cf4IdOzbz543y4XJepXrbia2T4b6+spXC2We3t1y6K44D3mR8XMFSXMCf3/l7rCgddfx7UNVBA=="], + "@types/express-serve-static-core": ["@types/express-serve-static-core@4.19.7", "", { "dependencies": { "@types/node": "*", "@types/qs": "*", "@types/range-parser": "*", "@types/send": "*" } }, "sha512-FvPtiIf1LfhzsaIXhv/PHan/2FeQBbtBDtfX2QfvPxdUelMDEckK08SM6nqo1MIZY3RUlfA+HV8+hFUSio78qg=="], "@types/filesystem": ["@types/filesystem@0.0.36", "", { "dependencies": { "@types/filewriter": "*" } }, "sha512-vPDXOZuannb9FZdxgHnqSwAG/jvdGM8Wq+6N4D/d80z+D4HWH+bItqsZaVRQykAn6WEVeEkLm2oQigyHtgb0RA=="], @@ -3689,7 +3727,7 @@ "@uniswap/biome-config": ["@uniswap/biome-config@workspace:packages/biome-config"], - "@uniswap/client-data-api": ["@uniswap/client-data-api@0.0.14", "", {}, "sha512-OpZmRP2YbeIfjZ9fDsnVWk7rFa0xwhByfjt1Ma+VJgObUGyi8ecCuczZ4ntrpNqFpij/kYUrm7i36gR2yGow/Q=="], + "@uniswap/client-data-api": ["@uniswap/client-data-api@0.0.18", "", {}, "sha512-gM7Y4EJNdDfMoMQ9F7Il/NqeUus4zEIDdE8kf2OZTYoGmoiGp2WLrG8D/sToprCpYu0klXbdet2lXGDydkTyew=="], "@uniswap/client-embeddedwallet": ["@uniswap/client-embeddedwallet@0.0.16", "", {}, "sha512-zxlx3E2X0kKAw10FKOGlbFpX4yq3KJv9SEipBJxZae5OZH8Ki8UO+FBX/Ke9JPQmU1WUoiJ7NOknjIIDOjVmpw=="], @@ -3697,8 +3735,6 @@ "@uniswap/client-platform-service": ["@uniswap/client-platform-service@0.0.5", "", {}, "sha512-vqxYuCRpddynuaF9+umgIEdo6EYFb+8VJvamjT6E1p1fx0MC0YATWfQvASzKkPS6oKjKzUBQz8nxCLT+v7aNNg=="], - "@uniswap/client-pools": ["@uniswap/client-pools@0.0.17", "", {}, "sha512-qOmKD3r2R9WjK3nHMmNvDDUPKGA/8SFxUNNZupnIK2oUdkGfKY1xadkbcA4iqN3F00511LQ21c5OZDgxxjelSw=="], - "@uniswap/client-search": ["@uniswap/client-search@0.0.10", "", {}, "sha512-ykHIxTR0dRtI3dK1ubHu2jNe+hfhDjyUfqA/dlNVrjM67GLYjF1Ls4kWi/cfR131XeRWj9gVsZv30CgzkOicAQ=="], "@uniswap/client-trading": ["@uniswap/client-trading@0.1.0", "", {}, "sha512-LWjbAUk3TFvWOlfbXweyME12EUmO6jEQPiCM9jaHA6pWtlWOWPbQcCXuDWy3iwHklupoqhnyiLGj8CFgvpl0lA=="], @@ -3751,6 +3787,10 @@ "@universe/config": ["@universe/config@workspace:packages/config"], + "@universe/gating": ["@universe/gating@workspace:packages/gating"], + + "@universe/notifications": ["@universe/notifications@workspace:packages/notifications"], + "@universe/sessions": ["@universe/sessions@workspace:packages/sessions"], "@universe/uniswap-nx": ["@universe/uniswap-nx@workspace:tools/uniswap-nx"], @@ -4147,7 +4187,7 @@ "ast-types-flow": ["ast-types-flow@0.0.8", "", {}, "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ=="], - "ast-v8-to-istanbul": ["ast-v8-to-istanbul@0.3.6", "", { "dependencies": { "@jridgewell/trace-mapping": "^0.3.31", "estree-walker": "^3.0.3", "js-tokens": "^9.0.1" } }, "sha512-9tx1z/7OF/a8EdYL3FKoBhxLf3h3D8fXvuSj0HknsVeli2HE40qbNZxyFhMtnydaRiamwFu9zhb+BsJ5tVPehQ=="], + "ast-v8-to-istanbul": ["ast-v8-to-istanbul@0.3.7", "", { "dependencies": { "@jridgewell/trace-mapping": "^0.3.31", "estree-walker": "^3.0.3", "js-tokens": "^9.0.1" } }, "sha512-kr1Hy6YRZBkGQSb6puP+D6FQ59Cx4m0siYhAxygMCAgadiWQ6oxAxQXHOMvJx67SJ63jRoVIIg5eXzUbbct1ww=="], "astral-regex": ["astral-regex@2.0.0", "", {}, "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ=="], @@ -4265,7 +4305,7 @@ "base64-sol": ["base64-sol@1.0.1", "", {}, "sha512-ld3cCNMeXt4uJXmLZBHFGMvVpK9KsLVEhPpFRXnvSVAqABKbuNZg/+dsq3NuM+wxFLb/UrVkz7m1ciWmkMfTbg=="], - "baseline-browser-mapping": ["baseline-browser-mapping@2.8.16", "", { "bin": { "baseline-browser-mapping": "dist/cli.js" } }, "sha512-OMu3BGQ4E7P1ErFsIPpbJh0qvDudM/UuJeHgkAvfWe+0HFJCXh+t/l8L6fVLR55RI/UbKrVLnAXZSVwd9ysWYw=="], + "baseline-browser-mapping": ["baseline-browser-mapping@2.8.17", "", { "bin": { "baseline-browser-mapping": "dist/cli.js" } }, "sha512-j5zJcx6golJYTG6c05LUZ3Z8Gi+M62zRT/ycz4Xq4iCOdpcxwg7ngEYD4KA0eWZC7U17qh/Smq8bYbACJ0ipBA=="], "basic-auth": ["basic-auth@2.0.1", "", { "dependencies": { "safe-buffer": "5.1.2" } }, "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg=="], @@ -4401,7 +4441,7 @@ "bytes": ["bytes@3.0.0", "", {}, "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw=="], - "c12": ["c12@3.3.0", "", { "dependencies": { "chokidar": "^4.0.3", "confbox": "^0.2.2", "defu": "^6.1.4", "dotenv": "^17.2.2", "exsolve": "^1.0.7", "giget": "^2.0.0", "jiti": "^2.5.1", "ohash": "^2.0.11", "pathe": "^2.0.3", "perfect-debounce": "^2.0.0", "pkg-types": "^2.3.0", "rc9": "^2.1.2" }, "peerDependencies": { "magicast": "^0.3.5" }, "optionalPeers": ["magicast"] }, "sha512-K9ZkuyeJQeqLEyqldbYLG3wjqwpw4BVaAqvmxq3GYKK0b1A/yYQdIcJxkzAOWcNVWhJpRXAPfZFueekiY/L8Dw=="], + "c12": ["c12@3.3.1", "", { "dependencies": { "chokidar": "^4.0.3", "confbox": "^0.2.2", "defu": "^6.1.4", "dotenv": "^17.2.3", "exsolve": "^1.0.7", "giget": "^2.0.0", "jiti": "^2.6.1", "ohash": "^2.0.11", "pathe": "^2.0.3", "perfect-debounce": "^2.0.0", "pkg-types": "^2.3.0", "rc9": "^2.1.2" }, "peerDependencies": { "magicast": "^0.3.5" }, "optionalPeers": ["magicast"] }, "sha512-LcWQ01LT9tkoUINHgpIOv3mMs+Abv7oVCrtpMRi1PaapVEpWoMga5WuT7/DqFTu7URP9ftbOmimNw1KNIGh9DQ=="], "cac": ["cac@6.7.14", "", {}, "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ=="], @@ -4439,7 +4479,7 @@ "caniuse-api": ["caniuse-api@3.0.0", "", { "dependencies": { "browserslist": "^4.0.0", "caniuse-lite": "^1.0.0", "lodash.memoize": "^4.1.2", "lodash.uniq": "^4.5.0" } }, "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw=="], - "caniuse-lite": ["caniuse-lite@1.0.30001750", "", {}, "sha512-cuom0g5sdX6rw00qOoLNSFCJ9/mYIsuSOA+yzpDw8eopiFqcVwQvZHqov0vmEighRxX++cfC0Vg1G+1Iy/mSpQ=="], + "caniuse-lite": ["caniuse-lite@1.0.30001751", "", {}, "sha512-A0QJhug0Ly64Ii3eIqHu5X51ebln3k4yTUkY1j8drqpWHVreg/VLijN48cZ1bYPiqOQuqpkIKnzr/Ul8V+p6Cw=="], "canvaskit-wasm": ["canvaskit-wasm@0.40.0", "", { "dependencies": { "@webgpu/types": "0.1.21" } }, "sha512-Od2o+ZmoEw9PBdN/yCGvzfu0WVqlufBPEWNG452wY7E9aT8RBE+ChpZF526doOlg7zumO4iCS+RAeht4P0Gbpw=="], @@ -5079,7 +5119,7 @@ "env-paths": ["env-paths@2.2.1", "", {}, "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A=="], - "envinfo": ["envinfo@7.18.0", "", { "bin": { "envinfo": "dist/cli.js" } }, "sha512-02QGCLRW+Jb8PC270ic02lat+N57iBaWsvHjcJViqp6UVupRB+Vsg7brYPTqEFXvsdTql3KnSczv5ModZFpl8Q=="], + "envinfo": ["envinfo@7.19.0", "", { "bin": { "envinfo": "dist/cli.js" } }, "sha512-DoSM9VyG6O3vqBf+p3Gjgr/Q52HYBBtO3v+4koAxt1MnWr+zEnxE+nke/yXS4lt2P4SYCHQ4V3f1i88LQVOpAw=="], "environment": ["environment@1.1.0", "", {}, "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q=="], @@ -5381,6 +5421,8 @@ "fastest-levenshtein": ["fastest-levenshtein@1.0.16", "", {}, "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg=="], + "fastestsmallesttextencoderdecoder": ["fastestsmallesttextencoderdecoder@1.0.22", "", {}, "sha512-Pb8d48e+oIuY4MaM64Cd7OW1gt4nxCHs7/ddPPZ/Ic3sg8yVGM7O9wDvZ7us6ScaUupzM+pfBolwtYhN1IxBIw=="], + "fastq": ["fastq@1.19.1", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ=="], "faye-websocket": ["faye-websocket@0.11.4", "", { "dependencies": { "websocket-driver": ">=0.5.1" } }, "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g=="], @@ -6683,7 +6725,7 @@ "node-preload": ["node-preload@0.2.1", "", { "dependencies": { "process-on-spawn": "^1.0.0" } }, "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ=="], - "node-releases": ["node-releases@2.0.23", "", {}, "sha512-cCmFDMSm26S6tQSDpBCg/NR8NENrVPhAJSf+XbxBG4rPFaaonlEoE9wHQmun+cls499TQGSb7ZyPBRlzgKfpeg=="], + "node-releases": ["node-releases@2.0.25", "", {}, "sha512-4auku8B/vw5psvTiiN9j1dAOsXvMoGqJuKJcR+dTdqiXEK20mMTk1UEo3HS16LeGQsVG6+qKTPM9u/qQ2LqATA=="], "node-source-walk": ["node-source-walk@5.0.2", "", { "dependencies": { "@babel/parser": "^7.21.4" } }, "sha512-Y4jr/8SRS5hzEdZ7SGuvZGwfORvNsSsNRwDXx5WisiqzsVfeftDvRgfeqWNgZvWSJbgubTRVRYBzK6UO+ErqjA=="], @@ -8849,8 +8891,6 @@ "@babel/runtime/regenerator-runtime": ["regenerator-runtime@0.14.1", "", {}, "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw=="], - "@binance/w3w-qrcode-modal/qrcode": ["qrcode@1.5.4", "", { "dependencies": { "dijkstrajs": "^1.0.1", "pngjs": "^5.0.0", "yargs": "^15.3.1" }, "bin": { "qrcode": "bin/qrcode" } }, "sha512-1ca71Zgiu6ORjHqFBDpnSMTR2ReToX4l1Au1VFLyVeBTFavzQnv5JxMFr3ukHVKpSrSA2MCk0lNJSykjUfz7Zg=="], - "@chromatic-com/storybook/strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="], "@cloudflare/kv-asset-handler/mime": ["mime@3.0.0", "", { "bin": { "mime": "cli.js" } }, "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A=="], @@ -8865,7 +8905,7 @@ "@commitlint/load/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], - "@commitlint/load/cosmiconfig": ["cosmiconfig@8.0.0", "", { "dependencies": { "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", "parse-json": "^5.0.0", "path-type": "^4.0.0" } }, "sha512-da1EafcpH6b/TD8vDRaWV7xFINlHlF6zKsGwS1TsuVJTZRkquaS5HTMq7uq6h31619QjbsYl21gVDOm32KM1vQ=="], + "@commitlint/load/cosmiconfig": ["cosmiconfig@8.3.6", "", { "dependencies": { "import-fresh": "^3.3.0", "js-yaml": "^4.1.0", "parse-json": "^5.2.0", "path-type": "^4.0.0" }, "peerDependencies": { "typescript": ">=4.9.5" }, "optionalPeers": ["typescript"] }, "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA=="], "@commitlint/read/fs-extra": ["fs-extra@11.3.2", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A=="], @@ -8949,26 +8989,8 @@ "@ethersproject/basex/@ethersproject/properties": ["@ethersproject/properties@5.8.0", "", { "dependencies": { "@ethersproject/logger": "^5.8.0" } }, "sha512-PYuiEoQ+FMaZZNGrStmN7+lWjlsoufGIHdww7454FIaGdbe/p5rnaCXTr5MtBYl3NkeoVhHZuyzChPeGeKIpQw=="], - "@ethersproject/hdnode/@ethersproject/bignumber": ["@ethersproject/bignumber@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "bn.js": "^5.2.1" } }, "sha512-ZyaT24bHaSeJon2tGPKIiHszWjD/54Sz8t57Toch475lCLljC6MgPmxk7Gtzz+ddNN5LuHea9qhAe0x3D+uYPA=="], - - "@ethersproject/hdnode/@ethersproject/properties": ["@ethersproject/properties@5.8.0", "", { "dependencies": { "@ethersproject/logger": "^5.8.0" } }, "sha512-PYuiEoQ+FMaZZNGrStmN7+lWjlsoufGIHdww7454FIaGdbe/p5rnaCXTr5MtBYl3NkeoVhHZuyzChPeGeKIpQw=="], - - "@ethersproject/hdnode/@ethersproject/signing-key": ["@ethersproject/signing-key@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0", "bn.js": "^5.2.1", "elliptic": "6.6.1", "hash.js": "1.1.7" } }, "sha512-LrPW2ZxoigFi6U6aVkFN/fa9Yx/+4AtIUe4/HACTvKJdhm0eeb107EVCIQcrLZkxaSIgc/eCrX8Q1GtbH+9n3w=="], - - "@ethersproject/hdnode/@ethersproject/strings": ["@ethersproject/strings@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/constants": "^5.8.0", "@ethersproject/logger": "^5.8.0" } }, "sha512-qWEAk0MAvl0LszjdfnZ2uC8xbR2wdv4cDabyHiBh3Cldq/T8dPH3V4BbBsAYJUeonwD+8afVXld274Ls+Y1xXg=="], - - "@ethersproject/json-wallets/@ethersproject/address": ["@ethersproject/address@5.8.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/keccak256": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/rlp": "^5.8.0" } }, "sha512-GhH/abcC46LJwshoN+uBNoKVFPxUuZm6dA257z0vZkKmU1+t8xTn8oK7B9qrj8W2rFRMch4gbJl6PmVxjxBEBA=="], - - "@ethersproject/json-wallets/@ethersproject/keccak256": ["@ethersproject/keccak256@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "js-sha3": "0.8.0" } }, "sha512-A1pkKLZSz8pDaQ1ftutZoaN46I6+jvuqugx5KYNeQOPqq+JZ0Txm7dlWesCHB5cndJSu5vP2VKptKf7cksERng=="], - - "@ethersproject/json-wallets/@ethersproject/properties": ["@ethersproject/properties@5.8.0", "", { "dependencies": { "@ethersproject/logger": "^5.8.0" } }, "sha512-PYuiEoQ+FMaZZNGrStmN7+lWjlsoufGIHdww7454FIaGdbe/p5rnaCXTr5MtBYl3NkeoVhHZuyzChPeGeKIpQw=="], - - "@ethersproject/json-wallets/@ethersproject/strings": ["@ethersproject/strings@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/constants": "^5.8.0", "@ethersproject/logger": "^5.8.0" } }, "sha512-qWEAk0MAvl0LszjdfnZ2uC8xbR2wdv4cDabyHiBh3Cldq/T8dPH3V4BbBsAYJUeonwD+8afVXld274Ls+Y1xXg=="], - "@ethersproject/providers/ws": ["ws@7.4.6", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A=="], - "@ethersproject/signing-key/@ethersproject/properties": ["@ethersproject/properties@5.8.0", "", { "dependencies": { "@ethersproject/logger": "^5.8.0" } }, "sha512-PYuiEoQ+FMaZZNGrStmN7+lWjlsoufGIHdww7454FIaGdbe/p5rnaCXTr5MtBYl3NkeoVhHZuyzChPeGeKIpQw=="], - "@ethersproject/solidity/@ethersproject/bignumber": ["@ethersproject/bignumber@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "bn.js": "^5.2.1" } }, "sha512-ZyaT24bHaSeJon2tGPKIiHszWjD/54Sz8t57Toch475lCLljC6MgPmxk7Gtzz+ddNN5LuHea9qhAe0x3D+uYPA=="], "@ethersproject/solidity/@ethersproject/keccak256": ["@ethersproject/keccak256@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "js-sha3": "0.8.0" } }, "sha512-A1pkKLZSz8pDaQ1ftutZoaN46I6+jvuqugx5KYNeQOPqq+JZ0Txm7dlWesCHB5cndJSu5vP2VKptKf7cksERng=="], @@ -8987,20 +9009,8 @@ "@ethersproject/transactions/@ethersproject/signing-key": ["@ethersproject/signing-key@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0", "bn.js": "^5.2.1", "elliptic": "6.6.1", "hash.js": "1.1.7" } }, "sha512-LrPW2ZxoigFi6U6aVkFN/fa9Yx/+4AtIUe4/HACTvKJdhm0eeb107EVCIQcrLZkxaSIgc/eCrX8Q1GtbH+9n3w=="], - "@ethersproject/wallet/@ethersproject/address": ["@ethersproject/address@5.8.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/keccak256": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/rlp": "^5.8.0" } }, "sha512-GhH/abcC46LJwshoN+uBNoKVFPxUuZm6dA257z0vZkKmU1+t8xTn8oK7B9qrj8W2rFRMch4gbJl6PmVxjxBEBA=="], - - "@ethersproject/wallet/@ethersproject/bignumber": ["@ethersproject/bignumber@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "bn.js": "^5.2.1" } }, "sha512-ZyaT24bHaSeJon2tGPKIiHszWjD/54Sz8t57Toch475lCLljC6MgPmxk7Gtzz+ddNN5LuHea9qhAe0x3D+uYPA=="], - - "@ethersproject/wallet/@ethersproject/keccak256": ["@ethersproject/keccak256@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "js-sha3": "0.8.0" } }, "sha512-A1pkKLZSz8pDaQ1ftutZoaN46I6+jvuqugx5KYNeQOPqq+JZ0Txm7dlWesCHB5cndJSu5vP2VKptKf7cksERng=="], - - "@ethersproject/wallet/@ethersproject/properties": ["@ethersproject/properties@5.8.0", "", { "dependencies": { "@ethersproject/logger": "^5.8.0" } }, "sha512-PYuiEoQ+FMaZZNGrStmN7+lWjlsoufGIHdww7454FIaGdbe/p5rnaCXTr5MtBYl3NkeoVhHZuyzChPeGeKIpQw=="], - - "@ethersproject/wallet/@ethersproject/signing-key": ["@ethersproject/signing-key@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0", "bn.js": "^5.2.1", "elliptic": "6.6.1", "hash.js": "1.1.7" } }, "sha512-LrPW2ZxoigFi6U6aVkFN/fa9Yx/+4AtIUe4/HACTvKJdhm0eeb107EVCIQcrLZkxaSIgc/eCrX8Q1GtbH+9n3w=="], - "@expo/bunyan/uuid": ["uuid@8.3.2", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg=="], - "@expo/cli/@babel/runtime": ["@babel/runtime@7.28.2", "", {}, "sha512-KHp2IflsnGywDjBWDkR9iEqiWSpc8GIi0lgTT3mOElT0PP1tG26P4tmFI2YvAdzgq9RGyoHZQEIEdZy6Ec5xCA=="], - "@expo/cli/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], "@expo/cli/ci-info": ["ci-info@3.9.0", "", {}, "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ=="], @@ -9019,6 +9029,8 @@ "@expo/cli/picomatch": ["picomatch@3.0.1", "", {}, "sha512-I3EurrIQMlRc9IaAZnqRR044Phh2DXY+55o7uJ0V+hYZAcQYSuFWsc9q5PvyDHUSCe1Qxn/iBz+78s86zWnGag=="], + "@expo/cli/send": ["send@0.19.1", "", { "dependencies": { "debug": "2.6.9", "depd": "2.0.0", "destroy": "1.2.0", "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", "fresh": "0.5.2", "http-errors": "2.0.0", "mime": "1.6.0", "ms": "2.1.3", "on-finished": "2.4.1", "range-parser": "~1.2.1", "statuses": "2.0.1" } }, "sha512-p4rRk4f23ynFEfcD9LA0xRYngj+IyGiEYyqqOak8kaN0TvNmuxC2dcVeBn62GpCeR2CpWqyHCNScTP91QbAVFg=="], + "@expo/cli/source-map-support": ["source-map-support@0.5.21", "", { "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w=="], "@expo/cli/tar": ["tar@6.2.1", "", { "dependencies": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", "minipass": "^5.0.0", "minizlib": "^2.1.1", "mkdirp": "^1.0.3", "yallist": "^4.0.0" } }, "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A=="], @@ -9267,8 +9279,6 @@ "@graphql-tools/executor/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], - "@graphql-tools/executor-graphql-ws/@repeaterjs/repeater": ["@repeaterjs/repeater@3.0.4", "", {}, "sha512-AW8PKd6iX3vAZ0vA43nOUOnbq/X5ihgU+mSXXqunMkeQADGiqw/PY0JNeYtD5sr0PAy51YPgAPbDoeapv9r8WA=="], - "@graphql-tools/executor-graphql-ws/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], "@graphql-tools/executor-graphql-ws/ws": ["ws@8.13.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA=="], @@ -9473,8 +9483,6 @@ "@metamask/providers/readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="], - "@metamask/sdk/@babel/runtime": ["@babel/runtime@7.28.2", "", {}, "sha512-KHp2IflsnGywDjBWDkR9iEqiWSpc8GIi0lgTT3mOElT0PP1tG26P4tmFI2YvAdzgq9RGyoHZQEIEdZy6Ec5xCA=="], - "@metamask/sdk/cross-fetch": ["cross-fetch@4.1.0", "", { "dependencies": { "node-fetch": "^2.7.0" } }, "sha512-uKm5PU+MHTootlWEY+mZ4vvXoCn4fLQxT9dSc1sXVMSFkINTJVN8cAQROpwcKm8bJ/c7rgZVIBWzH5T78sNZZw=="], "@metamask/sdk/pump": ["pump@3.0.3", "", { "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" } }, "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA=="], @@ -9505,26 +9513,12 @@ "@nicolo-ribaudo/eslint-scope-5-internals/eslint-scope": ["eslint-scope@5.1.1", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" } }, "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw=="], - "@nx/devkit/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], - "@nx/eslint/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], - "@nx/jest/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], - - "@nx/js/@babel/core": ["@babel/core@7.28.4", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.3", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.28.3", "@babel/helpers": "^7.28.4", "@babel/parser": "^7.28.4", "@babel/template": "^7.27.2", "@babel/traverse": "^7.28.4", "@babel/types": "^7.28.4", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA=="], - - "@nx/js/@babel/runtime": ["@babel/runtime@7.28.2", "", {}, "sha512-KHp2IflsnGywDjBWDkR9iEqiWSpc8GIi0lgTT3mOElT0PP1tG26P4tmFI2YvAdzgq9RGyoHZQEIEdZy6Ec5xCA=="], - "@nx/js/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], - "@nx/js/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], - - "@nx/plugin/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], - "@nx/workspace/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], - "@nx/workspace/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], - "@octokit/endpoint/is-plain-object": ["is-plain-object@5.0.0", "", {}, "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q=="], "@octokit/request/is-plain-object": ["is-plain-object@5.0.0", "", {}, "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q=="], @@ -9807,6 +9801,12 @@ "@solana-mobile/wallet-standard-mobile/qrcode": ["qrcode@1.5.4", "", { "dependencies": { "dijkstrajs": "^1.0.1", "pngjs": "^5.0.0", "yargs": "^15.3.1" }, "bin": { "qrcode": "bin/qrcode" } }, "sha512-1ca71Zgiu6ORjHqFBDpnSMTR2ReToX4l1Au1VFLyVeBTFavzQnv5JxMFr3ukHVKpSrSA2MCk0lNJSykjUfz7Zg=="], + "@solana/errors/chalk": ["chalk@5.6.2", "", {}, "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA=="], + + "@solana/errors/commander": ["commander@14.0.1", "", {}, "sha512-2JkV3gUZUVrbNA+1sjBOYLsMZ5cEEl8GTFP2a4AVz5hvasAMCQ1D2l2le/cX+pV4N6ZU17zjUahLpIXRrnWL8A=="], + + "@solana/wallet-standard-util/@noble/curves": ["@noble/curves@1.9.7", "", { "dependencies": { "@noble/hashes": "1.8.0" } }, "sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw=="], + "@solana/web3.js/bs58": ["bs58@4.0.1", "", { "dependencies": { "base-x": "^3.0.2" } }, "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw=="], "@solana/web3.js/node-fetch": ["node-fetch@2.7.0", "", { "dependencies": { "whatwg-url": "^5.0.0" }, "peerDependencies": { "encoding": "^0.1.0" }, "optionalPeers": ["encoding"] }, "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A=="], @@ -9815,8 +9815,6 @@ "@storybook/addon-actions/polished": ["polished@4.3.1", "", { "dependencies": { "@babel/runtime": "^7.17.8" } }, "sha512-OBatVyC/N7SCW/FaDHrSd+vn0o5cS855TOmYi4OkdWUMSJCET/xip//ch8xGUvtr3i44X9LVyWwQlRMTN3pwSA=="], - "@storybook/addon-actions/uuid": ["uuid@9.0.1", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA=="], - "@storybook/addon-essentials/@storybook/addon-controls": ["@storybook/addon-controls@8.5.2", "", { "dependencies": { "@storybook/global": "^5.0.0", "dequal": "^2.0.2", "ts-dedent": "^2.0.0" }, "peerDependencies": { "storybook": "^8.5.2" } }, "sha512-wkzw2vRff4zkzdvC/GOlB2PlV0i973u8igSLeg34TWNEAa4bipwVHnFfIojRuP9eN1bZL/0tjuU5pKnbTqH7aQ=="], "@storybook/addon-interactions/polished": ["polished@4.3.1", "", { "dependencies": { "@babel/runtime": "^7.17.8" } }, "sha512-OBatVyC/N7SCW/FaDHrSd+vn0o5cS855TOmYi4OkdWUMSJCET/xip//ch8xGUvtr3i44X9LVyWwQlRMTN3pwSA=="], @@ -9865,8 +9863,6 @@ "@storybook/test/@vitest/spy": ["@vitest/spy@2.0.5", "", { "dependencies": { "tinyspy": "^3.0.0" } }, "sha512-c/jdthAhvJdpfVuaexSrnawxZz6pywlTPe84LUB2m/4t3rl2fTo9NFGBG4oWgaD+FTgDDV8hJ/nibT7IfH3JfA=="], - "@storybook/test-runner/@babel/core": ["@babel/core@7.28.4", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.3", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.28.3", "@babel/helpers": "^7.28.4", "@babel/parser": "^7.28.4", "@babel/template": "^7.27.2", "@babel/traverse": "^7.28.4", "@babel/types": "^7.28.4", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA=="], - "@storybook/test-runner/@storybook/csf": ["@storybook/csf@0.1.13", "", { "dependencies": { "type-fest": "^2.19.0" } }, "sha512-7xOOwCLGB3ebM87eemep89MYRFTko+D8qE7EdAAq74lgdqRR5cOUtYWJLjO2dLtP94nqoOdHJo6MdLLKzg412Q=="], "@surma/rollup-plugin-off-main-thread/magic-string": ["magic-string@0.25.9", "", { "dependencies": { "sourcemap-codec": "^1.4.8" } }, "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ=="], @@ -9903,8 +9899,6 @@ "@tamagui/static/@babel/core": ["@babel/core@7.28.4", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.3", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.28.3", "@babel/helpers": "^7.28.4", "@babel/parser": "^7.28.4", "@babel/template": "^7.27.2", "@babel/traverse": "^7.28.4", "@babel/types": "^7.28.4", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA=="], - "@tamagui/static/@babel/runtime": ["@babel/runtime@7.28.2", "", {}, "sha512-KHp2IflsnGywDjBWDkR9iEqiWSpc8GIi0lgTT3mOElT0PP1tG26P4tmFI2YvAdzgq9RGyoHZQEIEdZy6Ec5xCA=="], - "@tamagui/static/esbuild": ["esbuild@0.24.2", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.24.2", "@esbuild/android-arm": "0.24.2", "@esbuild/android-arm64": "0.24.2", "@esbuild/android-x64": "0.24.2", "@esbuild/darwin-arm64": "0.24.2", "@esbuild/darwin-x64": "0.24.2", "@esbuild/freebsd-arm64": "0.24.2", "@esbuild/freebsd-x64": "0.24.2", "@esbuild/linux-arm": "0.24.2", "@esbuild/linux-arm64": "0.24.2", "@esbuild/linux-ia32": "0.24.2", "@esbuild/linux-loong64": "0.24.2", "@esbuild/linux-mips64el": "0.24.2", "@esbuild/linux-ppc64": "0.24.2", "@esbuild/linux-riscv64": "0.24.2", "@esbuild/linux-s390x": "0.24.2", "@esbuild/linux-x64": "0.24.2", "@esbuild/netbsd-arm64": "0.24.2", "@esbuild/netbsd-x64": "0.24.2", "@esbuild/openbsd-arm64": "0.24.2", "@esbuild/openbsd-x64": "0.24.2", "@esbuild/sunos-x64": "0.24.2", "@esbuild/win32-arm64": "0.24.2", "@esbuild/win32-ia32": "0.24.2", "@esbuild/win32-x64": "0.24.2" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA=="], "@tamagui/static/fs-extra": ["fs-extra@11.3.2", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A=="], @@ -9937,8 +9931,6 @@ "@tybys/wasm-util/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], - "@types/express/@types/express-serve-static-core": ["@types/express-serve-static-core@4.19.7", "", { "dependencies": { "@types/node": "*", "@types/qs": "*", "@types/range-parser": "*", "@types/send": "*" } }, "sha512-FvPtiIf1LfhzsaIXhv/PHan/2FeQBbtBDtfX2QfvPxdUelMDEckK08SM6nqo1MIZY3RUlfA+HV8+hFUSio78qg=="], - "@types/request/form-data": ["form-data@2.5.5", "", { "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", "hasown": "^2.0.2", "mime-types": "^2.1.35", "safe-buffer": "^5.2.1" } }, "sha512-jqdObeR2rxZZbPSGL+3VckHMYtu+f9//KXBsVny6JSX/pa38Fy+bGjuG8eW/H6USNQWhLi8Num++cU2yOCNz4A=="], "@typescript-eslint/typescript-estree/globby": ["globby@11.1.0", "", { "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", "fast-glob": "^3.2.9", "ignore": "^5.2.0", "merge2": "^1.4.1", "slash": "^3.0.0" } }, "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g=="], @@ -10833,8 +10825,6 @@ "jest-util/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], - "jest-util/picomatch": ["picomatch@4.0.3", "", {}, "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="], - "jest-validate/@jest/types": ["@jest/types@30.2.0", "", { "dependencies": { "@jest/pattern": "30.0.1", "@jest/schemas": "30.0.5", "@types/istanbul-lib-coverage": "^2.0.6", "@types/istanbul-reports": "^3.0.4", "@types/node": "*", "@types/yargs": "^17.0.33", "chalk": "^4.1.2" } }, "sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg=="], "jest-validate/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], @@ -10881,10 +10871,6 @@ "keccak/readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="], - "knip/picomatch": ["picomatch@4.0.3", "", {}, "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="], - - "knip/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], - "latest-version/package-json": ["package-json@10.0.1", "", { "dependencies": { "ky": "^1.2.0", "registry-auth-token": "^5.0.2", "registry-url": "^6.0.1", "semver": "^7.6.0" } }, "sha512-ua1L4OgXSBdsu1FPb7F3tYH0F48a6kxvod4pLUlGY9COeJAJQNX/sNH2IiEmsxw7lqYiAwrdHMjz1FctOsyDQg=="], "lazystream/readable-stream": ["readable-stream@2.3.8", "", { "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA=="], @@ -10933,8 +10919,6 @@ "matcher-collection/minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], - "md5.js/hash-base": ["hash-base@3.1.2", "", { "dependencies": { "inherits": "^2.0.4", "readable-stream": "^2.3.8", "safe-buffer": "^5.2.1", "to-buffer": "^1.2.1" } }, "sha512-Bb33KbowVTIj5s7Ked1OsqHUeCpz//tPwR+E2zJgJKo9Z5XolZ9b6bdUgjmYlwnWhoOQKoTd1TYToZGn5mAYOg=="], - "meow/type-fest": ["type-fest@0.18.1", "", {}, "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw=="], "meow/yargs-parser": ["yargs-parser@20.2.9", "", {}, "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w=="], @@ -10973,10 +10957,6 @@ "metro-file-map/jest-worker": ["jest-worker@29.7.0", "", { "dependencies": { "@types/node": "*", "jest-util": "^29.7.0", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" } }, "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw=="], - "metro-minify-terser/terser": ["terser@5.44.0", "", { "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.15.0", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, "bin": { "terser": "bin/terser" } }, "sha512-nIVck8DK+GM/0Frwd+nIhZ84pR/BX7rmXMfYwyg+Sri5oGVE99/E3KvXqpC2xHFxyqXyGHTKBSioxxplrO4I4w=="], - - "metro-runtime/@babel/runtime": ["@babel/runtime@7.28.2", "", {}, "sha512-KHp2IflsnGywDjBWDkR9iEqiWSpc8GIi0lgTT3mOElT0PP1tG26P4tmFI2YvAdzgq9RGyoHZQEIEdZy6Ec5xCA=="], - "metro-source-map/source-map": ["source-map@0.5.7", "", {}, "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ=="], "metro-source-map/vlq": ["vlq@1.0.1", "", {}, "sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w=="], @@ -11577,8 +11557,6 @@ "tamagui-loader/esbuild-loader": ["esbuild-loader@4.4.0", "", { "dependencies": { "esbuild": "^0.25.0", "get-tsconfig": "^4.10.1", "loader-utils": "^2.0.4", "webpack-sources": "^1.4.3" }, "peerDependencies": { "webpack": "^4.40.0 || ^5.0.0" } }, "sha512-4J+hXTpTtEdzUNLoY8ReqDNJx2NoldfiljRCiKbeYUuZmVaiJeDqFgyAzz8uOopaekwRoCcqBFyEroGQLFVZ1g=="], - "tamagui-loader/fs-extra": ["fs-extra@11.3.2", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A=="], - "tamagui-loader/loader-utils": ["loader-utils@3.3.1", "", {}, "sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg=="], "tar/mkdirp": ["mkdirp@0.5.6", "", { "dependencies": { "minimist": "^1.2.6" }, "bin": { "mkdirp": "bin/cmd.js" } }, "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw=="], @@ -11695,18 +11673,12 @@ "vinyl-sourcemap/vinyl": ["vinyl@2.2.1", "", { "dependencies": { "clone": "^2.1.1", "clone-buffer": "^1.0.0", "clone-stats": "^1.0.0", "cloneable-readable": "^1.0.0", "remove-trailing-separator": "^1.0.1", "replace-ext": "^1.0.0" } }, "sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw=="], - "vite/picomatch": ["picomatch@4.0.3", "", {}, "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="], - - "vite-plugin-bundlesize/picomatch": ["picomatch@4.0.3", "", {}, "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="], - "vite-plugin-bundlesize/strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="], "vite-plugin-svgr/@svgr/core": ["@svgr/core@8.1.0", "", { "dependencies": { "@babel/core": "^7.21.3", "@svgr/babel-preset": "8.1.0", "camelcase": "^6.2.0", "cosmiconfig": "^8.1.3", "snake-case": "^3.0.4" } }, "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA=="], "vite-plugin-svgr/@svgr/plugin-jsx": ["@svgr/plugin-jsx@8.1.0", "", { "dependencies": { "@babel/core": "^7.21.3", "@svgr/babel-preset": "8.1.0", "@svgr/hast-util-to-babel-ast": "8.0.0", "svg-parser": "^2.0.4" }, "peerDependencies": { "@svgr/core": "*" } }, "sha512-0xiIyBsLlr8quN+WyuxooNW9RJ0Dpr8uOnH/xrCVO8GLUcwHISwj1AG0k+LFzteTkAA0GbX0kj9q6Dk70PTiPA=="], - "vitest/picomatch": ["picomatch@4.0.3", "", {}, "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="], - "vitest/vite-node": ["vite-node@3.2.1", "", { "dependencies": { "cac": "^6.7.14", "debug": "^4.4.1", "es-module-lexer": "^1.7.0", "pathe": "^2.0.3", "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" }, "bin": { "vite-node": "vite-node.mjs" } }, "sha512-V4EyKQPxquurNJPtQJRZo8hKOoKNBRIhxcDbQFPFig0JdoWcUhwRgK8yoCXXrfYVPKS6XwirGHPszLnR8FbjCA=="], "wagmi/use-sync-external-store": ["use-sync-external-store@1.4.0", "", { "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-9WXSPC5fMv61vaupRkCKCxsPxBocVnwakBEkMIHHpkTTg6icbJtg6jzgtLDm4bl3cSHAca52rYWih0k4K3PfHw=="], @@ -11839,8 +11811,6 @@ "@babel/register/source-map-support/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], - "@binance/w3w-qrcode-modal/qrcode/yargs": ["yargs@15.4.1", "", { "dependencies": { "cliui": "^6.0.0", "decamelize": "^1.2.0", "find-up": "^4.1.0", "get-caller-file": "^2.0.1", "require-directory": "^2.1.1", "require-main-filename": "^2.0.0", "set-blocking": "^2.0.0", "string-width": "^4.2.0", "which-module": "^2.0.0", "y18n": "^4.0.0", "yargs-parser": "^18.1.2" } }, "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A=="], - "@chromatic-com/storybook/strip-ansi/ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], "@commitlint/format/chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], @@ -11877,12 +11847,6 @@ "@ethersproject/abstract-provider/@ethersproject/web/@ethersproject/strings": ["@ethersproject/strings@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/constants": "^5.8.0", "@ethersproject/logger": "^5.8.0" } }, "sha512-qWEAk0MAvl0LszjdfnZ2uC8xbR2wdv4cDabyHiBh3Cldq/T8dPH3V4BbBsAYJUeonwD+8afVXld274Ls+Y1xXg=="], - "@ethersproject/hdnode/@ethersproject/strings/@ethersproject/constants": ["@ethersproject/constants@5.8.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.8.0" } }, "sha512-wigX4lrf5Vu+axVTIvNsuL6YrV4O5AXl5ubcURKMEME5TnWBouUh0CDTWxZ2GpnRn1kcCgE7l8O5+VbV9QTTcg=="], - - "@ethersproject/json-wallets/@ethersproject/address/@ethersproject/bignumber": ["@ethersproject/bignumber@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "bn.js": "^5.2.1" } }, "sha512-ZyaT24bHaSeJon2tGPKIiHszWjD/54Sz8t57Toch475lCLljC6MgPmxk7Gtzz+ddNN5LuHea9qhAe0x3D+uYPA=="], - - "@ethersproject/json-wallets/@ethersproject/strings/@ethersproject/constants": ["@ethersproject/constants@5.8.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.8.0" } }, "sha512-wigX4lrf5Vu+axVTIvNsuL6YrV4O5AXl5ubcURKMEME5TnWBouUh0CDTWxZ2GpnRn1kcCgE7l8O5+VbV9QTTcg=="], - "@ethersproject/solidity/@ethersproject/strings/@ethersproject/constants": ["@ethersproject/constants@5.8.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.8.0" } }, "sha512-wigX4lrf5Vu+axVTIvNsuL6YrV4O5AXl5ubcURKMEME5TnWBouUh0CDTWxZ2GpnRn1kcCgE7l8O5+VbV9QTTcg=="], "@expo/cli/chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], @@ -11911,6 +11875,10 @@ "@expo/cli/ora/strip-ansi": ["strip-ansi@5.2.0", "", { "dependencies": { "ansi-regex": "^4.1.0" } }, "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA=="], + "@expo/cli/send/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], + + "@expo/cli/send/range-parser": ["range-parser@1.2.1", "", {}, "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="], + "@expo/cli/source-map-support/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], "@expo/cli/tar/chownr": ["chownr@2.0.0", "", {}, "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ=="], @@ -12361,6 +12329,10 @@ "@solana/web3.js/node-fetch/whatwg-url": ["whatwg-url@5.0.0", "", { "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" } }, "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw=="], + "@storybook/addon-actions/polished/@babel/runtime": ["@babel/runtime@7.28.2", "", {}, "sha512-KHp2IflsnGywDjBWDkR9iEqiWSpc8GIi0lgTT3mOElT0PP1tG26P4tmFI2YvAdzgq9RGyoHZQEIEdZy6Ec5xCA=="], + + "@storybook/addon-interactions/polished/@babel/runtime": ["@babel/runtime@7.28.2", "", {}, "sha512-KHp2IflsnGywDjBWDkR9iEqiWSpc8GIi0lgTT3mOElT0PP1tG26P4tmFI2YvAdzgq9RGyoHZQEIEdZy6Ec5xCA=="], + "@storybook/builder-webpack5/terser-webpack-plugin/schema-utils": ["schema-utils@4.3.3", "", { "dependencies": { "@types/json-schema": "^7.0.9", "ajv": "^8.9.0", "ajv-formats": "^2.1.1", "ajv-keywords": "^5.1.0" } }, "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA=="], "@storybook/builder-webpack5/terser-webpack-plugin/terser": ["terser@5.44.0", "", { "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.15.0", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, "bin": { "terser": "bin/terser" } }, "sha512-nIVck8DK+GM/0Frwd+nIhZ84pR/BX7rmXMfYwyg+Sri5oGVE99/E3KvXqpC2xHFxyqXyGHTKBSioxxplrO4I4w=="], @@ -12375,6 +12347,8 @@ "@storybook/preset-react-webpack/find-up/locate-path": ["locate-path@6.0.0", "", { "dependencies": { "p-locate": "^5.0.0" } }, "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw=="], + "@storybook/react-native-theming/polished/@babel/runtime": ["@babel/runtime@7.28.2", "", {}, "sha512-KHp2IflsnGywDjBWDkR9iEqiWSpc8GIi0lgTT3mOElT0PP1tG26P4tmFI2YvAdzgq9RGyoHZQEIEdZy6Ec5xCA=="], + "@storybook/react-native-ui/@storybook/react/@storybook/components": ["@storybook/components@8.6.14", "", { "peerDependencies": { "storybook": "^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0" } }, "sha512-HNR2mC5I4Z5ek8kTrVZlIY/B8gJGs5b3XdZPBPBopTIN6U/YHXiDyOjY3JlaS4fSG1fVhp/Qp1TpMn1w/9m1pw=="], "@storybook/react-native-ui/@storybook/react/@storybook/manager-api": ["@storybook/manager-api@8.6.14", "", { "peerDependencies": { "storybook": "^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0" } }, "sha512-ez0Zihuy17udLbfHZQXkGqwtep0mSGgHcNzGN7iZrMP1m+VmNo+7aGCJJdvXi7+iU3yq8weXSQFWg5DqWgLS7g=="], @@ -12385,6 +12359,8 @@ "@storybook/react-native-ui/@storybook/react/@storybook/theming": ["@storybook/theming@8.6.14", "", { "peerDependencies": { "storybook": "^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0" } }, "sha512-r4y+LsiB37V5hzpQo+BM10PaCsp7YlZ0YcZzQP1OCkPlYXmUAFy2VvDKaFRpD8IeNPKug2u4iFm/laDEbs03dg=="], + "@storybook/react-native-ui/polished/@babel/runtime": ["@babel/runtime@7.28.2", "", {}, "sha512-KHp2IflsnGywDjBWDkR9iEqiWSpc8GIi0lgTT3mOElT0PP1tG26P4tmFI2YvAdzgq9RGyoHZQEIEdZy6Ec5xCA=="], + "@storybook/react-native/glob/minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], "@storybook/test/@testing-library/jest-dom/chalk": ["chalk@3.0.0", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg=="], @@ -13461,8 +13437,6 @@ "matcher-collection/minimatch/brace-expansion": ["brace-expansion@1.1.12", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg=="], - "md5.js/hash-base/readable-stream": ["readable-stream@2.3.8", "", { "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA=="], - "metro-config/cosmiconfig/import-fresh": ["import-fresh@2.0.0", "", { "dependencies": { "caller-path": "^2.0.0", "resolve-from": "^3.0.0" } }, "sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg=="], "metro-config/cosmiconfig/js-yaml": ["js-yaml@3.14.1", "", { "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g=="], @@ -13471,14 +13445,10 @@ "metro-config/jest-validate/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], - "metro-config/metro-runtime/@babel/runtime": ["@babel/runtime@7.28.2", "", {}, "sha512-KHp2IflsnGywDjBWDkR9iEqiWSpc8GIi0lgTT3mOElT0PP1tG26P4tmFI2YvAdzgq9RGyoHZQEIEdZy6Ec5xCA=="], - "metro-file-map/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], "metro-file-map/jest-worker/jest-util": ["jest-util@29.7.0", "", { "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", "graceful-fs": "^4.2.9", "picomatch": "^2.2.3" } }, "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA=="], - "metro-minify-terser/terser/source-map-support": ["source-map-support@0.5.21", "", { "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w=="], - "metro-transform-worker/metro-source-map/metro-symbolicate": ["metro-symbolicate@0.81.1", "", { "dependencies": { "flow-enums-runtime": "^0.0.6", "invariant": "^2.2.4", "metro-source-map": "0.81.1", "nullthrows": "^1.1.1", "source-map": "^0.5.6", "vlq": "^1.0.0" }, "bin": { "metro-symbolicate": "src/index.js" } }, "sha512-Lgk0qjEigtFtsM7C0miXITbcV47E1ZYIfB+m/hCraihiwRWkNUQEPCWvqZmwXKSwVE5mXA0EzQtghAvQSjZDxw=="], "metro-transform-worker/metro-source-map/ob1": ["ob1@0.81.1", "", { "dependencies": { "flow-enums-runtime": "^0.0.6" } }, "sha512-1PEbvI+AFvOcgdNcO79FtDI1TUO8S3lhiKOyAiyWQF3sFDDKS+aw2/BZvGlArFnSmqckwOOB9chQuIX0/OahoQ=="], @@ -13497,8 +13467,6 @@ "metro/jest-worker/jest-util": ["jest-util@29.7.0", "", { "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", "graceful-fs": "^4.2.9", "picomatch": "^2.2.3" } }, "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA=="], - "metro/metro-runtime/@babel/runtime": ["@babel/runtime@7.28.2", "", {}, "sha512-KHp2IflsnGywDjBWDkR9iEqiWSpc8GIi0lgTT3mOElT0PP1tG26P4tmFI2YvAdzgq9RGyoHZQEIEdZy6Ec5xCA=="], - "metro/metro-source-map/ob1": ["ob1@0.81.1", "", { "dependencies": { "flow-enums-runtime": "^0.0.6" } }, "sha512-1PEbvI+AFvOcgdNcO79FtDI1TUO8S3lhiKOyAiyWQF3sFDDKS+aw2/BZvGlArFnSmqckwOOB9chQuIX0/OahoQ=="], "metro/metro-source-map/vlq": ["vlq@1.0.1", "", {}, "sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w=="], @@ -13827,7 +13795,7 @@ "storybook/@storybook/core/@storybook/csf": ["@storybook/csf@0.1.12", "", { "dependencies": { "type-fest": "^2.19.0" } }, "sha512-9/exVhabisyIVL0VxTCxo01Tdm8wefIXKXfltAPTSr8cbLn5JAxGQ6QV3mjdecLGEOucfoVhAKtJfVHxEK1iqw=="], - "storybook/@storybook/core/esbuild": ["esbuild@0.19.12", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.19.12", "@esbuild/android-arm": "0.19.12", "@esbuild/android-arm64": "0.19.12", "@esbuild/android-x64": "0.19.12", "@esbuild/darwin-arm64": "0.19.12", "@esbuild/darwin-x64": "0.19.12", "@esbuild/freebsd-arm64": "0.19.12", "@esbuild/freebsd-x64": "0.19.12", "@esbuild/linux-arm": "0.19.12", "@esbuild/linux-arm64": "0.19.12", "@esbuild/linux-ia32": "0.19.12", "@esbuild/linux-loong64": "0.19.12", "@esbuild/linux-mips64el": "0.19.12", "@esbuild/linux-ppc64": "0.19.12", "@esbuild/linux-riscv64": "0.19.12", "@esbuild/linux-s390x": "0.19.12", "@esbuild/linux-x64": "0.19.12", "@esbuild/netbsd-x64": "0.19.12", "@esbuild/openbsd-x64": "0.19.12", "@esbuild/sunos-x64": "0.19.12", "@esbuild/win32-arm64": "0.19.12", "@esbuild/win32-ia32": "0.19.12", "@esbuild/win32-x64": "0.19.12" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg=="], + "storybook/@storybook/core/esbuild": ["esbuild@0.24.2", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.24.2", "@esbuild/android-arm": "0.24.2", "@esbuild/android-arm64": "0.24.2", "@esbuild/android-x64": "0.24.2", "@esbuild/darwin-arm64": "0.24.2", "@esbuild/darwin-x64": "0.24.2", "@esbuild/freebsd-arm64": "0.24.2", "@esbuild/freebsd-x64": "0.24.2", "@esbuild/linux-arm": "0.24.2", "@esbuild/linux-arm64": "0.24.2", "@esbuild/linux-ia32": "0.24.2", "@esbuild/linux-loong64": "0.24.2", "@esbuild/linux-mips64el": "0.24.2", "@esbuild/linux-ppc64": "0.24.2", "@esbuild/linux-riscv64": "0.24.2", "@esbuild/linux-s390x": "0.24.2", "@esbuild/linux-x64": "0.24.2", "@esbuild/netbsd-arm64": "0.24.2", "@esbuild/netbsd-x64": "0.24.2", "@esbuild/openbsd-arm64": "0.24.2", "@esbuild/openbsd-x64": "0.24.2", "@esbuild/sunos-x64": "0.24.2", "@esbuild/win32-arm64": "0.24.2", "@esbuild/win32-ia32": "0.24.2", "@esbuild/win32-x64": "0.24.2" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA=="], "styled-components/@emotion/is-prop-valid/@emotion/memoize": ["@emotion/memoize@0.9.0", "", {}, "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ=="], @@ -13893,6 +13861,8 @@ "unstorage/chokidar/readdirp": ["readdirp@4.1.2", "", {}, "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg=="], + "update-check/registry-auth-token/safe-buffer": ["safe-buffer@5.1.2", "", {}, "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="], + "update-notifier/boxen/camelcase": ["camelcase@8.0.0", "", {}, "sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA=="], "update-notifier/boxen/string-width": ["string-width@7.2.0", "", { "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", "strip-ansi": "^7.1.0" } }, "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ=="], @@ -14055,12 +14025,6 @@ "@babel/register/find-cache-dir/pkg-dir/find-up": ["find-up@3.0.0", "", { "dependencies": { "locate-path": "^3.0.0" } }, "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg=="], - "@binance/w3w-qrcode-modal/qrcode/yargs/cliui": ["cliui@6.0.0", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", "wrap-ansi": "^6.2.0" } }, "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ=="], - - "@binance/w3w-qrcode-modal/qrcode/yargs/y18n": ["y18n@4.0.3", "", {}, "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ=="], - - "@binance/w3w-qrcode-modal/qrcode/yargs/yargs-parser": ["yargs-parser@18.1.3", "", { "dependencies": { "camelcase": "^5.0.0", "decamelize": "^1.2.0" } }, "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ=="], - "@commitlint/format/chalk/supports-color/has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], "@commitlint/load/chalk/supports-color/has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], @@ -14079,8 +14043,6 @@ "@ethersproject/abstract-provider/@ethersproject/web/@ethersproject/strings/@ethersproject/constants": ["@ethersproject/constants@5.8.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.8.0" } }, "sha512-wigX4lrf5Vu+axVTIvNsuL6YrV4O5AXl5ubcURKMEME5TnWBouUh0CDTWxZ2GpnRn1kcCgE7l8O5+VbV9QTTcg=="], - "@ethersproject/json-wallets/@ethersproject/strings/@ethersproject/constants/@ethersproject/bignumber": ["@ethersproject/bignumber@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "bn.js": "^5.2.1" } }, "sha512-ZyaT24bHaSeJon2tGPKIiHszWjD/54Sz8t57Toch475lCLljC6MgPmxk7Gtzz+ddNN5LuHea9qhAe0x3D+uYPA=="], - "@expo/cli/chalk/supports-color/has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], "@expo/cli/glob/foreground-child/signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="], @@ -14093,6 +14055,8 @@ "@expo/cli/ora/strip-ansi/ansi-regex": ["ansi-regex@4.1.1", "", {}, "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g=="], + "@expo/cli/send/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], + "@expo/cli/tar/fs-minipass/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="], "@expo/cli/tar/minizlib/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="], @@ -14711,10 +14675,6 @@ "madge/chalk/supports-color/has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], - "md5.js/hash-base/readable-stream/safe-buffer": ["safe-buffer@5.1.2", "", {}, "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="], - - "md5.js/hash-base/readable-stream/string_decoder": ["string_decoder@1.1.1", "", { "dependencies": { "safe-buffer": "~5.1.0" } }, "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg=="], - "metro-config/cosmiconfig/import-fresh/resolve-from": ["resolve-from@3.0.0", "", {}, "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw=="], "metro-config/cosmiconfig/js-yaml/argparse": ["argparse@1.0.10", "", { "dependencies": { "sprintf-js": "~1.0.2" } }, "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg=="], @@ -14729,8 +14689,6 @@ "metro-file-map/jest-worker/jest-util/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], - "metro-minify-terser/terser/source-map-support/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], - "metro/chalk/supports-color/has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], "metro/jest-worker/jest-util/ci-info": ["ci-info@3.9.0", "", {}, "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ=="], @@ -14947,51 +14905,55 @@ "static-eval/escodegen/optionator/type-check": ["type-check@0.3.2", "", { "dependencies": { "prelude-ls": "~1.1.2" } }, "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg=="], - "storybook/@storybook/core/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.19.12", "", { "os": "aix", "cpu": "ppc64" }, "sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA=="], + "storybook/@storybook/core/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.24.2", "", { "os": "aix", "cpu": "ppc64" }, "sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA=="], - "storybook/@storybook/core/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.19.12", "", { "os": "android", "cpu": "arm" }, "sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w=="], + "storybook/@storybook/core/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.24.2", "", { "os": "android", "cpu": "arm" }, "sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q=="], - "storybook/@storybook/core/esbuild/@esbuild/android-arm64": ["@esbuild/android-arm64@0.19.12", "", { "os": "android", "cpu": "arm64" }, "sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA=="], + "storybook/@storybook/core/esbuild/@esbuild/android-arm64": ["@esbuild/android-arm64@0.24.2", "", { "os": "android", "cpu": "arm64" }, "sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg=="], - "storybook/@storybook/core/esbuild/@esbuild/android-x64": ["@esbuild/android-x64@0.19.12", "", { "os": "android", "cpu": "x64" }, "sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew=="], + "storybook/@storybook/core/esbuild/@esbuild/android-x64": ["@esbuild/android-x64@0.24.2", "", { "os": "android", "cpu": "x64" }, "sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw=="], - "storybook/@storybook/core/esbuild/@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.19.12", "", { "os": "darwin", "cpu": "arm64" }, "sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g=="], + "storybook/@storybook/core/esbuild/@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.24.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA=="], - "storybook/@storybook/core/esbuild/@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.19.12", "", { "os": "darwin", "cpu": "x64" }, "sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A=="], + "storybook/@storybook/core/esbuild/@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.24.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA=="], - "storybook/@storybook/core/esbuild/@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.19.12", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA=="], + "storybook/@storybook/core/esbuild/@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.24.2", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg=="], - "storybook/@storybook/core/esbuild/@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.19.12", "", { "os": "freebsd", "cpu": "x64" }, "sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg=="], + "storybook/@storybook/core/esbuild/@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.24.2", "", { "os": "freebsd", "cpu": "x64" }, "sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q=="], - "storybook/@storybook/core/esbuild/@esbuild/linux-arm": ["@esbuild/linux-arm@0.19.12", "", { "os": "linux", "cpu": "arm" }, "sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w=="], + "storybook/@storybook/core/esbuild/@esbuild/linux-arm": ["@esbuild/linux-arm@0.24.2", "", { "os": "linux", "cpu": "arm" }, "sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA=="], - "storybook/@storybook/core/esbuild/@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.19.12", "", { "os": "linux", "cpu": "arm64" }, "sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA=="], + "storybook/@storybook/core/esbuild/@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.24.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg=="], - "storybook/@storybook/core/esbuild/@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.19.12", "", { "os": "linux", "cpu": "ia32" }, "sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA=="], + "storybook/@storybook/core/esbuild/@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.24.2", "", { "os": "linux", "cpu": "ia32" }, "sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw=="], - "storybook/@storybook/core/esbuild/@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.19.12", "", { "os": "linux", "cpu": "none" }, "sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA=="], + "storybook/@storybook/core/esbuild/@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.24.2", "", { "os": "linux", "cpu": "none" }, "sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ=="], - "storybook/@storybook/core/esbuild/@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.19.12", "", { "os": "linux", "cpu": "none" }, "sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w=="], + "storybook/@storybook/core/esbuild/@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.24.2", "", { "os": "linux", "cpu": "none" }, "sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw=="], - "storybook/@storybook/core/esbuild/@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.19.12", "", { "os": "linux", "cpu": "ppc64" }, "sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg=="], + "storybook/@storybook/core/esbuild/@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.24.2", "", { "os": "linux", "cpu": "ppc64" }, "sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw=="], - "storybook/@storybook/core/esbuild/@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.19.12", "", { "os": "linux", "cpu": "none" }, "sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg=="], + "storybook/@storybook/core/esbuild/@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.24.2", "", { "os": "linux", "cpu": "none" }, "sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q=="], - "storybook/@storybook/core/esbuild/@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.19.12", "", { "os": "linux", "cpu": "s390x" }, "sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg=="], + "storybook/@storybook/core/esbuild/@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.24.2", "", { "os": "linux", "cpu": "s390x" }, "sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw=="], - "storybook/@storybook/core/esbuild/@esbuild/linux-x64": ["@esbuild/linux-x64@0.19.12", "", { "os": "linux", "cpu": "x64" }, "sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg=="], + "storybook/@storybook/core/esbuild/@esbuild/linux-x64": ["@esbuild/linux-x64@0.24.2", "", { "os": "linux", "cpu": "x64" }, "sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q=="], - "storybook/@storybook/core/esbuild/@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.19.12", "", { "os": "none", "cpu": "x64" }, "sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA=="], + "storybook/@storybook/core/esbuild/@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.24.2", "", { "os": "none", "cpu": "arm64" }, "sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw=="], - "storybook/@storybook/core/esbuild/@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.19.12", "", { "os": "openbsd", "cpu": "x64" }, "sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw=="], + "storybook/@storybook/core/esbuild/@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.24.2", "", { "os": "none", "cpu": "x64" }, "sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw=="], - "storybook/@storybook/core/esbuild/@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.19.12", "", { "os": "sunos", "cpu": "x64" }, "sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA=="], + "storybook/@storybook/core/esbuild/@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.24.2", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A=="], - "storybook/@storybook/core/esbuild/@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.19.12", "", { "os": "win32", "cpu": "arm64" }, "sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A=="], + "storybook/@storybook/core/esbuild/@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.24.2", "", { "os": "openbsd", "cpu": "x64" }, "sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA=="], - "storybook/@storybook/core/esbuild/@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.19.12", "", { "os": "win32", "cpu": "ia32" }, "sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ=="], + "storybook/@storybook/core/esbuild/@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.24.2", "", { "os": "sunos", "cpu": "x64" }, "sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig=="], - "storybook/@storybook/core/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.19.12", "", { "os": "win32", "cpu": "x64" }, "sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA=="], + "storybook/@storybook/core/esbuild/@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.24.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ=="], + + "storybook/@storybook/core/esbuild/@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.24.2", "", { "os": "win32", "cpu": "ia32" }, "sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA=="], + + "storybook/@storybook/core/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.24.2", "", { "os": "win32", "cpu": "x64" }, "sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg=="], "sucrase/glob/foreground-child/signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="], @@ -15059,8 +15021,6 @@ "@babel/register/find-cache-dir/pkg-dir/find-up/locate-path": ["locate-path@3.0.0", "", { "dependencies": { "p-locate": "^3.0.0", "path-exists": "^3.0.0" } }, "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A=="], - "@binance/w3w-qrcode-modal/qrcode/yargs/yargs-parser/camelcase": ["camelcase@5.3.1", "", {}, "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg=="], - "@commitlint/top-level/find-up/locate-path/p-locate/p-limit": ["p-limit@3.1.0", "", { "dependencies": { "yocto-queue": "^0.1.0" } }, "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="], "@datadog/datadog-ci/ora/chalk/supports-color/has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], diff --git a/config/jest-presets/jest/jest-preset.js b/config/jest-presets/jest/jest-preset.js index c43d4e5925c..c151e795496 100644 --- a/config/jest-presets/jest/jest-preset.js +++ b/config/jest-presets/jest/jest-preset.js @@ -34,7 +34,7 @@ module.exports = { // changedSince: 'master', // https://github.com/facebook/jest/issues/2663#issuecomment-341384494 transformIgnorePatterns: [ - 'node_modules/(?!(react-native|react-native-web|react-native-modal-selector|react-native-modal-datetime-picker|react-native-keyboard-controller|@react-navigation|@storybook/react-native|@react-native-community/datetimepicker|react-native-image-colors|uuid|react-native-reanimated|react-native-safe-area-context|react-native-localize|@react-native-masked-view|@statsig-js/js-client|@statsig/react-native-bindings|@statsig/react-bindings|@statsig/js-local-overrides|@react-native|@react-native-firebase|@uniswap/client-embeddedwallet|@uniswap/client-data-api|@uniswap/client-pools|@uniswap/client-platform-service|@connectrpc|@bufbuild|react-native-webview|@gorhom|expo.*|d3-(array|color|format|interpolate|path|scale|shape|time-format|time)|internmap|react-native-qrcode-svg|react-native-modal|react-native-animatable|react-native-masked-view|redux-persist|react-native-url-polyfill|react-native-context-menu-view|react-native-wagmi-charts|react-native-markdown-display|react-native-redash|@walletconnect|moti|react-native-image-picker|wagmi|viem|rn-qr-generator|@solana|jayson)/)', + 'node_modules/(?!(react-native|@universe|react-native-web|react-native-modal-selector|react-native-modal-datetime-picker|react-native-keyboard-controller|@react-navigation|@storybook/react-native|@react-native-community/datetimepicker|react-native-image-colors|uuid|react-native-reanimated|react-native-safe-area-context|react-native-localize|@react-native-masked-view|@statsig-js/js-client|@statsig/react-native-bindings|@statsig/react-bindings|@statsig/js-local-overrides|@react-native|@react-native-firebase|@uniswap/client-embeddedwallet|@uniswap/client-data-api|@uniswap/client-platform-service|@connectrpc|@bufbuild|react-native-webview|@gorhom|expo.*|d3-(array|color|format|interpolate|path|scale|shape|time-format|time)|internmap|react-native-qrcode-svg|react-native-modal|react-native-animatable|react-native-masked-view|redux-persist|react-native-url-polyfill|react-native-context-menu-view|react-native-wagmi-charts|react-native-markdown-display|react-native-redash|@walletconnect|moti|react-native-image-picker|wagmi|viem|rn-qr-generator|@solana|jayson|@uniswap\/client-search)/)', ], collectCoverage: false, // only collect in CI clearMocks: true, diff --git a/config/jest-presets/jest/setup.js b/config/jest-presets/jest/setup.js index acfd62262e2..53cf1b368e0 100644 --- a/config/jest-presets/jest/setup.js +++ b/config/jest-presets/jest/setup.js @@ -109,39 +109,33 @@ const NetInfoStateType = { jest.mock('@react-native-community/netinfo', () => ({ ...mockRNCNetInfo, NetInfoStateType })) -jest.mock('uniswap/src/features/gating/sdk/statsig', () => { - const real = jest.requireActual('uniswap/src/features/gating/sdk/statsig') - const StatsigMock = { - ...real, - useGate: () => { - return { - isLoading: false, - value: false, - } - }, - useConfig: () => { - return {} - }, - +jest.mock('@universe/gating', () => { + const actual = jest.requireActual('@universe/gating') + return { + ...actual, + // Mock functions + useDynamicConfigValue: jest.fn((args) => args.defaultValue), + useFeatureFlag: jest.fn(() => false), + useGate: jest.fn(() => ({ isLoading: false, value: false })), + useConfig: jest.fn(() => ({})), + getStatsigClient: jest.fn(() => ({ + checkGate: jest.fn(() => false), + getConfig: jest.fn(() => ({ + get: (_name, fallback) => fallback, + getValue: (_name, fallback) => fallback, + })), + getLayer: jest.fn(() => ({ + get: jest.fn(() => false), + })), + })), Statsig: { - checkGate: () => false, - getConfig: () => { - return { - get: (_name, fallback) => fallback, - getValue: (_name, fallback) => fallback, - } - }, + checkGate: jest.fn(() => false), + getConfig: jest.fn(() => ({ + get: (_name, fallback) => fallback, + getValue: (_name, fallback) => fallback, + })), }, } - return StatsigMock -}) - -jest.mock('uniswap/src/features/gating/hooks', () => { - const real = jest.requireActual('uniswap/src/features/gating/hooks') - return { - ...real, - useDynamicConfigValue: (args) => args.defaultValue, - } }) // TODO: Remove this mock after mocks in jest-expo are fixed diff --git a/config/vitest-presets/vitest/vitest-preset.js b/config/vitest-presets/vitest/vitest-preset.js index 5b44b8f092d..e08010644ed 100644 --- a/config/vitest-presets/vitest/vitest-preset.js +++ b/config/vitest-presets/vitest/vitest-preset.js @@ -61,7 +61,6 @@ module.exports = { '@react-native-firebase/**', '@uniswap/client-embeddedwallet', '@uniswap/client-data-api', - '@uniswap/client-pools', 'react-native-webview', '@gorhom/**', 'expo*', diff --git a/dangerfile.ts b/dangerfile.ts index a0cdafb2a27..7785ee045d5 100644 --- a/dangerfile.ts +++ b/dangerfile.ts @@ -74,7 +74,7 @@ function checkGeneralizedHookFiles() { } // Put any files here that we explicitly want to ignore! -const IGNORED_SPLIT_RULE_FILES: string[] = ['packages/uniswap/src/features/gating/sdk/statsig.native.ts'] +const IGNORED_SPLIT_RULE_FILES: string[] = ['packages/gating/src/sdk/statsig.native.ts'] function checkSplitFiles() { const touchedFiles = danger.git.modified_files.concat(danger.git.created_files) diff --git a/nx.json b/nx.json index 5f69d8974a1..e24f6a33130 100644 --- a/nx.json +++ b/nx.json @@ -10,7 +10,13 @@ "build": { "dependsOn": ["^prepare", "prepare", "^build"], "inputs": ["dependencies", "sourceFiles", "tsConfig"], - "outputs": ["{projectRoot}/dist", "{projectRoot}/build", "{projectRoot}/.next", "{projectRoot}/types"], + "outputs": [ + "{workspaceRoot}/dist/out-tsc/{projectRoot}", + "{projectRoot}/dist", + "{projectRoot}/build", + "{projectRoot}/.next", + "{projectRoot}/types" + ], "cache": true }, "build:production": { @@ -49,18 +55,14 @@ "options": { "cwd": "{projectRoot}" }, - "dependsOn": [ - "@uniswap/biome-config:prepare" - ] + "dependsOn": ["@uniswap/biome-config:prepare"] }, "lint:biome:fix": { "command": "biome check . --write", "options": { "cwd": "{projectRoot}" }, - "dependsOn": [ - "@uniswap/biome-config:prepare" - ] + "dependsOn": ["@uniswap/biome-config:prepare"] }, "lint:eslint": { "command": "eslint . --ext ts,tsx --max-warnings=0", @@ -82,10 +84,7 @@ }, "lint:fix": { "executor": "nx:noop", - "dependsOn": [ - "lint:biome:fix", - "lint:eslint:fix" - ], + "dependsOn": ["lint:biome:fix", "lint:eslint:fix"], "cache": false }, "test": { @@ -171,13 +170,8 @@ }, "@nx/js:tsc": { "cache": true, - "dependsOn": [ - "^build" - ], - "inputs": [ - "production", - "^production" - ] + "dependsOn": ["^build"], + "inputs": ["production", "^production"] } }, "namedInputs": { diff --git a/package.json b/package.json index 1af9250245b..f42f4722421 100644 --- a/package.json +++ b/package.json @@ -132,11 +132,22 @@ }, "scripts": { "api": "bun run --cwd packages/api", - "clean": "bash ./scripts/clean.sh", - "config": "bun run --cwd packages/config", - "extension": "bun run --cwd apps/extension", "biome-config": "bun run --cwd packages/biome-config", + "config": "bun run --cwd packages/config", "eslint-config": "bun run --cwd packages/eslint-config", + "extension": "bun run --cwd apps/extension", + "mobile": "bun run --cwd apps/mobile", + "sessions": "bun run --cwd packages/sessions", + "ui": "bun run --cwd packages/ui", + "uniswap": "bun run --cwd packages/uniswap", + "utilities": "bun run --cwd packages/utilities", + "wallet": "bun run --cwd packages/wallet", + "web": "bun run --cwd apps/web", + "clean": "bash ./scripts/clean.sh", + "lfg": "bun run g:prepare && bun run mobile env:local:download && bun run extension env:local:download && bun run g:build && bun run mobile pod && bun run mobile ios", + "local:check": "./scripts/local-version-check.sh", + "preinstall": "./scripts/check-bun-version.sh", + "postinstall": "lefthook install && bun g:prepare", "g:build": "nx run-many -t build --parallel", "g:build:storybook": "nx run-many -t storybook:build --skip-nx-cache --parallel", "g:check:deps:usage": "./scripts/check-deps-with-vue-fix.sh && nx run-many -t check:deps:usage", @@ -148,12 +159,13 @@ "g:lint:changed": "nx affected -t lint --base=${NX_BASE:-main} --head=${NX_HEAD:-HEAD}", "g:lint": "nx run-many -t lint", "g:lint:fix": "nx run-many -t lint:fix", + "g:pre-commit-checks": "nx affected -t typecheck,lint:biome --uncommitted --output-style=stream", "g:prepare": "nx run-many -t prepare --output-style=stream", - "g:rm:local-packages": "rm -rf ./node_modules/utilities ./node_modules/wallet ./node_modules/ui ./node_modules/uniswap", + "g:rm:local-packages": "bash ./scripts/remove-local-packages.sh", "g:rm:nodemodules": "rm -rf node_modules **/node_modules", - "g:pre-commit-checks": "nx affected -t typecheck,lint:biome --uncommitted --output-style=stream", - "g:run-fast-checks": "nx affected -t typecheck,lint,build --base=${NX_BASE:-HEAD~1} --head=${NX_HEAD:-HEAD}", "g:run-all-checks": "nx run-many -t typecheck,lint,test,build,check:circular", + "g:run-fast-checks": "nx affected -t typecheck,lint,build --base=${NX_BASE:-HEAD~1} --head=${NX_HEAD:-HEAD}", + "g:snapshots": "nx run-many -t snapshots", "g:test:storybook:standalone": "nx run-many -t storybook:test:standalone --skip-nx-cache --parallel", "g:test": "nx run-many -t test", "g:test:coverage": "nx run-many -t test -- --collectCoverage=true", @@ -167,7 +179,6 @@ "g:test:coverage:extension": "nx test @uniswap/extension -- --collectCoverage=true", "g:test:coverage:mobile": "nx test @uniswap/mobile -- --collectCoverage=true", "g:test:coverage:wallet": "nx test wallet -- --collectCoverage=true", - "g:snapshots": "nx run-many -t snapshots", "g:typecheck": "nx run-many -t typecheck", "g:typecheck:changed": "nx affected -t typecheck --base=${NX_BASE:-main} --head=${NX_HEAD:-HEAD}", "i18n:extract": "i18next", @@ -175,22 +186,12 @@ "i18n:upload": "dotenv -e .env.defaults -c -- bun run i18n:_upload", "i18n:_download": "crowdin download", "i18n:download": "dotenv -e .env.defaults -c -- bun run i18n:_download", - "lfg": "bun run g:prepare && bun run mobile env:local:download && bun run extension env:local:download && bun run g:build && bun run mobile pod && bun run mobile ios", - "mobile": "bun run --cwd apps/mobile", - "local:check": "./scripts/local-version-check.sh", - "preinstall": "./scripts/check-bun-version.sh", - "postinstall": "lefthook install && bun g:prepare", - "sessions": "bun run --cwd packages/sessions", - "ui": "bun run --cwd packages/ui", "upgrade:tamagui": "bun update '*tamagui*' '@tamagui/*'", "upgrade:tamagui:canary": "bun update '*tamagui*'@canary '@tamagui/*'@canary", - "wallet": "bun run --cwd packages/wallet", - "web": "bun run --cwd apps/web", - "uniswap": "bun run --cwd packages/uniswap", - "utilities": "bun run --cwd packages/utilities", - "knip": "knip", "wallet:release:setup-cherry-pick-branches": "bunx tsx ./scripts/wallet-releases/generate-cherry-pick-branches-for-release.ts", - "wallet:release:generate-cherry-pick-commit-command": "bunx tsx ./scripts/wallet-releases/generate-cherry-pick-commit-command.ts" + "wallet:release:generate-cherry-pick-commit-command": "bunx tsx ./scripts/wallet-releases/generate-cherry-pick-commit-command.ts", + "gating": "bun run --cwd packages/gating", + "notifications": "bun run --cwd packages/notifications" }, "workspaces": ["apps/*", "packages/*", "config/*", "tools/uniswap-nx"], "patchedDependencies": { diff --git a/packages/api/package.json b/packages/api/package.json index de6f0dc50d8..2569dd0d52d 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -25,10 +25,9 @@ "@connectrpc/connect": "1.4.0", "@connectrpc/connect-web": "1.4.0", "@tanstack/react-query": "5.77.2", - "@uniswap/client-data-api": "0.0.14", + "@uniswap/client-data-api": "0.0.18", "@uniswap/client-embeddedwallet": "0.0.16", "@uniswap/client-explore": "0.0.17", - "@uniswap/client-pools": "0.0.17", "@uniswap/client-trading": "0.1.0", "@universe/config": "workspace:^", "@universe/sessions": "workspace:^", diff --git a/packages/api/src/clients/graphql/queries.graphql b/packages/api/src/clients/graphql/queries.graphql index 53aca66dce4..a6a92de8984 100644 --- a/packages/api/src/clients/graphql/queries.graphql +++ b/packages/api/src/clients/graphql/queries.graphql @@ -836,6 +836,12 @@ fragment TokenBasicInfoParts on Token { name standard symbol + isBridged + bridgedWithdrawalInfo { + chain + provider + url + } } fragment TokenBasicProjectParts on Token { diff --git a/packages/api/src/clients/graphql/schema.graphql b/packages/api/src/clients/graphql/schema.graphql index 287be283601..37e138268fb 100644 --- a/packages/api/src/clients/graphql/schema.graphql +++ b/packages/api/src/clients/graphql/schema.graphql @@ -1,19 +1,6 @@ """This directive allows results to be deferred during execution""" directive @defer on FIELD -"""Tells the service which mutation triggers this subscription.""" -directive @aws_subscribe( - """ - List of mutations which will trigger this subscription when they are called. - """ - mutations: [String] -) on FIELD_DEFINITION - -""" -Tells the service this field/object has access authorized by an OIDC token. -""" -directive @aws_oidc on OBJECT | FIELD_DEFINITION - """Directs the schema to enforce authorization on a field""" directive @aws_auth( """List of cognito user pool groups which have access on this field""" @@ -21,15 +8,26 @@ directive @aws_auth( ) on FIELD_DEFINITION """ -Tells the service this field/object has access authorized by sigv4 signing. +Tells the service which subscriptions will be published to when this mutation is +called. This directive is deprecated use @aws_susbscribe directive instead. """ -directive @aws_iam on OBJECT | FIELD_DEFINITION +directive @aws_publish( + """ + List of subscriptions which will be published to when this mutation is called. + """ + subscriptions: [String] +) on FIELD_DEFINITION """ Tells the service this field/object has access authorized by an API key. """ directive @aws_api_key on OBJECT | FIELD_DEFINITION +""" +Tells the service this field/object has access authorized by sigv4 signing. +""" +directive @aws_iam on OBJECT | FIELD_DEFINITION + """ Tells the service this field/object has access authorized by a Cognito User Pools token. """ @@ -38,15 +36,12 @@ directive @aws_cognito_user_pools( cognito_groups: [String] ) on OBJECT | FIELD_DEFINITION -""" -Tells the service which subscriptions will be published to when this mutation is -called. This directive is deprecated use @aws_susbscribe directive instead. -""" -directive @aws_publish( +"""Tells the service which mutation triggers this subscription.""" +directive @aws_subscribe( """ - List of subscriptions which will be published to when this mutation is called. + List of mutations which will trigger this subscription when they are called. """ - subscriptions: [String] + mutations: [String] ) on FIELD_DEFINITION """ @@ -54,6 +49,11 @@ Tells the service this field/object has access authorized by a Lambda Authorizer """ directive @aws_lambda on OBJECT | FIELD_DEFINITION +""" +Tells the service this field/object has access authorized by an OIDC token. +""" +directive @aws_oidc on OBJECT | FIELD_DEFINITION + """ Types, unions, and inputs (alphabetized): These are colocated to highlight the relationship between some types and their inputs. @@ -182,6 +182,12 @@ type BlockaidFees { sell: Float } +type BridgedWithdrawalInfo { + chain: String! + provider: String! + url: String! +} + enum Chain { ARBITRUM AVALANCHE @@ -1027,6 +1033,7 @@ enum PriceSource { SUBGRAPH_V2 SUBGRAPH_V3 SUBGRAPH_V4 + EXTERNAL } enum ProtectionAttackType { @@ -1078,8 +1085,8 @@ type Query { dailyProtocolTvl(chain: Chain!, version: ProtocolVersion!): [TimestampedAmount!] """ returns top v3 pools sorted by total value locked in desc order""" - topV3Pools(chain: Chain!, first: Int!, tvlCursor: Float, tokenFilter: String): [V3Pool!] - topV4Pools(chain: Chain!, first: Int!, tvlCursor: Float, tokenFilter: String): [V4Pool!] + topV3Pools(chain: Chain!, first: Int!, tvlCursor: Float, tokenFilter: String, debugMode: Boolean): [V3Pool!] + topV4Pools(chain: Chain!, first: Int!, tvlCursor: Float, tokenFilter: String, debugMode: Boolean): [V4Pool!] v3Pool(chain: Chain!, address: String!): V3Pool v4Pool(chain: Chain!, poolId: String!): V4Pool v3PoolsForTokenPair(chain: Chain!, token0: String!, token1: String!): [V3Pool!] @@ -1088,7 +1095,7 @@ type Query { v4Transactions(chain: Chain!, first: Int!, timestampCursor: Int): [PoolTransaction!] """ returns top v2 pairs sorted by total value locked in desc order""" - topV2Pairs(chain: Chain!, first: Int!, tvlCursor: Float, tokenFilter: String): [V2Pair!] + topV2Pairs(chain: Chain!, first: Int!, tvlCursor: Float, tokenFilter: String, debugMode: Boolean): [V2Pair!] v2Pair(chain: Chain!, address: String!): V2Pair v2Transactions(chain: Chain!, first: Int!, timestampCursor: Int): [PoolTransaction] convert(fromAmount: CurrencyAmountInput!, toCurrency: Currency!): Amount @@ -1226,6 +1233,8 @@ type Token implements IContract { v3Transactions(first: Int!, timestampCursor: Int): [PoolTransaction] v2Transactions(first: Int!, timestampCursor: Int): [PoolTransaction] source: TokenSource + isBridged: Boolean + bridgedWithdrawalInfo: BridgedWithdrawalInfo } type TokenAmount { diff --git a/packages/api/src/clients/notifications/createNotificationsApiClient.ts b/packages/api/src/clients/notifications/createNotificationsApiClient.ts new file mode 100644 index 00000000000..59546503bac --- /dev/null +++ b/packages/api/src/clients/notifications/createNotificationsApiClient.ts @@ -0,0 +1,49 @@ +import type { + GetNotificationsRequest, + InAppNotification, + NotificationsApiClient, + NotificationsClientContext, +} from '@universe/api/src/clients/notifications/types' + +/** + * Factory function to create a NotificationsApiClient + * + * Example usage: + * ```typescript + * const notificationsClient = createNotificationsApiClient({ + * fetchClient: myFetchClient, + * getApiPathPrefix: () => '/notifications/v1' + * }) + * + * const notifications = await notificationsClient.getNotifications() + * ``` + * + * @param ctx - Context containing injected dependencies + * @returns NotificationsApiClient instance + */ +export function createNotificationsApiClient(ctx: NotificationsClientContext): NotificationsApiClient { + const { fetchClient, getApiPathPrefix = (): string => '' } = ctx + + const getNotifications = async (params?: GetNotificationsRequest): Promise => { + const pathPrefix = getApiPathPrefix() + const path = `${pathPrefix}/uniswap.notificationservice.v1.NotificationService/GetNotifications` + + try { + const response = await fetchClient.post<{ notifications: InAppNotification[] }>(path, { + body: JSON.stringify(params ?? {}), + }) + + // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition + return response?.notifications ?? [] + } catch (error) { + // Re-throw with context about which API call failed + throw new Error(`Failed to fetch notifications: ${error instanceof Error ? error.message : String(error)}`, { + cause: error, + }) + } + } + + return { + getNotifications, + } +} diff --git a/packages/api/src/clients/notifications/types.ts b/packages/api/src/clients/notifications/types.ts new file mode 100644 index 00000000000..d0b31810112 --- /dev/null +++ b/packages/api/src/clients/notifications/types.ts @@ -0,0 +1,38 @@ +import { FetchClient } from '@universe/api/src/clients/base/types' + +export interface NotificationsClientContext { + fetchClient: FetchClient + getApiPathPrefix?: () => string +} + +/** + * In-app notification returned by the notifications API + * TODO: This will be replaced with OpenAPI-generated types once the spec is integrated + */ +export interface InAppNotification { + notification_id: string + notification_name: string + meta_data: Record + content: Record + criteria: Record +} + +/** + * Request parameters for fetching notifications + */ +export type GetNotificationsRequest = Record + +/** + * Response from the GetNotifications API endpoint + */ +export interface GetNotificationsResponse { + notifications: InAppNotification[] +} + +export interface NotificationsApiClient { + /** + * Fetch notifications for the current user + * Uses session-based authentication (x-session-id header) via FetchClient + */ + getNotifications: (params?: GetNotificationsRequest) => Promise +} diff --git a/packages/api/src/clients/trading/tradeTypes.ts b/packages/api/src/clients/trading/tradeTypes.ts index 9b0a0cc2a17..7d415342ea1 100644 --- a/packages/api/src/clients/trading/tradeTypes.ts +++ b/packages/api/src/clients/trading/tradeTypes.ts @@ -42,7 +42,7 @@ interface StepProof { orderId?: string } -export interface TradeStep { +export interface PlanStep { stepId: string method: Method payloadType: PayloadType @@ -62,7 +62,7 @@ export interface TradeStep { export interface TradeResponse { tradeId: string - steps: TradeStep[] + steps: PlanStep[] expectedOutput: number timeEstimateMs: number //ms gasFee: string diff --git a/packages/api/src/connectRpc/utils.ts b/packages/api/src/connectRpc/utils.ts index 293daed4462..b26a9acd449 100644 --- a/packages/api/src/connectRpc/utils.ts +++ b/packages/api/src/connectRpc/utils.ts @@ -1,7 +1,7 @@ import { type PlainMessage } from '@bufbuild/protobuf' import { Platform, type PlatformAddress, type WalletAccount } from '@uniswap/client-data-api/dist/data/v1/api_pb' +import { ProtocolVersion } from '@uniswap/client-data-api/dist/data/v1/poolTypes_pb' import { type ProtectionInfo as ProtectionInfoProtobuf } from '@uniswap/client-explore/dist/uniswap/explore/v1/service_pb' -import { ProtocolVersion } from '@uniswap/client-pools/dist/pools/v1/types_pb' import { ProtectionAttackType, type ProtectionInfo, diff --git a/packages/api/src/index.ts b/packages/api/src/index.ts index 10b3fdd723e..f9a95b99786 100644 --- a/packages/api/src/index.ts +++ b/packages/api/src/index.ts @@ -73,11 +73,11 @@ export { type ExistingTradeRequest, Method, type NewTradeRequest, + type PlanStep, PlanStepStatus, type PriorityQuoteResponse, type SwappableTokensParams, type TradeResponse, - type TradeStep, type UnwrapQuoteResponse, type UpdateExistingTradeRequest, type WrapQuoteResponse, @@ -124,6 +124,16 @@ export { TokenReportEventType, } from '@universe/api/src/clients/data/createDataServiceApiClient' +// Notifications API +export { createNotificationsApiClient } from '@universe/api/src/clients/notifications/createNotificationsApiClient' +export type { + GetNotificationsRequest, + GetNotificationsResponse, + InAppNotification, + NotificationsApiClient, + NotificationsClientContext, +} from '@universe/api/src/clients/notifications/types' + // ConnectRPC API export { ALL_NETWORKS_ARG, diff --git a/packages/biome-config/base.jsonc b/packages/biome-config/base.jsonc index 71b95904adb..2e99ba3aada 100644 --- a/packages/biome-config/base.jsonc +++ b/packages/biome-config/base.jsonc @@ -177,7 +177,17 @@ }, "noUnusedLabels": "error", "noUnusedVariables": "error", - "useExhaustiveDependencies": "error", + "useExhaustiveDependencies": { + "level": "error", + "options": { + "hooks": [ + // React Native Reanimated hooks with stable results + { "name": "useSharedValue", "stableResult": true }, + { "name": "useDerivedValue", "stableResult": true }, + { "name": "useAnimatedRef", "stableResult": true } + ] + } + }, "useHookAtTopLevel": "error", "useIsNan": "warn", "useJsxKeyInIterable": "error", diff --git a/packages/gating/.eslintrc.js b/packages/gating/.eslintrc.js new file mode 100644 index 00000000000..05c00dcf591 --- /dev/null +++ b/packages/gating/.eslintrc.js @@ -0,0 +1,46 @@ +module.exports = { + root: true, + extends: ['@uniswap/eslint-config/native', '@uniswap/eslint-config/webPlatform'], + ignorePatterns: [ + 'node_modules', + '.turbo', + '.eslintrc.js', + 'vitest.config.ts', + 'codegen.ts', + '.nx', + 'scripts', + 'dist', + 'src/**/__generated__', + ], + parserOptions: { + project: 'tsconfig.lint.json', + tsconfigRootDir: __dirname, + ecmaFeatures: { + jsx: true, + }, + ecmaVersion: 2018, + sourceType: 'module', + }, + overrides: [ + { + files: ['src/index.ts'], + rules: { + 'check-file/no-index': 'off', + }, + }, + { + files: ['*.ts', '*.tsx'], + rules: { + 'no-relative-import-paths/no-relative-import-paths': [ + 'error', + { + allowSameFolder: false, + prefix: '@universe/gating', + }, + ], + '@typescript-eslint/prefer-enum-initializers': 'off', + }, + }, + ], + rules: {}, +} diff --git a/packages/gating/README.md b/packages/gating/README.md new file mode 100644 index 00000000000..8b26f751149 --- /dev/null +++ b/packages/gating/README.md @@ -0,0 +1,3 @@ +# @universe/gating + +// TODO diff --git a/packages/gating/package.json b/packages/gating/package.json new file mode 100644 index 00000000000..e8457067531 --- /dev/null +++ b/packages/gating/package.json @@ -0,0 +1,31 @@ +{ + "name": "@universe/gating", + "version": "0.0.0", + "dependencies": { + "@statsig/client-core": "3.12.2", + "@statsig/js-client": "3.12.2", + "@statsig/js-local-overrides": "3.12.2", + "@statsig/react-bindings": "3.12.2", + "@statsig/react-native-bindings": "3.12.2", + "@universe/api": "workspace:*", + "utilities": "workspace:*" + }, + "devDependencies": { + "@types/node": "22.13.1", + "@uniswap/eslint-config": "workspace:^", + "depcheck": "1.4.7", + "eslint": "8.44.0", + "typescript": "5.3.3" + }, + "scripts": { + "typecheck": "nx typecheck gating", + "lint": "nx lint gating", + "lint:fix": "nx lint:fix gating" + }, + "nx": { + "includedScripts": [] + }, + "main": "src/index.ts", + "private": true, + "sideEffects": false +} diff --git a/packages/gating/project.json b/packages/gating/project.json new file mode 100644 index 00000000000..e5b65be81e9 --- /dev/null +++ b/packages/gating/project.json @@ -0,0 +1,16 @@ +{ + "name": "@universe/gating", + "$schema": "../../node_modules/nx/schemas/project-schema.json", + "sourceRoot": "packages/gating/src", + "projectType": "library", + "tags": [], + "targets": { + "typecheck": {}, + "lint:biome": {}, + "lint:biome:fix": {}, + "lint:eslint": {}, + "lint:eslint:fix": {}, + "lint": {}, + "lint:fix": {} + } +} diff --git a/packages/uniswap/src/features/gating/LocalOverrideAdapterWrapper.ts b/packages/gating/src/LocalOverrideAdapterWrapper.ts similarity index 95% rename from packages/uniswap/src/features/gating/LocalOverrideAdapterWrapper.ts rename to packages/gating/src/LocalOverrideAdapterWrapper.ts index 4c4794d7cb0..1c68bee6685 100644 --- a/packages/uniswap/src/features/gating/LocalOverrideAdapterWrapper.ts +++ b/packages/gating/src/LocalOverrideAdapterWrapper.ts @@ -1,5 +1,5 @@ import { LocalOverrideAdapter } from '@statsig/js-local-overrides' -import { getStatsigClient } from 'uniswap/src/features/gating/sdk/statsig' +import { getStatsigClient } from '@universe/gating/src/sdk/statsig' // Workaround for @statsig 3.x.x refreshing client after applying overrides to get the result without reloading // Should be removed after statsig add real time override apply functionality diff --git a/packages/uniswap/src/features/gating/configs.ts b/packages/gating/src/configs.ts similarity index 81% rename from packages/uniswap/src/features/gating/configs.ts rename to packages/gating/src/configs.ts index 6c9ac865d3a..9752b9af739 100644 --- a/packages/uniswap/src/features/gating/configs.ts +++ b/packages/gating/src/configs.ts @@ -1,5 +1,64 @@ import { GasStrategy } from '@universe/api' -import type { Locale } from 'uniswap/src/features/language/constants' + +// TODO: move to own package +export enum Locale { + Afrikaans = 'af-ZA', + ArabicSaudi = 'ar-SA', + Catalan = 'ca-ES', + ChineseSimplified = 'zh-Hans', + ChineseTraditional = 'zh-Hant', + CzechCzechia = 'cs-CZ', + DanishDenmark = 'da-DK', + DutchNetherlands = 'nl-NL', + EnglishUnitedStates = 'en-US', + FinnishFinland = 'fi-FI', + FrenchFrance = 'fr-FR', + GreekGreece = 'el-GR', + HebrewIsrael = 'he-IL', + HindiIndia = 'hi-IN', + HungarianHungarian = 'hu-HU', + IndonesianIndonesia = 'id-ID', + ItalianItaly = 'it-IT', + JapaneseJapan = 'ja-JP', + KoreanKorea = 'ko-KR', + MalayMalaysia = 'ms-MY', + NorwegianNorway = 'no-NO', + PolishPoland = 'pl-PL', + PortugueseBrazil = 'pt-BR', + PortuguesePortugal = 'pt-PT', + RomanianRomania = 'ro-RO', + RussianRussia = 'ru-RU', + Serbian = 'sr-SP', + SpanishLatam = 'es-419', + SpanishBelize = 'es-BZ', + SpanishCuba = 'es-CU', + SpanishDominicanRepublic = 'es-DO', + SpanishGuatemala = 'es-GT', + SpanishHonduras = 'es-HN', + SpanishMexico = 'es-MX', + SpanishNicaragua = 'es-NI', + SpanishPanama = 'es-PA', + SpanishPeru = 'es-PE', + SpanishPuertoRico = 'es-PR', + SpanishElSalvador = 'es-SV', + SpanishUnitedStates = 'es-US', + SpanishArgentina = 'es-AR', + SpanishBolivia = 'es-BO', + SpanishChile = 'es-CL', + SpanishColombia = 'es-CO', + SpanishCostaRica = 'es-CR', + SpanishEcuador = 'es-EC', + SpanishSpain = 'es-ES', + SpanishParaguay = 'es-PY', + SpanishUruguay = 'es-UY', + SpanishVenezuela = 'es-VE', + SwahiliTanzania = 'sw-TZ', + SwedishSweden = 'sv-SE', + TurkishTurkey = 'tr-TR', + UkrainianUkraine = 'uk-UA', + UrduPakistan = 'ur-PK', + VietnameseVietnam = 'vi-VN', +} /** * Dynamic Configs diff --git a/packages/uniswap/src/features/gating/constants.ts b/packages/gating/src/constants.ts similarity index 100% rename from packages/uniswap/src/features/gating/constants.ts rename to packages/gating/src/constants.ts diff --git a/packages/uniswap/src/features/gating/experiments.ts b/packages/gating/src/experiments.ts similarity index 83% rename from packages/uniswap/src/features/gating/experiments.ts rename to packages/gating/src/experiments.ts index abee273dafe..1798d898243 100644 --- a/packages/uniswap/src/features/gating/experiments.ts +++ b/packages/gating/src/experiments.ts @@ -11,10 +11,12 @@ export enum Experiments { UnichainFlashblocksModal = 'unichain_flashblocks_modal', WebFORNudges = 'web_for_nudge', ForFilters = 'for_filters', + PortfolioDisconnectedDemoView = 'portfolio_disconnected_demo_view', } export enum Layers { SwapPage = 'swap-page', + PortfolioPage = 'portfolio-page', } // experiment groups @@ -59,6 +61,10 @@ export enum WebFORNudgesProperties { NudgeEnabled = 'nudgeEnabled', } +export enum PortfolioDisconnectedDemoViewProperties { + DemoViewEnabled = 'demoViewEnabled', +} + export type ExperimentProperties = { [Experiments.PriceUxUpdate]: PriceUxUpdateProperties [Experiments.PrivateRpc]: PrivateRpcProperties @@ -67,6 +73,7 @@ export type ExperimentProperties = { [Experiments.UnichainFlashblocksModal]: UnichainFlashblocksProperties [Experiments.ForFilters]: ForFiltersProperties [Experiments.WebFORNudges]: WebFORNudgesProperties + [Experiments.PortfolioDisconnectedDemoView]: PortfolioDisconnectedDemoViewProperties } // will be a spread of all experiment properties in that layer @@ -75,4 +82,7 @@ export const LayerProperties: Record = { ...PriceUxUpdateProperties, ...UnichainFlashblocksProperties, }), + [Layers.PortfolioPage]: Object.values({ + ...PortfolioDisconnectedDemoViewProperties, + }), } diff --git a/packages/uniswap/src/features/gating/flags.ts b/packages/gating/src/flags.ts similarity index 98% rename from packages/uniswap/src/features/gating/flags.ts rename to packages/gating/src/flags.ts index ae194d53c14..6e0f3b10d5b 100644 --- a/packages/uniswap/src/features/gating/flags.ts +++ b/packages/gating/src/flags.ts @@ -10,6 +10,7 @@ export enum FeatureFlags { // Shared ArbitrumDutchV3, BlockaidFotLogging, + BridgedAssetsBannerV2, ChainedActions, DisableSwap7702, EmbeddedWallet, @@ -87,6 +88,7 @@ export enum FeatureFlags { export const SHARED_FEATURE_FLAG_NAMES = new Map([ [FeatureFlags.ArbitrumDutchV3, 'uniswapx_dutchv3_orders_arbitrum'], [FeatureFlags.BlockaidFotLogging, 'blockaid_fot_logging'], + [FeatureFlags.BridgedAssetsBannerV2, 'bridged_assets_banner_v2'], [FeatureFlags.ChainedActions, 'enable_chained_actions'], [FeatureFlags.DisableSwap7702, 'disable-swap-7702'], [FeatureFlags.EmbeddedWallet, 'embedded_wallet'], diff --git a/packages/uniswap/src/features/gating/getStatsigEnvName.ts b/packages/gating/src/getStatsigEnvName.ts similarity index 100% rename from packages/uniswap/src/features/gating/getStatsigEnvName.ts rename to packages/gating/src/getStatsigEnvName.ts diff --git a/packages/uniswap/src/features/gating/hooks.ts b/packages/gating/src/hooks.ts similarity index 95% rename from packages/uniswap/src/features/gating/hooks.ts rename to packages/gating/src/hooks.ts index d369a0a6e3c..460af0075ec 100644 --- a/packages/uniswap/src/features/gating/hooks.ts +++ b/packages/gating/src/hooks.ts @@ -1,8 +1,7 @@ import { StatsigClientEventCallback, StatsigLoadingStatus } from '@statsig/client-core' -import { useEffect, useMemo, useState } from 'react' -import { DynamicConfigKeys } from 'uniswap/src/features/gating/configs' -import { ExperimentProperties, Experiments } from 'uniswap/src/features/gating/experiments' -import { FeatureFlags, getFeatureFlagName } from 'uniswap/src/features/gating/flags' +import { DynamicConfigKeys } from '@universe/gating/src/configs' +import { ExperimentProperties, Experiments } from '@universe/gating/src/experiments' +import { FeatureFlags, getFeatureFlagName } from '@universe/gating/src/flags' import { getStatsigClient, TypedReturn, @@ -12,7 +11,8 @@ import { useGateValue, useLayer, useStatsigClient, -} from 'uniswap/src/features/gating/sdk/statsig' +} from '@universe/gating/src/sdk/statsig' +import { useEffect, useMemo, useState } from 'react' import { logger } from 'utilities/src/logger/logger' export function useFeatureFlag(flag: FeatureFlags): boolean { diff --git a/packages/gating/src/index.ts b/packages/gating/src/index.ts new file mode 100644 index 00000000000..efe852ff1f6 --- /dev/null +++ b/packages/gating/src/index.ts @@ -0,0 +1,86 @@ +export type { + DatadogIgnoredErrorsValType, + DatadogSessionSampleRateValType, + DeepLinkUrlAllowlist, + DynamicConfigKeys, + ForceUpgradeStatus, + ForceUpgradeTranslations, + GasStrategies, + GasStrategyType, + GasStrategyWithConditions, + UwULinkAllowlist, + UwULinkAllowlistItem, +} from '@universe/gating/src/configs' +export { + AllowedV4WethHookAddressesConfigKey, + BlockedAsyncSubmissionChainIdsConfigKey, + ChainsConfigKey, + DatadogIgnoredErrorsConfigKey, + DatadogSessionSampleRateKey, + DeepLinkUrlAllowlistConfigKey, + DynamicConfigs, + EmbeddedWalletConfigKey, + ExtensionBiometricUnlockConfigKey, + ExternallyConnectableExtensionConfigKey, + ForceUpgradeConfigKey, + HomeScreenExploreTokensConfigKey, + LPConfigKey, + NetworkRequestsConfigKey, + OnDeviceRecoveryConfigKey, + OutageBannerChainIdConfigKey, + SwapConfigKey, + SyncTransactionSubmissionChainIdsConfigKey, + UwuLinkConfigKey, +} from '@universe/gating/src/configs' +export { StatsigCustomAppValue } from '@universe/gating/src/constants' +export type { ExperimentProperties } from '@universe/gating/src/experiments' +export { + Experiments, + ForFiltersProperties, + LayerProperties, + Layers, + NativeTokenPercentageBufferProperties, + PortfolioDisconnectedDemoViewProperties, + PriceUxUpdateProperties, + PrivateRpcProperties, + UnichainFlashblocksProperties, + WebFORNudgesProperties, +} from '@universe/gating/src/experiments' +export { + FeatureFlags, + getFeatureFlagName, + WALLET_FEATURE_FLAG_NAMES, + WEB_FEATURE_FLAG_NAMES, +} from '@universe/gating/src/flags' +export { getStatsigEnvName } from '@universe/gating/src/getStatsigEnvName' +export { + getDynamicConfigValue, + getExperimentValue, + getExperimentValueFromLayer, + getFeatureFlag, + useDynamicConfigValue, + useExperimentValue, + useExperimentValueFromLayer, + useFeatureFlag, + useFeatureFlagWithExposureLoggingDisabled, + useFeatureFlagWithLoading, + useStatsigClientStatus, +} from '@universe/gating/src/hooks' +export { LocalOverrideAdapterWrapper } from '@universe/gating/src/LocalOverrideAdapterWrapper' +export type { + StatsigOptions, + StatsigUser, + StorageProvider, +} from '@universe/gating/src/sdk/statsig' +export { + getOverrideAdapter, + getStatsigClient, + StatsigClient, + StatsigContext, + StatsigProvider, + Storage, + useClientAsyncInit, + useExperiment, + useLayer, +} from '@universe/gating/src/sdk/statsig' +export { getOverrides } from '@universe/gating/src/utils' diff --git a/packages/uniswap/src/features/gating/sdk/statsig.native.ts b/packages/gating/src/sdk/statsig.native.ts similarity index 83% rename from packages/uniswap/src/features/gating/sdk/statsig.native.ts rename to packages/gating/src/sdk/statsig.native.ts index f946807b8dd..8e0c14b1022 100644 --- a/packages/uniswap/src/features/gating/sdk/statsig.native.ts +++ b/packages/gating/src/sdk/statsig.native.ts @@ -1,7 +1,9 @@ import { StatsigClient } from '@statsig/react-bindings' import { StatsigClientRN } from '@statsig/react-native-bindings' -import { config } from 'uniswap/src/config' -import { LocalOverrideAdapterWrapper } from 'uniswap/src/features/gating/LocalOverrideAdapterWrapper' +import { getConfig } from '@universe/config' +import { LocalOverrideAdapterWrapper } from '@universe/gating/src/LocalOverrideAdapterWrapper' + +const config = getConfig() export { StatsigClient, diff --git a/packages/uniswap/src/features/gating/sdk/statsig.ts b/packages/gating/src/sdk/statsig.ts similarity index 92% rename from packages/uniswap/src/features/gating/sdk/statsig.ts rename to packages/gating/src/sdk/statsig.ts index 231452cfe31..df1964153b0 100644 --- a/packages/uniswap/src/features/gating/sdk/statsig.ts +++ b/packages/gating/src/sdk/statsig.ts @@ -1,5 +1,5 @@ import { StatsigClient } from '@statsig/react-bindings' -import { LocalOverrideAdapterWrapper } from 'uniswap/src/features/gating/LocalOverrideAdapterWrapper' +import { LocalOverrideAdapterWrapper } from '@universe/gating/src/LocalOverrideAdapterWrapper' export { StatsigClient, diff --git a/packages/uniswap/src/features/gating/utils.ts b/packages/gating/src/utils.ts similarity index 92% rename from packages/uniswap/src/features/gating/utils.ts rename to packages/gating/src/utils.ts index d06e7398daa..491fc37ff2a 100644 --- a/packages/uniswap/src/features/gating/utils.ts +++ b/packages/gating/src/utils.ts @@ -1,5 +1,5 @@ import { PrecomputedEvaluationsInterface } from '@statsig/js-client' -import { getOverrideAdapter } from 'uniswap/src/features/gating/sdk/statsig' +import { getOverrideAdapter } from '@universe/gating/src/sdk/statsig' export function isStatsigReady(client: PrecomputedEvaluationsInterface): boolean { return client.loadingStatus === 'Ready' diff --git a/packages/gating/tsconfig.json b/packages/gating/tsconfig.json new file mode 100644 index 00000000000..1d8d402436b --- /dev/null +++ b/packages/gating/tsconfig.json @@ -0,0 +1,19 @@ +{ + "extends": "../../config/tsconfig/app.json", + "include": ["src/**/*.ts", "src/**/*.tsx", "src/**/*.json", "src/global.d.ts"], + "exclude": ["src/**/*.spec.ts", "src/**/*.spec.tsx", "src/**/*.test.ts", "src/**/*.test.tsx"], + "compilerOptions": { + "noEmit": false, + "emitDeclarationOnly": true, + "types": ["node"], + "paths": {} + }, + "references": [ + { + "path": "../utilities" + }, + { + "path": "../api" + } + ] +} diff --git a/packages/gating/tsconfig.lint.json b/packages/gating/tsconfig.lint.json new file mode 100644 index 00000000000..79659c26038 --- /dev/null +++ b/packages/gating/tsconfig.lint.json @@ -0,0 +1,8 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "preserveSymlinks": true + }, + "include": ["**/*.ts", "**/*.tsx", "**/*.json"], + "exclude": ["node_modules"] +} diff --git a/packages/notifications/.eslintrc.js b/packages/notifications/.eslintrc.js new file mode 100644 index 00000000000..a6dbbad9fee --- /dev/null +++ b/packages/notifications/.eslintrc.js @@ -0,0 +1,45 @@ +module.exports = { + root: true, + extends: ['@uniswap/eslint-config/native', '@uniswap/eslint-config/webPlatform'], + ignorePatterns: [ + 'node_modules', + '.turbo', + '.eslintrc.js', + 'vitest.config.ts', + 'codegen.ts', + '.nx', + 'scripts', + 'dist', + 'src/**/__generated__', + ], + parserOptions: { + project: 'tsconfig.lint.json', + tsconfigRootDir: __dirname, + ecmaFeatures: { + jsx: true, + }, + ecmaVersion: 2018, + sourceType: 'module', + }, + overrides: [ + { + files: ['src/index.ts'], + rules: { + 'check-file/no-index': 'off', + }, + }, + { + files: ['*.ts', '*.tsx'], + rules: { + 'no-relative-import-paths/no-relative-import-paths': [ + 'error', + { + allowSameFolder: false, + prefix: '@universe/notifications', + }, + ], + }, + }, + ], + rules: {}, +} diff --git a/packages/notifications/README.md b/packages/notifications/README.md new file mode 100644 index 00000000000..afbab0c0cfb --- /dev/null +++ b/packages/notifications/README.md @@ -0,0 +1,73 @@ +# @universe/notifications + +Client-side notification system for fetching, processing, storing, and displaying notifications from a backend service. + +## Architecture + +``` +NotificationSystem (orchestrator) +├── NotificationDataSource → Fetch/websocket notification data +├── NotificationTracker → Track shown/dismissed state +├── NotificationProcessor → Filter & prioritize notifications +├── NotificationChainCoordinator → Handle multi-step notification flows +└── NotificationRenderer → Platform-specific UI rendering +``` + +## Core Concepts + +### Notification Chains +Notifications can trigger follow-up notifications based on user actions: +```json +{ + "notificationName": "welcome_step_1", + "content": { + "buttons": [{ + "text": "Next", + "onClickType": "ON_CLICK_TYPE_DISMISS_AND_POPUP", + "onClickLink": "welcome_step_2" // ← triggers next notification + }] + } +} +``` + +## Usage + +### Initialize the System + +```typescript +import { createNotificationSystem } from '@universe/notifications' + +const notificationSystem = createNotificationSystem({ + dataSources: [getFetchNotificationDataSource({ apiClient })], + tracker: createLocalNotificationTracker({ storageDriver }), + processor: createNotificationProcessor(), + renderer: createNotificationRenderer(), + chainCoordinator: createNotificationChainCoordinator() +}) + +await notificationSystem.initialize() +``` + +### Handle User Actions + +```typescript +// When user clicks a button +notificationSystem.onButtonClick(notificationName, button) + +// When user dismisses +notificationSystem.onDismiss(notificationName) + +// When user clicks background +notificationSystem.onBackgroundClick(notificationName) +``` + +### React Integration + +```tsx +// Mount container at app root + + +// Container reads from Zustand store +const activeNotifications = useNotificationStore(state => state.activeNotifications) +const notificationSystem = useNotificationStore(state => state.notificationSystem) +``` diff --git a/packages/notifications/package.json b/packages/notifications/package.json new file mode 100644 index 00000000000..fdcf387b687 --- /dev/null +++ b/packages/notifications/package.json @@ -0,0 +1,18 @@ +{ + "name": "@universe/notifications", + "version": "0.0.0", + "devDependencies": { + "@types/node": "22.13.1", + "@uniswap/eslint-config": "workspace:^", + "depcheck": "1.4.7", + "eslint": "8.44.0", + "typescript": "5.3.3" + }, + "scripts": {}, + "nx": { + "includedScripts": [] + }, + "main": "src/index.ts", + "private": true, + "sideEffects": false +} diff --git a/packages/notifications/project.json b/packages/notifications/project.json new file mode 100644 index 00000000000..83f11f630fe --- /dev/null +++ b/packages/notifications/project.json @@ -0,0 +1,16 @@ +{ + "name": "@universe/notifications", + "$schema": "../../node_modules/nx/schemas/project-schema.json", + "sourceRoot": "packages/notifications/src", + "projectType": "library", + "tags": [], + "targets": { + "typecheck": {}, + "lint:biome": {}, + "lint:biome:fix": {}, + "lint:eslint": {}, + "lint:eslint:fix": {}, + "lint": {}, + "lint:fix": {} + } +} diff --git a/packages/notifications/src/index.ts b/packages/notifications/src/index.ts new file mode 100644 index 00000000000..e69de29bb2d diff --git a/packages/notifications/tsconfig.json b/packages/notifications/tsconfig.json new file mode 100644 index 00000000000..6fbf4aa3e1b --- /dev/null +++ b/packages/notifications/tsconfig.json @@ -0,0 +1,12 @@ +{ + "extends": "../../config/tsconfig/app.json", + "include": ["src/**/*.ts", "src/**/*.tsx", "src/**/*.json", "src/global.d.ts"], + "exclude": ["src/**/*.spec.ts", "src/**/*.spec.tsx", "src/**/*.test.ts", "src/**/*.test.tsx"], + "compilerOptions": { + "noEmit": false, + "emitDeclarationOnly": true, + "types": ["node"], + "paths": {} + }, + "references": [] +} diff --git a/packages/notifications/tsconfig.lint.json b/packages/notifications/tsconfig.lint.json new file mode 100644 index 00000000000..79659c26038 --- /dev/null +++ b/packages/notifications/tsconfig.lint.json @@ -0,0 +1,8 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "preserveSymlinks": true + }, + "include": ["**/*.ts", "**/*.tsx", "**/*.json"], + "exclude": ["node_modules"] +} diff --git a/packages/ui/src/assets/graphics/bridged-assets-v2-web-banner.png b/packages/ui/src/assets/graphics/bridged-assets-v2-web-banner.png new file mode 100644 index 0000000000000000000000000000000000000000..c7e87c3aa9006d2308279bfa82b69c8be89ef245 GIT binary patch literal 128449 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

2^rd?|>O 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 { return { diff --git a/packages/ui/src/components/switch/Switch.native.tsx b/packages/ui/src/components/switch/Switch.native.tsx index e5023ae2892..6103f25683a 100644 --- a/packages/ui/src/components/switch/Switch.native.tsx +++ b/packages/ui/src/components/switch/Switch.native.tsx @@ -40,7 +40,7 @@ export const Switch = memo(function Switch({ if (checked !== undefined && checked !== (progress.value === 1)) { progress.value = withTiming(checked ? 1 : 0, ANIMATION_CONFIG) } - }, [checked, progress]) + }, [checked]) const trackStyle = useAnimatedStyle(() => { const isOn = progress.value diff --git a/packages/ui/src/loading/Shine.native.tsx b/packages/ui/src/loading/Shine.native.tsx index 34c98d0ba77..c43c1db9cb1 100644 --- a/packages/ui/src/loading/Shine.native.tsx +++ b/packages/ui/src/loading/Shine.native.tsx @@ -30,7 +30,7 @@ export function Shine({ shimmerDurationSeconds = 2, children, disabled }: ShineP useEffect(() => { xPosition.value = withRepeat(withTiming(1, { duration: shimmerDuration }), Infinity, false) - }, [xPosition, shimmerDuration]) + }, [shimmerDuration]) const animatedStyle = useAnimatedStyle(() => ({ ...StyleSheet.absoluteFillObject, diff --git a/packages/ui/src/loading/Skeleton.native.tsx b/packages/ui/src/loading/Skeleton.native.tsx index 996ab35d086..37629c16a11 100644 --- a/packages/ui/src/loading/Skeleton.native.tsx +++ b/packages/ui/src/loading/Skeleton.native.tsx @@ -19,7 +19,6 @@ export function Skeleton({ children, contrast, disabled }: SkeletonProps): JSX.E const [layout, setLayout] = useState() const xPosition = useSharedValue(0) - // biome-ignore lint/correctness/useExhaustiveDependencies: only want to do this once on mount useLayoutEffect(() => { // TODO: [MOB-210] tweak animation to be smoother, right now sometimes looks kind of stuttery xPosition.value = withRepeat(withTiming(1, { duration: SHIMMER_DURATION }), Infinity, true) diff --git a/packages/ui/src/loading/SpinningLoader.native.tsx b/packages/ui/src/loading/SpinningLoader.native.tsx index bfaf4dc085d..44a3cfbf01d 100644 --- a/packages/ui/src/loading/SpinningLoader.native.tsx +++ b/packages/ui/src/loading/SpinningLoader.native.tsx @@ -33,7 +33,7 @@ export function SpinningLoader({ size = 20, disabled, color }: SpinningLoaderPro -1, ) return () => cancelAnimation(rotation) - }, [rotation]) + }, []) if (disabled) { return diff --git a/packages/uniswap/jest-package-mocks.js b/packages/uniswap/jest-package-mocks.js index 4141f641fdd..970956be0fd 100644 --- a/packages/uniswap/jest-package-mocks.js +++ b/packages/uniswap/jest-package-mocks.js @@ -20,10 +20,10 @@ jest.mock('utilities/src/device/uniqueId', () => { return jest.requireActual('uniswap/src/test/mocks/uniqueId') }) -jest.mock('uniswap/src/features/gating/sdk/statsig', () => { - const actualStatsig = jest.requireActual('uniswap/src/features/gating/sdk/statsig') +jest.mock('@universe/gating', () => { + const actual = jest.requireActual('@universe/gating') return { - ...actualStatsig, + ...actual, useClientAsyncInit: jest.fn(() => ({ client: null, isLoading: true, diff --git a/packages/uniswap/package.json b/packages/uniswap/package.json index a0e09b69a13..9d4bae0b472 100644 --- a/packages/uniswap/package.json +++ b/packages/uniswap/package.json @@ -26,6 +26,7 @@ "@connectrpc/connect-query": "1.4.1", "@datadog/browser-logs": "5.20.0", "@datadog/browser-rum": "5.23.3", + "@ethersproject/abstract-provider": "5.8.0", "@ethersproject/abstract-signer": "5.7.0", "@ethersproject/address": "5.7.0", "@ethersproject/bignumber": "5.7.0", @@ -40,21 +41,15 @@ "@shopify/flash-list": "1.7.3", "@simplewebauthn/browser": "13.1.0", "@solana/web3.js": "1.92.0", - "@statsig/client-core": "3.12.2", - "@statsig/js-client": "3.12.2", - "@statsig/js-local-overrides": "3.12.2", - "@statsig/react-bindings": "3.12.2", - "@statsig/react-native-bindings": "3.12.2", "@tanstack/query-async-storage-persister": "5.51.21", "@tanstack/react-query": "5.77.2", "@tanstack/react-query-persist-client": "5.77.2", "@typechain/ethers-v5": "7.2.0", "@types/poisson-disk-sampling": "2.2.4", "@uniswap/analytics-events": "2.43.0", - "@uniswap/client-data-api": "0.0.14", + "@uniswap/client-data-api": "0.0.18", "@uniswap/client-embeddedwallet": "0.0.16", "@uniswap/client-explore": "0.0.17", - "@uniswap/client-pools": "0.0.17", "@uniswap/client-search": "0.0.10", "@uniswap/client-trading": "0.1.0", "@uniswap/permit2-sdk": "1.3.0", @@ -67,6 +62,7 @@ "@uniswap/v4-sdk": "1.21.2", "@universe/api": "workspace:^", "@universe/config": "workspace:^", + "@universe/gating": "workspace:^", "apollo-link-rest": "0.9.0", "date-fns": "2.30.0", "dayjs": "1.11.7", diff --git a/packages/uniswap/src/components/BridgedAsset/BridgedAssetModal.tsx b/packages/uniswap/src/components/BridgedAsset/BridgedAssetModal.tsx index ab6b1161337..5aab811db58 100644 --- a/packages/uniswap/src/components/BridgedAsset/BridgedAssetModal.tsx +++ b/packages/uniswap/src/components/BridgedAsset/BridgedAssetModal.tsx @@ -17,7 +17,6 @@ import { EnvelopeHeart } from 'ui/src/components/icons/EnvelopeHeart' import { OrderRouting } from 'ui/src/components/icons/OrderRouting' import { Verified } from 'ui/src/components/icons/Verified' import { iconSizes } from 'ui/src/theme' -import { getBridgedAsset } from 'uniswap/src/components/BridgedAsset/utils' import { CurrencyLogo } from 'uniswap/src/components/CurrencyLogo/CurrencyLogo' import { Modal } from 'uniswap/src/components/modals/Modal' import { uniswapUrls } from 'uniswap/src/constants/urls' @@ -47,8 +46,7 @@ export const BridgedAssetModalAtom = atom(un function BridgedAssetModalContent({ currencyInfo }: { currencyInfo: CurrencyInfo }): JSX.Element | null { const { t } = useTranslation() const chainName = getChainLabel(currencyInfo.currency.chainId) - const bridgedAsset = getBridgedAsset(currencyInfo) - if (!currencyInfo.currency.symbol || !bridgedAsset) { + if (!currencyInfo.currency.symbol || !currencyInfo.isBridged) { return null } @@ -104,11 +102,13 @@ function BridgedAssetModalContent({ currencyInfo }: { currencyInfo: CurrencyInfo - {t('bridgedAsset.modal.feature.withdrawToNativeChain', { nativeChainName: bridgedAsset.nativeChain })} + {t('bridgedAsset.modal.feature.withdrawToNativeChain', { + nativeChainName: currencyInfo.bridgedWithdrawalInfo?.chain ?? '', + })} {t('bridgedAsset.modal.feature.withdrawToNativeChain.description', { - nativeChainName: bridgedAsset.nativeChain, + nativeChainName: currencyInfo.bridgedWithdrawalInfo?.chain ?? '', })} diff --git a/packages/uniswap/src/components/BridgedAsset/WormholeModal.tsx b/packages/uniswap/src/components/BridgedAsset/WormholeModal.tsx index 38973fe1773..394941a0b6f 100644 --- a/packages/uniswap/src/components/BridgedAsset/WormholeModal.tsx +++ b/packages/uniswap/src/components/BridgedAsset/WormholeModal.tsx @@ -17,7 +17,6 @@ import { ExternalLink } from 'ui/src/components/icons/ExternalLink' import { Shuffle } from 'ui/src/components/icons/Shuffle' import { iconSizes } from 'ui/src/theme' import { BaseModalProps } from 'uniswap/src/components/BridgedAsset/BridgedAssetModal' -import { getBridgedAsset } from 'uniswap/src/components/BridgedAsset/utils' import { CurrencyLogo } from 'uniswap/src/components/CurrencyLogo/CurrencyLogo' import { Modal } from 'uniswap/src/components/modals/Modal' import { uniswapUrls } from 'uniswap/src/constants/urls' @@ -52,7 +51,7 @@ export function WormholeModal({ const textColor = useMemo(() => { return getContrastPassingTextColor(validTokenColor ?? colors.accent1.val) }, [colors.accent1.val, validTokenColor]) - const bridgedAsset = getBridgedAsset(currencyInfo) + const bridgedWithdrawalInfo = currencyInfo?.bridgedWithdrawalInfo const onPressLearnMore = async (): Promise => { await openUri({ uri: uniswapUrls.helpArticleUrls.bridgedAssets }) @@ -60,14 +59,17 @@ export function WormholeModal({ } const onPressContinue = useEvent(async () => { + if (!bridgedWithdrawalInfo?.url) { + return + } await openUri({ - uri: `${uniswapUrls.wormholeUrl}?sourceChain=unichain&targetChain=${bridgedAsset?.nativeChain}&asset=${bridgedAsset?.unichainAddress}&targetAsset=${bridgedAsset?.nativeAddress}`, + uri: bridgedWithdrawalInfo.url, openExternalBrowser: true, }) onClose() }) - if (!currencyInfo || !currencyInfo.currency.symbol || !bridgedAsset) { + if (!currencyInfo || !currencyInfo.currency.symbol || !bridgedWithdrawalInfo) { return null } const chainName = getChainLabel(currencyInfo.currency.chainId) @@ -127,14 +129,15 @@ export function WormholeModal({ {t('bridgedAsset.wormhole.title', { currencySymbol: currencyInfo.currency.symbol, - nativeChainName: bridgedAsset.nativeChain, + nativeChainName: bridgedWithdrawalInfo.chain, })} {t('bridgedAsset.wormhole.description', { currencySymbol: currencyInfo.currency.symbol, chainName, - nativeChainName: bridgedAsset.nativeChain, + nativeChainName: bridgedWithdrawalInfo.chain, + provider: bridgedWithdrawalInfo.provider, })} @@ -158,7 +161,7 @@ export function WormholeModal({ onPress={onPressContinue} > - {t('bridgedAsset.wormhole.button')} + {t('bridgedAsset.wormhole.button', { provider: bridgedWithdrawalInfo.provider })} diff --git a/packages/uniswap/src/components/BridgedAsset/utils.ts b/packages/uniswap/src/components/BridgedAsset/utils.ts deleted file mode 100644 index c74ddbe26d9..00000000000 --- a/packages/uniswap/src/components/BridgedAsset/utils.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { BridgedAsset, isBridgedAsset, UNICHAIN_BRIDGED_ASSETS } from 'uniswap/src/constants/tokens' -import { UniverseChainId } from 'uniswap/src/features/chains/types' -import { CurrencyInfo } from 'uniswap/src/features/dataApi/types' - -export function checkIsBridgedAsset(currencyInfo?: CurrencyInfo): boolean { - if (!currencyInfo) { - return false - } - - return ( - currencyInfo.currency.chainId === UniverseChainId.Unichain && - currencyInfo.currency.isToken && - isBridgedAsset(currencyInfo.currency.address) - ) -} - -export function getBridgedAsset(currencyInfo?: Maybe): BridgedAsset | undefined { - if (!currencyInfo || !currencyInfo.currency.isToken) { - return undefined - } - const address = currencyInfo.currency.address - return UNICHAIN_BRIDGED_ASSETS.find((asset) => asset.unichainAddress === address) -} diff --git a/packages/uniswap/src/components/CurrencyInputPanel/AmountInputPresets/AmountInputPresets.tsx b/packages/uniswap/src/components/CurrencyInputPanel/AmountInputPresets/AmountInputPresets.tsx index 1b3889b53ea..1103debb35d 100644 --- a/packages/uniswap/src/components/CurrencyInputPanel/AmountInputPresets/AmountInputPresets.tsx +++ b/packages/uniswap/src/components/CurrencyInputPanel/AmountInputPresets/AmountInputPresets.tsx @@ -1,21 +1,17 @@ -import { Flex, FlexProps } from 'ui/src' +import { Key } from 'react' +import { ButtonProps, Flex, FlexProps } from 'ui/src' import { get200MsAnimationDelayFromIndex } from 'ui/src/theme/animations/delay200ms' -import { PresetAmountButton } from 'uniswap/src/components/CurrencyInputPanel/AmountInputPresets/PresetAmountButton' import { AmountInputPresetsProps } from 'uniswap/src/components/CurrencyInputPanel/AmountInputPresets/types' -import { PRESET_PERCENTAGES } from 'uniswap/src/components/CurrencyInputPanel/AmountInputPresets/utils' -import { ElementName } from 'uniswap/src/features/telemetry/constants' -import { CurrencyField } from 'uniswap/src/types/currency' import { isHoverable } from 'utilities/src/platform' -export function AmountInputPresets({ +export const PRESET_BUTTON_PROPS: ButtonProps = { variant: 'default', py: '$spacing4' } + +export function AmountInputPresets({ hoverLtr, - currencyAmount, - currencyBalance, - transactionType, - buttonProps, - onSetPresetValue, + presets, + renderPreset, ...rest -}: AmountInputPresetsProps & FlexProps): JSX.Element { +}: AmountInputPresetsProps & FlexProps): JSX.Element { return ( - {PRESET_PERCENTAGES.map((percent, index) => ( + {presets.map((preset, index) => ( - + {renderPreset(preset)} ))} diff --git a/packages/uniswap/src/components/CurrencyInputPanel/AmountInputPresets/types.ts b/packages/uniswap/src/components/CurrencyInputPanel/AmountInputPresets/types.ts index 8fda416c162..7734ff991db 100644 --- a/packages/uniswap/src/components/CurrencyInputPanel/AmountInputPresets/types.ts +++ b/packages/uniswap/src/components/CurrencyInputPanel/AmountInputPresets/types.ts @@ -1,15 +1,8 @@ -import { Currency, CurrencyAmount } from '@uniswap/sdk-core' -import { ButtonProps } from 'ui/src/components/buttons/Button/types' -import { TransactionType } from 'uniswap/src/features/transactions/types/transactionDetails' - export type PresetPercentageNumber = 25 | 50 | 75 | 100 export type PresetPercentage = PresetPercentageNumber | 'max' -export interface AmountInputPresetsProps { +export interface AmountInputPresetsProps { hoverLtr?: boolean - currencyAmount: CurrencyAmount | null | undefined - currencyBalance: CurrencyAmount - transactionType?: TransactionType - buttonProps?: ButtonProps - onSetPresetValue: (amount: string, percentage: PresetPercentage) => void + presets: T[] + renderPreset: (preset: T) => JSX.Element } diff --git a/packages/uniswap/src/components/CurrencyInputPanel/CurrencyInputPanel.tsx b/packages/uniswap/src/components/CurrencyInputPanel/CurrencyInputPanel.tsx index 194d817d833..29f5a8e6bb9 100644 --- a/packages/uniswap/src/components/CurrencyInputPanel/CurrencyInputPanel.tsx +++ b/packages/uniswap/src/components/CurrencyInputPanel/CurrencyInputPanel.tsx @@ -1,15 +1,20 @@ /* eslint-disable complexity */ import { forwardRef, memo, useCallback } from 'react' import { Flex, TouchableArea, useIsShortMobileDevice, useShakeAnimation } from 'ui/src' -import { AmountInputPresets } from 'uniswap/src/components/CurrencyInputPanel/AmountInputPresets/AmountInputPresets' +import { + AmountInputPresets, + PRESET_BUTTON_PROPS, +} from 'uniswap/src/components/CurrencyInputPanel/AmountInputPresets/AmountInputPresets' import { PresetAmountButton } from 'uniswap/src/components/CurrencyInputPanel/AmountInputPresets/PresetAmountButton' import type { PresetPercentage } from 'uniswap/src/components/CurrencyInputPanel/AmountInputPresets/types' +import { PRESET_PERCENTAGES } from 'uniswap/src/components/CurrencyInputPanel/AmountInputPresets/utils' import { CurrencyInputPanelBalance } from 'uniswap/src/components/CurrencyInputPanel/CurrencyInputPanelBalance' import { CurrencyInputPanelHeader } from 'uniswap/src/components/CurrencyInputPanel/CurrencyInputPanelHeader' import { CurrencyInputPanelInput } from 'uniswap/src/components/CurrencyInputPanel/CurrencyInputPanelInput' import { CurrencyInputPanelValue } from 'uniswap/src/components/CurrencyInputPanel/CurrencyInputPanelValue' import { useIndicativeQuoteTextDisplay } from 'uniswap/src/components/CurrencyInputPanel/hooks/useIndicativeQuoteTextDisplay' import type { CurrencyInputPanelProps, CurrencyInputPanelRef } from 'uniswap/src/components/CurrencyInputPanel/types' +import { ElementName } from 'uniswap/src/features/telemetry/constants' import { useWallet } from 'uniswap/src/features/wallet/hooks/useWallet' import { CurrencyField } from 'uniswap/src/types/currency' import { isExtensionApp, isMobileWeb, isWebAppDesktop } from 'utilities/src/platform' @@ -80,6 +85,22 @@ export const CurrencyInputPanel = memo( [onSetPresetValue], ) + const renderPreset = useCallback( + (preset: PresetPercentage) => ( + + ), + [currencyAmount, currencyBalance, currencyField, handleSetPresetValue, transactionType], + ) + return ( {showPercentagePresetsOnBottom && currencyBalance && !currencyAmount ? ( - + ) : ( ( + + ), + [currencyAmount, currencyBalance, currencyField, onSetPresetValue], + ) + if (!headerLabel && !showDefaultTokenOptions) { return null } @@ -49,12 +71,7 @@ export function CurrencyInputPanelHeader({ {showInputPresets && ( - + )} {showDefaultTokenOptions && isWebAppDesktop && ( diff --git a/packages/uniswap/src/components/TokenSelector/TokenSelector.tsx b/packages/uniswap/src/components/TokenSelector/TokenSelector.tsx index 8a11c2310d4..ca096c964fd 100644 --- a/packages/uniswap/src/components/TokenSelector/TokenSelector.tsx +++ b/packages/uniswap/src/components/TokenSelector/TokenSelector.tsx @@ -1,5 +1,6 @@ import type { BottomSheetView } from '@gorhom/bottom-sheet' import { Currency } from '@uniswap/sdk-core' +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import { hasStringAsync } from 'expo-clipboard' import { ComponentProps, memo, useCallback, useEffect, useMemo, useState } from 'react' import { useTranslation } from 'react-i18next' @@ -23,8 +24,6 @@ import { TradeableAsset } from 'uniswap/src/entities/assets' import { useEnabledChains } from 'uniswap/src/features/chains/hooks/useEnabledChains' import { UniverseChainId } from 'uniswap/src/features/chains/types' import { CurrencyInfo } from 'uniswap/src/features/dataApi/types' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' import { SearchContext } from 'uniswap/src/features/search/SearchModal/analytics/SearchContext' import { useFilterCallbacks } from 'uniswap/src/features/search/SearchModal/hooks/useFilterCallbacks' import { SearchTextInput } from 'uniswap/src/features/search/SearchTextInput' diff --git a/packages/uniswap/src/components/TokenSelector/TokenSelectorList.tsx b/packages/uniswap/src/components/TokenSelector/TokenSelectorList.tsx index 239da7655aa..b3c62a99d83 100644 --- a/packages/uniswap/src/components/TokenSelector/TokenSelectorList.tsx +++ b/packages/uniswap/src/components/TokenSelector/TokenSelectorList.tsx @@ -2,7 +2,6 @@ import { memo, useCallback, useState } from 'react' import { useDispatch } from 'react-redux' import { Text } from 'ui/src' import { BridgedAssetModal } from 'uniswap/src/components/BridgedAsset/BridgedAssetModal' -import { checkIsBridgedAsset } from 'uniswap/src/components/BridgedAsset/utils' import { TokenOptionItem as BaseTokenOptionItem, TokenContextMenuVariant, @@ -80,7 +79,7 @@ const TokenOptionItem = memo(function _TokenOptionItem({ const shouldShowWarningModalOnPress = showWarnings && (isBlocked || (severity !== WarningSeverity.None && !tokenWarningDismissed)) - const isBridgedAsset = checkIsBridgedAsset(currencyInfo) + const isBridgedAsset = Boolean(currencyInfo.isBridged) const [showBridgedAssetWarningModal, setShowBridgedAssetWarningModal] = useState(false) const { tokenWarningDismissed: bridgedAssetTokenWarningDismissed } = useDismissedBridgedAssetWarnings( currencyInfo.currency, diff --git a/packages/uniswap/src/components/TokenSelector/hooks.test.ts b/packages/uniswap/src/components/TokenSelector/hooks.test.ts index 274e9417792..7970d994ec6 100644 --- a/packages/uniswap/src/components/TokenSelector/hooks.test.ts +++ b/packages/uniswap/src/components/TokenSelector/hooks.test.ts @@ -62,6 +62,16 @@ jest.mock('uniswap/src/data/rest/tokenRankings', () => ({ tokenRankingsStatToCurrencyInfo: jest.fn(), })) +// Helper to convert undefined to null for GraphQL compatibility +const convertUndefinedToNull = ( + items: T[], +): T[] => + items.map((item) => ({ + ...item, + isBridged: item.isBridged ?? null, + bridgedWithdrawalInfo: item.bridgedWithdrawalInfo ?? null, + })) + const mockPortfolioHook = jest.requireMock( 'uniswap/src/components/TokenSelector/hooks/usePortfolioBalancesForAddressById', ) @@ -157,12 +167,12 @@ describe(useAllCommonBaseCurrencies, () => { { test: 'returns all currencies when there is no currency with a bridged version on other networks', input: projects, - output: { data: tokenProjectToCurrencyInfos(projects) }, + output: { data: convertUndefinedToNull(tokenProjectToCurrencyInfos(projects)) }, }, { test: 'filters out currencies that have a bridged version on other networks', input: [projectWithBridged], - output: { data: tokenProjectToCurrencyInfos([tokenProjectWithoutBridged]) }, + output: { data: convertUndefinedToNull(tokenProjectToCurrencyInfos([tokenProjectWithoutBridged])) }, }, ] @@ -215,7 +225,7 @@ describe(useFavoriteCurrencies, () => { { test: 'returns favorite tokens when there is data', input: [project], - output: { data: tokenProjectToCurrencyInfos([projectWithFavoritesOnly]) }, + output: { data: convertUndefinedToNull(tokenProjectToCurrencyInfos([projectWithFavoritesOnly])) }, }, ] @@ -319,22 +329,22 @@ describe(useFilterCallbacks, () => { expect(result.current.chainFilter).toEqual(UniverseChainId.ArbitrumOne) expect(result.current.searchFilter).toEqual('base uni') expect(result.current.parsedSearchFilter).toEqual(null) - expect(result.current.parsedSearchFilter).toEqual(null) }) it('does not parse unsupported chains', async () => { + const searchText = 'UNSUPPORTED uni' const { result } = renderHook(() => useFilterCallbacks(null, ModalName.Swap)) expect(result.current.parsedSearchFilter).toEqual(null) await act(() => { - result.current.onChangeText('UNSUPPORTED uni') + result.current.onChangeText(searchText) }) expect(result.current.chainFilter).toEqual(null) - expect(result.current.searchFilter).toEqual('UNSUPPORTED uni') + expect(result.current.searchFilter).toEqual(searchText) expect(result.current.parsedChainFilter).toEqual(null) - expect(result.current.parsedSearchFilter).toEqual(null) + expect(result.current.parsedSearchFilter).toEqual(searchText) }) it('only parses after the first space', async () => { @@ -399,17 +409,18 @@ describe(useFilterCallbacks, () => { it('does not parse unsupported chains from end', async () => { const { result } = renderHook(() => useFilterCallbacks(null, ModalName.Swap)) + const searchText = 'uni UNSUPPORTED' expect(result.current.parsedSearchFilter).toEqual(null) await act(() => { - result.current.onChangeText('uni UNSUPPORTED') + result.current.onChangeText(searchText) }) expect(result.current.chainFilter).toEqual(null) - expect(result.current.searchFilter).toEqual('uni UNSUPPORTED') + expect(result.current.searchFilter).toEqual(searchText) expect(result.current.parsedChainFilter).toEqual(null) - expect(result.current.parsedSearchFilter).toEqual(null) + expect(result.current.parsedSearchFilter).toEqual(searchText) }) }) diff --git a/packages/uniswap/src/components/activity/details/TransactionDetailsModal.test.tsx b/packages/uniswap/src/components/activity/details/TransactionDetailsModal.test.tsx index ab3a2ad969a..7aa920b47a9 100644 --- a/packages/uniswap/src/components/activity/details/TransactionDetailsModal.test.tsx +++ b/packages/uniswap/src/components/activity/details/TransactionDetailsModal.test.tsx @@ -83,7 +83,8 @@ jest.mock('uniswap/src/features/tokens/useCurrencyInfo', () => ({ }, })) -jest.mock('uniswap/src/features/gating/hooks', () => ({ +jest.mock('@universe/gating', () => ({ + ...jest.requireActual('@universe/gating'), useDynamicConfigValue: jest .fn() .mockImplementation(({ defaultValue }: { config: unknown; key: unknown; defaultValue: unknown }) => { diff --git a/packages/uniswap/src/components/activity/details/transactions/SwapTransactionDetails.test.tsx b/packages/uniswap/src/components/activity/details/transactions/SwapTransactionDetails.test.tsx index 5b4154799d9..ac166a53b89 100644 --- a/packages/uniswap/src/components/activity/details/transactions/SwapTransactionDetails.test.tsx +++ b/packages/uniswap/src/components/activity/details/transactions/SwapTransactionDetails.test.tsx @@ -51,7 +51,8 @@ jest.mock('uniswap/src/features/tokens/useCurrencyInfo', () => ({ }, })) -jest.mock('uniswap/src/features/gating/hooks', () => ({ +jest.mock('@universe/gating', () => ({ + ...jest.requireActual('@universe/gating'), useDynamicConfigValue: jest .fn() .mockImplementation(({ defaultValue }: { config: unknown; key: unknown; defaultValue: unknown }) => { diff --git a/packages/uniswap/src/components/activity/details/transactions/TransferTransactionDetails.test.tsx b/packages/uniswap/src/components/activity/details/transactions/TransferTransactionDetails.test.tsx index 6827f2805c4..52cfaa09a99 100644 --- a/packages/uniswap/src/components/activity/details/transactions/TransferTransactionDetails.test.tsx +++ b/packages/uniswap/src/components/activity/details/transactions/TransferTransactionDetails.test.tsx @@ -67,7 +67,8 @@ const getCurrencyInfoForChain = (chainId: number): CurrencyInfo => { } } -jest.mock('uniswap/src/features/gating/hooks', () => ({ +jest.mock('@universe/gating', () => ({ + ...jest.requireActual('@universe/gating'), useDynamicConfigValue: jest .fn() .mockImplementation(({ defaultValue }: { config: unknown; key: unknown; defaultValue: unknown }) => { diff --git a/packages/uniswap/src/components/gating/DynamicConfigDropdown.tsx b/packages/uniswap/src/components/gating/DynamicConfigDropdown.tsx index 17d4e3450cb..c3797f2dbd4 100644 --- a/packages/uniswap/src/components/gating/DynamicConfigDropdown.tsx +++ b/packages/uniswap/src/components/gating/DynamicConfigDropdown.tsx @@ -1,8 +1,6 @@ +import { DynamicConfigKeys, DynamicConfigs, getOverrideAdapter, useDynamicConfigValue } from '@universe/gating' import { Flex, Text } from 'ui/src' import { ActionSheetDropdown } from 'uniswap/src/components/dropdowns/ActionSheetDropdown' -import { DynamicConfigKeys, DynamicConfigs } from 'uniswap/src/features/gating/configs' -import { useDynamicConfigValue } from 'uniswap/src/features/gating/hooks' -import { getOverrideAdapter } from 'uniswap/src/features/gating/sdk/statsig' export function DynamicConfigDropdown({ config, diff --git a/packages/uniswap/src/components/gating/GatingOverrides.tsx b/packages/uniswap/src/components/gating/GatingOverrides.tsx index 4d82f77b9b2..94bae18eb5a 100644 --- a/packages/uniswap/src/components/gating/GatingOverrides.tsx +++ b/packages/uniswap/src/components/gating/GatingOverrides.tsx @@ -1,3 +1,16 @@ +import { + DynamicConfigs, + EmbeddedWalletConfigKey, + Experiments, + ExtensionBiometricUnlockConfigKey, + FeatureFlags, + ForceUpgradeConfigKey, + getFeatureFlagName, + getOverrideAdapter, + Layers, + useFeatureFlagWithExposureLoggingDisabled, + WALLET_FEATURE_FLAG_NAMES, +} from '@universe/gating' import React, { PropsWithChildren, useCallback } from 'react' import { Accordion, Flex, Separator, Switch, Text } from 'ui/src' import { RotatableChevron } from 'ui/src/components/icons/RotatableChevron' @@ -14,16 +27,6 @@ import { GatingButton } from 'uniswap/src/components/gating/GatingButton' import { ExperimentRow, LayerRow } from 'uniswap/src/components/gating/Rows' import { useForceUpgradeStatus } from 'uniswap/src/features/forceUpgrade/hooks/useForceUpgradeStatus' import { useForceUpgradeTranslations } from 'uniswap/src/features/forceUpgrade/hooks/useForceUpgradeTranslations' -import { - DynamicConfigs, - EmbeddedWalletConfigKey, - ExtensionBiometricUnlockConfigKey, - ForceUpgradeConfigKey, -} from 'uniswap/src/features/gating/configs' -import { Experiments, Layers } from 'uniswap/src/features/gating/experiments' -import { FeatureFlags, getFeatureFlagName, WALLET_FEATURE_FLAG_NAMES } from 'uniswap/src/features/gating/flags' -import { useFeatureFlagWithExposureLoggingDisabled } from 'uniswap/src/features/gating/hooks' -import { getOverrideAdapter } from 'uniswap/src/features/gating/sdk/statsig' import { useEmbeddedWalletBaseUrl } from 'uniswap/src/features/passkey/hooks/useEmbeddedWalletBaseUrl' import { isExtensionApp, isMobileApp } from 'utilities/src/platform' import { useEvent } from 'utilities/src/react/hooks' diff --git a/packages/uniswap/src/components/gating/Rows.tsx b/packages/uniswap/src/components/gating/Rows.tsx index c5797d1a13e..fac0346bbaf 100644 --- a/packages/uniswap/src/components/gating/Rows.tsx +++ b/packages/uniswap/src/components/gating/Rows.tsx @@ -1,7 +1,6 @@ +import { Experiments, getOverrideAdapter, LayerProperties, Layers, useExperiment, useLayer } from '@universe/gating' import { useCallback } from 'react' import { Flex, Input, Switch, Text } from 'ui/src' -import { Experiments, LayerProperties, Layers } from 'uniswap/src/features/gating/experiments' -import { getOverrideAdapter, useExperiment, useLayer } from 'uniswap/src/features/gating/sdk/statsig' export function LayerRow({ value: layerName, diff --git a/packages/uniswap/src/components/gating/dynamicConfigOverrides.tsx b/packages/uniswap/src/components/gating/dynamicConfigOverrides.tsx index a7ac74e9b63..166f0afd754 100644 --- a/packages/uniswap/src/components/gating/dynamicConfigOverrides.tsx +++ b/packages/uniswap/src/components/gating/dynamicConfigOverrides.tsx @@ -1,6 +1,6 @@ +import { ForceUpgradeStatus, ForceUpgradeTranslations } from '@universe/gating' import { ComponentProps } from 'react' import { DynamicConfigDropdown } from 'uniswap/src/components/gating/DynamicConfigDropdown' -import { ForceUpgradeStatus, ForceUpgradeTranslations } from 'uniswap/src/features/gating/configs' type DynamicConfigOptions = ComponentProps['options'] diff --git a/packages/uniswap/src/components/lists/items/pools/PoolOptionItem.tsx b/packages/uniswap/src/components/lists/items/pools/PoolOptionItem.tsx index 48a9871d69c..998c2f3630f 100644 --- a/packages/uniswap/src/components/lists/items/pools/PoolOptionItem.tsx +++ b/packages/uniswap/src/components/lists/items/pools/PoolOptionItem.tsx @@ -1,4 +1,4 @@ -import { ProtocolVersion } from '@uniswap/client-pools/dist/pools/v1/types_pb' +import { ProtocolVersion } from '@uniswap/client-data-api/dist/data/v1/poolTypes_pb' import { memo } from 'react' import { Flex, Text } from 'ui/src' import { iconSizes } from 'ui/src/theme' diff --git a/packages/uniswap/src/components/lists/items/pools/PoolOptionItemContextMenu.tsx b/packages/uniswap/src/components/lists/items/pools/PoolOptionItemContextMenu.tsx index a6971c2edca..e2bd8a72534 100644 --- a/packages/uniswap/src/components/lists/items/pools/PoolOptionItemContextMenu.tsx +++ b/packages/uniswap/src/components/lists/items/pools/PoolOptionItemContextMenu.tsx @@ -1,4 +1,4 @@ -import { ProtocolVersion } from '@uniswap/client-pools/dist/pools/v1/types_pb' +import { ProtocolVersion } from '@uniswap/client-data-api/dist/data/v1/poolTypes_pb' import React, { ReactNode, useCallback, useMemo, useState } from 'react' import { useTranslation } from 'react-i18next' import { CheckCircleFilled } from 'ui/src/components/icons/CheckCircleFilled' diff --git a/packages/uniswap/src/components/lists/items/pools/usePoolSearchResultsToPoolOptions.tsx b/packages/uniswap/src/components/lists/items/pools/usePoolSearchResultsToPoolOptions.tsx index d1d48af9eb7..146cefe7f3d 100644 --- a/packages/uniswap/src/components/lists/items/pools/usePoolSearchResultsToPoolOptions.tsx +++ b/packages/uniswap/src/components/lists/items/pools/usePoolSearchResultsToPoolOptions.tsx @@ -1,4 +1,4 @@ -import { ProtocolVersion } from '@uniswap/client-pools/dist/pools/v1/types_pb' +import { ProtocolVersion } from '@uniswap/client-data-api/dist/data/v1/poolTypes_pb' import { useMemo } from 'react' import { OnchainItemListOptionType, PoolOption } from 'uniswap/src/components/lists/items/types' import { ZERO_ADDRESS } from 'uniswap/src/constants/misc' diff --git a/packages/uniswap/src/components/lists/items/pools/usePoolStatsToPoolOptions.tsx b/packages/uniswap/src/components/lists/items/pools/usePoolStatsToPoolOptions.tsx index fcdd6b49718..715546ef5be 100644 --- a/packages/uniswap/src/components/lists/items/pools/usePoolStatsToPoolOptions.tsx +++ b/packages/uniswap/src/components/lists/items/pools/usePoolStatsToPoolOptions.tsx @@ -1,5 +1,5 @@ +import { ProtocolVersion } from '@uniswap/client-data-api/dist/data/v1/poolTypes_pb' import { PoolStats } from '@uniswap/client-explore/dist/uniswap/explore/v1/service_pb' -import { ProtocolVersion } from '@uniswap/client-pools/dist/pools/v1/types_pb' import { parseRestProtocolVersion } from '@universe/api' import { useMemo } from 'react' import { OnchainItemListOptionType, PoolOption } from 'uniswap/src/components/lists/items/types' diff --git a/packages/uniswap/src/components/lists/items/types.ts b/packages/uniswap/src/components/lists/items/types.ts index 0944d974245..2ab0ff8035b 100644 --- a/packages/uniswap/src/components/lists/items/types.ts +++ b/packages/uniswap/src/components/lists/items/types.ts @@ -1,4 +1,4 @@ -import { ProtocolVersion } from '@uniswap/client-pools/dist/pools/v1/types_pb' +import { ProtocolVersion } from '@uniswap/client-data-api/dist/data/v1/poolTypes_pb' import { UniverseChainId } from 'uniswap/src/features/chains/types' import { CurrencyInfo } from 'uniswap/src/features/dataApi/types' diff --git a/packages/uniswap/src/components/nfts/NftView.tsx b/packages/uniswap/src/components/nfts/NftView.tsx index b9f9dffbae8..9c57a605347 100644 --- a/packages/uniswap/src/components/nfts/NftView.tsx +++ b/packages/uniswap/src/components/nfts/NftView.tsx @@ -10,9 +10,10 @@ export type NftViewProps = { onPress: () => void walletAddresses: Address[] openContextMenu?: () => void + hoverAnimation?: boolean } -export function NftView({ item, onPress, index, openContextMenu }: NftViewProps): JSX.Element { +export function NftView({ item, onPress, index, openContextMenu, hoverAnimation = true }: NftViewProps): JSX.Element { const nftView = ( skip?: boolean customEmptyState?: JSX.Element + autoColumns?: boolean + /** Web-only: when true, use a flex-wrap container instead of 2-col grid */ + wrapFlex?: boolean }, 'renderItem' | 'data' -> +> & { + loadingSkeletonCount?: number +} export function NftsList(_props: NftsListProps): JSX.Element { throw new PlatformSplitStubError('NftsList') diff --git a/packages/uniswap/src/components/nfts/NftsList.web.tsx b/packages/uniswap/src/components/nfts/NftsList.web.tsx index 5d957a39e0d..1e92a24062b 100644 --- a/packages/uniswap/src/components/nfts/NftsList.web.tsx +++ b/packages/uniswap/src/components/nfts/NftsList.web.tsx @@ -2,7 +2,7 @@ import { isNonPollingRequestInFlight } from '@universe/api' import { useCallback, useEffect, useMemo } from 'react' import { useTranslation } from 'react-i18next' import InfiniteScroll from 'react-infinite-scroll-component' -import { Flex, Loader, View } from 'ui/src' +import { Flex, Loader, styled, View } from 'ui/src' import { NoNfts } from 'ui/src/components/icons/NoNfts' import { BaseCard } from 'uniswap/src/components/BaseCard/BaseCard' import { ExpandoRow } from 'uniswap/src/components/ExpandoRow/ExpandoRow' @@ -17,24 +17,29 @@ import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send' import { TestID } from 'uniswap/src/test/fixtures/testIDs' import { isExtensionApp } from 'utilities/src/platform' -const AssetsContainer = ({ children, useGrid }: { children: React.ReactNode; useGrid: boolean }): JSX.Element => { - return ( - - {children} - - ) -} +const AssetsContainer = styled(View, { + width: '100%', + gap: '$spacing2', + variants: { + useGrid: { + true: { + '$platform-web': { + display: 'grid', + // default to 2 columns + gridTemplateColumns: 'minmax(0, 1fr) minmax(0, 1fr)', + gridGap: '12px', + }, + }, + }, + autoColumns: { + true: { + '$platform-web': { + gridTemplateColumns: 'repeat(auto-fill, minmax(200px, 1fr))', + }, + }, + }, + }, +}) const LOADING_ITEM = 'loading' @@ -48,6 +53,8 @@ export function NftsList({ renderNFTItem, skip, customEmptyState, + autoColumns = false, + loadingSkeletonCount = 6, }: NftsListProps): JSX.Element { const { t } = useTranslation() @@ -96,7 +103,7 @@ export function NftsList({ return null case HIDDEN_NFTS_ROW: return ( - + ( <> - - - - - - - - - - + {Array.from({ length: loadingSkeletonCount }, (_, i) => ( + + ))} ), - [], + [loadingSkeletonCount], ) const emptyState = useMemo( @@ -197,7 +197,9 @@ export function NftsList({ style={{ overflow: 'unset' }} scrollableTarget="wallet-dropdown-scroll-wrapper" > - 0}>{listContent} + 0} autoColumns={autoColumns}> + {listContent} + ) diff --git a/packages/uniswap/src/components/notifications/NotificationToast.native.tsx b/packages/uniswap/src/components/notifications/NotificationToast.native.tsx index b97222b2910..fd0a2c1a101 100644 --- a/packages/uniswap/src/components/notifications/NotificationToast.native.tsx +++ b/packages/uniswap/src/components/notifications/NotificationToast.native.tsx @@ -39,11 +39,11 @@ export function NotificationToast({ const onDismissLatest = useCallback(() => { bannerOffset.value = withSpring(HIDE_OFFSET_Y, SPRING_ANIMATION) - }, [bannerOffset]) + }, []) const onShowCurrentNotification = useCallback(() => { bannerOffset.value = withDelay(SPRING_ANIMATION_DELAY, withSpring(showOffset, SPRING_ANIMATION)) - }, [bannerOffset, showOffset]) + }, [showOffset]) const { onActionButtonPress, onNotificationPress, cancelDismiss, dismissLatest } = useNotificationLifecycle({ actionButtonOnPress: actionButton?.onPress, diff --git a/packages/uniswap/src/data/apiClients/tradingApi/TradingApiClient.ts b/packages/uniswap/src/data/apiClients/tradingApi/TradingApiClient.ts index 3a5211d76a3..433155b730f 100644 --- a/packages/uniswap/src/data/apiClients/tradingApi/TradingApiClient.ts +++ b/packages/uniswap/src/data/apiClients/tradingApi/TradingApiClient.ts @@ -1,10 +1,9 @@ import { createTradingApiClient, TradingApi } from '@universe/api' +import { FeatureFlags, getFeatureFlag } from '@universe/gating' import { config } from 'uniswap/src/config' import { tradingApiVersionPrefix, uniswapUrls } from 'uniswap/src/constants/urls' import { createUniswapFetchClient } from 'uniswap/src/data/apiClients/createUniswapFetchClient' import { filterChainIdsByPlatform } from 'uniswap/src/features/chains/utils' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { getFeatureFlag } from 'uniswap/src/features/gating/hooks' import { Platform } from 'uniswap/src/features/platforms/types/Platform' const TradingFetchClient = createUniswapFetchClient({ diff --git a/packages/uniswap/src/data/apiClients/uniswapApi/useGasFeeQuery.ts b/packages/uniswap/src/data/apiClients/uniswapApi/useGasFeeQuery.ts index a1bcecfc55c..b2ab75b8cf7 100644 --- a/packages/uniswap/src/data/apiClients/uniswapApi/useGasFeeQuery.ts +++ b/packages/uniswap/src/data/apiClients/uniswapApi/useGasFeeQuery.ts @@ -4,13 +4,13 @@ import { type UseQueryWithImmediateGarbageCollectionApiHelperHookArgs, useQueryWithImmediateGarbageCollection, } from '@universe/api' +import { useStatsigClientStatus } from '@universe/gating' import { uniswapUrls } from 'uniswap/src/constants/urls' import { createFetchGasFee, type GasFeeResultWithoutState, } from 'uniswap/src/data/apiClients/uniswapApi/UniswapApiClient' import { getActiveGasStrategy } from 'uniswap/src/features/gas/utils' -import { useStatsigClientStatus } from 'uniswap/src/features/gating/hooks' import { ReactQueryCacheKey } from 'utilities/src/reactQuery/cache' export function useGasFeeQuery({ diff --git a/packages/uniswap/src/data/rest/conversionTracking/useConversionProxy.ts b/packages/uniswap/src/data/rest/conversionTracking/useConversionProxy.ts index 87391cd4998..af8c28f62ae 100644 --- a/packages/uniswap/src/data/rest/conversionTracking/useConversionProxy.ts +++ b/packages/uniswap/src/data/rest/conversionTracking/useConversionProxy.ts @@ -3,9 +3,8 @@ import { type ConnectError, type Transport } from '@connectrpc/connect' import { useMutation } from '@connectrpc/connect-query' import { type UseMutationResult } from '@tanstack/react-query' import { ConversionTrackingApi, createConnectTransportWithDefaults } from '@universe/api' +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import { getConversionProxyApiBaseUrl } from 'uniswap/src/data/rest/conversionTracking/utils' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' const createConversionProxyTransport = (isConversionApiMigrationEnabled: boolean): Transport => createConnectTransportWithDefaults({ diff --git a/packages/uniswap/src/data/rest/conversionTracking/useConversionTracking.ts b/packages/uniswap/src/data/rest/conversionTracking/useConversionTracking.ts index b64191593ff..c9307f17d9a 100644 --- a/packages/uniswap/src/data/rest/conversionTracking/useConversionTracking.ts +++ b/packages/uniswap/src/data/rest/conversionTracking/useConversionTracking.ts @@ -1,4 +1,5 @@ import { ConnectError } from '@connectrpc/connect' +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import { useAtom } from 'jotai' import { atomWithStorage } from 'jotai/utils' import { parse } from 'qs' @@ -12,8 +13,6 @@ import { buildProxyRequest } from 'uniswap/src/data/rest/conversionTracking/trac import { ConversionLead, PlatformIdType, TrackConversionArgs } from 'uniswap/src/data/rest/conversionTracking/types' import { useConversionProxy } from 'uniswap/src/data/rest/conversionTracking/useConversionProxy' import { getExternalConversionLeadsCookie } from 'uniswap/src/data/rest/conversionTracking/utils' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' import { UniswapEventName } from 'uniswap/src/features/telemetry/constants' import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send' import { HexString } from 'utilities/src/addresses/hex' diff --git a/packages/uniswap/src/data/rest/getPair.ts b/packages/uniswap/src/data/rest/getPair.ts deleted file mode 100644 index b108414c5d7..00000000000 --- a/packages/uniswap/src/data/rest/getPair.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { PartialMessage } from '@bufbuild/protobuf' -import { ConnectError } from '@connectrpc/connect' -import { useQuery } from '@connectrpc/connect-query' -import { UseQueryResult } from '@tanstack/react-query' -import { GetPairRequest, GetPairResponse } from '@uniswap/client-pools/dist/pools/v1/api_pb' -import { getPair } from '@uniswap/client-pools/dist/pools/v1/api-PoolsService_connectquery' -import { uniswapGetTransport } from 'uniswap/src/data/rest/base' - -/** - * eslint-disable import/no-unused-modules -- this endpoint is returning stale data sometimes meaning - * that the data we get (i.e. the dependent amount) is incorrect and the transaction does not complete on chain. - * Use this endpoint again once the data is more up to date or the trading API handles the data discrepancy. - */ -export function useGetPair( - input?: PartialMessage, - enabled = true, -): UseQueryResult { - return useQuery(getPair, input, { transport: uniswapGetTransport, enabled, retry: false }) -} diff --git a/packages/uniswap/src/data/rest/getPools.ts b/packages/uniswap/src/data/rest/getPools.ts index 106bca1c926..1dcc0a98ead 100644 --- a/packages/uniswap/src/data/rest/getPools.ts +++ b/packages/uniswap/src/data/rest/getPools.ts @@ -2,8 +2,8 @@ import { PartialMessage } from '@bufbuild/protobuf' import { ConnectError } from '@connectrpc/connect' import { useQuery } from '@connectrpc/connect-query' import { UseQueryResult } from '@tanstack/react-query' -import { ListPoolsRequest, ListPoolsResponse } from '@uniswap/client-pools/dist/pools/v1/api_pb' -import { listPools } from '@uniswap/client-pools/dist/pools/v1/api-PoolsService_connectquery' +import { ListPoolsRequest, ListPoolsResponse } from '@uniswap/client-data-api/dist/data/v1/api_pb' +import { listPools } from '@uniswap/client-data-api/dist/data/v1/api-DataApiService_connectquery' import { uniswapGetTransport } from 'uniswap/src/data/rest/base' export function useGetPoolsByTokens( diff --git a/packages/uniswap/src/data/rest/getPoolsRewards.ts b/packages/uniswap/src/data/rest/getPoolsRewards.ts index 58a5abfed60..8d681b88749 100644 --- a/packages/uniswap/src/data/rest/getPoolsRewards.ts +++ b/packages/uniswap/src/data/rest/getPoolsRewards.ts @@ -2,8 +2,8 @@ import { PartialMessage } from '@bufbuild/protobuf' import { ConnectError } from '@connectrpc/connect' import { useQuery } from '@connectrpc/connect-query' import { UseQueryResult } from '@tanstack/react-query' -import { GetRewardsRequest, GetRewardsResponse } from '@uniswap/client-pools/dist/pools/v1/api_pb' -import { getRewards } from '@uniswap/client-pools/dist/pools/v1/api-PoolsService_connectquery' +import { GetRewardsRequest, GetRewardsResponse } from '@uniswap/client-data-api/dist/data/v1/api_pb' +import { getRewards } from '@uniswap/client-data-api/dist/data/v1/api-DataApiService_connectquery' import { uniswapGetTransport } from 'uniswap/src/data/rest/base' export function useGetPoolsRewards( diff --git a/packages/uniswap/src/data/rest/getPortfolio.ts b/packages/uniswap/src/data/rest/getPortfolio.ts index 5db0dd4021d..3b3db8f6bb3 100644 --- a/packages/uniswap/src/data/rest/getPortfolio.ts +++ b/packages/uniswap/src/data/rest/getPortfolio.ts @@ -15,7 +15,6 @@ import { cleanupCaughtUpOverrides, getOverridesForAddress, getOverridesForQuery, - getPortfolioQueryApolloClient, getPortfolioQueryReduxStore, } from 'uniswap/src/data/rest/portfolioBalanceOverrides' import { useEnabledChains } from 'uniswap/src/features/chains/hooks/useEnabledChains' @@ -107,9 +106,8 @@ export const getPortfolioQuery = ({ try { const reduxStore = getPortfolioQueryReduxStore() - const apolloClient = getPortfolioQueryApolloClient() - if (!reduxStore || !apolloClient) { + if (!reduxStore) { log.warn('`getPortfolioQuery` called before `initializePortfolioQueryOverrides`') return apiResponse } @@ -150,7 +148,6 @@ export const getPortfolioQuery = ({ }) const mergedResult = await fetchAndMergeOnchainBalances({ - apolloClient, cachedPortfolio: modifiedResponse.portfolio, accountAddress: address, currencyIds: overridesForCurrentAddress, diff --git a/packages/uniswap/src/data/rest/getPosition.ts b/packages/uniswap/src/data/rest/getPosition.ts index 857c7d5a83c..22218d7f21a 100644 --- a/packages/uniswap/src/data/rest/getPosition.ts +++ b/packages/uniswap/src/data/rest/getPosition.ts @@ -2,8 +2,8 @@ import { PartialMessage } from '@bufbuild/protobuf' import { ConnectError } from '@connectrpc/connect' import { useQuery } from '@connectrpc/connect-query' import { UseQueryResult } from '@tanstack/react-query' -import { GetPositionRequest, GetPositionResponse } from '@uniswap/client-pools/dist/pools/v1/api_pb' -import { getPosition } from '@uniswap/client-pools/dist/pools/v1/api-PoolsService_connectquery' +import { GetPositionRequest, GetPositionResponse } from '@uniswap/client-data-api/dist/data/v1/api_pb' +import { getPosition } from '@uniswap/client-data-api/dist/data/v1/api-DataApiService_connectquery' import { uniswapPostTransport } from 'uniswap/src/data/rest/base' export function useGetPositionQuery( diff --git a/packages/uniswap/src/data/rest/getPositions.ts b/packages/uniswap/src/data/rest/getPositions.ts index 0a5431262e6..400b3115f92 100644 --- a/packages/uniswap/src/data/rest/getPositions.ts +++ b/packages/uniswap/src/data/rest/getPositions.ts @@ -12,9 +12,9 @@ import { GetPositionResponse, ListPositionsRequest, ListPositionsResponse, -} from '@uniswap/client-pools/dist/pools/v1/api_pb' -import { getPosition, listPositions } from '@uniswap/client-pools/dist/pools/v1/api-PoolsService_connectquery' -import { ProtocolVersion } from '@uniswap/client-pools/dist/pools/v1/types_pb' +} from '@uniswap/client-data-api/dist/data/v1/api_pb' +import { getPosition, listPositions } from '@uniswap/client-data-api/dist/data/v1/api-DataApiService_connectquery' +import { ProtocolVersion } from '@uniswap/client-data-api/dist/data/v1/poolTypes_pb' import { Pair } from '@uniswap/v2-sdk' import { useMemo } from 'react' import { uniswapPostTransport } from 'uniswap/src/data/rest/base' diff --git a/packages/uniswap/src/data/rest/portfolioBalanceOverrides.ts b/packages/uniswap/src/data/rest/portfolioBalanceOverrides.ts index 695e5229893..24badbde9bc 100644 --- a/packages/uniswap/src/data/rest/portfolioBalanceOverrides.ts +++ b/packages/uniswap/src/data/rest/portfolioBalanceOverrides.ts @@ -1,4 +1,3 @@ -import { ApolloClient, NormalizedCacheObject } from '@apollo/client' import { ToolkitStore } from '@reduxjs/toolkit/dist/configureStore' import { GetPortfolioResponse } from '@uniswap/client-data-api/dist/data/v1/api_pb' import { getNativeAddress } from 'uniswap/src/constants/addresses' @@ -16,30 +15,22 @@ const FILE_NAME = 'portfolioBalanceOverrides.ts' // so instead of checking for exact equality, we check if the quantities are "aproximately" equal. const APPROXIMATE_EQUALITY_THRESHOLD_PERCENT = 0.02 // 2% -// Module-level references to Redux store and Apollo client +// Module-level references to Redux store // These are initialized once during app startup let portfolioQueryReduxStore: ToolkitStore | null = null -let portfolioQueryApolloClient: ApolloClient | null = null /** * Initializes the portfolio balance override mechanism. - * This must be called once during each app initialization after both the Redux store and Apollo client are created. + * This must be called once during each app initialization after the Redux store is created. */ -export function initializePortfolioQueryOverrides({ - store, - apolloClient, -}: { - store: ToolkitStore - apolloClient: ApolloClient -}): void { +export function initializePortfolioQueryOverrides({ store }: { store: ToolkitStore }): void { const log = createLogger(FILE_NAME, 'initializePortfolioQueryOverrides', '[REST-ITBU]') - if (portfolioQueryReduxStore || portfolioQueryApolloClient) { + if (portfolioQueryReduxStore) { log.warn('`initializePortfolioQueryOverrides` called multiple times') } portfolioQueryReduxStore = store - portfolioQueryApolloClient = apolloClient log.debug('Portfolio query overrides successfully initialized') } @@ -48,10 +39,6 @@ export function getPortfolioQueryReduxStore(): ToolkitStore | null { return portfolioQueryReduxStore } -export function getPortfolioQueryApolloClient(): ApolloClient | null { - return portfolioQueryApolloClient -} - const selectTokenBalanceOverridesForWalletAddress = makeSelectTokenBalanceOverridesForWalletAddress() /** diff --git a/packages/uniswap/src/data/rest/searchTokensAndPools.ts b/packages/uniswap/src/data/rest/searchTokensAndPools.ts index 47fcae4534a..0657cb1681c 100644 --- a/packages/uniswap/src/data/rest/searchTokensAndPools.ts +++ b/packages/uniswap/src/data/rest/searchTokensAndPools.ts @@ -1,22 +1,29 @@ import { PartialMessage } from '@bufbuild/protobuf' import { ConnectError } from '@connectrpc/connect' -import { useQuery } from '@connectrpc/connect-query' +import { createQueryOptions, useQuery } from '@connectrpc/connect-query' import { UseQueryResult } from '@tanstack/react-query' import { Pool, type Token as SearchToken, SearchTokensRequest, SearchTokensResponse, + SearchType, } from '@uniswap/client-search/dist/search/v1/api_pb' import { searchTokens } from '@uniswap/client-search/dist/search/v1/api-searchService_connectquery' -import { parseProtectionInfo, parseRestProtocolVersion, parseSafetyLevel } from '@universe/api' +import { parseProtectionInfo, parseRestProtocolVersion, parseSafetyLevel, SharedQueryClient } from '@universe/api' import { getNativeAddress } from 'uniswap/src/constants/addresses' import { uniswapPostTransport } from 'uniswap/src/data/rest/base' +import { createLogger } from 'utilities/src/logger/logger' + +const FILE_NAME = 'searchTokensAndPools.ts' + +import { UniverseChainId } from 'uniswap/src/features/chains/types' import { CurrencyInfo } from 'uniswap/src/features/dataApi/types' import { buildCurrency, buildCurrencyInfo } from 'uniswap/src/features/dataApi/utils/buildCurrency' import { getCurrencySafetyInfo } from 'uniswap/src/features/dataApi/utils/getCurrencySafetyInfo' import { PoolSearchHistoryResult, SearchHistoryResultType } from 'uniswap/src/features/search/SearchHistoryResult' import { buildCurrencyId, currencyId, isNativeCurrencyAddress } from 'uniswap/src/utils/currencyId' +import { ONE_DAY_MS, ONE_HOUR_MS } from 'utilities/src/time/time' /** * Wrapper around Tanstack useQuery for the Uniswap REST BE service SearchTokens @@ -40,6 +47,56 @@ export function useSearchTokensAndPoolsQuery({ }) } +/** + * Fetch a single token by address outside of React components + * @param chainId - The chain ID to search on + * @param address - The token address to look up + * @returns Token data or null if not found + */ +export async function fetchTokenByAddress({ + chainId, + address, +}: { + chainId: UniverseChainId + address: string +}): Promise { + const log = createLogger(FILE_NAME, 'fetchTokenByAddress') + + try { + const result = await SharedQueryClient.fetchQuery({ + ...createQueryOptions( + searchTokens, + { + searchQuery: address, + chainIds: [chainId], + searchType: SearchType.TOKEN, + size: 1, + page: 1, + }, + { transport: uniswapPostTransport }, + ), + // Token data does not change often, so we can use stale data here. + // This data will be refreshed when fetching the portfolio balances anyway. + staleTime: ONE_HOUR_MS, + gcTime: ONE_DAY_MS, + }) + + const token = result.tokens[0] ?? null + + if (!token) { + log.debug('Token not found in search results', { chainId, address }) + } + + return token + } catch (error) { + log.error(error, { + chainId, + address, + }) + return null + } +} + export function searchTokenToCurrencyInfo(token: SearchToken): CurrencyInfo | null { const { chainId, address, symbol, name, decimals, logoUrl, feeData } = token const safetyLevel = parseSafetyLevel(token.safetyLevel) diff --git a/packages/uniswap/src/features/activity/formatTransactionsByDate.ts b/packages/uniswap/src/features/activity/formatTransactionsByDate.ts index 8283078091f..dff387c77ba 100644 --- a/packages/uniswap/src/features/activity/formatTransactionsByDate.ts +++ b/packages/uniswap/src/features/activity/formatTransactionsByDate.ts @@ -62,15 +62,30 @@ export function formatTransactionsByDate( // For all transactions before yesterday, group by month const priorByMonthTransactionList = olderThan24HTransactionList.reduce( (accum: Record, item) => { + // Skip transactions with invalid timestamps + if (!item.addedTime || item.addedTime <= 0) { + return accum + } + const isPreviousYear = item.addedTime < msTimestampCutoffYear - const key = localizedDayjs(item.addedTime) + const dayjsDate = localizedDayjs(item.addedTime) + const maybeKeyFromDayjsDate = dayjsDate // If in a previous year, append year to key string, else just use month // This key is used as the section title in TransactionList .format(isPreviousYear ? FORMAT_DATE_MONTH_YEAR : FORMAT_DATE_MONTH) .toString() - const currentMonthList = accum[key] ?? [] + + // Fallback to English if localized formatting fails + const validatedKey = dayjsDate.isValid() + ? maybeKeyFromDayjsDate + : dayjs(item.addedTime) + .locale('en') + .format(isPreviousYear ? FORMAT_DATE_MONTH_YEAR : FORMAT_DATE_MONTH) + + const currentMonthList = accum[validatedKey] ?? [] currentMonthList.push(item) - accum[key] = currentMonthList + accum[validatedKey] = currentMonthList + return accum }, {}, diff --git a/packages/uniswap/src/features/behaviorHistory/slice.ts b/packages/uniswap/src/features/behaviorHistory/slice.ts index 72c644fe19f..76c0e39b55b 100644 --- a/packages/uniswap/src/features/behaviorHistory/slice.ts +++ b/packages/uniswap/src/features/behaviorHistory/slice.ts @@ -9,6 +9,7 @@ export interface UniswapBehaviorHistoryState { hasDismissedBridgingWarning?: boolean hasDismissedLowNetworkTokenWarning?: boolean hasViewedContractAddressExplainer?: boolean + hasDismissedBridgedAssetsBannerV2?: boolean unichainPromotion?: { coldBannerDismissed?: boolean warmBannerDismissed?: boolean @@ -33,6 +34,7 @@ export const initialUniswapBehaviorHistoryState: UniswapBehaviorHistoryState = { hasDismissedBridgingWarning: false, hasDismissedLowNetworkTokenWarning: false, hasViewedContractAddressExplainer: false, + hasDismissedBridgedAssetsBannerV2: false, unichainPromotion: { coldBannerDismissed: false, warmBannerDismissed: false, @@ -108,6 +110,9 @@ const slice = createSlice({ setHasSeenToucanIntroModal: (state, action: PayloadAction) => { state.hasSeenToucanIntroModal = action.payload }, + setHasDismissedBridgedAssetsBannerV2: (state, action: PayloadAction) => { + state.hasDismissedBridgedAssetsBannerV2 = action.payload + }, }, }) @@ -128,6 +133,7 @@ export const { setEmbeddedWalletGraduateCardDismissed, setHasShownSmartWalletNudge, setHasSeenToucanIntroModal, + setHasDismissedBridgedAssetsBannerV2, } = slice.actions export const uniswapBehaviorHistoryReducer = slice.reducer diff --git a/packages/uniswap/src/features/chains/evm/info/avalanche.ts b/packages/uniswap/src/features/chains/evm/info/avalanche.ts index e7b8d376100..b439bc592c3 100644 --- a/packages/uniswap/src/features/chains/evm/info/avalanche.ts +++ b/packages/uniswap/src/features/chains/evm/info/avalanche.ts @@ -1,5 +1,6 @@ import { Token } from '@uniswap/sdk-core' import { GraphQLApi } from '@universe/api' +import { SwapConfigKey } from '@universe/gating' import { AVALANCHE_LOGO } from 'ui/src/assets' import { config } from 'uniswap/src/config' import { DEFAULT_NATIVE_ADDRESS_LEGACY, getQuicknodeEndpointUrl } from 'uniswap/src/features/chains/evm/rpc' @@ -11,7 +12,6 @@ import { UniverseChainId, UniverseChainInfo, } from 'uniswap/src/features/chains/types' -import { SwapConfigKey } from 'uniswap/src/features/gating/configs' import { Platform } from 'uniswap/src/features/platforms/types/Platform' import { ElementName } from 'uniswap/src/features/telemetry/constants' import { buildUSDC, buildUSDT } from 'uniswap/src/features/tokens/stablecoin' diff --git a/packages/uniswap/src/features/chains/evm/info/celo.ts b/packages/uniswap/src/features/chains/evm/info/celo.ts index c58fe928cae..d1fc7111b55 100644 --- a/packages/uniswap/src/features/chains/evm/info/celo.ts +++ b/packages/uniswap/src/features/chains/evm/info/celo.ts @@ -1,4 +1,5 @@ import { GraphQLApi } from '@universe/api' +import { SwapConfigKey } from '@universe/gating' import { CELO_LOGO } from 'ui/src/assets' import { config } from 'uniswap/src/config' import { getQuicknodeEndpointUrl } from 'uniswap/src/features/chains/evm/rpc' @@ -10,7 +11,6 @@ import { UniverseChainId, UniverseChainInfo, } from 'uniswap/src/features/chains/types' -import { SwapConfigKey } from 'uniswap/src/features/gating/configs' import { Platform } from 'uniswap/src/features/platforms/types/Platform' import { ElementName } from 'uniswap/src/features/telemetry/constants' import { buildUSDC } from 'uniswap/src/features/tokens/stablecoin' diff --git a/packages/uniswap/src/features/chains/evm/info/mainnet.ts b/packages/uniswap/src/features/chains/evm/info/mainnet.ts index 0283a360cec..374332ae025 100644 --- a/packages/uniswap/src/features/chains/evm/info/mainnet.ts +++ b/packages/uniswap/src/features/chains/evm/info/mainnet.ts @@ -1,5 +1,6 @@ import { CurrencyAmount } from '@uniswap/sdk-core' import { GraphQLApi } from '@universe/api' +import { SwapConfigKey } from '@universe/gating' import { ETH_LOGO, ETHEREUM_LOGO } from 'ui/src/assets' import { config } from 'uniswap/src/config' import { @@ -16,7 +17,6 @@ import { UniverseChainId, UniverseChainInfo, } from 'uniswap/src/features/chains/types' -import { SwapConfigKey } from 'uniswap/src/features/gating/configs' import { Platform } from 'uniswap/src/features/platforms/types/Platform' import { ElementName } from 'uniswap/src/features/telemetry/constants' import { buildDAI, buildUSDC, buildUSDT } from 'uniswap/src/features/tokens/stablecoin' diff --git a/packages/uniswap/src/features/chains/evm/info/monad.ts b/packages/uniswap/src/features/chains/evm/info/monad.ts index 7ea38b26778..740d57a0d05 100644 --- a/packages/uniswap/src/features/chains/evm/info/monad.ts +++ b/packages/uniswap/src/features/chains/evm/info/monad.ts @@ -1,4 +1,5 @@ import { GraphQLApi } from '@universe/api' +import { SwapConfigKey } from '@universe/gating' import { MONAD_LOGO } from 'ui/src/assets' import { DEFAULT_NATIVE_ADDRESS_LEGACY, getQuicknodeEndpointUrl } from 'uniswap/src/features/chains/evm/rpc' import { buildChainTokens } from 'uniswap/src/features/chains/evm/tokens' @@ -9,7 +10,6 @@ import { UniverseChainId, UniverseChainInfo, } from 'uniswap/src/features/chains/types' -import { SwapConfigKey } from 'uniswap/src/features/gating/configs' import { Platform } from 'uniswap/src/features/platforms/types/Platform' import { ElementName } from 'uniswap/src/features/telemetry/constants' import { buildUSDT } from 'uniswap/src/features/tokens/stablecoin' diff --git a/packages/uniswap/src/features/chains/evm/info/polygon.ts b/packages/uniswap/src/features/chains/evm/info/polygon.ts index 2624aded152..e13b25e96d9 100644 --- a/packages/uniswap/src/features/chains/evm/info/polygon.ts +++ b/packages/uniswap/src/features/chains/evm/info/polygon.ts @@ -1,4 +1,5 @@ import { GraphQLApi } from '@universe/api' +import { SwapConfigKey } from '@universe/gating' import { POLYGON_LOGO } from 'ui/src/assets' import { config } from 'uniswap/src/config' import { getQuicknodeEndpointUrl } from 'uniswap/src/features/chains/evm/rpc' @@ -10,7 +11,6 @@ import { UniverseChainId, UniverseChainInfo, } from 'uniswap/src/features/chains/types' -import { SwapConfigKey } from 'uniswap/src/features/gating/configs' import { Platform } from 'uniswap/src/features/platforms/types/Platform' import { ElementName } from 'uniswap/src/features/telemetry/constants' import { buildDAI, buildUSDC, buildUSDT } from 'uniswap/src/features/tokens/stablecoin' diff --git a/packages/uniswap/src/features/chains/gasDefaults.ts b/packages/uniswap/src/features/chains/gasDefaults.ts index 3ef71913717..7e5e8f0c8dd 100644 --- a/packages/uniswap/src/features/chains/gasDefaults.ts +++ b/packages/uniswap/src/features/chains/gasDefaults.ts @@ -1,4 +1,4 @@ -import { SwapConfigKey } from 'uniswap/src/features/gating/configs' +import { SwapConfigKey } from '@universe/gating' /** * Shared gas configuration constants. diff --git a/packages/uniswap/src/features/chains/hooks/useFeatureFlaggedChainIds.ts b/packages/uniswap/src/features/chains/hooks/useFeatureFlaggedChainIds.ts index 969e7995190..36dbf2723ea 100644 --- a/packages/uniswap/src/features/chains/hooks/useFeatureFlaggedChainIds.ts +++ b/packages/uniswap/src/features/chains/hooks/useFeatureFlaggedChainIds.ts @@ -1,8 +1,7 @@ +import { FeatureFlags, getFeatureFlag, useFeatureFlag } from '@universe/gating' import { useMemo } from 'react' import { UniverseChainId } from 'uniswap/src/features/chains/types' import { filterChainIdsByFeatureFlag } from 'uniswap/src/features/chains/utils' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { getFeatureFlag, useFeatureFlag } from 'uniswap/src/features/gating/hooks' export const getFeatureFlaggedChainIds = createGetFeatureFlaggedChainIds({ getSoneiumStatus: () => getFeatureFlag(FeatureFlags.Soneium), diff --git a/packages/uniswap/src/features/chains/hooks/useNewChainIds.ts b/packages/uniswap/src/features/chains/hooks/useNewChainIds.ts index 8a9bd27b642..831f54704fc 100644 --- a/packages/uniswap/src/features/chains/hooks/useNewChainIds.ts +++ b/packages/uniswap/src/features/chains/hooks/useNewChainIds.ts @@ -1,8 +1,7 @@ +import { ChainsConfigKey, DynamicConfigs, useDynamicConfigValue } from '@universe/gating' import { useMemo } from 'react' import { UniverseChainId } from 'uniswap/src/features/chains/types' import { isUniverseChainId } from 'uniswap/src/features/chains/utils' -import { ChainsConfigKey, DynamicConfigs } from 'uniswap/src/features/gating/configs' -import { useDynamicConfigValue } from 'uniswap/src/features/gating/hooks' import { isUniverseChainIdArrayType } from 'uniswap/src/features/gating/typeGuards' export function useNewChainIds(): UniverseChainId[] { diff --git a/packages/uniswap/src/features/chains/hooks/useOrderedChainIds.ts b/packages/uniswap/src/features/chains/hooks/useOrderedChainIds.ts index b74ac7d3e58..da0cbd451dd 100644 --- a/packages/uniswap/src/features/chains/hooks/useOrderedChainIds.ts +++ b/packages/uniswap/src/features/chains/hooks/useOrderedChainIds.ts @@ -1,8 +1,7 @@ +import { ChainsConfigKey, DynamicConfigs, useDynamicConfigValue } from '@universe/gating' import { useMemo } from 'react' import { ALL_CHAIN_IDS } from 'uniswap/src/features/chains/chainInfo' import { UniverseChainId } from 'uniswap/src/features/chains/types' -import { ChainsConfigKey, DynamicConfigs } from 'uniswap/src/features/gating/configs' -import { useDynamicConfigValue } from 'uniswap/src/features/gating/hooks' // Returns the given chains ordered based on the statsig config export function useOrderedChainIds(chainIds: UniverseChainId[]): UniverseChainId[] { diff --git a/packages/uniswap/src/features/chains/types.ts b/packages/uniswap/src/features/chains/types.ts index b302bfeafdb..4e680d421e8 100644 --- a/packages/uniswap/src/features/chains/types.ts +++ b/packages/uniswap/src/features/chains/types.ts @@ -1,10 +1,10 @@ // biome-ignore lint/style/noRestrictedImports: legacy import will be migrated import { CurrencyAmount, Token, ChainId as UniswapSDKChainId } from '@uniswap/sdk-core' import type { GraphQLApi } from '@universe/api' +import { SwapConfigKey } from '@universe/gating' import type { ImageSourcePropType } from 'react-native' // biome-ignore lint/style/noRestrictedImports: legacy import will be migrated import { type UNIVERSE_CHAIN_INFO } from 'uniswap/src/features/chains/chainInfo' -import { SwapConfigKey } from 'uniswap/src/features/gating/configs' import { Platform } from 'uniswap/src/features/platforms/types/Platform' import { ElementName } from 'uniswap/src/features/telemetry/constants' import { NonEmptyArray } from 'utilities/src/primitives/array' diff --git a/packages/uniswap/src/features/dataApi/balances/balances.ts b/packages/uniswap/src/features/dataApi/balances/balances.ts index 7fe5058c6ed..fa121a145af 100644 --- a/packages/uniswap/src/features/dataApi/balances/balances.ts +++ b/packages/uniswap/src/features/dataApi/balances/balances.ts @@ -38,10 +38,12 @@ export type PortfolioCacheUpdater = (hidden: boolean, portfolioBalance?: Portfol export function usePortfolioBalances({ evmAddress, svmAddress, + chainIds, ...queryOptions }: { evmAddress?: Address svmAddress?: Address + chainIds?: UniverseChainId[] } & QueryHookOptions< GraphQLApi.PortfolioBalancesQuery, GraphQLApi.PortfolioBalancesQueryVariables @@ -49,6 +51,7 @@ export function usePortfolioBalances({ return usePortfolioData({ evmAddress: evmAddress || '', svmAddress: svmAddress || '', + chainIds, ...queryOptions, skip: !(evmAddress ?? svmAddress) || queryOptions.skip, }) @@ -270,6 +273,8 @@ export function useTokenBalancesGroupedByVisibility({ }, [balancesById, currencyIdToTokenVisibility, isTestnetModeEnabled]) } +type SortedPortfolioBalancesResult = GqlResult & { networkStatus: NetworkStatus } + /** * Returns portfolio balances for a given address sorted by USD value. * @@ -284,12 +289,14 @@ export function useSortedPortfolioBalances({ svmAddress, pollInterval, onCompleted, + chainIds, }: { evmAddress?: Address svmAddress?: Address pollInterval?: PollingInterval onCompleted?: () => void -}): GqlResult & { networkStatus: NetworkStatus } { + chainIds?: UniverseChainId[] +}): SortedPortfolioBalancesResult { const { isTestnetModeEnabled } = useEnabledChains() // Fetch all balances including small balances and spam tokens because we want to return those in separate arrays @@ -304,19 +311,23 @@ export function useSortedPortfolioBalances({ pollInterval, onCompleted, fetchPolicy: 'cache-and-network', + chainIds, }) const { shownTokens, hiddenTokens } = useTokenBalancesGroupedByVisibility({ balancesById }) - return { - data: { - balances: sortPortfolioBalances({ balances: shownTokens || [], isTestnetModeEnabled }), - hiddenBalances: sortPortfolioBalances({ balances: hiddenTokens || [], isTestnetModeEnabled }), - }, - loading, - networkStatus, - refetch, - } + return useMemo( + () => ({ + data: { + balances: sortPortfolioBalances({ balances: shownTokens || [], isTestnetModeEnabled }), + hiddenBalances: sortPortfolioBalances({ balances: hiddenTokens || [], isTestnetModeEnabled }), + }, + loading, + networkStatus, + refetch, + }), + [shownTokens, hiddenTokens, isTestnetModeEnabled, loading, networkStatus, refetch], + ) } /** diff --git a/packages/uniswap/src/features/dataApi/balances/balancesRest.ts b/packages/uniswap/src/features/dataApi/balances/balancesRest.ts index 64f1f59fb9e..b288659bb99 100644 --- a/packages/uniswap/src/features/dataApi/balances/balancesRest.ts +++ b/packages/uniswap/src/features/dataApi/balances/balancesRest.ts @@ -48,7 +48,8 @@ export function usePortfolioData({ pollInterval?: PollingInterval fetchPolicy?: WatchQueryFetchPolicy } & GetPortfolioInput['input']): PortfolioDataResult { - const { chains: chainIds } = useEnabledChains() + const { chains: defaultChainIds } = useEnabledChains() + const chainIds = queryOptions.chainIds || defaultChainIds // TODO(SWAP-388): GetPortfolio REST endpoint does not yet support modifier array; it will take 1 evm/svm address, but will apply the modifications across the board const modifier = useRestPortfolioValueModifier(evmAddress ?? svmAddress) diff --git a/packages/uniswap/src/features/dataApi/tokenProjects/tokenProjects.test.tsx b/packages/uniswap/src/features/dataApi/tokenProjects/tokenProjects.test.tsx index 7bb8281ae25..d588ebf377b 100644 --- a/packages/uniswap/src/features/dataApi/tokenProjects/tokenProjects.test.tsx +++ b/packages/uniswap/src/features/dataApi/tokenProjects/tokenProjects.test.tsx @@ -28,9 +28,17 @@ describe(useTokenProjects, () => { resolvers, }) - await waitFor(async () => { - const data = result.current.data - expect(data).toEqual(tokenProjectToCurrencyInfos(await resolved.tokenProjects)) + const expected = tokenProjectToCurrencyInfos(await resolved.tokenProjects) + // GraphQL converts undefined to null, so we need to do the same for comparison + const expectedWithNull = expected.map((item) => ({ + ...item, + isBridged: item.isBridged ?? null, + bridgedWithdrawalInfo: item.bridgedWithdrawalInfo ?? null, + })) + + await waitFor(() => { + expect(result.current.loading).toEqual(false) + expect(result.current.data).toEqual(expectedWithNull) }) }) }) diff --git a/packages/uniswap/src/features/dataApi/tokenProjects/utils/tokenProjectToCurrencyInfos.test.ts b/packages/uniswap/src/features/dataApi/tokenProjects/utils/tokenProjectToCurrencyInfos.test.ts index 996eaa13b22..1ac2dc67a12 100644 --- a/packages/uniswap/src/features/dataApi/tokenProjects/utils/tokenProjectToCurrencyInfos.test.ts +++ b/packages/uniswap/src/features/dataApi/tokenProjects/utils/tokenProjectToCurrencyInfos.test.ts @@ -20,6 +20,8 @@ describe(tokenProjectToCurrencyInfos, () => { symbol: token.symbol, name: token.name ?? project.name, }), + isBridged: token.isBridged, + bridgedWithdrawalInfo: token.bridgedWithdrawalInfo, }) as CurrencyInfo it('converts tokenProject to CurrencyInfo', () => { diff --git a/packages/uniswap/src/features/dataApi/tokenProjects/utils/tokenProjectToCurrencyInfos.ts b/packages/uniswap/src/features/dataApi/tokenProjects/utils/tokenProjectToCurrencyInfos.ts index c84763a73e0..01c78c2e2e4 100644 --- a/packages/uniswap/src/features/dataApi/tokenProjects/utils/tokenProjectToCurrencyInfos.ts +++ b/packages/uniswap/src/features/dataApi/tokenProjects/utils/tokenProjectToCurrencyInfos.ts @@ -14,7 +14,8 @@ export function tokenProjectToCurrencyInfos( ?.flatMap((project) => project?.tokens.map((token) => { const { logoUrl, safetyLevel } = project - const { name, chain, address, decimals, symbol, feeData, protectionInfo } = token + const { name, chain, address, decimals, symbol, feeData, protectionInfo, isBridged, bridgedWithdrawalInfo } = + token const chainId = fromGraphQLChain(chain) if (chainFilter && chainFilter !== chainId) { @@ -40,6 +41,8 @@ export function tokenProjectToCurrencyInfos( currencyId: currencyId(currency), logoUrl, safetyInfo: getCurrencySafetyInfo(safetyLevel, protectionInfo), + isBridged, + bridgedWithdrawalInfo, }) return currencyInfo diff --git a/packages/uniswap/src/features/dataApi/types.ts b/packages/uniswap/src/features/dataApi/types.ts index 00138794455..acb786fb064 100644 --- a/packages/uniswap/src/features/dataApi/types.ts +++ b/packages/uniswap/src/features/dataApi/types.ts @@ -2,6 +2,7 @@ import { NetworkStatus } from '@apollo/client' import { Contract } from '@uniswap/client-data-api/dist/data/v1/types_pb' import { Currency } from '@uniswap/sdk-core' import { GraphQLApi, SpamCode } from '@universe/api' +import { BridgedWithdrawalInfo } from '@universe/api/src/clients/graphql/__generated__/types-and-hooks' import { FoTPercent } from 'uniswap/src/features/tokens/TokenWarningModal' import { CurrencyId } from 'uniswap/src/types/currency' @@ -45,6 +46,10 @@ export type CurrencyInfo = { isSpam?: Maybe // Indicates if this currency is from another chain than user searched isFromOtherNetwork?: boolean + // Indicates if this token is a bridged asset + isBridged?: Maybe + // Information about how to withdraw a bridged asset to its native chain + bridgedWithdrawalInfo?: Maybe } // Portfolio balance as exposed to the app diff --git a/packages/uniswap/src/features/dataApi/utils/gqlTokenToCurrencyInfo.test.ts b/packages/uniswap/src/features/dataApi/utils/gqlTokenToCurrencyInfo.test.ts index 75b58eea063..1df17498d9f 100644 --- a/packages/uniswap/src/features/dataApi/utils/gqlTokenToCurrencyInfo.test.ts +++ b/packages/uniswap/src/features/dataApi/utils/gqlTokenToCurrencyInfo.test.ts @@ -23,6 +23,8 @@ describe(gqlTokenToCurrencyInfo, () => { currencyId: `${fromGraphQLChain(token.chain)}-${token.address}`, logoUrl: token.project.logoUrl, isSpam: token.project.isSpam, + isBridged: token.isBridged, + bridgedWithdrawalInfo: token.bridgedWithdrawalInfo, }) }) diff --git a/packages/uniswap/src/features/dataApi/utils/gqlTokenToCurrencyInfo.ts b/packages/uniswap/src/features/dataApi/utils/gqlTokenToCurrencyInfo.ts index ce4d1560a4c..150c1063372 100644 --- a/packages/uniswap/src/features/dataApi/utils/gqlTokenToCurrencyInfo.ts +++ b/packages/uniswap/src/features/dataApi/utils/gqlTokenToCurrencyInfo.ts @@ -11,7 +11,8 @@ export type GqlTokenToCurrencyInfoToken = Omit, + ) => FormattedFiatDelta +} { + const currency = useAppFiatCurrency() + const { formatNumberOrString } = useLocalizationContext() + + return useMemo( + () => ({ + formatChartFiatDelta: ( + options: Omit, + ): FormattedFiatDelta => { + return formatChartFiatDelta({ ...options, currency, formatNumberOrString }) + }, + }), + [currency, formatNumberOrString], + ) +} diff --git a/packages/uniswap/src/features/fiatCurrency/priceChart/formatters/shared/types.ts b/packages/uniswap/src/features/fiatCurrency/priceChart/formatters/shared/types.ts new file mode 100644 index 00000000000..b86b504b881 --- /dev/null +++ b/packages/uniswap/src/features/fiatCurrency/priceChart/formatters/shared/types.ts @@ -0,0 +1,37 @@ +import { FiatCurrency } from 'uniswap/src/features/fiatCurrency/constants' +import { FormatNumberOrStringInput } from 'uniswap/src/features/language/formatter' + +export type DecimalPlaceNumber = number | 'threshold' | 'zero' + +export interface TrimTrailingZerosParams { + formatted: string + decimals: number + roundedValue?: number // Optional - only used by stablecoin formatter +} + +export interface FiatDeltaFormatter { + getDecimalPlaces: (absValue: number) => DecimalPlaceNumber + trimTrailingZeros: (params: TrimTrailingZerosParams) => string + shouldShowBelowThreshold: (absValue: number) => boolean + format: (params: FormatParams) => string +} + +export interface FormatParams { + value: number + currency: FiatCurrency + formatNumberOrString: (input: FormatNumberOrStringInput) => string +} + +export interface FiatDeltaFormatOptions { + startingPrice: number + endingPrice: number + isStablecoin?: boolean + currency?: FiatCurrency + formatNumberOrString: (input: FormatNumberOrStringInput) => string +} + +export interface FormattedFiatDelta { + formatted: string + rawDelta: number + belowThreshold?: boolean +} diff --git a/packages/uniswap/src/features/fiatCurrency/priceChart/formatters/shared/utils.ts b/packages/uniswap/src/features/fiatCurrency/priceChart/formatters/shared/utils.ts new file mode 100644 index 00000000000..0bc790e11a5 --- /dev/null +++ b/packages/uniswap/src/features/fiatCurrency/priceChart/formatters/shared/utils.ts @@ -0,0 +1,93 @@ +import { FiatCurrency } from 'uniswap/src/features/fiatCurrency/constants' +import { getFiatCurrencyCode } from 'uniswap/src/features/fiatCurrency/hooks' +import { TrimTrailingZerosParams } from 'uniswap/src/features/fiatCurrency/priceChart/formatters/shared/types' +import { FormatNumberOrStringInput } from 'uniswap/src/features/language/formatter' +import { NumberType } from 'utilities/src/format/types' + +export const FIAT_DELTA_THRESHOLD = 0.000001 +const FORMATTED_NUMBER_PATTERN = /^([^0-9]*)([0-9,.\s]+)(.*)$/ + +export function roundToDecimals(value: number, decimals: number): number { + const factor = Math.pow(10, decimals) + return Math.round(value * factor) / factor +} + +export function formatZero( + currency: FiatCurrency, + formatNumberOrString: (input: FormatNumberOrStringInput) => string, +): string { + const currencyCode = getFiatCurrencyCode(currency) + return formatNumberOrString({ + value: 0, + type: NumberType.FiatStandard, + currencyCode, + }) +} + +export function formatThreshold( + currency: FiatCurrency, + formatNumberOrString: (input: FormatNumberOrStringInput) => string, +): string { + const currencyCode = getFiatCurrencyCode(currency) + + // Format just the threshold value to get proper currency symbol + const formatted = formatNumberOrString({ + value: FIAT_DELTA_THRESHOLD, + type: NumberType.FiatTokenDetails, + currencyCode, + }) + + return `<${formatted}` +} + +export function formatWithDecimals(params: { + value: number + decimals: number + currency: FiatCurrency + formatNumberOrString: (input: FormatNumberOrStringInput) => string + trimZeros: (params: TrimTrailingZerosParams) => string +}): string { + const { value, decimals, currency, formatNumberOrString, trimZeros } = params + const absValue = Math.abs(value) + const currencyCode = getFiatCurrencyCode(currency) + + // Round the value to the specified decimals + const roundedValue = roundToDecimals(absValue, decimals) + + // For very small values, we need to use a different number type that preserves precision + // NumberType.FiatStandard uses StandardCurrency which defaults to 2 decimals + // NumberType.FiatTokenDetails uses rules that preserve precision for small values + let formatted: string + + if (decimals > 2 && roundedValue < 1) { + // Use FiatTokenDetails which has SmallestNumCurrency for small values + // This preserves up to 20 decimals and respects the user's locale + formatted = formatNumberOrString({ + value: roundedValue, + type: NumberType.FiatTokenDetails, + currencyCode, + }) + } else { + // For larger values or values with 2 decimals, use the standard formatter + formatted = formatNumberOrString({ + value: roundedValue, + type: NumberType.FiatStandard, + currencyCode, + }) + } + + return trimZeros({ formatted, decimals, roundedValue }) +} + +export function parseFormattedNumber(formatted: string): { + prefix: string + numberPart: string + suffix: string +} { + const match = formatted.match(FORMATTED_NUMBER_PATTERN) + if (!match) { + return { prefix: '', numberPart: formatted, suffix: '' } + } + const [, prefix = '', numberPart = '', suffix = ''] = match + return { prefix, numberPart, suffix } +} diff --git a/packages/uniswap/src/features/fiatCurrency/priceChart/formatters/stablecoinFormatter.ts b/packages/uniswap/src/features/fiatCurrency/priceChart/formatters/stablecoinFormatter.ts new file mode 100644 index 00000000000..4ff1d52a6fd --- /dev/null +++ b/packages/uniswap/src/features/fiatCurrency/priceChart/formatters/stablecoinFormatter.ts @@ -0,0 +1,84 @@ +import type { + DecimalPlaceNumber, + FiatDeltaFormatter, + TrimTrailingZerosParams, +} from 'uniswap/src/features/fiatCurrency/priceChart/formatters/shared/types' +import { + formatWithDecimals, + formatZero, + parseFormattedNumber, + roundToDecimals, +} from 'uniswap/src/features/fiatCurrency/priceChart/formatters/shared/utils' + +function getDecimalPlaces(absValue: number): DecimalPlaceNumber { + if (absValue === 0) { + return 'zero' + } + if (absValue >= 0.01) { + return 2 + } + if (absValue >= 0.001) { + return 3 + } + return 2 // Show $0.00 for < 0.001 +} + +function trimTrailingZeros(params: TrimTrailingZerosParams): string { + const { formatted, decimals, roundedValue } = params + + // Special handling for stablecoins that round to zero + // don't trim 3 decimal places + if (roundedValue === 0 || decimals === 3) { + return formatted + } + + const { prefix, numberPart, suffix } = parseFormattedNumber(formatted) + + // Only trim 00 for 2 decimal places + if (decimals === 2 && numberPart.match(/[.,]00$/)) { + return prefix + numberPart.replace(/[.,]00$/, '') + suffix + } + + return formatted +} + +export function createStablecoinFormatter(): FiatDeltaFormatter { + return { + getDecimalPlaces, + trimTrailingZeros, + + shouldShowBelowThreshold: () => false, // Never show threshold for stablecoins + + format: (params): string => { + const { value, currency, formatNumberOrString } = params + const absValue = Math.abs(value) + let decimals = getDecimalPlaces(absValue) + + if (decimals === 'zero') { + return formatZero(currency, formatNumberOrString) + } + + // Stablecoins treat values < 0.001 as zero (return $0.00) + if (absValue < 0.001 && absValue > 0) { + return formatZero(currency, formatNumberOrString) + } + + // Check if rounding changes which decimal bucket we're in + // For example, 0.0099 rounds to 0.01 with 3 decimals, which should use 2 decimals + if (decimals === 3) { + const rounded = roundToDecimals(absValue, 3) + if (rounded >= 0.01) { + decimals = 2 + } + } + + return formatWithDecimals({ + value, + decimals: decimals as number, + currency, + formatNumberOrString, + trimZeros: trimTrailingZeros, + }) + }, + } +} diff --git a/packages/uniswap/src/features/fiatCurrency/priceChart/formatters/standardFormatter.ts b/packages/uniswap/src/features/fiatCurrency/priceChart/formatters/standardFormatter.ts new file mode 100644 index 00000000000..f9597121a4c --- /dev/null +++ b/packages/uniswap/src/features/fiatCurrency/priceChart/formatters/standardFormatter.ts @@ -0,0 +1,88 @@ +import type { + DecimalPlaceNumber, + FiatDeltaFormatter, + TrimTrailingZerosParams, +} from 'uniswap/src/features/fiatCurrency/priceChart/formatters/shared/types' +import { + FIAT_DELTA_THRESHOLD, + formatThreshold, + formatWithDecimals, + formatZero, + parseFormattedNumber, +} from 'uniswap/src/features/fiatCurrency/priceChart/formatters/shared/utils' + +const DECIMAL_THRESHOLDS = [ + { min: 1, decimals: 2 }, + { min: 0.1, decimals: 2 }, + { min: 0.01, decimals: 3 }, + { min: 0.001, decimals: 4 }, + { min: 0.0001, decimals: 5 }, + { min: 0.00001, decimals: 6 }, +] as const + +function getDecimalPlaces(absValue: number): DecimalPlaceNumber { + if (absValue === 0) { + return 'zero' + } + + // Use a small epsilon for floating point comparison + const EPSILON = 1e-10 + + for (const { min, decimals } of DECIMAL_THRESHOLDS) { + // Use epsilon comparison to handle floating point errors + if (absValue >= min - EPSILON) { + return decimals + } + } + + return 'threshold' +} + +function trimTrailingZeros(params: TrimTrailingZerosParams): string { + const { formatted, decimals } = params + const { prefix, numberPart, suffix } = parseFormattedNumber(formatted) + let trimmed = numberPart + + if (decimals === 2) { + // For 2 decimal places, keep both decimals (don't trim trailing zeros) + // This ensures values like $0.10 stay as $0.10, not $0.1 + trimmed = numberPart + } else if (decimals > 2) { + // For decimals > 2, trim all trailing zeros (including the decimal point if no significant digits remain) + trimmed = numberPart.replace(/(\.\d*?)0+$/, '$1') + // If we end with just a decimal point, remove it + trimmed = trimmed.replace(/\.$/, '') + } + + return prefix + trimmed + suffix +} + +export function createStandardFormatter(): FiatDeltaFormatter { + return { + getDecimalPlaces, + trimTrailingZeros, + + shouldShowBelowThreshold: (absValue: number) => absValue > 0 && absValue < FIAT_DELTA_THRESHOLD, + + format: (params): string => { + const { value, currency, formatNumberOrString } = params + const absValue = Math.abs(value) + const decimals = getDecimalPlaces(absValue) + + switch (decimals) { + case 'zero': + return formatZero(currency, formatNumberOrString) + case 'threshold': + return formatThreshold(currency, formatNumberOrString) + default: + return formatWithDecimals({ + value, + decimals, + currency, + formatNumberOrString, + trimZeros: trimTrailingZeros, + }) + } + }, + } +} diff --git a/packages/uniswap/src/features/fiatCurrency/priceChart/priceChartConversion.test.ts b/packages/uniswap/src/features/fiatCurrency/priceChart/priceChartConversion.test.ts new file mode 100644 index 00000000000..fbf15548f29 --- /dev/null +++ b/packages/uniswap/src/features/fiatCurrency/priceChart/priceChartConversion.test.ts @@ -0,0 +1,1204 @@ +/* eslint-disable max-lines */ +import { FiatCurrency } from 'uniswap/src/features/fiatCurrency/constants' +import { formatChartFiatDelta } from 'uniswap/src/features/fiatCurrency/priceChart/priceChartConversion' +import { FormatNumberOrStringInput } from 'uniswap/src/features/language/formatter' + +// Minimal test formatter that matches expected test output +const defaultFormatter = (input: FormatNumberOrStringInput): string => { + const { value, currencyCode, type } = input + if (value === null || value === undefined) { + return '-' + } + + const num = typeof value === 'number' ? value : parseFloat(value) + const currencySymbols: Record = { + USD: '$', + GBP: '£', + EUR: 'EUR ', + JPY: '¥', + INR: '₹', + } + + const symbol = currencySymbols[currencyCode || 'USD'] || currencyCode + ' ' + + if (type === 'fiat-standard') { + let decimals = 2 + const str = num.toString() + const match = str.match(/\.(\d+)/) + if (match && match[1]) { + decimals = Math.max(2, match[1].length) + } + + const formatted = num.toLocaleString('en-US', { + minimumFractionDigits: decimals, + maximumFractionDigits: decimals, + }) + if (num >= 1 && num === Math.floor(num)) { + return `${symbol}${formatted.replace(/\.00$/, '')}` + } + return `${symbol}${formatted}` + } + + const getDecimals = (n: number): number => { + const abs = Math.abs(n) + if (abs === 0 || abs >= 0.1) { + return 2 + } + if (abs >= 0.01) { + return Math.max(2, n.toString().replace(/.*\./, '').replace(/0+$/, '').length) + } + if (abs >= 0.001) { + return Math.max(3, n.toString().replace(/.*\./, '').replace(/0+$/, '').length) + } + if (abs >= 0.0001) { + return Math.max(4, n.toString().replace(/.*\./, '').replace(/0+$/, '').length) + } + if (abs >= 0.00001) { + return Math.max(5, n.toString().replace(/.*\./, '').replace(/0+$/, '').length) + } + return 6 + } + + const decimals = getDecimals(num) + let formatted = num.toLocaleString('en-US', { + minimumFractionDigits: decimals, + maximumFractionDigits: decimals, + }) + + // Trim trailing zeros for whole numbers (e.g., $1.00 -> $1) + if (decimals === 2 && num >= 1 && num === Math.floor(num)) { + formatted = formatted.replace(/\.00$/, '') + } + + return `${symbol}${formatted}` +} + +describe('formatChartFiatDelta', () => { + describe('normal crypto formatting', () => { + describe('values >= $1', () => { + it('formats positive values with 2 decimals', () => { + expect( + formatChartFiatDelta({ startingPrice: 100, endingPrice: 101.25, formatNumberOrString: defaultFormatter }) + .formatted, + ).toBe('$1.25') + expect( + formatChartFiatDelta({ startingPrice: 100, endingPrice: 2530.1, formatNumberOrString: defaultFormatter }) + .formatted, + ).toBe('$2,430.10') + expect( + formatChartFiatDelta({ startingPrice: 100, endingPrice: 101, formatNumberOrString: defaultFormatter }) + .formatted, + ).toBe('$1') + expect( + formatChartFiatDelta({ startingPrice: 100, endingPrice: 1099.99, formatNumberOrString: defaultFormatter }) + .formatted, + ).toBe('$999.99') + }) + + it('formats negative values with 2 decimals', () => { + expect( + formatChartFiatDelta({ startingPrice: 100, endingPrice: 100 + -1.25, formatNumberOrString: defaultFormatter }) + .formatted, + ).toBe('$1.25') + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + -2430.1, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$2,430.10') + expect( + formatChartFiatDelta({ startingPrice: 100, endingPrice: 100 + -1.0, formatNumberOrString: defaultFormatter }) + .formatted, + ).toBe('$1') + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + -999.99, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$999.99') + }) + + it('uses thousand separators', () => { + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + 1234.56, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$1,234.56') + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + 1234567.89, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$1,234,567.89') + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + -1234567.89, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$1,234,567.89') + }) + + it('trims trailing zeros', () => { + expect( + formatChartFiatDelta({ startingPrice: 100, endingPrice: 100 + 1.0, formatNumberOrString: defaultFormatter }) + .formatted, + ).toBe('$1') + expect( + formatChartFiatDelta({ startingPrice: 100, endingPrice: 100 + 1.1, formatNumberOrString: defaultFormatter }) + .formatted, + ).toBe('$1.10') + expect( + formatChartFiatDelta({ startingPrice: 100, endingPrice: 100 + 1.2, formatNumberOrString: defaultFormatter }) + .formatted, + ).toBe('$1.20') + }) + }) + + describe('values >= $0.10 and < $1', () => { + it('formats positive values with 2 decimals', () => { + expect( + formatChartFiatDelta({ startingPrice: 100, endingPrice: 100 + 0.57, formatNumberOrString: defaultFormatter }) + .formatted, + ).toBe('$0.57') + expect( + formatChartFiatDelta({ startingPrice: 100, endingPrice: 100 + 0.14, formatNumberOrString: defaultFormatter }) + .formatted, + ).toBe('$0.14') + expect( + formatChartFiatDelta({ startingPrice: 100, endingPrice: 100 + 0.1, formatNumberOrString: defaultFormatter }) + .formatted, + ).toBe('$0.10') + expect( + formatChartFiatDelta({ startingPrice: 100, endingPrice: 100 + 0.99, formatNumberOrString: defaultFormatter }) + .formatted, + ).toBe('$0.99') + }) + + it('formats negative values with 2 decimals', () => { + expect( + formatChartFiatDelta({ startingPrice: 100, endingPrice: 100 + -0.57, formatNumberOrString: defaultFormatter }) + .formatted, + ).toBe('$0.57') + expect( + formatChartFiatDelta({ startingPrice: 100, endingPrice: 100 + -0.14, formatNumberOrString: defaultFormatter }) + .formatted, + ).toBe('$0.14') + expect( + formatChartFiatDelta({ startingPrice: 100, endingPrice: 100 + -0.1, formatNumberOrString: defaultFormatter }) + .formatted, + ).toBe('$0.10') + expect( + formatChartFiatDelta({ startingPrice: 100, endingPrice: 100 + -0.99, formatNumberOrString: defaultFormatter }) + .formatted, + ).toBe('$0.99') + }) + + it('trims trailing zeros', () => { + expect( + formatChartFiatDelta({ startingPrice: 100, endingPrice: 100 + 0.1, formatNumberOrString: defaultFormatter }) + .formatted, + ).toBe('$0.10') + expect( + formatChartFiatDelta({ startingPrice: 100, endingPrice: 100 + 0.5, formatNumberOrString: defaultFormatter }) + .formatted, + ).toBe('$0.50') + }) + }) + + describe('values >= $0.01 and < $0.10', () => { + it('formats positive values with 3 decimals', () => { + expect( + formatChartFiatDelta({ startingPrice: 100, endingPrice: 100 + 0.053, formatNumberOrString: defaultFormatter }) + .formatted, + ).toBe('$0.053') + expect( + formatChartFiatDelta({ startingPrice: 100, endingPrice: 100 + 0.096, formatNumberOrString: defaultFormatter }) + .formatted, + ).toBe('$0.096') + expect( + formatChartFiatDelta({ startingPrice: 100, endingPrice: 100 + 0.01, formatNumberOrString: defaultFormatter }) + .formatted, + ).toBe('$0.01') + expect( + formatChartFiatDelta({ startingPrice: 100, endingPrice: 100 + 0.099, formatNumberOrString: defaultFormatter }) + .formatted, + ).toBe('$0.099') + }) + + it('formats negative values with 3 decimals', () => { + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + -0.053, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$0.053') + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + -0.096, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$0.096') + expect( + formatChartFiatDelta({ startingPrice: 100, endingPrice: 100 + -0.01, formatNumberOrString: defaultFormatter }) + .formatted, + ).toBe('$0.01') + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + -0.099, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$0.099') + }) + + it('trims trailing zeros but keeps at least 2 decimals', () => { + expect( + formatChartFiatDelta({ startingPrice: 100, endingPrice: 100 + 0.01, formatNumberOrString: defaultFormatter }) + .formatted, + ).toBe('$0.01') + expect( + formatChartFiatDelta({ startingPrice: 100, endingPrice: 100 + 0.05, formatNumberOrString: defaultFormatter }) + .formatted, + ).toBe('$0.05') + }) + }) + + describe('values >= $0.001 and < $0.01', () => { + it('formats positive values with 4 decimals', () => { + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + 0.0075, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$0.0075') + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + 0.0031, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$0.0031') + expect( + formatChartFiatDelta({ startingPrice: 100, endingPrice: 100 + 0.001, formatNumberOrString: defaultFormatter }) + .formatted, + ).toBe('$0.001') + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + 0.0099, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$0.0099') + }) + + it('formats negative values with 4 decimals', () => { + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + -0.0075, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$0.0075') + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + -0.0031, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$0.0031') + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + -0.001, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$0.001') + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + -0.0099, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$0.0099') + }) + + it('trims trailing zeros but keeps minimum decimals', () => { + expect( + formatChartFiatDelta({ startingPrice: 100, endingPrice: 100 + 0.001, formatNumberOrString: defaultFormatter }) + .formatted, + ).toBe('$0.001') + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + 0.0012, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$0.0012') + }) + }) + + describe('values >= $0.0001 and < $0.001', () => { + it('formats positive values with 5 decimals', () => { + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + 0.00083, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$0.00083') + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + 0.00022, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$0.00022') + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + 0.0001, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$0.0001') + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + 0.00099, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$0.00099') + }) + + it('formats negative values with 5 decimals', () => { + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + -0.00083, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$0.00083') + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + -0.00022, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$0.00022') + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + -0.0001, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$0.0001') + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + -0.00099, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$0.00099') + }) + + it('trims trailing zeros but keeps minimum decimals', () => { + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + 0.0001, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$0.0001') + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + 0.00012, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$0.00012') + }) + }) + + describe('values >= $0.00001 and < $0.0001', () => { + it('formats positive values with 6 decimals', () => { + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + 0.000019, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$0.000019') + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + 0.000094, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$0.000094') + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + 0.00001, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$0.00001') + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + 0.000099, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$0.000099') + }) + + it('formats negative values with 6 decimals', () => { + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + -0.000019, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$0.000019') + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + -0.000094, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$0.000094') + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + -0.00001, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$0.00001') + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + -0.000099, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$0.000099') + }) + + it('trims trailing zeros but keeps minimum decimals', () => { + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + 0.00001, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$0.00001') + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + 0.000012, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$0.000012') + }) + }) + + describe('values < $0.000001', () => { + it('formats as threshold with exact value in tooltip', () => { + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + 0.0000001, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('<$0.000001') + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + 0.0000009, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('<$0.000001') + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + -0.0000001, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('<$0.000001') + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + -0.0000009, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('<$0.000001') + }) + }) + + describe('zero value', () => { + it('formats as $0.00', () => { + expect( + formatChartFiatDelta({ startingPrice: 100, endingPrice: 100 + 0, formatNumberOrString: defaultFormatter }) + .formatted, + ).toBe('$0.00') + }) + }) + }) + + describe('stablecoin formatting', () => { + describe('values >= $1', () => { + it('formats positive values with 2 decimals', () => { + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + 1.25, + isStablecoin: true, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$1.25') + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + 2430.1, + isStablecoin: true, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$2,430.10') + }) + + it('formats negative values with 2 decimals', () => { + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + -1.25, + isStablecoin: true, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$1.25') + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + -2430.1, + isStablecoin: true, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$2,430.10') + }) + }) + + describe('values >= $0.10 and < $1', () => { + it('formats positive values with 2 decimals', () => { + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + 0.42, + isStablecoin: true, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$0.42') + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + 0.1, + isStablecoin: true, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$0.10') + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + 0.99, + isStablecoin: true, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$0.99') + }) + + it('formats negative values with 2 decimals', () => { + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + -0.42, + isStablecoin: true, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$0.42') + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + -0.1, + isStablecoin: true, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$0.10') + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + -0.99, + isStablecoin: true, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$0.99') + }) + }) + + describe('values >= $0.01 and < $0.10', () => { + it('formats positive values with 2 decimals', () => { + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + 0.07, + isStablecoin: true, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$0.07') + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + 0.01, + isStablecoin: true, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$0.01') + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + 0.099, + isStablecoin: true, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$0.10') + }) + + it('formats negative values with 2 decimals', () => { + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + -0.07, + isStablecoin: true, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$0.07') + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + -0.01, + isStablecoin: true, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$0.01') + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + -0.099, + isStablecoin: true, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$0.10') + }) + }) + + describe('values >= $0.001 and < $0.01', () => { + it('formats positive values with 3 decimals', () => { + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + 0.003, + isStablecoin: true, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$0.003') + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + 0.001, + isStablecoin: true, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$0.001') + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + 0.0099, + isStablecoin: true, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$0.01') + }) + + it('formats negative values with 3 decimals', () => { + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + -0.003, + isStablecoin: true, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$0.003') + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + -0.001, + isStablecoin: true, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$0.001') + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + -0.0099, + isStablecoin: true, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$0.01') + }) + }) + + describe('values < $0.001', () => { + it('formats as $0.00', () => { + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + 0.0001, + isStablecoin: true, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$0.00') + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + 0.0009, + isStablecoin: true, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$0.00') + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + -0.0001, + isStablecoin: true, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$0.00') + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + -0.0009, + isStablecoin: true, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$0.00') + }) + }) + + describe('zero value', () => { + it('formats as $0.00', () => { + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + 0, + isStablecoin: true, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$0.00') + }) + }) + }) + + describe('formatFiatDelta with isStablecoin flag', () => { + it('uses stablecoin formatting when isStablecoin is true', () => { + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + 0.003, + isStablecoin: true, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$0.003') + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + 0.0001, + isStablecoin: true, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$0.00') + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + 1.25, + isStablecoin: true, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$1.25') + }) + + it('uses normal formatting when isStablecoin is false', () => { + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + 0.003, + isStablecoin: false, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$0.003') + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + 0.0001, + isStablecoin: false, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$0.0001') + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + 1.25, + isStablecoin: false, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$1.25') + }) + }) + + describe('currency support', () => { + it('formats EUR currency with proper symbol', () => { + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + 100, + currency: FiatCurrency.Euro, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('EUR 100') + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + -50.5, + currency: FiatCurrency.Euro, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('EUR 50.50') + }) + + it('formats GBP currency with proper symbol', () => { + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + 100, + currency: FiatCurrency.BritishPound, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('£100') + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + -50.5, + currency: FiatCurrency.BritishPound, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('£50.50') + }) + + it('formats JPY currency with proper symbol', () => { + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + 100, + currency: FiatCurrency.JapaneseYen, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('¥100') + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + -50.5, + currency: FiatCurrency.JapaneseYen, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('¥50.50') + }) + }) + + describe('edge cases', () => { + it('handles trimming edge cases that previously failed', () => { + // Test case 1: Value that trims to whole number (previously would fail regex) + // 1.000 with 4 decimals should trim to "1", not break + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 101.0, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$1') + + // Test case 2: Value with all trailing zeros after rounding + // 0.0010 with 4 decimals should trim to "0.001" + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100.001, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$0.001') + + // Test case 3: Value in the 3-decimal range that has trailing zeros + // 0.0500 should trim to "0.05" (in the 3-decimal range >= 0.01 and < 0.10) + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100.05, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$0.05') + + // Test case 4: Very small value that needs all its decimals preserved + // 0.00012 should keep all significant digits + expect( + formatChartFiatDelta({ + startingPrice: 1.0, + endingPrice: 1.00012, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$0.00012') + + // Test case 5: Value that would have broken the old regex when decimal point is removed + // 0.001000 with 4 decimals trims to "0.001", old logic would try to match non-existent decimal + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100.001, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('$0.001') + }) + + it('handles rounding correctly', () => { + expect( + formatChartFiatDelta({ startingPrice: 100, endingPrice: 100 + 0.0999, formatNumberOrString: defaultFormatter }) + .formatted, + ).toBe('$0.1') + expect( + formatChartFiatDelta({ startingPrice: 100, endingPrice: 100 + 0.00999, formatNumberOrString: defaultFormatter }) + .formatted, + ).toBe('$0.01') + expect( + formatChartFiatDelta({ startingPrice: 100, endingPrice: 100 + 0.0994, formatNumberOrString: defaultFormatter }) + .formatted, + ).toBe('$0.099') + }) + + it('handles very small negative values correctly', () => { + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + -0.0000001, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('<$0.000001') + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + -0.000001, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('<$0.000001') + }) + + it('handles values exactly at thresholds', () => { + expect( + formatChartFiatDelta({ startingPrice: 100, endingPrice: 100 + 1.0, formatNumberOrString: defaultFormatter }) + .formatted, + ).toBe('$1') + expect( + formatChartFiatDelta({ startingPrice: 100, endingPrice: 100 + 0.1, formatNumberOrString: defaultFormatter }) + .formatted, + ).toBe('$0.10') + expect( + formatChartFiatDelta({ startingPrice: 100, endingPrice: 100 + 0.01, formatNumberOrString: defaultFormatter }) + .formatted, + ).toBe('$0.01') + expect( + formatChartFiatDelta({ startingPrice: 100, endingPrice: 100 + 0.001, formatNumberOrString: defaultFormatter }) + .formatted, + ).toBe('$0.001') + expect( + formatChartFiatDelta({ startingPrice: 100, endingPrice: 100 + 0.0001, formatNumberOrString: defaultFormatter }) + .formatted, + ).toBe('$0.0001') + expect( + formatChartFiatDelta({ startingPrice: 100, endingPrice: 100 + 0.00001, formatNumberOrString: defaultFormatter }) + .formatted, + ).toBe('$0.00001') + expect( + formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100 + 0.000001, + formatNumberOrString: defaultFormatter, + }).formatted, + ).toBe('<$0.000001') + }) + }) + describe('delta calculation', () => { + it('calculates and formats positive delta for normal crypto', () => { + const result = formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 103.53, + isStablecoin: false, + formatNumberOrString: defaultFormatter, + }) + expect(result.formatted).toBe('$3.53') + expect(result.rawDelta).toBeCloseTo(3.53, 5) + expect(result.belowThreshold).toBeUndefined() + }) + + it('correctly formats DEGEN-like small delta values', () => { + // Test the specific DEGEN case: $0.00370 - $0.00338 = $0.00032 + const result = formatChartFiatDelta({ + startingPrice: 0.00338, + endingPrice: 0.0037, + isStablecoin: false, + formatNumberOrString: defaultFormatter, + }) + expect(result.formatted).toBe('$0.00032') + expect(result.rawDelta).toBeCloseTo(0.00032, 10) + expect(result.belowThreshold).toBeUndefined() + }) + + it('calculates and formats positive delta for stablecoin', () => { + const result = formatChartFiatDelta({ + startingPrice: 1.0, + endingPrice: 1.003, + isStablecoin: true, + formatNumberOrString: defaultFormatter, + }) + expect(result.formatted).toBe('$0.003') + expect(result.rawDelta).toBeCloseTo(0.003, 5) + expect(result.belowThreshold).toBeUndefined() + }) + + it('calculates and formats negative delta for stablecoin', () => { + const result = formatChartFiatDelta({ + startingPrice: 1.0, + endingPrice: 0.997, + isStablecoin: true, + formatNumberOrString: defaultFormatter, + }) + expect(result.formatted).toBe('$0.003') + expect(result.rawDelta).toBeCloseTo(-0.003, 5) + expect(result.belowThreshold).toBeUndefined() + }) + + it('handles very small deltas for stablecoin', () => { + const result = formatChartFiatDelta({ + startingPrice: 1.0, + endingPrice: 1.0001, + isStablecoin: true, + formatNumberOrString: defaultFormatter, + }) + expect(result.formatted).toBe('$0.00') + expect(result.rawDelta).toBeCloseTo(0.0001, 5) + expect(result.belowThreshold).toBeUndefined() + }) + + it('handles zero delta', () => { + const result = formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 100, + isStablecoin: false, + formatNumberOrString: defaultFormatter, + }) + expect(result.formatted).toBe('$0.00') + expect(result.rawDelta).toBe(0) + expect(result.belowThreshold).toBeUndefined() + }) + + it('uses custom currency', () => { + const result = formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 150, + currency: FiatCurrency.Euro, + formatNumberOrString: defaultFormatter, + }) + expect(result.formatted).toBe('EUR 50') + expect(result.rawDelta).toBe(50) + expect(result.belowThreshold).toBeUndefined() + }) + + it('handles below threshold values for normal crypto', () => { + const result = formatChartFiatDelta({ + startingPrice: 1.0, + endingPrice: 1.0000005, + isStablecoin: false, + formatNumberOrString: defaultFormatter, + }) + expect(result.formatted).toBe('<$0.000001') + expect(result.rawDelta).toBeCloseTo(0.0000005, 10) + expect(result.belowThreshold).toBe(true) + }) + + it('handles multiple currencies', () => { + const gbpResult = formatChartFiatDelta({ + startingPrice: 100, + endingPrice: 175.25, + currency: FiatCurrency.BritishPound, + formatNumberOrString: defaultFormatter, + }) + expect(gbpResult.formatted).toBe('£75.25') + expect(gbpResult.rawDelta).toBe(75.25) + + const jpyResult = formatChartFiatDelta({ + startingPrice: 10000, + endingPrice: 12500, + currency: FiatCurrency.JapaneseYen, + formatNumberOrString: defaultFormatter, + }) + expect(jpyResult.formatted).toBe('¥2,500') + expect(jpyResult.rawDelta).toBe(2500) + + const inrResult = formatChartFiatDelta({ + startingPrice: 5000, + endingPrice: 7500.5, + currency: FiatCurrency.IndianRupee, + formatNumberOrString: defaultFormatter, + }) + expect(inrResult.formatted).toBe('₹2,500.50') + expect(inrResult.rawDelta).toBe(2500.5) + }) + + it('correctly sets belowThreshold flag', () => { + // Should set belowThreshold for non-stablecoins + const cryptoResult = formatChartFiatDelta({ + startingPrice: 1.0, + endingPrice: 1.0000003, + isStablecoin: false, + formatNumberOrString: defaultFormatter, + }) + expect(cryptoResult.belowThreshold).toBe(true) + + // Should NOT set belowThreshold for stablecoins + const stableResult = formatChartFiatDelta({ + startingPrice: 1.0, + endingPrice: 1.0000003, + isStablecoin: true, + formatNumberOrString: defaultFormatter, + }) + expect(stableResult.belowThreshold).toBeUndefined() + + // Should NOT set belowThreshold when value is above threshold + const aboveResult = formatChartFiatDelta({ + startingPrice: 1.0, + endingPrice: 1.001, + isStablecoin: false, + formatNumberOrString: defaultFormatter, + }) + expect(aboveResult.belowThreshold).toBeUndefined() + }) + }) +}) diff --git a/packages/uniswap/src/features/fiatCurrency/priceChart/priceChartConversion.ts b/packages/uniswap/src/features/fiatCurrency/priceChart/priceChartConversion.ts new file mode 100644 index 00000000000..91e80a8d9ee --- /dev/null +++ b/packages/uniswap/src/features/fiatCurrency/priceChart/priceChartConversion.ts @@ -0,0 +1,42 @@ +import { FiatCurrency } from 'uniswap/src/features/fiatCurrency/constants' +import type { + FiatDeltaFormatOptions, + FormattedFiatDelta, +} from 'uniswap/src/features/fiatCurrency/priceChart/formatters/shared/types' +import { createStablecoinFormatter } from 'uniswap/src/features/fiatCurrency/priceChart/formatters/stablecoinFormatter' +import { createStandardFormatter } from 'uniswap/src/features/fiatCurrency/priceChart/formatters/standardFormatter' + +/** + * Utility for formatting fiat currency delta values in price charts. + * + * This module provides specialized formatting for price change amounts with: + * - Dynamic decimal precision based on value magnitude (2-6 decimal places) + * - Threshold formatting for very small values (<$0.000001) + * - Intelligent trailing zero trimming while preserving minimum decimals + * - Support for multiple fiat currencies with proper symbol extraction + * - Special handling for stablecoins (simplified precision rules) + */ +export function formatChartFiatDelta({ + startingPrice, + endingPrice, + isStablecoin = false, + currency = FiatCurrency.UnitedStatesDollar, + formatNumberOrString, +}: FiatDeltaFormatOptions): FormattedFiatDelta { + const formatter = isStablecoin ? createStablecoinFormatter() : createStandardFormatter() + const rawDelta = endingPrice - startingPrice + + const formatted = formatter.format({ + value: rawDelta, + currency, + formatNumberOrString, + }) + + const belowThreshold = formatter.shouldShowBelowThreshold(Math.abs(rawDelta)) + + return { + formatted, + rawDelta, + ...(belowThreshold && { belowThreshold: true }), + } +} diff --git a/packages/uniswap/src/features/forceUpgrade/hooks/useForceUpgradeStatus.ts b/packages/uniswap/src/features/forceUpgrade/hooks/useForceUpgradeStatus.ts index 246af09288d..b573fee07df 100644 --- a/packages/uniswap/src/features/forceUpgrade/hooks/useForceUpgradeStatus.ts +++ b/packages/uniswap/src/features/forceUpgrade/hooks/useForceUpgradeStatus.ts @@ -1,5 +1,4 @@ -import { DynamicConfigs, ForceUpgradeConfigKey, ForceUpgradeStatus } from 'uniswap/src/features/gating/configs' -import { useDynamicConfigValue } from 'uniswap/src/features/gating/hooks' +import { DynamicConfigs, ForceUpgradeConfigKey, ForceUpgradeStatus, useDynamicConfigValue } from '@universe/gating' export function useForceUpgradeStatus(): ForceUpgradeStatus { return useDynamicConfigValue({ diff --git a/packages/uniswap/src/features/forceUpgrade/hooks/useForceUpgradeTranslations.ts b/packages/uniswap/src/features/forceUpgrade/hooks/useForceUpgradeTranslations.ts index 5eb16d3693e..63357d0ef22 100644 --- a/packages/uniswap/src/features/forceUpgrade/hooks/useForceUpgradeTranslations.ts +++ b/packages/uniswap/src/features/forceUpgrade/hooks/useForceUpgradeTranslations.ts @@ -1,5 +1,9 @@ -import { DynamicConfigs, ForceUpgradeConfigKey, ForceUpgradeTranslations } from 'uniswap/src/features/gating/configs' -import { useDynamicConfigValue } from 'uniswap/src/features/gating/hooks' +import { + DynamicConfigs, + ForceUpgradeConfigKey, + ForceUpgradeTranslations, + useDynamicConfigValue, +} from '@universe/gating' export function useForceUpgradeTranslations(): ForceUpgradeTranslations { return useDynamicConfigValue({ diff --git a/packages/uniswap/src/features/gas/hooks.ts b/packages/uniswap/src/features/gas/hooks.ts index 96ae3a1cd70..cab1383e613 100644 --- a/packages/uniswap/src/features/gas/hooks.ts +++ b/packages/uniswap/src/features/gas/hooks.ts @@ -1,5 +1,6 @@ import { Currency, CurrencyAmount } from '@uniswap/sdk-core' import { GasStrategy } from '@universe/api' +import { GasStrategyType, useStatsigClientStatus } from '@universe/gating' import { BigNumber, providers } from 'ethers/lib/ethers' import { useMemo } from 'react' import { useTranslation } from 'react-i18next' @@ -12,8 +13,6 @@ import { useEnabledChains } from 'uniswap/src/features/chains/hooks/useEnabledCh import { UniverseChainId } from 'uniswap/src/features/chains/types' import { FormattedUniswapXGasFeeInfo, GasFeeResult } from 'uniswap/src/features/gas/types' import { getActiveGasStrategy, hasSufficientFundsIncludingGas } from 'uniswap/src/features/gas/utils' -import { GasStrategyType } from 'uniswap/src/features/gating/configs' -import { useStatsigClientStatus } from 'uniswap/src/features/gating/hooks' import { useLocalizationContext } from 'uniswap/src/features/language/LocalizationContext' import { useOnChainNativeCurrencyBalance } from 'uniswap/src/features/portfolio/api' import { getCurrencyAmount, ValueType } from 'uniswap/src/features/tokens/getCurrencyAmount' diff --git a/packages/uniswap/src/features/gas/hooks/useMaxAmountSpend.test.ts b/packages/uniswap/src/features/gas/hooks/useMaxAmountSpend.test.ts index 5019f99318b..e1717ddd237 100644 --- a/packages/uniswap/src/features/gas/hooks/useMaxAmountSpend.test.ts +++ b/packages/uniswap/src/features/gas/hooks/useMaxAmountSpend.test.ts @@ -8,8 +8,9 @@ import { MAINNET_CURRENCY } from 'uniswap/src/test/fixtures/wallet/currencies' const mockUseDynamicConfigValue = jest.fn() -jest.mock('uniswap/src/features/gating/hooks', () => { +jest.mock('@universe/gating', () => { return { + ...jest.requireActual('@universe/gating'), useDynamicConfigValue: (params: { config: unknown; key: unknown; defaultValue: unknown }): unknown => mockUseDynamicConfigValue(params), } diff --git a/packages/uniswap/src/features/gas/hooks/useMaxAmountSpend.ts b/packages/uniswap/src/features/gas/hooks/useMaxAmountSpend.ts index 7d223059153..30a1e1ceb77 100644 --- a/packages/uniswap/src/features/gas/hooks/useMaxAmountSpend.ts +++ b/packages/uniswap/src/features/gas/hooks/useMaxAmountSpend.ts @@ -1,10 +1,9 @@ import { Currency, CurrencyAmount } from '@uniswap/sdk-core' +import { DynamicConfigs, SwapConfigKey, useDynamicConfigValue } from '@universe/gating' import JSBI from 'jsbi' import { getChainInfo } from 'uniswap/src/features/chains/chainInfo' import { GENERIC_L2_GAS_CONFIG } from 'uniswap/src/features/chains/gasDefaults' import { UniverseChainId } from 'uniswap/src/features/chains/types' -import { DynamicConfigs, SwapConfigKey } from 'uniswap/src/features/gating/configs' -import { useDynamicConfigValue } from 'uniswap/src/features/gating/hooks' import { getCurrencyAmount, ValueType } from 'uniswap/src/features/tokens/getCurrencyAmount' import { TransactionType } from 'uniswap/src/features/transactions/types/transactionDetails' diff --git a/packages/uniswap/src/features/gas/utils.ts b/packages/uniswap/src/features/gas/utils.ts index f8862b530fa..9c1e2460928 100644 --- a/packages/uniswap/src/features/gas/utils.ts +++ b/packages/uniswap/src/features/gas/utils.ts @@ -1,14 +1,14 @@ import { Currency, CurrencyAmount } from '@uniswap/sdk-core' import { GasEstimate, GasStrategy } from '@universe/api' -import JSBI from 'jsbi' -import { areEqualGasStrategies } from 'uniswap/src/features/gas/types' import { DynamicConfigs, GasStrategies, GasStrategyType, GasStrategyWithConditions, -} from 'uniswap/src/features/gating/configs' -import { getStatsigClient } from 'uniswap/src/features/gating/sdk/statsig' + getStatsigClient, +} from '@universe/gating' +import JSBI from 'jsbi' +import { areEqualGasStrategies } from 'uniswap/src/features/gas/types' import { getCurrencyAmount, ValueType } from 'uniswap/src/features/tokens/getCurrencyAmount' // The default "Urgent" strategy that was previously hardcoded in the gas service diff --git a/packages/uniswap/src/features/gating/StatsigProviderWrapper.tsx b/packages/uniswap/src/features/gating/StatsigProviderWrapper.tsx index 86c703873e0..f73bb72db2a 100644 --- a/packages/uniswap/src/features/gating/StatsigProviderWrapper.tsx +++ b/packages/uniswap/src/features/gating/StatsigProviderWrapper.tsx @@ -1,12 +1,6 @@ +import { StatsigOptions, StatsigProvider, StatsigUser, StorageProvider, useClientAsyncInit } from '@universe/gating' import { ReactNode, useEffect } from 'react' import { config } from 'uniswap/src/config' -import { - StatsigOptions, - StatsigProvider, - StatsigUser, - StorageProvider, - useClientAsyncInit, -} from 'uniswap/src/features/gating/sdk/statsig' import { statsigBaseConfig } from 'uniswap/src/features/gating/statsigBaseConfig' import { logger } from 'utilities/src/logger/logger' diff --git a/packages/uniswap/src/features/gating/statsigBaseConfig.ts b/packages/uniswap/src/features/gating/statsigBaseConfig.ts index 6ea6d023740..dbb1f13d574 100644 --- a/packages/uniswap/src/features/gating/statsigBaseConfig.ts +++ b/packages/uniswap/src/features/gating/statsigBaseConfig.ts @@ -1,6 +1,5 @@ +import { getOverrideAdapter, getStatsigEnvName, StatsigOptions } from '@universe/gating' import { uniswapUrls } from 'uniswap/src/constants/urls' -import { getStatsigEnvName } from 'uniswap/src/features/gating/getStatsigEnvName' -import { getOverrideAdapter, StatsigOptions } from 'uniswap/src/features/gating/sdk/statsig' export const statsigBaseConfig: StatsigOptions = { networkConfig: { api: uniswapUrls.statsigProxyUrl }, diff --git a/packages/uniswap/src/features/gating/typeGuards.ts b/packages/uniswap/src/features/gating/typeGuards.ts index 4f98aa75596..058c3fb0549 100644 --- a/packages/uniswap/src/features/gating/typeGuards.ts +++ b/packages/uniswap/src/features/gating/typeGuards.ts @@ -1,6 +1,6 @@ import { GraphQLApi } from '@universe/api' +import { UwULinkAllowlist } from '@universe/gating' import { UniverseChainId } from 'uniswap/src/features/chains/types' -import { UwULinkAllowlist } from 'uniswap/src/features/gating/configs' export const isUwULinkAllowlistType = (x: unknown): x is UwULinkAllowlist => { const hasFields = diff --git a/packages/uniswap/src/features/language/hooks.tsx b/packages/uniswap/src/features/language/hooks.tsx index 1c550e5213d..5e76bb6999f 100644 --- a/packages/uniswap/src/features/language/hooks.tsx +++ b/packages/uniswap/src/features/language/hooks.tsx @@ -1,9 +1,9 @@ +import { ForceUpgradeTranslations } from '@universe/gating' import { useMemo } from 'react' import { useTranslation } from 'react-i18next' import { useSelector } from 'react-redux' import { AppTFunction } from 'ui/src/i18n/types' import { useUrlContext } from 'uniswap/src/contexts/UrlContext' -import { ForceUpgradeTranslations } from 'uniswap/src/features/gating/configs' import { Language, Locale, diff --git a/packages/uniswap/src/features/nfts/hooks/useNftContextMenuItems.tsx b/packages/uniswap/src/features/nfts/hooks/useNftContextMenuItems.tsx index afebb23bf45..99c9236debd 100644 --- a/packages/uniswap/src/features/nfts/hooks/useNftContextMenuItems.tsx +++ b/packages/uniswap/src/features/nfts/hooks/useNftContextMenuItems.tsx @@ -1,4 +1,5 @@ import { TokenReportEventType } from '@universe/api' +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import { useCallback, useMemo } from 'react' import { useTranslation } from 'react-i18next' import { useDispatch, useSelector } from 'react-redux' @@ -14,8 +15,6 @@ import { useEnabledChains } from 'uniswap/src/features/chains/hooks/useEnabledCh import { useBlockExplorerLogo } from 'uniswap/src/features/chains/logos' import { type UniverseChainId } from 'uniswap/src/features/chains/types' import { getChainExplorerName } from 'uniswap/src/features/chains/utils' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' import { useNavigateToNftExplorerLink } from 'uniswap/src/features/nfts/hooks/useNavigateToNftExplorerLink' import { getIsNftHidden, getNFTAssetKey } from 'uniswap/src/features/nfts/utils' import { pushNotification } from 'uniswap/src/features/notifications/slice/slice' diff --git a/packages/uniswap/src/features/passkey/hooks/useEmbeddedWalletBaseUrl.ts b/packages/uniswap/src/features/passkey/hooks/useEmbeddedWalletBaseUrl.ts index 116f82ffc2b..36eeab329b6 100644 --- a/packages/uniswap/src/features/passkey/hooks/useEmbeddedWalletBaseUrl.ts +++ b/packages/uniswap/src/features/passkey/hooks/useEmbeddedWalletBaseUrl.ts @@ -1,6 +1,5 @@ +import { DynamicConfigs, EmbeddedWalletConfigKey, useDynamicConfigValue } from '@universe/gating' import { UNISWAP_WEB_URL } from 'uniswap/src/constants/urls' -import { DynamicConfigs, EmbeddedWalletConfigKey } from 'uniswap/src/features/gating/configs' -import { useDynamicConfigValue } from 'uniswap/src/features/gating/hooks' export function useEmbeddedWalletBaseUrl(): string { const baseUrl = useDynamicConfigValue({ diff --git a/packages/uniswap/src/features/portfolio/PortfolioBalance/PortfolioBalance.tsx b/packages/uniswap/src/features/portfolio/PortfolioBalance/PortfolioBalance.tsx index 48a9aeccb6b..d5327f5640a 100644 --- a/packages/uniswap/src/features/portfolio/PortfolioBalance/PortfolioBalance.tsx +++ b/packages/uniswap/src/features/portfolio/PortfolioBalance/PortfolioBalance.tsx @@ -17,9 +17,13 @@ import { isWebPlatform } from 'utilities/src/platform' interface PortfolioBalanceProps { owner: Address + endText?: JSX.Element | string } -export const PortfolioBalance = memo(function _PortfolioBalance({ owner }: PortfolioBalanceProps): JSX.Element { +export const PortfolioBalance = memo(function _PortfolioBalance({ + owner, + endText, +}: PortfolioBalanceProps): JSX.Element { const { data, loading, networkStatus, refetch } = usePortfolioTotalValue({ evmAddress: owner, // TransactionHistoryUpdater will refetch this query on new transaction. @@ -47,7 +51,7 @@ export const PortfolioBalance = memo(function _PortfolioBalance({ owner }: Portf const shouldFadePortfolioDecimals = (currency === FiatCurrency.UnitedStatesDollar || currency === FiatCurrency.Euro) && currencyComponents.symbolAtFront - const EndElement = useMemo(() => { + const RefreshButton = useMemo(() => { if (isWebPlatform) { return } @@ -65,19 +69,22 @@ export const PortfolioBalance = memo(function _PortfolioBalance({ owner }: Portf value={totalBalance} warmLoading={isWarmLoading} isRightToLeft={isRightToLeft} - EndElement={EndElement} + EndElement={RefreshButton} /> - - - + + + + + {endText} + ) }) diff --git a/packages/uniswap/src/features/portfolio/api.ts b/packages/uniswap/src/features/portfolio/api.ts index 8bbe8b0e570..910338e10cc 100644 --- a/packages/uniswap/src/features/portfolio/api.ts +++ b/packages/uniswap/src/features/portfolio/api.ts @@ -2,6 +2,7 @@ import { PublicKey } from '@solana/web3.js' import { skipToken, useQuery } from '@tanstack/react-query' import { Currency, CurrencyAmount, NativeCurrency as NativeCurrencyClass } from '@uniswap/sdk-core' import { SharedQueryClient } from '@universe/api' +import { DynamicConfigs, getDynamicConfigValue, SyncTransactionSubmissionChainIdsConfigKey } from '@universe/gating' import { Contract } from 'ethers/lib/ethers' import { useMemo } from 'react' import ERC20_ABI from 'uniswap/src/abis/erc20.json' @@ -14,8 +15,6 @@ import { import { getChainInfo } from 'uniswap/src/features/chains/chainInfo' import { UniverseChainId } from 'uniswap/src/features/chains/types' import { getPollingIntervalByBlocktime } from 'uniswap/src/features/chains/utils' -import { DynamicConfigs, SyncTransactionSubmissionChainIdsConfigKey } from 'uniswap/src/features/gating/configs' -import { getDynamicConfigValue } from 'uniswap/src/features/gating/hooks' import { Platform } from 'uniswap/src/features/platforms/types/Platform' import { chainIdToPlatform } from 'uniswap/src/features/platforms/utils/chains' import { createEthersProvider } from 'uniswap/src/features/providers/createEthersProvider' diff --git a/packages/uniswap/src/features/portfolio/portfolioUpdates/isInstantTokenBalanceUpdateEnabled.ts b/packages/uniswap/src/features/portfolio/portfolioUpdates/isInstantTokenBalanceUpdateEnabled.ts index f35ff5a208c..12424682f7f 100644 --- a/packages/uniswap/src/features/portfolio/portfolioUpdates/isInstantTokenBalanceUpdateEnabled.ts +++ b/packages/uniswap/src/features/portfolio/portfolioUpdates/isInstantTokenBalanceUpdateEnabled.ts @@ -1,5 +1,4 @@ -import { FeatureFlags, getFeatureFlagName } from 'uniswap/src/features/gating/flags' -import { getStatsigClient } from 'uniswap/src/features/gating/sdk/statsig' +import { FeatureFlags, getFeatureFlagName, getStatsigClient } from '@universe/gating' export function isInstantTokenBalanceUpdateEnabled(): boolean { return getStatsigClient().checkGate(getFeatureFlagName(FeatureFlags.InstantTokenBalanceUpdate)) diff --git a/packages/uniswap/src/features/portfolio/portfolioUpdates/rest/fetchOnChainBalancesRest.test.ts b/packages/uniswap/src/features/portfolio/portfolioUpdates/rest/fetchOnChainBalancesRest.test.ts index 40395fdc848..9054ae0f4e6 100644 --- a/packages/uniswap/src/features/portfolio/portfolioUpdates/rest/fetchOnChainBalancesRest.test.ts +++ b/packages/uniswap/src/features/portfolio/portfolioUpdates/rest/fetchOnChainBalancesRest.test.ts @@ -1,6 +1,6 @@ -import { ApolloClient, NormalizedCacheObject } from '@apollo/client' import { GetPortfolioResponse } from '@uniswap/client-data-api/dist/data/v1/api_pb.d' -import { GraphQLApi } from '@universe/api' +import { type Token as SearchToken } from '@uniswap/client-search/dist/search/v1/api_pb' +import * as searchTokensAndPools from 'uniswap/src/data/rest/searchTokensAndPools' import { UniverseChainId } from 'uniswap/src/features/chains/types' import { fetchOnChainCurrencyBalance } from 'uniswap/src/features/portfolio/api' import { fetchOnChainBalancesRest } from 'uniswap/src/features/portfolio/portfolioUpdates/rest/fetchOnChainBalancesRest' @@ -33,10 +33,19 @@ jest.mock('uniswap/src/features/portfolio/api', () => ({ fetchOnChainCurrencyBalance: jest.fn(), })) +jest.mock('uniswap/src/data/rest/searchTokensAndPools', () => ({ + ...jest.requireActual('uniswap/src/data/rest/searchTokensAndPools'), + fetchTokenByAddress: jest.fn(), +})) + const mockGetOnChainBalancesFetch = fetchOnChainCurrencyBalance as jest.MockedFunction< typeof fetchOnChainCurrencyBalance > +const mockFetchTokenByAddress = searchTokensAndPools.fetchTokenByAddress as jest.MockedFunction< + typeof searchTokensAndPools.fetchTokenByAddress +> + const TEST_ACCOUNT = '0x1234567890123456789012345678901234567890' const TEST_TOKEN_ADDRESS = '0xabcdef0123456789abcdef0123456789abcdef01' const TEST_CHAIN_ID = UniverseChainId.Mainnet @@ -83,10 +92,6 @@ const mockCachedPortfolio = { } as NonNullable describe('fetchOnChainBalancesRest', () => { - const mockApolloClient = { - query: jest.fn(), - } as unknown as ApolloClient - beforeEach(() => { jest.clearAllMocks() }) @@ -100,7 +105,6 @@ describe('fetchOnChainBalancesRest', () => { }) const result = await fetchOnChainBalancesRest({ - apolloClient: mockApolloClient, cachedPortfolio: mockCachedPortfolio, accountAddress: TEST_ACCOUNT, currencyIds: new Set([currencyId]), @@ -149,7 +153,6 @@ describe('fetchOnChainBalancesRest', () => { } as NonNullable const result = await fetchOnChainBalancesRest({ - apolloClient: mockApolloClient, cachedPortfolio: mockCachedPortfolioWithNative, accountAddress: TEST_ACCOUNT, currencyIds: new Set([currencyId]), @@ -172,7 +175,6 @@ describe('fetchOnChainBalancesRest', () => { const invalidCurrencyId = 'invalid-currency-id' const result = await fetchOnChainBalancesRest({ - apolloClient: mockApolloClient, cachedPortfolio: mockCachedPortfolio, accountAddress: TEST_ACCOUNT, currencyIds: new Set([invalidCurrencyId]), @@ -190,32 +192,28 @@ describe('fetchOnChainBalancesRest', () => { balance: mockBalance, }) - // Mock GraphQL query for new token - ;(mockApolloClient.query as jest.Mock).mockResolvedValueOnce({ - data: { - token: { - ...mockToken, - address: MOCK_TOKEN_ADDRESS_2, - symbol: 'NEW', - name: 'New Token', - }, - }, - }) + // Mock REST search for new token + mockFetchTokenByAddress.mockResolvedValueOnce({ + chainId: TEST_CHAIN_ID, + address: MOCK_TOKEN_ADDRESS_2, + symbol: 'NEW', + name: 'New Token', + decimals: 18, + logoUrl: '', + feeData: undefined, + safetyLevel: 0, + protectionInfo: undefined, + } as unknown as SearchToken) const result = await fetchOnChainBalancesRest({ - apolloClient: mockApolloClient, cachedPortfolio: mockCachedPortfolio, // doesn't contain new token accountAddress: TEST_ACCOUNT, currencyIds: new Set([currencyId]), }) - expect(mockApolloClient.query).toHaveBeenCalledWith({ - query: GraphQLApi.TokenDocument, - variables: { - chain: 'ETHEREUM', - address: MOCK_TOKEN_ADDRESS_2, - }, - fetchPolicy: 'cache-first', + expect(mockFetchTokenByAddress).toHaveBeenCalledWith({ + chainId: TEST_CHAIN_ID, + address: MOCK_TOKEN_ADDRESS_2, }) const balanceInfo = result.get(currencyId) @@ -225,7 +223,7 @@ describe('fetchOnChainBalancesRest', () => { expect(balanceInfo?.token?.symbol).toBe('NEW') }) - it('skips tokens when GraphQL query fails', async () => { + it('skips tokens when REST token search fails', async () => { const currencyId = buildCurrencyId(TEST_CHAIN_ID, MOCK_TOKEN_ADDRESS_3) const mockBalance = MOCK_BALANCE_1_ETH @@ -233,13 +231,10 @@ describe('fetchOnChainBalancesRest', () => { balance: mockBalance, }) - // Mock GraphQL query to return null token - ;(mockApolloClient.query as jest.Mock).mockResolvedValueOnce({ - data: { token: null }, - }) + // Mock REST search to return null (token not found) + mockFetchTokenByAddress.mockResolvedValueOnce(null) const result = await fetchOnChainBalancesRest({ - apolloClient: mockApolloClient, cachedPortfolio: mockCachedPortfolio, accountAddress: TEST_ACCOUNT, currencyIds: new Set([currencyId]), @@ -284,7 +279,6 @@ describe('fetchOnChainBalancesRest', () => { .mockResolvedValueOnce({ balance: MOCK_BALANCE_2_ETH }) const result = await fetchOnChainBalancesRest({ - apolloClient: mockApolloClient, cachedPortfolio: mockCachedPortfolioMultiple, accountAddress: TEST_ACCOUNT, currencyIds: new Set([currencyId1, currencyId2]), @@ -310,7 +304,6 @@ describe('fetchOnChainBalancesRest', () => { .mockRejectedValueOnce(new Error('Network error')) const result = await fetchOnChainBalancesRest({ - apolloClient: mockApolloClient, cachedPortfolio: mockCachedPortfolio, accountAddress: TEST_ACCOUNT, currencyIds: new Set([currencyId1, currencyId2]), @@ -332,7 +325,6 @@ describe('fetchOnChainBalancesRest', () => { // Cached portfolio has 1 token worth $100 const result = await fetchOnChainBalancesRest({ - apolloClient: mockApolloClient, cachedPortfolio: mockCachedPortfolio, accountAddress: TEST_ACCOUNT, currencyIds: new Set([currencyId]), diff --git a/packages/uniswap/src/features/portfolio/portfolioUpdates/rest/fetchOnChainBalancesRest.ts b/packages/uniswap/src/features/portfolio/portfolioUpdates/rest/fetchOnChainBalancesRest.ts index 98837526c9b..580ed5e508a 100644 --- a/packages/uniswap/src/features/portfolio/portfolioUpdates/rest/fetchOnChainBalancesRest.ts +++ b/packages/uniswap/src/features/portfolio/portfolioUpdates/rest/fetchOnChainBalancesRest.ts @@ -1,21 +1,20 @@ -import { ApolloClient, NormalizedCacheObject } from '@apollo/client' import { PartialMessage } from '@bufbuild/protobuf' import { GetPortfolioResponse } from '@uniswap/client-data-api/dist/data/v1/api_pb.d' import { Balance } from '@uniswap/client-data-api/dist/data/v1/types_pb' import { CurrencyAmount, NativeCurrency, Token } from '@uniswap/sdk-core' -import { GraphQLApi, TradingApi } from '@universe/api' +import { TradingApi } from '@universe/api' import { getNativeAddress } from 'uniswap/src/constants/addresses' +import { fetchTokenByAddress, searchTokenToCurrencyInfo } from 'uniswap/src/data/rest/searchTokensAndPools' import { UniverseChainId } from 'uniswap/src/features/chains/types' import { getPrimaryStablecoin } from 'uniswap/src/features/chains/utils' -import { currencyIdToContractInput } from 'uniswap/src/features/dataApi/utils/currencyIdToContractInput' -import { gqlTokenToCurrencyInfo } from 'uniswap/src/features/dataApi/utils/gqlTokenToCurrencyInfo' -import { Platform } from 'uniswap/src/features/platforms/types/Platform' +import { isSVMChain } from 'uniswap/src/features/platforms/utils/chains' import { fetchOnChainCurrencyBalance } from 'uniswap/src/features/portfolio/api' import { DenominatedValue, fetchIndicativeQuote, } from 'uniswap/src/features/portfolio/portfolioUpdates/fetchOnChainBalances' import { getCurrencyAmount, ValueType } from 'uniswap/src/features/tokens/getCurrencyAmount' +import { SolanaToken } from 'uniswap/src/features/tokens/SolanaToken' import { toTradingApiSupportedChainId } from 'uniswap/src/features/transactions/swap/utils/tradingApi' import { CurrencyId } from 'uniswap/src/types/currency' import { areAddressesEqual } from 'uniswap/src/utils/addresses' @@ -28,12 +27,10 @@ const FILE_NAME = 'fetchOnChainBalancesRest.ts' // Fetches real-time onchain balances for multiple currencies and converts them to Balance objects export async function fetchOnChainBalancesRest({ - apolloClient, cachedPortfolio, accountAddress, currencyIds, }: { - apolloClient: ApolloClient cachedPortfolio: NonNullable accountAddress: Address currencyIds: Set @@ -64,7 +61,7 @@ export async function fetchOnChainBalancesRest({ const cachedBalance = findCachedBalance({ cachedPortfolio, chainId, currencyAddress }) const token = cachedBalance?.token - const currencyResult = await resolveCurrency({ token, currencyId, apolloClient }) + const currencyResult = await resolveCurrency({ token, currencyId }) if (!currencyResult) { return @@ -259,49 +256,83 @@ function findCachedBalance({ } return areAddressesEqual({ - addressInput1: { address: balance.token.address, platform: Platform.EVM }, - addressInput2: { address: currencyAddress, platform: Platform.EVM }, + addressInput1: { address: balance.token.address, chainId: balance.token.chainId }, + addressInput2: { address: currencyAddress, chainId }, }) }) } -// Resolves currency metadata from cache or by fetching from GraphQL +function getCurrencyFromCache( + token: Balance['token'], + currencyId: CurrencyId, +): { currency: Token | SolanaToken; tokenInfo: null } | null { + if (!token) { + return null + } + + const currencyAddress = currencyIdToAddress(currencyId) + const chainId = currencyIdToChain(currencyId) + + if (!chainId) { + return null + } + + const currency = isSVMChain(chainId) + ? new SolanaToken(chainId, currencyAddress, token.decimals, token.symbol, token.name) + : new Token(chainId, currencyAddress, token.decimals, token.symbol, token.name) + + return { currency, tokenInfo: null } +} + +async function fetchTokenCurrencyInfo( + chainId: UniverseChainId, + address: string, +): Promise | null> { + const searchToken = await fetchTokenByAddress({ + chainId, + address, + }) + + return searchToken ? searchTokenToCurrencyInfo(searchToken) : null +} + +// Resolves `CurrencyInfo` either from cache or via REST search async function resolveCurrency({ token, currencyId, - apolloClient, }: { token?: Balance['token'] currencyId: CurrencyId - apolloClient: ApolloClient -}): Promise<{ currency: Token; tokenInfo: ReturnType | null } | null> { +}): Promise<{ currency: Token | SolanaToken; tokenInfo: ReturnType | null } | null> { const log = createLogger(FILE_NAME, 'resolveCurrency', '[REST-ITBU]') + // Try cache first if (token) { - const currencyAddress = currencyIdToAddress(currencyId) - const chainId = currencyIdToChain(currencyId) as UniverseChainId - const currency = new Token(chainId, currencyAddress, token.decimals, token.symbol, token.name) - return { currency, tokenInfo: null } + const cached = getCurrencyFromCache(token, currencyId) + if (cached) { + return cached + } } - // For new tokens not in cache, fetch token metadata from GraphQL - // TODO(WALL-7215): migrate this to REST once we have a tokens endpoint - const tokenQuery = await apolloClient.query({ - query: GraphQLApi.TokenDocument, - variables: currencyIdToContractInput(currencyId), - fetchPolicy: 'cache-first', - }) + // For new tokens not in cache, fetch token metadata via REST search + const chainId = currencyIdToChain(currencyId) + const currencyAddress = currencyIdToAddress(currencyId) + + if (!chainId || !currencyAddress) { + log.error(new Error('Invalid currencyId in `resolveCurrency`'), { currencyId }) + return null + } - const tokenInfo = tokenQuery.data.token ? gqlTokenToCurrencyInfo(tokenQuery.data.token) : null + const tokenInfo = await fetchTokenCurrencyInfo(chainId, currencyAddress) if (tokenInfo?.currency.isToken) { - log.debug('Fetched token metadata from GraphQL', { + log.debug('Fetched Token via REST Search', { currencyId, currency: tokenInfo.currency, }) return { currency: tokenInfo.currency, tokenInfo } } else { - log.warn('Could not fetch token metadata, skipping asset', { currencyId }) + log.warn('Failed to fetch Token via REST search', { currencyId }) return null } } diff --git a/packages/uniswap/src/features/portfolio/portfolioUpdates/rest/refetchRestQueriesViaOnchainOverrideVariantSaga.ts b/packages/uniswap/src/features/portfolio/portfolioUpdates/rest/refetchRestQueriesViaOnchainOverrideVariantSaga.ts index ca42115f47a..06d15b5e6b1 100644 --- a/packages/uniswap/src/features/portfolio/portfolioUpdates/rest/refetchRestQueriesViaOnchainOverrideVariantSaga.ts +++ b/packages/uniswap/src/features/portfolio/portfolioUpdates/rest/refetchRestQueriesViaOnchainOverrideVariantSaga.ts @@ -147,12 +147,10 @@ export function mergeOnChainBalances( } export async function fetchAndMergeOnchainBalances({ - apolloClient, cachedPortfolio, accountAddress, currencyIds, }: { - apolloClient: ApolloClient cachedPortfolio: Portfolio accountAddress: string currencyIds: Set @@ -165,7 +163,6 @@ export async function fetchAndMergeOnchainBalances({ try { const onchainBalancesByCurrencyId = await fetchOnChainBalancesRest({ - apolloClient, cachedPortfolio, accountAddress, currencyIds, @@ -206,7 +203,8 @@ export function* refetchRestQueriesViaOnchainOverrideVariant({ }: { transaction: TransactionDetails activeAddress: string | null - apolloClient: ApolloClient + // Only pass `null` for Solana where we don't need to refetch GQL queries + apolloClient: ApolloClient | null }): Generator { const currenciesWithBalanceToUpdate = getCurrenciesToUpdate(transaction, activeAddress) @@ -243,7 +241,6 @@ export function* refetchRestQueriesViaOnchainOverrideVariant({ yield* all( portfolioQueriesToUpdate.map((query) => call(updatePortfolioCache, { - apolloClient, ownerAddress: activeAddress, currencyIds: currenciesWithBalanceToUpdate, queryKey: query.queryKey, @@ -255,7 +252,11 @@ export function* refetchRestQueriesViaOnchainOverrideVariant({ yield* delay(REFETCH_DELAY) // Once NFTs are migrated to REST we won't need to do this - yield* call([apolloClient, apolloClient.refetchQueries], { include: [GQLQueries.NftsTab] }) + if (apolloClient) { + yield* call([apolloClient, apolloClient.refetchQueries], { include: [GQLQueries.NftsTab] }) + } else { + log.debug(`Ignoring NFT GQL refetch for ${platform} because apolloClient is null`) + } // Invalidate all portfolio queries that match this address yield* call([SharedQueryClient, SharedQueryClient.invalidateQueries], { @@ -265,12 +266,10 @@ export function* refetchRestQueriesViaOnchainOverrideVariant({ } function* updatePortfolioCache({ - apolloClient, ownerAddress, currencyIds, queryKey, }: { - apolloClient: ApolloClient ownerAddress: string currencyIds: Set queryKey: readonly unknown[] @@ -286,7 +285,6 @@ function* updatePortfolioCache({ } const mergedData = yield* call(fetchAndMergeOnchainBalances, { - apolloClient, cachedPortfolio: cachedPortfolioData.portfolio, accountAddress: ownerAddress, currencyIds, diff --git a/packages/uniswap/src/features/providers/rpcUrlSelector.ts b/packages/uniswap/src/features/providers/rpcUrlSelector.ts index 2a55c4f0abd..ec69efbbdb5 100644 --- a/packages/uniswap/src/features/providers/rpcUrlSelector.ts +++ b/packages/uniswap/src/features/providers/rpcUrlSelector.ts @@ -1,7 +1,6 @@ +import { Experiments, getExperimentValue, PrivateRpcProperties } from '@universe/gating' import { getChainInfo } from 'uniswap/src/features/chains/chainInfo' import { RPCType, UniverseChainId } from 'uniswap/src/features/chains/types' -import { Experiments, PrivateRpcProperties } from 'uniswap/src/features/gating/experiments' -import { getExperimentValue } from 'uniswap/src/features/gating/hooks' import { DEFAULT_FLASHBOTS_ENABLED, FLASHBOTS_DEFAULT_REFUND_PERCENT, diff --git a/packages/uniswap/src/features/search/SearchHistoryResult.ts b/packages/uniswap/src/features/search/SearchHistoryResult.ts index c1bf7bb3b4e..7c26f6bde7f 100644 --- a/packages/uniswap/src/features/search/SearchHistoryResult.ts +++ b/packages/uniswap/src/features/search/SearchHistoryResult.ts @@ -1,7 +1,7 @@ /* * Represents the search result types that are saved in Redux. */ -import { ProtocolVersion } from '@uniswap/client-pools/dist/pools/v1/types_pb' +import { ProtocolVersion } from '@uniswap/client-data-api/dist/data/v1/poolTypes_pb' import { UniverseChainId } from 'uniswap/src/features/chains/types' import { CurrencyId } from 'uniswap/src/types/currency' diff --git a/packages/uniswap/src/features/search/SearchModal/analytics/analytics.ts b/packages/uniswap/src/features/search/SearchModal/analytics/analytics.ts index f19b7f817d6..8af105061e1 100644 --- a/packages/uniswap/src/features/search/SearchModal/analytics/analytics.ts +++ b/packages/uniswap/src/features/search/SearchModal/analytics/analytics.ts @@ -1,4 +1,4 @@ -import { ProtocolVersion } from '@uniswap/client-pools/dist/pools/v1/types_pb' +import { ProtocolVersion } from '@uniswap/client-data-api/dist/data/v1/poolTypes_pb' import { OnchainItemListOptionType, SearchModalOption } from 'uniswap/src/components/lists/items/types' import { extractDomain } from 'uniswap/src/components/lists/items/wallets/utils' import { OnchainItemSection, OnchainItemSectionName } from 'uniswap/src/components/lists/OnchainItemList/types' diff --git a/packages/uniswap/src/features/search/SearchModal/hooks/useFilterCallbacks.ts b/packages/uniswap/src/features/search/SearchModal/hooks/useFilterCallbacks.ts index 40b45cb94fa..b27037d22b3 100644 --- a/packages/uniswap/src/features/search/SearchModal/hooks/useFilterCallbacks.ts +++ b/packages/uniswap/src/features/search/SearchModal/hooks/useFilterCallbacks.ts @@ -1,10 +1,9 @@ -import { useCallback, useEffect, useState } from 'react' -import { getChainInfo } from 'uniswap/src/features/chains/chainInfo' +import { useCallback, useEffect, useMemo, useState } from 'react' import { useEnabledChains } from 'uniswap/src/features/chains/hooks/useEnabledChains' import { UniverseChainId } from 'uniswap/src/features/chains/types' -import { isTestnetChain } from 'uniswap/src/features/chains/utils' import { ModalNameType, WalletEventName } from 'uniswap/src/features/telemetry/constants' import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send' +import { parseChainFromTokenSearchQuery } from 'uniswap/src/utils/search/parseChainFromTokenSearchQuery' export function useFilterCallbacks( chainId: UniverseChainId | null, @@ -19,9 +18,7 @@ export function useFilterCallbacks( onChangeText: (newSearchFilter: string) => void } { const [chainFilter, setChainFilter] = useState(chainId) - const [parsedChainFilter, setParsedChainFilter] = useState(null) const [searchFilter, setSearchFilter] = useState(null) - const [parsedSearchFilter, setParsedSearchFilter] = useState(null) const { chains: enabledChains } = useEnabledChains() @@ -29,44 +26,16 @@ export function useFilterCallbacks( // i.e "eth dai" or "dai eth" // parsedChainFilter: 1 // parsedSearchFilter: "dai" - useEffect(() => { - const sanitizedSearch = searchFilter?.trim().replace(' ', ' ') - const splitSearch = sanitizedSearch?.split(' ') - if (!splitSearch || splitSearch.length < 2) { - setParsedChainFilter(null) - setParsedSearchFilter(null) - return - } - - const firstWord = splitSearch[0]?.toLowerCase() - const lastWord = splitSearch[splitSearch.length - 1]?.toLowerCase() - - const firstWordChainMatch = firstWord ? getMatchingChainId(firstWord, enabledChains) : undefined - const lastWordChainMatch = lastWord ? getMatchingChainId(lastWord, enabledChains) : undefined - - if (!chainFilter && firstWordChainMatch) { - // First word is chain, rest is search term - const search = splitSearch.slice(1).join(' ') - if (search) { - setParsedChainFilter(firstWordChainMatch) - setParsedSearchFilter(search) - return + const { chainFilter: parsedChainFilter, searchTerm: parsedSearchFilter } = useMemo(() => { + // If there's already a chain filter set, don't parse chains from search text + if (chainFilter) { + return { + chainFilter: null, + searchTerm: null, } } - - if (!chainFilter && lastWordChainMatch && !firstWordChainMatch) { - // Last word is chain, preceding words are search term - const search = splitSearch.slice(0, -1).join(' ') - if (search) { - setParsedChainFilter(lastWordChainMatch) - setParsedSearchFilter(search) - return - } - } - - setParsedChainFilter(null) - setParsedSearchFilter(null) - }, [searchFilter, chainFilter, enabledChains]) + return parseChainFromTokenSearchQuery(searchFilter, enabledChains) + }, [chainFilter, searchFilter, enabledChains]) useEffect(() => { setChainFilter(chainId) @@ -99,38 +68,3 @@ export function useFilterCallbacks( onChangeText, } } - -/** - * Finds a matching chain ID based on the provided chain name. - * - * @param maybeChainName - The potential chain name to match against - * @param enabledChains - Array of enabled chain IDs to search within - * @returns The matching UniverseChainId or undefined if no match found - */ -const getMatchingChainId = (maybeChainName: string, enabledChains: UniverseChainId[]): UniverseChainId | undefined => { - const lowerCaseChainName = maybeChainName.toLowerCase() - - for (const chainId of enabledChains) { - if (isTestnetChain(chainId)) { - continue - } - - const chainInfo = getChainInfo(chainId) - - // Check against native currency name - const nativeCurrencyName = chainInfo.nativeCurrency.name.toLowerCase() - const firstWord = nativeCurrencyName.split(' ')[0] - - if (firstWord === lowerCaseChainName) { - return chainId - } - - // Check against interface name - const interfaceName = chainInfo.interfaceName.toLowerCase() - if (interfaceName === lowerCaseChainName) { - return chainId - } - } - - return undefined -} diff --git a/packages/uniswap/src/features/settings/hooks.test.ts b/packages/uniswap/src/features/settings/hooks.test.ts index b795e557ff8..0dc873ea549 100644 --- a/packages/uniswap/src/features/settings/hooks.test.ts +++ b/packages/uniswap/src/features/settings/hooks.test.ts @@ -12,7 +12,8 @@ jest.mock('utilities/src/platform', () => ({ ...jest.requireActual('utilities/src/platform'), })) -jest.mock('uniswap/src/features/gating/hooks', () => ({ +jest.mock('@universe/gating', () => ({ + ...jest.requireActual('@universe/gating'), useFeatureFlag: jest.fn(), })) diff --git a/packages/uniswap/src/features/smartWallet/mismatch/MismatchContext.tsx b/packages/uniswap/src/features/smartWallet/mismatch/MismatchContext.tsx index 3f74fc4fe33..f6b554d433c 100644 --- a/packages/uniswap/src/features/smartWallet/mismatch/MismatchContext.tsx +++ b/packages/uniswap/src/features/smartWallet/mismatch/MismatchContext.tsx @@ -1,7 +1,6 @@ +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import React, { createContext, PropsWithChildren, useContext, useMemo } from 'react' import { UniverseChainId } from 'uniswap/src/features/chains/types' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' import { MismatchAccountEffects } from 'uniswap/src/features/smartWallet/mismatch/MismatchAccountEffects' import type { HasMismatchInput, diff --git a/packages/uniswap/src/features/telemetry/constants/trace/element.ts b/packages/uniswap/src/features/telemetry/constants/trace/element.ts index 963e10245e8..24d4fb4f760 100644 --- a/packages/uniswap/src/features/telemetry/constants/trace/element.ts +++ b/packages/uniswap/src/features/telemetry/constants/trace/element.ts @@ -22,6 +22,7 @@ export enum ElementName { AutorouterVisualizationRow = 'expandable-autorouter-visualization-row', BackButton = 'back-button', BlogLink = 'blog-link', + BridgedAssetsBannerV2 = 'bridged-assets-banner-v2', BridgedAssetTDPSection = 'bridged-asset-tdp-section', BridgeNativeTokenButton = 'bridge-native-token-button', Buy = 'buy', @@ -136,6 +137,7 @@ export enum ElementName { OpenNftsList = 'open-nfts-list', PoolsTableRow = 'pools-table-row', PoolOutOfSyncError = 'pool-out-of-sync-error', + PortfolioNftItem = 'portfolio-nft-item', PreselectAsset = 'preselect-asset', PresetPercentage = 'preset-percentage', PriceUpdateAcceptButton = 'price-update-accept-button', diff --git a/packages/uniswap/src/features/telemetry/constants/trace/section.ts b/packages/uniswap/src/features/telemetry/constants/trace/section.ts index 9a3a749134a..2629576f2d2 100644 --- a/packages/uniswap/src/features/telemetry/constants/trace/section.ts +++ b/packages/uniswap/src/features/telemetry/constants/trace/section.ts @@ -16,6 +16,7 @@ export enum SectionName { ProfileActivityTab = 'profile-activity-tab', ProfileNftsTab = 'profile-nfts-tab', ProfileTokensTab = 'profile-tokens-tab', + PortfolioNftsTab = 'portfolio-nfts-tab', SwapCurrencyInput = 'swap-currency-input', SwapCurrencyOutput = 'swap-currency-output', SwapForm = 'swap-form', diff --git a/packages/uniswap/src/features/telemetry/constants/uniswap.ts b/packages/uniswap/src/features/telemetry/constants/uniswap.ts index 86e3ed35218..b1d890932eb 100644 --- a/packages/uniswap/src/features/telemetry/constants/uniswap.ts +++ b/packages/uniswap/src/features/telemetry/constants/uniswap.ts @@ -1,9 +1,10 @@ export enum UniswapEventName { BalancesReport = 'Balances Report', BalancesReportPerChain = 'Balances Report Per Chain', - TokenSelected = 'Token Selected', - ConversionEventSubmitted = 'Conversion Event Submitted', BlockaidFeesMismatch = 'Blockaid Fees Mismatch', + ConversionEventSubmitted = 'Conversion Event Submitted', + DelegationDetected = 'Delegation Detected', + ExperimentQualifyingEvent = 'Experiment Qualifying Event', LowNetworkTokenInfoModalOpened = 'Low Network Token Info Modal Opened', LpIncentiveCollectRewardsButtonClicked = 'LP Incentive Collect Rewards Button Clicked', LpIncentiveCollectRewardsErrorThrown = 'LP Incentive Collect Rewards Error Thrown', @@ -11,7 +12,7 @@ export enum UniswapEventName { LpIncentiveCollectRewardsSuccess = 'LP Incentive Collect Rewards Success', LpIncentiveLearnMoreCtaClicked = 'LP Incentive Learn More CTA Clicked', SmartWalletMismatchDetected = 'Smart Wallet Mismatch Detected', + TokenSelected = 'Token Selected', TooltipOpened = 'Tooltip Opened', - DelegationDetected = 'Delegation Detected', // alphabetize additional values. } diff --git a/packages/uniswap/src/features/telemetry/types.ts b/packages/uniswap/src/features/telemetry/types.ts index f7cc90ada26..a712650d81c 100644 --- a/packages/uniswap/src/features/telemetry/types.ts +++ b/packages/uniswap/src/features/telemetry/types.ts @@ -7,6 +7,7 @@ import { SharedEventName } from '@uniswap/analytics-events' import { OnChainStatus } from '@uniswap/client-trading/dist/trading/v1/api_pb' import { Currency, TradeType } from '@uniswap/sdk-core' import { TradingApi, UnitagClaimContext } from '@universe/api' +import { Experiments } from '@universe/gating' import type { PresetPercentage } from 'uniswap/src/components/CurrencyInputPanel/AmountInputPresets/types' import { OnchainItemSectionName } from 'uniswap/src/components/lists/OnchainItemList/types' import { UniverseChainId } from 'uniswap/src/features/chains/types' @@ -909,6 +910,9 @@ export type UniverseEventProperties = { delegationAddress: string isActiveChain?: boolean } + [UniswapEventName.ExperimentQualifyingEvent]: { + experiment: Experiments + } [UniswapEventName.BalancesReport]: { total_balances_usd: number wallets: string[] diff --git a/packages/uniswap/src/features/telemetry/utils/logExperimentQualifyingEvent.ts b/packages/uniswap/src/features/telemetry/utils/logExperimentQualifyingEvent.ts new file mode 100644 index 00000000000..983d478aee4 --- /dev/null +++ b/packages/uniswap/src/features/telemetry/utils/logExperimentQualifyingEvent.ts @@ -0,0 +1,9 @@ +import { Experiments } from '@universe/gating' +import { UniswapEventName } from 'uniswap/src/features/telemetry/constants' +import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send' + +export function logExperimentQualifyingEvent({ experiment }: { experiment: Experiments }): void { + sendAnalyticsEvent(UniswapEventName.ExperimentQualifyingEvent, { + experiment, + }) +} diff --git a/packages/uniswap/src/features/tokens/hooks/useBlockaidFeeComparisonAnalytics.ts b/packages/uniswap/src/features/tokens/hooks/useBlockaidFeeComparisonAnalytics.ts index 03957097909..54e01673dd8 100644 --- a/packages/uniswap/src/features/tokens/hooks/useBlockaidFeeComparisonAnalytics.ts +++ b/packages/uniswap/src/features/tokens/hooks/useBlockaidFeeComparisonAnalytics.ts @@ -1,8 +1,7 @@ +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import { useEffect, useRef } from 'react' import { getNativeAddress } from 'uniswap/src/constants/addresses' import { CurrencyInfo } from 'uniswap/src/features/dataApi/types' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' import { UniswapEventName } from 'uniswap/src/features/telemetry/constants' import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send.web' import { getTokenProtectionFeeOnTransfer } from 'uniswap/src/features/tokens/safetyUtils' diff --git a/packages/uniswap/src/features/transactions/components/DecimalPadInput/DecimalPad.native.tsx b/packages/uniswap/src/features/transactions/components/DecimalPadInput/DecimalPad.native.tsx index 162c20ab5ed..d94a881af3e 100644 --- a/packages/uniswap/src/features/transactions/components/DecimalPadInput/DecimalPad.native.tsx +++ b/packages/uniswap/src/features/transactions/components/DecimalPadInput/DecimalPad.native.tsx @@ -228,7 +228,7 @@ const KeyButton = memo(function KeyButton({ onPress?.(label, action) scale.value = withSequence(withTiming(1.3, animationOptions), withTiming(1, animationOptions)) opacity.value = withSequence(withTiming(0.75, animationOptions), withTiming(1, animationOptions)) - }, [action, label, onPress, opacity, scale]) + }, [action, label, onPress]) const handleLongPressStart = useCallback((): void => { onLongPressStart?.(label, action) diff --git a/packages/uniswap/src/features/transactions/components/settings/TransactionSettingsModal/TransactionSettingsModalContent/TransactionSettingsRow.tsx b/packages/uniswap/src/features/transactions/components/settings/TransactionSettingsModal/TransactionSettingsModalContent/TransactionSettingsRow.tsx index 7114bd77958..15d71a412e3 100644 --- a/packages/uniswap/src/features/transactions/components/settings/TransactionSettingsModal/TransactionSettingsModalContent/TransactionSettingsRow.tsx +++ b/packages/uniswap/src/features/transactions/components/settings/TransactionSettingsModal/TransactionSettingsModalContent/TransactionSettingsRow.tsx @@ -1,3 +1,4 @@ +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import { PropsWithChildren, ReactNode, useCallback, useState } from 'react' import { useTranslation } from 'react-i18next' import { Flex, Text, TouchableArea } from 'ui/src' @@ -5,8 +6,6 @@ import { InfoCircleFilled } from 'ui/src/components/icons/InfoCircleFilled' import { RotatableChevron } from 'ui/src/components/icons/RotatableChevron' import { iconSizes } from 'ui/src/theme' import { InfoTooltip } from 'uniswap/src/components/tooltip/InfoTooltip' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' import type { TransactionSettingConfig } from 'uniswap/src/features/transactions/components/settings/types' interface TransactionSettingRowProps { diff --git a/packages/uniswap/src/features/transactions/components/settings/settingsConfigurations/slippage/useSlippageSettings.ts b/packages/uniswap/src/features/transactions/components/settings/settingsConfigurations/slippage/useSlippageSettings.ts index 8362cfd13cd..b8640e896fb 100644 --- a/packages/uniswap/src/features/transactions/components/settings/settingsConfigurations/slippage/useSlippageSettings.ts +++ b/packages/uniswap/src/features/transactions/components/settings/settingsConfigurations/slippage/useSlippageSettings.ts @@ -152,7 +152,7 @@ export function useSlippageSettings(params?: SlippageSettingsProps): { setCustomSlippageTolerance(parsedValue) } }, - [updateInputWarning, saveOnBlur, inputShakeX, setCustomSlippageTolerance], + [updateInputWarning, saveOnBlur, setCustomSlippageTolerance], ) const onFocusSlippageInput = useCallback((): void => { diff --git a/packages/uniswap/src/features/transactions/components/settings/types.ts b/packages/uniswap/src/features/transactions/components/settings/types.ts index 06239c3491f..146767f0360 100644 --- a/packages/uniswap/src/features/transactions/components/settings/types.ts +++ b/packages/uniswap/src/features/transactions/components/settings/types.ts @@ -1,5 +1,5 @@ +import type { FeatureFlags } from '@universe/gating' import type { AppTFunction } from 'ui/src/i18n/types' -import type { FeatureFlags } from 'uniswap/src/features/gating/flags' import type { Platform } from 'uniswap/src/features/platforms/types/Platform' import type { FrontendSupportedProtocol } from 'uniswap/src/features/transactions/swap/utils/protocols' diff --git a/packages/uniswap/src/features/transactions/hooks/useGetCanSignPermits.ts b/packages/uniswap/src/features/transactions/hooks/useGetCanSignPermits.ts index 085c09ad749..70292374ffc 100644 --- a/packages/uniswap/src/features/transactions/hooks/useGetCanSignPermits.ts +++ b/packages/uniswap/src/features/transactions/hooks/useGetCanSignPermits.ts @@ -1,6 +1,5 @@ +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import { UniverseChainId } from 'uniswap/src/features/chains/types' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' import { useHasAccountMismatchCallback } from 'uniswap/src/features/smartWallet/mismatch/hooks' import { useEvent } from 'utilities/src/react/hooks' diff --git a/packages/uniswap/src/features/transactions/hooks/useGetSwapDelegationAddress.ts b/packages/uniswap/src/features/transactions/hooks/useGetSwapDelegationAddress.ts index 296c287fa6f..24e77262eea 100644 --- a/packages/uniswap/src/features/transactions/hooks/useGetSwapDelegationAddress.ts +++ b/packages/uniswap/src/features/transactions/hooks/useGetSwapDelegationAddress.ts @@ -1,6 +1,5 @@ +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import { UniverseChainId } from 'uniswap/src/features/chains/types' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' import { useEvent } from 'utilities/src/react/hooks' export function useGetSwapDelegationAddress(): (chainId: UniverseChainId | undefined) => string | undefined { diff --git a/packages/uniswap/src/features/transactions/hooks/usePollingIntervalByChain.ts b/packages/uniswap/src/features/transactions/hooks/usePollingIntervalByChain.ts index d9be83dd85d..0a750000644 100644 --- a/packages/uniswap/src/features/transactions/hooks/usePollingIntervalByChain.ts +++ b/packages/uniswap/src/features/transactions/hooks/usePollingIntervalByChain.ts @@ -1,8 +1,6 @@ +import { DynamicConfigs, FeatureFlags, SwapConfigKey, useDynamicConfigValue, useFeatureFlag } from '@universe/gating' import { UniverseChainId } from 'uniswap/src/features/chains/types' import { isMainnetChainId } from 'uniswap/src/features/chains/utils' -import { DynamicConfigs, SwapConfigKey } from 'uniswap/src/features/gating/configs' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useDynamicConfigValue, useFeatureFlag } from 'uniswap/src/features/gating/hooks' import { ONE_SECOND_MS } from 'utilities/src/time/time' export const AVERAGE_L1_BLOCK_TIME_MS = 12 * ONE_SECOND_MS diff --git a/packages/uniswap/src/features/transactions/liquidity/types.ts b/packages/uniswap/src/features/transactions/liquidity/types.ts index ba9cf518a28..9ed54c94ef5 100644 --- a/packages/uniswap/src/features/transactions/liquidity/types.ts +++ b/packages/uniswap/src/features/transactions/liquidity/types.ts @@ -1,4 +1,4 @@ -import { ProtocolVersion } from '@uniswap/client-pools/dist/pools/v1/types_pb' +import { ProtocolVersion } from '@uniswap/client-data-api/dist/data/v1/poolTypes_pb' import { Currency, CurrencyAmount, Token } from '@uniswap/sdk-core' import { TradingApi } from '@universe/api' import { PermitTransaction, PermitTypedData } from 'uniswap/src/features/transactions/swap/types/swapTxAndGasInfo' diff --git a/packages/uniswap/src/features/transactions/steps/types.ts b/packages/uniswap/src/features/transactions/steps/types.ts index 3e3d8b56e5a..6e5ee03bf76 100644 --- a/packages/uniswap/src/features/transactions/steps/types.ts +++ b/packages/uniswap/src/features/transactions/steps/types.ts @@ -1,13 +1,23 @@ +import type { TransactionResponse } from '@ethersproject/abstract-provider' import type { CollectFeesSteps } from 'uniswap/src/features/transactions/liquidity/steps/collectFeesSteps' import type { CollectLpIncentiveRewardsSteps } from 'uniswap/src/features/transactions/liquidity/steps/collectIncentiveRewardsSteps' import type { DecreaseLiquiditySteps } from 'uniswap/src/features/transactions/liquidity/steps/decreaseLiquiditySteps' import type { IncreaseLiquiditySteps } from 'uniswap/src/features/transactions/liquidity/steps/increaseLiquiditySteps' import type { MigrationSteps } from 'uniswap/src/features/transactions/liquidity/steps/migrationSteps' +import { TokenApprovalTransactionStep } from 'uniswap/src/features/transactions/steps/approve' import type { SignTypedDataStepFields } from 'uniswap/src/features/transactions/steps/permit2Signature' +import type { Permit2TransactionStep } from 'uniswap/src/features/transactions/steps/permit2Transaction' +import { TokenRevocationTransactionStep } from 'uniswap/src/features/transactions/steps/revoke' import { WrapTransactionStep } from 'uniswap/src/features/transactions/steps/wrap' +import { ExtractedBaseTradeAnalyticsProperties } from 'uniswap/src/features/transactions/swap/analytics' import type { ClassicSwapSteps } from 'uniswap/src/features/transactions/swap/steps/classicSteps' +import { SwapTransactionStep, SwapTransactionStepAsync } from 'uniswap/src/features/transactions/swap/steps/swap' import type { UniswapXSwapSteps } from 'uniswap/src/features/transactions/swap/steps/uniswapxSteps' +import { SetCurrentStepFn } from 'uniswap/src/features/transactions/swap/types/swapCallback' +import { BridgeTrade, ChainedActionTrade, ClassicTrade } from 'uniswap/src/features/transactions/swap/types/trade' +import { TransactionTypeInfo } from 'uniswap/src/features/transactions/types/transactionDetails' import type { ValidatedTransactionRequest } from 'uniswap/src/features/transactions/types/transactionRequests' +import { AccountDetails } from 'uniswap/src/features/wallet/types/AccountDetails' export enum TransactionStepType { TokenApprovalTransaction = 'TokenApproval', @@ -49,3 +59,42 @@ export interface OnChainTransactionFields { export interface OnChainTransactionFieldsBatched { batchedTxRequests: ValidatedTransactionRequest[] } + +export interface HandleOnChainStepParams { + account: AccountDetails + info: TransactionTypeInfo + step: T + setCurrentStep: SetCurrentStepFn + /** Controls whether the function allow submitting a duplicate tx (a tx w/ identical `info` to another recent/pending tx). Defaults to false. */ + allowDuplicativeTx?: boolean + /** Controls whether the function should throw an error upon interrupt or not, defaults to `false`. */ + ignoreInterrupt?: boolean + /** Controls whether the function should wait to return until after the transaction has confirmed. Defaults to `true`. */ + shouldWaitForConfirmation?: boolean + /** Called when data returned from a submitted transaction differs from data originally sent to the wallet. */ + onModification?: ( + response: Pick, + ) => void | Generator +} + +export interface HandleSignatureStepParams { + account: AccountDetails + step: T + setCurrentStep: SetCurrentStepFn + ignoreInterrupt?: boolean +} + +export type HandleApprovalStepParams = Omit< + HandleOnChainStepParams, + 'info' +> + +export type HandleOnChainPermit2TransactionStep = Omit, 'info'> + +export interface HandleSwapStepParams extends Omit { + step: SwapTransactionStep | SwapTransactionStepAsync + signature?: string + trade: ClassicTrade | BridgeTrade | ChainedActionTrade + analytics: ExtractedBaseTradeAnalyticsProperties + onTransactionHash?: (hash: string) => void +} diff --git a/packages/uniswap/src/features/transactions/swap/components/MaxSlippageRow/SlippageInfo/SlippageInfoCaption.tsx b/packages/uniswap/src/features/transactions/swap/components/MaxSlippageRow/SlippageInfo/SlippageInfoCaption.tsx index 1b27e9022c3..31bc13b6cf9 100644 --- a/packages/uniswap/src/features/transactions/swap/components/MaxSlippageRow/SlippageInfo/SlippageInfoCaption.tsx +++ b/packages/uniswap/src/features/transactions/swap/components/MaxSlippageRow/SlippageInfo/SlippageInfoCaption.tsx @@ -75,7 +75,7 @@ export function SlippageInfoCaption({ : t('swap.settings.slippage.output.message')}{' '} {isWebPlatform && ( - + )} diff --git a/packages/uniswap/src/features/transactions/swap/components/SwapFormButton/hooks/useSwapFormButtonText.ts b/packages/uniswap/src/features/transactions/swap/components/SwapFormButton/hooks/useSwapFormButtonText.ts index 37794aa417e..292ec06cc5f 100644 --- a/packages/uniswap/src/features/transactions/swap/components/SwapFormButton/hooks/useSwapFormButtonText.ts +++ b/packages/uniswap/src/features/transactions/swap/components/SwapFormButton/hooks/useSwapFormButtonText.ts @@ -1,8 +1,7 @@ +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import { useTranslation } from 'react-i18next' import { nativeOnChain } from 'uniswap/src/constants/tokens' import { useConnectionStatus } from 'uniswap/src/features/accounts/store/hooks' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' import { isSVMChain } from 'uniswap/src/features/platforms/utils/chains' import { useIsWebFORNudgeEnabled } from 'uniswap/src/features/providers/webForNudgeProvider' import { useTransactionModalContext } from 'uniswap/src/features/transactions/components/TransactionModal/TransactionModalContext' diff --git a/packages/uniswap/src/features/transactions/swap/components/SwapFormSettings/settingsConfigurations/TradeRoutingPreference/TradeRoutingPreferenceScreen.tsx b/packages/uniswap/src/features/transactions/swap/components/SwapFormSettings/settingsConfigurations/TradeRoutingPreference/TradeRoutingPreferenceScreen.tsx index 96b0727a14e..6a68c8df6a3 100644 --- a/packages/uniswap/src/features/transactions/swap/components/SwapFormSettings/settingsConfigurations/TradeRoutingPreference/TradeRoutingPreferenceScreen.tsx +++ b/packages/uniswap/src/features/transactions/swap/components/SwapFormSettings/settingsConfigurations/TradeRoutingPreference/TradeRoutingPreferenceScreen.tsx @@ -1,4 +1,5 @@ import { TradingApi } from '@universe/api' +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import type { TFunction } from 'i18next' import type { ReactNode } from 'react' import { useCallback, useState } from 'react' @@ -16,11 +17,8 @@ import { InfoTooltip } from 'uniswap/src/components/tooltip/InfoTooltip' import WarningIcon from 'uniswap/src/components/warnings/WarningIcon' import { uniswapUrls } from 'uniswap/src/constants/urls' import { useUniswapContextSelector } from 'uniswap/src/contexts/UniswapContext' - import { getChainInfo } from 'uniswap/src/features/chains/chainInfo' import { UniverseChainId } from 'uniswap/src/features/chains/types' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' import { ElementName, ModalName } from 'uniswap/src/features/telemetry/constants' import Trace from 'uniswap/src/features/telemetry/Trace' import { TransactionSettingsModalId } from 'uniswap/src/features/transactions/components/settings/stores/TransactionSettingsModalStore/createTransactionSettingsModalStore' diff --git a/packages/uniswap/src/features/transactions/swap/components/UnichainInstantBalanceModal/AnimatedTokenFlip.tsx b/packages/uniswap/src/features/transactions/swap/components/UnichainInstantBalanceModal/AnimatedTokenFlip.tsx index 13fca286d05..21aa4e2fdbf 100644 --- a/packages/uniswap/src/features/transactions/swap/components/UnichainInstantBalanceModal/AnimatedTokenFlip.tsx +++ b/packages/uniswap/src/features/transactions/swap/components/UnichainInstantBalanceModal/AnimatedTokenFlip.tsx @@ -23,7 +23,7 @@ export function AnimatedTokenFlip({ duration: 600, easing: Easing.bezier(0.68, -0.3, 0.265, 1.3), }) - }, [processingState, flipAnimation]) + }, [processingState]) const handleTokenClick = (): void => { setProcessingState((prev) => (prev === 'complete' ? 'processing' : 'complete')) diff --git a/packages/uniswap/src/features/transactions/swap/components/UnichainInstantBalanceModal/GradientContainer.native.tsx b/packages/uniswap/src/features/transactions/swap/components/UnichainInstantBalanceModal/GradientContainer.native.tsx index 3bc29963a45..f477b40bbbc 100644 --- a/packages/uniswap/src/features/transactions/swap/components/UnichainInstantBalanceModal/GradientContainer.native.tsx +++ b/packages/uniswap/src/features/transactions/swap/components/UnichainInstantBalanceModal/GradientContainer.native.tsx @@ -33,7 +33,7 @@ export function GradientContainer({ toTokenColor, children }: GradientContainerP blobT1.value = withRepeat(withTiming(1, cfg), -1, true) blobT2.value = withRepeat(withTiming(1, { ...cfg, duration: 16000 }), -1, true) blobT3.value = withRepeat(withTiming(1, { ...cfg, duration: 7000 }), -1, true) - }, [blobT1, blobT2, blobT3]) + }, []) const blob1 = useAnimatedStyle(() => { const innerT = blobT1.value * Math.PI * 2 diff --git a/packages/uniswap/src/features/transactions/swap/components/UnichainInstantBalanceModal/GradientContainer.web.tsx b/packages/uniswap/src/features/transactions/swap/components/UnichainInstantBalanceModal/GradientContainer.web.tsx index 91e0f69d8a7..dfe2d111a64 100644 --- a/packages/uniswap/src/features/transactions/swap/components/UnichainInstantBalanceModal/GradientContainer.web.tsx +++ b/packages/uniswap/src/features/transactions/swap/components/UnichainInstantBalanceModal/GradientContainer.web.tsx @@ -27,7 +27,7 @@ export function GradientContainer({ toTokenColor, children }: GradientContainerP blobT1.value = withRepeat(withTiming(1, cfg), -1, true) blobT2.value = withRepeat(withTiming(1, { ...cfg, duration: 16000 }), -1, true) blobT3.value = withRepeat(withTiming(1, { ...cfg, duration: 7000 }), -1, true) - }, [blobT1, blobT2, blobT3]) + }, []) const blob1 = useAnimatedStyle(() => { const innerT = blobT1.value * Math.PI * 2 diff --git a/packages/uniswap/src/features/transactions/swap/components/UnichainInstantBalanceModal/hooks/receiptFetching/useReceiptSuccessHandler.ts b/packages/uniswap/src/features/transactions/swap/components/UnichainInstantBalanceModal/hooks/receiptFetching/useReceiptSuccessHandler.ts index df86321ffe6..ff2f988a4f3 100644 --- a/packages/uniswap/src/features/transactions/swap/components/UnichainInstantBalanceModal/hooks/receiptFetching/useReceiptSuccessHandler.ts +++ b/packages/uniswap/src/features/transactions/swap/components/UnichainInstantBalanceModal/hooks/receiptFetching/useReceiptSuccessHandler.ts @@ -3,9 +3,10 @@ import { JsonRpcProvider, TransactionReceipt } from '@ethersproject/providers' import { useCallback } from 'react' import { useDispatch } from 'react-redux' import { useTransactionModalContext } from 'uniswap/src/features/transactions/components/TransactionModal/TransactionModalContext' -import { updateTransaction } from 'uniswap/src/features/transactions/slice' +import { updateTransactionWithoutWatch } from 'uniswap/src/features/transactions/slice' import { getOutputAmountUsingSwapLogAndFormData } from 'uniswap/src/features/transactions/swap/components/UnichainInstantBalanceModal/getOutputAmountFromSwapLogAndFormData.ts/getOutputAmountFromSwapLogAndFormData' import { + logSwapTransactionCompleted, NO_OUTPUT_ERROR, reportOutputAmount, } from 'uniswap/src/features/transactions/swap/components/UnichainInstantBalanceModal/hooks/receiptFetching/utils' @@ -75,16 +76,19 @@ export function useReceiptSuccessHandler(): (params: ReceiptSuccessParams) => Pr // updates if the tx is successful so we know to fallback to the form value updateSwapForm({ instantReceiptFetchTime: methodFetchTime - methodRoundtripTime }) - // TODO(APPS-8546): move to a saga to avoid anti-pattern + // TODO(SWAP-407): move to a saga to avoid anti-pattern const parsedReceipt = receiptFromEthersReceipt(receipt, methodFetchTime) - dispatch( - updateTransaction({ - ...transaction, - receipt: parsedReceipt, - status: TransactionStatus.Success, - ...(isWebApp && { isFlashblockTxWithinThreshold }), - }), - ) + + const updatedTransaction = { + ...transaction, + receipt: parsedReceipt, + status: TransactionStatus.Success, + ...(isWebApp && { isFlashblockTxWithinThreshold }), + } + + dispatch(updateTransactionWithoutWatch(updatedTransaction)) + + logSwapTransactionCompleted(updatedTransaction) // Try to get output amount from transfer logs first const outputAmountFromOutputTransferLog = getOutputAmountUsingOutputTransferLog({ diff --git a/packages/uniswap/src/features/transactions/swap/components/UnichainInstantBalanceModal/hooks/receiptFetching/utils.ts b/packages/uniswap/src/features/transactions/swap/components/UnichainInstantBalanceModal/hooks/receiptFetching/utils.ts index 13e4794ad3d..fe449760247 100644 --- a/packages/uniswap/src/features/transactions/swap/components/UnichainInstantBalanceModal/hooks/receiptFetching/utils.ts +++ b/packages/uniswap/src/features/transactions/swap/components/UnichainInstantBalanceModal/hooks/receiptFetching/utils.ts @@ -1,6 +1,13 @@ import { BigNumber } from '@ethersproject/bignumber' +import { TradeType } from '@uniswap/sdk-core' +import { SwapEventName } from 'uniswap/src/features/telemetry/constants' +import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send' import { TransactionScreen } from 'uniswap/src/features/transactions/components/TransactionModal/TransactionModalContext' +import { getRouteAnalyticsData, tradeRoutingToFillType } from 'uniswap/src/features/transactions/swap/analytics' import { SwapFormState } from 'uniswap/src/features/transactions/swap/stores/swapFormStore/types' +import { SwapEventType, timestampTracker } from 'uniswap/src/features/transactions/swap/utils/SwapEventTimestampTracker' +import { TransactionDetails, TransactionType } from 'uniswap/src/features/transactions/types/transactionDetails' +import { isWebApp } from 'utilities/src/platform' export const NO_OUTPUT_ERROR = 'No output amount found in receipt logs' @@ -43,3 +50,74 @@ export function resetSwapFormAndReturnToForm({ updateSwapForm, setScreen }: Rese }) setScreen(TransactionScreen.Form) } + +/** + * TODO(SWAP-407): do NOT copy this logic when moving to a saga; we should restore the original watcher+logging logic once we make the switch + * Logs swap transaction completion analytics for web app + */ +export function logSwapTransactionCompleted(updatedTransaction: TransactionDetails): void { + if (updatedTransaction.typeInfo.type !== TransactionType.Swap || !updatedTransaction.hash || !isWebApp) { + return + } + + const { hash, chainId, addedTime, from, typeInfo, transactionOriginType, routing, id, receipt } = updatedTransaction + const gasUsed = receipt?.gasUsed + const effectiveGasPrice = receipt?.effectiveGasPrice + const confirmedTime = receipt?.confirmedTime + const includesDelegation = 'options' in updatedTransaction ? updatedTransaction.options.includesDelegation : undefined + const isSmartWalletTransaction = + 'options' in updatedTransaction ? updatedTransaction.options.isSmartWalletTransaction : undefined + + const { + quoteId, + gasUseEstimate, + inputCurrencyId, + outputCurrencyId, + transactedUSDValue, + tradeType, + slippageTolerance, + routeString, + protocol, + simulationFailureReasons, + } = typeInfo + + const baseProperties = { + routing: tradeRoutingToFillType({ routing, indicative: false }), + id, + hash, + transactionOriginType, + address: from, + chain_id: chainId, + added_time: addedTime, + confirmed_time: confirmedTime, + gas_used: gasUsed, + effective_gas_price: effectiveGasPrice, + inputCurrencyId, + outputCurrencyId, + gasUseEstimate, + quoteId, + submitViaPrivateRpc: + 'options' in updatedTransaction ? (updatedTransaction.options.submitViaPrivateRpc ?? false) : undefined, + transactedUSDValue, + tradeType: tradeType === TradeType.EXACT_INPUT ? 'EXACT_INPUT' : 'EXACT_OUTPUT', + slippageTolerance, + route: routeString, + protocol, + simulation_failure_reasons: simulationFailureReasons, + includes_delegation: includesDelegation, + is_smart_wallet_transaction: isSmartWalletTransaction, + ...getRouteAnalyticsData(updatedTransaction), + } + + // Log swap success with time-to-swap tracking + const hasSetSwapSuccess = timestampTracker.hasTimestamp(SwapEventType.FirstSwapSuccess) + const elapsedTime = timestampTracker.setElapsedTime(SwapEventType.FirstSwapSuccess) + + sendAnalyticsEvent(SwapEventName.SwapTransactionCompleted, { + ...baseProperties, + time_to_swap: hasSetSwapSuccess ? undefined : elapsedTime, + time_to_swap_since_first_input: hasSetSwapSuccess + ? undefined + : timestampTracker.getElapsedTime(SwapEventType.FirstSwapSuccess, SwapEventType.FirstSwapAction), + }) +} diff --git a/packages/uniswap/src/features/transactions/swap/form/SwapFormScreen/SwapFormDecimalPad/SwapFormDecimalPad.native.tsx b/packages/uniswap/src/features/transactions/swap/form/SwapFormScreen/SwapFormDecimalPad/SwapFormDecimalPad.native.tsx index db1ca5bebbb..b766c8c4cd8 100644 --- a/packages/uniswap/src/features/transactions/swap/form/SwapFormScreen/SwapFormDecimalPad/SwapFormDecimalPad.native.tsx +++ b/packages/uniswap/src/features/transactions/swap/form/SwapFormScreen/SwapFormDecimalPad/SwapFormDecimalPad.native.tsx @@ -1,10 +1,16 @@ import type { MutableRefObject, RefObject } from 'react' -import { useMemo, useState } from 'react' +import { useCallback, useMemo, useState } from 'react' import type { LayoutChangeEvent, TextInputProps } from 'react-native' import { type ButtonProps, Flex, type FlexProps } from 'ui/src' -import { AmountInputPresets } from 'uniswap/src/components/CurrencyInputPanel/AmountInputPresets/AmountInputPresets' +import { + AmountInputPresets, + PRESET_BUTTON_PROPS, +} from 'uniswap/src/components/CurrencyInputPanel/AmountInputPresets/AmountInputPresets' +import { PresetAmountButton } from 'uniswap/src/components/CurrencyInputPanel/AmountInputPresets/PresetAmountButton' import type { PresetPercentage } from 'uniswap/src/components/CurrencyInputPanel/AmountInputPresets/types' +import { PRESET_PERCENTAGES } from 'uniswap/src/components/CurrencyInputPanel/AmountInputPresets/utils' import { MAX_FIAT_INPUT_DECIMALS } from 'uniswap/src/constants/transactions' +import { ElementName } from 'uniswap/src/features/telemetry/constants' import type { DecimalPadInputRef } from 'uniswap/src/features/transactions/components/DecimalPadInput/DecimalPadInput' import { DecimalPadCalculatedSpaceId, @@ -122,6 +128,21 @@ function SwapFormDecimalPadContent({ setAdditionalElementsHeight(event.nativeEvent.layout.height) }) + const renderPreset = useCallback( + (preset: PresetPercentage) => ( + + ), + [currencyAmounts[CurrencyField.INPUT], currencyBalances[CurrencyField.INPUT], onSetPresetValue], + ) + return ( <> )} diff --git a/packages/uniswap/src/features/transactions/swap/hooks/useIsForFiltersEnabled.ts b/packages/uniswap/src/features/transactions/swap/hooks/useIsForFiltersEnabled.ts index a0c81fe6965..34b8e52f31c 100644 --- a/packages/uniswap/src/features/transactions/swap/hooks/useIsForFiltersEnabled.ts +++ b/packages/uniswap/src/features/transactions/swap/hooks/useIsForFiltersEnabled.ts @@ -1,5 +1,4 @@ -import { Experiments, ForFiltersProperties } from 'uniswap/src/features/gating/experiments' -import { useExperimentValue } from 'uniswap/src/features/gating/hooks' +import { Experiments, ForFiltersProperties, useExperimentValue } from '@universe/gating' /** * Hook to determine if ForFilters feature should be enabled diff --git a/packages/uniswap/src/features/transactions/swap/hooks/useIsUnichainFlashblocksEnabled.ts b/packages/uniswap/src/features/transactions/swap/hooks/useIsUnichainFlashblocksEnabled.ts index f222c7b8e74..aa88f876b33 100644 --- a/packages/uniswap/src/features/transactions/swap/hooks/useIsUnichainFlashblocksEnabled.ts +++ b/packages/uniswap/src/features/transactions/swap/hooks/useIsUnichainFlashblocksEnabled.ts @@ -1,24 +1,56 @@ -import { UniverseChainId } from 'uniswap/src/features/chains/types' -import { Experiments, Layers, UnichainFlashblocksProperties } from 'uniswap/src/features/gating/experiments' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' +import { TradingApi } from '@universe/api' import { + Experiments, + FeatureFlags, getExperimentValueFromLayer, getFeatureFlag, + Layers, + UnichainFlashblocksProperties, useExperimentValueFromLayer, useFeatureFlag, -} from 'uniswap/src/features/gating/hooks' +} from '@universe/gating' +import { UniverseChainId } from 'uniswap/src/features/chains/types' +import { shouldShowFlashblocksUI } from 'uniswap/src/features/transactions/swap/components/UnichainInstantBalanceModal/utils' import { isWebApp } from 'utilities/src/platform' /** - * Hook to determine if Unichain flashblocks feature should be enabled + * Core logic to determine if Flashblocks modal should be enabled. * Returns true only when: * 1. The UnichainFlashblocks feature flag is enabled - * 2. The UnichainFlashblocksModal experiment is enabled (via SwapPage layer) - only on interface - * 3. The current chain is Unichain mainnet or Unichain sepolia + * 2. The user is allocated to the UnichainFlashblocksModal experiment in the SwapPage layer (web only) + * 3. The flashblocksModalEnabled parameter is true for that experiment + * 4. The current chain is Unichain mainnet or Unichain sepolia + */ +function isFlashblocksModalEnabledForChain({ + flashblocksFlagEnabled, + flashblocksModalEnabled, + chainId, +}: { + flashblocksFlagEnabled: boolean + flashblocksModalEnabled: boolean + chainId?: UniverseChainId +}): boolean { + // Check feature flag on all platforms + if (!flashblocksFlagEnabled) { + return false + } + + // Only check experiment on the web app + if (isWebApp && !flashblocksModalEnabled) { + return false + } + + return chainId === UniverseChainId.Unichain || chainId === UniverseChainId.UnichainSepolia +} + +/** + * Hook to determine if the Flashblocks modal should be enabled. + * Uses React hooks to read feature flags and experiments. */ export function useIsUnichainFlashblocksEnabled(chainId?: UniverseChainId): boolean { - const flashblocksFlag = useFeatureFlag(FeatureFlags.UnichainFlashblocks) - const flashblocksExperiment = useExperimentValueFromLayer< + const flashblocksFlagEnabled = useFeatureFlag(FeatureFlags.UnichainFlashblocks) + + const flashblocksModalEnabled = useExperimentValueFromLayer< Layers.SwapPage, Experiments.UnichainFlashblocksModal, boolean @@ -28,29 +60,17 @@ export function useIsUnichainFlashblocksEnabled(chainId?: UniverseChainId): bool defaultValue: false, }) - // Check feature flag on all platforms - if (!flashblocksFlag) { - return false - } - - // Only check experiment on interface platform - if (isWebApp && !flashblocksExperiment) { - return false - } - - return chainId === UniverseChainId.Unichain || chainId === UniverseChainId.UnichainSepolia + return isFlashblocksModalEnabledForChain({ flashblocksFlagEnabled, flashblocksModalEnabled, chainId }) } /** - * Sync function to check if Unichain flashblocks feature is enabled - * Returns true only when: - * 1. The UnichainFlashblocks feature flag is enabled - * 2. The UnichainFlashblocksModal experiment is enabled (via SwapPage layer) - only on interface - * 3. The current chain is Unichain mainnet or Unichain sepolia + * Sync function to determine if the Flashblocks modal should be enabled. + * Uses direct getters to read feature flags and experiments. */ export function getIsFlashblocksEnabled(chainId?: UniverseChainId): boolean { - const flashblocksFlag = getFeatureFlag(FeatureFlags.UnichainFlashblocks) - const flashblocksExperiment = getExperimentValueFromLayer< + const flashblocksFlagEnabled = getFeatureFlag(FeatureFlags.UnichainFlashblocks) + + const flashblocksModalEnabled = getExperimentValueFromLayer< Layers.SwapPage, Experiments.UnichainFlashblocksModal, boolean @@ -60,15 +80,56 @@ export function getIsFlashblocksEnabled(chainId?: UniverseChainId): boolean { defaultValue: false, }) - // Check feature flag on all platforms - if (!flashblocksFlag) { - return false + return isFlashblocksModalEnabledForChain({ flashblocksFlagEnabled, flashblocksModalEnabled, chainId }) +} + +export function getFlashblocksExperimentStatus({ + chainId, + routing, +}: { + chainId?: UniverseChainId + routing?: TradingApi.Routing +}): { + /** Whether to log a qualifying event (swap is eligible) */ + shouldLogQualifyingEvent: boolean + /** Whether to show the flashblocks modal (treatment variant) */ + shouldShowModal: boolean +} { + // Skip routes are not part of the experiment + if (!shouldShowFlashblocksUI(routing)) { + return { shouldLogQualifyingEvent: false, shouldShowModal: false } } - // Only check experiment on interface platform - if (isWebApp && !flashblocksExperiment) { - return false + const flashblocksFlagEnabled = getFeatureFlag(FeatureFlags.UnichainFlashblocks) + const isUnichainChain = chainId === UniverseChainId.Unichain || chainId === UniverseChainId.UnichainSepolia + + if (!flashblocksFlagEnabled || !isUnichainChain) { + return { shouldLogQualifyingEvent: false, shouldShowModal: false } } - return chainId === UniverseChainId.Unichain || chainId === UniverseChainId.UnichainSepolia + // Mobile/Extension: no experiment, feature flag controls behavior + if (!isWebApp) { + return { shouldLogQualifyingEvent: false, shouldShowModal: true } + } + + // Web: experiment controls behavior + const flashblocksModalEnabled = getExperimentValueFromLayer< + Layers.SwapPage, + Experiments.UnichainFlashblocksModal, + boolean + >({ + layerName: Layers.SwapPage, + param: UnichainFlashblocksProperties.FlashblocksModalEnabled, + defaultValue: false, + }) + + return { + // TRUE for all users that reach this point, even if they're not part of the experiment. + // Statsig will later filter out non-allocated users because it applies the auto-exposure filter first, + // and then filters by users that triggered this event *after* being exposed to the experiment. + // More info: https://docs.statsig.com/statsig-warehouse-native/configuration/qualifying-events + shouldLogQualifyingEvent: true, + // TRUE for treatment variant or forced override + shouldShowModal: flashblocksModalEnabled === true, + } } diff --git a/packages/uniswap/src/features/transactions/swap/hooks/useNeedsBridgedAssetWarning.ts b/packages/uniswap/src/features/transactions/swap/hooks/useNeedsBridgedAssetWarning.ts index 1738fa4984d..9569aea3b84 100644 --- a/packages/uniswap/src/features/transactions/swap/hooks/useNeedsBridgedAssetWarning.ts +++ b/packages/uniswap/src/features/transactions/swap/hooks/useNeedsBridgedAssetWarning.ts @@ -1,5 +1,4 @@ import { useMemo } from 'react' -import { checkIsBridgedAsset } from 'uniswap/src/components/BridgedAsset/utils' import { TradeableAsset } from 'uniswap/src/entities/assets' import { CurrencyInfo } from 'uniswap/src/features/dataApi/types' import { useDismissedBridgedAssetWarnings } from 'uniswap/src/features/tokens/slice/hooks' @@ -38,19 +37,14 @@ export function useNeedsBridgedAssetWarning( outputCurrencyId && prefilledCurrencies?.some((currency) => currencyId(currency).toLowerCase() === outputCurrencyId.toLowerCase()) - if ( - inputCurrencyInfo && - !inputTokenWarningPreviouslyDismissed && - isInputPrefilled && - checkIsBridgedAsset(inputCurrencyInfo) - ) { + if (inputCurrencyInfo && !inputTokenWarningPreviouslyDismissed && isInputPrefilled && inputCurrencyInfo.isBridged) { tokens.push(inputCurrencyInfo) } if ( outputCurrencyInfo && !outputTokenWarningPreviouslyDismissed && isOutputPrefilled && - checkIsBridgedAsset(outputCurrencyInfo) + outputCurrencyInfo.isBridged ) { tokens.push(outputCurrencyInfo) } diff --git a/packages/uniswap/src/features/transactions/swap/hooks/usePriceUXEnabled.ts b/packages/uniswap/src/features/transactions/swap/hooks/usePriceUXEnabled.ts index a6ae0d406b3..cd339b827d5 100644 --- a/packages/uniswap/src/features/transactions/swap/hooks/usePriceUXEnabled.ts +++ b/packages/uniswap/src/features/transactions/swap/hooks/usePriceUXEnabled.ts @@ -1,5 +1,4 @@ -import { Experiments, Layers, PriceUxUpdateProperties } from 'uniswap/src/features/gating/experiments' -import { useExperimentValueFromLayer } from 'uniswap/src/features/gating/hooks' +import { Experiments, Layers, PriceUxUpdateProperties, useExperimentValueFromLayer } from '@universe/gating' export function usePriceUXEnabled(): boolean { const expValueFromLayer = useExperimentValueFromLayer({ diff --git a/packages/uniswap/src/features/transactions/swap/plan/planSaga.ts b/packages/uniswap/src/features/transactions/swap/plan/planSaga.ts new file mode 100644 index 00000000000..c3c8351dbcf --- /dev/null +++ b/packages/uniswap/src/features/transactions/swap/plan/planSaga.ts @@ -0,0 +1,243 @@ +import { Currency, CurrencyAmount } from '@uniswap/sdk-core' +import { PlanStepStatus, TradingApi } from '@universe/api' +import { call, delay, SagaGenerator } from 'typed-redux-saga' +import { TradingApiClient } from 'uniswap/src/data/apiClients/tradingApi/TradingApiClient' +import { getChainInfo } from 'uniswap/src/features/chains/chainInfo' +import { UnexpectedTransactionStateError } from 'uniswap/src/features/transactions/errors' +import type { + HandleApprovalStepParams, + HandleSignatureStepParams, + HandleSwapStepParams, +} from 'uniswap/src/features/transactions/steps/types' +import { TransactionStep, TransactionStepType } from 'uniswap/src/features/transactions/steps/types' +import { ExtractedBaseTradeAnalyticsProperties } from 'uniswap/src/features/transactions/swap/analytics' +import { TransactionAndPlanStep, transformSteps } from 'uniswap/src/features/transactions/swap/plan/planStepTransformer' +import { findFirstActionableStep, stepHasFinalized } from 'uniswap/src/features/transactions/swap/plan/utils' +import { SetCurrentStepFn } from 'uniswap/src/features/transactions/swap/types/swapCallback' +import { ValidatedSwapTxContext } from 'uniswap/src/features/transactions/swap/types/swapTxAndGasInfo' +import { isChained, requireRouting } from 'uniswap/src/features/transactions/swap/utils/routing' +import { SignerMnemonicAccountDetails } from 'uniswap/src/features/wallet/types/AccountDetails' +import { createSaga } from 'uniswap/src/utils/saga' +import { logger } from 'utilities/src/logger/logger' + +type SwapParams = { + selectChain: (chainId: number) => Promise + startChainId?: number + account: SignerMnemonicAccountDetails + analytics: ExtractedBaseTradeAnalyticsProperties + swapTxContext: ValidatedSwapTxContext + setCurrentStep: SetCurrentStepFn + setSteps: (steps: TransactionStep[]) => void + getOnPressRetry: (error: Error | undefined) => (() => void) | undefined + disableOneClickSwap: () => void + onSuccess: () => void + onFailure: (error?: Error, onPressRetry?: () => void) => void + onTransactionHash?: (hash: string) => void + v4Enabled: boolean +} + +type PlanCalls = { + handleApprovalTransactionStep: (params: HandleApprovalStepParams) => SagaGenerator + handleSwapTransactionStep: (params: HandleSwapStepParams) => SagaGenerator + handleSignatureStep: (params: HandleSignatureStepParams) => SagaGenerator + getDisplayableError: ({ + error, + step, + flow, + }: { + error: Error + step?: TransactionStep + flow?: string + }) => Error | undefined +} + +const MAX_ATTEMPTS = 60 + +/** + * Waits for a the target step to complete by polling the plan for the given planId and targetStepId. + * + * @returns The updated steps or no steps + */ +function* waitForStepCompletion(params: { + chainId: number + tradeId: string + targetStepId: string + currentStepIndex: number + inputAmount: CurrencyAmount +}): SagaGenerator { + const { chainId, tradeId, targetStepId, currentStepIndex, inputAmount } = params + + const pollingInterval = getChainInfo(chainId).tradingApiPollingIntervalMs + let attempt = 0 + + try { + while (attempt < MAX_ATTEMPTS) { + logger.debug('planSaga', 'waitForStepCompletion', 'waiting for step completion', { + currentStepIndex, + attempt, + maxAttempts: MAX_ATTEMPTS, + }) + + const tradeStatusResponse = yield* call(TradingApiClient.getExistingTrade, { tradeId }) + const latestTargetStep = tradeStatusResponse.steps.find((_step) => _step.stepId === targetStepId) + if (!latestTargetStep) { + throw new Error(`Target stepId=${targetStepId} not found in latest plan.`) + } + if (stepHasFinalized(latestTargetStep)) { + return transformSteps(tradeStatusResponse.steps, inputAmount) + } + attempt++ + yield* delay(pollingInterval) + } + throw new Error(`Exceeded ${MAX_ATTEMPTS} attempts waiting for step completion`) + } catch (error) { + logger.error(error, { tags: { file: 'planSaga', function: 'waitForStepCompletion' } }) + throw error + } +} + +/** + * Saga for executing a plan returned from the Trading API. This plan + * includes a list of steps to be executed in sequence in order to execute + * various actions such as a signature, approval, or swap. + * + * If a inputTradeId exists, it will use that existing plan and refresh the + * plan before beginning execution. As steps are executed, the proofs are sent + * to the TAPI to update the plan. As the steps are executed, the plan continues + * to execute the next step until all last step is confirmed. + */ +function* plan(params: SwapParams & PlanCalls) { + const { + account, + setCurrentStep, + setSteps, + swapTxContext, + analytics, + onSuccess, + onFailure, + selectChain, + handleApprovalTransactionStep, + handleSwapTransactionStep, + handleSignatureStep, + getDisplayableError, + } = params + + logger.debug('planSaga', 'plan', '🚨 plan saga started', swapTxContext) + if (!isChained(swapTxContext)) { + onFailure(new Error('Route not enabled for the plan saga')) + return + } + + const { trade, tradeId: inputTradeId } = swapTxContext + + let response + if (!inputTradeId) { + response = yield* call(TradingApiClient.fetchNewTrade, { + quote: swapTxContext.trade.quote.quote, + }) + } else { + response = yield* call(TradingApiClient.updateExistingTrade, { tradeId: inputTradeId, steps: [] }) + } + let steps: TransactionAndPlanStep[] = transformSteps(response.steps, swapTxContext.trade.inputAmount) + const tradeId = response.tradeId + + let currentStepIndex = steps.findIndex((step) => step.status !== PlanStepStatus.COMPLETE) + let currentStep = steps[currentStepIndex] + setSteps(steps) + if (currentStep) { + setCurrentStep({ step: currentStep, accepted: false }) + } + + try { + while (currentStepIndex < steps.length) { + let signature: string | undefined + let hash: string | undefined + + currentStep = steps[currentStepIndex] + const isLastStep = currentStepIndex === steps.length - 1 + + logger.debug('planSaga', 'plan', '🚨 Starting step', currentStep) + + // @ts-expect-error TODO: SWAP-458 - Temporary fix for chainId until fromChainId is finalized + const swapChainId = currentStep?.chainId || currentStep?.fromChainId || currentStep?.txRequest?.chainId + if (swapChainId) { + yield* call(selectChain, swapChainId) + } + + switch (currentStep?.type) { + case TransactionStepType.TokenRevocationTransaction: + case TransactionStepType.TokenApprovalTransaction: { + hash = yield* call(handleApprovalTransactionStep, { account, step: currentStep, setCurrentStep }) + break + } + case TransactionStepType.Permit2Signature: { + signature = yield* call(handleSignatureStep, { account, step: currentStep, setCurrentStep }) + break + } + case TransactionStepType.SwapTransaction: + case TransactionStepType.SwapTransactionAsync: { + requireRouting(trade, [TradingApi.Routing.CLASSIC, TradingApi.Routing.BRIDGE, TradingApi.Routing.CHAINED]) + hash = yield* call(handleSwapTransactionStep, { + account, + signature, + step: currentStep, + setCurrentStep, + trade, + analytics, + allowDuplicativeTx: true, + }) + break + } + default: { + throw new UnexpectedTransactionStateError(`Unexpected step type: ${currentStep?.type}`) + } + } + + if (hash || signature) { + logger.debug('planSaga', 'plan', '🚨 updating existing trade', tradeId, hash, signature) + yield* call(TradingApiClient.updateExistingTrade, { + tradeId, + steps: [{ stepId: currentStep.stepId, proof: { txHash: hash, signature } }], + }) + } else { + throw new Error('No hash or signature found.') + } + + if (isLastStep) { + yield* call(onSuccess) + return + } + + const updatedSteps: TransactionAndPlanStep[] = yield* call(waitForStepCompletion, { + chainId: swapChainId, + tradeId, + targetStepId: currentStep.stepId, + currentStepIndex, + inputAmount: swapTxContext.trade.inputAmount, + }) + logger.debug('planSaga', 'plan', '🚨 updated steps', updatedSteps) + const nextStep = findFirstActionableStep(updatedSteps) + if (nextStep) { + steps = updatedSteps + setSteps(steps) + setCurrentStep({ step: nextStep, accepted: false }) + currentStepIndex = steps.findIndex((s) => s.stepId === nextStep.stepId) + } else { + throw new Error('No next step found') + } + } + } catch (error) { + const displayableError = getDisplayableError({ + error: error instanceof Error ? error : new Error('Unknown error'), + step: currentStep, + }) + if (displayableError) { + logger.error(displayableError, { tags: { file: 'planSaga', function: 'plan' } }) + } + const onPressRetry = params.getOnPressRetry(displayableError) + onFailure(displayableError, onPressRetry) + return + } +} + +export const planSaga = createSaga(plan, 'planSaga') diff --git a/packages/uniswap/src/features/transactions/swap/plan/planStepTransformer.ts b/packages/uniswap/src/features/transactions/swap/plan/planStepTransformer.ts new file mode 100644 index 00000000000..a9b1a620b78 --- /dev/null +++ b/packages/uniswap/src/features/transactions/swap/plan/planStepTransformer.ts @@ -0,0 +1,62 @@ +import { Currency, CurrencyAmount } from '@uniswap/sdk-core' +import { Method, PlanStep } from '@universe/api' +import { createApprovalTransactionStep } from 'uniswap/src/features/transactions/steps/approve' +import { createPermit2SignatureStep } from 'uniswap/src/features/transactions/steps/permit2Signature' +import { TransactionStep } from 'uniswap/src/features/transactions/steps/types' +import { createSwapTransactionStep } from 'uniswap/src/features/transactions/swap/steps/swap' +import { + validatePermitTypeGuard, + validateTransactionRequestTypeGuard, +} from 'uniswap/src/features/transactions/swap/utils/trade' + +const ERC20_APPROVE_TX_PREFIX = '0x095ea7b3' + +export type TransactionAndPlanStep = TransactionStep & PlanStep + +export const transformStep = ( + step: PlanStep, + inputAmount: CurrencyAmount, +): TransactionAndPlanStep | undefined => { + switch (step.method) { + case Method.SIGN_MSG: + if (!validatePermitTypeGuard(step.payload)) { + return undefined + } + return { + ...step, + ...createPermit2SignatureStep(step.payload, inputAmount.currency), + } + case Method.SEND_TX: + if (!validateTransactionRequestTypeGuard(step.payload)) { + return undefined + } + if (step.payload.data?.toString().startsWith(ERC20_APPROVE_TX_PREFIX)) { + const approvalStep = createApprovalTransactionStep({ + txRequest: step.payload, + amountIn: inputAmount, + }) + if (!approvalStep) { + return undefined + } + return { + ...step, + ...approvalStep, + } + } else { + return { + ...step, + ...createSwapTransactionStep(step.payload), + } + } + // TODO: SWAP-433 - Handle send smart wallet transactions + case Method.SEND_CALLS: + default: + return undefined + } +} + +export const transformSteps = (steps: PlanStep[], inputAmount: CurrencyAmount): TransactionAndPlanStep[] => { + return steps + .map((step) => transformStep(step, inputAmount)) + .filter((step): step is TransactionAndPlanStep => step !== undefined) +} diff --git a/packages/uniswap/src/features/transactions/swap/plan/utils.ts b/packages/uniswap/src/features/transactions/swap/plan/utils.ts new file mode 100644 index 00000000000..967bcb6ba6a --- /dev/null +++ b/packages/uniswap/src/features/transactions/swap/plan/utils.ts @@ -0,0 +1,35 @@ +import { PlanStep, PlanStepStatus } from '@universe/api' +import { TransactionAndPlanStep } from 'uniswap/src/features/transactions/swap/plan/planStepTransformer' +import { ValidatedSwapTxContext } from 'uniswap/src/features/transactions/swap/types/swapTxAndGasInfo' +import { isJupiter } from 'uniswap/src/features/transactions/swap/utils/routing' + +/** Switches to the proper chain, if needed. If a chain switch is necessary and it fails, returns success=false. */ +export async function handleSwitchChains(params: { + selectChain: (chainId: number) => Promise + startChainId?: number + swapTxContext: ValidatedSwapTxContext +}): Promise<{ chainSwitchFailed: boolean }> { + const { selectChain, startChainId, swapTxContext } = params + + const swapChainId = swapTxContext.trade.inputAmount.currency.chainId + + if (isJupiter(swapTxContext) || swapChainId === startChainId) { + return { chainSwitchFailed: false } + } + + const chainSwitched = await selectChain(swapChainId) + + return { chainSwitchFailed: !chainSwitched } +} + +export function stepHasFinalized(step: PlanStep): boolean { + return step.status === PlanStepStatus.COMPLETE || step.status === PlanStepStatus.STEP_ERROR +} + +export function findFirstActionableStep(steps: T[]): T | undefined { + return steps.find((step) => step.status === PlanStepStatus.AWAITING_ACTION) +} + +export function allStepsComplete(steps: PlanStep[]): boolean { + return steps.every((step) => step.status === PlanStepStatus.COMPLETE) +} diff --git a/packages/uniswap/src/features/transactions/swap/review/hooks/useCreateSwapReviewCallbacks.tsx b/packages/uniswap/src/features/transactions/swap/review/hooks/useCreateSwapReviewCallbacks.tsx index 000086bee42..92de3528f62 100644 --- a/packages/uniswap/src/features/transactions/swap/review/hooks/useCreateSwapReviewCallbacks.tsx +++ b/packages/uniswap/src/features/transactions/swap/review/hooks/useCreateSwapReviewCallbacks.tsx @@ -95,6 +95,7 @@ export function useCreateSwapReviewCallbacks(ctx: { const onSuccess = useCallback(() => { // For Unichain networks, trigger confirmation and branch to stall+fetch logic (ie handle in component) if (isFlashblocksEnabled && shouldShowConfirmedState) { + resetCurrentStep() updateSwapForm({ isConfirmed: true, isSubmitting: false, @@ -125,7 +126,7 @@ export function useCreateSwapReviewCallbacks(ctx: { setScreen(TransactionScreen.Form) } onClose() - }, [setScreen, updateSwapForm, onClose, isFlashblocksEnabled, shouldShowConfirmedState]) + }, [setScreen, updateSwapForm, onClose, isFlashblocksEnabled, shouldShowConfirmedState, resetCurrentStep]) const onPending = useCallback(() => { // Skip pending UI only for Unichain networks with flashblocks-compatible routes diff --git a/packages/uniswap/src/features/transactions/swap/review/services/swapTxAndGasInfoService/hooks.ts b/packages/uniswap/src/features/transactions/swap/review/services/swapTxAndGasInfoService/hooks.ts index 12ba0034d82..5defe3a6ac2 100644 --- a/packages/uniswap/src/features/transactions/swap/review/services/swapTxAndGasInfoService/hooks.ts +++ b/packages/uniswap/src/features/transactions/swap/review/services/swapTxAndGasInfoService/hooks.ts @@ -1,12 +1,11 @@ import type { UseQueryResult } from '@tanstack/react-query' import { queryOptions, useQuery } from '@tanstack/react-query' import { GasStrategy, TradingApi } from '@universe/api' +import { DynamicConfigs, SwapConfigKey, useDynamicConfigValue } from '@universe/gating' import { useMemo } from 'react' import { useUniswapContext } from 'uniswap/src/contexts/UniswapContext' import type { UniverseChainId } from 'uniswap/src/features/chains/types' import { useActiveGasStrategy } from 'uniswap/src/features/gas/hooks' -import { DynamicConfigs, SwapConfigKey } from 'uniswap/src/features/gating/configs' -import { useDynamicConfigValue } from 'uniswap/src/features/gating/hooks' import type { SwapDelegationInfo } from 'uniswap/src/features/smartWallet/delegation/types' import { useAllTransactionSettings } from 'uniswap/src/features/transactions/components/settings/stores/transactionSettingsStore/useTransactionSettingsStore' import { useV4SwapEnabled } from 'uniswap/src/features/transactions/swap/hooks/useV4SwapEnabled' diff --git a/packages/uniswap/src/features/transactions/swap/stores/swapFormStore/hooks/useDerivedSwapInfo.ts b/packages/uniswap/src/features/transactions/swap/stores/swapFormStore/hooks/useDerivedSwapInfo.ts index a739bf55eda..7339325a376 100644 --- a/packages/uniswap/src/features/transactions/swap/stores/swapFormStore/hooks/useDerivedSwapInfo.ts +++ b/packages/uniswap/src/features/transactions/swap/stores/swapFormStore/hooks/useDerivedSwapInfo.ts @@ -1,10 +1,9 @@ import { TradeType } from '@uniswap/sdk-core' +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import { useMemo } from 'react' import { useUniswapContextSelector } from 'uniswap/src/contexts/UniswapContext' import { useEnabledChains } from 'uniswap/src/features/chains/hooks/useEnabledChains' import { UniverseChainId } from 'uniswap/src/features/chains/types' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' import { useOnChainCurrencyBalance } from 'uniswap/src/features/portfolio/api' import { getCurrencyAmount, ValueType } from 'uniswap/src/features/tokens/getCurrencyAmount' import { useCurrencyInfo } from 'uniswap/src/features/tokens/useCurrencyInfo' diff --git a/packages/uniswap/src/features/transactions/swap/stores/swapTxStore/SwapTxStoreContextProvider.tsx b/packages/uniswap/src/features/transactions/swap/stores/swapTxStore/SwapTxStoreContextProvider.tsx index 839d41380c7..601393df715 100644 --- a/packages/uniswap/src/features/transactions/swap/stores/swapTxStore/SwapTxStoreContextProvider.tsx +++ b/packages/uniswap/src/features/transactions/swap/stores/swapTxStore/SwapTxStoreContextProvider.tsx @@ -1,6 +1,5 @@ +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import { useEffect, useState } from 'react' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' import { useSwapTxAndGasInfo as useServiceBasedSwapTxAndGasInfo } from 'uniswap/src/features/transactions/swap/review/services/swapTxAndGasInfoService/hooks' import { useSwapFormStore } from 'uniswap/src/features/transactions/swap/stores/swapFormStore/useSwapFormStore' import { createSwapTxStore } from 'uniswap/src/features/transactions/swap/stores/swapTxStore/createSwapTxStore' diff --git a/packages/uniswap/src/features/transactions/swap/stores/swapTxStore/hooks/useTransactionRequestInfo.test.ts b/packages/uniswap/src/features/transactions/swap/stores/swapTxStore/hooks/useTransactionRequestInfo.test.ts index ca576871813..f640823efd8 100644 --- a/packages/uniswap/src/features/transactions/swap/stores/swapTxStore/hooks/useTransactionRequestInfo.test.ts +++ b/packages/uniswap/src/features/transactions/swap/stores/swapTxStore/hooks/useTransactionRequestInfo.test.ts @@ -25,9 +25,9 @@ jest.mock( useAllTransactionSettings: jest.fn(), }), ) -jest.mock('uniswap/src/features/gating/hooks', () => { +jest.mock('@universe/gating', () => { return { - ...jest.requireActual('uniswap/src/features/gating/hooks'), + ...jest.requireActual('@universe/gating'), useDynamicConfigValue: jest .fn() .mockImplementation(({ defaultValue }: { config: unknown; key: unknown; defaultValue: unknown }) => { diff --git a/packages/uniswap/src/features/transactions/swap/stores/swapTxStore/hooks/useTransactionRequestInfo.ts b/packages/uniswap/src/features/transactions/swap/stores/swapTxStore/hooks/useTransactionRequestInfo.ts index 7649e9a3f63..78f27648f34 100644 --- a/packages/uniswap/src/features/transactions/swap/stores/swapTxStore/hooks/useTransactionRequestInfo.ts +++ b/packages/uniswap/src/features/transactions/swap/stores/swapTxStore/hooks/useTransactionRequestInfo.ts @@ -1,11 +1,9 @@ import { TradingApi } from '@universe/api' +import { DynamicConfigs, SwapConfigKey, useDynamicConfigValue } from '@universe/gating' import { useEffect, useMemo, useRef } from 'react' import { useUniswapContextSelector } from 'uniswap/src/contexts/UniswapContext' import { useTradingApiSwapQuery } from 'uniswap/src/data/apiClients/tradingApi/useTradingApiSwapQuery' - import { useActiveGasStrategy } from 'uniswap/src/features/gas/hooks' -import { DynamicConfigs, SwapConfigKey } from 'uniswap/src/features/gating/configs' -import { useDynamicConfigValue } from 'uniswap/src/features/gating/hooks' import { useAllTransactionSettings } from 'uniswap/src/features/transactions/components/settings/stores/transactionSettingsStore/useTransactionSettingsStore' import { FALLBACK_SWAP_REQUEST_POLL_INTERVAL_MS } from 'uniswap/src/features/transactions/swap/review/services/swapTxAndGasInfoService/constants' import { processUniswapXResponse } from 'uniswap/src/features/transactions/swap/review/services/swapTxAndGasInfoService/uniswapx/utils' diff --git a/packages/uniswap/src/features/transactions/swap/types/trade.ts b/packages/uniswap/src/features/transactions/swap/types/trade.ts index f2c8f0910ef..6433e8dd70b 100644 --- a/packages/uniswap/src/features/transactions/swap/types/trade.ts +++ b/packages/uniswap/src/features/transactions/swap/types/trade.ts @@ -848,6 +848,7 @@ export class ChainedActionTrade { readonly indicative = false readonly tradeType: TradeType = TradeType.EXACT_INPUT readonly deadline: undefined + readonly priceImpact: undefined // depends on trade type. since exact input, max amount in is the input amount readonly maxAmountIn: CurrencyAmount diff --git a/packages/uniswap/src/features/transactions/swap/utils/getIsWebForNudgeEnabled.ts b/packages/uniswap/src/features/transactions/swap/utils/getIsWebForNudgeEnabled.ts index b83f8a7cd6a..7cb7c6fe964 100644 --- a/packages/uniswap/src/features/transactions/swap/utils/getIsWebForNudgeEnabled.ts +++ b/packages/uniswap/src/features/transactions/swap/utils/getIsWebForNudgeEnabled.ts @@ -1,5 +1,4 @@ -import { Experiments, WebFORNudgesProperties } from 'uniswap/src/features/gating/experiments' -import { getExperimentValue } from 'uniswap/src/features/gating/hooks' +import { Experiments, getExperimentValue, WebFORNudgesProperties } from '@universe/gating' import { isWebApp } from 'utilities/src/platform' export function getIsWebFORNudgeEnabled(): boolean { diff --git a/packages/uniswap/src/features/transactions/swap/utils/protocols.test.ts b/packages/uniswap/src/features/transactions/swap/utils/protocols.test.ts index f6e395ff91c..5911aa798f9 100644 --- a/packages/uniswap/src/features/transactions/swap/utils/protocols.test.ts +++ b/packages/uniswap/src/features/transactions/swap/utils/protocols.test.ts @@ -1,8 +1,7 @@ import { TradingApi } from '@universe/api' +import { FeatureFlags, getFeatureFlag } from '@universe/gating' import { createGetSupportedChainId } from 'uniswap/src/features/chains/hooks/useSupportedChainId' import { UniverseChainId } from 'uniswap/src/features/chains/types' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { getFeatureFlag } from 'uniswap/src/features/gating/hooks' import { createGetV4SwapEnabled } from 'uniswap/src/features/transactions/swap/hooks/useV4SwapEnabled' import { createGetProtocolsForChain, @@ -11,7 +10,8 @@ import { FrontendSupportedProtocol, } from 'uniswap/src/features/transactions/swap/utils/protocols' -jest.mock('uniswap/src/features/gating/hooks', () => ({ +jest.mock('@universe/gating', () => ({ + ...jest.requireActual('@universe/gating'), useFeatureFlag: jest.fn(), getFeatureFlag: jest.fn(), })) diff --git a/packages/uniswap/src/features/transactions/swap/utils/protocols.ts b/packages/uniswap/src/features/transactions/swap/utils/protocols.ts index 75006c824f9..8f0fa23647f 100644 --- a/packages/uniswap/src/features/transactions/swap/utils/protocols.ts +++ b/packages/uniswap/src/features/transactions/swap/utils/protocols.ts @@ -1,11 +1,9 @@ import { TradingApi } from '@universe/api' +import { FeatureFlags, getFeatureFlag, useFeatureFlag } from '@universe/gating' import { useMemo } from 'react' import { useUniswapContextSelector } from 'uniswap/src/contexts/UniswapContext' - import { createGetSupportedChainId } from 'uniswap/src/features/chains/hooks/useSupportedChainId' import { UniverseChainId } from 'uniswap/src/features/chains/types' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { getFeatureFlag, useFeatureFlag } from 'uniswap/src/features/gating/hooks' import { createGetV4SwapEnabled, useV4SwapEnabled } from 'uniswap/src/features/transactions/swap/hooks/useV4SwapEnabled' export const DEFAULT_PROTOCOL_OPTIONS = [ diff --git a/packages/uniswap/src/features/transactions/swap/utils/routing.ts b/packages/uniswap/src/features/transactions/swap/utils/routing.ts index 6ffc30ac3cd..7fb00f6f68c 100644 --- a/packages/uniswap/src/features/transactions/swap/utils/routing.ts +++ b/packages/uniswap/src/features/transactions/swap/utils/routing.ts @@ -1,6 +1,6 @@ import { ADDRESS_ZERO } from '@uniswap/v3-sdk' import { TradingApi } from '@universe/api' - +import { UnexpectedTransactionStateError } from 'uniswap/src/features/transactions/errors' import { type SwapTxAndGasInfo } from 'uniswap/src/features/transactions/swap/types/swapTxAndGasInfo' import { type ValidatedTransactionRequest } from 'uniswap/src/features/transactions/types/transactionRequests' @@ -56,6 +56,16 @@ export function getEVMTxRequest(swapTxContext: SwapTxAndGasInfo): ValidatedTrans return swapTxContext.txRequests?.[0] } +/** Asserts that a given object fits a given routing variant. */ +export function requireRouting( + val: V, + routing: readonly T[], +): asserts val is V & { routing: T } { + if (!routing.includes(val.routing as T)) { + throw new UnexpectedTransactionStateError(`Expected routing ${routing}, got ${val.routing}`) + } +} + export const ACROSS_DAPP_INFO = { name: 'Across API', address: ADDRESS_ZERO, diff --git a/packages/uniswap/src/features/transactions/swap/utils/trade.ts b/packages/uniswap/src/features/transactions/swap/utils/trade.ts index 322130dd229..83958b8a754 100644 --- a/packages/uniswap/src/features/transactions/swap/utils/trade.ts +++ b/packages/uniswap/src/features/transactions/swap/utils/trade.ts @@ -208,6 +208,12 @@ export function validateTransactionRequest( return undefined } +export function validateTransactionRequestTypeGuard( + request?: providers.TransactionRequest | null, +): request is ValidatedTransactionRequest { + return !!request?.to && !!request.chainId +} + export function validateTransactionRequests( requests?: providers.TransactionRequest[] | null, ): PopulatedTransactionRequestArray | undefined { @@ -243,6 +249,10 @@ export function validatePermit(permit: TradingApi.NullablePermit | undefined): V return undefined } +export function validatePermitTypeGuard(permit: TradingApi.NullablePermit | undefined): permit is ValidatedPermit { + return !!permit && !!permit.domain && !!permit.types && !!permit.values +} + export function hasTradeType( typeInfo: TransactionTypeInfo, ): typeInfo is ExactInputSwapTransactionInfo | ExactOutputSwapTransactionInfo { diff --git a/packages/uniswap/src/features/transactions/swap/utils/tradingApi.test.ts b/packages/uniswap/src/features/transactions/swap/utils/tradingApi.test.ts index ea189390fa8..4eeb93197d6 100644 --- a/packages/uniswap/src/features/transactions/swap/utils/tradingApi.test.ts +++ b/packages/uniswap/src/features/transactions/swap/utils/tradingApi.test.ts @@ -1,12 +1,13 @@ import { TradingApi } from '@universe/api' +import { useFeatureFlag } from '@universe/gating' import { UniverseChainId } from 'uniswap/src/features/chains/types' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' import type { FrontendSupportedProtocol } from 'uniswap/src/features/transactions/swap/utils/protocols' import { useProtocolsForChain } from 'uniswap/src/features/transactions/swap/utils/protocols' import { useQuoteRoutingParams } from 'uniswap/src/features/transactions/swap/utils/tradingApi' import { renderHook } from 'uniswap/src/test/test-utils' -jest.mock('uniswap/src/features/gating/hooks', () => ({ +jest.mock('@universe/gating', () => ({ + ...jest.requireActual('@universe/gating'), useFeatureFlag: jest.fn(), })) jest.mock('uniswap/src/features/transactions/swap/utils/protocols', () => ({ diff --git a/packages/uniswap/src/features/transactions/swap/utils/tradingApi.ts b/packages/uniswap/src/features/transactions/swap/utils/tradingApi.ts index 42610ca00ab..c4e0bd27bc0 100644 --- a/packages/uniswap/src/features/transactions/swap/utils/tradingApi.ts +++ b/packages/uniswap/src/features/transactions/swap/utils/tradingApi.ts @@ -8,12 +8,11 @@ import type { FeeAmount } from '@uniswap/v3-sdk' import { Pool as V3Pool, Route as V3Route } from '@uniswap/v3-sdk' import { Pool as V4Pool, Route as V4Route } from '@uniswap/v4-sdk' import { type ClassicQuoteResponse, type DiscriminatedQuoteResponse, TradingApi } from '@universe/api' +import { DynamicConfigs, getDynamicConfigValue, SwapConfigKey } from '@universe/gating' import { nativeOnChain } from 'uniswap/src/constants/tokens' import { getChainInfo } from 'uniswap/src/features/chains/chainInfo' import type { UniverseChainId } from 'uniswap/src/features/chains/types' import { isUniverseChainId } from 'uniswap/src/features/chains/utils' -import { DynamicConfigs, SwapConfigKey } from 'uniswap/src/features/gating/configs' -import { getDynamicConfigValue } from 'uniswap/src/features/gating/hooks' import { getCurrencyAmount, ValueType } from 'uniswap/src/features/tokens/getCurrencyAmount' import type { Trade } from 'uniswap/src/features/transactions/swap/types/trade' import { diff --git a/packages/uniswap/src/features/unitags/ClaimUnitagContent.tsx b/packages/uniswap/src/features/unitags/ClaimUnitagContent.tsx index a170222c2c2..86e557aceb0 100644 --- a/packages/uniswap/src/features/unitags/ClaimUnitagContent.tsx +++ b/packages/uniswap/src/features/unitags/ClaimUnitagContent.tsx @@ -131,13 +131,7 @@ export function ClaimUnitagContent({ }) return unsubscribe - }, [ - navigationEventConsumer, - showTextInputView, - addressViewOpacity, - unitagInputContainerTranslateY, - focusUnitagTextInput, - ]) + }, [navigationEventConsumer, showTextInputView, focusUnitagTextInput]) const onChangeTextInput = useCallback( (text: string): void => { @@ -196,15 +190,7 @@ export function ClaimUnitagContent({ } }, initialDelay + translateYDuration) }, - [ - onComplete, - onNavigateContinue, - addressViewOpacity, - entryPoint, - unitagAddress, - unitagInputContainerTranslateY, - fontSize, - ], + [onComplete, onNavigateContinue, entryPoint, unitagAddress, fontSize], ) useEffect(() => { diff --git a/packages/uniswap/src/i18n/locales/source/en-US.json b/packages/uniswap/src/i18n/locales/source/en-US.json index aaa13e3aee8..21e6ace68d0 100644 --- a/packages/uniswap/src/i18n/locales/source/en-US.json +++ b/packages/uniswap/src/i18n/locales/source/en-US.json @@ -144,14 +144,15 @@ "bridgedAsset.send.warning.description": "You’re sending a wrapped version of {{currencySymbol}} on {{chainName}}. Sending it to a centralized exchange will result in a permanent loss of funds.", "bridgedAsset.send.warning.title": "Make sure you’re sending to a compatible address", "bridgedAsset.tdp.description": "This is a bridged version of {{currencySymbol}} that is 1:1 backed by native {{currencySymbol}}.", - "bridgedAsset.wormhole.button": "Continue to Wormhole", - "bridgedAsset.wormhole.description": "Continue to the Wormhole portal to bridge your {{currencySymbol}} from {{chainName}} to {{nativeChainName}}.", + "bridgedAsset.wormhole.button": "Continue to {{provider}}", + "bridgedAsset.wormhole.description": "Continue to the {{provider}} portal to bridge your {{currencySymbol}} from {{chainName}} to {{nativeChainName}}.", "bridgedAsset.wormhole.title": "Withdraw {{currencySymbol}} to {{nativeChainName}}", "bridgedAsset.wormhole.toNativeChain": "to {{nativeChainName}}", "bridgedAsset.wormhole.withdrawToNativeChain": "Withdraw to {{nativeChainName}}", "bridging.estimatedTime.minutesAndSeconds": "~{{minutes}}min {{seconds}}s", "bridging.estimatedTime.minutesOnly": "~{{minutes}}min", "bridging.estimatedTime.secondsOnly": "~{{seconds}}s", + "bridgingPopularTokens.banner.description": "DOGE, XRP, XLP — now available on Unichain.", "chart.candlestick": "Candlestick", "chart.error.pools": "Unable to display historical data for the current pool.", "chart.error.tokens": "Unable to display historical data for the current token.", @@ -1437,17 +1438,32 @@ "poolFinder.availablePools.notFound.description": "No matching v2 pools found. Double-check your token selection and ensure you’re connected to the correct wallet.", "pools.explore": "Explore pools", "portfolio.activity.filters.timePeriod.all": "All time", + "portfolio.activity.filters.transactionType.addLiquidity": "Add Liquidity", "portfolio.activity.filters.transactionType.all": "All types", - "portfolio.activity.filters.transactionType.deposits": "Deposits", - "portfolio.activity.filters.transactionType.staking": "Staking", + "portfolio.activity.filters.transactionType.approvals": "Approvals", + "portfolio.activity.filters.transactionType.claimFees": "Claim Fees", + "portfolio.activity.filters.transactionType.createPool": "Create Pool", + "portfolio.activity.filters.transactionType.mints": "Mints", + "portfolio.activity.filters.transactionType.removeLiquidity": "Remove Liquidity", "portfolio.activity.filters.transactionType.swaps": "Swaps", + "portfolio.activity.filters.transactionType.wraps": "Wraps", + "portfolio.activity.table.column.address": "Address", + "portfolio.activity.table.column.amount": "Amount", + "portfolio.activity.table.column.time": "Time", + "portfolio.activity.table.column.type": "Type", "portfolio.activity.title": "Activity", - "portfolio.connectWallet.summary": "Track tokens, pools, and more across {{amount}}+ networks", "portfolio.defi.title": "DeFi", "portfolio.description": "Track your crypto portfolio across all chains and protocols", + "portfolio.disconnected.connectWallet.cta": "Track your portfolio", + "portfolio.disconnected.cta.description": "Track tokens, positions, NFTs and more across {{numNetworks}}+ networks", + "portfolio.disconnected.demoWallet.description": "This is a view-only example. Connect your wallet to manage your portfolio.", + "portfolio.disconnected.demoWallet.title": "Demo wallet", + "portfolio.disconnected.viewYourPortfolio.cta": "to view your portfolio", "portfolio.nfts.title": "NFTs", "portfolio.overview.title": "Overview", "portfolio.title": "Portfolio", + "portfolio.tokens.balance.totalTokens": "{{numTokens}} tokens", + "portfolio.tokens.emptyState": "No tokens", "portfolio.tokens.table.column.allocation": "Allocation", "portfolio.tokens.table.column.balance": "Balance", "portfolio.tokens.table.column.change1d": "1D Change", diff --git a/packages/uniswap/src/i18n/locales/translations/af-ZA.json b/packages/uniswap/src/i18n/locales/translations/af-ZA.json index 40119ecf73d..d714754e9dc 100644 --- a/packages/uniswap/src/i18n/locales/translations/af-ZA.json +++ b/packages/uniswap/src/i18n/locales/translations/af-ZA.json @@ -1675,6 +1675,7 @@ "settings.action.lock": "Sluit beursie", "settings.action.privacy": "Privaatheidsbeleid", "settings.action.terms": "Diensbepalings", + "settings.connectWalletPlatform.warning": "Om Uniswap op {{platform}}te gebruik, koppel aan 'n beursie wat {{platform}}ondersteun.", "settings.footer": "Met liefde gemaak, \nUniswap-span 🦄", "settings.hideSmallBalances": "Versteek klein saldo's", "settings.hideSmallBalances.subtitle": "Saldo's onder 1 USD sal van jou portefeulje weggesteek word.", @@ -1845,7 +1846,7 @@ "smartWallets.postSwapNudge.title.dapp": "Hierdie toepassing ondersteun slim beursies", "smartWallets.unavailableModal.description": "'n Ander beursieverskaffer bestuur nou slim beursie-instellings vir {{displayName}}. Jy kan Uniswap soos normaalweg voortgaan om te gebruik.", "smartWallets.unavailableModal.title": "Slim beursie-kenmerke is nie beskikbaar nie", - "solanaPromo.banner.description": "Ruil Solana-tokens direk op die Uniswap-webtoepassing.", + "solanaPromo.banner.description": "Ruil Solana-tokens direk op Uniswap.", "solanaPromo.banner.title": "Solana is nou beskikbaar", "solanaPromo.modal.connectWallet": "Koppel jou gunsteling Solana-beursie", "solanaPromo.modal.startSwapping.button": "Begin omruil op Solana", diff --git a/packages/uniswap/src/i18n/locales/translations/ar-SA.json b/packages/uniswap/src/i18n/locales/translations/ar-SA.json index 3e628872b83..a10e2e0aef2 100644 --- a/packages/uniswap/src/i18n/locales/translations/ar-SA.json +++ b/packages/uniswap/src/i18n/locales/translations/ar-SA.json @@ -1675,6 +1675,7 @@ "settings.action.lock": "قفل المحفظة", "settings.action.privacy": "سياسة الخصوصية", "settings.action.terms": "شروط الخدمة", + "settings.connectWalletPlatform.warning": "لاستخدام Uniswap على {{platform}}، قم بالاتصال بمحفظة تدعم {{platform}}.", "settings.footer": "صُنع بكل حب، \nفريق Uniswap 🦄", "settings.hideSmallBalances": "إخفاء الأرصدة الصغيرة", "settings.hideSmallBalances.subtitle": "سيتم إخفاء الأرصدة التي تقل عن 1 دولار أمريكي من محفظتك.", @@ -1845,7 +1846,7 @@ "smartWallets.postSwapNudge.title.dapp": "يدعم هذا التطبيق المحافظ الذكية", "smartWallets.unavailableModal.description": "يُدير موفر محفظة آخر إعدادات المحفظة الذكية لـ {{displayName}}. يمكنك الاستمرار في استخدام Uniswap كالمعتاد.", "smartWallets.unavailableModal.title": "ميزات المحفظة الذكية غير متوفرة", - "solanaPromo.banner.description": "قم بتداول رموز Solana مباشرة على تطبيق Uniswap Web App.", + "solanaPromo.banner.description": "قم بتداول رموز Solana مباشرة على Uniswap.", "solanaPromo.banner.title": "سولانا متاحة الآن", "solanaPromo.modal.connectWallet": "قم بتوصيل محفظة Solana المفضلة لديك", "solanaPromo.modal.startSwapping.button": "ابدأ بالتبديل على سولانا", diff --git a/packages/uniswap/src/i18n/locales/translations/ca-ES.json b/packages/uniswap/src/i18n/locales/translations/ca-ES.json index 7bd08ae2841..3fecdb8ce51 100644 --- a/packages/uniswap/src/i18n/locales/translations/ca-ES.json +++ b/packages/uniswap/src/i18n/locales/translations/ca-ES.json @@ -1675,6 +1675,7 @@ "settings.action.lock": "Bloqueja la cartera", "settings.action.privacy": "Política de privacitat", "settings.action.terms": "Termes del servei", + "settings.connectWalletPlatform.warning": "Per utilitzar Uniswap a {{platform}}, connecteu-vos a un moneder que admeti {{platform}}.", "settings.footer": "Fet amb amor, \nUniswap Team 🦄", "settings.hideSmallBalances": "Amaga petits saldos", "settings.hideSmallBalances.subtitle": "Els saldos inferiors a 1 USD s'amagaran de la vostra cartera.", @@ -1845,7 +1846,7 @@ "smartWallets.postSwapNudge.title.dapp": "Aquesta aplicació admet moneders intel·ligents", "smartWallets.unavailableModal.description": "Un proveïdor de moneders diferent ara gestiona la configuració del moneder intel·ligent per a {{displayName}}. Podeu continuar utilitzant Uniswap com sempre.", "smartWallets.unavailableModal.title": "Les funcions de la cartera intel·ligent no estan disponibles", - "solanaPromo.banner.description": "Intercanvia tokens de Solana directament a l'aplicació web Uniswap.", + "solanaPromo.banner.description": "Intercanvia fitxes de Solana directament a Uniswap.", "solanaPromo.banner.title": "Solana ja està disponible", "solanaPromo.modal.connectWallet": "Connecta la teva cartera Solana preferida", "solanaPromo.modal.startSwapping.button": "Comença a intercanviar a Solana", diff --git a/packages/uniswap/src/i18n/locales/translations/da-DK.json b/packages/uniswap/src/i18n/locales/translations/da-DK.json index 6b105874916..f084b805e68 100644 --- a/packages/uniswap/src/i18n/locales/translations/da-DK.json +++ b/packages/uniswap/src/i18n/locales/translations/da-DK.json @@ -1675,6 +1675,7 @@ "settings.action.lock": "Lås pung", "settings.action.privacy": "Fortrolighedspolitik", "settings.action.terms": "Servicevilkår", + "settings.connectWalletPlatform.warning": "For at bruge Uniswap på {{platform}}skal du oprette forbindelse til en tegnebog, der understøtter {{platform}}.", "settings.footer": "Lavet med kærlighed, \nUniswap Team 🦄", "settings.hideSmallBalances": "Skjul små saldi", "settings.hideSmallBalances.subtitle": "Saldi under 1 USD vil blive skjult fra din portefølje.", @@ -1845,7 +1846,7 @@ "smartWallets.postSwapNudge.title.dapp": "Denne app understøtter smarte tegnebøger", "smartWallets.unavailableModal.description": "En anden wallet-udbyder administrerer nu smart wallet-indstillinger for {{displayName}}. Du kan fortsætte med at bruge Uniswap som normalt.", "smartWallets.unavailableModal.title": "Smart wallet-funktioner er ikke tilgængelige", - "solanaPromo.banner.description": "Handl Solana-tokens direkte på Uniswap-webappen.", + "solanaPromo.banner.description": "Handl Solana-tokens direkte på Uniswap.", "solanaPromo.banner.title": "Solana er nu tilgængelig", "solanaPromo.modal.connectWallet": "Tilslut din foretrukne Solana-pung", "solanaPromo.modal.startSwapping.button": "Begynd at bytte på Solana", diff --git a/packages/uniswap/src/i18n/locales/translations/el-GR.json b/packages/uniswap/src/i18n/locales/translations/el-GR.json index 54df5b70ffa..2bae3774d7b 100644 --- a/packages/uniswap/src/i18n/locales/translations/el-GR.json +++ b/packages/uniswap/src/i18n/locales/translations/el-GR.json @@ -1675,6 +1675,7 @@ "settings.action.lock": "Κλείδωμα πορτοφολιού", "settings.action.privacy": "Πολιτική απορρήτου", "settings.action.terms": "Οροι χρήσης", + "settings.connectWalletPlatform.warning": "Για να χρησιμοποιήσετε το Uniswap στο {{platform}}, συνδεθείτε σε ένα πορτοφόλι που υποστηρίζει το {{platform}}.", "settings.footer": "Φτιαγμένο με αγάπη, \nUniswap Team 🦄", "settings.hideSmallBalances": "Απόκρυψη μικρών υπολοίπων", "settings.hideSmallBalances.subtitle": "Υπόλοιπα κάτω του 1 USD θα κρυφτούν από το χαρτοφυλάκιό σας.", @@ -1845,7 +1846,7 @@ "smartWallets.postSwapNudge.title.dapp": "Αυτή η εφαρμογή υποστηρίζει έξυπνα πορτοφόλια", "smartWallets.unavailableModal.description": "Ένας διαφορετικός πάροχος πορτοφολιού διαχειρίζεται πλέον τις ρυθμίσεις έξυπνου πορτοφολιού για το {{displayName}}. Μπορείτε να συνεχίσετε να χρησιμοποιείτε το Uniswap κανονικά.", "smartWallets.unavailableModal.title": "Οι λειτουργίες έξυπνου πορτοφολιού δεν είναι διαθέσιμες", - "solanaPromo.banner.description": "Ανταλλάξτε μάρκες Solana απευθείας στην εφαρμογή Uniswap Web.", + "solanaPromo.banner.description": "Ανταλλάξτε μάρκες Solana απευθείας στο Uniswap.", "solanaPromo.banner.title": "Η Σολάνα είναι τώρα διαθέσιμη", "solanaPromo.modal.connectWallet": "Συνδέστε το αγαπημένο σας πορτοφόλι Solana", "solanaPromo.modal.startSwapping.button": "Ξεκινήστε την ανταλλαγή στο Solana", diff --git a/packages/uniswap/src/i18n/locales/translations/es-ES.json b/packages/uniswap/src/i18n/locales/translations/es-ES.json index 6cd7dbb7db4..d7c2473c9d3 100644 --- a/packages/uniswap/src/i18n/locales/translations/es-ES.json +++ b/packages/uniswap/src/i18n/locales/translations/es-ES.json @@ -152,6 +152,7 @@ "bridging.estimatedTime.minutesAndSeconds": "~{{minutes}} min {{seconds}} s", "bridging.estimatedTime.minutesOnly": "~{{minutes}} min", "bridging.estimatedTime.secondsOnly": "~{{seconds}} s", + "bridgingPopularTokens.banner.description": "DOGE, XRP, XLP — now available on Unichain.", "chart.candlestick": "Gráfico de velas", "chart.error.pools": "No se pueden mostrar los datos históricos del fondo actual.", "chart.error.tokens": "No se pueden mostrar los datos históricos del token actual.", @@ -1437,17 +1438,32 @@ "poolFinder.availablePools.notFound.description": "No se encontraron fondos v2 que coincidan. Vuelve a verificar la selección de tokens y asegúrate de estar conectado a la billetera correcta.", "pools.explore": "Explorar los fondos", "portfolio.activity.filters.timePeriod.all": "Historial", + "portfolio.activity.filters.transactionType.addLiquidity": "Add Liquidity", "portfolio.activity.filters.transactionType.all": "Todos los tipos", - "portfolio.activity.filters.transactionType.deposits": "Depósitos", - "portfolio.activity.filters.transactionType.staking": "Staking", + "portfolio.activity.filters.transactionType.approvals": "Approvals", + "portfolio.activity.filters.transactionType.claimFees": "Claim Fees", + "portfolio.activity.filters.transactionType.createPool": "Create Pool", + "portfolio.activity.filters.transactionType.mints": "Mints", + "portfolio.activity.filters.transactionType.removeLiquidity": "Remove Liquidity", "portfolio.activity.filters.transactionType.swaps": "Intercambios", + "portfolio.activity.filters.transactionType.wraps": "Wraps", + "portfolio.activity.table.column.address": "Address", + "portfolio.activity.table.column.amount": "Amount", + "portfolio.activity.table.column.time": "Time", + "portfolio.activity.table.column.type": "Type", "portfolio.activity.title": "Actividad", - "portfolio.connectWallet.summary": "Track tokens, pools, and more across {{amount}}+ networks", "portfolio.defi.title": "DeFi", "portfolio.description": "Rastrea tu cartera de criptomonedas en todas las cadenas y protocolos", + "portfolio.disconnected.connectWallet.cta": "Track your portfolio", + "portfolio.disconnected.cta.description": "Track tokens, positions, NFTs and more across {{numNetworks}}+ networks", + "portfolio.disconnected.demoWallet.description": "This is a view-only example. Connect your wallet to manage your portfolio.", + "portfolio.disconnected.demoWallet.title": "Demo wallet", + "portfolio.disconnected.viewYourPortfolio.cta": "to view your portfolio", "portfolio.nfts.title": "NFT", "portfolio.overview.title": "Resumen", "portfolio.title": "Cartera", + "portfolio.tokens.balance.totalTokens": "{{numTokens}} tokens", + "portfolio.tokens.emptyState": "No tokens", "portfolio.tokens.table.column.allocation": "Asignación", "portfolio.tokens.table.column.balance": "Saldo", "portfolio.tokens.table.column.change1d": "Variación en las últimas 24 horas", @@ -2505,6 +2521,12 @@ "uwulink.error.insufficientTokens": "No hay suficientes {{tokenSymbol}} en {{chain}}", "v2.notAvailable": "Uniswap V2 no está disponible en esta red.", "wallet.appSignIn": "Ingresar con la app", + "wallet.connecting.description": "Complete connection in your wallet", + "wallet.connecting.solanaPrompt": "Use Solana on Uniswap", + "wallet.connecting.solanaPrompt.button": "Use Solana", + "wallet.connecting.solanaPrompt.description": "You’ll be asked to connect again in MetaMask", + "wallet.connecting.title.evm": "Connect to {{walletName}}", + "wallet.connecting.title.svm": "Connect to {{walletName}} on Solana", "wallet.connectingAgreement": "Si conectas una billetera, aceptas las Condiciones del servicio de Uniswap Labs y consientes en su Política de privacidad.", "wallet.connectionFailed.message": "Connection attempt failed. Please try again, following the steps to connect in your wallet.", "wallet.mismatch.popup.description": "La billetera que tienes conectada no es compatible con algunas funciones.", diff --git a/packages/uniswap/src/i18n/locales/translations/fi-FI.json b/packages/uniswap/src/i18n/locales/translations/fi-FI.json index 659ba918272..9dd03a9a09d 100644 --- a/packages/uniswap/src/i18n/locales/translations/fi-FI.json +++ b/packages/uniswap/src/i18n/locales/translations/fi-FI.json @@ -1675,6 +1675,7 @@ "settings.action.lock": "Lukittava lompakko", "settings.action.privacy": "Tietosuojakäytäntö", "settings.action.terms": "Käyttöehdot", + "settings.connectWalletPlatform.warning": "Käyttääksesi Uniswapia {{platform}}:ssä, muodosta yhteys lompakkoon, joka tukee {{platform}}:ää.", "settings.footer": "Tehty rakkaudella, \nUniswap Team 🦄", "settings.hideSmallBalances": "Piilota pienet saldot", "settings.hideSmallBalances.subtitle": "Alle 1 USD:n saldot piilotetaan salkustasi.", @@ -1845,7 +1846,7 @@ "smartWallets.postSwapNudge.title.dapp": "Tämä sovellus tukee älykkäitä lompakoita", "smartWallets.unavailableModal.description": "Eri lompakkopalveluntarjoaja hallinnoi nyt {{displayName}}:n älylompakkoasetuksia. Voit jatkaa Uniswapin käyttöä normaalisti.", "smartWallets.unavailableModal.title": "Älykäs lompakon ominaisuudet eivät ole käytettävissä", - "solanaPromo.banner.description": "Vaihda Solana-tokeneita suoraan Uniswap-verkkosovelluksessa.", + "solanaPromo.banner.description": "Vaihda Solana-tokeneita suoraan Uniswapissa.", "solanaPromo.banner.title": "Solana on nyt saatavilla", "solanaPromo.modal.connectWallet": "Yhdistä suosikki Solana-lompakkosi", "solanaPromo.modal.startSwapping.button": "Aloita vaihtaminen Solanan kanssa", diff --git a/packages/uniswap/src/i18n/locales/translations/fil-PH.json b/packages/uniswap/src/i18n/locales/translations/fil-PH.json index 323e3c414ee..047dae48f21 100644 --- a/packages/uniswap/src/i18n/locales/translations/fil-PH.json +++ b/packages/uniswap/src/i18n/locales/translations/fil-PH.json @@ -152,6 +152,7 @@ "bridging.estimatedTime.minutesAndSeconds": "~{{minutes}}min {{seconds}}s", "bridging.estimatedTime.minutesOnly": "~{{minutes}}min", "bridging.estimatedTime.secondsOnly": "~{{seconds}}s", + "bridgingPopularTokens.banner.description": "DOGE, XRP, XLP — now available on Unichain.", "chart.candlestick": "Candlestick", "chart.error.pools": "Hindi maipakita ang dating data para sa kasalukuyang pool.", "chart.error.tokens": "Hindi maipakita ang dating data para sa kasalukuyang token.", @@ -1437,17 +1438,32 @@ "poolFinder.availablePools.notFound.description": "Walang nakitang v2 pool na tumutugma. I-double check ang iyong napiling token at tiyaking nakakonekta ka sa tamang wallet.", "pools.explore": "I-explore ang mga pool", "portfolio.activity.filters.timePeriod.all": "Lahat ng oras", + "portfolio.activity.filters.transactionType.addLiquidity": "Add Liquidity", "portfolio.activity.filters.transactionType.all": "Lahat ng uri", - "portfolio.activity.filters.transactionType.deposits": "Mga Deposito", - "portfolio.activity.filters.transactionType.staking": "Staking", + "portfolio.activity.filters.transactionType.approvals": "Approvals", + "portfolio.activity.filters.transactionType.claimFees": "Claim Fees", + "portfolio.activity.filters.transactionType.createPool": "Create Pool", + "portfolio.activity.filters.transactionType.mints": "Mints", + "portfolio.activity.filters.transactionType.removeLiquidity": "Remove Liquidity", "portfolio.activity.filters.transactionType.swaps": "Mga Swap", + "portfolio.activity.filters.transactionType.wraps": "Wraps", + "portfolio.activity.table.column.address": "Address", + "portfolio.activity.table.column.amount": "Amount", + "portfolio.activity.table.column.time": "Time", + "portfolio.activity.table.column.type": "Type", "portfolio.activity.title": "Aktibidad", - "portfolio.connectWallet.summary": "Track tokens, pools, and more across {{amount}}+ networks", "portfolio.defi.title": "DeFi", "portfolio.description": "I-track ang iyong crypto portfolio sa lahat ng chain at protocol", + "portfolio.disconnected.connectWallet.cta": "Track your portfolio", + "portfolio.disconnected.cta.description": "Track tokens, positions, NFTs and more across {{numNetworks}}+ networks", + "portfolio.disconnected.demoWallet.description": "This is a view-only example. Connect your wallet to manage your portfolio.", + "portfolio.disconnected.demoWallet.title": "Demo wallet", + "portfolio.disconnected.viewYourPortfolio.cta": "to view your portfolio", "portfolio.nfts.title": "Mga NFT", "portfolio.overview.title": "Pangkalahatang-ideya", "portfolio.title": "Portfolio", + "portfolio.tokens.balance.totalTokens": "{{numTokens}} tokens", + "portfolio.tokens.emptyState": "No tokens", "portfolio.tokens.table.column.allocation": "Alokasyon", "portfolio.tokens.table.column.balance": "Balanse", "portfolio.tokens.table.column.change1d": "Pagbabago sa 1D", @@ -2505,6 +2521,12 @@ "uwulink.error.insufficientTokens": "Hindi sapat ang {{tokenSymbol}} sa {{chain}}", "v2.notAvailable": "Hindi available ang Uniswap V2 sa network na ito.", "wallet.appSignIn": "Mag-sign in gamit ang app", + "wallet.connecting.description": "Complete connection in your wallet", + "wallet.connecting.solanaPrompt": "Use Solana on Uniswap", + "wallet.connecting.solanaPrompt.button": "Use Solana", + "wallet.connecting.solanaPrompt.description": "You’ll be asked to connect again in MetaMask", + "wallet.connecting.title.evm": "Connect to {{walletName}}", + "wallet.connecting.title.svm": "Connect to {{walletName}} on Solana", "wallet.connectingAgreement": "Sa pamamagitan ng pagkonekta ng wallet, sumasang-ayon ka sa Mga Tuntunin ng Serbisyo ng Uniswap Labs at pumapayag ka sa Patakaran sa Privacy nito.", "wallet.connectionFailed.message": "Connection attempt failed. Please try again, following the steps to connect in your wallet.", "wallet.mismatch.popup.description": "Ang ilang feature ay hindi sinusuportahan ng iyong nakakonektang wallet.", diff --git a/packages/uniswap/src/i18n/locales/translations/fr-FR.json b/packages/uniswap/src/i18n/locales/translations/fr-FR.json index 0110021626c..87a016d4648 100644 --- a/packages/uniswap/src/i18n/locales/translations/fr-FR.json +++ b/packages/uniswap/src/i18n/locales/translations/fr-FR.json @@ -152,6 +152,7 @@ "bridging.estimatedTime.minutesAndSeconds": "Env. {{minutes}} min {{seconds}} s", "bridging.estimatedTime.minutesOnly": "Env. {{minutes}} min", "bridging.estimatedTime.secondsOnly": "Env. {{seconds}} s", + "bridgingPopularTokens.banner.description": "DOGE, XRP, XLP — now available on Unichain.", "chart.candlestick": "Chandelier", "chart.error.pools": "Impossible d'afficher les données historiques du pool actuel.", "chart.error.tokens": "Impossible d'afficher les données historiques du token actuel.", @@ -1437,17 +1438,32 @@ "poolFinder.availablePools.notFound.description": "Aucun pool V2 ne correspond à votre sélection. Vérifiez le(s) token(s) sélectionné(s) et assurez-vous d’être connecté au bon wallet.", "pools.explore": "Découvrir les pools", "portfolio.activity.filters.timePeriod.all": "Toujours", + "portfolio.activity.filters.transactionType.addLiquidity": "Add Liquidity", "portfolio.activity.filters.transactionType.all": "Tous les types", - "portfolio.activity.filters.transactionType.deposits": "Dépôts", - "portfolio.activity.filters.transactionType.staking": "Staking", + "portfolio.activity.filters.transactionType.approvals": "Approvals", + "portfolio.activity.filters.transactionType.claimFees": "Claim Fees", + "portfolio.activity.filters.transactionType.createPool": "Create Pool", + "portfolio.activity.filters.transactionType.mints": "Mints", + "portfolio.activity.filters.transactionType.removeLiquidity": "Remove Liquidity", "portfolio.activity.filters.transactionType.swaps": "Échanges", + "portfolio.activity.filters.transactionType.wraps": "Wraps", + "portfolio.activity.table.column.address": "Address", + "portfolio.activity.table.column.amount": "Amount", + "portfolio.activity.table.column.time": "Time", + "portfolio.activity.table.column.type": "Type", "portfolio.activity.title": "Activité", - "portfolio.connectWallet.summary": "Track tokens, pools, and more across {{amount}}+ networks", "portfolio.defi.title": "DeFi", "portfolio.description": "Suivez votre portefeuille de crypto à travers toutes les chaînes et protocoles", + "portfolio.disconnected.connectWallet.cta": "Track your portfolio", + "portfolio.disconnected.cta.description": "Track tokens, positions, NFTs and more across {{numNetworks}}+ networks", + "portfolio.disconnected.demoWallet.description": "This is a view-only example. Connect your wallet to manage your portfolio.", + "portfolio.disconnected.demoWallet.title": "Demo wallet", + "portfolio.disconnected.viewYourPortfolio.cta": "to view your portfolio", "portfolio.nfts.title": "NFT", "portfolio.overview.title": "Aperçu", "portfolio.title": "Portefeuille", + "portfolio.tokens.balance.totalTokens": "{{numTokens}} tokens", + "portfolio.tokens.emptyState": "No tokens", "portfolio.tokens.table.column.allocation": "Allocation", "portfolio.tokens.table.column.balance": "Solde", "portfolio.tokens.table.column.change1d": "Évolution sur 1 j", @@ -2505,6 +2521,12 @@ "uwulink.error.insufficientTokens": "Pas assez de {{tokenSymbol}} sur {{chain}}", "v2.notAvailable": "Uniswap V2 n'est pas disponible sur ce réseau.", "wallet.appSignIn": "Se connecter avec l'app", + "wallet.connecting.description": "Complete connection in your wallet", + "wallet.connecting.solanaPrompt": "Use Solana on Uniswap", + "wallet.connecting.solanaPrompt.button": "Use Solana", + "wallet.connecting.solanaPrompt.description": "You’ll be asked to connect again in MetaMask", + "wallet.connecting.title.evm": "Connect to {{walletName}}", + "wallet.connecting.title.svm": "Connect to {{walletName}} on Solana", "wallet.connectingAgreement": "En connectant un wallet, vous acceptez les Conditions d'utilisation d'Uniswap Labs et vous consentez à sa Politique de confidentialité.", "wallet.connectionFailed.message": "Connection attempt failed. Please try again, following the steps to connect in your wallet.", "wallet.mismatch.popup.description": "Certaines fonctionnalités ne sont pas prises en charge par votre wallet connecté.", diff --git a/packages/uniswap/src/i18n/locales/translations/he-IL.json b/packages/uniswap/src/i18n/locales/translations/he-IL.json index 5c183c131d7..ece09b33c76 100644 --- a/packages/uniswap/src/i18n/locales/translations/he-IL.json +++ b/packages/uniswap/src/i18n/locales/translations/he-IL.json @@ -1675,6 +1675,7 @@ "settings.action.lock": "מנעול ארנק", "settings.action.privacy": "מדיניות הפרטיות", "settings.action.terms": "תנאי השירות", + "settings.connectWalletPlatform.warning": "כדי להשתמש ב-Uniswap ב- {{platform}}, התחבר לארנק שתומך ב- {{platform}}.", "settings.footer": "מיוצר באהבה, \nצוות Uniswap 🦄", "settings.hideSmallBalances": "הסתר יתרות קטנות", "settings.hideSmallBalances.subtitle": "יתרות מתחת ל-1 USD יוסתרו מהתיק שלך.", @@ -1845,7 +1846,7 @@ "smartWallets.postSwapNudge.title.dapp": "אפליקציה זו תומכת בארנקים חכמים", "smartWallets.unavailableModal.description": "ספק ארנק אחר מנהל כעת את הגדרות הארנק החכם עבור {{displayName}}. ניתן להמשיך להשתמש ב-Uniswap כרגיל.", "smartWallets.unavailableModal.title": "תכונות הארנק החכם אינן זמינות", - "solanaPromo.banner.description": "סחרו באסימוני סולאנה ישירות באפליקציית האינטרנט של Uniswap.", + "solanaPromo.banner.description": "סחרו באסימוני סולאנה ישירות ב-Uniswap.", "solanaPromo.banner.title": "סולאנה זמינה כעת", "solanaPromo.modal.connectWallet": "חבר את ארנק סולאנה המועדף עליך", "solanaPromo.modal.startSwapping.button": "התחל להחליף על סולאנה", diff --git a/packages/uniswap/src/i18n/locales/translations/hi-IN.json b/packages/uniswap/src/i18n/locales/translations/hi-IN.json index ca00c6fb653..8ceab52826a 100644 --- a/packages/uniswap/src/i18n/locales/translations/hi-IN.json +++ b/packages/uniswap/src/i18n/locales/translations/hi-IN.json @@ -1675,6 +1675,7 @@ "settings.action.lock": "बटुआ बंद करो", "settings.action.privacy": "गोपनीयता नीति", "settings.action.terms": "सेवा की शर्तें", + "settings.connectWalletPlatform.warning": "{{platform}}पर Uniswap का उपयोग करने के लिए, {{platform}}का समर्थन करने वाले वॉलेट से कनेक्ट करें।", "settings.footer": "प्यार से बनाया गया, \nUniswap टीम 🦄", "settings.hideSmallBalances": "छोटे-छोटे शेष छिपाएँ", "settings.hideSmallBalances.subtitle": "1 USD से कम शेष राशि आपके पोर्टफोलियो से छिपा दी जाएगी।", @@ -1845,7 +1846,7 @@ "smartWallets.postSwapNudge.title.dapp": "यह ऐप स्मार्ट वॉलेट को सपोर्ट करता है", "smartWallets.unavailableModal.description": "एक अलग वॉलेट प्रदाता अब {{displayName}}के लिए स्मार्ट वॉलेट सेटिंग्स का प्रबंधन कर रहा है। आप सामान्य रूप से Uniswap का उपयोग जारी रख सकते हैं।", "smartWallets.unavailableModal.title": "स्मार्ट वॉलेट सुविधाएँ उपलब्ध नहीं हैं", - "solanaPromo.banner.description": "यूनिस्वैप वेब ऐप पर सीधे सोलाना टोकन का व्यापार करें।", + "solanaPromo.banner.description": "यूनिस्वैप पर सीधे सोलाना टोकन का व्यापार करें।", "solanaPromo.banner.title": "सोलाना अब उपलब्ध है", "solanaPromo.modal.connectWallet": "अपने पसंदीदा सोलाना वॉलेट को कनेक्ट करें", "solanaPromo.modal.startSwapping.button": "सोलाना पर स्वैपिंग शुरू करें", diff --git a/packages/uniswap/src/i18n/locales/translations/hu-HU.json b/packages/uniswap/src/i18n/locales/translations/hu-HU.json index 827d0da4825..3265b8f67ee 100644 --- a/packages/uniswap/src/i18n/locales/translations/hu-HU.json +++ b/packages/uniswap/src/i18n/locales/translations/hu-HU.json @@ -1675,6 +1675,7 @@ "settings.action.lock": "Zárható pénztárca", "settings.action.privacy": "Adatvédelmi irányelvek", "settings.action.terms": "Szolgáltatás feltételei", + "settings.connectWalletPlatform.warning": "A Uniswap {{platform}}tárcán való használatához csatlakozz egy olyan tárcához, amely támogatja a {{platform}}tárcát.", "settings.footer": "Szeretettel készült, \nUniswap Team 🦄", "settings.hideSmallBalances": "Kis egyenlegek elrejtése", "settings.hideSmallBalances.subtitle": "Az 1 USD alatti egyenlegek el lesznek rejtve a portfóliójában.", @@ -1845,7 +1846,7 @@ "smartWallets.postSwapNudge.title.dapp": "Ez az alkalmazás támogatja az intelligens pénztárcákat", "smartWallets.unavailableModal.description": "Egy másik pénztárca-szolgáltató kezeli a {{displayName}}intelligens pénztárca beállításait. A Uniswap szolgáltatást a szokásos módon használhatod.", "smartWallets.unavailableModal.title": "Az intelligens pénztárca funkciói nem érhetők el", - "solanaPromo.banner.description": "Kereskedjen Solana tokenekkel közvetlenül az Uniswap webes alkalmazásban.", + "solanaPromo.banner.description": "Cserélj Solana tokeneket közvetlenül az Uniswap-on.", "solanaPromo.banner.title": "A Solana már elérhető", "solanaPromo.modal.connectWallet": "Csatlakoztassa kedvenc Solana pénztárcáját", "solanaPromo.modal.startSwapping.button": "Kezdj el cserélgetni a Solanán", diff --git a/packages/uniswap/src/i18n/locales/translations/id-ID.json b/packages/uniswap/src/i18n/locales/translations/id-ID.json index 7eb5c98e8ea..61ac7b19cc6 100644 --- a/packages/uniswap/src/i18n/locales/translations/id-ID.json +++ b/packages/uniswap/src/i18n/locales/translations/id-ID.json @@ -152,6 +152,7 @@ "bridging.estimatedTime.minutesAndSeconds": "~{{minutes}} mnt {{seconds}} dtk", "bridging.estimatedTime.minutesOnly": "~{{minutes}} mnt", "bridging.estimatedTime.secondsOnly": "~{{seconds}} dtk", + "bridgingPopularTokens.banner.description": "DOGE, XRP, XLP — now available on Unichain.", "chart.candlestick": "Kandil", "chart.error.pools": "Tidak dapat menampilkan data historis untuk pool saat ini.", "chart.error.tokens": "Tidak dapat menampilkan data historis untuk token saat ini.", @@ -1437,17 +1438,32 @@ "poolFinder.availablePools.notFound.description": "Cadangan aset v2 yang sesuai tidak ditemukan. Periksa kembali pilihan tokenmu dan pastikan kamu telah terhubung dengan dompet yang benar.", "pools.explore": "Jelajahi pool", "portfolio.activity.filters.timePeriod.all": "Sepanjang periode", + "portfolio.activity.filters.transactionType.addLiquidity": "Add Liquidity", "portfolio.activity.filters.transactionType.all": "Semua jenis", - "portfolio.activity.filters.transactionType.deposits": "Setoran", - "portfolio.activity.filters.transactionType.staking": "Staking", + "portfolio.activity.filters.transactionType.approvals": "Approvals", + "portfolio.activity.filters.transactionType.claimFees": "Claim Fees", + "portfolio.activity.filters.transactionType.createPool": "Create Pool", + "portfolio.activity.filters.transactionType.mints": "Mints", + "portfolio.activity.filters.transactionType.removeLiquidity": "Remove Liquidity", "portfolio.activity.filters.transactionType.swaps": "Pertukaran", + "portfolio.activity.filters.transactionType.wraps": "Wraps", + "portfolio.activity.table.column.address": "Address", + "portfolio.activity.table.column.amount": "Amount", + "portfolio.activity.table.column.time": "Time", + "portfolio.activity.table.column.type": "Type", "portfolio.activity.title": "Aktivitas", - "portfolio.connectWallet.summary": "Track tokens, pools, and more across {{amount}}+ networks", "portfolio.defi.title": "DeFi", "portfolio.description": "Melacak portofolio kripto di semua chain dan protokol", + "portfolio.disconnected.connectWallet.cta": "Track your portfolio", + "portfolio.disconnected.cta.description": "Track tokens, positions, NFTs and more across {{numNetworks}}+ networks", + "portfolio.disconnected.demoWallet.description": "This is a view-only example. Connect your wallet to manage your portfolio.", + "portfolio.disconnected.demoWallet.title": "Demo wallet", + "portfolio.disconnected.viewYourPortfolio.cta": "to view your portfolio", "portfolio.nfts.title": "NFT", "portfolio.overview.title": "Ikhtisar", "portfolio.title": "Portofolio", + "portfolio.tokens.balance.totalTokens": "{{numTokens}} tokens", + "portfolio.tokens.emptyState": "No tokens", "portfolio.tokens.table.column.allocation": "Alokasi", "portfolio.tokens.table.column.balance": "Saldo", "portfolio.tokens.table.column.change1d": "Perubahan 1 Hari", @@ -2505,6 +2521,12 @@ "uwulink.error.insufficientTokens": "Tidak cukup {{tokenSymbol}} di {{chain}}", "v2.notAvailable": "Uniswap V2 tidak tersedia di jaringan ini.", "wallet.appSignIn": "Masuk dengan aplikasi", + "wallet.connecting.description": "Complete connection in your wallet", + "wallet.connecting.solanaPrompt": "Use Solana on Uniswap", + "wallet.connecting.solanaPrompt.button": "Use Solana", + "wallet.connecting.solanaPrompt.description": "You’ll be asked to connect again in MetaMask", + "wallet.connecting.title.evm": "Connect to {{walletName}}", + "wallet.connecting.title.svm": "Connect to {{walletName}} on Solana", "wallet.connectingAgreement": "Dengan menghubungkan dompet, kamu menyetujui Ketentuan Layanan Uniswap Labs dan menyetujui Kebijakan Privasi.", "wallet.connectionFailed.message": "Upaya koneksi gagal. Silakan coba lagi dan ikuti langkah-langkah untuk menghubungkan di dompetmu.", "wallet.mismatch.popup.description": "Dompet terhubungmu tidak mendukung beberapa fitur.", diff --git a/packages/uniswap/src/i18n/locales/translations/it-IT.json b/packages/uniswap/src/i18n/locales/translations/it-IT.json index fe13f5ece22..275f8c80b31 100644 --- a/packages/uniswap/src/i18n/locales/translations/it-IT.json +++ b/packages/uniswap/src/i18n/locales/translations/it-IT.json @@ -1675,6 +1675,7 @@ "settings.action.lock": "Blocca il portafoglio", "settings.action.privacy": "Politica sulla riservatezza", "settings.action.terms": "Termini di servizio", + "settings.connectWalletPlatform.warning": "Per utilizzare Uniswap su {{platform}}, connettiti a un portafoglio che supporti {{platform}}.", "settings.footer": "Fatto con amore, \nUniswap Team 🦄", "settings.hideSmallBalances": "Nascondi piccoli saldi", "settings.hideSmallBalances.subtitle": "I saldi inferiori a 1 USD saranno nascosti dal tuo portafoglio.", @@ -1845,7 +1846,7 @@ "smartWallets.postSwapNudge.title.dapp": "Questa app supporta i portafogli intelligenti", "smartWallets.unavailableModal.description": "Un altro fornitore di wallet gestisce ora le impostazioni del wallet intelligente per {{displayName}}. Puoi continuare a utilizzare Uniswap normalmente.", "smartWallets.unavailableModal.title": "Funzionalità del portafoglio intelligente non disponibili", - "solanaPromo.banner.description": "Scambia i token Solana direttamente sulla Web App Uniswap.", + "solanaPromo.banner.description": "Scambia i token Solana direttamente su Uniswap.", "solanaPromo.banner.title": "Solana è ora disponibile", "solanaPromo.modal.connectWallet": "Collega il tuo portafoglio Solana preferito", "solanaPromo.modal.startSwapping.button": "Inizia a scambiare su Solana", diff --git a/packages/uniswap/src/i18n/locales/translations/ja-JP.json b/packages/uniswap/src/i18n/locales/translations/ja-JP.json index 3d432bde27d..2add2c812a9 100644 --- a/packages/uniswap/src/i18n/locales/translations/ja-JP.json +++ b/packages/uniswap/src/i18n/locales/translations/ja-JP.json @@ -152,6 +152,7 @@ "bridging.estimatedTime.minutesAndSeconds": "約 {{minutes}} 分 {{seconds}} 秒", "bridging.estimatedTime.minutesOnly": "約 {{minutes}} 分", "bridging.estimatedTime.secondsOnly": "約 {{seconds}} 秒", + "bridgingPopularTokens.banner.description": "DOGE, XRP, XLP — now available on Unichain.", "chart.candlestick": "ローソク足", "chart.error.pools": "現在のプールの履歴データを表示できません。", "chart.error.tokens": "現在のトークンの履歴データを表示できません。", @@ -1437,17 +1438,32 @@ "poolFinder.availablePools.notFound.description": "一致する v2 プールが見つかりませんでした。選択したトークンを再確認し、正しいウォレットに接続されていることを確認してください。", "pools.explore": "プールを探索", "portfolio.activity.filters.timePeriod.all": "全期間", + "portfolio.activity.filters.transactionType.addLiquidity": "Add Liquidity", "portfolio.activity.filters.transactionType.all": "全種類", - "portfolio.activity.filters.transactionType.deposits": "預け入れ", - "portfolio.activity.filters.transactionType.staking": "ステーキング", + "portfolio.activity.filters.transactionType.approvals": "Approvals", + "portfolio.activity.filters.transactionType.claimFees": "Claim Fees", + "portfolio.activity.filters.transactionType.createPool": "Create Pool", + "portfolio.activity.filters.transactionType.mints": "Mints", + "portfolio.activity.filters.transactionType.removeLiquidity": "Remove Liquidity", "portfolio.activity.filters.transactionType.swaps": "スワップ", + "portfolio.activity.filters.transactionType.wraps": "Wraps", + "portfolio.activity.table.column.address": "Address", + "portfolio.activity.table.column.amount": "Amount", + "portfolio.activity.table.column.time": "Time", + "portfolio.activity.table.column.type": "Type", "portfolio.activity.title": "アクティビティ", - "portfolio.connectWallet.summary": "Track tokens, pools, and more across {{amount}}+ networks", "portfolio.defi.title": "DeFi", "portfolio.description": "チェーンとプロトコルすべてにわたって暗号資産ポートフォリオを追跡します", + "portfolio.disconnected.connectWallet.cta": "Track your portfolio", + "portfolio.disconnected.cta.description": "Track tokens, positions, NFTs and more across {{numNetworks}}+ networks", + "portfolio.disconnected.demoWallet.description": "This is a view-only example. Connect your wallet to manage your portfolio.", + "portfolio.disconnected.demoWallet.title": "Demo wallet", + "portfolio.disconnected.viewYourPortfolio.cta": "to view your portfolio", "portfolio.nfts.title": "NFT", "portfolio.overview.title": "概要", "portfolio.title": "ポートフォリオ", + "portfolio.tokens.balance.totalTokens": "{{numTokens}} tokens", + "portfolio.tokens.emptyState": "No tokens", "portfolio.tokens.table.column.allocation": "割り当て", "portfolio.tokens.table.column.balance": "残高", "portfolio.tokens.table.column.change1d": "1 日の変更", @@ -2505,6 +2521,12 @@ "uwulink.error.insufficientTokens": "{{chain}} の {{tokenSymbol}} が十分ではありません", "v2.notAvailable": "Uniswap V2 はこのネットワークでは利用できません。", "wallet.appSignIn": "アプリでログイン", + "wallet.connecting.description": "Complete connection in your wallet", + "wallet.connecting.solanaPrompt": "Use Solana on Uniswap", + "wallet.connecting.solanaPrompt.button": "Use Solana", + "wallet.connecting.solanaPrompt.description": "You’ll be asked to connect again in MetaMask", + "wallet.connecting.title.evm": "Connect to {{walletName}}", + "wallet.connecting.title.svm": "Connect to {{walletName}} on Solana", "wallet.connectingAgreement": "ウォレットを接続すると、Uniswap Labs の利用規約に同意し、プライバシー ポリシーに同意したことになります。", "wallet.connectionFailed.message": "Connection attempt failed. Please try again, following the steps to connect in your wallet.", "wallet.mismatch.popup.description": "接続中のウォレットでは一部の機能がサポートされていません。", diff --git a/packages/uniswap/src/i18n/locales/translations/ko-KR.json b/packages/uniswap/src/i18n/locales/translations/ko-KR.json index 92215e92477..8e7df5d1fcf 100644 --- a/packages/uniswap/src/i18n/locales/translations/ko-KR.json +++ b/packages/uniswap/src/i18n/locales/translations/ko-KR.json @@ -152,6 +152,7 @@ "bridging.estimatedTime.minutesAndSeconds": "~{{minutes}}분 {{seconds}}초", "bridging.estimatedTime.minutesOnly": "~{{minutes}}분", "bridging.estimatedTime.secondsOnly": "~{{seconds}}초", + "bridgingPopularTokens.banner.description": "DOGE, XRP, XLP — now available on Unichain.", "chart.candlestick": "촛대", "chart.error.pools": "현재 풀에 대한 기록 데이터를 표시할 수 없습니다.", "chart.error.tokens": "현재 토큰에 대한 기록 데이터를 표시할 수 없습니다.", @@ -1437,17 +1438,32 @@ "poolFinder.availablePools.notFound.description": "일치하는 v2 풀을 찾지 못했습니다. 토큰 선택을 다시 한번 확인하고 올바른 지갑에 연결되어 있는지 확인하세요.", "pools.explore": "풀 탐색", "portfolio.activity.filters.timePeriod.all": "누적", + "portfolio.activity.filters.transactionType.addLiquidity": "Add Liquidity", "portfolio.activity.filters.transactionType.all": "모든 유형", - "portfolio.activity.filters.transactionType.deposits": "입금", - "portfolio.activity.filters.transactionType.staking": "스테이킹", + "portfolio.activity.filters.transactionType.approvals": "Approvals", + "portfolio.activity.filters.transactionType.claimFees": "Claim Fees", + "portfolio.activity.filters.transactionType.createPool": "Create Pool", + "portfolio.activity.filters.transactionType.mints": "Mints", + "portfolio.activity.filters.transactionType.removeLiquidity": "Remove Liquidity", "portfolio.activity.filters.transactionType.swaps": "스왑", + "portfolio.activity.filters.transactionType.wraps": "Wraps", + "portfolio.activity.table.column.address": "Address", + "portfolio.activity.table.column.amount": "Amount", + "portfolio.activity.table.column.time": "Time", + "portfolio.activity.table.column.type": "Type", "portfolio.activity.title": "활동", - "portfolio.connectWallet.summary": "Track tokens, pools, and more across {{amount}}+ networks", "portfolio.defi.title": "DeFi", "portfolio.description": "모든 체인과 프로토콜을 아우르는 암호화폐 포트폴리오 추적", + "portfolio.disconnected.connectWallet.cta": "Track your portfolio", + "portfolio.disconnected.cta.description": "Track tokens, positions, NFTs and more across {{numNetworks}}+ networks", + "portfolio.disconnected.demoWallet.description": "This is a view-only example. Connect your wallet to manage your portfolio.", + "portfolio.disconnected.demoWallet.title": "Demo wallet", + "portfolio.disconnected.viewYourPortfolio.cta": "to view your portfolio", "portfolio.nfts.title": "NFT", "portfolio.overview.title": "개요", "portfolio.title": "포트폴리오", + "portfolio.tokens.balance.totalTokens": "{{numTokens}} tokens", + "portfolio.tokens.emptyState": "No tokens", "portfolio.tokens.table.column.allocation": "할당", "portfolio.tokens.table.column.balance": "잔액", "portfolio.tokens.table.column.change1d": "1일 변동", @@ -2505,6 +2521,12 @@ "uwulink.error.insufficientTokens": "{{chain}}에 {{tokenSymbol}}이 충분하지 않습니다.", "v2.notAvailable": "이 네트워크에서는 Uniswap V2를 사용할 수 없습니다.", "wallet.appSignIn": "앱으로 로그인", + "wallet.connecting.description": "Complete connection in your wallet", + "wallet.connecting.solanaPrompt": "Use Solana on Uniswap", + "wallet.connecting.solanaPrompt.button": "Use Solana", + "wallet.connecting.solanaPrompt.description": "You’ll be asked to connect again in MetaMask", + "wallet.connecting.title.evm": "Connect to {{walletName}}", + "wallet.connecting.title.svm": "Connect to {{walletName}} on Solana", "wallet.connectingAgreement": "지갑을 연결하면 Uniswap Labs의 서비스 약관개인정보 보호정책에 동의하는 것으로 간주됩니다.", "wallet.connectionFailed.message": "Connection attempt failed. Please try again, following the steps to connect in your wallet.", "wallet.mismatch.popup.description": "연결된 지갑에서 일부 기능을 지원하지 않습니다.", diff --git a/packages/uniswap/src/i18n/locales/translations/ms-MY.json b/packages/uniswap/src/i18n/locales/translations/ms-MY.json index f2a08e7fe70..dd31542a088 100644 --- a/packages/uniswap/src/i18n/locales/translations/ms-MY.json +++ b/packages/uniswap/src/i18n/locales/translations/ms-MY.json @@ -1675,6 +1675,7 @@ "settings.action.lock": "Kunci dompet", "settings.action.privacy": "Dasar privasi", "settings.action.terms": "Syarat perkhidmatan", + "settings.connectWalletPlatform.warning": "Untuk menggunakan Uniswap pada {{platform}}, sambung ke dompet yang menyokong {{platform}}.", "settings.footer": "Dibuat dengan penuh kasih sayang, \nPasukan Uniswap 🦄", "settings.hideSmallBalances": "Sembunyikan baki kecil", "settings.hideSmallBalances.subtitle": "Baki di bawah 1 USD akan disembunyikan daripada portfolio anda.", @@ -1845,7 +1846,7 @@ "smartWallets.postSwapNudge.title.dapp": "Aplikasi ini menyokong dompet pintar", "smartWallets.unavailableModal.description": "Pembekal dompet yang berbeza kini menguruskan tetapan dompet pintar untuk {{displayName}}. Anda boleh terus menggunakan Uniswap seperti biasa.", "smartWallets.unavailableModal.title": "Ciri dompet pintar tidak tersedia", - "solanaPromo.banner.description": "Berdagang token Solana terus pada Apl Web Uniswap.", + "solanaPromo.banner.description": "Berdagang token Solana terus pada Uniswap.", "solanaPromo.banner.title": "Solana kini tersedia", "solanaPromo.modal.connectWallet": "Sambungkan dompet Solana kegemaran anda", "solanaPromo.modal.startSwapping.button": "Mula bertukar pada Solana", diff --git a/packages/uniswap/src/i18n/locales/translations/nl-NL.json b/packages/uniswap/src/i18n/locales/translations/nl-NL.json index 8b8d74c3d7b..81f0d03cc5d 100644 --- a/packages/uniswap/src/i18n/locales/translations/nl-NL.json +++ b/packages/uniswap/src/i18n/locales/translations/nl-NL.json @@ -152,6 +152,7 @@ "bridging.estimatedTime.minutesAndSeconds": "~{{minutes}}min {{seconds}}s", "bridging.estimatedTime.minutesOnly": "~{{minutes}}min", "bridging.estimatedTime.secondsOnly": "~{{seconds}}s", + "bridgingPopularTokens.banner.description": "DOGE, XRP, XLP — now available on Unichain.", "chart.candlestick": "Candlestick", "chart.error.pools": "Kon de historische data voor de huidige pool niet weergeven.", "chart.error.tokens": "Kon de historische data voor het huidige token niet weergeven.", @@ -1437,17 +1438,32 @@ "poolFinder.availablePools.notFound.description": "Geen overeenkomende v2-pools gevonden. Controleer je tokenselectie nogmaals en zorg ervoor dat je verbonden bent met de juiste wallet.", "pools.explore": "Pools verkennen", "portfolio.activity.filters.timePeriod.all": "Altijd", + "portfolio.activity.filters.transactionType.addLiquidity": "Add Liquidity", "portfolio.activity.filters.transactionType.all": "Alle typen", - "portfolio.activity.filters.transactionType.deposits": "Stortingen", - "portfolio.activity.filters.transactionType.staking": "Staking", + "portfolio.activity.filters.transactionType.approvals": "Approvals", + "portfolio.activity.filters.transactionType.claimFees": "Claim Fees", + "portfolio.activity.filters.transactionType.createPool": "Create Pool", + "portfolio.activity.filters.transactionType.mints": "Mints", + "portfolio.activity.filters.transactionType.removeLiquidity": "Remove Liquidity", "portfolio.activity.filters.transactionType.swaps": "Swaps", + "portfolio.activity.filters.transactionType.wraps": "Wraps", + "portfolio.activity.table.column.address": "Address", + "portfolio.activity.table.column.amount": "Amount", + "portfolio.activity.table.column.time": "Time", + "portfolio.activity.table.column.type": "Type", "portfolio.activity.title": "Activiteit", - "portfolio.connectWallet.summary": "Track tokens, pools, and more across {{amount}}+ networks", "portfolio.defi.title": "DeFi", "portfolio.description": "Volg je cryptoportefeuille in alle chains en protocollen", + "portfolio.disconnected.connectWallet.cta": "Track your portfolio", + "portfolio.disconnected.cta.description": "Track tokens, positions, NFTs and more across {{numNetworks}}+ networks", + "portfolio.disconnected.demoWallet.description": "This is a view-only example. Connect your wallet to manage your portfolio.", + "portfolio.disconnected.demoWallet.title": "Demo wallet", + "portfolio.disconnected.viewYourPortfolio.cta": "to view your portfolio", "portfolio.nfts.title": "NFT's", "portfolio.overview.title": "Overzicht", "portfolio.title": "Portefeuille", + "portfolio.tokens.balance.totalTokens": "{{numTokens}} tokens", + "portfolio.tokens.emptyState": "No tokens", "portfolio.tokens.table.column.allocation": "Toewijzing", "portfolio.tokens.table.column.balance": "Saldo", "portfolio.tokens.table.column.change1d": "1d-wijziging", @@ -2505,6 +2521,12 @@ "uwulink.error.insufficientTokens": "Onvoldoende {{tokenSymbol}} op {{chain}}", "v2.notAvailable": "Uniswap V2 is niet beschikbaar op dit netwerk.", "wallet.appSignIn": "Aanmelden met de app", + "wallet.connecting.description": "Complete connection in your wallet", + "wallet.connecting.solanaPrompt": "Use Solana on Uniswap", + "wallet.connecting.solanaPrompt.button": "Use Solana", + "wallet.connecting.solanaPrompt.description": "You’ll be asked to connect again in MetaMask", + "wallet.connecting.title.evm": "Connect to {{walletName}}", + "wallet.connecting.title.svm": "Connect to {{walletName}} on Solana", "wallet.connectingAgreement": "Door een wallet te verbinden, ga je akkoord met de Servicevoorwaarden van Uniswap Labs en geef je toestemming voor het Privacybeleid.", "wallet.connectionFailed.message": "Verbindingspoging mislukt. Probeer het opnieuw en volg de stappen om verbinding te maken in je wallet.", "wallet.mismatch.popup.description": "Sommige functies worden niet ondersteund door je verbonden wallet.", diff --git a/packages/uniswap/src/i18n/locales/translations/pl-PL.json b/packages/uniswap/src/i18n/locales/translations/pl-PL.json index 2d44ff150af..29ec82c2163 100644 --- a/packages/uniswap/src/i18n/locales/translations/pl-PL.json +++ b/packages/uniswap/src/i18n/locales/translations/pl-PL.json @@ -1675,6 +1675,7 @@ "settings.action.lock": "Zablokuj portfel", "settings.action.privacy": "Polityka prywatności", "settings.action.terms": "Warunki usługi", + "settings.connectWalletPlatform.warning": "Aby użyć Uniswap na {{platform}}, połącz się z portfelem, który obsługuje {{platform}}.", "settings.footer": "Wykonane z miłością, \nZespół Uniswap 🦄", "settings.hideSmallBalances": "Ukryj małe salda", "settings.hideSmallBalances.subtitle": "Salda poniżej 1 USD nie będą widoczne w Twoim portfelu.", @@ -1845,7 +1846,7 @@ "smartWallets.postSwapNudge.title.dapp": "Ta aplikacja obsługuje inteligentne portfele", "smartWallets.unavailableModal.description": "Inny dostawca portfela zarządza teraz ustawieniami inteligentnego portfela dla {{displayName}}. Możesz nadal używać Uniswap jak zwykle.", "smartWallets.unavailableModal.title": "Funkcje inteligentnego portfela są niedostępne", - "solanaPromo.banner.description": "Handluj tokenami Solana bezpośrednio w aplikacji internetowej Uniswap.", + "solanaPromo.banner.description": "Handluj tokenami Solana bezpośrednio na platformie Uniswap.", "solanaPromo.banner.title": "Solana jest już dostępna", "solanaPromo.modal.connectWallet": "Podłącz swój ulubiony portfel Solana", "solanaPromo.modal.startSwapping.button": "Rozpocznij wymianę na Solanie", diff --git a/packages/uniswap/src/i18n/locales/translations/pt-PT.json b/packages/uniswap/src/i18n/locales/translations/pt-PT.json index fb1b0588fb6..cb8e48d7a01 100644 --- a/packages/uniswap/src/i18n/locales/translations/pt-PT.json +++ b/packages/uniswap/src/i18n/locales/translations/pt-PT.json @@ -152,6 +152,7 @@ "bridging.estimatedTime.minutesAndSeconds": "~{{minutes}} min {{seconds}} s", "bridging.estimatedTime.minutesOnly": "~{{minutes}} min", "bridging.estimatedTime.secondsOnly": "~{{seconds}} s", + "bridgingPopularTokens.banner.description": "DOGE, XRP, XLP — now available on Unichain.", "chart.candlestick": "Vela", "chart.error.pools": "Não foi possível exibir dados históricos do pool atual.", "chart.error.tokens": "Não foi possível exibir dados históricos do token atual.", @@ -1437,17 +1438,32 @@ "poolFinder.availablePools.notFound.description": "Não foram encontrados pools v2 correspondentes. Verifique novamente sua seleção de tokens e se está acessando a carteira certa.", "pools.explore": "Explorar pools", "portfolio.activity.filters.timePeriod.all": "Todo o período", + "portfolio.activity.filters.transactionType.addLiquidity": "Add Liquidity", "portfolio.activity.filters.transactionType.all": "Todos os tipos", - "portfolio.activity.filters.transactionType.deposits": "Depósitos", - "portfolio.activity.filters.transactionType.staking": "Staking", + "portfolio.activity.filters.transactionType.approvals": "Approvals", + "portfolio.activity.filters.transactionType.claimFees": "Claim Fees", + "portfolio.activity.filters.transactionType.createPool": "Create Pool", + "portfolio.activity.filters.transactionType.mints": "Mints", + "portfolio.activity.filters.transactionType.removeLiquidity": "Remove Liquidity", "portfolio.activity.filters.transactionType.swaps": "Swaps", + "portfolio.activity.filters.transactionType.wraps": "Wraps", + "portfolio.activity.table.column.address": "Address", + "portfolio.activity.table.column.amount": "Amount", + "portfolio.activity.table.column.time": "Time", + "portfolio.activity.table.column.type": "Type", "portfolio.activity.title": "Atividade", - "portfolio.connectWallet.summary": "Track tokens, pools, and more across {{amount}}+ networks", "portfolio.defi.title": "DeFi", "portfolio.description": "Acompanhe seu portfólio de criptos em todas as redes e protocolos", + "portfolio.disconnected.connectWallet.cta": "Track your portfolio", + "portfolio.disconnected.cta.description": "Track tokens, positions, NFTs and more across {{numNetworks}}+ networks", + "portfolio.disconnected.demoWallet.description": "This is a view-only example. Connect your wallet to manage your portfolio.", + "portfolio.disconnected.demoWallet.title": "Demo wallet", + "portfolio.disconnected.viewYourPortfolio.cta": "to view your portfolio", "portfolio.nfts.title": "NFTs", "portfolio.overview.title": "Visão geral", "portfolio.title": "Portfólio", + "portfolio.tokens.balance.totalTokens": "{{numTokens}} tokens", + "portfolio.tokens.emptyState": "No tokens", "portfolio.tokens.table.column.allocation": "Alocação", "portfolio.tokens.table.column.balance": "Saldo", "portfolio.tokens.table.column.change1d": "Alteração de 1 dia", @@ -2505,6 +2521,12 @@ "uwulink.error.insufficientTokens": "Não há {{tokenSymbol}} suficiente em {{chain}}", "v2.notAvailable": "A Uniswap V2 não está disponível nesta rede.", "wallet.appSignIn": "Entrar com o aplicativo", + "wallet.connecting.description": "Complete connection in your wallet", + "wallet.connecting.solanaPrompt": "Use Solana on Uniswap", + "wallet.connecting.solanaPrompt.button": "Use Solana", + "wallet.connecting.solanaPrompt.description": "You’ll be asked to connect again in MetaMask", + "wallet.connecting.title.evm": "Connect to {{walletName}}", + "wallet.connecting.title.svm": "Connect to {{walletName}} on Solana", "wallet.connectingAgreement": "Ao conectar uma carteira, você concorda com os Termos de serviço e a Política de privacidade da Uniswap Labs.", "wallet.connectionFailed.message": "Connection attempt failed. Please try again, following the steps to connect in your wallet.", "wallet.mismatch.popup.description": "Sua carteira não é compatível com alguns recursos.", diff --git a/packages/uniswap/src/i18n/locales/translations/ru-RU.json b/packages/uniswap/src/i18n/locales/translations/ru-RU.json index a4e2f3b7bf7..0e9fe2c606c 100644 --- a/packages/uniswap/src/i18n/locales/translations/ru-RU.json +++ b/packages/uniswap/src/i18n/locales/translations/ru-RU.json @@ -152,6 +152,7 @@ "bridging.estimatedTime.minutesAndSeconds": "прибл. {{minutes}} мин. {{seconds}} с.", "bridging.estimatedTime.minutesOnly": "прибл. {{minutes}} мин.", "bridging.estimatedTime.secondsOnly": "прибл. {{seconds}} с.", + "bridgingPopularTokens.banner.description": "DOGE, XRP, XLP — now available on Unichain.", "chart.candlestick": "Свечной график", "chart.error.pools": "Невозможно отобразить исторические данные для текущего пула.", "chart.error.tokens": "Невозможно отобразить исторические данные для текущего токена.", @@ -1437,17 +1438,32 @@ "poolFinder.availablePools.notFound.description": "Соответствующие пулы v2 не найдены. Еще раз проверьте выбранные токены и убедитесь, что подключились к правильному кошельку.", "pools.explore": "Исследование пулов", "portfolio.activity.filters.timePeriod.all": "Все время", + "portfolio.activity.filters.transactionType.addLiquidity": "Add Liquidity", "portfolio.activity.filters.transactionType.all": "Все типы", - "portfolio.activity.filters.transactionType.deposits": "Депозиты", - "portfolio.activity.filters.transactionType.staking": "Стейкинг", + "portfolio.activity.filters.transactionType.approvals": "Approvals", + "portfolio.activity.filters.transactionType.claimFees": "Claim Fees", + "portfolio.activity.filters.transactionType.createPool": "Create Pool", + "portfolio.activity.filters.transactionType.mints": "Mints", + "portfolio.activity.filters.transactionType.removeLiquidity": "Remove Liquidity", "portfolio.activity.filters.transactionType.swaps": "Свопы", + "portfolio.activity.filters.transactionType.wraps": "Wraps", + "portfolio.activity.table.column.address": "Address", + "portfolio.activity.table.column.amount": "Amount", + "portfolio.activity.table.column.time": "Time", + "portfolio.activity.table.column.type": "Type", "portfolio.activity.title": "Активность", - "portfolio.connectWallet.summary": "Track tokens, pools, and more across {{amount}}+ networks", "portfolio.defi.title": "DeFi", "portfolio.description": "Отслеживайте свои криптовалюты во всех блокчейнах и протоколах", + "portfolio.disconnected.connectWallet.cta": "Track your portfolio", + "portfolio.disconnected.cta.description": "Track tokens, positions, NFTs and more across {{numNetworks}}+ networks", + "portfolio.disconnected.demoWallet.description": "This is a view-only example. Connect your wallet to manage your portfolio.", + "portfolio.disconnected.demoWallet.title": "Demo wallet", + "portfolio.disconnected.viewYourPortfolio.cta": "to view your portfolio", "portfolio.nfts.title": "NFT", "portfolio.overview.title": "Обзор", "portfolio.title": "Портфель", + "portfolio.tokens.balance.totalTokens": "{{numTokens}} tokens", + "portfolio.tokens.emptyState": "No tokens", "portfolio.tokens.table.column.allocation": "Распределение", "portfolio.tokens.table.column.balance": "Баланс", "portfolio.tokens.table.column.change1d": "Изменения за 1 дн.", @@ -2505,6 +2521,12 @@ "uwulink.error.insufficientTokens": "Недостаточно {{tokenSymbol}} в {{chain}}", "v2.notAvailable": "Протокол Uniswap V2 недоступен в этой сети.", "wallet.appSignIn": "Войти через приложение", + "wallet.connecting.description": "Complete connection in your wallet", + "wallet.connecting.solanaPrompt": "Use Solana on Uniswap", + "wallet.connecting.solanaPrompt.button": "Use Solana", + "wallet.connecting.solanaPrompt.description": "You’ll be asked to connect again in MetaMask", + "wallet.connecting.title.evm": "Connect to {{walletName}}", + "wallet.connecting.title.svm": "Connect to {{walletName}} on Solana", "wallet.connectingAgreement": "Подключая кошелек, вы принимаете Условия обслуживания и Политику конфиденциальности Uniswap Labs.", "wallet.connectionFailed.message": "Connection attempt failed. Please try again, following the steps to connect in your wallet.", "wallet.mismatch.popup.description": "В подключенном кошельке не поддерживаются некоторые функции.", diff --git a/packages/uniswap/src/i18n/locales/translations/sl-SI.json b/packages/uniswap/src/i18n/locales/translations/sl-SI.json index 7953e1a00d8..223da00c4b1 100644 --- a/packages/uniswap/src/i18n/locales/translations/sl-SI.json +++ b/packages/uniswap/src/i18n/locales/translations/sl-SI.json @@ -1675,6 +1675,7 @@ "settings.action.lock": "Zakleni denarnico", "settings.action.privacy": "Politika zasebnosti", "settings.action.terms": "Pogoji storitve", + "settings.connectWalletPlatform.warning": "Za uporabo Uniswapa na {{platform}}se povežite z denarnico, ki podpira {{platform}}.", "settings.footer": "Narejeno z ljubeznijo, \nekipa Uniswap 🦄", "settings.hideSmallBalances": "Skrij majhna stanja", "settings.hideSmallBalances.subtitle": "Stanja pod 1 USD bodo skrita v vašem portfelju.", @@ -1845,7 +1846,7 @@ "smartWallets.postSwapNudge.title.dapp": "Ta aplikacija podpira pametne denarnice", "smartWallets.unavailableModal.description": "Nastavitve pametne denarnice za {{displayName}}zdaj upravlja drug ponudnik denarnic. Uniswap lahko še naprej uporabljate kot običajno.", "smartWallets.unavailableModal.title": "Funkcije pametne denarnice niso na voljo", - "solanaPromo.banner.description": "Trgujte z žetoni Solana neposredno v spletni aplikaciji Uniswap.", + "solanaPromo.banner.description": "Trgujte z žetoni Solana neposredno na Uniswapu.", "solanaPromo.banner.title": "Solana je zdaj na voljo", "solanaPromo.modal.connectWallet": "Povežite svojo najljubšo denarnico Solana", "solanaPromo.modal.startSwapping.button": "Začnite menjati na Solani", diff --git a/packages/uniswap/src/i18n/locales/translations/sr-SP.json b/packages/uniswap/src/i18n/locales/translations/sr-SP.json index a65b21f9ec0..afaef20798b 100644 --- a/packages/uniswap/src/i18n/locales/translations/sr-SP.json +++ b/packages/uniswap/src/i18n/locales/translations/sr-SP.json @@ -1675,6 +1675,7 @@ "settings.action.lock": "Закључајте новчаник", "settings.action.privacy": "Правила о приватности", "settings.action.terms": "Услови коришћења", + "settings.connectWalletPlatform.warning": "To use Uniswap on {{platform}}, connect to a wallet that supports {{platform}}.", "settings.footer": "Направљен с љубављу, \nУнисвап тим 🦄", "settings.hideSmallBalances": "Сакријте мале биланце", "settings.hideSmallBalances.subtitle": "Balances under 1 USD will be hidden from your portfolio.", @@ -1845,7 +1846,7 @@ "smartWallets.postSwapNudge.title.dapp": "This app supports smart wallets", "smartWallets.unavailableModal.description": "A different wallet provider is now managing smart wallet settings for {{displayName}}. You can continue using Uniswap as normal.", "smartWallets.unavailableModal.title": "Smart wallet features unavailable", - "solanaPromo.banner.description": "Trade Solana tokens directly on the Uniswap Web App.", + "solanaPromo.banner.description": "Trade Solana tokens directly on Uniswap.", "solanaPromo.banner.title": "Solana is now available", "solanaPromo.modal.connectWallet": "Connect your favorite Solana wallet", "solanaPromo.modal.startSwapping.button": "Start swapping on Solana", diff --git a/packages/uniswap/src/i18n/locales/translations/sv-SE.json b/packages/uniswap/src/i18n/locales/translations/sv-SE.json index 87294b31017..dd01404d9fc 100644 --- a/packages/uniswap/src/i18n/locales/translations/sv-SE.json +++ b/packages/uniswap/src/i18n/locales/translations/sv-SE.json @@ -1675,6 +1675,7 @@ "settings.action.lock": "Lås plånbok", "settings.action.privacy": "Integritetspolicy", "settings.action.terms": "Användarvillkor", + "settings.connectWalletPlatform.warning": "För att använda Uniswap på {{platform}}, anslut till en plånbok som stöder {{platform}}.", "settings.footer": "Tillverkad med kärlek, \nUniswap Team 🦄", "settings.hideSmallBalances": "Dölj små saldon", "settings.hideSmallBalances.subtitle": "Saldon under 1 USD kommer att döljas från din portfölj.", @@ -1845,7 +1846,7 @@ "smartWallets.postSwapNudge.title.dapp": "Den här appen stöder smarta plånböcker", "smartWallets.unavailableModal.description": "En annan plånboksleverantör hanterar nu smarta plånboksinställningar för {{displayName}}. Du kan fortsätta använda Uniswap som vanligt.", "smartWallets.unavailableModal.title": "Smarta plånboksfunktioner är inte tillgängliga", - "solanaPromo.banner.description": "Handla Solana-tokens direkt i Uniswap-webbappen.", + "solanaPromo.banner.description": "Handla Solana-tokens direkt på Uniswap.", "solanaPromo.banner.title": "Solana är nu tillgänglig", "solanaPromo.modal.connectWallet": "Anslut din favorit Solana-plånbok", "solanaPromo.modal.startSwapping.button": "Börja byta på Solana", diff --git a/packages/uniswap/src/i18n/locales/translations/sw-TZ.json b/packages/uniswap/src/i18n/locales/translations/sw-TZ.json index 8015c9a4637..7e2958541b6 100644 --- a/packages/uniswap/src/i18n/locales/translations/sw-TZ.json +++ b/packages/uniswap/src/i18n/locales/translations/sw-TZ.json @@ -1675,6 +1675,7 @@ "settings.action.lock": "Funga mkoba", "settings.action.privacy": "Sera ya faragha", "settings.action.terms": "Masharti ya huduma", + "settings.connectWalletPlatform.warning": "To use Uniswap on {{platform}}, connect to a wallet that supports {{platform}}.", "settings.footer": "Imetengenezwa kwa upendo, \nTimu ya Uniswap 🦄", "settings.hideSmallBalances": "Ficha mizani ndogo", "settings.hideSmallBalances.subtitle": "Balances under 1 USD will be hidden from your portfolio.", @@ -1845,7 +1846,7 @@ "smartWallets.postSwapNudge.title.dapp": "This app supports smart wallets", "smartWallets.unavailableModal.description": "A different wallet provider is now managing smart wallet settings for {{displayName}}. You can continue using Uniswap as normal.", "smartWallets.unavailableModal.title": "Smart wallet features unavailable", - "solanaPromo.banner.description": "Trade Solana tokens directly on the Uniswap Web App.", + "solanaPromo.banner.description": "Trade Solana tokens directly on Uniswap.", "solanaPromo.banner.title": "Solana is now available", "solanaPromo.modal.connectWallet": "Connect your favorite Solana wallet", "solanaPromo.modal.startSwapping.button": "Start swapping on Solana", diff --git a/packages/uniswap/src/i18n/locales/translations/tr-TR.json b/packages/uniswap/src/i18n/locales/translations/tr-TR.json index 5b508028083..8282c8779ad 100644 --- a/packages/uniswap/src/i18n/locales/translations/tr-TR.json +++ b/packages/uniswap/src/i18n/locales/translations/tr-TR.json @@ -152,6 +152,7 @@ "bridging.estimatedTime.minutesAndSeconds": "~{{minutes}} dk {{seconds}} sn", "bridging.estimatedTime.minutesOnly": "~{{minutes}} dk", "bridging.estimatedTime.secondsOnly": "~{{seconds}} sn", + "bridgingPopularTokens.banner.description": "DOGE, XRP, XLP — now available on Unichain.", "chart.candlestick": "Mum grafiği", "chart.error.pools": "Geçerli havuza ilişkin geçmiş veriler görüntülenemiyor.", "chart.error.tokens": "Geçerli token'ın geçmiş verileri görüntülenemiyor.", @@ -1437,17 +1438,32 @@ "poolFinder.availablePools.notFound.description": "Eşleşen v2 havuzları bulunamadı. Token seçimini bir kez daha kontrol et ve doğru cüzdana bağlı olduğundan emin ol.", "pools.explore": "Havuzları keşfet", "portfolio.activity.filters.timePeriod.all": "Her zaman", + "portfolio.activity.filters.transactionType.addLiquidity": "Add Liquidity", "portfolio.activity.filters.transactionType.all": "Tüm türler", - "portfolio.activity.filters.transactionType.deposits": "Yatırılan", - "portfolio.activity.filters.transactionType.staking": "Staking", + "portfolio.activity.filters.transactionType.approvals": "Approvals", + "portfolio.activity.filters.transactionType.claimFees": "Claim Fees", + "portfolio.activity.filters.transactionType.createPool": "Create Pool", + "portfolio.activity.filters.transactionType.mints": "Mints", + "portfolio.activity.filters.transactionType.removeLiquidity": "Remove Liquidity", "portfolio.activity.filters.transactionType.swaps": "Swap'lar", + "portfolio.activity.filters.transactionType.wraps": "Wraps", + "portfolio.activity.table.column.address": "Address", + "portfolio.activity.table.column.amount": "Amount", + "portfolio.activity.table.column.time": "Time", + "portfolio.activity.table.column.type": "Type", "portfolio.activity.title": "Etkinlik", - "portfolio.connectWallet.summary": "Track tokens, pools, and more across {{amount}}+ networks", "portfolio.defi.title": "DeFi", "portfolio.description": "Kripto para portföyünü tüm zincirlerde ve protokollerde takip et", + "portfolio.disconnected.connectWallet.cta": "Track your portfolio", + "portfolio.disconnected.cta.description": "Track tokens, positions, NFTs and more across {{numNetworks}}+ networks", + "portfolio.disconnected.demoWallet.description": "This is a view-only example. Connect your wallet to manage your portfolio.", + "portfolio.disconnected.demoWallet.title": "Demo wallet", + "portfolio.disconnected.viewYourPortfolio.cta": "to view your portfolio", "portfolio.nfts.title": "NFT'ler", "portfolio.overview.title": "Genel Bakış", "portfolio.title": "Portföy", + "portfolio.tokens.balance.totalTokens": "{{numTokens}} tokens", + "portfolio.tokens.emptyState": "No tokens", "portfolio.tokens.table.column.allocation": "Dağıtım", "portfolio.tokens.table.column.balance": "Bakiye", "portfolio.tokens.table.column.change1d": "1 Günlük Değişim", @@ -2505,6 +2521,12 @@ "uwulink.error.insufficientTokens": "{{chain}} zincirinde yeterli {{tokenSymbol}} yok", "v2.notAvailable": "Uniswap V2 bu ağda mevcut değil.", "wallet.appSignIn": "Uygulama ile giriş yap", + "wallet.connecting.description": "Complete connection in your wallet", + "wallet.connecting.solanaPrompt": "Use Solana on Uniswap", + "wallet.connecting.solanaPrompt.button": "Use Solana", + "wallet.connecting.solanaPrompt.description": "You’ll be asked to connect again in MetaMask", + "wallet.connecting.title.evm": "Connect to {{walletName}}", + "wallet.connecting.title.svm": "Connect to {{walletName}} on Solana", "wallet.connectingAgreement": "Bir cüzdan bağlayarak Uniswap Labs'ın Hizmet Şartlarını ve Gizlilik Politikasını kabul etmiş olursun.", "wallet.connectionFailed.message": "Connection attempt failed. Please try again, following the steps to connect in your wallet.", "wallet.mismatch.popup.description": "Bağlı cüzdanın, bazı özellikleri desteklemiyor.", diff --git a/packages/uniswap/src/i18n/locales/translations/uk-UA.json b/packages/uniswap/src/i18n/locales/translations/uk-UA.json index 147135f6657..2cd48cba7bb 100644 --- a/packages/uniswap/src/i18n/locales/translations/uk-UA.json +++ b/packages/uniswap/src/i18n/locales/translations/uk-UA.json @@ -1675,6 +1675,7 @@ "settings.action.lock": "Заблокувати гаманець", "settings.action.privacy": "Політика конфіденційності", "settings.action.terms": "Умови використання", + "settings.connectWalletPlatform.warning": "Щоб використовувати Uniswap на {{platform}}, підключіться до гаманця, який підтримує {{platform}}.", "settings.footer": "Зроблено з любов’ю, \nкоманда Uniswap 🦄", "settings.hideSmallBalances": "Приховайте невеликі залишки", "settings.hideSmallBalances.subtitle": "Залишки менше 1 долара США будуть приховані з вашого портфеля.", @@ -1845,7 +1846,7 @@ "smartWallets.postSwapNudge.title.dapp": "Цей додаток підтримує розумні гаманці", "smartWallets.unavailableModal.description": "Інший постачальник гаманців тепер керує налаштуваннями смарт-гаманця для {{displayName}}. Ви можете продовжувати користуватися Uniswap як завжди.", "smartWallets.unavailableModal.title": "Функції розумного гаманця недоступні", - "solanaPromo.banner.description": "Торгуйте токенами Solana безпосередньо у веб-додатку Uniswap.", + "solanaPromo.banner.description": "Торгуйте токенами Solana безпосередньо на Uniswap.", "solanaPromo.banner.title": "Солана вже доступна", "solanaPromo.modal.connectWallet": "Підключіть свій улюблений гаманець Solana", "solanaPromo.modal.startSwapping.button": "Почніть обмін на Solana", diff --git a/packages/uniswap/src/i18n/locales/translations/ur-PK.json b/packages/uniswap/src/i18n/locales/translations/ur-PK.json index af9efc42fb9..184ada9065d 100644 --- a/packages/uniswap/src/i18n/locales/translations/ur-PK.json +++ b/packages/uniswap/src/i18n/locales/translations/ur-PK.json @@ -1675,6 +1675,7 @@ "settings.action.lock": "پرس مقفل کریں۔", "settings.action.privacy": "رازداری کی پالیسی", "settings.action.terms": "سروس کی شرائط", + "settings.connectWalletPlatform.warning": "{{platform}}پر Uniswap استعمال کرنے کے لیے، ایک ایسے والیٹ سے جڑیں جو {{platform}}کو سپورٹ کرتا ہو۔", "settings.footer": "محبت کے ساتھ بنایا گیا، \nUnswap ٹیم 🦄", "settings.hideSmallBalances": "چھوٹے بیلنس چھپائیں۔", "settings.hideSmallBalances.subtitle": "1 USD سے کم بیلنس آپ کے پورٹ فولیو سے چھپائے جائیں گے۔", @@ -1845,7 +1846,7 @@ "smartWallets.postSwapNudge.title.dapp": "یہ ایپ سمارٹ بٹوے کو سپورٹ کرتی ہے۔", "smartWallets.unavailableModal.description": "ایک مختلف والیٹ فراہم کنندہ اب {{displayName}}کے لیے سمارٹ والیٹ کی ترتیبات کا انتظام کر رہا ہے۔ آپ یونی سویپ کا استعمال معمول کے مطابق جاری رکھ سکتے ہیں۔", "smartWallets.unavailableModal.title": "اسمارٹ والیٹ کی خصوصیات دستیاب نہیں ہیں۔", - "solanaPromo.banner.description": "سولانا ٹوکنز کو براہ راست Uniswap ویب ایپ پر تجارت کریں۔", + "solanaPromo.banner.description": "سولانا ٹوکنز کو براہ راست Uniswap پر تجارت کریں۔", "solanaPromo.banner.title": "سولانا اب دستیاب ہے۔", "solanaPromo.modal.connectWallet": "اپنے پسندیدہ سولانا والیٹ کو جوڑیں۔", "solanaPromo.modal.startSwapping.button": "سولانا پر تبادلہ کرنا شروع کریں۔", diff --git a/packages/uniswap/src/i18n/locales/translations/vi-VN.json b/packages/uniswap/src/i18n/locales/translations/vi-VN.json index dd72bb83886..ea0d816cc7e 100644 --- a/packages/uniswap/src/i18n/locales/translations/vi-VN.json +++ b/packages/uniswap/src/i18n/locales/translations/vi-VN.json @@ -152,6 +152,7 @@ "bridging.estimatedTime.minutesAndSeconds": "~{{minutes}} phút {{seconds}} giây", "bridging.estimatedTime.minutesOnly": "~{{minutes}} phút", "bridging.estimatedTime.secondsOnly": "~{{seconds}} giây", + "bridgingPopularTokens.banner.description": "DOGE, XRP, XLP — now available on Unichain.", "chart.candlestick": "Biểu đồ nến", "chart.error.pools": "Không thể hiển thị dữ liệu lịch sử cho pool hiện tại.", "chart.error.tokens": "Không thể hiển thị dữ liệu lịch sử cho token hiện tại.", @@ -1437,17 +1438,32 @@ "poolFinder.availablePools.notFound.description": "Không tìm thấy pool v2 trùng khớp. Hãy kiểm tra lại lựa chọn token của bạn và đảm bảo bạn đã kết nối với đúng ví.", "pools.explore": "Khám phá pool", "portfolio.activity.filters.timePeriod.all": "Mọi thời điểm", + "portfolio.activity.filters.transactionType.addLiquidity": "Add Liquidity", "portfolio.activity.filters.transactionType.all": "Mọi loại", - "portfolio.activity.filters.transactionType.deposits": "Các giao dịch nạp", - "portfolio.activity.filters.transactionType.staking": "Staking", + "portfolio.activity.filters.transactionType.approvals": "Approvals", + "portfolio.activity.filters.transactionType.claimFees": "Claim Fees", + "portfolio.activity.filters.transactionType.createPool": "Create Pool", + "portfolio.activity.filters.transactionType.mints": "Mints", + "portfolio.activity.filters.transactionType.removeLiquidity": "Remove Liquidity", "portfolio.activity.filters.transactionType.swaps": "Các giao dịch hoán đổi", + "portfolio.activity.filters.transactionType.wraps": "Wraps", + "portfolio.activity.table.column.address": "Address", + "portfolio.activity.table.column.amount": "Amount", + "portfolio.activity.table.column.time": "Time", + "portfolio.activity.table.column.type": "Type", "portfolio.activity.title": "Hoạt động", - "portfolio.connectWallet.summary": "Track tokens, pools, and more across {{amount}}+ networks", "portfolio.defi.title": "DeFi", "portfolio.description": "Theo dõi danh mục đầu tư crypto của bạn trên tất cả các blockchain và giao thức", + "portfolio.disconnected.connectWallet.cta": "Track your portfolio", + "portfolio.disconnected.cta.description": "Track tokens, positions, NFTs and more across {{numNetworks}}+ networks", + "portfolio.disconnected.demoWallet.description": "This is a view-only example. Connect your wallet to manage your portfolio.", + "portfolio.disconnected.demoWallet.title": "Demo wallet", + "portfolio.disconnected.viewYourPortfolio.cta": "to view your portfolio", "portfolio.nfts.title": "NFT", "portfolio.overview.title": "Tổng quan", "portfolio.title": "Danh mục đầu tư", + "portfolio.tokens.balance.totalTokens": "{{numTokens}} tokens", + "portfolio.tokens.emptyState": "No tokens", "portfolio.tokens.table.column.allocation": "Phân bổ", "portfolio.tokens.table.column.balance": "Số dư", "portfolio.tokens.table.column.change1d": "Biến động trong 1 ngày", @@ -2505,6 +2521,12 @@ "uwulink.error.insufficientTokens": "Không đủ {{tokenSymbol}} trên {{chain}}", "v2.notAvailable": "Uniswap V2 không khả dụng trên mạng này.", "wallet.appSignIn": "Đăng nhập bằng ứng dụng", + "wallet.connecting.description": "Complete connection in your wallet", + "wallet.connecting.solanaPrompt": "Use Solana on Uniswap", + "wallet.connecting.solanaPrompt.button": "Use Solana", + "wallet.connecting.solanaPrompt.description": "You’ll be asked to connect again in MetaMask", + "wallet.connecting.title.evm": "Connect to {{walletName}}", + "wallet.connecting.title.svm": "Connect to {{walletName}} on Solana", "wallet.connectingAgreement": "Bằng việc kết nối ví, bạn đồng ý với Điều khoản dịch vụ của Uniswap Labs và chấp nhận Chính sách về quyền riêng tư của Uniswap Labs.", "wallet.connectionFailed.message": "Connection attempt failed. Please try again, following the steps to connect in your wallet.", "wallet.mismatch.popup.description": "Ví đã kết nối của bạn không hỗ trợ một số tính năng.", diff --git a/packages/uniswap/src/i18n/locales/translations/zh-CN.json b/packages/uniswap/src/i18n/locales/translations/zh-CN.json index 4822b97d6f4..17ad3bb5632 100644 --- a/packages/uniswap/src/i18n/locales/translations/zh-CN.json +++ b/packages/uniswap/src/i18n/locales/translations/zh-CN.json @@ -152,6 +152,7 @@ "bridging.estimatedTime.minutesAndSeconds": "~{{minutes}} 分钟 {{seconds}} 秒", "bridging.estimatedTime.minutesOnly": "~{{minutes}} 分钟", "bridging.estimatedTime.secondsOnly": "~{{seconds}} 秒", + "bridgingPopularTokens.banner.description": "DOGE, XRP, XLP — now available on Unichain.", "chart.candlestick": "K 线图", "chart.error.pools": "无法显示当前资金池的历史数据。", "chart.error.tokens": "无法显示当前代币的历史数据。", @@ -1437,17 +1438,32 @@ "poolFinder.availablePools.notFound.description": "未找到相符的 v2 资金池。请仔细检查你选择的代币,并确保你已连接至正确的钱包。", "pools.explore": "探索资金池", "portfolio.activity.filters.timePeriod.all": "所有时间", + "portfolio.activity.filters.transactionType.addLiquidity": "Add Liquidity", "portfolio.activity.filters.transactionType.all": "所有类型", - "portfolio.activity.filters.transactionType.deposits": "存入", - "portfolio.activity.filters.transactionType.staking": "质押", + "portfolio.activity.filters.transactionType.approvals": "Approvals", + "portfolio.activity.filters.transactionType.claimFees": "Claim Fees", + "portfolio.activity.filters.transactionType.createPool": "Create Pool", + "portfolio.activity.filters.transactionType.mints": "Mints", + "portfolio.activity.filters.transactionType.removeLiquidity": "Remove Liquidity", "portfolio.activity.filters.transactionType.swaps": "交换", + "portfolio.activity.filters.transactionType.wraps": "Wraps", + "portfolio.activity.table.column.address": "Address", + "portfolio.activity.table.column.amount": "Amount", + "portfolio.activity.table.column.time": "Time", + "portfolio.activity.table.column.type": "Type", "portfolio.activity.title": "活动", - "portfolio.connectWallet.summary": "Track tokens, pools, and more across {{amount}}+ networks", "portfolio.defi.title": "DeFi", "portfolio.description": "跨所有区块链和协议追踪你的加密货币资产组合", + "portfolio.disconnected.connectWallet.cta": "Track your portfolio", + "portfolio.disconnected.cta.description": "Track tokens, positions, NFTs and more across {{numNetworks}}+ networks", + "portfolio.disconnected.demoWallet.description": "This is a view-only example. Connect your wallet to manage your portfolio.", + "portfolio.disconnected.demoWallet.title": "Demo wallet", + "portfolio.disconnected.viewYourPortfolio.cta": "to view your portfolio", "portfolio.nfts.title": "非同质化代币", "portfolio.overview.title": "概览", "portfolio.title": "资产组合", + "portfolio.tokens.balance.totalTokens": "{{numTokens}} tokens", + "portfolio.tokens.emptyState": "No tokens", "portfolio.tokens.table.column.allocation": "配额", "portfolio.tokens.table.column.balance": "余额", "portfolio.tokens.table.column.change1d": "24 小时变动", @@ -2505,6 +2521,12 @@ "uwulink.error.insufficientTokens": "{{chain}} 上的 {{tokenSymbol}} 不足", "v2.notAvailable": "Uniswap V2 在此网络上不可用。", "wallet.appSignIn": "使用应用登录", + "wallet.connecting.description": "Complete connection in your wallet", + "wallet.connecting.solanaPrompt": "Use Solana on Uniswap", + "wallet.connecting.solanaPrompt.button": "Use Solana", + "wallet.connecting.solanaPrompt.description": "You’ll be asked to connect again in MetaMask", + "wallet.connecting.title.evm": "Connect to {{walletName}}", + "wallet.connecting.title.svm": "Connect to {{walletName}} on Solana", "wallet.connectingAgreement": "通过连接钱包,表明你同意 Uniswap 实验室 的服务条款及其隐私政策。", "wallet.connectionFailed.message": "Connection attempt failed. Please try again, following the steps to connect in your wallet.", "wallet.mismatch.popup.description": "某些功能你的联网钱包不支持。", diff --git a/packages/uniswap/src/i18n/locales/translations/zh-TW.json b/packages/uniswap/src/i18n/locales/translations/zh-TW.json index 43410fc3108..21c0ea4913e 100644 --- a/packages/uniswap/src/i18n/locales/translations/zh-TW.json +++ b/packages/uniswap/src/i18n/locales/translations/zh-TW.json @@ -152,6 +152,7 @@ "bridging.estimatedTime.minutesAndSeconds": "~{{minutes}} 分 {{seconds}} 秒", "bridging.estimatedTime.minutesOnly": "~{{minutes}} 分鐘", "bridging.estimatedTime.secondsOnly": "~{{seconds}} 秒", + "bridgingPopularTokens.banner.description": "DOGE, XRP, XLP — now available on Unichain.", "chart.candlestick": "K 線圖表", "chart.error.pools": "無法顯示目前資產池的過往記錄資料。", "chart.error.tokens": "無法顯示目前代幣的過往記錄資料。", @@ -1437,17 +1438,32 @@ "poolFinder.availablePools.notFound.description": "未找到相符的 v2 資產池。請仔細檢查你選取的代幣,並確保你已連接至正確的錢包。", "pools.explore": "探索資產池", "portfolio.activity.filters.timePeriod.all": "全部時間", + "portfolio.activity.filters.transactionType.addLiquidity": "Add Liquidity", "portfolio.activity.filters.transactionType.all": "所有類型", - "portfolio.activity.filters.transactionType.deposits": "存入", - "portfolio.activity.filters.transactionType.staking": "質押", + "portfolio.activity.filters.transactionType.approvals": "Approvals", + "portfolio.activity.filters.transactionType.claimFees": "Claim Fees", + "portfolio.activity.filters.transactionType.createPool": "Create Pool", + "portfolio.activity.filters.transactionType.mints": "Mints", + "portfolio.activity.filters.transactionType.removeLiquidity": "Remove Liquidity", "portfolio.activity.filters.transactionType.swaps": "交換", + "portfolio.activity.filters.transactionType.wraps": "Wraps", + "portfolio.activity.table.column.address": "Address", + "portfolio.activity.table.column.amount": "Amount", + "portfolio.activity.table.column.time": "Time", + "portfolio.activity.table.column.type": "Type", "portfolio.activity.title": "活動", - "portfolio.connectWallet.summary": "Track tokens, pools, and more across {{amount}}+ networks", "portfolio.defi.title": "DeFi", "portfolio.description": "跨所有鏈和協定追蹤您的加密貨幣資產組合", + "portfolio.disconnected.connectWallet.cta": "Track your portfolio", + "portfolio.disconnected.cta.description": "Track tokens, positions, NFTs and more across {{numNetworks}}+ networks", + "portfolio.disconnected.demoWallet.description": "This is a view-only example. Connect your wallet to manage your portfolio.", + "portfolio.disconnected.demoWallet.title": "Demo wallet", + "portfolio.disconnected.viewYourPortfolio.cta": "to view your portfolio", "portfolio.nfts.title": "NFT", "portfolio.overview.title": "概覽", "portfolio.title": "資產組合", + "portfolio.tokens.balance.totalTokens": "{{numTokens}} tokens", + "portfolio.tokens.emptyState": "No tokens", "portfolio.tokens.table.column.allocation": "配額", "portfolio.tokens.table.column.balance": "餘額", "portfolio.tokens.table.column.change1d": "1 日變動", @@ -2505,6 +2521,12 @@ "uwulink.error.insufficientTokens": "{{chain}} 上的 {{tokenSymbol}} 不足", "v2.notAvailable": "Uniswap V2 在此網路上不適用。", "wallet.appSignIn": "使用 App 登入", + "wallet.connecting.description": "Complete connection in your wallet", + "wallet.connecting.solanaPrompt": "Use Solana on Uniswap", + "wallet.connecting.solanaPrompt.button": "Use Solana", + "wallet.connecting.solanaPrompt.description": "You’ll be asked to connect again in MetaMask", + "wallet.connecting.title.evm": "Connect to {{walletName}}", + "wallet.connecting.title.svm": "Connect to {{walletName}} on Solana", "wallet.connectingAgreement": "連線錢包即表示你同意 Uniswap Labs 的服務條款並同意其隱私權政策。", "wallet.connectionFailed.message": "Connection attempt failed. Please try again, following the steps to connect in your wallet.", "wallet.mismatch.popup.description": "你的已連接錢包不支援某些功能。", diff --git a/packages/uniswap/src/state/oldTypes.ts b/packages/uniswap/src/state/oldTypes.ts index c78dd73667e..964e7c1d065 100644 --- a/packages/uniswap/src/state/oldTypes.ts +++ b/packages/uniswap/src/state/oldTypes.ts @@ -1,4 +1,4 @@ -import { ProtocolVersion } from '@uniswap/client-pools/dist/pools/v1/types_pb' +import { ProtocolVersion } from '@uniswap/client-data-api/dist/data/v1/poolTypes_pb' import { GraphQLApi } from '@universe/api' import { UniverseChainId } from 'uniswap/src/features/chains/types' import { SafetyInfo } from 'uniswap/src/features/dataApi/types' diff --git a/packages/uniswap/src/test/fixtures/gql/assets/tokens.ts b/packages/uniswap/src/test/fixtures/gql/assets/tokens.ts index ef474c92660..708ed37422c 100644 --- a/packages/uniswap/src/test/fixtures/gql/assets/tokens.ts +++ b/packages/uniswap/src/test/fixtures/gql/assets/tokens.ts @@ -58,6 +58,8 @@ export const token = createFixture({ sellFeeBps: '', }, protectionInfo, + isBridged: undefined, + bridgedWithdrawalInfo: undefined, })) export const tokenBalance = createFixture()(() => ({ diff --git a/packages/uniswap/src/test/fixtures/testIDs.ts b/packages/uniswap/src/test/fixtures/testIDs.ts index 4536dff1a7a..dc0ef02f8b1 100644 --- a/packages/uniswap/src/test/fixtures/testIDs.ts +++ b/packages/uniswap/src/test/fixtures/testIDs.ts @@ -69,6 +69,7 @@ export const TestID = { ExploreFilterChainPrefix: 'explore-filter-chain-', ExploreSearchInput: 'explore-search-input', ExploreSortButton: 'explore-sort-button', + ExploreTab: 'explore-tab', ExploreSortByVolume: 'explore-sort-by-volume', ExploreTokensSearchInput: 'explore-tokens-search-input', Favorite: 'favorite', @@ -81,6 +82,7 @@ export const TestID = { HiddenNftsRow: 'hidden-nfts-row', HelpIcon: 'help-icon', HelpModal: 'help-modal', + HomeTab: 'home-tab', ImportAccount: 'import-account', ImportAccountInput: 'import-account-input', InvertPrice: 'invert-price', diff --git a/packages/uniswap/src/test/mocks/gql/mocks.ts b/packages/uniswap/src/test/mocks/gql/mocks.ts index ec307734bc0..894a005e0ae 100644 --- a/packages/uniswap/src/test/mocks/gql/mocks.ts +++ b/packages/uniswap/src/test/mocks/gql/mocks.ts @@ -28,6 +28,8 @@ export const mocks = { symbol: () => faker.lorem.word(), protectionInfo: () => ({ result: randomEnumValue(GraphQLApi.ProtectionResult), attackTypes: [] }), feeData: () => ({ buyFeeBps: '', sellFeeBps: '' }), + isBridged: () => null, + bridgedWithdrawalInfo: () => null, }, Amount: { id: () => faker.datatype.uuid(), diff --git a/packages/uniswap/src/utils/datadog.web.ts b/packages/uniswap/src/utils/datadog.web.ts index 3da89dd1680..fd79ee7cc6e 100644 --- a/packages/uniswap/src/utils/datadog.web.ts +++ b/packages/uniswap/src/utils/datadog.web.ts @@ -1,17 +1,18 @@ import { datadogLogs } from '@datadog/browser-logs' import { datadogRum, RumEvent, RumEventDomainContext, RumFetchResourceEventDomainContext } from '@datadog/browser-rum' -import { config } from 'uniswap/src/config' import { DatadogIgnoredErrorsConfigKey, DatadogIgnoredErrorsValType, DatadogSessionSampleRateKey, DatadogSessionSampleRateValType, DynamicConfigs, -} from 'uniswap/src/features/gating/configs' -import { Experiments } from 'uniswap/src/features/gating/experiments' -import { WALLET_FEATURE_FLAG_NAMES, WEB_FEATURE_FLAG_NAMES } from 'uniswap/src/features/gating/flags' -import { getDynamicConfigValue } from 'uniswap/src/features/gating/hooks' -import { getStatsigClient } from 'uniswap/src/features/gating/sdk/statsig' + Experiments, + getDynamicConfigValue, + getStatsigClient, + WALLET_FEATURE_FLAG_NAMES, + WEB_FEATURE_FLAG_NAMES, +} from '@universe/gating' +import { config } from 'uniswap/src/config' import { getUniqueId } from 'utilities/src/device/uniqueId' import { datadogEnabledBuild, localDevDatadogEnabled } from 'utilities/src/environment/constants' import { isBetaEnv } from 'utilities/src/environment/env' @@ -40,7 +41,9 @@ function beforeSend(event: RumEvent, context: RumEventDomainContext): boolean { defaultValue: [], }) - const ignoredError = ignoredErrors.find(({ messageContains }) => event.error.message.includes(messageContains)) + const ignoredError = ignoredErrors.find(({ messageContains }: { messageContains: string }) => + event.error.message.includes(messageContains), + ) if (ignoredError && Math.random() > ignoredError.sampleRate) { return false } diff --git a/packages/uniswap/src/utils/search/doesTokenMatchSearchTerm.test.ts b/packages/uniswap/src/utils/search/doesTokenMatchSearchTerm.test.ts new file mode 100644 index 00000000000..f04ac41d388 --- /dev/null +++ b/packages/uniswap/src/utils/search/doesTokenMatchSearchTerm.test.ts @@ -0,0 +1,419 @@ +import { Currency } from '@uniswap/sdk-core' +import { DAI, nativeOnChain, USDC, WBTC } from 'uniswap/src/constants/tokens' +import { UniverseChainId } from 'uniswap/src/features/chains/types' +import { doesTokenMatchSearchTerm } from 'uniswap/src/utils/search/doesTokenMatchSearchTerm' + +// Test data factory functions using real tokens +const createMockCurrencyInfo = ( + overrides: Partial<{ currencyId: string; currency: Currency }> = {}, +): { currencyId: string; currency: Currency } => ({ + currencyId: 'TEST', + currency: USDC, // Default to USDC + ...overrides, +}) + +const createMockTokenWithInfo = ( + overrides: Partial<{ currencyInfo: { currencyId: string; currency: Currency } | null }> = {}, +): { currencyInfo: { currencyId: string; currency: Currency } | null } => ({ + currencyInfo: createMockCurrencyInfo(), + ...overrides, +}) + +describe('doesTokenMatchSearchTerm', () => { + describe('when searchTerm is empty or undefined', () => { + it('should return true when searchTerm is undefined', () => { + const token = createMockTokenWithInfo() + + const result = doesTokenMatchSearchTerm(token, undefined as any) + + expect(result).toBe(true) + }) + + it('should return true when searchTerm is null', () => { + const token = createMockTokenWithInfo() + + const result = doesTokenMatchSearchTerm(token, null as any) + + expect(result).toBe(true) + }) + + it('should return true when searchTerm is empty string', () => { + const token = createMockTokenWithInfo() + + const result = doesTokenMatchSearchTerm(token, '') + + expect(result).toBe(true) + }) + + it('should return true when searchTerm is only whitespace', () => { + const token = createMockTokenWithInfo() + + const result = doesTokenMatchSearchTerm(token, ' ') + + expect(result).toBe(true) + }) + + it('should return true when searchTerm is only tabs and newlines', () => { + const token = createMockTokenWithInfo() + + const result = doesTokenMatchSearchTerm(token, '\t\n\r ') + + expect(result).toBe(true) + }) + }) + + describe('when currencyInfo is null', () => { + it('should return false when currencyInfo is null', () => { + const token = createMockTokenWithInfo({ + currencyInfo: null, + }) + + const result = doesTokenMatchSearchTerm(token, 'test') + + expect(result).toBe(false) + }) + }) + + describe('when searching by token name', () => { + it('should match when search term is in token name (case insensitive)', () => { + const token = createMockTokenWithInfo({ + currencyInfo: createMockCurrencyInfo({ + currency: DAI, // DAI has name "Dai Stablecoin" + }), + }) + + const result = doesTokenMatchSearchTerm(token, 'dai') + + expect(result).toBe(true) + }) + + it('should match when search term is in token name with different case', () => { + const token = createMockTokenWithInfo({ + currencyInfo: createMockCurrencyInfo({ + currency: DAI, // DAI has name "Dai Stablecoin" + }), + }) + + const result = doesTokenMatchSearchTerm(token, 'STABLECOIN') + + expect(result).toBe(true) + }) + + it('should not match when search term is not in token name', () => { + const token = createMockTokenWithInfo({ + currencyInfo: createMockCurrencyInfo({ + currency: USDC, // USDC has name "USD Coin" + }), + }) + + const result = doesTokenMatchSearchTerm(token, 'bitcoin') + + expect(result).toBe(false) + }) + + it('should handle undefined token name', () => { + // Create a token with undefined name by modifying WBTC + const tokenWithUndefinedName = { + ...WBTC, + name: undefined, + } as any + + const token = createMockTokenWithInfo({ + currencyInfo: createMockCurrencyInfo({ + currency: tokenWithUndefinedName, + }), + }) + + const result = doesTokenMatchSearchTerm(token, 'test') + + expect(result).toBe(false) + }) + }) + + describe('when searching by token symbol', () => { + it('should match when search term is in token symbol (case insensitive)', () => { + const token = createMockTokenWithInfo({ + currencyInfo: createMockCurrencyInfo({ + currency: USDC, // USDC has symbol "USDC" + }), + }) + + const result = doesTokenMatchSearchTerm(token, 'usd') + + expect(result).toBe(true) + }) + + it('should match when search term is in token symbol with different case', () => { + const token = createMockTokenWithInfo({ + currencyInfo: createMockCurrencyInfo({ + currency: USDC, // USDC has symbol "USDC" + }), + }) + + const result = doesTokenMatchSearchTerm(token, 'USDC') + + expect(result).toBe(true) + }) + + it('should not match when search term is not in token symbol', () => { + const token = createMockTokenWithInfo({ + currencyInfo: createMockCurrencyInfo({ + currency: USDC, // USDC has symbol "USDC" + }), + }) + + const result = doesTokenMatchSearchTerm(token, 'bitcoin') + + expect(result).toBe(false) + }) + + it('should handle undefined token symbol', () => { + // Create a token with undefined symbol by modifying WBTC + const tokenWithUndefinedSymbol = { + ...WBTC, + symbol: undefined, + } as any + + const token = createMockTokenWithInfo({ + currencyInfo: createMockCurrencyInfo({ + currency: tokenWithUndefinedSymbol, + }), + }) + + const result = doesTokenMatchSearchTerm(token, 'test') + + expect(result).toBe(false) + }) + }) + + describe('when searching by token address', () => { + it('should match when search term is in token address (case insensitive)', () => { + const token = createMockTokenWithInfo({ + currencyInfo: createMockCurrencyInfo({ + currency: USDC, // USDC has address starting with 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + }), + }) + + const result = doesTokenMatchSearchTerm(token, 'a0b8') + + expect(result).toBe(true) + }) + + it('should match when search term is in token address with different case', () => { + const token = createMockTokenWithInfo({ + currencyInfo: createMockCurrencyInfo({ + currency: USDC, // USDC has address starting with 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + }), + }) + + const result = doesTokenMatchSearchTerm(token, 'A0B8') + + expect(result).toBe(true) + }) + + it('should not match when search term is not in token address', () => { + const token = createMockTokenWithInfo({ + currencyInfo: createMockCurrencyInfo({ + currency: USDC, + }), + }) + + const result = doesTokenMatchSearchTerm(token, '9999') + + expect(result).toBe(false) + }) + + it('should not search by address for native currencies', () => { + const token = createMockTokenWithInfo({ + currencyInfo: createMockCurrencyInfo({ + currency: nativeOnChain(UniverseChainId.Mainnet), // Native ETH + }), + }) + + const result = doesTokenMatchSearchTerm(token, '0x') + + expect(result).toBe(false) + }) + }) + + describe('when multiple fields match', () => { + it('should return true if name matches even if symbol and address do not', () => { + const token = createMockTokenWithInfo({ + currencyInfo: createMockCurrencyInfo({ + currency: DAI, // DAI has name "Dai Stablecoin" and symbol "DAI" + }), + }) + + const result = doesTokenMatchSearchTerm(token, 'dai') + + expect(result).toBe(true) + }) + + it('should return true if symbol matches even if name and address do not', () => { + const token = createMockTokenWithInfo({ + currencyInfo: createMockCurrencyInfo({ + currency: USDC, // USDC has symbol "USDC" and name "USD Coin" + }), + }) + + const result = doesTokenMatchSearchTerm(token, 'usd') + + expect(result).toBe(true) + }) + + it('should return true if address matches even if name and symbol do not', () => { + const token = createMockTokenWithInfo({ + currencyInfo: createMockCurrencyInfo({ + currency: USDC, // USDC has address starting with 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 + }), + }) + + const result = doesTokenMatchSearchTerm(token, 'a0b8') + + expect(result).toBe(true) + }) + }) + + describe('edge cases', () => { + it('should handle partial matches at the beginning of strings', () => { + const token = createMockTokenWithInfo({ + currencyInfo: createMockCurrencyInfo({ + currency: DAI, // DAI has symbol "DAI" + }), + }) + + const result = doesTokenMatchSearchTerm(token, 'dai') + + expect(result).toBe(true) + }) + + it('should handle partial matches at the end of strings', () => { + const token = createMockTokenWithInfo({ + currencyInfo: createMockCurrencyInfo({ + currency: DAI, // DAI has name "Dai Stablecoin" + }), + }) + + const result = doesTokenMatchSearchTerm(token, 'coin') + + expect(result).toBe(true) + }) + + it('should handle partial matches in the middle of strings', () => { + // Fix the imported WBTC token properties + const wbtcToken = { + ...WBTC, + name: 'Wrapped BTC', + symbol: 'WBTC', + } as any + + const token = createMockTokenWithInfo({ + currencyInfo: createMockCurrencyInfo({ + currency: wbtcToken, + }), + }) + + const result = doesTokenMatchSearchTerm(token, 'wrapped') + + expect(result).toBe(true) + }) + + it('should handle special characters in search term', () => { + const token = createMockTokenWithInfo({ + currencyInfo: createMockCurrencyInfo({ + currency: USDC, // USDC has name "USD Coin" + }), + }) + + const result = doesTokenMatchSearchTerm(token, 'usd') + + expect(result).toBe(true) + }) + + it('should handle very long search terms', () => { + const token = createMockTokenWithInfo({ + currencyInfo: createMockCurrencyInfo({ + currency: USDC, + }), + }) + + const longSearchTerm = 'a'.repeat(1000) + const result = doesTokenMatchSearchTerm(token, longSearchTerm) + + expect(result).toBe(false) + }) + + it('should handle empty token name and symbol', () => { + // Create a token with empty name and symbol by modifying WBTC + const tokenWithEmptyFields = { + ...WBTC, + name: '', + symbol: '', + } as any + + const token = createMockTokenWithInfo({ + currencyInfo: createMockCurrencyInfo({ + currency: tokenWithEmptyFields, + }), + }) + + const result = doesTokenMatchSearchTerm(token, 'test') + + expect(result).toBe(false) + }) + }) + + describe('with different currency types', () => { + it('should work with Token instances', () => { + const token = createMockTokenWithInfo({ + currencyInfo: createMockCurrencyInfo({ + currency: USDC, // USDC is a Token instance + }), + }) + + const result = doesTokenMatchSearchTerm(token, 'usd') + + expect(result).toBe(true) + }) + + it('should work with NativeCurrency instances', () => { + const token = createMockTokenWithInfo({ + currencyInfo: createMockCurrencyInfo({ + currency: nativeOnChain(UniverseChainId.Mainnet), // Native ETH + }), + }) + + const result = doesTokenMatchSearchTerm(token, 'ethereum') + + expect(result).toBe(true) + }) + + it('should not search by address for NativeCurrency', () => { + const token = createMockTokenWithInfo({ + currencyInfo: createMockCurrencyInfo({ + currency: nativeOnChain(UniverseChainId.Mainnet), // Native ETH + }), + }) + + // NativeCurrency doesn't have an address, so this should not match + const result = doesTokenMatchSearchTerm(token, '0x') + + expect(result).toBe(false) + }) + }) + + describe('case sensitivity', () => { + it('should be case insensitive for all fields', () => { + const token = createMockTokenWithInfo({ + currencyInfo: createMockCurrencyInfo({ + currency: USDC, // USDC has name "USD Coin" and symbol "USDC" + }), + }) + + expect(doesTokenMatchSearchTerm(token, 'usd')).toBe(true) + expect(doesTokenMatchSearchTerm(token, 'USD')).toBe(true) + expect(doesTokenMatchSearchTerm(token, 'Usd')).toBe(true) + expect(doesTokenMatchSearchTerm(token, 'UsD')).toBe(true) + }) + }) +}) diff --git a/packages/uniswap/src/utils/search/doesTokenMatchSearchTerm.ts b/packages/uniswap/src/utils/search/doesTokenMatchSearchTerm.ts new file mode 100644 index 00000000000..f056a6f7c2a --- /dev/null +++ b/packages/uniswap/src/utils/search/doesTokenMatchSearchTerm.ts @@ -0,0 +1,37 @@ +import { Currency, Token } from '@uniswap/sdk-core' + +/** + * Checks if a token matches a search term. + * + * @param token - The token to check + * @param searchTerm - The search term to match against + * @returns True if the token matches the search term, false otherwise + */ +export function doesTokenMatchSearchTerm( + token: { currencyInfo: { currencyId: string; currency: Currency } | null }, + searchTerm: string, +): boolean { + if (!searchTerm || !searchTerm.trim()) { + return true + } + + const lowercaseSearch = searchTerm.toLowerCase() + + const currencyInfo = token.currencyInfo + if (!currencyInfo) { + return false + } + const currency = currencyInfo.currency + + // Search by token name + const nameIncludesSearch = currency.name?.toLowerCase().includes(lowercaseSearch) + + // Search by token symbol + const symbolIncludesSearch = currency.symbol?.toLowerCase().includes(lowercaseSearch) + + // Search by token address (normalized for consistency with explore page) + const addressIncludesSearch = + currency instanceof Token ? currency.address.toLowerCase().includes(lowercaseSearch) : false + + return Boolean(nameIncludesSearch || symbolIncludesSearch || addressIncludesSearch) +} diff --git a/packages/uniswap/src/utils/search/getPossibleChainMatchFromSearchWord.test.ts b/packages/uniswap/src/utils/search/getPossibleChainMatchFromSearchWord.test.ts new file mode 100644 index 00000000000..af0cfc67144 --- /dev/null +++ b/packages/uniswap/src/utils/search/getPossibleChainMatchFromSearchWord.test.ts @@ -0,0 +1,437 @@ +import { UniverseChainId } from 'uniswap/src/features/chains/types' +import { getPossibleChainMatchFromSearchWord } from 'uniswap/src/utils/search/getPossibleChainMatchFromSearchWord' + +// Mock the dependencies before importing the function +jest.mock('uniswap/src/features/chains/chainInfo', () => ({ + getChainInfo: jest.fn(), +})) + +jest.mock('uniswap/src/features/chains/utils', () => ({ + isTestnetChain: jest.fn(), +})) + +// Import the mocked functions +import { getChainInfo } from 'uniswap/src/features/chains/chainInfo' +import { isTestnetChain } from 'uniswap/src/features/chains/utils' + +const mockGetChainInfo = getChainInfo as any +const mockIsTestnetChain = isTestnetChain as any + +describe('getPossibleChainMatchFromSearchWord', () => { + beforeEach(() => { + jest.clearAllMocks() + }) + + describe('when search word is empty or invalid', () => { + it('should return undefined when search word is empty string', () => { + const enabledChains = [UniverseChainId.Mainnet, UniverseChainId.Polygon] + + const result = getPossibleChainMatchFromSearchWord('', enabledChains) + + expect(result).toBeUndefined() + }) + + it('should return undefined when search word is null', () => { + const enabledChains = [UniverseChainId.Mainnet, UniverseChainId.Polygon] + + const result = getPossibleChainMatchFromSearchWord(null as any, enabledChains) + + expect(result).toBeUndefined() + }) + + it('should return undefined when search word is undefined', () => { + const enabledChains = [UniverseChainId.Mainnet, UniverseChainId.Polygon] + + const result = getPossibleChainMatchFromSearchWord(undefined as any, enabledChains) + + expect(result).toBeUndefined() + }) + + it('should return undefined when search word is only whitespace', () => { + const enabledChains = [UniverseChainId.Mainnet, UniverseChainId.Polygon] + + // Mock the functions to return proper structure + mockIsTestnetChain.mockReturnValue(false) + mockGetChainInfo.mockImplementation((chainId: UniverseChainId) => { + if (chainId === UniverseChainId.Mainnet) { + return { + nativeCurrency: { name: 'Ethereum' }, + interfaceName: 'mainnet', + } as any + } + if (chainId === UniverseChainId.Polygon) { + return { + nativeCurrency: { name: 'Polygon' }, + interfaceName: 'polygon', + } as any + } + return {} as any + }) + + const result = getPossibleChainMatchFromSearchWord(' ', enabledChains) + + expect(result).toBeUndefined() + }) + }) + + describe('when matching by native currency name', () => { + it('should match exact native currency name', () => { + const enabledChains = [UniverseChainId.Mainnet, UniverseChainId.Polygon] + + mockIsTestnetChain.mockReturnValue(false) + mockGetChainInfo.mockImplementation((chainId: UniverseChainId) => { + if (chainId === UniverseChainId.Mainnet) { + return { + nativeCurrency: { name: 'Ethereum' }, + interfaceName: 'mainnet', + } as any + } + if (chainId === UniverseChainId.Polygon) { + return { + nativeCurrency: { name: 'Polygon' }, + interfaceName: 'polygon', + } as any + } + return {} as any + }) + + const result = getPossibleChainMatchFromSearchWord('ethereum', enabledChains) + + expect(result).toBe(UniverseChainId.Mainnet) + }) + + it('should be case insensitive for native currency name', () => { + const enabledChains = [UniverseChainId.Mainnet, UniverseChainId.Polygon] + + mockIsTestnetChain.mockReturnValue(false) + mockGetChainInfo.mockImplementation((chainId: UniverseChainId) => { + if (chainId === UniverseChainId.Mainnet) { + return { + nativeCurrency: { name: 'Ethereum' }, + interfaceName: 'mainnet', + } as any + } + if (chainId === UniverseChainId.Polygon) { + return { + nativeCurrency: { name: 'Polygon' }, + interfaceName: 'polygon', + } as any + } + return {} as any + }) + + const result = getPossibleChainMatchFromSearchWord('ETHEREUM', enabledChains) + + expect(result).toBe(UniverseChainId.Mainnet) + }) + }) + + describe('when matching by interface name', () => { + it('should match exact interface name', () => { + const enabledChains = [UniverseChainId.Mainnet, UniverseChainId.Polygon] + + mockIsTestnetChain.mockReturnValue(false) + mockGetChainInfo.mockImplementation((chainId: UniverseChainId) => { + if (chainId === UniverseChainId.Mainnet) { + return { + nativeCurrency: { name: 'Ethereum' }, + interfaceName: 'mainnet', + } as any + } + if (chainId === UniverseChainId.Polygon) { + return { + nativeCurrency: { name: 'Polygon' }, + interfaceName: 'polygon', + } as any + } + return {} as any + }) + + const result = getPossibleChainMatchFromSearchWord('mainnet', enabledChains) + + expect(result).toBe(UniverseChainId.Mainnet) + }) + + it('should be case insensitive for interface name', () => { + const enabledChains = [UniverseChainId.Mainnet, UniverseChainId.Polygon] + + mockIsTestnetChain.mockReturnValue(false) + mockGetChainInfo.mockImplementation((chainId: UniverseChainId) => { + if (chainId === UniverseChainId.Mainnet) { + return { + nativeCurrency: { name: 'Ethereum' }, + interfaceName: 'mainnet', + } as any + } + if (chainId === UniverseChainId.Polygon) { + return { + nativeCurrency: { name: 'Polygon' }, + interfaceName: 'polygon', + } as any + } + return {} as any + }) + + const result = getPossibleChainMatchFromSearchWord('MAINNET', enabledChains) + + expect(result).toBe(UniverseChainId.Mainnet) + }) + + it('should match polygon interface name', () => { + const enabledChains = [UniverseChainId.Mainnet, UniverseChainId.Polygon] + + mockIsTestnetChain.mockReturnValue(false) + mockGetChainInfo.mockImplementation((chainId: UniverseChainId) => { + if (chainId === UniverseChainId.Mainnet) { + return { + nativeCurrency: { name: 'Ethereum' }, + interfaceName: 'mainnet', + } as any + } + if (chainId === UniverseChainId.Polygon) { + return { + nativeCurrency: { name: 'Polygon' }, + interfaceName: 'polygon', + } as any + } + return {} as any + }) + + const result = getPossibleChainMatchFromSearchWord('polygon', enabledChains) + + expect(result).toBe(UniverseChainId.Polygon) + }) + + it('should match arbitrum interface name', () => { + const enabledChains = [UniverseChainId.Mainnet, UniverseChainId.ArbitrumOne] + + mockIsTestnetChain.mockReturnValue(false) + mockGetChainInfo.mockImplementation((chainId: UniverseChainId) => { + if (chainId === UniverseChainId.Mainnet) { + return { + nativeCurrency: { name: 'Ethereum' }, + interfaceName: 'mainnet', + } as any + } + if (chainId === UniverseChainId.ArbitrumOne) { + return { + nativeCurrency: { name: 'Ethereum' }, + interfaceName: 'arbitrum', + } as any + } + return {} as any + }) + + const result = getPossibleChainMatchFromSearchWord('arbitrum', enabledChains) + + expect(result).toBe(UniverseChainId.ArbitrumOne) + }) + }) + + describe('when handling testnet chains', () => { + it('should skip testnet chains', () => { + const enabledChains = [UniverseChainId.Mainnet, UniverseChainId.Sepolia] + + mockIsTestnetChain.mockImplementation((chainId: UniverseChainId) => chainId === UniverseChainId.Sepolia) + mockGetChainInfo.mockImplementation((chainId: UniverseChainId) => { + if (chainId === UniverseChainId.Mainnet) { + return { + nativeCurrency: { name: 'Ethereum' }, + interfaceName: 'mainnet', + } as any + } + if (chainId === UniverseChainId.Sepolia) { + return { + nativeCurrency: { name: 'Ethereum' }, + interfaceName: 'sepolia', + } as any + } + return {} as any + }) + + const result = getPossibleChainMatchFromSearchWord('ethereum', enabledChains) + + expect(result).toBe(UniverseChainId.Mainnet) + expect(mockIsTestnetChain).toHaveBeenCalledWith(UniverseChainId.Mainnet) + // The function returns early when it finds a match, so it doesn't check Sepolia + // This is the correct behavior - it should return the first non-testnet match + }) + + it('should return undefined when only testnet chains match', () => { + const enabledChains = [UniverseChainId.Sepolia] + + mockIsTestnetChain.mockReturnValue(true) + mockGetChainInfo.mockImplementation((chainId: UniverseChainId) => { + if (chainId === UniverseChainId.Sepolia) { + return { + nativeCurrency: { name: 'Ethereum' }, + interfaceName: 'sepolia', + } as any + } + return {} as any + }) + + const result = getPossibleChainMatchFromSearchWord('ethereum', enabledChains) + + expect(result).toBeUndefined() + }) + }) + + describe('when no matches are found', () => { + it('should return undefined when no chains match', () => { + const enabledChains = [UniverseChainId.Mainnet, UniverseChainId.Polygon] + + mockIsTestnetChain.mockReturnValue(false) + mockGetChainInfo.mockImplementation((chainId: UniverseChainId) => { + if (chainId === UniverseChainId.Mainnet) { + return { + nativeCurrency: { name: 'Ethereum' }, + interfaceName: 'mainnet', + } as any + } + if (chainId === UniverseChainId.Polygon) { + return { + nativeCurrency: { name: 'Polygon' }, + interfaceName: 'polygon', + } as any + } + return {} as any + }) + + const result = getPossibleChainMatchFromSearchWord('bitcoin', enabledChains) + + expect(result).toBeUndefined() + }) + + it('should return undefined when enabledChains is empty', () => { + const enabledChains: UniverseChainId[] = [] + + const result = getPossibleChainMatchFromSearchWord('ethereum', enabledChains) + + expect(result).toBeUndefined() + }) + + it('should return undefined when all chains are testnets', () => { + const enabledChains = [UniverseChainId.Sepolia, UniverseChainId.UnichainSepolia] + + mockIsTestnetChain.mockReturnValue(true) + mockGetChainInfo.mockImplementation((chainId: UniverseChainId) => { + if (chainId === UniverseChainId.Sepolia) { + return { + nativeCurrency: { name: 'Ethereum' }, + interfaceName: 'sepolia', + } as any + } + if (chainId === UniverseChainId.UnichainSepolia) { + return { + nativeCurrency: { name: 'Ethereum' }, + interfaceName: 'unichain-sepolia', + } as any + } + return {} as any + }) + + const result = getPossibleChainMatchFromSearchWord('ethereum', enabledChains) + + expect(result).toBeUndefined() + }) + }) + + describe('when multiple chains could match', () => { + it('should return the first matching chain', () => { + const enabledChains = [UniverseChainId.Mainnet, UniverseChainId.Polygon, UniverseChainId.ArbitrumOne] + + mockIsTestnetChain.mockReturnValue(false) + mockGetChainInfo.mockImplementation((chainId: UniverseChainId) => { + if (chainId === UniverseChainId.Mainnet) { + return { + nativeCurrency: { name: 'Ethereum' }, + interfaceName: 'mainnet', + } as any + } + if (chainId === UniverseChainId.Polygon) { + return { + nativeCurrency: { name: 'Ethereum' }, + interfaceName: 'polygon', + } as any + } + if (chainId === UniverseChainId.ArbitrumOne) { + return { + nativeCurrency: { name: 'Ethereum' }, + interfaceName: 'arbitrum', + } as any + } + return {} as any + }) + + const result = getPossibleChainMatchFromSearchWord('ethereum', enabledChains) + + expect(result).toBe(UniverseChainId.Mainnet) + }) + }) + + describe('edge cases', () => { + it('should handle native currency names with empty first word', () => { + const enabledChains = [UniverseChainId.Mainnet] + + mockIsTestnetChain.mockReturnValue(false) + mockGetChainInfo.mockImplementation((chainId: UniverseChainId) => { + if (chainId === UniverseChainId.Mainnet) { + return { + nativeCurrency: { name: ' Ethereum' }, // Leading space + interfaceName: 'mainnet', + } as any + } + return {} as any + }) + + const result = getPossibleChainMatchFromSearchWord('ethereum', enabledChains) + + expect(result).toBeUndefined() + }) + + it('should handle interface names with special characters', () => { + const enabledChains = [UniverseChainId.Mainnet] + + mockIsTestnetChain.mockReturnValue(false) + mockGetChainInfo.mockImplementation((chainId: UniverseChainId) => { + if (chainId === UniverseChainId.Mainnet) { + return { + nativeCurrency: { name: 'Ethereum' }, + interfaceName: 'main-net', // With hyphen + } as any + } + return {} as any + }) + + const result = getPossibleChainMatchFromSearchWord('main-net', enabledChains) + + expect(result).toBe(UniverseChainId.Mainnet) + }) + + it('should match base chain interface name', () => { + const enabledChains = [UniverseChainId.Mainnet, UniverseChainId.Base] + + mockIsTestnetChain.mockReturnValue(false) + mockGetChainInfo.mockImplementation((chainId: UniverseChainId) => { + if (chainId === UniverseChainId.Mainnet) { + return { + nativeCurrency: { name: 'Ethereum' }, + interfaceName: 'mainnet', + } as any + } + if (chainId === UniverseChainId.Base) { + return { + nativeCurrency: { name: 'Ethereum' }, + interfaceName: 'base', + } as any + } + return {} as any + }) + + const result = getPossibleChainMatchFromSearchWord('base', enabledChains) + + expect(result).toBe(UniverseChainId.Base) + }) + }) +}) diff --git a/packages/uniswap/src/utils/search/getPossibleChainMatchFromSearchWord.ts b/packages/uniswap/src/utils/search/getPossibleChainMatchFromSearchWord.ts new file mode 100644 index 00000000000..5331ee7c0a2 --- /dev/null +++ b/packages/uniswap/src/utils/search/getPossibleChainMatchFromSearchWord.ts @@ -0,0 +1,47 @@ +import { getChainInfo } from 'uniswap/src/features/chains/chainInfo' +import { UniverseChainId } from 'uniswap/src/features/chains/types' +import { isTestnetChain } from 'uniswap/src/features/chains/utils' + +/** + * Finds a matching chain ID based on the provided chain name. + * This is intended to check if a singular word is a chain name. It doesn't + * look for chain names in multi-word searches. + * + * @param maybeChainName - The potential chain name to match against + * @param enabledChains - Array of enabled chain IDs to search within + * @returns The matching UniverseChainId or undefined if no match found + */ +export function getPossibleChainMatchFromSearchWord( + maybeChainName: string, + enabledChains: UniverseChainId[], +): UniverseChainId | undefined { + if (!maybeChainName) { + return undefined + } + + const lowerCaseChainName = maybeChainName.toLowerCase() + + for (const chainId of enabledChains) { + if (isTestnetChain(chainId)) { + continue + } + + const chainInfo = getChainInfo(chainId) + + // Check against native currency name + const nativeCurrencyName = chainInfo.nativeCurrency.name.toLowerCase() + const firstWord = nativeCurrencyName.split(' ')[0] + + if (firstWord && firstWord === lowerCaseChainName) { + return chainId + } + + // Check against interface name + const interfaceName = chainInfo.interfaceName.toLowerCase() + if (interfaceName === lowerCaseChainName) { + return chainId + } + } + + return undefined +} diff --git a/packages/uniswap/src/utils/search/parseChainFromTokenSearchQuery.test.ts b/packages/uniswap/src/utils/search/parseChainFromTokenSearchQuery.test.ts new file mode 100644 index 00000000000..cfecb304f8e --- /dev/null +++ b/packages/uniswap/src/utils/search/parseChainFromTokenSearchQuery.test.ts @@ -0,0 +1,138 @@ +import { UniverseChainId } from 'uniswap/src/features/chains/types' +import { parseChainFromTokenSearchQuery } from 'uniswap/src/utils/search/parseChainFromTokenSearchQuery' + +describe('parseChainFromTokenSearchQuery', () => { + const enabledChains: UniverseChainId[] = [ + UniverseChainId.Mainnet, + UniverseChainId.ArbitrumOne, + UniverseChainId.Base, + UniverseChainId.Optimism, + UniverseChainId.Polygon, + ] + + describe('null/empty input handling', () => { + it('returns empty result for null/empty/whitespace inputs', () => { + expect(parseChainFromTokenSearchQuery(null, enabledChains)).toEqual({ chainFilter: null, searchTerm: null }) + expect(parseChainFromTokenSearchQuery('', enabledChains)).toEqual({ chainFilter: null, searchTerm: null }) + expect(parseChainFromTokenSearchQuery(' ', enabledChains)).toEqual({ chainFilter: null, searchTerm: null }) + }) + }) + + describe('single word searches', () => { + it('returns chain filter for chain names (native currency and interface)', () => { + expect(parseChainFromTokenSearchQuery('ethereum', enabledChains)).toEqual({ + chainFilter: UniverseChainId.Mainnet, + searchTerm: null, + }) + expect(parseChainFromTokenSearchQuery('mainnet', enabledChains)).toEqual({ + chainFilter: UniverseChainId.Mainnet, + searchTerm: null, + }) + expect(parseChainFromTokenSearchQuery('EtHeReUm', enabledChains)).toEqual({ + chainFilter: UniverseChainId.Mainnet, + searchTerm: null, + }) // case insensitive + }) + + it('returns search term for non-chain words', () => { + expect(parseChainFromTokenSearchQuery('dai', enabledChains)).toEqual({ chainFilter: null, searchTerm: 'dai' }) + expect(parseChainFromTokenSearchQuery('unsupported', enabledChains)).toEqual({ + chainFilter: null, + searchTerm: 'unsupported', + }) + }) + }) + + describe('multi-word searches', () => { + it('parses chain from first word', () => { + expect(parseChainFromTokenSearchQuery('ethereum dai', enabledChains)).toEqual({ + chainFilter: UniverseChainId.Mainnet, + searchTerm: 'dai', + }) + expect(parseChainFromTokenSearchQuery('ethereum dai token', enabledChains)).toEqual({ + chainFilter: UniverseChainId.Mainnet, + searchTerm: 'dai token', + }) + expect(parseChainFromTokenSearchQuery('arbitrum uni corn token', enabledChains)).toEqual({ + chainFilter: UniverseChainId.ArbitrumOne, + searchTerm: 'uni corn token', + }) + }) + + it('parses chain from last word when first word is not a chain', () => { + expect(parseChainFromTokenSearchQuery('dai ethereum', enabledChains)).toEqual({ + chainFilter: UniverseChainId.Mainnet, + searchTerm: 'dai', + }) + expect(parseChainFromTokenSearchQuery('uni corn token base', enabledChains)).toEqual({ + chainFilter: UniverseChainId.Base, + searchTerm: 'uni corn token', + }) + }) + + it('prioritizes first word chain match over last word', () => { + expect(parseChainFromTokenSearchQuery('base token ethereum', enabledChains)).toEqual({ + chainFilter: UniverseChainId.Base, + searchTerm: 'token ethereum', + }) + expect(parseChainFromTokenSearchQuery('ethereum token base', enabledChains)).toEqual({ + chainFilter: UniverseChainId.Mainnet, + searchTerm: 'token base', + }) + }) + }) + + describe('edge cases', () => { + it('handles extra spaces and trimming', () => { + expect(parseChainFromTokenSearchQuery(' ethereum dai ', enabledChains)).toEqual({ + chainFilter: UniverseChainId.Mainnet, + searchTerm: 'dai', + }) + expect(parseChainFromTokenSearchQuery('ethereum dai', enabledChains)).toEqual({ + chainFilter: UniverseChainId.Mainnet, + searchTerm: 'dai', + }) + }) + + it('returns original search when no chain is found', () => { + expect(parseChainFromTokenSearchQuery('random search terms', enabledChains)).toEqual({ + chainFilter: null, + searchTerm: 'random search terms', + }) + }) + + it('handles chain name that matches but no search term remains', () => { + expect(parseChainFromTokenSearchQuery('ethereum', enabledChains)).toEqual({ + chainFilter: UniverseChainId.Mainnet, + searchTerm: null, + }) + }) + }) + + describe('different chain types', () => { + it('parses various chain types', () => { + expect(parseChainFromTokenSearchQuery('arbitrum dai', enabledChains)).toEqual({ + chainFilter: UniverseChainId.ArbitrumOne, + searchTerm: 'dai', + }) + expect(parseChainFromTokenSearchQuery('base usdc', enabledChains)).toEqual({ + chainFilter: UniverseChainId.Base, + searchTerm: 'usdc', + }) + expect(parseChainFromTokenSearchQuery('optimism link', enabledChains)).toEqual({ + chainFilter: UniverseChainId.Optimism, + searchTerm: 'link', + }) + expect(parseChainFromTokenSearchQuery('polygon matic', enabledChains)).toEqual({ + chainFilter: UniverseChainId.Polygon, + searchTerm: 'matic', + }) + }) + }) + + describe('empty enabled chains', () => { + it('returns search term when no chains are enabled', () => { + expect(parseChainFromTokenSearchQuery('eth dai', [])).toEqual({ chainFilter: null, searchTerm: 'eth dai' }) + }) + }) +}) diff --git a/packages/uniswap/src/utils/search/parseChainFromTokenSearchQuery.ts b/packages/uniswap/src/utils/search/parseChainFromTokenSearchQuery.ts new file mode 100644 index 00000000000..b44c3db8dad --- /dev/null +++ b/packages/uniswap/src/utils/search/parseChainFromTokenSearchQuery.ts @@ -0,0 +1,81 @@ +import { UniverseChainId } from 'uniswap/src/features/chains/types' +import { getPossibleChainMatchFromSearchWord } from 'uniswap/src/utils/search/getPossibleChainMatchFromSearchWord' + +/** + * Parses a search query to extract chain filter and search term. + * Handles patterns like "eth dai", "dai eth", "ethereum usdc", etc. + * + * @param searchQuery - The search query string + * @param enabledChains - Array of enabled chain IDs to search within + * @returns An object containing the parsed `chainFilter` and `searchTerm` + */ +export function parseChainFromTokenSearchQuery( + searchQuery: string | null, + enabledChains: UniverseChainId[], +): { + chainFilter: UniverseChainId | null + searchTerm: string | null +} { + if (!searchQuery) { + return { + chainFilter: null, + searchTerm: null, + } + } + + const sanitizedSearch = searchQuery.trim().replace(/\s+/g, ' ') + const splitSearch = sanitizedSearch.split(' ') + if (splitSearch.length === 0) { + return { + chainFilter: null, + searchTerm: null, + } + } + + if (splitSearch.length === 1) { + const singleWordSearch = splitSearch[0] + const searchChainMatch = singleWordSearch + ? getPossibleChainMatchFromSearchWord(singleWordSearch, enabledChains) + : undefined + if (searchChainMatch) { + return { + chainFilter: searchChainMatch, + searchTerm: null, + } + } else { + return { + chainFilter: null, + searchTerm: splitSearch[0] || null, + } + } + } + + const firstWord = splitSearch[0]?.toLowerCase() + const lastWord = splitSearch[splitSearch.length - 1]?.toLowerCase() + + const firstWordChainMatch = firstWord ? getPossibleChainMatchFromSearchWord(firstWord, enabledChains) : undefined + const lastWordChainMatch = lastWord ? getPossibleChainMatchFromSearchWord(lastWord, enabledChains) : undefined + + if (firstWordChainMatch) { + // First word is chain, rest is search term + const search = splitSearch.slice(1).join(' ').trim() + return { + chainFilter: firstWordChainMatch, + searchTerm: search || null, + } + } + + if (lastWordChainMatch) { + // Last word is chain, preceding words are search term + const search = splitSearch.slice(0, -1).join(' ').trim() + return { + chainFilter: lastWordChainMatch, + searchTerm: search || null, + } + } + + return { + chainFilter: null, + searchTerm: searchQuery, + } +} diff --git a/packages/uniswap/tsconfig.json b/packages/uniswap/tsconfig.json index 156cfd244ec..0e4e5fb492b 100644 --- a/packages/uniswap/tsconfig.json +++ b/packages/uniswap/tsconfig.json @@ -13,6 +13,9 @@ }, { "path": "../config" + }, + { + "path": "../gating" } ], "compilerOptions": { diff --git a/packages/wallet/package.json b/packages/wallet/package.json index 9ce21858e57..7695cf79342 100644 --- a/packages/wallet/package.json +++ b/packages/wallet/package.json @@ -29,12 +29,13 @@ "@scure/bip32": "1.3.2", "@tanstack/react-query": "5.77.2", "@uniswap/analytics-events": "2.43.0", - "@uniswap/client-data-api": "0.0.14", + "@uniswap/client-data-api": "0.0.18", "@uniswap/permit2-sdk": "1.3.0", "@uniswap/router-sdk": "2.0.2", "@uniswap/sdk-core": "7.7.2", "@uniswap/universal-router-sdk": "4.19.5", "@universe/api": "workspace:^", + "@universe/gating": "workspace:^", "apollo3-cache-persist": "0.14.1", "dayjs": "1.11.7", "ethers": "5.7.2", diff --git a/packages/wallet/src/components/landing/LandingBackground.tsx b/packages/wallet/src/components/landing/LandingBackground.tsx index 656492eb7a3..d39a33cb798 100644 --- a/packages/wallet/src/components/landing/LandingBackground.tsx +++ b/packages/wallet/src/components/landing/LandingBackground.tsx @@ -76,7 +76,7 @@ const OnboardingAnimation = ({ easing: Easing.elastic(1.1), }), ) - }, [uniswapLogoScale]) + }, []) useTimeout(() => { setShowAnimatedElements(true) @@ -184,7 +184,7 @@ const AnimatedElements = ({ ) innerAnimation.value = withDelay(INNER_CIRCLE_SHOW_DELAY, withSpring(0.8)) outerAnimation.value = withDelay(OUTER_CIRCLE_SHOW_DELAY, withSpring(0.8)) - }, [innerAnimation, outerAnimation, rotation]) + }, []) const innerCircleStyle = useAnimatedStyle(() => { return { diff --git a/packages/wallet/src/components/smartWallet/smartAccounts/hooks.ts b/packages/wallet/src/components/smartWallet/smartAccounts/hooks.ts index 5b252e271bb..72f960be889 100644 --- a/packages/wallet/src/components/smartWallet/smartAccounts/hooks.ts +++ b/packages/wallet/src/components/smartWallet/smartAccounts/hooks.ts @@ -1,8 +1,7 @@ +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import { useCallback, useEffect, useState } from 'react' import { useSelector } from 'react-redux' import { AccountType } from 'uniswap/src/features/accounts/types' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' import { DEFAULT_TOAST_HIDE_DELAY } from 'uniswap/src/features/notifications/constants' import { useSuccessfulSwapCompleted } from 'uniswap/src/features/transactions/hooks/useSuccessfulSwapCompleted' import { TransactionDetails } from 'uniswap/src/features/transactions/types/transactionDetails' diff --git a/packages/wallet/src/features/gating/userPropertyHooks.ts b/packages/wallet/src/features/gating/userPropertyHooks.ts index 3fe58e437cc..f9f9a571080 100644 --- a/packages/wallet/src/features/gating/userPropertyHooks.ts +++ b/packages/wallet/src/features/gating/userPropertyHooks.ts @@ -1,8 +1,8 @@ +import { getStatsigClient } from '@universe/gating' import { useEffect } from 'react' import { useUnitagsAddressQuery } from 'uniswap/src/data/apiClients/unitagsApi/useUnitagsAddressQuery' import { AccountType } from 'uniswap/src/features/accounts/types' import { useENSName } from 'uniswap/src/features/ens/api' -import { getStatsigClient } from 'uniswap/src/features/gating/sdk/statsig' import { Platform } from 'uniswap/src/features/platforms/types/Platform' import { getValidAddress } from 'uniswap/src/utils/addresses' import { logger } from 'utilities/src/logger/logger' diff --git a/packages/wallet/src/features/smartWallet/hooks/useNetworkBalances.tsx b/packages/wallet/src/features/smartWallet/hooks/useNetworkBalances.tsx index ced5d4c5724..75146ef0bb6 100644 --- a/packages/wallet/src/features/smartWallet/hooks/useNetworkBalances.tsx +++ b/packages/wallet/src/features/smartWallet/hooks/useNetworkBalances.tsx @@ -1,8 +1,8 @@ +import { useStatsigClientStatus } from '@universe/gating' import { useEffect, useState } from 'react' import { fetchGasFeeQuery } from 'uniswap/src/data/apiClients/uniswapApi/useGasFeeQuery' import { getChainInfo } from 'uniswap/src/features/chains/chainInfo' import { DEFAULT_NATIVE_ADDRESS } from 'uniswap/src/features/chains/evm/defaults' -import { useStatsigClientStatus } from 'uniswap/src/features/gating/hooks' import { createEthersProvider } from 'uniswap/src/features/providers/createEthersProvider' import { useSmartWalletChains } from 'wallet/src/features/smartWallet/hooks/useSmartWalletChains' import { NetworkInfo } from 'wallet/src/features/smartWallet/InsufficientFundsNetworkRow' diff --git a/packages/wallet/src/features/transactions/contexts/WalletUniswapContext.tsx b/packages/wallet/src/features/transactions/contexts/WalletUniswapContext.tsx index 4a3da58b3a1..3fa70472e1b 100644 --- a/packages/wallet/src/features/transactions/contexts/WalletUniswapContext.tsx +++ b/packages/wallet/src/features/transactions/contexts/WalletUniswapContext.tsx @@ -1,11 +1,10 @@ +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import { ethers } from 'ethers' import React, { PropsWithChildren, useCallback, useEffect, useState } from 'react' import { UniswapProvider } from 'uniswap/src/contexts/UniswapContext' import { getDelegationService } from 'uniswap/src/domains/services' import { useEnabledChains } from 'uniswap/src/features/chains/hooks/useEnabledChains' import { UniverseChainId } from 'uniswap/src/features/chains/types' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' import { useUpdateDelegatedState } from 'uniswap/src/features/smartWallet/delegation/hooks/useUpdateDelegateState' import { useHasAccountMismatchCallback } from 'uniswap/src/features/smartWallet/mismatch/hooks' import { MismatchContextProvider } from 'uniswap/src/features/smartWallet/mismatch/MismatchContext' diff --git a/packages/wallet/src/features/transactions/executeTransaction/services/featureFlagService.ts b/packages/wallet/src/features/transactions/executeTransaction/services/featureFlagService.ts index ea11a986c21..2780711d0a6 100644 --- a/packages/wallet/src/features/transactions/executeTransaction/services/featureFlagService.ts +++ b/packages/wallet/src/features/transactions/executeTransaction/services/featureFlagService.ts @@ -1,5 +1,5 @@ -import { ExperimentProperties } from 'uniswap/src/features/gating/experiments' -import type { FeatureFlags } from 'uniswap/src/features/gating/flags' +import type { FeatureFlags } from '@universe/gating' +import { ExperimentProperties } from '@universe/gating' export interface FeatureFlagService { isFeatureEnabled(flagName: FeatureFlags): boolean diff --git a/packages/wallet/src/features/transactions/executeTransaction/services/featureFlagServiceImpl.ts b/packages/wallet/src/features/transactions/executeTransaction/services/featureFlagServiceImpl.ts index b55151e3c28..dd5b6ec99a5 100644 --- a/packages/wallet/src/features/transactions/executeTransaction/services/featureFlagServiceImpl.ts +++ b/packages/wallet/src/features/transactions/executeTransaction/services/featureFlagServiceImpl.ts @@ -1,6 +1,4 @@ -import { ExperimentProperties } from 'uniswap/src/features/gating/experiments' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { getExperimentValue, getFeatureFlag } from 'uniswap/src/features/gating/hooks' +import { ExperimentProperties, FeatureFlags, getExperimentValue, getFeatureFlag } from '@universe/gating' import { FeatureFlagService } from 'wallet/src/features/transactions/executeTransaction/services/featureFlagService' export const createFeatureFlagService = (): FeatureFlagService => { diff --git a/packages/wallet/src/features/transactions/executeTransaction/services/transactionConfigServiceImpl.test.ts b/packages/wallet/src/features/transactions/executeTransaction/services/transactionConfigServiceImpl.test.ts index 74c9a33abd9..fb0d18f8bfc 100644 --- a/packages/wallet/src/features/transactions/executeTransaction/services/transactionConfigServiceImpl.test.ts +++ b/packages/wallet/src/features/transactions/executeTransaction/services/transactionConfigServiceImpl.test.ts @@ -1,5 +1,5 @@ +import { FeatureFlags } from '@universe/gating' import { UniverseChainId } from 'uniswap/src/features/chains/types' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' import { logger as loggerUtil } from 'utilities/src/logger/logger' import { isPrivateRpcSupportedOnChain } from 'wallet/src/features/providers/utils' import { FeatureFlagService } from 'wallet/src/features/transactions/executeTransaction/services/featureFlagService' diff --git a/packages/wallet/src/features/transactions/executeTransaction/services/transactionConfigServiceImpl.ts b/packages/wallet/src/features/transactions/executeTransaction/services/transactionConfigServiceImpl.ts index 7c4f3d0a18c..97651db7513 100644 --- a/packages/wallet/src/features/transactions/executeTransaction/services/transactionConfigServiceImpl.ts +++ b/packages/wallet/src/features/transactions/executeTransaction/services/transactionConfigServiceImpl.ts @@ -1,6 +1,5 @@ +import { Experiments, FeatureFlags, PrivateRpcProperties } from '@universe/gating' import { UniverseChainId } from 'uniswap/src/features/chains/types' -import { Experiments, PrivateRpcProperties } from 'uniswap/src/features/gating/experiments' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' import { DEFAULT_FLASHBOTS_ENABLED } from 'uniswap/src/features/providers/FlashbotsCommon' import { logger as loggerUtil } from 'utilities/src/logger/logger' import { isPrivateRpcSupportedOnChain } from 'wallet/src/features/providers/utils' diff --git a/packages/wallet/src/features/transactions/executeTransaction/tryGetNonce.ts b/packages/wallet/src/features/transactions/executeTransaction/tryGetNonce.ts index 2b443309e17..ac9f241eb22 100644 --- a/packages/wallet/src/features/transactions/executeTransaction/tryGetNonce.ts +++ b/packages/wallet/src/features/transactions/executeTransaction/tryGetNonce.ts @@ -1,11 +1,15 @@ +import { + Experiments, + FeatureFlags, + getExperimentValue, + getFeatureFlagName, + getStatsigClient, + PrivateRpcProperties, +} from '@universe/gating' import { SagaIterator } from 'redux-saga' import { call, select } from 'typed-redux-saga' import { SignerMnemonicAccountMeta } from 'uniswap/src/features/accounts/types' import { UniverseChainId } from 'uniswap/src/features/chains/types' -import { Experiments, PrivateRpcProperties } from 'uniswap/src/features/gating/experiments' -import { FeatureFlags, getFeatureFlagName } from 'uniswap/src/features/gating/flags' -import { getExperimentValue } from 'uniswap/src/features/gating/hooks' -import { getStatsigClient } from 'uniswap/src/features/gating/sdk/statsig' import { DEFAULT_FLASHBOTS_ENABLED } from 'uniswap/src/features/providers/FlashbotsCommon' import { makeSelectAddressTransactions } from 'uniswap/src/features/transactions/selectors' import { isClassic } from 'uniswap/src/features/transactions/swap/utils/routing' diff --git a/packages/wallet/src/features/transactions/send/TokenSelectorPanel.tsx b/packages/wallet/src/features/transactions/send/TokenSelectorPanel.tsx index 5cf5a03e7a9..453caf0b2f1 100644 --- a/packages/wallet/src/features/transactions/send/TokenSelectorPanel.tsx +++ b/packages/wallet/src/features/transactions/send/TokenSelectorPanel.tsx @@ -1,5 +1,4 @@ import { Currency, CurrencyAmount } from '@uniswap/sdk-core' -import { Maybe } from 'graphql/jsutils/Maybe' import { useTranslation } from 'react-i18next' import { Flex, Text, TouchableArea } from 'ui/src' import { RotatableChevron } from 'ui/src/components/icons' diff --git a/packages/wallet/src/features/transactions/swap/confirmation.ts b/packages/wallet/src/features/transactions/swap/confirmation.ts index b0adbcde1c4..c784e69e98a 100644 --- a/packages/wallet/src/features/transactions/swap/confirmation.ts +++ b/packages/wallet/src/features/transactions/swap/confirmation.ts @@ -1,9 +1,8 @@ import { TradingApi } from '@universe/api' +import { FeatureFlags, getFeatureFlagName, getStatsigClient } from '@universe/gating' import { SagaGenerator, take } from 'typed-redux-saga' import { getDelegationService } from 'uniswap/src/domains/services' import { UniverseChainId } from 'uniswap/src/features/chains/types' -import { FeatureFlags, getFeatureFlagName } from 'uniswap/src/features/gating/flags' -import { getStatsigClient } from 'uniswap/src/features/gating/sdk/statsig' import { finalizeTransaction } from 'uniswap/src/features/transactions/slice' import { PermitMethod, SwapTxAndGasInfo } from 'uniswap/src/features/transactions/swap/types/swapTxAndGasInfo' import { TransactionStatus } from 'uniswap/src/features/transactions/types/transactionDetails' diff --git a/packages/wallet/src/features/transactions/swap/executeSwapSaga.ts b/packages/wallet/src/features/transactions/swap/executeSwapSaga.ts index 29439a7438c..10380eabbda 100644 --- a/packages/wallet/src/features/transactions/swap/executeSwapSaga.ts +++ b/packages/wallet/src/features/transactions/swap/executeSwapSaga.ts @@ -1,8 +1,7 @@ +import { DynamicConfigs, getDynamicConfigValue, SyncTransactionSubmissionChainIdsConfigKey } from '@universe/gating' import { call, put } from 'typed-redux-saga' import type { SignerMnemonicAccountMeta } from 'uniswap/src/features/accounts/types' import type { UniverseChainId } from 'uniswap/src/features/chains/types' -import { DynamicConfigs, SyncTransactionSubmissionChainIdsConfigKey } from 'uniswap/src/features/gating/configs' -import { getDynamicConfigValue } from 'uniswap/src/features/gating/hooks' import { pushNotification } from 'uniswap/src/features/notifications/slice/slice' import { AppNotificationType } from 'uniswap/src/features/notifications/slice/types' import type { SwapTradeBaseProperties } from 'uniswap/src/features/telemetry/types' diff --git a/packages/wallet/src/features/transactions/swap/hooks/useSwapHandlers.ts b/packages/wallet/src/features/transactions/swap/hooks/useSwapHandlers.ts index 420ac15b9a1..ab5987f0921 100644 --- a/packages/wallet/src/features/transactions/swap/hooks/useSwapHandlers.ts +++ b/packages/wallet/src/features/transactions/swap/hooks/useSwapHandlers.ts @@ -1,9 +1,8 @@ +import { FeatureFlags, getFeatureFlag } from '@universe/gating' import { useCallback, useMemo } from 'react' import { useDispatch, useSelector } from 'react-redux' import { AccountMeta } from 'uniswap/src/features/accounts/types' import { usePortfolioTotalValue } from 'uniswap/src/features/dataApi/balances/balancesRest' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { getFeatureFlag } from 'uniswap/src/features/gating/hooks' import { useLocalizationContext } from 'uniswap/src/features/language/LocalizationContext' import { SwapEventName } from 'uniswap/src/features/telemetry/constants' import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send' diff --git a/packages/wallet/src/features/transactions/swap/modals/QueuedOrderModal.tsx b/packages/wallet/src/features/transactions/swap/modals/QueuedOrderModal.tsx index 18e6819fb83..db13d952f17 100644 --- a/packages/wallet/src/features/transactions/swap/modals/QueuedOrderModal.tsx +++ b/packages/wallet/src/features/transactions/swap/modals/QueuedOrderModal.tsx @@ -1,4 +1,5 @@ import { CurrencyAmount, TradeType } from '@uniswap/sdk-core' +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import { useCallback, useMemo } from 'react' import { useTranslation } from 'react-i18next' import { useDispatch } from 'react-redux' @@ -10,8 +11,6 @@ import { Modal } from 'uniswap/src/components/modals/Modal' import { LearnMoreLink } from 'uniswap/src/components/text/LearnMoreLink' import { uniswapUrls } from 'uniswap/src/constants/urls' import { AssetType, TradeableAsset } from 'uniswap/src/entities/assets' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' import { ModalName } from 'uniswap/src/features/telemetry/constants' import { useCurrencyInfo } from 'uniswap/src/features/tokens/useCurrencyInfo' import { diff --git a/packages/wallet/src/features/transactions/swap/prepareAndSignSwapSaga.test.ts b/packages/wallet/src/features/transactions/swap/prepareAndSignSwapSaga.test.ts index dcd61b4350c..8b9eda0d70f 100644 --- a/packages/wallet/src/features/transactions/swap/prepareAndSignSwapSaga.test.ts +++ b/packages/wallet/src/features/transactions/swap/prepareAndSignSwapSaga.test.ts @@ -35,7 +35,8 @@ jest.mock('wallet/src/features/transactions/factories/createTransactionServices' const mockPrivateRpcFlag = jest.fn().mockReturnValue(true) -jest.mock('uniswap/src/features/gating/sdk/statsig', () => ({ +jest.mock('@universe/gating', () => ({ + ...jest.requireActual('@universe/gating'), getStatsigClient: jest.fn(() => ({ checkGate: jest.fn().mockImplementation((flagName: string) => { if (flagName === 'mev-blocker') { diff --git a/packages/wallet/src/features/transactions/swap/prepareAndSignSwapSaga.ts b/packages/wallet/src/features/transactions/swap/prepareAndSignSwapSaga.ts index 86d53f2ebfe..a130e9568ae 100644 --- a/packages/wallet/src/features/transactions/swap/prepareAndSignSwapSaga.ts +++ b/packages/wallet/src/features/transactions/swap/prepareAndSignSwapSaga.ts @@ -1,7 +1,6 @@ +import { FeatureFlags, getFeatureFlagName, getStatsigClient } from '@universe/gating' import { call, select } from 'typed-redux-saga' import type { SignerMnemonicAccountMeta } from 'uniswap/src/features/accounts/types' -import { FeatureFlags, getFeatureFlagName } from 'uniswap/src/features/gating/flags' -import { getStatsigClient } from 'uniswap/src/features/gating/sdk/statsig' import type { PrepareSwapParams } from 'uniswap/src/features/transactions/swap/types/swapHandlers' import { PermitMethod } from 'uniswap/src/features/transactions/swap/types/swapTxAndGasInfo' import { isBridge, isClassic, isUniswapX, isWrap } from 'uniswap/src/features/transactions/swap/utils/routing' diff --git a/packages/wallet/src/features/transactions/swap/settings/SwapProtection.tsx b/packages/wallet/src/features/transactions/swap/settings/SwapProtection.tsx index c4a1760c11b..70a8d61e30e 100644 --- a/packages/wallet/src/features/transactions/swap/settings/SwapProtection.tsx +++ b/packages/wallet/src/features/transactions/swap/settings/SwapProtection.tsx @@ -1,9 +1,9 @@ +import { FeatureFlags } from '@universe/gating' import { useCallback } from 'react' import { useTranslation } from 'react-i18next' import { useDispatch } from 'react-redux' import { Switch, Text } from 'ui/src' import { getChainLabel } from 'uniswap/src/features/chains/utils' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' import { Platform } from 'uniswap/src/features/platforms/types/Platform' import type { TransactionSettingConfig } from 'uniswap/src/features/transactions/components/settings/types' import { useSwapFormStoreDerivedSwapInfo } from 'uniswap/src/features/transactions/swap/stores/swapFormStore/useSwapFormStore' diff --git a/packages/wallet/src/features/transactions/swap/swapSaga.test.ts b/packages/wallet/src/features/transactions/swap/swapSaga.test.ts index cf2475ead8d..739e6bce957 100644 --- a/packages/wallet/src/features/transactions/swap/swapSaga.test.ts +++ b/packages/wallet/src/features/transactions/swap/swapSaga.test.ts @@ -42,7 +42,8 @@ import { SwapProtectionSetting } from 'wallet/src/features/wallet/slice' import { signerMnemonicAccount } from 'wallet/src/test/fixtures' import { getTxProvidersMocks } from 'wallet/src/test/mocks' -jest.mock('uniswap/src/features/gating/sdk/statsig', () => ({ +jest.mock('@universe/gating', () => ({ + ...jest.requireActual('@universe/gating'), getStatsigClient: jest.fn(() => ({ checkGate: jest.fn().mockReturnValue(true), getLayer: jest.fn(() => ({ diff --git a/packages/wallet/src/features/transactions/swap/swapSaga.ts b/packages/wallet/src/features/transactions/swap/swapSaga.ts index 6b265b5347b..378fad172d7 100644 --- a/packages/wallet/src/features/transactions/swap/swapSaga.ts +++ b/packages/wallet/src/features/transactions/swap/swapSaga.ts @@ -1,14 +1,13 @@ import { permit2Address } from '@uniswap/permit2-sdk' import { TradingApi } from '@universe/api' +import { Experiments, FeatureFlags, getFeatureFlagName, getStatsigClient } from '@universe/gating' import { call, put, select } from 'typed-redux-saga' import { SignerMnemonicAccountMeta } from 'uniswap/src/features/accounts/types' -import { FeatureFlags, getFeatureFlagName } from 'uniswap/src/features/gating/flags' -import { getStatsigClient } from 'uniswap/src/features/gating/sdk/statsig' import { pushNotification } from 'uniswap/src/features/notifications/slice/slice' import { AppNotificationType } from 'uniswap/src/features/notifications/slice/types' import { SwapTradeBaseProperties } from 'uniswap/src/features/telemetry/types' -import { FLASHBLOCKS_UI_SKIP_ROUTES } from 'uniswap/src/features/transactions/swap/components/UnichainInstantBalanceModal/constants' -import { getIsFlashblocksEnabled } from 'uniswap/src/features/transactions/swap/hooks/useIsUnichainFlashblocksEnabled' +import { logExperimentQualifyingEvent } from 'uniswap/src/features/telemetry/utils/logExperimentQualifyingEvent' +import { getFlashblocksExperimentStatus } from 'uniswap/src/features/transactions/swap/hooks/useIsUnichainFlashblocksEnabled' import { PermitMethod, ValidatedSwapTxContext } from 'uniswap/src/features/transactions/swap/types/swapTxAndGasInfo' import { isUniswapX } from 'uniswap/src/features/transactions/swap/utils/routing' import { tradeToTransactionInfo } from 'uniswap/src/features/transactions/swap/utils/trade' @@ -217,8 +216,19 @@ export function* approveAndSwap(params: SwapParams) { } yield* call(executeTransaction, executeTransactionParams) - // Only show pending notification if not a flashblock transaction - if (!getIsFlashblocksEnabled(chainId) || FLASHBLOCKS_UI_SKIP_ROUTES.includes(swapTxContext.routing)) { + const { shouldLogQualifyingEvent, shouldShowModal } = getFlashblocksExperimentStatus({ + chainId, + routing: swapTxContext.routing, + }) + + if (shouldLogQualifyingEvent) { + logExperimentQualifyingEvent({ + experiment: Experiments.UnichainFlashblocksModal, + }) + } + + // Show pending notification for control variant or ineligible swaps + if (!shouldShowModal) { yield* put(pushNotification({ type: AppNotificationType.SwapPending, wrapType: WrapType.NotApplicable })) } diff --git a/packages/wallet/src/features/transactions/watcher/transactionFinalizationSaga.ts b/packages/wallet/src/features/transactions/watcher/transactionFinalizationSaga.ts index d6090419b58..1e11344cda9 100644 --- a/packages/wallet/src/features/transactions/watcher/transactionFinalizationSaga.ts +++ b/packages/wallet/src/features/transactions/watcher/transactionFinalizationSaga.ts @@ -1,14 +1,13 @@ import { ApolloClient, NormalizedCacheObject } from '@apollo/client' import { TradeType } from '@uniswap/sdk-core' import { SharedQueryClient } from '@universe/api' +import { Experiments, getExperimentValue, PrivateRpcProperties } from '@universe/gating' import { BigNumber } from 'ethers' import { call, put, select, takeEvery } from 'typed-redux-saga' import { UniverseChainId } from 'uniswap/src/features/chains/types' import { getChainLabel } from 'uniswap/src/features/chains/utils' import { getGasPrice } from 'uniswap/src/features/gas/types' import { findLocalGasStrategy } from 'uniswap/src/features/gas/utils' -import { Experiments, PrivateRpcProperties } from 'uniswap/src/features/gating/experiments' -import { getExperimentValue } from 'uniswap/src/features/gating/hooks' import { setNotificationStatus } from 'uniswap/src/features/notifications/slice/slice' import { Platform } from 'uniswap/src/features/platforms/types/Platform' import { refetchQueries } from 'uniswap/src/features/portfolio/portfolioUpdates/refetchQueriesSaga' diff --git a/packages/wallet/src/features/transactions/watcher/watchOnChainTransactionSaga.test.ts b/packages/wallet/src/features/transactions/watcher/watchOnChainTransactionSaga.test.ts index f2b65470cbf..46548927883 100644 --- a/packages/wallet/src/features/transactions/watcher/watchOnChainTransactionSaga.test.ts +++ b/packages/wallet/src/features/transactions/watcher/watchOnChainTransactionSaga.test.ts @@ -27,7 +27,8 @@ import { getProvider } from 'wallet/src/features/wallet/context' let mockGates: Record = {} -jest.mock('uniswap/src/features/gating/sdk/statsig', () => ({ +jest.mock('@universe/gating', () => ({ + ...jest.requireActual('@universe/gating'), getStatsigClient: jest.fn(() => ({ checkGate: jest.fn((gate: string) => mockGates[gate] ?? false), getDynamicConfig: jest.fn(() => ({ diff --git a/packages/wallet/src/features/transactions/watcher/watchOnChainTransactionSaga.ts b/packages/wallet/src/features/transactions/watcher/watchOnChainTransactionSaga.ts index 97956f77add..b134be6e2df 100644 --- a/packages/wallet/src/features/transactions/watcher/watchOnChainTransactionSaga.ts +++ b/packages/wallet/src/features/transactions/watcher/watchOnChainTransactionSaga.ts @@ -1,9 +1,8 @@ import { ApolloClient, NormalizedCacheObject } from '@apollo/client' +import { FeatureFlags, getFeatureFlagName, getStatsigClient } from '@universe/gating' import { BigNumber, BigNumberish, providers } from 'ethers' import { call, cancel, delay, fork, put, race, spawn, take } from 'typed-redux-saga' import { UniverseChainId } from 'uniswap/src/features/chains/types' -import { FeatureFlags, getFeatureFlagName } from 'uniswap/src/features/gating/flags' -import { getStatsigClient } from 'uniswap/src/features/gating/sdk/statsig' import { pushNotification } from 'uniswap/src/features/notifications/slice/slice' import { AppNotificationType } from 'uniswap/src/features/notifications/slice/types' import { waitForFlashbotsProtectReceipt } from 'uniswap/src/features/providers/FlashbotsCommon' diff --git a/packages/wallet/tsconfig.json b/packages/wallet/tsconfig.json index 96488672116..038c024dc0f 100644 --- a/packages/wallet/tsconfig.json +++ b/packages/wallet/tsconfig.json @@ -11,6 +11,9 @@ { "path": "../ui" }, + { + "path": "../gating" + }, { "path": "../api" } diff --git a/scripts/clean.sh b/scripts/clean.sh index 2f6aef5b8f6..fe3a27eb887 100644 --- a/scripts/clean.sh +++ b/scripts/clean.sh @@ -1,25 +1,78 @@ #!/bin/bash set -euo pipefail -# Restore the monorepo as close to a freshly cloned state as possible (except for the .env files) - -# Safety check - confirm with user before proceeding -echo "⚠️ WARNING: This will remove ALL untracked files and directories from your repository!" -echo "Only .env files will be preserved." -read -p "Are you sure you want to continue? (y/N): " -n 1 -r -echo -if [[ ! $REPLY =~ ^[Yy]$ ]]; then - echo "Operation cancelled." - exit 1 +# Restore the monorepo as close to a freshly cloned state as possible +# Usage: bun clean [--git] [--node] [--bun] +# --git Remove git untracked files (except for .env files, node_modules, and .claude directories) +# --node Remove all node_modules (instead of just local packages) +# --bun Clear the global bun cache + +# Parse CLI arguments +GIT_CLEAN=false +NODE_MODULES=false +BUN_CACHE=false +HAS_CLI_ARGS=false + +while [[ $# -gt 0 ]]; do + HAS_CLI_ARGS=true + case $1 in + --git) + GIT_CLEAN=true + shift + ;; + --node) + NODE_MODULES=true + shift + ;; + --bun) + BUN_CACHE=true + shift + ;; + *) + echo "Unknown argument: $1" + echo "Usage: $0 [--git] [--node] [--bun]" + exit 1 + ;; + esac +done + +prompt_yes_no() { + local message=$1 + local var_name=$2 + echo "$message" + read -p "(y/n): " -n 1 -r + echo + if [[ $REPLY =~ ^[Yy]$ ]]; then + eval "$var_name=true" + fi +} + +# Only prompt if no CLI args were provided +if [ "$HAS_CLI_ARGS" = false ]; then + prompt_yes_no "⚠️ UNTRACKED FILES: Do you want to remove all files untracked by git..." "GIT_CLEAN" + prompt_yes_no "📦 NODE MODULES: Local packages will be cleaned. Do you also want to remove ALL other node_modules (slower but more thorough)?" "NODE_MODULES" fi -# Remove all untracked files -echo "Removing all untracked files..." -git clean -fdx -e "**/.env*" +# Execute git clean if confirmed +if [ "$GIT_CLEAN" = true ]; then + echo "Removing all untracked files except for .env files..." + git clean -fdx -e "**/.env*" -e "**/node_modules" -e "**/.claude" +fi + +# Execute node_modules cleanup +if [ "$NODE_MODULES" = true ]; then + echo "Removing node_modules..." + bun run g:rm:nodemodules +else + echo "Removing local packages..." + bun run g:rm:local-packages +fi -# Remove node_modules -echo "Removing node_modules..." -bun run g:rm:nodemodules +# Clear global bun cache +if [ "$BUN_CACHE" = true ]; then + echo "Clearing global bun cache..." + bun pm cache rm +fi # Install dependencies echo "Installing dependencies..." @@ -28,6 +81,9 @@ bun install # Clear NX cache echo "Clearing NX cache..." bun nx reset +# Sync NX but silence errors because sometimes the first NX command +# after a reset fails due to a race condition with the NX daemon +bun nx sync 2>/dev/null || true # Prepare packages echo "Preparing packages..." diff --git a/scripts/remove-local-packages.sh b/scripts/remove-local-packages.sh new file mode 100755 index 00000000000..69bb087ad78 --- /dev/null +++ b/scripts/remove-local-packages.sh @@ -0,0 +1,14 @@ +#!/bin/bash +set -euo pipefail + +# This script queries NX and then removes local monorepo packages from node_modules + +projects=$(bun nx show projects) + +while IFS= read -r project; do + project_path="node_modules/$project" + echo "Removing $project_path" + rm -rf "$project_path" +done <<< "$projects" + +echo "Done removing local packages from node_modules" diff --git a/tools/uniswap-nx/src/generators/package/files/biome.json b/tools/uniswap-nx/src/generators/package/files/biome.json deleted file mode 100644 index 8e08a6604fc..00000000000 --- a/tools/uniswap-nx/src/generators/package/files/biome.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "extends": "//", - "formatter": { - "includes": ["**"] - } -} diff --git a/tools/uniswap-nx/src/generators/package/files/tsconfig.json b/tools/uniswap-nx/src/generators/package/files/tsconfig.json index 7b64995b539..194d7e1a230 100644 --- a/tools/uniswap-nx/src/generators/package/files/tsconfig.json +++ b/tools/uniswap-nx/src/generators/package/files/tsconfig.json @@ -5,7 +5,7 @@ "compilerOptions": { "noEmit": false, "emitDeclarationOnly": true, - "types": [<%= types %>], + "types": [<%- types %>], "paths": {} }, "references": [] diff --git a/tools/uniswap-nx/src/generators/package/package.ts b/tools/uniswap-nx/src/generators/package/package.ts index 56d5156071c..c926ad5b16f 100644 --- a/tools/uniswap-nx/src/generators/package/package.ts +++ b/tools/uniswap-nx/src/generators/package/package.ts @@ -1,5 +1,6 @@ import { addProjectConfiguration, generateFiles, Tree, updateJson } from '@nx/devkit' import { addTsConfigPath } from '@nx/js' +import { execSync } from 'child_process' import * as path from 'path' import { PackageGeneratorSchema } from './schema' @@ -23,14 +24,33 @@ export async function packageGenerator(tree: Tree, options: PackageGeneratorSche return json }) const relativePathToRoot = path.relative(options.path, '') + const typesList = options.types.split(',').map((t) => t.trim()) + const types = JSON.stringify(typesList).slice(1, -1) // Remove outer brackets to fit in template generateFiles(tree, path.join(__dirname, 'files'), projectRoot, { ...options, relativePathToRoot, - types: options.types - .split(',') - .map((t) => `"${t.trim()}"`) - .join(', '), + types, }) + + // Return a task that formats only the files changed by this generator + return () => { + // Get only the files that were changed by this generator + const changedFiles = tree.listChanges().map(change => change.path).join(' ') + + if (!changedFiles) { + return + } + + try { + console.log('Formatting generated files with Biome...') + // Run biome directly on just the files changed by this generator + execSync(`bun biome format --write ${changedFiles}`, { + stdio: 'inherit', + }) + } catch (error) { + console.warn('Could not format files. You may need to run "bun g:format" manually.') + } + } } export default packageGenerator diff --git a/tsconfig.base.json b/tsconfig.base.json index 61f218e91c4..32364947eab 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -40,7 +40,9 @@ "ui/*": ["packages/ui/*"], "uniswap/*": ["packages/uniswap/*"], "utilities/*": ["packages/utilities/*"], - "wallet/*": ["packages/wallet/*"] + "wallet/*": ["packages/wallet/*"], + "@universe/gating/*": ["packages/gating/*"], + "@universe/notifications/*": ["packages/notifications/*"] } } } diff --git a/tsconfig.json b/tsconfig.json index 72b73c7c20c..5b0b2b7b2f8 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -36,6 +36,12 @@ }, { "path": "./tools/uniswap-nx" + }, + { + "path": "./packages/gating" + }, + { + "path": "./packages/notifications" } ] } From e3999984174a5d70f185395ce83fea8a4e5c90ba Mon Sep 17 00:00:00 2001 From: "snyk-io[bot]" <141718529+snyk-io[bot]@users.noreply.github.com> Date: Sat, 20 Dec 2025 22:12:31 +0000 Subject: [PATCH 63/92] fix: apps/mobile/Gemfile & apps/mobile/Gemfile.lock to reduce vulnerabilities The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-RUBY-AWSSDKS3-14465282 --- apps/mobile/Gemfile | 2 +- apps/mobile/Gemfile.lock | 48 ++++++++++++++++++---------------------- 2 files changed, 23 insertions(+), 27 deletions(-) diff --git a/apps/mobile/Gemfile b/apps/mobile/Gemfile index a9e494ea9a1..9ca02152c75 100644 --- a/apps/mobile/Gemfile +++ b/apps/mobile/Gemfile @@ -1,6 +1,6 @@ source "https://rubygems.org" -gem 'fastlane', '2.215.0' +gem 'fastlane', '2.215.1' # Exclude problematic versions of cocoapods and activesupport that causes build failures. gem 'cocoapods', '1.15.0' gem 'activesupport', '7.1.2' diff --git a/apps/mobile/Gemfile.lock b/apps/mobile/Gemfile.lock index 1cc3a294c88..9bf204faf39 100644 --- a/apps/mobile/Gemfile.lock +++ b/apps/mobile/Gemfile.lock @@ -1,10 +1,7 @@ GEM remote: https://rubygems.org/ specs: - CFPropertyList (3.0.7) - base64 - nkf - rexml + CFPropertyList (3.0.9) activesupport (7.1.2) base64 bigdecimal @@ -15,16 +12,16 @@ GEM minitest (>= 5.1) mutex_m tzinfo (~> 2.0) - addressable (2.8.7) - public_suffix (>= 2.0.2, < 7.0) + addressable (2.8.8) + public_suffix (>= 2.0.2, < 8.0) algoliasearch (1.27.5) httpclient (~> 2.8, >= 2.8.3) json (>= 1.5.1) artifactory (3.0.17) atomos (0.1.3) aws-eventstream (1.4.0) - aws-partitions (1.1170.0) - aws-sdk-core (3.233.0) + aws-partitions (1.1198.0) + aws-sdk-core (3.240.0) aws-eventstream (~> 1, >= 1.3.0) aws-partitions (~> 1, >= 1.992.0) aws-sigv4 (~> 1.9) @@ -32,18 +29,18 @@ GEM bigdecimal jmespath (~> 1, >= 1.6.1) logger - aws-sdk-kms (1.113.0) - aws-sdk-core (~> 3, >= 3.231.0) + aws-sdk-kms (1.118.0) + aws-sdk-core (~> 3, >= 3.239.1) aws-sigv4 (~> 1.5) - aws-sdk-s3 (1.199.1) - aws-sdk-core (~> 3, >= 3.231.0) + aws-sdk-s3 (1.208.0) + aws-sdk-core (~> 3, >= 3.234.0) aws-sdk-kms (~> 1) aws-sigv4 (~> 1.5) aws-sigv4 (1.12.1) aws-eventstream (~> 1, >= 1.0.2) babosa (1.0.4) base64 (0.3.0) - bigdecimal (3.3.1) + bigdecimal (4.0.1) claide (1.1.0) cocoapods (1.15.0) addressable (~> 2.8) @@ -111,9 +108,9 @@ GEM faraday-rack (~> 1.0) faraday-retry (~> 1.0) ruby2_keywords (>= 0.0.4) - faraday-cookie_jar (0.0.7) + faraday-cookie_jar (0.0.8) faraday (>= 0.8.0) - http-cookie (~> 1.0.0) + http-cookie (>= 1.0.0) faraday-em_http (1.0.0) faraday-em_synchrony (1.0.1) faraday-excon (1.1.0) @@ -128,7 +125,7 @@ GEM faraday_middleware (1.2.1) faraday (~> 1.0) fastimage (2.4.0) - fastlane (2.215.0) + fastlane (2.215.1) CFPropertyList (>= 2.3, < 4.0.0) addressable (>= 2.8, < 3.0.0) artifactory (~> 3.0) @@ -172,7 +169,7 @@ GEM fourflusher (2.3.1) fuzzy_match (2.0.4) gh_inspector (1.1.3) - google-apis-androidpublisher_v3 (0.87.0) + google-apis-androidpublisher_v3 (0.92.0) google-apis-core (>= 0.15.0, < 2.a) google-apis-core (0.18.0) addressable (~> 2.5, >= 2.5.1) @@ -182,11 +179,11 @@ GEM mutex_m representable (~> 3.0) retriable (>= 2.0, < 4.a) - google-apis-iamcredentials_v1 (0.24.0) + google-apis-iamcredentials_v1 (0.26.0) google-apis-core (>= 0.15.0, < 2.a) google-apis-playcustomapp_v1 (0.17.0) google-apis-core (>= 0.15.0, < 2.a) - google-apis-storage_v1 (0.57.0) + google-apis-storage_v1 (0.58.0) google-apis-core (>= 0.15.0, < 2.a) google-cloud-core (1.8.0) google-cloud-env (>= 1.0, < 3.a) @@ -195,7 +192,7 @@ GEM base64 (~> 0.2) faraday (>= 1.0, < 3.a) google-cloud-errors (1.5.0) - google-cloud-storage (1.57.0) + google-cloud-storage (1.57.1) addressable (~> 2.8) digest-crc (~> 0.4) google-apis-core (>= 0.18, < 2) @@ -205,7 +202,7 @@ GEM googleauth (~> 1.9) mini_mime (~> 1.0) google-logging-utils (0.2.0) - googleauth (1.15.0) + googleauth (1.16.0) faraday (>= 1.0, < 3.a) google-cloud-env (~> 2.2) google-logging-utils (~> 0.1) @@ -221,7 +218,7 @@ GEM i18n (1.14.7) concurrent-ruby (~> 1.0) jmespath (1.6.2) - json (2.15.1) + json (2.18.0) jwt (2.10.2) base64 logger (1.7.0) @@ -229,19 +226,18 @@ GEM mini_mime (1.1.5) minitest (5.26.0) molinillo (0.8.0) - multi_json (1.17.0) + multi_json (1.18.0) multipart-post (2.4.1) mutex_m (0.3.0) nanaimo (0.4.0) nap (1.1.0) naturally (2.3.0) netrc (0.11.0) - nkf (0.2.0) optparse (0.1.1) os (1.1.4) plist (3.7.2) public_suffix (4.0.7) - rake (13.3.0) + rake (13.3.1) representable (3.2.0) declarative (< 0.1.0) trailblazer-option (>= 0.1.1, < 0.2.0) @@ -295,7 +291,7 @@ DEPENDENCIES activesupport (= 7.1.2) cocoapods (= 1.15.0) concurrent-ruby (= 1.3.4) - fastlane (= 2.215.0) + fastlane (= 2.215.1) xcodeproj (= 1.27.0) BUNDLED WITH From c7e7311c5ae14069956a03d707eab7abff31503f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 16 Nov 2025 04:32:10 +0000 Subject: [PATCH 64/92] build(deps-dev): bump js-yaml Bumps the npm_and_yarn group with 1 update in the / directory: [js-yaml](https://github.com/nodeca/js-yaml). Updates `js-yaml` from 4.1.0 to 4.1.1 - [Changelog](https://github.com/nodeca/js-yaml/blob/master/CHANGELOG.md) - [Commits](https://github.com/nodeca/js-yaml/compare/4.1.0...4.1.1) --- updated-dependencies: - dependency-name: js-yaml dependency-version: 4.1.1 dependency-type: direct:development dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index f42f4722421..e99f14d975d 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ "i18next": "23.10.0", "i18next-parser": "8.6.0", "inquirer": "8.2.6", - "js-yaml": "4.1.0", + "js-yaml": "4.1.1", "jsonc-parser": "3.2.0", "knip": "5.50.5", "lefthook": "1.12.2", From 479fb286265549335293d828529592aaf32563a9 Mon Sep 17 00:00:00 2001 From: snyk-bot Date: Wed, 24 Dec 2025 15:03:46 +0000 Subject: [PATCH 65/92] fix: apps/mobile/Gemfile & apps/mobile/Gemfile.lock to reduce vulnerabilities The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-RUBY-AWSSDKS3-14465282 --- apps/mobile/Gemfile | 2 +- apps/mobile/Gemfile.lock | 48 ++++++++++++++++++---------------------- 2 files changed, 23 insertions(+), 27 deletions(-) diff --git a/apps/mobile/Gemfile b/apps/mobile/Gemfile index a9e494ea9a1..9ca02152c75 100644 --- a/apps/mobile/Gemfile +++ b/apps/mobile/Gemfile @@ -1,6 +1,6 @@ source "https://rubygems.org" -gem 'fastlane', '2.215.0' +gem 'fastlane', '2.215.1' # Exclude problematic versions of cocoapods and activesupport that causes build failures. gem 'cocoapods', '1.15.0' gem 'activesupport', '7.1.2' diff --git a/apps/mobile/Gemfile.lock b/apps/mobile/Gemfile.lock index 1cc3a294c88..0de72b95649 100644 --- a/apps/mobile/Gemfile.lock +++ b/apps/mobile/Gemfile.lock @@ -1,10 +1,7 @@ GEM remote: https://rubygems.org/ specs: - CFPropertyList (3.0.7) - base64 - nkf - rexml + CFPropertyList (3.0.9) activesupport (7.1.2) base64 bigdecimal @@ -15,16 +12,16 @@ GEM minitest (>= 5.1) mutex_m tzinfo (~> 2.0) - addressable (2.8.7) - public_suffix (>= 2.0.2, < 7.0) + addressable (2.8.8) + public_suffix (>= 2.0.2, < 8.0) algoliasearch (1.27.5) httpclient (~> 2.8, >= 2.8.3) json (>= 1.5.1) artifactory (3.0.17) atomos (0.1.3) aws-eventstream (1.4.0) - aws-partitions (1.1170.0) - aws-sdk-core (3.233.0) + aws-partitions (1.1198.0) + aws-sdk-core (3.240.0) aws-eventstream (~> 1, >= 1.3.0) aws-partitions (~> 1, >= 1.992.0) aws-sigv4 (~> 1.9) @@ -32,18 +29,18 @@ GEM bigdecimal jmespath (~> 1, >= 1.6.1) logger - aws-sdk-kms (1.113.0) - aws-sdk-core (~> 3, >= 3.231.0) + aws-sdk-kms (1.118.0) + aws-sdk-core (~> 3, >= 3.239.1) aws-sigv4 (~> 1.5) - aws-sdk-s3 (1.199.1) - aws-sdk-core (~> 3, >= 3.231.0) + aws-sdk-s3 (1.209.0) + aws-sdk-core (~> 3, >= 3.234.0) aws-sdk-kms (~> 1) aws-sigv4 (~> 1.5) aws-sigv4 (1.12.1) aws-eventstream (~> 1, >= 1.0.2) babosa (1.0.4) base64 (0.3.0) - bigdecimal (3.3.1) + bigdecimal (4.0.1) claide (1.1.0) cocoapods (1.15.0) addressable (~> 2.8) @@ -111,9 +108,9 @@ GEM faraday-rack (~> 1.0) faraday-retry (~> 1.0) ruby2_keywords (>= 0.0.4) - faraday-cookie_jar (0.0.7) + faraday-cookie_jar (0.0.8) faraday (>= 0.8.0) - http-cookie (~> 1.0.0) + http-cookie (>= 1.0.0) faraday-em_http (1.0.0) faraday-em_synchrony (1.0.1) faraday-excon (1.1.0) @@ -128,7 +125,7 @@ GEM faraday_middleware (1.2.1) faraday (~> 1.0) fastimage (2.4.0) - fastlane (2.215.0) + fastlane (2.215.1) CFPropertyList (>= 2.3, < 4.0.0) addressable (>= 2.8, < 3.0.0) artifactory (~> 3.0) @@ -172,7 +169,7 @@ GEM fourflusher (2.3.1) fuzzy_match (2.0.4) gh_inspector (1.1.3) - google-apis-androidpublisher_v3 (0.87.0) + google-apis-androidpublisher_v3 (0.93.0) google-apis-core (>= 0.15.0, < 2.a) google-apis-core (0.18.0) addressable (~> 2.5, >= 2.5.1) @@ -182,11 +179,11 @@ GEM mutex_m representable (~> 3.0) retriable (>= 2.0, < 4.a) - google-apis-iamcredentials_v1 (0.24.0) + google-apis-iamcredentials_v1 (0.26.0) google-apis-core (>= 0.15.0, < 2.a) google-apis-playcustomapp_v1 (0.17.0) google-apis-core (>= 0.15.0, < 2.a) - google-apis-storage_v1 (0.57.0) + google-apis-storage_v1 (0.58.0) google-apis-core (>= 0.15.0, < 2.a) google-cloud-core (1.8.0) google-cloud-env (>= 1.0, < 3.a) @@ -195,7 +192,7 @@ GEM base64 (~> 0.2) faraday (>= 1.0, < 3.a) google-cloud-errors (1.5.0) - google-cloud-storage (1.57.0) + google-cloud-storage (1.57.1) addressable (~> 2.8) digest-crc (~> 0.4) google-apis-core (>= 0.18, < 2) @@ -205,7 +202,7 @@ GEM googleauth (~> 1.9) mini_mime (~> 1.0) google-logging-utils (0.2.0) - googleauth (1.15.0) + googleauth (1.16.0) faraday (>= 1.0, < 3.a) google-cloud-env (~> 2.2) google-logging-utils (~> 0.1) @@ -221,7 +218,7 @@ GEM i18n (1.14.7) concurrent-ruby (~> 1.0) jmespath (1.6.2) - json (2.15.1) + json (2.18.0) jwt (2.10.2) base64 logger (1.7.0) @@ -229,19 +226,18 @@ GEM mini_mime (1.1.5) minitest (5.26.0) molinillo (0.8.0) - multi_json (1.17.0) + multi_json (1.18.0) multipart-post (2.4.1) mutex_m (0.3.0) nanaimo (0.4.0) nap (1.1.0) naturally (2.3.0) netrc (0.11.0) - nkf (0.2.0) optparse (0.1.1) os (1.1.4) plist (3.7.2) public_suffix (4.0.7) - rake (13.3.0) + rake (13.3.1) representable (3.2.0) declarative (< 0.1.0) trailblazer-option (>= 0.1.1, < 0.2.0) @@ -295,7 +291,7 @@ DEPENDENCIES activesupport (= 7.1.2) cocoapods (= 1.15.0) concurrent-ruby (= 1.3.4) - fastlane (= 2.215.0) + fastlane (= 2.215.1) xcodeproj (= 1.27.0) BUNDLED WITH From 398296f7d53e031dbb784d6a256d9555b7735200 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 16 Jan 2026 12:44:24 +0000 Subject: [PATCH 66/92] build(deps): bump the npm_and_yarn group across 3 directories with 4 updates Bumps the npm_and_yarn group with 1 update in the /apps/extension directory: [react-router](https://github.com/remix-run/react-router/tree/HEAD/packages/react-router). Bumps the npm_and_yarn group with 4 updates in the /apps/web directory: [react-router](https://github.com/remix-run/react-router/tree/HEAD/packages/react-router), [hono](https://github.com/honojs/hono), [qs](https://github.com/ljharb/qs) and [storybook](https://github.com/storybookjs/storybook/tree/HEAD/code/core). Bumps the npm_and_yarn group with 2 updates in the /packages/uniswap directory: [react-router](https://github.com/remix-run/react-router/tree/HEAD/packages/react-router) and [qs](https://github.com/ljharb/qs). Updates `react-router` from 7.6.3 to 7.12.0 - [Release notes](https://github.com/remix-run/react-router/releases) - [Changelog](https://github.com/remix-run/react-router/blob/main/packages/react-router/CHANGELOG.md) - [Commits](https://github.com/remix-run/react-router/commits/react-router@7.12.0/packages/react-router) Updates `react-router` from 7.6.3 to 7.12.0 - [Release notes](https://github.com/remix-run/react-router/releases) - [Changelog](https://github.com/remix-run/react-router/blob/main/packages/react-router/CHANGELOG.md) - [Commits](https://github.com/remix-run/react-router/commits/react-router@7.12.0/packages/react-router) Updates `hono` from 4.10.3 to 4.11.4 - [Release notes](https://github.com/honojs/hono/releases) - [Commits](https://github.com/honojs/hono/compare/v4.10.3...v4.11.4) Updates `qs` from 6.11.0 to 6.14.1 - [Changelog](https://github.com/ljharb/qs/blob/main/CHANGELOG.md) - [Commits](https://github.com/ljharb/qs/compare/v6.11.0...v6.14.1) Updates `storybook` from 8.5.2 to 8.6.15 - [Release notes](https://github.com/storybookjs/storybook/releases) - [Changelog](https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md) - [Commits](https://github.com/storybookjs/storybook/commits/v8.6.15/code/core) Updates `react-router` from 7.6.3 to 7.12.0 - [Release notes](https://github.com/remix-run/react-router/releases) - [Changelog](https://github.com/remix-run/react-router/blob/main/packages/react-router/CHANGELOG.md) - [Commits](https://github.com/remix-run/react-router/commits/react-router@7.12.0/packages/react-router) Updates `qs` from 6.11.0 to 6.14.1 - [Changelog](https://github.com/ljharb/qs/blob/main/CHANGELOG.md) - [Commits](https://github.com/ljharb/qs/compare/v6.11.0...v6.14.1) --- updated-dependencies: - dependency-name: react-router dependency-version: 7.12.0 dependency-type: direct:production dependency-group: npm_and_yarn - dependency-name: react-router dependency-version: 7.12.0 dependency-type: direct:production dependency-group: npm_and_yarn - dependency-name: hono dependency-version: 4.11.4 dependency-type: direct:production dependency-group: npm_and_yarn - dependency-name: qs dependency-version: 6.14.1 dependency-type: direct:production dependency-group: npm_and_yarn - dependency-name: storybook dependency-version: 8.6.15 dependency-type: direct:development dependency-group: npm_and_yarn - dependency-name: react-router dependency-version: 7.12.0 dependency-type: direct:production dependency-group: npm_and_yarn - dependency-name: qs dependency-version: 6.14.1 dependency-type: direct:production dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] --- apps/extension/package.json | 2 +- apps/web/package.json | 8 ++++---- packages/uniswap/package.json | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/apps/extension/package.json b/apps/extension/package.json index 02974e473d0..bfd7f0ff2fd 100644 --- a/apps/extension/package.json +++ b/apps/extension/package.json @@ -41,7 +41,7 @@ "react-native-web": "0.19.13", "react-qr-code": "2.0.12", "react-redux": "8.0.5", - "react-router": "7.6.3", + "react-router": "7.12.0", "redux": "4.2.1", "redux-logger": "3.0.6", "redux-persist": "6.0.0", diff --git a/apps/web/package.json b/apps/web/package.json index b06f96e8d51..59eaf8abdbb 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -132,7 +132,7 @@ "resize-observer-polyfill": "1.5.1", "source-map-explorer": "2.5.3", "start-server-and-test": "2.0.0", - "storybook": "8.5.2", + "storybook": "8.6.15", "storybook-addon-pseudo-states": "4.0.2", "swc-loader": "0.2.6", "terser": "5.24.0", @@ -222,7 +222,7 @@ "fancy-canvas": "2.1.0", "framer-motion": "10.17.6", "graphql": "16.8.1", - "hono": "4.10.3", + "hono": "4.11.4", "html-entities": "2.6.0", "i18next": "23.10.0", "jotai": "1.3.7", @@ -239,7 +239,7 @@ "polished": "3.3.2", "polyfill-object.fromentries": "1.0.1", "porto": "0.0.80", - "qs": "6.11.0", + "qs": "6.14.1", "react": "18.3.1", "react-dom": "18.3.1", "react-feather": "2.0.10", @@ -250,7 +250,7 @@ "react-native-reanimated": "3.16.7", "react-popper": "2.3.0", "react-redux": "8.0.5", - "react-router": "7.6.3", + "react-router": "7.12.0", "react-scroll-sync": "0.11.2", "react-virtualized-auto-sizer": "1.0.20", "react-window": "1.8.9", diff --git a/packages/uniswap/package.json b/packages/uniswap/package.json index 9d4bae0b472..cae4f05b97a 100644 --- a/packages/uniswap/package.json +++ b/packages/uniswap/package.json @@ -82,7 +82,7 @@ "lodash": "4.17.21", "ms": "2.1.3", "poisson-disk-sampling": "2.3.1", - "qs": "6.11.0", + "qs": "6.14.1", "react": "18.3.1", "react-i18next": "14.1.0", "react-infinite-scroll-component": "6.1.0", @@ -98,7 +98,7 @@ "react-native-svg": "15.11.2", "react-native-webview": "13.13.5", "react-redux": "8.0.5", - "react-router": "7.6.3", + "react-router": "7.12.0", "react-test-renderer": "18.3.1", "react-virtualized-auto-sizer": "1.0.20", "react-window": "1.8.9", From 6ad0d16e6ae6498541b20414a8d4a6de60b7dffc Mon Sep 17 00:00:00 2001 From: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Tue, 20 Jan 2026 00:05:38 +0700 Subject: [PATCH 67/92] Potential fix for code scanning alert no. 9: Incomplete regular expression for hostnames (#100) Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> --- apps/web/cypress/support/commands.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/web/cypress/support/commands.ts b/apps/web/cypress/support/commands.ts index 476905a0daa..f35f18e9b4b 100644 --- a/apps/web/cypress/support/commands.ts +++ b/apps/web/cypress/support/commands.ts @@ -144,7 +144,7 @@ export function registerCommands() { Cypress.Commands.add('interceptGraphqlOperation', (operationName, fixturePath) => { const graphqlInterceptions = Cypress.env('graphqlInterceptions') - cy.intercept(/(?:interface|beta).gateway.uniswap.org\/v1\/graphql/, (req) => { + cy.intercept(/(?:interface|beta)\.gateway\.uniswap\.org\/v1\/graphql/, (req) => { req.headers['origin'] = 'https://app.uniswap.org' const currentOperationName = req.body.operationName From 1609591f4cfb3b2fd4f010f86eb9be6ee90e058d Mon Sep 17 00:00:00 2001 From: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Tue, 20 Jan 2026 00:17:06 +0700 Subject: [PATCH 68/92] Potential fix for code scanning alert no. 21: Incomplete URL substring sanitization Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --- .../turnstileSolver.integration.test.ts | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/packages/sessions/src/challenge-solvers/turnstileSolver.integration.test.ts b/packages/sessions/src/challenge-solvers/turnstileSolver.integration.test.ts index 424e096648a..f2ef7413cf8 100644 --- a/packages/sessions/src/challenge-solvers/turnstileSolver.integration.test.ts +++ b/packages/sessions/src/challenge-solvers/turnstileSolver.integration.test.ts @@ -25,7 +25,16 @@ beforeAll(() => { }) vi.spyOn(document.head, 'appendChild').mockImplementation((node) => { - if (node instanceof HTMLScriptElement && node.src.includes('challenges.cloudflare.com')) { + let isTurnstileScript = false + if (node instanceof HTMLScriptElement && node.src) { + try { + const url = new URL(node.src, window.location.href) + isTurnstileScript = url.hostname === 'challenges.cloudflare.com' + } catch { + isTurnstileScript = false + } + } + if (isTurnstileScript) { // Simulate script load immediately setTimeout(() => { // Set up the mock turnstile API From f6b397f75d76f3bbfce1219501cc4bc9f8092663 Mon Sep 17 00:00:00 2001 From: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Tue, 20 Jan 2026 00:22:38 +0700 Subject: [PATCH 69/92] Potential fix for code scanning alert no. 22: Incomplete URL substring sanitization Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --- .../turnstileSolver.integration.test.ts | 20 +++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/packages/sessions/src/challenge-solvers/turnstileSolver.integration.test.ts b/packages/sessions/src/challenge-solvers/turnstileSolver.integration.test.ts index f2ef7413cf8..f44c0c3151b 100644 --- a/packages/sessions/src/challenge-solvers/turnstileSolver.integration.test.ts +++ b/packages/sessions/src/challenge-solvers/turnstileSolver.integration.test.ts @@ -252,12 +252,20 @@ describe('Turnstile Solver Integration Tests', () => { it('handles script loading failures', async () => { // Mock script loading failure vi.spyOn(document.head, 'appendChild').mockImplementationOnce((node) => { - if (node instanceof HTMLScriptElement && node.src.includes('challenges.cloudflare.com')) { - setTimeout(() => { - if (node.onerror) { - node.onerror({} as Event) - } - }, 0) + if (node instanceof HTMLScriptElement) { + let host: string | null = null + try { + host = new URL(node.src, window.location.href).host + } catch { + host = null + } + if (host === 'challenges.cloudflare.com') { + setTimeout(() => { + if (node.onerror) { + node.onerror({} as Event) + } + }, 0) + } } return node }) From 2aea2941360ed51ee5d52bff220bfb9f52098bec Mon Sep 17 00:00:00 2001 From: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Tue, 20 Jan 2026 05:01:33 +0700 Subject: [PATCH 70/92] Uniswap/main (#98) * Create config.yml (#72) Summary by Sourcery CI: Introduce CircleCI 2.1 pipeline with a docker-based say-hello job and workflow Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> * ci(release): publish latest release * ci(release): publish latest release * ci(release): publish latest release * ci(release): publish latest release * ci(release): publish latest release * ci(release): publish latest release * ci(release): publish latest release * ci(release): publish latest release * ci(release): publish latest release * ci(release): publish latest release * ci(release): publish latest release * ci(release): publish latest release * ci(release): publish latest release * ci(release): publish latest release * ci(release): publish latest release * ci(release): publish latest release * ci(release): publish latest release * ci(release): publish latest release * ci(release): publish latest release * ci(release): publish latest release * ci(release): publish latest release * ci(release): publish latest release * ci(release): publish latest release * ci(release): publish latest release * ci(release): publish latest release * ci(release): publish latest release * ci(release): publish latest release * ci(release): publish latest release * ci(release): publish latest release * ci(release): publish latest release * ci(release): publish latest release * ci(release): publish latest release * ci(release): publish latest release * Potential fix for code scanning alert no. 24: Incomplete multi-character sanitization Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Potential fix for code scanning alert no. 23: Incomplete regular expression for hostnames Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Potential fix for code scanning alert no. 21: Incomplete URL substring sanitization Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Potential fix for code scanning alert no. 22: Incomplete URL substring sanitization Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: Uniswap Labs Service Account Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> --- .bun-version | 2 +- .claude/hooks/skill-activation-prompt.sh | 6 + .claude/hooks/skill-activation-prompt.ts | 132 + .claude/settings.json | 32 + .claude/skills/skill-rules.json | 29 + .claude/skills/web-e2e/SKILL.md | 350 + .cursor/cli.json | 21 + .cursorignore | 7 + .env.defaults | 7 + .gitignore | 11 +- .nxignore | 1 + CLAUDE.md | 3 +- CODEOWNERS | 1 - RELEASE | 126 +- apps/api-self-serve/.eslintrc.js | 44 + apps/api-self-serve/.gitignore | 7 + apps/api-self-serve/README.md | 1 + apps/api-self-serve/app/app.css | 170 + apps/api-self-serve/app/lib/utils.ts | 6 + apps/api-self-serve/app/root.tsx | 53 + apps/api-self-serve/app/routes.ts | 3 + apps/api-self-serve/app/routes/home.tsx | 11 + apps/api-self-serve/app/welcome/logo-dark.svg | 23 + .../api-self-serve/app/welcome/logo-light.svg | 23 + apps/api-self-serve/app/welcome/welcome.tsx | 80 + apps/api-self-serve/components.json | 22 + apps/api-self-serve/package.json | 36 + apps/api-self-serve/react-router.config.ts | 7 + apps/api-self-serve/tailwind.config.ts | 430 + apps/api-self-serve/tsconfig.eslint.json | 5 + apps/api-self-serve/tsconfig.json | 23 + apps/api-self-serve/vite.config.ts | 15 + apps/cli/.eslintrc.cjs | 45 + apps/cli/README.md | 2 + apps/cli/package.json | 38 + apps/cli/project.json | 19 + apps/cli/src/cli-ui.tsx | 27 + apps/cli/src/cli.ts | 429 + apps/cli/src/core/data-collector.ts | 1096 ++ apps/cli/src/core/orchestrator.ts | 810 ++ apps/cli/src/index.ts | 2 + apps/cli/src/lib/ai-provider-vercel.ts | 143 + apps/cli/src/lib/ai-provider.ts | 50 + apps/cli/src/lib/analysis-writer.ts | 241 + apps/cli/src/lib/cache-keys.ts | 106 + apps/cli/src/lib/cache-provider-sqlite.ts | 130 + apps/cli/src/lib/cache-provider.ts | 41 + apps/cli/src/lib/logger.ts | 221 + apps/cli/src/lib/pr-body-cleaner.ts | 496 + apps/cli/src/lib/release-scanner.ts | 283 + apps/cli/src/lib/stream-handler.ts | 35 + apps/cli/src/lib/team-members.ts | 37 + apps/cli/src/lib/team-resolver.ts | 156 + apps/cli/src/lib/trivial-files.ts | 74 + apps/cli/src/prompts/bug-bisect.md | 83 + apps/cli/src/prompts/release-changelog.md | 74 + apps/cli/src/prompts/team-digest.md | 102 + apps/cli/src/ui/App.tsx | 175 + apps/cli/src/ui/components/Banner.tsx | 30 + apps/cli/src/ui/components/Box.tsx | 18 + .../src/ui/components/ChangelogPreview.tsx | 20 + apps/cli/src/ui/components/FormField.tsx | 26 + apps/cli/src/ui/components/NumberInput.tsx | 39 + .../src/ui/components/ProgressIndicator.tsx | 75 + apps/cli/src/ui/components/ReleaseList.tsx | 34 + apps/cli/src/ui/components/Select.tsx | 38 + apps/cli/src/ui/components/StatusBadge.tsx | 20 + apps/cli/src/ui/components/TextInput.tsx | 38 + apps/cli/src/ui/components/Toggle.tsx | 22 + apps/cli/src/ui/components/WindowedSelect.tsx | 101 + apps/cli/src/ui/hooks/useAnalysis.ts | 53 + apps/cli/src/ui/hooks/useAppState.tsx | 132 + apps/cli/src/ui/hooks/useEditableField.ts | 107 + apps/cli/src/ui/hooks/useFormNavigation.ts | 67 + apps/cli/src/ui/hooks/useReleases.ts | 106 + apps/cli/src/ui/hooks/useRepository.ts | 53 + apps/cli/src/ui/hooks/useTeams.ts | 94 + apps/cli/src/ui/hooks/useToggleGroup.ts | 70 + .../src/ui/screens/BugBisectResultsScreen.tsx | 464 + apps/cli/src/ui/screens/BugInputScreen.tsx | 76 + apps/cli/src/ui/screens/ConfigReview.tsx | 975 ++ apps/cli/src/ui/screens/ExecutionScreen.tsx | 176 + apps/cli/src/ui/screens/ReleaseSelector.tsx | 200 + apps/cli/src/ui/screens/ResultsScreen.tsx | 258 + apps/cli/src/ui/screens/TeamDetailsScreen.tsx | 152 + .../cli/src/ui/screens/TeamSelectorScreen.tsx | 327 + apps/cli/src/ui/screens/WelcomeScreen.tsx | 81 + .../src/ui/services/orchestrator-service.ts | 68 + apps/cli/src/ui/utils/colors.ts | 13 + apps/cli/src/ui/utils/format.ts | 18 + apps/cli/tsconfig.json | 11 + apps/cli/tsconfig.lint.json | 8 + apps/extension/.gitignore | 2 + apps/extension/jest-setup.js | 84 +- apps/extension/jest.config.js | 5 +- .../app/components/AutoLockProvider.test.tsx | 425 +- .../src/app/components/tabs/ActivityTab.tsx | 24 +- .../src/app/core/BaseAppContainer.tsx | 70 +- apps/extension/src/app/core/SidebarApp.tsx | 14 + .../src/app/features/accounts/AccountItem.tsx | 14 +- .../accounts/AccountSwitcherScreen.tsx | 26 +- .../AccountSwitcherScreen.test.tsx.snap | 323 +- .../biometricUnlock/BiometricUnlockStorage.ts | 1 + .../biometricUnlock/biometricAuthUtils.ts | 7 +- .../useBiometricUnlockSetupMutation.test.ts | 9 +- .../useBiometricUnlockSetupMutation.ts | 10 +- ...hangePasswordWithBiometricMutation.test.ts | 4 + .../useChangePasswordWithBiometricMutation.ts | 2 + ...ockWithBiometricCredentialMutation.test.ts | 44 +- ...seUnlockWithBiometricCredentialMutation.ts | 4 +- .../dappRequests/DappRequestContent.tsx | 108 +- .../usePrepareAndSignSendCallsTransaction.ts | 1 + .../Connection/ConnectionRequestContent.tsx | 34 +- .../requestContent/EthSend/EthSend.tsx | 159 +- .../ParsedTransactionRequestContent.tsx | 74 + .../EthSend/Swap/SwapRequestContent.tsx | 2 +- .../PersonalSignRequestContent.tsx | 113 +- .../SendCalls/SendCallsRequestContent.tsx | 79 +- .../NonStandardTypedDataRequestContent.tsx | 51 +- .../Permit2/Permit2RequestContent.tsx | 104 - .../src/app/features/dappRequests/saga.ts | 4 +- .../dappRequests/types/EthersTypes.ts | 2 +- .../src/app/features/home/PortfolioHeader.tsx | 2 +- .../app/features/home/TokenBalanceList.tsx | 40 +- .../home/introCards/HomeIntroCardStack.tsx | 26 +- .../onboarding/import/ImportMnemonic.tsx | 4 +- .../onboarding/import/SelectWallets.tsx | 4 +- .../app/features/onboarding/scan/OTPInput.tsx | 2 +- .../__snapshots__/ReceiveScreen.test.tsx.snap | 55 +- .../src/app/features/send/SendFlow.tsx | 26 +- .../features/settings/DeviceAccessScreen.tsx | 2 + .../features/settings/SettingsDropdown.tsx | 2 +- .../SettingsManageConnectionsScreen.tsx | 1 + .../app/features/settings/SettingsScreen.tsx | 2 +- .../password/ChangePasswordForm.test.tsx | 166 + .../settings/password/ChangePasswordForm.tsx | 45 +- .../password/CreateNewPasswordModal.tsx | 4 +- .../ChangePasswordForm.test.tsx.snap | 287 + .../password/usePasswordResetFlow.test.ts | 93 + .../settings/password/usePasswordResetFlow.ts | 6 + .../src/app/navigation/navigation.tsx | 2 +- apps/extension/src/app/saga.ts | 19 - apps/extension/src/app/utils/analytics.ts | 7 + .../src/background/backgroundDappRequests.ts | 5 +- .../background/utils/persistedStateUtils.ts | 6 + apps/extension/src/entrypoints/background.ts | 56 +- apps/extension/src/manifest.json | 2 +- apps/extension/src/store/migrations.test.ts | 32 +- apps/extension/src/store/migrations.ts | 6 +- apps/extension/src/store/schema.ts | 8 +- apps/extension/src/test/babel.config.js | 3 +- apps/extension/src/test/fixtures/redux.ts | 11 +- apps/extension/tsconfig.json | 6 + apps/extension/webpack.config.js | 5 +- apps/extension/wxt.config.ts | 12 +- apps/mobile/.depcheckrc | 5 +- apps/mobile/.eslintrc.js | 7 - apps/mobile/.fingerprintignore | 49 + apps/mobile/.gitignore | 11 +- .../flows/explore/filters-and-sorts.yaml | 22 +- apps/mobile/android/app/build.gradle | 111 +- .../android/app/src/main/AndroidManifest.xml | 70 +- .../src/main/java/com/uniswap/MainActivity.kt | 6 +- .../main/java/com/uniswap/MainApplication.kt | 15 +- .../main/java/com/uniswap/UniswapPackage.kt | 2 + .../SilentPushEventEmitterModule.kt | 129 + .../SilentPushNotificationServiceExtension.kt | 123 + .../uniswap/utils/JsonWritableExtensions.kt | 61 + apps/mobile/android/build.gradle | 25 +- .../gradle/wrapper/gradle-wrapper.properties | 2 +- apps/mobile/android/gradlew | 301 +- apps/mobile/android/settings.gradle | 39 +- apps/mobile/app.config.ts | 18 + apps/mobile/app.json | 14 - apps/mobile/eas.json | 72 + apps/mobile/fingerprint.config.js | 8 + apps/mobile/index.js | 4 +- apps/mobile/ios/Podfile | 20 +- apps/mobile/ios/Podfile.lock | 1342 +- .../ios/Uniswap.xcodeproj/project.pbxproj | 1148 +- apps/mobile/ios/Uniswap/AppDelegate.h | 7 - apps/mobile/ios/Uniswap/AppDelegate.m | 131 - apps/mobile/ios/Uniswap/AppDelegate.swift | 163 + .../Notifications/SilentPushEventEmitter.m | 18 + .../SilentPushEventEmitter.swift | 31 + .../ios/Uniswap/Uniswap-Bridging-Header.h | 23 + apps/mobile/ios/Uniswap/main.m | 9 - .../ios/WidgetsCore/.mobileschema_fingerprint | 2 +- apps/mobile/ios/sourcemaps-datadog.sh | 64 +- apps/mobile/jest-setup.js | 40 +- apps/mobile/jest.config.js | 1 - apps/mobile/metro.config.js | 65 +- apps/mobile/project.json | 60 +- apps/mobile/rnef.config.mjs | 36 - apps/mobile/scripts/check-android-gradle.sh | 25 + apps/mobile/scripts/check-podfile.sh | 25 + apps/mobile/scripts/checkBundleSize.sh | 2 +- .../scripts/getFingerprintForRadonIDE.ts | 22 + .../scripts/ios-build-interactive/main.ts | 8 +- apps/mobile/src/app/migrations.test.ts | 32 +- apps/mobile/src/app/migrations.ts | 9 +- .../src/app/modals/AccountSwitcherModal.tsx | 52 +- .../app/modals/BridgedAssetWarningWrapper.tsx | 2 +- .../app/modals/TokenWarningModalWrapper.tsx | 7 +- .../AccountSwitcherModal.test.tsx.snap | 405 +- apps/mobile/src/app/monitoredSagas.ts | 19 - .../app/navigation/NavigationContainer.tsx | 2 +- apps/mobile/src/app/navigation/constants.ts | 2 + apps/mobile/src/app/navigation/navigation.tsx | 4 + .../tabs/CustomTabBar/CustomTabBar.tsx | 4 +- .../navigation/tabs/CustomTabBar/constants.ts | 2 +- .../src/app/navigation/tabs/SwapButton.tsx | 2 +- ...ressModal.tsx => SwapLongPressOverlay.tsx} | 134 +- apps/mobile/src/app/navigation/types.ts | 4 + apps/mobile/src/app/schema.ts | 14 +- .../PriceExplorer/usePriceHistory.test.ts | 108 +- .../ConnectedDapps/DappConnectionItem.tsx | 4 +- .../ModalWithOverlay/ModalWithOverlay.tsx | 3 +- .../Requests/RequestModal/ClientDetails.tsx | 32 +- .../Requests/RequestModal/HeaderText.tsx | 10 +- .../Requests/RequestModal/RequestDetails.tsx | 3 +- .../WalletConnectRequestModal.tsx | 67 +- .../WalletConnectRequestModalContent.tsx | 274 +- .../ScanSheet/PendingConnectionModal.tsx | 132 +- .../src/components/Requests/Uwulink/utils.ts | 1 + .../PrivateKeySpeedBumpModal.test.tsx.snap | 276 +- .../EditLabelSettingsModal.tsx | 4 +- .../TokenBalanceList/TokenBalanceList.tsx | 7 + .../TokenDetailsActionButtons.tsx | 6 +- .../TokenDetails/TokenDetailsContext.tsx | 16 + .../TokenDetails/TokenDetailsLinks.tsx | 2 +- .../TokenDetails/TokenDetailsStats.tsx | 26 +- .../TokenSelector/TokenFiatOnRampList.tsx | 6 +- .../components/accounts/AccountCardItem.tsx | 5 +- .../AccountCardItem.test.tsx.snap | 181 +- .../__snapshots__/AccountHeader.test.tsx.snap | 350 +- .../__snapshots__/AccountList.test.tsx.snap | 91 +- .../__snapshots__/BackButton.test.tsx.snap | 116 +- .../__snapshots__/CloseButton.test.tsx.snap | 54 +- .../src/components/education/SeedPhrase.tsx | 69 +- .../ExploreSections/ExploreSections.tsx | 55 +- .../ExploreSections/NetworkPillsRow.tsx | 5 +- .../FavoriteHeaderRow.test.tsx.snap | 131 +- .../FavoriteTokenCard.test.tsx.snap | 237 +- .../FavoriteWalletCard.test.tsx.snap | 273 +- .../__snapshots__/RemoveButton.test.tsx.snap | 78 +- .../__snapshots__/SortButton.test.tsx.snap | 121 +- .../__snapshots__/TokenItem.test.tsx.snap | 126 +- .../explore/hooks/useFlatListAutoScroll.ts | 4 +- .../SearchPopularNFTCollections.graphql | 21 - .../src/components/fiatOnRamp/CtaButton.tsx | 2 +- .../mobile/src/components/icons/TripleDot.tsx | 17 - .../SelectionCircle.test.tsx.snap | 35 +- .../src/components/layout/TabHelpers.tsx | 2 +- .../layout/screens/HeaderScrollScreen.tsx | 8 +- .../layout/screens/ScrollHeader.tsx | 10 +- .../ReactNavigationModal.tsx | 6 + .../ReportTokenDataModalScreen.tsx | 10 + .../ReportTokenIssueModalScreen.tsx | 10 + .../src/components/text/LongMarkdownText.tsx | 2 +- .../__snapshots__/AnimatedText.test.tsx.snap | 40 +- .../__snapshots__/DecimalNumber.test.tsx.snap | 35 +- .../TextWithFuseMatches.test.tsx.snap | 161 +- .../biometrics/biometrics-utils.test.ts | 4 +- .../src/features/biometrics/biometricsSaga.ts | 2 +- .../deepLinking/deepLinkUtils.test.ts | 92 +- .../src/features/deepLinking/deepLinkUtils.ts | 97 +- .../deepLinking/handleDeepLinkSaga.test.ts | 370 - .../deepLinking/handleDeepLinkSaga.ts | 11 +- .../deepLinking/handleInAppBrowserSaga.ts | 35 - .../deepLinking/parseSwapLink.test.ts | 19 +- .../externalProfile/ProfileContextMenu.tsx | 11 +- .../externalProfile/ProfileHeader.tsx | 2 +- .../fiatOnRamp/FiatOnRampAmountSection.tsx | 2 +- .../features/import/InputWIthSuffixProps.ts | 2 +- .../GenericImportForm.test.tsx.snap | 170 +- .../collection/NFTCollectionContextMenu.tsx | 6 +- .../CollectionPreviewCard.test.tsx.snap | 135 +- .../item/__snapshots__/traits.test.tsx.snap | 7 +- .../src/features/notifications/Onesignal.ts | 9 + .../notifications/SilentPushListener.ts | 70 + .../src/features/notifications/constants.ts | 1 + .../mobile/src/features/notifications/saga.ts | 15 +- apps/mobile/src/features/send/SendFlow.tsx | 12 +- .../src/features/send/SendFormButton.tsx | 2 +- .../src/features/send/SendTokenForm.tsx | 10 +- apps/mobile/src/features/telemetry/saga.ts | 53 +- .../walletConnect/fetchDappDetails.ts | 4 +- .../src/features/walletConnect/saga.test.ts | 89 +- .../walletConnect/signWcRequestSaga.ts | 10 +- .../src/features/walletConnect/utils.test.ts | 85 + .../src/features/walletConnect/utils.ts | 62 +- .../walletConnect/walletConnectSlice.ts | 24 +- apps/mobile/src/screens/DevScreen.tsx | 2 +- apps/mobile/src/screens/ExploreScreen.tsx | 43 +- apps/mobile/src/screens/FiatOnRampScreen.tsx | 3 +- .../src/screens/Import/SelectWalletScreen.tsx | 4 +- ...oreCloudBackupPasswordScreen.test.tsx.snap | 327 +- .../RestoreCloudBackupScreen.test.tsx.snap | 531 +- .../screens/Onboarding/ManualBackupScreen.tsx | 23 +- .../src/screens/Onboarding/TermsOfService.tsx | 2 + .../__snapshots__/BackupScreen.test.tsx.snap | 778 +- ...ttingsCloudBackupPasswordConfirmScreen.tsx | 1 + apps/mobile/src/screens/SettingsScreen.tsx | 2 +- .../src/screens/TokenDetailsHeaders.tsx | 22 + .../mobile/src/screens/TokenDetailsScreen.tsx | 171 +- apps/mobile/src/test/fixtures/redux.ts | 9 +- apps/mobile/src/utils/hooks.ts | 2 +- apps/mobile/tsconfig.json | 6 + apps/web/.depcheckrc | 1 + apps/web/.env.staging | 1 + apps/web/.gitignore | 2 + apps/web/.storybook/__mocks__/tty.js | 10 + apps/web/.storybook/main.ts | 177 +- apps/web/CLAUDE.md | 14 +- apps/web/functions/api/image/pools.tsx | 6 +- .../pools/__snapshots__/pool.test.ts.snap | 8 +- apps/web/functions/explore/pools/pool.test.ts | 2 +- apps/web/playwright.config.ts | 17 +- apps/web/public/app-sitemap.xml | 12 + apps/web/public/csp.json | 5 +- .../notifications/monad_banner_light.png | Bin 0 -> 29178 bytes .../notifications/monad_logo_filled.png | Bin 0 -> 2017 bytes apps/web/public/nfts-sitemap.xml | 310 +- apps/web/public/pools-sitemap.xml | 9751 ++++--------- apps/web/public/sitemap.xml | 3 - .../{vercel-csp.json => staging-csp.json} | 3 +- apps/web/public/tokens-sitemap.xml | 9165 +------------ apps/web/scripts/start-anvil.sh | 14 + apps/web/src/appGraphql/data/apollo/client.ts | 4 +- .../src/appGraphql/data/apollo/retryLink.ts | 43 + .../appGraphql/data/pools/usePoolData.test.ts | 266 + .../src/appGraphql/data/pools/usePoolData.ts | 5 +- .../dark.svg | 22 + .../light.svg | 22 + .../dark.svg | 778 ++ .../light.svg | 778 ++ .../mobile-dark.svg | 189 + .../mobile-light.svg | 189 + .../web/src/assets/svg/demo-wallet-emblem.svg | 3 + .../AccountDetails/AddressDisplay.tsx | 4 +- .../MultiBlockchainAddressDisplay.tsx | 24 +- .../AccountDrawer/AccountDrawer.e2e.test.ts | 283 +- .../components/AccountDrawer/ActionTile.tsx | 26 +- .../AuthenticatedHeader.anvil.e2e.test.ts | 40 +- .../AuthenticatedHeader.e2e.test.ts | 40 +- .../AccountDrawer/AuthenticatedHeader.tsx | 93 +- .../AccountDrawer/DisconnectButton.tsx | 29 +- .../AccountDrawer/LocalCurrencyMenu.tsx | 4 +- .../Activity/ActivityTab.anvil.e2e.test.ts | 50 - .../MiniPortfolio/Activity/ActivityTab.tsx | 35 +- .../Activity/CancelOrdersDialog.tsx | 55 +- .../MiniPortfolio/Activity/Logos.tsx | 19 +- .../Activity/OffchainActivityModal.tsx | 16 +- .../CancelOrdersDialog.test.tsx.snap | 644 +- .../OffchainActivityModal.test.tsx.snap | 297 +- .../OffchainOrderLineItem.test.tsx.snap | 37 +- .../MiniPortfolio/Activity/hooks.ts | 11 +- .../MiniPortfolio/Activity/parseLocal.ts | 1 + .../MiniPortfolio/ExtensionDeeplinks.tsx | 11 +- .../LimitDetailActivityRow.test.tsx.snap | 6 +- .../OpenLimitOrdersButton.test.tsx.snap | 35 +- .../MiniPortfolio/MiniPortfolio.tsx | 7 +- .../MiniPortfolio/MiniPortfolioV2.tsx | 84 + .../__snapshots__/EmptyPools.test.tsx.snap | 3 +- .../MiniPortfolio/Pools/cache.ts | 2 +- .../MiniPortfolio/Tokens/TokensTab.tsx | 14 + .../AccountDrawer/MiniPortfolio/shared.tsx | 10 +- .../AccountDrawer/PortfolioBalanceMenu.tsx | 8 +- .../AccountDrawer/ReportedActivityToggle.tsx | 24 + .../src/components/AccountDrawer/Scrim.tsx | 4 +- .../components/AccountDrawer/SettingsMenu.tsx | 10 +- .../AccountDrawer/SettingsToggle.tsx | 3 +- .../AccountDrawer/SmallBalanceToggle.tsx | 1 + .../{SpamToggle.tsx => SpamTokensToggle.tsx} | 12 +- .../src/components/AccountDrawer/shared.tsx | 33 +- .../ActionTileWithIconAnimation.tsx | 43 + .../components/ActionTiles/BuyActionTile.tsx | 30 + .../components/ActionTiles/MoreActionTile.tsx | 102 + .../ActionTiles/ReceiveActionTile.tsx | 23 + .../SendActionTile/SendActionTile.tsx | 42 + .../SendActionTile}/SendButtonTooltip.tsx | 7 +- .../components/ActionTiles/SwapActionTile.tsx | 30 + apps/web/src/components/AddressInputPanel.tsx | 16 +- .../Banner/LimitedSupportBanner.tsx | 7 +- .../components/Banner/Outage/OutageBanner.tsx | 25 +- .../Banner/SolanaPromo/SolanaPromoBanner.tsx | 140 - .../Banner/SolanaPromo/SolanaPromoModal.tsx | 145 - .../shared/{Banners.tsx => OutageBanners.tsx} | 0 .../components/ChainConnectivityWarning.tsx | 16 +- .../ActiveLiquidityChart/TickTooltip.tsx | 29 +- .../web/src/components/Charts/ChartHeader.tsx | 18 +- apps/web/src/components/Charts/ChartModel.tsx | 181 +- .../src/components/Charts/ChartTooltip.tsx | 24 + .../components/Charts/CustomHoverMarker.tsx | 50 + .../components/D3LiquidityMinMaxInput.tsx | 4 +- .../components/DefaultPriceStrategies.tsx | 3 +- .../calculateAnchoredLiquidityByTick.test.ts | 223 + .../utils/calculateAnchoredLiquidityByTick.ts | 69 + .../utils/calculateTokensLocked.ts | 53 + .../LiquidityChart/utils/getAmounts.test.ts | 208 + .../Charts/LiquidityChart/utils/getAmounts.ts | 91 + .../Charts/LiquidityRangeInput/hooks.ts | 40 +- .../src/components/Charts/LiveDotRenderer.tsx | 161 + .../src/components/Charts/LoadingState.tsx | 36 +- .../Charts/StackedLineChart/index.tsx | 45 +- .../web/src/components/Charts/StaleBanner.tsx | 33 + .../Charts/ToucanChart/renderer.tsx | 413 + .../ToucanChart/toucan-chart-series.tsx | 56 + .../VolumeChart/CustomVolumeChartModel.tsx | 6 +- .../components/Charts/VolumeChart/index.tsx | 15 +- .../hooks/useApplyChartTextureEffects.ts | 90 + .../useHeaderDateFormatter.ts} | 0 apps/web/src/components/Charts/utils.tsx | 10 - .../src/components/ConfirmSwapModal/Modal.tsx | 4 +- .../components/ConfirmSwapModal/Pending.tsx | 10 +- .../ConfirmSwapModal/ProgressIndicator.tsx | 16 +- .../src/components/ConfirmSwapModal/Step.tsx | 8 +- .../ConfirmSwapModal/TradeSummary.tsx | 6 +- .../__snapshots__/Error.test.tsx.snap | 132 +- .../__snapshots__/Head.test.tsx.snap | 18 +- .../__snapshots__/Pending.test.tsx.snap | 526 +- .../src/components/ConfirmSwapModal/index.tsx | 4 +- .../components/ConnectedAccountBlocked.tsx | 10 +- .../LimitPriceInputPanel/LimitPriceButton.tsx | 6 +- .../LimitPriceInputLabel.tsx | 6 +- .../LimitPriceInputPanel.test.tsx | 10 +- .../LimitPriceInputPanel.tsx | 10 +- .../LimitPriceButton.test.tsx.snap | 242 +- .../SwapCurrencyInputPanel.test.tsx | 161 + .../SwapCurrencyInputPanel.tsx | 28 +- .../web/src/components/Dropdowns/Dropdown.tsx | 5 +- .../components/Dropdowns/DropdownSelector.tsx | 2 +- .../src/components/Dropdowns/FilterButton.tsx | 1 + apps/web/src/components/ErrorBoundary.tsx | 6 +- .../__snapshots__/index.test.tsx.snap | 4 +- apps/web/src/components/FeeSelector/index.tsx | 6 +- .../src/components/HelpModal/HelpModal.tsx | 2 + .../components/Icons/AlertTriangleFilled.tsx | 6 +- apps/web/src/components/Icons/CreditCard.tsx | 12 - apps/web/src/components/Icons/Globe.tsx | 18 - .../src/components/Icons/LoadingSpinner.tsx | 22 +- apps/web/src/components/Icons/shared.tsx | 6 +- apps/web/src/components/InputStepCounter.tsx | 8 +- .../components/Liquidity/Create/AddHook.tsx | 30 +- .../Create/DynamicFeeTierSpeedbump.tsx | 41 +- .../components/Liquidity/Create/EditStep.tsx | 3 +- .../Liquidity/Create/SelectTokenStep.tsx | 103 +- .../hooks/useDefaultInitialPrice.test.ts | 4 + .../hooks/useDerivedPositionInfo.test.ts | 8 +- .../Create/hooks/useDerivedPositionInfo.tsx | 36 +- .../Create/hooks/useLiquidityUrlState.test.ts | 8 +- .../Create/hooks/useLiquidityUrlState.ts | 5 +- .../Liquidity/FeeTierSearchModal.tsx | 16 +- .../src/components/Liquidity/HookModal.tsx | 15 +- .../LPIncentives/LpIncentiveClaimModal.tsx | 114 +- .../LPIncentives/LpIncentiveRewardsCard.tsx | 3 +- .../hooks/useLpIncentiveClaimMutation.ts | 73 - .../Liquidity/LiquidityPositionInfoBadges.tsx | 3 +- .../Liquidity/PositionPageActionButtons.tsx | 2 + .../src/components/Liquidity/ReviewModal.tsx | 334 + .../hooks/useAllFeeTierPoolData.test.tsx | 18 +- .../Liquidity/hooks/useAllFeeTierPoolData.ts | 5 +- .../hooks/useReportPositionHandler.ts | 63 + .../Liquidity/parsers/urlParsers.ts | 5 +- apps/web/src/components/Liquidity/types.ts | 2 +- .../Liquidity/utils/feeTiers.test.ts | 109 +- .../components/Liquidity/utils/feeTiers.ts | 174 +- .../Liquidity/utils/parseFromRest.test.ts | 4 +- .../Liquidity/utils/parseFromRest.ts | 4 +- apps/web/src/components/Loader/styled.tsx | 10 +- apps/web/src/components/Logo/ChainLogo.tsx | 5 +- apps/web/src/components/Logo/DoubleLogo.tsx | 4 +- .../__snapshots__/DoubleLogo.test.tsx.snap | 9 - .../NavBar/DownloadApp/Modal/DownloadApps.tsx | 2 +- .../DownloadApp/Modal/GetStarted.e2e.test.ts | 54 +- .../NewUserCTAButton.test.tsx.snap | 3 +- .../NavBar/LegalAndPrivacyMenu/index.tsx | 2 +- .../NavBar/MobileBottomBar/TDPActionTabs.tsx | 19 +- .../NavBar/PreferencesMenu/Preferences.tsx | 14 +- .../NavBar/SearchBar/SearchBar.e2e.test.ts | 56 +- .../NavBar/SearchBar/SearchModal.tsx | 6 +- .../__snapshots__/SearchBar.test.tsx.snap | 19 +- apps/web/src/components/NavBar/Tabs/Tabs.tsx | 45 +- .../NavBar/TestnetMode/TestnetModeTooltip.tsx | 3 +- .../components/NavBar/UniswapWrappedEntry.tsx | 80 + apps/web/src/components/NavBar/index.tsx | 4 +- .../NetworkFilter/NetworkFilter.tsx | 76 +- .../NetworkFilter/useFilteredChains.ts | 12 +- apps/web/src/components/NumericalInput.tsx | 11 +- .../Pools/PoolDetails/ChartSection/index.tsx | 85 +- .../PoolDetails/PoolDetailsHeader.test.tsx | 5 +- .../PoolDetails/PoolDetailsLink.test.tsx | 5 +- .../Pools/PoolDetails/PoolDetailsLink.tsx | 26 +- .../PoolDetails/PoolDetailsStats.test.tsx | 7 +- .../Pools/PoolDetails/PoolDetailsStats.tsx | 40 +- .../PoolDetailsStatsButtons.test.tsx | 15 +- .../PoolDetails/PoolDetailsStatsButtons.tsx | 19 +- .../Pools/PoolDetails/PoolDetailsTable.tsx | 4 +- .../PoolDetailsTransactionsTable.tsx | 6 +- .../PoolDetailsHeader.test.tsx.snap | 134 +- .../PoolDetailsLink.test.tsx.snap | 150 +- .../PoolDetailsStats.test.tsx.snap | 146 +- .../PoolDetailsStatsButtons.test.tsx.snap | 38 +- .../PoolDetailsTransactionTable.test.tsx.snap | 7484 +++++----- .../components/Pools/PoolDetails/shared.ts | 4 +- .../components/Pools/PoolTable/PoolTable.tsx | 31 +- .../__snapshots__/PoolTable.test.tsx.snap | 11445 ++++++++-------- apps/web/src/components/Popover.tsx | 8 +- .../components/Popups/MismatchToastItem.tsx | 2 +- apps/web/src/components/Popups/PopupItem.tsx | 20 + .../components/Popups/ToastRegularSimple.tsx | 2 +- apps/web/src/components/Popups/constants.ts | 4 + apps/web/src/components/Popups/types.ts | 10 + apps/web/src/components/PrivacyPolicy.tsx | 10 +- .../ReceiveCryptoModal/AccountOption.tsx | 6 +- .../ChooseMultiPlatformProvider.tsx | 12 +- .../RouterLabel/UniswapXRouterLabel.tsx | 4 +- .../UniswapXRouterLabel.test.tsx.snap | 4 +- apps/web/src/components/RouterLabel/index.tsx | 2 +- .../SearchModal/CurrencyList/index.tsx | 6 +- .../web/src/components/SearchModal/styled.tsx | 8 +- .../__snapshots__/index.test.tsx.snap | 78 +- apps/web/src/components/StatusIcon/index.tsx | 14 +- apps/web/src/components/SwapBottomCard.tsx | 3 +- apps/web/src/components/Table/ErrorBox.tsx | 12 +- apps/web/src/components/Table/Filter.tsx | 10 +- apps/web/src/components/Table/TableBody.tsx | 93 + apps/web/src/components/Table/TableRow.tsx | 106 + .../Table/__snapshots__/styled.test.tsx.snap | 69 +- apps/web/src/components/Table/constants.ts | 2 + apps/web/src/components/Table/icons.tsx | 33 - apps/web/src/components/Table/styled.tsx | 38 +- apps/web/src/components/Table/types.ts | 13 + apps/web/src/components/Table/utils.ts | 39 +- apps/web/src/components/Table/utils/hasRow.ts | 8 + .../web/src/components/Toggle/MultiToggle.tsx | 6 +- .../components/Tokens/TokenDetails/About.tsx | 6 +- .../ChartSection/AdvancedPriceChartToggle.tsx | 16 +- .../ChartSection/ChartTypeSelector.tsx | 91 - .../ChartSection/ChartTypeToggle.tsx | 60 + .../Tokens/TokenDetails/ChartSection/hooks.ts | 65 +- .../TokenDetails/ChartSection/index.tsx | 88 +- .../Tokens/TokenDetails/MoreButton.tsx | 48 + .../Tokens/TokenDetails/ShareButton.tsx | 29 +- .../Tokens/TokenDetails/Skeleton.tsx | 2 +- .../Tokens/TokenDetails/StatsSection.tsx | 29 +- .../Tokens/TokenDetails/TokenDescription.tsx | 125 +- .../TokenDetails/TokenDetails.e2e.test.ts | 103 +- .../TokenDetails/TokenDetailsHeader.tsx | 237 +- .../TokenDetails/TokenDetailsSwap.e2e.test.ts | 148 +- .../__snapshots__/Skeleton.test.tsx.snap | 56 +- .../TokenDescription.test.tsx.snap | 372 +- .../components/Tokens/TokenDetails/index.tsx | 92 +- .../components/Tokens/TokenDetails/shared.ts | 20 +- .../tables/TokenDetailsPoolsTable.tsx | 4 +- .../TokenDetails/tables/TransactionsTable.tsx | 4 +- .../TokenDetailsPoolsTable.test.tsx.snap | 10251 +++++++------- .../TokenTable/VolumeTimeFrameSelector.tsx | 7 +- .../components/Tokens/TokenTable/index.tsx | 41 +- apps/web/src/components/Tooltip.tsx | 4 +- .../UniswapWrapped2025Banner.tsx | 32 + .../src/components/TopLevelModals/index.tsx | 20 + .../TopLevelModals/modalRegistry.test.tsx | 6 +- .../TopLevelModals/modalRegistry.tsx | 48 +- .../src/components/TopLevelModals/types.ts | 2 +- .../Auction/AuctionStats/AuctionStats.tsx | 293 + .../Auction/BidActivities/BidActivities.tsx | 42 + .../Auction/BidActivities/BidActivity.tsx | 59 + .../BidDistributionChart.tsx | 99 +- .../BidDistributionChartFooter.tsx | 55 + .../BidDistributionChartHeader.tsx | 99 +- .../BidDistributionChartPlaceholder.tsx | 50 + .../BidDistributionChartRenderer.tsx | 770 ++ .../BlockUpdateCountdown.tsx | 23 + .../Auction/BidDistributionChart/constants.ts | 92 + .../dev/CustomizePresetForm.tsx | 472 + .../dev/MockDataSelectorModal.tsx | 139 + .../dev/SavedPresetsList.tsx | 166 + .../BidDistributionChart/dev/customPresets.ts | 270 + .../BidDistributionChart/dev/devUtils.ts | 59 + .../dev/useCustomPresetsStore.ts | 131 + .../hooks/useChartDimensions.ts | 27 + .../hooks/useChartLabels.ts | 127 + .../hooks/useChartTooltip.ts | 72 + .../utils/bidConcentration.ts | 102 + .../utils/clearingPrice/label.ts | 61 + .../utils/clearingPrice/position.test.ts | 292 + .../utils/clearingPrice/position.ts | 143 + .../BidDistributionChart/utils/utils.ts | 494 + .../src/components/Toucan/Auction/BidForm.tsx | 71 +- .../Auction/hooks/useAuctionBlockPolling.ts | 55 + .../Toucan/Auction/hooks/useBidTokenInfo.ts | 63 + .../store/AuctionStoreContextProvider.tsx | 8 + .../Auction/store/createAuctionStore.ts | 39 +- .../Toucan/Auction/store/mockData.ts | 87 +- .../store/mocks/distributionData/100_Ticks.ts | 111 + .../store/mocks/distributionData/10_Ticks.ts | 21 + .../store/mocks/distributionData/20_Ticks.ts | 31 + .../store/mocks/distributionData/50_Ticks.ts | 62 + .../bidDistributionMockData.ts | 15 + .../Auction/store/mocks/useMockDataStore.ts | 97 + .../components/Toucan/Auction/store/types.ts | 50 +- .../Auction/utils/computeAuctionProgress.ts | 76 + .../Toucan/Shared/ToucanContainer.tsx | 4 +- .../components/Toucan/TopAuctionsTable.tsx | 118 + apps/web/src/components/V2Unsupported.tsx | 4 +- .../WalletModal/PrivacyPolicyNotice.tsx | 4 +- .../WalletModal/UniswapWalletOptions.tsx | 2 +- .../UniswapWalletOptions.test.tsx.snap | 5 +- apps/web/src/components/WalletOneLinkQR.tsx | 6 +- .../Web3Provider/TestWeb3Provider.tsx | 1 - .../Web3Provider/WebUniswapContext.tsx | 21 +- .../Web3Provider/createWeb3Provider.tsx | 21 +- .../components/Web3Provider/walletConnect.ts | 2 +- apps/web/src/components/Web3Status/index.tsx | 15 +- .../Web3Status/useShowPendingAfterDelay.ts | 43 +- apps/web/src/components/animations/Wiggle.tsx | 75 +- .../delegation/DelegationMismatchModal.tsx | 47 +- apps/web/src/components/deprecated/Column.tsx | 8 +- apps/web/src/components/deprecated/Row.tsx | 10 +- apps/web/src/components/earn/styled.tsx | 12 +- .../emptyWallet/EmptyWalletCards.tsx | 46 +- .../src/components/swap/DetailLineItem.tsx | 6 +- .../components/swap/GasBreakdownTooltip.tsx | 6 +- .../components/swap/GasEstimateTooltip.tsx | 4 +- apps/web/src/components/swap/SwapDetails.tsx | 10 +- .../components/swap/SwapModalHeaderAmount.tsx | 4 +- apps/web/src/components/swap/SwapPreview.tsx | 4 +- apps/web/src/components/swap/SwapSkeleton.tsx | 24 +- apps/web/src/components/swap/TradePrice.tsx | 4 +- .../__snapshots__/SwapDetails.test.tsx.snap | 32 +- .../__snapshots__/SwapLineItem.test.tsx.snap | 322 +- .../__snapshots__/SwapPreview.test.tsx.snap | 245 +- .../__snapshots__/SwapSkeleton.test.tsx.snap | 32 +- apps/web/src/components/swap/styled.tsx | 18 +- apps/web/src/constants/icons/mxnIcon.tsx | 1 + .../src/featureFlags/flags/outageBanner.ts | 49 - .../WebNotificationToastWrapper.tsx | 3 + apps/web/src/hooks/useBlockCountdown.test.ts | 76 + apps/web/src/hooks/useBlockCountdown.ts | 55 + apps/web/src/hooks/useBlockTimestamp.ts | 2 +- apps/web/src/hooks/useChainOutageConfig.ts | 20 + apps/web/src/hooks/useColor.ts | 13 +- apps/web/src/hooks/useContract.ts | 6 +- apps/web/src/hooks/useERC20Permit.ts | 12 +- .../hooks/useHandleUniswapXActivityUpdate.tsx | 7 +- apps/web/src/hooks/useIsPage.ts | 4 + apps/web/src/hooks/useLpIncentivesClaim.ts | 26 - .../web/src/hooks/useLpIncentivesClaimData.ts | 99 +- apps/web/src/hooks/useOnClickOutside.ts | 6 +- apps/web/src/hooks/usePoolTickData.ts | 2 +- apps/web/src/hooks/usePrevious.ts | 2 +- apps/web/src/hooks/useScroll.ts | 59 +- apps/web/src/hooks/useSelectChain.ts | 90 +- apps/web/src/hooks/useUnmountingAnimation.ts | 4 +- .../src/hooks/useUpdateManualOutage.test.tsx | 271 + apps/web/src/hooks/useUpdateManualOutage.ts | 73 + .../src/hooks/useV2LiquidityTokenPermit.ts | 4 +- apps/web/src/lib/styled-components.ts | 31 +- apps/web/src/lib/utils/analytics.ts | 6 + .../WebNotificationService.tsx | 218 + .../createLocalStorageAdapter.ts | 91 + ...eateLegacyBannersNotificationDataSource.ts | 368 + .../ModalNotification.tsx | 104 + .../NotificationContainer.tsx | 127 + .../StackedLowerLeftBanners.tsx | 89 + .../createWebNotificationRenderer.ts | 43 + .../notificationStore.ts | 36 + .../stackingUtils.test.ts | 94 + .../notification-renderer/stackingUtils.ts | 27 + .../telemetry/getNotificationTelemetry.ts | 36 + apps/web/src/pages/App.smoketest.e2e.test.ts | 22 +- apps/web/src/pages/App/AppBody.tsx | 4 +- apps/web/src/pages/App/Header.tsx | 12 +- apps/web/src/pages/App/Layout.tsx | 6 +- .../pages/App/utils/UserPropertyUpdater.tsx | 25 + .../CreateLiquidityContextProvider.tsx | 24 +- .../pages/CreatePosition/CreatePosition.tsx | 2 +- .../CreatePositionModal.test.tsx | 336 + .../CreatePositionTxContext.test.ts | 23 +- apps/web/src/pages/Errors.e2e.test.ts | 44 +- .../web/src/pages/Explore/Explore.e2e.test.ts | 30 +- .../src/pages/Explore/ExploreStatsSection.tsx | 9 +- .../pages/Explore/TokenExplore.e2e.test.ts | 122 +- .../Explore/TokenExploreFilter.e2e.test.ts | 54 +- apps/web/src/pages/Explore/Toucan.tsx | 18 - .../src/pages/Explore/ToucanToken/index.tsx | 13 + apps/web/src/pages/Explore/constants.ts | 2 +- apps/web/src/pages/Explore/index.tsx | 28 +- apps/web/src/pages/Explore/redirects.tsx | 14 +- .../Explore/tables/RecentTransactions.tsx | 26 +- .../IncreaseLiquidity.anvil.e2e.test.ts | 128 +- .../IncreaseLiquidityReview.tsx | 94 +- .../IncreaseLiquidityTxContext.tsx | 39 +- .../pages/Landing/assets/approvedTokens.ts | 37 +- .../src/pages/Landing/components/StatCard.tsx | 33 +- .../Landing/components/TokenCloud/Ticker.tsx | 2 +- .../pages/Landing/components/animations.tsx | 6 +- .../components/cards/DownloadWalletCard.tsx | 23 +- .../components/cards/TradingApiCard.tsx | 4 +- .../components/cards/ValuePropCard.tsx | 6 +- .../Landing/components/cards/WebappCard.tsx | 14 +- apps/web/src/pages/Landing/sections/Stats.tsx | 11 +- .../src/pages/Landing/sections/useInView.tsx | 2 +- .../Migrate/MigrateLiquidityTxContext.tsx | 39 + .../pages/Migrate/MigrateV3.anvil.e2e.test.ts | 91 + .../src/pages/Migrate/MigrateV3.e2e.test.ts | 39 + .../hooks/useInitialPosition.ts | 0 .../hooks/useMigrateLPPositionTxInfo.ts | 453 + .../pages/{MigrateV3 => Migrate}/index.tsx | 141 +- .../web/src/pages/MigrateV2/MigrateV2Pair.tsx | 1 + .../pages/MigrateV2/Settings/Input/index.tsx | 6 +- .../Settings/MaxSlippageSettings/index.tsx | 6 +- .../Settings/MultipleRoutingOptions.tsx | 4 +- .../RouterPreferenceSettings/index.tsx | 4 +- .../MigrateV3/MigrateV3.anvil.e2e.test.ts | 81 - .../src/pages/MigrateV3/MigrateV3.e2e.test.ts | 29 - .../MigrateV3/MigrateV3LiquidityTxContext.tsx | 307 - apps/web/src/pages/NavBar.e2e.test.ts | 286 +- apps/web/src/pages/NotFound/index.tsx | 10 +- .../pages/PoolDetails/PoolDetails.e2e.test.ts | 40 +- apps/web/src/pages/PoolDetails/index.test.tsx | 5 +- apps/web/src/pages/PoolDetails/index.tsx | 44 +- .../Portfolio/Activity/ActivityFilters.tsx | 82 + .../ActivityTable/ActivityAddressCell.tsx | 82 + .../ActivityAddressLookupStore.tsx | 125 + .../ActivityAmountCell/ActivityAmountCell.tsx | 348 + .../ActivityAmountCell/ApproveAmountCell.tsx | 68 + .../ActivityAmountCell/CompactLayout.tsx | 25 + .../ActivityAmountCell/DualTokenLayout.tsx | 87 + .../ActivityAmountCell/EmptyCell.tsx | 9 + .../ActivityAmountCell/utils.tsx | 104 + .../Activity/ActivityTable/ActivityTable.tsx | 186 + .../ActivityTable/AddressWithAvatar.tsx | 46 + .../ActivityTable/NftAmountDisplay.tsx | 57 + .../Activity/ActivityTable/TimeCell.tsx | 59 + .../ActivityTable/TokenAmountDisplay.tsx | 34 + .../ActivityTable/TransactionTypeCell.tsx | 52 + .../ActivityTable/activityTableModels.ts | 81 + .../Activity/ActivityTable/registry.ts | 366 + .../Activity/PaginationSkeletonRow.tsx | 31 + .../ConnectWalletFixedBottomButton.tsx | 132 + apps/web/src/pages/Portfolio/Defi.tsx | 2 +- .../src/pages/Portfolio/EmptyTableCell.tsx | 9 + apps/web/src/pages/Portfolio/Header/Tabs.tsx | 77 +- .../Header/hooks/usePortfolioParams.ts | 31 - .../Header/hooks/usePortfolioRoutes.ts | 35 + .../Header/hooks/usePortfolioTabs.ts | 6 +- .../Header/useShouldHeaderBeCompact.tsx | 26 + .../pages/Portfolio/NFTs/NFTCardSkeleton.tsx | 22 + .../Portfolio/NFTs/generateRotationStyle.ts | 30 + apps/web/src/pages/Portfolio/Overview.tsx | 89 - .../pages/Portfolio/Overview/ActionTiles.tsx | 61 + .../Portfolio/Overview/MiniActivityTable.tsx | 211 + .../MiniPoolsTable/MiniPoolsTable.tsx | 214 + .../MiniPoolsTable/columns/Balance.tsx | 33 + .../Overview/MiniPoolsTable/columns/Fees.tsx | 45 + .../Overview/MiniPoolsTable/columns/Info.tsx | 63 + .../MiniPoolsTable/columns/Status.tsx | 59 + .../Portfolio/Overview/MiniTokensTable.tsx | 104 + .../Portfolio/Overview/OpenLimitsTable.tsx | 249 + .../src/pages/Portfolio/Overview/Overview.tsx | 150 + .../Portfolio/Overview/OverviewTables.tsx | 53 + .../Portfolio/Overview/PortfolioChart.tsx | 218 + .../pages/Portfolio/Overview/StatsTiles.tsx | 66 + .../Portfolio/Overview/TableSectionHeader.tsx | 29 + .../Portfolio/Overview/ViewAllButton.tsx | 44 + .../src/pages/Portfolio/Overview/constants.ts | 6 + .../Overview/hooks/useIsPortfolioZero.ts | 24 + .../hooks/useSwapUSDValuesFromGraphQL.ts | 77 + .../Overview/hooks/useSwapsThisWeek.ts | 50 + .../utils/checkBalanceDiffWithinRange.ts | 30 + .../pages/Portfolio/PortfolioPageInner.tsx | 51 + .../Tokens/Table/TokensAllocationChart.tsx | 8 +- .../Tokens/Table/columns/Allocation.tsx | 11 +- .../Table/columns/ContextMenuButton.tsx | 35 +- .../Portfolio/Tokens/Table/columns/Price.tsx | 21 + .../Tokens/Table/columns/RelativeChange1D.tsx | 16 +- .../Tokens/Table/columns/TokenDisplay.tsx | 8 +- .../Portfolio/Tokens/Table/columns/Value.tsx | 24 +- .../Tokens/Table/columns/useTokenColumns.tsx | 188 + .../Tokens/hooks/useNavigateToTokenDetails.ts | 22 + .../AnimatedStyledBanner/AnimatedEmblems.tsx | 126 + .../AnimatedStyledBanner.tsx | 33 + .../AnimatedStyledBanner/Emblems/EmblemA.tsx | 29 + .../AnimatedStyledBanner/Emblems/EmblemB.tsx | 20 + .../AnimatedStyledBanner/Emblems/EmblemC.tsx | 103 + .../AnimatedStyledBanner/Emblems/EmblemD.tsx | 29 + .../AnimatedStyledBanner/Emblems/EmblemE.tsx | 20 + .../AnimatedStyledBanner/Emblems/EmblemF.tsx | 24 + .../AnimatedStyledBanner/Emblems/EmblemG.tsx | 20 + .../AnimatedStyledBanner/Emblems/EmblemH.tsx | 20 + .../AnimatedStyledBanner/Emblems/index.ts | 8 + .../AnimatedStyledBanner/Emblems/types.ts | 6 + .../components/PortfolioExpandoRow.tsx | 26 + .../Portfolio/components/SearchInput.tsx | 47 +- .../ValueWithFadedDecimals.tsx | 23 +- apps/web/src/pages/Portfolio/constants.ts | 7 + .../Portfolio/hooks/usePortfolioAddresses.ts | 24 + .../pages/Portfolio/utils/portfolioUrls.ts | 31 + .../Positions/ClaimFees.anvil.e2e.test.ts | 130 +- apps/web/src/pages/Positions/PositionPage.tsx | 32 + .../web/src/pages/Redirects.anvil.e2e.test.ts | 30 +- apps/web/src/pages/Redirects.e2e.test.ts | 114 +- .../RemoveLiquidity.anvil.e2e.test.ts | 43 +- .../RemoveLiquidity/RemoveLiquidityReview.tsx | 2 +- .../RemoveLiquidityTxContext.tsx | 2 +- apps/web/src/pages/RouteDefinitions.tsx | 25 +- apps/web/src/pages/Swap/Buy/BuyForm.tsx | 14 +- .../src/pages/Swap/Buy/CountryListModal.tsx | 2 +- .../Swap/Buy/OffRampConfirmTransferModal.tsx | 11 +- .../pages/Swap/Buy/ProviderConnectedView.tsx | 12 +- .../CountryListModal.test.tsx.snap | 196 +- .../ProviderConnectedView.test.tsx.snap | 11 +- .../ProviderConnectionError.test.tsx.snap | 6 +- apps/web/src/pages/Swap/Buy/shared.test.tsx | 7 +- apps/web/src/pages/Swap/Buy/shared.tsx | 11 +- .../pages/Swap/Limit/LimitExpirySection.tsx | 6 +- apps/web/src/pages/Swap/Limit/LimitForm.tsx | 22 +- .../src/pages/Swap/Limit/LimitPriceError.tsx | 16 +- .../LimitPriceError.test.tsx.snap | 250 +- .../pages/Swap/Send/NewAddressSpeedBump.tsx | 46 +- .../Swap/Send/SendCurrencyInputForm.test.tsx | 8 +- .../pages/Swap/Send/SendCurrencyInputForm.tsx | 6 +- apps/web/src/pages/Swap/Send/SendForm.tsx | 2 +- .../src/pages/Swap/Send/SendRecipientForm.tsx | 22 +- .../src/pages/Swap/Send/SendReviewModal.tsx | 2 +- .../Swap/Send/SmartContractSpeedBump.tsx | 30 +- .../NewAddressSpeedBump.test.tsx.snap | 283 +- .../SendCurrencyInputForm.test.tsx.snap | 1013 +- .../SendRecipientForm.test.tsx.snap | 160 +- .../SendReviewModal.test.tsx.snap | 26 +- .../SmartContractSpeedbump.test.tsx.snap | 267 +- apps/web/src/pages/Swap/Swap.e2e.test.ts | 46 +- .../src/pages/Swap/SwapSettings.e2e.test.ts | 46 +- .../src/pages/Swap/TokenSelector.e2e.test.ts | 112 +- .../src/pages/Swap/UniswapX.anvil.e2e.test.ts | 120 +- .../web/src/pages/Swap/Wrap.anvil.e2e.test.ts | 100 +- apps/web/src/pages/Swap/common/shared.tsx | 10 +- apps/web/src/pages/Swap/index.tsx | 10 +- .../TokenDetails/TokenDetails.e2e.test.ts | 113 +- .../src/pages/Wrapped/DisconnectedState.tsx | 144 + apps/web/src/pages/Wrapped/index.tsx | 130 + .../pages/__snapshots__/routes.test.ts.snap | 10 +- apps/web/src/pages/getPortfolioTitle.ts | 27 + apps/web/src/pages/paths.ts | 3 +- apps/web/src/playwright/fixtures/account.ts | 13 + apps/web/src/playwright/fixtures/urls.test.ts | 232 + apps/web/src/playwright/fixtures/urls.ts | 61 + .../mocks/dataApiService/get_portfolio.json | 99 + .../mocks/fiatOnRamp/get-country.json | 5 + .../playwright/mocks/fiatOnRamp/quotes.json | 69 + .../mocks/fiatOnRamp/supported-countries.json | 952 ++ .../fiatOnRamp/supported-fiat-currencies.json | 634 + .../mocks/fiatOnRamp/supported-tokens.json | 182 + .../mocks/graphql/Token/uni_token.json | 83 +- .../mocks/graphql/Token/uni_token_price.json | 3621 +++++ .../mocks/graphql/TokenWeb/uni_token.json | 99 +- apps/web/src/playwright/mocks/mocks.ts | 17 +- .../src/playwright/mocks/tradingApi/swap.json | 41 + apps/web/src/setupTests.ts | 33 +- apps/web/src/state/activity/updater.tsx | 4 + .../src/state/explore/protocolStats.test.tsx | 164 + apps/web/src/state/explore/protocolStats.ts | 176 +- apps/web/src/state/explore/topAuctions.ts | 295 + apps/web/src/state/migrations.ts | 8 +- apps/web/src/state/migrations/16.ts | 6 +- apps/web/src/state/migrations/19.test.ts | 4 +- apps/web/src/state/migrations/21.ts | 4 +- apps/web/src/state/migrations/22.test.ts | 2 + apps/web/src/state/migrations/25.ts | 2 +- apps/web/src/state/migrations/57.ts | 2 +- apps/web/src/state/migrations/58.test.ts | 176 + apps/web/src/state/migrations/58.ts | 73 + apps/web/src/state/migrations/59.test.ts | 21 + apps/web/src/state/migrations/59.ts | 20 + apps/web/src/state/migrations/60.test.ts | 26 + apps/web/src/state/migrations/60.ts | 19 + apps/web/src/state/migrations/oldTypes.ts | 4 +- apps/web/src/state/mint/v3/hooks.tsx | 1 + apps/web/src/state/outage/atoms.ts | 9 + apps/web/src/state/outage/types.ts | 7 + apps/web/src/state/reducerTypeTest.ts | 11 +- apps/web/src/state/routing/types.ts | 1 + apps/web/src/state/routing/utils.ts | 1 + .../sagas/lp_incentives/lpIncentivesSaga.ts | 15 +- .../src/state/sagas/lp_incentives/types.ts | 6 +- apps/web/src/state/sagas/transactions/5792.ts | 15 +- .../transactions/useSwapHandlers.test.ts | 470 + .../sagas/transactions/useSwapHandlers.ts | 115 + .../src/state/sagas/transactions/wrapSaga.ts | 2 +- apps/web/src/state/swap/hooks.tsx | 45 +- apps/web/src/state/swap/types.ts | 54 +- apps/web/src/state/swap/useSwapContext.tsx | 6 +- .../web/src/state/transactions/hooks.test.tsx | 114 + apps/web/src/state/transactions/hooks.tsx | 18 +- apps/web/src/state/user/types.ts | 2 +- .../hooks/useMismatchAccount.ts | 2 +- .../src/state/walletCapabilities/reducer.ts | 2 +- apps/web/src/test-utils/mockTamagui.ts | 205 + apps/web/src/theme/components/Dividers.tsx | 4 +- .../web/src/theme/components/FadePresence.tsx | 4 +- apps/web/src/theme/components/Links.tsx | 6 +- apps/web/src/theme/components/text.tsx | 6 +- apps/web/src/theme/zIndex.ts | 1 + apps/web/src/tracing/amplitude.ts | 7 + apps/web/src/tracing/swapFlowLoggers.test.ts | 2 + apps/web/src/tracing/swapFlowLoggers.ts | 12 + apps/web/src/utils/errors/isOutageError.ts | 81 + .../src/utils/filterDefinedWalletAddresses.ts | 22 + apps/web/src/utils/isIFramed.ts | 12 +- .../utils/showSwitchNetworkNotification.ts | 9 +- apps/web/tsconfig.json | 13 +- apps/web/vite.config.mts | 70 +- apps/web/vite/entry-gateway-proxy.ts | 150 + apps/web/vite/mockAssets.tsx | 2 +- apps/web/vite/vite.plugins.ts | 7 +- apps/web/vitest.config.ts | 1 + bunfig.toml | 1 + config/jest-presets/jest/setup.js | 11 + config/vitest-presets/package.json | 2 +- dangerfile.ts | 2 +- eslint-local-rules.js | 1 + index.d.ts | 10 + packages/api/project.json | 14 +- packages/api/scripts/fixGraphQLApiTypes.mts | 91 + .../api/scripts/modifyTradingApiTypes.mts | 182 +- .../api/src/clients/base/createFetchClient.ts | 28 +- packages/api/src/clients/base/types.ts | 7 +- packages/api/src/clients/base/urls.ts | 5 + .../blockaid/createBlockaidApiClient.ts | 185 + packages/api/src/clients/blockaid/types.ts | 495 + .../data/createDataServiceApiClient.ts | 14 +- .../api/src/clients/graphql/codegen.config.ts | 38 +- packages/api/src/clients/graphql/fragments.ts | 6 +- packages/api/src/clients/graphql/generated.ts | 5 + packages/api/src/clients/graphql/queries.ts | 1 - .../api/src/clients/graphql/web/pool.graphql | 1 + .../api/src/clients/graphql/web/token.graphql | 2 + .../liquidity/createLiquidityServiceClient.ts | 71 + packages/api/src/clients/trading/api.json | 2 +- .../clients/trading/createTradingApiClient.ts | 137 +- .../unitags/createUnitagsApiClient.test.ts | 1 + packages/api/src/components/ApiInit.test.tsx | 359 + packages/api/src/components/ApiInit.tsx | 53 + packages/api/src/connectRpc/utils.ts | 2 +- packages/api/src/getEntryGatewayUrl.ts | 40 + .../api/src/getIsSessionServiceEnabled.ts | 7 - packages/api/src/getSessionService.native.ts | 58 - packages/api/src/getSessionService.ts | 6 - packages/api/src/getSessionService.web.ts | 68 - packages/api/src/provideDeviceIdService.ts | 25 + .../api/src/provideSessionService.native.ts | 46 + packages/api/src/provideSessionService.ts | 11 + packages/api/src/provideSessionService.web.ts | 76 + packages/api/src/provideSessionStorage.ts | 21 + .../src/provideUniswapIdentifierService.ts | 25 + .../storage/createExtensionStorageDriver.ts | 29 + .../src/storage/createNativeStorageDriver.ts | 19 + .../api/src/storage/createWebStorageDriver.ts | 17 + .../src/storage/getStorageDriver.native.ts | 6 + packages/api/src/storage/getStorageDriver.ts | 8 + .../api/src/storage/getStorageDriver.web.ts | 11 + packages/api/src/storage/types.ts | 9 + packages/api/src/transport.ts | 85 + packages/api/tsconfig.json | 10 +- packages/api/vitest.config.ts | 6 +- packages/biome-config/base.jsonc | 20 +- packages/biome-config/package.json | 6 +- packages/biome-config/project.json | 26 + packages/biome-config/src/extractor.test.js | 138 + .../src/fixtures/array-merge-config.jsonc | 52 + .../src/fixtures/no-markers-config.jsonc | 37 + .../src/fixtures/off-override-config.jsonc | 41 + .../src/fixtures/simple-config.jsonc | 45 + packages/biome-config/src/merger.js | 44 +- packages/biome-config/src/merger.test.js | 178 + packages/biome-config/src/processor.js | 47 +- packages/biome-config/src/processor.test.js | 336 + packages/biome-config/src/universePackages.js | 146 + packages/config/package.json | 4 +- packages/config/src/config-types.ts | 8 + packages/config/src/getConfig.native.ts | 32 +- packages/config/src/getConfig.web.ts | 23 +- packages/config/src/global.d.ts | 7 + packages/eslint-config/base.js | 8 + packages/eslint-config/native.js | 3 +- packages/eslint-config/package.json | 6 +- .../no-transform-percentage-strings.js | 192 + .../no-transform-percentage-strings.test.js | 228 + packages/eslint-config/restrictedImports.js | 6 +- packages/gating/src/configs.ts | 17 - packages/gating/src/flags.ts | 88 +- .../gating/src/getIsSessionServiceEnabled.ts | 14 + .../src/getIsSessionUpgradeAutoEnabled.ts | 9 + .../src/getIsNotificationServiceEnabled.ts | 7 + packages/notifications/src/global.d.ts | 2 + packages/notifications/src/index.ts | 29 + .../NotificationDataSource.ts | 8 + .../getNotificationQueryOptions.ts | 74 + .../createNotificationDataSource.ts | 19 + ...reatePollingNotificationDataSource.test.ts | 356 + .../createPollingNotificationDataSource.ts | 74 + .../NotificationProcessor.ts | 26 + .../createBaseNotificationProcessor.test.ts | 854 ++ .../createBaseNotificationProcessor.ts | 297 + .../createNotificationProcessor.test.ts | 130 + .../createNotificationProcessor.ts | 15 + .../NotificationRenderer.ts | 8 + .../components/BannerTemplate.tsx | 134 + .../components/InlineBannerNotification.tsx | 62 + .../createNotificationRenderer.ts | 16 + .../NotificationService.ts | 47 + .../createNotificationService.test.ts | 1092 ++ .../createNotificationService.ts | 364 + .../NotificationTelemetry.ts | 44 + .../createNotificationTelemetry.test.ts | 99 + .../createNotificationTelemetry.ts | 33 + .../NotificationTracker.ts | 14 + .../createApiNotificationTracker.test.ts | 399 + .../createApiNotificationTracker.ts | 146 + .../createNoopNotificationTracker.ts | 44 + .../createNotificationTracker.ts | 31 + .../src/utils/formatNotificationType.test.ts | 25 + .../src/utils/formatNotificationType.ts | 23 + packages/notifications/vitest-setup.ts | 7 + packages/notifications/vitest.config.ts | 14 + packages/sessions/package.json | 19 +- .../createChallengeSolverService.ts | 47 + .../createHashcashMockSolver.ts | 39 + .../createHashcashSolver.test.ts | 145 + .../challenge-solvers/createHashcashSolver.ts | 91 + .../challenge-solvers/createNoneMockSolver.ts | 11 + .../createTurnstileMockSolver.ts | 30 + .../createTurnstileSolver.ts | 177 + .../challenge-solvers/hashcash/core.test.ts | 262 + .../src/challenge-solvers/hashcash/core.ts | 124 + .../turnstileSolver.integration.test.ts | 329 + .../sessions/src/challenge-solvers/types.ts | 17 + .../src/challengeFlow.integration.test.ts | 393 + .../src/device-id/createDeviceIdService.ts | 17 +- packages/sessions/src/device-id/types.ts | 10 +- packages/sessions/src/index.ts | 41 +- ...createSessionInitializationService.test.ts | 354 + .../createSessionInitializationService.ts | 195 + .../session-initialization/sessionErrors.ts | 32 + .../session-repository/createSessionClient.ts | 2 +- .../createSessionRepository.test.ts | 40 +- .../createSessionRepository.ts | 95 +- .../src/session-repository/transport.ts | 38 - .../sessions/src/session-repository/types.ts | 13 +- .../createNoopSessionService.ts | 11 +- .../createSessionService.test.ts | 111 + .../session-service/createSessionService.ts | 35 +- .../sessions/src/session-service/types.ts | 42 +- .../session-storage/createSessionStorage.ts | 3 + .../sessions/src/session-storage/types.ts | 4 + .../sessions/src/session.integration.test.ts | 246 + .../src/sessionLifecycle.integration.test.ts | 263 + packages/sessions/src/test-utils.ts | 210 + .../test-utils/createLocalCookieTransport.ts | 52 + packages/sessions/src/test-utils/mocks.ts | 120 + .../createUniswapIdentifierService.ts | 19 + .../sessions/src/uniswap-identifier/types.ts | 11 + packages/sessions/vitest.config.ts | 2 + packages/ui/package.json | 48 +- .../components/AnimatePresencePager.tsx | 6 +- .../animations/components/HeightAnimator.tsx | 21 +- .../animations/components/WidthAnimator.tsx | 19 +- .../hooks/useShakeAnimation.test.tsx | 6 +- .../assets/backgrounds/dots-banner-dark.png | Bin 0 -> 6978 bytes .../assets/backgrounds/dots-banner-light.png | Bin 0 -> 7118 bytes .../backgrounds/monad-test-banner-light.png | Bin 0 -> 29178 bytes .../bridged-assets-v2-card-banner-dark.png | Bin 0 -> 81953 bytes .../bridged-assets-v2-card-banner-light.png | Bin 0 -> 76561 bytes .../ui/src/assets/graphics/zero-percent.png | Bin 0 -> 6446 bytes packages/ui/src/assets/icons/approve-alt.svg | 3 + .../src/assets/icons/avatar-placeholder.svg | 3 + .../ui/src/assets/icons/block-explorer.svg | 2 +- packages/ui/src/assets/icons/box.svg | 3 + .../ui/src/assets/icons/chart-bar-crossed.svg | 4 + packages/ui/src/assets/icons/credit-card.svg | 6 + .../ui/src/assets/icons/crosschain-icon.svg | 4 + packages/ui/src/assets/icons/eth-mini.svg | 4 + packages/ui/src/assets/icons/gift.svg | 3 + packages/ui/src/assets/icons/money-hand.svg | 3 + packages/ui/src/assets/icons/receipt.svg | 3 + packages/ui/src/assets/icons/send-alt.svg | 3 + .../assets/icons/shield-magnifying-glass.svg | 3 + packages/ui/src/assets/icons/snowflake.svg | 3 + .../assets/logos/png/monad-logo-filled.png | Bin 0 -> 2017 bytes .../ui/src/assets/logos/png/monad-logo.png | Bin 1881 -> 0 bytes .../assets/logos/svg/solscan-logo-dark.svg | 6 +- .../assets/logos/svg/solscan-logo-light.svg | 6 +- .../OverKeyboardContent.native.tsx | 9 +- .../RefreshButton/RefreshButton.native.tsx | 26 + .../RefreshButton/RefreshButton.tsx | 11 + .../RefreshButton/RefreshButton.web.tsx | 79 + .../RefreshButton/RefreshButtonIcon.tsx | 73 + .../SegmentedControl/SegmentedControl.tsx | 14 +- .../src/components/buttons/Button/Button.tsx | 3 +- .../DropdownMenuSheetItem.tsx | 16 +- .../src/components/factories/createIcon.tsx | 17 +- .../ui/src/components/icons/ApproveAlt.tsx | 17 + .../components/icons/AvatarPlaceholder.tsx | 14 + .../ui/src/components/icons/BlockExplorer.tsx | 1 - packages/ui/src/components/icons/Box.tsx | 17 + .../src/components/icons/ChartBarCrossed.tsx | 17 + .../ui/src/components/icons/CreditCard.tsx | 16 + .../src/components/icons/CrosschainIcon.tsx | 18 + packages/ui/src/components/icons/EthMini.tsx | 21 + packages/ui/src/components/icons/Gift.tsx | 16 + .../ui/src/components/icons/MoneyHand.tsx | 17 + packages/ui/src/components/icons/Receipt.tsx | 17 + packages/ui/src/components/icons/SendAlt.tsx | 17 + .../icons/ShieldMagnifyingGlass.tsx | 16 + .../ui/src/components/icons/Snowflake.tsx | 18 + packages/ui/src/components/icons/exported.ts | 13 + .../lines/VerticalDottedLineSeparator.tsx | 33 + .../src/components/logos/SolscanLogoDark.tsx | 5 +- .../src/components/logos/SolscanLogoLight.tsx | 3 +- .../src/components/modal/AdaptiveWebModal.tsx | 23 +- .../popover/AdaptiveWebPopoverContent.tsx | 5 +- .../ClickableWithinGesture.web.tsx | 12 +- .../ui/src/components/switch/Switch.web.tsx | 6 +- packages/ui/src/components/text/Text.tsx | 14 +- .../ui/src/components/tooltip/Tooltip.web.tsx | 43 +- .../touchable/TouchableArea/TouchableArea.tsx | 37 +- .../TouchableArea/TouchableAreaFrame.tsx | 4 - .../TouchableTextLink/TouchableTextLink.tsx | 2 +- .../src/hooks/usePreventOverflowBelowFold.tsx | 2 +- packages/ui/src/index.ts | 2 + packages/ui/src/theme/color/colors.ts | 4 +- packages/ui/src/theme/fonts.ts | 24 + packages/ui/src/theme/zIndexes.ts | 2 +- packages/ui/src/utils/colors/index.ts | 2 +- .../ui/src/utils/colors/specialCaseTokens.ts | 4 + packages/ui/vitest.config.ts | 10 +- packages/uniswap/.gitignore | 1 + packages/uniswap/babel.config.js | 9 +- packages/uniswap/jest-setup.js | 7 + packages/uniswap/jest.config.js | 6 - packages/uniswap/project.json | 9 +- .../AnimatedNumber/AnimatedNumber.tsx | 2 +- .../src/components/BaseCard/BaseCard.tsx | 10 +- .../__snapshots__/BaseCard.test.tsx.snap | 147 +- .../BridgedAsset/BridgedAssetModal.tsx | 2 +- .../ConfirmSwapModal/ProgressIndicator.tsx | 156 +- .../ConfirmSwapModal/steps/Approve.tsx | 33 +- .../components/ConfirmSwapModal/steps/LP.tsx | 12 +- .../ConfirmSwapModal/steps/Permit.tsx | 31 +- .../steps/StepRowSkeleton.tsx | 177 +- .../ConfirmSwapModal/steps/Swap.tsx | 74 +- .../steps/SwapTXPlanStepRow.tsx | 171 + .../ConfirmSwapModal/steps/Wrap.tsx | 9 +- .../useSecondsUntilDeadline.tsx | 48 + .../CurrencyInputPanel/CurrencyInputPanel.tsx | 6 + .../CurrencyInputPanelBalance.tsx | 6 +- .../CurrencyInputPanelInput.tsx | 50 +- .../TokenOptionItem/TokenOptionItem.web.tsx | 3 +- .../CurrencyInputPanel/TokenRate.tsx | 2 +- .../hooks/useInputFocusSync/types.ts | 2 +- .../components/CurrencyInputPanel/types.tsx | 4 +- .../components/CurrencyLogo/NetworkLogo.tsx | 19 +- .../LogoWithTxStatus.test.tsx.snap | 27 +- .../__snapshots__/ExpandoRow.test.tsx.snap | 168 +- .../ReceiveQRCode/ReceiveQRCode.tsx | 9 +- .../RelativeChange/RelativeChange.tsx | 4 +- .../RoutingDiagram/RoutingDiagram.tsx | 10 +- .../TokenSelector/TokenSelector.tsx | 24 +- .../TokenSelector/TokenSelectorList.tsx | 14 +- .../UnsupportedChainedActionsBanner.tsx | 67 + .../components/TokenSelector/hooks.test.ts | 1 - .../hooks/useAllCommonBaseCurrencies.ts | 1 + .../TokenSelector/items/tokens/TokenCard.tsx | 7 +- .../WarningMessage/WarningMessage.tsx | 3 +- .../components/accounts/AddressDisplay.tsx | 8 +- .../activity/ActivityListEmptyState.tsx | 37 + .../details/TransactionDetailsModal.test.tsx | 25 +- .../details/TransactionDetailsModal.tsx | 28 +- .../TransactionDetailsModal.test.tsx.snap | 574 +- .../ApproveTransactionDetails.tsx | 15 +- .../NftTransactionDetails.test.tsx.snap | 128 +- .../SwapTransactionDetails.test.tsx.snap | 152 +- .../TransferTransactionDetails.test.tsx.snap | 74 +- .../activity/generateActivityItemRenderer.ts | 3 + .../useFormattedCurrencyAmountAndUSDValue.ts | 7 +- .../activity/summaries/ApproveSummaryItem.tsx | 28 +- .../activity/summaries/BridgeSummaryItem.tsx | 10 +- .../summaries/LiquiditySummaryItem.tsx | 11 +- .../summaries/NFTApproveSummaryItem.tsx | 10 +- .../activity/summaries/NFTMintSummaryItem.tsx | 10 +- .../activity/summaries/NFTSummaryItem.tsx | 2 + .../summaries/NFTTradeSummaryItem.tsx | 10 +- .../summaries/OffRampTransferSummaryItem.tsx | 2 + .../summaries/OnRampTransferSummaryItem.tsx | 10 +- .../activity/summaries/ReceiveSummaryItem.tsx | 2 + .../activity/summaries/SendSummaryItem.tsx | 2 + .../activity/summaries/SwapSummaryItem.tsx | 10 +- .../summaries/TransactionSummaryLayout.tsx | 31 +- .../summaries/TransferTokenSummaryItem.tsx | 11 +- .../activity/summaries/UnknownSummaryItem.tsx | 11 +- .../activity/summaries/WCSummaryItem.tsx | 2 + .../activity/summaries/WrapSummaryItem.tsx | 11 +- .../uniswap/src/components/activity/types.ts | 4 +- .../uniswap/src/components/activity/utils.ts | 37 + .../UniswapWrapped2025Banner.native.tsx | 85 + .../UniswapWrapped2025Banner.tsx | 6 + .../UniswapWrapped2025Banner.web.tsx | 174 + .../banners/UniswapWrapped2025Banner/types.ts | 5 + .../UniswapWrapped2025Card.native.tsx | 69 + .../UniswapWrapped2025Card.tsx | 6 + .../UniswapWrapped2025Card.web.tsx | 102 + .../banners/UniswapWrapped2025Card/types.ts | 3 + .../shared/SharedSnowflakeComponents.tsx | 199 + .../src/components/banners/shared/utils.ts | 5 + .../__snapshots__/PasteButton.test.tsx.snap | 172 +- .../components/chains}/BlockExplorerIcon.tsx | 2 +- .../src/components/dialog/Dialog.native.tsx | 122 +- .../src/components/dialog/Dialog.test.tsx | 149 +- .../src/components/dialog/Dialog.web.tsx | 177 +- .../src/components/dialog/DialogButtons.tsx | 60 + .../src/components/dialog/DialogContent.tsx | 81 + .../src/components/dialog/DialogProps.tsx | 36 +- .../src/components/dialog/GetHelpButtonUI.tsx | 33 + .../dialog/GetHelpHeader.native.tsx | 22 + .../src/components/dialog/GetHelpHeader.tsx | 76 +- .../components/dialog/GetHelpHeader.web.tsx | 26 + .../dialog/GetHelpHeaderContent.tsx | 54 + .../dialog/hooks/useDialogVisibility.test.ts | 299 + .../dialog/hooks/useDialogVisibility.ts | 131 + .../dropdowns/ActionSheetDropdown.tsx | 164 +- .../ActionSheetDropdown.test.tsx.snap | 72 +- .../__snapshots__/NetworkFee.test.tsx.snap | 231 +- .../src/components/lists/SelectorBaseList.tsx | 2 +- ...NftSearchResultsToNftCollectionOptions.tsx | 18 +- .../lists/items/tokens/TokenOptionItem.tsx | 4 +- .../tokens/TokenOptionItemContextMenu.tsx | 2 +- .../src/components/lists/items/types.ts | 2 +- .../components/logos/PoweredByBlockaid.tsx | 33 + .../components/menus/ContextMenuContent.tsx | 82 +- .../components/menus/ContextMenuV2.native.tsx | 73 +- .../src/components/menus/ContextMenuV2.tsx | 7 + .../components/menus/ContextMenuV2.web.tsx | 33 +- .../ContextMenuV2.web.test.tsx.snap | 356 +- .../menus/hooks/useContextMenuTracking.ts | 51 + .../src/components/modals/InfoLinkModal.tsx | 8 +- .../src/components/modals/Modal.native.tsx | 6 +- .../src/components/modals/Modal.web.tsx | 3 +- .../src/components/modals/ModalProps.tsx | 1 + .../modals/WarningModal/WarningModal.tsx | 100 +- .../components/modals/WarningModal/types.ts | 1 + .../modals/useBottomSheetSafeKeyboard.web.tsx | 4 +- .../__snapshots__/NetworkFilter.test.tsx.snap | 123 +- .../src/components/nfts/NftsList.native.tsx | 15 +- .../components/nfts/NftsListEmptyState.tsx | 37 + .../src/components/nfts/NftsListHeader.tsx | 105 + .../src/components/nfts/ShowNFTModal.tsx | 4 +- .../nfts/hooks/useNftListRenderData.ts | 33 +- .../src/components/nfts/images/NFTViewer.tsx | 10 +- packages/uniswap/src/components/nfts/types.ts | 15 + .../notifications/ModalTemplate.tsx | 327 + .../notifications/MonadAnnouncementModal.tsx | 57 + .../notifications/CopiedNotification.tsx | 19 +- .../portfolio/PortfolioEmptyState.tsx | 6 +- .../TokenBalanceItemContextMenu.native.tsx | 5 + .../portfolio/TokenBalanceItemContextMenu.tsx | 2 + .../TokenBalanceItemContextMenu.web.tsx | 14 +- .../portfolio/TokenBalanceListWeb.tsx | 79 +- .../src/components/reporting/ReportModal.tsx | 128 + .../reporting/ReportPoolDataModal.tsx | 105 + .../reporting/ReportTokenDataModal.tsx | 101 + .../reporting/ReportTokenIssueModal.tsx | 132 + .../src/components/reporting/input.tsx | 28 + .../src/components/text/LearnMoreLink.tsx | 3 + .../__snapshots__/LearnMoreLink.test.tsx.snap | 24 +- .../tokens/TokensListEmptyState.tsx | 37 + .../components/tooltip/InfoTooltip.web.tsx | 8 +- packages/uniswap/src/constants/routing.ts | 12 +- packages/uniswap/src/constants/tokens.ts | 8 +- packages/uniswap/src/constants/urls.ts | 8 +- .../blockaidApi/BlockaidApiClient.ts | 14 + .../apiClients/createUniswapFetchClient.ts | 12 +- .../LiquidityServiceClient.ts | 15 + .../useMigrateV2ToV3LPPositionQuery.ts | 35 + .../useMigrateV3ToV4LPPositionQuery.ts | 35 + .../tradingApi/TradingApiClient.test.ts | 106 +- .../useMigrateV3LpPositionCalldataQuery.ts | 2 +- .../tradingApi/useWalletEncode7702Query.ts | 17 +- .../apiClients/unitagsApi/UnitagsApiClient.ts | 12 +- packages/uniswap/src/data/cache.ts | 19 +- packages/uniswap/src/data/links.ts | 2 +- .../src/data/rest/auctions/auctionService.ts | 44 + .../uniswap/src/data/rest/auctions/paths.ts | 12 + .../uniswap/src/data/rest/auctions/types.ts | 80 + .../auctions/useGetAuctionDetailsQuery.ts | 31 + .../data/rest/auctions/useGetAuctionsQuery.ts | 32 + .../auctions/useGetBidConcentrationQuery.ts | 31 + .../useGetBidsByWalletInfiniteQuery.ts | 35 + .../rest/auctions/useGetBidsByWalletQuery.ts | 32 + .../auctions/useGetLatestCheckpointQuery.ts | 31 + packages/uniswap/src/data/rest/base.ts | 30 +- packages/uniswap/src/data/rest/getPools.ts | 4 +- .../src/data/rest/getPortfolioChart.ts | 64 + .../uniswap/src/data/rest/getPositions.ts | 2 +- .../uniswap/src/data/rest/listTransactions.ts | 80 +- .../DialogPreferencesService.ts | 47 + .../createDialogPreferencesService.test.ts | 173 + .../createDialogPreferencesService.ts | 64 + .../uniswap/src/dialog-preferences/index.ts | 8 + .../uniswap/src/dialog-preferences/types.ts | 5 + .../src/features/accounts/AccountIcon.tsx | 5 +- .../activity/extract/conversion.test.ts | 1 - .../activity/extract/conversionRest.test.ts | 10 +- .../activity/hooks/useActivityData.test.tsx | 558 + .../activity/hooks/useActivityData.tsx | 40 +- ...ormattedTransactionDataForActivity.test.ts | 302 + .../useFormattedTransactionDataForActivity.ts | 51 +- ...useMergeLocalAndRemoteTransactions.test.ts | 248 + .../activity/hooks/useTransactionActions.tsx | 166 +- .../parse/parseBridgingTransaction.ts | 6 +- .../parse/parseLiquidityTransaction.ts | 8 +- .../activity/parse/parseMintTransaction.ts | 10 +- .../activity/parse/parseReceiveTransaction.ts | 3 + .../activity/parse/parseSendTransaction.ts | 2 + .../activity/parse/parseTradeTransaction.ts | 29 +- .../activity/parse/parseUnknownTransaction.ts | 8 +- .../activity/utils/extractDappInfo.ts | 25 + .../utils/getTransactionSummaryTitle.ts | 3 +- .../src/features/behaviorHistory/selectors.ts | 3 + .../src/features/chains/chainInfo.test.ts | 6 +- .../uniswap/src/features/chains/chainInfo.ts | 4 +- .../src/features/chains/evm/info/arbitrum.ts | 2 + .../src/features/chains/evm/info/avalanche.ts | 1 + .../src/features/chains/evm/info/base.ts | 2 + .../src/features/chains/evm/info/blast.ts | 2 + .../src/features/chains/evm/info/bnb.ts | 2 + .../src/features/chains/evm/info/celo.ts | 1 + .../src/features/chains/evm/info/mainnet.ts | 3 + .../src/features/chains/evm/info/optimism.ts | 2 + .../src/features/chains/evm/info/polygon.ts | 2 + .../src/features/chains/evm/info/soneium.ts | 2 + .../src/features/chains/evm/info/unichain.ts | 3 + .../features/chains/evm/info/worldchain.ts | 2 + .../src/features/chains/evm/info/zksync.ts | 2 + .../src/features/chains/evm/info/zora.ts | 2 + .../uniswap/src/features/chains/evm/rpc.ts | 4 +- .../chains/hooks/useFeatureFlaggedChainIds.ts | 12 +- .../features/chains/hooks/useNewChainIds.ts | 5 +- .../uniswap/src/features/chains/logos.tsx | 2 +- .../src/features/chains/svm/info/solana.ts | 1 + packages/uniswap/src/features/chains/types.ts | 9 +- .../uniswap/src/features/chains/utils.test.ts | 9 +- packages/uniswap/src/features/chains/utils.ts | 12 +- .../features/dataApi/balances/balancesRest.ts | 8 +- .../listTransactions/listTransactions.test.ts | 28 +- .../listTransactions/listTransactions.ts | 121 +- .../tokenDetails/useTokenDetailsData.ts | 94 + .../dataApi/utils/usePersistedError.ts | 2 +- .../PaymentMethodFilter.test.tsx.snap | 148 +- .../fiatOnRamp/UnsupportedTokenModal.tsx | 60 +- .../src/features/language/constants.ts | 198 +- .../uniswap/src/features/language/hooks.tsx | 120 - .../src/features/language/localizedDayjs.ts | 25 - .../nfts/hooks/useGroupNftsByVisibility.ts | 24 +- .../uniswap/src/features/nfts/utils.test.ts | 257 + packages/uniswap/src/features/nfts/utils.ts | 66 + .../src/features/notifications/slice/types.ts | 11 +- .../PortfolioBalance/RefreshBalanceButton.tsx | 120 - .../portfolio/TokenBalanceListContext.tsx | 17 +- .../hooks/useTokenContextMenuOptions.ts | 52 +- .../portfolio/portfolioUpdates/constants.ts | 6 +- .../isInstantTokenBalanceUpdateEnabled.ts | 5 - .../uniswap/src/features/reporting/reports.ts | 196 + .../SearchModal/SearchModalNoQueryList.tsx | 198 +- .../SearchModal/SearchModalResultsList.tsx | 15 +- .../hooks/useRecentlySearchedOptions.tsx | 23 +- .../hooks/useSectionsForNoQuerySearch.tsx | 165 + .../SearchModal/hooks/useWebSearchTabs.ts | 7 + .../src/features/search/SearchModal/types.ts | 1 + .../src/features/settings/constants.ts | 18 +- .../uniswap/src/features/settings/hooks.ts | 7 +- .../src/features/settings/selectors.ts | 7 + .../uniswap/src/features/settings/slice.ts | 6 + .../features/telemetry/constants/interface.ts | 4 + .../telemetry/constants/trace/modal.ts | 7 + .../telemetry/constants/trace/page.ts | 1 + .../features/telemetry/constants/wallet.ts | 4 +- .../uniswap/src/features/telemetry/types.ts | 127 +- .../uniswap/src/features/telemetry/user.ts | 1 + .../{ => warnings}/TokenWarningCard.tsx | 6 +- .../{ => warnings}/TokenWarningFlagsTable.tsx | 5 +- .../{ => warnings}/TokenWarningModal.tsx | 127 +- .../WarningInfoModalContainer.tsx | 3 - .../useBlockaidFeeComparisonAnalytics.ts | 6 +- .../useWarningModalCurrenciesDismissed.ts | 60 + .../tokens/{ => warnings}/safetyUtils.test.ts | 5 +- .../tokens/{ => warnings}/safetyUtils.ts | 16 +- .../tokens/{ => warnings}/slice/hooks.ts | 33 +- .../tokens/{ => warnings}/slice/selectors.ts | 12 +- .../tokens/{ => warnings}/slice/slice.ts | 37 +- .../tokens/{ => warnings}/slice/types.ts | 12 +- .../src/features/tokens/warnings/types.ts | 14 + .../TransactionDetails/SwapFee.tsx | 97 +- .../SwapReviewTokenWarningCard.tsx | 4 +- .../TransactionDetails/TransactionDetails.tsx | 26 +- .../modals/FeeOnTransferWarning.tsx | 6 +- .../modals/SwapFeeWarning.tsx | 22 +- .../transactions/TransactionDetails/types.ts | 2 +- .../utils/getFeeSeverity.ts | 7 +- .../utils/getRelevantTokenWarningSeverity.ts | 2 +- .../utils/getShouldDisplayTokenWarningCard.ts | 3 +- .../DecimalPadInput/DecimalPad.native.tsx | 11 +- .../DecimalPadInput/DecimalPadInput.tsx | 43 +- .../BuyNativeTokenButton.tsx | 21 +- .../InsufficientNativeTokenBaseComponent.tsx | 37 +- .../InsufficientNativeTokenWarning.tsx | 1 - .../TransactionModalContext.tsx | 3 +- .../TransactionModalProps.tsx | 3 +- .../settings/TransactionSettingsButton.tsx | 14 +- .../src/features/transactions/errors.ts | 1 + .../hooks/usePollingIntervalByChain.ts | 10 - .../steps/generateLPTransactionSteps.test.ts | 129 +- .../steps/generateLPTransactionSteps.ts | 71 +- .../liquidity/steps/increaseLiquiditySteps.ts | 18 +- .../liquidity/steps/increasePosition.ts | 22 +- .../transactions/liquidity/steps/migrate.ts | 2 +- .../liquidity/steps/migrationSteps.ts | 8 + .../features/transactions/liquidity/types.ts | 17 +- .../modals/CompatibleAddressModal.tsx | 2 +- .../modals/HiddenTokenInfoModal.tsx | 2 +- .../modals/MaxBalanceInfoModal.tsx | 16 +- .../src/features/transactions/selectors.ts | 2 +- .../src/features/transactions/slice.test.ts | 1 - .../src/features/transactions/slice.ts | 6 +- .../features/transactions/steps/approve.ts | 25 +- .../transactions/steps/permit2Signature.ts | 6 +- .../transactions/steps/permit2Transaction.ts | 3 +- .../src/features/transactions/steps/revoke.ts | 24 +- .../features/transactions/swap/analytics.ts | 8 +- .../swap/components/BridgingCurrencyRow.tsx | 2 +- .../swap/components/EstimatedBridgeTime.tsx | 42 +- .../swap/components/SwapArrowButton.tsx | 7 +- .../SwapFormButton/SwapFormButton.tsx | 5 +- .../SwapFormButton/hooks/useInterfaceWrap.ts | 80 - .../hooks/useIsSwapButtonDisabled.ts | 5 - .../hooks/useSwapFormButtonText.ts | 6 +- .../UnichainInstantBalanceModal/constants.ts | 1 + .../SwapFormCurrencyOutputPanel.tsx | 6 +- .../SwapFormDecimalPad.native.tsx | 3 +- .../form/SwapFormScreen/SwapFormScreen.tsx | 6 +- .../SwapFormScreenDetails/ExpandableRows.tsx | 7 +- .../SwapFormScreenDetails.web.tsx | 5 +- .../GasAndWarningRows/SwapWarningModal.tsx | 16 +- .../TradeInfoRow/GasInfoRow.test.tsx | 152 + .../TradeInfoRow/TradeWarning.tsx | 14 +- .../YouReceiveDetailsTooltip.tsx | 7 +- .../SwapFormWarningModals.tsx | 2 +- .../SwapFormScreenStoreContextProvider.tsx | 18 +- .../createSwapFormScreenStore.ts | 2 +- .../useSwapFormScreenCallbacks.ts | 42 +- .../swap/hooks/useNeedsBridgedAssetWarning.ts | 2 +- .../swap/hooks/usePriceDifference.test.ts | 10 +- .../getAztecUnavailableWarning.ts | 47 + ...usePrefilledNeedsTokenProtectionWarning.ts | 12 +- .../useSwapWarnings/useSwapWarnings.test.ts | 28 +- .../hooks/useSwapWarnings/useSwapWarnings.tsx | 16 +- .../transactions/swap/hooks/useTrade.ts | 3 + .../swap/hooks/useTrade/logging.ts | 2 +- .../features/transactions/swap/plan/types.ts | 73 + .../review/SwapDetails/AcceptNewQuoteRow.tsx | 36 +- .../swap/review/SwapDetails/SwapDetails.tsx | 26 +- .../DelayedSubmissionText.tsx | 33 + .../SwapReviewFooter/PendingSwapButton.tsx | 151 + .../SwapReviewFooter/SubmitSwapButton.tsx | 38 +- .../SwapReviewFooter/SwapReviewFooter.tsx | 14 +- .../SwapReviewScreen/SwapReviewScreen.tsx | 6 +- .../SwapReviewWrapTransactionDetails.tsx | 4 +- .../hooks/useCreateSwapReviewCallbacks.tsx | 98 +- .../chainedActionTxSwapAndGasInfoService.ts | 98 +- .../uniswapx/utils.test.tsx | 3 +- .../swapTxAndGasInfoService/utils.test.ts | 8 +- .../swap/services/executeSwapService.ts | 196 +- .../swap/services/hooks/useExecuteSwap.ts | 42 +- .../swap/services/hooks/usePrepareSwap.ts | 4 - .../swap/services/prepareSwapService.ts | 11 - .../services/tradeService/evmTradeService.ts | 4 + .../services/tradeService/svmTradeService.ts | 3 +- .../services/tradeService/tradeService.ts | 1 + .../transformations/buildQuoteRequest.ts | 2 - .../transformations/transformQuoteToTrade.ts | 6 +- .../transactions/swap/steps/signOrder.ts | 18 + .../features/transactions/swap/steps/swap.ts | 19 + .../SwapDependenciesStoreContextProvider.tsx | 15 +- .../createSwapDependenciesStore.ts | 6 - .../hooks/useOnToggleIsFiatMode.ts | 12 +- .../swap/types/getTradingApiSwapFee.ts | 4 +- .../transactions/swap/types/swapCallback.ts | 17 +- .../transactions/swap/types/swapHandlers.ts | 10 +- .../swap/types/swapTxAndGasInfo.ts | 16 +- .../features/transactions/swap/types/trade.ts | 6 +- .../transactions/swap/utils/chainedActions.ts | 34 + .../generateSwapTransactionSteps.test.ts | 22 +- .../utils/generateSwapTransactionSteps.ts | 17 +- .../transactions/swap/utils/getIdForQuote.ts | 10 + .../swap/utils/getPriceImpact.test.ts | 1 + .../features/transactions/swap/utils/trade.ts | 8 + .../swap/utils/tradingApi.test.ts | 3 +- .../transactions/swap/utils/tradingApi.ts | 21 +- .../transactions/types/transactionDetails.ts | 45 + .../features/unitags/ClaimUnitagContent.tsx | 13 +- .../__snapshots__/UnitagName.test.tsx.snap | 142 +- .../src/features/unitags/fileUtils.web.ts | 15 + .../visibility/hooks/useIsActivityHidden.ts | 7 + .../visibility/hooks/useTokenVisibility.ts | 20 + .../src/features/visibility/selectors.ts | 20 +- .../uniswap/src/features/visibility/slice.ts | 20 +- .../features/visibility/visibility.test.ts | 118 +- .../src/hooks/useIsKeyboardOpen.test.ts | 2 +- .../src/hooks/useShouldShowAztecWarning.ts | 18 + .../src/hooks/useSnowflakeAnimation.ts | 477 + packages/uniswap/src/i18n/i18n-setup.tsx | 8 - .../src/i18n/locales/translations/af-ZA.json | 2563 ---- .../src/i18n/locales/translations/ar-SA.json | 2563 ---- .../src/i18n/locales/translations/ca-ES.json | 2563 ---- .../src/i18n/locales/translations/cs-CZ.json | 2384 ---- .../src/i18n/locales/translations/da-DK.json | 2563 ---- .../src/i18n/locales/translations/de-DE.json | 2384 ---- .../src/i18n/locales/translations/el-GR.json | 2563 ---- .../src/i18n/locales/translations/fi-FI.json | 2563 ---- .../src/i18n/locales/translations/he-IL.json | 2563 ---- .../src/i18n/locales/translations/hi-IN.json | 2563 ---- .../src/i18n/locales/translations/hu-HU.json | 2563 ---- .../src/i18n/locales/translations/it-IT.json | 2563 ---- .../src/i18n/locales/translations/ms-MY.json | 2563 ---- .../src/i18n/locales/translations/no-NO.json | 2384 ---- .../src/i18n/locales/translations/pl-PL.json | 2563 ---- .../src/i18n/locales/translations/pt-BR.json | 6 +- .../src/i18n/locales/translations/ro-RO.json | 2384 ---- .../src/i18n/locales/translations/sl-SI.json | 2563 ---- .../src/i18n/locales/translations/sr-SP.json | 2563 ---- .../src/i18n/locales/translations/sv-SE.json | 2563 ---- .../src/i18n/locales/translations/sw-TZ.json | 2563 ---- .../src/i18n/locales/translations/uk-UA.json | 2563 ---- .../src/i18n/locales/translations/ur-PK.json | 2563 ---- packages/uniswap/src/react-native-dotenv.d.ts | 7 + .../src/state/uniswapMigrationTests.ts | 28 +- .../uniswap/src/state/uniswapMigrations.ts | 72 +- packages/uniswap/src/state/uniswapReducer.ts | 2 +- packages/uniswap/src/test/fixtures/account.ts | 19 + .../src/test/fixtures/transactions/swap.ts | 86 +- .../src/test/fixtures/wallet/addresses.ts | 1 + .../src/test/fixtures/wallet/currencies.ts | 1 - packages/uniswap/src/types/walletConnect.ts | 2 +- packages/uniswap/src/utils/currency.ts | 2 +- .../uniswapRoutingProvider.ts | 19 +- .../utils/routingDiagram/routingRegistry.ts | 7 +- packages/utilities/.gitignore | 3 +- packages/utilities/babel.config.js | 54 - .../src/async/retryWithBackoff.test.ts | 117 + .../utilities/src/async/retryWithBackoff.ts | 114 + .../src/device/locales.native.test.ts | 5 +- .../utilities/src/environment/env.native.ts | 7 +- packages/utilities/src/environment/env.web.ts | 5 +- .../src/environment/getCurrentEnv.ts | 17 + .../src/format/canonicalJson.test.ts | 56 + .../utilities/src/format/canonicalJson.ts | 57 + .../utilities/src/format/localeBased.test.ts | 36 + .../src/format/localeBasedFormats.ts | 115 +- packages/utilities/src/primitives/objects.ts | 11 +- packages/utilities/src/react/hooks.ts | 8 +- .../src/react/useDebouncedCallback.tsx | 4 +- .../src/react/useHasValueBecomeTruthy.test.ts | 177 + .../src/react/useHasValueBecomeTruthy.ts | 13 + .../src/react}/useInfiniteScroll.test.tsx | 32 +- .../utilities/src/react}/useInfiniteScroll.ts | 14 +- .../src/react/useThrottledCallback.tsx | 2 +- packages/utilities/src/reactQuery/cache.ts | 12 + .../utilities/src/telemetry/trace/utils.ts | 3 +- packages/utilities/src/theme/colors.ts | 13 + packages/utilities/src/time/timing.ts | 6 +- .../transactions/hexlifyTransaction.test.ts} | 31 +- .../src/transactions/hexlifyTransaction.ts | 36 + packages/wallet/.gitignore | 1 + packages/wallet/babel.config.js | 9 +- .../BatchedTransactionDetails.tsx | 6 +- .../WalletPreviewCard.test.tsx.snap | 623 +- .../AccountDetails.test.tsx.snap | 790 +- .../__snapshots__/LinkButton.test.tsx.snap | 227 +- .../dappRequests}/AccountSelectPopover.tsx | 24 +- .../src/components/dappRequests/AssetLogo.tsx | 61 + .../dappRequests/DappConnectionContent.tsx | 73 + .../DappConnectionPermissions.tsx | 82 +- .../dappRequests}/DappHeaderIcon.tsx | 15 +- .../dappRequests/DappPersonalSignContent.tsx | 97 + .../dappRequests/DappRequestFooter.tsx | 56 + .../dappRequests/DappRequestHeader.tsx | 47 + .../dappRequests/DappScanInfoModal.tsx | 80 + .../DappSendCallsScanningContent.tsx | 126 + .../dappRequests/DappSignTypedDataContent.tsx | 128 + .../DappTransactionScanningContent.tsx | 115 + .../dappRequests/DappWalletLineItem.tsx | 41 + .../SignTypedData}/DomainContent.tsx | 12 +- .../MaybeExplorerLinkedAddress.tsx | 3 +- .../NonStandardTypedDataContent.tsx | 67 + .../SignTypedData/Permit2Content.tsx | 94 + .../StandardTypedDataContent.tsx | 95 + .../dappRequests/SignatureMessageSection.tsx | 91 + .../TransactionApprovingSection.tsx | 161 + .../dappRequests/TransactionAssetList.tsx | 248 + .../dappRequests/TransactionErrorSection.tsx | 33 + .../dappRequests/TransactionLoadingState.tsx | 44 + .../dappRequests/TransactionPreviewCard.tsx | 166 + .../TransactionReceivingSection.tsx | 26 + .../TransactionRequestDetails.tsx | 132 + .../TransactionSendingSection.tsx | 26 + .../dappRequests/TransactionWarningBanner.tsx | 131 + .../hooks/useTypedDataWarningConfirmation.ts | 76 + .../dappRequests/types/EIP712Types.ts | 0 .../dappRequests/types/Permit2Types.ts | 2 +- .../src/components/introCards/IntroCard.tsx | 215 +- .../introCards/useSharedIntroCards.ts | 109 +- .../src/components/menu/ContextMenu.tsx | 68 +- .../PortfolioBalanceModal.tsx | 29 +- .../modals/SmartWalletActionRequiredModal.tsx | 20 +- .../modals/SmartWalletConfirmModal.tsx | 22 +- .../modals/SmartWalletCreatedModal.tsx | 5 +- .../modals/SmartWalletDisableWarningModal.tsx | 7 +- .../modals/SmartWalletEducationalModal.tsx | 5 +- .../modals/SmartWalletEnabledModal.tsx | 5 +- ...tWalletInsufficientFundsOnNetworkModal.tsx | 22 +- .../smartWallet/modals/SmartWalletModal.tsx | 76 +- .../smartWallet/modals/SmartWalletNudge.tsx | 6 +- .../modals/SmartWalletUnavailableModal.tsx | 5 +- .../modals/SmartWalletUpgradeModal.tsx | 10 +- .../data/apollo/usePersistedApolloClient.tsx | 4 +- packages/wallet/src/data/onRampAuthLink.ts | 51 - .../src/features/batchedTransactions/utils.ts | 35 +- .../src/features/behaviorHistory/selectors.ts | 9 + .../src/features/behaviorHistory/slice.ts | 17 + .../src/features/contracts/ContractManager.ts | 2 +- .../hooks/useBlockaidJsonRpcScan.ts | 53 + .../hooks/useBlockaidTransactionScan.test.ts | 270 + .../hooks/useBlockaidTransactionScan.ts | 53 + .../hooks/useBlockaidVerification.test.ts | 244 + .../hooks/useBlockaidVerification.ts | 33 + .../hooks/useDappConnectionConfirmation.ts | 59 + .../hooks/useParseUniswapXSwap.ts | 122 + .../hooks/useTypedDataSections.ts | 77 + .../wallet/src/features/dappRequests/types.ts | 85 +- .../dappRequests/utils/blockaidUtils.test.ts | 1072 ++ .../dappRequests/utils/blockaidUtils.ts | 426 + .../utils/buildBlockaidScanJsonRpcRequest.ts | 33 + .../buildBlockaidScanTransactionRequest.ts | 36 + .../dappRequests/utils/riskUtils.test.ts | 123 + .../features/dappRequests/utils/riskUtils.ts | 45 + .../dappRequests/verification.test.ts | 110 + .../src/features/dappRequests/verification.ts | 27 + ...SupportedNetworkNotification.test.tsx.snap | 384 +- .../smartWallet/hooks/useChainFiatFee.ts | 14 +- .../features/smartWallet/utils/gasFeeUtils.ts | 6 +- .../TransactionHistoryUpdater.tsx | 2 +- .../TransactionRequest/AddressFooter.tsx | 1 + .../TransactionRequest/NetworkFeeFooter.tsx | 4 +- .../TransactionHistoryUpdater.test.tsx.snap | 10 +- .../transactionServiceImpl.test.ts | 2 - .../transactionSignerService.ts | 7 - .../transactionSignerServiceImpl.test.ts | 73 - .../transactionSignerServiceImpl.ts | 35 +- .../signAndSubmitTransaction.ts | 2 +- .../features/transactions/rpcUtils.test.ts | 1 + .../transactions/swap/WalletSwapFlow.tsx | 12 +- .../transactions/swap/executeSwapSaga.test.ts | 1 - .../swap/hooks/useSwapCallback.ts | 104 - .../swap/hooks/useSwapHandlers.ts | 18 +- .../swap/hooks/useWrapCallback.ts | 21 - .../swap/prepareAndSignSwapSaga.test.ts | 1 - .../swap/prepareAndSignSwapSaga.ts | 20 +- .../swap/services/transactionParamsFactory.ts | 4 + .../transactions/swap/swapSaga.test.ts | 385 - .../features/transactions/swap/swapSaga.ts | 283 - .../transactions/swap/types/fixtures.ts | 3 +- .../transactions/swap/wrapSaga.test.ts | 80 - .../features/transactions/swap/wrapSaga.ts | 86 - .../wallet/src/features/transactions/utils.ts | 3 + .../utils/cleanTransactionGasFields.test.ts | 100 + .../utils/cleanTransactionGasFields.ts | 58 + .../watcher/transactionFinalizationSaga.ts | 2 + .../features/transactions/watcher/utils.ts | 19 + .../watcher/watchTransactionSaga.ts | 13 +- .../features/unitags/ChangeUnitagModal.tsx | 44 +- .../unitags/EditUnitagProfileContent.tsx | 4 +- .../src/features/wallet/Keyring/crypto.ts | 2 +- packages/wallet/src/state/walletMigrations.ts | 4 +- packages/wallet/src/test/README.md | 1 - packages/wallet/src/test/rpcUtilsFixtures.ts | 4 + packages/wallet/src/utils/password.ts | 1 + packages/wallet/src/utils/transaction.ts | 26 - patches/@expo%2Fcli@0.24.21.patch | 14 + patches/@expo%2Fconfig-plugins@10.1.1.patch | 37 + ...react-native%2Fgradle-plugin@0.79.5.patch} | 4 +- patches/@tamagui%2Fpopover@1.125.17.patch | 97 - patches/@tamagui%2Fportal@1.136.1.patch | 45 + patches/@tamagui%2Fstatic@1.136.1.patch | 152 + patches/@tamagui%2Fweb@1.125.17.patch | 66 - .../@tamagui%2Fz-index-stack@1.125.17.patch | 54 - patches/lightweight-charts@4.1.1.patch | 421 - patches/react-native-reanimated@3.16.7.patch | 30 - patches/react-native-reanimated@3.19.3.patch | 92 + scripts/check-bun-version.sh | 66 - scripts/check-runtime-versions.sh | 143 + .../src/generators/package/files/package.json | 4 +- 1713 files changed, 103713 insertions(+), 107445 deletions(-) create mode 100755 .claude/hooks/skill-activation-prompt.sh create mode 100644 .claude/hooks/skill-activation-prompt.ts create mode 100644 .claude/settings.json create mode 100644 .claude/skills/skill-rules.json create mode 100644 .claude/skills/web-e2e/SKILL.md create mode 100644 .cursor/cli.json create mode 100644 .cursorignore delete mode 100644 CODEOWNERS create mode 100644 apps/api-self-serve/.eslintrc.js create mode 100644 apps/api-self-serve/.gitignore create mode 100644 apps/api-self-serve/README.md create mode 100644 apps/api-self-serve/app/app.css create mode 100644 apps/api-self-serve/app/lib/utils.ts create mode 100644 apps/api-self-serve/app/root.tsx create mode 100644 apps/api-self-serve/app/routes.ts create mode 100644 apps/api-self-serve/app/routes/home.tsx create mode 100644 apps/api-self-serve/app/welcome/logo-dark.svg create mode 100644 apps/api-self-serve/app/welcome/logo-light.svg create mode 100644 apps/api-self-serve/app/welcome/welcome.tsx create mode 100644 apps/api-self-serve/components.json create mode 100644 apps/api-self-serve/package.json create mode 100644 apps/api-self-serve/react-router.config.ts create mode 100644 apps/api-self-serve/tailwind.config.ts create mode 100644 apps/api-self-serve/tsconfig.eslint.json create mode 100644 apps/api-self-serve/tsconfig.json create mode 100644 apps/api-self-serve/vite.config.ts create mode 100644 apps/cli/.eslintrc.cjs create mode 100644 apps/cli/README.md create mode 100644 apps/cli/package.json create mode 100644 apps/cli/project.json create mode 100644 apps/cli/src/cli-ui.tsx create mode 100644 apps/cli/src/cli.ts create mode 100644 apps/cli/src/core/data-collector.ts create mode 100644 apps/cli/src/core/orchestrator.ts create mode 100644 apps/cli/src/index.ts create mode 100644 apps/cli/src/lib/ai-provider-vercel.ts create mode 100644 apps/cli/src/lib/ai-provider.ts create mode 100644 apps/cli/src/lib/analysis-writer.ts create mode 100644 apps/cli/src/lib/cache-keys.ts create mode 100644 apps/cli/src/lib/cache-provider-sqlite.ts create mode 100644 apps/cli/src/lib/cache-provider.ts create mode 100644 apps/cli/src/lib/logger.ts create mode 100644 apps/cli/src/lib/pr-body-cleaner.ts create mode 100644 apps/cli/src/lib/release-scanner.ts create mode 100644 apps/cli/src/lib/stream-handler.ts create mode 100644 apps/cli/src/lib/team-members.ts create mode 100644 apps/cli/src/lib/team-resolver.ts create mode 100644 apps/cli/src/lib/trivial-files.ts create mode 100644 apps/cli/src/prompts/bug-bisect.md create mode 100644 apps/cli/src/prompts/release-changelog.md create mode 100644 apps/cli/src/prompts/team-digest.md create mode 100644 apps/cli/src/ui/App.tsx create mode 100644 apps/cli/src/ui/components/Banner.tsx create mode 100644 apps/cli/src/ui/components/Box.tsx create mode 100644 apps/cli/src/ui/components/ChangelogPreview.tsx create mode 100644 apps/cli/src/ui/components/FormField.tsx create mode 100644 apps/cli/src/ui/components/NumberInput.tsx create mode 100644 apps/cli/src/ui/components/ProgressIndicator.tsx create mode 100644 apps/cli/src/ui/components/ReleaseList.tsx create mode 100644 apps/cli/src/ui/components/Select.tsx create mode 100644 apps/cli/src/ui/components/StatusBadge.tsx create mode 100644 apps/cli/src/ui/components/TextInput.tsx create mode 100644 apps/cli/src/ui/components/Toggle.tsx create mode 100644 apps/cli/src/ui/components/WindowedSelect.tsx create mode 100644 apps/cli/src/ui/hooks/useAnalysis.ts create mode 100644 apps/cli/src/ui/hooks/useAppState.tsx create mode 100644 apps/cli/src/ui/hooks/useEditableField.ts create mode 100644 apps/cli/src/ui/hooks/useFormNavigation.ts create mode 100644 apps/cli/src/ui/hooks/useReleases.ts create mode 100644 apps/cli/src/ui/hooks/useRepository.ts create mode 100644 apps/cli/src/ui/hooks/useTeams.ts create mode 100644 apps/cli/src/ui/hooks/useToggleGroup.ts create mode 100644 apps/cli/src/ui/screens/BugBisectResultsScreen.tsx create mode 100644 apps/cli/src/ui/screens/BugInputScreen.tsx create mode 100644 apps/cli/src/ui/screens/ConfigReview.tsx create mode 100644 apps/cli/src/ui/screens/ExecutionScreen.tsx create mode 100644 apps/cli/src/ui/screens/ReleaseSelector.tsx create mode 100644 apps/cli/src/ui/screens/ResultsScreen.tsx create mode 100644 apps/cli/src/ui/screens/TeamDetailsScreen.tsx create mode 100644 apps/cli/src/ui/screens/TeamSelectorScreen.tsx create mode 100644 apps/cli/src/ui/screens/WelcomeScreen.tsx create mode 100644 apps/cli/src/ui/services/orchestrator-service.ts create mode 100644 apps/cli/src/ui/utils/colors.ts create mode 100644 apps/cli/src/ui/utils/format.ts create mode 100644 apps/cli/tsconfig.json create mode 100644 apps/cli/tsconfig.lint.json create mode 100644 apps/extension/src/app/features/dappRequests/requestContent/EthSend/ParsedTransaction/ParsedTransactionRequestContent.tsx delete mode 100644 apps/extension/src/app/features/dappRequests/requestContent/SignTypeData/Permit2/Permit2RequestContent.tsx create mode 100644 apps/extension/src/app/features/settings/password/ChangePasswordForm.test.tsx create mode 100644 apps/extension/src/app/features/settings/password/__snapshots__/ChangePasswordForm.test.tsx.snap create mode 100644 apps/mobile/.fingerprintignore create mode 100644 apps/mobile/android/app/src/main/java/com/uniswap/notifications/SilentPushEventEmitterModule.kt create mode 100644 apps/mobile/android/app/src/main/java/com/uniswap/notifications/SilentPushNotificationServiceExtension.kt create mode 100644 apps/mobile/android/app/src/main/java/com/uniswap/utils/JsonWritableExtensions.kt create mode 100644 apps/mobile/app.config.ts delete mode 100644 apps/mobile/app.json create mode 100644 apps/mobile/eas.json create mode 100644 apps/mobile/fingerprint.config.js delete mode 100644 apps/mobile/ios/Uniswap/AppDelegate.h delete mode 100644 apps/mobile/ios/Uniswap/AppDelegate.m create mode 100644 apps/mobile/ios/Uniswap/AppDelegate.swift create mode 100644 apps/mobile/ios/Uniswap/Notifications/SilentPushEventEmitter.m create mode 100644 apps/mobile/ios/Uniswap/Notifications/SilentPushEventEmitter.swift create mode 100644 apps/mobile/ios/Uniswap/Uniswap-Bridging-Header.h delete mode 100644 apps/mobile/ios/Uniswap/main.m delete mode 100644 apps/mobile/rnef.config.mjs create mode 100755 apps/mobile/scripts/check-android-gradle.sh create mode 100755 apps/mobile/scripts/check-podfile.sh create mode 100644 apps/mobile/scripts/getFingerprintForRadonIDE.ts create mode 100644 apps/mobile/src/app/navigation/constants.ts rename apps/mobile/src/app/navigation/tabs/{SwapLongPressModal.tsx => SwapLongPressOverlay.tsx} (54%) delete mode 100644 apps/mobile/src/components/explore/search/SearchPopularNFTCollections.graphql delete mode 100644 apps/mobile/src/components/icons/TripleDot.tsx create mode 100644 apps/mobile/src/components/modals/ReactNavigationModals/ReportTokenDataModalScreen.tsx create mode 100644 apps/mobile/src/components/modals/ReactNavigationModals/ReportTokenIssueModalScreen.tsx delete mode 100644 apps/mobile/src/features/deepLinking/handleInAppBrowserSaga.ts create mode 100644 apps/mobile/src/features/notifications/SilentPushListener.ts create mode 100644 apps/web/.storybook/__mocks__/tty.js create mode 100644 apps/web/public/images/notifications/monad_banner_light.png create mode 100644 apps/web/public/images/notifications/monad_logo_filled.png rename apps/web/public/{vercel-csp.json => staging-csp.json} (69%) create mode 100755 apps/web/scripts/start-anvil.sh create mode 100644 apps/web/src/appGraphql/data/apollo/retryLink.ts create mode 100644 apps/web/src/appGraphql/data/pools/usePoolData.test.ts create mode 100644 apps/web/src/assets/images/portfolio-connect-wallet-banner-grid/dark.svg create mode 100644 apps/web/src/assets/images/portfolio-connect-wallet-banner-grid/light.svg create mode 100644 apps/web/src/assets/images/portfolio-page-disconnected-preview/dark.svg create mode 100644 apps/web/src/assets/images/portfolio-page-disconnected-preview/light.svg create mode 100644 apps/web/src/assets/images/portfolio-page-disconnected-preview/mobile-dark.svg create mode 100644 apps/web/src/assets/images/portfolio-page-disconnected-preview/mobile-light.svg create mode 100644 apps/web/src/assets/svg/demo-wallet-emblem.svg delete mode 100644 apps/web/src/components/AccountDrawer/MiniPortfolio/Activity/ActivityTab.anvil.e2e.test.ts create mode 100644 apps/web/src/components/AccountDrawer/MiniPortfolio/MiniPortfolioV2.tsx create mode 100644 apps/web/src/components/AccountDrawer/ReportedActivityToggle.tsx rename apps/web/src/components/AccountDrawer/{SpamToggle.tsx => SpamTokensToggle.tsx} (58%) create mode 100644 apps/web/src/components/ActionTiles/ActionTileWithIconAnimation.tsx create mode 100644 apps/web/src/components/ActionTiles/BuyActionTile.tsx create mode 100644 apps/web/src/components/ActionTiles/MoreActionTile.tsx create mode 100644 apps/web/src/components/ActionTiles/ReceiveActionTile.tsx create mode 100644 apps/web/src/components/ActionTiles/SendActionTile/SendActionTile.tsx rename apps/web/src/components/{AccountDrawer => ActionTiles/SendActionTile}/SendButtonTooltip.tsx (94%) create mode 100644 apps/web/src/components/ActionTiles/SwapActionTile.tsx delete mode 100644 apps/web/src/components/Banner/SolanaPromo/SolanaPromoBanner.tsx delete mode 100644 apps/web/src/components/Banner/SolanaPromo/SolanaPromoModal.tsx rename apps/web/src/components/Banner/shared/{Banners.tsx => OutageBanners.tsx} (100%) create mode 100644 apps/web/src/components/Charts/ChartTooltip.tsx create mode 100644 apps/web/src/components/Charts/CustomHoverMarker.tsx create mode 100644 apps/web/src/components/Charts/LiquidityChart/utils/calculateAnchoredLiquidityByTick.test.ts create mode 100644 apps/web/src/components/Charts/LiquidityChart/utils/calculateAnchoredLiquidityByTick.ts create mode 100644 apps/web/src/components/Charts/LiquidityChart/utils/calculateTokensLocked.ts create mode 100644 apps/web/src/components/Charts/LiquidityChart/utils/getAmounts.test.ts create mode 100644 apps/web/src/components/Charts/LiquidityChart/utils/getAmounts.ts create mode 100644 apps/web/src/components/Charts/LiveDotRenderer.tsx create mode 100644 apps/web/src/components/Charts/StaleBanner.tsx create mode 100644 apps/web/src/components/Charts/ToucanChart/renderer.tsx create mode 100644 apps/web/src/components/Charts/ToucanChart/toucan-chart-series.tsx create mode 100644 apps/web/src/components/Charts/hooks/useApplyChartTextureEffects.ts rename apps/web/src/components/Charts/{hooks.ts => hooks/useHeaderDateFormatter.ts} (100%) create mode 100644 apps/web/src/components/CurrencyInputPanel/SwapCurrencyInputPanel.test.tsx delete mode 100644 apps/web/src/components/Icons/CreditCard.tsx delete mode 100644 apps/web/src/components/Icons/Globe.tsx delete mode 100644 apps/web/src/components/Liquidity/LPIncentives/hooks/useLpIncentiveClaimMutation.ts create mode 100644 apps/web/src/components/Liquidity/ReviewModal.tsx create mode 100644 apps/web/src/components/Liquidity/hooks/useReportPositionHandler.ts create mode 100644 apps/web/src/components/NavBar/UniswapWrappedEntry.tsx create mode 100644 apps/web/src/components/Table/TableBody.tsx create mode 100644 apps/web/src/components/Table/TableRow.tsx create mode 100644 apps/web/src/components/Table/constants.ts create mode 100644 apps/web/src/components/Table/types.ts create mode 100644 apps/web/src/components/Table/utils/hasRow.ts delete mode 100644 apps/web/src/components/Tokens/TokenDetails/ChartSection/ChartTypeSelector.tsx create mode 100644 apps/web/src/components/Tokens/TokenDetails/ChartSection/ChartTypeToggle.tsx create mode 100644 apps/web/src/components/Tokens/TokenDetails/MoreButton.tsx create mode 100644 apps/web/src/components/TopLevelBanners/UniswapWrapped2025Banner.tsx create mode 100644 apps/web/src/components/Toucan/Auction/AuctionStats/AuctionStats.tsx create mode 100644 apps/web/src/components/Toucan/Auction/BidActivities/BidActivities.tsx create mode 100644 apps/web/src/components/Toucan/Auction/BidActivities/BidActivity.tsx create mode 100644 apps/web/src/components/Toucan/Auction/BidDistributionChart/BidDistributionChartFooter.tsx create mode 100644 apps/web/src/components/Toucan/Auction/BidDistributionChart/BidDistributionChartPlaceholder.tsx create mode 100644 apps/web/src/components/Toucan/Auction/BidDistributionChart/BidDistributionChartRenderer.tsx create mode 100644 apps/web/src/components/Toucan/Auction/BidDistributionChart/BlockUpdateCountdown.tsx create mode 100644 apps/web/src/components/Toucan/Auction/BidDistributionChart/constants.ts create mode 100644 apps/web/src/components/Toucan/Auction/BidDistributionChart/dev/CustomizePresetForm.tsx create mode 100644 apps/web/src/components/Toucan/Auction/BidDistributionChart/dev/MockDataSelectorModal.tsx create mode 100644 apps/web/src/components/Toucan/Auction/BidDistributionChart/dev/SavedPresetsList.tsx create mode 100644 apps/web/src/components/Toucan/Auction/BidDistributionChart/dev/customPresets.ts create mode 100644 apps/web/src/components/Toucan/Auction/BidDistributionChart/dev/devUtils.ts create mode 100644 apps/web/src/components/Toucan/Auction/BidDistributionChart/dev/useCustomPresetsStore.ts create mode 100644 apps/web/src/components/Toucan/Auction/BidDistributionChart/hooks/useChartDimensions.ts create mode 100644 apps/web/src/components/Toucan/Auction/BidDistributionChart/hooks/useChartLabels.ts create mode 100644 apps/web/src/components/Toucan/Auction/BidDistributionChart/hooks/useChartTooltip.ts create mode 100644 apps/web/src/components/Toucan/Auction/BidDistributionChart/utils/bidConcentration.ts create mode 100644 apps/web/src/components/Toucan/Auction/BidDistributionChart/utils/clearingPrice/label.ts create mode 100644 apps/web/src/components/Toucan/Auction/BidDistributionChart/utils/clearingPrice/position.test.ts create mode 100644 apps/web/src/components/Toucan/Auction/BidDistributionChart/utils/clearingPrice/position.ts create mode 100644 apps/web/src/components/Toucan/Auction/BidDistributionChart/utils/utils.ts create mode 100644 apps/web/src/components/Toucan/Auction/hooks/useAuctionBlockPolling.ts create mode 100644 apps/web/src/components/Toucan/Auction/hooks/useBidTokenInfo.ts create mode 100644 apps/web/src/components/Toucan/Auction/store/mocks/distributionData/100_Ticks.ts create mode 100644 apps/web/src/components/Toucan/Auction/store/mocks/distributionData/10_Ticks.ts create mode 100644 apps/web/src/components/Toucan/Auction/store/mocks/distributionData/20_Ticks.ts create mode 100644 apps/web/src/components/Toucan/Auction/store/mocks/distributionData/50_Ticks.ts create mode 100644 apps/web/src/components/Toucan/Auction/store/mocks/distributionData/bidDistributionMockData.ts create mode 100644 apps/web/src/components/Toucan/Auction/store/mocks/useMockDataStore.ts create mode 100644 apps/web/src/components/Toucan/Auction/utils/computeAuctionProgress.ts create mode 100644 apps/web/src/components/Toucan/TopAuctionsTable.tsx delete mode 100644 apps/web/src/featureFlags/flags/outageBanner.ts create mode 100644 apps/web/src/hooks/useBlockCountdown.test.ts create mode 100644 apps/web/src/hooks/useBlockCountdown.ts create mode 100644 apps/web/src/hooks/useChainOutageConfig.ts delete mode 100644 apps/web/src/hooks/useLpIncentivesClaim.ts create mode 100644 apps/web/src/hooks/useUpdateManualOutage.test.tsx create mode 100644 apps/web/src/hooks/useUpdateManualOutage.ts create mode 100644 apps/web/src/notification-service/WebNotificationService.tsx create mode 100644 apps/web/src/notification-service/createLocalStorageAdapter.ts create mode 100644 apps/web/src/notification-service/data-sources/createLegacyBannersNotificationDataSource.ts create mode 100644 apps/web/src/notification-service/notification-renderer/ModalNotification.tsx create mode 100644 apps/web/src/notification-service/notification-renderer/NotificationContainer.tsx create mode 100644 apps/web/src/notification-service/notification-renderer/StackedLowerLeftBanners.tsx create mode 100644 apps/web/src/notification-service/notification-renderer/createWebNotificationRenderer.ts create mode 100644 apps/web/src/notification-service/notification-renderer/notificationStore.ts create mode 100644 apps/web/src/notification-service/notification-renderer/stackingUtils.test.ts create mode 100644 apps/web/src/notification-service/notification-renderer/stackingUtils.ts create mode 100644 apps/web/src/notification-service/telemetry/getNotificationTelemetry.ts create mode 100644 apps/web/src/pages/CreatePosition/CreatePositionModal.test.tsx delete mode 100644 apps/web/src/pages/Explore/Toucan.tsx create mode 100644 apps/web/src/pages/Migrate/MigrateLiquidityTxContext.tsx create mode 100644 apps/web/src/pages/Migrate/MigrateV3.anvil.e2e.test.ts create mode 100644 apps/web/src/pages/Migrate/MigrateV3.e2e.test.ts rename apps/web/src/pages/{MigrateV3 => Migrate}/hooks/useInitialPosition.ts (100%) create mode 100644 apps/web/src/pages/Migrate/hooks/useMigrateLPPositionTxInfo.ts rename apps/web/src/pages/{MigrateV3 => Migrate}/index.tsx (79%) delete mode 100644 apps/web/src/pages/MigrateV3/MigrateV3.anvil.e2e.test.ts delete mode 100644 apps/web/src/pages/MigrateV3/MigrateV3.e2e.test.ts delete mode 100644 apps/web/src/pages/MigrateV3/MigrateV3LiquidityTxContext.tsx create mode 100644 apps/web/src/pages/Portfolio/Activity/ActivityFilters.tsx create mode 100644 apps/web/src/pages/Portfolio/Activity/ActivityTable/ActivityAddressCell.tsx create mode 100644 apps/web/src/pages/Portfolio/Activity/ActivityTable/ActivityAddressLookupStore.tsx create mode 100644 apps/web/src/pages/Portfolio/Activity/ActivityTable/ActivityAmountCell/ActivityAmountCell.tsx create mode 100644 apps/web/src/pages/Portfolio/Activity/ActivityTable/ActivityAmountCell/ApproveAmountCell.tsx create mode 100644 apps/web/src/pages/Portfolio/Activity/ActivityTable/ActivityAmountCell/CompactLayout.tsx create mode 100644 apps/web/src/pages/Portfolio/Activity/ActivityTable/ActivityAmountCell/DualTokenLayout.tsx create mode 100644 apps/web/src/pages/Portfolio/Activity/ActivityTable/ActivityAmountCell/EmptyCell.tsx create mode 100644 apps/web/src/pages/Portfolio/Activity/ActivityTable/ActivityAmountCell/utils.tsx create mode 100644 apps/web/src/pages/Portfolio/Activity/ActivityTable/ActivityTable.tsx create mode 100644 apps/web/src/pages/Portfolio/Activity/ActivityTable/AddressWithAvatar.tsx create mode 100644 apps/web/src/pages/Portfolio/Activity/ActivityTable/NftAmountDisplay.tsx create mode 100644 apps/web/src/pages/Portfolio/Activity/ActivityTable/TimeCell.tsx create mode 100644 apps/web/src/pages/Portfolio/Activity/ActivityTable/TokenAmountDisplay.tsx create mode 100644 apps/web/src/pages/Portfolio/Activity/ActivityTable/TransactionTypeCell.tsx create mode 100644 apps/web/src/pages/Portfolio/Activity/ActivityTable/activityTableModels.ts create mode 100644 apps/web/src/pages/Portfolio/Activity/ActivityTable/registry.ts create mode 100644 apps/web/src/pages/Portfolio/Activity/PaginationSkeletonRow.tsx create mode 100644 apps/web/src/pages/Portfolio/ConnectWalletFixedBottomButton.tsx create mode 100644 apps/web/src/pages/Portfolio/EmptyTableCell.tsx delete mode 100644 apps/web/src/pages/Portfolio/Header/hooks/usePortfolioParams.ts create mode 100644 apps/web/src/pages/Portfolio/Header/hooks/usePortfolioRoutes.ts create mode 100644 apps/web/src/pages/Portfolio/Header/useShouldHeaderBeCompact.tsx create mode 100644 apps/web/src/pages/Portfolio/NFTs/NFTCardSkeleton.tsx create mode 100644 apps/web/src/pages/Portfolio/NFTs/generateRotationStyle.ts delete mode 100644 apps/web/src/pages/Portfolio/Overview.tsx create mode 100644 apps/web/src/pages/Portfolio/Overview/ActionTiles.tsx create mode 100644 apps/web/src/pages/Portfolio/Overview/MiniActivityTable.tsx create mode 100644 apps/web/src/pages/Portfolio/Overview/MiniPoolsTable/MiniPoolsTable.tsx create mode 100644 apps/web/src/pages/Portfolio/Overview/MiniPoolsTable/columns/Balance.tsx create mode 100644 apps/web/src/pages/Portfolio/Overview/MiniPoolsTable/columns/Fees.tsx create mode 100644 apps/web/src/pages/Portfolio/Overview/MiniPoolsTable/columns/Info.tsx create mode 100644 apps/web/src/pages/Portfolio/Overview/MiniPoolsTable/columns/Status.tsx create mode 100644 apps/web/src/pages/Portfolio/Overview/MiniTokensTable.tsx create mode 100644 apps/web/src/pages/Portfolio/Overview/OpenLimitsTable.tsx create mode 100644 apps/web/src/pages/Portfolio/Overview/Overview.tsx create mode 100644 apps/web/src/pages/Portfolio/Overview/OverviewTables.tsx create mode 100644 apps/web/src/pages/Portfolio/Overview/PortfolioChart.tsx create mode 100644 apps/web/src/pages/Portfolio/Overview/StatsTiles.tsx create mode 100644 apps/web/src/pages/Portfolio/Overview/TableSectionHeader.tsx create mode 100644 apps/web/src/pages/Portfolio/Overview/ViewAllButton.tsx create mode 100644 apps/web/src/pages/Portfolio/Overview/constants.ts create mode 100644 apps/web/src/pages/Portfolio/Overview/hooks/useIsPortfolioZero.ts create mode 100644 apps/web/src/pages/Portfolio/Overview/hooks/useSwapUSDValuesFromGraphQL.ts create mode 100644 apps/web/src/pages/Portfolio/Overview/hooks/useSwapsThisWeek.ts create mode 100644 apps/web/src/pages/Portfolio/Overview/utils/checkBalanceDiffWithinRange.ts create mode 100644 apps/web/src/pages/Portfolio/PortfolioPageInner.tsx create mode 100644 apps/web/src/pages/Portfolio/Tokens/Table/columns/Price.tsx create mode 100644 apps/web/src/pages/Portfolio/Tokens/Table/columns/useTokenColumns.tsx create mode 100644 apps/web/src/pages/Portfolio/Tokens/hooks/useNavigateToTokenDetails.ts create mode 100644 apps/web/src/pages/Portfolio/components/AnimatedStyledBanner/AnimatedEmblems.tsx create mode 100644 apps/web/src/pages/Portfolio/components/AnimatedStyledBanner/AnimatedStyledBanner.tsx create mode 100644 apps/web/src/pages/Portfolio/components/AnimatedStyledBanner/Emblems/EmblemA.tsx create mode 100644 apps/web/src/pages/Portfolio/components/AnimatedStyledBanner/Emblems/EmblemB.tsx create mode 100644 apps/web/src/pages/Portfolio/components/AnimatedStyledBanner/Emblems/EmblemC.tsx create mode 100644 apps/web/src/pages/Portfolio/components/AnimatedStyledBanner/Emblems/EmblemD.tsx create mode 100644 apps/web/src/pages/Portfolio/components/AnimatedStyledBanner/Emblems/EmblemE.tsx create mode 100644 apps/web/src/pages/Portfolio/components/AnimatedStyledBanner/Emblems/EmblemF.tsx create mode 100644 apps/web/src/pages/Portfolio/components/AnimatedStyledBanner/Emblems/EmblemG.tsx create mode 100644 apps/web/src/pages/Portfolio/components/AnimatedStyledBanner/Emblems/EmblemH.tsx create mode 100644 apps/web/src/pages/Portfolio/components/AnimatedStyledBanner/Emblems/index.ts create mode 100644 apps/web/src/pages/Portfolio/components/AnimatedStyledBanner/Emblems/types.ts create mode 100644 apps/web/src/pages/Portfolio/components/PortfolioExpandoRow.tsx create mode 100644 apps/web/src/pages/Portfolio/constants.ts create mode 100644 apps/web/src/pages/Portfolio/hooks/usePortfolioAddresses.ts create mode 100644 apps/web/src/pages/Portfolio/utils/portfolioUrls.ts create mode 100644 apps/web/src/pages/Wrapped/DisconnectedState.tsx create mode 100644 apps/web/src/pages/Wrapped/index.tsx create mode 100644 apps/web/src/pages/getPortfolioTitle.ts create mode 100644 apps/web/src/playwright/fixtures/urls.test.ts create mode 100644 apps/web/src/playwright/fixtures/urls.ts create mode 100644 apps/web/src/playwright/mocks/dataApiService/get_portfolio.json create mode 100644 apps/web/src/playwright/mocks/fiatOnRamp/get-country.json create mode 100644 apps/web/src/playwright/mocks/fiatOnRamp/quotes.json create mode 100644 apps/web/src/playwright/mocks/fiatOnRamp/supported-countries.json create mode 100644 apps/web/src/playwright/mocks/fiatOnRamp/supported-fiat-currencies.json create mode 100644 apps/web/src/playwright/mocks/fiatOnRamp/supported-tokens.json create mode 100644 apps/web/src/playwright/mocks/graphql/Token/uni_token_price.json create mode 100644 apps/web/src/playwright/mocks/tradingApi/swap.json create mode 100644 apps/web/src/state/explore/topAuctions.ts create mode 100644 apps/web/src/state/migrations/58.test.ts create mode 100644 apps/web/src/state/migrations/58.ts create mode 100644 apps/web/src/state/migrations/59.test.ts create mode 100644 apps/web/src/state/migrations/59.ts create mode 100644 apps/web/src/state/migrations/60.test.ts create mode 100644 apps/web/src/state/migrations/60.ts create mode 100644 apps/web/src/state/outage/atoms.ts create mode 100644 apps/web/src/state/outage/types.ts create mode 100644 apps/web/src/state/sagas/transactions/useSwapHandlers.test.ts create mode 100644 apps/web/src/state/sagas/transactions/useSwapHandlers.ts create mode 100644 apps/web/src/test-utils/mockTamagui.ts create mode 100644 apps/web/src/utils/errors/isOutageError.ts create mode 100644 apps/web/src/utils/filterDefinedWalletAddresses.ts create mode 100644 apps/web/vite/entry-gateway-proxy.ts create mode 100644 packages/api/scripts/fixGraphQLApiTypes.mts create mode 100644 packages/api/src/clients/blockaid/createBlockaidApiClient.ts create mode 100644 packages/api/src/clients/blockaid/types.ts create mode 100644 packages/api/src/clients/graphql/generated.ts create mode 100644 packages/api/src/clients/liquidity/createLiquidityServiceClient.ts create mode 100644 packages/api/src/components/ApiInit.test.tsx create mode 100644 packages/api/src/components/ApiInit.tsx create mode 100644 packages/api/src/getEntryGatewayUrl.ts delete mode 100644 packages/api/src/getIsSessionServiceEnabled.ts delete mode 100644 packages/api/src/getSessionService.native.ts delete mode 100644 packages/api/src/getSessionService.ts delete mode 100644 packages/api/src/getSessionService.web.ts create mode 100644 packages/api/src/provideDeviceIdService.ts create mode 100644 packages/api/src/provideSessionService.native.ts create mode 100644 packages/api/src/provideSessionService.ts create mode 100644 packages/api/src/provideSessionService.web.ts create mode 100644 packages/api/src/provideSessionStorage.ts create mode 100644 packages/api/src/provideUniswapIdentifierService.ts create mode 100644 packages/api/src/storage/createExtensionStorageDriver.ts create mode 100644 packages/api/src/storage/createNativeStorageDriver.ts create mode 100644 packages/api/src/storage/createWebStorageDriver.ts create mode 100644 packages/api/src/storage/getStorageDriver.native.ts create mode 100644 packages/api/src/storage/getStorageDriver.ts create mode 100644 packages/api/src/storage/getStorageDriver.web.ts create mode 100644 packages/api/src/storage/types.ts create mode 100644 packages/api/src/transport.ts create mode 100644 packages/biome-config/project.json create mode 100644 packages/biome-config/src/extractor.test.js create mode 100644 packages/biome-config/src/fixtures/array-merge-config.jsonc create mode 100644 packages/biome-config/src/fixtures/no-markers-config.jsonc create mode 100644 packages/biome-config/src/fixtures/off-override-config.jsonc create mode 100644 packages/biome-config/src/fixtures/simple-config.jsonc create mode 100644 packages/biome-config/src/merger.test.js create mode 100644 packages/biome-config/src/processor.test.js create mode 100644 packages/biome-config/src/universePackages.js create mode 100644 packages/eslint-config/plugins/no-transform-percentage-strings.js create mode 100644 packages/eslint-config/plugins/no-transform-percentage-strings.test.js create mode 100644 packages/gating/src/getIsSessionServiceEnabled.ts create mode 100644 packages/gating/src/getIsSessionUpgradeAutoEnabled.ts create mode 100644 packages/notifications/src/getIsNotificationServiceEnabled.ts create mode 100644 packages/notifications/src/global.d.ts create mode 100644 packages/notifications/src/notification-data-source/NotificationDataSource.ts create mode 100644 packages/notifications/src/notification-data-source/getNotificationQueryOptions.ts create mode 100644 packages/notifications/src/notification-data-source/implementations/createNotificationDataSource.ts create mode 100644 packages/notifications/src/notification-data-source/implementations/createPollingNotificationDataSource.test.ts create mode 100644 packages/notifications/src/notification-data-source/implementations/createPollingNotificationDataSource.ts create mode 100644 packages/notifications/src/notification-processor/NotificationProcessor.ts create mode 100644 packages/notifications/src/notification-processor/implementations/createBaseNotificationProcessor.test.ts create mode 100644 packages/notifications/src/notification-processor/implementations/createBaseNotificationProcessor.ts create mode 100644 packages/notifications/src/notification-processor/implementations/createNotificationProcessor.test.ts create mode 100644 packages/notifications/src/notification-processor/implementations/createNotificationProcessor.ts create mode 100644 packages/notifications/src/notification-renderer/NotificationRenderer.ts create mode 100644 packages/notifications/src/notification-renderer/components/BannerTemplate.tsx create mode 100644 packages/notifications/src/notification-renderer/components/InlineBannerNotification.tsx create mode 100644 packages/notifications/src/notification-renderer/implementations/createNotificationRenderer.ts create mode 100644 packages/notifications/src/notification-service/NotificationService.ts create mode 100644 packages/notifications/src/notification-service/implementations/createNotificationService.test.ts create mode 100644 packages/notifications/src/notification-service/implementations/createNotificationService.ts create mode 100644 packages/notifications/src/notification-telemetry/NotificationTelemetry.ts create mode 100644 packages/notifications/src/notification-telemetry/implementations/createNotificationTelemetry.test.ts create mode 100644 packages/notifications/src/notification-telemetry/implementations/createNotificationTelemetry.ts create mode 100644 packages/notifications/src/notification-tracker/NotificationTracker.ts create mode 100644 packages/notifications/src/notification-tracker/implementations/createApiNotificationTracker.test.ts create mode 100644 packages/notifications/src/notification-tracker/implementations/createApiNotificationTracker.ts create mode 100644 packages/notifications/src/notification-tracker/implementations/createNoopNotificationTracker.ts create mode 100644 packages/notifications/src/notification-tracker/implementations/createNotificationTracker.ts create mode 100644 packages/notifications/src/utils/formatNotificationType.test.ts create mode 100644 packages/notifications/src/utils/formatNotificationType.ts create mode 100644 packages/notifications/vitest-setup.ts create mode 100644 packages/notifications/vitest.config.ts create mode 100644 packages/sessions/src/challenge-solvers/createChallengeSolverService.ts create mode 100644 packages/sessions/src/challenge-solvers/createHashcashMockSolver.ts create mode 100644 packages/sessions/src/challenge-solvers/createHashcashSolver.test.ts create mode 100644 packages/sessions/src/challenge-solvers/createHashcashSolver.ts create mode 100644 packages/sessions/src/challenge-solvers/createNoneMockSolver.ts create mode 100644 packages/sessions/src/challenge-solvers/createTurnstileMockSolver.ts create mode 100644 packages/sessions/src/challenge-solvers/createTurnstileSolver.ts create mode 100644 packages/sessions/src/challenge-solvers/hashcash/core.test.ts create mode 100644 packages/sessions/src/challenge-solvers/hashcash/core.ts create mode 100644 packages/sessions/src/challenge-solvers/turnstileSolver.integration.test.ts create mode 100644 packages/sessions/src/challenge-solvers/types.ts create mode 100644 packages/sessions/src/challengeFlow.integration.test.ts create mode 100644 packages/sessions/src/session-initialization/createSessionInitializationService.test.ts create mode 100644 packages/sessions/src/session-initialization/createSessionInitializationService.ts create mode 100644 packages/sessions/src/session-initialization/sessionErrors.ts delete mode 100644 packages/sessions/src/session-repository/transport.ts create mode 100644 packages/sessions/src/session.integration.test.ts create mode 100644 packages/sessions/src/sessionLifecycle.integration.test.ts create mode 100644 packages/sessions/src/test-utils.ts create mode 100644 packages/sessions/src/test-utils/createLocalCookieTransport.ts create mode 100644 packages/sessions/src/test-utils/mocks.ts create mode 100644 packages/sessions/src/uniswap-identifier/createUniswapIdentifierService.ts create mode 100644 packages/sessions/src/uniswap-identifier/types.ts create mode 100644 packages/ui/src/assets/backgrounds/dots-banner-dark.png create mode 100644 packages/ui/src/assets/backgrounds/dots-banner-light.png create mode 100644 packages/ui/src/assets/backgrounds/monad-test-banner-light.png create mode 100644 packages/ui/src/assets/graphics/bridged-assets-v2-card-banner-dark.png create mode 100644 packages/ui/src/assets/graphics/bridged-assets-v2-card-banner-light.png create mode 100644 packages/ui/src/assets/graphics/zero-percent.png create mode 100644 packages/ui/src/assets/icons/approve-alt.svg create mode 100644 packages/ui/src/assets/icons/avatar-placeholder.svg create mode 100644 packages/ui/src/assets/icons/box.svg create mode 100644 packages/ui/src/assets/icons/chart-bar-crossed.svg create mode 100644 packages/ui/src/assets/icons/credit-card.svg create mode 100644 packages/ui/src/assets/icons/crosschain-icon.svg create mode 100644 packages/ui/src/assets/icons/eth-mini.svg create mode 100644 packages/ui/src/assets/icons/gift.svg create mode 100644 packages/ui/src/assets/icons/money-hand.svg create mode 100644 packages/ui/src/assets/icons/receipt.svg create mode 100644 packages/ui/src/assets/icons/send-alt.svg create mode 100644 packages/ui/src/assets/icons/shield-magnifying-glass.svg create mode 100644 packages/ui/src/assets/icons/snowflake.svg create mode 100644 packages/ui/src/assets/logos/png/monad-logo-filled.png delete mode 100644 packages/ui/src/assets/logos/png/monad-logo.png create mode 100644 packages/ui/src/components/RefreshButton/RefreshButton.native.tsx create mode 100644 packages/ui/src/components/RefreshButton/RefreshButton.tsx create mode 100644 packages/ui/src/components/RefreshButton/RefreshButton.web.tsx create mode 100644 packages/ui/src/components/RefreshButton/RefreshButtonIcon.tsx create mode 100644 packages/ui/src/components/icons/ApproveAlt.tsx create mode 100644 packages/ui/src/components/icons/AvatarPlaceholder.tsx create mode 100644 packages/ui/src/components/icons/Box.tsx create mode 100644 packages/ui/src/components/icons/ChartBarCrossed.tsx create mode 100644 packages/ui/src/components/icons/CreditCard.tsx create mode 100644 packages/ui/src/components/icons/CrosschainIcon.tsx create mode 100644 packages/ui/src/components/icons/EthMini.tsx create mode 100644 packages/ui/src/components/icons/Gift.tsx create mode 100644 packages/ui/src/components/icons/MoneyHand.tsx create mode 100644 packages/ui/src/components/icons/Receipt.tsx create mode 100644 packages/ui/src/components/icons/SendAlt.tsx create mode 100644 packages/ui/src/components/icons/ShieldMagnifyingGlass.tsx create mode 100644 packages/ui/src/components/icons/Snowflake.tsx create mode 100644 packages/ui/src/components/lines/VerticalDottedLineSeparator.tsx create mode 100644 packages/uniswap/src/components/ConfirmSwapModal/steps/SwapTXPlanStepRow.tsx create mode 100644 packages/uniswap/src/components/ConfirmSwapModal/useSecondsUntilDeadline.tsx create mode 100644 packages/uniswap/src/components/TokenSelector/UnsupportedChainedActionsBanner.tsx create mode 100644 packages/uniswap/src/components/activity/ActivityListEmptyState.tsx create mode 100644 packages/uniswap/src/components/banners/UniswapWrapped2025Banner/UniswapWrapped2025Banner.native.tsx create mode 100644 packages/uniswap/src/components/banners/UniswapWrapped2025Banner/UniswapWrapped2025Banner.tsx create mode 100644 packages/uniswap/src/components/banners/UniswapWrapped2025Banner/UniswapWrapped2025Banner.web.tsx create mode 100644 packages/uniswap/src/components/banners/UniswapWrapped2025Banner/types.ts create mode 100644 packages/uniswap/src/components/banners/UniswapWrapped2025Card/UniswapWrapped2025Card.native.tsx create mode 100644 packages/uniswap/src/components/banners/UniswapWrapped2025Card/UniswapWrapped2025Card.tsx create mode 100644 packages/uniswap/src/components/banners/UniswapWrapped2025Card/UniswapWrapped2025Card.web.tsx create mode 100644 packages/uniswap/src/components/banners/UniswapWrapped2025Card/types.ts create mode 100644 packages/uniswap/src/components/banners/shared/SharedSnowflakeComponents.tsx create mode 100644 packages/uniswap/src/components/banners/shared/utils.ts rename {apps/mobile/src/components/icons => packages/uniswap/src/components/chains}/BlockExplorerIcon.tsx (95%) create mode 100644 packages/uniswap/src/components/dialog/DialogButtons.tsx create mode 100644 packages/uniswap/src/components/dialog/DialogContent.tsx create mode 100644 packages/uniswap/src/components/dialog/GetHelpButtonUI.tsx create mode 100644 packages/uniswap/src/components/dialog/GetHelpHeader.native.tsx create mode 100644 packages/uniswap/src/components/dialog/GetHelpHeader.web.tsx create mode 100644 packages/uniswap/src/components/dialog/GetHelpHeaderContent.tsx create mode 100644 packages/uniswap/src/components/dialog/hooks/useDialogVisibility.test.ts create mode 100644 packages/uniswap/src/components/dialog/hooks/useDialogVisibility.ts create mode 100644 packages/uniswap/src/components/logos/PoweredByBlockaid.tsx create mode 100644 packages/uniswap/src/components/menus/hooks/useContextMenuTracking.ts create mode 100644 packages/uniswap/src/components/nfts/NftsListEmptyState.tsx create mode 100644 packages/uniswap/src/components/nfts/NftsListHeader.tsx create mode 100644 packages/uniswap/src/components/nfts/types.ts create mode 100644 packages/uniswap/src/components/notifications/ModalTemplate.tsx create mode 100644 packages/uniswap/src/components/notifications/MonadAnnouncementModal.tsx create mode 100644 packages/uniswap/src/components/reporting/ReportModal.tsx create mode 100644 packages/uniswap/src/components/reporting/ReportPoolDataModal.tsx create mode 100644 packages/uniswap/src/components/reporting/ReportTokenDataModal.tsx create mode 100644 packages/uniswap/src/components/reporting/ReportTokenIssueModal.tsx create mode 100644 packages/uniswap/src/components/reporting/input.tsx create mode 100644 packages/uniswap/src/components/tokens/TokensListEmptyState.tsx create mode 100644 packages/uniswap/src/data/apiClients/blockaidApi/BlockaidApiClient.ts create mode 100644 packages/uniswap/src/data/apiClients/liquidityService/LiquidityServiceClient.ts create mode 100644 packages/uniswap/src/data/apiClients/liquidityService/useMigrateV2ToV3LPPositionQuery.ts create mode 100644 packages/uniswap/src/data/apiClients/liquidityService/useMigrateV3ToV4LPPositionQuery.ts create mode 100644 packages/uniswap/src/data/rest/auctions/auctionService.ts create mode 100644 packages/uniswap/src/data/rest/auctions/paths.ts create mode 100644 packages/uniswap/src/data/rest/auctions/types.ts create mode 100644 packages/uniswap/src/data/rest/auctions/useGetAuctionDetailsQuery.ts create mode 100644 packages/uniswap/src/data/rest/auctions/useGetAuctionsQuery.ts create mode 100644 packages/uniswap/src/data/rest/auctions/useGetBidConcentrationQuery.ts create mode 100644 packages/uniswap/src/data/rest/auctions/useGetBidsByWalletInfiniteQuery.ts create mode 100644 packages/uniswap/src/data/rest/auctions/useGetBidsByWalletQuery.ts create mode 100644 packages/uniswap/src/data/rest/auctions/useGetLatestCheckpointQuery.ts create mode 100644 packages/uniswap/src/data/rest/getPortfolioChart.ts create mode 100644 packages/uniswap/src/dialog-preferences/DialogPreferencesService.ts create mode 100644 packages/uniswap/src/dialog-preferences/implementations/createDialogPreferencesService.test.ts create mode 100644 packages/uniswap/src/dialog-preferences/implementations/createDialogPreferencesService.ts create mode 100644 packages/uniswap/src/dialog-preferences/index.ts create mode 100644 packages/uniswap/src/dialog-preferences/types.ts create mode 100644 packages/uniswap/src/features/activity/hooks/useActivityData.test.tsx create mode 100644 packages/uniswap/src/features/activity/hooks/useFormattedTransactionDataForActivity.test.ts create mode 100644 packages/uniswap/src/features/activity/hooks/useMergeLocalAndRemoteTransactions.test.ts create mode 100644 packages/uniswap/src/features/activity/utils/extractDappInfo.ts create mode 100644 packages/uniswap/src/features/dataApi/tokenDetails/useTokenDetailsData.ts create mode 100644 packages/uniswap/src/features/nfts/utils.test.ts delete mode 100644 packages/uniswap/src/features/portfolio/PortfolioBalance/RefreshBalanceButton.tsx delete mode 100644 packages/uniswap/src/features/portfolio/portfolioUpdates/isInstantTokenBalanceUpdateEnabled.ts create mode 100644 packages/uniswap/src/features/reporting/reports.ts create mode 100644 packages/uniswap/src/features/search/SearchModal/hooks/useSectionsForNoQuerySearch.tsx create mode 100644 packages/uniswap/src/features/search/SearchModal/hooks/useWebSearchTabs.ts rename packages/uniswap/src/features/tokens/{ => warnings}/TokenWarningCard.tsx (95%) rename packages/uniswap/src/features/tokens/{ => warnings}/TokenWarningFlagsTable.tsx (95%) rename packages/uniswap/src/features/tokens/{ => warnings}/TokenWarningModal.tsx (80%) rename packages/uniswap/src/features/tokens/{ => warnings}/WarningInfoModalContainer.tsx (80%) rename packages/uniswap/src/features/tokens/{ => warnings}/hooks/useBlockaidFeeComparisonAnalytics.ts (96%) create mode 100644 packages/uniswap/src/features/tokens/warnings/hooks/useWarningModalCurrenciesDismissed.ts rename packages/uniswap/src/features/tokens/{ => warnings}/safetyUtils.test.ts (99%) rename packages/uniswap/src/features/tokens/{ => warnings}/safetyUtils.ts (97%) rename packages/uniswap/src/features/tokens/{ => warnings}/slice/hooks.ts (73%) rename packages/uniswap/src/features/tokens/{ => warnings}/slice/selectors.ts (58%) rename packages/uniswap/src/features/tokens/{ => warnings}/slice/slice.ts (66%) rename packages/uniswap/src/features/tokens/{ => warnings}/slice/types.ts (64%) create mode 100644 packages/uniswap/src/features/tokens/warnings/types.ts delete mode 100644 packages/uniswap/src/features/transactions/swap/components/SwapFormButton/hooks/useInterfaceWrap.ts create mode 100644 packages/uniswap/src/features/transactions/swap/form/SwapFormScreen/SwapFormScreenDetails/SwapFormScreenFooter/GasAndWarningRows/TradeInfoRow/GasInfoRow.test.tsx create mode 100644 packages/uniswap/src/features/transactions/swap/hooks/useSwapWarnings/getAztecUnavailableWarning.ts create mode 100644 packages/uniswap/src/features/transactions/swap/plan/types.ts create mode 100644 packages/uniswap/src/features/transactions/swap/review/SwapReviewScreen/SwapReviewFooter/DelayedSubmissionText.tsx create mode 100644 packages/uniswap/src/features/transactions/swap/review/SwapReviewScreen/SwapReviewFooter/PendingSwapButton.tsx create mode 100644 packages/uniswap/src/features/transactions/swap/utils/chainedActions.ts create mode 100644 packages/uniswap/src/features/transactions/swap/utils/getIdForQuote.ts create mode 100644 packages/uniswap/src/features/visibility/hooks/useIsActivityHidden.ts create mode 100644 packages/uniswap/src/features/visibility/hooks/useTokenVisibility.ts create mode 100644 packages/uniswap/src/hooks/useShouldShowAztecWarning.ts create mode 100644 packages/uniswap/src/hooks/useSnowflakeAnimation.ts delete mode 100644 packages/uniswap/src/i18n/locales/translations/af-ZA.json delete mode 100644 packages/uniswap/src/i18n/locales/translations/ar-SA.json delete mode 100644 packages/uniswap/src/i18n/locales/translations/ca-ES.json delete mode 100644 packages/uniswap/src/i18n/locales/translations/cs-CZ.json delete mode 100644 packages/uniswap/src/i18n/locales/translations/da-DK.json delete mode 100644 packages/uniswap/src/i18n/locales/translations/de-DE.json delete mode 100644 packages/uniswap/src/i18n/locales/translations/el-GR.json delete mode 100644 packages/uniswap/src/i18n/locales/translations/fi-FI.json delete mode 100644 packages/uniswap/src/i18n/locales/translations/he-IL.json delete mode 100644 packages/uniswap/src/i18n/locales/translations/hi-IN.json delete mode 100644 packages/uniswap/src/i18n/locales/translations/hu-HU.json delete mode 100644 packages/uniswap/src/i18n/locales/translations/it-IT.json delete mode 100644 packages/uniswap/src/i18n/locales/translations/ms-MY.json delete mode 100644 packages/uniswap/src/i18n/locales/translations/no-NO.json delete mode 100644 packages/uniswap/src/i18n/locales/translations/pl-PL.json delete mode 100644 packages/uniswap/src/i18n/locales/translations/ro-RO.json delete mode 100644 packages/uniswap/src/i18n/locales/translations/sl-SI.json delete mode 100644 packages/uniswap/src/i18n/locales/translations/sr-SP.json delete mode 100644 packages/uniswap/src/i18n/locales/translations/sv-SE.json delete mode 100644 packages/uniswap/src/i18n/locales/translations/sw-TZ.json delete mode 100644 packages/uniswap/src/i18n/locales/translations/uk-UA.json delete mode 100644 packages/uniswap/src/i18n/locales/translations/ur-PK.json create mode 100644 packages/uniswap/src/test/fixtures/account.ts create mode 100644 packages/uniswap/src/test/fixtures/wallet/addresses.ts delete mode 100644 packages/utilities/babel.config.js create mode 100644 packages/utilities/src/async/retryWithBackoff.test.ts create mode 100644 packages/utilities/src/async/retryWithBackoff.ts create mode 100644 packages/utilities/src/environment/getCurrentEnv.ts create mode 100644 packages/utilities/src/format/canonicalJson.test.ts create mode 100644 packages/utilities/src/format/canonicalJson.ts create mode 100644 packages/utilities/src/react/useHasValueBecomeTruthy.test.ts create mode 100644 packages/utilities/src/react/useHasValueBecomeTruthy.ts rename {apps/web/src/hooks => packages/utilities/src/react}/useInfiniteScroll.test.tsx (76%) rename {apps/web/src/hooks => packages/utilities/src/react}/useInfiniteScroll.ts (74%) rename packages/{wallet/src/utils/transaction.test.ts => utilities/src/transactions/hexlifyTransaction.test.ts} (57%) create mode 100644 packages/utilities/src/transactions/hexlifyTransaction.ts rename {apps/mobile/src/components/Requests/ScanSheet => packages/wallet/src/components/dappRequests}/AccountSelectPopover.tsx (88%) create mode 100644 packages/wallet/src/components/dappRequests/AssetLogo.tsx create mode 100644 packages/wallet/src/components/dappRequests/DappConnectionContent.tsx rename apps/mobile/src/components/Requests/ScanSheet/SitePermissions.tsx => packages/wallet/src/components/dappRequests/DappConnectionPermissions.tsx (62%) rename {apps/mobile/src/components/Requests => packages/wallet/src/components/dappRequests}/DappHeaderIcon.tsx (77%) create mode 100644 packages/wallet/src/components/dappRequests/DappPersonalSignContent.tsx create mode 100644 packages/wallet/src/components/dappRequests/DappRequestFooter.tsx create mode 100644 packages/wallet/src/components/dappRequests/DappRequestHeader.tsx create mode 100644 packages/wallet/src/components/dappRequests/DappScanInfoModal.tsx create mode 100644 packages/wallet/src/components/dappRequests/DappSendCallsScanningContent.tsx create mode 100644 packages/wallet/src/components/dappRequests/DappSignTypedDataContent.tsx create mode 100644 packages/wallet/src/components/dappRequests/DappTransactionScanningContent.tsx create mode 100644 packages/wallet/src/components/dappRequests/DappWalletLineItem.tsx rename {apps/extension/src/app/features/dappRequests/requestContent/SignTypeData => packages/wallet/src/components/dappRequests/SignTypedData}/DomainContent.tsx (84%) rename {apps/extension/src/app/features/dappRequests/requestContent/SignTypeData => packages/wallet/src/components/dappRequests/SignTypedData}/MaybeExplorerLinkedAddress.tsx (87%) create mode 100644 packages/wallet/src/components/dappRequests/SignTypedData/NonStandardTypedDataContent.tsx create mode 100644 packages/wallet/src/components/dappRequests/SignTypedData/Permit2Content.tsx create mode 100644 packages/wallet/src/components/dappRequests/SignTypedData/StandardTypedDataContent.tsx create mode 100644 packages/wallet/src/components/dappRequests/SignatureMessageSection.tsx create mode 100644 packages/wallet/src/components/dappRequests/TransactionApprovingSection.tsx create mode 100644 packages/wallet/src/components/dappRequests/TransactionAssetList.tsx create mode 100644 packages/wallet/src/components/dappRequests/TransactionErrorSection.tsx create mode 100644 packages/wallet/src/components/dappRequests/TransactionLoadingState.tsx create mode 100644 packages/wallet/src/components/dappRequests/TransactionPreviewCard.tsx create mode 100644 packages/wallet/src/components/dappRequests/TransactionReceivingSection.tsx create mode 100644 packages/wallet/src/components/dappRequests/TransactionRequestDetails.tsx create mode 100644 packages/wallet/src/components/dappRequests/TransactionSendingSection.tsx create mode 100644 packages/wallet/src/components/dappRequests/TransactionWarningBanner.tsx create mode 100644 packages/wallet/src/components/dappRequests/hooks/useTypedDataWarningConfirmation.ts rename {apps/extension/src/app/features => packages/wallet/src/components}/dappRequests/types/EIP712Types.ts (100%) rename {apps/extension/src/app/features => packages/wallet/src/components}/dappRequests/types/Permit2Types.ts (96%) delete mode 100644 packages/wallet/src/data/onRampAuthLink.ts create mode 100644 packages/wallet/src/features/dappRequests/hooks/useBlockaidJsonRpcScan.ts create mode 100644 packages/wallet/src/features/dappRequests/hooks/useBlockaidTransactionScan.test.ts create mode 100644 packages/wallet/src/features/dappRequests/hooks/useBlockaidTransactionScan.ts create mode 100644 packages/wallet/src/features/dappRequests/hooks/useBlockaidVerification.test.ts create mode 100644 packages/wallet/src/features/dappRequests/hooks/useBlockaidVerification.ts create mode 100644 packages/wallet/src/features/dappRequests/hooks/useDappConnectionConfirmation.ts create mode 100644 packages/wallet/src/features/dappRequests/hooks/useParseUniswapXSwap.ts create mode 100644 packages/wallet/src/features/dappRequests/hooks/useTypedDataSections.ts create mode 100644 packages/wallet/src/features/dappRequests/utils/blockaidUtils.test.ts create mode 100644 packages/wallet/src/features/dappRequests/utils/blockaidUtils.ts create mode 100644 packages/wallet/src/features/dappRequests/utils/buildBlockaidScanJsonRpcRequest.ts create mode 100644 packages/wallet/src/features/dappRequests/utils/buildBlockaidScanTransactionRequest.ts create mode 100644 packages/wallet/src/features/dappRequests/utils/riskUtils.test.ts create mode 100644 packages/wallet/src/features/dappRequests/utils/riskUtils.ts create mode 100644 packages/wallet/src/features/dappRequests/verification.test.ts create mode 100644 packages/wallet/src/features/dappRequests/verification.ts delete mode 100644 packages/wallet/src/features/transactions/swap/hooks/useSwapCallback.ts delete mode 100644 packages/wallet/src/features/transactions/swap/hooks/useWrapCallback.ts delete mode 100644 packages/wallet/src/features/transactions/swap/swapSaga.test.ts delete mode 100644 packages/wallet/src/features/transactions/swap/swapSaga.ts delete mode 100644 packages/wallet/src/features/transactions/swap/wrapSaga.test.ts delete mode 100644 packages/wallet/src/features/transactions/swap/wrapSaga.ts create mode 100644 packages/wallet/src/features/transactions/utils/cleanTransactionGasFields.test.ts create mode 100644 packages/wallet/src/features/transactions/utils/cleanTransactionGasFields.ts create mode 100644 packages/wallet/src/features/transactions/watcher/utils.ts delete mode 100644 packages/wallet/src/utils/transaction.ts create mode 100644 patches/@expo%2Fcli@0.24.21.patch create mode 100644 patches/@expo%2Fconfig-plugins@10.1.1.patch rename patches/{@react-native%2Fgradle-plugin@0.77.2.patch => @react-native%2Fgradle-plugin@0.79.5.patch} (82%) delete mode 100644 patches/@tamagui%2Fpopover@1.125.17.patch create mode 100644 patches/@tamagui%2Fportal@1.136.1.patch create mode 100644 patches/@tamagui%2Fstatic@1.136.1.patch delete mode 100644 patches/@tamagui%2Fweb@1.125.17.patch delete mode 100644 patches/@tamagui%2Fz-index-stack@1.125.17.patch delete mode 100644 patches/lightweight-charts@4.1.1.patch delete mode 100644 patches/react-native-reanimated@3.16.7.patch create mode 100644 patches/react-native-reanimated@3.19.3.patch delete mode 100755 scripts/check-bun-version.sh create mode 100755 scripts/check-runtime-versions.sh diff --git a/.bun-version b/.bun-version index 9728bd69ac8..3a3cd8cc8b0 100644 --- a/.bun-version +++ b/.bun-version @@ -1 +1 @@ -1.2.21 +1.3.1 diff --git a/.claude/hooks/skill-activation-prompt.sh b/.claude/hooks/skill-activation-prompt.sh new file mode 100755 index 00000000000..27fb24d0584 --- /dev/null +++ b/.claude/hooks/skill-activation-prompt.sh @@ -0,0 +1,6 @@ +#!/bin/bash +# Copied from https://github.com/diet103/claude-code-infrastructure-showcase/blob/c586f9d8854989abbe9040cde61527888ded3904/.claude/hooks/skill-activation-prompt.sh +set -e + +cd "$CLAUDE_PROJECT_DIR/.claude/hooks" +cat | bun run skill-activation-prompt.ts diff --git a/.claude/hooks/skill-activation-prompt.ts b/.claude/hooks/skill-activation-prompt.ts new file mode 100644 index 00000000000..f8feef6343d --- /dev/null +++ b/.claude/hooks/skill-activation-prompt.ts @@ -0,0 +1,132 @@ +#!/usr/bin/env node +/** biome-ignore-all lint/suspicious/noConsole: script output */ +// Copied from https://github.com/diet103/claude-code-infrastructure-showcase/blob/c586f9d8854989abbe9040cde61527888ded3904/.claude/hooks/skill-activation-prompt.ts +import { readFileSync } from 'fs' +import { join } from 'path' + +interface HookInput { + session_id: string + transcript_path: string + cwd: string + permission_mode: string + prompt: string +} + +interface PromptTriggers { + keywords?: string[] + intentPatterns?: string[] +} + +interface SkillRule { + type: 'guardrail' | 'domain' + enforcement: 'block' | 'suggest' | 'warn' + priority: 'critical' | 'high' | 'medium' | 'low' + promptTriggers?: PromptTriggers +} + +interface SkillRules { + version: string + skills: Record +} + +interface MatchedSkill { + name: string + matchType: 'keyword' | 'intent' + config: SkillRule +} + +async function main() { + try { + // Read input from stdin + const input = readFileSync(0, 'utf-8') + const data: HookInput = JSON.parse(input) + const prompt = data.prompt.toLowerCase() + + // Load skill rules + const projectDir = process.env.CLAUDE_PROJECT_DIR || '$HOME/project' + const rulesPath = join(projectDir, '.claude', 'skills', 'skill-rules.json') + const rules: SkillRules = JSON.parse(readFileSync(rulesPath, 'utf-8')) + + const matchedSkills: MatchedSkill[] = [] + + // Check each skill for matches + for (const [skillName, config] of Object.entries(rules.skills)) { + const triggers = config.promptTriggers + if (!triggers) { + continue + } + + // Keyword matching + if (triggers.keywords) { + const keywordMatch = triggers.keywords.some((kw) => prompt.includes(kw.toLowerCase())) + if (keywordMatch) { + matchedSkills.push({ name: skillName, matchType: 'keyword', config }) + continue + } + } + + // Intent pattern matching + if (triggers.intentPatterns) { + const intentMatch = triggers.intentPatterns.some((pattern) => { + const regex = new RegExp(pattern, 'i') + return regex.test(prompt) + }) + if (intentMatch) { + matchedSkills.push({ name: skillName, matchType: 'intent', config }) + } + } + } + + // Generate output if matches found + if (matchedSkills.length > 0) { + let output = '━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n' + output += '🎯 SKILL ACTIVATION CHECK\n' + output += '━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\n' + + // Group by priority + const critical = matchedSkills.filter((s) => s.config.priority === 'critical') + const high = matchedSkills.filter((s) => s.config.priority === 'high') + const medium = matchedSkills.filter((s) => s.config.priority === 'medium') + const low = matchedSkills.filter((s) => s.config.priority === 'low') + + if (critical.length > 0) { + output += '⚠️ CRITICAL SKILLS (REQUIRED):\n' + critical.forEach((s) => (output += ` → ${s.name}\n`)) + output += '\n' + } + + if (high.length > 0) { + output += '📚 RECOMMENDED SKILLS:\n' + high.forEach((s) => (output += ` → ${s.name}\n`)) + output += '\n' + } + + if (medium.length > 0) { + output += '💡 SUGGESTED SKILLS:\n' + medium.forEach((s) => (output += ` → ${s.name}\n`)) + output += '\n' + } + + if (low.length > 0) { + output += '📌 OPTIONAL SKILLS:\n' + low.forEach((s) => (output += ` → ${s.name}\n`)) + output += '\n' + } + + output += 'ACTION: Use Skill tool BEFORE responding\n' + output += '━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n' + + console.log(output) + } + + process.exit(0) + } catch (err) { + console.error('Error in skill-activation-prompt hook:', err) + process.exit(1) + } +} + +main().catch((err) => { + console.error('Uncaught error:', err) + process.exit(1) +}) diff --git a/.claude/settings.json b/.claude/settings.json new file mode 100644 index 00000000000..98c9f2f7c89 --- /dev/null +++ b/.claude/settings.json @@ -0,0 +1,32 @@ +{ + "permissions": { + "deny": [ + "Read(**/.env)", + "Edit(**/.env)", + "Read(~/.aws/**)", + "Edit(~/.aws/**)", + "Read(~/.ssh/**)", + "Edit(~/.ssh/**)", + "Read(~/.gnupg/**)", + "Edit(~/.gnupg/**)", + "Read(~/.git-credentials)", + "Edit(~/.git-credentials)", + "Read($HOME/Library/Keychains/**)", + "Edit($HOME/Library/Keychains/**)", + "Read(/private/etc/**)", + "Edit(/private/etc/**)" + ] + }, + "hooks": { + "UserPromptSubmit": [ + { + "hooks": [ + { + "type": "command", + "command": "$CLAUDE_PROJECT_DIR/.claude/hooks/skill-activation-prompt.sh" + } + ] + } + ] + } +} diff --git a/.claude/skills/skill-rules.json b/.claude/skills/skill-rules.json new file mode 100644 index 00000000000..83577579083 --- /dev/null +++ b/.claude/skills/skill-rules.json @@ -0,0 +1,29 @@ +{ + "version": "1.0", + "description": "Skill activation triggers for Claude Code. Controls when skills automatically suggest or block actions.", + "skills": { + "web-e2e": { + "type": "domain", + "enforcement": "block", + "priority": "critical", + "description": "Run, debug, and create Playwright e2e tests for the web app.", + "promptTriggers": { + "keywords": ["e2e", "end-to-end", "playwright"], + "intentPatterns": ["(run|start|debug|create|explain).*?e2e"] + } + } + }, + "notes": { + "enforcement_types": { + "suggest": "Skill suggestion appears but doesn't block execution", + "block": "Requires skill to be used before proceeding (guardrail)", + "warn": "Shows warning but allows proceeding" + }, + "priority_levels": { + "critical": "Highest - Always trigger when matched", + "high": "Important - Trigger for most matches", + "medium": "Moderate - Trigger for clear matches", + "low": "Optional - Trigger only for explicit matches" + } + } +} diff --git a/.claude/skills/web-e2e/SKILL.md b/.claude/skills/web-e2e/SKILL.md new file mode 100644 index 00000000000..aad00d76d9b --- /dev/null +++ b/.claude/skills/web-e2e/SKILL.md @@ -0,0 +1,350 @@ +--- +name: web-e2e +description: Run, create, and debug Playwright e2e tests for the web app. ALWAYS invoke this skill using the SlashCommand tool (i.e., `/web-e2e`) BEFORE attempting to run any e2e tests, playwright tests, anvil tests, or debug test failures. DO NOT run `bun playwright test` or other e2e commands directly - you must invoke this skill first to learn the correct commands and test architecture. +allowed-tools: [Read, Write, Edit, Bash, Glob, Grep, mcp__playwright__browser_navigate, mcp__playwright__browser_snapshot, mcp__playwright__browser_click, mcp__playwright__browser_type, mcp__playwright__browser_take_screenshot, mcp__playwright__browser_console_messages, mcp__playwright__browser_network_requests, mcp__playwright__browser_evaluate] +--- + +# Web E2E Testing Skill + +This skill helps you create and run end-to-end (e2e) Playwright tests for the Uniswap web application. + +## Test Architecture + +### Test Location +- All e2e tests live in `apps/web/src/` directory structure +- Test files use the naming convention: `*.e2e.test.ts` +- Anvil-specific tests (requiring local blockchain): `*.anvil.e2e.test.ts` + +### Automatic Wallet Connection + +**Important**: When running Playwright tests, the app automatically connects to a test wallet: +- **Address**: `0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266` (constant: `TEST_WALLET_ADDRESS`) +- **Display name**: `test0` (the Unitag associated with this address) +- **Connection**: Happens automatically via `wagmiAutoConnect.ts` when in Playwright environment + +This means: +- Tests start with a wallet already connected +- You can immediately test wallet-dependent features +- The wallet button will show "test0" instead of "Connect wallet" + +**When using Playwright MCP**: To enable automatic wallet connection when browsing via MCP tools, set the environment variable `REACT_APP_IS_PLAYWRIGHT_ENV=true` before starting the dev server. This makes the app behave identically to how it does in automated tests, with the test wallet auto-connected. + +### Custom Fixtures + +The web app uses custom Playwright fixtures and mocks that extend base Playwright functionality. +They are located in `apps/web/src/playwright/fixtures/*` and `apps/web/src/playwright/mocks/*`. + +#### Import Pattern +```typescript +import { expect, getTest } from 'playwright/fixtures' + +// For regular tests (no blockchain) +const test = getTest() + +// For anvil tests (with blockchain) +const test = getTest({ withAnvil: true }) +``` + +#### Available Fixtures + +1. **graphql** - Mock GraphQL responses + ```typescript + await graphql.intercept('OperationName', Mocks.Path.to_mock) + await graphql.waitForResponse('OperationName') + ``` + +2. **anvil** - Local blockchain client (only in anvil tests) + ```typescript + // Set token balances + await anvil.setErc20Balance({ address, balance }) + + // Check balances + await anvil.getBalance({ address }) + await anvil.getErc20Balance(tokenAddress, ownerAddress) + + // Manage allowances + await anvil.setErc20Allowance({ address, spender, amount }) + await anvil.setPermit2Allowance({ token, spender, amount }) + + // Mining blocks + await anvil.mine({ blocks: 1 }) + + // Snapshots for isolation + const snapshotId = await anvil.takeSnapshot() + await anvil.revertToSnapshot(snapshotId) + ``` + +3. **tradingApi** - Mock Trading API responses + ```typescript + await stubTradingApiEndpoint({ + page, + endpoint: uniswapUrls.tradingApiPaths.swap + }) + ``` + +4. **amplitude** - Analytics mocking (automatic) + +### Test Structure + +```typescript +import { expect, getTest } from 'playwright/fixtures' +import { TestID } from 'uniswap/src/test/fixtures/testIDs' + +const test = getTest({ withAnvil: true }) // or getTest() for non-anvil + +test.describe('Feature Name', () => { + test.beforeEach(async ({ page }) => { + // Setup before each test + }) + + test('should do something', async ({ page, anvil, graphql }) => { + // Setup mocks + await graphql.intercept('Operation', Mocks.Path.mock) + + // Setup blockchain state (if anvil test) + await anvil.setErc20Balance({ address, balance }) + + // Navigate to page + await page.goto('/path') + + // Interact with UI using TestIDs + await page.getByTestId(TestID.SomeButton).click() + + // Make assertions + await expect(page.getByText('Expected Text')).toBeVisible() + }) +}) +``` + +### Best Practices + +1. **Use TestIDs** - Always use the TestID enum for selectors (not string literals) + ```typescript + // Good + await page.getByTestId(TestID.ReviewSwap) + + // Bad + await page.getByTestId('review-swap') + ``` + +2. **Mock External Services** - Use fixtures to mock GraphQL, Trading API, REST API etc. + ```typescript + await graphql.intercept('PortfolioBalances', Mocks.PortfolioBalances.test_wallet) + await stubTradingApiEndpoint({ page, endpoint: uniswapUrls.tradingApiPaths.quote }) + ``` + +3. **Use Mocks Helper** - Import mock paths from `playwright/mocks/mocks.ts` + ```typescript + import { Mocks } from 'playwright/mocks/mocks' + await graphql.intercept('Token', Mocks.Token.uni_token) + ``` + +4. **Test Constants** - Use constants from the codebase + ```typescript + import { USDT, DAI } from 'uniswap/src/constants/tokens' + import { TEST_WALLET_ADDRESS } from 'playwright/fixtures/wallets' + + // TEST_WALLET_ADDRESS is the automatically connected wallet + // It displays as "test0" in the UI + ``` + +5. **Anvil State Management** - Set up blockchain state properly + ```typescript + // Always set token balances before testing swaps + await anvil.setErc20Balance({ + address: assume0xAddress(USDT.address), + balance: 100_000_000n + }) + ``` + +## Running Tests + +The following commands must be run from the `apps/web/` folder. + +**⚠️ PREREQUISITE**: Playwright tests require the Vite preview server to be running at `http://localhost:3000` BEFORE tests start. The `bun e2e` commands handle this automatically, but if running tests directly you must start the server first. + +### Development Commands + +The `e2e` commands handle all requisite setup tasks for the playwright tests. These include building the app for production and running the Vite preview server. + +```bash +# Run all e2e tests (starts anvil, builds, and runs tests) +bun e2e + +# Run only non-anvil tests (faster, no blockchain required) +bun e2e:no-anvil + +# Run only anvil tests (blockchain tests only) +bun e2e:anvil + +# Run specific test file +bun e2e TokenSelector.e2e.test +``` + +### Direct Playwright Commands + +In some cases it may be helpful to run the commands more directly with the different tasks in different terminals. + +```bash +# Step 1: Build the web app for e2e +bun build:e2e + +# Step 2: Start the Vite preview server (REQUIRED - must be running before tests) +bun preview:e2e +# Wait for "Local: http://localhost:3000" message + +# (Optional) Step 3: Start Anvil (note, Anvil tests can start this themselves) +bun anvil:mainnet +# Wait for "Listening on 127.0.0.1:8545" message + +# Step 4: Run the playwright tests (only after servers are ready) +bun playwright:test +``` + +### Test Modes + +```bash +# Headed mode (see browser) +bun playwright test --headed + +# Debug mode with Playwright Inspector +bun playwright test --debug + +# UI mode (interactive) +bun playwright test --ui +``` + +## Configuration + +### Playwright Config (`playwright.config.ts`) + +Key settings: +- `testDir`: `./src` +- `testMatch`: `**/*.e2e.test.ts` +- `workers`: 1 (configured in CI) +- `fullyParallel`: false +- `baseURL`: `http://localhost:3000` + +## Common Patterns + +### Navigation and URL Testing +```typescript +await page.goto('/swap?inputCurrency=ETH&outputCurrency=USDT') +await expect(page.getByTestId(TestID.ChooseInputToken + '-label')).toHaveText('ETH') +``` + +### Form Interactions +```typescript +await page.getByTestId(TestID.AmountInputIn).fill('0.01') +await page.getByTestId(TestID.AmountInputIn).clear() +``` + +### Token Selection +```typescript +await page.getByTestId(TestID.ChooseOutputToken).click() +await page.getByTestId('token-option-1-USDT').first().click() +``` + +### Waiting for Transaction Completion +```typescript +await page.getByTestId(TestID.Swap).click() +await expect(page.getByText('Swapped')).toBeVisible() +``` + +### Blockchain Verification +```typescript +const balance = await anvil.getBalance({ address: TEST_WALLET_ADDRESS }) +await expect(balance).toBeLessThan(parseEther('10000')) +``` + +## Troubleshooting + +### Tests Timeout +- Check if Anvil is running: `bun anvil:mainnet` +- Ensure preview server is running: `bun preview:e2e` + +### Anvil Issues +- Tests automatically manage Anvil snapshots for isolation +- Anvil restarts automatically if unhealthy +- For manual restart: stop the e2e command and run again + +### Mock Not Working +- Ensure mock path is correct in `Mocks` object +- Check GraphQL operation name matches exactly +- Verify timing - intercept before the request is made + +### Test Flakiness +- Use proper waiting: `await expect(element).toBeVisible()` +- Don't use fixed `setTimeout` - use Playwright's auto-waiting +- Check for race conditions with network requests + +### Debugging + +- Run tests with `--headed` flag to watch the browser +- Use `--debug` flag to step through with Playwright Inspector +- Add `await page.pause()` in your test to stop at a specific point +- Check test output and error messages carefully +- Review screenshots/videos in `test-results/` directory after failures + +## Playwright Documentation References + +For more details on Playwright features, refer to: + +- **[Writing Tests](https://playwright.dev/docs/writing-tests)** - Test structure, actions, assertions +- **[Test Fixtures](https://playwright.dev/docs/test-fixtures)** - Creating custom fixtures (like our anvil/graphql fixtures) +- **[Running Tests](https://playwright.dev/docs/running-tests)** - Command line options, filtering, debugging +- **[API Testing](https://playwright.dev/docs/api-testing)** - Mocking and intercepting network requests +- **[Locators](https://playwright.dev/docs/locators)** - Finding elements (we use `getByTestId` primarily) +- **[Assertions](https://playwright.dev/docs/test-assertions)** - Available expect matchers +- **[Test Hooks](https://playwright.dev/docs/api/class-test#test-before-each)** - beforeEach, afterEach, beforeAll, afterAll +- **[Test Configuration](https://playwright.dev/docs/test-configuration)** - playwright.config.ts options +- **[Debugging Tests](https://playwright.dev/docs/debug)** - UI mode, inspector, trace viewer + +## Playwright MCP Integration (Optional but Recommended) + +The Playwright MCP (Model Context Protocol) provides browser automation capabilities that make test development and debugging easier: +- **Interactive debugging** - Navigate the app in a real browser to understand behavior +- **Creating tests** - Explore the UI to identify selectors and interactions +- **Debugging failures** - Inspect page state when tests fail + +### Installing Playwright MCP + +If you don't have the Playwright MCP installed, you can add it to your Claude Code configuration: + +1. Open Claude Code settings (Command/Ctrl + Shift + P → "Claude Code: Open Settings") +2. Add the Playwright MCP to your `mcpServers` configuration: + +```json +{ + "mcpServers": { + "playwright": { + "command": "npx", + "args": ["-y", "@executeautomation/playwright-mcp-server"] + } + } +} +``` + +3. Restart Claude Code + +Alternatively, follow the installation guide at: https://github.com/executeautomation/playwright-mcp + +### Using Playwright MCP for Test Development (Optional) + +**If you have the MCP installed**, you can use these tools during development: + +1. **Navigate and explore** - Use `mcp__playwright__browser_navigate` to visit pages +2. **Take snapshots** - Use `mcp__playwright__browser_snapshot` to see the page structure and find TestIDs +3. **Interact with elements** - Use `mcp__playwright__browser_click` and `mcp__playwright__browser_type` to test interactions +4. **Inspect state** - Use `mcp__playwright__browser_console_messages` and `mcp__playwright__browser_network_requests` to debug +5. **Take screenshots** - Use `mcp__playwright__browser_take_screenshot` to visualize issues + +## When to Use This Skill + +Use this skill when you need to: +- Create new end-to-end tests for web features +- Debug or fix failing e2e tests +- Run e2e tests during development +- Understand the e2e testing architecture +- Set up test fixtures or mocks +- Work with Anvil blockchain state in tests diff --git a/.cursor/cli.json b/.cursor/cli.json new file mode 100644 index 00000000000..b50608cd785 --- /dev/null +++ b/.cursor/cli.json @@ -0,0 +1,21 @@ +{ + "version": 1, + "permissions": { + "deny": [ + "Read(**/.env)", + "Write(**/.env)", + "Read(~/.aws/**)", + "Write(~/.aws/**)", + "Read(~/.ssh/**)", + "Write(~/.ssh/**)", + "Read(~/.gnupg/**)", + "Write(~/.gnupg/**)", + "Read(~/.git-credentials)", + "Write(~/.git-credentials)", + "Read($HOME/Library/Keychains/**)", + "Write($HOME/Library/Keychains/**)", + "Read(/private/etc/**)", + "Write(/private/etc/**)" + ] + } + } diff --git a/.cursorignore b/.cursorignore new file mode 100644 index 00000000000..70179d19f2e --- /dev/null +++ b/.cursorignore @@ -0,0 +1,7 @@ +**/.env +**/.aws/** +**/.ssh/** +**/.gnupg/** +**/.git-credentials +**/Library/Keychains/** +**/private/etc/** diff --git a/.env.defaults b/.env.defaults index af00c667e56..d46cd294f96 100644 --- a/.env.defaults +++ b/.env.defaults @@ -24,6 +24,9 @@ TRADING_API_KEY=stored-in-.env.local FIREBASE_APP_CHECK_DEBUG_TOKEN=stored-in-.env.local INCLUDE_PROTOTYPE_FEATURES=stored-in-.env.local IS_E2E_TEST=false +ENABLE_SESSION_SERVICE=false +ENABLE_SESSION_UPGRADE_AUTO=false +ENABLE_ENTRY_GATEWAY_PROXY=false # URL overrides (keep empty in this file) AMPLITUDE_PROXY_URL_OVERRIDE= API_BASE_URL_OVERRIDE= @@ -34,5 +37,9 @@ SCANTASTIC_API_URL_OVERRIDE= STATSIG_PROXY_URL_OVERRIDE= TRADING_API_URL_OVERRIDE= UNITAGS_API_URL_OVERRIDE= +UNISWAP_NOTIF_API_BASE_URL_OVERRIDE= +ENTRY_GATEWAY_API_URL_OVERRIDE= +LIQUIDITY_SERVICE_URL_OVERRIDE= GH_TOKEN_RN_CLI= JUPITER_PROXY_URL= +BLOCKAID_PROXY_URL= diff --git a/.gitignore b/.gitignore index b3c573b208b..d284a0e6cc0 100644 --- a/.gitignore +++ b/.gitignore @@ -29,6 +29,7 @@ yarn-error.log* # local env files .env +.env.local .env.defaults.local # turbo @@ -50,6 +51,9 @@ packages/uniswap/src/i18n/locales/source/*_old.json # ci .ci-cache/ +# cli gh analysis artifacts +.analysis/ + # JetBrains .idea/ @@ -59,8 +63,11 @@ packages/uniswap/src/i18n/locales/source/*_old.json # CodeTours Extension .tours/* -# RNEF -.rnef/ +# Expo +.expo/ + +# auto-generated test ids +apps/mobile/.maestro/scripts/testIds.js # claude claude.local.md diff --git a/.nxignore b/.nxignore index 3e785b63ed7..52d9b176674 100644 --- a/.nxignore +++ b/.nxignore @@ -10,6 +10,7 @@ apps/extension/dev apps/extension/build packages/*/dist packages/*/types +dist/out-tsc # Ignore Generator Templates tools/**/generators/**/files diff --git a/CLAUDE.md b/CLAUDE.md index 00a8280afa0..7224bbdb032 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -44,6 +44,7 @@ bun extension build:production # Extension production ```bash bun g:test # Run all tests +bun notifications test # Run tests for a specific package (e.g. notifications) bun g:test:coverage # With coverage bun web playwright:test # Web E2E tests bun mobile e2e # Mobile E2E tests @@ -158,4 +159,4 @@ Be cognizant of the app or package within which a given change is being made. Be - If the user needs help with an Nx configuration or project graph error, use the `nx_workspace` tool to get any errors - \ No newline at end of file + diff --git a/CODEOWNERS b/CODEOWNERS deleted file mode 100644 index f70773659eb..00000000000 --- a/CODEOWNERS +++ /dev/null @@ -1 +0,0 @@ -* @uniswap/web-admins diff --git a/RELEASE b/RELEASE index 12680356c4b..a302b26e29b 100644 --- a/RELEASE +++ b/RELEASE @@ -1,63 +1,63 @@ -IPFS hash of the deployment: -- CIDv0: `QmUF5sYAgjigJ6D7nE6p12SG1rFrwYLidKxeX52qBN1Pce` -- CIDv1: `bafybeicxxeljdmh6f2s3xo43piks2h7ibgm6hbfoo3ftc5wjfmqfsngghm` - -The latest release is always mirrored at [app.uniswap.org](https://app.uniswap.org). - -You can also access the Uniswap Interface from an IPFS gateway. -**BEWARE**: The Uniswap interface uses [`localStorage`](https://developer.mozilla.org/en-US/docs/Web/API/Window/localStorage) to remember your settings, such as which tokens you have imported. -**You should always use an IPFS gateway that enforces origin separation**, or our hosted deployment of the latest release at [app.uniswap.org](https://app.uniswap.org). -Your Uniswap settings are never remembered across different URLs. - -IPFS gateways: -- https://bafybeicxxeljdmh6f2s3xo43piks2h7ibgm6hbfoo3ftc5wjfmqfsngghm.ipfs.dweb.link/ -- [ipfs://QmUF5sYAgjigJ6D7nE6p12SG1rFrwYLidKxeX52qBN1Pce/](ipfs://QmUF5sYAgjigJ6D7nE6p12SG1rFrwYLidKxeX52qBN1Pce/) - -## 5.116.0 (2025-10-28) - - -### Features - -* **web:** add activity table to the tab with real data (#23506) f00228c -* **web:** Add createRejectableMockConnector util to force tx rejection (#24574) 3b3b2b7 -* **web:** add demo account support for activity tab (#24639) 9ec0194 -* **web:** add disconnected portfolio view (#23690) 7a1b085 -* **web:** add fiat to price chart (#23577) fab99ce -* **web:** add hidden tokens table rows (#23535) 291fab3 -* **web:** add loading state to tokens table (#23544) ed5ced8 -* **web:** add more & better filtering + transaction parsing (#24579) 205c03d -* **web:** add v2 bridged asset banner (#24734) 4666868 -* **web:** disconnected view B version (#24630) 46ca828 -* **web:** Help Modal styling nits (#24547) ae252e6 -* **web:** NFTs tab (#23604) a438b54 -* **web:** small style nits for Company menu (#24318) 4d71e08 -* **web:** special case metamask dual vm connection flow (#24756) faabc72 -* **web:** tokens table search (#23509) b83fc75 -* **web:** update CompanyMenu arrangement on tablet width (#24312) 758f68d - - -### Bug Fixes - -* **web:** default to mainnet for limits flow [STAGING] (#24885) 5a8e150 -* **web:** Fix CreatePosition e2e anvil test (#24573) d68b011 -* **web:** Fix e2e anvil tests missing quote stub (#24590) 838d5bd -* **web:** Fix limit order chain switch bug (#23064) b11176d -* **web:** Fix Swap e2e anvil tests (#24662) 26adf5c -* **web:** fixes pools tab loader skeletons (#24472) 2f887aa -* **web:** Increase anvil manager timeout (#24623) 466eb69 -* **web:** log interface swap finalization results for flashblocks (#24869) bf30270 -* **web:** support chain filtering query params (#24754) 4bc3729 -* **web:** update the create flow to display the latest dependnet amount (#24676) 168c20a -* **web:** Use Mainnet instead of Base for e2e test commands (#24589) ff7dfee - - -### Continuous Integration - -* **web:** update sitemaps 4e8124b - - -### Tests - -* **web:** Disable anvil snapshots by default (#24666) 1a2903c - - +IPFS hash of the deployment: +- CIDv0: `QmUF5sYAgjigJ6D7nE6p12SG1rFrwYLidKxeX52qBN1Pce` +- CIDv1: `bafybeicxxeljdmh6f2s3xo43piks2h7ibgm6hbfoo3ftc5wjfmqfsngghm` + +The latest release is always mirrored at [app.uniswap.org](https://app.uniswap.org). + +You can also access the Uniswap Interface from an IPFS gateway. +**BEWARE**: The Uniswap interface uses [`localStorage`](https://developer.mozilla.org/en-US/docs/Web/API/Window/localStorage) to remember your settings, such as which tokens you have imported. +**You should always use an IPFS gateway that enforces origin separation**, or our hosted deployment of the latest release at [app.uniswap.org](https://app.uniswap.org). +Your Uniswap settings are never remembered across different URLs. + +IPFS gateways: +- https://bafybeicxxeljdmh6f2s3xo43piks2h7ibgm6hbfoo3ftc5wjfmqfsngghm.ipfs.dweb.link/ +- [ipfs://QmUF5sYAgjigJ6D7nE6p12SG1rFrwYLidKxeX52qBN1Pce/](ipfs://QmUF5sYAgjigJ6D7nE6p12SG1rFrwYLidKxeX52qBN1Pce/) + +## 5.116.0 (2025-10-28) + + +### Features + +* **web:** add activity table to the tab with real data (#23506) f00228c +* **web:** Add createRejectableMockConnector util to force tx rejection (#24574) 3b3b2b7 +* **web:** add demo account support for activity tab (#24639) 9ec0194 +* **web:** add disconnected portfolio view (#23690) 7a1b085 +* **web:** add fiat to price chart (#23577) fab99ce +* **web:** add hidden tokens table rows (#23535) 291fab3 +* **web:** add loading state to tokens table (#23544) ed5ced8 +* **web:** add more & better filtering + transaction parsing (#24579) 205c03d +* **web:** add v2 bridged asset banner (#24734) 4666868 +* **web:** disconnected view B version (#24630) 46ca828 +* **web:** Help Modal styling nits (#24547) ae252e6 +* **web:** NFTs tab (#23604) a438b54 +* **web:** small style nits for Company menu (#24318) 4d71e08 +* **web:** special case metamask dual vm connection flow (#24756) faabc72 +* **web:** tokens table search (#23509) b83fc75 +* **web:** update CompanyMenu arrangement on tablet width (#24312) 758f68d + + +### Bug Fixes + +* **web:** default to mainnet for limits flow [STAGING] (#24885) 5a8e150 +* **web:** Fix CreatePosition e2e anvil test (#24573) d68b011 +* **web:** Fix e2e anvil tests missing quote stub (#24590) 838d5bd +* **web:** Fix limit order chain switch bug (#23064) b11176d +* **web:** Fix Swap e2e anvil tests (#24662) 26adf5c +* **web:** fixes pools tab loader skeletons (#24472) 2f887aa +* **web:** Increase anvil manager timeout (#24623) 466eb69 +* **web:** log interface swap finalization results for flashblocks (#24869) bf30270 +* **web:** support chain filtering query params (#24754) 4bc3729 +* **web:** update the create flow to display the latest dependnet amount (#24676) 168c20a +* **web:** Use Mainnet instead of Base for e2e test commands (#24589) ff7dfee + + +### Continuous Integration + +* **web:** update sitemaps 4e8124b + + +### Tests + +* **web:** Disable anvil snapshots by default (#24666) 1a2903c + + diff --git a/apps/api-self-serve/.eslintrc.js b/apps/api-self-serve/.eslintrc.js new file mode 100644 index 00000000000..bc045be8575 --- /dev/null +++ b/apps/api-self-serve/.eslintrc.js @@ -0,0 +1,44 @@ +const restrictedGlobals = require('confusing-browser-globals') +const rulesDirPlugin = require('eslint-plugin-rulesdir') +rulesDirPlugin.RULES_DIR = '../../packages/uniswap/eslint_rules' + +module.exports = { + root: true, + extends: ['@uniswap/eslint-config/extension'], + plugins: ['rulesdir'], + ignorePatterns: [ + 'node_modules', + '.react-router', + 'dist', + 'build', + '.eslintrc.js', + 'manifest.json', + '.nx', + 'vite.config.ts', + ], + parserOptions: { + project: 'tsconfig.eslint.json', + tsconfigRootDir: __dirname, + ecmaFeatures: { + jsx: true, + }, + ecmaVersion: 2018, + sourceType: 'module', + }, + rules: { + 'rulesdir/i18n': 'error', + }, + overrides: [ + { + files: ['*.ts', '*.tsx'], + rules: { + 'no-relative-import-paths/no-relative-import-paths': [ + 'error', + { + allowSameFolder: false, + }, + ], + }, + }, + ], +} diff --git a/apps/api-self-serve/.gitignore b/apps/api-self-serve/.gitignore new file mode 100644 index 00000000000..039ee62d21a --- /dev/null +++ b/apps/api-self-serve/.gitignore @@ -0,0 +1,7 @@ +.DS_Store +.env +/node_modules/ + +# React Router +/.react-router/ +/build/ diff --git a/apps/api-self-serve/README.md b/apps/api-self-serve/README.md new file mode 100644 index 00000000000..25d1b31c061 --- /dev/null +++ b/apps/api-self-serve/README.md @@ -0,0 +1 @@ +# API Self Serve Portal diff --git a/apps/api-self-serve/app/app.css b/apps/api-self-serve/app/app.css new file mode 100644 index 00000000000..abd90f244db --- /dev/null +++ b/apps/api-self-serve/app/app.css @@ -0,0 +1,170 @@ +@import "tailwindcss/preflight"; +@import "tailwindcss"; +@plugin "tailwindcss-animate"; +@tailwind utilities; +@config "../tailwind.config.ts"; + +@custom-variant dark (&:is(.dark *)); + +@font-face { + font-family: "Basel Grotesk"; + src: url("https://app.uniswap.org/fonts/Basel-Grotesk-Book.woff2") + format("woff2"); + font-weight: 485; + font-style: normal; + font-display: swap; + -webkit-font-smoothing: antialiased; + text-rendering: optimizeLegibility; +} + +@font-face { + font-family: "Basel Grotesk"; + src: url("https://app.uniswap.org/fonts/Basel-Grotesk-Medium.woff2") + format("woff2"); + font-weight: 535; + font-style: normal; + font-display: swap; + -webkit-font-smoothing: antialiased; + text-rendering: optimizeLegibility; +} + +@layer base { + html, body { + @apply bg-background text-foreground font-basel; + } + * { + @apply border-border outline-ring/50; + } +} + +/* Light mode is the default */ +:root { + color-scheme: light; + --font-basel: "Basel Grotesk"; + /* Light mode shadows */ + --shadow-short: + 0px 1px 6px 2px rgba(0, 0, 0, 0.03), 0px 1px 2px 0px rgba(0, 0, 0, 0.02); + --shadow-medium: + 0px 6px 12px -3px rgba(19, 19, 19, 0.04), + 0px 2px 5px -2px rgba(19, 19, 19, 0.03); + --shadow-large: + 0px 10px 20px -5px rgba(19, 19, 19, 0.05), + 0px 4px 12px -3px rgba(19, 19, 19, 0.04); + /*shadcn*/ + --radius: 0.625rem; + --background: oklch(1 0 0); + --foreground: oklch(0.145 0 0); + --card: oklch(1 0 0); + --card-foreground: oklch(0.145 0 0); + --popover: oklch(1 0 0); + --popover-foreground: oklch(0.145 0 0); + --primary: oklch(0.205 0 0); + --primary-foreground: oklch(0.985 0 0); + --secondary: oklch(0.97 0 0); + --secondary-foreground: oklch(0.205 0 0); + --muted: oklch(0.97 0 0); + --muted-foreground: oklch(0.556 0 0); + --accent: oklch(0.97 0 0); + --accent-foreground: oklch(0.205 0 0); + --destructive: oklch(0.577 0.245 27.325); + --border: oklch(0.922 0 0); + --input: oklch(0.922 0 0); + --ring: oklch(0.708 0 0); + --chart-1: oklch(0.646 0.222 41.116); + --chart-2: oklch(0.6 0.118 184.704); + --chart-3: oklch(0.398 0.07 227.392); + --chart-4: oklch(0.828 0.189 84.429); + --chart-5: oklch(0.769 0.188 70.08); + --sidebar: oklch(0.985 0 0); + --sidebar-foreground: oklch(0.145 0 0); + --sidebar-primary: oklch(0.205 0 0); + --sidebar-primary-foreground: oklch(0.985 0 0); + --sidebar-accent: oklch(0.97 0 0); + --sidebar-accent-foreground: oklch(0.205 0 0); + --sidebar-border: oklch(0.922 0 0); + --sidebar-ring: oklch(0.708 0 0); +} + +/* Dark mode applies when .dark class is present */ +.dark { + color-scheme: dark; + /* Dark mode shadows */ + --shadow-short: + 0px 1px 3px 0px rgba(0, 0, 0, 0.12), 0px 1px 2px 0px rgba(0, 0, 0, 0.24); + --shadow-medium: + 0px 10px 15px -3px rgba(19, 19, 19, 0.54), + 0px 4px 6px -2px rgba(19, 19, 19, 0.4); + --shadow-large: + 0px 16px 24px -6px rgba(0, 0, 0, 0.6), 0px 8px 12px -4px rgba(0, 0, 0, 0.48); + /*shadcn*/ + --background: oklch(0.145 0 0); + --foreground: oklch(0.985 0 0); + --card: oklch(0.205 0 0); + --card-foreground: oklch(0.985 0 0); + --popover: oklch(0.205 0 0); + --popover-foreground: oklch(0.985 0 0); + --primary: oklch(0.922 0 0); + --primary-foreground: oklch(0.205 0 0); + --secondary: oklch(0.269 0 0); + --secondary-foreground: oklch(0.985 0 0); + --muted: oklch(0.269 0 0); + --muted-foreground: oklch(0.708 0 0); + --accent: oklch(0.269 0 0); + --accent-foreground: oklch(0.985 0 0); + --destructive: oklch(0.704 0.191 22.216); + --border: oklch(1 0 0 / 10%); + --input: oklch(1 0 0 / 15%); + --ring: oklch(0.556 0 0); + --chart-1: oklch(0.488 0.243 264.376); + --chart-2: oklch(0.696 0.17 162.48); + --chart-3: oklch(0.769 0.188 70.08); + --chart-4: oklch(0.627 0.265 303.9); + --chart-5: oklch(0.645 0.246 16.439); + --sidebar: oklch(0.205 0 0); + --sidebar-foreground: oklch(0.985 0 0); + --sidebar-primary: oklch(0.488 0.243 264.376); + --sidebar-primary-foreground: oklch(0.985 0 0); + --sidebar-accent: oklch(0.269 0 0); + --sidebar-accent-foreground: oklch(0.985 0 0); + --sidebar-border: oklch(1 0 0 / 10%); + --sidebar-ring: oklch(0.556 0 0); +} + +/*shadcn*/ +@theme inline { + --radius-sm: calc(var(--radius) - 4px); + --radius-md: calc(var(--radius) - 2px); + --radius-lg: var(--radius); + --radius-xl: calc(var(--radius) + 4px); + --color-background: var(--background); + --color-foreground: var(--foreground); + --color-card: var(--card); + --color-card-foreground: var(--card-foreground); + --color-popover: var(--popover); + --color-popover-foreground: var(--popover-foreground); + --color-primary: var(--primary); + --color-primary-foreground: var(--primary-foreground); + --color-secondary: var(--secondary); + --color-secondary-foreground: var(--secondary-foreground); + --color-muted: var(--muted); + --color-muted-foreground: var(--muted-foreground); + --color-accent: var(--accent); + --color-accent-foreground: var(--accent-foreground); + --color-destructive: var(--destructive); + --color-border: var(--border); + --color-input: var(--input); + --color-ring: var(--ring); + --color-chart-1: var(--chart-1); + --color-chart-2: var(--chart-2); + --color-chart-3: var(--chart-3); + --color-chart-4: var(--chart-4); + --color-chart-5: var(--chart-5); + --color-sidebar: var(--sidebar); + --color-sidebar-foreground: var(--sidebar-foreground); + --color-sidebar-primary: var(--sidebar-primary); + --color-sidebar-primary-foreground: var(--sidebar-primary-foreground); + --color-sidebar-accent: var(--sidebar-accent); + --color-sidebar-accent-foreground: var(--sidebar-accent-foreground); + --color-sidebar-border: var(--sidebar-border); + --color-sidebar-ring: var(--sidebar-ring); +} diff --git a/apps/api-self-serve/app/lib/utils.ts b/apps/api-self-serve/app/lib/utils.ts new file mode 100644 index 00000000000..d32b0fe652e --- /dev/null +++ b/apps/api-self-serve/app/lib/utils.ts @@ -0,0 +1,6 @@ +import { type ClassValue, clsx } from 'clsx' +import { twMerge } from 'tailwind-merge' + +export function cn(...inputs: ClassValue[]) { + return twMerge(clsx(inputs)) +} diff --git a/apps/api-self-serve/app/root.tsx b/apps/api-self-serve/app/root.tsx new file mode 100644 index 00000000000..9b3208dc36b --- /dev/null +++ b/apps/api-self-serve/app/root.tsx @@ -0,0 +1,53 @@ +import { isRouteErrorResponse, Links, Meta, Outlet, Scripts, ScrollRestoration } from 'react-router' +import type { Route } from './+types/root' +import './app.css' + +export const links: Route.LinksFunction = () => [] + +export function Layout({ children }: { children: React.ReactNode }) { + return ( + + + + + + + + + {children} + + + + + ) +} + +export default function App() { + return +} + +export function ErrorBoundary({ error }: Route.ErrorBoundaryProps) { + let message = 'Oops!' + let details = 'An unexpected error occurred.' + let stack: string | undefined + + if (isRouteErrorResponse(error)) { + message = error.status === 404 ? '404' : 'Error' + details = error.status === 404 ? 'The requested page could not be found.' : error.statusText || details + } else if (import.meta.env.DEV && error && error instanceof Error) { + details = error.message + stack = error.stack + } + + return ( +

+

{message}

+

{details}

+ {stack && ( +
+          {stack}
+        
+ )} +
+ ) +} diff --git a/apps/api-self-serve/app/routes.ts b/apps/api-self-serve/app/routes.ts new file mode 100644 index 00000000000..10d7044bf99 --- /dev/null +++ b/apps/api-self-serve/app/routes.ts @@ -0,0 +1,3 @@ +import { index, type RouteConfig } from '@react-router/dev/routes' + +export default [index('routes/home.tsx')] satisfies RouteConfig diff --git a/apps/api-self-serve/app/routes/home.tsx b/apps/api-self-serve/app/routes/home.tsx new file mode 100644 index 00000000000..c6316aae628 --- /dev/null +++ b/apps/api-self-serve/app/routes/home.tsx @@ -0,0 +1,11 @@ +import { Welcome } from '~/welcome/welcome' +import type { Route } from './+types/home' + +// biome-ignore lint/correctness/noEmptyPattern: this will likely be updated. this is ootb from the create react router app tool. +export function meta({}: Route.MetaArgs) { + return [{ title: 'New React Router App' }, { name: 'description', content: 'Welcome to React Router!' }] +} + +export default function Home() { + return +} diff --git a/apps/api-self-serve/app/welcome/logo-dark.svg b/apps/api-self-serve/app/welcome/logo-dark.svg new file mode 100644 index 00000000000..dd820289447 --- /dev/null +++ b/apps/api-self-serve/app/welcome/logo-dark.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/api-self-serve/app/welcome/logo-light.svg b/apps/api-self-serve/app/welcome/logo-light.svg new file mode 100644 index 00000000000..73284929d36 --- /dev/null +++ b/apps/api-self-serve/app/welcome/logo-light.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/api-self-serve/app/welcome/welcome.tsx b/apps/api-self-serve/app/welcome/welcome.tsx new file mode 100644 index 00000000000..92555f1574a --- /dev/null +++ b/apps/api-self-serve/app/welcome/welcome.tsx @@ -0,0 +1,80 @@ +/** biome-ignore-all lint/correctness/noRestrictedElements: this will be removed, it's default template */ +import logoDark from './logo-dark.svg' +import logoLight from './logo-light.svg' + +export function Welcome() { + return ( +
+ +
+ ) +} + +const resources = [ + { + href: 'https://reactrouter.com/docs', + text: 'React Router Docs', + icon: ( + + + + ), + }, + { + href: 'https://rmx.as/discord', + text: 'Join Discord', + icon: ( + + + + ), + }, +] diff --git a/apps/api-self-serve/components.json b/apps/api-self-serve/components.json new file mode 100644 index 00000000000..d0a566ccc19 --- /dev/null +++ b/apps/api-self-serve/components.json @@ -0,0 +1,22 @@ +{ + "$schema": "https://ui.shadcn.com/schema.json", + "style": "new-york", + "rsc": false, + "tsx": true, + "tailwind": { + "config": "tailwind.config.ts", + "css": "app/app.css", + "baseColor": "neutral", + "cssVariables": true, + "prefix": "" + }, + "iconLibrary": "lucide", + "aliases": { + "components": "~/components", + "utils": "~/lib/utils", + "ui": "~/components/ui", + "lib": "~/lib", + "hooks": "~/hooks" + }, + "registries": {} +} diff --git a/apps/api-self-serve/package.json b/apps/api-self-serve/package.json new file mode 100644 index 00000000000..17c95e0eca3 --- /dev/null +++ b/apps/api-self-serve/package.json @@ -0,0 +1,36 @@ +{ + "name": "api-self-serve", + "private": true, + "type": "module", + "scripts": { + "build": "react-router build", + "dev": "react-router dev", + "start": "react-router-serve ./build/server/index.js", + "typecheck": "react-router typegen && tsc" + }, + "dependencies": { + "@react-router/node": "7.6.3", + "@react-router/serve": "7.6.3", + "class-variance-authority": "0.7.1", + "clsx": "2.1.1", + "isbot": "5.1.31", + "lucide-react": "0.548.0", + "react": "19.0.0", + "react-dom": "19.0.0", + "react-router": "7.6.3", + "tailwind-merge": "3.3.1", + "tailwindcss-animate": "1.0.7" + }, + "devDependencies": { + "@react-router/dev": "7.6.3", + "@tailwindcss/vite": "4.1.13", + "@types/node": "22.13.1", + "@types/react": "19.0.10", + "@uniswap/eslint-config": "workspace:^", + "eslint": "8.57.1", + "tailwindcss": "4.1.16", + "typescript": "5.8.3", + "vite": "npm:rolldown-vite@7.0.10", + "vite-tsconfig-paths": "5.1.4" + } +} diff --git a/apps/api-self-serve/react-router.config.ts b/apps/api-self-serve/react-router.config.ts new file mode 100644 index 00000000000..6ff16f91779 --- /dev/null +++ b/apps/api-self-serve/react-router.config.ts @@ -0,0 +1,7 @@ +import type { Config } from "@react-router/dev/config"; + +export default { + // Config options... + // Server-side render by default, to enable SPA mode set this to `false` + ssr: true, +} satisfies Config; diff --git a/apps/api-self-serve/tailwind.config.ts b/apps/api-self-serve/tailwind.config.ts new file mode 100644 index 00000000000..8135de497d5 --- /dev/null +++ b/apps/api-self-serve/tailwind.config.ts @@ -0,0 +1,430 @@ +import type { Config } from 'tailwindcss' +import tailwindAnimate from 'tailwindcss-animate' + +export default { + darkMode: 'class', + content: [ + './pages/**/*.{js,ts,jsx,tsx,mdx}', + './components/**/*.{js,ts,jsx,tsx,mdx}', + './app/**/*.{js,ts,jsx,tsx,mdx}', + './registry/**/*.{js,ts,jsx,tsx,mdx}', + ], + theme: { + extend: { + fontFamily: { + basel: ['var(--font-basel)', 'sans-serif'], + baselBook: [ + 'Basel Grotesk Book', + '-apple-system', + 'system-ui', + 'BlinkMacSystemFont', + 'Segoe UI', + 'Roboto', + 'Helvetica', + 'Arial', + 'sans-serif', + ], + baselMedium: [ + 'Basel Grotesk Medium', + '-apple-system', + 'system-ui', + 'BlinkMacSystemFont', + 'Segoe UI', + 'Roboto', + 'Helvetica', + 'Arial', + 'sans-serif', + ], + mono: ['InputMono-Regular', 'monospace'], + }, + fontWeight: { + book: '485', + medium: '535', + }, + screens: { + xxs: '360px', + xs: '380px', + sm: '450px', + md: '640px', + lg: '768px', + xl: '1024px', + xxl: '1280px', + xxxl: '1536px', + 'h-short': { raw: '(max-height: 736px)' }, + 'h-mid': { raw: '(max-height: 800px)' }, + }, + fontSize: { + // Headings + 'heading-1': [ + '52px', + { + lineHeight: '60px', + letterSpacing: '-0.02em', + fontWeight: '485', + }, + ], + 'heading-2': [ + '36px', + { + lineHeight: '44px', + letterSpacing: '-0.01em', + fontWeight: '485', + }, + ], + 'heading-3': [ + '24px', + { + lineHeight: '32px', + letterSpacing: '-0.005em', + fontWeight: '485', + }, + ], + // Subheadings + 'subheading-1': [ + '18px', + { + lineHeight: '24px', + fontWeight: '485', + }, + ], + 'subheading-2': [ + '16px', + { + lineHeight: '24px', + fontWeight: '485', + }, + ], + // Body + 'body-1': [ + '18px', + { + lineHeight: '24px', + fontWeight: '485', + }, + ], + 'body-2': [ + '16px', + { + lineHeight: '24px', + fontWeight: '485', + }, + ], + 'body-3': [ + '14px', + { + lineHeight: '20px', + fontWeight: '485', + }, + ], + 'body-4': [ + '12px', + { + lineHeight: '16px', + fontWeight: '485', + }, + ], + // Button Labels + 'button-1': [ + '18px', + { + lineHeight: '24px', + fontWeight: '535', + }, + ], + 'button-2': [ + '16px', + { + lineHeight: '24px', + fontWeight: '535', + }, + ], + 'button-3': [ + '14px', + { + lineHeight: '20px', + fontWeight: '535', + }, + ], + 'button-4': [ + '12px', + { + lineHeight: '16px', + fontWeight: '535', + }, + ], + }, + colors: { + // Base colors + white: '#FFFFFF', + black: '#000000', + + // Semantic colors for light theme + background: { + DEFAULT: '#FFFFFF', // colors.white + dark: '#000000', // colors.black + }, + + // Neutral colors with semantic naming + neutral1: { + DEFAULT: '#222222', // neutral1_light + dark: '#FFFFFF', // neutral1_dark + }, + neutral2: { + DEFAULT: '#7D7D7D', // neutral2_light + dark: '#9B9B9B', // neutral2_dark + }, + neutral3: { + DEFAULT: '#CECECE', // neutral3_light + dark: '#5E5E5E', // neutral3_dark + }, + + // Surface colors with semantic naming + surface1: { + DEFAULT: '#FFFFFF', // surface1_light + dark: '#131313', // surface1_dark + hovered: { + DEFAULT: '#F5F5F5', // surface1_hovered_light + dark: '#181818', // surface1_hovered_dark + }, + }, + surface2: { + DEFAULT: '#F9F9F9', // surface2_light + dark: '#1B1B1B', // surface2_dark + hovered: { + DEFAULT: '#F2F2F2', // surface2_hovered_light + dark: '#242424', // surface2_hovered_dark + }, + }, + surface3: { + DEFAULT: '#22222212', // surface3_light + dark: '#FFFFFF12', // surface3_dark + hovered: { + DEFAULT: 'rgba(34, 34, 34, 0.12)', // surface3_hovered_light + dark: 'rgba(255, 255, 255, 0.16)', // surface3_hovered_dark + }, + }, + surface4: { + DEFAULT: '#FFFFFF64', // surface4_light + dark: '#FFFFFF20', // surface4_dark + }, + surface5: { + DEFAULT: '#00000004', // surface5_light + dark: '#00000004', // surface5_dark + }, + + // Accent colors with semantic naming + accent1: { + DEFAULT: '#FC72FF', // accent1_light + dark: '#FC72FF', // accent1_dark + }, + accent2: { + DEFAULT: '#FFEFFF', // accent2_light + dark: '#311C31', // accent2_dark + }, + accent3: { + DEFAULT: '#4C82FB', // accent3_light + dark: '#4C82FB', // accent3_dark + }, + + // Token colors + token0: { + DEFAULT: '#FC72FF', // token0 in light theme + dark: '#FC72FF', // token0 in dark theme + }, + token1: { + DEFAULT: '#4C82FB', // token1 in light theme + dark: '#4C82FB', // token1 in dark theme + }, + + // Status colors + success: { + DEFAULT: '#40B66B', // success + }, + critical: { + DEFAULT: '#FF5F52', // critical + secondary: { + DEFAULT: '#FFF2F1', // critical2_light + dark: '#2E0805', // critical2_dark + }, + }, + warning: { + DEFAULT: '#EEB317', // gold200 + }, + + // Network colors + network: { + ethereum: '#627EEA', + optimism: '#FF0420', + polygon: '#A457FF', + arbitrum: '#28A0F0', + bsc: '#F0B90B', + base: '#0052FF', + blast: '#FCFC03', + }, + + // Gray palette + gray: { + 50: '#F5F6FC', + 100: '#E8ECFB', + 150: '#D2D9EE', + 200: '#B8C0DC', + 250: '#A6AFCA', + 300: '#98A1C0', + 350: '#888FAB', + 400: '#7780A0', + 450: '#6B7594', + 500: '#5D6785', + 550: '#505A78', + 600: '#404A67', + 650: '#333D59', + 700: '#293249', + 750: '#1B2236', + 800: '#131A2A', + 850: '#0E1524', + 900: '#0D111C', + 950: '#080B11', + }, + + // Pink palette + pink: { + 50: '#F9ECF1', + 100: '#FFD9E4', + 200: '#FBA4C0', + 300: '#FF6FA3', + 400: '#FB118E', + 500: '#C41969', + 600: '#8C0F49', + 700: '#55072A', + 800: '#350318', + 900: '#2B000B', + vibrant: '#F50DB4', + base: '#FC74FE', + }, + + // Red palette + red: { + 50: '#FAECEA', + 100: '#FED5CF', + 200: '#FEA79B', + 300: '#FD766B', + 400: '#FA2B39', + 500: '#C4292F', + 600: '#891E20', + 700: '#530F0F', + 800: '#380A03', + 900: '#240800', + vibrant: '#F14544', + }, + + // Additional color palettes + yellow: { + 50: '#F6F2D5', + 100: '#DBBC19', + 200: '#DBBC19', + 300: '#BB9F13', + 400: '#A08116', + 500: '#866311', + 600: '#5D4204', + 700: '#3E2B04', + 800: '#231902', + 900: '#180F02', + vibrant: '#FAF40A', + }, + + green: { + 50: '#E3F3E6', + 100: '#BFEECA', + 200: '#76D191', + 300: '#40B66B', + 400: '#209853', + 500: '#0B783E', + 600: '#0C522A', + 700: '#053117', + 800: '#091F10', + 900: '#09130B', + vibrant: '#5CFE9D', + }, + + blue: { + 50: '#EDEFF8', + 100: '#DEE1FF', + 200: '#ADBCFF', + 300: '#869EFF', + 400: '#4C82FB', + 500: '#1267D6', + 600: '#1D4294', + 700: '#09265E', + 800: '#0B193F', + 900: '#040E34', + vibrant: '#587BFF', + }, + + gold: { + 200: '#EEB317', + 400: '#B17900', + vibrant: '#FEB239', + }, + + magenta: { + 300: '#FD82FF', + vibrant: '#FC72FF', + }, + + purple: { + 300: '#8440F2', + 900: '#1C0337', + vibrant: '#6100FF', + }, + + // Legacy colors mapping (for compatibility) + border: '#F9F9F9', + input: '#F9F9F9', + ring: '#222222', + foreground: '#222222', + card: { + DEFAULT: '#FFFFFF', + foreground: '#222222', + }, + popover: { + DEFAULT: '#FFFFFF', + foreground: '#222222', + }, + primary: { + DEFAULT: '#222222', + foreground: '#F9F9F9', + }, + secondary: { + DEFAULT: '#F9F9F9', + foreground: '#222222', + }, + muted: { + DEFAULT: '#F9F9F9', + foreground: '#7D7D7D', + }, + destructive: { + DEFAULT: '#FF5F52', + foreground: '#F9F9F9', + }, + scrim: 'rgba(0, 0, 0, 0.60)', + }, + borderRadius: { + none: '0px', + rounded4: '4px', + rounded6: '6px', + rounded8: '8px', + rounded12: '12px', + rounded16: '16px', + rounded20: '20px', + rounded24: '24px', + rounded32: '32px', + roundedFull: '999999px', + }, + boxShadow: { + short: 'var(--shadow-short)', + medium: 'var(--shadow-medium)', + large: 'var(--shadow-large)', + }, + }, + }, + plugins: [tailwindAnimate], +} satisfies Config diff --git a/apps/api-self-serve/tsconfig.eslint.json b/apps/api-self-serve/tsconfig.eslint.json new file mode 100644 index 00000000000..0af7bb26f3f --- /dev/null +++ b/apps/api-self-serve/tsconfig.eslint.json @@ -0,0 +1,5 @@ +// same as tsconfig.json but without references which caused performance issues with typescript-eslint +{ + "extends": "./tsconfig.json", + "references": [] +} diff --git a/apps/api-self-serve/tsconfig.json b/apps/api-self-serve/tsconfig.json new file mode 100644 index 00000000000..a0d80e99890 --- /dev/null +++ b/apps/api-self-serve/tsconfig.json @@ -0,0 +1,23 @@ +{ + "include": ["**/*", "**/.server/**/*", "**/.client/**/*", ".react-router/types/**/*"], + "exclude": ["tools/**/*"], + "compilerOptions": { + "lib": ["DOM", "DOM.Iterable", "ES2022"], + "types": ["node", "vite/client"], + "target": "ES2022", + "module": "ES2022", + "moduleResolution": "bundler", + "jsx": "react-jsx", + "rootDirs": [".", "./.react-router/types"], + "baseUrl": ".", + "paths": { + "~/*": ["./app/*"] + }, + "esModuleInterop": true, + "verbatimModuleSyntax": true, + "noEmit": true, + "resolveJsonModule": true, + "skipLibCheck": true, + "strict": true + } +} diff --git a/apps/api-self-serve/vite.config.ts b/apps/api-self-serve/vite.config.ts new file mode 100644 index 00000000000..e0925ec7ad1 --- /dev/null +++ b/apps/api-self-serve/vite.config.ts @@ -0,0 +1,15 @@ +import { reactRouter } from '@react-router/dev/vite' +import tailwindcss from '@tailwindcss/vite' +import { defineConfig } from 'vite' +import tsconfigPaths from 'vite-tsconfig-paths' + +export default defineConfig({ + plugins: [ + tailwindcss(), + reactRouter(), + tsconfigPaths({ + // ignores tsconfig files in Nx generator template directories + skip: (dir) => dir.includes('files'), + }), + ], +}) diff --git a/apps/cli/.eslintrc.cjs b/apps/cli/.eslintrc.cjs new file mode 100644 index 00000000000..e2b34a6c0b6 --- /dev/null +++ b/apps/cli/.eslintrc.cjs @@ -0,0 +1,45 @@ +module.exports = { + root: true, + extends: ['@uniswap/eslint-config/native', '@uniswap/eslint-config/webPlatform'], + ignorePatterns: [ + 'node_modules', + '.turbo', + '.eslintrc.js', + 'vitest.config.ts', + 'codegen.ts', + '.nx', + 'scripts', + 'dist', + 'src/**/__generated__', + ], + parserOptions: { + project: 'tsconfig.lint.json', + tsconfigRootDir: __dirname, + ecmaFeatures: { + jsx: true, + }, + ecmaVersion: 2018, + sourceType: 'module', + }, + overrides: [ + { + files: ['src/index.ts'], + rules: { + 'check-file/no-index': 'off', + }, + }, + { + files: ['*.ts', '*.tsx'], + rules: { + 'no-relative-import-paths/no-relative-import-paths': [ + 'error', + { + allowSameFolder: false, + prefix: '@universe/cli', + }, + ], + }, + }, + ], + rules: {}, +} diff --git a/apps/cli/README.md b/apps/cli/README.md new file mode 100644 index 00000000000..ce9112633d7 --- /dev/null +++ b/apps/cli/README.md @@ -0,0 +1,2 @@ +# @universe/cli + diff --git a/apps/cli/package.json b/apps/cli/package.json new file mode 100644 index 00000000000..86b22c11c5c --- /dev/null +++ b/apps/cli/package.json @@ -0,0 +1,38 @@ +{ + "name": "@universe/cli", + "version": "0.0.0", + "type": "module", + "dependencies": { + "@ai-sdk/anthropic": "2.0.41", + "ai": "5.0.87", + "ink": "5.2.1", + "ink-box": "2.0.0", + "ink-select-input": "6.2.0", + "ink-spinner": "5.0.0", + "ink-text-input": "6.0.0", + "react": "19.0.0" + }, + "devDependencies": { + "@types/bun": "1.3.1", + "@types/node": "22.13.1", + "@types/react": "19.0.10", + "@uniswap/eslint-config": "workspace:^", + "depcheck": "1.4.7", + "eslint": "8.57.1", + "ink-gradient": "3.0.0", + "typescript": "5.8.3" + }, + "scripts": { + "dev": "bun run --watch src/cli-ui.tsx", + "lint:biome": "nx lint:biome cli", + "lint:biome:fix": "nx lint:biome:fix cli", + "lint": "nx lint cli", + "lint:fix": "nx lint:fix cli" + }, + "nx": { + "includedScripts": [] + }, + "main": "src/index.ts", + "private": true, + "sideEffects": false +} diff --git a/apps/cli/project.json b/apps/cli/project.json new file mode 100644 index 00000000000..a9dc79ffbd2 --- /dev/null +++ b/apps/cli/project.json @@ -0,0 +1,19 @@ +{ + "name": "@universe/cli", + "$schema": "../../node_modules/nx/schemas/project-schema.json", + "sourceRoot": "apps/cli/src", + "projectType": "application", + "tags": [], + "targets": { + "build": { + "executor": "nx:noop" + }, + "typecheck": {}, + "lint:biome": {}, + "lint:biome:fix": {}, + "lint:eslint": {}, + "lint:eslint:fix": {}, + "lint": {}, + "lint:fix": {} + } +} diff --git a/apps/cli/src/cli-ui.tsx b/apps/cli/src/cli-ui.tsx new file mode 100644 index 00000000000..731955fdc03 --- /dev/null +++ b/apps/cli/src/cli-ui.tsx @@ -0,0 +1,27 @@ +#!/usr/bin/env bun +import { App } from '@universe/cli/src/ui/App' +import { render } from 'ink' +// Ensure React is loaded before ink +import React from 'react' + +export async function runUI(): Promise { + // Check for API key + if (!process.env.ANTHROPIC_API_KEY) { + // eslint-disable-next-line no-console + console.error('Error: ANTHROPIC_API_KEY environment variable is required') + // eslint-disable-next-line no-console + console.error('Get your API key from: https://console.anthropic.com/') + process.exit(1) + } + + render(React.createElement(App)) +} + +// Run if executed directly +if (import.meta.main) { + runUI().catch((error) => { + // eslint-disable-next-line no-console + console.error('Unhandled error:', error) + process.exit(1) + }) +} diff --git a/apps/cli/src/cli.ts b/apps/cli/src/cli.ts new file mode 100644 index 00000000000..3ac8f3939b9 --- /dev/null +++ b/apps/cli/src/cli.ts @@ -0,0 +1,429 @@ +#!/usr/bin/env bun +/* eslint-disable complexity */ +import { type CollectOptions } from '@universe/cli/src/core/data-collector' +import { Orchestrator, type OrchestratorConfig, type OutputConfig } from '@universe/cli/src/core/orchestrator' +import { createVercelAIProvider } from '@universe/cli/src/lib/ai-provider-vercel' +import { SqliteCacheProvider } from '@universe/cli/src/lib/cache-provider-sqlite' +import { ConsoleLogger, type Logger } from '@universe/cli/src/lib/logger' +import { parseReleaseIdentifier, ReleaseScanner } from '@universe/cli/src/lib/release-scanner' +import { detectRepository, resolveTeam } from '@universe/cli/src/lib/team-resolver' +import { parseArgs } from 'util' + +/* eslint-disable no-console */ + +// ============================================================================ +// CLI Configuration +// ============================================================================ + +async function main(): Promise { + const { values, positionals } = parseArgs({ + args: Bun.argv, + options: { + // UI options + interactive: { type: 'boolean', default: false, description: 'Force interactive UI mode' }, + ui: { type: 'boolean', default: false, description: 'Force interactive UI mode (alias for --interactive)' }, + + // Analysis options + mode: { + type: 'string', + description: 'Analysis mode (team-digest, changelog, release-changelog, bug-bisect, etc.)', + }, + prompt: { type: 'string', description: 'Custom prompt (file path or inline text)' }, + bug: { type: 'string', description: 'Bug description for bug-bisect mode (requires --release)' }, + + // Data filtering + team: { type: 'string', description: 'Team filter (@org/team or user1,user2)' }, + since: { type: 'string', default: '30 days ago', description: 'Time period to analyze' }, + repo: { type: 'string', description: 'Repository (owner/name)' }, + 'include-open-prs': { type: 'boolean', default: false, description: 'Include open PRs' }, + + // Release options + release: { type: 'string', description: 'Release to analyze (e.g., mobile/1.60 or extension/1.30.0)' }, + 'compare-with': { type: 'string', description: 'Specific version to compare with' }, + 'list-releases': { type: 'boolean', default: false, description: 'List available releases' }, + platform: { type: 'string', description: 'Platform filter (mobile or extension)' }, + + // Commit data options + 'include-diffs': { type: 'boolean', default: false, description: 'Include actual diff content in commits' }, + 'max-diff-size': { type: 'string', default: '100', description: 'Max lines changed per file to include diff' }, + 'max-diff-files': { type: 'string', default: '20', description: 'Max number of files to include diffs for' }, + 'diff-pattern': { type: 'string', description: 'Regex pattern for files to include diffs' }, + 'exclude-test-diffs': { type: 'boolean', default: true, description: 'Exclude test files from diffs' }, + 'token-budget': { type: 'string', default: '50000', description: 'Approximate token budget for commit data' }, + 'pr-body-limit': { type: 'string', default: '2000', description: 'Max characters for PR body' }, + 'save-artifacts': { type: 'boolean', default: false, description: 'Save analysis artifacts for debugging' }, + + // Output options + output: { type: 'string', multiple: true, description: 'Output targets (can specify multiple)' }, + + // Other options + verbose: { type: 'boolean', default: false, description: 'Verbose logging' }, + 'dry-run': { type: 'boolean', default: false, description: 'Test mode without publishing' }, + 'no-cache': { type: 'boolean', default: false, description: 'Bypass cache and fetch fresh data' }, + 'force-refresh': { + type: 'boolean', + default: false, + description: 'Bypass cache and fetch fresh data (alias for --no-cache)', + }, + help: { type: 'boolean', default: false, description: 'Show help' }, + }, + strict: true, + allowPositionals: true, + }) + + if (values.help) { + showHelp() + process.exit(0) + } + + // Detect if we should use UI mode + const shouldUseUI = + values.interactive || + values.ui || + (!values.release && + !values.mode && + !values.prompt && + !values.team && + !values['list-releases'] && + !values.output && + positionals.length === 0) + + if (shouldUseUI) { + throw new Error('UI mode is not supported') + } + + try { + // Create logger early for consistent logging + const logger = new ConsoleLogger(values.verbose || false) + + // Handle --list-releases + if (values['list-releases']) { + const scanner = new ReleaseScanner(process.cwd(), logger) + const platform = values.platform as 'mobile' | 'extension' | undefined + await scanner.listReleases(platform) + process.exit(0) + } + + // Check for API key + if (!process.env.ANTHROPIC_API_KEY) { + logger.error('Error: ANTHROPIC_API_KEY environment variable is required') + logger.error('Get your API key from: https://console.anthropic.com/') + process.exit(1) + } + + // Build configuration + const config = await buildConfig(values, logger) + + if (values.verbose) { + logger.debug(`Configuration: ${JSON.stringify(config, null, 2)}`) + } + + // Create cache provider (unless bypassing cache) + const bypassCache = values['no-cache'] || values['force-refresh'] + const cacheProvider = bypassCache ? undefined : new SqliteCacheProvider() + + // Run orchestrator + const aiProvider = createVercelAIProvider(process.env.ANTHROPIC_API_KEY) + const orchestrator = new Orchestrator({ + config, + aiProvider, + cacheProvider, + logger, + }) + await orchestrator.execute() + + // Close cache connection if used + if (cacheProvider) { + cacheProvider.close() + } + + logger.info('✨ Analysis complete!') + } catch (error) { + // Create a minimal logger if we don't have one yet + const errorLogger = new ConsoleLogger(false) + errorLogger.error(`Fatal error: ${error}`) + process.exit(1) + } +} + +interface BuildConfigArgs { + repo?: string + team?: string + since?: string + 'include-open-prs'?: boolean + release?: string + 'compare-with'?: string + mode?: string + prompt?: string + bug?: string + 'include-diffs'?: boolean + 'max-diff-size'?: string + 'max-diff-files'?: string + 'diff-pattern'?: string + 'exclude-test-diffs'?: boolean + 'token-budget'?: string + 'pr-body-limit'?: string + output?: string[] + verbose?: boolean + 'dry-run'?: boolean + 'save-artifacts'?: boolean + 'no-cache'?: boolean + 'force-refresh'?: boolean +} + +async function buildConfig(args: BuildConfigArgs, logger: Logger): Promise { + // Parse repository + let repository: { owner?: string; name?: string } | undefined + + if (args.repo) { + const match = args.repo.match(/^([^/]+)\/([^/]+)$/) + if (!match) { + throw new Error(`Invalid repository format: "${args.repo}". Expected: owner/repo`) + } + repository = { owner: match[1], name: match[2] } + } else { + // Try to detect from git + repository = (await detectRepository()) || undefined + } + + if (repository) { + logger.info(`Repository: ${repository.owner}/${repository.name}`) + } + + // Resolve team if specified + let teamFilter: string[] | undefined + let teamUsernames: string[] | undefined + + if (args.team) { + logger.info(`Resolving team: ${args.team}`) + const resolution = await resolveTeam(args.team) + teamFilter = resolution.emails + teamUsernames = resolution.usernames + + if (teamFilter.length === 0) { + throw new Error('Failed to resolve team filter') + } + logger.info(`Team resolved to ${teamFilter.length} email(s)`) + if (args.verbose) { + logger.debug(`Emails: ${teamFilter}`) + logger.debug(`Usernames: ${teamUsernames}`) + } + } + + // Parse outputs + const outputs = parseOutputs(args.output || ['stdout']) + + // Handle release mode + let releaseOptions + if (args.release) { + const releaseId = parseReleaseIdentifier(args.release) + if (!releaseId) { + throw new Error(`Invalid release format: "${args.release}". Expected: mobile/1.60 or extension/1.30.0`) + } + + let version = releaseId.version + + // Handle "latest" keyword + if (version === 'latest') { + const scanner = new ReleaseScanner(process.cwd(), logger) + const latestRelease = await scanner.getLatestRelease(releaseId.platform) + + if (!latestRelease) { + throw new Error(`No releases found for platform: ${releaseId.platform}`) + } + + version = latestRelease.version + logger.info(`Using latest ${releaseId.platform} release: ${version}`) + } + + releaseOptions = { + platform: releaseId.platform, + version, + compareWith: args['compare-with'], + } + + // Auto-set mode to release-changelog if not explicitly set + if (!args.mode) { + args.mode = 'release-changelog' + } + } + + // Build commit data config + const commitDataConfig = { + includeFilePaths: true, // Always include file paths + includeDiffs: args['include-diffs'], + maxDiffSize: parseInt(args['max-diff-size'] || '100', 10), + maxDiffFiles: parseInt(args['max-diff-files'] || '20', 10), + diffFilePattern: args['diff-pattern'], + excludeTestFiles: args['exclude-test-diffs'] !== false, + tokenBudget: parseInt(args['token-budget'] || '50000', 10), + prBodyLimit: parseInt(args['pr-body-limit'] || '2000', 10), + } + + // Build collection options + const collectOptions: CollectOptions = { + since: args.since ?? '30 days ago', + repository, + teamFilter, + teamUsernames, + includeOpenPrs: args['include-open-prs'], + commitDataConfig, + } + + // Handle bug-bisect mode + if (args.bug) { + if (!args.release) { + throw new Error('--bug requires --release to be specified') + } + // Auto-set mode to bug-bisect if not explicitly set + if (!args.mode) { + args.mode = 'bug-bisect' + } else if (args.mode !== 'bug-bisect') { + throw new Error('--bug can only be used with --mode bug-bisect') + } + } + + // Build analysis config + const analysisConfig = { + mode: args.mode, + prompt: args.prompt, + releaseOptions, + variables: args.bug + ? { + BUG_DESCRIPTION: args.bug, + } + : undefined, + } + + return { + analysis: analysisConfig, + outputs, + collect: collectOptions, + verbose: args.verbose, + dryRun: args['dry-run'], + saveArtifacts: args['save-artifacts'], + bypassCache: args['no-cache'] || args['force-refresh'] || false, + } +} + +function parseOutputs(outputs: string[]): OutputConfig[] { + return outputs.map((output) => { + // Parse format: type:target + // Examples: + // stdout + // file:report.md + // slack:#channel + // github-release + + const parts = output.split(':') + const type = parts[0] + const target = parts.slice(1).join(':') // Handle colons in target + + if (!type) { + throw new Error(`Invalid output format: "${output}"`) + } + + return { + type, + target: target || undefined, + } + }) +} + +function showHelp(): void { + console.log(` +Repository Intelligence System - Analyze git history with AI + +Usage: bun scripts/gh-agent-refactored.ts [options] + +ANALYSIS OPTIONS: + --mode Predefined analysis mode (team-digest, changelog, release-changelog, bug-bisect) + --prompt Custom prompt (file path or inline text) + Examples: + --prompt ./my-analysis.md + --prompt "Analyze for security issues" + --bug Bug description for bug-bisect mode (requires --release) + Example: + --bug "Users can't connect wallet on mobile app" + --release mobile/1.60 --bug "Crash on launch" + +DATA FILTERING: + --team Team filter (@org/team or user1,user2) + Examples: + --team @Uniswap/apps-swap + --team alice,bob + --team @Uniswap/backend,external-contributor + --since Time period to analyze (default: "30 days ago") + --repo Repository to analyze (auto-detected if not specified) + --include-open-prs Include open/in-review PRs in analysis + +RELEASE OPTIONS: + --release Release to analyze (e.g., mobile/1.60, extension/1.30.0, or mobile/latest) + --compare-with Specific version to compare with (auto-detects if not specified) + --list-releases List available releases + --platform Platform filter for --list-releases (mobile or extension) + +OUTPUT OPTIONS: + --output Output target (can specify multiple) + Examples: + --output stdout (default) + --output file:report.md + --output slack:#channel + Multiple outputs: + --output file:report.md --output slack:#updates + +OTHER OPTIONS: + --verbose Enable verbose logging + --dry-run Test mode without publishing + --no-cache Bypass cache and fetch fresh data + --force-refresh Bypass cache and fetch fresh data (alias for --no-cache) + --help Show this help message + +EXAMPLES: + # Team digest with default settings + bun scripts/gh-agent-refactored.ts --mode team-digest --team @Uniswap/apps-swap + + # Weekly changelog + bun scripts/gh-agent-refactored.ts --mode changelog --since "1 week ago" + + # Release changelog for mobile + bun scripts/gh-agent-refactored.ts --release mobile/1.60 + + # Release changelog for latest mobile release + bun scripts/gh-agent-refactored.ts --release mobile/latest + + # Release changelog with specific comparison + bun scripts/gh-agent-refactored.ts --release mobile/1.60 --compare-with mobile/1.58 + + # Bug bisect - find which commit introduced a bug + bun scripts/gh-agent-refactored.ts --release mobile/1.60 --bug "Users can't connect wallet" + + # List all releases + bun scripts/gh-agent-refactored.ts --list-releases + + # List mobile releases only + bun scripts/gh-agent-refactored.ts --list-releases --platform mobile + + # Custom analysis with multiple outputs + bun scripts/gh-agent-refactored.ts \\ + --prompt "Analyze for performance improvements" \\ + --team alice,bob \\ + --output file:performance.md \\ + --output slack:#perf-updates + +ENVIRONMENT VARIABLES: + ANTHROPIC_API_KEY Required - Your Anthropic API key + SLACK_WEBHOOK Optional - Webhook URL for Slack integration + +For more information, see the documentation at: +https://github.com/Uniswap/universe/scripts/gh-agent/README.md +`) +} + +// Run if executed directly +if (import.meta.main) { + main().catch((error) => { + console.error('Unhandled error:', error) + process.exit(1) + }) +} diff --git a/apps/cli/src/core/data-collector.ts b/apps/cli/src/core/data-collector.ts new file mode 100644 index 00000000000..fd9979b9cc6 --- /dev/null +++ b/apps/cli/src/core/data-collector.ts @@ -0,0 +1,1096 @@ +/* eslint-disable max-lines */ +/* eslint-disable max-depth */ +/* eslint-disable complexity */ +/* eslint-disable max-params */ + +/** biome-ignore-all lint/suspicious/noConsole: CLI tool requires console output */ + +import { getCommitsCacheKey, getPullRequestsCacheKey, getStatsCacheKey } from '@universe/cli/src/lib/cache-keys' +import { type CacheProvider } from '@universe/cli/src/lib/cache-provider' +import type { Logger } from '@universe/cli/src/lib/logger' +import { cleanPRBody } from '@universe/cli/src/lib/pr-body-cleaner' +import { type ReleaseComparison } from '@universe/cli/src/lib/release-scanner' +import { isTrivialFile } from '@universe/cli/src/lib/trivial-files' +import { $ } from 'bun' + +// ============================================================================ +// Data Collection Types +// ============================================================================ + +export interface CommitDataConfig { + includeFilePaths?: boolean // Include file paths in commit data (default: true) + includeDiffs?: boolean // Include actual diff content (default: false) + maxDiffSize?: number // Max lines changed per file to include diff (default: 100) + maxDiffFiles?: number // Max number of files to include diffs for (default: 20) + diffFilePattern?: string // Regex pattern for files to include diffs (default: \.(ts|tsx|js|jsx)$) + excludeTestFiles?: boolean // Exclude test files from diffs (default: true) + tokenBudget?: number // Approximate token budget for all commit data (default: 50000) + prBodyLimit?: number // Max characters for PR body (default: 2000) + cleanPRBodies?: boolean // Enable PR body cleaning (default: true) +} + +export interface CollectOptions { + since: string + branch?: string + author?: string + repoPath?: string + includeOpenPrs?: boolean + teamFilter?: string[] + teamUsernames?: string[] + repository?: { owner?: string; name?: string } + releaseComparison?: ReleaseComparison + excludeTrivialCommits?: boolean // Filter out commits with only lockfile/snapshot changes + commitDataConfig?: CommitDataConfig // Configuration for commit data collection +} + +export interface RepositoryData { + commits: Commit[] + pullRequests: PullRequest[] + stats: StatsOutput + metadata: { + repository: string + period: string + collectedAt: Date + commitCount: number + prCount: number + releaseInfo?: { + from: string + to: string + platform: 'mobile' | 'extension' + } + filtering?: { + totalCommitsFound: number + trivialCommitsFiltered: number + filesProcessed: number + trivialFilesSkipped: number + } + } +} + +export interface Commit { + sha: string + author: { name: string; email: string } + timestamp: Date + message: string + stats: { filesChanged: number; insertions: number; deletions: number } + files?: { + path: string + status: 'added' | 'modified' | 'deleted' | 'renamed' + additions: number + deletions: number + diff?: string // Optional: actual diff content + diffTruncated?: boolean // Optional: indicates if diff was truncated + }[] +} + +export interface PullRequest { + number: number + title: string + body: string + author: string + state: 'open' | 'closed' + mergedAt: string + mergeCommitSha?: string +} + +export interface StatsOutput { + totalCommits: number + totalAuthors: number + filesChanged: number + linesAdded: number + linesDeleted: number +} + +// ============================================================================ +// Helper Functions for Git Output Parsing +// ============================================================================ + +/** + * Validates and parses a git log line in the format: sha|email|name|timestamp|message + * Returns undefined if the line is malformed + */ +function parseGitLogLine( + line: string, +): { sha: string; email: string; name: string; timestamp: string; message: string } | undefined { + const parts = line.split('|') + if (parts.length < 5) { + return undefined + } + + const sha = parts[0]?.trim() + const email = parts[1]?.trim() + const name = parts[2]?.trim() + const timestamp = parts[3]?.trim() + const messageParts = parts.slice(4) + const message = messageParts.join('|') + + if (!sha || !email || !name || !timestamp) { + return undefined + } + + return { sha, email, name, timestamp, message } +} + +/** + * Validates and parses a git numstat line in the format: additions\tdeletions\tfilepath + * Returns undefined if the line is malformed + */ +function parseNumstatLine(line: string): { additions: string; deletions: string; filepath: string } | undefined { + const parts = line.split('\t') + if (parts.length < 3) { + return undefined + } + + const additions = parts[0]?.trim() + const deletions = parts[1]?.trim() + const filepath = parts.slice(2).join('\t') // Handle filepaths with tabs + + if (additions === undefined || deletions === undefined || !filepath) { + return undefined + } + + return { additions, deletions, filepath } +} + +// ============================================================================ +// Data Collector +// ============================================================================ + +export class DataCollector { + private filteringStats = { + totalCommitsFound: 0, + trivialCommitsFiltered: 0, + filesProcessed: 0, + trivialFilesSkipped: 0, + } + private tokenUsage = 0 + private diffsCollected = 0 + + constructor( + private repoPath: string = process.cwd(), + private cacheProvider?: CacheProvider, + private bypassCache: boolean = false, + private logger?: Logger, + ) {} + + /** + * Estimate tokens for a given text (rough approximation: 1 token ≈ 4 characters) + */ + private estimateTokens(text: string): number { + return Math.ceil(text.length / 4) + } + + /** + * Check if a file should have its diff included based on config + */ + private shouldIncludeDiff(filePath: string, additions: number, deletions: number, config: CommitDataConfig): boolean { + // Check if diffs are enabled + if (!config.includeDiffs) { + return false + } + + // Check if we've hit the diff file limit + if (this.diffsCollected >= (config.maxDiffFiles || 20)) { + return false + } + + // Check if we're within token budget + const budget = config.tokenBudget || 50000 // Can be higher with compact format + if (this.tokenUsage >= budget) { + this.logger?.info(`Token budget reached (${this.tokenUsage}/${budget}), skipping remaining diffs`) + return false + } + + // Check file size limit + const totalChanges = additions + deletions + if (totalChanges > (config.maxDiffSize || 100)) { + return false + } + + // Check if it's a test file and we're excluding them + if (config.excludeTestFiles !== false) { + const testPatterns = [ + /\.test\.(ts|tsx|js|jsx)$/, + /\.spec\.(ts|tsx|js|jsx)$/, + /__tests__\//, + /test\//i, + /tests\//i, + /e2e\//, + ] + if (testPatterns.some((p) => p.test(filePath))) { + return false + } + } + + // Check file pattern if provided + if (config.diffFilePattern) { + // eslint-disable-next-line security/detect-non-literal-regexp -- User-provided pattern from config, used for file filtering + const pattern = new RegExp(config.diffFilePattern) + if (!pattern.test(filePath)) { + return false + } + } else { + // Default pattern: TypeScript and JavaScript files + const defaultPattern = /\.(ts|tsx|js|jsx)$/ + if (!defaultPattern.test(filePath)) { + return false + } + } + + return true + } + + /** + * Collect diff for a specific file in a commit + */ + private async collectFileDiff(sha: string, filePath: string, config: CommitDataConfig): Promise { + try { + // Get just the unified diff for this file (more compact than full git show) + const diff = await $`git -C ${this.repoPath} diff ${sha}^..${sha} -- ${filePath}`.text() + + if (!diff || diff.trim().length === 0) { + // File might be new, try different approach + const showDiff = await $`git -C ${this.repoPath} show ${sha} --format= -- ${filePath}`.text() + if (!showDiff) { + return undefined + } + + // For new files, just get the content preview + const lines = showDiff.split('\n') + const maxSize = Math.min(config.maxDiffSize || 100, 30) // Smaller preview for new files + if (lines.length > maxSize) { + return lines.slice(0, maxSize).join('\n') + `\n... [+${lines.length - maxSize} more lines]` + } + return showDiff + } + + // Extract just the hunks (skip file headers for compactness) + const lines = diff.split('\n') + const hunkLines = lines.filter( + (line: string) => line.startsWith('@@') || line.startsWith('+') || line.startsWith('-') || line.startsWith(' '), + ) + + // Check size and truncate if needed + const maxSize = config.maxDiffSize || 100 + if (hunkLines.length > maxSize) { + const truncated = hunkLines.slice(0, maxSize) + truncated.push(`... [${hunkLines.length - maxSize} more lines]`) + return truncated.join('\n') + } + + return hunkLines.join('\n') + } catch (_error) { + // Might fail for new files or first commit, that's ok + return undefined + } + } + + /** + * Restore Date objects from cached JSON (JSON.parse converts dates to strings) + */ + private restoreDatesFromCache(items: T[]): T[] { + return items.map((item) => { + if (item.timestamp && typeof item.timestamp === 'string') { + return { ...item, timestamp: new Date(item.timestamp) } + } + return item + }) + } + + async collect(options: CollectOptions): Promise { + this.logger?.info('Collecting repository data...') + + // Reset filtering stats + this.filteringStats = { + totalCommitsFound: 0, + trivialCommitsFiltered: 0, + filesProcessed: 0, + trivialFilesSkipped: 0, + } + this.tokenUsage = 0 + this.diffsCollected = 0 + + // Try to get commits from cache + let allCommits: Commit[] | null = null + if (!this.bypassCache && this.cacheProvider) { + const cacheKey = getCommitsCacheKey(options) + const cached = await this.cacheProvider.get(cacheKey) + if (cached) { + allCommits = this.restoreDatesFromCache(cached) + this.logger?.info(`Cache hit: Found ${allCommits.length} commits in cache`) + } + } + + // Fetch commits if not cached + if (!allCommits) { + if (options.releaseComparison) { + this.logger?.info(`Fetching commits for release: ${options.releaseComparison.commitRange}`) + allCommits = await this.getReleaseCommits(options.releaseComparison, options) + } else { + this.logger?.info('Fetching commits from git log...') + allCommits = await this.getCommits(options) + } + + // Store in cache (release comparisons are deterministic, cache indefinitely) + if (this.cacheProvider) { + const cacheKey = getCommitsCacheKey(options) + const ttl = options.releaseComparison ? undefined : 3600 // 1 hour for time-based queries + await this.cacheProvider.set(cacheKey, allCommits, ttl) + this.logger?.info(`Cached ${allCommits.length} commits`) + } + } + + // Filter by team if specified + const commits = options.teamFilter?.length ? this.filterCommitsByTeam(allCommits, options.teamFilter) : allCommits + + this.logger?.info(`Found ${commits.length} commits (${allCommits.length} total)`) + + // Try to get PRs from cache + let pullRequests: PullRequest[] | null = null + if (!this.bypassCache && this.cacheProvider) { + const cacheKey = getPullRequestsCacheKey(options) + const cached = await this.cacheProvider.get(cacheKey) + if (cached) { + pullRequests = cached + this.logger?.info(`Cache hit: Found ${pullRequests.length} PRs in cache`) + } + } + + // Fetch PRs if not cached + if (!pullRequests) { + this.logger?.info('Fetching pull requests from GitHub...') + pullRequests = await this.getPullRequests(options) + + // Store in cache + if (this.cacheProvider) { + const cacheKey = getPullRequestsCacheKey(options) + const ttl = options.releaseComparison ? undefined : 3600 // 1 hour for time-based queries + await this.cacheProvider.set(cacheKey, pullRequests, ttl) + this.logger?.info(`Cached ${pullRequests.length} PRs`) + } + } + + this.logger?.info(`Found ${pullRequests.length} pull requests`) + + // Try to get stats from cache + let stats: StatsOutput | null = null + if (!this.bypassCache && this.cacheProvider) { + const cacheKey = getStatsCacheKey(options) + const cached = await this.cacheProvider.get(cacheKey) + if (cached) { + stats = cached + this.logger?.info('Cache hit: Found stats in cache') + } + } + + // Calculate stats if not cached + if (!stats) { + stats = await this.getStats(options) + + // Store in cache + if (this.cacheProvider) { + const cacheKey = getStatsCacheKey(options) + const ttl = options.releaseComparison ? undefined : 3600 // 1 hour for time-based queries + await this.cacheProvider.set(cacheKey, stats, ttl) + this.logger?.info('Cached stats') + } + } + + // Build metadata + const repoName = + options.repository?.owner && options.repository.name + ? `${options.repository.owner}/${options.repository.name}` + : this.repoPath + + const metadata: RepositoryData['metadata'] = { + repository: repoName, + period: options.since, + collectedAt: new Date(), + commitCount: commits.length, + prCount: pullRequests.length, + } + + // Add release info if available + if (options.releaseComparison) { + metadata.releaseInfo = { + from: options.releaseComparison.from.version, + to: options.releaseComparison.to.version, + platform: options.releaseComparison.to.platform, + } + } + + // Add filtering stats if we have them + if (this.filteringStats.totalCommitsFound > 0) { + metadata.filtering = { + totalCommitsFound: this.filteringStats.totalCommitsFound, + trivialCommitsFiltered: this.filteringStats.trivialCommitsFiltered, + filesProcessed: this.filteringStats.filesProcessed, + trivialFilesSkipped: this.filteringStats.trivialFilesSkipped, + } + } + + return { + commits, + pullRequests, + stats, + metadata, + } + } + + private async getCommits(options: CollectOptions): Promise { + const format = '%H|%ae|%an|%at|%s' + const result = await $`git -C ${this.repoPath} log --since="${options.since}" --format="${format}" --numstat`.text() + + const commits: Commit[] = [] + const lines = result.split('\n') + let skippedTrivialCommits = 0 + let totalCommitsProcessed = 0 + + for (let i = 0; i < lines.length; i++) { + const line = lines[i] + if (!line || !line.includes('|')) { + continue + } + + // Parse the commit line + const parsed = parseGitLogLine(line) + if (!parsed) { + this.logger?.warn(`Skipping malformed git log line: ${line}`) + continue + } + + totalCommitsProcessed++ + const { sha, email, name, timestamp, message } = parsed + const stats = { filesChanged: 0, insertions: 0, deletions: 0 } + const fileChanges: Commit['files'] = [] + + // Parse numstat + i++ + while (i < lines.length) { + const currentLine = lines[i] + if (!currentLine || currentLine.includes('|')) { + break + } + const statLine = currentLine.trim() + if (statLine) { + const numstat = parseNumstatLine(statLine) + if (numstat) { + const { additions, deletions, filepath } = numstat + + // Skip trivial files when in release mode + if (options.releaseComparison && isTrivialFile(filepath)) { + i++ + continue + } + + const adds = additions === '-' ? 0 : parseInt(additions, 10) || 0 + const dels = deletions === '-' ? 0 : parseInt(deletions, 10) || 0 + + // Determine file status + let status: 'added' | 'modified' | 'deleted' | 'renamed' = 'modified' + if (adds > 0 && dels === 0) { + status = 'added' + } else if (adds === 0 && dels > 0) { + status = 'deleted' + } else if (additions === '-' || deletions === '-') { + status = 'modified' + } + + fileChanges.push({ + path: filepath, + status, + additions: adds, + deletions: dels, + }) + + stats.insertions += adds + stats.deletions += dels + stats.filesChanged++ + } + } + i++ + } + i-- // Back up one since the outer loop will increment + + // Skip commits that only touch trivial files (only in release mode) + if (options.releaseComparison && stats.filesChanged === 0) { + skippedTrivialCommits++ + continue + } + + const commit = { + sha, + author: { name, email }, + timestamp: new Date(parseInt(timestamp, 10) * 1000), + message, + stats, + files: fileChanges, + } + + // Collect diffs if configured + if (options.commitDataConfig?.includeDiffs && fileChanges.length > 0) { + for (const file of fileChanges) { + if (this.shouldIncludeDiff(file.path, file.additions, file.deletions, options.commitDataConfig)) { + const diff = await this.collectFileDiff(sha, file.path, options.commitDataConfig) + if (diff) { + file.diff = diff + file.diffTruncated = diff.includes('[diff truncated') + this.diffsCollected++ + this.tokenUsage += this.estimateTokens(diff) + + // Log progress + if (this.diffsCollected % 5 === 0) { + this.logger?.info(`Collected ${this.diffsCollected} diffs (${this.tokenUsage} tokens used)`) + } + } + } + } + } + + commits.push(commit) + } + + // Store stats for reporting (if in release mode) + if (totalCommitsProcessed > 0) { + this.filteringStats.totalCommitsFound += totalCommitsProcessed + this.filteringStats.trivialCommitsFiltered += skippedTrivialCommits + } + + if (skippedTrivialCommits > 0) { + this.logger?.info(`Filtered out ${skippedTrivialCommits} commits with only trivial file changes`) + } + + return commits + } + + private filterCommitsByTeam(commits: Commit[], teamFilter: string[]): Commit[] { + return commits.filter((c) => { + const matches = teamFilter.includes(c.author.email) + if (!matches) { + this.logger?.debug(`Filtering out commit ${c.sha.slice(0, 7)} by ${c.author.email}`) + } + return matches + }) + } + + private async getPullRequests(options: CollectOptions): Promise { + if (!options.repository?.owner || !options.repository.name) { + this.logger?.debug('No repository configured, skipping PR fetch') + return [] + } + + const repository = `${options.repository.owner}/${options.repository.name}` + + try { + // For release comparisons, get PR numbers from the commit range + if (options.releaseComparison) { + return await this.getReleasePullRequests(options, repository) + } + + // Parse the 'since' date for time-based analysis + const sinceDate = this.parseSinceDate(options.since) + const sinceISO = sinceDate.toISOString().split('T')[0] ?? sinceDate.toISOString() + + // Build search query + const authorFilter = options.teamUsernames?.length + ? options.teamUsernames.map((author) => `author:${author}`).join(' ') + : '' + + const query = options.includeOpenPrs + ? `repo:${repository} is:pr created:>=${sinceISO} ${authorFilter}` + : `repo:${repository} is:pr is:closed closed:>=${sinceISO} ${authorFilter}` + + this.logger?.debug(`GitHub Search Query: ${query}`) + + // Get PR numbers from main branch commits for filtering + const prNumbersInMain = await this.getPRNumbersFromMainBranch(sinceISO) + + // Fetch PRs from GitHub + const allPRs: PullRequest[] = [] + let page = 1 + const perPage = 100 + const maxPages = 10 + + while (page <= maxPages) { + const apiPath = `/search/issues?q=${encodeURIComponent(query)}&per_page=${perPage}&page=${page}` + const searchResult = await $`gh api ${apiPath}`.text() + const searchData = JSON.parse(searchResult) + + if (!searchData.items || searchData.items.length === 0) { + break + } + + for (const pr of searchData.items) { + // Filter to only include PRs whose commits are in main (unless open) + if (pr.state === 'open' || prNumbersInMain.has(pr.number)) { + const limit = options.commitDataConfig?.prBodyLimit || 2000 + const shouldClean = options.commitDataConfig?.cleanPRBodies !== false // Default to true + let body = pr.body ? pr.body : '' + + // Clean PR body if enabled (default: true) + if (body && shouldClean) { + body = cleanPRBody(body) + } + + // Apply character limit after cleaning + body = body.slice(0, limit) + + allPRs.push({ + number: pr.number, + title: pr.title, + body, + author: pr.user?.login || 'unknown', + state: pr.state as 'open' | 'closed', + mergedAt: pr.closed_at, + mergeCommitSha: pr.pull_request?.merge_commit_sha, + }) + } + } + + if (searchData.items.length < perPage) { + break + } + page++ + } + + return allPRs + } catch (error) { + this.logger?.error(`GitHub PR fetch failed: ${error}`) + return [] + } + } + + private parseSinceDate(since: string): Date { + const sinceDate = new Date() + const sinceMatch = since.match(/(\d+)\s+(day|week|month|year)s?\s+ago/) + + if (sinceMatch?.[1] && sinceMatch[2]) { + const amount = sinceMatch[1] + const unit = sinceMatch[2] + const num = parseInt(amount, 10) + + switch (unit) { + case 'day': + sinceDate.setDate(sinceDate.getDate() - num) + break + case 'week': + sinceDate.setDate(sinceDate.getDate() - num * 7) + break + case 'month': + sinceDate.setMonth(sinceDate.getMonth() - num) + break + case 'year': + sinceDate.setFullYear(sinceDate.getFullYear() - num) + break + } + } + + return sinceDate + } + + private async getPRNumbersFromMainBranch(sinceISO: string): Promise> { + const allCommitMessages = await $`git log main --since="${sinceISO}" --format="%s"`.text() + const prNumbersInMain = new Set() + const prRegex = /#(\d+)/g + + for (const match of allCommitMessages.matchAll(prRegex)) { + if (match[1]) { + const prNum = parseInt(match[1], 10) + if (prNum) { + prNumbersInMain.add(prNum) + } + } + } + + this.logger?.debug(`Found ${prNumbersInMain.size} unique PR numbers in main branch commits`) + return prNumbersInMain + } + + private async getReleasePullRequests(options: CollectOptions, repository: string): Promise { + if (!options.releaseComparison) { + return [] + } + + const range = options.releaseComparison.commitRange + this.logger?.info('Extracting PR information from commits...') + + // Extract PR numbers and titles from commit messages + const commits = await $`git -C ${this.repoPath} log ${range} --format="%H|%s|%ae|%an"`.text() + const pullRequests: PullRequest[] = [] + const seenPRs = new Set() + + for (const line of commits.split('\n')) { + if (!line) { + continue + } + const parts = line.split('|') + const sha = parts[0] + const message = parts[1] + const author = parts[3] + + if (!sha || !message || !author) { + continue + } + + // Look for PR number in commit message (e.g., "(#1234)" or "PR #1234") + const prMatch = message.match(/#(\d+)/) + if (prMatch?.[1]) { + const prNumber = parseInt(prMatch[1], 10) + + // Skip if we've already seen this PR + if (seenPRs.has(prNumber)) { + continue + } + seenPRs.add(prNumber) + + // Extract PR title from commit message (usually after the PR number) + let title = message + // Remove PR number patterns + title = title + .replace(/\(#\d+\)/, '') + .replace(/#\d+/, '') + .trim() + + // Create a minimal PR object from commit data + pullRequests.push({ + number: prNumber, + title: title || `PR #${prNumber}`, + body: '', // We don't have the body without API call + author: author || 'unknown', + state: 'closed', // Assume closed if in release + mergedAt: '', // We don't have exact merge time + mergeCommitSha: sha, + }) + } + } + + this.logger?.info(`Found ${pullRequests.length} PRs from commit messages`) + + // Fetch detailed PR info for all PRs using gh api with parallel batching + if (pullRequests.length > 0) { + this.logger?.info(`Fetching detailed info for ${pullRequests.length} PRs...`) + + const limit = options.commitDataConfig?.prBodyLimit || 2000 + const CONCURRENCY_LIMIT = 15 // Fetch 15 PRs in parallel at a time + let fetchedCount = 0 + + // Helper function to fetch a single PR + const fetchPR = async (pr: PullRequest): Promise => { + try { + // Use jq to output a JSON object to properly handle multi-line PR bodies + const prResultJson = + await $`gh api repos/${repository}/pulls/${pr.number} --jq '{title: .title, body: .body, author: .user.login, mergedAt: .merged_at}'`.text() + const prData = JSON.parse(prResultJson) + + // Update with real data + if (prData.title) { + pr.title = prData.title + } + if (prData.body && prData.body !== 'null') { + const shouldClean = options.commitDataConfig?.cleanPRBodies !== false // Default to true + let body = prData.body + + // Clean PR body if enabled (default: true) + if (shouldClean) { + body = cleanPRBody(body) + } + + // Apply character limit after cleaning + pr.body = body.slice(0, limit) + } + if (prData.author) { + pr.author = prData.author + } + if (prData.mergedAt && prData.mergedAt !== 'null') { + pr.mergedAt = prData.mergedAt + } + } catch (_error) { + // Keep the minimal data we already have + this.logger?.warn(`Failed to fetch PR #${pr.number}, continuing with minimal data`) + } + } + + // Process PRs in batches for parallel fetching + for (let i = 0; i < pullRequests.length; i += CONCURRENCY_LIMIT) { + const batch = pullRequests.slice(i, i + CONCURRENCY_LIMIT) + const batchNumber = Math.floor(i / CONCURRENCY_LIMIT) + 1 + const totalBatches = Math.ceil(pullRequests.length / CONCURRENCY_LIMIT) + + // Fetch all PRs in this batch in parallel + await Promise.all(batch.map((pr) => fetchPR(pr))) + + fetchedCount += batch.length + + // Log progress after each batch + this.logger?.info( + `Fetched ${fetchedCount}/${pullRequests.length} PRs (batch ${batchNumber}/${totalBatches})...`, + ) + + // Add small delay between batches to respect rate limits (except for last batch) + if (i + CONCURRENCY_LIMIT < pullRequests.length) { + await new Promise((resolve) => setTimeout(resolve, 200)) + } + } + + this.logger?.info(`Successfully fetched detailed info for ${fetchedCount}/${pullRequests.length} PRs`) + } + + return pullRequests + } + + private async getReleaseCommits(comparison: ReleaseComparison, options: CollectOptions): Promise { + const format = '%H|%ae|%an|%at|%s' + const range = comparison.commitRange + + this.logger?.info(`Getting commits for release: ${range}`) + + const result = await $`git -C ${this.repoPath} log ${range} --format="${format}" --numstat`.text() + + const commits: Commit[] = [] + const lines = result.split('\n') + let skippedTrivialCommits = 0 + let totalCommitsProcessed = 0 + let totalFilesProcessed = 0 + let trivialFilesSkipped = 0 + + for (let i = 0; i < lines.length; i++) { + const line = lines[i] + if (!line || !line.includes('|')) { + continue + } + + // Parse the commit line + const parsed = parseGitLogLine(line) + if (!parsed) { + this.logger?.warn(`Skipping malformed git log line: ${line}`) + continue + } + + totalCommitsProcessed++ + const { sha, email, name, timestamp, message } = parsed + const stats = { filesChanged: 0, insertions: 0, deletions: 0 } + const fileChanges: Commit['files'] = [] + const trivialFiles: string[] = [] + + // Parse numstat + i++ + // Skip empty line after commit header + if (i < lines.length && lines[i] === '') { + i++ + } + + while (i < lines.length) { + const statLine = lines[i] + + // Stop if this is the start of a new commit (contains |) or we hit another empty line followed by a commit + if (!statLine || statLine.includes('|')) { + if (!statLine) { + // Check if next line is a commit + const nextLine = lines[i + 1] + if (nextLine?.includes('|')) { + break + } + // Otherwise it's just an empty line in the numstat, skip it + i++ + continue + } else { + // New commit line, back up for outer loop + i-- + break + } + } + + if (statLine.trim()) { + // Git numstat format is: additions\tdeletions\tfilepath + const tabIndex1 = statLine.indexOf('\t') + const tabIndex2 = statLine.indexOf('\t', tabIndex1 + 1) + + if (tabIndex1 > -1 && tabIndex2 > -1) { + const additions = statLine.substring(0, tabIndex1) + const deletions = statLine.substring(tabIndex1 + 1, tabIndex2) + const filepath = statLine.substring(tabIndex2 + 1) + + // Skip empty filepaths + if (!filepath) { + i++ + continue + } + + totalFilesProcessed++ + + // Skip trivial files + if (!isTrivialFile(filepath)) { + const adds = additions === '-' ? 0 : parseInt(additions, 10) || 0 + const dels = deletions === '-' ? 0 : parseInt(deletions, 10) || 0 + + // Determine file status based on additions/deletions + let status: 'added' | 'modified' | 'deleted' | 'renamed' = 'modified' + if (adds > 0 && dels === 0) { + status = 'added' + } else if (adds === 0 && dels > 0) { + status = 'deleted' + } else if (additions === '-' || deletions === '-') { + // Binary files or renames show '-' for stats + status = 'modified' + } + + fileChanges.push({ + path: filepath, + status, + additions: adds, + deletions: dels, + }) + + stats.insertions += adds + stats.deletions += dels + stats.filesChanged++ + } else { + trivialFiles.push(filepath) + trivialFilesSkipped++ + } + } + } + i++ + } + i-- // Back up one since the outer loop will increment + + // Skip commits that only touch trivial files + if (stats.filesChanged === 0 && trivialFiles.length > 0) { + skippedTrivialCommits++ + continue + } else if (stats.filesChanged === 0 && trivialFiles.length === 0) { + // Empty commit or merge commit, skip + continue + } + + const commit = { + sha, + author: { name, email }, + timestamp: new Date(parseInt(timestamp, 10) * 1000), + message, + stats, + files: fileChanges, + } + + // Collect diffs if configured + if (options.commitDataConfig?.includeDiffs && fileChanges.length > 0) { + for (const file of fileChanges) { + if (this.shouldIncludeDiff(file.path, file.additions, file.deletions, options.commitDataConfig)) { + const diff = await this.collectFileDiff(sha, file.path, options.commitDataConfig) + if (diff) { + file.diff = diff + file.diffTruncated = diff.includes('[diff truncated') + this.diffsCollected++ + this.tokenUsage += this.estimateTokens(diff) + + // Log progress + if (this.diffsCollected % 5 === 0) { + this.logger?.info(`Collected ${this.diffsCollected} diffs (${this.tokenUsage} tokens used)`) + } + } + } + } + } + + commits.push(commit) + } + + // Store stats for reporting (if in release mode) + if (totalCommitsProcessed > 0) { + this.filteringStats.totalCommitsFound = totalCommitsProcessed + this.filteringStats.trivialCommitsFiltered = skippedTrivialCommits + this.filteringStats.filesProcessed = totalFilesProcessed + this.filteringStats.trivialFilesSkipped = trivialFilesSkipped + } + + if (skippedTrivialCommits > 0) { + this.logger?.info(`Filtered out ${skippedTrivialCommits} commits with only trivial file changes`) + } + + this.logger?.info(`Analyzed ${commits.length} meaningful commits from ${totalCommitsProcessed} total`) + + if (options.commitDataConfig?.includeDiffs && this.diffsCollected > 0) { + this.logger?.info(`Collected ${this.diffsCollected} diffs using ~${this.tokenUsage.toLocaleString()} tokens`) + } + + return commits + } + + private async getStats(options: CollectOptions): Promise { + // For release comparisons, use the commit range + if (options.releaseComparison) { + const range = options.releaseComparison.commitRange + const shortstat = await $`git -C ${this.repoPath} log ${range} --shortstat --format=""`.text() + const authors = await $`git -C ${this.repoPath} log ${range} --format="%ae" | sort -u | wc -l`.text() + + let filesChanged = 0, + linesAdded = 0, + linesDeleted = 0, + totalCommits = 0 + + for (const line of shortstat.split('\n')) { + if (line.includes('changed')) { + totalCommits++ + const fileMatch = line.match(/(\d+) file/) + const insertMatch = line.match(/(\d+) insertion/) + const deleteMatch = line.match(/(\d+) deletion/) + + if (fileMatch?.[1]) { + filesChanged += parseInt(fileMatch[1], 10) + } + if (insertMatch?.[1]) { + linesAdded += parseInt(insertMatch[1], 10) + } + if (deleteMatch?.[1]) { + linesDeleted += parseInt(deleteMatch[1], 10) + } + } + } + + return { + totalCommits, + totalAuthors: parseInt(authors.trim(), 10), + filesChanged, + linesAdded, + linesDeleted, + } + } + + // Original implementation for time-based analysis + const shortstat = await $`git -C ${this.repoPath} log --since="${options.since}" --shortstat --format=""`.text() + const authors = + await $`git -C ${this.repoPath} log --since="${options.since}" --format="%ae" | sort -u | wc -l`.text() + + let filesChanged = 0, + linesAdded = 0, + linesDeleted = 0, + totalCommits = 0 + + for (const line of shortstat.split('\n')) { + if (line.includes('changed')) { + totalCommits++ + const fileMatch = line.match(/(\d+) file/) + const insertMatch = line.match(/(\d+) insertion/) + const deleteMatch = line.match(/(\d+) deletion/) + + if (fileMatch?.[1]) { + filesChanged += parseInt(fileMatch[1], 10) + } + if (insertMatch?.[1]) { + linesAdded += parseInt(insertMatch[1], 10) + } + if (deleteMatch?.[1]) { + linesDeleted += parseInt(deleteMatch[1], 10) + } + } + } + + return { + totalCommits, + totalAuthors: parseInt(authors.trim(), 10), + filesChanged, + linesAdded, + linesDeleted, + } + } +} diff --git a/apps/cli/src/core/orchestrator.ts b/apps/cli/src/core/orchestrator.ts new file mode 100644 index 00000000000..a72effbcf42 --- /dev/null +++ b/apps/cli/src/core/orchestrator.ts @@ -0,0 +1,810 @@ +/* eslint-disable max-depth */ +/* eslint-disable security/detect-non-literal-regexp */ +/* eslint-disable complexity */ +/* eslint-disable max-lines */ +/* eslint-disable no-console */ +import { join } from 'node:path' +import { + type CollectOptions, + DataCollector, + type PullRequest, + type RepositoryData, +} from '@universe/cli/src/core/data-collector' +import type { AIProvider } from '@universe/cli/src/lib/ai-provider' +import { AnalysisWriter } from '@universe/cli/src/lib/analysis-writer' +import type { CacheProvider } from '@universe/cli/src/lib/cache-provider' +import type { Logger } from '@universe/cli/src/lib/logger' +import { ReleaseScanner } from '@universe/cli/src/lib/release-scanner' + +// ============================================================================ +// Types +// ============================================================================ + +export interface AnalysisConfig { + mode?: string // Predefined mode (team-digest, changelog, release-changelog, etc.) + prompt?: string // Custom prompt (file path or inline text) + promptFile?: string // Explicit prompt file path + variables?: Record // Variable substitution for prompts + releaseOptions?: { + // Release-specific options + platform: 'mobile' | 'extension' + version: string + compareWith?: string + } +} + +export interface OutputConfig { + type: string // Output type (slack, markdown, file, etc.) + target?: string // Target destination (file path, channel, etc.) + options?: Record // Type-specific options +} + +export interface OrchestratorConfig { + analysis: AnalysisConfig + outputs: OutputConfig[] + collect: CollectOptions + verbose?: boolean + dryRun?: boolean + saveArtifacts?: boolean + model?: string // AI model to use (defaults to claude-opus-4-1-20250805) + bypassCache?: boolean // Bypass cache for this run +} + +// ============================================================================ +// Prompt Management +// ============================================================================ + +class PromptResolver { + private builtInPromptsPath = join((import.meta.dir as string | undefined) ?? process.cwd(), 'src', 'prompts') + private projectPromptsPath = '.claude/prompts' + + async resolve(promptRef: string): Promise { + // If it's a multiline string or looks like instructions, use as-is + if (promptRef.includes('\n') || promptRef.length > 100) { + return promptRef + } + + // If it ends with .md, treat as file path + if (promptRef.endsWith('.md')) { + return await this.loadFromFile(promptRef) + } + + // Check for built-in prompts + const builtInPath = join(this.builtInPromptsPath, `${promptRef}.md`) + if (await this.fileExists(builtInPath)) { + return await this.loadFromFile(builtInPath) + } + + // Check for project prompts + const projectPath = join(this.projectPromptsPath, `${promptRef}.md`) + if (await this.fileExists(projectPath)) { + return await this.loadFromFile(projectPath) + } + + // Treat as inline prompt if not found as file + return promptRef + } + + private async fileExists(path: string): Promise { + try { + await Bun.file(path).text() + return true + } catch { + return false + } + } + + private async loadFromFile(path: string): Promise { + try { + return await Bun.file(path).text() + } catch (error) { + throw new Error(`Failed to load prompt from ${path}: ${error}`) + } + } + + substituteVariables(prompt: string, variables: Record): string { + let result = prompt + for (const [key, value] of Object.entries(variables)) { + const escapedKey = key.replace(/[.*+?^${}()|[\]\\]/g, '\\$&') + // Use string replace with regex pattern - escapedKey is safe as it's escaped + const dollarPattern = new RegExp(`\\$${escapedKey}`, 'g') + const bracePattern = new RegExp(`{{${escapedKey}}}`, 'g') + result = result.replace(dollarPattern, value) + result = result.replace(bracePattern, value) + } + return result + } +} + +// ============================================================================ +// Analysis Orchestrator +// ============================================================================ + +export interface OrchestratorDependencies { + config: OrchestratorConfig + aiProvider: AIProvider + cacheProvider?: CacheProvider + logger: Logger +} + +export class Orchestrator { + private promptResolver = new PromptResolver() + private dataCollector: DataCollector + private analysisWriter: AnalysisWriter + private startTime: number = 0 + private timings: { dataCollection: number; claudeAnalysis: number } = { dataCollection: 0, claudeAnalysis: 0 } + private config: OrchestratorConfig + private aiProvider: AIProvider + private logger: Logger + + constructor(deps: OrchestratorDependencies) { + this.config = deps.config + this.aiProvider = deps.aiProvider + this.logger = deps.logger + this.dataCollector = new DataCollector( + deps.config.collect.repoPath, + deps.cacheProvider, + deps.config.bypassCache || false, + deps.logger, + ) + this.analysisWriter = new AnalysisWriter() + } + + async execute(): Promise> { + this.startTime = Date.now() + const runId = this.analysisWriter.getRunId() + this.logger.info(`Starting repository analysis${this.config.saveArtifacts ? ` (run: ${runId})` : ''}`) + + // Initialize analysis directory if saving artifacts + if (this.config.saveArtifacts) { + await this.analysisWriter.initialize() + // Save configuration + await this.analysisWriter.saveConfig(this.config) + } + + // Step 1: Collect repository data + const dataStartTime = Date.now() + const data = await this.collectData() + this.timings.dataCollection = Date.now() - dataStartTime + + // Step 2: Run analysis with universal analyzer + const analysisStartTime = Date.now() + const insights = await this.analyze(data) + this.timings.claudeAnalysis = Date.now() - analysisStartTime + + // Step 3: Deliver to outputs + await this.deliver(insights, data) + + // Generate summary + await this.generateSummary(data) + + const totalTime = Date.now() - this.startTime + this.logger.info(`Analysis complete! (${(totalTime / 1000).toFixed(1)}s)`) + this.logger.info(`View artifacts: ${this.analysisWriter.getRunPath()}/`) + + // Return the analysis results for UI consumption + return insights + } + + private async collectData(): Promise { + this.logger.info('Collecting repository data...') + + let data: RepositoryData + + // If in release mode (release-changelog or bug-bisect), augment collect options with release comparison + if ( + (this.config.analysis.mode === 'release-changelog' || this.config.analysis.mode === 'bug-bisect') && + this.config.analysis.releaseOptions + ) { + const scanner = new ReleaseScanner(this.config.collect.repoPath, this.logger) + const { platform, version, compareWith } = this.config.analysis.releaseOptions + + const comparison = await scanner.getReleaseComparison({ + platform, + version, + compareWith, + }) + if (!comparison) { + throw new Error(`Could not find release comparison for ${platform}/${version}`) + } + + this.logger.info(`Analyzing release: ${platform}/${version} (comparing with ${comparison.from.version})`) + + // Add release comparison to collect options + const collectOptions: CollectOptions = { + ...this.config.collect, + releaseComparison: comparison, + } + + data = await this.dataCollector.collect(collectOptions) + } else { + data = await this.dataCollector.collect(this.config.collect) + } + + // Save collected data if saving artifacts + if (this.config.saveArtifacts) { + await this.analysisWriter.saveCommits(data.commits, data.metadata) + await this.analysisWriter.savePullRequests(data.pullRequests) + await this.analysisWriter.saveStats(data.stats) + } + + return data + } + + private async analyze(data: RepositoryData): Promise> { + this.logger.info('Running analysis...') + + // Build the analysis prompt + const prompt = await this.buildPrompt(data) + if (this.config.saveArtifacts) { + await this.analysisWriter.savePrompt(prompt) + } + + // Prepare data context + const context = this.prepareContext(data) + if (this.config.saveArtifacts) { + await this.analysisWriter.saveContext(context) + } + + // Smart injection: replace if template has placeholder, otherwise append + let analysisPrompt: string + if (prompt.includes('{{COMMIT_DATA}}')) { + // New style: Replace the variable + analysisPrompt = prompt.replace(/{{COMMIT_DATA}}/g, context) + } else { + // Legacy style: Append to end + analysisPrompt = `${prompt}\n\n## Repository Data\n\n${context}` + } + + // Estimate tokens (rough approximation: 1 token ≈ 4 characters) + let estimatedTokens = Math.round(analysisPrompt.length / 4) + this.logger.info(`Prepared Claude context (estimated ~${estimatedTokens.toLocaleString()} tokens)...`) + + // Check if we're over Claude's limit (roughly 200k tokens for Claude 3) + const MAX_TOKENS = 150000 // Conservative limit to leave room for response + + if (estimatedTokens > MAX_TOKENS) { + this.logger.warn(`Context too large (${estimatedTokens} tokens), reducing data...`) + + // Step 1: Try again without diffs (prefer PR bodies over diffs) + const reducedContext = this.prepareContext(data, true) // skipDiffs flag + if (prompt.includes('{{COMMIT_DATA}}')) { + analysisPrompt = prompt.replace(/{{COMMIT_DATA}}/g, reducedContext) + } else { + analysisPrompt = `${prompt}\n\n## Repository Data\n\n${reducedContext}` + } + estimatedTokens = Math.round(analysisPrompt.length / 4) + this.logger.info(`Reduced context to ~${estimatedTokens.toLocaleString()} tokens (removed diffs)`) + + // Step 2: If still too large, truncate PR bodies proportionally + if (estimatedTokens > MAX_TOKENS) { + this.logger.warn('Still too large, truncating PR bodies...') + const dataWithTruncatedPRs = this.truncatePRBodies(data, 0.5) // Reduce to 50% of original length + const contextWithTruncatedPRs = this.prepareContext(dataWithTruncatedPRs, true) + if (prompt.includes('{{COMMIT_DATA}}')) { + analysisPrompt = prompt.replace(/{{COMMIT_DATA}}/g, contextWithTruncatedPRs) + } else { + analysisPrompt = `${prompt}\n\n## Repository Data\n\n${contextWithTruncatedPRs}` + } + estimatedTokens = Math.round(analysisPrompt.length / 4) + this.logger.info(`Reduced context to ~${estimatedTokens.toLocaleString()} tokens (truncated PR bodies to 50%)`) + + // Step 3: If still too large, truncate commits + if (estimatedTokens > MAX_TOKENS) { + this.logger.warn('Still too large, truncating commit list...') + const truncatedData = { ...dataWithTruncatedPRs, commits: dataWithTruncatedPRs.commits.slice(0, 100) } + const minimalContext = this.prepareContext(truncatedData, true) + if (prompt.includes('{{COMMIT_DATA}}')) { + analysisPrompt = prompt.replace(/{{COMMIT_DATA}}/g, minimalContext) + } else { + analysisPrompt = `${prompt}\n\n## Repository Data\n\n${minimalContext}` + } + estimatedTokens = Math.round(analysisPrompt.length / 4) + this.logger.info(`Final context: ~${estimatedTokens.toLocaleString()} tokens (kept first 100 commits)`) + } + } + } + + if (this.config.saveArtifacts) { + await this.analysisWriter.saveClaudeInput(analysisPrompt) + } + + if (this.config.verbose) { + this.logger.debug(`Analysis prompt: ${analysisPrompt.slice(0, 500)}...`) + } + + // For now, directly use Claude API since Task is not available in this context + // In production, this would use the Task API + const result = await this.analyzeWithClaude(analysisPrompt) + + // Save Claude's output + if (this.config.saveArtifacts) { + await this.analysisWriter.saveClaudeOutput(result) + } + + return result + } + + private async buildPrompt(data: RepositoryData): Promise { + let promptText = '' + + // Load base prompt + if (this.config.analysis.mode) { + promptText = await this.promptResolver.resolve(this.config.analysis.mode) + } else if (this.config.analysis.promptFile) { + promptText = await this.promptResolver.resolve(this.config.analysis.promptFile) + } else if (this.config.analysis.prompt) { + promptText = await this.promptResolver.resolve(this.config.analysis.prompt) + } else { + // Default to team-digest + promptText = await this.promptResolver.resolve('team-digest') + } + + // Build variables for substitution + const variables: Record = { + ...this.config.analysis.variables, + } + + // Add release context variables for bug-bisect mode + if ( + this.config.analysis.mode === 'bug-bisect' && + this.config.analysis.releaseOptions && + data.metadata.releaseInfo + ) { + variables.PLATFORM = data.metadata.releaseInfo.platform + variables.RELEASE_TO = data.metadata.releaseInfo.to + variables.RELEASE_FROM = data.metadata.releaseInfo.from + } + + // Substitute variables if provided + if (Object.keys(variables).length > 0) { + promptText = this.promptResolver.substituteVariables(promptText, variables) + } + + return promptText + } + + /** + * Truncate PR bodies proportionally to reduce context size + * @param data Original repository data + * @param ratio Ratio to keep (0.5 = keep 50% of each PR body) + */ + private truncatePRBodies(data: RepositoryData, ratio: number): RepositoryData { + const truncatedPRs = data.pullRequests.map((pr: PullRequest) => { + if (pr.body && pr.body.length > 0) { + const targetLength = Math.max(100, Math.floor(pr.body.length * ratio)) // Keep at least 100 chars + const truncatedBody = pr.body.slice(0, targetLength) + (pr.body.length > targetLength ? '... [truncated]' : '') + return { + number: pr.number, + title: pr.title, + body: truncatedBody, + author: pr.author, + state: pr.state, + mergedAt: pr.mergedAt, + mergeCommitSha: pr.mergeCommitSha, + } satisfies PullRequest + } + return { + number: pr.number, + title: pr.title, + body: pr.body, + author: pr.author, + state: pr.state, + mergedAt: pr.mergedAt, + mergeCommitSha: pr.mergeCommitSha, + } satisfies PullRequest + }) as PullRequest[] + + return { + ...data, + pullRequests: truncatedPRs, + } + } + + private prepareContext(data: RepositoryData, skipDiffs: boolean = false): string { + const lines: string[] = [] + let prBodyTokens = 0 + + // Metadata section (compact format) + lines.push('=== REPOSITORY METADATA ===') + lines.push(`Repository: ${data.metadata.repository}`) + lines.push(`Period: ${data.metadata.period}`) + + if (data.metadata.releaseInfo) { + lines.push( + `Release: ${data.metadata.releaseInfo.platform} ${data.metadata.releaseInfo.from} → ${data.metadata.releaseInfo.to}`, + ) + } + + lines.push(`Total commits: ${data.metadata.commitCount}`) + lines.push(`Pull requests: ${data.metadata.prCount}`) + + if (data.metadata.filtering) { + lines.push(`Filtered: ${data.metadata.filtering.trivialCommitsFiltered} trivial commits removed`) + } + lines.push('') + + // Stats section (compact) + lines.push('=== STATISTICS ===') + lines.push(`Authors: ${data.stats.totalAuthors}`) + lines.push(`Files changed: ${data.stats.filesChanged}`) + lines.push(`Lines: +${data.stats.linesAdded} -${data.stats.linesDeleted}`) + lines.push('') + + // Pull requests section with full bodies (up to prBodyLimit) + if (data.pullRequests.length > 0) { + lines.push('=== PULL REQUESTS ===') + for (const pr of data.pullRequests) { + lines.push(`PR #${pr.number}: ${pr.title} [${pr.state}] @${pr.author}`) + if (pr.body) { + // Include full PR body (already truncated to prBodyLimit during collection) + // Preserve markdown formatting with proper newlines + const bodyLines = pr.body.split('\n') + for (const line of bodyLines) { + lines.push(` ${line}`) + } + // Track token usage for PR bodies (rough approximation: 1 token ≈ 4 characters) + prBodyTokens += Math.ceil(pr.body.length / 4) + } + } + lines.push('') + } + + // Log PR body token contribution if significant + if (prBodyTokens > 0) { + this.logger.info(`PR bodies contribute ~${prBodyTokens.toLocaleString()} tokens to context`) + } + + // Commits section (ultra-compact format) + lines.push('=== COMMITS ===') + for (const commit of data.commits) { + // Format: sha | author | message | stats + const date = new Date(commit.timestamp).toISOString().split('T')[0] + lines.push(`${commit.sha.slice(0, 7)} | ${date} | ${commit.author.email.split('@')[0]} | ${commit.message}`) + + // If we have file information, show it compactly + if (commit.files && commit.files.length > 0) { + // Group files by directory for even more compact display + const fileGroups = new Map() + + for (const file of commit.files) { + const parts = file.path.split('/') + const dir = parts.length > 1 ? parts.slice(0, -1).join('/') : '.' + const filename = parts[parts.length - 1] + + if (!fileGroups.has(dir)) { + fileGroups.set(dir, []) + } + + // Status indicators: M=modified, A=added, D=deleted, R=renamed + const statusChar = file.status[0]?.toUpperCase() ?? 'M' + const changes = `${statusChar}:+${file.additions}-${file.deletions}` + const files = fileGroups.get(dir) + if (files) { + files.push(`${filename}(${changes})`) + } + } + + // Output grouped files + for (const [dir, files] of fileGroups) { + if (files.length <= 3) { + lines.push(` ${dir}/: ${files.join(' ')}`) + } else { + // If many files in same dir, summarize + lines.push(` ${dir}/: ${files.slice(0, 2).join(' ')} +${files.length - 2} more`) + } + } + + // Include diffs if available (already in compact diff format) + if (!skipDiffs) { + for (const file of commit.files) { + if (file.diff) { + lines.push(` --- ${file.path} ---`) + // Add indent to diff lines for readability + const diffLines = file.diff.split('\n').map((line: string) => ` ${line}`) + lines.push(...diffLines.slice(0, 10)) // Limit diff preview + if (diffLines.length > 10) { + lines.push(` ... (${diffLines.length - 10} more lines)`) + } + } + } + } + } + } + + return lines.join('\n') + } + + private async analyzeWithClaude(prompt: string): Promise> { + this.logger.info('Analyzing with Claude...') + + const model = this.config.model || 'claude-sonnet-4-5-20250929' + const stream = this.aiProvider.streamText({ + prompt, + model, + maxTokens: 64000, + temperature: 1, + }) + + // Stream and accumulate full response, emitting excerpts for UI + let fullText = '' + + // Buffers for accumulating deltas into meaningful chunks + let textBuffer = '' + let reasoningBuffer = '' + const MIN_EXCERPT_LENGTH = 150 // Minimum chars before emitting (higher threshold to reduce frequency) + const MAX_EXCERPT_LENGTH = 160 // Maximum chars per excerpt (very compact) + const MAX_BUFFER_LENGTH = 220 // Force emit if buffer gets too large + let lastEmittedTime = 0 + const MIN_EMIT_INTERVAL_MS = 2000 // Only emit excerpts every 2 seconds max + + for await (const chunk of stream) { + // Accumulate text + if (chunk.text) { + fullText += chunk.text + textBuffer += chunk.text + + // Check if we should emit a text excerpt + if (this.logger.emitStreamingExcerpt) { + const now = Date.now() + // Throttle excerpt emissions + if (now - lastEmittedTime >= MIN_EMIT_INTERVAL_MS) { + // Find sentence boundaries (including newlines for changelog-style content) + const lastSentenceEnd = Math.max( + textBuffer.lastIndexOf('.\n'), + textBuffer.lastIndexOf('.\n\n'), + textBuffer.lastIndexOf('. '), + textBuffer.lastIndexOf('!\n'), + textBuffer.lastIndexOf('?\n'), + textBuffer.lastIndexOf('\n\n'), // Double newline (paragraph break) + ) + + // Only emit if we have a good boundary and enough content + if ( + (lastSentenceEnd >= MIN_EXCERPT_LENGTH && lastSentenceEnd <= MAX_EXCERPT_LENGTH) || + (textBuffer.length >= MAX_BUFFER_LENGTH && lastSentenceEnd > MIN_EXCERPT_LENGTH) + ) { + const excerpt = textBuffer.slice(0, lastSentenceEnd > 0 ? lastSentenceEnd + 1 : MAX_EXCERPT_LENGTH).trim() + // Filter out markdown headers and very short content + if (excerpt.length >= MIN_EXCERPT_LENGTH && !excerpt.startsWith('##')) { + this.logger.emitStreamingExcerpt(excerpt, false) + textBuffer = textBuffer.slice(lastSentenceEnd > 0 ? lastSentenceEnd + 1 : MAX_EXCERPT_LENGTH) + lastEmittedTime = now + } + } + } + } else { + // CLI mode: write directly to console + process.stdout.write(chunk.text) + } + } + + // Accumulate reasoning + if (chunk.reasoning) { + reasoningBuffer += chunk.reasoning + + // Check if we should emit a reasoning excerpt (prefer reasoning over text) + if (this.logger.emitStreamingExcerpt) { + const now = Date.now() + // Throttle excerpt emissions + if (now - lastEmittedTime >= MIN_EMIT_INTERVAL_MS) { + // Find sentence boundaries for reasoning + const lastSentenceEnd = Math.max( + reasoningBuffer.lastIndexOf('.\n'), + reasoningBuffer.lastIndexOf('.\n\n'), + reasoningBuffer.lastIndexOf('. '), + reasoningBuffer.lastIndexOf('!\n'), + reasoningBuffer.lastIndexOf('?\n'), + reasoningBuffer.lastIndexOf('\n\n'), + ) + + // Only emit if we have a good boundary and enough content + if ( + (lastSentenceEnd >= MIN_EXCERPT_LENGTH && lastSentenceEnd <= MAX_EXCERPT_LENGTH) || + (reasoningBuffer.length >= MAX_BUFFER_LENGTH && lastSentenceEnd > MIN_EXCERPT_LENGTH) + ) { + const excerpt = reasoningBuffer + .slice(0, lastSentenceEnd > 0 ? lastSentenceEnd + 1 : MAX_EXCERPT_LENGTH) + .trim() + // Filter out markdown headers and very short content + if (excerpt.length >= MIN_EXCERPT_LENGTH && !excerpt.startsWith('##')) { + this.logger.emitStreamingExcerpt(excerpt, true) + reasoningBuffer = reasoningBuffer.slice(lastSentenceEnd > 0 ? lastSentenceEnd + 1 : MAX_EXCERPT_LENGTH) + lastEmittedTime = now + } + } + } + } + } + + if (chunk.isComplete) { + // Emit any remaining buffered content + if (this.logger.emitStreamingExcerpt) { + if (textBuffer.trim().length > 0) { + this.logger.emitStreamingExcerpt(textBuffer.trim(), false) + } + if (reasoningBuffer.trim().length > 0) { + this.logger.emitStreamingExcerpt(reasoningBuffer.trim(), true) + } + } else { + } + break + } + } + + // Try to parse as JSON if possible (especially for bug-bisect mode) + if (this.config.analysis.mode === 'bug-bisect') { + try { + // Extract JSON from markdown code blocks if present + const jsonMatch = fullText.match(/```(?:json)?\s*(\{[\s\S]*\})\s*```/) || fullText.match(/(\{[\s\S]*\})/) + const jsonText = jsonMatch && jsonMatch[1] ? jsonMatch[1] : fullText + const parsed = JSON.parse(jsonText) as Record + // Ensure it has the expected structure + if (parsed.suspiciousCommits && Array.isArray(parsed.suspiciousCommits)) { + return parsed + } + // If structure is wrong, wrap it + return { analysis: fullText, parsed } + } catch (error) { + this.logger.warn(`Failed to parse JSON response: ${error}`) + // Return as analysis text but try to extract any JSON-like content + return { analysis: fullText, error: 'Failed to parse JSON response' } + } + } + + // For other modes, try to parse as JSON but fallback to text + try { + return JSON.parse(fullText) as Record + } catch { + return { analysis: fullText } + } + } + + private async deliver(insights: Record, data: RepositoryData): Promise { + this.logger.info('Delivering results...') + + for (const output of this.config.outputs) { + await this.deliverToOutput({ insights, data, output }) + } + } + + private async deliverToOutput(args: { + insights: Record + data: RepositoryData + output: OutputConfig + }): Promise { + const { insights, data, output } = args + this.logger.info(`Delivering to ${output.type}...`) + + switch (output.type) { + case 'stdout': { + console.log('\n=== Analysis Results ===\n') + console.log(JSON.stringify(insights, null, 2)) + break + } + + case 'file': + case 'markdown': { + const path = output.target || 'analysis-output.md' + if (this.config.dryRun) { + this.logger.info(`[DRY RUN] Would save to file: ${path}`) + this.logger.info('[DRY RUN] Preview of content:') + console.log(this.formatAsMarkdown(insights, data).slice(0, 500) + '...') + } else { + // In production, this would use markdown-formatter subagent + await this.saveToFile({ insights, data, path }) + this.logger.info(`Saved to ${path}`) + } + break + } + + case 'slack': { + if (this.config.dryRun) { + this.logger.info(`[DRY RUN] Would publish to Slack channel: ${output.target}`) + this.logger.info(`[DRY RUN] Message preview: ${JSON.stringify(insights).slice(0, 200)}...`) + } else { + // In production, this would use slack-publisher subagent + this.logger.info(`Would publish to Slack channel: ${output.target}`) + this.logger.info('Note: Slack integration requires subagent implementation') + } + break + } + + default: + this.logger.warn(`Unknown output type: ${output.type}`) + } + } + + private async saveToFile(args: { + insights: Record + data: RepositoryData + path: string + }): Promise { + const { insights, data, path } = args + const content = this.formatAsMarkdown(insights, data) + await Bun.write(path, content) + + // Also save to analysis folder + await this.analysisWriter.saveReport(content) + } + + private formatAsMarkdown(insights: Record, data: RepositoryData): string { + const lines: string[] = [] + + lines.push(`# Repository Analysis: ${data.metadata.repository}`) + lines.push(`*Period: ${data.metadata.period}*`) + lines.push(`*Generated: ${data.metadata.collectedAt}*`) + lines.push('') + + if (insights.themes && Array.isArray(insights.themes)) { + lines.push('## Themes') + for (const theme of insights.themes) { + if (theme && typeof theme === 'object' && 'title' in theme && 'description' in theme) { + lines.push(`### ${String(theme.title)}`) + lines.push(String(theme.description)) + lines.push('') + } + } + } + + if (insights.highlights && Array.isArray(insights.highlights)) { + lines.push('## Highlights') + for (const highlight of insights.highlights) { + lines.push(`- ${String(highlight)}`) + } + lines.push('') + } + + if (insights.metrics && typeof insights.metrics === 'object') { + const metrics = insights.metrics as Record + lines.push('## Metrics') + if (typeof metrics.total_commits === 'number') { + lines.push(`- Commits: ${metrics.total_commits}`) + } + if (typeof metrics.total_prs === 'number') { + lines.push(`- Pull Requests: ${metrics.total_prs}`) + } + if (typeof metrics.active_contributors === 'number') { + lines.push(`- Contributors: ${metrics.active_contributors}`) + } + lines.push('') + } + + if (typeof insights === 'string') { + lines.push('## Analysis') + lines.push(insights) + // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition + } else if (insights && typeof insights === 'object' && 'analysis' in insights && insights.analysis) { + lines.push('## Analysis') + lines.push(String(insights.analysis)) + } + + return lines.join('\n') + } + + private async generateSummary(data: RepositoryData): Promise { + if (!this.config.saveArtifacts) { + return + } + + // Get stats from data collector if available + const totalCommits = data.metadata.filtering?.totalCommitsFound ?? data.metadata.commitCount + const trivialFiltered = data.metadata.filtering?.trivialCommitsFiltered ?? 0 + + await this.analysisWriter.saveSummary({ + config: this.config, + dataCollection: { + totalCommits, + trivialCommitsFiltered: trivialFiltered, + commitsAnalyzed: data.commits.length, + prsExtracted: data.pullRequests.length, + tokensEstimated: Math.round((data.commits.length * 100 + data.pullRequests.length * 50) / 4), + }, + timing: { + dataCollection: this.timings.dataCollection, + claudeAnalysis: this.timings.claudeAnalysis, + total: Date.now() - this.startTime, + }, + }) + } +} diff --git a/apps/cli/src/index.ts b/apps/cli/src/index.ts new file mode 100644 index 00000000000..d6a57aae330 --- /dev/null +++ b/apps/cli/src/index.ts @@ -0,0 +1,2 @@ +// eslint-disable-next-line @typescript-eslint/triple-slash-reference +/// diff --git a/apps/cli/src/lib/ai-provider-vercel.ts b/apps/cli/src/lib/ai-provider-vercel.ts new file mode 100644 index 00000000000..d4aeb3d148a --- /dev/null +++ b/apps/cli/src/lib/ai-provider-vercel.ts @@ -0,0 +1,143 @@ +import { AnthropicProviderOptions, anthropic } from '@ai-sdk/anthropic' +import type { AIProvider, GenerateTextInput, StreamChunk, StreamTextInput } from '@universe/cli/src/lib/ai-provider' +import { generateText, streamText } from 'ai' + +/** + * Vercel AI SDK implementation of AIProvider + * + * Maps Vercel AI SDK responses to our contract interface. + */ +export class VercelAIProvider implements AIProvider { + constructor(private apiKey?: string) { + // API key can be provided via constructor or ANTHROPIC_API_KEY env var + // If provided, set it as environment variable for Vercel AI SDK to use + if (apiKey) { + process.env.ANTHROPIC_API_KEY = apiKey + } + } + + private processFullStreamChunk( + chunk: unknown, + accumulators: { fullText: { value: string }; fullReasoning: { value: string } }, + ): StreamChunk | null { + const chunkObj = typeof chunk === 'object' && chunk !== null && 'type' in chunk ? chunk : null + + if (!chunkObj) { + // Fallback: treat as text chunk + const textChunk = String(chunk) + accumulators.fullText.value += textChunk + return { + text: textChunk, + isComplete: false, + } + } + + const chunkType = chunkObj.type as string + + // Reasoning delta chunks (per Vercel AI SDK docs) + if (chunkType === 'reasoning-delta') { + const reasoningContent = String((chunkObj as { text?: string }).text || '') + if (reasoningContent) { + accumulators.fullReasoning.value += reasoningContent + return { + text: '', + reasoning: reasoningContent, + isComplete: false, + } + } + return null + } + + // Text delta chunks (per Vercel AI SDK docs) + if (chunkType === 'text-delta') { + const textContent = String((chunkObj as { text?: string }).text || '') + if (textContent) { + accumulators.fullText.value += textContent + return { + text: textContent, + reasoning: undefined, + isComplete: false, + } + } + } + + return null + } + + async *streamText(input: StreamTextInput): AsyncGenerator { + const model = anthropic(input.model) + + const result = streamText({ + model, + prompt: input.prompt, + system: input.systemPrompt, + temperature: input.temperature, + ...(input.maxTokens && { maxTokens: input.maxTokens }), + providerOptions: { + anthropic: { + thinking: { type: 'enabled', budgetTokens: 63999 }, + sendReasoning: true, + } satisfies AnthropicProviderOptions, + }, + }) + + const accumulators = { + fullText: { value: '' }, + fullReasoning: { value: '' }, + } + + // Check if fullStream is available (contains reasoning chunks when sendReasoning is true) + // Process fullStream if available to access reasoning, otherwise use textStream + const textStream = result.textStream + const fullStream = 'fullStream' in result ? (result as { fullStream?: AsyncIterable }).fullStream : null + + if (fullStream) { + for await (const chunk of fullStream) { + const processedChunk = this.processFullStreamChunk(chunk, accumulators) + if (processedChunk) { + yield processedChunk + } + } + } else { + // Fallback: process text stream normally + for await (const chunk of textStream) { + const textChunk = String(chunk) + accumulators.fullText.value += textChunk + yield { + text: textChunk, + isComplete: false, + } + } + } + + // Yield final complete chunk (signal only, no duplicate content) + // The orchestrator already accumulated all delta chunks during streaming, + // so we only need to signal completion without re-sending the entire text + yield { + text: '', + reasoning: undefined, + isComplete: true, + } + } + + async generateText(input: GenerateTextInput): Promise { + const model = anthropic(input.model) + + const result = await generateText({ + model, + prompt: input.prompt, + system: input.systemPrompt, + temperature: input.temperature, + ...(input.maxTokens && { maxTokens: input.maxTokens }), + }) + + return result.text + } +} + +/** + * Factory function to create a VercelAIProvider instance + */ +export function createVercelAIProvider(apiKey?: string): VercelAIProvider { + return new VercelAIProvider(apiKey || process.env.ANTHROPIC_API_KEY) +} diff --git a/apps/cli/src/lib/ai-provider.ts b/apps/cli/src/lib/ai-provider.ts new file mode 100644 index 00000000000..24c37fbd150 --- /dev/null +++ b/apps/cli/src/lib/ai-provider.ts @@ -0,0 +1,50 @@ +/** + * AI Provider Contract + * + * Defines the interface for AI text generation providers. + * Allows swapping implementations (e.g., Claude SDK, Vercel AI SDK, etc.) + */ + +export interface StreamTextInput { + prompt: string + systemPrompt?: string + model: string + temperature?: number + maxTokens?: number +} + +export interface StreamChunk { + text: string + isComplete: boolean + reasoning?: string +} + +export interface GenerateTextInput { + prompt: string + systemPrompt?: string + model: string + temperature?: number + maxTokens?: number +} + +/** + * AI Provider interface contract + * + * Provides methods for streaming and non-streaming text generation. + * Implementations should map to their respective SDKs while maintaining this interface. + */ +export interface AIProvider { + /** + * Stream text generation with incremental chunks + * @param input - Configuration for text generation + * @returns Async generator yielding text chunks + */ + streamText(input: StreamTextInput): AsyncGenerator + + /** + * Generate complete text without streaming + * @param input - Configuration for text generation + * @returns Complete generated text + */ + generateText(input: GenerateTextInput): Promise +} diff --git a/apps/cli/src/lib/analysis-writer.ts b/apps/cli/src/lib/analysis-writer.ts new file mode 100644 index 00000000000..e62a3606af9 --- /dev/null +++ b/apps/cli/src/lib/analysis-writer.ts @@ -0,0 +1,241 @@ +import { mkdir } from 'node:fs/promises' +import { join } from 'node:path' + +/** + * Utility for writing analysis artifacts to disk for debugging and audit + */ +export class AnalysisWriter { + private runId: string + private basePath: string + private runPath: string + + constructor(basePath: string = '.analysis') { + this.basePath = basePath + this.runId = this.generateRunId() + this.runPath = join(this.basePath, this.runId) + } + + /** + * Generate a unique run ID based on timestamp + */ + private generateRunId(): string { + const now = new Date() + const year = now.getFullYear() + const month = String(now.getMonth() + 1).padStart(2, '0') + const day = String(now.getDate()).padStart(2, '0') + const hours = String(now.getHours()).padStart(2, '0') + const minutes = String(now.getMinutes()).padStart(2, '0') + const seconds = String(now.getSeconds()).padStart(2, '0') + + return `analysis-${year}${month}${day}-${hours}${minutes}${seconds}` + } + + /** + * Get the run ID for this analysis + */ + getRunId(): string { + return this.runId + } + + /** + * Get the full path to the run directory + */ + getRunPath(): string { + return this.runPath + } + + /** + * Initialize the run directory + */ + async initialize(): Promise { + await mkdir(this.runPath, { recursive: true }) + } + + /** + * Save JSON data to a file + */ + async saveJson(filename: string, data: unknown): Promise { + const filepath = join(this.runPath, filename) + await Bun.write(filepath, JSON.stringify(data, null, 2)) + } + + /** + * Save text content to a file + */ + async saveText(filename: string, content: string): Promise { + const filepath = join(this.runPath, filename) + await Bun.write(filepath, content) + } + + /** + * Save the configuration used for this run + */ + async saveConfig(config: unknown): Promise { + await this.saveJson('config.json', config) + } + + /** + * Save commit data + */ + async saveCommits(commits: unknown[], metadata?: unknown): Promise { + await this.saveJson('commits.json', { + count: commits.length, + metadata, + commits, + }) + } + + /** + * Save pull request data + */ + async savePullRequests(prs: unknown[]): Promise { + await this.saveJson('pull-requests.json', { + count: prs.length, + pullRequests: prs, + }) + } + + /** + * Save repository statistics + */ + async saveStats(stats: unknown): Promise { + await this.saveJson('stats.json', stats) + } + + /** + * Save the context sent to Claude + */ + async saveContext(context: string): Promise { + await this.saveText('context.json', context) + } + + /** + * Save the prompt used + */ + async savePrompt(prompt: string): Promise { + await this.saveText('prompt.md', prompt) + } + + /** + * Save the complete input to Claude + */ + async saveClaudeInput(input: string): Promise { + await this.saveText('claude-input.md', input) + } + + /** + * Save Claude's response + */ + async saveClaudeOutput(output: unknown): Promise { + if (typeof output === 'string') { + await this.saveText('claude-output.md', output) + } else { + await this.saveJson('claude-output.json', output) + } + } + + /** + * Save the final report + */ + async saveReport(report: string): Promise { + await this.saveText('report.md', report) + } + + /** + * Save a debug summary + */ + async saveSummary(data: { + config: unknown + dataCollection: { + totalCommits: number + trivialCommitsFiltered: number + commitsAnalyzed: number + prsExtracted: number + tokensEstimated?: number + } + filesFiltered?: { + snapshots: number + lockfiles: number + generated: number + other: number + } + timing?: { + dataCollection: number + claudeAnalysis: number + total: number + } + }): Promise { + const { config, dataCollection, filesFiltered, timing } = data + + // Type assertion for config structure + const typedConfig = config as { + analysis?: { + mode?: string + releaseOptions?: { + platform?: string + version?: string + compareWith?: string + } + } + collect?: { + since?: string + } + } + + const summary = `# Analysis Run: ${this.runId} + +## Configuration +- Mode: ${typedConfig.analysis?.mode || 'unknown'} +${ + typedConfig.analysis?.releaseOptions + ? `- Platform: ${typedConfig.analysis.releaseOptions.platform} +- Version: ${typedConfig.analysis.releaseOptions.version} +- Comparing with: ${typedConfig.analysis.releaseOptions.compareWith || 'previous'}` + : '' +} +- Since: ${typedConfig.collect?.since || 'unknown'} + +## Data Collection +- Total commits found: ${dataCollection.totalCommits} +- Trivial commits filtered: ${dataCollection.trivialCommitsFiltered} +- Commits analyzed: ${dataCollection.commitsAnalyzed} +- PRs extracted: ${dataCollection.prsExtracted} +${dataCollection.tokensEstimated ? `- Tokens estimated: ~${dataCollection.tokensEstimated.toLocaleString()}` : ''} + +${ + filesFiltered + ? `## Files Filtered +- Snapshots: ${filesFiltered.snapshots} files +- Lockfiles: ${filesFiltered.lockfiles} files +- Generated: ${filesFiltered.generated} files +- Other: ${filesFiltered.other} files` + : '' +} + +${ + timing + ? `## Timing +- Data collection: ${(timing.dataCollection / 1000).toFixed(1)}s +- Claude analysis: ${(timing.claudeAnalysis / 1000).toFixed(1)}s +- Total: ${(timing.total / 1000).toFixed(1)}s` + : '' +} + +## Output Location +- Run ID: ${this.runId} +- Path: ${this.runPath}/ +` + + await this.saveText('summary.md', summary) + } + + /** + * Save list of filtered files + */ + async saveFilteredFiles(files: { path: string; reason: string }[]): Promise { + await this.saveJson('filtered-files.json', { + count: files.length, + files, + }) + } +} diff --git a/apps/cli/src/lib/cache-keys.ts b/apps/cli/src/lib/cache-keys.ts new file mode 100644 index 00000000000..dffacb069c7 --- /dev/null +++ b/apps/cli/src/lib/cache-keys.ts @@ -0,0 +1,106 @@ +import { createHash } from 'node:crypto' +import { type CollectOptions } from '@universe/cli/src/core/data-collector' + +/** + * Generate deterministic cache keys from CollectOptions + * Excludes non-deterministic fields like commitDataConfig that affect output format + */ + +/** + * Create a hash from a string + */ +function hash(input: string): string { + return createHash('sha256').update(input).digest('hex').slice(0, 16) +} + +/** + * Generate cache key components from CollectOptions (excluding output formatting options) + */ +function getCacheKeyComponents(options: CollectOptions): string { + const parts: string[] = [] + + // Repository identifier + if (options.repository?.owner && options.repository.name) { + parts.push(`repo:${options.repository.owner}/${options.repository.name}`) + } else if (options.repoPath) { + parts.push(`repopath:${options.repoPath}`) + } + + // Time-based query + parts.push(`since:${options.since}`) + + // Branch filter + if (options.branch) { + parts.push(`branch:${options.branch}`) + } + + // Author filter + if (options.author) { + parts.push(`author:${options.author}`) + } + + // Team filters + if (options.teamFilter?.length) { + const sortedEmails = [...options.teamFilter].sort().join(',') + parts.push(`team:${sortedEmails}`) + } + + if (options.teamUsernames?.length) { + const sortedUsernames = [...options.teamUsernames].sort().join(',') + parts.push(`usernames:${sortedUsernames}`) + } + + // Include open PRs flag + if (options.includeOpenPrs) { + parts.push('includeOpenPrs:true') + } + + // Release comparison (deterministic by version range) + if (options.releaseComparison) { + parts.push(`release:${options.releaseComparison.from.version}-${options.releaseComparison.to.version}`) + parts.push(`platform:${options.releaseComparison.to.platform}`) + parts.push(`range:${options.releaseComparison.commitRange}`) + } + + // Exclude trivial commits flag + if (options.excludeTrivialCommits) { + parts.push('excludeTrivial:true') + } + + return parts.join('|') +} + +/** + * Generate cache key for commits + */ +export function getCommitsCacheKey(options: CollectOptions): string { + const components = getCacheKeyComponents(options) + return `commits:${hash(components)}` +} + +/** + * Generate cache key for pull requests + */ +export function getPullRequestsCacheKey(options: CollectOptions): string { + const components = getCacheKeyComponents(options) + return `prs:${hash(components)}` +} + +/** + * Generate cache key for stats + */ +export function getStatsCacheKey(options: CollectOptions): string { + const components = getCacheKeyComponents(options) + return `stats:${hash(components)}` +} + +/** + * Generate pattern to invalidate all cache entries for a repository + */ +export function getRepositoryCachePattern(repository?: { owner?: string; name?: string }): string { + if (repository?.owner && repository.name) { + const repoHash = hash(`repo:${repository.owner}/${repository.name}`) + return `%:${repoHash}%` + } + return '%' +} diff --git a/apps/cli/src/lib/cache-provider-sqlite.ts b/apps/cli/src/lib/cache-provider-sqlite.ts new file mode 100644 index 00000000000..4b7e2119fd1 --- /dev/null +++ b/apps/cli/src/lib/cache-provider-sqlite.ts @@ -0,0 +1,130 @@ +import { Database } from 'bun:sqlite' +import { existsSync } from 'node:fs' +import { mkdir } from 'node:fs/promises' +import { join } from 'node:path' +import { type CacheProvider } from '@universe/cli/src/lib/cache-provider' + +/** + * SQLite implementation of CacheProvider using Bun's built-in SQLite + */ +export class SqliteCacheProvider implements CacheProvider { + private db: Database + private readonly dbPath: string + + constructor(dbPath?: string) { + // Default to ~/.gh-agent/cache.db + this.dbPath = dbPath || join(process.env.HOME || process.env.USERPROFILE || '.', '.gh-agent', 'cache.db') + this.ensureCacheDirectorySync() + this.db = new Database(this.dbPath) + this.initializeSchema() + this.cleanupExpired() + } + + private ensureCacheDirectorySync(): void { + const dir = join(this.dbPath, '..') + if (!existsSync(dir)) { + try { + // Use sync version for constructor - Bun will create parent directories + mkdir(dir, { recursive: true }).catch((error) => { + // eslint-disable-next-line no-console + console.error(`[WARN] Failed to create cache directory: ${error}`) + }) + } catch { + // Ignore - will fail gracefully on database creation + } + } + } + + private initializeSchema(): void { + this.db.exec(` + CREATE TABLE IF NOT EXISTS cache_entries ( + key TEXT PRIMARY KEY, + value TEXT NOT NULL, + expires_at INTEGER, + created_at INTEGER NOT NULL + ); + + CREATE INDEX IF NOT EXISTS idx_expires_at ON cache_entries(expires_at); + `) + } + + /** + * Remove expired entries (called on initialization and periodically) + */ + private cleanupExpired(): void { + const now = Date.now() + this.db.exec(`DELETE FROM cache_entries WHERE expires_at IS NOT NULL AND expires_at < ${now}`) + } + + async get(key: string): Promise { + try { + const now = Date.now() + const stmt = this.db.prepare(` + SELECT value, expires_at + FROM cache_entries + WHERE key = ? AND (expires_at IS NULL OR expires_at >= ?) + `) + + const result = stmt.get(key, now) as { value: string; expires_at: number | null } | undefined + + if (!result) { + return null + } + + // Clean up expired entries periodically (every 100 reads) + if (Math.random() < 0.01) { + this.cleanupExpired() + } + + return JSON.parse(result.value) as T + } catch (_error) { + return null + } + } + + // eslint-disable-next-line max-params -- Required to match CacheProvider interface + async set(key: string, value: T, ttlSeconds?: number): Promise { + try { + const serialized = JSON.stringify(value) + const now = Date.now() + const expiresAt = ttlSeconds ? now + ttlSeconds * 1000 : null + + const stmt = this.db.prepare(` + INSERT OR REPLACE INTO cache_entries (key, value, expires_at, created_at) + VALUES (?, ?, ?, ?) + `) + + stmt.run(key, serialized, expiresAt, now) + } catch (_error) { + // Don't throw - graceful degradation + } + } + + async invalidate(key: string): Promise { + try { + const stmt = this.db.prepare('DELETE FROM cache_entries WHERE key = ?') + stmt.run(key) + } catch (_error) {} + } + + async invalidatePattern(pattern: string): Promise { + try { + // SQLite uses LIKE for pattern matching + const stmt = this.db.prepare('DELETE FROM cache_entries WHERE key LIKE ?') + stmt.run(pattern) + } catch (_error) {} + } + + async clear(): Promise { + try { + this.db.exec('DELETE FROM cache_entries') + } catch (_error) {} + } + + /** + * Close the database connection (call when done) + */ + close(): void { + this.db.close() + } +} diff --git a/apps/cli/src/lib/cache-provider.ts b/apps/cli/src/lib/cache-provider.ts new file mode 100644 index 00000000000..e6126843860 --- /dev/null +++ b/apps/cli/src/lib/cache-provider.ts @@ -0,0 +1,41 @@ +// ============================================================================ +// Cache Provider Interface +// ============================================================================ + +/** + * Contract for cache providers - allows swapping implementations + * (e.g., SQLite, Redis, in-memory) without changing consuming code + */ +export interface CacheProvider { + /** + * Retrieve a value from cache by key + * @param key Cache key + * @returns Cached value or null if not found/expired + */ + get(key: string): Promise + + /** + * Store a value in cache with optional TTL + * @param key Cache key + * @param value Value to cache (will be serialized as JSON) + * @param ttlSeconds Optional time-to-live in seconds (default: no expiration) + */ + set(key: string, value: T, ttlSeconds?: number): Promise + + /** + * Remove a specific key from cache + * @param key Cache key to invalidate + */ + invalidate(key: string): Promise + + /** + * Remove all keys matching a pattern (supports SQL LIKE patterns) + * @param pattern Pattern to match (e.g., "commits:%" or "prs:abc%") + */ + invalidatePattern(pattern: string): Promise + + /** + * Clear all entries from cache + */ + clear(): Promise +} diff --git a/apps/cli/src/lib/logger.ts b/apps/cli/src/lib/logger.ts new file mode 100644 index 00000000000..5608423ca3d --- /dev/null +++ b/apps/cli/src/lib/logger.ts @@ -0,0 +1,221 @@ +/** + * Logger interface for dependency injection + * Allows different logging strategies for interactive vs non-interactive modes + */ +export interface Logger { + info(message: string): void + warn(message: string): void + error(message: string): void + debug(message: string): void + /** + * Emit a streaming excerpt from agent thinking/output (optional, for UI progress updates) + */ + emitStreamingExcerpt?(excerpt: string, isReasoning?: boolean): void +} + +/** + * Progress stage type for UI progress events + */ +export type ProgressStage = 'idle' | 'collecting' | 'analyzing' | 'delivering' | 'complete' | 'error' + +/** + * Progress event type for categorizing messages + */ +export type ProgressEventType = 'reasoning' | 'output' | 'info' + +/** + * Progress event interface for UI updates + */ +export interface ProgressEvent { + stage: ProgressStage + message?: string + progress?: number // 0-100 + cacheInfo?: { + type: 'commits' | 'prs' | 'stats' + count: number + } + /** + * Whether this is reasoning (thinking) content from AI + */ + isReasoning?: boolean + /** + * Type of event for visual distinction in UI + */ + eventType?: ProgressEventType +} + +/** + * ConsoleLogger - Direct console output for non-interactive CLI mode + */ +export class ConsoleLogger implements Logger { + constructor(private readonly verbose: boolean = false) {} + + info(message: string): void { + // eslint-disable-next-line no-console + console.log(`[INFO] ${message}`) + } + + warn(message: string): void { + // eslint-disable-next-line no-console + console.warn(`[WARN] ${message}`) + } + + error(message: string): void { + // eslint-disable-next-line no-console + console.error(`[ERROR] ${message}`) + } + + debug(message: string): void { + if (this.verbose) { + // eslint-disable-next-line no-console + console.log(`[DEBUG] ${message}`) + } + } +} + +/** + * ProgressLogger - Emits progress events for interactive Ink UI mode + * Suppresses stdout to avoid interfering with Ink rendering + */ +export class ProgressLogger implements Logger { + constructor( + private readonly onProgress: (event: ProgressEvent) => void, + private readonly verbose: boolean = false, + ) {} + + info(message: string): void { + // Suppress redundant messages that are already handled by stage transitions + if (this.shouldSuppress(message)) { + return + } + + // Parse message to determine stage and emit appropriate progress event + const stage = this.determineStage(message) + const cleanMessage = message.replace(/^\[INFO\]\s*/, '').trim() + + // Detect cache hit messages and extract cache info + const cacheInfo = this.parseCacheInfo(message) + + if (cleanMessage) { + this.onProgress({ + stage, + message: cleanMessage, + eventType: 'info', + ...(cacheInfo && { cacheInfo }), + }) + } + } + + warn(message: string): void { + const cleanMessage = message.replace(/^\[WARN\]\s*/, '').trim() + // Warnings don't change stage, but emit as progress updates + if (cleanMessage) { + this.onProgress({ stage: 'collecting', message: cleanMessage, eventType: 'info' }) + } + } + + error(message: string): void { + const cleanMessage = message.replace(/^\[ERROR\]\s*/, '').trim() + this.onProgress({ stage: 'error', message: cleanMessage, eventType: 'info' }) + } + + debug(message: string): void { + if (this.verbose) { + const cleanMessage = message.replace(/^\[DEBUG\]\s*/, '').trim() + // Debug messages are emitted as progress updates during current stage + if (cleanMessage) { + this.onProgress({ stage: 'collecting', message: cleanMessage, eventType: 'info' }) + } + } + } + + emitStreamingExcerpt(excerpt: string, isReasoning = false): void { + // Excerpts are already trimmed to meaningful chunks (complete sentences or size limits) + // Just ensure they're not too long for display (safety check) + const maxDisplayLength = 250 + const displayExcerpt = excerpt.length > maxDisplayLength ? `${excerpt.slice(0, maxDisplayLength)}...` : excerpt + + // Emit as progress event during analyzing stage with reasoning flag and event type + this.onProgress({ + stage: 'analyzing', + message: displayExcerpt, + isReasoning, + eventType: isReasoning ? 'reasoning' : 'output', + }) + } + + /** + * Check if a message should be suppressed (not emitted as progress event) + */ + private shouldSuppress(message: string): boolean { + return message.includes('Scanning for') || message.includes('Starting repository analysis') + } + + /** + * Determine the progress stage based on message content + */ + private determineStage(message: string): ProgressEvent['stage'] { + // Stage transitions - check these first + if (message.includes('Collecting repository data')) { + return 'collecting' + } + if (message.includes('Running analysis') || message.includes('Analyzing with Claude')) { + return 'analyzing' + } + if (message.includes('Delivering to') || message.includes('Delivering results')) { + return 'delivering' + } + if (message.includes('Analysis complete')) { + return 'complete' + } + + // Batch progress updates + if ( + (message.includes('Fetched') && message.includes('PRs') && message.includes('batch')) || + message.includes('Successfully fetched') || + (message.includes('Found') && (message.includes('commits') || message.includes('pull requests'))) || + message.includes('Extracting PR information') || + message.includes('Getting commits for release') + ) { + return 'collecting' + } + + // Default to collecting stage for other INFO messages + return 'collecting' + } + + /** + * Parse cache hit information from log messages + */ + private parseCacheInfo(message: string): ProgressEvent['cacheInfo'] | undefined { + // Pattern: "Cache hit: Found X commits in cache" + // Pattern: "Cache hit: Found X PRs in cache" + const cacheHitMatch = message.match(/Cache hit: Found (\d+) (commits|PRs|pull requests) in cache/i) + if (cacheHitMatch) { + const count = parseInt(cacheHitMatch[1] || '0', 10) + const typeStr = cacheHitMatch[2]?.toLowerCase() || '' + + let type: 'commits' | 'prs' | 'stats' + if (typeStr.includes('commit')) { + type = 'commits' + } else if (typeStr.includes('pr') || typeStr.includes('pull request')) { + type = 'prs' + } else { + return undefined + } + + return { type, count } + } + + // Pattern: "Cache hit: Found X stats in cache" (if stats caching exists) + const statsCacheMatch = message.match(/Cache hit: Found (\d+) stats? in cache/i) + if (statsCacheMatch) { + return { + type: 'stats', + count: parseInt(statsCacheMatch[1] || '0', 10), + } + } + + return undefined + } +} diff --git a/apps/cli/src/lib/pr-body-cleaner.ts b/apps/cli/src/lib/pr-body-cleaner.ts new file mode 100644 index 00000000000..d759f98ae0a --- /dev/null +++ b/apps/cli/src/lib/pr-body-cleaner.ts @@ -0,0 +1,496 @@ +/** + * PR Body Cleaner + * + * Intelligently removes unnecessary content from PR bodies while preserving + * important technical details, code blocks, and CURSOR_SUMMARY blocks. + */ + +/** + * Cleans a PR body by removing unnecessary content while preserving valuable information + * @param body The raw PR body text + * @returns Cleaned PR body with unnecessary content removed + */ +export function cleanPRBody(body: string): string { + if (!body || body.trim().length === 0) { + return body + } + + let cleaned = body + + // Step 1: Extract CURSOR_SUMMARY content and remove all HTML comment markers + cleaned = removeHTMLCommentsExceptCursorSummary(cleaned) + + // Step 1.5: Remove Cursor Bugbot footer notes (may appear outside CURSOR_SUMMARY blocks) + cleaned = removeCursorBugbotFooters(cleaned) + + // Step 2: Remove image/video markdown + cleaned = removeImageVideoMarkdown(cleaned) + + // Step 3: Clean tables (remove if only images/videos) + cleaned = cleanTables(cleaned) + + // Step 4: Clean external links (keep text, remove long URLs) + cleaned = cleanExternalLinks(cleaned) + + // Step 5: Remove empty sections + cleaned = removeEmptySections(cleaned) + + // Step 6: Remove minimal value sections + cleaned = removeMinimalValueSections(cleaned) + + // Step 7: Remove redundant sections (screen captures, testing) + cleaned = removeRedundantSections(cleaned) + + // Step 8: Remove redundant headers + cleaned = removeRedundantHeaders(cleaned) + + // Step 9: Aggressive whitespace normalization (max 1 blank line) + cleaned = normalizeWhitespace(cleaned) + + return cleaned +} + +/** + * Extract CURSOR_SUMMARY content and remove all HTML comment markers + */ +function removeHTMLCommentsExceptCursorSummary(text: string): string { + // Extract CURSOR_SUMMARY content (without the comment markers) + const cursorSummaryPlaceholder = '___CURSOR_SUMMARY_PLACEHOLDER___' + const cursorSummaryRegex = /([\s\S]*?)/gi + const summaries: string[] = [] + let matchIndex = 0 + + // Extract just the content between the markers + let textWithProtection = text.replace(cursorSummaryRegex, (match, content) => { + // Clean the content before storing: remove Cursor Bugbot footer notes + let cleanedContent = content.trim() + + // Remove Cursor Bugbot footer notes (metadata lines) + cleanedContent = cleanedContent.replace( + />\s*\[!NOTE\]\s*\n\s*>\s*\[Cursor Bugbot\].*?Configure \[here\].*?<\/sup>/gi, + '', + ) + cleanedContent = cleanedContent.replace( + />\s*Written by \[Cursor Bugbot\].*?Configure \[here\].*?<\/sup>/gi, + '', + ) + cleanedContent = cleanedContent.replace( + />\s*\[Cursor Bugbot\].*?is generating a summary.*?Configure \[here\].*?<\/sup>/gi, + '', + ) + + // Clean up any leftover "> " prefixes from blockquotes + cleanedContent = cleanedContent.replace(/^>\s*/gm, '') + + summaries.push(cleanedContent.trim()) // Store cleaned content + return `${cursorSummaryPlaceholder}${matchIndex++}` + }) + + // Remove all other HTML comments + let previousTextWithProtection: string + do { + previousTextWithProtection = textWithProtection + textWithProtection = textWithProtection.replace(//g, '') + } while (textWithProtection !== previousTextWithProtection) + + // Restore CURSOR_SUMMARY content (without comment markers and footers) + summaries.forEach((summary, index) => { + textWithProtection = textWithProtection.replace(`${cursorSummaryPlaceholder}${index}`, summary) + }) + + return textWithProtection +} + +/** + * Remove Cursor Bugbot footer notes (metadata lines) + */ +function removeCursorBugbotFooters(text: string): string { + let cleaned = text + + // Remove standalone footer notes (outside CURSOR_SUMMARY blocks) + // Pattern 1: > [!NOTE]\n> [Cursor Bugbot]...Configure [here]... + cleaned = cleaned.replace( + />\s*\[!NOTE\]\s*\n\s*>\s*\[Cursor Bugbot\][\s\S]*?Configure \[here\][\s\S]*?<\/sup>\s*/gi, + '', + ) + + // Pattern 2: > Written by [Cursor Bugbot]...Configure [here]... + cleaned = cleaned.replace(/>\s*Written by \[Cursor Bugbot\][\s\S]*?Configure \[here\][\s\S]*?<\/sup>\s*/gi, '') + + // Pattern 3: > [Cursor Bugbot]...is generating a summary...Configure [here]... + cleaned = cleaned.replace( + />\s*\[Cursor Bugbot\][\s\S]*?is generating a summary[\s\S]*?Configure \[here\][\s\S]*?<\/sup>\s*/gi, + '', + ) + + // Pattern 4: Standalone note blocks with Cursor Bugbot (any variant) + cleaned = cleaned.replace(/>\s*\[!NOTE\]\s*\n\s*>\s*\[Cursor Bugbot\][\s\S]*?<\/sup>\s*/gi, '') + + // Pattern 5: Any blockquote line containing Cursor Bugbot footer + cleaned = cleaned.replace(/>\s*\[Cursor Bugbot\][\s\S]*?<\/sup>\s*/gi, '') + + return cleaned +} + +/** + * Remove image and video markdown links + */ +function removeImageVideoMarkdown(text: string): string { + // Remove image markdown: ![alt](url) or ![alt](url "title") + let cleaned = text.replace(/!\[([^\]]*)\]\([^)]+\)/g, '') + + // Remove video markdown patterns like [Screen Recording ...](url) + cleaned = cleaned.replace(/\[Screen Recording[^\]]*\]\([^)]+\)/gi, '') + cleaned = cleaned.replace(/\[Screen Recording[^\]]*\]\([^)]+\)/gi, '') + + // Remove tags + cleaned = cleaned.replace(/]*>/gi, '') + + // Remove video links that look like markdown + cleaned = cleaned.replace(/\[.*\.mov.*\]\([^)]+\)/gi, '') + cleaned = cleaned.replace(/\[.*\.mp4.*\]\([^)]+\)/gi, '') + + return cleaned +} + +/** + * Remove tables that only contain images/videos + */ +function cleanTables(text: string): string { + // Match table blocks - split into parts to avoid unsafe regex + const lines = text.split('\n') + const result: string[] = [] + let inTable = false + let tableLines: string[] = [] + + for (let i = 0; i < lines.length; i++) { + const line = lines[i] + if (!line) { + result.push('') + continue + } + + const isTableRow = line.trim().startsWith('|') && line.trim().endsWith('|') + + if (isTableRow) { + if (!inTable) { + inTable = true + tableLines = [] + } + tableLines.push(line) + } else { + if (inTable) { + // Process accumulated table + const tableMatch = tableLines.join('\n') + if (shouldRemoveTable(tableMatch)) { + // Skip this table + } else { + result.push(...tableLines) + } + inTable = false + tableLines = [] + } + result.push(line) + } + } + + // Handle table at end of text + if (inTable && tableLines.length > 0) { + const tableMatch = tableLines.join('\n') + if (!shouldRemoveTable(tableMatch)) { + result.push(...tableLines) + } + } + + return result.join('\n') +} + +function shouldRemoveTable(tableMatch: string): boolean { + // Remove empty tables (only separators like | --- | --- |) + const cleanedForEmpty = tableMatch.replace(/[\s|:-]/g, '') + if (cleanedForEmpty.length === 0) { + return true + } + + // Check if table only contains image/video links or empty cells + const imageVideoPattern = /!\[|\]\([^)]+\)|Screen Recording|\.mov|\.mp4|\.png|\.jpg|\.jpeg|\.gif|\.webp/gi + const hasOnlyImagesOrVideos = imageVideoPattern.test(tableMatch) + const textPattern = /[a-zA-Z]{3,}/ + const cleanedTable = tableMatch.replace(/!\[|\]\([^)]+\)|Screen Recording/gi, '') + const hasTextContent = textPattern.test(cleanedTable) + + // If table only has images/videos and no substantial text, remove it + return hasOnlyImagesOrVideos && !hasTextContent +} + +/** + * Clean external links - keep text but remove long URLs + */ +function cleanExternalLinks(text: string): string { + // Match markdown links: [text](url) + const linkRegex = /\[([^\]]+)\]\(([^)]+)\)/g + return text.replace(linkRegex, (match) => { + const linkMatch = match.match(/\[([^\]]+)\]\(([^)]+)\)/) + if (!linkMatch || !linkMatch[1] || !linkMatch[2]) { + return match + } + + const linkText = linkMatch[1] + const url = linkMatch[2] + + // Keep GitHub links (they're short and useful) + if (url.startsWith('https://github.com/') || url.startsWith('http://github.com/')) { + return match + } + + // Keep relative links + if (url.startsWith('/') || url.startsWith('./') || url.startsWith('../')) { + return match + } + + // Keep short URLs (< 50 chars) + if (url.length <= 50) { + return match + } + + // For long URLs, keep only the text + return linkText + }) +} + +/** + * Remove empty sections (headers with no content or only whitespace) + */ +function removeEmptySections(text: string): string { + // Match sections: ## Header followed by content until next ## or end + const sectionRegex = /(##+\s+[^\n]+)\n([\s\S]*?)(?=\n##+\s+|$)/g + let cleaned = text + + cleaned = cleaned.replace(sectionRegex, (match) => { + const sectionMatch = match.match(/(##+\s+[^\n]+)\n([\s\S]*?)(?=\n##+\s+|$)/) + if (!sectionMatch) { + return match + } + + const content = sectionMatch[2] || '' + // Check if content is empty or only whitespace + const trimmedContent = content.trim() + if (trimmedContent.length === 0) { + return '' // Remove empty section + } + return match // Keep section with content + }) + + return cleaned +} + +/** + * Remove minimal value sections (very short descriptions, redundant changes lists) + */ +function removeMinimalValueSections(text: string): string { + let cleaned = text + + // Remove "## Description" sections that are very short and redundant + const descriptionRegex = /##\s+Description\s*\n([\s\S]*?)(?=\n## |$)/gi + cleaned = cleaned.replace(descriptionRegex, (match) => { + const sectionMatch = match.match(/##\s+Description\s*\n([\s\S]*?)(?=\n## |$)/i) + if (!sectionMatch) { + return match + } + + const content = sectionMatch[1] || '' + const trimmedContent = content.trim() + + // Remove if very short (< 50 chars) and doesn't add value + if (trimmedContent.length < 50) { + return '' + } + + return match + }) + + // Remove "## Changes" sections that are just bullet lists without detail + const changesRegex = /##\s+Changes\s*\n([\s\S]*?)(?=\n## |$)/gi + cleaned = cleaned.replace(changesRegex, (match) => { + const sectionMatch = match.match(/##\s+Changes\s*\n([\s\S]*?)(?=\n## |$)/i) + if (!sectionMatch) { + return match + } + + const content = sectionMatch[1] || '' + const trimmedContent = content.trim() + + // Check if it's just a list of very short bullets + const lines = trimmedContent.split('\n').filter((line) => line.trim().length > 0) + const allShortBullets = lines.every((line) => { + const trimmed = line.trim() + return trimmed.startsWith('-') && trimmed.length < 80 + }) + + // Remove if all bullets are very short (likely redundant with CURSOR_SUMMARY) + if (allShortBullets && lines.length < 5) { + return '' + } + + return match + }) + + // Remove "## Implementation Details" that are redundant with CURSOR_SUMMARY + const implDetailsRegex = /##\s+Implementation Details\s*\n([\s\S]*?)(?=\n## |$)/gi + cleaned = cleaned.replace(implDetailsRegex, (match) => { + const sectionMatch = match.match(/##\s+Implementation Details\s*\n([\s\S]*?)(?=\n## |$)/i) + if (!sectionMatch) { + return match + } + + const content = sectionMatch[1] || '' + const trimmedContent = content.trim() + + // Remove if very short (< 100 chars) - likely redundant + if (trimmedContent.length < 100) { + return '' + } + + return match + }) + + return cleaned +} + +/** + * Remove redundant headers (headers with no meaningful content after them) + */ +function removeRedundantHeaders(text: string): string { + let cleaned = text + + // Match sections and check if header should be removed + const sectionRegex = /(##+\s+[^\n]+)\n([\s\S]*?)(?=\n##+\s+|$)/g + + cleaned = cleaned.replace(sectionRegex, (match) => { + const sectionMatch = match.match(/(##+\s+[^\n]+)\n([\s\S]*?)(?=\n##+\s+|$)/) + if (!sectionMatch) { + return match + } + + const header = sectionMatch[1] || '' + const content = sectionMatch[2] || '' + const trimmedContent = content.trim() + + // If header is followed immediately by CURSOR_SUMMARY-like content and nothing else + // Check if content starts with --- (CURSOR_SUMMARY marker pattern) + if (trimmedContent.startsWith('---') && trimmedContent.length < 200) { + // This might be redundant, but let's be conservative and keep it + return match + } + + // Remove headers that are redundant (e.g., "## Description" when content is minimal) + const headerLower = header.toLowerCase() + if (headerLower.includes('description') && trimmedContent.length < 30) { + // Keep the content, remove the header + return trimmedContent + } + + return match + }) + + return cleaned +} + +/** + * Remove redundant sections + */ +function removeRedundantSections(text: string): string { + let cleaned = text + + // Remove "Screen Captures" or "Screenshots" sections that only contain images + // Match: ## Screen Captures / ## Screenshots followed by content ending before next ## + const screenshotSectionRegex = /##\s+(Screen Captures|Screenshots|Screenshots?)\s*\n([\s\S]*?)(?=\n## |$)/gi + cleaned = cleaned.replace(screenshotSectionRegex, (match) => { + const sectionMatch = match.match(/##\s+(Screen Captures|Screenshots|Screenshots?)\s*\n([\s\S]*?)(?=\n## |$)/i) + if (!sectionMatch) { + return match + } + + const content = sectionMatch[2] || '' + // If content only has images/videos/tables with images, remove it + const mediaPattern = /!\[|\]\([^)]+\)|Screen Recording|\.mov|\.mp4| { + const sectionMatch = match.match(/##\s+(Testing|How Has This Been Tested\?)\s*\n([\s\S]*?)(?=\n## |$)/i) + if (!sectionMatch) { + return match + } + + const content = sectionMatch[2] || '' + const trimmedContent = content.trim() + + // Remove if empty + if (trimmedContent.length === 0) { + return '' + } + + // Remove if only checkboxes with no descriptions + const checkboxOnly = /^[\s-]*\[[ xX]\]/m.test(trimmedContent) && trimmedContent.length < 100 + if (checkboxOnly) { + return '' + } + + // Remove if content is just minimal phrases like "locally", "manually", "on simulator" + const minimalPhrases = + /^(locally|manually|on simulator|tested locally|tested manually|local|ios simulator|android sim)[\s.]*$/i + if (minimalPhrases.test(trimmedContent)) { + return '' + } + + // Remove if content is very short (< 50 chars) and doesn't contain meaningful text + const meaningfulTextPattern = /[a-zA-Z]{10,}/ + if (trimmedContent.length < 50 && !meaningfulTextPattern.test(trimmedContent)) { + return '' + } + + // Keep if it has meaningful content (> 100 chars of actual text) + const textOnly = trimmedContent.replace(/[\s\-[\]xX]/g, '') + if (textOnly.length < 100) { + return '' + } + + return match + }) + + return cleaned +} + +/** + * Normalize whitespace - aggressive cleanup + */ +function normalizeWhitespace(text: string): string { + // Collapse multiple blank lines to max 1 consecutive blank line + let cleaned = text.replace(/\n{3,}/g, '\n\n') + + // Trim trailing whitespace from lines + cleaned = cleaned + .split('\n') + .map((line) => line.trimEnd()) + .join('\n') + + // Remove leading/trailing blank lines + cleaned = cleaned.replace(/^\n+|\n+$/g, '') + + // Remove blank lines immediately after headers + cleaned = cleaned.replace(/(##+\s+[^\n]+)\n\n+/g, '$1\n') + + return cleaned +} diff --git a/apps/cli/src/lib/release-scanner.ts b/apps/cli/src/lib/release-scanner.ts new file mode 100644 index 00000000000..3a268135da2 --- /dev/null +++ b/apps/cli/src/lib/release-scanner.ts @@ -0,0 +1,283 @@ +/* eslint-disable no-console */ + +import type { Logger } from '@universe/cli/src/lib/logger' +import { $ } from 'bun' + +// ============================================================================ +// Types +// ============================================================================ + +export interface Release { + platform: 'mobile' | 'extension' + version: string + branch: string + major: number + minor: number + patch: number + prerelease?: string +} + +export interface ReleaseComparison { + from: Release + to: Release + commitRange: string +} + +// ============================================================================ +// Release Scanner +// ============================================================================ + +export class ReleaseScanner { + constructor( + private repoPath: string = process.cwd(), + private logger?: Logger, + ) {} + + /** + * Scan all release branches for a given platform + */ + async scanReleases(platform?: 'mobile' | 'extension'): Promise { + this.logger?.info(`Scanning for ${platform || 'all'} release branches...`) + + // Get all remote branches + const result = await $`git -C ${this.repoPath} branch -r`.text() + const branches = result + .split('\n') + .map((b: string) => b.trim()) + .filter(Boolean) + + // Filter for release branches + const releasePattern = platform ? `origin/releases/${platform}/` : 'origin/releases/' + + const releaseBranches = branches + .filter((b: string) => b.includes(releasePattern)) + .filter((b: string) => !b.includes('->')) // Exclude symbolic refs + .filter((b: string) => !b.includes('/dev')) // Exclude dev branches + .filter((b: string) => !b.match(/cherry|kickstart|mirror|temp|mp\//)) // Exclude special branches + + // Parse into Release objects + const releases: Release[] = [] + + for (const branch of releaseBranches) { + const release = this.parseReleaseBranch(branch) + if (release) { + releases.push(release) + } + } + + // Sort by version (newest first) + return releases.sort((a, b) => this.compareVersions(b, a)) + } + + /** + * Get the latest release for a platform + */ + async getLatestRelease(platform: 'mobile' | 'extension'): Promise { + const releases = await this.scanReleases(platform) + return releases[0] || null + } + + /** + * Get the previous release before a given version + */ + async getPreviousRelease(release: Release): Promise { + const releases = await this.scanReleases(release.platform) + + // Find the current release index + const currentIndex = releases.findIndex((r) => r.version === release.version && r.platform === release.platform) + + if (currentIndex === -1 || currentIndex === releases.length - 1) { + return null + } + + // Return the next one (which is older since we sorted newest first) + const nextRelease = releases[currentIndex + 1] + return nextRelease ?? null + } + + /** + * Find a specific release by platform and version + */ + async findRelease(platform: 'mobile' | 'extension', version: string): Promise { + const releases = await this.scanReleases(platform) + return releases.find((r) => r.version === version) || null + } + + async getReleaseComparison(args: { + platform: 'mobile' | 'extension' + version: string + compareWith?: string + }): Promise { + const { platform, version, compareWith } = args + const toRelease = await this.findRelease(platform, version) + if (!toRelease) { + throw new Error(`Release ${platform}/${version} not found`) + } + + let fromRelease: Release | null = null + + if (compareWith) { + fromRelease = await this.findRelease(platform, compareWith) + if (!fromRelease) { + throw new Error(`Release ${platform}/${compareWith} not found`) + } + } else { + // Auto-detect previous release + fromRelease = await this.getPreviousRelease(toRelease) + if (!fromRelease) { + this.logger?.warn(`No previous release found for ${platform}/${version}`) + return null + } + } + + // Use origin/ prefix for git commands + return { + from: fromRelease, + to: toRelease, + commitRange: `origin/${fromRelease.branch}..origin/${toRelease.branch}`, + } + } + + /** + * List releases in a formatted way + */ + async listReleases(platform?: 'mobile' | 'extension'): Promise { + const releases = await this.scanReleases(platform) + + if (releases.length === 0) { + console.log('No releases found') + return + } + + // Group by platform if showing all + const grouped = releases.reduce( + (acc, release) => { + if (!acc[release.platform]) { + acc[release.platform] = [] + } + const platformReleases = acc[release.platform] + if (platformReleases) { + platformReleases.push(release) + } + return acc + }, + {} as Record, + ) + + for (const [plat, rels] of Object.entries(grouped)) { + console.log(`\n${plat.toUpperCase()} RELEASES:`) + + console.log('─'.repeat(40)) + + for (const rel of rels.slice(0, 10)) { + // Show only latest 10 + + console.log(` ${rel.version.padEnd(10)} → ${rel.branch}`) + } + + if (rels.length > 10) { + console.log(` ... and ${rels.length - 10} more`) + } + } + } + + /** + * Get commits between two releases + */ + async getReleaseCommits(comparison: ReleaseComparison): Promise { + const result = await $`git -C ${this.repoPath} log ${comparison.commitRange} --oneline`.text() + return result + } + + /** + * Parse a release branch name into a Release object + */ + private parseReleaseBranch(branch: string): Release | null { + // Match patterns like: + // origin/releases/mobile/1.60 + // origin/releases/extension/1.30.0 + // Safe regex pattern - matches controlled git branch names only + // eslint-disable-next-line security/detect-unsafe-regex -- Controlled pattern matching git branch names with bounded quantifiers + const match = branch.match(/^origin\/releases\/(mobile|extension)\/(\d+)\.(\d+)(?:\.(\d+))?(?:\.(.+))?$/) + + if (!match) { + return null + } + + const [, platform, major, minor, patch, prerelease] = match + if (!platform || !major || !minor) { + return null + } + const version = patch + ? `${major}.${minor}.${patch}${prerelease ? `.${prerelease}` : ''}` + : `${major}.${minor}${prerelease ? `.${prerelease}` : ''}` + + return { + platform: platform as 'mobile' | 'extension', + version, + branch: branch.replace('origin/', ''), + major: parseInt(major, 10), + minor: parseInt(minor, 10), + patch: parseInt(patch ?? '0', 10), + prerelease: prerelease ?? undefined, + } + } + + /** + * Compare two versions (returns positive if a > b, negative if a < b, 0 if equal) + */ + private compareVersions(a: Release, b: Release): number { + // Compare major + if (a.major !== b.major) { + return a.major - b.major + } + + // Compare minor + if (a.minor !== b.minor) { + return a.minor - b.minor + } + + // Compare patch + if (a.patch !== b.patch) { + return a.patch - b.patch + } + + // Compare prerelease (if both have it) + if (a.prerelease && b.prerelease) { + return a.prerelease.localeCompare(b.prerelease) + } + + // Version without prerelease is greater than with prerelease + if (a.prerelease && !b.prerelease) { + return -1 + } + if (!a.prerelease && b.prerelease) { + return 1 + } + + return 0 + } +} + +/** + * Parse a release identifier like "mobile/1.60" or "extension/1.30.0" + */ +export function parseReleaseIdentifier( + identifier: string, +): { platform: 'mobile' | 'extension'; version: string } | null { + const match = identifier.match(/^(mobile|extension)\/(.+)$/) + if (!match) { + return null + } + + const platform = match[1] as 'mobile' | 'extension' + const version = match[2] + if (!version) { + return null + } + + return { + platform, + version, + } +} diff --git a/apps/cli/src/lib/stream-handler.ts b/apps/cli/src/lib/stream-handler.ts new file mode 100644 index 00000000000..9a262b12e25 --- /dev/null +++ b/apps/cli/src/lib/stream-handler.ts @@ -0,0 +1,35 @@ +/** biome-ignore-all lint/suspicious/noConsole: cli tool */ +import type { StreamChunk } from '@universe/cli/src/lib/ai-provider' + +/** + * Stream Handler for CLI Output + * + * Separates the concern of handling streaming output to console. + * Accumulates full response while streaming to stdout for user feedback. + */ + +/** + * Writes stream chunks to console and accumulates full response + * @param stream - Async generator of stream chunks + * @returns Complete accumulated text + */ +export async function writeStreamToConsole(stream: AsyncGenerator): Promise { + let fullText = '' + + for await (const chunk of stream) { + if (chunk.text) { + fullText += chunk.text + // Write to stdout for real-time feedback + process.stdout.write(chunk.text) + } + + if (chunk.isComplete) { + // New line after streaming completes + // eslint-disable-next-line no-console + console.log() + break + } + } + + return fullText +} diff --git a/apps/cli/src/lib/team-members.ts b/apps/cli/src/lib/team-members.ts new file mode 100644 index 00000000000..91a7fb39f04 --- /dev/null +++ b/apps/cli/src/lib/team-members.ts @@ -0,0 +1,37 @@ +import { $ } from 'bun' + +export interface TeamMember { + login: string + name: string | null +} + +/** + * Fetches team members from a GitHub organization team + * Returns members with their login and display name + */ +export async function fetchTeamMembers(org: string, teamSlug: string): Promise { + try { + // Get team members (just logins) + const membersResult = await $`gh api /orgs/${org}/teams/${teamSlug}/members --jq '.[].login'`.text() + const logins = membersResult.split('\n').filter(Boolean) + + // Fetch detailed user info for each member + const members: TeamMember[] = [] + for (const login of logins) { + try { + const userResult = await $`gh api /users/${login} --jq '{login: .login, name: .name}'`.text() + const userData = JSON.parse(userResult) as TeamMember + members.push(userData) + } catch { + // If fetching user details fails, just use the login + members.push({ login, name: null }) + } + } + + return members + } catch (error) { + throw new Error(`Failed to fetch members for team ${teamSlug}. Ensure gh CLI is authenticated and team exists.`, { + cause: error, + }) + } +} diff --git a/apps/cli/src/lib/team-resolver.ts b/apps/cli/src/lib/team-resolver.ts new file mode 100644 index 00000000000..b765f94c146 --- /dev/null +++ b/apps/cli/src/lib/team-resolver.ts @@ -0,0 +1,156 @@ +import { $ } from 'bun' + +interface UserResolution { + username?: string + emails: string[] +} + +interface GitHubCommitSearchItem { + commit?: { + author?: { + email?: string + } + } +} + +interface GitHubCommitSearchResult { + items?: GitHubCommitSearchItem[] +} + +interface GitHubUserData { + id?: number + email?: string + login?: string +} + +/** + * Resolves a team reference or username to email addresses + * Supports: + * - GitHub teams: @org/team + * - GitHub usernames: alice, bob + * - Email addresses: alice@example.com + * - Mixed: @org/team,alice,bob@example.com + */ +export async function resolveTeam(teamRef: string): Promise<{ emails: string[]; usernames: string[] }> { + const parts = teamRef + .split(',') + .map((p) => p.trim()) + .filter(Boolean) + const allEmails: string[] = [] + const allUsernames: string[] = [] + + for (const part of parts) { + if (part.startsWith('@')) { + // GitHub team reference + const { emails, usernames } = await resolveGitHubTeam(part) + allEmails.push(...emails) + allUsernames.push(...usernames) + } else if (part.includes('@')) { + // Already an email + allEmails.push(part) + } else { + // GitHub username + const resolution = await resolveUserToEmail(part) + allEmails.push(...resolution.emails) + if (resolution.username) { + allUsernames.push(resolution.username) + } + } + } + + return { + emails: [...new Set(allEmails)], // Remove duplicates + usernames: [...new Set(allUsernames)], + } +} + +async function resolveGitHubTeam(teamRef: string): Promise<{ emails: string[]; usernames: string[] }> { + // Parse @org/team format + const [org, team] = teamRef.slice(1).split('/') + + if (!org || !team) { + throw new Error(`Invalid team reference: ${teamRef}. Expected format: @org/team`) + } + + try { + // Get team members + const membersResult = await $`gh api /orgs/${org}/teams/${team}/members --jq '.[].login'`.text() + const members = membersResult.split('\n').filter(Boolean) + + // Resolve each member to emails + const emails: string[] = [] + const usernames: string[] = [] + + for (const member of members) { + const resolution = await resolveUserToEmail(member) + emails.push(...resolution.emails) + if (resolution.username) { + usernames.push(resolution.username) + } + } + + return { emails, usernames } + } catch (_error) { + throw new Error(`Failed to resolve team ${teamRef}. Ensure gh CLI is authenticated and team exists.`) + } +} + +async function resolveUserToEmail(user: string): Promise { + // If it contains @, it's already an email + if (user.includes('@')) { + return { emails: [user] } + } + + // Otherwise, treat it as a GitHub username + try { + const userDataResult = await $`gh api /users/${user}`.text() + const userData = JSON.parse(userDataResult) as GitHubUserData + + // Get user's email from their profile (if public) + const emails: string[] = [] + if (userData.email) { + emails.push(userData.email) + } + + // Also try to get commit email by searching for their commits + try { + const searchResult = await $`gh api /search/commits?q=author:${user}&per_page=5`.text() + const searchData = JSON.parse(searchResult) as GitHubCommitSearchResult + + if (searchData.items && searchData.items.length > 0) { + const commitEmails = searchData.items + .map((item) => item.commit?.author?.email) + .filter((email): email is string => typeof email === 'string' && !emails.includes(email)) + + emails.push(...commitEmails) + } + } catch { + // Commit search failed, continue with what we have + } + + if (emails.length === 0 && userData.id) { + // Fallback: use GitHub's noreply email format + emails.push(`${userData.id}+${user}@users.noreply.github.com`) + } + + return { username: user, emails } + } catch (_error) { + throw new Error(`Failed to resolve GitHub username "${user}". User may not exist or gh CLI is not configured.`) + } +} + +/** + * Detects repository from git remote + */ +export async function detectRepository(): Promise<{ owner: string; name: string } | null> { + try { + const remote = await $`git config --get remote.origin.url`.text() + const match = remote.trim().match(/github\.com[:/]([^/]+)\/([^/.]+)(\.git)?$/) + if (match?.[1] && match[2]) { + return { owner: match[1], name: match[2] } + } + } catch { + // Not a git repo or no remote configured + } + return null +} diff --git a/apps/cli/src/lib/trivial-files.ts b/apps/cli/src/lib/trivial-files.ts new file mode 100644 index 00000000000..cd4b0b814d9 --- /dev/null +++ b/apps/cli/src/lib/trivial-files.ts @@ -0,0 +1,74 @@ +/** + * Utility for identifying trivial files that should be filtered from changelog analysis + */ + +const TRIVIAL_PATTERNS = [ + // Lockfiles + /package-lock\.json$/, + /yarn\.lock$/, + /pnpm-lock\.yaml$/, + /bun\.lockb$/, + /Cargo\.lock$/, + /Gemfile\.lock$/, + /composer\.lock$/, + /poetry\.lock$/, + + // Snapshots + /\.snap$/, + /\.snap\.\w+$/, + /\/__snapshots__\//, + /\.snapshot$/, + /\.snapshot\.json$/, + + // Generated files + /\.generated\./, + /\/__generated__\//, + /\/generated\//, + /codegen\//, + + // Build artifacts + /^dist\//, + /^build\//, + /\.next\//, + /\.turbo\//, + /^out\//, + + // Test artifacts + /^coverage\//, + /\.lcov$/, + /\.nyc_output\//, + /test-results\//, + + // Large data files + /fixtures\//, + /\/__fixtures__\//, + /testdata\//, + + // Binary and media files + /\.(png|jpg|jpeg|gif|ico|svg|webp|pdf|zip|tar|gz)$/i, + + // IDE and OS files + /\.DS_Store$/, + /Thumbs\.db$/, + /\.swp$/, + /\.swo$/, + + // Other + /node_modules\//, + /vendor\//, + /\.pnp\./, +] + +/** + * Check if a file path represents a trivial file that should be filtered + */ +export function isTrivialFile(path: string): boolean { + return TRIVIAL_PATTERNS.some((pattern) => pattern.test(path)) +} + +/** + * Filter an array of file paths to exclude trivial files + */ +export function filterTrivialFiles(paths: string[]): string[] { + return paths.filter((path) => !isTrivialFile(path)) +} diff --git a/apps/cli/src/prompts/bug-bisect.md b/apps/cli/src/prompts/bug-bisect.md new file mode 100644 index 00000000000..fbec2db123e --- /dev/null +++ b/apps/cli/src/prompts/bug-bisect.md @@ -0,0 +1,83 @@ +You are analyzing commits in a release to identify which commit likely introduced a bug. Your goal is to carefully examine all commits and PRs in the release range and rank them by likelihood of introducing the bug described. + +## Bug Description + +{{BUG_DESCRIPTION}} + +## Release Context + +- **Platform:** {{PLATFORM}} +- **Release:** {{RELEASE_TO}} +- **Comparing with:** {{RELEASE_FROM}} + +## Your Task + +Analyze ALL commits and pull requests in the release range. For each commit/PR, determine how likely it is that it introduced the bug described above. Consider: + +1. **Direct relevance**: Does the commit modify code that directly relates to the bug description? +2. **Indirect impact**: Could changes in this commit cause side effects that lead to the bug? +3. **Pattern matching**: Do file paths, function names, or component names match keywords in the bug description? +4. **Timing**: If the bug appeared in this release, commits in this range are prime suspects +5. **Related PRs**: Multiple commits from the same PR may be related and should be considered together + +## Output Format + +You MUST return a valid JSON object with the following structure: + +```json +{ + "suspiciousCommits": [ + { + "sha": "full commit SHA", + "confidence": 0.85, + "reasoning": "Brief explanation of why this commit is suspicious, mentioning specific files/functions/modules changed that relate to the bug", + "relatedPR": 1234 + } + ], + "summary": "Brief summary of findings: how many commits analyzed, how many suspicious commits found, and overall assessment", + "totalCommitsAnalyzed": 247, + "releaseContext": { + "from": "{{RELEASE_FROM}}", + "to": "{{RELEASE_TO}}", + "platform": "{{PLATFORM}}" + } +} +``` + +## Requirements + +1. **Rank commits by confidence**: Order `suspiciousCommits` array from highest to lowest confidence +2. **Confidence scores**: Use 0.0-1.0 scale where: + - 0.9-1.0: Very likely culprit (direct match, clear causation) + - 0.7-0.9: Likely related (strong indirect connection) + - 0.5-0.7: Possibly related (weak connection, worth investigating) + - < 0.5: Unlikely (exclude from results) +3. **Return top 10-20 commits**: Focus on the most suspicious commits, not all commits +4. **Include reasoning**: Each commit must have a clear explanation of why it's suspicious +5. **Match PRs**: If a commit is part of a PR, include the PR number in `relatedPR` +6. **Be specific**: Reference specific files, functions, or components in your reasoning + +## Analysis Process + +Before generating your output, analyze the commit data systematically: + +1. **Scan for keywords**: Look for file paths, function names, or component names that match keywords in the bug description +2. **Review PR descriptions**: PR bodies often contain context about what changed and why +3. **Check related commits**: Commits that touch similar files or components may be related +4. **Consider the full context**: Sometimes the bug is caused by an interaction between multiple changes + +## Important Notes + +- Analyze ALL commits provided, even if the context is truncated due to token limits +- If multiple commits from the same PR are suspicious, include them all but note they're related +- Be thorough but focused - prioritize commits with the strongest connection to the bug +- Your reasoning should help developers quickly understand why each commit is suspicious + +Here is the commit data you need to analyze: + + +{{COMMIT_DATA}} + + +Now analyze the commits and return your JSON response with ranked suspicious commits. + diff --git a/apps/cli/src/prompts/release-changelog.md b/apps/cli/src/prompts/release-changelog.md new file mode 100644 index 00000000000..d1306c92c52 --- /dev/null +++ b/apps/cli/src/prompts/release-changelog.md @@ -0,0 +1,74 @@ +You are creating a technical changelog for engineers at Uniswap Labs. Your goal is to analyze commit data and write a changelog that explains what shipped to colleagues in a direct, conversational, and factual manner - similar to Linear's changelog style. + +**CRITICAL: Focus on what actually changed, not editorial judgments** +- Describe the specific changes that were made +- Avoid inferential language like "finally," "now works properly," or "is finally real" +- Don't make assumptions about timeline, quality, or significance +- State what changed factually without commentary + +Before writing the changelog, do your analysis and planning work in tags inside your thinking block. It's OK for this section to be quite long. Include: + +1. **Commit Extraction**: First, go through the commit data and list out all the key commits with their PR numbers and descriptions to keep them top of mind. + +2. **Pattern Identification**: Read through all the commits and identify major themes or areas of work (aim for 4-7 themes). Look for related PRs that address similar functionality, components, or types of changes. + +3. **Grouping Strategy**: For each theme you identify, list which specific PRs belong to it and what the common thread is. + +4. **Factual Focus**: For each group, identify the specific technical changes made without making inferences about their importance or timeline. + +5. **Structure Planning**: Plan how you'll organize each theme section and what specific language you'll use - some may need more technical detail, others may be straightforward. + +After your planning, write the changelog using this exact structure: + +## Release Overview +- [X] PRs, [Y] contributors +- [One paragraph listing main work areas. Keep it factual and brief.] + +## Major Themes + +For each major pattern (4-7 themes total): + +### [Direct, Clear Theme Name] + +[2-3 paragraphs explaining what changed. Focus on the actual modifications made to the codebase. Vary your structure - not every section needs the same format. Mix technical details with broader changes as appropriate.] + +
+All related PRs (X total) + +- #123: Brief description +- #124: What changed +- #125: Technical detail +[... all PRs for this theme ...] +
+ +**Contributors:** @name1, @name2, @name3 + +**Writing Guidelines:** +- Write like a human, not a content generator +- Vary sentence starters - don't always begin with "The team" or "This release" +- Use present tense for current state: "The extension locks automatically after..." +- Be conversational but professional: "The old `isAddress()` function is gone - replaced with explicit validators" +- Include technical specifics when developers would care about them (function names, specific fixes, workarounds) +- Natural transitions or none at all - sometimes jump between topics +- Some features get detailed explanations, others just need a line or two + +**Avoid:** +- Editorial language: "smart decisions," "clever solutions," "finally," "now works properly" +- Justification: "This is important because..." +- Hedging: "presumably," "apparently" +- Obvious transitions: "Worth noting," "It's important to mention," "The interesting part" + +**Include When Relevant:** +- Specific function names, APIs, or technical components that changed +- Workarounds or gotchas developers should know about +- Patterns that are being reused across the codebase +- Platform-specific considerations +- Breaking changes or migrations + +Your final output should consist only of the changelog in the specified format and should not duplicate or rehash any of the analysis and planning work you did in the thinking block. + +Here is the commit data you need to analyze: + + +{{COMMIT_DATA}} + diff --git a/apps/cli/src/prompts/team-digest.md b/apps/cli/src/prompts/team-digest.md new file mode 100644 index 00000000000..d3271fa0c53 --- /dev/null +++ b/apps/cli/src/prompts/team-digest.md @@ -0,0 +1,102 @@ +You will analyze repository commit data to create a team digest for engineers at Uniswap Labs. Your goal is to transform raw development activity into a readable summary that explains what the team accomplished during a specific time period. + +## Your Task + +Create a structured team digest that describes what was built, added, or modified based on the commit data. Write factually about the work completed without making assumptions about completion status or quality. + +## Critical Requirements + +Follow these requirements strictly: + +1. **Use GitHub usernames only** - Format as @username, never use or invent human names +2. **Describe changes factually** - State what was built/added/modified without making quality judgments +3. **Avoid completion language** - Do not use "complete," "finished," "fully implemented," or "comprehensive" since you cannot determine completion status from commit messages alone +4. **Avoid embellished language** - Do not use "significantly improved," "enhanced," or "optimized" unless these are objectively measurable facts explicitly stated in the commit messages +5. **Right-size technical detail** - Include key components and patterns, skip implementation minutiae +6. **Focus on outcomes first** - Lead with what changed for users/developers, then explain how +7. **Minimize code content** - Be very selective about including code snippets or technical implementation details. Focus on impact and readability. Only include essential code-related information when truly necessary for understanding the work's significance +8. **Improve readability** - Limit to 4-6 themes maximum to avoid monotony. Vary your sentence structure and integrate contributor mentions naturally rather than starting every paragraph with "@person did xyz" + +## Analysis Process + +Before writing your digest, complete a thorough analysis inside tags within your thinking block. It's OK for this section to be quite long. Include: + +1. **Extract All Commit Messages**: Quote every single commit message verbatim from the data, one by one +2. **Extract Contributors**: Systematically go through the data and list all GitHub usernames (format as @username), counting them as you go +3. **Group into 4-6 Themes**: Organize commits into coherent themes based on functionality or area of work. For each theme: + - Theme name + - Specific commits that belong (quote relevant messages verbatim) + - Contributors who worked on it +4. **Plan Technical Details**: For each theme, identify: + - Main outcome or change (focus on impact, not implementation) + - 1-2 key technical details worth mentioning only if they help explain impact + - Avoid code snippets unless absolutely essential +5. **Structure Planning**: Write your planned theme names and brief descriptions +6. **Readability Check**: Review your planned descriptions to ensure you: + - Have 4-6 themes maximum for better flow + - Vary sentence structure (don't start every paragraph with contributor names) + - Integrate contributor mentions naturally throughout the narrative + - State facts from commits without making quality assessments + - Avoid completion language + - Focus on outcomes over technical implementation +7. **Requirements Verification**: Systematically check each planned theme description against all 8 critical requirements listed above, going through them one by one to ensure compliance + +## Output Structure + +Write your digest following this exact structure: + +### Team Digest: [Date Range] + +[Opening paragraph: Main areas of work. Be specific but concise - 2-3 sentences maximum.] + +### What Was Shipped + +For each theme (4-6 total): + +#### [Clear Theme Name] + +[2-3 paragraphs explaining: +- Paragraph 1: What was built and why it matters (outcome and impact) +- Paragraph 2: Key approach - mention important components only when relevant for understanding impact +- Paragraph 3 (if needed): Integration points or collaboration details + +Mention contributors naturally throughout, varying sentence structure] + +### Technical Highlights + +[3-5 bullet points of technically interesting work that other engineers would want to know about. Focus on reusable patterns, architectural decisions, or important changes. Only include items that add significant value and aren't duplicative of what was stated above.] + +## Example Output Structure + +### Team Digest: March 1-15, 2024 + +The team focused on expanding notification capabilities, refactoring data layer components, and improving test infrastructure. + +### What Was Shipped + +#### Notification System Development + +A new notification system now polls the backend and manages dismissal state locally, allowing users to receive timely updates about important events. The system provides options for different notification types and integrates with existing user preferences through the settings panel. + +Working primarily on the core functionality, @alice built the polling mechanism and state management, while @bob handled the integration work that allows users to configure which notifications they receive and how they're delivered. + +#### Data Layer Refactoring + +The data access layer underwent restructuring with multiple API clients consolidated into a unified service. This change provides more consistent error handling and simplifies how the application manages data across different features. + +@charlie led this refactoring effort, which resulted in a unified error handling pattern that reduces code duplication across components. + +### Technical Highlights + +• New notification provider can be easily integrated into other applications +• Unified error handling pattern reduces code duplication across components +• Test suite now runs 40% faster due to infrastructure improvements +• New data fetching approach simplifies component logic and improves testability + +Your final output should consist only of the structured team digest following the format above, without duplicating or rehashing any of the analysis work you completed in your thinking block. + +Here is the commit data you need to analyze: + + +{{COMMIT_DATA}} + diff --git a/apps/cli/src/ui/App.tsx b/apps/cli/src/ui/App.tsx new file mode 100644 index 00000000000..e0ddb98230c --- /dev/null +++ b/apps/cli/src/ui/App.tsx @@ -0,0 +1,175 @@ +import type { OrchestratorConfig } from '@universe/cli/src/core/orchestrator' +import type { Release } from '@universe/cli/src/lib/release-scanner' +import { AppStateProvider, type TeamFilter, useAppState } from '@universe/cli/src/ui/hooks/useAppState' +import { BugBisectResultsScreen } from '@universe/cli/src/ui/screens/BugBisectResultsScreen' +import { BugInputScreen } from '@universe/cli/src/ui/screens/BugInputScreen' +import { ConfigReview } from '@universe/cli/src/ui/screens/ConfigReview' +import { ExecutionScreen } from '@universe/cli/src/ui/screens/ExecutionScreen' +import { ReleaseSelector } from '@universe/cli/src/ui/screens/ReleaseSelector' +import { ResultsScreen } from '@universe/cli/src/ui/screens/ResultsScreen' +import { TeamSelectorScreen } from '@universe/cli/src/ui/screens/TeamSelectorScreen' +import { WelcomeScreen } from '@universe/cli/src/ui/screens/WelcomeScreen' +import { useCallback, useEffect } from 'react' + +function AppContent(): JSX.Element { + const { state, dispatch } = useAppState() + + // Clear terminal on initial mount + useEffect(() => { + process.stdout.write('\x1Bc') // VT100 clear screen and scrollback + }, []) + const handleWelcomeContinue = (mode: 'release-changelog' | 'team-digest' | 'changelog' | 'bug-bisect'): void => { + // Route based on analysis mode + switch (mode) { + case 'release-changelog': + dispatch({ type: 'SET_SCREEN', screen: 'release-select' }) + break + case 'bug-bisect': + dispatch({ type: 'SET_SCREEN', screen: 'release-select' }) + break + case 'team-digest': + dispatch({ type: 'SET_SCREEN', screen: 'team-select' }) + break + case 'changelog': + // Skip to config review for custom analysis + dispatch({ type: 'SET_SCREEN', screen: 'config-review' }) + break + } + } + + const handleReleaseSelect = (_release: Release, _comparison: Release | null): void => { + // If bug-bisect mode, go to bug input screen; otherwise go to config review + if (state.analysisMode === 'bug-bisect') { + dispatch({ type: 'SET_SCREEN', screen: 'bug-input' }) + } else { + dispatch({ type: 'SET_SCREEN', screen: 'config-review' }) + } + } + + const handleBugInputContinue = (): void => { + dispatch({ type: 'SET_SCREEN', screen: 'config-review' }) + } + + const handleBugInputBack = (): void => { + dispatch({ type: 'SET_SCREEN', screen: 'release-select' }) + } + + const handleTeamSelect = (_teamFilter: TeamFilter | null): void => { + dispatch({ type: 'SET_SCREEN', screen: 'config-review' }) + } + + const handleConfigConfirm = (config: OrchestratorConfig): void => { + dispatch({ type: 'UPDATE_CONFIG', config }) + dispatch({ type: 'SET_SCREEN', screen: 'execution' }) + } + + const handleExecutionComplete = useCallback( + (results: Record): void => { + // Transform orchestrator results to app state format + // Orchestrator returns { analysis: "markdown content", ... } or JSON for bug-bisect + const changelog = typeof results.analysis === 'string' ? results.analysis : JSON.stringify(results, null, 2) + + dispatch({ type: 'SET_RESULTS', results: { changelog, metadata: results } }) + // Route to bug-bisect results screen if in bug-bisect mode + if (state.analysisMode === 'bug-bisect') { + dispatch({ type: 'SET_SCREEN', screen: 'results' }) + } else { + dispatch({ type: 'SET_SCREEN', screen: 'results' }) + } + }, + [dispatch, state.analysisMode], + ) + + const handleExecutionError = useCallback( + (_error: Error): void => { + dispatch({ type: 'SET_EXECUTION_STATE', state: 'error' }) + // Could navigate to error screen or show error in execution screen + }, + [dispatch], + ) + + const handleBack = (): void => { + // Determine previous screen based on current screen and mode + if (state.screen === 'config-review') { + // Go back to appropriate selector based on mode + switch (state.analysisMode) { + case 'release-changelog': + dispatch({ type: 'SET_SCREEN', screen: 'release-select' }) + break + case 'bug-bisect': + dispatch({ type: 'SET_SCREEN', screen: 'bug-input' }) + break + case 'team-digest': + dispatch({ type: 'SET_SCREEN', screen: 'team-select' }) + break + case 'changelog': + dispatch({ type: 'SET_SCREEN', screen: 'welcome' }) + break + } + } else if (state.screen === 'bug-input') { + dispatch({ type: 'SET_SCREEN', screen: 'release-select' }) + } else if (state.screen === 'release-select' || state.screen === 'team-select') { + dispatch({ type: 'SET_SCREEN', screen: 'welcome' }) + } else if (state.screen === 'execution' || state.screen === 'results') { + dispatch({ type: 'SET_SCREEN', screen: 'config-review' }) + } + } + + const handleRestart = (): void => { + dispatch({ type: 'SET_SCREEN', screen: 'welcome' }) + dispatch({ type: 'SELECT_RELEASE', release: null }) + dispatch({ type: 'SET_COMPARISON_RELEASE', release: null }) + dispatch({ type: 'SET_RESULTS', results: null }) + dispatch({ type: 'SET_EXECUTION_STATE', state: 'idle' }) + } + + switch (state.screen) { + case 'welcome': + return + case 'release-select': + return + case 'bug-input': + return + case 'team-select': + return + case 'config-review': + return + case 'execution': + return ( + + ) + case 'results': + // Use BugBisectResultsScreen for bug-bisect mode, otherwise ResultsScreen + if (state.analysisMode === 'bug-bisect') { + return ( + + ) + } + return ( + + ) + default: + return + } +} + +export function App(): JSX.Element { + return ( + + + + ) +} diff --git a/apps/cli/src/ui/components/Banner.tsx b/apps/cli/src/ui/components/Banner.tsx new file mode 100644 index 00000000000..09c3d17375a --- /dev/null +++ b/apps/cli/src/ui/components/Banner.tsx @@ -0,0 +1,30 @@ +import { Box, Text } from 'ink' +import Gradient from 'ink-gradient' + +const BANNER_ART = ` + ██╗ ██╗███╗ ██╗██╗██╗ ██╗███████╗██████╗ ███████╗███████╗ + ██║ ██║████╗ ██║██║██║ ██║██╔════╝██╔══██╗██╔════╝██╔════╝ + ██║ ██║██╔██╗ ██║██║██║ ██║█████╗ ██████╔╝███████╗█████╗ + ██║ ██║██║╚██╗██║██║╚██╗ ██╔╝██╔══╝ ██╔══██╗╚════██║██╔══╝ + ╚██████╔╝██║ ╚████║██║ ╚████╔╝ ███████╗██║ ██║███████║███████╗ (cli) + ╚═════╝ ╚═╝ ╚═══╝╚═╝ ╚═══╝ ╚══════╝╚═╝ ╚═╝╚══════╝╚══════╝ +` + +interface BannerProps { + subtitle?: string +} + +export function Banner({ subtitle }: BannerProps): JSX.Element { + return ( + + {BANNER_ART} + {subtitle && ( + + + {subtitle} + + + )} + + ) +} diff --git a/apps/cli/src/ui/components/Box.tsx b/apps/cli/src/ui/components/Box.tsx new file mode 100644 index 00000000000..e988e17715f --- /dev/null +++ b/apps/cli/src/ui/components/Box.tsx @@ -0,0 +1,18 @@ +import { Box as InkBox, Text } from 'ink' +import type { ReactNode } from 'react' + +interface BoxProps { + children: ReactNode + title?: string + borderColor?: string + padding?: number +} + +export function Box({ children, title, borderColor, padding = 1 }: BoxProps): JSX.Element { + return ( + + {title && {title}} + {children} + + ) +} diff --git a/apps/cli/src/ui/components/ChangelogPreview.tsx b/apps/cli/src/ui/components/ChangelogPreview.tsx new file mode 100644 index 00000000000..48315cd9a02 --- /dev/null +++ b/apps/cli/src/ui/components/ChangelogPreview.tsx @@ -0,0 +1,20 @@ +import { Box as InkBox, Text } from 'ink' + +interface ChangelogPreviewProps { + changelog: string +} + +export function ChangelogPreview({ changelog }: ChangelogPreviewProps): JSX.Element { + // Split into lines and render + const lines = changelog.split('\n') + + return ( + + Changelog Preview + + {lines.map((line, index) => ( + {line} + ))} + + ) +} diff --git a/apps/cli/src/ui/components/FormField.tsx b/apps/cli/src/ui/components/FormField.tsx new file mode 100644 index 00000000000..68f2aaaca78 --- /dev/null +++ b/apps/cli/src/ui/components/FormField.tsx @@ -0,0 +1,26 @@ +import { Box, Text } from 'ink' +import type { ReactNode } from 'react' + +interface FormFieldProps { + children: ReactNode + focused?: boolean + helpText?: string + marginLeft?: number +} + +/** + * Wrapper component for form fields that provides consistent styling + * and focus handling. Composable with Toggle, TextInput, NumberInput, etc. + */ +export function FormField({ children, focused, helpText, marginLeft = 0 }: FormFieldProps): JSX.Element { + return ( + + {children} + {helpText && focused && ( + + {helpText} + + )} + + ) +} diff --git a/apps/cli/src/ui/components/NumberInput.tsx b/apps/cli/src/ui/components/NumberInput.tsx new file mode 100644 index 00000000000..9e327e9ad9d --- /dev/null +++ b/apps/cli/src/ui/components/NumberInput.tsx @@ -0,0 +1,39 @@ +import { colors } from '@universe/cli/src/ui/utils/colors' +import { Box, Text } from 'ink' + +interface NumberInputProps { + label: string + value: number + onChange: (value: number) => void + focused?: boolean + isEditing?: boolean + editValue?: string + min?: number + max?: number + step?: number +} + +export function NumberInput({ + label, + value, + onChange: _onChange, + focused = false, + isEditing = false, + editValue, + min: _min, + max: _max, + step: _step = 1, +}: NumberInputProps): JSX.Element { + const displayValue = isEditing && editValue !== undefined ? editValue : value + + return ( + + + {focused ? '❯ ' : ' '} + {label}: {displayValue} + {isEditing && (Enter to save, Esc to cancel, type digits)} + {focused && !isEditing && (↑↓←→ to adjust, Enter to edit)} + + + ) +} diff --git a/apps/cli/src/ui/components/ProgressIndicator.tsx b/apps/cli/src/ui/components/ProgressIndicator.tsx new file mode 100644 index 00000000000..4b7a3f75344 --- /dev/null +++ b/apps/cli/src/ui/components/ProgressIndicator.tsx @@ -0,0 +1,75 @@ +import type { ProgressEvent, ProgressStage } from '@universe/cli/src/ui/services/orchestrator-service' +import { colors } from '@universe/cli/src/ui/utils/colors' +import { Box, Text } from 'ink' + +interface Stage { + key: ProgressStage + label: string +} + +const stages: Stage[] = [ + { key: 'collecting', label: 'Collecting data' }, + { key: 'analyzing', label: 'Analyzing with AI' }, + { key: 'delivering', label: 'Delivering results' }, +] + +interface ProgressIndicatorProps { + currentStage: ProgressStage + message?: string + cacheInfo?: ProgressEvent['cacheInfo'] +} + +export function ProgressIndicator({ currentStage, message, cacheInfo }: ProgressIndicatorProps): JSX.Element { + const currentIndex = stages.findIndex((s) => s.key === currentStage) + + const getCacheLabel = (cacheInfoItem: ProgressEvent['cacheInfo']): string => { + if (!cacheInfoItem) { + return '' + } + const typeLabel = cacheInfoItem.type === 'commits' ? 'commits' : cacheInfoItem.type === 'prs' ? 'PRs' : 'stats' + return `(cached: ${cacheInfoItem.count} ${typeLabel})` + } + + return ( + + {stages.map((stage, index) => { + const isComplete = index < currentIndex + const isCurrent = index === currentIndex && currentStage !== 'idle' && currentStage !== 'error' + + let icon = '○' + let color = 'gray' + + if (isComplete) { + icon = '●' + color = 'green' + } else if (isCurrent) { + icon = '◉' + color = colors.primary + } + + // Show cache info for collecting stage when it's current or complete + const showCacheInfo = cacheInfo && stage.key === 'collecting' && (isCurrent || isComplete) + + return ( + + {icon} {stage.label} + {showCacheInfo && ( + + {' '} + {getCacheLabel(cacheInfo)} + + )} + {isCurrent && !showCacheInfo && '...'} + + ) + })} + {message && ( + + + {message} + + + )} + + ) +} diff --git a/apps/cli/src/ui/components/ReleaseList.tsx b/apps/cli/src/ui/components/ReleaseList.tsx new file mode 100644 index 00000000000..04911f578fa --- /dev/null +++ b/apps/cli/src/ui/components/ReleaseList.tsx @@ -0,0 +1,34 @@ +import type { Release } from '@universe/cli/src/lib/release-scanner' +import { colors } from '@universe/cli/src/ui/utils/colors' +import { formatBranch } from '@universe/cli/src/ui/utils/format' +import { Text } from 'ink' + +interface ReleaseListProps { + releases: Release[] + selectedIndex: number | null + platform?: 'mobile' | 'extension' +} + +export function ReleaseList({ releases, selectedIndex, platform }: ReleaseListProps): JSX.Element { + const filtered = platform ? releases.filter((r) => r.platform === platform) : releases + + if (filtered.length === 0) { + return No releases found + } + + return ( + <> + {filtered.map((release, index) => { + const isSelected = selectedIndex === index + const prefix = isSelected ? '→ ' : ' ' + + return ( + + {prefix} + {release.platform}/{release.version} ({formatBranch(release.branch)}) + + ) + })} + + ) +} diff --git a/apps/cli/src/ui/components/Select.tsx b/apps/cli/src/ui/components/Select.tsx new file mode 100644 index 00000000000..18b43a29332 --- /dev/null +++ b/apps/cli/src/ui/components/Select.tsx @@ -0,0 +1,38 @@ +import { colors } from '@universe/cli/src/ui/utils/colors' +import { Text } from 'ink' +import SelectInput, { type IndicatorProps, type ItemProps } from 'ink-select-input' + +interface SelectItem { + label: string + value: string +} + +interface SelectProps { + items: SelectItem[] + onSelect: (item: SelectItem) => void +} + +/** + * Themed SelectInput wrapper with Uniswap pink highlighting + */ +export function Select({ items, onSelect }: SelectProps): JSX.Element { + // Custom item component with pink color + const itemComponent = ({ isSelected, label }: ItemProps): JSX.Element => ( + + {isSelected ? '❯ ' : ' '} + {label} + + ) + + // Empty indicator component to disable default blue chevron + const indicatorComponent = (_props: IndicatorProps): JSX.Element => <> + + return ( + + ) +} diff --git a/apps/cli/src/ui/components/StatusBadge.tsx b/apps/cli/src/ui/components/StatusBadge.tsx new file mode 100644 index 00000000000..16e501d1b2c --- /dev/null +++ b/apps/cli/src/ui/components/StatusBadge.tsx @@ -0,0 +1,20 @@ +import { colors } from '@universe/cli/src/ui/utils/colors' +import { Text } from 'ink' + +type StatusType = 'success' | 'warning' | 'error' | 'info' + +interface StatusBadgeProps { + type: StatusType + children: React.ReactNode +} + +const statusColors: Record = { + success: colors.success, + warning: colors.warning, + error: colors.error, + info: colors.primary, +} + +export function StatusBadge({ type, children }: StatusBadgeProps): JSX.Element { + return {children} +} diff --git a/apps/cli/src/ui/components/TextInput.tsx b/apps/cli/src/ui/components/TextInput.tsx new file mode 100644 index 00000000000..c26dd66cdab --- /dev/null +++ b/apps/cli/src/ui/components/TextInput.tsx @@ -0,0 +1,38 @@ +import { colors } from '@universe/cli/src/ui/utils/colors' +import { Box, Text } from 'ink' + +interface TextInputProps { + label: string + value: string + onChange: (value: string) => void + focused?: boolean + isEditing?: boolean + editValue?: string + placeholder?: string +} + +export function TextInput({ + label, + value, + onChange: _onChange, + focused = false, + isEditing = false, + editValue, + placeholder = '', +}: TextInputProps): JSX.Element { + const displayValue = isEditing && editValue !== undefined ? editValue : value || placeholder + + return ( + + + {focused ? '❯ ' : ' '} + {label}:{' '} + + {displayValue} + + {isEditing && (Enter to save, Esc to cancel, type text)} + {focused && !isEditing && (Enter to edit)} + + + ) +} diff --git a/apps/cli/src/ui/components/Toggle.tsx b/apps/cli/src/ui/components/Toggle.tsx new file mode 100644 index 00000000000..38b1e6cf106 --- /dev/null +++ b/apps/cli/src/ui/components/Toggle.tsx @@ -0,0 +1,22 @@ +import { colors } from '@universe/cli/src/ui/utils/colors' +import { Text } from 'ink' + +interface ToggleProps { + label: string + checked: boolean + onToggle: () => void + focused?: boolean +} + +/** + * Toggle component - does not handle its own input + * Parent component should handle Enter/Space when this is focused + */ +export function Toggle({ label, checked, onToggle: _onToggle, focused = false }: ToggleProps): JSX.Element { + return ( + + {focused ? '❯ ' : ' '} + {checked ? '◉' : '○'} {label} + + ) +} diff --git a/apps/cli/src/ui/components/WindowedSelect.tsx b/apps/cli/src/ui/components/WindowedSelect.tsx new file mode 100644 index 00000000000..13d514398cc --- /dev/null +++ b/apps/cli/src/ui/components/WindowedSelect.tsx @@ -0,0 +1,101 @@ +import { colors } from '@universe/cli/src/ui/utils/colors' +import { Box, Text, useInput } from 'ink' +import { useCallback, useEffect, useState } from 'react' + +interface WindowedSelectItem { + label: string + value: string + data?: T +} + +interface WindowedSelectProps { + items: WindowedSelectItem[] + onSelect: (item: WindowedSelectItem) => void + onFocusChange?: (item: WindowedSelectItem | null) => void + limit?: number // Number of visible items (default: 10) +} + +const DEFAULT_LIMIT = 10 + +export function WindowedSelect({ + items, + onSelect, + onFocusChange, + limit = DEFAULT_LIMIT, +}: WindowedSelectProps): JSX.Element { + const [selectedIndex, setSelectedIndex] = useState(0) + const [startIndex, setStartIndex] = useState(0) + + // Notify parent when focused item changes + useEffect(() => { + if (onFocusChange) { + const focusedItem = items[selectedIndex] ?? null + onFocusChange(focusedItem) + } + }, [selectedIndex, items, onFocusChange]) + + // Calculate visible window + const endIndex = Math.min(startIndex + limit, items.length) + const visibleItems = items.slice(startIndex, endIndex) + const relativeSelectedIndex = selectedIndex - startIndex + + // Keep selected item in view when it moves outside the window + useEffect(() => { + if (selectedIndex < startIndex) { + // Selected item moved above visible window + setStartIndex(Math.max(0, selectedIndex)) + } else if (selectedIndex >= endIndex) { + // Selected item moved below visible window + setStartIndex(Math.max(0, selectedIndex - limit + 1)) + } + }, [selectedIndex, startIndex, endIndex, limit]) + + // Reset to top when items change + useEffect(() => { + setSelectedIndex(0) + setStartIndex(0) + }, []) + + // Handle keyboard input + useInput( + useCallback( + (input: string, key: { upArrow?: boolean; downArrow?: boolean; return?: boolean }) => { + if (key.upArrow && selectedIndex > 0) { + setSelectedIndex(selectedIndex - 1) + } else if (key.downArrow && selectedIndex < items.length - 1) { + setSelectedIndex(selectedIndex + 1) + } else if (key.return) { + const selectedItem = items[selectedIndex] + if (selectedItem) { + onSelect(selectedItem) + } + } + }, + [selectedIndex, items, onSelect], + ), + ) + + const hasMoreAbove = startIndex > 0 + const hasMoreBelow = endIndex < items.length + + return ( + + {hasMoreAbove && ... {startIndex} more above (use ↑ to scroll) ...} + {visibleItems.map((item, index) => { + const isSelected = index === relativeSelectedIndex + return ( + + {isSelected ? '❯ ' : ' '} + {item.label} + + ) + })} + {hasMoreBelow && ... {items.length - endIndex} more below (use ↓ to scroll) ...} + + + Selected: {selectedIndex + 1} of {items.length} (Enter to select) + + + + ) +} diff --git a/apps/cli/src/ui/hooks/useAnalysis.ts b/apps/cli/src/ui/hooks/useAnalysis.ts new file mode 100644 index 00000000000..e66406d0991 --- /dev/null +++ b/apps/cli/src/ui/hooks/useAnalysis.ts @@ -0,0 +1,53 @@ +import type { OrchestratorConfig } from '@universe/cli/src/core/orchestrator' +import { OrchestratorService, type ProgressEvent } from '@universe/cli/src/ui/services/orchestrator-service' +import { useCallback, useState } from 'react' + +interface UseAnalysisResult { + execute: (config: OrchestratorConfig) => Promise | null> + results: Record | null + progress: ProgressEvent | null + error: Error | null + isRunning: boolean +} + +export function useAnalysis(): UseAnalysisResult { + const [results, setResults] = useState | null>(null) + const [progress, setProgress] = useState(null) + const [error, setError] = useState(null) + const [isRunning, setIsRunning] = useState(false) + const [service] = useState(() => new OrchestratorService()) + + const execute = useCallback( + async (config: OrchestratorConfig): Promise | null> => { + try { + setIsRunning(true) + setError(null) + setProgress({ stage: 'idle' }) + setResults(null) + + const result = await service.execute(config, (event: ProgressEvent) => { + setProgress(event) + }) + + setResults(result) + setIsRunning(false) + return result + } catch (err) { + const errorObj = err instanceof Error ? err : new Error(String(err)) + setError(errorObj) + setIsRunning(false) + setProgress({ stage: 'error', message: errorObj.message }) + return null + } + }, + [service], + ) + + return { + execute, + results, + progress, + error, + isRunning, + } +} diff --git a/apps/cli/src/ui/hooks/useAppState.tsx b/apps/cli/src/ui/hooks/useAppState.tsx new file mode 100644 index 00000000000..f786dc9faed --- /dev/null +++ b/apps/cli/src/ui/hooks/useAppState.tsx @@ -0,0 +1,132 @@ +import type { OrchestratorConfig } from '@universe/cli/src/core/orchestrator' +import type { Release } from '@universe/cli/src/lib/release-scanner' +import { createContext, type ReactNode, useContext, useReducer } from 'react' + +export type Screen = + | 'welcome' + | 'release-select' + | 'team-select' + | 'config-review' + | 'execution' + | 'results' + | 'bug-input' + +export type AnalysisMode = 'release-changelog' | 'team-digest' | 'changelog' | 'bug-bisect' + +export interface TeamFilter { + teams?: string[] + usernames?: string[] + emails?: string[] +} + +export interface TeamMembersCache { + emails: string[] + usernames: string[] +} + +interface AppState { + screen: Screen + repository: { owner: string; name: string } | null + releases: Release[] + selectedRelease: Release | null + comparisonRelease: Release | null + analysisMode: AnalysisMode + bugDescription: string | null + teamFilter: TeamFilter | null + teamMembersCache: Record + timePeriod: string + config: Partial + executionState: 'idle' | 'running' | 'complete' | 'error' + results: { changelog: string; metadata: unknown } | null +} + +type AppAction = + | { type: 'SET_SCREEN'; screen: Screen } + | { type: 'SET_REPOSITORY'; repository: { owner: string; name: string } | null } + | { type: 'SET_RELEASES'; releases: Release[] } + | { type: 'SELECT_RELEASE'; release: Release | null } + | { type: 'SET_COMPARISON_RELEASE'; release: Release | null } + | { type: 'SET_ANALYSIS_MODE'; mode: AnalysisMode } + | { type: 'SET_BUG_DESCRIPTION'; description: string | null } + | { type: 'SET_TEAM_FILTER'; filter: TeamFilter | null } + | { type: 'CACHE_TEAM_MEMBERS'; teamSlug: string; members: TeamMembersCache } + | { type: 'SET_TIME_PERIOD'; period: string } + | { type: 'UPDATE_CONFIG'; config: Partial } + | { type: 'SET_EXECUTION_STATE'; state: 'idle' | 'running' | 'complete' | 'error' } + | { type: 'SET_RESULTS'; results: { changelog: string; metadata: unknown } | null } + +const initialState: AppState = { + screen: 'welcome', + repository: null, + releases: [], + selectedRelease: null, + comparisonRelease: null, + analysisMode: 'release-changelog', + bugDescription: null, + teamFilter: null, + teamMembersCache: {}, + timePeriod: '30 days ago', + config: {}, + executionState: 'idle', + results: null, +} + +function appReducer(state: AppState, action: AppAction): AppState { + switch (action.type) { + case 'SET_SCREEN': + return { ...state, screen: action.screen } + case 'SET_REPOSITORY': + return { ...state, repository: action.repository } + case 'SET_RELEASES': + return { ...state, releases: action.releases } + case 'SELECT_RELEASE': + return { ...state, selectedRelease: action.release } + case 'SET_COMPARISON_RELEASE': + return { ...state, comparisonRelease: action.release } + case 'SET_ANALYSIS_MODE': + return { ...state, analysisMode: action.mode } + case 'SET_BUG_DESCRIPTION': + return { ...state, bugDescription: action.description } + case 'SET_TEAM_FILTER': + return { ...state, teamFilter: action.filter } + case 'CACHE_TEAM_MEMBERS': + return { + ...state, + teamMembersCache: { + ...state.teamMembersCache, + [action.teamSlug]: action.members, + }, + } + case 'SET_TIME_PERIOD': + return { ...state, timePeriod: action.period } + case 'UPDATE_CONFIG': + return { ...state, config: { ...state.config, ...action.config } } + case 'SET_EXECUTION_STATE': + return { ...state, executionState: action.state } + case 'SET_RESULTS': + return { ...state, results: action.results } + default: + return state + } +} + +interface AppContextValue { + state: AppState + dispatch: React.Dispatch +} + +const AppContext = createContext(null) + +export function AppStateProvider({ children }: { children: ReactNode }): JSX.Element { + const [state, dispatch] = useReducer(appReducer, initialState) + + return {children} +} + +export function useAppState(): AppContextValue { + const context = useContext(AppContext) + if (!context) { + throw new Error('useAppState must be used within AppStateProvider') + } + return context +} diff --git a/apps/cli/src/ui/hooks/useEditableField.ts b/apps/cli/src/ui/hooks/useEditableField.ts new file mode 100644 index 00000000000..4f407921586 --- /dev/null +++ b/apps/cli/src/ui/hooks/useEditableField.ts @@ -0,0 +1,107 @@ +import { useCallback, useEffect, useState } from 'react' + +interface UseEditableFieldOptions { + value: T + onChange: (value: T) => void + focused: boolean + type?: 'text' | 'number' + min?: number + max?: number + step?: number + onEditStart?: () => void + onEditEnd?: () => void +} + +interface UseEditableFieldReturn { + isEditing: boolean + editValue: string + startEdit: () => void + saveEdit: () => void + cancelEdit: () => void + handleInput: (input: string, key: { backspace?: boolean; delete?: boolean }) => void +} + +/** + * Hook for managing editable field state and keyboard input + * Handles edit mode (Enter to edit, Esc to cancel, typing) + */ +export function useEditableField({ + value, + onChange, + focused, + type = 'text', + min, + max, + step: _step = 1, + onEditStart, + onEditEnd, +}: UseEditableFieldOptions): UseEditableFieldReturn { + const [isEditing, setIsEditing] = useState(false) + const [editValue, setEditValue] = useState('') + + const startEdit = useCallback(() => { + setIsEditing(true) + setEditValue(String(value)) + onEditStart?.() + }, [value, onEditStart]) + + const saveEdit = useCallback(() => { + if (type === 'number') { + const numValue = Number.parseInt(editValue, 10) + if (!Number.isNaN(numValue)) { + const clampedValue = Math.max(min ?? 0, Math.min(max ?? Number.MAX_SAFE_INTEGER, numValue)) + onChange(clampedValue as T) + } + } else { + onChange(editValue as T) + } + setIsEditing(false) + setEditValue('') + onEditEnd?.() + }, [editValue, type, min, max, onChange, onEditEnd]) + + const cancelEdit = useCallback(() => { + setIsEditing(false) + setEditValue('') + onEditEnd?.() + }, [onEditEnd]) + + // Reset editing state when focus is lost + useEffect(() => { + if (!focused && isEditing) { + cancelEdit() + } + }, [focused, isEditing, cancelEdit]) + + const handleInput = useCallback( + (input: string, key: { backspace?: boolean; delete?: boolean; return?: boolean; escape?: boolean }) => { + if (key.return) { + if (isEditing) { + saveEdit() + } else { + startEdit() + } + } else if (key.escape && isEditing) { + cancelEdit() + } else if (key.backspace || key.delete) { + setEditValue((prev) => prev.slice(0, -1)) + } else if (input && input.length === 1) { + if (type === 'number' && /^\d$/.test(input)) { + setEditValue((prev) => prev + input) + } else if (type === 'text') { + setEditValue((prev) => prev + input) + } + } + }, + [type, isEditing, saveEdit, cancelEdit, startEdit], + ) + + return { + isEditing, + editValue, + startEdit, + saveEdit, + cancelEdit, + handleInput, + } +} diff --git a/apps/cli/src/ui/hooks/useFormNavigation.ts b/apps/cli/src/ui/hooks/useFormNavigation.ts new file mode 100644 index 00000000000..125cd62cb9c --- /dev/null +++ b/apps/cli/src/ui/hooks/useFormNavigation.ts @@ -0,0 +1,67 @@ +import { useInput } from 'ink' +import { useCallback, useState } from 'react' + +interface UseFormNavigationOptions { + itemCount: number + onEscape?: () => void + enabled?: boolean + // Optional: block navigation when true (e.g., when editing a field) + blockNavigation?: boolean +} + +interface UseFormNavigationReturn { + focusedIndex: number + setFocusedIndex: (index: number) => void +} + +/** + * Hook for managing keyboard navigation in forms + * Handles up/down arrow navigation only - selection logic handled by parent + */ +export function useFormNavigation({ + itemCount, + onEscape, + enabled = true, + blockNavigation = false, +}: UseFormNavigationOptions): UseFormNavigationReturn { + const [focusedIndex, setFocusedIndex] = useState(0) + + const arrowUp = useCallback(() => { + setFocusedIndex((prev) => Math.max(0, prev - 1)) + }, []) + + const arrowDown = useCallback(() => { + setFocusedIndex((prev) => Math.min(itemCount - 1, prev + 1)) + }, [itemCount]) + + const handleEscape = useCallback(() => { + if (onEscape) { + onEscape() + } + }, [onEscape]) + + // Register keyboard handlers - only handles navigation arrows + useInput( + useCallback( + (_input: string, key: { upArrow?: boolean; downArrow?: boolean; escape?: boolean }) => { + if (!enabled || blockNavigation) { + return + } + + if (key.upArrow) { + arrowUp() + } else if (key.downArrow) { + arrowDown() + } else if (key.escape && onEscape) { + handleEscape() + } + }, + [enabled, blockNavigation, arrowUp, arrowDown, handleEscape, onEscape], + ), + ) + + return { + focusedIndex, + setFocusedIndex, + } +} diff --git a/apps/cli/src/ui/hooks/useReleases.ts b/apps/cli/src/ui/hooks/useReleases.ts new file mode 100644 index 00000000000..55eb85a0484 --- /dev/null +++ b/apps/cli/src/ui/hooks/useReleases.ts @@ -0,0 +1,106 @@ +import { type Release, ReleaseScanner } from '@universe/cli/src/lib/release-scanner' +import { useCallback, useEffect, useRef, useState } from 'react' + +interface UseReleasesResult { + releases: Release[] + loading: boolean + error: Error | null + getLatest: (platform: 'mobile' | 'extension') => Promise + getPrevious: (release: Release) => Promise + findRelease: (platform: 'mobile' | 'extension', version: string) => Promise + refresh: (platform?: 'mobile' | 'extension') => Promise +} + +export function useReleases(platform?: 'mobile' | 'extension'): UseReleasesResult { + const [releases, setReleases] = useState([]) + const [loading, setLoading] = useState(true) + const [error, setError] = useState(null) + const [scanner] = useState(() => new ReleaseScanner()) + const isScanningRef = useRef(false) + const lastScannedPlatformRef = useRef(undefined) + + const refresh = useCallback( + async (filterPlatform?: 'mobile' | 'extension') => { + // Guard: Prevent multiple simultaneous scans + if (isScanningRef.current) { + return + } + + const targetPlatform = filterPlatform || platform + const platformKey = targetPlatform || 'all' + + // Guard: Don't re-scan if we already scanned for this platform + if (lastScannedPlatformRef.current === platformKey) { + return + } + + try { + isScanningRef.current = true + setLoading(true) + setError(null) + const fetched = await scanner.scanReleases(targetPlatform) + setReleases(fetched) + lastScannedPlatformRef.current = platformKey + setLoading(false) + } catch (err) { + setError(err instanceof Error ? err : new Error(String(err))) + setLoading(false) + } finally { + isScanningRef.current = false + } + }, + [scanner, platform], + ) + + useEffect(() => { + // Only scan on initial mount or when platform actually changes + const platformKey = platform || 'all' + if (lastScannedPlatformRef.current !== platformKey) { + // eslint-disable-next-line @typescript-eslint/no-floating-promises -- Intentionally fire-and-forget promise + refresh() + } + }, [platform, refresh]) + + const getLatest = useCallback( + async (targetPlatform: 'mobile' | 'extension'): Promise => { + try { + return await scanner.getLatestRelease(targetPlatform) + } catch (_err) { + return null + } + }, + [scanner], + ) + + const getPrevious = useCallback( + async (release: Release): Promise => { + try { + return await scanner.getPreviousRelease(release) + } catch (_err) { + return null + } + }, + [scanner], + ) + + const findRelease = useCallback( + async (targetPlatform: 'mobile' | 'extension', version: string): Promise => { + try { + return await scanner.findRelease(targetPlatform, version) + } catch (_err) { + return null + } + }, + [scanner], + ) + + return { + releases, + loading, + error, + getLatest, + getPrevious, + findRelease, + refresh, + } +} diff --git a/apps/cli/src/ui/hooks/useRepository.ts b/apps/cli/src/ui/hooks/useRepository.ts new file mode 100644 index 00000000000..ca3ed53b81a --- /dev/null +++ b/apps/cli/src/ui/hooks/useRepository.ts @@ -0,0 +1,53 @@ +import { detectRepository } from '@universe/cli/src/lib/team-resolver' +import { useEffect, useState } from 'react' + +interface Repository { + owner: string + name: string +} + +interface UseRepositoryResult { + repository: Repository | null + loading: boolean + error: Error | null +} + +export function useRepository(): UseRepositoryResult { + const [repository, setRepository] = useState(null) + const [loading, setLoading] = useState(true) + const [error, setError] = useState(null) + + useEffect(() => { + let cancelled = false + + async function detect(): Promise { + try { + setLoading(true) + setError(null) + const detected = await detectRepository() + if (!cancelled) { + if (detected && detected.owner && detected.name) { + setRepository({ owner: detected.owner, name: detected.name }) + } else { + setRepository(null) + } + setLoading(false) + } + } catch (err) { + if (!cancelled) { + setError(err instanceof Error ? err : new Error(String(err))) + setLoading(false) + } + } + } + + // eslint-disable-next-line @typescript-eslint/no-floating-promises -- Intentionally fire-and-forget promise + detect() + + return () => { + cancelled = true + } + }, []) + + return { repository, loading, error } +} diff --git a/apps/cli/src/ui/hooks/useTeams.ts b/apps/cli/src/ui/hooks/useTeams.ts new file mode 100644 index 00000000000..71c7e59bd82 --- /dev/null +++ b/apps/cli/src/ui/hooks/useTeams.ts @@ -0,0 +1,94 @@ +import { $ } from 'bun' +import { useCallback, useEffect, useRef, useState } from 'react' + +export interface GitHubTeam { + name: string + slug: string + description: string | null + membersCount?: number +} + +interface UseTeamsResult { + teams: GitHubTeam[] + loading: boolean + error: Error | null + refresh: () => Promise +} + +/** + * Hook to fetch teams from a GitHub organization + */ +export function useTeams(org: string | null): UseTeamsResult { + const [teams, setTeams] = useState([]) + const [loading, setLoading] = useState(true) + const [error, setError] = useState(null) + const isFetchingRef = useRef(false) + const lastFetchedOrgRef = useRef(null) + + const refresh = useCallback(async () => { + if (!org) { + setLoading(false) + return + } + + // Guard: Prevent multiple simultaneous fetches + if (isFetchingRef.current) { + return + } + + // Guard: Don't re-fetch if we already fetched for this org + if (lastFetchedOrgRef.current === org) { + return + } + + try { + isFetchingRef.current = true + setLoading(true) + setError(null) + + // Fetch teams from GitHub API + const teamsResult = + await $`gh api /orgs/${org}/teams --jq '.[] | {name: .name, slug: .slug, description: .description}'`.text() + + const teamLines = teamsResult.trim().split('\n').filter(Boolean) + const parsedTeams: GitHubTeam[] = teamLines + .map((line: string) => { + try { + const parsed = JSON.parse(line) as GitHubTeam + return parsed + } catch { + return null + } + }) + .filter((team: GitHubTeam | null): team is GitHubTeam => team !== null) + + setTeams(parsedTeams) + lastFetchedOrgRef.current = org + setLoading(false) + } catch (err) { + setError( + err instanceof Error + ? err + : new Error(`Failed to fetch teams from org "${org}". Ensure gh CLI is authenticated.`), + ) + setLoading(false) + } finally { + isFetchingRef.current = false + } + }, [org]) + + useEffect(() => { + // Only fetch on initial mount or when org changes + if (org && lastFetchedOrgRef.current !== org) { + // eslint-disable-next-line @typescript-eslint/no-floating-promises -- Intentionally fire-and-forget promise + refresh() + } + }, [org, refresh]) + + return { + teams, + loading, + error, + refresh, + } +} diff --git a/apps/cli/src/ui/hooks/useToggleGroup.ts b/apps/cli/src/ui/hooks/useToggleGroup.ts new file mode 100644 index 00000000000..5be9a703328 --- /dev/null +++ b/apps/cli/src/ui/hooks/useToggleGroup.ts @@ -0,0 +1,70 @@ +import { useCallback, useState } from 'react' + +interface UseToggleGroupOptions { + items: Array<{ key: T; label: string }> + initialSelected?: Set + minSelection?: number // Minimum number of items that must be selected +} + +interface UseToggleGroupReturn { + selected: Set + toggle: (key: T) => void + isSelected: (key: T) => boolean + selectAll: () => void + deselectAll: () => void +} + +/** + * Hook for managing a group of toggles/checkboxes + * Useful for multiple selection scenarios like output options + */ +export function useToggleGroup({ + items, + initialSelected = new Set(), + minSelection = 0, +}: UseToggleGroupOptions): UseToggleGroupReturn { + const [selected, setSelected] = useState>(initialSelected) + + const toggle = useCallback( + (key: T) => { + setSelected((prev) => { + const next = new Set(prev) + if (next.has(key)) { + // Don't allow unchecking if it would violate minSelection + if (next.size > minSelection) { + next.delete(key) + } + } else { + next.add(key) + } + return next + }) + }, + [minSelection], + ) + + const isSelected = useCallback( + (key: T) => { + return selected.has(key) + }, + [selected], + ) + + const selectAll = useCallback(() => { + setSelected(new Set(items.map((item) => item.key))) + }, [items]) + + const deselectAll = useCallback(() => { + if (items.length >= minSelection) { + setSelected(new Set(items.slice(0, minSelection).map((item) => item.key))) + } + }, [items, minSelection]) + + return { + selected, + toggle, + isSelected, + selectAll, + deselectAll, + } +} diff --git a/apps/cli/src/ui/screens/BugBisectResultsScreen.tsx b/apps/cli/src/ui/screens/BugBisectResultsScreen.tsx new file mode 100644 index 00000000000..69b065a0e62 --- /dev/null +++ b/apps/cli/src/ui/screens/BugBisectResultsScreen.tsx @@ -0,0 +1,464 @@ +import { join } from 'node:path' +import { Select } from '@universe/cli/src/ui/components/Select' +import { TextInput } from '@universe/cli/src/ui/components/TextInput' +import { useAppState } from '@universe/cli/src/ui/hooks/useAppState' +import { useRepository } from '@universe/cli/src/ui/hooks/useRepository' +import { colors } from '@universe/cli/src/ui/utils/colors' +import { Box as InkBox, Text, useInput } from 'ink' +import { useCallback, useMemo, useState } from 'react' + +interface BugBisectResultsScreenProps { + results: { changelog: string; metadata: unknown } + onRestart: () => void +} + +interface SuspiciousCommit { + sha: string + confidence: number + reasoning: string + relatedPR?: number +} + +interface BugBisectResults { + suspiciousCommits?: SuspiciousCommit[] + summary?: string + totalCommitsAnalyzed?: number + releaseContext?: { + from: string + to: string + platform: string + } +} + +type ViewMode = 'menu' | 'save-file' | 'saved' + +function isValidBugBisectResults(value: unknown): value is BugBisectResults { + return ( + typeof value === 'object' && + value !== null && + 'suspiciousCommits' in value && + Array.isArray((value as BugBisectResults).suspiciousCommits) + ) +} + +function tryParseFromString(jsonString: string): BugBisectResults | null { + try { + const parsed = JSON.parse(jsonString) as BugBisectResults + if (isValidBugBisectResults(parsed)) { + return parsed + } + } catch { + // Not valid JSON or not valid BugBisectResults + } + return null +} + +function getConfidenceColor(confidence: number): string { + if (confidence >= 0.9) { + return 'red' + } + if (confidence >= 0.7) { + return '#ff8c00' + } // orange + if (confidence >= 0.5) { + return 'yellow' + } + return 'gray' +} + +function getConfidenceLabel(confidence: number): string { + if (confidence >= 0.9) { + return 'Very Likely' + } + if (confidence >= 0.7) { + return 'Likely' + } + if (confidence >= 0.5) { + return 'Possible' + } + return 'Unlikely' +} + +export function BugBisectResultsScreen({ results, onRestart }: BugBisectResultsScreenProps): JSX.Element { + const { state } = useAppState() + const { repository } = useRepository() + const [viewMode, setViewMode] = useState('menu') + const [filename, setFilename] = useState('bug-bisect-results.json') + const [filepath, setFilepath] = useState(process.cwd()) + const [savedPath, setSavedPath] = useState('') + const [focusedIndex, setFocusedIndex] = useState(0) + const [editingIndex, setEditingIndex] = useState(null) + const [editValue, setEditValue] = useState('') + const [saveError, setSaveError] = useState(null) + + // Parse results + const parsedResults = useMemo((): BugBisectResults | null => { + try { + // Try to parse from metadata if it's already parsed + if (results.metadata && typeof results.metadata === 'object') { + const metadata = results.metadata as Record + if (isValidBugBisectResults(metadata)) { + return metadata + } + } + + // Try to parse from changelog string (might be JSON) + if (typeof results.changelog === 'string') { + const parsed = tryParseFromString(results.changelog) + if (parsed) { + return parsed + } + } + + // Try to parse from metadata.analysis if it's a string + if (results.metadata && typeof results.metadata === 'object') { + const metadata = results.metadata as Record + const analysisString = metadata.analysis + if (typeof analysisString === 'string') { + const parsed = tryParseFromString(analysisString) + if (parsed) { + return parsed + } + } + } + + return null + } catch { + return null + } + }, [results]) + + const bugResults = useMemo((): BugBisectResults => { + if (parsedResults) { + return parsedResults + } + return { + suspiciousCommits: [], + summary: 'Failed to parse results', + totalCommitsAnalyzed: 0, + releaseContext: state.selectedRelease + ? { + from: state.comparisonRelease?.version || 'unknown', + to: state.selectedRelease.version, + platform: state.selectedRelease.platform, + } + : undefined, + } + }, [parsedResults, state.selectedRelease, state.comparisonRelease]) + + const githubBaseUrl = repository ? `https://github.com/${repository.owner}/${repository.name}` : '' + + const options = [ + { label: 'Save to File', value: 'save' }, + { label: 'Start Over', value: 'restart' }, + { label: 'Quit', value: 'quit' }, + ] + + const handleSelect = (option: { label: string; value: string }): void => { + if (option.value === 'quit') { + process.exit(0) + } else if (option.value === 'restart') { + onRestart() + } else if (option.value === 'save') { + setViewMode('save-file') + } + } + + const saveFile = useCallback(async () => { + try { + const fullPath = join(filepath, filename) + const content = JSON.stringify(bugResults, null, 2) + await Bun.write(fullPath, content) + setSavedPath(fullPath) + setViewMode('saved') + setSaveError(null) + } catch (error) { + setSaveError(error instanceof Error ? error.message : 'Failed to save file') + } + }, [filepath, filename, bugResults]) + + // Handle input for save-file mode (similar to ResultsScreen) + useInput( + useCallback( + (input, key) => { + if (viewMode !== 'save-file') { + return + } + + const isEditing = editingIndex !== null + + if (key.escape) { + if (isEditing) { + setEditingIndex(null) + setEditValue('') + } else { + setViewMode('menu') + setFocusedIndex(0) + setSaveError(null) + } + return + } + + if (!isEditing) { + if (key.upArrow) { + setFocusedIndex((prev) => Math.max(0, prev - 1)) + return + } + if (key.downArrow) { + setFocusedIndex((prev) => Math.min(2, prev + 1)) + return + } + if (key.return) { + if (focusedIndex === 0 || focusedIndex === 1) { + setEditingIndex(focusedIndex) + setEditValue(focusedIndex === 0 ? filename : filepath) + } else if (focusedIndex === 2) { + saveFile().catch(() => { + // Error already handled in saveFile + }) + } + return + } + } + + if (isEditing) { + if (key.return) { + if (editingIndex === 0) { + setFilename(editValue) + } else if (editingIndex === 1) { + setFilepath(editValue) + } + setEditingIndex(null) + setEditValue('') + return + } + + if (key.backspace || key.delete) { + setEditValue((prev) => prev.slice(0, -1)) + return + } + + if (input && input.length === 1) { + setEditValue((prev) => prev + input) + return + } + } + }, + [viewMode, focusedIndex, editingIndex, editValue, filename, filepath, saveFile], + ), + ) + + // Handle input for saved mode + useInput( + useCallback( + (_input, key) => { + if (viewMode === 'saved' && (key.return || key.escape)) { + setViewMode('menu') + setFocusedIndex(0) + } + }, + [viewMode], + ), + ) + + if (viewMode === 'save-file') { + return ( + + + + Save Results to File + + + + + + + + + + {focusedIndex === 2 ? '❯ ' : ' '} + Save File + + + + {saveError && ( + + Error: {saveError} + + )} + + + + Use ↑↓ to navigate, Enter to edit/save, Esc to {editingIndex !== null ? 'cancel' : 'go back'} + + + + + ) + } + + if (viewMode === 'saved') { + return ( + + + + ✓ File Saved Successfully + + + + + + Saved to:{' '} + + {savedPath} + + + + + Press Enter or Esc to return to menu + + + + ) + } + + const suspiciousCommits = bugResults.suspiciousCommits || [] + + return ( + + + + ✓ Bug Analysis Complete + + + + + {/* Bug Description */} + {state.bugDescription && ( + + Bug Description + {state.bugDescription} + + )} + + {/* Release Context */} + {bugResults.releaseContext && ( + + + Platform: {bugResults.releaseContext.platform} + + + Release: {bugResults.releaseContext.from} → {bugResults.releaseContext.to} + + {bugResults.totalCommitsAnalyzed !== undefined && ( + + Commits Analyzed: {bugResults.totalCommitsAnalyzed} + + )} + + )} + + {/* Summary */} + {bugResults.summary && ( + + {bugResults.summary} + + )} + + {/* Suspicious Commits */} + {suspiciousCommits.length > 0 ? ( + + + + Suspicious Commits ({suspiciousCommits.length}) + + + + {suspiciousCommits.slice(0, 20).map((commit, index) => { + const confidenceColor = getConfidenceColor(commit.confidence) + const confidenceLabel = getConfidenceLabel(commit.confidence) + const shortSha = commit.sha.slice(0, 7) + const commitUrl = githubBaseUrl ? `${githubBaseUrl}/commit/${commit.sha}` : '' + const prUrl = commit.relatedPR && githubBaseUrl ? `${githubBaseUrl}/pull/${commit.relatedPR}` : '' + + return ( + + + + #{index + 1}. {shortSha} + + + + {confidenceLabel} ({Math.round(commit.confidence * 100)}%) + + + + + + {commitUrl ? ( + + {commitUrl} + + ) : ( + SHA: {commit.sha} + )} + + {commit.relatedPR && ( + + PR #{commit.relatedPR} + {prUrl && ( + + {' '} + - {prUrl} + + )} + + )} + + + + {commit.reasoning} + + + ) + })} + + {suspiciousCommits.length > 20 && ( + + ... and {suspiciousCommits.length - 20} more commits + + )} + + ) : ( + + ⚠ No suspicious commits found + + )} + + + + What would you like to do next? + + + + { + if (item.value === 'back') { + setMode('browse') + } else { + setPlatformFilter(item.value as 'mobile' | 'extension' | 'all') + setMode('browse') + } + }} + /> + + + ) + } + + // Browse mode - show releases + if (mode === 'browse') { + // Create options with navigation and filter controls at the top + const browseOptions = [ + { label: '← Back to Quick Actions', value: 'back' }, + { label: '🔍 Filter by Platform', value: 'filter' }, + ...filteredReleases.map((release: Release, index: number) => ({ + label: `${release.platform}/${release.version} (${formatBranch(release.branch)})`, + value: String(index + 2), // Offset by 2 for back and filter options + release, + })), + ] + + return ( + + + + Select Release + + + + {loading && ( + + Loading releases... + + )} + {error && ( + + Error: {error.message} + + )} + + {!loading && !error && ( + <> + + Showing {filteredReleases.length} release{filteredReleases.length !== 1 ? 's' : ''}{' '} + {platformFilter !== 'all' ? `(${platformFilter})` : ''} + + { + if (item.value === 'back') { + setMode('quick') + } else if (item.value === 'filter') { + setMode('filter-platform') + } else if (item.release) { + const release = item.release + const index = filteredReleases.findIndex( + (r: Release) => r.platform === release.platform && r.version === release.version, + ) + if (index >= 0) { + handleBrowseSelect(index) + } + } + }} + /> + + )} + + + ) + } + + return ( + + + + Release Selection + + + + + Choose a quick action or browse releases: + + + + + ) +} diff --git a/apps/cli/src/ui/screens/TeamDetailsScreen.tsx b/apps/cli/src/ui/screens/TeamDetailsScreen.tsx new file mode 100644 index 00000000000..55086f74b85 --- /dev/null +++ b/apps/cli/src/ui/screens/TeamDetailsScreen.tsx @@ -0,0 +1,152 @@ +import { fetchTeamMembers, type TeamMember } from '@universe/cli/src/lib/team-members' +import { resolveTeam } from '@universe/cli/src/lib/team-resolver' +import { Select } from '@universe/cli/src/ui/components/Select' +import { StatusBadge } from '@universe/cli/src/ui/components/StatusBadge' +import { type TeamFilter, useAppState } from '@universe/cli/src/ui/hooks/useAppState' +import type { GitHubTeam } from '@universe/cli/src/ui/hooks/useTeams' +import { colors } from '@universe/cli/src/ui/utils/colors' +import { Box, Text } from 'ink' +import Spinner from 'ink-spinner' +import { useEffect, useState } from 'react' + +interface TeamDetailsScreenProps { + team: GitHubTeam + org: string + onSelect: (teamFilter: TeamFilter) => void + onBack: () => void +} + +export function TeamDetailsScreen({ team, org, onSelect, onBack }: TeamDetailsScreenProps): JSX.Element { + const { dispatch } = useAppState() + const [members, setMembers] = useState([]) + const [loading, setLoading] = useState(true) + const [error, setError] = useState(null) + + useEffect(() => { + let cancelled = false + + const loadMembers = async (): Promise => { + try { + setLoading(true) + setError(null) + + // Fetch members for display + const fetchedMembers = await fetchTeamMembers(org, team.slug) + + if (!cancelled) { + setMembers(fetchedMembers) + + // Also resolve to emails/usernames and cache for later use + const teamSlug = `@${org}/${team.slug}` + try { + const { emails, usernames } = await resolveTeam(teamSlug) + dispatch({ + type: 'CACHE_TEAM_MEMBERS', + teamSlug, + members: { emails, usernames }, + }) + } catch { + // If resolveTeam fails, continue with display but don't cache + // The user can still see members, just won't be cached + } + + setLoading(false) + } + } catch (err) { + if (!cancelled) { + setError(err instanceof Error ? err : new Error('Failed to fetch team members')) + setLoading(false) + } + } + } + + // eslint-disable-next-line @typescript-eslint/no-floating-promises -- Intentionally fire-and-forget promise + loadMembers() + + return () => { + cancelled = true + } + }, [org, team.slug, dispatch]) + + const handleSelectTeam = (): void => { + const teamFilter: TeamFilter = { + teams: [`@${org}/${team.slug}`], + } + dispatch({ type: 'SET_TEAM_FILTER', filter: teamFilter }) + onSelect(teamFilter) + } + + return ( + + + + Team Details + + + + + + @{org}/{team.slug} + + {team.name} + {team.description && {team.description}} + + + + + Members + + + {loading && ( + + + + + Loading members... + + )} + + {error && ( + + {error.message} + + )} + + {!loading && !error && members.length === 0 && ( + + No members found + + )} + + {!loading && !error && members.length > 0 && ( + + + {members.length} member{members.length !== 1 ? 's' : ''} + + + {members.map((member) => ( + + • {member.name ? `${member.name} (@${member.login})` : `@${member.login}`} + + ))} + + + )} + + + { + if (item.value === 'confirm') { + handleManualConfirm() + } else { + setMode('quick') + setManualStep('teams') + } + }} + /> + + + + ) + } + } + + // Team details mode + if (mode === 'details' && selectedTeamForDetails && org) { + return ( + { + setMode('browse') + setSelectedTeamForDetails(null) + }} + /> + ) + } + + // Browse mode + if (mode === 'browse') { + const browseOptions = [ + { label: '← Back to Quick Actions', value: 'back' }, + ...teams.map((team: GitHubTeam) => ({ + label: `@${org}/${team.slug} - ${team.name}${team.description ? ` (${team.description})` : ''}`, + value: team.slug, + team, + })), + ] + + return ( + + + + Select Team + + + + {loading && ( + + Loading teams from {org}... + + )} + {error && ( + + Error: {error.message} + + )} + + {!loading && !error && ( + <> + + Found {teams.length} team{teams.length !== 1 ? 's' : ''} in {org} + + {focusedTeam && Press Tab to view team members} + { + if (item.value === 'back') { + setMode('quick') + setFocusedTeam(null) + } else if (item.team) { + handleBrowseSelect(item.team) + } + }} + onFocusChange={(item: { value: string; team?: GitHubTeam } | null) => { + setFocusedTeam(item?.team ?? null) + }} + /> + + )} + + + ) + } + + // Default: Quick actions mode + return ( + + + + Team Filter Selection + + + + + Choose how to filter contributors: + + + + + ) +} diff --git a/apps/cli/src/ui/services/orchestrator-service.ts b/apps/cli/src/ui/services/orchestrator-service.ts new file mode 100644 index 00000000000..fe8f3777de2 --- /dev/null +++ b/apps/cli/src/ui/services/orchestrator-service.ts @@ -0,0 +1,68 @@ +import type { OrchestratorConfig } from '@universe/cli/src/core/orchestrator' +import { Orchestrator } from '@universe/cli/src/core/orchestrator' +import { createVercelAIProvider } from '@universe/cli/src/lib/ai-provider-vercel' +import { SqliteCacheProvider } from '@universe/cli/src/lib/cache-provider-sqlite' +import { type ProgressEvent, ProgressLogger, type ProgressStage } from '@universe/cli/src/lib/logger' + +export type { ProgressStage, ProgressEvent } + +export type ProgressCallback = (event: ProgressEvent) => void + +export class OrchestratorService { + private orchestrator: Orchestrator | null = null + private progressCallback: ProgressCallback | null = null + + async execute(config: OrchestratorConfig, onProgress?: ProgressCallback): Promise> { + this.progressCallback = onProgress || null + + // Create cache provider (unless bypassing cache) + const bypassCache = config.bypassCache || false + const cacheProvider = bypassCache ? undefined : new SqliteCacheProvider() + + // Create AI provider + const apiKey = process.env.ANTHROPIC_API_KEY + if (!apiKey) { + throw new Error('ANTHROPIC_API_KEY environment variable is required') + } + const aiProvider = createVercelAIProvider(apiKey) + + // Ensure repoPath is set in collect options + const configWithRepoPath: OrchestratorConfig = { + ...config, + collect: { + ...config.collect, + repoPath: config.collect.repoPath || process.cwd(), + }, + } + + // Create progress logger that emits events for interactive UI mode + const logger = new ProgressLogger((event: ProgressEvent) => { + this.emitProgress(event) + }, config.verbose || false) + + // Create orchestrator with progress logger + this.orchestrator = new Orchestrator({ + config: configWithRepoPath, + aiProvider, + cacheProvider, + logger, + }) + + try { + // Execute and capture the analysis results + const results = await this.orchestrator.execute() + return results + } finally { + // Close cache connection if used + if (cacheProvider) { + cacheProvider.close() + } + } + } + + private emitProgress(event: ProgressEvent): void { + if (this.progressCallback) { + this.progressCallback(event) + } + } +} diff --git a/apps/cli/src/ui/utils/colors.ts b/apps/cli/src/ui/utils/colors.ts new file mode 100644 index 00000000000..624a198f6c4 --- /dev/null +++ b/apps/cli/src/ui/utils/colors.ts @@ -0,0 +1,13 @@ +/** + * Theme color constants for Ink UI + * Using Uniswap pink color palette + */ +export const colors = { + primary: '#FC74FE', // Uniswap pink for interactive elements + success: '#00FF00', // Green for completions + warning: '#FFFF00', // Yellow for important info + error: '#FF0000', // Red for errors + muted: '#888888', // Gray for secondary text +} as const + +export type ColorName = keyof typeof colors diff --git a/apps/cli/src/ui/utils/format.ts b/apps/cli/src/ui/utils/format.ts new file mode 100644 index 00000000000..689d619a803 --- /dev/null +++ b/apps/cli/src/ui/utils/format.ts @@ -0,0 +1,18 @@ +/** + * Text formatting utilities for UI components + */ + +export function truncate(text: string, maxLength: number): string { + if (text.length <= maxLength) { + return text + } + return `${text.slice(0, maxLength - 3)}...` +} + +export function formatVersion(version: string): string { + return version +} + +export function formatBranch(branch: string): string { + return branch.replace('origin/releases/', '') +} diff --git a/apps/cli/tsconfig.json b/apps/cli/tsconfig.json new file mode 100644 index 00000000000..748b6c093fa --- /dev/null +++ b/apps/cli/tsconfig.json @@ -0,0 +1,11 @@ +{ + "extends": "../../config/tsconfig/app.json", + "include": ["src/**/*.ts", "src/**/*.tsx", "src/**/*.json", "src/global.d.ts"], + "exclude": ["src/**/*.spec.ts", "src/**/*.spec.tsx", "src/**/*.test.ts", "src/**/*.test.tsx"], + "compilerOptions": { + "noEmit": false, + "module": "esnext", + "moduleResolution": "bundler" + }, + "references": [] +} diff --git a/apps/cli/tsconfig.lint.json b/apps/cli/tsconfig.lint.json new file mode 100644 index 00000000000..79659c26038 --- /dev/null +++ b/apps/cli/tsconfig.lint.json @@ -0,0 +1,8 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "preserveSymlinks": true + }, + "include": ["**/*.ts", "**/*.tsx", "**/*.json"], + "exclude": ["node_modules"] +} diff --git a/apps/extension/.gitignore b/apps/extension/.gitignore index d96df7d9000..57bab834221 100644 --- a/apps/extension/.gitignore +++ b/apps/extension/.gitignore @@ -35,3 +35,5 @@ tsconfig.tsbuildinfo # E2E test artifacts e2e/test-results/ + +coverage/ diff --git a/apps/extension/jest-setup.js b/apps/extension/jest-setup.js index fcf81fe78e0..beb80a32847 100644 --- a/apps/extension/jest-setup.js +++ b/apps/extension/jest-setup.js @@ -2,6 +2,7 @@ import 'utilities/jest-package-mocks' import 'uniswap/jest-package-mocks' import 'wallet/jest-package-mocks' import 'config/jest-presets/ui/ui-package-mocks' +import 'react-native-gesture-handler/jestSetup'; import { chrome } from 'jest-chrome' import { AppearanceSettingType } from 'wallet/src/features/appearance/slice' @@ -51,6 +52,39 @@ global.chrome = { i18n: { ...global.chrome.i18n, getUILanguage: jest.fn().mockReturnValue(MOCK_LANGUAGE) + }, + storage: { + ...chrome.storage, + local: { + ...chrome.storage.local, + addListener: jest.fn(), + }, + session: { + get: jest.fn().mockImplementation((_keys, callback) => { + if (callback) { + callback({}) + } + return Promise.resolve({}) + }), + set: jest.fn().mockImplementation((_items, callback) => { + if (callback) { + callback() + } + return Promise.resolve() + }), + remove: jest.fn().mockImplementation((_keys, callback) => { + if (callback) { + callback() + } + return Promise.resolve() + }), + clear: jest.fn().mockImplementation((callback) => { + if (callback) { + callback() + } + return Promise.resolve() + }) + } } } @@ -69,10 +103,52 @@ const mockAppearanceSetting = AppearanceSettingType.System jest.mock('wallet/src/features/appearance/hooks', () => { return { useCurrentAppearanceSetting: () => mockAppearanceSetting, - } -}) -jest.mock('wallet/src/features/appearance/hooks', () => { - return { useSelectedColorScheme: () => 'light', } }) + +// Mock IntersectionObserver for Tamagui's useElementLayout +const IntersectionObserverMock = jest.fn().mockImplementation((callback) => ({ + observe: jest.fn((element) => { + // Immediately call the callback with a mock entry + if (callback && element) { + callback([ + { + target: element, + isIntersecting: true, + intersectionRatio: 1, + boundingClientRect: { + x: 0, + y: 0, + width: 100, + height: 100, + top: 0, + right: 100, + bottom: 100, + left: 0, + }, + intersectionRect: { + x: 0, + y: 0, + width: 100, + height: 100, + top: 0, + right: 100, + bottom: 100, + left: 0, + }, + rootBounds: null, + time: 0, + }, + ]) + } + }), + unobserve: jest.fn(), + disconnect: jest.fn(), + takeRecords: jest.fn().mockReturnValue([]), + root: null, + rootMargin: '', + thresholds: [], +})) + +global.IntersectionObserver = IntersectionObserverMock diff --git a/apps/extension/jest.config.js b/apps/extension/jest.config.js index 383e89187d0..cf7a5007b46 100644 --- a/apps/extension/jest.config.js +++ b/apps/extension/jest.config.js @@ -38,6 +38,10 @@ module.exports = { ], resolver: "/src/test/jest-resolver.js", displayName: 'Extension Wallet', + testMatch: [ + '/src/**/*.(spec|test).[jt]s?(x)', + '/config/**/*.(spec|test).[jt]s?(x)', + ], testPathIgnorePatterns: [ ...preset.testPathIgnorePatterns, '/e2e/', @@ -58,6 +62,5 @@ module.exports = { setupFiles: [ '../../config/jest-presets/jest/setup.js', './jest-setup.js', - '../../node_modules/react-native-gesture-handler/jestSetup.js', ], } diff --git a/apps/extension/src/app/components/AutoLockProvider.test.tsx b/apps/extension/src/app/components/AutoLockProvider.test.tsx index 0b082e9cc91..5e3f69795e7 100644 --- a/apps/extension/src/app/components/AutoLockProvider.test.tsx +++ b/apps/extension/src/app/components/AutoLockProvider.test.tsx @@ -1,252 +1,337 @@ -import { waitFor } from '@testing-library/react' import React from 'react' import { AutoLockProvider } from 'src/app/components/AutoLockProvider' import { render } from 'src/test/test-utils' import { FiatCurrency } from 'uniswap/src/features/fiatCurrency/constants' import { Language } from 'uniswap/src/features/language/constants' import { DeviceAccessTimeout } from 'uniswap/src/features/settings/constants' -import { ExtensionEventName } from 'uniswap/src/features/telemetry/constants' -import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send' import { logger } from 'utilities/src/logger/logger' -import { Keyring } from 'wallet/src/features/wallet/Keyring/Keyring' // Mock dependencies jest.mock('uniswap/src/extension/useIsChromeWindowFocused') -jest.mock('uniswap/src/features/telemetry/send') jest.mock('utilities/src/logger/logger') -jest.mock('wallet/src/features/wallet/Keyring/Keyring') - -// Import mocked modules with proper typing -import { useIsChromeWindowFocusedWithTimeout } from 'uniswap/src/extension/useIsChromeWindowFocused' - -const mockUseIsChromeWindowFocusedWithTimeout = useIsChromeWindowFocusedWithTimeout as jest.MockedFunction< - typeof useIsChromeWindowFocusedWithTimeout -> -const mockSendAnalyticsEvent = sendAnalyticsEvent as jest.MockedFunction -const mockLogger = logger as jest.Mocked -const mockKeyring = Keyring as jest.Mocked - -// Helper functions for common test patterns -const renderAutoLockProvider = ( - deviceAccessTimeout: DeviceAccessTimeout, - children: React.ReactNode =
Test
, -) => { - return render({children}, { - preloadedState: { - userSettings: { - currentLanguage: Language.English, - currentCurrency: FiatCurrency.UnitedStatesDollar, - hideSmallBalances: true, - hideSpamTokens: true, - hapticsEnabled: true, - deviceAccessTimeout, - }, - }, - }) +jest.mock('src/app/hooks/useIsWalletUnlocked', () => ({ + useIsWalletUnlocked: jest.fn(), + isWalletUnlocked: null, +})) + +// Import mocked modules +import { useIsWalletUnlocked } from 'src/app/hooks/useIsWalletUnlocked' +import { useIsChromeWindowFocused } from 'uniswap/src/extension/useIsChromeWindowFocused' + +const mockUseIsChromeWindowFocused = jest.mocked(useIsChromeWindowFocused) +const mockUseIsWalletUnlocked = jest.mocked(useIsWalletUnlocked) +const mockLogger = jest.mocked(logger) + +// Mock chrome.alarms API +const mockChromeAlarms = { + create: jest.fn(), + clear: jest.fn(), } -const simulateFocusChange = (component: ReturnType) => (fromFocused: boolean, toFocused: boolean) => { - mockUseIsChromeWindowFocusedWithTimeout.mockReturnValue(fromFocused) - const { rerender } = component +global.chrome = { + ...global.chrome, + alarms: mockChromeAlarms as unknown as typeof chrome.alarms, +} - mockUseIsChromeWindowFocusedWithTimeout.mockReturnValue(toFocused) - rerender( +// Helper function +const renderAutoLockProvider = (deviceAccessTimeout: DeviceAccessTimeout) => { + return render(
Test
, + { + preloadedState: { + userSettings: { + currentLanguage: Language.English, + currentCurrency: FiatCurrency.UnitedStatesDollar, + hideSmallBalances: true, + hideSpamTokens: true, + hapticsEnabled: true, + deviceAccessTimeout, + }, + }, + }, ) } -const expectWalletLockCalled = async (times: number = 1) => { - await waitFor(() => { - expect(mockKeyring.lock).toHaveBeenCalledTimes(times) - }) -} +const simulateFocusChange = (component: ReturnType) => (fromFocused: boolean, toFocused: boolean) => { + mockUseIsChromeWindowFocused.mockReturnValue(fromFocused) + const { rerender } = component -const expectAnalyticsEventCalled = async () => { - await waitFor(() => { - expect(mockSendAnalyticsEvent).toHaveBeenCalledWith(ExtensionEventName.ChangeLockedState, { - locked: true, - location: 'background', - }) - }) + mockUseIsChromeWindowFocused.mockReturnValue(toFocused) + rerender() } describe('AutoLockProvider', () => { beforeEach(() => { jest.clearAllMocks() - mockUseIsChromeWindowFocusedWithTimeout.mockReturnValue(true) - mockKeyring.lock.mockResolvedValue(true) - mockSendAnalyticsEvent.mockImplementation(() => {}) + mockUseIsChromeWindowFocused.mockReturnValue(true) + mockUseIsWalletUnlocked.mockReturnValue(true) mockLogger.debug.mockImplementation(() => {}) mockLogger.error.mockImplementation(() => {}) + mockChromeAlarms.create.mockImplementation(() => {}) + mockChromeAlarms.clear.mockImplementation(() => {}) }) - describe('window focus monitoring', () => { - const testTimeoutValues = [ - { timeout: DeviceAccessTimeout.FiveMinutes, expectedMs: 5 * 60 * 1000, description: '5 minutes' }, - { timeout: DeviceAccessTimeout.ThirtyMinutes, expectedMs: 30 * 60 * 1000, description: '30 minutes' }, - { timeout: DeviceAccessTimeout.OneHour, expectedMs: 60 * 60 * 1000, description: '1 hour' }, - { timeout: DeviceAccessTimeout.TwentyFourHours, expectedMs: 24 * 60 * 60 * 1000, description: '24 hours' }, - { - timeout: DeviceAccessTimeout.Never, - expectedMs: Number.MAX_SAFE_INTEGER, - description: 'Never (MAX_SAFE_INTEGER)', - }, - ] + describe('mount behavior', () => { + it('should clear alarm on mount', () => { + renderAutoLockProvider(DeviceAccessTimeout.FiveMinutes) - testTimeoutValues.forEach(({ timeout, expectedMs, description }) => { - it(`should call useIsChromeWindowFocusedWithTimeout with correct timeout for ${description}`, () => { - renderAutoLockProvider(timeout) - expect(mockUseIsChromeWindowFocusedWithTimeout).toHaveBeenCalledWith(expectedMs) - }) + expect(mockChromeAlarms.clear).toHaveBeenCalledWith('AutoLockAlarm') + }) + + it('should always render children', () => { + const { container } = renderAutoLockProvider(DeviceAccessTimeout.FiveMinutes) + expect(container.textContent).toBe('Test') }) }) - describe('wallet locking behavior', () => { - it('should lock wallet when window loses focus and timeout is configured', async () => { + describe('unmount behavior', () => { + it('should not schedule alarm on unmount (handled by background port disconnect)', () => { + const { unmount } = renderAutoLockProvider(DeviceAccessTimeout.FiveMinutes) + + unmount() + + // Unmount no longer schedules alarm - this is handled by background script + expect(mockChromeAlarms.create).not.toHaveBeenCalled() + }) + }) + + describe('focus change behavior (while sidebar is open)', () => { + it('should schedule alarm when window loses focus and wallet is unlocked', () => { const component = renderAutoLockProvider(DeviceAccessTimeout.FiveMinutes) - expect(mockKeyring.lock).not.toHaveBeenCalled() + mockChromeAlarms.create.mockClear() // Clear the mount call simulateFocusChange(component)(true, false) - await expectWalletLockCalled() + + expect(mockChromeAlarms.create).toHaveBeenCalledWith('AutoLockAlarm', { + delayInMinutes: 5, + }) }) - it('should not lock wallet when window is focused', () => { - mockUseIsChromeWindowFocusedWithTimeout.mockReturnValue(true) - renderAutoLockProvider(DeviceAccessTimeout.FiveMinutes) - expect(mockKeyring.lock).not.toHaveBeenCalled() + it('should clear alarm when window regains focus', () => { + const component = renderAutoLockProvider(DeviceAccessTimeout.FiveMinutes) + mockChromeAlarms.clear.mockClear() // Clear the mount call + + // First lose focus (creates alarm) + simulateFocusChange(component)(true, false) + expect(mockChromeAlarms.create).toHaveBeenCalled() + + // Then regain focus + simulateFocusChange(component)(false, true) + + expect(mockChromeAlarms.clear).toHaveBeenCalledWith('AutoLockAlarm') }) - it('should not lock wallet when timeout is set to Never', () => { - mockUseIsChromeWindowFocusedWithTimeout.mockReturnValue(false) - renderAutoLockProvider(DeviceAccessTimeout.Never) - expect(mockKeyring.lock).not.toHaveBeenCalled() + it('should not schedule alarm when window loses focus and wallet is locked', () => { + mockUseIsWalletUnlocked.mockReturnValue(false) + const component = renderAutoLockProvider(DeviceAccessTimeout.FiveMinutes) + mockChromeAlarms.create.mockClear() // Clear the mount call + + simulateFocusChange(component)(true, false) + + expect(mockChromeAlarms.create).not.toHaveBeenCalled() }) - it('should send analytics event when locking wallet', async () => { - const component = renderAutoLockProvider(DeviceAccessTimeout.ThirtyMinutes) + it('should not schedule alarm when window loses focus and timeout is Never', () => { + const component = renderAutoLockProvider(DeviceAccessTimeout.Never) + mockChromeAlarms.create.mockClear() // Clear the mount call + simulateFocusChange(component)(true, false) - await expectAnalyticsEventCalled() - expect(mockSendAnalyticsEvent).toHaveBeenCalledTimes(1) + + expect(mockChromeAlarms.create).not.toHaveBeenCalled() }) }) - describe('error handling', () => { - it('should handle Keyring.lock() errors gracefully', async () => { - const lockError = new Error('Failed to lock keyring') - mockKeyring.lock.mockRejectedValue(lockError) + describe('wallet state changes', () => { + it('should clear alarm when wallet becomes locked', () => { + mockUseIsWalletUnlocked.mockReturnValue(true) + const { rerender } = renderAutoLockProvider(DeviceAccessTimeout.FiveMinutes) - const component = renderAutoLockProvider(DeviceAccessTimeout.FiveMinutes) - simulateFocusChange(component)(true, false) + // Clear the initial mount call + mockChromeAlarms.clear.mockClear() - await waitFor(() => { - expect(mockLogger.error).toHaveBeenCalledWith(lockError, { - tags: { - file: 'AutoLockProvider.tsx', - function: 'lockWallet', - }, - }) - }) + // Wallet becomes locked + mockUseIsWalletUnlocked.mockReturnValue(false) + rerender() + + expect(mockChromeAlarms.clear).toHaveBeenCalledWith('AutoLockAlarm') }) - it('should not send analytics event when lock fails', async () => { - const lockError = new Error('Failed to lock keyring') - mockKeyring.lock.mockRejectedValue(lockError) + it('should clear alarm when wallet becomes unlocked', () => { + mockUseIsWalletUnlocked.mockReturnValue(false) + const { rerender } = renderAutoLockProvider(DeviceAccessTimeout.FiveMinutes) - const component = renderAutoLockProvider(DeviceAccessTimeout.FiveMinutes) - simulateFocusChange(component)(true, false) + // Clear the initial mount call + mockChromeAlarms.clear.mockClear() - await waitFor(() => { - expect(mockLogger.error).toHaveBeenCalledWith(lockError, { - tags: { - file: 'AutoLockProvider.tsx', - function: 'lockWallet', - }, - }) - }) + // Wallet becomes unlocked + mockUseIsWalletUnlocked.mockReturnValue(true) + rerender() - expect(mockSendAnalyticsEvent).not.toHaveBeenCalled() - }) - - it('should handle undefined deviceAccessTimeout gracefully', () => { - render( - -
Test
-
, - { - preloadedState: { - userSettings: { - currentLanguage: Language.English, - currentCurrency: FiatCurrency.UnitedStatesDollar, - hideSmallBalances: true, - hideSpamTokens: true, - hapticsEnabled: true, - deviceAccessTimeout: undefined as any, - }, - }, - }, - ) + expect(mockChromeAlarms.clear).toHaveBeenCalledWith('AutoLockAlarm') + }) + + it('should not clear alarm on initial render (only mount clear)', () => { + mockUseIsWalletUnlocked.mockReturnValue(true) + renderAutoLockProvider(DeviceAccessTimeout.FiveMinutes) + + // Only the mount clear should have been called + expect(mockChromeAlarms.clear).toHaveBeenCalledTimes(1) + }) + }) + + describe('combined scenarios', () => { + it('should handle mount -> unmount -> remount correctly', () => { + // First mount + const { unmount } = renderAutoLockProvider(DeviceAccessTimeout.FiveMinutes) + expect(mockChromeAlarms.clear).toHaveBeenCalledTimes(1) + + // Unmount (alarm scheduling now handled in background) + unmount() + + // Second mount (clears alarm) + renderAutoLockProvider(DeviceAccessTimeout.FiveMinutes) + expect(mockChromeAlarms.clear).toHaveBeenCalledTimes(2) + }) + + it('should handle wallet unlock during mounted state', () => { + mockUseIsWalletUnlocked.mockReturnValue(false) + const { rerender } = renderAutoLockProvider(DeviceAccessTimeout.FiveMinutes) + + mockChromeAlarms.clear.mockClear() + + // Wallet unlocks while mounted + mockUseIsWalletUnlocked.mockReturnValue(true) + rerender() + + // Should clear alarm due to wallet state change + expect(mockChromeAlarms.clear).toHaveBeenCalled() + }) - expect(mockUseIsChromeWindowFocusedWithTimeout).toHaveBeenCalledWith(30 * 60 * 1000) + it('should handle wallet lock during mounted state', () => { + mockUseIsWalletUnlocked.mockReturnValue(true) + const { rerender } = renderAutoLockProvider(DeviceAccessTimeout.FiveMinutes) + + mockChromeAlarms.clear.mockClear() + + // Wallet locks while mounted + mockUseIsWalletUnlocked.mockReturnValue(false) + rerender() + + // Should clear alarm due to wallet state change + expect(mockChromeAlarms.clear).toHaveBeenCalled() }) }) - describe('focus state changes', () => { - it('should react to focus state changes from focused to unfocused', async () => { + describe('error handling', () => { + it('should handle chrome.alarms.create errors gracefully', () => { + const error = new Error('Permission denied') + mockChromeAlarms.create.mockImplementationOnce(() => { + throw error + }) + const component = renderAutoLockProvider(DeviceAccessTimeout.FiveMinutes) - expect(mockKeyring.lock).not.toHaveBeenCalled() + mockChromeAlarms.create.mockClear() - simulateFocusChange(component)(true, false) - await expectWalletLockCalled() + // This should not throw, error should be logged + expect(() => { + simulateFocusChange(component)(true, false) + }).not.toThrow() + + expect(mockLogger.error).toHaveBeenCalledWith(error, { + tags: { file: 'AutoLockProvider', function: 'createAutoLockAlarm' }, + extra: { delayInMinutes: 5 }, + }) + }) + + it('should handle chrome.alarms.clear errors gracefully', () => { + const error = new Error('Permission denied') + mockChromeAlarms.clear.mockImplementationOnce(() => { + throw error + }) + + // This should not throw, error should be logged + expect(() => { + renderAutoLockProvider(DeviceAccessTimeout.FiveMinutes) + }).not.toThrow() + + expect(mockLogger.error).toHaveBeenCalledWith(error, { + tags: { file: 'AutoLockProvider', function: 'clearAutoLockAlarm' }, + extra: { reason: 'Cleared auto-lock alarm (sidebar opened)' }, + }) }) - it('should not trigger multiple locks when already unfocused', async () => { + it('should continue to function after chrome.alarms errors', () => { + // First call fails + mockChromeAlarms.clear.mockImplementationOnce(() => { + throw new Error('Permission denied') + }) + const component = renderAutoLockProvider(DeviceAccessTimeout.FiveMinutes) + // Clear the error and mock calls + mockLogger.error.mockClear() + mockChromeAlarms.clear.mockClear() + mockChromeAlarms.create.mockClear() + + // Subsequent calls should still work simulateFocusChange(component)(true, false) - await expectWalletLockCalled() + expect(mockChromeAlarms.create).toHaveBeenCalledWith('AutoLockAlarm', { + delayInMinutes: 5, + }) + expect(mockLogger.error).not.toHaveBeenCalled() + }) + }) - // Rerender with same unfocused state - should not trigger additional calls - const { rerender } = component - rerender( - -
Test
-
, - ) + describe('edge cases', () => { + it('should handle rapid mount/unmount cycles', () => { + const { unmount: unmount1 } = renderAutoLockProvider(DeviceAccessTimeout.FiveMinutes) + unmount1() - expect(mockKeyring.lock).toHaveBeenCalledTimes(1) + const { unmount: unmount2 } = renderAutoLockProvider(DeviceAccessTimeout.FiveMinutes) + unmount2() + + // Should have cleared alarm twice (once per mount) + expect(mockChromeAlarms.clear).toHaveBeenCalledTimes(2) + // No create calls because unmount scheduling is handled in background + expect(mockChromeAlarms.create).not.toHaveBeenCalled() }) - it('should not lock again when returning to focused state', async () => { + it('should handle rapid focus changes', () => { const component = renderAutoLockProvider(DeviceAccessTimeout.FiveMinutes) + mockChromeAlarms.create.mockClear() + mockChromeAlarms.clear.mockClear() + // Lose focus simulateFocusChange(component)(true, false) - await expectWalletLockCalled() + expect(mockChromeAlarms.create).toHaveBeenCalledTimes(1) - // Change back to focused + // Regain focus simulateFocusChange(component)(false, true) - expect(mockKeyring.lock).toHaveBeenCalledTimes(1) - }) - }) + expect(mockChromeAlarms.clear).toHaveBeenCalledTimes(1) - describe('timeout setting changes', () => { - it('should respond to timeout setting changes', () => { - renderAutoLockProvider(DeviceAccessTimeout.FiveMinutes) - expect(mockUseIsChromeWindowFocusedWithTimeout).toHaveBeenLastCalledWith(5 * 60 * 1000) - - renderAutoLockProvider(DeviceAccessTimeout.OneHour) - expect(mockUseIsChromeWindowFocusedWithTimeout).toHaveBeenLastCalledWith(60 * 60 * 1000) + // Lose focus again + simulateFocusChange(component)(true, false) + expect(mockChromeAlarms.create).toHaveBeenCalledTimes(2) }) - it('should handle timeout change from configured to Never', () => { - mockUseIsChromeWindowFocusedWithTimeout.mockReturnValue(false) + it('should prioritize wallet state changes over focus changes (race condition)', () => { + mockUseIsWalletUnlocked.mockReturnValue(true) + mockUseIsChromeWindowFocused.mockReturnValue(true) + const { rerender } = renderAutoLockProvider(DeviceAccessTimeout.FiveMinutes) - renderAutoLockProvider(DeviceAccessTimeout.FiveMinutes) - expect(mockUseIsChromeWindowFocusedWithTimeout).toHaveBeenCalledWith(5 * 60 * 1000) + mockChromeAlarms.clear.mockClear() + mockChromeAlarms.create.mockClear() + + // Simulate simultaneous wallet lock + focus loss + mockUseIsWalletUnlocked.mockReturnValue(false) + mockUseIsChromeWindowFocused.mockReturnValue(false) + rerender() - renderAutoLockProvider(DeviceAccessTimeout.Never) - expect(mockUseIsChromeWindowFocusedWithTimeout).toHaveBeenLastCalledWith(Number.MAX_SAFE_INTEGER) + // Should only clear alarm (wallet state change priority), not schedule + expect(mockChromeAlarms.clear).toHaveBeenCalledTimes(1) + expect(mockChromeAlarms.create).not.toHaveBeenCalled() }) }) }) diff --git a/apps/extension/src/app/components/tabs/ActivityTab.tsx b/apps/extension/src/app/components/tabs/ActivityTab.tsx index a0a8074467f..95ca43b900f 100644 --- a/apps/extension/src/app/components/tabs/ActivityTab.tsx +++ b/apps/extension/src/app/components/tabs/ActivityTab.tsx @@ -1,5 +1,6 @@ import { memo } from 'react' -import { ScrollView } from 'ui/src' +import { Flex, Loader, ScrollView } from 'ui/src' +import { useInfiniteScroll } from 'utilities/src/react/useInfiniteScroll' import { useActivityDataWallet } from 'wallet/src/features/activity/useActivityDataWallet' export const ActivityTab = memo(function _ActivityTab({ @@ -9,9 +10,16 @@ export const ActivityTab = memo(function _ActivityTab({ address: Address skip?: boolean }): JSX.Element { - const { maybeEmptyComponent, renderActivityItem, sectionData } = useActivityDataWallet({ - evmOwner: address, - skip, + const { maybeEmptyComponent, renderActivityItem, sectionData, fetchNextPage, hasNextPage, isFetchingNextPage } = + useActivityDataWallet({ + evmOwner: address, + skip, + }) + + const { sentinelRef } = useInfiniteScroll({ + onLoadMore: fetchNextPage, + hasNextPage, + isFetching: isFetchingNextPage, }) if (maybeEmptyComponent) { @@ -22,6 +30,14 @@ export const ActivityTab = memo(function _ActivityTab({ {/* `sectionData` will be either an array of transactions or an array of loading skeletons */} {sectionData.map((item, index) => renderActivityItem({ item, index }))} + {/* Show skeleton loading indicator while fetching next page */} + {isFetchingNextPage && ( + + + + )} + {/* Intersection observer sentinel for infinite scroll */} + ) }) diff --git a/apps/extension/src/app/core/BaseAppContainer.tsx b/apps/extension/src/app/core/BaseAppContainer.tsx index 09f9327325c..c29cba1056e 100644 --- a/apps/extension/src/app/core/BaseAppContainer.tsx +++ b/apps/extension/src/app/core/BaseAppContainer.tsx @@ -1,3 +1,14 @@ +import { ApiInit, getEntryGatewayUrl, provideSessionService } from '@universe/api' +import { + getIsSessionServiceEnabled, + getIsSessionUpgradeAutoEnabled, + useIsSessionServiceEnabled, +} from '@universe/gating' +import { + createChallengeSolverService, + createSessionInitializationService, + SessionInitializationService, +} from '@universe/sessions' import { PropsWithChildren } from 'react' import { I18nextProvider } from 'react-i18next' import { GraphqlProvider } from 'src/app/apollo' @@ -14,6 +25,46 @@ import { ErrorBoundary } from 'wallet/src/components/ErrorBoundary/ErrorBoundary import { AccountsStoreContextProvider } from 'wallet/src/features/accounts/store/provider' import { SharedWalletProvider } from 'wallet/src/providers/SharedWalletProvider' +const provideSessionInitializationService = (): SessionInitializationService => + createSessionInitializationService({ + getSessionService: () => + provideSessionService({ + getBaseUrl: getEntryGatewayUrl, + getIsSessionServiceEnabled, + }), + challengeSolverService: createChallengeSolverService(), + getIsSessionUpgradeAutoEnabled, + }) + +function BaseAppContainerInner({ children }: PropsWithChildren): JSX.Element { + const isSessionServiceEnabled = useIsSessionServiceEnabled() + + return ( + + + + + + + + + + + {children} + + + + + + + + + ) +} + export function BaseAppContainer({ children, appName, @@ -21,24 +72,7 @@ export function BaseAppContainer({ return ( - - - - - - - - - - {children} - - - - - - - - + {children} ) diff --git a/apps/extension/src/app/core/SidebarApp.tsx b/apps/extension/src/app/core/SidebarApp.tsx index db280c45dfb..eeadc95bfa9 100644 --- a/apps/extension/src/app/core/SidebarApp.tsx +++ b/apps/extension/src/app/core/SidebarApp.tsx @@ -6,6 +6,7 @@ import { useEffect, useRef, useState } from 'react' import { useDispatch } from 'react-redux' import { createHashRouter, RouterProvider } from 'react-router' import { PersistGate } from 'redux-persist/integration/react' +import { AUTO_LOCK_ALARM_NAME } from 'src/app/components/AutoLockProvider' import { ErrorElement } from 'src/app/components/ErrorElement' import { useTraceSidebarDappUrl } from 'src/app/components/Trace/useTraceSidebarDappUrl' import { BaseAppContainer } from 'src/app/core/BaseAppContainer' @@ -188,8 +189,21 @@ function useDappRequestPortListener(): void { }, PORT_PING_INTERVAL) } +/** + * Creates a connection so that the background script can detect when the sidebar is closed and schedule an auto-lock alarm. + */ +function useAutoLockAlarmConnection(): void { + useEffect(() => { + const port = chrome.runtime.connect({ name: AUTO_LOCK_ALARM_NAME }) + return () => { + port.disconnect() + } + }, []) +} + function SidebarWrapper(): JSX.Element { useDappRequestPortListener() + useAutoLockAlarmConnection() useTestnetModeForLoggingAndAnalytics() const resetUnitagsQueries = useResetUnitagsQueries() diff --git a/apps/extension/src/app/features/accounts/AccountItem.tsx b/apps/extension/src/app/features/accounts/AccountItem.tsx index dc2db86aa01..99eb7319601 100644 --- a/apps/extension/src/app/features/accounts/AccountItem.tsx +++ b/apps/extension/src/app/features/accounts/AccountItem.tsx @@ -4,8 +4,8 @@ import { useTranslation } from 'react-i18next' import { useDispatch } from 'react-redux' import { EditLabelModal } from 'src/app/features/accounts/EditLabelModal' import { removeAllDappConnectionsForAccount } from 'src/app/features/dapp/actions' -import { AppRoutes, SettingsRoutes } from 'src/app/navigation/constants' -import { useExtensionNavigation } from 'src/app/navigation/utils' +import { AppRoutes, SettingsRoutes, UnitagClaimRoutes } from 'src/app/navigation/constants' +import { focusOrCreateUnitagTab, useExtensionNavigation } from 'src/app/navigation/utils' import { Flex, Text, TouchableArea } from 'ui/src' import { CopySheets, Edit, Ellipsis, Globe, TrashFilled } from 'ui/src/components/icons' import { iconSizes } from 'ui/src/theme' @@ -97,13 +97,17 @@ export function AccountItem({ address, onAccountSelect, balanceUSD }: AccountIte label: !accountHasUnitag ? t('account.wallet.menu.edit.title') : t('settings.setting.wallet.action.editProfile'), - onPress: (e: BaseSyntheticEvent): void => { + onPress: async (e: BaseSyntheticEvent): Promise => { // We have to manually prevent click-through because the way the context menu is inside of a TouchableArea in this component it // means that without it the TouchableArea handler will get called e.preventDefault() e.stopPropagation() - setShowEditLabelModal(true) + if (accountHasUnitag) { + await focusOrCreateUnitagTab(address, UnitagClaimRoutes.EditProfile) + } else { + setShowEditLabelModal(true) + } }, Icon: Edit, }, @@ -134,7 +138,7 @@ export function AccountItem({ address, onAccountSelect, balanceUSD }: AccountIte iconProps: { color: '$statusCritical' }, }, ] - }, [accountHasUnitag, onPressCopyAddress, navigateTo, t]) + }, [accountHasUnitag, onPressCopyAddress, navigateTo, t, address]) return ( <> diff --git a/apps/extension/src/app/features/accounts/AccountSwitcherScreen.tsx b/apps/extension/src/app/features/accounts/AccountSwitcherScreen.tsx index f73975084a1..41a94dd16f6 100644 --- a/apps/extension/src/app/features/accounts/AccountSwitcherScreen.tsx +++ b/apps/extension/src/app/features/accounts/AccountSwitcherScreen.tsx @@ -1,3 +1,4 @@ +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import { BaseSyntheticEvent, useCallback, useEffect, useMemo, useState } from 'react' import { useTranslation } from 'react-i18next' import { useDispatch, useSelector } from 'react-redux' @@ -18,9 +19,13 @@ import { Button, Flex, Popover, ScrollView, Text, TouchableArea, useSporeColors import { Ellipsis, Globe, Person, TrashFilled, WalletFilled, X } from 'ui/src/components/icons' import { spacing } from 'ui/src/theme' import { AddressDisplay } from 'uniswap/src/components/accounts/AddressDisplay' +import { buildWrappedUrl } from 'uniswap/src/components/banners/shared/utils' +import { UniswapWrapped2025Card } from 'uniswap/src/components/banners/UniswapWrapped2025Card/UniswapWrapped2025Card' import { WarningSeverity } from 'uniswap/src/components/modals/WarningModal/types' import { WarningModal } from 'uniswap/src/components/modals/WarningModal/WarningModal' +import { UNISWAP_WEB_URL } from 'uniswap/src/constants/urls' import { AccountType, DisplayNameType } from 'uniswap/src/features/accounts/types' +import { setHasDismissedUniswapWrapped2025Banner } from 'uniswap/src/features/behaviorHistory/slice' import { Platform } from 'uniswap/src/features/platforms/types/Platform' import { ModalName, WalletEventName } from 'uniswap/src/features/telemetry/constants' import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send' @@ -60,6 +65,8 @@ export function AccountSwitcherScreen(): JSX.Element { const activeAddress = activeAccount.address const isViewOnly = activeAccount.type === AccountType.Readonly + const isWrappedBannerEnabled = useFeatureFlag(FeatureFlags.UniswapWrapped2025) + const accounts = useSignerAccounts() const accountAddresses = useMemo( () => @@ -154,6 +161,17 @@ export function AccountSwitcherScreen(): JSX.Element { [connectedAccounts.length, dispatch, pendingWallet], ) + const onPressWrappedCard = useCallback(() => { + try { + const url = buildWrappedUrl(UNISWAP_WEB_URL, activeAddress) + window.open(url, '_blank') + dispatch(setHasDismissedUniswapWrapped2025Banner(true)) + navigate(-1) + } catch (error) { + logger.error(error, { tags: { file: 'AccountSwitcherScreen', function: 'onPressWrappedCard' } }) + } + }, [activeAddress, dispatch]) + const addWalletMenuOptions: MenuContentItem[] = [ { label: t('account.wallet.button.create'), @@ -287,6 +305,12 @@ export function AccountSwitcherScreen(): JSX.Element {
+ {isWrappedBannerEnabled && ( + + + + )} + {activeAccountHasUnitag ? ( @@ -355,7 +379,7 @@ export function AccountSwitcherScreen(): JSX.Element { borderColor="$surface3" borderRadius="$rounded16" borderWidth="$spacing1" - disableRemoveScroll={false} + enableRemoveScroll={true} enterStyle={{ y: -10, opacity: 0 }} exitStyle={{ y: -10, opacity: 0 }} p="$none" diff --git a/apps/extension/src/app/features/accounts/__snapshots__/AccountSwitcherScreen.test.tsx.snap b/apps/extension/src/app/features/accounts/__snapshots__/AccountSwitcherScreen.test.tsx.snap index 4541332866b..eed50298533 100644 --- a/apps/extension/src/app/features/accounts/__snapshots__/AccountSwitcherScreen.test.tsx.snap +++ b/apps/extension/src/app/features/accounts/__snapshots__/AccountSwitcherScreen.test.tsx.snap @@ -15,7 +15,7 @@ exports[`AccountSwitcherScreen renders correctly 1`] = `

@@ -25,7 +25,7 @@ exports[`AccountSwitcherScreen renders correctly 1`] = `

@@ -35,7 +35,7 @@ exports[`AccountSwitcherScreen renders correctly 1`] = `

@@ -47,8 +47,10 @@ exports[`AccountSwitcherScreen renders correctly 1`] = ` >
-
-
+
- - - - + + + + + +
@@ -139,6 +148,8 @@ exports[`AccountSwitcherScreen renders correctly 1`] = ` data-testid="account-icon" >
@@ -312,6 +334,45 @@ exports[`AccountSwitcherScreen renders correctly 1`] = ` />
+ + + + + + + + + + + + + + + , "container":
@@ -334,7 +395,7 @@ exports[`AccountSwitcherScreen renders correctly 1`] = `

@@ -344,7 +405,7 @@ exports[`AccountSwitcherScreen renders correctly 1`] = `

@@ -356,8 +417,10 @@ exports[`AccountSwitcherScreen renders correctly 1`] = ` >
-
-
+
- - - - + + + + + +
@@ -448,6 +518,8 @@ exports[`AccountSwitcherScreen renders correctly 1`] = ` data-testid="account-icon" >
diff --git a/apps/extension/src/app/features/biometricUnlock/BiometricUnlockStorage.ts b/apps/extension/src/app/features/biometricUnlock/BiometricUnlockStorage.ts index bd06afb9236..599a36b1c07 100644 --- a/apps/extension/src/app/features/biometricUnlock/BiometricUnlockStorage.ts +++ b/apps/extension/src/app/features/biometricUnlock/BiometricUnlockStorage.ts @@ -4,6 +4,7 @@ import { PersistedStorage } from 'wallet/src/utils/persistedStorage' export type BiometricUnlockStorageData = { credentialId: string + transports: AuthenticatorTransport[] secretPayload: Omit & { ciphertext: string } } diff --git a/apps/extension/src/app/features/biometricUnlock/biometricAuthUtils.ts b/apps/extension/src/app/features/biometricUnlock/biometricAuthUtils.ts index d82aeb49f58..21aa3d19515 100644 --- a/apps/extension/src/app/features/biometricUnlock/biometricAuthUtils.ts +++ b/apps/extension/src/app/features/biometricUnlock/biometricAuthUtils.ts @@ -16,9 +16,11 @@ import { */ export async function authenticateWithBiometricCredential({ credentialId, + transports, abortSignal, }: { credentialId: string + transports: AuthenticatorTransport[] abortSignal: AbortSignal }): Promise<{ publicKeyCredential: PublicKeyCredential; encryptionKey: CryptoKey }> { // Convert stored credential ID back to binary format @@ -31,6 +33,7 @@ export async function authenticateWithBiometricCredential({ { type: 'public-key', id: credentialIdBuffer, + transports, }, ], userVerification: 'required', @@ -70,10 +73,12 @@ export async function encryptPasswordWithBiometricData({ password, encryptionKey, credentialId, + transports, }: { password: string encryptionKey: CryptoKey credentialId: string + transports: AuthenticatorTransport[] }): Promise { // Create a new secret payload for the password const secretPayload = await createEmptySecretPayload() @@ -86,7 +91,7 @@ export async function encryptPasswordWithBiometricData({ additionalData: credentialId, // Use credential ID as additional authenticated data }) - return { credentialId, secretPayload: secretPayloadWithCiphertext } + return { credentialId, transports, secretPayload: secretPayloadWithCiphertext } } /** diff --git a/apps/extension/src/app/features/biometricUnlock/useBiometricUnlockSetupMutation.test.ts b/apps/extension/src/app/features/biometricUnlock/useBiometricUnlockSetupMutation.test.ts index 1b15deca6b5..1eb0c37cb0b 100644 --- a/apps/extension/src/app/features/biometricUnlock/useBiometricUnlockSetupMutation.test.ts +++ b/apps/extension/src/app/features/biometricUnlock/useBiometricUnlockSetupMutation.test.ts @@ -42,7 +42,12 @@ const mockGetEncryptionKeyFromBuffer = jest.requireMock( // Mock PublicKeyCredential (doesn't exist in Jest environment) class MockPublicKeyCredential { - constructor(public rawId: ArrayBuffer) {} + constructor( + public rawId: ArrayBuffer, + public response = { + getTransports: () => ['internal' as AuthenticatorTransport], + }, + ) {} } Object.defineProperty(global, 'PublicKeyCredential', { writable: true, @@ -124,10 +129,12 @@ describe('useBiometricUnlockSetupMutation', () => { // Verify the stored secret payload has all required properties const storedData = mockBiometricUnlockStorage.set.mock.calls[0]![0] as { credentialId: string + transports: AuthenticatorTransport[] secretPayload: typeof mockSecretPayload } expect(storedData.credentialId).toBe(expectedCredentialId) + expect(storedData.transports).toEqual(['internal']) expect(storedData.secretPayload).toEqual( expect.objectContaining({ diff --git a/apps/extension/src/app/features/biometricUnlock/useBiometricUnlockSetupMutation.ts b/apps/extension/src/app/features/biometricUnlock/useBiometricUnlockSetupMutation.ts index 345545a74c8..bd0e4616f51 100644 --- a/apps/extension/src/app/features/biometricUnlock/useBiometricUnlockSetupMutation.ts +++ b/apps/extension/src/app/features/biometricUnlock/useBiometricUnlockSetupMutation.ts @@ -69,7 +69,7 @@ async function createCredentialAndEncryptPassword({ const rawKey = await window.crypto.subtle.exportKey('raw', encryptionKey) - const { credentialId } = await createCredential({ + const { credentialId, transports } = await createCredential({ encryptionKey: rawKey, abortSignal, }) @@ -78,6 +78,7 @@ async function createCredentialAndEncryptPassword({ password, encryptionKey, credentialId, + transports, }) } @@ -116,7 +117,7 @@ async function createCredential({ }: { encryptionKey: ArrayBuffer abortSignal: AbortSignal -}): Promise<{ credentialId: string }> { +}): Promise<{ credentialId: string; transports: AuthenticatorTransport[] }> { // Create WebAuthn credential with platform authenticator (Touch ID, Windows Hello, etc.) forced const credential = await navigator.credentials.create({ publicKey: { @@ -149,5 +150,8 @@ async function createCredential({ // Convert raw ID to a storable string format const credentialId = btoa(String.fromCharCode(...new Uint8Array(publicKeyCredential.rawId))) - return { credentialId } + const response = publicKeyCredential.response as AuthenticatorAttestationResponse + const transports = response.getTransports() as AuthenticatorTransport[] + + return { credentialId, transports } } diff --git a/apps/extension/src/app/features/biometricUnlock/useChangePasswordWithBiometricMutation.test.ts b/apps/extension/src/app/features/biometricUnlock/useChangePasswordWithBiometricMutation.test.ts index fd312c48e6a..c8f23d90136 100644 --- a/apps/extension/src/app/features/biometricUnlock/useChangePasswordWithBiometricMutation.test.ts +++ b/apps/extension/src/app/features/biometricUnlock/useChangePasswordWithBiometricMutation.test.ts @@ -108,6 +108,7 @@ describe('useChangePasswordWithBiometricMutation', () => { // Setup default mocks mockBiometricUnlockStorage.get.mockResolvedValue({ credentialId: mockCredentialId, + transports: ['internal'], secretPayload: mockOldEncryptedPayload, }) @@ -146,6 +147,7 @@ describe('useChangePasswordWithBiometricMutation', () => { { type: 'public-key', id: credentialIdBuffer, + transports: ['internal'], }, ], userVerification: 'required', @@ -160,6 +162,7 @@ describe('useChangePasswordWithBiometricMutation', () => { // 4. Should update the stored biometric data with re-encrypted password expect(mockBiometricUnlockStorage.set).toHaveBeenCalledWith({ credentialId: mockCredentialId, + transports: ['internal'], secretPayload: expect.objectContaining({ ciphertext: expect.any(String), iv: expect.any(String), @@ -189,6 +192,7 @@ describe('useChangePasswordWithBiometricMutation', () => { const newBiometricData = setCall?.[0] expect(newBiometricData?.credentialId).toBe(mockCredentialId) + expect(newBiometricData?.transports).toEqual(['internal']) expect(newBiometricData?.secretPayload).toMatchObject({ ciphertext: expect.any(String), iv: expect.any(String), diff --git a/apps/extension/src/app/features/biometricUnlock/useChangePasswordWithBiometricMutation.ts b/apps/extension/src/app/features/biometricUnlock/useChangePasswordWithBiometricMutation.ts index 8da478fe45c..11361bdf03f 100644 --- a/apps/extension/src/app/features/biometricUnlock/useChangePasswordWithBiometricMutation.ts +++ b/apps/extension/src/app/features/biometricUnlock/useChangePasswordWithBiometricMutation.ts @@ -25,6 +25,7 @@ export function useChangePasswordWithBiometricMutation(options?: { // Authenticate with WebAuthn to get the encryption key const { encryptionKey } = await authenticateWithBiometricCredential({ credentialId: biometricUnlockCredential.credentialId, + transports: biometricUnlockCredential.transports, abortSignal, }) @@ -36,6 +37,7 @@ export function useChangePasswordWithBiometricMutation(options?: { password: newPassword, encryptionKey, credentialId: biometricUnlockCredential.credentialId, + transports: biometricUnlockCredential.transports, }) // Update the stored biometric data diff --git a/apps/extension/src/app/features/biometricUnlock/useUnlockWithBiometricCredentialMutation.test.ts b/apps/extension/src/app/features/biometricUnlock/useUnlockWithBiometricCredentialMutation.test.ts index 832e727c382..5685ba37f1a 100644 --- a/apps/extension/src/app/features/biometricUnlock/useUnlockWithBiometricCredentialMutation.test.ts +++ b/apps/extension/src/app/features/biometricUnlock/useUnlockWithBiometricCredentialMutation.test.ts @@ -3,15 +3,13 @@ import { waitFor } from '@testing-library/react' import { BiometricUnlockStorage } from 'src/app/features/biometricUnlock/BiometricUnlockStorage' import { useUnlockWithBiometricCredentialMutation } from 'src/app/features/biometricUnlock/useUnlockWithBiometricCredentialMutation' import { renderHookWithProviders } from 'src/test/render' -import { authActions } from 'wallet/src/features/auth/saga' -import { AuthActionType } from 'wallet/src/features/auth/types' import { encodeForStorage, encrypt, generateNew256BitRandomBuffer } from 'wallet/src/features/wallet/Keyring/crypto' jest.mock('src/app/features/biometricUnlock/BiometricUnlockStorage') -jest.mock('wallet/src/features/auth/saga', () => ({ - authActions: { - trigger: jest.fn(), - }, + +const mockUnlockWithPassword = jest.fn() +jest.mock('src/app/features/lockScreen/useUnlockWithPassword', () => ({ + useUnlockWithPassword: jest.fn(() => mockUnlockWithPassword), })) // Mock the Web Crypto API with Node.js built-in @@ -27,7 +25,6 @@ Object.defineProperty(navigator, 'credentials', { }) const mockBiometricUnlockStorage = BiometricUnlockStorage as jest.Mocked -const mockAuthActions = authActions as jest.Mocked // Mock AuthenticatorAssertionResponse class MockAuthenticatorAssertionResponse { @@ -100,6 +97,7 @@ describe('useUnlockWithBiometricCredentialMutation', () => { // Setup default mocks mockBiometricUnlockStorage.get.mockResolvedValue({ credentialId: mockCredentialId, + transports: ['internal'], secretPayload: mockEncryptedPayload, }) @@ -107,15 +105,9 @@ describe('useUnlockWithBiometricCredentialMutation', () => { const mockPublicKeyCredential = new MockPublicKeyCredential(mockAuthResponse) mockCredentialsGet.mockResolvedValue(mockPublicKeyCredential) - mockAuthActions.trigger.mockReturnValue({ - type: 'AUTH_TRIGGER', - payload: { - type: AuthActionType.Unlock, - password: mockPassword, - }, - }) - - jest.clearAllMocks() + // Reset and configure mockUnlockWithPassword + mockUnlockWithPassword.mockReset() + mockUnlockWithPassword.mockResolvedValue(undefined) }) describe('successful unlock', () => { @@ -140,6 +132,7 @@ describe('useUnlockWithBiometricCredentialMutation', () => { { type: 'public-key', id: credentialIdBuffer, + transports: ['internal'], }, ], userVerification: 'required', @@ -148,11 +141,8 @@ describe('useUnlockWithBiometricCredentialMutation', () => { signal: expect.any(AbortSignal), }) - // 3. Should dispatch unlock action with the decrypted password - expect(mockAuthActions.trigger).toHaveBeenCalledWith({ - type: AuthActionType.Unlock, - password: mockPassword, - }) + // 3. Should call unlockWithPassword with the decrypted password + expect(mockUnlockWithPassword).toHaveBeenCalledWith({ password: mockPassword }) }) }) @@ -170,7 +160,7 @@ describe('useUnlockWithBiometricCredentialMutation', () => { expect(result.current.error?.message).toBe('No biometric unlock credential found') expect(mockCredentialsGet).not.toHaveBeenCalled() - expect(mockAuthActions.trigger).not.toHaveBeenCalled() + expect(mockUnlockWithPassword).not.toHaveBeenCalled() }) it('should throw error when biometric authentication fails', async () => { @@ -185,7 +175,7 @@ describe('useUnlockWithBiometricCredentialMutation', () => { }) expect(result.current.error?.message).toBe('Failed to create credential') - expect(mockAuthActions.trigger).not.toHaveBeenCalled() + expect(mockUnlockWithPassword).not.toHaveBeenCalled() }) it('should throw error when no user handle returned from authentication', async () => { @@ -202,7 +192,7 @@ describe('useUnlockWithBiometricCredentialMutation', () => { }) expect(result.current.error?.message).toBe('No user handle returned from biometric authentication') - expect(mockAuthActions.trigger).not.toHaveBeenCalled() + expect(mockUnlockWithPassword).not.toHaveBeenCalled() }) it('should throw error when password decryption fails', async () => { @@ -226,7 +216,7 @@ describe('useUnlockWithBiometricCredentialMutation', () => { }) expect(result.current.error?.message).toBe('Failed to decrypt password') - expect(mockAuthActions.trigger).not.toHaveBeenCalled() + expect(mockUnlockWithPassword).not.toHaveBeenCalled() }) it('should handle WebAuthn API errors', async () => { @@ -242,7 +232,7 @@ describe('useUnlockWithBiometricCredentialMutation', () => { }) expect(result.current.error).toBe(webAuthnError) - expect(mockAuthActions.trigger).not.toHaveBeenCalled() + expect(mockUnlockWithPassword).not.toHaveBeenCalled() }) it('should handle storage retrieval errors', async () => { @@ -259,7 +249,7 @@ describe('useUnlockWithBiometricCredentialMutation', () => { expect(result.current.error).toBe(storageError) expect(mockCredentialsGet).not.toHaveBeenCalled() - expect(mockAuthActions.trigger).not.toHaveBeenCalled() + expect(mockUnlockWithPassword).not.toHaveBeenCalled() }) }) diff --git a/apps/extension/src/app/features/biometricUnlock/useUnlockWithBiometricCredentialMutation.ts b/apps/extension/src/app/features/biometricUnlock/useUnlockWithBiometricCredentialMutation.ts index 4eac011d28f..b37d3357cb1 100644 --- a/apps/extension/src/app/features/biometricUnlock/useUnlockWithBiometricCredentialMutation.ts +++ b/apps/extension/src/app/features/biometricUnlock/useUnlockWithBiometricCredentialMutation.ts @@ -58,10 +58,10 @@ async function getPasswordFromBiometricCredential(abortSignal: AbortSignal): Pro throw new Error('No biometric unlock credential found') } - const { credentialId } = biometricUnlockCredential + const { credentialId, transports } = biometricUnlockCredential // Authenticate with WebAuthn using the stored credential and decrypt password - const { encryptionKey } = await authenticateWithBiometricCredential({ credentialId, abortSignal }) + const { encryptionKey } = await authenticateWithBiometricCredential({ credentialId, transports, abortSignal }) const password = await decryptPasswordFromBiometricData({ encryptionKey, biometricUnlockCredential }) return password } diff --git a/apps/extension/src/app/features/dappRequests/DappRequestContent.tsx b/apps/extension/src/app/features/dappRequests/DappRequestContent.tsx index b150cd8ff4a..06a1106bf53 100644 --- a/apps/extension/src/app/features/dappRequests/DappRequestContent.tsx +++ b/apps/extension/src/app/features/dappRequests/DappRequestContent.tsx @@ -7,26 +7,8 @@ import { useDappRequestQueueContext } from 'src/app/features/dappRequests/DappRe import { handleExternallySubmittedUniswapXOrder } from 'src/app/features/dappRequests/handleUniswapX' import { useIsDappRequestConfirming } from 'src/app/features/dappRequests/hooks' import { DappRequestStoreItem } from 'src/app/features/dappRequests/shared' -import { - DappRequest, - isBatchedSwapRequest, - isConnectionRequest, -} from 'src/app/features/dappRequests/types/DappRequestTypes' -import { - Anchor, - AnimatePresence, - Button, - Flex, - GetThemeValueForKey, - styled, - Text, - UniversalImage, - UniversalImageResizeMode, -} from 'ui/src' -import { Verified } from 'ui/src/components/icons' -import { borderRadii, iconSizes } from 'ui/src/theme' -import { DappIconPlaceholder } from 'uniswap/src/components/dapps/DappIconPlaceholder' -import { UNISWAP_WEB_HOSTNAME } from 'uniswap/src/constants/urls' +import { DappRequest, isBatchedSwapRequest } from 'src/app/features/dappRequests/types/DappRequestTypes' +import { AnimatePresence, Button, Flex, GetThemeValueForKey, styled, Text } from 'ui/src' import { useEnabledChains } from 'uniswap/src/features/chains/hooks/useEnabledChains' import { UniverseChainId } from 'uniswap/src/features/chains/types' import { DappRequestType } from 'uniswap/src/features/dappRequests/types' @@ -35,18 +17,20 @@ import { hasSufficientFundsIncludingGas } from 'uniswap/src/features/gas/utils' import { useOnChainNativeCurrencyBalance } from 'uniswap/src/features/portfolio/api' import { TransactionTypeInfo } from 'uniswap/src/features/transactions/types/transactionDetails' import { extractNameFromUrl } from 'utilities/src/format/extractNameFromUrl' -import { formatDappURL } from 'utilities/src/format/urls' import { logger } from 'utilities/src/logger/logger' import { useEvent } from 'utilities/src/react/hooks' import { useThrottledCallback } from 'utilities/src/react/useThrottledCallback' import { MAX_HIDDEN_CALLS_BY_DEFAULT } from 'wallet/src/components/BatchedTransactions/BatchedTransactionDetails' +import { DappRequestHeader } from 'wallet/src/components/dappRequests/DappRequestHeader' import { WarningBox } from 'wallet/src/components/WarningBox/WarningBox' +import { DappVerificationStatus } from 'wallet/src/features/dappRequests/types' import { AddressFooter } from 'wallet/src/features/transactions/TransactionRequest/AddressFooter' import { NetworkFeeFooter } from 'wallet/src/features/transactions/TransactionRequest/NetworkFeeFooter' import { useActiveAccountWithThrow } from 'wallet/src/features/wallet/hooks' interface DappRequestHeaderProps { title: string + verificationStatus?: DappVerificationStatus headerIcon?: JSX.Element } @@ -57,9 +41,9 @@ interface DappRequestFooterProps { maybeCloseOnConfirm?: boolean onCancel?: (requestToConfirm?: DappRequestStoreItem, transactionTypeInfo?: TransactionTypeInfo) => void onConfirm?: (requestToCancel?: DappRequestStoreItem) => void - showAllNetworks?: boolean showNetworkCost?: boolean showSmartWalletActivation?: boolean + showAddressFooter?: boolean transactionGasFeeResult?: GasFeeResult isUniswapX?: boolean disableConfirm?: boolean @@ -96,26 +80,39 @@ export const AnimatedPane = styled(Flex, { export function DappRequestContent({ chainId, title, + verificationStatus, headerIcon, confirmText, connectedAccountAddress, maybeCloseOnConfirm, onCancel, onConfirm, - showAllNetworks, showNetworkCost, showSmartWalletActivation, transactionGasFeeResult, children, isUniswapX, disableConfirm, + showAddressFooter = true, contentHorizontalPadding = '$spacing12', }: PropsWithChildren): JSX.Element { - const { forwards, currentIndex } = useDappRequestQueueContext() + const { forwards, currentIndex, dappIconUrl, dappUrl } = useDappRequestQueueContext() + const hostname = extractNameFromUrl(dappUrl).toUpperCase() return ( <> - + + + {children} @@ -127,9 +124,9 @@ export function DappRequestContent({ connectedAccountAddress={connectedAccountAddress} isUniswapX={isUniswapX} maybeCloseOnConfirm={maybeCloseOnConfirm} - showAllNetworks={showAllNetworks} showNetworkCost={showNetworkCost} showSmartWalletActivation={showSmartWalletActivation} + showAddressFooter={showAddressFooter} transactionGasFeeResult={transactionGasFeeResult} disableConfirm={disableConfirm} onCancel={onCancel} @@ -139,48 +136,6 @@ export function DappRequestContent({ ) } -function DappRequestHeader({ headerIcon, title }: DappRequestHeaderProps): JSX.Element { - const { dappIconUrl, dappUrl, request } = useDappRequestQueueContext() - const hostname = extractNameFromUrl(dappUrl).toUpperCase() - const fallbackIcon = - const showVerified = - request && isConnectionRequest(request.dappRequest) && formatDappURL(dappUrl) === UNISWAP_WEB_HOSTNAME - - return ( - - - - {headerIcon || ( - - )} - - - - {title} - - - - - {formatDappURL(dappUrl)} - - {showVerified && } - - - - ) -} - const WINDOW_CLOSE_DELAY = 10 function DappRequestFooter({ @@ -192,6 +147,7 @@ function DappRequestFooter({ onConfirm, showNetworkCost, showSmartWalletActivation, + showAddressFooter, transactionGasFeeResult, isUniswapX, disableConfirm, @@ -275,7 +231,7 @@ function DappRequestFooter({ return ( <> - + {!hasSufficientGas && ( @@ -295,13 +251,15 @@ function DappRequestFooter({ showSmartWalletActivation={showSmartWalletActivation} /> )} - + {showAddressFooter && ( + + )} - + diff --git a/apps/extension/src/app/features/dappRequests/hooks/usePrepareAndSignSendCallsTransaction.ts b/apps/extension/src/app/features/dappRequests/hooks/usePrepareAndSignSendCallsTransaction.ts index c7cbb49bece..0ff33a6c29e 100644 --- a/apps/extension/src/app/features/dappRequests/hooks/usePrepareAndSignSendCallsTransaction.ts +++ b/apps/extension/src/app/features/dappRequests/hooks/usePrepareAndSignSendCallsTransaction.ts @@ -58,6 +58,7 @@ export function usePrepareAndSignSendCallsTransaction({ }) : [], smartContractDelegationAddress: UNISWAP_DELEGATION_ADDRESS, + // @ts-expect-error - TODO: no longer available in API types, verify if still needed walletAddress: account.address, }, }) diff --git a/apps/extension/src/app/features/dappRequests/requestContent/Connection/ConnectionRequestContent.tsx b/apps/extension/src/app/features/dappRequests/requestContent/Connection/ConnectionRequestContent.tsx index be130ca36d9..424e65d7324 100644 --- a/apps/extension/src/app/features/dappRequests/requestContent/Connection/ConnectionRequestContent.tsx +++ b/apps/extension/src/app/features/dappRequests/requestContent/Connection/ConnectionRequestContent.tsx @@ -1,27 +1,35 @@ import { useTranslation } from 'react-i18next' import { DappRequestContent } from 'src/app/features/dappRequests/DappRequestContent' -import { Flex, Text } from 'ui/src' +import { useDappRequestQueueContext } from 'src/app/features/dappRequests/DappRequestQueueContext' +import { AccountType } from 'uniswap/src/features/accounts/types' +import { DappConnectionContent } from 'wallet/src/components/dappRequests/DappConnectionContent' +import { useBlockaidVerification } from 'wallet/src/features/dappRequests/hooks/useBlockaidVerification' +import { useDappConnectionConfirmation } from 'wallet/src/features/dappRequests/hooks/useDappConnectionConfirmation' export function ConnectionRequestContent(): JSX.Element { const { t } = useTranslation() + const { currentAccount, dappUrl } = useDappRequestQueueContext() + const { verificationStatus } = useBlockaidVerification(dappUrl) + + const isViewOnly = currentAccount.type === AccountType.Readonly + const { confirmedWarning, setConfirmedWarning, disableConfirm } = useDappConnectionConfirmation({ + verificationStatus, + isViewOnly, + }) return ( - - - {t('dapp.request.connect.helptext')} - - + ) } diff --git a/apps/extension/src/app/features/dappRequests/requestContent/EthSend/EthSend.tsx b/apps/extension/src/app/features/dappRequests/requestContent/EthSend/EthSend.tsx index 7131e97a7f6..2c36e8b0657 100644 --- a/apps/extension/src/app/features/dappRequests/requestContent/EthSend/EthSend.tsx +++ b/apps/extension/src/app/features/dappRequests/requestContent/EthSend/EthSend.tsx @@ -1,3 +1,4 @@ +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import { useCallback } from 'react' import { useDappLastChainId } from 'src/app/features/dapp/hooks' import { useDappRequestQueueContext } from 'src/app/features/dappRequests/DappRequestQueueContext' @@ -5,6 +6,7 @@ import { usePrepareAndSignEthSendTransaction } from 'src/app/features/dappReques import { ApproveRequestContent } from 'src/app/features/dappRequests/requestContent/EthSend/Approve/ApproveRequestContent' import { FallbackEthSendRequestContent } from 'src/app/features/dappRequests/requestContent/EthSend/FallbackEthSend/FallbackEthSend' import { LPRequestContent } from 'src/app/features/dappRequests/requestContent/EthSend/LP/LPRequestContent' +import { ParsedTransactionRequestContent } from 'src/app/features/dappRequests/requestContent/EthSend/ParsedTransaction/ParsedTransactionRequestContent' import { Permit2ApproveRequestContent } from 'src/app/features/dappRequests/requestContent/EthSend/Permit2Approve/Permit2ApproveRequestContent' import { SwapRequestContent } from 'src/app/features/dappRequests/requestContent/EthSend/Swap/SwapRequestContent' import { WrapRequestContent } from 'src/app/features/dappRequests/requestContent/EthSend/Wrap/WrapRequestContent' @@ -15,7 +17,9 @@ import { isPermit2ApproveRequest, isSwapRequest, isWrapRequest, + SendTransactionRequest, } from 'src/app/features/dappRequests/types/DappRequestTypes' +import { GasFeeResult } from 'uniswap/src/features/gas/types' import { TransactionTypeInfo } from 'uniswap/src/features/transactions/types/transactionDetails' import { logger } from 'utilities/src/logger/logger' import { ErrorBoundary } from 'wallet/src/components/ErrorBoundary/ErrorBoundary' @@ -28,6 +32,7 @@ export function EthSendRequestContent({ request }: EthSendRequestContentProps): const { dappRequest } = request const { dappUrl, currentAccount, onConfirm, onCancel } = useDappRequestQueueContext() const chainId = useDappLastChainId(dappUrl) + const blockaidTransactionScanning = useFeatureFlag(FeatureFlags.BlockaidTransactionScanning) const { gasFeeResult: transactionGasFeeResult, @@ -54,91 +59,147 @@ export function EthSendRequestContent({ request }: EthSendRequestContentProps): await onCancel(requestWithGasValues) }, [onCancel, requestWithGasValues]) - let content + // If Blockaid transaction scanning is enabled, try to use it for ALL transaction types + // If the API fails, the ErrorBoundary will catch it and fallback to specialized UIs + if (blockaidTransactionScanning) { + return ( + + } + onError={(error) => { + if (error) { + logger.error(error, { + tags: { file: 'EthSend', function: 'ErrorBoundary-Blockaid' }, + extra: { + dappRequest, + useSimulationResultUI: true, + }, + }) + } + }} + > + + + ) + } + + // If feature flag is disabled, use specialized UIs + const content = ( + + ) + + return ( + + } + onError={(error) => { + if (error) { + logger.error(error, { + tags: { file: 'EthSend', function: 'ErrorBoundary-Specialized' }, + extra: { + dappRequest, + useSimulationResultUI: false, + }, + }) + } + }} + > + {content} + + ) +} + +/** + * Fallback component that renders the appropriate specialized UI based on transaction type + * Used when simulation result UI is disabled or fails + */ +function SpecializedTransactionFallback({ + dappRequest, + transactionGasFeeResult, + onCancel, + onConfirm, +}: { + dappRequest: SendTransactionRequest + transactionGasFeeResult: GasFeeResult + onCancel: () => Promise + onConfirm: (transactionTypeInfo?: TransactionTypeInfo) => Promise +}): JSX.Element { switch (true) { case isSwapRequest(dappRequest): - content = ( + return ( ) - break case isPermit2ApproveRequest(dappRequest): - content = ( + return ( ) - break case isWrapRequest(dappRequest): - content = ( + return ( ) - break case isLPRequest(dappRequest): - content = ( + return ( ) - break case isApproveRequest(dappRequest): - content = ( + return ( ) - break default: - content = ( + return ( ) } - - return ( - - } - onError={(error) => { - if (error) { - logger.error(error, { - tags: { file: 'EthSend', function: 'ErrorBoundary' }, - extra: { - dappRequest, - }, - }) - } - }} - > - {content} - - ) } diff --git a/apps/extension/src/app/features/dappRequests/requestContent/EthSend/ParsedTransaction/ParsedTransactionRequestContent.tsx b/apps/extension/src/app/features/dappRequests/requestContent/EthSend/ParsedTransaction/ParsedTransactionRequestContent.tsx new file mode 100644 index 00000000000..ac63e20279a --- /dev/null +++ b/apps/extension/src/app/features/dappRequests/requestContent/EthSend/ParsedTransaction/ParsedTransactionRequestContent.tsx @@ -0,0 +1,74 @@ +import { useState } from 'react' +import { useTranslation } from 'react-i18next' +import { useDappLastChainId } from 'src/app/features/dapp/hooks' +import { DappRequestContent } from 'src/app/features/dappRequests/DappRequestContent' +import { useDappRequestQueueContext } from 'src/app/features/dappRequests/DappRequestQueueContext' +import { SendTransactionRequest } from 'src/app/features/dappRequests/types/DappRequestTypes' +import { GasFeeResult } from 'uniswap/src/features/gas/types' +import { useBooleanState } from 'utilities/src/react/useBooleanState' +import { DappTransactionScanningContent } from 'wallet/src/components/dappRequests/DappTransactionScanningContent' +import { TransactionRiskLevel } from 'wallet/src/features/dappRequests/types' +import { shouldDisableConfirm } from 'wallet/src/features/dappRequests/utils/riskUtils' + +interface ParsedTransactionRequestContentProps { + transactionGasFeeResult: GasFeeResult + dappRequest: SendTransactionRequest + onCancel: () => Promise + onConfirm: () => Promise +} + +/** + * Transaction request content with Blockaid security scanning + * Parses transaction data and displays it with asset transfers, security warnings, and detailed information + */ +export function ParsedTransactionRequestContent({ + dappRequest, + transactionGasFeeResult, + onCancel, + onConfirm, +}: ParsedTransactionRequestContentProps): JSX.Element | null { + const { t } = useTranslation() + const { dappUrl, currentAccount } = useDappRequestQueueContext() + const activeChain = useDappLastChainId(dappUrl) + const { value: confirmedRisk, setValue: setConfirmedRisk } = useBooleanState(false) + // Initialize with null to indicate scan hasn't completed yet + const [riskLevel, setRiskLevel] = useState(null) + + const { chainId: transactionChainId } = dappRequest.transaction + const chainId = transactionChainId ?? activeChain + + // If no valid chainId, throw so that we fall back to the legacy UI + if (!chainId) { + throw new Error('No valid chainId available for transaction scanning') + } + + const disableConfirm = shouldDisableConfirm({ + riskLevel, + confirmedRisk, + hasGasFee: !!transactionGasFeeResult.value, + }) + + return ( + + + + ) +} diff --git a/apps/extension/src/app/features/dappRequests/requestContent/EthSend/Swap/SwapRequestContent.tsx b/apps/extension/src/app/features/dappRequests/requestContent/EthSend/Swap/SwapRequestContent.tsx index 4aec47e93aa..05578f8627c 100644 --- a/apps/extension/src/app/features/dappRequests/requestContent/EthSend/Swap/SwapRequestContent.tsx +++ b/apps/extension/src/app/features/dappRequests/requestContent/EthSend/Swap/SwapRequestContent.tsx @@ -2,7 +2,6 @@ import { useDappLastChainId } from 'src/app/features/dapp/hooks' import { useDappRequestQueueContext } from 'src/app/features/dappRequests/DappRequestQueueContext' import { SwapDisplay } from 'src/app/features/dappRequests/requestContent/EthSend/Swap/SwapDisplay' import { formatUnits, useSwapDetails } from 'src/app/features/dappRequests/requestContent/EthSend/Swap/utils' -import { UniswapXSwapRequest } from 'src/app/features/dappRequests/types/Permit2Types' import { UniversalRouterCall } from 'src/app/features/dappRequests/types/UniversalRouterTypes' import { DEFAULT_NATIVE_ADDRESS, DEFAULT_NATIVE_ADDRESS_LEGACY } from 'uniswap/src/features/chains/evm/defaults' import { useEnabledChains } from 'uniswap/src/features/chains/hooks/useEnabledChains' @@ -13,6 +12,7 @@ import { useCurrencyInfo, useNativeCurrencyInfo } from 'uniswap/src/features/tok import { TransactionType, TransactionTypeInfo } from 'uniswap/src/features/transactions/types/transactionDetails' import { buildCurrencyId } from 'uniswap/src/utils/currencyId' import { assert } from 'utilities/src/errors' +import { UniswapXSwapRequest } from 'wallet/src/components/dappRequests/types/Permit2Types' function getTransactionTypeInfo({ inputCurrencyInfo, diff --git a/apps/extension/src/app/features/dappRequests/requestContent/PersonalSign/PersonalSignRequestContent.tsx b/apps/extension/src/app/features/dappRequests/requestContent/PersonalSign/PersonalSignRequestContent.tsx index 82183fc49fe..fe179239aa6 100644 --- a/apps/extension/src/app/features/dappRequests/requestContent/PersonalSign/PersonalSignRequestContent.tsx +++ b/apps/extension/src/app/features/dappRequests/requestContent/PersonalSign/PersonalSignRequestContent.tsx @@ -1,11 +1,21 @@ import { toUtf8String } from '@ethersproject/strings' +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import { useEffect, useRef, useState } from 'react' import { useTranslation } from 'react-i18next' +import { useDappLastChainId } from 'src/app/features/dapp/hooks' import { DappRequestContent } from 'src/app/features/dappRequests/DappRequestContent' +import { useDappRequestQueueContext } from 'src/app/features/dappRequests/DappRequestQueueContext' import { SignMessageRequest } from 'src/app/features/dappRequests/types/DappRequestTypes' import { Flex, IconButton, Text, Tooltip } from 'ui/src' import { AlertTriangleFilled, Code, StickyNoteTextSquare } from 'ui/src/components/icons' +import { zIndexes } from 'ui/src/theme' +import { EthMethod } from 'uniswap/src/features/dappRequests/types' +import { logger } from 'utilities/src/logger/logger' import { containsNonPrintableChars } from 'utilities/src/primitives/string' +import { useBooleanState } from 'utilities/src/react/useBooleanState' +import { DappPersonalSignContent } from 'wallet/src/components/dappRequests/DappPersonalSignContent' +import { TransactionRiskLevel } from 'wallet/src/features/dappRequests/types' +import { shouldDisableConfirm } from 'wallet/src/features/dappRequests/utils/riskUtils' enum ViewEncoding { UTF8 = 0, @@ -16,26 +26,111 @@ interface PersonalSignRequestProps { } export function PersonalSignRequestContent({ dappRequest }: PersonalSignRequestProps): JSX.Element | null { + const blockaidTransactionScanning = useFeatureFlag(FeatureFlags.BlockaidTransactionScanning) + + // Decode message to UTF-8 + const hexMessage = dappRequest.messageHex + const [utf8Message, setUtf8Message] = useState() + + useEffect(() => { + try { + const decodedMessage = toUtf8String(hexMessage) + setUtf8Message(decodedMessage) + } catch { + // If the message is not valid UTF-8, we'll show the hex message instead + setUtf8Message(undefined) + } + }, [hexMessage]) + + if (blockaidTransactionScanning) { + return + } + + return +} + +/** + * Implementation with Blockaid scanning + */ +function PersonalSignRequestContentWithScanning({ + dappRequest, + utf8Message, +}: { + dappRequest: SignMessageRequest + utf8Message: string | undefined +}): JSX.Element { + const { t } = useTranslation() + const { dappUrl, currentAccount } = useDappRequestQueueContext() + const activeChain = useDappLastChainId(dappUrl) + const { value: confirmedRisk, setValue: setConfirmedRisk } = useBooleanState(false) + // Initialize with null to indicate scan hasn't completed yet + const [riskLevel, setRiskLevel] = useState(null) + + const hexMessage = dappRequest.messageHex + const isDecoded = Boolean(utf8Message && !containsNonPrintableChars(utf8Message)) + const message = (isDecoded ? utf8Message : hexMessage) || hexMessage + const hasLoggedError = useRef(false) + + if (!activeChain) { + if (!hasLoggedError.current) { + logger.error(new Error('No active chain found'), { + tags: { file: 'PersonalSignRequestContent', function: 'PersonalSignRequestContentWithScanning' }, + }) + hasLoggedError.current = true + } + return + } + + const disableConfirm = shouldDisableConfirm({ riskLevel, confirmedRisk }) + + return ( + + + + ) +} + +/** + * Legacy implementation (existing behavior when feature flag is off) + */ +function PersonalSignRequestContentLegacy({ + dappRequest, + utf8Message, +}: { + dappRequest: SignMessageRequest + utf8Message: string | undefined +}): JSX.Element { const { t } = useTranslation() const [viewEncoding, setViewEncoding] = useState(ViewEncoding.UTF8) - const [utf8Message, setUtf8Message] = useState() const toggleViewEncoding = (): void => setViewEncoding(viewEncoding === ViewEncoding.UTF8 ? ViewEncoding.HEX : ViewEncoding.UTF8) const hexMessage = dappRequest.messageHex const containsUnrenderableCharacters = !utf8Message || containsNonPrintableChars(utf8Message) + useEffect(() => { - try { - const decodedMessage = toUtf8String(hexMessage) - setUtf8Message(decodedMessage) - } catch { - // If the message is not valid UTF-8, we'll show the hex message instead (e.g. Polymark claim deposit message ) + if (!utf8Message) { setViewEncoding(ViewEncoding.HEX) - setUtf8Message(undefined) } - }, [hexMessage]) + }, [utf8Message]) const [isScrollable, setIsScrollable] = useState(false) const messageRef = useRef(null) @@ -96,7 +191,7 @@ export function PersonalSignRequestContent({ dappRequest }: PersonalSignRequestP /> - + {viewEncoding === ViewEncoding.UTF8 diff --git a/apps/extension/src/app/features/dappRequests/requestContent/SendCalls/SendCallsRequestContent.tsx b/apps/extension/src/app/features/dappRequests/requestContent/SendCalls/SendCallsRequestContent.tsx index 3245fde4e74..db74d62bf53 100644 --- a/apps/extension/src/app/features/dappRequests/requestContent/SendCalls/SendCallsRequestContent.tsx +++ b/apps/extension/src/app/features/dappRequests/requestContent/SendCalls/SendCallsRequestContent.tsx @@ -1,4 +1,5 @@ -import { useCallback, useMemo } from 'react' +import { FeatureFlags, useFeatureFlag } from '@universe/gating' +import { useCallback, useMemo, useState } from 'react' import { useTranslation } from 'react-i18next' import { useDappLastChainId } from 'src/app/features/dapp/hooks' import { DappRequestContent } from 'src/app/features/dappRequests/DappRequestContent' @@ -12,9 +13,14 @@ import { ParsedCall, SendCallsRequest, } from 'src/app/features/dappRequests/types/DappRequestTypes' +import { UniverseChainId } from 'uniswap/src/features/chains/types' import { GasFeeResult } from 'uniswap/src/features/gas/types' import { TransactionType, TransactionTypeInfo } from 'uniswap/src/features/transactions/types/transactionDetails' +import { useBooleanState } from 'utilities/src/react/useBooleanState' import { BatchedRequestDetailsContent } from 'wallet/src/components/BatchedTransactions/BatchedTransactionDetails' +import { DappSendCallsScanningContent } from 'wallet/src/components/dappRequests/DappSendCallsScanningContent' +import { TransactionRiskLevel } from 'wallet/src/features/dappRequests/types' +import { shouldDisableConfirm } from 'wallet/src/features/dappRequests/utils/riskUtils' interface SendCallsRequestContentProps { dappRequest: SendCallsRequest @@ -24,7 +30,60 @@ interface SendCallsRequestContentProps { onCancel: () => Promise } -function SendCallsRequestContent({ +/** + * Implementation with Blockaid scanning + */ +function SendCallsRequestContentWithScanning({ + dappRequest, + chainId, + transactionGasFeeResult, + showSmartWalletActivation, + onConfirm, + onCancel, +}: SendCallsRequestContentProps & { chainId: UniverseChainId }): JSX.Element { + const { t } = useTranslation() + const { dappUrl, currentAccount } = useDappRequestQueueContext() + const { value: confirmedRisk, setValue: setConfirmedRisk } = useBooleanState(false) + // Initialize with null to indicate scan hasn't completed yet + const [riskLevel, setRiskLevel] = useState(null) + + const disableConfirm = shouldDisableConfirm({ + riskLevel, + confirmedRisk, + hasGasFee: !!transactionGasFeeResult.value, + }) + + return ( + onConfirm()} + showAddressFooter={false} + > + + + ) +} + +/** + * Legacy implementation (existing behavior when feature flag is off) + */ +function SendCallsRequestContentLegacy({ dappRequest, transactionGasFeeResult, showSmartWalletActivation, @@ -56,6 +115,7 @@ function SendCallsRequestContent({ export function SendCallsRequestHandler({ request }: { request: DappRequestStoreItemForSendCallsTxn }): JSX.Element { const { dappUrl, currentAccount, onConfirm, onCancel } = useDappRequestQueueContext() const chainId = useDappLastChainId(dappUrl) ?? request.dappInfo?.lastChainId + const blockaidTransactionScanning = useFeatureFlag(FeatureFlags.BlockaidTransactionScanning) const { dappRequest } = request @@ -92,7 +152,16 @@ export function SendCallsRequestHandler({ request }: { request: DappRequestStore await onCancel(request) }, [onCancel, request]) - return parsedSwapCalldata ? ( + return blockaidTransactionScanning && chainId ? ( + + ) : parsedSwapCalldata ? ( ) : ( - ) } diff --git a/apps/extension/src/app/features/dappRequests/requestContent/SignTypeData/NonStandardTypedDataRequestContent.tsx b/apps/extension/src/app/features/dappRequests/requestContent/SignTypeData/NonStandardTypedDataRequestContent.tsx index 36ae109cf85..37eff930616 100644 --- a/apps/extension/src/app/features/dappRequests/requestContent/SignTypeData/NonStandardTypedDataRequestContent.tsx +++ b/apps/extension/src/app/features/dappRequests/requestContent/SignTypeData/NonStandardTypedDataRequestContent.tsx @@ -2,10 +2,7 @@ import { useState } from 'react' import { useTranslation } from 'react-i18next' import { DappRequestContent } from 'src/app/features/dappRequests/DappRequestContent' import { SignTypedDataRequest } from 'src/app/features/dappRequests/types/DappRequestTypes' -import { Flex, Separator, Text } from 'ui/src' -import { Clear, Signature } from 'ui/src/components/icons' -import { InlineWarningCard } from 'uniswap/src/components/InlineWarningCard/InlineWarningCard' -import { WarningSeverity } from 'uniswap/src/components/modals/WarningModal/types' +import { NonStandardTypedDataContent } from 'wallet/src/components/dappRequests/SignTypedData/NonStandardTypedDataContent' interface NonStandardTypedDataRequestContentProps { dappRequest: SignTypedDataRequest @@ -17,8 +14,6 @@ export function NonStandardTypedDataRequestContent({ const { t } = useTranslation() const [checked, setChecked] = useState(false) - const hasMessageToShow = !!dappRequest.typedData - return ( - - - - - - {t('dapp.request.signature.decodeError')} - - - {hasMessageToShow && } - {hasMessageToShow && ( - - - - - {t('common.message')} - - - - {dappRequest.typedData} - - - )} - - - + ) } diff --git a/apps/extension/src/app/features/dappRequests/requestContent/SignTypeData/Permit2/Permit2RequestContent.tsx b/apps/extension/src/app/features/dappRequests/requestContent/SignTypeData/Permit2/Permit2RequestContent.tsx deleted file mode 100644 index 346fb612654..00000000000 --- a/apps/extension/src/app/features/dappRequests/requestContent/SignTypeData/Permit2/Permit2RequestContent.tsx +++ /dev/null @@ -1,104 +0,0 @@ -import { useState } from 'react' -import { useTranslation } from 'react-i18next' -import { DappRequestContent } from 'src/app/features/dappRequests/DappRequestContent' -import { DomainContent } from 'src/app/features/dappRequests/requestContent/SignTypeData/DomainContent' -import { MaybeExplorerLinkedAddress } from 'src/app/features/dappRequests/requestContent/SignTypeData/MaybeExplorerLinkedAddress' -import { SignTypedDataRequest } from 'src/app/features/dappRequests/types/DappRequestTypes' -import { Flex, Text, TouchableArea } from 'ui/src' -import { RotatableChevron } from 'ui/src/components/icons' -import { toSupportedChainId } from 'uniswap/src/features/chains/utils' -import { ExplorerDataType, getExplorerLink } from 'uniswap/src/utils/linking' - -interface Permit2RequestProps { - dappRequest: SignTypedDataRequest -} - -export function Permit2RequestContent({ dappRequest }: Permit2RequestProps): JSX.Element | null { - const { t } = useTranslation() - - const parsedTypedData = JSON.parse(dappRequest.typedData) - const { name, chainId: domainChainId, verifyingContract } = parsedTypedData?.domain || {} - const chainId = toSupportedChainId(domainChainId) - - const { token: address, amount, expiration, nonce } = parsedTypedData?.message?.details || {} - const { spender, sigDeadline } = parsedTypedData?.message || {} - const [open, setOpen] = useState(false) - const toggleOpen = (): void => setOpen(!open) - - const spenderLink = chainId ? getExplorerLink({ chainId, data: spender, type: ExplorerDataType.ADDRESS }) : undefined - const tokenLink = chainId ? getExplorerLink({ chainId, data: address, type: ExplorerDataType.TOKEN }) : undefined - - return ( - - - - - {t('dapp.request.permit2.description')} - - - - - - {open && ( - <> - - - - token - - - - - - amount - - - {amount} - - - - - expiration - - - {expiration} - - - - - nonce - - - {nonce} - - - - - spender - - - - - - signature deadline - - - {sigDeadline} - - - - )} - - - ) -} diff --git a/apps/extension/src/app/features/dappRequests/saga.ts b/apps/extension/src/app/features/dappRequests/saga.ts index 7a511bca103..1c2a07a605a 100644 --- a/apps/extension/src/app/features/dappRequests/saga.ts +++ b/apps/extension/src/app/features/dappRequests/saga.ts @@ -59,7 +59,7 @@ import { extractBaseUrl } from 'utilities/src/format/urls' import { logger } from 'utilities/src/logger/logger' import { getCallsStatusHelper } from 'wallet/src/features/batchedTransactions/eip5792Utils' import { addBatchedTransaction } from 'wallet/src/features/batchedTransactions/slice' -import { generateBatchId, getCapabilitiesCore } from 'wallet/src/features/batchedTransactions/utils' +import { generateBatchId, getCapabilitiesResponse } from 'wallet/src/features/batchedTransactions/utils' import { Call } from 'wallet/src/features/dappRequests/types' import { ExecuteTransactionParams, @@ -530,7 +530,7 @@ export function* handleGetCapabilities(request: GetCapabilitiesRequest, senderTa const hasSmartWalletConsent = yield* select(selectHasSmartWalletConsent, request.address) const chainIds = request.chainIds?.map(hexadecimalStringToInt) ?? enabledChains.map((chain) => chain.valueOf()) - const response = yield* call(getCapabilitiesCore, { + const response = yield* call(getCapabilitiesResponse, { request, chainIds, hasSmartWalletConsent, diff --git a/apps/extension/src/app/features/dappRequests/types/EthersTypes.ts b/apps/extension/src/app/features/dappRequests/types/EthersTypes.ts index df5e5d1d9dc..37307d7e8af 100644 --- a/apps/extension/src/app/features/dappRequests/types/EthersTypes.ts +++ b/apps/extension/src/app/features/dappRequests/types/EthersTypes.ts @@ -44,7 +44,7 @@ export const EthersTransactionRequestSchema = z.object({ data: BytesLikeSchema.optional(), value: BigNumberishSchema.optional(), chainId: HexadecimalNumberSchema.optional(), - type: z.number().optional(), + type: z.union([z.number(), HexadecimalNumberSchema]).optional(), accessList: AccessListishSchema.optional(), maxPriorityFeePerGas: BigNumberishSchema.optional(), maxFeePerGas: BigNumberishSchema.optional(), diff --git a/apps/extension/src/app/features/home/PortfolioHeader.tsx b/apps/extension/src/app/features/home/PortfolioHeader.tsx index b951fd5c50a..1a13b6b6b9f 100644 --- a/apps/extension/src/app/features/home/PortfolioHeader.tsx +++ b/apps/extension/src/app/features/home/PortfolioHeader.tsx @@ -189,7 +189,7 @@ export const PortfolioHeader = memo(function _PortfolioHeader({ address }: Portf borderColor="$surface2" borderRadius="$rounded20" borderWidth="$spacing1" - disableRemoveScroll={false} + enableRemoveScroll={true} zIndex="$default" {...animationPresets.fadeInDownOutUp} shadowColor="$shadowColor" diff --git a/apps/extension/src/app/features/home/TokenBalanceList.tsx b/apps/extension/src/app/features/home/TokenBalanceList.tsx index b29a53a4a2c..ebbed006847 100644 --- a/apps/extension/src/app/features/home/TokenBalanceList.tsx +++ b/apps/extension/src/app/features/home/TokenBalanceList.tsx @@ -1,9 +1,13 @@ -import { memo } from 'react' +import { Currency } from '@uniswap/sdk-core' +import { memo, useState } from 'react' import { useInterfaceBuyNavigator } from 'src/app/features/for/utils' import { AppRoutes } from 'src/app/navigation/constants' import { navigate } from 'src/app/navigation/state' import { TokenBalanceListWeb } from 'uniswap/src/components/portfolio/TokenBalanceListWeb' +import { ReportTokenIssueModal } from 'uniswap/src/components/reporting/ReportTokenIssueModal' import { ElementName } from 'uniswap/src/features/telemetry/constants' +import { useEvent } from 'utilities/src/react/hooks' +import { useBooleanState } from 'utilities/src/react/useBooleanState' import { usePortfolioEmptyStateBackground } from 'wallet/src/components/portfolio/empty' export const ExtensionTokenBalanceList = memo(function _ExtensionTokenBalanceList({ @@ -15,13 +19,35 @@ export const ExtensionTokenBalanceList = memo(function _ExtensionTokenBalanceLis navigate(`/${AppRoutes.Receive}`) } const onPressBuy = useInterfaceBuyNavigator(ElementName.EmptyStateBuy) + + const { value: isReportTokenModalOpen, setTrue: openModal, setFalse: closeReportTokenModal } = useBooleanState(false) + const [reportTokenCurrency, setReportTokenCurrency] = useState(undefined) + const [isMarkedSpam, setIsMarkedSpam] = useState>(undefined) + + const openReportTokenModal = useEvent((currency: Currency, isMarkedSpam: Maybe) => { + setReportTokenCurrency(currency) + setIsMarkedSpam(isMarkedSpam) + openModal() + }) + const backgroundImageWrapperCallback = usePortfolioEmptyStateBackground() return ( - + <> + + {reportTokenCurrency && ( + + )} + ) }) diff --git a/apps/extension/src/app/features/home/introCards/HomeIntroCardStack.tsx b/apps/extension/src/app/features/home/introCards/HomeIntroCardStack.tsx index 119a661a5d0..45723370f88 100644 --- a/apps/extension/src/app/features/home/introCards/HomeIntroCardStack.tsx +++ b/apps/extension/src/app/features/home/introCards/HomeIntroCardStack.tsx @@ -1,8 +1,10 @@ -import { useCallback } from 'react' +import { useCallback, useState } from 'react' import { AppRoutes, SettingsRoutes, UnitagClaimRoutes } from 'src/app/navigation/constants' import { focusOrCreateUnitagTab, useExtensionNavigation } from 'src/app/navigation/utils' import { Flex } from 'ui/src' +import { MonadAnnouncementModal } from 'uniswap/src/components/notifications/MonadAnnouncementModal' import { AccountType } from 'uniswap/src/features/accounts/types' +import { useEvent } from 'utilities/src/react/hooks' import { IntroCardStack } from 'wallet/src/components/introCards/IntroCardStack' import { useSharedIntroCards } from 'wallet/src/components/introCards/useSharedIntroCards' import { useActiveAccountWithThrow } from 'wallet/src/features/wallet/hooks' @@ -11,6 +13,7 @@ export function HomeIntroCardStack(): JSX.Element | null { const activeAccount = useActiveAccountWithThrow() const isSignerAccount = activeAccount.type === AccountType.SignerMnemonic const { navigateTo } = useExtensionNavigation() + const [isMonadModalOpen, setIsMonadModalOpen] = useState(false) const navigateToUnitagClaim = useCallback(async () => { await focusOrCreateUnitagTab(activeAccount.address, UnitagClaimRoutes.ClaimIntro) @@ -20,10 +23,16 @@ export function HomeIntroCardStack(): JSX.Element | null { navigateTo(`/${AppRoutes.Settings}/${SettingsRoutes.BackupRecoveryPhrase}`) }, [navigateTo]) + const handleMonadExplorePress = useEvent(() => { + window.open('https://app.uniswap.org/explore/tokens/monad', '_blank') + setIsMonadModalOpen(false) + }) + const { cards } = useSharedIntroCards({ navigateToUnitagClaim, navigateToUnitagIntro: navigateToUnitagClaim, // No need to differentiate for extension navigateToBackupFlow, + onMonadAnnouncementPress: () => setIsMonadModalOpen(true), }) // Don't show cards if there are none @@ -33,8 +42,17 @@ export function HomeIntroCardStack(): JSX.Element | null { } return ( - - - + <> + + + + {isMonadModalOpen && ( + setIsMonadModalOpen(false)} + onExplorePress={handleMonadExplorePress} + /> + )} + ) } diff --git a/apps/extension/src/app/features/onboarding/import/ImportMnemonic.tsx b/apps/extension/src/app/features/onboarding/import/ImportMnemonic.tsx index 0378892eb3a..2c89cc0cad8 100644 --- a/apps/extension/src/app/features/onboarding/import/ImportMnemonic.tsx +++ b/apps/extension/src/app/features/onboarding/import/ImportMnemonic.tsx @@ -234,7 +234,9 @@ export function ImportMnemonic(): JSX.Element { (inputRefs[index] = ref)} + ref={(ref) => { + inputRefs[index] = ref + }} handleBlur={handleBlur} handleChange={handleChange} handleKeyPress={handleKeyPress} diff --git a/apps/extension/src/app/features/onboarding/import/SelectWallets.tsx b/apps/extension/src/app/features/onboarding/import/SelectWallets.tsx index 3c8597824a0..3f12f876606 100644 --- a/apps/extension/src/app/features/onboarding/import/SelectWallets.tsx +++ b/apps/extension/src/app/features/onboarding/import/SelectWallets.tsx @@ -8,7 +8,7 @@ import { useOnboardingSteps } from 'src/app/features/onboarding/OnboardingSteps' import { useSubmitOnEnter } from 'src/app/features/onboarding/utils' import { Flex, ScrollView, SpinningLoader, Square, Text, Tooltip, TouchableArea } from 'ui/src' import { WalletFilled } from 'ui/src/components/icons' -import { iconSizes } from 'ui/src/theme' +import { iconSizes, zIndexes } from 'ui/src/theme' import { uniswapUrls } from 'uniswap/src/constants/urls' import Trace from 'uniswap/src/features/telemetry/Trace' import { ExtensionOnboardingFlow, ExtensionOnboardingScreens } from 'uniswap/src/types/screens/extension' @@ -132,7 +132,7 @@ function SmartWalletTooltip(): JSX.Element | undefined { - + diff --git a/apps/extension/src/app/features/onboarding/scan/OTPInput.tsx b/apps/extension/src/app/features/onboarding/scan/OTPInput.tsx index 4075ff3544d..9d3f1093616 100644 --- a/apps/extension/src/app/features/onboarding/scan/OTPInput.tsx +++ b/apps/extension/src/app/features/onboarding/scan/OTPInput.tsx @@ -51,7 +51,7 @@ export function OTPInput(): JSX.Element { const [failedAttemptCount, setFailedAttemptCount] = useState(0) const [characterSequence, setCharacterSequence] = useState(INITIAL_CHARACTER_SEQUENCE) - const inputRefs = useRef[]>([]) + const inputRefs = useRef[]>([]) inputRefs.current = new Array(6).fill(null).map((_, i) => inputRefs.current[i] || createRef()) // Add all accounts from mnemonic. diff --git a/apps/extension/src/app/features/receive/__snapshots__/ReceiveScreen.test.tsx.snap b/apps/extension/src/app/features/receive/__snapshots__/ReceiveScreen.test.tsx.snap index 4fe7b9ea7e4..d178a5ab606 100644 --- a/apps/extension/src/app/features/receive/__snapshots__/ReceiveScreen.test.tsx.snap +++ b/apps/extension/src/app/features/receive/__snapshots__/ReceiveScreen.test.tsx.snap @@ -20,8 +20,10 @@ exports[`ReceiveScreen renders without error 1`] = ` >
- Ethereum address + Wallet address
@@ -6090,6 +6100,19 @@ exports[`ReceiveScreen renders without error 1`] = ` />
+ + + + + , "container":
- Ethereum address + Wallet address
@@ -12236,4 +12269,4 @@ exports[`ReceiveScreen renders without error 1`] = ` }, "unmount": [Function], } -`; +`; \ No newline at end of file diff --git a/apps/extension/src/app/features/send/SendFlow.tsx b/apps/extension/src/app/features/send/SendFlow.tsx index 5136b6f464f..716c9cd81ff 100644 --- a/apps/extension/src/app/features/send/SendFlow.tsx +++ b/apps/extension/src/app/features/send/SendFlow.tsx @@ -6,7 +6,9 @@ import { useExtensionNavigation } from 'src/app/navigation/utils' import { Flex } from 'ui/src' import { X } from 'ui/src/components/icons' import { ModalName } from 'uniswap/src/features/telemetry/constants' +import { TransactionSettingsStoreContextProvider } from 'uniswap/src/features/transactions/components/settings/stores/transactionSettingsStore/TransactionSettingsStoreContextProvider' import { TransactionModal } from 'uniswap/src/features/transactions/components/TransactionModal/TransactionModal' +import { SwapFormStoreContextProvider } from 'uniswap/src/features/transactions/swap/stores/swapFormStore/SwapFormStoreContextProvider' import { SendContextProvider } from 'wallet/src/features/transactions/contexts/SendContext' export function SendFlow(): JSX.Element { @@ -15,16 +17,20 @@ export function SendFlow(): JSX.Element { return ( null}> - - - - - - - - - - + + + + + + + + + + + + + + ) } diff --git a/apps/extension/src/app/features/settings/DeviceAccessScreen.tsx b/apps/extension/src/app/features/settings/DeviceAccessScreen.tsx index c9b6d70c21b..c739b0cbe06 100644 --- a/apps/extension/src/app/features/settings/DeviceAccessScreen.tsx +++ b/apps/extension/src/app/features/settings/DeviceAccessScreen.tsx @@ -48,6 +48,7 @@ export function DeviceAccessScreen(): JSX.Element { const { flowState, + oldPassword, startPasswordReset, closeModal, onPasswordModalNext, @@ -98,6 +99,7 @@ export function DeviceAccessScreen(): JSX.Element { return ( closeModal(PasswordResetFlowState.EnterNewPassword)} /> diff --git a/apps/extension/src/app/features/settings/SettingsDropdown.tsx b/apps/extension/src/app/features/settings/SettingsDropdown.tsx index 8df26d5fe71..bcee8207b0f 100644 --- a/apps/extension/src/app/features/settings/SettingsDropdown.tsx +++ b/apps/extension/src/app/features/settings/SettingsDropdown.tsx @@ -46,7 +46,7 @@ export function SettingsDropdown({ selected, items, disableDropdown, onSelect }: /> - + setIsPortfolioBalanceModalOpen(true)} /> {isSmartWalletEnabled ? ( diff --git a/apps/extension/src/app/features/settings/password/ChangePasswordForm.test.tsx b/apps/extension/src/app/features/settings/password/ChangePasswordForm.test.tsx new file mode 100644 index 00000000000..f4721fb4899 --- /dev/null +++ b/apps/extension/src/app/features/settings/password/ChangePasswordForm.test.tsx @@ -0,0 +1,166 @@ +import { act, fireEvent, waitFor } from '@testing-library/react' +import { ChangePasswordForm } from 'src/app/features/settings/password/ChangePasswordForm' +import { cleanup, render, screen } from 'src/test/test-utils' +import { Keyring } from 'wallet/src/features/wallet/Keyring/Keyring' + +// Mock the Keyring +jest.mock('wallet/src/features/wallet/Keyring/Keyring', () => ({ + Keyring: { + changePassword: jest.fn().mockResolvedValue(undefined), + }, +})) + +// Mock analytics +jest.mock('uniswap/src/features/telemetry/send', () => ({ + sendAnalyticsEvent: jest.fn(), +})) + +const mockChangePassword = Keyring.changePassword as jest.MockedFunction + +describe('ChangePasswordForm', () => { + const mockOnNext = jest.fn() + const oldPassword = 'MyOldPassword123!' + + beforeEach(() => { + jest.clearAllMocks() + mockChangePassword.mockClear() + }) + + afterEach(() => { + cleanup() + }) + + it('renders without error', () => { + const tree = render() + expect(tree).toMatchSnapshot() + }) + + it('renders password input fields', () => { + render() + + // Check for translated placeholders + expect(screen.getByPlaceholderText('New password')).toBeDefined() + expect(screen.getByPlaceholderText('Confirm password')).toBeDefined() + }) + + it('renders continue button', () => { + render() + + expect(screen.getByText('Continue')).toBeDefined() + }) + + it('shows error when new password matches old password', async () => { + render() + + const newPasswordInput = screen.getByPlaceholderText('New password') + const confirmPasswordInput = screen.getByPlaceholderText('Confirm password') + + // Type the same password as the old password + act(() => { + fireEvent.change(newPasswordInput, { target: { value: oldPassword } }) + fireEvent.change(confirmPasswordInput, { target: { value: oldPassword } }) + }) + + // Wait for error to appear + await waitFor(() => { + const errorText = screen.getByText('New password must be different from current password') + expect(errorText).toBeDefined() + }) + }) + + it('clears error when password changes to be different', async () => { + render() + + const newPasswordInput = screen.getByPlaceholderText('New password') + const confirmPasswordInput = screen.getByPlaceholderText('Confirm password') + + // First, type the same password as old password + act(() => { + fireEvent.change(newPasswordInput, { target: { value: oldPassword } }) + fireEvent.change(confirmPasswordInput, { target: { value: oldPassword } }) + }) + + // Wait for error to appear + await waitFor(() => { + expect(screen.getByText('New password must be different from current password')).toBeDefined() + }) + + // Clear and type a different password + act(() => { + fireEvent.change(newPasswordInput, { target: { value: 'DifferentPassword789!' } }) + fireEvent.change(confirmPasswordInput, { target: { value: 'DifferentPassword789!' } }) + }) + + // Error should be cleared + await waitFor(() => { + expect(screen.queryByText('New password must be different from current password')).toBeNull() + }) + }) + + it('does not call onNext when passwords match old password', async () => { + render() + + const newPasswordInput = screen.getByPlaceholderText('New password') + const confirmPasswordInput = screen.getByPlaceholderText('Confirm password') + const submitButton = screen.getByText('Continue') + + // Type the same password as the old password + act(() => { + fireEvent.change(newPasswordInput, { target: { value: oldPassword } }) + fireEvent.change(confirmPasswordInput, { target: { value: oldPassword } }) + }) + + // Try to submit + await act(async () => { + fireEvent.click(submitButton) + }) + + expect(mockOnNext).not.toHaveBeenCalled() + expect(mockChangePassword).not.toHaveBeenCalled() + }) + + it('calls onNext and changePassword when passwords are different and valid', async () => { + render() + + const newPasswordInput = screen.getByPlaceholderText('New password') + const confirmPasswordInput = screen.getByPlaceholderText('Confirm password') + const submitButton = screen.getByText('Continue') + + const newPassword = 'MyNewStrongPassword456!' + + // Type a different password + act(() => { + fireEvent.change(newPasswordInput, { target: { value: newPassword } }) + fireEvent.change(confirmPasswordInput, { target: { value: newPassword } }) + }) + + // Submit the form + await act(async () => { + fireEvent.click(submitButton) + }) + + await waitFor(() => { + expect(mockChangePassword).toHaveBeenCalledWith(newPassword) + expect(mockOnNext).toHaveBeenCalledWith(newPassword) + }) + }) + + it('handles undefined oldPassword gracefully', async () => { + render() + + const newPasswordInput = screen.getByPlaceholderText('New password') + const confirmPasswordInput = screen.getByPlaceholderText('Confirm password') + + const newPassword = 'AnyPassword123!' + + // Type any password - should not show "same password" error since oldPassword is undefined + act(() => { + fireEvent.change(newPasswordInput, { target: { value: newPassword } }) + fireEvent.change(confirmPasswordInput, { target: { value: newPassword } }) + }) + + await waitFor(() => { + expect(screen.queryByText('New password must be different from current password')).toBeNull() + }) + }) +}) diff --git a/apps/extension/src/app/features/settings/password/ChangePasswordForm.tsx b/apps/extension/src/app/features/settings/password/ChangePasswordForm.tsx index c03b41a1cac..d82b56ba129 100644 --- a/apps/extension/src/app/features/settings/password/ChangePasswordForm.tsx +++ b/apps/extension/src/app/features/settings/password/ChangePasswordForm.tsx @@ -1,13 +1,19 @@ -import { useCallback } from 'react' +import { useCallback, useEffect, useMemo, useState } from 'react' import { useTranslation } from 'react-i18next' import { PADDING_STRENGTH_INDICATOR, PasswordInput } from 'src/app/components/PasswordInput' import { Button, Flex, Text } from 'ui/src' import { ExtensionEventName } from 'uniswap/src/features/telemetry/constants' import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send' import { Keyring } from 'wallet/src/features/wallet/Keyring/Keyring' -import { usePasswordForm } from 'wallet/src/utils/password' +import { PasswordErrors, usePasswordForm } from 'wallet/src/utils/password' -export function ChangePasswordForm({ onNext }: { onNext: (password: string) => void }): JSX.Element { +export function ChangePasswordForm({ + oldPassword, + onNext, +}: { + oldPassword: string | undefined + onNext: (password: string) => void +}): JSX.Element { const { t } = useTranslation() const { @@ -20,18 +26,45 @@ export function ChangePasswordForm({ onNext }: { onNext: (password: string) => v confirmPassword, onChangeConfirmPassword, setHideInput, - errorText, + errorText: baseErrorText, checkSubmit, } = usePasswordForm() + const [customError, setCustomError] = useState(undefined) + + // Check if new password is same as old password + const isSamePassword = useMemo( + () => Boolean(password && oldPassword && password === oldPassword), + [password, oldPassword], + ) + + // Update custom error when password matches old password + useEffect(() => { + setCustomError(isSamePassword ? PasswordErrors.SamePassword : undefined) + }, [isSamePassword]) + + // Override error text if custom error exists + const errorText = useMemo(() => { + if (customError === PasswordErrors.SamePassword) { + return t('common.input.password.error.same') + } + return baseErrorText + }, [customError, baseErrorText, t]) + const onSubmit = useCallback(async () => { + // Check for same password error + if (isSamePassword) { + setCustomError(PasswordErrors.SamePassword) + return + } + if (checkSubmit()) { // Just change the password and pass it to the parent await Keyring.changePassword(password) sendAnalyticsEvent(ExtensionEventName.PasswordChanged) onNext(password) } - }, [checkSubmit, password, onNext]) + }, [checkSubmit, password, onNext, isSamePassword]) return ( @@ -70,7 +103,7 @@ export function ChangePasswordForm({ onNext }: { onNext: (password: string) => v - diff --git a/apps/extension/src/app/features/settings/password/CreateNewPasswordModal.tsx b/apps/extension/src/app/features/settings/password/CreateNewPasswordModal.tsx index 65860afaa14..9411c1fa006 100644 --- a/apps/extension/src/app/features/settings/password/CreateNewPasswordModal.tsx +++ b/apps/extension/src/app/features/settings/password/CreateNewPasswordModal.tsx @@ -7,10 +7,12 @@ import { ModalName } from 'uniswap/src/features/telemetry/constants' export function CreateNewPasswordModal({ isOpen, + oldPassword, onNext, onClose, }: { isOpen: boolean + oldPassword: string | undefined onNext: (password: string) => void onClose: () => void }): JSX.Element { @@ -36,7 +38,7 @@ export function CreateNewPasswordModal({ {t('settings.setting.password.change.title')} - + ) diff --git a/apps/extension/src/app/features/settings/password/__snapshots__/ChangePasswordForm.test.tsx.snap b/apps/extension/src/app/features/settings/password/__snapshots__/ChangePasswordForm.test.tsx.snap new file mode 100644 index 00000000000..8dc96964d8e --- /dev/null +++ b/apps/extension/src/app/features/settings/password/__snapshots__/ChangePasswordForm.test.tsx.snap @@ -0,0 +1,287 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`ChangePasswordForm renders without error 1`] = ` +{ + "asFragment": [Function], + "baseElement": +
+ +
+
+
+ + + +
+
+ + + +
+ + + +
+
+ +
+
+ +
+
+
+ +
+ , + "container":
+ +
+
+
+ + + +
+
+ + + +
+ + + +
+
+ +
+
+ +
+
+
+ +
, + "debug": [Function], + "findAllByAltText": [Function], + "findAllByDisplayValue": [Function], + "findAllByLabelText": [Function], + "findAllByPlaceholderText": [Function], + "findAllByRole": [Function], + "findAllByTestId": [Function], + "findAllByText": [Function], + "findAllByTitle": [Function], + "findByAltText": [Function], + "findByDisplayValue": [Function], + "findByLabelText": [Function], + "findByPlaceholderText": [Function], + "findByRole": [Function], + "findByTestId": [Function], + "findByText": [Function], + "findByTitle": [Function], + "getAllByAltText": [Function], + "getAllByDisplayValue": [Function], + "getAllByLabelText": [Function], + "getAllByPlaceholderText": [Function], + "getAllByRole": [Function], + "getAllByTestId": [Function], + "getAllByText": [Function], + "getAllByTitle": [Function], + "getByAltText": [Function], + "getByDisplayValue": [Function], + "getByLabelText": [Function], + "getByPlaceholderText": [Function], + "getByRole": [Function], + "getByTestId": [Function], + "getByText": [Function], + "getByTitle": [Function], + "queryAllByAltText": [Function], + "queryAllByDisplayValue": [Function], + "queryAllByLabelText": [Function], + "queryAllByPlaceholderText": [Function], + "queryAllByRole": [Function], + "queryAllByTestId": [Function], + "queryAllByText": [Function], + "queryAllByTitle": [Function], + "queryByAltText": [Function], + "queryByDisplayValue": [Function], + "queryByLabelText": [Function], + "queryByPlaceholderText": [Function], + "queryByRole": [Function], + "queryByTestId": [Function], + "queryByText": [Function], + "queryByTitle": [Function], + "rerender": [Function], + "store": { + "dispatch": [Function], + "getState": [Function], + "replaceReducer": [Function], + "subscribe": [Function], + Symbol(observable): [Function], + }, + "unmount": [Function], +} +`; diff --git a/apps/extension/src/app/features/settings/password/usePasswordResetFlow.test.ts b/apps/extension/src/app/features/settings/password/usePasswordResetFlow.test.ts index 9ccb4c71a73..3685be9bde1 100644 --- a/apps/extension/src/app/features/settings/password/usePasswordResetFlow.test.ts +++ b/apps/extension/src/app/features/settings/password/usePasswordResetFlow.test.ts @@ -67,6 +67,12 @@ describe('usePasswordResetFlow', () => { expect(result.current.flowState).toBe(PasswordResetFlowState.None) }) + it('should initialize with undefined oldPassword', () => { + const { result } = renderHook(() => usePasswordResetFlow()) + + expect(result.current.oldPassword).toBeUndefined() + }) + it('should transition to EnterCurrentPassword when starting password reset', () => { const { result } = renderHook(() => usePasswordResetFlow()) @@ -91,6 +97,22 @@ describe('usePasswordResetFlow', () => { expect(result.current.flowState).toBe(PasswordResetFlowState.EnterNewPassword) }) + it('should store oldPassword when valid password is provided', () => { + const { result } = renderHook(() => usePasswordResetFlow()) + const testPassword = 'myOldPassword123!' + + act(() => { + result.current.startPasswordReset() + }) + + act(() => { + result.current.onPasswordModalNext(testPassword) + }) + + expect(result.current.oldPassword).toBe(testPassword) + expect(result.current.flowState).toBe(PasswordResetFlowState.EnterNewPassword) + }) + it('should return to None state when no password is provided', () => { const { result } = renderHook(() => usePasswordResetFlow()) @@ -105,6 +127,32 @@ describe('usePasswordResetFlow', () => { expect(result.current.flowState).toBe(PasswordResetFlowState.None) }) + it('should clear oldPassword when no password is provided', () => { + const { result } = renderHook(() => usePasswordResetFlow()) + + act(() => { + result.current.startPasswordReset() + }) + + act(() => { + result.current.onPasswordModalNext('validPassword') + }) + + expect(result.current.oldPassword).toBe('validPassword') + + // Go back and provide no password + act(() => { + result.current.startPasswordReset() + }) + + act(() => { + result.current.onPasswordModalNext() + }) + + expect(result.current.oldPassword).toBeUndefined() + expect(result.current.flowState).toBe(PasswordResetFlowState.None) + }) + it('should transition to BiometricAuth when biometric is enabled', () => { mockUseHasBiometricUnlockCredential.mockReturnValue(true) const { result } = renderHook(() => usePasswordResetFlow()) @@ -160,6 +208,28 @@ describe('usePasswordResetFlow', () => { expect(result.current.flowState).toBe(PasswordResetFlowState.None) }) + it('should clear oldPassword when closeModal is called with matching state', () => { + const { result } = renderHook(() => usePasswordResetFlow()) + + act(() => { + result.current.startPasswordReset() + }) + + act(() => { + result.current.onPasswordModalNext('testPassword123') + }) + + expect(result.current.oldPassword).toBe('testPassword123') + expect(result.current.flowState).toBe(PasswordResetFlowState.EnterNewPassword) + + act(() => { + result.current.closeModal(PasswordResetFlowState.EnterNewPassword) + }) + + expect(result.current.flowState).toBe(PasswordResetFlowState.None) + expect(result.current.oldPassword).toBeUndefined() + }) + it('should not close modal when closeModal is called with non-matching state', () => { const { result } = renderHook(() => usePasswordResetFlow()) @@ -176,6 +246,29 @@ describe('usePasswordResetFlow', () => { expect(result.current.flowState).toBe(PasswordResetFlowState.EnterCurrentPassword) }) + it('should not clear oldPassword when closeModal is called with non-matching state', () => { + const { result } = renderHook(() => usePasswordResetFlow()) + + act(() => { + result.current.startPasswordReset() + }) + + act(() => { + result.current.onPasswordModalNext('testPassword456') + }) + + expect(result.current.oldPassword).toBe('testPassword456') + expect(result.current.flowState).toBe(PasswordResetFlowState.EnterNewPassword) + + act(() => { + result.current.closeModal(PasswordResetFlowState.BiometricAuth) + }) + + // Should not clear oldPassword or change state + expect(result.current.flowState).toBe(PasswordResetFlowState.EnterNewPassword) + expect(result.current.oldPassword).toBe('testPassword456') + }) + it('should transition to BiometricAuth state when biometric is enabled and trigger internal mutation', () => { mockUseHasBiometricUnlockCredential.mockReturnValue(true) const { result } = renderHook(() => usePasswordResetFlow()) diff --git a/apps/extension/src/app/features/settings/password/usePasswordResetFlow.ts b/apps/extension/src/app/features/settings/password/usePasswordResetFlow.ts index 48e02692ef5..9c2b61b4eda 100644 --- a/apps/extension/src/app/features/settings/password/usePasswordResetFlow.ts +++ b/apps/extension/src/app/features/settings/password/usePasswordResetFlow.ts @@ -54,6 +54,7 @@ export enum PasswordResetFlowState { interface PasswordResetFlowResult { // State flowState: PasswordResetFlowState + oldPassword: string | undefined // Actions startPasswordReset: () => void @@ -68,6 +69,7 @@ interface PasswordResetFlowResult { export function usePasswordResetFlow(): PasswordResetFlowResult { const dispatch = useDispatch() const [flowState, setFlowState] = useState(PasswordResetFlowState.None) + const [oldPassword, setOldPassword] = useState(undefined) const hasBiometricUnlockCredential = useHasBiometricUnlockCredential() @@ -95,15 +97,18 @@ export function usePasswordResetFlow(): PasswordResetFlowResult { // This check ensures the close action is from user interaction, not from modal state changes. if (flowState === expectedState) { setFlowState(PasswordResetFlowState.None) + setOldPassword(undefined) } }) const onPasswordModalNext = useEvent((password?: string): void => { if (!password) { setFlowState(PasswordResetFlowState.None) + setOldPassword(undefined) return } + setOldPassword(password) setFlowState(PasswordResetFlowState.EnterNewPassword) }) @@ -127,6 +132,7 @@ export function usePasswordResetFlow(): PasswordResetFlowResult { return { // State flowState, + oldPassword, // Actions startPasswordReset, diff --git a/apps/extension/src/app/navigation/navigation.tsx b/apps/extension/src/app/navigation/navigation.tsx index 7c0848212a5..a9934d18846 100644 --- a/apps/extension/src/app/navigation/navigation.tsx +++ b/apps/extension/src/app/navigation/navigation.tsx @@ -202,7 +202,7 @@ const AnimatedPane = styled(Flex, { const isVertical = (dir: Direction): boolean => dir === 'up' || dir === 'down' function useConstant(c: A): A { - const out = useRef() + const out = useRef(undefined) if (!out.current) { out.current = c } diff --git a/apps/extension/src/app/saga.ts b/apps/extension/src/app/saga.ts index a5e6ddbf951..e4c17a340bd 100644 --- a/apps/extension/src/app/saga.ts +++ b/apps/extension/src/app/saga.ts @@ -28,13 +28,6 @@ import { prepareAndSignSwapSaga, prepareAndSignSwapSagaName, } from 'wallet/src/features/transactions/swap/configuredSagas' -import { swapActions, swapReducer, swapSaga, swapSagaName } from 'wallet/src/features/transactions/swap/swapSaga' -import { - tokenWrapActions, - tokenWrapReducer, - tokenWrapSaga, - tokenWrapSagaName, -} from 'wallet/src/features/transactions/swap/wrapSaga' import { watchTransactionEvents } from 'wallet/src/features/transactions/watcher/transactionFinalizationSaga' import { transactionWatcher } from 'wallet/src/features/transactions/watcher/transactionWatcherSaga' import { @@ -83,18 +76,6 @@ export const monitoredSagas: Record = { reducer: executeSwapReducer, actions: executeSwapActions, }, - [swapSagaName]: { - name: swapSagaName, - wrappedSaga: swapSaga, - reducer: swapReducer, - actions: swapActions, - }, - [tokenWrapSagaName]: { - name: tokenWrapSagaName, - wrappedSaga: tokenWrapSaga, - reducer: tokenWrapReducer, - actions: tokenWrapActions, - }, [removeDelegationSagaName]: { name: removeDelegationSagaName, wrappedSaga: removeDelegationSaga, diff --git a/apps/extension/src/app/utils/analytics.ts b/apps/extension/src/app/utils/analytics.ts index b24911e58b1..41fb45f6b41 100644 --- a/apps/extension/src/app/utils/analytics.ts +++ b/apps/extension/src/app/utils/analytics.ts @@ -5,11 +5,18 @@ import 'symbol-observable' // Needed by `reduxed-chrome-storage` as polyfill, or import { EXTENSION_ORIGIN_APPLICATION } from 'src/app/version' import { uniswapUrls } from 'uniswap/src/constants/urls' import { getUniqueId } from 'utilities/src/device/uniqueId' +import { isTestEnv } from 'utilities/src/environment/env' +import { logger } from 'utilities/src/logger/logger' import { ApplicationTransport } from 'utilities/src/telemetry/analytics/ApplicationTransport' // biome-ignore lint/style/noRestrictedImports: Direct utilities import required for analytics initialization import { analytics, getAnalyticsAtomDirect } from 'utilities/src/telemetry/analytics/analytics' export async function initExtensionAnalytics(): Promise { + if (isTestEnv()) { + logger.debug('analytics.ts', 'initExtensionAnalytics', 'Skipping Amplitude initialization in test environment') + return + } + const analyticsAllowed = await getAnalyticsAtomDirect(true) await analytics.init({ transportProvider: new ApplicationTransport({ diff --git a/apps/extension/src/background/backgroundDappRequests.ts b/apps/extension/src/background/backgroundDappRequests.ts index 968024943b1..e256ed0fb19 100644 --- a/apps/extension/src/background/backgroundDappRequests.ts +++ b/apps/extension/src/background/backgroundDappRequests.ts @@ -1,3 +1,4 @@ +/* eslint-disable max-lines */ import { rpcErrors, serializeError } from '@metamask/rpc-errors' import { removeDappConnection } from 'src/app/features/dapp/actions' import { changeChain } from 'src/app/features/dapp/changeChain' @@ -32,7 +33,7 @@ import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send' import { WindowEthereumRequestProperties } from 'uniswap/src/features/telemetry/types' import { extractBaseUrl } from 'utilities/src/format/urls' import { logger } from 'utilities/src/logger/logger' -import { getCapabilitiesCore } from 'wallet/src/features/batchedTransactions/utils' +import { getCapabilitiesResponse } from 'wallet/src/features/batchedTransactions/utils' import { walletContextValue } from 'wallet/src/features/wallet/context' import { selectHasSmartWalletConsent } from 'wallet/src/features/wallet/selectors' @@ -320,7 +321,7 @@ async function handleGetCapabilities({ }) const chainIds = request.chainIds?.map(hexadecimalStringToInt) ?? enabledChains.map((chain) => chain.valueOf()) - const response = await getCapabilitiesCore({ + const response = await getCapabilitiesResponse({ request, chainIds, hasSmartWalletConsent, diff --git a/apps/extension/src/background/utils/persistedStateUtils.ts b/apps/extension/src/background/utils/persistedStateUtils.ts index 50f2b49cdc3..2b646c64565 100644 --- a/apps/extension/src/background/utils/persistedStateUtils.ts +++ b/apps/extension/src/background/utils/persistedStateUtils.ts @@ -2,6 +2,7 @@ import { isOnboardedSelector } from 'src/app/utils/isOnboardedSelector' import { STATE_STORAGE_KEY } from 'src/store/constants' import { ExtensionState } from 'src/store/extensionReducer' import { EXTENSION_STATE_VERSION } from 'src/store/migrations' +import { deviceAccessTimeoutToMinutes } from 'uniswap/src/features/settings/constants' import { logger } from 'utilities/src/logger/logger' export async function readReduxStateFromStorage(storageChanges?: { @@ -30,6 +31,11 @@ export async function readIsOnboardedFromStorage(): Promise { return state ? isOnboardedSelector(state) : false } +export async function readDeviceAccessTimeoutMinutesFromStorage(): Promise { + const state = await readReduxStateFromStorage() + return state ? deviceAccessTimeoutToMinutes(state.userSettings.deviceAccessTimeout) : undefined +} + /** * Checks if Redux migrations are pending by comparing persisted version with current version * @returns true if migrations are pending and sidebar should handle the request diff --git a/apps/extension/src/entrypoints/background.ts b/apps/extension/src/entrypoints/background.ts index f75bfd172b9..773b1b9114a 100644 --- a/apps/extension/src/entrypoints/background.ts +++ b/apps/extension/src/entrypoints/background.ts @@ -1,5 +1,6 @@ import 'symbol-observable' // Needed by `reduxed-chrome-storage` as polyfill, order matters +import { AUTO_LOCK_ALARM_NAME } from 'src/app/components/AutoLockProvider' import { initStatSigForBrowserScripts } from 'src/app/core/initStatSigForBrowserScripts' import { focusOrCreateOnboardingTab } from 'src/app/navigation/focusOrCreateOnboardingTab' import { initExtensionAnalytics } from 'src/app/utils/analytics' @@ -14,9 +15,15 @@ import { ContentScriptUtilityMessageType, } from 'src/background/messagePassing/types/requests' import { setSidePanelBehavior, setSidePanelOptions } from 'src/background/utils/chromeSidePanelUtils' -import { readIsOnboardedFromStorage } from 'src/background/utils/persistedStateUtils' +import { + readDeviceAccessTimeoutMinutesFromStorage, + readIsOnboardedFromStorage, +} from 'src/background/utils/persistedStateUtils' import { uniswapUrls } from 'uniswap/src/constants/urls' +import { ExtensionEventName } from 'uniswap/src/features/telemetry/constants' +import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send' import { logger } from 'utilities/src/logger/logger' +import { Keyring } from 'wallet/src/features/wallet/Keyring/Keyring' import { defineBackground } from 'wxt/utils/define-background' async function enableSidebar(): Promise { @@ -69,6 +76,53 @@ function makeBackground(): void { await checkAndHandleOnboarding() }) + // Auto-lock alarm listener + chrome.alarms.onAlarm.addListener((alarm) => { + if (alarm.name === AUTO_LOCK_ALARM_NAME) { + Keyring.lock() + .then(() => { + sendAnalyticsEvent(ExtensionEventName.ChangeLockedState, { + locked: true, + location: 'background', + }) + }) + .catch((error) => { + logger.error(error, { + tags: { + file: 'background.ts', + function: 'alarms.onAlarm', + }, + }) + }) + } + }) + + // Listen for sidebar port disconnects to schedule auto-lock alarm + chrome.runtime.onConnect.addListener((port) => { + if (port.name === AUTO_LOCK_ALARM_NAME) { + port.onDisconnect.addListener(async () => { + try { + // Get timeout setting from Redux state + const delayInMinutes = await readDeviceAccessTimeoutMinutesFromStorage() + if (delayInMinutes === undefined) { + return + } + + // Schedule alarm + chrome.alarms.create(AUTO_LOCK_ALARM_NAME, { delayInMinutes }) + logger.debug('background', 'port.onDisconnect', `Scheduled auto-lock alarm for ${delayInMinutes} minutes`) + } catch (error) { + logger.error(error, { + tags: { + file: 'background.ts', + function: 'port.onDisconnect', + }, + }) + } + }) + } + }) + // on arc browser, show unsupported browser page (lives on onboarding flow) // this is because arc doesn't support the sidebar contentScriptUtilityMessageChannel.addMessageListener( diff --git a/apps/extension/src/manifest.json b/apps/extension/src/manifest.json index 4b599a3f4bd..e7bfeae6572 100644 --- a/apps/extension/src/manifest.json +++ b/apps/extension/src/manifest.json @@ -2,7 +2,7 @@ "manifest_version": 3, "name": "Uniswap Extension", "description": "The Uniswap Extension is a self-custody crypto wallet that's built for swapping.", - "version": "1.61.0", + "version": "1.64.0", "minimum_chrome_version": "116", "icons": { "16": "assets/icon16.png", diff --git a/apps/extension/src/store/migrations.test.ts b/apps/extension/src/store/migrations.test.ts index f78dd2d2f16..fe092e7fcae 100644 --- a/apps/extension/src/store/migrations.test.ts +++ b/apps/extension/src/store/migrations.test.ts @@ -36,7 +36,10 @@ import { v24Schema, v25Schema, v26Schema, + v27Schema, + v29Schema, } from 'src/store/schema' +import { USDC } from 'uniswap/src/constants/tokens' import { initialUniswapBehaviorHistoryState } from 'uniswap/src/features/behaviorHistory/slice' import { UniverseChainId } from 'uniswap/src/features/chains/types' import { initialFavoritesState } from 'uniswap/src/features/favorites/slice' @@ -44,11 +47,16 @@ import { FiatCurrency } from 'uniswap/src/features/fiatCurrency/constants' import { initialNotificationsState } from 'uniswap/src/features/notifications/slice/slice' import { initialSearchHistoryState } from 'uniswap/src/features/search/searchHistorySlice' import { initialUserSettingsState } from 'uniswap/src/features/settings/slice' -import { initialTokensState } from 'uniswap/src/features/tokens/slice/slice' +import { initialTokensState } from 'uniswap/src/features/tokens/warnings/slice/slice' import { initialTransactionsState } from 'uniswap/src/features/transactions/slice' import { TransactionStatus, TransactionType } from 'uniswap/src/features/transactions/types/transactionDetails' import { initialVisibilityState } from 'uniswap/src/features/visibility/slice' -import { testMigrateSearchHistory, testRemoveTHBFromCurrency } from 'uniswap/src/state/uniswapMigrationTests' +import { + testAddActivityVisibility, + testMigrateDismissedTokenWarnings, + testMigrateSearchHistory, + testRemoveTHBFromCurrency, +} from 'uniswap/src/state/uniswapMigrationTests' import { getAllKeysOfNestedObject } from 'utilities/src/primitives/objects' import { initialAppearanceSettingsState } from 'wallet/src/features/appearance/slice' import { initialBatchedTransactionsState } from 'wallet/src/features/batchedTransactions/slice' @@ -347,4 +355,24 @@ describe('Redux state migrations', () => { it('migrates from v26 to v27', () => { testMigrateSearchHistory(migrations[27], v26Schema) }) + + it('migrates from v27 to v29', () => { + testAddActivityVisibility(migrations[29], v27Schema) + }) + + it('migrates from v29 to v30', () => { + testMigrateDismissedTokenWarnings(migrations[30], { + ...v29Schema, + tokens: { + dismissedTokenWarnings: { + [UniverseChainId.Mainnet]: { + [USDC.address]: { + chainId: UniverseChainId.Mainnet, + address: USDC.address, + }, + }, + }, + }, + }) + }) }) diff --git a/apps/extension/src/store/migrations.ts b/apps/extension/src/store/migrations.ts index e9534188698..54f1e83a420 100644 --- a/apps/extension/src/store/migrations.ts +++ b/apps/extension/src/store/migrations.ts @@ -7,7 +7,9 @@ import { removeDappInfoToChromeLocalStorage, } from 'src/store/extensionMigrations' import { + addActivityVisibility, addDismissedBridgedAndCompatibleWarnings, + migrateDismissedTokenWarnings, migrateSearchHistory, removeThaiBahtFromFiatCurrency, unchecksumDismissedTokenWarningKeys, @@ -67,6 +69,8 @@ export const migrations = { 26: migrateLiquidityTransactionInfo, 27: migrateSearchHistory, 28: addDismissedBridgedAndCompatibleWarnings, + 29: addActivityVisibility, + 30: migrateDismissedTokenWarnings, } -export const EXTENSION_STATE_VERSION = 28 +export const EXTENSION_STATE_VERSION = 30 diff --git a/apps/extension/src/store/schema.ts b/apps/extension/src/store/schema.ts index 0fd7dc87697..f7c21de465c 100644 --- a/apps/extension/src/store/schema.ts +++ b/apps/extension/src/store/schema.ts @@ -276,6 +276,10 @@ export const v25Schema = { ...v24Schema } export const v26Schema = { ...v25Schema } -const v27Schema = { ...v26Schema } +export const v27Schema = { ...v26Schema } -export const getSchema = (): typeof v27Schema => v27Schema +export const v29Schema = { ...v27Schema, visibility: { ...v27Schema.visibility, activity: {} } } + +const v30Schema = { ...v29Schema } + +export const getSchema = (): typeof v30Schema => v30Schema diff --git a/apps/extension/src/test/babel.config.js b/apps/extension/src/test/babel.config.js index 9118275b087..7913db21158 100644 --- a/apps/extension/src/test/babel.config.js +++ b/apps/extension/src/test/babel.config.js @@ -16,10 +16,11 @@ module.exports = function (api) { ], // https://github.com/software-mansion/react-native-reanimated/issues/3364#issuecomment-1268591867 '@babel/plugin-proposal-export-namespace-from', + 'react-native-reanimated/plugin', ].filter(Boolean) return { - presets: ['module:@react-native/babel-preset'], + presets: ['babel-preset-expo'], plugins, } } diff --git a/apps/extension/src/test/fixtures/redux.ts b/apps/extension/src/test/fixtures/redux.ts index fbdbe85ec9b..773a07165bf 100644 --- a/apps/extension/src/test/fixtures/redux.ts +++ b/apps/extension/src/test/fixtures/redux.ts @@ -5,8 +5,13 @@ import { preloadedWalletPackageState } from 'wallet/src/test/fixtures' type PreloadedExtensionStateOptions = Record -export const preloadedExtensionState = createFixture, PreloadedExtensionStateOptions>( - {}, -)(() => ({ +type PreloadedExtensionStateFactory = ( + overrides?: Partial & PreloadedExtensionStateOptions>, +) => PreloadedState + +export const preloadedExtensionState: PreloadedExtensionStateFactory = createFixture< + PreloadedState, + PreloadedExtensionStateOptions +>({})(() => ({ ...preloadedWalletPackageState(), })) diff --git a/apps/extension/tsconfig.json b/apps/extension/tsconfig.json index 831ce04a0d1..fe4165ad91e 100644 --- a/apps/extension/tsconfig.json +++ b/apps/extension/tsconfig.json @@ -17,6 +17,12 @@ { "path": "../../packages/ui" }, + { + "path": "../../packages/sessions" + }, + { + "path": "../../packages/gating" + }, { "path": "../../packages/api" }, diff --git a/apps/extension/webpack.config.js b/apps/extension/webpack.config.js index 2893c62943f..06ffc015ebf 100644 --- a/apps/extension/webpack.config.js +++ b/apps/extension/webpack.config.js @@ -29,6 +29,7 @@ const compileNodeModules = [ 'expo-linear-gradient', 'react-native-image-picker', 'expo-modules-core', + 'react-native-reanimated', ] // This is needed for webpack to compile JavaScript. @@ -48,8 +49,8 @@ const babelLoaderConfiguration = { loader: 'babel-loader', options: { cacheDirectory: true, - // The 'metro-react-native-babel-preset' preset is recommended to match React Native's packager - presets: ['module:@react-native/babel-preset'], + // The 'babel-preset-expo' preset is recommended to match React Native's packager + presets: ['babel-preset-expo'], // Re-write paths to import only the modules needed by the app plugins: ['react-native-web'], }, diff --git a/apps/extension/wxt.config.ts b/apps/extension/wxt.config.ts index 37e4fc458e7..6fa77e81623 100644 --- a/apps/extension/wxt.config.ts +++ b/apps/extension/wxt.config.ts @@ -16,7 +16,7 @@ const icons = { const BASE_NAME = 'Uniswap Extension' const BASE_DESCRIPTION = "The Uniswap Extension is a self-custody crypto wallet that's built for swapping." -const BASE_VERSION = '1.61.0' +const BASE_VERSION = '1.64.0' const BUILD_NUM = parseInt(process.env.BUILD_NUM || '0') const EXTENSION_VERSION = `${BASE_VERSION}.${BUILD_NUM}` @@ -187,10 +187,14 @@ export default defineConfig({ plugins: [ { - name: 'transform-expo-blur-jsx', + name: 'transform-react-native-jsx', async transform(code, id) { - // Only transform expo-blur .js files - if (!id.includes('node_modules/expo-blur') || !id.endsWith('.js')) { + // Transform JSX in react-native libraries that ship JSX in .js files + const needsJsxTransform = ['node_modules/expo-blur', 'node_modules/react-native-reanimated'].some((path) => + id.includes(path), + ) + + if (!needsJsxTransform || !id.endsWith('.js')) { return null } diff --git a/apps/mobile/.depcheckrc b/apps/mobile/.depcheckrc index 6190990de06..3ef594a9703 100644 --- a/apps/mobile/.depcheckrc +++ b/apps/mobile/.depcheckrc @@ -12,7 +12,7 @@ ignores: [ "babel-plugin-transform-remove-console", "cross-fetch", "@datadog/datadog-ci", - "@rnef/cli", + "dotenv", "expo-localization", "expo-linking", "expo-modules-core", @@ -43,4 +43,7 @@ ignores: [ "metro-config", ## used in sessions/api packages "expo-secure-store", + ## used for expo remote build caching + "eas-build-cache-provider", + "expo-dev-client", ] diff --git a/apps/mobile/.eslintrc.js b/apps/mobile/.eslintrc.js index 8a2ee3a2cee..26a62d9f007 100644 --- a/apps/mobile/.eslintrc.js +++ b/apps/mobile/.eslintrc.js @@ -58,13 +58,6 @@ module.exports = { 'import/no-unused-modules': 'off', }, }, - { - // Allow test files to exceed max-lines limit - files: ['**/*.test.ts', '**/*.test.tsx', '**/__tests__/**/*.[jt]s?(x)', '**/?(*.)+(spec|test).[tj]s?(x)'], - rules: { - 'max-lines': 'off', - }, - }, ], rules: { 'rulesdir/i18n': 'error', diff --git a/apps/mobile/.fingerprintignore b/apps/mobile/.fingerprintignore new file mode 100644 index 00000000000..2bcbe3b6c40 --- /dev/null +++ b/apps/mobile/.fingerprintignore @@ -0,0 +1,49 @@ +# Generated files that shouldn't trigger rebuilds +ios/WidgetsCore/MobileSchema/**/*.swift +ios/WidgetsCore/Env.swift +ios/OneSignalNotificationServiceExtension/Env.swift +.maestro/scripts/dist/**/* +.maestro/scripts/performance/dist/**/* + +# Cache/temporary files +.expo/**/* +coverage/**/* +.tamagui/**/* +storybook-static/**/* +dist/**/* +build/**/* + +# Environment files +.env* +!.env.example + +# All node_modules - native deps are tracked via lock files +node_modules/**/* +../../node_modules/**/* + +# Build configuration that doesn't affect native +.gitignore + +# Autolinking outputs (redundant with lock files) +# These are derived from node_modules and package.json +expoAutolinkingConfig:android +expoAutolinkingConfig:ios +rncoreAutolinkingConfig:android +rncoreAutolinkingConfig:ios + +# Android build artifacts (if not already in native .gitignore) +android/app/build/**/* +android/.gradle/**/* +android/build/**/* +android/.cxx/**/* + +# iOS build artifacts (if not already in native .gitignore) +ios/build/**/* +ios/Pods/**/* +!ios/Podfile +!ios/Podfile.lock +ios/*.xcworkspace/**/* +!ios/*.xcworkspace/contents.xcworkspacedata + +# ensure patches are tracked +!../../patches/**/* diff --git a/apps/mobile/.gitignore b/apps/mobile/.gitignore index f6487b4f10a..6d1ce5cd0e8 100644 --- a/apps/mobile/.gitignore +++ b/apps/mobile/.gitignore @@ -36,6 +36,7 @@ local.properties *.jks keystore.properties *.aab +.kotlin/ # node.js # @@ -120,8 +121,16 @@ ios/WidgetsCore/Env.swift ios/OneSignalNotificationServiceExtension/Env.swift # Expo -.expo/ +.expo +dist/ +web-build/ # Maestro E2E Scripts (compiled/generated) .maestro/scripts/dist/ .maestro/scripts/performance/dist/ + +# rnef (deprecated) +.rnef/ + +coverage/ + diff --git a/apps/mobile/.maestro/flows/explore/filters-and-sorts.yaml b/apps/mobile/.maestro/flows/explore/filters-and-sorts.yaml index 89740a599f7..76c7fa635fe 100644 --- a/apps/mobile/.maestro/flows/explore/filters-and-sorts.yaml +++ b/apps/mobile/.maestro/flows/explore/filters-and-sorts.yaml @@ -1,7 +1,5 @@ appId: com.uniswap.mobile.dev jsEngine: graaljs -tags: - - language-agnostic env: E2E_RECOVERY_PHRASE: ${E2E_RECOVERY_PHRASE} DATADOG_API_KEY: ${DATADOG_API_KEY} @@ -72,11 +70,11 @@ env: # Wait for sort options to appear - extendedWaitUntil: visible: - id: "MARKET_CAP" + text: ".*Market.*" timeout: 3000 - tapOn: - id: "MARKET_CAP" + text: ".*Market.*" - runScript: file: ../../scripts/performance/dist/actions/track-action.js @@ -106,11 +104,11 @@ env: - waitForAnimationToEnd - extendedWaitUntil: visible: - id: "TOTAL_VALUE_LOCKED" + text: ".*TVL.*" timeout: 3000 - tapOn: - id: "TOTAL_VALUE_LOCKED" + text: ".*TVL.*" - runScript: file: ../../scripts/performance/dist/actions/track-action.js @@ -142,11 +140,11 @@ env: # Wait for sort options to appear - extendedWaitUntil: visible: - id: "PRICE_PERCENT_CHANGE_1_DAY_DESC" + text: ".*Price.*increase.*" timeout: 3000 - tapOn: - id: "PRICE_PERCENT_CHANGE_1_DAY_DESC" + text: ".*Price.*increase.*" - runScript: file: ../../scripts/performance/dist/actions/track-action.js @@ -178,11 +176,11 @@ env: # Wait for sort options to appear - extendedWaitUntil: visible: - id: "PRICE_PERCENT_CHANGE_1_DAY_ASC" + text: ".*Price.*decrease.*" timeout: 3000 - tapOn: - id: "PRICE_PERCENT_CHANGE_1_DAY_ASC" + text: ".*Price.*decrease.*" - runScript: file: ../../scripts/performance/dist/actions/track-action.js @@ -214,11 +212,11 @@ env: # Wait for sort options to appear - extendedWaitUntil: visible: - id: "VOLUME" + text: ".*Volume.*" timeout: 3000 - tapOn: - id: "VOLUME" + text: ".*Volume.*" - runScript: file: ../../scripts/performance/dist/actions/track-action.js diff --git a/apps/mobile/android/app/build.gradle b/apps/mobile/android/app/build.gradle index cf470808dde..8f7e2bd848a 100644 --- a/apps/mobile/android/app/build.gradle +++ b/apps/mobile/android/app/build.gradle @@ -1,40 +1,35 @@ -import com.android.build.OutputFile - -plugins { - id 'com.android.application' - id 'com.facebook.react' - id 'com.google.gms.google-services' - id 'maven-publish' - id 'kotlin-android' - id 'org.jetbrains.kotlin.plugin.compose' -} +apply plugin: "com.android.application" +apply plugin: "org.jetbrains.kotlin.android" +apply plugin: "com.google.gms.google-services" +apply plugin: "maven-publish" +apply plugin: "kotlin-android" +apply plugin: "org.jetbrains.kotlin.plugin.compose" +apply plugin: "com.facebook.react" -def nodeModulesPath = "../../../../node_modules" -def rnRoot = "../.." +def projectRoot = rootDir.getAbsoluteFile().getParentFile().getAbsolutePath() -def keystorePropertiesFile = rootProject.file("keystore.properties"); -def keystoreProperties = new Properties() -if (keystorePropertiesFile.exists()) { - keystoreProperties.load(new FileInputStream(keystorePropertiesFile)) -} +def nodeModulesPath = "../../../../node_modules" react { - root = file("$rnRoot/") + // From expo docs: https://docs.expo.dev/brownfield/get-started + entryFile = file(["node", "-e", "require('expo/scripts/resolveAppEntry')", rootDir.getAbsoluteFile().getParentFile().getAbsolutePath(), "android", "absolute"].execute(null, rootDir).text.trim()) + reactNativeDir = file("$nodeModulesPath/react-native") - codegenDir = file("$nodeModulesPath/react-native-codegen") - cliFile = file("$nodeModulesPath/@rnef/cli/dist/src/bin.js") + + hermesCommand = new File(["node", "--print", "require.resolve('react-native/package.json')"].execute(null, rootDir).text.trim()).getParentFile().getAbsolutePath() + "/sdks/hermesc/%OS-BIN%/hermesc" + + codegenDir = new File(["node", "--print", "require.resolve('@react-native/codegen/package.json', { paths: [require.resolve('react-native/package.json')] })"].execute(null, rootDir).text.trim()).getParentFile().getAbsoluteFile() + + enableBundleCompression = (findProperty('android.enableBundleCompression') ?: false).toBoolean() + + cliFile = new File(["node", "--print", "require.resolve('@expo/cli')"].execute(null, rootDir).text.trim()) + bundleCommand = "export:embed" + debuggableVariants = ["devDebug", "betaDebug", "prodDebug"] - hermesCommand = "../../node_modules/react-native/sdks/hermesc/%OS-BIN%/hermesc" // This is relative to the project root. + /* Autolinking */ autolinkLibrariesWithApp() } -/** - * Set this to true to create four separate APKs instead of one, - * one for each native architecture. This is useful if you don't - * use App Bundles (https://developer.android.com/guide/app-bundle/) - * and want to have separate APKs to upload to the Play Store. - */ -def enableSeparateBuildPerCPUArchitecture = false /** * Set this to true to Run Proguard on Release builds to minify the Java bytecode. @@ -45,14 +40,14 @@ def enableProguardInReleaseBuilds = false * The preferred build flavor of JavaScriptCore (JSC) * * For example, to use the international variant, you can use: - * `def jscFlavor = 'org.webkit:android-jsc-intl:+'` + * `def jscFlavor = io.github.react-native-community:jsc-android-intl:2026004.+` * * The international variant includes ICU i18n library and necessary data * allowing to use e.g. `Date.toLocaleString` and `String.localeCompare` that * give correct results when using with locales other than en-US. Note that * this variant is about 6MiB larger per architecture than default. */ -def jscFlavor = 'org.webkit:android-jsc-intl:+' +def jscFlavor = 'io.github.react-native-community:jsc-android:2026004.+' /** * Private function to get the list of Native Architectures you want to build. @@ -72,9 +67,9 @@ if (isCI && datadogPropertiesAvailable) { apply from: "../../../../node_modules/@datadog/mobile-react-native/datadog-sourcemaps.gradle" } -def devVersionName = "1.61" -def betaVersionName = "1.61" -def prodVersionName = "1.61" +def devVersionName = "1.64.1" +def betaVersionName = "1.64.1" +def prodVersionName = "1.64.1" android { ndkVersion rootProject.ext.ndkVersion @@ -91,7 +86,7 @@ android { splits { abi { reset() - enable enableSeparateBuildPerCPUArchitecture + enable false universalApk false // If true, also generate a universal APK include (*reactNativeArchitectures()) } @@ -107,10 +102,18 @@ android { keyPassword 'android' } release { - storeFile file(System.getenv("ANDROID_KEYSTORE_FILE") ?: 'keystore.jks') - storePassword System.getenv("ANDROID_STORE_PASSWORD") ?: keystoreProperties.getProperty("STORE_PASSWORD") - keyAlias System.getenv("ANDROID_KEYSTORE_ALIAS") ?: keystoreProperties.getProperty("KEYSTORE_ALIAS") - keyPassword System.getenv("ANDROID_KEY_PASSWORD") ?: keystoreProperties.getProperty("KEY_PASSWORD") + def useDebugKeystore = System.getenv("ANDROID_USE_DEBUG_KEYSTORE") == "true" + if (useDebugKeystore) { + storeFile file('debug.keystore') + storePassword 'android' + keyAlias 'androiddebugkey' + keyPassword 'android' + } else { + storeFile file(System.getenv("ANDROID_KEYSTORE_FILE") ?: 'keystore.jks') + storePassword System.getenv("ANDROID_STORE_PASSWORD") ?: "" + keyAlias System.getenv("ANDROID_KEYSTORE_ALIAS") ?: "" + keyPassword System.getenv("ANDROID_KEY_PASSWORD") ?: "" + } } } @@ -119,12 +122,12 @@ android { productFlavors { dev { isDefault(true) - applicationIdSuffix ".dev" + applicationId "com.uniswap.mobile.dev" versionName devVersionName dimension "variant" } beta { - applicationIdSuffix ".beta" + applicationId "com.uniswap.mobile.beta" versionName betaVersionName dimension "variant" } @@ -146,18 +149,33 @@ android { } // applicationVariants are e.g. debug, release - applicationVariants.all { variant -> + applicationVariants.configureEach { variant -> + // Prevent using debug keystore for production builds + if (variant.flavorName == "prod" && variant.buildType.name == "release") { + def useDebugKeystore = System.getenv("ANDROID_USE_DEBUG_KEYSTORE") == "true" + if (useDebugKeystore) { + def blockTask = tasks.register("blockDebugKeystoreFor${variant.name.capitalize()}") { + doLast { + throw new GradleException( + "ANDROID_USE_DEBUG_KEYSTORE cannot be used for production builds.\n" + + "This prevents accidentally publishing an improperly signed APK." + ) + } + } + variant.assembleProvider.configure { dependsOn blockTask } + } + } + variant.outputs.each { output -> // For each separate APK per architecture, set a unique version code as described here: // https://developer.android.com/studio/build/configure-apk-splits.html // Example: versionCode 1 will generate 1001 for armeabi-v7a, 1002 for x86, etc. def versionCodes = ["armeabi-v7a": 1, "x86": 2, "arm64-v8a": 3, "x86_64": 4] - def abi = output.getFilter(OutputFile.ABI) + def abi = output.getFilter(com.android.build.VariantOutput.FilterType.ABI) if (abi != null) { // null for the universal-debug, universal-release variants output.versionCodeOverride = defaultConfig.versionCode * 1000 + versionCodes.get(abi) } - } } @@ -193,6 +211,7 @@ android { dependencies { // The version of react-native is set by the React Native Gradle Plugin implementation "com.facebook.react:react-android" + implementation("com.facebook.react:hermes-android") implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.0.0" implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlinVersion" @@ -247,10 +266,4 @@ dependencies { implementation 'androidx.compose.ui:ui-tooling-preview-android:1.8.1' implementation project(':react-native-video') - - if (hermesEnabled.toBoolean()) { - implementation("com.facebook.react:hermes-android") - } else { - implementation jscFlavor - } } diff --git a/apps/mobile/android/app/src/main/AndroidManifest.xml b/apps/mobile/android/app/src/main/AndroidManifest.xml index 66bdd248726..aed03ffb4b9 100644 --- a/apps/mobile/android/app/src/main/AndroidManifest.xml +++ b/apps/mobile/android/app/src/main/AndroidManifest.xml @@ -7,7 +7,7 @@ - + + + - + - - + + - - + + @@ -77,39 +81,39 @@ + android:scheme="https" + android:host="app.uniswap.org" + android:pathPrefix="/nfts/asset/" /> + android:scheme="https" + android:host="app.uniswap.org" + android:pathPrefix="/nfts/collection/" /> + android:scheme="https" + android:host="app.uniswap.org" + android:pathPrefix="/tokens" /> + android:scheme="https" + android:host="app.uniswap.org" + android:pathPrefix="/address/" /> + android:scheme="https" + android:host="app.uniswap.org" + android:pathPrefix="/explore/" /> + android:scheme="https" + android:host="app.uniswap.org" + android:pathPrefix="/swap" /> + android:scheme="https" + android:host="app.uniswap.org" + android:pathPrefix="/buy" /> @@ -118,14 +122,14 @@ + android:scheme="https" + android:host="uniswap.org" + android:pathPrefix="/app" /> + android:scheme="https" + android:host="uniswap.org" + android:pathPrefix="/app/wc" /> diff --git a/apps/mobile/android/app/src/main/java/com/uniswap/MainActivity.kt b/apps/mobile/android/app/src/main/java/com/uniswap/MainActivity.kt index 370ffb03d1f..ee40024b0a3 100644 --- a/apps/mobile/android/app/src/main/java/com/uniswap/MainActivity.kt +++ b/apps/mobile/android/app/src/main/java/com/uniswap/MainActivity.kt @@ -44,10 +44,6 @@ class MainActivity : ReactActivity() { * (aka React 18) with two boolean flags. */ override fun createReactActivityDelegate(): ReactActivityDelegate? { - return ReactActivityDelegateWrapper( - this, - BuildConfig.IS_NEW_ARCHITECTURE_ENABLED, - DefaultReactActivityDelegate(this, mainComponentName, fabricEnabled) - ) + return ReactActivityDelegateWrapper(this, BuildConfig.IS_NEW_ARCHITECTURE_ENABLED, DefaultReactActivityDelegate(this, mainComponentName, fabricEnabled)) } } diff --git a/apps/mobile/android/app/src/main/java/com/uniswap/MainApplication.kt b/apps/mobile/android/app/src/main/java/com/uniswap/MainApplication.kt index b914ee2c34a..21c5c32714a 100644 --- a/apps/mobile/android/app/src/main/java/com/uniswap/MainApplication.kt +++ b/apps/mobile/android/app/src/main/java/com/uniswap/MainApplication.kt @@ -19,7 +19,7 @@ import expo.modules.ReactNativeHostWrapper class MainApplication : Application(), ReactApplication { override val reactNativeHost: ReactNativeHost = - ReactNativeHostWrapper(this, object : DefaultReactNativeHost(this) { + ReactNativeHostWrapper(this, object : DefaultReactNativeHost(this) { override fun getPackages(): List = PackageList(this).packages.apply { // Packages that cannot be autolinked yet can be added manually here, for example: @@ -29,9 +29,7 @@ class MainApplication : Application(), ReactApplication { add(ScantasticEncryptionModule()) add(RedirectToSourceAppPackage()) } - override fun getJSMainModuleName(): String { - return "index" - } + override fun getJSMainModuleName(): String = ".expo/.virtual-metro-entry" override fun getUseDeveloperSupport(): Boolean { return BuildConfig.DEBUG @@ -39,22 +37,23 @@ class MainApplication : Application(), ReactApplication { override val isNewArchEnabled: Boolean get() = BuildConfig.IS_NEW_ARCHITECTURE_ENABLED - - override val isHermesEnabled: Boolean - get() = BuildConfig.IS_HERMES_ENABLED }) override val reactHost: ReactHost - get() = getDefaultReactHost(applicationContext, reactNativeHost) + get() = ReactNativeHostWrapper.createReactHost(applicationContext, reactNativeHost) override fun onCreate() { ReactNativePerformance.onAppStarted() super.onCreate() + + // Initialize SoLoader before any code that might load native libraries SoLoader.init(this, OpenSourceMergedSoMapping) if (BuildConfig.IS_NEW_ARCHITECTURE_ENABLED) { // If you opted-in for the New Architecture, we load the native entry point for this app. load() } + + // Initialize Expo modules after SoLoader ApplicationLifecycleDispatcher.onApplicationCreate(this) } diff --git a/apps/mobile/android/app/src/main/java/com/uniswap/UniswapPackage.kt b/apps/mobile/android/app/src/main/java/com/uniswap/UniswapPackage.kt index 5463faf66a8..16776573e76 100644 --- a/apps/mobile/android/app/src/main/java/com/uniswap/UniswapPackage.kt +++ b/apps/mobile/android/app/src/main/java/com/uniswap/UniswapPackage.kt @@ -6,6 +6,7 @@ import com.facebook.react.bridge.NativeModule import com.facebook.react.bridge.ReactApplicationContext import com.facebook.react.uimanager.ReactShadowNode import com.facebook.react.uimanager.ViewManager +import com.uniswap.notifications.SilentPushEventEmitterModule import com.uniswap.onboarding.backup.MnemonicConfirmationViewManager import com.uniswap.onboarding.backup.MnemonicDisplayViewManager import com.uniswap.onboarding.import.SeedPhraseInputViewManager @@ -28,5 +29,6 @@ class UniswapPackage : ReactPackage { RNEthersRSModule(reactContext), EmbeddedWalletModule(reactContext), ThemeModule(reactContext), + SilentPushEventEmitterModule(reactContext), ) } diff --git a/apps/mobile/android/app/src/main/java/com/uniswap/notifications/SilentPushEventEmitterModule.kt b/apps/mobile/android/app/src/main/java/com/uniswap/notifications/SilentPushEventEmitterModule.kt new file mode 100644 index 00000000000..9c2504ec875 --- /dev/null +++ b/apps/mobile/android/app/src/main/java/com/uniswap/notifications/SilentPushEventEmitterModule.kt @@ -0,0 +1,129 @@ +package com.uniswap.notifications + +import android.util.Log +import androidx.annotation.Keep +import com.facebook.react.module.annotations.ReactModule +import com.facebook.react.bridge.ReactApplicationContext +import com.facebook.react.bridge.ReactContextBaseJavaModule +import com.facebook.react.bridge.ReactMethod +import com.facebook.react.modules.core.DeviceEventManagerModule +import com.uniswap.utils.toWritableMap +import org.json.JSONObject + +@Keep +@ReactModule(name = SilentPushEventEmitterModule.MODULE_NAME) +class SilentPushEventEmitterModule( + reactContext: ReactApplicationContext +) : ReactContextBaseJavaModule(reactContext) { + + override fun getName() = MODULE_NAME + + override fun initialize() { + super.initialize() + instance = this + listenerCount = 0 + Log.d(TAG, "SilentPushEventEmitter initialized") + flushPendingEvents() + } + + override fun onCatalystInstanceDestroy() { + super.onCatalystInstanceDestroy() + if (instance === this) { + instance = null + } + listenerCount = 0 + } + + @ReactMethod + fun addListener(eventName: String) { + if (eventName != EVENT_NAME) { + return + } + listenerCount += 1 + flushPendingEvents() + } + + @ReactMethod + fun removeListeners(count: Int) { + if (count <= 0) { + return + } + listenerCount = (listenerCount - count).coerceAtLeast(0) + } + + private fun flushPendingEvents() { + if (!hasListeners()) { + return + } + + val events = synchronized(pendingPayloads) { + if (pendingPayloads.isEmpty()) { + null + } else { + val copy = ArrayList(pendingPayloads) + pendingPayloads.clear() + copy + } + } ?: return + + Log.d(TAG, "Flushing ${events.size} queued silent push events") + events.forEach { sendEvent(it) } + } + + private fun sendEvent(payload: JSONObject) { + if (!reactApplicationContext.hasActiveCatalystInstance()) { + synchronized(pendingPayloads) { + Log.d(TAG, "No active Catalyst instance; queueing payload: ${payload.toString()}") + pendingPayloads.add(JSONObject(payload.toString())) + } + return + } + + val map = payload.toWritableMap() + reactApplicationContext.runOnUiQueueThread { + if (!reactApplicationContext.hasActiveCatalystInstance()) { + synchronized(pendingPayloads) { + Log.d(TAG, "Catalyst inactive on UI thread; re-queueing payload: ${payload.toString()}") + pendingPayloads.add(JSONObject(payload.toString())) + } + return@runOnUiQueueThread + } + + Log.d(TAG, "Emitting silent push payload to JS: ${payload.toString()}") + reactApplicationContext + .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter::class.java) + .emit(EVENT_NAME, map) + } + } + + private fun hasListeners(): Boolean = instance != null && listenerCount > 0 + + companion object { + const val MODULE_NAME = "SilentPushEventEmitter" + private const val EVENT_NAME = "SilentPushReceived" + private const val TAG = "SilentPushEmitter" + private val pendingPayloads = mutableListOf() + + @Volatile + private var instance: SilentPushEventEmitterModule? = null + + @Volatile + private var listenerCount: Int = 0 + + fun emitEvent(payload: JSONObject?) { + val eventPayload = payload?.let { JSONObject(it.toString()) } ?: JSONObject() + val currentInstance = instance + + if (currentInstance != null && currentInstance.hasListeners()) { + Log.d(TAG, "Sending silent push event to JS immediately: $eventPayload") + currentInstance.sendEvent(eventPayload) + return + } + + synchronized(pendingPayloads) { + Log.d(TAG, "Queueing silent push payload until listeners attach: $eventPayload") + pendingPayloads.add(eventPayload) + } + } + } +} diff --git a/apps/mobile/android/app/src/main/java/com/uniswap/notifications/SilentPushNotificationServiceExtension.kt b/apps/mobile/android/app/src/main/java/com/uniswap/notifications/SilentPushNotificationServiceExtension.kt new file mode 100644 index 00000000000..90321dc944d --- /dev/null +++ b/apps/mobile/android/app/src/main/java/com/uniswap/notifications/SilentPushNotificationServiceExtension.kt @@ -0,0 +1,123 @@ +package com.uniswap.notifications + +import android.util.Log +import androidx.annotation.Keep +import com.onesignal.notifications.INotification +import com.onesignal.notifications.INotificationReceivedEvent +import com.onesignal.notifications.INotificationServiceExtension +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext +import org.json.JSONException +import org.json.JSONObject + +@Keep +class SilentPushNotificationServiceExtension : INotificationServiceExtension { + override fun onNotificationReceived(event: INotificationReceivedEvent) { + val notification = event.notification + val payload = buildPayload(notification) + + val hasContentAvailableFlag = hasContentAvailable(payload) + val isMissingVisibleContent = notification.isMissingVisibleContent() + + Log.d( + TAG, + "Notification received. hasContentAvailable=$hasContentAvailableFlag, " + + "missingVisibleContent=$isMissingVisibleContent, payload=$payload", + ) + + if (!hasContentAvailableFlag && !isMissingVisibleContent) { + return + } + + Log.d(TAG, "Emitting silent push event: $payload") + val payloadForEmission = try { + JSONObject(payload.toString()) + } catch (error: JSONException) { + Log.w(TAG, "Failed to clone payload for emission: ${error.message}") + payload + } + + CoroutineScope(Dispatchers.Default).launch { + withContext(Dispatchers.Main) { + SilentPushEventEmitterModule.emitEvent(payloadForEmission) + } + } + + if (isMissingVisibleContent) { + event.preventDefault() + } + } + + private fun INotification.isMissingVisibleContent(): Boolean { + val title: String? = this.title + val body: String? = this.body + return title.isNullOrBlank() && body.isNullOrBlank() + } + + private fun buildPayload(notification: INotification): JSONObject { + val rawPayload = notification.rawPayload + val payload = try { + if (rawPayload.isNullOrBlank()) JSONObject() else JSONObject(rawPayload) + } catch (error: JSONException) { + Log.w(TAG, "Failed parsing raw payload: ${error.message}") + JSONObject() + } + + notification.additionalData?.let { additionalData -> + try { + payload.put("additionalData", additionalData) + } catch (error: JSONException) { + Log.w(TAG, "Failed to append additional data: ${error.message}") + } + } + + return payload + } + + private fun hasContentAvailable(payload: JSONObject?): Boolean { + if (payload == null) { + return false + } + + if (payload.hasContentAvailableFlag()) { + return true + } + + val aps = payload.optJSONObject("aps") + if (aps != null && aps.hasContentAvailableFlag()) { + return true + } + + val additionalData = payload.optJSONObject("additionalData") + if (additionalData != null && additionalData.hasContentAvailableFlag()) { + return true + } + + return false + } + + private fun JSONObject.hasContentAvailableFlag(): Boolean { + return opt(CONTENT_AVAILABLE_UNDERSCORE).isTruthy() || opt(CONTENT_AVAILABLE_HYPHEN).isTruthy() + } + + private fun Any?.isTruthy(): Boolean { + return when (this) { + null, JSONObject.NULL -> false + is Boolean -> this + is Int -> this == 1 + is Long -> this == 1L + is Double -> this == 1.0 + is Float -> this == 1f + is String -> equals("1", ignoreCase = true) || equals("true", ignoreCase = true) + else -> false + } + } + + companion object { + private const val TAG = "SilentPushExt" + private const val CONTENT_AVAILABLE_UNDERSCORE = "content_available" + private const val CONTENT_AVAILABLE_HYPHEN = "content-available" + } +} diff --git a/apps/mobile/android/app/src/main/java/com/uniswap/utils/JsonWritableExtensions.kt b/apps/mobile/android/app/src/main/java/com/uniswap/utils/JsonWritableExtensions.kt new file mode 100644 index 00000000000..81415055e6d --- /dev/null +++ b/apps/mobile/android/app/src/main/java/com/uniswap/utils/JsonWritableExtensions.kt @@ -0,0 +1,61 @@ +package com.uniswap.utils + +import com.facebook.react.bridge.Arguments +import com.facebook.react.bridge.WritableArray +import com.facebook.react.bridge.WritableMap +import org.json.JSONArray +import org.json.JSONObject + +fun JSONObject.toWritableMap(): WritableMap { + val map = Arguments.createMap() + val iterator = keys() + while (iterator.hasNext()) { + val key = iterator.next() + when (val value = opt(key)) { + null, JSONObject.NULL -> map.putNull(key) + is JSONObject -> map.putMap(key, value.toWritableMap()) + is JSONArray -> map.putArray(key, value.toWritableArray()) + is Boolean -> map.putBoolean(key, value) + is Int -> map.putInt(key, value) + is Long -> { + if (value in Int.MIN_VALUE..Int.MAX_VALUE) { + map.putInt(key, value.toInt()) + } else { + map.putDouble(key, value.toDouble()) + } + } + is Double -> map.putDouble(key, value) + is Float -> map.putDouble(key, value.toDouble()) + is Number -> map.putDouble(key, value.toDouble()) + is String -> map.putString(key, value) + else -> map.putString(key, value.toString()) + } + } + return map +} + +fun JSONArray.toWritableArray(): WritableArray { + val array = Arguments.createArray() + for (index in 0 until length()) { + when (val value = opt(index)) { + null, JSONObject.NULL -> array.pushNull() + is JSONObject -> array.pushMap(value.toWritableMap()) + is JSONArray -> array.pushArray(value.toWritableArray()) + is Boolean -> array.pushBoolean(value) + is Int -> array.pushInt(value) + is Long -> { + if (value in Int.MIN_VALUE..Int.MAX_VALUE) { + array.pushInt(value.toInt()) + } else { + array.pushDouble(value.toDouble()) + } + } + is Double -> array.pushDouble(value) + is Float -> array.pushDouble(value.toDouble()) + is Number -> array.pushDouble(value.toDouble()) + is String -> array.pushString(value) + else -> array.pushString(value.toString()) + } + } + return array +} diff --git a/apps/mobile/android/build.gradle b/apps/mobile/android/build.gradle index 9ca0ef7eecb..5aa41d8be2a 100644 --- a/apps/mobile/android/build.gradle +++ b/apps/mobile/android/build.gradle @@ -2,11 +2,6 @@ buildscript { ext { - buildToolsVersion = "35.0.0" - minSdkVersion = 28 - compileSdkVersion = 35 - targetSdkVersion = 35 - ndkVersion = "27.1.12297006" kotlinVersion = "2.0.21" appCompat = "1.6.1" @@ -36,6 +31,14 @@ plugins { id 'org.jetbrains.kotlin.plugin.compose' version "$kotlinVersion" apply false } +def reactNativeAndroidDir = new File( + providers.exec { + workingDir(rootDir) + commandLine("node", "--print", "require.resolve('react-native/package.json')") + }.standardOutput.asText.get().trim(), + "../android" +) + allprojects { project.pluginManager.withPlugin("com.facebook.react") { react { @@ -45,11 +48,15 @@ allprojects { } repositories { - maven { - // expo-camera bundles a custom com.google.android:cameraview - url "$rootDir/../../../node_modules/expo-camera/android/maven" - } + google() + mavenCentral() + maven { url 'https://www.jitpack.io' } + // All of React Native (JS, Obj-C sources, Android binaries) is installed from npm + maven { url(reactNativeAndroidDir) } + // expo-camera bundles a custom com.google.android:cameraview + maven { url "$rootDir/../../../node_modules/expo-camera/android/maven" } } } +apply plugin: "expo-root-project" apply plugin: "com.facebook.react.rootproject" diff --git a/apps/mobile/android/gradle/wrapper/gradle-wrapper.properties b/apps/mobile/android/gradle/wrapper/gradle-wrapper.properties index d5edd72a874..4dd5cf37e34 100644 --- a/apps/mobile/android/gradle/wrapper/gradle-wrapper.properties +++ b/apps/mobile/android/gradle/wrapper/gradle-wrapper.properties @@ -1,7 +1,7 @@ #Wed April 10 16:30:26 EDT 2024 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/apps/mobile/android/gradlew b/apps/mobile/android/gradlew index 98d9216fb08..faf93008b77 100755 --- a/apps/mobile/android/gradlew +++ b/apps/mobile/android/gradlew @@ -1,7 +1,7 @@ -#!/usr/bin/env sh +#!/bin/sh # -# Copyright 2015 the original author or authors. +# Copyright © 2015-2021 the original authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -15,11 +15,53 @@ # See the License for the specific language governing permissions and # limitations under the License. # +# SPDX-License-Identifier: Apache-2.0 +# ############################################################################## -## -## Gradle start up script for UN*X -## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# ############################################################################## # Attempt to set APP_HOME @@ -29,158 +71,181 @@ app_path=$0 # Need this for daisy-chained symlinks. while - APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path - [ -h "$app_path" ] + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] do - ls=$(ls -ld "$app_path") - link=${ls#*' -> '} - case $link in #( - /*) app_path=$link ;; #( - *) app_path=$APP_HOME$link ;; - esac + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac done # This is normally unused # shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} # Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) -APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s' "$PWD" ) || exit +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum -warn() { - echo "$*" -} +warn () { + echo "$*" +} >&2 -die() { - echo - echo "$*" - echo - exit 1 -} +die () { + echo + echo "$*" + echo + exit 1 +} >&2 # OS specific support (must be 'true' or 'false'). cygwin=false msys=false darwin=false nonstop=false -case "$(uname)" in -CYGWIN*) - cygwin=true - ;; -Darwin*) - darwin=true - ;; -MINGW*) - msys=true - ;; -NONSTOP*) - nonstop=true - ;; +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; esac CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + # Determine the Java command to use to start the JVM. -if [ -n "$JAVA_HOME" ]; then - if [ -x "$JAVA_HOME/jre/sh/java" ]; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" - else - JAVACMD="$JAVA_HOME/bin/java" - fi - if [ ! -x "$JAVACMD" ]; then - die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME Please set the JAVA_HOME variable in your environment to match the location of your Java installation." - fi + fi else - JAVACMD="java" - if ! command -v java >/dev/null 2>&1; then - die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + JAVACMD=java + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. Please set the JAVA_HOME variable in your environment to match the location of your Java installation." - fi + fi fi # Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ]; then - MAX_FD_LIMIT=$(ulimit -H -n) - if [ $? -eq 0 ]; then - if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ]; then - MAX_FD="$MAX_FD_LIMIT" - fi - ulimit -n $MAX_FD - if [ $? -ne 0 ]; then - warn "Could not set maximum file descriptor limit: $MAX_FD" - fi - else - warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" - fi +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac fi -# For Darwin, add options to specify how the application appears in the dock -if $darwin; then - GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" -fi +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. # For Cygwin or MSYS, switch paths to Windows format before running java -if [ "$cygwin" = "true" -o "$msys" = "true" ]; then - APP_HOME=$(cygpath --path --mixed "$APP_HOME") - CLASSPATH=$(cygpath --path --mixed "$CLASSPATH") - - JAVACMD=$(cygpath --unix "$JAVACMD") - - # We build the pattern for arguments to be converted via cygpath - ROOTDIRSRAW=$(find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null) - SEP="" - for dir in $ROOTDIRSRAW; do - ROOTDIRS="$ROOTDIRS$SEP$dir" - SEP="|" - done - OURCYGPATTERN="(^($ROOTDIRS))" - # Add a user-defined pattern to the cygpath arguments - if [ "$GRADLE_CYGPATTERN" != "" ]; then - OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" - fi - # Now convert the arguments - kludge to limit ourselves to /bin/sh - i=0 - for arg in "$@"; do - CHECK=$(echo "$arg" | egrep -c "$OURCYGPATTERN" -) - CHECK2=$(echo "$arg" | egrep -c "^-") ### Determine if an option - - if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ]; then ### Added a condition - eval $(echo args$i)=$(cygpath --path --ignore --mixed "$arg") - else - eval $(echo args$i)="\"$arg\"" - fi - i=$(expr $i + 1) - done - case $i in - 0) set -- ;; - 1) set -- "$args0" ;; - 2) set -- "$args0" "$args1" ;; - 3) set -- "$args0" "$args1" "$args2" ;; - 4) set -- "$args0" "$args1" "$args2" "$args3" ;; - 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; - esac +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Collect all arguments for the java command: +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# and any embedded shellness will be escaped. +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# treated as '${Hostname}' itself on the command line. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" fi -# Escape application args -save() { - for i; do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/"; done - echo " " -} -APP_ARGS=$(save "$@") +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# -# Collect all arguments for the java command, following the shell quoting and substitution rules -eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' exec "$JAVACMD" "$@" diff --git a/apps/mobile/android/settings.gradle b/apps/mobile/android/settings.gradle index 663fcfbe17b..8d322bc3be2 100644 --- a/apps/mobile/android/settings.gradle +++ b/apps/mobile/android/settings.gradle @@ -1,10 +1,35 @@ -pluginManagement { includeBuild("../../../node_modules/@react-native/gradle-plugin") } -plugins { id("com.facebook.react.settings") } -extensions.configure(com.facebook.react.ReactSettingsExtension){ ex -> ex.autolinkLibrariesFromCommand(['bunx', 'rnef', 'config', '-p', 'android']) } +pluginManagement { + def reactNativeGradlePlugin = new File( + providers.exec { + workingDir(rootDir) + commandLine("node", "--print", "require.resolve('@react-native/gradle-plugin/package.json', { paths: [require.resolve('react-native/package.json')] })") + }.standardOutput.asText.get().trim() + ).getParentFile().absolutePath + includeBuild(reactNativeGradlePlugin) + + def expoPluginsPath = new File( + providers.exec { + workingDir(rootDir) + commandLine("node", "--print", "require.resolve('expo-modules-autolinking/package.json', { paths: [require.resolve('expo/package.json')] })") + }.standardOutput.asText.get().trim(), + "../android/expo-gradle-plugin" + ).absolutePath + includeBuild(expoPluginsPath) +} + +plugins { + id("com.facebook.react.settings") + id("expo-autolinking-settings") +} + +extensions.configure(com.facebook.react.ReactSettingsExtension) { ex -> + ex.autolinkLibrariesFromCommand(expoAutolinking.rnConfigCommand) +} + +expoAutolinking.useExpoModules() rootProject.name = 'Uniswap' -include ':app' -includeBuild('../../../node_modules/@react-native/gradle-plugin') -apply from: new File(["node", "--print", "require.resolve('../../../node_modules/expo/package.json')"].execute(null, rootDir).text.trim(), "../scripts/autolinking.gradle") -useExpoModules() +expoAutolinking.useExpoVersionCatalog() +includeBuild(expoAutolinking.reactNativeGradlePlugin) +include ':app' diff --git a/apps/mobile/app.config.ts b/apps/mobile/app.config.ts new file mode 100644 index 00000000000..03aa4e6f462 --- /dev/null +++ b/apps/mobile/app.config.ts @@ -0,0 +1,18 @@ +import { ExpoConfig } from 'expo/config' + +const config: ExpoConfig = { + name: 'Uniswap', + slug: 'uniswapmobile', + scheme: 'uniswap', + owner: 'uniswap', + extra: { + eas: { + projectId: 'f1be3813-43d7-49ac-a792-7f42cf8500f5', + }, + }, + experiments: { + buildCacheProvider: 'eas', + }, +} + +export default config diff --git a/apps/mobile/app.json b/apps/mobile/app.json deleted file mode 100644 index b9b05c82db4..00000000000 --- a/apps/mobile/app.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "name": "Uniswap", - "displayName": "Uniswap", - "appStoreUrl": "https://apps.apple.com/app/apple-store/id6443944476", - "playStoreUrl": "https://play.google.com/store/apps/details?id=com.uniswap.mobile", - "expo": { - "ios": { - "infoPlist": { - "CFBundleAllowMixedLocalizations": true - } - }, - "plugins": ["expo-localization", "expo-camera", "expo-local-authentication", "expo-secure-store"] - } -} diff --git a/apps/mobile/eas.json b/apps/mobile/eas.json new file mode 100644 index 00000000000..081b1650bfb --- /dev/null +++ b/apps/mobile/eas.json @@ -0,0 +1,72 @@ +{ + "cli": { + "version": ">= 15.0.15", + "appVersionSource": "remote" + }, + "build": { + "development": { + "bun": "1.3.1", + "node": "22.13.1", + "developmentClient": true, + "distribution": "internal", + "android": { + "buildType": "apk", + "gradleCommand": ":app:assembleDevDebug" + } + }, + "development-simulator": { + "bun": "1.3.1", + "node": "22.13.1", + "developmentClient": true, + "distribution": "internal", + "android": { + "buildType": "apk", + "gradleCommand": ":app:assembleDevDebug", + "withoutCredentials": true + }, + "ios": { + "simulator": true, + "withoutCredentials": true + } + }, + "development-release": { + "bun": "1.3.1", + "node": "22.13.1", + "distribution": "internal", + "android": { + "buildType": "apk", + "gradleCommand": ":app:assembleDevRelease" + } + }, + "beta": { + "bun": "1.3.1", + "node": "22.13.1", + "distribution": "internal", + "android": { + "buildType": "apk", + "gradleCommand": ":app:assembleBetaDebug" + } + }, + "beta-release": { + "bun": "1.3.1", + "node": "22.13.1", + "distribution": "internal", + "android": { + "buildType": "apk", + "gradleCommand": ":app:assembleBetaRelease" + } + }, + "production": { + "bun": "1.3.1", + "node": "22.13.1", + "autoIncrement": true, + "android": { + "buildType": "apk", + "gradleCommand": ":app:assembleProdRelease" + } + } + }, + "submit": { + "production": {} + } +} diff --git a/apps/mobile/fingerprint.config.js b/apps/mobile/fingerprint.config.js new file mode 100644 index 00000000000..0f3617ae437 --- /dev/null +++ b/apps/mobile/fingerprint.config.js @@ -0,0 +1,8 @@ +/** @type {import('@expo/fingerprint').Config} */ +const config = { + sourceSkips: [ + 'PackageJsonScriptsAll', // Skip all package.json scripts + 'ExpoConfigVersions', // Skip version bumps if you want + ], +} +module.exports = config diff --git a/apps/mobile/index.js b/apps/mobile/index.js index 46c83394bd3..d587e067bfc 100644 --- a/apps/mobile/index.js +++ b/apps/mobile/index.js @@ -14,6 +14,6 @@ import 'src/logbox' import 'src/polyfills' // biome-ignore assist/source/organizeImports: we want to keep the import order import App from 'src/app/App' -import { name as appName } from './app.json' +import AppConfig from './app.config' -AppRegistry.registerComponent(appName, () => App) +AppRegistry.registerComponent(AppConfig.name, () => App) diff --git a/apps/mobile/ios/Podfile b/apps/mobile/ios/Podfile index 7add18aba38..05b0c427464 100644 --- a/apps/mobile/ios/Podfile +++ b/apps/mobile/ios/Podfile @@ -26,11 +26,27 @@ target 'Uniswap' do Pod::UI.warn e end end - use_expo_modules!(exclude: ['expo-constants','expo-file-system', 'expo-font', 'expo-keep-awake', 'expo-error-recovery']) - config = use_native_modules!(['bunx', 'rnef', 'config', '-p', 'ios']) + + if ENV['EXPO_USE_COMMUNITY_AUTOLINKING'] == '1' + config_command = ['node', '-e', "process.argv=['', '', 'config'];require('@react-native-community/cli').run()"]; + else + config_command = [ + 'node', + '--no-warnings', + '--eval', + 'require(require.resolve(\'expo-modules-autolinking\', { paths: [require.resolve(\'expo/package.json\')] }))(process.argv.slice(1))', + 'react-native-config', + '--json', + '--platform', + 'ios' + ] + end + + config = use_native_modules!(config_command) use_react_native!( :path => config[:reactNativePath], + :fabric_enabled => false, # to enable hermes on iOS, change `false` to `true` and then install pods :hermes_enabled => true ) diff --git a/apps/mobile/ios/Podfile.lock b/apps/mobile/ios/Podfile.lock index 41bed31112c..10cf77ed1a6 100644 --- a/apps/mobile/ios/Podfile.lock +++ b/apps/mobile/ios/Podfile.lock @@ -1161,60 +1161,326 @@ PODS: - BoringSSL-GRPC/Implementation (0.0.36): - BoringSSL-GRPC/Interface (= 0.0.36) - BoringSSL-GRPC/Interface (0.0.36) - - DatadogCore (2.27.0): - - DatadogInternal (= 2.27.0) - - DatadogCrashReporting (2.27.0): - - DatadogInternal (= 2.27.0) + - DatadogCore (2.30.0): + - DatadogInternal (= 2.30.0) + - DatadogCrashReporting (2.30.0): + - DatadogInternal (= 2.30.0) - PLCrashReporter (~> 1.12.0) - - DatadogInternal (2.27.0) - - DatadogLogs (2.27.0): - - DatadogInternal (= 2.27.0) - - DatadogRUM (2.27.0): - - DatadogInternal (= 2.27.0) - - DatadogSDKReactNative (2.8.2): - - DatadogCore (~> 2.27.0) - - DatadogCrashReporting (~> 2.27.0) - - DatadogLogs (~> 2.27.0) - - DatadogRUM (~> 2.27.0) - - DatadogTrace (~> 2.27.0) - - DatadogWebViewTracking (~> 2.27.0) - - React-Core - - DatadogTrace (2.27.0): - - DatadogInternal (= 2.27.0) + - DatadogInternal (2.30.0) + - DatadogLogs (2.30.0): + - DatadogInternal (= 2.30.0) + - DatadogRUM (2.30.0): + - DatadogInternal (= 2.30.0) + - DatadogSDKReactNative (2.12.2): + - DatadogCore (= 2.30.0) + - DatadogCrashReporting (= 2.30.0) + - DatadogLogs (= 2.30.0) + - DatadogRUM (= 2.30.0) + - DatadogTrace (= 2.30.0) + - DatadogWebViewTracking (= 2.30.0) + - React-Core + - DatadogTrace (2.30.0): + - DatadogInternal (= 2.30.0) - OpenTelemetrySwiftApi (= 1.13.1) - - DatadogWebViewTracking (2.27.0): - - DatadogInternal (= 2.27.0) + - DatadogWebViewTracking (2.30.0): + - DatadogInternal (= 2.30.0) - DoubleConversion (1.1.6) - EthersRS (0.0.5) - - Expo (52.0.46): + - EXConstants (17.1.7): + - ExpoModulesCore + - EXJSONUtils (0.15.0) + - EXManifests (0.16.6): + - ExpoModulesCore + - Expo (53.0.22): + - DoubleConversion + - ExpoModulesCore + - glog + - hermes-engine + - RCT-Folly (= 2024.11.18.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-hermes + - React-ImageManager + - React-jsi + - React-NativeModulesApple + - React-RCTAppDelegate + - React-RCTFabric + - React-renderercss + - React-rendererdebug + - React-utils + - ReactAppDependencyProvider + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - Yoga + - expo-dev-client (5.2.4): + - EXManifests + - expo-dev-launcher + - expo-dev-menu + - expo-dev-menu-interface + - EXUpdatesInterface + - expo-dev-launcher (5.1.16): + - DoubleConversion + - EXManifests + - expo-dev-launcher/Main (= 5.1.16) + - expo-dev-menu + - expo-dev-menu-interface + - ExpoModulesCore + - EXUpdatesInterface + - glog + - hermes-engine + - RCT-Folly (= 2024.11.18.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-hermes + - React-ImageManager + - React-jsi + - React-jsinspector + - React-NativeModulesApple + - React-RCTAppDelegate + - React-RCTFabric + - React-renderercss + - React-rendererdebug + - React-utils + - ReactAppDependencyProvider + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - Yoga + - expo-dev-launcher/Main (5.1.16): + - DoubleConversion + - EXManifests + - expo-dev-launcher/Unsafe + - expo-dev-menu + - expo-dev-menu-interface - ExpoModulesCore - - ExpoAsset (11.0.5): + - EXUpdatesInterface + - glog + - hermes-engine + - RCT-Folly (= 2024.11.18.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-hermes + - React-ImageManager + - React-jsi + - React-jsinspector + - React-NativeModulesApple + - React-RCTAppDelegate + - React-RCTFabric + - React-renderercss + - React-rendererdebug + - React-utils + - ReactAppDependencyProvider + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - Yoga + - expo-dev-launcher/Unsafe (5.1.16): + - DoubleConversion + - EXManifests + - expo-dev-menu + - expo-dev-menu-interface - ExpoModulesCore - - ExpoBlur (14.0.3): + - EXUpdatesInterface + - glog + - hermes-engine + - RCT-Folly (= 2024.11.18.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-hermes + - React-ImageManager + - React-jsi + - React-jsinspector + - React-NativeModulesApple + - React-RCTAppDelegate + - React-RCTFabric + - React-renderercss + - React-rendererdebug + - React-utils + - ReactAppDependencyProvider + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - Yoga + - expo-dev-menu (6.1.14): + - DoubleConversion + - expo-dev-menu/Main (= 6.1.14) + - expo-dev-menu/ReactNativeCompatibles (= 6.1.14) + - glog + - hermes-engine + - RCT-Folly (= 2024.11.18.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-hermes + - React-ImageManager + - React-jsi + - React-NativeModulesApple + - React-RCTFabric + - React-renderercss + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - Yoga + - expo-dev-menu-interface (1.10.0) + - expo-dev-menu/Main (6.1.14): + - DoubleConversion + - EXManifests + - expo-dev-menu-interface + - expo-dev-menu/Vendored - ExpoModulesCore - - ExpoCamera (16.0.18): + - glog + - hermes-engine + - RCT-Folly (= 2024.11.18.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-hermes + - React-ImageManager + - React-jsi + - React-jsinspector + - React-NativeModulesApple + - React-RCTFabric + - React-rendererconsistency + - React-renderercss + - React-rendererdebug + - React-utils + - ReactAppDependencyProvider + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - Yoga + - expo-dev-menu/ReactNativeCompatibles (6.1.14): + - DoubleConversion + - glog + - hermes-engine + - RCT-Folly (= 2024.11.18.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-hermes + - React-ImageManager + - React-jsi + - React-NativeModulesApple + - React-RCTFabric + - React-renderercss + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - Yoga + - expo-dev-menu/SafeAreaView (6.1.14): + - DoubleConversion + - ExpoModulesCore + - glog + - hermes-engine + - RCT-Folly (= 2024.11.18.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-hermes + - React-ImageManager + - React-jsi + - React-NativeModulesApple + - React-RCTFabric + - React-renderercss + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - Yoga + - expo-dev-menu/Vendored (6.1.14): + - DoubleConversion + - expo-dev-menu/SafeAreaView + - glog + - hermes-engine + - RCT-Folly (= 2024.11.18.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-hermes + - React-ImageManager + - React-jsi + - React-NativeModulesApple + - React-RCTFabric + - React-renderercss + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - Yoga + - ExpoAsset (11.1.7): + - ExpoModulesCore + - ExpoBlur (14.1.5): + - ExpoModulesCore + - ExpoCamera (16.1.11): - ExpoModulesCore - ZXingObjC/OneD - ZXingObjC/PDF417 - - ExpoClipboard (7.0.1): + - ExpoClipboard (7.1.5): - ExpoModulesCore - - ExpoFileSystem (18.0.12): + - ExpoFileSystem (18.1.11): - ExpoModulesCore - - ExpoFont (13.0.4): + - ExpoFont (13.3.2): - ExpoModulesCore - ExpoHaptics (14.0.1): - ExpoModulesCore - - ExpoKeepAwake (14.0.3): + - ExpoKeepAwake (14.1.4): - ExpoModulesCore - - ExpoLinearGradient (14.0.2): + - ExpoLinearGradient (14.1.5): - ExpoModulesCore - - ExpoLinking (7.0.5): + - ExpoLinking (7.1.7): - ExpoModulesCore - - ExpoLocalAuthentication (15.0.2): + - ExpoLocalAuthentication (16.0.5): - ExpoModulesCore - - ExpoLocalization (16.0.1): + - ExpoLocalization (16.1.6): - ExpoModulesCore - - ExpoModulesCore (2.2.3): + - ExpoModulesCore (2.5.0): - DoubleConversion - glog - hermes-engine @@ -1226,28 +1492,31 @@ PODS: - React-Fabric - React-featureflags - React-graphics + - React-hermes - React-ImageManager + - React-jsi - React-jsinspector - React-NativeModulesApple - - React-RCTAppDelegate - React-RCTFabric + - React-renderercss - React-rendererdebug - React-utils - - ReactAppDependencyProvider - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - Yoga - - ExpoScreenCapture (7.0.1): + - ExpoScreenCapture (7.2.0): - ExpoModulesCore - ExpoSecureStore (14.0.1): - ExpoModulesCore - - ExpoStoreReview (8.0.1): + - ExpoStoreReview (8.1.5): + - ExpoModulesCore + - ExpoWebBrowser (14.2.0): - ExpoModulesCore - - ExpoWebBrowser (14.0.2): + - EXUpdatesInterface (1.1.0): - ExpoModulesCore - fast_float (6.1.4) - - FBLazyVector (0.77.2) + - FBLazyVector (0.79.5) - Firebase/Auth (11.2.0): - Firebase/CoreOnly - FirebaseAuth (~> 11.2.0) @@ -1256,7 +1525,7 @@ PODS: - Firebase/Firestore (11.2.0): - Firebase/CoreOnly - FirebaseFirestore (~> 11.2.0) - - FirebaseAppCheckInterop (11.14.0) + - FirebaseAppCheckInterop (11.15.0) - FirebaseAuth (11.2.0): - FirebaseAppCheckInterop (~> 11.0) - FirebaseAuthInterop (~> 11.0) @@ -1266,14 +1535,14 @@ PODS: - GoogleUtilities/Environment (~> 8.0) - GTMSessionFetcher/Core (~> 3.4) - RecaptchaInterop (~> 100.0) - - FirebaseAuthInterop (11.14.0) + - FirebaseAuthInterop (11.15.0) - FirebaseCore (11.2.0): - FirebaseCoreInternal (~> 11.0) - GoogleUtilities/Environment (~> 8.0) - GoogleUtilities/Logger (~> 8.0) - FirebaseCoreExtension (11.4.1): - FirebaseCore (~> 11.0) - - FirebaseCoreInternal (11.14.0): + - FirebaseCoreInternal (11.15.0): - "GoogleUtilities/NSData+zlib (~> 8.1)" - FirebaseFirestore (11.2.0): - FirebaseCore (~> 11.0) @@ -1295,7 +1564,7 @@ PODS: - gRPC-Core (~> 1.65.0) - leveldb-library (~> 1.22) - nanopb (~> 3.30910.0) - - FirebaseSharedSwift (11.14.0) + - FirebaseSharedSwift (11.15.0) - fmt (11.0.2) - glog (0.3.5) - GoogleUtilities/AppDelegateSwizzler (8.1.0): @@ -1410,9 +1679,9 @@ PODS: - gRPC-Core/Interface (1.65.5) - gRPC-Core/Privacy (1.65.5) - GTMSessionFetcher/Core (3.5.0) - - hermes-engine (0.77.2): - - hermes-engine/Pre-built (= 0.77.2) - - hermes-engine/Pre-built (0.77.2) + - hermes-engine (0.79.5): + - hermes-engine/Pre-built (= 0.79.5) + - hermes-engine/Pre-built (0.79.5) - leveldb-library (1.22.6) - libwebp (1.5.0): - libwebp/demux (= 1.5.0) @@ -1426,9 +1695,9 @@ PODS: - libwebp/sharpyuv (1.5.0) - libwebp/webp (1.5.0): - libwebp/sharpyuv - - MMKV (2.2.2): - - MMKVCore (~> 2.2.2) - - MMKVCore (2.2.2) + - MMKV (2.2.4): + - MMKVCore (~> 2.2.4) + - MMKVCore (2.2.4) - nanopb (3.30910.0): - nanopb/decode (= 3.30910.0) - nanopb/encode (= 3.30910.0) @@ -1501,44 +1770,45 @@ PODS: - fast_float (= 6.1.4) - fmt (= 11.0.2) - glog - - RCTDeprecation (0.77.2) - - RCTRequired (0.77.2) - - RCTTypeSafety (0.77.2): - - FBLazyVector (= 0.77.2) - - RCTRequired (= 0.77.2) - - React-Core (= 0.77.2) - - React (0.77.2): - - React-Core (= 0.77.2) - - React-Core/DevSupport (= 0.77.2) - - React-Core/RCTWebSocket (= 0.77.2) - - React-RCTActionSheet (= 0.77.2) - - React-RCTAnimation (= 0.77.2) - - React-RCTBlob (= 0.77.2) - - React-RCTImage (= 0.77.2) - - React-RCTLinking (= 0.77.2) - - React-RCTNetwork (= 0.77.2) - - React-RCTSettings (= 0.77.2) - - React-RCTText (= 0.77.2) - - React-RCTVibration (= 0.77.2) - - React-callinvoker (0.77.2) - - React-Core (0.77.2): + - RCTDeprecation (0.79.5) + - RCTRequired (0.79.5) + - RCTTypeSafety (0.79.5): + - FBLazyVector (= 0.79.5) + - RCTRequired (= 0.79.5) + - React-Core (= 0.79.5) + - React (0.79.5): + - React-Core (= 0.79.5) + - React-Core/DevSupport (= 0.79.5) + - React-Core/RCTWebSocket (= 0.79.5) + - React-RCTActionSheet (= 0.79.5) + - React-RCTAnimation (= 0.79.5) + - React-RCTBlob (= 0.79.5) + - React-RCTImage (= 0.79.5) + - React-RCTLinking (= 0.79.5) + - React-RCTNetwork (= 0.79.5) + - React-RCTSettings (= 0.79.5) + - React-RCTText (= 0.79.5) + - React-RCTVibration (= 0.79.5) + - React-callinvoker (0.79.5) + - React-Core (0.79.5): - glog - hermes-engine - RCT-Folly (= 2024.11.18.00) - RCTDeprecation - - React-Core/Default (= 0.77.2) + - React-Core/Default (= 0.79.5) - React-cxxreact - React-featureflags - React-hermes - React-jsi - React-jsiexecutor - React-jsinspector + - React-jsitooling - React-perflogger - React-runtimescheduler - React-utils - SocketRocket (= 0.7.1) - Yoga - - React-Core/CoreModulesHeaders (0.77.2): + - React-Core/CoreModulesHeaders (0.79.5): - glog - hermes-engine - RCT-Folly (= 2024.11.18.00) @@ -1550,12 +1820,13 @@ PODS: - React-jsi - React-jsiexecutor - React-jsinspector + - React-jsitooling - React-perflogger - React-runtimescheduler - React-utils - SocketRocket (= 0.7.1) - Yoga - - React-Core/Default (0.77.2): + - React-Core/Default (0.79.5): - glog - hermes-engine - RCT-Folly (= 2024.11.18.00) @@ -1566,30 +1837,32 @@ PODS: - React-jsi - React-jsiexecutor - React-jsinspector + - React-jsitooling - React-perflogger - React-runtimescheduler - React-utils - SocketRocket (= 0.7.1) - Yoga - - React-Core/DevSupport (0.77.2): + - React-Core/DevSupport (0.79.5): - glog - hermes-engine - RCT-Folly (= 2024.11.18.00) - RCTDeprecation - - React-Core/Default (= 0.77.2) - - React-Core/RCTWebSocket (= 0.77.2) + - React-Core/Default (= 0.79.5) + - React-Core/RCTWebSocket (= 0.79.5) - React-cxxreact - React-featureflags - React-hermes - React-jsi - React-jsiexecutor - React-jsinspector + - React-jsitooling - React-perflogger - React-runtimescheduler - React-utils - SocketRocket (= 0.7.1) - Yoga - - React-Core/RCTActionSheetHeaders (0.77.2): + - React-Core/RCTActionSheetHeaders (0.79.5): - glog - hermes-engine - RCT-Folly (= 2024.11.18.00) @@ -1601,12 +1874,13 @@ PODS: - React-jsi - React-jsiexecutor - React-jsinspector + - React-jsitooling - React-perflogger - React-runtimescheduler - React-utils - SocketRocket (= 0.7.1) - Yoga - - React-Core/RCTAnimationHeaders (0.77.2): + - React-Core/RCTAnimationHeaders (0.79.5): - glog - hermes-engine - RCT-Folly (= 2024.11.18.00) @@ -1618,12 +1892,13 @@ PODS: - React-jsi - React-jsiexecutor - React-jsinspector + - React-jsitooling - React-perflogger - React-runtimescheduler - React-utils - SocketRocket (= 0.7.1) - Yoga - - React-Core/RCTBlobHeaders (0.77.2): + - React-Core/RCTBlobHeaders (0.79.5): - glog - hermes-engine - RCT-Folly (= 2024.11.18.00) @@ -1635,12 +1910,13 @@ PODS: - React-jsi - React-jsiexecutor - React-jsinspector + - React-jsitooling - React-perflogger - React-runtimescheduler - React-utils - SocketRocket (= 0.7.1) - Yoga - - React-Core/RCTImageHeaders (0.77.2): + - React-Core/RCTImageHeaders (0.79.5): - glog - hermes-engine - RCT-Folly (= 2024.11.18.00) @@ -1652,12 +1928,13 @@ PODS: - React-jsi - React-jsiexecutor - React-jsinspector + - React-jsitooling - React-perflogger - React-runtimescheduler - React-utils - SocketRocket (= 0.7.1) - Yoga - - React-Core/RCTLinkingHeaders (0.77.2): + - React-Core/RCTLinkingHeaders (0.79.5): - glog - hermes-engine - RCT-Folly (= 2024.11.18.00) @@ -1669,12 +1946,13 @@ PODS: - React-jsi - React-jsiexecutor - React-jsinspector + - React-jsitooling - React-perflogger - React-runtimescheduler - React-utils - SocketRocket (= 0.7.1) - Yoga - - React-Core/RCTNetworkHeaders (0.77.2): + - React-Core/RCTNetworkHeaders (0.79.5): - glog - hermes-engine - RCT-Folly (= 2024.11.18.00) @@ -1686,12 +1964,13 @@ PODS: - React-jsi - React-jsiexecutor - React-jsinspector + - React-jsitooling - React-perflogger - React-runtimescheduler - React-utils - SocketRocket (= 0.7.1) - Yoga - - React-Core/RCTSettingsHeaders (0.77.2): + - React-Core/RCTSettingsHeaders (0.79.5): - glog - hermes-engine - RCT-Folly (= 2024.11.18.00) @@ -1703,12 +1982,13 @@ PODS: - React-jsi - React-jsiexecutor - React-jsinspector + - React-jsitooling - React-perflogger - React-runtimescheduler - React-utils - SocketRocket (= 0.7.1) - Yoga - - React-Core/RCTTextHeaders (0.77.2): + - React-Core/RCTTextHeaders (0.79.5): - glog - hermes-engine - RCT-Folly (= 2024.11.18.00) @@ -1720,12 +2000,13 @@ PODS: - React-jsi - React-jsiexecutor - React-jsinspector + - React-jsitooling - React-perflogger - React-runtimescheduler - React-utils - SocketRocket (= 0.7.1) - Yoga - - React-Core/RCTVibrationHeaders (0.77.2): + - React-Core/RCTVibrationHeaders (0.79.5): - glog - hermes-engine - RCT-Folly (= 2024.11.18.00) @@ -1737,44 +2018,47 @@ PODS: - React-jsi - React-jsiexecutor - React-jsinspector + - React-jsitooling - React-perflogger - React-runtimescheduler - React-utils - SocketRocket (= 0.7.1) - Yoga - - React-Core/RCTWebSocket (0.77.2): + - React-Core/RCTWebSocket (0.79.5): - glog - hermes-engine - RCT-Folly (= 2024.11.18.00) - RCTDeprecation - - React-Core/Default (= 0.77.2) + - React-Core/Default (= 0.79.5) - React-cxxreact - React-featureflags - React-hermes - React-jsi - React-jsiexecutor - React-jsinspector + - React-jsitooling - React-perflogger - React-runtimescheduler - React-utils - SocketRocket (= 0.7.1) - Yoga - - React-CoreModules (0.77.2): + - React-CoreModules (0.79.5): - DoubleConversion - fast_float (= 6.1.4) - fmt (= 11.0.2) - RCT-Folly (= 2024.11.18.00) - - RCTTypeSafety (= 0.77.2) - - React-Core/CoreModulesHeaders (= 0.77.2) - - React-jsi (= 0.77.2) + - RCTTypeSafety (= 0.79.5) + - React-Core/CoreModulesHeaders (= 0.79.5) + - React-jsi (= 0.79.5) - React-jsinspector + - React-jsinspectortracing - React-NativeModulesApple - React-RCTBlob - React-RCTFBReactNativeSpec - - React-RCTImage (= 0.77.2) + - React-RCTImage (= 0.79.5) - ReactCommon - SocketRocket (= 0.7.1) - - React-cxxreact (0.77.2): + - React-cxxreact (0.79.5): - boost - DoubleConversion - fast_float (= 6.1.4) @@ -1782,37 +2066,40 @@ PODS: - glog - hermes-engine - RCT-Folly (= 2024.11.18.00) - - React-callinvoker (= 0.77.2) - - React-debug (= 0.77.2) - - React-jsi (= 0.77.2) + - React-callinvoker (= 0.79.5) + - React-debug (= 0.79.5) + - React-jsi (= 0.79.5) - React-jsinspector - - React-logger (= 0.77.2) - - React-perflogger (= 0.77.2) - - React-runtimeexecutor (= 0.77.2) - - React-timing (= 0.77.2) - - React-debug (0.77.2) - - React-defaultsnativemodule (0.77.2): + - React-jsinspectortracing + - React-logger (= 0.79.5) + - React-perflogger (= 0.79.5) + - React-runtimeexecutor (= 0.79.5) + - React-timing (= 0.79.5) + - React-debug (0.79.5) + - React-defaultsnativemodule (0.79.5): - hermes-engine - RCT-Folly - React-domnativemodule - React-featureflagsnativemodule + - React-hermes - React-idlecallbacksnativemodule - React-jsi - React-jsiexecutor - React-microtasksnativemodule - React-RCTFBReactNativeSpec - - React-domnativemodule (0.77.2): + - React-domnativemodule (0.79.5): - hermes-engine - RCT-Folly - React-Fabric - React-FabricComponents - React-graphics + - React-hermes - React-jsi - React-jsiexecutor - React-RCTFBReactNativeSpec - ReactCommon/turbomodule/core - Yoga - - React-Fabric (0.77.2): + - React-Fabric (0.79.5): - DoubleConversion - fast_float (= 6.1.4) - fmt (= 11.0.2) @@ -1824,23 +2111,25 @@ PODS: - React-Core - React-cxxreact - React-debug - - React-Fabric/animations (= 0.77.2) - - React-Fabric/attributedstring (= 0.77.2) - - React-Fabric/componentregistry (= 0.77.2) - - React-Fabric/componentregistrynative (= 0.77.2) - - React-Fabric/components (= 0.77.2) - - React-Fabric/core (= 0.77.2) - - React-Fabric/dom (= 0.77.2) - - React-Fabric/imagemanager (= 0.77.2) - - React-Fabric/leakchecker (= 0.77.2) - - React-Fabric/mounting (= 0.77.2) - - React-Fabric/observers (= 0.77.2) - - React-Fabric/scheduler (= 0.77.2) - - React-Fabric/telemetry (= 0.77.2) - - React-Fabric/templateprocessor (= 0.77.2) - - React-Fabric/uimanager (= 0.77.2) + - React-Fabric/animations (= 0.79.5) + - React-Fabric/attributedstring (= 0.79.5) + - React-Fabric/componentregistry (= 0.79.5) + - React-Fabric/componentregistrynative (= 0.79.5) + - React-Fabric/components (= 0.79.5) + - React-Fabric/consistency (= 0.79.5) + - React-Fabric/core (= 0.79.5) + - React-Fabric/dom (= 0.79.5) + - React-Fabric/imagemanager (= 0.79.5) + - React-Fabric/leakchecker (= 0.79.5) + - React-Fabric/mounting (= 0.79.5) + - React-Fabric/observers (= 0.79.5) + - React-Fabric/scheduler (= 0.79.5) + - React-Fabric/telemetry (= 0.79.5) + - React-Fabric/templateprocessor (= 0.79.5) + - React-Fabric/uimanager (= 0.79.5) - React-featureflags - React-graphics + - React-hermes - React-jsi - React-jsiexecutor - React-logger @@ -1848,7 +2137,7 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/animations (0.77.2): + - React-Fabric/animations (0.79.5): - DoubleConversion - fast_float (= 6.1.4) - fmt (= 11.0.2) @@ -1862,6 +2151,29 @@ PODS: - React-debug - React-featureflags - React-graphics + - React-hermes + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - React-Fabric/attributedstring (0.79.5): + - DoubleConversion + - fast_float (= 6.1.4) + - fmt (= 11.0.2) + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.11.18.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-hermes - React-jsi - React-jsiexecutor - React-logger @@ -1869,7 +2181,7 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/attributedstring (0.77.2): + - React-Fabric/componentregistry (0.79.5): - DoubleConversion - fast_float (= 6.1.4) - fmt (= 11.0.2) @@ -1883,6 +2195,7 @@ PODS: - React-debug - React-featureflags - React-graphics + - React-hermes - React-jsi - React-jsiexecutor - React-logger @@ -1890,7 +2203,7 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/componentregistry (0.77.2): + - React-Fabric/componentregistrynative (0.79.5): - DoubleConversion - fast_float (= 6.1.4) - fmt (= 11.0.2) @@ -1904,6 +2217,7 @@ PODS: - React-debug - React-featureflags - React-graphics + - React-hermes - React-jsi - React-jsiexecutor - React-logger @@ -1911,7 +2225,7 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/componentregistrynative (0.77.2): + - React-Fabric/components (0.79.5): - DoubleConversion - fast_float (= 6.1.4) - fmt (= 11.0.2) @@ -1923,8 +2237,13 @@ PODS: - React-Core - React-cxxreact - React-debug + - React-Fabric/components/legacyviewmanagerinterop (= 0.79.5) + - React-Fabric/components/root (= 0.79.5) + - React-Fabric/components/scrollview (= 0.79.5) + - React-Fabric/components/view (= 0.79.5) - React-featureflags - React-graphics + - React-hermes - React-jsi - React-jsiexecutor - React-logger @@ -1932,7 +2251,7 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/components (0.77.2): + - React-Fabric/components/legacyviewmanagerinterop (0.79.5): - DoubleConversion - fast_float (= 6.1.4) - fmt (= 11.0.2) @@ -1944,11 +2263,9 @@ PODS: - React-Core - React-cxxreact - React-debug - - React-Fabric/components/legacyviewmanagerinterop (= 0.77.2) - - React-Fabric/components/root (= 0.77.2) - - React-Fabric/components/view (= 0.77.2) - React-featureflags - React-graphics + - React-hermes - React-jsi - React-jsiexecutor - React-logger @@ -1956,7 +2273,7 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/components/legacyviewmanagerinterop (0.77.2): + - React-Fabric/components/root (0.79.5): - DoubleConversion - fast_float (= 6.1.4) - fmt (= 11.0.2) @@ -1970,6 +2287,7 @@ PODS: - React-debug - React-featureflags - React-graphics + - React-hermes - React-jsi - React-jsiexecutor - React-logger @@ -1977,7 +2295,7 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/components/root (0.77.2): + - React-Fabric/components/scrollview (0.79.5): - DoubleConversion - fast_float (= 6.1.4) - fmt (= 11.0.2) @@ -1991,6 +2309,7 @@ PODS: - React-debug - React-featureflags - React-graphics + - React-hermes - React-jsi - React-jsiexecutor - React-logger @@ -1998,7 +2317,7 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/components/view (0.77.2): + - React-Fabric/components/view (0.79.5): - DoubleConversion - fast_float (= 6.1.4) - fmt (= 11.0.2) @@ -2012,15 +2331,39 @@ PODS: - React-debug - React-featureflags - React-graphics + - React-hermes - React-jsi - React-jsiexecutor - React-logger + - React-renderercss - React-rendererdebug - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - Yoga - - React-Fabric/core (0.77.2): + - React-Fabric/consistency (0.79.5): + - DoubleConversion + - fast_float (= 6.1.4) + - fmt (= 11.0.2) + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.11.18.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-hermes + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - React-Fabric/core (0.79.5): - DoubleConversion - fast_float (= 6.1.4) - fmt (= 11.0.2) @@ -2034,6 +2377,7 @@ PODS: - React-debug - React-featureflags - React-graphics + - React-hermes - React-jsi - React-jsiexecutor - React-logger @@ -2041,7 +2385,7 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/dom (0.77.2): + - React-Fabric/dom (0.79.5): - DoubleConversion - fast_float (= 6.1.4) - fmt (= 11.0.2) @@ -2055,6 +2399,7 @@ PODS: - React-debug - React-featureflags - React-graphics + - React-hermes - React-jsi - React-jsiexecutor - React-logger @@ -2062,7 +2407,7 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/imagemanager (0.77.2): + - React-Fabric/imagemanager (0.79.5): - DoubleConversion - fast_float (= 6.1.4) - fmt (= 11.0.2) @@ -2076,6 +2421,7 @@ PODS: - React-debug - React-featureflags - React-graphics + - React-hermes - React-jsi - React-jsiexecutor - React-logger @@ -2083,7 +2429,7 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/leakchecker (0.77.2): + - React-Fabric/leakchecker (0.79.5): - DoubleConversion - fast_float (= 6.1.4) - fmt (= 11.0.2) @@ -2097,6 +2443,7 @@ PODS: - React-debug - React-featureflags - React-graphics + - React-hermes - React-jsi - React-jsiexecutor - React-logger @@ -2104,7 +2451,7 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/mounting (0.77.2): + - React-Fabric/mounting (0.79.5): - DoubleConversion - fast_float (= 6.1.4) - fmt (= 11.0.2) @@ -2118,6 +2465,7 @@ PODS: - React-debug - React-featureflags - React-graphics + - React-hermes - React-jsi - React-jsiexecutor - React-logger @@ -2125,7 +2473,7 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/observers (0.77.2): + - React-Fabric/observers (0.79.5): - DoubleConversion - fast_float (= 6.1.4) - fmt (= 11.0.2) @@ -2137,9 +2485,10 @@ PODS: - React-Core - React-cxxreact - React-debug - - React-Fabric/observers/events (= 0.77.2) + - React-Fabric/observers/events (= 0.79.5) - React-featureflags - React-graphics + - React-hermes - React-jsi - React-jsiexecutor - React-logger @@ -2147,7 +2496,7 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/observers/events (0.77.2): + - React-Fabric/observers/events (0.79.5): - DoubleConversion - fast_float (= 6.1.4) - fmt (= 11.0.2) @@ -2161,6 +2510,7 @@ PODS: - React-debug - React-featureflags - React-graphics + - React-hermes - React-jsi - React-jsiexecutor - React-logger @@ -2168,7 +2518,7 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/scheduler (0.77.2): + - React-Fabric/scheduler (0.79.5): - DoubleConversion - fast_float (= 6.1.4) - fmt (= 11.0.2) @@ -2183,6 +2533,7 @@ PODS: - React-Fabric/observers/events - React-featureflags - React-graphics + - React-hermes - React-jsi - React-jsiexecutor - React-logger @@ -2191,7 +2542,7 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/telemetry (0.77.2): + - React-Fabric/telemetry (0.79.5): - DoubleConversion - fast_float (= 6.1.4) - fmt (= 11.0.2) @@ -2205,6 +2556,7 @@ PODS: - React-debug - React-featureflags - React-graphics + - React-hermes - React-jsi - React-jsiexecutor - React-logger @@ -2212,7 +2564,7 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/templateprocessor (0.77.2): + - React-Fabric/templateprocessor (0.79.5): - DoubleConversion - fast_float (= 6.1.4) - fmt (= 11.0.2) @@ -2226,6 +2578,7 @@ PODS: - React-debug - React-featureflags - React-graphics + - React-hermes - React-jsi - React-jsiexecutor - React-logger @@ -2233,7 +2586,7 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/uimanager (0.77.2): + - React-Fabric/uimanager (0.79.5): - DoubleConversion - fast_float (= 6.1.4) - fmt (= 11.0.2) @@ -2245,9 +2598,10 @@ PODS: - React-Core - React-cxxreact - React-debug - - React-Fabric/uimanager/consistency (= 0.77.2) + - React-Fabric/uimanager/consistency (= 0.79.5) - React-featureflags - React-graphics + - React-hermes - React-jsi - React-jsiexecutor - React-logger @@ -2256,7 +2610,7 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/uimanager/consistency (0.77.2): + - React-Fabric/uimanager/consistency (0.79.5): - DoubleConversion - fast_float (= 6.1.4) - fmt (= 11.0.2) @@ -2270,6 +2624,7 @@ PODS: - React-debug - React-featureflags - React-graphics + - React-hermes - React-jsi - React-jsiexecutor - React-logger @@ -2278,7 +2633,7 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-FabricComponents (0.77.2): + - React-FabricComponents (0.79.5): - DoubleConversion - fast_float (= 6.1.4) - fmt (= 11.0.2) @@ -2291,10 +2646,11 @@ PODS: - React-cxxreact - React-debug - React-Fabric - - React-FabricComponents/components (= 0.77.2) - - React-FabricComponents/textlayoutmanager (= 0.77.2) + - React-FabricComponents/components (= 0.79.5) + - React-FabricComponents/textlayoutmanager (= 0.79.5) - React-featureflags - React-graphics + - React-hermes - React-jsi - React-jsiexecutor - React-logger @@ -2303,7 +2659,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - Yoga - - React-FabricComponents/components (0.77.2): + - React-FabricComponents/components (0.79.5): - DoubleConversion - fast_float (= 6.1.4) - fmt (= 11.0.2) @@ -2316,17 +2672,18 @@ PODS: - React-cxxreact - React-debug - React-Fabric - - React-FabricComponents/components/inputaccessory (= 0.77.2) - - React-FabricComponents/components/iostextinput (= 0.77.2) - - React-FabricComponents/components/modal (= 0.77.2) - - React-FabricComponents/components/rncore (= 0.77.2) - - React-FabricComponents/components/safeareaview (= 0.77.2) - - React-FabricComponents/components/scrollview (= 0.77.2) - - React-FabricComponents/components/text (= 0.77.2) - - React-FabricComponents/components/textinput (= 0.77.2) - - React-FabricComponents/components/unimplementedview (= 0.77.2) + - React-FabricComponents/components/inputaccessory (= 0.79.5) + - React-FabricComponents/components/iostextinput (= 0.79.5) + - React-FabricComponents/components/modal (= 0.79.5) + - React-FabricComponents/components/rncore (= 0.79.5) + - React-FabricComponents/components/safeareaview (= 0.79.5) + - React-FabricComponents/components/scrollview (= 0.79.5) + - React-FabricComponents/components/text (= 0.79.5) + - React-FabricComponents/components/textinput (= 0.79.5) + - React-FabricComponents/components/unimplementedview (= 0.79.5) - React-featureflags - React-graphics + - React-hermes - React-jsi - React-jsiexecutor - React-logger @@ -2335,7 +2692,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - Yoga - - React-FabricComponents/components/inputaccessory (0.77.2): + - React-FabricComponents/components/inputaccessory (0.79.5): - DoubleConversion - fast_float (= 6.1.4) - fmt (= 11.0.2) @@ -2350,6 +2707,7 @@ PODS: - React-Fabric - React-featureflags - React-graphics + - React-hermes - React-jsi - React-jsiexecutor - React-logger @@ -2358,7 +2716,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - Yoga - - React-FabricComponents/components/iostextinput (0.77.2): + - React-FabricComponents/components/iostextinput (0.79.5): - DoubleConversion - fast_float (= 6.1.4) - fmt (= 11.0.2) @@ -2373,6 +2731,7 @@ PODS: - React-Fabric - React-featureflags - React-graphics + - React-hermes - React-jsi - React-jsiexecutor - React-logger @@ -2381,7 +2740,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - Yoga - - React-FabricComponents/components/modal (0.77.2): + - React-FabricComponents/components/modal (0.79.5): - DoubleConversion - fast_float (= 6.1.4) - fmt (= 11.0.2) @@ -2396,6 +2755,7 @@ PODS: - React-Fabric - React-featureflags - React-graphics + - React-hermes - React-jsi - React-jsiexecutor - React-logger @@ -2404,7 +2764,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - Yoga - - React-FabricComponents/components/rncore (0.77.2): + - React-FabricComponents/components/rncore (0.79.5): - DoubleConversion - fast_float (= 6.1.4) - fmt (= 11.0.2) @@ -2419,6 +2779,7 @@ PODS: - React-Fabric - React-featureflags - React-graphics + - React-hermes - React-jsi - React-jsiexecutor - React-logger @@ -2427,7 +2788,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - Yoga - - React-FabricComponents/components/safeareaview (0.77.2): + - React-FabricComponents/components/safeareaview (0.79.5): - DoubleConversion - fast_float (= 6.1.4) - fmt (= 11.0.2) @@ -2442,6 +2803,7 @@ PODS: - React-Fabric - React-featureflags - React-graphics + - React-hermes - React-jsi - React-jsiexecutor - React-logger @@ -2450,7 +2812,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - Yoga - - React-FabricComponents/components/scrollview (0.77.2): + - React-FabricComponents/components/scrollview (0.79.5): - DoubleConversion - fast_float (= 6.1.4) - fmt (= 11.0.2) @@ -2465,6 +2827,7 @@ PODS: - React-Fabric - React-featureflags - React-graphics + - React-hermes - React-jsi - React-jsiexecutor - React-logger @@ -2473,7 +2836,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - Yoga - - React-FabricComponents/components/text (0.77.2): + - React-FabricComponents/components/text (0.79.5): - DoubleConversion - fast_float (= 6.1.4) - fmt (= 11.0.2) @@ -2488,6 +2851,7 @@ PODS: - React-Fabric - React-featureflags - React-graphics + - React-hermes - React-jsi - React-jsiexecutor - React-logger @@ -2496,7 +2860,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - Yoga - - React-FabricComponents/components/textinput (0.77.2): + - React-FabricComponents/components/textinput (0.79.5): - DoubleConversion - fast_float (= 6.1.4) - fmt (= 11.0.2) @@ -2511,6 +2875,7 @@ PODS: - React-Fabric - React-featureflags - React-graphics + - React-hermes - React-jsi - React-jsiexecutor - React-logger @@ -2519,7 +2884,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - Yoga - - React-FabricComponents/components/unimplementedview (0.77.2): + - React-FabricComponents/components/unimplementedview (0.79.5): - DoubleConversion - fast_float (= 6.1.4) - fmt (= 11.0.2) @@ -2534,6 +2899,7 @@ PODS: - React-Fabric - React-featureflags - React-graphics + - React-hermes - React-jsi - React-jsiexecutor - React-logger @@ -2542,7 +2908,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - Yoga - - React-FabricComponents/textlayoutmanager (0.77.2): + - React-FabricComponents/textlayoutmanager (0.79.5): - DoubleConversion - fast_float (= 6.1.4) - fmt (= 11.0.2) @@ -2557,6 +2923,7 @@ PODS: - React-Fabric - React-featureflags - React-graphics + - React-hermes - React-jsi - React-jsiexecutor - React-logger @@ -2565,66 +2932,74 @@ PODS: - React-utils - ReactCommon/turbomodule/core - Yoga - - React-FabricImage (0.77.2): + - React-FabricImage (0.79.5): - DoubleConversion - fast_float (= 6.1.4) - fmt (= 11.0.2) - glog - hermes-engine - RCT-Folly/Fabric (= 2024.11.18.00) - - RCTRequired (= 0.77.2) - - RCTTypeSafety (= 0.77.2) + - RCTRequired (= 0.79.5) + - RCTTypeSafety (= 0.79.5) - React-Fabric - React-featureflags - React-graphics + - React-hermes - React-ImageManager - React-jsi - - React-jsiexecutor (= 0.77.2) + - React-jsiexecutor (= 0.79.5) - React-logger - React-rendererdebug - React-utils - ReactCommon - Yoga - - React-featureflags (0.77.2) - - React-featureflagsnativemodule (0.77.2): + - React-featureflags (0.79.5): + - RCT-Folly (= 2024.11.18.00) + - React-featureflagsnativemodule (0.79.5): - hermes-engine - RCT-Folly - React-featureflags + - React-hermes - React-jsi - React-jsiexecutor - React-RCTFBReactNativeSpec - ReactCommon/turbomodule/core - - React-graphics (0.77.2): + - React-graphics (0.79.5): - DoubleConversion - fast_float (= 6.1.4) - fmt (= 11.0.2) - glog + - hermes-engine - RCT-Folly/Fabric (= 2024.11.18.00) + - React-hermes - React-jsi - React-jsiexecutor - React-utils - - React-hermes (0.77.2): + - React-hermes (0.79.5): - DoubleConversion - fast_float (= 6.1.4) - fmt (= 11.0.2) - glog - hermes-engine - RCT-Folly (= 2024.11.18.00) - - React-cxxreact (= 0.77.2) + - React-cxxreact (= 0.79.5) - React-jsi - - React-jsiexecutor (= 0.77.2) + - React-jsiexecutor (= 0.79.5) - React-jsinspector - - React-perflogger (= 0.77.2) + - React-jsinspectortracing + - React-perflogger (= 0.79.5) - React-runtimeexecutor - - React-idlecallbacksnativemodule (0.77.2): + - React-idlecallbacksnativemodule (0.79.5): + - glog - hermes-engine - RCT-Folly + - React-hermes - React-jsi - React-jsiexecutor - React-RCTFBReactNativeSpec - React-runtimescheduler - ReactCommon/turbomodule/core - - React-ImageManager (0.77.2): + - React-ImageManager (0.79.5): - glog - RCT-Folly/Fabric - React-Core/Default @@ -2633,7 +3008,7 @@ PODS: - React-graphics - React-rendererdebug - React-utils - - React-jserrorhandler (0.77.2): + - React-jserrorhandler (0.79.5): - glog - hermes-engine - RCT-Folly/Fabric (= 2024.11.18.00) @@ -2642,7 +3017,7 @@ PODS: - React-featureflags - React-jsi - ReactCommon/turbomodule/bridging - - React-jsi (0.77.2): + - React-jsi (0.79.5): - boost - DoubleConversion - fast_float (= 6.1.4) @@ -2650,36 +3025,52 @@ PODS: - glog - hermes-engine - RCT-Folly (= 2024.11.18.00) - - React-jsiexecutor (0.77.2): + - React-jsiexecutor (0.79.5): - DoubleConversion - fast_float (= 6.1.4) - fmt (= 11.0.2) - glog - hermes-engine - RCT-Folly (= 2024.11.18.00) - - React-cxxreact (= 0.77.2) - - React-jsi (= 0.77.2) + - React-cxxreact (= 0.79.5) + - React-jsi (= 0.79.5) - React-jsinspector - - React-perflogger (= 0.77.2) - - React-jsinspector (0.77.2): + - React-jsinspectortracing + - React-perflogger (= 0.79.5) + - React-jsinspector (0.79.5): - DoubleConversion - glog - hermes-engine - - RCT-Folly (= 2024.11.18.00) + - RCT-Folly - React-featureflags - React-jsi - - React-perflogger (= 0.77.2) - - React-runtimeexecutor (= 0.77.2) - - React-jsitracing (0.77.2): + - React-jsinspectortracing + - React-perflogger (= 0.79.5) + - React-runtimeexecutor (= 0.79.5) + - React-jsinspectortracing (0.79.5): + - RCT-Folly + - React-oscompat + - React-jsitooling (0.79.5): + - DoubleConversion + - fast_float (= 6.1.4) + - fmt (= 11.0.2) + - glog + - RCT-Folly (= 2024.11.18.00) + - React-cxxreact (= 0.79.5) + - React-jsi (= 0.79.5) + - React-jsinspector + - React-jsinspectortracing + - React-jsitracing (0.79.5): - React-jsi - - React-logger (0.77.2): + - React-logger (0.79.5): - glog - - React-Mapbuffer (0.77.2): + - React-Mapbuffer (0.79.5): - glog - React-debug - - React-microtasksnativemodule (0.77.2): + - React-microtasksnativemodule (0.79.5): - hermes-engine - RCT-Folly + - React-hermes - React-jsi - React-jsiexecutor - React-RCTFBReactNativeSpec @@ -2687,7 +3078,7 @@ PODS: - react-native-appsflyer (6.13.1): - AppsFlyerFramework (= 6.13.1) - React - - react-native-compat (2.21.4): + - react-native-compat (2.23.0): - DoubleConversion - glog - hermes-engine @@ -2699,9 +3090,12 @@ PODS: - React-Fabric - React-featureflags - React-graphics + - React-hermes - React-ImageManager + - React-jsi - React-NativeModulesApple - React-RCTFabric + - React-renderercss - React-rendererdebug - React-utils - ReactCodegen @@ -2724,9 +3118,12 @@ PODS: - React-Fabric - React-featureflags - React-graphics + - React-hermes - React-ImageManager + - React-jsi - React-NativeModulesApple - React-RCTFabric + - React-renderercss - React-rendererdebug - React-utils - ReactCodegen @@ -2745,9 +3142,12 @@ PODS: - React-Fabric - React-featureflags - React-graphics + - React-hermes - React-ImageManager + - React-jsi - React-NativeModulesApple - React-RCTFabric + - React-renderercss - React-rendererdebug - React-utils - ReactCodegen @@ -2762,7 +3162,7 @@ PODS: - react-native-onesignal (5.2.9): - OneSignalXCFramework (= 5.2.10) - React (< 1.0.0, >= 0.13.0) - - react-native-pager-view (6.5.1): + - react-native-pager-view (6.7.1): - DoubleConversion - glog - hermes-engine @@ -2774,9 +3174,12 @@ PODS: - React-Fabric - React-featureflags - React-graphics + - React-hermes - React-ImageManager + - React-jsi - React-NativeModulesApple - React-RCTFabric + - React-renderercss - React-rendererdebug - React-utils - ReactCodegen @@ -2787,9 +3190,9 @@ PODS: - React-Core - react-native-restart (0.0.27): - React-Core - - react-native-safe-area-context (5.1.0): + - react-native-safe-area-context (5.4.0): - React-Core - - react-native-skia (1.12.4): + - react-native-skia (2.2.4): - DoubleConversion - glog - hermes-engine @@ -2803,16 +3206,19 @@ PODS: - React-Fabric - React-featureflags - React-graphics + - React-hermes - React-ImageManager + - React-jsi - React-NativeModulesApple - React-RCTFabric + - React-renderercss - React-rendererdebug - React-utils - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - Yoga - - react-native-slider (4.5.5): + - react-native-slider (4.5.6): - DoubleConversion - glog - hermes-engine @@ -2824,9 +3230,12 @@ PODS: - React-Fabric - React-featureflags - React-graphics + - React-hermes - React-ImageManager + - React-jsi - React-NativeModulesApple - React-RCTFabric + - React-renderercss - React-rendererdebug - React-utils - ReactCodegen @@ -2845,10 +3254,13 @@ PODS: - React-Fabric - React-featureflags - React-graphics + - React-hermes - React-ImageManager + - React-jsi - react-native-video/Video (= 6.13.0) - React-NativeModulesApple - React-RCTFabric + - React-renderercss - React-rendererdebug - React-utils - ReactCodegen @@ -2867,9 +3279,12 @@ PODS: - React-Fabric - React-featureflags - React-graphics + - React-hermes - React-ImageManager + - React-jsi - React-NativeModulesApple - React-RCTFabric + - React-renderercss - React-rendererdebug - React-utils - ReactCodegen @@ -2888,9 +3303,12 @@ PODS: - React-Fabric - React-featureflags - React-graphics + - React-hermes - React-ImageManager + - React-jsi - React-NativeModulesApple - React-RCTFabric + - React-renderercss - React-rendererdebug - React-utils - ReactCodegen @@ -2899,29 +3317,33 @@ PODS: - Yoga - react-native-widgetkit (1.0.9): - React - - React-nativeconfig (0.77.2) - - React-NativeModulesApple (0.77.2): + - React-NativeModulesApple (0.79.5): - glog - hermes-engine - React-callinvoker - React-Core - React-cxxreact + - React-featureflags + - React-hermes - React-jsi - React-jsinspector - React-runtimeexecutor - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - React-perflogger (0.77.2): + - React-oscompat (0.79.5) + - React-perflogger (0.79.5): - DoubleConversion - RCT-Folly (= 2024.11.18.00) - - React-performancetimeline (0.77.2): + - React-performancetimeline (0.79.5): - RCT-Folly (= 2024.11.18.00) - React-cxxreact - React-featureflags + - React-jsinspectortracing + - React-perflogger - React-timing - - React-RCTActionSheet (0.77.2): - - React-Core/RCTActionSheetHeaders (= 0.77.2) - - React-RCTAnimation (0.77.2): + - React-RCTActionSheet (0.79.5): + - React-Core/RCTActionSheetHeaders (= 0.79.5) + - React-RCTAnimation (0.79.5): - RCT-Folly (= 2024.11.18.00) - RCTTypeSafety - React-Core/RCTAnimationHeaders @@ -2929,7 +3351,8 @@ PODS: - React-NativeModulesApple - React-RCTFBReactNativeSpec - ReactCommon - - React-RCTAppDelegate (0.77.2): + - React-RCTAppDelegate (0.79.5): + - hermes-engine - RCT-Folly (= 2024.11.18.00) - RCTRequired - RCTTypeSafety @@ -2941,20 +3364,20 @@ PODS: - React-featureflags - React-graphics - React-hermes - - React-nativeconfig + - React-jsitooling - React-NativeModulesApple - React-RCTFabric - React-RCTFBReactNativeSpec - React-RCTImage - React-RCTNetwork + - React-RCTRuntime - React-rendererdebug - React-RuntimeApple - React-RuntimeCore - - React-RuntimeHermes - React-runtimescheduler - React-utils - ReactCommon - - React-RCTBlob (0.77.2): + - React-RCTBlob (0.79.5): - DoubleConversion - fast_float (= 6.1.4) - fmt (= 11.0.2) @@ -2968,7 +3391,7 @@ PODS: - React-RCTFBReactNativeSpec - React-RCTNetwork - ReactCommon - - React-RCTFabric (0.77.2): + - React-RCTFabric (0.79.5): - glog - hermes-engine - RCT-Folly/Fabric (= 2024.11.18.00) @@ -2979,29 +3402,33 @@ PODS: - React-FabricImage - React-featureflags - React-graphics + - React-hermes - React-ImageManager - React-jsi - React-jsinspector - - React-nativeconfig + - React-jsinspectortracing - React-performancetimeline + - React-RCTAnimation - React-RCTImage - React-RCTText - React-rendererconsistency + - React-renderercss - React-rendererdebug - React-runtimescheduler - React-utils - Yoga - - React-RCTFBReactNativeSpec (0.77.2): + - React-RCTFBReactNativeSpec (0.79.5): - hermes-engine - RCT-Folly - RCTRequired - RCTTypeSafety - React-Core + - React-hermes - React-jsi - React-jsiexecutor - React-NativeModulesApple - ReactCommon - - React-RCTImage (0.77.2): + - React-RCTImage (0.79.5): - RCT-Folly (= 2024.11.18.00) - RCTTypeSafety - React-Core/RCTImageHeaders @@ -3010,14 +3437,14 @@ PODS: - React-RCTFBReactNativeSpec - React-RCTNetwork - ReactCommon - - React-RCTLinking (0.77.2): - - React-Core/RCTLinkingHeaders (= 0.77.2) - - React-jsi (= 0.77.2) + - React-RCTLinking (0.79.5): + - React-Core/RCTLinkingHeaders (= 0.79.5) + - React-jsi (= 0.79.5) - React-NativeModulesApple - React-RCTFBReactNativeSpec - ReactCommon - - ReactCommon/turbomodule/core (= 0.77.2) - - React-RCTNetwork (0.77.2): + - ReactCommon/turbomodule/core (= 0.79.5) + - React-RCTNetwork (0.79.5): - RCT-Folly (= 2024.11.18.00) - RCTTypeSafety - React-Core/RCTNetworkHeaders @@ -3025,7 +3452,20 @@ PODS: - React-NativeModulesApple - React-RCTFBReactNativeSpec - ReactCommon - - React-RCTSettings (0.77.2): + - React-RCTRuntime (0.79.5): + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.11.18.00) + - React-Core + - React-hermes + - React-jsi + - React-jsinspector + - React-jsinspectortracing + - React-jsitooling + - React-RuntimeApple + - React-RuntimeCore + - React-RuntimeHermes + - React-RCTSettings (0.79.5): - RCT-Folly (= 2024.11.18.00) - RCTTypeSafety - React-Core/RCTSettingsHeaders @@ -3033,25 +3473,28 @@ PODS: - React-NativeModulesApple - React-RCTFBReactNativeSpec - ReactCommon - - React-RCTText (0.77.2): - - React-Core/RCTTextHeaders (= 0.77.2) + - React-RCTText (0.79.5): + - React-Core/RCTTextHeaders (= 0.79.5) - Yoga - - React-RCTVibration (0.77.2): + - React-RCTVibration (0.79.5): - RCT-Folly (= 2024.11.18.00) - React-Core/RCTVibrationHeaders - React-jsi - React-NativeModulesApple - React-RCTFBReactNativeSpec - ReactCommon - - React-rendererconsistency (0.77.2) - - React-rendererdebug (0.77.2): + - React-rendererconsistency (0.79.5) + - React-renderercss (0.79.5): + - React-debug + - React-utils + - React-rendererdebug (0.79.5): - DoubleConversion - fast_float (= 6.1.4) - fmt (= 11.0.2) - RCT-Folly (= 2024.11.18.00) - React-debug - - React-rncore (0.77.2) - - React-RuntimeApple (0.77.2): + - React-rncore (0.79.5) + - React-RuntimeApple (0.79.5): - hermes-engine - RCT-Folly/Fabric (= 2024.11.18.00) - React-callinvoker @@ -3063,6 +3506,7 @@ PODS: - React-jsi - React-jsiexecutor - React-jsinspector + - React-jsitooling - React-Mapbuffer - React-NativeModulesApple - React-RCTFabric @@ -3072,35 +3516,38 @@ PODS: - React-RuntimeHermes - React-runtimescheduler - React-utils - - React-RuntimeCore (0.77.2): + - React-RuntimeCore (0.79.5): - glog - hermes-engine - RCT-Folly/Fabric (= 2024.11.18.00) - React-cxxreact - React-Fabric - React-featureflags + - React-hermes - React-jserrorhandler - React-jsi - React-jsiexecutor - React-jsinspector + - React-jsitooling - React-performancetimeline - React-runtimeexecutor - React-runtimescheduler - React-utils - - React-runtimeexecutor (0.77.2): - - React-jsi (= 0.77.2) - - React-RuntimeHermes (0.77.2): + - React-runtimeexecutor (0.79.5): + - React-jsi (= 0.79.5) + - React-RuntimeHermes (0.79.5): - hermes-engine - RCT-Folly/Fabric (= 2024.11.18.00) - React-featureflags - React-hermes - React-jsi - React-jsinspector + - React-jsinspectortracing + - React-jsitooling - React-jsitracing - - React-nativeconfig - React-RuntimeCore - React-utils - - React-runtimescheduler (0.77.2): + - React-runtimescheduler (0.79.5): - glog - hermes-engine - RCT-Folly (= 2024.11.18.00) @@ -3108,23 +3555,26 @@ PODS: - React-cxxreact - React-debug - React-featureflags + - React-hermes - React-jsi + - React-jsinspectortracing - React-performancetimeline - React-rendererconsistency - React-rendererdebug - React-runtimeexecutor - React-timing - React-utils - - React-timing (0.77.2) - - React-utils (0.77.2): + - React-timing (0.79.5) + - React-utils (0.79.5): - glog - hermes-engine - RCT-Folly (= 2024.11.18.00) - React-debug - - React-jsi (= 0.77.2) - - ReactAppDependencyProvider (0.77.2): + - React-hermes + - React-jsi (= 0.79.5) + - ReactAppDependencyProvider (0.79.5): - ReactCodegen - - ReactCodegen (0.77.2): + - ReactCodegen (0.79.5): - DoubleConversion - glog - hermes-engine @@ -3137,6 +3587,7 @@ PODS: - React-FabricImage - React-featureflags - React-graphics + - React-hermes - React-jsi - React-jsiexecutor - React-NativeModulesApple @@ -3145,55 +3596,55 @@ PODS: - React-utils - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - ReactCommon (0.77.2): - - ReactCommon/turbomodule (= 0.77.2) - - ReactCommon/turbomodule (0.77.2): + - ReactCommon (0.79.5): + - ReactCommon/turbomodule (= 0.79.5) + - ReactCommon/turbomodule (0.79.5): - DoubleConversion - fast_float (= 6.1.4) - fmt (= 11.0.2) - glog - hermes-engine - RCT-Folly (= 2024.11.18.00) - - React-callinvoker (= 0.77.2) - - React-cxxreact (= 0.77.2) - - React-jsi (= 0.77.2) - - React-logger (= 0.77.2) - - React-perflogger (= 0.77.2) - - ReactCommon/turbomodule/bridging (= 0.77.2) - - ReactCommon/turbomodule/core (= 0.77.2) - - ReactCommon/turbomodule/bridging (0.77.2): + - React-callinvoker (= 0.79.5) + - React-cxxreact (= 0.79.5) + - React-jsi (= 0.79.5) + - React-logger (= 0.79.5) + - React-perflogger (= 0.79.5) + - ReactCommon/turbomodule/bridging (= 0.79.5) + - ReactCommon/turbomodule/core (= 0.79.5) + - ReactCommon/turbomodule/bridging (0.79.5): - DoubleConversion - fast_float (= 6.1.4) - fmt (= 11.0.2) - glog - hermes-engine - RCT-Folly (= 2024.11.18.00) - - React-callinvoker (= 0.77.2) - - React-cxxreact (= 0.77.2) - - React-jsi (= 0.77.2) - - React-logger (= 0.77.2) - - React-perflogger (= 0.77.2) - - ReactCommon/turbomodule/core (0.77.2): + - React-callinvoker (= 0.79.5) + - React-cxxreact (= 0.79.5) + - React-jsi (= 0.79.5) + - React-logger (= 0.79.5) + - React-perflogger (= 0.79.5) + - ReactCommon/turbomodule/core (0.79.5): - DoubleConversion - fast_float (= 6.1.4) - fmt (= 11.0.2) - glog - hermes-engine - RCT-Folly (= 2024.11.18.00) - - React-callinvoker (= 0.77.2) - - React-cxxreact (= 0.77.2) - - React-debug (= 0.77.2) - - React-featureflags (= 0.77.2) - - React-jsi (= 0.77.2) - - React-logger (= 0.77.2) - - React-perflogger (= 0.77.2) - - React-utils (= 0.77.2) + - React-callinvoker (= 0.79.5) + - React-cxxreact (= 0.79.5) + - React-debug (= 0.79.5) + - React-featureflags (= 0.79.5) + - React-jsi (= 0.79.5) + - React-logger (= 0.79.5) + - React-perflogger (= 0.79.5) + - React-utils (= 0.79.5) - ReactNativePerformance (4.1.2): - React-Core - RecaptchaInterop (100.0.0) - - RNBootSplash (6.3.1): + - RNBootSplash (6.3.10): - React-Core - - RNCAsyncStorage (1.23.1): + - RNCAsyncStorage (2.1.2): - React-Core - RNCMaskedView (0.3.2): - DoubleConversion @@ -3207,16 +3658,19 @@ PODS: - React-Fabric - React-featureflags - React-graphics + - React-hermes - React-ImageManager + - React-jsi - React-NativeModulesApple - React-RCTFabric + - React-renderercss - React-rendererdebug - React-utils - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - Yoga - - RNDateTimePicker (8.2.0): + - RNDateTimePicker (8.4.1): - React-Core - RNDeviceInfo (10.11.0): - React-Core @@ -3235,7 +3689,7 @@ PODS: - Firebase/Firestore (= 11.2.0) - React-Core - RNFBApp - - RNFlashList (1.7.3): + - RNFlashList (1.7.6): - DoubleConversion - glog - hermes-engine @@ -3247,16 +3701,19 @@ PODS: - React-Fabric - React-featureflags - React-graphics + - React-hermes - React-ImageManager + - React-jsi - React-NativeModulesApple - React-RCTFabric + - React-renderercss - React-rendererdebug - React-utils - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - Yoga - - RNGestureHandler (2.22.1): + - RNGestureHandler (2.24.0): - DoubleConversion - glog - hermes-engine @@ -3268,9 +3725,12 @@ PODS: - React-Fabric - React-featureflags - React-graphics + - React-hermes - React-ImageManager + - React-jsi - React-NativeModulesApple - React-RCTFabric + - React-renderercss - React-rendererdebug - React-utils - ReactCodegen @@ -3286,7 +3746,7 @@ PODS: - RNQrGenerator (1.4.3): - React - ZXingObjC - - RNReanimated (3.16.7): + - RNReanimated (3.19.3): - DoubleConversion - glog - hermes-engine @@ -3298,18 +3758,21 @@ PODS: - React-Fabric - React-featureflags - React-graphics + - React-hermes - React-ImageManager + - React-jsi - React-NativeModulesApple - React-RCTFabric + - React-renderercss - React-rendererdebug - React-utils - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - RNReanimated/reanimated (= 3.16.7) - - RNReanimated/worklets (= 3.16.7) + - RNReanimated/reanimated (= 3.19.3) + - RNReanimated/worklets (= 3.19.3) - Yoga - - RNReanimated/reanimated (3.16.7): + - RNReanimated/reanimated (3.19.3): - DoubleConversion - glog - hermes-engine @@ -3321,17 +3784,20 @@ PODS: - React-Fabric - React-featureflags - React-graphics + - React-hermes - React-ImageManager + - React-jsi - React-NativeModulesApple - React-RCTFabric + - React-renderercss - React-rendererdebug - React-utils - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - RNReanimated/reanimated/apple (= 3.16.7) + - RNReanimated/reanimated/apple (= 3.19.3) - Yoga - - RNReanimated/reanimated/apple (3.16.7): + - RNReanimated/reanimated/apple (3.19.3): - DoubleConversion - glog - hermes-engine @@ -3343,16 +3809,19 @@ PODS: - React-Fabric - React-featureflags - React-graphics + - React-hermes - React-ImageManager + - React-jsi - React-NativeModulesApple - React-RCTFabric + - React-renderercss - React-rendererdebug - React-utils - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - Yoga - - RNReanimated/worklets (3.16.7): + - RNReanimated/worklets (3.19.3): - DoubleConversion - glog - hermes-engine @@ -3364,16 +3833,20 @@ PODS: - React-Fabric - React-featureflags - React-graphics + - React-hermes - React-ImageManager + - React-jsi - React-NativeModulesApple - React-RCTFabric + - React-renderercss - React-rendererdebug - React-utils - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core + - RNReanimated/worklets/apple (= 3.19.3) - Yoga - - RNScreens (4.11.0): + - RNReanimated/worklets/apple (3.19.3): - DoubleConversion - glog - hermes-engine @@ -3385,21 +3858,48 @@ PODS: - React-Fabric - React-featureflags - React-graphics + - React-hermes - React-ImageManager + - React-jsi + - React-NativeModulesApple + - React-RCTFabric + - React-renderercss + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - Yoga + - RNScreens (4.11.1): + - DoubleConversion + - glog + - hermes-engine + - RCT-Folly (= 2024.11.18.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-hermes + - React-ImageManager + - React-jsi - React-NativeModulesApple - React-RCTFabric - React-RCTImage + - React-renderercss - React-rendererdebug - React-utils - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - Yoga - - RNSVG (15.11.2): + - RNSVG (15.13.0): - React-Core - - SDWebImage (5.21.1): - - SDWebImage/Core (= 5.21.1) - - SDWebImage/Core (5.21.1) + - SDWebImage (5.21.3): + - SDWebImage/Core (= 5.21.3) + - SDWebImage/Core (5.21.3) - SDWebImageWebPCoder (0.14.6): - libwebp (~> 1.0) - SDWebImage/Core (~> 5.17) @@ -3425,7 +3925,14 @@ DEPENDENCIES: - "DatadogSDKReactNative (from `../../../node_modules/@datadog/mobile-react-native`)" - DoubleConversion (from `../../../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec`) - "EthersRS (from `../../../node_modules/@uniswap/ethers-rs-mobile`)" + - EXConstants (from `../../../node_modules/expo-constants/ios`) + - EXJSONUtils (from `../../../node_modules/expo-json-utils/ios`) + - EXManifests (from `../../../node_modules/expo-manifests/ios`) - Expo (from `../../../node_modules/expo`) + - expo-dev-client (from `../../../node_modules/expo-dev-client/ios`) + - expo-dev-launcher (from `../../../node_modules/expo-dev-launcher`) + - expo-dev-menu (from `../../../node_modules/expo-dev-menu`) + - expo-dev-menu-interface (from `../../../node_modules/expo-dev-menu-interface/ios`) - ExpoAsset (from `../../../node_modules/expo-asset/ios`) - ExpoBlur (from `../../../node_modules/expo-blur/ios`) - ExpoCamera (from `../../../node_modules/expo-camera/ios`) @@ -3443,6 +3950,7 @@ DEPENDENCIES: - ExpoSecureStore (from `../../../node_modules/expo-secure-store/ios`) - ExpoStoreReview (from `../../../node_modules/expo-store-review/ios`) - ExpoWebBrowser (from `../../../node_modules/expo-web-browser/ios`) + - EXUpdatesInterface (from `../../../node_modules/expo-updates-interface/ios`) - fast_float (from `../../../node_modules/react-native/third-party-podspecs/fast_float.podspec`) - FBLazyVector (from `../../../node_modules/react-native/Libraries/FBLazyVector`) - fmt (from `../../../node_modules/react-native/third-party-podspecs/fmt.podspec`) @@ -3476,6 +3984,8 @@ DEPENDENCIES: - React-jsi (from `../../../node_modules/react-native/ReactCommon/jsi`) - React-jsiexecutor (from `../../../node_modules/react-native/ReactCommon/jsiexecutor`) - React-jsinspector (from `../../../node_modules/react-native/ReactCommon/jsinspector-modern`) + - React-jsinspectortracing (from `../../../node_modules/react-native/ReactCommon/jsinspector-modern/tracing`) + - React-jsitooling (from `../../../node_modules/react-native/ReactCommon/jsitooling`) - React-jsitracing (from `../../../node_modules/react-native/ReactCommon/hermes/executor/`) - React-logger (from `../../../node_modules/react-native/ReactCommon/logger`) - React-Mapbuffer (from `../../../node_modules/react-native/ReactCommon`) @@ -3498,8 +4008,8 @@ DEPENDENCIES: - react-native-video (from `../../../node_modules/react-native-video`) - react-native-webview (from `../../../node_modules/react-native-webview`) - react-native-widgetkit (from `../../../node_modules/react-native-widgetkit`) - - React-nativeconfig (from `../../../node_modules/react-native/ReactCommon`) - React-NativeModulesApple (from `../../../node_modules/react-native/ReactCommon/react/nativemodule/core/platform/ios`) + - React-oscompat (from `../../../node_modules/react-native/ReactCommon/oscompat`) - React-perflogger (from `../../../node_modules/react-native/ReactCommon/reactperflogger`) - React-performancetimeline (from `../../../node_modules/react-native/ReactCommon/react/performance/timeline`) - React-RCTActionSheet (from `../../../node_modules/react-native/Libraries/ActionSheetIOS`) @@ -3511,10 +4021,12 @@ DEPENDENCIES: - React-RCTImage (from `../../../node_modules/react-native/Libraries/Image`) - React-RCTLinking (from `../../../node_modules/react-native/Libraries/LinkingIOS`) - React-RCTNetwork (from `../../../node_modules/react-native/Libraries/Network`) + - React-RCTRuntime (from `../../../node_modules/react-native/React/Runtime`) - React-RCTSettings (from `../../../node_modules/react-native/Libraries/Settings`) - React-RCTText (from `../../../node_modules/react-native/Libraries/Text`) - React-RCTVibration (from `../../../node_modules/react-native/Libraries/Vibration`) - React-rendererconsistency (from `../../../node_modules/react-native/ReactCommon/react/renderer/consistency`) + - React-renderercss (from `../../../node_modules/react-native/ReactCommon/react/renderer/css`) - React-rendererdebug (from `../../../node_modules/react-native/ReactCommon/react/renderer/debug`) - React-rncore (from `../../../node_modules/react-native/ReactCommon`) - React-RuntimeApple (from `../../../node_modules/react-native/ReactCommon/react/runtime/platform/ios`) @@ -3604,8 +4116,22 @@ EXTERNAL SOURCES: :podspec: "../../../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec" EthersRS: :path: "../../../node_modules/@uniswap/ethers-rs-mobile" + EXConstants: + :path: "../../../node_modules/expo-constants/ios" + EXJSONUtils: + :path: "../../../node_modules/expo-json-utils/ios" + EXManifests: + :path: "../../../node_modules/expo-manifests/ios" Expo: :path: "../../../node_modules/expo" + expo-dev-client: + :path: "../../../node_modules/expo-dev-client/ios" + expo-dev-launcher: + :path: "../../../node_modules/expo-dev-launcher" + expo-dev-menu: + :path: "../../../node_modules/expo-dev-menu" + expo-dev-menu-interface: + :path: "../../../node_modules/expo-dev-menu-interface/ios" ExpoAsset: :path: "../../../node_modules/expo-asset/ios" ExpoBlur: @@ -3640,6 +4166,8 @@ EXTERNAL SOURCES: :path: "../../../node_modules/expo-store-review/ios" ExpoWebBrowser: :path: "../../../node_modules/expo-web-browser/ios" + EXUpdatesInterface: + :path: "../../../node_modules/expo-updates-interface/ios" fast_float: :podspec: "../../../node_modules/react-native/third-party-podspecs/fast_float.podspec" FBLazyVector: @@ -3650,7 +4178,7 @@ EXTERNAL SOURCES: :podspec: "../../../node_modules/react-native/third-party-podspecs/glog.podspec" hermes-engine: :podspec: "../../../node_modules/react-native/sdks/hermes-engine/hermes-engine.podspec" - :tag: hermes-2024-11-25-RNv0.77.0-d4f25d534ab744866448b36ca3bf3d97c08e638c + :tag: hermes-2025-06-04-RNv0.79.3-7f9a871eefeb2c3852365ee80f0b6733ec12ac3b RCT-Folly: :podspec: "../../../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec" RCTDeprecation: @@ -3701,6 +4229,10 @@ EXTERNAL SOURCES: :path: "../../../node_modules/react-native/ReactCommon/jsiexecutor" React-jsinspector: :path: "../../../node_modules/react-native/ReactCommon/jsinspector-modern" + React-jsinspectortracing: + :path: "../../../node_modules/react-native/ReactCommon/jsinspector-modern/tracing" + React-jsitooling: + :path: "../../../node_modules/react-native/ReactCommon/jsitooling" React-jsitracing: :path: "../../../node_modules/react-native/ReactCommon/hermes/executor/" React-logger: @@ -3745,10 +4277,10 @@ EXTERNAL SOURCES: :path: "../../../node_modules/react-native-webview" react-native-widgetkit: :path: "../../../node_modules/react-native-widgetkit" - React-nativeconfig: - :path: "../../../node_modules/react-native/ReactCommon" React-NativeModulesApple: :path: "../../../node_modules/react-native/ReactCommon/react/nativemodule/core/platform/ios" + React-oscompat: + :path: "../../../node_modules/react-native/ReactCommon/oscompat" React-perflogger: :path: "../../../node_modules/react-native/ReactCommon/reactperflogger" React-performancetimeline: @@ -3771,6 +4303,8 @@ EXTERNAL SOURCES: :path: "../../../node_modules/react-native/Libraries/LinkingIOS" React-RCTNetwork: :path: "../../../node_modules/react-native/Libraries/Network" + React-RCTRuntime: + :path: "../../../node_modules/react-native/React/Runtime" React-RCTSettings: :path: "../../../node_modules/react-native/Libraries/Settings" React-RCTText: @@ -3779,6 +4313,8 @@ EXTERNAL SOURCES: :path: "../../../node_modules/react-native/Libraries/Vibration" React-rendererconsistency: :path: "../../../node_modules/react-native/ReactCommon/react/renderer/consistency" + React-renderercss: + :path: "../../../node_modules/react-native/ReactCommon/react/renderer/css" React-rendererdebug: :path: "../../../node_modules/react-native/ReactCommon/react/renderer/debug" React-rncore: @@ -3854,165 +4390,177 @@ SPEC CHECKSUMS: Argon2Swift: 99482c1b8122a03524b61e41c4903a9548e7c33b boost: 7e761d76ca2ce687f7cc98e698152abd03a18f90 BoringSSL-GRPC: ca6a8e5d04812fce8ffd6437810c2d46f925eaeb - DatadogCore: 68aee4ffcc3ea17a3b0aa527907757883fc72c84 - DatadogCrashReporting: e6a83b143394e28c9c1cb48c5cfb18eff507b3be - DatadogInternal: 3c5cae6772295fd175a9de11e4747a9322aaa4e7 - DatadogLogs: 09d6358dc7682f9d3eaea85dd418f82d2db3560c - DatadogRUM: 0f267df8c9c8579a291870c2bce4549587391a07 - DatadogSDKReactNative: 55c5868f9321a483bb6f592c1b2948345137a394 - DatadogTrace: f46c8220c73463d09741013f385a6e27cd39185b - DatadogWebViewTracking: dc8376420c8686efd09d00752bc1034b639d180b + DatadogCore: 5c01290a3b60b27bf49aa958f2e339c738364d9e + DatadogCrashReporting: 11286d48ab61baeb2b41b945c7c0d4ef23db317d + DatadogInternal: 7aeb48e254178a0c462c3953dc0a8a8d64499a93 + DatadogLogs: 4324739de62a6059e07d70bf6ceceed78764edeb + DatadogRUM: f36949a38285f3b240a7be577d425f8518e087d4 + DatadogSDKReactNative: 58d9a3f2005f0f9b47c057929c021fcb3b5201e4 + DatadogTrace: bfea32b6ed2870829629a9296cf526221493cc3e + DatadogWebViewTracking: 78c20d8e5f1ade506f4aadaec5690c1a63283fe2 DoubleConversion: cb417026b2400c8f53ae97020b2be961b59470cb EthersRS: 56b70e73d22d4e894b7e762eef1129159bcd3135 - Expo: 3e53243e3281214a7d613f8a875c0b732d7512c2 - ExpoAsset: 0687fe05f5d051c4a34dd1f9440bd00858413cfe - ExpoBlur: 567af66164e3043a9a30069594aed1ddf0a88d97 - ExpoCamera: 173e000631122854b87c20310513981e89030bc6 - ExpoClipboard: 5250b207b6d545f4e9aac5ea3c6e61c4f16d0aed - ExpoFileSystem: c8c19bf80d914c83dda3beb8569d7fb603be0970 - ExpoFont: 773955186469acc5108ff569712a2d243857475f + EXConstants: 9d62a46a36eae6d28cb978efcbc68aef354d1704 + EXJSONUtils: 1d3e4590438c3ee593684186007028a14b3686cd + EXManifests: f4cc4a62ee4f1c8a9cf2bb79d325eac6cb9f5684 + Expo: 2a8d20c4498052d30c3b198e98cf8c19a137ecd7 + expo-dev-client: f1b99dfea0c9174d2e4ec96c2c5461587dda1e86 + expo-dev-launcher: 73e0cc1a270486501011fd8bed4cb096cc431a43 + expo-dev-menu: b2554d3971b251b2c1f0f5c9c3da50855150f195 + expo-dev-menu-interface: 609c35ae8b97479cdd4c9e23c8cf6adc44beea0e + ExpoAsset: 7bdbbacf4e6752ae6e3cf70555cee076f6229e6e + ExpoBlur: 846780b2c90f59e964b9a50385d4deb67174ebfb + ExpoCamera: fc1ab0e1c665b543a307c577df107e37cc2edc8e + ExpoClipboard: 6b9aae54fd48a579473fb101051ad693435b9294 + ExpoFileSystem: 9681caebda23fa1b38a12a9c68b2bade7072ce20 + ExpoFont: 091a47eeaa1b30b0b760aa1d0a2e7814e8bf6fe6 ExpoHaptics: e01cce0741d68c281853118eb0267f88d42c6b7a - ExpoKeepAwake: 2a5f15dd4964cba8002c9a36676319a3394c85c7 - ExpoLinearGradient: ee9efc5acb988b911320e964fab9b4cbdeb198c4 - ExpoLinking: 0381341519ca7180a3a057d20edb1cf6a908aaf4 - ExpoLocalAuthentication: 64bf2cbee456f5639d69a853684c285afc0602d8 - ExpoLocalization: e36b911e04d371c6c6624ef818e56229bf51c498 - ExpoModulesCore: 87f0b8b38f9d4c8a983212ba54119f11f3fcb615 - ExpoScreenCapture: 29ab5480e0d2b7849691d17f00a70b279cbe6a65 + ExpoKeepAwake: e8dedc115d9f6f24b153ccd2d1d8efcdfd68a527 + ExpoLinearGradient: ce334cff9859da4635c1d8eff6e291b11b04ccbb + ExpoLinking: 343a89ea864a851831fd4495e8aea01cf0f6a36f + ExpoLocalAuthentication: 78f74d187ee51126e1a789d73fee32d6d7e60f1f + ExpoLocalization: 677e45c2536bf918119962f78d7ffeeea317e07d + ExpoModulesCore: 8030601b6028c50a3adf8864dabf43c84c913f43 + ExpoScreenCapture: 329c26be22741077b81612de1edaee8648fb209e ExpoSecureStore: d006eea5e316283099d46f80a6b10055b89a6008 - ExpoStoreReview: 32f7186925fdecacddf3c1bc9628dd11b10c3ddd - ExpoWebBrowser: 6890a769e6c9d83da938dceb9a03e764afc3ec9c + ExpoStoreReview: bed43bea90a5876a6a480504f95fea1521dacaa7 + ExpoWebBrowser: eeb47f52e85b2686b56178749675cf90d0822f86 + EXUpdatesInterface: 64f35449b8ef89ce08cdd8952a4d119b5de6821d fast_float: 06eeec4fe712a76acc9376682e4808b05ce978b6 - FBLazyVector: 4c16dde959a9d6b24f2aa32cb87cb919a1ace3f3 + FBLazyVector: d2a9cd223302b6c9aa4aa34c1a775e9db609eb52 Firebase: 98e6bf5278170668a7983e12971a66b2cd57fc8c - FirebaseAppCheckInterop: a92ba81d0ee3c4cddb1a2e52c668ea51dc63c3ae + FirebaseAppCheckInterop: 06fe5a3799278ae4667e6c432edd86b1030fa3df FirebaseAuth: 2a198b8cdbbbd457f08d74df7040feb0a0e7777a - FirebaseAuthInterop: e25b58ecb90f3285085fa2118861a3c9dfdc62ad + FirebaseAuthInterop: 7087d7a4ee4bc4de019b2d0c240974ed5d89e2fd FirebaseCore: a282032ae9295c795714ded2ec9c522fc237f8da FirebaseCoreExtension: f1bc67a4702931a7caa097d8e4ac0a1b0d16720e - FirebaseCoreInternal: 6a3b668197644aa858fc4127578637c6767ba123 + FirebaseCoreInternal: 9afa45b1159304c963da48addb78275ef701c6b4 FirebaseFirestore: 62708adbc1dfcd6d165a7c0a202067b441912dc9 FirebaseFirestoreInternal: ad9b9ee2d3d430c8f31333a69b3b6737a7206232 - FirebaseSharedSwift: bdd5c8674c4712a98e70287c936bc5cca5d640f6 + FirebaseSharedSwift: e17c654ef1f1a616b0b33054e663ad1035c8fd40 fmt: a40bb5bd0294ea969aaaba240a927bd33d878cdd - glog: eb93e2f488219332457c3c4eafd2738ddc7e80b8 + glog: 5683914934d5b6e4240e497e0f4a3b42d1854183 GoogleUtilities: 00c88b9a86066ef77f0da2fab05f65d7768ed8e1 "gRPC-C++": 2fa52b3141e7789a28a737f251e0c45b4cb20a87 gRPC-Core: a27c294d6149e1c39a7d173527119cfbc3375ce4 GTMSessionFetcher: 5aea5ba6bd522a239e236100971f10cb71b96ab6 - hermes-engine: 8eb265241fa1d7095d3a40d51fd90f7dce68217c + hermes-engine: f03b0e06d3882d71e67e45b073bb827da1a21aae leveldb-library: cc8b8f8e013647a295ad3f8cd2ddf49a6f19be19 libwebp: 02b23773aedb6ff1fd38cec7a77b81414c6842a8 - MMKV: b4802ebd5a7c68fc0c4a5ccb4926fbdfb62d68e0 - MMKVCore: a255341a3746955f50da2ad9121b18cb2b346e61 + MMKV: 1a8e7dbce7f9cad02c52e1b1091d07bd843aefaf + MMKVCore: f2dd4c9befea04277a55e84e7812f930537993df nanopb: fad817b59e0457d11a5dfbde799381cd727c1275 OneSignalXCFramework: 1a3b28dfbff23aabce585796d23c1bef37772774 OpenTelemetrySwiftApi: aaee576ed961e0c348af78df58b61300e95bd104 PLCrashReporter: db59ef96fa3d25f3650040d02ec2798cffee75f2 RCT-Folly: 36fe2295e44b10d831836cc0d1daec5f8abcf809 - RCTDeprecation: 85b72250b63cfb54f29ca96ceb108cb9ef3c2079 - RCTRequired: 567cb8f5d42b990331bfd93faad1d8999b1c1736 - RCTTypeSafety: 5e57924492a5e0a762654f814dd018953274eca9 - React: 53c9bd6f974c5dd019ee466e46477eb679149c38 - React-callinvoker: d6484472c1c742917b51338525336d6a74ab8a9f - React-Core: 043aaf319142ecc02db6fffccb780186e6e7462a - React-CoreModules: abe0b2089368e420b7beaa5e140771181e2f6edb - React-cxxreact: 8b678dd36228089b6ee19d62f2bfb8935ea1c63b - React-debug: af25f71a2ea800559f591ef9e9e6495a206c4f7c - React-defaultsnativemodule: 7883e6ef963ee6a6346eb43b73967919029f1033 - React-domnativemodule: eafabfac38103187bfd0bc8b4c64d1ebc35444c2 - React-Fabric: 72038b554a0e4791432a7c161e6ea52bdc854d7c - React-FabricComponents: 47e25c62a3fdc4d6630dc44f41c5552a80202a2a - React-FabricImage: 95c3a49e22cc8c5c33cf282287c73cf261edd104 - React-featureflags: 05545ed41078babfec20095fd7825f029709cde6 - React-featureflagsnativemodule: 75f805793e3feb0dea7055e92540624965543de9 - React-graphics: e33b1bff03c62a7293991bcc28ceb946740bae0f - React-hermes: c07c778ab9cb80a943116ef4574087e8570206cf - React-idlecallbacksnativemodule: f800ae00e3427cbf0ae1f7d880ccbbe8ffea5e16 - React-ImageManager: ca548168b2efedd1e017dc6d715f5e0028eb446a - React-jserrorhandler: 8a7c11b5691b798c9b25b8e4cfbda02742828602 - React-jsi: 1c901c8f6e8d4555b6a5747c5a5b7c7cf757da71 - React-jsiexecutor: d59faf2904bb0bd1daec18bc59731623e79a74eb - React-jsinspector: eb7486a37a90aa2e896d7c67d7ea04c1c466b4ef - React-jsitracing: a417d71b554e891ccab72510f9482e6c53d0b09a - React-logger: 5320a2acb25baa566cda59b611231929dd3ed7fc - React-Mapbuffer: 9af3695e354816d30d4429992714e0c8cefac25f - React-microtasksnativemodule: ab4c1c9d4841e71a4116f167a4cd3f8dc1ab50ba + RCTDeprecation: 5f638f65935e273753b1f31a365db6a8d6dc53b5 + RCTRequired: 8b46a520ea9071e2bc47d474aa9ca31b4a935bd8 + RCTTypeSafety: cc4740278c2a52cbf740592b0a0a40df1587c9ab + React: 6393ae1807614f017a84805bf2417e3497f518a6 + React-callinvoker: c34f666f551f05a325b87e7e3e6df0e082fa3d99 + React-Core: fc07a4b69a963880b25142c51178f4cb75628c7d + React-CoreModules: 94d39315cfa791f6c477712fea47c34f8ecb26c6 + React-cxxreact: 628c28cdb3fdef93ee3bfc2bec8e2d776e81ae49 + React-debug: c1b10e5982b961738eab5b1d66fa31572ca28b5e + React-defaultsnativemodule: dd13932a4a4b0f1d556c9a4e76cc00fa05207126 + React-domnativemodule: 44bd8074cffa6a8ed298a45e2f7d1b519fb15a23 + React-Fabric: 5efe9e2171352089ded33d73e177345e8eb74e00 + React-FabricComponents: 359ea9205fc116ec52c90186ace048391ba477f7 + React-FabricImage: e536ff5e1c1f081dc5953696287e33d4d3b543bd + React-featureflags: 1e3a098a98c63a339a8b5ef4014ba4c4b43fb1f6 + React-featureflagsnativemodule: c926c24fda31daab491e25f4003413b49a5dfaec + React-graphics: 1476634e2deaf13dad3ab7ddfa33f78933445e07 + React-hermes: af1b3d79491295abc9d1b11f84e77d5dc00095b6 + React-idlecallbacksnativemodule: 43fc456e78c7dd7a342a9f185ef7c931d8c44ab0 + React-ImageManager: bd97427edf2df85e7e162e2161c9c981a6185915 + React-jserrorhandler: 44ebfb576a9ce098205b246a4bb81c9ad55ffbb6 + React-jsi: e9c3019e00db5d144e0a660616a52a605e12c39a + React-jsiexecutor: 3ed70a394b76f33e6c4ec4b382a457df7309d96c + React-jsinspector: d0c7ef76573b8e2b362ebc570aecd43b0c88a282 + React-jsinspectortracing: 551b7981d2a0b6a7829fd8c8c310ca51b5b323f8 + React-jsitooling: 5d06fc7c61ac1d260a553a9a9cffcd78865e430c + React-jsitracing: 2ecfa3ccc58e876a8c4f76a2cbdd920fc1ccfbb0 + React-logger: e6e6164f1753e46d1b7e2c8f0949cd7937eaf31b + React-Mapbuffer: a83853bd80bb31a4451e64af91a86c02f7df4f80 + React-microtasksnativemodule: 964a2c1213bb39fa5cc8d5ee4f55846d67747f32 react-native-appsflyer: 2cc1f96348065fc23e976fc7a27e371789fb349e - react-native-compat: 17cc6a63937e3fc291b92250f56ce5e9c0c3aa53 + react-native-compat: 1e09d1a14355b6a0383fb371fe98509fa8c3f4fd react-native-context-menu-view: dcec18eb8882e20596dbb75802e7d19cb87dac02 react-native-get-random-values: 21325b2244dfa6b58878f51f9aa42821e7ba3d06 - react-native-image-picker: 2064a7a43d1e204c3b42ce6d2208df32e881fc9d - react-native-keyboard-controller: 2fdaf70d94da51a982c702720fdc7b051db8140b + react-native-image-picker: 75cc6db21e264e573456725c71ad21828a82c455 + react-native-keyboard-controller: 8698f5ff79ab0a4a8f0259a40b4c3c7f23cae7fd react-native-mmkv: dea675cf9697ad35940f1687e98e133e1358ef9f react-native-netinfo: f0a9899081c185db1de5bb2fdc1c88c202a059ac react-native-onesignal: 33ade92bd91578374c31c5a5a91f45f49c2d6614 - react-native-pager-view: b8b7c09ce10ed0ca632689570aa1020271b44156 + react-native-pager-view: d6f91626b36fcca51d28a9c5ec109a9309242089 react-native-passkey: 69bede03f6bb35fad8117cad73155231cc31066c react-native-restart: 7595693413fe3ca15893702f2c8306c62a708162 - react-native-safe-area-context: 04803a01f39f31cc6605a5531280b477b48f8a88 - react-native-skia: 628fde753bb219b462d97d761f028076d289b1a1 - react-native-slider: bf50824dd00db1e7b66eaec12598883cea3c79e7 - react-native-video: 85e6571bb240a1f084cc7fc9b2f2f0c27b51b622 - react-native-webview: 6c92617eff2519f6359440508c603d3ecda50984 + react-native-safe-area-context: 8870dc3e45c8d241336cd8ee3fa3fc76f3a040ac + react-native-skia: eee8f5b2560445bea34c27bb9f0b2dc7adb04e53 + react-native-slider: d3ddeb61d8c4c4d99f19194338d8d2c33957e717 + react-native-video: a6a2ad5d778133dee45875faf44c6ce0d61cac0e + react-native-webview: 94294e5a5d8cf4f53793aee7ef69ebd14c79e397 react-native-widgetkit: efb6680df237463bbe1be3a4d1a1578a1b0bb08f - React-nativeconfig: 75658bde8f977492f668e94ae8eb9c0dfef7ed94 - React-NativeModulesApple: 1bd9fa09c40204ac489acbe7da239efa4aa47244 - React-perflogger: a0f49e229d1252d683102df60d2392229ece5837 - React-performancetimeline: d0fb47dfc5d55ec6b7c4a79c83912ff59bb8df51 - React-RCTActionSheet: 150cfe1df4275db2251a2a4a1b22be3294e94ef7 - React-RCTAnimation: 67a303df28e0981f58a26968b3c15252a6b277b8 - React-RCTAppDelegate: 5ffb34a2bc043815e470d64feb8510d8930d7e40 - React-RCTBlob: 2ccb60fd765ed41292c495e4374eaf7c23a3c81c - React-RCTFabric: ab786f111eb621bcf1e5b3e6f91eaecaf99eadeb - React-RCTFBReactNativeSpec: e943ce6a5952941d730758fcd5b4a603c6b5ea0a - React-RCTImage: f235db428b4c98cbb1ad6304f826695f19e82c57 - React-RCTLinking: 523a01769de55660743d6332157dfb4dbad817b8 - React-RCTNetwork: d99ee5bf1f15ad8521d30c9da477906d7fb00110 - React-RCTSettings: 4165a44c6f51787980634bd522f3b379ee8531a6 - React-RCTText: 462ab8d4f2f180be83e3983307ce5ef5fa58210e - React-RCTVibration: ca784cb7e30c21852d4b78b1621bfa11940ab061 - React-rendererconsistency: 28f87593201bca785e0bbdc94bff4d92ee2d32ee - React-rendererdebug: c3121b6c4f0873ad2cf1bb63947c0a8a0ae8a1ab - React-rncore: df9c0360d3f28371a103921890e20c309c906407 - React-RuntimeApple: 4b8060742249e0ede1e186e3df656cea119ac9da - React-RuntimeCore: c622d85e3fd6f60ccb7f54bb0d583a85dc1dff25 - React-runtimeexecutor: e6e7af01f9989f931289250ee9060604bc0f0144 - React-RuntimeHermes: 5062f63b39a375c63909c16b33bbc24e2c8e7cf6 - React-runtimescheduler: b6788737ee06eec93c63a2cda4b20c5ca916f5b5 - React-timing: dfac299d2afa69272d469c8e5fd4d4328fe41d1e - React-utils: 280b2ed61cfb45ad94fc8e86d7be402689714962 - ReactAppDependencyProvider: 8955603808eb24bbfde3511d2bcc8362d1d5860e - ReactCodegen: 1e8981b03b6389301f819833f8b3b498d9d4da8d - ReactCommon: ad39e4549e2920b3b065a28603921a75619d0639 + React-NativeModulesApple: d2b9bd7d55dfd864e56c76592777ad32e8ab1f3d + React-oscompat: 0592889a9fcf0eacb205532028e4a364e22907dd + React-perflogger: 634408a9a0f5753faa577dfa81bc009edca01062 + React-performancetimeline: b58a6e65c9fbe1aa02b97152edd6ad5275aef36b + React-RCTActionSheet: ce67bdc050cc1d9ef673c7a93e9799288a183f24 + React-RCTAnimation: 12193c2092a78012c7f77457806dcc822cc40d2c + React-RCTAppDelegate: b0a8aa38e4791915673a7a3ae80b2840a81ec255 + React-RCTBlob: 923cf9b0098b9a641cb1e454c30a444d9d3cda70 + React-RCTFabric: 3f2f2980ad1d426f3a03c9183521b835e0bbbe83 + React-RCTFBReactNativeSpec: b7671d70d65f61326805725b24c7855aab0befb2 + React-RCTImage: 580a5d0a6fdf9b69629d0582e5fb5a173e152099 + React-RCTLinking: 4ed7c5667709099bfd6b2b6246b1dfd79c89f7cb + React-RCTNetwork: 06a22dd0088392694df4fd098634811aa0b3e166 + React-RCTRuntime: 38591d6246389f4f8b93f0f94f565f8448805581 + React-RCTSettings: 9dbf433f302c8ebe43b280453e74624098fbc706 + React-RCTText: 92fcd78d6c44dbe64d147bb63f53698bcba7c971 + React-RCTVibration: 513659394c92491e6c749e981424f6e1e0abdb3c + React-rendererconsistency: c9c28e3b0834d9be2e6aa0ba2d1fd77c76441658 + React-renderercss: 700c57db7fcb36a1e5a9b3645f4cc22f4de43899 + React-rendererdebug: 8ce5f50fd01160e1d1bfc9ec34dac0ca5411afc2 + React-rncore: 289894dda4ebcca06104070f1a9c9283f37dd123 + React-RuntimeApple: 5e5315e698c4fc4e5a3e6b610e4e0ae135f3718c + React-RuntimeCore: 23b6e0e4e2b1cb8a81a14db68814ade8998a5fb0 + React-runtimeexecutor: ebfd71307b3166c73ac0c441c1ea42e0f17f821d + React-RuntimeHermes: baef54b36a6623ea8cd7442027744b08ad06d01b + React-runtimescheduler: 4d9a1afaa16d7dd11a909a9103b18b63995c5683 + React-timing: 0f749e1c5ca1147b699b25ec79003950e6366056 + React-utils: 52ce70a20366bb7f1b416c57281f40ffafeb8a8a + ReactAppDependencyProvider: c42e7abdd2228ae583bdabc3dcd8e5cda6bef944 + ReactCodegen: 0851536ada69d85536f54a7239956a50b6dcd42e + ReactCommon: 3dbed0a44e9e5d7b77b0f35983633aa5d33c9694 ReactNativePerformance: ab7dee4c4862623d72c1530a9fc71b55458edf71 RecaptchaInterop: 7d1a4a01a6b2cb1610a47ef3f85f0c411434cb21 - RNBootSplash: 66c8458007bda40cc25a3f25e4326244a71d9a73 - RNCAsyncStorage: 826b603ae9c0f88b5ac4e956801f755109fa4d5c - RNCMaskedView: 9953b54e4f488389ec45d8befd8687d71e7c121e - RNDateTimePicker: 40ffda97d071a98a10fdca4fa97e3977102ccd14 + RNBootSplash: 2c6b226e3ad3c97d16b6d53bd75d0cd281646bfb + RNCAsyncStorage: addfc2cb6511dbe199c56c6b26ede383b6c38919 + RNCMaskedView: 42f3684c136239957b410dbfa81978b25f2c0e18 + RNDateTimePicker: 279bad2682d9ebdd4151cb71d88f3b460f818fc8 RNDeviceInfo: bf8a32acbcb875f568217285d1793b0e8588c974 RNFastImage: 074e3c1a0d65e2971f28299a85d0155c3b2c948e RNFBApp: 4122dd41d8d7ff017b6ecf777a6224f5b349ca04 RNFBAuth: 1632cefd787a43ba952fa52ff016e7b69fe355cb RNFBFirestore: 5f110e37b7f7f3d6e03c85044dd4cf3ebacec38b - RNFlashList: 4afe189d83616f240be187f717320ad966f6024f - RNGestureHandler: ab4058d59c000e7df387ad9a973e93f7e40de331 + RNFlashList: 7c43eac420e04bfa7798d40c7246c7067e8a4c2c + RNGestureHandler: eb5ad44465a546182d05aebae304e45c881d2f22 RNImageColors: 9ac05083b52d5c350e6972650ae3ba0e556466c1 RNLocalize: d4b8af4e442d4bcca54e68fc687a2129b4d71a81 RNPermissions: 87aac13521bea6dcb6dfd60b03ac69741ccef2b4 RNQrGenerator: ac6a6c766e80dd3625038929ed2b13e2f3edcafb - RNReanimated: 9f96886ec1e1772ed7462cc80da82b7bf1ba984d - RNScreens: 567d3119f7d5d1041090eab25027667c505e4e75 - RNSVG: 4cbae6c6f0ef2b0aa277c5fce8447d3e4cd97cd0 - SDWebImage: f29024626962457f3470184232766516dee8dfea + RNReanimated: ad46062e119fcf93712dfe9dcf72b45ea16892e4 + RNScreens: edd4795b025d94f879e20cc346b844176d938f0c + RNSVG: 204b068da3a7416d22840cd3233bcf745443a455 + SDWebImage: 16309af6d214ba3f77a7c6f6fdda888cb313a50a SDWebImageWebPCoder: e38c0a70396191361d60c092933e22c20d5b1380 SocketRocket: d4aabe649be1e368d1318fdf28a022d714d65748 sparkfabrik-react-native-idfa-aaid: 1b72a6264a2175473e309ffa6434db87c58af264 UIImageColors: d2ef3b0877d203cbb06489eeb78ea8b7788caabe - Yoga: fdc0542faa3ba87e56f2030b3f3f2e21bc3ba01c + Yoga: bfcce202dba74007f8974ee9c5f903a9a286c445 ZXingObjC: 8898711ab495761b2dbbdec76d90164a6d7e14c5 -PODFILE CHECKSUM: 5438afe50eaeebf354579fd9c40fb3c93d56ce9b +PODFILE CHECKSUM: 9a816e7213ef1e27594bb84425b559319371f327 -COCOAPODS: 1.14.3 +COCOAPODS: 1.16.2 diff --git a/apps/mobile/ios/Uniswap.xcodeproj/project.pbxproj b/apps/mobile/ios/Uniswap.xcodeproj/project.pbxproj index 6cdc18319f2..3373460591b 100644 --- a/apps/mobile/ios/Uniswap.xcodeproj/project.pbxproj +++ b/apps/mobile/ios/Uniswap.xcodeproj/project.pbxproj @@ -10,13 +10,14 @@ 0013F5F72C93399400D6EF09 /* ProtectionInfo.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0013F5F62C93399400D6EF09 /* ProtectionInfo.graphql.swift */; }; 00265F792C933CE300A5DA57 /* ProtectionResult.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00265F772C933CE300A5DA57 /* ProtectionResult.graphql.swift */; }; 00265F7A2C933CE300A5DA57 /* ProtectionAttackType.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00265F782C933CE300A5DA57 /* ProtectionAttackType.graphql.swift */; }; - 0094F4FBBC1C0A2FFABF7157 /* TokenProject.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4981A14906A35E8A0B7F9457 /* TokenProject.graphql.swift */; }; 00E356F31AD99517003FC87E /* UniswapTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E356F21AD99517003FC87E /* UniswapTests.m */; }; - 03291E0DA448AF438F97EA5D /* DescriptionTranslations.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7E1F288B7EDDE906C4C00C46 /* DescriptionTranslations.graphql.swift */; }; + 02B7B534DFEC9DA0F7F06B8D /* TokenBalanceQuantityParts.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B0A1F5F6FC3E1141E228B7D /* TokenBalanceQuantityParts.graphql.swift */; }; 037C5AAA2C04970B00B1D808 /* CopyIcon.swift in Sources */ = {isa = PBXBuildFile; fileRef = 037C5AA92C04970B00B1D808 /* CopyIcon.swift */; }; + 03AE019583139330A3E408AB /* SwapOrderDetails.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53F4E5E9341BE66984935185 /* SwapOrderDetails.graphql.swift */; }; 03C788232C10E7390011E5DC /* ActionButtons.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03C788222C10E7390011E5DC /* ActionButtons.swift */; }; 03D2F3182C218D390030D987 /* RelativeOffsetView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03D2F3172C218D380030D987 /* RelativeOffsetView.swift */; }; - 03E3515E38E247F459218CAA /* SwapOrderDetails.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = C955CE2592785712A11892DE /* SwapOrderDetails.graphql.swift */; }; + 03EEEDA1A3D5EF23C0D14B08 /* OnRampTransactionDetails.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87CF9B03AE29A19C5B0F4E35 /* OnRampTransactionDetails.graphql.swift */; }; + 06C9F16E22B8B64855980A69 /* TokenMarketParts.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 55081ADF188C967FC1ECD289 /* TokenMarketParts.graphql.swift */; }; 0703EE032A5734A600AED1DA /* UserDefaults.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0703EE022A5734A600AED1DA /* UserDefaults.swift */; }; 0703EE052A57351800AED1DA /* Logging.swift in Sources */ = {isa = PBXBuildFile; fileRef = 072F6C372A44BECC00DA720A /* Logging.swift */; }; 072E238E2A44D5BD006AD6C9 /* WidgetsCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 072E23862A44D5BC006AD6C9 /* WidgetsCore.framework */; }; @@ -109,6 +110,7 @@ 0743223D2A83E3CA00F8518D /* IAmount.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 074321E92A83E3C900F8518D /* IAmount.graphql.swift */; }; 0743223E2A83E3CA00F8518D /* IContract.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 074321EA2A83E3C900F8518D /* IContract.graphql.swift */; }; 074322402A841BBD00F8518D /* Constants.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0743223F2A841BBD00F8518D /* Constants.swift */; }; + 0764D0BF05C44615BDD9AD65 /* NftBalanceAssetInput.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 696F6C5220D0072E380E198F /* NftBalanceAssetInput.graphql.swift */; }; 0767E0382A65C8330042ADA2 /* Colors.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0767E0372A65C8330042ADA2 /* Colors.swift */; }; 0767E03B2A65D2550042ADA2 /* Styling.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0767E03A2A65D2550042ADA2 /* Styling.swift */; }; 077E60392A85587800ABC4B9 /* TokensQuery.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 077E60382A85587800ABC4B9 /* TokensQuery.graphql.swift */; }; @@ -123,10 +125,10 @@ 07F136422A5763480067004F /* Network.swift in Sources */ = {isa = PBXBuildFile; fileRef = 07F136412A5763480067004F /* Network.swift */; }; 07F5CF712A6AD97D00C648A5 /* Chart.swift in Sources */ = {isa = PBXBuildFile; fileRef = 07F5CF702A6AD97D00C648A5 /* Chart.swift */; }; 07F5CF752A7020FD00C648A5 /* Format.swift in Sources */ = {isa = PBXBuildFile; fileRef = 07F5CF742A7020FD00C648A5 /* Format.swift */; }; - 09E8C497051C37FE604FD40E /* OnRampTransactionsAuth.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 315B8A905FA2C60C053F138B /* OnRampTransactionsAuth.graphql.swift */; }; - 09F9DEB33392F3051BEA8D52 /* TokenFeeDataParts.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 018603D0FA4D05DBF16F1441 /* TokenFeeDataParts.graphql.swift */; }; - 0C6FC49E0FC9BCB2DF5B627E /* TokenSortableField.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 32012AC135EBD991C8F02F92 /* TokenSortableField.graphql.swift */; }; - 0CEBEB8BE3AB95C3F584F6CE /* Image.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31ED613D63FE9C56D9270517 /* Image.graphql.swift */; }; + 092E5F0FE7DE6113285AF5E3 /* NftsTabQuery.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = BA3BCD49511DE84892B34ED0 /* NftsTabQuery.graphql.swift */; }; + 0AC6A2E1C5837AAD902742DA /* TokenBalanceMainParts.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD452B34344D670BA23EA331 /* TokenBalanceMainParts.graphql.swift */; }; + 0AD9B4E176D2E9FE86E6ED21 /* AssetActivity.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05C66C49AF2B78703FCE4C7C /* AssetActivity.graphql.swift */; }; + 0D87DBFD19D5A6DF176C0AB7 /* MobileSchema.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87442A651C068E552BEA89C6 /* MobileSchema.graphql.swift */; }; 0DB282262CDADB260014CF77 /* EmbeddedWallet.m in Sources */ = {isa = PBXBuildFile; fileRef = 0DB282242CDADB260014CF77 /* EmbeddedWallet.m */; }; 0DB282272CDADB260014CF77 /* EmbeddedWallet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0DB282252CDADB260014CF77 /* EmbeddedWallet.swift */; }; 0DC6ADF02B1E2C100092909C /* PortfolioValueModifier.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0DC6ADEF2B1E2C0F0092909C /* PortfolioValueModifier.graphql.swift */; }; @@ -134,61 +136,56 @@ 0DE251472C13B69D005F47F9 /* OnRampTransfer.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0DE251442C13B69D005F47F9 /* OnRampTransfer.graphql.swift */; }; 0DE251482C13B69D005F47F9 /* OnRampServiceProvider.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0DE251452C13B69D005F47F9 /* OnRampServiceProvider.graphql.swift */; }; 0DE251492C13B69D005F47F9 /* OnRampTransactionDetails.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0DE251462C13B69D005F47F9 /* OnRampTransactionDetails.graphql.swift */; }; - 0F282C26344F1AE3622232B0 /* OffRampTransactionDetails.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 396B6AB3BB41898B56EB3828 /* OffRampTransactionDetails.graphql.swift */; }; - 126CC4BC99F3F15CC1E2F1C3 /* NftAssetTrait.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 70851E3D1A4B296A1CE22A20 /* NftAssetTrait.graphql.swift */; }; 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; }; - 13B07FC11A68108700A75B9A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; }; - 143C638C2CCAC689371BFC93 /* NftActivityType.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2D95FE36D2667E070345CDD0 /* NftActivityType.graphql.swift */; }; 1440B371A1C9A42F3E91DAAE /* ExpoModulesProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4DF5F26A06553EFDD4D99214 /* ExpoModulesProvider.swift */; }; - 171DD1C966C7FBF9DD68CFAC /* TopTokensQuery.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04E5C2900254E7BA7F10CE51 /* TopTokensQuery.graphql.swift */; }; - 1B59968CF49C45B127E9C768 /* NftOrder.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6E3A78386B3B779B688021FF /* NftOrder.graphql.swift */; }; - 1BC3A49161EB906542F8E23B /* ProtectionAttackType.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 40E034582FBD2C374CEF808E /* ProtectionAttackType.graphql.swift */; }; - 1C3559D557BC09C709104802 /* NftsTabQuery.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 730CA356D6E1D498CC0C1472 /* NftsTabQuery.graphql.swift */; }; - 1CE49305114BF4792290DDC6 /* AmountChange.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = E63EA0C75D8011BCC182492C /* AmountChange.graphql.swift */; }; - 1DC34AE3E11264475E8B9F62 /* NftApproval.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E32BBB65A6DD9CFF608C8E8 /* NftApproval.graphql.swift */; }; - 1E2AF2C38C8FBEB2A95B644E /* OffRampTransfer.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9D5E6A07F404974045BD525 /* OffRampTransfer.graphql.swift */; }; - 252BD40CB9B46FE47B2440B1 /* NftCollection.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63ACFF2A1D5AE3498731AC69 /* NftCollection.graphql.swift */; }; - 257C7A9F2C4AC3C99C6B7348 /* TransactionHistoryUpdaterQuery.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = AF3D7A923E5E1FB504E1F64D /* TransactionHistoryUpdaterQuery.graphql.swift */; }; - 2B12DFE797E2CBF314565D81 /* TokenProtectionInfoParts.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0BB4A40E30E1D985519DB3CF /* TokenProtectionInfoParts.graphql.swift */; }; - 2B422D705C68BB51FBDA9895 /* NFTItemScreenQuery.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 207F4DF7664454C31DE069F8 /* NFTItemScreenQuery.graphql.swift */; }; - 2E05037B51AF526A47701B09 /* TransactionDirection.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC2FBE9F353D3753FB94B8BF /* TransactionDirection.graphql.swift */; }; - 302E24504C4FCE674CF95984 /* TokenParts.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98F596250F55A3D6E9E1F499 /* TokenParts.graphql.swift */; }; - 30872BFB39EEC66944E3EFD7 /* MobileSchema.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = A4E0C448C5D45BF1071FA458 /* MobileSchema.graphql.swift */; }; - 31661D70B58410EA030E2C53 /* TimestampedAmount.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = B0DB67D6C438F623976727E9 /* TimestampedAmount.graphql.swift */; }; - 326CFFDBB89D95FA4CB95EBB /* HistoryDuration.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3BF42F88002431BFDC9FCA9F /* HistoryDuration.graphql.swift */; }; - 3361FE5837059AEF4AA877BE /* TransactionListQuery.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 224CA82F1871016F4173F69E /* TransactionListQuery.graphql.swift */; }; - 33928A7366AFE7F892CDC89F /* NftBalanceConnection.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FC7B80EC0E0D2134B67575B /* NftBalanceConnection.graphql.swift */; }; - 35B8176433A98BA798BBEE79 /* PageInfo.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = E475EBABF7EA310435E2F19C /* PageInfo.graphql.swift */; }; - 36E601F269D40A67FC353947 /* AssetChange.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 39F60B2B54796DC978765C99 /* AssetChange.graphql.swift */; }; - 3E338E14E33C721DAB708664 /* NftActivityFilterInput.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43E2ECCEFBC3BE8D13BE6CAB /* NftActivityFilterInput.graphql.swift */; }; - 3FE25F715DFFD1D03DCDA57D /* NftContract.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 18B9EB43501127BE1B14F1A5 /* NftContract.graphql.swift */; }; + 147F4DFD43CE86324A066003 /* FeedTransactionListQuery.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9EFADDBB38BB9261933C1349 /* FeedTransactionListQuery.graphql.swift */; }; + 15193A0A3CE80FF72AAB54B4 /* SafetyLevel.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 22F8093091A9E5FC0D6284BA /* SafetyLevel.graphql.swift */; }; + 15A72E27235628C56431EC98 /* FeeData.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = FEE1CB436B299B0349BA9957 /* FeeData.graphql.swift */; }; + 15F6E43DA2BD9A8A681EC70C /* TokenTransfer.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9BEBBC668E69EE3A1FC6AB05 /* TokenTransfer.graphql.swift */; }; + 16506815CDEE17670D3DD363 /* TimestampedAmount.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31CBA4397C44A04E218AEF28 /* TimestampedAmount.graphql.swift */; }; + 19BC2371F6BE6CAD5218AA53 /* NftActivityConnection.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBE0699A65BEEEE6E9A6B03F /* NftActivityConnection.graphql.swift */; }; + 1C84E14C7F52CF6C9A6D2930 /* TokenProjectDescriptionQuery.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1276D33B06E840B8E6839F39 /* TokenProjectDescriptionQuery.graphql.swift */; }; + 1CA252C75CD5291E2A0B308B /* NftCollection.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = B25620D6E0E297C56198F190 /* NftCollection.graphql.swift */; }; + 206E0025B8FCE0EA96AC744A /* NftCollectionScreenQuery.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA3BFDC64C5E0A058877A348 /* NftCollectionScreenQuery.graphql.swift */; }; + 23B195B262495EABE4A6CDF4 /* HistoryDuration.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1053483279043EED7612BE90 /* HistoryDuration.graphql.swift */; }; + 24B4011ADC672F470EC515AC /* BridgedWithdrawalInfo.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = CAC62CDEEBE5712219A457C7 /* BridgedWithdrawalInfo.graphql.swift */; }; + 252A28057D1D481D14D2F5E5 /* TransactionDirection.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64D494D944670E557175A694 /* TransactionDirection.graphql.swift */; }; + 2925C6E0262B95C5EA0C2AE7 /* TransactionDetails.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 55240C84512D3851C8B9F027 /* TransactionDetails.graphql.swift */; }; + 2B2738BAB9E906B561E0D4D6 /* TokenParts.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB76D1207400E308430A837F /* TokenParts.graphql.swift */; }; + 2C9935142A9582467B5B5FC5 /* ProtectionInfo.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD12FD368B3A96F323444D8E /* ProtectionInfo.graphql.swift */; }; + 2D73D2D80BC8C455DB35CE57 /* TokenApproval.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD56CBC543897BE8E37CC2C1 /* TokenApproval.graphql.swift */; }; + 2FC53D1C58218F0BF1D4E5F3 /* IContract.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D9189C818AFF8E988F861D0 /* IContract.graphql.swift */; }; + 31A4EC91F1924E25AECA2F4E /* NftCollectionMarket.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = F286C514E849B29F5235310A /* NftCollectionMarket.graphql.swift */; }; + 3389D45727F15B8E4F59B99F /* NftApproval.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD111A711D83D1D82E4025A9 /* NftApproval.graphql.swift */; }; + 34610491FF9A452F4F806157 /* TokenPriceHistoryQuery.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9602E2A290179F8741EDD35A /* TokenPriceHistoryQuery.graphql.swift */; }; + 3720F641F397A2819500B1B1 /* SwapOrderStatus.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0359DDEA2E2E17759FCC5CF /* SwapOrderStatus.graphql.swift */; }; + 391FD815120230BDAF53F6F0 /* BlockaidFees.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3EF9AEC00868BFD7CEBF202C /* BlockaidFees.graphql.swift */; }; + 39DEA445993253BCC1201199 /* NftApproveForAll.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = FF1B893C0275DAAA156B0108 /* NftApproveForAll.graphql.swift */; }; + 4260B9F719F8E25DFBF99D73 /* OnRampTransfer.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E5D1A04B42B25218C53C107 /* OnRampTransfer.graphql.swift */; }; + 438115E2759B1194751A8021 /* NftContract.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 55A243177E9FA92A0524A222 /* NftContract.graphql.swift */; }; + 45FFF7DF2E8C2A8100362570 /* SilentPushEventEmitter.m in Sources */ = {isa = PBXBuildFile; fileRef = 45FFF7DE2E8C2A6400362570 /* SilentPushEventEmitter.m */; }; + 45FFF7E12E8C2E6900362570 /* SilentPushEventEmitter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45FFF7E02E8C2E6100362570 /* SilentPushEventEmitter.swift */; }; 463BA791004B1B7AC1773914 /* Pods_Uniswap.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2226DF79BEAFECEE11A51347 /* Pods_Uniswap.framework */; }; - 4917B04DB81579CF4243A1DA /* Chain.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A8990A17F489F284E0DB1B3 /* Chain.graphql.swift */; }; - 4BB9E218D89B8AF5E4E27CCB /* NftOrderEdge.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 49BD6C776029FAF4FC711DE7 /* NftOrderEdge.graphql.swift */; }; - 4C187202229BDC4D8898E067 /* Dimensions.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54B1C71AED738D17898103A6 /* Dimensions.graphql.swift */; }; - 4EF8D293BB1EBCFBFC65A330 /* TokenTransfer.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8DA4E7C052A6C4AC3A9DCDA6 /* TokenTransfer.graphql.swift */; }; - 4FED6AAF896BA371C56D88B1 /* Portfolio.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1849039FD4A210DA990363C8 /* Portfolio.graphql.swift */; }; - 50C89DFAF2DBC80D6343B164 /* NftAssetTraitInput.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 556339705BD103365D4ED07B /* NftAssetTraitInput.graphql.swift */; }; - 553E6B467BEE49C9984691C5 /* OnRampTransfer.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2139ABF56EA067ED792A48C9 /* OnRampTransfer.graphql.swift */; }; - 5804A1B1BB144D9EFBBE177D /* NftAssetEdge.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DF7C8888BE6AFA2F22889FE /* NftAssetEdge.graphql.swift */; }; + 47797825D18637A2FE57AC1F /* TokenProtectionInfoParts.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 835D9DF76533D22EDF0E9D67 /* TokenProtectionInfoParts.graphql.swift */; }; + 4DB6B64CFF3B00FCF0258336 /* NftMarketplace.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 83FB27D93A9468E6DB47231C /* NftMarketplace.graphql.swift */; }; + 4DB6D0FB611F6C68EADFB948 /* TokenProjectMarket.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0B0505DB30407C221B6A8491 /* TokenProjectMarket.graphql.swift */; }; + 4DB88A2CBFF5FF356CA757F0 /* ApplicationContract.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59DD4D834D7B42A6D02F4F12 /* ApplicationContract.graphql.swift */; }; + 4FD78AA88D2EB8E22144BCDF /* NftAssetTraitInput.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F1731869775D16A9EAB475C /* NftAssetTraitInput.graphql.swift */; }; + 51362EC6F0E6D8928C067F5E /* NftBalancesFilterInput.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1810C60B56CC74150C868801 /* NftBalancesFilterInput.graphql.swift */; }; + 5551DDD6A8B9B28E03459816 /* TokenFeeDataParts.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1166529407CA13E4D4F24F12 /* TokenFeeDataParts.graphql.swift */; }; + 5676CCD265609B71D3B1DB7C /* NftCollectionEdge.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = F70593F94C8B315F5304B9BE /* NftCollectionEdge.graphql.swift */; }; + 57ECD348EA564F0CBF715E9E /* PortfolioBalancesQuery.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = E0A53C3A09AD259B9A8EDBDD /* PortfolioBalancesQuery.graphql.swift */; }; 5B4398EC2DD3B22C00F6BE08 /* PrivateKeyDisplayManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 5B4398E82DD3B22C00F6BE08 /* PrivateKeyDisplayManager.m */; }; 5B4398ED2DD3B22C00F6BE08 /* PrivateKeyDisplayManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B4398E92DD3B22C00F6BE08 /* PrivateKeyDisplayManager.swift */; }; 5B4398EE2DD3B22C00F6BE08 /* PrivateKeyDisplayView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B4398EA2DD3B22C00F6BE08 /* PrivateKeyDisplayView.swift */; }; 5B4CEC5F2DD65DD4009F082B /* CopyIconOutline.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B4CEC5E2DD65DD4009F082B /* CopyIconOutline.swift */; }; - 5C3958DA046B5A84FE90C1BD /* FeeData.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 17819A49DE69723EC60D9D72 /* FeeData.graphql.swift */; }; - 5D06BAB366D14A5AFE2355E8 /* TransactionType.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 69F2FFD11FB5E462CC454A15 /* TransactionType.graphql.swift */; }; 5E5E0A632D380F5800E166AA /* Env.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E5E0A622D380F5700E166AA /* Env.swift */; }; 5EFB78362B1E585000E77EAC /* ConvertQuery.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5EFB78352B1E585000E77EAC /* ConvertQuery.graphql.swift */; }; - 614FCC3D8E9AA8175E950726 /* Currency.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 25B4C7C7FEF32EAF10D030F9 /* Currency.graphql.swift */; }; - 61988A922656857278F7CBF9 /* TokenBalanceMainParts.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 137696908D703632CEE3AB28 /* TokenBalanceMainParts.graphql.swift */; }; - 62B32E9623DA0E939F062033 /* TokensQuery.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = B3C3F0403FAEFDD632AC6CCE /* TokensQuery.graphql.swift */; }; - 63BDDE4499AC6B2375C9F795 /* FavoriteTokenCardQuery.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F0EEAC1DADE827AE38EB8A6 /* FavoriteTokenCardQuery.graphql.swift */; }; - 648B919F00D069DE1F0040F6 /* NftMarketplace.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 600250B00B6C02AAB063818B /* NftMarketplace.graphql.swift */; }; + 6250D4ACD5696D845FD83DFD /* HomeScreenTokensQuery.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E7FF51A507BF788E64E3EFE /* HomeScreenTokensQuery.graphql.swift */; }; + 63FBF9C23ED568816590F093 /* ActivityDetails.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 075E4C1DFAA00EE5B3CE792D /* ActivityDetails.graphql.swift */; }; 649A7A782D9AE70B00B53589 /* KeychainUtils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 649A7A772D9AE70B00B53589 /* KeychainUtils.swift */; }; 649A7A792D9AE70B00B53589 /* KeychainConstants.swift in Sources */ = {isa = PBXBuildFile; fileRef = 649A7A762D9AE70B00B53589 /* KeychainConstants.swift */; }; - 66D2765A00D8CE3136D28F1F /* SafetyLevel.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4ACFA5B4204741038C986C5D /* SafetyLevel.graphql.swift */; }; - 677FC15A05D9BD23930FAC95 /* TokenQuery.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74885865ED8CFEA875E40916 /* TokenQuery.graphql.swift */; }; - 6A60BDC9D46A710D871DEC6E /* NftProfile.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB35E518AD7FBFEBEA9CAB95 /* NftProfile.graphql.swift */; }; + 6882C4768011FDD4D746BDDB /* TokenBasicInfoParts.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = D13E592852F52B2855F05A5E /* TokenBasicInfoParts.graphql.swift */; }; 6BC7D07E2B5FF02400617C95 /* ScantasticEncryption.m in Sources */ = {isa = PBXBuildFile; fileRef = 6BC7D07B2B5FF02400617C95 /* ScantasticEncryption.m */; }; 6BC7D07F2B5FF02400617C95 /* ScantasticEncryption.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6BC7D07C2B5FF02400617C95 /* ScantasticEncryption.swift */; }; 6BC7D0802B5FF02400617C95 /* EncryptionUtils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6BC7D07D2B5FF02400617C95 /* EncryptionUtils.swift */; }; @@ -198,21 +195,26 @@ 6CA91BE12A95226200C4063E /* RNCloudStorageBackupsManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 6CA91BDE2A95226200C4063E /* RNCloudStorageBackupsManager.m */; }; 6CA91BE22A95226200C4063E /* EncryptionHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6CA91BDF2A95226200C4063E /* EncryptionHelper.swift */; }; 6CA91BE32A95226200C4063E /* RNCloudStorageBackupsManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6CA91BE02A95226200C4063E /* RNCloudStorageBackupsManager.swift */; }; + 70CD2D0665E5AC6A0DF6F697 /* NFTItemScreenQuery.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03AB6B21A1BFB3A18982B47E /* NFTItemScreenQuery.graphql.swift */; }; 70EB8338CA39744B7DBD553E /* Pods_WidgetIntentExtension.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1064E23E366D0C2C2B20C30E /* Pods_WidgetIntentExtension.framework */; }; - 71CF37F19F1C138B57CC135C /* TopTokenParts.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5640432978873FB030467750 /* TopTokenParts.graphql.swift */; }; + 71954B20E4341CEC36203F87 /* NftActivityEdge.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 043C7D80D6722AFCF1715D07 /* NftActivityEdge.graphql.swift */; }; + 7700BED7CD7F52C83A3FF430 /* NftAssetEdge.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFFD4C1E5A4B30DE3CE02DB4 /* NftAssetEdge.graphql.swift */; }; 77CF6065C8A24FE48204A2C1 /* SplashScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = BF9176E944C84910B1C0B057 /* SplashScreen.storyboard */; }; - 7BE97D20155AE69FF36C4CB4 /* NftStandard.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4B308EC3DB7C3C1DD5DDE03D /* NftStandard.graphql.swift */; }; - 818179F5724AA35E1B1D5A9C /* ProtectionInfo.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0702203B17BDD858CED28F8B /* ProtectionInfo.graphql.swift */; }; + 7B557C3224F990851430DBD2 /* Portfolio.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5397E77A577E9952D2477020 /* Portfolio.graphql.swift */; }; + 7C886F9D4C02EF4E5F67B011 /* NftsQuery.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE735ED4766E65C0D6808F9A /* NftsQuery.graphql.swift */; }; + 7E3412EB776E1F43D6904BA0 /* PageInfo.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97FBBE677B56FFE07052EF1D /* PageInfo.graphql.swift */; }; + 8117BFB02DCF0F315FD83E67 /* TokenBalance.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 181209B4CDE80BDC80891CFD /* TokenBalance.graphql.swift */; }; + 8141B38CCDB09F91180C0EBD /* NftCollectionConnection.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0D09FFE2B5E56CDCAB2F9455 /* NftCollectionConnection.graphql.swift */; }; + 81E55E8D3056E2378A332B31 /* TokenDetailsScreenQuery.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 957A35D2DE7A140BA198A0F1 /* TokenDetailsScreenQuery.graphql.swift */; }; 8273FC23FB1AE47B80C5E09F /* Pods_OneSignalNotificationServiceExtension.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 15092E550A1C78508ABA3280 /* Pods_OneSignalNotificationServiceExtension.framework */; }; 8385A47D3C765B841F450090 /* ExpoModulesProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = C26D739993D5C939C6FBB58A /* ExpoModulesProvider.swift */; }; - 8410B98A8D7974A941AAF299 /* WidgetTokensQuery.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBA33683D2BA6BBE3251D67C /* WidgetTokensQuery.graphql.swift */; }; - 85ADD03923353DB3D6CD7301 /* SwapOrderStatus.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = D574AB5194929038A54B4D4B /* SwapOrderStatus.graphql.swift */; }; - 85D0E81B798D0F2D841386E9 /* NftCollectionMarket.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4F4F47D22B749A438B5BF674 /* NftCollectionMarket.graphql.swift */; }; - 869F3639FBC6D8156FFE3BD3 /* TokenProjectMarket.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3B9A505509D9A85BE1DB7D05 /* TokenProjectMarket.graphql.swift */; }; - 8950F8354810AA673E1E35DA /* SchemaMetadata.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = C65195A1CC9894C6341385C3 /* SchemaMetadata.graphql.swift */; }; - 8ADDD2E2AB1FD9D1D9AF5627 /* BlockaidFees.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = BD35300F81746B2D4A23065A /* BlockaidFees.graphql.swift */; }; - 8CC06A8205186D0640F0BC55 /* NftAssetConnection.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 218B8AB05C80D919671D3970 /* NftAssetConnection.graphql.swift */; }; - 8CEA6459A5B739C3A0382000 /* TokenProjectsQuery.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = E8A49D011C60137D4034CAC4 /* TokenProjectsQuery.graphql.swift */; }; + 845327D60EFBB850189D6AB3 /* Amount.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = F4C3461E088654B80ABE3DE7 /* Amount.graphql.swift */; }; + 86038259E487A108DDC2948B /* Image.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8C9047B981FA322A727947F7 /* Image.graphql.swift */; }; + 8971E73E041A6283E2684481 /* TokenProject.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8856DFFC7FDC9BF105B0B4E3 /* TokenProject.graphql.swift */; }; + 8B2A92172EB3E78E00990413 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B2A92162EB3E78E00990413 /* AppDelegate.swift */; }; + 8BCFF1F648887F78894F1071 /* ContractInput.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = AED050A208757F137DBDA57D /* ContractInput.graphql.swift */; }; + 8D85F349FEF81A52FB93EAAB /* AssetChange.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D4C849A7805FCCEE8C8C3E6 /* AssetChange.graphql.swift */; }; + 8E6DA65AC5CAE9F9A67F9E38 /* TopTokensQuery.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 243576FAC8D2801F9D99ECC9 /* TopTokensQuery.graphql.swift */; }; 8E89C3AE2AB8AAA400C84DE5 /* MnemonicConfirmationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8E89C3A62AB8AAA400C84DE5 /* MnemonicConfirmationView.swift */; }; 8E89C3AF2AB8AAA400C84DE5 /* MnemonicDisplayView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8E89C3A72AB8AAA400C84DE5 /* MnemonicDisplayView.swift */; }; 8E89C3B12AB8AAA400C84DE5 /* MnemonicConfirmationWordBankView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8E89C3A92AB8AAA400C84DE5 /* MnemonicConfirmationWordBankView.swift */; }; @@ -227,7 +229,7 @@ 8EBFB1552ABA6AA6006B32A8 /* PasteIcon.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8EBFB1542ABA6AA6006B32A8 /* PasteIcon.swift */; }; 8ED0562C2AA78E2C009BD5A2 /* ScrollFadeExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8ED0562B2AA78E2C009BD5A2 /* ScrollFadeExtensions.swift */; }; 8EE7C0582AFD7B2100E0D9CD /* DescriptionTranslations.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8EE7C0572AFD7B2100E0D9CD /* DescriptionTranslations.graphql.swift */; }; - 8FE0F30936E893297558F467 /* ProtectionResult.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = BD0FC2D534CB82B151C7F9B7 /* ProtectionResult.graphql.swift */; }; + 9061ACE5AF99CEDE7BA51C94 /* NftProfile.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE2A9FBFB7F718246B668A60 /* NftProfile.graphql.swift */; }; 9127D1362CC2D3D00096F134 /* TokenBalanceMainParts.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9127D1342CC2D3D00096F134 /* TokenBalanceMainParts.graphql.swift */; }; 9127D1372CC2D3D00096F134 /* TokenBalanceQuantityParts.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9127D1352CC2D3D00096F134 /* TokenBalanceQuantityParts.graphql.swift */; }; 9173CEBC2D03C6F30036DA28 /* TokenBalanceParts.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9173CEBB2D03C6F30036DA28 /* TokenBalanceParts.graphql.swift */; }; @@ -243,15 +245,14 @@ 91D501792CDBEAE700B09B7F /* TopTokenParts.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 91D5016E2CDBEAE700B09B7F /* TopTokenParts.graphql.swift */; }; 91D5017A2CDBEAE700B09B7F /* TokenFeeDataParts.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 91D5016F2CDBEAE700B09B7F /* TokenFeeDataParts.graphql.swift */; }; 91D5017E2CDBEAF600B09B7F /* HomeScreenTokenParts.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 91D5017C2CDBEAF600B09B7F /* HomeScreenTokenParts.graphql.swift */; }; - 9301D18644F3DFA9ABB8F0BE /* TokenApproval.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E975BEDBED5FE51D0DC6E96 /* TokenApproval.graphql.swift */; }; - 93566FBDE94E1A2D8CC5AB62 /* ConvertQuery.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7BD3F0794908635CDFA7DAB6 /* ConvertQuery.graphql.swift */; }; - 9381B5EA5839DA17D07A45F0 /* TokenDetailsScreenQuery.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7A33933670CCAD9E62A1A80 /* TokenDetailsScreenQuery.graphql.swift */; }; - 93AEECDBDB160B5E0C9E3149 /* TokenProjectDescriptionQuery.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6FF8B660E9C2C0D8DDF7588A /* TokenProjectDescriptionQuery.graphql.swift */; }; - 97CA219E1FFD832D8FA02C20 /* TransactionDetails.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABE51731EB853137302A7B0D /* TransactionDetails.graphql.swift */; }; - 9822D243ED2F5C350404A375 /* HomeScreenTokenParts.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27F8B915042BD8D67D9627EA /* HomeScreenTokenParts.graphql.swift */; }; - 9A3E861F5D7B0F2CB0EFA7A6 /* AssetActivity.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = E4624A41EC1468712BD77653 /* AssetActivity.graphql.swift */; }; - 9AF0D1FDF2BFB17FB732C5FD /* SchemaConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E49E724432C70A2551FB2C7 /* SchemaConfiguration.swift */; }; - 9B6C88F7D8D542AAC353A3EA /* NftOrderConnection.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 39FC2A13550FA6754EC1A7FC /* NftOrderConnection.graphql.swift */; }; + 91DBDA9B4F4006350AEB8E4B /* NftStandard.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0373C61A7AF015058A502CE2 /* NftStandard.graphql.swift */; }; + 9260D04A891FEDE2BF511707 /* Currency.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD0CA37FB709C06F123EBF74 /* Currency.graphql.swift */; }; + 997BFD5324E4BDE2422FEFED /* NftAssetsFilterInput.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 310373063D8A11E9E02314FE /* NftAssetsFilterInput.graphql.swift */; }; + 9A9B39BC22F3BDFCD0917B66 /* OffRampTransactionDetails.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4CA32B2B2997D73A0185635 /* OffRampTransactionDetails.graphql.swift */; }; + 9D638326CD705ABE549C8CA7 /* TokenProjectMarketsParts.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5C2E70E43A02405C5CEAD7C /* TokenProjectMarketsParts.graphql.swift */; }; + 9E7EC26AC45301198E280DC7 /* NftOrderEdge.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD158681F2E84A5E49656B11 /* NftOrderEdge.graphql.swift */; }; + 9EBC41A90B1A80653960045E /* SchemaMetadata.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 522135E54BDB258B45B5A694 /* SchemaMetadata.graphql.swift */; }; + 9EC9E4AB5C3FD254EDB28D7A /* PortfolioValueModifier.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = E09D12605BAA868AB51573BE /* PortfolioValueModifier.graphql.swift */; }; 9F00A43A2B33894C0088A0D0 /* ApplicationContract.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F00A4392B33894C0088A0D0 /* ApplicationContract.graphql.swift */; }; 9F29D4ED2B47126D004D003A /* NftBalanceAssetInput.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F29D4EC2B47126D004D003A /* NftBalanceAssetInput.graphql.swift */; }; 9F78980B2A819CC4004D5A98 /* SwiftUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 072F6C222A44A32E00DA720A /* SwiftUI.framework */; }; @@ -267,73 +268,74 @@ 9FCEBF002A95A8E00079EDDB /* RNWalletConnect.m in Sources */ = {isa = PBXBuildFile; fileRef = 9FCEBEFE2A95A8E00079EDDB /* RNWalletConnect.m */; }; 9FCEBF012A95A8E00079EDDB /* RNWalletConnect.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FCEBEFF2A95A8E00079EDDB /* RNWalletConnect.swift */; }; 9FCEBF042A95A99C0079EDDB /* RCTThemeModule.m in Sources */ = {isa = PBXBuildFile; fileRef = 9FCEBF032A95A99B0079EDDB /* RCTThemeModule.m */; }; - 9FEC9B8B2A858CF1003CD019 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 9FEC9B8A2A858CF1003CD019 /* AppDelegate.m */; }; - A104024A1861354EC1DD53C1 /* PortfolioBalancesQuery.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 985DDC8324B872DD44E87781 /* PortfolioBalancesQuery.graphql.swift */; }; + A250CF455F6CEFB64ABFC277 /* HomeScreenTokenParts.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = AB772B265A35BFBC3A7761AD /* HomeScreenTokenParts.graphql.swift */; }; A32F9FBD272343C9002CFCDB /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = A32F9FBC272343C8002CFCDB /* GoogleService-Info.plist */; }; - A3318C676D7FBF78A1583B16 /* NftCollectionEdge.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37038CCEB11E70E2027EF4EA /* NftCollectionEdge.graphql.swift */; }; A3551F2CAC134AD49D40927F /* Basel-Grotesk-Book.otf in Resources */ = {isa = PBXBuildFile; fileRef = 6F33E8069B7B40AFB313B8B0 /* Basel-Grotesk-Book.otf */; }; A3F0A5B1272B1DFA00895B25 /* KeychainSwiftDistrib.swift in Sources */ = {isa = PBXBuildFile; fileRef = A3F0A5B0272B1DFA00895B25 /* KeychainSwiftDistrib.swift */; }; A70E4DD42C25DA0A002D6D86 /* NetworkFee.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = A70E4DD32C25DA0A002D6D86 /* NetworkFee.graphql.swift */; }; A70E4DD72C260416002D6D86 /* SwapOrderType.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = A70E4DD52C260416002D6D86 /* SwapOrderType.graphql.swift */; }; A70E4DD82C260416002D6D86 /* SwapOrderStatus.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = A70E4DD62C260416002D6D86 /* SwapOrderStatus.graphql.swift */; }; A7B8EFCB2BF68F0D00CA4A1C /* FeeData.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7B8EFCA2BF68F0D00CA4A1C /* FeeData.graphql.swift */; }; - A974633048E27D5D23420F34 /* TokenBasicInfoParts.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3377F7BB38BD5A45AE31909D /* TokenBasicInfoParts.graphql.swift */; }; - AA3AE4E5C2AAC3F9460A3637 /* NftBalanceAssetInput.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E5FA43C5E31035775917C4E /* NftBalanceAssetInput.graphql.swift */; }; + A88A26642AC25B022F428953 /* OnRampServiceProvider.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5BED80DB034487FCA1450EDB /* OnRampServiceProvider.graphql.swift */; }; + A949039A6A9EB3584B5644F3 /* IAmount.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37376E4CF3A4B76E9DAE150C /* IAmount.graphql.swift */; }; + A9AF7B483E9666E88CD6253E /* NftOrderConnection.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98F489175099FE697721272D /* NftOrderConnection.graphql.swift */; }; + AAB837C01239A62D00068853 /* TransactionType.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 18D48B25E03122149B0D1304 /* TransactionType.graphql.swift */; }; AC0EE0982BD826E700BCCF07 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = AC0EE0972BD826E700BCCF07 /* PrivacyInfo.xcprivacy */; }; AC2EF4032C914B1600EEEFDB /* fonts in Resources */ = {isa = PBXBuildFile; fileRef = AC2EF4022C914B1600EEEFDB /* fonts */; }; - AC70FF8207ED26561B634E30 /* NftsQuery.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9030AC59702756C39396FFE /* NftsQuery.graphql.swift */; }; - ADE104A101B3DFFBDB308189 /* Query.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = ED157D3DB73302C8A1B9522E /* Query.graphql.swift */; }; - AF83E7713BB625D787DD1A1D /* TokenMarket.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = EBD833F6580F9B82A68D4A98 /* TokenMarket.graphql.swift */; }; + ACA7AE75760B76F7B30DCD43 /* AmountChange.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066BBBD815CF2DE8803338BC /* AmountChange.graphql.swift */; }; + AD6036D32C44048781B728E1 /* SchemaConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = CF4115ACC8D8F0C7529AABA7 /* SchemaConfiguration.swift */; }; B193AD315CF844A3BDC3D11D /* Basel-Grotesk-Medium.otf in Resources */ = {isa = PBXBuildFile; fileRef = 3C606D2C81014A0A8898F38E /* Basel-Grotesk-Medium.otf */; }; - B377DB0418EA15695F208D9F /* NetworkFee.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8BEADEB4AE05B860CF2232D1 /* NetworkFee.graphql.swift */; }; - B61E182CF4937B5169885C95 /* OnRampTransactionDetails.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 12D3AB6C2FC9513E9F224B7C /* OnRampTransactionDetails.graphql.swift */; }; - B746C09DA19B4C7F9C700989 /* NftActivityConnection.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = F912AB9AB67808B740246798 /* NftActivityConnection.graphql.swift */; }; - BA83003638263D702D03C3C1 /* ActivityDetails.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A4EB7BAD2C90E61FD6C30AF /* ActivityDetails.graphql.swift */; }; + B64BD6DEB100AEB723DB640D /* NftBalanceConnection.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 62DDC1F42E7172783EAF3776 /* NftBalanceConnection.graphql.swift */; }; BA869E372D56B0B600D7A718 /* WidgetTokensQuery.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = BA869E362D56B0B600D7A718 /* WidgetTokensQuery.graphql.swift */; }; BA8FC9627A40644259D9E2F9 /* Pods_WidgetsCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CB29AC0C0907A833F23D2C30 /* Pods_WidgetsCore.framework */; }; - BD1FF76A8E50EFEA0720CC04 /* NftAsset.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = F2932B486DD7070DF226A27B /* NftAsset.graphql.swift */; }; - BD59A9C8414D6A4BFE9C9A2E /* NftActivity.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = F1A24D364C0D262A14BB7182 /* NftActivity.graphql.swift */; }; - C1FC1F8B4A2725A195F66D60 /* PortfolioValueModifier.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 41003491EF939043CF9D0F4E /* PortfolioValueModifier.graphql.swift */; }; - C791C5505DBB3036B9D5066D /* SwapOrderType.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 148617FD73F2CD7117960DBA /* SwapOrderType.graphql.swift */; }; - C7ABAADA504107D152A52FD4 /* NftBalancesFilterInput.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 41BA2129FFE961C8549C8A30 /* NftBalancesFilterInput.graphql.swift */; }; - C8338C5BE951EF9111C48217 /* TokenBasicProjectParts.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2C2F4BE3080D4129D4478528 /* TokenBasicProjectParts.graphql.swift */; }; - C8402101FF510BAA358DCA46 /* TokenBalanceParts.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = F0C34E94906CB9F0A016D566 /* TokenBalanceParts.graphql.swift */; }; - CA0EDABCA1B6C2B0936BF5CF /* NftBalanceEdge.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0B132543F80E3C9191219E6D /* NftBalanceEdge.graphql.swift */; }; - CCBC45FD4310D8153D859361 /* TransactionStatus.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2ABA47847A73130D356EB6BF /* TransactionStatus.graphql.swift */; }; - CE1DF567D58943ACCBB8360C /* Amount.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = D20E9461A6C9C1CD6A24BEED /* Amount.graphql.swift */; }; - CF2BAECCF9A2EC43AC3EC583 /* OnRampServiceProvider.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6A84A192F750A0F1BC8D7A69 /* OnRampServiceProvider.graphql.swift */; }; - CF36F741187285B430EFE557 /* NftBalance.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05BE2F49DD1FB9A692E21C13 /* NftBalance.graphql.swift */; }; + BAB54489223FD0027F7A8DBE /* Dimensions.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 764C4757EB194D13A8857DFA /* Dimensions.graphql.swift */; }; + BB28AF35DC102F8DE2A4BE9D /* OnRampTransactionsAuth.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = B3CC3D9DE64A39897BA580B3 /* OnRampTransactionsAuth.graphql.swift */; }; + BE0DBD01CF4DCA6D3CDDA369 /* NftActivity.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 55C67E53A2C8AEB6AE92E33F /* NftActivity.graphql.swift */; }; + BED0DD22C0D9E09C85DF010D /* NftAsset.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C9F3B31FC6AF8CE30CD7DA2 /* NftAsset.graphql.swift */; }; + BFB114718A0D262E3AEAEDC0 /* TransactionStatus.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 945EF0A3BD6F19DA14E40AE1 /* TransactionStatus.graphql.swift */; }; + C064037906B259088B6B78B2 /* NetworkFee.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09BE4B220A4F8465C3D01BA5 /* NetworkFee.graphql.swift */; }; + C0BBEE1CAEA4B2F778426BDE /* SelectWalletScreenQuery.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = EB9CACD175D6C20B6D4707C8 /* SelectWalletScreenQuery.graphql.swift */; }; + C8F5AF75BDB439143FE1C173 /* NftActivityFilterInput.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50C3E075E850CEC1714BE52C /* NftActivityFilterInput.graphql.swift */; }; + CA966CBD02A7B16BC55F1B8E /* ProtectionResult.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = AAB6B8C64F7525D0D0E978C6 /* ProtectionResult.graphql.swift */; }; + CBEB9122D993BCB0E9A604B7 /* Query.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5956ECBE73216D266D8D2E86 /* Query.graphql.swift */; }; + CE8C365D91CADE7A5A8F4D52 /* TopTokenParts.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 07F0E504152E22110917353E /* TopTokenParts.graphql.swift */; }; + CEE9E9912D5621F6E8F819B7 /* MultiplePortfolioBalancesQuery.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 595699514939A2CE780AF0CF /* MultiplePortfolioBalancesQuery.graphql.swift */; }; + D0B9B6DEC559290B7F64B24F /* TokenQuery.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0914ECF70C274E2B064BCD42 /* TokenQuery.graphql.swift */; }; + D1FB4E293EC152C12A495ACD /* TokenStandard.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = D34AC1057AD14362BB91E88B /* TokenStandard.graphql.swift */; }; D3B63ACA9B0C42F68080B080 /* InputMono-Regular.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 1834199AFFB04D91B05FFB64 /* InputMono-Regular.ttf */; }; - D660CA59775C3634324037ED /* MultiplePortfolioBalancesQuery.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4429CA6DA254ECC24A65DA14 /* MultiplePortfolioBalancesQuery.graphql.swift */; }; - D680C4844F2C5DACF5D0892E /* NftAssetsFilterInput.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B477EBEA1EDA3914C77E8A6 /* NftAssetsFilterInput.graphql.swift */; }; + D48D1B7A4469BAAA22608058 /* TokenSortableField.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51F133663B435829DE47E3CE /* TokenSortableField.graphql.swift */; }; + D5F36D3EDC206DF15EC368AC /* NftActivityType.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1CDAC035887C3908C3BD1A77 /* NftActivityType.graphql.swift */; }; + D6149AE9ED70F546DF5841BD /* ConvertQuery.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6E4DEE7FC8D7BCD030CFA4D3 /* ConvertQuery.graphql.swift */; }; D7926D4A878B2237137B300F /* Pods_WidgetsCoreTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 021E59CE7ECBD4FE0F3BFCFD /* Pods_WidgetsCoreTests.framework */; }; - D7E3642851C618D369D26B82 /* TokenMarketParts.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFC36D963A2A52D1E7CA77E4 /* TokenMarketParts.graphql.swift */; }; - D81BAFFCC105668B88B607FC /* NftCollectionConnection.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 92DE390311705FF1EE65C0E6 /* NftCollectionConnection.graphql.swift */; }; - DC0641C5870F91D26C914F1D /* TokenPriceHistoryQuery.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9DFBD29C0BDFDB4464B8189C /* TokenPriceHistoryQuery.graphql.swift */; }; + D8A0C6D04FF53BA4F50543FE /* NftAssetTrait.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85B43D489CC5ACF1EA34E9EB /* NftAssetTrait.graphql.swift */; }; + DB752E8F664505726ABDBCD3 /* NftBalance.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB2B02717B1A87BD41920151 /* NftBalance.graphql.swift */; }; + DC4AA6DE28B9F40A3D7600F1 /* TokenProjectsQuery.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = A98CEFE7189D63880FD5A702 /* TokenProjectsQuery.graphql.swift */; }; DE2F24512E7204C2CA255C50 /* Pods_Widgets.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2E8B7D36D2E14D9488F351EB /* Pods_Widgets.framework */; }; - E091F379106E92D3181103CB /* IAmount.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03AD8C2B1226EBE1524F2573 /* IAmount.graphql.swift */; }; - E0F63BA3A99DB10FA1CCAB5E /* TokenProjectUrlsParts.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 236126979349098B98C70F27 /* TokenProjectUrlsParts.graphql.swift */; }; - E24ED8688E9B18BBD543F8F0 /* TokenBalance.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = F4B149117182C6CC58DD570C /* TokenBalance.graphql.swift */; }; + E1009979B48ACF5017C12F09 /* TransactionListQuery.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95283AC560844B50E95934E4 /* TransactionListQuery.graphql.swift */; }; + E2C528F617A9675690171D54 /* DescriptionTranslations.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = D91432EF6C35F5A6301340A2 /* DescriptionTranslations.graphql.swift */; }; + E475BA358DD8BE30A6FDC051 /* NftBalanceEdge.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4DD55DFFC717D37DD960B82E /* NftBalanceEdge.graphql.swift */; }; + E4985BA9090E013F2C9FC190 /* TokenMarket.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8E5B09464C768590127BFA6 /* TokenMarket.graphql.swift */; }; E4B3067A930D2E57558E5229 /* Pods_Uniswap_UniswapTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0929C0B4AE1570B8C0B45D4D /* Pods_Uniswap_UniswapTests.framework */; }; - E54093DC857B8C634804D42B /* NftTransfer.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3317EBD4E3B11E2F2A1CE58 /* NftTransfer.graphql.swift */; }; - EF05F69E61EA8A16C6A66D53 /* IContract.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E0D68CC8D1F13D864F069BB /* IContract.graphql.swift */; }; - EF3D92CA76DEE66090F18D0C /* NftCollectionScreenQuery.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE0973BB445AAD8FAA25757F /* NftCollectionScreenQuery.graphql.swift */; }; - F0D6A92BB4FCE19CDFA5BBE1 /* HomeScreenTokensQuery.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = B7E03AA02B39A7A90C96AA76 /* HomeScreenTokensQuery.graphql.swift */; }; - F2EB62621E64B57B07DE8B13 /* Token.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 647933A5DC35BDFEEF3620A1 /* Token.graphql.swift */; }; + E654760CA0FF19139A85472A /* TokensQuery.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = D4C8174A3A9EB3244AA844F4 /* TokensQuery.graphql.swift */; }; + E7B6F1CA0E30585C949C9D9A /* NftAssetConnection.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD86EFAA0D6B8FBECCC4828B /* NftAssetConnection.graphql.swift */; }; + E7D4A29333634717D099F80E /* SwapOrderType.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AFDF569E43F173C2F5A07AF /* SwapOrderType.graphql.swift */; }; + E7EDBB8CDF65D5D6602BF8FC /* NftOrder.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 67C0D95F7EA9E7ACA9B18692 /* NftOrder.graphql.swift */; }; + EB0A75424F8EEF6612D28D52 /* NftTransfer.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74AD16E33DC518A42C386FE2 /* NftTransfer.graphql.swift */; }; + ED606CD83873CC9DFCCA44F1 /* FavoriteTokenCardQuery.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3B03A0A6AB0957A512A2D225 /* FavoriteTokenCardQuery.graphql.swift */; }; + EE4B861AE191A1BF70CF3784 /* WidgetTokensQuery.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F0A91F56B1CA2E71B479BAD /* WidgetTokensQuery.graphql.swift */; }; + F09E3F15A36A9050B028B3E3 /* TokenBasicProjectParts.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E8286984864AD69A0FAE3BC /* TokenBasicProjectParts.graphql.swift */; }; + F1193089AE71CA3C4C101EA5 /* OffRampTransfer.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 166A9AE7203545C397E683E8 /* OffRampTransfer.graphql.swift */; }; F35AFD3E27EE49990011A725 /* NotificationService.swift in Sources */ = {isa = PBXBuildFile; fileRef = F35AFD3D27EE49990011A725 /* NotificationService.swift */; }; F35AFD4227EE49990011A725 /* OneSignalNotificationServiceExtension.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = F35AFD3B27EE49990011A725 /* OneSignalNotificationServiceExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; - F53121FB1B070DB9A81347DF /* TokenProjectMarketsParts.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC055C3EDFDE2966FCA83C9E /* TokenProjectMarketsParts.graphql.swift */; }; - F5B577CA1201CB6FF04A9A58 /* ApplicationContract.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 608B07304ED1387B5AEAA3BB /* ApplicationContract.graphql.swift */; }; - F772B09295DABC5E8895C1C5 /* SelectWalletScreenQuery.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = B033206DC974BCB6AF8CC613 /* SelectWalletScreenQuery.graphql.swift */; }; - FA8EB6A63AB3F56194C6CFB8 /* TokenBalanceQuantityParts.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2370BAD675DC8064C00AC037 /* TokenBalanceQuantityParts.graphql.swift */; }; - FBE634E2AEC7A62B89863366 /* ContractInput.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7B3C6DF5DED22E892851B10 /* ContractInput.graphql.swift */; }; - FC7C117CEA5EA63460E6A2C6 /* NftApproveForAll.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = F5BCBB5D46312050E4A5BD64 /* NftApproveForAll.graphql.swift */; }; - FD4E55146E046C7F5983A379 /* FeedTransactionListQuery.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2BA0ACE5B9B2C41187CD41F3 /* FeedTransactionListQuery.graphql.swift */; }; + F49C1C4E9175DFE7EEF9FB51 /* Token.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2FB1590D18A58D37C750D9AC /* Token.graphql.swift */; }; + F77F1A182DCA1D8DFE46ACC8 /* TokenBalanceParts.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65AD13BFAD4EBA18AA6205E3 /* TokenBalanceParts.graphql.swift */; }; + F814C0144D90ADB4A8E0A34E /* Chain.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7DBCFBC330BF97BA2F630908 /* Chain.graphql.swift */; }; + F86D86FC31BBDA7246C50392 /* ProtectionAttackType.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = B3F4D5E8B9ED6E0FE29EA779 /* ProtectionAttackType.graphql.swift */; }; + FA318FB37223FAF04A5C887B /* TokenProjectUrlsParts.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 190523DBBA423868C74FF80D /* TokenProjectUrlsParts.graphql.swift */; }; + FC61EDE606C85346CE069C5D /* TransactionHistoryUpdaterQuery.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 559CBC7F568C769C48E7C6F4 /* TransactionHistoryUpdaterQuery.graphql.swift */; }; FD54D51D296C79A4007A37E9 /* GoogleServiceInfo in Resources */ = {isa = PBXBuildFile; fileRef = FD54D51C296C79A4007A37E9 /* GoogleServiceInfo */; }; FD7304CE28A364FC0085BDEA /* Colors.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = FD7304CD28A364FC0085BDEA /* Colors.xcassets */; }; FD7304D028A3650A0085BDEA /* Colors.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD7304CF28A3650A0085BDEA /* Colors.swift */; }; - FD84AA379C4562598807843D /* TokenStandard.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC419570F5A025E80AB10A72 /* TokenStandard.graphql.swift */; }; - FE9CE5C3B5A456B249FC34C5 /* NftActivityEdge.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4DB4379B5E222207CA7328D0 /* NftActivityEdge.graphql.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -436,16 +438,16 @@ 00E356EE1AD99517003FC87E /* UniswapTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = UniswapTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 00E356F11AD99517003FC87E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 00E356F21AD99517003FC87E /* UniswapTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = UniswapTests.m; sourceTree = ""; }; - 018603D0FA4D05DBF16F1441 /* TokenFeeDataParts.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TokenFeeDataParts.graphql.swift; path = WidgetsCore/MobileSchema/Fragments/TokenFeeDataParts.graphql.swift; sourceTree = ""; }; 021E59CE7ECBD4FE0F3BFCFD /* Pods_WidgetsCoreTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_WidgetsCoreTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 0373C61A7AF015058A502CE2 /* NftStandard.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftStandard.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Enums/NftStandard.graphql.swift; sourceTree = ""; }; 037C5AA92C04970B00B1D808 /* CopyIcon.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CopyIcon.swift; sourceTree = ""; }; - 03AD8C2B1226EBE1524F2573 /* IAmount.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IAmount.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Interfaces/IAmount.graphql.swift; sourceTree = ""; }; + 03AB6B21A1BFB3A18982B47E /* NFTItemScreenQuery.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NFTItemScreenQuery.graphql.swift; path = WidgetsCore/MobileSchema/Operations/Queries/NFTItemScreenQuery.graphql.swift; sourceTree = ""; }; 03C788222C10E7390011E5DC /* ActionButtons.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ActionButtons.swift; sourceTree = ""; }; 03D2F3172C218D380030D987 /* RelativeOffsetView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RelativeOffsetView.swift; sourceTree = ""; }; - 04E5C2900254E7BA7F10CE51 /* TopTokensQuery.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TopTokensQuery.graphql.swift; path = WidgetsCore/MobileSchema/Operations/Queries/TopTokensQuery.graphql.swift; sourceTree = ""; }; - 05BE2F49DD1FB9A692E21C13 /* NftBalance.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftBalance.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/NftBalance.graphql.swift; sourceTree = ""; }; + 043C7D80D6722AFCF1715D07 /* NftActivityEdge.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftActivityEdge.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/NftActivityEdge.graphql.swift; sourceTree = ""; }; + 05C66C49AF2B78703FCE4C7C /* AssetActivity.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AssetActivity.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/AssetActivity.graphql.swift; sourceTree = ""; }; 065A981F892F7A06A900FCD5 /* Pods-WidgetsCoreTests.dev.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-WidgetsCoreTests.dev.xcconfig"; path = "Target Support Files/Pods-WidgetsCoreTests/Pods-WidgetsCoreTests.dev.xcconfig"; sourceTree = ""; }; - 0702203B17BDD858CED28F8B /* ProtectionInfo.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ProtectionInfo.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/ProtectionInfo.graphql.swift; sourceTree = ""; }; + 066BBBD815CF2DE8803338BC /* AmountChange.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AmountChange.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/AmountChange.graphql.swift; sourceTree = ""; }; 0703EE022A5734A600AED1DA /* UserDefaults.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserDefaults.swift; sourceTree = ""; }; 070480372A58A507009006CE /* WidgetIntentExtension.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = WidgetIntentExtension.entitlements; sourceTree = ""; }; 0712B3629C74D1F958DF35FB /* Pods-Uniswap-UniswapTests.dev.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Uniswap-UniswapTests.dev.xcconfig"; path = "Target Support Files/Pods-Uniswap-UniswapTests/Pods-Uniswap-UniswapTests.dev.xcconfig"; sourceTree = ""; }; @@ -544,6 +546,7 @@ 074321E92A83E3C900F8518D /* IAmount.graphql.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = IAmount.graphql.swift; sourceTree = ""; }; 074321EA2A83E3C900F8518D /* IContract.graphql.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = IContract.graphql.swift; sourceTree = ""; }; 0743223F2A841BBD00F8518D /* Constants.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Constants.swift; sourceTree = ""; }; + 075E4C1DFAA00EE5B3CE792D /* ActivityDetails.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ActivityDetails.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Unions/ActivityDetails.graphql.swift; sourceTree = ""; }; 0767E0372A65C8330042ADA2 /* Colors.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Colors.swift; sourceTree = ""; }; 0767E03A2A65D2550042ADA2 /* Styling.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Styling.swift; sourceTree = ""; }; 077E60382A85587800ABC4B9 /* TokensQuery.graphql.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TokensQuery.graphql.swift; sourceTree = ""; }; @@ -556,17 +559,20 @@ 07B0676A2A7D6EC8001DD9B9 /* RNWidgets.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RNWidgets.swift; sourceTree = ""; }; 07B0676B2A7D6EC8001DD9B9 /* RNWidgets.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RNWidgets.m; sourceTree = ""; }; 07F0C28E2A5F3E2E00D5353E /* Env.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Env.swift; sourceTree = ""; }; + 07F0E504152E22110917353E /* TopTokenParts.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TopTokenParts.graphql.swift; path = WidgetsCore/MobileSchema/Fragments/TopTokenParts.graphql.swift; sourceTree = ""; }; 07F1363F2A575EC00067004F /* DataQueries.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DataQueries.swift; sourceTree = ""; }; 07F136412A5763480067004F /* Network.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Network.swift; sourceTree = ""; }; 07F5CF702A6AD97D00C648A5 /* Chart.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Chart.swift; sourceTree = ""; }; 07F5CF742A7020FD00C648A5 /* Format.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Format.swift; sourceTree = ""; }; 08C60D53AB82A6D0D31D0F78 /* Pods-WidgetIntentExtension.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-WidgetIntentExtension.release.xcconfig"; path = "Target Support Files/Pods-WidgetIntentExtension/Pods-WidgetIntentExtension.release.xcconfig"; sourceTree = ""; }; 08EBF075A4482F701892270B /* Pods-Widgets.dev.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Widgets.dev.xcconfig"; path = "Target Support Files/Pods-Widgets/Pods-Widgets.dev.xcconfig"; sourceTree = ""; }; + 0914ECF70C274E2B064BCD42 /* TokenQuery.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TokenQuery.graphql.swift; path = WidgetsCore/MobileSchema/Operations/Queries/TokenQuery.graphql.swift; sourceTree = ""; }; 0929C0B4AE1570B8C0B45D4D /* Pods_Uniswap_UniswapTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Uniswap_UniswapTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 0B132543F80E3C9191219E6D /* NftBalanceEdge.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftBalanceEdge.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/NftBalanceEdge.graphql.swift; sourceTree = ""; }; + 09BE4B220A4F8465C3D01BA5 /* NetworkFee.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NetworkFee.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/NetworkFee.graphql.swift; sourceTree = ""; }; + 0B0505DB30407C221B6A8491 /* TokenProjectMarket.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TokenProjectMarket.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/TokenProjectMarket.graphql.swift; sourceTree = ""; }; 0B7E5D62E11408EB5F0F5A80 /* Pods-WidgetsCore.beta.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-WidgetsCore.beta.xcconfig"; path = "Target Support Files/Pods-WidgetsCore/Pods-WidgetsCore.beta.xcconfig"; sourceTree = ""; }; - 0BB4A40E30E1D985519DB3CF /* TokenProtectionInfoParts.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TokenProtectionInfoParts.graphql.swift; path = WidgetsCore/MobileSchema/Fragments/TokenProtectionInfoParts.graphql.swift; sourceTree = ""; }; 0C19DE44A750FB17647FF2B6 /* Pods-Widgets.beta.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Widgets.beta.xcconfig"; path = "Target Support Files/Pods-Widgets/Pods-Widgets.beta.xcconfig"; sourceTree = ""; }; + 0D09FFE2B5E56CDCAB2F9455 /* NftCollectionConnection.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftCollectionConnection.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/NftCollectionConnection.graphql.swift; sourceTree = ""; }; 0DB282242CDADB260014CF77 /* EmbeddedWallet.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = EmbeddedWallet.m; sourceTree = ""; }; 0DB282252CDADB260014CF77 /* EmbeddedWallet.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EmbeddedWallet.swift; sourceTree = ""; }; 0DC6ADEF2B1E2C0F0092909C /* PortfolioValueModifier.graphql.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PortfolioValueModifier.graphql.swift; sourceTree = ""; }; @@ -574,91 +580,80 @@ 0DE251442C13B69D005F47F9 /* OnRampTransfer.graphql.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OnRampTransfer.graphql.swift; sourceTree = ""; }; 0DE251452C13B69D005F47F9 /* OnRampServiceProvider.graphql.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OnRampServiceProvider.graphql.swift; sourceTree = ""; }; 0DE251462C13B69D005F47F9 /* OnRampTransactionDetails.graphql.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OnRampTransactionDetails.graphql.swift; sourceTree = ""; }; + 0E7FF51A507BF788E64E3EFE /* HomeScreenTokensQuery.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = HomeScreenTokensQuery.graphql.swift; path = WidgetsCore/MobileSchema/Operations/Queries/HomeScreenTokensQuery.graphql.swift; sourceTree = ""; }; + 1053483279043EED7612BE90 /* HistoryDuration.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = HistoryDuration.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Enums/HistoryDuration.graphql.swift; sourceTree = ""; }; 1064E23E366D0C2C2B20C30E /* Pods_WidgetIntentExtension.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_WidgetIntentExtension.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 1166529407CA13E4D4F24F12 /* TokenFeeDataParts.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TokenFeeDataParts.graphql.swift; path = WidgetsCore/MobileSchema/Fragments/TokenFeeDataParts.graphql.swift; sourceTree = ""; }; 1193B3A845BC3BE8CAA00D01 /* Pods-OneSignalNotificationServiceExtension.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-OneSignalNotificationServiceExtension.release.xcconfig"; path = "Target Support Files/Pods-OneSignalNotificationServiceExtension/Pods-OneSignalNotificationServiceExtension.release.xcconfig"; sourceTree = ""; }; - 12D3AB6C2FC9513E9F224B7C /* OnRampTransactionDetails.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = OnRampTransactionDetails.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/OnRampTransactionDetails.graphql.swift; sourceTree = ""; }; - 137696908D703632CEE3AB28 /* TokenBalanceMainParts.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TokenBalanceMainParts.graphql.swift; path = WidgetsCore/MobileSchema/Fragments/TokenBalanceMainParts.graphql.swift; sourceTree = ""; }; + 1276D33B06E840B8E6839F39 /* TokenProjectDescriptionQuery.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TokenProjectDescriptionQuery.graphql.swift; path = WidgetsCore/MobileSchema/Operations/Queries/TokenProjectDescriptionQuery.graphql.swift; sourceTree = ""; }; 13B07F961A680F5B00A75B9A /* Uniswap.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Uniswap.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 13B07FAF1A68108700A75B9A /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = Uniswap/AppDelegate.h; sourceTree = ""; }; 13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = Uniswap/Images.xcassets; sourceTree = ""; }; 13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = Uniswap/Info.plist; sourceTree = ""; }; - 13B07FB71A68108700A75B9A /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = Uniswap/main.m; sourceTree = ""; }; - 148617FD73F2CD7117960DBA /* SwapOrderType.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SwapOrderType.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Enums/SwapOrderType.graphql.swift; sourceTree = ""; }; 15092E550A1C78508ABA3280 /* Pods_OneSignalNotificationServiceExtension.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_OneSignalNotificationServiceExtension.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 17819A49DE69723EC60D9D72 /* FeeData.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = FeeData.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/FeeData.graphql.swift; sourceTree = ""; }; + 166A9AE7203545C397E683E8 /* OffRampTransfer.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = OffRampTransfer.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/OffRampTransfer.graphql.swift; sourceTree = ""; }; 178644A78AB62609EFDB66B3 /* Pods-Uniswap.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Uniswap.release.xcconfig"; path = "Target Support Files/Pods-Uniswap/Pods-Uniswap.release.xcconfig"; sourceTree = ""; }; + 1810C60B56CC74150C868801 /* NftBalancesFilterInput.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftBalancesFilterInput.graphql.swift; path = WidgetsCore/MobileSchema/Schema/InputObjects/NftBalancesFilterInput.graphql.swift; sourceTree = ""; }; + 181209B4CDE80BDC80891CFD /* TokenBalance.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TokenBalance.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/TokenBalance.graphql.swift; sourceTree = ""; }; 1834199AFFB04D91B05FFB64 /* InputMono-Regular.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "InputMono-Regular.ttf"; path = "../src/assets/fonts/InputMono-Regular.ttf"; sourceTree = ""; }; - 1849039FD4A210DA990363C8 /* Portfolio.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Portfolio.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/Portfolio.graphql.swift; sourceTree = ""; }; - 18B9EB43501127BE1B14F1A5 /* NftContract.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftContract.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/NftContract.graphql.swift; sourceTree = ""; }; + 18D48B25E03122149B0D1304 /* TransactionType.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TransactionType.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Enums/TransactionType.graphql.swift; sourceTree = ""; }; + 190523DBBA423868C74FF80D /* TokenProjectUrlsParts.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TokenProjectUrlsParts.graphql.swift; path = WidgetsCore/MobileSchema/Fragments/TokenProjectUrlsParts.graphql.swift; sourceTree = ""; }; 1CC6ADAADCA38FDAEB181E86 /* Pods-WidgetIntentExtension.dev.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-WidgetIntentExtension.dev.xcconfig"; path = "Target Support Files/Pods-WidgetIntentExtension/Pods-WidgetIntentExtension.dev.xcconfig"; sourceTree = ""; }; - 1FC7B80EC0E0D2134B67575B /* NftBalanceConnection.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftBalanceConnection.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/NftBalanceConnection.graphql.swift; sourceTree = ""; }; - 207F4DF7664454C31DE069F8 /* NFTItemScreenQuery.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NFTItemScreenQuery.graphql.swift; path = WidgetsCore/MobileSchema/Operations/Queries/NFTItemScreenQuery.graphql.swift; sourceTree = ""; }; - 2139ABF56EA067ED792A48C9 /* OnRampTransfer.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = OnRampTransfer.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/OnRampTransfer.graphql.swift; sourceTree = ""; }; - 218B8AB05C80D919671D3970 /* NftAssetConnection.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftAssetConnection.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/NftAssetConnection.graphql.swift; sourceTree = ""; }; + 1CDAC035887C3908C3BD1A77 /* NftActivityType.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftActivityType.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Enums/NftActivityType.graphql.swift; sourceTree = ""; }; + 1D9189C818AFF8E988F861D0 /* IContract.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IContract.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Interfaces/IContract.graphql.swift; sourceTree = ""; }; + 1F1731869775D16A9EAB475C /* NftAssetTraitInput.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftAssetTraitInput.graphql.swift; path = WidgetsCore/MobileSchema/Schema/InputObjects/NftAssetTraitInput.graphql.swift; sourceTree = ""; }; 2226DF79BEAFECEE11A51347 /* Pods_Uniswap.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Uniswap.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 224CA82F1871016F4173F69E /* TransactionListQuery.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TransactionListQuery.graphql.swift; path = WidgetsCore/MobileSchema/Operations/Queries/TransactionListQuery.graphql.swift; sourceTree = ""; }; - 236126979349098B98C70F27 /* TokenProjectUrlsParts.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TokenProjectUrlsParts.graphql.swift; path = WidgetsCore/MobileSchema/Fragments/TokenProjectUrlsParts.graphql.swift; sourceTree = ""; }; - 2370BAD675DC8064C00AC037 /* TokenBalanceQuantityParts.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TokenBalanceQuantityParts.graphql.swift; path = WidgetsCore/MobileSchema/Fragments/TokenBalanceQuantityParts.graphql.swift; sourceTree = ""; }; - 25B4C7C7FEF32EAF10D030F9 /* Currency.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Currency.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Enums/Currency.graphql.swift; sourceTree = ""; }; - 27F8B915042BD8D67D9627EA /* HomeScreenTokenParts.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = HomeScreenTokenParts.graphql.swift; path = WidgetsCore/MobileSchema/Fragments/HomeScreenTokenParts.graphql.swift; sourceTree = ""; }; - 2ABA47847A73130D356EB6BF /* TransactionStatus.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TransactionStatus.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Enums/TransactionStatus.graphql.swift; sourceTree = ""; }; - 2BA0ACE5B9B2C41187CD41F3 /* FeedTransactionListQuery.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = FeedTransactionListQuery.graphql.swift; path = WidgetsCore/MobileSchema/Operations/Queries/FeedTransactionListQuery.graphql.swift; sourceTree = ""; }; - 2C2F4BE3080D4129D4478528 /* TokenBasicProjectParts.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TokenBasicProjectParts.graphql.swift; path = WidgetsCore/MobileSchema/Fragments/TokenBasicProjectParts.graphql.swift; sourceTree = ""; }; - 2D95FE36D2667E070345CDD0 /* NftActivityType.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftActivityType.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Enums/NftActivityType.graphql.swift; sourceTree = ""; }; - 2E49E724432C70A2551FB2C7 /* SchemaConfiguration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SchemaConfiguration.swift; path = WidgetsCore/MobileSchema/Schema/SchemaConfiguration.swift; sourceTree = ""; }; + 22F8093091A9E5FC0D6284BA /* SafetyLevel.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SafetyLevel.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Enums/SafetyLevel.graphql.swift; sourceTree = ""; }; + 243576FAC8D2801F9D99ECC9 /* TopTokensQuery.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TopTokensQuery.graphql.swift; path = WidgetsCore/MobileSchema/Operations/Queries/TopTokensQuery.graphql.swift; sourceTree = ""; }; + 2E8286984864AD69A0FAE3BC /* TokenBasicProjectParts.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TokenBasicProjectParts.graphql.swift; path = WidgetsCore/MobileSchema/Fragments/TokenBasicProjectParts.graphql.swift; sourceTree = ""; }; 2E8B7D36D2E14D9488F351EB /* Pods_Widgets.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Widgets.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 315B8A905FA2C60C053F138B /* OnRampTransactionsAuth.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = OnRampTransactionsAuth.graphql.swift; path = WidgetsCore/MobileSchema/Schema/InputObjects/OnRampTransactionsAuth.graphql.swift; sourceTree = ""; }; - 31ED613D63FE9C56D9270517 /* Image.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Image.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/Image.graphql.swift; sourceTree = ""; }; - 32012AC135EBD991C8F02F92 /* TokenSortableField.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TokenSortableField.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Enums/TokenSortableField.graphql.swift; sourceTree = ""; }; - 3377F7BB38BD5A45AE31909D /* TokenBasicInfoParts.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TokenBasicInfoParts.graphql.swift; path = WidgetsCore/MobileSchema/Fragments/TokenBasicInfoParts.graphql.swift; sourceTree = ""; }; - 37038CCEB11E70E2027EF4EA /* NftCollectionEdge.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftCollectionEdge.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/NftCollectionEdge.graphql.swift; sourceTree = ""; }; - 396B6AB3BB41898B56EB3828 /* OffRampTransactionDetails.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = OffRampTransactionDetails.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/OffRampTransactionDetails.graphql.swift; sourceTree = ""; }; - 39F60B2B54796DC978765C99 /* AssetChange.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AssetChange.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Unions/AssetChange.graphql.swift; sourceTree = ""; }; - 39FC2A13550FA6754EC1A7FC /* NftOrderConnection.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftOrderConnection.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/NftOrderConnection.graphql.swift; sourceTree = ""; }; + 2FB1590D18A58D37C750D9AC /* Token.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Token.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/Token.graphql.swift; sourceTree = ""; }; + 310373063D8A11E9E02314FE /* NftAssetsFilterInput.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftAssetsFilterInput.graphql.swift; path = WidgetsCore/MobileSchema/Schema/InputObjects/NftAssetsFilterInput.graphql.swift; sourceTree = ""; }; + 31CBA4397C44A04E218AEF28 /* TimestampedAmount.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TimestampedAmount.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/TimestampedAmount.graphql.swift; sourceTree = ""; }; + 37376E4CF3A4B76E9DAE150C /* IAmount.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IAmount.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Interfaces/IAmount.graphql.swift; sourceTree = ""; }; 3A2186B1FF7FB85663D96EA9 /* Pods-OneSignalNotificationServiceExtension.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-OneSignalNotificationServiceExtension.debug.xcconfig"; path = "Target Support Files/Pods-OneSignalNotificationServiceExtension/Pods-OneSignalNotificationServiceExtension.debug.xcconfig"; sourceTree = ""; }; - 3B9A505509D9A85BE1DB7D05 /* TokenProjectMarket.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TokenProjectMarket.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/TokenProjectMarket.graphql.swift; sourceTree = ""; }; - 3BF42F88002431BFDC9FCA9F /* HistoryDuration.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = HistoryDuration.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Enums/HistoryDuration.graphql.swift; sourceTree = ""; }; + 3B03A0A6AB0957A512A2D225 /* FavoriteTokenCardQuery.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = FavoriteTokenCardQuery.graphql.swift; path = WidgetsCore/MobileSchema/Operations/Queries/FavoriteTokenCardQuery.graphql.swift; sourceTree = ""; }; 3C606D2C81014A0A8898F38E /* Basel-Grotesk-Medium.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "Basel-Grotesk-Medium.otf"; path = "../src/assets/fonts/Basel-Grotesk-Medium.otf"; sourceTree = ""; }; 3D8FCE4CD401350CA74DCC89 /* Pods-WidgetsCoreTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-WidgetsCoreTests.debug.xcconfig"; path = "Target Support Files/Pods-WidgetsCoreTests/Pods-WidgetsCoreTests.debug.xcconfig"; sourceTree = ""; }; 3E279F675B02CBC50D3B57D5 /* Pods-WidgetsCore.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-WidgetsCore.release.xcconfig"; path = "Target Support Files/Pods-WidgetsCore/Pods-WidgetsCore.release.xcconfig"; sourceTree = ""; }; - 3F0EEAC1DADE827AE38EB8A6 /* FavoriteTokenCardQuery.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = FavoriteTokenCardQuery.graphql.swift; path = WidgetsCore/MobileSchema/Operations/Queries/FavoriteTokenCardQuery.graphql.swift; sourceTree = ""; }; - 40E034582FBD2C374CEF808E /* ProtectionAttackType.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ProtectionAttackType.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Enums/ProtectionAttackType.graphql.swift; sourceTree = ""; }; - 41003491EF939043CF9D0F4E /* PortfolioValueModifier.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PortfolioValueModifier.graphql.swift; path = WidgetsCore/MobileSchema/Schema/InputObjects/PortfolioValueModifier.graphql.swift; sourceTree = ""; }; - 41BA2129FFE961C8549C8A30 /* NftBalancesFilterInput.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftBalancesFilterInput.graphql.swift; path = WidgetsCore/MobileSchema/Schema/InputObjects/NftBalancesFilterInput.graphql.swift; sourceTree = ""; }; - 43E2ECCEFBC3BE8D13BE6CAB /* NftActivityFilterInput.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftActivityFilterInput.graphql.swift; path = WidgetsCore/MobileSchema/Schema/InputObjects/NftActivityFilterInput.graphql.swift; sourceTree = ""; }; - 4429CA6DA254ECC24A65DA14 /* MultiplePortfolioBalancesQuery.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MultiplePortfolioBalancesQuery.graphql.swift; path = WidgetsCore/MobileSchema/Operations/Queries/MultiplePortfolioBalancesQuery.graphql.swift; sourceTree = ""; }; + 3E5D1A04B42B25218C53C107 /* OnRampTransfer.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = OnRampTransfer.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/OnRampTransfer.graphql.swift; sourceTree = ""; }; + 3EF9AEC00868BFD7CEBF202C /* BlockaidFees.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BlockaidFees.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/BlockaidFees.graphql.swift; sourceTree = ""; }; + 45FFF7DE2E8C2A6400362570 /* SilentPushEventEmitter.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SilentPushEventEmitter.m; sourceTree = ""; }; + 45FFF7E02E8C2E6100362570 /* SilentPushEventEmitter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SilentPushEventEmitter.swift; sourceTree = ""; }; 4781CD4CDD95B5792B793F75 /* Pods-Uniswap-UniswapTests.beta.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Uniswap-UniswapTests.beta.xcconfig"; path = "Target Support Files/Pods-Uniswap-UniswapTests/Pods-Uniswap-UniswapTests.beta.xcconfig"; sourceTree = ""; }; - 4981A14906A35E8A0B7F9457 /* TokenProject.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TokenProject.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/TokenProject.graphql.swift; sourceTree = ""; }; - 49BD6C776029FAF4FC711DE7 /* NftOrderEdge.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftOrderEdge.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/NftOrderEdge.graphql.swift; sourceTree = ""; }; - 4A8990A17F489F284E0DB1B3 /* Chain.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Chain.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Enums/Chain.graphql.swift; sourceTree = ""; }; - 4ACFA5B4204741038C986C5D /* SafetyLevel.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SafetyLevel.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Enums/SafetyLevel.graphql.swift; sourceTree = ""; }; - 4B308EC3DB7C3C1DD5DDE03D /* NftStandard.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftStandard.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Enums/NftStandard.graphql.swift; sourceTree = ""; }; 4C445DB9798210862C34D0E0 /* Pods-WidgetsCoreTests.beta.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-WidgetsCoreTests.beta.xcconfig"; path = "Target Support Files/Pods-WidgetsCoreTests/Pods-WidgetsCoreTests.beta.xcconfig"; sourceTree = ""; }; - 4DB4379B5E222207CA7328D0 /* NftActivityEdge.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftActivityEdge.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/NftActivityEdge.graphql.swift; sourceTree = ""; }; + 4DD55DFFC717D37DD960B82E /* NftBalanceEdge.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftBalanceEdge.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/NftBalanceEdge.graphql.swift; sourceTree = ""; }; 4DF5F26A06553EFDD4D99214 /* ExpoModulesProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ExpoModulesProvider.swift; path = "Pods/Target Support Files/Pods-Uniswap/ExpoModulesProvider.swift"; sourceTree = ""; }; - 4E32BBB65A6DD9CFF608C8E8 /* NftApproval.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftApproval.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/NftApproval.graphql.swift; sourceTree = ""; }; - 4E5FA43C5E31035775917C4E /* NftBalanceAssetInput.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftBalanceAssetInput.graphql.swift; path = WidgetsCore/MobileSchema/Schema/InputObjects/NftBalanceAssetInput.graphql.swift; sourceTree = ""; }; - 4F4F47D22B749A438B5BF674 /* NftCollectionMarket.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftCollectionMarket.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/NftCollectionMarket.graphql.swift; sourceTree = ""; }; - 54B1C71AED738D17898103A6 /* Dimensions.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Dimensions.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/Dimensions.graphql.swift; sourceTree = ""; }; - 556339705BD103365D4ED07B /* NftAssetTraitInput.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftAssetTraitInput.graphql.swift; path = WidgetsCore/MobileSchema/Schema/InputObjects/NftAssetTraitInput.graphql.swift; sourceTree = ""; }; - 5640432978873FB030467750 /* TopTokenParts.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TopTokenParts.graphql.swift; path = WidgetsCore/MobileSchema/Fragments/TopTokenParts.graphql.swift; sourceTree = ""; }; + 50C3E075E850CEC1714BE52C /* NftActivityFilterInput.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftActivityFilterInput.graphql.swift; path = WidgetsCore/MobileSchema/Schema/InputObjects/NftActivityFilterInput.graphql.swift; sourceTree = ""; }; + 51F133663B435829DE47E3CE /* TokenSortableField.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TokenSortableField.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Enums/TokenSortableField.graphql.swift; sourceTree = ""; }; + 522135E54BDB258B45B5A694 /* SchemaMetadata.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SchemaMetadata.graphql.swift; path = WidgetsCore/MobileSchema/Schema/SchemaMetadata.graphql.swift; sourceTree = ""; }; + 5397E77A577E9952D2477020 /* Portfolio.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Portfolio.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/Portfolio.graphql.swift; sourceTree = ""; }; + 53F4E5E9341BE66984935185 /* SwapOrderDetails.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SwapOrderDetails.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/SwapOrderDetails.graphql.swift; sourceTree = ""; }; + 55081ADF188C967FC1ECD289 /* TokenMarketParts.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TokenMarketParts.graphql.swift; path = WidgetsCore/MobileSchema/Fragments/TokenMarketParts.graphql.swift; sourceTree = ""; }; + 55240C84512D3851C8B9F027 /* TransactionDetails.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TransactionDetails.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/TransactionDetails.graphql.swift; sourceTree = ""; }; + 559CBC7F568C769C48E7C6F4 /* TransactionHistoryUpdaterQuery.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TransactionHistoryUpdaterQuery.graphql.swift; path = WidgetsCore/MobileSchema/Operations/Queries/TransactionHistoryUpdaterQuery.graphql.swift; sourceTree = ""; }; + 55A243177E9FA92A0524A222 /* NftContract.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftContract.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/NftContract.graphql.swift; sourceTree = ""; }; + 55C67E53A2C8AEB6AE92E33F /* NftActivity.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftActivity.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/NftActivity.graphql.swift; sourceTree = ""; }; 56FE9C9AF785221B7E3F4C04 /* Pods-Uniswap.dev.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Uniswap.dev.xcconfig"; path = "Target Support Files/Pods-Uniswap/Pods-Uniswap.dev.xcconfig"; sourceTree = ""; }; + 595699514939A2CE780AF0CF /* MultiplePortfolioBalancesQuery.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MultiplePortfolioBalancesQuery.graphql.swift; path = WidgetsCore/MobileSchema/Operations/Queries/MultiplePortfolioBalancesQuery.graphql.swift; sourceTree = ""; }; + 5956ECBE73216D266D8D2E86 /* Query.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Query.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/Query.graphql.swift; sourceTree = ""; }; + 59DD4D834D7B42A6D02F4F12 /* ApplicationContract.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ApplicationContract.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/ApplicationContract.graphql.swift; sourceTree = ""; }; + 5B0A1F5F6FC3E1141E228B7D /* TokenBalanceQuantityParts.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TokenBalanceQuantityParts.graphql.swift; path = WidgetsCore/MobileSchema/Fragments/TokenBalanceQuantityParts.graphql.swift; sourceTree = ""; }; 5B4398E82DD3B22C00F6BE08 /* PrivateKeyDisplayManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PrivateKeyDisplayManager.m; sourceTree = ""; }; 5B4398E92DD3B22C00F6BE08 /* PrivateKeyDisplayManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PrivateKeyDisplayManager.swift; sourceTree = ""; }; 5B4398EA2DD3B22C00F6BE08 /* PrivateKeyDisplayView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PrivateKeyDisplayView.swift; sourceTree = ""; }; 5B4CEC5E2DD65DD4009F082B /* CopyIconOutline.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CopyIconOutline.swift; sourceTree = ""; }; - 5E0D68CC8D1F13D864F069BB /* IContract.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IContract.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Interfaces/IContract.graphql.swift; sourceTree = ""; }; + 5BED80DB034487FCA1450EDB /* OnRampServiceProvider.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = OnRampServiceProvider.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/OnRampServiceProvider.graphql.swift; sourceTree = ""; }; + 5C9F3B31FC6AF8CE30CD7DA2 /* NftAsset.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftAsset.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/NftAsset.graphql.swift; sourceTree = ""; }; 5E5E0A622D380F5700E166AA /* Env.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Env.swift; sourceTree = ""; }; 5EFB78352B1E585000E77EAC /* ConvertQuery.graphql.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ConvertQuery.graphql.swift; sourceTree = ""; }; - 600250B00B6C02AAB063818B /* NftMarketplace.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftMarketplace.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Enums/NftMarketplace.graphql.swift; sourceTree = ""; }; - 608B07304ED1387B5AEAA3BB /* ApplicationContract.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ApplicationContract.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/ApplicationContract.graphql.swift; sourceTree = ""; }; 62CEA9F2D5176D20A6402A3E /* Pods-Uniswap.beta.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Uniswap.beta.xcconfig"; path = "Target Support Files/Pods-Uniswap/Pods-Uniswap.beta.xcconfig"; sourceTree = ""; }; - 63ACFF2A1D5AE3498731AC69 /* NftCollection.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftCollection.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/NftCollection.graphql.swift; sourceTree = ""; }; - 647933A5DC35BDFEEF3620A1 /* Token.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Token.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/Token.graphql.swift; sourceTree = ""; }; + 62DDC1F42E7172783EAF3776 /* NftBalanceConnection.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftBalanceConnection.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/NftBalanceConnection.graphql.swift; sourceTree = ""; }; 649A7A762D9AE70B00B53589 /* KeychainConstants.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeychainConstants.swift; sourceTree = ""; }; 649A7A772D9AE70B00B53589 /* KeychainUtils.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeychainUtils.swift; sourceTree = ""; }; - 69F2FFD11FB5E462CC454A15 /* TransactionType.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TransactionType.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Enums/TransactionType.graphql.swift; sourceTree = ""; }; - 6A84A192F750A0F1BC8D7A69 /* OnRampServiceProvider.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = OnRampServiceProvider.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/OnRampServiceProvider.graphql.swift; sourceTree = ""; }; + 64D494D944670E557175A694 /* TransactionDirection.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TransactionDirection.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Enums/TransactionDirection.graphql.swift; sourceTree = ""; }; + 65AD13BFAD4EBA18AA6205E3 /* TokenBalanceParts.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TokenBalanceParts.graphql.swift; path = WidgetsCore/MobileSchema/Fragments/TokenBalanceParts.graphql.swift; sourceTree = ""; }; + 67C0D95F7EA9E7ACA9B18692 /* NftOrder.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftOrder.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/NftOrder.graphql.swift; sourceTree = ""; }; + 696F6C5220D0072E380E198F /* NftBalanceAssetInput.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftBalanceAssetInput.graphql.swift; path = WidgetsCore/MobileSchema/Schema/InputObjects/NftBalanceAssetInput.graphql.swift; sourceTree = ""; }; 6BC7D07B2B5FF02400617C95 /* ScantasticEncryption.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ScantasticEncryption.m; sourceTree = ""; }; 6BC7D07C2B5FF02400617C95 /* ScantasticEncryption.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ScantasticEncryption.swift; sourceTree = ""; }; 6BC7D07D2B5FF02400617C95 /* EncryptionUtils.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EncryptionUtils.swift; sourceTree = ""; }; @@ -669,26 +664,28 @@ 6CA91BDE2A95226200C4063E /* RNCloudStorageBackupsManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RNCloudStorageBackupsManager.m; sourceTree = ""; }; 6CA91BDF2A95226200C4063E /* EncryptionHelper.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EncryptionHelper.swift; sourceTree = ""; }; 6CA91BE02A95226200C4063E /* RNCloudStorageBackupsManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RNCloudStorageBackupsManager.swift; sourceTree = ""; }; - 6DF7C8888BE6AFA2F22889FE /* NftAssetEdge.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftAssetEdge.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/NftAssetEdge.graphql.swift; sourceTree = ""; }; - 6E3A78386B3B779B688021FF /* NftOrder.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftOrder.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/NftOrder.graphql.swift; sourceTree = ""; }; + 6D4C849A7805FCCEE8C8C3E6 /* AssetChange.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AssetChange.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Unions/AssetChange.graphql.swift; sourceTree = ""; }; + 6E4DEE7FC8D7BCD030CFA4D3 /* ConvertQuery.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConvertQuery.graphql.swift; path = WidgetsCore/MobileSchema/Operations/Queries/ConvertQuery.graphql.swift; sourceTree = ""; }; + 6F0A91F56B1CA2E71B479BAD /* WidgetTokensQuery.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = WidgetTokensQuery.graphql.swift; path = WidgetsCore/MobileSchema/Operations/Queries/WidgetTokensQuery.graphql.swift; sourceTree = ""; }; 6F33E8069B7B40AFB313B8B0 /* Basel-Grotesk-Book.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "Basel-Grotesk-Book.otf"; path = "../src/assets/fonts/Basel-Grotesk-Book.otf"; sourceTree = ""; }; 6F3DC921A65D749C0852B10C /* Pods-Uniswap-UniswapTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Uniswap-UniswapTests.debug.xcconfig"; path = "Target Support Files/Pods-Uniswap-UniswapTests/Pods-Uniswap-UniswapTests.debug.xcconfig"; sourceTree = ""; }; 6F7814C6D40D9C348EA1F1C7 /* Pods-OneSignalNotificationServiceExtension.dev.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-OneSignalNotificationServiceExtension.dev.xcconfig"; path = "Target Support Files/Pods-OneSignalNotificationServiceExtension/Pods-OneSignalNotificationServiceExtension.dev.xcconfig"; sourceTree = ""; }; - 6FF8B660E9C2C0D8DDF7588A /* TokenProjectDescriptionQuery.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TokenProjectDescriptionQuery.graphql.swift; path = WidgetsCore/MobileSchema/Operations/Queries/TokenProjectDescriptionQuery.graphql.swift; sourceTree = ""; }; - 70851E3D1A4B296A1CE22A20 /* NftAssetTrait.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftAssetTrait.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/NftAssetTrait.graphql.swift; sourceTree = ""; }; - 730CA356D6E1D498CC0C1472 /* NftsTabQuery.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftsTabQuery.graphql.swift; path = WidgetsCore/MobileSchema/Operations/Queries/NftsTabQuery.graphql.swift; sourceTree = ""; }; - 74885865ED8CFEA875E40916 /* TokenQuery.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TokenQuery.graphql.swift; path = WidgetsCore/MobileSchema/Operations/Queries/TokenQuery.graphql.swift; sourceTree = ""; }; + 74AD16E33DC518A42C386FE2 /* NftTransfer.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftTransfer.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/NftTransfer.graphql.swift; sourceTree = ""; }; + 764C4757EB194D13A8857DFA /* Dimensions.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Dimensions.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/Dimensions.graphql.swift; sourceTree = ""; }; 7A7637BBC9B3A68E0338D96E /* Pods-WidgetIntentExtension.beta.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-WidgetIntentExtension.beta.xcconfig"; path = "Target Support Files/Pods-WidgetIntentExtension/Pods-WidgetIntentExtension.beta.xcconfig"; sourceTree = ""; }; - 7BD3F0794908635CDFA7DAB6 /* ConvertQuery.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConvertQuery.graphql.swift; path = WidgetsCore/MobileSchema/Operations/Queries/ConvertQuery.graphql.swift; sourceTree = ""; }; - 7E1F288B7EDDE906C4C00C46 /* DescriptionTranslations.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DescriptionTranslations.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/DescriptionTranslations.graphql.swift; sourceTree = ""; }; + 7AFDF569E43F173C2F5A07AF /* SwapOrderType.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SwapOrderType.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Enums/SwapOrderType.graphql.swift; sourceTree = ""; }; + 7DBCFBC330BF97BA2F630908 /* Chain.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Chain.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Enums/Chain.graphql.swift; sourceTree = ""; }; 82C9871585F60F92D079FB95 /* Pods-Widgets.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Widgets.release.xcconfig"; path = "Target Support Files/Pods-Widgets/Pods-Widgets.release.xcconfig"; sourceTree = ""; }; - 84997376A0B436ECC0A996C5 /* ExploreSearchQuery.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ExploreSearchQuery.graphql.swift; path = WidgetsCore/MobileSchema/Operations/Queries/ExploreSearchQuery.graphql.swift; sourceTree = ""; }; + 835D9DF76533D22EDF0E9D67 /* TokenProtectionInfoParts.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TokenProtectionInfoParts.graphql.swift; path = WidgetsCore/MobileSchema/Fragments/TokenProtectionInfoParts.graphql.swift; sourceTree = ""; }; + 83FB27D93A9468E6DB47231C /* NftMarketplace.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftMarketplace.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Enums/NftMarketplace.graphql.swift; sourceTree = ""; }; + 85B43D489CC5ACF1EA34E9EB /* NftAssetTrait.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftAssetTrait.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/NftAssetTrait.graphql.swift; sourceTree = ""; }; 8719E5872CC41AB64503E903 /* Pods-WidgetIntentExtension.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-WidgetIntentExtension.debug.xcconfig"; path = "Target Support Files/Pods-WidgetIntentExtension/Pods-WidgetIntentExtension.debug.xcconfig"; sourceTree = ""; }; - 8A4EB7BAD2C90E61FD6C30AF /* ActivityDetails.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ActivityDetails.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Unions/ActivityDetails.graphql.swift; sourceTree = ""; }; - 8A5342DEF1410E0E81E97F40 /* SearchTokensQuery.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SearchTokensQuery.graphql.swift; path = WidgetsCore/MobileSchema/Operations/Queries/SearchTokensQuery.graphql.swift; sourceTree = ""; }; - 8B477EBEA1EDA3914C77E8A6 /* NftAssetsFilterInput.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftAssetsFilterInput.graphql.swift; path = WidgetsCore/MobileSchema/Schema/InputObjects/NftAssetsFilterInput.graphql.swift; sourceTree = ""; }; - 8BEADEB4AE05B860CF2232D1 /* NetworkFee.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NetworkFee.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/NetworkFee.graphql.swift; sourceTree = ""; }; - 8DA4E7C052A6C4AC3A9DCDA6 /* TokenTransfer.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TokenTransfer.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/TokenTransfer.graphql.swift; sourceTree = ""; }; + 87442A651C068E552BEA89C6 /* MobileSchema.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MobileSchema.graphql.swift; path = WidgetsCore/MobileSchema/MobileSchema.graphql.swift; sourceTree = ""; }; + 87CF9B03AE29A19C5B0F4E35 /* OnRampTransactionDetails.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = OnRampTransactionDetails.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/OnRampTransactionDetails.graphql.swift; sourceTree = ""; }; + 8856DFFC7FDC9BF105B0B4E3 /* TokenProject.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TokenProject.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/TokenProject.graphql.swift; sourceTree = ""; }; + 8B2A92162EB3E78E00990413 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = AppDelegate.swift; path = Uniswap/AppDelegate.swift; sourceTree = ""; }; + 8B2A92182EB3E79500990413 /* Uniswap-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "Uniswap-Bridging-Header.h"; path = "Uniswap/Uniswap-Bridging-Header.h"; sourceTree = ""; }; + 8C9047B981FA322A727947F7 /* Image.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Image.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/Image.graphql.swift; sourceTree = ""; }; 8E89C3A62AB8AAA400C84DE5 /* MnemonicConfirmationView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MnemonicConfirmationView.swift; sourceTree = ""; }; 8E89C3A72AB8AAA400C84DE5 /* MnemonicDisplayView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MnemonicDisplayView.swift; sourceTree = ""; }; 8E89C3A92AB8AAA400C84DE5 /* MnemonicConfirmationWordBankView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MnemonicConfirmationWordBankView.swift; sourceTree = ""; }; @@ -719,11 +716,14 @@ 91D5016E2CDBEAE700B09B7F /* TopTokenParts.graphql.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TopTokenParts.graphql.swift; sourceTree = ""; }; 91D5016F2CDBEAE700B09B7F /* TokenFeeDataParts.graphql.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TokenFeeDataParts.graphql.swift; sourceTree = ""; }; 91D5017C2CDBEAF600B09B7F /* HomeScreenTokenParts.graphql.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HomeScreenTokenParts.graphql.swift; sourceTree = ""; }; - 92DE390311705FF1EE65C0E6 /* NftCollectionConnection.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftCollectionConnection.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/NftCollectionConnection.graphql.swift; sourceTree = ""; }; - 985DDC8324B872DD44E87781 /* PortfolioBalancesQuery.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PortfolioBalancesQuery.graphql.swift; path = WidgetsCore/MobileSchema/Operations/Queries/PortfolioBalancesQuery.graphql.swift; sourceTree = ""; }; - 98F596250F55A3D6E9E1F499 /* TokenParts.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TokenParts.graphql.swift; path = WidgetsCore/MobileSchema/Fragments/TokenParts.graphql.swift; sourceTree = ""; }; - 9DFBD29C0BDFDB4464B8189C /* TokenPriceHistoryQuery.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TokenPriceHistoryQuery.graphql.swift; path = WidgetsCore/MobileSchema/Operations/Queries/TokenPriceHistoryQuery.graphql.swift; sourceTree = ""; }; - 9E975BEDBED5FE51D0DC6E96 /* TokenApproval.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TokenApproval.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/TokenApproval.graphql.swift; sourceTree = ""; }; + 945EF0A3BD6F19DA14E40AE1 /* TransactionStatus.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TransactionStatus.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Enums/TransactionStatus.graphql.swift; sourceTree = ""; }; + 95283AC560844B50E95934E4 /* TransactionListQuery.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TransactionListQuery.graphql.swift; path = WidgetsCore/MobileSchema/Operations/Queries/TransactionListQuery.graphql.swift; sourceTree = ""; }; + 957A35D2DE7A140BA198A0F1 /* TokenDetailsScreenQuery.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TokenDetailsScreenQuery.graphql.swift; path = WidgetsCore/MobileSchema/Operations/Queries/TokenDetailsScreenQuery.graphql.swift; sourceTree = ""; }; + 9602E2A290179F8741EDD35A /* TokenPriceHistoryQuery.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TokenPriceHistoryQuery.graphql.swift; path = WidgetsCore/MobileSchema/Operations/Queries/TokenPriceHistoryQuery.graphql.swift; sourceTree = ""; }; + 97FBBE677B56FFE07052EF1D /* PageInfo.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PageInfo.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/PageInfo.graphql.swift; sourceTree = ""; }; + 98F489175099FE697721272D /* NftOrderConnection.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftOrderConnection.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/NftOrderConnection.graphql.swift; sourceTree = ""; }; + 9BEBBC668E69EE3A1FC6AB05 /* TokenTransfer.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TokenTransfer.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/TokenTransfer.graphql.swift; sourceTree = ""; }; + 9EFADDBB38BB9261933C1349 /* FeedTransactionListQuery.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = FeedTransactionListQuery.graphql.swift; path = WidgetsCore/MobileSchema/Operations/Queries/FeedTransactionListQuery.graphql.swift; sourceTree = ""; }; 9F00A4392B33894C0088A0D0 /* ApplicationContract.graphql.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ApplicationContract.graphql.swift; sourceTree = ""; }; 9F29D4EC2B47126D004D003A /* NftBalanceAssetInput.graphql.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NftBalanceAssetInput.graphql.swift; sourceTree = ""; }; 9F3500812A8AA5890077BFC5 /* EXSplashScreen.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = EXSplashScreen.xcframework; path = "../../../node_modules/expo-splash-screen/ios/EXSplashScreen.xcframework"; sourceTree = ""; }; @@ -737,74 +737,75 @@ 9FCEBEFF2A95A8E00079EDDB /* RNWalletConnect.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = RNWalletConnect.swift; path = Uniswap/WalletConnect/RNWalletConnect.swift; sourceTree = ""; }; 9FCEBF022A95A99B0079EDDB /* RCTThemeModule.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RCTThemeModule.h; path = Appearance/RCTThemeModule.h; sourceTree = ""; }; 9FCEBF032A95A99B0079EDDB /* RCTThemeModule.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RCTThemeModule.m; path = Appearance/RCTThemeModule.m; sourceTree = ""; }; - 9FEC9B8A2A858CF1003CD019 /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AppDelegate.m; path = Uniswap/AppDelegate.m; sourceTree = ""; }; A32F9FBC272343C8002CFCDB /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = ""; }; A3F0A5B0272B1DFA00895B25 /* KeychainSwiftDistrib.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeychainSwiftDistrib.swift; sourceTree = ""; }; - A4E0C448C5D45BF1071FA458 /* MobileSchema.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MobileSchema.graphql.swift; path = WidgetsCore/MobileSchema/MobileSchema.graphql.swift; sourceTree = ""; }; A70E4DD32C25DA0A002D6D86 /* NetworkFee.graphql.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = NetworkFee.graphql.swift; path = MobileSchema/Schema/Objects/NetworkFee.graphql.swift; sourceTree = ""; }; A70E4DD52C260416002D6D86 /* SwapOrderType.graphql.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SwapOrderType.graphql.swift; path = MobileSchema/Schema/Enums/SwapOrderType.graphql.swift; sourceTree = ""; }; A70E4DD62C260416002D6D86 /* SwapOrderStatus.graphql.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SwapOrderStatus.graphql.swift; path = MobileSchema/Schema/Enums/SwapOrderStatus.graphql.swift; sourceTree = ""; }; - A7A33933670CCAD9E62A1A80 /* TokenDetailsScreenQuery.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TokenDetailsScreenQuery.graphql.swift; path = WidgetsCore/MobileSchema/Operations/Queries/TokenDetailsScreenQuery.graphql.swift; sourceTree = ""; }; A7B8EFCA2BF68F0D00CA4A1C /* FeeData.graphql.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = FeeData.graphql.swift; path = MobileSchema/Schema/Objects/FeeData.graphql.swift; sourceTree = ""; }; A7C9F415D0E128A43003E071 /* Pods-Uniswap.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Uniswap.debug.xcconfig"; path = "Target Support Files/Pods-Uniswap/Pods-Uniswap.debug.xcconfig"; sourceTree = ""; }; - A9030AC59702756C39396FFE /* NftsQuery.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftsQuery.graphql.swift; path = WidgetsCore/MobileSchema/Operations/Queries/NftsQuery.graphql.swift; sourceTree = ""; }; - ABE51731EB853137302A7B0D /* TransactionDetails.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TransactionDetails.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/TransactionDetails.graphql.swift; sourceTree = ""; }; + A98CEFE7189D63880FD5A702 /* TokenProjectsQuery.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TokenProjectsQuery.graphql.swift; path = WidgetsCore/MobileSchema/Operations/Queries/TokenProjectsQuery.graphql.swift; sourceTree = ""; }; + AAB6B8C64F7525D0D0E978C6 /* ProtectionResult.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ProtectionResult.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Enums/ProtectionResult.graphql.swift; sourceTree = ""; }; + AB772B265A35BFBC3A7761AD /* HomeScreenTokenParts.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = HomeScreenTokenParts.graphql.swift; path = WidgetsCore/MobileSchema/Fragments/HomeScreenTokenParts.graphql.swift; sourceTree = ""; }; AC0EE0972BD826E700BCCF07 /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; name = PrivacyInfo.xcprivacy; path = Uniswap/PrivacyInfo.xcprivacy; sourceTree = ""; }; AC2794442C51541E00F9AF68 /* sourcemaps-datadog.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = "sourcemaps-datadog.sh"; sourceTree = ""; }; AC2EF4022C914B1600EEEFDB /* fonts */ = {isa = PBXFileReference; lastKnownFileType = folder; name = fonts; path = ../src/assets/fonts; sourceTree = ""; }; - AF3D7A923E5E1FB504E1F64D /* TransactionHistoryUpdaterQuery.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TransactionHistoryUpdaterQuery.graphql.swift; path = WidgetsCore/MobileSchema/Operations/Queries/TransactionHistoryUpdaterQuery.graphql.swift; sourceTree = ""; }; - B033206DC974BCB6AF8CC613 /* SelectWalletScreenQuery.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SelectWalletScreenQuery.graphql.swift; path = WidgetsCore/MobileSchema/Operations/Queries/SelectWalletScreenQuery.graphql.swift; sourceTree = ""; }; + AD452B34344D670BA23EA331 /* TokenBalanceMainParts.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TokenBalanceMainParts.graphql.swift; path = WidgetsCore/MobileSchema/Fragments/TokenBalanceMainParts.graphql.swift; sourceTree = ""; }; + AD86EFAA0D6B8FBECCC4828B /* NftAssetConnection.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftAssetConnection.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/NftAssetConnection.graphql.swift; sourceTree = ""; }; + AE2A9FBFB7F718246B668A60 /* NftProfile.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftProfile.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/NftProfile.graphql.swift; sourceTree = ""; }; + AED050A208757F137DBDA57D /* ContractInput.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ContractInput.graphql.swift; path = WidgetsCore/MobileSchema/Schema/InputObjects/ContractInput.graphql.swift; sourceTree = ""; }; B0DA4D39B1A6D74A1D05B99F /* Pods-WidgetsCore.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-WidgetsCore.debug.xcconfig"; path = "Target Support Files/Pods-WidgetsCore/Pods-WidgetsCore.debug.xcconfig"; sourceTree = ""; }; - B0DB67D6C438F623976727E9 /* TimestampedAmount.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TimestampedAmount.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/TimestampedAmount.graphql.swift; sourceTree = ""; }; - B3C3F0403FAEFDD632AC6CCE /* TokensQuery.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TokensQuery.graphql.swift; path = WidgetsCore/MobileSchema/Operations/Queries/TokensQuery.graphql.swift; sourceTree = ""; }; - B7E03AA02B39A7A90C96AA76 /* HomeScreenTokensQuery.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = HomeScreenTokensQuery.graphql.swift; path = WidgetsCore/MobileSchema/Operations/Queries/HomeScreenTokensQuery.graphql.swift; sourceTree = ""; }; + B25620D6E0E297C56198F190 /* NftCollection.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftCollection.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/NftCollection.graphql.swift; sourceTree = ""; }; + B3CC3D9DE64A39897BA580B3 /* OnRampTransactionsAuth.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = OnRampTransactionsAuth.graphql.swift; path = WidgetsCore/MobileSchema/Schema/InputObjects/OnRampTransactionsAuth.graphql.swift; sourceTree = ""; }; + B3F4D5E8B9ED6E0FE29EA779 /* ProtectionAttackType.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ProtectionAttackType.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Enums/ProtectionAttackType.graphql.swift; sourceTree = ""; }; + B5C2E70E43A02405C5CEAD7C /* TokenProjectMarketsParts.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TokenProjectMarketsParts.graphql.swift; path = WidgetsCore/MobileSchema/Fragments/TokenProjectMarketsParts.graphql.swift; sourceTree = ""; }; + BA3BCD49511DE84892B34ED0 /* NftsTabQuery.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftsTabQuery.graphql.swift; path = WidgetsCore/MobileSchema/Operations/Queries/NftsTabQuery.graphql.swift; sourceTree = ""; }; BA869E362D56B0B600D7A718 /* WidgetTokensQuery.graphql.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WidgetTokensQuery.graphql.swift; sourceTree = ""; }; + BB76D1207400E308430A837F /* TokenParts.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TokenParts.graphql.swift; path = WidgetsCore/MobileSchema/Fragments/TokenParts.graphql.swift; sourceTree = ""; }; BCB2A43E5FB0D7B69CA02312 /* Pods-WidgetsCore.dev.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-WidgetsCore.dev.xcconfig"; path = "Target Support Files/Pods-WidgetsCore/Pods-WidgetsCore.dev.xcconfig"; sourceTree = ""; }; - BD0FC2D534CB82B151C7F9B7 /* ProtectionResult.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ProtectionResult.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Enums/ProtectionResult.graphql.swift; sourceTree = ""; }; - BD35300F81746B2D4A23065A /* BlockaidFees.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BlockaidFees.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/BlockaidFees.graphql.swift; sourceTree = ""; }; BF9176E944C84910B1C0B057 /* SplashScreen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = SplashScreen.storyboard; path = Uniswap/SplashScreen.storyboard; sourceTree = ""; }; - BFC36D963A2A52D1E7CA77E4 /* TokenMarketParts.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TokenMarketParts.graphql.swift; path = WidgetsCore/MobileSchema/Fragments/TokenMarketParts.graphql.swift; sourceTree = ""; }; + BFFD4C1E5A4B30DE3CE02DB4 /* NftAssetEdge.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftAssetEdge.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/NftAssetEdge.graphql.swift; sourceTree = ""; }; + C0359DDEA2E2E17759FCC5CF /* SwapOrderStatus.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SwapOrderStatus.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Enums/SwapOrderStatus.graphql.swift; sourceTree = ""; }; C26D739993D5C939C6FBB58A /* ExpoModulesProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ExpoModulesProvider.swift; path = "Pods/Target Support Files/Pods-Uniswap-UniswapTests/ExpoModulesProvider.swift"; sourceTree = ""; }; - C4790C2A43570CAC086B936E /* NftCollectionsFilterInput.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftCollectionsFilterInput.graphql.swift; path = WidgetsCore/MobileSchema/Schema/InputObjects/NftCollectionsFilterInput.graphql.swift; sourceTree = ""; }; - C65195A1CC9894C6341385C3 /* SchemaMetadata.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SchemaMetadata.graphql.swift; path = WidgetsCore/MobileSchema/Schema/SchemaMetadata.graphql.swift; sourceTree = ""; }; + C4CA32B2B2997D73A0185635 /* OffRampTransactionDetails.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = OffRampTransactionDetails.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/OffRampTransactionDetails.graphql.swift; sourceTree = ""; }; C89238E3ED9F3AC98876B573 /* Pods-WidgetsCoreTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-WidgetsCoreTests.release.xcconfig"; path = "Target Support Files/Pods-WidgetsCoreTests/Pods-WidgetsCoreTests.release.xcconfig"; sourceTree = ""; }; - C955CE2592785712A11892DE /* SwapOrderDetails.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SwapOrderDetails.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/SwapOrderDetails.graphql.swift; sourceTree = ""; }; - C9D5E6A07F404974045BD525 /* OffRampTransfer.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = OffRampTransfer.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/OffRampTransfer.graphql.swift; sourceTree = ""; }; + C8E5B09464C768590127BFA6 /* TokenMarket.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TokenMarket.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/TokenMarket.graphql.swift; sourceTree = ""; }; + CA3BFDC64C5E0A058877A348 /* NftCollectionScreenQuery.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftCollectionScreenQuery.graphql.swift; path = WidgetsCore/MobileSchema/Operations/Queries/NftCollectionScreenQuery.graphql.swift; sourceTree = ""; }; + CAC62CDEEBE5712219A457C7 /* BridgedWithdrawalInfo.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BridgedWithdrawalInfo.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/BridgedWithdrawalInfo.graphql.swift; sourceTree = ""; }; CB29AC0C0907A833F23D2C30 /* Pods_WidgetsCore.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_WidgetsCore.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - CC055C3EDFDE2966FCA83C9E /* TokenProjectMarketsParts.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TokenProjectMarketsParts.graphql.swift; path = WidgetsCore/MobileSchema/Fragments/TokenProjectMarketsParts.graphql.swift; sourceTree = ""; }; - CC2FBE9F353D3753FB94B8BF /* TransactionDirection.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TransactionDirection.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Enums/TransactionDirection.graphql.swift; sourceTree = ""; }; - D20E9461A6C9C1CD6A24BEED /* Amount.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Amount.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/Amount.graphql.swift; sourceTree = ""; }; - D574AB5194929038A54B4D4B /* SwapOrderStatus.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SwapOrderStatus.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Enums/SwapOrderStatus.graphql.swift; sourceTree = ""; }; + CBE0699A65BEEEE6E9A6B03F /* NftActivityConnection.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftActivityConnection.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/NftActivityConnection.graphql.swift; sourceTree = ""; }; + CD0CA37FB709C06F123EBF74 /* Currency.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Currency.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Enums/Currency.graphql.swift; sourceTree = ""; }; + CF4115ACC8D8F0C7529AABA7 /* SchemaConfiguration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SchemaConfiguration.swift; path = WidgetsCore/MobileSchema/Schema/SchemaConfiguration.swift; sourceTree = ""; }; + D13E592852F52B2855F05A5E /* TokenBasicInfoParts.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TokenBasicInfoParts.graphql.swift; path = WidgetsCore/MobileSchema/Fragments/TokenBasicInfoParts.graphql.swift; sourceTree = ""; }; + D34AC1057AD14362BB91E88B /* TokenStandard.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TokenStandard.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Enums/TokenStandard.graphql.swift; sourceTree = ""; }; + D4C8174A3A9EB3244AA844F4 /* TokensQuery.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TokensQuery.graphql.swift; path = WidgetsCore/MobileSchema/Operations/Queries/TokensQuery.graphql.swift; sourceTree = ""; }; D79B717BEAEA7857469D770A /* Pods-Widgets.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Widgets.debug.xcconfig"; path = "Target Support Files/Pods-Widgets/Pods-Widgets.debug.xcconfig"; sourceTree = ""; }; - DB35E518AD7FBFEBEA9CAB95 /* NftProfile.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftProfile.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/NftProfile.graphql.swift; sourceTree = ""; }; - DBA33683D2BA6BBE3251D67C /* WidgetTokensQuery.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = WidgetTokensQuery.graphql.swift; path = WidgetsCore/MobileSchema/Operations/Queries/WidgetTokensQuery.graphql.swift; sourceTree = ""; }; - E4624A41EC1468712BD77653 /* AssetActivity.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AssetActivity.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/AssetActivity.graphql.swift; sourceTree = ""; }; - E475EBABF7EA310435E2F19C /* PageInfo.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PageInfo.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/PageInfo.graphql.swift; sourceTree = ""; }; - E63EA0C75D8011BCC182492C /* AmountChange.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AmountChange.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/AmountChange.graphql.swift; sourceTree = ""; }; - E8A49D011C60137D4034CAC4 /* TokenProjectsQuery.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TokenProjectsQuery.graphql.swift; path = WidgetsCore/MobileSchema/Operations/Queries/TokenProjectsQuery.graphql.swift; sourceTree = ""; }; - EBD833F6580F9B82A68D4A98 /* TokenMarket.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TokenMarket.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/TokenMarket.graphql.swift; sourceTree = ""; }; - ED157D3DB73302C8A1B9522E /* Query.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Query.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/Query.graphql.swift; sourceTree = ""; }; + D91432EF6C35F5A6301340A2 /* DescriptionTranslations.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DescriptionTranslations.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/DescriptionTranslations.graphql.swift; sourceTree = ""; }; + DB2B02717B1A87BD41920151 /* NftBalance.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftBalance.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/NftBalance.graphql.swift; sourceTree = ""; }; + DD111A711D83D1D82E4025A9 /* NftApproval.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftApproval.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/NftApproval.graphql.swift; sourceTree = ""; }; + DD12FD368B3A96F323444D8E /* ProtectionInfo.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ProtectionInfo.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/ProtectionInfo.graphql.swift; sourceTree = ""; }; + DD56CBC543897BE8E37CC2C1 /* TokenApproval.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TokenApproval.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/TokenApproval.graphql.swift; sourceTree = ""; }; + DE735ED4766E65C0D6808F9A /* NftsQuery.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftsQuery.graphql.swift; path = WidgetsCore/MobileSchema/Operations/Queries/NftsQuery.graphql.swift; sourceTree = ""; }; + E09D12605BAA868AB51573BE /* PortfolioValueModifier.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PortfolioValueModifier.graphql.swift; path = WidgetsCore/MobileSchema/Schema/InputObjects/PortfolioValueModifier.graphql.swift; sourceTree = ""; }; + E0A53C3A09AD259B9A8EDBDD /* PortfolioBalancesQuery.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PortfolioBalancesQuery.graphql.swift; path = WidgetsCore/MobileSchema/Operations/Queries/PortfolioBalancesQuery.graphql.swift; sourceTree = ""; }; + EB9CACD175D6C20B6D4707C8 /* SelectWalletScreenQuery.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SelectWalletScreenQuery.graphql.swift; path = WidgetsCore/MobileSchema/Operations/Queries/SelectWalletScreenQuery.graphql.swift; sourceTree = ""; }; ED297162215061F000B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; }; - EE0973BB445AAD8FAA25757F /* NftCollectionScreenQuery.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftCollectionScreenQuery.graphql.swift; path = WidgetsCore/MobileSchema/Operations/Queries/NftCollectionScreenQuery.graphql.swift; sourceTree = ""; }; - F0C34E94906CB9F0A016D566 /* TokenBalanceParts.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TokenBalanceParts.graphql.swift; path = WidgetsCore/MobileSchema/Fragments/TokenBalanceParts.graphql.swift; sourceTree = ""; }; - F1A24D364C0D262A14BB7182 /* NftActivity.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftActivity.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/NftActivity.graphql.swift; sourceTree = ""; }; F1A3F4DDD7E40DA9E4BBAAD1 /* Pods-Uniswap-UniswapTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Uniswap-UniswapTests.release.xcconfig"; path = "Target Support Files/Pods-Uniswap-UniswapTests/Pods-Uniswap-UniswapTests.release.xcconfig"; sourceTree = ""; }; - F2932B486DD7070DF226A27B /* NftAsset.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftAsset.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/NftAsset.graphql.swift; sourceTree = ""; }; - F3317EBD4E3B11E2F2A1CE58 /* NftTransfer.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftTransfer.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/NftTransfer.graphql.swift; sourceTree = ""; }; + F286C514E849B29F5235310A /* NftCollectionMarket.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftCollectionMarket.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/NftCollectionMarket.graphql.swift; sourceTree = ""; }; F35AFD3627EE49230011A725 /* Uniswap.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; name = Uniswap.entitlements; path = Uniswap/Uniswap.entitlements; sourceTree = ""; }; F35AFD3B27EE49990011A725 /* OneSignalNotificationServiceExtension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = OneSignalNotificationServiceExtension.appex; sourceTree = BUILT_PRODUCTS_DIR; }; F35AFD3D27EE49990011A725 /* NotificationService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationService.swift; sourceTree = ""; }; F35AFD3F27EE49990011A725 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; F35AFD4727EE4B400011A725 /* OneSignalNotificationServiceExtension.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = OneSignalNotificationServiceExtension.entitlements; sourceTree = ""; }; - F4B149117182C6CC58DD570C /* TokenBalance.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TokenBalance.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/TokenBalance.graphql.swift; sourceTree = ""; }; + F4C3461E088654B80ABE3DE7 /* Amount.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Amount.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/Amount.graphql.swift; sourceTree = ""; }; F56CC08FBB20FAC0DF6B93DA /* Pods-OneSignalNotificationServiceExtension.beta.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-OneSignalNotificationServiceExtension.beta.xcconfig"; path = "Target Support Files/Pods-OneSignalNotificationServiceExtension/Pods-OneSignalNotificationServiceExtension.beta.xcconfig"; sourceTree = ""; }; - F5BCBB5D46312050E4A5BD64 /* NftApproveForAll.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftApproveForAll.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/NftApproveForAll.graphql.swift; sourceTree = ""; }; - F7B3C6DF5DED22E892851B10 /* ContractInput.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ContractInput.graphql.swift; path = WidgetsCore/MobileSchema/Schema/InputObjects/ContractInput.graphql.swift; sourceTree = ""; }; - F912AB9AB67808B740246798 /* NftActivityConnection.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftActivityConnection.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/NftActivityConnection.graphql.swift; sourceTree = ""; }; - FC419570F5A025E80AB10A72 /* TokenStandard.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TokenStandard.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Enums/TokenStandard.graphql.swift; sourceTree = ""; }; + F70593F94C8B315F5304B9BE /* NftCollectionEdge.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftCollectionEdge.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/NftCollectionEdge.graphql.swift; sourceTree = ""; }; + FD158681F2E84A5E49656B11 /* NftOrderEdge.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftOrderEdge.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/NftOrderEdge.graphql.swift; sourceTree = ""; }; FD54D51C296C79A4007A37E9 /* GoogleServiceInfo */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = GoogleServiceInfo; sourceTree = SOURCE_ROOT; }; FD7304CD28A364FC0085BDEA /* Colors.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Colors.xcassets; path = Uniswap/Colors.xcassets; sourceTree = ""; }; FD7304CF28A3650A0085BDEA /* Colors.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Colors.swift; path = Uniswap/Colors.swift; sourceTree = ""; }; + FEE1CB436B299B0349BA9957 /* FeeData.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = FeeData.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/FeeData.graphql.swift; sourceTree = ""; }; + FF1B893C0275DAAA156B0108 /* NftApproveForAll.graphql.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NftApproveForAll.graphql.swift; path = WidgetsCore/MobileSchema/Schema/Objects/NftApproveForAll.graphql.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -1204,8 +1205,7 @@ 07B067692A7D6EC8001DD9B9 /* Widget */, 03DD298C2A4CE34B00E3E0F5 /* Appearance */, F35AFD3627EE49230011A725 /* Uniswap.entitlements */, - 13B07FAF1A68108700A75B9A /* AppDelegate.h */, - 9FEC9B8A2A858CF1003CD019 /* AppDelegate.m */, + 45FFF7DD2E8C2A3A00362570 /* Notifications */, 6C84F055283D83CF0071FA2E /* Onboarding */, 6CE631B928186D4500716D29 /* WalletConnect */, A32F9FBC272343C8002CFCDB /* GoogleService-Info.plist */, @@ -1213,14 +1213,34 @@ 6CA91BDD2A95226200C4063E /* RNCloudBackupsManager */, 13B07FB51A68108700A75B9A /* Images.xcassets */, 13B07FB61A68108700A75B9A /* Info.plist */, - 13B07FB71A68108700A75B9A /* main.m */, BF9176E944C84910B1C0B057 /* SplashScreen.storyboard */, FD7304CD28A364FC0085BDEA /* Colors.xcassets */, FD7304CF28A3650A0085BDEA /* Colors.swift */, + 8B2A92162EB3E78E00990413 /* AppDelegate.swift */, + 8B2A92182EB3E79500990413 /* Uniswap-Bridging-Header.h */, ); name = Uniswap; sourceTree = ""; }; + 157C3B73F4388F6F1274463F /* Operations */ = { + isa = PBXGroup; + children = ( + 5AF8BB7C2143FF285A912E6A /* Queries */, + ); + name = Operations; + sourceTree = ""; + }; + 281687A9A85A9EF49839548D /* MobileSchema */ = { + isa = PBXGroup; + children = ( + 87442A651C068E552BEA89C6 /* MobileSchema.graphql.swift */, + 308DDBB1BED0BB4E93F1AD8C /* Fragments */, + 157C3B73F4388F6F1274463F /* Operations */, + 4C36556DE2985BABC27C13AD /* Schema */, + ); + name = MobileSchema; + sourceTree = ""; + }; 2D16E6871FA4F8E400B85C8A /* Frameworks */ = { isa = PBXGroup; children = ( @@ -1240,6 +1260,36 @@ name = Frameworks; sourceTree = ""; }; + 308DDBB1BED0BB4E93F1AD8C /* Fragments */ = { + isa = PBXGroup; + children = ( + AB772B265A35BFBC3A7761AD /* HomeScreenTokenParts.graphql.swift */, + AD452B34344D670BA23EA331 /* TokenBalanceMainParts.graphql.swift */, + 65AD13BFAD4EBA18AA6205E3 /* TokenBalanceParts.graphql.swift */, + 5B0A1F5F6FC3E1141E228B7D /* TokenBalanceQuantityParts.graphql.swift */, + D13E592852F52B2855F05A5E /* TokenBasicInfoParts.graphql.swift */, + 2E8286984864AD69A0FAE3BC /* TokenBasicProjectParts.graphql.swift */, + 1166529407CA13E4D4F24F12 /* TokenFeeDataParts.graphql.swift */, + 55081ADF188C967FC1ECD289 /* TokenMarketParts.graphql.swift */, + BB76D1207400E308430A837F /* TokenParts.graphql.swift */, + B5C2E70E43A02405C5CEAD7C /* TokenProjectMarketsParts.graphql.swift */, + 190523DBBA423868C74FF80D /* TokenProjectUrlsParts.graphql.swift */, + 835D9DF76533D22EDF0E9D67 /* TokenProtectionInfoParts.graphql.swift */, + 07F0E504152E22110917353E /* TopTokenParts.graphql.swift */, + ); + name = Fragments; + sourceTree = ""; + }; + 45FFF7DD2E8C2A3A00362570 /* Notifications */ = { + isa = PBXGroup; + children = ( + 45FFF7E02E8C2E6100362570 /* SilentPushEventEmitter.swift */, + 45FFF7DE2E8C2A6400362570 /* SilentPushEventEmitter.m */, + ); + name = Notifications; + path = Uniswap/Notifications; + sourceTree = ""; + }; 47914D9EE3A4DE926EFC5089 /* UniswapTests */ = { isa = PBXGroup; children = ( @@ -1248,27 +1298,18 @@ name = UniswapTests; sourceTree = ""; }; - 4EEA950E66FC2881D331F823 /* Enums */ = { + 4C36556DE2985BABC27C13AD /* Schema */ = { isa = PBXGroup; children = ( - 4A8990A17F489F284E0DB1B3 /* Chain.graphql.swift */, - 25B4C7C7FEF32EAF10D030F9 /* Currency.graphql.swift */, - 3BF42F88002431BFDC9FCA9F /* HistoryDuration.graphql.swift */, - 2D95FE36D2667E070345CDD0 /* NftActivityType.graphql.swift */, - 600250B00B6C02AAB063818B /* NftMarketplace.graphql.swift */, - 4B308EC3DB7C3C1DD5DDE03D /* NftStandard.graphql.swift */, - 40E034582FBD2C374CEF808E /* ProtectionAttackType.graphql.swift */, - BD0FC2D534CB82B151C7F9B7 /* ProtectionResult.graphql.swift */, - 4ACFA5B4204741038C986C5D /* SafetyLevel.graphql.swift */, - D574AB5194929038A54B4D4B /* SwapOrderStatus.graphql.swift */, - 148617FD73F2CD7117960DBA /* SwapOrderType.graphql.swift */, - 32012AC135EBD991C8F02F92 /* TokenSortableField.graphql.swift */, - FC419570F5A025E80AB10A72 /* TokenStandard.graphql.swift */, - CC2FBE9F353D3753FB94B8BF /* TransactionDirection.graphql.swift */, - 2ABA47847A73130D356EB6BF /* TransactionStatus.graphql.swift */, - 69F2FFD11FB5E462CC454A15 /* TransactionType.graphql.swift */, + CF4115ACC8D8F0C7529AABA7 /* SchemaConfiguration.swift */, + 522135E54BDB258B45B5A694 /* SchemaMetadata.graphql.swift */, + F054FF4C0D351C1EAF0012D5 /* Enums */, + F498443CD9DA8803A092F3D9 /* InputObjects */, + C28876A002BC02672EE6A673 /* Interfaces */, + B83DA94147128EE9CC2DB246 /* Objects */, + 971EB6FCC042316AEFF90697 /* Unions */, ); - name = Enums; + name = Schema; sourceTree = ""; }; 5754C6A1B51170788A63F6F3 /* ExpoModulesProviders */ = { @@ -1283,11 +1324,39 @@ 5841D897B122046172ACD989 /* WidgetsCore */ = { isa = PBXGroup; children = ( - 8D57A3CBC005A567F7303961 /* MobileSchema */, + 281687A9A85A9EF49839548D /* MobileSchema */, ); name = WidgetsCore; sourceTree = ""; }; + 5AF8BB7C2143FF285A912E6A /* Queries */ = { + isa = PBXGroup; + children = ( + 6E4DEE7FC8D7BCD030CFA4D3 /* ConvertQuery.graphql.swift */, + 3B03A0A6AB0957A512A2D225 /* FavoriteTokenCardQuery.graphql.swift */, + 9EFADDBB38BB9261933C1349 /* FeedTransactionListQuery.graphql.swift */, + 0E7FF51A507BF788E64E3EFE /* HomeScreenTokensQuery.graphql.swift */, + 595699514939A2CE780AF0CF /* MultiplePortfolioBalancesQuery.graphql.swift */, + 03AB6B21A1BFB3A18982B47E /* NFTItemScreenQuery.graphql.swift */, + CA3BFDC64C5E0A058877A348 /* NftCollectionScreenQuery.graphql.swift */, + DE735ED4766E65C0D6808F9A /* NftsQuery.graphql.swift */, + BA3BCD49511DE84892B34ED0 /* NftsTabQuery.graphql.swift */, + E0A53C3A09AD259B9A8EDBDD /* PortfolioBalancesQuery.graphql.swift */, + EB9CACD175D6C20B6D4707C8 /* SelectWalletScreenQuery.graphql.swift */, + 957A35D2DE7A140BA198A0F1 /* TokenDetailsScreenQuery.graphql.swift */, + 9602E2A290179F8741EDD35A /* TokenPriceHistoryQuery.graphql.swift */, + 1276D33B06E840B8E6839F39 /* TokenProjectDescriptionQuery.graphql.swift */, + A98CEFE7189D63880FD5A702 /* TokenProjectsQuery.graphql.swift */, + 0914ECF70C274E2B064BCD42 /* TokenQuery.graphql.swift */, + D4C8174A3A9EB3244AA844F4 /* TokensQuery.graphql.swift */, + 243576FAC8D2801F9D99ECC9 /* TopTokensQuery.graphql.swift */, + 559CBC7F568C769C48E7C6F4 /* TransactionHistoryUpdaterQuery.graphql.swift */, + 95283AC560844B50E95934E4 /* TransactionListQuery.graphql.swift */, + 6F0A91F56B1CA2E71B479BAD /* WidgetTokensQuery.graphql.swift */, + ); + name = Queries; + sourceTree = ""; + }; 5B4398EB2DD3B22C00F6BE08 /* PrivateKeyDisplay */ = { isa = PBXGroup; children = ( @@ -1403,17 +1472,6 @@ name = Products; sourceTree = ""; }; - 8D57A3CBC005A567F7303961 /* MobileSchema */ = { - isa = PBXGroup; - children = ( - A4E0C448C5D45BF1071FA458 /* MobileSchema.graphql.swift */, - CA8FF4CDF9B448F7BE77CA07 /* Fragments */, - F79593090BE522E6D2A3330F /* Operations */, - 9723B33A3716C9068F5FD2B1 /* Schema */, - ); - name = MobileSchema; - sourceTree = ""; - }; 8E566D9F2AA1095000D4AA76 /* Components */ = { isa = PBXGroup; children = ( @@ -1462,18 +1520,13 @@ path = Uniswap/Icons; sourceTree = ""; }; - 9723B33A3716C9068F5FD2B1 /* Schema */ = { + 971EB6FCC042316AEFF90697 /* Unions */ = { isa = PBXGroup; children = ( - 2E49E724432C70A2551FB2C7 /* SchemaConfiguration.swift */, - C65195A1CC9894C6341385C3 /* SchemaMetadata.graphql.swift */, - 4EEA950E66FC2881D331F823 /* Enums */, - B741FF3580D33B5968CB9841 /* InputObjects */, - A60630E00A276B08BE85275D /* Interfaces */, - AB0BCF231B03A3F4E547DFF5 /* Objects */, - F23767E14A7943D5969AFDC1 /* Unions */, + 075E4C1DFAA00EE5B3CE792D /* ActivityDetails.graphql.swift */, + 6D4C849A7805FCCEE8C8C3E6 /* AssetChange.graphql.swift */, ); - name = Schema; + name = Unions; sourceTree = ""; }; 9759A762F61D6B2F01C79DBF /* Uniswap */ = { @@ -1484,87 +1537,72 @@ name = Uniswap; sourceTree = ""; }; - A60630E00A276B08BE85275D /* Interfaces */ = { + B83DA94147128EE9CC2DB246 /* Objects */ = { isa = PBXGroup; children = ( - 03AD8C2B1226EBE1524F2573 /* IAmount.graphql.swift */, - 5E0D68CC8D1F13D864F069BB /* IContract.graphql.swift */, - ); - name = Interfaces; - sourceTree = ""; - }; - AB0BCF231B03A3F4E547DFF5 /* Objects */ = { - isa = PBXGroup; - children = ( - D20E9461A6C9C1CD6A24BEED /* Amount.graphql.swift */, - E63EA0C75D8011BCC182492C /* AmountChange.graphql.swift */, - 608B07304ED1387B5AEAA3BB /* ApplicationContract.graphql.swift */, - E4624A41EC1468712BD77653 /* AssetActivity.graphql.swift */, - BD35300F81746B2D4A23065A /* BlockaidFees.graphql.swift */, - 7E1F288B7EDDE906C4C00C46 /* DescriptionTranslations.graphql.swift */, - 54B1C71AED738D17898103A6 /* Dimensions.graphql.swift */, - 17819A49DE69723EC60D9D72 /* FeeData.graphql.swift */, - 31ED613D63FE9C56D9270517 /* Image.graphql.swift */, - 8BEADEB4AE05B860CF2232D1 /* NetworkFee.graphql.swift */, - F1A24D364C0D262A14BB7182 /* NftActivity.graphql.swift */, - F912AB9AB67808B740246798 /* NftActivityConnection.graphql.swift */, - 4DB4379B5E222207CA7328D0 /* NftActivityEdge.graphql.swift */, - 4E32BBB65A6DD9CFF608C8E8 /* NftApproval.graphql.swift */, - F5BCBB5D46312050E4A5BD64 /* NftApproveForAll.graphql.swift */, - F2932B486DD7070DF226A27B /* NftAsset.graphql.swift */, - 218B8AB05C80D919671D3970 /* NftAssetConnection.graphql.swift */, - 6DF7C8888BE6AFA2F22889FE /* NftAssetEdge.graphql.swift */, - 70851E3D1A4B296A1CE22A20 /* NftAssetTrait.graphql.swift */, - 05BE2F49DD1FB9A692E21C13 /* NftBalance.graphql.swift */, - 1FC7B80EC0E0D2134B67575B /* NftBalanceConnection.graphql.swift */, - 0B132543F80E3C9191219E6D /* NftBalanceEdge.graphql.swift */, - 63ACFF2A1D5AE3498731AC69 /* NftCollection.graphql.swift */, - 92DE390311705FF1EE65C0E6 /* NftCollectionConnection.graphql.swift */, - 37038CCEB11E70E2027EF4EA /* NftCollectionEdge.graphql.swift */, - 4F4F47D22B749A438B5BF674 /* NftCollectionMarket.graphql.swift */, - 18B9EB43501127BE1B14F1A5 /* NftContract.graphql.swift */, - 6E3A78386B3B779B688021FF /* NftOrder.graphql.swift */, - 39FC2A13550FA6754EC1A7FC /* NftOrderConnection.graphql.swift */, - 49BD6C776029FAF4FC711DE7 /* NftOrderEdge.graphql.swift */, - DB35E518AD7FBFEBEA9CAB95 /* NftProfile.graphql.swift */, - F3317EBD4E3B11E2F2A1CE58 /* NftTransfer.graphql.swift */, - 396B6AB3BB41898B56EB3828 /* OffRampTransactionDetails.graphql.swift */, - C9D5E6A07F404974045BD525 /* OffRampTransfer.graphql.swift */, - 6A84A192F750A0F1BC8D7A69 /* OnRampServiceProvider.graphql.swift */, - 12D3AB6C2FC9513E9F224B7C /* OnRampTransactionDetails.graphql.swift */, - 2139ABF56EA067ED792A48C9 /* OnRampTransfer.graphql.swift */, - E475EBABF7EA310435E2F19C /* PageInfo.graphql.swift */, - 1849039FD4A210DA990363C8 /* Portfolio.graphql.swift */, - 0702203B17BDD858CED28F8B /* ProtectionInfo.graphql.swift */, - ED157D3DB73302C8A1B9522E /* Query.graphql.swift */, - C955CE2592785712A11892DE /* SwapOrderDetails.graphql.swift */, - B0DB67D6C438F623976727E9 /* TimestampedAmount.graphql.swift */, - 647933A5DC35BDFEEF3620A1 /* Token.graphql.swift */, - 9E975BEDBED5FE51D0DC6E96 /* TokenApproval.graphql.swift */, - F4B149117182C6CC58DD570C /* TokenBalance.graphql.swift */, - EBD833F6580F9B82A68D4A98 /* TokenMarket.graphql.swift */, - 4981A14906A35E8A0B7F9457 /* TokenProject.graphql.swift */, - 3B9A505509D9A85BE1DB7D05 /* TokenProjectMarket.graphql.swift */, - 8DA4E7C052A6C4AC3A9DCDA6 /* TokenTransfer.graphql.swift */, - ABE51731EB853137302A7B0D /* TransactionDetails.graphql.swift */, + F4C3461E088654B80ABE3DE7 /* Amount.graphql.swift */, + 066BBBD815CF2DE8803338BC /* AmountChange.graphql.swift */, + 59DD4D834D7B42A6D02F4F12 /* ApplicationContract.graphql.swift */, + 05C66C49AF2B78703FCE4C7C /* AssetActivity.graphql.swift */, + 3EF9AEC00868BFD7CEBF202C /* BlockaidFees.graphql.swift */, + CAC62CDEEBE5712219A457C7 /* BridgedWithdrawalInfo.graphql.swift */, + D91432EF6C35F5A6301340A2 /* DescriptionTranslations.graphql.swift */, + 764C4757EB194D13A8857DFA /* Dimensions.graphql.swift */, + FEE1CB436B299B0349BA9957 /* FeeData.graphql.swift */, + 8C9047B981FA322A727947F7 /* Image.graphql.swift */, + 09BE4B220A4F8465C3D01BA5 /* NetworkFee.graphql.swift */, + 55C67E53A2C8AEB6AE92E33F /* NftActivity.graphql.swift */, + CBE0699A65BEEEE6E9A6B03F /* NftActivityConnection.graphql.swift */, + 043C7D80D6722AFCF1715D07 /* NftActivityEdge.graphql.swift */, + DD111A711D83D1D82E4025A9 /* NftApproval.graphql.swift */, + FF1B893C0275DAAA156B0108 /* NftApproveForAll.graphql.swift */, + 5C9F3B31FC6AF8CE30CD7DA2 /* NftAsset.graphql.swift */, + AD86EFAA0D6B8FBECCC4828B /* NftAssetConnection.graphql.swift */, + BFFD4C1E5A4B30DE3CE02DB4 /* NftAssetEdge.graphql.swift */, + 85B43D489CC5ACF1EA34E9EB /* NftAssetTrait.graphql.swift */, + DB2B02717B1A87BD41920151 /* NftBalance.graphql.swift */, + 62DDC1F42E7172783EAF3776 /* NftBalanceConnection.graphql.swift */, + 4DD55DFFC717D37DD960B82E /* NftBalanceEdge.graphql.swift */, + B25620D6E0E297C56198F190 /* NftCollection.graphql.swift */, + 0D09FFE2B5E56CDCAB2F9455 /* NftCollectionConnection.graphql.swift */, + F70593F94C8B315F5304B9BE /* NftCollectionEdge.graphql.swift */, + F286C514E849B29F5235310A /* NftCollectionMarket.graphql.swift */, + 55A243177E9FA92A0524A222 /* NftContract.graphql.swift */, + 67C0D95F7EA9E7ACA9B18692 /* NftOrder.graphql.swift */, + 98F489175099FE697721272D /* NftOrderConnection.graphql.swift */, + FD158681F2E84A5E49656B11 /* NftOrderEdge.graphql.swift */, + AE2A9FBFB7F718246B668A60 /* NftProfile.graphql.swift */, + 74AD16E33DC518A42C386FE2 /* NftTransfer.graphql.swift */, + C4CA32B2B2997D73A0185635 /* OffRampTransactionDetails.graphql.swift */, + 166A9AE7203545C397E683E8 /* OffRampTransfer.graphql.swift */, + 5BED80DB034487FCA1450EDB /* OnRampServiceProvider.graphql.swift */, + 87CF9B03AE29A19C5B0F4E35 /* OnRampTransactionDetails.graphql.swift */, + 3E5D1A04B42B25218C53C107 /* OnRampTransfer.graphql.swift */, + 97FBBE677B56FFE07052EF1D /* PageInfo.graphql.swift */, + 5397E77A577E9952D2477020 /* Portfolio.graphql.swift */, + DD12FD368B3A96F323444D8E /* ProtectionInfo.graphql.swift */, + 5956ECBE73216D266D8D2E86 /* Query.graphql.swift */, + 53F4E5E9341BE66984935185 /* SwapOrderDetails.graphql.swift */, + 31CBA4397C44A04E218AEF28 /* TimestampedAmount.graphql.swift */, + 2FB1590D18A58D37C750D9AC /* Token.graphql.swift */, + DD56CBC543897BE8E37CC2C1 /* TokenApproval.graphql.swift */, + 181209B4CDE80BDC80891CFD /* TokenBalance.graphql.swift */, + C8E5B09464C768590127BFA6 /* TokenMarket.graphql.swift */, + 8856DFFC7FDC9BF105B0B4E3 /* TokenProject.graphql.swift */, + 0B0505DB30407C221B6A8491 /* TokenProjectMarket.graphql.swift */, + 9BEBBC668E69EE3A1FC6AB05 /* TokenTransfer.graphql.swift */, + 55240C84512D3851C8B9F027 /* TransactionDetails.graphql.swift */, ); name = Objects; sourceTree = ""; }; - B741FF3580D33B5968CB9841 /* InputObjects */ = { + C28876A002BC02672EE6A673 /* Interfaces */ = { isa = PBXGroup; children = ( - F7B3C6DF5DED22E892851B10 /* ContractInput.graphql.swift */, - 43E2ECCEFBC3BE8D13BE6CAB /* NftActivityFilterInput.graphql.swift */, - 556339705BD103365D4ED07B /* NftAssetTraitInput.graphql.swift */, - 8B477EBEA1EDA3914C77E8A6 /* NftAssetsFilterInput.graphql.swift */, - 4E5FA43C5E31035775917C4E /* NftBalanceAssetInput.graphql.swift */, - 41BA2129FFE961C8549C8A30 /* NftBalancesFilterInput.graphql.swift */, - C4790C2A43570CAC086B936E /* NftCollectionsFilterInput.graphql.swift */, - 315B8A905FA2C60C053F138B /* OnRampTransactionsAuth.graphql.swift */, - 41003491EF939043CF9D0F4E /* PortfolioValueModifier.graphql.swift */, + 37376E4CF3A4B76E9DAE150C /* IAmount.graphql.swift */, + 1D9189C818AFF8E988F861D0 /* IContract.graphql.swift */, ); - name = InputObjects; + name = Interfaces; sourceTree = ""; }; C2C18ECBEF5A4489BF3A314C /* Resources */ = { @@ -1577,56 +1615,6 @@ name = Resources; sourceTree = ""; }; - CA8FF4CDF9B448F7BE77CA07 /* Fragments */ = { - isa = PBXGroup; - children = ( - 27F8B915042BD8D67D9627EA /* HomeScreenTokenParts.graphql.swift */, - 137696908D703632CEE3AB28 /* TokenBalanceMainParts.graphql.swift */, - F0C34E94906CB9F0A016D566 /* TokenBalanceParts.graphql.swift */, - 2370BAD675DC8064C00AC037 /* TokenBalanceQuantityParts.graphql.swift */, - 3377F7BB38BD5A45AE31909D /* TokenBasicInfoParts.graphql.swift */, - 2C2F4BE3080D4129D4478528 /* TokenBasicProjectParts.graphql.swift */, - 018603D0FA4D05DBF16F1441 /* TokenFeeDataParts.graphql.swift */, - BFC36D963A2A52D1E7CA77E4 /* TokenMarketParts.graphql.swift */, - 98F596250F55A3D6E9E1F499 /* TokenParts.graphql.swift */, - CC055C3EDFDE2966FCA83C9E /* TokenProjectMarketsParts.graphql.swift */, - 236126979349098B98C70F27 /* TokenProjectUrlsParts.graphql.swift */, - 0BB4A40E30E1D985519DB3CF /* TokenProtectionInfoParts.graphql.swift */, - 5640432978873FB030467750 /* TopTokenParts.graphql.swift */, - ); - name = Fragments; - sourceTree = ""; - }; - D9DDAE0E99B4703AF96A81AB /* Queries */ = { - isa = PBXGroup; - children = ( - 7BD3F0794908635CDFA7DAB6 /* ConvertQuery.graphql.swift */, - 84997376A0B436ECC0A996C5 /* ExploreSearchQuery.graphql.swift */, - 3F0EEAC1DADE827AE38EB8A6 /* FavoriteTokenCardQuery.graphql.swift */, - 2BA0ACE5B9B2C41187CD41F3 /* FeedTransactionListQuery.graphql.swift */, - B7E03AA02B39A7A90C96AA76 /* HomeScreenTokensQuery.graphql.swift */, - 4429CA6DA254ECC24A65DA14 /* MultiplePortfolioBalancesQuery.graphql.swift */, - 207F4DF7664454C31DE069F8 /* NFTItemScreenQuery.graphql.swift */, - EE0973BB445AAD8FAA25757F /* NftCollectionScreenQuery.graphql.swift */, - A9030AC59702756C39396FFE /* NftsQuery.graphql.swift */, - 730CA356D6E1D498CC0C1472 /* NftsTabQuery.graphql.swift */, - 985DDC8324B872DD44E87781 /* PortfolioBalancesQuery.graphql.swift */, - 8A5342DEF1410E0E81E97F40 /* SearchTokensQuery.graphql.swift */, - B033206DC974BCB6AF8CC613 /* SelectWalletScreenQuery.graphql.swift */, - A7A33933670CCAD9E62A1A80 /* TokenDetailsScreenQuery.graphql.swift */, - 9DFBD29C0BDFDB4464B8189C /* TokenPriceHistoryQuery.graphql.swift */, - 6FF8B660E9C2C0D8DDF7588A /* TokenProjectDescriptionQuery.graphql.swift */, - E8A49D011C60137D4034CAC4 /* TokenProjectsQuery.graphql.swift */, - 74885865ED8CFEA875E40916 /* TokenQuery.graphql.swift */, - B3C3F0403FAEFDD632AC6CCE /* TokensQuery.graphql.swift */, - 04E5C2900254E7BA7F10CE51 /* TopTokensQuery.graphql.swift */, - AF3D7A923E5E1FB504E1F64D /* TransactionHistoryUpdaterQuery.graphql.swift */, - 224CA82F1871016F4173F69E /* TransactionListQuery.graphql.swift */, - DBA33683D2BA6BBE3251D67C /* WidgetTokensQuery.graphql.swift */, - ); - name = Queries; - sourceTree = ""; - }; E233CBF5F47BEE60B243DCF8 /* Pods */ = { isa = PBXGroup; children = ( @@ -1662,13 +1650,27 @@ path = Pods; sourceTree = ""; }; - F23767E14A7943D5969AFDC1 /* Unions */ = { + F054FF4C0D351C1EAF0012D5 /* Enums */ = { isa = PBXGroup; children = ( - 8A4EB7BAD2C90E61FD6C30AF /* ActivityDetails.graphql.swift */, - 39F60B2B54796DC978765C99 /* AssetChange.graphql.swift */, + 7DBCFBC330BF97BA2F630908 /* Chain.graphql.swift */, + CD0CA37FB709C06F123EBF74 /* Currency.graphql.swift */, + 1053483279043EED7612BE90 /* HistoryDuration.graphql.swift */, + 1CDAC035887C3908C3BD1A77 /* NftActivityType.graphql.swift */, + 83FB27D93A9468E6DB47231C /* NftMarketplace.graphql.swift */, + 0373C61A7AF015058A502CE2 /* NftStandard.graphql.swift */, + B3F4D5E8B9ED6E0FE29EA779 /* ProtectionAttackType.graphql.swift */, + AAB6B8C64F7525D0D0E978C6 /* ProtectionResult.graphql.swift */, + 22F8093091A9E5FC0D6284BA /* SafetyLevel.graphql.swift */, + C0359DDEA2E2E17759FCC5CF /* SwapOrderStatus.graphql.swift */, + 7AFDF569E43F173C2F5A07AF /* SwapOrderType.graphql.swift */, + 51F133663B435829DE47E3CE /* TokenSortableField.graphql.swift */, + D34AC1057AD14362BB91E88B /* TokenStandard.graphql.swift */, + 64D494D944670E557175A694 /* TransactionDirection.graphql.swift */, + 945EF0A3BD6F19DA14E40AE1 /* TransactionStatus.graphql.swift */, + 18D48B25E03122149B0D1304 /* TransactionType.graphql.swift */, ); - name = Unions; + name = Enums; sourceTree = ""; }; F35AFD3C27EE49990011A725 /* OneSignalNotificationServiceExtension */ = { @@ -1682,12 +1684,19 @@ path = OneSignalNotificationServiceExtension; sourceTree = ""; }; - F79593090BE522E6D2A3330F /* Operations */ = { + F498443CD9DA8803A092F3D9 /* InputObjects */ = { isa = PBXGroup; children = ( - D9DDAE0E99B4703AF96A81AB /* Queries */, + AED050A208757F137DBDA57D /* ContractInput.graphql.swift */, + 50C3E075E850CEC1714BE52C /* NftActivityFilterInput.graphql.swift */, + 1F1731869775D16A9EAB475C /* NftAssetTraitInput.graphql.swift */, + 310373063D8A11E9E02314FE /* NftAssetsFilterInput.graphql.swift */, + 696F6C5220D0072E380E198F /* NftBalanceAssetInput.graphql.swift */, + 1810C60B56CC74150C868801 /* NftBalancesFilterInput.graphql.swift */, + B3CC3D9DE64A39897BA580B3 /* OnRampTransactionsAuth.graphql.swift */, + E09D12605BAA868AB51573BE /* PortfolioValueModifier.graphql.swift */, ); - name = Operations; + name = InputObjects; sourceTree = ""; }; /* End PBXGroup section */ @@ -1822,7 +1831,7 @@ 9F7898182A819D62004D5A98 /* Embed Frameworks */, 163678CCBB906C7B12421609 /* [CP] Embed Pods Frameworks */, 0487071ABBC71F28EF79F4AA /* [CP] Copy Pods Resources */, - A98B71284330BF95E7CAB037 /* [CP-User] [RNFB] Core Configuration */, + 868B6279F959D6931E7A870E /* [CP-User] [RNFB] Core Configuration */, ); buildRules = ( ); @@ -1991,7 +2000,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "export PROJECT_ROOT=$PWD/..\nexport EXTRA_PACKAGER_ARGS=\"--sourcemap-output $PROJECT_ROOT/main.jsbundle.map\"\n\nset -e\nif [[ -f \"$PODS_ROOT/../.xcode.env\" ]]; then\nsource \"$PODS_ROOT/../.xcode.env\"\nfi\nif [[ -f \"$PODS_ROOT/../.xcode.env.local\" ]]; then\nsource \"$PODS_ROOT/../.xcode.env.local\"\nfi\nexport CONFIG_CMD=\"dummy-workaround-value\"\nexport CLI_PATH=\"$(\"$NODE_BINARY\" --print \"require('path').dirname(require.resolve('@rnef/cli/package.json')) + '/dist/src/bin.js'\")\"\n\nWITH_ENVIRONMENT=\"../../../node_modules/react-native/scripts/xcode/with-environment.sh\"\nREACT_NATIVE_XCODE=\"../../../node_modules/react-native/scripts/react-native-xcode.sh\"\n\n/bin/sh -c \"$WITH_ENVIRONMENT $REACT_NATIVE_XCODE\"\n"; + shellScript = "if [[ -f \"$PODS_ROOT/../.xcode.env\" ]]; then\n source \"$PODS_ROOT/../.xcode.env\"\nfi\nif [[ -f \"$PODS_ROOT/../.xcode.env.local\" ]]; then\n source \"$PODS_ROOT/../.xcode.env.local\"\nfi\n\n# The project root by default is one level up from the ios directory\nexport PROJECT_ROOT=\"$PROJECT_DIR\"/..\n\nif [[ \"$CONFIGURATION\" = *Debug* ]]; then\n export SKIP_BUNDLING=1\nfi\nif [[ -z \"$ENTRY_FILE\" ]]; then\n # Set the entry JS file using the bundler's entry resolution.\n export ENTRY_FILE=\"$(\"$NODE_BINARY\" -e \"require('expo/scripts/resolveAppEntry')\" \"$PROJECT_ROOT\" ios absolute | tail -n 1)\"\nfi\n\nif [[ -z \"$CLI_PATH\" ]]; then\n # Use Expo CLI\n export CLI_PATH=\"$(\"$NODE_BINARY\" --print \"require.resolve('@expo/cli')\")\"\nfi\nif [[ -z \"$BUNDLE_COMMAND\" ]]; then\n # Default Expo CLI command for bundling\n export BUNDLE_COMMAND=\"export:embed\"\nfi\n\n`\"$NODE_BINARY\" --print \"require('path').dirname(require.resolve('react-native/package.json')) + '/scripts/react-native-xcode.sh'\"`\n"; }; 0487071ABBC71F28EF79F4AA /* [CP] Copy Pods Resources */ = { isa = PBXShellScriptBuildPhase; @@ -2149,6 +2158,7 @@ "$(SRCROOT)/WidgetsCore/MobileSchema/Schema/Objects/ApplicationContract.graphql.swift", "$(SRCROOT)/WidgetsCore/MobileSchema/Schema/Objects/AssetActivity.graphql.swift", "$(SRCROOT)/WidgetsCore/MobileSchema/Schema/Objects/BlockaidFees.graphql.swift", + "$(SRCROOT)/WidgetsCore/MobileSchema/Schema/Objects/BridgedWithdrawalInfo.graphql.swift", "$(SRCROOT)/WidgetsCore/MobileSchema/Schema/Objects/DescriptionTranslations.graphql.swift", "$(SRCROOT)/WidgetsCore/MobileSchema/Schema/Objects/Dimensions.graphql.swift", "$(SRCROOT)/WidgetsCore/MobileSchema/Schema/Objects/FeeData.graphql.swift", @@ -2387,7 +2397,7 @@ shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; - A98B71284330BF95E7CAB037 /* [CP-User] [RNFB] Core Configuration */ = { + 868B6279F959D6931E7A870E /* [CP-User] [RNFB] Core Configuration */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -2416,7 +2426,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "set -e\nexport SOURCEMAP_FILE=$DERIVED_FILE_DIR/main.jsbundle.map\n\nset -e\nif [[ -f \"$PODS_ROOT/../.xcode.env\" ]]; then\nsource \"$PODS_ROOT/../.xcode.env\"\nfi\nif [[ -f \"$PODS_ROOT/../.xcode.env.local\" ]]; then\nsource \"$PODS_ROOT/../.xcode.env.local\"\nfi\nexport CONFIG_CMD=\"dummy-workaround-value\"\nexport CLI_PATH=\"$(\"$NODE_BINARY\" --print \"require('path').dirname(require.resolve('@rnef/cli/package.json')) + '/dist/src/bin.js'\")\"\n\nWITH_ENVIRONMENT=\"../../../node_modules/react-native/scripts/xcode/with-environment.sh\"\nDATADOG_XCODE=\"./sourcemaps-datadog.sh\"\n\nif [[ -n \"$DATADOG_API_KEY\" ]]; then\n # JS source maps\n /bin/sh -c \"$WITH_ENVIRONMENT $DATADOG_XCODE\"\n # iOS dSYM\n ../../../node_modules/.bin/datadog-ci dsyms upload $DWARF_DSYM_FOLDER_PATH\nelse\n echo \"Ignoring upload step for local, API key is missing.\"\nfi\n"; + shellScript = "set -e\n\nWITH_ENVIRONMENT=\"../../../node_modules/react-native/scripts/xcode/with-environment.sh\"\nREACT_NATIVE_XCODE=\"./sourcemaps-datadog.sh\"\n\nexport SOURCEMAP_FILE=$DERIVED_FILE_DIR/main.jsbundle.map\n\nif [[ -n \"$DATADOG_API_KEY\" && \"$SKIP_DATADOG_UPLOAD\" != \"true\" ]]; then\n echo \"warning: Starting Datadog Uploads\"\n echo \"warning: Build Configuration: $CONFIGURATION\"\n echo \"warning: Product Name: $PRODUCT_NAME\"\n echo \"warning: Source Map File: $SOURCEMAP_FILE\"\n echo \"warning: dSYM Path: $DWARF_DSYM_FOLDER_PATH\"\n echo \"\"\n\n # JS source maps\n echo \"warning: Uploading JS source maps...\"\n \n /bin/sh -c \"$WITH_ENVIRONMENT $REACT_NATIVE_XCODE\"\n\n echo \"warning: \"\n\n # iOS dSYM\n echo \"warning: Uploading iOS dSYMs...\"\n echo \"warning: dSYM command: datadog-ci dsyms upload $DWARF_DSYM_FOLDER_PATH\"\n\n DSYM_LOG=$(mktemp)\n if ../../../node_modules/.bin/datadog-ci dsyms upload $DWARF_DSYM_FOLDER_PATH 2>&1 | tee \"$DSYM_LOG\"; then\n echo \"warning: dSYM upload completed successfully\"\n rm -f \"$DSYM_LOG\"\n else\n DSYM_EXIT_CODE=$?\n echo \"warning: \"\n echo \"warning: dSYM Upload Failed\"\n echo \"warning: Exit Code: $DSYM_EXIT_CODE\"\n echo \"warning: \"\n echo \"warning:Full Error Output:\"\n echo \"warning: ---\"\n echo \"warning: $(cat \"$DSYM_LOG\")\"\n echo \"warning: ---\"\n echo \"warning: \"\n echo \"warning: Debug Information:\"\n echo \"warning: - datadog-ci version: $(../../../node_modules/.bin/datadog-ci version 2>&1 || echo 'Failed to get version')\"\n echo \"warning: - dSYM folder exists: $([ -d \\\"$DWARF_DSYM_FOLDER_PATH\\\" ] && echo 'Yes' || echo 'No')\"\n echo \"warning: - dSYM contents: $(ls -la \\\"$DWARF_DSYM_FOLDER_PATH\\\" 2>&1 || echo 'Failed to list')\"\n echo \"warning: - DATADOG_API_KEY set: $([ -n \\\"$DATADOG_API_KEY\\\" ] && echo 'Yes (${#DATADOG_API_KEY} chars)' || echo 'No')\"\n echo \"warning: - Working directory: $(pwd)\"\n echo \"warning: \"\n echo \"warning: This is non-critical. Build will continue.\"\n rm -f \"$DSYM_LOG\"\n fi\n\n echo \"warning: \"\n echo \"warning: Datadog upload phase completed (build continues regardless of upload status)\"\nelse\n echo \"warning: Skipping Datadog upload (DATADOG_API_KEY not set or SKIP_DATADOG_UPLOAD=true)\"\nfi\n\n# Always exit 0 to not fail the build\nexit 0\n"; }; F5C7F44CBF58F052A43EB4AA /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; @@ -2473,7 +2483,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "export RCT_METRO_PORT=\"${RCT_METRO_PORT:=8081}\"\necho \"export RCT_METRO_PORT=${RCT_METRO_PORT}\" > \"${SRCROOT}/../node_modules/react-native/scripts/.packager.env\"\nif [ -z \"${RCT_NO_LAUNCH_PACKAGER+xxx}\" ] ; then\n if nc -w 5 -z localhost ${RCT_METRO_PORT} ; then\n if ! curl -s \"http://localhost:${RCT_METRO_PORT}/status\" | grep -q \"packager-status:running\" ; then\n echo \"Port ${RCT_METRO_PORT} already in use, packager is either not running or not running correctly\"\n exit 2\n fi\n else\n open \"$SRCROOT/../node_modules/react-native/scripts/launchPackager.command\" || echo \"Can't start packager automatically\"\n fi\nfi\n"; + shellScript = "if [[ -f \"$PODS_ROOT/../.xcode.env\" ]]; then\n source \"$PODS_ROOT/../.xcode.env\"\nfi\nif [[ -f \"$PODS_ROOT/../.xcode.env.local\" ]]; then\n source \"$PODS_ROOT/../.xcode.env.local\"\nfi\n\nexport RCT_METRO_PORT=\"${RCT_METRO_PORT:=8081}\"\necho \"export RCT_METRO_PORT=${RCT_METRO_PORT}\" > `$NODE_BINARY --print \"require('path').dirname(require.resolve('react-native/package.json')) + '/scripts/.packager.env'\"`\nif [ -z \"${RCT_NO_LAUNCH_PACKAGER+xxx}\" ] ; then\n if nc -w 5 -z localhost ${RCT_METRO_PORT} ; then\n if ! curl -s \"http://localhost:${RCT_METRO_PORT}/status\" | grep -q \"packager-status:running\" ; then\n echo \"Port ${RCT_METRO_PORT} already in use, packager is either not running or not running correctly\"\n exit 2\n fi\n else\n open `$NODE_BINARY --print \"require('path').dirname(require.resolve('expo/package.json')) + '/scripts/launchPackager.command'\"` || echo \"Can't start packager automatically\"\n fi\nfi\n"; showEnvVarsInLog = 0; }; FD54D51B296C780A007A37E9 /* Copy configuration-specific GoogleServices-Info.plist */ = { @@ -2640,122 +2650,123 @@ 0743221A2A83E3CA00F8518D /* TokenMarket.graphql.swift in Sources */, 074322322A83E3CA00F8518D /* NftBalance.graphql.swift in Sources */, 9F813EA02AA8FB7500438D89 /* TransactionDetails.graphql.swift in Sources */, - 30872BFB39EEC66944E3EFD7 /* MobileSchema.graphql.swift in Sources */, - 9822D243ED2F5C350404A375 /* HomeScreenTokenParts.graphql.swift in Sources */, - 61988A922656857278F7CBF9 /* TokenBalanceMainParts.graphql.swift in Sources */, - C8402101FF510BAA358DCA46 /* TokenBalanceParts.graphql.swift in Sources */, - FA8EB6A63AB3F56194C6CFB8 /* TokenBalanceQuantityParts.graphql.swift in Sources */, - A974633048E27D5D23420F34 /* TokenBasicInfoParts.graphql.swift in Sources */, - C8338C5BE951EF9111C48217 /* TokenBasicProjectParts.graphql.swift in Sources */, - 09F9DEB33392F3051BEA8D52 /* TokenFeeDataParts.graphql.swift in Sources */, - D7E3642851C618D369D26B82 /* TokenMarketParts.graphql.swift in Sources */, - 302E24504C4FCE674CF95984 /* TokenParts.graphql.swift in Sources */, - F53121FB1B070DB9A81347DF /* TokenProjectMarketsParts.graphql.swift in Sources */, - E0F63BA3A99DB10FA1CCAB5E /* TokenProjectUrlsParts.graphql.swift in Sources */, - 2B12DFE797E2CBF314565D81 /* TokenProtectionInfoParts.graphql.swift in Sources */, - 71CF37F19F1C138B57CC135C /* TopTokenParts.graphql.swift in Sources */, - 93566FBDE94E1A2D8CC5AB62 /* ConvertQuery.graphql.swift in Sources */, - 63BDDE4499AC6B2375C9F795 /* FavoriteTokenCardQuery.graphql.swift in Sources */, - FD4E55146E046C7F5983A379 /* FeedTransactionListQuery.graphql.swift in Sources */, - F0D6A92BB4FCE19CDFA5BBE1 /* HomeScreenTokensQuery.graphql.swift in Sources */, - D660CA59775C3634324037ED /* MultiplePortfolioBalancesQuery.graphql.swift in Sources */, - 2B422D705C68BB51FBDA9895 /* NFTItemScreenQuery.graphql.swift in Sources */, - EF3D92CA76DEE66090F18D0C /* NftCollectionScreenQuery.graphql.swift in Sources */, - AC70FF8207ED26561B634E30 /* NftsQuery.graphql.swift in Sources */, - 1C3559D557BC09C709104802 /* NftsTabQuery.graphql.swift in Sources */, - A104024A1861354EC1DD53C1 /* PortfolioBalancesQuery.graphql.swift in Sources */, - F772B09295DABC5E8895C1C5 /* SelectWalletScreenQuery.graphql.swift in Sources */, - 9381B5EA5839DA17D07A45F0 /* TokenDetailsScreenQuery.graphql.swift in Sources */, - DC0641C5870F91D26C914F1D /* TokenPriceHistoryQuery.graphql.swift in Sources */, - 93AEECDBDB160B5E0C9E3149 /* TokenProjectDescriptionQuery.graphql.swift in Sources */, - 8CEA6459A5B739C3A0382000 /* TokenProjectsQuery.graphql.swift in Sources */, - 677FC15A05D9BD23930FAC95 /* TokenQuery.graphql.swift in Sources */, - 62B32E9623DA0E939F062033 /* TokensQuery.graphql.swift in Sources */, - 171DD1C966C7FBF9DD68CFAC /* TopTokensQuery.graphql.swift in Sources */, - 257C7A9F2C4AC3C99C6B7348 /* TransactionHistoryUpdaterQuery.graphql.swift in Sources */, - 3361FE5837059AEF4AA877BE /* TransactionListQuery.graphql.swift in Sources */, - 8410B98A8D7974A941AAF299 /* WidgetTokensQuery.graphql.swift in Sources */, - 9AF0D1FDF2BFB17FB732C5FD /* SchemaConfiguration.swift in Sources */, - 8950F8354810AA673E1E35DA /* SchemaMetadata.graphql.swift in Sources */, - 4917B04DB81579CF4243A1DA /* Chain.graphql.swift in Sources */, - 614FCC3D8E9AA8175E950726 /* Currency.graphql.swift in Sources */, - 326CFFDBB89D95FA4CB95EBB /* HistoryDuration.graphql.swift in Sources */, - 143C638C2CCAC689371BFC93 /* NftActivityType.graphql.swift in Sources */, - 648B919F00D069DE1F0040F6 /* NftMarketplace.graphql.swift in Sources */, - 7BE97D20155AE69FF36C4CB4 /* NftStandard.graphql.swift in Sources */, - 1BC3A49161EB906542F8E23B /* ProtectionAttackType.graphql.swift in Sources */, - 8FE0F30936E893297558F467 /* ProtectionResult.graphql.swift in Sources */, - 66D2765A00D8CE3136D28F1F /* SafetyLevel.graphql.swift in Sources */, - 85ADD03923353DB3D6CD7301 /* SwapOrderStatus.graphql.swift in Sources */, - C791C5505DBB3036B9D5066D /* SwapOrderType.graphql.swift in Sources */, - 0C6FC49E0FC9BCB2DF5B627E /* TokenSortableField.graphql.swift in Sources */, - FD84AA379C4562598807843D /* TokenStandard.graphql.swift in Sources */, - 2E05037B51AF526A47701B09 /* TransactionDirection.graphql.swift in Sources */, - CCBC45FD4310D8153D859361 /* TransactionStatus.graphql.swift in Sources */, - 5D06BAB366D14A5AFE2355E8 /* TransactionType.graphql.swift in Sources */, - FBE634E2AEC7A62B89863366 /* ContractInput.graphql.swift in Sources */, - 3E338E14E33C721DAB708664 /* NftActivityFilterInput.graphql.swift in Sources */, - 50C89DFAF2DBC80D6343B164 /* NftAssetTraitInput.graphql.swift in Sources */, - D680C4844F2C5DACF5D0892E /* NftAssetsFilterInput.graphql.swift in Sources */, - AA3AE4E5C2AAC3F9460A3637 /* NftBalanceAssetInput.graphql.swift in Sources */, - C7ABAADA504107D152A52FD4 /* NftBalancesFilterInput.graphql.swift in Sources */, - 09E8C497051C37FE604FD40E /* OnRampTransactionsAuth.graphql.swift in Sources */, - C1FC1F8B4A2725A195F66D60 /* PortfolioValueModifier.graphql.swift in Sources */, - E091F379106E92D3181103CB /* IAmount.graphql.swift in Sources */, - EF05F69E61EA8A16C6A66D53 /* IContract.graphql.swift in Sources */, - CE1DF567D58943ACCBB8360C /* Amount.graphql.swift in Sources */, - 1CE49305114BF4792290DDC6 /* AmountChange.graphql.swift in Sources */, - F5B577CA1201CB6FF04A9A58 /* ApplicationContract.graphql.swift in Sources */, - 9A3E861F5D7B0F2CB0EFA7A6 /* AssetActivity.graphql.swift in Sources */, - 8ADDD2E2AB1FD9D1D9AF5627 /* BlockaidFees.graphql.swift in Sources */, - 03291E0DA448AF438F97EA5D /* DescriptionTranslations.graphql.swift in Sources */, - 4C187202229BDC4D8898E067 /* Dimensions.graphql.swift in Sources */, - 5C3958DA046B5A84FE90C1BD /* FeeData.graphql.swift in Sources */, - 0CEBEB8BE3AB95C3F584F6CE /* Image.graphql.swift in Sources */, - B377DB0418EA15695F208D9F /* NetworkFee.graphql.swift in Sources */, - BD59A9C8414D6A4BFE9C9A2E /* NftActivity.graphql.swift in Sources */, - B746C09DA19B4C7F9C700989 /* NftActivityConnection.graphql.swift in Sources */, - FE9CE5C3B5A456B249FC34C5 /* NftActivityEdge.graphql.swift in Sources */, - 1DC34AE3E11264475E8B9F62 /* NftApproval.graphql.swift in Sources */, - FC7C117CEA5EA63460E6A2C6 /* NftApproveForAll.graphql.swift in Sources */, - BD1FF76A8E50EFEA0720CC04 /* NftAsset.graphql.swift in Sources */, - 8CC06A8205186D0640F0BC55 /* NftAssetConnection.graphql.swift in Sources */, - 5804A1B1BB144D9EFBBE177D /* NftAssetEdge.graphql.swift in Sources */, - 126CC4BC99F3F15CC1E2F1C3 /* NftAssetTrait.graphql.swift in Sources */, - CF36F741187285B430EFE557 /* NftBalance.graphql.swift in Sources */, - 33928A7366AFE7F892CDC89F /* NftBalanceConnection.graphql.swift in Sources */, - CA0EDABCA1B6C2B0936BF5CF /* NftBalanceEdge.graphql.swift in Sources */, - 252BD40CB9B46FE47B2440B1 /* NftCollection.graphql.swift in Sources */, - D81BAFFCC105668B88B607FC /* NftCollectionConnection.graphql.swift in Sources */, - A3318C676D7FBF78A1583B16 /* NftCollectionEdge.graphql.swift in Sources */, - 85D0E81B798D0F2D841386E9 /* NftCollectionMarket.graphql.swift in Sources */, - 3FE25F715DFFD1D03DCDA57D /* NftContract.graphql.swift in Sources */, - 1B59968CF49C45B127E9C768 /* NftOrder.graphql.swift in Sources */, - 9B6C88F7D8D542AAC353A3EA /* NftOrderConnection.graphql.swift in Sources */, - 4BB9E218D89B8AF5E4E27CCB /* NftOrderEdge.graphql.swift in Sources */, - 6A60BDC9D46A710D871DEC6E /* NftProfile.graphql.swift in Sources */, - E54093DC857B8C634804D42B /* NftTransfer.graphql.swift in Sources */, - 0F282C26344F1AE3622232B0 /* OffRampTransactionDetails.graphql.swift in Sources */, - 1E2AF2C38C8FBEB2A95B644E /* OffRampTransfer.graphql.swift in Sources */, - CF2BAECCF9A2EC43AC3EC583 /* OnRampServiceProvider.graphql.swift in Sources */, - B61E182CF4937B5169885C95 /* OnRampTransactionDetails.graphql.swift in Sources */, - 553E6B467BEE49C9984691C5 /* OnRampTransfer.graphql.swift in Sources */, - 35B8176433A98BA798BBEE79 /* PageInfo.graphql.swift in Sources */, - 4FED6AAF896BA371C56D88B1 /* Portfolio.graphql.swift in Sources */, - 818179F5724AA35E1B1D5A9C /* ProtectionInfo.graphql.swift in Sources */, - ADE104A101B3DFFBDB308189 /* Query.graphql.swift in Sources */, - 03E3515E38E247F459218CAA /* SwapOrderDetails.graphql.swift in Sources */, - 31661D70B58410EA030E2C53 /* TimestampedAmount.graphql.swift in Sources */, - F2EB62621E64B57B07DE8B13 /* Token.graphql.swift in Sources */, - 9301D18644F3DFA9ABB8F0BE /* TokenApproval.graphql.swift in Sources */, - E24ED8688E9B18BBD543F8F0 /* TokenBalance.graphql.swift in Sources */, - AF83E7713BB625D787DD1A1D /* TokenMarket.graphql.swift in Sources */, - 0094F4FBBC1C0A2FFABF7157 /* TokenProject.graphql.swift in Sources */, - 869F3639FBC6D8156FFE3BD3 /* TokenProjectMarket.graphql.swift in Sources */, - 4EF8D293BB1EBCFBFC65A330 /* TokenTransfer.graphql.swift in Sources */, - 97CA219E1FFD832D8FA02C20 /* TransactionDetails.graphql.swift in Sources */, - BA83003638263D702D03C3C1 /* ActivityDetails.graphql.swift in Sources */, - 36E601F269D40A67FC353947 /* AssetChange.graphql.swift in Sources */, + 0D87DBFD19D5A6DF176C0AB7 /* MobileSchema.graphql.swift in Sources */, + A250CF455F6CEFB64ABFC277 /* HomeScreenTokenParts.graphql.swift in Sources */, + 0AC6A2E1C5837AAD902742DA /* TokenBalanceMainParts.graphql.swift in Sources */, + F77F1A182DCA1D8DFE46ACC8 /* TokenBalanceParts.graphql.swift in Sources */, + 02B7B534DFEC9DA0F7F06B8D /* TokenBalanceQuantityParts.graphql.swift in Sources */, + 6882C4768011FDD4D746BDDB /* TokenBasicInfoParts.graphql.swift in Sources */, + F09E3F15A36A9050B028B3E3 /* TokenBasicProjectParts.graphql.swift in Sources */, + 5551DDD6A8B9B28E03459816 /* TokenFeeDataParts.graphql.swift in Sources */, + 06C9F16E22B8B64855980A69 /* TokenMarketParts.graphql.swift in Sources */, + 2B2738BAB9E906B561E0D4D6 /* TokenParts.graphql.swift in Sources */, + 9D638326CD705ABE549C8CA7 /* TokenProjectMarketsParts.graphql.swift in Sources */, + FA318FB37223FAF04A5C887B /* TokenProjectUrlsParts.graphql.swift in Sources */, + 47797825D18637A2FE57AC1F /* TokenProtectionInfoParts.graphql.swift in Sources */, + CE8C365D91CADE7A5A8F4D52 /* TopTokenParts.graphql.swift in Sources */, + D6149AE9ED70F546DF5841BD /* ConvertQuery.graphql.swift in Sources */, + ED606CD83873CC9DFCCA44F1 /* FavoriteTokenCardQuery.graphql.swift in Sources */, + 147F4DFD43CE86324A066003 /* FeedTransactionListQuery.graphql.swift in Sources */, + 6250D4ACD5696D845FD83DFD /* HomeScreenTokensQuery.graphql.swift in Sources */, + CEE9E9912D5621F6E8F819B7 /* MultiplePortfolioBalancesQuery.graphql.swift in Sources */, + 70CD2D0665E5AC6A0DF6F697 /* NFTItemScreenQuery.graphql.swift in Sources */, + 206E0025B8FCE0EA96AC744A /* NftCollectionScreenQuery.graphql.swift in Sources */, + 7C886F9D4C02EF4E5F67B011 /* NftsQuery.graphql.swift in Sources */, + 092E5F0FE7DE6113285AF5E3 /* NftsTabQuery.graphql.swift in Sources */, + 57ECD348EA564F0CBF715E9E /* PortfolioBalancesQuery.graphql.swift in Sources */, + C0BBEE1CAEA4B2F778426BDE /* SelectWalletScreenQuery.graphql.swift in Sources */, + 81E55E8D3056E2378A332B31 /* TokenDetailsScreenQuery.graphql.swift in Sources */, + 34610491FF9A452F4F806157 /* TokenPriceHistoryQuery.graphql.swift in Sources */, + 1C84E14C7F52CF6C9A6D2930 /* TokenProjectDescriptionQuery.graphql.swift in Sources */, + DC4AA6DE28B9F40A3D7600F1 /* TokenProjectsQuery.graphql.swift in Sources */, + D0B9B6DEC559290B7F64B24F /* TokenQuery.graphql.swift in Sources */, + E654760CA0FF19139A85472A /* TokensQuery.graphql.swift in Sources */, + 8E6DA65AC5CAE9F9A67F9E38 /* TopTokensQuery.graphql.swift in Sources */, + FC61EDE606C85346CE069C5D /* TransactionHistoryUpdaterQuery.graphql.swift in Sources */, + E1009979B48ACF5017C12F09 /* TransactionListQuery.graphql.swift in Sources */, + EE4B861AE191A1BF70CF3784 /* WidgetTokensQuery.graphql.swift in Sources */, + AD6036D32C44048781B728E1 /* SchemaConfiguration.swift in Sources */, + 9EBC41A90B1A80653960045E /* SchemaMetadata.graphql.swift in Sources */, + F814C0144D90ADB4A8E0A34E /* Chain.graphql.swift in Sources */, + 9260D04A891FEDE2BF511707 /* Currency.graphql.swift in Sources */, + 23B195B262495EABE4A6CDF4 /* HistoryDuration.graphql.swift in Sources */, + D5F36D3EDC206DF15EC368AC /* NftActivityType.graphql.swift in Sources */, + 4DB6B64CFF3B00FCF0258336 /* NftMarketplace.graphql.swift in Sources */, + 91DBDA9B4F4006350AEB8E4B /* NftStandard.graphql.swift in Sources */, + F86D86FC31BBDA7246C50392 /* ProtectionAttackType.graphql.swift in Sources */, + CA966CBD02A7B16BC55F1B8E /* ProtectionResult.graphql.swift in Sources */, + 15193A0A3CE80FF72AAB54B4 /* SafetyLevel.graphql.swift in Sources */, + 3720F641F397A2819500B1B1 /* SwapOrderStatus.graphql.swift in Sources */, + E7D4A29333634717D099F80E /* SwapOrderType.graphql.swift in Sources */, + D48D1B7A4469BAAA22608058 /* TokenSortableField.graphql.swift in Sources */, + D1FB4E293EC152C12A495ACD /* TokenStandard.graphql.swift in Sources */, + 252A28057D1D481D14D2F5E5 /* TransactionDirection.graphql.swift in Sources */, + BFB114718A0D262E3AEAEDC0 /* TransactionStatus.graphql.swift in Sources */, + AAB837C01239A62D00068853 /* TransactionType.graphql.swift in Sources */, + 8BCFF1F648887F78894F1071 /* ContractInput.graphql.swift in Sources */, + C8F5AF75BDB439143FE1C173 /* NftActivityFilterInput.graphql.swift in Sources */, + 4FD78AA88D2EB8E22144BCDF /* NftAssetTraitInput.graphql.swift in Sources */, + 997BFD5324E4BDE2422FEFED /* NftAssetsFilterInput.graphql.swift in Sources */, + 0764D0BF05C44615BDD9AD65 /* NftBalanceAssetInput.graphql.swift in Sources */, + 51362EC6F0E6D8928C067F5E /* NftBalancesFilterInput.graphql.swift in Sources */, + BB28AF35DC102F8DE2A4BE9D /* OnRampTransactionsAuth.graphql.swift in Sources */, + 9EC9E4AB5C3FD254EDB28D7A /* PortfolioValueModifier.graphql.swift in Sources */, + A949039A6A9EB3584B5644F3 /* IAmount.graphql.swift in Sources */, + 2FC53D1C58218F0BF1D4E5F3 /* IContract.graphql.swift in Sources */, + 845327D60EFBB850189D6AB3 /* Amount.graphql.swift in Sources */, + ACA7AE75760B76F7B30DCD43 /* AmountChange.graphql.swift in Sources */, + 4DB88A2CBFF5FF356CA757F0 /* ApplicationContract.graphql.swift in Sources */, + 0AD9B4E176D2E9FE86E6ED21 /* AssetActivity.graphql.swift in Sources */, + 391FD815120230BDAF53F6F0 /* BlockaidFees.graphql.swift in Sources */, + 24B4011ADC672F470EC515AC /* BridgedWithdrawalInfo.graphql.swift in Sources */, + E2C528F617A9675690171D54 /* DescriptionTranslations.graphql.swift in Sources */, + BAB54489223FD0027F7A8DBE /* Dimensions.graphql.swift in Sources */, + 15A72E27235628C56431EC98 /* FeeData.graphql.swift in Sources */, + 86038259E487A108DDC2948B /* Image.graphql.swift in Sources */, + C064037906B259088B6B78B2 /* NetworkFee.graphql.swift in Sources */, + BE0DBD01CF4DCA6D3CDDA369 /* NftActivity.graphql.swift in Sources */, + 19BC2371F6BE6CAD5218AA53 /* NftActivityConnection.graphql.swift in Sources */, + 71954B20E4341CEC36203F87 /* NftActivityEdge.graphql.swift in Sources */, + 3389D45727F15B8E4F59B99F /* NftApproval.graphql.swift in Sources */, + 39DEA445993253BCC1201199 /* NftApproveForAll.graphql.swift in Sources */, + BED0DD22C0D9E09C85DF010D /* NftAsset.graphql.swift in Sources */, + E7B6F1CA0E30585C949C9D9A /* NftAssetConnection.graphql.swift in Sources */, + 7700BED7CD7F52C83A3FF430 /* NftAssetEdge.graphql.swift in Sources */, + D8A0C6D04FF53BA4F50543FE /* NftAssetTrait.graphql.swift in Sources */, + DB752E8F664505726ABDBCD3 /* NftBalance.graphql.swift in Sources */, + B64BD6DEB100AEB723DB640D /* NftBalanceConnection.graphql.swift in Sources */, + E475BA358DD8BE30A6FDC051 /* NftBalanceEdge.graphql.swift in Sources */, + 1CA252C75CD5291E2A0B308B /* NftCollection.graphql.swift in Sources */, + 8141B38CCDB09F91180C0EBD /* NftCollectionConnection.graphql.swift in Sources */, + 5676CCD265609B71D3B1DB7C /* NftCollectionEdge.graphql.swift in Sources */, + 31A4EC91F1924E25AECA2F4E /* NftCollectionMarket.graphql.swift in Sources */, + 438115E2759B1194751A8021 /* NftContract.graphql.swift in Sources */, + E7EDBB8CDF65D5D6602BF8FC /* NftOrder.graphql.swift in Sources */, + A9AF7B483E9666E88CD6253E /* NftOrderConnection.graphql.swift in Sources */, + 9E7EC26AC45301198E280DC7 /* NftOrderEdge.graphql.swift in Sources */, + 9061ACE5AF99CEDE7BA51C94 /* NftProfile.graphql.swift in Sources */, + EB0A75424F8EEF6612D28D52 /* NftTransfer.graphql.swift in Sources */, + 9A9B39BC22F3BDFCD0917B66 /* OffRampTransactionDetails.graphql.swift in Sources */, + F1193089AE71CA3C4C101EA5 /* OffRampTransfer.graphql.swift in Sources */, + A88A26642AC25B022F428953 /* OnRampServiceProvider.graphql.swift in Sources */, + 03EEEDA1A3D5EF23C0D14B08 /* OnRampTransactionDetails.graphql.swift in Sources */, + 4260B9F719F8E25DFBF99D73 /* OnRampTransfer.graphql.swift in Sources */, + 7E3412EB776E1F43D6904BA0 /* PageInfo.graphql.swift in Sources */, + 7B557C3224F990851430DBD2 /* Portfolio.graphql.swift in Sources */, + 2C9935142A9582467B5B5FC5 /* ProtectionInfo.graphql.swift in Sources */, + CBEB9122D993BCB0E9A604B7 /* Query.graphql.swift in Sources */, + 03AE019583139330A3E408AB /* SwapOrderDetails.graphql.swift in Sources */, + 16506815CDEE17670D3DD363 /* TimestampedAmount.graphql.swift in Sources */, + F49C1C4E9175DFE7EEF9FB51 /* Token.graphql.swift in Sources */, + 2D73D2D80BC8C455DB35CE57 /* TokenApproval.graphql.swift in Sources */, + 8117BFB02DCF0F315FD83E67 /* TokenBalance.graphql.swift in Sources */, + E4985BA9090E013F2C9FC190 /* TokenMarket.graphql.swift in Sources */, + 8971E73E041A6283E2684481 /* TokenProject.graphql.swift in Sources */, + 4DB6D0FB611F6C68EADFB948 /* TokenProjectMarket.graphql.swift in Sources */, + 15F6E43DA2BD9A8A681EC70C /* TokenTransfer.graphql.swift in Sources */, + 2925C6E0262B95C5EA0C2AE7 /* TransactionDetails.graphql.swift in Sources */, + 63FBF9C23ED568816590F093 /* ActivityDetails.graphql.swift in Sources */, + 8D85F349FEF81A52FB93EAAB /* AssetChange.graphql.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -2796,11 +2807,12 @@ 8E89C3B22AB8AAA400C84DE5 /* MnemonicTextField.swift in Sources */, FD7304D028A3650A0085BDEA /* Colors.swift in Sources */, 8E89C3AF2AB8AAA400C84DE5 /* MnemonicDisplayView.swift in Sources */, - 9FEC9B8B2A858CF1003CD019 /* AppDelegate.m in Sources */, + 45FFF7E12E8C2E6900362570 /* SilentPushEventEmitter.swift in Sources */, 6BC7D0802B5FF02400617C95 /* EncryptionUtils.swift in Sources */, 03C788232C10E7390011E5DC /* ActionButtons.swift in Sources */, 8EA8AB3B2AB7ED3C004E7EF3 /* SeedPhraseInputManager.m in Sources */, 03D2F3182C218D390030D987 /* RelativeOffsetView.swift in Sources */, + 45FFF7DF2E8C2A8100362570 /* SilentPushEventEmitter.m in Sources */, 6CA91BDB2A95223C00C4063E /* RNEthersRS.swift in Sources */, 8EA8AB3C2AB7ED3C004E7EF3 /* SeedPhraseInputViewModel.swift in Sources */, 072F6C2E2A44A32F00DA720A /* TokenPriceWidget.intentdefinition in Sources */, @@ -2810,6 +2822,7 @@ 6BC7D07F2B5FF02400617C95 /* ScantasticEncryption.swift in Sources */, 07B0676C2A7D6EC8001DD9B9 /* RNWidgets.swift in Sources */, 8E89C3AE2AB8AAA400C84DE5 /* MnemonicConfirmationView.swift in Sources */, + 8B2A92172EB3E78E00990413 /* AppDelegate.swift in Sources */, 5B4398EC2DD3B22C00F6BE08 /* PrivateKeyDisplayManager.m in Sources */, 5B4398ED2DD3B22C00F6BE08 /* PrivateKeyDisplayManager.swift in Sources */, 5B4398EE2DD3B22C00F6BE08 /* PrivateKeyDisplayView.swift in Sources */, @@ -2819,7 +2832,6 @@ 649A7A782D9AE70B00B53589 /* KeychainUtils.swift in Sources */, 649A7A792D9AE70B00B53589 /* KeychainConstants.swift in Sources */, 9FCEBF002A95A8E00079EDDB /* RNWalletConnect.m in Sources */, - 13B07FC11A68108700A75B9A /* main.m in Sources */, 6CA91BE32A95226200C4063E /* RNCloudStorageBackupsManager.swift in Sources */, 9FCEBF042A95A99C0079EDDB /* RCTThemeModule.m in Sources */, 9FCEBF012A95A8E00079EDDB /* RNWalletConnect.swift in Sources */, @@ -2985,7 +2997,7 @@ "@executable_path/Frameworks", "@loader_path/Frameworks", ); - MARKETING_VERSION = 1.61; + MARKETING_VERSION = 1.64.1; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_DEBUG"; @@ -3038,7 +3050,7 @@ "@executable_path/Frameworks", "@loader_path/Frameworks", ); - MARKETING_VERSION = 1.61; + MARKETING_VERSION = 1.64.1; MTL_FAST_MATH = YES; OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_RELEASE"; PRODUCT_BUNDLE_IDENTIFIER = schemes.WidgetsCore; @@ -3091,7 +3103,7 @@ "@executable_path/Frameworks", "@loader_path/Frameworks", ); - MARKETING_VERSION = 1.61; + MARKETING_VERSION = 1.64.1; MTL_FAST_MATH = YES; OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_RELEASE"; PRODUCT_BUNDLE_IDENTIFIER = schemes.WidgetsCore; @@ -3144,7 +3156,7 @@ "@executable_path/Frameworks", "@loader_path/Frameworks", ); - MARKETING_VERSION = 1.61; + MARKETING_VERSION = 1.64.1; MTL_FAST_MATH = YES; OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_RELEASE"; PRODUCT_BUNDLE_IDENTIFIER = schemes.WidgetsCore; @@ -3182,7 +3194,7 @@ GCC_C_LANGUAGE_STANDARD = gnu11; GENERATE_INFOPLIST_FILE = YES; IPHONEOS_DEPLOYMENT_TARGET = 15.1; - MARKETING_VERSION = 1.61; + MARKETING_VERSION = 1.64.1; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_DEBUG"; @@ -3218,7 +3230,7 @@ GCC_C_LANGUAGE_STANDARD = gnu11; GENERATE_INFOPLIST_FILE = YES; IPHONEOS_DEPLOYMENT_TARGET = 15.1; - MARKETING_VERSION = 1.61; + MARKETING_VERSION = 1.64.1; MTL_FAST_MATH = YES; OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_RELEASE"; PRODUCT_BUNDLE_IDENTIFIER = schemes.WidgetsCoreTests; @@ -3253,7 +3265,7 @@ GCC_C_LANGUAGE_STANDARD = gnu11; GENERATE_INFOPLIST_FILE = YES; IPHONEOS_DEPLOYMENT_TARGET = 15.1; - MARKETING_VERSION = 1.61; + MARKETING_VERSION = 1.64.1; MTL_FAST_MATH = YES; OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_RELEASE"; PRODUCT_BUNDLE_IDENTIFIER = schemes.WidgetsCoreTests; @@ -3288,7 +3300,7 @@ GCC_C_LANGUAGE_STANDARD = gnu11; GENERATE_INFOPLIST_FILE = YES; IPHONEOS_DEPLOYMENT_TARGET = 15.1; - MARKETING_VERSION = 1.61; + MARKETING_VERSION = 1.64.1; MTL_FAST_MATH = YES; OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_RELEASE"; PRODUCT_BUNDLE_IDENTIFIER = schemes.WidgetsCoreTests; @@ -3335,7 +3347,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.61; + MARKETING_VERSION = 1.64.1; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_DEBUG"; @@ -3381,7 +3393,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.61; + MARKETING_VERSION = 1.64.1; MTL_FAST_MATH = YES; OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_RELEASE"; PRODUCT_BUNDLE_IDENTIFIER = com.uniswap.mobile.widgets; @@ -3427,7 +3439,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.61; + MARKETING_VERSION = 1.64.1; MTL_FAST_MATH = YES; OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_RELEASE"; PRODUCT_BUNDLE_IDENTIFIER = com.uniswap.mobile.dev.widgets; @@ -3473,7 +3485,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.61; + MARKETING_VERSION = 1.64.1; MTL_FAST_MATH = YES; OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_RELEASE"; PRODUCT_BUNDLE_IDENTIFIER = com.uniswap.mobile.beta.widgets; @@ -3515,7 +3527,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.61; + MARKETING_VERSION = 1.64.1; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_DEBUG"; @@ -3558,7 +3570,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.61; + MARKETING_VERSION = 1.64.1; MTL_FAST_MATH = YES; OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_RELEASE"; PRODUCT_BUNDLE_IDENTIFIER = com.uniswap.mobile.WidgetIntentExtension; @@ -3601,7 +3613,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.61; + MARKETING_VERSION = 1.64.1; MTL_FAST_MATH = YES; OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_RELEASE"; PRODUCT_BUNDLE_IDENTIFIER = com.uniswap.mobile.dev.WidgetIntentExtension; @@ -3644,7 +3656,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.61; + MARKETING_VERSION = 1.64.1; MTL_FAST_MATH = YES; OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_RELEASE"; PRODUCT_BUNDLE_IDENTIFIER = com.uniswap.mobile.beta.WidgetIntentExtension; @@ -3664,7 +3676,7 @@ baseConfigurationReference = A7C9F415D0E128A43003E071 /* Pods-Uniswap.debug.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = "$(inherited)"; - ASSETCATALOG_COMPILER_APPICON_NAME = "AppIcon${BUNDLE_ID_SUFFIX}"; + ASSETCATALOG_COMPILER_APPICON_NAME = "AppIcon$(BUNDLE_ID_SUFFIX)"; ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = ""; BUNDLE_ID_SUFFIX = .dev; CLANG_ENABLE_MODULES = YES; @@ -3680,14 +3692,14 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.61; + MARKETING_VERSION = 1.64.1; OTHER_LDFLAGS = ( "$(inherited)", "-ObjC", "-lc++", ); OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_DEBUG"; - PRODUCT_BUNDLE_IDENTIFIER = "com.uniswap.mobile${BUNDLE_ID_SUFFIX}"; + PRODUCT_BUNDLE_IDENTIFIER = com.uniswap.mobile.dev; PRODUCT_NAME = Uniswap; PROVISIONING_PROFILE_SPECIFIER = ""; SWIFT_OBJC_BRIDGING_HEADER = "Uniswap/RNEthersRs/RNEthersRS-Bridging-Header.h"; @@ -3702,7 +3714,7 @@ baseConfigurationReference = 178644A78AB62609EFDB66B3 /* Pods-Uniswap.release.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = "$(inherited)"; - ASSETCATALOG_COMPILER_APPICON_NAME = "AppIcon${BUNDLE_ID_SUFFIX}"; + ASSETCATALOG_COMPILER_APPICON_NAME = "AppIcon$(BUNDLE_ID_SUFFIX)"; ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = ""; BUNDLE_ID_SUFFIX = ""; CLANG_ENABLE_MODULES = YES; @@ -3718,14 +3730,14 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.61; + MARKETING_VERSION = 1.64.1; OTHER_LDFLAGS = ( "$(inherited)", "-ObjC", "-lc++", ); OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_RELEASE"; - PRODUCT_BUNDLE_IDENTIFIER = "com.uniswap.mobile${BUNDLE_ID_SUFFIX}"; + PRODUCT_BUNDLE_IDENTIFIER = com.uniswap.mobile; PRODUCT_NAME = Uniswap; PROVISIONING_PROFILE_SPECIFIER = "match AppStore com.uniswap.mobile"; SWIFT_OBJC_BRIDGING_HEADER = "Uniswap/RNEthersRs/RNEthersRS-Bridging-Header.h"; @@ -3813,6 +3825,7 @@ REACT_NATIVE_PATH = "${PODS_ROOT}/../../../../node_modules/react-native"; SDKROOT = iphoneos; SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) DEBUG"; + SWIFT_VERSION = 5.0; USE_HERMES = true; }; name = Debug; @@ -3887,6 +3900,7 @@ OTHER_LDFLAGS = "$(inherited)"; REACT_NATIVE_PATH = "${PODS_ROOT}/../../../../node_modules/react-native"; SDKROOT = iphoneos; + SWIFT_VERSION = 5.0; USE_HERMES = true; VALIDATE_PRODUCT = YES; }; @@ -3920,7 +3934,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.61; + MARKETING_VERSION = 1.64.1; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_DEBUG"; @@ -3965,7 +3979,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.61; + MARKETING_VERSION = 1.64.1; MTL_FAST_MATH = YES; OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_RELEASE"; PRODUCT_BUNDLE_IDENTIFIER = com.uniswap.mobile.OneSignalNotificationServiceExtension; @@ -4050,6 +4064,7 @@ OTHER_LDFLAGS = "$(inherited)"; REACT_NATIVE_PATH = "${PODS_ROOT}/../../../../node_modules/react-native"; SDKROOT = iphoneos; + SWIFT_VERSION = 5.0; USE_HERMES = true; VALIDATE_PRODUCT = YES; }; @@ -4060,7 +4075,7 @@ baseConfigurationReference = 62CEA9F2D5176D20A6402A3E /* Pods-Uniswap.beta.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = "$(inherited)"; - ASSETCATALOG_COMPILER_APPICON_NAME = "AppIcon${BUNDLE_ID_SUFFIX}"; + ASSETCATALOG_COMPILER_APPICON_NAME = "AppIcon$(BUNDLE_ID_SUFFIX)"; ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = ""; BUNDLE_ID_SUFFIX = .beta; CLANG_ENABLE_MODULES = YES; @@ -4076,14 +4091,14 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.61; + MARKETING_VERSION = 1.64.1; OTHER_LDFLAGS = ( "$(inherited)", "-ObjC", "-lc++", ); OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_RELEASE"; - PRODUCT_BUNDLE_IDENTIFIER = "com.uniswap.mobile${BUNDLE_ID_SUFFIX}"; + PRODUCT_BUNDLE_IDENTIFIER = com.uniswap.mobile.beta; PRODUCT_NAME = Uniswap; PROVISIONING_PROFILE_SPECIFIER = "match AppStore com.uniswap.mobile.beta"; SWIFT_OBJC_BRIDGING_HEADER = "Uniswap/RNEthersRs/RNEthersRS-Bridging-Header.h"; @@ -4148,7 +4163,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.61; + MARKETING_VERSION = 1.64.1; MTL_FAST_MATH = YES; OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_RELEASE"; PRODUCT_BUNDLE_IDENTIFIER = com.uniswap.mobile.beta.OneSignalNotificationServiceExtension; @@ -4233,6 +4248,7 @@ OTHER_LDFLAGS = "$(inherited)"; REACT_NATIVE_PATH = "${PODS_ROOT}/../../../../node_modules/react-native"; SDKROOT = iphoneos; + SWIFT_VERSION = 5.0; USE_HERMES = true; VALIDATE_PRODUCT = YES; }; @@ -4243,7 +4259,7 @@ baseConfigurationReference = 56FE9C9AF785221B7E3F4C04 /* Pods-Uniswap.dev.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = "$(inherited)"; - ASSETCATALOG_COMPILER_APPICON_NAME = "AppIcon${BUNDLE_ID_SUFFIX}"; + ASSETCATALOG_COMPILER_APPICON_NAME = "AppIcon$(BUNDLE_ID_SUFFIX)"; ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = ""; BUNDLE_ID_SUFFIX = .dev; CLANG_ENABLE_MODULES = YES; @@ -4259,14 +4275,14 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.61; + MARKETING_VERSION = 1.64.1; OTHER_LDFLAGS = ( "$(inherited)", "-ObjC", "-lc++", ); OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_RELEASE"; - PRODUCT_BUNDLE_IDENTIFIER = "com.uniswap.mobile${BUNDLE_ID_SUFFIX}"; + PRODUCT_BUNDLE_IDENTIFIER = com.uniswap.mobile.dev; PRODUCT_NAME = Uniswap; PROVISIONING_PROFILE_SPECIFIER = "match AppStore com.uniswap.mobile.dev"; SWIFT_OBJC_BRIDGING_HEADER = "Uniswap/RNEthersRs/RNEthersRS-Bridging-Header.h"; @@ -4331,7 +4347,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.61; + MARKETING_VERSION = 1.64.1; MTL_FAST_MATH = YES; OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_RELEASE"; PRODUCT_BUNDLE_IDENTIFIER = com.uniswap.mobile.dev.OneSignalNotificationServiceExtension; diff --git a/apps/mobile/ios/Uniswap/AppDelegate.h b/apps/mobile/ios/Uniswap/AppDelegate.h deleted file mode 100644 index 3151f6de6ed..00000000000 --- a/apps/mobile/ios/Uniswap/AppDelegate.h +++ /dev/null @@ -1,7 +0,0 @@ -#import -#import -#import - -@interface AppDelegate : RCTAppDelegate - -@end diff --git a/apps/mobile/ios/Uniswap/AppDelegate.m b/apps/mobile/ios/Uniswap/AppDelegate.m deleted file mode 100644 index 28b0f7e1310..00000000000 --- a/apps/mobile/ios/Uniswap/AppDelegate.m +++ /dev/null @@ -1,131 +0,0 @@ -#import "AppDelegate.h" - -#import - -#import "Uniswap-Swift.h" - -#import -#import -#import -#import -#import - -@implementation AppDelegate - -static NSString *const hasLaunchedOnceKey = @"HasLaunchedOnce"; - -/** - * Handles keychain cleanup on first run of the app. - * A migration flag is persisted in the keychain to avoid clearing the keychain for existing users, while the first run flag is saved in NSUserDefaults, which is cleared every install. - */ -- (void)handleKeychainCleanup { - NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; - BOOL isFirstRun = ![defaults boolForKey:hasLaunchedOnceKey]; - BOOL canClearKeychainOnReinstall = [KeychainUtils getCanClearKeychainOnReinstall]; - - if (canClearKeychainOnReinstall && isFirstRun) { - [KeychainUtils clearKeychain]; - } - - if (!canClearKeychainOnReinstall || isFirstRun) { - [defaults setBool:YES forKey:hasLaunchedOnceKey]; - [KeychainUtils setCanClearKeychainOnReinstall]; - } -} - -- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions -{ - // Must be first line in startup routine - [ReactNativePerformance onAppStarted]; - - [self handleKeychainCleanup]; - - [FIRApp configure]; - - // This is needed so universal links opened from OneSignal notifications navigate to the proper page. - // More details here: - // https://documentation.onesignal.com/v7.0/docs/react-native-sdk in the deep linking warning section. - NSMutableDictionary *newLaunchOptions = [NSMutableDictionary dictionaryWithDictionary:launchOptions]; - if (launchOptions[UIApplicationLaunchOptionsRemoteNotificationKey]) { - NSDictionary *remoteNotif = launchOptions[UIApplicationLaunchOptionsRemoteNotificationKey]; - if (remoteNotif[@"custom"] && remoteNotif[@"custom"][@"u"]) { - NSString *initialURL = remoteNotif[@"custom"][@"u"]; - if (!launchOptions[UIApplicationLaunchOptionsURLKey]) { - newLaunchOptions[UIApplicationLaunchOptionsURLKey] = [NSURL URLWithString:initialURL]; - } - } - } - - self.moduleName = @"Uniswap"; - self.dependencyProvider = [RCTAppDependencyProvider new]; - self.initialProps = @{}; - - [self.window makeKeyAndVisible]; - - if (@available(iOS 13.0, *)) { - self.window.rootViewController.view.backgroundColor = [UIColor systemBackgroundColor]; - } else { - self.window.rootViewController.view.backgroundColor = [UIColor whiteColor]; - } - - [super application:application didFinishLaunchingWithOptions:newLaunchOptions]; - - [[RCTI18nUtil sharedInstance] allowRTL:NO]; - [RNBootSplash initWithStoryboard:@"SplashScreen" rootView:self.window.rootViewController.view]; - - return YES; -} - -- (NSURL *)sourceURLForBridge:(RCTBridge *)bridge -{ - return [self bundleURL]; -} - -- (NSURL *)bundleURL -{ -#if DEBUG - return [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index"]; -#else - return [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"]; -#endif -} - -/// This method controls whether the `concurrentRoot`feature of React18 is turned on or off. -/// -/// @see: https://reactjs.org/blog/2022/03/29/react-v18.html -/// @note: This requires to be rendering on Fabric (i.e. on the New Architecture). -/// @return: `true` if the `concurrentRoot` feature is enabled. Otherwise, it returns `false`. -- (BOOL)concurrentRootEnabled -{ - return true; -} - -// Enable deep linking -- (BOOL)application:(UIApplication *)application - openURL:(NSURL *)url - options:(NSDictionary *)options -{ - return [RCTLinkingManager application:application openURL:url options:options]; -} - -// Enable universal links -- (BOOL)application:(UIApplication *)application continueUserActivity:(nonnull NSUserActivity *)userActivity - restorationHandler:(nonnull void (^)(NSArray> * _Nullable))restorationHandler -{ - return [RCTLinkingManager application:application - continueUserActivity:userActivity - restorationHandler:restorationHandler]; -} - -// Disable 3rd party keyboard --(BOOL)application:(UIApplication *)application shouldAllowExtensionPointIdentifier:(NSString *)extensionPointIdentifier -{ - if (extensionPointIdentifier == UIApplicationKeyboardExtensionPointIdentifier) - { - return NO; - } - - return YES; -} - -@end diff --git a/apps/mobile/ios/Uniswap/AppDelegate.swift b/apps/mobile/ios/Uniswap/AppDelegate.swift new file mode 100644 index 00000000000..ca105e69da3 --- /dev/null +++ b/apps/mobile/ios/Uniswap/AppDelegate.swift @@ -0,0 +1,163 @@ +import UIKit +import Expo +import ExpoModulesCore +import React +import ReactAppDependencyProvider +import Firebase +import ReactNativePerformance +import RNBootSplash +import UserNotifications + +@main +class AppDelegate: ExpoAppDelegate { + + static let hasLaunchedOnceKey = "HasLaunchedOnce" + + var window: UIWindow? + var reactNativeDelegate: ExpoReactNativeFactoryDelegate? + var reactNativeFactory: ExpoReactNativeFactory? + + override func application( + _ application: UIApplication, + didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? = nil + ) -> Bool { + print("🚀 AppDelegate: Starting initialization") + + // Must be first line in startup routine + ReactNativePerformance.onAppStarted() + print("📊 ReactNativePerformance started") + + // Handle keychain cleanup on first launch + handleKeychainCleanup() + print("🔐 Keychain cleanup completed") + + // Configure Firebase + FirebaseApp.configure() + print("🔥 Firebase configured") + + // Handle OneSignal deep linking + var newLaunchOptions = launchOptions ?? [:] + if let remoteNotif = launchOptions?[UIApplication.LaunchOptionsKey.remoteNotification] as? [String: Any], + let custom = remoteNotif["custom"] as? [String: Any], + let initialURL = custom["u"] as? String, + launchOptions?[UIApplication.LaunchOptionsKey.url] == nil { + newLaunchOptions[UIApplication.LaunchOptionsKey.url] = URL(string: initialURL) + print("🔗 OneSignal deep link processed") + } + + // Set up Expo React Native factory + let delegate = ReactNativeDelegate() + let factory = ExpoReactNativeFactory(delegate: delegate) + delegate.dependencyProvider = RCTAppDependencyProvider() + + reactNativeDelegate = delegate + reactNativeFactory = factory + bindReactNativeFactory(factory) + + window = UIWindow(frame: UIScreen.main.bounds) + factory.startReactNative( + withModuleName: "Uniswap", + in: window, + launchOptions: newLaunchOptions + ) + + let result = super.application(application, didFinishLaunchingWithOptions: newLaunchOptions) + + print("🏁 AppDelegate initialization complete") + return result + } + + // MARK: - Keychain Cleanup + private func handleKeychainCleanup() { + let defaults = UserDefaults.standard + let isFirstRun = !defaults.bool(forKey: AppDelegate.hasLaunchedOnceKey) + let canClearKeychainOnReinstall = KeychainUtils.getCanClearKeychainOnReinstall() + + if canClearKeychainOnReinstall && isFirstRun { + KeychainUtils.clearKeychain() + } + + if !canClearKeychainOnReinstall || isFirstRun { + defaults.set(true, forKey: AppDelegate.hasLaunchedOnceKey) + KeychainUtils.setCanClearKeychainOnReinstall() + } + } + + // MARK: - Deep Linking + override func application( + _ app: UIApplication, + open url: URL, + options: [UIApplication.OpenURLOptionsKey: Any] = [:] + ) -> Bool { + return super.application(app, open: url, options: options) || RCTLinkingManager.application(app, open: url, options: options) + } + + // Universal Links + override func application( + _ application: UIApplication, + continue userActivity: NSUserActivity, + restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void + ) -> Bool { + let result = RCTLinkingManager.application(application, continue: userActivity, restorationHandler: restorationHandler) + return super.application(application, continue: userActivity, restorationHandler: restorationHandler) || result + } + + // MARK: - Push Notifications + override func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { + // Handle device token registration + // OneSignal and other services will handle this via swizzling + } + + override func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) { + // Handle registration failure + print("Failed to register for remote notifications: \(error)") + } + + override func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) { + if let aps = userInfo["aps"] as? [String: Any] { + let contentAvailable = aps["content-available"] ?? aps["content_available"] + + if let contentNumber = contentAvailable as? NSNumber, contentNumber.intValue == 1 { + // Convert obj-c payload to SilentPushEventEmitter + let payload = userInfo.reduce(into: [String: Any]()) { result, entry in + if let key = entry.key as? String { + result[key] = entry.value + } + } + + SilentPushEventEmitter.emitEvent(with: payload) + } + } + completionHandler(.noData) + } + + // MARK: - Security + @objc(application:shouldAllowExtensionPointIdentifier:) + func application(_ application: UIApplication, shouldAllowExtensionPointIdentifier extensionPointIdentifier: UIApplication.ExtensionPointIdentifier) -> Bool { + // Disable 3rd party keyboards + if extensionPointIdentifier == .keyboard { + return false + } + return true + } +} + +class ReactNativeDelegate: ExpoReactNativeFactoryDelegate { + override func sourceURL(for bridge: RCTBridge) -> URL? { + bridge.bundleURL ?? bundleURL() + } + + override func bundleURL() -> URL? { + #if DEBUG + return RCTBundleURLProvider.sharedSettings().jsBundleURL(forBundleRoot: ".expo/.virtual-metro-entry") + #else + return Bundle.main.url(forResource: "main", withExtension: "jsbundle") + #endif + } + + // Override customize to initialize RNBootSplash BEFORE the window becomes visible + public override func customize(_ rootView: UIView) { + super.customize(rootView) + RNBootSplash.initWithStoryboard("SplashScreen", rootView: rootView) + } +} diff --git a/apps/mobile/ios/Uniswap/Notifications/SilentPushEventEmitter.m b/apps/mobile/ios/Uniswap/Notifications/SilentPushEventEmitter.m new file mode 100644 index 00000000000..343b5119cf9 --- /dev/null +++ b/apps/mobile/ios/Uniswap/Notifications/SilentPushEventEmitter.m @@ -0,0 +1,18 @@ +// +// SilentPushEventEmitter.m +// Uniswap +// +// Created by John Short on 9/29/25. +// + +#import +#import +#import + +@interface RCT_EXTERN_MODULE(SilentPushEventEmitter, RCTEventEmitter) + +RCT_EXTERN_METHOD(supportedEvents) +RCT_EXTERN_METHOD(addListener:(NSString *)eventName) +RCT_EXTERN_METHOD(removeListeners:(nonnull NSNumber *)count) + +@end diff --git a/apps/mobile/ios/Uniswap/Notifications/SilentPushEventEmitter.swift b/apps/mobile/ios/Uniswap/Notifications/SilentPushEventEmitter.swift new file mode 100644 index 00000000000..c79a3fb051a --- /dev/null +++ b/apps/mobile/ios/Uniswap/Notifications/SilentPushEventEmitter.swift @@ -0,0 +1,31 @@ +// +// SilentPushEventEmitter.swift +// Uniswap +// +// Created by John Short on 9/29/25. +// + +import React + +@objc(SilentPushEventEmitter) +open class SilentPushEventEmitter: RCTEventEmitter { + + public static weak var emitter: RCTEventEmitter? + + override init() { + super.init() + SilentPushEventEmitter.emitter = self + } + + open override func supportedEvents() -> [String] { + ["SilentPushReceived"] + } + + @objc(emitEventWithPayload:) + public static func emitEvent(with payload: [String: Any]) { + guard let emitter = emitter else { + return + } + emitter.sendEvent(withName: "SilentPushReceived", body: payload) + } +} diff --git a/apps/mobile/ios/Uniswap/Uniswap-Bridging-Header.h b/apps/mobile/ios/Uniswap/Uniswap-Bridging-Header.h new file mode 100644 index 00000000000..8a24474f8ac --- /dev/null +++ b/apps/mobile/ios/Uniswap/Uniswap-Bridging-Header.h @@ -0,0 +1,23 @@ +// +// Uniswap-Bridging-Header.h +// Uniswap +// +// Bridging header for Swift/Objective-C interoperability +// + +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import "libethers_ffi.h" + +// Import any other Objective-C headers that need to be accessible from Swift \ No newline at end of file diff --git a/apps/mobile/ios/Uniswap/main.m b/apps/mobile/ios/Uniswap/main.m deleted file mode 100644 index b1df44b953e..00000000000 --- a/apps/mobile/ios/Uniswap/main.m +++ /dev/null @@ -1,9 +0,0 @@ -#import - -#import "AppDelegate.h" - -int main(int argc, char * argv[]) { - @autoreleasepool { - return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); - } -} diff --git a/apps/mobile/ios/WidgetsCore/.mobileschema_fingerprint b/apps/mobile/ios/WidgetsCore/.mobileschema_fingerprint index dcdbb6388ae..bdbfc2b1a8b 100644 --- a/apps/mobile/ios/WidgetsCore/.mobileschema_fingerprint +++ b/apps/mobile/ios/WidgetsCore/.mobileschema_fingerprint @@ -1 +1 @@ -7a03144e3423ea77bd883f7e79a0e3d6a3c54ea3e98424ac288e5f817f88931c \ No newline at end of file +6ac99a17ab7586621527349b19aa9fee726de2187db2a35e940d94747d2b4cf8 \ No newline at end of file diff --git a/apps/mobile/ios/sourcemaps-datadog.sh b/apps/mobile/ios/sourcemaps-datadog.sh index b182975a380..0bf96a9cb4a 100755 --- a/apps/mobile/ios/sourcemaps-datadog.sh +++ b/apps/mobile/ios/sourcemaps-datadog.sh @@ -1,6 +1,64 @@ #!/bin/sh +# Note: Not using 'set -e' because we want to handle errors gracefully -REACT_NATIVE_XCODE="../../../node_modules/react-native/scripts/react-native-xcode.sh" -DATADOG_XCODE="../../../node_modules/.bin/datadog-ci react-native xcode" +# Fix invalid paths for --entry-file and --assets-dest params, +# needed for react-native/scripts/bundle.js script. +export ENTRY_FILE="apps/mobile/index.js" +export DEST="ios/Uniswap.app" -/bin/sh -c "$DATADOG_XCODE $REACT_NATIVE_XCODE" +# Store the starting directory, and if we're in an `ios` dir, move up to parent +START_DIR=$(pwd) +BASENAME=$(basename "$START_DIR") +if [ "$BASENAME" = "ios" ]; then + cd .. +fi + +DATADOG_XCODE="../../node_modules/.bin/datadog-ci react-native xcode" +REACT_NATIVE_XCODE="../../node_modules/react-native/scripts/react-native-xcode.sh" + +# Create a temporary file for capturing output. +TEMP_LOG=$(mktemp) + +# As Xcode doesn't show echo messages by default, we enforce printing logs with the warning label. +echo "warning: Starting Datadog source map generation and upload..." +echo "warning: Command: $DATADOG_XCODE $REACT_NATIVE_XCODE" +echo "warning: SOURCEMAP_FILE: $SOURCEMAP_FILE" +echo "warning: Configuration: $CONFIGURATION" +echo "" + +# Run the datadog-ci command and capture both stdout and stderr +# Use pipefail to catch the exit code of the datadog command, not tee +set -o pipefail +if /bin/sh -c "$DATADOG_XCODE $REACT_NATIVE_XCODE" 2>&1 | tee "$TEMP_LOG"; then + set +o pipefail + echo "warning: Datadog source map upload completed successfully" + rm -f "$TEMP_LOG" + exit 0 +else + set +o pipefail + EXIT_CODE=$? + echo "error: " + echo "error: Datadog Source Map Upload Failed" + echo "error: Exit Code: $EXIT_CODE" + echo "error: " + echo "error: Full Error Output:" + echo "error: ---" + echo "error: $(cat "$TEMP_LOG")" + echo "error: ---" + echo "error: " + echo "error: Debug Information:" + echo "error: - datadog-ci version: $(../../../node_modules/.bin/datadog-ci version 2>&1 || echo 'Failed to get version')" + echo "error: - Node version: $(node --version 2>&1 || echo 'Node not found')" + echo "error: - React Native CLI: $(../../../node_modules/.bin/react-native --version 2>&1 || echo 'RN CLI not found')" + echo "error: - Working directory: $(pwd)" + echo "error: - DATADOG_API_KEY set: $([ -n "$DATADOG_API_KEY" ] && echo 'Yes' || echo 'No')" + echo "error: - Bundle file exists: $([ -f "$CONFIGURATION_BUILD_DIR/$UNLOCALIZED_RESOURCES_FOLDER_PATH/main.jsbundle" ] && echo 'Yes' || echo 'No')" + echo "error: - Source map exists: $([ -f "$SOURCEMAP_FILE" ] && echo "Yes ($SOURCEMAP_FILE)" || echo "No ($SOURCEMAP_FILE)")" + echo "error: " + echo "error: This is non-critical. Build will continue." + echo "error: Please report this error for investigation." + + rm -f "$TEMP_LOG" + # Exit with 0 to not fail the build + exit 0 +fi diff --git a/apps/mobile/jest-setup.js b/apps/mobile/jest-setup.js index 979c7cc8709..cb00bb1d297 100644 --- a/apps/mobile/jest-setup.js +++ b/apps/mobile/jest-setup.js @@ -1,6 +1,7 @@ -// Setups and mocks can go here -// For example: https://reactnavigation.org/docs/testing/ - +// From https://reactnavigation.org/docs/testing/#setting-up-jest +import 'react-native-gesture-handler/jestSetup'; +import { setUpTests } from 'react-native-reanimated'; +// Other import 'core-js' // necessary so setImmediate works in tests import 'utilities/jest-package-mocks' import 'uniswap/jest-package-mocks' @@ -11,6 +12,11 @@ import 'uniswap/src/i18n' // Uses real translations for tests import mockRNCNetInfo from '@react-native-community/netinfo/jest/netinfo-mock.js' +setUpTests() + +// Silence the warning: Animated: `useNativeDriver` is not supported because the native animated module is missing +jest.mock('react-native/Libraries/Animated/NativeAnimatedModule'); + jest.mock('@uniswap/client-explore/dist/uniswap/explore/v1/service-ExploreStatsService_connectquery', () => {}) jest.mock('@walletconnect/react-native-compat', () => ({})) @@ -65,6 +71,22 @@ jest.mock('@react-native-community/netinfo', () => ({ ...mockRNCNetInfo, NetInfo jest.mock('react-native', () => { const RN = jest.requireActual('react-native') // use original implementation, which comes with mocks out of the box + // Mock Linking module within React Native + RN.Linking = { + openURL: jest.fn(), + addEventListener: jest.fn(), + removeEventListener: jest.fn(), + canOpenURL: jest.fn(), + getInitialURL: jest.fn(), + } + + // Mock Share module within React Native + RN.Share = { + share: jest.fn(), + sharedAction: 'sharedAction', + dismissedAction: 'dismissedAction', + } + return RN }) @@ -74,22 +96,10 @@ jest.mock('@react-navigation/elements', () => ({ require('react-native-reanimated').setUpTests() -jest.mock('react-native/Libraries/Share/Share', () => ({ - share: jest.fn(), -})) - jest.mock('@react-native-firebase/auth', () => () => ({ signInAnonymously: jest.fn(), })) -jest.mock('react-native/Libraries/Linking/Linking', () => ({ - openURL: jest.fn(), - addEventListener: jest.fn(), - removeEventListener: jest.fn(), - canOpenURL: jest.fn(), - getInitialURL: jest.fn(), -})) - jest.mock("react-native-bootsplash", () => { return { hide: jest.fn().mockResolvedValue(), diff --git a/apps/mobile/jest.config.js b/apps/mobile/jest.config.js index 6b32f9ca40d..6f5da1044a5 100644 --- a/apps/mobile/jest.config.js +++ b/apps/mobile/jest.config.js @@ -23,6 +23,5 @@ module.exports = { setupFiles: [ '../../config/jest-presets/jest/setup.js', './jest-setup.js', - '../../node_modules/react-native-gesture-handler/jestSetup.js', ], } diff --git a/apps/mobile/metro.config.js b/apps/mobile/metro.config.js index 26513961f50..d3215f0097a 100644 --- a/apps/mobile/metro.config.js +++ b/apps/mobile/metro.config.js @@ -1,61 +1,38 @@ -/** - * Metro configuration for React Native with support for SVG files - * https://github.com/react-native-svg/react-native-svg#use-with-svg-files - * - * @format - */ -const { getMetroAndroidAssetsResolutionFix } = require('react-native-monorepo-tools') -const androidAssetsResolutionFix = getMetroAndroidAssetsResolutionFix() +const withStorybook = require('@storybook/react-native/metro/withStorybook'); +const { mergeConfig } = require('@react-native/metro-config'); +const { getDefaultConfig: getExpoDefaultConfig } = require('expo/metro-config'); -const withStorybook = require('@storybook/react-native/metro/withStorybook') - -const path = require('path') -const { getDefaultConfig, mergeConfig } = require('@react-native/metro-config') - -const mobileRoot = path.resolve(__dirname) -const workspaceRoot = path.resolve(mobileRoot, '../..') - -const watchFolders = [mobileRoot, `${workspaceRoot}/node_modules`, `${workspaceRoot}/packages`] - - -const defaultConfig = getDefaultConfig(__dirname) +const defaultConfig = getExpoDefaultConfig(__dirname); const { resolver: { sourceExts, assetExts }, -} = defaultConfig +} = defaultConfig; -const config = { +// Only customize necessary fields for SVG and Storybook support +const customConfig = { resolver: { - nodeModulesPaths: [`${workspaceRoot}/node_modules`], assetExts: assetExts.filter((ext) => ext !== 'svg'), sourceExts: [...sourceExts, 'svg', 'cjs'], }, transformer: { + babelTransformerPath: require.resolve('react-native-svg-transformer'), getTransformOptions: async () => ({ transform: { experimentalImportSupport: false, inlineRequires: true, }, }), - babelTransformerPath: require.resolve('react-native-svg-transformer'), - publicPath: androidAssetsResolutionFix.publicPath, - }, - server: { - enhanceMiddleware: (middleware) => { - return androidAssetsResolutionFix.applyMiddleware(middleware) - }, }, - watchFolders, -} - -const IS_STORYBOOK_ENABLED = process.env.NODE_ENV !== 'production' && process.env.NODE_ENV !== 'test' - -// Checkout more useful options in the docs: https://github.com/storybookjs/react-native?tab=readme-ov-file#options -module.exports = withStorybook(mergeConfig(defaultConfig, config), { - // Set to false to remove storybook specific options - // you can also use a env variable to set this - enabled: IS_STORYBOOK_ENABLED, - onDisabledRemoveStorybook: true, - // Path to your storybook config - configPath: path.resolve(__dirname, './.storybook'), -}) +}; + +const IS_STORYBOOK_ENABLED = + process.env.NODE_ENV !== 'production' && process.env.NODE_ENV !== 'test'; + +module.exports = withStorybook( + mergeConfig(getExpoDefaultConfig(__dirname), defaultConfig, customConfig), + { + enabled: IS_STORYBOOK_ENABLED, + onDisabledRemoveStorybook: true, + configPath: require('path').resolve(__dirname, './.storybook'), + } +); diff --git a/apps/mobile/project.json b/apps/mobile/project.json index 64583483260..78f2b753000 100644 --- a/apps/mobile/project.json +++ b/apps/mobile/project.json @@ -4,37 +4,37 @@ "executor": "nx:noop" }, "android": { - "command": "rnef run:android --variant=devDebug --app-id-suffix=dev && bun run start", + "command": "EXPO_ANDROID_LAUNCH_ACTIVITY='com.uniswap.mobile.dev/com.uniswap.MainActivity' bunx expo run:android --variant=devDebug --app-id=com.uniswap.mobile.dev", "options": { "cwd": "{projectRoot}" } }, "android:release": { - "command": "rnef run:android --variant=devRelease --app-id-suffix=dev", + "command": "EXPO_ANDROID_LAUNCH_ACTIVITY='com.uniswap.mobile.dev/com.uniswap.MainActivity' bunx expo run:android --variant=devRelease --app-id=com.uniswap.mobile.dev", "options": { "cwd": "{projectRoot}" } }, "android:beta": { - "command": "rnef run:android --variant=betaDebug --app-id-suffix=beta", + "command": "EXPO_ANDROID_LAUNCH_ACTIVITY='com.uniswap.mobile.beta/com.uniswap.MainActivity' bunx expo run:android --variant=betaDebug --app-id=com.uniswap.mobile.beta", "options": { "cwd": "{projectRoot}" } }, "android:beta:release": { - "command": "rnef run:android --variant=betaRelease --app-id-suffix=beta", + "command": "EXPO_ANDROID_LAUNCH_ACTIVITY='com.uniswap.mobile.beta/com.uniswap.MainActivity' bunx expo run:android --variant=betaRelease --app-id=com.uniswap.mobile.beta", "options": { "cwd": "{projectRoot}" } }, "android:prod": { - "command": "rnef run:android --variant=prodDebug", + "command": "EXPO_ANDROID_LAUNCH_ACTIVITY='com.uniswap.mobile/com.uniswap.MainActivity' bunx expo run:android --variant=prodDebug", "options": { "cwd": "{projectRoot}" } }, "android:prod:release": { - "command": "rnef run:android --variant=prodRelease", + "command": "EXPO_ANDROID_LAUNCH_ACTIVITY='com.uniswap.mobile/com.uniswap.MainActivity' bunx expo run:android --variant=prodRelease", "options": { "cwd": "{projectRoot}" } @@ -196,7 +196,7 @@ } }, "ios": { - "command": "rnef run:ios --scheme Uniswap --configuration Debug && bun run start", + "command": "bunx expo run:ios --scheme Uniswap --configuration Debug", "options": { "cwd": "{projectRoot}" } @@ -208,31 +208,31 @@ } }, "ios:smol": { - "command": "rnef run:ios --device=\"iPhone SE (3rd generation)\"", + "command": "bunx expo run:ios --device=\"iPhone SE (3rd generation)\"", "options": { "cwd": "{projectRoot}" } }, "ios:dev:release": { - "command": "rnef run:ios --configuration Dev", + "command": "bunx expo run:ios --configuration Dev", "options": { "cwd": "{projectRoot}" } }, "ios:beta": { - "command": "rnef run:ios --configuration Beta", + "command": "bunx expo run:ios --configuration Beta", "options": { "cwd": "{projectRoot}" } }, "ios:bundle": { - "command": "rnef bundle --entry-file='index.js' --dev false --bundle-output='./ios/main.jsbundle' --sourcemap-output ./ios/main.jsbundle.map --dev=false --platform='ios' --assets-dest='./ios'", + "command": "bunx react-native bundle --entry-file apps/mobile/index.js --platform ios --dev false --bundle-output ./ios/main.jsbundle --assets-dest ./ios --sourcemap-output ./ios/main.jsbundle.map", "options": { "cwd": "{projectRoot}" } }, "ios:release": { - "command": "rnef run:ios --configuration Release", + "command": "bunx expo run:ios --configuration Release", "options": { "cwd": "{projectRoot}" } @@ -244,22 +244,25 @@ "lint:eslint": {}, "lint:eslint:fix": {}, "start": { - "command": "NODE_ENV=development rnef start --client-logs", + "command": "EXPO_ANDROID_LAUNCH_ACTIVITY='com.uniswap.mobile.dev/com.uniswap.MainActivity' EXPO_BUILD_CONFIGURATION=Debug NODE_ENV=development bunx expo start --scheme uniswap", "options": { "cwd": "{projectRoot}" - } + }, + "dependsOn": ["pod:ensure", "android:ensure"] }, "start:e2e": { - "command": "NODE_ENV=development IS_E2E_TEST=true rnef start --client-logs", + "command": "NODE_ENV=development IS_E2E_TEST=true bunx expo start", "options": { "cwd": "{projectRoot}" - } + }, + "dependsOn": ["pod:ensure", "android:ensure"] }, "start:production": { - "command": "NODE_ENV=production rnef start --reset-cache", + "command": "NODE_ENV=production bunx expo start --reset-cache", "options": { "cwd": "{projectRoot}" - } + }, + "dependsOn": ["pod:ensure", "android:ensure"] }, "test": { "command": "node --max-old-space-size=8912 ../../node_modules/.bin/jest", @@ -286,6 +289,27 @@ "cwd": "{projectRoot}" } }, + "pod:ensure": { + "command": "./scripts/check-podfile.sh", + "options": { + "cwd": "{projectRoot}" + }, + "inputs": ["{projectRoot}/ios/Podfile", "{projectRoot}/ios/Podfile.lock"], + "cache": true + }, + "android:ensure": { + "command": "./scripts/check-android-gradle.sh", + "options": { + "cwd": "{projectRoot}" + }, + "inputs": [ + "{projectRoot}/android/build.gradle", + "{projectRoot}/android/app/build.gradle", + "{projectRoot}/android/settings.gradle", + "{projectRoot}/android/gradle.properties" + ], + "cache": true + }, "pod:update": { "command": "./scripts/podinstall.sh -u", "options": { diff --git a/apps/mobile/rnef.config.mjs b/apps/mobile/rnef.config.mjs deleted file mode 100644 index b513fc0efc3..00000000000 --- a/apps/mobile/rnef.config.mjs +++ /dev/null @@ -1,36 +0,0 @@ -import { platformAndroid } from '@rnef/platform-android' -import { platformIOS } from '@rnef/platform-ios' -import { pluginMetro } from '@rnef/plugin-metro' -import { providerGitHub } from '@rnef/provider-github' -import { config } from 'dotenv' -config({ path: '../../.env.defaults.local' }) - -const isGitHubAction = process.env.GITHUB_ACTIONS === 'true' - -export default { - plugins: [pluginMetro()], - platforms: { - ios: platformIOS(), - android: platformAndroid(), - }, - remoteCacheProvider: isGitHubAction - ? 'github-actions' - : providerGitHub({ - owner: 'uniswap', - repository: 'universe', - token: process.env.GH_TOKEN_RN_CLI, - }), - fingerprint: { - ignorePaths: [ - // Files generated by [GraphQL] Apollo Generate Swift script phase in Xcode, making fingerprint unstable when installing pods vs not - 'ios/OneSignalNotificationServiceExtension/Env.swift', - 'ios/WidgetsCore/Env.swift', - 'ios/WidgetsCore/MobileSchema/MobileSchema.graphql.swift', - 'ios/WidgetsCore/MobileSchema/Fragments/**/*', - 'ios/WidgetsCore/MobileSchema/Operations/**/*', - 'ios/WidgetsCore/MobileSchema/Schema/**/*', - // There's a setup script in Podfile that changes the podspec in node_modules, making fingerprint unstable when installing pods vs not - '../../node_modules/react-native-permissions/RNPermissions.podspec', - ], - }, -} diff --git a/apps/mobile/scripts/check-android-gradle.sh b/apps/mobile/scripts/check-android-gradle.sh new file mode 100755 index 00000000000..775576a1897 --- /dev/null +++ b/apps/mobile/scripts/check-android-gradle.sh @@ -0,0 +1,25 @@ +#!/bin/bash + +# This script warns users if they need to sync Gradle +# It's designed to be used with NX caching - NX will only run this +# when Android Gradle files change + +# Detect if we're in a workspace (monorepo) by checking for workspace root +# Script runs from apps/mobile, so check if ../../nx.json exists (workspace root) +if [ -f "../../nx.json" ]; then + # We're in a workspace, user likely runs commands from root + ANDROID_CMD="bun mobile android" +else + # We're not in a workspace, user runs commands from mobile dir + ANDROID_CMD="bun android" +fi + +echo "⚠️ Warning: Android Gradle files have changed since last build" +echo "" +echo "You may encounter issues when running the Android app." +echo "To fix this, run one of the following:" +echo " • $ANDROID_CMD (build Android app, which will sync Gradle automatically)" +echo "" +echo "Metro bundler will continue starting, but you should build the Android app before" +echo "attempting to run it to ensure Gradle dependencies are synced." + diff --git a/apps/mobile/scripts/check-podfile.sh b/apps/mobile/scripts/check-podfile.sh new file mode 100755 index 00000000000..4aec05ffce3 --- /dev/null +++ b/apps/mobile/scripts/check-podfile.sh @@ -0,0 +1,25 @@ +#!/bin/bash + +# This script warns users if they need to run pod install +# It's designed to be used with NX caching - NX will only run this +# when Podfile or Podfile.lock changes + +# Detect if we're in a workspace (monorepo) by checking for workspace root +# Script runs from apps/mobile, so check if ../../nx.json exists (workspace root) +if [ -f "../../nx.json" ]; then + # We're in a workspace, user likely runs commands from root + IOS_CMD="bun mobile ios" +else + # We're not in a workspace, user runs commands from mobile dir + IOS_CMD="bun ios" +fi + +echo "⚠️ Warning: Podfile or Podfile.lock has changed since last pod install" +echo "" +echo "You may encounter issues when running the iOS app." +echo "To fix this, run:" +echo " • $IOS_CMD (build iOS app, which will install pods automatically)" +echo "" +echo "Metro bundler will continue starting, but you should build the iOS app before" +echo "attempting to run it to ensure pods are installed." + diff --git a/apps/mobile/scripts/checkBundleSize.sh b/apps/mobile/scripts/checkBundleSize.sh index b9a4e5a57da..e72af794fa6 100755 --- a/apps/mobile/scripts/checkBundleSize.sh +++ b/apps/mobile/scripts/checkBundleSize.sh @@ -1,5 +1,5 @@ #!/bin/bash -MAX_SIZE=24.60 +MAX_SIZE=24.50 MAX_BUFFER=0.5 # Check OS type and use appropriate stat command diff --git a/apps/mobile/scripts/getFingerprintForRadonIDE.ts b/apps/mobile/scripts/getFingerprintForRadonIDE.ts new file mode 100644 index 00000000000..61d1e332131 --- /dev/null +++ b/apps/mobile/scripts/getFingerprintForRadonIDE.ts @@ -0,0 +1,22 @@ +#!/usr/bin/env bun +import { createProjectHashAsync } from '@expo/fingerprint' + +async function main(): Promise { + try { + const projectRoot = process.cwd() + const hash = await createProjectHashAsync(projectRoot, { + silent: true, + }) + console.log(hash) + } catch (error) { + const errorMessage = error instanceof Error ? error.message : String(error) + console.error(`Failed to generate fingerprint: ${errorMessage}`) + process.exit(1) + } +} + +main().catch((error) => { + const errorMessage = error instanceof Error ? error.message : String(error) + console.error(`Fatal error: ${errorMessage}`) + process.exit(1) +}) diff --git a/apps/mobile/scripts/ios-build-interactive/main.ts b/apps/mobile/scripts/ios-build-interactive/main.ts index db54dae187a..131f4c54749 100755 --- a/apps/mobile/scripts/ios-build-interactive/main.ts +++ b/apps/mobile/scripts/ios-build-interactive/main.ts @@ -219,11 +219,11 @@ const resetMetroCache = async (): Promise => { const buildForSimulator = async (config: BuildConfig): Promise => { printBuildInfo(config, 'iOS Simulator') - const args = ['rnef', 'run:ios', '--scheme', 'Uniswap', '--configuration', config.configuration] + const args = ['expo', 'run:ios', '--scheme', 'Uniswap', '--configuration', config.configuration] if (config.simulator) { const simulatorName = config.simulator.split('(')[0]?.trim() - args.push(`--device="${simulatorName}"`) + args.push(`--device=${simulatorName}`) } log.info(`Command: bun run ${args.join(' ')}\n`) @@ -241,13 +241,13 @@ const buildForDevice = async (config: BuildConfig): Promise => { printBuildInfo(config, 'iOS Device') const args = [ - 'rnef', + 'expo', 'run:ios', '--scheme', config.scheme, '--configuration', config.configuration, - '--destination', + '--device', 'device', ] diff --git a/apps/mobile/src/app/migrations.test.ts b/apps/mobile/src/app/migrations.test.ts index 55b7a04a610..76b64ac21ae 100644 --- a/apps/mobile/src/app/migrations.test.ts +++ b/apps/mobile/src/app/migrations.test.ts @@ -96,6 +96,8 @@ import { v90Schema, v91Schema, v92Schema, + v93Schema, + v95Schema, } from 'src/app/schema' import { persistConfig } from 'src/app/store' import { initialBiometricsSettingsState } from 'src/features/biometricsSettings/slice' @@ -105,6 +107,7 @@ import { initialPushNotificationsState } from 'src/features/notifications/slice' import { initialTweaksState } from 'src/features/tweaks/slice' import { initialWalletConnectState } from 'src/features/walletConnect/walletConnectSlice' import { ScannerModalState } from 'uniswap/src/components/ReceiveQRCode/constants' +import { USDC } from 'uniswap/src/constants/tokens' import { AccountType } from 'uniswap/src/features/accounts/types' import { initialUniswapBehaviorHistoryState } from 'uniswap/src/features/behaviorHistory/slice' import { UniverseChainId } from 'uniswap/src/features/chains/types' @@ -114,11 +117,16 @@ import { initialNotificationsState } from 'uniswap/src/features/notifications/sl import { initialSearchHistoryState } from 'uniswap/src/features/search/searchHistorySlice' import { initialUserSettingsState } from 'uniswap/src/features/settings/slice' import { ModalName } from 'uniswap/src/features/telemetry/constants' -import { initialTokensState } from 'uniswap/src/features/tokens/slice/slice' +import { initialTokensState } from 'uniswap/src/features/tokens/warnings/slice/slice' import { initialTransactionsState } from 'uniswap/src/features/transactions/slice' import { TransactionStatus, TransactionType } from 'uniswap/src/features/transactions/types/transactionDetails' import { initialVisibilityState } from 'uniswap/src/features/visibility/slice' -import { testMigrateSearchHistory, testRemoveTHBFromCurrency } from 'uniswap/src/state/uniswapMigrationTests' +import { + testAddActivityVisibility, + testMigrateDismissedTokenWarnings, + testMigrateSearchHistory, + testRemoveTHBFromCurrency, +} from 'uniswap/src/state/uniswapMigrationTests' import { transactionDetails } from 'uniswap/src/test/fixtures' import { DappRequestType } from 'uniswap/src/types/walletConnect' import { getAllKeysOfNestedObject } from 'utilities/src/primitives/objects' @@ -1784,4 +1792,24 @@ describe('Redux state migrations', () => { it('migrates from v92 to v93', () => { testMigrateSearchHistory(migrations[93], v92Schema) }) + + it('migrates from v93 to v95', () => { + testAddActivityVisibility(migrations[95], v93Schema) + }) + + it('migrates from v95 to v96', () => { + testMigrateDismissedTokenWarnings(migrations[96], { + ...v95Schema, + tokens: { + dismissedTokenWarnings: { + [UniverseChainId.Mainnet]: { + [USDC.address]: { + chainId: UniverseChainId.Mainnet, + address: USDC.address, + }, + }, + }, + }, + }) + }) }) diff --git a/apps/mobile/src/app/migrations.ts b/apps/mobile/src/app/migrations.ts index 779ea388446..8017c636abf 100644 --- a/apps/mobile/src/app/migrations.ts +++ b/apps/mobile/src/app/migrations.ts @@ -18,7 +18,9 @@ import { TransactionType, } from 'uniswap/src/features/transactions/types/transactionDetails' import { + addActivityVisibility, addDismissedBridgedAndCompatibleWarnings, + migrateDismissedTokenWarnings, migrateSearchHistory, removeThaiBahtFromFiatCurrency, unchecksumDismissedTokenWarningKeys, @@ -649,7 +651,8 @@ export const migrations = { const newNftKey = nftKey && tokenId && getNFTAssetKey(nftKey, tokenId) const accountNftsData = nftsData[accountAddress] - if (newNftKey && accountNftsData) { + + if (newNftKey) { accountNftsData[newNftKey] = { isHidden: true } } } @@ -1084,6 +1087,8 @@ export const migrations = { 93: migrateSearchHistory, 94: addDismissedBridgedAndCompatibleWarnings, + 95: addActivityVisibility, + 96: migrateDismissedTokenWarnings, } -export const MOBILE_STATE_VERSION = 94 +export const MOBILE_STATE_VERSION = 96 diff --git a/apps/mobile/src/app/modals/AccountSwitcherModal.tsx b/apps/mobile/src/app/modals/AccountSwitcherModal.tsx index de176e99439..aa6cb7b89f3 100644 --- a/apps/mobile/src/app/modals/AccountSwitcherModal.tsx +++ b/apps/mobile/src/app/modals/AccountSwitcherModal.tsx @@ -1,4 +1,5 @@ import { useIsFocused } from '@react-navigation/core' +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import React, { useCallback, useMemo, useState } from 'react' import { useTranslation } from 'react-i18next' import { useDispatch, useSelector } from 'react-redux' @@ -12,9 +13,13 @@ import { Button, Flex, Text, TouchableArea, useSporeColors } from 'ui/src' import { useDeviceDimensions } from 'ui/src/hooks/useDeviceDimensions' import { spacing } from 'ui/src/theme' import { AddressDisplay } from 'uniswap/src/components/accounts/AddressDisplay' +import { buildWrappedUrl } from 'uniswap/src/components/banners/shared/utils' +import { UniswapWrapped2025Card } from 'uniswap/src/components/banners/UniswapWrapped2025Card/UniswapWrapped2025Card' import { ActionSheetModal, MenuItemProp } from 'uniswap/src/components/modals/ActionSheetModal' import { Modal } from 'uniswap/src/components/modals/Modal' -import { AccountType, DisplayNameType } from 'uniswap/src/features/accounts/types' +import { UNISWAP_WEB_URL } from 'uniswap/src/constants/urls' +import { AccountType } from 'uniswap/src/features/accounts/types' +import { setHasDismissedUniswapWrapped2025Banner } from 'uniswap/src/features/behaviorHistory/slice' import { Platform } from 'uniswap/src/features/platforms/types/Platform' import { ElementName, ModalName, WalletEventName } from 'uniswap/src/features/telemetry/constants' import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send' @@ -23,13 +28,15 @@ import { TestID } from 'uniswap/src/test/fixtures/testIDs' import { ImportType, OnboardingEntryPoint } from 'uniswap/src/types/onboarding' import { MobileScreens, OnboardingScreens } from 'uniswap/src/types/screens/mobile' import { areAddressesEqual } from 'uniswap/src/utils/addresses' +import { openUri } from 'uniswap/src/utils/linking' +import { logger } from 'utilities/src/logger/logger' import { isAndroid } from 'utilities/src/platform' import { PlusCircle } from 'wallet/src/components/icons/PlusCircle' import { createOnboardingAccount } from 'wallet/src/features/onboarding/createOnboardingAccount' import { BackupType } from 'wallet/src/features/wallet/accounts/types' import { hasBackup } from 'wallet/src/features/wallet/accounts/utils' import { createAccountsActions } from 'wallet/src/features/wallet/create/createAccountsSaga' -import { useActiveAccountAddress, useDisplayName, useNativeAccountExists } from 'wallet/src/features/wallet/hooks' +import { useActiveAccountAddress, useNativeAccountExists } from 'wallet/src/features/wallet/hooks' import { selectAllAccountsSorted, selectSortedSignerMnemonicAccounts } from 'wallet/src/features/wallet/selectors' import { setAccountAsActive } from 'wallet/src/features/wallet/slice' @@ -59,9 +66,8 @@ export function AccountSwitcher({ onClose }: { onClose: () => void }): JSX.Eleme const hasImportedSeedPhrase = useNativeAccountExists() const isModalOpen = useIsFocused() const { openWalletRestoreModal, walletRestoreType } = useWalletRestore() - const displayName = useDisplayName(activeAccountAddress) - const activeAccountHasENS = displayName?.type === DisplayNameType.ENS + const isWrappedBannerEnabled = useFeatureFlag(FeatureFlags.UniswapWrapped2025) const sortedMnemonicAccounts = useSelector(selectSortedSignerMnemonicAccounts) @@ -99,6 +105,21 @@ export function AccountSwitcher({ onClose }: { onClose: () => void }): JSX.Eleme }) } + const onPressWrappedCard = useCallback(async () => { + if (!activeAccountAddress) { + return + } + + try { + const url = buildWrappedUrl(UNISWAP_WEB_URL, activeAccountAddress) + await openUri({ uri: url, openExternalBrowser: true }) + onClose() + dispatch(setHasDismissedUniswapWrapped2025Banner(true)) + } catch (error) { + logger.error(error, { tags: { file: 'AccountSwitcherModal', function: 'onPressWrappedCard' } }) + } + }, [activeAccountAddress, onClose, dispatch]) + const addWalletOptions = useMemo(() => { const createAdditionalAccount = async (): Promise => { // Generate new account @@ -270,19 +291,22 @@ export function AccountSwitcher({ onClose }: { onClose: () => void }): JSX.Eleme size={spacing.spacing60 - spacing.spacing4} variant="subheading1" /> - {!activeAccountHasENS && ( + {isWrappedBannerEnabled && ( - + )} + + + @@ -513,16 +564,9 @@ exports[`AccountSwitcher renders correctly 1`] = ` line-height-disabled="true" maxFontSizeMultiplier={1.2} numberOfLines={1} - onBlur={[Function]} - onFocus={[Function]} style={ { - "color": { - "dynamic": { - "dark": "#FFFFFF", - "light": "#131313", - }, - }, + "color": "#131313", "fontFamily": "Basel Grotesk", "fontSize": 17, "fontWeight": "500", @@ -586,11 +630,35 @@ exports[`AccountSwitcher renders correctly 1`] = ` collapsable={false} focusVisibleStyle={{}} forwardedRef={[Function]} + jestAnimatedProps={ + { + "value": {}, + } + } jestAnimatedStyle={ { "value": {}, } } + jestInlineStyle={ + [ + { + "backgroundColor": "transparent", + "borderBottomLeftRadius": 12, + "borderBottomRightRadius": 12, + "borderTopLeftRadius": 12, + "borderTopRightRadius": 12, + "flexDirection": "column", + "marginTop": 16, + "opacity": 1, + "transform": [ + { + "scale": 1, + }, + ], + }, + ] + } onBlur={[Function]} onClick={[Function]} onFocus={[Function]} @@ -603,27 +671,28 @@ exports[`AccountSwitcher renders correctly 1`] = ` onStartShouldSetResponder={[Function]} role="button" style={ - { - "backgroundColor": "transparent", - "borderBottomLeftRadius": 12, - "borderBottomRightRadius": 12, - "borderTopLeftRadius": 12, - "borderTopRightRadius": 12, - "flexDirection": "column", - "marginTop": 16, - "opacity": 1, - "transform": [ - { - "scale": 1, - }, - ], - } + [ + { + "backgroundColor": "transparent", + "borderBottomLeftRadius": 12, + "borderBottomRightRadius": 12, + "borderTopLeftRadius": 12, + "borderTopRightRadius": 12, + "flexDirection": "column", + "marginTop": 16, + "opacity": 1, + "transform": [ + { + "scale": 1, + }, + ], + }, + {}, + ] } testID="account-switcher-add-wallet" > = { reducer: executeSwapReducer, actions: executeSwapActions, }, - [swapSagaName]: { - name: swapSagaName, - wrappedSaga: swapSaga, - reducer: swapReducer, - actions: swapActions, - }, - [tokenWrapSagaName]: { - name: tokenWrapSagaName, - wrappedSaga: tokenWrapSaga, - reducer: tokenWrapReducer, - actions: tokenWrapActions, - }, [removeDelegationSagaName]: { name: removeDelegationSagaName, wrappedSaga: removeDelegationSaga, diff --git a/apps/mobile/src/app/navigation/NavigationContainer.tsx b/apps/mobile/src/app/navigation/NavigationContainer.tsx index 3300418d114..42ecef4f228 100644 --- a/apps/mobile/src/app/navigation/NavigationContainer.tsx +++ b/apps/mobile/src/app/navigation/NavigationContainer.tsx @@ -91,7 +91,7 @@ export const NavigationContainer: FC> = ({ children, on const useManageDeepLinks = (): void => { const dispatch = useDispatch() - const urlListener = useRef() + const urlListener = useRef(undefined) const deepLinkMutation = useMutation({ mutationFn: async () => { diff --git a/apps/mobile/src/app/navigation/constants.ts b/apps/mobile/src/app/navigation/constants.ts new file mode 100644 index 00000000000..778a6d63580 --- /dev/null +++ b/apps/mobile/src/app/navigation/constants.ts @@ -0,0 +1,2 @@ +// Some pages in react native navigation require a delay before the modal is opened +export const MODAL_OPEN_WAIT_TIME = 300 diff --git a/apps/mobile/src/app/navigation/navigation.tsx b/apps/mobile/src/app/navigation/navigation.tsx index 07cbfafd88c..889fbf8ea67 100644 --- a/apps/mobile/src/app/navigation/navigation.tsx +++ b/apps/mobile/src/app/navigation/navigation.tsx @@ -40,6 +40,8 @@ import { PasskeyHelpModalScreen } from 'src/components/modals/ReactNavigationMod import { PasskeyManagementModalScreen } from 'src/components/modals/ReactNavigationModals/PasskeyManagementModalScreen' import { PermissionsSettingsScreen } from 'src/components/modals/ReactNavigationModals/PermissionsSettingsScreen' import { PortfolioBalanceSettingsScreen } from 'src/components/modals/ReactNavigationModals/PortfolioBalanceSettingsScreen' +import { ReportTokenDataModalScreen } from 'src/components/modals/ReactNavigationModals/ReportTokenDataModalScreen' +import { ReportTokenIssueModalScreen } from 'src/components/modals/ReactNavigationModals/ReportTokenIssueModalScreen' import { SmartWalletEnabledModalScreen } from 'src/components/modals/ReactNavigationModals/SmartWalletEnabledModalScreen' import { SmartWalletNudgeScreen } from 'src/components/modals/ReactNavigationModals/SmartWalletNudgeScreen' import { TestnetModeModalScreen } from 'src/components/modals/ReactNavigationModals/TestnetModeModalScreen' @@ -419,6 +421,8 @@ export function AppStackNavigator(): JSX.Element { + + diff --git a/apps/mobile/src/app/navigation/tabs/CustomTabBar/CustomTabBar.tsx b/apps/mobile/src/app/navigation/tabs/CustomTabBar/CustomTabBar.tsx index 01de66c7fe1..d1b9cddd9bc 100644 --- a/apps/mobile/src/app/navigation/tabs/CustomTabBar/CustomTabBar.tsx +++ b/apps/mobile/src/app/navigation/tabs/CustomTabBar/CustomTabBar.tsx @@ -4,7 +4,7 @@ import type { LayoutChangeEvent } from 'react-native' import { useAnimatedStyle, useDerivedValue, withTiming } from 'react-native-reanimated' import { TAB_BAR_ANIMATION_DURATION, TAB_ITEMS } from 'src/app/navigation/tabs/CustomTabBar/constants' import { SwapButton } from 'src/app/navigation/tabs/SwapButton' -import { SwapLongPressModal } from 'src/app/navigation/tabs/SwapLongPressModal' +import { SwapLongPressOverlay } from 'src/app/navigation/tabs/SwapLongPressOverlay' import { Flex, TouchableArea, useIsDarkMode, useSporeColors } from 'ui/src' import { AnimatedFlex } from 'ui/src/components/layout/AnimatedFlex' import { iconSizes, spacing } from 'ui/src/theme' @@ -165,7 +165,7 @@ export function CustomTabBar({ state, navigation }: BottomTabBarProps): JSX.Elem - (null) + const longPressTimerRef = useRef(null) const hasTriggeredLongPressHaptic = useRef(false) const activeAccountAddress = useActiveAccountAddressWithThrow() diff --git a/apps/mobile/src/app/navigation/tabs/SwapLongPressModal.tsx b/apps/mobile/src/app/navigation/tabs/SwapLongPressOverlay.tsx similarity index 54% rename from apps/mobile/src/app/navigation/tabs/SwapLongPressModal.tsx rename to apps/mobile/src/app/navigation/tabs/SwapLongPressOverlay.tsx index 234d81b234c..9b36790f87a 100644 --- a/apps/mobile/src/app/navigation/tabs/SwapLongPressModal.tsx +++ b/apps/mobile/src/app/navigation/tabs/SwapLongPressOverlay.tsx @@ -2,14 +2,15 @@ import { FeatureFlags, useFeatureFlag } from '@universe/gating' import { BlurView } from 'expo-blur' import { type ReactNode, useMemo } from 'react' import { useTranslation } from 'react-i18next' -import { Modal, StyleSheet } from 'react-native' +import { StyleSheet, type ViewStyle } from 'react-native' +import Animated, { FadeIn, FadeOut } from 'react-native-reanimated' import { useDispatch } from 'react-redux' import { navigate } from 'src/app/navigation/rootNavigation' import { ESTIMATED_BOTTOM_TABS_HEIGHT } from 'src/app/navigation/tabs/CustomTabBar/constants' import { SwapButton } from 'src/app/navigation/tabs/SwapButton' import { useOpenReceiveModal } from 'src/features/modals/hooks/useOpenReceiveModal' import { openModal } from 'src/features/modals/modalSlice' -import { Flex, Text, TouchableArea, useSporeColors } from 'ui/src' +import { Flex, Text, TouchableArea, useIsDarkMode, useSporeColors } from 'ui/src' import { Bank, Buy, ReceiveAlt, SendAction } from 'ui/src/components/icons' import { iconSizes } from 'ui/src/theme' import { useEnabledChains } from 'uniswap/src/features/chains/hooks/useEnabledChains' @@ -19,19 +20,57 @@ import { useAppInsets } from 'uniswap/src/hooks/useAppInsets' import { isAndroid } from 'utilities/src/platform' import { useEvent } from 'utilities/src/react/hooks' +const ANIMATION_DURATION = 200 +const BASE_DELAY = 40 + +const AnimatedBlurView = Animated.createAnimatedComponent(BlurView) + +function AnimatedContainer({ + enteringDelay, + exitingDelay, + children, + style, + exitingDuration = ANIMATION_DURATION, +}: { + enteringDelay: number + exitingDelay: number + children: ReactNode + style?: ViewStyle + exitingDuration?: number +}): JSX.Element { + return ( + + {children} + + ) +} + const styles = StyleSheet.create({ blurView: { - flex: 1, + height: '100%', + left: 0, + position: 'absolute', + top: 0, + width: '100%', }, }) -interface SwapLongPressModalProps { +interface SwapLongPressOverlayProps { isVisible: boolean onClose: () => void onSwapLongPress: () => void } -export function SwapLongPressModal({ isVisible, onClose, onSwapLongPress }: SwapLongPressModalProps): JSX.Element { +export function SwapLongPressOverlay({ + isVisible, + onClose, + onSwapLongPress, +}: SwapLongPressOverlayProps): JSX.Element | null { const colors = useSporeColors() + const isDarkMode = useIsDarkMode() const insets = useAppInsets() const dispatch = useDispatch() const { t } = useTranslation() @@ -125,37 +164,72 @@ export function SwapLongPressModal({ isVisible, onClose, onSwapLongPress }: Swap [t, onReceivePress, onSendPress, onBuyPress, onSellPress, colors.accent1.val], ) + const NUM_OF_SWAP_MENU_ITEMS = swapMenuItems.length + const TOTAL_DELAY_FOR_EXIT_FROM_MENU_ITEMS = NUM_OF_SWAP_MENU_ITEMS * BASE_DELAY + + // Used for main container and SwapButton + const DELAY_FOR_MAIN_EXIT = TOTAL_DELAY_FOR_EXIT_FROM_MENU_ITEMS + ANIMATION_DURATION / 2 + + // We want to start animating the text out just before the main animation starts + const DELAY_FOR_SWAP_TEXT_EXIT = DELAY_FOR_MAIN_EXIT - ANIMATION_DURATION / 4 + + if (!isVisible) { + return null + } + return ( - - - - - {swapMenuItems.map((item) => ( - - ))} - - {/* Swap Button as last item in the column */} - + + + + {swapMenuItems.map((item, i) => { + const length = NUM_OF_SWAP_MENU_ITEMS + + // Wait for initial animation to complete, then animate each item in sequentially with a delay based on its position in the array. + const enteringDelay = ANIMATION_DURATION + (length - i) * BASE_DELAY + + // We want to start animating before the main animation starts + const exitingDelay = i * BASE_DELAY + + return ( + + + + ) + })} + + {/* Swap Button as last item in the column */} + + {/* We want to delay animating the text entering so the Swap button shows first, then the text animates in, followed by the actions + + Text animates out at the same time as the Swap button, so it looks like the text is animating in while the Swap button is animating out. + */} + {t('common.button.swap')} + + {/* Swap Button doesn't animate in so it feels like the same button that was long pressed on HomeScreen is still there. It is the final thing to animate out (along with the Text above). */} + - + - - - + + + ) } diff --git a/apps/mobile/src/app/navigation/types.ts b/apps/mobile/src/app/navigation/types.ts index c4d0cf03be1..c0ed40ff6cd 100644 --- a/apps/mobile/src/app/navigation/types.ts +++ b/apps/mobile/src/app/navigation/types.ts @@ -21,6 +21,8 @@ import { ReceiveCryptoModalState } from 'src/screens/ReceiveCryptoModalState' import { ViewPrivateKeysScreenState } from 'src/screens/ViewPrivateKeys/ViewPrivateKeysScreenState' import { BridgedAssetModalProps } from 'uniswap/src/components/BridgedAsset/BridgedAssetModal' import { WormholeModalProps } from 'uniswap/src/components/BridgedAsset/WormholeModal' +import { ReportTokenDataModalProps } from 'uniswap/src/components/reporting/ReportTokenDataModal' +import { ReportTokenModalProps } from 'uniswap/src/components/reporting/ReportTokenIssueModal' import { UniverseChainId } from 'uniswap/src/features/chains/types' import { FORServiceProvider } from 'uniswap/src/features/fiatOnRamp/types' import { NFTItem } from 'uniswap/src/features/nfts/types' @@ -221,6 +223,8 @@ export type AppStackParamList = { [ModalName.ConfirmDisableSmartWalletScreen]: undefined [ModalName.BridgedAsset]: BridgedAssetModalProps [ModalName.Wormhole]: WormholeModalProps + [ModalName.ReportTokenIssue]: ReportTokenModalProps + [ModalName.ReportTokenData]: ReportTokenDataModalProps } export type AppStackNavigationProp = NativeStackNavigationProp diff --git a/apps/mobile/src/app/schema.ts b/apps/mobile/src/app/schema.ts index b396fd537ad..8f8a78eecc1 100644 --- a/apps/mobile/src/app/schema.ts +++ b/apps/mobile/src/app/schema.ts @@ -721,8 +721,18 @@ delete v92SchemaIntermediate.cloudBackup export const v92Schema = v92SchemaIntermediate -const v93Schema = v92Schema +export const v93Schema = v92Schema + +export const v95Schema = { + ...v93Schema, + visibility: { + ...v93Schema.visibility, + activity: {}, + }, +} + +const v96Schema = v95Schema // TODO: [MOB-201] use function with typed output when API reducers are removed from rootReducer // export const getSchema = (): RootState => v0Schema -export const getSchema = (): typeof v93Schema => v93Schema +export const getSchema = (): typeof v96Schema => v96Schema diff --git a/apps/mobile/src/components/PriceExplorer/usePriceHistory.test.ts b/apps/mobile/src/components/PriceExplorer/usePriceHistory.test.ts index 4d2669249db..1c1c44a6e83 100644 --- a/apps/mobile/src/components/PriceExplorer/usePriceHistory.test.ts +++ b/apps/mobile/src/components/PriceExplorer/usePriceHistory.test.ts @@ -3,6 +3,7 @@ import { GraphQLApi } from '@universe/api' import { act } from 'react-test-renderer' import { useTokenPriceHistory } from 'src/components/PriceExplorer/usePriceHistory' import { renderHookWithProviders } from 'src/test/render' +import { USDC, USDC_ARBITRUM, USDC_BASE, USDC_OPTIMISM, USDC_POLYGON } from 'uniswap/src/constants/tokens' import { getLatestPrice, priceHistory, @@ -34,6 +35,24 @@ const mockTokenProjectsQuery = (historyPrices: number[]) => (): GraphQLApi.Token const formatPriceHistory = (history: GraphQLApi.TimestampedAmount[]): Omit[] => history.map(({ timestamp, value }) => ({ value, timestamp: timestamp * 1000 })) +/** + * Creates a USDC token project with matching priceHistory for both the aggregated market + * and the Ethereum token's market. This ensures the hook returns the expected data since + * it prefers per-chain price history over aggregated price history. + */ +const createUsdcTokenProjectWithMatchingPriceHistory = ( + history: (GraphQLApi.TimestampedAmount | undefined)[], +): GraphQLApi.TokenProject => ({ + ...usdcTokenProject({ priceHistory: history }), + tokens: [ + token({ sdkToken: USDC, market: tokenMarket({ priceHistory: history }) }), + token({ sdkToken: USDC_POLYGON }), + token({ sdkToken: USDC_ARBITRUM }), + token({ sdkToken: USDC_BASE, market: tokenMarket() }), + token({ sdkToken: USDC_OPTIMISM }), + ], +}) + describe(useTokenPriceHistory, () => { it('returns correct initial values', async () => { const { result } = renderHookWithProviders(() => useTokenPriceHistory({ currencyId: SAMPLE_CURRENCY_ID_1 })) @@ -59,7 +78,13 @@ describe(useTokenPriceHistory, () => { it('returns on-chain spot price if off-chain spot price is not available', async () => { const market = tokenMarket() const { resolvers } = queryResolvers({ - tokenProjects: () => [usdcTokenProject({ markets: undefined, tokens: [token({ market })] })], + tokenProjects: () => [ + usdcTokenProject({ + markets: undefined, + // Ensure token has the correct chain to match SAMPLE_CURRENCY_ID_1 (Ethereum) + tokens: [token({ market, chain: GraphQLApi.Chain.Ethereum })], + }), + ], }) const { result } = renderHookWithProviders(() => useTokenPriceHistory({ currencyId: SAMPLE_CURRENCY_ID_1 }), { resolvers, @@ -80,6 +105,35 @@ describe(useTokenPriceHistory, () => { }) }) + it('handles gracefully when no token matches the currencyId chain', async () => { + const aggregatedMarket = tokenProjectMarket() + const { resolvers } = queryResolvers({ + tokenProjects: () => [ + usdcTokenProject({ + markets: [aggregatedMarket], + // Provide tokens for different chains, but none matching SAMPLE_CURRENCY_ID_1 (Ethereum) + tokens: [token({ chain: GraphQLApi.Chain.Polygon }), token({ chain: GraphQLApi.Chain.Arbitrum })], + }), + ], + }) + const { result } = renderHookWithProviders(() => useTokenPriceHistory({ currencyId: SAMPLE_CURRENCY_ID_1 }), { + resolvers, + }) + + await waitFor(() => { + expect(result.current.loading).toBe(false) + expect(result.current.error).toBe(false) + }) + + // Should fall back to aggregated market data when no chain-specific token is found + await waitFor(() => { + expect(result.current.data?.spot).toEqual({ + value: expect.objectContaining({ value: aggregatedMarket.price.value }), + relativeChange: expect.objectContaining({ value: aggregatedMarket.pricePercentChange24h.value }), + }) + }) + }) + describe('correct number of digits', () => { it('for max price greater than 1', async () => { const { resolvers } = queryResolvers({ @@ -141,7 +195,7 @@ describe(useTokenPriceHistory, () => { it('properly formats price history entries', async () => { const history = priceHistory() const { resolvers } = queryResolvers({ - tokenProjects: () => [usdcTokenProject({ priceHistory: history })], + tokenProjects: () => [createUsdcTokenProjectWithMatchingPriceHistory(history)], }) const { result } = renderHookWithProviders(() => useTokenPriceHistory({ currencyId: SAMPLE_CURRENCY_ID_1 }), { resolvers, @@ -156,12 +210,9 @@ describe(useTokenPriceHistory, () => { }) it('filters out invalid price history entries', async () => { + const invalidHistory = [undefined, timestampedAmount({ value: 1 }), undefined, timestampedAmount({ value: 2 })] const { resolvers } = queryResolvers({ - tokenProjects: () => [ - usdcTokenProject({ - priceHistory: [undefined, timestampedAmount({ value: 1 }), undefined, timestampedAmount({ value: 2 })], - }), - ], + tokenProjects: () => [createUsdcTokenProjectWithMatchingPriceHistory(invalidHistory)], }) const { result } = renderHookWithProviders(() => useTokenPriceHistory({ currencyId: SAMPLE_CURRENCY_ID_1 }), { resolvers, @@ -191,10 +242,10 @@ describe(useTokenPriceHistory, () => { const monthPriceHistory = priceHistory({ duration: GraphQLApi.HistoryDuration.Month }) const yearPriceHistory = priceHistory({ duration: GraphQLApi.HistoryDuration.Year }) - const dayTokenProject = usdcTokenProject({ priceHistory: dayPriceHistory }) - const weekTokenProject = usdcTokenProject({ priceHistory: weekPriceHistory }) - const monthTokenProject = usdcTokenProject({ priceHistory: monthPriceHistory }) - const yearTokenProject = usdcTokenProject({ priceHistory: yearPriceHistory }) + const dayTokenProject = createUsdcTokenProjectWithMatchingPriceHistory(dayPriceHistory) + const weekTokenProject = createUsdcTokenProjectWithMatchingPriceHistory(weekPriceHistory) + const monthTokenProject = createUsdcTokenProjectWithMatchingPriceHistory(monthPriceHistory) + const yearTokenProject = createUsdcTokenProjectWithMatchingPriceHistory(yearPriceHistory) const { resolvers } = queryResolvers({ // eslint-disable-next-line max-params @@ -239,10 +290,11 @@ describe(useTokenPriceHistory, () => { }) await waitFor(() => { + const ethereumToken = dayTokenProject.tokens.find((t) => t.chain === GraphQLApi.Chain.Ethereum) expect(result.current.data?.spot).toEqual({ - value: expect.objectContaining({ value: dayTokenProject.markets[0]?.price.value }), + value: expect.objectContaining({ value: ethereumToken?.market?.price?.value }), relativeChange: expect.objectContaining({ - value: dayTokenProject.markets[0]?.pricePercentChange24h.value, + value: dayTokenProject.markets?.[0]?.pricePercentChange24h?.value, }), }) }) @@ -273,7 +325,7 @@ describe(useTokenPriceHistory, () => { }) }) - it('returns correct spot price', async () => { + it('returns correct spot price with calculated percentage change', async () => { const { result } = renderHookWithProviders( () => useTokenPriceHistory({ @@ -283,10 +335,16 @@ describe(useTokenPriceHistory, () => { { resolvers }, ) await waitFor(() => { + const ethereumToken = yearTokenProject.tokens.find((t) => t.chain === GraphQLApi.Chain.Ethereum) + // For non-Day durations, relativeChange is calculated from price history + const openPrice = yearPriceHistory[0]?.value ?? 0 + const closePrice = yearPriceHistory[yearPriceHistory.length - 1]?.value ?? 0 + const calculatedChange = openPrice > 0 ? ((closePrice - openPrice) / openPrice) * 100 : 0 + expect(result.current.data?.spot).toEqual({ - value: expect.objectContaining({ value: yearTokenProject.markets[0]?.price?.value }), + value: expect.objectContaining({ value: ethereumToken?.market?.price?.value }), relativeChange: expect.objectContaining({ - value: yearTokenProject.markets[0]?.pricePercentChange24h?.value, + value: calculatedChange, }), }) }) @@ -294,18 +352,20 @@ describe(useTokenPriceHistory, () => { }) describe('when duration is changed', () => { - it('returns new price history and spot price', async () => { + it('returns new price history and spot price with correct percentage change calculation', async () => { const { result } = renderHookWithProviders(() => useTokenPriceHistory({ currencyId: SAMPLE_CURRENCY_ID_1 }), { resolvers, }) await waitFor(() => { + const ethereumToken = dayTokenProject.tokens.find((t) => t.chain === GraphQLApi.Chain.Ethereum) + // For Day duration, should use API's 24hr value expect(result.current.data).toEqual({ priceHistory: formatPriceHistory(dayPriceHistory), spot: { - value: expect.objectContaining({ value: dayTokenProject.markets[0]?.price.value }), + value: expect.objectContaining({ value: ethereumToken?.market?.price?.value }), relativeChange: expect.objectContaining({ - value: dayTokenProject.markets[0]?.pricePercentChange24h.value, + value: dayTokenProject.markets?.[0]?.pricePercentChange24h?.value, }), }, }) @@ -317,12 +377,18 @@ describe(useTokenPriceHistory, () => { }) await waitFor(() => { + const ethereumToken = weekTokenProject.tokens.find((t) => t.chain === GraphQLApi.Chain.Ethereum) + // For Week duration, should calculate from price history + const openPrice = weekPriceHistory[0]?.value ?? 0 + const closePrice = weekPriceHistory[weekPriceHistory.length - 1]?.value ?? 0 + const calculatedChange = openPrice > 0 ? ((closePrice - openPrice) / openPrice) * 100 : 0 + expect(result.current.data).toEqual({ priceHistory: formatPriceHistory(weekPriceHistory), spot: { - value: expect.objectContaining({ value: weekTokenProject.markets[0]?.price?.value }), + value: expect.objectContaining({ value: ethereumToken?.market?.price?.value }), relativeChange: expect.objectContaining({ - value: weekTokenProject.markets[0]?.pricePercentChange24h?.value, + value: calculatedChange, }), }, }) diff --git a/apps/mobile/src/components/Requests/ConnectedDapps/DappConnectionItem.tsx b/apps/mobile/src/components/Requests/ConnectedDapps/DappConnectionItem.tsx index 2f7d54b1a79..f854756545e 100644 --- a/apps/mobile/src/components/Requests/ConnectedDapps/DappConnectionItem.tsx +++ b/apps/mobile/src/components/Requests/ConnectedDapps/DappConnectionItem.tsx @@ -4,11 +4,11 @@ import { NativeSyntheticEvent, StyleSheet } from 'react-native' import ContextMenu, { ContextMenuOnPressNativeEvent } from 'react-native-context-menu-view' import 'react-native-reanimated' import { FadeIn, FadeOut } from 'react-native-reanimated' -import { DappHeaderIcon } from 'src/components/Requests/DappHeaderIcon' import { WalletConnectSession } from 'src/features/walletConnect/walletConnectSlice' import { AnimatedTouchableArea, Flex, Text } from 'ui/src' import { iconSizes, spacing } from 'ui/src/theme' import { noop } from 'utilities/src/react/noop' +import { DappHeaderIcon } from 'wallet/src/components/dappRequests/DappHeaderIcon' export function DappConnectionItem({ session, @@ -74,7 +74,7 @@ export function DappConnectionItem({ )} - + {dappRequestInfo.name || dappRequestInfo.url} diff --git a/apps/mobile/src/components/Requests/ModalWithOverlay/ModalWithOverlay.tsx b/apps/mobile/src/components/Requests/ModalWithOverlay/ModalWithOverlay.tsx index 4ea51ca8353..39392c5ebd2 100644 --- a/apps/mobile/src/components/Requests/ModalWithOverlay/ModalWithOverlay.tsx +++ b/apps/mobile/src/components/Requests/ModalWithOverlay/ModalWithOverlay.tsx @@ -58,7 +58,7 @@ export function ModalWithOverlay({ }: ModalWithOverlayProps): JSX.Element { const scrollViewRef = useRef(null) const contentViewRef = useRef(null) - const measureLayoutTimeoutRef = useRef() + const measureLayoutTimeoutRef = useRef(undefined) const startedScrollingRef = useRef(false) const [showOverlay, setShowOverlay] = useState(false) @@ -126,7 +126,6 @@ export function ModalWithOverlay({ contentContainerStyle={ contentContainerStyle ?? { paddingHorizontal: spacing.spacing24, - paddingTop: spacing.spacing12, } } showsVerticalScrollIndicator={false} diff --git a/apps/mobile/src/components/Requests/RequestModal/ClientDetails.tsx b/apps/mobile/src/components/Requests/RequestModal/ClientDetails.tsx index 69120a67ad8..2fb263be61e 100644 --- a/apps/mobile/src/components/Requests/RequestModal/ClientDetails.tsx +++ b/apps/mobile/src/components/Requests/RequestModal/ClientDetails.tsx @@ -1,12 +1,9 @@ import React from 'react' -import { DappHeaderIcon } from 'src/components/Requests/DappHeaderIcon' import { HeaderText } from 'src/components/Requests/RequestModal/HeaderText' import { WalletConnectSigningRequest } from 'src/features/walletConnect/walletConnectSlice' -import { Flex, useSporeColors } from 'ui/src' -import { iconSizes } from 'ui/src/theme' import { useCurrencyInfo } from 'uniswap/src/features/tokens/useCurrencyInfo' -import { formatDappURL } from 'utilities/src/format/urls' -import { LinkButton } from 'wallet/src/components/buttons/LinkButton' +import { DappHeaderIcon } from 'wallet/src/components/dappRequests/DappHeaderIcon' +import { DappRequestHeader } from 'wallet/src/components/dappRequests/DappRequestHeader' export interface PermitInfo { currencyId: string @@ -21,26 +18,11 @@ export function ClientDetails({ permitInfo?: PermitInfo }): JSX.Element { const { dappRequestInfo } = request - const colors = useSporeColors() - const permitCurrencyInfo = useCurrencyInfo(permitInfo?.currencyId) - - return ( - - - - - + const headerIcon = + const title = ( + ) + + return } diff --git a/apps/mobile/src/components/Requests/RequestModal/HeaderText.tsx b/apps/mobile/src/components/Requests/RequestModal/HeaderText.tsx index 3a03d374293..5fe9b474ce5 100644 --- a/apps/mobile/src/components/Requests/RequestModal/HeaderText.tsx +++ b/apps/mobile/src/components/Requests/RequestModal/HeaderText.tsx @@ -26,7 +26,7 @@ export function HeaderText({ })?.toExact() return readablePermitAmount ? ( - + }} @@ -39,7 +39,7 @@ export function HeaderText({ /> ) : ( - + }} @@ -70,9 +70,5 @@ export function HeaderText({ return } - return ( - - {getReadableMethodName(method, dappRequestInfo.name || dappRequestInfo.url)} - - ) + return {getReadableMethodName(method, dappRequestInfo.name || dappRequestInfo.url)} } diff --git a/apps/mobile/src/components/Requests/RequestModal/RequestDetails.tsx b/apps/mobile/src/components/Requests/RequestModal/RequestDetails.tsx index de2feb1b953..46767665dce 100644 --- a/apps/mobile/src/components/Requests/RequestModal/RequestDetails.tsx +++ b/apps/mobile/src/components/Requests/RequestModal/RequestDetails.tsx @@ -6,6 +6,7 @@ import { ScrollView } from 'react-native-gesture-handler' import { PermitInfo } from 'src/components/Requests/RequestModal/ClientDetails' import { isBatchedTransactionRequest, + isPersonalSignRequest, isTransactionRequest, SignRequest, WalletConnectSigningRequest, @@ -44,7 +45,7 @@ const requestMessageStyle: StyleProp = { } const getStrMessage = (request: WalletConnectSigningRequest): string => { - if (request.type === EthMethod.PersonalSign || request.type === EthMethod.EthSign) { + if (isPersonalSignRequest(request)) { return request.message || request.rawMessage } diff --git a/apps/mobile/src/components/Requests/RequestModal/WalletConnectRequestModal.tsx b/apps/mobile/src/components/Requests/RequestModal/WalletConnectRequestModal.tsx index 768181e6026..a4e7f666d49 100644 --- a/apps/mobile/src/components/Requests/RequestModal/WalletConnectRequestModal.tsx +++ b/apps/mobile/src/components/Requests/RequestModal/WalletConnectRequestModal.tsx @@ -2,7 +2,7 @@ import { useNetInfo } from '@react-native-community/netinfo' import { FeatureFlags, useFeatureFlag } from '@universe/gating' import { getSdkError } from '@walletconnect/utils' import { providers } from 'ethers' -import React, { useMemo, useRef } from 'react' +import React, { useMemo, useRef, useState } from 'react' import { useTranslation } from 'react-i18next' import { useDispatch, useSelector } from 'react-redux' import { ModalWithOverlay } from 'src/components/Requests/ModalWithOverlay/ModalWithOverlay' @@ -28,18 +28,20 @@ import { } from 'src/features/walletConnect/walletConnectSlice' import { spacing } from 'ui/src/theme' import { EthMethod } from 'uniswap/src/features/dappRequests/types' -import { isSignTypedDataRequest } from 'uniswap/src/features/dappRequests/utils' +import { isSelfCallWithData, isSignTypedDataRequest } from 'uniswap/src/features/dappRequests/utils' import { useTransactionGasFee } from 'uniswap/src/features/gas/hooks' import { Platform } from 'uniswap/src/features/platforms/types/Platform' import { useHasAccountMismatchCallback } from 'uniswap/src/features/smartWallet/mismatch/hooks' import { MobileEventName, ModalName } from 'uniswap/src/features/telemetry/constants' import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send' -import { useIsBlocked } from 'uniswap/src/features/trm/hooks' import { DappRequestType, UwULinkMethod, WCEventType, WCRequestOutcome } from 'uniswap/src/types/walletConnect' import { areAddressesEqual } from 'uniswap/src/utils/addresses' +import { useBooleanState } from 'utilities/src/react/useBooleanState' +import { TransactionRiskLevel } from 'wallet/src/features/dappRequests/types' +import { shouldDisableConfirm } from 'wallet/src/features/dappRequests/utils/riskUtils' import { formatExternalTxnWithGasEstimates } from 'wallet/src/features/gas/formatExternalTxnWithGasEstimates' -import { useIsBlockedActiveAddress } from 'wallet/src/features/trm/hooks' -import { useSignerAccounts } from 'wallet/src/features/wallet/hooks' +import { useLiveAccountDelegationDetails } from 'wallet/src/features/smartWallet/hooks/useLiveAccountDelegationDetails' +import { useHasSmartWalletConsent, useSignerAccounts } from 'wallet/src/features/wallet/hooks' interface Props { onClose: () => void @@ -61,8 +63,14 @@ export function WalletConnectRequestModal({ onClose, request }: Props): JSX.Elem const netInfo = useNetInfo() const didOpenFromDeepLink = useSelector(selectDidOpenFromDeepLink) const chainId = request.chainId + // Initialize with null to indicate scan hasn't completed yet + const [riskLevel, setRiskLevel] = useState(null) + const { value: confirmedRisk, setValue: setConfirmedRisk } = useBooleanState(false) const enablePermitMismatchUx = useFeatureFlag(FeatureFlags.EnablePermitMismatchUX) + const enableEip5792Methods = useFeatureFlag(FeatureFlags.Eip5792Methods) + const hasSmartWalletConsent = useHasSmartWalletConsent() + const blockaidTransactionScanning = useFeatureFlag(FeatureFlags.BlockaidTransactionScanning) const tx: providers.TransactionRequest | undefined = useMemo(() => { if (isTransactionRequest(request)) { @@ -82,7 +90,33 @@ export function WalletConnectRequestModal({ onClose, request }: Props): JSX.Elem addressInput2: { address: request.account, platform: Platform.EVM }, }), ) - const gasFee = useTransactionGasFee({ tx }) + const delegationData = useLiveAccountDelegationDetails({ + address: request.account, + chainId, + }) + // Check if this is a self-transaction (to === from) with data + // This is required for delegation to occur + // Note: chainId is required for correct address comparison + const isSelfTransaction = useMemo( + () => + isSelfCallWithData({ + from: request.account, + to: tx?.to, + data: tx?.data ? String(tx.data) : undefined, + chainId, + }), + [request.account, tx?.to, tx?.data, chainId], + ) + const shouldDelegate = Boolean( + delegationData?.needsDelegation && enableEip5792Methods && hasSmartWalletConsent && isSelfTransaction, + ) + const smartContractDelegationAddress = shouldDelegate + ? delegationData?.contractAddress // latest Uniswap delegation address + : delegationData?.currentDelegationAddress + const gasFee = useTransactionGasFee({ + tx, + ...(smartContractDelegationAddress && { smartContractDelegationAddress }), + }) const hasSufficientFunds = useHasSufficientFunds({ account: request.account, @@ -91,12 +125,6 @@ export function WalletConnectRequestModal({ onClose, request }: Props): JSX.Elem value: tx?.value?.toString(), }) - const { isBlocked: isSenderBlocked, isBlockedLoading: isSenderBlockedLoading } = useIsBlockedActiveAddress() - const { isBlocked: isRecipientBlocked, isBlockedLoading: isRecipientBlockedLoading } = useIsBlocked(tx?.to) - - const isBlocked = isSenderBlocked || isRecipientBlocked - const isBlockedLoading = isSenderBlockedLoading || isRecipientBlockedLoading - const getHasMismatch = useHasAccountMismatchCallback() const hasMismatch = getHasMismatch(chainId) // When link mode is active we can sign messages through universal links on device @@ -111,8 +139,11 @@ export function WalletConnectRequestModal({ onClose, request }: Props): JSX.Elem return false } - if (isBlocked || isBlockedLoading) { - return false + // If Blockaid scanning is enabled, disable confirm based on risk level and confirmation state + if (blockaidTransactionScanning) { + if (shouldDisableConfirm({ riskLevel, confirmedRisk })) { + return false + } } if (getDoesMethodCostGas(request)) { @@ -281,7 +312,7 @@ export function WalletConnectRequestModal({ onClose, request }: Props): JSX.Elem ) diff --git a/apps/mobile/src/components/Requests/RequestModal/WalletConnectRequestModalContent.tsx b/apps/mobile/src/components/Requests/RequestModal/WalletConnectRequestModalContent.tsx index 86c391031a3..593d0dc401a 100644 --- a/apps/mobile/src/components/Requests/RequestModal/WalletConnectRequestModalContent.tsx +++ b/apps/mobile/src/components/Requests/RequestModal/WalletConnectRequestModalContent.tsx @@ -1,5 +1,6 @@ import { useBottomSheetInternal } from '@gorhom/bottom-sheet' import { useNetInfo } from '@react-native-community/netinfo' +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import { useTranslation } from 'react-i18next' import Animated, { useAnimatedStyle } from 'react-native-reanimated' import { ClientDetails, PermitInfo } from 'src/components/Requests/RequestModal/ClientDetails' @@ -12,15 +13,19 @@ import { import { Flex, Text } from 'ui/src' import { AlertTriangleFilled } from 'ui/src/components/icons' import { BaseCard } from 'uniswap/src/components/BaseCard/BaseCard' -import { nativeOnChain } from 'uniswap/src/constants/tokens' +import { getChainInfo } from 'uniswap/src/features/chains/chainInfo' import { EthMethod } from 'uniswap/src/features/dappRequests/types' import { GasFeeResult } from 'uniswap/src/features/gas/types' -import { BlockedAddressWarning } from 'uniswap/src/features/transactions/modals/BlockedAddressWarning' -import { isPrimaryTypePermit } from 'uniswap/src/types/walletConnect' +import { isPrimaryTypePermit, UwULinkMethod } from 'uniswap/src/types/walletConnect' import { buildCurrencyId } from 'uniswap/src/utils/currencyId' import { logger } from 'utilities/src/logger/logger' import { MAX_HIDDEN_CALLS_BY_DEFAULT } from 'wallet/src/components/BatchedTransactions/BatchedTransactionDetails' +import { DappPersonalSignContent } from 'wallet/src/components/dappRequests/DappPersonalSignContent' +import { DappSendCallsScanningContent } from 'wallet/src/components/dappRequests/DappSendCallsScanningContent' +import { DappSignTypedDataContent } from 'wallet/src/components/dappRequests/DappSignTypedDataContent' +import { DappTransactionScanningContent } from 'wallet/src/components/dappRequests/DappTransactionScanningContent' import { WarningBox } from 'wallet/src/components/WarningBox/WarningBox' +import { TransactionRiskLevel } from 'wallet/src/features/dappRequests/types' import { AddressFooter } from 'wallet/src/features/transactions/TransactionRequest/AddressFooter' import { NetworkFeeFooter } from 'wallet/src/features/transactions/TransactionRequest/NetworkFeeFooter' @@ -58,21 +63,27 @@ type WalletConnectRequestModalContentProps = { gasFee: GasFeeResult hasSufficientFunds: boolean request: WalletConnectSigningRequest - isBlocked: boolean + showSmartWalletActivation?: boolean + confirmedRisk: boolean + onConfirmRisk: (confirmed: boolean) => void + onRiskLevelChange: (riskLevel: TransactionRiskLevel) => void } export function WalletConnectRequestModalContent({ request, hasSufficientFunds, - isBlocked, gasFee, + showSmartWalletActivation, + confirmedRisk, + onConfirmRisk, + onRiskLevelChange, }: WalletConnectRequestModalContentProps): JSX.Element { const chainId = request.chainId const permitInfo = getPermitInfo(request) - const nativeCurrency = nativeOnChain(chainId) + const nativeCurrency = getChainInfo(chainId).nativeCurrency - const { t } = useTranslation() const { animatedFooterHeight } = useBottomSheetInternal() + const blockaidTransactionScanning = useFeatureFlag(FeatureFlags.BlockaidTransactionScanning) const netInfo = useNetInfo() @@ -87,56 +98,111 @@ export function WalletConnectRequestModalContent({ return ( <> - + - - - - - - - {!hasSufficientFunds && ( - - - {t('walletConnect.request.error.insufficientFunds', { - currencySymbol: nativeCurrency.symbol ?? '', - })} - + {/* Show Blockaid scanning UI for supported request types */} + {blockaidTransactionScanning ? ( + <> + + + + - )} - - {!netInfo.isInternetReachable && !suppressOfflineWarning ? ( - } - textColor="$statusWarning" - title={t('walletConnect.request.error.network')} - /> - ) : ( - - )} - - + + + ) : ( + <> + {/* Fallback to original UI for non-scanning requests */} + + + + + + + + + + + + )} + + ) +} + +function RequestWarnings({ + request, + hasSufficientFunds, + isNetworkReachable, + suppressOfflineWarning, + nativeCurrencySymbol, +}: { + request: WalletConnectSigningRequest + hasSufficientFunds: boolean + isNetworkReachable: boolean + suppressOfflineWarning: boolean + nativeCurrencySymbol: string +}): JSX.Element { + const { t } = useTranslation() + + return ( + <> + {!hasSufficientFunds && ( + + + {t('walletConnect.request.error.insufficientFunds', { + currencySymbol: nativeCurrencySymbol, + })} + + + )} + + {!isNetworkReachable && !suppressOfflineWarning ? ( + } + textColor="$statusWarning" + title={t('walletConnect.request.error.network')} + /> + ) : ( + + )} ) } @@ -144,22 +210,16 @@ export function WalletConnectRequestModalContent({ function WarningSection({ request, showUnsafeWarning, - isBlockedAddress, }: { request: WalletConnectSigningRequest showUnsafeWarning: boolean - isBlockedAddress: boolean }): JSX.Element | null { const { t } = useTranslation() - if (!showUnsafeWarning && !isBlockedAddress) { + if (!showUnsafeWarning) { return null } - if (isBlockedAddress) { - return - } - if (isBatchedTransactionRequest(request)) { if (request.calls.length <= 1) { return null @@ -175,3 +235,97 @@ function WarningSection({ return null } + +/** Helper component to render appropriate scanning content based on request type */ +function ScanningContent({ + request, + chainId, + gasFee, + showSmartWalletActivation, + confirmedRisk, + onConfirmRisk, + onRiskLevelChange, +}: { + request: WalletConnectSigningRequest + chainId: number + gasFee: GasFeeResult + showSmartWalletActivation?: boolean + confirmedRisk: boolean + onConfirmRisk: (confirmed: boolean) => void + onRiskLevelChange: (riskLevel: TransactionRiskLevel) => void +}): JSX.Element { + switch (request.type) { + case EthMethod.EthSendTransaction: + case UwULinkMethod.Erc20Send: + return ( + + ) + + case EthMethod.PersonalSign: + case EthMethod.EthSign: + return ( + + ) + + case EthMethod.WalletSendCalls: + return ( + + ) + + case EthMethod.SignTypedData: + case EthMethod.SignTypedDataV4: + return ( + + ) + } +} diff --git a/apps/mobile/src/components/Requests/ScanSheet/PendingConnectionModal.tsx b/apps/mobile/src/components/Requests/ScanSheet/PendingConnectionModal.tsx index ba8b4b13594..6f64a0317be 100644 --- a/apps/mobile/src/components/Requests/ScanSheet/PendingConnectionModal.tsx +++ b/apps/mobile/src/components/Requests/ScanSheet/PendingConnectionModal.tsx @@ -1,15 +1,13 @@ import { useBottomSheetInternal } from '@gorhom/bottom-sheet' +import { FeatureFlags, useFeatureFlag } from '@universe/gating' import { getSdkError } from '@walletconnect/utils' import React, { useMemo, useState } from 'react' import { useTranslation } from 'react-i18next' import Animated, { useAnimatedStyle } from 'react-native-reanimated' import { useDispatch, useSelector } from 'react-redux' -import { DappHeaderIcon } from 'src/components/Requests/DappHeaderIcon' import { ModalWithOverlay, ModalWithOverlayProps } from 'src/components/Requests/ModalWithOverlay/ModalWithOverlay' -import { AccountSelectPopover } from 'src/components/Requests/ScanSheet/AccountSelectPopover' -import { SitePermissions } from 'src/components/Requests/ScanSheet/SitePermissions' import { selectDidOpenFromDeepLink } from 'src/features/walletConnect/selectors' -import { getSessionNamespaces } from 'src/features/walletConnect/utils' +import { convertCapabilitiesToScopedProperties, getSessionNamespaces } from 'src/features/walletConnect/utils' import { returnToPreviousApp } from 'src/features/walletConnect/WalletConnect' import { wcWeb3Wallet } from 'src/features/walletConnect/walletConnectClient' import { @@ -17,21 +15,28 @@ import { removePendingSession, setDidOpenFromDeepLink, WalletConnectPendingSession, - WalletConnectVerifyStatus, } from 'src/features/walletConnect/walletConnectSlice' -import { Flex, Text, useSporeColors } from 'ui/src' -import { Verified } from 'ui/src/components/icons' +import { Flex } from 'ui/src' import { AccountType } from 'uniswap/src/features/accounts/types' import { pushNotification } from 'uniswap/src/features/notifications/slice/slice' import { AppNotificationType } from 'uniswap/src/features/notifications/slice/types' import { MobileEventName, ModalName } from 'uniswap/src/features/telemetry/constants' import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send' import { DappRequestType, WalletConnectEvent, WCEventType, WCRequestOutcome } from 'uniswap/src/types/walletConnect' -import { formatDappURL } from 'utilities/src/format/urls' import { useEvent } from 'utilities/src/react/hooks' import { ONE_SECOND_MS } from 'utilities/src/time/time' -import { LinkButton } from 'wallet/src/components/buttons/LinkButton' -import { useActiveAccountWithThrow, useSignerAccounts } from 'wallet/src/features/wallet/hooks' +import { DappConnectionContent } from 'wallet/src/components/dappRequests/DappConnectionContent' +import { DappRequestHeader } from 'wallet/src/components/dappRequests/DappRequestHeader' +import { getCapabilitiesCore } from 'wallet/src/features/batchedTransactions/utils' +import { useBlockaidVerification } from 'wallet/src/features/dappRequests/hooks/useBlockaidVerification' +import { useDappConnectionConfirmation } from 'wallet/src/features/dappRequests/hooks/useDappConnectionConfirmation' +import { DappConnectionInfo, DappVerificationStatus } from 'wallet/src/features/dappRequests/types' +import { mergeVerificationStatuses } from 'wallet/src/features/dappRequests/verification' +import { + useActiveAccountWithThrow, + useHasSmartWalletConsent, + useSignerAccounts, +} from 'wallet/src/features/wallet/hooks' type Props = { pendingSession: WalletConnectPendingSession @@ -47,12 +52,20 @@ export const PendingConnectionModal = ({ pendingSession, onClose }: Props): JSX. const isViewOnly = activeAccount.type === AccountType.Readonly const didOpenFromDeepLink = useSelector(selectDidOpenFromDeepLink) + const hasSmartWalletConsent = useHasSmartWalletConsent() + const eip5792MethodsEnabled = useFeatureFlag(FeatureFlags.Eip5792Methods) - const [confirmedWarning, setConfirmedWarning] = useState(false) const [isConnecting, setIsConnecting] = useState(false) - const isThreat = pendingSession.verifyStatus === WalletConnectVerifyStatus.Threat - const disableConfirm = (isThreat && !confirmedWarning) || isViewOnly || isConnecting + // Merge WalletConnect verification with Blockaid verification + const { verificationStatus: blockaidStatus } = useBlockaidVerification(pendingSession.dappRequestInfo.url) + const finalVerificationStatus = mergeVerificationStatuses(pendingSession.verifyStatus, blockaidStatus) + + const { confirmedWarning, setConfirmedWarning, disableConfirm } = useDappConnectionConfirmation({ + verificationStatus: finalVerificationStatus, + isViewOnly, + isLoading: isConnecting, + }) const signerAccounts = useSignerAccounts() const defaultSelectedAccountAddresses = useMemo(() => { @@ -103,10 +116,18 @@ export const PendingConnectionModal = ({ pendingSession, onClose }: Props): JSX. // Handle WC 2.0 session request if (approved) { const namespaces = getSessionNamespaces(orderedSelectedAccountAddresses, pendingSession.proposalNamespaces) + const capabilities = await getCapabilitiesCore({ + address: activeAddress, + chainIds: pendingSession.chains, + hasSmartWalletConsent: hasSmartWalletConsent ?? false, + }) + + const scopedProperties = convertCapabilitiesToScopedProperties(capabilities) const session = await wcWeb3Wallet.approveSession({ id: Number(pendingSession.id), namespaces, + ...(eip5792MethodsEnabled ? { scopedProperties } : {}), }) dispatch( @@ -122,6 +143,7 @@ export const PendingConnectionModal = ({ pendingSession, onClose }: Props): JSX. chains: pendingSession.chains, namespaces, activeAccount: activeAddress, + ...(eip5792MethodsEnabled ? { capabilities } : {}), }, }), ) @@ -156,8 +178,7 @@ export const PendingConnectionModal = ({ pendingSession, onClose }: Props): JSX. } }) - const dappName = pendingSession.dappRequestInfo.name || pendingSession.dappRequestInfo.url || '' - + const isThreat = finalVerificationStatus === DappVerificationStatus.Threat const isThreatProps: Partial = isThreat ? { cancelButtonText: t('walletConnect.pending.button.reject'), @@ -188,9 +209,8 @@ export const PendingConnectionModal = ({ pendingSession, onClose }: Props): JSX. > void - dappName: string pendingSession: WalletConnectPendingSession - verifyStatus: WalletConnectVerifyStatus + verifyStatus: DappVerificationStatus isViewOnly: boolean onConfirmWarning: (confirmed: boolean) => void confirmedWarning: boolean @@ -218,7 +237,6 @@ function PendingConnectionModalContent({ allAccountAddresses, selectedAccountAddresses, setSelectedAccountAddresses, - dappName, pendingSession, verifyStatus, isViewOnly, @@ -226,73 +244,37 @@ function PendingConnectionModalContent({ confirmedWarning, }: PendingConnectionModalContentProps): JSX.Element { const { t } = useTranslation() - const colors = useSporeColors() - const { animatedFooterHeight } = useBottomSheetInternal() const bottomSpacerStyle = useAnimatedStyle(() => ({ height: animatedFooterHeight.value, })) + const dappInfo: DappConnectionInfo = { + name: pendingSession.dappRequestInfo.name, + url: pendingSession.dappRequestInfo.url, + icon: pendingSession.dappRequestInfo.icon, + } + return ( <> - - - - {t('walletConnect.pending.title', { - dappName, - })} - - - - {verifyStatus === WalletConnectVerifyStatus.Verified && ( - - )} - + + - } onConfirmWarning={onConfirmWarning} /> - {!isViewOnly && ( - - - - )} - {isViewOnly && ( - - - {t('home.warning.viewOnly')} - - - )} - ) } diff --git a/apps/mobile/src/components/Requests/Uwulink/utils.ts b/apps/mobile/src/components/Requests/Uwulink/utils.ts index 5fede7fe5ea..f1d138acde1 100644 --- a/apps/mobile/src/components/Requests/Uwulink/utils.ts +++ b/apps/mobile/src/components/Requests/Uwulink/utils.ts @@ -147,6 +147,7 @@ export async function getFormattedUwuLinkTxnRequest({ dappRequestInfo: { name: '', url: '', + icon: null, ...request.dapp, requestType: DappRequestType.UwULink, chain_id: request.chainId, diff --git a/apps/mobile/src/components/RestoreWalletModal/__snapshots__/PrivateKeySpeedBumpModal.test.tsx.snap b/apps/mobile/src/components/RestoreWalletModal/__snapshots__/PrivateKeySpeedBumpModal.test.tsx.snap index 031dd009b31..a7a02717069 100644 --- a/apps/mobile/src/components/RestoreWalletModal/__snapshots__/PrivateKeySpeedBumpModal.test.tsx.snap +++ b/apps/mobile/src/components/RestoreWalletModal/__snapshots__/PrivateKeySpeedBumpModal.test.tsx.snap @@ -3,15 +3,7 @@ exports[`PrivateKeySpeedBumpModal renders correctly 1`] = ` @@ -509,16 +544,9 @@ exports[`PrivateKeySpeedBumpModal renders correctly 1`] = ` line-height-disabled="false" maxFontSizeMultiplier={1.2} numberOfLines={1} - onBlur={[Function]} - onFocus={[Function]} style={ { - "color": { - "dynamic": { - "dark": "#FFFFFF", - "light": "#FFFFFF", - }, - }, + "color": "#FFFFFF", "fontFamily": "Basel Grotesk", "fontSize": 17, "fontWeight": "500", diff --git a/apps/mobile/src/components/Settings/EditWalletModal/EditLabelSettingsModal.tsx b/apps/mobile/src/components/Settings/EditWalletModal/EditLabelSettingsModal.tsx index 67233dc41e3..4aff5cbda2b 100644 --- a/apps/mobile/src/components/Settings/EditWalletModal/EditLabelSettingsModal.tsx +++ b/apps/mobile/src/components/Settings/EditWalletModal/EditLabelSettingsModal.tsx @@ -105,9 +105,7 @@ export function EditLabelSettingsModal({ py="$spacing12" returnKeyType="done" value={nickname} - placeholder={ - sanitizeAddressText(shortenAddress({ address, chars: 6 })) ?? t('settings.setting.wallet.label') - } + placeholder={sanitizeAddressText(shortenAddress({ address })) ?? t('settings.setting.wallet.label')} onBlur={onFinishEditing} onChangeText={setNickname} onSubmitEditing={onFinishEditing} diff --git a/apps/mobile/src/components/TokenBalanceList/TokenBalanceList.tsx b/apps/mobile/src/components/TokenBalanceList/TokenBalanceList.tsx index bc6d6057e9c..7b350cdee9d 100644 --- a/apps/mobile/src/components/TokenBalanceList/TokenBalanceList.tsx +++ b/apps/mobile/src/components/TokenBalanceList/TokenBalanceList.tsx @@ -279,6 +279,13 @@ const TokenBalanceItemRow = memo(function TokenBalanceItemRow({ item }: { item: + navigate(ModalName.ReportTokenIssue, { + currency: portfolioBalance.currencyInfo.currency, + isMarkedSpam: portfolioBalance.currencyInfo.isSpam, + source: 'portfolio', + }) + } onPressToken={handlePressToken} > {tokenBalanceItem} diff --git a/apps/mobile/src/components/TokenDetails/TokenDetailsActionButtons.tsx b/apps/mobile/src/components/TokenDetails/TokenDetailsActionButtons.tsx index fb6b9f9ea56..75e72429278 100644 --- a/apps/mobile/src/components/TokenDetails/TokenDetailsActionButtons.tsx +++ b/apps/mobile/src/components/TokenDetails/TokenDetailsActionButtons.tsx @@ -10,6 +10,7 @@ import { TokenList } from 'uniswap/src/features/dataApi/types' import { ElementName, MobileEventName, SectionName } from 'uniswap/src/features/telemetry/constants' import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send' import Trace from 'uniswap/src/features/telemetry/Trace' +import { useShouldShowAztecWarning } from 'uniswap/src/hooks/useShouldShowAztecWarning' import { TestID, TestIDType } from 'uniswap/src/test/fixtures/testIDs' import { useBooleanState } from 'utilities/src/react/useBooleanState' @@ -66,10 +67,13 @@ export function TokenDetailsActionButtons({ }): JSX.Element { const { currencyInfo, isChainEnabled, tokenColor } = useTokenDetailsContext() const { value: actionMenuOpen, setFalse: closeActionMenu, toggle: toggleActionMenu } = useBooleanState(false) + const showAztecWarning = useShouldShowAztecWarning( + currencyInfo?.currency.isToken ? currencyInfo.currency.address : '', + ) const isBlocked = currencyInfo?.safetyInfo?.tokenList === TokenList.Blocked - const disabled = isBlocked || !isChainEnabled + const disabled = isBlocked || showAztecWarning || !isChainEnabled const validTokenColor = validColor(tokenColor) const lightTokenColor = validTokenColor ? opacify(12, validTokenColor) : undefined diff --git a/apps/mobile/src/components/TokenDetails/TokenDetailsContext.tsx b/apps/mobile/src/components/TokenDetails/TokenDetailsContext.tsx index 9f6d231631a..194ccaf059f 100644 --- a/apps/mobile/src/components/TokenDetails/TokenDetailsContext.tsx +++ b/apps/mobile/src/components/TokenDetails/TokenDetailsContext.tsx @@ -14,6 +14,7 @@ import { CurrencyField } from 'uniswap/src/types/currency' import { MobileScreens } from 'uniswap/src/types/screens/mobile' import { setClipboard } from 'uniswap/src/utils/clipboard' import { currencyIdToAddress, currencyIdToChain } from 'uniswap/src/utils/currencyId' +import { useBooleanState } from 'utilities/src/react/useBooleanState' type TokenDetailsContextState = { currencyId: string @@ -32,6 +33,9 @@ type TokenDetailsContextState = { isContractAddressExplainerModalOpen: boolean openContractAddressExplainerModal: () => void closeContractAddressExplainerModal: (markViewed: boolean) => void + isAztecWarningModalOpen: boolean + openAztecWarningModal: () => void + closeAztecWarningModal: () => void copyAddressToClipboard: (address: string) => Promise error: unknown | undefined setError: (error: unknown | undefined) => void @@ -64,6 +68,12 @@ export function TokenDetailsContextProvider({ [dispatch], ) + const { + value: isAztecWarningModalOpen, + setTrue: openAztecWarningModal, + setFalse: closeAztecWarningModal, + } = useBooleanState(false) + const copyAddressToClipboard = useCallback( async (address: string): Promise => { await setClipboard(address) @@ -113,6 +123,9 @@ export function TokenDetailsContextProvider({ isContractAddressExplainerModalOpen, openContractAddressExplainerModal, closeContractAddressExplainerModal, + isAztecWarningModalOpen, + openAztecWarningModal, + closeAztecWarningModal, copyAddressToClipboard, error, setError, @@ -121,13 +134,16 @@ export function TokenDetailsContextProvider({ activeTransactionType, closeTokenWarningModal, closeContractAddressExplainerModal, + closeAztecWarningModal, currencyId, currencyInfo, enabledChains, error, + isAztecWarningModalOpen, isContractAddressExplainerModalOpen, isTokenWarningModalOpen, navigation, + openAztecWarningModal, openContractAddressExplainerModal, openTokenWarningModal, tokenColor, diff --git a/apps/mobile/src/components/TokenDetails/TokenDetailsLinks.tsx b/apps/mobile/src/components/TokenDetails/TokenDetailsLinks.tsx index bc5f3c6e691..ac629a8be05 100644 --- a/apps/mobile/src/components/TokenDetails/TokenDetailsLinks.tsx +++ b/apps/mobile/src/components/TokenDetails/TokenDetailsLinks.tsx @@ -1,11 +1,11 @@ import { useMemo } from 'react' import { useTranslation } from 'react-i18next' import { FlatList } from 'react-native-gesture-handler' -import { getBlockExplorerIcon } from 'src/components/icons/BlockExplorerIcon' import { LinkButton, type LinkButtonProps, LinkButtonType } from 'src/components/TokenDetails/LinkButton' import { useTokenDetailsContext } from 'src/components/TokenDetails/TokenDetailsContext' import { Flex, Text } from 'ui/src' import { GlobeFilled, XTwitter } from 'ui/src/components/icons' +import { getBlockExplorerIcon } from 'uniswap/src/components/chains/BlockExplorerIcon' import { useTokenProjectUrlsPartsFragment } from 'uniswap/src/data/graphql/uniswap-data-api/fragments' import { getChainInfo } from 'uniswap/src/features/chains/chainInfo' import { chainIdToPlatform } from 'uniswap/src/features/platforms/utils/chains' diff --git a/apps/mobile/src/components/TokenDetails/TokenDetailsStats.tsx b/apps/mobile/src/components/TokenDetails/TokenDetailsStats.tsx index be50bcd450a..5f0ccd4bbec 100644 --- a/apps/mobile/src/components/TokenDetails/TokenDetailsStats.tsx +++ b/apps/mobile/src/components/TokenDetails/TokenDetailsStats.tsx @@ -10,9 +10,8 @@ import { DEP_accentColors, validColor } from 'ui/src/theme' import { useTokenBasicInfoPartsFragment, useTokenBasicProjectPartsFragment, - useTokenMarketPartsFragment, - useTokenProjectMarketsPartsFragment, } from 'uniswap/src/data/graphql/uniswap-data-api/fragments' +import { useTokenMarketStats } from 'uniswap/src/features/dataApi/tokenDetails/useTokenDetailsData' import { currencyIdToContractInput } from 'uniswap/src/features/dataApi/utils/currencyIdToContractInput' import { Language } from 'uniswap/src/features/language/constants' import { useCurrentLanguage, useCurrentLanguageInfo } from 'uniswap/src/features/language/hooks' @@ -52,21 +51,8 @@ const TokenDetailsMarketData = memo(function _TokenDetailsMarketData(): JSX.Elem const { currencyId, tokenColor } = useTokenDetailsContext() - const tokenMarket = useTokenMarketPartsFragment({ currencyId }).data.market - const projectMarkets = useTokenProjectMarketsPartsFragment({ currencyId }).data.project?.markets - - const price = projectMarkets?.[0]?.price?.value || tokenMarket?.price?.value || undefined - const marketCap = projectMarkets?.[0]?.marketCap?.value - const volume = tokenMarket?.volume?.value - const rawPriceHigh52W = projectMarkets?.[0]?.priceHigh52W?.value || tokenMarket?.priceHigh52W?.value || undefined - const rawPriceLow52W = projectMarkets?.[0]?.priceLow52W?.value || tokenMarket?.priceLow52W?.value || undefined - - // Use current price for 52w high/low if it exceeds the bounds - const priceHight52W = - price !== undefined && rawPriceHigh52W !== undefined ? Math.max(price, rawPriceHigh52W) : rawPriceHigh52W - const priceLow52W = - price !== undefined && rawPriceLow52W !== undefined ? Math.min(price, rawPriceLow52W) : rawPriceLow52W - const fullyDilutedValuation = projectMarkets?.[0]?.fullyDilutedValuation?.value + // Use shared hook for unified data fetching (CoinGecko-first strategy) + const { marketCap, fdv, volume, high52w, low52w } = useTokenMarketStats(currencyId) return ( @@ -84,7 +70,7 @@ const TokenDetailsMarketData = memo(function _TokenDetailsMarketData(): JSX.Elem statsIcon={} > - {convertFiatAmountFormatted(fullyDilutedValuation, NumberType.FiatTokenStats)} + {convertFiatAmountFormatted(fdv, NumberType.FiatTokenStats)} @@ -102,7 +88,7 @@ const TokenDetailsMarketData = memo(function _TokenDetailsMarketData(): JSX.Elem statsIcon={} > - {convertFiatAmountFormatted(priceHight52W, NumberType.FiatTokenDetails)} + {convertFiatAmountFormatted(high52w, NumberType.FiatTokenDetails)} @@ -111,7 +97,7 @@ const TokenDetailsMarketData = memo(function _TokenDetailsMarketData(): JSX.Elem statsIcon={} > - {convertFiatAmountFormatted(priceLow52W, NumberType.FiatTokenDetails)} + {convertFiatAmountFormatted(low52w, NumberType.FiatTokenDetails)} diff --git a/apps/mobile/src/components/TokenSelector/TokenFiatOnRampList.tsx b/apps/mobile/src/components/TokenSelector/TokenFiatOnRampList.tsx index adaca05b633..6563707edd9 100644 --- a/apps/mobile/src/components/TokenSelector/TokenFiatOnRampList.tsx +++ b/apps/mobile/src/components/TokenSelector/TokenFiatOnRampList.tsx @@ -10,7 +10,8 @@ import { PortfolioBalance } from 'uniswap/src/features/dataApi/types' import { FiatOnRampCurrency, FORCurrencyOrBalance } from 'uniswap/src/features/fiatOnRamp/types' import { getUnsupportedFORTokensWithBalance, isSupportedFORCurrency } from 'uniswap/src/features/fiatOnRamp/utils' import { useLocalizationContext } from 'uniswap/src/features/language/LocalizationContext' -import { useDismissedTokenWarnings } from 'uniswap/src/features/tokens/slice/hooks' +import { getTokenProtectionWarning } from 'uniswap/src/features/tokens/warnings/safetyUtils' +import { useDismissedTokenWarnings } from 'uniswap/src/features/tokens/warnings/slice/hooks' import { ListSeparatorToggle } from 'uniswap/src/features/transactions/TransactionDetails/ListSeparatorToggle' import { CurrencyId } from 'uniswap/src/types/currency' import { NumberType } from 'utilities/src/format/types' @@ -51,7 +52,8 @@ function TokenOptionItemWrapper({ [currencyInfo, balanceUSD, quantity, isUnsupported], ) const onPress = useCallback(() => onSelectCurrency(currency), [currency, onSelectCurrency]) - const { tokenWarningDismissed } = useDismissedTokenWarnings(currencyInfo?.currency) + const tokenProtectionWarning = getTokenProtectionWarning(currencyInfo) + const { tokenWarningDismissed } = useDismissedTokenWarnings(currencyInfo?.currency, tokenProtectionWarning) const { convertFiatAmountFormatted, formatNumberOrString } = useLocalizationContext() if (!option) { diff --git a/apps/mobile/src/components/accounts/AccountCardItem.tsx b/apps/mobile/src/components/accounts/AccountCardItem.tsx index 7a0547713e1..9d5cbdc115c 100644 --- a/apps/mobile/src/components/accounts/AccountCardItem.tsx +++ b/apps/mobile/src/components/accounts/AccountCardItem.tsx @@ -3,6 +3,7 @@ import React, { useCallback, useMemo } from 'react' import { useTranslation } from 'react-i18next' import ContextMenu from 'react-native-context-menu-view' import { useDispatch } from 'react-redux' +import { MODAL_OPEN_WAIT_TIME } from 'src/app/navigation/constants' import { navigate } from 'src/app/navigation/rootNavigation' import { NotificationBadge } from 'src/components/notifications/Badge' import { Flex, Text, TouchableArea } from 'ui/src' @@ -24,8 +25,6 @@ import { noop } from 'utilities/src/react/noop' import { useAccountListData } from 'wallet/src/features/accounts/useAccountListData' import { useAccounts } from 'wallet/src/features/wallet/hooks' -const MODAL_CLOSE_WAIT_TIME = 300 - type AccountCardItemProps = { address: Address isViewOnly: boolean @@ -130,7 +129,7 @@ export function AccountCardItem({ navigate(ModalName.ConnectionsDappListModal, { address, }) - }, MODAL_CLOSE_WAIT_TIME) + }, MODAL_OPEN_WAIT_TIME) }, [address, onClose]) const onPressRemoveWallet = useCallback(() => { diff --git a/apps/mobile/src/components/accounts/__snapshots__/AccountCardItem.test.tsx.snap b/apps/mobile/src/components/accounts/__snapshots__/AccountCardItem.test.tsx.snap index 5727f60c85c..15e2ee463fd 100644 --- a/apps/mobile/src/components/accounts/__snapshots__/AccountCardItem.test.tsx.snap +++ b/apps/mobile/src/components/accounts/__snapshots__/AccountCardItem.test.tsx.snap @@ -17,11 +17,38 @@ exports[`AccountCardItem renders correctly 1`] = ` collapsable={false} focusVisibleStyle={{}} forwardedRef={[Function]} + jestAnimatedProps={ + { + "value": {}, + } + } jestAnimatedStyle={ { "value": {}, } } + jestInlineStyle={ + [ + { + "backgroundColor": "transparent", + "borderBottomLeftRadius": 12, + "borderBottomRightRadius": 12, + "borderTopLeftRadius": 12, + "borderTopRightRadius": 12, + "flexDirection": "column", + "opacity": 1, + "paddingBottom": 12, + "paddingLeft": 24, + "paddingRight": 24, + "paddingTop": 8, + "transform": [ + { + "scale": 1, + }, + ], + }, + ] + } onBlur={[Function]} onClick={[Function]} onFocus={[Function]} @@ -34,29 +61,30 @@ exports[`AccountCardItem renders correctly 1`] = ` onStartShouldSetResponder={[Function]} role="button" style={ - { - "backgroundColor": "transparent", - "borderBottomLeftRadius": 12, - "borderBottomRightRadius": 12, - "borderTopLeftRadius": 12, - "borderTopRightRadius": 12, - "flexDirection": "column", - "opacity": 1, - "paddingBottom": 12, - "paddingLeft": 24, - "paddingRight": 24, - "paddingTop": 8, - "transform": [ - { - "scale": 1, - }, - ], - } + [ + { + "backgroundColor": "transparent", + "borderBottomLeftRadius": 12, + "borderBottomRightRadius": 12, + "borderTopLeftRadius": 12, + "borderTopRightRadius": 12, + "flexDirection": "column", + "opacity": 1, + "paddingBottom": 12, + "paddingLeft": 24, + "paddingRight": 24, + "paddingTop": 8, + "transform": [ + { + "scale": 1, + }, + ], + }, + {}, + ] } > diff --git a/apps/mobile/src/components/accounts/__snapshots__/AccountList.test.tsx.snap b/apps/mobile/src/components/accounts/__snapshots__/AccountList.test.tsx.snap index 732b9a75f9f..51ede447887 100644 --- a/apps/mobile/src/components/accounts/__snapshots__/AccountList.test.tsx.snap +++ b/apps/mobile/src/components/accounts/__snapshots__/AccountList.test.tsx.snap @@ -113,8 +113,6 @@ exports[`AccountList renders without error 1`] = ` } > diff --git a/apps/mobile/src/components/education/SeedPhrase.tsx b/apps/mobile/src/components/education/SeedPhrase.tsx index 91ccad3d526..a0d70799b98 100644 --- a/apps/mobile/src/components/education/SeedPhrase.tsx +++ b/apps/mobile/src/components/education/SeedPhrase.tsx @@ -62,25 +62,60 @@ function Page({ text, params }: { text: ReactNode; params: OnboardingStackBasePa ) } -export const SeedPhraseEducationContent = (params: OnboardingStackBaseParams): JSX.Element[] => { - const cloudProviderName = getCloudProviderName() - const highlightComponent = +const highlightComponent = + +const cloudProviderName = getCloudProviderName() - const pageContentList = [ - // biome-ignore-start lint/correctness/useJsxKeyInIterable: Static array items don't need keys - , - , - , - , - , - , - // biome-ignore-end lint/correctness/useJsxKeyInIterable: Static array items don't need keys - ] +const pageContentList = [ + , + , + , + , + , + , + , + , + , +] +export const SeedPhraseEducationContent = (params: OnboardingStackBaseParams): JSX.Element[] => { return pageContentList.map((content, i) => ( {content}} /> )) diff --git a/apps/mobile/src/components/explore/ExploreSections/ExploreSections.tsx b/apps/mobile/src/components/explore/ExploreSections/ExploreSections.tsx index edda8bccac5..5dff1928fec 100644 --- a/apps/mobile/src/components/explore/ExploreSections/ExploreSections.tsx +++ b/apps/mobile/src/components/explore/ExploreSections/ExploreSections.tsx @@ -30,6 +30,7 @@ import { TokenItemData } from 'src/components/explore/TokenItemData' import { getTokenMetadataDisplayType } from 'src/features/explore/utils' import { Flex, Loader, Text } from 'ui/src' import { AnimatedBottomSheetFlashList } from 'ui/src/components/AnimatedFlashList/AnimatedFlashList' +import { NoTokens } from 'ui/src/components/icons' import { spacing } from 'ui/src/theme' import { BaseCard } from 'uniswap/src/components/BaseCard/BaseCard' import { useTokenRankingsQuery } from 'uniswap/src/data/rest/tokenRankings' @@ -154,10 +155,15 @@ function _ExploreSections({ }, [insets.bottom]) const dataWithBottomTabs = useMemo( - () => (showFullScreenLoadingState ? [] : (topTokenItems ?? [])), + () => (showFullScreenLoadingState ? [] : topTokenItems), [showFullScreenLoadingState, topTokenItems], ) + const listEmptyComponent = useMemo( + () => , + [showFullScreenLoadingState], + ) + if (!hasAllData && error) { return ( @@ -176,7 +182,7 @@ function _ExploreSections({ { +): Partial> { if (!tokenRankings) { - return {} as Record + return {} as const } const result: Record = {} @@ -321,14 +327,11 @@ function processTokenRankings( return result } -function useTokenItems( - data: TokenRankingsResponse | undefined, - orderBy: ExploreOrderBy, -): TokenItemDataWithMetadata[] | undefined { +function useTokenItems(data: TokenRankingsResponse | undefined, orderBy: ExploreOrderBy): TokenItemDataWithMetadata[] { // process all the token rankings into a map of orderBy to token items (only do this once) const allTokenItemsByOrderBy = useMemo(() => processTokenRankings(data?.tokenRankings), [data]) - // return the token items for the given orderBy - return useMemo(() => allTokenItemsByOrderBy[orderBy], [allTokenItemsByOrderBy, orderBy]) + // return the token items for the given orderBy, or empty array if the orderBy key doesn't exist + return useMemo(() => allTokenItemsByOrderBy[orderBy] ?? [], [allTokenItemsByOrderBy, orderBy]) } type ListHeaderProps = { @@ -386,11 +389,31 @@ const ListHeaderComponent = ({ ) } -const ListEmptyComponent = (): JSX.Element => ( - - - -) +const TokenListEmptyComponent = memo(function TokenListEmptyComponent({ + isLoading, +}: { + isLoading: boolean +}): JSX.Element { + const { t } = useTranslation() + + if (isLoading) { + return ( + + + + ) + } + + return ( + + } + title={t('explore.tokens.empty.title')} + /> + + ) +}) function useOrderBy(): { uiOrderBy: ExploreOrderBy diff --git a/apps/mobile/src/components/explore/ExploreSections/NetworkPillsRow.tsx b/apps/mobile/src/components/explore/ExploreSections/NetworkPillsRow.tsx index b0383bd3525..425f19a2438 100644 --- a/apps/mobile/src/components/explore/ExploreSections/NetworkPillsRow.tsx +++ b/apps/mobile/src/components/explore/ExploreSections/NetworkPillsRow.tsx @@ -1,3 +1,4 @@ +import { useTheme } from '@react-navigation/core' import { memo, useCallback, useMemo, useRef } from 'react' import { useTranslation } from 'react-i18next' import { ViewStyle } from 'react-native' @@ -58,6 +59,7 @@ const NetworkPillsRow = memo(function NetworkPillsRow({ onSelectNetwork: (chainId: UniverseChainId | null) => void }): JSX.Element { const colors = useSporeColors() + const theme = useTheme() const { chains } = useEnabledChains() const flatListRef = useRef>(null) @@ -68,6 +70,7 @@ const NetworkPillsRow = memo(function NetworkPillsRow({ items: chains, }) + // biome-ignore lint/correctness/useExhaustiveDependencies: need theme dep for foregroundColor to change on theme change const renderItemNetworkPills = useCallback( ({ item }: { item: UniverseChainId }) => { return ( @@ -90,7 +93,7 @@ const NetworkPillsRow = memo(function NetworkPillsRow({ ) }, - [colors.neutral1.val, onSelectNetwork, selectedNetwork], + [colors.neutral1.val, onSelectNetwork, selectedNetwork, theme], ) const ListHeaderComponent = useMemo(() => { diff --git a/apps/mobile/src/components/explore/__snapshots__/FavoriteHeaderRow.test.tsx.snap b/apps/mobile/src/components/explore/__snapshots__/FavoriteHeaderRow.test.tsx.snap index 2217f92f48c..da2b061869e 100644 --- a/apps/mobile/src/components/explore/__snapshots__/FavoriteHeaderRow.test.tsx.snap +++ b/apps/mobile/src/components/explore/__snapshots__/FavoriteHeaderRow.test.tsx.snap @@ -20,12 +20,7 @@ exports[`FavoriteHeaderRow when editing renders without error 1`] = ` maxFontSizeMultiplier={1.4} style={ { - "color": { - "dynamic": { - "dark": "rgba(255, 255, 255, 0.65)", - "light": "rgba(19, 19, 19, 0.63)", - }, - }, + "color": "rgba(19, 19, 19, 0.63)", "fontFamily": "Basel Grotesk", "fontSize": 17, "fontWeight": "400", @@ -41,11 +36,34 @@ exports[`FavoriteHeaderRow when editing renders without error 1`] = ` focusVisibleStyle={{}} forwardedRef={[Function]} hitSlop={16} + jestAnimatedProps={ + { + "value": {}, + } + } jestAnimatedStyle={ { "value": {}, } } + jestInlineStyle={ + [ + { + "backgroundColor": "transparent", + "borderBottomLeftRadius": 12, + "borderBottomRightRadius": 12, + "borderTopLeftRadius": 12, + "borderTopRightRadius": 12, + "flexDirection": "column", + "opacity": 1, + "transform": [ + { + "scale": 1, + }, + ], + }, + ] + } onBlur={[Function]} onClick={[Function]} onFocus={[Function]} @@ -58,35 +76,31 @@ exports[`FavoriteHeaderRow when editing renders without error 1`] = ` onStartShouldSetResponder={[Function]} role="button" style={ - { - "backgroundColor": "transparent", - "borderBottomLeftRadius": 12, - "borderBottomRightRadius": 12, - "borderTopLeftRadius": 12, - "borderTopRightRadius": 12, - "flexDirection": "column", - "opacity": 1, - "transform": [ - { - "scale": 1, - }, - ], - } + [ + { + "backgroundColor": "transparent", + "borderBottomLeftRadius": 12, + "borderBottomRightRadius": 12, + "borderTopLeftRadius": 12, + "borderTopRightRadius": 12, + "flexDirection": "column", + "opacity": 1, + "transform": [ + { + "scale": 1, + }, + ], + }, + {}, + ] } > diff --git a/apps/mobile/src/components/explore/__snapshots__/FavoriteTokenCard.test.tsx.snap b/apps/mobile/src/components/explore/__snapshots__/FavoriteTokenCard.test.tsx.snap index f6d96f05640..41fc51fc1c9 100644 --- a/apps/mobile/src/components/explore/__snapshots__/FavoriteTokenCard.test.tsx.snap +++ b/apps/mobile/src/components/explore/__snapshots__/FavoriteTokenCard.test.tsx.snap @@ -38,11 +38,51 @@ exports[`FavoriteTokenCard renders without error 1`] = ` collapsable={false} focusVisibleStyle={{}} forwardedRef={[Function]} + jestAnimatedProps={ + { + "value": {}, + } + } jestAnimatedStyle={ { "value": {}, } } + jestInlineStyle={ + [ + { + "backgroundColor": "#FFFFFF", + "borderBottomColor": "rgba(19, 19, 19, 0.08)", + "borderBottomLeftRadius": 16, + "borderBottomRightRadius": 16, + "borderBottomWidth": 1, + "borderLeftColor": "rgba(19, 19, 19, 0.08)", + "borderLeftWidth": 1, + "borderRightColor": "rgba(19, 19, 19, 0.08)", + "borderRightWidth": 1, + "borderStyle": "solid", + "borderTopColor": "rgba(19, 19, 19, 0.08)", + "borderTopLeftRadius": 16, + "borderTopRightRadius": 16, + "borderTopWidth": 1, + "flexDirection": "column", + "opacity": 1, + "overflow": "hidden", + "shadowColor": "rgb(0,0,0)", + "shadowOffset": { + "height": 1, + "width": 0, + }, + "shadowOpacity": 0.0196078431372549, + "shadowRadius": 6, + "transform": [ + { + "scale": 1, + }, + ], + }, + ] + } onBlur={[Function]} onClick={[Function]} onFocus={[Function]} @@ -55,43 +95,44 @@ exports[`FavoriteTokenCard renders without error 1`] = ` onStartShouldSetResponder={[Function]} role="button" style={ - { - "backgroundColor": "#FFFFFF", - "borderBottomColor": "rgba(19, 19, 19, 0.08)", - "borderBottomLeftRadius": 16, - "borderBottomRightRadius": 16, - "borderBottomWidth": 1, - "borderLeftColor": "rgba(19, 19, 19, 0.08)", - "borderLeftWidth": 1, - "borderRightColor": "rgba(19, 19, 19, 0.08)", - "borderRightWidth": 1, - "borderStyle": "solid", - "borderTopColor": "rgba(19, 19, 19, 0.08)", - "borderTopLeftRadius": 16, - "borderTopRightRadius": 16, - "borderTopWidth": 1, - "flexDirection": "column", - "opacity": 1, - "overflow": "hidden", - "shadowColor": "rgb(0,0,0)", - "shadowOffset": { - "height": 1, - "width": 0, - }, - "shadowOpacity": 0.0196078431372549, - "shadowRadius": 6, - "transform": [ - { - "scale": 1, + [ + { + "backgroundColor": "#FFFFFF", + "borderBottomColor": "rgba(19, 19, 19, 0.08)", + "borderBottomLeftRadius": 16, + "borderBottomRightRadius": 16, + "borderBottomWidth": 1, + "borderLeftColor": "rgba(19, 19, 19, 0.08)", + "borderLeftWidth": 1, + "borderRightColor": "rgba(19, 19, 19, 0.08)", + "borderRightWidth": 1, + "borderStyle": "solid", + "borderTopColor": "rgba(19, 19, 19, 0.08)", + "borderTopLeftRadius": 16, + "borderTopRightRadius": 16, + "borderTopWidth": 1, + "flexDirection": "column", + "opacity": 1, + "overflow": "hidden", + "shadowColor": "rgb(0,0,0)", + "shadowOffset": { + "height": 1, + "width": 0, }, - ], - } + "shadowOpacity": 0.0196078431372549, + "shadowRadius": 6, + "transform": [ + { + "scale": 1, + }, + ], + }, + {}, + ] } testID="favorite-token-card-undefined" > { - flatListRef: React.RefObject> + flatListRef: React.RefObject | null> selectedItem: T | null items: T[] scrollDelay?: number @@ -20,7 +20,7 @@ export function useFlatListAutoScroll(options: UseFlatListAutoScrollOptions { - let timeoutId: NodeJS.Timeout | undefined + let timeoutId: NodeJS.Timeout | number | undefined if (flatListRef.current) { // If selectedItem is null (All/First option), scroll to the beginning diff --git a/apps/mobile/src/components/explore/search/SearchPopularNFTCollections.graphql b/apps/mobile/src/components/explore/search/SearchPopularNFTCollections.graphql deleted file mode 100644 index 61455310ac7..00000000000 --- a/apps/mobile/src/components/explore/search/SearchPopularNFTCollections.graphql +++ /dev/null @@ -1,21 +0,0 @@ -query SearchPopularNFTCollections { - topCollections(chains: [ETHEREUM], orderBy: VOLUME, duration: DAY, first: 2) { - edges { - node { - id - name - collectionId - isVerified - nftContracts { - id - chain - address - } - image { - id - url - } - } - } - } -} diff --git a/apps/mobile/src/components/fiatOnRamp/CtaButton.tsx b/apps/mobile/src/components/fiatOnRamp/CtaButton.tsx index b6285af3438..a4f042361c5 100644 --- a/apps/mobile/src/components/fiatOnRamp/CtaButton.tsx +++ b/apps/mobile/src/components/fiatOnRamp/CtaButton.tsx @@ -1,7 +1,7 @@ import React from 'react' import { useTranslation } from 'react-i18next' import { Button, SpinningLoader, useIsShortMobileDevice } from 'ui/src' -import { InfoCircleFilled } from 'ui/src/components/icons' +import { InfoCircleFilled } from 'ui/src/components/icons/InfoCircleFilled' interface FiatOnRampCtaButtonProps { onPress: () => void diff --git a/apps/mobile/src/components/icons/TripleDot.tsx b/apps/mobile/src/components/icons/TripleDot.tsx deleted file mode 100644 index 32488c129fe..00000000000 --- a/apps/mobile/src/components/icons/TripleDot.tsx +++ /dev/null @@ -1,17 +0,0 @@ -import React, { memo } from 'react' -import { ColorTokens, Flex } from 'ui/src' - -type Props = { - size?: number - color?: ColorTokens -} - -export const TripleDot = memo(function _TripleDot({ size = 5, color = '$neutral2' }: Props) { - return ( - - - - - - ) -}) diff --git a/apps/mobile/src/components/input/__snapshots__/SelectionCircle.test.tsx.snap b/apps/mobile/src/components/input/__snapshots__/SelectionCircle.test.tsx.snap index f1d13ae2006..b29ce1681af 100644 --- a/apps/mobile/src/components/input/__snapshots__/SelectionCircle.test.tsx.snap +++ b/apps/mobile/src/components/input/__snapshots__/SelectionCircle.test.tsx.snap @@ -5,36 +5,16 @@ exports[`renders selection circle 1`] = ` style={ { "alignItems": "center", - "borderBottomColor": { - "dynamic": { - "dark": "#FF37C7", - "light": "#FF37C7", - }, - }, + "borderBottomColor": "#FF37C7", "borderBottomLeftRadius": 999999, "borderBottomRightRadius": 999999, "borderBottomWidth": 1, - "borderLeftColor": { - "dynamic": { - "dark": "#FF37C7", - "light": "#FF37C7", - }, - }, + "borderLeftColor": "#FF37C7", "borderLeftWidth": 1, - "borderRightColor": { - "dynamic": { - "dark": "#FF37C7", - "light": "#FF37C7", - }, - }, + "borderRightColor": "#FF37C7", "borderRightWidth": 1, "borderStyle": "solid", - "borderTopColor": { - "dynamic": { - "dark": "#FF37C7", - "light": "#FF37C7", - }, - }, + "borderTopColor": "#FF37C7", "borderTopLeftRadius": 999999, "borderTopRightRadius": 999999, "borderTopWidth": 1, @@ -48,12 +28,7 @@ exports[`renders selection circle 1`] = ` | RefObject> + list: RefObject | RefObject | null> position: Animated.SharedValue index: number } diff --git a/apps/mobile/src/components/layout/screens/HeaderScrollScreen.tsx b/apps/mobile/src/components/layout/screens/HeaderScrollScreen.tsx index 3aac1094369..955b828c3c2 100644 --- a/apps/mobile/src/components/layout/screens/HeaderScrollScreen.tsx +++ b/apps/mobile/src/components/layout/screens/HeaderScrollScreen.tsx @@ -19,8 +19,6 @@ const EDGES: Edge[] = ['top', 'left', 'right'] type HeaderScrollScreenProps = { centerElement?: JSX.Element rightElement?: JSX.Element - alwaysShowCenterElement?: boolean - fullScreen?: boolean // Expand to device edges renderedInModal?: boolean // Apply styling to display within bottom sheet modal showHandleBar?: boolean // add handlebar element to top of view backgroundColor?: ColorTokens @@ -30,8 +28,6 @@ type HeaderScrollScreenProps = { export function HeaderScrollScreen({ centerElement, rightElement = , - alwaysShowCenterElement, - fullScreen = false, renderedInModal = false, showHandleBar = false, backgroundColor = '$surface1', @@ -63,14 +59,12 @@ export function HeaderScrollScreen({ ) return ( - + {showHandleBar ? : null} showHeaderScrollYDistance: number + fullScreen?: boolean // hard to type // biome-ignore lint/suspicious/noExplicitAny: Ref type varies based on list component used listRef: React.MutableRefObject centerElement?: JSX.Element rightElement?: JSX.Element - alwaysShowCenterElement?: boolean - fullScreen?: boolean // Expand to device edges backgroundColor?: ColorTokens backButtonColor?: ColorTokens } @@ -36,7 +35,6 @@ export function ScrollHeader({ showHeaderScrollYDistance, centerElement, rightElement = , - alwaysShowCenterElement, fullScreen = false, backgroundColor, backButtonColor, @@ -74,11 +72,7 @@ export function ScrollHeader({ > - {alwaysShowCenterElement ? ( - centerElement - ) : ( - {centerElement} - )} + {centerElement} {rightElement} diff --git a/apps/mobile/src/components/modals/ReactNavigationModals/ReactNavigationModal.tsx b/apps/mobile/src/components/modals/ReactNavigationModals/ReactNavigationModal.tsx index 64cbdf8aac4..7e8b9ad958b 100644 --- a/apps/mobile/src/components/modals/ReactNavigationModals/ReactNavigationModal.tsx +++ b/apps/mobile/src/components/modals/ReactNavigationModals/ReactNavigationModal.tsx @@ -4,6 +4,8 @@ import { useReactNavigationModal } from 'src/components/modals/useReactNavigatio import type { GetProps } from 'ui/src' import { BridgedAssetModal } from 'uniswap/src/components/BridgedAsset/BridgedAssetModal' import { WormholeModal } from 'uniswap/src/components/BridgedAsset/WormholeModal' +import { ReportTokenDataModal } from 'uniswap/src/components/reporting/ReportTokenDataModal' +import { ReportTokenIssueModal } from 'uniswap/src/components/reporting/ReportTokenIssueModal' import { PasskeyManagementModal } from 'uniswap/src/features/passkey/PasskeyManagementModal' import { PasskeysHelpModal } from 'uniswap/src/features/passkey/PasskeysHelpModal' import { ModalName } from 'uniswap/src/features/telemetry/constants' @@ -31,6 +33,8 @@ type ValidModalNames = keyof Pick< | typeof ModalName.LanguageSelector | typeof ModalName.BridgedAsset | typeof ModalName.Wormhole + | typeof ModalName.ReportTokenIssue + | typeof ModalName.ReportTokenData > type ModalNameWithComponentProps = { @@ -46,6 +50,8 @@ type ModalNameWithComponentProps = { [ModalName.LanguageSelector]: GetProps [ModalName.BridgedAsset]: GetProps [ModalName.Wormhole]: GetProps + [ModalName.ReportTokenIssue]: GetProps + [ModalName.ReportTokenData]: GetProps } type NavigationModalProps = { diff --git a/apps/mobile/src/components/modals/ReactNavigationModals/ReportTokenDataModalScreen.tsx b/apps/mobile/src/components/modals/ReactNavigationModals/ReportTokenDataModalScreen.tsx new file mode 100644 index 00000000000..0cf6770c2b4 --- /dev/null +++ b/apps/mobile/src/components/modals/ReactNavigationModals/ReportTokenDataModalScreen.tsx @@ -0,0 +1,10 @@ +import { AppStackScreenProp } from 'src/app/navigation/types' +import { ReactNavigationModal } from 'src/components/modals/ReactNavigationModals/ReactNavigationModal' +import { ReportTokenDataModal } from 'uniswap/src/components/reporting/ReportTokenDataModal' +import { ModalName } from 'uniswap/src/features/telemetry/constants' + +export const ReportTokenDataModalScreen = ( + props: AppStackScreenProp, +): JSX.Element => { + return +} diff --git a/apps/mobile/src/components/modals/ReactNavigationModals/ReportTokenIssueModalScreen.tsx b/apps/mobile/src/components/modals/ReactNavigationModals/ReportTokenIssueModalScreen.tsx new file mode 100644 index 00000000000..aba9bc3f71a --- /dev/null +++ b/apps/mobile/src/components/modals/ReactNavigationModals/ReportTokenIssueModalScreen.tsx @@ -0,0 +1,10 @@ +import { AppStackScreenProp } from 'src/app/navigation/types' +import { ReactNavigationModal } from 'src/components/modals/ReactNavigationModals/ReactNavigationModal' +import { ReportTokenIssueModal } from 'uniswap/src/components/reporting/ReportTokenIssueModal' +import { ModalName } from 'uniswap/src/features/telemetry/constants' + +export const ReportTokenIssueModalScreen = ( + props: AppStackScreenProp, +): JSX.Element => { + return +} diff --git a/apps/mobile/src/components/text/LongMarkdownText.tsx b/apps/mobile/src/components/text/LongMarkdownText.tsx index 27f4f51fdd5..d58333fc546 100644 --- a/apps/mobile/src/components/text/LongMarkdownText.tsx +++ b/apps/mobile/src/components/text/LongMarkdownText.tsx @@ -35,7 +35,7 @@ export function LongMarkdownText(props: LongMarkdownTextProps): JSX.Element { const [expanded, toggleExpanded] = useReducer((isExpanded) => !isExpanded, true) const [textLengthExceedsLimit, setTextLengthExceedsLimit] = useState(false) const [textLineHeight, setTextLineHeight] = useState(fonts[variant].lineHeight) - const initialContentHeightRef = useRef() + const initialContentHeightRef = useRef(undefined) const maxVisibleHeight = textLineHeight * initialDisplayedLines const onMarkdownLayout = useCallback( diff --git a/apps/mobile/src/components/text/__snapshots__/AnimatedText.test.tsx.snap b/apps/mobile/src/components/text/__snapshots__/AnimatedText.test.tsx.snap index eeceb546c5f..a95e4887071 100644 --- a/apps/mobile/src/components/text/__snapshots__/AnimatedText.test.tsx.snap +++ b/apps/mobile/src/components/text/__snapshots__/AnimatedText.test.tsx.snap @@ -5,20 +5,46 @@ exports[`AnimatedText renders without error 1`] = ` allowFontScaling={true} collapsable={false} editable={false} + jestAnimatedProps={ + { + "value": { + "text": "Rendered", + }, + } + } jestAnimatedStyle={ { "value": {}, } } + jestInlineStyle={ + [ + { + "padding": 0, + }, + { + "fontFamily": "Basel Grotesk", + "fontSize": 17, + "fontWeight": "400", + "lineHeight": 22.1, + }, + undefined, + ] + } maxFontSizeMultiplier={1.4} style={ - { - "fontFamily": "Basel Grotesk", - "fontSize": 17, - "fontWeight": "400", - "lineHeight": 22.1, - "padding": 0, - } + [ + { + "padding": 0, + }, + { + "fontFamily": "Basel Grotesk", + "fontSize": 17, + "fontWeight": "400", + "lineHeight": 22.1, + }, + undefined, + ] } text="Rendered" underlineColorAndroid="transparent" diff --git a/apps/mobile/src/components/text/__snapshots__/DecimalNumber.test.tsx.snap b/apps/mobile/src/components/text/__snapshots__/DecimalNumber.test.tsx.snap index 9e4ebfa46c2..7def4eb8b01 100644 --- a/apps/mobile/src/components/text/__snapshots__/DecimalNumber.test.tsx.snap +++ b/apps/mobile/src/components/text/__snapshots__/DecimalNumber.test.tsx.snap @@ -6,12 +6,7 @@ exports[`renders a DecimalNumber 1`] = ` maxFontSizeMultiplier={1.4} style={ { - "color": { - "dynamic": { - "dark": "#FFFFFF", - "light": "#131313", - }, - }, + "color": "#131313", "fontFamily": "Basel Grotesk", "fontSize": 19, "fontWeight": "400", @@ -26,12 +21,7 @@ exports[`renders a DecimalNumber 1`] = ` maxFontSizeMultiplier={1.4} style={ { - "color": { - "dynamic": { - "dark": "rgba(255, 255, 255, 0.38)", - "light": "rgba(19, 19, 19, 0.35)", - }, - }, + "color": "rgba(19, 19, 19, 0.35)", "fontFamily": "Basel Grotesk", "fontSize": 19, "fontWeight": "400", @@ -52,12 +42,7 @@ exports[`renders a DecimalNumber without a comma separator 1`] = ` maxFontSizeMultiplier={1.4} style={ { - "color": { - "dynamic": { - "dark": "#FFFFFF", - "light": "#131313", - }, - }, + "color": "#131313", "fontFamily": "Basel Grotesk", "fontSize": 19, "fontWeight": "400", @@ -72,12 +57,7 @@ exports[`renders a DecimalNumber without a comma separator 1`] = ` maxFontSizeMultiplier={1.4} style={ { - "color": { - "dynamic": { - "dark": "rgba(255, 255, 255, 0.38)", - "light": "rgba(19, 19, 19, 0.35)", - }, - }, + "color": "rgba(19, 19, 19, 0.35)", "fontFamily": "Basel Grotesk", "fontSize": 19, "fontWeight": "400", @@ -98,12 +78,7 @@ exports[`renders a DecimalNumber without a decimal part 1`] = ` maxFontSizeMultiplier={1.4} style={ { - "color": { - "dynamic": { - "dark": "#FFFFFF", - "light": "#131313", - }, - }, + "color": "#131313", "fontFamily": "Basel Grotesk", "fontSize": 19, "fontWeight": "400", diff --git a/apps/mobile/src/components/text/__snapshots__/TextWithFuseMatches.test.tsx.snap b/apps/mobile/src/components/text/__snapshots__/TextWithFuseMatches.test.tsx.snap index ea3c13571bf..f5750a3f748 100644 --- a/apps/mobile/src/components/text/__snapshots__/TextWithFuseMatches.test.tsx.snap +++ b/apps/mobile/src/components/text/__snapshots__/TextWithFuseMatches.test.tsx.snap @@ -14,12 +14,7 @@ exports[`renders text with few matches 1`] = ` maxFontSizeMultiplier={1.4} style={ { - "color": { - "dynamic": { - "dark": "#FFFFFF", - "light": "#131313", - }, - }, + "color": "#131313", "fontFamily": "Basel Grotesk", "fontSize": 19, "fontWeight": "400", @@ -35,12 +30,7 @@ exports[`renders text with few matches 1`] = ` maxFontSizeMultiplier={1.4} style={ { - "color": { - "dynamic": { - "dark": "#FFFFFF", - "light": "#131313", - }, - }, + "color": "#131313", "fontFamily": "Basel Grotesk", "fontSize": 19, "fontWeight": "400", @@ -56,12 +46,7 @@ exports[`renders text with few matches 1`] = ` maxFontSizeMultiplier={1.4} style={ { - "color": { - "dynamic": { - "dark": "rgba(255, 255, 255, 0.38)", - "light": "rgba(19, 19, 19, 0.35)", - }, - }, + "color": "rgba(19, 19, 19, 0.35)", "fontFamily": "Basel Grotesk", "fontSize": 19, "fontWeight": "400", @@ -77,12 +62,7 @@ exports[`renders text with few matches 1`] = ` maxFontSizeMultiplier={1.4} style={ { - "color": { - "dynamic": { - "dark": "rgba(255, 255, 255, 0.38)", - "light": "rgba(19, 19, 19, 0.35)", - }, - }, + "color": "rgba(19, 19, 19, 0.35)", "fontFamily": "Basel Grotesk", "fontSize": 19, "fontWeight": "400", @@ -98,12 +78,7 @@ exports[`renders text with few matches 1`] = ` maxFontSizeMultiplier={1.4} style={ { - "color": { - "dynamic": { - "dark": "#FFFFFF", - "light": "#131313", - }, - }, + "color": "#131313", "fontFamily": "Basel Grotesk", "fontSize": 19, "fontWeight": "400", @@ -119,12 +94,7 @@ exports[`renders text with few matches 1`] = ` maxFontSizeMultiplier={1.4} style={ { - "color": { - "dynamic": { - "dark": "#FFFFFF", - "light": "#131313", - }, - }, + "color": "#131313", "fontFamily": "Basel Grotesk", "fontSize": 19, "fontWeight": "400", @@ -140,12 +110,7 @@ exports[`renders text with few matches 1`] = ` maxFontSizeMultiplier={1.4} style={ { - "color": { - "dynamic": { - "dark": "#FFFFFF", - "light": "#131313", - }, - }, + "color": "#131313", "fontFamily": "Basel Grotesk", "fontSize": 19, "fontWeight": "400", @@ -161,12 +126,7 @@ exports[`renders text with few matches 1`] = ` maxFontSizeMultiplier={1.4} style={ { - "color": { - "dynamic": { - "dark": "#FFFFFF", - "light": "#131313", - }, - }, + "color": "#131313", "fontFamily": "Basel Grotesk", "fontSize": 19, "fontWeight": "400", @@ -182,12 +142,7 @@ exports[`renders text with few matches 1`] = ` maxFontSizeMultiplier={1.4} style={ { - "color": { - "dynamic": { - "dark": "#FFFFFF", - "light": "#131313", - }, - }, + "color": "#131313", "fontFamily": "Basel Grotesk", "fontSize": 19, "fontWeight": "400", @@ -203,12 +158,7 @@ exports[`renders text with few matches 1`] = ` maxFontSizeMultiplier={1.4} style={ { - "color": { - "dynamic": { - "dark": "rgba(255, 255, 255, 0.38)", - "light": "rgba(19, 19, 19, 0.35)", - }, - }, + "color": "rgba(19, 19, 19, 0.35)", "fontFamily": "Basel Grotesk", "fontSize": 19, "fontWeight": "400", @@ -224,12 +174,7 @@ exports[`renders text with few matches 1`] = ` maxFontSizeMultiplier={1.4} style={ { - "color": { - "dynamic": { - "dark": "rgba(255, 255, 255, 0.38)", - "light": "rgba(19, 19, 19, 0.35)", - }, - }, + "color": "rgba(19, 19, 19, 0.35)", "fontFamily": "Basel Grotesk", "fontSize": 19, "fontWeight": "400", @@ -245,12 +190,7 @@ exports[`renders text with few matches 1`] = ` maxFontSizeMultiplier={1.4} style={ { - "color": { - "dynamic": { - "dark": "rgba(255, 255, 255, 0.38)", - "light": "rgba(19, 19, 19, 0.35)", - }, - }, + "color": "rgba(19, 19, 19, 0.35)", "fontFamily": "Basel Grotesk", "fontSize": 19, "fontWeight": "400", @@ -266,12 +206,7 @@ exports[`renders text with few matches 1`] = ` maxFontSizeMultiplier={1.4} style={ { - "color": { - "dynamic": { - "dark": "rgba(255, 255, 255, 0.38)", - "light": "rgba(19, 19, 19, 0.35)", - }, - }, + "color": "rgba(19, 19, 19, 0.35)", "fontFamily": "Basel Grotesk", "fontSize": 19, "fontWeight": "400", @@ -287,12 +222,7 @@ exports[`renders text with few matches 1`] = ` maxFontSizeMultiplier={1.4} style={ { - "color": { - "dynamic": { - "dark": "rgba(255, 255, 255, 0.38)", - "light": "rgba(19, 19, 19, 0.35)", - }, - }, + "color": "rgba(19, 19, 19, 0.35)", "fontFamily": "Basel Grotesk", "fontSize": 19, "fontWeight": "400", @@ -308,12 +238,7 @@ exports[`renders text with few matches 1`] = ` maxFontSizeMultiplier={1.4} style={ { - "color": { - "dynamic": { - "dark": "rgba(255, 255, 255, 0.38)", - "light": "rgba(19, 19, 19, 0.35)", - }, - }, + "color": "rgba(19, 19, 19, 0.35)", "fontFamily": "Basel Grotesk", "fontSize": 19, "fontWeight": "400", @@ -329,12 +254,7 @@ exports[`renders text with few matches 1`] = ` maxFontSizeMultiplier={1.4} style={ { - "color": { - "dynamic": { - "dark": "rgba(255, 255, 255, 0.38)", - "light": "rgba(19, 19, 19, 0.35)", - }, - }, + "color": "rgba(19, 19, 19, 0.35)", "fontFamily": "Basel Grotesk", "fontSize": 19, "fontWeight": "400", @@ -350,12 +270,7 @@ exports[`renders text with few matches 1`] = ` maxFontSizeMultiplier={1.4} style={ { - "color": { - "dynamic": { - "dark": "rgba(255, 255, 255, 0.38)", - "light": "rgba(19, 19, 19, 0.35)", - }, - }, + "color": "rgba(19, 19, 19, 0.35)", "fontFamily": "Basel Grotesk", "fontSize": 19, "fontWeight": "400", @@ -371,12 +286,7 @@ exports[`renders text with few matches 1`] = ` maxFontSizeMultiplier={1.4} style={ { - "color": { - "dynamic": { - "dark": "rgba(255, 255, 255, 0.38)", - "light": "rgba(19, 19, 19, 0.35)", - }, - }, + "color": "rgba(19, 19, 19, 0.35)", "fontFamily": "Basel Grotesk", "fontSize": 19, "fontWeight": "400", @@ -392,12 +302,7 @@ exports[`renders text with few matches 1`] = ` maxFontSizeMultiplier={1.4} style={ { - "color": { - "dynamic": { - "dark": "rgba(255, 255, 255, 0.38)", - "light": "rgba(19, 19, 19, 0.35)", - }, - }, + "color": "rgba(19, 19, 19, 0.35)", "fontFamily": "Basel Grotesk", "fontSize": 19, "fontWeight": "400", @@ -413,12 +318,7 @@ exports[`renders text with few matches 1`] = ` maxFontSizeMultiplier={1.4} style={ { - "color": { - "dynamic": { - "dark": "rgba(255, 255, 255, 0.38)", - "light": "rgba(19, 19, 19, 0.35)", - }, - }, + "color": "rgba(19, 19, 19, 0.35)", "fontFamily": "Basel Grotesk", "fontSize": 19, "fontWeight": "400", @@ -434,12 +334,7 @@ exports[`renders text with few matches 1`] = ` maxFontSizeMultiplier={1.4} style={ { - "color": { - "dynamic": { - "dark": "rgba(255, 255, 255, 0.38)", - "light": "rgba(19, 19, 19, 0.35)", - }, - }, + "color": "rgba(19, 19, 19, 0.35)", "fontFamily": "Basel Grotesk", "fontSize": 19, "fontWeight": "400", @@ -455,12 +350,7 @@ exports[`renders text with few matches 1`] = ` maxFontSizeMultiplier={1.4} style={ { - "color": { - "dynamic": { - "dark": "rgba(255, 255, 255, 0.38)", - "light": "rgba(19, 19, 19, 0.35)", - }, - }, + "color": "rgba(19, 19, 19, 0.35)", "fontFamily": "Basel Grotesk", "fontSize": 19, "fontWeight": "400", @@ -481,12 +371,7 @@ exports[`renders text without matches 1`] = ` numberOfLines={1} style={ { - "color": { - "dynamic": { - "dark": "#FFFFFF", - "light": "#131313", - }, - }, + "color": "#131313", "fontFamily": "Basel Grotesk", "fontSize": 19, "fontWeight": "400", diff --git a/apps/mobile/src/features/biometrics/biometrics-utils.test.ts b/apps/mobile/src/features/biometrics/biometrics-utils.test.ts index 12959fa4481..a75f42ca282 100644 --- a/apps/mobile/src/features/biometrics/biometrics-utils.test.ts +++ b/apps/mobile/src/features/biometrics/biometrics-utils.test.ts @@ -19,7 +19,7 @@ describe(tryLocalAuthenticate, () => { it('checks enrollement', async () => { mockedHasHardwareAsync.mockResolvedValue(true) mockedIsEnrolledAsync.mockResolvedValue(false) - mockedAuthenticateAsync.mockResolvedValue({ success: false, error: '' }) + mockedAuthenticateAsync.mockResolvedValue({ success: false, error: 'unknown' }) const status = await tryLocalAuthenticate() @@ -29,7 +29,7 @@ describe(tryLocalAuthenticate, () => { it('fails to authenticate when user rejects', async () => { mockedHasHardwareAsync.mockResolvedValue(true) mockedIsEnrolledAsync.mockResolvedValue(true) - mockedAuthenticateAsync.mockResolvedValue({ success: false, error: '' }) + mockedAuthenticateAsync.mockResolvedValue({ success: false, error: 'unknown' }) const status = await tryLocalAuthenticate() diff --git a/apps/mobile/src/features/biometrics/biometricsSaga.ts b/apps/mobile/src/features/biometrics/biometricsSaga.ts index 9416bbaa5eb..2f36a784766 100644 --- a/apps/mobile/src/features/biometrics/biometricsSaga.ts +++ b/apps/mobile/src/features/biometrics/biometricsSaga.ts @@ -35,7 +35,7 @@ export function* biometricsSaga(): SagaIterator { // -------------------------------------------------------------------------------------------- const authTask: Task = yield* fork(function* watchAuthenticationTriggers(): SagaIterator { while (true) { - const action = yield* take(triggerAuthentication.type) + const action = yield* take(triggerAuthentication) yield* call(handleAuthentication, action) } }) diff --git a/apps/mobile/src/features/deepLinking/deepLinkUtils.test.ts b/apps/mobile/src/features/deepLinking/deepLinkUtils.test.ts index d1b329914e6..0cc51ce831d 100644 --- a/apps/mobile/src/features/deepLinking/deepLinkUtils.test.ts +++ b/apps/mobile/src/features/deepLinking/deepLinkUtils.test.ts @@ -1,10 +1,4 @@ import { DeepLinkAction, parseDeepLinkUrl } from 'src/features/deepLinking/deepLinkUtils' -import { logger } from 'utilities/src/logger/logger' - -// Mock the config utils -jest.mock('src/features/deepLinking/configUtils', () => ({ - getInAppBrowserAllowlist: jest.fn(() => ({ allowedUrls: [] })), -})) // Mock the logger jest.mock('utilities/src/logger/logger', () => ({ @@ -13,11 +7,6 @@ jest.mock('utilities/src/logger/logger', () => ({ }, })) -const mockGetInAppBrowserAllowlist = jest.mocked( - require('src/features/deepLinking/configUtils').getInAppBrowserAllowlist, -) -const mockLogger = jest.mocked(logger) - describe('getDeepLinkAction', () => { it.each` url | expected @@ -38,84 +27,11 @@ describe('getDeepLinkAction', () => { ${'uniswap://app/fiatonramp?userAddress=0x123&source=push'} | ${DeepLinkAction.FiatOnRampScreen} ${'uniswap://app/fiatonramp?source=push&moonpayOnly=true&moonpayCurrencyCode=usdc&amount=100'} | ${DeepLinkAction.FiatOnRampScreen} ${'uniswap://app/tokendetails?currencyId=10-0x6fd9d7ad17242c41f7131d257212c54a0e816691&source=push'} | ${DeepLinkAction.TokenDetails} + ${'https://cryptothegame.com/'} | ${DeepLinkAction.UniswapExternalBrowserLink} + ${'https://support.uniswap.org/hc/en-us/articles/test-article-123'} | ${DeepLinkAction.UniswapExternalBrowserLink} + ${'https://blog.uniswap.org/article'} | ${DeepLinkAction.UniswapExternalBrowserLink} + ${'https://uniswapx.uniswap.org/'} | ${DeepLinkAction.UniswapExternalBrowserLink} `('url=$url should return expected=$expected', ({ url, expected }) => { expect(parseDeepLinkUrl(url).action).toEqual(expected) }) }) - -describe('parseDeepLinkUrl allowlist behavior', () => { - beforeEach(() => { - jest.clearAllMocks() - }) - - describe('when allowlist is empty', () => { - beforeEach(() => { - mockGetInAppBrowserAllowlist.mockReturnValue({ allowedUrls: [] }) - }) - - it('should return Unknown action and log appropriate error message', () => { - const url = 'https://example.com/test' - const result = parseDeepLinkUrl(url) - - expect(result.action).toBe(DeepLinkAction.Unknown) - expect(mockLogger.error).toHaveBeenCalledWith( - `No allowlist configured for browser opening, rejecting URL: ${url}`, - { - tags: { file: 'deepLinkUtils', function: 'parseDeepLinkUrl' }, - }, - ) - expect(mockLogger.error).toHaveBeenCalledWith(`Unknown deep link action for url=${url}`, { - tags: { file: 'deepLinkUtils', function: 'parseDeepLinkUrl' }, - }) - }) - }) - - describe('when allowlist is non-empty but URL is not allowlisted', () => { - beforeEach(() => { - mockGetInAppBrowserAllowlist.mockReturnValue({ allowedUrls: ['https://trusted.com'] }) - }) - - it('should return Unknown action and log URL not allowlisted error', () => { - const url = 'https://untrusted.com/test' - const result = parseDeepLinkUrl(url) - - expect(result.action).toBe(DeepLinkAction.Unknown) - expect(mockLogger.error).toHaveBeenCalledWith(`URL not allowlisted for browser opening: ${url}`, { - tags: { file: 'deepLinkUtils', function: 'parseDeepLinkUrl' }, - }) - expect(mockLogger.error).toHaveBeenCalledWith(`Unknown deep link action for url=${url}`, { - tags: { file: 'deepLinkUtils', function: 'parseDeepLinkUrl' }, - }) - }) - }) - - describe('when URL is allowlisted', () => { - beforeEach(() => { - mockGetInAppBrowserAllowlist.mockReturnValue({ allowedUrls: [{ url: 'https://example.com', openInApp: true }] }) - }) - - it('should return InAppBrowser action without logging errors', () => { - const url = 'https://example.com/test' - const result = parseDeepLinkUrl(url) - - expect(result.action).toBe(DeepLinkAction.InAppBrowser) - if (result.action === DeepLinkAction.InAppBrowser) { - expect(result.data.targetUrl).toBe(url) - expect(result.data.openInApp).toBe(true) - } - expect(mockLogger.error).not.toHaveBeenCalled() - }) - - it('should respect openInApp configuration', () => { - mockGetInAppBrowserAllowlist.mockReturnValue({ allowedUrls: [{ url: 'https://example.com', openInApp: false }] }) - - const url = 'https://example.com/test' - const result = parseDeepLinkUrl(url) - - expect(result.action).toBe(DeepLinkAction.InAppBrowser) - if (result.action === DeepLinkAction.InAppBrowser) { - expect(result.data.openInApp).toBe(false) - } - }) - }) -}) diff --git a/apps/mobile/src/features/deepLinking/deepLinkUtils.ts b/apps/mobile/src/features/deepLinking/deepLinkUtils.ts index 318a9e14845..25082908907 100644 --- a/apps/mobile/src/features/deepLinking/deepLinkUtils.ts +++ b/apps/mobile/src/features/deepLinking/deepLinkUtils.ts @@ -1,7 +1,6 @@ import { DeepLinkUrlAllowlist } from '@universe/gating' import { getScantasticQueryParams } from 'src/components/Requests/ScanSheet/util' import { UNISWAP_URL_SCHEME_UWU_LINK } from 'src/components/Requests/Uwulink/utils' -import { getInAppBrowserAllowlist } from 'src/features/deepLinking/configUtils' import { UNISWAP_URL_SCHEME, UNISWAP_URL_SCHEME_SCANTASTIC, @@ -17,6 +16,7 @@ const WALLETCONNECT_URI_SCHEME = 'wc:' // https://eips.ethereum.org/EIPS/eip-132 export enum DeepLinkAction { UniswapWebLink = 'uniswapWebLink', + UniswapExternalBrowserLink = 'uniswapExternalBrowserLink', UniswapWalletConnect = 'uniswapWalletConnect', WalletConnectAsParam = 'walletConnectAsParam', UniswapWidget = 'uniswapWidget', @@ -29,7 +29,6 @@ export enum DeepLinkAction { SkipNonWalletConnect = 'skipNonWalletConnect', UniversalWalletConnectLink = 'universalWalletConnectLink', WalletConnect = 'walletConnect', - InAppBrowser = 'inAppBrowser', Error = 'error', Unknown = 'unknown', TokenDetails = 'tokenDetails', @@ -85,6 +84,7 @@ export type PayloadWithFiatOnRampParams = BasePayload & { export type DeepLinkActionResult = | { action: DeepLinkAction.UniswapWebLink; data: BasePayload & { urlPath: string } } + | { action: DeepLinkAction.UniswapExternalBrowserLink; data: BasePayload & { urlPath: string } } | { action: DeepLinkAction.WalletConnectAsParam; data: PayloadWithWcUri } | { action: DeepLinkAction.UniswapWalletConnect; data: PayloadWithWcUri } | { action: DeepLinkAction.UniswapWidget; data: BasePayload } @@ -97,7 +97,6 @@ export type DeepLinkActionResult = | { action: DeepLinkAction.SkipNonWalletConnect; data: BasePayload } | { action: DeepLinkAction.UniversalWalletConnectLink; data: PayloadWithWcUri } | { action: DeepLinkAction.WalletConnect; data: BasePayload & { wcUri: string } } - | { action: DeepLinkAction.InAppBrowser; data: BasePayload & { targetUrl: string; openInApp: boolean } } | { action: DeepLinkAction.TokenDetails; data: BasePayload & { currencyId: string } } | { action: DeepLinkAction.FiatOnRampScreen; data: PayloadWithFiatOnRampParams } | { action: DeepLinkAction.Error; data: BasePayload } @@ -105,56 +104,6 @@ export type DeepLinkActionResult = type DeepLinkHandler = (url: URL, data: BasePayload) => DeepLinkActionResult -/** - * Checks if a URL is allowlisted for browser opening and returns the configuration. - * This function should be called with the dynamic config value. - * - * @param urlString - The URL to check. - * @param allowList - Allowlist from dynamic config. - * @returns Object with isAllowed and openInApp flags, or null if not allowlisted. - */ -function getUrlAllowlistConfig( - urlString: string, - allowList: DeepLinkUrlAllowlist, -): { isAllowed: boolean; openInApp: boolean } { - try { - const url = new URL(urlString) - - // Only allow HTTPS protocol - if (url.protocol !== 'https:') { - return { isAllowed: false, openInApp: false } - } - - const urlToCheck = `${url.protocol}//${url.hostname}${url.pathname}` - - for (const allowedItem of allowList.allowedUrls) { - const allowedUrl = typeof allowedItem === 'string' ? allowedItem : allowedItem.url - const openInApp = typeof allowedItem === 'string' ? true : (allowedItem.openInApp ?? true) // Default to in-app - - try { - // Support both exact matches and hostname matches - if (allowedUrl === urlString || allowedUrl === urlToCheck) { - return { isAllowed: true, openInApp } - } - - // Support hostname-only matches (e.g., "example.com" matches "https://example.com/any/path") - // Always use HTTPS for allowed URL validation - const allowedUrlObj = new URL(allowedUrl.startsWith('https://') ? allowedUrl : `https://${allowedUrl}`) - if (url.hostname === allowedUrlObj.hostname) { - return { isAllowed: true, openInApp } - } - } catch { - // If allowedUrl is not a valid URL, reject it for security - continue - } - } - - return { isAllowed: false, openInApp: false } - } catch { - return { isAllowed: false, openInApp: false } - } -} - /** * Parses a deep link URL and returns the action to be taken as well as * any additional data that may be needed to handle the deep link. @@ -174,6 +123,10 @@ export function parseDeepLinkUrl(urlString: string): DeepLinkActionResult { } } + if (isValidUniswapExternalWebLink(urlString)) { + return { action: DeepLinkAction.UniswapExternalBrowserLink, data: { ...data, urlPath: url.pathname } } + } + const urlPath = url.pathname const userAddress = url.searchParams.get('userAddress') ?? undefined const fiatOnRamp = url.searchParams.get('fiatOnRamp') === 'true' @@ -290,35 +243,8 @@ export function parseDeepLinkUrl(urlString: string): DeepLinkActionResult { return { action: DeepLinkAction.WalletConnect, data: { ...data, wcUri } } } - // Check if URL is allowlisted for browser opening - const inAppBrowserAllowlist = getInAppBrowserAllowlist() - - // Always perform allowlist check for consistent behavior and logging - const allowlistConfig = getUrlAllowlistConfig(urlString, inAppBrowserAllowlist) - if (allowlistConfig.isAllowed) { - return { - action: DeepLinkAction.InAppBrowser, - data: { ...data, targetUrl: urlString, openInApp: allowlistConfig.openInApp }, - } - } - - // Log appropriate message based on allowlist state - if (inAppBrowserAllowlist.allowedUrls.length === 0) { - logger.error(`No allowlist configured for browser opening, rejecting URL: ${urlString}`, { - tags: { file: 'deepLinkUtils', function: 'parseDeepLinkUrl' }, - }) - } else { - logger.error(`URL not allowlisted for browser opening: ${urlString}`, { - tags: { file: 'deepLinkUtils', function: 'parseDeepLinkUrl' }, - }) - } - - logger.error(`Unknown deep link action for url=${urlString}`, { - tags: { file: 'deepLinkUtils', function: 'parseDeepLinkUrl' }, - }) return { action: DeepLinkAction.Unknown, data } } - const handlers: Record = { [UNISWAP_WEB_HOSTNAME]: (url, data) => { const urlParts = url.href.split(`${UNISWAP_WEB_HOSTNAME}/`) @@ -368,6 +294,17 @@ const handlers: Record = { }), } +const UNISWAP_EXTERNAL_WEB_LINK_VALID_REGEXES = [ + // eslint-disable-next-line security/detect-unsafe-regex + /^https:\/\/([a-zA-Z0-9-]+)\.uniswap\.org(\/.*)?$/, + // eslint-disable-next-line security/detect-unsafe-regex + /^https:\/\/cryptothegame\.com(\/.*)?$/, +] + +function isValidUniswapExternalWebLink(urlString: string): boolean { + return UNISWAP_EXTERNAL_WEB_LINK_VALID_REGEXES.some((regex) => regex.test(urlString)) +} + /** * Extracts the WalletConnect URI from a URL string. * diff --git a/apps/mobile/src/features/deepLinking/handleDeepLinkSaga.test.ts b/apps/mobile/src/features/deepLinking/handleDeepLinkSaga.test.ts index 9424abf457a..f3133c385fd 100644 --- a/apps/mobile/src/features/deepLinking/handleDeepLinkSaga.test.ts +++ b/apps/mobile/src/features/deepLinking/handleDeepLinkSaga.test.ts @@ -10,7 +10,6 @@ import { ONRAMP_DEEPLINK_DELAY, parseAndValidateUserAddress, } from 'src/features/deepLinking/handleDeepLinkSaga' -import { handleInAppBrowser } from 'src/features/deepLinking/handleInAppBrowserSaga' import { handleOnRampReturnLink } from 'src/features/deepLinking/handleOnRampReturnLinkSaga' import { handleTransactionLink } from 'src/features/deepLinking/handleTransactionLinkSaga' import { handleUniswapAppDeepLink } from 'src/features/deepLinking/handleUniswapAppDeepLink' @@ -50,16 +49,6 @@ jest.mock('@universe/gating', () => ({ getFeatureFlag: jest.fn(() => false), // Default to false for feature flags })) -jest.mock('src/features/deepLinking/configUtils', () => ({ - getInAppBrowserAllowlist: jest.fn(() => ({ allowedUrls: [] })), // Default to empty allowlist - getUwuLinkAllowlist: jest.fn(() => ({ contracts: [], tokenRecipients: [] })), // Default to empty allowlist -})) - -// Get the mocked functions for proper typing -const mockGetInAppBrowserAllowlist = jest.mocked( - require('src/features/deepLinking/configUtils').getInAppBrowserAllowlist, -) - const account = signerMnemonicAccount() const swapUrl = `https://uniswap.org/app?screen=swap&userAddress=${account.address}&inputCurrencyId=${SAMPLE_CURRENCY_ID_1}&outputCurrencyId=${SAMPLE_CURRENCY_ID_2}¤cyField=INPUT` @@ -658,363 +647,4 @@ describe(handleDeepLink, () => { .returns(undefined) .silentRun() }) - - describe('In-app browser functionality', () => { - const testUrl = 'https://example.com/test' - const testUrlPayload = { url: testUrl, coldStart: false } - - beforeEach(() => { - // Reset the mock before each test - mockGetInAppBrowserAllowlist.mockClear() - }) - - it('Handles allowlisted URL with openInApp=true (default)', () => { - const mockAllowlist = [{ url: 'https://example.com', openInApp: true }] - mockGetInAppBrowserAllowlist.mockReturnValue({ allowedUrls: mockAllowlist }) - - return expectSaga(handleDeepLink, { payload: testUrlPayload, type: '' }) - .withState(stateWithActiveAccountAddress) - .call(handleInAppBrowser, testUrl, true) - .call(sendAnalyticsEvent, MobileEventName.DeepLinkOpened, { - action: DeepLinkAction.InAppBrowser, - url: testUrl, - screen: 'other', - is_cold_start: false, - source: 'unknown', - }) - .returns(undefined) - .silentRun() - }) - - it('Handles allowlisted URL with openInApp=false (external browser)', () => { - const mockAllowlist = [{ url: 'https://example.com', openInApp: false }] - mockGetInAppBrowserAllowlist.mockReturnValue({ allowedUrls: mockAllowlist }) - - return expectSaga(handleDeepLink, { payload: testUrlPayload, type: '' }) - .withState(stateWithActiveAccountAddress) - .call(handleInAppBrowser, testUrl, false) - .call(sendAnalyticsEvent, MobileEventName.DeepLinkOpened, { - action: DeepLinkAction.InAppBrowser, - url: testUrl, - screen: 'other', - is_cold_start: false, - source: 'unknown', - }) - .returns(undefined) - .silentRun() - }) - - it('Handles allowlisted URL with string format (defaults to openInApp=true)', () => { - const mockAllowlist = ['https://example.com'] - mockGetInAppBrowserAllowlist.mockReturnValue({ allowedUrls: mockAllowlist }) - - return expectSaga(handleDeepLink, { payload: testUrlPayload, type: '' }) - .withState(stateWithActiveAccountAddress) - .call(handleInAppBrowser, testUrl, true) - .call(sendAnalyticsEvent, MobileEventName.DeepLinkOpened, { - action: DeepLinkAction.InAppBrowser, - url: testUrl, - screen: 'other', - is_cold_start: false, - source: 'unknown', - }) - .returns(undefined) - .silentRun() - }) - - it('Handles hostname matching with openInApp configuration', () => { - const mockAllowlist = [{ url: 'example.com', openInApp: false }] - mockGetInAppBrowserAllowlist.mockReturnValue({ allowedUrls: mockAllowlist }) - - return expectSaga(handleDeepLink, { payload: testUrlPayload, type: '' }) - .withState(stateWithActiveAccountAddress) - .call(handleInAppBrowser, testUrl, false) - .call(sendAnalyticsEvent, MobileEventName.DeepLinkOpened, { - action: DeepLinkAction.InAppBrowser, - url: testUrl, - screen: 'other', - is_cold_start: false, - source: 'unknown', - }) - .returns(undefined) - .silentRun() - }) - - it('Handles allowlisted URL without active account', () => { - const mockAllowlist = [{ url: 'https://example.com', openInApp: true }] - mockGetInAppBrowserAllowlist.mockReturnValue({ allowedUrls: mockAllowlist }) - - return expectSaga(handleDeepLink, { payload: testUrlPayload, type: '' }) - .withState({ - wallet: { - accounts: {}, - activeAccountAddress: null, - }, - }) - .call(handleInAppBrowser, testUrl, true) - .call(sendAnalyticsEvent, MobileEventName.DeepLinkOpened, { - action: DeepLinkAction.InAppBrowser, - url: testUrl, - screen: 'other', - is_cold_start: false, - source: 'unknown', - }) - .returns(undefined) - .silentRun() - }) - - it('Rejects non-allowlisted URL and logs error', () => { - const mockAllowlist = [{ url: 'https://trusted.com', openInApp: true }] - mockGetInAppBrowserAllowlist.mockReturnValue({ allowedUrls: mockAllowlist }) - - const consoleSpy = jest.spyOn(console, 'error').mockImplementation(() => undefined) - - return expectSaga(handleDeepLink, { payload: testUrlPayload, type: '' }) - .withState(stateWithActiveAccountAddress) - .call(sendAnalyticsEvent, MobileEventName.DeepLinkOpened, { - action: DeepLinkAction.Unknown, - url: testUrl, - screen: 'other', - is_cold_start: false, - source: 'unknown', - }) - .returns(undefined) - .silentRun() - .finally(() => { - consoleSpy.mockRestore() - }) - }) - - it('Handles mixed allowlist with different URL formats and openInApp settings', () => { - const testUrl2 = 'https://docs.example.com/help' - const testUrl2Payload = { url: testUrl2, coldStart: false } - - const mockAllowlist = [ - 'https://example.com', // String format - defaults to openInApp=true - { url: 'https://docs.example.com', openInApp: false }, // Object format - external browser - { url: 'trusted-site.com', openInApp: true }, // Hostname matching - in-app browser - ] - mockGetInAppBrowserAllowlist.mockReturnValue({ allowedUrls: mockAllowlist }) - - return expectSaga(handleDeepLink, { payload: testUrl2Payload, type: '' }) - .withState(stateWithActiveAccountAddress) - .call(handleInAppBrowser, testUrl2, false) - .call(sendAnalyticsEvent, MobileEventName.DeepLinkOpened, { - action: DeepLinkAction.InAppBrowser, - url: testUrl2, - screen: 'other', - is_cold_start: false, - source: 'unknown', - }) - .returns(undefined) - .silentRun() - }) - - it('Handles empty allowlist', () => { - mockGetInAppBrowserAllowlist.mockReturnValue({ allowedUrls: [] }) - - const consoleSpy = jest.spyOn(console, 'error').mockImplementation(() => undefined) - - return expectSaga(handleDeepLink, { payload: testUrlPayload, type: '' }) - .withState(stateWithActiveAccountAddress) - .call(sendAnalyticsEvent, MobileEventName.DeepLinkOpened, { - action: DeepLinkAction.Unknown, - url: testUrl, - screen: 'other', - is_cold_start: false, - source: 'unknown', - }) - .returns(undefined) - .silentRun() - .finally(() => { - consoleSpy.mockRestore() - }) - }) - - it('Handles URL with query parameters and fragments', () => { - const complexUrl = 'https://example.com/path?param=value#section' - const complexUrlPayload = { url: complexUrl, coldStart: false } - - const mockAllowlist = [{ url: 'https://example.com', openInApp: true }] - mockGetInAppBrowserAllowlist.mockReturnValue({ allowedUrls: mockAllowlist }) - - return expectSaga(handleDeepLink, { payload: complexUrlPayload, type: '' }) - .withState(stateWithActiveAccountAddress) - .call(handleInAppBrowser, complexUrl, true) - .call(sendAnalyticsEvent, MobileEventName.DeepLinkOpened, { - action: DeepLinkAction.InAppBrowser, - url: complexUrl, - screen: 'other', - is_cold_start: false, - source: 'unknown', - }) - .returns(undefined) - .silentRun() - }) - - // Security tests for URL validation - describe('URL validation security', () => { - const consoleSpy = jest.spyOn(console, 'error').mockImplementation(() => undefined) - - afterEach(() => { - consoleSpy.mockClear() - }) - - afterAll(() => { - consoleSpy.mockRestore() - }) - - it('Rejects malicious URLs that would match allowlist substrings', () => { - // Test case: allowlist contains "example.com" but malicious URL contains it as substring - const mockAllowlist = ['example.com'] - mockGetInAppBrowserAllowlist.mockReturnValue({ allowedUrls: mockAllowlist }) - - const maliciousUrls = [ - 'https://malicious-example.com/steal-data', - 'https://notexample.com/example.com', - 'https://example.com.evil.com/phishing', - 'https://sub.example.com.attacker.com/fake', - ] - - const testMaliciousUrl = (maliciousUrl: string): Promise => { - const payload = { url: maliciousUrl, coldStart: false } - return expectSaga(handleDeepLink, { payload, type: '' }) - .withState(stateWithActiveAccountAddress) - .call(sendAnalyticsEvent, MobileEventName.DeepLinkOpened, { - action: DeepLinkAction.Unknown, - url: maliciousUrl, - screen: 'other', - is_cold_start: false, - source: 'unknown', - }) - .returns(undefined) - .silentRun() - } - - const promises = maliciousUrls.map(testMaliciousUrl) - return Promise.all(promises) - }) - - it('Rejects URLs with invalid allowlist entries that would previously use includes() fallback', () => { - // Test case: allowlist contains invalid URL strings that would trigger the dangerous fallback - const mockAllowlist = [ - 'invalid-url-format', // This is not a valid URL - '://malformed-url', - 'just-a-string', - ] - mockGetInAppBrowserAllowlist.mockReturnValue({ allowedUrls: mockAllowlist }) - - const invalidTestUrls = [ - 'https://malicious-invalid-url-format.com/attack', - 'https://evil.com/invalid-url-format', - 'https://attacker.com/path?param=invalid-url-format', - ] - - const testInvalidUrl = (invalidTestUrl: string): Promise => { - const payload = { url: invalidTestUrl, coldStart: false } - return expectSaga(handleDeepLink, { payload, type: '' }) - .withState(stateWithActiveAccountAddress) - .call(sendAnalyticsEvent, MobileEventName.DeepLinkOpened, { - action: DeepLinkAction.Unknown, - url: invalidTestUrl, - screen: 'other', - is_cold_start: false, - source: 'unknown', - }) - .returns(undefined) - .silentRun() - } - - const promises = invalidTestUrls.map(testInvalidUrl) - return Promise.all(promises) - }) - - it('Still allows legitimate URLs that match hostname exactly', () => { - const mockAllowlist = ['example.com'] - mockGetInAppBrowserAllowlist.mockReturnValue({ allowedUrls: mockAllowlist }) - - const legitimateUrls = [ - 'https://example.com/', - 'https://example.com/path', - 'https://example.com/path?param=value', - 'https://example.com/path?param=value#fragment', - ] - - const testLegitimateUrl = (legitimateUrl: string): Promise => { - const payload = { url: legitimateUrl, coldStart: false } - return expectSaga(handleDeepLink, { payload, type: '' }) - .withState(stateWithActiveAccountAddress) - .call(handleInAppBrowser, legitimateUrl, true) - .call(sendAnalyticsEvent, MobileEventName.DeepLinkOpened, { - action: DeepLinkAction.InAppBrowser, - url: legitimateUrl, - screen: 'other', - is_cold_start: false, - source: 'unknown', - }) - .returns(undefined) - .silentRun() - } - - const promises = legitimateUrls.map(testLegitimateUrl) - return Promise.all(promises) - }) - - it('Rejects non-HTTPS URLs even if they match allowlist', () => { - const mockAllowlist = ['example.com'] - mockGetInAppBrowserAllowlist.mockReturnValue({ allowedUrls: mockAllowlist }) - - const insecureUrls = ['http://example.com/', 'ftp://example.com/', 'file://example.com/'] - - const testInsecureUrl = (insecureUrl: string): Promise => { - const payload = { url: insecureUrl, coldStart: false } - return expectSaga(handleDeepLink, { payload, type: '' }) - .withState(stateWithActiveAccountAddress) - .call(sendAnalyticsEvent, MobileEventName.DeepLinkOpened, { - action: DeepLinkAction.Unknown, - url: insecureUrl, - screen: 'other', - is_cold_start: false, - source: 'unknown', - }) - .returns(undefined) - .silentRun() - } - - const promises = insecureUrls.map(testInsecureUrl) - return Promise.all(promises) - }) - - it('Handles edge cases with subdomain attacks', () => { - const mockAllowlist = ['trusted.com'] - mockGetInAppBrowserAllowlist.mockReturnValue({ allowedUrls: mockAllowlist }) - - // These should be rejected - they are different hostnames - const subdomainAttackUrls = [ - 'https://evil.trusted.com.attacker.com/', - 'https://trusted.com.evil.com/', - 'https://anytrusted.com/', - 'https://trusted.com.fake/', - ] - - const testAttackUrl = (attackUrl: string): Promise => { - const payload = { url: attackUrl, coldStart: false } - return expectSaga(handleDeepLink, { payload, type: '' }) - .withState(stateWithActiveAccountAddress) - .call(sendAnalyticsEvent, MobileEventName.DeepLinkOpened, { - action: DeepLinkAction.Unknown, - url: attackUrl, - screen: 'other', - is_cold_start: false, - source: 'unknown', - }) - .returns(undefined) - .silentRun() - } - - const promises = subdomainAttackUrls.map(testAttackUrl) - return Promise.all(promises) - }) - }) - }) }) diff --git a/apps/mobile/src/features/deepLinking/handleDeepLinkSaga.ts b/apps/mobile/src/features/deepLinking/handleDeepLinkSaga.ts index c115585ae5b..ffa647d65d9 100644 --- a/apps/mobile/src/features/deepLinking/handleDeepLinkSaga.ts +++ b/apps/mobile/src/features/deepLinking/handleDeepLinkSaga.ts @@ -16,7 +16,6 @@ import { PayloadWithFiatOnRampParams, parseDeepLinkUrl, } from 'src/features/deepLinking/deepLinkUtils' -import { handleInAppBrowser } from 'src/features/deepLinking/handleInAppBrowserSaga' import { handleOffRampReturnLink } from 'src/features/deepLinking/handleOffRampReturnLinkSaga' import { handleOnRampReturnLink } from 'src/features/deepLinking/handleOnRampReturnLinkSaga' import { handleSwapLink } from 'src/features/deepLinking/handleSwapLinkSaga' @@ -66,8 +65,6 @@ export function* handleDeepLink(action: ReturnType) { if (!activeAccount) { if (deepLinkAction.action === DeepLinkAction.UniswapWebLink) { yield* call(openUri, { uri: deepLinkAction.data.url.toString(), openExternalBrowser: true }) - } else if (deepLinkAction.action === DeepLinkAction.InAppBrowser) { - yield* call(handleInAppBrowser, deepLinkAction.data.targetUrl, deepLinkAction.data.openInApp) } // If there is no active account, we don't want to handle other deep links } else { @@ -80,6 +77,10 @@ export function* handleDeepLink(action: ReturnType) { }) break } + case DeepLinkAction.UniswapExternalBrowserLink: { + yield* call(openUri, { uri: deepLinkAction.data.url.toString(), openExternalBrowser: true }) + break + } case DeepLinkAction.WalletConnectAsParam: case DeepLinkAction.UniswapWalletConnect: { yield* call(handleWalletConnectDeepLink, deepLinkAction.data.wcUri) @@ -101,10 +102,6 @@ export function* handleDeepLink(action: ReturnType) { yield* call(handleUwuLinkDeepLink, deepLinkAction.data.url.toString()) break } - case DeepLinkAction.InAppBrowser: { - yield* call(handleInAppBrowser, deepLinkAction.data.targetUrl, deepLinkAction.data.openInApp) - break - } case DeepLinkAction.TransactionScreen: case DeepLinkAction.ShowTransactionAfterFiatOnRamp: case DeepLinkAction.ShowTransactionAfterFiatOffRampScreen: diff --git a/apps/mobile/src/features/deepLinking/handleInAppBrowserSaga.ts b/apps/mobile/src/features/deepLinking/handleInAppBrowserSaga.ts deleted file mode 100644 index 3503cfc20f4..00000000000 --- a/apps/mobile/src/features/deepLinking/handleInAppBrowserSaga.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { call } from 'typed-redux-saga' -import { openUri } from 'uniswap/src/utils/linking' -import { logger } from 'utilities/src/logger/logger' - -/** - * Opens a URL in a browser window (in-app or external). - * - * @param url - The URL to open - * @param openInApp - If true, opens in in-app browser; if false, opens in external browser - */ -export function* handleInAppBrowser(url: string, openInApp: boolean = true) { - try { - const browserType = openInApp ? 'in-app browser' : 'external browser' - yield* call(logger.info, 'handleInAppBrowserSaga', 'handleInAppBrowser', `Opening URL in ${browserType}: ${url}`) - - // Open the URL using openUri with the specified browser preference - yield* call(openUri, { - uri: url, - openExternalBrowser: !openInApp, // Use external browser if openInApp is false - isSafeUri: true, // URL has been allowlisted so it's safe - }) - - yield* call( - logger.info, - 'handleInAppBrowserSaga', - 'handleInAppBrowser', - `Successfully opened URL in ${browserType}: ${url}`, - ) - } catch (error) { - yield* call(logger.error, error, { - tags: { file: 'handleInAppBrowserSaga', function: 'handleInAppBrowser' }, - extra: { url }, - }) - } -} diff --git a/apps/mobile/src/features/deepLinking/parseSwapLink.test.ts b/apps/mobile/src/features/deepLinking/parseSwapLink.test.ts index c6a97acd5ba..921fe494337 100644 --- a/apps/mobile/src/features/deepLinking/parseSwapLink.test.ts +++ b/apps/mobile/src/features/deepLinking/parseSwapLink.test.ts @@ -186,19 +186,6 @@ describe('parseSwapLink', () => { expect(result.exactAmountToken).toBe('1.5') }) - it('should parse valid MonadTestnet link', () => { - const url = new URL( - `https://uniswap.org/mobile-redirect?screen=swap&inputCurrencyId=${UniverseChainId.MonadTestnet}-0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee&outputCurrencyId=${UniverseChainId.MonadTestnet}-0x1234567890123456789012345678901234567890¤cyField=output&amount=100`, - ) - - const result = parseSwapLinkMobileFormatOrThrow(url) - - expect(result.inputAsset?.chainId).toBe(UniverseChainId.MonadTestnet) - expect(result.outputAsset?.chainId).toBe(UniverseChainId.MonadTestnet) - expect(result.exactCurrencyField).toBe(CurrencyField.OUTPUT) - expect(result.exactAmountToken).toBe('100') - }) - it('should parse valid UnichainSepolia link', () => { const url = new URL( `https://uniswap.org/mobile-redirect?screen=swap&inputCurrencyId=${UniverseChainId.UnichainSepolia}-0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee&outputCurrencyId=${UniverseChainId.UnichainSepolia}-0x31d0220469e10c4E71834a79b1f276d740d3768F¤cyField=input&amount=0.5`, @@ -325,14 +312,14 @@ describe('parseSwapLink', () => { expect(result.outputAsset?.chainId).toBe(UniverseChainId.UnichainSepolia) }) - it('should allow swaps between MonadTestnet and Sepolia', () => { + it('should allow swaps between UnichainSepolia and Sepolia', () => { const url = new URL( - `https://uniswap.org/mobile-redirect?screen=swap&inputCurrencyId=${UniverseChainId.MonadTestnet}-0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee&outputCurrencyId=${UniverseChainId.Sepolia}-0x1c7d4b196cb0c7b01d743fbc6116a902379c7238¤cyField=output&amount=50`, + `https://uniswap.org/mobile-redirect?screen=swap&inputCurrencyId=${UniverseChainId.UnichainSepolia}-0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee&outputCurrencyId=${UniverseChainId.Sepolia}-0x1c7d4b196cb0c7b01d743fbc6116a902379c7238¤cyField=output&amount=50`, ) const result = parseSwapLinkMobileFormatOrThrow(url) - expect(result.inputAsset?.chainId).toBe(UniverseChainId.MonadTestnet) + expect(result.inputAsset?.chainId).toBe(UniverseChainId.UnichainSepolia) expect(result.outputAsset?.chainId).toBe(UniverseChainId.Sepolia) expect(result.exactCurrencyField).toBe(CurrencyField.OUTPUT) }) diff --git a/apps/mobile/src/features/externalProfile/ProfileContextMenu.tsx b/apps/mobile/src/features/externalProfile/ProfileContextMenu.tsx index e81e599aec4..05edb8d131f 100644 --- a/apps/mobile/src/features/externalProfile/ProfileContextMenu.tsx +++ b/apps/mobile/src/features/externalProfile/ProfileContextMenu.tsx @@ -4,9 +4,8 @@ import { useTranslation } from 'react-i18next' import { NativeSyntheticEvent, Share } from 'react-native' import ContextMenu, { ContextMenuOnPressNativeEvent } from 'react-native-context-menu-view' import { useDispatch } from 'react-redux' -import { TripleDot } from 'src/components/icons/TripleDot' -import { Flex, TouchableArea } from 'ui/src' -import { iconSizes } from 'ui/src/theme' +import { TouchableArea } from 'ui/src' +import { Ellipsis } from 'ui/src/components/icons' import { uniswapUrls } from 'uniswap/src/constants/urls' import { useUnitagsAddressQuery } from 'uniswap/src/data/apiClients/unitagsApi/useUnitagsAddressQuery' import { getChainInfo } from 'uniswap/src/features/chains/chainInfo' @@ -121,10 +120,8 @@ export function ProfileContextMenu({ address }: { address: Address }): JSX.Eleme await menuActions[e.nativeEvent.index]?.action() }} > - - - - + + ) diff --git a/apps/mobile/src/features/externalProfile/ProfileHeader.tsx b/apps/mobile/src/features/externalProfile/ProfileHeader.tsx index 3977d01811a..b20e8a63c14 100644 --- a/apps/mobile/src/features/externalProfile/ProfileHeader.tsx +++ b/apps/mobile/src/features/externalProfile/ProfileHeader.tsx @@ -156,7 +156,7 @@ export const ProfileHeader = memo(function ProfileHeader({ address }: ProfileHea {/* header row */} - + diff --git a/apps/mobile/src/features/fiatOnRamp/FiatOnRampAmountSection.tsx b/apps/mobile/src/features/fiatOnRamp/FiatOnRampAmountSection.tsx index d2915126388..8934eb2d257 100644 --- a/apps/mobile/src/features/fiatOnRamp/FiatOnRampAmountSection.tsx +++ b/apps/mobile/src/features/fiatOnRamp/FiatOnRampAmountSection.tsx @@ -75,7 +75,7 @@ interface FiatOnRampAmountSectionProps { } export type FiatOnRampAmountSectionRef = { - textInputRef: RefObject + textInputRef: RefObject triggerShakeAnimation: () => void } diff --git a/apps/mobile/src/features/import/InputWIthSuffixProps.ts b/apps/mobile/src/features/import/InputWIthSuffixProps.ts index b78f87f62f9..bf24dd3d029 100644 --- a/apps/mobile/src/features/import/InputWIthSuffixProps.ts +++ b/apps/mobile/src/features/import/InputWIthSuffixProps.ts @@ -14,7 +14,7 @@ export interface InputWithSuffixProps { multiline?: boolean textAlign?: 'left' | 'right' | 'center' lineHeight?: number - textInputRef: React.RefObject + textInputRef: React.RefObject onBlur?: () => void onFocus?: () => void onChangeText?: (text: string) => void diff --git a/apps/mobile/src/features/import/__snapshots__/GenericImportForm.test.tsx.snap b/apps/mobile/src/features/import/__snapshots__/GenericImportForm.test.tsx.snap index 8e1ea06dfc3..285b81bdcad 100644 --- a/apps/mobile/src/features/import/__snapshots__/GenericImportForm.test.tsx.snap +++ b/apps/mobile/src/features/import/__snapshots__/GenericImportForm.test.tsx.snap @@ -14,42 +14,17 @@ exports[`GenericImportForm renders a placeholder when there is no value 1`] = ` - - + + diff --git a/apps/mobile/src/features/nfts/item/__snapshots__/CollectionPreviewCard.test.tsx.snap b/apps/mobile/src/features/nfts/item/__snapshots__/CollectionPreviewCard.test.tsx.snap index 5bbef99eb00..ab767ca37f6 100644 --- a/apps/mobile/src/features/nfts/item/__snapshots__/CollectionPreviewCard.test.tsx.snap +++ b/apps/mobile/src/features/nfts/item/__snapshots__/CollectionPreviewCard.test.tsx.snap @@ -5,11 +5,34 @@ exports[`renders collection preview card 1`] = ` collapsable={false} focusVisibleStyle={{}} forwardedRef={[Function]} + jestAnimatedProps={ + { + "value": {}, + } + } jestAnimatedStyle={ { "value": {}, } } + jestInlineStyle={ + [ + { + "backgroundColor": "transparent", + "borderBottomLeftRadius": 12, + "borderBottomRightRadius": 12, + "borderTopLeftRadius": 12, + "borderTopRightRadius": 12, + "flexDirection": "column", + "opacity": 1, + "transform": [ + { + "scale": 1, + }, + ], + }, + ] + } onBlur={[Function]} onClick={[Function]} onFocus={[Function]} @@ -22,25 +45,26 @@ exports[`renders collection preview card 1`] = ` onStartShouldSetResponder={[Function]} role="button" style={ - { - "backgroundColor": "transparent", - "borderBottomLeftRadius": 12, - "borderBottomRightRadius": 12, - "borderTopLeftRadius": 12, - "borderTopRightRadius": 12, - "flexDirection": "column", - "opacity": 1, - "transform": [ - { - "scale": 1, - }, - ], - } + [ + { + "backgroundColor": "transparent", + "borderBottomLeftRadius": 12, + "borderBottomRightRadius": 12, + "borderTopLeftRadius": 12, + "borderTopRightRadius": 12, + "flexDirection": "column", + "opacity": 1, + "transform": [ + { + "scale": 1, + }, + ], + }, + {}, + ] } > { OneSignal.initialize(config.onesignalAppId) + startSilentPushListener() + OneSignal.Notifications.addEventListener('foregroundWillDisplay', (event) => { const notification = event.getNotification() const additionalData = notification.additionalData as { notification_type?: string } | undefined @@ -72,6 +75,12 @@ export const initOneSignal = (): void => { export const promptPushPermission = async (): Promise => { const response = await OneSignal.Notifications.requestPermission(true) logger.debug('Onesignal', 'promptForPushNotificationsWithUserResponse', `Prompt response: ${response}`) + + // Explicitly opt in to push notifications if permission was granted + if (response) { + OneSignal.User.pushSubscription.optIn() + } + return response } diff --git a/apps/mobile/src/features/notifications/SilentPushListener.ts b/apps/mobile/src/features/notifications/SilentPushListener.ts new file mode 100644 index 00000000000..395825bd05e --- /dev/null +++ b/apps/mobile/src/features/notifications/SilentPushListener.ts @@ -0,0 +1,70 @@ +import { NativeEventEmitter, NativeModules, Platform } from 'react-native' +import { WalletEventName } from 'uniswap/src/features/telemetry/constants/wallet' +import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send' +import { logger } from 'utilities/src/logger/logger' +import { isMobileApp } from 'utilities/src/platform' + +const EVENT_NAME = 'SilentPushReceived' + +interface SilentPushEventEmitterInterface { + addListener: (eventName: string) => void + removeListeners: (count: number) => void +} + +declare module 'react-native' { + interface NativeModulesStatic { + SilentPushEventEmitter: SilentPushEventEmitterInterface + } +} + +const { SilentPushEventEmitter } = NativeModules + +const eventEmitter = isMobileApp ? new NativeEventEmitter(SilentPushEventEmitter) : undefined + +let subscription: { remove: () => void } | undefined + +const handleSilentPush = (payload: Record): void => { + logger.debug('SilentPush', 'handleSilentPush', 'Silent push received', payload) + + // Onesignal Silent Push payload stores the template id in the 'custom' object with key 'i' + if ('custom' in payload && payload.custom) { + try { + const customPayload = typeof payload.custom === 'string' ? JSON.parse(payload.custom) : payload.custom + + if (!('i' in customPayload) || typeof customPayload.i !== 'string') { + return + } + + sendAnalyticsEvent(WalletEventName.SilentPushReceived, { + template_id: customPayload.i, + }) + logger.debug('SilentPush', 'handleSilentPush', 'Silent push event sent', { + template_id: customPayload.i, + }) + } catch (error) { + logger.error(error, { + tags: { + file: 'SilentPushListener.ts', + function: 'handleSilentPush', + }, + }) + } + } +} + +export const startSilentPushListener = (): void => { + if (subscription) { + return + } + + if (!eventEmitter) { + logger.warn('SilentPush', 'startSilentPushListener', 'Native event emitter unavailable', { + platform: Platform.OS, + moduleLoaded: Boolean(SilentPushEventEmitter), + }) + return + } + + subscription = eventEmitter.addListener(EVENT_NAME, handleSilentPush) + logger.debug('SilentPush', 'startSilentPushListener', 'Listener registered') +} diff --git a/apps/mobile/src/features/notifications/constants.ts b/apps/mobile/src/features/notifications/constants.ts index ca53da9644f..00726dd0e13 100644 --- a/apps/mobile/src/features/notifications/constants.ts +++ b/apps/mobile/src/features/notifications/constants.ts @@ -11,6 +11,7 @@ export enum OneSignalUserTagField { SwapLastCompletedAt = 'swap_last_completed_at', AccountIsUnfunded = 'account_is_unfunded', GatingUnfundedWalletsEnabled = 'gating_unfunded_wallets_enabled', + ActiveWalletAddress = 'active_wallet_address', } export enum NotificationType { diff --git a/apps/mobile/src/features/notifications/saga.ts b/apps/mobile/src/features/notifications/saga.ts index 2f25dd8ed5e..edef583fd6c 100644 --- a/apps/mobile/src/features/notifications/saga.ts +++ b/apps/mobile/src/features/notifications/saga.ts @@ -6,14 +6,18 @@ import { call, select, takeEvery } from 'typed-redux-saga' import { finalizeTransaction } from 'uniswap/src/features/transactions/slice' import { TransactionStatus, TransactionType } from 'uniswap/src/features/transactions/types/transactionDetails' import { ONE_SECOND_MS } from 'utilities/src/time/time' -import { selectFinishedOnboarding } from 'wallet/src/features/wallet/selectors' +import { selectActiveAccountAddress, selectFinishedOnboarding } from 'wallet/src/features/wallet/selectors' +import { removeAccounts, setAccountAsActive } from 'wallet/src/features/wallet/slice' export function* pushNotificationsWatcherSaga() { yield* call(syncWithOneSignal) + yield* call(syncActiveWalletAddressTag) yield* takeEvery(initNotifsForNewUser.type, initNewUser) yield* takeEvery(updateNotifSettings.type, syncWithOneSignal) yield* takeEvery(finalizeTransaction.type, processFinalizedTx) + yield* takeEvery(setAccountAsActive.type, syncActiveWalletAddressTag) + yield* takeEvery(removeAccounts.type, syncActiveWalletAddressTag) } /** @@ -51,3 +55,12 @@ function* processFinalizedTx(action: ReturnType) { ) } } + +function* syncActiveWalletAddressTag() { + const activeAddress = yield* select(selectActiveAccountAddress) + if (activeAddress) { + yield* call(OneSignal.User.addTag, OneSignalUserTagField.ActiveWalletAddress, activeAddress) + } else { + yield* call(OneSignal.User.removeTag, OneSignalUserTagField.ActiveWalletAddress) + } +} diff --git a/apps/mobile/src/features/send/SendFlow.tsx b/apps/mobile/src/features/send/SendFlow.tsx index f8e1d17ce62..dabbd43c62f 100644 --- a/apps/mobile/src/features/send/SendFlow.tsx +++ b/apps/mobile/src/features/send/SendFlow.tsx @@ -12,11 +12,13 @@ import { SendReviewScreen } from 'src/features/send/SendReviewScreen' import { useWalletRestore } from 'src/features/wallet/useWalletRestore' import { ModalName, SectionName } from 'uniswap/src/features/telemetry/constants' import Trace from 'uniswap/src/features/telemetry/Trace' +import { TransactionSettingsStoreContextProvider } from 'uniswap/src/features/transactions/components/settings/stores/transactionSettingsStore/TransactionSettingsStoreContextProvider' import { TransactionModal } from 'uniswap/src/features/transactions/components/TransactionModal/TransactionModal' import { TransactionScreen, useTransactionModalContext, } from 'uniswap/src/features/transactions/components/TransactionModal/TransactionModalContext' +import { SwapFormStoreContextProvider } from 'uniswap/src/features/transactions/swap/stores/swapFormStore/SwapFormStoreContextProvider' import { SendContextProvider, useSendContext } from 'wallet/src/features/transactions/contexts/SendContext' export function SendFlow(): JSX.Element { @@ -45,9 +47,13 @@ export function SendFlow(): JSX.Element { walletNeedsRestore={walletNeedsRestore} onClose={onClose} > - - - + + + + + + + ) } diff --git a/apps/mobile/src/features/send/SendFormButton.tsx b/apps/mobile/src/features/send/SendFormButton.tsx index 82bf9ea84db..740f40d2e3d 100644 --- a/apps/mobile/src/features/send/SendFormButton.tsx +++ b/apps/mobile/src/features/send/SendFormButton.tsx @@ -8,7 +8,7 @@ import { AccountType } from 'uniswap/src/features/accounts/types' import { selectHasDismissedLowNetworkTokenWarning } from 'uniswap/src/features/behaviorHistory/selectors' import { UniswapEventName } from 'uniswap/src/features/telemetry/constants' import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send' -import { useDismissedCompatibleAddressWarnings } from 'uniswap/src/features/tokens/slice/hooks' +import { useDismissedCompatibleAddressWarnings } from 'uniswap/src/features/tokens/warnings/slice/hooks' import { useTransactionModalContext } from 'uniswap/src/features/transactions/components/TransactionModal/TransactionModalContext' import { useIsBlocked } from 'uniswap/src/features/trm/hooks' import { TestID } from 'uniswap/src/test/fixtures/testIDs' diff --git a/apps/mobile/src/features/send/SendTokenForm.tsx b/apps/mobile/src/features/send/SendTokenForm.tsx index bc64573a93b..1fd1ae1690e 100644 --- a/apps/mobile/src/features/send/SendTokenForm.tsx +++ b/apps/mobile/src/features/send/SendTokenForm.tsx @@ -125,7 +125,7 @@ export function SendTokenForm(): JSX.Element { // Decimal pad logic const decimalPadRef = useRef(null) const maxDecimals = isFiatInput ? MAX_FIAT_INPUT_DECIMALS : (currencyIn?.decimals ?? 0) - const selectionRef = useRef() + const selectionRef = useRef(undefined) const onInputSelectionChange = useCallback( (start: number, end: number) => { @@ -295,7 +295,7 @@ export function SendTokenForm(): JSX.Element { style={StyleSheet.absoluteFill} > - + @@ -364,7 +364,11 @@ export function SendTokenForm(): JSX.Element { {!nftIn && ( <> - + { proposalNamespaces: mockNamespaces, chains: [UniverseChainId.Mainnet], dappRequestInfo, - verifyStatus: 'VERIFIED' as WalletConnectVerifyStatus, + verifyStatus: DappVerificationStatus.Verified, }, } @@ -140,25 +141,26 @@ describe('WalletConnect Saga', () => { .run() }) - it('falls back to dapp.url when verifyContext.verified.origin is not available', () => { - // Create a proposal without verified origin (null origin falls back to dapp.url) + it('dispatches addPendingSession with correct parameters for valid proposal', () => { + // Create a mock verification context for the verified status const mockVerifyContext: Verify.Context = { verified: { verifyUrl: 'https://verify.walletconnect.com', - validation: 'INVALID', - origin: null as unknown as string, // null origin should fallback to dapp.url + validation: 'VALID', + origin: 'https://valid-dapp.com', }, } + // Create a valid proposal with eip155 namespace const mockProposal = { - id: 890, + id: 456, proposer: { publicKey: 'test-public-key', metadata: { - name: 'Fallback Dapp', - description: 'Fallback Dapp Description', - url: 'https://fallback-dapp.com', // This should be used when verified origin is empty - icons: ['https://fallback-dapp.com/icon.png'], + name: 'Valid Dapp', + description: 'Valid Dapp Description', + url: 'https://valid-dapp.com', + icons: ['https://valid-dapp.com/icon.png'], }, }, relays: [], @@ -169,14 +171,14 @@ describe('WalletConnect Saga', () => { events: [], }, }, - pairingTopic: 'fallback-pairing-topic', + pairingTopic: 'valid-pairing-topic', expiryTimestamp: Date.now() + 1000 * 60 * 5, verifyContext: mockVerifyContext, } as unknown as ProposalTypes.Struct & { verifyContext?: Verify.Context } const activeAccountAddress = '0x1234567890abcdef' - // Mock namespaces + // Mock namespaces that would be returned by buildApprovedNamespaces const mockNamespaces = { eip155: { accounts: [`eip155:1:${activeAccountAddress}`], @@ -186,27 +188,29 @@ describe('WalletConnect Saga', () => { }, } + // Mock the buildApprovedNamespaces function to return our mock namespaces const buildApprovedNamespacesMock = buildApprovedNamespaces as jest.Mock buildApprovedNamespacesMock.mockReturnValue(mockNamespaces) - // Mock parseVerifyStatus to return INVALID for this test + // Mock parseVerifyStatus to return VERIFIED for this test const parseVerifyStatusMock = parseVerifyStatus as jest.Mock - parseVerifyStatusMock.mockReturnValue('INVALID') + parseVerifyStatusMock.mockReturnValue('VERIFIED') + // Create properly typed dappRequestInfo const dappRequestInfo: DappRequestInfo = { - name: 'Fallback Dapp', - url: 'https://fallback-dapp.com', // Should use dapp.url when verified origin is null - icon: 'https://fallback-dapp.com/icon.png', + name: 'Valid Dapp', + url: 'https://valid-dapp.com', + icon: 'https://valid-dapp.com/icon.png', requestType: DappRequestType.WalletConnectSessionRequest, } const expectedPendingSession = { wcSession: { - id: '890', + id: '456', proposalNamespaces: mockNamespaces, chains: [UniverseChainId.Mainnet], dappRequestInfo, - verifyStatus: 'INVALID' as WalletConnectVerifyStatus, + verifyStatus: DappVerificationStatus.Verified, }, } @@ -216,6 +220,7 @@ describe('WalletConnect Saga', () => { if (selector === selectActiveAccountAddress) { return activeAccountAddress } + // For any other selectors that might access wallet state return next() }, }) @@ -231,26 +236,17 @@ describe('WalletConnect Saga', () => { .run() }) - it('dispatches addPendingSession with correct parameters for valid proposal', () => { - // Create a mock verification context for the verified status - const mockVerifyContext: Verify.Context = { - verified: { - verifyUrl: 'https://verify.walletconnect.com', - validation: 'VALID', - origin: 'https://valid-dapp.com', - }, - } - - // Create a valid proposal with eip155 namespace + it('falls back to dapp.url when verifyContext.verified.origin is not available', () => { + // Create a proposal WITHOUT verifyContext.verified.origin const mockProposal = { - id: 456, + id: 999, proposer: { publicKey: 'test-public-key', metadata: { - name: 'Valid Dapp', - description: 'Valid Dapp Description', - url: 'https://valid-dapp.com', - icons: ['https://valid-dapp.com/icon.png'], + name: 'Fallback Dapp', + description: 'Fallback Dapp Description', + url: 'https://fallback-dapp.com', + icons: ['https://fallback-dapp.com/icon.png'], }, }, relays: [], @@ -261,9 +257,9 @@ describe('WalletConnect Saga', () => { events: [], }, }, - pairingTopic: 'valid-pairing-topic', + pairingTopic: 'fallback-pairing-topic', expiryTimestamp: Date.now() + 1000 * 60 * 5, - verifyContext: mockVerifyContext, + // No verifyContext provided } as unknown as ProposalTypes.Struct & { verifyContext?: Verify.Context } const activeAccountAddress = '0x1234567890abcdef' @@ -282,25 +278,25 @@ describe('WalletConnect Saga', () => { const buildApprovedNamespacesMock = buildApprovedNamespaces as jest.Mock buildApprovedNamespacesMock.mockReturnValue(mockNamespaces) - // Mock parseVerifyStatus to return VERIFIED for this test + // Mock parseVerifyStatus to return UNVERIFIED when no verifyContext const parseVerifyStatusMock = parseVerifyStatus as jest.Mock - parseVerifyStatusMock.mockReturnValue('VERIFIED') + parseVerifyStatusMock.mockReturnValue('UNVERIFIED') - // Create properly typed dappRequestInfo + // Create properly typed dappRequestInfo - should use dapp.url as fallback const dappRequestInfo: DappRequestInfo = { - name: 'Valid Dapp', - url: 'https://valid-dapp.com', - icon: 'https://valid-dapp.com/icon.png', + name: 'Fallback Dapp', + url: 'https://fallback-dapp.com', // Should fallback to dapp.url + icon: 'https://fallback-dapp.com/icon.png', requestType: DappRequestType.WalletConnectSessionRequest, } const expectedPendingSession = { wcSession: { - id: '456', + id: '999', proposalNamespaces: mockNamespaces, chains: [UniverseChainId.Mainnet], dappRequestInfo, - verifyStatus: 'VERIFIED' as WalletConnectVerifyStatus, + verifyStatus: DappVerificationStatus.Unverified, }, } @@ -310,7 +306,6 @@ describe('WalletConnect Saga', () => { if (selector === selectActiveAccountAddress) { return activeAccountAddress } - // For any other selectors that might access wallet state return next() }, }) diff --git a/apps/mobile/src/features/walletConnect/signWcRequestSaga.ts b/apps/mobile/src/features/walletConnect/signWcRequestSaga.ts index f52cf35c930..1efd04ca0f0 100644 --- a/apps/mobile/src/features/walletConnect/signWcRequestSaga.ts +++ b/apps/mobile/src/features/walletConnect/signWcRequestSaga.ts @@ -137,7 +137,15 @@ function* signWcRequest(params: SignMessageParams | SignTransactionParams) { } const { transactionHash } = yield* call(executeTransaction, txParams) - result = { id: params.request.id, capabilities: {} } + result = { + id: params.request.id, + capabilities: { + caip345: { + caip2: `eip155:${params.request.chainId}`, + transactionHashes: [transactionHash], + }, + }, + } // Store the batch transaction in Redux yield* put( diff --git a/apps/mobile/src/features/walletConnect/utils.test.ts b/apps/mobile/src/features/walletConnect/utils.test.ts index 275dba4fe5e..7969c56e888 100644 --- a/apps/mobile/src/features/walletConnect/utils.test.ts +++ b/apps/mobile/src/features/walletConnect/utils.test.ts @@ -1,5 +1,6 @@ import { utils } from 'ethers' import { + convertCapabilitiesToScopedProperties, decodeMessage, getAccountAddressFromEIP155String, getChainIdFromEIP155String, @@ -499,3 +500,87 @@ describe(parseGetCallsStatusRequest, () => { }) }) }) + +describe(convertCapabilitiesToScopedProperties, () => { + it('converts single chain capability to CAIP-2 format', () => { + const capabilities = { + '0xa': { + atomic: { status: 'supported' }, + }, + } + + const result = convertCapabilitiesToScopedProperties(capabilities) + + expect(result).toEqual({ + 'eip155:10': { + atomic: { status: 'supported' }, + }, + }) + }) + + it('converts multiple chain capabilities to CAIP-2 format', () => { + const capabilities = { + '0x1': { + atomic: { status: 'supported' }, + }, + '0x89': { + atomic: { status: 'unsupported' }, + }, + '0xa': { + atomic: { status: 'supported' }, + paymasterService: { supported: true }, + }, + } + + const result = convertCapabilitiesToScopedProperties(capabilities) + + expect(result).toEqual({ + 'eip155:1': { + atomic: { status: 'supported' }, + }, + 'eip155:137': { + atomic: { status: 'unsupported' }, + }, + 'eip155:10': { + atomic: { status: 'supported' }, + paymasterService: { supported: true }, + }, + }) + }) + + it('returns empty object when given empty capabilities', () => { + const capabilities = {} + + const result = convertCapabilitiesToScopedProperties(capabilities) + + expect(result).toEqual({}) + }) + + it('handles invalid hex chain IDs that cause errors', () => { + const capabilities = { + '0x1': { + atomic: { status: 'supported' }, + }, + 'invalid-hex': { + atomic: { status: 'unsupported' }, + }, + '0x89': { + atomic: { status: 'supported' }, + }, + } + + const result = convertCapabilitiesToScopedProperties(capabilities) + + // hexToNumber returns NaN for invalid hex, which should be excluded + // The function continues execution despite the invalid chain ID + expect(result).toHaveProperty('eip155:1') + expect(result).toHaveProperty('eip155:137') + expect(result).not.toHaveProperty('eip155:NaN') + expect(result['eip155:1']).toEqual({ + atomic: { status: 'supported' }, + }) + expect(result['eip155:137']).toEqual({ + atomic: { status: 'supported' }, + }) + }) +}) diff --git a/apps/mobile/src/features/walletConnect/utils.ts b/apps/mobile/src/features/walletConnect/utils.ts index 5a5cab9f75e..685871502dc 100644 --- a/apps/mobile/src/features/walletConnect/utils.ts +++ b/apps/mobile/src/features/walletConnect/utils.ts @@ -5,7 +5,6 @@ import { wcWeb3Wallet } from 'src/features/walletConnect/walletConnectClient' import { SignRequest, TransactionRequest, - WalletConnectVerifyStatus, WalletGetCallsStatusRequest, WalletGetCapabilitiesRequest, WalletSendCallsRequest, @@ -15,8 +14,15 @@ import { toSupportedChainId } from 'uniswap/src/features/chains/utils' import { EthMethod, EthSignMethod, WalletConnectEthMethod } from 'uniswap/src/features/dappRequests/types' import { DappRequestInfo, DappRequestType } from 'uniswap/src/types/walletConnect' import { hexToNumber } from 'utilities/src/addresses/hex' +import { logger } from 'utilities/src/logger/logger' import { generateBatchId } from 'wallet/src/features/batchedTransactions/utils' -import { GetCallsStatusParams, SendCallsParams } from 'wallet/src/features/dappRequests/types' +import { + Capability, + DappVerificationStatus, + GetCallsStatusParams, + SendCallsParams, +} from 'wallet/src/features/dappRequests/types' + /** * Construct WalletConnect 2.0 session namespaces to complete a new pairing. Used when approving a new pairing request. * Assumes each namespace has been validated and is supported by the app with `validateProposalNamespaces()`. @@ -352,23 +358,65 @@ export async function pairWithWalletConnectURI(uri: string): Promise, +): Record> { + const scopedProperties: Record> = {} + + for (const [hexChainId, capability] of Object.entries(capabilities)) { + try { + const chainId = hexToNumber(hexChainId) + if (isNaN(chainId)) { + continue + } + const caip2Key = `eip155:${chainId}` + scopedProperties[caip2Key] = capability + } catch (error) { + logger.error(error, { + tags: { function: 'convertCapabilitiesToScopedProperties', file: 'walletConnect/utils.ts' }, + }) + continue + } + } + + return scopedProperties } diff --git a/apps/mobile/src/features/walletConnect/walletConnectSlice.ts b/apps/mobile/src/features/walletConnect/walletConnectSlice.ts index 7184969625c..6acc756db31 100644 --- a/apps/mobile/src/features/walletConnect/walletConnectSlice.ts +++ b/apps/mobile/src/features/walletConnect/walletConnectSlice.ts @@ -4,20 +4,14 @@ import { UniverseChainId } from 'uniswap/src/features/chains/types' import { EthMethod, EthSignMethod } from 'uniswap/src/features/dappRequests/types' import { DappRequestInfo, EthTransaction, UwULinkMethod } from 'uniswap/src/types/walletConnect' import { logger } from 'utilities/src/logger/logger' -import { Call, Capability } from 'wallet/src/features/dappRequests/types' - -export enum WalletConnectVerifyStatus { - Verified = 'VERIFIED', - Unverified = 'UNVERIFIED', - Threat = 'THREAT', -} +import { Call, Capability, DappVerificationStatus } from 'wallet/src/features/dappRequests/types' export type WalletConnectPendingSession = { id: string chains: UniverseChainId[] dappRequestInfo: DappRequestInfo proposalNamespaces: ProposalTypes.OptionalNamespaces - verifyStatus: WalletConnectVerifyStatus + verifyStatus: DappVerificationStatus } export type WalletConnectSession = { @@ -31,6 +25,13 @@ export type WalletConnectSession = { * is tracking as the active account based on session events (approve session, change account, etc). */ activeAccount: string + + /** + * EIP-5792 capabilities for this session, stored in hex chainId format. + * Contains atomic batch support status per chain. + * Only populated if EIP-5792 feature flag was enabled during session approval. + */ + capabilities?: Record } interface BaseRequest { @@ -99,9 +100,16 @@ export type WalletConnectSigningRequest = | UwuLinkErc20Request | WalletSendCallsEncodedRequest +type PersonalSignRequest = SignRequest & { + type: EthMethod.PersonalSign | EthMethod.EthSign +} + export const isTransactionRequest = (request: WalletConnectSigningRequest): request is TransactionRequest => request.type === EthMethod.EthSendTransaction || request.type === UwULinkMethod.Erc20Send +export const isPersonalSignRequest = (request: WalletConnectSigningRequest): request is PersonalSignRequest => + request.type === EthMethod.PersonalSign || request.type === EthMethod.EthSign + export const isBatchedTransactionRequest = ( request: WalletConnectSigningRequest, ): request is WalletSendCallsEncodedRequest => request.type === EthMethod.WalletSendCalls diff --git a/apps/mobile/src/screens/DevScreen.tsx b/apps/mobile/src/screens/DevScreen.tsx index 78f6bd38e9f..020b1a6d33c 100644 --- a/apps/mobile/src/screens/DevScreen.tsx +++ b/apps/mobile/src/screens/DevScreen.tsx @@ -14,7 +14,7 @@ import { resetDismissedBridgedAssetWarnings, resetDismissedCompatibleAddressWarnings, resetDismissedWarnings, -} from 'uniswap/src/features/tokens/slice/slice' +} from 'uniswap/src/features/tokens/warnings/slice/slice' import { useAppInsets } from 'uniswap/src/hooks/useAppInsets' import { MobileScreens } from 'uniswap/src/types/screens/mobile' import { setClipboard } from 'uniswap/src/utils/clipboard' diff --git a/apps/mobile/src/screens/ExploreScreen.tsx b/apps/mobile/src/screens/ExploreScreen.tsx index 136fc7bcaa6..f3f16e5283f 100644 --- a/apps/mobile/src/screens/ExploreScreen.tsx +++ b/apps/mobile/src/screens/ExploreScreen.tsx @@ -1,4 +1,5 @@ -import { useIsFocused, useNavigation, useScrollToTop } from '@react-navigation/native' +import type { RouteProp } from '@react-navigation/native' +import { useIsFocused, useNavigation, useRoute, useScrollToTop } from '@react-navigation/native' import { SharedEventName } from '@uniswap/analytics-events' import { FeatureFlags, useFeatureFlag } from '@universe/gating' import { useEffect, useRef, useState } from 'react' @@ -8,6 +9,7 @@ import type { FlatList } from 'react-native-gesture-handler' import { useAnimatedRef } from 'react-native-reanimated' import type { Edge } from 'react-native-safe-area-context' import { useDispatch } from 'react-redux' +import type { ExploreStackParamList } from 'src/app/navigation/types' import { ExploreSections } from 'src/components/explore/ExploreSections/ExploreSections' import { ExploreScreenSearchResultsList } from 'src/components/explore/search/ExploreScreenSearchResultsList' import { Screen } from 'src/components/layout/Screen' @@ -38,6 +40,9 @@ export function ExploreScreen(): JSX.Element { const { chains } = useEnabledChains() const isBottomTabsEnabled = useFeatureFlag(FeatureFlags.BottomTabs) const navigation = useNavigation() + const route = useRoute>() + // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- route.params can be null + const { chainId, orderByMetric, showFavorites } = route.params ?? {} const { isSheetReady } = useBottomSheetContext({ forceSafeReturn: isBottomTabsEnabled }) @@ -53,6 +58,8 @@ export function ExploreScreen(): JSX.Element { // Use refs to avoid stale closures in the event listener const isAtTopRef = useRef(isAtTop) const isFocusedRef = useRef(isFocused) + // Track the previous route name to detect true double-tap behavior + const prevRouteNameRef = useRef(null) isAtTopRef.current = isAtTop isFocusedRef.current = isFocused @@ -76,18 +83,25 @@ export function ExploreScreen(): JSX.Element { const unsubscribe = navigation.addListener('state', (e) => { const currentRouteName = e.data.state.routeNames[e.data.state.index] as unknown as string | undefined - - // Check if we're navigating to the Explore screen const isOnExploreScreen = currentRouteName === MobileScreens.Explore - // Only handle this if: - // 1. We were already focused before the state change (i.e., tab was pressed while already on this screen) - // 2. The current route is the Explore screen - // 3. The screen is currently focused - if (!isOnExploreScreen || !isFocusedRef.current) { + // Double-tap detection: Only trigger focus when user taps Explore tab while already on Explore + // This distinguishes between: + // - Initial navigation to Explore (prevRoute !== Explore) → No auto-focus + // - Tab double-tap (prevRoute === Explore && currentRoute === Explore) → Focus search + const isDoubleTap = prevRouteNameRef.current === MobileScreens.Explore && isOnExploreScreen + + // Update the previous route for next navigation event + prevRouteNameRef.current = currentRouteName ?? null + + // Only handle double-tap behavior when: + // 1. This is a true double-tap (was on Explore, tapped Explore again) + // 2. The screen is currently focused + if (!isDoubleTap || !isFocusedRef.current) { return } + // Double-tap behavior: Focus search if at top, scroll to top otherwise if (isAtTopRef.current) { textInputRef.current?.focus() } else { @@ -103,7 +117,7 @@ export function ExploreScreen(): JSX.Element { const canRenderList = useRenderNextFrame(isSheetReady && !isSearchMode) const { onChangeChainFilter, onChangeText, searchFilter, chainFilter, parsedChainFilter, parsedSearchFilter } = - useFilterCallbacks(null, ModalName.Search) + useFilterCallbacks(chainId ?? null, ModalName.Search) const onSearchChangeText = useEvent((newSearchFilter: string): void => { onChangeText(newSearchFilter) @@ -144,6 +158,7 @@ export function ExploreScreen(): JSX.Element { ) : isSheetReady && canRenderList ? ( - + ) : null} ) @@ -187,7 +208,7 @@ export function ExploreScreen(): JSX.Element { */ const useRenderNextFrame = (condition: boolean): boolean => { const [canRender, setCanRender] = useState(false) - const rafRef = useRef() + const rafRef = useRef(undefined) const mountedRef = useRef(true) const conditionRef = useRef(condition) diff --git a/apps/mobile/src/screens/FiatOnRampScreen.tsx b/apps/mobile/src/screens/FiatOnRampScreen.tsx index 7a69327b7f9..3efcf35a2d1 100644 --- a/apps/mobile/src/screens/FiatOnRampScreen.tsx +++ b/apps/mobile/src/screens/FiatOnRampScreen.tsx @@ -121,7 +121,7 @@ export function FiatOnRampScreen({ navigation }: Props): JSX.Element { const [selectingCountry, setSelectingCountry] = useState(false) const [decimalPadReady, setDecimalPadReady] = useState(false) const decimalPadRef = useRef(null) - const selectionRef = useRef() + const selectionRef = useRef(undefined) const amountUpdatedTimeRef = useRef(0) const [value, setValue] = useState('') const valueRef = useRef('') @@ -566,6 +566,7 @@ export function FiatOnRampScreen({ navigation }: Props): JSX.Element { id={DecimalPadCalculatedSpaceId.FiatOnRamp} decimalPadRef={decimalPadRef} additionalElementsHeight={DECIMAL_PAD_EXTRA_ELEMENTS_HEIGHT} + isDecimalPadReady={decimalPadReady} /> + diff --git a/apps/mobile/src/screens/Import/__snapshots__/RestoreCloudBackupPasswordScreen.test.tsx.snap b/apps/mobile/src/screens/Import/__snapshots__/RestoreCloudBackupPasswordScreen.test.tsx.snap index 2ba8b7f5615..e5a5af4bcc8 100644 --- a/apps/mobile/src/screens/Import/__snapshots__/RestoreCloudBackupPasswordScreen.test.tsx.snap +++ b/apps/mobile/src/screens/Import/__snapshots__/RestoreCloudBackupPasswordScreen.test.tsx.snap @@ -4,12 +4,7 @@ exports[`RestoreCloudBackupPasswordScreen renders correctly 1`] = ` { - if (view !== View.SeedPhrase) { - return undefined - } + useFocusEffect( + useCallback(() => { + if (view !== View.SeedPhrase) { + return undefined + } - const listener = addScreenshotListener(() => - navigate(ModalName.ScreenshotWarning, { acknowledgeText: t('common.button.ok') }), - ) - return () => listener.remove() - }, [view, t]) + const listener = addScreenshotListener(() => { + navigate(ModalName.ScreenshotWarning, { acknowledgeText: t('common.button.ok') }) + }) + return () => listener.remove() + }, [view, t]), + ) useEffect(() => { if (confirmContinueButtonPressed && hasBackup(BackupType.Manual, account)) { diff --git a/apps/mobile/src/screens/Onboarding/TermsOfService.tsx b/apps/mobile/src/screens/Onboarding/TermsOfService.tsx index cf8623168c3..8913c9cb725 100644 --- a/apps/mobile/src/screens/Onboarding/TermsOfService.tsx +++ b/apps/mobile/src/screens/Onboarding/TermsOfService.tsx @@ -10,6 +10,7 @@ export function TermsOfService(): JSX.Element { components={{ highlightTerms: ( => openUri({ uri: uniswapUrls.termsOfServiceUrl })} @@ -17,6 +18,7 @@ export function TermsOfService(): JSX.Element { ), highlightPrivacy: ( => openUri({ uri: uniswapUrls.privacyPolicyUrl })} diff --git a/apps/mobile/src/screens/Onboarding/__snapshots__/BackupScreen.test.tsx.snap b/apps/mobile/src/screens/Onboarding/__snapshots__/BackupScreen.test.tsx.snap index 167f5fdd4ad..126056f6548 100644 --- a/apps/mobile/src/screens/Onboarding/__snapshots__/BackupScreen.test.tsx.snap +++ b/apps/mobile/src/screens/Onboarding/__snapshots__/BackupScreen.test.tsx.snap @@ -4,12 +4,7 @@ exports[`BackupScreen renders backup options when none are completed 1`] = ` diff --git a/apps/mobile/src/screens/SettingsScreen.tsx b/apps/mobile/src/screens/SettingsScreen.tsx index 8f4d3e83b9c..6fa0cf28f23 100644 --- a/apps/mobile/src/screens/SettingsScreen.tsx +++ b/apps/mobile/src/screens/SettingsScreen.tsx @@ -226,7 +226,7 @@ export function SettingsScreen(): JSX.Element { }, { navigationModal: ModalName.PortfolioBalanceModal, - text: t('settings.setting.smallBalances.title'), + text: t('settings.setting.balancesActivity.title'), icon: , }, { diff --git a/apps/mobile/src/screens/TokenDetailsHeaders.tsx b/apps/mobile/src/screens/TokenDetailsHeaders.tsx index ba0b0744664..66cadffd71e 100644 --- a/apps/mobile/src/screens/TokenDetailsHeaders.tsx +++ b/apps/mobile/src/screens/TokenDetailsHeaders.tsx @@ -1,6 +1,8 @@ import React, { memo } from 'react' import { useTranslation } from 'react-i18next' import { FadeIn } from 'react-native-reanimated' +import { MODAL_OPEN_WAIT_TIME } from 'src/app/navigation/constants' +import { navigate } from 'src/app/navigation/rootNavigation' import { useTokenDetailsContext } from 'src/components/TokenDetails/TokenDetailsContext' import { TokenDetailsFavoriteButton } from 'src/components/TokenDetails/TokenDetailsFavoriteButton' import { useTokenDetailsCurrentChainBalance } from 'src/components/TokenDetails/useTokenDetailsCurrentChainBalance' @@ -21,7 +23,9 @@ import { TokenMenuActionType, useTokenContextMenuOptions, } from 'uniswap/src/features/portfolio/balances/hooks/useTokenContextMenuOptions' +import { ModalName } from 'uniswap/src/features/telemetry/constants' import { TestID } from 'uniswap/src/test/fixtures/testIDs' +import { useEvent } from 'utilities/src/react/hooks' import { useBooleanState } from 'utilities/src/react/useBooleanState' export const HeaderTitleElement = memo(function HeaderTitleElement(): JSX.Element { @@ -62,6 +66,22 @@ export const HeaderRightElement = memo(function HeaderRightElement(): JSX.Elemen useTokenDetailsContext() const currentChainBalance = useTokenDetailsCurrentChainBalance() + const openReportTokenModal = useEvent(() => { + setTimeout(() => { + navigate(ModalName.ReportTokenIssue, { + source: 'token-details', + currency: currencyInfo?.currency, + isMarkedSpam: currencyInfo?.isSpam, + }) + }, MODAL_OPEN_WAIT_TIME) + }) + + const openReportDataIssueModal = useEvent(() => { + setTimeout(() => { + navigate(ModalName.ReportTokenData, { currency: currencyInfo?.currency, isMarkedSpam: currencyInfo?.isSpam }) + }, MODAL_OPEN_WAIT_TIME) + }) + const { value: isOpen, setTrue: openMenu, setFalse: closeMenu } = useBooleanState(false) const menuActions = useTokenContextMenuOptions({ excludedActions: EXCLUDED_ACTIONS, @@ -70,6 +90,8 @@ export const HeaderRightElement = memo(function HeaderRightElement(): JSX.Elemen tokenSymbolForNotification: currencyInfo?.currency.symbol, portfolioBalance: currentChainBalance, openContractAddressExplainerModal, + openReportDataIssueModal, + openReportTokenModal, copyAddressToClipboard, closeMenu: () => {}, }) diff --git a/apps/mobile/src/screens/TokenDetailsScreen.tsx b/apps/mobile/src/screens/TokenDetailsScreen.tsx index 83a20f7ec10..63e3176d019 100644 --- a/apps/mobile/src/screens/TokenDetailsScreen.tsx +++ b/apps/mobile/src/screens/TokenDetailsScreen.tsx @@ -1,9 +1,12 @@ import { useApolloClient } from '@apollo/client' import { ReactNavigationPerformanceView } from '@shopify/react-native-performance-navigation' import { GQLQueries, GraphQLApi } from '@universe/api' -import React, { memo, useCallback, useEffect, useMemo } from 'react' +import { FeatureFlags, useFeatureFlag } from '@universe/gating' +import React, { memo, useEffect, useMemo } from 'react' import { useTranslation } from 'react-i18next' import { FadeInDown, FadeOutDown } from 'react-native-reanimated' +import { useDispatch } from 'react-redux' +import { MODAL_OPEN_WAIT_TIME } from 'src/app/navigation/constants' import { navigate } from 'src/app/navigation/rootNavigation' import type { AppStackScreenProp } from 'src/app/navigation/types' import { HeaderScrollScreen } from 'src/components/layout/screens/HeaderScrollScreen' @@ -21,11 +24,14 @@ import { useTokenDetailsCTAVariant } from 'src/components/TokenDetails/useTokenD import { useTokenDetailsCurrentChainBalance } from 'src/components/TokenDetails/useTokenDetailsCurrentChainBalance' import { HeaderRightElement, HeaderTitleElement } from 'src/screens/TokenDetailsHeaders' import { useIsScreenNavigationReady } from 'src/utils/useIsScreenNavigationReady' -import { Flex, Separator } from 'ui/src' +import { Flex, Separator, Text } from 'ui/src' import { ArrowDownCircle, ArrowUpCircle, Bank, SendRoundedAirplane } from 'ui/src/components/icons' import { AnimatedFlex } from 'ui/src/components/layout/AnimatedFlex' import { BaseCard } from 'uniswap/src/components/BaseCard/BaseCard' import type { MenuOptionItem } from 'uniswap/src/components/menus/ContextMenuV2' +import { WarningSeverity } from 'uniswap/src/components/modals/WarningModal/types' +import { WarningModal } from 'uniswap/src/components/modals/WarningModal/WarningModal' +import { LearnMoreLink } from 'uniswap/src/components/text/LearnMoreLink' import { PollingInterval } from 'uniswap/src/constants/misc' import { useCrossChainBalances } from 'uniswap/src/data/balances/hooks/useCrossChainBalances' import { @@ -38,12 +44,16 @@ import { useEnabledChains } from 'uniswap/src/features/chains/hooks/useEnabledCh import { TokenList } from 'uniswap/src/features/dataApi/types' import { currencyIdToContractInput } from 'uniswap/src/features/dataApi/utils/currencyIdToContractInput' import { useIsSupportedFiatOnRampCurrency } from 'uniswap/src/features/fiatOnRamp/hooks' +import { pushNotification } from 'uniswap/src/features/notifications/slice/slice' +import { AppNotificationType } from 'uniswap/src/features/notifications/slice/types' import { useOnChainNativeCurrencyBalance } from 'uniswap/src/features/portfolio/api' import { ModalName } from 'uniswap/src/features/telemetry/constants' import Trace from 'uniswap/src/features/telemetry/Trace' -import { TokenWarningCard } from 'uniswap/src/features/tokens/TokenWarningCard' -import TokenWarningModal from 'uniswap/src/features/tokens/TokenWarningModal' +import { TokenWarningCard } from 'uniswap/src/features/tokens/warnings/TokenWarningCard' +import TokenWarningModal from 'uniswap/src/features/tokens/warnings/TokenWarningModal' +import { AZTEC_URL } from 'uniswap/src/features/transactions/swap/hooks/useSwapWarnings/getAztecUnavailableWarning' import { useAppInsets } from 'uniswap/src/hooks/useAppInsets' +import { useShouldShowAztecWarning } from 'uniswap/src/hooks/useShouldShowAztecWarning' import type { CurrencyField } from 'uniswap/src/types/currency' import { MobileScreens } from 'uniswap/src/types/screens/mobile' import { AddressStringFormat, normalizeAddress } from 'uniswap/src/utils/addresses' @@ -151,12 +161,12 @@ const TokenDetailsErrorCard = memo(function _TokenDetailsErrorCard(): JSX.Elemen const apolloClient = useApolloClient() const { error, setError } = useTokenDetailsContext() - const onRetry = useCallback(() => { + const onRetry = useEvent(() => { setError(undefined) apolloClient .refetchQueries({ include: [GQLQueries.TokenDetailsScreen, GQLQueries.TokenPriceHistory] }) .catch((e) => setError(e)) - }, [apolloClient, setError]) + }) return error ? ( @@ -166,7 +176,10 @@ const TokenDetailsErrorCard = memo(function _TokenDetailsErrorCard(): JSX.Elemen }) const TokenDetailsModals = memo(function _TokenDetailsModals(): JSX.Element { + const { t } = useTranslation() + const dispatch = useDispatch() const { navigateToSwapFlow } = useWalletNavigation() + const isAztecDisabled = useFeatureFlag(FeatureFlags.DisableAztecToken) const { chainId, @@ -175,15 +188,13 @@ const TokenDetailsModals = memo(function _TokenDetailsModals(): JSX.Element { currencyInfo, isTokenWarningModalOpen, isContractAddressExplainerModalOpen, + isAztecWarningModalOpen, closeTokenWarningModal, closeContractAddressExplainerModal, + closeAztecWarningModal, copyAddressToClipboard, } = useTokenDetailsContext() - const onCloseTokenWarning = useEvent(() => { - closeTokenWarningModal() - }) - const onAcknowledgeTokenWarning = useEvent(() => { closeTokenWarningModal() if (activeTransactionType !== undefined) { @@ -198,6 +209,15 @@ const TokenDetailsModals = memo(function _TokenDetailsModals(): JSX.Element { } }) + const onTokenWarningReportSuccess = useEvent(() => { + dispatch( + pushNotification({ + type: AppNotificationType.Success, + title: t('common.reported'), + }), + ) + }) + return ( <> {isTokenWarningModalOpen && currencyInfo && ( @@ -205,7 +225,8 @@ const TokenDetailsModals = memo(function _TokenDetailsModals(): JSX.Element { isInfoOnlyWarning currencyInfo0={currencyInfo} isVisible={isTokenWarningModalOpen} - closeModalOnly={onCloseTokenWarning} + closeModalOnly={closeTokenWarningModal} + onReportSuccess={onTokenWarningReportSuccess} onAcknowledge={onAcknowledgeTokenWarning} /> )} @@ -213,6 +234,26 @@ const TokenDetailsModals = memo(function _TokenDetailsModals(): JSX.Element { {isContractAddressExplainerModalOpen && ( )} + + {isAztecWarningModalOpen && isAztecDisabled && ( + + + {t('swap.warning.aztecUnavailable.message')} + + + + } + acknowledgeText={t('common.button.close')} + onClose={closeAztecWarningModal} + onAcknowledge={closeAztecWarningModal} + /> + )} ) }) @@ -223,8 +264,19 @@ const TokenDetailsActionButtonsWrapper = memo(function _TokenDetailsActionButton const activeAddress = useActiveAccountAddressWithThrow() const { isTestnetModeEnabled } = useEnabledChains() - const { currencyId, chainId, address, currencyInfo, openTokenWarningModal, tokenColorLoading, navigation } = - useTokenDetailsContext() + const { + currencyId, + chainId, + address, + currencyInfo, + openTokenWarningModal, + openAztecWarningModal, + tokenColorLoading, + navigation, + } = useTokenDetailsContext() + const showAztecWarning = useShouldShowAztecWarning( + currencyInfo?.currency.isToken ? currencyInfo.currency.address : '', + ) const { navigateToFiatOnRamp, navigateToSwapFlow, navigateToSend, navigateToReceive } = useWalletNavigation() @@ -258,42 +310,50 @@ const TokenDetailsActionButtonsWrapper = memo(function _TokenDetailsActionButton currencyChainId: chainId, }) - const onPressSwap = useCallback( - (currencyField: CurrencyField) => { - if (isBlocked) { - openTokenWarningModal() - } else { - navigateToSwapFlow({ currencyField, currencyAddress: address, currencyChainId: chainId }) - } - }, - [isBlocked, openTokenWarningModal, navigateToSwapFlow, address, chainId], - ) + const onPressSwap = useEvent((currencyField: CurrencyField) => { + if (showAztecWarning) { + openAztecWarningModal() + } else if (isBlocked) { + openTokenWarningModal() + } else { + navigateToSwapFlow({ currencyField, currencyAddress: address, currencyChainId: chainId }) + } + }) - const onPressBuyFiatOnRamp = useCallback( - (isOfframp = false): void => { + const onPressBuyFiatOnRamp = useEvent((isOfframp: boolean = false): void => { + if (showAztecWarning) { + openAztecWarningModal() + } else { navigateToFiatOnRamp({ prefilledCurrency: fiatOnRampCurrency, isOfframp }) - }, - [navigateToFiatOnRamp, fiatOnRampCurrency], - ) + } + }) - const onPressGet = useCallback(() => { - navigate(ModalName.BuyNativeToken, { - chainId, - currencyId, - }) - }, [chainId, currencyId]) + const onPressGet = useEvent(() => { + if (showAztecWarning) { + openAztecWarningModal() + } else { + navigate(ModalName.BuyNativeToken, { + chainId, + currencyId, + }) + } + }) - const onPressSend = useCallback(() => { - navigateToSend({ currencyAddress: address, chainId }) - }, [address, chainId, navigateToSend]) + const onPressSend = useEvent(() => { + if (showAztecWarning) { + openAztecWarningModal() + } else { + navigateToSend({ currencyAddress: address, chainId }) + } + }) - const onPressWithdraw = useCallback(() => { + const onPressWithdraw = useEvent(() => { setTimeout(() => { navigate(ModalName.Wormhole, { currencyInfo, }) - }, 300) // delay is needed to prevent menu from not closing properly - }, [currencyInfo]) + }, MODAL_OPEN_WAIT_TIME) + }) const bridgedWithdrawalInfo = currencyInfo?.bridgedWithdrawalInfo @@ -316,7 +376,12 @@ const TokenDetailsActionButtonsWrapper = memo(function _TokenDetailsActionButton const actions: MenuOptionItem[] = [] if (fiatOnRampCurrency) { - actions.push({ label: t('common.button.buy'), Icon: Bank, onPress: () => onPressBuyFiatOnRamp() }) + actions.push({ + label: t('common.button.buy'), + Icon: Bank, + onPress: () => onPressBuyFiatOnRamp(), + disabled: showAztecWarning, + }) } if (bridgedWithdrawalInfo && hasTokenBalance) { @@ -331,7 +396,12 @@ const TokenDetailsActionButtonsWrapper = memo(function _TokenDetailsActionButton } if (hasTokenBalance && fiatOnRampCurrency) { - actions.push({ label: t('common.button.sell'), Icon: ArrowUpCircle, onPress: () => onPressBuyFiatOnRamp(true) }) + actions.push({ + label: t('common.button.sell'), + Icon: ArrowUpCircle, + onPress: () => onPressBuyFiatOnRamp(true), + disabled: showAztecWarning, + }) } if (hasTokenBalance) { @@ -347,6 +417,7 @@ const TokenDetailsActionButtonsWrapper = memo(function _TokenDetailsActionButton t, bridgedWithdrawalInfo, hasTokenBalance, + showAztecWarning, onPressWithdraw, onPressSend, navigateToReceive, @@ -368,13 +439,15 @@ const TokenDetailsActionButtonsWrapper = memo(function _TokenDetailsActionButton actionMenuOptions={actionMenuOptions} userHasBalance={hasTokenBalance} onPressDisabled={ - isTestnetModeEnabled - ? (): void => - navigate(ModalName.TestnetMode, { - unsupported: true, - descriptionCopy: t('tdp.noTestnetSupportDescription'), - }) - : openTokenWarningModal + showAztecWarning + ? openAztecWarningModal + : isTestnetModeEnabled + ? (): void => + navigate(ModalName.TestnetMode, { + unsupported: true, + descriptionCopy: t('tdp.noTestnetSupportDescription'), + }) + : openTokenWarningModal } /> diff --git a/apps/mobile/src/test/fixtures/redux.ts b/apps/mobile/src/test/fixtures/redux.ts index 1b1d8b45b36..ef3153c669c 100644 --- a/apps/mobile/src/test/fixtures/redux.ts +++ b/apps/mobile/src/test/fixtures/redux.ts @@ -14,7 +14,14 @@ type PreloadedMobileStateOptions = { account: Account | undefined } -export const preloadedMobileState = createFixture, PreloadedMobileStateOptions>({ +type PreloadedMobileStateFactory = ( + overrides?: Partial & PreloadedMobileStateOptions>, +) => PreloadedState + +export const preloadedMobileState: PreloadedMobileStateFactory = createFixture< + PreloadedState, + PreloadedMobileStateOptions +>({ account: undefined, })(({ account }) => ({ ...preloadedWalletPackageState({ account }), diff --git a/apps/mobile/src/utils/hooks.ts b/apps/mobile/src/utils/hooks.ts index 157e3e630de..1bb4493e8a0 100644 --- a/apps/mobile/src/utils/hooks.ts +++ b/apps/mobile/src/utils/hooks.ts @@ -37,7 +37,7 @@ export function useFunctionAfterNavigationTransitionEndWithDelay(fn: () => void, const navigation = useAppStackNavigation() useEffect(() => { - let timeout: NodeJS.Timeout | null = null + let timeout: NodeJS.Timeout | number | null = null const unsubscribe = navigation.addListener('transitionEnd', () => { timeout = setTimeout(fn, timeoutMs) diff --git a/apps/mobile/tsconfig.json b/apps/mobile/tsconfig.json index 94f3a6d681f..9a7067e0a47 100644 --- a/apps/mobile/tsconfig.json +++ b/apps/mobile/tsconfig.json @@ -13,6 +13,12 @@ { "path": "../../packages/uniswap" }, + { + "path": "../../packages/sessions" + }, + { + "path": "../../packages/gating" + }, { "path": "../../packages/api" }, diff --git a/apps/web/.depcheckrc b/apps/web/.depcheckrc index 0469d010fbb..6d78dbec8d8 100644 --- a/apps/web/.depcheckrc +++ b/apps/web/.depcheckrc @@ -83,6 +83,7 @@ ignores: [ 'lib', 'locales', 'nft', + 'notification-service', 'pages', 'polyfills', 'rpc', diff --git a/apps/web/.env.staging b/apps/web/.env.staging index d22934ffff9..0a1782bda6d 100644 --- a/apps/web/.env.staging +++ b/apps/web/.env.staging @@ -1,3 +1,4 @@ # These API keys are intentionally public. Please do not report them - thank you for your concern. REACT_APP_JUPITER_PROXY_URL="https://entry-gateway.backend-prod.api.uniswap.org/jupiter" +ENTRY_GATEWAY_API_URL_OVERRIDE="https://entry-gateway.api.corn-staging.com" diff --git a/apps/web/.gitignore b/apps/web/.gitignore index 9f93a7a3c96..abc356fe394 100644 --- a/apps/web/.gitignore +++ b/apps/web/.gitignore @@ -62,3 +62,5 @@ package-lock.json # Storybook *storybook.log storybook-static/ + +coverage/ diff --git a/apps/web/.storybook/__mocks__/tty.js b/apps/web/.storybook/__mocks__/tty.js new file mode 100644 index 00000000000..60d53bca0ed --- /dev/null +++ b/apps/web/.storybook/__mocks__/tty.js @@ -0,0 +1,10 @@ +// Mock for Node.js tty module to work in browser environment +// Used by @storybook/instrumenter + +module.exports = { + isatty: function () { + return false + }, + ReadStream: function () {}, + WriteStream: function () {}, +} diff --git a/apps/web/.storybook/main.ts b/apps/web/.storybook/main.ts index d5325632a17..a9341f02f1f 100644 --- a/apps/web/.storybook/main.ts +++ b/apps/web/.storybook/main.ts @@ -1,9 +1,8 @@ import type { StorybookConfig } from '@storybook/react-webpack5' import { dirname, join, resolve } from 'path' +import TerserPlugin from 'terser-webpack-plugin' import { DefinePlugin } from 'webpack' -const isDev = process.env.NODE_ENV === 'development' - /** * This function is used to resolve the absolute path of a package. * It is needed in projects that use Yarn PnP or are set up within a monorepo. @@ -40,7 +39,8 @@ const config: StorybookConfig = { config.plugins.push( new DefinePlugin({ - __DEV__: isDev, + __DEV__: process.env.NODE_ENV === 'development', + 'process.env.IS_UNISWAP_EXTENSION': JSON.stringify(process.env.STORYBOOK_EXTENSION || 'false'), }), ) @@ -66,21 +66,81 @@ const config: StorybookConfig = { use: ['@svgr/webpack'], }) + // Add babel-loader for TypeScript/JavaScript transpilation + // @storybook/preset-create-react-app removes TypeScript rules + config?.module?.rules && + config.module.rules.push({ + test: /\.(tsx?|jsx?)$/, + // Exclude node_modules except for expo packages and related modules + exclude: /node_modules\/(?!(expo-.*|@expo|@react-native|@uniswap\/.*)\/).*/, + use: { + loader: 'babel-loader', + options: { + presets: [ + '@babel/preset-env', + ['@babel/preset-react', { runtime: 'automatic' }], + '@babel/preset-typescript', + ], + cacheDirectory: true, + }, + }, + }) + + // Add babel-loader for React Native packages in node_modules config?.module?.rules && config.module.rules.push({ - test: /\.tsx?$/, - use: 'ts-loader', - exclude: /node_modules/, + test: /\.(tsx?|jsx?)$/, + // Exclude node_modules except for expo packages and related modules + exclude: /node_modules\/(?!(expo-.*|@expo|@react-native|@uniswap\/.*)\/).*/, + use: { + loader: 'babel-loader', + options: { + presets: [ + '@babel/preset-env', + ['@babel/preset-react', { runtime: 'automatic' }], + '@babel/preset-typescript', + ], + cacheDirectory: true, + }, + }, + }) + + // Add babel-loader for React Native packages in node_modules + config?.module?.rules && + config.module.rules.push({ + test: /\.(tsx?|jsx?)$/, + include: [ + /node_modules\/react-native-reanimated/, + /node_modules\/react-native-gesture-handler/, + /node_modules\/@react-native/, + /node_modules\/react-native\//, + ], + use: { + loader: 'babel-loader', + options: { + presets: ['@babel/preset-react', '@babel/preset-typescript'], + plugins: [], + cacheDirectory: true, + }, + }, }) config.resolve ??= {} - // Add fallback for Node.js 'os' module + // Configure resolve extensions to prefer .web files + config.resolve.extensions = ['.web.tsx', '.web.ts', '.web.jsx', '.web.js', '.tsx', '.ts', '.jsx', '.js'] + + // Add fallback for Node.js modules not available in browser config.resolve.fallback = { ...(config.resolve.fallback || {}), os: false, + tty: require.resolve('./__mocks__/tty.js'), + fs: false, + path: false, + util: false, } + // Configure webpack aliases for React Native and compatibility config.resolve = { ...config.resolve, alias: { @@ -92,6 +152,109 @@ const config: StorybookConfig = { config.resolve.modules = [resolve(__dirname, '../src'), 'node_modules'] + // Configure optimization - disable minimization in dev to prevent Storybook errors + if (process.env.NODE_ENV === 'production') { + config.optimization = { + ...config.optimization, + minimize: true, + minimizer: [ + new TerserPlugin({ + parallel: 2, // Reduce from default (~8 CPU cores) to prevent memory exhaustion + terserOptions: { + compress: { + drop_console: true, + drop_debugger: true, + pure_funcs: ['console.log', 'console.info'], + }, + mangle: true, + output: { + comments: false, + }, + }, + extractComments: false, + }), + ], + splitChunks: { + chunks: 'all', + cacheGroups: { + vendor: { + test: /[\\/]node_modules[\\/]/, + name: 'vendors', + priority: 10, + }, + tamagui: { + test: /[\\/]node_modules[\\/]tamagui[\\/]/, + name: 'tamagui', + priority: 20, + }, + reactNative: { + test: /[\\/]node_modules[\\/]react-native/, + name: 'react-native', + priority: 20, + }, + }, + maxSize: 500000, // 500KB chunks to reduce memory footprint + }, + } + } else { + // In development, explicitly disable minimization + config.optimization = { + ...config.optimization, + minimize: false, + minimizer: [], + splitChunks: { + chunks: 'all', + cacheGroups: { + vendor: { + test: /[\\/]node_modules[\\/]/, + name: 'vendors', + priority: 10, + }, + tamagui: { + test: /[\\/]node_modules[\\/]tamagui[\\/]/, + name: 'tamagui', + priority: 20, + }, + reactNative: { + test: /[\\/]node_modules[\\/]react-native/, + name: 'react-native', + priority: 20, + }, + }, + maxSize: 500000, + }, + } + } + + // Disable source maps for production Storybook builds to save memory + if (process.env.NODE_ENV === 'production') { + config.devtool = false + } + + // Remove ForkTsCheckerWebpackPlugin - it checks entire app, not just stories + const tsCheckerPlugin = + config.plugins && config.plugins.find((plugin) => plugin?.constructor.name === 'ForkTsCheckerWebpackPlugin') + + if (tsCheckerPlugin) { + config.plugins = config.plugins?.filter((p) => p !== tsCheckerPlugin) + } + + // Enable webpack persistent caching for faster rebuilds + config.cache = { + type: 'filesystem', + cacheDirectory: resolve(__dirname, '../node_modules/.cache/storybook'), + buildDependencies: { + config: [__filename], + }, + } + + // Configure performance hints + config.performance = { + maxAssetSize: 512000 * 2, + maxEntrypointSize: 512000 * 2, + hints: 'warning', + } + return config }, } diff --git a/apps/web/CLAUDE.md b/apps/web/CLAUDE.md index a5256033071..0098f3b1840 100644 --- a/apps/web/CLAUDE.md +++ b/apps/web/CLAUDE.md @@ -22,18 +22,24 @@ bun lint bun lint:fix # Run tests -bun run test # Run all tests +bun run test # Run all tests bun run test:watch # Watch mode bun run test:set1 # Components only bun run test:set2 # Pages and state bun run test:set3 # Hooks, NFT, utils bun run test:set4 # Remaining tests -# Run E2E tests -bun playwright:test - # Build for production bun build:production + +# Run production preview web server +bun preview + +# Run E2E Playwright tests +bun e2e # Run all e2e tests +bun e2e:no-anvil # Run non-anvil e2e tests +bun e2e:anvil # Run anvil e2e tests +bun e2e ExampleTest.e2e.test # Run a specific test file ``` ### Monorepo Commands (from root) diff --git a/apps/web/functions/api/image/pools.tsx b/apps/web/functions/api/image/pools.tsx index 79b1f698a04..c62d4c9a7ff 100644 --- a/apps/web/functions/api/image/pools.tsx +++ b/apps/web/functions/api/image/pools.tsx @@ -1,13 +1,13 @@ // biome-ignore-all lint/correctness/noRestrictedElements: ignoring for the whole file -import { GraphQLApi } from '@universe/api' +import { ProtocolVersion } from '@universe/api/src/clients/graphql/__generated__/schema-types' import { ImageResponse } from '@vercel/og' import { WATERMARK_URL } from 'functions/constants' import getFont from 'functions/utils/getFont' import getNetworkLogoUrl from 'functions/utils/getNetworkLogoURL' import getPool from 'functions/utils/getPool' import { getRequest } from 'functions/utils/getRequest' -import { Context } from 'hono' +import { type Context } from 'hono' function UnknownTokenImage({ symbol }: { symbol?: string }) { const ticker = symbol?.slice(0, 3) @@ -174,7 +174,7 @@ export async function poolImageHandler(c: Context) { > {data.name}
- {data.poolData?.protocolVersion === GraphQLApi.ProtocolVersion.V2 && ( + {data.poolData?.protocolVersion === ProtocolVersion.V2 && (
(type) => type; } } - + - + - + - + diff --git a/apps/web/functions/explore/pools/pool.test.ts b/apps/web/functions/explore/pools/pool.test.ts index 803b6369f2f..7511682a029 100644 --- a/apps/web/functions/explore/pools/pool.test.ts +++ b/apps/web/functions/explore/pools/pool.test.ts @@ -14,7 +14,7 @@ const pools = [ { address: '0xD1F1baD4c9E6c44DeC1e9bF3B94902205c5Cd6C3', network: 'optimism', - name: 'USDC/WLD', + name: 'USDC.e/WLD', image: 'http://localhost:3000/api/image/pools/optimism/0xD1F1baD4c9E6c44DeC1e9bF3B94902205c5Cd6C3', }, ] diff --git a/apps/web/playwright.config.ts b/apps/web/playwright.config.ts index 26e615d9c3f..ece5a5baaa5 100644 --- a/apps/web/playwright.config.ts +++ b/apps/web/playwright.config.ts @@ -1,13 +1,13 @@ import { defineConfig, devices } from '@playwright/test' -import dotenv from 'dotenv' +import { config } from 'dotenv' import ms from 'ms' import path from 'path' -const IS_CI = process.env.CI === 'true' +// Load environment variables from .env file +// This ensures the VSCode Playwright extension has access to env vars +config({ path: path.resolve(__dirname, '.env') }) -if (!IS_CI) { - dotenv.config({ path: path.resolve(__dirname, '.env.local') }) -} +const IS_CI = process.env.CI === 'true' // Handle asset files and platform-specific imports for Node.js // eslint-disable-next-line @typescript-eslint/no-var-requires @@ -51,15 +51,16 @@ export default defineConfig({ testMatch: '**/*.e2e.test.ts', globalTeardown: './src/playwright/anvil/global-teardown.ts', workers: 1, // this is manually configured in the github action depending on type of tests - fullyParallel: true, + fullyParallel: false, maxFailures: IS_CI ? 10 : undefined, retries: IS_CI ? 3 : 0, reporter: IS_CI && process.env.REPORT_TO_SLACK ? [['blob'], ['list']] : 'list', - timeout: ms('60s'), + timeout: ms('120s'), expect: { - timeout: ms('10s'), + timeout: ms('15s'), }, use: { + actionTimeout: ms('30s'), screenshot: 'off', video: 'retain-on-failure', trace: 'retain-on-failure', diff --git a/apps/web/public/app-sitemap.xml b/apps/web/public/app-sitemap.xml index bc83f2fc08c..06bb6000f83 100644 --- a/apps/web/public/app-sitemap.xml +++ b/apps/web/public/app-sitemap.xml @@ -126,4 +126,16 @@ weekly 0.5 + + https://app.uniswap.org/positions/create + 2024-09-17T19:57:27.976Z + weekly + 0.7 + + + https://app.uniswap.org/positions + 2024-09-17T19:57:27.976Z + weekly + 0.7 + diff --git a/apps/web/public/csp.json b/apps/web/public/csp.json index bd7590b734f..53f051b7aac 100644 --- a/apps/web/public/csp.json +++ b/apps/web/public/csp.json @@ -1,6 +1,6 @@ { "defaultSrc": ["'self'"], - "scriptSrc": ["'self'", "'wasm-unsafe-eval'"], + "scriptSrc": ["'self'", "'wasm-unsafe-eval'", "https://challenges.cloudflare.com"], "styleSrc": [ "'self'", "'unsafe-inline'", @@ -20,7 +20,8 @@ "https://buy.moonpay.com/", "https://verify.walletconnect.com/", "https://verify.walletconnect.org/", - "https://id.porto.sh" + "https://id.porto.sh", + "https://wrapped.uniswap.org" ], "mediaSrc": ["self", "*"], "formAction": ["'none'"], diff --git a/apps/web/public/images/notifications/monad_banner_light.png b/apps/web/public/images/notifications/monad_banner_light.png new file mode 100644 index 0000000000000000000000000000000000000000..7d6af153b91cf418e898eeb6ddaf1c6a13a08be5 GIT binary patch literal 29178 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 V2#N)vC4m3{002ovPDHLkV1f~OZ^{4w literal 0 HcmV?d00001 diff --git a/apps/web/public/images/notifications/monad_logo_filled.png b/apps/web/public/images/notifications/monad_logo_filled.png new file mode 100644 index 0000000000000000000000000000000000000000..9e839715080082419fd27a925867d80353bce24a GIT binary patch literal 2017 zcmV<72Oju|P)i#DH0qK9~H)FOlOWJii;G9k}5<=BwFy%M2dvrj60g#;dDU?5+Myz zkU~L}hJy}Qj$Hwkaz;WT4LK?k`*t7m-(!tA@A-CSXJ^m&ev)O*cl$B_ee>qcdvk*z zLuN{AMd5j)EX4^yG|EiF>d(WpJ!p^+bt0}4)88azZK^U*BLjrahsz}%&iTzrBELl2 zN32*VA?ixhT26S=KU8+tHIC~Jgp<5>Q81Ti2OxyF7FWow0?wRWRTjr(ddDoT8?Z>9 z#q@>Q!E0SU*O^O`t3U1(tLp>{QMphZJlE;{NC5+1$7{EUxk!D`r{_H}aI#zxjrO-> z)aR9Wcl+XPfO#}9s0cO*h;EAmsL$Idg9@~1h)aJ>sF@h`wmL_;KP=OdG?g)$&ybmSEy&m`KySJ%lX%@i_`<`SE3ymku)+Ul!%){ z)P*^p?%!!r<2m&LYKBH-fvgJo{$0wD;k`uT6L}?^jP?1R5mNdm^GduTWyn}j()cI2 zNQ>(Pgx+^>faYpG&E4}TD}*OT^HR_;KLZB{tNZk;e9&#pju-Ut=Q-8o1>L@pjWzm$ zijr9r$T1M@^!EeC; zK6E+wyR^W$aSewI=g9$x>%Kglchb$qPUM0Z^4HllCvjuyEy7^o+D9P(hmXaz(Ln)q9fuLrw39QSgd#9q~bxi>$A<^=h33S zNj%Va&Pt4C@H;N>!-xcIV^u)JV5S4cM&a=9Za}=-H}vMghy-lMiPjzo{1Rd?T|yz^ zh}I5{xqrvgnt|XR(T#DO4Xg-=Cu=gpKqKbvMR(KK=lIj3{fC5BoQZo~e#}M>t)0YO zxRq7W6Aw53)AU-<_$1sC4mP$X7$9}4c>#BXoJSU{M6+>4`OS1&iM_?%8)V9*_vK`SUH zV~hnv4I@t1HHq0w!2{BLNa)IFiz!9|;)%sA0AZwcA>Nzo>03G4Vwx>7I!fn>y>MKs zFtI{#;hl~2Ao`n_agiy!~nPAi+ zbmLyP!r|A&r#PT3rn4pE7MbMoTv?$`RS?3NS|2cOO>kj@h#$$c>wN~65CE~>- zbM-{#fE=7|#E*t0&B1jdT=^AOJluQI1)7QblSw)~X%4O(oGVz~rcswMsp>_MSU}v! z&8zx1Vk4d2%H`#Z7HdL08)-Hx9z85C>X5WX8?JKIU0)4wueP$|*6P9-$zTyK*31&$;K@&LNNF_{FsV|xvuS^mi3_Q=GCT3IK&t6 z&0?hJ_l_J*E*uDJGqw>kXaBdJ^Jy(9)2kP^;!1CQ30vWiq{ByrmBr|37Pe9m5SWOV z25DCXQ=3=0EN5nU52;Q}vlI~nhKp;bKC^GFN?6kxSdxNBz}16ul3zli^5@IVAO=gD zaPg9hdI*4k4RQoxFk1^7qrkb-TD;VOMqUVRFbij2_rfe-d5MFxmaP#Q)`t0bnv0hr z5mc9g#5_4B^ieh%jB}*D@~acfye!%0dz1li@WFb)-_5cjusR%jJ;P85#+T^cypv#RRnB4rFL>W|;B3>d5K#rirNtcF;Q_{LJE2vNhYKtN9pR&xGo<^qO5 zDAb-GE>h2e9WL=Z=qs&#ptwqXVu39}!|g%WosB1VmC0dHyq`{MPxa%Z^OzA0^F05~(b+TQ}S9UoXvoBSb7L&B2;p)_tp^jTYZ#j3ufh_&+gvvV5&I5z$xvj(lF}H%p z4wqC`dVfPZ0MSJSHcZd;s_UFoQ9bxtrW?ZMQoqP zBnm1wR-kS4-(e`X)KHC|M>-D~sj15D8X52kP#T;Ugg6wa00000NkvXXu0mjfMtayE literal 0 HcmV?d00001 diff --git a/apps/web/public/nfts-sitemap.xml b/apps/web/public/nfts-sitemap.xml index 384bc3a2dfd..ad5990a816c 100644 --- a/apps/web/public/nfts-sitemap.xml +++ b/apps/web/public/nfts-sitemap.xml @@ -2,707 +2,667 @@ https://app.uniswap.org/nfts/collection/0xbc4ca0eda7647a8ab7c2061c2e118a18a936f13d - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0x60e4d786628fea6478f785a6d7e704777c86a7c6 - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0xed5af388653567af2f388e6224dc7c4b3241c544 - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0x34d85c9cdeb23fa97cb08333b511ac86e1c4e258 - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0x99a9b7c1116f9ceeb1652de04d5969cce509b069 - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0x49cf6f5d44e70224e2e23fdcdd2c053f30ada28b - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0xb7f7f6c52f2e2fdb1963eab30438024864c313f6 - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0x23581767a106ae21c074b2276d25e5c3e136a68b - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0x8a90cab2b38dba80c64b7734e58ee1db38b8992e - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0xba30e5f9bb24caa003e9f2f0497ad287fdf95623 - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0xbd3531da5cf5857e7cfaa92426877b022e612cf8 - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0x7bd29408f11d2bfc23c34f18275bbf23bb716bc7 - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0x306b1ea3ecdf94ab739f1910bbda052ed4a9f949 - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0x1a92f7381b9f03921564a437210bb9396471050c - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0x5cc5b05a8a13e3fbdb0bb9fccd98d38e50f90c38 - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0x5af0d9827e0c53e4799bb226655a1de152a425a5 - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0x3bf2922f4520a8ba0c2efc3d2a1539678dad5e9d - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0xe785e82358879f061bc3dcac6f0444462d4b5330 - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0x76be3b62873462d2142405439777e971754e8e77 - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0xfd43af6d3fe1b916c026f6ac35b3ede068d1ca01 - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0x1cb1a5e65610aeff2551a50f76a87a7d3fb649c6 - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0xff9c1b15b16263c61d017ee9f65c50e4ae0113d7 - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0x6339e5e072086621540d0362c4e3cea0d643e114 - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0xb932a70a57673d89f4acffbe830e8ed7f75fb9e0 - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0x79fcdef22feed20eddacbb2587640e45491b757f - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0xa3aee8bce55beea1951ef834b99f3ac60d1abeeb - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0x769272677fab02575e84945f03eca517acc544cc - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0x4db1f25d3d98600140dfc18deb7515be5bd293af - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0x34eebee6942d8def3c125458d1a86e0a897fd6f9 - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0x59468516a8259058bad1ca5f8f4bff190d30e066 - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0x394e3d3044fc89fcdd966d3cb35ac0b32b0cda91 - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0x60bb1e2aa1c9acafb4d34f71585d7e959f387769 - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0x28472a58a490c5e09a238847f66a68a47cc76f0f - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0x341a1c534248966c4b6afad165b98daed4b964ef - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0x82c7a8f707110f5fbb16184a5933e9f78a34c6ab - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0xccc441ac31f02cd96c153db6fd5fe0a2f4e6a68d - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0x764aeebcf425d56800ef2c84f2578689415a2daa - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0x160c404b2b49cbc3240055ceaee026df1e8497a0 - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0xd2f668a8461d6761115daf8aeb3cdf5f40c532c6 - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0x39ee2c7b3cb80254225884ca001f57118c8f21b6 - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0xd774557b647330c91bf44cfeab205095f7e6c367 - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0x1792a96e5668ad7c167ab804a100ce42395ce54d - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0xf87e31492faf9a91b02ee0deaad50d51d56d5d4d - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0x04afa589e2b933f9463c5639f412b183ec062505 - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0xe75512aa3bec8f00434bbd6ad8b0a3fbff100ad6 - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0x348fc118bcc65a92dc033a951af153d14d945312 - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0x892848074ddea461a15f337250da3ce55580ca85 - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0x5946aeaab44e65eb370ffaa6a7ef2218cff9b47d - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0x282bdd42f4eb70e7a9d9f40c8fea0825b7f68c5d - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0x4b15a9c28034dc83db40cd810001427d3bd7163d - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0x7ea3cca10668b8346aec0bf1844a49e995527c8b - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0xb852c6b5892256c264cc2c888ea462189154d8d7 - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0x9378368ba6b85c1fba5b131b530f5f5bedf21a18 - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0x2acab3dea77832c09420663b0e1cb386031ba17b - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0x0c2e57efddba8c768147d1fdf9176a0a6ebd5d83 - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0x08d7c0242953446436f34b4c78fe9da38c73668d - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0x8943c7bac1914c9a7aba750bf2b6b09fd21037e0 - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0x364c828ee171616a39897688a831c2499ad972ec - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0x7f36182dee28c45de6072a34d29855bae76dbe2f - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0xf61f24c2d93bf2de187546b14425bf631f28d6dc - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0x797a48c46be32aafcedcfd3d8992493d8a1f256b - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0x123b30e25973fecd8354dd5f41cc45a3065ef88c - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0x6632a9d63e142f17a668064d41a21193b49b41a0 - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0xf4ee95274741437636e748ddac70818b4ed7d043 - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0x57a204aa1042f6e66dd7730813f4024114d74f37 - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0xd1258db6ac08eb0e625b75b371c023da478e94a9 - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0x75e95ba5997eb235f40ecf8347cdb11f18ff640b - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0xd532b88607b1877fe20c181cba2550e3bbd6b31c - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0xa1d4657e0e6507d5a94d06da93e94dc7c8c44b51 - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0xedb61f74b0d09b2558f1eeb79b247c1f363ae452 - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0x7d8820fa92eb1584636f4f5b8515b5476b75171a - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0x231d3559aa848bf10366fb9868590f01d34bf240 - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0xad9fd7cb4fc7a0fbce08d64068f60cbde22ed34c - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0x0e9d6552b85be180d941f1ca73ae3e318d2d4f1f - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0xb716600ed99b4710152582a124c697a7fe78adbf - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0xaadc2d4261199ce24a4b0a57370c4fcf43bb60aa - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0x4e1f41613c9084fdb9e34e11fae9412427480e56 - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0x79986af15539de2db9a5086382daeda917a9cf0c - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0xc99c679c50033bbc5321eb88752e89a93e9e83c5 - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0xc36cf0cfcb5d905b8b513860db0cfe63f6cf9f5c - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0x9c8ff314c9bc7f6e59a9d9225fb22946427edc03 - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0x3110ef5f612208724ca51f5761a69081809f03b7 - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0x036721e5a769cc48b3189efbb9cce4471e8a48b1 - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0x524cab2ec69124574082676e6f654a18df49a048 - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0x7ab2352b1d2e185560494d5e577f9d3c238b78c5 - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0x32973908faee0bf825a343000fe412ebe56f802a - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0x7daec605e9e2a1717326eedfd660601e2753a057 - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0xc1caf0c19a8ac28c41fe59ba6c754e4b9bd54de9 - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0x33fd426905f149f8376e227d0c9d3340aad17af1 - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0x466cfcd0525189b573e794f554b8a751279213ac - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0x6be69b2a9b153737887cfcdca7781ed1511c7e36 - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0x80336ad7a747236ef41f47ed2c7641828a480baa - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0x9401518f4ebba857baa879d9f76e1cc8b31ed197 - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0x4b61413d4392c806e6d0ff5ee91e6073c21d6430 - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0xc3f733ca98e0dad0386979eb96fb1722a1a05e69 - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0x09233d553058c2f42ba751c87816a8e9fae7ef10 - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0x960b7a6bcd451c9968473f7bbfd9be826efd549a - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0x36d30b3b85255473d27dd0f7fd8f35e36a9d6f06 - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0x698fbaaca64944376e2cdc4cad86eaa91362cf54 - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0x497a9a79e82e6fc0ff10a16f6f75e6fcd5ae65a8 - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0x41a322b28d0ff354040e2cbc676f0320d8c8850d - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0xa9c0a07a7cb84ad1f2ffab06de3e55aab7d523e8 - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0x942bc2d3e7a589fe5bd4a5c6ef9727dfd82f5c8a - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0xb47e3cd837ddf8e4c57f05d70ab865de6e193bbb - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0x8821bee2ba0df28761afff119d66390d594cd280 - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0x8c6def540b83471664edc6d5cf75883986932674 - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0x8d9710f0e193d3f95c0723eaaf1a81030dc9116d - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0x86825dfca7a6224cfbd2da48e85df2fc3aa7c4b1 - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0x629a673a8242c2ac4b7b8c5d8735fbeac21a6205 - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0x9a534628b4062e123ce7ee2222ec20b86e16ca8f - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0xc2c747e0f7004f9e8817db2ca4997657a7746928 - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0x73da73ef3a6982109c4d5bdb0db9dd3e3783f313 - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0xc92ceddfb8dd984a89fb494c376f9a48b999aafc - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0x3248e8ba90facc4fdd3814518c14f8cc4d980e4b - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0x67d9417c9c3c250f61a83c7e8658dac487b56b09 - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0xb6a37b5d14d502c3ab0ae6f3a0e058bc9517786e - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0x86c10d10eca1fca9daf87a279abccabe0063f247 - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0x4b3406a41399c7fd2ba65cbc93697ad9e7ea61e5 - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0xb0640e8b5f24bedc63c33d371923d68fde020303 - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0xd3d9ddd0cf0a5f0bfb8f7fceae075df687eaebab - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0xa5c0bd78d1667c13bfb403e2a3336871396713c5 - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0x4d7d2e237d64d1484660b55c0a4cc092fa5e6716 - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0xfcb1315c4273954f74cb16d5b663dbf479eec62e - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0x66d1db16101502ed0ca428842c619ca7b62c8fef - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0x128675d4fddbc4a0d3f8aa777d8ee0fb8b427c2f - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0x19b86299c21505cdf59ce63740b240a9c822b5e4 - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0xacf63e56fd08970b43401492a02f6f38b6635c91 - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0x0bebad1ff25c623dff9605dad4a8f782d5da37df - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0xdceaf1652a131f32a821468dc03a92df0edd86ea - 2025-04-11T20:35:02.652Z - 0.7 - - - https://app.uniswap.org/nfts/collection/0x273f7f8e6489682df756151f5525576e322d51a3 - 2025-04-11T20:35:02.652Z - 0.7 - - - https://app.uniswap.org/nfts/collection/0x77372a4cc66063575b05b44481f059be356964a4 - 2025-04-11T20:35:02.652Z - 0.7 - - - https://app.uniswap.org/nfts/collection/0xf5b0a3efb8e8e4c201e2a935f110eaaf3ffecb8d - 2025-04-11T20:35:02.652Z - 0.7 - - - https://app.uniswap.org/nfts/collection/0x22c36bfdcef207f9c0cc941936eff94d4246d14a - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0x59325733eb952a92e069c87f0a6168b29e80627f - 2025-04-11T20:35:02.652Z - 0.7 - - - https://app.uniswap.org/nfts/collection/0x0e3a2a1f2146d86a604adc220b4967a898d7fe07 - 2025-04-11T20:35:02.652Z - 0.7 - - - https://app.uniswap.org/nfts/collection/0x3af2a97414d1101e2107a70e7f33955da1346305 - 2025-04-11T20:35:02.652Z - 0.7 - - - https://app.uniswap.org/nfts/collection/0x5ab21ec0bfa0b29545230395e3adaca7d552c948 - 2025-04-11T20:35:02.652Z - 0.7 - - - https://app.uniswap.org/nfts/collection/0x617913dd43dbdf4236b85ec7bdf9adfd7e35b340 - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 - https://app.uniswap.org/nfts/collection/0x3fe1a4c1481c8351e91b64d5c398b159de07cbc5 - 2025-04-11T20:35:02.652Z + https://app.uniswap.org/nfts/collection/0xd4e4078ca3495de5b1d4db434bebc5a986197782 + 2025-03-20T21:18:53.078Z 0.7 - https://app.uniswap.org/nfts/collection/0xd4e4078ca3495de5b1d4db434bebc5a986197782 - 2025-04-11T20:35:02.652Z + https://app.uniswap.org/nfts/collection/0x77372a4cc66063575b05b44481f059be356964a4 + 2025-03-20T21:18:53.078Z 0.7 https://app.uniswap.org/nfts/collection/0x062e691c2054de82f28008a8ccc6d7a1c8ce060d - 2025-04-11T20:35:02.652Z + 2025-03-20T21:18:53.078Z 0.7 \ No newline at end of file diff --git a/apps/web/public/pools-sitemap.xml b/apps/web/public/pools-sitemap.xml index 03d6f39b07c..279edd061cb 100644 --- a/apps/web/public/pools-sitemap.xml +++ b/apps/web/public/pools-sitemap.xml @@ -2,13132 +2,8147 @@ https://app.uniswap.org/explore/pools/ethereum/0xcbcdf9626bc03e24f779434178a73a0b4bad62ed - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x88e6a0c2ddd26feeb64f039a2c41296fcb3f5640 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x8ad599c3a0ff1de082011efddc58f1908eb6e6d8 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x4e68ccd3e89f51c3074ca5072bbac773960dfa36 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x4585fe77225b41b697c938b018e2ac67ac5a20c0 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xc63b0708e2f7e69cb8a1df0e1389a98c35a76d52 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x99ac8ca7087fa4a2a1fb6357269965a2014abc35 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x11b815efb8f581194ae79006d24e0d814b7697f6 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xa6cc3c2531fdaa6ae1a3ca84c2855806728693e8 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x5777d92f208679db4b9778590fa3cab3ac9e2168 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x1d42064fc4beb5f8aaf85f4617ae8b3b5b8bd801 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xc2e9f25be6257c210d7adf0d4cd6e3e881ba25f8 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x11950d141ecb863f01007add7d1a342041227b58 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xc5c134a1f112efa96003f8559dba6fac0ba77692 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x109830a1aaad605bbf02a9dfa7b0b92ec2fb7daa - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x1df4c6e36d61416813b42fe32724ef11e363eddc - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x12d6867fa648d269835cf69b49f125147754b54d - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x3416cf6c708da44db2624d63ea0aaef7113527c6 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xe8c6c9227491c0a8156a0106a0204d881bb7e531 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x04708077eca6bb527a5bbbd6358ffb043a9c1c14 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x9db9e0e53058c89e5b94e29621a205198648425b - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xf239009a101b6b930a527deaab6961b6e7dec8a6 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xfe0df74636bc25c7f2400f22fe7dae32d39443d2 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xf4c5e0f4590b6679b3030d29a84857f226087fef - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x5764a6f2212d502bc5970f9f129ffcd61e5d7563 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xa3f558aebaecaf0e11ca4b2199cc5ed341edfd74 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x99132b53ab44694eeb372e87bced3929e4ab8456 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x6c6bc977e13df9b0de53b251522280bb72383700 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x9d96880952b4c80a55099b9c258250f2cc5813ec - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x3afdc5e6dfc0b0a507a8e023c9dce2cafc310316 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x290a6a7460b308ee3f19023d2d00de604bcf5b42 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xac4b3dacb91461209ae9d41ec517c2b9cb1b7daf - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x60594a405d53811d3bc4766596efd80fd545a270 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x331399c614ca67dee86733e5a2fba40dbb16827c - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x4b5ab61593a2401b1075b90c04cbcdd3f87ce011 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x844eb5c280f38c7462316aad3f338ef9bda62668 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xe936f0073549ad8b1fa53583600d629ba9375161 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x2f62f2b4c5fcd7570a709dec05d68ea19c82a9ec - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x381fe4eb128db1621647ca00965da3f9e09f4fac - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x97e7d56a0408570ba1a7852de36350f7713906ec - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xcd423f3ab39a11ff1d9208b7d37df56e902c932b - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xe15e6583425700993bd08f51bf6e7b73cd5da91b - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x69d91b94f0aaf8e8a2586909fa77a5c2c89818d5 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xe42318ea3b998e8355a3da364eb9d48ec725eb45 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xad9ef19e289dcbc9ab27b83d2df53cdeff60f02d - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x3b685307c8611afb2a9e83ebc8743dc20480716e - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x7bea39867e4169dbe237d55c8242a8f2fcdcc387 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x7b1e5d984a43ee732de195628d20d05cfabc3cc7 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x7858e59e0c01ea06df3af3d20ac7b0003275d4bf - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xae2a25cbdb19d0dc0dddd1d2f6b08a6e48c4a9a9 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x21b8065d10f73ee2e260e5b47d3344d3ced7596e - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x0d4a11d5eeaac28ec3f61d100daf4d40471f1852 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x517f9dd285e75b599234f7221227339478d0fcc8 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xb4e16d0168e52d35cacd2c6185b44281ec28c9dc - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xa43fe16908251ee70ef74718545e4fe6c5ccec9f - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x0af81cd5d9c124b4859d65697a4cd10ee223746a - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xca7c2771d248dcbe09eabe0ce57a62e18da178c0 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x09d1d767edf8fa23a64c51fa559e0688e526812f - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x7b73644935b8e68019ac6356c40661e1bc315860 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x180efc1349a69390ade25667487a826164c9c6e4 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x9c4fe5ffd9a9fc5678cfbd93aa2d4fd684b67c4c - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xa478c2975ab1ea89e8196811f51a7b7ade33eb11 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xbb2b8038a1640196fbe3e38816f3e67cba72d940 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x9ec9367b8c4dd45ec8e7b800b1f719251053ad60 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xc91ef786fbf6d62858262c82c63de45085dea659 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x197d7010147df7b99e9025c724f13723b29313f8 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x25647e01bd0967c1b9599fa3521939871d1d0888 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x2f0b1417aa42ebf0b4ca1154212847f6094d708d - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x6ada49aeccf6e556bb7a35ef0119cc8ca795294a - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x2a6c340bcbb0a79d3deecd3bc5cbc2605ea9259f - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xda2d09fbbf8ee4b5051a0e9b562c5fcb4b393b18 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x48d20b3e529fb3dd7d91293f80638df582ab2daa - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x4028daac072e492d34a3afdbef0ba7e35d8b55c4 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xc2eab7d33d3cb97692ecb231a5d0e4a649cb539d - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xc5be99a02c6857f9eac67bbce58df5572498f40c - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xe4b8583ccb95b25737c016ac88e539d0605949e8 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x8dbee21e8586ee356130074aaa789c33159921ca - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x43de4318b6eb91a7cf37975dbb574396a7b5b5c6 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x9ff68f61ca5eb0c6606dc517a9d44001e564bb66 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xa29fe6ef9592b5d408cca961d0fb9b1faf497d6d - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x1b1137dd16faa651e38a9dfb5d9ffff7767fdf62 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x470e8de2ebaef52014a47cb5e6af86884947f08c - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x8fb8e9921922d2ffb529a95d28a0d06d275d7a59 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xd3d2e2692501a5c9ca623199d38826e513033a17 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x97e1fcb93ae7267dbafad23f7b9afaa08264cfd8 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xa5e9c917b4b821e4e0a5bbefce078ab6540d6b5e - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x2cc846fff0b08fb3bffad71f53a60b4b6e6d6482 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x959873fb4fc11825fba83c80c4c632db1e936e15 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xa7480aafa8ad2af3ce24ac6853f960ae6ac7f0c4 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xc7e6b676bfc73ae40bcc4577f22aab1682c691c6 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x570febdf89c07f256c75686caca215289bb11cfc - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x343fd171caf4f0287ae6b87d75a8964dc44516ab - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xcaa004418eb42cdf00cb057b7c9e28f0ffd840a5 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xe3d3551bb608e7665472180a20280630d9e938aa - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xb6b0c651c37ec4ca81c0a128420e02001a57fac2 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x4e34da137f0b317c633838458e0c923a5e088752 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xfe9e7931e55c514c33d489c88582fa36e84bd8e3 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x5281e311734869c64ca60ef047fd87759397efe6 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x149148acc3b06b8cc73af3a10e84189243a35925 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x8ef79d6c328c25da633559c20c75f638a4863462 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x14af1804dbbf7d621ecc2901eef292a24a0260ea - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x80a9ae39310abf666a87c743d6ebbd0e8c42158e - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xc31e54c7a869b9fcbecc14363cf510d1c41fa443 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x2f5e87c9312fa29aed5c179e456625d79015299c - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xc6962004f452be9203591991d15f6b388e09e8d0 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xc6f780497a95e246eb9449f5e4770916dcd6396a - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x641c00a822e8b671738d32a431a4fb6074e5c79d - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x92c63d0e701caae670c9415d91c474f686298f00 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x1aeedd3727a6431b8f070c0afaa81cc74f273882 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xcda53b1f66614552f834ceef361a8d12a0b8dad8 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x35218a1cbac5bbc3e57fd9bd38219d37571b3537 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x17c14d2c404d167802b16c450d3c99f88f2c4f4d - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x468b88941e7cc0b88c1869d68ab6b570bcef62ff - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xdbaeb7f0dfe3a0aafd798ccecb5b22e708f7852c - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x149e36e72726e0bcea5c59d40df2c43f60f5a22d - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xbaaf1fc002e31cb12b99e4119e5e350911ec575b - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xa67f72f21bd9f91db2da2d260590da5e6c437009 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x92fd143a8fa0c84e016c2765648b9733b0aa519e - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x7cf803e8d82a50504180f417b8bc7a493c0a0503 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x81c48d31365e6b526f6bbadc5c9aafd822134863 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x446bf9748b4ea044dd759d9b9311c70491df8f29 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xc82819f72a9e77e2c0c3a69b3196478f44303cf4 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x50c7390dfdd3756139e6efb5a461c2eb7331ceb4 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x1dfc1054e0e2a10e33c9ca21aad5aa8a1cce91e3 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xc91b7b39bbb2c733f0e7459348fd0c80259c8471 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x59d72ddb29da32847a4665d08ffc8464a7185fae - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x09ba302a3f5ad2bf8853266e271b005a5b3716fe - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xa77d77c9773c35e910acc2e30cefe52b54a58414 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x8da66e470403b3d3eee66c67e2c61fda6e248ad1 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x2f020e708811c054f146eebcc4d5a215fd4eec26 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x7e7fb3cceca5f2ac952edf221fd2a9f62e411980 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x68c685fd52a56f04665b491d491355a624540e85 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xa8328bf492ba1b77ad6381b3f7567d942b000baf - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xc0cf0f380ddb44dbcaf19a86d094c8bba3efa04a - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xa169d1ab5c948555954d38700a6cdaa7a4e0c3a0 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x1862200e8e7ce1c0827b792d0f9546156f44f892 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x05bbaaa020ff6bea107a9a1e06d2feb7bfd79ed2 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xd02a4969dc12bb889754361f8bcf3385ac1b2077 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xc24f7d8e51a64dc1238880bd00bb961d54cbeb29 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x7c06736e41236fecd681dd3353aa77ecd19ea565 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xc473e2aee3441bf9240be85eb122abb059a3b57c - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x14353445c8329df76e6f15e9ead18fa2d45a8bb6 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x2039f8c9cd32ba9cd2ea7e575d5b1abea93f7527 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xd3e11119d2680c963f1cdcffece0c4ade823fb58 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x8e295789c9465487074a65b1ae9ce0351172393f - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x97bca422ec0ee4851f2110ea743c1cd0a14835a1 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xbe3ad6a5669dc0b8b12febc03608860c31e2eef6 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x56ebd63a756b94d3de9cea194896b4920b64fb01 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xe2ddd33585b441b9245085588169f35108f85a6e - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x84436a2af97f37018db116ae8e1b691666db3d00 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x21b8065d10f73ee2e260e5b47d3344d3ced7596e - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x0d4a11d5eeaac28ec3f61d100daf4d40471f1852 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x517f9dd285e75b599234f7221227339478d0fcc8 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xb4e16d0168e52d35cacd2c6185b44281ec28c9dc - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xa43fe16908251ee70ef74718545e4fe6c5ccec9f - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x0af81cd5d9c124b4859d65697a4cd10ee223746a - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xca7c2771d248dcbe09eabe0ce57a62e18da178c0 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x09d1d767edf8fa23a64c51fa559e0688e526812f - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x7b73644935b8e68019ac6356c40661e1bc315860 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x180efc1349a69390ade25667487a826164c9c6e4 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x9c4fe5ffd9a9fc5678cfbd93aa2d4fd684b67c4c - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xa478c2975ab1ea89e8196811f51a7b7ade33eb11 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xbb2b8038a1640196fbe3e38816f3e67cba72d940 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x9ec9367b8c4dd45ec8e7b800b1f719251053ad60 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xc91ef786fbf6d62858262c82c63de45085dea659 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x197d7010147df7b99e9025c724f13723b29313f8 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x25647e01bd0967c1b9599fa3521939871d1d0888 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x2f0b1417aa42ebf0b4ca1154212847f6094d708d - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x6ada49aeccf6e556bb7a35ef0119cc8ca795294a - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x2a6c340bcbb0a79d3deecd3bc5cbc2605ea9259f - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xda2d09fbbf8ee4b5051a0e9b562c5fcb4b393b18 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x48d20b3e529fb3dd7d91293f80638df582ab2daa - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x4028daac072e492d34a3afdbef0ba7e35d8b55c4 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xc2eab7d33d3cb97692ecb231a5d0e4a649cb539d - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xc5be99a02c6857f9eac67bbce58df5572498f40c - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xe4b8583ccb95b25737c016ac88e539d0605949e8 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x8dbee21e8586ee356130074aaa789c33159921ca - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x43de4318b6eb91a7cf37975dbb574396a7b5b5c6 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x9ff68f61ca5eb0c6606dc517a9d44001e564bb66 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xa29fe6ef9592b5d408cca961d0fb9b1faf497d6d - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x1b1137dd16faa651e38a9dfb5d9ffff7767fdf62 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x470e8de2ebaef52014a47cb5e6af86884947f08c - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x8fb8e9921922d2ffb529a95d28a0d06d275d7a59 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xd3d2e2692501a5c9ca623199d38826e513033a17 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x97e1fcb93ae7267dbafad23f7b9afaa08264cfd8 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xa5e9c917b4b821e4e0a5bbefce078ab6540d6b5e - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x2cc846fff0b08fb3bffad71f53a60b4b6e6d6482 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x959873fb4fc11825fba83c80c4c632db1e936e15 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xa7480aafa8ad2af3ce24ac6853f960ae6ac7f0c4 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xc7e6b676bfc73ae40bcc4577f22aab1682c691c6 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x570febdf89c07f256c75686caca215289bb11cfc - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x343fd171caf4f0287ae6b87d75a8964dc44516ab - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xcaa004418eb42cdf00cb057b7c9e28f0ffd840a5 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xe3d3551bb608e7665472180a20280630d9e938aa - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xb6b0c651c37ec4ca81c0a128420e02001a57fac2 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x4e34da137f0b317c633838458e0c923a5e088752 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xfe9e7931e55c514c33d489c88582fa36e84bd8e3 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x5281e311734869c64ca60ef047fd87759397efe6 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x149148acc3b06b8cc73af3a10e84189243a35925 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x8ef79d6c328c25da633559c20c75f638a4863462 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x68f5c0a2de713a54991e01858fd27a3832401849 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x4533bad2dc588f0fadf8d2e72386d4cd6a19b519 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x85149247691df622eaf1a8bd0cafd40bc45154a9 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x0392b358ce4547601befa962680bede836606ae2 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x1c3140ab59d6caf9fa7459c6f83d4b52ba881d36 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xd1f1bad4c9e6c44dec1e9bf3b94902205c5cd6c3 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x03af20bdaaffb4cc0a521796a223f7d85e2aac31 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x73b14a78a0d396c521f954532d43fd5ffe385216 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xac85eaf55e9c60ed40a683de7e549d23fdfbeb33 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x04f6c85a1b00f6d9b75f91fd23835974cc07e65c - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x730691cdac3cbd4d41fc5eb9d8abbb0cea795b94 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x535541f1aa08416e69dc4d610131099fa2ae7222 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xfc1f3296458f9b2a27a0b91dd7681c4020e09d05 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x85c31ffa3706d1cce9d525a00f1c7d4a2911754c - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xd52533a3309b393afebe3176620e8ccfb6159f8a - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xff7fbdf7832ae524deda39ca402e03d92adff7a5 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xb589969d38ce76d3d7aa319de7133bc9755fd840 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xf334f6104a179207ddacfb41fa3567feea8595c2 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x1fb3cf6e48f1e7b10213e7b6d87d4c073c7fdb7b - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xd4344ea0c5ade7e22b9b275f0bde7a145dec5a23 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x5b42a63d6741416ce9a7b9f4f16d8c9231ccddd4 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x252cbdff917169775be2b552ec9f6781af95e7f6 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x2ab22ac86b25bd448a4d9dc041bd2384655299c4 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xc858a329bf053be78d6239c4a4343b8fbd21472b - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xa73c628eaf6e283e26a7b1f8001cf186aa4c0e8e - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xb533c12fb4e7b53b5524eab9b47d93ff6c7a456f - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x2ae3d6096d8215ac2acddf30c60caa984ea5debe - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x19ea026886cbb7a900ecb2458636d72b5cae223b - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x6f32061f59a21086c334d0d45f804089ce374aaf - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xfaf037caafa9620bfaebc04c298bf4a104963613 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xadb35413ec50e0afe41039eac8b930d313e94fa4 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xe9e3893921de87b1194a8108f9d70c24bde71c27 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xf1f199342687a7d78bcc16fce79fa2665ef870e1 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xf44acaa38be5e965c5ddf374e7a2ba270e580684 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x36e42931a765022790b797963e42c5522d6b585a - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x5adba6c5589c50791dd65131df29677595c7efa7 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x3249e3e3e4133ee18e65347daf586610cc265f54 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xca1b837c87c6563910c2befa48834fa2a8c3d72d - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x6ef7b14bcd8d989cef8f8ec8ba4bf371b2ac95fd - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x37ffd11972128fd624337ebceb167c8c0a5115ff - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xe62bd99a9501ca33d98913105fc2bec5bae6e5dd - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xb2ac2e5a3684411254d58b1c5a542212b782114d - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xb0efaf46a1de55c54f333f93b1f0641e73bc16d0 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xd0fa3b5264ccde31e8b094b86bca4a1e97d3c603 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xad4c666fc170b468b19988959eb931a3676f0e9f - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x790fde1fd6d2568050061a88c375d5c2e06b140b - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xaefc1edaede6adadcdf3bb344577d45a80b19582 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xa8a5356ee5d02fe33d72355e4f698782f8f199e8 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x55bc964fe3b0c8cc2d4c63d65f1be7aef9bb1a3c - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x95d9d28606ee55de7667f0f176ebfc3215cfd9c0 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x21b8065d10f73ee2e260e5b47d3344d3ced7596e - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x0d4a11d5eeaac28ec3f61d100daf4d40471f1852 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x517f9dd285e75b599234f7221227339478d0fcc8 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xb4e16d0168e52d35cacd2c6185b44281ec28c9dc - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xa43fe16908251ee70ef74718545e4fe6c5ccec9f - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x0af81cd5d9c124b4859d65697a4cd10ee223746a - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xca7c2771d248dcbe09eabe0ce57a62e18da178c0 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x09d1d767edf8fa23a64c51fa559e0688e526812f - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x7b73644935b8e68019ac6356c40661e1bc315860 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x180efc1349a69390ade25667487a826164c9c6e4 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x9c4fe5ffd9a9fc5678cfbd93aa2d4fd684b67c4c - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xa478c2975ab1ea89e8196811f51a7b7ade33eb11 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xbb2b8038a1640196fbe3e38816f3e67cba72d940 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x9ec9367b8c4dd45ec8e7b800b1f719251053ad60 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xc91ef786fbf6d62858262c82c63de45085dea659 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x197d7010147df7b99e9025c724f13723b29313f8 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x25647e01bd0967c1b9599fa3521939871d1d0888 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x2f0b1417aa42ebf0b4ca1154212847f6094d708d - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x6ada49aeccf6e556bb7a35ef0119cc8ca795294a - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x2a6c340bcbb0a79d3deecd3bc5cbc2605ea9259f - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xda2d09fbbf8ee4b5051a0e9b562c5fcb4b393b18 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x48d20b3e529fb3dd7d91293f80638df582ab2daa - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x4028daac072e492d34a3afdbef0ba7e35d8b55c4 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xc2eab7d33d3cb97692ecb231a5d0e4a649cb539d - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xc5be99a02c6857f9eac67bbce58df5572498f40c - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xe4b8583ccb95b25737c016ac88e539d0605949e8 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x8dbee21e8586ee356130074aaa789c33159921ca - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x43de4318b6eb91a7cf37975dbb574396a7b5b5c6 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x9ff68f61ca5eb0c6606dc517a9d44001e564bb66 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xa29fe6ef9592b5d408cca961d0fb9b1faf497d6d - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x1b1137dd16faa651e38a9dfb5d9ffff7767fdf62 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x470e8de2ebaef52014a47cb5e6af86884947f08c - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x8fb8e9921922d2ffb529a95d28a0d06d275d7a59 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xd3d2e2692501a5c9ca623199d38826e513033a17 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x97e1fcb93ae7267dbafad23f7b9afaa08264cfd8 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xa5e9c917b4b821e4e0a5bbefce078ab6540d6b5e - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x2cc846fff0b08fb3bffad71f53a60b4b6e6d6482 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x959873fb4fc11825fba83c80c4c632db1e936e15 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xa7480aafa8ad2af3ce24ac6853f960ae6ac7f0c4 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xc7e6b676bfc73ae40bcc4577f22aab1682c691c6 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x570febdf89c07f256c75686caca215289bb11cfc - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x343fd171caf4f0287ae6b87d75a8964dc44516ab - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xcaa004418eb42cdf00cb057b7c9e28f0ffd840a5 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xe3d3551bb608e7665472180a20280630d9e938aa - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xb6b0c651c37ec4ca81c0a128420e02001a57fac2 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x4e34da137f0b317c633838458e0c923a5e088752 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xfe9e7931e55c514c33d489c88582fa36e84bd8e3 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x5281e311734869c64ca60ef047fd87759397efe6 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x149148acc3b06b8cc73af3a10e84189243a35925 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x8ef79d6c328c25da633559c20c75f638a4863462 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x45dda9cb7c25131df268515131f647d726f50608 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x50eaedb835021e4a108b7290636d62e9765cc6d7 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x167384319b41f7094e62f7506409eb38079abff8 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xa374094527e1673a86de625aa59517c5de346d32 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x86f1d8390222a3691c28938ec7404a1661e618e0 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xeda1094f59a4781456734e5d258b95e6be20b983 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x847b64f9d3a95e977d157866447a5c0a5dfa0ee5 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x94ab9e4553ffb839431e37cc79ba8905f45bfbea - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x0e44ceb592acfc5d3f09d996302eb4c499ff8c10 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x1e5bd2ab4c308396c06c182e1b7e7ba8b2935b83 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x9b08288c3be4f62bbf8d1c20ac9c5e6f9467d8b7 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xb6e57ed85c4c9dbfef2a68711e9d6f36c56e0fcb - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x3e31ab7f37c048fc6574189135d108df80f0ea26 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xd36ec33c8bed5a9f7b6630855f1533455b98a418 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xdac8a8e6dbf8c690ec6815e0ff03491b2770255d - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xfe343675878100b344802a6763fd373fdeed07a4 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x0a28c2f5e0e8463e047c203f00f649812ae67e4f - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x88f3c15523544835ff6c738ddb30995339ad57d6 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x98b9162161164de1ed182a0dfa08f5fbf0f733ca - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xeef1a9507b3d505f0062f2be9453981255b503c8 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xc4c06c9a239f94fc0a1d3e04d23c159ebe8316f1 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x849ec65748107aedc518dbc42961f358ea1361a7 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x2db87c4831b2fec2e35591221455834193b50d1b - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xa4d8c89f0c20efbe54cba9e7e7a7e509056228d9 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x642f28a89fa9d0fa30e664f71804bfdd7341d21f - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x2aceda63b5e958c45bd27d916ba701bc1dc08f7a - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x781067ef296e5c4a4203f81c593274824b7c185d - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x4ccd010148379ea531d6c587cfdd60180196f9b1 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xd866fac7db79994d08c0ca2221fee08935595b4b - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x941061770214613ba0ca3db9a700c39587bb89b6 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xa9077cdb3d13f45b8b9d87c43e11bce0e73d8631 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xa01f64fa1b923dd9c5c7618b39a6ba8098a88863 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xa830ff28bb7a46570a7e43dc24a35a663b9cfc2e - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x8837a61644d523cbe5216dde226f8f85e3aa9be3 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xca5d44977d6de1846530eb434167b208752fba7d - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x4d05f2a005e6f36633778416764e82d1d12e7fbb - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x41e64a5bc929fa8e6a9c8d7e3b81a13b21ff3045 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x3ea34cfc9322273311f7843826a2581c4a00fd39 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x785061ed819414dc4269d2a5d5974069c0daea96 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x3f5228d0e7d75467366be7de2c31d0d098ba2c23 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x2e3f22e9a1c2470b2e293351f48c99e1fd788f32 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x2a08c38c7e1fa969325e2b64047abb085dec3756 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xe6c36eed27c2e8ecb9a233bf12da06c9730b5955 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xefa98fdf168f372e5e9e9b910fcdfd65856f3986 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x76fa081e510f43ac8335efdb4db88c9ff1894413 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xc6832ef0af793336aa44a936e54b992bff47e7cd - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x865f456479a21e2b3d866561d7171a3d0a7b112d - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xbd934a7778771a7e2d9bf80596002a214d8c9304 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x9ab9f658104467604b5afa9a3e1df62f35f7b208 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x6e430d59ba145c59b73a6db674fe3d53c1f31cae - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x21b8065d10f73ee2e260e5b47d3344d3ced7596e - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x0d4a11d5eeaac28ec3f61d100daf4d40471f1852 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x517f9dd285e75b599234f7221227339478d0fcc8 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xb4e16d0168e52d35cacd2c6185b44281ec28c9dc - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xa43fe16908251ee70ef74718545e4fe6c5ccec9f - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x0af81cd5d9c124b4859d65697a4cd10ee223746a - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xca7c2771d248dcbe09eabe0ce57a62e18da178c0 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x09d1d767edf8fa23a64c51fa559e0688e526812f - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x7b73644935b8e68019ac6356c40661e1bc315860 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x180efc1349a69390ade25667487a826164c9c6e4 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x9c4fe5ffd9a9fc5678cfbd93aa2d4fd684b67c4c - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xa478c2975ab1ea89e8196811f51a7b7ade33eb11 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xbb2b8038a1640196fbe3e38816f3e67cba72d940 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x9ec9367b8c4dd45ec8e7b800b1f719251053ad60 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xc91ef786fbf6d62858262c82c63de45085dea659 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x197d7010147df7b99e9025c724f13723b29313f8 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x25647e01bd0967c1b9599fa3521939871d1d0888 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x2f0b1417aa42ebf0b4ca1154212847f6094d708d - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x6ada49aeccf6e556bb7a35ef0119cc8ca795294a - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x2a6c340bcbb0a79d3deecd3bc5cbc2605ea9259f - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xda2d09fbbf8ee4b5051a0e9b562c5fcb4b393b18 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x48d20b3e529fb3dd7d91293f80638df582ab2daa - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x4028daac072e492d34a3afdbef0ba7e35d8b55c4 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xc2eab7d33d3cb97692ecb231a5d0e4a649cb539d - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xc5be99a02c6857f9eac67bbce58df5572498f40c - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xe4b8583ccb95b25737c016ac88e539d0605949e8 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x8dbee21e8586ee356130074aaa789c33159921ca - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x43de4318b6eb91a7cf37975dbb574396a7b5b5c6 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x9ff68f61ca5eb0c6606dc517a9d44001e564bb66 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xa29fe6ef9592b5d408cca961d0fb9b1faf497d6d - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x1b1137dd16faa651e38a9dfb5d9ffff7767fdf62 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x470e8de2ebaef52014a47cb5e6af86884947f08c - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x8fb8e9921922d2ffb529a95d28a0d06d275d7a59 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xd3d2e2692501a5c9ca623199d38826e513033a17 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x97e1fcb93ae7267dbafad23f7b9afaa08264cfd8 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xa5e9c917b4b821e4e0a5bbefce078ab6540d6b5e - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x2cc846fff0b08fb3bffad71f53a60b4b6e6d6482 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x959873fb4fc11825fba83c80c4c632db1e936e15 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xa7480aafa8ad2af3ce24ac6853f960ae6ac7f0c4 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xc7e6b676bfc73ae40bcc4577f22aab1682c691c6 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x570febdf89c07f256c75686caca215289bb11cfc - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x343fd171caf4f0287ae6b87d75a8964dc44516ab - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xcaa004418eb42cdf00cb057b7c9e28f0ffd840a5 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xe3d3551bb608e7665472180a20280630d9e938aa - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xb6b0c651c37ec4ca81c0a128420e02001a57fac2 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x4e34da137f0b317c633838458e0c923a5e088752 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xfe9e7931e55c514c33d489c88582fa36e84bd8e3 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x5281e311734869c64ca60ef047fd87759397efe6 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x149148acc3b06b8cc73af3a10e84189243a35925 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x8ef79d6c328c25da633559c20c75f638a4863462 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0x9e37cb775a047ae99fc5a24dded834127c4180cd - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0x48413707b70355597404018e7c603b261fcadf3f - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0xade9bcd4b968ee26bed102dd43a55f6a8c2416df - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0xda679706ff21114ac9fac5198bff24543f357a16 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0xba3f945812a83471d709bce9c3ca699a19fb46f7 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0xc9034c3e7f58003e6ae0c8438e7c8f4598d5acaa - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0x4c36388be6f416a29c8d8eee81c771ce6be14b18 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0xa1b2457c0b627f97f6cc892946a382451e979014 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0x4b0aaf3ebb163dd45f663b38b6d93f6093ebc2d3 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0xae2ce200bdb67c472030b31f602f0756c9aeb61c - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0x3bc5180d5439b500f381f9a46f15dd6608101671 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0x5122e02898ece3bc62df8c1efdb29a9e914244d3 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0x24e1cbd6fed006ceed9af0dce688acc7951d57a9 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0x2556230ac694093d4d3b7b965a2f2d77d4c403a4 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0xdaca082c2c7d052a96fa83ea9d3a7b6839e39586 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0xa555149210075702a734968f338d5e1cbd509354 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0x10648ba41b8565907cfa1496765fa4d95390aa0d - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0x00bcec1526dae1e170a53017b8775a93b7810d7c - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0x20e068d76f9e90b90604500b84c7e19dcb923e7e - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0x6b93950a9b589bc32b82a5df4e5148f98a7fae27 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0xd9caa6dbe6791fcb7fc9fb59d1a6b3dd8c1c2339 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0x62e81e93136ac42a1ada48d4098f5f9e703e7455 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0x84206d33845c9d811438b6fe4e7a0c634748dc50 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0xd0b53d9277642d899df5c87a3966a349a798f224 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0xcfa7c4bb565915f1c4f9475e2a0536d31efad776 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0xa7de21f28ca460b45373b217cd4eb111c3faeff8 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0xb64dff20dd5c47e6dbb56ead80d23568006dec1e - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0xad4e969f4193878e5cc89cefb57faf6c7c0048da - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0xdf5eb97e3e23ca7f5a5fd2264680377c211310ba - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0xf16baaae8eb7b37f4280e72924479f69e7a61f32 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0xe745a591970e0fa981204cf525e170a2b9e4fb93 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0x64b74c66b9ba60ca668b781289767ae7298f37ae - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0x17e1ebd791e7253a5e606fd94c5b66c14d873136 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0x46715bd57b9ec01deadb35fe096fb44acda79414 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0x3447accd4b8e735329d1065244aad2ed630f0122 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0x2feb7f3ffc243f7de94d5ea5975533d301584e07 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0x0d5959a52e7004b601f0be70618d01ac3cdce976 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0x2170ca774e48a3f51559917ada6f9d7ae8f7bfea - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0x62a76dfa8951aefcff787e790782db3633ebf422 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0x8073679e0b3b2d1d665777cf1b2b5b1c2d3d2d0c - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0x143f1a6f3fb32e6ab3f22d3cc6b417b5c2197599 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0x82ad659c2f152aad59bb37cbc5e7663a2de0c607 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0xa4efe9e8e2a2d5a2ac46805f233b8e49d0e11955 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0xfcc89a1f250d76de198767d33e1ca9138a7fb54b - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0x2faa2b42b782d578a160f61bb7cd763a17476730 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0xdd44c0e83c2570062d1e6fdd440b4724862e8f31 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0xe3930a14641786e123e7bbe842d701fa1cbfe2df - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0x6d03360ce4764e862ed81660c1f76cc2711b14b6 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0xc055f66f228105072315247785c00299d0ce27e8 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0xcae1d141ab11cef0a415cf0440025e1e5e962e06 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0x21b8065d10f73ee2e260e5b47d3344d3ced7596e - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0x0d4a11d5eeaac28ec3f61d100daf4d40471f1852 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0x517f9dd285e75b599234f7221227339478d0fcc8 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0xb4e16d0168e52d35cacd2c6185b44281ec28c9dc - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0xa43fe16908251ee70ef74718545e4fe6c5ccec9f - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0x0af81cd5d9c124b4859d65697a4cd10ee223746a - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0xca7c2771d248dcbe09eabe0ce57a62e18da178c0 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0x09d1d767edf8fa23a64c51fa559e0688e526812f - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0x7b73644935b8e68019ac6356c40661e1bc315860 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0x180efc1349a69390ade25667487a826164c9c6e4 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0x9c4fe5ffd9a9fc5678cfbd93aa2d4fd684b67c4c - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0xa478c2975ab1ea89e8196811f51a7b7ade33eb11 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0xbb2b8038a1640196fbe3e38816f3e67cba72d940 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0x9ec9367b8c4dd45ec8e7b800b1f719251053ad60 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0xc91ef786fbf6d62858262c82c63de45085dea659 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0x197d7010147df7b99e9025c724f13723b29313f8 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0x25647e01bd0967c1b9599fa3521939871d1d0888 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0x2f0b1417aa42ebf0b4ca1154212847f6094d708d - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0x6ada49aeccf6e556bb7a35ef0119cc8ca795294a - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0x2a6c340bcbb0a79d3deecd3bc5cbc2605ea9259f - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0xda2d09fbbf8ee4b5051a0e9b562c5fcb4b393b18 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0x48d20b3e529fb3dd7d91293f80638df582ab2daa - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0x4028daac072e492d34a3afdbef0ba7e35d8b55c4 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0xc2eab7d33d3cb97692ecb231a5d0e4a649cb539d - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0xc5be99a02c6857f9eac67bbce58df5572498f40c - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0xe4b8583ccb95b25737c016ac88e539d0605949e8 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0x8dbee21e8586ee356130074aaa789c33159921ca - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0x43de4318b6eb91a7cf37975dbb574396a7b5b5c6 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0x9ff68f61ca5eb0c6606dc517a9d44001e564bb66 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0xa29fe6ef9592b5d408cca961d0fb9b1faf497d6d - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0x1b1137dd16faa651e38a9dfb5d9ffff7767fdf62 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0x470e8de2ebaef52014a47cb5e6af86884947f08c - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0x8fb8e9921922d2ffb529a95d28a0d06d275d7a59 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0xd3d2e2692501a5c9ca623199d38826e513033a17 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0x97e1fcb93ae7267dbafad23f7b9afaa08264cfd8 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0xa5e9c917b4b821e4e0a5bbefce078ab6540d6b5e - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0x2cc846fff0b08fb3bffad71f53a60b4b6e6d6482 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0x959873fb4fc11825fba83c80c4c632db1e936e15 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0xa7480aafa8ad2af3ce24ac6853f960ae6ac7f0c4 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0xc7e6b676bfc73ae40bcc4577f22aab1682c691c6 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0x570febdf89c07f256c75686caca215289bb11cfc - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0x343fd171caf4f0287ae6b87d75a8964dc44516ab - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0xcaa004418eb42cdf00cb057b7c9e28f0ffd840a5 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0xe3d3551bb608e7665472180a20280630d9e938aa - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0xb6b0c651c37ec4ca81c0a128420e02001a57fac2 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0x4e34da137f0b317c633838458e0c923a5e088752 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0xfe9e7931e55c514c33d489c88582fa36e84bd8e3 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0x5281e311734869c64ca60ef047fd87759397efe6 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0x149148acc3b06b8cc73af3a10e84189243a35925 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0x8ef79d6c328c25da633559c20c75f638a4863462 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x0f338ec12d3f7c3d77a4b9fcc1f95f3fb6ad0ea6 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x4eaa90264d6a3567228dcb5cfc242200da586437 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x6fe9e9de56356f7edbfcbb29fab7cd69471a4869 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xf420603317a0996a3fce1b1a80993eaef6f7ae1a - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x47a90a2d92a8367a91efa1906bfc8c1e05bf10c4 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x41bf5eeae051fbd2e97b76b5f8f0fdcc1a1e526b - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x28df0835942396b7a1b7ae1cd068728e6ddbbafd - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xa3f3664a52f01b42557524bd14556e379daf5669 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x1fd22fa7274bafebdfb1881321709f1219744829 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xe39cfc1a2e51a09ecbd060a24ee4eef5a97697bb - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x06396509195eb9e07c38a016694dc9ff535b128a - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x5a1c486edefda2f09d3b349fadc38524f1743826 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x5bf1cf153c102a79d9e18b7fb7c79ba57fa70d0c - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x2c3c320d49019d4f9a92352e947c7e5acfe47d68 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x4141325bac36affe9db165e854982230a14e6d48 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x17507bef4c3abc1bc715be723ee1baf571256e05 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x8149b92ea743cc382aada523b68b8834733b9015 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xc98f01bf2141e1140ef8f8cad99d4b021d10718f - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x7f9d307973cdabe42769d9712df8ee1cc1a28d10 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x5c87da28a45e5089b762dcbbd86f743d14c54317 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x2cd97604ef77bbcb1fa0cff47545dff8ec7def08 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x7862d9b4be2156b15d54f41ee4ede2d5b0b455e4 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x554548b404213c7efcdbab933f52edfe3c581834 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x63008c5ea4e47f5421e0e1428b1c5043a507d0d0 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x0350ca994791c4b07a5b02b08aaf9d6fc8ab510e - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x32776ed4d96ed069a2d812773f0ad8ad9ef83cf8 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x84f3ca9b7a1579ff74059bd0e8929424d3fa330e - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x5289a8dbf7029ee0b0498a84777ed3941d9acfec - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xb2bc284ab4c953b7f7a06d59c0ceb2de26405f22 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x508acf810857fefa86281499068ad5d19ebce325 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xccdfcd1aac447d5b29980f64b831c532a6a33726 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x4fb87838a29b37598099ef5aa6b3fbeeef987c50 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x515e94dc736b9d8b7d28ecf1cece0aba3d75da97 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xfd6e5b7c30538dff2752058e425ad01a56b831cc - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xcb99fe720124129520f7a09ca3cbef78d58ed934 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xd2f21358c1549be193537b2a4c5dc7f0228ae011 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x93094ed1c907e4bca7eb041cb659da94f7e1b58e - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xd37e6ecb991d1a0e7610c89666817665713362a7 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x73234630bd159384c8d43f145407312d64614f43 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xad1ddf00c4ae50573e4dc98e6c5ee93baa04a0c4 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xa765593c821f7df9ad81119509a37961e7ffa6c5 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x9b501a7ad3087d603ceb34424b7b2a6c348ad0b7 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xafebb7cfa1a15fcac4121b609b456cbce3137c20 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x0adaf134ae0c4583b3a38fc3168a83e33162651e - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xf9878a5dd55edc120fde01893ea713a4f032229c - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x84e47c7f2fe86f6b5efbe14fee46b8bb871b2e05 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xf3e5bec78654049990965f666b0612e116b94fb2 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x33e59edd3214e97cb68450c6d3d6c167de072aba - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x2ca76c7e466e560e0cb11a91269bb953e41254bc - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xbb124e35ab9e85f8d59ba83500e559dc052b9368 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x21b8065d10f73ee2e260e5b47d3344d3ced7596e - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x0d4a11d5eeaac28ec3f61d100daf4d40471f1852 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x517f9dd285e75b599234f7221227339478d0fcc8 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xb4e16d0168e52d35cacd2c6185b44281ec28c9dc - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xa43fe16908251ee70ef74718545e4fe6c5ccec9f - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x0af81cd5d9c124b4859d65697a4cd10ee223746a - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xca7c2771d248dcbe09eabe0ce57a62e18da178c0 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x09d1d767edf8fa23a64c51fa559e0688e526812f - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x7b73644935b8e68019ac6356c40661e1bc315860 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x180efc1349a69390ade25667487a826164c9c6e4 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x9c4fe5ffd9a9fc5678cfbd93aa2d4fd684b67c4c - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xa478c2975ab1ea89e8196811f51a7b7ade33eb11 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xbb2b8038a1640196fbe3e38816f3e67cba72d940 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x9ec9367b8c4dd45ec8e7b800b1f719251053ad60 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xc91ef786fbf6d62858262c82c63de45085dea659 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x197d7010147df7b99e9025c724f13723b29313f8 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x25647e01bd0967c1b9599fa3521939871d1d0888 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x2f0b1417aa42ebf0b4ca1154212847f6094d708d - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x6ada49aeccf6e556bb7a35ef0119cc8ca795294a - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x2a6c340bcbb0a79d3deecd3bc5cbc2605ea9259f - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xda2d09fbbf8ee4b5051a0e9b562c5fcb4b393b18 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x48d20b3e529fb3dd7d91293f80638df582ab2daa - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x4028daac072e492d34a3afdbef0ba7e35d8b55c4 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xc2eab7d33d3cb97692ecb231a5d0e4a649cb539d - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xc5be99a02c6857f9eac67bbce58df5572498f40c - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xe4b8583ccb95b25737c016ac88e539d0605949e8 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x8dbee21e8586ee356130074aaa789c33159921ca - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x43de4318b6eb91a7cf37975dbb574396a7b5b5c6 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x9ff68f61ca5eb0c6606dc517a9d44001e564bb66 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xa29fe6ef9592b5d408cca961d0fb9b1faf497d6d - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x1b1137dd16faa651e38a9dfb5d9ffff7767fdf62 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x470e8de2ebaef52014a47cb5e6af86884947f08c - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x8fb8e9921922d2ffb529a95d28a0d06d275d7a59 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xd3d2e2692501a5c9ca623199d38826e513033a17 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x97e1fcb93ae7267dbafad23f7b9afaa08264cfd8 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xa5e9c917b4b821e4e0a5bbefce078ab6540d6b5e - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x2cc846fff0b08fb3bffad71f53a60b4b6e6d6482 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x959873fb4fc11825fba83c80c4c632db1e936e15 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xa7480aafa8ad2af3ce24ac6853f960ae6ac7f0c4 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xc7e6b676bfc73ae40bcc4577f22aab1682c691c6 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x570febdf89c07f256c75686caca215289bb11cfc - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x343fd171caf4f0287ae6b87d75a8964dc44516ab - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xcaa004418eb42cdf00cb057b7c9e28f0ffd840a5 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xe3d3551bb608e7665472180a20280630d9e938aa - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xb6b0c651c37ec4ca81c0a128420e02001a57fac2 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x4e34da137f0b317c633838458e0c923a5e088752 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xfe9e7931e55c514c33d489c88582fa36e84bd8e3 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x5281e311734869c64ca60ef047fd87759397efe6 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x149148acc3b06b8cc73af3a10e84189243a35925 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x8ef79d6c328c25da633559c20c75f638a4863462 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/celo/0xd88d5f9e6c10e6febc9296a454f6c2589b1e8fae - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/celo/0xb90fe7da36ac89448e6dfd7f2bb1e90a66659977 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/celo/0xbd6313d0796984c578cae6bc5b5e23b27c5540c5 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/celo/0x1f18cd7d1c7ba0dbe3d9abe0d3ec84ce1ad10066 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/celo/0x7da99753ff017f1b7afb2c8c0542718dc9f15f21 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/celo/0x079e7a44f42e9cd2442c3b9536244be634e8f888 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/celo/0x1c8dafd358d308b880f71edb5170b010b106ca60 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/celo/0xbd0f6f34baa3c1329448a69bab90111a20756f01 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/celo/0x3420720e561f3082f1e514a4545f0f2e0c955a5d - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/celo/0xea3fb6e3313a2a90757e4ca3d6749efd0107b0b6 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/celo/0xf130f72f8190f662522774c3367e6e8814f5e219 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/celo/0x4a46c053bd5c10a959aea258228217b9d3405f3d - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/celo/0xb83258bf5940c98abf54f26c5a02710bd6b83b2c - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/celo/0x6a209c5329f0a225fa1890d4177823c096016f34 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/celo/0xdb24905b1b080f65dedb0ad978aad5c76363d3c6 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/celo/0xddff2cdad11898b901a661e32e9fa010780263a0 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/celo/0x72dd8fe09b5b493012e5816068dfc6fb26a2a9e6 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/celo/0x54fc722a66abfb6500a36d8b7b2646129d0e836a - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/celo/0x53b612b32233c80ec439a64325a29766ce95be7f - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/celo/0xe5edcbe72d1bc223097a1bed1fe6c0e404b4290c - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/celo/0xb928c37b8bd9754d321dc3d3c6ef374d332fe761 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/celo/0x2d70cbabf4d8e61d5317b62cbe912935fd94e0fe - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/celo/0x953e2937f0515c43ca7995e80c84aedcbbb9385e - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/celo/0x84394d80830ae963b599ded7d9149b90059f182f - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/celo/0xa1777e082fa1746eb78dd9c1fbb515419cf6e538 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/celo/0x112466c8b6e5abe42c78c47eb1b9d40baa3f943c - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/celo/0x9491d57c5687ab75726423b55ac2d87d1cda2c3f - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/celo/0x978799f1845c00c9a4d9fd2629b9ce18df66e488 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/celo/0xdc55d1fd1c04e005051a40bd59c5f95623257bc5 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/celo/0x34757893070b0fc5de37aaf2844255ff90f7f1e0 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/celo/0x7faf167615419228f3f7d71d52d840dab154913c - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/celo/0xa4d7b6a50dd4c55334ca6f175dbc6561f269d264 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/celo/0x0ed413cefde954d8e5c54d981d7d182b587e98e3 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/celo/0x524375d0c6a04439128428f400b00eae81a2e9e4 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/celo/0x4b7a4530d56ff55a4dce089d917ede812e543307 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/celo/0x84bb5b9bf1b6782c87cfa3e396f2f571c8e49646 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/celo/0x723292eea7e1576ae482a5c317934054c0199e24 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/celo/0x9b42940e8184d866aac6595a91f8d8952a59d3b9 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/celo/0x37622453c614f625d288151101ffe48fd222ced1 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/celo/0x4a94130b9e8eb0a0959c2c0f1ee9583213773fd9 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/celo/0x51514b3dc24afc1db95586242b99f0063bea17c5 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/celo/0xc130254e9196d48bbd9f91240390a6e8203132e9 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/celo/0x60ac25da2ada3be14a2a8c04e45b072bed965966 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/celo/0x4e392a3883a84225260ff857318517eb50e5d128 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/celo/0xca0aa06385a42242fe9523cd7015f6d01cd8f6b2 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/celo/0x3e448c17043ce1481bbe53c0fd19481bad8b98a6 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/celo/0x81060e6bf2a683f208b8799a33c7c09830cabed1 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/celo/0x463fe9f646b61ccfb43a022bf947075411cd71c7 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/celo/0x21b8065d10f73ee2e260e5b47d3344d3ced7596e - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/celo/0x0d4a11d5eeaac28ec3f61d100daf4d40471f1852 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/celo/0x517f9dd285e75b599234f7221227339478d0fcc8 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/celo/0xb4e16d0168e52d35cacd2c6185b44281ec28c9dc - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/celo/0xa43fe16908251ee70ef74718545e4fe6c5ccec9f - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/celo/0x0af81cd5d9c124b4859d65697a4cd10ee223746a - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/celo/0xca7c2771d248dcbe09eabe0ce57a62e18da178c0 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/celo/0x09d1d767edf8fa23a64c51fa559e0688e526812f - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/celo/0x7b73644935b8e68019ac6356c40661e1bc315860 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/celo/0x180efc1349a69390ade25667487a826164c9c6e4 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/celo/0x9c4fe5ffd9a9fc5678cfbd93aa2d4fd684b67c4c - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/celo/0xa478c2975ab1ea89e8196811f51a7b7ade33eb11 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/celo/0xbb2b8038a1640196fbe3e38816f3e67cba72d940 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/celo/0x9ec9367b8c4dd45ec8e7b800b1f719251053ad60 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/celo/0xc91ef786fbf6d62858262c82c63de45085dea659 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/celo/0x197d7010147df7b99e9025c724f13723b29313f8 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/celo/0x25647e01bd0967c1b9599fa3521939871d1d0888 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/celo/0x2f0b1417aa42ebf0b4ca1154212847f6094d708d - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/celo/0x6ada49aeccf6e556bb7a35ef0119cc8ca795294a - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/celo/0x2a6c340bcbb0a79d3deecd3bc5cbc2605ea9259f - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/celo/0xda2d09fbbf8ee4b5051a0e9b562c5fcb4b393b18 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/celo/0x48d20b3e529fb3dd7d91293f80638df582ab2daa - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/celo/0x4028daac072e492d34a3afdbef0ba7e35d8b55c4 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/celo/0xc2eab7d33d3cb97692ecb231a5d0e4a649cb539d - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/celo/0xc5be99a02c6857f9eac67bbce58df5572498f40c - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/celo/0xe4b8583ccb95b25737c016ac88e539d0605949e8 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/celo/0x8dbee21e8586ee356130074aaa789c33159921ca - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/celo/0x43de4318b6eb91a7cf37975dbb574396a7b5b5c6 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/celo/0x9ff68f61ca5eb0c6606dc517a9d44001e564bb66 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/celo/0xa29fe6ef9592b5d408cca961d0fb9b1faf497d6d - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/celo/0x1b1137dd16faa651e38a9dfb5d9ffff7767fdf62 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/celo/0x470e8de2ebaef52014a47cb5e6af86884947f08c - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/celo/0x8fb8e9921922d2ffb529a95d28a0d06d275d7a59 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/celo/0xd3d2e2692501a5c9ca623199d38826e513033a17 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/celo/0x97e1fcb93ae7267dbafad23f7b9afaa08264cfd8 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/celo/0xa5e9c917b4b821e4e0a5bbefce078ab6540d6b5e - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/celo/0x2cc846fff0b08fb3bffad71f53a60b4b6e6d6482 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/celo/0x959873fb4fc11825fba83c80c4c632db1e936e15 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/celo/0xa7480aafa8ad2af3ce24ac6853f960ae6ac7f0c4 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/celo/0xc7e6b676bfc73ae40bcc4577f22aab1682c691c6 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/celo/0x570febdf89c07f256c75686caca215289bb11cfc - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/celo/0x343fd171caf4f0287ae6b87d75a8964dc44516ab - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/celo/0xcaa004418eb42cdf00cb057b7c9e28f0ffd840a5 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/celo/0xe3d3551bb608e7665472180a20280630d9e938aa - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/celo/0xb6b0c651c37ec4ca81c0a128420e02001a57fac2 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/celo/0x4e34da137f0b317c633838458e0c923a5e088752 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/celo/0xfe9e7931e55c514c33d489c88582fa36e84bd8e3 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/celo/0x5281e311734869c64ca60ef047fd87759397efe6 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/celo/0x149148acc3b06b8cc73af3a10e84189243a35925 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/celo/0x8ef79d6c328c25da633559c20c75f638a4863462 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x0f23d49bc92ec52ff591d091b3e16c937034496e - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x0f23d49bc92ec52ff591d091b3e16c937034496e - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xbf16ef186e715668aa29cef57e2fd7f9d48adfe6 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x0f23d49bc92ec52ff591d091b3e16c937034496e - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x5645dcb64c059aa11212707fbf4e7f984440a8cf - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x0f23d49bc92ec52ff591d091b3e16c937034496e - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0x3ad4913fa896391c9822a81d8d869cc0d783bdd7 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0x0f23d49bc92ec52ff591d091b3e16c937034496e - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x0f23d49bc92ec52ff591d091b3e16c937034496e - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/celo/0x0f23d49bc92ec52ff591d091b3e16c937034496e - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x7a415b19932c0105c82fdb6b720bb01b0cc2cae3 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x9b3423373e6e786c9ac367120533abe4ee398373 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x4a25dbdf9629b1782c3e2c7de3bdce41f1c7f801 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xbe80225f09645f172b079394312220637c440a63 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x059615ebf32c946aaab3d44491f78e4f8e97e1d3 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x435664008f38b0650fbc1c9fc971d0a3bc2f1e47 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x4b62fa30fea125e43780dc425c2be5acb4ba743b - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xc3db44adc1fcdfd5671f555236eae49f4a8eea18 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xddd23787a6b80a794d952f5fb036d0b31a8e6aff - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xa86aca6d7c393c06dcdc30473ea3d1b05c358dff - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x1ffec7119e315b15852557f654ae0052f76e6ae1 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x0f027d40c80d8f70f77d3884776531f80b21d20e - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x69c66beafb06674db41b22cfc50c34a93b8d82a2 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xeedff72a683058f8ff531e8c98575f920430fdc5 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x811cfb75567a252bea23474e2ccd1286927bfe0a - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x2caccf71bdf8fff97c06a46eca29b611b1a74b5e - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0xf07a84f0732dfe8eea0d3961bcd8f62c761ff508 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/ethereum/0x8c1c499b1796d7f3c2521ac37186b52de024e58c - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xe5cf22ee4988d54141b77050967e1052bd9c7f7a - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x7f580f8a02b759c350e6b8340e7c2d4b8162b6a9 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x48b0ab72c2591849e678e7d6f272b75ef9b863f7 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x74d0ae8b8e1fca6039707564704a25ad2ee036b0 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x5969efdde3cf5c0d9a88ae51e47d721096a97203 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xe32efff8f8b5fdc53803405aa3f623f03f8a8767 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xe8629b6a488f366d27dad801d1b5b445199e2ada - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x066b28f0c160935cf285f75ed600967bf8417035 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xddd23787a6b80a794d952f5fb036d0b31a8e6aff - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xa86aca6d7c393c06dcdc30473ea3d1b05c358dff - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x1ffec7119e315b15852557f654ae0052f76e6ae1 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x0f027d40c80d8f70f77d3884776531f80b21d20e - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x69c66beafb06674db41b22cfc50c34a93b8d82a2 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xeedff72a683058f8ff531e8c98575f920430fdc5 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x811cfb75567a252bea23474e2ccd1286927bfe0a - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x2caccf71bdf8fff97c06a46eca29b611b1a74b5e - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0xf07a84f0732dfe8eea0d3961bcd8f62c761ff508 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/arbitrum/0x8c1c499b1796d7f3c2521ac37186b52de024e58c - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x146b020399769339509c98b7b353d19130c150ec - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xd28f71e383e93c570d3edfe82ebbceb35ec6c412 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xadab76dd2dca7ae080a796f0ce86170e482afb4a - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x0fb07e6d6e1f52c839608e1436d2ea810cf07257 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xddd23787a6b80a794d952f5fb036d0b31a8e6aff - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xa86aca6d7c393c06dcdc30473ea3d1b05c358dff - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x1ffec7119e315b15852557f654ae0052f76e6ae1 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x0f027d40c80d8f70f77d3884776531f80b21d20e - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x69c66beafb06674db41b22cfc50c34a93b8d82a2 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xeedff72a683058f8ff531e8c98575f920430fdc5 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x811cfb75567a252bea23474e2ccd1286927bfe0a - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x2caccf71bdf8fff97c06a46eca29b611b1a74b5e - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/optimism/0xf07a84f0732dfe8eea0d3961bcd8f62c761ff508 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/optimism/0x8c1c499b1796d7f3c2521ac37186b52de024e58c - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x95d2483d2a0fff034004f91c53d649623d993896 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x19c5505638383337d2972ce68b493ad78e315147 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xc143161ed3ed8049bb63d8da42907c08a10e2269 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xc3286373599dd5af2a17a572ebb7561f05f88bec - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xbb98b3d2b18aef63a3178023a920971cf5f29be4 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x647fb01a63de9a551b39c7915693b25e6bcec502 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xa90c1c009dc8292bd04ced30f9b53a5ff7a806a0 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xddd23787a6b80a794d952f5fb036d0b31a8e6aff - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xa86aca6d7c393c06dcdc30473ea3d1b05c358dff - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x1ffec7119e315b15852557f654ae0052f76e6ae1 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x0f027d40c80d8f70f77d3884776531f80b21d20e - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x69c66beafb06674db41b22cfc50c34a93b8d82a2 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xeedff72a683058f8ff531e8c98575f920430fdc5 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x811cfb75567a252bea23474e2ccd1286927bfe0a - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x2caccf71bdf8fff97c06a46eca29b611b1a74b5e - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/polygon/0xf07a84f0732dfe8eea0d3961bcd8f62c761ff508 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/polygon/0x8c1c499b1796d7f3c2521ac37186b52de024e58c - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0xfb765ff72a14735550f1d798a5efd1311f2ddee7 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0x3537f2a5f99f08f59eb1417073db1fadbebf0c74 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0xde8ed0277ee0e84c25756a73ffa7374e4aeadf46 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0xd8f3a72d2b2220a5067abe8c38aea57dc2d69a5e - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0x7ec18abf80e865c6799069df91073335935c4185 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0x14b1911dd6b451c2771661ae8cd70637d726c356 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0x9ae8084c21752971d867597c07f2673765d949a1 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0xcfaf75a3d292c3535ea3acdb16ed2ee58c2bb091 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0x8055e6de251e414e8393b20adab096afb3cf8399 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0xffec10fe1355c2d8df4f62affcdeffdb04f06569 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0xc16454420f100b2e771d8bc4c5b6200068129a34 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0x046f405e4ae1d0e786eda4959adadbd417d13ad8 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0xeccb34691c06c1c9c31ceb2228b22cbd242b5879 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0xe22a2dfaaaaec8a7b2b7acb4909eaaa5c5bd6e64 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0xe2dda0911e227e73d9fd94745b851c8bc6504610 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0x0f082a7870908f8cebbb2cd27a42a9225c19f898 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0x69d667281778db0c3bc8177efea3a91ee95c3068 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0x30d61bb28a6789f9f49d8c7fb198d63b6aba4b61 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0x090f3fd9110621df127c3f9be5c6f58c02f2d5eb - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0xd56f086e7b796b313d49f2bc926fac4bdd2a2b0b - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0x7eb847a214192aab8fa1b503f4d4c9ddd2a08db6 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0x81b3bc0ef974c16d71b8614adb8c22ccc045da01 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0xc9b44ca4159dbaf5722a3dc8618e9d4b5f39d5b2 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0xbeef35a63fc62a3334630d9d3b4db27093d95317 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0x3d5d143381916280ff91407febeb52f2b60f33cf - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0x68c9325cc268df8b9ed4a06429587f28471b5f84 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0xa00cc1fb7ac185222294777c6b23a13c013f07ce - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0x77021e63bcbd3c5296b0cdd8a3c3770fb0ea8fa2 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0xcc28456d4ff980cee3457ca809a257e52cd9cdb0 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0xec0b7e8e44c9d60efd67a89dba1d4a6e02a7a4a0 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0x0c8fed5dd65542ca5f0add1acab14c2e470c9110 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0xd56da2b74ba826f19015e6b7dd9dae1903e85da1 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0x5482c2b11951bbb92b87858242e17abde802b398 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0xd95bae63641d822dc591bd4aca7a64e53eac76f9 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0x06959273e9a65433de71f5a452d529544e07ddd0 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0x24bf2ee2e09477082d1ddf2f0603baa460b3f5f3 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0x56d8f846415e08c5e663d89505e79f522d33f947 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0x548e923281f372d28a40287d3a2d30dce482fc66 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0x9d744d3d905897608d24c1b8c1c7db0d30c36cd4 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0xddd23787a6b80a794d952f5fb036d0b31a8e6aff - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0xa86aca6d7c393c06dcdc30473ea3d1b05c358dff - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0x1ffec7119e315b15852557f654ae0052f76e6ae1 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0x0f027d40c80d8f70f77d3884776531f80b21d20e - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0x69c66beafb06674db41b22cfc50c34a93b8d82a2 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0xeedff72a683058f8ff531e8c98575f920430fdc5 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0x811cfb75567a252bea23474e2ccd1286927bfe0a - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0x2caccf71bdf8fff97c06a46eca29b611b1a74b5e - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0xf07a84f0732dfe8eea0d3961bcd8f62c761ff508 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/base/0x8c1c499b1796d7f3c2521ac37186b52de024e58c - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xab46d39cb398fb3649ecba781180016fef75f50b - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x25048028ad87484b7fce99bc4e22dcb6c3307470 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xdb2177fee5b0ebdc7b8038cb70f3964bb6d14143 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x42d749f736051d8933b118324cded52d1f92bec1 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xb1a1b707b143b911c36e1a0f4f901c5017791aca - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x3319a81a316abd4c086f7048904e31ff86648b38 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x4a978a2d4fb7393063babfb0cee741b8bcd4dd4b - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xea403e36fb592fdfdc342c38e94284ddbb0d2105 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xe3fb01794d6912f0773171e32e723471ee8df061 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x916d7f23ccbb1d10118dcfc6ad5a10b6446ff73e - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xddd23787a6b80a794d952f5fb036d0b31a8e6aff - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xa86aca6d7c393c06dcdc30473ea3d1b05c358dff - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x1ffec7119e315b15852557f654ae0052f76e6ae1 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x0f027d40c80d8f70f77d3884776531f80b21d20e - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x69c66beafb06674db41b22cfc50c34a93b8d82a2 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xeedff72a683058f8ff531e8c98575f920430fdc5 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x811cfb75567a252bea23474e2ccd1286927bfe0a - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x2caccf71bdf8fff97c06a46eca29b611b1a74b5e - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xf07a84f0732dfe8eea0d3961bcd8f62c761ff508 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/bnb/0x8c1c499b1796d7f3c2521ac37186b52de024e58c - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/celo/0x6cde5f5a192fbf3fd84df983aa6dc30dbd9f8fac - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/celo/0xd80d28850bebe6208433c298334392bc940b4fc7 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/celo/0x7f7c4335ccac291ddedcef4429a626c442b627ed - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/celo/0x628cb3a5a206956423d158009612813b64b19dab - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/celo/0x116361f4f45e310347b43cd098fdfa459760ea7f - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/celo/0x5dc631ad6c26bea1a59fbf2c2680cf3df43d249f - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/celo/0x1a810e0b6c2dd5629afa2f0c898b9512c6f78846 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/celo/0xac1cb6d3d419da9ead0b53e62d6fb4bb53473523 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/celo/0x0115d04a88990889471a88e85817aac9e961c07b - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/celo/0xd3409b7f3f54bb097433d0f4cd31c48ac33e569b - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/celo/0x493bfc1adb2e60805693197f23132350ffd2a04e - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/celo/0xcf4f103759770c21f945413781ca787620316988 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/celo/0xb135ebde27d366b0d62e579bae4118cb991b820e - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/celo/0xecbc2f008c20729b9239317408367377c5473812 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/celo/0x96e0c440d3377c2dfe4f2a82add0b045e46cbe64 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/celo/0x6f5304c22ac77e228e8af4732ac6677c46e09030 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/celo/0xcb037f27eb3952222810966e28e0ceb650c65cd9 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/celo/0xddd23787a6b80a794d952f5fb036d0b31a8e6aff - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/celo/0xa86aca6d7c393c06dcdc30473ea3d1b05c358dff - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/celo/0x1ffec7119e315b15852557f654ae0052f76e6ae1 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/celo/0x0f027d40c80d8f70f77d3884776531f80b21d20e - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/celo/0x69c66beafb06674db41b22cfc50c34a93b8d82a2 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/celo/0xeedff72a683058f8ff531e8c98575f920430fdc5 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/celo/0x811cfb75567a252bea23474e2ccd1286927bfe0a - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/celo/0x2caccf71bdf8fff97c06a46eca29b611b1a74b5e - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/celo/0xf07a84f0732dfe8eea0d3961bcd8f62c761ff508 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/celo/0x8c1c499b1796d7f3c2521ac37186b52de024e58c - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/ethereum/0x7baece5d47f1bc5e1953fbe0e9931d54dab6d810 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/ethereum/0x6dcba3657ee750a51a13a235b4ed081317da3066 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/ethereum/0x83abecf7204d5afc1bea5df734f085f2535a9976 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/ethereum/0x56534741cd8b152df6d48adf7ac51f75169a83b2 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/ethereum/0x4eefe02fce5b53ca33c7717bbd8ad3c9cb0609f1 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/ethereum/0xe8f7c89c5efa061e340f2d2f206ec78fd8f7e124 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/ethereum/0xaf996125e98b5804c00ffdb4f7ff386307c99a00 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/ethereum/0x87428a53e14d24ab19c6ca4939b4df93b8996ca9 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/ethereum/0x7924a818013f39cf800f5589ff1f1f0def54f31f - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/ethereum/0x99950bae3d0b79b8bee86a8a208ae1b087b9dcb0 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/arbitrum/0xb2eb5849e2606f99fc492e9add0103c667f806d3 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/ethereum/0xcbfb0745b8489973bf7b334d54fdbd573df7ef3c + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/arbitrum/0x53c6ca2597711ca7a73b6921faf4031eedf71339 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/ethereum/0x5ab53ee1d50eef2c1dd3d5402789cd27bb52c1bb + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/arbitrum/0x4eefe02fce5b53ca33c7717bbd8ad3c9cb0609f1 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/ethereum/0xf8e349d1d827a6edf17ee673664cfad4ca78c533 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/arbitrum/0xaf996125e98b5804c00ffdb4f7ff386307c99a00 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/ethereum/0x202a6012894ae5c288ea824cbc8a9bfb26a49b93 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/arbitrum/0x7924a818013f39cf800f5589ff1f1f0def54f31f - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/ethereum/0xc1cd3d0913f4633b43fcddbcd7342bc9b71c676f + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/optimism/0xd35937ecd47b04a1474f8569f457fc5ac395921a - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/ethereum/0x5d27fdd96c8e4028edbabf3d667be24769425199 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/optimism/0x4eefe02fce5b53ca33c7717bbd8ad3c9cb0609f1 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/ethereum/0xfb82dd4d657033133eea6e5b7015042984c5825f + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/optimism/0xaf996125e98b5804c00ffdb4f7ff386307c99a00 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/ethereum/0xe333e366503f620e0242796431dc74fffd258e66 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/optimism/0x7924a818013f39cf800f5589ff1f1f0def54f31f - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/ethereum/0xb2c86ff752f18499b70e8f642b3421405d50d6e9 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/polygon/0x6b75f2189f0e11c52e814e09e280eb1a9a8a094a - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/ethereum/0x9dbe5dffaeb4ac2e0ac14f8b4e08b3bc55de5232 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/polygon/0xb372b5abdb7c2ab8ad9e614be9835a42d0009153 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/ethereum/0xa7b3bcc6c88da2856867d29f11c67c3a85634882 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/polygon/0xf369277650ad6654f25412ea8bfbd5942733babc - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/ethereum/0x543842cbfef3b3f5614b2153c28936967218a0e6 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/polygon/0x4eefe02fce5b53ca33c7717bbd8ad3c9cb0609f1 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/ethereum/0x127452f3f9cdc0389b0bf59ce6131aa3bd763598 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/polygon/0xaf996125e98b5804c00ffdb4f7ff386307c99a00 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/ethereum/0xdd2e0d86a45e4ef9bd490c2809e6405720cc357c + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/polygon/0x7924a818013f39cf800f5589ff1f1f0def54f31f - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/ethereum/0x9a772018fbd77fcd2d25657e5c547baff3fd7d16 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/base/0x4898cf312fbff8814cab80a8d7f6ee5ad0dc73fb - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/ethereum/0x73a38006d23517a1d383c88929b2014f8835b38b + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/base/0x5e78afc6c804d4382bede3a0712d210e657e9b4f - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/ethereum/0xc4ce8e63921b8b6cbdb8fcb6bd64cc701fb926f2 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/base/0x86b211ca7915a0c8d4659dd98242d9e801d88ab4 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/ethereum/0xd0a4c8a1a14530c7c9efdad0ba37e8cf4204d230 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/base/0xb637f7c82fd774c280e23cebc725e7cd807c66d0 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/ethereum/0xc39e83fe4e412a885c0577c08eb53bdb6548004a + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/base/0xd249c43faabc58d6dd4b0a4de598b5a956c5d8d7 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/ethereum/0xb26a868ffa4cbba926970d7ae9c6a36d088ee38c + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/base/0x1fbae785ce68b79f7ed4f7b27c3af3ef0e0bc3d4 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/ethereum/0x0c30062368eefb96bf3ade1218e685306b8e89fa + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/base/0x3c1376fb8487da57d4ffb263d9d01b578c7b586b - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/ethereum/0xab22d1d671bb5cee8735c5ba29ea651ccda48a8e + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/base/0x7b24bed19856f4bb1d4c0421cfb328026cd936bd - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/ethereum/0x52c77b0cb827afbad022e6d6caf2c44452edbc39 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/base/0x7cf887a863d81e6a483ee947dee05cb51914923c - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/ethereum/0xe46935ae80e05cdebd4a4008b6ccaa36d2845370 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/base/0x588c8cf031809486f015908864ee8699b44017e4 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/ethereum/0xc555d55279023e732ccd32d812114caf5838fd46 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/base/0x3987d38a4ff8520a8ef6bcc6f98d6da8bcd69b89 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/ethereum/0x3041cbd36888becc7bbcbc0045e3b1f144466f5f + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/base/0x4eefe02fce5b53ca33c7717bbd8ad3c9cb0609f1 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/ethereum/0x7924a818013f39cf800f5589ff1f1f0def54f31f + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/base/0xaf996125e98b5804c00ffdb4f7ff386307c99a00 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/ethereum/0xf6c4e4f339912541d3f8ed99dba64a1372af5e5b + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/base/0x7924a818013f39cf800f5589ff1f1f0def54f31f - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/ethereum/0xb771f724c504b329623b0ce9199907137670600e + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/bnb/0xde67d05242b18af00b28678db34feec883cc9cd6 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/ethereum/0xaf996125e98b5804c00ffdb4f7ff386307c99a00 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/bnb/0x4eefe02fce5b53ca33c7717bbd8ad3c9cb0609f1 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/ethereum/0x69c7bd26512f52bf6f76fab834140d13dda673ca + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/bnb/0xaf996125e98b5804c00ffdb4f7ff386307c99a00 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/ethereum/0x0b07188b12e3bba6a680e553e23c4079e98a034b + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/bnb/0x7924a818013f39cf800f5589ff1f1f0def54f31f - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/ethereum/0x5ced44f03ff443bbe14d8ea23bc24425fb89e3ed + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/celo/0x4a5a8b0108f446df7c1c8a459fcfb54e844b7343 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/ethereum/0xa1bf0e900fb272089c9fd299ea14bfccb1d1c2c0 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/celo/0xf6ba006abf768ab2d1b5bba2d22d9f13eb1269d4 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/ethereum/0xaf21b0ec0197e63a5c6cc30c8e947eb8165c6212 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/celo/0x4eefe02fce5b53ca33c7717bbd8ad3c9cb0609f1 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/ethereum/0x0da7096f14303eddd634c0241963c064e0244984 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/celo/0xaf996125e98b5804c00ffdb4f7ff386307c99a00 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/ethereum/0x2aeee741fa1e21120a21e57db9ee545428e683c9 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/celo/0x7924a818013f39cf800f5589ff1f1f0def54f31f - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/ethereum/0x96aa22baedc5a605357e0b9ae20ab6b10a472e03 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/ethereum/0x92c2fc5f306405eab0ff0958f6d85d7f8892cf4d - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/arbitrum/0x27807dd7adf218e1f4d885d54ed51c70efb9de50 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/ethereum/0xcbe856765eeec3fdc505ddebf9dc612da995e593 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/arbitrum/0xdd672b3b768a16b9bcb4ee1060d3e8221435beaa + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/arbitrum/0x92c2fc5f306405eab0ff0958f6d85d7f8892cf4d - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/arbitrum/0x6f38e884725a116c9c7fbf208e79fe8828a2595f + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/arbitrum/0xcbe856765eeec3fdc505ddebf9dc612da995e593 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/arbitrum/0xa95b0f5a65a769d82ab4f3e82842e45b8bbaf101 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/optimism/0xc1738d90e2e26c35784a0d3e3d8a9f795074bca4 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/arbitrum/0x4cef551255ec96d89fec975446301b5c4e164c59 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/optimism/0x92c2fc5f306405eab0ff0958f6d85d7f8892cf4d - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/arbitrum/0x421803da50d3932caa36bd1731d36a0e2af93542 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/optimism/0xcbe856765eeec3fdc505ddebf9dc612da995e593 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/arbitrum/0xbbf3209130df7d19356d72eb8a193e2d9ec5c234 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/polygon/0xda908c0bf14ad0b61ea5ebe671ac59b2ce091cbf - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/arbitrum/0x44af8d03393e498eec5fcfc7936ebc381f02974d + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/polygon/0x254aa3a898071d6a2da0db11da73b02b4646078f - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/arbitrum/0x32a5746ba6826828716cc1a394bc33301ebc7656 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/polygon/0x92c2fc5f306405eab0ff0958f6d85d7f8892cf4d - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/arbitrum/0xcb198a55e2a88841e855be4eacaad99422416b33 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/polygon/0xcbe856765eeec3fdc505ddebf9dc612da995e593 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/arbitrum/0x50e7b9293aef80c304234e86c84a01be8401c530 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/base/0x41824081f2e7beb83048bf52465ddd7c8e471da2 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/arbitrum/0xb08a8794a5d3ccca3725d92964696858d3201909 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/base/0xa0c2ce1723b3939f47ad01a293292f2f75dc629d - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/arbitrum/0x8c9d230d45d6cfee39a6680fb7cb7e8de7ea8e71 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/base/0xc42442f6402b68626e791a447d87b35cb1c6236e - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/arbitrum/0x53c6ca2597711ca7a73b6921faf4031eedf71339 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/base/0x84537db6f6aaa2afdb71f325d14b9f5f7825bef1 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/arbitrum/0x4f122edcd91af8cda38c3a87158afa8687bab57c + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/base/0x13933689ed2c6c66e83aed64336df14896efb7e2 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/arbitrum/0x4fd47e5102dfbf95541f64ed6fe13d4ed26d2546 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/base/0x92c2fc5f306405eab0ff0958f6d85d7f8892cf4d - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/arbitrum/0xa961f0473da4864c5ed28e00fcc53a3aab056c1b + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/base/0xcbe856765eeec3fdc505ddebf9dc612da995e593 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/arbitrum/0x663b1d43c27e41e5e512bf59010133997d1cd304 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/bnb/0x039df62583ddc1c5fda75db152b87113d863b6d6 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/arbitrum/0xc0f05732d1cda6f59487ceeef4390abcad86ea3e + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/bnb/0x92c2fc5f306405eab0ff0958f6d85d7f8892cf4d - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/arbitrum/0x52f9d14bed8ce6536da063aaf274ae2747ef4853 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/bnb/0xcbe856765eeec3fdc505ddebf9dc612da995e593 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/arbitrum/0x52c77b0cb827afbad022e6d6caf2c44452edbc39 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/celo/0x92c2fc5f306405eab0ff0958f6d85d7f8892cf4d - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/arbitrum/0xe46935ae80e05cdebd4a4008b6ccaa36d2845370 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/celo/0xcbe856765eeec3fdc505ddebf9dc612da995e593 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/arbitrum/0xc555d55279023e732ccd32d812114caf5838fd46 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/ethereum/0xc39e83fe4e412a885c0577c08eb53bdb6548004a - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/arbitrum/0x3041cbd36888becc7bbcbc0045e3b1f144466f5f + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/ethereum/0xdbac78be00503d10ae0074e5e5873a61fc56647c - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/arbitrum/0x7924a818013f39cf800f5589ff1f1f0def54f31f + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/ethereum/0xc1cd3d0913f4633b43fcddbcd7342bc9b71c676f - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/arbitrum/0xf6c4e4f339912541d3f8ed99dba64a1372af5e5b + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/ethereum/0x6c4c7f46d9d4ef6bc5c9e155f011ad19fc4ef321 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/arbitrum/0xb771f724c504b329623b0ce9199907137670600e + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/ethereum/0xb2c86ff752f18499b70e8f642b3421405d50d6e9 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/arbitrum/0xaf996125e98b5804c00ffdb4f7ff386307c99a00 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/ethereum/0x16588709ca8f7b84829b43cc1c5cb7e84a321b16 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/arbitrum/0x69c7bd26512f52bf6f76fab834140d13dda673ca + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/ethereum/0xd0a4c8a1a14530c7c9efdad0ba37e8cf4204d230 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/arbitrum/0x0b07188b12e3bba6a680e553e23c4079e98a034b + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/ethereum/0xf92f2e3fca01491baba0975264362cc38b1cab7b - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/arbitrum/0x5ced44f03ff443bbe14d8ea23bc24425fb89e3ed + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/ethereum/0x3e6e23198679419cd73bb6376518dcc5168c8260 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/arbitrum/0xa1bf0e900fb272089c9fd299ea14bfccb1d1c2c0 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/ethereum/0x531b6a4b3f962208ea8ed5268c642c84bb29be0b - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/arbitrum/0xaf21b0ec0197e63a5c6cc30c8e947eb8165c6212 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/ethereum/0x553e9c493678d8606d6a5ba284643db2110df823 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/arbitrum/0x0da7096f14303eddd634c0241963c064e0244984 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/ethereum/0xe3170d65018882a336743a9c396c52ea4b9c5563 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/arbitrum/0x2aeee741fa1e21120a21e57db9ee545428e683c9 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/ethereum/0x1385fc1fe0418ea0b4fcf7adc61fc7535ab7f80d - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/arbitrum/0x96aa22baedc5a605357e0b9ae20ab6b10a472e03 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/ethereum/0x5cd0ad98ba6288ed7819246a1ebc0386c32c314b - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/optimism/0xe612cb2b5644aef0ad3e922bae70a8374c63515f + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/ethereum/0xe945683b3462d2603a18bdfbb19261c6a4f03ad1 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/optimism/0xa39fe8f7a00ce28b572617d3a0bc1c2b44110e79 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/ethereum/0xa1bf0e900fb272089c9fd299ea14bfccb1d1c2c0 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/optimism/0xc4329493d7566525a4d51698a33f43ad240e9290 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/ethereum/0xe46935ae80e05cdebd4a4008b6ccaa36d2845370 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/optimism/0xd4cb5566b5c16ef2f4a08b1438052013171212a2 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/ethereum/0x3041cbd36888becc7bbcbc0045e3b1f144466f5f - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/optimism/0x9c92ed19a86986124447a73b27625230dd52f805 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/arbitrum/0x0ad1e922e764df5ab6d636f5d21ecc2e41e827f0 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/optimism/0x5e2cd0da3411449152010d8b7f2b624eb29cca59 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/arbitrum/0xe945683b3462d2603a18bdfbb19261c6a4f03ad1 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/optimism/0xc1738d90e2e26c35784a0d3e3d8a9f795074bca4 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/arbitrum/0xa1bf0e900fb272089c9fd299ea14bfccb1d1c2c0 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/optimism/0x6b3a3d6ed64faf933a7a4b1bd44b2efba47614ac + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/arbitrum/0xe46935ae80e05cdebd4a4008b6ccaa36d2845370 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/optimism/0x85e8d0fddf559a57aac6404e7695142cd53eb808 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/arbitrum/0x3041cbd36888becc7bbcbc0045e3b1f144466f5f - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/optimism/0x87dddd2e152bf1955e7e03d9f23a9dcc163eebf6 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/optimism/0x6b3a3d6ed64faf933a7a4b1bd44b2efba47614ac - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/optimism/0x679420c54cc4806d0f480925772965746d9f9779 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/optimism/0x4ce4a1a593ea9f2e6b2c05016a00a2d300c9ffd8 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/optimism/0x740601243a6aa25ce4ee2d196eef83ac3bec6c65 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/optimism/0x0843e0f56b9e7fdc4fb95fabba22a01ef4088f41 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/optimism/0x52c77b0cb827afbad022e6d6caf2c44452edbc39 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/optimism/0x8323d063b1d12acce4742f1e3ed9bc46d71f4222 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/optimism/0xe46935ae80e05cdebd4a4008b6ccaa36d2845370 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/optimism/0xe945683b3462d2603a18bdfbb19261c6a4f03ad1 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/optimism/0xc555d55279023e732ccd32d812114caf5838fd46 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/optimism/0xa1bf0e900fb272089c9fd299ea14bfccb1d1c2c0 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/optimism/0x3041cbd36888becc7bbcbc0045e3b1f144466f5f + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/optimism/0xe46935ae80e05cdebd4a4008b6ccaa36d2845370 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/optimism/0x7924a818013f39cf800f5589ff1f1f0def54f31f + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/optimism/0x3041cbd36888becc7bbcbc0045e3b1f144466f5f - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/optimism/0xf6c4e4f339912541d3f8ed99dba64a1372af5e5b + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/polygon/0xe30e4dfdbb10949c27501922f845e20cfa579f09 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/optimism/0xb771f724c504b329623b0ce9199907137670600e + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/polygon/0x7e02ae3f794ebade542c92973eb1c46d7e2e935d - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/optimism/0xaf996125e98b5804c00ffdb4f7ff386307c99a00 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/polygon/0xfa22d298e3b0bc1752e5ef2849cec1149d596674 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/optimism/0x69c7bd26512f52bf6f76fab834140d13dda673ca + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/polygon/0x8066ee17156e4184d69277e26fa8cbca3a845edf - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/optimism/0x0b07188b12e3bba6a680e553e23c4079e98a034b + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/polygon/0x418de8e0ab58abfe916a47821a055c59b9502deb - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/optimism/0x5ced44f03ff443bbe14d8ea23bc24425fb89e3ed + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/polygon/0xfb9caae5a5c0ab91f68542124c05d1efbb97d151 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/optimism/0xa1bf0e900fb272089c9fd299ea14bfccb1d1c2c0 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/polygon/0xb68606a75b117906e06caa0755896ad2b3dd0272 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/optimism/0xaf21b0ec0197e63a5c6cc30c8e947eb8165c6212 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/polygon/0x6e33c0f5e16b45114679eac217e0c0138cefcd2e - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/optimism/0x0da7096f14303eddd634c0241963c064e0244984 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/polygon/0xd64fb39a5681908ad488b487d65f5d8479cb235c - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/optimism/0x2aeee741fa1e21120a21e57db9ee545428e683c9 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/polygon/0xe945683b3462d2603a18bdfbb19261c6a4f03ad1 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/optimism/0x96aa22baedc5a605357e0b9ae20ab6b10a472e03 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/polygon/0xa1bf0e900fb272089c9fd299ea14bfccb1d1c2c0 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/polygon/0xe30e4dfdbb10949c27501922f845e20cfa579f09 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/polygon/0xe46935ae80e05cdebd4a4008b6ccaa36d2845370 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/polygon/0xda67d7c01c4c8f757c105c0890d94ac489952cd5 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/polygon/0x3041cbd36888becc7bbcbc0045e3b1f144466f5f - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/polygon/0xda908c0bf14ad0b61ea5ebe671ac59b2ce091cbf + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/base/0x0217fc17c642d29b890bcf888e21be2378493e01 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/polygon/0x254aa3a898071d6a2da0db11da73b02b4646078f + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/base/0x099d23a43da5a8a9282266dbefeaaef958150300 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/polygon/0xd9abecb39a5885d1e531ed3599adfed620e2fc8a + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/base/0xd92e0767473d1e3ff11ac036f2b1db90ad0ae55f - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/polygon/0x1f6082db7c8f4b199e17090cd5c8831a1dad1997 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/base/0xe945683b3462d2603a18bdfbb19261c6a4f03ad1 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/polygon/0x25fb97799f80433e422f47e75173314e54dae174 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/base/0xa1bf0e900fb272089c9fd299ea14bfccb1d1c2c0 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/polygon/0xf369277650ad6654f25412ea8bfbd5942733babc + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/base/0xe46935ae80e05cdebd4a4008b6ccaa36d2845370 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/polygon/0x22d1c3c541dd649ea4a8709fc787f348dc069e95 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/base/0x3041cbd36888becc7bbcbc0045e3b1f144466f5f - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/polygon/0x357faf5843c7fd7fb4e34fbeabdac16eabe8a5bc + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/bnb/0x40c547e7fd88f60d94788953b83d9342d8d133c6 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/polygon/0x019c29d5c97f8cbaa67013e2cf4b6506a5cf183a + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/bnb/0x397433498c7befde4b4049b98a7ff081a2c17387 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/polygon/0x8066ee17156e4184d69277e26fa8cbca3a845edf + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/bnb/0xf9be03505869d719ba194757943575ed2af001f2 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/polygon/0x88aaeed1fcfca2eda30749afa9ad45a75c80e292 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/bnb/0x18c40bb9281a07627ff25cea45b7511f68fd0076 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/polygon/0x0a63d3910ffc1529190e80e10855c4216407cc45 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/bnb/0x270d89e983d9821a418bf193684736414fab78c5 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/polygon/0x50defb73a76efe5d5d35cf267ffb02dfd6cd96bc + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/bnb/0xb125aa15ad943d96e813e4a06d0c34716f897e26 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/polygon/0x14653ce9f406ba7f35a7ffa43c81fa7ecd99c788 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/bnb/0x813c0decbb1097fff46d0ed6a39fb5f6a83043f4 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/polygon/0x258a4b7373f6863db5a17de191e0cebb1e0bbc8a + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/bnb/0x9a7ac628ba9f330341486380af729c8975388959 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/polygon/0x96239bd7ae3d9bc253b1cc7cf7a84f3a67ca5369 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/bnb/0xf2c9339945bff71dd0bffd3c142164112cd05dc6 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/polygon/0x56fcb902bee19a645f9607cd1e1c0737b6358feb + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/bnb/0x12a4619c0bd9710732fbc458e9baa73df6c3d35f - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/polygon/0x52c77b0cb827afbad022e6d6caf2c44452edbc39 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/bnb/0x96530dac7817f186390b64ba63d13becd079b28d - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/polygon/0xe46935ae80e05cdebd4a4008b6ccaa36d2845370 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/bnb/0x18fc1e95adb68b556212ebbad777f3fbb644db98 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/polygon/0xc555d55279023e732ccd32d812114caf5838fd46 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/bnb/0xabbeb324b090550ca6d15ec71019915813f54f90 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/polygon/0x3041cbd36888becc7bbcbc0045e3b1f144466f5f + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/bnb/0x86d708404d0db1d97843e66d4ed6b86d11be705b - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/polygon/0x7924a818013f39cf800f5589ff1f1f0def54f31f + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/bnb/0xbfbba3de6a260c8374f8299c38898312c2d6e9a6 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/polygon/0xf6c4e4f339912541d3f8ed99dba64a1372af5e5b + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/bnb/0xe945683b3462d2603a18bdfbb19261c6a4f03ad1 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/polygon/0xb771f724c504b329623b0ce9199907137670600e + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/bnb/0xa1bf0e900fb272089c9fd299ea14bfccb1d1c2c0 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/polygon/0xaf996125e98b5804c00ffdb4f7ff386307c99a00 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/bnb/0xe46935ae80e05cdebd4a4008b6ccaa36d2845370 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/polygon/0x69c7bd26512f52bf6f76fab834140d13dda673ca + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/bnb/0x3041cbd36888becc7bbcbc0045e3b1f144466f5f - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/polygon/0x0b07188b12e3bba6a680e553e23c4079e98a034b + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/celo/0xe945683b3462d2603a18bdfbb19261c6a4f03ad1 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/polygon/0x5ced44f03ff443bbe14d8ea23bc24425fb89e3ed + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/celo/0xa1bf0e900fb272089c9fd299ea14bfccb1d1c2c0 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/polygon/0xa1bf0e900fb272089c9fd299ea14bfccb1d1c2c0 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/celo/0xe46935ae80e05cdebd4a4008b6ccaa36d2845370 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/polygon/0xaf21b0ec0197e63a5c6cc30c8e947eb8165c6212 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/celo/0x3041cbd36888becc7bbcbc0045e3b1f144466f5f - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/polygon/0x0da7096f14303eddd634c0241963c064e0244984 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/ethereum/0xd31d41dffa3589bb0c0183e46a1eed983a5e5978 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/polygon/0x2aeee741fa1e21120a21e57db9ee545428e683c9 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/ethereum/0x391e8501b626c623d39474afca6f9e46c2686649 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/polygon/0x96aa22baedc5a605357e0b9ae20ab6b10a472e03 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/ethereum/0xd0fc8ba7e267f2bc56044a7715a489d851dc6d78 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/base/0xd364eb55e17700b54bd75feb3f14582ed7a29444 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/arbitrum/0x4fd47e5102dfbf95541f64ed6fe13d4ed26d2546 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/base/0xfbb6eed8e7aa03b138556eedaf5d271a5e1e43ef + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/optimism/0xe9033c0011f35547fa90d3f8a6ad4b666a590759 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/base/0x6c561b446416e1a00e8e93e221854d6ea4171372 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/optimism/0x0c3561d3b72e17378d99684414aa8669daeb8bd0 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/base/0x8c7080564b5a792a33ef2fd473fba6364d5495e5 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/polygon/0x14653ce9f406ba7f35a7ffa43c81fa7ecd99c788 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/base/0xd2fdfd5059a83e15bf362f094a2ae63f03b554ca + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/base/0x3204e9734a56a4d7c6f4f5822e14182d9d1a43c4 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/base/0x68b27e9066d3aadc6078e17c8611b37868f96a1d + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/base/0x43faefd4c0c25e969ac211cd97a4a51e52c729b7 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/base/0x037818b04ac34ea8b54b6683b79ef24d23c0e7cb + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/base/0xa652ab3be697c7a01fbdce4d73f8e8acd990251c - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/base/0xbf6ef625de5df898cc1d0f91868aae03976a2e2d + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/base/0x29962083891241aad61ad97bae46d032c9c0c55c - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/base/0x183ea22691c54806fe96555436dd312b6befac2f + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/base/0x26bf3601b77be9c31b13b22ebca02914db9c7468 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/base/0x12146c8e7469be19ec6c7f58b80246548144f8b8 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/base/0x0d2edd335982f56662d772b93d86901eb9bd2ff9 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/base/0x7aea2e8a3843516afa07293a10ac8e49906dabd1 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/base/0xbaed273edd493930711fe88690ebd1f30f7f55ab - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/base/0xc1a6fbedae68e1472dbb91fe29b51f7a0bd44f97 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/bnb/0x16033643947bf4d8a1ae37b055edf57cb183106a - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/base/0xaec085e5a5ce8d96a7bdd3eb3a62445d4f6ce703 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/celo/0xf59abf32c1e8c5d2c6e3faa2131533bbcd466194 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/base/0xa23fab21d0653c231166b31cb6274ff45eba2ee5 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/celo/0x0312187403bf72b8d2d80729894d6ac3300bd63f - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/base/0x4fe87203b27a105a772f195d3f30dea714d1ecf0 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/base/0x416fdbc4fb8d4d1f48d0d3778c59dfa5352e9b15 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/base/0x61928bf5f2895b682ecc9b13957aa5a5fe040cc0 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/ethereum/0x90908e414d3525e33733d320798b5681508255ea - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/base/0xb3fb7ccf7b681e9562c6da467db4859a8ef0b8de + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/arbitrum/0x5918aca9ae924e6eaaa3d293bb92bdec9ab79338 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/base/0xfdbaf04326acc24e3d1788333826b71e3291863a + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/arbitrum/0x8270e64d22cf13e92c641c4006408c7d7e3ff341 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/base/0x0fb597d6cfe5be0d5258a7f017599c2a4ece34c7 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/arbitrum/0x16503510c58da73486950b72a12ead3d1d8355dd - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/base/0x7b9fda92bfa6fdadfdc4f6c72c0cc8336e7d7497 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/arbitrum/0x90908e414d3525e33733d320798b5681508255ea - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/base/0xf1fdc83c3a336bdbdc9fb06e318b08eaddc82ff4 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/optimism/0x7505159f644ddc5eae21c119e328d0d5bee574b0 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/base/0x1d69099803b4580efb8df0c7ef083e550a1c42c1 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/optimism/0xe870bfe4aacb6e234b645e535d26c53790d50e78 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/base/0xa213c82265cd3d94f972f735a4f5130e34df81bc + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/optimism/0x2e2d190ad4e0d7be9569baebd4d33298379b0502 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/base/0x8c7adf7bcfdfca0a27f3d7ad49698b9e11c1f20b + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/optimism/0x90908e414d3525e33733d320798b5681508255ea - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/base/0x5116773e18a9c7bb03ebb961b38678e45e238923 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/polygon/0xb834093d7e46f7644be45e77281394d31003e866 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/base/0xb3adde966b8a1a6f22a04914ee9fe0798e71fc5b + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/polygon/0xb5a1fd804342cfb679bd8ada75718bc3ec43097e - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/base/0x9399da51c1a85e64cce4b30b554875d2b89b2445 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/polygon/0x90908e414d3525e33733d320798b5681508255ea - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/base/0x43f34a518e20b9454c94bf4026ec9024ed84a062 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/base/0x9e71e2b14d7e6d30811628ab0965f28e4e2edbce - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/base/0x9c087eb773291e50cf6c6a90ef0f4500e349b903 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/base/0xa011da4a0c9261ecf4694bf73a74d113aa261133 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/base/0x670e77c361375be9013869ccc516027ccc90383f + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/base/0x7ab922c1bfdf7df977c7531c5782074d866f3adc - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/base/0x0eb7fbe43045426938ddadc11dc41338e0907659 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/base/0xe2d2050430e341a8f3988e2726e44d9370f8cd3a - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/base/0x76bf0abd20f1e0155ce40a62615a90a709a6c3d8 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/base/0xed66ba3ea44425805a085b1ca80d00467b055b38 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/base/0x52c77b0cb827afbad022e6d6caf2c44452edbc39 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/base/0x40dade19adc198125ec237a2c48b3408568b2f81 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/base/0xe46935ae80e05cdebd4a4008b6ccaa36d2845370 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/base/0x166bc40da621d3cb978e24334f844b84ddef25f8 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/base/0xc555d55279023e732ccd32d812114caf5838fd46 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/base/0x76bf0abd20f1e0155ce40a62615a90a709a6c3d8 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/base/0x3041cbd36888becc7bbcbc0045e3b1f144466f5f + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/base/0x90908e414d3525e33733d320798b5681508255ea - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/base/0x7924a818013f39cf800f5589ff1f1f0def54f31f + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/bnb/0x6948d6c8532c6b0006cb67c6fb9c399792c8ac91 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/base/0xf6c4e4f339912541d3f8ed99dba64a1372af5e5b + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/bnb/0x90908e414d3525e33733d320798b5681508255ea - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/base/0xb771f724c504b329623b0ce9199907137670600e + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/celo/0x4e40cf4a7d8724e5adc2b791bbf9451d1e260b93 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/base/0xaf996125e98b5804c00ffdb4f7ff386307c99a00 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/celo/0x90908e414d3525e33733d320798b5681508255ea - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/base/0x69c7bd26512f52bf6f76fab834140d13dda673ca + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/ethereum/0xc0067d751fb1172dbab1fa003efe214ee8f419b6 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/base/0x0b07188b12e3bba6a680e553e23c4079e98a034b + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/ethereum/0xc3d7aa944105d3fafe07fc1822102449c916a8d0 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/base/0x5ced44f03ff443bbe14d8ea23bc24425fb89e3ed + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/arbitrum/0xd6b4cce96ddf8aab2e5750983af9a901f17fbc36 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/base/0xa1bf0e900fb272089c9fd299ea14bfccb1d1c2c0 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/arbitrum/0x4cef551255ec96d89fec975446301b5c4e164c59 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/base/0xaf21b0ec0197e63a5c6cc30c8e947eb8165c6212 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/arbitrum/0xc0067d751fb1172dbab1fa003efe214ee8f419b6 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/base/0x0da7096f14303eddd634c0241963c064e0244984 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/arbitrum/0xc3d7aa944105d3fafe07fc1822102449c916a8d0 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/base/0x2aeee741fa1e21120a21e57db9ee545428e683c9 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/optimism/0xdd0c6bae8ad5998c358b823df15a2a4181da1b80 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/base/0x96aa22baedc5a605357e0b9ae20ab6b10a472e03 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/optimism/0xc0067d751fb1172dbab1fa003efe214ee8f419b6 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/bnb/0xfe4fe5b4575c036ac6d5cccfe13660020270e27a + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/optimism/0xc3d7aa944105d3fafe07fc1822102449c916a8d0 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/bnb/0x813c0decbb1097fff46d0ed6a39fb5f6a83043f4 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/polygon/0xc0067d751fb1172dbab1fa003efe214ee8f419b6 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/bnb/0xa3adcaaf941a01eec47655c550dd5504637d029a + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/polygon/0xc3d7aa944105d3fafe07fc1822102449c916a8d0 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/bnb/0xb0bb2c1d32c7b27f21eec4402c6d1c38795c090a + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/base/0x5e6ff2fa4ca244b6b33c7286d368120822eacc11 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/bnb/0xfa7d79f971a70771e5e92bd80ab955edc8602f4d + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/base/0x98efd62b4bfbde6393b18b063c506ce5a77f4810 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/bnb/0x26b4103c8da21725909955fe85f7f6249d05dd9e + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/base/0x3c5096df639262db0a6cd0172f08709d4161094b - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/bnb/0xafa5421fe7997c16e11458659f5a87d67f1e8651 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/base/0xae31f0e673fc5f33cfc0e9abb426d8051404a7c5 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/bnb/0x86d708404d0db1d97843e66d4ed6b86d11be705b + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/base/0xc0067d751fb1172dbab1fa003efe214ee8f419b6 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/bnb/0x4d170f8714367c44787ae98259ce8adb72240067 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/base/0xc3d7aa944105d3fafe07fc1822102449c916a8d0 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/bnb/0xc0067d751fb1172dbab1fa003efe214ee8f419b6 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/bnb/0xc3d7aa944105d3fafe07fc1822102449c916a8d0 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/celo/0xd10456ce05b9af05c8eede0f93ea8aa80a0daa2f - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/celo/0x065c22a16f6531706681fabbc8df135fe6eb1c2e - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/bnb/0x7e4fb9e08cf122feb925117bace017ea234944d3 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/celo/0x8ab8d851c6b31d8a4d42fd7d3e47b20861b025f2 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/bnb/0x4094915f7849b26e8d43dee1f7e3b7b477a0b5bb + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/celo/0xc0067d751fb1172dbab1fa003efe214ee8f419b6 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/bnb/0x039df62583ddc1c5fda75db152b87113d863b6d6 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/celo/0xc3d7aa944105d3fafe07fc1822102449c916a8d0 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/bnb/0xb125aa15ad943d96e813e4a06d0c34716f897e26 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/ethereum/0x2982d3295a0e1a99e6e88ece0e93ffdfc5c761ae - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/bnb/0xb007dda6ca7a57785ce04981c30a1934995a197a + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/ethereum/0xc593fe9193b745447e86b45ea0bf62565ee030cc - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/bnb/0x16033643947bf4d8a1ae37b055edf57cb183106a + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/ethereum/0x88051b0eea095007d3bef21ab287be961f3d8598 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/bnb/0x4cd04970dcad72d09c3af2e09f15bbcd2eb1d5d4 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/ethereum/0xaf21b0ec0197e63a5c6cc30c8e947eb8165c6212 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/bnb/0xf54eba95d7f8dbe4bfeb0b6e038b3c2bedd3e40a + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/ethereum/0x9c84f58bb51fabd18698efe95f5bab4f33e96e8f - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/bnb/0x9a7ac628ba9f330341486380af729c8975388959 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/arbitrum/0xb31273fd2dfc05e6fd91a3b8a2a681aeb0fbcf48 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/bnb/0x7ef0a523c49b1dd07e3593198c5260a95ad7859a + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/arbitrum/0xaf7b48ae2f4773fd44f9208cca3db5ae7bfa7e37 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/bnb/0x70c132a2ddeccf0d76cc9b64a749ffe375a79a21 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/arbitrum/0xc2125a452115ff5a300cc2a6ffae99637f6e329d - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/bnb/0x026428e531f30b2714ceff3781d7cdf5d278e96a + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/arbitrum/0xb08a8794a5d3ccca3725d92964696858d3201909 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/bnb/0x96d5d78b179169ee0a0a0104dc514988f2a797fe + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/arbitrum/0xaf21b0ec0197e63a5c6cc30c8e947eb8165c6212 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/bnb/0x3373a22cb07cb49651b82cf6f174ef434e4dbaa8 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/arbitrum/0x9c84f58bb51fabd18698efe95f5bab4f33e96e8f - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/bnb/0x52c77b0cb827afbad022e6d6caf2c44452edbc39 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/optimism/0xae99efe6b04bbe5b8b4ad567946fb84b35681abb - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/bnb/0xe46935ae80e05cdebd4a4008b6ccaa36d2845370 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/optimism/0xaf21b0ec0197e63a5c6cc30c8e947eb8165c6212 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/bnb/0xc555d55279023e732ccd32d812114caf5838fd46 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/optimism/0x9c84f58bb51fabd18698efe95f5bab4f33e96e8f - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/bnb/0x3041cbd36888becc7bbcbc0045e3b1f144466f5f + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/polygon/0xaf21b0ec0197e63a5c6cc30c8e947eb8165c6212 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/bnb/0x7924a818013f39cf800f5589ff1f1f0def54f31f + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/polygon/0x9c84f58bb51fabd18698efe95f5bab4f33e96e8f - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/bnb/0xf6c4e4f339912541d3f8ed99dba64a1372af5e5b + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/base/0x6696710b8e3dc0d844c8b9244767962a4a61ad97 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/bnb/0xb771f724c504b329623b0ce9199907137670600e + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/base/0xcde77ef185a8f886d03b109573cc1dcdcf3cf1f8 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/bnb/0xaf996125e98b5804c00ffdb4f7ff386307c99a00 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/base/0xaf21b0ec0197e63a5c6cc30c8e947eb8165c6212 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/bnb/0x69c7bd26512f52bf6f76fab834140d13dda673ca + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/base/0x9c84f58bb51fabd18698efe95f5bab4f33e96e8f - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/bnb/0x0b07188b12e3bba6a680e553e23c4079e98a034b + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/bnb/0x35f5387decce5a234da1a32ca3c9e338a48bcf37 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/bnb/0x5ced44f03ff443bbe14d8ea23bc24425fb89e3ed + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/bnb/0x4178dd7eb2eb983ba7f7e41648cf91db6be20190 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/bnb/0xa1bf0e900fb272089c9fd299ea14bfccb1d1c2c0 + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/bnb/0xaf21b0ec0197e63a5c6cc30c8e947eb8165c6212 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/bnb/0x9c84f58bb51fabd18698efe95f5bab4f33e96e8f - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/celo/0xb6c8f9490314394cfc6edacb8717bfdc1eb8dab5 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/celo/0x1625fe58cdb3726e5841fb2bb367dde9aaa009b3 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/celo/0xb1ed164c736909ba7ddbc1feb7ced4eaad854a87 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/celo/0x95faa9a91cd6c1c018e4b1a6fc4c89d4f1695e5d - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/celo/0xa143ccf73c25eec6f38bd1b741043ebea228b8e9 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/celo/0x2e067e0eab7fd31c01473c0f56f3295afb82e461 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/celo/0xbc83c60e853398d263c1d88899cf5a8b408f9654 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/celo/0xaf21b0ec0197e63a5c6cc30c8e947eb8165c6212 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/celo/0x9c84f58bb51fabd18698efe95f5bab4f33e96e8f - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/ethereum/0x202a6012894ae5c288ea824cbc8a9bfb26a49b93 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/ethereum/0x744159757cac173a7a3ecf5e97adb10d1a725377 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/ethereum/0x127452f3f9cdc0389b0bf59ce6131aa3bd763598 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/ethereum/0x5ced44f03ff443bbe14d8ea23bc24425fb89e3ed - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/arbitrum/0x5ced44f03ff443bbe14d8ea23bc24425fb89e3ed - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/optimism/0x2264ba9dc0b257c69eeae7782e8ff608cc65d6a7 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/optimism/0x5ced44f03ff443bbe14d8ea23bc24425fb89e3ed - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/polygon/0x00a59c2d0f0f4837028d47a391decbffc1e10608 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/polygon/0x5ced44f03ff443bbe14d8ea23bc24425fb89e3ed - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/base/0xad6e8f6a34087bddfb03815e2c10e4f7bfd4395b - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/bnb/0x0da7096f14303eddd634c0241963c064e0244984 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/base/0xd5bb156cb73bfca62f68dc3dff7e5ec4e305b861 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/bnb/0x2aeee741fa1e21120a21e57db9ee545428e683c9 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/base/0xc0d8f259578c985947a050802fb4857261af0bf3 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/bnb/0x96aa22baedc5a605357e0b9ae20ab6b10a472e03 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/base/0x5ced44f03ff443bbe14d8ea23bc24425fb89e3ed - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/celo/0x7b9a5bc920610f54881f2f6359007957de504862 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/bnb/0x74f7a360eb36a46b675ea932ea07094a3ace441f - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/celo/0xb466d5429d6ad9999bf112c225d9d7b15e96c658 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/bnb/0x626761cc5b9fafe4696bf8def4aa015576bb4bef - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/celo/0xf27d0dac09460b236d4d9e0da316fe9c3a99b4a2 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/bnb/0x5ced44f03ff443bbe14d8ea23bc24425fb89e3ed - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/celo/0x95faa9a91cd6c1c018e4b1a6fc4c89d4f1695e5d + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/celo/0xc767c0b2e2e56c455fd29f9ee9b6e6f035c71ed4 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/celo/0xb6c8f9490314394cfc6edacb8717bfdc1eb8dab5 + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/celo/0x625cb959213d18a9853973c2220df7287f1e5b7d - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/celo/0x5ced44f03ff443bbe14d8ea23bc24425fb89e3ed - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/ethereum/0x7138eae57e8a214f7297e5e67bb6e183df3572d5 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/ethereum/0xc7bbec68d12a0d1830360f8ec58fa599ba1b0e9b - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/ethereum/0x840deeef2f115cf50da625f7368c24af6fe74410 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/ethereum/0x69c7bd26512f52bf6f76fab834140d13dda673ca - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/arbitrum/0x69c7bd26512f52bf6f76fab834140d13dda673ca - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/optimism/0x69c7bd26512f52bf6f76fab834140d13dda673ca - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/polygon/0xda71299ff6bdac31bdcafde52a41d460f17e3ad9 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/polygon/0xabebc245a9a47166ecd10933d43817c8ef6fb825 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/polygon/0x69c7bd26512f52bf6f76fab834140d13dda673ca - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/base/0x69c7bd26512f52bf6f76fab834140d13dda673ca - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/bnb/0xb007dda6ca7a57785ce04981c30a1934995a197a - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/bnb/0x0de383928e4fcf0f90ad2d6a5ee18eb3b9d16a55 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/celo/0x1625fe58cdb3726e5841fb2bb367dde9aaa009b3 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/bnb/0x0a36df020fe3f132e6557899f272bf3d4591620e - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/celo/0xa143ccf73c25eec6f38bd1b741043ebea228b8e9 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/bnb/0x69c7bd26512f52bf6f76fab834140d13dda673ca - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/celo/0xc767c0b2e2e56c455fd29f9ee9b6e6f035c71ed4 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/celo/0x69c7bd26512f52bf6f76fab834140d13dda673ca - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/celo/0xaa97f0689660ea15b7d6f84f2e5250b63f2b381a + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/arbitrum/0x8c9d230d45d6cfee39a6680fb7cb7e8de7ea8e71 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/celo/0xb1ed164c736909ba7ddbc1feb7ced4eaad854a87 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/arbitrum/0xcb198a55e2a88841e855be4eacaad99422416b33 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/celo/0x05efb437e4e97efea6450321eca8d7585a731369 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/base/0x9b371948735f612be19195f5f6e5ebc03839cdaf - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/celo/0x065c22a16f6531706681fabbc8df135fe6eb1c2e + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/bnb/0xb3709d0e16b618b15ee4bcf82d19b9e7d4100914 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/celo/0xbc83c60e853398d263c1d88899cf5a8b408f9654 + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/celo/0xe426e1305f5e6093864762bf9d2d8b44bc211c59 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/celo/0x7b9a5bc920610f54881f2f6359007957de504862 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/ethereum/0xfb82dd4d657033133eea6e5b7015042984c5825f - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/ethereum/0x92560c178ce069cc014138ed3c2f5221ba71f58a - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/ethereum/0x6ef7d514d75b5a5a3c500dba1b161a81e842e7a4 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/arbitrum/0xac70bd92f89e6739b3a08db9b6081a923912f73d - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/arbitrum/0x1ebcf8831b93450ea81b0619c5e05b98751c8322 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/arbitrum/0x470d0d72c975a7f328bd63808bfffd28194b3eb6 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/arbitrum/0xa961f0473da4864c5ed28e00fcc53a3aab056c1b - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/arbitrum/0x6ef7d514d75b5a5a3c500dba1b161a81e842e7a4 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/optimism/0xa5b6d588ceb3aa1bf543d095038479188f884690 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/optimism/0x6ef7d514d75b5a5a3c500dba1b161a81e842e7a4 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/polygon/0x6ef7d514d75b5a5a3c500dba1b161a81e842e7a4 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/base/0xb1419a7f9e8c6e434b1d05377e0dbc4154e3de78 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/base/0x6ef7d514d75b5a5a3c500dba1b161a81e842e7a4 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/bnb/0x70c132a2ddeccf0d76cc9b64a749ffe375a79a21 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/bnb/0x6ef7d514d75b5a5a3c500dba1b161a81e842e7a4 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/celo/0x6ef7d514d75b5a5a3c500dba1b161a81e842e7a4 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/ethereum/0x1b942ce8bf08290f740b9e825c91e07fcd0bfe75 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/ethereum/0x5016cd7b785a773f7f3a3ff4035a1e7a76543946 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/celo/0x8ab8d851c6b31d8a4d42fd7d3e47b20861b025f2 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/ethereum/0xf6c4e4f339912541d3f8ed99dba64a1372af5e5b - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/celo/0x9263bb7e2d3570593d80d087ea2cfc72882cfb2c + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/arbitrum/0x4f122edcd91af8cda38c3a87158afa8687bab57c - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/celo/0x357596dd7a0ef5cb703c5aae4da01edff176ae95 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/arbitrum/0xed3fe08bd12f24dad0f1a1e58610644debe374fb - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/celo/0x7766bdc5ff15d3aceb4d37914963aebaccf3de15 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/arbitrum/0x5016cd7b785a773f7f3a3ff4035a1e7a76543946 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/celo/0xc973c86afc23ed731ce1a14d7179003a1601205f + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/arbitrum/0xf6c4e4f339912541d3f8ed99dba64a1372af5e5b - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/celo/0x52c77b0cb827afbad022e6d6caf2c44452edbc39 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/optimism/0x7bc815ca2c2115f896bb14b31b8196388c05e99b - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/celo/0xe46935ae80e05cdebd4a4008b6ccaa36d2845370 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/optimism/0x5016cd7b785a773f7f3a3ff4035a1e7a76543946 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/celo/0xc555d55279023e732ccd32d812114caf5838fd46 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/optimism/0xf6c4e4f339912541d3f8ed99dba64a1372af5e5b - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/celo/0x3041cbd36888becc7bbcbc0045e3b1f144466f5f + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/polygon/0xd29c2df656b2e4ae6b6817ccc2ebe932fc6a950b - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/polygon/0x1f6082db7c8f4b199e17090cd5c8831a1dad1997 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/polygon/0x5016cd7b785a773f7f3a3ff4035a1e7a76543946 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/polygon/0xf6c4e4f339912541d3f8ed99dba64a1372af5e5b - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/base/0xc64f886397988ff16d72123dbe3d46e5bf33ffac - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/base/0x0d2c430c6f7ef48ed34bf4aad0ec377e03cc53cf - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/base/0x5016cd7b785a773f7f3a3ff4035a1e7a76543946 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/base/0xf6c4e4f339912541d3f8ed99dba64a1372af5e5b - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/bnb/0x2b11a34f52e354ef197f0a2397008699b875ae7e - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/bnb/0x5016cd7b785a773f7f3a3ff4035a1e7a76543946 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/bnb/0xf6c4e4f339912541d3f8ed99dba64a1372af5e5b - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/celo/0xde27bdec962a74a72fa1c5ef50bff6f3da083e05 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/celo/0x7766bdc5ff15d3aceb4d37914963aebaccf3de15 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/celo/0x5016cd7b785a773f7f3a3ff4035a1e7a76543946 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/celo/0x7924a818013f39cf800f5589ff1f1f0def54f31f + 2025-03-20T21:18:53.078Z 0.8 https://app.uniswap.org/explore/pools/celo/0xf6c4e4f339912541d3f8ed99dba64a1372af5e5b - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/arbitrum/0x67ab7dc903a10838a0de8861dfdff3287cf98e5c - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/polygon/0x88aaeed1fcfca2eda30749afa9ad45a75c80e292 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/base/0x2c8e9a1586ed822f79c0a241e1a4d48e839b3182 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/bnb/0x847165954680b989902e354f34d08b09afab3cd9 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/celo/0x590269935821d760c54b32d31db66ba47d4e53b4 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/celo/0x03d70bf9e6afbf8cac09ef0c45f9a00a841c2bed - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/ethereum/0x8b238f615c1f312d22a65762bcf601a37f1eeec7 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/base/0x5280d5e63b416277d0f81fae54bb1e0444cabdaa - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/ethereum/0xf4e43a4a17d2820c7cf724e46844943931a47894 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/ethereum/0x5ab53ee1d50eef2c1dd3d5402789cd27bb52c1bb - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/ethereum/0xe6ff8b9a37b0fab776134636d9981aa778c4e718 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/arbitrum/0x44af8d03393e498eec5fcfc7936ebc381f02974d - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/bnb/0x4094915f7849b26e8d43dee1f7e3b7b477a0b5bb - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/celo/0xc3f5e0d4cdff86e85486cf6bd20cc0884df5f98e - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/ethereum/0x87428a53e14d24ab19c6ca4939b4df93b8996ca9 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/ethereum/0x9dbe5dffaeb4ac2e0ac14f8b4e08b3bc55de5232 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/ethereum/0xc3576f38c32e95e36bbd8d91e6cbe646a3723110 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/ethereum/0x8d58e202016122aae65be55694dbce1b810b4072 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/arbitrum/0xc3576f38c32e95e36bbd8d91e6cbe646a3723110 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/arbitrum/0x8d58e202016122aae65be55694dbce1b810b4072 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/optimism/0xa7bb0d95c6ba0ed0aca70c503b34bc7108589a47 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/optimism/0xbcfac19a0036ada56496316ee5cf388c2af2bf58 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/optimism/0x296b88b607ea3a03c821ca4dc34dd9e7e4efa041 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/optimism/0xc3576f38c32e95e36bbd8d91e6cbe646a3723110 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/optimism/0x8d58e202016122aae65be55694dbce1b810b4072 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/polygon/0x019c29d5c97f8cbaa67013e2cf4b6506a5cf183a - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/polygon/0xc3576f38c32e95e36bbd8d91e6cbe646a3723110 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/polygon/0x8d58e202016122aae65be55694dbce1b810b4072 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/base/0x30442fcebbd75a5bb58377c0174d5ce637e297d7 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/base/0x6c561b446416e1a00e8e93e221854d6ea4171372 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/base/0x0fb597d6cfe5be0d5258a7f017599c2a4ece34c7 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/base/0xe9b7057f9b81a0120c09306d35f22859473f18cb - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/base/0x8deb37b048f4b3c7bd61eca7dfccbef7cba726de - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/base/0x455fd3ae52a8ab80f319a1bf912457aa8296695a - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/base/0xe11d03bef391ee0a4b670176e23eb44aad490f12 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/base/0xe7f850731fed6af4c36cce93eccfbcda0634a030 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/base/0xadad4ce0c68f50a19cf5063e0b91d701daab1df1 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/base/0x5e9bb3d7682a9537db831060176c4247ab80d1ec - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/base/0xe9ed60539a8ea7a4da04ebfa524e631b1fd48525 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/base/0x0511791eb6fb175a1aaa645114f0f5c8689ec163 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/base/0xf3c7b93db3f28580b0fd10365e619eedceb40e76 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/base/0x58ecf9cec06bc58fde9280d348f79ed8f3d3046e - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/base/0xedc7f0dfd9751ef95bb8786a3b130f490743bb0e - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/base/0xc3576f38c32e95e36bbd8d91e6cbe646a3723110 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/base/0x8d58e202016122aae65be55694dbce1b810b4072 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/bnb/0x6bcb0ba386e9de0c29006e46b2f01f047ca1806e - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/bnb/0xc3576f38c32e95e36bbd8d91e6cbe646a3723110 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/bnb/0x8d58e202016122aae65be55694dbce1b810b4072 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/celo/0xc3576f38c32e95e36bbd8d91e6cbe646a3723110 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/celo/0x8d58e202016122aae65be55694dbce1b810b4072 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/ethereum/0x34a43471377dcce420ce8e3ffd9360b2e08fa7b4 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/arbitrum/0x34a43471377dcce420ce8e3ffd9360b2e08fa7b4 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/optimism/0x34a43471377dcce420ce8e3ffd9360b2e08fa7b4 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/polygon/0x34a43471377dcce420ce8e3ffd9360b2e08fa7b4 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/base/0x34a43471377dcce420ce8e3ffd9360b2e08fa7b4 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/bnb/0x34a43471377dcce420ce8e3ffd9360b2e08fa7b4 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/celo/0x34a43471377dcce420ce8e3ffd9360b2e08fa7b4 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/optimism/0x766854992bd5363ebeeff0113f5a5795796befab - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/optimism/0x9438a9d1bdeece02ed4431ac59613a128201e0b9 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/polygon/0x0a63d3910ffc1529190e80e10855c4216407cc45 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/base/0x89084692453ab2305f5f8ac7d70d5efd37a86b8f - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/base/0xb34a5657988da5b9888952c439756594613507aa - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/celo/0x05efb437e4e97efea6450321eca8d7585a731369 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/celo/0xc973c86afc23ed731ce1a14d7179003a1601205f - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/celo/0x0f44a1c2b66418f784607d2067fe695703809bff - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/ethereum/0x0da6253560822973185297d5f32ff8fa38243afe - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/ethereum/0x622270721fb38fde831ab23a8e177665557f6fa9 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/arbitrum/0xa95b0f5a65a769d82ab4f3e82842e45b8bbaf101 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/arbitrum/0x622270721fb38fde831ab23a8e177665557f6fa9 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/optimism/0x886b4f0cb357e0d6ec07b7a3985f346cc17ece7d - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/optimism/0x622270721fb38fde831ab23a8e177665557f6fa9 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/polygon/0x50defb73a76efe5d5d35cf267ffb02dfd6cd96bc - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/polygon/0x622270721fb38fde831ab23a8e177665557f6fa9 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/base/0x7aea2e8a3843516afa07293a10ac8e49906dabd1 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/base/0x8c7080564b5a792a33ef2fd473fba6364d5495e5 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/base/0x8f81b80d950e5996346530b76aba2962da5c9edb - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/base/0x7bc0f74d8d94e8e9fdaa40bbc04cc44fb8e0f081 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/base/0x09c149c856e6fb6e40aa39209142411b554b1a41 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/base/0x622270721fb38fde831ab23a8e177665557f6fa9 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/bnb/0x7ef0a523c49b1dd07e3593198c5260a95ad7859a - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/bnb/0x622270721fb38fde831ab23a8e177665557f6fa9 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/celo/0x622270721fb38fde831ab23a8e177665557f6fa9 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/ethereum/0x15aa01580ae866f9ff4dbe45e06e307941d90c7b - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/ethereum/0x4548280ac92507c9092a511c7396cbea78fa9e49 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/ethereum/0xe0554a476a092703abdb3ef35c80e0d76d32939f - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/ethereum/0xc555d55279023e732ccd32d812114caf5838fd46 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/arbitrum/0x421803da50d3932caa36bd1731d36a0e2af93542 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/arbitrum/0xc555d55279023e732ccd32d812114caf5838fd46 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/optimism/0xc555d55279023e732ccd32d812114caf5838fd46 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/polygon/0x258a4b7373f6863db5a17de191e0cebb1e0bbc8a - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/polygon/0x45126b956401daaec92afba2a9953e14b16fb83f - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/polygon/0xc555d55279023e732ccd32d812114caf5838fd46 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/base/0xa3eaa52b505cf61aadcfe21424d43a6847dd6331 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/base/0x722bcf6c16dadcc29914e4e64290c46aa1406de8 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/base/0x1e1367dcebe168554e82552e0e659a4116926d10 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/base/0xc555d55279023e732ccd32d812114caf5838fd46 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/bnb/0x4d170f8714367c44787ae98259ce8adb72240067 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/bnb/0xc555d55279023e732ccd32d812114caf5838fd46 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/celo/0xaa97f0689660ea15b7d6f84f2e5250b63f2b381a - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/celo/0xc555d55279023e732ccd32d812114caf5838fd46 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/arbitrum/0xb736330326cf379ecd918dba10614bd63c2713da - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/arbitrum/0xe3d4faff3179f0a664a3a84c3e1da3b90e27f186 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/arbitrum/0x50e7b9293aef80c304234e86c84a01be8401c530 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/optimism/0x87dddd2e152bf1955e7e03d9f23a9dcc163eebf6 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/optimism/0xd9dd34576c7034beb0b11a99afffc49e91011235 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/optimism/0x394a9fcbab8599437d9ec4e5a4a0eb7cb1fd2f69 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/base/0xb3adde966b8a1a6f22a04914ee9fe0798e71fc5b - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/base/0xa2d4a8e00daad32acace1a0dd0905f6aaf57e84e - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/celo/0x2392ae4ba6daf181ce7343d237b695cdf525e233 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/ethereum/0xc2c390c6cd3c4e6c2b70727d35a45e8a072f18ca - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/ethereum/0x95f4408736988549212db071b1c8d20f7c4e6304 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/ethereum/0x52c77b0cb827afbad022e6d6caf2c44452edbc39 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/arbitrum/0x3dd2fdba71282083d440687cce9e4231aaac534e - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/arbitrum/0xe4d9faddd9bca5d8393bee915dc56e916ab94d27 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/arbitrum/0x95f4408736988549212db071b1c8d20f7c4e6304 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/arbitrum/0x52c77b0cb827afbad022e6d6caf2c44452edbc39 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/optimism/0x9c92ed19a86986124447a73b27625230dd52f805 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/optimism/0x740601243a6aa25ce4ee2d196eef83ac3bec6c65 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/optimism/0x95f4408736988549212db071b1c8d20f7c4e6304 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/optimism/0x52c77b0cb827afbad022e6d6caf2c44452edbc39 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/polygon/0x95f4408736988549212db071b1c8d20f7c4e6304 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/polygon/0x52c77b0cb827afbad022e6d6caf2c44452edbc39 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/base/0xafbb6fcc92ddb091dbc13e9073c3360c7d9600cc - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/base/0x95f4408736988549212db071b1c8d20f7c4e6304 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/base/0x52c77b0cb827afbad022e6d6caf2c44452edbc39 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/bnb/0xf54eba95d7f8dbe4bfeb0b6e038b3c2bedd3e40a - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/bnb/0x05c0a0b84b6b67499c33e6403686f45cab063810 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/bnb/0x9169bf3657353e4b2b81c75e235f22bc299a7780 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/bnb/0x95f4408736988549212db071b1c8d20f7c4e6304 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/bnb/0x52c77b0cb827afbad022e6d6caf2c44452edbc39 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/celo/0x95f4408736988549212db071b1c8d20f7c4e6304 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/celo/0x52c77b0cb827afbad022e6d6caf2c44452edbc39 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/bnb/0xb0bb2c1d32c7b27f21eec4402c6d1c38795c090a - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/bnb/0x534d3930edba2c0b90a7973549a0287141c987ef - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/celo/0xf27d0dac09460b236d4d9e0da316fe9c3a99b4a2 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/ethereum/0x0c3fdf9c70835f9be9db9585ecb6a1ee3f20a6c7 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/arbitrum/0xdd672b3b768a16b9bcb4ee1060d3e8221435beaa - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/arbitrum/0x0c3fdf9c70835f9be9db9585ecb6a1ee3f20a6c7 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/optimism/0xa39fe8f7a00ce28b572617d3a0bc1c2b44110e79 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/optimism/0x0c3fdf9c70835f9be9db9585ecb6a1ee3f20a6c7 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/polygon/0x0c3fdf9c70835f9be9db9585ecb6a1ee3f20a6c7 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/base/0x0c3fdf9c70835f9be9db9585ecb6a1ee3f20a6c7 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/bnb/0x96d5d78b179169ee0a0a0104dc514988f2a797fe - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/bnb/0x0c3fdf9c70835f9be9db9585ecb6a1ee3f20a6c7 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/celo/0xb466d5429d6ad9999bf112c225d9d7b15e96c658 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/celo/0x0c3fdf9c70835f9be9db9585ecb6a1ee3f20a6c7 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/base/0x8a35d2635aeca1aaf667d77ed9ff3b21e48ede24 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/ethereum/0xe566e99d65b17974fd9db02e25e24ea8020f7a0e - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/ethereum/0x5c3edc45ae71a353c669cfa71e6488951dce4618 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/ethereum/0xa7b3bcc6c88da2856867d29f11c67c3a85634882 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/ethereum/0x543842cbfef3b3f5614b2153c28936967218a0e6 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/ethereum/0xc45a81bc23a64ea556ab4cdf08a86b61cdceea8b - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/ethereum/0xe333e366503f620e0242796431dc74fffd258e66 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/arbitrum/0x42161084d0672e1d3f26a9b53e653be2084ff19c - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/arbitrum/0xe24f62341d84d11078188d83ca3be118193d6389 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/optimism/0x782dcc2cd3a65405baeb794269703e9c29a175cc - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/base/0xae8d5b91fca627410a3bef77f55fcfe208409a40 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/bnb/0xa42eb1c1a212da9e24058c6afc0ea906fecb8351 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/ethereum/0x0e3529cf622dc1141a31cfc0fc85f679f558c92b - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/ethereum/0x6f5ec7c65c2744a963064f6d49df0f4eea7d7d90 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/ethereum/0x9a772018fbd77fcd2d25657e5c547baff3fd7d16 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/optimism/0xfc1505b3d4cd16bb2336394ad11071638710950f - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/base/0x8e0a7d4018fb2674346d5742055174f899fe1826 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/base/0xf8aa1db87d84118b0b461e2135190ac27fc1859d - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/ethereum/0xe8f7c89c5efa061e340f2d2f206ec78fd8f7e124 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/ethereum/0x56534741cd8b152df6d48adf7ac51f75169a83b2 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/ethereum/0x73a38006d23517a1d383c88929b2014f8835b38b - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/optimism/0xf5d63f66a36be31a106631f276794223b8ce5280 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/polygon/0xcf0bb95967cd006f5eaa1463c9d710d1e1550a96 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/base/0xdc9bf303e72a5780c45d53fc12799164e5ba8271 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/base/0x1d4dab3f27c7f656b6323c1d6ef713b48a8f72f1 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/base/0xafd8f9b89e2af8246523573a369010daf9489b12 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/bnb/0xbd045175d2a1451a015079f5f3f59ca5c05524ea - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/bnb/0x859ec3d336bb5508f6d87fea2d49c9294adae311 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/ethereum/0x8544383f6f2eb43711fba8d918b30658856b9806 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/ethereum/0x308c6fbd6a14881af333649f17f2fde9cd75e2a6 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/ethereum/0x704ad8d95c12d7fea531738faa94402725acb035 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/arbitrum/0x5166c1bd4603cf67dbb9a98940e38d2bd0a7f294 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/arbitrum/0xf215cedbae999571e4ba5d80c10b6e835f88d5ec - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/arbitrum/0x308c6fbd6a14881af333649f17f2fde9cd75e2a6 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/arbitrum/0x704ad8d95c12d7fea531738faa94402725acb035 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/optimism/0xd4cb5566b5c16ef2f4a08b1438052013171212a2 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/optimism/0x308c6fbd6a14881af333649f17f2fde9cd75e2a6 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/optimism/0x704ad8d95c12d7fea531738faa94402725acb035 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/polygon/0x357faf5843c7fd7fb4e34fbeabdac16eabe8a5bc - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/polygon/0x308c6fbd6a14881af333649f17f2fde9cd75e2a6 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/polygon/0x704ad8d95c12d7fea531738faa94402725acb035 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/base/0x2bbfb5a2496f405d4094d4b854daeb9ce70d0029 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/base/0x308c6fbd6a14881af333649f17f2fde9cd75e2a6 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/base/0x704ad8d95c12d7fea531738faa94402725acb035 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/bnb/0x3373a22cb07cb49651b82cf6f174ef434e4dbaa8 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/bnb/0xc8d19b4ea42939a4b14260f0c8b4a0d6f70c8496 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/bnb/0x308c6fbd6a14881af333649f17f2fde9cd75e2a6 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/bnb/0x704ad8d95c12d7fea531738faa94402725acb035 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/celo/0xb2290db2f409201c33c507d266becabf19228dd1 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/celo/0x308c6fbd6a14881af333649f17f2fde9cd75e2a6 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/celo/0x704ad8d95c12d7fea531738faa94402725acb035 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/ethereum/0x0c30062368eefb96bf3ade1218e685306b8e89fa - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/arbitrum/0x6f38e884725a116c9c7fbf208e79fe8828a2595f - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/optimism/0xe612cb2b5644aef0ad3e922bae70a8374c63515f - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/optimism/0xdef705a1864bcba65e4e275bffd58de21b5d44a0 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/base/0x717358a47ac99f3cd233e723be331756b3951164 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/base/0x9166a0139cab9661e08779cd01b1358aaea7b95f - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/base/0xc1a6fbedae68e1472dbb91fe29b51f7a0bd44f97 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/base/0x3a3dc4a26d1aceae12fd1026a5856f12d20658ea - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/ethereum/0xa2375dad211fe6e538d29c98ec526246e38be4ec - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/ethereum/0x4e4a4c4c46d3488ff35ff05a0233785a30f03ec4 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/ethereum/0x5d27fdd96c8e4028edbabf3d667be24769425199 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/arbitrum/0x1944ac04bd9fed9a2bcdb38b70c35949c864ec35 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/optimism/0x5e2cd0da3411449152010d8b7f2b624eb29cca59 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/optimism/0x85e8d0fddf559a57aac6404e7695142cd53eb808 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/polygon/0xead1cd21ddf8793debc9484a0b8d286230c9b5a3 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/base/0xc4ecaf115cbce3985748c58dccfc4722fef8247c - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/base/0x2f42df4af5312b492e9d7f7b2110d9c7bf2d9e4f - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/base/0x021235b92a4f52c789f43a1b01453c237c265861 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/base/0xc6e291f54532f12391ab59d7af75453db2dd784a - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/bnb/0xfe4fe5b4575c036ac6d5cccfe13660020270e27a - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/bnb/0xfa7d79f971a70771e5e92bd80ab955edc8602f4d - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/bnb/0x023b6298e2f9ae728b324757599f2a36e002a55a - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/arbitrum/0x53d3e59faac08184720bcb2816f4cf5b36d6767d - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/arbitrum/0x7e9cb8ad4a7683070e233f3eb1d07d87272b9b26 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/base/0xa213c82265cd3d94f972f735a4f5130e34df81bc - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/base/0xf1fdc83c3a336bdbdc9fb06e318b08eaddc82ff4 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/base/0x3d9228f1847b07e6b2c8eaaf393d5a4db2dbedc2 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/celo/0x9263bb7e2d3570593d80d087ea2cfc72882cfb2c - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/ethereum/0x360b9726186c0f62cc719450685ce70280774dc8 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/ethereum/0x9ec9620e1fda9c1e57c46782bc3232903cacb59b - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/ethereum/0x1112956589a2bea1b038732db4ea6b0c416ef130 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/arbitrum/0x663b1d43c27e41e5e512bf59010133997d1cd304 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/arbitrum/0x9ec9620e1fda9c1e57c46782bc3232903cacb59b - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/arbitrum/0x1112956589a2bea1b038732db4ea6b0c416ef130 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/optimism/0xfea834a5c47b923add607cc5b96288d18ffb9c3f - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/optimism/0x9ec9620e1fda9c1e57c46782bc3232903cacb59b - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/optimism/0x1112956589a2bea1b038732db4ea6b0c416ef130 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/polygon/0x273d580e9ceadca5b2a8ceb5ebb38a70511377cb - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/polygon/0x9ec9620e1fda9c1e57c46782bc3232903cacb59b - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/polygon/0x1112956589a2bea1b038732db4ea6b0c416ef130 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/base/0x3b241fb91c65f42432ebdbca029e0b511c8a1707 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/base/0xe9a65059e895dd5d49806f6a71b63fed0ffffd4b - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/base/0x01a1f5758c3a53057b6c819ec7331e39c167794a - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/base/0x40fc7cda03139ebf7a0d3fc01f12b9d9a878cc92 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/base/0x11e26bbd1a5547895a50fc39a2d4c0025dec0bda - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/base/0x21cbb0e695b0ac79be756a87da690fd80bef4bff - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/base/0x68b27e9066d3aadc6078e17c8611b37868f96a1d - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/base/0x9ec9620e1fda9c1e57c46782bc3232903cacb59b - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/base/0x1112956589a2bea1b038732db4ea6b0c416ef130 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/bnb/0x2af64d33a47e7a98eafc20ce9f6af59927d10260 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/bnb/0x9ec9620e1fda9c1e57c46782bc3232903cacb59b - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/bnb/0x1112956589a2bea1b038732db4ea6b0c416ef130 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/celo/0x9ec9620e1fda9c1e57c46782bc3232903cacb59b - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/celo/0x1112956589a2bea1b038732db4ea6b0c416ef130 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/ethereum/0xc4ce8e63921b8b6cbdb8fcb6bd64cc701fb926f2 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/ethereum/0x9febc984504356225405e26833608b17719c82ae - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/ethereum/0x59c38b6775ded821f010dbd30ecabdcf84e04756 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/ethereum/0x2aeee741fa1e21120a21e57db9ee545428e683c9 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/ethereum/0x67324985b5014b36b960273353deb3d96f2f18c2 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/arbitrum/0x2aeee741fa1e21120a21e57db9ee545428e683c9 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/arbitrum/0x67324985b5014b36b960273353deb3d96f2f18c2 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/optimism/0x2aeee741fa1e21120a21e57db9ee545428e683c9 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/optimism/0x67324985b5014b36b960273353deb3d96f2f18c2 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/polygon/0xcec31e540163ddf45a394e00b11ae442ddc0d704 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/polygon/0x7f9121b4f4e040fd066e9dc5c250cf9b4338d5bc - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/polygon/0x2aeee741fa1e21120a21e57db9ee545428e683c9 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/polygon/0x67324985b5014b36b960273353deb3d96f2f18c2 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/base/0x316f12517630903035a0e0b4d6e617593ee432ba - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/base/0x61928bf5f2895b682ecc9b13957aa5a5fe040cc0 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/base/0x9399da51c1a85e64cce4b30b554875d2b89b2445 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/base/0x0962a51e121aa8371cd4bb0458b7e5a08c1cbd29 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/base/0xfbb6eed8e7aa03b138556eedaf5d271a5e1e43ef - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/base/0x2aeee741fa1e21120a21e57db9ee545428e683c9 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/base/0x67324985b5014b36b960273353deb3d96f2f18c2 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/bnb/0x913a4ed1636c474e6451b5e9249d94046a24bb33 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/bnb/0x8e3ecc0b261f1a4db62321090575eb299844f077 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/bnb/0x2aeee741fa1e21120a21e57db9ee545428e683c9 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/bnb/0x67324985b5014b36b960273353deb3d96f2f18c2 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/celo/0x2aeee741fa1e21120a21e57db9ee545428e683c9 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/celo/0x67324985b5014b36b960273353deb3d96f2f18c2 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/ethereum/0x99950bae3d0b79b8bee86a8a208ae1b087b9dcb0 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/ethereum/0x948b54a93f5ad1df6b8bff6dc249d99ca2eca052 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/ethereum/0x5738df8073ad05d0c0fcf60e358033268ebf16cc - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/ethereum/0xb771f724c504b329623b0ce9199907137670600e - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/ethereum/0x0da7096f14303eddd634c0241963c064e0244984 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/arbitrum/0x52f9d14bed8ce6536da063aaf274ae2747ef4853 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/arbitrum/0xc0f05732d1cda6f59487ceeef4390abcad86ea3e - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/arbitrum/0xb771f724c504b329623b0ce9199907137670600e - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/arbitrum/0x0da7096f14303eddd634c0241963c064e0244984 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/optimism/0x28117b7b8dba890041d7ebe646082af043533da2 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/optimism/0xb771f724c504b329623b0ce9199907137670600e - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/optimism/0x0da7096f14303eddd634c0241963c064e0244984 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/polygon/0xf3ca4ade682c5b99507db9a72549318b8708f137 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/polygon/0xb771f724c504b329623b0ce9199907137670600e - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/polygon/0x0da7096f14303eddd634c0241963c064e0244984 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/base/0x9c087eb773291e50cf6c6a90ef0f4500e349b903 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/base/0x037818b04ac34ea8b54b6683b79ef24d23c0e7cb - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/base/0xbf6ef625de5df898cc1d0f91868aae03976a2e2d - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/base/0xfdbaf04326acc24e3d1788333826b71e3291863a - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/base/0xc68b994e2147b8bcf18f82c201ac3ee1e97be33d - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/base/0x47808ddbc91646b21b307fefbaf7ee200b004ccc - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/base/0xb771f724c504b329623b0ce9199907137670600e - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/base/0x0da7096f14303eddd634c0241963c064e0244984 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/bnb/0xafa5421fe7997c16e11458659f5a87d67f1e8651 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/bnb/0x26b4103c8da21725909955fe85f7f6249d05dd9e - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/bnb/0x79dbd26d3c1e44171205f258aadfae84933b69b8 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/bnb/0xb771f724c504b329623b0ce9199907137670600e - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/bnb/0x0da7096f14303eddd634c0241963c064e0244984 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/celo/0xb771f724c504b329623b0ce9199907137670600e - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/celo/0x0da7096f14303eddd634c0241963c064e0244984 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/base/0x0f9e3c4b905e6292b33f5ef96af18054ded12ac8 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/ethereum/0xb0e1a214130245d289ae425db7826576694a5b5f - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/arbitrum/0x32a5746ba6826828716cc1a394bc33301ebc7656 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/arbitrum/0x0f725b113979e025c69da0ffce3fbf5b6063cc5c - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/arbitrum/0x056c5ff8380625cc94efe865a4c178a33ed546f8 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/polygon/0xda67d7c01c4c8f757c105c0890d94ac489952cd5 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/base/0x4fe87203b27a105a772f195d3f30dea714d1ecf0 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/base/0x670e77c361375be9013869ccc516027ccc90383f - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/base/0xaec085e5a5ce8d96a7bdd3eb3a62445d4f6ce703 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/base/0x92d90f7f8413749bd4bea26dde4e29efc9e9a0b6 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/base/0x2c114787d52e9f080464dbed8e285e07ec4e120f - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/base/0x303b00d7a2ad12a480db7c04de5835ec9ccc37b0 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/base/0x6f9d09253f99d2b6843b5ec62c23496c37327216 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/base/0x4cd15f2bc9533bf6fac4ae33c649f138cb601935 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/bnb/0x63d134fa19fbb35ad689dbb6b659879de1e7fb29 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/arbitrum/0x5cbddc44f31067df328aa7a8da03aca6f2edd2ad - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/optimism/0x72da5b3c28b8cee48158f469e0e9215607fe06d7 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/polygon/0xa7cca1c4a7d4b70f687380e0454e5ae418db53b1 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/base/0xd364eb55e17700b54bd75feb3f14582ed7a29444 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/base/0xb3fb7ccf7b681e9562c6da467db4859a8ef0b8de - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/base/0x0eb7fbe43045426938ddadc11dc41338e0907659 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/base/0xa23fab21d0653c231166b31cb6274ff45eba2ee5 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/base/0xf68001b66cb98345c05b2e3efdee1db8fc01a76c - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/bnb/0xa3adcaaf941a01eec47655c550dd5504637d029a - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/ethereum/0x6dcba3657ee750a51a13a235b4ed081317da3066 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/arbitrum/0xbbf3209130df7d19356d72eb8a193e2d9ec5c234 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/arbitrum/0x6de5072c06cbf37da96ccc0fc85c85ca82fe9d13 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/base/0x183ea22691c54806fe96555436dd312b6befac2f - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/bnb/0x6f169193b181d9492f9bde038109cce6dfe19321 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/celo/0xe9d448cc1ed83891ab5b381face53f0cadb3a8e5 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/ethereum/0xcbfb0745b8489973bf7b334d54fdbd573df7ef3c - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/ethereum/0xa04d13f092f68f603a193832222898b0d9f52c71 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/ethereum/0x0df407bc6abe9af2093dcb4c974e18d40a6a381a - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/ethereum/0xb2c5d104f481d0beb056842bd5312be6fd831429 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/ethereum/0x0b07188b12e3bba6a680e553e23c4079e98a034b - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/arbitrum/0xb2c5d104f481d0beb056842bd5312be6fd831429 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/arbitrum/0x0b07188b12e3bba6a680e553e23c4079e98a034b - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/optimism/0xb2c5d104f481d0beb056842bd5312be6fd831429 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/optimism/0x0b07188b12e3bba6a680e553e23c4079e98a034b - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/polygon/0x56fcb902bee19a645f9607cd1e1c0737b6358feb - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/polygon/0xb2c5d104f481d0beb056842bd5312be6fd831429 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/polygon/0x0b07188b12e3bba6a680e553e23c4079e98a034b - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/base/0x7b9fda92bfa6fdadfdc4f6c72c0cc8336e7d7497 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/base/0x1d2bdb7117a5a7d7fe4c1d95681a92e4df13bb69 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/base/0xb2c5d104f481d0beb056842bd5312be6fd831429 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/base/0x0b07188b12e3bba6a680e553e23c4079e98a034b - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/bnb/0x7e4fb9e08cf122feb925117bace017ea234944d3 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/bnb/0xb2c5d104f481d0beb056842bd5312be6fd831429 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/bnb/0x0b07188b12e3bba6a680e553e23c4079e98a034b - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/celo/0xb2c5d104f481d0beb056842bd5312be6fd831429 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/celo/0x0b07188b12e3bba6a680e553e23c4079e98a034b - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/ethereum/0x867b321132b18b5bf3775c0d9040d1872979422e - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/ethereum/0xb26a868ffa4cbba926970d7ae9c6a36d088ee38c - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/optimism/0xc4329493d7566525a4d51698a33f43ad240e9290 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/polygon/0x96239bd7ae3d9bc253b1cc7cf7a84f3a67ca5369 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/base/0x2ff525c71cb7b29fcde4bea8c8f601b1dd22480a - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/base/0x43f34a518e20b9454c94bf4026ec9024ed84a062 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/base/0x12146c8e7469be19ec6c7f58b80246548144f8b8 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/bnb/0x026428e531f30b2714ceff3781d7cdf5d278e96a - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/ethereum/0x2049df3435bdbb36d22f98fcd2e5027049a1f3ce - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/arbitrum/0x2049df3435bdbb36d22f98fcd2e5027049a1f3ce - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/optimism/0x2049df3435bdbb36d22f98fcd2e5027049a1f3ce - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/polygon/0x22d1c3c541dd649ea4a8709fc787f348dc069e95 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/polygon/0xd9abecb39a5885d1e531ed3599adfed620e2fc8a - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/polygon/0x25fb97799f80433e422f47e75173314e54dae174 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/polygon/0x2049df3435bdbb36d22f98fcd2e5027049a1f3ce - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/base/0x2049df3435bdbb36d22f98fcd2e5027049a1f3ce - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/bnb/0x3e2e284d55926f5f6e86987da6be216aef292e76 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/bnb/0x2049df3435bdbb36d22f98fcd2e5027049a1f3ce - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/celo/0x2049df3435bdbb36d22f98fcd2e5027049a1f3ce - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/ethereum/0xc8219b876753a85025156b22176c2edea17aac53 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/arbitrum/0x27807dd7adf218e1f4d885d54ed51c70efb9de50 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/base/0x1d69099803b4580efb8df0c7ef083e550a1c42c1 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/base/0xec558e484cc9f2210714e345298fdc53b253c27d - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/base/0x37bb450b17721c6720040a150029e504766e9777 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/bnb/0x4cd04970dcad72d09c3af2e09f15bbcd2eb1d5d4 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/ethereum/0x96aa22baedc5a605357e0b9ae20ab6b10a472e03 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/arbitrum/0x96aa22baedc5a605357e0b9ae20ab6b10a472e03 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/optimism/0x96aa22baedc5a605357e0b9ae20ab6b10a472e03 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/polygon/0xc9d0cae8343a2231b1647ab00e639eabdc766147 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/polygon/0x96aa22baedc5a605357e0b9ae20ab6b10a472e03 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/base/0x8c7adf7bcfdfca0a27f3d7ad49698b9e11c1f20b - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/base/0x96aa22baedc5a605357e0b9ae20ab6b10a472e03 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/bnb/0x98e4799d58982ed714159c30a34b4bdb20ba20b7 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/bnb/0x96aa22baedc5a605357e0b9ae20ab6b10a472e03 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/celo/0x96aa22baedc5a605357e0b9ae20ab6b10a472e03 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/arbitrum/0x8ff82952cee74c095c1734ee144143a755d3c600 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/bnb/0xf7513c120b92fa4dd5cbfa78dffefcb4ced5743f - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/ethereum/0xdd2e0d86a45e4ef9bd490c2809e6405720cc357c - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/ethereum/0x6ec94f50cadcc79984463688de42a0ca696ec2db - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/arbitrum/0x6ec94f50cadcc79984463688de42a0ca696ec2db - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/optimism/0x6ec94f50cadcc79984463688de42a0ca696ec2db - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/polygon/0x6ec94f50cadcc79984463688de42a0ca696ec2db - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/base/0xd2fdfd5059a83e15bf362f094a2ae63f03b554ca - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/base/0x5116773e18a9c7bb03ebb961b38678e45e238923 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/base/0x6ec94f50cadcc79984463688de42a0ca696ec2db - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/bnb/0xbac01354f2109eb3aebcb46b3ee43813dbae1a7d - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/bnb/0x6ec94f50cadcc79984463688de42a0ca696ec2db - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/celo/0x357596dd7a0ef5cb703c5aae4da01edff176ae95 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/celo/0x6ec94f50cadcc79984463688de42a0ca696ec2db - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/ethereum/0xf8e349d1d827a6edf17ee673664cfad4ca78c533 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/ethereum/0x48da0965ab2d2cbf1c17c09cfb5cbe67ad5b1406 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/arbitrum/0x49d27c3e1cac5bcf7615f2f8e1c1af6ab9db8225 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/optimism/0x679420c54cc4806d0f480925772965746d9f9779 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/base/0x20b795a5bb2cca7598b67739dba8666ab3c506f8 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/bnb/0x55703b183e4676d3e72289995c2e14fa0cc29c1b - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/bnb/0x3e7995110680e6a55e6e430a1c511e921f896316 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/polygon/0xd19a1c8278d0420bfb2c825d99dc31ff86224607 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/base/0x9c42751954513c0461481a9600c9d11a059ddd12 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/base/0x7d68d2a3b22824a7895ad475f4fc3ca9ac8a240a - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/unichain/0x65081cb48d74a32e9ccfed75164b8c09972dbcf1 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/unichain/0x765c3773f641ad8073795765c5c41c075f91b140 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/unichain/0x18b268965e4e702bdf13469205937894b8ab0ee8 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/unichain/0x6b918c9f87b46a758c2b51bce427c8028dacb720 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/unichain/0xbda709a0665b340898856b8b29ff87079bb130d3 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/unichain/0xd49174dba635489c67fa628864c2d0d04824ebd8 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/unichain/0x9e2ef5522b2f9eac00912f25082f6e652123b54d - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/unichain/0xc673d5164103357a7537c36438a6326776a14bbd - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/unichain/0xe97a0889d2b0660fddc144a8893b3ac9236756a6 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/unichain/0x12095933f1eeb066176dd2e41e5a2f8be6974616 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/unichain/0x8eb4b07affbd1083f42032eed35cd32e382ee8b7 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/unichain/0xfbc45ab96d02e150b2ddeb7dd4eacd3d8c674f4a - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/unichain/0x9d7151413833dcb13ae284d6a7fccd93989c47a1 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/unichain/0x18ce92e7a37d994657f97c3defaf880a805f08d5 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/unichain/0xa9c6669de2c04c2adb22ac7a65d75b47fee30e35 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/unichain/0x6e4e17973cb963c9931617d8d0e35813cb5eb886 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/unichain/0x8927058918e3cff6f55efe45a58db1be1f069e49 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/unichain/0x21b8065d10f73ee2e260e5b47d3344d3ced7596e - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/unichain/0xa43fe16908251ee70ef74718545e4fe6c5ccec9f - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/unichain/0xb4e16d0168e52d35cacd2c6185b44281ec28c9dc - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/unichain/0x9c4fe5ffd9a9fc5678cfbd93aa2d4fd684b67c4c - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/unichain/0x0d4a11d5eeaac28ec3f61d100daf4d40471f1852 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/unichain/0xbb2b8038a1640196fbe3e38816f3e67cba72d940 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/unichain/0x7b73644935b8e68019ac6356c40661e1bc315860 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/unichain/0xca7c2771d248dcbe09eabe0ce57a62e18da178c0 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/unichain/0xa478c2975ab1ea89e8196811f51a7b7ade33eb11 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/unichain/0x52c77b0cb827afbad022e6d6caf2c44452edbc39 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/unichain/0xc2eab7d33d3cb97692ecb231a5d0e4a649cb539d - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/unichain/0x180efc1349a69390ade25667487a826164c9c6e4 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/unichain/0x43de4318b6eb91a7cf37975dbb574396a7b5b5c6 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/unichain/0x9ec9367b8c4dd45ec8e7b800b1f719251053ad60 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/unichain/0x25647e01bd0967c1b9599fa3521939871d1d0888 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/unichain/0x3041cbd36888becc7bbcbc0045e3b1f144466f5f - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/unichain/0xe46935ae80e05cdebd4a4008b6ccaa36d2845370 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/unichain/0x09d1d767edf8fa23a64c51fa559e0688e526812f - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/unichain/0xc555d55279023e732ccd32d812114caf5838fd46 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/unichain/0x48d20b3e529fb3dd7d91293f80638df582ab2daa - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/unichain/0x2a6c340bcbb0a79d3deecd3bc5cbc2605ea9259f - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/unichain/0xcaa004418eb42cdf00cb057b7c9e28f0ffd840a5 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/unichain/0x1ffec7119e315b15852557f654ae0052f76e6ae1 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/unichain/0x8c1c499b1796d7f3c2521ac37186b52de024e58c - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/unichain/0x4028daac072e492d34a3afdbef0ba7e35d8b55c4 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/unichain/0xd3d2e2692501a5c9ca623199d38826e513033a17 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/unichain/0x6ada49aeccf6e556bb7a35ef0119cc8ca795294a - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/unichain/0x9ff68f61ca5eb0c6606dc517a9d44001e564bb66 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/unichain/0xddd23787a6b80a794d952f5fb036d0b31a8e6aff - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/unichain/0x470e8de2ebaef52014a47cb5e6af86884947f08c - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/unichain/0xda2d09fbbf8ee4b5051a0e9b562c5fcb4b393b18 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/unichain/0xf6c4e4f339912541d3f8ed99dba64a1372af5e5b - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/unichain/0x7924a818013f39cf800f5589ff1f1f0def54f31f - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/unichain/0x69c7bd26512f52bf6f76fab834140d13dda673ca - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/unichain/0x2caccf71bdf8fff97c06a46eca29b611b1a74b5e - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/unichain/0xaf996125e98b5804c00ffdb4f7ff386307c99a00 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/unichain/0x0f23d49bc92ec52ff591d091b3e16c937034496e - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/unichain/0x0b07188b12e3bba6a680e553e23c4079e98a034b - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/unichain/0xb771f724c504b329623b0ce9199907137670600e - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/unichain/0xc7e6b676bfc73ae40bcc4577f22aab1682c691c6 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/unichain/0x6ec94f50cadcc79984463688de42a0ca696ec2db - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/unichain/0xaf21b0ec0197e63a5c6cc30c8e947eb8165c6212 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/unichain/0x5ced44f03ff443bbe14d8ea23bc24425fb89e3ed - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/unichain/0xc5be99a02c6857f9eac67bbce58df5572498f40c - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/unichain/0xc91ef786fbf6d62858262c82c63de45085dea659 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/unichain/0x97e1fcb93ae7267dbafad23f7b9afaa08264cfd8 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/unichain/0xa1bf0e900fb272089c9fd299ea14bfccb1d1c2c0 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/unichain/0xa5e9c917b4b821e4e0a5bbefce078ab6540d6b5e - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/unichain/0x0da7096f14303eddd634c0241963c064e0244984 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/unichain/0x96aa22baedc5a605357e0b9ae20ab6b10a472e03 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/avalanche/0xfae3f424a0a47706811521e3ee268f00cfb5c45e - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/avalanche/0x7b602f98d71715916e7c963f51bfebc754ade2d0 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/avalanche/0xb978a8c502ce97b04043036a91548b846067f9ea - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/avalanche/0x804226ca4edb38e7ef56d16d16e92dc3223347a0 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/avalanche/0x9ba9c677d19347abfba1d6b6d6ceb61942071561 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/avalanche/0x5e8754aaa7c2da42c218f40435cbdedbae88bfc5 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/avalanche/0xeb7e0191f4054868d97f33ca7a4176b226ccbd2f - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/avalanche/0xd1356d360f37932059e5b89b7992692aa234eda6 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/avalanche/0x27b571f3e7f7827b13d927d2d59244e3e58a7d1a - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/avalanche/0xb2dc1235bf4b36628a8665aeb668bf202759528a - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/avalanche/0x2e587b9e7aa638d7eb7db5fe7447513bc4d0d28b - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/avalanche/0x724f6a02ed2eb82d8d45034b280903cf663731ab - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/avalanche/0xe54dadf5b4f8779256e1bbb94eca00b124311208 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/avalanche/0xa7141c79d3d4a9ad67ba95d2b97fe7eed9fb92b3 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/avalanche/0x28f577ed1cb3b0add148d745d9c0a2c0c40cc48d - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/avalanche/0x12089f58e0e7eadfc7d60cf1b1ed6839a811672a - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/avalanche/0x3859de09906bed098879cbef34d80817357244c7 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/avalanche/0x01ed0722f62a5dd3212b04aed2a2065623a705bb - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/avalanche/0x178b99eaa2f6bc97d16f84edbce2e23ae6b8140b - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/avalanche/0x0e663593657b064e1bae76d28625df5d0ebd4421 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/avalanche/0xd18384f4398bf5415902ad5d87eaa96549fd4f1e - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/avalanche/0x97bb1788dcd64e17166931b87789cae97c154009 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/avalanche/0x83b9a48793f4e5be12cfe1de3b1d55a83c4f1a9a - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/avalanche/0x6d61ae1b0d94941dc702581daaaafc7665d1c6d7 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/avalanche/0x9a68f0bbced6d6f1f63f0a61215742377ac9d325 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/avalanche/0x01c7c6066ec10b1cd4821e13b9fb063680ffa083 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/avalanche/0xcea3c61705b68fefd8da1048ca69db1344180fcb - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/avalanche/0xf39f633a18042105454ff64c6abd07beb8cbcead - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/avalanche/0x7fd0055020a6d9c43c31c8ea755c5038ebd39722 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/avalanche/0xe1e870fdff3ad67f2879542d841d8ab3e1406f4c - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/avalanche/0xc0a57a72cb7da55da2e50f664b1641570941618f - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/avalanche/0xfd584fcc3a74429d85c9a2294eaf0f566ddfd593 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/avalanche/0xfc1e7bc60adfc151565c033521ee6ccbde027f54 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/avalanche/0x78b4c0301b7e6e3d31f259b3f112ced639f030a3 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/avalanche/0x94a0d838379e9703b69a777191d8a8951ada2e8e - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/avalanche/0xd399718256c5206d9586e866169dbdf131193e02 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/avalanche/0x43fb9c3fd6715e872272b0caab968a97692726eb - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/avalanche/0x9d1bcb75a7bc5defe7daed505c462572b5e022f9 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/avalanche/0xd312a35320a5936409edfd5e2eb0d17bcf99910b - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/avalanche/0x118bc22a76a71ff3187577422af2d57210277bab - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/avalanche/0x90fbfd28f16fa163b914be6b9b3eeeb1c3e02fe5 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/avalanche/0x44f904512639f2a4530dc3b0cce8927b09226a43 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/avalanche/0xaf4ceda77ec614099ffe67b7f4fe4427d52e75cc - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/avalanche/0xd494b33229ee2c857a43b94ee7117be05e5fd88c - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/avalanche/0x0e7a5a8177d5711dc90ba9a6ded590060f52dd29 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/avalanche/0xcec63fa2b71744e1cdd48f71e34acedd46b496aa - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/avalanche/0x0fbb556c73226b12cd7cfb2bed56e77fc177f0ec - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/avalanche/0x15309a0e8c954c46601d8028153125c3b92884b6 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/avalanche/0xdbd8a9c9d060973557f3ac7c7f642a9523529d68 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/avalanche/0xc58a6a266ede99e0b8069f3f45a3028c2aaf4c0c - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/avalanche/0x21b8065d10f73ee2e260e5b47d3344d3ced7596e - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/avalanche/0xa43fe16908251ee70ef74718545e4fe6c5ccec9f - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/avalanche/0xb4e16d0168e52d35cacd2c6185b44281ec28c9dc - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/avalanche/0x9c4fe5ffd9a9fc5678cfbd93aa2d4fd684b67c4c - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/avalanche/0x0d4a11d5eeaac28ec3f61d100daf4d40471f1852 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/avalanche/0xbb2b8038a1640196fbe3e38816f3e67cba72d940 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/avalanche/0x7b73644935b8e68019ac6356c40661e1bc315860 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/avalanche/0xca7c2771d248dcbe09eabe0ce57a62e18da178c0 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/avalanche/0xa478c2975ab1ea89e8196811f51a7b7ade33eb11 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/avalanche/0x52c77b0cb827afbad022e6d6caf2c44452edbc39 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/avalanche/0xc2eab7d33d3cb97692ecb231a5d0e4a649cb539d - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/avalanche/0x180efc1349a69390ade25667487a826164c9c6e4 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/avalanche/0x43de4318b6eb91a7cf37975dbb574396a7b5b5c6 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/avalanche/0x9ec9367b8c4dd45ec8e7b800b1f719251053ad60 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/avalanche/0x25647e01bd0967c1b9599fa3521939871d1d0888 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/avalanche/0x3041cbd36888becc7bbcbc0045e3b1f144466f5f - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/avalanche/0xe46935ae80e05cdebd4a4008b6ccaa36d2845370 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/avalanche/0x09d1d767edf8fa23a64c51fa559e0688e526812f - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/avalanche/0xc555d55279023e732ccd32d812114caf5838fd46 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/avalanche/0x48d20b3e529fb3dd7d91293f80638df582ab2daa - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/avalanche/0x2a6c340bcbb0a79d3deecd3bc5cbc2605ea9259f - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/avalanche/0xcaa004418eb42cdf00cb057b7c9e28f0ffd840a5 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/avalanche/0x1ffec7119e315b15852557f654ae0052f76e6ae1 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/avalanche/0x8c1c499b1796d7f3c2521ac37186b52de024e58c - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/avalanche/0x4028daac072e492d34a3afdbef0ba7e35d8b55c4 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/avalanche/0xd3d2e2692501a5c9ca623199d38826e513033a17 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/avalanche/0x6ada49aeccf6e556bb7a35ef0119cc8ca795294a - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/avalanche/0x9ff68f61ca5eb0c6606dc517a9d44001e564bb66 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/avalanche/0xddd23787a6b80a794d952f5fb036d0b31a8e6aff - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/avalanche/0x470e8de2ebaef52014a47cb5e6af86884947f08c - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/avalanche/0xda2d09fbbf8ee4b5051a0e9b562c5fcb4b393b18 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/avalanche/0xf6c4e4f339912541d3f8ed99dba64a1372af5e5b - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/avalanche/0x7924a818013f39cf800f5589ff1f1f0def54f31f - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/avalanche/0x69c7bd26512f52bf6f76fab834140d13dda673ca - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/avalanche/0x2caccf71bdf8fff97c06a46eca29b611b1a74b5e - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/avalanche/0xaf996125e98b5804c00ffdb4f7ff386307c99a00 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/avalanche/0x0f23d49bc92ec52ff591d091b3e16c937034496e - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/avalanche/0x0b07188b12e3bba6a680e553e23c4079e98a034b - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/avalanche/0xb771f724c504b329623b0ce9199907137670600e - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/avalanche/0xc7e6b676bfc73ae40bcc4577f22aab1682c691c6 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/avalanche/0x6ec94f50cadcc79984463688de42a0ca696ec2db - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/avalanche/0xaf21b0ec0197e63a5c6cc30c8e947eb8165c6212 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/avalanche/0x5ced44f03ff443bbe14d8ea23bc24425fb89e3ed - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/avalanche/0xc5be99a02c6857f9eac67bbce58df5572498f40c - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/avalanche/0xc91ef786fbf6d62858262c82c63de45085dea659 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/avalanche/0x97e1fcb93ae7267dbafad23f7b9afaa08264cfd8 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/avalanche/0xa1bf0e900fb272089c9fd299ea14bfccb1d1c2c0 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/avalanche/0xa5e9c917b4b821e4e0a5bbefce078ab6540d6b5e - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/avalanche/0x0da7096f14303eddd634c0241963c064e0244984 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/avalanche/0x96aa22baedc5a605357e0b9ae20ab6b10a472e03 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/blast/0x85287626e78602d0da569332e419154b0bdea035 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/blast/0xf52b4b69123cbcf07798ae8265642793b2e8990c - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/blast/0x1cf4cfc7a984a474ab03f444ccedb30c3ae6f56c - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/blast/0xf5a23bdd36a56ede75d503f6f643d5eaf25b1a8f - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/blast/0x57529f9e2a23cc53fc387b162d2ab0f1df3ed701 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/blast/0xf4b646bc85458cc74497c773e2bc8b9ec1351e97 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/blast/0xf08ff66b8ec0db053711f4989c40b084564f7de3 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/blast/0x0000fb2a9a0f3f35d72d7eedb8689c6db1d30225 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/blast/0xbb60bb410182d8e96c41dfc92e017dd79f5100bf - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/blast/0x0f6c5fdcb927b99b3040c609bef07bdfc59a6173 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/blast/0xaeba85e3328d6b77b58130f43815ac9c59603d38 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/blast/0xbf796b95d09729815806dd50de07c1111aa3926f - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/blast/0x63f59866a7e9a8628e7f1577ba55da134d64d8c2 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/blast/0x78337095c61035056a85b7d430d6e9875f177ae2 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/blast/0x258ba3b253e5cc3bab01c28d2f527aacd6d96793 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/blast/0x7b8086f5442f130a6be2d62dff02319018344feb - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/blast/0x9dfb11cf311a8fa1296f6958057f8bb02be51a4c - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/blast/0xf95141f5552e592dc58c41e54d65d0f645ab7d7e - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/blast/0x21b8065d10f73ee2e260e5b47d3344d3ced7596e - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/blast/0xa43fe16908251ee70ef74718545e4fe6c5ccec9f - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/blast/0xb4e16d0168e52d35cacd2c6185b44281ec28c9dc - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/blast/0x9c4fe5ffd9a9fc5678cfbd93aa2d4fd684b67c4c - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/blast/0x0d4a11d5eeaac28ec3f61d100daf4d40471f1852 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/blast/0xbb2b8038a1640196fbe3e38816f3e67cba72d940 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/blast/0x7b73644935b8e68019ac6356c40661e1bc315860 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/blast/0xca7c2771d248dcbe09eabe0ce57a62e18da178c0 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/blast/0xa478c2975ab1ea89e8196811f51a7b7ade33eb11 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/blast/0x52c77b0cb827afbad022e6d6caf2c44452edbc39 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/blast/0xc2eab7d33d3cb97692ecb231a5d0e4a649cb539d - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/blast/0x180efc1349a69390ade25667487a826164c9c6e4 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/blast/0x43de4318b6eb91a7cf37975dbb574396a7b5b5c6 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/blast/0x9ec9367b8c4dd45ec8e7b800b1f719251053ad60 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/blast/0x25647e01bd0967c1b9599fa3521939871d1d0888 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/blast/0x3041cbd36888becc7bbcbc0045e3b1f144466f5f - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/blast/0xe46935ae80e05cdebd4a4008b6ccaa36d2845370 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/blast/0x09d1d767edf8fa23a64c51fa559e0688e526812f - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/blast/0xc555d55279023e732ccd32d812114caf5838fd46 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/blast/0x48d20b3e529fb3dd7d91293f80638df582ab2daa - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/blast/0x2a6c340bcbb0a79d3deecd3bc5cbc2605ea9259f - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/blast/0xcaa004418eb42cdf00cb057b7c9e28f0ffd840a5 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/blast/0x1ffec7119e315b15852557f654ae0052f76e6ae1 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/blast/0x8c1c499b1796d7f3c2521ac37186b52de024e58c - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/blast/0x4028daac072e492d34a3afdbef0ba7e35d8b55c4 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/blast/0xd3d2e2692501a5c9ca623199d38826e513033a17 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/blast/0x6ada49aeccf6e556bb7a35ef0119cc8ca795294a - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/blast/0x9ff68f61ca5eb0c6606dc517a9d44001e564bb66 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/blast/0xddd23787a6b80a794d952f5fb036d0b31a8e6aff - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/blast/0x470e8de2ebaef52014a47cb5e6af86884947f08c - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/blast/0xda2d09fbbf8ee4b5051a0e9b562c5fcb4b393b18 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/blast/0xf6c4e4f339912541d3f8ed99dba64a1372af5e5b - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/blast/0x7924a818013f39cf800f5589ff1f1f0def54f31f - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/blast/0x69c7bd26512f52bf6f76fab834140d13dda673ca - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/blast/0x2caccf71bdf8fff97c06a46eca29b611b1a74b5e - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/blast/0xaf996125e98b5804c00ffdb4f7ff386307c99a00 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/blast/0x0f23d49bc92ec52ff591d091b3e16c937034496e - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/blast/0x0b07188b12e3bba6a680e553e23c4079e98a034b - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/blast/0xb771f724c504b329623b0ce9199907137670600e - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/blast/0xc7e6b676bfc73ae40bcc4577f22aab1682c691c6 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/blast/0x6ec94f50cadcc79984463688de42a0ca696ec2db - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/blast/0xaf21b0ec0197e63a5c6cc30c8e947eb8165c6212 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/blast/0x5ced44f03ff443bbe14d8ea23bc24425fb89e3ed - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/blast/0xc5be99a02c6857f9eac67bbce58df5572498f40c - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/blast/0xc91ef786fbf6d62858262c82c63de45085dea659 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/blast/0x97e1fcb93ae7267dbafad23f7b9afaa08264cfd8 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/blast/0xa1bf0e900fb272089c9fd299ea14bfccb1d1c2c0 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/blast/0xa5e9c917b4b821e4e0a5bbefce078ab6540d6b5e - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/blast/0x0da7096f14303eddd634c0241963c064e0244984 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/blast/0x96aa22baedc5a605357e0b9ae20ab6b10a472e03 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/soneium/0x21b8065d10f73ee2e260e5b47d3344d3ced7596e - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/soneium/0xa43fe16908251ee70ef74718545e4fe6c5ccec9f - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/soneium/0xb4e16d0168e52d35cacd2c6185b44281ec28c9dc - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/soneium/0x9c4fe5ffd9a9fc5678cfbd93aa2d4fd684b67c4c - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/soneium/0x0d4a11d5eeaac28ec3f61d100daf4d40471f1852 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/soneium/0xbb2b8038a1640196fbe3e38816f3e67cba72d940 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/soneium/0x7b73644935b8e68019ac6356c40661e1bc315860 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/soneium/0xca7c2771d248dcbe09eabe0ce57a62e18da178c0 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/soneium/0xa478c2975ab1ea89e8196811f51a7b7ade33eb11 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/soneium/0x52c77b0cb827afbad022e6d6caf2c44452edbc39 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/soneium/0xc2eab7d33d3cb97692ecb231a5d0e4a649cb539d - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/soneium/0x180efc1349a69390ade25667487a826164c9c6e4 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/soneium/0x43de4318b6eb91a7cf37975dbb574396a7b5b5c6 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/soneium/0x9ec9367b8c4dd45ec8e7b800b1f719251053ad60 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/soneium/0x25647e01bd0967c1b9599fa3521939871d1d0888 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/soneium/0x3041cbd36888becc7bbcbc0045e3b1f144466f5f - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/soneium/0xe46935ae80e05cdebd4a4008b6ccaa36d2845370 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/soneium/0x09d1d767edf8fa23a64c51fa559e0688e526812f - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/soneium/0xc555d55279023e732ccd32d812114caf5838fd46 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/soneium/0x48d20b3e529fb3dd7d91293f80638df582ab2daa - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/soneium/0x2a6c340bcbb0a79d3deecd3bc5cbc2605ea9259f - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/soneium/0xcaa004418eb42cdf00cb057b7c9e28f0ffd840a5 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/soneium/0x1ffec7119e315b15852557f654ae0052f76e6ae1 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/soneium/0x8c1c499b1796d7f3c2521ac37186b52de024e58c - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/soneium/0x4028daac072e492d34a3afdbef0ba7e35d8b55c4 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/soneium/0xd3d2e2692501a5c9ca623199d38826e513033a17 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/soneium/0x6ada49aeccf6e556bb7a35ef0119cc8ca795294a - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/soneium/0x9ff68f61ca5eb0c6606dc517a9d44001e564bb66 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/soneium/0xddd23787a6b80a794d952f5fb036d0b31a8e6aff - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/soneium/0x470e8de2ebaef52014a47cb5e6af86884947f08c - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/soneium/0xda2d09fbbf8ee4b5051a0e9b562c5fcb4b393b18 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/soneium/0xf6c4e4f339912541d3f8ed99dba64a1372af5e5b - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/soneium/0x7924a818013f39cf800f5589ff1f1f0def54f31f - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/soneium/0x69c7bd26512f52bf6f76fab834140d13dda673ca - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/soneium/0x2caccf71bdf8fff97c06a46eca29b611b1a74b5e - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/soneium/0xaf996125e98b5804c00ffdb4f7ff386307c99a00 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/soneium/0x0f23d49bc92ec52ff591d091b3e16c937034496e - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/soneium/0x0b07188b12e3bba6a680e553e23c4079e98a034b - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/soneium/0xb771f724c504b329623b0ce9199907137670600e - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/soneium/0xc7e6b676bfc73ae40bcc4577f22aab1682c691c6 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/soneium/0x6ec94f50cadcc79984463688de42a0ca696ec2db - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/soneium/0xaf21b0ec0197e63a5c6cc30c8e947eb8165c6212 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/soneium/0x5ced44f03ff443bbe14d8ea23bc24425fb89e3ed - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/soneium/0xc5be99a02c6857f9eac67bbce58df5572498f40c - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/soneium/0xc91ef786fbf6d62858262c82c63de45085dea659 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/soneium/0x97e1fcb93ae7267dbafad23f7b9afaa08264cfd8 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/soneium/0xa1bf0e900fb272089c9fd299ea14bfccb1d1c2c0 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/soneium/0xa5e9c917b4b821e4e0a5bbefce078ab6540d6b5e - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/soneium/0x0da7096f14303eddd634c0241963c064e0244984 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/soneium/0x96aa22baedc5a605357e0b9ae20ab6b10a472e03 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/worldchain/0x610e319b3a3ab56a0ed5562927d37c233774ba39 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/worldchain/0xdce053d9ba0fa2c5f772416b64f191158cbcc32e - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/worldchain/0x5f835420502a7702de50cd0e78d8aa3608b2137e - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/worldchain/0x3672722f9c4413c63d8e275bea51ee526449a92d - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/worldchain/0x0d8322f0422664ccf845fccedc10a82b292f9d3a - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/worldchain/0x494d68e3cab640fa50f4c1b3e2499698d1a173a0 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/worldchain/0x02371da6173cf95623da4189e68912233cc7107c - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/worldchain/0x7c3c2a92598d6d77e57fd55c50e99af4b291f595 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/worldchain/0x6787de741bb42ca7ff7dd1b9aad6098c850cdc6a - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/worldchain/0x56505f73cf8f5ef637bb37d9e635c3f520c9b0e5 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/worldchain/0xad710fbc1161b26ea427c158f49a93f6d9d871b4 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/worldchain/0x21b8065d10f73ee2e260e5b47d3344d3ced7596e - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/worldchain/0xa43fe16908251ee70ef74718545e4fe6c5ccec9f - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/worldchain/0xb4e16d0168e52d35cacd2c6185b44281ec28c9dc - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/worldchain/0x9c4fe5ffd9a9fc5678cfbd93aa2d4fd684b67c4c - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/worldchain/0x0d4a11d5eeaac28ec3f61d100daf4d40471f1852 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/worldchain/0xbb2b8038a1640196fbe3e38816f3e67cba72d940 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/worldchain/0x7b73644935b8e68019ac6356c40661e1bc315860 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/worldchain/0xca7c2771d248dcbe09eabe0ce57a62e18da178c0 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/worldchain/0xa478c2975ab1ea89e8196811f51a7b7ade33eb11 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/worldchain/0x52c77b0cb827afbad022e6d6caf2c44452edbc39 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/worldchain/0xc2eab7d33d3cb97692ecb231a5d0e4a649cb539d - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/worldchain/0x180efc1349a69390ade25667487a826164c9c6e4 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/worldchain/0x43de4318b6eb91a7cf37975dbb574396a7b5b5c6 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/worldchain/0x9ec9367b8c4dd45ec8e7b800b1f719251053ad60 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/worldchain/0x25647e01bd0967c1b9599fa3521939871d1d0888 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/worldchain/0x3041cbd36888becc7bbcbc0045e3b1f144466f5f - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/worldchain/0xe46935ae80e05cdebd4a4008b6ccaa36d2845370 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/worldchain/0x09d1d767edf8fa23a64c51fa559e0688e526812f - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/worldchain/0xc555d55279023e732ccd32d812114caf5838fd46 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/worldchain/0x48d20b3e529fb3dd7d91293f80638df582ab2daa - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/worldchain/0x2a6c340bcbb0a79d3deecd3bc5cbc2605ea9259f - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/worldchain/0xcaa004418eb42cdf00cb057b7c9e28f0ffd840a5 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/worldchain/0x1ffec7119e315b15852557f654ae0052f76e6ae1 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/worldchain/0x8c1c499b1796d7f3c2521ac37186b52de024e58c - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/worldchain/0x4028daac072e492d34a3afdbef0ba7e35d8b55c4 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/worldchain/0xd3d2e2692501a5c9ca623199d38826e513033a17 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/worldchain/0x6ada49aeccf6e556bb7a35ef0119cc8ca795294a - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/worldchain/0x9ff68f61ca5eb0c6606dc517a9d44001e564bb66 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/worldchain/0xddd23787a6b80a794d952f5fb036d0b31a8e6aff - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/worldchain/0x470e8de2ebaef52014a47cb5e6af86884947f08c - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/worldchain/0xda2d09fbbf8ee4b5051a0e9b562c5fcb4b393b18 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/worldchain/0xf6c4e4f339912541d3f8ed99dba64a1372af5e5b - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/worldchain/0x7924a818013f39cf800f5589ff1f1f0def54f31f - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/worldchain/0x69c7bd26512f52bf6f76fab834140d13dda673ca - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/worldchain/0x2caccf71bdf8fff97c06a46eca29b611b1a74b5e - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/worldchain/0xaf996125e98b5804c00ffdb4f7ff386307c99a00 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/worldchain/0x0f23d49bc92ec52ff591d091b3e16c937034496e - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/worldchain/0x0b07188b12e3bba6a680e553e23c4079e98a034b - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/worldchain/0xb771f724c504b329623b0ce9199907137670600e - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/worldchain/0xc7e6b676bfc73ae40bcc4577f22aab1682c691c6 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/worldchain/0x6ec94f50cadcc79984463688de42a0ca696ec2db - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/worldchain/0xaf21b0ec0197e63a5c6cc30c8e947eb8165c6212 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/worldchain/0x5ced44f03ff443bbe14d8ea23bc24425fb89e3ed - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/worldchain/0xc5be99a02c6857f9eac67bbce58df5572498f40c - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/worldchain/0xc91ef786fbf6d62858262c82c63de45085dea659 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/worldchain/0x97e1fcb93ae7267dbafad23f7b9afaa08264cfd8 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/worldchain/0xa1bf0e900fb272089c9fd299ea14bfccb1d1c2c0 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/worldchain/0xa5e9c917b4b821e4e0a5bbefce078ab6540d6b5e - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/worldchain/0x0da7096f14303eddd634c0241963c064e0244984 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/worldchain/0x96aa22baedc5a605357e0b9ae20ab6b10a472e03 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zksync/0x3d7264539e6e3f596bb485e3091f3ae02ad01ef8 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zksync/0xeecb86c38c4667b46487255f41c6904df3d76f8f - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zksync/0xa0769a3c6af68812bb3a5cbd511f7879033440eb - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zksync/0x23c77a553aac0ad009441c856c05d117c1131e3d - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zksync/0xedb4833e1cae54b3b7637f71edacf9abfcfbd1bd - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zksync/0xf8c42655373a280e8800beee44fcc12ffc99e797 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zksync/0x4b2dfca17caadc23c9d28eb77ca27b52731e3aba - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zksync/0x105a6f7c2f23270db6eed8d9ee8474323091d30c - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zksync/0x4152fdbf1ce1957b6fafd55737f96a26b787ee9a - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zksync/0x3f618967492945c02d5222d333e903345fde741a - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zksync/0xff577f0e828a878743ecc5e2632cbf65cecf17cf - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zksync/0x3e3dd517fec2e70eddba2a626422a4ba286e8c38 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zksync/0x433587150898e706b21d68b48833cdf274987743 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zksync/0xc99bcff6564bafc70ba1b53c53a03541f780a546 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zksync/0xdc4359ca3a73c05b83759d3fe6618b499ff5f656 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zksync/0xa07028b453a1f6ac277e93f3a0ea73b4be5c7d63 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zksync/0xc1fcd2a14df1a10f91cdd0d9b6191ca264356eec - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zksync/0x3f777c16829c7d1885a7a46912560f1ba764218d - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zksync/0xcbd38eba8170f475063bcc2c56cb213f8db1f9e1 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zksync/0xbeea3b382696669e0e67c08ea9f4aae8d528af0f - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zksync/0xd864e059aae2d400ef3ab5b4d38b4370d63f1277 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zksync/0x9e83bb5cf96fd382affb9f9f4d1bbdb49e7a5e7b - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zksync/0xc4ea014402cddb4c6d2c4cb6d1c696eded93630a - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zksync/0xd8ba14df11d963bd3c00ada3569a361d1810d4b1 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zksync/0x663a655203ec965a3f642772ef49ba1e99c1520d - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zksync/0x1017e7b5efbb2d230979cf166078c1a96cdeeaef - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zksync/0xbffd6eebdd42038067b10e04d3682e6373278ffe - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zksync/0x7657d138111306459def4ba2285730f35ed6066f - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zksync/0x2dee3855d991a07ad3ed1fe3b26343320a122963 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zksync/0xe5bacf3e9b092c71de7cfe28124beb4c9d85783c - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zksync/0x80643ea8601be7f65362d4c2dc17b435dfa22762 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zksync/0xfc93ec2d9d0d390209365013aaa6358db9f77936 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zksync/0x4d8295d7a043007760e1b2ea3ec07c93a906874d - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zksync/0x341584a7aa4cbfe1381009762aabdd0659542348 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zksync/0xed1def6744ba38d53ef80b59ac010b6d9392bcae - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zksync/0xffbd38130ff590d0c4d82e3851f6f4fdf9a3d3ab - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zksync/0x1fa900dbb20ed45d18883849c00632bca16f6610 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zksync/0x81111cd2ab53ccb3d060c0fd7b303654151c3b9d - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zksync/0x6dbdeea3d4127913420eedd6ff25c7c6765e104a - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zksync/0x42e2209e6d9b4ed0cce3d06a5a5d7b65d577cf5c - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zksync/0x21b8065d10f73ee2e260e5b47d3344d3ced7596e - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zksync/0xa43fe16908251ee70ef74718545e4fe6c5ccec9f - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zksync/0xb4e16d0168e52d35cacd2c6185b44281ec28c9dc - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zksync/0x9c4fe5ffd9a9fc5678cfbd93aa2d4fd684b67c4c - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zksync/0x0d4a11d5eeaac28ec3f61d100daf4d40471f1852 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zksync/0xbb2b8038a1640196fbe3e38816f3e67cba72d940 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zksync/0x7b73644935b8e68019ac6356c40661e1bc315860 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zksync/0xca7c2771d248dcbe09eabe0ce57a62e18da178c0 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zksync/0xa478c2975ab1ea89e8196811f51a7b7ade33eb11 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zksync/0x52c77b0cb827afbad022e6d6caf2c44452edbc39 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zksync/0xc2eab7d33d3cb97692ecb231a5d0e4a649cb539d - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zksync/0x180efc1349a69390ade25667487a826164c9c6e4 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zksync/0x43de4318b6eb91a7cf37975dbb574396a7b5b5c6 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zksync/0x9ec9367b8c4dd45ec8e7b800b1f719251053ad60 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zksync/0x25647e01bd0967c1b9599fa3521939871d1d0888 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zksync/0x3041cbd36888becc7bbcbc0045e3b1f144466f5f - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zksync/0xe46935ae80e05cdebd4a4008b6ccaa36d2845370 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zksync/0x09d1d767edf8fa23a64c51fa559e0688e526812f - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zksync/0xc555d55279023e732ccd32d812114caf5838fd46 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zksync/0x48d20b3e529fb3dd7d91293f80638df582ab2daa - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zksync/0x2a6c340bcbb0a79d3deecd3bc5cbc2605ea9259f - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zksync/0xcaa004418eb42cdf00cb057b7c9e28f0ffd840a5 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zksync/0x1ffec7119e315b15852557f654ae0052f76e6ae1 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zksync/0x8c1c499b1796d7f3c2521ac37186b52de024e58c - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zksync/0x4028daac072e492d34a3afdbef0ba7e35d8b55c4 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zksync/0xd3d2e2692501a5c9ca623199d38826e513033a17 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zksync/0x6ada49aeccf6e556bb7a35ef0119cc8ca795294a - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zksync/0x9ff68f61ca5eb0c6606dc517a9d44001e564bb66 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zksync/0xddd23787a6b80a794d952f5fb036d0b31a8e6aff - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zksync/0x470e8de2ebaef52014a47cb5e6af86884947f08c - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zksync/0xda2d09fbbf8ee4b5051a0e9b562c5fcb4b393b18 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zksync/0xf6c4e4f339912541d3f8ed99dba64a1372af5e5b - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zksync/0x7924a818013f39cf800f5589ff1f1f0def54f31f - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zksync/0x69c7bd26512f52bf6f76fab834140d13dda673ca - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zksync/0x2caccf71bdf8fff97c06a46eca29b611b1a74b5e - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zksync/0xaf996125e98b5804c00ffdb4f7ff386307c99a00 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zksync/0x0f23d49bc92ec52ff591d091b3e16c937034496e - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zksync/0x0b07188b12e3bba6a680e553e23c4079e98a034b - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zksync/0xb771f724c504b329623b0ce9199907137670600e - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zksync/0xc7e6b676bfc73ae40bcc4577f22aab1682c691c6 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zksync/0x6ec94f50cadcc79984463688de42a0ca696ec2db - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zksync/0xaf21b0ec0197e63a5c6cc30c8e947eb8165c6212 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zksync/0x5ced44f03ff443bbe14d8ea23bc24425fb89e3ed - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zksync/0xc5be99a02c6857f9eac67bbce58df5572498f40c - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zksync/0xc91ef786fbf6d62858262c82c63de45085dea659 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zksync/0x97e1fcb93ae7267dbafad23f7b9afaa08264cfd8 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zksync/0xa1bf0e900fb272089c9fd299ea14bfccb1d1c2c0 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zksync/0xa5e9c917b4b821e4e0a5bbefce078ab6540d6b5e - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zksync/0x0da7096f14303eddd634c0241963c064e0244984 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zksync/0x96aa22baedc5a605357e0b9ae20ab6b10a472e03 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zora/0x86c2fd1c99d8b7ff541767a4748b2eb38fd43da8 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zora/0xbc59f8f3b275aa56a90d13bae7cce5e6e11a3b17 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zora/0x1ed9b524d6f395ecc61aa24537f87a0482933069 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zora/0xc3aee7c0e80f65ff13655955fa51d971e5d8d535 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zora/0xaea25cc307dc4bac390816f3d85edcbc805c589d - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zora/0x33604ba99eb25c593cabd53c096c131a72a74752 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zora/0x3c127629c99355f3671f128ebef2f49b4d17e4e1 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zora/0x4684c6198243fcd8bcfa706d8e29b6b0531c6172 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zora/0xb14db2b0cdb55dcf97f7388a2f70b7ad28c80885 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zora/0x21b8065d10f73ee2e260e5b47d3344d3ced7596e - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zora/0xa43fe16908251ee70ef74718545e4fe6c5ccec9f - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zora/0xb4e16d0168e52d35cacd2c6185b44281ec28c9dc - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zora/0x9c4fe5ffd9a9fc5678cfbd93aa2d4fd684b67c4c - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zora/0x0d4a11d5eeaac28ec3f61d100daf4d40471f1852 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zora/0xbb2b8038a1640196fbe3e38816f3e67cba72d940 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zora/0x7b73644935b8e68019ac6356c40661e1bc315860 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zora/0xca7c2771d248dcbe09eabe0ce57a62e18da178c0 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zora/0xa478c2975ab1ea89e8196811f51a7b7ade33eb11 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zora/0x52c77b0cb827afbad022e6d6caf2c44452edbc39 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zora/0xc2eab7d33d3cb97692ecb231a5d0e4a649cb539d - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zora/0x180efc1349a69390ade25667487a826164c9c6e4 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zora/0x43de4318b6eb91a7cf37975dbb574396a7b5b5c6 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zora/0x9ec9367b8c4dd45ec8e7b800b1f719251053ad60 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zora/0x25647e01bd0967c1b9599fa3521939871d1d0888 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zora/0x3041cbd36888becc7bbcbc0045e3b1f144466f5f - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zora/0xe46935ae80e05cdebd4a4008b6ccaa36d2845370 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zora/0x09d1d767edf8fa23a64c51fa559e0688e526812f - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zora/0xc555d55279023e732ccd32d812114caf5838fd46 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zora/0x48d20b3e529fb3dd7d91293f80638df582ab2daa - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zora/0x2a6c340bcbb0a79d3deecd3bc5cbc2605ea9259f - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zora/0xcaa004418eb42cdf00cb057b7c9e28f0ffd840a5 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zora/0x1ffec7119e315b15852557f654ae0052f76e6ae1 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zora/0x8c1c499b1796d7f3c2521ac37186b52de024e58c - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zora/0x4028daac072e492d34a3afdbef0ba7e35d8b55c4 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zora/0xd3d2e2692501a5c9ca623199d38826e513033a17 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zora/0x6ada49aeccf6e556bb7a35ef0119cc8ca795294a - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zora/0x9ff68f61ca5eb0c6606dc517a9d44001e564bb66 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zora/0xddd23787a6b80a794d952f5fb036d0b31a8e6aff - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zora/0x470e8de2ebaef52014a47cb5e6af86884947f08c - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zora/0xda2d09fbbf8ee4b5051a0e9b562c5fcb4b393b18 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zora/0xf6c4e4f339912541d3f8ed99dba64a1372af5e5b - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zora/0x7924a818013f39cf800f5589ff1f1f0def54f31f - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zora/0x69c7bd26512f52bf6f76fab834140d13dda673ca - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zora/0x2caccf71bdf8fff97c06a46eca29b611b1a74b5e - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zora/0xaf996125e98b5804c00ffdb4f7ff386307c99a00 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zora/0x0f23d49bc92ec52ff591d091b3e16c937034496e - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zora/0x0b07188b12e3bba6a680e553e23c4079e98a034b - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zora/0xb771f724c504b329623b0ce9199907137670600e - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zora/0xc7e6b676bfc73ae40bcc4577f22aab1682c691c6 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zora/0x6ec94f50cadcc79984463688de42a0ca696ec2db - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zora/0xaf21b0ec0197e63a5c6cc30c8e947eb8165c6212 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zora/0x5ced44f03ff443bbe14d8ea23bc24425fb89e3ed - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zora/0xc5be99a02c6857f9eac67bbce58df5572498f40c - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zora/0xc91ef786fbf6d62858262c82c63de45085dea659 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zora/0x97e1fcb93ae7267dbafad23f7b9afaa08264cfd8 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zora/0xa1bf0e900fb272089c9fd299ea14bfccb1d1c2c0 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zora/0xa5e9c917b4b821e4e0a5bbefce078ab6540d6b5e - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zora/0x0da7096f14303eddd634c0241963c064e0244984 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/zora/0x96aa22baedc5a605357e0b9ae20ab6b10a472e03 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/ethereum/0x970a7749ecaa4394c8b2bf5f2471f41fd6b79288 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/ethereum/0xf7fd0860922bd3352e2dbaf725a182b74bf7a2e1 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/ethereum/0xab22d1d671bb5cee8735c5ba29ea651ccda48a8e - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/ethereum/0xb003df4b243f938132e8cadbeb237abc5a889fb4 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/ethereum/0x859f7092f56c43bb48bb46de7119d9c799716cdf - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/ethereum/0xe532b04d2f2e921dfec69e132e9214d2f82df304 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/ethereum/0x2a6c361b43a2edcae08e2bd5448e90e9369cced9 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/arbitrum/0x00c8e9500f32237beecfc8179ae064606d457577 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/arbitrum/0x5151c83ad4e1c8c4ea0d1eaf91c246a8c6dab2a4 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/arbitrum/0xad397a0472503b066ab4b311d66fa1f659f4cb61 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/arbitrum/0x859f7092f56c43bb48bb46de7119d9c799716cdf - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/arbitrum/0xe532b04d2f2e921dfec69e132e9214d2f82df304 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/arbitrum/0x2a6c361b43a2edcae08e2bd5448e90e9369cced9 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/optimism/0x859f7092f56c43bb48bb46de7119d9c799716cdf - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/optimism/0xe532b04d2f2e921dfec69e132e9214d2f82df304 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/optimism/0x2a6c361b43a2edcae08e2bd5448e90e9369cced9 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/polygon/0xaf948ca24669f5ca9f5b6f90d9f2cef12f4a0d20 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/polygon/0x7d4324293304797cb662c6ea1b904b6af2b485f5 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/pools/polygon/0x859f7092f56c43bb48bb46de7119d9c799716cdf - 2025-10-17T22:04:33.647Z + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/polygon/0xe532b04d2f2e921dfec69e132e9214d2f82df304 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/celo/0xb771f724c504b329623b0ce9199907137670600e + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/polygon/0x2a6c361b43a2edcae08e2bd5448e90e9369cced9 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/celo/0xaf996125e98b5804c00ffdb4f7ff386307c99a00 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/base/0x80e4f4f8bb89dab206c6bb4bddbf2ad72500394d - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/celo/0x69c7bd26512f52bf6f76fab834140d13dda673ca + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/base/0xdfcfdf5dd0569d591e0bce28b5da3b13de09e3cb - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/celo/0x0b07188b12e3bba6a680e553e23c4079e98a034b + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/base/0x73ccdeaa8957422c0a64e83f50c8814c7b33fe99 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/celo/0x5ced44f03ff443bbe14d8ea23bc24425fb89e3ed + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/base/0x859f7092f56c43bb48bb46de7119d9c799716cdf - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/celo/0xa1bf0e900fb272089c9fd299ea14bfccb1d1c2c0 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/base/0xe532b04d2f2e921dfec69e132e9214d2f82df304 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/celo/0xaf21b0ec0197e63a5c6cc30c8e947eb8165c6212 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/base/0x2a6c361b43a2edcae08e2bd5448e90e9369cced9 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/celo/0x0da7096f14303eddd634c0241963c064e0244984 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/bnb/0xe3f5da07bcbfeb310ca65a6f98656dd41c3d3b4a - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/celo/0x2aeee741fa1e21120a21e57db9ee545428e683c9 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/bnb/0x329eeb1a58bdb3b804d1f94623c7a29a67a9b6b7 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/celo/0x96aa22baedc5a605357e0b9ae20ab6b10a472e03 + 2025-03-20T21:18:53.078Z 0.8 - https://app.uniswap.org/explore/pools/bnb/0x859f7092f56c43bb48bb46de7119d9c799716cdf - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/unichain/0x65081cb48d74a32e9ccfed75164b8c09972dbcf1 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/bnb/0xe532b04d2f2e921dfec69e132e9214d2f82df304 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/unichain/0x5b16de420b1d093b962c0bc03dd91b6d423f8c4a + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/bnb/0x2a6c361b43a2edcae08e2bd5448e90e9369cced9 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/unichain/0x18b268965e4e702bdf13469205937894b8ab0ee8 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/celo/0x0d76866f78fcbca2730e60c5997d59d6ba585613 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/unichain/0x6b918c9f87b46a758c2b51bce427c8028dacb720 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/celo/0x859f7092f56c43bb48bb46de7119d9c799716cdf - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/unichain/0xbda709a0665b340898856b8b29ff87079bb130d3 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/celo/0xe532b04d2f2e921dfec69e132e9214d2f82df304 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/unichain/0xd49174dba635489c67fa628864c2d0d04824ebd8 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/celo/0x2a6c361b43a2edcae08e2bd5448e90e9369cced9 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/unichain/0x9e2ef5522b2f9eac00912f25082f6e652123b54d + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/unichain/0xd279f8bcc5f037f08cad776a0186acde0417c339 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/unichain/0xc673d5164103357a7537c36438a6326776a14bbd + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/unichain/0x1dfab2147401be78ea05f05a0379f86ec87a81cc - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/unichain/0x8eb4b07affbd1083f42032eed35cd32e382ee8b7 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/unichain/0x859f7092f56c43bb48bb46de7119d9c799716cdf - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/unichain/0x12095933f1eeb066176dd2e41e5a2f8be6974616 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/unichain/0xe532b04d2f2e921dfec69e132e9214d2f82df304 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/unichain/0xfbc45ab96d02e150b2ddeb7dd4eacd3d8c674f4a + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/unichain/0x2a6c361b43a2edcae08e2bd5448e90e9369cced9 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/unichain/0xa9c6669de2c04c2adb22ac7a65d75b47fee30e35 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/unichain/0x9c84f58bb51fabd18698efe95f5bab4f33e96e8f - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/unichain/0x18ce92e7a37d994657f97c3defaf880a805f08d5 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/avalanche/0xf2b8c40f98dae03f261d41f312bd204f68430acc - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/unichain/0x9d7151413833dcb13ae284d6a7fccd93989c47a1 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/avalanche/0xa8c90356d7c7dc508eef63670927bb15a0dc0298 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/unichain/0xe97a0889d2b0660fddc144a8893b3ac9236756a6 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/avalanche/0x859f7092f56c43bb48bb46de7119d9c799716cdf - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/unichain/0x75951bafe00c9ec72df8597444f4e8fa156110a7 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/avalanche/0xe532b04d2f2e921dfec69e132e9214d2f82df304 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/unichain/0x8927058918e3cff6f55efe45a58db1be1f069e49 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/avalanche/0x2a6c361b43a2edcae08e2bd5448e90e9369cced9 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/unichain/0x21b8065d10f73ee2e260e5b47d3344d3ced7596e + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/avalanche/0x9c84f58bb51fabd18698efe95f5bab4f33e96e8f - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/unichain/0xa43fe16908251ee70ef74718545e4fe6c5ccec9f + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/blast/0x859f7092f56c43bb48bb46de7119d9c799716cdf - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/unichain/0xb4e16d0168e52d35cacd2c6185b44281ec28c9dc + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/blast/0xe532b04d2f2e921dfec69e132e9214d2f82df304 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/unichain/0x9c4fe5ffd9a9fc5678cfbd93aa2d4fd684b67c4c + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/blast/0x2a6c361b43a2edcae08e2bd5448e90e9369cced9 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/unichain/0x0d4a11d5eeaac28ec3f61d100daf4d40471f1852 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/blast/0x9c84f58bb51fabd18698efe95f5bab4f33e96e8f - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/unichain/0xbb2b8038a1640196fbe3e38816f3e67cba72d940 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/soneium/0x859f7092f56c43bb48bb46de7119d9c799716cdf - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/unichain/0x7b73644935b8e68019ac6356c40661e1bc315860 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/soneium/0xe532b04d2f2e921dfec69e132e9214d2f82df304 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/unichain/0xca7c2771d248dcbe09eabe0ce57a62e18da178c0 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/soneium/0x2a6c361b43a2edcae08e2bd5448e90e9369cced9 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/unichain/0xa478c2975ab1ea89e8196811f51a7b7ade33eb11 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/soneium/0x9c84f58bb51fabd18698efe95f5bab4f33e96e8f - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/unichain/0x52c77b0cb827afbad022e6d6caf2c44452edbc39 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/worldchain/0x48466012f56a07f89656dab41a996986602fd1aa - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/unichain/0xc2eab7d33d3cb97692ecb231a5d0e4a649cb539d + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/worldchain/0x073b315457c5f4f5e658f6c06998a60abb5a7b90 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/unichain/0x180efc1349a69390ade25667487a826164c9c6e4 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/worldchain/0xc19bc89ac024426f5a23c5bb8bc91d8017c90684 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/unichain/0x43de4318b6eb91a7cf37975dbb574396a7b5b5c6 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/worldchain/0x859f7092f56c43bb48bb46de7119d9c799716cdf - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/unichain/0x9ec9367b8c4dd45ec8e7b800b1f719251053ad60 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/worldchain/0xe532b04d2f2e921dfec69e132e9214d2f82df304 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/unichain/0xe46935ae80e05cdebd4a4008b6ccaa36d2845370 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/worldchain/0x2a6c361b43a2edcae08e2bd5448e90e9369cced9 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/unichain/0xc555d55279023e732ccd32d812114caf5838fd46 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/worldchain/0x9c84f58bb51fabd18698efe95f5bab4f33e96e8f - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/unichain/0x3041cbd36888becc7bbcbc0045e3b1f144466f5f + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/zksync/0x859f7092f56c43bb48bb46de7119d9c799716cdf - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/unichain/0x25647e01bd0967c1b9599fa3521939871d1d0888 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/zksync/0xe532b04d2f2e921dfec69e132e9214d2f82df304 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/unichain/0x09d1d767edf8fa23a64c51fa559e0688e526812f + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/zksync/0x2a6c361b43a2edcae08e2bd5448e90e9369cced9 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/unichain/0x48d20b3e529fb3dd7d91293f80638df582ab2daa + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/zksync/0x9c84f58bb51fabd18698efe95f5bab4f33e96e8f - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/unichain/0x2a6c340bcbb0a79d3deecd3bc5cbc2605ea9259f + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/zora/0x859f7092f56c43bb48bb46de7119d9c799716cdf - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/unichain/0x1ffec7119e315b15852557f654ae0052f76e6ae1 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/zora/0xe532b04d2f2e921dfec69e132e9214d2f82df304 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/unichain/0xd3d2e2692501a5c9ca623199d38826e513033a17 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/zora/0x2a6c361b43a2edcae08e2bd5448e90e9369cced9 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/unichain/0xcaa004418eb42cdf00cb057b7c9e28f0ffd840a5 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/zora/0x9c84f58bb51fabd18698efe95f5bab4f33e96e8f - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/unichain/0x4028daac072e492d34a3afdbef0ba7e35d8b55c4 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/arbitrum/0x4e6c10e2b505a1e8324aa64d3a92de764cf86783 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/unichain/0x9ff68f61ca5eb0c6606dc517a9d44001e564bb66 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/base/0x953764548d1ca834e2b73fcd0d26a495336c99c8 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/unichain/0x6ada49aeccf6e556bb7a35ef0119cc8ca795294a + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/bnb/0x4361aaffc616809a8536ea3d5afff3d1b87921a4 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/unichain/0x8c1c499b1796d7f3c2521ac37186b52de024e58c + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/ethereum/0xc275a7390966e4bcbf331b837cd7316c4a3efa83 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/unichain/0x7924a818013f39cf800f5589ff1f1f0def54f31f + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/ethereum/0x1e1dfff79d95725aaafd6b47af4fbc28d859ce28 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/unichain/0xda2d09fbbf8ee4b5051a0e9b562c5fcb4b393b18 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/optimism/0x7de4c593fe83417ca6ef98d7cf59c99d304f41c9 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/unichain/0x470e8de2ebaef52014a47cb5e6af86884947f08c + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/base/0xd38d1ab8a150e6ee0ae70c86a8e9fb0c83255b76 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/unichain/0xf6c4e4f339912541d3f8ed99dba64a1372af5e5b + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/base/0x06d7874037e622d6ef42294cf32eb259806cb1c6 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/unichain/0xb771f724c504b329623b0ce9199907137670600e + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/celo/0x37fd96e1d24f69f20172ab97040f806284a31ae5 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/unichain/0x0f23d49bc92ec52ff591d091b3e16c937034496e + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/celo/0xa4bc5aa6229e6f2baa4b8851b19342a1d1217c08 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/unichain/0xddd23787a6b80a794d952f5fb036d0b31a8e6aff + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/unichain/0x1d6ae37db0e36305019fb3d4bad2750b8784adf9 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/unichain/0x2caccf71bdf8fff97c06a46eca29b611b1a74b5e + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/unichain/0x5c90b076af8cb73ef064efc09eae7936132bebcf - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/unichain/0xaf996125e98b5804c00ffdb4f7ff386307c99a00 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/avalanche/0x9a601b332698e64aa90fd468ce858d504e43e7df - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/unichain/0x69c7bd26512f52bf6f76fab834140d13dda673ca + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/ethereum/0xb431c70f800100d87554ac1142c4a94c5fe4c0c4 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/unichain/0x0b07188b12e3bba6a680e553e23c4079e98a034b + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/ethereum/0x3885fbe4cd8aed7b7e9625923927fa1ce30662a3 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/unichain/0xc5be99a02c6857f9eac67bbce58df5572498f40c + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/arbitrum/0x3885fbe4cd8aed7b7e9625923927fa1ce30662a3 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/unichain/0x5ced44f03ff443bbe14d8ea23bc24425fb89e3ed + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/optimism/0x1bc877326b683d8aeaca8dbbc604b649e5ad78e6 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/unichain/0xc7e6b676bfc73ae40bcc4577f22aab1682c691c6 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/optimism/0x3885fbe4cd8aed7b7e9625923927fa1ce30662a3 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/unichain/0xa1bf0e900fb272089c9fd299ea14bfccb1d1c2c0 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/polygon/0x3885fbe4cd8aed7b7e9625923927fa1ce30662a3 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/unichain/0xaf21b0ec0197e63a5c6cc30c8e947eb8165c6212 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/base/0xedc625b74537ee3a10874f53d170e9c17a906b9c - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/unichain/0xc91ef786fbf6d62858262c82c63de45085dea659 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/base/0x3885fbe4cd8aed7b7e9625923927fa1ce30662a3 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/unichain/0x0da7096f14303eddd634c0241963c064e0244984 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/bnb/0x3885fbe4cd8aed7b7e9625923927fa1ce30662a3 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/unichain/0x97e1fcb93ae7267dbafad23f7b9afaa08264cfd8 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/celo/0x3885fbe4cd8aed7b7e9625923927fa1ce30662a3 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/unichain/0x2aeee741fa1e21120a21e57db9ee545428e683c9 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/unichain/0x1b01fba73ff847e3d96162a8bcd5426f6cde56a6 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/unichain/0xa5e9c917b4b821e4e0a5bbefce078ab6540d6b5e + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/unichain/0x5c75bfb6194d7d763d33ea292cbc50cda806451b - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/unichain/0x96aa22baedc5a605357e0b9ae20ab6b10a472e03 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/unichain/0x67324985b5014b36b960273353deb3d96f2f18c2 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/avalanche/0xfae3f424a0a47706811521e3ee268f00cfb5c45e + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/unichain/0x3885fbe4cd8aed7b7e9625923927fa1ce30662a3 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/avalanche/0x7b602f98d71715916e7c963f51bfebc754ade2d0 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/unichain/0x5281e311734869c64ca60ef047fd87759397efe6 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/avalanche/0xb978a8c502ce97b04043036a91548b846067f9ea + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/avalanche/0xd3249cfbb4c00dd81f377ef5113848c5cc848780 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/avalanche/0x804226ca4edb38e7ef56d16d16e92dc3223347a0 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/avalanche/0x83c6bdb0355c6b69277a388416e4dca992a81d6f - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/avalanche/0x9ba9c677d19347abfba1d6b6d6ceb61942071561 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/avalanche/0xc566b786309bf2fe34dd48cea1267b13cead02bb - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/avalanche/0x5e8754aaa7c2da42c218f40435cbdedbae88bfc5 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/avalanche/0x67324985b5014b36b960273353deb3d96f2f18c2 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/avalanche/0xeb7e0191f4054868d97f33ca7a4176b226ccbd2f + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/avalanche/0x3885fbe4cd8aed7b7e9625923927fa1ce30662a3 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/avalanche/0xd1356d360f37932059e5b89b7992692aa234eda6 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/avalanche/0x5281e311734869c64ca60ef047fd87759397efe6 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/avalanche/0x27b571f3e7f7827b13d927d2d59244e3e58a7d1a + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/blast/0x67324985b5014b36b960273353deb3d96f2f18c2 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/avalanche/0xe54dadf5b4f8779256e1bbb94eca00b124311208 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/blast/0x3885fbe4cd8aed7b7e9625923927fa1ce30662a3 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/avalanche/0xb2dc1235bf4b36628a8665aeb668bf202759528a + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/blast/0x5281e311734869c64ca60ef047fd87759397efe6 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/avalanche/0x724f6a02ed2eb82d8d45034b280903cf663731ab + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/soneium/0x67324985b5014b36b960273353deb3d96f2f18c2 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/avalanche/0x2e587b9e7aa638d7eb7db5fe7447513bc4d0d28b + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/soneium/0x3885fbe4cd8aed7b7e9625923927fa1ce30662a3 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/avalanche/0xa7141c79d3d4a9ad67ba95d2b97fe7eed9fb92b3 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/soneium/0x5281e311734869c64ca60ef047fd87759397efe6 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/avalanche/0x01c7c6066ec10b1cd4821e13b9fb063680ffa083 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/worldchain/0x67324985b5014b36b960273353deb3d96f2f18c2 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/avalanche/0x01ed0722f62a5dd3212b04aed2a2065623a705bb + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/worldchain/0x3885fbe4cd8aed7b7e9625923927fa1ce30662a3 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/avalanche/0x28f577ed1cb3b0add148d745d9c0a2c0c40cc48d + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/worldchain/0x5281e311734869c64ca60ef047fd87759397efe6 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/avalanche/0x12089f58e0e7eadfc7d60cf1b1ed6839a811672a + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/zksync/0x67324985b5014b36b960273353deb3d96f2f18c2 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/avalanche/0x3859de09906bed098879cbef34d80817357244c7 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/zksync/0x3885fbe4cd8aed7b7e9625923927fa1ce30662a3 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/avalanche/0x178b99eaa2f6bc97d16f84edbce2e23ae6b8140b + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/zksync/0x5281e311734869c64ca60ef047fd87759397efe6 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/avalanche/0x0e663593657b064e1bae76d28625df5d0ebd4421 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/zora/0x67324985b5014b36b960273353deb3d96f2f18c2 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/avalanche/0xd18384f4398bf5415902ad5d87eaa96549fd4f1e + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/zora/0x3885fbe4cd8aed7b7e9625923927fa1ce30662a3 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/avalanche/0x97bb1788dcd64e17166931b87789cae97c154009 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/zora/0x5281e311734869c64ca60ef047fd87759397efe6 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/avalanche/0x83b9a48793f4e5be12cfe1de3b1d55a83c4f1a9a + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/optimism/0x4905220ca9d1001daa7be72e877243f4996002e0 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/avalanche/0x6d61ae1b0d94941dc702581daaaafc7665d1c6d7 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/base/0x2fa9d6085c91151200e61a3e627d35001772c0d1 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/avalanche/0x9a68f0bbced6d6f1f63f0a61215742377ac9d325 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/bnb/0xa1d79325ec44d5d5a69119010823da0ec746e615 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/avalanche/0xcea3c61705b68fefd8da1048ca69db1344180fcb + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/unichain/0xcbe856765eeec3fdc505ddebf9dc612da995e593 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/avalanche/0xf39f633a18042105454ff64c6abd07beb8cbcead + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/avalanche/0xcbe856765eeec3fdc505ddebf9dc612da995e593 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/avalanche/0x7fd0055020a6d9c43c31c8ea755c5038ebd39722 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/blast/0xcbe856765eeec3fdc505ddebf9dc612da995e593 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/avalanche/0xe1e870fdff3ad67f2879542d841d8ab3e1406f4c + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/soneium/0xcbe856765eeec3fdc505ddebf9dc612da995e593 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/avalanche/0xc0a57a72cb7da55da2e50f664b1641570941618f + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/worldchain/0xcbe856765eeec3fdc505ddebf9dc612da995e593 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/avalanche/0x43fb9c3fd6715e872272b0caab968a97692726eb + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/zksync/0xcbe856765eeec3fdc505ddebf9dc612da995e593 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/avalanche/0xfc1e7bc60adfc151565c033521ee6ccbde027f54 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/zora/0xcbe856765eeec3fdc505ddebf9dc612da995e593 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/avalanche/0xd399718256c5206d9586e866169dbdf131193e02 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/polygon/0x57a63adebf02680c996a89413c324901dc0df801 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/avalanche/0x9d1bcb75a7bc5defe7daed505c462572b5e022f9 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/unichain/0xe5028e8e8fb3488c2003c09fffc00876bc974b1a - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/avalanche/0xfd584fcc3a74429d85c9a2294eaf0f566ddfd593 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/unichain/0x704ad8d95c12d7fea531738faa94402725acb035 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/avalanche/0x90fbfd28f16fa163b914be6b9b3eeeb1c3e02fe5 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/avalanche/0xdfea50f83fd27967741f2220110449d8663a1b4f - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/avalanche/0x118bc22a76a71ff3187577422af2d57210277bab + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/avalanche/0x704ad8d95c12d7fea531738faa94402725acb035 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/avalanche/0x94a0d838379e9703b69a777191d8a8951ada2e8e + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/blast/0x704ad8d95c12d7fea531738faa94402725acb035 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/avalanche/0xd312a35320a5936409edfd5e2eb0d17bcf99910b + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/soneium/0x704ad8d95c12d7fea531738faa94402725acb035 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/avalanche/0x78b4c0301b7e6e3d31f259b3f112ced639f030a3 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/worldchain/0x704ad8d95c12d7fea531738faa94402725acb035 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/avalanche/0xaf4ceda77ec614099ffe67b7f4fe4427d52e75cc + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/zksync/0x704ad8d95c12d7fea531738faa94402725acb035 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/avalanche/0x0e7a5a8177d5711dc90ba9a6ded590060f52dd29 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/zora/0x704ad8d95c12d7fea531738faa94402725acb035 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/avalanche/0x9a601b332698e64aa90fd468ce858d504e43e7df + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/ethereum/0x841820459769cd629b10a36fd12e603938cc2679 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/avalanche/0x15309a0e8c954c46601d8028153125c3b92884b6 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/ethereum/0xfff8d5fff6ee3226fa2f5d7d5d8c3ff785be9c74 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/avalanche/0xd494b33229ee2c857a43b94ee7117be05e5fd88c + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/arbitrum/0x38fd16cebb0ec8bbc3041a9c40b4394d2743e77a - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/avalanche/0xdbd8a9c9d060973557f3ac7c7f642a9523529d68 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/arbitrum/0x6200b24e69eb9a12c06d09f21b0335a9b0eeb227 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/avalanche/0xcec63fa2b71744e1cdd48f71e34acedd46b496aa + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/arbitrum/0xfff8d5fff6ee3226fa2f5d7d5d8c3ff785be9c74 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/avalanche/0x0fbb556c73226b12cd7cfb2bed56e77fc177f0ec + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/optimism/0xfff8d5fff6ee3226fa2f5d7d5d8c3ff785be9c74 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/avalanche/0xc566b786309bf2fe34dd48cea1267b13cead02bb + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/polygon/0xfff8d5fff6ee3226fa2f5d7d5d8c3ff785be9c74 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/avalanche/0x21b8065d10f73ee2e260e5b47d3344d3ced7596e + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/base/0xbc9df7f489b3d5d38da7c5a6f7d751bdaa88f254 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/avalanche/0xa43fe16908251ee70ef74718545e4fe6c5ccec9f + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/base/0xd19c0dbbc5ba2ec4faa0e3fff892f0e95f23d9e0 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/avalanche/0xb4e16d0168e52d35cacd2c6185b44281ec28c9dc + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/base/0xfff8d5fff6ee3226fa2f5d7d5d8c3ff785be9c74 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/avalanche/0x9c4fe5ffd9a9fc5678cfbd93aa2d4fd684b67c4c + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/bnb/0x76a67a7fb64253fb4b0d80e1adbd71bd5865d68a - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/avalanche/0x0d4a11d5eeaac28ec3f61d100daf4d40471f1852 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/bnb/0xfff8d5fff6ee3226fa2f5d7d5d8c3ff785be9c74 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/avalanche/0xbb2b8038a1640196fbe3e38816f3e67cba72d940 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/celo/0xfff8d5fff6ee3226fa2f5d7d5d8c3ff785be9c74 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/avalanche/0x7b73644935b8e68019ac6356c40661e1bc315860 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/unichain/0xff3d4af6aed14f62c202d55871f75c37951409c3 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/avalanche/0xca7c2771d248dcbe09eabe0ce57a62e18da178c0 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/unichain/0xc799b2440fd3b8618b87dfbf6b0dabf218e92274 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/avalanche/0xa478c2975ab1ea89e8196811f51a7b7ade33eb11 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/unichain/0x1ae3579d37ede91662003a9e9eed3997f3339eff - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/avalanche/0x52c77b0cb827afbad022e6d6caf2c44452edbc39 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/unichain/0x59ca2b1d97c98d585402531a7056321a9935e052 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/avalanche/0xc2eab7d33d3cb97692ecb231a5d0e4a649cb539d + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/unichain/0x8d58a3348f302f2daad2bab66a83849d900effd9 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/avalanche/0x180efc1349a69390ade25667487a826164c9c6e4 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/unichain/0x5b16de420b1d093b962c0bc03dd91b6d423f8c4a - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/avalanche/0x43de4318b6eb91a7cf37975dbb574396a7b5b5c6 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/unichain/0xbd50f13489f8901e692862f440a5062d5f1aa062 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/avalanche/0x9ec9367b8c4dd45ec8e7b800b1f719251053ad60 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/unichain/0x1db0bca1d1a09e5a86213d349fa4fe33f8fe7fe2 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/avalanche/0xe46935ae80e05cdebd4a4008b6ccaa36d2845370 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/unichain/0x20a613705ed7ee62821ae0879bfc47a2450eb0dd - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/avalanche/0xc555d55279023e732ccd32d812114caf5838fd46 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/unichain/0x52393e963583683a75cff607792410bd48aa02d0 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/avalanche/0x3041cbd36888becc7bbcbc0045e3b1f144466f5f + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/unichain/0xfa20fa20b90c4c2411532c565cad7c14f9bc4a56 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/avalanche/0x25647e01bd0967c1b9599fa3521939871d1d0888 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/unichain/0x4d661231d973ff9c7c1b0e34a28b94bb70cb3894 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/avalanche/0x09d1d767edf8fa23a64c51fa559e0688e526812f + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/unichain/0x1c276bd1a3bc05b034d50a7369b0bd5b39223a65 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/avalanche/0x48d20b3e529fb3dd7d91293f80638df582ab2daa + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/unichain/0x338e7862fcae6c3dec1c49606c0fe297422fce39 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/avalanche/0x2a6c340bcbb0a79d3deecd3bc5cbc2605ea9259f + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/unichain/0xed79818e8168083883d5279c181eb76054d16c87 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/avalanche/0x1ffec7119e315b15852557f654ae0052f76e6ae1 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/unichain/0x308c6fbd6a14881af333649f17f2fde9cd75e2a6 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/avalanche/0xd3d2e2692501a5c9ca623199d38826e513033a17 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/unichain/0xf07a84f0732dfe8eea0d3961bcd8f62c761ff508 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/avalanche/0xcaa004418eb42cdf00cb057b7c9e28f0ffd840a5 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/unichain/0xfff8d5fff6ee3226fa2f5d7d5d8c3ff785be9c74 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/avalanche/0x4028daac072e492d34a3afdbef0ba7e35d8b55c4 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/unichain/0xe945683b3462d2603a18bdfbb19261c6a4f03ad1 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/avalanche/0x9ff68f61ca5eb0c6606dc517a9d44001e564bb66 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/avalanche/0xff878f095ea20f29d3b0967052c96526fc6ee14f - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/avalanche/0x6ada49aeccf6e556bb7a35ef0119cc8ca795294a + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/avalanche/0x308c6fbd6a14881af333649f17f2fde9cd75e2a6 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/avalanche/0x8c1c499b1796d7f3c2521ac37186b52de024e58c + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/avalanche/0xf07a84f0732dfe8eea0d3961bcd8f62c761ff508 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/avalanche/0x7924a818013f39cf800f5589ff1f1f0def54f31f + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/avalanche/0xfff8d5fff6ee3226fa2f5d7d5d8c3ff785be9c74 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/avalanche/0xda2d09fbbf8ee4b5051a0e9b562c5fcb4b393b18 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/avalanche/0xe945683b3462d2603a18bdfbb19261c6a4f03ad1 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/avalanche/0x470e8de2ebaef52014a47cb5e6af86884947f08c + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/blast/0x308c6fbd6a14881af333649f17f2fde9cd75e2a6 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/avalanche/0xf6c4e4f339912541d3f8ed99dba64a1372af5e5b + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/blast/0xf07a84f0732dfe8eea0d3961bcd8f62c761ff508 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/avalanche/0xb771f724c504b329623b0ce9199907137670600e + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/blast/0xfff8d5fff6ee3226fa2f5d7d5d8c3ff785be9c74 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/avalanche/0x0f23d49bc92ec52ff591d091b3e16c937034496e + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/blast/0xe945683b3462d2603a18bdfbb19261c6a4f03ad1 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/avalanche/0xddd23787a6b80a794d952f5fb036d0b31a8e6aff + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/soneium/0xcd4255ceae51803a9333aa1a559991e17b024efc - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/avalanche/0x2caccf71bdf8fff97c06a46eca29b611b1a74b5e + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/soneium/0xd68e61880190ebf2bda21a66d3064625866ddabd - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/avalanche/0xaf996125e98b5804c00ffdb4f7ff386307c99a00 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/soneium/0xecbe401654382b37ba3b5fea8950874b47e83a56 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/avalanche/0x69c7bd26512f52bf6f76fab834140d13dda673ca + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/soneium/0x308c6fbd6a14881af333649f17f2fde9cd75e2a6 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/avalanche/0x0b07188b12e3bba6a680e553e23c4079e98a034b + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/soneium/0xf07a84f0732dfe8eea0d3961bcd8f62c761ff508 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/avalanche/0xc5be99a02c6857f9eac67bbce58df5572498f40c + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/soneium/0xfff8d5fff6ee3226fa2f5d7d5d8c3ff785be9c74 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/avalanche/0x5ced44f03ff443bbe14d8ea23bc24425fb89e3ed + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/soneium/0xe945683b3462d2603a18bdfbb19261c6a4f03ad1 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/avalanche/0xc7e6b676bfc73ae40bcc4577f22aab1682c691c6 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/worldchain/0x1a4abfe77b9aec6259757805bd0d3c46fca6d494 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/avalanche/0xa1bf0e900fb272089c9fd299ea14bfccb1d1c2c0 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/worldchain/0x308c6fbd6a14881af333649f17f2fde9cd75e2a6 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/avalanche/0xaf21b0ec0197e63a5c6cc30c8e947eb8165c6212 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/worldchain/0xf07a84f0732dfe8eea0d3961bcd8f62c761ff508 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/avalanche/0xc91ef786fbf6d62858262c82c63de45085dea659 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/worldchain/0xfff8d5fff6ee3226fa2f5d7d5d8c3ff785be9c74 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/avalanche/0x0da7096f14303eddd634c0241963c064e0244984 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/worldchain/0xe945683b3462d2603a18bdfbb19261c6a4f03ad1 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/avalanche/0x97e1fcb93ae7267dbafad23f7b9afaa08264cfd8 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/zksync/0x308c6fbd6a14881af333649f17f2fde9cd75e2a6 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/avalanche/0x2aeee741fa1e21120a21e57db9ee545428e683c9 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/zksync/0xf07a84f0732dfe8eea0d3961bcd8f62c761ff508 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/avalanche/0xa5e9c917b4b821e4e0a5bbefce078ab6540d6b5e + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/zksync/0xfff8d5fff6ee3226fa2f5d7d5d8c3ff785be9c74 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/avalanche/0x96aa22baedc5a605357e0b9ae20ab6b10a472e03 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/zksync/0xe945683b3462d2603a18bdfbb19261c6a4f03ad1 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/blast/0xf52b4b69123cbcf07798ae8265642793b2e8990c + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/zora/0x308c6fbd6a14881af333649f17f2fde9cd75e2a6 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/blast/0x85287626e78602d0da569332e419154b0bdea035 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/zora/0xf07a84f0732dfe8eea0d3961bcd8f62c761ff508 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/blast/0x1cf4cfc7a984a474ab03f444ccedb30c3ae6f56c + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/zora/0xfff8d5fff6ee3226fa2f5d7d5d8c3ff785be9c74 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/blast/0xf5a23bdd36a56ede75d503f6f643d5eaf25b1a8f + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/zora/0xe945683b3462d2603a18bdfbb19261c6a4f03ad1 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/blast/0x57529f9e2a23cc53fc387b162d2ab0f1df3ed701 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/arbitrum/0x7a11472726c3cf31b9a4c6900118aacd2a3e584a - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/blast/0xf4b646bc85458cc74497c773e2bc8b9ec1351e97 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/bnb/0xfdfc89d953e044f84faa2ed4953190a066328ee0 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/blast/0xf08ff66b8ec0db053711f4989c40b084564f7de3 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/unichain/0xff9722cb0712261a7f02a451dd178de10234ad0c - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/blast/0x0000fb2a9a0f3f35d72d7eedb8689c6db1d30225 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/unichain/0x2aeee741fa1e21120a21e57db9ee545428e683c9 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/blast/0xbb60bb410182d8e96c41dfc92e017dd79f5100bf + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/avalanche/0x45e844b4d3b81aba43697ac73c55204bd7b727e7 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/blast/0x0f6c5fdcb927b99b3040c609bef07bdfc59a6173 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/avalanche/0xc0808a4d70b0c1d6811c3526ca358570516214fd - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/blast/0xaeba85e3328d6b77b58130f43815ac9c59603d38 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/avalanche/0x075b6f68b05fe21205f8827323a6f9b747b09e93 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/blast/0xbf796b95d09729815806dd50de07c1111aa3926f + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/avalanche/0x8ce4c6020fccf7428d0b6ec2d4410c0442626630 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/blast/0x63f59866a7e9a8628e7f1577ba55da134d64d8c2 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/avalanche/0x2aeee741fa1e21120a21e57db9ee545428e683c9 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/blast/0x78337095c61035056a85b7d430d6e9875f177ae2 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/blast/0x2aeee741fa1e21120a21e57db9ee545428e683c9 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/blast/0x258ba3b253e5cc3bab01c28d2f527aacd6d96793 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/soneium/0xa2e7d6051bed36e1552ba982dab7e6743785598e - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/blast/0x7b8086f5442f130a6be2d62dff02319018344feb + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/soneium/0x2aeee741fa1e21120a21e57db9ee545428e683c9 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/blast/0x9dfb11cf311a8fa1296f6958057f8bb02be51a4c + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/worldchain/0x2aeee741fa1e21120a21e57db9ee545428e683c9 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/blast/0xf95141f5552e592dc58c41e54d65d0f645ab7d7e + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/zksync/0x2aeee741fa1e21120a21e57db9ee545428e683c9 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/blast/0x21b8065d10f73ee2e260e5b47d3344d3ced7596e + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/zora/0x2aeee741fa1e21120a21e57db9ee545428e683c9 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/blast/0xa43fe16908251ee70ef74718545e4fe6c5ccec9f + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/ethereum/0xe6d7ebb9f1a9519dc06d557e03c522d53520e76a - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/blast/0xb4e16d0168e52d35cacd2c6185b44281ec28c9dc + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/base/0x529d2863a1521d0b57db028168fde2e97120017c - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/blast/0x9c4fe5ffd9a9fc5678cfbd93aa2d4fd684b67c4c + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/base/0x8d421b0d641193d67dd1aa024dab17fcde0bfc89 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/blast/0x0d4a11d5eeaac28ec3f61d100daf4d40471f1852 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/bnb/0x81c7294b66955824bc04acb642ae8dc58e6ce507 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/blast/0xbb2b8038a1640196fbe3e38816f3e67cba72d940 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/bnb/0xafecdd2fc04f0939d7b6835529677608470c063d - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/blast/0x7b73644935b8e68019ac6356c40661e1bc315860 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/celo/0x1219b06380157f0ea0468f4f714d66e7f89d6956 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/blast/0xca7c2771d248dcbe09eabe0ce57a62e18da178c0 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/avalanche/0x8a82f2333101195b926e2c1dd56a116bb57d41c9 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/blast/0xa478c2975ab1ea89e8196811f51a7b7ade33eb11 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/avalanche/0x40857abd8b284205a81fe6e0dfcebe261f47d854 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/blast/0x52c77b0cb827afbad022e6d6caf2c44452edbc39 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/worldchain/0xe32915f74d76b6fe4945cb4c4c77474e2fdb6d63 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/blast/0xc2eab7d33d3cb97692ecb231a5d0e4a649cb539d + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/ethereum/0xe8a1f39c16eea2844e98f951d711bb4bb31557ad - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/blast/0x180efc1349a69390ade25667487a826164c9c6e4 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/ethereum/0x1688d62c82abebf4d33ecea96d983fc1627966f6 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/blast/0x43de4318b6eb91a7cf37975dbb574396a7b5b5c6 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/arbitrum/0x1688d62c82abebf4d33ecea96d983fc1627966f6 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/blast/0x9ec9367b8c4dd45ec8e7b800b1f719251053ad60 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/optimism/0x1688d62c82abebf4d33ecea96d983fc1627966f6 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/blast/0xe46935ae80e05cdebd4a4008b6ccaa36d2845370 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/polygon/0xfe530931da161232ec76a7c3bea7d36cf3811a0d - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/blast/0xc555d55279023e732ccd32d812114caf5838fd46 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/polygon/0x1688d62c82abebf4d33ecea96d983fc1627966f6 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/blast/0x3041cbd36888becc7bbcbc0045e3b1f144466f5f + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/base/0xc8da14d7467814a91384796db3ca2c273b30b361 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/blast/0x25647e01bd0967c1b9599fa3521939871d1d0888 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/base/0x0b1c2dcbbfa744ebd3fc17ff1a96a1e1eb4b2d69 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/blast/0x09d1d767edf8fa23a64c51fa559e0688e526812f + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/base/0x1688d62c82abebf4d33ecea96d983fc1627966f6 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/blast/0x48d20b3e529fb3dd7d91293f80638df582ab2daa + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/bnb/0xf150d29d92e7460a1531cbc9d1abeab33d6998e4 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/blast/0x2a6c340bcbb0a79d3deecd3bc5cbc2605ea9259f + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/bnb/0x7b39b6693f4ca739b01ca1c42a343c8159d96e23 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/blast/0x1ffec7119e315b15852557f654ae0052f76e6ae1 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/bnb/0x4c1d39e6b736a6a99105ee2a9e7c44bfc56af860 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/blast/0xd3d2e2692501a5c9ca623199d38826e513033a17 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/bnb/0x4f60db16e8235eae877305c1e9ef2f648be2971c - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/blast/0xcaa004418eb42cdf00cb057b7c9e28f0ffd840a5 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/bnb/0x1688d62c82abebf4d33ecea96d983fc1627966f6 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/blast/0x4028daac072e492d34a3afdbef0ba7e35d8b55c4 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/celo/0x15689276dc6e7d2702f7e1900c42f885284ffc46 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/blast/0x9ff68f61ca5eb0c6606dc517a9d44001e564bb66 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/celo/0x1688d62c82abebf4d33ecea96d983fc1627966f6 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/blast/0x6ada49aeccf6e556bb7a35ef0119cc8ca795294a + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/unichain/0xcd695596b54099613b84862bc60907651c5917be - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/blast/0x8c1c499b1796d7f3c2521ac37186b52de024e58c + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/unichain/0x1688d62c82abebf4d33ecea96d983fc1627966f6 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/blast/0x7924a818013f39cf800f5589ff1f1f0def54f31f + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/avalanche/0xcbfbec4704a6e34a9c562796e0606750bcd73675 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/blast/0xda2d09fbbf8ee4b5051a0e9b562c5fcb4b393b18 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/avalanche/0x8bdacdf255a57b66d0adeb271f4f76403ff4dffa - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/blast/0x470e8de2ebaef52014a47cb5e6af86884947f08c + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/avalanche/0x1688d62c82abebf4d33ecea96d983fc1627966f6 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/blast/0xf6c4e4f339912541d3f8ed99dba64a1372af5e5b + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/blast/0x1688d62c82abebf4d33ecea96d983fc1627966f6 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/blast/0xb771f724c504b329623b0ce9199907137670600e + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/soneium/0x1688d62c82abebf4d33ecea96d983fc1627966f6 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/blast/0x0f23d49bc92ec52ff591d091b3e16c937034496e + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/worldchain/0xb1baaf9b23dafb25775111a689c23f4016fd0a73 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/blast/0xddd23787a6b80a794d952f5fb036d0b31a8e6aff + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/worldchain/0x042c2083fb30d1324e102fffe527d1dc689d3c60 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/blast/0x2caccf71bdf8fff97c06a46eca29b611b1a74b5e + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/worldchain/0x1688d62c82abebf4d33ecea96d983fc1627966f6 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/blast/0xaf996125e98b5804c00ffdb4f7ff386307c99a00 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/zksync/0x1688d62c82abebf4d33ecea96d983fc1627966f6 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/blast/0x69c7bd26512f52bf6f76fab834140d13dda673ca + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/zora/0x1688d62c82abebf4d33ecea96d983fc1627966f6 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/blast/0x0b07188b12e3bba6a680e553e23c4079e98a034b + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/ethereum/0x0b599ebf4e05af48b56d38e2dde520570c366460 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/blast/0xc5be99a02c6857f9eac67bbce58df5572498f40c + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/ethereum/0x7cbee2f89305beb746e2b0807365119a8ff2513b - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/blast/0x5ced44f03ff443bbe14d8ea23bc24425fb89e3ed + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/ethereum/0x399f600c9667ee748d31821b2df0c004b3432dc9 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/blast/0xc7e6b676bfc73ae40bcc4577f22aab1682c691c6 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/arbitrum/0xe51a3d36ecad2d2fbeafb6295fe0beb4f8f8f30d - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/blast/0xa1bf0e900fb272089c9fd299ea14bfccb1d1c2c0 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/arbitrum/0x23d17764f41aea93fdbb5beffa83571f0bf3f8b2 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/blast/0xaf21b0ec0197e63a5c6cc30c8e947eb8165c6212 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/arbitrum/0x7cbee2f89305beb746e2b0807365119a8ff2513b - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/blast/0xc91ef786fbf6d62858262c82c63de45085dea659 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/arbitrum/0x399f600c9667ee748d31821b2df0c004b3432dc9 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/blast/0x0da7096f14303eddd634c0241963c064e0244984 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/optimism/0x7cbee2f89305beb746e2b0807365119a8ff2513b - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/blast/0x97e1fcb93ae7267dbafad23f7b9afaa08264cfd8 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/optimism/0x399f600c9667ee748d31821b2df0c004b3432dc9 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/blast/0x2aeee741fa1e21120a21e57db9ee545428e683c9 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/polygon/0xa236278bec0e0677a48527340cfb567b4e6e9adc - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/blast/0xa5e9c917b4b821e4e0a5bbefce078ab6540d6b5e + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/polygon/0x7cbee2f89305beb746e2b0807365119a8ff2513b - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/blast/0x96aa22baedc5a605357e0b9ae20ab6b10a472e03 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/polygon/0x399f600c9667ee748d31821b2df0c004b3432dc9 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/soneium/0x21b8065d10f73ee2e260e5b47d3344d3ced7596e + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/base/0x7cbee2f89305beb746e2b0807365119a8ff2513b - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/soneium/0xa43fe16908251ee70ef74718545e4fe6c5ccec9f + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/base/0x399f600c9667ee748d31821b2df0c004b3432dc9 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/soneium/0xb4e16d0168e52d35cacd2c6185b44281ec28c9dc + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/bnb/0x387a86d863420ffa2ef88b2524e54513a0ded845 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/soneium/0x9c4fe5ffd9a9fc5678cfbd93aa2d4fd684b67c4c + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/bnb/0x4b54900d3801b7a27657a0e63ce7a819365e0940 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/soneium/0x0d4a11d5eeaac28ec3f61d100daf4d40471f1852 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/bnb/0xc2b9d0b3db9afe1567d4952ec3aede504b7357cf - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/soneium/0xbb2b8038a1640196fbe3e38816f3e67cba72d940 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/bnb/0x7cbee2f89305beb746e2b0807365119a8ff2513b - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/soneium/0x7b73644935b8e68019ac6356c40661e1bc315860 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/bnb/0x399f600c9667ee748d31821b2df0c004b3432dc9 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/soneium/0xca7c2771d248dcbe09eabe0ce57a62e18da178c0 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/celo/0x7cbee2f89305beb746e2b0807365119a8ff2513b - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/soneium/0xa478c2975ab1ea89e8196811f51a7b7ade33eb11 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/celo/0x399f600c9667ee748d31821b2df0c004b3432dc9 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/soneium/0x52c77b0cb827afbad022e6d6caf2c44452edbc39 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/unichain/0x7cbee2f89305beb746e2b0807365119a8ff2513b - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/soneium/0xc2eab7d33d3cb97692ecb231a5d0e4a649cb539d + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/unichain/0x399f600c9667ee748d31821b2df0c004b3432dc9 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/soneium/0x180efc1349a69390ade25667487a826164c9c6e4 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/avalanche/0x7cbee2f89305beb746e2b0807365119a8ff2513b - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/soneium/0x43de4318b6eb91a7cf37975dbb574396a7b5b5c6 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/avalanche/0x399f600c9667ee748d31821b2df0c004b3432dc9 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/soneium/0x9ec9367b8c4dd45ec8e7b800b1f719251053ad60 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/blast/0x7cbee2f89305beb746e2b0807365119a8ff2513b - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/soneium/0xe46935ae80e05cdebd4a4008b6ccaa36d2845370 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/blast/0x399f600c9667ee748d31821b2df0c004b3432dc9 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/soneium/0xc555d55279023e732ccd32d812114caf5838fd46 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/soneium/0x7cbee2f89305beb746e2b0807365119a8ff2513b - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/soneium/0x3041cbd36888becc7bbcbc0045e3b1f144466f5f + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/soneium/0x399f600c9667ee748d31821b2df0c004b3432dc9 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/soneium/0x25647e01bd0967c1b9599fa3521939871d1d0888 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/worldchain/0x7cbee2f89305beb746e2b0807365119a8ff2513b - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/soneium/0x09d1d767edf8fa23a64c51fa559e0688e526812f + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/worldchain/0x399f600c9667ee748d31821b2df0c004b3432dc9 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/soneium/0x48d20b3e529fb3dd7d91293f80638df582ab2daa + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/zksync/0x7cbee2f89305beb746e2b0807365119a8ff2513b - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/soneium/0x2a6c340bcbb0a79d3deecd3bc5cbc2605ea9259f + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/zksync/0x399f600c9667ee748d31821b2df0c004b3432dc9 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/soneium/0x1ffec7119e315b15852557f654ae0052f76e6ae1 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/zora/0x7cbee2f89305beb746e2b0807365119a8ff2513b - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/soneium/0xd3d2e2692501a5c9ca623199d38826e513033a17 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/zora/0x399f600c9667ee748d31821b2df0c004b3432dc9 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/soneium/0xcaa004418eb42cdf00cb057b7c9e28f0ffd840a5 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/arbitrum/0x68fd2f81ac30ef3186dd618947f8be49edb27886 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/soneium/0x4028daac072e492d34a3afdbef0ba7e35d8b55c4 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/arbitrum/0xf9f588394ec5c3b05511368ce016de5fd3812446 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/soneium/0x9ff68f61ca5eb0c6606dc517a9d44001e564bb66 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/optimism/0x827f0a2a4376bc26729f398b865f424dc8456841 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/soneium/0x6ada49aeccf6e556bb7a35ef0119cc8ca795294a + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/bnb/0xd8cc6bfdee087148c220e9141a075d18418abbac - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/soneium/0x8c1c499b1796d7f3c2521ac37186b52de024e58c + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/bnb/0x944b4364cd6faddfe8f83865aabdbf57d0d9358c - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/soneium/0x7924a818013f39cf800f5589ff1f1f0def54f31f + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/bnb/0xdb18729070d3abdc72f9cd57d3b949540cc4486a - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/soneium/0xda2d09fbbf8ee4b5051a0e9b562c5fcb4b393b18 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/celo/0xf55791afbb35ad42984f18d6fe3e1ff73d81900c - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/soneium/0x470e8de2ebaef52014a47cb5e6af86884947f08c + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/celo/0x61ef8708fc240dc7f9f2c0d81c3124df2fd8829f - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/soneium/0xf6c4e4f339912541d3f8ed99dba64a1372af5e5b + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/celo/0x87dec9a2589d9e6511df84c193561b3a16cf6238 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/soneium/0xb771f724c504b329623b0ce9199907137670600e + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/celo/0x2ac5baa668a8a58fd0e302b9896717484fd217b0 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/soneium/0x0f23d49bc92ec52ff591d091b3e16c937034496e + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/celo/0x6bab3afa6d0c42d539bcbc33ffb68c0406913413 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/soneium/0xddd23787a6b80a794d952f5fb036d0b31a8e6aff + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/celo/0x14e577e42d45fd2200a9b0e31d87fe826467111a - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/soneium/0x2caccf71bdf8fff97c06a46eca29b611b1a74b5e + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/celo/0x4495f525c4ecacf9713a51ec3e8d1e81d7dff870 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/soneium/0xaf996125e98b5804c00ffdb4f7ff386307c99a00 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/celo/0xc5a5caebf3bf6220a3efa222710ab488943a73f8 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/soneium/0x69c7bd26512f52bf6f76fab834140d13dda673ca + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/celo/0x40b3737b8984d14a2e8f96d8c680b2d475719fdf - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/soneium/0x0b07188b12e3bba6a680e553e23c4079e98a034b + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/unichain/0xe92c7cc875245a86faf088febe4614e1e318bef5 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/soneium/0xc5be99a02c6857f9eac67bbce58df5572498f40c + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/unichain/0xdb6e3b03a3255e5ddfc99b98f18e6e8557a2ed96 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/soneium/0x5ced44f03ff443bbe14d8ea23bc24425fb89e3ed + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/base/0x9331f571f79d1e186a095c93756b5680a43932ac - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/soneium/0xc7e6b676bfc73ae40bcc4577f22aab1682c691c6 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/bnb/0xe1acb466421ed24dd8bd381d1205bad0ad43ca9c - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/soneium/0xa1bf0e900fb272089c9fd299ea14bfccb1d1c2c0 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/avalanche/0x2876ce407e520ba49177d83ff4e2c7338b6eeae4 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/soneium/0xaf21b0ec0197e63a5c6cc30c8e947eb8165c6212 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/ethereum/0xf12533a96712133d9bb97c24de5bcf52f48851bd - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/soneium/0xc91ef786fbf6d62858262c82c63de45085dea659 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/ethereum/0x873056a02255872514f05249d93228d788fe4fb4 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/soneium/0x0da7096f14303eddd634c0241963c064e0244984 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/arbitrum/0x28dfa7adabff80fdf4ffd7db0c0796fb86d26700 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/soneium/0x97e1fcb93ae7267dbafad23f7b9afaa08264cfd8 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/arbitrum/0x1b4a3f6ad0b7254e373f47a3e442eea60af693fc - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/soneium/0x2aeee741fa1e21120a21e57db9ee545428e683c9 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/arbitrum/0x929fcf81102c5577243ee614c2c455acd6681f1a - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/soneium/0xa5e9c917b4b821e4e0a5bbefce078ab6540d6b5e + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/arbitrum/0x873056a02255872514f05249d93228d788fe4fb4 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/soneium/0x96aa22baedc5a605357e0b9ae20ab6b10a472e03 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/optimism/0x3202c46666e774b44ba463eafaa6da9a968a058f - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/worldchain/0x610e319b3a3ab56a0ed5562927d37c233774ba39 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/optimism/0x873056a02255872514f05249d93228d788fe4fb4 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/worldchain/0xdce053d9ba0fa2c5f772416b64f191158cbcc32e + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/polygon/0xa6a2d598365cd758ba0a72cd95b7f8805248a5d5 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/worldchain/0x5f835420502a7702de50cd0e78d8aa3608b2137e + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/polygon/0x873056a02255872514f05249d93228d788fe4fb4 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/worldchain/0x494d68e3cab640fa50f4c1b3e2499698d1a173a0 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/base/0x052e77018bfb98dc6373c37d757bb1d3fad09ec5 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/worldchain/0x02371da6173cf95623da4189e68912233cc7107c + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/base/0xeff7f8fe083d7a446717b992bf84391253e54789 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/worldchain/0x6787de741bb42ca7ff7dd1b9aad6098c850cdc6a + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/base/0xf9bb9137256193af73d2e8b3e377727756fd98be - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/worldchain/0x7c3c2a92598d6d77e57fd55c50e99af4b291f595 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/base/0x873056a02255872514f05249d93228d788fe4fb4 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/worldchain/0x56505f73cf8f5ef637bb37d9e635c3f520c9b0e5 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/bnb/0x7840fafdea1292068c1167f5da035a54bd31fae5 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/worldchain/0xad710fbc1161b26ea427c158f49a93f6d9d871b4 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/bnb/0xed85676d391be656e6efa22ea4f3c663ffdd1683 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/worldchain/0x21b8065d10f73ee2e260e5b47d3344d3ced7596e + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/bnb/0xe6b4903642b4a1637d7b411d009af5c91617860c - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/worldchain/0xa43fe16908251ee70ef74718545e4fe6c5ccec9f + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/bnb/0x6a61d4c9c359d2ce0203378983beb4f69f85106c - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/worldchain/0xb4e16d0168e52d35cacd2c6185b44281ec28c9dc + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/bnb/0x873056a02255872514f05249d93228d788fe4fb4 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/worldchain/0x9c4fe5ffd9a9fc5678cfbd93aa2d4fd684b67c4c + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/celo/0x873056a02255872514f05249d93228d788fe4fb4 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/worldchain/0x0d4a11d5eeaac28ec3f61d100daf4d40471f1852 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/unichain/0x97e4442bca2c069f9060f3b8eef52eb25c98c245 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/worldchain/0xbb2b8038a1640196fbe3e38816f3e67cba72d940 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/unichain/0xd40be16e9c2bddd7f36dd31c1ae39ca6cb2b20ce - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/worldchain/0x7b73644935b8e68019ac6356c40661e1bc315860 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/unichain/0x873056a02255872514f05249d93228d788fe4fb4 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/worldchain/0xca7c2771d248dcbe09eabe0ce57a62e18da178c0 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/unichain/0x343fd171caf4f0287ae6b87d75a8964dc44516ab - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/worldchain/0xa478c2975ab1ea89e8196811f51a7b7ade33eb11 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/avalanche/0x40f4928332584198d5c68f3f39631245dda5c200 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/worldchain/0x52c77b0cb827afbad022e6d6caf2c44452edbc39 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/avalanche/0xeb2a20f397c37f9f36799dab5dbe762da58c5194 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/worldchain/0xc2eab7d33d3cb97692ecb231a5d0e4a649cb539d + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/avalanche/0x873056a02255872514f05249d93228d788fe4fb4 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/worldchain/0x180efc1349a69390ade25667487a826164c9c6e4 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/avalanche/0x343fd171caf4f0287ae6b87d75a8964dc44516ab - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/worldchain/0x43de4318b6eb91a7cf37975dbb574396a7b5b5c6 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/blast/0x873056a02255872514f05249d93228d788fe4fb4 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/worldchain/0x9ec9367b8c4dd45ec8e7b800b1f719251053ad60 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/blast/0x343fd171caf4f0287ae6b87d75a8964dc44516ab - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/worldchain/0xe46935ae80e05cdebd4a4008b6ccaa36d2845370 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/soneium/0x873056a02255872514f05249d93228d788fe4fb4 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/worldchain/0xc555d55279023e732ccd32d812114caf5838fd46 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/soneium/0x343fd171caf4f0287ae6b87d75a8964dc44516ab - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/worldchain/0x3041cbd36888becc7bbcbc0045e3b1f144466f5f + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/worldchain/0x873056a02255872514f05249d93228d788fe4fb4 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/worldchain/0x25647e01bd0967c1b9599fa3521939871d1d0888 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/worldchain/0x343fd171caf4f0287ae6b87d75a8964dc44516ab - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/worldchain/0x09d1d767edf8fa23a64c51fa559e0688e526812f + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/zksync/0x873056a02255872514f05249d93228d788fe4fb4 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/worldchain/0x48d20b3e529fb3dd7d91293f80638df582ab2daa + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/zksync/0x343fd171caf4f0287ae6b87d75a8964dc44516ab - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/worldchain/0x2a6c340bcbb0a79d3deecd3bc5cbc2605ea9259f + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/zora/0x873056a02255872514f05249d93228d788fe4fb4 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/worldchain/0x1ffec7119e315b15852557f654ae0052f76e6ae1 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/zora/0x343fd171caf4f0287ae6b87d75a8964dc44516ab - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/worldchain/0xd3d2e2692501a5c9ca623199d38826e513033a17 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/ethereum/0x53ead11073fc0651dce70572666f0ed0752abfea - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/worldchain/0xcaa004418eb42cdf00cb057b7c9e28f0ffd840a5 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/base/0xa0ca5bebc42cdbf3623b1c09206ae4e3975b0fc7 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/worldchain/0x4028daac072e492d34a3afdbef0ba7e35d8b55c4 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/arbitrum/0x18aa3faeedb077aa604d748587093adcc9c5172b - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/worldchain/0x9ff68f61ca5eb0c6606dc517a9d44001e564bb66 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/base/0xb655dc66ecead581d1f1a5759c2c37c2dbef2275 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/worldchain/0x6ada49aeccf6e556bb7a35ef0119cc8ca795294a + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/base/0x2e8b5cf35680f8b7df0957d05c6a0a4ae1d00cde - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/worldchain/0x8c1c499b1796d7f3c2521ac37186b52de024e58c + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/base/0x87c0676255be413399c9a205d9cbeb2a04814cca - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/worldchain/0x7924a818013f39cf800f5589ff1f1f0def54f31f + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/bnb/0xc09b0b0bde3b1f97ed3d3b5f5b0a74a74ee99768 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/worldchain/0xda2d09fbbf8ee4b5051a0e9b562c5fcb4b393b18 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/bnb/0x9950c1f3754fb8a3ebbaf24b8573cafc7474c00f - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/worldchain/0x470e8de2ebaef52014a47cb5e6af86884947f08c + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/bnb/0x9fca4c864a30c03c21cc8743ee0c73312deda0ec - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/worldchain/0xf6c4e4f339912541d3f8ed99dba64a1372af5e5b + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/worldchain/0x9b03dd0d04c2953a6a74471c53f24f15f592df1e - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/worldchain/0xb771f724c504b329623b0ce9199907137670600e + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/avalanche/0x260e34c78b27ece3fc6de8cd170e3ffb49fac35f - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/worldchain/0x0f23d49bc92ec52ff591d091b3e16c937034496e + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/optimism/0x29f07e631a2f990e1f6117c6285a44e746b1f090 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/worldchain/0xddd23787a6b80a794d952f5fb036d0b31a8e6aff + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/polygon/0x3dc10d7bfb94eeb009203e84a653e5764f71771d - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/worldchain/0x2caccf71bdf8fff97c06a46eca29b611b1a74b5e + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/polygon/0x29f07e631a2f990e1f6117c6285a44e746b1f090 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/worldchain/0xaf996125e98b5804c00ffdb4f7ff386307c99a00 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/base/0x29f07e631a2f990e1f6117c6285a44e746b1f090 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/worldchain/0x69c7bd26512f52bf6f76fab834140d13dda673ca + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/bnb/0x0e5828c7eb7c7c9066201718f7ff044cf9fa10d9 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/worldchain/0x0b07188b12e3bba6a680e553e23c4079e98a034b + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/bnb/0x29f07e631a2f990e1f6117c6285a44e746b1f090 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/worldchain/0xc5be99a02c6857f9eac67bbce58df5572498f40c + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/celo/0x29f07e631a2f990e1f6117c6285a44e746b1f090 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/worldchain/0x5ced44f03ff443bbe14d8ea23bc24425fb89e3ed + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/unichain/0x29f07e631a2f990e1f6117c6285a44e746b1f090 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/worldchain/0xc7e6b676bfc73ae40bcc4577f22aab1682c691c6 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/avalanche/0xb0828467656ef9a9804e0d57da3fbd79374877f4 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/worldchain/0xa1bf0e900fb272089c9fd299ea14bfccb1d1c2c0 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/avalanche/0x29f07e631a2f990e1f6117c6285a44e746b1f090 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/worldchain/0xaf21b0ec0197e63a5c6cc30c8e947eb8165c6212 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/blast/0x29f07e631a2f990e1f6117c6285a44e746b1f090 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/worldchain/0xc91ef786fbf6d62858262c82c63de45085dea659 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/soneium/0x29f07e631a2f990e1f6117c6285a44e746b1f090 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/worldchain/0x0da7096f14303eddd634c0241963c064e0244984 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/worldchain/0x075138693e0d65fa038753e3f3f97aad0989dd43 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/worldchain/0x97e1fcb93ae7267dbafad23f7b9afaa08264cfd8 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/worldchain/0x29f07e631a2f990e1f6117c6285a44e746b1f090 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/worldchain/0x2aeee741fa1e21120a21e57db9ee545428e683c9 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/zksync/0x29f07e631a2f990e1f6117c6285a44e746b1f090 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/worldchain/0xa5e9c917b4b821e4e0a5bbefce078ab6540d6b5e + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/zora/0x29f07e631a2f990e1f6117c6285a44e746b1f090 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/worldchain/0x96aa22baedc5a605357e0b9ae20ab6b10a472e03 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/ethereum/0xcd83055557536eff25fd0eafbc56e74a1b4260b3 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zksync/0x3d7264539e6e3f596bb485e3091f3ae02ad01ef8 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/ethereum/0x3016a43b482d0480460f6625115bd372fe90c6bf - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zksync/0xeecb86c38c4667b46487255f41c6904df3d76f8f + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/ethereum/0x29f07e631a2f990e1f6117c6285a44e746b1f090 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zksync/0x23c77a553aac0ad009441c856c05d117c1131e3d + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/arbitrum/0x91308bc9ce8ca2db82aa30c65619856cc939d907 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zksync/0xa0769a3c6af68812bb3a5cbd511f7879033440eb + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/arbitrum/0x1442097733acf0a2b5c4ab422f1c0186e95d52ba - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zksync/0xf8c42655373a280e8800beee44fcc12ffc99e797 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/arbitrum/0x3016a43b482d0480460f6625115bd372fe90c6bf - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zksync/0x4b2dfca17caadc23c9d28eb77ca27b52731e3aba + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/arbitrum/0x29f07e631a2f990e1f6117c6285a44e746b1f090 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zksync/0x105a6f7c2f23270db6eed8d9ee8474323091d30c + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/optimism/0x3016a43b482d0480460f6625115bd372fe90c6bf - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zksync/0x4152fdbf1ce1957b6fafd55737f96a26b787ee9a + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/polygon/0x3016a43b482d0480460f6625115bd372fe90c6bf - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zksync/0x3f618967492945c02d5222d333e903345fde741a + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/base/0x393e58375ca7bcaa89ed90e661ee7cc46466eccf - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zksync/0xff577f0e828a878743ecc5e2632cbf65cecf17cf + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/base/0x3016a43b482d0480460f6625115bd372fe90c6bf - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zksync/0x3e3dd517fec2e70eddba2a626422a4ba286e8c38 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/bnb/0x3016a43b482d0480460f6625115bd372fe90c6bf - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zksync/0x433587150898e706b21d68b48833cdf274987743 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/celo/0x3016a43b482d0480460f6625115bd372fe90c6bf - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zksync/0xc99bcff6564bafc70ba1b53c53a03541f780a546 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/unichain/0x91020dd18c800eb5fee593ad58902b0ebdcfbfd2 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zksync/0xdc4359ca3a73c05b83759d3fe6618b499ff5f656 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/unichain/0x3016a43b482d0480460f6625115bd372fe90c6bf - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zksync/0xa07028b453a1f6ac277e93f3a0ea73b4be5c7d63 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/avalanche/0x3016a43b482d0480460f6625115bd372fe90c6bf - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zksync/0xc1fcd2a14df1a10f91cdd0d9b6191ca264356eec + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/blast/0xa4f1768e3e1cd62c6faf4deab1ccef804a50c34e - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zksync/0x3f777c16829c7d1885a7a46912560f1ba764218d + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/blast/0x3016a43b482d0480460f6625115bd372fe90c6bf - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zksync/0xcbd38eba8170f475063bcc2c56cb213f8db1f9e1 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/soneium/0x3016a43b482d0480460f6625115bd372fe90c6bf - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zksync/0xbeea3b382696669e0e67c08ea9f4aae8d528af0f + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/worldchain/0x3016a43b482d0480460f6625115bd372fe90c6bf - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zksync/0xd864e059aae2d400ef3ab5b4d38b4370d63f1277 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/zksync/0x3016a43b482d0480460f6625115bd372fe90c6bf - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zksync/0x9e83bb5cf96fd382affb9f9f4d1bbdb49e7a5e7b + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/zora/0x3016a43b482d0480460f6625115bd372fe90c6bf - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zksync/0xc4ea014402cddb4c6d2c4cb6d1c696eded93630a + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/optimism/0x4efc6d91b5170b670a1bd5cfb8d4ae50283400eb - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zksync/0xd8ba14df11d963bd3c00ada3569a361d1810d4b1 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/polygon/0x993defde3e6ef50610eb6d994823dc82565ad3ba - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zksync/0x663a655203ec965a3f642772ef49ba1e99c1520d + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/base/0xab04a352d4ec8d0f1812a4e5ebe7807fa67acd48 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zksync/0x1017e7b5efbb2d230979cf166078c1a96cdeeaef + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/arbitrum/0x49768b215014fac2c66680b03045fe32936b21e6 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zksync/0xedb4833e1cae54b3b7637f71edacf9abfcfbd1bd + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/ethereum/0x5ae13baaef0620fdae1d355495dc51a17adb4082 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zksync/0xbffd6eebdd42038067b10e04d3682e6373278ffe + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/base/0xdea629c5587037d0925ff85f1961d95db62bedd6 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zksync/0x7657d138111306459def4ba2285730f35ed6066f + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/bnb/0xba51d338a319f5e1b5da46065946576149874acf - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zksync/0x2dee3855d991a07ad3ed1fe3b26343320a122963 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/bnb/0xe47727f8c9256ab31dd97d431dfe9a5d9c098238 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zksync/0xe5bacf3e9b092c71de7cfe28124beb4c9d85783c + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/avalanche/0xafe235b62d5d7fe6335428d52df1a6204de002b8 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zksync/0x80643ea8601be7f65362d4c2dc17b435dfa22762 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/soneium/0x76c54e356ccf357882e5632127983d6c975d7573 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zksync/0xfc93ec2d9d0d390209365013aaa6358db9f77936 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/arbitrum/0xd491076c7316bc28fd4d35e3da9ab5286d079250 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zksync/0x4d8295d7a043007760e1b2ea3ec07c93a906874d + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/bnb/0x7d98804119551f915a75ce278526ac7ee5077087 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zksync/0xed1def6744ba38d53ef80b59ac010b6d9392bcae + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/bnb/0xcc630802c847766bf386fb7f4403ee5990f13e0a - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zksync/0x341584a7aa4cbfe1381009762aabdd0659542348 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/bnb/0x9d66f536b5d0d4a6086ffbef06a12c5caa9a1460 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zksync/0xffbd38130ff590d0c4d82e3851f6f4fdf9a3d3ab + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/bnb/0xf5ffdca301d3b2a0f4b3de313e4a176515d9bdbf - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zksync/0x1fa900dbb20ed45d18883849c00632bca16f6610 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/bnb/0x6b86794e11cfb1d454d9b38ac5ab5ee2d1f87434 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zksync/0x81111cd2ab53ccb3d060c0fd7b303654151c3b9d + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/bnb/0x89692e5e664c923b1dbbba13c57e07a0bacc5207 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zksync/0x6dbdeea3d4127913420eedd6ff25c7c6765e104a + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/bnb/0x0ab8855c73d567f0ec633cddec43580c5f7e2555 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zksync/0x42e2209e6d9b4ed0cce3d06a5a5d7b65d577cf5c + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/avalanche/0xe04b2344211942751334e848f717a27a10eb8c45 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zksync/0x21b8065d10f73ee2e260e5b47d3344d3ced7596e + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/blast/0x75a0eae18bac14a3e9bebb4e2e5a12a926f2d230 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zksync/0xa43fe16908251ee70ef74718545e4fe6c5ccec9f + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/soneium/0x64850db70da55c031c9b6b8518502988b5734633 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zksync/0xb4e16d0168e52d35cacd2c6185b44281ec28c9dc + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/soneium/0xaacb6baf9cf61be287b8744a0e0c1027709dc26f - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zksync/0x9c4fe5ffd9a9fc5678cfbd93aa2d4fd684b67c4c + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/soneium/0xd828b499b3ed234af94c4d5521c1a82a787da86e - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zksync/0x0d4a11d5eeaac28ec3f61d100daf4d40471f1852 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/soneium/0x1846464de29a2e0d7cfbd3f350d7cb4675236d48 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zksync/0xbb2b8038a1640196fbe3e38816f3e67cba72d940 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/ethereum/0x919b20ac45304aeb09c9df5c604b3cd9d99a51ca - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zksync/0x7b73644935b8e68019ac6356c40661e1bc315860 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/ethereum/0x5b2c9ef1bf180a844389c0fd42b15c8281e69052 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zksync/0xca7c2771d248dcbe09eabe0ce57a62e18da178c0 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/ethereum/0xe101e63ee82f4c8acc5e8f0e03da8b444be71c68 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zksync/0xa478c2975ab1ea89e8196811f51a7b7ade33eb11 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/arbitrum/0x5b2c9ef1bf180a844389c0fd42b15c8281e69052 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zksync/0x52c77b0cb827afbad022e6d6caf2c44452edbc39 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/arbitrum/0xe101e63ee82f4c8acc5e8f0e03da8b444be71c68 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zksync/0xc2eab7d33d3cb97692ecb231a5d0e4a649cb539d + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/optimism/0x5b2c9ef1bf180a844389c0fd42b15c8281e69052 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zksync/0x180efc1349a69390ade25667487a826164c9c6e4 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/optimism/0xe101e63ee82f4c8acc5e8f0e03da8b444be71c68 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zksync/0x43de4318b6eb91a7cf37975dbb574396a7b5b5c6 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/polygon/0x5b2c9ef1bf180a844389c0fd42b15c8281e69052 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zksync/0x9ec9367b8c4dd45ec8e7b800b1f719251053ad60 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/polygon/0xe101e63ee82f4c8acc5e8f0e03da8b444be71c68 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zksync/0xe46935ae80e05cdebd4a4008b6ccaa36d2845370 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/base/0x9144a6e8ad6f56db96dac444eb173831660ba3e5 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zksync/0xc555d55279023e732ccd32d812114caf5838fd46 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/base/0xfb559d225343a61884d46eee91c1a805759f758b - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zksync/0x3041cbd36888becc7bbcbc0045e3b1f144466f5f + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/base/0x5b2c9ef1bf180a844389c0fd42b15c8281e69052 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zksync/0x25647e01bd0967c1b9599fa3521939871d1d0888 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/base/0xe101e63ee82f4c8acc5e8f0e03da8b444be71c68 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zksync/0x09d1d767edf8fa23a64c51fa559e0688e526812f + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/bnb/0x30db6dfdb8817765797bd62316e41f5f4e431e93 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zksync/0x48d20b3e529fb3dd7d91293f80638df582ab2daa + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/bnb/0x7deef378b6befa291e2e255294e532b2c1bca419 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zksync/0x2a6c340bcbb0a79d3deecd3bc5cbc2605ea9259f + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/bnb/0x8bfb0fb037b30562fdb7be3f71440575664ab74e - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zksync/0x1ffec7119e315b15852557f654ae0052f76e6ae1 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/bnb/0x9338f9d099be4011991f8ca784d67acdf901f376 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zksync/0xd3d2e2692501a5c9ca623199d38826e513033a17 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/bnb/0x2e066d83ad074b1a43cd14af5e08f2cf8a275021 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zksync/0xcaa004418eb42cdf00cb057b7c9e28f0ffd840a5 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/bnb/0xef947aa8af8160cf78455292eaf3deb6b39e4bef - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zksync/0x4028daac072e492d34a3afdbef0ba7e35d8b55c4 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/bnb/0x5b2c9ef1bf180a844389c0fd42b15c8281e69052 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zksync/0x9ff68f61ca5eb0c6606dc517a9d44001e564bb66 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/bnb/0xe101e63ee82f4c8acc5e8f0e03da8b444be71c68 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zksync/0x6ada49aeccf6e556bb7a35ef0119cc8ca795294a + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/celo/0x5b2c9ef1bf180a844389c0fd42b15c8281e69052 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zksync/0x8c1c499b1796d7f3c2521ac37186b52de024e58c + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/celo/0xe101e63ee82f4c8acc5e8f0e03da8b444be71c68 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zksync/0x7924a818013f39cf800f5589ff1f1f0def54f31f + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/unichain/0x5b2c9ef1bf180a844389c0fd42b15c8281e69052 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zksync/0xda2d09fbbf8ee4b5051a0e9b562c5fcb4b393b18 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/unichain/0xe101e63ee82f4c8acc5e8f0e03da8b444be71c68 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zksync/0x470e8de2ebaef52014a47cb5e6af86884947f08c + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/avalanche/0x5b2c9ef1bf180a844389c0fd42b15c8281e69052 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zksync/0xf6c4e4f339912541d3f8ed99dba64a1372af5e5b + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/avalanche/0xe101e63ee82f4c8acc5e8f0e03da8b444be71c68 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zksync/0xb771f724c504b329623b0ce9199907137670600e + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/blast/0x5b2c9ef1bf180a844389c0fd42b15c8281e69052 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zksync/0x0f23d49bc92ec52ff591d091b3e16c937034496e + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/blast/0xe101e63ee82f4c8acc5e8f0e03da8b444be71c68 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zksync/0xddd23787a6b80a794d952f5fb036d0b31a8e6aff + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/soneium/0x5b2c9ef1bf180a844389c0fd42b15c8281e69052 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zksync/0x2caccf71bdf8fff97c06a46eca29b611b1a74b5e + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/soneium/0xe101e63ee82f4c8acc5e8f0e03da8b444be71c68 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zksync/0xaf996125e98b5804c00ffdb4f7ff386307c99a00 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/worldchain/0x5b2c9ef1bf180a844389c0fd42b15c8281e69052 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zksync/0x69c7bd26512f52bf6f76fab834140d13dda673ca + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/worldchain/0xe101e63ee82f4c8acc5e8f0e03da8b444be71c68 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zksync/0x0b07188b12e3bba6a680e553e23c4079e98a034b + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/zksync/0x5b2c9ef1bf180a844389c0fd42b15c8281e69052 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zksync/0xc5be99a02c6857f9eac67bbce58df5572498f40c + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/zksync/0xe101e63ee82f4c8acc5e8f0e03da8b444be71c68 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zksync/0x5ced44f03ff443bbe14d8ea23bc24425fb89e3ed + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/zora/0x5b2c9ef1bf180a844389c0fd42b15c8281e69052 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zksync/0xc7e6b676bfc73ae40bcc4577f22aab1682c691c6 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/zora/0xe101e63ee82f4c8acc5e8f0e03da8b444be71c68 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zksync/0xa1bf0e900fb272089c9fd299ea14bfccb1d1c2c0 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/ethereum/0xc74f05c1e7b86fa42ab07ab4a1361286b9a90087 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zksync/0xaf21b0ec0197e63a5c6cc30c8e947eb8165c6212 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/ethereum/0x5bcebcee72f13004f1d00d7da7bf22b082f93f70 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zksync/0xc91ef786fbf6d62858262c82c63de45085dea659 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/arbitrum/0x31fa55e03bad93c7f8affdd2ec616ebfde246001 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zksync/0x0da7096f14303eddd634c0241963c064e0244984 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/arbitrum/0x263f7b865de80355f91c00dfb975a821effbea24 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zksync/0x97e1fcb93ae7267dbafad23f7b9afaa08264cfd8 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/arbitrum/0xbc5592c48bf9d4354de4953f57de4f6295dd51b0 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zksync/0x2aeee741fa1e21120a21e57db9ee545428e683c9 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/arbitrum/0x5bcebcee72f13004f1d00d7da7bf22b082f93f70 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zksync/0xa5e9c917b4b821e4e0a5bbefce078ab6540d6b5e + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/optimism/0x0893e340ee2b0263ddad2f3b8bd23dba11859aea - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zksync/0x96aa22baedc5a605357e0b9ae20ab6b10a472e03 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/optimism/0x5bcebcee72f13004f1d00d7da7bf22b082f93f70 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zora/0x86c2fd1c99d8b7ff541767a4748b2eb38fd43da8 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/polygon/0x5bcebcee72f13004f1d00d7da7bf22b082f93f70 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zora/0xbc59f8f3b275aa56a90d13bae7cce5e6e11a3b17 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/base/0x5bcebcee72f13004f1d00d7da7bf22b082f93f70 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zora/0x1ed9b524d6f395ecc61aa24537f87a0482933069 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/bnb/0xff8dd24ffd38eca6bbe58c7aca49abc2d9abb574 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zora/0xc3aee7c0e80f65ff13655955fa51d971e5d8d535 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/bnb/0xeab00687c6558cd648ec288f58de4b0a6de026ba - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zora/0xaea25cc307dc4bac390816f3d85edcbc805c589d + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/bnb/0x4ef938b633d704f29e593a8b51148d43429d0bc4 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zora/0x33604ba99eb25c593cabd53c096c131a72a74752 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/bnb/0x85144212383a34479f3b0abe6f6f9ee69240fb55 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zora/0x3c127629c99355f3671f128ebef2f49b4d17e4e1 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/bnb/0x5bcebcee72f13004f1d00d7da7bf22b082f93f70 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zora/0x4684c6198243fcd8bcfa706d8e29b6b0531c6172 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/celo/0x5bcebcee72f13004f1d00d7da7bf22b082f93f70 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zora/0xb14db2b0cdb55dcf97f7388a2f70b7ad28c80885 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/unichain/0x5bcebcee72f13004f1d00d7da7bf22b082f93f70 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zora/0x21b8065d10f73ee2e260e5b47d3344d3ced7596e + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/avalanche/0x5bcebcee72f13004f1d00d7da7bf22b082f93f70 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zora/0xa43fe16908251ee70ef74718545e4fe6c5ccec9f + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/blast/0x5bcebcee72f13004f1d00d7da7bf22b082f93f70 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zora/0xb4e16d0168e52d35cacd2c6185b44281ec28c9dc + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/soneium/0x5bcebcee72f13004f1d00d7da7bf22b082f93f70 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zora/0x9c4fe5ffd9a9fc5678cfbd93aa2d4fd684b67c4c + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/worldchain/0x5bcebcee72f13004f1d00d7da7bf22b082f93f70 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zora/0x0d4a11d5eeaac28ec3f61d100daf4d40471f1852 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/zksync/0x5bcebcee72f13004f1d00d7da7bf22b082f93f70 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zora/0xbb2b8038a1640196fbe3e38816f3e67cba72d940 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/zora/0x5bcebcee72f13004f1d00d7da7bf22b082f93f70 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zora/0x7b73644935b8e68019ac6356c40661e1bc315860 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/ethereum/0x2837809fd68e4a4104af76bbec5b622b6146b2cb - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zora/0xca7c2771d248dcbe09eabe0ce57a62e18da178c0 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/ethereum/0xa2107fa5b38d9bbd2c461d6edf11b11a50f6b974 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zora/0xa478c2975ab1ea89e8196811f51a7b7ade33eb11 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/ethereum/0xc2b7888a8d7b62e2a518bbc79fbbd6b75da524b6 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zora/0x52c77b0cb827afbad022e6d6caf2c44452edbc39 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/arbitrum/0xb4e27c8e10856daa165a852f44462d1ca945e25c - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zora/0xc2eab7d33d3cb97692ecb231a5d0e4a649cb539d + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/arbitrum/0x68ebadf62ee5acce5f8d64211d24b4710eeb2029 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zora/0x180efc1349a69390ade25667487a826164c9c6e4 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/arbitrum/0xa2107fa5b38d9bbd2c461d6edf11b11a50f6b974 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zora/0x43de4318b6eb91a7cf37975dbb574396a7b5b5c6 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/arbitrum/0xc2b7888a8d7b62e2a518bbc79fbbd6b75da524b6 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zora/0x9ec9367b8c4dd45ec8e7b800b1f719251053ad60 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/optimism/0x1b19825a9e32b1039080acb1e1f9271314938b96 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zora/0xe46935ae80e05cdebd4a4008b6ccaa36d2845370 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/optimism/0xa2107fa5b38d9bbd2c461d6edf11b11a50f6b974 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zora/0xc555d55279023e732ccd32d812114caf5838fd46 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/optimism/0xc2b7888a8d7b62e2a518bbc79fbbd6b75da524b6 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zora/0x3041cbd36888becc7bbcbc0045e3b1f144466f5f + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/polygon/0x718a038c465efd88962fafe1008d233bf52bef44 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zora/0x25647e01bd0967c1b9599fa3521939871d1d0888 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/polygon/0x9913a93c082fdc69f9e7d146b0e4ce9070d5a104 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zora/0x09d1d767edf8fa23a64c51fa559e0688e526812f + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/polygon/0xa2107fa5b38d9bbd2c461d6edf11b11a50f6b974 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zora/0x48d20b3e529fb3dd7d91293f80638df582ab2daa + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/polygon/0xc2b7888a8d7b62e2a518bbc79fbbd6b75da524b6 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zora/0x2a6c340bcbb0a79d3deecd3bc5cbc2605ea9259f + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/base/0xb4cb800910b228ed3d0834cf79d697127bbb00e5 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zora/0x1ffec7119e315b15852557f654ae0052f76e6ae1 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/base/0xa2107fa5b38d9bbd2c461d6edf11b11a50f6b974 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zora/0xd3d2e2692501a5c9ca623199d38826e513033a17 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/base/0xc2b7888a8d7b62e2a518bbc79fbbd6b75da524b6 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zora/0xcaa004418eb42cdf00cb057b7c9e28f0ffd840a5 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/bnb/0x4610464356ba6bba15eec558619d84b72fea260f - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zora/0x4028daac072e492d34a3afdbef0ba7e35d8b55c4 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/bnb/0x65d5b99ba46b29005856ddb7d5c6675aab77b204 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zora/0x9ff68f61ca5eb0c6606dc517a9d44001e564bb66 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/bnb/0x5066103530d8de7e582ff2f623c59f4b2eca8bf6 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zora/0x6ada49aeccf6e556bb7a35ef0119cc8ca795294a + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/bnb/0xf7932a224761fb8df2db546dd0e587e60439b4b4 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zora/0x8c1c499b1796d7f3c2521ac37186b52de024e58c + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/bnb/0xb1c5374164f17fc74f7401fb4ea88c2604ba75c4 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zora/0x7924a818013f39cf800f5589ff1f1f0def54f31f + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/bnb/0xa2107fa5b38d9bbd2c461d6edf11b11a50f6b974 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zora/0xda2d09fbbf8ee4b5051a0e9b562c5fcb4b393b18 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/bnb/0xc2b7888a8d7b62e2a518bbc79fbbd6b75da524b6 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zora/0x470e8de2ebaef52014a47cb5e6af86884947f08c + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/celo/0x57332c214e647063bb4c5a73e5a8b7bba79be1e4 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zora/0xf6c4e4f339912541d3f8ed99dba64a1372af5e5b + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/celo/0x8917ba2a352c6d3e1acd5ea0a0bf7f203046149e - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zora/0xb771f724c504b329623b0ce9199907137670600e + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/celo/0xa2107fa5b38d9bbd2c461d6edf11b11a50f6b974 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zora/0x0f23d49bc92ec52ff591d091b3e16c937034496e + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/celo/0xc2b7888a8d7b62e2a518bbc79fbbd6b75da524b6 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zora/0xddd23787a6b80a794d952f5fb036d0b31a8e6aff + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/unichain/0xa2107fa5b38d9bbd2c461d6edf11b11a50f6b974 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zora/0x2caccf71bdf8fff97c06a46eca29b611b1a74b5e + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/unichain/0xc2b7888a8d7b62e2a518bbc79fbbd6b75da524b6 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zora/0xaf996125e98b5804c00ffdb4f7ff386307c99a00 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/avalanche/0x7145084e49429057f28d4c5c955cf277a027ae93 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zora/0x69c7bd26512f52bf6f76fab834140d13dda673ca + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/avalanche/0xa2107fa5b38d9bbd2c461d6edf11b11a50f6b974 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zora/0x0b07188b12e3bba6a680e553e23c4079e98a034b + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/avalanche/0xc2b7888a8d7b62e2a518bbc79fbbd6b75da524b6 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zora/0xc5be99a02c6857f9eac67bbce58df5572498f40c + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/blast/0xa2107fa5b38d9bbd2c461d6edf11b11a50f6b974 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zora/0x5ced44f03ff443bbe14d8ea23bc24425fb89e3ed + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/blast/0xc2b7888a8d7b62e2a518bbc79fbbd6b75da524b6 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zora/0xc7e6b676bfc73ae40bcc4577f22aab1682c691c6 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/soneium/0xa2107fa5b38d9bbd2c461d6edf11b11a50f6b974 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zora/0xa1bf0e900fb272089c9fd299ea14bfccb1d1c2c0 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/soneium/0xc2b7888a8d7b62e2a518bbc79fbbd6b75da524b6 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zora/0xaf21b0ec0197e63a5c6cc30c8e947eb8165c6212 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/worldchain/0xa2107fa5b38d9bbd2c461d6edf11b11a50f6b974 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zora/0xc91ef786fbf6d62858262c82c63de45085dea659 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/worldchain/0xc2b7888a8d7b62e2a518bbc79fbbd6b75da524b6 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zora/0x0da7096f14303eddd634c0241963c064e0244984 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/zksync/0xa2107fa5b38d9bbd2c461d6edf11b11a50f6b974 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zora/0x97e1fcb93ae7267dbafad23f7b9afaa08264cfd8 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/zksync/0xc2b7888a8d7b62e2a518bbc79fbbd6b75da524b6 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zora/0x2aeee741fa1e21120a21e57db9ee545428e683c9 + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/zora/0xa2107fa5b38d9bbd2c461d6edf11b11a50f6b974 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zora/0xa5e9c917b4b821e4e0a5bbefce078ab6540d6b5e + 2025-03-20T21:32:51.328Z 0.8 - https://app.uniswap.org/explore/pools/zora/0xc2b7888a8d7b62e2a518bbc79fbbd6b75da524b6 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/pools/zora/0x96aa22baedc5a605357e0b9ae20ab6b10a472e03 + 2025-03-20T21:32:51.328Z 0.8 diff --git a/apps/web/public/sitemap.xml b/apps/web/public/sitemap.xml index f344621757a..b035ec1e5db 100644 --- a/apps/web/public/sitemap.xml +++ b/apps/web/public/sitemap.xml @@ -9,7 +9,4 @@ https://app.uniswap.org/pools-sitemap.xml - - https://app.uniswap.org/nfts-sitemap.xml - diff --git a/apps/web/public/vercel-csp.json b/apps/web/public/staging-csp.json similarity index 69% rename from apps/web/public/vercel-csp.json rename to apps/web/public/staging-csp.json index bdf0d87f9a3..691682ae648 100644 --- a/apps/web/public/vercel-csp.json +++ b/apps/web/public/staging-csp.json @@ -1,4 +1,5 @@ { "defaultSrc": ["https://vercel.live/", "https://vercel.com"], - "scriptSrc": ["'sha256-jhb+qiJiVBxruYChJWIrsskRE2fAoV/F/B10cAoiSB0='"] + "scriptSrc": ["'sha256-jhb+qiJiVBxruYChJWIrsskRE2fAoV/F/B10cAoiSB0='"], + "connectSrc": ["https://*.corn-staging.com"] } diff --git a/apps/web/public/tokens-sitemap.xml b/apps/web/public/tokens-sitemap.xml index cc16efb4f28..a2201a012ea 100644 --- a/apps/web/public/tokens-sitemap.xml +++ b/apps/web/public/tokens-sitemap.xml @@ -2,11117 +2,3382 @@ https://app.uniswap.org/explore/tokens/ethereum/0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xdac17f958d2ee523a2206206994597c13d831ec7 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x2260fac5e5542a773aa44fbcfedf7c193bc2c599 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x6982508145454ce325ddbe47a25d4ec3d2311933 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x7f39c581f595b53c5cb19bd0b3f8da6c935e2ca0 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x6b175474e89094c44da98b954eedeac495271d0f - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x6123b0049f904d730db3c36a31167d9d4121fa6b - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x1f9840a85d5af5bf1d1762f925bdaddc4201f984 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xcf0c122c6b73ff809c693db761e7baebe62b6a2e - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xfaba6f8e4a5e8ab82f62fe7c39859fa577269be3 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x58cb30368ceb2d194740b144eab4c2da8a917dcb - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x4c9edd5852cd905f086c759e8383e09bff1e68b3 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xaaee1a9723aadb7afa2810263653a34ba2c21c7a - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x514910771af9ca656af840dff83e8264ecf986ca - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x95ad61b0a150d79219dcf64e1e6cc01f0b64c4ce - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x5b7533812759b45c2b44c19e320ba2cd2681b542 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xae78736cd615f374d3085123a210448e74fc6393 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xb9f599ce614feb2e1bbe58f180f370d05b39344e - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xd5f7838f5c461feff7fe49ea5ebaf7728bb0adfa - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xd31a59c85ae9d8edefec411d448f90841571b89c - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x6a7eff1e2c355ad6eb91bebb5ded49257f3fed98 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x576e2bed8f7b46d34016198911cdf9886f78bea7 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x1258d60b224c0c5cd888d37bbf31aa5fcfb7e870 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x62d0a8458ed7719fdaf978fe5929c6d342b0bfce - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x9f8f72aa9304c8b593d555f12ef6589cc3a579a2 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x77e06c9eccf2e797fd462a92b6d7642ef85b0a44 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x24fcfc492c1393274b6bcd568ac9e225bec93584 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x27702a26126e0b3702af63ee09ac4d1a084ef628 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xd46ba6d942050d489dbd938a2c909a5d5039a161 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xbe9895146f7af43049ca1c1ae358b0541ea49704 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x72f713d11480dcf08b37e1898670e736688d218d - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x0001a500a6b18995b03f44bb040a5ffc28e45cb0 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x9e9fbde7c7a83c43913bddc8779158f1368f0413 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x5f98805a4e8be255a32880fdec7f6728c6568ba0 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x2b591e99afe9f32eaa6214f7b7629768c40eeb39 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x1ae7e1d0ce06364ced9ad58225a1705b3e5db92b - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x046eee2cc3188071c02bfc1745a6b17c656e3f3d - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x84018071282d4b2996272659d9c01cb08dd7327f - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x12970e6868f88f6557b76120662c1b3e50a646bf - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xaea46a60368a7bd060eec7df8cba43b7ef41ad85 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x6de037ef9ad2725eb40118bb1702ebb27e4aeb24 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xc01154b4ccb518232d6bbfc9b9e6c5068b766f82 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x5a98fcbea516cf06857215779fd812ca3bef1b32 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x102c776ddb30c754ded4fdcc77a19230a60d4e4f - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x72e4f9f808c49a2a61de9c5896298920dc4eeea9 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x467719ad09025fcc6cf6f8311755809d45a5e5f3 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xf19308f923582a6f7c465e5ce7a9dc1bec6665b1 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x710287d1d39dcf62094a83ebb3e736e79400068a - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xf951e335afb289353dc249e82926178eac7ded78 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xf017d3690346eb8234b85f74cee5e15821fee1f4 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x8c282c35b5e1088bb208991c151182a782637699 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xeaa63125dd63f10874f99cdbbb18410e7fc79dd3 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xde342a3e269056fc3305f9e315f4c40d917ba521 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x2dff88a56767223a5529ea5960da7a3f5f766406 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x626e8036deb333b408be468f951bdb42433cbf18 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xdd66781d0e9a08d4fbb5ec7bac80b691be27f21d - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xb23d80f5fefcddaa212212f028021b41ded428cf - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xbaac2b4491727d78d2b78815144570b9f2fe8899 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xf8ebf4849f1fa4faf0dff2106a173d3a6cb2eb3a - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xb90b2a35c65dbc466b04240097ca756ad2005295 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x1614f18fc94f47967a3fbe5ffcd46d4e7da3d787 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xf1df7305e4bab3885cab5b1e4dfc338452a67891 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x91fbb2503ac69702061f1ac6885759fc853e6eae - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xa9e8acf069c58aec8825542845fd754e41a9489a - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x2c95d751da37a5c1d9c5a7fd465c1d50f3d96160 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xe453c3409f8ad2b1fe1ed08e189634d359705a5b - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x89d584a1edb3a70b3b07963f9a3ea5399e38b136 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x4507cef57c46789ef8d1a19ea45f4216bae2b528 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xd1d2eb1b1e90b638588728b4130137d262c87cae - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xe92344b4edf545f3209094b192e46600a19e7c2d - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x8a0a9b663693a22235b896f70a229c4a22597623 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x1bbe973bef3a977fc51cbed703e8ffdefe001fed - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xa41d2f8ee4f47d3b860a149765a7df8c3287b7f0 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x761d38e5ddf6ccf6cf7c55759d5210750b5d60f3 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xc18360217d8f7ab5e7c516566761ea12ce7f9d72 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xe28b3b32b6c345a34ff64674606124dd5aceca30 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x168e209d7b2f58f1f24b8ae7b7d35e662bbf11cc - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xb131f4a55907b10d1f0a50d8ab8fa09ec342cd74 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x3472a5a71965499acd81997a54bba8d852c6e53d - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x7dd9c5cba05e151c895fde1cf355c9a1d5da6429 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x19efa7d0fc88ffe461d1091f8cbe56dc2708a84f - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x14fee680690900ba0cccfc76ad70fd1b95d10e16 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x3c3a81e81dc49a522a592e7622a7e711c06bf354 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xa1290d69c65a6fe4df752f95823fae25cb99e5a7 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x92f419fb7a750aed295b0ddf536276bf5a40124f - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x2c06ba9e7f0daccbc1f6a33ea67e85bb68fbee3a - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x3d658390460295fb963f54dc0899cfb1c30776df - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x8e870d67f660d95d5be530380d0ec0bd388289e1 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x853d955acef822db058eb8505911ed77f175b99e - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x1294f4183763743c7c9519bec51773fb3acd78fd - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x4e15361fd6b4bb609fa63c81a2be19d873717870 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x695d38eb4e57e0f137e36df7c1f0f2635981246b - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x40a7df3df8b56147b781353d379cb960120211d7 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xaaef88cea01475125522e117bfe45cf32044e238 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x163f8c2467924be0ae7b5347228cabf260318753 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x30672ae2680c319ec1028b69670a4a786baa0f35 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xc944e90c64b2c07662a292be6244bdf05cda44a7 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x15e6e0d4ebeac120f9a97e71faa6a0235b85ed12 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x7d225c4cc612e61d26523b099b0718d03152edef - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x82af49447d8a07e3bd95bd0d56f35241523fbab1 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xaf88d065e77c8cc2239327c5edb3a432268e5831 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xff970a61a04b1ca14834a43f5de4533ebddb5cc8 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x912ce59144191c1204e64559fe8253a0e49e6548 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xfd086bc7cd5c481dcc9c85ebe478a1c0b69fcbb9 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x2f2a2543b76a4166549f7aab2e75bef0aefc5b0f - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x5979d7b546e38e414f7e9822514be443a4800529 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x35751007a407ca6feffe80b3cb397736d2cf4dbe - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xda10009cbd5d07dd0cecc66161fc93d7c9000da1 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xeb466342c4d449bc9f53a865d5cb90586f405215 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xfc5a1a6eb076a2c7ad06ed22c90d7e710e35ad0a - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x0c880f6761f1af8d9aa9c466984b80dab9a8c9e8 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xf97f4df75117a78c1a5a0dbb814af92458539fb4 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x9623063377ad1b27544c965ccd7342f7ea7e88c7 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x539bde0d7dbd336b79148aa742883198bbf60342 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x3082cc23568ea640225c2467653db90e9250aaa0 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x18c11fd286c5ec11c3b683caa813b77f5163a122 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x289ba1701c2f088cf0faf8b3705246331cb8a839 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x4cb9a7ae498cedcbb5eae9f25736ae7d428c9d66 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x00cbcf7b3d37844e44b888bc747bdd75fcf4e555 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xfa7f8980b0f1e64a2062791cc3b0871572f1f7f0 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xd79bb960dc8a206806c3a428b31bca49934d18d7 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x3096e7bfd0878cc65be71f8899bc4cfb57187ba3 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x13ad51ed4f1b7e9dc168d8a00cb3f4ddd85efa60 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x4e352cf164e64adcbad318c3a1e222e9eba4ce42 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x11cdb42b0eb46d95f990bedd4695a6e3fa034978 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xba5ddd1f9d7f570dc94a51479a000e3bce967196 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xc8ccbd97b96834b976c995a67bf46e5754e2c48e - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xd07d35368e04a839dee335e213302b21ef14bb4a - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x323665443cef804a3b5206103304bd4872ea4253 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x83d6c8c06ac276465e4c92e7ac8c23740f435140 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x87aaffdf26c6885f6010219208d5b161ec7609c0 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x1b8d516e2146d7a32aca0fcbf9482db85fd42c3a - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xafccb724e3aec1657fc9514e3e53a0e71e80622d - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x4425742f1ec8d98779690b5a3a6276db85ddc01a - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xec70dcb4a1efa46b8f2d97c310c9c4790ba5ffa8 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x3419875b4d3bca7f3fdda2db7a476a79fd31b4fe - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x3b60ff35d3f7f62d636b067dd0dc0dfdad670e4e - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x58b9cb810a68a7f3e1e4f8cb45d1b9b3c79705e8 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xfa5ed56a203466cbbc2430a43c66b9d8723528e7 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x95146881b86b3ee99e63705ec87afe29fcc044d9 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x088cd8f5ef3652623c22d48b1605dcfe860cd704 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xbfd5206962267c7b4b4a8b3d76ac2e1b2a5c4d5e - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x6daf586b7370b14163171544fca24abcc0862ac5 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x9d2f299715d94d8a7e6f5eaa8e654e8c74a988a7 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x580e933d90091b9ce380740e3a4a39c67eb85b4c - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x655a6beebf2361a19549a99486ff65f709bd2646 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x9e64d3b9e8ec387a9a58ced80b71ed815f8d82b5 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x2297aebd383787a160dd0d9f71508148769342e3 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x6694340fc020c5e6b96567843da2df01b2ce1eb6 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x772598e9e62155d7fdfe65fdf01eb5a53a8465be - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x431402e8b9de9aa016c743880e04e517074d8cec - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xd74f5255d557944cf7dd0e45ff521520002d5748 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x6fd58f5a2f3468e35feb098b5f59f04157002407 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x561877b6b3dd7651313794e5f2894b2f18be0766 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xf9ca0ec182a94f6231df9b14bd147ef7fb9fa17c - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xd77b108d4f6cefaa0cae9506a934e825becca46e - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xd56734d7f9979dd94fae3d67c7e928234e71cd4c - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xf1264873436a0771e440e2b28072fafcc5eebd01 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x5575552988a3a80504bbaeb1311674fcfd40ad4b - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x0341c0c0ec423328621788d4854119b97f44e391 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x764bfc309090e7f93edce53e5befa374cdcb7b8e - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xaaa6c1e32c55a7bfa8066a6fae9b42650f262418 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x9e20461bc2c4c980f62f1b279d71734207a6a356 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x7fb7ede54259cb3d4e1eaf230c7e2b1ffc951e9a - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x3a18dcc9745edcd1ef33ecb93b0b6eba5671e7ca - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x000000000026839b3f4181f2cf69336af6153b99 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x8b0e6f19ee57089f7649a455d89d7bc6314d04e8 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x31c91d8fb96bff40955dd2dbc909b36e8b104dde - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x25d887ce7a35172c62febfd67a1856f20faebb00 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xd4d42f0b6def4ce0383636770ef773390d85c61a - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xf8388c2b6edf00e2e27eef5200b1befb24ce141d - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x619c82392cb6e41778b7d088860fea8447941f4c - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x94025780a1ab58868d9b2dbbb775f44b32e8e6e5 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xad4b9c1fbf4923061814dd9d5732eb703faa53d4 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xd7a892f28dedc74e6b7b33f93be08abfc394a360 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x3269a3c00ab86c753856fd135d97b87facb0d848 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x4568ca00299819998501914690d6010ae48a59ba - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x21e60ee73f17ac0a411ae5d690f908c3ed66fe12 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xd3188e0df68559c0b63361f6160c57ad88b239d8 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x2b41806cbf1ffb3d9e31a9ece6b738bf9d6f645f - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xf19547f9ed24aa66b03c3a552d181ae334fbb8db - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x35e6a59f786d9266c7961ea28c7b768b33959cbb - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x59a729658e9245b0cf1f8cb9fb37945d2b06ea27 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xb56c29413af8778977093b9b4947efeea7136c36 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x43ab8f7d2a8dd4102ccea6b438f6d747b1b9f034 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x1d987200df3b744cfa9c14f713f5334cb4bc4d5d - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x3404149e9ee6f17fb41db1ce593ee48fbdcd9506 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x080f6aed32fc474dd5717105dba5ea57268f46eb - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xb5a628803ee72d82098d4bcaf29a42e63531b441 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x1622bf67e6e5747b81866fe0b85178a93c7f86e3 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x7dd747d63b094971e6638313a6a2685e80c7fb2e - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xa2f9ecf83a48b86265ff5fd36cdbaaa1f349916c - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x17a8541b82bf67e10b0874284b4ae66858cb1fd5 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xbcd4d5ac29e06e4973a1ddcd782cd035d04bc0b7 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x42069d11a2cc72388a2e06210921e839cfbd3280 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xbbea044f9e7c0520195e49ad1e561572e7e1b948 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xe85b662fe97e8562f4099d8a1d5a92d4b453bf30 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x3d9907f9a368ad0a51be60f7da3b97cf940982d8 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x4e51ac49bc5e2d87e0ef713e9e5ab2d71ef4f336 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/optimism/0x4200000000000000000000000000000000000006 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/optimism/0x7f5c764cbc14f9669b88837ca1490cca17c31607 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/optimism/0x4200000000000000000000000000000000000042 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/optimism/0x0b2c639c533813f4aa9d7837caf62653d097ff85 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/optimism/0x1f32b1c2345538c0c6f582fcb022739c4a194ebb - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/optimism/0x68f180fcce6836688e9084f035309e29bf0a2095 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/optimism/0x94b008aa00579c1307b0ef2c499ad98a8ce58e58 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/optimism/0xda10009cbd5d07dd0cecc66161fc93d7c9000da1 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/optimism/0xdc6ff44d5d932cbd77b52e5612ba0529dc6226f1 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/optimism/0x8c6f28f2f1a3c87f0f938b96d27520d9751ec8d9 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/optimism/0x8700daec35af8ff88c16bdf0418774cb3d7599b4 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/optimism/0x920cf626a271321c151d027030d5d08af699456b - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/optimism/0x6c84a8f1c29108f47a79964b5fe888d4f4d0de40 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/optimism/0x9e1028f5f1d5ede59748ffcee5532509976840e0 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/optimism/0xeb466342c4d449bc9f53a865d5cb90586f405215 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/optimism/0x350a791bfc2c21f9ed5d10980dad2e2638ffa7f6 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/optimism/0x17aabf6838a6303fc6e9c5a227dc1eb6d95c829a - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/optimism/0xf467c7d5a4a9c4687ffc7986ac6ad5a4c81e1404 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/optimism/0x76fb31fb4af56892a25e32cfc43de717950c9278 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/optimism/0xc5b001dc33727f8f26880b184090d3e252470d45 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/optimism/0x9560e827af36c94d2ac33a39bce1fe78631088db - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/optimism/0x9bcef72be871e61ed4fbbc7630889bee758eb81d - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/optimism/0x50c5725949a6f0c72e6c4a641f24049a917db0cb - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/optimism/0xf98dcd95217e15e05d8638da4c91125e59590b07 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/optimism/0x4b03afc91295ed778320c2824bad5eb5a1d852dd - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/optimism/0xc40f949f8a4e094d1b49a23ea9241d289b7b2819 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/optimism/0x323665443cef804a3b5206103304bd4872ea4253 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/optimism/0x50bce64397c75488465253c0a034b8097fea6578 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/optimism/0x296f55f8fb28e498b858d0bcda06d955b2cb3f97 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/optimism/0x2598c30330d5771ae9f983979209486ae26de875 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/optimism/0x0994206dfe8de6ec6920ff4d779b0d950605fb53 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/optimism/0xc3248a1bd9d72fa3da6e6ba701e58cbf818354eb - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/optimism/0x6fd9d7ad17242c41f7131d257212c54a0e816691 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/optimism/0x14778860e937f509e651192a90589de711fb88a9 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/optimism/0xdfa46478f9e5ea86d57387849598dbfb2e964b02 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/optimism/0x9b88d293b7a791e40d36a39765ffd5a1b9b5c349 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/optimism/0x3eb398fec5f7327c6b15099a9681d9568ded2e82 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/optimism/0x217d47011b23bb961eb6d93ca9945b7501a5bb11 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/optimism/0xbfd5206962267c7b4b4a8b3d76ac2e1b2a5c4d5e - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/optimism/0x1cef2d62af4cd26673c7416957cc4ec619a696a7 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/optimism/0x9fd22a17b4a96da3f83797d122172c450381fb88 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/optimism/0xaddb6a0412de1ba0f936dcaeb8aaa24578dcf3b2 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x2791bca1f2de4661ed88a30c99a7a9449aa84174 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x7ceb23fd6bc0add59e62ac25578270cff1b9f619 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x0d500b1d8e8ef31e21c99d1db9a6444d3adf1270 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x3c499c542cef5e3811e1192ce70d8cc03d5c3359 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x1bfd67037b42cf73acf2047067bd4f2c47d9bfd6 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0xc2132d05d31c914a87c6611c10748aeb04b58e8f - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x53e0bca35ec356bd5dddfebbd1fc0fd03fabad39 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x61299774020da444af134c82fa83e3810b309991 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0xd6df932a45c0f255f85145f286ea0b292b21c90b - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x2ad2934d5bfb7912304754479dd1f096d5c807da - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0xc3c7d422809852031b44ab29eec9f1eff2a58756 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x8f3cf7ad23cd3cadbd9735aff958023239c6a063 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x750e4c4984a9e0f12978ea6742bc1c5d248f40ed - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x111111517e4929d3dcbdfa7cce55d30d4b6bc4d6 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0xd0258a3fd00f38aa8090dfee343f10a9d4d30d3f - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x430ef9263e76dae63c84292c3409d61c598e9682 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0xb33eaad8d922b1083446dc23f610c2567fb5180f - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0xdc3326e71d45186f113a2f448984ca0e8d201995 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x311434160d7537be358930def317afb606c0d737 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x0b3f868e0be5597d5db7feb59e1cadbb0fdda50a - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0xe3f2b1b2229c0333ad17d03f179b87500e7c5e01 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0xac0f66379a6d7801d7726d5a943356a172549adb - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0xf88332547c680f755481bf489d890426248bb275 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0xe5417af564e4bfda1c483642db72007871397896 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0xe261d618a959afffd53168cd07d12e37b26761db - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0xe0b52e49357fd4daf2c15e02058dce6bc0057db4 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0xbbba073c31bf03b8acf7c28ef0738decf3695683 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0xe238ecb42c424e877652ad82d8a939183a04c35f - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x3b56a704c01d650147ade2b8cee594066b3f9421 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x5fe2b58c013d7601147dcdd68c143a77499f5531 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x172370d5cd63279efa6d502dab29171933a610af - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x53df32548214f51821cf1fe4368109ac5ddea1ff - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0xff76c0b48363a7c7307868a81548d340049b0023 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x6f8a06447ff6fcf75d803135a7de15ce88c1d4ec - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x50b728d8d964fd00c2d0aad81718b71311fef68a - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x3a58a54c066fdc0f2d55fc9c89f0415c92ebf3c4 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x03b54a6e9a984069379fae1a4fc4dbae93b3bccd - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0xd93f7e271cb87c23aaa73edc008a79646d1f9912 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x200c234721b5e549c3693ccc93cf191f90dc2af9 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x11cd37bb86f65419713f30673a480ea33c826872 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x8a16d4bf8a0a716017e8d2262c4ac32927797a2f - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x9a71012b13ca4d3d0cdc72a177df3ef03b0e76a3 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0xa1c57f48f0deb89f569dfbe6e2b7f46d33606fd4 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x190eb8a183d22a4bdf278c6791b152228857c033 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x2f6f07cdcf3588944bf4c42ac74ff24bf56e7590 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x235737dbb56e8517391473f7c964db31fa6ef280 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x0b220b82f3ea3b7f6d9a1d8ab58930c064a2b5bf - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x8bff1bd27e2789fe390acabc379c380a83b68e84 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0xb58458c52b6511dc723d7d6f3be8c36d7383b4a8 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x323665443cef804a3b5206103304bd4872ea4253 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x2760e46d9bb43dafcbecaad1f64b93207f9f0ed7 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x18ec0a6e18e5bc3784fdd3a3634b31245ab704f6 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x431d5dff03120afa4bdf332c61a6e1766ef37bdb - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x6f7c932e7684666c9fd1d44527765433e01ff61d - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0xeee3371b89fc43ea970e908536fcddd975135d8a - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0xe5b49820e5a1063f6f4ddf851327b5e8b2301048 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0xaa3717090cddc9b227e49d0d84a28ac0a996e6ff - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x62a872d9977db171d9e213a5dc2b782e72ca0033 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x381caf412b45dac0f62fbeec89de306d3eabe384 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0xe0bceef36f3a6efdd5eebfacd591423f8549b9d5 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x23d29d30e35c5e8d321e1dc9a8a61bfd846d4c5c - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x282d8efce846a88b159800bd4130ad77443fa1a1 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x74dd45dd579cad749f9381d6227e7e02277c944b - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x714db550b574b3e927af3d93e26127d15721d4c2 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0xfa68fb4628dff1028cfec22b4162fccd0d45efb6 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0xe631dabef60c37a37d70d3b4f812871df663226f - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0xdb725f82818de83e99f1dac22a9b5b51d3d04dd4 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x3c59798620e5fec0ae6df1a19c6454094572ab92 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x0d0b8488222f7f83b23e365320a4021b12ead608 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0xa380c0b01ad15c8cf6b46890bddab5f0868e87f3 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x8a953cfe442c5e8855cc6c61b1293fa648bae472 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x45c32fa6df82ead1e2ef74d17b76547eddfaff89 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x11cd72f7a4b699c67f225ca8abb20bc9f8db90c7 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x0c9c7712c83b3c70e7c5e11100d33d9401bdf9dd - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x77a6f2e9a9e44fd5d5c3f9be9e52831fc1c3c0a0 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0xbfc70507384047aa74c29cdc8c5cb88d0f7213ac - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0xfcb54da3f4193435184f3f647467e12b50754575 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x9a6a40cdf21a0af417f1b815223fd92c85636c58 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0xe111178a87a3bff0c8d18decba5798827539ae99 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x82617aa52dddf5ed9bb7b370ed777b3182a30fd1 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x2ab0e9e4ee70fff1fb9d67031e44f6410170d00e - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0xa486c6bc102f409180ccb8a94ba045d39f8fc7cb - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0xc4a206a306f0db88f98a3591419bc14832536862 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0xf0059cc2b3e980065a906940fbce5f9db7ae40a7 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x16eccfdbb4ee1a85a33f3a9b21175cd7ae753db4 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x553d3d295e0f695b9228246232edf400ed3560b5 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x14af1f2f02dccb1e43402339099a05a5e363b83c - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x7bdf330f423ea880ff95fc41a280fd5ecfd3d09f - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x8505b9d2254a7ae468c0e9dd10ccea3a837aef5c - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0xe2aa7db6da1dae97c5f5c6914d285fbfcc32a128 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0xb7b31a6bc18e48888545ce79e83e06003be70930 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x1631244689ec1fecbdd22fb5916e920dfc9b8d30 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0xf6372cdb9c1d3674e83842e3800f2a62ac9f3c66 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x692ac1e363ae34b6b489148152b12e2785a3d8d6 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x0266f4f08d82372cf0fcbccc0ff74309089c74d1 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x7fbc10850cae055b27039af31bd258430e714c62 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0xa3fa99a148fa48d14ed51d610c367c61876997f1 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x9dbfc1cbf7a1e711503a29b4b5f9130ebeccac96 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x236aa50979d5f3de3bd1eeb40e81137f22ab794b - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0xf86df9b91f002cfeb2aed0e6d05c4c4eaef7cf02 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/base/0x4200000000000000000000000000000000000006 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/base/0xd9aaec86b65d86f6a7b5b1b0c42ffa531710b6ca - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/base/0x6921b130d297cc43754afba22e5eac0fbf8db75b - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/base/0x5babfc2f240bc5de90eb7e19d789412db1dec402 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/base/0x532f27101965dd16442e59d40670faf5ebb142e4 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/base/0x833589fcd6edb6e08f4c7c32d4f71b54bda02913 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/base/0x4ed4e862860bed51a9570b96d89af5e1b0efefed - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/base/0xc1cba3fcea344f92d9239c08c0568f6f2f0ee452 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/base/0xac1bd2486aaf3b5c0fc3fd868558b082a531b2b4 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/base/0x0d97f261b1e88845184f678e2d1e7a98d9fd38de - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/base/0x8129b94753f22ec4e62e2c4d099ffe6773969ebc - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/base/0x3f14920c99beb920afa163031c4e47a3e03b3e4a - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/base/0x940181a94a35a4569e4529a3cdfb74e38fd98631 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/base/0x3419875b4d3bca7f3fdda2db7a476a79fd31b4fe - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/base/0xa067436db77ab18b1a315095e4b816791609897c - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/base/0xafb89a09d82fbde58f18ac6437b3fc81724e4df6 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/base/0x489fe42c267fe0366b16b0c39e7aeef977e841ef - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/base/0x2ae3f1ec7f1f5012cfeab0185bfc7aa3cf0dec22 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/base/0xdc46c1e93b71ff9209a0f8076a9951569dc35855 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/base/0x91f45aa2bde7393e0af1cc674ffe75d746b93567 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/base/0x236aa50979d5f3de3bd1eeb40e81137f22ab794b - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/base/0xf6e932ca12afa26665dc4dde7e27be02a7c02e50 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/base/0x524d524b4c9366be706d3a90dcf70076ca037ae3 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/base/0x5b5dee44552546ecea05edea01dcd7be7aa6144a - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/base/0x2598c30330d5771ae9f983979209486ae26de875 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/base/0xfa980ced6895ac314e7de34ef1bfae90a5add21b - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/base/0x469fda1fb46fcb4befc0d8b994b516bd28c87003 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/base/0x4e496c0256fb9d4cc7ba2fdf931bc9cbb7731660 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/base/0x27d2decb4bfc9c76f0309b8e88dec3a601fe25a8 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/base/0xbfd5206962267c7b4b4a8b3d76ac2e1b2a5c4d5e - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/base/0x9e1028f5f1d5ede59748ffcee5532509976840e0 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/base/0x3c3aa127e6ee3d2f2e432d0184dd36f2d2076b52 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/base/0xba5e6fa2f33f3955f0cef50c63dcc84861eab663 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/base/0x97c806e7665d3afd84a8fe1837921403d59f3dcc - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/base/0x8ee73c484a26e0a5df2ee2a4960b789967dd0415 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/base/0x00e57ec29ef2ba7df07ad10573011647b2366f6d - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/base/0x8f019931375454fe4ee353427eb94e2e0c9e0a8c - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/base/0x93e6407554b2f02640ab806cd57bd83e848ec65d - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x55d398326f99059ff775485246999027b3197955 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0xbb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x2170ed0880ac9a755fd29b2688956bd959f933f8 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0xfdc66a08b0d0dc44c17bbd471b88f49f50cdd20f - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x7130d2a12b9bcbfae4f2634d864a1ee1ce3ead9c - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x1d2f0da169ceb9fc7b3144628db156f3f6c60dbe - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0xe9e7cea3dedca5984780bafc599bd69add087d56 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0xfa54ff1a158b5189ebba6ae130ced6bbd3aea76e - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x570a5d26f7765ecb712c0924e4de545b89fd43df - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x47c454ca6be2f6def6f32b638c80f91c9c3c5949 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0xad86d0e9764ba90ddd68747d64bffbd79879a238 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0xf8a0bf9cf54bb92f17374d9e9a321e6a111a51bd - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0xd691d9a68c887bdf34da8c36f63487333acfd103 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x1af3f329e8be154074d8769d1ffa4ee058b1dbc3 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x1294f4183763743c7c9519bec51773fb3acd78fd - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0xb04906e95ab5d797ada81508115611fee694c2b3 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x111111111117dc0aa78b770fa6a738034120c302 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0xcc42724c6683b7e57334c4e856f4c9965ed682bd - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x90c97f71e18723b0cf0dfa30ee176ab653e89f40 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x0e09fabb73bd3ade0a17ecc321fd13a19e81ce82 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x2b72867c32cf673f7b02d208b26889fed353b1f8 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x031b41e504677879370e9dbcf937283a8691fa7f - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x1ce0c2827e2ef14d5c4f29a091d735a204794041 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0xcf3bb6ac0f6d987a5727e2d15e39c2d6061d5bec - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x8ff795a6f4d97e7887c79bea79aba5cc76444adf - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x2dff88a56767223a5529ea5960da7a3f5f766406 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x003d87d02a2a01e9e8a20f507c83e15dd83a33d1 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x4b0f1812e5df2a09796481ff14017e6005508003 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0xbf5140a22578168fd562dccf235e5d43a02ce9b1 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0xca1c644704febf4ab81f85daca488d1623c28e63 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x51e72dd1f2628295cc2ef931cb64fdbdc3a0c599 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0xbbca42c60b5290f2c48871a596492f93ff0ddc82 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x555296de6a86e72752e5c5dc091fe49713aa145c - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x0808bf94d57c905f1236212654268ef82e1e594e - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x8457ca5040ad67fdebbcc8edce889a335bc0fbfb - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0xcebef3df1f3c5bfd90fde603e71f31a53b11944d - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x90ed8f1dc86388f14b64ba8fb4bbd23099f18240 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x9840652dc04fb9db2c43853633f0f62be6f00f98 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0xba2ae424d960c26247dd6c32edc70b295c744c43 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x0782b6d8c4551b9760e74c0545a9bcd90bdc41e5 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0xbe2b6c5e31f292009f495ddbda88e28391c9815e - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x8f0528ce5ef7b51152a59745befdd91d97091d2f - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0xffeecbf8d7267757c2dc3d13d730e97e15bfdf7f - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x0eb3a705fc54725037cc9e008bdede697f62f335 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0xf21768ccbc73ea5b6fd3c687208a7c2def2d966e - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x0000028a2eb8346cd5c0267856ab7594b7a55308 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x76a797a59ba2c17726896976b7b3747bfd1d220f - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0xc79d1fd14f514cd713b5ca43d288a782ae53eab2 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0xad29abb318791d579433d831ed122afeaf29dcfe - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x3203c9e46ca618c8c1ce5dc67e7e9d75f5da2377 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0xdb021b1b247fe2f1fa57e0a87c748cc1e321f07f - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x7083609fce4d1d8dc0c979aab8c869ea2c873402 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0xc5f0f7b66764f6ec8c8dff7ba683102295e16409 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0xe29142e14e52bdfbb8108076f66f49661f10ec10 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0xb0d502e938ed5f4df2e681fe6e419ff29631d62b - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x6730f7a6bbb7b9c8e60843948f7feb4b6a17b7f7 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x1613957159e9b0ac6c80e824f7eea748a32a0ae2 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/celo/0x471ece3750da237f93b8e339c536989b8978a438 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/celo/0x765de816845861e75a25fca122bb6898b8b1282a - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/celo/0x66803fb87abd4aac3cbb3fad7c3aa01f6f3fb207 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/celo/0xd8763cba276a3738e6de85b4b3bf5fded6d6ca73 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/celo/0x37f750b7cc259a2f741af45294f6a16572cf5cad - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/celo/0xd71ffd0940c920786ec4dbb5a12306669b5b81ef - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/celo/0xe8537a3d056da446677b9e9d6c5db704eaab4787 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/celo/0x4f604735c1cf31399c6e711d5962b2b3e0225ad3 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/celo/0x02de4766c272abc10bc88c220d214a26960a7e92 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/celo/0xceba9300f2b948710d2653dd7b07f33a8b32118c - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/celo/0xc16b81af351ba9e64c1a069e3ab18c244a1e3049 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x728f30fa2f100742c7949d1961804fa8e0b1387d - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x41ea5d41eeacc2d5c4072260945118a13bb7ebce - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xf21661d0d1d76d3ecb8e1b9f1c923dbfffae4097 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xb0ecc6ac0073c063dcfc026ccdc9039cae2998e1 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/optimism/0x00f932f0fe257456b32deda4758922e56a4f4b42 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/base/0xa4af354d466e8a68090dd9eb2cb7caf162f4c8c2 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xba50933c268f567bdc86e1ac131be072c6b0b71a - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xd29da236dd4aac627346e1bba06a619e8c22d7c5 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x1bfce574deff725a3f483c334b790e25c8fa9779 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x9e18d5bab2fa94a6a95f509ecb38f8f68322abd3 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xcd5fe23c85820f7b72d0926fc9b05b43e359b7ee - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xbf5495efe5db9ce00f80364c8b423567e58d2110 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x065b4e5dfd50ac12a81722fd0a0de81d78ddf7fb - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x57e114b691db790c35207b2e685d4a43181e6061 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x0b7f0e51cd1739d6c96982d55ad8fa634dd43a9c - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xc56c7a0eaa804f854b536a5f3d5f49d2ec4b12b8 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x594daad7d77592a2b97b725a7ad59d7e188b5bfa - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x8355dbe8b0e275abad27eb843f3eaf3fc855e525 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x2a961d752eaa791cbff05991e4613290aec0d9ac - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x38e68a37e401f7271568cecaac63c6b1e19130b4 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x1131d427ecd794714ed00733ac0f851e904c8398 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x1495bc9e44af1f8bcb62278d2bec4540cf0c05ea - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x808507121b80c02388fad14726482e061b8da827 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x44971abf0251958492fee97da3e5c5ada88b9185 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x320623b8e4ff03373931769a31fc52a4e78b5d70 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x6e5970dbd6fc7eb1f29c6d2edf2bc4c36124c0c1 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xd40c688da9df74e03566eaf0a7c754ed98fbb8cc - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x8afe4055ebc86bd2afb3940c0095c9aca511d852 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x9ce84f6a69986a83d92c324df10bc8e64771030f - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xbe4d9c8c638b5f0864017d7f6a04b66c42953847 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x68bbed6a47194eff1cf514b50ea91895597fc91e - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x69420e3a3aa9e17dea102bb3a9b3b73dcddb9528 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x7420b4b9a0110cdc71fb720908340c03f9bc03ec - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x03aa6298f1370642642415edc0db8b957783e8d6 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xd533a949740bb3306d119cc777fa900ba034cd52 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xf14dd7b286ce197019cba54b189d2b883e70f761 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xa35923162c49cf95e6bf26623385eb431ad920d3 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x8cefbeb2172a9382753de431a493e21ba9694004 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x120a3879da835a5af037bb2d1456bebd6b54d4ba - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x69457a1c9ec492419344da01daf0df0e0369d5d0 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xf6ce4be313ead51511215f1874c898239a331e37 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x73d7c860998ca3c01ce8c808f5577d94d545d1b4 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xeff49b0f56a97c7fd3b51f0ecd2ce999a7861420 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x236501327e701692a281934230af0b6be8df3353 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x5026f006b85729a8b14553fae6af249ad16c9aab - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x66761fa41377003622aee3c7675fc7b5c1c2fac5 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x9f9c8ec3534c3ce16f928381372bfbfbfb9f4d24 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xd8c978de79e12728e38aa952a6cb4166f891790f - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x7122985656e38bdc0302db86685bb972b145bd3c - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x582d872a1b094fc48f5de31d3b73f2d9be47def1 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x504624040e0642921c2c266a9ac37cafbd8cda4e - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xc548e90589b166e1364de744e6d35d8748996fe8 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x4c11249814f11b9346808179cf06e71ac328c1b5 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x423f4e6138e475d85cf7ea071ac92097ed631eea - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0x8390a1da07e376ef7add4be859ba74fb83aa02d5 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xf94e7d0710709388bce3161c32b4eea56d3f91cc - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xaa95f26e30001251fb905d264aa7b00ee9df6c18 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x2416092f143378750bb29b79ed961ab195cceea5 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x6c84a8f1c29108f47a79964b5fe888d4f4d0de40 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x71eeba415a523f5c952cc2f06361d5443545ad28 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x88a269df8fe7f53e590c561954c52fccc8ec0cfb - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x429fed88f10285e61b12bdf00848315fbdfcc341 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xb299751b088336e165da313c33e3195b8c6663a6 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xf0a479c9c3378638ec603b8b6b0d75903902550b - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xb59c8912c83157a955f9d715e556257f432c35d7 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xba0dda8762c24da9487f5fa026a9b64b695a07ea - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xc24a365a870821eb83fd216c9596edd89479d8d7 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xa586b3b80d7e3e8d439e25fbc16bc5bcee3e2c85 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xef04804e1e474d3f9b73184d7ef5d786f3fce930 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x2e9a6df78e42a30712c10a9dc4b1c8656f8f2879 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x13a7dedb7169a17be92b0e3c7c2315b46f4772b3 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0x1dd6b5f9281c6b4f043c02a83a46c2772024636c - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xc5102fe9359fd9a28f877a67e36b0f050d81a3cc - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xf525e73bdeb4ac1b0e741af3ed8a8cbb43ab0756 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xe4177c1400a8eee1799835dcde2489c6f0d5d616 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xed5740209fcf6974d6f3a5f11e295b5e468ac27c - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/arbitrum/0xe10d4a4255d2d35c9e23e2c4790e073046fbaf5c - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/optimism/0x10398abc267496e49106b07dd6be13364d10dc71 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/optimism/0x2218a117083f5b482b0bb821d27056ba9c04b1d3 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/optimism/0x395ae52bb17aef68c2888d941736a71dc6d4e125 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/optimism/0x9a601c5bb360811d96a23689066af316a30c3027 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0xbac3368b5110f3a3dda8b5a0f7b66edb37c47afe - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x1d3c629ca5c1d0ab3bdf74600e81b4145615df8e - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0xe9c21de62c5c5d0ceacce2762bf655afdceb7ab3 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x658cda444ac43b0a7da13d638700931319b64014 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x3d2bd0e15829aa5c362a4144fdf4a1112fa29b5c - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x3fb83a9a2c4408909c058b0bfe5b4823f54fafe2 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x00e5646f60ac6fb446f621d146b6e1886f002905 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x12a4cebf81f8671faf1ab0acea4e3429e42869e7 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x9ff62d1fc52a907b6dcba8077c2ddca6e6a9d3e1 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0xc61f39418cd27820b5d4e9ba4a7197eefaeb8b05 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x15b7c0c907e4c6b9adaaaabc300c08991d6cea05 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x7f67639ffc8c93dd558d452b8920b28815638c44 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/polygon/0x276c9cbaa4bdf57d7109a41e67bd09699536fa3d - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/base/0x041fdf3f472d2c8a7ecc458fc3b7f543e6c57ef7 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/base/0x3c281a39944a2319aa653d81cfd93ca10983d234 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/base/0x96419929d7949d6a801a6909c145c8eef6a40431 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/base/0xfea9dcdc9e23a9068bf557ad5b186675c61d33ea - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/base/0xdb6e0e5094a25a052ab6845a9f1e486b9a9b3dde - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/base/0xcde172dc5ffc46d228838446c57c1227e0b82049 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/base/0xff0c532fdb8cd566ae169c1cb157ff2bdc83e105 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/base/0x9a26f5433671751c3276a065f57e5a02d2817973 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/base/0x3636a7734b669ce352e97780df361ce1f809c58c - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/base/0x50c5725949a6f0c72e6c4a641f24049a917db0cb - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/base/0xe3086852a4b125803c815a158249ae468a3254ca - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/base/0xbeb0fd48c2ba0f1aacad2814605f09e08a96b94e - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/base/0xbc45647ea894030a4e9801ec03479739fa2485f0 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/base/0x768be13e1680b5ebe0024c42c896e3db59ec0149 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/base/0x928a6a9fc62b2c94baf2992a6fba4715f5bb0066 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/base/0xbf4db8b7a679f89ef38125d5f84dd1446af2ea3b - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/base/0xed899bfdb28c8ad65307fa40f4acab113ae2e14c - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/base/0x1b6a569dd61edce3c383f6d565e2f79ec3a12980 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/base/0x76734b57dfe834f102fb61e1ebf844adf8dd931e - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/base/0x4621b7a9c75199271f773ebd9a499dbd165c3191 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/base/0xaf07d812d1dcec20bf741075bc18660738d226dd - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/base/0x7f12d13b34f5f4f0a9449c16bcd42f0da47af200 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/base/0x55a6f6cb50db03259f6ab17979a4891313be2f45 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/base/0x968d6a288d7b024d5012c0b25d67a889e4e3ec19 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/base/0x7a8a5012022bccbf3ea4b03cd2bb5583d915fb1a - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/base/0xcde90558fc317c69580deeaf3efc509428df9080 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/base/0x0028e1e60167b48a938b785aa5292917e7eaca8b - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/base/0x76e7447bafa3f0acafc9692629b1d1bc937ca15d - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/base/0x15ac90165f8b45a80534228bdcb124a011f62fee - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/base/0x4045b33f339a3027af80013fb5451fdbb01a4492 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/base/0xddf98aad8180c3e368467782cd07ae2e3e8d36a5 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/base/0x698dc45e4f10966f6d1d98e3bfd7071d8144c233 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/base/0x3c8665472ec5af30981b06b4e0143663ebedcc1e - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/base/0x18a8bd1fe17a1bb9ffb39ecd83e9489cfd17a022 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/base/0xba0dda8762c24da9487f5fa026a9b64b695a07ea - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/base/0x13741c5df9ab03e7aa9fb3bf1f714551dd5a5f8a - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/base/0xebff2db643cf955247339c8c6bcd8406308ca437 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/base/0xfadb26be94c1f959f900bf88cd396b3e803481d6 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/base/0x52c2b317eb0bb61e650683d2f287f56c413e4cf6 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/base/0x38d513ec43dda20f323f26c7bef74c5cf80b6477 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/base/0x33ad778e6c76237d843c52d7cafc972bb7cf8729 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/base/0x290814ad0fbd2b935f34d7b40306102313d4c63e - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/base/0x5e432eecd01c12ee7071ee9219c2477a347da192 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/base/0xbdf5bafee1291eec45ae3aadac89be8152d4e673 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/base/0xff62ddfa80e513114c3a0bf4d6ffff1c1d17aadf - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/base/0x8c81b4c816d66d36c4bf348bdec01dbcbc70e987 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/base/0x6b82297c6f1f9c3b1f501450d2ee7c37667ab70d - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/base/0x42069babe14fb1802c5cb0f50bb9d2ad6fef55e2 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/base/0x72499bddb67f4ca150e1f522ca82c87bc9fb18c8 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/base/0x0578d8a44db98b23bf096a382e016e29a5ce0ffe - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/base/0x8fe815417913a93ea99049fc0718ee1647a2a07c - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/base/0x7d12aeb5d96d221071d176980d23c213d88d9998 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/base/0xb166e8b140d35d9d8226e40c09f757bac5a4d87d - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/base/0x8853f0c059c27527d33d02378e5e4f6d5afb574a - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/base/0xf3c052f2baab885c610a748eb01dfbb643ba835b - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/base/0xcd1cffa8ebc66f1a2cf7675b48ba955ffcb82d8e - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/base/0xde7a416ac821c77478340eebaa21b68297025ef3 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/base/0x2da56acb9ea78330f947bd57c54119debda7af71 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/base/0x8972ab69d499b5537a31576725f0af8f67203d38 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/base/0x88faea256f789f8dd50de54f9c807eef24f71b16 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/base/0x42069de48741db40aef864f8764432bbccbd0b69 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/base/0x9a27c6759a6de0f26ac41264f0856617dec6bc3f - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/base/0xfaa4f3bcfc87d791e9305951275e0f62a98bcb10 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/base/0xfd9fa4f785331ce88b5af8994a047ba087c705d8 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/base/0x21eceaf3bf88ef0797e3927d855ca5bb569a47fc - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/base/0x7d9ce55d54ff3feddb611fc63ff63ec01f26d15f - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/base/0x4229c271c19ca5f319fb67b4bc8a40761a6d6299 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/base/0x80f45eacf6537498ecc660e4e4a2d2f99e195cf4 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/base/0x1a475d06d967aeb686c98de80d079d72097aeacf - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/base/0x4fb9b20dafe45d91ae287f2e07b2e79709308178 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/base/0xd3741ac9b3f280b0819191e4b30be4ecd990771e - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/base/0x09579452bc3872727a5d105f342645792bb8a82b - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/base/0x8a24d7260cd02d3dfd8eefb66bc17ad4b17d494c - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/base/0xd88611a629265c9af294ffdd2e7fa4546612273e - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/base/0x9a86980d3625b4a6e69d8a4606d51cbc019e2002 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/base/0x1c7a460413dd4e964f96d8dfc56e7223ce88cd85 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/base/0x776aaef8d8760129a0398cf8674ee28cefc0eab9 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/base/0x28e29ec91db66733a94ee8e3b86a6199117baf99 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/base/0xb9898511bd2bad8bfc23eba641ef97a08f27e730 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/base/0x76baa16ff15d61d32e6b3576c3a8c83a25c2f180 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/base/0x2816a491dd0b7a88d84cbded842a618e59016888 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/base/0xa7ea9d5d4d4c7cf7dbde5871e6d108603c6942a5 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/base/0x586e10db93630a4d2da6c6a34ba715305b556f04 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0xf486ad071f3bee968384d2e39e2d8af0fcf6fd46 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x76d36d44dc4595e8d2eb3ad745f175eda134284f - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x1fa4a73a3f0133f0025378af00236f3abdee5d63 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0xb3ed0a426155b79b898849803e3b36552f7ed507 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x0ef4a107b48163ab4b57fca36e1352151a587be4 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x62694d43ccb9b64e76e38385d15e325c7712a735 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0xa2b726b1145a4773f68593cf171187d8ebe4d495 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0xf275e1ac303a4c9d987a2c48b8e555a77fec3f1c - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/bnb/0x11a31b833d43853f8869c9eec17f60e3b4d2a753 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 https://app.uniswap.org/explore/tokens/celo/0x48065fbbe25f71c9282ddf5e1cd6d6a887483d5e - 2025-10-17T22:04:33.647Z + 2025-03-20T21:19:45.690Z 0.8 - https://app.uniswap.org/explore/tokens/ethereum/0xbadff0ef41d2a68f22de21eabca8a59aaf495cf0 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/tokens/ethereum/NATIVE + 2025-03-20T21:28:30.528Z 0.8 - https://app.uniswap.org/explore/tokens/ethereum/0x1fdd61ef9a5c31b9a2abc7d39c139c779e8412af - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/tokens/base/NATIVE + 2025-03-20T21:28:30.528Z 0.8 - https://app.uniswap.org/explore/tokens/ethereum/0x4ade2b180f65ed752b6f1296d0418ad21eb578c0 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/tokens/bnb/NATIVE + 2025-03-20T21:28:30.528Z 0.8 - https://app.uniswap.org/explore/tokens/ethereum/0x0c5cb676e38d6973837b9496f6524835208145a2 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/tokens/ethereum/0xcbb7c0000ab88b473b1f5afd9ef808440eed33bf + 2025-03-20T21:28:30.528Z 0.8 - https://app.uniswap.org/explore/tokens/ethereum/0xb69753c06bb5c366be51e73bfc0cc2e3dc07e371 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/tokens/base/0xcbb7c0000ab88b473b1f5afd9ef808440eed33bf + 2025-03-20T21:28:30.528Z 0.8 - https://app.uniswap.org/explore/tokens/ethereum/0x8143182a775c54578c8b7b3ef77982498866945d - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/tokens/ethereum/0x7fc66500c84a76ad7e9c93437bfc5ac33e2ddae9 + 2025-03-20T21:28:30.528Z 0.8 - https://app.uniswap.org/explore/tokens/ethereum/0x76e222b07c53d28b89b0bac18602810fc22b49a8 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/tokens/ethereum/0x73a15fed60bf67631dc6cd7bc5b6e8da8190acf5 + 2025-03-20T21:28:30.528Z 0.8 - https://app.uniswap.org/explore/tokens/ethereum/0x18aaa7115705e8be94bffebde57af9bfc265b998 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/tokens/ethereum/0x18084fba666a33d37592fa2633fd49a74dd93a88 + 2025-03-20T21:28:30.528Z 0.8 - https://app.uniswap.org/explore/tokens/ethereum/0x7d8146cf21e8d7cbe46054e01588207b51198729 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/tokens/ethereum/0x8236a87084f8b84306f72007f36f2618a5634494 + 2025-03-20T21:28:30.528Z 0.8 - https://app.uniswap.org/explore/tokens/ethereum/0xfe0c30065b384f05761f15d0cc899d4f9f9cc0eb - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/tokens/optimism/NATIVE + 2025-03-20T21:28:30.528Z 0.8 - https://app.uniswap.org/explore/tokens/ethereum/0x1ce270557c1f68cfb577b856766310bf8b47fd9c - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/tokens/ethereum/0x26e550ac11b26f78a04489d5f20f24e3559f7dd9 + 2025-03-20T21:28:30.528Z 0.8 - https://app.uniswap.org/explore/tokens/ethereum/0x793a5d8b30aab326f83d20a9370c827fea8fdc51 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/tokens/polygon/0x0000000000000000000000000000000000001010 + 2025-03-20T21:28:30.528Z 0.8 - https://app.uniswap.org/explore/tokens/ethereum/0xff836a5821e69066c87e268bc51b849fab94240c - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/tokens/ethereum/0x9d39a5de30e57443bff2a8307a4256c8797a3497 + 2025-03-20T21:28:30.528Z 0.8 - https://app.uniswap.org/explore/tokens/ethereum/0xf4d2888d29d722226fafa5d9b24f9164c092421e - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/tokens/ethereum/0x4c1746a800d224393fe2470c70a35717ed4ea5f1 + 2025-03-20T21:28:30.528Z 0.8 - https://app.uniswap.org/explore/tokens/ethereum/0x8ed97a637a790be1feff5e888d43629dc05408f6 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/tokens/base/0x0b3e328455c4059eeb9e3f84b5543f74e24e7e1b + 2025-03-20T21:28:30.528Z 0.8 - https://app.uniswap.org/explore/tokens/ethereum/0x31c8eacbffdd875c74b94b077895bd78cf1e64a3 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/tokens/arbitrum/NATIVE + 2025-03-20T21:28:30.528Z 0.8 - https://app.uniswap.org/explore/tokens/ethereum/0xc55126051b22ebb829d00368f4b12bde432de5da - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/tokens/ethereum/0x3593d125a4f7849a1b059e64f4517a86dd60c95d + 2025-03-20T21:28:30.528Z 0.8 https://app.uniswap.org/explore/tokens/ethereum/0xe0f63a424a4439cbe457d80e4f4b51ad25b2c56c - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x8881562783028f5c1bcb985d2283d5e170d88888 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x67466be17df832165f8c80a5a120ccc652bd7e69 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xd939212f16560447ed82ce46ca40a63db62419b5 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x88417754ff7062c10f4e3a4ab7e9f9d9cbda6023 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x5afe3855358e112b5647b952709e6165e1c1eeee - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x02e7f808990638e9e67e1f00313037ede2362361 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xd2bdaaf2b9cc6981fd273dcb7c04023bfbe0a7fe - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x112b08621e27e10773ec95d250604a041f36c582 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x32b053f2cba79f80ada5078cb6b305da92bde6e1 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x5ac34c53a04b9aaa0bf047e7291fb4e8a48f2a18 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x26ebb8213fb8d66156f1af8908d43f7e3e367c1d - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xe3b9cfb8ea8a4f1279fbc28d3e15b4d2d86f18a0 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x8207c1ffc5b6804f6024322ccf34f29c3541ae26 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x255f1b39172f65dc6406b8bee8b08155c45fe1b6 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0x092baadb7def4c3981454dd9c0a0d7ff07bcfc86 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0x53bcf6698c911b2a7409a740eacddb901fc2a2c6 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0x2ac2b254bc18cd4999f64773a966e4f4869c34ee - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0x17fc002b466eec40dae837fc4be5c67993ddbd6f - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0xc8a4eea31e9b6b61c406df013dd4fec76f21e279 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0x498bf2b1e120fed3ad3d42ea2165e9b73f99c1e5 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0xe4dddfe67e7164b0fe14e218d80dc4c08edc01cb - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0x7c8a1a80fdd00c9cccd6ebd573e9ecb49bfa2a59 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0x1debd73e752beaf79865fd6446b0c970eae7732f - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0xaf5db6e1cc585ca312e8c8f7c499033590cf5c98 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/optimism/0x65559aa14915a70190438ef90104769e5e890a00 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/optimism/0x7fb688ccf682d58f86d7e38e03f9d22e7705448b - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/optimism/0x73cb180bf0521828d8849bc8cf2b920918e23032 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/optimism/0x2e3d870790dc77a83dd1d18184acc7439a53f475 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/optimism/0xa00e3a3511aac35ca78530c85007afcd31753819 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/optimism/0x528cdc92eab044e1e39fe43b9514bfdab4412b98 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/optimism/0x4f604735c1cf31399c6e711d5962b2b3e0225ad3 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/polygon/0x1c954e8fe737f99f68fa1ccda3e51ebdb291948c - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/polygon/0xf50d05a1402d0adafa880d36050736f9f6ee7dee - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/polygon/0xab0b2ddb9c7e440fac8e140a89c0dbcbf2d7bbff - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/polygon/0x8bc3ec2e7973e64be582a90b08cadd13457160fe - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/polygon/0x64060ab139feaae7f06ca4e63189d86adeb51691 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/polygon/0x5ec03c1f7fa7ff05ec476d19e34a22eddb48acdc - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/polygon/0x9627a3d6872be48410fcece9b1ddd344bf08c53e - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/polygon/0x1ed02954d60ba14e26c230eec40cbac55fa3aeea - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x8d3419b9a18651f3926a205ee0b1acea1e7192de - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xb56d0839998fd79efcd15c27cf966250aa58d6d3 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x81f91fe59ee415735d59bd5be5cca91a0ea4fa69 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x87c211144b1d9bdaa5a791b8099ea4123dc31d21 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xf4210f93bc68d63df3286c73eba08c6414f40c0d - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xece7b98bd817ee5b1f2f536daf34d0b6af8bb542 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x4c96a67b0577358894407af7bc3158fc1dffbeb5 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x70737489dfdf1a29b7584d40500d3561bd4fe196 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x39353a32eceafe4979a8606512c046c3b6398cc4 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x92fb1b7d9730b2f1bd4e2e91368c1eb6fdd2a009 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x174e33ef2effa0a4893d97dda5db4044cc7993a3 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xfdc944fb59201fb163596ee5e209ebc8fa4dcdc5 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x388e543a5a491e7b42e3fbcd127dd6812ea02d0d - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x56a38e7216304108e841579041249feb236c887b - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x1804e3db872eed4141e482ff74c56862f2791103 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x9de16c805a3227b9b92e39a446f9d56cf59fe640 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xb8d98a102b0079b69ffbc760c8d857a31653e56e - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x5d6812722c3693078e4a0dbe3e9affc27a0b2768 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x255f1b39172f65dc6406b8bee8b08155c45fe1b6 - 2025-10-17T22:04:33.647Z + 2025-03-20T21:28:30.528Z 0.8 - https://app.uniswap.org/explore/tokens/base/0xc2fe011c3885277c7f0e7ffd45ff90cadc8ecd12 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xc1ffaef4e7d553bbaf13926e258a1a555a363a07 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x4e73420dcc85702ea134d91a262c8ffc0a72aa70 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xecaf81eb42cd30014eb44130b89bcd6d4ad98b92 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/bnb/0x4eae52907dba9c370e9ee99f0ce810602a4f2c63 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/bnb/0x25d887ce7a35172c62febfd67a1856f20faebb00 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x382ea807a61a418479318efd96f1efbc5c1f2c21 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x6468e79a80c0eab0f9a2b574c8d5bc374af59414 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x3106a0a076bedae847652f42ef07fd58589e001f - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xd015422879a1308ba557510345e944b912b9ab73 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x5de8ab7e27f6e7a1fff3e5b337584aa43961beef - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xcf078da6e85389de507ceede0e3d217e457b9d49 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x1bbf25e71ec48b84d773809b4ba55b6f4be946fb - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x7039cd6d7966672f194e8139074c3d5c4e6dcf65 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x943af17c37207c9d7a27d12cb5055542a0b7afa8 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/tokens/ethereum/0xbdf43ecadc5cef51b7d1772f722e40596bc1788b + 2025-03-20T21:28:30.528Z 0.8 - https://app.uniswap.org/explore/tokens/ethereum/0x6d68015171eaa7af9a5a0a103664cf1e506ff699 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/tokens/unichain/NATIVE + 2025-03-20T21:28:30.528Z 0.8 - https://app.uniswap.org/explore/tokens/ethereum/0x6942806d1b2d5886d95ce2f04314ece8eb825833 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/tokens/arbitrum/0x6985884c4392d348587b19cb9eaaf157f13271cd + 2025-03-20T21:28:30.528Z 0.8 - https://app.uniswap.org/explore/tokens/ethereum/0x949d48eca67b17269629c7194f4b727d4ef9e5d6 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/tokens/base/0x9e6a46f294bb67c20f1d1e7afb0bbef614403b55 + 2025-03-20T21:28:30.528Z 0.8 - https://app.uniswap.org/explore/tokens/ethereum/0x9361adf2b72f413d96f81ff40d794b47ce13b331 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/tokens/ethereum/0x6c3ea9036406852006290770bedfcaba0e23a0e8 + 2025-03-20T21:28:30.528Z 0.8 - https://app.uniswap.org/explore/tokens/ethereum/0x3bb1be077f3f96722ae92ec985ab37fd0a0c4c51 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/tokens/ethereum/0x467bccd9d29f223bce8043b84e8c8b282827790f + 2025-03-20T21:28:30.528Z 0.8 - https://app.uniswap.org/explore/tokens/ethereum/0xdbb7a34bf10169d6d2d0d02a6cbb436cf4381bfa - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/tokens/base/0x3ec2156d4c0a9cbdab4a016633b7bcf6a8d68ea2 + 2025-03-20T21:28:30.528Z 0.8 - https://app.uniswap.org/explore/tokens/ethereum/0x66bff695f3b16a824869a8018a3a6e3685241269 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/tokens/base/0xc0634090f2fe6c6d75e61be2b949464abb498973 + 2025-03-20T21:28:30.528Z 0.8 - https://app.uniswap.org/explore/tokens/ethereum/0x85d19fb57ca7da715695fcf347ca2169144523a7 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/tokens/arbitrum/0xe80772eaf6e2e18b651f160bc9158b2a5cafca65 + 2025-03-20T21:28:30.528Z 0.8 - https://app.uniswap.org/explore/tokens/ethereum/0x069d89974f4edabde69450f9cf5cf7d8cbd2568d - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/tokens/ethereum/0x35d8949372d46b7a3d5a56006ae77b215fc69bc0 + 2025-03-20T21:28:30.528Z 0.8 - https://app.uniswap.org/explore/tokens/ethereum/0x0fe13ffe64b28a172c58505e24c0c111d149bd47 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/tokens/ethereum/0x1abaea1f7c830bd89acc67ec4af516284b1bc33c + 2025-03-20T21:28:30.528Z 0.8 - https://app.uniswap.org/explore/tokens/ethereum/0x111111111117dc0aa78b770fa6a738034120c302 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/tokens/base/0xfde4c96c8593536e31f229ea8f37b2ada2699bb2 + 2025-03-20T21:28:30.528Z 0.8 - https://app.uniswap.org/explore/tokens/ethereum/0xdc7ac5d5d4a9c3b5d8f3183058a92776dc12f4f3 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/tokens/ethereum/0x58d97b57bb95320f9a05dc918aef65434969c2b2 + 2025-03-20T21:28:30.528Z 0.8 - https://app.uniswap.org/explore/tokens/ethereum/0x482702745260ffd69fc19943f70cffe2cacd70e9 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/tokens/base/0xb33ff54b9f7242ef1593d2c9bcd8f9df46c77935 + 2025-03-20T21:28:30.528Z 0.8 - https://app.uniswap.org/explore/tokens/ethereum/0xc555d625828c4527d477e595ff1dd5801b4a600e - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/tokens/ethereum/0xbad6c59d72d44512616f25b3d160c79db5a69ddf + 2025-03-20T21:28:30.528Z 0.8 - https://app.uniswap.org/explore/tokens/ethereum/0x9eec1a4814323a7396c938bc86aec46b97f1bd82 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/tokens/base/0x1bc0c42215582d5a085795f4badbac3ff36d1bcb + 2025-03-20T21:28:30.528Z 0.8 - https://app.uniswap.org/explore/tokens/ethereum/0x87d73e916d7057945c9bcd8cdd94e42a6f47f776 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/tokens/ethereum/0x31c8eacbffdd875c74b94b077895bd78cf1e64a3 + 2025-03-20T21:28:30.528Z 0.8 - https://app.uniswap.org/explore/tokens/ethereum/0x067def80d66fb69c276e53b641f37ff7525162f6 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/tokens/ethereum/0x667102bd3413bfeaa3dffb48fa8288819e480a88 + 2025-03-20T21:28:30.528Z 0.8 - https://app.uniswap.org/explore/tokens/ethereum/0xdd157bd06c1840fa886da18a138c983a7d74c1d7 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/tokens/polygon/0xdf7837de1f2fa4631d716cf2502f8b230f1dcc32 + 2025-03-20T21:28:30.528Z 0.8 - https://app.uniswap.org/explore/tokens/arbitrum/0xe80772eaf6e2e18b651f160bc9158b2a5cafca65 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/tokens/ethereum/0x45804880de22913dafe09f4980848ece6ecbaf78 + 2025-03-20T21:28:30.528Z 0.8 - https://app.uniswap.org/explore/tokens/arbitrum/0xb6093b61544572ab42a0e43af08abafd41bf25a6 - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/tokens/ethereum/0xd9fcd98c322942075a5c3860693e9f4f03aae07b + 2025-03-20T21:28:30.528Z 0.8 - https://app.uniswap.org/explore/tokens/arbitrum/0x35ca1e5a9b1c09fa542fa18d1ba4d61c8edff852 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0x83e60b9f7f4db5cdb0877659b1740e73c662c55b - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0x4d01397994aa636bdcc65c9e8024bc497498c3bb - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0xc3abc47863524ced8daf3ef98d74dd881e131c38 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0x4d15a3a2286d883af0aa1b3f21367843fac63e07 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/polygon/0xfb7f8a2c0526d01bfb00192781b7a7761841b16c - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/polygon/0x3809dcdd5dde24b37abe64a5a339784c3323c44f - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/polygon/0x85955046df4668e1dd369d2de9f3aeb98dd2a369 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/polygon/0x554cd6bdd03214b10aafa3e0d4d42de0c5d2937b - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/polygon/0x4318cb63a2b8edf2de971e2f17f77097e499459d - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/polygon/0xab9cb20a28f97e189ca0b666b8087803ad636b3c - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/polygon/0x6a8ec2d9bfbdd20a7f5a4e89d640f7e7ceba4499 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/polygon/0x385eeac5cb85a38a9a07a70c73e0a3271cfb54a7 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/polygon/0x0169ec1f8f639b32eec6d923e24c2a2ff45b9dd6 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xe161be4a74ab8fa8706a2d03e67c02318d0a0ad6 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x4d58608eff50b691a3b76189af2a7a123df1e9ba - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x420b0fa3de2efcf2b2fd04152eb1df36a09717cd - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x1cd38856ee0fdfd65c757e530e3b1de3061008d3 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xfad8cb754230dbfd249db0e8eccb5142dd675a0d - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xda761a290e01c69325d12d82ac402e5a73d62e81 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xafb5d4d474693e68df500c9c682e6a2841f9661a - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x0b3e328455c4059eeb9e3f84b5543f74e24e7e1b - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xfc5462143a3178cf044e97c491f6bcb5e38f173e - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xed1978d01d4a8a9d6a43ac79403d5b8dfbed739b - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xba71cb8ef2d59de7399745793657838829e0b147 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x10c1b6f768e13c624a4a23337f1a5ba5c9be0e4b - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x1b1514c76c54ce8807d7fdedf85c664eee734ece - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x58cd93c4a91c3940109fa27d700f5013b18b5dc2 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xea6f7e7e0f46a9e0f4e2048eb129d879f609d632 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x30d19fb77c3ee5cfa97f73d72c6a1e509fa06aef - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/bnb/0xe2dca969624795985f2f083bcd0b674337ba130a - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/bnb/0xbb7d61d2511fd2e63f02178ca9b663458af9fc63 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/bnb/0x59f4f336bf3d0c49dbfba4a74ebd2a6ace40539a - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/bnb/0x62d0a8458ed7719fdaf978fe5929c6d342b0bfce - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xb8fda5aee55120247f16225feff266dfdb381d4c - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xca530408c3e552b020a2300debc7bd18820fb42f - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x3ffeea07a27fab7ad1df5297fa75e77a43cb5790 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xcfeb09c3c5f0f78ad72166d55f9e6e9a60e96eec - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x467bccd9d29f223bce8043b84e8c8b282827790f - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x2077d81d0c5258230d5a195233941547cb5f0989 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x7d1afa7b718fb893db30a3abc0cfc608aacfebb0 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xa0bbbe391b0d0957f1d013381b643041d2ca4022 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xd1b89856d82f978d049116eba8b7f9df2f342ff3 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x62f03b52c377fea3eb71d451a95ad86c818755d1 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x7fc66500c84a76ad7e9c93437bfc5ac33e2ddae9 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x3927fb89f34bbee63351a6340558eebf51a19fb8 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xacd2c239012d17beb128b0944d49015104113650 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x86b69f38bea3e02f68ff88534bc61ec60e772b19 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x6873c95307e13beb58fb8fcddf9a99667655c9e4 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x18084fba666a33d37592fa2633fd49a74dd93a88 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x6e79b51959cf968d87826592f46f819f92466615 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x80ee5c641a8ffc607545219a3856562f56427fe9 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x0414d8c87b271266a5864329fb4932bbe19c0c49 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xf57e7e7c23978c3caec3c3548e3d615c346e79ff - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0xb0ffa8000886e57f86dd5264b9582b2ad87b2b91 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0x1c986661170c1834db49c3830130d4038eeeb866 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0x9ed7e4b1bff939ad473da5e7a218c771d1569456 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0x7f9a7db853ca816b9a138aee3380ef34c437dee0 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0x371c7ec6d8039ff7933a2aa28eb827ffe1f52f07 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0xb1bc21f748ae2be95674876710bc6d78235480e0 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0xadf5dd3e51bf28ab4f07e684ecf5d00691818790 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/optimism/0x1eba7a6a72c894026cd654ac5cdcf83a46445b08 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/polygon/0x38022a157b95c52d43abcac9bd09f028a1079105 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/polygon/0xd2507e7b5794179380673870d88b22f94da6abe0 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/polygon/0xc708d6f2153933daa50b2d0758955be0a93a8fec - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/polygon/0x0052074d3eb1429f39e5ea529b54a650c21f5aa4 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/polygon/0x4e78011ce80ee02d2c3e649fb657e45898257815 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/polygon/0x7583feddbcefa813dc18259940f76a02710a8905 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/polygon/0xe78aee6ccb05471a69677fb74da80f5d251c042b - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/polygon/0x04f177fcacf6fb4d2f95d41d7d3fee8e565ca1d0 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/polygon/0xa6da8c8999c094432c77e7d318951d34019af24b - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x6d3b8c76c5396642960243febf736c6be8b60562 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x7cf7132ede0ca592a236b6198a681bb7b42dd5ae - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x3afeae00a594fbf2e4049f924e3c6ac93296b6e8 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x0a93a7be7e7e426fc046e204c44d6b03a302b631 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xc9b6ef062fab19d3f1eabc36b1f2e852af1acd18 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x1754e5aadce9567a95f545b146a616ce34eead53 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xdb173587d459ddb1b9b0f2d6d88febef039304a2 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x10a7a84c91988138f8dbbc82a23b02c8639e2552 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x92af6f53febd6b4c6f5293840b6076a1b82c4bc2 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xeb9e49fb4c33d9f6aefb1b03f9133435e24c0ec6 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x1b2c141479757b8643a519be4692904088d860b2 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x4d25e94291fe8dcfbfa572cbb2aaa7b755087c91 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x8e0e798966382e53bfb145d474254cbe065c17dc - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x4b6f82a4ed0b9e3767f53309b87819a78d041a7f - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x004aa1586011f3454f487eac8d0d5c647d646c69 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x741777f6b6d8145041f73a0bddd35ae81f55a40f - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/bnb/0xc6c58f600917de512cd02d2b6ed595ab54b4c30f - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/bnb/0x03aa6298f1370642642415edc0db8b957783e8d6 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/bnb/0x3ee2200efb3400fabb9aacf31297cbdd1d435d47 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/bnb/0x0d8ce2a99bb6e3b7db580ed848240e4a0f9ae153 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/bnb/0xa697e272a73744b343528c3bc4702f2565b2f422 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/bnb/0x301af3eff0c904dc5ddd06faa808f653474f7fcc - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/bnb/0x776f9987d9deed90eed791cbd824d971fd5ccf09 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/bnb/0xf7de7e8a6bd59ed41a4b5fe50278b3b7f31384df - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/bnb/0x19e6bfc1a6e4b042fb20531244d47e252445df01 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/bnb/0x4338665cbb7b2485a8855a139b75d5e34ab0db94 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/bnb/0x2940566eb50f15129238f4dc599adc4f742d7d8e - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/bnb/0xbb73bb2505ac4643d5c0a99c2a1f34b3dfd09d11 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/bnb/0x4ea98c1999575aaadfb38237dd015c5e773f75a2 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/celo/0x1d18d0386f51ab03e7e84e71bda1681eba865f1f - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x57b96d4af698605563a4653d882635da59bf11af - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xd33526068d116ce69f19a9ee46f0bd304f21a51f - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x2a5fa016ffb20c70e2ef36058c08547f344677aa - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xbe0ed4138121ecfc5c0e56b40517da27e6c5226b - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x9fd9278f04f01c6a39a9d1c1cd79f7782c6ade08 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x054c9d4c6f4ea4e14391addd1812106c97d05690 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x7613c48e0cd50e42dd9bf0f6c235063145f6f8dc - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x614da3b37b6f66f7ce69b4bbbcf9a55ce6168707 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x069e4aa272d17d9625aa3b6f863c7ef6cfb96713 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x24da31e7bb182cb2cabfef1d88db19c2ae1f5572 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x7d4a23832fad83258b32ce4fd3109ceef4332af4 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xb58e61c3098d85632df34eecfb899a1ed80921cb - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x67c4d14861f9c975d004cfb3ac305bee673e996e - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x69babe9811cc86dcfc3b8f9a14de6470dd18eda4 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x32f0d04b48427a14fb3cbc73db869e691a9fec6f - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x4cff49d0a19ed6ff845a9122fa912abcfb1f68a6 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x51cb253744189f11241becb29bedd3f1b5384fdb - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xcf4c91ecafc43c9f382db723ba20b82efa852821 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x6968676661ac9851c38907bdfcc22d5dd77b564d - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x0d438f3b5175bebc262bf23753c1e53d03432bde - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xb98d4c97425d9908e66e53a6fdf673acca0be986 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x68a47fe1cf42eba4a030a10cd4d6a1031ca3ca0a - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x8a370c951f34e295b2655b47bb0985dd08d8f718 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x525574c899a7c877a11865339e57376092168258 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xd9a442856c234a39a81a089c06451ebaa4306a72 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0x1c43d05be7e5b54d506e3ddb6f0305e8a66cd04e - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0xb766039cc6db368759c1e56b79affe831d0cc507 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0x18c14c2d707b2212e17d1579789fc06010cfca23 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0xe0ee18eacafddaeb38f8907c74347c44385578ab - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0x56659245931cb6920e39c189d2a0e7dd0da2d57b - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/polygon/0xb6a5ae40e79891e4deadad06c8a7ca47396df21c - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/polygon/0x04565fe9aa3ae571ada8e1bebf8282c4e5247b2a - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xf8a99f2bf2ce5bb6ce4aafcf070d8723bc904aa2 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x3b9728bd65ca2c11a817ce39a6e91808cceef6fd - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x6797b6244fa75f2e78cdffc3a4eb169332b730cc - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xe2c86869216ac578bd62a4b8313770d9ee359a05 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x47b464edb8dc9bc67b5cd4c9310bb87b773845bd - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x28a730de97dc62a8c88363e0b1049056f1274a70 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xba5ede8d98ab88cea9f0d69918dde28dc23c2553 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x8319767a7b602f88e376368dca1b92d38869b9b4 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x461ee40928677644b8195662ab91bcdaae6ef105 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x24569d33653c404f90af10a2b98d6e0030d3d267 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x22222bd682745cf032006394750739684e45a5f8 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x9124577428c5bd73ad7636cbc5014081384f29d6 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xaa6cccdce193698d33deb9ffd4be74eaa74c4898 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xe095780ba2a64a4efa7a74830f0b71656f0b0ad4 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xb59c8912c83157a955f9d715e556257f432c35d7 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x7771450ece9c61430953d2646f995e33a06c91f5 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xc48823ec67720a04a9dfd8c7d109b2c3d6622094 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/bnb/0x9ec02756a559700d8d9e79ece56809f7bcc5dc27 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x3593d125a4f7849a1b059e64f4517a86dd60c95d - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xb0ffa8000886e57f86dd5264b9582b2ad87b2b91 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x6985884c4392d348587b19cb9eaaf157f13271cd - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xa045fe936e26e1e1e1fb27c1f2ae3643acde0171 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xbeef698bd78139829e540622d5863e723e8715f1 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x426a688ee72811773eb64f5717a32981b56f10c1 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x873259322be8e50d80a4b868d186cc5ab148543a - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x661c70333aa1850ccdbae82776bb436a0fcfeefb - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x0a2c375553e6965b42c135bb8b15a8914b08de0c - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x6fba952443be1de22232c824eb8d976b426b3c38 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x1abaea1f7c830bd89acc67ec4af516284b1bc33c - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xb62132e35a6c13ee1ee0f84dc5d40bad8d815206 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xb60fdf036f2ad584f79525b5da76c5c531283a1b - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x5a3e6a77ba2f983ec0d371ea3b475f8bc0811ad5 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x55296f69f40ea6d20e478533c15a6b08b654e758 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x1a7e4e63778b4f12a199c062f3efdd288afcbce8 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x45804880de22913dafe09f4980848ece6ecbaf78 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xe5018913f2fdf33971864804ddb5fca25c539032 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0x6985884c4392d348587b19cb9eaaf157f13271cd - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0x2c650dab03a59332e2e0c0c4a7f726913e5028c1 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0x9aee3c99934c88832399d6c6e08ad802112ebeab - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0x439c0cf1038f8002a4cad489b427e217ba4b42ad - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/optimism/0x6985884c4392d348587b19cb9eaaf157f13271cd - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/polygon/0x6985884c4392d348587b19cb9eaaf157f13271cd - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x6985884c4392d348587b19cb9eaaf157f13271cd - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xb79dd08ea68a908a97220c76d19a6aa9cbde4376 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x4b61e2f1bbdee6d746209a693156952936f1702c - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x7480527815ccae421400da01e052b120cc4255e9 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x7466de7bb8b5e41ee572f4167de6be782a7fa75d - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x298d411511a05dc1b559ed8f79c56bee06687b14 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x8e16d46cb2da01cdd49601ec73d7b0344969ae33 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x18dd5b087bca9920562aff7a0199b96b9230438b - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x37f0c2915cecc7e977183b8543fc0864d03e064c - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x37f24b26bcefbfac7f261b97f8036da98f81a299 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xacb5b33ce55ba7729e38b2b59677e71c0112f0d9 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/bnb/0x6985884c4392d348587b19cb9eaaf157f13271cd - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/bnb/0xc71b5f631354be6853efe9c3ab6b9590f8302e81 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x7e744bbb1a49a44dfcc795014a4ba618e418fbbe - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x4e3fbd56cd56c3e72c1403e103b45db9da5b9d2b - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x0c04ff41b11065eed8c9eda4d461ba6611591395 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x636bd98fc13908e475f56d8a38a6e03616ec5563 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x590246bfbf89b113d8ac36faeea12b7589f7fe5b - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x80034f803afb1c6864e3ca481ef1362c54d094b9 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x73fbd93bfda83b111ddc092aa3a4ca77fd30d380 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xff33a6b3dc0127862eedd3978609404b22298a54 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xc770eefad204b5180df6a14ee197d99d808ee52d - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xa0385e7283c83e2871e9af49eec0966088421ddd - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xb2617246d0c6c0087f18703d576831899ca94f01 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xba386a4ca26b85fd057ab1ef86e3dc7bdeb5ce70 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x9ebb0895bd9c7c9dfab0d8d877c66ba613ac98ea - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xd12a99dbc40036cec6f1b776dccd2d36f5953b94 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x8ab2ff0116a279a99950c66a12298962d152b83c - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x420698cfdeddea6bc78d59bc17798113ad278f9d - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xa8c8cfb141a3bb59fea1e2ea6b79b5ecbcd7b6ca - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xd8e8438cf7beed13cfabc82f300fb6573962c9e3 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xb1c9d42fa4ba691efe21656a7e6953d999b990c4 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0xdadeca1167fe47499e53eb50f261103630974905 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0xa05245ade25cc1063ee50cf7c083b4524c1c4302 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/polygon/0x4fafad147c8cd0e52f83830484d164e960bdc6c3 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x4dd9077269dd08899f2a9e73507125962b5bc87f - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x8931ee05ec111325c1700b68e5ef7b887e00661d - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x26f1bb40ea88b46ceb21557dc0ffac7b7c0ad40f - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x642e993fa91ffe9fb24d39a8eb0e0663145f8e92 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x0c41f1fc9022feb69af6dc666abfe73c9ffda7ce - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xf7ccb8a6e3400eb8eb0c47619134f7516e025215 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x2416092f143378750bb29b79ed961ab195cceea5 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xf0268c5f9aa95baf5c25d646aabb900ac12f0800 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x0c067fc190cde145b0c537765a78d4e19873a5cc - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xbe5614875952b1683cb0a2c20e6509be46d353a4 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x87a0233a8cb4392ec3eb8fa467817fc0b6a326dd - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xdfbea88c4842d30c26669602888d746d30f9d60d - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xb6fe221fe9eef5aba221c348ba20a1bf5e73624c - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x80b3455e1db60b4cba46aba12e8b1e256dd64979 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/bnb/0x747747e47a48c669be384e0dfb248eee6ba04039 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/celo/0x50e85c754929840b58614f48e29c64bc78c58345 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x02f92800f57bcd74066f5709f1daa1a4302df875 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x967da4048cd07ab37855c090aaf366e4ce1b9f48 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x729031b3995538ddf6b6bce6e68d5d6fdeb3ccb5 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x6dea81c8171d0ba574754ef6f8b412f2ed88c54d - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x97a9a15168c22b3c137e6381037e1499c8ad0978 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x5faa989af96af85384b8a938c2ede4a7378d9875 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x4691937a7508860f876c9c0a2a617e7d9e945d4b - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xb50721bcf8d664c30412cfbc6cf7a15145234ad1 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x037a54aab062628c9bbae1fdb1583c195585fe41 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0xcb8b5cd20bdcaea9a010ac1f8d835824f5c87a04 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0xdfb8be6f8c87f74295a87de951974362cedcfa30 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0x354a6da3fcde098f8389cad84b0182725c6c91de - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0x3f56e0c36d275367b8c502090edf38289b3dea0d - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0x6f9590958ce2beaf9c92a3a8fca6d1ddf310e052 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/optimism/0x3e5d9d8a63cc8a88748f229999cf59487e90721e - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/optimism/0xecc68d0451e20292406967fe7c04280e5238ac7d - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/polygon/0xf1c1a3c2481a3a8a3f173a9ab5ade275292a6fa3 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/polygon/0xb5e0cfe1b4db501ac003b740665bf43192cc7853 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/polygon/0xffa188493c15dfaf2c206c97d8633377847b6a52 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/polygon/0xb5c064f955d8e7f38fe0460c556a72987494ee17 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/polygon/0x4f604735c1cf31399c6e711d5962b2b3e0225ad3 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/polygon/0xf0949dd87d2531d665010d6274f06a357669457a - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/polygon/0x14e5386f47466a463f85d151653e1736c0c50fc3 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/polygon/0xadac33f543267c4d59a8c299cf804c303bc3e4ac - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xcfa3ef56d303ae4faaba0592388f19d7c3399fb4 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x67ce18961c3269ca03c2e5632f1938cc53e614a1 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x48164ea5df090e80a0eaee1147e466ea28669221 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x3054e8f8fba3055a42e5f5228a2a4e2ab1326933 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x42069d11a2cc72388a2e06210921e839cfbd3280 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x74ff3cbf86f95fea386f79633d7bc4460d415f34 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x2d6a3893966dda77749cc7e4003ab15f5cfa3cc1 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x51b75da3da2e413ea1b8ed3eb078dc712304761c - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x8ad5b9007556749de59e088c88801a3aaa87134b - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xbd97693278f1948c59f65f130fd87e7ff7c61d11 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x3992b27da26848c2b19cea6fd25ad5568b68ab98 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/bnb/0x34980c35353a8d7b1a1ba02e02e387a8383e004a - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/bnb/0xdebd6e2da378784a69dc6ec99fe254223b312287 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/celo/0x456a3d042c0dbd3db53d5489e98dfb038553b0d0 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/celo/0x9995cc8f20db5896943afc8ee0ba463259c931ed - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x30d20208d987713f46dfd34ef128bb16c404d10f - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x19848077f45356b21164c412eff3d3e4ff6ebc31 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x53206bf5b6b8872c1bb0b3c533e06fde2f7e22e4 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x07ddacf367f0d40bd68b4b80b4709a37bdc9f847 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xbdbe9f26918918bd3f43a0219d54e5fda9ce1bb3 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xb9d09bc374577dac1ab853de412a903408204ea8 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xe72b141df173b999ae7c1adcbf60cc9833ce56a8 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x214549b0317564de15770561221433fb3e8c995c - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xc82e3db60a52cf7529253b4ec688f631aad9e7c2 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xf3dcbc6d72a4e1892f7917b7c43b74131df8480e - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x62e3b3c557c792c4a70765b3cdb5b56b1879f82d - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x2598c30330d5771ae9f983979209486ae26de875 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xd4f4d0a10bcae123bb6655e8fe93a30d01eebd04 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0xa0995d43901551601060447f9abf93ebc277cec2 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/polygon/0x40379a439d4f6795b6fc9aa5687db461677a2dba - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/polygon/0x433cde5a82b5e0658da3543b47a375dffd126eb6 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x619c4bbbd65f836b78b36cbe781513861d57f39d - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x1e0bb24ed6c806c01ef2f880a4b91adb90099ea7 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x0dd7913197bfb6d2b1f03f9772ced06298f1a644 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xfbb75a59193a3525a8825bebe7d4b56899e2f7e1 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xc3de830ea07524a0761646a6a4e4be0e114a3c83 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x3792dbdd07e87413247df995e692806aa13d3299 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/bnb/0x527856315a4bcd2f428ea7fa05ea251f7e96a50a - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x292fcdd1b104de5a00250febba9bc6a5092a0076 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xd749b369d361396286f8cc28a99dd3425ac05619 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xfe3e6a25e6b192a42a44ecddcd13796471735acf - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xa1faa113cbe53436df28ff0aee54275c13b40975 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x8802269d1283cdb2a5a329649e5cb4cdcee91ab6 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x0000bdaa645097ef80f9d475f341d0d107a45b3a - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x683a4ac99e65200921f556a19dadf4b0214b5938 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x36c7188d64c44301272db3293899507eabb8ed43 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x8a2279d4a90b6fe1c4b30fa660cc9f926797baa2 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xf418588522d5dd018b425e472991e52ebbeeeeee - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x6135177a17e02658df99a07a2841464deb5b8589 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xcf91b70017eabde82c9671e30e5502d312ea6eb2 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x45080a6531d671ddff20db42f93792a489685e32 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x790814cd782983fab4d7b92cf155187a865d9f18 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x9e6be44cc1236eef7e1f197418592d363bedcd5a - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xaa7a9ca87d3694b5755f213b5d04094b8d0f0a6f - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x69ee720c120ec7c9c52a625c04414459b3185f23 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x408e41876cccdc0f92210600ef50372656052a38 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x5cf04716ba20127f1e2297addcf4b5035000c9eb - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x8290333cef9e6d528dd5618fb97a76f268f3edd4 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x1929761e87667283f087ea9ab8370c174681b4e9 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x888888848b652b3e3a0f34c96e00eec0f3a23f72 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xf944e35f95e819e752f3ccb5faf40957d311e8c5 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x1f70300bce8c2302780bd0a153ebb75b8ca7efcb - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0x3de81ce90f5a27c5e6a5adb04b54aba488a6d14e - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0xc87b37a581ec3257b734886d9d3a581f5a9d056c - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0x1a6b3a62391eccaaa992ade44cd4afe6bec8cff1 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0x65c936f008bc34fe819bce9fa5afd9dc2d49977f - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0x07d65c18cecba423298c0aeb5d2beded4dfd5736 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0x51fc0f6660482ea73330e414efd7808811a57fa2 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0xcbe94d75ec713b7ead84f55620dc3174beeb1cfe - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/polygon/0xd3144ff5f388d36c0a445686c08540296d8b209b - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/polygon/0x433e39ce74aef8f409182541269e417ad9b56011 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xb1a03eda10342529bbf8eb700a06c60441fef25d - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x6b9bb36519538e0c073894e964e90172e1c0b41f - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x689644b86075ed61c647596862c7403e1c474dbf - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x9a6d24c02ec35ad970287ee8296d4d6552a31dbe - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x506beb7965fc7053059006c7ab4c62c02c2d989f - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x31b28012f61fc3600e1c076bafc9fd997fb2da90 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xd7d919ea0c33a97ad6e7bd4f510498e2ec98cb78 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xef553b6914dbd17567393f7e55fbd773fff7d0cb - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xe642657e4f43e6dcf0bd73ef24008394574dee28 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xf8b1b47aa748f5c7b5d0e80c726a843913eb573a - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xd064c53f043d5aee2ac9503b13ee012bf2def1d0 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xfc60aa1ffca50ce08b3cdec9626c0bb9e9b09bec - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x82c8f48ac694841360de84d649a0d48d239b61f8 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x7d89e05c0b93b24b5cb23a073e60d008fed1acf9 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x7546e0d4d947a15f914e33de6616ffed826f45ef - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/bnb/0x9a5350edf28c1f93bb36d6e94b5c425fde8e222d - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/bnb/0xaa076b62efc6f357882e07665157a271ab46a063 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x6a6aa13393b7d1100c00a57c76c39e8b6c835041 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x07040971246a73ebda9cf29ea1306bb47c7c4e76 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x6df0e641fc9847c0c6fde39be6253045440c14d3 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x2b640a99991dea2916205ecdc9f9c58f80017ed8 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x38e4adb44ef08f22f5b5b76a8f0c2d0dcbe7dca1 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x42069cc15f5befb510430d22ff1c9a1b3ae22cfe - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x40d16fc0246ad3160ccc09b8d0d3a2cd28ae6c2f - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x89fd2d8fd8d937f55c89b7da3ceed44fa27e4a81 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x76bc677d444f1e9d57daf5187ee2b7dc852745ae - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xa0084063ea01d5f09e56ef3ff6232a9e18b0bacd - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x4abd5745f326932b1b673bfa592a20d7bb6bc455 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xe53ec727dbdeb9e2d5456c3be40cff031ab40a55 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xf43f21384d03b5cbbddd58d2de64071e4ce76ab0 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x33349b282065b0284d756f0577fb39c158f935e6 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0x33c88d4cac6ac34f77020915a2a88cd0417dc069 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0xdce765f021410b3266aa0053c93cb4535f1e12e0 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0xb50a8e92cb9782c9b8f3c88e4ee8a1d0aa2221d7 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0x0a84edf70f30325151631ce7a61307d1f4d619a3 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0xc11158c5da9db1d553ed28f0c2ba1cbedd42cfcb - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/optimism/0xb0b195aefa3650a6908f15cdac7d92f8a5791b0b - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/polygon/0xdc4f4ed9872571d5ec8986a502a0d88f3a175f1e - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x9beec80e62aa257ced8b0edd8692f79ee8783777 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xf95e1c0a67492720ca22842122fe7fa63d5519e5 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xca8e8d244f0d219a6fc9e4793c635cea98d0399c - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x6a4f69da1e2fb2a9b11d1aad60d03163fe567732 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x0718f45bbf4781ce891e4e18182f025725f0fc95 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x132bbda4a40d4d6288be49b637ec2c113b5d7600 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x9aaae745cf2830fb8ddc6248b17436dc3a5e701c - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x24fcfc492c1393274b6bcd568ac9e225bec93584 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/bnb/0x21fd16cd0ef24a49d28429921e335bb0c1bfadb3 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xa469b7ee9ee773642b3e93e842e5d9b5baa10067 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x8c19f7854b27758ddffdcdc8908f22bf55e00736 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/polygon/0xf2ae0038696774d65e67892c9d301c5f2cbbda58 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x6bc40d4099f9057b23af309c08d935b890d7adc0 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xee2a03aa6dacf51c18679c516ad5283d8e7c2637 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x7f911119435d8ded9f018194b4b6661331379a3d - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x777be1c6075c20184c4fd76344b7b0b7c858fe6b - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x812ba41e071c7b7fa4ebcfb62df5f45f6fa853ee - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x881d4c8618d68872fa404518b2460ea839a02a6a - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xba2ae4e0a9c6ecaf172015aa2cdd70a21f5a290b - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x1caf237d7a2d103e3e9b1855988c01ac10344600 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x7d4a7be025652995364e0e232063abd9e8d65e6e - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x620aa20875ec1144126ea47fb27ecfe6e10d0c56 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xfae103dc9cf190ed75350761e95403b7b8afa6c0 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xae7ab96520de3a18e5e111b5eaab095312d7fe84 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x04c154b66cb340f3ae24111cc767e0184ed00cc6 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x70e8de73ce538da2beed35d14187f6959a8eca96 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xfb7b4564402e5500db5bb6d63ae671302777c75a - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x6810e776880c02933d47db1b9fc05908e5386b96 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0x11e969e9b3f89cb16d686a03cd8508c9fc0361af - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0x8b5d1d8b3466ec21f8ee33ce63f319642c026142 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0x3ed03e95dd894235090b3d4a49e0c3239edce59e - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0xb3f13b0c61d65d67d7d6215d70c89533ee567a91 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0xfea31d704deb0975da8e77bf13e04239e70d7c28 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/optimism/0x66e535e8d2ebf13f49f3d49e5c50395a97c137b1 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/polygon/0x9a06db14d639796b25a6cec6a1bf614fd98815ec - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x7fdd7419428955dbf36d4176af5a8f09ad29d1f3 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x8c9037d1ef5c6d1f6816278c7aaf5491d24cd527 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xa9f5031b54c44c3603b4300fde9b8f5cd18ad06f - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x57f5fbd3de65dfc0bd3630f732969e5fb97e6d37 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x9ef1139e6b420cc929dd912a5a7adeced6f12e91 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x120edc8e391ba4c94cb98bb65d8856ae6ec1525f - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xd7ea82d19f1f59ff1ae95f1945ee6e6d86a25b96 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x2c9ab600d71967ff259c491ad51f517886740cbc - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/bnb/0xf4c8e32eadec4bfe97e0f595add0f4450a863a11 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/bnb/0x8c49a510756224e887b3d99d00d959f2d86dda1c - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x7777cec341e7434126864195adef9b05dcc3489c - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x19af07b52e5faa0c2b1e11721c52aa23172fe2f5 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xb7109df1a93f8fe2b8162c6207c9b846c1c68090 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xbbc2ae13b23d715c30720f079fcd9b4a74093505 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x595832f8fc6bf59c85c527fec3740a1b7a361269 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x7316d973b0269863bbfed87302e11334e25ea565 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xa0b73e1ff0b80914ab6fe0444e65848c4c34450b - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x2be8e422cb4a5a7f217a8f1b0658952a79132f28 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x83e6f1e41cdd28eaceb20cb649155049fac3d5aa - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xbabe3ce7835665464228df00b03246115c30730a - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x2e6a60492fb5b58f5b5d08c7cafc75e740e6dc8e - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xc08e7e23c235073c6807c2efe7021304cb7c2815 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x955d5c14c8d4944da1ea7836bd44d54a8ec35ba1 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x3540abe4f288b280a0740ad5121aec337c404d15 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xfe8526a77a2c3590e5973ba81308b90bea21fbff - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x64aa3364f17a4d01c6f1751fd97c2bd3d7e7f1d5 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xd807f7e2818db8eda0d28b5be74866338eaedb86 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0x4186bfc76e2e237523cbc30fd220fe055156b41f - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0xd5d3aa404d7562d09a848f96a8a8d5d65977bf90 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/polygon/0xa3f751662e282e83ec3cbc387d225ca56dd63d3a - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/polygon/0xd24157aa1097486dc9d7cf094a7e15026e566b5d - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/polygon/0xbed0b9240bdbcc8e33f66d2ca650a5ef60a5bab0 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x5d559ea7bb2dae4b694a079cb8328a2145fd32f6 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x97b959385dfdcaf252223838746beb232ac601aa - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x18e692c03de43972fe81058f322fa542ae1a5e2c - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x38029c62dfa30d9fd3cadf4c64e9b2ab21dbda17 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/bnb/0x4507cef57c46789ef8d1a19ea45f4216bae2b528 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/celo/0x73f93dcc49cb8a239e2032663e9475dd5ef29a08 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0x9e523234d36973f9e38642886197d023c88e307e - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x5de758bba013e58dae2693aea3f0b12b31a3023d - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x1001271083c249bd771e1bb76c22d935809a61ee - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x9d39a5de30e57443bff2a8307a4256c8797a3497 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xf3768d6e78e65fc64b8f12ffc824452130bd5394 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xf2ec4a773ef90c58d98ea734c0ebdb538519b988 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x0f2d719407fdbeff09d87557abb7232601fd9f29 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x180000dda70eb7fb7f3e10e52e88ce88f46e3b3a - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xed89fc0f41d8be2c98b13b7e3cd3e876d73f1d30 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x17c50d62e6e8d20d2dc18e9ad79c43263d0720d9 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x3b50805453023a91a8bf641e279401a0b23fa6f9 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xfd03723a9a3abe0562451496a9a394d2c4bad4ab - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xfe67a4450907459c3e1fff623aa927dd4e28c67a - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xc5fb36dd2fb59d3b98deff88425a3f425ee469ed - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0x6b021b3f68491974be6d4009fee61a4e3c708fd6 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0x7ae9ab13fc8945323b778b3f8678145e80ec2efb - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0xbc4c97fb9befaa8b41448e1dfcc5236da543217f - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/optimism/0x93919784c523f39cacaa98ee0a9d96c3f32b593e - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/polygon/0xd55fce7cdab84d84f2ef3f99816d765a2a94a509 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x32e0f9d26d1e33625742a52620cc76c1130efde6 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x9b700b043e9587dde9a0c29a9483e2f8fa450d54 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x0b1594b0e896bf165d925956e0df733b8443af6a - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x891502ba08132653151f822a3a430198f1844115 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xc702b80a1bebac118cab22ce6f2978ef59563b3f - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x1287a235474e0331c0975e373bdd066444d1bd35 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xab36452dbac151be02b16ca17d8919826072f64a - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xcc7ff230365bd730ee4b352cc2492cedac49383e - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/bnb/0xa9b038285f43cd6fe9e16b4c80b4b9bccd3c161b - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x77be1ba1cd2d7a63bffc772d361168cc327dd8bc - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x00000000efe302beaa2b3e6e1b18d08d69a9012a - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xd101dcc414f310268c37eeb4cd376ccfa507f571 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xd09eb9099fac55edcbf4965e0a866779ca365a0c - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x7b0df1cd724ec34ec9bc4bd19749b01afb490761 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x71297312753ea7a2570a5a3278ed70d9a75f4f44 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x9e32b13ce7f2e80a01932b42553652e053d6ed8e - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x6942040b6d25d6207e98f8e26c6101755d67ac89 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x3301ee63fb29f863f2333bd4466acb46cd8323e6 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xfefe157c9d0ae025213092ff9a5cb56ab492bab8 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x44108f0223a3c3028f5fe7aec7f9bb2e66bef82f - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x1121acc14c63f3c872bfca497d10926a6098aac5 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xf1376bcef0f78459c0ed0ba5ddce976f1ddf51f4 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xce722f60f35c37ab295adc4e6ba45bcc7ca89dd6 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x614577036f0a024dbc1c88ba616b394dd65d105a - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0x93fa0b88c0c78e45980fa74cdd87469311b7b3e4 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0xe22c452bd2ade15dfc8ad98286bc6bdf0c9219b7 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0x00000000000451f49c692bfc24971cacea2db678 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0x00000000702749f73e5210b08b0a3d440078f888 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0x86f65121804d2cdbef79f9f072d4e0c2eebabc08 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/polygon/0x127e47aba094a9a87d084a3a93732909ff031419 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x52b492a33e447cdb854c7fc19f1e57e8bfa1777d - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x55027a5b06f4340cc4c82dcc74c90ca93dcb173e - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x32b133add6d99d085ff23f522662b546b70d54a1 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x2ad3d80c917ddbf08acc04277f379e00e4d75395 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xc73dc7ae7a4fa40517aafa941ae1ee436b91a12c - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x9f235d23354857efe6c541db92a9ef1877689bcb - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x0c90c756350fb803a7d5d9f9ee5ac29e77369973 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xac12f930318be4f9d37f602cbf89cd33e99aa9d4 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/bnb/0x1c45366641014069114c78962bdc371f534bc81c - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xc328a59e7321747aebbc49fd28d1b32c1af8d3b2 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x90edf25b14393350f0c1b5b12b6cb3cd3781fb4a - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x590f820444fa3638e022776752c5eef34e2f89a6 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x1fdb29ad49330b07ae5a87483f598aa6b292039e - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x4a220e6096b25eadb88358cb44068a3248254675 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xabd4c63d2616a5201454168269031355f4764337 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x4c1b1302220d7de5c22b495e78b72f2dd2457d45 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0x5d3a1ff2b6bab83b63cd9ad0787074081a52ef34 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0x050c24dbf1eec17babe5fc585f06116a259cc77a - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/polygon/0x57211299bc356319ba5ca36873eb06896173f8bc - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xfde4c96c8593536e31f229ea8f37b2ada2699bb2 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xf9b738c2e7adc4f299c57afd0890b925a5efea6f - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x04c0599ae5a44757c0af6f9ec3b93da8976c150a - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x99b2b1a2adb02b38222adcd057783d7e5d1fcc7d - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xf9569cfb8fd265e91aa478d86ae8c78b8af55df4 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xa3d1a8deb97b111454b294e2324efad13a9d8396 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xd85eff20288ca72ea9eecffb428f89ee5066ca5c - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x13f4196cc779275888440b3000ae533bbbbc3166 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x160452f95612699d1a561a70eeeeede67c6812af - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/bnb/0x5ce12f6d9f2fcaf0b11494a1c39e09eeb16ca7e8 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/bnb/0x6894cde390a3f51155ea41ed24a33a4827d3063d - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x6db6fdb5182053eecec778afec95e0814172a474 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xc0cfbe1602dd586349f60e4681bf4badca584ec9 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x289ff00235d2b98b0145ff5d4435d3e92f9540a6 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xcb76314c2540199f4b844d4ebbc7998c604880ca - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xd7cfdb3cdc33dbeb9e9a4c95b61953cf12a008b3 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xce176825afc335d9759cb4e323ee8b31891de747 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x8f2bf2f59cdf7be4aee71500b9419623202b8636 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x744d70fdbe2ba4cf95131626614a1763df805b9e - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x52e6654aee5d59e13ae30b48f8f5dbeb97f708cd - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0x38f9bf9dce51833ec7f03c9dc218197999999999 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0x7189fb5b6504bbff6a852b13b7b82a3c118fdc27 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/optimism/0x38f9bf9dce51833ec7f03c9dc218197999999999 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/polygon/0x8349314651ede274f8c5fef01aa65ff8da75e57c - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/polygon/0x38f9bf9dce51833ec7f03c9dc218197999999999 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/polygon/0x1adcef5c780d8895ac77e6ee9239b4b3ecb76da2 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x38f9bf9dce51833ec7f03c9dc218197999999999 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x917f39bb33b2483dd19546b1e8d2f09ce481ee44 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x60a3e35cc302bfa44cb288bc5a4f316fdb1adb42 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x8b67f2e56139ca052a7ec49cbcd1aa9c83f2752a - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x029c58a909fbe3d4be85a24f414dda923a3fde0f - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x655a51e6803faf50d4ace80fa501af2f29c856cf - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/bnb/0x9ca5dfa3b0b187d7f53f4ef83ca435a2ec2e4070 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/bnb/0xb68a20b9e9b06fde873897e12ab3372ce48f1a8a - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/bnb/0x0203d275d2a65030889af45ed91d472be3948b92 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xa00453052a36d43a99ac1ca145dfe4a952ca33b8 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x8236a87084f8b84306f72007f36f2618a5634494 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xcbb7c0000ab88b473b1f5afd9ef808440eed33bf - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xbc5ca3c518c8a2930947661237b1b562e34f22b7 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xfd0205066521550d7d7ab19da8f72bb004b4c341 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x880226cbcce551eeafd18c9a9e883c85811b82fc - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xfc21540d6b89667d167d42086e1feb04da3e9b21 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x41d06390b935356b46ad6750bda30148ad2044a4 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x8149745670881d99700078ede5903a1a7bebe262 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xcf01a5c02c9b9dd5bf73a5a56bcdbc9dca483d43 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xae0fe8474cf5b1b412b3e4327a1c535ea12b77b7 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xc98d64da73a6616c42117b582e832812e7b8d57f - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x70c0b83501a3989d4f8a8693581bb7010194abb5 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x80122c6a83c8202ea365233363d3f4837d13e888 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x455e53cbb86018ac2b8092fdcd39d8444affc3f6 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x58aea10748a00d1781d6651f9d78a414ea32ca46 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0x406d59819bc2aef682f4ff2769085c98a264f97b - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/polygon/0xc4ce1d6f5d98d65ee25cf85e9f2e9dcfee6cb5d6 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/polygon/0x94025780a1ab58868d9b2dbbb775f44b32e8e6e5 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/polygon/0xf33687811f3ad0cd6b48dd4b39f9f977bd7165a2 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xcbb7c0000ab88b473b1f5afd9ef808440eed33bf - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xa88594d404727625a9437c3f886c7643872296ae - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x7e72d6410803c40e73806f2a72e3eade5d075cc0 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x31ea904a7eca45122890deb8da3473a2081bc9d1 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x48c6740bcf807d6c47c864faeea15ed4da3910ab - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xc5fecc3a29fb57b5024eec8a2239d4621e111cbe - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/bnb/0x184cff0e719826b966025f93e05d8c8b0a79b3f9 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x0c2e08e459fc43ddd1e2718c122f566473f59665 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x1a3a8cf347b2bf5890d3d6a1b981c4f4432c8661 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x8baf5d75cae25c7df6d1e0d26c52d19ee848301a - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x28561b8a2360f463011c16b6cc0b0cbef8dbbcad - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x0fd10b9899882a6f2fcb5c371e17e70fdee00c38 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x7a58c0be72be218b41c608b7fe7c5bb630736c71 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xddaf27167929cd045a7d97d09a4fa1046ece3d89 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x375e104af98872e5b4fe951919e504a47db1757c - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x5408d3883ec28c2de205064ae9690142b035fed2 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x1bb4afbf2ce0c9ec86e6414ad4ba4d9aab1c0de4 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x7391425ca7cee3ee03e09794b819291a572af83e - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x38e382f74dfb84608f3c1f10187f6bef5951de93 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xbea269038eb75bdab47a9c04d0f5c572d94b93d5 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xf41a7b7c79840775f70a085c1fc5a762bbc6b180 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0x13654df31871b5d01e5fba8e6c21a5d0344820f5 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0x4d840b741bc05fde325d4ec0b4cfcd0cea237e4e - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/polygon/0x49b1be61a8ca3f9a9f178d6550e41e00d9162159 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xf5bc3439f53a45607ccad667abc7daf5a583633f - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x0a953dd9fc813fefaf6015b804c9dfa0624690c0 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/bnb/0x44ec807ce2f4a6f2737a92e985f318d035883e47 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/bnb/0xfb6115445bff7b52feb98650c87f44907e58f802 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/bnb/0x117a123ded97cd125837d9ac19592b77d806fa88 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xd9fcd98c322942075a5c3860693e9f4f03aae07b - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x240cd7b53d364a208ed41f8ced4965d11f571b7a - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xb8d6196d71cdd7d90a053a7769a077772aaac464 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xcbde0453d4e7d748077c1b0ac2216c011dd2f406 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x786f112c9a6bc840cdc07cfd840105efd6ef2d4b - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x0bffdd787c83235f6f0afa0faed42061a4619b7a - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x1c43cd666f22878ee902769fccda61f401814efb - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x1b54a6fa1360bd71a0f28f77a1d6fba215d498c3 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xb528edbef013aff855ac3c50b381f253af13b997 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x888888ae2c4a298efd66d162ffc53b3f2a869888 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x4cd27e18757baa3a4fe7b0ab7db083002637a6c5 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x240d6faf8c3b1a7394e371792a3bf9d28dd65515 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x41b1f9dcd5923c9542b6957b9b72169595acbc5c - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xd1f2586790a5bd6da1e443441df53af6ec213d83 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x8de5b80a0c1b02fe4976851d030b36122dbb8624 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x391cf4b21f557c935c7f670218ef42c21bd8d686 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x8bd35250918ed056304fa8641e083be2c42308bb - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xc3960227e41c3f54e9b399ce216149dea5315c34 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0x59062301fb510f4ea2417b67404cb16d31e604ba - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0x75ec618a817eb0a4a7e44ac3dfc64c963daf921a - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0x7e7a7c916c19a45769f6bdaf91087f93c6c12f78 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0x21ccbc5e7f353ec43b2f5b1fb12c3e9d89d30dca - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/optimism/0x87eee96d50fb761ad85b1c982d28a042169d61b1 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/polygon/0x3c720206bfacb2d16fa3ac0ed87d2048dbc401fc - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/polygon/0x8d60fb5886497851aac8c5195006ecf07647ba0d - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xcb327b99ff831bf8223cced12b1338ff3aa322ff - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xf544251d25f3d243a36b07e7e7962a678f952691 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xa7296cefae8477a81e23230ca5d3a3d6f49d3764 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x051fb509e4a775fabd257611eea1efaed8f91359 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xae2bddbcc932c2d2cf286bad0028c6f5074c77b5 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x1dd2d631c92b1acdfcdd51a0f7145a50130050c4 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xd3c68968137317a57a9babeacc7707ec433548b4 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x7f6f6720a73c0f54f95ab343d7efeb1fa991f4f7 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/bnb/0xf3527ef8de265eaa3716fb312c12847bfba66cef - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/bnb/0x8888888888f004100c0353d657be6300587a6ccd - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/bnb/0xe2a59d5e33c6540e18aaa46bf98917ac3158db0d - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/bnb/0xfa2ad87e35fc8d3c9f57d73c4667a4651ce6ad2f - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xec53bf9167f50cdeb3ae105f56099aaab9061f83 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xb3912b20b3abc78c15e85e13ec0bf334fbb924f7 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x16a3543fa6b32cac3b0a755f64a729e84f89a75c - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xf1c9acdc66974dfb6decb12aa385b9cd01190e38 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x0da2082905583cedfffd4847879d0f1cf3d25c36 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xb0ffa8000886e57f86dd5264b9582b2ad87b2b91 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xec9333e7dadeebf82d290d6cb12e66cc30ce46b0 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x898843fb909e3562c82f2b96f4e3d0693af041df - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xaf05ce8a2cef336006e933c02fc89887f5b3c726 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x13e4b8cffe704d3de6f19e52b201d92c21ec18bd - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xaeb3607ec434454ceb308f5cd540875efb54309a - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x2a3bff78b79a009976eea096a51a948a3dc00e34 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x4298e4ad48be89bf63a6fdc470a4b4fe9ce633b1 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xa117000000f279d81a1d3cc75430faa017fa5a2e - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x339058ca41e17b55b6dd295373c5d3cbe8000cd9 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xa3d4bee77b05d4a0c943877558ce21a763c4fa29 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x362bc847a3a9637d3af6624eec853618a43ed7d2 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xc011a73ee8576fb46f5e1c5751ca3b9fe0af2a6f - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x7a65cb87f596caf31a4932f074c59c0592be77d7 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xa21af1050f7b26e0cff45ee51548254c41ed6b5c - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x284b25d8f199125da962abc9ee6e6b1b6715cae3 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x8fac8031e079f409135766c7d5de29cf22ef897c - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xf280b16ef293d8e534e370794ef26bf312694126 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x69af81e73a73b40adf4f3d4223cd9b1ece623074 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x888c1a341ce9d9ae9c2d2a75a72a7f0d2551a2dc - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x465dbc39f46f9d43c581a5d90a43e4a0f2a6ff2d - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x44e18207b6e98f4a786957954e462ed46b8c95be - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x70c29e99ca32592c0e88bb571b87444bb0e08e33 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x8c7ac134ed985367eadc6f727d79e8295e11435c - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x6aa56e1d98b3805921c170eb4b3fe7d4fda6d89b - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x81db1949d0e888557bc632f7c0f6698b1f8c9106 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x2de1218c31a04e1040fc5501b89e3a58793b3ddf - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x30ae41d5f9988d359c733232c6c693c0e645c77e - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0x1fc01117e196800f416a577350cb1938d10501c2 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0x3212dc0f8c834e4de893532d27cc9b6001684db0 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/optimism/0xd0cf4de352ac8dcce00bd6b93ee73d3cb272edc3 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x75e6b648c91d222b2f6318e8ceeed4b691d5323f - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x2a06a17cbc6d0032cac2c6696da90f29d39a1a29 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x6668d4a6605a27e5ee51eda040581155eddc6666 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x2dc90fa3a0f178ba4bee16cac5d6c9a5a7b4c6cb - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/bnb/0x9c7beba8f6ef6643abd725e45a4e8387ef260649 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/bnb/0x0cf8e180350253271f4b917ccfb0accc4862f262 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x42069026eac8eee0fd9b5f7adfa4f6e6d69a2b39 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x340d2bde5eb28c1eed91b2f790723e3b160613b7 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xec21890967a8ceb3e55a3f79dac4e90673ba3c2e - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x6900f7b42fb4abb615c938db6a26d73a9afbed69 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x4c44a8b7823b80161eb5e6d80c014024752607f2 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x103143acf2e717acf8f021823e86a1dbfe944fb5 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x6969f3a3754ab674b48b7829a8572360e98132ba - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x562e362876c8aee4744fc2c6aac8394c312d215d - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xd0ebfe04adb5ef449ec5874e450810501dc53ed5 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x2597342ff387b63846eb456419590781c4bfcdaf - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x4e6221c07dae8d3460a46fa01779cf17fdd72ad8 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xb612bfc5ce2fb1337bd29f5af24ca85dbb181ce2 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xc0e10854ab40b2e59a5519c481161a090f1162a0 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xa7f4195f10f1a62b102bd683eab131d657a6c6e4 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x7e7ef0ee0305c1c195fcae22fd7b207a813eef86 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0xb6212b633c941e9be168c4b9c2d9e785f1cd42fb - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/optimism/0x139052115f8b1773cf7dcba6a553f922a2e54f69 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/polygon/0x3f94618ad346f34f43e27f0cf46decbb0d396b1b - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xf56b3b3972f2f154555a0b62ff5a22b7b2a3c90b - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xc08cd26474722ce93f4d0c34d16201461c10aa8c - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x080c169cd58122f8e1d36713bf8bcbca45176905 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x50da645f148798f68ef2d7db7c1cb22a6819bb2c - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xea1d649ddc8e2a6e6ee40b89b2997518476cafa5 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/bnb/0xa4080f1778e69467e905b8d6f72f6e441f9e9484 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xb60acd2057067dc9ed8c083f5aa227a244044fd6 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xd0dfca0b404e866dc9a3038bd2a545c6735d9fa9 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x18a8d75f70eaead79b5a55903d036ce337f623a5 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xebb66a88cedd12bfe3a289df6dfee377f2963f12 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x9343e24716659a3551eb10aff9472a2dcad5db2d - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xfa3e941d1f6b7b10ed84a0c211bfa8aee907965e - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x85bea4ee627b795a79583fcede229e198aa57055 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x0c03ce270b4826ec62e7dd007f0b716068639f7b - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x19706c142d33376240e418d6385f05691a5fa8e2 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xb3e41d6e0ea14b43bc5de3c314a408af171b03dd - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x634769eb87542eaf41c0008c05d5d8f5d8bec3a5 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xd3c5bdbc6de5ea3899a28f6cd419f29c09fa749f - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x9dfad1b7102d46b1b197b90095b5c4e9f5845bba - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xc8f69a9b46b235de8d0b77c355fff7994f1b090f - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x5200b34e6a519f289f5258de4554ebd3db12e822 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x69fd9281a920717ee54193a1c130b689ef341933 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x5d56b6581d2e7e7574adce2dc593f499a53d7505 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x168168db04def453b7e8bfaff1e0102a3e810485 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x1f19d846d99a0e75581913b64510fe0e18bbc31f - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x571d9b73dc04ed88b4e273e048c8d4848f83b779 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0xca5ca9083702c56b481d1eec86f1776fdbd2e594 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0x99f40b01ba9c469193b360f72740e416b17ac332 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/optimism/0xc6bdfc4f2e90196738873e824a9efa03f7c64176 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/polygon/0x06480acaae64bcfa6da8fd176f60982584385090 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x0c5142bc58f9a61ab8c3d2085dd2f4e550c5ce0b - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xc734635cd30e882037c3f3de1ebccf9fa9d27d9f - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x65e570b560027f493f2b1907e8e8e3b9546053bd - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xd1917629b3e6a72e6772aab5dbe58eb7fa3c2f33 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x9e81f6495ba29a6b4d48bddd042c0598fa8abc9f - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x2075f6e2147d4ac26036c9b4084f8e28b324397d - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x01aac2b594f7bdbec740f0f1aa22910ebb4b74ab - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/bnb/0xef433ebb8ba7a486ce21b854f093b9a3f4e696bc - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x2bb84fd8f7ed0ffae3da36ad60d4d7840bdeeada - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xad86b91a1d1db15a4cd34d0634bbd4ecacb5b61a - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x4d224452801aced8b2f0aebe155379bb5d594381 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xf63e309818e4ea13782678ce6c31c1234fa61809 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xe0151763455a8a021e64880c238ba1cff3787ff0 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x44ff8620b8ca30902395a7bd3f2407e1a091bf73 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x5640e0560e6afd6a9f4ddb41230d0201d181fea7 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x88ee7a3537667958d040216d9dc1752d1274d838 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x39d5313c3750140e5042887413ba8aa6145a9bd2 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xba2a3dad197d6fee75471215efd5c30c8c854e11 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x3dd77d53f4fa9b3435b3a2ff6bb408771e6800e6 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0xf929de51d91c77e42f5090069e0ad7a09e513c73 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0x74885b4d524d497261259b38900f54e6dbad2210 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/optimism/0xc55e93c62874d8100dbd2dfe307edc1036ad5434 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/polygon/0x9c9e5fd8bbc25984b178fdce6117defa39d2db39 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/polygon/0xaa53b93608c88ee55fad8db4c504fa20e52642ad - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x55cd6469f597452b5a7536e2cd98fde4c1247ee4 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xfe550bffb51eb645ea3b324d772a19ac449e92c5 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x314d7f9e2f55b430ef656fbb98a7635d43a2261e - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x3b54eb78fc8103462f86976b06916fa46078b124 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x1d4731111bd2a50ab3dd5178574e6f3698270ffc - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x7a2c5e7788e55ec0a7ba4aeec5b3da322718fb5e - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x814fe70e85025bec87d4ad3f3b713bdcaac0579b - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x9b69667f602f15ef2d09a9a18489c788e327461e - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x8808434a831efea81170a56a9ddc57cc9e6de1d8 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xe0c8b298db4cffe05d1bea0bb1ba414522b33c1b - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x230ea9aed5d08afdb22cd3c06c47cf24ad501301 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x35d8949372d46b7a3d5a56006ae77b215fc69bc0 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x535887989b9edffb63b1fd5c6b99a4d45443b49a - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x9ee8c380e1926730ad89e91665ff27063b13c90a - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xb8a914a00664e9361eae187468eff94905dfbc15 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xda2e903b0b67f30bf26bd3464f9ee1a383bbbe5f - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0xd6cf874e24a9f5f43075142101a6b13735cdd424 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/polygon/0x8c92e38eca8210f4fcbf17f0951b198dd7668292 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x9a33406165f562e16c3abd82fd1185482e01b49a - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x7f65323e468939073ef3b5287c73f13951b0ff5b - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x5597ce42b315f29e42071d231dcd0158da35b77b - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x0a14ef61afb32e5ca672e021784f71705ac14908 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x0f1cfd0bb452db90a3bfc0848349463010419ab2 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xf3708859c178709d5319ad5405bc81511b72b9e9 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xadf734e8d910d01e6528240898d895af6c22e2de - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x78a087d713be963bf307b18f2ff8122ef9a63ae9 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x4287105ffac106eb98a71cab46586906181e35ff - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xb8e564b206032bbcda2c3978bc371da52152f72e - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x3ecced5b416e58664f04a39dd18935eb71d33b15 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/celo/0x71e26d0e519d14591b9de9a0fe9513a398101490 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/celo/0x105d4a9306d2e55a71d2eb95b81553ae1dc20d7b - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x420110d74c4c3ea14043a09e81fad53e1932f54c - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xd6203889c22d9fe5e938a9200f50fdffe9dd8e02 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x0a6e7ba5042b38349e437ec6db6214aec7b35676 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x6f40d4a6237c257fff2db00fa0510deeecd303eb - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x3b991130eae3cca364406d718da22fa1c3e7c256 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x555907a0b5c32df0feb35401187aed60a9191d74 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x4947b72fed037ade3365da050a9be5c063e605a7 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xe9732d4b1e7d3789004ff029f032ba3034db059c - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x556c3cbdca77a7f21afe15b17e644e0e98e64df4 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x81f8f0bb1cb2a06649e51913a151f0e7ef6fa321 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xe69ccaaaea33ebfe5b76e0dd373cd9a1a31fd410 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x9aab071b4129b083b01cb5a0cb513ce7eca26fa5 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x5ff0d2de4cd862149c6672c99b7edf3b092667a3 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x96a5399d07896f757bd4c6ef56461f58db951862 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0x0d5105ec5bbbf17dba7a87e1aed2c2c15394a9e2 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0x00000000ea00f3f4000e7ed5ed91965b19f1009b - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0x5117f4ad0bc70dbb3b05bf39a1ec1ee40dd67654 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0x4be87c766a7ce11d5cc864b6c3abb7457dcc4cc9 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0x16a500aec6c37f84447ef04e66c57cfc6254cf92 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0x9f6abbf0ba6b5bfa27f4deb6597cc6ec20573fda - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/optimism/0x5465145a47260d5e715733997333a175d97285bb - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/polygon/0x93890f346c5d02c3863a06657bc72555dc72c527 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/polygon/0x1d1498166ddceee616a6d99868e1e0677300056f - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/polygon/0x1d734a02ef1e1f5886e66b0673b71af5b53ffa94 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/polygon/0x4c3bf0a3de9524af68327d1d2558a3b70d17d42a - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x36912b5cf63e509f18e53ac98b3012fa79e77bf5 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x858c50c3af1913b0e849afdb74617388a1a5340d - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x92dc4ab92eb16e781559e612f349916988013d5a - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x548f93779fbc992010c07467cbaf329dd5f059b7 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xd1412d909f67b8db7505ddfcf26cf2303f4b1bb4 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xfb1aaba03c31ea98a3eec7591808acb1947ee7ac - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x9562e2063122eaa4d7c2d786e7ca2610d70ca8b8 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x699ec925118567b6475fe495327ba0a778234aaa - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x37d299d9900209c3566254cfe59bfe6ff8f8c295 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x128f3e482f5bd5f08fe1b216e60ec0a6013deab9 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x554fb3b6c1cf4a3cef49779ced321ca51c667d7d - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x8578a8716013c390b95db73065922f512783e2cf - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xf5809f3348ff40906bb509f936aba43e6d1961ab - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0x11920f139a3121c2836e01551d43f95b3c31159c - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0x45940000009600102a1c002f0097c4a500fa00ab - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0x4debfb9ed639144cf1e401674af361ffffcefb58 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/polygon/0x0cfc9a713a5c17bc8a5ff0379467f6558bacd0e0 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x0fd7a301b51d0a83fcaf6718628174d527b373b6 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x1bc0c42215582d5a085795f4badbac3ff36d1bcb - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x3c4b6cd7874edc945797123fce2d9a871818524b - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x64cb1bafc59bf93aeb90676885c63540cf4f4106 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xe8aae6251c6cf39927b0ff31399030c60bec798f - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x3d1d651761d535df881740ab50ba4bd8a2ec2c00 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x8216e8143902a8fe0b676006bc25eb23829c123d - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/bnb/0xce7de646e7208a4ef112cb6ed5038fa6cc6b12e3 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/bnb/0x947950bcc74888a40ffa2593c5798f11fc9124c4 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/bnb/0x9f9bb3d5af7cc774f9b6adf66e32859b5a998952 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xba41ddf06b7ffd89d1267b5a93bfef2424eb2003 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x7a56e1c57c7475ccf742a1832b028f0456652f97 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x58d97b57bb95320f9a05dc918aef65434969c2b2 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xc785698504a70be37d0e939a4c5326f8eddd5beb - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x4955f6641bf9c8c163604c321f4b36e988698f75 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x473f4068073cd5b2ab0e4cc8e146f9edc6fb52cc - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x16c22a91c705ec3c2d5945dbe2aca37924f1d2ed - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xac1d3d7a8878e655cbb063d58e453540641f4117 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xb72e76ccf005313868db7b48070901a44629da98 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0xa71e2738704e367798baa2755af5a10499634953 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0x8697841b82c71fcbd9e58c15f6de68cd1c63fd02 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0x7dff72693f6a4149b17e7c6314655f6a9f7c8b33 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/optimism/0x650af3c15af43dcb218406d30784416d64cfb6b2 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/optimism/0x3c8b650257cfb5f272f799f5e2b4e65093a11a05 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/polygon/0xe4feab21b42919c5c960ed2b4bdffc521e26881f - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/polygon/0xc3ec80343d2bae2f8e680fdadde7c17e71e114ea - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/polygon/0x9c2c5fd7b07e95ee044ddeba0e97a665f142394f - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x0db510e79909666d6dec7f5e49370838c16d950f - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x599f07567656e6961e20fa6a90685d393808c192 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x4f9fd6be4a90f2620860d680c0d4d5fb53d1a825 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x1185cb5122edad199bdbc0cbd7a0457e448f23c7 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xbaa5cc21fd487b8fcc2f632f3f4e8d37262a0842 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xb488fcb23333e7baa28d1dfd7b69a5d3a8bfeb3a - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x2c8c89c442436cc6c0a77943e09c8daf49da3161 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x91ad1b44913cd1b8241a4ff1e2eaa198da6bf4c9 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xa0a2e84f6f19c09a095d4a83ac8de5a32d303a13 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x1db0c569ebb4a8b57ac01833b9792f526305e062 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x8a638ea79f71f3b91bdc96bbdf9fb27c93013d60 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x731814e491571a2e9ee3c5b1f7f3b962ee8f4870 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x2c002ffec41568d138acc36f5894d6156398d539 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x33d13d537609841ce6c42d6fd775dc33e3833411 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x11d41056ff636107dd710ec4ea772490a710cdb7 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/bnb/0x2859e4544c4bb03966803b044a93563bd2d0dd4d - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x77777feddddffc19ff86db637967013e6c6a116c - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xfd418e42783382e86ae91e445406600ba144d162 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x4f7d2d728ce137dd01ec63ef7b225805c7b54575 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x2e44f3f609ff5aa4819b323fd74690f07c3607c4 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x19e1f2f837a3b90ebd0730cb6111189be0e1b6d6 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xd55210bb6898c021a19de1f58d27b71f095921ee - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x823556202e86763853b40e9cde725f412e294689 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x4d1c297d39c5c1277964d0e3f8aa901493664530 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x864cb5194722d5a1596f4be8b899916d30dad8d8 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0x4a24b101728e07a52053c13fb4db2bcf490cabc3 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0x79ead7a012d97ed8deece279f9bc39e264d7eef9 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/polygon/0xd566c529b33ecf15170f600d4b1ab12468c8efc6 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/polygon/0x3b7e1ce09afe2bb3a23919afb65a38e627cfbe97 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/polygon/0xaa404804ba583c025fa64c9a276a6127ceb355c6 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/polygon/0x1a3acf6d19267e2d3e7f898f42803e90c9219062 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x6b2504a03ca4d43d0d73776f6ad46dab2f2a4cfd - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x98d59767cd1335071a4e9b9d3482685c915131e8 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x354d6890caa31a5e28b6059d46781f40880786a6 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x30121d81f4407474a6d93f5c3060f14aaa098a61 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x5d9c2457a10d455e0ad8e28e40cc28eacf27a06a - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xac27fa800955849d6d17cc8952ba9dd6eaa66187 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xe2b1dc2d4a3b4e59fdf0c47b71a7a86391a8b35a - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xd2699f9fddc04d262a819808f561c153098c2408 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x23a96680ccde03bd4bdd9a3e9a0cb56a5d27f7c9 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x3c5fdf0ee37d62c774025599e3b692d027746e24 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xf31e6d62bfc485857af2186eb3d8ee94b4379fed - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/bnb/0xcf6bb5389c92bdda8a3747ddb454cb7a64626c63 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xcf3c8be2e2c42331da80ef210e9b1b307c03d36a - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x306227d964511a260d14563fbfa82aa75db404b2 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xc00e94cb662c3520282e6f5717214004a7f26888 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x0c4785ee3ca8bf1fb90c772703210bd346aa3413 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xe41d2489571d322189246dafa5ebde1f4699f498 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x7fd4d7737597e7b4ee22acbf8d94362343ae0a79 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x3567aa22cd3ab9aef23d7e18ee0d7cf16974d7e6 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xf107edabf59ba696e38de62ad5327415bd4d4236 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x06450dee7fd2fb8e39061434babcfc05599a6fb8 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x9cf0ed013e67db12ca3af8e7506fe401aa14dad6 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x0bc529c00c6401aef6d220be8c6ea1667f6ad93e - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x33333333fede34409fb7f67c6585047e1f653333 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0xc760f9782f8cea5b06d862574464729537159966 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0x1b7ad346b6ff2d196daa8e78aed86baa6d7e3b02 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/optimism/0xff733b2a3557a7ed6697007ab5d11b79fdd1b76b - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/polygon/0x05f52cc483c50c2a7e25a13dac17d736fa50f259 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/polygon/0xafb755c5f2ea2aadbae693d3bf2dc2c35158dc04 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/polygon/0x101a023270368c0d50bffb62780f4afd4ea79c35 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/polygon/0x3562ddf1f5ce2c02ef109e9d5a72e2fdb702711d - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x20d704099b62ada091028bcfc44445041ed16f09 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x161e113b8e9bbaefb846f73f31624f6f9607bd44 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xa6f774051dfb6b54869227fda2df9cb46f296c09 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x50ce4129ca261ccde4eb100c170843c2936bc11b - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xbdf317f9c153246c429f23f4093087164b145390 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x08c81699f9a357a9f0d04a09b353576ca328d60d - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xb33ff54b9f7242ef1593d2c9bcd8f9df46c77935 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x589864a9892b1a736ae70a91824ab4dc591fd8cd - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xd98832e8a59156acbee4744b9a94a9989a728f36 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x478e03d45716dda94f6dbc15a633b0d90c237e2f - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x2676e4e0e2eb58d9bdb5078358ff8a3a964cedf5 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x1c4cca7c5db003824208adda61bd749e55f463a3 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x749e5334752466cda899b302ed4176b8573dc877 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x63cb9a22cbc00bf9159429e9dede4b88c3dba8ce - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x2f20cf3466f80a5f7f532fca553c8cbc9727fef6 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x2c24497d4086490e7ead87cc12597fb50c2e6ed6 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x4f81837c2f4a189a0b69370027cc2627d93785b4 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x252d223d0550bc6c137b003d90bc74f5341a2818 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/bnb/0x72ff5742319ef07061836f5c924ac6d72c919080 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/bnb/0x2ab0e9e4ee70fff1fb9d67031e44f6410170d00e - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/bnb/0x8c907e0a72c3d55627e853f4ec6a96b0c8771145 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/bnb/0xc748673057861a797275cd8a068abb95a902e8de - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/bnb/0x62d7c4e3566f7f4033fc8e01b4d8e9bbc01c0760 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x109ba5f0230b7b39e4a8ab56e7361db89fa0e108 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x82a605d6d9114f4ad6d5ee461027477eeed31e34 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x0bb217e40f8a5cb79adf04e1aab60e5abd0dfc1e - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xf411903cbc70a74d22900a5de66a2dda66507255 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xdd3b11ef34cd511a2da159034a05fcb94d806686 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x4ec1b60b96193a64acae44778e51f7bff2007831 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x78965b1c638a7ff408d1697a96d7b8e47bb7c75f - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x60222751504796934bddee8218f9725f0c95d2c1 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x1ccb4b14a11e0f2994a7ecbbd4cc69632f4c7c76 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xc7dcca0a3e69bd762c8db257f868f76be36c8514 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x9cdf242ef7975d8c68d5c1f5b6905801699b1940 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xadd39272e83895e7d3f244f696b7a25635f34234 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x0000000000c5dc95539589fbd24be07c6c14eca4 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xcab254f1a32343f11ab41fbde90ecb410cde348a - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x95ed629b028cf6aadd1408bb988c6d1daabe4767 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xa6c0c097741d55ecd9a3a7def3a8253fd022ceb9 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xd888a5460fffa4b14340dd9fe2710cbabd520659 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x683989afc948477fd38567f8327f501562c955ac - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x946fb08103b400d1c79e07acccdef5cfd26cd374 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x7076de6ff1d91e00be7e92458089c833de99e22e - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xadf7c35560035944e805d98ff17d58cde2449389 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x62b9c7356a2dc64a1969e19c23e4f579f9810aa7 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xd19b72e027cd66bde41d8f60a13740a26c4be8f3 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x66a1e37c9b0eaddca17d3662d6c05f4decf3e110 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xf477ac7719e2e659001455cdda0cc8f3ad10b604 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0xe16e2548a576ad448fb014bbe85284d7f3542df5 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0x330bd769382cfc6d50175903434ccc8d206dcae5 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0xb08d8becab1bf76a9ce3d2d5fa946f65ec1d3e83 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/optimism/0x8b21e9b7daf2c4325bf3d18c1beb79a347fe902a - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/polygon/0xd9a9b4d466747e1ebcb7aeb42784452f40452367 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/polygon/0x306fd3e7b169aa4ee19412323e1a5995b8c1a1f4 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/polygon/0x9cb74c8032b007466865f060ad2c46145d45553d - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x333333c465a19c85f85c6cfbed7b16b0b26e3333 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xb9a5f238dc61eebe820060226c8143cd24624771 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xc48cddc6f2650bdb13dcf6681f61ba07209b5299 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xfb42da273158b0f642f59f2ba7cc1d5457481677 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x6f35720b272bf23832852b13ae9888c706e1a379 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x4498cd8ba045e00673402353f5a4347562707e7d - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x1035ae3f87a91084c6c5084d0615cc6121c5e228 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x3639e6f4c224ebd1bf6373c3d97917d33e0492bb - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x8bfac1b375bf2894d6f12fb2eb48b1c1a7916789 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xd27c288fd69f228e0c02f79e5ecadff962e05a2b - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x62ff28a01abd2484adb18c61f78f30fb2e4a6fdb - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x315b8c9a1123c10228d469551033440441b41f0b - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x1d008f50fb828ef9debbbeae1b71fffe929bf317 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xeec468333ccc16d4bf1cef497a56cf8c0aae4ca3 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x20dd04c17afd5c9a8b3f2cdacaa8ee7907385bef - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x25e0a7767d03461eaf88b47cd9853722fe05dfd3 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x22af33fe49fd1fa80c7149773dde5890d3c76f3b - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xbc1852f8940991d91bd2b09a5abb5e7b8092a16c - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x06a63c498ef95ad1fa4fff841955e512b4b2198a - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xeb6d78148f001f3aa2f588997c5e102e489ad341 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xa4dc5a82839a148ff172b5b8ba9d52e681fd2261 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xef22cb48b8483df6152e1423b19df5553bbd818b - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xf83759099dc88f75fc83de854c41e0d9e83ada9b - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x844c03892863b0e3e00e805e41b34527044d5c72 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/bnb/0xc9de725a4be9ab74b136c29d4731d6bebd7122e8 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/bnb/0x59e69094398afbea632f8bd63033bdd2443a3be1 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/bnb/0x15f9eb4b9beafa9db35341c5694c0b6573809808 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x29cbd0510eec0327992cd6006e63f9fa8e7f33b7 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xcb1592591996765ec0efc1f92599a19767ee5ffa - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x26e550ac11b26f78a04489d5f20f24e3559f7dd9 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x50327c6c5a14dcade707abad2e27eb517df87ab5 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xc575bd129848ce06a460a19466c30e1d0328f52c - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x47000a7b27a75d44ffadfe9d0b97fa04d569b323 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x2196b84eace74867b73fb003aff93c11fce1d47a - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xc4441c2be5d8fa8126822b9929ca0b81ea0de38e - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x421b05cf5ce28cb7347e73e2278e84472f0e4a88 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xcdbddbdefb0ee3ef03a89afcd714aa4ef310d567 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xf4308b0263723b121056938c2172868e408079d0 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x8cedb0680531d26e62abdbd0f4c5428b7fdc26d5 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x49fb8ad7578148e17c3ef0c344ce23a66ed372c4 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x40e3d1a4b2c47d9aa61261f5606136ef73e28042 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x60d95823f795f1972dbdbcd886955095e36e04cd - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x761a3557184cbc07b7493da0661c41177b2f97fa - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x64c5cba9a1bfbd2a5faf601d91beff2dcac2c974 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0x02f92800f57bcd74066f5709f1daa1a4302df875 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0x291a50e611035b6562a2374b8b44de70aa8d7896 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0x999faf0af2ff109938eefe6a7bf91ca56f0d07e1 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0x1a5b0aaf478bf1fda7b934c76e7692d722982a6d - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0x680447595e8b7b3aa1b43beb9f6098c79ac2ab3f - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0xc1eb7689147c81ac840d4ff0d298489fc7986d52 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0x60bf4e7cf16ff34513514b968483b54beff42a81 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/optimism/0x5df7abe3c51c01dcf6d1f1f9a0ab4dc3759869b9 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/polygon/0xfe049f59963545bf5469f968e04c9646d6e2c2c5 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xc0041ef357b183448b235a8ea73ce4e4ec8c265f - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x12e377989a87da0f9b9166f0f875c9069eaa776c - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xfc48314ad4ad5bd36a84e8307b86a68a01d95d9c - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x0521aaa7c96e25afee79fdd4f1bb48f008ae4eac - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x7a5f5ccd46ebd7ac30615836d988ca3bd57412b3 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x20ef84969f6d81ff74ae4591c331858b20ad82cd - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x4d70f1058b73198f12a76c193aef5db5dd75babd - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x9239e9f9e325e706ef8b89936ece9d48896abbe3 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xca73ed1815e5915489570014e024b7ebe65de679 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x79dacb99a8698052a9898e81fdf883c29efb93cb - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x2f6c17fa9f9bc3600346ab4e48c0701e1d5962ae - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xba5e66fb16944da22a62ea4fd70ad02008744460 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x2b0772bea2757624287ffc7feb92d03aeae6f12d - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xc841b4ead3f70be99472ffdb88e5c3c7af6a481a - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xf8f97a79a3fa77104fab4814e3ed93899777de0d - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xf0d7cb351589c4b1520bf8d31afc87f7fb839c85 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x511ef9ad5e645e533d15df605b4628e3d0d0ff53 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x625bb9bb04bdca51871ed6d07e2dd9034e914631 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x291a8da3c42b7d7f00349d6f1be3c823a2b3fca4 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xf09034487c84954d49ae04bf6817148ffc2edb83 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x1e2093ab84768948c6176db5ad98c909ce97f368 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x64fcc3a02eeeba05ef701b7eed066c6ebd5d4e51 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xc796e499cc8f599a2a8280825d8bda92f7a895e0 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xbdb0e1c40a76c5113a023d685b419b90b01e3d61 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x76c71f1703fbf19ffdcf3051e1e684cb9934510f - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xc655c331d1aa7f96c252f1f40ce13d80eac53504 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x85645b86243886b7c7c1da6288571f8bea6fc035 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x623cd3a3edf080057892aaf8d773bbb7a5c9b6e9 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xab964f7b7b6391bd6c4e8512ef00d01f255d9c0d - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x6112b8714221bbd96ae0a0032a683e38b475d06c - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xc2eeca228ebac45c339cc5e522dd3a10638155f1 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x018dd3a0dd7f213cc822076b3800816d3ce1ed86 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x446c9033e7516d820cc9a2ce2d0b7328b579406f - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x73a15fed60bf67631dc6cd7bc5b6e8da8190acf5 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x4448726b23483927c492f09c1dbfdffd3967b452 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xeeacc51af745846ddf46012b46c6910ea9b12898 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x25931894a86d47441213199621f1f2994e1c39aa - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x94a8b4ee5cd64c79d0ee816f467ea73009f51aa0 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x1a4e7febd24b6689704b10685857d8b30885f05e - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x8248270620aa532e4d64316017be5e873e37cc09 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xca7af58da871736994ce360f51ec6cd28351a3df - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xca4f53e6117623992126a9a45ce61682fe8678df - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0xcbb7c0000ab88b473b1f5afd9ef808440eed33bf - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0x79bbf4508b1391af3a0f4b30bb5fc4aa9ab0e07c - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/polygon/0xd2a530170d71a9cfe1651fb468e2b98f7ed7456b - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/polygon/0xbf7970d56a150cd0b60bd08388a4a75a27777777 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/polygon/0xb87904db461005fc716a6bf9f2d451c33b10b80b - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/polygon/0x708383ae0e80e75377d664e4d6344404dede119a - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/polygon/0x2c89bbc92bd86f8075d1decc58c7f4e0107f286b - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x288f4eb27400fa220d14b864259ad1b7f77c1594 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x2d57c47bc5d2432feeedf2c9150162a9862d3ccf - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x91da780bc7f4b7cf19abe90411a2a296ec5ff787 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xb89d354ad1b0d95a48b3de4607f75a8cd710c1ba - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x79bbf4508b1391af3a0f4b30bb5fc4aa9ab0e07c - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x6263ad921e11ab47ae85f1daa725b8b3581baed3 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x57edc3f1fd42c0d48230e964b1c5184b9c89b2ed - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xa608512bbc9934e4b1ddecf0f5fb38b6ad93308d - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x9e6a46f294bb67c20f1d1e7afb0bbef614403b55 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x767a739d1a152639e9ea1d8c1bd55fdc5b217d7f - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xfbecd19292b1effeaa7b2e61f5101ddb6744a1fb - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xf04d220b8136e2d3d4be08081dbb565c3c302ffd - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xce1eab31756a48915b7e7bb79c589835aac6242d - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xd1d7aa941c71fd95e9d31bbd81937b3e71bd6231 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x53ae20d42e16626dc41c7842d9ce876358082370 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x5ab3d4c385b400f3abb49e80de2faf6a88a7b691 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xc438b0c0e80a8fa1b36898d1b36a3fc2ec371c54 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xbe35071605277d8be5a52c84a66ab1bc855a758d - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/bnb/0x8899ec96ed8c96b5c86c23c3f069c3def75b6d97 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xa2cd3d43c775978a96bdbf12d733d5a1ed94fb18 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xb6aaa0efdfac186652e3b31a6f07a9a74d1b5a75 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x6b0b3a982b4634ac68dd83a4dbf02311ce324181 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x32f4768fc4a238a58fc9da408d9a0da4333012e4 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0x0721b3c9f19cfef1d622c918dcd431960f35e060 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0x0caadd427a6feb5b5fc1137eb05aa7ddd9c08ce9 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0x77b7787a09818502305c95d68a2571f090abb135 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0x9f07f8a82cb1af1466252e505b7b7ddee103bc91 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0xdb298285fe4c5410b05390ca80e8fbe9de1f259b - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/polygon/0x4cfe63294dac27ce941d42a778a37f2b35fea21b - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/polygon/0xdf7837de1f2fa4631d716cf2502f8b230f1dcc32 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/polygon/0xce899f26928a2b21c6a2fddd393ef37c61dba918 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x21e00ff5374a0b803e0dc13a72800aca95b4b09e - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xe4a7b54c0a30da69c04dc54b89868c185ff382bc - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xf857b2764095b9a5f57c3e71f82f297fe4e45334 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x9c632e6aaa3ea73f91554f8a3cb2ed2f29605e0c - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x097b1b242d3ed90e191c5f83a62f41abe16f6ceb - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x504a26cf29674bc77a9341e73f88ccecc864034c - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x0c1dc73159e30c4b06170f2593d3118968a0dca5 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x42e07fa3d31190731368ca2f88d12d80139dca42 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x3a46ed8fceb6ef1ada2e4600a522ae7e24d2ed18 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x4b361e60cf256b926ba15f157d69cac9cd037426 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xdd3acdbdc7b358df453a6cb6bca56c92aa5743aa - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x78ec15c5fd8efc5e924e9eebb9e549e29c785867 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x164ffdae2fe3891714bc2968f1875ca4fa1079d0 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x98f4779fccb177a6d856dd1dfd78cd15b7cd2af5 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/bnb/0xabe8e5cabe24cb36df9540088fd7ce1175b9bc52 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/bnb/0x80a78a9b6b1272fdb612b39181bf113706024875 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x7da2641000cbb407c329310c461b2cb9c70c3046 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xfeac2eae96899709a43e252b6b92971d32f9c0f9 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x0f51bb10119727a7e5ea3538074fb341f56b09ad - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x15700b564ca08d9439c58ca5053166e8317aa138 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x59a529070fbb61e6d6c91f952ccb7f35c34cf8aa - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x1010107b4757c915bc2f1ecd08c85d1bb0be92e0 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x3845badade8e6dff049820680d1f14bd3903a5d0 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x6f365eb3686ee95bdefbae71f1728d62c0af7ab1 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x85f17cf997934a597031b2e18a9ab6ebd4b9f6a4 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xcc4304a31d09258b0029ea7fe63d032f52e44efe - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x1196c6704789620514fd25632abe15f69a50bc4f - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x7475fa4c36344f1d633964f02564f37162299194 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x543ba622733bc9a7bfadd1d07b6c35ae1f9659d9 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x20fd4c5396f7d9686f9997e0f10991957f7112fc - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x0b3ae50babe7ffa4e1a50569cee6bdefd4ccaee0 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xf1bb41f9ed87e6c7e1f70e921b7b4bee1df7ae9c - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x97ad75064b20fb2b2447fed4fa953bf7f007a706 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xad0d1436dd45dbd6d8e50ac82240b72f52d7ea89 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xa0ef786bf476fe0810408caba05e536ac800ff86 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xb5130f4767ab0acc579f25a76e8f9e977cb3f948 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xbb0e17ef65f82ab018d8edd776e8dd940327b28b - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x8a60e489004ca22d775c5f2c657598278d17d9c2 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x4c1746a800d224393fe2470c70a35717ed4ea5f1 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xf34960d9d60be18cc1d5afc1a6f012a723a28811 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x9be89d2a4cd102d8fecc6bf9da793be995c22541 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x4eddb15a0abfa2c349e8065af9214e942d9a6d36 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0x37a645648df29205c6261289983fb04ecd70b4b3 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0x1cd9a56c8c2ea913c70319a44da75e99255aa46f - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0x6b43732a9ae9f8654d496c0a075aa4aa43057a0b - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0xfea7a6a0b346362bf88a9e4a88416b77a57d6c2a - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0x6d7187220f769bde541ff51dd37ee07416f861d2 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/polygon/0x2f3e306d9f02ee8e8850f9040404918d0b345207 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/polygon/0xecdcb5b88f8e3c15f95c720c51c71c9e2080525d - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xa1832f7f4e534ae557f9b5ab76de54b1873e498b - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x514d8e8099286a13486ef6c525c120f51c239b52 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x4837b18a6d7af6159c8665505b90a2ed393255e0 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x6bfdb6f4e65ead27118592a41eb927cea6956198 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xd7efb00d12c2c13131fd319336fdf952525da2af - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xf1a7000000950c7ad8aff13118bb7ab561a448ee - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x56cfc19d8cbf7d417d370844249be9cb2d2e19a1 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0x65c101e95d7dd475c7966330fa1a803205ff92ab - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0x0c5fa0e07949f941a6c2c29a008252db1527d6ee - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/optimism/0xfdb794692724153d1488ccdbe0c56c252596735f - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/polygon/0xf7e78d9c4c74df889a83c8c8d6d05bf70ff75876 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/polygon/0x8fa62d23fb6359c1e1685dbfa9b63ef27ecdb612 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xf1a7000000950c7ad8aff13118bb7ab561a448ee - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xacfe6019ed1a7dc6f7b508c02d1b04ec88cc21bf - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x9704d2adbc02c085ff526a37ac64872027ac8a50 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x3bf9a2a798c9b122747344da0276d30a267a80dc - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x64baa63f3eedf9661f736d8e4d42c6f8aa0cda71 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/bnb/0xbe0d3526fc797583dada3f30bc390013062a048b - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/bnb/0xf5d8015d625be6f59b8073c8189bd51ba28792e1 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x0ff6ffcfda92c53f615a4a75d982f399c989366b - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x841a3083074b1a40b644bf2ba2491a731b6da277 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xb01dd87b29d187f3e3a4bf6cdaebfb97f3d9ab98 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x667102bd3413bfeaa3dffb48fa8288819e480a88 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x3073f7aaa4db83f95e9fff17424f71d4751a3073 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x32b86b99441480a7e5bd3a26c124ec2373e3f015 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xbf2e353f5db1a01e4e7f051222c666afc81b2574 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x960fce8724aa127184b6d13af41a711755236c77 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x9ea59db651a3c79a8d52a394a49da8e9a214d6ae - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x95987b0cdc7f65d989a30b3b7132a38388c548eb - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0x707f635951193ddafbb40971a0fcaab8a6415160 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0xcafcd85d8ca7ad1e1c6f82f651fa15e33aefd07b - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0xdd1ddd4d978ac0baef4bfa9c7e91853bfce90f11 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/polygon/0x2ab445c24c96db13383bb34678adae50c43b4baa - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/polygon/0xc157ee77518769b8009642f68a8d6a500ff59d53 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x90ec58ef4cc9f37b96de1e203b65bd4e6e79580e - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xd47f3e45b23b7594f5d5e1ccfde63237c60be49e - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xb3b32f9f8827d4634fe7d973fa1034ec9fddb3b3 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xd758916365b361cf833bb9c4c465ecd501ddd984 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xbc7755a153e852cf76cccddb4c2e7c368f6259d8 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xb5130f4767ab0acc579f25a76e8f9e977cb3f948 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x39d5313c3750140e5042887413ba8aa6145a9bd2 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/bnb/0x86bb94ddd16efc8bc58e6b056e8df71d9e666429 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/bnb/0xa4c3497b57c8b6d510f3707a1e9694fd791f45fb - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/bnb/0x1f3af095cda17d63cad238358837321e95fc5915 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/bnb/0x0688977ae5b10075f46519063fd2f03adc052c1f - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xccb365d2e11ae4d6d74715c680f56cf58bf4bf10 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x643c4e15d7d62ad0abec4a9bd4b001aa3ef52d66 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x8e729198d1c59b82bd6bba579310c40d740a11c2 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0xd4fe6e1e37dfcf35e9eeb54d4cca149d1c10239f - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0xaeac3b55c3522157ecda7ec8fcb86c832faa28af - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0x46777c76dbbe40fabb2aab99e33ce20058e76c59 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0xa78d8321b20c4ef90ecd72f2588aa985a4bdb684 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0xaef5bbcbfa438519a5ea80b4c7181b4e78d419f2 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0x82e64f49ed5ec1bc6e43dad4fc8af9bb3a2312ee - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/optimism/0x484c2d6e3cdd945a8b2df735e079178c1036578c - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/optimism/0x46777c76dbbe40fabb2aab99e33ce20058e76c59 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/optimism/0x1e925de1c68ef83bd98ee3e130ef14a50309c01b - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/polygon/0x300211def2a644b036a9bdd3e58159bb2074d388 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x98d0baa52b2d063e780de12f615f963fe8537553 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x67543cf0304c19ca62ac95ba82fd4f4b40788dc1 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x938171227ece879267122a36847b219cbd3b9d47 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x6967f0974d76d34e140cae27efea32cdf546b58e - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x4b12507e171970b3acd48edfeb5bd1c676e61280 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xb4d4ff3fcbd6965962a79229aa94631d394217cb - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xeb476e9ab6b1655860b3f40100678d0c1cedb321 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/bnb/0xd5eaaac47bd1993d661bc087e15dfb079a7f3c19 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/bnb/0x6d5ad1592ed9d6d1df9b93c793ab759573ed6714 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/bnb/0xa18bbdcd86e4178d10ecd9316667cfe4c4aa8717 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/bnb/0xf78d2e7936f5fe18308a3b2951a93b6c4a41f5e2 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x7ff7fa94b8b66ef313f7970d4eebd2cb3103a2c0 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x40e3eddf6d253bb734381a309437428f121c594b - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x56072c95faa701256059aa122697b133aded9279 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x881ba05de1e78f549cc63a8f6cabb1d4ad32250d - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x6c3ea9036406852006290770bedfcaba0e23a0e8 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x6fb3e0a217407efff7ca062d46c26e5d60a14d69 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xd89cc9d79ad3c49e2cd477a8bbc8e63dee53f82e - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0x9d0bfe46891573c12021942c7d28f15ebb641988 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/polygon/0x46777c76dbbe40fabb2aab99e33ce20058e76c59 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x1f1c695f6b4a3f8b05f2492cef9474afb6d6ad69 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x3c8cd0db9a01efa063a7760267b822a129bc7dca - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x060cb087a9730e13aa191f31a6d86bff8dfcdcc0 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xbf1aea8670d2528e08334083616dd9c5f3b087ae - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x9b8df6e244526ab5f6e6400d331db28c8fdddb55 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x4b6104755afb5da4581b81c552da3a25608c73b8 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/bnb/0x12b4356c65340fb02cdff01293f95febb1512f3b - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/bnb/0x08e8ac8c4bca64503f774d2c40c911e8a3ffcc12 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/bnb/0x47a1eb0b825b73e6a14807beaecafef199d5477c - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/bnb/0x103071da56e7cd95b415320760d6a0ddc4da1ca5 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xc43c6bfeda065fe2c4c11765bf838789bd0bb5de - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x5732046a883704404f284ce41ffadd5b007fd668 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x8292bb45bf1ee4d140127049757c2e0ff06317ed - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x2d8ea194902bc55431420bd26be92b0782dce91d - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/polygon/0xd1f9c58e33933a993a3891f8acfe05a68e1afc05 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x17d70172c7c4205bd39ce80f7f0ee660b7dc5a23 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x624e2e7fdc8903165f64891672267ab0fcb98831 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xbf388570ebd5b88bfc7cd21ec469813c15f453a3 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x44551ca46fa5592bb572e20043f7c3d54c85cad7 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x2133031f5acbc493572c02f271186f241cd8d6a5 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xcb6ab91007fe165c81b1e672007361cce9995fd1 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xb4fde59a779991bfb6a52253b51947828b982be3 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x09be1692ca16e06f536f0038ff11d1da8524adb1 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xc0634090f2fe6c6d75e61be2b949464abb498973 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xd51827754a56860f04acd1d2699b049b026a5925 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/bnb/0xa2e3356610840701bdf5611a53974510ae27e2e1 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x944824290cc12f31ae18ef51216a223ba4063092 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x10dea67478c5f8c5e2d90e5e9b26dbe60c54d800 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x2f42b7d686ca3effc69778b6ed8493a7787b4d6e - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xc669928185dbce49d2230cc9b0979be6dc797957 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x5485a469faea1492191cfce7528ab6e58135aa4d - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x8e0e57dcb1ce8d9091df38ec1bfc3b224529754a - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x1151cb3d861920e07a38e03eead12c32178567f6 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x0305f515fa978cf87226cf8a9776d25bcfb2cc0b - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x88800092ff476844f74dc2fc427974bbee2794ae - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xe76c6c83af64e4c60245d8c7de953df673a7a33d - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x90685e300a4c4532efcefe91202dfe1dfd572f47 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xa849eaae994fb86afa73382e9bd88c2b6b18dc71 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xbb2a93afcf5d3af8ae28dd50d6c18556ea532c5a - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xbad6c59d72d44512616f25b3d160c79db5a69ddf - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x4604151d4c98d1eea200b0d6bffb79a2613182aa - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xa93d86af16fe83f064e3c0e2f3d129f7b7b002b0 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x419c4db4b9e25d6db2ad9691ccb832c8d9fda05e - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x004e9c3ef86bc1ca1f0bb5c7662861ee93350568 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x68749665ff8d2d112fa859aa293f07a622782f38 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x4da27a545c0c5b758a6ba100e3a049001de870f5 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/polygon/0x820802fa8a99901f52e39acd21177b0be6ee2974 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x3ec2156d4c0a9cbdab4a016633b7bcf6a8d68ea2 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x937a1cfaf0a3d9f5dc4d0927f72ee5e3e5f82a00 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x2e2cc4dfce60257f091980631e75f5c436b71c87 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x65553f5c85c78b977668cec098ec09475099aa61 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x04175b1f982b8c8444f238ac0aae59f029e21099 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x1c93d155bd388241f9ab5df500d69eb529ce9583 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x45d9c101a3870ca5024582fd788f4e1e8f7971c3 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x1986cc18d8ec757447254310d2604f85741aa732 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xb3621cd34803cf7065dcb0d5bfb0f56c1834a063 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x570b1533f6daa82814b25b62b5c7c4c55eb83947 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x43c5034469bce262d32f64c5e7f9f359f5b1495f - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xbdf43ecadc5cef51b7d1772f722e40596bc1788b - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x80ac24aa929eaf5013f6436cda2a7ba190f5cc0b - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x9813037ee2218799597d83d4a5b6f3b6778218d9 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x88909d489678dd17aa6d9609f89b0419bf78fd9a - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x4274cd7277c7bb0806bd5fe84b9adae466a8da0a - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xa0246c9032bc3a600820415ae600c6388619a14d - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xed04915c23f00a313a544955524eb7dbd823143d - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0xaf7e3f16d747e77e927dc94287f86eb95a64d83d - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x290f057a2c59b95d8027aa4abf31782676502071 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x46777c76dbbe40fabb2aab99e33ce20058e76c59 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x9e12735d77c72c5c3670636d428f2f3815d8a4cb - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x6bb7a212910682dcfdbd5bcbb3e28fb4e8da10ee - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xf2e244d4020c182e8e2c936d4055e3f0e578064f - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xe3cf8dbcbdc9b220ddead0bd6342e245daff934d - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xebcda5b80f62dd4dd2a96357b42bb6facbf30267 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/bnb/0xdc06717f367e57a16e06cce0c4761604460da8fc - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/bnb/0xd5369a3cac0f4448a9a96bb98af9c887c92fc37b - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/bnb/0x3199a64bc8aabdfd9a3937a346cc59c3d81d8a9a - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/bnb/0xff7d6a96ae471bbcd7713af9cb1feeb16cf56b41 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/NATIVE - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/NATIVE - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/bnb/NATIVE - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/polygon/0x0000000000000000000000000000000000001010 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/optimism/NATIVE - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/unichain/NATIVE - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/NATIVE - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x68037790a0229e9ce6eaa8a99ea92964106c4703 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x28d38df637db75533bd3f71426f3410a82041544 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/avalanche/NATIVE - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/avalanche/0xb97ef9ef8734c71904d8002f8b6bc66dd9c48a6e - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/avalanche/0x49d5c2bdffac6ce2bfdb6640f4f80f226bc10bab - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x437cc33344a0b27a429f795ff6b469c72698b291 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x30c7235866872213f68cb1f08c37cb9eccb93452 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xdc035d45d973e3ec169d2276ddab16f1e407384f - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/unichain/0x078d782b760474a361dda0af3839290b0ef57ad6 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/unichain/0x9151434b16b9763660705744891fa906f660ecc5 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xdb99b0477574ac0b2d9c8cec56b42277da3fdb82 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xd769d56f479e9e72a77bb1523e866a33098feec5 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/unichain/0x927b51f251480a681271180da4de28d44ec4afb8 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/unichain/0xc02fe7317d4eb8753a02c35fe019786854a92001 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/unichain/0x7dcc39b4d1c53cb31e1abc0e358b43987fef80f7 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/unichain/0x2416092f143378750bb29b79ed961ab195cceea5 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xfa2b947eec368f42195f24f36d2af29f7c24cec2 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/unichain/0xc3eacf0612346366db554c991d7858716db09f58 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x85e90a5430af45776548adb82ee4cd9e33b08077 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/optimism/0xef4461891dfb3ac8572ccf7c794664a8dd927945 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x0f81001ef0a83ecce5ccebf63eb302c70a39a654 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x1111111111166b7fe7bd91427724b487980afc69 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/unichain/0x8f187aa05619a017077f5308904739877ce9ea21 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/avalanche/0x152b9d0fdc40c096757f570a51e494bd4b943e50 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x5a70be406ce7471a44f0183b8d7091f4ad751db5 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xbc396689893d065f41bc2c6ecbee5e0085233447 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x7eb4db4dddb16a329c5ade17a8a0178331267e28 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/worldchain/NATIVE - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/worldchain/0x79a02482a880bce3f13e09da970dc34db4cd24d1 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xf816507e690f5aa4e29d164885eb5fa7a5627860 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xd3f68c6e8aee820569d58adf8d85d94489315192 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x4d0528598f916fd1d8dc80e5f54a8feedcfd4b18 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/bnb/0xa0c56a8c0692bd10b3fa8f8ba79cf5332b7107f9 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x8d0d000ee44948fc98c9b98a4fa4921476f08b0d - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xecca809227d43b895754382f1fd871628d7e51fb - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/bnb/0x8d0d000ee44948fc98c9b98a4fa4921476f08b0d - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x9cb41fd9dc6891bae8187029461bfaadf6cc0c69 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/worldchain/0x2cfc85d8e48f8eab294be644d9e25c3030863003 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/bnb/0xe6df05ce8c8301223373cf5b969afcb1498c5528 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/unichain/0x0555e30da8f98308edb960aa94c0db47230d2b9c - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x4d4574f50dd8b9dbe623cf329dcc78d76935e610 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x7d6fcb3327d7e17095fa8b0e3513ac7a3564f5e1 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x7300b37dfdfab110d83290a29dfb31b1740219fe - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xbf8566956b4e2d8beb90c4c19dbb8c67a9290c36 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/bnb/0x87d00066cf131ff54b72b134a217d5401e5392b6 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/bnb/0xdac991621fd8048d9f235324780abd6c3ad26421 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/bnb/0xe50e3d1a46070444f44df911359033f2937fcc13 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xa776a95223c500e81cb0937b291140ff550ac3e4 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x4f1aac70b303818ddd0823570af3bb46681d9bd8 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/bnb/0x95034f653d5d161890836ad2b6b8cc49d14e029a - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/bnb/0x3f160760535eb715d5809a26cf55408a2d9844c1 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/bnb/0xde04da55b74435d7b9f2c5c62d9f1b53929b09aa - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/bnb/0x595e21b20e78674f8a64c1566a20b2b316bc3511 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xe6f98920852a360497dbcc8ec895f1bb1f7c8df4 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/bnb/0xd6b48ccf41a62eb3891e58d0f006b19b01d50cca - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x926759a8eaecfadb5d8bdc7a9c7b193c5085f507 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/bnb/0xd86e6ef14b96d942ef0abf0720c549197ea8c528 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/bnb/0x30c60b20c25b2810ca524810467a0c342294fc61 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x6444c6c2d527d85ea97032da9a7504d6d1448ecf - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x0f7dc5d02cc1e1f5ee47854d534d332a1081ccc8 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/bnb/0x3fefe29da25bea166fb5f6ade7b5976d2b0e586b - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/bnb/0xc9ccbd76c2353e593cc975f13295e8289d04d3bb - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/bnb/0x39702843a6733932ec7ce0dde404e5a6dbd8c989 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/bnb/0x4fa7c69a7b69f8bc48233024d546bc299d6b03bf - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xe0cd4cacddcbf4f36e845407ce53e87717b6601d - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xe0b7ad7f8f26e2b00c8b47b5df370f15f90fcf48 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/avalanche/0x9702230a8ea53601f5cd2dc00fdbc13d4df4a8c7 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x6a72d3a87f97a0fee2c2ee4233bdaebc32813d7a - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xe868084cf08f3c3db11f4b73a95473762d9463f7 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/bnb/0xb035723d62e0e2ea7499d76355c9d560f13ba404 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/bnb/0xad8c787992428cd158e451aab109f724b6bc36de - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xc20059e0317de91738d13af027dfc4a50781b066 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/bnb/0xf39e4b21c84e737df08e2c3b32541d856f508e48 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0x30a538effd91acefb1b12ce9bc0074ed18c9dfc9 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x95af4af910c28e8ece4512bfe46f1f33687424ce - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x9ab778f84b2397c7015f7e83d12eee47d4c26694 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x45e02bc2875a2914c4f585bbf92a6f28bc07cb70 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xcab84bc21f9092167fcfe0ea60f5ce053ab39a1e - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x2f299be3b081e8cd47dc56c1932fcae7a91b5dcd - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x5f5668d7c748fc1a17540c3a7f9245d8cea10c29 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xf9902edfca4f49dcaebc335c73aebd82c79c2886 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xc96de26018a54d51c097160568752c4e3bd6c364 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/bnb/0x0e7779e698052f8fe56c415c3818fcf89de9ac6d - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x3e05284ff11a92d66e44b6b3ea70533729670257 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x6b785a0322126826d8226d77e173d75dafb84d11 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x226a2fa2556c48245e57cd1cba4c6c9e67077dd2 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/bnb/0x1d58e204ca59328007469a614522903d69dc0a4c - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xea87148a703adc0de89db2ac2b6b381093ae8ee0 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xcaa1e525acb44aec4e0d17a0e2467aa3ea7ee3a6 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xa4a2e2ca3fbfe21aed83471d28b6f65a233c6e00 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/celo/0xd221812de1bd094f35587ee8e174b07b6167d9af - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x7b10d50b5885be4c7985a88408265c109bd1eec8 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x4a0aaf171446dda0ed95295c46820e2015a28b07 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x00c83aecc790e8a4453e5dd3b0b4b3680501a7a7 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/unichain/0x07f1508a8fe276fb96b9fcf80ace41eb2abddf81 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x6555255b8ded3c538cb398d9e36769f45d7d3ea7 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xc299004a310303d1c0005cb14c70ccc02863924d - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/bnb/0xe3225e11cab122f1a126a28997788e5230838ab9 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x10ee9f68ee4e4d311e854ae14c53f5b25a917f85 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xaccfd598ef801178ed6c816c234b16ec51ae9f32 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/bnb/0x1aecab957bad4c6e36dd29c3d3bb470c4c29768a - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x75231f58b43240c9718dd58b4967c5114342a86c - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/bnb/0x61fac5f038515572d6f42d4bcb6b581642753d50 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xd5c3a723e63a0ecab81081c26c6a3c4b2634bf85 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/bnb/0xf8f331dfa811132c43c308757cd802ca982b7211 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/bnb/0x2c3a8ee94ddd97244a93bc48298f97d2c412f7db - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x642ee4b1f054da33bc6003ad0278f9a27478caf5 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/bnb/0xb994882a1b9bd98a71dd6ea5f61577c42848b0e8 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xda5e1988097297dcdc1f90d4dfe7909e847cbef6 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xdac32deb60c817ee1cd8fc2bb2a7cda2ce1732d0 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/bnb/0xd955c9ba56fb1ab30e34766e252a97ccce3d31a6 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/unichain/0x89824f7609107efe6f8088cd89a620c8edbeed6e - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/bnb/0xa9616e5e23ec1582c2828b025becf3ef610e266f - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/unichain/0xbde8a5331e8ac4831cf8ea9e42e229219eafab97 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/bnb/0x000ae314e2a2172a039b26378814c252734f556a - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xb4c6fedd984bc983b1a758d0875f1ea34f81a6af - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xc50673edb3a7b94e8cad8a7d4e0cd68864e33edf - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x2fd23a21c52fff0535328a7177da1fb31b8a819e - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/unichain/0x15d0e0c55a3e7ee67152ad7e89acf164253ff68d - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x11dc28d01984079b7efe7763b533e6ed9e3722b9 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x1789e0043623282d5dcc7f213d703c6d8bafbb04 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/bnb/0xfa35e2250e376c23955247383dc32c79082e7fcc - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/native - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/native - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/bnb/native - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/unichain/native - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/avalanche/native - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/bnb/0x405fbc9004d857903bfd6b3357792d71a50726b0 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/optimism/native - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/native - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x696f9436b67233384889472cd7cd58a6fb5df4f1 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/worldchain/native - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/bnb/0x8dedf84656fa932157e27c060d8613824e7979e3 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/bnb/0xacf5a368ec5bb9e804c8ac0b508daa5a21c92e13 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0xa64a1b5b0a5ce578a8c6bca10cbe36d83713d170 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/avalanche/0x211cc4dd073734da055fbf44a2b4667d5e5fe5d2 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/arbitrum/0x0a1a1a107e45b7ced86833863f482bc5f4ed82ef - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0x52a8845df664d76c69d2eea607cd793565af42b8 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x9c4315eb7ba91b7bdc1727ad5f76ea4ac8875506 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/solana/AzVCECC5zr21ikYQne4Xtoh3SVg848duPHUHb3M7bonk - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/solana/8avjtjHAHFqp4g2RR9ALAGBpSTqKPZR8nRbzSTwZERA - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/solana/8ZHE4ow1a2jjxuoMfyExuNamQNALv5ekZhsBn5nMDf5e - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/solana/native - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/solana/EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/solana/HUSTLFV3U5Km8u66rMQExh4nLy7unfKHedEXVK1WgSAG - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/solana/3uXACfojUrya7VH51jVC1DCHq3uzK4A7g469Q954LABS - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/solana/4NGbC4RRrUjS78ooSN53Up7gSg4dGrj6F6dxpMWHbonk - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/solana/6p6xgHyF7AeE6TZkSmFsko444wqoP15icUSqi2jfGiPN - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/solana/goodX4LG92UAcRdFRUykfP2fAfzQAVttrToEPxtxSkp - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/solana/7kN5FQMD8ja4bzysEgc5FXmryKd6gCgjiWnhksjHCFb3 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/solana/HeLp6NuQkmYB4pYWo2zYs22mESHXPQYzXbB8n4V98jwC - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/solana/27G8MtK7VtTcCHkpASjSDdkWWYfoqT6ggEuKidVJidD4 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/solana/FViMp5phQH2bX81S7Yyn1yXjj3BRddFBNcMCbTH8FCze - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/solana/QdyjMr627PR7NtWdcEcgFmDm5haBVUWEcj4jdM4boop - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/solana/Dz9mQ9NzkBcCsuGPFJ3r1bS4wgqKMHBPiVuniW8Mbonk - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/solana/cbbtcf3aa214zXHbiAZQwf4122FBYbraNdFqgw4iMij - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/solana/3NZ9JMVBmGAqocybic2c7LQCJScmgsAZ6vQqTDzcqmJh - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/solana/3xypwTgs9nWgjc6nUBiHmMb36t2PwL3SwCZkEQvW8FTX - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xaca92e438df0b2401ff60da7e4337b687a2435da - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/solana/USD1ttGY1N17NEEHLmELoaybftRBUSErhqYiQzvEmuB - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/solana/7vfCXTUXx5WJV5JADk17DUJ4ksgau7utNKj4b963voxs - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/solana/KMNo3nJsBXfcpJTVhZcXLW7RmTwTt4GVFE7suUBo9sS - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/solana/J1toso1uCk3RLmjorhTtrVwY9HJ7X8V9yYac6Y7kGCPn - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/solana/2u1tszSeqZ3qBWF3uNGPFc8TzMk2tdiwknnRMWGWjGWH - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/solana/UwU8RVXB69Y6Dcju6cN2Qef6fykkq6UUNpB15rZku6Z - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/solana/AvZZF1YaZDziPY2RCK4oJrRVrbN3mTD9NL24hPeaZeUj - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/solana/HzwqbKZw8HxMN6bF2yFZNrht3c2iXXzpKcFu7uBEDKtr - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/solana/Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/solana/9tqjeRS1swj36Ee5C1iGiwAxjQJNGAVCzaTLwFY8bonk - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/solana/2b1kV6DkPAnxd5ixfnxCpjxmKwqjjaYmCZfHsFu24GXo - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/solana/mSoLzYCxHdYgdzU16g5QSh3i5K3z3KZK7ytfqcJm7So - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/solana/CASHx9KJUStyftLFWGvEVf59SGeG9sh5FfcnZMVPCASH - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/solana/5oVNBeEEQvYi1cX3ir8Dx5n1P7pdxydbGF2X4TxVusJm - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/solana/76rTxzztXjJe7AUaBi7jQ5J61MFgpQgB4Cc934sWbonk - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xa37f4d2dc3d3c136b68fcf52be3afa09d4dfc38d - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/ethereum/0xfab99fcf605fd8f4593edb70a43ba56542777777 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/base/0x8a910ea80fc09d5b5a2120521a39b67980df0bc4 - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/solana/jupSoLaHXQiZZTSfEWMTRRgpnyFm8f6sZdosWBjx93v - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/solana/Ey59PH7Z4BFU4HjyKnyMdWt5GGN76KazTAwQihoUXRnk - 2025-10-17T22:04:33.647Z - 0.8 - - - https://app.uniswap.org/explore/tokens/solana/CARDSccUMFKoPRZxt5vt3ksUbxEFEcnZ3H2pd3dKxYjp - 2025-10-17T22:04:33.647Z + https://app.uniswap.org/explore/tokens/base/0x290f057a2c59b95d8027aa4abf31782676502071 + 2025-03-20T21:28:30.528Z 0.8 diff --git a/apps/web/scripts/start-anvil.sh b/apps/web/scripts/start-anvil.sh new file mode 100755 index 00000000000..1abc48436c7 --- /dev/null +++ b/apps/web/scripts/start-anvil.sh @@ -0,0 +1,14 @@ +#!/bin/bash +FORK_URL=$1 +PORT=${2:-8545} +EXTRA_FLAGS=${3:-} + +RUST_LOG=debug anvil \ + --print-traces \ + --disable-code-size-limit \ + --disable-min-priority-fee \ + --no-rate-limit \ + --hardfork prague \ + --fork-url "$FORK_URL" \ + --port "$PORT" \ + ${EXTRA_FLAGS} diff --git a/apps/web/src/appGraphql/data/apollo/client.ts b/apps/web/src/appGraphql/data/apollo/client.ts index bbd4eba5d0c..2d129fd1d35 100644 --- a/apps/web/src/appGraphql/data/apollo/client.ts +++ b/apps/web/src/appGraphql/data/apollo/client.ts @@ -1,3 +1,4 @@ +import { getRetryLink } from 'appGraphql/data/apollo/retryLink' import { ApolloClient, from, HttpLink } from '@apollo/client' import { setupSharedApolloCache } from 'uniswap/src/data/cache' import { getDatadogApolloLink } from 'utilities/src/logger/datadog/datadogLink' @@ -9,10 +10,11 @@ if (!API_URL) { const httpLink = new HttpLink({ uri: API_URL }) const datadogLink = getDatadogApolloLink() +const retryLink = getRetryLink() export const apolloClient = new ApolloClient({ connectToDevTools: true, - link: from([datadogLink, httpLink]), + link: from([datadogLink, retryLink, httpLink]), headers: { 'Content-Type': 'application/json', Origin: 'https://app.uniswap.org', diff --git a/apps/web/src/appGraphql/data/apollo/retryLink.ts b/apps/web/src/appGraphql/data/apollo/retryLink.ts new file mode 100644 index 00000000000..3a3400ba187 --- /dev/null +++ b/apps/web/src/appGraphql/data/apollo/retryLink.ts @@ -0,0 +1,43 @@ +import { RetryLink } from '@apollo/client/link/retry' + +/** + * Operations that should retry on network failure. + * These are queries used by useUpdateManualOutage hooks that power the outage banner. + */ +const RETRY_OPERATIONS = new Set([ + // Transaction queries + 'V4TokenTransactions', + 'V3TokenTransactions', + 'V2TokenTransactions', + 'V4Transactions', + 'V3Transactions', + 'V2Transactions', + // Pool queries + 'TopV4Pools', + 'TopV3Pools', + 'TopV2Pairs', +]) + +/** + * Creates an Apollo RetryLink that retries specific operations on network failure. + * Uses exponential backoff with jitter to avoid thundering herd. + */ +export function getRetryLink(): RetryLink { + return new RetryLink({ + delay: { + initial: 1000, + max: 10000, + jitter: true, + }, + attempts: { + max: 3, + retryIf: (error, operation) => { + if (!RETRY_OPERATIONS.has(operation.operationName)) { + return false + } + // Only retry on network errors, not GraphQL errors (validation, auth, etc.) + return !!error?.networkError + }, + }, + }) +} diff --git a/apps/web/src/appGraphql/data/pools/usePoolData.test.ts b/apps/web/src/appGraphql/data/pools/usePoolData.test.ts new file mode 100644 index 00000000000..5c3832377af --- /dev/null +++ b/apps/web/src/appGraphql/data/pools/usePoolData.test.ts @@ -0,0 +1,266 @@ +import { usePoolData } from 'appGraphql/data/pools/usePoolData' +import { FeeAmount } from '@uniswap/v3-sdk' +import { GraphQLApi } from '@universe/api' +import { validBEPoolToken0, validBEPoolToken1 } from 'test-utils/pools/fixtures' +import { renderHook } from 'test-utils/render' +import { V2_DEFAULT_FEE_TIER } from 'uniswap/src/constants/pools' +import { GQL_MAINNET_CHAINS } from 'uniswap/src/features/chains/chainInfo' +import { UniverseChainId } from 'uniswap/src/features/chains/types' + +const { mockV4Query, mockV3Query, mockV2Query, mockUseEnabledChains } = vi.hoisted(() => { + const mockV4Query = vi.fn() + const mockV3Query = vi.fn() + const mockV2Query = vi.fn() + const mockUseEnabledChains = vi.fn() + return { mockV4Query, mockV3Query, mockV2Query, mockUseEnabledChains } +}) + +vi.mock('@universe/api', async () => { + const actual = await vi.importActual('@universe/api') + return { + ...actual, + GraphQLApi: { + ...(actual.GraphQLApi || {}), + useV4PoolQuery: mockV4Query, + useV3PoolQuery: mockV3Query, + useV2PairQuery: mockV2Query, + }, + } +}) + +vi.mock('uniswap/src/features/chains/hooks/useEnabledChains', async () => { + const actual = await vi.importActual('uniswap/src/features/chains/hooks/useEnabledChains') + return { + ...actual, + useEnabledChains: mockUseEnabledChains, + } +}) + +const mockV4PoolData = { + v4Pool: { + poolId: '0xv4pool123', + protocolVersion: GraphQLApi.ProtocolVersion.V4, + feeTier: 500, + isDynamicFee: false, + tickSpacing: 55, + hook: { + id: '0xhook123', + address: '0xhook123', + }, + rewardsCampaign: { + id: 'campaign1', + boostedApr: 5.5, + startTimestamp: 1234567890, + endTimestamp: 1234567990, + }, + token0: validBEPoolToken0, + token0Supply: 100000, + token1: validBEPoolToken1, + token1Supply: 50000, + txCount: 1000, + volume24h: { + value: 500000, + }, + historicalVolume: [ + { value: 100000, timestamp: Date.now() / 1000 - 3600 }, + { value: 200000, timestamp: Date.now() / 1000 - 7200 }, + ], + totalLiquidity: { + value: 1000000, + }, + totalLiquidityPercentChange24h: { + value: 2.5, + }, + }, +} + +const mockV3PoolData = { + v3Pool: { + id: '0xv3pool456', + protocolVersion: GraphQLApi.ProtocolVersion.V3, + address: '0xv3pool456', + feeTier: FeeAmount.MEDIUM, + token0: validBEPoolToken0, + token0Supply: 80000, + token1: validBEPoolToken1, + token1Supply: 40000, + txCount: 800, + volume24h: { + value: 400000, + }, + historicalVolume: [ + { value: 80000, timestamp: Date.now() / 1000 - 3600 }, + { value: 160000, timestamp: Date.now() / 1000 - 7200 }, + ], + totalLiquidity: { + value: 800000, + }, + totalLiquidityPercentChange24h: { + value: 1.8, + }, + }, +} + +const mockV2PairData = { + v2Pair: { + id: '0xv2pair789', + protocolVersion: GraphQLApi.ProtocolVersion.V2, + address: '0xv2pair789', + token0: validBEPoolToken0, + token0Supply: 60000, + token1: validBEPoolToken1, + token1Supply: 30000, + txCount: 600, + volume24h: { + value: 300000, + }, + historicalVolume: [ + { value: 60000, timestamp: Date.now() / 1000 - 3600 }, + { value: 120000, timestamp: Date.now() / 1000 - 7200 }, + ], + totalLiquidity: { + value: 600000, + }, + totalLiquidityPercentChange24h: { + value: 1.2, + }, + }, +} + +describe('usePoolData', () => { + beforeEach(() => { + vi.clearAllMocks() + + mockUseEnabledChains.mockReturnValue({ + isTestnetModeEnabled: false, + defaultChainId: UniverseChainId.Mainnet, + chains: [UniverseChainId.Mainnet], + gqlChains: GQL_MAINNET_CHAINS, + }) + + mockV4Query.mockReturnValue({ loading: false, error: undefined, data: undefined }) + mockV3Query.mockReturnValue({ loading: false, error: undefined, data: undefined }) + mockV2Query.mockReturnValue({ loading: false, error: undefined, data: undefined }) + }) + + it('should return v4 pool data with hook address and rewards campaign', () => { + mockV4Query.mockReturnValue({ + loading: false, + error: undefined, + data: mockV4PoolData, + }) + + const { result } = renderHook(() => + usePoolData({ + poolIdOrAddress: '0xv4pool123', + chainId: UniverseChainId.Mainnet, + isPoolAddress: false, + }), + ) + + expect(result.current.loading).toBe(false) + expect(result.current.error).toBe(false) + expect(result.current.data).toBeDefined() + + expect(result.current.data?.idOrAddress).toBe('0xv4pool123') + expect(result.current.data?.protocolVersion).toBe(GraphQLApi.ProtocolVersion.V4) + expect(result.current.data?.feeTier?.feeAmount).toBe(500) + expect(result.current.data?.feeTier?.tickSpacing).toBe(55) + expect(result.current.data?.feeTier?.isDynamic).toBe(false) + expect(result.current.data?.hookAddress).toBe('0xhook123') + expect(result.current.data?.rewardsCampaign).toEqual({ + id: 'campaign1', + boostedApr: 5.5, + startTimestamp: 1234567890, + endTimestamp: 1234567990, + }) + + expect(result.current.data?.token0).toEqual(validBEPoolToken0) + expect(result.current.data?.token1).toEqual(validBEPoolToken1) + expect(result.current.data?.tvlToken0).toBe(100000) + expect(result.current.data?.tvlToken1).toBe(50000) + + expect(result.current.data?.volumeUSD24H).toBe(500000) + expect(result.current.data?.tvlUSD).toBe(1000000) + expect(result.current.data?.tvlUSDChange).toBe(2.5) + expect(result.current.data?.txCount).toBe(1000) + }) + + it('should return v3 pool data with calculated fee tier', () => { + mockV3Query.mockReturnValue({ + loading: false, + error: undefined, + data: mockV3PoolData, + }) + + const { result } = renderHook(() => + usePoolData({ + poolIdOrAddress: '0xv3pool456', + chainId: UniverseChainId.Mainnet, + isPoolAddress: true, + }), + ) + + expect(result.current.loading).toBe(false) + expect(result.current.error).toBe(false) + expect(result.current.data).toBeDefined() + + expect(result.current.data?.idOrAddress).toBe('0xv3pool456') + expect(result.current.data?.protocolVersion).toBe(GraphQLApi.ProtocolVersion.V3) + expect(result.current.data?.feeTier?.feeAmount).toBe(FeeAmount.MEDIUM) + expect(result.current.data?.feeTier?.tickSpacing).toBe(60) + expect(result.current.data?.feeTier?.isDynamic).toBe(false) + + expect(result.current.data?.hookAddress).toBeUndefined() + expect(result.current.data?.rewardsCampaign).toBeUndefined() + + expect(result.current.data?.token0).toEqual(validBEPoolToken0) + expect(result.current.data?.token1).toEqual(validBEPoolToken1) + expect(result.current.data?.tvlToken0).toBe(80000) + expect(result.current.data?.tvlToken1).toBe(40000) + + expect(result.current.data?.volumeUSD24H).toBe(400000) + expect(result.current.data?.tvlUSD).toBe(800000) + expect(result.current.data?.tvlUSDChange).toBe(1.8) + expect(result.current.data?.txCount).toBe(800) + }) + + it('should return v2 pool data with default fee tier', () => { + mockV2Query.mockReturnValue({ + loading: false, + error: undefined, + data: mockV2PairData, + }) + + const { result } = renderHook(() => + usePoolData({ + poolIdOrAddress: '0xv2pair789', + chainId: UniverseChainId.Mainnet, + isPoolAddress: true, + }), + ) + + expect(result.current.loading).toBe(false) + expect(result.current.error).toBe(false) + expect(result.current.data).toBeDefined() + + expect(result.current.data?.idOrAddress).toBe('0xv2pair789') + expect(result.current.data?.protocolVersion).toBe(GraphQLApi.ProtocolVersion.V2) + expect(result.current.data?.feeTier?.feeAmount).toBe(V2_DEFAULT_FEE_TIER) + expect(result.current.data?.feeTier?.tickSpacing).toBeUndefined() + expect(result.current.data?.feeTier?.isDynamic).toBe(false) + + expect(result.current.data?.hookAddress).toBeUndefined() + expect(result.current.data?.rewardsCampaign).toBeUndefined() + + expect(result.current.data?.token0).toEqual(validBEPoolToken0) + expect(result.current.data?.token1).toEqual(validBEPoolToken1) + expect(result.current.data?.tvlToken0).toBe(60000) + expect(result.current.data?.tvlToken1).toBe(30000) + + expect(result.current.data?.volumeUSD24H).toBe(300000) + expect(result.current.data?.tvlUSD).toBe(600000) + expect(result.current.data?.tvlUSDChange).toBe(1.2) + expect(result.current.data?.txCount).toBe(600) + }) +}) diff --git a/apps/web/src/appGraphql/data/pools/usePoolData.ts b/apps/web/src/appGraphql/data/pools/usePoolData.ts index e2d1bf91be7..cedee21df58 100644 --- a/apps/web/src/appGraphql/data/pools/usePoolData.ts +++ b/apps/web/src/appGraphql/data/pools/usePoolData.ts @@ -1,8 +1,9 @@ +import { FeeAmount, TICK_SPACINGS } from '@uniswap/v3-sdk' import { GraphQLApi } from '@universe/api' import { FeeData } from 'components/Liquidity/Create/types' import ms from 'ms' import { useMemo } from 'react' -import { DEFAULT_TICK_SPACING, V2_DEFAULT_FEE_TIER } from 'uniswap/src/constants/pools' +import { V2_DEFAULT_FEE_TIER } from 'uniswap/src/constants/pools' import { useEnabledChains } from 'uniswap/src/features/chains/hooks/useEnabledChains' import { UniverseChainId } from 'uniswap/src/features/chains/types' import { toGraphQLChain } from 'uniswap/src/features/chains/utils' @@ -130,7 +131,7 @@ export function usePoolData({ const pool = dataV4?.v4Pool ?? dataV3?.v3Pool ?? dataV2?.v2Pair ?? undefined const feeTier: FeeData = { feeAmount: dataV4?.v4Pool?.feeTier ?? dataV3?.v3Pool?.feeTier ?? V2_DEFAULT_FEE_TIER, - tickSpacing: DEFAULT_TICK_SPACING, + tickSpacing: dataV4?.v4Pool?.tickSpacing ?? TICK_SPACINGS[dataV3?.v3Pool?.feeTier as FeeAmount], isDynamic: dataV4?.v4Pool?.isDynamicFee ?? false, } const poolId = dataV4?.v4Pool?.poolId ?? dataV3?.v3Pool?.address ?? dataV2?.v2Pair?.address ?? poolIdOrAddress diff --git a/apps/web/src/assets/images/portfolio-connect-wallet-banner-grid/dark.svg b/apps/web/src/assets/images/portfolio-connect-wallet-banner-grid/dark.svg new file mode 100644 index 00000000000..58541a4f109 --- /dev/null +++ b/apps/web/src/assets/images/portfolio-connect-wallet-banner-grid/dark.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/web/src/assets/images/portfolio-connect-wallet-banner-grid/light.svg b/apps/web/src/assets/images/portfolio-connect-wallet-banner-grid/light.svg new file mode 100644 index 00000000000..4a2adf55f55 --- /dev/null +++ b/apps/web/src/assets/images/portfolio-connect-wallet-banner-grid/light.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/web/src/assets/images/portfolio-page-disconnected-preview/dark.svg b/apps/web/src/assets/images/portfolio-page-disconnected-preview/dark.svg new file mode 100644 index 00000000000..1ae6e3cb76e --- /dev/null +++ b/apps/web/src/assets/images/portfolio-page-disconnected-preview/dark.svg @@ -0,0 +1,778 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/web/src/assets/images/portfolio-page-disconnected-preview/light.svg b/apps/web/src/assets/images/portfolio-page-disconnected-preview/light.svg new file mode 100644 index 00000000000..8e9c0579fe4 --- /dev/null +++ b/apps/web/src/assets/images/portfolio-page-disconnected-preview/light.svg @@ -0,0 +1,778 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/web/src/assets/images/portfolio-page-disconnected-preview/mobile-dark.svg b/apps/web/src/assets/images/portfolio-page-disconnected-preview/mobile-dark.svg new file mode 100644 index 00000000000..843ed723d5d --- /dev/null +++ b/apps/web/src/assets/images/portfolio-page-disconnected-preview/mobile-dark.svg @@ -0,0 +1,189 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/web/src/assets/images/portfolio-page-disconnected-preview/mobile-light.svg b/apps/web/src/assets/images/portfolio-page-disconnected-preview/mobile-light.svg new file mode 100644 index 00000000000..9530c38d4e9 --- /dev/null +++ b/apps/web/src/assets/images/portfolio-page-disconnected-preview/mobile-light.svg @@ -0,0 +1,189 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/web/src/assets/svg/demo-wallet-emblem.svg b/apps/web/src/assets/svg/demo-wallet-emblem.svg new file mode 100644 index 00000000000..1839d363511 --- /dev/null +++ b/apps/web/src/assets/svg/demo-wallet-emblem.svg @@ -0,0 +1,3 @@ + + + diff --git a/apps/web/src/components/AccountDetails/AddressDisplay.tsx b/apps/web/src/components/AccountDetails/AddressDisplay.tsx index 56d5bc9eb1d..ef1e13367ba 100644 --- a/apps/web/src/components/AccountDetails/AddressDisplay.tsx +++ b/apps/web/src/components/AccountDetails/AddressDisplay.tsx @@ -1,4 +1,4 @@ -import styled from 'lib/styled-components' +import { deprecatedStyled } from 'lib/styled-components' import { EllipsisStyle } from 'theme/components/styles' import { Flex } from 'ui/src' import { Unitag } from 'ui/src/components/icons/Unitag' @@ -7,7 +7,7 @@ import { useENSName } from 'uniswap/src/features/ens/api' import { TestID } from 'uniswap/src/test/fixtures/testIDs' import { shortenAddress } from 'utilities/src/addresses' -const IdentifierText = styled.span` +const IdentifierText = deprecatedStyled.span` ${EllipsisStyle} ` diff --git a/apps/web/src/components/AccountDetails/MultiBlockchainAddressDisplay.tsx b/apps/web/src/components/AccountDetails/MultiBlockchainAddressDisplay.tsx index 33b601988f3..895deef738f 100644 --- a/apps/web/src/components/AccountDetails/MultiBlockchainAddressDisplay.tsx +++ b/apps/web/src/components/AccountDetails/MultiBlockchainAddressDisplay.tsx @@ -49,11 +49,13 @@ function PrimaryAddressDisplay({ ensName, primaryAddress, isMultipleAddresses, + hideAddressInSubtitle, }: { unitag?: string ensName?: string primaryAddress: string isMultipleAddresses: boolean + hideAddressInSubtitle?: boolean }) { const { t } = useTranslation() const shortenedPrimaryAddress = shortenAddress({ address: primaryAddress }) @@ -62,17 +64,18 @@ function PrimaryAddressDisplay({ return ( - {isMultipleAddresses ? ( - - {shortenedPrimaryAddress} {t('common.plusMore', { number: 1 })} - - ) : ( - + {!hideAddressInSubtitle && + (isMultipleAddresses ? ( - {shortenedPrimaryAddress} + {shortenedPrimaryAddress} {t('common.plusMore', { number: 1 })} - - )} + ) : ( + + + {shortenedPrimaryAddress} + + + ))} ) } @@ -138,7 +141,7 @@ function TooltipAccountRow({ account }: { account: AccountItem }) { ) } -export function MultiBlockchainAddressDisplay() { +export function MultiBlockchainAddressDisplay({ hideAddressInSubtitle }: { hideAddressInSubtitle?: boolean }) { const activeAddresses = useActiveAddresses() const evmAddress = activeAddresses.evmAddress const { data: ensName } = useENSName(evmAddress) @@ -193,6 +196,7 @@ export function MultiBlockchainAddressDisplay() { ensName={ensName ?? undefined} primaryAddress={primaryAddress} isMultipleAddresses={isMultipleAddresses} + hideAddressInSubtitle={hideAddressInSubtitle} /> } /> diff --git a/apps/web/src/components/AccountDrawer/AccountDrawer.e2e.test.ts b/apps/web/src/components/AccountDrawer/AccountDrawer.e2e.test.ts index 3d4eab9b0d6..d6a01855fa7 100644 --- a/apps/web/src/components/AccountDrawer/AccountDrawer.e2e.test.ts +++ b/apps/web/src/components/AccountDrawer/AccountDrawer.e2e.test.ts @@ -26,140 +26,155 @@ async function countPortfolioBalancesQueries(page: Page, actions: () => Promise< return portfolioBalanceCount } -test.describe('Mini Portfolio settings', () => { - test.beforeEach(async ({ page }) => { - await page.goto('/swap') - await page.getByTestId(TestID.Web3StatusConnected).click() - await page.getByTestId(TestID.WalletSettings).click() - }) - test('changes theme', async ({ page }) => { - await page.getByTestId(TestID.ThemeDark).click() - await expect(page.locator('html')).toHaveClass('t_dark') - await page.getByTestId(TestID.ThemeLight).click() - await expect(page.locator('html')).toHaveClass('t_light') - }) - - test('changes language', async ({ page }) => { - await page.getByTestId(TestID.LanguageSettingsButton).click() - await page.getByRole('link', { name: 'Spanish (Spain)' }).click() - await expect(page.getByText('Uniswap está disponible en:')).toBeVisible() - await page.reload() - await expect(page.url()).toContain('lng=es-ES') - await expect(page.getByText('Uniswap está disponible en:')).toBeVisible() - }) - - test('toggles testnet', async ({ page }) => { - await page.getByTestId(TestID.TestnetsToggle).click() - await expect(page.getByTestId(TestID.TestnetsToggle)).toHaveAttribute('aria-checked', 'true') - await expect(page.getByText('Swapping on Sepolia')).toBeVisible() - }) - - test('disconnected wallet settings should not be accessible', async ({ page }) => { - await page.goto('/swap?eagerlyConnect=false') - await page.getByLabel('Navigation button').click() - await expect(page.getByTestId(TestID.WalletSettings)).not.toBeVisible() - }) - - test('settings on mobile should be accessible via bottom sheet', async ({ page }) => { - await page.setViewportSize({ width: 375, height: 667 }) - await expect(page.getByTestId(TestID.AccountDrawer).first()).toHaveAttribute('class', /is_Sheet/) - }) -}) - -test.describe('Mini Portfolio account drawer', () => { - test.beforeEach(async ({ page, graphql }) => { - // Set up request interception for portfolio balances - await graphql.intercept('PortfolioBalances', Mocks.PortfolioBalances.hayden) - await graphql.intercept('NftsTab', Mocks.Account.nfts) - await graphql.intercept('ActivityWeb', Mocks.Account.full_activity_history) - await page.goto(`/swap?eagerlyConnectAddress=${HAYDEN_ADDRESS}`) - }) - - test('should fetch balances when the account drawer is opened', async ({ page }) => { - const portfolioBalanceCount = await countPortfolioBalancesQueries(page, async () => { - // Click to open drawer - await page.getByTestId(TestID.Web3StatusConnected).click() - await expect(page.getByTestId(TestID.AccountDrawer)).toBeVisible() - }) - - expect(portfolioBalanceCount).toBe(1) - }) - - test('should not re-fetch balances on second open', async ({ page }) => { - // First, open drawer and let it fetch data (this should trigger a request) - await page.getByTestId(TestID.Web3StatusConnected).click() - await expect(page.getByTestId(TestID.AccountDrawer)).toBeVisible() - - // Wait for the portfolio data to actually load - await page.getByTestId(TestID.MiniPortfolioPage).waitFor() - - // Close the drawer - await page.getByTestId(TestID.CloseAccountDrawer).click() - await expect(page.getByTestId(TestID.AccountDrawer)).not.toBeVisible() - - // Now test opening it a second time (should not trigger another request due to caching) - const portfolioBalanceCount = await countPortfolioBalancesQueries(page, async () => { - // Click to open drawer again - await page.getByTestId(TestID.Web3StatusConnected).click() - await expect(page.getByTestId(TestID.AccountDrawer)).toBeVisible() +test.describe( + 'Account Drawer', + { + tag: '@team:apps-portfolio', + annotation: [ + { type: 'DD_TAGS[team]', description: 'apps-portfolio' }, + { type: 'DD_TAGS[test.type]', description: 'web-e2e' }, + ], + }, + () => { + test.describe('Mini Portfolio settings', () => { + test.beforeEach(async ({ page }) => { + await page.goto('/swap') + await page.getByTestId(TestID.Web3StatusConnected).click() + await page.getByTestId(TestID.WalletSettings).click() + }) + test('changes theme', async ({ page }) => { + await page.getByTestId(TestID.ThemeDark).click() + await expect(page.locator('html')).toHaveClass('t_dark') + await page.getByTestId(TestID.ThemeLight).click() + await expect(page.locator('html')).toHaveClass('t_light') + }) + + test('changes language', async ({ page }) => { + await page.getByTestId(TestID.LanguageSettingsButton).click() + await page.getByRole('link', { name: 'Spanish (Spain)' }).click() + await expect(page.getByText('Uniswap está disponible en:')).toBeVisible() + await page.reload() + await expect(page.url()).toContain('lng=es-ES') + await expect(page.getByText('Uniswap está disponible en:')).toBeVisible() + }) + + test('toggles testnet', async ({ page }) => { + await page.getByTestId(TestID.TestnetsToggle).click() + await expect(page.getByTestId(TestID.TestnetsToggle)).toHaveAttribute('aria-checked', 'true') + // Confirm the info modal appears and then close it + const modalButton = page.getByRole('button', { name: 'Close' }) + await expect(modalButton).toBeVisible() + await modalButton.click() + }) + + test('disconnected wallet settings should not be accessible', async ({ page }) => { + await page.goto('/swap?eagerlyConnect=false') + await page.getByLabel('Navigation button').click() + await expect(page.getByTestId(TestID.WalletSettings)).not.toBeVisible() + }) + + test('settings on mobile should be accessible via bottom sheet', async ({ page }) => { + await page.setViewportSize({ width: 375, height: 667 }) + await expect(page.getByTestId(TestID.AccountDrawer).first()).toHaveAttribute('class', /is_Sheet/) + }) }) - expect(portfolioBalanceCount).toBe(0) - }) - - test('fetches account information', async ({ page }) => { - // Open the mini portfolio - await page.getByTestId(TestID.Web3StatusConnected).click() - - // Wait for the drawer and main content to load - await expect(page.getByTestId(TestID.AccountDrawer)).toBeVisible() - await page.getByTestId(TestID.MiniPortfolioPage).waitFor() - - // Verify wallet state - wait for tokens tab to load - await expect(page.getByTestId(TestID.MiniPortfolioNavbar)).toContainText('Tokens') - await expect(page.getByTestId(TestID.MiniPortfolioPage)).toContainText('Hidden tokens') - - // Check NFTs section - await page.getByTestId(TestID.MiniPortfolioNavbar).getByText('NFTs').click() - await page.waitForTimeout(15_000) - await expect( - page.getByTestId(`${TestID.MiniPortfolioNftItem}-${'0x3C90502f0CB0ad0A48c51357E65Ff15247A1D88E'}-${21}`), - ).toBeVisible() - - // Check Activity section - await page.getByTestId(TestID.MiniPortfolioNavbar).getByText('Activity').click() - await expect(page.getByTestId(TestID.MiniPortfolioPage)).toContainText('Contract Interaction') - }) - - test('refetches balances when account changes', async ({ page, graphql }) => { - // Open account drawer with first account - await page.getByTestId(TestID.Web3StatusConnected).click() - const drawer = page.getByTestId(TestID.AccountDrawer) - await expect(drawer).toBeVisible() - await page.getByTestId(TestID.MiniPortfolioPage).waitFor() - - // Verify first account address - await expect(drawer.getByText(HAYDEN_ADDRESS.slice(0, 6))).toBeVisible() - - // Set up mock data for second account - await graphql.intercept('PortfolioBalances', Mocks.PortfolioBalances.test_wallet) - - // Count portfolio requests triggered by account change - const portfolioRequestCount = await countPortfolioBalancesQueries(page, async () => { - // Switch to second account (this should trigger new portfolio requests) - await page.goto(`/swap`) - - // Open drawer with new account - await page.getByTestId(TestID.Web3StatusConnected).click() - const newDrawer = page.getByTestId(TestID.AccountDrawer) - await expect(newDrawer).toBeVisible() - await page.getByTestId(TestID.MiniPortfolioPage).waitFor() - - // Verify new account address - await expect(newDrawer.getByText('test0')).toBeVisible() + test.describe('Mini Portfolio account drawer', () => { + test.beforeEach(async ({ page, graphql }) => { + // Set up request interception for portfolio balances + await graphql.intercept('PortfolioBalances', Mocks.PortfolioBalances.hayden) + await graphql.intercept('NftsTab', Mocks.Account.nfts) + await graphql.intercept('ActivityWeb', Mocks.Account.full_activity_history) + await page.goto(`/swap?eagerlyConnectAddress=${HAYDEN_ADDRESS}`) + }) + + test('should fetch balances when the account drawer is opened', async ({ page }) => { + const portfolioBalanceCount = await countPortfolioBalancesQueries(page, async () => { + // Click to open drawer + await page.getByTestId(TestID.Web3StatusConnected).click() + await expect(page.getByTestId(TestID.AccountDrawer)).toBeVisible() + }) + + expect(portfolioBalanceCount).toBe(1) + }) + + test('should not re-fetch balances on second open', async ({ page }) => { + // First, open drawer and let it fetch data (this should trigger a request) + await page.getByTestId(TestID.Web3StatusConnected).click() + await expect(page.getByTestId(TestID.AccountDrawer)).toBeVisible() + + // Wait for the portfolio data to actually load + await page.getByTestId(TestID.MiniPortfolioPage).waitFor() + + // Close the drawer + await page.getByTestId(TestID.CloseAccountDrawer).click() + await expect(page.getByTestId(TestID.AccountDrawer)).not.toBeVisible() + + // Now test opening it a second time (should not trigger another request due to caching) + const portfolioBalanceCount = await countPortfolioBalancesQueries(page, async () => { + // Click to open drawer again + await page.getByTestId(TestID.Web3StatusConnected).click() + await expect(page.getByTestId(TestID.AccountDrawer)).toBeVisible() + }) + + expect(portfolioBalanceCount).toBe(0) + }) + + test('fetches account information', async ({ page }) => { + // Open the mini portfolio + await page.getByTestId(TestID.Web3StatusConnected).click() + + // Wait for the drawer and main content to load + await expect(page.getByTestId(TestID.AccountDrawer)).toBeVisible() + await page.getByTestId(TestID.MiniPortfolioPage).waitFor() + + // Verify wallet state - wait for tokens tab to load + await expect(page.getByTestId(TestID.MiniPortfolioNavbar)).toContainText('Tokens') + await expect(page.getByTestId(TestID.MiniPortfolioPage)).toContainText('Hidden tokens') + + // Check NFTs section + await page.getByTestId(TestID.MiniPortfolioNavbar).getByText('NFTs').click() + await page.waitForTimeout(15_000) + await expect( + page.getByTestId(`${TestID.MiniPortfolioNftItem}-${'0x3C90502f0CB0ad0A48c51357E65Ff15247A1D88E'}-${21}`), + ).toBeVisible() + + // Check Activity section + await page.getByTestId(TestID.MiniPortfolioNavbar).getByText('Activity').click() + await expect(page.getByTestId(TestID.MiniPortfolioPage)).toContainText('Contract Interaction') + }) + + test('refetches balances when account changes', async ({ page, graphql }) => { + // Open account drawer with first account + await page.getByTestId(TestID.Web3StatusConnected).click() + const drawer = page.getByTestId(TestID.AccountDrawer) + await expect(drawer).toBeVisible() + await page.getByTestId(TestID.MiniPortfolioPage).waitFor() + + // Verify first account address + await expect(drawer.getByText(HAYDEN_ADDRESS.slice(0, 6))).toBeVisible() + + // Set up mock data for second account + await graphql.intercept('PortfolioBalances', Mocks.PortfolioBalances.test_wallet) + + // Count portfolio requests triggered by account change + const portfolioRequestCount = await countPortfolioBalancesQueries(page, async () => { + // Switch to second account (this should trigger new portfolio requests) + await page.goto(`/swap`) + + // Open drawer with new account + await page.getByTestId(TestID.Web3StatusConnected).click() + const newDrawer = page.getByTestId(TestID.AccountDrawer) + await expect(newDrawer).toBeVisible() + await page.getByTestId(TestID.MiniPortfolioPage).waitFor() + + // Verify new account address + await expect(newDrawer.getByText('test0')).toBeVisible() + }) + + // Verify that account change triggered portfolio requests + expect(portfolioRequestCount).toBeGreaterThanOrEqual(1) + }) }) - - // Verify that account change triggered portfolio requests - expect(portfolioRequestCount).toBeGreaterThanOrEqual(1) - }) -}) + }, +) diff --git a/apps/web/src/components/AccountDrawer/ActionTile.tsx b/apps/web/src/components/AccountDrawer/ActionTile.tsx index cabbd3f44a3..f0286745cc1 100644 --- a/apps/web/src/components/AccountDrawer/ActionTile.tsx +++ b/apps/web/src/components/AccountDrawer/ActionTile.tsx @@ -1,6 +1,6 @@ import { ReactNode } from 'react' import { SpinnerSVG } from 'theme/components/icons/spinner' -import { Flex, styled, Text, useSporeColors } from 'ui/src' +import { Flex, FlexProps, styled, Text, useSporeColors } from 'ui/src' const LoadingButtonSpinner = (props: React.ComponentPropsWithoutRef<'svg'>) => ( @@ -39,6 +39,16 @@ const Tile = styled(Flex, { }, }) +export type ActionTileProps = { + dataTestId: string + Icon: ReactNode + name: string + onClick: () => void + loading?: boolean + disabled?: boolean + padding?: FlexProps['p'] +} + export function ActionTile({ dataTestId, Icon, @@ -46,20 +56,14 @@ export function ActionTile({ onClick, loading, disabled, -}: { - dataTestId: string - Icon: ReactNode - name: string - onClick: () => void - loading?: boolean - disabled?: boolean -}) { + padding = '$spacing12', +}: ActionTileProps) { const { accent1 } = useSporeColors() return ( - + {loading ? : Icon} - + {name} diff --git a/apps/web/src/components/AccountDrawer/AuthenticatedHeader.anvil.e2e.test.ts b/apps/web/src/components/AccountDrawer/AuthenticatedHeader.anvil.e2e.test.ts index 38ef1adba12..36604cfc25b 100644 --- a/apps/web/src/components/AccountDrawer/AuthenticatedHeader.anvil.e2e.test.ts +++ b/apps/web/src/components/AccountDrawer/AuthenticatedHeader.anvil.e2e.test.ts @@ -4,23 +4,33 @@ import { HAYDEN_ADDRESS, HAYDEN_ENS, UNITAG_NAME } from 'playwright/fixtures/wal const test = getTest({ withAnvil: true }) -test.describe('AuthenticatedHeader unitag and ENS display', () => { - // Test cases: - // 1. Shows ENS, followed by address, if ENS exists but not Unitag - // 2. Shows Unitag, followed by address, if user has both Unitag and ENS +test.describe( + 'AuthenticatedHeader unitag and ENS display', + { + tag: '@team:apps-growth', + annotation: [ + { type: 'DD_TAGS[team]', description: 'apps-growth' }, + { type: 'DD_TAGS[test.type]', description: 'web-e2e' }, + ], + }, + () => { + // Test cases: + // 1. Shows ENS, followed by address, if ENS exists but not Unitag + // 2. Shows Unitag, followed by address, if user has both Unitag and ENS - const ACCOUNT_WITH_ENS = HAYDEN_ADDRESS + const ACCOUNT_WITH_ENS = HAYDEN_ADDRESS - test('shows ENS, followed by address when ENS exists but not Unitag', async ({ page }) => { - await page.goto(`/swap?eagerlyConnectAddress=${ACCOUNT_WITH_ENS}`) + test('shows ENS, followed by address when ENS exists but not Unitag', async ({ page }) => { + await page.goto(`/swap?eagerlyConnectAddress=${ACCOUNT_WITH_ENS}`) - await openAccountDrawerAndVerify({ page, expectedPrimaryText: HAYDEN_ENS, walletAddress: HAYDEN_ADDRESS }) - }) + await openAccountDrawerAndVerify({ page, expectedPrimaryText: HAYDEN_ENS, walletAddress: HAYDEN_ADDRESS }) + }) - test('shows Unitag when user has both Unitag and ENS', async ({ page }) => { - await mockUnitagResponse({ page, address: HAYDEN_ADDRESS, unitag: UNITAG_NAME }) - await page.goto(`/swap?eagerlyConnectAddress=${HAYDEN_ADDRESS}`) + test('shows Unitag when user has both Unitag and ENS', async ({ page }) => { + await mockUnitagResponse({ page, address: HAYDEN_ADDRESS, unitag: UNITAG_NAME }) + await page.goto(`/swap?eagerlyConnectAddress=${HAYDEN_ADDRESS}`) - await openAccountDrawerAndVerify({ page, expectedPrimaryText: UNITAG_NAME, walletAddress: HAYDEN_ADDRESS }) - }) -}) + await openAccountDrawerAndVerify({ page, expectedPrimaryText: UNITAG_NAME, walletAddress: HAYDEN_ADDRESS }) + }) + }, +) diff --git a/apps/web/src/components/AccountDrawer/AuthenticatedHeader.e2e.test.ts b/apps/web/src/components/AccountDrawer/AuthenticatedHeader.e2e.test.ts index e1348cbf0fd..d9e57ed8817 100644 --- a/apps/web/src/components/AccountDrawer/AuthenticatedHeader.e2e.test.ts +++ b/apps/web/src/components/AccountDrawer/AuthenticatedHeader.e2e.test.ts @@ -4,22 +4,32 @@ import { TEST_WALLET_ADDRESS, UNITAG_NAME } from 'playwright/fixtures/wallets' const test = getTest() -test.describe('AuthenticatedHeader unitag and ENS display', () => { - // Test cases: - // 1. Shows address if no Unitag or ENS exists - // 2. Shows Unitag, followed by address, if Unitag exists but not ENS +test.describe( + 'AuthenticatedHeader unitag and ENS display', + { + tag: '@team:apps-growth', + annotation: [ + { type: 'DD_TAGS[team]', description: 'apps-growth' }, + { type: 'DD_TAGS[test.type]', description: 'web-e2e' }, + ], + }, + () => { + // Test cases: + // 1. Shows address if no Unitag or ENS exists + // 2. Shows Unitag, followed by address, if Unitag exists but not ENS - const ACCOUNT_WITH_NO_USERNAME = '0xF030EaA01aFf57A23483dC8A1c3550d153be69Fb' + const ACCOUNT_WITH_NO_USERNAME = '0xF030EaA01aFf57A23483dC8A1c3550d153be69Fb' - test('shows address if no Unitag or ENS exists', async ({ page }) => { - await page.goto(`/swap?eagerlyConnectAddress=${ACCOUNT_WITH_NO_USERNAME}`) - await openAccountDrawerAndVerify({ page, walletAddress: ACCOUNT_WITH_NO_USERNAME }) - }) + test('shows address if no Unitag or ENS exists', async ({ page }) => { + await page.goto(`/swap?eagerlyConnectAddress=${ACCOUNT_WITH_NO_USERNAME}`) + await openAccountDrawerAndVerify({ page, walletAddress: ACCOUNT_WITH_NO_USERNAME }) + }) - test('shows Unitag, followed by address when Unitag exists but not ENS', async ({ page }) => { - await mockUnitagResponse({ page, address: TEST_WALLET_ADDRESS, unitag: UNITAG_NAME }) - await page.goto('/swap') + test('shows Unitag, followed by address when Unitag exists but not ENS', async ({ page }) => { + await mockUnitagResponse({ page, address: TEST_WALLET_ADDRESS, unitag: UNITAG_NAME }) + await page.goto('/swap') - await openAccountDrawerAndVerify({ page, expectedPrimaryText: UNITAG_NAME, walletAddress: TEST_WALLET_ADDRESS }) - }) -}) + await openAccountDrawerAndVerify({ page, expectedPrimaryText: UNITAG_NAME, walletAddress: TEST_WALLET_ADDRESS }) + }) + }, +) diff --git a/apps/web/src/components/AccountDrawer/AuthenticatedHeader.tsx b/apps/web/src/components/AccountDrawer/AuthenticatedHeader.tsx index 72bdd2ef2ee..a17f7e3d04a 100644 --- a/apps/web/src/components/AccountDrawer/AuthenticatedHeader.tsx +++ b/apps/web/src/components/AccountDrawer/AuthenticatedHeader.tsx @@ -2,40 +2,37 @@ import { NetworkStatus } from '@apollo/client' import { CurrencyAmount, Token } from '@uniswap/sdk-core' import { FeatureFlags, useFeatureFlag } from '@universe/gating' import { MultiBlockchainAddressDisplay } from 'components/AccountDetails/MultiBlockchainAddressDisplay' -import { ActionTile } from 'components/AccountDrawer/ActionTile' import { DisconnectButton } from 'components/AccountDrawer/DisconnectButton' import { DownloadGraduatedWalletCard } from 'components/AccountDrawer/DownloadGraduatedWalletCard' import { EmptyWallet } from 'components/AccountDrawer/MiniPortfolio/EmptyWallet' import { ExtensionDeeplinks } from 'components/AccountDrawer/MiniPortfolio/ExtensionDeeplinks' import { useAccountDrawer } from 'components/AccountDrawer/MiniPortfolio/hooks' import MiniPortfolio from 'components/AccountDrawer/MiniPortfolio/MiniPortfolio' -import { SendButtonTooltip } from 'components/AccountDrawer/SendButtonTooltip' +import MiniPortfolioV2 from 'components/AccountDrawer/MiniPortfolio/MiniPortfolioV2' +import { ReceiveActionTile } from 'components/ActionTiles/ReceiveActionTile' +import { SendActionTile } from 'components/ActionTiles/SendActionTile/SendActionTile' import { LimitedSupportBanner } from 'components/Banner/LimitedSupportBanner' import DelegationMismatchModal from 'components/delegation/DelegationMismatchModal' import { Settings } from 'components/Icons/Settings' -import { ReceiveModalState } from 'components/ReceiveCryptoModal/types' -import { useOpenReceiveCryptoModal } from 'components/ReceiveCryptoModal/useOpenReceiveCryptoModal' import StatusIcon from 'components/StatusIcon' +import { ExtensionRequestMethods, useUniswapExtensionRequest } from 'components/WalletModal/useWagmiConnectorWithId' import { useAccountsStore } from 'features/accounts/store/hooks' import { useIsUniswapExtensionConnected } from 'hooks/useIsUniswapExtensionConnected' import { useModalState } from 'hooks/useModalState' -import { useTheme } from 'lib/styled-components' -import { useState } from 'react' -import { Trans, useTranslation } from 'react-i18next' +import { useCallback, useState } from 'react' +import { useTranslation } from 'react-i18next' import { useUserHasAvailableClaim, useUserUnclaimedAmount } from 'state/claim/hooks' -import { Button, Flex, IconButton } from 'ui/src' -import { ArrowDownCircleFilled } from 'ui/src/components/icons/ArrowDownCircleFilled' -import { SendAction } from 'ui/src/components/icons/SendAction' +import { Button, Flex, IconButton, Image, useSporeColors } from 'ui/src' +import { UNISWAP_LOGO } from 'ui/src/assets' import { Shine } from 'ui/src/loading/Shine' +import { iconSizes } from 'ui/src/theme' import AnimatedNumber, { BALANCE_CHANGE_INDICATION_DURATION, } from 'uniswap/src/components/AnimatedNumber/AnimatedNumber' import { TestnetModeBanner } from 'uniswap/src/components/banners/TestnetModeBanner' import { RelativeChange } from 'uniswap/src/components/RelativeChange/RelativeChange' -import { useUniswapContext } from 'uniswap/src/contexts/UniswapContext' import { useConnectionStatus } from 'uniswap/src/features/accounts/store/hooks' import { useEnabledChains } from 'uniswap/src/features/chains/hooks/useEnabledChains' -import { UniverseChainId } from 'uniswap/src/features/chains/types' import { usePortfolioTotalValue } from 'uniswap/src/features/dataApi/balances/balancesRest' import { FiatCurrency } from 'uniswap/src/features/fiatCurrency/constants' import { useAppFiatCurrency, useAppFiatCurrencyInfo } from 'uniswap/src/features/fiatCurrency/hooks' @@ -46,7 +43,6 @@ import { ModalName } from 'uniswap/src/features/telemetry/constants' import i18next from 'uniswap/src/i18n' import { TestID } from 'uniswap/src/test/fixtures/testIDs' import { NumberType } from 'utilities/src/format/types' -import { useEvent } from 'utilities/src/react/hooks' export default function AuthenticatedHeader({ evmAddress, @@ -58,6 +54,7 @@ export default function AuthenticatedHeader({ openSettings: () => void }) { const { t } = useTranslation() + const isPortfolioPageEnabled = useFeatureFlag(FeatureFlags.PortfolioPage) const isSolanaConnected = useConnectionStatus(Platform.SVM).isConnected const multipleWalletsConnected = useAccountsStore((state) => { @@ -66,7 +63,10 @@ export default function AuthenticatedHeader({ return Boolean(evmWalletId && svmWalletId && evmWalletId !== svmWalletId) }) // if different wallets are connected, do not show mini wallet icon - const shouldShowExtensionDeeplinks = useIsUniswapExtensionConnected() && !isSolanaConnected + const isUniswapExtensionConnected = useIsUniswapExtensionConnected() + const uniswapExtensionRequest = useUniswapExtensionRequest() + const shouldShowExtensionDeeplinks = isUniswapExtensionConnected && !isSolanaConnected && !isPortfolioPageEnabled + const shouldShowExtensionButton = isPortfolioPageEnabled && isUniswapExtensionConnected && !isSolanaConnected const { isTestnetModeEnabled } = useEnabledChains() @@ -78,21 +78,6 @@ export default function AuthenticatedHeader({ const accountDrawer = useAccountDrawer() - const openReceiveCryptoModal = useOpenReceiveCryptoModal({ - modalState: ReceiveModalState.DEFAULT, - }) - - const { navigateToSendFlow } = useUniswapContext() - - const isSolanaOnlyWallet = Boolean(svmAddress && !evmAddress) - - const onPressSend = useEvent(() => { - if (!isSolanaOnlyWallet) { - navigateToSendFlow({ chainId: UniverseChainId.Mainnet }) - accountDrawer.close() - } - }) - const { data, networkStatus, loading } = usePortfolioTotalValue({ evmAddress, svmAddress, @@ -115,13 +100,18 @@ export default function AuthenticatedHeader({ const isPermitMismatchUxEnabled = useFeatureFlag(FeatureFlags.EnablePermitMismatchUX) const shouldShowDelegationMismatch = isPermitMismatchUxEnabled && isDelegationMismatch const [displayDelegationMismatchModal, setDisplayDelegationMismatchModal] = useState(false) - const theme = useTheme() + const colors = useSporeColors() const amount = unclaimedAmount?.toFixed(0, { groupSeparator: ',' }) ?? '-' const shouldFadePortfolioDecimals = (currency === FiatCurrency.UnitedStatesDollar || currency === FiatCurrency.Euro) && currencyComponents.symbolAtFront + const handleOpenExtensionSidebar = useCallback(() => { + uniswapExtensionRequest?.(ExtensionRequestMethods.OPEN_SIDEBAR, 'Tokens') + accountDrawer.close() + }, [uniswapExtensionRequest, accountDrawer]) + return ( <> @@ -133,11 +123,23 @@ export default function AuthenticatedHeader({ size={48} /> + {shouldShowExtensionButton && ( + } + borderRadius="$rounded32" + hoverStyle={{ + backgroundColor: '$surface2', + }} + onPress={handleOpenExtensionSidebar} + /> + )} } + icon={} borderRadius="$rounded32" hoverStyle={{ backgroundColor: '$surface2', @@ -189,24 +191,19 @@ export default function AuthenticatedHeader({ ) : ( <> - - } - name={t('common.send.button')} - onClick={onPressSend} - disabled={isSolanaOnlyWallet} - /> - - } - name={t('common.receive')} - onClick={openReceiveCryptoModal} - /> + + + + + + - + {isPortfolioPageEnabled ? ( + + ) : ( + + )} )} {isUnclaimed && ( @@ -216,7 +213,7 @@ export default function AuthenticatedHeader({ onPress={toggleClaimModal} style={{ background: 'linear-gradient(to right, #9139b0 0%, #4261d6 100%)' }} > - + {t('account.authHeader.claimReward', { amount })} )} diff --git a/apps/web/src/components/AccountDrawer/DisconnectButton.tsx b/apps/web/src/components/AccountDrawer/DisconnectButton.tsx index 0e23c16c916..4b1ebc00bd3 100644 --- a/apps/web/src/components/AccountDrawer/DisconnectButton.tsx +++ b/apps/web/src/components/AccountDrawer/DisconnectButton.tsx @@ -3,17 +3,17 @@ import { useAccountDrawer } from 'components/AccountDrawer/MiniPortfolio/hooks' import { MenuStateVariant, useSetMenu } from 'components/AccountDrawer/menuState' import { Power } from 'components/Icons/Power' import { useAccountsStore, useActiveConnector, useActiveWallet } from 'features/accounts/store/hooks' -import { ExternalWallet } from 'features/accounts/store/types' +import { type ExternalWallet } from 'features/accounts/store/types' import { useDisconnect } from 'hooks/useDisconnect' import { useSignOutWithPasskey } from 'hooks/useSignOutWithPasskey' -import { useTheme } from 'lib/styled-components' -import { PropsWithChildren, useMemo } from 'react' +import { type PropsWithChildren, useMemo } from 'react' import { useTranslation } from 'react-i18next' import { useDispatch } from 'react-redux' -import { Button, Flex, IconButton, Image, Text, Tooltip } from 'ui/src' +import { Button, Flex, IconButton, Image, Text, Tooltip, useSporeColors } from 'ui/src' import { PlusCircle } from 'ui/src/components/icons/PlusCircle' import { SwitchArrows } from 'ui/src/components/icons/SwitchArrows' -import { AppTFunction } from 'ui/src/i18n/types' +import { type AppTFunction } from 'ui/src/i18n/types' +import { zIndexes } from 'ui/src/theme' import { CONNECTION_PROVIDER_IDS } from 'uniswap/src/constants/web3' import { Platform } from 'uniswap/src/features/platforms/types/Platform' import { setIsTestnetModeEnabled } from 'uniswap/src/features/settings/slice' @@ -78,14 +78,14 @@ export function DisconnectButton() { } function PowerIconButton({ onPress, pointer }: { onPress?: () => void; pointer: boolean }) { - const theme = useTheme() + const colors = useSporeColors() return ( } + icon={} borderRadius="$rounded32" hoverStyle={{ backgroundColor: '$surface2', @@ -100,14 +100,18 @@ function DisconnectMenuTooltip({ children }: PropsWithChildren) { return ( {children} - + ) } -function DisconnectMenuButtonRow({ children, onPress }: PropsWithChildren<{ onPress: () => void }>) { +function DisconnectMenuButtonRow({ + children, + onPress, + testId, +}: PropsWithChildren<{ onPress: () => void; testId?: string }>) { return ( @@ -264,12 +269,12 @@ function SwitchWalletButtonRow({ variant, platform }: { variant: SwitchButtonVar function InLineDisconnectButton() { const onDisconnect = useOnDisconnect() const { t } = useTranslation() - const theme = useTheme() + const colors = useSporeColors() return ( - - + + {t('common.button.disconnect')} diff --git a/apps/web/src/components/AccountDrawer/LocalCurrencyMenu.tsx b/apps/web/src/components/AccountDrawer/LocalCurrencyMenu.tsx index df10d6598c6..2822cafbbba 100644 --- a/apps/web/src/components/AccountDrawer/LocalCurrencyMenu.tsx +++ b/apps/web/src/components/AccountDrawer/LocalCurrencyMenu.tsx @@ -2,13 +2,13 @@ import { SlideOutMenu } from 'components/AccountDrawer/SlideOutMenu' import { MenuColumn, MenuItem } from 'components/AccountDrawer/shared' import { getLocalCurrencyIcon } from 'constants/localCurrencies' import { useLocalCurrencyLinkProps } from 'hooks/useLocalCurrencyLinkProps' -import styled from 'lib/styled-components' +import { deprecatedStyled } from 'lib/styled-components' import { useMemo } from 'react' import { Trans } from 'react-i18next' import { FiatCurrency, ORDERED_CURRENCIES } from 'uniswap/src/features/fiatCurrency/constants' import { useAppFiatCurrency } from 'uniswap/src/features/fiatCurrency/hooks' -const StyledLocalCurrencyIcon = styled.div` +const StyledLocalCurrencyIcon = deprecatedStyled.div` width: 20px; height: 20px; border-radius: 100%; diff --git a/apps/web/src/components/AccountDrawer/MiniPortfolio/Activity/ActivityTab.anvil.e2e.test.ts b/apps/web/src/components/AccountDrawer/MiniPortfolio/Activity/ActivityTab.anvil.e2e.test.ts deleted file mode 100644 index 432c2f5f253..00000000000 --- a/apps/web/src/components/AccountDrawer/MiniPortfolio/Activity/ActivityTab.anvil.e2e.test.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { createExpectSingleTransaction } from 'playwright/anvil/transactions' -import { expect, getTest } from 'playwright/fixtures' -import { stubTradingApiEndpoint } from 'playwright/fixtures/tradingApi' -import { TEST_WALLET_ADDRESS } from 'playwright/fixtures/wallets' -import { Mocks } from 'playwright/mocks/mocks' -import { USDC_MAINNET } from 'uniswap/src/constants/tokens' -import { uniswapUrls } from 'uniswap/src/constants/urls' -import { ElementName } from 'uniswap/src/features/telemetry/constants' -import { TestID } from 'uniswap/src/test/fixtures/testIDs' - -const test = getTest({ withAnvil: true }) - -test.describe('ActivityTab activity history', () => { - test('should deduplicate activity history by nonce', async ({ page, graphql, anvil }) => { - const expectSingleTransaction = createExpectSingleTransaction({ - anvil, - address: TEST_WALLET_ADDRESS, - options: { blocks: 2 }, - }) - - await stubTradingApiEndpoint({ page, endpoint: uniswapUrls.tradingApiPaths.swap }) - await stubTradingApiEndpoint({ page, endpoint: uniswapUrls.tradingApiPaths.quote }) - await graphql.intercept('ActivityWeb', Mocks.Account.activity_history) - await page.goto(`/swap?inputCurrency=ETH&outputCurrency=${USDC_MAINNET.address}`) - - // Perform swap and verify transaction was submitted - await expectSingleTransaction(async () => { - await page.getByTestId(TestID.AmountInputIn).click() - await page.getByTestId(TestID.AmountInputIn).fill('1') - await expect(page.getByTestId(TestID.AmountInputIn)).toHaveValue('1') - await page.getByTestId(TestID.ReviewSwap).click() - await page.getByTestId(TestID.Swap).click() - await page.getByTestId(TestID.ActivityPopupCloseIcon).click() - }) - - // Open account drawer and navigate to activity tab - await page.getByTestId(TestID.Web3StatusConnected).click() - await page.getByTestId(ElementName.MiniPortfolioActivityTab).click() - - // Wait for activity content to be visible - await expect(page.getByTestId(TestID.ActivityContent)).toBeVisible() - - // Assert that the local pending transaction is replaced by remote transaction with the same nonce - // The "Swapping" text should not exist as it indicates a pending local transaction - await expect(page.getByText('Swapping')).not.toBeVisible() - - // Verify that we have activity content displayed (from the mocked GraphQL response) - await expect(page.getByTestId(TestID.ActivityContent)).toBeVisible() - }) -}) diff --git a/apps/web/src/components/AccountDrawer/MiniPortfolio/Activity/ActivityTab.tsx b/apps/web/src/components/AccountDrawer/MiniPortfolio/Activity/ActivityTab.tsx index b0bcf916c64..fe6f8f27853 100644 --- a/apps/web/src/components/AccountDrawer/MiniPortfolio/Activity/ActivityTab.tsx +++ b/apps/web/src/components/AccountDrawer/MiniPortfolio/Activity/ActivityTab.tsx @@ -1,10 +1,11 @@ import { OpenLimitOrdersButton } from 'components/AccountDrawer/MiniPortfolio/Limits/OpenLimitOrdersButton' import { MenuStateVariant, useSetMenu } from 'components/AccountDrawer/menuState' import { useMemo } from 'react' -import { Flex, ScrollView } from 'ui/src' +import { Flex, Loader, ScrollView } from 'ui/src' import { ActivityItem } from 'uniswap/src/components/activity/generateActivityItemRenderer' import { useActivityData } from 'uniswap/src/features/activity/hooks/useActivityData' import { TestID } from 'uniswap/src/test/fixtures/testIDs' +import { useInfiniteScroll } from 'utilities/src/react/useInfiniteScroll' export default function ActivityTab({ evmOwner, @@ -15,17 +16,19 @@ export default function ActivityTab({ }) { const setMenu = useSetMenu() - const { maybeEmptyComponent, renderActivityItem, sectionData } = useActivityData({ - evmOwner, - svmOwner, - ownerAddresses: [evmOwner, svmOwner].filter(Boolean) as string[], - swapCallbacks: { - useLatestSwapTransaction: () => undefined, - useSwapFormTransactionState: () => undefined, - onRetryGenerator: () => () => {}, - }, - fiatOnRampParams: undefined, - skip: false, + const { maybeEmptyComponent, renderActivityItem, sectionData, fetchNextPage, hasNextPage, isFetchingNextPage } = + useActivityData({ + evmOwner, + svmOwner, + ownerAddresses: [evmOwner, svmOwner].filter(Boolean) as string[], + fiatOnRampParams: undefined, + skip: false, + }) + + const { sentinelRef } = useInfiniteScroll({ + onLoadMore: fetchNextPage, + hasNextPage, + isFetching: isFetchingNextPage, }) const ActivityItems = useMemo(() => { @@ -52,6 +55,14 @@ export default function ActivityTab({ )} {ActivityItems} + {/* Show skeleton loading indicator while fetching next page */} + {isFetchingNextPage && ( + + + + )} + {/* Intersection observer sentinel for infinite scroll */} + ) diff --git a/apps/web/src/components/AccountDrawer/MiniPortfolio/Activity/CancelOrdersDialog.tsx b/apps/web/src/components/AccountDrawer/MiniPortfolio/Activity/CancelOrdersDialog.tsx index 0defc585b6d..9a5e7402481 100644 --- a/apps/web/src/components/AccountDrawer/MiniPortfolio/Activity/CancelOrdersDialog.tsx +++ b/apps/web/src/components/AccountDrawer/MiniPortfolio/Activity/CancelOrdersDialog.tsx @@ -6,12 +6,13 @@ import { ColumnCenter } from 'components/deprecated/Column' import Row from 'components/deprecated/Row' import { LoaderV3 } from 'components/Icons/LoadingSpinner' import { DetailLineItem } from 'components/swap/DetailLineItem' -import styled, { useTheme } from 'lib/styled-components' +import { deprecatedStyled } from 'lib/styled-components' +import { useMemo } from 'react' import { Slash } from 'react-feather' import { Trans, useTranslation } from 'react-i18next' import { ThemedText } from 'theme/components' import { ExternalLink } from 'theme/components/Links' -import { Flex, Text } from 'ui/src' +import { Flex, Text, useSporeColors } from 'ui/src' import { Dialog } from 'uniswap/src/components/dialog/Dialog' import { GetHelpHeader } from 'uniswap/src/components/dialog/GetHelpHeader' import { Modal } from 'uniswap/src/components/modals/Modal' @@ -24,11 +25,11 @@ import { UniswapXOrderDetails } from 'uniswap/src/features/transactions/types/tr import { ExplorerDataType, getExplorerLink } from 'uniswap/src/utils/linking' import { NumberType } from 'utilities/src/format/types' -const ModalHeader = styled(GetHelpHeader)` +const ModalHeader = deprecatedStyled(GetHelpHeader)` padding: 4px 0px; ` -const Container = styled(ColumnCenter)` +const Container = deprecatedStyled(ColumnCenter)` background-color: ${({ theme }) => theme.surface1}; border-radius: 16px; padding: 16px 24px 24px 24px; @@ -56,7 +57,7 @@ function useCancelOrdersDialogContent( state: CancellationState, orders: UniswapXOrderDetails[], ): { title?: JSX.Element; icon: JSX.Element } { - const theme = useTheme() + const colors = useSporeColors() switch (state) { case CancellationState.REVIEWING_CANCELLATION: return { @@ -66,12 +67,12 @@ function useCancelOrdersDialogContent( ) : ( ), - icon: , + icon: , } case CancellationState.PENDING_SIGNATURE: return { title: , - icon: , + icon: , } case CancellationState.PENDING_CONFIRMATION: return { @@ -98,6 +99,22 @@ export function CancelOrdersDialog(props: CancelOrdersDialogProps) { const { title, icon } = useCancelOrdersDialogContent(cancelState, orders) const cancellationGasFeeInfo = useCancelOrdersGasEstimate(orders) + + const primaryButton = useMemo( + () => ({ + text: t('common.neverMind'), + onPress: onCancel, + variant: 'default' as const, + emphasis: 'secondary' as const, + }), + [t, onCancel], + ) + + const secondaryButton = useMemo( + () => ({ text: t('common.proceed'), onPress: onConfirm, variant: 'critical' as const }), + [t, onConfirm], + ) + if ( [CancellationState.PENDING_SIGNATURE, CancellationState.PENDING_CONFIRMATION, CancellationState.CANCELLED].includes( cancelState, @@ -155,18 +172,10 @@ export function CancelOrdersDialog(props: CancelOrdersDialogProps) { } modalName={ModalName.CancelOrders} - primaryButtonText={t('common.neverMind')} - primaryButtonOnClick={onCancel} - primaryButtonVariant="default" - primaryButtonEmphasis="secondary" - secondaryButtonText={t('common.proceed')} - secondaryButtonOnClick={onConfirm} - secondaryButtonVariant="critical" - buttonContainerProps={{ - flexDirection: 'row', - }} + primaryButton={primaryButton} + secondaryButton={secondaryButton} displayHelpCTA - hasIconBackground + iconBackgroundColor="$surface3" > {/* eslint-disable-next-line @typescript-eslint/no-unnecessary-condition */} @@ -185,15 +194,7 @@ function GasEstimateDisplay({ gasEstimateValue, chainId }: { gasEstimateValue?: const gasFeeFormatted = convertFiatAmountFormatted(gasFeeUSD?.toExact(), NumberType.PortfolioBalance) return ( - + , diff --git a/apps/web/src/components/AccountDrawer/MiniPortfolio/Activity/Logos.tsx b/apps/web/src/components/AccountDrawer/MiniPortfolio/Activity/Logos.tsx index 9c5a6081336..1fd9c4c0738 100644 --- a/apps/web/src/components/AccountDrawer/MiniPortfolio/Activity/Logos.tsx +++ b/apps/web/src/components/AccountDrawer/MiniPortfolio/Activity/Logos.tsx @@ -1,8 +1,9 @@ import { LoaderV3 } from 'components/Icons/LoadingSpinner' -import styled, { css, useTheme } from 'lib/styled-components' +import { css, deprecatedStyled } from 'lib/styled-components' import { FadePresence, FadePresenceAnimationType } from 'theme/components/FadePresence' +import { useSporeColors } from 'ui/src' -export const LogoContainer = styled.div` +export const LogoContainer = deprecatedStyled.div` height: 64px; width: 64px; position: relative; @@ -12,7 +13,7 @@ export const LogoContainer = styled.div` overflow: visible; ` -const LoadingIndicator = styled(LoaderV3)` +const LoadingIndicator = deprecatedStyled(LoaderV3)` stroke: ${({ theme }) => theme.neutral3}; fill: ${({ theme }) => theme.neutral3}; width: calc(100% + 8px); @@ -31,7 +32,7 @@ export function LoadingIndicatorOverlay() { } export function ConfirmedIcon({ className }: { className?: string }) { - const theme = useTheme() + const colors = useSporeColors() return ( @@ -53,7 +54,7 @@ export function ConfirmedIcon({ className }: { className?: string }) { } export function SubmittedIcon({ className }: { className?: string }) { - const theme = useTheme() + const colors = useSporeColors() return ( @@ -79,10 +80,10 @@ const IconCss = css` width: 64px; ` -export const AnimatedEntranceConfirmationIcon = styled(ConfirmedIcon)` +export const AnimatedEntranceConfirmationIcon = deprecatedStyled(ConfirmedIcon)` ${IconCss} ` -export const AnimatedEntranceSubmittedIcon = styled(SubmittedIcon)` +export const AnimatedEntranceSubmittedIcon = deprecatedStyled(SubmittedIcon)` ${IconCss} ` diff --git a/apps/web/src/components/AccountDrawer/MiniPortfolio/Activity/OffchainActivityModal.tsx b/apps/web/src/components/AccountDrawer/MiniPortfolio/Activity/OffchainActivityModal.tsx index 01186b48495..28b1df8a0b8 100644 --- a/apps/web/src/components/AccountDrawer/MiniPortfolio/Activity/OffchainActivityModal.tsx +++ b/apps/web/src/components/AccountDrawer/MiniPortfolio/Activity/OffchainActivityModal.tsx @@ -22,14 +22,14 @@ import { useUSDPrice } from 'hooks/useUSDPrice' import { TFunction } from 'i18next' import { atom } from 'jotai' import { useAtomValue, useUpdateAtom } from 'jotai/utils' -import styled, { useTheme } from 'lib/styled-components' +import { deprecatedStyled } from 'lib/styled-components' import { useCallback, useMemo, useState } from 'react' import { ArrowDown } from 'react-feather' import { useTranslation } from 'react-i18next' import { useUniswapXOrderByOrderHash } from 'state/transactions/hooks' import { ThemedText } from 'theme/components' import { Divider } from 'theme/components/Dividers' -import { Button, Flex, TouchableArea } from 'ui/src' +import { Button, Flex, TouchableArea, useSporeColors } from 'ui/src' import { X } from 'ui/src/components/icons/X' import { Modal } from 'uniswap/src/components/modals/Modal' import { InterfaceEventName, ModalName } from 'uniswap/src/features/telemetry/constants' @@ -63,17 +63,17 @@ export function useOpenOffchainActivityModal() { ) } -const Wrapper = styled(AutoColumn).attrs({ gap: 'md', grow: true })` +const Wrapper = deprecatedStyled(AutoColumn).attrs({ gap: 'md', grow: true })` padding: 12px 20px 20px 20px; width: 100%; background-color: ${({ theme }) => theme.surface1}; ` -const OffchainModalDivider = styled(Divider)` +const OffchainModalDivider = deprecatedStyled(Divider)` margin: 28px 0; ` -const InsufficientFundsCopyContainer = styled(Row)` +const InsufficientFundsCopyContainer = deprecatedStyled(Row)` margin-top: 16px; padding: 12px; border: 1.3px solid ${({ theme }) => theme.surface3}; @@ -83,7 +83,7 @@ const InsufficientFundsCopyContainer = styled(Row)` align-items: flex-start; ` -const AlertIconContainer = styled.div` +const AlertIconContainer = deprecatedStyled.div` display: flex; flex-shrink: 0; background-color: ${({ theme }) => theme.deprecated_accentWarning}; @@ -173,7 +173,7 @@ export function OrderContent({ order, onCancel }: { order: UniswapXOrderDetails; const amountsDefined = !!amounts?.inputAmount.currency && !!amounts.outputAmount.currency const fiatValueInput = useUSDPrice(amounts?.inputAmount) const fiatValueOutput = useUSDPrice(amounts?.outputAmount) - const theme = useTheme() + const colors = useSporeColors() const explorerLink = order.hash ? getExplorerLink({ chainId: order.chainId, data: order.hash, type: ExplorerDataType.TRANSACTION }) @@ -241,7 +241,7 @@ export function OrderContent({ order, onCancel }: { order: UniswapXOrderDetails; isLoading={false} headerTextProps={{ fontSize: '24px', lineHeight: '32px' }} /> - + should render limit order text 1`] = ` .c0 { color: #131313; - -webkit-letter-spacing: -0.01em; - -moz-letter-spacing: -0.01em; - -ms-letter-spacing: -0.01em; letter-spacing: -0.01em; } .c1 { cursor: auto; - color: rgba(19,19,19,0.63); + color: rgba(19, 19, 19, 0.63); } .c2 { @@ -19,14 +16,10 @@ exports[`CancelOrdersDialog > should render limit order text 1`] = ` overflow-wrap: break-word; } - + -

{ } } -const TooltipContainer = styled.div<{ size: TooltipSize; padding?: number }>` +const TooltipContainer = deprecatedStyled.div<{ size: TooltipSize; padding?: number }>` max-width: ${({ size }) => size}; width: ${({ size }) => (size === TooltipSize.Max ? 'auto' : `calc(100vw - 16px)`)}; cursor: default; diff --git a/apps/web/src/components/TopLevelBanners/UniswapWrapped2025Banner.tsx b/apps/web/src/components/TopLevelBanners/UniswapWrapped2025Banner.tsx new file mode 100644 index 00000000000..57cf8200a99 --- /dev/null +++ b/apps/web/src/components/TopLevelBanners/UniswapWrapped2025Banner.tsx @@ -0,0 +1,32 @@ +import { FeatureFlags, useFeatureFlag } from '@universe/gating' +import { useLocation, useNavigate } from 'react-router' +import { useAppDispatch, useAppSelector } from 'state/hooks' +import { InterfaceState } from 'state/webReducer' +import { WRAPPED_PATH } from 'uniswap/src/components/banners/shared/utils' +import { UniswapWrapped2025Banner } from 'uniswap/src/components/banners/UniswapWrapped2025Banner/UniswapWrapped2025Banner' +import { selectHasDismissedUniswapWrapped2025Banner } from 'uniswap/src/features/behaviorHistory/selectors' +import { setHasDismissedUniswapWrapped2025Banner } from 'uniswap/src/features/behaviorHistory/slice' + +export function useRenderUniswapWrapped2025Banner(): JSX.Element | null { + const isFeatureFlagEnabled = useFeatureFlag(FeatureFlags.UniswapWrapped2025) + const hasDismissed = useAppSelector((state: InterfaceState) => selectHasDismissedUniswapWrapped2025Banner(state)) + const { pathname } = useLocation() + const isWrappedPage = pathname.startsWith(WRAPPED_PATH) + const dispatch = useAppDispatch() + const navigate = useNavigate() + + const handleDismiss = (): void => { + dispatch(setHasDismissedUniswapWrapped2025Banner(true)) + } + + const handlePress = (): void => { + dispatch(setHasDismissedUniswapWrapped2025Banner(true)) + navigate(WRAPPED_PATH) + } + + if (isFeatureFlagEnabled && !hasDismissed && !isWrappedPage) { + return + } + + return null +} diff --git a/apps/web/src/components/TopLevelModals/index.tsx b/apps/web/src/components/TopLevelModals/index.tsx index 818834c25b9..c708b7c44ac 100644 --- a/apps/web/src/components/TopLevelModals/index.tsx +++ b/apps/web/src/components/TopLevelModals/index.tsx @@ -1,17 +1,24 @@ +import { POPUP_MEDIUM_DISMISS_MS } from 'components/Popups/constants' +import { popupRegistry } from 'components/Popups/registry' +import { PopupType } from 'components/Popups/types' import { ModalRenderer } from 'components/TopLevelModals/modalRegistry' import useAccountRiskCheck from 'hooks/useAccountRiskCheck' import { PageType, useIsPage } from 'hooks/useIsPage' import { PasskeysHelpModalTypeAtom } from 'hooks/usePasskeyAuthWithHelpModal' import { useAtomValue } from 'jotai/utils' +import { useTranslation } from 'react-i18next' import { BridgedAssetModalAtom } from 'uniswap/src/components/BridgedAsset/BridgedAssetModal' import { WormholeModalAtom } from 'uniswap/src/components/BridgedAsset/WormholeModal' +import { ReportTokenIssueModalPropsAtom } from 'uniswap/src/components/reporting/ReportTokenIssueModal' import { useUnitagsAddressQuery } from 'uniswap/src/data/apiClients/unitagsApi/useUnitagsAddressQuery' import { ModalName } from 'uniswap/src/features/telemetry/constants' import { useWallet } from 'uniswap/src/features/wallet/hooks/useWallet' import { shortenAddress } from 'utilities/src/addresses' import { isBetaEnv, isDevEnv } from 'utilities/src/environment/env' +import { useEvent } from 'utilities/src/react/hooks' export default function TopLevelModals() { + const { t } = useTranslation() const isLandingPage = useIsPage(PageType.LANDING) const wallet = useWallet() const evmAddress = wallet.evmAccount?.address @@ -29,6 +36,15 @@ export default function TopLevelModals() { const bridgedAssetModalProps = useAtomValue(BridgedAssetModalAtom) const wormholeModalProps = useAtomValue(WormholeModalAtom) + const reportTokenIssueProps = useAtomValue(ReportTokenIssueModalPropsAtom) + const onReportSuccess = useEvent(() => { + popupRegistry.addPopup( + { type: PopupType.Success, message: t('common.reported') }, + 'report-token-success', + POPUP_MEDIUM_DISMISS_MS, + ) + }) + const shouldShowDevFlags = isDevEnv() || isBetaEnv() // On landing page we need to be very careful about what modals we show @@ -83,6 +99,10 @@ export default function TopLevelModals() { + ) } diff --git a/apps/web/src/components/TopLevelModals/modalRegistry.test.tsx b/apps/web/src/components/TopLevelModals/modalRegistry.test.tsx index ec5fc22d676..62c1c0b78d6 100644 --- a/apps/web/src/components/TopLevelModals/modalRegistry.test.tsx +++ b/apps/web/src/components/TopLevelModals/modalRegistry.test.tsx @@ -20,9 +20,9 @@ vi.mock('components/AccountDrawer/UniwalletModal', () => ({ default: () =>
Uniwallet Modal
, })) -vi.mock('components/Banner/shared/Banners', () => ({ +vi.mock('components/Banner/shared/OutageBanners', () => ({ __esModule: true, - Banners: () =>
Banners
, + OutageBanners: () =>
Outage Banners
, })) vi.mock('components/AccountDrawer/MiniPortfolio/Activity/OffchainActivityModal', () => ({ @@ -80,7 +80,7 @@ describe('ModalRegistry', () => { await act(async () => { render() }) - expect(screen.getByTestId('mock-banners')).toBeInTheDocument() + expect(screen.getByTestId('mock-outage-banners')).toBeInTheDocument() }) it('renders modals with custom props', async () => { diff --git a/apps/web/src/components/TopLevelModals/modalRegistry.tsx b/apps/web/src/components/TopLevelModals/modalRegistry.tsx index a861f540381..f049490c56d 100644 --- a/apps/web/src/components/TopLevelModals/modalRegistry.tsx +++ b/apps/web/src/components/TopLevelModals/modalRegistry.tsx @@ -1,8 +1,10 @@ +import ErrorBoundary from 'components/ErrorBoundary' import { ModalRegistry, ModalWrapperProps } from 'components/TopLevelModals/types' import { useModalState } from 'hooks/useModalState' import { memo, Suspense } from 'react' import { useAppSelector } from 'state/hooks' import { ModalName, ModalNameType } from 'uniswap/src/features/telemetry/constants' +import { logger } from 'utilities/src/logger/logger' import { createLazy } from 'utils/lazyWithRetry' const AddressClaimModal = createLazy(() => import('components/claim/AddressClaimModal')) @@ -11,8 +13,8 @@ const PendingWalletConnectionModal = createLazy( () => import('components/WalletModal/PendingWalletConnectionModal/PendingWalletConnectionModal'), ) const UniwalletModal = createLazy(() => import('components/AccountDrawer/UniwalletModal')) -const Banners = createLazy(() => - import('components/Banner/shared/Banners').then((module) => ({ default: module.Banners })), +const OutageBanners = createLazy(() => + import('components/Banner/shared/OutageBanners').then((module) => ({ default: module.OutageBanners })), ) const OffchainActivityModal = createLazy(() => import('components/AccountDrawer/MiniPortfolio/Activity/OffchainActivityModal').then((module) => ({ @@ -35,7 +37,6 @@ const PrivacyChoicesModal = createLazy(() => import('components/PrivacyChoices').then((module) => ({ default: module.PrivacyChoicesModal })), ) const FeatureFlagModal = createLazy(() => import('components/FeatureFlagModal/FeatureFlagModal')) -const SolanaPromoModal = createLazy(() => import('components/Banner/SolanaPromo/SolanaPromoModal')) const DevFlagsBox = createLazy(() => import('dev/DevFlagsBox')) const TokenNotFoundModal = createLazy(() => import('components/NotFoundModal/TokenNotFoundModal')) const PoolNotFoundModal = createLazy(() => import('components/NotFoundModal/PoolNotFoundModal')) @@ -83,13 +84,34 @@ const WormholeModal = createLazy(() => })), ) -const ModalLoadingFallback = memo(() => null) -ModalLoadingFallback.displayName = 'ModalLoadingFallback' +const ReportTokenModal = createLazy(() => + import('uniswap/src/components/reporting/ReportTokenIssueModal').then((module) => ({ + default: module.ReportTokenIssueModal, + })), +) +function ModalLoadingFallback(): null { + return null +} + +function ModalErrorFallback({ error }: { error: Error }): null { + logger.error(error, { + tags: { + file: 'modalRegistry', + function: 'ModalErrorFallback', + }, + extra: { + message: 'Modal failed to load - error caught by ErrorBoundary. Modal will not be displayed.', + }, + }) + return null +} const ModalWrapper = memo(({ Component, componentProps }: ModalWrapperProps) => ( - }> - - + + }> + + + )) ModalWrapper.displayName = 'ModalWrapper' @@ -108,7 +130,7 @@ export const modalRegistry: ModalRegistry = { shouldMount: () => true, }, [ModalName.Banners]: { - component: Banners, + component: OutageBanners, shouldMount: () => true, }, [ModalName.OffchainActivity]: { @@ -143,10 +165,6 @@ export const modalRegistry: ModalRegistry = { component: FeatureFlagModal, shouldMount: (state) => state.application.openModal?.name === ModalName.FeatureFlags, }, - [ModalName.SolanaPromo]: { - component: SolanaPromoModal, - shouldMount: (state) => state.application.openModal?.name === ModalName.SolanaPromo, - }, [ModalName.AddLiquidity]: { component: IncreaseLiquidityModal, shouldMount: (state) => state.application.openModal?.name === ModalName.AddLiquidity, @@ -199,6 +217,10 @@ export const modalRegistry: ModalRegistry = { component: WormholeModal, shouldMount: (state) => state.application.openModal?.name === ModalName.Wormhole, }, + [ModalName.ReportTokenIssue]: { + component: ReportTokenModal, + shouldMount: (state) => state.application.openModal?.name === ModalName.ReportTokenIssue, + }, } as const export const ModalRenderer = ({ diff --git a/apps/web/src/components/TopLevelModals/types.ts b/apps/web/src/components/TopLevelModals/types.ts index 7b228811d22..07cf60276b2 100644 --- a/apps/web/src/components/TopLevelModals/types.ts +++ b/apps/web/src/components/TopLevelModals/types.ts @@ -1,7 +1,7 @@ import { ComponentProps, ComponentType } from 'react' import { ModalNameType } from 'uniswap/src/features/telemetry/constants' -type ModalComponent = React.LazyExoticComponent> +type ModalComponent = ComponentType interface ModalConfig { component: ModalComponent diff --git a/apps/web/src/components/Toucan/Auction/AuctionStats/AuctionStats.tsx b/apps/web/src/components/Toucan/Auction/AuctionStats/AuctionStats.tsx new file mode 100644 index 00000000000..8534f8eb3d2 --- /dev/null +++ b/apps/web/src/components/Toucan/Auction/AuctionStats/AuctionStats.tsx @@ -0,0 +1,293 @@ +import { AuctionStatsData, FAKE_AUCTION_STATS } from 'components/Toucan/Auction/store/mockData' +import { TFunction } from 'i18next' +import { deprecatedStyled } from 'lib/styled-components' +import { useState } from 'react' +import { useTranslation } from 'react-i18next' +import { CopyHelper } from 'theme/components/CopyHelper' +import { ExternalLink } from 'theme/components/Links' +import { ClickableTamaguiStyle } from 'theme/components/styles' +import { Flex, styled, Text } from 'ui/src' +import { Globe } from 'ui/src/components/icons/Globe' +import { XTwitter } from 'ui/src/components/icons/XTwitter' +import { shortenAddress } from 'utilities/src/addresses' + +interface StatItem { + label: string + value: string | undefined +} + +/** + * Builds the list of stat items to display, filtering out undefined values + * @param stats - The auction stats data + * @param t - Translation function + * @returns Array of stat items with labels and values + */ +function buildStatItems(stats: AuctionStatsData, t: TFunction): StatItem[] { + return [ + { + label: t('toucan.auction.impliedTokenPrice'), + value: + stats.impliedTokenPriceMin && stats.impliedTokenPriceMax + ? `${stats.impliedTokenPriceMin} – ${stats.impliedTokenPriceMax}` + : undefined, + }, + { + label: t('toucan.auction.totalBids'), + value: stats.totalBids.toLocaleString(), + }, + { + label: t('toucan.auction.placeholderStat'), + value: 'xx,xxx', + }, + { + label: t('toucan.auction.placeholderStat'), + value: 'xx,xxx', + }, + { + label: t('toucan.auction.circulatingSupply'), + value: stats.circulatingSupply, + }, + { + label: t('toucan.auction.totalSupply'), + value: stats.totalSupply, + }, + ].filter((item): item is StatItem => Boolean(item.value)) +} + +const STATS_PER_ROW = 3 + +const StatsGrid = styled(Flex, { + width: '100%', + '$platform-web': { + display: 'grid', + gridTemplateColumns: '1fr 1fr 1fr', + }, +}) + +const StatCell = styled(Flex, { + paddingVertical: '$spacing12', + gap: '$spacing2', + borderRightWidth: 1, + borderColor: '$surface3', + $md: { + paddingVertical: '$spacing8', + }, + variants: { + // Position-based variants for grid layout + isLastInRow: { + true: { + borderRightWidth: 0, + }, + }, + isFirstRow: { + true: { + borderBottomWidth: 1, + borderColor: '$surface3', + }, + }, + hasLeftPadding: { + true: { + paddingLeft: '$spacing12', + }, + }, + } as const, +}) + +const InfoRow = styled(Flex, { + width: '100%', + '$platform-web': { + display: 'grid', + gridTemplateColumns: '1fr 1fr 1fr', + }, +}) + +const InfoCell = styled(Flex, { + gap: '$spacing2', + paddingVertical: '$spacing2', + $md: { + paddingVertical: '$spacing2', + }, + variants: { + withBorder: { + true: { + borderLeftWidth: 1, + borderColor: '$surface3', + paddingHorizontal: '$spacing16', + }, + }, + } as const, +}) + +const SocialBadge = styled(Text, { + variant: 'buttonLabel3', + display: 'flex', + flexDirection: 'row', + alignItems: 'center', + gap: '$spacing8', + paddingHorizontal: '$spacing12', + height: 32, + borderRadius: '$rounded20', + backgroundColor: '$surface3', + ...ClickableTamaguiStyle, + color: '$neutral1', +}) + +const CompanyIcon = styled(Flex, { + width: 16, + height: 16, + borderRadius: '$roundedFull', + backgroundColor: '$accent1', + alignItems: 'center', + justifyContent: 'center', +}) + +// Override ExternalLink's pink stroke to prevent it from affecting child SVG icons +const StyledExternalLink = deprecatedStyled(ExternalLink)` + stroke: none; +` + +export const AuctionStats = () => { + const { t } = useTranslation() + const [isDescriptionExpanded, setIsDescriptionExpanded] = useState(false) + const stats = FAKE_AUCTION_STATS + + // TODO | Toucan: use actual data + const statItems = buildStatItems(stats, t) + + const totalStats = statItems.length + + return ( + + {/* Header */} + {t('toucan.auction.stats')} + {/* Stats Table */} + + {statItems.map((item, index) => { + // Calculate grid position for border/padding logic + const col = index % STATS_PER_ROW + const isInFirstRow = index < STATS_PER_ROW + + return ( + STATS_PER_ROW} + hasLeftPadding={col !== 0} + > + + {item.label} + + + {item.value} + + + ) + })} + + + {/* Info Section */} + + {t('toucan.auction.info')} + + {/* Launched by / Launched on / Contract address row */} + + + + {t('toucan.auction.launchedBy')} + + + + + F + + + + {stats.launchedBy.name} + + + + + + + {t('toucan.auction.launchedOn')} + + + {stats.launchedOn} + + + + + + {t('toucan.auction.contractAddress')} + + + + + {shortenAddress({ address: stats.contractAddress, chars: 4 })} + + + + + + + {/* Description */} + + + {t('toucan.auction.description')} + + + {stats.description} + + setIsDescriptionExpanded(!isDescriptionExpanded)} + cursor="pointer" + hoverStyle={{ color: '$neutral1' }} + > + {isDescriptionExpanded ? t('toucan.auction.showLess') : t('toucan.auction.showMore')} + + + + {/* Social badges */} + {/* TODO | Toucan - add analytics tracking for social link clicks */} + + {stats.website && ( + + + + {t('toucan.auction.website')} + + + )} + {stats.twitter && ( + + + + {t('toucan.auction.twitter')} + + + )} + + + + ) +} diff --git a/apps/web/src/components/Toucan/Auction/BidActivities/BidActivities.tsx b/apps/web/src/components/Toucan/Auction/BidActivities/BidActivities.tsx new file mode 100644 index 00000000000..366639b8224 --- /dev/null +++ b/apps/web/src/components/Toucan/Auction/BidActivities/BidActivities.tsx @@ -0,0 +1,42 @@ +import { BidActivity } from 'components/Toucan/Auction/BidActivities/BidActivity' +import { FAKE_BID_ACTIVITIES } from 'components/Toucan/Auction/store/mockData' +import { useAuctionStore } from 'components/Toucan/Auction/store/useAuctionStore' +import { useTranslation } from 'react-i18next' +import { Flex, Text } from 'ui/src' +import { useColorHexFromThemeKey } from 'ui/src/hooks/useColorHexFromThemeKey' + +export const BidActivities = () => { + const { t } = useTranslation() + const displayMode = useAuctionStore((state) => state.displayMode) + const surface1 = useColorHexFromThemeKey('surface1') + + return ( + + {t('toucan.auction.bidActivity')} + + + {FAKE_BID_ACTIVITIES.map((activity, index) => ( + + ))} + + + {/* Gradient overlay - fades from transparent at top to surface1 at bottom */} + + + + ) +} diff --git a/apps/web/src/components/Toucan/Auction/BidActivities/BidActivity.tsx b/apps/web/src/components/Toucan/Auction/BidActivities/BidActivity.tsx new file mode 100644 index 00000000000..1b7989772f2 --- /dev/null +++ b/apps/web/src/components/Toucan/Auction/BidActivities/BidActivity.tsx @@ -0,0 +1,59 @@ +import { useAbbreviatedTimeString } from 'components/Table/utils' +import { BidActivity as BidActivityType } from 'components/Toucan/Auction/store/mockData' +import { DisplayMode } from 'components/Toucan/Auction/store/types' +import { useRef } from 'react' +import { Flex, Text, Unicon } from 'ui/src' +import { ONE_SECOND_MS } from 'utilities/src/time/time' + +interface BidActivityProps { + activity: BidActivityType + displayMode?: DisplayMode // TODO | Toucan: make this required once updated to use this +} + +export const BidActivity = ({ activity }: BidActivityProps) => { + // Convert unix timestamp to relative time string (e.g., "1s ago", "2m ago") + const calculatedTimeAgo = useAbbreviatedTimeString(activity.timestamp * ONE_SECOND_MS) + const timeAgoRef = useRef(calculatedTimeAgo) + const timeAgo = timeAgoRef.current + + // TODO | Toucan: Format price based on displayMode + // - DisplayMode.VALUATION: show as "@ 2.5M" or "@ 2.5B" (market cap) + // - DisplayMode.TOKEN_PRICE: show as "@ $2.50" (fiat price per token with user's selected currency) + const formattedPrice = activity.price // Currently showing mock data, needs proper formatting + + return ( + + {/* Left side: Icon + Bid info */} + + + + + {/* TODO | Toucan: Update to use actual BidToken name instead of hardcoded USDC */} + {activity.bidVolume} USDC + + + @ + + + {formattedPrice} + + + + + {/* Right side: Timestamp */} + + + {timeAgo} + + + + ) +} diff --git a/apps/web/src/components/Toucan/Auction/BidDistributionChart/BidDistributionChart.tsx b/apps/web/src/components/Toucan/Auction/BidDistributionChart/BidDistributionChart.tsx index cacd0a245c8..572af7fc5b0 100644 --- a/apps/web/src/components/Toucan/Auction/BidDistributionChart/BidDistributionChart.tsx +++ b/apps/web/src/components/Toucan/Auction/BidDistributionChart/BidDistributionChart.tsx @@ -1,10 +1,103 @@ +import { BidDistributionChartFooter } from 'components/Toucan/Auction/BidDistributionChart/BidDistributionChartFooter' import { BidDistributionChartHeader } from 'components/Toucan/Auction/BidDistributionChart/BidDistributionChartHeader' -import { Flex } from 'ui/src' +import { BidDistributionChartRenderer } from 'components/Toucan/Auction/BidDistributionChart/BidDistributionChartRenderer' +import { generateChartData } from 'components/Toucan/Auction/BidDistributionChart/utils/utils' +import { useBidTokenInfo } from 'components/Toucan/Auction/hooks/useBidTokenInfo' +import { FAKE_AUCTION_DATA } from 'components/Toucan/Auction/store/mockData' +import { useMockDataStore } from 'components/Toucan/Auction/store/mocks/useMockDataStore' +import { useAuctionStore } from 'components/Toucan/Auction/store/useAuctionStore' +import { useMemo } from 'react' +import { Flex, Text } from 'ui/src' +import { EVMUniverseChainId } from 'uniswap/src/features/chains/types' +import { logger } from 'utilities/src/logger/logger' export const BidDistributionChart = () => { + const { displayMode, tokenColor } = useAuctionStore((state) => ({ + displayMode: state.displayMode, + tokenColor: state.tokenColor, + })) + // TODO | Toucan: Remove mock data store usage once live + const { selectedDataset, selectedDatasetIndex, bidTokenAddress, tickSize, clearingPrice, totalSupply } = + useMockDataStore() + + const { + bidTokenInfo, + loading: bidTokenLoading, + error: bidTokenError, + } = useBidTokenInfo(bidTokenAddress, FAKE_AUCTION_DATA.chainId) + + // Calculate chart data once - shared between header and renderer + // Use a simple formatter here since the renderer will apply proper formatting + const chartData = useMemo( + () => + bidTokenInfo + ? generateChartData({ + bidData: selectedDataset, + bidTokenInfo, + displayMode, + totalSupply, + auctionTokenDecimals: FAKE_AUCTION_DATA.tokenDecimals, + clearingPrice, + tickSize, + formatter: (amount: number) => amount.toString(), + }) + : null, + [displayMode, selectedDataset, bidTokenInfo, clearingPrice, tickSize, totalSupply], + ) + + // TODO | Toucan - get error state from design + add translation + // Show error state if bid token info fetch failed + if (bidTokenError) { + logger.error(bidTokenError, { + tags: { file: 'BidDistributionChart', function: 'useBidTokenInfo' }, + extra: { bidTokenAddress, chainId: FAKE_AUCTION_DATA.chainId }, + }) + return ( + + + Failed to load bid token data + + + ) + } + + // TODO | Toucan - get loading state from design + add translation + // Show loading state while fetching bid token info + if (bidTokenLoading || !bidTokenInfo || !chartData) { + return ( + + + Loading bid token data... + + + ) + } + return ( - - + + + + ) } diff --git a/apps/web/src/components/Toucan/Auction/BidDistributionChart/BidDistributionChartFooter.tsx b/apps/web/src/components/Toucan/Auction/BidDistributionChart/BidDistributionChartFooter.tsx new file mode 100644 index 00000000000..27ebeeb0394 --- /dev/null +++ b/apps/web/src/components/Toucan/Auction/BidDistributionChart/BidDistributionChartFooter.tsx @@ -0,0 +1,55 @@ +import { BlockUpdateCountdown } from 'components/Toucan/Auction/BidDistributionChart/BlockUpdateCountdown' +import { BidConcentrationResult } from 'components/Toucan/Auction/BidDistributionChart/utils/bidConcentration' +import { AuctionProgressState } from 'components/Toucan/Auction/store/types' +import { useAuctionStore } from 'components/Toucan/Auction/store/useAuctionStore' +import { useTranslation } from 'react-i18next' +import { Flex, styled, Text } from 'ui/src' +import { EVMUniverseChainId } from 'uniswap/src/features/chains/types' + +const ColorDot = styled(Flex, { + width: 8, + height: 8, + borderRadius: '$roundedFull', +}) + +const HorizontalLine = styled(Flex, { + width: '100%', + height: 1, + backgroundColor: '$surface3', +}) + +interface BidDistributionChartFooterProps { + concentration: BidConcentrationResult | null + chainId: EVMUniverseChainId | undefined +} + +export const BidDistributionChartFooter = ({ concentration, chainId }: BidDistributionChartFooterProps) => { + const { t } = useTranslation() + const tokenColor = useAuctionStore((state) => state.tokenColor) + const auctionState = useAuctionStore((state) => state.progress.state) + + // Hide concentration percentage when auction hasn't started + const shouldShowConcentration = auctionState !== AuctionProgressState.NOT_STARTED && concentration + + return ( + + + + {shouldShowConcentration ? ( + + + + {t('toucan.auction.bidVolume', { percentage: Math.round(concentration.percentage * 100) })} + + + ) : null} + + + + ) +} diff --git a/apps/web/src/components/Toucan/Auction/BidDistributionChart/BidDistributionChartHeader.tsx b/apps/web/src/components/Toucan/Auction/BidDistributionChart/BidDistributionChartHeader.tsx index d6fa6c523f0..f5f20f53187 100644 --- a/apps/web/src/components/Toucan/Auction/BidDistributionChart/BidDistributionChartHeader.tsx +++ b/apps/web/src/components/Toucan/Auction/BidDistributionChart/BidDistributionChartHeader.tsx @@ -1,9 +1,15 @@ -import { DisplayMode } from 'components/Toucan/Auction/store/types' +import { MockDataSelectorModal } from 'components/Toucan/Auction/BidDistributionChart/dev/MockDataSelectorModal' +import { BidConcentrationResult } from 'components/Toucan/Auction/BidDistributionChart/utils/bidConcentration' +import { formatTickForDisplay } from 'components/Toucan/Auction/BidDistributionChart/utils/utils' +import { AuctionProgressState, BidTokenInfo, DisplayMode } from 'components/Toucan/Auction/store/types' import { useAuctionStore, useAuctionStoreActions } from 'components/Toucan/Auction/store/useAuctionStore' import { useTranslation } from 'react-i18next' import { Flex, SegmentedControl, Text, TouchableArea } from 'ui/src' +import { AnglesMaximize } from 'ui/src/components/icons/AnglesMaximize' import { QuestionInCircleFilled } from 'ui/src/components/icons/QuestionInCircleFilled' import { InfoTooltip } from 'uniswap/src/components/tooltip/InfoTooltip' +import { useLocalizationContext } from 'uniswap/src/features/language/LocalizationContext' +import { NumberType } from 'utilities/src/format/types' const BidDistributionChartHeaderTooltip = () => { const { t } = useTranslation() @@ -29,12 +35,26 @@ const BidDistributionChartHeaderTooltip = () => { ) } -export const BidDistributionChartHeader = () => { +interface BidDistributionChartHeaderProps { + concentration: BidConcentrationResult | null + displayMode: DisplayMode + bidTokenInfo: BidTokenInfo + totalSupply?: string + auctionTokenDecimals?: number +} + +export const BidDistributionChartHeader = ({ + concentration, + displayMode, + bidTokenInfo, + totalSupply, + auctionTokenDecimals = 18, +}: BidDistributionChartHeaderProps) => { const { t } = useTranslation() - const { displayMode } = useAuctionStore((state) => ({ - displayMode: state.displayMode, - })) - const { setDisplayMode } = useAuctionStoreActions() + const { setDisplayMode, resetChartZoom } = useAuctionStoreActions() + const { convertFiatAmountFormatted } = useLocalizationContext() + const isZoomed = useAuctionStore((state) => state.chartZoomState.isZoomed) + const auctionState = useAuctionStore((state) => state.progress.state) const displayModeOptions = [ { @@ -51,14 +71,49 @@ export const BidDistributionChartHeader = () => { setDisplayMode(option) } + // Format concentration range values with user's selected currency + const formatter = (amount: number): string => { + return convertFiatAmountFormatted(amount, NumberType.FiatTokenStats) + } + + const startValue = concentration + ? formatTickForDisplay({ + tickValue: concentration.startTick, + displayMode, + bidTokenInfo, + totalSupply, + auctionTokenDecimals, + formatter, + }) + : null + + const endValue = concentration + ? formatTickForDisplay({ + tickValue: concentration.endTick, + displayMode, + bidTokenInfo, + totalSupply, + auctionTokenDecimals, + formatter, + }) + : null + return ( - - + + {t('toucan.auction.bidConcentration')} + {/* TODO | Toucan: Remove mock data selector once live */} + + {/* Reset zoom button - only visible when chart is zoomed */} + {isZoomed && ( + + + + )} { size="xsmall" /> - - $1.0M - - - - - $2.5M - + {auctionState === AuctionProgressState.NOT_STARTED ? ( + + + -- + + + ) : concentration && startValue && endValue ? ( + + {startValue} + + - + + {endValue} + + ) : ( + + + {t('toucan.auction.noConcentration')} + + + )} ) } diff --git a/apps/web/src/components/Toucan/Auction/BidDistributionChart/BidDistributionChartPlaceholder.tsx b/apps/web/src/components/Toucan/Auction/BidDistributionChart/BidDistributionChartPlaceholder.tsx new file mode 100644 index 00000000000..c22303e4760 --- /dev/null +++ b/apps/web/src/components/Toucan/Auction/BidDistributionChart/BidDistributionChartPlaceholder.tsx @@ -0,0 +1,50 @@ +import { useTranslation } from 'react-i18next' +import { Flex, styled, Text } from 'ui/src' +import { zIndexes } from 'ui/src/theme' + +const PlaceholderBar = styled(Flex, { + width: '100%', + backgroundColor: '$surface2', + borderTopLeftRadius: '$rounded6', + borderTopRightRadius: '$rounded6', + flexShrink: 1, + flexGrow: 1, + flexBasis: 0, + mx: '$spacing2', +}) + +interface BidDistributionChartPlaceholderProps { + height?: number +} + +export function BidDistributionChartPlaceholder({ height = 400 }: BidDistributionChartPlaceholderProps) { + const { t } = useTranslation() + const shortestBarHeight = 20 + const patternIterations = 3 + + const pattern = [1, 1.25, 1.5, 1.75, 1.75, 1.5] + const barHeights = Array.from( + { length: patternIterations * pattern.length }, + (_, i) => shortestBarHeight * pattern[i % pattern.length], + ) + + return ( + + {barHeights.map((barHeight, index) => ( + + ))} + + + {t('toucan.auction.notStarted')} + + + + ) +} diff --git a/apps/web/src/components/Toucan/Auction/BidDistributionChart/BidDistributionChartRenderer.tsx b/apps/web/src/components/Toucan/Auction/BidDistributionChart/BidDistributionChartRenderer.tsx new file mode 100644 index 00000000000..59e3f2deecf --- /dev/null +++ b/apps/web/src/components/Toucan/Auction/BidDistributionChart/BidDistributionChartRenderer.tsx @@ -0,0 +1,770 @@ +/* eslint-disable max-lines */ +import { ToucanChartData } from 'components/Charts/ToucanChart/renderer' +import { ToucanChartSeries } from 'components/Charts/ToucanChart/toucan-chart-series' +import { BidDistributionChartPlaceholder } from 'components/Toucan/Auction/BidDistributionChart/BidDistributionChartPlaceholder' +import { + CHART_PADDING, + CHART_SCALE_MARGINS, + COORDINATE_SCALING, + LABEL_CONFIG, + ZOOM_DEFAULTS, + ZOOM_TOLERANCE, +} from 'components/Toucan/Auction/BidDistributionChart/constants' +import { useChartDimensions } from 'components/Toucan/Auction/BidDistributionChart/hooks/useChartDimensions' +import { useChartLabels } from 'components/Toucan/Auction/BidDistributionChart/hooks/useChartLabels' +import { useChartTooltip } from 'components/Toucan/Auction/BidDistributionChart/hooks/useChartTooltip' +import { BidConcentrationResult } from 'components/Toucan/Auction/BidDistributionChart/utils/bidConcentration' +import { formatClearingPriceLabel } from 'components/Toucan/Auction/BidDistributionChart/utils/clearingPrice/label' +import { + calculateInitialVisibleRange, + generateChartData, +} from 'components/Toucan/Auction/BidDistributionChart/utils/utils' +import { + AuctionProgressState, + BidDistributionData, + BidTokenInfo, + DisplayMode, +} from 'components/Toucan/Auction/store/types' +import { useAuctionStore, useAuctionStoreActions } from 'components/Toucan/Auction/store/useAuctionStore' +import { deprecatedStyled } from 'lib/styled-components' +import { ColorType, createChart, IChartApi, ISeriesApi, LineStyle, UTCTimestamp } from 'lightweight-charts' +import { useCallback, useEffect, useMemo, useRef } from 'react' +import { Flex, useSporeColors } from 'ui/src' +import { UseSporeColorsReturn } from 'ui/src/hooks/useSporeColors' +import { opacify } from 'ui/src/theme' +import { useLocalizationContext } from 'uniswap/src/features/language/LocalizationContext' +import { NumberType } from 'utilities/src/format/types' +import { logger } from 'utilities/src/logger/logger' +import { formatUnits } from 'viem' + +const ChartContainer = deprecatedStyled.div<{ height: number }>` + width: 100%; + height: ${({ height }) => height}px; + + /* Add padding to lightweight-charts container to prevent top label cutoff */ + .tv-lightweight-charts { + padding-top: 10px; + } + + /* Shift y-axis canvas closer to the chart */ + .tv-lightweight-charts td:first-child canvas { + left: 5px !important; + top: -5px !important; + } + + /* Prevent y-axis labels from being cut off */ + .tv-lightweight-charts td:first-child > div { + overflow: visible !important; + } +` + +interface CrosshairMoveParams { + point?: { x: number; y: number } + time?: number | string + seriesData: Map, ToucanChartData> +} + +/** + * Creates chart configuration options + * Extracted as a pure function for testability + */ +function createChartOptions(params: { + width: number + height: number + colors: UseSporeColorsReturn + priceFormatter: (price: number) => string +}) { + const { width, height, colors, priceFormatter } = params + return { + width, + height, + layout: { + background: { type: ColorType.Solid, color: 'transparent' }, + textColor: colors.neutral2.val, + fontSize: 10, + }, + grid: { + vertLines: { visible: false }, + horzLines: { color: colors.surface3Solid.val, style: LineStyle.SparseDotted }, + }, + leftPriceScale: { + visible: true, + borderVisible: false, // Hide y-axis border + textColor: colors.neutral2.val, + minimumWidth: 40, // Reduce left padding by setting a smaller minimum width for the y-axis + }, + rightPriceScale: { + visible: false, + }, + timeScale: { + visible: true, + borderVisible: true, // Show border (left line) as solid + borderColor: colors.surface3Solid.val, // Same color as grid lines + fixLeftEdge: true, + fixRightEdge: true, + lockVisibleTimeRangeOnResize: true, + rightBarStaysOnScroll: false, + timeVisible: false, + secondsVisible: false, + tickMarkFormatter: () => '', + }, + crosshair: { + horzLine: { + visible: true, + style: LineStyle.Dashed, + width: 1 as const, + color: colors.neutral3.val, + labelVisible: true, + }, + vertLine: { + visible: true, + style: LineStyle.Dashed, + width: 1 as const, + color: colors.neutral3.val, + labelVisible: false, + }, + }, + handleScroll: { + mouseWheel: true, + pressedMouseMove: true, + horzTouchDrag: true, + vertTouchDrag: false, + }, + handleScale: { + mouseWheel: true, + pinch: true, + axisPressedMouseMove: { + time: true, + price: false, + }, + }, + localization: { + priceFormatter, + }, + } +} + +interface BidDistributionChartRendererProps { + bidData: BidDistributionData + bidTokenInfo: BidTokenInfo + displayMode: DisplayMode + totalSupply?: string + auctionTokenDecimals?: number + clearingPrice: string + tickSize: string + tokenColor?: string + height?: number + preCalculatedConcentration: BidConcentrationResult | null +} + +export function BidDistributionChartRenderer({ + bidData, + bidTokenInfo, + displayMode, + totalSupply, + auctionTokenDecimals = 18, + clearingPrice, + tickSize, + tokenColor, + height = 400, + preCalculatedConcentration, +}: BidDistributionChartRendererProps) { + const auctionState = useAuctionStore((state) => state.progress.state) + const chartContainerRef = useRef(null) + const chartRef = useRef(null) + const seriesRef = useRef | null>(null) + const tooltipRef = useRef(null) + const labelsLayerRef = useRef(null) + const shouldAnimateRef = useRef(false) + + const colors = useSporeColors() + const { convertFiatAmountFormatted } = useLocalizationContext() + + // Get zoom state and actions from store + const chartZoomState = useAuctionStore((state) => state.chartZoomState) + const { setChartZoomState } = useAuctionStoreActions() + + // Y-axis formatter: Uses localization with currency symbol for bid amounts + const formatYAxisLabel = useCallback( + (amount: number): string => { + return convertFiatAmountFormatted(amount, NumberType.FiatTokenStats) + }, + [convertFiatAmountFormatted], + ) + + // X-axis formatter: No currency symbol, removes trailing zeros (e.g., $1.00 → 1, $1.50 → 1.5) + const formatXAxisLabel = useCallback( + (amount: number): string => { + // Use localization but without currency + const formatted = convertFiatAmountFormatted(amount, NumberType.FiatTokenStats) + + // Extract just the numeric part by removing non-numeric characters except . and , + const numericPart = formatted.replace(/[^\d.,\s]/g, '').trim() + + // Parse and re-format to remove unnecessary trailing zeros + const num = parseFloat(numericPart.replace(/,/g, '')) + if (isNaN(num)) { + return numericPart + } + + // Format with minimal decimal places, removing trailing zeros + return num.toString() + }, + [convertFiatAmountFormatted], + ) + + // Tooltip formatter: Includes currency symbol and K/M/B suffixes + const formatTooltipLabel = useCallback( + (amount: number): string => { + // For tokenPrice mode: show currency symbol (e.g., $1.50) + // For valuation mode: show with K/M/B suffix (e.g., $1.5M) + return convertFiatAmountFormatted(amount, NumberType.FiatTokenStats) + }, + [convertFiatAmountFormatted], + ) + + // Convert tick size to decimal for use throughout component + const tickSizeDecimal = useMemo( + () => Number(formatUnits(BigInt(tickSize), bidTokenInfo.decimals)), + [tickSize, bidTokenInfo.decimals], + ) + + // Convert clearing price to decimal + const clearingPriceDecimal = useMemo( + () => Number(formatUnits(BigInt(clearingPrice), bidTokenInfo.decimals)), + [clearingPrice, bidTokenInfo.decimals], + ) + + // Generate chart data (uses X-axis formatter for tick display strings) + // TODO | Toucan - Performance: generateChartData calculates concentration internally but we + // immediately override it with preCalculatedConcentration. Consider adding a skipConcentration + // flag to generateChartData to avoid duplicate sliding-window calculation. + const { bars, minTick, maxTick, labelIncrement, concentration } = useMemo(() => { + const chartData = generateChartData({ + bidData, + bidTokenInfo, + displayMode, + totalSupply, + auctionTokenDecimals, + clearingPrice, + tickSize, + formatter: formatXAxisLabel, + }) + + // Always use pre-calculated concentration from parent to ensure indices match across components + return { ...chartData, concentration: preCalculatedConcentration } + }, [ + bidData, + bidTokenInfo, + displayMode, + totalSupply, + auctionTokenDecimals, + clearingPrice, + tickSize, + formatXAxisLabel, + preCalculatedConcentration, + ]) + + const { getPlotDimensions } = useChartDimensions() + const { renderLabels } = useChartLabels({ + minTick, + maxTick, + labelIncrement, + tickSize: tickSizeDecimal, + displayMode, + bidTokenInfo, + totalSupply, + auctionTokenDecimals, + formatter: formatXAxisLabel, + colors, + }) + const { createTooltipElement, formatTooltipText } = useChartTooltip({ + displayMode, + bidTokenInfo, + totalSupply, + auctionTokenDecimals, + formatter: formatTooltipLabel, + volumeFormatter: formatYAxisLabel, // Use Y-axis formatter for volume (bid amounts) + colors, + }) + + // Store min/max time for axis calculations + const minTimeRef = useRef(null) + const maxTimeRef = useRef(null) + + /** + * Creates the labels layer DOM element + */ + const createLabelsLayer = useCallback((): HTMLDivElement => { + const labelsLayer = document.createElement('div') + Object.assign(labelsLayer.style, { + position: 'absolute', + left: '0', + bottom: `${LABEL_CONFIG.BOTTOM_POSITION}px`, + width: '100%', + height: `${LABEL_CONFIG.HEIGHT}px`, + pointerEvents: 'none', + display: 'flex', + alignItems: 'flex-end', + justifyContent: 'stretch', + overflow: 'hidden', // Clip labels at plot area boundaries + }) + return labelsLayer + }, []) + + /** + * Updates custom labels when chart changes + */ + const updateCustomLabels = useCallback(() => { + if (!labelsLayerRef.current || !chartRef.current) { + return + } + + // Update labels layer dimensions to match plot area (prevents label overflow) + const plotDimensions = getPlotDimensions(chartContainerRef.current, chartRef.current) + labelsLayerRef.current.style.left = `${plotDimensions.left}px` + labelsLayerRef.current.style.width = `${plotDimensions.width}px` + + // Since labels layer now starts at plotLeft, individual labels should be positioned + // relative to the layer (at x) rather than relative to the container (x + plotLeft) + renderLabels({ labelsLayer: labelsLayerRef.current, chart: chartRef.current, plotLeft: 0 }) + }, [getPlotDimensions, renderLabels]) + + /** + * Formats the clearing price label for display on the chart + * Uses tooltip formatter to include currency symbols and FDV suffix + */ + const clearingPriceLabel = useMemo(() => { + return formatClearingPriceLabel({ + clearingPrice: clearingPriceDecimal, + displayMode, + bidTokenInfo, + totalSupply, + auctionTokenDecimals, + formatter: formatTooltipLabel, + }) + }, [clearingPriceDecimal, displayMode, bidTokenInfo, totalSupply, auctionTokenDecimals, formatTooltipLabel]) + + /** + * Converts bars to histogram data format + */ + const histogramData = useMemo((): ToucanChartData[] => { + return bars.map((bar) => ({ + time: Math.round(bar.tick * COORDINATE_SCALING.PRICE_SCALE_FACTOR) as UTCTimestamp, + value: bar.amount, + tickValue: bar.tick, // Store original tick value for color comparison + })) + }, [bars]) + + // TODO | Toucan -- this useEffect has too many responsibilities + // Once final functionality is decided on, refactor to smaller single responsibility code blocks + // biome-ignore lint/correctness/useExhaustiveDependencies: Only include dependencies that should cause a full chart recreation. + useEffect(() => { + if (!chartContainerRef.current) { + return undefined + } + + let chart: IChartApi + try { + const chartOptions = createChartOptions({ + width: chartContainerRef.current.clientWidth, + height, + colors, + priceFormatter: formatYAxisLabel, + }) + chart = createChart(chartContainerRef.current, chartOptions) + } catch (error) { + logger.error(error, { + tags: { + file: 'BidDistributionChartRenderer', + function: 'BidDistributionChartRenderer', + }, + }) + return () => { + // Ensure animation is stopped even if chart creation failed + shouldAnimateRef.current = false + } + } + + // Prepare bar colors with tokenColor or fallback to colors.accent1.val + const effectiveTokenColor = tokenColor || colors.accent1.val + const barColors = { + clearingPriceColor: effectiveTokenColor, + aboveClearingPriceColor: opacify(40, effectiveTokenColor), + belowClearingPriceColor: colors.neutral3.val, + } + + // Prepare label colors for clearing price label (supports light/dark themes) + const labelColors = { + background: colors.surface2.val, + border: colors.surface3.val, + text: colors.neutral1.val, + } + + // Prepare label styles for clearing price label + // Note: Canvas rendering requires a CSS font-family string. The theme only provides + // `fonts.code` for monospace, but we need the default system font stack for UI text. + // This matches the standard web font fallback stack used throughout the app. + const labelStyles = { + fontFamily: '-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif', + } + + // Create custom series with concentration band info and clearing price label + const customSeries = chart.addCustomSeries( + new ToucanChartSeries({ + barColors, + labelColors, + labelStyles, + clearingPrice: clearingPriceDecimal, + tickSize: tickSizeDecimal, + concentrationBand: concentration + ? { + startIndex: concentration.startIndex, + endIndex: concentration.endIndex, + startTick: concentration.startTick, + endTick: concentration.endTick, + } + : null, + clearingPriceLabel, + }), + { + priceScaleId: 'left', + priceLineVisible: false, // Hide the default price line + lastValueVisible: false, // Hide the last value label + }, + ) + + customSeries.setData(histogramData) + + // Store min/max price (in scaled coordinate units) for axis range calculations + // Note: Using 'time' terminology due to lightweight-charts API, but these represent prices + if (histogramData.length > 0) { + minTimeRef.current = histogramData[0].time + maxTimeRef.current = histogramData[histogramData.length - 1].time + } + + // Create and append labels layer + const labelsLayer = createLabelsLayer() + chartContainerRef.current.appendChild(labelsLayer) + labelsLayerRef.current = labelsLayer + + // Create and append tooltip + const tooltip = createTooltipElement() + chartContainerRef.current.style.position = 'relative' + chartContainerRef.current.appendChild(tooltip) + tooltipRef.current = tooltip + + // TODO | Toucan - extract crosshair to separate function + // Crosshair handler for tooltip + const crosshairHandler = (param: unknown) => { + if (!tooltipRef.current) { + return + } + const tooltip = tooltipRef.current + + // Type guard to ensure param has expected structure + if (!param || typeof param !== 'object') { + tooltip.style.display = 'none' + return + } + + const typedParam = param as CrosshairMoveParams + const point = typedParam.point + + if (!point || !typedParam.time) { + tooltip.style.display = 'none' + return + } + + const data = typedParam.seriesData.get(customSeries) + if (!data) { + tooltip.style.display = 'none' + return + } + + // Convert time (scaled units) back to price value and format + const tickValue = Number(data.time) / COORDINATE_SCALING.PRICE_SCALE_FACTOR + const volumeAmount = data.value // Bid volume in USD + + // Hide horizontal crosshair line (y-axis indicator) for zero values + chart.applyOptions({ + crosshair: { + horzLine: { + labelVisible: volumeAmount > 0, + }, + }, + }) + + tooltip.textContent = formatTooltipText(tickValue, volumeAmount) + + // Calculate tooltip position with edge detection + if (!chartContainerRef.current) { + return + } + + const containerRect = chartContainerRef.current.getBoundingClientRect() + const tooltipRect = tooltip.getBoundingClientRect() + + // Adjust horizontal position if tooltip would be cut off + let adjustedX = point.x + const halfTooltipWidth = tooltipRect.width / 2 + + if (point.x + halfTooltipWidth > containerRect.width) { + // Too close to right edge + adjustedX = containerRect.width - halfTooltipWidth + } else if (point.x - halfTooltipWidth < 0) { + // Too close to left edge + adjustedX = halfTooltipWidth + } + + // Adjust vertical position if tooltip would be cut off + let adjustedY = point.y + const tooltipHeight = tooltipRect.height + + if (point.y - tooltipHeight < 0) { + // Too close to top edge + adjustedY = tooltipHeight + } else if (point.y > containerRect.height) { + // Too close to bottom edge + adjustedY = containerRect.height + } + + tooltip.style.left = `${adjustedX}px` + tooltip.style.top = `${adjustedY}px` + tooltip.style.display = 'block' + } + chart.subscribeCrosshairMove(crosshairHandler) + + // Configure Y-axis (bid amounts in USD) + // Note: In lightweight-charts, priceScale() always controls the Y-axis + chart.priceScale('left').applyOptions({ + scaleMargins: { + top: CHART_SCALE_MARGINS.TOP, + bottom: CHART_SCALE_MARGINS.BOTTOM, + }, + autoScale: true, // Automatically scale to fit data + }) + + // Configure X-axis visible range (token prices in scaled coordinate units) + // Note: In lightweight-charts, timeScale() always controls the X-axis, even though + // we're displaying prices (not time). This is a library architecture constraint. + + // Calculate initial visible range: clearing price + INITIAL_TICK_COUNT ticks + const initialRange = calculateInitialVisibleRange({ + clearingPrice: clearingPriceDecimal, + minTick, + maxTick, + tickSize: tickSizeDecimal, + initialTickCount: ZOOM_DEFAULTS.INITIAL_TICK_COUNT, + }) + + // Convert initial range to scaled coordinates + const initialFromScaled = Math.round(initialRange.from * COORDINATE_SCALING.PRICE_SCALE_FACTOR) as UTCTimestamp + const initialToScaled = Math.round(initialRange.to * COORDINATE_SCALING.PRICE_SCALE_FACTOR) as UTCTimestamp + + // Apply stored zoom state if it exists, otherwise use initial range + // TODO | Toucan - determine if zoom should be reset in certain cases (like when new data comes in, or always retain saved zoom level) + if (chartZoomState.visibleRange && minTimeRef.current !== null && maxTimeRef.current !== null) { + // Use stored zoom state + chart.timeScale().setVisibleRange({ + from: chartZoomState.visibleRange.from as UTCTimestamp, + to: chartZoomState.visibleRange.to as UTCTimestamp, + }) + } else if (minTimeRef.current !== null && maxTimeRef.current !== null) { + // Use initial calculated range + chart.timeScale().setVisibleRange({ + from: initialFromScaled, + to: initialToScaled, + }) + } + + // Initial render of labels (defer to next frame to ensure chart is fully laid out) + requestAnimationFrame(() => { + updateCustomLabels() + }) + + chartRef.current = chart + seriesRef.current = customSeries + + // Handle resize + const handleResize = () => { + if (chartContainerRef.current) { + chart.applyOptions({ + width: chartContainerRef.current.clientWidth, + }) + updateCustomLabels() + } + } + + // Subscribe to range changes for label updates + const visibleRangeHandler = () => updateCustomLabels() + chart.timeScale().subscribeVisibleTimeRangeChange(visibleRangeHandler) + const logicalRangeHandler = () => updateCustomLabels() + chart.timeScale().subscribeVisibleLogicalRangeChange(logicalRangeHandler) + + // Subscribe to visible range changes for zoom state tracking + const zoomStateHandler = () => { + const currentRange = chart.timeScale().getVisibleRange() + if (!currentRange || minTimeRef.current === null || maxTimeRef.current === null) { + return + } + + let from = currentRange.from as number + let to = currentRange.to as number + + // Calculate the full data range with padding (what "reset zoom" would show) + const fullFrom = minTimeRef.current - CHART_PADDING.RANGE_PAD_UNITS + const fullTo = maxTimeRef.current + CHART_PADDING.RANGE_PAD_UNITS + const currentRangeSize = to - from + + // Constrain visible range to data boundaries + // Don't allow scrolling past the min/max - the edges must stay at or beyond the data bounds + let needsCorrection = false + + // If trying to scroll left past the minimum + if (from < fullFrom) { + from = fullFrom + to = from + currentRangeSize + needsCorrection = true + } + + // If trying to scroll right past the maximum + if (to > fullTo) { + to = fullTo + from = to - currentRangeSize + needsCorrection = true + } + + // Double-check: if the range is now too large (showing more than full data), clamp it + if (from < fullFrom) { + from = fullFrom + needsCorrection = true + } + + // If we had to correct the range, apply it + if (needsCorrection) { + chart.timeScale().setVisibleRange({ + from: from as UTCTimestamp, + to: to as UTCTimestamp, + }) + return // Will trigger another call with corrected range + } + + // Calculate the range of the full data + const fullRange = fullTo - fullFrom + + // Determine if user is zoomed in (current range is significantly smaller than full range) + // Or if the visible range doesn't match the full range + const isZoomedIn = + Math.abs(from - fullFrom) > fullRange * ZOOM_TOLERANCE || + Math.abs(to - fullTo) > fullRange * ZOOM_TOLERANCE || + Math.abs(currentRangeSize - fullRange) > fullRange * ZOOM_TOLERANCE + + // Update store with new zoom state + setChartZoomState({ + visibleRange: { from, to }, + isZoomed: isZoomedIn, + }) + } + chart.timeScale().subscribeVisibleTimeRangeChange(zoomStateHandler) + + window.addEventListener('resize', handleResize) + + // Animation loop for clearing price stripes + let animationFrameId: number | null = null + shouldAnimateRef.current = true + + const animate = () => { + // Check if animation should continue + if (!shouldAnimateRef.current) { + animationFrameId = null + return + } + + if (chartRef.current && seriesRef.current) { + // Trigger redraw by updating the series + customSeries.applyOptions({}) + } + animationFrameId = requestAnimationFrame(animate) + } + + // Start animation + animationFrameId = requestAnimationFrame(animate) + + // Cleanup + return () => { + // Signal animation to stop + shouldAnimateRef.current = false + + if (animationFrameId !== null) { + cancelAnimationFrame(animationFrameId) + animationFrameId = null + } + + window.removeEventListener('resize', handleResize) + chart.timeScale().unsubscribeVisibleTimeRangeChange(visibleRangeHandler) + chart.timeScale().unsubscribeVisibleLogicalRangeChange(logicalRangeHandler) + chart.timeScale().unsubscribeVisibleTimeRangeChange(zoomStateHandler) + chart.unsubscribeCrosshairMove(crosshairHandler) + + if (tooltipRef.current && chartContainerRef.current?.contains(tooltipRef.current)) { + chartContainerRef.current.removeChild(tooltipRef.current) + tooltipRef.current = null + } + + if (labelsLayerRef.current && chartContainerRef.current?.contains(labelsLayerRef.current)) { + chartContainerRef.current.removeChild(labelsLayerRef.current) + labelsLayerRef.current = null + } + + chart.remove() + chartRef.current = null + seriesRef.current = null + } + }, [ + height, + tokenColor, + histogramData, + concentration, + clearingPriceDecimal, + tickSizeDecimal, + formatYAxisLabel, + createTooltipElement, + formatTooltipText, + createLabelsLayer, + updateCustomLabels, + colors.neutral2.val, + colors.neutral3.val, + colors.surface3Solid.val, + colors.accent1.val, + clearingPriceLabel, + ]) + + // Handle zoom reset: when user clicks reset button, show full data range + useEffect(() => { + if (!chartRef.current || minTimeRef.current === null || maxTimeRef.current === null) { + return + } + + // If zoom state is reset (visibleRange is null and isZoomed is false), + // and we're not in the initial render, apply full data range + if (!chartZoomState.isZoomed && chartZoomState.visibleRange === null) { + // Apply full data range with padding + chartRef.current.timeScale().setVisibleRange({ + from: (minTimeRef.current - CHART_PADDING.RANGE_PAD_UNITS) as UTCTimestamp, + to: (maxTimeRef.current + CHART_PADDING.RANGE_PAD_UNITS) as UTCTimestamp, + }) + } + }, [chartZoomState.isZoomed, chartZoomState.visibleRange]) + + // Show placeholder when auction hasn't started + if (auctionState === AuctionProgressState.NOT_STARTED) { + return + } + + return ( + + + + ) +} diff --git a/apps/web/src/components/Toucan/Auction/BidDistributionChart/BlockUpdateCountdown.tsx b/apps/web/src/components/Toucan/Auction/BidDistributionChart/BlockUpdateCountdown.tsx new file mode 100644 index 00000000000..de6d7f12122 --- /dev/null +++ b/apps/web/src/components/Toucan/Auction/BidDistributionChart/BlockUpdateCountdown.tsx @@ -0,0 +1,23 @@ +import { useBlockCountdown } from 'hooks/useBlockCountdown' +import { useTranslation } from 'react-i18next' +import { Text } from 'ui/src' +import { EVMUniverseChainId } from 'uniswap/src/features/chains/types' + +interface BlockUpdateCountdownProps { + chainId: EVMUniverseChainId | undefined +} + +export const BlockUpdateCountdown = ({ chainId }: BlockUpdateCountdownProps) => { + const { t } = useTranslation() + const countdown = useBlockCountdown(chainId) + + if (countdown === undefined) { + return null + } + + return ( + + {t('toucan.auction.nextBlockUpdate', { seconds: Math.ceil(countdown) })} + + ) +} diff --git a/apps/web/src/components/Toucan/Auction/BidDistributionChart/constants.ts b/apps/web/src/components/Toucan/Auction/BidDistributionChart/constants.ts new file mode 100644 index 00000000000..96b02335579 --- /dev/null +++ b/apps/web/src/components/Toucan/Auction/BidDistributionChart/constants.ts @@ -0,0 +1,92 @@ +// Chart dimensions and spacing +export const CHART_PADDING = { + RANGE_PAD_UNITS: 25, // Padding in scaled coordinate units for visible range +} as const + +// Price coordinate scaling +export const COORDINATE_SCALING = { + PRICE_SCALE_FACTOR: 10000, // Scale factor for converting prices to integer coordinates (supports precision to 0.0001) +} as const + +// Label configuration +export const LABEL_CONFIG = { + FONT_SIZE: 10, + LINE_HEIGHT: 10, + BOTTOM_POSITION: -2, // Distance from bottom of chart (negative moves labels down/away from chart) + HEIGHT: 16, // Height of labels layer +} as const + +// Tooltip configuration +export const TOOLTIP_CONFIG = { + PADDING: '4px 6px', + BORDER_RADIUS: '6px', + FONT_SIZE: 12, + OFFSET_X: 10, // Horizontal offset from cursor + VERTICAL_OFFSET_PERCENT: 120, // Vertical offset as percentage +} as const + +// Clearing price line configuration +export const CLEARING_PRICE_LINE = { + WIDTH: 2, // Line width in pixels + DASH_PATTERN: [6, 4], // Dash pattern for the line (6px dash, 4px gap) + LABEL_OFFSET_Y: 12, // Vertical offset for the label from top of chart +} as const + +// Chart scale margins +export const CHART_SCALE_MARGINS = { + TOP: 0.2, + BOTTOM: 0, +} as const + +// Bar styling +export const BAR_STYLE = { + BORDER_RADIUS: 12, // Corresponds to $rounded12 + SPACING: 2, // Gap between adjacent bars in pixels +} as const + +// TODO | Toucan: Make gradient dynamic based on token color +// The gradient should be calculated from the token's brand color (obtained via getRGBColor +// from the token's image URL). For the test token, this resolves to #7482FF from +// specialCaseTokens.ts. The START_COLOR should use the token color with opacity (e.g., 32%), +// and END_COLOR should be a darker variant with 0% opacity. This will require passing the +// token color to the renderer and dynamically generating the gradient colors. +// Concentration gradient styling +export const CONCENTRATION_GRADIENT = { + START_COLOR: 'rgba(127, 124, 251, 0.32)', // Bottom of gradient (visible) + END_COLOR: 'rgba(75, 74, 149, 0)', // Top of gradient (transparent) +} as const + +// Zoom configuration +export const ZOOM_DEFAULTS = { + INITIAL_TICK_COUNT: 20, // Number of ticks to show in initial view +} as const + +export const ZOOM_TOLERANCE = 0.01 // Tolerance for detecting "full zoom" state (1%) + +// Floating point comparison tolerances +export const TOLERANCE = { + TICK_COMPARISON: 0.001, // Tolerance for tick value comparisons (0.1% of tick size) + TICK_MATCHING: 0.1, // Tolerance for matching ticks in concentration band (10% of tick size) + FALLBACK: 0.01, // Fallback tolerance when tick size is unavailable +} as const + +// Chart data constraints +export const CHART_CONSTRAINTS = { + MIN_BARS: 20, // Minimum number of bars to display +} as const + +// Label generation configuration +export const LABEL_GENERATION = { + MIN_LABELS: 7, // Minimum number of x-axis labels + MAX_LABELS: 12, // Maximum number of x-axis labels + IDEAL_LABELS: 10, // Ideal target number of labels +} as const + +// Nice number values for rounding and label increments +export const NICE_VALUES = { + STANDARD: [1, 2, 5] as const, // Standard nice values for chart increments + WITH_HALF: [1, 2, 2.5, 5] as const, // Includes 2.5 for finer granularity (Y-axis) +} as const + +// Default Y-axis levels for empty charts +export const DEFAULT_Y_AXIS_LEVELS = [0, 20000, 40000, 60000, 80000, 100000] as const diff --git a/apps/web/src/components/Toucan/Auction/BidDistributionChart/dev/CustomizePresetForm.tsx b/apps/web/src/components/Toucan/Auction/BidDistributionChart/dev/CustomizePresetForm.tsx new file mode 100644 index 00000000000..091d29b3862 --- /dev/null +++ b/apps/web/src/components/Toucan/Auction/BidDistributionChart/dev/CustomizePresetForm.tsx @@ -0,0 +1,472 @@ +// TODO: Remove this file once live auction data is implemented +/** biome-ignore-all lint/correctness/useExhaustiveDependencies: dev-only file with intentional dependencies */ +// Form for customizing and generating bid distribution presets + +import { + AUCTION_TOKEN_DECIMALS, + BID_TOKEN_CONFIGS, + CustomPresetParams, + fromHumanReadable, + generatePresetName, + generateRandomBidDistribution, + SavedCustomPreset, + toHumanReadable, + validateTickCount, +} from 'components/Toucan/Auction/BidDistributionChart/dev/customPresets' +import { useCustomPresetsStore } from 'components/Toucan/Auction/BidDistributionChart/dev/useCustomPresetsStore' +import { useMockDataStore } from 'components/Toucan/Auction/store/mocks/useMockDataStore' +import { useCallback, useEffect, useState } from 'react' +import { Button, Flex, Input, SegmentedControl, Text } from 'ui/src' + +interface CustomizePresetFormProps { + onClose: () => void + editingPreset?: SavedCustomPreset | null +} + +export const CustomizePresetForm = ({ onClose, editingPreset }: CustomizePresetFormProps) => { + const savePreset = useCustomPresetsStore((state) => state.savePreset) + const updatePreset = useCustomPresetsStore((state) => state.updatePreset) + const loadCustomPreset = useMockDataStore((state) => state.loadCustomPreset) + + const isEditMode = !!editingPreset + + // Form state + const [bidToken, setBidToken] = useState<'USDC' | 'ETH'>('USDC') + const [tickSizeHuman, setTickSizeHuman] = useState(BID_TOKEN_CONFIGS.USDC.defaultTickSizeHuman) + const [clearingPriceHuman, setClearingPriceHuman] = useState(BID_TOKEN_CONFIGS.USDC.defaultClearingPriceHuman) + const [tickRangeMin, setTickRangeMin] = useState('1') + const [tickRangeMax, setTickRangeMax] = useState('100') + const [tickCount, setTickCount] = useState('20') + const [bidVolumeMinHuman, setBidVolumeMinHuman] = useState('1000') + const [bidVolumeMaxHuman, setBidVolumeMaxHuman] = useState('10000') + const [totalSupply, setTotalSupply] = useState('1000000000') + + // Load editing preset values + useEffect(() => { + if (editingPreset) { + const config = BID_TOKEN_CONFIGS[editingPreset.bidToken] + setBidToken(editingPreset.bidToken) + setTickSizeHuman(toHumanReadable(editingPreset.tickSize, config.decimals)) + setClearingPriceHuman(toHumanReadable(editingPreset.clearingPrice, config.decimals)) + setTickRangeMin(editingPreset.tickRangeMin.toString()) + setTickRangeMax(editingPreset.tickRangeMax.toString()) + setTickCount(editingPreset.tickCount.toString()) + setBidVolumeMinHuman(toHumanReadable(editingPreset.bidVolumeMin, config.decimals)) + setBidVolumeMaxHuman(toHumanReadable(editingPreset.bidVolumeMax, config.decimals)) + // Convert totalSupply from raw (with 18 decimals) to human-readable + setTotalSupply(toHumanReadable(editingPreset.totalSupply, AUCTION_TOKEN_DECIMALS)) + // Note: bidTokenAddress is derived from bidToken config, not loaded separately + } + }, [editingPreset]) + + const [error, setError] = useState('') + + const config = BID_TOKEN_CONFIGS[bidToken] + + // Handle bid token change + const handleBidTokenChange = useCallback((value: string) => { + const newToken = value as 'USDC' | 'ETH' + setBidToken(newToken) + const newConfig = BID_TOKEN_CONFIGS[newToken] + setTickSizeHuman(newConfig.defaultTickSizeHuman) + setClearingPriceHuman(newConfig.defaultClearingPriceHuman) + setError('') + }, []) + + // Validate clearing price on blur + const handleClearingPriceBlur = useCallback(() => { + try { + const clearingPriceRaw = fromHumanReadable(clearingPriceHuman, config.decimals) + if (BigInt(clearingPriceRaw) < 0n) { + setError('Invalid clearing price') + } else { + setError('') + } + } catch { + setError('Invalid clearing price') + } + }, [clearingPriceHuman, config.decimals]) + + // Arrow key handlers for numeric inputs + const handleTickSizeKeyPress = useCallback( + // eslint-disable-next-line @typescript-eslint/no-explicit-any + (e: any) => { + if (e.key === 'ArrowUp' || e.key === 'ArrowDown') { + e.preventDefault() + const current = parseFloat(tickSizeHuman || '0') + const increment = e.key === 'ArrowUp' ? 0.01 : -0.01 + const newValue = Math.max(0.01, current + increment) + setTickSizeHuman(newValue.toFixed(2)) + } + }, + [tickSizeHuman], + ) + + const handleClearingPriceKeyPress = useCallback( + // eslint-disable-next-line @typescript-eslint/no-explicit-any + (e: any) => { + if (e.key === 'ArrowUp' || e.key === 'ArrowDown') { + e.preventDefault() + const clearingPriceRaw = fromHumanReadable(clearingPriceHuman, config.decimals) + const tickSizeRaw = fromHumanReadable(tickSizeHuman, config.decimals) + const tickSizeBigInt = BigInt(tickSizeRaw) + const increment = e.key === 'ArrowUp' ? tickSizeBigInt : -tickSizeBigInt + const newValue = BigInt(clearingPriceRaw) + increment + const newValueHuman = toHumanReadable(newValue.toString(), config.decimals) + setClearingPriceHuman(newValueHuman) + } + }, + [clearingPriceHuman, tickSizeHuman, config.decimals], + ) + + const handleNumericKeyPress = useCallback( + (setter: (value: string) => void, currentValue: string) => + // eslint-disable-next-line @typescript-eslint/no-explicit-any + (e: any) => { + if (e.key === 'ArrowUp' || e.key === 'ArrowDown') { + e.preventDefault() + const current = parseInt(currentValue || '0') + const increment = e.key === 'ArrowUp' ? 1 : -1 + const newValue = Math.max(0, current + increment) + setter(newValue.toString()) + } + }, + [], + ) + + // Validate and save preset + const handleSave = useCallback(() => { + try { + setError('') + + // Parse inputs + const tickSizeRaw = fromHumanReadable(tickSizeHuman, config.decimals) + const clearingPriceRaw = fromHumanReadable(clearingPriceHuman, config.decimals) + const rangeMin = parseInt(tickRangeMin) + const rangeMax = parseInt(tickRangeMax) + const count = parseInt(tickCount) + const volumeMinRaw = fromHumanReadable(bidVolumeMinHuman, config.decimals) + const volumeMaxRaw = fromHumanReadable(bidVolumeMaxHuman, config.decimals) + + // Validation + if (rangeMin < 1 || rangeMax > 40000 || rangeMin >= rangeMax) { + setError('Invalid tick range. Min must be 1-40000 and less than max.') + return + } + + if (!validateTickCount({ tickCount: count, tickRangeMin: rangeMin, tickRangeMax: rangeMax })) { + setError(`Tick count must be between 1 and ${rangeMax - rangeMin + 1}`) + return + } + + if (BigInt(volumeMinRaw) >= BigInt(volumeMaxRaw)) { + setError('Bid volume min must be less than max') + return + } + + // Generate preset parameters + // Convert totalSupply to raw format (with 18 decimals) + const totalSupplyRaw = fromHumanReadable(totalSupply, AUCTION_TOKEN_DECIMALS) + + const params: CustomPresetParams = { + bidToken, + bidTokenAddress: config.address, // Store actual token address + tickSize: tickSizeRaw, + clearingPrice: clearingPriceRaw, + tickRangeMin: rangeMin, + tickRangeMax: rangeMax, + tickCount: count, + bidVolumeMin: volumeMinRaw, + bidVolumeMax: volumeMaxRaw, + totalSupply: totalSupplyRaw, + } + + // Generate distribution data + const distributionData = generateRandomBidDistribution(params) + const name = generatePresetName(params) + + if (isEditMode) { + // Update existing preset + updatePreset(editingPreset.id, { + ...params, + name, + distributionData, + }) + + // Load the updated preset + const updatedPreset = { + ...params, + name, + distributionData, + id: editingPreset.id, + createdAt: editingPreset.createdAt, + } + loadCustomPreset(updatedPreset) + } else { + // Save new preset + savePreset({ + ...params, + name, + distributionData, + }) + + // Load the preset (need to create a temporary one with id for loading) + const tempPreset = { + ...params, + name, + distributionData, + id: 'temp', // Will be updated when we select from saved list + createdAt: Date.now(), + } + loadCustomPreset(tempPreset) + } + + onClose() + } catch (err) { + setError(err instanceof Error ? err.message : 'Failed to generate preset') + } + }, [ + bidToken, + tickSizeHuman, + clearingPriceHuman, + tickRangeMin, + tickRangeMax, + tickCount, + bidVolumeMinHuman, + bidVolumeMaxHuman, + config.decimals, + savePreset, + loadCustomPreset, + onClose, + ]) + + return ( + + {/* Bid Token Selector */} + + + Bid Token + + USDC }, + { value: 'ETH', display: ETH }, + ]} + selectedOption={bidToken} + onSelectOption={handleBidTokenChange} + /> + + + {/* Tick Size and Clearing Price - Same Row */} + + + + Tick Size ({bidToken}) + + + + + + + + + Clearing Price ({bidToken}) + + + + Can be any price + + + + + {/* Tick Range - Same Row */} + + + + Tick Range (multipliers: 1-40000) + + + + + to + + + + + + + + + + Ticks with Bids + + + + Max: {Math.max(0, parseInt(tickRangeMax || '0') - parseInt(tickRangeMin || '0') + 1)} + + + + + {/* Bid Volume Range and Total Supply - Same Row */} + + + + Bid Volume Range (per tick, in {bidToken}) + + + + + to + + + + + + + + + + Total Supply + + + + + + {/* Error Message */} + {error && ( + + {error} + + )} + + {/* Preview */} + + + Preview: + + + {tickCount} random ticks between $ + {toHumanReadable( + (BigInt(fromHumanReadable(tickSizeHuman, config.decimals)) * BigInt(tickRangeMin || '1')).toString(), + config.decimals, + )}{' '} + - $ + {toHumanReadable( + (BigInt(fromHumanReadable(tickSizeHuman, config.decimals)) * BigInt(tickRangeMax || '100')).toString(), + config.decimals, + )} + + + Volume per tick: ${bidVolumeMinHuman} - ${bidVolumeMaxHuman} + + + + {/* Save/Update Button */} + + + ) +} diff --git a/apps/web/src/components/Toucan/Auction/BidDistributionChart/dev/MockDataSelectorModal.tsx b/apps/web/src/components/Toucan/Auction/BidDistributionChart/dev/MockDataSelectorModal.tsx new file mode 100644 index 00000000000..9fbfaf2c468 --- /dev/null +++ b/apps/web/src/components/Toucan/Auction/BidDistributionChart/dev/MockDataSelectorModal.tsx @@ -0,0 +1,139 @@ +// TODO: Remove this file once live auction data is implemented +// Modal for selecting mock bid distribution data in development + +import { CustomizePresetForm } from 'components/Toucan/Auction/BidDistributionChart/dev/CustomizePresetForm' +import { SavedCustomPreset } from 'components/Toucan/Auction/BidDistributionChart/dev/customPresets' +import { getDatasetLabel } from 'components/Toucan/Auction/BidDistributionChart/dev/devUtils' +import { SavedPresetsList } from 'components/Toucan/Auction/BidDistributionChart/dev/SavedPresetsList' +import { MOCK_BID_DISTRIBUTION_DATASETS } from 'components/Toucan/Auction/store/mocks/distributionData/bidDistributionMockData' +import { useMockDataStore } from 'components/Toucan/Auction/store/mocks/useMockDataStore' +import { BidTokenInfo } from 'components/Toucan/Auction/store/types' +import { useMemo, useState } from 'react' +import { Flex, SegmentedControl, Text, TouchableArea } from 'ui/src' +import { Modal } from 'uniswap/src/components/modals/Modal' +import { ModalName } from 'uniswap/src/features/telemetry/constants' + +type TabType = 'quick' | 'customize' | 'saved' + +interface MockDataSelectorModalProps { + bidTokenInfo: BidTokenInfo +} + +export const MockDataSelectorModal = ({ bidTokenInfo }: MockDataSelectorModalProps) => { + // Quick select datasets are all USDC-based, so use hardcoded USDC info for labels + // This prevents display issues when an ETH preset is selected as active + const quickSelectBidTokenInfo: BidTokenInfo = { + symbol: 'USDC', + decimals: 6, + priceFiat: 1, + } + const [isOpen, setIsOpen] = useState(false) + const [activeTab, setActiveTab] = useState('quick') + const [editingPreset, setEditingPreset] = useState(null) + const { selectedDatasetIndex, setSelectedDatasetIndex } = useMockDataStore() + + const datasetLabels = useMemo(() => { + return MOCK_BID_DISTRIBUTION_DATASETS.map((dataset) => getDatasetLabel(dataset, quickSelectBidTokenInfo)) + }, []) + + const handleSelectDataset = (index: number) => { + setSelectedDatasetIndex(index) + setIsOpen(false) + } + + const handleEditPreset = (preset: SavedCustomPreset) => { + setEditingPreset(preset) + setActiveTab('customize') + } + + const handleCloseModal = () => { + setIsOpen(false) + setEditingPreset(null) + // Reset to quick tab when closing + setTimeout(() => setActiveTab('quick'), 300) + } + + const handleCloseCustomizeForm = () => { + setEditingPreset(null) + setIsOpen(false) + // Reset to quick tab when closing + setTimeout(() => setActiveTab('quick'), 300) + } + + return ( + <> + {/* TODO | Toucan: Remove this dev button once live */} + setIsOpen(true)}> + + dev + + + + + + + Bid Distribution Data + + + {/* Tab Selector */} + Quick Select }, + { value: 'customize', display: Customize }, + { value: 'saved', display: Saved }, + ]} + selectedOption={activeTab} + onSelectOption={(value) => setActiveTab(value as TabType)} + /> + + {/* Tab Content */} + {activeTab === 'quick' && ( + + {MOCK_BID_DISTRIBUTION_DATASETS.map((dataset, index) => { + const { tickCount, minPrice, maxPrice } = datasetLabels[index] + const isSelected = selectedDatasetIndex === index + + return ( + handleSelectDataset(index)} + backgroundColor={isSelected ? '$surface3' : '$surface2'} + p="$spacing12" + borderRadius="$rounded12" + hoverStyle={{ backgroundColor: '$surface3' }} + > + + + {tickCount} Ticks + + + ${minPrice.toFixed(2)} - ${maxPrice.toFixed(2)} + + + + ) + })} + + )} + + {activeTab === 'customize' && ( + + )} + + {activeTab === 'saved' && } + + + + ) +} diff --git a/apps/web/src/components/Toucan/Auction/BidDistributionChart/dev/SavedPresetsList.tsx b/apps/web/src/components/Toucan/Auction/BidDistributionChart/dev/SavedPresetsList.tsx new file mode 100644 index 00000000000..af2dea9c6e8 --- /dev/null +++ b/apps/web/src/components/Toucan/Auction/BidDistributionChart/dev/SavedPresetsList.tsx @@ -0,0 +1,166 @@ +// TODO: Remove this file once live auction data is implemented +// List of saved custom bid distribution presets + +import { + BID_TOKEN_CONFIGS, + getBidTokenInfoFromConfig, + SavedCustomPreset, + toHumanReadable, +} from 'components/Toucan/Auction/BidDistributionChart/dev/customPresets' +import { getDatasetLabel } from 'components/Toucan/Auction/BidDistributionChart/dev/devUtils' +import { useCustomPresetsStore } from 'components/Toucan/Auction/BidDistributionChart/dev/useCustomPresetsStore' +import { useMockDataStore } from 'components/Toucan/Auction/store/mocks/useMockDataStore' +import { useState } from 'react' +import { Button, Flex, Text, TouchableArea } from 'ui/src' +import { Edit } from 'ui/src/components/icons/Edit' +import { Trash } from 'ui/src/components/icons/Trash' + +interface SavedPresetsListProps { + onClose: () => void + onEditPreset: (preset: SavedCustomPreset) => void +} + +export const SavedPresetsList = ({ onClose, onEditPreset }: SavedPresetsListProps) => { + const { presets, deletePreset, clearAllPresets } = useCustomPresetsStore() + const { loadCustomPreset, selectedPresetId } = useMockDataStore() + const [showConfirmClear, setShowConfirmClear] = useState(false) + + const handleLoadPreset = (presetId: string) => { + const preset = presets.find((p) => p.id === presetId) + if (preset) { + loadCustomPreset(preset) + onClose() + } + } + + const handleClearAll = () => { + if (showConfirmClear) { + clearAllPresets() + setShowConfirmClear(false) + } else { + setShowConfirmClear(true) + } + } + + // Empty state + if (presets.length === 0) { + return ( + + + No custom presets saved. + + + Create one in the Customize tab. + + + ) + } + + return ( + + + Saved Presets + + + + {presets.map((preset) => { + // Create preset-specific bidTokenInfo using its own config (not the active chart's token) + const presetBidTokenInfo = getBidTokenInfoFromConfig(preset.bidToken) + const label = getDatasetLabel(preset.distributionData, presetBidTokenInfo) + const config = BID_TOKEN_CONFIGS[preset.bidToken] + const isSelected = selectedPresetId === preset.id + + // Calculate volume range and clearing price for display + const minVolumeHuman = toHumanReadable(preset.bidVolumeMin, config.decimals) + const maxVolumeHuman = toHumanReadable(preset.bidVolumeMax, config.decimals) + const clearingPriceHuman = toHumanReadable(preset.clearingPrice, config.decimals) + + return ( + + handleLoadPreset(preset.id)} hoverStyle={{ opacity: 0.8 }}> + + + + {label.tickCount} Ticks ({config.symbol}) + + + ${label.minPrice.toFixed(2)} - ${label.maxPrice.toFixed(2)} + + + + {preset.name} + + + Volume per tick: ${minVolumeHuman} - ${maxVolumeHuman} + + + Clearing Price: ${clearingPriceHuman} + + + + + + onEditPreset(preset)} + p="$spacing8" + hoverStyle={{ backgroundColor: '$surface3' }} + borderRadius="$rounded8" + > + + + + deletePreset(preset.id)} + p="$spacing8" + hoverStyle={{ backgroundColor: '$surface3' }} + borderRadius="$rounded8" + > + + + + + ) + })} + + + {/* Clear All Button */} + + {showConfirmClear ? ( + + + Are you sure you want to delete all presets? + + + + + + + ) : ( + + )} + + + ) +} diff --git a/apps/web/src/components/Toucan/Auction/BidDistributionChart/dev/customPresets.ts b/apps/web/src/components/Toucan/Auction/BidDistributionChart/dev/customPresets.ts new file mode 100644 index 00000000000..a1e321809ac --- /dev/null +++ b/apps/web/src/components/Toucan/Auction/BidDistributionChart/dev/customPresets.ts @@ -0,0 +1,270 @@ +// TODO: Remove this file once live auction data is implemented +// Utilities for generating custom bid distribution presets + +import { BidDistributionData } from 'components/Toucan/Auction/store/types' + +// Auction token always has 18 decimals (matches FAKE_AUCTION_DATA.tokenDecimals) +export const AUCTION_TOKEN_DECIMALS = 18 + +// eslint-disable-next-line import/no-unused-modules -- Exported for type safety +export interface BidTokenConfig { + address: string + symbol: 'USDC' | 'ETH' + decimals: number + defaultTickSize: string // raw value (e.g., "500000" for 0.50 USDC) + defaultTickSizeHuman: string // human readable (e.g., "0.50") + defaultClearingPrice: string // raw value + defaultClearingPriceHuman: string // human readable +} + +export const BID_TOKEN_CONFIGS: Record<'USDC' | 'ETH', BidTokenConfig> = { + USDC: { + address: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48', + symbol: 'USDC', + decimals: 6, + defaultTickSize: '500000', // 0.50 USDC + defaultTickSizeHuman: '0.50', + defaultClearingPrice: '5000000', // 5.00 USDC + defaultClearingPriceHuman: '5.00', + }, + ETH: { + address: '0x0000000000000000000000000000000000000000', // native ETH + symbol: 'ETH', + decimals: 18, + defaultTickSize: '100000000000000', // 0.0001 ETH + defaultTickSizeHuman: '0.0001', + defaultClearingPrice: '1000000000000000', // 0.001 ETH + defaultClearingPriceHuman: '0.001', + }, +} + +export interface CustomPresetParams { + bidToken: 'USDC' | 'ETH' + bidTokenAddress: string // actual token address (needed for useBidTokenInfo) + tickSize: string // raw value + clearingPrice: string // raw value + tickRangeMin: number // multiplier (e.g., 1 means 1x tickSize) + tickRangeMax: number // multiplier + tickCount: number + bidVolumeMin: string // raw value in bid token smallest units + bidVolumeMax: string // raw value in bid token smallest units + totalSupply: string // total supply of auction token +} + +export interface SavedCustomPreset extends CustomPresetParams { + id: string + name: string + createdAt: number + distributionData: BidDistributionData +} + +/** + * Generates random bid distribution data based on preset parameters + * Uses BigInt for precision-safe calculations + * Distribution is weighted to cluster near and above clearing price (like an order book) + */ +export function generateRandomBidDistribution(params: CustomPresetParams): BidDistributionData { + const { tickSize, clearingPrice, tickRangeMin, tickRangeMax, tickCount, bidVolumeMin, bidVolumeMax } = params + + // Calculate available ticks in the range + const availableTicks = tickRangeMax - tickRangeMin + 1 + + if (tickCount > availableTicks) { + throw new Error(`Tick count (${tickCount}) cannot exceed available range (${availableTicks})`) + } + + if (tickCount < 1) { + throw new Error('Tick count must be at least 1') + } + + const tickSizeBigInt = BigInt(tickSize) + const clearingPriceBigInt = BigInt(clearingPrice) + const volumeMinBigInt = BigInt(bidVolumeMin) + const volumeMaxBigInt = BigInt(bidVolumeMax) + const volumeRange = volumeMaxBigInt - volumeMinBigInt + + // Calculate which tick multiplier the clearing price falls at/near + const clearingMultiplier = Number(clearingPriceBigInt / tickSizeBigInt) + + // Generate random unique tick multipliers with clustering near clearing price + const tickMultipliers = new Set() + while (tickMultipliers.size < tickCount) { + let randomMultiplier: number + + // Decide if this should be below or at/above clearing price + // 70% of ticks should be at or above clearing price for realistic orderbook look + const isAboveOrAtClearing = Math.random() > 0.3 + + if (isAboveOrAtClearing) { + // Generate ticks at or above clearing price with tight clustering + // Use exponential distribution for realistic orderbook clustering + const maxDistance = tickRangeMax - clearingMultiplier + if (maxDistance > 0) { + // Very tight clustering: most ticks immediately near clearing + // Allow rare outliers (2% chance) + const isOutlier = Math.random() < 0.02 + let distance: number + + if (isOutlier) { + // Rare outlier: randomly distributed in range + distance = Math.floor(Math.random() * maxDistance) + } else { + // Normal: very tightly clustered near clearing price + // Use exponential with high lambda for tight clustering + const lambda = 8.0 // Higher = tighter clustering + const uniformRandom = Math.random() + const exponentialRandom = -Math.log(1 - uniformRandom) / lambda + // Scale to a smaller portion of maxDistance for tighter clustering + // Most ticks will be within first 10-20% of range + distance = Math.floor(Math.min(exponentialRandom, 0.3) * maxDistance) + } + + randomMultiplier = Math.min(tickRangeMax, Math.floor(clearingMultiplier + distance)) + } else { + randomMultiplier = Math.floor(clearingMultiplier) + } + } else { + // Generate ticks below clearing price with uniform random distribution + const minDistance = clearingMultiplier - tickRangeMin + if (minDistance > 0) { + const distance = Math.floor(Math.random() * minDistance) + randomMultiplier = Math.max(tickRangeMin, Math.floor(clearingMultiplier - distance) - 1) + } else { + randomMultiplier = tickRangeMin + } + } + + // Ensure within valid range + randomMultiplier = Math.max(tickRangeMin, Math.min(tickRangeMax, randomMultiplier)) + tickMultipliers.add(randomMultiplier) + } + + // Generate distribution data with volume that decreases with distance from clearing price + const distributionData = new Map() + + for (const multiplier of tickMultipliers) { + const tickValue = tickSizeBigInt * BigInt(multiplier) + const tickValueBigInt = BigInt(tickValue) + + // Calculate distance from clearing price for volume weighting + const distanceFromClearing = Math.abs(Number(tickValueBigInt - clearingPriceBigInt) / Number(tickSizeBigInt)) + + // For bids at or above clearing: volume decreases with distance (orderbook style) + // For bids below clearing: more random volume + let randomVolume: bigint + + if (tickValueBigInt >= clearingPriceBigInt) { + // At or above clearing: higher volume near clearing, exponentially decreasing + // Base volume factor: 1.0 at clearing, decreasing to ~0.3 at far distances + const distanceFactor = Math.exp(-distanceFromClearing * 0.05) + // Add some randomness (±30%) while maintaining general trend + const randomFactor = 0.7 + Math.random() * 0.6 // 0.7 to 1.3 + + const volumeFactor = distanceFactor * randomFactor + const scaledRange = Number(volumeRange) * volumeFactor + const randomOffset = BigInt(Math.floor(scaledRange * Math.random())) + const baseVolume = volumeMinBigInt + randomOffset + + // Ensure volume stays within bounds + randomVolume = baseVolume > volumeMaxBigInt ? volumeMaxBigInt : baseVolume + } else { + // Below clearing: use more random distribution + const randomRatio = Math.random() + const randomOffset = BigInt(Math.floor(Number(volumeRange) * randomRatio)) + randomVolume = volumeMinBigInt + randomOffset + } + + distributionData.set(tickValue.toString(), randomVolume.toString()) + } + + return distributionData +} + +/** + * Converts raw token value to human-readable decimal format + * @example toHumanReadable("500000", 6) // "0.5" + * @example toHumanReadable("100000000000000", 18) // "0.0001" + */ +export function toHumanReadable(value: string, decimals: number): string { + try { + const valueBigInt = BigInt(value) + const divisor = BigInt(Math.pow(10, decimals)) + + const wholePart = valueBigInt / divisor + const fractionalPart = valueBigInt % divisor + + if (fractionalPart === 0n) { + return wholePart.toString() + } + + const fractionalStr = fractionalPart.toString().padStart(decimals, '0') + // Remove trailing zeros + const trimmed = fractionalStr.replace(/0+$/, '') + + return `${wholePart}.${trimmed}` + } catch { + return '0' + } +} + +/** + * Converts human-readable decimal to raw token value + * @example fromHumanReadable("0.5", 6) // "500000" + * @example fromHumanReadable("0.0001", 18) // "100000000000000" + */ +export function fromHumanReadable(value: string, decimals: number): string { + try { + // Handle empty or invalid input + if (!value || value === '' || value === '.') { + return '0' + } + + const [whole = '0', fractional = ''] = value.split('.') + const paddedFractional = fractional.padEnd(decimals, '0').slice(0, decimals) + const combined = (whole === '' ? '0' : whole) + paddedFractional + return BigInt(combined || '0').toString() + } catch { + return '0' + } +} + +/** + * Validates that tick count doesn't exceed available range + */ +export function validateTickCount(params: { tickCount: number; tickRangeMin: number; tickRangeMax: number }): boolean { + const { tickCount, tickRangeMin, tickRangeMax } = params + const availableTicks = tickRangeMax - tickRangeMin + 1 + return tickCount >= 1 && tickCount <= availableTicks +} + +/** + * Generates a descriptive name for a custom preset + */ +export function generatePresetName(params: CustomPresetParams): string { + const config = BID_TOKEN_CONFIGS[params.bidToken] + const minTick = toHumanReadable((BigInt(params.tickSize) * BigInt(params.tickRangeMin)).toString(), config.decimals) + const maxTick = toHumanReadable((BigInt(params.tickSize) * BigInt(params.tickRangeMax)).toString(), config.decimals) + + return `${params.bidToken} | ${params.tickCount} ticks | $${minTick}-$${maxTick}` +} + +/** + * Creates BidTokenInfo from a bid token config for display purposes + * Uses mock USD prices since this is only for displaying preset labels in the list + * The actual chart rendering uses real prices from useBidTokenInfo + */ +export function getBidTokenInfoFromConfig(bidToken: 'USDC' | 'ETH'): { + symbol: string + decimals: number + priceFiat: number +} { + const config = BID_TOKEN_CONFIGS[bidToken] + // Mock prices for display only - USDC is $1, ETH is $3000 + const mockPriceFiat = bidToken === 'USDC' ? 1 : 3000 + + return { + symbol: config.symbol, + decimals: config.decimals, + priceFiat: mockPriceFiat, + } +} diff --git a/apps/web/src/components/Toucan/Auction/BidDistributionChart/dev/devUtils.ts b/apps/web/src/components/Toucan/Auction/BidDistributionChart/dev/devUtils.ts new file mode 100644 index 00000000000..b635adfe62d --- /dev/null +++ b/apps/web/src/components/Toucan/Auction/BidDistributionChart/dev/devUtils.ts @@ -0,0 +1,59 @@ +// TODO: Remove this file once live auction data is implemented +// Utility functions for dev components + +import { BidDistributionData, BidTokenInfo } from 'components/Toucan/Auction/store/types' + +/** + * Generates a dynamic label for a mock dataset showing tick count and price range + * Converts tick values from smallest units (e.g., micro-USDC) to USD using bid token decimals and price + * Uses BigInt for precision-safe calculations with high-decimal tokens + */ +export function getDatasetLabel( + data: BidDistributionData, + bidTokenInfo: BidTokenInfo, +): { tickCount: number; minPrice: number; maxPrice: number } { + // Ensure data is a Map (handle deserialization edge cases) + let mapData: Map + if (data instanceof Map) { + mapData = data + } else if (Array.isArray(data)) { + mapData = new Map(data as [string, string][]) + } else { + // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Runtime safety for deserialized data + mapData = new Map(data && typeof data === 'object' ? (Object.entries(data) as [string, string][]) : []) + } + + const tickCount = mapData.size + + // Handle empty data + if (tickCount === 0) { + return { + tickCount: 0, + minPrice: 0, + maxPrice: 0, + } + } + + const tickBigInts = Array.from(mapData.keys()).map((tick) => BigInt(tick)) + const minTickBigInt = tickBigInts.reduce((min, curr) => (curr < min ? curr : min)) + const maxTickBigInt = tickBigInts.reduce((max, curr) => (curr > max ? curr : max)) + + // Convert from smallest units to decimal using BigInt division + // We multiply by a scale factor first to preserve precision during division + // Use the token's decimals as the scale factor to maintain full precision + const SCALE_FACTOR = BigInt(Math.pow(10, bidTokenInfo.decimals)) + const decimalsDiv = SCALE_FACTOR + + const minPriceScaled = (minTickBigInt * SCALE_FACTOR) / decimalsDiv + const maxPriceScaled = (maxTickBigInt * SCALE_FACTOR) / decimalsDiv + + // Convert to USD (now safe to convert to Number since we're dealing with reasonable display values) + const minPrice = (Number(minPriceScaled) / Number(SCALE_FACTOR)) * bidTokenInfo.priceFiat + const maxPrice = (Number(maxPriceScaled) / Number(SCALE_FACTOR)) * bidTokenInfo.priceFiat + + return { + tickCount, + minPrice, + maxPrice, + } +} diff --git a/apps/web/src/components/Toucan/Auction/BidDistributionChart/dev/useCustomPresetsStore.ts b/apps/web/src/components/Toucan/Auction/BidDistributionChart/dev/useCustomPresetsStore.ts new file mode 100644 index 00000000000..de6b8ecc693 --- /dev/null +++ b/apps/web/src/components/Toucan/Auction/BidDistributionChart/dev/useCustomPresetsStore.ts @@ -0,0 +1,131 @@ +// TODO: Remove this file once live auction data is implemented +// Zustand store for persisting custom bid distribution presets to localStorage + +import { SavedCustomPreset } from 'components/Toucan/Auction/BidDistributionChart/dev/customPresets' +import { create } from 'zustand' +import { PersistStorage, persist, StorageValue } from 'zustand/middleware' + +interface CustomPresetsState { + presets: SavedCustomPreset[] + savePreset: (preset: Omit) => void + updatePreset: (id: string, preset: Omit) => void + deletePreset: (id: string) => void + clearAllPresets: () => void +} + +// Custom storage implementation that handles Map serialization +const customStorage: PersistStorage = { + getItem: (name) => { + const str = localStorage.getItem(name) + if (!str) { + return null + } + const parsed = JSON.parse(str) + if (parsed.state?.presets) { + parsed.state.presets = parsed.state.presets + .map((preset: any) => { + let distributionData: Map + + if (preset.distributionData instanceof Map) { + distributionData = preset.distributionData + } else if (Array.isArray(preset.distributionData)) { + distributionData = new Map(preset.distributionData as [string, string][]) + } else if (preset.distributionData && typeof preset.distributionData === 'object') { + distributionData = new Map(Object.entries(preset.distributionData) as [string, string][]) + } else { + distributionData = new Map() + } + + return { ...preset, distributionData } + }) + .filter((preset: SavedCustomPreset) => preset.distributionData.size > 0) + } + return parsed as StorageValue + }, + setItem: (name, value) => { + const serializable = { + ...value, + state: { + ...value.state, + presets: value.state.presets.map((preset: any) => { + // Convert Map to array for JSON serialization + let distributionData: any + if (preset.distributionData instanceof Map) { + distributionData = Array.from(preset.distributionData.entries()) + } else if ( + preset.distributionData && + typeof preset.distributionData === 'object' && + 'entries' in preset.distributionData && + typeof preset.distributionData.entries === 'function' + ) { + // Map-like object with entries method + distributionData = Array.from(preset.distributionData.entries()) + } else if (Array.isArray(preset.distributionData)) { + distributionData = preset.distributionData + } else if (preset.distributionData && typeof preset.distributionData === 'object') { + // Plain object - convert to array format + distributionData = Object.entries(preset.distributionData) + } else { + distributionData = [] + } + + return { + ...preset, + distributionData, + } + }), + }, + } + localStorage.setItem(name, JSON.stringify(serializable)) + }, + removeItem: (name) => { + localStorage.removeItem(name) + }, +} + +export const useCustomPresetsStore = create()( + persist( + (set) => ({ + presets: [], + + savePreset: (preset) => { + const newPreset: SavedCustomPreset = { + ...preset, + id: crypto.randomUUID(), + createdAt: Date.now(), + } + set((state) => ({ + presets: [...state.presets, newPreset], + })) + }, + + updatePreset: (id, preset) => { + set((state) => ({ + presets: state.presets.map((p) => + p.id === id + ? { + ...preset, + id: p.id, // Keep the same ID + createdAt: p.createdAt, // Keep the original creation date + } + : p, + ), + })) + }, + + deletePreset: (id) => { + set((state) => ({ + presets: state.presets.filter((p) => p.id !== id), + })) + }, + + clearAllPresets: () => { + set({ presets: [] }) + }, + }), + { + name: 'toucan-custom-bid-presets', + storage: customStorage, + }, + ), +) diff --git a/apps/web/src/components/Toucan/Auction/BidDistributionChart/hooks/useChartDimensions.ts b/apps/web/src/components/Toucan/Auction/BidDistributionChart/hooks/useChartDimensions.ts new file mode 100644 index 00000000000..31d3e4b0f04 --- /dev/null +++ b/apps/web/src/components/Toucan/Auction/BidDistributionChart/hooks/useChartDimensions.ts @@ -0,0 +1,27 @@ +import type { IChartApi } from 'lightweight-charts' +import { useCallback } from 'react' + +/** + * Hook for calculating distribution chart dimensions and offsets + */ +export function useChartDimensions() { + /** + * Calculate the plot area dimensions (where bars are actually rendered) + * Returns left offset and width of the clipped plot area + */ + const getPlotDimensions = useCallback( + (containerRef: HTMLDivElement | null, chart: IChartApi | null): { left: number; width: number } => { + if (!containerRef || !chart) { + return { left: 0, width: 0 } + } + + const left = chart.priceScale('left').width() + const width = chart.paneSize().width + + return { left: Math.round(left), width: Math.round(width) } + }, + [], + ) + + return { getPlotDimensions } +} diff --git a/apps/web/src/components/Toucan/Auction/BidDistributionChart/hooks/useChartLabels.ts b/apps/web/src/components/Toucan/Auction/BidDistributionChart/hooks/useChartLabels.ts new file mode 100644 index 00000000000..52c21c6d6bd --- /dev/null +++ b/apps/web/src/components/Toucan/Auction/BidDistributionChart/hooks/useChartLabels.ts @@ -0,0 +1,127 @@ +import { COORDINATE_SCALING, LABEL_CONFIG } from 'components/Toucan/Auction/BidDistributionChart/constants' +import { + calculateDynamicLabelIncrement, + formatTickForDisplay, +} from 'components/Toucan/Auction/BidDistributionChart/utils/utils' +import { BidTokenInfo, DisplayMode } from 'components/Toucan/Auction/store/types' +import { IChartApi, UTCTimestamp } from 'lightweight-charts' +import { useCallback } from 'react' +import { UseSporeColorsReturn } from 'ui/src/hooks/useSporeColors' + +interface UseChartLabelsParams { + minTick: number + maxTick: number + labelIncrement: number | undefined + tickSize: number + displayMode: DisplayMode + bidTokenInfo: BidTokenInfo + totalSupply?: string + auctionTokenDecimals: number + formatter: (amount: number) => string + colors: UseSporeColorsReturn +} + +/** + * Hook for managing custom x-axis labels on the chart + */ +export function useChartLabels(params: UseChartLabelsParams) { + const { tickSize, displayMode, bidTokenInfo, totalSupply, auctionTokenDecimals, formatter, colors } = params + + /** + * Creates a single label DOM element with proper styling and positioning + */ + const createLabelElement = useCallback( + (params: { tickValue: number; x: number; plotLeft: number }): HTMLDivElement => { + const { tickValue, x, plotLeft } = params + const label = document.createElement('div') + Object.assign(label.style, { + position: 'absolute', + left: `${x + plotLeft}px`, + bottom: '0', + transform: 'translateX(-50%)', // Center label on the x coordinate + color: colors.neutral2.val, + fontSize: `${LABEL_CONFIG.FONT_SIZE}px`, + lineHeight: `${LABEL_CONFIG.LINE_HEIGHT}px`, + whiteSpace: 'nowrap', + }) + + // Format label based on display mode + const formattedValue = formatTickForDisplay({ + tickValue, + displayMode, + bidTokenInfo, + totalSupply, + auctionTokenDecimals, + formatter, + }) + label.textContent = formattedValue + + return label + }, + [displayMode, bidTokenInfo, totalSupply, auctionTokenDecimals, formatter, colors.neutral2.val], + ) + + /** + * Renders custom x-axis labels at evenly spaced intervals + * Dynamically calculates label increment based on the visible range + */ + const renderLabels = useCallback( + (params: { labelsLayer: HTMLDivElement; chart: IChartApi; plotLeft: number }) => { + const { labelsLayer, chart, plotLeft } = params + labelsLayer.innerHTML = '' + + // Get the current visible range from the chart + // Wrap in try-catch because lightweight-charts throws an error instead of returning null + // when the chart is not fully initialized (e.g., on initial load or display mode change) + let visibleRange + try { + visibleRange = chart.timeScale().getVisibleRange() + } catch { + // Chart not initialized yet, skip rendering labels + return + } + + // Guard against null - chart may not be initialized yet + if (!visibleRange) { + return + } + + // Convert visible range from scaled coordinates to tick values + const visibleFromTick = (visibleRange.from as number) / COORDINATE_SCALING.PRICE_SCALE_FACTOR + const visibleToTick = (visibleRange.to as number) / COORDINATE_SCALING.PRICE_SCALE_FACTOR + + // Calculate dynamic label increment based on currently visible range + const dynamicLabelIncrement = calculateDynamicLabelIncrement({ + visibleFrom: visibleFromTick, + visibleTo: visibleToTick, + tickSize, + }) + + // Find the first label index (multiple of dynamicLabelIncrement that's >= visibleFromTick) + const startIndex = Math.ceil(visibleFromTick / dynamicLabelIncrement) + const endIndex = Math.floor(visibleToTick / dynamicLabelIncrement) + + // Generate labels using multiplier index to avoid floating-point drift + for (let multiplierIndex = startIndex; multiplierIndex <= endIndex; multiplierIndex++) { + // Calculate tick value directly from multiplier (avoids floating-point errors) + const tickValue = multiplierIndex * dynamicLabelIncrement + + // Convert tick value to time coordinate (must match bar data points) + const timeValue = Math.round(tickValue * COORDINATE_SCALING.PRICE_SCALE_FACTOR) as UTCTimestamp + const x = chart.timeScale().timeToCoordinate(timeValue) + + // Skip if calculated label position doesn't correspond to an actual data point + // (timeToCoordinate returns null when the time value doesn't exist in the chart's data) + if (x == null) { + continue + } + + const label = createLabelElement({ tickValue, x, plotLeft }) + labelsLayer.appendChild(label) + } + }, + [tickSize, createLabelElement], + ) + + return { renderLabels } +} diff --git a/apps/web/src/components/Toucan/Auction/BidDistributionChart/hooks/useChartTooltip.ts b/apps/web/src/components/Toucan/Auction/BidDistributionChart/hooks/useChartTooltip.ts new file mode 100644 index 00000000000..7a81d28f279 --- /dev/null +++ b/apps/web/src/components/Toucan/Auction/BidDistributionChart/hooks/useChartTooltip.ts @@ -0,0 +1,72 @@ +import { TOOLTIP_CONFIG } from 'components/Toucan/Auction/BidDistributionChart/constants' +import { formatTickForDisplay } from 'components/Toucan/Auction/BidDistributionChart/utils/utils' +import { BidTokenInfo, DisplayMode } from 'components/Toucan/Auction/store/types' +import { useCallback } from 'react' +import { useTranslation } from 'react-i18next' +import { UseSporeColorsReturn } from 'ui/src/hooks/useSporeColors' +import { zIndexes } from 'ui/src/theme' + +interface UseChartTooltipParams { + displayMode: DisplayMode + bidTokenInfo: BidTokenInfo + totalSupply?: string + auctionTokenDecimals: number + formatter: (amount: number) => string + volumeFormatter: (amount: number) => string + colors: UseSporeColorsReturn +} + +/** + * Manages tooltip style + text that shows when user hovers over chart bar + */ +export function useChartTooltip(params: UseChartTooltipParams) { + const { displayMode, bidTokenInfo, totalSupply, auctionTokenDecimals, formatter, volumeFormatter, colors } = params + const { t } = useTranslation() + + const fdvText = t('stats.fdv') + + const createTooltipElement = useCallback((): HTMLDivElement => { + const tooltip = document.createElement('div') + Object.assign(tooltip.style, { + position: 'absolute', + pointerEvents: 'none', + background: colors.surface2.val, + color: colors.neutral1.val, + zIndex: String(zIndexes.tooltip), + fontSize: `${TOOLTIP_CONFIG.FONT_SIZE}px`, + padding: TOOLTIP_CONFIG.PADDING, + borderRadius: TOOLTIP_CONFIG.BORDER_RADIUS, + transform: `translate(-50%, -${TOOLTIP_CONFIG.VERTICAL_OFFSET_PERCENT}%)`, + whiteSpace: 'nowrap', + display: 'none', + }) + return tooltip + }, [colors.neutral1.val, colors.surface2.val]) + + /** + * Formats tooltip text based on display mode, tick value, and volume amount + */ + const formatTooltipText = useCallback( + (tickValue: number, volumeAmount: number): string => { + const tickDisplay = formatTickForDisplay({ + tickValue, + displayMode, + bidTokenInfo, + totalSupply, + auctionTokenDecimals, + formatter, + }) + + // Handle zero values explicitly to show "0" instead of "-" + const volumeDisplay = volumeAmount === 0 ? '0' : volumeFormatter(volumeAmount) + + // Add "FDV" suffix when in valuation mode + const suffix = displayMode === DisplayMode.VALUATION ? ` ${fdvText}` : '' + + return `${volumeDisplay} @ ${tickDisplay}${suffix}` + }, + [displayMode, bidTokenInfo, totalSupply, auctionTokenDecimals, formatter, volumeFormatter, fdvText], + ) + + return { createTooltipElement, formatTooltipText } +} diff --git a/apps/web/src/components/Toucan/Auction/BidDistributionChart/utils/bidConcentration.ts b/apps/web/src/components/Toucan/Auction/BidDistributionChart/utils/bidConcentration.ts new file mode 100644 index 00000000000..bc8542d20f6 --- /dev/null +++ b/apps/web/src/components/Toucan/Auction/BidDistributionChart/utils/bidConcentration.ts @@ -0,0 +1,102 @@ +/** + * Utility functions for calculating bid concentration bands + */ + +export interface BidConcentrationResult { + startTick: number // Starting tick value + endTick: number // Ending tick value + startIndex: number // Starting bar index in original bars array + endIndex: number // Ending bar index in original bars array (inclusive) + percentage: number // Percentage of total volume (0-1) +} + +interface BarWithVolume { + tick: number + amount: number + index: number +} + +interface BidConcentrationOptions { + bars: BarWithVolume[] + clearingPrice: number + targetPercentage?: number + minClusterSize?: number +} + +/** + * Calculate bid concentration: find the largest sequential cluster of bars + * that contains approximately 80% of the total bid volume. + * Only considers bids at or above the clearing price. + * + * @param options - Configuration options + * @param options.bars - Array of bars with tick, amount, and index + * @param options.clearingPrice - Clearing price (only bars >= this price are considered) + * @param options.targetPercentage - Target percentage of total volume (default 0.8 for 80%) + * @param options.minClusterSize - Minimum number of bars required to show concentration (default 3) + * @returns Concentration band info or null if no suitable cluster found + */ +export function calculateBidConcentration({ + bars, + clearingPrice, + targetPercentage = 0.8, + minClusterSize = 3, +}: BidConcentrationOptions): BidConcentrationResult | null { + // Filter out bars with zero amount AND bars below clearing price + // IMPORTANT: Keep original indices intact for renderer to use + const eligibleBars = bars.filter((bar) => { + if (bar.amount === 0) { + return false + } + // Only include bars at or above clearing price + if (bar.tick < clearingPrice) { + return false + } + return true + }) + + if (eligibleBars.length < minClusterSize) { + return null + } + + // Calculate total volume (sum of all bid amounts in fiat) + const totalVolume = eligibleBars.reduce((sum, bar) => sum + bar.amount, 0) + + if (totalVolume === 0) { + return null + } + + const targetVolume = totalVolume * targetPercentage + + // Try to find the smallest sequential window that captures >= targetVolume + let bestCluster: BidConcentrationResult | null = null + let bestClusterSize = Infinity + + // Sliding window approach: for each starting position, expand window until we reach target + for (let start = 0; start < eligibleBars.length; start++) { + let windowVolume = 0 + for (let end = start; end < eligibleBars.length; end++) { + windowVolume += eligibleBars[end].amount + + // If we've reached or exceeded the target volume + if (windowVolume >= targetVolume) { + const clusterSize = end - start + 1 + + // Track the smallest cluster that meets the target + if (clusterSize < bestClusterSize && clusterSize >= minClusterSize) { + bestClusterSize = clusterSize + bestCluster = { + startTick: eligibleBars[start].tick, + endTick: eligibleBars[end].tick, + // Use original bar.index from the full bars array, not the filtered array index + startIndex: eligibleBars[start].index, + endIndex: eligibleBars[end].index, + percentage: windowVolume / totalVolume, + } + } + break // Move to next starting position + } + } + } + + return bestCluster +} diff --git a/apps/web/src/components/Toucan/Auction/BidDistributionChart/utils/clearingPrice/label.ts b/apps/web/src/components/Toucan/Auction/BidDistributionChart/utils/clearingPrice/label.ts new file mode 100644 index 00000000000..38b1b345eae --- /dev/null +++ b/apps/web/src/components/Toucan/Auction/BidDistributionChart/utils/clearingPrice/label.ts @@ -0,0 +1,61 @@ +import { formatTickForDisplay } from 'components/Toucan/Auction/BidDistributionChart/utils/utils' +import { BidTokenInfo, DisplayMode } from 'components/Toucan/Auction/store/types' + +/** + * Parameters for formatting a clearing price label + */ +interface FormatClearingPriceLabelParams { + clearingPrice: number // Clearing price in decimal form + displayMode: DisplayMode // Current display mode (token price vs valuation) + bidTokenInfo: BidTokenInfo // Token information for formatting + totalSupply?: string // Total supply for valuation calculations + auctionTokenDecimals: number // Decimals for the auction token + formatter: (amount: number) => string // Number formatter function +} + +/** + * Formats a clearing price value for display on the chart label. + * + * This pure function creates a formatted label string that's consistent with + * the chart's tick labels and display mode. It's decoupled from the tooltip + * formatting logic, making it independently testable and reusable. + * + * @param params - Formatting parameters + * @returns Formatted clearing price string + * + * @example + * ```typescript + * // Token price mode + * formatClearingPriceLabel({ + * clearingPrice: 1.5, + * displayMode: DisplayMode.TOKEN_PRICE, + * bidTokenInfo: { decimals: 6, ... }, + * formatter: (n) => `$${n.toFixed(2)}` + * }) + * // Returns: "$1.50" + * + * // Valuation mode with FDV suffix + * formatClearingPriceLabel({ + * clearingPrice: 1500000, + * displayMode: DisplayMode.VALUATION, + * totalSupply: "1000000", + * ... + * }) + * // Returns: "$1.5M FDV" + * ``` + */ +export function formatClearingPriceLabel(params: FormatClearingPriceLabelParams): string { + const { clearingPrice, displayMode, bidTokenInfo, totalSupply, auctionTokenDecimals, formatter } = params + + // Use the same formatter as chart tick labels for consistency + const formattedValue = formatTickForDisplay({ + tickValue: clearingPrice, + displayMode, + bidTokenInfo, + totalSupply, + auctionTokenDecimals, + formatter, + }) + + return formattedValue +} diff --git a/apps/web/src/components/Toucan/Auction/BidDistributionChart/utils/clearingPrice/position.test.ts b/apps/web/src/components/Toucan/Auction/BidDistributionChart/utils/clearingPrice/position.test.ts new file mode 100644 index 00000000000..3e00f7eebd6 --- /dev/null +++ b/apps/web/src/components/Toucan/Auction/BidDistributionChart/utils/clearingPrice/position.test.ts @@ -0,0 +1,292 @@ +import { COORDINATE_SCALING } from 'components/Toucan/Auction/BidDistributionChart/constants' +import { findClearingPriceXPosition } from 'components/Toucan/Auction/BidDistributionChart/utils/clearingPrice/position' + +describe('findClearingPriceXPosition', () => { + describe('exact position match', () => { + it('returns bar center when clearing price exactly matches bar tick value', () => { + const bars = [ + { tickValue: 1.0, column: { left: 10, right: 20 } }, + { tickValue: 2.0, column: { left: 30, right: 40 } }, + ] + + const result = findClearingPriceXPosition({ + clearingPrice: 1.0, + bars, + }) + + expect(result).toBe(15) // (10 + 20) / 2 + }) + + it('returns bar center when clearing price is within tolerance of bar', () => { + const bars = [{ tickValue: 1.0, column: { left: 10, right: 20 } }] + + // Clearing price very close to 1.0 (within default tolerance of 1 scaled unit) + const scaleFactor = COORDINATE_SCALING.PRICE_SCALE_FACTOR + const almostOne = (scaleFactor - 0.5) / scaleFactor + + const result = findClearingPriceXPosition({ + clearingPrice: almostOne, + bars, + }) + + expect(result).toBe(15) // Should match despite slight difference + }) + + it('uses custom position tolerance when provided', () => { + const bars = [{ tickValue: 1.0, column: { left: 10, right: 20 } }] + + // With larger tolerance, should match + const result1 = findClearingPriceXPosition({ + clearingPrice: 1.01, + bars, + positionTolerance: 150, // Increased tolerance + }) + expect(result1).toBe(15) + + // With stricter tolerance, should not match + const result2 = findClearingPriceXPosition({ + clearingPrice: 1.01, + bars, + positionTolerance: 0.1, // Very strict tolerance + }) + expect(result2).toBeNull() + }) + }) + + describe('interpolation between bars', () => { + it('interpolates position when clearing price falls between two bars', () => { + const bars = [ + { tickValue: 1.0, column: { left: 10, right: 20 } }, // center: 15 + { tickValue: 2.0, column: { left: 30, right: 40 } }, // center: 35 + ] + + // Clearing price exactly halfway between bars + const result = findClearingPriceXPosition({ + clearingPrice: 1.5, + bars, + }) + + expect(result).toBe(25) // Halfway between 15 and 35 + }) + + it('interpolates correctly at 25% ratio', () => { + const bars = [ + { tickValue: 1.0, column: { left: 0, right: 10 } }, // center: 5 + { tickValue: 2.0, column: { left: 20, right: 30 } }, // center: 25 + ] + + // Clearing price 25% of the way from 1.0 to 2.0 + const result = findClearingPriceXPosition({ + clearingPrice: 1.25, + bars, + }) + + expect(result).toBe(10) // 5 + 0.25 * (25 - 5) = 10 + }) + + it('interpolates correctly at 75% ratio', () => { + const bars = [ + { tickValue: 1.0, column: { left: 0, right: 10 } }, // center: 5 + { tickValue: 2.0, column: { left: 20, right: 30 } }, // center: 25 + ] + + // Clearing price 75% of the way from 1.0 to 2.0 + const result = findClearingPriceXPosition({ + clearingPrice: 1.75, + bars, + }) + + expect(result).toBe(20) // 5 + 0.75 * (25 - 5) = 20 + }) + + it('handles non-uniform bar spacing', () => { + const bars = [ + { tickValue: 1.0, column: { left: 0, right: 5 } }, // center: 2.5 + { tickValue: 3.0, column: { left: 100, right: 120 } }, // center: 110 + ] + + // Clearing price exactly halfway (2.0) between 1.0 and 3.0 + const result = findClearingPriceXPosition({ + clearingPrice: 2.0, + bars, + }) + + expect(result).toBe(56.25) // 2.5 + 0.5 * (110 - 2.5) = 56.25 + }) + }) + + describe('edge cases', () => { + it('returns null when bars array is empty', () => { + const result = findClearingPriceXPosition({ + clearingPrice: 1.5, + bars: [], + }) + + expect(result).toBeNull() + }) + + it('returns null when no bars have column data', () => { + const bars = [{ tickValue: 1.0 }, { tickValue: 2.0 }] + + const result = findClearingPriceXPosition({ + clearingPrice: 1.5, + bars, + }) + + expect(result).toBeNull() + }) + + it('returns null when clearing price is below all bars', () => { + const bars = [ + { tickValue: 2.0, column: { left: 20, right: 30 } }, + { tickValue: 3.0, column: { left: 40, right: 50 } }, + ] + + const result = findClearingPriceXPosition({ + clearingPrice: 1.0, // Below all bars + bars, + }) + + expect(result).toBeNull() + }) + + it('returns null when clearing price is above all bars', () => { + const bars = [ + { tickValue: 1.0, column: { left: 10, right: 20 } }, + { tickValue: 2.0, column: { left: 30, right: 40 } }, + ] + + const result = findClearingPriceXPosition({ + clearingPrice: 3.0, // Above all bars + bars, + }) + + expect(result).toBeNull() + }) + + it('skips bars without column data and continues searching', () => { + const bars = [ + { tickValue: 1.0 }, // No column + { tickValue: 1.5, column: { left: 10, right: 20 } }, + { tickValue: 2.0, column: { left: 30, right: 40 } }, + ] + + const result = findClearingPriceXPosition({ + clearingPrice: 1.75, + bars, + }) + + // Should interpolate between second and third bars (skipping first) + expect(result).toBe(25) // Halfway between 15 and 35 + }) + + it('handles single bar with exact match', () => { + const bars = [{ tickValue: 1.5, column: { left: 10, right: 20 } }] + + const result = findClearingPriceXPosition({ + clearingPrice: 1.5, + bars, + }) + + expect(result).toBe(15) + }) + + it('handles single bar without match', () => { + const bars = [{ tickValue: 1.0, column: { left: 10, right: 20 } }] + + const result = findClearingPriceXPosition({ + clearingPrice: 2.0, + bars, + }) + + expect(result).toBeNull() + }) + }) + + describe('precision and rounding', () => { + it('handles decimal tick values correctly', () => { + const bars = [ + { tickValue: 1.123, column: { left: 10, right: 20 } }, + { tickValue: 1.456, column: { left: 30, right: 40 } }, + ] + + const result = findClearingPriceXPosition({ + clearingPrice: 1.2895, // Midpoint + bars, + }) + + expect(result).toBeCloseTo(25, 1) // Should be approximately halfway + }) + + it('handles very small tick differences', () => { + const bars = [ + { tickValue: 0.0001, column: { left: 10, right: 20 } }, + { tickValue: 0.0002, column: { left: 30, right: 40 } }, + ] + + const result = findClearingPriceXPosition({ + clearingPrice: 0.00015, + bars, + }) + + // Note: Scale factor (10000) causes rounding. 0.00015 * 10000 = 1.5 → rounds to 2 + // This matches bar1 (0.0001 * 10000 = 1), so returns bar1 center + expect(result).toBe(15) + }) + + it('handles large tick values', () => { + const bars = [ + { tickValue: 1000000, column: { left: 10, right: 20 } }, + { tickValue: 2000000, column: { left: 30, right: 40 } }, + ] + + const result = findClearingPriceXPosition({ + clearingPrice: 1500000, + bars, + }) + + expect(result).toBe(25) // Halfway + }) + }) + + describe('real-world scenarios', () => { + it('handles typical auction bid distribution with multiple bars', () => { + // Simulating a real auction with 5 price points + const bars = [ + { tickValue: 1.0, column: { left: 0, right: 10 } }, + { tickValue: 1.25, column: { left: 15, right: 25 } }, + { tickValue: 1.5, column: { left: 30, right: 40 } }, // Clearing price near here + { tickValue: 1.75, column: { left: 45, right: 55 } }, + { tickValue: 2.0, column: { left: 60, right: 70 } }, + ] + + // Clearing price slightly above 1.5 + const result = findClearingPriceXPosition({ + clearingPrice: 1.6, + bars, + }) + + // Should interpolate between bars at 1.5 and 1.75 + // Bar centers: 35 and 50 + // Ratio: (1.6 - 1.5) / (1.75 - 1.5) = 0.1 / 0.25 = 0.4 + // Result: 35 + 0.4 * (50 - 35) = 41 + expect(result).toBe(41) + }) + + it('handles bars with varying widths', () => { + const bars = [ + { tickValue: 1.0, column: { left: 0, right: 5 } }, // Narrow bar + { tickValue: 2.0, column: { left: 10, right: 30 } }, // Wide bar + ] + + const result = findClearingPriceXPosition({ + clearingPrice: 1.5, + bars, + }) + + // Centers: 2.5 and 20 + // Halfway: 2.5 + 0.5 * (20 - 2.5) = 11.25 + expect(result).toBe(11.25) + }) + }) +}) diff --git a/apps/web/src/components/Toucan/Auction/BidDistributionChart/utils/clearingPrice/position.ts b/apps/web/src/components/Toucan/Auction/BidDistributionChart/utils/clearingPrice/position.ts new file mode 100644 index 00000000000..8896fd37602 --- /dev/null +++ b/apps/web/src/components/Toucan/Auction/BidDistributionChart/utils/clearingPrice/position.ts @@ -0,0 +1,143 @@ +import { COORDINATE_SCALING } from 'components/Toucan/Auction/BidDistributionChart/constants' + +/** + * Represents a bar's position and tick value for clearing price calculations + */ +interface BarPosition { + tickValue: number + column?: { + left: number + right: number + } +} + +/** + * Parameters for finding the clearing price X position + */ +interface FindClearingPriceXPositionParams { + clearingPrice: number // Clearing price in decimal form + bars: BarPosition[] // Array of bars with position and tick information + positionTolerance?: number // Tolerance for exact position matching (default: 1) +} + +/** + * Finds the X-coordinate for drawing a vertical line at the clearing price position. + * + * This pure function handles three cases: + * 1. Clearing price exactly matches a bar's position → returns bar center + * 2. Clearing price falls between two bars → interpolates between their centers + * 3. Clearing price outside bar range → returns null + * + * @param params - Parameters for position calculation + * @returns X-coordinate in pixels, or null if position cannot be determined + * + * @example + * ```typescript + * const lineX = findClearingPriceXPosition({ + * clearingPrice: 1.5, + * bars: [ + * { tickValue: 1.0, column: { left: 10, right: 20 } }, + * { tickValue: 2.0, column: { left: 30, right: 40 } } + * ] + * }) + * // Returns: 25 (interpolated between bars) + * ``` + */ +export function findClearingPriceXPosition(params: FindClearingPriceXPositionParams): number | null { + const { clearingPrice, bars, positionTolerance = 1 } = params + + // Convert clearing price to scaled coordinate for comparison + const clearingPriceScaled = Math.round(clearingPrice * COORDINATE_SCALING.PRICE_SCALE_FACTOR) + + // Find bars surrounding the clearing price + for (let i = 0; i < bars.length; i++) { + const bar = bars[i] + const nextBar = bars[i + 1] + + // Skip bars without column data + if (!bar.column) { + continue + } + + const barTimeScaled = Math.round(bar.tickValue * COORDINATE_SCALING.PRICE_SCALE_FACTOR) + + // Case 1: Clearing price exactly at this bar + if (Math.abs(barTimeScaled - clearingPriceScaled) < positionTolerance) { + return getBarCenter(bar.column) + } + + // Case 2: Clearing price between this bar and next + // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition + if (!nextBar || !nextBar.column) { + continue + } + + const nextBarTimeScaled = Math.round(nextBar.tickValue * COORDINATE_SCALING.PRICE_SCALE_FACTOR) + + if (barTimeScaled <= clearingPriceScaled && clearingPriceScaled <= nextBarTimeScaled) { + return interpolateBarPosition({ + clearingPriceScaled, + bar1: { tickValue: barTimeScaled, column: bar.column }, + bar2: { tickValue: nextBarTimeScaled, column: nextBar.column }, + }) + } + } + + // Case 3: Position not found + return null +} + +/** + * Calculates the center X coordinate of a bar column + */ +function getBarCenter(column: { left: number; right: number }): number { + return (column.left + column.right) / 2 +} + +/** + * Parameters for interpolating between two bar positions + */ +interface InterpolateBarPositionParams { + clearingPriceScaled: number + bar1: { tickValue: number; column: { left: number; right: number } } + bar2: { tickValue: number; column: { left: number; right: number } } +} + +/** + * Interpolates the X position between two bars based on clearing price ratio. + * + * Uses linear interpolation to find the exact position where the clearing price + * line should be drawn when it falls between two bar positions. + * + * @param params - Interpolation parameters + * @returns Interpolated X-coordinate in pixels + * + * @example + * ```typescript + * // Clearing price at 1.5, bar1 at 1.0, bar2 at 2.0 + * // Returns position 50% between the two bars + * interpolateBarPosition({ + * clearingPriceScaled: 15000, + * bar1: { tickValue: 10000, column: { left: 10, right: 20 } }, + * bar2: { tickValue: 20000, column: { left: 30, right: 40 } } + * }) + * ``` + */ +function interpolateBarPosition(params: InterpolateBarPositionParams): number { + const { clearingPriceScaled, bar1, bar2 } = params + + // Guard against division by zero when bars have identical tick values + if (bar2.tickValue === bar1.tickValue) { + return getBarCenter(bar1.column) + } + + // Calculate ratio: how far between bar1 and bar2 is the clearing price? + const ratio = (clearingPriceScaled - bar1.tickValue) / (bar2.tickValue - bar1.tickValue) + + // Get center positions of both bars + const bar1CenterX = getBarCenter(bar1.column) + const bar2CenterX = getBarCenter(bar2.column) + + // Linear interpolation between the two centers + return bar1CenterX + ratio * (bar2CenterX - bar1CenterX) +} diff --git a/apps/web/src/components/Toucan/Auction/BidDistributionChart/utils/utils.ts b/apps/web/src/components/Toucan/Auction/BidDistributionChart/utils/utils.ts new file mode 100644 index 00000000000..69619796f21 --- /dev/null +++ b/apps/web/src/components/Toucan/Auction/BidDistributionChart/utils/utils.ts @@ -0,0 +1,494 @@ +import { + CHART_CONSTRAINTS, + DEFAULT_Y_AXIS_LEVELS, + LABEL_GENERATION, + NICE_VALUES, + TOLERANCE, +} from 'components/Toucan/Auction/BidDistributionChart/constants' +import { + BidConcentrationResult, + calculateBidConcentration, +} from 'components/Toucan/Auction/BidDistributionChart/utils/bidConcentration' +import { BidDistributionData, BidTokenInfo, DisplayMode } from 'components/Toucan/Auction/store/types' +import { formatUnits } from 'viem' + +/** + * Represents a single bar in the distribution chart + */ +// eslint-disable-next-line import/no-unused-modules +export interface ChartBarData { + tick: number // Tick value in smallest unit + tickDisplay: string // Formatted tick for display + amount: number // Bid amount in USD (converted from base token using bidTokenInfo.priceFiat) + index: number // Bar index for positioning +} + +/** + * Processed chart data with calculated axis information + */ +// eslint-disable-next-line import/no-unused-modules +export interface ProcessedChartData { + bars: ChartBarData[] + yAxisLevels: number[] + minTick: number + maxTick: number + maxAmount: number + labelIncrement?: number + concentration: BidConcentrationResult | null +} + +/** + * Converts a value from smallest unit to decimal using viem's formatUnits + * + * @param value - Value in smallest unit (as string) + * @param decimals - Number of decimals + * @returns Decimal number + */ +function toDecimal(value: string, decimals: number): number { + return Number(formatUnits(BigInt(value), decimals)) +} + +/** + * Calculate bar step size and range for the chart + * Rules: + * 1. Minimum 20 bars total + * 2. Bars step by tick_size multiples + * 3. Range extends beyond data if needed to reach 20 bars + */ +function calculateBarStepAndRange(params: { minTick: number; maxTick: number; tickSize: number }): { + barStep: number // Step size between bars (multiple of tick_size) + rangeMax: number // Adjusted max tick to achieve min 20 bars + totalBars: number // Total number of bars +} { + const { minTick, maxTick, tickSize } = params + + // Calculate how many tick_size steps exist in the data range + const dataSteps = Math.round((maxTick - minTick) / tickSize) + 1 + + if (dataSteps >= CHART_CONSTRAINTS.MIN_BARS) { + // We have enough steps, use them all + return { + barStep: tickSize, + rangeMax: maxTick, + totalBars: dataSteps, + } + } else { + // Need to extend range to reach MIN_BARS + // Calculate how many tick_size steps needed beyond maxTick + const additionalSteps = CHART_CONSTRAINTS.MIN_BARS - dataSteps + const rangeMax = maxTick + additionalSteps * tickSize + + return { + barStep: tickSize, + rangeMax, + totalBars: CHART_CONSTRAINTS.MIN_BARS, + } + } +} + +/** + * Normalizes a value to its order of magnitude and normalized form + * @param value - The value to normalize + * @returns Object with magnitude (power of 10) and normalized value (1-10 range) + */ +function normalizeValue(value: number): { magnitude: number; normalized: number } { + if (value <= 0) { + return { magnitude: 1, normalized: 1 } + } + const magnitude = Math.pow(10, Math.floor(Math.log10(value))) + const normalized = value / magnitude + return { magnitude, normalized } +} + +/** + * Rounds a number to the nearest "nice" value for chart labels + * Nice values are typically 1, 2, 5 (or with 2.5 for finer granularity) + * + * @example + * roundToNiceNumber(350) // 500 (normalized: 3.5 rounds up to 5, magnitude: 100) + * roundToNiceNumber(350, [1, 2, 2.5, 5]) // 500 + * roundToNiceNumber(230, [1, 2, 2.5, 5]) // 250 (2.5 * 100) + * + * @param value - The value to round + * @param niceValues - Array of normalized "nice" values (default: NICE_VALUES.STANDARD) + * @returns The rounded "nice" number + */ +function roundToNiceNumber(value: number, niceValues: readonly number[] = NICE_VALUES.STANDARD): number { + const { magnitude, normalized } = normalizeValue(value) + + // Find the first nice value >= normalized + for (const nice of niceValues) { + if (normalized <= nice) { + return nice * magnitude + } + } + + // If normalized exceeds all nice values, scale up to next magnitude + return niceValues[0] * magnitude * 10 +} + +/** + * Generates candidate multipliers dynamically based on the range + * Creates "nice" round numbers that produce the target number of labels + */ +function generateDynamicCandidates(params: { minMultiplier: number; maxMultiplier: number }): number[] { + const { minMultiplier, maxMultiplier } = params + + const candidates = new Set() + + // Always include small multipliers for small ranges + const baseMultipliers = [1, 2, 3, 4, 5, 6, 8, 10, 12, 15, 20, 25, 30, 40, 50, 60, 75, 80, 100] + for (const m of baseMultipliers) { + if (m >= minMultiplier && m <= maxMultiplier) { + candidates.add(m) + } + } + + // Generate nice round numbers within the range + // Use powers of 10, 5, and 2 to create nice increments + let current = Math.max(1, minMultiplier) + while (current <= maxMultiplier) { + const rounded = roundToNiceNumber(current) + if (rounded >= minMultiplier && rounded <= maxMultiplier) { + candidates.add(rounded) + } + + // Step by nice increments + if (current < 10) { + current += 1 + } else if (current < 100) { + current += 10 + } else if (current < 1000) { + current += 50 + } else { + current += 100 + } + } + + // Always include the boundary values rounded to nice numbers + candidates.add(roundToNiceNumber(minMultiplier)) + candidates.add(roundToNiceNumber(maxMultiplier)) + + return Array.from(candidates).sort((a, b) => a - b) +} + +/** + * Checks if a multiplier is a "nice" round number + * Nice numbers are values like 1, 2, 5, 10, 20, 50, 100, 200, 500, 1000, etc. + * + * @example + * isNiceMultiplier(50) // true (5 * 10) + * isNiceMultiplier(75) // false (7.5 is not in [1, 2, 5]) + * + * @param multiplier - The multiplier to check + * @param niceValues - Array of normalized "nice" values (default: NICE_VALUES.STANDARD) + * @returns true if the multiplier is a nice round number + */ +function isNiceMultiplier(multiplier: number, niceValues: readonly number[] = NICE_VALUES.STANDARD): boolean { + const { normalized } = normalizeValue(multiplier) + return niceValues.includes(normalized) +} + +/** + * Calculate x-axis label increment for optimal evenly spaced labels + * Labels align with tick_size boundaries and aim for 7-12 total labels + * Prefers "nice" round numbers (multiples of 1, 2, 5, 10, 20, 50, 100, etc.) + * Dynamically handles any range size from tiny to extreme + */ +function calculateLabelIncrement(params: { minTick: number; rangeMax: number; tickSize: number }): number { + const { minTick, rangeMax, tickSize } = params + const range = rangeMax - minTick + + // Calculate theoretical multiplier bounds to achieve target label count + // minMultiplier produces MAX_LABELS, maxMultiplier produces MIN_LABELS + const minMultiplier = Math.max(1, Math.ceil(range / (LABEL_GENERATION.MAX_LABELS * tickSize))) + const maxMultiplier = Math.max(1, Math.floor(range / (LABEL_GENERATION.MIN_LABELS * tickSize))) + + // Generate candidates dynamically based on the actual range + const candidates = generateDynamicCandidates({ minMultiplier, maxMultiplier }) + + let bestMultiplier = 0 + let bestScore = Infinity + + // Evaluate all candidates + for (const multiplier of candidates) { + const labelIncrement = multiplier * tickSize + const numLabels = Math.floor(range / labelIncrement) + 1 + + // Skip if outside acceptable range + if (numLabels < LABEL_GENERATION.MIN_LABELS || numLabels > LABEL_GENERATION.MAX_LABELS) { + continue + } + + // Score based on: distance from ideal count + preference for nice round numbers + const countDiff = Math.abs(numLabels - LABEL_GENERATION.IDEAL_LABELS) + const roundnessBonus = isNiceMultiplier(multiplier) ? -2 : 0 + const score = countDiff + roundnessBonus + + if (score < bestScore) { + bestScore = score + bestMultiplier = multiplier + } + } + + // Fallback: if no candidate produces 7-12 labels, calculate the ideal multiplier + if (bestMultiplier === 0) { + const idealMultiplier = Math.max(1, Math.ceil(range / (LABEL_GENERATION.IDEAL_LABELS * tickSize))) + bestMultiplier = roundToNiceNumber(idealMultiplier) + + // Validate the fallback produces acceptable label count + const fallbackLabelCount = Math.floor(range / (bestMultiplier * tickSize)) + 1 + + // If still outside range, relax to nearest boundary + if (fallbackLabelCount < LABEL_GENERATION.MIN_LABELS) { + // Too few labels - reduce multiplier to increase label count + bestMultiplier = Math.max(1, Math.floor(range / ((LABEL_GENERATION.MIN_LABELS - 1) * tickSize))) + } else if (fallbackLabelCount > LABEL_GENERATION.MAX_LABELS) { + // Too many labels - increase multiplier to decrease label count + bestMultiplier = Math.max(1, Math.ceil(range / ((LABEL_GENERATION.MAX_LABELS + 1) * tickSize))) + } + } + + return bestMultiplier * tickSize +} + +/** + * Calculate 6 Y-axis levels based on the maximum bid amount + */ +function calculateYAxisLevels(maxAmount: number): number[] { + if (maxAmount === 0) { + return [...DEFAULT_Y_AXIS_LEVELS] + } + + // Calculate a nice increment for 5 steps (6 levels including 0), using Y-axis nice values (including 2.5) + const niceIncrement = roundToNiceNumber(maxAmount / 5, NICE_VALUES.WITH_HALF) + return [0, niceIncrement] +} + +function calculateTickDisplayValue(params: { + tickValue: number + displayMode: DisplayMode + bidTokenInfo: BidTokenInfo + totalSupply?: string + auctionTokenDecimals?: number +}): number { + const { tickValue, displayMode, bidTokenInfo, totalSupply, auctionTokenDecimals = 18 } = params + // Convert tick value to USD (tick is already in bid token units, multiply by price) + const tickInUSD = tickValue * bidTokenInfo.priceFiat + + if (displayMode === DisplayMode.TOKEN_PRICE) { + // Show as token price in USD + return tickInUSD + } else { + // Valuation mode: multiply by total supply to get FDV + if (!totalSupply) { + return tickInUSD + } + + // Convert totalSupply to decimal tokens using the auction token decimals + const totalTokens = toDecimal(totalSupply, auctionTokenDecimals) + return tickInUSD * totalTokens + } +} + +/** + * Format tick value for display (exported for chart component) + * Uses provided formatter function for localized formatting + */ +export function formatTickForDisplay(params: { + tickValue: number + displayMode: DisplayMode + bidTokenInfo: BidTokenInfo + totalSupply?: string + auctionTokenDecimals?: number + formatter: (amount: number) => string +}): string { + const { formatter, ...rest } = params + const displayValue = calculateTickDisplayValue(rest) + return formatter(displayValue) +} + +/** + * Generate chart data from raw bid distribution data + */ +export function generateChartData(params: { + bidData: BidDistributionData + bidTokenInfo: BidTokenInfo + displayMode: DisplayMode + totalSupply?: string + auctionTokenDecimals?: number + clearingPrice: string + tickSize: string + formatter: (amount: number) => string +}): ProcessedChartData { + const { + bidData, + bidTokenInfo, + displayMode, + totalSupply, + auctionTokenDecimals = 18, + clearingPrice, + tickSize, + formatter, + } = params + + // Convert tick_size to decimal + const tickSizeDecimal = toDecimal(tickSize, bidTokenInfo.decimals) + + // Convert map entries to sorted array using BigInt-safe conversion + const entries = Array.from(bidData.entries()) + .map(([tick, amount]) => ({ + tick: toDecimal(tick, bidTokenInfo.decimals), + amount: toDecimal(amount, bidTokenInfo.decimals) * bidTokenInfo.priceFiat, // Convert to USD + })) + .sort((a, b) => a.tick - b.tick) + + if (entries.length === 0) { + // Derive maxTick from tickSize: maxTick = minTick + (MIN_BARS - 1) * tickSize ensures exactly 20 bars + const emptyMaxTick = (CHART_CONSTRAINTS.MIN_BARS - 1) * tickSizeDecimal + + return { + bars: [], + yAxisLevels: [...DEFAULT_Y_AXIS_LEVELS], + minTick: 0, + maxTick: emptyMaxTick, + maxAmount: 0, + concentration: null, + } + } + + // Convert clearingPrice to decimal + const clearingPriceDecimal = toDecimal(clearingPrice, bidTokenInfo.decimals) + + // Rule 1 & 5: Use clearingPrice as minTick if it's lower than the lowest bid tick + let minTick = entries[0].tick + if (clearingPriceDecimal < minTick) { + minTick = clearingPriceDecimal + } + + const maxTickFromData = entries[entries.length - 1].tick + const maxAmount = Math.max(...entries.map((e) => e.amount)) + + // Rule 3 & 6 & 7: Calculate bar step and range + const { barStep, rangeMax, totalBars } = calculateBarStepAndRange({ + minTick, + maxTick: maxTickFromData, + tickSize: tickSizeDecimal, + }) + + // Rule 4: Calculate label increment for 10 labels + const labelIncrement = calculateLabelIncrement({ + minTick, + rangeMax, + tickSize: tickSizeDecimal, + }) + + // Build bars array - one bar per tick_size step + const bars: ChartBarData[] = [] + const bidLookup = new Map(entries.map((e) => [e.tick, e.amount])) + + for (let i = 0; i < totalBars; i++) { + const currentTick = minTick + i * barStep + + // Find exact match or very close match (within small tolerance for floating point) + const tolerance = barStep * TOLERANCE.TICK_COMPARISON + let matchedEntry = bidLookup.get(currentTick) + if (!matchedEntry) { + // Check for near matches + for (const [tick, amount] of bidLookup.entries()) { + if (Math.abs(tick - currentTick) < tolerance) { + matchedEntry = amount + break + } + } + } + + const displayValue = calculateTickDisplayValue({ + tickValue: currentTick, + displayMode, + bidTokenInfo, + totalSupply, + auctionTokenDecimals, + }) + + bars.push({ + tick: currentTick, + tickDisplay: formatter(displayValue), + amount: matchedEntry ?? 0, + index: i, + }) + } + + const yAxisLevels = calculateYAxisLevels(maxAmount) + + // Calculate bid concentration (only for bids at or above clearing price) + const concentration = calculateBidConcentration({ + bars: bars.map((bar) => ({ + tick: bar.tick, + amount: bar.amount, + index: bar.index, + })), + clearingPrice: clearingPriceDecimal, + }) + + return { + bars, + yAxisLevels, + minTick, + maxTick: rangeMax, + maxAmount, + labelIncrement, // Export for chart component to use + concentration, + } +} + +/** + * Calculate initial visible range for zoom functionality + * Shows clearing price (or minTick) at the left edge, plus INITIAL_TICK_COUNT ticks to the right + * + * @param params - Parameters including clearing price, tick size, and data range + * @returns Initial visible range in tick values { from, to } + */ +export function calculateInitialVisibleRange(params: { + clearingPrice: number + minTick: number + maxTick: number + tickSize: number + initialTickCount?: number +}): { from: number; to: number } { + const { clearingPrice, tickSize, initialTickCount = 20 } = params + + // Start from clearing price + const startTick = clearingPrice + + // Calculate end tick by adding initialTickCount ticks + const endTick = startTick + initialTickCount * tickSize + + // Make sure we don't exceed maxTick (but allow exceeding if needed to show initial count) + // The chart will handle empty bars beyond the data range + const finalEndTick = endTick + + return { + from: startTick, + to: Math.max(finalEndTick, startTick + tickSize), // Ensure at least one tick is shown + } +} + +/** + * Calculate label increment dynamically based on current visible range + * Reuses the existing calculateLabelIncrement logic but applies it to the visible range + */ +export function calculateDynamicLabelIncrement(params: { + visibleFrom: number + visibleTo: number + tickSize: number +}): number { + const { visibleFrom, visibleTo, tickSize } = params + + // Use the existing label increment calculation logic + return calculateLabelIncrement({ + minTick: visibleFrom, + rangeMax: visibleTo, + tickSize, + }) +} diff --git a/apps/web/src/components/Toucan/Auction/BidForm.tsx b/apps/web/src/components/Toucan/Auction/BidForm.tsx index 457f55a6c18..3a04ca9043e 100644 --- a/apps/web/src/components/Toucan/Auction/BidForm.tsx +++ b/apps/web/src/components/Toucan/Auction/BidForm.tsx @@ -28,6 +28,9 @@ import { buildCurrencyId } from 'uniswap/src/utils/currencyId' import { useEvent } from 'utilities/src/react/hooks' import { getDurationRemainingString } from 'utilities/src/time/duration' +// TODO(LP-335): replace these with actual ticks relative to the clearing price +const MAX_VALUATION_PRESETS = [1000000, 2000000, 3000000] + function useDurationRemaining(chainId: EVMUniverseChainId, endBlock: number | undefined) { const endBlockTimestamp = useBlockTimestamp({ chainId, @@ -67,21 +70,36 @@ function BidForm({ tokenColor, onBack }: { tokenColor?: ColorTokens; onBack: () const durationRemaining = useDurationRemaining(chainId as EVMUniverseChainId, endBlock) const bidCurrencyInfo = useCurrencyInfo(buildCurrencyId(chainId ?? UniverseChainId.Mainnet, bidTokenAddress ?? '')) - const [exactAmount, setExactAmount] = useState('') - const [isFiatMode, setIsFiatMode] = useState(false) - const currencyBalance = useCurrencyBalance(accountAddress, bidCurrencyInfo?.currency) - const currencyAmount = tryParseCurrencyAmount(exactAmount, bidCurrencyInfo?.currency) - const usdValue = useUSDCValue(currencyAmount) - const onToggleIsFiatMode = useEvent(() => { - setIsFiatMode((prev) => !prev) + // Budget input (top one) + const [exactBudgetAmount, setExactBudgetAmount] = useState('') + const [isBudgetFiatMode, setIsBudgetFiatMode] = useState(false) + const budgetCurrencyAmount = tryParseCurrencyAmount(exactBudgetAmount, bidCurrencyInfo?.currency) + const budgetUsdValue = useUSDCValue(budgetCurrencyAmount) + + const onToggleBudgetFiatMode = useEvent(() => { + setIsBudgetFiatMode((prev) => !prev) }) - const onSetPresetValue = useEvent((amount: string) => { + const onSetBudgetPresetValue = useEvent((amount: string) => { // When preset is selected, switch to token mode and set the amount - setIsFiatMode(false) - setExactAmount(amount) + setIsBudgetFiatMode(false) + setExactBudgetAmount(amount) + }) + + // Max valuation input (bottom one) + const [exactMaxValuationAmount, setExactMaxValuationAmount] = useState('') + const [isMaxValuationFiatMode, setIsMaxValuationFiatMode] = useState(false) + const maxValuationCurrencyAmount = tryParseCurrencyAmount(exactMaxValuationAmount, bidCurrencyInfo?.currency) + const maxValuationUsdValue = useUSDCValue(maxValuationCurrencyAmount) + + const onToggleValuationFiatMode = useEvent(() => { + setIsMaxValuationFiatMode((prev) => !prev) + }) + + const onSetPresetValuation = useEvent((value: number) => { + setExactMaxValuationAmount(value.toString()) }) return ( @@ -110,17 +128,36 @@ function BidForm({ tokenColor, onBack }: { tokenColor?: ColorTokens; onBack: () + state.currentBlockNumber) + + // Determine if we need polling based on auction state + const shouldPoll = useMemo((): boolean => { + if (!chainId || !endBlock) { + return false + } + + // First poll - we need to know current block + if (!currentBlockNumber) { + return true + } + + const current = Number(currentBlockNumber) + + // Auction ended - no need to poll + if (current > endBlock) { + return false + } + + // Auction active or upcoming - keep polling + return true + }, [chainId, endBlock, currentBlockNumber]) + + const { data: blockNumber } = useBlockNumber({ + chainId, + watch: shouldPoll, + query: { + enabled: shouldPoll, + }, + }) + + // biome-ignore lint/correctness/useExhaustiveDependencies: setCurrentBlockNumberAndUpdateProgress is stable from store actions + useEffect(() => { + if (blockNumber !== undefined) { + setCurrentBlockNumberAndUpdateProgress(blockNumber) + } + }, [blockNumber]) +} diff --git a/apps/web/src/components/Toucan/Auction/hooks/useBidTokenInfo.ts b/apps/web/src/components/Toucan/Auction/hooks/useBidTokenInfo.ts new file mode 100644 index 00000000000..b4a4af8f820 --- /dev/null +++ b/apps/web/src/components/Toucan/Auction/hooks/useBidTokenInfo.ts @@ -0,0 +1,63 @@ +import { BidTokenInfo } from 'components/Toucan/Auction/store/types' +import { useMemo } from 'react' +import { UniverseChainId } from 'uniswap/src/features/chains/types' +import { useCurrencyInfoWithLoading } from 'uniswap/src/features/tokens/useCurrencyInfo' +import { useUSDCPrice } from 'uniswap/src/features/transactions/hooks/useUSDCPrice' +import { buildCurrencyId } from 'uniswap/src/utils/currencyId' + +/** + * Hook to fetch bid token information from on-chain/API data + * Derives decimals, symbol, and priceFiat (in USD) from bidTokenAddress and chainId + * Note: Multi-currency conversion is handled at the display layer + * + * @param bidTokenAddress - The address of the bid token (or undefined for native token) + * @param chainId - The chain ID where the token exists + * @returns BidTokenInfo with loading and error states + */ +export function useBidTokenInfo( + bidTokenAddress?: string, + chainId?: UniverseChainId, +): { bidTokenInfo: BidTokenInfo | undefined; loading: boolean; error?: Error } { + const currencyId = useMemo( + () => (chainId && bidTokenAddress ? buildCurrencyId(chainId, bidTokenAddress) : undefined), + [chainId, bidTokenAddress], + ) + const { currencyInfo, loading: currencyLoading, error: currencyError } = useCurrencyInfoWithLoading(currencyId) + const currency = currencyInfo?.currency + const { price, isLoading: isPriceLoading } = useUSDCPrice(currency) + + const bidTokenInfo = useMemo((): BidTokenInfo | undefined => { + if (!currency || !price) { + return undefined + } + + // Established pattern: parseFloat(price.toSignificant()) + // Used in packages/uniswap/src/features/transactions/swap/utils/trade.ts:150 + // NOTE | Toucan: Price is fetched in USD/stablecoin from on-chain data. + // Multi-currency support is handled at display layer via useFiatConverter. + // This ensures accurate blockchain prices with localized display formatting. + const priceFiat = parseFloat(price.toSignificant(6)) + if (isNaN(priceFiat)) { + return undefined + } + + return { + symbol: currency.symbol ?? 'UNKNOWN', // TODO | Toucan - handle undefined case + decimals: currency.decimals, + priceFiat, + } + }, [currency, price]) + + const priceParseError = useMemo(() => { + if (!currency || !price) { + return undefined + } + const priceFiat = parseFloat(price.toSignificant(6)) + return isNaN(priceFiat) ? new Error('Invalid token price: failed to parse price as a number') : undefined + }, [currency, price]) + + const loading = currencyLoading || !currencyInfo || isPriceLoading + const error = currencyError || priceParseError + + return { bidTokenInfo, loading, error } +} diff --git a/apps/web/src/components/Toucan/Auction/store/AuctionStoreContextProvider.tsx b/apps/web/src/components/Toucan/Auction/store/AuctionStoreContextProvider.tsx index dd80aaf5916..b3002f57b96 100644 --- a/apps/web/src/components/Toucan/Auction/store/AuctionStoreContextProvider.tsx +++ b/apps/web/src/components/Toucan/Auction/store/AuctionStoreContextProvider.tsx @@ -1,3 +1,4 @@ +import { useAuctionBlockPolling } from 'components/Toucan/Auction/hooks/useAuctionBlockPolling' import { AuctionStoreContext } from 'components/Toucan/Auction/store/AuctionStoreContext' import { createAuctionStore } from 'components/Toucan/Auction/store/createAuctionStore' import { useAuctionStore, useAuctionStoreActions } from 'components/Toucan/Auction/store/useAuctionStore' @@ -31,6 +32,13 @@ function useUpdateTokenColorInAuctionStore() { function AuctionStoreProviderInner({ children }: PropsWithChildren) { useUpdateTokenColorInAuctionStore() + const { chainId, endBlock } = useAuctionStore((state) => ({ + chainId: state.auctionDetails?.chainId, + endBlock: state.auctionDetails?.endBlock, + })) + + useAuctionBlockPolling(chainId, endBlock) + return children } diff --git a/apps/web/src/components/Toucan/Auction/store/createAuctionStore.ts b/apps/web/src/components/Toucan/Auction/store/createAuctionStore.ts index d3bd716a315..37a8e05c67a 100644 --- a/apps/web/src/components/Toucan/Auction/store/createAuctionStore.ts +++ b/apps/web/src/components/Toucan/Auction/store/createAuctionStore.ts @@ -1,5 +1,6 @@ import { FAKE_AUCTION_DATA, FAKE_CHECKPOINT_DATA } from 'components/Toucan/Auction/store/mockData' -import { AuctionStoreState, DisplayMode } from 'components/Toucan/Auction/store/types' +import { AuctionProgressState, AuctionStoreState, DisplayMode } from 'components/Toucan/Auction/store/types' +import { computeAuctionProgress } from 'components/Toucan/Auction/utils/computeAuctionProgress' import type { StoreApi, UseBoundStore } from 'zustand' import { create } from 'zustand' import { devtools } from 'zustand/middleware' @@ -15,6 +16,17 @@ export const createAuctionStore = (_auctionId?: string): AuctionStore => { checkpointData: FAKE_CHECKPOINT_DATA, tokenColor: undefined, // Will be set by useSrcColor in provider displayMode: DisplayMode.VALUATION, + currentBlockNumber: undefined, + progress: { + state: AuctionProgressState.NOT_STARTED, + blocksRemaining: undefined, + progressPercentage: undefined, + isGraduated: false, + }, + chartZoomState: { + visibleRange: null, + isZoomed: false, + }, // Actions actions: { @@ -24,6 +36,31 @@ export const createAuctionStore = (_auctionId?: string): AuctionStore => { setDisplayMode: (mode) => { set({ displayMode: mode }) }, + /** + * Updates the current block number and automatically recomputes all auction progress state. + * This will update progress.state, progress.blocksRemaining, progress.progressPercentage, and progress.isGraduated. + * @param blockNumber - The new current block number from the blockchain + */ + setCurrentBlockNumberAndUpdateProgress: (blockNumber) => { + set((state) => ({ + currentBlockNumber: blockNumber, + progress: computeAuctionProgress({ + currentBlock: blockNumber, + auctionDetails: state.auctionDetails, + }), + })) + }, + setChartZoomState: (state) => { + set({ chartZoomState: state }) + }, + resetChartZoom: () => { + set({ + chartZoomState: { + visibleRange: null, + isZoomed: false, + }, + }) + }, }, }), { diff --git a/apps/web/src/components/Toucan/Auction/store/mockData.ts b/apps/web/src/components/Toucan/Auction/store/mockData.ts index 57a5a9034e7..b6acd084b39 100644 --- a/apps/web/src/components/Toucan/Auction/store/mockData.ts +++ b/apps/web/src/components/Toucan/Auction/store/mockData.ts @@ -11,12 +11,95 @@ export const FAKE_AUCTION_DATA: AuctionDetails = { startBlock: 20525886, endBlock: 23525886, totalSupply: '1000000000000000000000000000', - tickSize: '10', graduationThreshold: 0.35, bidTokenAddress: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48', // USDC + tickSize: '500000', // $0.50 USDC + // TODO | Toucan: remove once token details are fetched using address + tokenDecimals: 18, } export const FAKE_CHECKPOINT_DATA: CheckpointData = { - clearingPrice: '5.00', + clearingPrice: '5000000', // $5 USDC cumulativeMps: 0.4, } + +export interface BidActivity { + walletAddress: string + bidVolume: string + price: string + timestamp: number // Unix timestamp in seconds +} + +export const FAKE_BID_ACTIVITIES: BidActivity[] = [ + { + walletAddress: '0x1234567890123456789012345678901234567890', + bidVolume: '100', + price: '2.5M', + timestamp: 1761263507, // Example unix timestamp + }, + { + walletAddress: '0x2345678901234567890123456789012345678901', + bidVolume: '250', + price: '2.8M', + timestamp: 1761263501, + }, + { + walletAddress: '0x3456789012345678901234567890123456789012', + bidVolume: '500', + price: '3.2M', + timestamp: 1761263500, + }, + { + walletAddress: '0x4567890123456789012345678901234567890123', + bidVolume: '100', + price: '2.5M', + timestamp: 1761263507, + }, + { + walletAddress: '0x5678901234567890123456789012345678901234', + bidVolume: '750', + price: '4.1M', + timestamp: 1761263507, + }, + { + walletAddress: '0x6789012345678901234567890123456789012345', + bidVolume: '100', + price: '2.5M', + timestamp: 1761263507, + }, +] + +export interface AuctionStatsData { + launchedBy: { + name: string + iconUrl?: string + } + launchedOn: string + contractAddress: string + description: string + website?: string + twitter?: string + impliedTokenPriceMin: string + impliedTokenPriceMax: string + totalBids: number + circulatingSupply: string + totalSupply: string +} + +export const FAKE_AUCTION_STATS: AuctionStatsData = { + launchedBy: { + name: 'FooCorp', + iconUrl: undefined, // Using placeholder in component until actual data is available + }, + launchedOn: '08/08/25', + contractAddress: '0x1234567890123456789012345678901234567890', + description: + 'FooCoin is an innovative token built on the Unichain blockchain, designed to empower users with unique features and functionalities. As a digital asset, it facilitates seamless transactions and interactions within the decentralized ecosystem, allowing holders to engage in various activities such as staking, trading, and participating in community governance. With its vibrant community and robust technology, FooCoin aims to enchant the crypto space and provide users with magical experiences.', + website: 'https://foocorp.example.com', + twitter: 'https://x.com/foocorp', + impliedTokenPriceMin: '$1M', + impliedTokenPriceMax: '$2.5M', + totalBids: 10000, + circulatingSupply: '1,000', + totalSupply: 'xx,xxx', +} diff --git a/apps/web/src/components/Toucan/Auction/store/mocks/distributionData/100_Ticks.ts b/apps/web/src/components/Toucan/Auction/store/mocks/distributionData/100_Ticks.ts new file mode 100644 index 00000000000..1a4dc6287c1 --- /dev/null +++ b/apps/web/src/components/Toucan/Auction/store/mocks/distributionData/100_Ticks.ts @@ -0,0 +1,111 @@ +import { FAKE_AUCTION_DATA } from 'components/Toucan/Auction/store/mockData' +import { BidDistributionData } from 'components/Toucan/Auction/store/types' + +const TICK_SIZE = FAKE_AUCTION_DATA.tickSize + +// 100 ticks - clearing price at $5.00 +// Realistic orderbook: very tight clustering above clearing price with exponential volume decay +export const MOCK_BID_DISTRIBUTION_DATA_100_TICKS: BidDistributionData = new Map([ + // Below clearing price - random distribution (30 ticks) + [(Number(TICK_SIZE) * 2).toString(), '150000000'], // $1.00 + [(Number(TICK_SIZE) * 3).toString(), '120000000'], // $1.50 + [(Number(TICK_SIZE) * 4).toString(), '180000000'], // $2.00 + [(Number(TICK_SIZE) * 5).toString(), '95000000'], // $2.50 + [(Number(TICK_SIZE) * 6).toString(), '140000000'], // $3.00 + [(Number(TICK_SIZE) * 7).toString(), '110000000'], // $3.50 + [(Number(TICK_SIZE) * 8).toString(), '160000000'], // $4.00 + [(Number(TICK_SIZE) * 9).toString(), '130000000'], // $4.50 + // At clearing price - highest volume + [(Number(TICK_SIZE) * 10).toString(), '2600000000'], // $5.00 - clearing price + // Above clearing - very tight clustering (70 ticks concentrated near clearing) + [(Number(TICK_SIZE) * 11).toString(), '2550000000'], // $5.50 + [(Number(TICK_SIZE) * 12).toString(), '2520000000'], // $6.00 + [(Number(TICK_SIZE) * 13).toString(), '2500000000'], // $6.50 + [(Number(TICK_SIZE) * 14).toString(), '2480000000'], // $7.00 + [(Number(TICK_SIZE) * 15).toString(), '2460000000'], // $7.50 + [(Number(TICK_SIZE) * 16).toString(), '2440000000'], // $8.00 + [(Number(TICK_SIZE) * 17).toString(), '2420000000'], // $8.50 + [(Number(TICK_SIZE) * 18).toString(), '2400000000'], // $9.00 + [(Number(TICK_SIZE) * 19).toString(), '2380000000'], // $9.50 + [(Number(TICK_SIZE) * 20).toString(), '2360000000'], // $10.00 + [(Number(TICK_SIZE) * 21).toString(), '2340000000'], // $10.50 + [(Number(TICK_SIZE) * 22).toString(), '2320000000'], // $11.00 + [(Number(TICK_SIZE) * 23).toString(), '2300000000'], // $11.50 + [(Number(TICK_SIZE) * 24).toString(), '2280000000'], // $12.00 + [(Number(TICK_SIZE) * 25).toString(), '2260000000'], // $12.50 + [(Number(TICK_SIZE) * 26).toString(), '2240000000'], // $13.00 + [(Number(TICK_SIZE) * 27).toString(), '2220000000'], // $13.50 + [(Number(TICK_SIZE) * 28).toString(), '2200000000'], // $14.00 + [(Number(TICK_SIZE) * 29).toString(), '2180000000'], // $14.50 + [(Number(TICK_SIZE) * 30).toString(), '2160000000'], // $15.00 + [(Number(TICK_SIZE) * 31).toString(), '2140000000'], // $15.50 + [(Number(TICK_SIZE) * 32).toString(), '2120000000'], // $16.00 + [(Number(TICK_SIZE) * 33).toString(), '2100000000'], // $16.50 + [(Number(TICK_SIZE) * 34).toString(), '2070000000'], // $17.00 + [(Number(TICK_SIZE) * 35).toString(), '2040000000'], // $17.50 + [(Number(TICK_SIZE) * 36).toString(), '2010000000'], // $18.00 + [(Number(TICK_SIZE) * 37).toString(), '1980000000'], // $18.50 + [(Number(TICK_SIZE) * 38).toString(), '1950000000'], // $19.00 + [(Number(TICK_SIZE) * 39).toString(), '1920000000'], // $19.50 + [(Number(TICK_SIZE) * 40).toString(), '1890000000'], // $20.00 + [(Number(TICK_SIZE) * 41).toString(), '1860000000'], // $20.50 + [(Number(TICK_SIZE) * 42).toString(), '1830000000'], // $21.00 + [(Number(TICK_SIZE) * 43).toString(), '1800000000'], // $21.50 + [(Number(TICK_SIZE) * 44).toString(), '1770000000'], // $22.00 + [(Number(TICK_SIZE) * 45).toString(), '1740000000'], // $22.50 + [(Number(TICK_SIZE) * 46).toString(), '1710000000'], // $23.00 + [(Number(TICK_SIZE) * 47).toString(), '1680000000'], // $23.50 + [(Number(TICK_SIZE) * 48).toString(), '1650000000'], // $24.00 + [(Number(TICK_SIZE) * 49).toString(), '1620000000'], // $24.50 + [(Number(TICK_SIZE) * 50).toString(), '1590000000'], // $25.00 + [(Number(TICK_SIZE) * 51).toString(), '1560000000'], // $25.50 + [(Number(TICK_SIZE) * 52).toString(), '1530000000'], // $26.00 + [(Number(TICK_SIZE) * 53).toString(), '1500000000'], // $26.50 + [(Number(TICK_SIZE) * 54).toString(), '1470000000'], // $27.00 + [(Number(TICK_SIZE) * 55).toString(), '1440000000'], // $27.50 + [(Number(TICK_SIZE) * 56).toString(), '1410000000'], // $28.00 + [(Number(TICK_SIZE) * 57).toString(), '1380000000'], // $28.50 + [(Number(TICK_SIZE) * 58).toString(), '1350000000'], // $29.00 + [(Number(TICK_SIZE) * 59).toString(), '1320000000'], // $29.50 + [(Number(TICK_SIZE) * 60).toString(), '1290000000'], // $30.00 + [(Number(TICK_SIZE) * 61).toString(), '1260000000'], // $30.50 + [(Number(TICK_SIZE) * 62).toString(), '1230000000'], // $31.00 + [(Number(TICK_SIZE) * 63).toString(), '1200000000'], // $31.50 + [(Number(TICK_SIZE) * 64).toString(), '1170000000'], // $32.00 + [(Number(TICK_SIZE) * 65).toString(), '1140000000'], // $32.50 + [(Number(TICK_SIZE) * 66).toString(), '1110000000'], // $33.00 + [(Number(TICK_SIZE) * 67).toString(), '1080000000'], // $33.50 + [(Number(TICK_SIZE) * 68).toString(), '1050000000'], // $34.00 + [(Number(TICK_SIZE) * 69).toString(), '1020000000'], // $34.50 + [(Number(TICK_SIZE) * 70).toString(), '990000000'], // $35.00 + [(Number(TICK_SIZE) * 71).toString(), '960000000'], // $35.50 + [(Number(TICK_SIZE) * 72).toString(), '930000000'], // $36.00 + [(Number(TICK_SIZE) * 73).toString(), '900000000'], // $36.50 + [(Number(TICK_SIZE) * 74).toString(), '870000000'], // $37.00 + [(Number(TICK_SIZE) * 75).toString(), '840000000'], // $37.50 + [(Number(TICK_SIZE) * 76).toString(), '810000000'], // $38.00 + [(Number(TICK_SIZE) * 77).toString(), '780000000'], // $38.50 + [(Number(TICK_SIZE) * 78).toString(), '750000000'], // $39.00 + [(Number(TICK_SIZE) * 79).toString(), '720000000'], // $39.50 + [(Number(TICK_SIZE) * 80).toString(), '690000000'], // $40.00 + [(Number(TICK_SIZE) * 82).toString(), '660000000'], // $41.00 + [(Number(TICK_SIZE) * 84).toString(), '630000000'], // $42.00 + [(Number(TICK_SIZE) * 86).toString(), '600000000'], // $43.00 + [(Number(TICK_SIZE) * 88).toString(), '570000000'], // $44.00 + [(Number(TICK_SIZE) * 90).toString(), '540000000'], // $45.00 + [(Number(TICK_SIZE) * 92).toString(), '510000000'], // $46.00 + [(Number(TICK_SIZE) * 94).toString(), '480000000'], // $47.00 + [(Number(TICK_SIZE) * 96).toString(), '450000000'], // $48.00 + [(Number(TICK_SIZE) * 98).toString(), '420000000'], // $49.00 + [(Number(TICK_SIZE) * 100).toString(), '390000000'], // $50.00 + [(Number(TICK_SIZE) * 105).toString(), '350000000'], // $52.50 + [(Number(TICK_SIZE) * 110).toString(), '320000000'], // $55.00 + [(Number(TICK_SIZE) * 115).toString(), '290000000'], // $57.50 + [(Number(TICK_SIZE) * 120).toString(), '260000000'], // $60.00 + // Outliers - rare bids far from clearing + [(Number(TICK_SIZE) * 140).toString(), '220000000'], // $70.00 + [(Number(TICK_SIZE) * 160).toString(), '180000000'], // $80.00 + [(Number(TICK_SIZE) * 200).toString(), '140000000'], // $100.00 + [(Number(TICK_SIZE) * 250).toString(), '100000000'], // $125.00 + [(Number(TICK_SIZE) * 300).toString(), '80000000'], // $150.00 +]) diff --git a/apps/web/src/components/Toucan/Auction/store/mocks/distributionData/10_Ticks.ts b/apps/web/src/components/Toucan/Auction/store/mocks/distributionData/10_Ticks.ts new file mode 100644 index 00000000000..df5463983ee --- /dev/null +++ b/apps/web/src/components/Toucan/Auction/store/mocks/distributionData/10_Ticks.ts @@ -0,0 +1,21 @@ +import { FAKE_AUCTION_DATA } from 'components/Toucan/Auction/store/mockData' +import { BidDistributionData } from 'components/Toucan/Auction/store/types' + +const TICK_SIZE = FAKE_AUCTION_DATA.tickSize + +// 10 ticks clustered near clearing price ($5.00) +// Realistic orderbook: tight clustering above clearing, descending volume with distance +export const MOCK_BID_DISTRIBUTION_DATA_10_TICKS: BidDistributionData = new Map([ + // Below clearing price - random distribution (30%) + [(Number(TICK_SIZE) * 2).toString(), '420000000'], // $1.00 + [(Number(TICK_SIZE) * 6).toString(), '380000000'], // $3.00 + [(Number(TICK_SIZE) * 8).toString(), '550000000'], // $4.00 + // At and above clearing price - tight clustering with descending volume (70%) + [(Number(TICK_SIZE) * 10).toString(), '920000000'], // $5.00 - clearing price (highest volume) + [(Number(TICK_SIZE) * 11).toString(), '880000000'], // $5.50 + [(Number(TICK_SIZE) * 12).toString(), '830000000'], // $6.00 + [(Number(TICK_SIZE) * 13).toString(), '740000000'], // $6.50 + [(Number(TICK_SIZE) * 14).toString(), '650000000'], // $7.00 + [(Number(TICK_SIZE) * 15).toString(), '610000000'], // $7.50 + [(Number(TICK_SIZE) * 18).toString(), '470000000'], // $9.00 - outlier +]) diff --git a/apps/web/src/components/Toucan/Auction/store/mocks/distributionData/20_Ticks.ts b/apps/web/src/components/Toucan/Auction/store/mocks/distributionData/20_Ticks.ts new file mode 100644 index 00000000000..fe31d23532f --- /dev/null +++ b/apps/web/src/components/Toucan/Auction/store/mocks/distributionData/20_Ticks.ts @@ -0,0 +1,31 @@ +import { FAKE_AUCTION_DATA } from 'components/Toucan/Auction/store/mockData' +import { BidDistributionData } from 'components/Toucan/Auction/store/types' + +const TICK_SIZE = FAKE_AUCTION_DATA.tickSize + +// 20 ticks - clearing price at $5.00 +// Realistic orderbook: tight clustering above clearing price with descending volume +export const MOCK_BID_DISTRIBUTION_DATA_20_TICKS: BidDistributionData = new Map([ + // Below clearing price - random distribution (30%) + [(Number(TICK_SIZE) * 2).toString(), '20000000000'], // $1.00 + [(Number(TICK_SIZE) * 4).toString(), '15000000000'], // $2.00 + [(Number(TICK_SIZE) * 6).toString(), '20000000000'], // $3.00 + [(Number(TICK_SIZE) * 7).toString(), '10000000000'], // $3.50 + [(Number(TICK_SIZE) * 8).toString(), '20000000000'], // $4.00 + [(Number(TICK_SIZE) * 9).toString(), '18000000000'], // $4.50 + // At and above clearing price - tight clustering with descending volume (70%) + [(Number(TICK_SIZE) * 10).toString(), '65000000000'], // $5.00 - clearing price (highest volume) + [(Number(TICK_SIZE) * 11).toString(), '50000000000'], // $5.50 + [(Number(TICK_SIZE) * 12).toString(), '50000000000'], // $6.00 + [(Number(TICK_SIZE) * 13).toString(), '45000000000'], // $6.50 + [(Number(TICK_SIZE) * 14).toString(), '45000000000'], // $7.00 + [(Number(TICK_SIZE) * 15).toString(), '40000000000'], // $7.50 + [(Number(TICK_SIZE) * 16).toString(), '35000000000'], // $8.00 + [(Number(TICK_SIZE) * 17).toString(), '30000000000'], // $8.50 + [(Number(TICK_SIZE) * 18).toString(), '25000000000'], // $9.00 + [(Number(TICK_SIZE) * 19).toString(), '20000000000'], // $9.50 + [(Number(TICK_SIZE) * 20).toString(), '15000000000'], // $10.00 + [(Number(TICK_SIZE) * 22).toString(), '10000000000'], // $11.00 + [(Number(TICK_SIZE) * 24).toString(), '5000000000'], // $12.00 + [(Number(TICK_SIZE) * 30).toString(), '1000000000'], // $15.00 - outlier +]) diff --git a/apps/web/src/components/Toucan/Auction/store/mocks/distributionData/50_Ticks.ts b/apps/web/src/components/Toucan/Auction/store/mocks/distributionData/50_Ticks.ts new file mode 100644 index 00000000000..805098a8f6e --- /dev/null +++ b/apps/web/src/components/Toucan/Auction/store/mocks/distributionData/50_Ticks.ts @@ -0,0 +1,62 @@ +import { FAKE_AUCTION_DATA } from 'components/Toucan/Auction/store/mockData' +import { BidDistributionData } from 'components/Toucan/Auction/store/types' + +const TICK_SIZE = FAKE_AUCTION_DATA.tickSize + +// 50 ticks - clearing price at $5.00 +// Realistic orderbook: tight clustering above clearing price with exponential decay in volume +export const MOCK_BID_DISTRIBUTION_DATA_50_TICKS: BidDistributionData = new Map([ + // Below clearing price - random distribution (30%) + [(Number(TICK_SIZE) * 2).toString(), '120000000'], // $1.00 + [(Number(TICK_SIZE) * 3).toString(), '95000000'], // $1.50 + [(Number(TICK_SIZE) * 4).toString(), '110000000'], // $2.00 + [(Number(TICK_SIZE) * 5).toString(), '80000000'], // $2.50 + [(Number(TICK_SIZE) * 6).toString(), '90000000'], // $3.00 + [(Number(TICK_SIZE) * 7).toString(), '85000000'], // $3.50 + [(Number(TICK_SIZE) * 8).toString(), '100000000'], // $4.00 + [(Number(TICK_SIZE) * 9).toString(), '95000000'], // $4.50 + // At clearing price - highest volume + [(Number(TICK_SIZE) * 10).toString(), '2800000000'], // $5.00 - clearing price + // Above clearing price - tight clustering with descending volume + [(Number(TICK_SIZE) * 11).toString(), '2700000000'], // $5.50 + [(Number(TICK_SIZE) * 12).toString(), '2650000000'], // $6.00 + [(Number(TICK_SIZE) * 13).toString(), '2600000000'], // $6.50 + [(Number(TICK_SIZE) * 14).toString(), '2550000000'], // $7.00 + [(Number(TICK_SIZE) * 15).toString(), '2500000000'], // $7.50 + [(Number(TICK_SIZE) * 16).toString(), '2450000000'], // $8.00 + [(Number(TICK_SIZE) * 17).toString(), '2400000000'], // $8.50 + [(Number(TICK_SIZE) * 18).toString(), '2350000000'], // $9.00 + [(Number(TICK_SIZE) * 19).toString(), '2300000000'], // $9.50 + [(Number(TICK_SIZE) * 20).toString(), '2250000000'], // $10.00 + [(Number(TICK_SIZE) * 21).toString(), '2200000000'], // $10.50 + [(Number(TICK_SIZE) * 22).toString(), '2150000000'], // $11.00 + [(Number(TICK_SIZE) * 23).toString(), '2100000000'], // $11.50 + [(Number(TICK_SIZE) * 24).toString(), '2050000000'], // $12.00 + [(Number(TICK_SIZE) * 25).toString(), '1950000000'], // $12.50 + [(Number(TICK_SIZE) * 26).toString(), '1850000000'], // $13.00 + [(Number(TICK_SIZE) * 27).toString(), '1750000000'], // $13.50 + [(Number(TICK_SIZE) * 28).toString(), '1650000000'], // $14.00 + [(Number(TICK_SIZE) * 29).toString(), '1550000000'], // $14.50 + [(Number(TICK_SIZE) * 30).toString(), '1450000000'], // $15.00 + [(Number(TICK_SIZE) * 31).toString(), '1350000000'], // $15.50 + [(Number(TICK_SIZE) * 32).toString(), '1250000000'], // $16.00 + [(Number(TICK_SIZE) * 33).toString(), '1150000000'], // $16.50 + [(Number(TICK_SIZE) * 34).toString(), '1050000000'], // $17.00 + [(Number(TICK_SIZE) * 35).toString(), '950000000'], // $17.50 + [(Number(TICK_SIZE) * 36).toString(), '850000000'], // $18.00 + [(Number(TICK_SIZE) * 37).toString(), '750000000'], // $18.50 + [(Number(TICK_SIZE) * 38).toString(), '650000000'], // $19.00 + [(Number(TICK_SIZE) * 40).toString(), '550000000'], // $20.00 + [(Number(TICK_SIZE) * 42).toString(), '450000000'], // $21.00 + [(Number(TICK_SIZE) * 44).toString(), '380000000'], // $22.00 + [(Number(TICK_SIZE) * 46).toString(), '320000000'], // $23.00 + [(Number(TICK_SIZE) * 48).toString(), '280000000'], // $24.00 + [(Number(TICK_SIZE) * 52).toString(), '240000000'], // $26.00 + [(Number(TICK_SIZE) * 56).toString(), '200000000'], // $28.00 + [(Number(TICK_SIZE) * 60).toString(), '180000000'], // $30.00 + // Outliers + [(Number(TICK_SIZE) * 70).toString(), '150000000'], // $35.00 + [(Number(TICK_SIZE) * 90).toString(), '120000000'], // $45.00 + [(Number(TICK_SIZE) * 120).toString(), '100000000'], // $60.00 + [(Number(TICK_SIZE) * 180).toString(), '80000000'], // $90.00 +]) diff --git a/apps/web/src/components/Toucan/Auction/store/mocks/distributionData/bidDistributionMockData.ts b/apps/web/src/components/Toucan/Auction/store/mocks/distributionData/bidDistributionMockData.ts new file mode 100644 index 00000000000..3151dc49e33 --- /dev/null +++ b/apps/web/src/components/Toucan/Auction/store/mocks/distributionData/bidDistributionMockData.ts @@ -0,0 +1,15 @@ +// TODO | Toucan: Remove this file once live auction data is implemented +// This file contains mock data for testing the BidDistributionChart with different data sets + +import { MOCK_BID_DISTRIBUTION_DATA_10_TICKS } from 'components/Toucan/Auction/store/mocks/distributionData/10_Ticks' +import { MOCK_BID_DISTRIBUTION_DATA_20_TICKS } from 'components/Toucan/Auction/store/mocks/distributionData/20_Ticks' +import { MOCK_BID_DISTRIBUTION_DATA_50_TICKS } from 'components/Toucan/Auction/store/mocks/distributionData/50_Ticks' +import { MOCK_BID_DISTRIBUTION_DATA_100_TICKS } from 'components/Toucan/Auction/store/mocks/distributionData/100_Ticks' +import { BidDistributionData } from 'components/Toucan/Auction/store/types' + +export const MOCK_BID_DISTRIBUTION_DATASETS: BidDistributionData[] = [ + MOCK_BID_DISTRIBUTION_DATA_10_TICKS, + MOCK_BID_DISTRIBUTION_DATA_20_TICKS, + MOCK_BID_DISTRIBUTION_DATA_50_TICKS, + MOCK_BID_DISTRIBUTION_DATA_100_TICKS, +] diff --git a/apps/web/src/components/Toucan/Auction/store/mocks/useMockDataStore.ts b/apps/web/src/components/Toucan/Auction/store/mocks/useMockDataStore.ts new file mode 100644 index 00000000000..98c06b1d352 --- /dev/null +++ b/apps/web/src/components/Toucan/Auction/store/mocks/useMockDataStore.ts @@ -0,0 +1,97 @@ +// TODO | Toucan: Remove this file once live auction data is implemented +// Temporary zustand store for selecting mock bid distribution data in development + +import { SavedCustomPreset } from 'components/Toucan/Auction/BidDistributionChart/dev/customPresets' +import { MOCK_BID_DISTRIBUTION_DATASETS } from 'components/Toucan/Auction/store/mocks/distributionData/bidDistributionMockData' +import { BidDistributionData } from 'components/Toucan/Auction/store/types' +import { create } from 'zustand' + +interface MockDataState { + // Dataset selection + selectedDatasetIndex: number + selectedDataset: BidDistributionData + isCustomPreset: boolean + selectedPresetId: string | null // Track which custom preset is selected + setSelectedDatasetIndex: (index: number) => void + + // Test parameters (for customization) + bidTokenAddress: string + tickSize: string + clearingPrice: string + totalSupply: string + setTestParameters: (params: { + bidTokenAddress: string + tickSize: string + clearingPrice: string + totalSupply: string + }) => void + + // Custom preset management + loadCustomPreset: (preset: SavedCustomPreset) => void + resetToDefaults: () => void +} + +// Default values from FAKE_AUCTION_DATA +const DEFAULT_BID_TOKEN_ADDRESS = '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48' // USDC +const DEFAULT_TICK_SIZE = '500000' // 0.50 USDC +const DEFAULT_CLEARING_PRICE = '5000000' // 5.00 USDC +const DEFAULT_TOTAL_SUPPLY = '1000000000000000000000000000' // 1B tokens with 18 decimals + +export const useMockDataStore = create((set) => ({ + // Dataset selection + selectedDatasetIndex: 0, + selectedDataset: MOCK_BID_DISTRIBUTION_DATASETS[0], + isCustomPreset: false, + selectedPresetId: null, + setSelectedDatasetIndex: (index: number) => + set({ + selectedDatasetIndex: index, + selectedDataset: MOCK_BID_DISTRIBUTION_DATASETS[index], + isCustomPreset: false, + selectedPresetId: null, // Clear preset ID when selecting quick preset + // Reset ALL test parameters to defaults when selecting quick presets + bidTokenAddress: DEFAULT_BID_TOKEN_ADDRESS, + tickSize: DEFAULT_TICK_SIZE, + clearingPrice: DEFAULT_CLEARING_PRICE, + totalSupply: DEFAULT_TOTAL_SUPPLY, + }), + + // Test parameters + bidTokenAddress: DEFAULT_BID_TOKEN_ADDRESS, + tickSize: DEFAULT_TICK_SIZE, + clearingPrice: DEFAULT_CLEARING_PRICE, + totalSupply: DEFAULT_TOTAL_SUPPLY, + setTestParameters: (params) => + set({ + bidTokenAddress: params.bidTokenAddress, + tickSize: params.tickSize, + clearingPrice: params.clearingPrice, + totalSupply: params.totalSupply, + }), + + // Custom preset management + loadCustomPreset: (preset) => { + set({ + selectedDataset: preset.distributionData, + selectedDatasetIndex: -1, // Indicates custom preset + isCustomPreset: true, + selectedPresetId: preset.id, // Store the specific preset ID + bidTokenAddress: preset.bidTokenAddress, // Load actual token address from preset + tickSize: preset.tickSize, + clearingPrice: preset.clearingPrice, + totalSupply: preset.totalSupply, + }) + }, + + resetToDefaults: () => + set({ + selectedDatasetIndex: 0, + selectedDataset: MOCK_BID_DISTRIBUTION_DATASETS[0], + isCustomPreset: false, + selectedPresetId: null, + bidTokenAddress: DEFAULT_BID_TOKEN_ADDRESS, + tickSize: DEFAULT_TICK_SIZE, + clearingPrice: DEFAULT_CLEARING_PRICE, + totalSupply: DEFAULT_TOTAL_SUPPLY, + }), +})) diff --git a/apps/web/src/components/Toucan/Auction/store/types.ts b/apps/web/src/components/Toucan/Auction/store/types.ts index d6dcbf3f164..f76c9a9199c 100644 --- a/apps/web/src/components/Toucan/Auction/store/types.ts +++ b/apps/web/src/components/Toucan/Auction/store/types.ts @@ -1,9 +1,11 @@ -import { UniverseChainId } from 'uniswap/src/features/chains/types' +import { EVMUniverseChainId } from 'uniswap/src/features/chains/types' + +export type BidDistributionData = Map // potentially missing clearing price export interface AuctionDetails { auctionId: string - chainId: UniverseChainId + chainId: EVMUniverseChainId tokenSymbol: string tokenAddress: string tokenName: string // this is missing from what Rob sent @@ -15,6 +17,8 @@ export interface AuctionDetails { tickSize: string graduationThreshold: number bidTokenAddress: string + // TODO | Toucan: remove once token details are fetched using address + tokenDecimals: number // Token decimals for totalSupply conversion } export interface CheckpointData { @@ -27,16 +31,58 @@ export enum DisplayMode { TOKEN_PRICE = 'TOKEN_PRICE', } +export enum AuctionProgressState { + NOT_STARTED = 'NOT_STARTED', + IN_PROGRESS = 'IN_PROGRESS', + ENDED = 'ENDED', +} + +/** + * Computed auction progress information + * These fields are automatically updated when currentBlockNumber changes + */ +export interface AuctionProgressData { + state: AuctionProgressState + blocksRemaining: number | undefined + progressPercentage: number | undefined + isGraduated: boolean +} + +// TODO | Toucan - determine if this can be replaced with SDK Token type +/** + * Bid token metadata used for chart calculations + * Note: priceFiat is fetched in USD from on-chain stablecoin data. + * Multi-currency display is handled at the component layer via useFiatConverter. + */ +export interface BidTokenInfo { + symbol: string + decimals: number + /** Token price in USD - converted to user's selected fiat currency at display time */ + priceFiat: number +} + +// Chart zoom state for tracking visible range and zoom status +interface ChartZoomState { + visibleRange: { from: number; to: number } | null + isZoomed: boolean +} + interface AuctionState { auctionDetails: AuctionDetails | null checkpointData: CheckpointData | null tokenColor?: string displayMode: DisplayMode + currentBlockNumber: bigint | undefined + progress: AuctionProgressData + chartZoomState: ChartZoomState } interface AuctionActions { setTokenColor: (color?: string) => void setDisplayMode: (mode: DisplayMode) => void + setCurrentBlockNumberAndUpdateProgress: (blockNumber: bigint | undefined) => void + setChartZoomState: (state: ChartZoomState) => void + resetChartZoom: () => void } export type AuctionStoreState = AuctionState & { diff --git a/apps/web/src/components/Toucan/Auction/utils/computeAuctionProgress.ts b/apps/web/src/components/Toucan/Auction/utils/computeAuctionProgress.ts new file mode 100644 index 00000000000..151be43bfc2 --- /dev/null +++ b/apps/web/src/components/Toucan/Auction/utils/computeAuctionProgress.ts @@ -0,0 +1,76 @@ +import type { AuctionDetails, AuctionProgressData } from 'components/Toucan/Auction/store/types' +import { AuctionProgressState } from 'components/Toucan/Auction/store/types' + +function getAuctionProgressState({ + currentBlock, + startBlock, + endBlock, +}: { + currentBlock: bigint | number | undefined + startBlock: number | undefined + endBlock: number | undefined +}): AuctionProgressState { + if (!currentBlock || !startBlock || !endBlock) { + return AuctionProgressState.NOT_STARTED + } + + const current = typeof currentBlock === 'bigint' ? Number(currentBlock) : currentBlock + + if (current < startBlock) { + return AuctionProgressState.NOT_STARTED + } + + if (current > endBlock) { + return AuctionProgressState.ENDED + } + + return AuctionProgressState.IN_PROGRESS +} + +/** + * Computes all auction progress information from current block and auction details + * This is a pure function that can be tested independently of the store + * @param params - Object containing current block and auction details + * @param params.currentBlock - The current block number + * @param params.auctionDetails - The auction details containing start/end blocks + * @returns Computed auction progress state and derived values + */ +export function computeAuctionProgress({ + currentBlock, + auctionDetails, +}: { + currentBlock: bigint | undefined + auctionDetails: AuctionDetails | null +}): AuctionProgressData { + const state = getAuctionProgressState({ + currentBlock, + startBlock: auctionDetails?.startBlock, + endBlock: auctionDetails?.endBlock, + }) + + let blocksRemaining: number | undefined + let progressPercentage: number | undefined + + if (currentBlock && auctionDetails) { + const current = Number(currentBlock) + const { startBlock, endBlock } = auctionDetails + + if (state === AuctionProgressState.IN_PROGRESS) { + blocksRemaining = endBlock - current + const totalBlocks = endBlock - startBlock + const elapsedBlocks = current - startBlock + // TODO | Toucan: if progress is percentage sold rather than blocks passed, this needs to be updated + progressPercentage = totalBlocks > 0 ? Math.min(100, (elapsedBlocks / totalBlocks) * 100) : 0 + } + } + + // TODO | Toucan: update with graduation logic once schema from back end has been decided on + const isGraduated = false + + return { + state, + blocksRemaining, + progressPercentage, + isGraduated, + } +} diff --git a/apps/web/src/components/Toucan/Shared/ToucanContainer.tsx b/apps/web/src/components/Toucan/Shared/ToucanContainer.tsx index 1eedcd3c335..c69b52f7d3f 100644 --- a/apps/web/src/components/Toucan/Shared/ToucanContainer.tsx +++ b/apps/web/src/components/Toucan/Shared/ToucanContainer.tsx @@ -1,11 +1,11 @@ import { ComponentProps, PropsWithChildren } from 'react' import { Flex } from 'ui/src' -const CONTAINER_MAX_WIDTH = 1200 +const CONTAINER_WIDTH = 1200 export const ToucanContainer = ({ children, ...props }: PropsWithChildren>) => { return ( - + {children} ) diff --git a/apps/web/src/components/Toucan/TopAuctionsTable.tsx b/apps/web/src/components/Toucan/TopAuctionsTable.tsx new file mode 100644 index 00000000000..e5fb6feb787 --- /dev/null +++ b/apps/web/src/components/Toucan/TopAuctionsTable.tsx @@ -0,0 +1,118 @@ +import { createColumnHelper } from '@tanstack/react-table' +import { Table } from 'components/Table' +import { Cell } from 'components/Table/Cell' +import { EllipsisText, HeaderCell, TableText } from 'components/Table/styled' +import { MAX_WIDTH_MEDIA_BREAKPOINT } from 'components/Tokens/constants' +import useSimplePagination from 'hooks/useSimplePagination' +import { memo, ReactElement, useMemo } from 'react' +import { useTranslation } from 'react-i18next' +import { TABLE_PAGE_SIZE } from 'state/explore' +import { useTopAuctions } from 'state/explore/topAuctions' +import { Flex, styled, Text, useMedia } from 'ui/src' +import { Auction } from 'uniswap/src/data/rest/auctions/types' +import { getChainInfo } from 'uniswap/src/features/chains/chainInfo' + +const TableWrapper = styled(Flex, { + m: '0 auto', + maxWidth: MAX_WIDTH_MEDIA_BREAKPOINT, +}) + +interface TopAuctionsTableValue { + index: number + tokenName: ReactElement + link: string +} + +function TokenNameCell({ auction }: { auction: Auction }) { + return ( + + {auction.token_name} + + {auction.token_symbol} + + + ) +} + +export const ToucanTable = memo(function ToucanTable() { + const { topAuctions, isLoading, isError } = useTopAuctions() + + const { page, loadMore } = useSimplePagination() + + return ( + + + + ) +}) + +function ToucanTableComponent({ + auctions, + loading, + error, + loadMore, +}: { + auctions?: readonly Auction[] + loading: boolean + error?: boolean + loadMore?: ({ onComplete }: { onComplete?: () => void }) => void +}) { + const { t } = useTranslation() + const topAuctionsTableValues: TopAuctionsTableValue[] | undefined = useMemo( + () => + auctions?.map((auction, i) => { + const chainUrlParam = getChainInfo(auction.chain_id).urlParam + return { + index: i + 1, + tokenName: , + link: `/explore/auctions/${chainUrlParam}/${auction.auction_id}`, + } + }) ?? [], + [auctions], + ) + + const showLoadingSkeleton = loading || !!error + + const media = useMedia() + const columns = useMemo(() => { + const columnHelper = createColumnHelper() + const filteredColumns = [ + columnHelper.accessor((row) => row.tokenName, { + id: 'tokenName', + size: media.lg ? 150 : 300, + header: () => ( + + + {t('common.tokenName')} + + + ), + cell: (auctionDescription) => ( + + {auctionDescription.getValue()} + + ), + }), + ] + + return filteredColumns.filter((column): column is NonNullable<(typeof filteredColumns)[number]> => Boolean(column)) + }, [showLoadingSkeleton, media, t]) + + return ( +
+ ) +} diff --git a/apps/web/src/components/V2Unsupported.tsx b/apps/web/src/components/V2Unsupported.tsx index dbd6b3912ec..6f072cc114d 100644 --- a/apps/web/src/components/V2Unsupported.tsx +++ b/apps/web/src/components/V2Unsupported.tsx @@ -1,9 +1,9 @@ import { AutoColumn } from 'components/deprecated/Column' -import styled from 'lib/styled-components' +import { deprecatedStyled } from 'lib/styled-components' import { Trans } from 'react-i18next' import { ThemedText } from 'theme/components' -const TextWrapper = styled.div` +const TextWrapper = deprecatedStyled.div` border: 1px solid ${({ theme }) => theme.neutral3}; padding: 16px 12px; border-radius: 12px; diff --git a/apps/web/src/components/WalletModal/PrivacyPolicyNotice.tsx b/apps/web/src/components/WalletModal/PrivacyPolicyNotice.tsx index c88887e3d93..39c50789ee9 100644 --- a/apps/web/src/components/WalletModal/PrivacyPolicyNotice.tsx +++ b/apps/web/src/components/WalletModal/PrivacyPolicyNotice.tsx @@ -1,9 +1,9 @@ -import styled from 'lib/styled-components' +import { deprecatedStyled } from 'lib/styled-components' import { Trans } from 'react-i18next' import { ExternalLink } from 'theme/components/Links' import { Text } from 'ui/src' -const StyledLink = styled(ExternalLink)` +const StyledLink = deprecatedStyled(ExternalLink)` font-weight: 535; color: ${({ theme }) => theme.neutral2}; ` diff --git a/apps/web/src/components/WalletModal/UniswapWalletOptions.tsx b/apps/web/src/components/WalletModal/UniswapWalletOptions.tsx index 1ef39364689..ba0017222ef 100644 --- a/apps/web/src/components/WalletModal/UniswapWalletOptions.tsx +++ b/apps/web/src/components/WalletModal/UniswapWalletOptions.tsx @@ -42,7 +42,7 @@ export function OptionContainer({ hideBackground, recent, children, onPress, tes maxHeight={72} cursor="pointer" zIndex="$default" - backgroundColor={!hideBackground ? '$surface2' : undefined} + backgroundColor={!hideBackground ? '$surface2' : '$transparent'} hoverStyle={{ backgroundColor: '$surface3' }} onPress={onPress} data-testid={testID} diff --git a/apps/web/src/components/WalletModal/__snapshots__/UniswapWalletOptions.test.tsx.snap b/apps/web/src/components/WalletModal/__snapshots__/UniswapWalletOptions.test.tsx.snap index 08ee3ac3565..ecc5bb999e2 100644 --- a/apps/web/src/components/WalletModal/__snapshots__/UniswapWalletOptions.test.tsx.snap +++ b/apps/web/src/components/WalletModal/__snapshots__/UniswapWalletOptions.test.tsx.snap @@ -17,11 +17,10 @@ exports[`UniswapWalletOptions > Download wallet option should be visible if exte data-testid="download-uniswap-wallet" >
) => { - const theme = useTheme() - const bg = theme.darkMode ? 'black' : 'white' + const isDarkMode = useIsDarkMode() + const bg = isDarkMode ? 'black' : 'white' return ( diff --git a/apps/web/src/components/Web3Provider/TestWeb3Provider.tsx b/apps/web/src/components/Web3Provider/TestWeb3Provider.tsx index 687c7cde91f..04d72142aad 100644 --- a/apps/web/src/components/Web3Provider/TestWeb3Provider.tsx +++ b/apps/web/src/components/Web3Provider/TestWeb3Provider.tsx @@ -11,7 +11,6 @@ import { wagmiConfig } from 'components/Web3Provider/wagmiConfig' const TestWeb3Provider = createWeb3Provider({ wagmiConfig, reconnectOnMount: false, - includeCapabilitiesEffects: false, }) export default TestWeb3Provider diff --git a/apps/web/src/components/Web3Provider/WebUniswapContext.tsx b/apps/web/src/components/Web3Provider/WebUniswapContext.tsx index cc1f14fbffa..624b206f311 100644 --- a/apps/web/src/components/Web3Provider/WebUniswapContext.tsx +++ b/apps/web/src/components/Web3Provider/WebUniswapContext.tsx @@ -62,7 +62,7 @@ function WebUniswapProviderInner({ children }: PropsWithChildren) { const location = useLocation() const accountDrawer = useAccountDrawer() const navigate = useNavigate() - const navigateToFiatOnRamp = useCallback(() => navigate(`/buy`, { replace: true }), [navigate]) + const navigateToFiatOnRamp = useCallback(() => navigate(`/buy`), [navigate]) const { closeModal: closeSearchModal } = useModalState(ModalName.Search) const { openModal: openSendModal } = useModalState(ModalName.Send) @@ -75,7 +75,7 @@ function WebUniswapProviderInner({ children }: PropsWithChildren) { chainId: inputCurrencyId ? currencyIdToChain(inputCurrencyId) : undefined, outputChainId: outputCurrencyId ? currencyIdToChain(outputCurrencyId) : undefined, }) - navigate(`/swap${queryParams}`, { replace: true }) + navigate(`/swap${queryParams}`) closeSearchModal() accountDrawer.close() }, @@ -96,15 +96,12 @@ function WebUniswapProviderInner({ children }: PropsWithChildren) { const chainUrlParam = getChainInfo(chainId).urlParam openSendModal() closeSearchModal() - accountDrawer.close() const newPathname = location.pathname === '/' ? '/send' : location.pathname const currencyAddressParam = currencyAddress ? `&sendCurrency=${currencyAddress}` : '' - navigate(`${newPathname}?sendChain=${chainUrlParam}${currencyAddressParam}`, { - replace: true, - }) + navigate(`${newPathname}?sendChain=${chainUrlParam}${currencyAddressParam}`) }, - [openSendModal, closeSearchModal, accountDrawer, navigate, location], + [openSendModal, closeSearchModal, navigate, location], ) const navigateToReceive = useOpenReceiveCryptoModal({ @@ -139,8 +136,14 @@ function WebUniswapProviderInner({ children }: PropsWithChildren) { }) const getCanSignPermits = useGetCanSignPermits() - // no-op until we have an external profile screen on web - const navigateToExternalProfile = useCallback((_: { address: Address }) => noop(), []) + const navigateToExternalProfile = useCallback( + ({ address }: { address: Address }) => { + // TODO: this will need to be updated upstack + navigate(`/portfolio?address=${address}`) + closeSearchModal() + }, + [navigate, closeSearchModal], + ) const navigateToNftCollection = useCallback((args: { collectionAddress: Address; chainId: UniverseChainId }) => { window.open( diff --git a/apps/web/src/components/Web3Provider/createWeb3Provider.tsx b/apps/web/src/components/Web3Provider/createWeb3Provider.tsx index 295cab35401..11346af0509 100644 --- a/apps/web/src/components/Web3Provider/createWeb3Provider.tsx +++ b/apps/web/src/components/Web3Provider/createWeb3Provider.tsx @@ -1,26 +1,16 @@ import { CoinbaseWalletAdapter } from '@solana/wallet-adapter-coinbase' import { WalletProvider as SolanaWalletProvider } from '@solana/wallet-adapter-react' import { SolanaSignerUpdater } from 'components/Web3Provider/signSolanaTransaction' -import React, { PropsWithChildren, ReactNode, useMemo } from 'react' +import React, { type PropsWithChildren, type ReactNode, useMemo } from 'react' import { useWalletCapabilitiesStateEffect } from 'state/walletCapabilities/hooks/useWalletCapabilitiesStateEffect' import { type Register, WagmiProvider } from 'wagmi' -export function createWeb3Provider(params: { - wagmiConfig: Register['config'] - reconnectOnMount?: boolean - includeCapabilitiesEffects?: boolean -}) { - const { wagmiConfig, reconnectOnMount = true, includeCapabilitiesEffects = true } = params - - const WalletCapabilitiesEffects: React.FC = () => { - useWalletCapabilitiesStateEffect() - return null - } +export function createWeb3Provider(params: { wagmiConfig: Register['config']; reconnectOnMount?: boolean }) { + const { wagmiConfig, reconnectOnMount = true } = params const Provider = ({ children }: { children: ReactNode }) => ( - {includeCapabilitiesEffects && } {children} @@ -42,3 +32,8 @@ function SolanaProvider({ children }: PropsWithChildren) { ) } + +export function WalletCapabilitiesEffects() { + useWalletCapabilitiesStateEffect() + return null +} diff --git a/apps/web/src/components/Web3Provider/walletConnect.ts b/apps/web/src/components/Web3Provider/walletConnect.ts index 65efebcd344..833664f5325 100644 --- a/apps/web/src/components/Web3Provider/walletConnect.ts +++ b/apps/web/src/components/Web3Provider/walletConnect.ts @@ -42,7 +42,7 @@ export const WC_PARAMS = { qrModalOptions: { themeVariables: { '--wcm-font-family': '"Inter custom", sans-serif', - '--wcm-z-index': Z_INDEX.modal.toString(), + '--wcm-z-index': Z_INDEX.overlay.toString(), }, }, } diff --git a/apps/web/src/components/Web3Status/index.tsx b/apps/web/src/components/Web3Status/index.tsx index d9e7e06b8c9..3a87f8bd76c 100644 --- a/apps/web/src/components/Web3Status/index.tsx +++ b/apps/web/src/components/Web3Status/index.tsx @@ -10,7 +10,7 @@ import { useAccountIdentifier } from 'components/Web3Status/useAccountIdentifier import { useShowPendingAfterDelay } from 'components/Web3Status/useShowPendingAfterDelay' import { useModalState } from 'hooks/useModalState' import { atom, useAtom } from 'jotai' -import styled from 'lib/styled-components' +import { deprecatedStyled } from 'lib/styled-components' import { forwardRef, RefObject, useCallback, useEffect, useRef } from 'react' import { Trans, useTranslation } from 'react-i18next' import { AnimatePresence, Button, ButtonProps, Flex, Popover, Text } from 'ui/src' @@ -23,7 +23,7 @@ import Trace from 'uniswap/src/features/telemetry/Trace' import { TestID } from 'uniswap/src/test/fixtures/testIDs' import { isIFramed } from 'utils/isIFramed' -const TextStyled = styled.span<{ marginRight?: number }>` +const TextStyled = deprecatedStyled.span<{ marginRight?: number }>` flex: 1 1 auto; text-overflow: ellipsis; white-space: nowrap; @@ -55,7 +55,7 @@ const Web3StatusGeneric = forwardRef(function Web3S ) }) -const AddressAndChevronContainer = styled.div<{ $loading?: boolean }>` +const AddressAndChevronContainer = deprecatedStyled.div<{ $loading?: boolean }>` display: flex; opacity: ${({ $loading, theme }) => $loading && theme.opacity.disabled}; align-items: center; @@ -90,7 +90,7 @@ const ExistingUserCTAButton = forwardRef void } ) }) -export const Web3StatusRef = atom | undefined>(undefined) +export const Web3StatusRef = atom | undefined>(undefined) function Web3StatusInner() { const activeAddresses = useActiveAddresses() @@ -109,9 +109,12 @@ function Web3StatusInner() { accountDrawer.toggle() }, [accountDrawer]) - const { hasPendingActivity, pendingActivityCount, isOnlyUnichainPendingActivity } = usePendingActivity() + const { hasPendingActivity, pendingActivityCount, hasL1PendingActivity } = usePendingActivity() const { accountIdentifier, hasUnitag } = useAccountIdentifier() - const showLoadingState = useShowPendingAfterDelay(hasPendingActivity, isOnlyUnichainPendingActivity) + const showLoadingState = useShowPendingAfterDelay({ + hasPendingActivity, + hasL1PendingActivity, + }) // TODO(WEB-4173): Remove isIFrame check when we can update wagmi to version >= 2.9.4 if (isConnecting && !isIFramed()) { diff --git a/apps/web/src/components/Web3Status/useShowPendingAfterDelay.ts b/apps/web/src/components/Web3Status/useShowPendingAfterDelay.ts index 8369473b86d..6684e011061 100644 --- a/apps/web/src/components/Web3Status/useShowPendingAfterDelay.ts +++ b/apps/web/src/components/Web3Status/useShowPendingAfterDelay.ts @@ -1,30 +1,41 @@ -import { L2_TXN_DISMISS_MS } from 'constants/misc' -import { useCallback } from 'react' +import { DEFAULT_TXN_DISMISS_MS, L2_TXN_DISMISS_MS } from 'constants/misc' +import { useCallback, useMemo } from 'react' import { useBooleanState } from 'utilities/src/react/useBooleanState' import { useTimeout } from 'utilities/src/time/timing' -export function useShowPendingAfterDelay(hasPendingActivity: boolean, isOnlyUnichainPendingActivity: boolean): boolean { +interface UseShowPendingAfterDelayParams { + hasPendingActivity: boolean + hasL1PendingActivity: boolean +} + +export function useShowPendingAfterDelay({ + hasPendingActivity, + hasL1PendingActivity, +}: UseShowPendingAfterDelayParams): boolean { const { - value: showUnichainTxAnyways, - setTrue: setShowUnichainTxAnyways, - setFalse: resetShowUnichainTxAnyways, + value: showPendingTxAnyways, + setTrue: setShowPendingTxAnyways, + setFalse: resetShowPendingTxAnyways, } = useBooleanState(false) - // needs to rerender once `isOnlyUnichainPendingActivity` is true so useTimeout starts - const showUnichainTxAfterDelay = useCallback(() => { - if (isOnlyUnichainPendingActivity && hasPendingActivity) { - setShowUnichainTxAnyways() + // use longer delay for L1 transactions + const dismissDelay = useMemo( + () => (hasL1PendingActivity ? DEFAULT_TXN_DISMISS_MS : L2_TXN_DISMISS_MS), + [hasL1PendingActivity], + ) + + const showPendingTxAfterDelay = useCallback(() => { + if (hasPendingActivity) { + setShowPendingTxAnyways() return } - resetShowUnichainTxAnyways() - }, [isOnlyUnichainPendingActivity, setShowUnichainTxAnyways, resetShowUnichainTxAnyways, hasPendingActivity]) + resetShowPendingTxAnyways() + }, [setShowPendingTxAnyways, resetShowPendingTxAnyways, hasPendingActivity]) - useTimeout(showUnichainTxAfterDelay, L2_TXN_DISMISS_MS) + useTimeout(showPendingTxAfterDelay, dismissDelay) - const showLoadingState = isOnlyUnichainPendingActivity - ? hasPendingActivity && showUnichainTxAnyways - : hasPendingActivity + const showLoadingState = hasPendingActivity && showPendingTxAnyways return showLoadingState } diff --git a/apps/web/src/components/animations/Wiggle.tsx b/apps/web/src/components/animations/Wiggle.tsx index a250c0b1b0d..4d14f81d594 100644 --- a/apps/web/src/components/animations/Wiggle.tsx +++ b/apps/web/src/components/animations/Wiggle.tsx @@ -1,52 +1,59 @@ -import { forwardRef, PropsWithChildren, useState } from 'react' +import { forwardRef, PropsWithChildren } from 'react' import { Flex, FlexProps, useSporeColors } from 'ui/src' +import { useBooleanState } from 'utilities/src/react/useBooleanState' -const wiggleKeyframe = ` +const getWiggleKeyframe = ({ wiggleAmount = 20 }: { wiggleAmount?: number }) => { + return ` @keyframes wiggle { 0% { transform: rotate(0deg) scale(1); } 30% { - transform: rotate(20deg) scale(1.1); + transform: rotate(${wiggleAmount}deg) scale(1.05); } 60% { - transform: rotate(-10deg) scale(1.2); + transform: rotate(-${wiggleAmount / 2}deg) scale(1.1); } 100% { - transform: rotate(0deg) scale(1.15); + transform: rotate(0deg) scale(1.06); } } ` +} -export const Wiggle = forwardRef & { iconColor?: string }>( - ({ iconColor, children, ...props }, ref) => { - const [isHovering, setIsHovering] = useState(false) - const colors = useSporeColors() +export const Wiggle = forwardRef< + any, + PropsWithChildren & { wiggleAmount?: number; iconColor?: string; isAnimating?: boolean } +>(({ wiggleAmount = 20, iconColor, children, isAnimating, ...props }, ref) => { + const { value: isHovering, setTrue: setIsHovering, setFalse: setIsHoveringFalse } = useBooleanState(false) + const colors = useSporeColors() + const wiggleKeyframe = getWiggleKeyframe({ wiggleAmount }) + // Use external isAnimating prop if provided, otherwise use internal hover state + const shouldAnimate = isAnimating !== undefined ? isAnimating : isHovering - return ( - <> - - setIsHovering(true)} - onHoverOut={() => setIsHovering(false)} - {...props} - style={{ - animationName: isHovering ? 'wiggle' : 'none', - animationDuration: '0.5s', - animationTimingFunction: 'ease-in-out', - animationFillMode: 'forwards', - animationIterationCount: 1, - animationDirection: 'normal', - transition: 'fill 0.3s ease-in-out', - fill: isHovering ? iconColor || colors.neutral1.val : colors.neutral1.val, - }} - > - {children} - - - ) - }, -) + return ( + <> + + + {children} + + + ) +}) Wiggle.displayName = 'Wiggle' diff --git a/apps/web/src/components/delegation/DelegationMismatchModal.tsx b/apps/web/src/components/delegation/DelegationMismatchModal.tsx index f1145037613..d7cb7800186 100644 --- a/apps/web/src/components/delegation/DelegationMismatchModal.tsx +++ b/apps/web/src/components/delegation/DelegationMismatchModal.tsx @@ -3,14 +3,14 @@ import { WalletAlertBadge } from 'components/Badge/WalletAlertBadge' import { useWalletDisplay } from 'components/Web3Status/RecentlyConnectedModal' import { useAccount } from 'hooks/useAccount' import { useDisconnect } from 'hooks/useDisconnect' -import { useTheme } from 'lib/styled-components' +import { useMemo } from 'react' import { useTranslation } from 'react-i18next' -import { Flex, Text } from 'ui/src' +import { Flex, Text, useSporeColors } from 'ui/src' import { Blocked } from 'ui/src/components/icons/Blocked' import { Dialog } from 'uniswap/src/components/dialog/Dialog' import { uniswapUrls } from 'uniswap/src/constants/urls' import { ElementName, ModalName } from 'uniswap/src/features/telemetry/constants' -import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send.web' +import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send' import { Trace } from 'uniswap/src/features/telemetry/Trace' import { useEvent } from 'utilities/src/react/hooks' @@ -23,7 +23,7 @@ function DelegationMismatchModal({ onClose }: DelegationMismatchModalProps) { const account = useAccount() const { displayName } = useWalletDisplay(account.address) const disconnect = useDisconnect() - const theme = useTheme() + const colors = useSporeColors() const walletName = account.connector?.name ?? t('common.your.connected.wallet') const iconSrc = account.connector?.icon @@ -32,7 +32,7 @@ function DelegationMismatchModal({ onClose }: DelegationMismatchModalProps) { t('smartWallets.delegationMismatchModal.features.1ClickSwaps'), <> {t('smartWallets.delegationMismatchModal.features.gasFreeSwaps')} - {` (${t('uniswapx.label')})`} + {` (${t('uniswapx.label')})`} , t('smartWallets.delegationMismatchModal.features.limitOrders'), ] @@ -62,6 +62,26 @@ function DelegationMismatchModal({ onClose }: DelegationMismatchModalProps) { handleTrackModalDismissed() }) + const primaryButton = useMemo( + () => ({ + text: t('common.button.disconnect'), + onPress: handleSwitchWallets, + variant: 'default' as const, + emphasis: 'secondary' as const, + }), + [t, handleSwitchWallets], + ) + + const secondaryButton = useMemo( + () => ({ + text: t('common.button.continue'), + onPress: handleContinue, + variant: 'default' as const, + emphasis: 'primary' as const, + }), + [t, handleContinue], + ) + return ( } icon={} - primaryButtonText={t('common.button.disconnect')} - primaryButtonOnClick={handleSwitchWallets} - primaryButtonVariant="default" - primaryButtonEmphasis="secondary" - secondaryButtonText={t('common.button.continue')} - secondaryButtonOnClick={handleContinue} - secondaryButtonVariant="default" - secondaryButtonEmphasis="primary" + primaryButton={primaryButton} + secondaryButton={secondaryButton} learnMoreUrl={uniswapUrls.helpArticleUrls.mismatchedImports} learnMoreTextColor="$accent1" learnMoreTextVariant="buttonLabel3" onClose={onClose} - buttonContainerProps={{ flexDirection: 'row', gap: '$spacing12' }} textAlign="left" > - + {FEATURES.map((feature, index) => ( - - + + {feature} diff --git a/apps/web/src/components/deprecated/Column.tsx b/apps/web/src/components/deprecated/Column.tsx index a2ef916e601..f5a5b43442f 100644 --- a/apps/web/src/components/deprecated/Column.tsx +++ b/apps/web/src/components/deprecated/Column.tsx @@ -1,8 +1,8 @@ -import styled from 'lib/styled-components' +import { deprecatedStyled } from 'lib/styled-components' import { Gap } from 'theme' /** @deprecated Please use `Flex` from `ui/src` going forward */ -const Column = styled.div<{ +const Column = deprecatedStyled.div<{ gap?: Gap | string flex?: string }>` @@ -14,12 +14,12 @@ const Column = styled.div<{ ` /** @deprecated Please use `Flex` from `ui/src` going forward */ -export const ColumnCenter = styled(Column)` +export const ColumnCenter = deprecatedStyled(Column)` width: 100%; align-items: center; ` -export const AutoColumn = styled.div<{ +export const AutoColumn = deprecatedStyled.div<{ gap?: Gap | string justify?: 'stretch' | 'center' | 'start' | 'end' | 'flex-start' | 'flex-end' | 'space-between' grow?: true diff --git a/apps/web/src/components/deprecated/Row.tsx b/apps/web/src/components/deprecated/Row.tsx index 033ff87290a..8c66ee2eee0 100644 --- a/apps/web/src/components/deprecated/Row.tsx +++ b/apps/web/src/components/deprecated/Row.tsx @@ -1,4 +1,4 @@ -import styled from 'lib/styled-components' +import { deprecatedStyled } from 'lib/styled-components' import { Box } from 'rebass/styled-components' import { Gap } from 'theme' @@ -7,7 +7,7 @@ import { Gap } from 'theme' // Same applies to `RowFixed` and its negative margins. This component needs to be // further investigated and improved to make UI work easier. /** @deprecated Please use `Flex` from `ui/src` going forward */ -const Row = styled(Box)<{ +const Row = deprecatedStyled(Box)<{ width?: string align?: string justify?: string @@ -28,12 +28,12 @@ const Row = styled(Box)<{ ` /** @deprecated Please use `Flex` from `ui/src` going forward */ -export const RowBetween = styled(Row)` +export const RowBetween = deprecatedStyled(Row)` justify-content: space-between; ` /** @deprecated Please use `Flex` from `ui/src` going forward */ -export const AutoRow = styled(Row)<{ gap?: string; justify?: string }>` +export const AutoRow = deprecatedStyled(Row)<{ gap?: string; justify?: string }>` flex-wrap: wrap; margin: ${({ gap }) => gap && `-${gap}`}; justify-content: ${({ justify }) => justify && justify}; @@ -44,7 +44,7 @@ export const AutoRow = styled(Row)<{ gap?: string; justify?: string }>` ` /** @deprecated Please use `Flex` from `ui/src` going forward */ -export const RowFixed = styled(Row)<{ gap?: string; justify?: string }>` +export const RowFixed = deprecatedStyled(Row)<{ gap?: string; justify?: string }>` position: relative; width: fit-content; margin: ${({ gap }) => gap && `-${gap}`}; diff --git a/apps/web/src/components/earn/styled.tsx b/apps/web/src/components/earn/styled.tsx index e9b3d4909b7..945f2c4d61e 100644 --- a/apps/web/src/components/earn/styled.tsx +++ b/apps/web/src/components/earn/styled.tsx @@ -2,9 +2,9 @@ import uImage from 'assets/images/big_unicorn.png' import noise from 'assets/images/noise.png' import xlUnicorn from 'assets/images/xl_uni.png' import { AutoColumn } from 'components/deprecated/Column' -import styled from 'lib/styled-components' +import { deprecatedStyled } from 'lib/styled-components' -export const CardBGImage = styled.span<{ desaturate?: boolean }>` +export const CardBGImage = deprecatedStyled.span<{ desaturate?: boolean }>` background: url(${uImage}); width: 1000px; height: 600px; @@ -18,7 +18,7 @@ export const CardBGImage = styled.span<{ desaturate?: boolean }>` ${({ desaturate }) => desaturate && `filter: saturate(0)`} ` -export const CardBGImageSmaller = styled.span<{ desaturate?: boolean }>` +export const CardBGImageSmaller = deprecatedStyled.span<{ desaturate?: boolean }>` background: url(${xlUnicorn}); width: 1200px; height: 1200px; @@ -32,7 +32,7 @@ export const CardBGImageSmaller = styled.span<{ desaturate?: boolean }>` ${({ desaturate }) => desaturate && `filter: saturate(0)`} ` -export const CardNoise = styled.span` +export const CardNoise = deprecatedStyled.span` background: url(${noise}); background-size: cover; mix-blend-mode: overlay; @@ -46,13 +46,13 @@ export const CardNoise = styled.span` user-select: none; ` -export const CardSection = styled(AutoColumn)<{ disabled?: boolean }>` +export const CardSection = deprecatedStyled(AutoColumn)<{ disabled?: boolean }>` padding: 1rem; z-index: 1; opacity: ${({ disabled }) => disabled && '0.4'}; ` -export const Break = styled.div` +export const Break = deprecatedStyled.div` width: 100%; background-color: rgba(255, 255, 255, 0.2); height: 1px; diff --git a/apps/web/src/components/emptyWallet/EmptyWalletCards.tsx b/apps/web/src/components/emptyWallet/EmptyWalletCards.tsx index 0cd075a5b40..26ccd4e64ca 100644 --- a/apps/web/src/components/emptyWallet/EmptyWalletCards.tsx +++ b/apps/web/src/components/emptyWallet/EmptyWalletCards.tsx @@ -14,6 +14,7 @@ import type { FORServiceProvider } from 'uniswap/src/features/fiatOnRamp/types' import { useCexTransferProviders } from 'uniswap/src/features/fiatOnRamp/useCexTransferProviders' import { getServiceProviderLogo } from 'uniswap/src/features/fiatOnRamp/utils' import { ElementName } from 'uniswap/src/features/telemetry/constants' +import { isExtensionApp } from 'utilities/src/platform' import { useEvent } from 'utilities/src/react/hooks' const ICON_SIZE = 28 @@ -59,16 +60,19 @@ function CEXTransferLogo({ providers }: { providers: FORServiceProvider[] }) { export const EmptyWalletCards = ( { horizontalLayout, + growFullWidth, buyElementName, receiveElementName, cexTransferElementName, }: { horizontalLayout?: boolean + growFullWidth?: boolean buyElementName: ElementName receiveElementName: ElementName cexTransferElementName: ElementName } = { horizontalLayout: false, + growFullWidth: false, buyElementName: ElementName.EmptyStateBuy, receiveElementName: ElementName.EmptyStateReceive, cexTransferElementName: ElementName.EmptyStateCEXTransfer, @@ -83,7 +87,7 @@ export const EmptyWalletCards = ( const handleBuyCryptoClick = useEvent(() => { accountDrawer.close() - navigate(`/buy`, { replace: true }) + navigate(`/buy`, isExtensionApp ? { replace: true } : undefined) }) const handleReceiveCryptoClick = useOpenReceiveCryptoModal({ @@ -133,22 +137,34 @@ export const EmptyWalletCards = ( ], ) + // Determine layout mode + const isScrollableLayout = horizontalLayout && !growFullWidth + const isFullWidthLayout = horizontalLayout && growFullWidth + const needsLeftOffset = isScrollableLayout && fullWidth < EMPTY_WALLET_CARD_WIDTH - APP_PADDING + + // Calculate outer container width + const outerContainerWidth = isFullWidthLayout ? '100%' : horizontalLayout ? fullWidth : '100%' + + // Calculate inner grid width + const innerGridWidth = isFullWidthLayout ? '100%' : horizontalLayout ? EMPTY_WALLET_CARD_WIDTH : '100%' + + // Scroll styles for scrollable layout + const scrollStyles = isScrollableLayout + ? { + overflowX: 'scroll' as const, + scrollbarWidth: 'none' as const, + paddingBottom: 6, + } + : undefined + return ( {options.map((option) => ( ))} - {horizontalLayout && } + {isScrollableLayout && } ) diff --git a/apps/web/src/components/swap/DetailLineItem.tsx b/apps/web/src/components/swap/DetailLineItem.tsx index d5639bde48f..a906893b4d4 100644 --- a/apps/web/src/components/swap/DetailLineItem.tsx +++ b/apps/web/src/components/swap/DetailLineItem.tsx @@ -2,7 +2,7 @@ import { LoadingRow } from 'components/Loader/styled' import { MouseoverTooltip, TooltipSize } from 'components/Tooltip' import { useIsMobile } from 'hooks/screenSize/useIsMobile' import useHoverProps from 'hooks/useHoverProps' -import styled from 'lib/styled-components' +import { deprecatedStyled } from 'lib/styled-components' import { PropsWithChildren } from 'react' import { ThemedText } from 'theme/components' import { Flex } from 'ui/src' @@ -15,12 +15,12 @@ export type LineItemData = { loaderWidth?: number } -const LabelText = styled(ThemedText.BodySmall)<{ hasTooltip?: boolean }>` +const LabelText = deprecatedStyled(ThemedText.BodySmall)<{ hasTooltip?: boolean }>` cursor: ${({ hasTooltip }) => (hasTooltip ? 'help' : 'auto')}; color: ${({ theme }) => theme.neutral2}; ` -const DetailRowValue = styled(ThemedText.BodySmall)` +const DetailRowValue = deprecatedStyled(ThemedText.BodySmall)` text-align: right; overflow-wrap: break-word; ` diff --git a/apps/web/src/components/swap/GasBreakdownTooltip.tsx b/apps/web/src/components/swap/GasBreakdownTooltip.tsx index 2bc089cd568..a671cd0308d 100644 --- a/apps/web/src/components/swap/GasBreakdownTooltip.tsx +++ b/apps/web/src/components/swap/GasBreakdownTooltip.tsx @@ -2,7 +2,7 @@ import { Currency } from '@uniswap/sdk-core' import { AutoColumn } from 'components/deprecated/Column' import Row from 'components/deprecated/Row' import UniswapXRouterLabel, { UniswapXGradient } from 'components/RouterLabel/UniswapXRouterLabel' -import styled from 'lib/styled-components' +import { deprecatedStyled } from 'lib/styled-components' import { ReactNode } from 'react' import { Trans } from 'react-i18next' import { InterfaceTrade } from 'state/routing/types' @@ -18,7 +18,7 @@ import { getChainLabel } from 'uniswap/src/features/chains/utils' import { useLocalizationContext } from 'uniswap/src/features/language/LocalizationContext' import { NumberType } from 'utilities/src/format/types' -const Container = styled(AutoColumn)` +const Container = deprecatedStyled(AutoColumn)` padding: 4px; ` @@ -102,7 +102,7 @@ function NetworkCostDescription({ native }: { native: Currency }) { ) } -const InlineUniswapXGradient = styled(UniswapXGradient)` +const InlineUniswapXGradient = deprecatedStyled(UniswapXGradient)` display: inline; ` export function UniswapXDescription() { diff --git a/apps/web/src/components/swap/GasEstimateTooltip.tsx b/apps/web/src/components/swap/GasEstimateTooltip.tsx index 30a240b3c2d..d9f5dffe282 100644 --- a/apps/web/src/components/swap/GasEstimateTooltip.tsx +++ b/apps/web/src/components/swap/GasEstimateTooltip.tsx @@ -4,7 +4,7 @@ import { LoadingOpacityContainer } from 'components/Loader/styled' import { UniswapXGradient, UniswapXRouterIcon } from 'components/RouterLabel/UniswapXRouterLabel' import { GasBreakdownTooltip } from 'components/swap/GasBreakdownTooltip' import { MouseoverTooltip, TooltipSize } from 'components/Tooltip' -import styled from 'lib/styled-components' +import { deprecatedStyled } from 'lib/styled-components' import { useMultichainContext } from 'state/multichain/useMultichainContext' import { SubmittableTrade } from 'state/routing/types' import { isUniswapXTrade } from 'state/routing/utils' @@ -14,7 +14,7 @@ import { ElementName, SwapEventName } from 'uniswap/src/features/telemetry/const import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send' import { NumberType } from 'utilities/src/format/types' -const StyledGasIcon = styled(Gas)` +const StyledGasIcon = deprecatedStyled(Gas)` height: 16px; width: 16px; // We apply the following to all children of the SVG in order to override the default color diff --git a/apps/web/src/components/swap/SwapDetails.tsx b/apps/web/src/components/swap/SwapDetails.tsx index 825ed340d82..d8ccd2d0599 100644 --- a/apps/web/src/components/swap/SwapDetails.tsx +++ b/apps/web/src/components/swap/SwapDetails.tsx @@ -8,7 +8,7 @@ import SwapLineItem, { SwapLineItemType } from 'components/swap/SwapLineItem' import { SwapCallbackError, SwapShowAcceptChanges } from 'components/swap/styled' import { Allowance, AllowanceState } from 'hooks/usePermit2Allowance' import { SwapResult } from 'hooks/useSwapCallback' -import styled from 'lib/styled-components' +import { deprecatedStyled } from 'lib/styled-components' import { PropsWithChildren, ReactNode, useMemo } from 'react' import { Trans, useTranslation } from 'react-i18next' import { InterfaceTrade, LimitOrderTrade, RouterPreference } from 'state/routing/types' @@ -23,11 +23,11 @@ import Trace from 'uniswap/src/features/telemetry/Trace' import { useTrace } from 'utilities/src/telemetry/trace/TraceContext' import { formatSwapButtonClickEventProperties } from 'utils/loggingFormatters' -const DetailsContainer = styled(Column)` +const DetailsContainer = deprecatedStyled(Column)` padding: 0px 12px 8px; ` -const DropdownControllerWrapper = styled.div` +const DropdownControllerWrapper = deprecatedStyled.div` display: flex; align-items: center; margin-right: -6px; @@ -37,7 +37,7 @@ const DropdownControllerWrapper = styled.div` white-space: nowrap; ` -const DropdownButton = styled.button` +const DropdownButton = deprecatedStyled.button` padding: 0px 16px; margin-top: 4px; margin-bottom: 4px; @@ -50,7 +50,7 @@ const DropdownButton = styled.button` cursor: pointer; ` -const HelpLink = styled(ExternalLink)` +const HelpLink = deprecatedStyled(ExternalLink)` width: 100%; text-align: center; margin-top: 16px; diff --git a/apps/web/src/components/swap/SwapModalHeaderAmount.tsx b/apps/web/src/components/swap/SwapModalHeaderAmount.tsx index fa2f851f46e..b94f38ac8fe 100644 --- a/apps/web/src/components/swap/SwapModalHeaderAmount.tsx +++ b/apps/web/src/components/swap/SwapModalHeaderAmount.tsx @@ -3,7 +3,7 @@ import Column from 'components/deprecated/Column' import Row from 'components/deprecated/Row' import CurrencyLogo from 'components/Logo/CurrencyLogo' import { MouseoverTooltip } from 'components/Tooltip' -import styled from 'lib/styled-components' +import { deprecatedStyled } from 'lib/styled-components' import { PropsWithChildren, ReactNode } from 'react' import { TextProps } from 'rebass' import { ThemedText } from 'theme/components' @@ -13,7 +13,7 @@ import { useLocalizationContext } from 'uniswap/src/features/language/Localizati import { CurrencyField } from 'uniswap/src/types/currency' import { NumberType } from 'utilities/src/format/types' -const Label = styled(ThemedText.BodySmall)<{ cursor?: string }>` +const Label = deprecatedStyled(ThemedText.BodySmall)<{ cursor?: string }>` cursor: ${({ cursor }) => cursor}; color: ${({ theme }) => theme.neutral2}; margin-right: 8px; diff --git a/apps/web/src/components/swap/SwapPreview.tsx b/apps/web/src/components/swap/SwapPreview.tsx index 9b8b877c2dd..b376bd1277c 100644 --- a/apps/web/src/components/swap/SwapPreview.tsx +++ b/apps/web/src/components/swap/SwapPreview.tsx @@ -2,14 +2,14 @@ import { Currency, Percent, TradeType } from '@uniswap/sdk-core' import Column, { AutoColumn } from 'components/deprecated/Column' import { SwapModalHeaderAmount } from 'components/swap/SwapModalHeaderAmount' import { useUSDPrice } from 'hooks/useUSDPrice' -import styled from 'lib/styled-components' +import { deprecatedStyled } from 'lib/styled-components' import { Trans } from 'react-i18next' import { InterfaceTrade } from 'state/routing/types' import { isPreviewTrade } from 'state/routing/utils' import { ThemedText } from 'theme/components' import { CurrencyField } from 'uniswap/src/types/currency' -const HeaderContainer = styled(AutoColumn)` +const HeaderContainer = deprecatedStyled(AutoColumn)` margin-top: 0px; ` diff --git a/apps/web/src/components/swap/SwapSkeleton.tsx b/apps/web/src/components/swap/SwapSkeleton.tsx index 9ae639e5fbd..f45c0223827 100644 --- a/apps/web/src/components/swap/SwapSkeleton.tsx +++ b/apps/web/src/components/swap/SwapSkeleton.tsx @@ -1,18 +1,18 @@ import { ArrowContainer, ArrowWrapper } from 'components/swap/styled' -import styled, { useTheme } from 'lib/styled-components' +import { deprecatedStyled } from 'lib/styled-components' import { ArrowDown } from 'react-feather' import { Trans } from 'react-i18next' import { ThemedText } from 'theme/components' -import { styled as TamaguiStyled } from 'ui/src' +import { styled, useSporeColors } from 'ui/src' -const StyledArrowWrapper = TamaguiStyled(ArrowWrapper, { +const StyledArrowWrapper = styled(ArrowWrapper, { position: 'absolute', left: '50%', transform: 'translate(-50%, -50%)', margin: 0, }) -const LoadingWrapper = styled.div` +const LoadingWrapper = deprecatedStyled.div` display: flex; flex-direction: column; gap: 4px; @@ -24,29 +24,29 @@ const LoadingWrapper = styled.div` background-color: ${({ theme }) => theme.surface1}; ` -const Blob = styled.div<{ width?: number; radius?: number }>` +const Blob = deprecatedStyled.div<{ width?: number; radius?: number }>` background-color: ${({ theme }) => theme.surface2}; border-radius: ${({ radius }) => (radius ?? 4) + 'px'}; height: 56px; width: ${({ width }) => (width ? width + 'px' : '100%')}; ` -const ModuleBlob = styled(Blob)` +const ModuleBlob = deprecatedStyled(Blob)` background-color: ${({ theme }) => theme.surface3}; height: 36px; ` -const TitleColumn = styled.div` +const TitleColumn = deprecatedStyled.div` padding: 8px; ` -const Row = styled.div` +const Row = deprecatedStyled.div` display: flex; align-items: center; justify-content: space-between; ` -const InputColumn = styled.div` +const InputColumn = deprecatedStyled.div` display: flex; flex-flow: column; background-color: ${({ theme }) => theme.surface2}; @@ -56,7 +56,7 @@ const InputColumn = styled.div` padding: 48px 12px; ` -const OutputWrapper = styled.div` +const OutputWrapper = deprecatedStyled.div` position: relative; ` @@ -84,7 +84,7 @@ function FloatingButton() { } export function SwapSkeleton() { - const theme = useTheme() + const colors = useSporeColors() return ( @@ -95,7 +95,7 @@ export function SwapSkeleton() { - + diff --git a/apps/web/src/components/swap/TradePrice.tsx b/apps/web/src/components/swap/TradePrice.tsx index f6474696e36..74dd6a245ab 100644 --- a/apps/web/src/components/swap/TradePrice.tsx +++ b/apps/web/src/components/swap/TradePrice.tsx @@ -1,6 +1,6 @@ import { Currency, Price } from '@uniswap/sdk-core' import { useUSDPrice } from 'hooks/useUSDPrice' -import styled from 'lib/styled-components' +import { deprecatedStyled } from 'lib/styled-components' import tryParseCurrencyAmount from 'lib/utils/tryParseCurrencyAmount' import { useCallback, useMemo, useState } from 'react' import { ThemedText } from 'theme/components' @@ -11,7 +11,7 @@ interface TradePriceProps { price: Price } -const StyledPriceContainer = styled.button` +const StyledPriceContainer = deprecatedStyled.button` background-color: transparent; border: none; cursor: pointer; diff --git a/apps/web/src/components/swap/__snapshots__/SwapDetails.test.tsx.snap b/apps/web/src/components/swap/__snapshots__/SwapDetails.test.tsx.snap index d01fecec184..d9a1e29e215 100644 --- a/apps/web/src/components/swap/__snapshots__/SwapDetails.test.tsx.snap +++ b/apps/web/src/components/swap/__snapshots__/SwapDetails.test.tsx.snap @@ -3,16 +3,8 @@ exports[`SwapDetails.tsx > renders a preview trade while disabling submission 1`] = ` .c0 { - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; display: flex; - -webkit-flex-direction: column; - -ms-flex-direction: column; flex-direction: column; - -webkit-box-pack: start; - -webkit-justify-content: flex-start; - -ms-flex-pack: start; justify-content: flex-start; gap: 8px; } @@ -25,28 +17,17 @@ exports[`SwapDetails.tsx > renders a preview trade while disabling submission 1` .c3 { width: 100%; - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; display: flex; padding: 0; - -webkit-align-items: center; - -webkit-box-align: center; - -ms-flex-align: center; align-items: center; - -webkit-box-pack: start; - -webkit-justify-content: flex-start; - -ms-flex-pack: start; justify-content: flex-start; } .c4 { - -webkit-flex-wrap: wrap; - -ms-flex-wrap: wrap; flex-wrap: wrap; } -.c4 > * { +.c4>* { margin: !important; } @@ -60,16 +41,19 @@ exports[`SwapDetails.tsx > renders a preview trade while disabling submission 1` >
- + +
- +
+
+
+
+ + + +
+
+ + New address + + + You haven’t transacted with this address before. Make sure it’s the correct address before continuing. + +
+
+ + 0x9984b4b4E408e8D618A879e5315BD30952c89103 + +
+
+
+ +
- + +
diff --git a/apps/web/src/pages/Swap/Send/__snapshots__/SendCurrencyInputForm.test.tsx.snap b/apps/web/src/pages/Swap/Send/__snapshots__/SendCurrencyInputForm.test.tsx.snap index 89853f50386..28155e60177 100644 --- a/apps/web/src/pages/Swap/Send/__snapshots__/SendCurrencyInputForm.test.tsx.snap +++ b/apps/web/src/pages/Swap/Send/__snapshots__/SendCurrencyInputForm.test.tsx.snap @@ -9,8 +9,6 @@ exports[`SendCurrencyInputform > renders input in fiat correctly 1`] = ` font-weight: 485; outline: none; border: none; - -webkit-flex: 1 1 auto; - -ms-flex: 1 1 auto; flex: 1 1 auto; background-color: transparent; font-size: 28px; @@ -22,7 +20,7 @@ exports[`SendCurrencyInputform > renders input in fiat correctly 1`] = ` text-align: right; } -.c1::-webkit-search-decoration { +.c1 ::-webkit-search-decoration { -webkit-appearance: none; } @@ -30,25 +28,13 @@ exports[`SendCurrencyInputform > renders input in fiat correctly 1`] = ` -moz-appearance: textfield; } -.c1::-webkit-outer-spin-button, -.c1::-webkit-inner-spin-button { +.c1 ::-webkit-outer-spin-button, +.c1 ::-webkit-inner-spin-button { -webkit-appearance: none; } -.c1::-webkit-input-placeholder { - color: rgba(19,19,19,0.35); -} - -.c1::-moz-placeholder { - color: rgba(19,19,19,0.35); -} - -.c1:-ms-input-placeholder { - color: rgba(19,19,19,0.35); -} - -.c1::placeholder { - color: rgba(19,19,19,0.35); +.c1 ::placeholder { + color: rgba(19, 19, 19, 0.35); } .c2 { @@ -62,19 +48,7 @@ exports[`SendCurrencyInputform > renders input in fiat correctly 1`] = ` line-height: 60px; } -.c2::-webkit-input-placeholder { - opacity: 1; -} - -.c2::-moz-placeholder { - opacity: 1; -} - -.c2:-ms-input-placeholder { - opacity: 1; -} - -.c2::placeholder { +.c2 ::placeholder { opacity: 1; } @@ -90,9 +64,6 @@ exports[`SendCurrencyInputform > renders input in fiat correctly 1`] = ` } .c0 { - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; user-select: none; color: #131313; text-align: left; @@ -103,9 +74,6 @@ exports[`SendCurrencyInputform > renders input in fiat correctly 1`] = ` .c4 { color: #131313; - -webkit-letter-spacing: -0.01em; - -moz-letter-spacing: -0.01em; - -ms-letter-spacing: -0.01em; letter-spacing: -0.01em; } @@ -145,6 +113,7 @@ exports[`SendCurrencyInputform > renders input in fiat correctly 1`] = ` autocomplete="off" autocorrect="off" class="c1 c2" + data-testid="send-form-amount-input" inputmode="decimal" maxlength="79" minlength="1" @@ -254,7 +223,7 @@ exports[`SendCurrencyInputform > renders input in fiat correctly 1`] = ` class="_display-flex _alignItems-stretch _flexBasis-auto _boxSizing-border-box _position-relative _minHeight-0px _minWidth-0px _flexShrink-0 _flexDirection-row" >
renders input in fiat correctly 1`] = `
- -

- +
+ +
+ +
+
+
+
+
+
+
+ + Select a token + +
+
+ + + +
+
+
+
+
+
+ + + +
+
+ + + +
+
+
+
+
+
+
+
+ +
+
+
+ + + +
+
+
+
+
+
+
+
+ + + + + Only Mainnet tokens are available for limits. + +
+
+
+
+
+
+
+ + + +
+ + Your tokens + +
+
+
+
+
+
+
+ + No tokens yet + + + Buy crypto with a card or bank to send tokens. + +
+
+
+
+ + Buy crypto + +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
renders input in token amount correctly 1`] = ` font-weight: 485; outline: none; border: none; - -webkit-flex: 1 1 auto; - -ms-flex: 1 1 auto; flex: 1 1 auto; background-color: transparent; font-size: 28px; @@ -313,7 +551,7 @@ exports[`SendCurrencyInputform > renders input in token amount correctly 1`] = ` text-align: right; } -.c0::-webkit-search-decoration { +.c0 ::-webkit-search-decoration { -webkit-appearance: none; } @@ -321,25 +559,13 @@ exports[`SendCurrencyInputform > renders input in token amount correctly 1`] = ` -moz-appearance: textfield; } -.c0::-webkit-outer-spin-button, -.c0::-webkit-inner-spin-button { +.c0 ::-webkit-outer-spin-button, +.c0 ::-webkit-inner-spin-button { -webkit-appearance: none; } -.c0::-webkit-input-placeholder { - color: rgba(19,19,19,0.35); -} - -.c0::-moz-placeholder { - color: rgba(19,19,19,0.35); -} - -.c0:-ms-input-placeholder { - color: rgba(19,19,19,0.35); -} - -.c0::placeholder { - color: rgba(19,19,19,0.35); +.c0 ::placeholder { + color: rgba(19, 19, 19, 0.35); } .c1 { @@ -353,19 +579,7 @@ exports[`SendCurrencyInputform > renders input in token amount correctly 1`] = ` line-height: 60px; } -.c1::-webkit-input-placeholder { - opacity: 1; -} - -.c1::-moz-placeholder { - opacity: 1; -} - -.c1:-ms-input-placeholder { - opacity: 1; -} - -.c1::placeholder { +.c1 ::placeholder { opacity: 1; } @@ -382,9 +596,6 @@ exports[`SendCurrencyInputform > renders input in token amount correctly 1`] = ` .c3 { color: #131313; - -webkit-letter-spacing: -0.01em; - -moz-letter-spacing: -0.01em; - -ms-letter-spacing: -0.01em; letter-spacing: -0.01em; } @@ -418,6 +629,7 @@ exports[`SendCurrencyInputform > renders input in token amount correctly 1`] = ` autocomplete="off" autocorrect="off" class="c0 c1" + data-testid="send-form-amount-input" inputmode="decimal" maxlength="79" minlength="1" @@ -527,7 +739,7 @@ exports[`SendCurrencyInputform > renders input in token amount correctly 1`] = ` class="_display-flex _alignItems-stretch _flexBasis-auto _boxSizing-border-box _position-relative _minHeight-0px _minWidth-0px _flexShrink-0 _flexDirection-row" >
renders input in token amount correctly 1`] = `
- -

- +
+ +
+ +
+
+
+
+
+
+
+ + Select a token + +
+
+ + + +
+
+
+
+
+
+ + + +
+
+ + + +
+
+
+
+
+
+
+
+ +
+
+
+ + + +
+
+
+
+
+
+
+
+ + + + + Only Mainnet tokens are available for limits. + +
+
+
+
+
+
+
+ + + +
+ + Your tokens + +
+
+
+
+
+
+
+ + No tokens yet + + + Buy crypto with a card or bank to send tokens. + +
+
+
+
+ + Buy crypto + +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
should render placeholder values 1`] = ` font-weight: 485; outline: none; border: none; - -webkit-flex: 1 1 auto; - -ms-flex: 1 1 auto; flex: 1 1 auto; background-color: transparent; font-size: 28px; @@ -586,7 +1067,7 @@ exports[`SendCurrencyInputform > should render placeholder values 1`] = ` text-align: right; } -.c1::-webkit-search-decoration { +.c1 ::-webkit-search-decoration { -webkit-appearance: none; } @@ -594,25 +1075,13 @@ exports[`SendCurrencyInputform > should render placeholder values 1`] = ` -moz-appearance: textfield; } -.c1::-webkit-outer-spin-button, -.c1::-webkit-inner-spin-button { +.c1 ::-webkit-outer-spin-button, +.c1 ::-webkit-inner-spin-button { -webkit-appearance: none; } -.c1::-webkit-input-placeholder { - color: rgba(19,19,19,0.35); -} - -.c1::-moz-placeholder { - color: rgba(19,19,19,0.35); -} - -.c1:-ms-input-placeholder { - color: rgba(19,19,19,0.35); -} - -.c1::placeholder { - color: rgba(19,19,19,0.35); +.c1 ::placeholder { + color: rgba(19, 19, 19, 0.35); } .c2 { @@ -626,19 +1095,7 @@ exports[`SendCurrencyInputform > should render placeholder values 1`] = ` line-height: 60px; } -.c2::-webkit-input-placeholder { - opacity: 1; -} - -.c2::-moz-placeholder { - opacity: 1; -} - -.c2:-ms-input-placeholder { - opacity: 1; -} - -.c2::placeholder { +.c2 ::placeholder { opacity: 1; } @@ -654,23 +1111,17 @@ exports[`SendCurrencyInputform > should render placeholder values 1`] = ` } .c0 { - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; user-select: none; color: #131313; text-align: left; font-size: 70px; font-weight: 500; line-height: 60px; - color: rgba(19,19,19,0.35); + color: rgba(19, 19, 19, 0.35); } .c4 { color: #131313; - -webkit-letter-spacing: -0.01em; - -moz-letter-spacing: -0.01em; - -ms-letter-spacing: -0.01em; letter-spacing: -0.01em; } @@ -710,6 +1161,7 @@ exports[`SendCurrencyInputform > should render placeholder values 1`] = ` autocomplete="off" autocorrect="off" class="c1 c2" + data-testid="send-form-amount-input" inputmode="decimal" maxlength="79" minlength="1" @@ -817,7 +1269,7 @@ exports[`SendCurrencyInputform > should render placeholder values 1`] = ` class="_display-flex _alignItems-stretch _flexBasis-auto _boxSizing-border-box _position-relative _minHeight-0px _minWidth-0px _flexShrink-0 _flexDirection-row" >
should render placeholder values 1`] = `
- -

- +
+ +
+ +
+
+
+
+
+
+
+ + Select a token + +
+
+ + + +
+
+
+
+
+
+ + + +
+
+ + + +
+
+
+
+
+
+
+
+ +
+
+
+ + + +
+
+
+
+
+
+
+
+ + + + + Only Mainnet tokens are available for limits. + +
+
+
+
+
+
+
+ + + +
+ + Your tokens + +
+
+
+
+
+
+
+ + No tokens yet + + + Buy crypto with a card or bank to send tokens. + +
+
+
+
+ + Buy crypto + +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
should render correctly with no verified recipi line-height: 24px; } -.c0::-webkit-input-placeholder { - color: rgba(19,19,19,0.35); -} - -.c0::-moz-placeholder { - color: rgba(19,19,19,0.35); -} - -.c0:-ms-input-placeholder { - color: rgba(19,19,19,0.35); -} - -.c0::placeholder { - color: rgba(19,19,19,0.35); +.c0 ::placeholder { + color: rgba(19, 19, 19, 0.35); } should render correctly with no verified recipi exports[`SendCurrencyInputform > should render correctly with unitag 1`] = ` .c5 { - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; display: flex; - -webkit-flex-direction: column; - -ms-flex-direction: column; flex-direction: column; - -webkit-box-pack: start; - -webkit-justify-content: flex-start; - -ms-flex-pack: start; justify-content: flex-start; } @@ -98,111 +78,71 @@ exports[`SendCurrencyInputform > should render correctly with unitag 1`] = ` .c1 { width: 100%; - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; display: flex; padding: 0; - -webkit-align-items: center; - -webkit-box-align: center; - -ms-flex-align: center; align-items: center; - -webkit-box-pack: start; - -webkit-justify-content: flex-start; - -ms-flex-pack: start; justify-content: flex-start; } .c3 { width: 100%; - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; display: flex; padding: 0; - -webkit-align-items: center; - -webkit-box-align: center; - -ms-flex-align: center; align-items: center; - -webkit-box-pack: start; - -webkit-justify-content: flex-start; - -ms-flex-pack: start; justify-content: flex-start; gap: 12px; } .c6 { width: 100%; - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; display: flex; padding: 0; - -webkit-align-items: center; - -webkit-box-align: center; - -ms-flex-align: center; align-items: center; - -webkit-box-pack: start; - -webkit-justify-content: flex-start; - -ms-flex-pack: start; justify-content: flex-start; gap: 4px; } .c7 { color: #131313; - -webkit-letter-spacing: -0.01em; - -moz-letter-spacing: -0.01em; - -ms-letter-spacing: -0.01em; letter-spacing: -0.01em; } .c8 { - color: rgba(19,19,19,0.63); - -webkit-letter-spacing: -0.01em; - -moz-letter-spacing: -0.01em; - -ms-letter-spacing: -0.01em; + color: rgba(19, 19, 19, 0.63); letter-spacing: -0.01em; } .c2 { padding: 6px 0px; - -webkit-box-pack: justify; - -webkit-justify-content: space-between; - -ms-flex-pack: justify; justify-content: space-between; } .c4 { - -webkit-text-decoration: none; text-decoration: none; cursor: pointer; - -webkit-transition-duration: 125ms; transition-duration: 125ms; } -.c4:hover { +.c4 :hover { opacity: 0.6; } -.c4:active { +.c4 :active { opacity: 0.4; } .c9 { - color: rgba(19,19,19,0.35); - -webkit-text-decoration: none; + color: rgba(19, 19, 19, 0.35); text-decoration: none; cursor: pointer; - -webkit-transition-duration: 125ms; transition-duration: 125ms; } -.c9:hover { +.c9 :hover { opacity: 0.6; } -.c9:active { +.c9 :active { opacity: 0.4; } @@ -228,13 +168,14 @@ exports[`SendCurrencyInputform > should render correctly with unitag 1`] = ` >
should render correctly with unitag 1`] = ` >
should render correctly with unitag 1`] = ` exports[`SendCurrencyInputform > should render correctly with verified recipient 1`] = ` .c5 { - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; display: flex; - -webkit-flex-direction: column; - -ms-flex-direction: column; flex-direction: column; - -webkit-box-pack: start; - -webkit-justify-content: flex-start; - -ms-flex-pack: start; justify-content: flex-start; } @@ -326,111 +260,71 @@ exports[`SendCurrencyInputform > should render correctly with verified recipient .c1 { width: 100%; - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; display: flex; padding: 0; - -webkit-align-items: center; - -webkit-box-align: center; - -ms-flex-align: center; align-items: center; - -webkit-box-pack: start; - -webkit-justify-content: flex-start; - -ms-flex-pack: start; justify-content: flex-start; } .c3 { width: 100%; - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; display: flex; padding: 0; - -webkit-align-items: center; - -webkit-box-align: center; - -ms-flex-align: center; align-items: center; - -webkit-box-pack: start; - -webkit-justify-content: flex-start; - -ms-flex-pack: start; justify-content: flex-start; gap: 12px; } .c6 { width: 100%; - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; display: flex; padding: 0; - -webkit-align-items: center; - -webkit-box-align: center; - -ms-flex-align: center; align-items: center; - -webkit-box-pack: start; - -webkit-justify-content: flex-start; - -ms-flex-pack: start; justify-content: flex-start; gap: 4px; } .c7 { color: #131313; - -webkit-letter-spacing: -0.01em; - -moz-letter-spacing: -0.01em; - -ms-letter-spacing: -0.01em; letter-spacing: -0.01em; } .c8 { - color: rgba(19,19,19,0.63); - -webkit-letter-spacing: -0.01em; - -moz-letter-spacing: -0.01em; - -ms-letter-spacing: -0.01em; + color: rgba(19, 19, 19, 0.63); letter-spacing: -0.01em; } .c2 { padding: 6px 0px; - -webkit-box-pack: justify; - -webkit-justify-content: space-between; - -ms-flex-pack: justify; justify-content: space-between; } .c4 { - -webkit-text-decoration: none; text-decoration: none; cursor: pointer; - -webkit-transition-duration: 125ms; transition-duration: 125ms; } -.c4:hover { +.c4 :hover { opacity: 0.6; } -.c4:active { +.c4 :active { opacity: 0.4; } .c9 { - color: rgba(19,19,19,0.35); - -webkit-text-decoration: none; + color: rgba(19, 19, 19, 0.35); text-decoration: none; cursor: pointer; - -webkit-transition-duration: 125ms; transition-duration: 125ms; } -.c9:hover { +.c9 :hover { opacity: 0.6; } -.c9:active { +.c9 :active { opacity: 0.4; } @@ -456,13 +350,14 @@ exports[`SendCurrencyInputform > should render correctly with verified recipient >
should render correctly with verified recipient >
should render placeholder values 1`] = ` line-height: 24px; } -.c0::-webkit-input-placeholder { - color: rgba(19,19,19,0.35); -} - -.c0::-moz-placeholder { - color: rgba(19,19,19,0.35); -} - -.c0:-ms-input-placeholder { - color: rgba(19,19,19,0.35); -} - -.c0::placeholder { - color: rgba(19,19,19,0.35); +.c0 ::placeholder { + color: rgba(19, 19, 19, 0.35); } should render input in fiat correctly 1`] = ` .c0 { color: #131313; - -webkit-letter-spacing: -0.01em; - -moz-letter-spacing: -0.01em; - -ms-letter-spacing: -0.01em; letter-spacing: -0.01em; } .c1 { - color: rgba(19,19,19,0.63); - -webkit-letter-spacing: -0.01em; - -moz-letter-spacing: -0.01em; - -ms-letter-spacing: -0.01em; + color: rgba(19, 19, 19, 0.63); letter-spacing: -0.01em; } @@ -111,7 +105,7 @@ exports[`SendReviewModal > should render input in fiat correctly 1`] = ` data-testid="account-icon" >
should render input in fiat correctly 1`] = ` class="_display-flex _alignItems-stretch _flexBasis-auto _boxSizing-border-box _position-relative _minHeight-0px _minWidth-0px _flexShrink-0 _flexDirection-row _alignSelf-stretch" > - -
- +
+
+
+
+ + + +
+
+ + Is this a wallet address? + + + You’re about to send tokens to a special type of address - a smart contract. Double-check it’s the address you intended to send to. If it’s wrong, your tokens could be lost forever. + +
+
+
+ +
- +
+
diff --git a/apps/web/src/pages/Swap/Swap.e2e.test.ts b/apps/web/src/pages/Swap/Swap.e2e.test.ts index e6fdc09d0d4..79b231e8d51 100644 --- a/apps/web/src/pages/Swap/Swap.e2e.test.ts +++ b/apps/web/src/pages/Swap/Swap.e2e.test.ts @@ -4,24 +4,34 @@ import { TestID } from 'uniswap/src/test/fixtures/testIDs' const test = getTest() -test.describe('Swap', () => { - test('should default inputs from URL params ', async ({ page }) => { - await page.goto(`/swap?inputCurrency=${USDT.address}`) - await expect(page.getByTestId(TestID.ChooseInputToken + '-label')).toHaveText('USDT') +test.describe( + 'Swap', + { + tag: '@team:apps-swap', + annotation: [ + { type: 'DD_TAGS[team]', description: 'apps-swap' }, + { type: 'DD_TAGS[test.type]', description: 'web-e2e' }, + ], + }, + () => { + test('should default inputs from URL params ', async ({ page }) => { + await page.goto(`/swap?inputCurrency=${USDT.address}`) + await expect(page.getByTestId(TestID.ChooseInputToken + '-label')).toHaveText('USDT') - await page.goto(`/swap?outputCurrency=${USDT.address}`) - await expect(page.getByTestId(TestID.ChooseOutputToken + '-label')).toHaveText('USDT') + await page.goto(`/swap?outputCurrency=${USDT.address}`) + await expect(page.getByTestId(TestID.ChooseOutputToken + '-label')).toHaveText('USDT') - await page.goto(`/swap?inputCurrency=ETH&outputCurrency=${USDT.address}`) - await expect(page.getByTestId(TestID.ChooseInputToken + '-label')).toHaveText('ETH') - await expect(page.getByTestId(TestID.ChooseOutputToken + '-label')).toHaveText('USDT') - }) + await page.goto(`/swap?inputCurrency=ETH&outputCurrency=${USDT.address}`) + await expect(page.getByTestId(TestID.ChooseInputToken + '-label')).toHaveText('ETH') + await expect(page.getByTestId(TestID.ChooseOutputToken + '-label')).toHaveText('USDT') + }) - test('should reset the dependent input when the independent input is cleared', async ({ page }) => { - await page.goto(`/swap?inputCurrency=ETH&outputCurrency=${USDT.address}`) - await page.getByTestId(TestID.AmountInputIn).fill('0.01') - await page.getByTestId(TestID.AmountInputIn).clear() - await expect(page.getByTestId(TestID.AmountInputIn)).toHaveValue('') - await expect(page.getByTestId(TestID.AmountInputOut)).toHaveValue('') - }) -}) + test('should reset the dependent input when the independent input is cleared', async ({ page }) => { + await page.goto(`/swap?inputCurrency=ETH&outputCurrency=${USDT.address}`) + await page.getByTestId(TestID.AmountInputIn).fill('0.01') + await page.getByTestId(TestID.AmountInputIn).clear() + await expect(page.getByTestId(TestID.AmountInputIn)).toHaveValue('') + await expect(page.getByTestId(TestID.AmountInputOut)).toHaveValue('') + }) + }, +) diff --git a/apps/web/src/pages/Swap/SwapSettings.e2e.test.ts b/apps/web/src/pages/Swap/SwapSettings.e2e.test.ts index d0ef8b2c207..cbb23a7e6b0 100644 --- a/apps/web/src/pages/Swap/SwapSettings.e2e.test.ts +++ b/apps/web/src/pages/Swap/SwapSettings.e2e.test.ts @@ -3,22 +3,32 @@ import { TestID } from 'uniswap/src/test/fixtures/testIDs' const test = getTest() -test.describe('Swap Settings', () => { - test('opens and closes the settings menu', async ({ page }) => { - await page.goto('/swap') - await page.getByTestId(TestID.SwapSettings).click() - await expect(page.getByText('Max slippage')).toBeVisible() - await expect(page.getByText('Default')).toBeVisible() - await page.getByTestId(TestID.SwapSettings).click() - await expect(page.getByText('Max slippage')).not.toBeVisible() - }) +test.describe( + 'Swap Settings', + { + tag: '@team:apps-swap', + annotation: [ + { type: 'DD_TAGS[team]', description: 'apps-swap' }, + { type: 'DD_TAGS[test.type]', description: 'web-e2e' }, + ], + }, + () => { + test('opens and closes the settings menu', async ({ page }) => { + await page.goto('/swap') + await page.getByTestId(TestID.SwapSettings).click() + await expect(page.getByText('Max slippage')).toBeVisible() + await expect(page.getByText('Default')).toBeVisible() + await page.getByTestId(TestID.SwapSettings).click() + await expect(page.getByText('Max slippage')).not.toBeVisible() + }) - test('should open the mobile settings menu', async ({ page }) => { - await page.setViewportSize({ width: 375, height: 667 }) - await page.goto('/swap') - await page.getByTestId(TestID.SwapSettings).click() - await expect(page.getByText('Max slippage')).toBeVisible() - await expect(page.getByText('Default')).toBeVisible() - await expect(page.getByTestId(TestID.MobileWebSettingsMenu).first()).toBeVisible() - }) -}) + test('should open the mobile settings menu', async ({ page }) => { + await page.setViewportSize({ width: 375, height: 667 }) + await page.goto('/swap') + await page.getByTestId(TestID.SwapSettings).click() + await expect(page.getByText('Max slippage')).toBeVisible() + await expect(page.getByText('Default')).toBeVisible() + await expect(page.getByTestId(TestID.MobileWebSettingsMenu).first()).toBeVisible() + }) + }, +) diff --git a/apps/web/src/pages/Swap/TokenSelector.e2e.test.ts b/apps/web/src/pages/Swap/TokenSelector.e2e.test.ts index 31f5d83ff4a..3c9a260ceab 100644 --- a/apps/web/src/pages/Swap/TokenSelector.e2e.test.ts +++ b/apps/web/src/pages/Swap/TokenSelector.e2e.test.ts @@ -4,54 +4,64 @@ import { TestID } from 'uniswap/src/test/fixtures/testIDs' const test = getTest() -test.describe('TokenSelector', () => { - test('output - should show bridging and top tokens sections if empty', async ({ page }) => { - await page.goto('/swap') - await page.getByTestId(TestID.ChooseOutputToken).click() - - await expect( - page.getByTestId(`${TestID.SectionHeaderPrefix}${OnchainItemSectionName.TrendingTokens}`), - ).toBeVisible() - await expect( - page.getByTestId(`${TestID.SectionHeaderPrefix}${OnchainItemSectionName.BridgingTokens}`), - ).toBeVisible() - }) - - test('output - should show top tokens sections if token selected', async ({ page }) => { - await page.goto('/swap') - await page.getByTestId(TestID.SwitchCurrenciesButton).click() - await page.getByTestId(TestID.ChooseOutputToken).click() - - await expect( - page.getByTestId(`${TestID.SectionHeaderPrefix}${OnchainItemSectionName.TrendingTokens}`), - ).toBeVisible() - await expect( - page.getByTestId(`${TestID.SectionHeaderPrefix}${OnchainItemSectionName.BridgingTokens}`), - ).not.toBeVisible() - }) - - test('input - should show top tokens sections if token selected', async ({ page }) => { - await page.goto('/swap') - await page.getByTestId(TestID.ChooseInputToken).click() - - await expect( - page.getByTestId(`${TestID.SectionHeaderPrefix}${OnchainItemSectionName.TrendingTokens}`), - ).toBeVisible() - await expect( - page.getByTestId(`${TestID.SectionHeaderPrefix}${OnchainItemSectionName.BridgingTokens}`), - ).not.toBeVisible() - }) - - test('input - should show bridging and top tokens sections if empty', async ({ page }) => { - await page.goto('/swap') - await page.getByTestId(TestID.SwitchCurrenciesButton).click() - await page.getByTestId(TestID.ChooseInputToken).click() - - await expect( - page.getByTestId(`${TestID.SectionHeaderPrefix}${OnchainItemSectionName.TrendingTokens}`), - ).toBeVisible() - await expect( - page.getByTestId(`${TestID.SectionHeaderPrefix}${OnchainItemSectionName.BridgingTokens}`), - ).toBeVisible() - }) -}) +test.describe( + 'TokenSelector', + { + tag: '@team:apps-swap', + annotation: [ + { type: 'DD_TAGS[team]', description: 'apps-swap' }, + { type: 'DD_TAGS[test.type]', description: 'web-e2e' }, + ], + }, + () => { + test('output - should show bridging and top tokens sections if empty', async ({ page }) => { + await page.goto('/swap') + await page.getByTestId(TestID.ChooseOutputToken).click() + + await expect( + page.getByTestId(`${TestID.SectionHeaderPrefix}${OnchainItemSectionName.TrendingTokens}`), + ).toBeVisible() + await expect( + page.getByTestId(`${TestID.SectionHeaderPrefix}${OnchainItemSectionName.BridgingTokens}`), + ).toBeVisible() + }) + + test('output - should show top tokens sections if token selected', async ({ page }) => { + await page.goto('/swap') + await page.getByTestId(TestID.SwitchCurrenciesButton).click() + await page.getByTestId(TestID.ChooseOutputToken).click() + + await expect( + page.getByTestId(`${TestID.SectionHeaderPrefix}${OnchainItemSectionName.TrendingTokens}`), + ).toBeVisible() + await expect( + page.getByTestId(`${TestID.SectionHeaderPrefix}${OnchainItemSectionName.BridgingTokens}`), + ).not.toBeVisible() + }) + + test('input - should show top tokens sections if token selected', async ({ page }) => { + await page.goto('/swap') + await page.getByTestId(TestID.ChooseInputToken).click() + + await expect( + page.getByTestId(`${TestID.SectionHeaderPrefix}${OnchainItemSectionName.TrendingTokens}`), + ).toBeVisible() + await expect( + page.getByTestId(`${TestID.SectionHeaderPrefix}${OnchainItemSectionName.BridgingTokens}`), + ).not.toBeVisible() + }) + + test('input - should show bridging and top tokens sections if empty', async ({ page }) => { + await page.goto('/swap') + await page.getByTestId(TestID.SwitchCurrenciesButton).click() + await page.getByTestId(TestID.ChooseInputToken).click() + + await expect( + page.getByTestId(`${TestID.SectionHeaderPrefix}${OnchainItemSectionName.TrendingTokens}`), + ).toBeVisible() + await expect( + page.getByTestId(`${TestID.SectionHeaderPrefix}${OnchainItemSectionName.BridgingTokens}`), + ).toBeVisible() + }) + }, +) diff --git a/apps/web/src/pages/Swap/UniswapX.anvil.e2e.test.ts b/apps/web/src/pages/Swap/UniswapX.anvil.e2e.test.ts index fd57b0cb00b..3c130fc737c 100644 --- a/apps/web/src/pages/Swap/UniswapX.anvil.e2e.test.ts +++ b/apps/web/src/pages/Swap/UniswapX.anvil.e2e.test.ts @@ -14,70 +14,80 @@ const test = getTest({ withAnvil: true }) const UNISWAP_X_ORDERS_ENDPOINT = `https://interface.gateway.uniswap.org/v2/orders?swapper=${TEST_WALLET_ADDRESS}&orderHashes=${ZERO_ADDRESS}` -test.describe('UniswapX', async () => { - test.beforeEach(async ({ page, anvil }) => { - await anvil.setErc20Balance({ - address: assume0xAddress(WETH9[UniverseChainId.Mainnet].address), - balance: parseEther('1000000'), - }) - await page.route(`${uniswapUrls.tradingApiUrl}${uniswapUrls.tradingApiPaths.quote}`, async (route, request) => { - const postData = await request.postData() - const data = JSON.parse(postData ?? '{}') - if (data.tokenOut === USDC_MAINNET.address) { - await route.continue() - } else { - await route.fulfill({ path: Mocks.UniswapX.quote }) - } - }) - await page.route(`${uniswapUrls.tradingApiUrl}${uniswapUrls.tradingApiPaths.order}`, async (route) => { - await route.fulfill({ path: Mocks.UniswapX.openOrder }) - }) - await page.goto(`/swap?inputCurrency=${WETH9[UniverseChainId.Mainnet].address}&outputCurrency=${DAI.address}`) +test.describe( + 'UniswapX', + { + tag: '@team:apps-swap', + annotation: [ + { type: 'DD_TAGS[team]', description: 'apps-swap' }, + { type: 'DD_TAGS[test.type]', description: 'web-e2e' }, + ], + }, + async () => { + test.beforeEach(async ({ page, anvil }) => { + await anvil.setErc20Balance({ + address: assume0xAddress(WETH9[UniverseChainId.Mainnet].address), + balance: parseEther('1000000'), + }) + await page.route(`${uniswapUrls.tradingApiUrl}${uniswapUrls.tradingApiPaths.quote}`, async (route, request) => { + const postData = await request.postData() + const data = JSON.parse(postData ?? '{}') + if (data.tokenOut === USDC_MAINNET.address) { + await route.continue() + } else { + await route.fulfill({ path: Mocks.UniswapX.quote }) + } + }) + await page.route(`${uniswapUrls.tradingApiUrl}${uniswapUrls.tradingApiPaths.order}`, async (route) => { + await route.fulfill({ path: Mocks.UniswapX.openOrder }) + }) + await page.goto(`/swap?inputCurrency=${WETH9[UniverseChainId.Mainnet].address}&outputCurrency=${DAI.address}`) - await page.getByTestId(TestID.AmountInputIn).fill('1') - await page.getByTestId(TestID.ReviewSwap).click() - await page.getByTestId(TestID.Swap).click() - }) + await page.getByTestId(TestID.AmountInputIn).fill('1') + await page.getByTestId(TestID.ReviewSwap).click() + await page.getByTestId(TestID.Swap).click() + }) - test('can swap using uniswapX with WETH as input', async ({ page }) => { - await page.route(UNISWAP_X_ORDERS_ENDPOINT, async (route) => { - await route.fulfill({ - path: Mocks.UniswapX.filledOrders, + test('can swap using uniswapX with WETH as input', async ({ page }) => { + await page.route(UNISWAP_X_ORDERS_ENDPOINT, async (route) => { + await route.fulfill({ + path: Mocks.UniswapX.filledOrders, + }) }) + + await expect(page.getByText('Approved')).toBeVisible() + await expect(page.getByRole('button', { name: 'Swapping 1.00 WETH for 3,665.13 DAI' })).toBeVisible() }) - await expect(page.getByText('Approved')).toBeVisible() - await expect(page.getByRole('button', { name: 'Swapping 1.00 WETH for 3,665.13 DAI' })).toBeVisible() - }) + test('renders error view if uniswapx order expires', async ({ page }) => { + await page.route(UNISWAP_X_ORDERS_ENDPOINT, async (route) => { + await route.fulfill({ path: Mocks.UniswapX.expiredOrders }) + }) - test('renders error view if uniswapx order expires', async ({ page }) => { - await page.route(UNISWAP_X_ORDERS_ENDPOINT, async (route) => { - await route.fulfill({ path: Mocks.UniswapX.expiredOrders }) + await expect(page.getByText('Swap expired')).toBeVisible() }) - await expect(page.getByText('Swap expired')).toBeVisible() - }) + test('cancels a pending uniswapx order', async ({ page }) => { + await page.getByTestId(TestID.Web3StatusConnected).click() + await page.getByText('Activity').click() + await page.getByText('Swapping').click() + await page.getByText('Cancel').click() + await page.getByRole('button', { name: 'Proceed' }).click() - test('cancels a pending uniswapx order', async ({ page }) => { - await page.getByTestId(TestID.Web3StatusConnected).click() - await page.getByText('Activity').click() - await page.getByText('Swapping').click() - await page.getByText('Cancel').click() - await page.getByRole('button', { name: 'Proceed' }).click() + await expect(page.getByText('Cancellation successful')).toBeVisible() + }) - await expect(page.getByText('Cancellation successful')).toBeVisible() - }) + test('deduplicates remote vs local uniswapx orders', async ({ page, graphql }) => { + await page.route(UNISWAP_X_ORDERS_ENDPOINT, async (route) => { + await route.fulfill({ path: Mocks.UniswapX.filledOrders }) + }) - test('deduplicates remote vs local uniswapx orders', async ({ page, graphql }) => { - await page.route(UNISWAP_X_ORDERS_ENDPOINT, async (route) => { - await route.fulfill({ path: Mocks.UniswapX.filledOrders }) + await page.getByTestId(TestID.Web3StatusConnected).click() + await page.getByText('Activity').click() + await graphql.intercept('ActivityWeb', Mocks.UniswapX.activity) + const activity = await page.getByTestId(TestID.ActivityContent) + await expect(activity.getByText('Swapping')).not.toBeVisible() + await expect(activity.getByText('Swapped')).toBeVisible() }) - - await page.getByTestId(TestID.Web3StatusConnected).click() - await page.getByText('Activity').click() - await graphql.intercept('ActivityWeb', Mocks.UniswapX.activity) - const activity = await page.getByTestId(TestID.ActivityContent) - await expect(activity.getByText('Swapping')).not.toBeVisible() - await expect(activity.getByText('Swapped')).toBeVisible() - }) -}) + }, +) diff --git a/apps/web/src/pages/Swap/Wrap.anvil.e2e.test.ts b/apps/web/src/pages/Swap/Wrap.anvil.e2e.test.ts index fbaf2fcf945..dba692f2dba 100644 --- a/apps/web/src/pages/Swap/Wrap.anvil.e2e.test.ts +++ b/apps/web/src/pages/Swap/Wrap.anvil.e2e.test.ts @@ -11,61 +11,71 @@ import { parseEther } from 'viem' const test = getTest({ withAnvil: true }) -test.describe('Wrap', () => { - test.describe.configure({ retries: 3 }) +test.describe( + 'Wrap', + { + tag: '@team:apps-swap', + annotation: [ + { type: 'DD_TAGS[team]', description: 'apps-swap' }, + { type: 'DD_TAGS[test.type]', description: 'web-e2e' }, + ], + }, + () => { + test.describe.configure({ retries: 3 }) - test('should unwrap WETH', async ({ page, anvil }) => { - const expectSingleTransaction = createExpectSingleTransaction({ - anvil, - address: TEST_WALLET_ADDRESS, - options: { blocks: 2 }, - }) + test('should unwrap WETH', async ({ page, anvil }) => { + const expectSingleTransaction = createExpectSingleTransaction({ + anvil, + address: TEST_WALLET_ADDRESS, + options: { blocks: 2 }, + }) - await stubTradingApiEndpoint({ page, endpoint: uniswapUrls.tradingApiPaths.swap }) + await stubTradingApiEndpoint({ page, endpoint: uniswapUrls.tradingApiPaths.swap }) - await anvil.setErc20Balance({ - address: assume0xAddress(WETH_ADDRESS(UniverseChainId.Mainnet)), - balance: parseEther('1'), - }) - await page.goto(`/swap`) + await anvil.setErc20Balance({ + address: assume0xAddress(WETH_ADDRESS(UniverseChainId.Mainnet)), + balance: parseEther('1'), + }) + await page.goto(`/swap`) - await page.getByTestId(TestID.ChooseInputToken).click() - // eslint-disable-next-line - await page.getByTestId('token-option-1-WETH').first().click() + await page.getByTestId(TestID.ChooseInputToken).click() + // eslint-disable-next-line + await page.getByTestId('token-option-1-WETH').first().click() - await page.getByTestId(TestID.ChooseOutputToken).click() - // eslint-disable-next-line - await page.getByTestId('token-option-1-ETH').first().click() + await page.getByTestId(TestID.ChooseOutputToken).click() + // eslint-disable-next-line + await page.getByTestId('token-option-1-ETH').first().click() - await page.getByTestId(TestID.AmountInputIn).fill('0.01') + await page.getByTestId(TestID.AmountInputIn).fill('0.01') - await expectSingleTransaction(async () => { - await page.getByTestId(TestID.ReviewSwap).click() - await expect(page.getByText('Unwrapped')).toBeVisible() - await expect(page.getByText('0.010 WETH for 0.010 ETH')).toBeVisible() - }) - }) - test('should wrap ETH', async ({ page, anvil }) => { - const expectSingleTransaction = createExpectSingleTransaction({ - anvil, - address: TEST_WALLET_ADDRESS, - options: { blocks: 2 }, + await expectSingleTransaction(async () => { + await page.getByTestId(TestID.ReviewSwap).click() + await expect(page.getByText('Unwrapped')).toBeVisible() + await expect(page.getByText('0.010 WETH for 0.010 ETH')).toBeVisible() + }) }) + test('should wrap ETH', async ({ page, anvil }) => { + const expectSingleTransaction = createExpectSingleTransaction({ + anvil, + address: TEST_WALLET_ADDRESS, + options: { blocks: 2 }, + }) - await stubTradingApiEndpoint({ page, endpoint: uniswapUrls.tradingApiPaths.swap }) + await stubTradingApiEndpoint({ page, endpoint: uniswapUrls.tradingApiPaths.swap }) - await page.goto(`/swap`) - await page.getByTestId(TestID.ChooseOutputToken).click() - // eslint-disable-next-line - await page.getByTestId('token-option-1-WETH').first().click() + await page.goto(`/swap`) + await page.getByTestId(TestID.ChooseOutputToken).click() + // eslint-disable-next-line + await page.getByTestId('token-option-1-WETH').first().click() - await page.getByTestId(TestID.AmountInputIn).click() - await page.getByTestId(TestID.AmountInputIn).fill('0.01') + await page.getByTestId(TestID.AmountInputIn).click() + await page.getByTestId(TestID.AmountInputIn).fill('0.01') - await expectSingleTransaction(async () => { - await page.getByTestId(TestID.ReviewSwap).click() - await expect(page.getByText('Wrapped')).toBeVisible() - await expect(page.getByText('0.010 ETH for 0.010 WETH')).toBeVisible() + await expectSingleTransaction(async () => { + await page.getByTestId(TestID.ReviewSwap).click() + await expect(page.getByText('Wrapped')).toBeVisible() + await expect(page.getByText('0.010 ETH for 0.010 WETH')).toBeVisible() + }) }) - }) -}) + }, +) diff --git a/apps/web/src/pages/Swap/common/shared.tsx b/apps/web/src/pages/Swap/common/shared.tsx index 12d3c508c3b..597a6a4ce09 100644 --- a/apps/web/src/pages/Swap/common/shared.tsx +++ b/apps/web/src/pages/Swap/common/shared.tsx @@ -1,6 +1,6 @@ import Row from 'components/deprecated/Row' import { Input, InputProps } from 'components/NumericalInput' -import styled, { css } from 'lib/styled-components' +import { css, deprecatedStyled } from 'lib/styled-components' import { useLayoutEffect, useState } from 'react' export const NumericalInputFontStyle = css<{ $fontSize?: number }>` @@ -10,13 +10,13 @@ export const NumericalInputFontStyle = css<{ $fontSize?: number }>` line-height: 60px; ` -export const NumericalInputWrapper = styled(Row)` +export const NumericalInputWrapper = deprecatedStyled(Row)` position: relative; max-width: 100%; width: max-content; ` -export const StyledNumericalInput = styled(Input)< +export const StyledNumericalInput = deprecatedStyled(Input)< { $width?: number; $hasPrefix?: boolean; $fontSize?: number } & InputProps >` max-height: 84px; @@ -30,7 +30,7 @@ export const StyledNumericalInput = styled(Input)< } ` -export const NumericalInputMimic = styled.span` +export const NumericalInputMimic = deprecatedStyled.span<{ $fontSize?: number }>` position: absolute; visibility: hidden; bottom: 0px; @@ -38,7 +38,7 @@ export const NumericalInputMimic = styled.span` ${NumericalInputFontStyle} ` -export const NumericalInputSymbolContainer = styled.span<{ showPlaceholder: boolean; $fontSize?: number }>` +export const NumericalInputSymbolContainer = deprecatedStyled.span<{ showPlaceholder: boolean; $fontSize?: number }>` user-select: none; color: ${({ theme }) => theme.neutral1}; ${NumericalInputFontStyle} diff --git a/apps/web/src/pages/Swap/index.tsx b/apps/web/src/pages/Swap/index.tsx index a06928cb810..5fca94d2bca 100644 --- a/apps/web/src/pages/Swap/index.tsx +++ b/apps/web/src/pages/Swap/index.tsx @@ -17,8 +17,7 @@ import { useTranslation } from 'react-i18next' import { useSelector } from 'react-redux' import { useLocation, useNavigate } from 'react-router' import { MultichainContextProvider } from 'state/multichain/MultichainContext' -import { useSwapCallback } from 'state/sagas/transactions/swapSaga' -import { useWrapCallback } from 'state/sagas/transactions/wrapSaga' +import { useSwapHandlers } from 'state/sagas/transactions/useSwapHandlers' import { useInitialCurrencyState } from 'state/swap/hooks' import { SwapAndLimitContextProvider } from 'state/swap/SwapContext' import type { CurrencyState } from 'state/swap/types' @@ -259,8 +258,7 @@ function UniversalSwapFlow({ const { pathname } = useLocation() const navigate = useNavigate() const { t } = useTranslation() - const swapCallback = useSwapCallback() - const wrapCallback = useWrapCallback() + const swapHandlers = useSwapHandlers() const LimitFormWrapper = useDeferredComponent(() => import('pages/Swap/Limit/LimitForm').then((module) => ({ @@ -346,7 +344,7 @@ function UniversalSwapFlow({ )} {currentTab === SwapTab.Swap && ( - + { return ( - + {t('testnet.unsupported')} diff --git a/apps/web/src/pages/TokenDetails/TokenDetails.e2e.test.ts b/apps/web/src/pages/TokenDetails/TokenDetails.e2e.test.ts index 403d0d66a90..90b929887d1 100644 --- a/apps/web/src/pages/TokenDetails/TokenDetails.e2e.test.ts +++ b/apps/web/src/pages/TokenDetails/TokenDetails.e2e.test.ts @@ -4,59 +4,72 @@ import { TestID } from 'uniswap/src/test/fixtures/testIDs' const test = getTest() -test.describe('Token Details', () => { - test('token with warning and low trading volume should have all information populated', async ({ page, graphql }) => { - await graphql.intercept('TokenWeb', Mocks.TokenWeb.token_warning, { - chain: 'ETHEREUM', - address: '0x1eFBB78C8b917f67986BcE54cE575069c0143681', +test.describe( + 'Token Details', + { + tag: '@team:apps-portfolio', + annotation: [ + { type: 'DD_TAGS[team]', description: 'apps-portfolio' }, + { type: 'DD_TAGS[test.type]', description: 'web-e2e' }, + ], + }, + () => { + test('token with warning and low trading volume should have all information populated', async ({ + page, + graphql, + }) => { + await graphql.intercept('TokenWeb', Mocks.TokenWeb.token_warning, { + chain: 'ETHEREUM', + address: '0x1eFBB78C8b917f67986BcE54cE575069c0143681', + }) + await graphql.intercept('Token', Mocks.Token.token_warning, { + chain: 'ETHEREUM', + address: '0x1eFBB78C8b917f67986BcE54cE575069c0143681', + }) + await graphql.intercept('TokenProjects', Mocks.TokenProjects.token_spam, { + contracts: [ + { + chain: 'ETHEREUM', + address: '0x1eFBB78C8b917f67986BcE54cE575069c0143681', + }, + ], + }) + await page.goto('/explore/tokens/ethereum/0x1eFBB78C8b917f67986BcE54cE575069c0143681') + await expect(page.getByText('test token')).toBeVisible() + await expect(page.getByText('Missing chart data')).toBeVisible() + await expect(page.getByText('No stats available')).toBeVisible() + await expect(page.getByText('No token information available')).toBeVisible() }) - await graphql.intercept('Token', Mocks.Token.token_warning, { - chain: 'ETHEREUM', - address: '0x1eFBB78C8b917f67986BcE54cE575069c0143681', - }) - await graphql.intercept('TokenProjects', Mocks.TokenProjects.token_spam, { - contracts: [ - { - chain: 'ETHEREUM', - address: '0x1eFBB78C8b917f67986BcE54cE575069c0143681', - }, - ], - }) - await page.goto('/explore/tokens/ethereum/0x1eFBB78C8b917f67986BcE54cE575069c0143681') - await expect(page.getByText('test token')).toBeVisible() - await expect(page.getByText('Missing chart data')).toBeVisible() - await expect(page.getByText('No stats available')).toBeVisible() - await expect(page.getByText('No token information available')).toBeVisible() - }) - - test('disconnected wallet on mainnet mode should load mainnet token details', async ({ page }) => { - await page.goto('/explore/tokens/ethereum/NATIVE?eagerlyConnect=false') - await expect(page.getByText('Ethereum').first()).toBeVisible() - }) - test('connected wallet on mainnet mode should load testnet token details', async ({ page, graphql }) => { - await graphql.intercept('TokenWeb', Mocks.TokenWeb.sepolia_yay_token, { - chain: 'ETHEREUM_SEPOLIA', - address: '0x97dbb794244e1c27b6ff688fc8cef5fe8d80f531', + test('disconnected wallet on mainnet mode should load mainnet token details', async ({ page }) => { + await page.goto('/explore/tokens/ethereum/NATIVE?eagerlyConnect=false') + await expect(page.getByText('Ethereum').first()).toBeVisible() }) - await graphql.intercept('Token', Mocks.Token.sepolia_yay_token, { - chain: 'ETHEREUM_SEPOLIA', - address: '0x97dbb794244e1c27b6ff688fc8cef5fe8d80f531', + + test('connected wallet on mainnet mode should load testnet token details', async ({ page, graphql }) => { + await graphql.intercept('TokenWeb', Mocks.TokenWeb.sepolia_yay_token, { + chain: 'ETHEREUM_SEPOLIA', + address: '0x97dbb794244e1c27b6ff688fc8cef5fe8d80f531', + }) + await graphql.intercept('Token', Mocks.Token.sepolia_yay_token, { + chain: 'ETHEREUM_SEPOLIA', + address: '0x97dbb794244e1c27b6ff688fc8cef5fe8d80f531', + }) + await page.goto('/explore/tokens/ethereum_sepolia/0x97dbb794244e1c27b6ff688fc8cef5fe8d80f531') + await expect(page.getByText('Yay').first()).toBeVisible() }) - await page.goto('/explore/tokens/ethereum_sepolia/0x97dbb794244e1c27b6ff688fc8cef5fe8d80f531') - await expect(page.getByText('Yay').first()).toBeVisible() - }) - test('connected wallet on testnet mode should load mainnet token details', async ({ page }) => { - await page.goto('/explore/tokens/ethereum/NATIVE') - await page.getByTestId(TestID.Web3StatusConnected).click() - await page.getByTestId(TestID.WalletSettings).click() - await page.getByTestId(TestID.TestnetsToggle).click() - await expect(page.getByText('Ethereum').first()).toBeVisible() - }) + test('connected wallet on testnet mode should load mainnet token details', async ({ page }) => { + await page.goto('/explore/tokens/ethereum/NATIVE') + await page.getByTestId(TestID.Web3StatusConnected).click() + await page.getByTestId(TestID.WalletSettings).click() + await page.getByTestId(TestID.TestnetsToggle).click() + await expect(page.getByText('Ethereum').first()).toBeVisible() + }) - test('redirect to explore if token is not found', async ({ page }) => { - await page.goto('/explore/tokens/ethereum/0x123') - await expect(page).toHaveURL('/explore') - }) -}) + test('redirect to explore if token is not found', async ({ page }) => { + await page.goto('/explore/tokens/ethereum/0x123') + await expect(page).toHaveURL('/explore') + }) + }, +) diff --git a/apps/web/src/pages/Wrapped/DisconnectedState.tsx b/apps/web/src/pages/Wrapped/DisconnectedState.tsx new file mode 100644 index 00000000000..1c3be75f7c1 --- /dev/null +++ b/apps/web/src/pages/Wrapped/DisconnectedState.tsx @@ -0,0 +1,144 @@ +import { useAccountDrawer } from 'components/AccountDrawer/MiniPortfolio/hooks' +import { RefObject, useEffect, useState } from 'react' +import { useTranslation } from 'react-i18next' +import { Button, Flex, styled, Text, useWindowDimensions } from 'ui/src' +import { Gift } from 'ui/src/components/icons/Gift' +import { useSporeColorsForTheme } from 'ui/src/hooks/useSporeColors' +import { + MouseGlow, + renderSnowflakesWeb, + SnowflakeContainer, +} from 'uniswap/src/components/banners/shared/SharedSnowflakeComponents' +import { useSnowflakeAnimation } from 'uniswap/src/hooks/useSnowflakeAnimation' +import { isMobileWeb } from 'utilities/src/platform' + +const DisconnectedContainer = styled(Flex, { + width: '100%', + height: '100%', + position: 'relative', + justifyContent: 'center', + alignItems: 'center', + overflow: 'hidden', +}) + +const GradientBackground = styled(Flex, { + position: 'absolute', + inset: 0, + background: 'linear-gradient(180deg, #131313 0%, #3A123B 100%)', +}) + +const GlowEffect = styled(Flex, { + position: 'absolute', + left: 0, + bottom: 0, + width: '100%', + height: 30, + background: '#fc74fe', + filter: 'blur(90px)', + opacity: 0.4, +}) + +const IconWrapper = styled(Flex, { + width: 64, + height: 64, + borderRadius: '$rounded20', + backgroundColor: 'rgba(255, 255, 255, 0.1)', + backdropFilter: 'blur(8px)', + alignItems: 'center', + justifyContent: 'center', +}) + +export function DisconnectedState({ parentRef }: { parentRef: RefObject }): JSX.Element { + const [containerWidth, setContainerWidth] = useState(0) + const [containerHeight, setContainerHeight] = useState(0) + const { open: openAccountDrawer } = useAccountDrawer() + const { t } = useTranslation() + const darkColors = useSporeColorsForTheme('dark') + const { width: windowWidth, height: windowHeight } = useWindowDimensions() + + // set initital container height and width + useEffect(() => { + const rect = parentRef.current?.getBoundingClientRect() + setContainerWidth(rect?.width ?? windowWidth * 0.8) + setContainerHeight(rect?.height ?? windowHeight * 0.8) + }, [parentRef, windowWidth, windowHeight]) + + const { snowflakes, removeSnowflake, mouseInteraction } = useSnowflakeAnimation( + { + enabled: !isMobileWeb, + containerWidth, + bannerHeight: containerHeight, + }, + 0.5, + ) + + return ( + // biome-ignore lint/correctness/noRestrictedElements: Web-only mouse tracking for glow effect +
+ + + + + {/* Mouse-following glow effect */} + {mouseInteraction?.mousePosition && ( + + )} + + + {renderSnowflakesWeb({ + snowflakes, + containerHeight, + removeSnowflake, + getSnowflakeDrift: mouseInteraction?.getSnowflakeDrift, + keyPrefix: 'wrapped-disconnected', + })} + + + + + + + + + + {t('home.banner.uniswapWrapped2025.title')} + + + + {t('home.banner.uniswapWrapped2025.description')} + + + + + + + +
+ ) +} diff --git a/apps/web/src/pages/Wrapped/index.tsx b/apps/web/src/pages/Wrapped/index.tsx new file mode 100644 index 00000000000..623cb7135c9 --- /dev/null +++ b/apps/web/src/pages/Wrapped/index.tsx @@ -0,0 +1,130 @@ +import { DisconnectedState } from 'pages/Wrapped/DisconnectedState' +import { useEffect, useRef } from 'react' +import { useNavigate } from 'react-router' +import { useAppDispatch } from 'state/hooks' +import { Flex, TouchableArea } from 'ui/src' +import { X } from 'ui/src/components/icons/X' +import { useDeviceDimensions } from 'ui/src/hooks/useDeviceDimensions' +import { useSporeColorsForTheme } from 'ui/src/hooks/useSporeColors' +import { INTERFACE_NAV_HEIGHT, opacify } from 'ui/src/theme' +import { WRAPPED_PATH } from 'uniswap/src/components/banners/shared/utils' +import { useUrlContext } from 'uniswap/src/contexts/UrlContext' +import { useActiveAddresses } from 'uniswap/src/features/accounts/store/hooks' +import { setHasDismissedUniswapWrapped2025Banner } from 'uniswap/src/features/behaviorHistory/slice' +import { isAddress } from 'viem' + +export default function Wrapped() { + const { useParsedQueryString } = useUrlContext() + const queryParams = useParsedQueryString() + const walletAddressRef = useRef(undefined) + const backupWalletAddress = useActiveAddresses().evmAddress + const navigate = useNavigate() + const dispatch = useAppDispatch() + const containerRef = useRef(null) + const { fullWidth, fullHeight } = useDeviceDimensions() + const isLandscape = fullWidth > fullHeight + const darkColors = useSporeColorsForTheme('dark') + + // clear the query params after storing the wallet address + useEffect(() => { + const addressFromQuery = queryParams.address as string + if (addressFromQuery) { + if (isAddress(addressFromQuery)) { + walletAddressRef.current = addressFromQuery + } + navigate(WRAPPED_PATH, { replace: true }) + } + }, [queryParams.address, navigate]) + + // no longer show promo banner after viewing wrapped page + useEffect(() => { + dispatch(setHasDismissedUniswapWrapped2025Banner(true)) + }, [dispatch]) + + const hasWallet = Boolean(walletAddressRef.current || backupWalletAddress) + const walletAddress = walletAddressRef.current || backupWalletAddress + const iframeUrl = `https://wrapped.uniswap.org${walletAddress ? `?address=${walletAddress}` : ''}` + + return ( + + { + e.preventDefault() + e.stopPropagation() + }} + ref={containerRef} + > + {hasWallet ? ( +