From 12dc00a86cfb6580d9b3e707f97034f7519e21d2 Mon Sep 17 00:00:00 2001 From: Urban Date: Mon, 4 Mar 2024 11:19:42 +0100 Subject: [PATCH] feat(dapp): Privacy Policy and Terms of Service (#573) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Urban Vidovič --- .changeset/tidy-rivers-worry.md | 5 + packages/dapp/package.json | 5 + .../dapp/src/app/[locale]/(public)/layout.tsx | 12 +- .../app/[locale]/(public)/privacy/page.tsx | 55 ++++ .../src/app/[locale]/(public)/tos/page.tsx | 56 ++++ .../src/components/PublicFooter/index.tsx | 38 +++ .../src/components/PublicNavbar/index.tsx | 8 +- pnpm-lock.yaml | 240 +++++++++++++++++- 8 files changed, 404 insertions(+), 15 deletions(-) create mode 100644 .changeset/tidy-rivers-worry.md create mode 100644 packages/dapp/src/app/[locale]/(public)/privacy/page.tsx create mode 100644 packages/dapp/src/app/[locale]/(public)/tos/page.tsx create mode 100644 packages/dapp/src/components/PublicFooter/index.tsx diff --git a/.changeset/tidy-rivers-worry.md b/.changeset/tidy-rivers-worry.md new file mode 100644 index 000000000..b4b0f6373 --- /dev/null +++ b/.changeset/tidy-rivers-worry.md @@ -0,0 +1,5 @@ +--- +'@blockchain-lab-um/dapp': patch +--- + +Adds terms of service and privacy policy pages. diff --git a/packages/dapp/package.json b/packages/dapp/package.json index 5f4b20c1e..66e2784d3 100644 --- a/packages/dapp/package.json +++ b/packages/dapp/package.json @@ -32,7 +32,9 @@ "@supabase/supabase-js": "^2.38.5", "@tanstack/react-query": "^5.17.15", "@tanstack/react-table": "^8.10.7", + "@types/dompurify": "^3.0.5", "@types/js-cookie": "^3.0.6", + "@types/jsdom": "^21.1.6", "@veramo/core": "5.6.0", "@veramo/credential-eip712": "5.6.0", "@veramo/credential-w3c": "5.6.0", @@ -46,6 +48,7 @@ "date-fns": "^2.30.0", "did-jwt-vc": "^3.2.13", "did-resolver": "4.1.0", + "dompurify": "^3.0.9", "encoding": "^0.1.13", "ens-did-resolver": "^1.0.4", "ethers": "^6.9.0", @@ -56,8 +59,10 @@ "headless-stepper": "^1.9.1", "html5-qrcode": "^2.3.8", "js-cookie": "^3.0.5", + "jsdom": "^24.0.0", "jsonwebtoken": "^9.0.2", "luxon": "^3.4.3", + "marked": "^12.0.0", "next": "13.5.6", "next-intl": "3.4.0", "next-sitemap": "^4.2.3", diff --git a/packages/dapp/src/app/[locale]/(public)/layout.tsx b/packages/dapp/src/app/[locale]/(public)/layout.tsx index 15591b105..a2bcc5996 100644 --- a/packages/dapp/src/app/[locale]/(public)/layout.tsx +++ b/packages/dapp/src/app/[locale]/(public)/layout.tsx @@ -1,3 +1,4 @@ +import PublicFooter from '@/components/PublicFooter'; import PublicNavbar from '@/components/PublicNavbar'; export default async function PublicLayout({ @@ -6,10 +7,15 @@ export default async function PublicLayout({ children: React.ReactNode; }) { return ( -
+
-
-
{children}
+
+
+ {children} +
+
+
+
); diff --git a/packages/dapp/src/app/[locale]/(public)/privacy/page.tsx b/packages/dapp/src/app/[locale]/(public)/privacy/page.tsx new file mode 100644 index 000000000..c8b054711 --- /dev/null +++ b/packages/dapp/src/app/[locale]/(public)/privacy/page.tsx @@ -0,0 +1,55 @@ +import DOMPurify from 'dompurify'; +import { JSDOM } from 'jsdom'; +import { marked } from 'marked'; + +const getPrivacyPolicy = async () => { + const renderer = { + heading(text: string, level: number) { + switch (level) { + case 1: + return ` + + ${text} + `; + case 2: + return ` + + ${text} + `; + default: + return ` ${text} `; + } + }, + blockquote(text: string) { + return `
${text}
`; + }, + paragraph(text: string) { + return `

${text}

`; + }, + link(href: string, title: string | null | undefined, text: string) { + return `${text}`; + }, + }; + + marked.use({ renderer }); + const markdown = await ( + await fetch( + 'https://raw.githubusercontent.com/lutralabs/documents/main/privacy-policy.md', + { cache: 'no-store' } + ) + ).text(); + const { window } = new JSDOM(''); + const purify = DOMPurify(window); + const html = purify.sanitize(await marked.parse(markdown)); + return html; +}; + +export default async function Page() { + const pp = await getPrivacyPolicy(); + return ( +
+ ); +} diff --git a/packages/dapp/src/app/[locale]/(public)/tos/page.tsx b/packages/dapp/src/app/[locale]/(public)/tos/page.tsx new file mode 100644 index 000000000..abbe9086a --- /dev/null +++ b/packages/dapp/src/app/[locale]/(public)/tos/page.tsx @@ -0,0 +1,56 @@ +import DOMPurify from 'dompurify'; +import { JSDOM } from 'jsdom'; +import { marked } from 'marked'; + +const getTos = async () => { + const renderer = { + heading(text: string, level: number) { + switch (level) { + case 1: + return ` + + ${text} + `; + case 2: + return ` + + ${text} + `; + default: + return ` ${text} `; + } + }, + blockquote(text: string) { + return `
${text}
`; + }, + paragraph(text: string) { + return `

${text}

`; + }, + link(href: string, title: string | null | undefined, text: string) { + return `${text}`; + }, + }; + + marked.use({ renderer }); + const markdown = await ( + await fetch( + 'https://raw.githubusercontent.com/lutralabs/documents/main/ToS.md', + { cache: 'no-store' } + ) + ).text(); + const { window } = new JSDOM(''); + const purify = DOMPurify(window); + const html = purify.sanitize(await marked.parse(markdown)); + + return html; +}; + +export default async function Page() { + const tos = await getTos(); + return ( +
+ ); +} diff --git a/packages/dapp/src/components/PublicFooter/index.tsx b/packages/dapp/src/components/PublicFooter/index.tsx new file mode 100644 index 000000000..2e4f0919d --- /dev/null +++ b/packages/dapp/src/components/PublicFooter/index.tsx @@ -0,0 +1,38 @@ +'use client'; + +import { Dispatch, SetStateAction } from 'react'; +import Link from 'next/link'; + +interface PublicFooterProps { + setIsMenuOpen: Dispatch> | null | undefined; +} + +export default function PublicFooter({ setIsMenuOpen }: PublicFooterProps) { + return ( +
+

© 2024 Lutra Labs

+
+ { + if (setIsMenuOpen) { + setIsMenuOpen(false); + } + }} + > + Privacy Policy + + { + if (setIsMenuOpen) { + setIsMenuOpen(false); + } + }} + > + Terms of Service + +
+
+ ); +} diff --git a/packages/dapp/src/components/PublicNavbar/index.tsx b/packages/dapp/src/components/PublicNavbar/index.tsx index 1b82d7ed5..628c50be5 100644 --- a/packages/dapp/src/components/PublicNavbar/index.tsx +++ b/packages/dapp/src/components/PublicNavbar/index.tsx @@ -9,6 +9,7 @@ import { useTranslations } from 'next-intl'; import Button from '@/components//Button'; import MascaLogo from '@/components/MascaLogo'; +import PublicFooter from '../PublicFooter'; const INTERNAL_LINKS = [ { @@ -44,8 +45,8 @@ const PublicNavbar = () => { const pathname = usePathname() ?? '/'; return ( -
-
+
+
@@ -145,6 +146,9 @@ const PublicNavbar = () => { {t(name)} ))} +
+ +
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c19394163..525fbf6b9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -422,9 +422,15 @@ importers: '@tanstack/react-table': specifier: ^8.10.7 version: 8.10.7(react-dom@18.2.0)(react@18.2.0) + '@types/dompurify': + specifier: ^3.0.5 + version: 3.0.5 '@types/js-cookie': specifier: ^3.0.6 version: 3.0.6 + '@types/jsdom': + specifier: ^21.1.6 + version: 21.1.6 '@veramo/core': specifier: 5.6.0 version: 5.6.0 @@ -464,6 +470,9 @@ importers: did-resolver: specifier: 4.1.0 version: 4.1.0 + dompurify: + specifier: ^3.0.9 + version: 3.0.9 encoding: specifier: ^0.1.13 version: 0.1.13 @@ -494,12 +503,18 @@ importers: js-cookie: specifier: ^3.0.5 version: 3.0.5 + jsdom: + specifier: ^24.0.0 + version: 24.0.0 jsonwebtoken: specifier: ^9.0.2 version: 9.0.2 luxon: specifier: ^3.4.3 version: 3.4.3 + marked: + specifier: ^12.0.0 + version: 12.0.0 next: specifier: 13.5.6 version: 13.5.6(@babel/core@7.23.2)(react-dom@18.2.0)(react@18.2.0)(sass@1.69.5) @@ -5773,7 +5788,7 @@ packages: text-table: 0.2.0 url-join: 4.0.0 wrap-ansi: 7.0.0 - ws: 8.14.2 + ws: 8.16.0 transitivePeerDependencies: - bluebird - bufferutil @@ -9985,6 +10000,7 @@ packages: - encoding - supports-color - utf-8-validate + optional: true /@react-native-community/cli-plugin-metro@11.3.7(@babel/core@7.23.2)(encoding@0.1.13): resolution: {integrity: sha512-0WhgoBVGF1f9jXcuagQmtxpwpfP+2LbLZH4qMyo6OtYLWLG13n2uRep+8tdGzfNzl1bIuUTeE9yZSAdnf9LfYQ==} @@ -10006,7 +10022,6 @@ packages: - encoding - supports-color - utf-8-validate - dev: false /@react-native-community/cli-server-api@11.3.7(encoding@0.1.13): resolution: {integrity: sha512-yoFyGdvR3HxCnU6i9vFqKmmSqFzCbnFSnJ29a+5dppgPRetN+d//O8ard/YHqHzToFnXutAFf2neONn23qcJAg==} @@ -10074,6 +10089,7 @@ packages: - encoding - supports-color - utf-8-validate + optional: true /@react-native-community/cli@11.3.7(@babel/core@7.23.2)(encoding@0.1.13): resolution: {integrity: sha512-Ou8eDlF+yh2rzXeCTpMPYJ2fuqsusNOhmpYPYNQJQ2h6PvaF30kPomflgRILems+EBBuggRtcT+I+1YH4o/q6w==} @@ -10103,7 +10119,6 @@ packages: - encoding - supports-color - utf-8-validate - dev: false /@react-native/assets-registry@0.72.0: resolution: {integrity: sha512-Im93xRJuHHxb1wniGhBMsxLwcfzdYreSZVQGDoMJgkd6+Iky61LInGEHnQCTN0fKNYF1Dvcofb4uMmE1RQHXHQ==} @@ -10141,7 +10156,7 @@ packages: dependencies: invariant: 2.2.4 nullthrows: 1.1.1 - react-native: 0.72.6(@babel/core@7.23.2)(@babel/preset-env@7.23.2)(react@18.2.0) + react-native: 0.72.6(@babel/core@7.23.2)(@babel/preset-env@7.23.2)(encoding@0.1.13)(react@18.2.0) /@react-oauth/google@0.11.1(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-tywZisXbsdaRBVbEu0VX6dRbOSL2I6DgY97woq5NMOOOz+xtDsm418vqq+Vx10KMtra3kdHMRMf0hXLWrk2RMg==} @@ -11767,6 +11782,12 @@ packages: resolution: {integrity: sha512-3Iten7X3Zgwvk6kh6/NRdwN7WbZ760YgFCsF5AxDifltUQzW1RaW+WRmcVtgwFzLjaNu64H+0MPJ13yRa8g3Dw==} dev: false + /@types/dompurify@3.0.5: + resolution: {integrity: sha512-1Wg0g3BtQF7sSb27fJQAKck1HECM6zV1EB66j8JH9i3LCjYabJa0FSdiSgsD5K/RbrsR0SiraKacLB+T8ZVYAg==} + dependencies: + '@types/trusted-types': 2.0.7 + dev: false + /@types/elliptic@6.4.16: resolution: {integrity: sha512-MSN6m9BR51W1/umzcsX0K9dAmJ59ECKxOjZ3XsjvsZAt+q0mTmKlzEdwtU+u4i+Om231d8TuY3xK6FAGIs5MbA==} dependencies: @@ -11891,6 +11912,14 @@ packages: resolution: {integrity: sha512-wkw9yd1kEXOPnvEeEV1Go1MmxtBJL0RR79aOTAApecWFVu7w0NNXNqhcWgvw2YgZDYadliXkl14pa3WXw5jlCQ==} dev: false + /@types/jsdom@21.1.6: + resolution: {integrity: sha512-/7kkMsC+/kMs7gAYmmBR9P0vGTnOoLhQhyhQJSlXGI5bzTHp6xdo0TtKWQAsz6pmSAeVqKSbqeyP6hytqr9FDw==} + dependencies: + '@types/node': 18.18.7 + '@types/tough-cookie': 4.0.5 + parse5: 7.1.2 + dev: false + /@types/json-schema@7.0.12: resolution: {integrity: sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==} @@ -12109,6 +12138,10 @@ packages: /@types/stack-utils@2.0.2: resolution: {integrity: sha512-g7CK9nHdwjK2n0ymT2CW698FuWJRIx+RP6embAzZ2Qi8/ilIrA1Imt2LVSeHUzKvpoi7BhmmQcXz95eS0f2JXw==} + /@types/tough-cookie@4.0.5: + resolution: {integrity: sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==} + dev: false + /@types/trusted-types@2.0.7: resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} dev: false @@ -16350,6 +16383,13 @@ packages: css-tree: 2.2.1 dev: true + /cssstyle@4.0.1: + resolution: {integrity: sha512-8ZYiJ3A/3OkDd093CBT/0UKDWry7ak4BdPTFP2+QEP7cmhouyq/Up709ASSj2cK02BbZiMgk7kYjZNS4QP5qrQ==} + engines: {node: '>=18'} + dependencies: + rrweb-cssom: 0.6.0 + dev: false + /csstype@3.1.2: resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==} @@ -16414,6 +16454,14 @@ packages: resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} engines: {node: '>= 12'} + /data-urls@5.0.0: + resolution: {integrity: sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==} + engines: {node: '>=18'} + dependencies: + whatwg-mimetype: 4.0.0 + whatwg-url: 14.0.0 + dev: false + /dataloader@1.4.0: resolution: {integrity: sha512-68s5jYdlvasItOJnCuI2Q9s4q98g0pCyL3HrcKJu8KNugUl8ahgmZYg38ysLTgQjjXX3H8CJLkAvWrclWfcalw==} dev: true @@ -16482,6 +16530,10 @@ packages: engines: {node: '>=10'} dev: true + /decimal.js@10.4.3: + resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} + dev: false + /decode-uri-component@0.2.2: resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==} engines: {node: '>=0.10'} @@ -16934,6 +16986,10 @@ packages: dependencies: domelementtype: 2.3.0 + /dompurify@3.0.9: + resolution: {integrity: sha512-uyb4NDIvQ3hRn6NiC+SIFaP4mJ/MdXlvtunaqK9Bn6dD3RuB/1S/gasEjDHD8eiaqdSael2vBv+hOs7Y+jhYOQ==} + dev: false + /domutils@2.8.0: resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==} dependencies: @@ -19850,6 +19906,13 @@ packages: readable-stream: 2.3.8 wbuf: 1.7.3 + /html-encoding-sniffer@4.0.0: + resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==} + engines: {node: '>=18'} + dependencies: + whatwg-encoding: 3.1.1 + dev: false + /html-entities@2.4.0: resolution: {integrity: sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ==} @@ -19950,6 +20013,16 @@ packages: /http-parser-js@0.5.8: resolution: {integrity: sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==} + /http-proxy-agent@7.0.2: + resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} + engines: {node: '>= 14'} + dependencies: + agent-base: 7.1.0 + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + dev: false + /http-proxy-middleware@2.0.6(@types/express@4.17.20): resolution: {integrity: sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==} engines: {node: '>=12.0.0'} @@ -20607,6 +20680,10 @@ packages: resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} engines: {node: '>=0.10.0'} + /is-potential-custom-element-name@1.0.1: + resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} + dev: false + /is-regex@1.1.4: resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} engines: {node: '>= 0.4'} @@ -21412,6 +21489,42 @@ packages: transitivePeerDependencies: - supports-color + /jsdom@24.0.0: + resolution: {integrity: sha512-UDS2NayCvmXSXVP6mpTj+73JnNQadZlr9N68189xib2tx5Mls7swlTNao26IoHv46BZJFvXygyRtyXd1feAk1A==} + engines: {node: '>=18'} + peerDependencies: + canvas: ^2.11.2 + peerDependenciesMeta: + canvas: + optional: true + dependencies: + cssstyle: 4.0.1 + data-urls: 5.0.0 + decimal.js: 10.4.3 + form-data: 4.0.0 + html-encoding-sniffer: 4.0.0 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.2 + is-potential-custom-element-name: 1.0.1 + nwsapi: 2.2.7 + parse5: 7.1.2 + rrweb-cssom: 0.6.0 + saxes: 6.0.0 + symbol-tree: 3.2.4 + tough-cookie: 4.1.3 + w3c-xmlserializer: 5.0.0 + webidl-conversions: 7.0.0 + whatwg-encoding: 3.1.1 + whatwg-mimetype: 4.0.0 + whatwg-url: 14.0.0 + ws: 8.16.0 + xml-name-validator: 5.0.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: false + /jsesc@0.5.0: resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} hasBin: true @@ -22366,6 +22479,12 @@ packages: /markdown-escapes@1.0.4: resolution: {integrity: sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg==} + /marked@12.0.0: + resolution: {integrity: sha512-Vkwtq9rLqXryZnWaQc86+FHLC6tr/fycMfYAhiOIXkrNmeGAyhSxjqu0Rs1i0bBqw5u0S7+lV9fdH2ZSVaoa0w==} + engines: {node: '>= 18'} + hasBin: true + dev: false + /mathml-tag-names@2.1.3: resolution: {integrity: sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==} dev: true @@ -22584,6 +22703,7 @@ packages: - encoding - supports-color - utf-8-validate + optional: true /metro-config@0.76.8(encoding@0.1.13): resolution: {integrity: sha512-SL1lfKB0qGHALcAk2zBqVgQZpazDYvYFGwCK1ikz0S6Y/CM2i2/HwuZN31kpX6z3mqjv/6KvlzaKoTb1otuSAA==} @@ -22601,7 +22721,6 @@ packages: - encoding - supports-color - utf-8-validate - dev: false /metro-core@0.76.8: resolution: {integrity: sha512-sl2QLFI3d1b1XUUGxwzw/KbaXXU/bvFYrSKz6Sg19AdYGWFyzsgZ1VISRIDf+HWm4R/TJXluhWMEkEtZuqi3qA==} @@ -22794,6 +22913,7 @@ packages: - encoding - supports-color - utf-8-validate + optional: true /metro-transform-worker@0.76.8(encoding@0.1.13): resolution: {integrity: sha512-mE1fxVAnJKmwwJyDtThildxxos9+DGs9+vTrx2ktSFMEVTtXS/bIv2W6hux1pqivqAfyJpTeACXHk5u2DgGvIQ==} @@ -22816,7 +22936,6 @@ packages: - encoding - supports-color - utf-8-validate - dev: false /metro@0.76.8: resolution: {integrity: sha512-oQA3gLzrrYv3qKtuWArMgHPbHu8odZOD9AoavrqSFllkPgOtmkBvNNDLCELqv5SjBfqjISNffypg+5UGG3y0pg==} @@ -22876,6 +22995,7 @@ packages: - encoding - supports-color - utf-8-validate + optional: true /metro@0.76.8(encoding@0.1.13): resolution: {integrity: sha512-oQA3gLzrrYv3qKtuWArMgHPbHu8odZOD9AoavrqSFllkPgOtmkBvNNDLCELqv5SjBfqjISNffypg+5UGG3y0pg==} @@ -22935,7 +23055,6 @@ packages: - encoding - supports-color - utf-8-validate - dev: false /micro-ftch@0.3.1: resolution: {integrity: sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg==} @@ -23673,6 +23792,10 @@ packages: strip-hex-prefix: 1.0.0 dev: true + /nwsapi@2.2.7: + resolution: {integrity: sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==} + dev: false + /nx-cloud@16.5.2: resolution: {integrity: sha512-1t1Ii9gojl8r/8hFGaZ/ZyYR0Cb0hzvXLCsaFuvg+EJEFdvua3P4cfNya/0bdRrm+7Eb/ITUOskbvYq4TSlyGg==} hasBin: true @@ -25203,6 +25326,10 @@ packages: resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} dev: false + /psl@1.9.0: + resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} + dev: false + /public-encrypt@4.0.3: resolution: {integrity: sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==} dependencies: @@ -25231,6 +25358,11 @@ packages: resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} engines: {node: '>=6'} + /punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + dev: false + /pupa@2.1.1: resolution: {integrity: sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==} engines: {node: '>=8'} @@ -25322,7 +25454,6 @@ packages: /querystringify@2.2.0: resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} - optional: true /queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} @@ -25646,7 +25777,6 @@ packages: - encoding - supports-color - utf-8-validate - dev: false /react-native@0.72.6(@babel/core@7.23.2)(@babel/preset-env@7.23.2)(react@18.2.0): resolution: {integrity: sha512-RafPY2gM7mcrFySS8TL8x+TIO3q7oAlHpzEmC7Im6pmXni6n1AuufGaVh0Narbr1daxstw7yW7T9BKW5dpVc2A==} @@ -25699,6 +25829,7 @@ packages: - encoding - supports-color - utf-8-validate + optional: true /react-refresh@0.4.3: resolution: {integrity: sha512-Hwln1VNuGl/6bVwnd0Xdn1e84gT/8T9aYNL+HAKDArLCS7LWjwr7StE30IEYbIkx0Vi3vs+coQxe+SQDbGbbpA==} @@ -26409,6 +26540,10 @@ packages: nanoid: 3.3.6 dev: false + /rrweb-cssom@0.6.0: + resolution: {integrity: sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==} + dev: false + /rtl-detect@1.1.2: resolution: {integrity: sha512-PGMBq03+TTG/p/cRB7HCLKJ1MgDIi07+QU1faSjiYRfmY5UsAttV9Hs08jDAHVwcOwmVLcSJkpwyfXszVjWfIQ==} @@ -26517,6 +26652,13 @@ packages: /sax@1.3.0: resolution: {integrity: sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==} + /saxes@6.0.0: + resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} + engines: {node: '>=v12.22.7'} + dependencies: + xmlchars: 2.2.0 + dev: false + /scheduler@0.23.0: resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} dependencies: @@ -27925,6 +28067,10 @@ packages: use-sync-external-store: 1.2.0(react@18.2.0) dev: false + /symbol-tree@3.2.4: + resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} + dev: false + /synckit@0.8.5: resolution: {integrity: sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q==} engines: {node: ^14.18.0 || >=16.0.0} @@ -28375,6 +28521,16 @@ packages: resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} engines: {node: '>=6'} + /tough-cookie@4.1.3: + resolution: {integrity: sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==} + engines: {node: '>=6'} + dependencies: + psl: 1.9.0 + punycode: 2.3.0 + universalify: 0.2.0 + url-parse: 1.5.10 + dev: false + /tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} @@ -28384,6 +28540,13 @@ packages: punycode: 2.3.0 dev: true + /tr46@5.0.0: + resolution: {integrity: sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==} + engines: {node: '>=18'} + dependencies: + punycode: 2.3.1 + dev: false + /traverse@0.6.7: resolution: {integrity: sha512-/y956gpUo9ZNCb99YjxG7OaslxZWHfCHAUUfshwqOXmxUIvqLjVO581BT+gM59+QV9tFe6/CGG53tsA1Y7RSdg==} optional: true @@ -29043,6 +29206,11 @@ packages: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} engines: {node: '>= 4.0.0'} + /universalify@0.2.0: + resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} + engines: {node: '>= 4.0.0'} + dev: false + /universalify@1.0.0: resolution: {integrity: sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==} engines: {node: '>= 10.0.0'} @@ -29213,7 +29381,6 @@ packages: dependencies: querystringify: 2.2.0 requires-port: 1.0.0 - optional: true /url-template@2.0.8: resolution: {integrity: sha512-XdVKMF4SJ0nP/O7XIPB0JwAEuT9lDIYnNsK8yGVe43y0AWoKeJNdv3ZNWh7ksJ6KqQFjOO6ox/VEitLnaVNufw==} @@ -29703,6 +29870,13 @@ packages: engines: {node: '>=0.10.0'} dev: false + /w3c-xmlserializer@5.0.0: + resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} + engines: {node: '>=18'} + dependencies: + xml-name-validator: 5.0.0 + dev: false + /wagmi@2.5.1(@tanstack/react-query@5.17.19)(@types/react@18.2.33)(encoding@0.1.13)(react-dom@18.2.0)(react-native@0.72.6)(react@18.2.0)(typescript@5.3.3)(viem@2.5.0): resolution: {integrity: sha512-ZDKz9B1hGH0R6GeRlBd6YAF9em5mK2D+A2LgKSMnlI3wDVlr+9hA4ej/rboCtmNMMnZ81/0xr77NG9H8sc1wyg==} peerDependencies: @@ -29850,6 +30024,11 @@ packages: resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} dev: true + /webidl-conversions@7.0.0: + resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} + engines: {node: '>=12'} + dev: false + /webpack-bundle-analyzer@4.9.1: resolution: {integrity: sha512-jnd6EoYrf9yMxCyYDPj8eutJvtjQNp8PHmni/e/ulydHBWhT5J3menXt3HEkScsu9YqMAcG4CfFjs3rj5pVU1w==} engines: {node: '>= 10.13.0'} @@ -30195,9 +30374,29 @@ packages: - supports-color dev: false + /whatwg-encoding@3.1.1: + resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} + engines: {node: '>=18'} + dependencies: + iconv-lite: 0.6.3 + dev: false + /whatwg-fetch@3.6.19: resolution: {integrity: sha512-d67JP4dHSbm2TrpFj8AbO8DnL1JXL5J9u0Kq2xW6d0TFDbCA3Muhdt8orXC22utleTVj7Prqt82baN6RBvnEgw==} + /whatwg-mimetype@4.0.0: + resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} + engines: {node: '>=18'} + dev: false + + /whatwg-url@14.0.0: + resolution: {integrity: sha512-1lfMEm2IEr7RIV+f4lUNPOqfFL+pO+Xw3fJSqmjX9AbXcXcYOkCe1P6+9VBZB6n94af16NfZf+sSk0JCBZC9aw==} + engines: {node: '>=18'} + dependencies: + tr46: 5.0.0 + webidl-conversions: 7.0.0 + dev: false + /whatwg-url@5.0.0: resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} dependencies: @@ -30462,6 +30661,18 @@ packages: utf-8-validate: optional: true + /ws@8.16.0: + resolution: {integrity: sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + /ws@8.5.0: resolution: {integrity: sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==} engines: {node: '>=10.0.0'} @@ -30493,6 +30704,11 @@ packages: sax: 1.3.0 dev: false + /xml-name-validator@5.0.0: + resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} + engines: {node: '>=18'} + dev: false + /xml2js@0.6.0: resolution: {integrity: sha512-eLTh0kA8uHceqesPqSE+VvO1CDDJWMwlQfB6LuN6T8w6MaDJ8Txm8P7s5cHD0miF0V+GGTZrDQfxPZQVsur33w==} engines: {node: '>=4.0.0'} @@ -30516,6 +30732,10 @@ packages: engines: {node: '>=8.0'} optional: true + /xmlchars@2.2.0: + resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} + dev: false + /xmlhttprequest-ssl@2.0.0: resolution: {integrity: sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==} engines: {node: '>=0.4.0'}